ZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCBlNmQ5ZWJmLi5kMDg5MGZlIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC00Nyw2ICs0NywxOSBAQAogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL2xpYi9saWJtZWRpYV9uYXRpdmUuc28pCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeW1ib2xzL3N5c3RlbS9saWIvbGlibWVkaWFfbmF0aXZlLnNvKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJtZWRpYV9uYXRpdmUuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb2ZsaW5nZXJfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9mbGluZ2VyLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3lfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3kuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb3BvbGljeV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJhdWRpb3BvbGljeS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYmF1ZGlvcG9saWN5c2VydmljZV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYmF1ZGlvcG9saWN5c2VydmljZS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3ltYW5hZ2VyLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3lzZXJ2aWNlX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJtZWRpYXRlcykKKwogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL0FuZHJvaWQubWsgYi9jYW1lcmEvQW5kcm9pZC5tawppbmRleCA1Y2VkYWIwLi5kYTVhYzU5IDEwMDY0NAotLS0gYS9jYW1lcmEvQW5kcm9pZC5taworKysgYi9jYW1lcmEvQW5kcm9pZC5tawpAQCAtMSwzICsxLDE3IEBACisjIENvcHlyaWdodCAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKIENBTUVSQV9DTElFTlRfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQpAQCAtOCw2ICsyMiw3IEBACiAJQ2FtZXJhLmNwcCBcCiAJQ2FtZXJhTWV0YWRhdGEuY3BwIFwKIAlDYW1lcmFQYXJhbWV0ZXJzLmNwcCBcCisJQ2FwdHVyZVJlc3VsdC5jcHAgXAogCUNhbWVyYVBhcmFtZXRlcnMyLmNwcCBcCiAJSUNhbWVyYS5jcHAgXAogCUlDYW1lcmFDbGllbnQuY3BwIFwKQEAgLTIyLDYgKzM3LDggQEAKIAljYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcCBcCiAJUHJvQ2FtZXJhLmNwcCBcCiAJQ2FtZXJhQmFzZS5jcHAgXAorCUNhbWVyYVV0aWxzLmNwcCBcCisJVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliY3V0aWxzIFwKQEAgLTM1LDYgKzUyLDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAJc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKKwlzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCiAKIExPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYV9jbGllbnQKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYS5jcHAgYi9jYW1lcmEvQ2FtZXJhLmNwcAppbmRleCAyMjE5OWZhLi44NWY0NGYwIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhLmNwcApAQCAtNzcsNiArNzcsMzIgQEAKICAgICByZXR1cm4gQ2FtZXJhQmFzZVQ6OmNvbm5lY3QoY2FtZXJhSWQsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQpOwogfQogCitzdGF0dXNfdCBDYW1lcmE6OmNvbm5lY3RMZWdhY3koaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBpbnQgY2xpZW50VWlkLAorICAgICAgICBzcDxDYW1lcmE+JiBjYW1lcmEpCit7CisgICAgQUxPR1YoIiVzOiBjb25uZWN0IGxlZ2FjeSBjYW1lcmEgZGV2aWNlIiwgX19GVU5DVElPTl9fKTsKKyAgICBzcDxDYW1lcmE+IGMgPSBuZXcgQ2FtZXJhKGNhbWVyYUlkKTsKKyAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjbCA9IGM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2U+JiBjcyA9IENhbWVyYUJhc2VUOjpnZXRDYW1lcmFTZXJ2aWNlKCk7CisKKyAgICBpZiAoY3MgIT0gMCkgeworICAgICAgICBzdGF0dXMgPSBjcy5nZXQoKS0+Y29ubmVjdExlZ2FjeShjbCwgY2FtZXJhSWQsIGhhbFZlcnNpb24sIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgLypvdXQqL2MtPm1DYW1lcmEpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE9LICYmIGMtPm1DYW1lcmEgIT0gMCkgeworICAgICAgICBjLT5tQ2FtZXJhLT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChjKTsKKyAgICAgICAgYy0+bVN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICBjYW1lcmEgPSBjOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjb25uZWN0aW5nIHRvIGNhbWVyYTogJWQiLCBjYW1lcmFJZCk7CisgICAgICAgIGMuY2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdHVzX3QgQ2FtZXJhOjpyZWNvbm5lY3QoKQogewogICAgIEFMT0dWKCJyZWNvbm5lY3QiKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFCYXNlLmNwcCBiL2NhbWVyYS9DYW1lcmFCYXNlLmNwcAppbmRleCA1NTM3NmIwLi4wNDY5NGNkIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYUJhc2UuY3BwCkBAIC00OSw3ICs0OSw3IEBACiAgICAgICAgIERlYXRoTm90aWZpZXIoKSB7CiAgICAgICAgIH0KIAotICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7CiAgICAgICAgICAgICBBTE9HVigiYmluZGVyRGllZCIpOwogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKICAgICAgICAgICAgIGdDYW1lcmFTZXJ2aWNlLmNsZWFyKCk7CkBAIC0xNTMsNyArMTUzLDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDYW0sIHR5cGVuYW1lIFRDYW1UcmFpdHM+Ci12b2lkIENhbWVyYUJhc2U8VENhbSwgVENhbVRyYWl0cz46OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewordm9pZCBDYW1lcmFCYXNlPFRDYW0sIFRDYW1UcmFpdHM+OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7CiAgICAgQUxPR1coIm1lZGlhc2VydmVyJ3MgcmVtb3RlIGJpbmRlciBDYW1lcmEgb2JqZWN0IGRpZWQiKTsKICAgICBub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBDQU1FUkFfRVJST1JfU0VSVkVSX0RJRUQsIC8qZXh0MiovMCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcAppbmRleCA3NzY1OTE0Li4wNDM0MzdmIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTI1LDYgKzI1LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisjZGVmaW5lIEFMSUdOX1RPKHZhbCwgYWxpZ25tZW50KSBcCisgICAgKCgodWludHB0cl90KSh2YWwpICsgKChhbGlnbm1lbnQpIC0gMSkpICYgfigoYWxpZ25tZW50KSAtIDEpKQorCiB0eXBlZGVmIFBhcmNlbDo6V3JpdGFibGVCbG9iIFdyaXRhYmxlQmxvYjsKIHR5cGVkZWYgUGFyY2VsOjpSZWFkYWJsZUJsb2IgUmVhZGFibGVCbG9iOwogCkBAIC0yNzAsNyArMjczLDggQEAKICAgICBpZiAoIChyZXMgPSBjaGVja1R5cGUodGFnLCBUWVBFX0JZVEUpKSAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KLSAgICByZXR1cm4gdXBkYXRlSW1wbCh0YWcsIChjb25zdCB2b2lkKilzdHJpbmcuc3RyaW5nKCksIHN0cmluZy5zaXplKCkpOworICAgIC8vIHN0cmluZy5zaXplKCkgZG9lc24ndCBjb3VudCB0aGUgbnVsbCB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuCisgICAgcmV0dXJuIHVwZGF0ZUltcGwodGFnLCAoY29uc3Qgdm9pZCopc3RyaW5nLnN0cmluZygpLCBzdHJpbmcuc2l6ZSgpICsgMSk7CiB9CiAKIHN0YXR1c190IENhbWVyYU1ldGFkYXRhOjp1cGRhdGVJbXBsKHVpbnQzMl90IHRhZywgY29uc3Qgdm9pZCAqZGF0YSwKQEAgLTQzMSw0MCArNDM1LDcwIEBACiAgICAgICAgICpvdXQgPSBOVUxMOwogICAgIH0KIAotICAgIC8vIGFyZzAgPSBtZXRhZGF0YVNpemUgKGludDMyKQotICAgIGludDMyX3QgbWV0YWRhdGFTaXplVG1wID0gLTE7Ci0gICAgaWYgKChlcnIgPSBkYXRhLnJlYWRJbnQzMigmbWV0YWRhdGFTaXplVG1wKSkgIT0gT0spIHsKKyAgICAvLyBTZWUgQ2FtZXJhTWV0YWRhdGE6OndyaXRlVG9QYXJjZWwgZm9yIHBhcmNlbCBkYXRhIGxheW91dCBkaWFncmFtIGFuZCBleHBsYW5hdGlvbi4KKyAgICAvLyBhcmcwID0gYmxvYlNpemUgKGludDMyKQorICAgIGludDMyX3QgYmxvYlNpemVUbXAgPSAtMTsKKyAgICBpZiAoKGVyciA9IGRhdGEucmVhZEludDMyKCZibG9iU2l6ZVRtcCkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgc2l6ZSAoZXJyb3IgJWQgJXMpIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IG1ldGFkYXRhU2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4obWV0YWRhdGFTaXplVG1wKTsKKyAgICBjb25zdCBzaXplX3QgYmxvYlNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJsb2JTaXplVG1wKTsKKyAgICBjb25zdCBzaXplX3QgYWxpZ25tZW50ID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9hbGlnbm1lbnQoKTsKIAotICAgIGlmIChtZXRhZGF0YVNpemUgPT0gMCkgeworICAgIC8vIFNwZWNpYWwgY2FzZTogemVybyBibG9iIHNpemUgbWVhbnMgemVybyBzaXplZCAoTlVMTCkgbWV0YWRhdGEuCisgICAgaWYgKGJsb2JTaXplID09IDApIHsKICAgICAgICAgQUxPR1YoIiVzOiBSZWFkIDAtc2l6ZWQgbWV0YWRhdGEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgLy8gTk9URTogdGhpcyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gbWUuIHNob3VsZG50IHRoZSBibG9iCisgICAgaWYgKGJsb2JTaXplIDw9IGFsaWdubWVudCkgeworICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIGJsb2IgaXMgbWFsZm9ybWVkLCBibG9iU2l6ZSglenUpIHNob3VsZCBiZSBsYXJnZXIgdGhhbiBhbGlnbm1lbnQoJXp1KSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iU2l6ZSwgYWxpZ25tZW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3QgbWV0YWRhdGFTaXplID0gYmxvYlNpemUgLSBhbGlnbm1lbnQ7CisKKyAgICAvLyBOT1RFOiB0aGlzIGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBtZS4gc2hvdWxkbid0IHRoZSBibG9iCiAgICAgLy8ga25vdyBob3cgYmlnIGl0IGlzPyB3aHkgZG8gd2UgaGF2ZSB0byBzcGVjaWZ5IHRoZSBzaXplCiAgICAgLy8gdG8gUGFyY2VsOjpyZWFkQmxvYiA/Ci0KICAgICBSZWFkYWJsZUJsb2IgYmxvYjsKICAgICAvLyBhcmcxID0gbWV0YWRhdGEgKGJsb2IpCiAgICAgZG8gewotICAgICAgICBpZiAoKGVyciA9IGRhdGEucmVhZEJsb2IobWV0YWRhdGFTaXplLCAmYmxvYikpICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1ldGFkYXRhIGJsb2IgKHNpemVkICVkKS4gUG9zc2libGUgIgorICAgICAgICBpZiAoKGVyciA9IGRhdGEucmVhZEJsb2IoYmxvYlNpemUsICZibG9iKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgYmxvYiAoc2l6ZWQgJXp1KS4gUG9zc2libGUgIgogICAgICAgICAgICAgICAgICAgIiBzZXJpYWxpemF0aW9uIGJ1Zy4gRXJyb3IgJWQgJXMiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtZXRhZGF0YVNpemUsIGVyciwgc3RyZXJyb3IoLWVycikpOworICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iU2l6ZSwgZXJyLCBzdHJlcnJvcigtZXJyKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogdG1wID0KLSAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KGJsb2IuZGF0YSgpKTsKIAorICAgICAgICAvLyBhcmcyID0gb2Zmc2V0IChibG9iKQorICAgICAgICAvLyBNdXN0IGJlIGFmdGVyIGJsb2Igc2luY2Ugd2UgZG9uJ3Qga25vdyBvZmZzZXQgdW50aWwgYWZ0ZXIgd3JpdGVCbG9iLgorICAgICAgICBpbnQzMl90IG9mZnNldFRtcDsKKyAgICAgICAgaWYgKChlcnIgPSBkYXRhLnJlYWRJbnQzMigmb2Zmc2V0VG1wKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgb2Zmc2V0VG1wIChlcnJvciAlZCAlcykiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG9mZnNldFRtcCk7CisgICAgICAgIGlmIChvZmZzZXQgPj0gYWxpZ25tZW50KSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIG9mZnNldCglenUpIHNob3VsZCBiZSBsZXNzIHRoYW4gYWxpZ25tZW50KCV6dSkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJsb2JTaXplLCBhbGlnbm1lbnQpOworICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50cHRyX3QgbWV0YWRhdGFTdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihibG9iLmRhdGEoKSkgKyBvZmZzZXQ7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiB0bXAgPQorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4obWV0YWRhdGFTdGFydCk7CisgICAgICAgIEFMT0dWKCIlczogYWxpZ25tZW50IGlzOiAlenUsIG1ldGFkYXRhIHN0YXJ0OiAlcCwgb2Zmc2V0OiAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWxpZ25tZW50LCB0bXAsIG9mZnNldCk7CiAgICAgICAgIG1ldGFkYXRhID0gYWxsb2NhdGVfY29weV9jYW1lcmFfbWV0YWRhdGFfY2hlY2tlZCh0bXAsIG1ldGFkYXRhU2l6ZSk7CiAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBXZSBjb25zaWRlciB0aGF0IGFsbG9jYXRpb24gb25seSBmYWlscyBpZiB0aGUgdmFsaWRhdGlvbgogICAgICAgICAgICAgLy8gYWxzbyBmYWlsZWQsIHRoZXJlZm9yZSB0aGUgcmVhZEZyb21QYXJjZWwgd2FzIGEgZmFpbHVyZS4KKyAgICAgICAgICAgIEFMT0dFKCIlczogbWV0YWRhdGEgYWxsb2NhdGlvbiBhbmQgY29weSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfSB3aGlsZSgwKTsKQEAgLTQ4NSwzOCArNTE5LDgwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogbWV0YWRhdGEpIHsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIC8vIGFyZzAgPSBtZXRhZGF0YVNpemUgKGludDMyKQorICAgIC8qKgorICAgICAqIEJlbG93IGlzIHRoZSBjYW1lcmEgbWV0YWRhdGEgcGFyY2VsIGxheW91dDoKKyAgICAgKgorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKiB8ICAgICAgICAgICAgIGFyZzA6IGJsb2JTaXplICAgICAgICAgICAgICAgICB8CisgICAgICogfCAgICAgICAgICAgICAgKGxlbmd0aCA9IDQpICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS1Ta2lwIHRoZSByZXN0IGlmIGJsb2JTaXplID09IDAuCisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICBhcmcxOiBibG9iICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfCAobGVuZ3RoID0gdmFyaWFibGUsIHNlZSBhcmcxIGxheW91dCBiZWxvdykgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqIHwgICAgICAgICAgICAgIGFyZzI6IG9mZnNldCAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAobGVuZ3RoID0gNCkgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqLwogCisgICAgLy8gYXJnMCA9IGJsb2JTaXplIChpbnQzMikKICAgICBpZiAobWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICAvLyBXcml0ZSB6ZXJvIGJsb2JTaXplIGZvciBudWxsIG1ldGFkYXRhLgogICAgICAgICByZXR1cm4gZGF0YS53cml0ZUludDMyKDApOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEFsd2F5cyBtYWtlIHRoZSBibG9iIHNpemUgc3VmZmljaWVudGx5IGxhcmdlciwgYXMgd2UgbmVlZCBwdXQgYWxpZ25tZW50CisgICAgICogcGFkZGluZyBhbmQgbWV0YWRhdGEgaW50byB0aGUgYmxvYi4gU2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgYWxpZ25tZW50CisgICAgICogb2Zmc2V0IGJlZm9yZSB3cml0ZUJsb2IuIFRoZW4gd3JpdGUgdGhlIG1ldGFkYXRhIHRvIGFsaWduZWQgb2Zmc2V0LgorICAgICAqLwogICAgIGNvbnN0IHNpemVfdCBtZXRhZGF0YVNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX2NvbXBhY3Rfc2l6ZShtZXRhZGF0YSk7Ci0gICAgcmVzID0gZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1ldGFkYXRhU2l6ZSkpOworICAgIGNvbnN0IHNpemVfdCBhbGlnbm1lbnQgPSBnZXRfY2FtZXJhX21ldGFkYXRhX2FsaWdubWVudCgpOworICAgIGNvbnN0IHNpemVfdCBibG9iU2l6ZSA9IG1ldGFkYXRhU2l6ZSArIGFsaWdubWVudDsKKyAgICByZXMgPSBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oYmxvYlNpemUpKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgLy8gYXJnMSA9IG1ldGFkYXRhIChibG9iKQorICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIC8qKgorICAgICAqIGFyZzEgPSBtZXRhZGF0YSAoYmxvYikuCisgICAgICoKKyAgICAgKiBUaGUgYmxvYiBzaXplIGlzIHRoZSBzdW0gb2YgZnJvbnQgcGFkZGluZyBzaXplLCBtZXRhZGF0YSBzaXplIGFuZCBiYWNrIHBhZGRpbmcKKyAgICAgKiBzaXplLCB3aGljaCBpcyBlcXVhbCB0byBtZXRhZGF0YVNpemUgKyBhbGlnbm1lbnQuCisgICAgICoKKyAgICAgKiBUaGUgYmxvYiBsYXlvdXQgaXM6CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS0tLVN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGJsb2IgKHVuYWxpZ25lZCkuCisgICAgICogfCAgICAgICAgICAgZnJvbnQgcGFkZGluZyAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgIChzaXplID0gb2Zmc2V0KSAgICAgICAgICAgfAorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18PC0tLS1BbGlnbmVkIHN0YXJ0IGFkZHJlc3Mgb2YgbWV0YWRhdGEuCisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICBtZXRhZGF0YSAgICAgICAgICAgICAgICB8CisgICAgICogfCAgICAgICAoc2l6ZSA9IG1ldGFkYXRhU2l6ZSkgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKiB8ICAgICAgICAgICBiYWNrIHBhZGRpbmcgICAgICAgICAgICAgfAorICAgICAqIHwgICAgIChzaXplID0gYWxpZ25tZW50IC0gb2Zmc2V0KSAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS0tLUVuZCBhZGRyZXNzIG9mIGJsb2IuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCbG9iIHN0YXJ0IGFkZHJlc3MgKyBibG9iIHNpemUpLgorICAgICAqLwogICAgIFdyaXRhYmxlQmxvYiBibG9iOwogICAgIGRvIHsKLSAgICAgICAgcmVzID0gZGF0YS53cml0ZUJsb2IobWV0YWRhdGFTaXplLCAmYmxvYik7CisgICAgICAgIHJlcyA9IGRhdGEud3JpdGVCbG9iKGJsb2JTaXplLCAmYmxvYik7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNvcHlfY2FtZXJhX21ldGFkYXRhKGJsb2IuZGF0YSgpLCBtZXRhZGF0YVNpemUsIG1ldGFkYXRhKTsKLQotICAgICAgICBJRl9BTE9HVigpIHsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KilibG9iLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZtZXRhZGF0YVNpemUpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBGYWlsZWQgdG8gdmFsaWRhdGUgbWV0YWRhdGEgJXAgYWZ0ZXIgd3JpdGluZyBibG9iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iLmRhdGEoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogTWV0YWRhdGEgd3JpdHRlbiB0byBibG9iLiBWYWxpZGF0aW9uIHN1Y2Nlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBjb25zdCB1aW50cHRyX3QgbWV0YWRhdGFTdGFydCA9IEFMSUdOX1RPKGJsb2IuZGF0YSgpLCBhbGlnbm1lbnQpOworICAgICAgICBvZmZzZXQgPSBtZXRhZGF0YVN0YXJ0IC0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGJsb2IuZGF0YSgpKTsKKyAgICAgICAgQUxPR1YoIiVzOiBhbGlnbm1lbnQgaXM6ICV6dSwgbWV0YWRhdGEgc3RhcnQ6ICVwLCBvZmZzZXQ6ICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkICo+KG1ldGFkYXRhU3RhcnQpLCBvZmZzZXQpOworICAgICAgICBjb3B5X2NhbWVyYV9tZXRhZGF0YShyZWludGVycHJldF9jYXN0PHZvaWQqPihtZXRhZGF0YVN0YXJ0KSwgbWV0YWRhdGFTaXplLCBtZXRhZGF0YSk7CiAKICAgICAgICAgLy8gTm90IHRvbyBiaWcgb2YgYSBwcm9ibGVtIHNpbmNlIHJlY2VpdmluZyBzaWRlIGRvZXMgaGFyZCB2YWxpZGF0aW9uCiAgICAgICAgIC8vIERvbid0IGNoZWNrIHRoZSBzaXplIHNpbmNlIHRoZSBjb21wYWN0IHNpemUgY291bGQgYmUgbGFyZ2VyCkBAIC01MjgsNiArNjA0LDkgQEAKICAgICB9IHdoaWxlKGZhbHNlKTsKICAgICBibG9iLnJlbGVhc2UoKTsKIAorICAgIC8vIGFyZzIgPSBvZmZzZXQgKGludDMyKQorICAgIHJlcyA9IGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihvZmZzZXQpKTsKKwogICAgIHJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcCBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAppbmRleCBjNTFmMjY1Li4yNWQ2MzJkIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gUGFyYW1ldGVyIGtleXMgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiBjYW1lcmEgYXBwbGljYXRpb24gYW5kIGRyaXZlci4KQEAgLTQ1Niw3ICs0NTcsNyBAQAogCiB2b2lkIENhbWVyYVBhcmFtZXRlcnM6OmR1bXAoKSBjb25zdAogewotICAgIEFMT0dEKCJkdW1wOiBtTWFwLnNpemUgPSAlZCIsIG1NYXAuc2l6ZSgpKTsKKyAgICBBTE9HRCgiZHVtcDogbU1hcC5zaXplID0gJXp1IiwgbU1hcC5zaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1hcC5zaXplKCk7IGkrKykgewogICAgICAgICBTdHJpbmc4IGssIHY7CiAgICAgICAgIGsgPSBtTWFwLmtleUF0KGkpOwpAQCAtNDY1LDEyICs0NjYsMTIgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IENhbWVyYVBhcmFtZXRlcnM6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdAorc3RhdHVzX3QgQ2FtZXJhUGFyYW1ldGVyczo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBjb25zdAogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiQ2FtZXJhUGFyYW1ldGVyczo6ZHVtcDogbU1hcC5zaXplID0gJWRcbiIsIG1NYXAuc2l6ZSgpKTsKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIkNhbWVyYVBhcmFtZXRlcnM6OmR1bXA6IG1NYXAuc2l6ZSA9ICV6dVxuIiwgbU1hcC5zaXplKCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NYXAuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgU3RyaW5nOCBrLCB2OwpAQCAtNDgzLDQgKzQ4NCw0NSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBDYW1lcmFQYXJhbWV0ZXJzOjpnZXRTdXBwb3J0ZWRQcmV2aWV3Rm9ybWF0cyhWZWN0b3I8aW50PiYgZm9ybWF0cykgY29uc3QgeworICAgIGNvbnN0IGNoYXIqIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzID0KKyAgICAgICAgICBnZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QUkVWSUVXX0ZPUk1BVFMpOworCisgICAgU3RyaW5nOCBmbXRTdHIoc3VwcG9ydGVkUHJldmlld0Zvcm1hdHMpOworICAgIGNoYXIqIHByZXZGbXRzID0gZm10U3RyLmxvY2tCdWZmZXIoZm10U3RyLnNpemUoKSk7CisKKyAgICBjaGFyKiBzYXZlUHRyOworICAgIGNoYXIqIGZtdCA9IHN0cnRva19yKHByZXZGbXRzLCAiLCIsICZzYXZlUHRyKTsKKyAgICB3aGlsZSAoZm10KSB7CisgICAgICAgIGludCBhY3R1YWwgPSBwcmV2aWV3Rm9ybWF0VG9FbnVtKGZtdCk7CisgICAgICAgIGlmIChhY3R1YWwgIT0gLTEpIHsKKyAgICAgICAgICAgIGZvcm1hdHMuYWRkKGFjdHVhbCk7CisgICAgICAgIH0KKyAgICAgICAgZm10ID0gc3RydG9rX3IoTlVMTCwgIiwiLCAmc2F2ZVB0cik7CisgICAgfQorICAgIGZtdFN0ci51bmxvY2tCdWZmZXIoZm10U3RyLnNpemUoKSk7Cit9CisKKworaW50IENhbWVyYVBhcmFtZXRlcnM6OnByZXZpZXdGb3JtYXRUb0VudW0oY29uc3QgY2hhciogZm9ybWF0KSB7CisgICAgcmV0dXJuCisgICAgICAgICFmb3JtYXQgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgOgorICAgICAgICAhc3RyY21wKGZvcm1hdCwgUElYRUxfRk9STUFUX1lVVjQyMlNQKSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9TUCA6IC8vIE5WMTYKKyAgICAgICAgIXN0cmNtcChmb3JtYXQsIFBJWEVMX0ZPUk1BVF9ZVVY0MjBTUCkgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgOiAvLyBOVjIxCisgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfWVVWNDIySSkgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfSSA6ICAvLyBZVVkyCisgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfWVVWNDIwUCkgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyIDogICAgICAgICAvLyBZVjEyCisgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfUkdCNTY1KSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUgOiAgICAgIC8vIFJHQjU2NQorICAgICAgICAhc3RyY21wKGZvcm1hdCwgUElYRUxfRk9STUFUX1JHQkE4ODg4KSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCA6ICAgIC8vIFJHQjg4ODgKKyAgICAgICAgIXN0cmNtcChmb3JtYXQsIFBJWEVMX0ZPUk1BVF9CQVlFUl9SR0dCKSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JBV19TRU5TT1IgOiAgIC8vIFJhdyBzZW5zb3IgZGF0YQorICAgICAgICAtMTsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVyczIuY3BwCmluZGV4IGVhYzc5ZTEuLjM3OGFmZWIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmNwcApAQCAtMzYyLDYgKzM2Miw3IEBACiAKIHN0YXR1c190IENhbWVyYVBhcmFtZXRlcnMyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKIHsKKyAgICAodm9pZClhcmdzOwogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYVV0aWxzLmNwcCBiL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyNDRhYwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVV0aWxzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBDYW1lcmFVdGlsczo6Z2V0Um90YXRpb25UcmFuc2Zvcm0oY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCisgICAgICAgICAgICAgICAgLypvdXQqL2ludDMyX3QqIHRyYW5zZm9ybSkgeworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAodHJhbnNmb3JtID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIiVzOiBudWxsIHRyYW5zZm9ybSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKnRyYW5zZm9ybSA9IDA7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1NFTlNPUl9PUklFTlRBVElPTik7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBmaW5kIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uIGluIHN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlGYWNpbmcgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MRU5TX0ZBQ0lORyk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBmaW5kIGFuZHJvaWQubGVucy5mYWNpbmcgaW4gc3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpbnQzMl90JiBmbGFncyA9ICp0cmFuc2Zvcm07CisKKyAgICBib29sIG1pcnJvciA9IChlbnRyeUZhY2luZy5kYXRhLnU4WzBdID09IEFORFJPSURfTEVOU19GQUNJTkdfRlJPTlQpOworICAgIGludCBvcmllbnRhdGlvbiA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIGlmICghbWlycm9yKSB7CisgICAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzkwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMTgwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMjcwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgSEFMIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uIHZhbHVlOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvcmllbnRhdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRnJvbnQgY2FtZXJhIG5lZWRzIHRvIGJlIGhvcml6b250YWxseSBmbGlwcGVkIGZvciBtaXJyb3ItbGlrZSBiZWhhdmlvci4KKyAgICAgICAgLy8gTm90ZTogRmxpcHMgYXJlIGFwcGxpZWQgYmVmb3JlIHJvdGF0ZXM7IHVzaW5nIFhPUiBoZXJlIGFzIHNvbWUgb2YgdGhlc2UgZmxhZ3MgYXJlCisgICAgICAgIC8vIGNvbXBvc2VkIGluIHRlcm1zIG9mIG90aGVyIGZsaXAvcm90YXRpb24gZmxhZ3MsIGFuZCBhcmUgbm90IGJpdHdpc2UtT1JhYmxlLgorICAgICAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0g7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fRkxJUF9IIF4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8yNzA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSCBeCisgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMTgwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0ggXgorICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzkwOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBIQUwgYW5kcm9pZC5zZW5zb3Iub3JpZW50YXRpb24gdmFsdWU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9yaWVudGF0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWFnaWMgZmxhZyBtYWtlcyBzdXJmYWNlZmxpbmdlciB1bi1yb3RhdGUgdGhlIGJ1ZmZlcnMKKyAgICAgKiB0byBjb3VudGVyIHRoZSBleHRyYSBnbG9iYWwgZGV2aWNlIFVJIHJvdGF0aW9uIHdoZW5ldmVyIHRoZSB1c2VyCisgICAgICogcGh5c2ljYWxseSByb3RhdGVzIHRoZSBkZXZpY2UuCisgICAgICoKKyAgICAgKiBCeSBkb2luZyB0aGlzLCB0aGUgY2FtZXJhIGJ1ZmZlciBhbHdheXMgZW5kcyB1cCBhbGlnbmVkCisgICAgICogd2l0aCB0aGUgcGh5c2ljYWwgY2FtZXJhIGZvciBhICJzZWUgdGhyb3VnaCIgZWZmZWN0LgorICAgICAqCisgICAgICogSW4gZXNzZW5jZSwgdGhlIGJ1ZmZlciBvbmx5IGdldHMgcm90YXRlZCBkdXJpbmcgcHJldmlldyB1c2UtY2FzZXMuCisgICAgICogVGhlIHVzZXIgaXMgc3RpbGwgcmVzcG9uc2libGUgdG8gcmUtY3JlYXRlIHN0cmVhbXMgb2YgdGhlIHByb3BlcgorICAgICAqIGFzcGVjdCByYXRpbywgb3IgdGhlIHByZXZpZXcgd2lsbCBlbmQgdXAgbG9va2luZyBub24tdW5pZm9ybWx5CisgICAgICogc3RyZXRjaGVkLgorICAgICAqLworICAgIGZsYWdzIHw9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0lOVkVSU0VfRElTUExBWTsKKworICAgIEFMT0dWKCIlczogZmluYWwgdHJhbnNmb3JtID0gMHgleCIsIF9fRlVOQ1RJT05fXywgZmxhZ3MpOworCisgICAgcmV0dXJuIE9LOworfQorCisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcCBiL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTM2MTYwCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEtQ2FwdHVyZVJlc3VsdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgQ2FwdHVyZVJlc3VsdEV4dHJhczo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gcmVxdWVzdElkID49IDA7Cit9CisKK3N0YXR1c190IENhcHR1cmVSZXN1bHRFeHRyYXM6OnJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHBhcmNlbC0+cmVhZEludDMyKCZyZXF1ZXN0SWQpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZidXJzdElkKTsKKyAgICBwYXJjZWwtPnJlYWRJbnQzMigmYWZUcmlnZ2VySWQpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZwcmVjYXB0dXJlVHJpZ2dlcklkKTsKKyAgICBwYXJjZWwtPnJlYWRJbnQ2NCgmZnJhbWVOdW1iZXIpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZwYXJ0aWFsUmVzdWx0Q291bnQpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYXB0dXJlUmVzdWx0RXh0cmFzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihyZXF1ZXN0SWQpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihidXJzdElkKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoYWZUcmlnZ2VySWQpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihwcmVjYXB0dXJlVHJpZ2dlcklkKTsKKyAgICBwYXJjZWwtPndyaXRlSW50NjQoZnJhbWVOdW1iZXIpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihwYXJ0aWFsUmVzdWx0Q291bnQpOworCisgICAgcmV0dXJuIE9LOworfQorCitDYXB0dXJlUmVzdWx0OjpDYXB0dXJlUmVzdWx0KCkgOgorICAgICAgICBtTWV0YWRhdGEoKSwgbVJlc3VsdEV4dHJhcygpIHsKK30KKworQ2FwdHVyZVJlc3VsdDo6Q2FwdHVyZVJlc3VsdChjb25zdCBDYXB0dXJlUmVzdWx0ICZvdGhlclJlc3VsdCkgeworICAgIG1SZXN1bHRFeHRyYXMgPSBvdGhlclJlc3VsdC5tUmVzdWx0RXh0cmFzOworICAgIG1NZXRhZGF0YSA9IG90aGVyUmVzdWx0Lm1NZXRhZGF0YTsKK30KKworc3RhdHVzX3QgQ2FwdHVyZVJlc3VsdDo6cmVhZEZyb21QYXJjZWwoUGFyY2VsICpwYXJjZWwpIHsKKworICAgIEFMT0dWKCIlczogcGFyY2VsID0gJXAiLCBfX0ZVTkNUSU9OX18sIHBhcmNlbCk7CisKKyAgICBpZiAocGFyY2VsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJjZWwgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbU1ldGFkYXRhLmNsZWFyKCk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICByZXMgPSBtTWV0YWRhdGEucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgZnJvbSBwYXJjZWwuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBSZWFkIG1ldGFkYXRhIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJlcyA9IG1SZXN1bHRFeHRyYXMucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgcmVzdWx0IGV4dHJhcyBmcm9tIHBhcmNlbC4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEFMT0dWKCIlczogUmVhZCByZXN1bHQgZXh0cmFzIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FwdHVyZVJlc3VsdDo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworCisgICAgQUxPR1YoIiVzOiBwYXJjZWwgPSAlcCIsIF9fRlVOQ1RJT05fXywgcGFyY2VsKTsKKworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICByZXMgPSBtTWV0YWRhdGEud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgbWV0YWRhdGEgdG8gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBXcm90ZSBtZXRhZGF0YSB0byBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmVzID0gbVJlc3VsdEV4dHJhcy53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSByZXN1bHQgZXh0cmFzIHRvIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEFMT0dWKCIlczogV3JvdGUgcmVzdWx0IGV4dHJhcyB0byBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmV0dXJuIE9LOworfQorCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwIGIvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCA1ZmM4OWZiLi41NDg1MjA1IDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5jcHAKQEAgLTE3LDYgKzE3LDggQEAKIAogI2RlZmluZSBMT0dfVEFHICJCcENhbWVyYVNlcnZpY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMzQsNiArMzYsNyBAQAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTQzLDYgKzE0NiwyNCBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIC8vIEdldCBlbnVtZXJhdGlvbiBhbmQgZGVzY3JpcHRpb24gb2YgdmVuZG9yIHRhZ3MgZm9yIGNhbWVyYQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhVmVuZG9yVGFnRGVzY3JpcHRvcigvKm91dCovc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2MpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkdFVF9DQU1FUkFfVkVORE9SX1RBR19ERVNDUklQVE9SLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIGlmIChyZWFkRXhjZXB0aW9uQ29kZShyZXBseSkpIHJldHVybiAtRVBST1RPOworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZDsKKyAgICAgICAgICAgIGlmIChWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVGcm9tUGFyY2VsKCZyZXBseSwgLypvdXQqL2QpID09IE9LKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IGQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKICAgICAvLyBjb25uZWN0IHRvIGNhbWVyYSBzZXJ2aWNlIChhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSkKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwgaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCkBAIC0xNjUsNiArMTg2LDI5IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgLy8gY29ubmVjdCB0byBjYW1lcmEgc2VydmljZSAoYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEpCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0TGVnYWN5KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhbFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL3NwPElDYW1lcmE+JiBkZXZpY2UpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjYW1lcmFDbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY2FtZXJhSWQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaGFsVmVyc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihjbGllbnRQYWNrYWdlTmFtZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjbGllbnRVaWQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0xFR0FDWSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiAgICAgLy8gY29ubmVjdCB0byBjYW1lcmEgc2VydmljZSAocHJvIGNsaWVudCkKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3RQcm8oY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIGNhbWVyYUNiLCBpbnQgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKQEAgLTIzMyw2ICsyNzcsNDEgQEAKICAgICAgICAgaWYgKHJlYWRFeGNlcHRpb25Db2RlKHJlcGx5KSkgcmV0dXJuIC1FUFJPVE87CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExlZ2FjeVBhcmFtZXRlcnMoaW50IGNhbWVyYUlkLCBTdHJpbmcxNiogcGFyYW1ldGVycykgeworICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHBhcmFtZXRlcnMgbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkdFVF9MRUdBQ1lfUEFSQU1FVEVSUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHJlYWRFeGNlcHRpb25Db2RlKHJlcGx5KSkgcmV0dXJuIC1FUFJPVE87CisKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaW50MzJfdCBsZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOyAvLyAtMSBtZWFucyBudWxsCisgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IGRhdGEucmVhZFN0cmluZzE2KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IFN0cmluZzE2KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNDYW1lcmFBcGkoaW50IGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbikgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGNhbWVyYUlkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGFwaVZlcnNpb24pOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpTVVBQT1JUU19DQU1FUkFfQVBJLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKKworICAgICAgICBzdGF0dXNfdCByZXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShDYW1lcmFTZXJ2aWNlLCAiYW5kcm9pZC5oYXJkd2FyZS5JQ2FtZXJhU2VydmljZSIpOwpAQCAtMjc1LDYgKzM1NCwyMiBAQAogICAgICAgICAgICAgaW5mby53cml0ZVRvUGFyY2VsKHJlcGx5KTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfQ0FNRVJBX1ZFTkRPUl9UQUdfREVTQ1JJUFRPUjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0Q2FtZXJhVmVuZG9yVGFnRGVzY3JpcHRvcihkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworCisgICAgICAgICAgICAvLyBvdXQtdmFyaWFibGVzIGFyZSBhZnRlciBleGNlcHRpb24gYW5kIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgaWYgKGQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsgLy8gbWVhbnMgdGhlIHBhcmNlbGFibGUgaXMgaW5jbHVkZWQKKyAgICAgICAgICAgICAgICBkLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDT05ORUNUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IGNhbWVyYUNsaWVudCA9CkBAIC0yODQsNyArMzc5LDcgQEAKICAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3QoY2FtZXJhQ2xpZW50LCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovIGNhbWVyYSk7CisgICAgICAgICAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgLypvdXQqL2NhbWVyYSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChjYW1lcmEgIT0gTlVMTCkgewpAQCAtMzA0LDcgKzM5OSw3IEBACiAgICAgICAgICAgICBpbnQzMl90IGNsaWVudFVpZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzcDxJUHJvQ2FtZXJhVXNlcj4gY2FtZXJhOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdFBybyhjYW1lcmFDbGllbnQsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICBjbGllbnROYW1lLCBjbGllbnRVaWQsIC8qb3V0Ki8gY2FtZXJhKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovY2FtZXJhKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKGNhbWVyYSAhPSBOVUxMKSB7CkBAIC0zMjQsNyArNDE5LDcgQEAKICAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBjYW1lcmE7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0RGV2aWNlKGNhbWVyYUNsaWVudCwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgLypvdXQqLyBjYW1lcmEpOworICAgICAgICAgICAgICAgICAgICBjbGllbnROYW1lLCBjbGllbnRVaWQsIC8qb3V0Ki9jYW1lcmEpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoY2FtZXJhICE9IE5VTEwpIHsKQEAgLTM1MSw2ICs0NDYsNTAgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0xFR0FDWV9QQVJBTUVURVJTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBTdHJpbmcxNiBwYXJhbWV0ZXJzOworCisgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRMZWdhY3lQYXJhbWV0ZXJzKGNhbWVyYUlkLCAmcGFyYW1ldGVycykpOworICAgICAgICAgICAgLy8gb3V0IHBhcmFtZXRlcnMKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOyAvLyBwYXJhbWV0ZXJzIGlzIGFsd2F5cyBhdmFpbGFibGUKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KHBhcmFtZXRlcnMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNVUFBPUlRTX0NBTUVSQV9BUEk6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IGNhbWVyYUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBhcGlWZXJzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3VwcG9ydHNDYW1lcmFBcGkoY2FtZXJhSWQsIGFwaVZlcnNpb24pKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDT05ORUNUX0xFR0FDWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjYW1lcmFDbGllbnQgPQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludDMyX3QgaGFsVmVyc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiBjbGllbnROYW1lID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKKyAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RMZWdhY3koY2FtZXJhQ2xpZW50LCBjYW1lcmFJZCwgaGFsVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovY2FtZXJhKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKGNhbWVyYSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGNhbWVyYS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9jYW1lcmEvUHJvQ2FtZXJhLmNwcCBiL2NhbWVyYS9Qcm9DYW1lcmEuY3BwCmluZGV4IGJhNWE0OGMuLjQ4ZjhlOGUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9Qcm9DYW1lcmEuY3BwCisrKyBiL2NhbWVyYS9Qcm9DYW1lcmEuY3BwCkBAIC0yNDksMTEgKzI0OSwxNCBAQAogICAgIHNwIDxJUHJvQ2FtZXJhVXNlcj4gYyA9IG1DYW1lcmE7CiAgICAgaWYgKGMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAKLSAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICBzcDxDcHVDb25zdW1lcj4gY2MgPSBuZXcgQ3B1Q29uc3VtZXIoYnEsIGhlYXBDb3VudC8qLCBzeW5jaHJvbm91c01vZGUqLyk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBzcDxDcHVDb25zdW1lcj4gY2MgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIGhlYXBDb3VudAorICAgICAgICAgICAgLyosIHN5bmNocm9ub3VzTW9kZSovKTsKICAgICBjYy0+c2V0TmFtZShTdHJpbmc4KCJQcm9DYW1lcmE6Om1DcHVDb25zdW1lciIpKTsKIAotICAgIHNwPFN1cmZhY2U+IHN0YyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICBzcDxTdXJmYWNlPiBzdGMgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAKICAgICBzdGF0dXNfdCBzID0gY3JlYXRlU3RyZWFtKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Yy0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpLApkaWZmIC0tZ2l0IGEvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZGE2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKQEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlZlbmRvclRhZ0Rlc2NyaXB0b3IiCisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX21ldGFkYXRhLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorCisjaW5jbHVkZSAiY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdik7CitzdGF0aWMgdm9pZCB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X2FsbF90YWdzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHYsIHVpbnQzMl90KiB0YWdBcnJheSk7CitzdGF0aWMgY29uc3QgY2hhciogdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF9zZWN0aW9uX25hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdiwgdWludDMyX3QgdGFnKTsKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X3RhZ19uYW1lKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHYsIHVpbnQzMl90IHRhZyk7CitzdGF0aWMgaW50IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX3R5cGUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdiwgdWludDMyX3QgdGFnKTsKKworfSAvKiBleHRlcm4gIkMiICovCisKKworc3RhdGljIE11dGV4IHNMb2NrOworc3RhdGljIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yOworCitWZW5kb3JUYWdEZXNjcmlwdG9yOjpWZW5kb3JUYWdEZXNjcmlwdG9yKCkge30KKworVmVuZG9yVGFnRGVzY3JpcHRvcjo6flZlbmRvclRhZ0Rlc2NyaXB0b3IoKSB7CisgICAgc2l6ZV90IGxlbiA9IG1SZXZlcnNlTWFwcGluZy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47ICsraSkgIHsKKyAgICAgICAgZGVsZXRlIG1SZXZlcnNlTWFwcGluZ1tpXTsKKyAgICB9Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tT3BzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHZPcHMsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgeworICAgIGlmICh2T3BzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB2ZW5kb3JfdGFnX29wcyBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludCB0YWdDb3VudCA9IHZPcHMtPmdldF90YWdfY291bnQodk9wcyk7CisgICAgaWYgKHRhZ0NvdW50IDwgMCB8fCB0YWdDb3VudCA+IElOVDMyX01BWCkgeworICAgICAgICBBTE9HRSgiJXM6IHRhZyBjb3VudCAlZCBmcm9tIHZlbmRvciBvcHMgaXMgaW52YWxpZC4iLCBfX0ZVTkNUSU9OX18sIHRhZ0NvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IHRhZ0FycmF5OworICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGFnQXJyYXkucmVzaXplKHRhZ0NvdW50KSAhPSB0YWdDb3VudCwKKyAgICAgICAgICAgICIlczogdG9vIG1hbnkgKCV1KSB2ZW5kb3IgdGFncyBkZWZpbmVkLiIsIF9fRlVOQ1RJT05fXywgdGFnQ291bnQpOworCisgICAgdk9wcy0+Z2V0X2FsbF90YWdzKHZPcHMsIC8qb3V0Ki90YWdBcnJheS5lZGl0QXJyYXkoKSk7CisKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gbmV3IFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICBkZXNjLT5tVGFnQ291bnQgPSB0YWdDb3VudDsKKworICAgIFNvcnRlZFZlY3RvcjxTdHJpbmc4PiBzZWN0aW9uczsKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgU3RyaW5nOD4gdGFnVG9TZWN0aW9uTWFwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ0NvdW50KTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IHRhZ0FycmF5W2ldOworICAgICAgICBpZiAodGFnIDwgQ0FNRVJBX01FVEFEQVRBX1ZFTkRPUl9UQUdfQk9VTkRBUlkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgY2hhciAqdGFnTmFtZSA9IHZPcHMtPmdldF90YWdfbmFtZSh2T3BzLCB0YWcpOworICAgICAgICBpZiAodGFnTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHRhZyBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tVGFnVG9OYW1lTWFwLmFkZCh0YWcsIFN0cmluZzgodGFnTmFtZSkpOworICAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uTmFtZSA9IHZPcHMtPmdldF9zZWN0aW9uX25hbWUodk9wcywgdGFnKTsKKyAgICAgICAgaWYgKHNlY3Rpb25OYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc2VjdGlvbiBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyhzZWN0aW9uTmFtZSk7CisKKyAgICAgICAgc2VjdGlvbnMuYWRkKHNlY3Rpb25TdHJpbmcpOworICAgICAgICB0YWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc2VjdGlvblN0cmluZyk7CisKKyAgICAgICAgaW50IHRhZ1R5cGUgPSB2T3BzLT5nZXRfdGFnX3R5cGUodk9wcywgdGFnKTsKKyAgICAgICAgaWYgKHRhZ1R5cGUgPCAwIHx8IHRhZ1R5cGUgPj0gTlVNX1RZUEVTKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHRhZyB0eXBlICVkIGZyb20gdmVuZG9yIG9wcyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHRhZ1R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tVGFnVG9UeXBlTWFwLmFkZCh0YWcsIHRhZ1R5cGUpOworICAgIH0KKworICAgIGRlc2MtPm1TZWN0aW9ucyA9IHNlY3Rpb25zOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ0NvdW50KTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IHRhZ0FycmF5W2ldOworICAgICAgICBTdHJpbmc4IHNlY3Rpb25TdHJpbmcgPSB0YWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKKworICAgICAgICAvLyBTZXQgdXAgdGFnIHRvIHNlY3Rpb24gaW5kZXggbWFwCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBzZWN0aW9ucy5pbmRleE9mKHNlY3Rpb25TdHJpbmcpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgImluZGV4ICV6ZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIsIGluZGV4KTsKKyAgICAgICAgZGVzYy0+bVRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpKTsKKworICAgICAgICAvLyBTZXQgdXAgcmV2ZXJzZSBtYXBwaW5nCisgICAgICAgIHNzaXplX3QgcmV2ZXJzZUluZGV4ID0gLTE7CisgICAgICAgIGlmICgocmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvblN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KiBuYW1lTWFwcGVyID0gbmV3IEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PigpOworICAgICAgICAgICAgcmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmFkZChzZWN0aW9uU3RyaW5nLCBuYW1lTWFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKKyAgICB9CisKKyAgICBkZXNjcmlwdG9yID0gZGVzYzsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludDMyX3QgdGFnQ291bnQgPSAwOworICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRhZ0NvdW50KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVhZCB0YWcgY291bnQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICh0YWdDb3VudCA8IDAgfHwgdGFnQ291bnQgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0YWcgY291bnQgJWQgZnJvbSB2ZW5kb3Igb3BzIGlzIGludmFsaWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgZGVzYy0+bVRhZ0NvdW50ID0gdGFnQ291bnQ7CisKKyAgICB1aW50MzJfdCB0YWcsIHNlY3Rpb25JbmRleDsKKyAgICB1aW50MzJfdCBtYXhTZWN0aW9uSW5kZXggPSAwOworICAgIGludDMyX3QgdGFnVHlwZTsKKyAgICBWZWN0b3I8dWludDMyX3Q+IGFsbFRhZ3M7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdGFnQ291bnQ7ICsraSkgeworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+cmVhZEludDMyKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZ0YWcpKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IHJlYWQgdGFnIGlkIGZyb20gcGFyY2VsIGZvciBpbmRleCAlZCIsIF9fRlVOQ1RJT05fXywgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAodGFnIDwgQ0FNRVJBX01FVEFEQVRBX1ZFTkRPUl9UQUdfQk9VTkRBUlkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJlcyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRhZ1R5cGUpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVhZCB0YWcgdHlwZSBmcm9tIHBhcmNlbCBmb3IgdGFnICVkIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRhZ1R5cGUgPCAwIHx8IHRhZ1R5cGUgPj0gTlVNX1RZUEVTKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHRhZyB0eXBlICVkIGZyb20gdmVuZG9yIG9wcyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHRhZ1R5cGUpOworICAgICAgICAgICAgcmVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nOCB0YWdOYW1lID0gcGFyY2VsLT5yZWFkU3RyaW5nOCgpOworICAgICAgICBpZiAodGFnTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGFyY2VsIHRhZyBuYW1lIHdhcyBOVUxMIGZvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmVzID0gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+cmVhZEludDMyKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZzZWN0aW9uSW5kZXgpKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IHJlYWQgc2VjdGlvbiBpbmRleCBmb3IgdGFnICVkLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbWF4U2VjdGlvbkluZGV4ID0gKG1heFNlY3Rpb25JbmRleCA+PSBzZWN0aW9uSW5kZXgpID8gbWF4U2VjdGlvbkluZGV4IDogc2VjdGlvbkluZGV4OworCisgICAgICAgIGFsbFRhZ3MuYWRkKHRhZyk7CisgICAgICAgIGRlc2MtPm1UYWdUb05hbWVNYXAuYWRkKHRhZywgdGFnTmFtZSk7CisgICAgICAgIGRlc2MtPm1UYWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc2VjdGlvbkluZGV4KTsKKyAgICAgICAgZGVzYy0+bVRhZ1RvVHlwZU1hcC5hZGQodGFnLCB0YWdUeXBlKTsKKyAgICB9CisKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc2l6ZV90IHNlY3Rpb25Db3VudDsKKyAgICBpZiAodGFnQ291bnQgPiAwKSB7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkSW50MzIocmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJnNlY3Rpb25Db3VudCkpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVhZCBzZWN0aW9uIGNvdW50IGZvci4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VjdGlvbkNvdW50IDwgKG1heFNlY3Rpb25JbmRleCArIDEpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEluY29ycmVjdCBudW1iZXIgb2Ygc2VjdGlvbnMgZGVmaW5lZCwgcmVjZWl2ZWQgJXp1LCBuZWVkcyAlZC4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlY3Rpb25Db3VudCwgKG1heFNlY3Rpb25JbmRleCArIDEpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkZXNjLT5tU2VjdGlvbnMuc2V0Q2FwYWNpdHkoc2VjdGlvbkNvdW50KSA8PSAwLAorICAgICAgICAgICAgICAgICJWZWN0b3IgY2FwYWNpdHkgbXVzdCBiZSBwb3NpdGl2ZSIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlY3Rpb25Db3VudDsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmc4IHNlY3Rpb25OYW1lID0gcGFyY2VsLT5yZWFkU3RyaW5nOCgpOworICAgICAgICAgICAgaWYgKHNlY3Rpb25OYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogcGFyY2VsIHNlY3Rpb24gbmFtZSB3YXMgTlVMTCBmb3Igc2VjdGlvbiAlenUuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGkpOworICAgICAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXNjLT5tU2VjdGlvbnMuYWRkKHNlY3Rpb25OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdGljX2Nhc3Q8c2l6ZV90Pih0YWdDb3VudCkgIT0gYWxsVGFncy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAidGFnQ291bnQgbXVzdCBiZSB0aGUgc2FtZSBhcyBhbGxUYWdzIHNpemUiKTsKKyAgICAvLyBTZXQgdXAgcmV2ZXJzZSBtYXBwaW5nCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ0NvdW50KTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IGFsbFRhZ3NbaV07CisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyA9IGRlc2MtPm1TZWN0aW9uc1tkZXNjLT5tVGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyldOworCisgICAgICAgIHNzaXplX3QgcmV2ZXJzZUluZGV4ID0gLTE7CisgICAgICAgIGlmICgocmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvblN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KiBuYW1lTWFwcGVyID0gbmV3IEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PigpOworICAgICAgICAgICAgcmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmFkZChzZWN0aW9uU3RyaW5nLCBuYW1lTWFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKKyAgICB9CisKKyAgICBkZXNjcmlwdG9yID0gZGVzYzsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0VGFnQ291bnQoKSBjb25zdCB7CisgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBWRU5ET1JfVEFHX0NPVU5UX0VSUjsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3ZvaWQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0VGFnQXJyYXkodWludDMyX3QqIHRhZ0FycmF5KSBjb25zdCB7CisgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICB0YWdBcnJheVtpXSA9IG1UYWdUb05hbWVNYXAua2V5QXQoaSk7CisgICAgfQorfQorCitjb25zdCBjaGFyKiBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRTZWN0aW9uTmFtZSh1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVRhZ1RvU2VjdGlvbk1hcC5pbmRleE9mS2V5KHRhZyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gVkVORE9SX1NFQ1RJT05fTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBtU2VjdGlvbnNbbVRhZ1RvU2VjdGlvbk1hcC52YWx1ZUF0KGluZGV4KV0uc3RyaW5nKCk7Cit9CisKK2NvbnN0IGNoYXIqIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldFRhZ05hbWUodWludDMyX3QgdGFnKSBjb25zdCB7CisgICAgc3NpemVfdCBpbmRleCA9IG1UYWdUb05hbWVNYXAuaW5kZXhPZktleSh0YWcpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBtVGFnVG9OYW1lTWFwLnZhbHVlQXQoaW5kZXgpLnN0cmluZygpOworfQorCitpbnQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0VGFnVHlwZSh1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVRhZ1RvTmFtZU1hcC5pbmRleE9mS2V5KHRhZyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gVkVORE9SX1RBR19UWVBFX0VSUjsKKyAgICB9CisgICAgcmV0dXJuIG1UYWdUb1R5cGVNYXAudmFsdWVGb3IodGFnKTsKK30KKworc3RhdHVzX3QgVmVuZG9yVGFnRGVzY3JpcHRvcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZUludDMyKG1UYWdDb3VudCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKKyAgICB1aW50MzJfdCB0YWcsIHNlY3Rpb25JbmRleDsKKyAgICBpbnQzMl90IHRhZ1R5cGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgdGFnID0gbVRhZ1RvTmFtZU1hcC5rZXlBdChpKTsKKyAgICAgICAgU3RyaW5nOCB0YWdOYW1lID0gbVRhZ1RvTmFtZU1hcFtpXTsKKyAgICAgICAgc2VjdGlvbkluZGV4ID0gbVRhZ1RvU2VjdGlvbk1hcC52YWx1ZUZvcih0YWcpOworICAgICAgICB0YWdUeXBlID0gbVRhZ1RvVHlwZU1hcC52YWx1ZUZvcih0YWcpOworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+d3JpdGVJbnQzMih0YWcpKSAhPSBPSykgYnJlYWs7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZUludDMyKHRhZ1R5cGUpKSAhPSBPSykgYnJlYWs7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZVN0cmluZzgodGFnTmFtZSkpICE9IE9LKSBicmVhazsKKyAgICAgICAgaWYgKChyZXMgPSBwYXJjZWwtPndyaXRlSW50MzIoc2VjdGlvbkluZGV4KSkgIT0gT0spIGJyZWFrOworICAgIH0KKworICAgIHNpemVfdCBudW1TZWN0aW9ucyA9IG1TZWN0aW9ucy5zaXplKCk7CisgICAgaWYgKG51bVNlY3Rpb25zID4gMCkgeworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+d3JpdGVJbnQzMihudW1TZWN0aW9ucykpICE9IE9LKSByZXR1cm4gcmVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNlY3Rpb25zOyArK2kpIHsKKyAgICAgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZVN0cmluZzgobVNlY3Rpb25zW2ldKSkgIT0gT0spIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitTb3J0ZWRWZWN0b3I8U3RyaW5nOD4gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0QWxsU2VjdGlvbk5hbWVzKCkgY29uc3QgeworICAgIHJldHVybiBtU2VjdGlvbnM7Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6Omxvb2t1cFRhZyhTdHJpbmc4IG5hbWUsIFN0cmluZzggc2VjdGlvbiwgLypvdXQqL3VpbnQzMl90KiB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IFNlY3Rpb24gJyVzJyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHNlY3Rpb24uc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNzaXplX3QgbmFtZUluZGV4ID0gbVJldmVyc2VNYXBwaW5nW2luZGV4XS0+aW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAobmFtZUluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IFRhZyBuYW1lICclcycgZG9lcyBub3QgZXhpc3QuIiwgX19GVU5DVElPTl9fLCBuYW1lLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAodGFnICE9IE5VTEwpIHsKKyAgICAgICAgKnRhZyA9IG1SZXZlcnNlTWFwcGluZ1tpbmRleF0tPnZhbHVlQXQobmFtZUluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0IHsKKworICAgIHNpemVfdCBzaXplID0gbVRhZ1RvTmFtZU1hcC5zaXplKCk7CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiJSpzRHVtcGluZyBjb25maWd1cmVkIHZlbmRvciB0YWcgZGVzY3JpcHRvcnM6IE5vbmUgc2V0XG4iLAorICAgICAgICAgICAgICAgIGluZGVudGF0aW9uLCAiIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkcHJpbnRmKGZkLCAiJSpzRHVtcGluZyBjb25maWd1cmVkIHZlbmRvciB0YWcgZGVzY3JpcHRvcnM6ICV6dSBlbnRyaWVzXG4iLAorICAgICAgICAgICAgaW5kZW50YXRpb24sICIiLCBzaXplKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICB1aW50MzJfdCB0YWcgPSAgbVRhZ1RvTmFtZU1hcC5rZXlBdChpKTsKKworICAgICAgICBpZiAodmVyYm9zaXR5IDwgMSkgeworICAgICAgICAgICAgZHByaW50ZihmZCwgIiUqczB4JXhcbiIsIGluZGVudGF0aW9uICsgMiwgIiIsIHRhZyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmc4IG5hbWUgPSBtVGFnVG9OYW1lTWFwLnZhbHVlQXQoaSk7CisgICAgICAgIHVpbnQzMl90IHNlY3Rpb25JZCA9IG1UYWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKKyAgICAgICAgU3RyaW5nOCBzZWN0aW9uTmFtZSA9IG1TZWN0aW9uc1tzZWN0aW9uSWRdOworICAgICAgICBpbnQgdHlwZSA9IG1UYWdUb1R5cGVNYXAudmFsdWVGb3IodGFnKTsKKyAgICAgICAgY29uc3QgY2hhciogdHlwZU5hbWUgPSAodHlwZSA+PSAwICYmIHR5cGUgPCBOVU1fVFlQRVMpID8KKyAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdHlwZV9uYW1lc1t0eXBlXSA6ICJVTktOT1dOIjsKKyAgICAgICAgZHByaW50ZihmZCwgIiUqczB4JXggKCVzKSB3aXRoIHR5cGUgJWQgKCVzKSBkZWZpbmVkIGluIHNlY3Rpb24gJXNcbiIsIGluZGVudGF0aW9uICsgMiwKKyAgICAgICAgICAgICIiLCB0YWcsIG5hbWUuc3RyaW5nKCksIHR5cGUsIHR5cGVOYW1lLCBzZWN0aW9uTmFtZS5zdHJpbmcoKSk7CisgICAgfQorCit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OnNldEFzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcihjb25zdCBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CisgICAgc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPSBkZXNjOworCisgICAgdmVuZG9yX3RhZ19vcHNfdCogb3BzUHRyID0gTlVMTDsKKyAgICBpZiAoZGVzYyAhPSBOVUxMKSB7CisgICAgICAgIG9wc1B0ciA9ICYoZGVzYy0+bVZlbmRvck9wcyk7CisgICAgICAgIG9wc1B0ci0+Z2V0X3RhZ19jb3VudCA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX2NvdW50OworICAgICAgICBvcHNQdHItPmdldF9hbGxfdGFncyA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfYWxsX3RhZ3M7CisgICAgICAgIG9wc1B0ci0+Z2V0X3NlY3Rpb25fbmFtZSA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfc2VjdGlvbl9uYW1lOworICAgICAgICBvcHNQdHItPmdldF90YWdfbmFtZSA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX25hbWU7CisgICAgICAgIG9wc1B0ci0+Z2V0X3RhZ190eXBlID0gdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfdHlwZTsKKyAgICB9CisgICAgaWYoKHJlcyA9IHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX29wcyhvcHNQdHIpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBzZXQgdmVuZG9yIHRhZyBkZXNjcmlwdG9yLCByZWNlaXZlZCBlcnJvciAlcyAoJWQpLiIKKyAgICAgICAgICAgICAgICAsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CisgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3Jfb3BzKE5VTEwpOworICAgIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yLmNsZWFyKCk7Cit9CisKK3NwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICByZXR1cm4gc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3I7Cit9CisKK2V4dGVybiAiQyIgeworCitpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogLyp2Ki8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVkVORE9SX1RBR19DT1VOVF9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0VGFnQ291bnQoKTsKK30KKwordm9pZCB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X2FsbF90YWdzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIC8qdiovLCB1aW50MzJfdCogdGFnQXJyYXkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yLT5nZXRUYWdBcnJheSh0YWdBcnJheSk7Cit9CisKK2NvbnN0IGNoYXIqIHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfc2VjdGlvbl9uYW1lKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIC8qdiovLCB1aW50MzJfdCB0YWcpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVkVORE9SX1NFQ1RJT05fTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0U2VjdGlvbk5hbWUodGFnKTsKK30KKworY29uc3QgY2hhciogdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfbmFtZShjb25zdCB2ZW5kb3JfdGFnX29wc190KiAvKnYqLywgdWludDMyX3QgdGFnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICBpZiAoc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgZGVzY3JpcHRvciBub3QgaW5pdGlhbGl6ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0VGFnTmFtZSh0YWcpOworfQorCitpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfdHlwZShjb25zdCB2ZW5kb3JfdGFnX29wc190KiAvKnYqLywgdWludDMyX3QgdGFnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICBpZiAoc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgZGVzY3JpcHRvciBub3QgaW5pdGlhbGl6ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfVFlQRV9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0VGFnVHlwZSh0YWcpOworfQorCit9IC8qIGV4dGVybiAiQyIgKi8KK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKaW5kZXggNjEzMzU4YS4uNGNjN2I1ZCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ2LDEyICs0NywxNCBAQAogICAgIHsKICAgICB9CiAKLSAgICB2b2lkIG9uRGV2aWNlRXJyb3IoQ2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSkKKyAgICB2b2lkIG9uRGV2aWNlRXJyb3IoQ2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKQogICAgIHsKICAgICAgICAgQUxPR1YoIm9uRGV2aWNlRXJyb3IiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZUNhbGxiYWNrczo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGVycm9yQ29kZSkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7IC8vIHRvIG1hcmsgcHJlc2VuY2Ugb2YgQ2FwdHVyZVJlc3VsdEV4dHJhcyBvYmplY3QKKyAgICAgICAgcmVzdWx0RXh0cmFzLndyaXRlVG9QYXJjZWwoJmRhdGEpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ0FNRVJBX0VSUk9SLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICAgICAgZGF0YS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgfQpAQCAtNjUsMjUgKzY4LDI4IEBACiAgICAgICAgIGRhdGEud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgIH0KIAotICAgIHZvaWQgb25DYXB0dXJlU3RhcnRlZChpbnQzMl90IHJlcXVlc3RJZCwgaW50NjRfdCB0aW1lc3RhbXApCisgICAgdm9pZCBvbkNhcHR1cmVTdGFydGVkKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdCwgaW50NjRfdCB0aW1lc3RhbXApCiAgICAgewogICAgICAgICBBTE9HVigib25DYXB0dXJlU3RhcnRlZCIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIocmVxdWVzdElkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOyAvLyB0byBtYXJrIHByZXNlbmNlIG9mIENhcHR1cmVSZXN1bHRFeHRyYXMgb2JqZWN0CisgICAgICAgIHJlc3VsdC53cml0ZVRvUGFyY2VsKCZkYXRhKTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVzdGFtcCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDQVBUVVJFX1NUQVJURUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgICAgICBkYXRhLndyaXRlTm9FeGNlcHRpb24oKTsKICAgICB9CiAKIAotICAgIHZvaWQgb25SZXN1bHRSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdCkgeworICAgIHZvaWQgb25SZXN1bHRSZWNlaXZlZChjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKICAgICAgICAgQUxPR1YoIm9uUmVzdWx0UmVjZWl2ZWQiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZUNhbGxiYWNrczo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHJlcXVlc3RJZCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsgLy8gdG8gbWFyayBwcmVzZW5jZSBvZiBtZXRhZGF0YSBvYmplY3QKLSAgICAgICAgcmVzdWx0LndyaXRlVG9QYXJjZWwoJmRhdGEpOworICAgICAgICBtZXRhZGF0YS53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOyAvLyB0byBtYXJrIHByZXNlbmNlIG9mIENhcHR1cmVSZXN1bHQgb2JqZWN0CisgICAgICAgIHJlc3VsdEV4dHJhcy53cml0ZVRvUGFyY2VsKCZkYXRhKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFU1VMVF9SRUNFSVZFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgICAgIGRhdGEud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgIH0KQEAgLTEwNCw3ICsxMTAsMTMgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhRXJyb3JDb2RlPihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIG9uRGV2aWNlRXJyb3IoZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcy5yZWFkRnJvbVBhcmNlbChjb25zdF9jYXN0PFBhcmNlbCo+KCZkYXRhKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJObyBDYXB0dXJlUmVzdWx0RXh0cmFzIG9iamVjdCBpcyBwcmVzZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb25EZXZpY2VFcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CiAgICAgICAgICAgICBkYXRhLnJlYWRFeGNlcHRpb25Db2RlKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0xMTgsMjMgKzEzMCwzMyBAQAogICAgICAgICBjYXNlIENBUFRVUkVfU1RBUlRFRDogewogICAgICAgICAgICAgQUxPR1YoIm9uQ2FwdHVyZVN0YXJ0ZWQiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdDsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQucmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTm8gQ2FwdHVyZVJlc3VsdEV4dHJhcyBvYmplY3QgaXMgcHJlc2VudCBpbiByZXN1bHQhIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBvbkNhcHR1cmVTdGFydGVkKHJlcXVlc3RJZCwgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG9uQ2FwdHVyZVN0YXJ0ZWQocmVzdWx0LCB0aW1lc3RhbXApOwogICAgICAgICAgICAgZGF0YS5yZWFkRXhjZXB0aW9uQ29kZSgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFJFU1VMVF9SRUNFSVZFRDogewogICAgICAgICAgICAgQUxPR1YoIm9uUmVzdWx0UmVjZWl2ZWQiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSByZXN1bHQ7CisgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKICAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQucmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpOworICAgICAgICAgICAgICAgIG1ldGFkYXRhLnJlYWRGcm9tUGFyY2VsKGNvbnN0X2Nhc3Q8UGFyY2VsKj4oJmRhdGEpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIk5vIG1ldGFkYXRhIG9iamVjdCBpcyBwcmVzZW50IGluIHJlc3VsdCIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChyZXF1ZXN0SWQsIHJlc3VsdCk7CisgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMucmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiTm8gY2FwdHVyZSByZXN1bHQgZXh0cmFzIG9iamVjdCBpcyBwcmVzZW50IGluIHJlc3VsdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChtZXRhZGF0YSwgcmVzdWx0RXh0cmFzKTsKICAgICAgICAgICAgIGRhdGEucmVhZEV4Y2VwdGlvbkNvZGUoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcCBiL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcAppbmRleCAxZTU4MjJmLi5mZjRhMGMyIDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuY3BwCkBAIC0zNSw3ICszNSwxMCBAQAogZW51bSB7CiAgICAgRElTQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgU1VCTUlUX1JFUVVFU1QsCisgICAgU1VCTUlUX1JFUVVFU1RfTElTVCwKICAgICBDQU5DRUxfUkVRVUVTVCwKKyAgICBCRUdJTl9DT05GSUdVUkUsCisgICAgRU5EX0NPTkZJR1VSRSwKICAgICBERUxFVEVfU1RSRUFNLAogICAgIENSRUFURV9TVFJFQU0sCiAgICAgQ1JFQVRFX0RFRkFVTFRfUkVRVUVTVCwKQEAgLTc1LDcgKzc4LDggQEAKICAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGludCBzdWJtaXRSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0LCBib29sIHN0cmVhbWluZykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsIGJvb2wgcmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZVVzZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC04OSwxNSArOTMsNjcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGFyZzEgPSBzdHJlYW1pbmcgKGJvb2wpCi0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1pbmcpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocmVwZWF0aW5nKTsKIAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1VCTUlUX1JFUVVFU1QsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBzdGF0dXNfdCByZXMgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBzdGF0dXNfdCByZXNGcmFtZU51bWJlciA9IEJBRF9WQUxVRTsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlc0ZyYW1lTnVtYmVyID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCWlmICgocmVzICE9IE5PX0VSUk9SKSB8fCAocmVzRnJhbWVOdW1iZXIgIT0gTk9fRVJST1IpKSB7CisgICAgICAgICAgICByZXMgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1Ym1pdFJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdExpc3QsIGJvb2wgcmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFEZXZpY2VVc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIGRhdGEud3JpdGVJbnQzMihyZXF1ZXN0TGlzdC5zaXplKCkpOworCisgICAgICAgIGZvciAoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPjo6aXRlcmF0b3IgaXQgPSByZXF1ZXN0TGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgIGl0ICE9IHJlcXVlc3RMaXN0LmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9ICppdDsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QtPndyaXRlVG9QYXJjZWwoJmRhdGEpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhLndyaXRlSW50MzIocmVwZWF0aW5nKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1VCTUlUX1JFUVVFU1RfTElTVCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworICAgICAgICBzdGF0dXNfdCByZXMgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBzdGF0dXNfdCByZXNGcmFtZU51bWJlciA9IEJBRF9WQUxVRTsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlc0ZyYW1lTnVtYmVyID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkLCBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTEwNiw2ICsxNjIsMzcgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENBTkNFTF9SRVFVRVNULCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIHN0YXR1c190IHJlc0ZyYW1lTnVtYmVyID0gQkFEX1ZBTFVFOworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYmVnaW5Db25maWd1cmUoKQorICAgIHsKKyAgICAgICAgQUxPR1YoImJlZ2luQ29uZmlndXJlIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFEZXZpY2VVc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQkVHSU5fQ09ORklHVVJFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmRDb25maWd1cmUoKQorICAgIHsKKyAgICAgICAgQUxPR1YoImVuZENvbmZpZ3VyZSIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVORF9DT05GSUdVUkUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKQEAgLTE5NywxNCArMjg0LDI1IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikKICAgICB7CiAgICAgICAgIEFMT0dWKCJmbHVzaCIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZMVVNILCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIHN0YXR1c190IHJlc0ZyYW1lTnVtYmVyID0gQkFEX1ZBTFVFOworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogcHJpdmF0ZToKQEAgLTIzOSwxMSArMzM3LDQzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGFyZzEgPSBzdHJlYW1pbmcgKGJvb2wpCi0gICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBib29sIHJlcGVhdGluZyA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIC8vIHJldHVybiBjb2RlOiByZXF1ZXN0SWQgKGludDMyKQogICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgc3RyZWFtaW5nKSk7CisgICAgICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IC0xOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3VibWl0UmVxdWVzdChyZXF1ZXN0LCByZXBlYXRpbmcsICZsYXN0RnJhbWVOdW1iZXIpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQobGFzdEZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNVQk1JVF9SRVFVRVNUX0xJU1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RMaXN0OworICAgICAgICAgICAgaW50IHJlcXVlc3RMaXN0U2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3RMaXN0U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IG5ldyBDYXB0dXJlUmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC0+cmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkEgcmVxdWVzdCBpcyBtaXNzaW5nLiBTZW5kaW5nIGluIG51bGwgcmVxdWVzdC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgcmVwZWF0aW5nID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gLTE7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgcmVwZWF0aW5nLCAmbGFzdEZyYW1lTnVtYmVyKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGxhc3RGcmFtZU51bWJlcik7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTI1MSw3ICszODEsMTAgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY2FuY2VsUmVxdWVzdChyZXF1ZXN0SWQpKTsKKyAgICAgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gLTE7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjYW5jZWxSZXF1ZXN0KHJlcXVlc3RJZCwgJmxhc3RGcmFtZU51bWJlcikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIERFTEVURV9TVFJFQU06IHsKQEAgLTMzOSw5ICs0NzIsMjQgQEAKICAgICAgICAgY2FzZSBGTFVTSDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFEZXZpY2VVc2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmx1c2goKSk7CisgICAgICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IC0xOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmx1c2goJmxhc3RGcmFtZU51bWJlcikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CisgICAgICAgIGNhc2UgQkVHSU5fQ09ORklHVVJFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYURldmljZVVzZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihiZWdpbkNvbmZpZ3VyZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFTkRfQ09ORklHVVJFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYURldmljZVVzZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbmRDb25maWd1cmUoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggZWMxMzkxMS4uNjEzODVlNSAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTEsOSArMSwyNCBAQAorIyBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJbWFpbi5jcHAgXAogCVByb0NhbWVyYVRlc3RzLmNwcCBcCisJVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJ1dGlscyBcCkBAIC0yNiw2ICs0MSw4IEBACiAJZXh0ZXJuYWwvZ3Rlc3QvaW5jbHVkZSBcCiAJZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKIAlzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAorCXN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIFwKKwlzeXN0ZW0vbWVkaWEvY2FtZXJhL3Rlc3RzIFwKIAlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlIFwKIAlmcmFtZXdvcmtzL2F2L2luY2x1ZGUvY2FtZXJhIFwKIAlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9WZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL1ZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyNGU3OQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS90ZXN0cy9WZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzIgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX3Rlc3RzX2Zha2VfdmVuZG9yLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworZW51bSB7CisgICAgQkFEX1RBR19BUlJBWSA9IDB4REVBREJFRUZ1LAorICAgIEJBRF9UQUcgPSAweDhERUFEQkFEdSwKK307CisKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAgICAgIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKworc3RhdGljIGJvb2wgQ29udGFpbnNUYWcodWludDMyX3QqIHRhZ0FycmF5LCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgdGFnKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgaWYgKHRhZyA9PSB0YWdBcnJheVtpXSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworI2RlZmluZSBFWFBFQ1RfQ09OVEFJTlNfVEFHKHQsIGEpIFwKKyAgICBFWFBFQ1RfVFJVRShDb250YWluc1RhZyhhLCBBUlJBWV9TSVpFKGEpLCB0KSkKKworI2RlZmluZSBBU1NFUlRfTk9UX05VTEwoeCkgXAorICAgIEFTU0VSVF9UUlVFKCh4KSAhPSBOVUxMKQorCitleHRlcm4gIkMiIHsKKworc3RhdGljIGludCBkZWZhdWx0X2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcykgeworICAgIHJldHVybiBWRU5ET1JfVEFHX0NPVU5UX0VSUjsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdF9nZXRfYWxsX3RhZ3MoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QqIHRhZ0FycmF5KSB7CisgICAgLy9Ob29wCit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBkZWZhdWx0X2dldF9zZWN0aW9uX25hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QgdGFnKSB7CisgICAgcmV0dXJuIFZFTkRPUl9TRUNUSU9OX05BTUVfRVJSOworfQorCitzdGF0aWMgY29uc3QgY2hhciogZGVmYXVsdF9nZXRfdGFnX25hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QgdGFnKSB7CisgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9nZXRfdGFnX3R5cGUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QgdGFnKSB7CisgICAgcmV0dXJuIFZFTkRPUl9UQUdfVFlQRV9FUlI7Cit9CisKK30gLypleHRlcm4gIkMiKi8KKworLy8gU2V0IGRlZmF1bHQgdmVuZG9yIG9wZXJhdGlvbnMgZm9yIGEgdmVuZG9yX3RhZ19vcHMgc3RydWN0CitzdGF0aWMgdm9pZCBGaWxsV2l0aERlZmF1bHRzKHZlbmRvcl90YWdfb3BzX3QqIHZPcHMpIHsKKyAgICBBU1NFUlRfTk9UX05VTEwodk9wcyk7CisgICAgdk9wcy0+Z2V0X3RhZ19jb3VudCA9IGRlZmF1bHRfZ2V0X3RhZ19jb3VudDsKKyAgICB2T3BzLT5nZXRfYWxsX3RhZ3MgPSBkZWZhdWx0X2dldF9hbGxfdGFnczsKKyAgICB2T3BzLT5nZXRfc2VjdGlvbl9uYW1lID0gZGVmYXVsdF9nZXRfc2VjdGlvbl9uYW1lOworICAgIHZPcHMtPmdldF90YWdfbmFtZSA9IGRlZmF1bHRfZ2V0X3RhZ19uYW1lOworICAgIHZPcHMtPmdldF90YWdfdHlwZSA9IGRlZmF1bHRfZ2V0X3RhZ190eXBlOworfQorCisvKioKKyAqIFRlc3QgaWYgdmFsdWVzIGZyb20gVmVuZG9yVGFnRGVzY3JpcHRvciBtZXRob2RzIG1hdGNoIGNvcnJlc3BvbmRpbmcgdmFsdWVzCisgKiBmcm9tIHZlbmRvcl90YWdfb3BzIGZ1bmN0aW9ucy4KKyAqLworVEVTVChWZW5kb3JUYWdEZXNjcmlwdG9yVGVzdCwgQ29uc2lzdGVudFdpdGhWZW5kb3JUYWdzKSB7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gdkRlc2M7CisgICAgY29uc3QgdmVuZG9yX3RhZ19vcHNfdCAqdk9wcyA9ICZmYWtldmVuZG9yX29wczsKKyAgICBFWFBFQ1RfRVEoT0ssIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tT3BzKHZPcHMsIC8qb3V0Ki92RGVzYykpOworCisgICAgQVNTRVJUX05PVF9OVUxMKHZEZXNjKTsKKworICAgIC8vIEVuc3VyZSByZWFzb25hYmxlIHRhZyBjb3VudAorICAgIGludCB0YWdDb3VudCA9IHZEZXNjLT5nZXRUYWdDb3VudCgpOworICAgIEVYUEVDVF9FUSh0YWdDb3VudCwgdk9wcy0+Z2V0X3RhZ19jb3VudCh2T3BzKSk7CisKKyAgICB1aW50MzJfdCBkZXNjVGFnQXJyYXlbdGFnQ291bnRdOworICAgIHVpbnQzMl90IG9wc1RhZ0FycmF5W3RhZ0NvdW50XTsKKworICAgIC8vIEdldCBhbGwgdGFnIGlkcworICAgIHZEZXNjLT5nZXRUYWdBcnJheShkZXNjVGFnQXJyYXkpOworICAgIHZPcHMtPmdldF9hbGxfdGFncyh2T3BzLCBvcHNUYWdBcnJheSk7CisKKyAgICBBU1NFUlRfTk9UX05VTEwoZGVzY1RhZ0FycmF5KTsKKyAgICBBU1NFUlRfTk9UX05VTEwob3BzVGFnQXJyYXkpOworCisgICAgdWludDMyX3QgdGFnOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnQ291bnQ7ICsraSkgeworICAgICAgICAvLyBGb3IgZWFjaCB0YWcgaWQsIGNoZWNrIHdoZXRoZXIgdHlwZSwgc2VjdGlvbiBuYW1lLCB0YWcgbmFtZSBtYXRjaAorICAgICAgICB0YWcgPSBkZXNjVGFnQXJyYXlbaV07CisgICAgICAgIEVYUEVDVF9DT05UQUlOU19UQUcodGFnLCBvcHNUYWdBcnJheSk7CisgICAgICAgIEVYUEVDVF9FUSh2RGVzYy0+Z2V0VGFnVHlwZSh0YWcpLCB2T3BzLT5nZXRfdGFnX3R5cGUodk9wcywgdGFnKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUSh2RGVzYy0+Z2V0U2VjdGlvbk5hbWUodGFnKSwgdk9wcy0+Z2V0X3NlY3Rpb25fbmFtZSh2T3BzLCB0YWcpKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKHZEZXNjLT5nZXRUYWdOYW1lKHRhZyksIHZPcHMtPmdldF90YWdfbmFtZSh2T3BzLCB0YWcpKTsKKyAgICB9Cit9CisKKy8qKgorICogVGVzdCBpZiB2YWx1ZXMgZnJvbSBWZW5kb3JUYWdEZXNjcmlwdG9yIG1ldGhvZHMgc3RheSBjb25zaXN0ZW50IGFmdGVyIGJlaW5nCisgKiBwYXJjZWxsZWQvdW5wYXJjZWxsZWQuCisgKi8KK1RFU1QoVmVuZG9yVGFnRGVzY3JpcHRvclRlc3QsIENvbnNpc3RlbnRBY3Jvc3NQYXJjZWwpIHsKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiB2RGVzY09yaWdpbmFsLCB2RGVzY1BhcmNlbGVkOworICAgIGNvbnN0IHZlbmRvcl90YWdfb3BzX3QgKnZPcHMgPSAmZmFrZXZlbmRvcl9vcHM7CisgICAgRVhQRUNUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcyh2T3BzLCAvKm91dCovdkRlc2NPcmlnaW5hbCkpOworCisgICAgQVNTRVJUX1RSVUUodkRlc2NPcmlnaW5hbCAhPSBOVUxMKTsKKworICAgIFBhcmNlbCBwOworCisgICAgLy8gQ2hlY2sgd2hldGhlciBwYXJjZWwgcmVhZC93cml0ZSBzdWNjZWVkCisgICAgRVhQRUNUX0VRKE9LLCB2RGVzY09yaWdpbmFsLT53cml0ZVRvUGFyY2VsKCZwKSk7CisgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgQVNTRVJUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVGcm9tUGFyY2VsKCZwLCB2RGVzY1BhcmNlbGVkKSk7CisKKyAgICAvLyBFbnN1cmUgY29uc2lzdGVudCB0YWcgY291bnQKKyAgICBpbnQgdGFnQ291bnQgPSB2RGVzY09yaWdpbmFsLT5nZXRUYWdDb3VudCgpOworICAgIEFTU0VSVF9FUSh0YWdDb3VudCwgdkRlc2NQYXJjZWxlZC0+Z2V0VGFnQ291bnQoKSk7CisKKyAgICB1aW50MzJfdCBkZXNjVGFnQXJyYXlbdGFnQ291bnRdOworICAgIHVpbnQzMl90IGRlc2MyVGFnQXJyYXlbdGFnQ291bnRdOworCisgICAgLy8gR2V0IGFsbCB0YWcgaWRzCisgICAgdkRlc2NPcmlnaW5hbC0+Z2V0VGFnQXJyYXkoZGVzY1RhZ0FycmF5KTsKKyAgICB2RGVzY1BhcmNlbGVkLT5nZXRUYWdBcnJheShkZXNjMlRhZ0FycmF5KTsKKworICAgIEFTU0VSVF9OT1RfTlVMTChkZXNjVGFnQXJyYXkpOworICAgIEFTU0VSVF9OT1RfTlVMTChkZXNjMlRhZ0FycmF5KTsKKworICAgIHVpbnQzMl90IHRhZzsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ0NvdW50OyArK2kpIHsKKyAgICAgICAgLy8gRm9yIGVhY2ggdGFnIGlkLCBjaGVjayBjb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSB0d28gdmVuZG9yIHRhZworICAgICAgICAvLyBkZXNjcmlwdG9ycyBmb3IgZWFjaCB0eXBlLCBzZWN0aW9uIG5hbWUsIHRhZyBuYW1lCisgICAgICAgIHRhZyA9IGRlc2NUYWdBcnJheVtpXTsKKyAgICAgICAgRVhQRUNUX0NPTlRBSU5TX1RBRyh0YWcsIGRlc2MyVGFnQXJyYXkpOworICAgICAgICBFWFBFQ1RfRVEodkRlc2NPcmlnaW5hbC0+Z2V0VGFnVHlwZSh0YWcpLCB2RGVzY1BhcmNlbGVkLT5nZXRUYWdUeXBlKHRhZykpOworICAgICAgICBFWFBFQ1RfU1RSRVEodkRlc2NPcmlnaW5hbC0+Z2V0U2VjdGlvbk5hbWUodGFnKSwgdkRlc2NQYXJjZWxlZC0+Z2V0U2VjdGlvbk5hbWUodGFnKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUSh2RGVzY09yaWdpbmFsLT5nZXRUYWdOYW1lKHRhZyksIHZEZXNjUGFyY2VsZWQtPmdldFRhZ05hbWUodGFnKSk7CisgICAgfQorfQorCisvKioKKyAqIFRlc3QgZGVmYXVsdHMgYW5kIGVycm9yIGNvbmRpdGlvbnMuCisgKi8KK1RFU1QoVmVuZG9yVGFnRGVzY3JpcHRvclRlc3QsIEVycm9yQ29uZGl0aW9ucykgeworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZEZXNjOworICAgIHZlbmRvcl90YWdfb3BzX3Qgdk9wczsKKyAgICBGaWxsV2l0aERlZmF1bHRzKCZ2T3BzKTsKKworICAgIC8vIEVuc3VyZSBjcmVhdGUgZmFpbHMgd2hlbiB1c2luZyBudWxsIHZPcHMKKyAgICBFWFBFQ1RfRVEoQkFEX1ZBTFVFLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcygvKnZPcHMqL05VTEwsIHZEZXNjKSk7CisKKyAgICAvLyBFbnN1cmUgY3JlYXRlIHdvcmtzIHdoZW4gdGhlcmUgYXJlIG5vIHZ0YWdzIGRlZmluZWQgaW4gYSB3ZWxsLWZvcm1lZCB2T3BzCisgICAgQVNTRVJUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcygmdk9wcywgdkRlc2MpKTsKKworICAgIC8vIEVuc3VyZSBkZWZhdWx0cyBhcmUgcmV0dXJuZWQgd2hlbiBubyB2dGFncyBhcmUgZGVmaW5lZCwgb3IgdGFnIGlzIHVua25vd24KKyAgICBFWFBFQ1RfRVEoVkVORE9SX1RBR19DT1VOVF9FUlIsIHZEZXNjLT5nZXRUYWdDb3VudCgpKTsKKyAgICB1aW50MzJfdCogdGFnQXJyYXkgPSByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oQkFEX1RBR19BUlJBWSk7CisgICAgdWludDMyX3QqIHRlc3RBcnJheSA9IHRhZ0FycmF5OworICAgIHZEZXNjLT5nZXRUYWdBcnJheSh0YWdBcnJheSk7CisgICAgRVhQRUNUX0VRKHRlc3RBcnJheSwgdGFnQXJyYXkpOworICAgIEVYUEVDVF9FUShWRU5ET1JfU0VDVElPTl9OQU1FX0VSUiwgdkRlc2MtPmdldFNlY3Rpb25OYW1lKEJBRF9UQUcpKTsKKyAgICBFWFBFQ1RfRVEoVkVORE9SX1RBR19OQU1FX0VSUiwgdkRlc2MtPmdldFRhZ05hbWUoQkFEX1RBRykpOworICAgIEVYUEVDVF9FUShWRU5ET1JfVEFHX1RZUEVfRVJSLCB2RGVzYy0+Z2V0VGFnVHlwZShCQURfVEFHKSk7CisKKyAgICAvLyBNYWtlIHN1cmUgZ2xvYmFsIGNhbiBiZSBzZXQvY2xlYXJlZAorICAgIGNvbnN0IHZlbmRvcl90YWdfb3BzX3QgKmZha2VPcHMgPSAmZmFrZXZlbmRvcl9vcHM7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gcHJldkdsb2JhbCA9IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKworICAgIEVYUEVDVF9UUlVFKFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKSA9PSBOVUxMKTsKKyAgICBFWFBFQ1RfRVEoT0ssIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OnNldEFzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcih2RGVzYykpOworICAgIEVYUEVDVF9UUlVFKFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKSAhPSBOVUxMKTsKKyAgICBFWFBFQ1RfRVEoVkVORE9SX1NFQ1RJT05fTkFNRV9FUlIsIHZEZXNjLT5nZXRTZWN0aW9uTmFtZShCQURfVEFHKSk7CisgICAgRVhQRUNUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpzZXRBc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IocHJldkdsb2JhbCkpOworICAgIEVYUEVDVF9FUShwcmV2R2xvYmFsLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCkpOworfQorCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5jcHAKaW5kZXggNmMzNzUwMS4uMDNlMDA2MiAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvRnJhbWVPdXRwdXQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL0ZyYW1lT3V0cHV0LmNwcApAQCAtNjcsOSArNjcsMTEgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgbUJ1ZmZlclF1ZXVlID0gbmV3IEJ1ZmZlclF1ZXVlKC8qbmV3IEdyYXBoaWNCdWZmZXJBbGxvYygpKi8pOwotICAgIG1HbENvbnN1bWVyID0gbmV3IEdMQ29uc3VtZXIobUJ1ZmZlclF1ZXVlLCBtRXh0VGV4dHVyZU5hbWUsCi0gICAgICAgICAgICAgICAgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbUdsQ29uc3VtZXIgPSBuZXcgR0xDb25zdW1lcihjb25zdW1lciwgbUV4dFRleHR1cmVOYW1lLAorICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCB0cnVlLCBmYWxzZSk7CiAgICAgbUdsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgidmlydHVhbCBkaXNwbGF5IikpOwogICAgIG1HbENvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICBtR2xDb25zdW1lci0+c2V0RGVmYXVsdE1heEJ1ZmZlckNvdW50KDUpOwpAQCAtNzksNyArODEsNyBAQAogCiAgICAgbVBpeGVsQnVmID0gbmV3IHVpbnQ4X3Rbd2lkdGggKiBoZWlnaHQgKiBrR2xCeXRlc1BlclBpeGVsXTsKIAotICAgICpwQnVmZmVyUHJvZHVjZXIgPSBtQnVmZmVyUXVldWU7CisgICAgKnBCdWZmZXJQcm9kdWNlciA9IHByb2R1Y2VyOwogCiAgICAgQUxPR0QoIkZyYW1lT3V0cHV0OjpjcmVhdGVJbnB1dFN1cmZhY2UgT0siKTsKICAgICByZXR1cm4gTk9fRVJST1I7CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5oIGIvY21kcy9zY3JlZW5yZWNvcmQvRnJhbWVPdXRwdXQuaAppbmRleCA0YWMzZThhLi5jNDllYzNiIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5oCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL0ZyYW1lT3V0cHV0LmgKQEAgLTM0LDkgKzM0LDYgQEAKICAgICAgICAgbUV4dFRleHR1cmVOYW1lKDApLAogICAgICAgICBtUGl4ZWxCdWYoTlVMTCkKICAgICAgICAge30KLSAgICB2aXJ0dWFsIH5GcmFtZU91dHB1dCgpIHsKLSAgICAgICAgZGVsZXRlW10gbVBpeGVsQnVmOwotICAgIH0KIAogICAgIC8vIENyZWF0ZSBhbiAiaW5wdXQgc3VyZmFjZSIsIHNpbWlsYXIgaW4gcHVycG9zZSB0byBhIE1lZGlhQ29kZWMgaW5wdXQKICAgICAvLyBzdXJmYWNlLCB0aGF0IHRoZSB2aXJ0dWFsIGRpc3BsYXkgY2FuIHNlbmQgYnVmZmVycyB0by4gIEFsc28gY29uZmlndXJlcwpAQCAtNTksNiArNTYsMTEgQEAKICAgICBGcmFtZU91dHB1dChjb25zdCBGcmFtZU91dHB1dCYpOwogICAgIEZyYW1lT3V0cHV0JiBvcGVyYXRvcj0oY29uc3QgRnJhbWVPdXRwdXQmKTsKIAorICAgIC8vIERlc3RydWN0aW9uIHZpYSBSZWZCYXNlLgorICAgIHZpcnR1YWwgfkZyYW1lT3V0cHV0KCkgeworICAgICAgICBkZWxldGVbXSBtUGl4ZWxCdWY7CisgICAgfQorCiAgICAgLy8gKG92ZXJyaWRlcyBHTENvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIG1ldGhvZCkKICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpOwogCkBAIC03NSwxMCArNzcsNiBAQAogICAgIC8vIFNldCBieSB0aGUgRnJhbWVBdmFpbGFibGVMaXN0ZW5lciBjYWxsYmFjay4KICAgICBib29sIG1GcmFtZUF2YWlsYWJsZTsKIAotICAgIC8vIE91ciBxdWV1ZS4gIFRoZSBwcm9kdWNlciBzaWRlIGlzIHBhc3NlZCB0byB0aGUgdmlydHVhbCBkaXNwbGF5LCB0aGUKLSAgICAvLyBjb25zdW1lciBzaWRlIGZlZWRzIGludG8gb3VyIEdMQ29uc3VtZXIuCi0gICAgc3A8QnVmZmVyUXVldWU+IG1CdWZmZXJRdWV1ZTsKLQogICAgIC8vIFRoaXMgcmVjZWl2ZXMgZnJhbWVzIGZyb20gdGhlIHZpcnR1YWwgZGlzcGxheSBhbmQgbWFrZXMgdGhlbSBhdmFpbGFibGUKICAgICAvLyBhcyBhbiBleHRlcm5hbCB0ZXh0dXJlLgogICAgIHNwPEdMQ29uc3VtZXI+IG1HbENvbnN1bWVyOwpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvT3ZlcmxheS5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcAppbmRleCA5NmUyNWI4Li43ZmVmNTNkIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCiAjZGVmaW5lIExPR19UQUcgIlNjcmVlblJlY29yZCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI3LDkgKzMxLDYgQEAKICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KIAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCiAjaW5jbHVkZSAic2NyZWVucmVjb3JkLmgiCiAjaW5jbHVkZSAiT3ZlcmxheS5oIgogI2luY2x1ZGUgIlRleHRSZW5kZXJlci5oIgpAQCAtNDcsNyArNDgsNyBAQAogICAgICAgICAicm8ucmV2aXNpb24iLAogICAgICAgICAiZGFsdmlrLnZtLmhlYXBncm93dGhsaW1pdCIsCiAgICAgICAgICJkYWx2aWsudm0uaGVhcHNpemUiLAotICAgICAgICAicGVyc2lzdC5zeXMuZGFsdmlrLnZtLmxpYiIsCisgICAgICAgICJwZXJzaXN0LnN5cy5kYWx2aWsudm0ubGliLjIiLAogICAgICAgICAvLyJyby5wcm9kdWN0LmNwdS5hYmkiLAogICAgICAgICAvLyJyby5ib290bG9hZGVyIiwKICAgICAgICAgLy8idGhpcy1uZXZlci1hcHBlYXJzISIsCkBAIC04NCw3ICs4NSw3IEBACiAgICAgYXNzZXJ0KG1TdGF0ZSA9PSBSVU5OSU5HKTsKIAogICAgIEFMT0dWKCJPdmVybGF5OjpzdGFydCBzdWNjZXNzZnVsIik7Ci0gICAgKnBCdWZmZXJQcm9kdWNlciA9IG1CdWZmZXJRdWV1ZTsKKyAgICAqcEJ1ZmZlclByb2R1Y2VyID0gbVByb2R1Y2VyOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMTY5LDkgKzE3MCwxMCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBtQnVmZmVyUXVldWUgPSBuZXcgQnVmZmVyUXVldWUoLypuZXcgR3JhcGhpY0J1ZmZlckFsbG9jKCkqLyk7Ci0gICAgbUdsQ29uc3VtZXIgPSBuZXcgR0xDb25zdW1lcihtQnVmZmVyUXVldWUsIG1FeHRUZXh0dXJlTmFtZSwKLSAgICAgICAgICAgICAgICBHTF9URVhUVVJFX0VYVEVSTkFMX09FUyk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbUdsQ29uc3VtZXIgPSBuZXcgR0xDb25zdW1lcihjb25zdW1lciwgbUV4dFRleHR1cmVOYW1lLAorICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCB0cnVlLCBmYWxzZSk7CiAgICAgbUdsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgidmlydHVhbCBkaXNwbGF5IikpOwogICAgIG1HbENvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICBtR2xDb25zdW1lci0+c2V0RGVmYXVsdE1heEJ1ZmZlckNvdW50KDUpOwpAQCAtMTg3LDcgKzE4OSw3IEBACiAgICAgQUxPR1YoIk92ZXJsYXk6OnJlbGVhc2VfbCIpOwogICAgIG1PdXRwdXRTdXJmYWNlLmNsZWFyKCk7CiAgICAgbUdsQ29uc3VtZXIuY2xlYXIoKTsKLSAgICBtQnVmZmVyUXVldWUuY2xlYXIoKTsKKyAgICBtUHJvZHVjZXIuY2xlYXIoKTsKIAogICAgIG1UZXhQcm9ncmFtLnJlbGVhc2UoKTsKICAgICBtRXh0VGV4UHJvZ3JhbS5yZWxlYXNlKCk7CkBAIC0yMzQsNyArMjM2LDcgQEAKIAogICAgIGNoYXIgdGV4dEJ1Zls2NF07CiAgICAgZ2V0VGltZVN0cmluZ19sKG1vbm90b25pY05zZWMsIHRleHRCdWYsIHNpemVvZih0ZXh0QnVmKSk7Ci0gICAgU3RyaW5nOCB0aW1lU3RyKFN0cmluZzg6OmZvcm1hdCgiJXMgZj0lbGxkICglemQpIiwKKyAgICBTdHJpbmc4IHRpbWVTdHIoU3RyaW5nODo6Zm9ybWF0KCIlcyBmPSUiIFBSSWQ2NCAiICglemQpIiwKICAgICAgICAgICAgIHRleHRCdWYsIGZyYW1lTnVtYmVyLCBtVG90YWxEcm9wcGVkRnJhbWVzKSk7CiAgICAgbVRleHRSZW5kZXJlci5kcmF3U3RyaW5nKG1UZXhQcm9ncmFtLCBQcm9ncmFtOjprSWRlbnRpdHksIDAsIDAsIHRpbWVTdHIpOwogCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmggYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmgKaW5kZXggYjg0NzNiNC4uYjFiNWMyOSAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvT3ZlcmxheS5oCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL092ZXJsYXkuaApAQCAtNDcsNyArNDcsNiBAQAogICAgICAgICBtTGFzdEZyYW1lTnVtYmVyKC0xKSwKICAgICAgICAgbVRvdGFsRHJvcHBlZEZyYW1lcygwKQogICAgICAgICB7fQotICAgIHZpcnR1YWwgfk92ZXJsYXkoKSB7IGFzc2VydChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gU1RPUFBFRCk7IH0KIAogICAgIC8vIENyZWF0ZXMgYSB0aHJlYWQgdGhhdCBwZXJmb3JtcyB0aGUgb3ZlcmxheS4gIFBhc3MgaW4gdGhlIHN1cmZhY2UgdGhhdAogICAgIC8vIG91dHB1dCB3aWxsIGJlIHNlbnQgdG8uCkBAIC03MSw2ICs3MCw5IEBACiAgICAgT3ZlcmxheShjb25zdCBPdmVybGF5Jik7CiAgICAgT3ZlcmxheSYgb3BlcmF0b3I9KGNvbnN0IE92ZXJsYXkmKTsKIAorICAgIC8vIERlc3RydWN0aW9uIHZpYSBSZWZCYXNlLgorICAgIHZpcnR1YWwgfk92ZXJsYXkoKSB7IGFzc2VydChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gU1RPUFBFRCk7IH0KKwogICAgIC8vIERyYXcgdGhlIGluaXRpYWwgaW5mbyBzY3JlZW4uCiAgICAgc3RhdGljIHZvaWQgZG9EcmF3SW5mb1BhZ2UoY29uc3QgRWdsV2luZG93JiB3aW5kb3csCiAgICAgICAgICAgICBjb25zdCBQcm9ncmFtJiB0ZXhSZW5kZXIsIFRleHRSZW5kZXJlciYgdGV4dFJlbmRlcmVyKTsKQEAgLTEyMCw5ICsxMjIsOSBAQAogICAgIC8vIHN1cmZhY2UuCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbU91dHB1dFN1cmZhY2U7CiAKLSAgICAvLyBPdXIgcXVldWUuICBUaGUgcHJvZHVjZXIgc2lkZSBpcyBwYXNzZWQgdG8gdGhlIHZpcnR1YWwgZGlzcGxheSwgdGhlCi0gICAgLy8gY29uc3VtZXIgc2lkZSBmZWVkcyBpbnRvIG91ciBHTENvbnN1bWVyLgotICAgIHNwPEJ1ZmZlclF1ZXVlPiBtQnVmZmVyUXVldWU7CisgICAgLy8gUHJvZHVjZXIgc2lkZSBvZiBxdWV1ZSwgcGFzc2VkIGludG8gdGhlIHZpcnR1YWwgZGlzcGxheS4KKyAgICAvLyBUaGUgY29uc3VtZXIgZW5kIGZlZWRzIGludG8gb3VyIEdMQ29uc3VtZXIuCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOwogCiAgICAgLy8gVGhpcyByZWNlaXZlcyBmcmFtZXMgZnJvbSB0aGUgdmlydHVhbCBkaXNwbGF5IGFuZCBtYWtlcyB0aGVtIGF2YWlsYWJsZQogICAgIC8vIGFzIGFuIGV4dGVybmFsIHRleHR1cmUuCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9UZXh0UmVuZGVyZXIuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvVGV4dFJlbmRlcmVyLmNwcAppbmRleCA3ODQwNTVjLi42YTkxNzZiIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9UZXh0UmVuZGVyZXIuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL1RleHRSZW5kZXJlci5jcHAKQEAgLTM1Myw2ICszNTMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoImdvb2RQb3M9JWQgZm9yIHN0cj0nJXMnIiwgZ29vZFBvcywgc3RyKTsKKyAgICBBTE9HVigiZ29vZFBvcz0lenUgZm9yIHN0cj0nJXMnIiwgZ29vZFBvcywgc3RyKTsKICAgICByZXR1cm4gY29uc3RfY2FzdDxjaGFyKj4oc3RyICsgZ29vZFBvcyk7CiB9CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAppbmRleCAwMmVkNTNhLi4wMmRmMWQyIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKQEAgLTE0LDYgKzE0LDE5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwogI2RlZmluZSBMT0dfVEFHICJTY3JlZW5SZWNvcmQiCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUwogLy8jZGVmaW5lIExPR19OREVCVUcgMApAQCAtMzYsMTggKzQ5LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KICNpbmNsdWRlICJzY3JlZW5yZWNvcmQuaCIKICNpbmNsdWRlICJPdmVybGF5LmgiCiAjaW5jbHVkZSAiRnJhbWVPdXRwdXQuaCIKQEAgLTM1NCw3ICszNTUsNyBAQAogICAgICAgICBjYXNlIE5PX0VSUk9SOgogICAgICAgICAgICAgLy8gZ290IGEgYnVmZmVyCiAgICAgICAgICAgICBpZiAoKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiR290IGNvZGVjIGNvbmZpZyBidWZmZXIgKCV1IGJ5dGVzKSIsIHNpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJHb3QgY29kZWMgY29uZmlnIGJ1ZmZlciAoJXp1IGJ5dGVzKSIsIHNpemUpOwogICAgICAgICAgICAgICAgIGlmIChtdXhlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIC0tIHdlIHBhc3NlZCB0aGUgQ1NEIGludG8gTWVkaWFNdXhlciB3aGVuCiAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGdvdCB0aGUgZm9ybWF0IGNoYW5nZSBub3RpZmljYXRpb24KQEAgLTM2Miw3ICszNjMsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiR290IGRhdGEgaW4gYnVmZmVyICVkLCBzaXplPSVkLCBwdHM9JWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBkYXRhIGluIGJ1ZmZlciAlenUsIHNpemU9JXp1LCBwdHM9JSIgUFJJZDY0LAogICAgICAgICAgICAgICAgICAgICAgICAgYnVmSW5kZXgsIHNpemUsIHB0c1VzZWMpOwogCiAgICAgICAgICAgICAgICAgeyAvLyBzY29wZQpAQCAtNDczLDcgKzQ3NCw3IEBACiAKICAgICBBTE9HVigiRW5jb2RlciBzdG9wcGluZyAocmVxPSVkKSIsIGdTdG9wUmVxdWVzdGVkKTsKICAgICBpZiAoZ1ZlcmJvc2UpIHsKLSAgICAgICAgcHJpbnRmKCJFbmNvZGVyIHN0b3BwaW5nOyByZWNvcmRlZCAldSBmcmFtZXMgaW4gJWxsZCBzZWNvbmRzXG4iLAorICAgICAgICBwcmludGYoIkVuY29kZXIgc3RvcHBpbmc7IHJlY29yZGVkICV1IGZyYW1lcyBpbiAlIiBQUklkNjQgIiBzZWNvbmRzXG4iLAogICAgICAgICAgICAgICAgIGRlYnVnTnVtRnJhbWVzLCBuYW5vc2Vjb25kc190b19zZWNvbmRzKAogICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtVGltZShDTE9DS19NT05PVE9OSUMpIC0gc3RhcnRXaGVuTnNlYykpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcAppbmRleCA1ZDJkNzIxLi4xYjJmNzkyIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0yNzUsNyArMjc2LDggQEAKIAogICAgIG1FeHRyYWN0b3IgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcjsKIAotICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobVBhdGguY19zdHIoKSk7CisgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIG1QYXRoLmNfc3RyKCkpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBtRXh0cmFjdG9yLmNsZWFyKCk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9TaW5lU291cmNlLmNwcAppbmRleCAxNGI0MzA2Li41ODcwNzdhIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvU2luZVNvdXJjZS5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFNpbmVTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IFNpbmVTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwpAQCAtNTgsNyArNTgsNyBAQAogfQogCiBzdGF0dXNfdCBTaW5lU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcAppbmRleCBlZDdkNmNiLi45NjA3M2YxIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCkBAIC0xLDQgKzEsMTggQEAKLSNpbmNsdWRlICJTaW5lU291cmNlLmgiCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CkBAIC0xMCw0MSArMjQsNzkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlICJTaW5lU291cmNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1pbnQgbWFpbigpIHsKLSAgICAvLyBXZSBvbmx5IGhhdmUgYW4gQU1SLVdCIGVuY29kZXIgb24gc2hvbGVzLi4uCi0gICAgc3RhdGljIGJvb2wgb3V0cHV0V0JBTVIgPSBmYWxzZTsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxlUmF0ZSA9IG91dHB1dFdCQU1SID8gMTYwMDAgOiA4MDAwOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1DaGFubmVscyA9IDE7CitzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyKiBuYW1lKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZCBkdXJhdGlvbl0gWy1tXSBbLXddIFs8b3V0cHV0LWZpbGU+XVxuIiwgbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJFbmNvZGVzIGVpdGhlciBhIHNpbmUgd2F2ZSBvciBtaWNyb3Bob25lIGlucHV0IHRvIEFNUiBmb3JtYXRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1kICAgIGR1cmF0aW9uIGluIHNlY29uZHMsIGRlZmF1bHQgNSBzZWNvbmRzXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtbSAgICB1c2UgbWljcm9waG9uZSBmb3IgaW5wdXQsIGRlZmF1bHQgc2luZSBzb3VyY2VcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC13ICAgIHVzZSBBTVIgd2lkZWJhbmQgKGRlZmF1bHQgbmFycm93YmFuZClcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIDxvdXRwdXQtZmlsZT4gb3V0cHV0IGZpbGUgZm9yIEFNUiBlbmNvZGluZywiCisgICAgICAgICAgICAiIGlmIHVuc3BlY2lmaWVkLCBkZWNvZGUgdG8gc3BlYWtlci5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworICAgIHN0YXRpYyBjb25zdCBpbnQgY2hhbm5lbHMgPSAxOyAvLyBub3QgcGVybWl0dGVkIHRvIGJlIHN0ZXJlbyBub3cKKyAgICB1bnNpZ25lZCBkdXJhdGlvbiA9IDU7CisgICAgYm9vbCB1c2VNaWMgPSBmYWxzZTsKKyAgICBib29sIG91dHB1dFdCQU1SID0gZmFsc2U7CisgICAgYm9vbCBwbGF5VG9TcGVha2VyID0gdHJ1ZTsKKyAgICBjb25zdCBjaGFyKiBmaWxlT3V0ID0gTlVMTDsKKyAgICBpbnQgY2g7CisgICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZDptdyIpKSAhPSAtMSkgeworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgZHVyYXRpb24gPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICB1c2VNaWMgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgICAgb3V0cHV0V0JBTVIgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhcmdjIC09IG9wdGluZDsKKyAgICBhcmd2ICs9IG9wdGluZDsKKyAgICBpZiAoYXJnYyA9PSAxKSB7CisgICAgICAgIGZpbGVPdXQgPSBhcmd2WzBdOworICAgIH0KKyAgICBjb25zdCBpbnQzMl90IGtTYW1wbGVSYXRlID0gb3V0cHV0V0JBTVIgPyAxNjAwMCA6IDgwMDA7CisgICAgY29uc3QgaW50MzJfdCBrQml0UmF0ZSA9IG91dHB1dFdCQU1SID8gMTYwMDAgOiA4MDAwOwogCiAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotCiAgICAgT01YQ2xpZW50IGNsaWVudDsKICAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCAoc3RhdHVzX3QpT0spOworICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2U7CiAKLSNpZiAwCi0gICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG5ldyBTaW5lU291cmNlKGtTYW1wbGVSYXRlLCBrTnVtQ2hhbm5lbHMpOwotI2Vsc2UKLSAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gbmV3IEF1ZGlvU291cmNlKAotICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsCi0gICAgICAgICAgICBrU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGtOdW1DaGFubmVscykpOwotI2VuZGlmCisgICAgaWYgKHVzZU1pYykgeworICAgICAgICAvLyB0YWxrIGludG8gdGhlIGFwcHJvcHJpYXRlIG1pY3JvcGhvbmUgZm9yIHRoZSBkdXJhdGlvbgorICAgICAgICBzb3VyY2UgPSBuZXcgQXVkaW9Tb3VyY2UoCisgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICAgICAgICAgICAgICBrU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBjaGFubmVscyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gdXNlIGEgc2luZSBzb3VyY2UgYXQgNTAwIGh6LgorICAgICAgICBzb3VyY2UgPSBuZXcgU2luZVNvdXJjZShrU2FtcGxlUmF0ZSwgY2hhbm5lbHMpOworICAgIH0KIAogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotCiAgICAgbWV0YS0+c2V0Q1N0cmluZygKICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwKICAgICAgICAgICAgIG91dHB1dFdCQU1SID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCi0gICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CisgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKIAotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGtOdW1DaGFubmVscyk7CisgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbHMpOwogICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrU2FtcGxlUmF0ZSk7Ci0KKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwga0JpdFJhdGUpOwogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwogICAgIGlmIChzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJm1heElucHV0U2l6ZSkpIHsKICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4SW5wdXRTaXplKTsKQEAgLTU1LDQ3ICsxMDcsNDEgQEAKICAgICAgICAgICAgIG1ldGEsIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywKICAgICAgICAgICAgIHNvdXJjZSk7CiAKLSNpZiAxCi0gICAgc3A8QU1SV3JpdGVyPiB3cml0ZXIgPSBuZXcgQU1SV3JpdGVyKCIvc2RjYXJkL291dC5hbXIiKTsKLSAgICB3cml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKLSAgICB3cml0ZXItPnN0YXJ0KCk7Ci0gICAgc2xlZXAoMTApOwotICAgIHdyaXRlci0+c3RvcCgpOwotI2Vsc2UKLSAgICBzcDxNZWRpYVNvdXJjZT4gZGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgICAgICBtZXRhLCBmYWxzZSAvKiBjcmVhdGVFbmNvZGVyICovLAotICAgICAgICAgICAgZW5jb2Rlcik7CisgICAgaWYgKGZpbGVPdXQgIT0gTlVMTCkgeworICAgICAgICAvLyB0YXJnZXQgZmlsZSBzcGVjaWZpZWQsIHdyaXRlIGVuY29kZWQgQU1SIG91dHB1dAorICAgICAgICBzcDxBTVJXcml0ZXI+IHdyaXRlciA9IG5ldyBBTVJXcml0ZXIoZmlsZU91dCk7CisgICAgICAgIHdyaXRlci0+YWRkU291cmNlKGVuY29kZXIpOworICAgICAgICB3cml0ZXItPnN0YXJ0KCk7CisgICAgICAgIHNsZWVwKGR1cmF0aW9uKTsKKyAgICAgICAgd3JpdGVyLT5zdG9wKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb3RoZXJ3aXNlIGRlY29kZSB0byBzcGVha2VyCisgICAgICAgIHNwPE1lZGlhU291cmNlPiBkZWNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksCisgICAgICAgICAgICAgICAgbWV0YSwgZmFsc2UgLyogY3JlYXRlRW5jb2RlciAqLywKKyAgICAgICAgICAgICAgICBlbmNvZGVyKTsKIAotI2lmIDAKLSAgICBBdWRpb1BsYXllciAqcGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKE5VTEwpOwotICAgIHBsYXllci0+c2V0U291cmNlKGRlY29kZXIpOwotCi0gICAgcGxheWVyLT5zdGFydCgpOwotCi0gICAgc2xlZXAoMTApOwotCi0gICAgcGxheWVyLT5zdG9wKCk7Ci0KLSAgICBkZWxldGUgcGxheWVyOwotICAgIHBsYXllciA9IE5VTEw7Ci0jZWxpZiAwCi0gICAgQ0hFQ0tfRVEoZGVjb2Rlci0+c3RhcnQoKSwgKHN0YXR1c190KU9LKTsKLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgd2hpbGUgKGRlY29kZXItPnJlYWQoJmJ1ZmZlcikgPT0gT0spIHsKLSAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggYnVmZmVyCi0KLSAgICAgICAgcHV0Y2hhcignLicpOwotICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgaWYgKHBsYXlUb1NwZWFrZXIpIHsKKyAgICAgICAgICAgIEF1ZGlvUGxheWVyICpwbGF5ZXIgPSBuZXcgQXVkaW9QbGF5ZXIoTlVMTCk7CisgICAgICAgICAgICBwbGF5ZXItPnNldFNvdXJjZShkZWNvZGVyKTsKKyAgICAgICAgICAgIHBsYXllci0+c3RhcnQoKTsKKyAgICAgICAgICAgIHNsZWVwKGR1cmF0aW9uKTsKKyAgICAgICAgICAgIHNvdXJjZS0+c3RvcCgpOyAvLyBtdXN0IHN0b3Agc291cmNlIG90aGVyd2lzZSBkZWxldGUgcGxheWVyIHdpbGwgaGFuZworICAgICAgICAgICAgZGVsZXRlIHBsYXllcjsgLy8gdGhlcmUgaXMgbm8gcGxheWVyLT5zdG9wKCkuLi4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLX0VRKGRlY29kZXItPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyOworICAgICAgICAgICAgd2hpbGUgKGRlY29kZXItPnJlYWQoJmJ1ZmZlcikgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCBidWZmZXIgKHNhdmUgaXQgZXZlbnR1YWxseT8pCisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzdG9wIGFmdGVyIHNvbWUgY291bnQgdGhvdWdoLi4uCisgICAgICAgICAgICAgICAgcHV0Y2hhcignLicpOworICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19FUShkZWNvZGVyLT5zdG9wKCksIChzdGF0dXNfdClPSyk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBDSEVDS19FUShkZWNvZGVyLT5zdG9wKCksIChzdGF0dXNfdClPSyk7Ci0jZW5kaWYKLSNlbmRpZgotCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCmluZGV4IGZkZmVmZGYuLmZkMDJiY2MgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiY29kZWMiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIlNpbXBsZVBsYXllci5oIgpAQCAtMjMsNiArMjQsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC03NSw3ICs3Nyw3IEBACiAgICAgc3RhdGljIGludDY0X3Qga1RpbWVvdXQgPSA1MDBsbDsKIAogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwotICAgIGlmIChleHRyYWN0b3ItPnNldERhdGFTb3VyY2UocGF0aCkgIT0gT0spIHsKKyAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci5cbiIpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CkBAIC0yOTEsMTMgKzI5MywxMyBAQAogICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIHN0YXRlLT5tQ29kZWMtPnJlbGVhc2UoKSk7CiAKICAgICAgICAgaWYgKHN0YXRlLT5tSXNBdWRpbykgewotICAgICAgICAgICAgcHJpbnRmKCJ0cmFjayAlZDogJWxsZCBieXRlcyByZWNlaXZlZC4gJS4yZiBLQi9zZWNcbiIsCisgICAgICAgICAgICBwcmludGYoInRyYWNrICV6dTogJSIgUFJJZDY0ICIgYnl0ZXMgcmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAogICAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQsCiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQgKiAxRTYgLyAxMDI0IC8gZWxhcHNlZFRpbWVVcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludGYoInRyYWNrICVkOiAlbGxkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJWxsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgInJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKKyAgICAgICAgICAgIHByaW50ZigidHJhY2sgJXp1OiAlIiBQUklkNjQgIiBmcmFtZXMgZGVjb2RlZCwgJS4yZiBmcHMuICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIHJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKICAgICAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tTnVtQnVmZmVyc0RlY29kZWQsCiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CdWZmZXJzRGVjb2RlZCAqIDFFNiAvIGVsYXBzZWRUaW1lVXMsCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L211eGVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCmluZGV4IGNjYTMzZTAuLmY0YTMzZTggMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCkBAIC0xNiw5ICsxNiwxMSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIm11eGVyIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgpAQCAtNTgsNyArNjAsNyBAQAogICAgICAgICBpbnQgdHJpbUVuZFRpbWVNcywKICAgICAgICAgaW50IHJvdGF0aW9uRGVncmVlcykgewogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwotICAgIGlmIChleHRyYWN0b3ItPnNldERhdGFTb3VyY2UocGF0aCkgIT0gT0spIHsKKyAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci4gJXNcbiIsIHBhdGgpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CkBAIC0xOTgsNyArMjAwLDcgQEAKICAgICB0cmFja0luZGV4TWFwLmNsZWFyKCk7CiAKICAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gbXV4ZXJTdGFydFRpbWVVczsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlNVQ0NFU1M6IG11eGVyIGdlbmVyYXRlIHRoZSB2aWRlbyBpbiAlbGxkIG1zXG4iLAorICAgIGZwcmludGYoc3RkZXJyLCAiU1VDQ0VTUzogbXV4ZXIgZ2VuZXJhdGUgdGhlIHZpZGVvIGluICUiIFBSSWQ2NCAiIG1zXG4iLAogICAgICAgICAgICAgZWxhcHNlZFRpbWVVcyAvIDEwMDApOwogCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKaW5kZXggYjdhNDBjMi4uZmRjMzUyZSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcApAQCAtMjk2LDcgKzI5Niw3IEBACiB9CiAjZWxzZQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKK2ludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyICoqIC8qIGFyZ3YgKi8pIHsKICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAKICAgICBPTVhDbGllbnQgY2xpZW50OwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcAppbmRleCBjMzBjMTIyLi45ZjU0N2M3IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcApAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSAiU2luZVNvdXJjZS5oIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgpAQCAtNzIsNyArNzMsNyBAQAogICAgICAgICByZXR1cm4gbWV0YTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgX191bnVzZWQpIHsKICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC04Miw3ICs4Myw3IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyBfX3VudXNlZCkgewogCiAgICAgICAgIGlmIChtTnVtRnJhbWVzT3V0cHV0ICUgMTAgPT0gMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIuIik7CkBAIC05OSw4ICsxMDAsMTIgQEAKICAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgY29udGVudHMuIHdlIGp1c3QgdGVzdCB2aWRlbyBlbmNvZGVyCiAgICAgICAgIC8vIEFsc28sIGJ5IHNraXBwaW5nIHRoZSBjb250ZW50IGdlbmVyYXRpb24sIHdlIGNhbiByZXR1cm4gZnJvbQogICAgICAgICAvLyByZWFkKCkgbXVjaCBmYXN0ZXIuCi0gICAgICAgIC8vY2hhciB4ID0gKGNoYXIpKChkb3VibGUpcmFuZCgpIC8gUkFORF9NQVggKiAyNTUpOwotICAgICAgICAvL21lbXNldCgoKmJ1ZmZlciktPmRhdGEoKSwgeCwgbVNpemUpOworI2lmIDAKKyAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHNvbGlkIHBsYW5lcyBvZiBjb2xvci4KKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgeCA9IDB4NjA7CisgICAgICAgIG1lbXNldCgoKmJ1ZmZlciktPmRhdGEoKSwgeCwgbVNpemUpOworICAgICAgICB4ID0geCA+PSAweGEwID8gMHg2MCA6IHggKyAxOworI2VuZGlmCiAgICAgICAgICgqYnVmZmVyKS0+c2V0X3JhbmdlKDAsIG1TaXplKTsKICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCkBAIC0xNjIsNyArMTY3LDcgQEAKICAgICBpbnQgbGV2ZWwgPSAtMTsgICAgICAgIC8vIEVuY29kZXIgc3BlY2lmaWMgZGVmYXVsdAogICAgIGludCBwcm9maWxlID0gLTE7ICAgICAgLy8gRW5jb2RlciBzcGVjaWZpYyBkZWZhdWx0CiAgICAgaW50IGNvZGVjID0gMDsKLSAgICBjaGFyICpmaWxlTmFtZSA9ICIvc2RjYXJkL291dHB1dC5tcDQiOworICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lID0gIi9zZGNhcmQvb3V0cHV0Lm1wNCI7CiAgICAgYm9vbCBwcmVmZXJTb2Z0d2FyZUNvZGVjID0gZmFsc2U7CiAKICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CkBAIC0zMTIsNyArMzE3LDcgQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyZWNvcmQgZmFpbGVkOiAlZFxuIiwgZXJyKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIGZwcmludGYoc3RkZXJyLCAiZW5jb2RpbmcgJWQgZnJhbWVzIGluICVsbGQgdXNcbiIsIG5GcmFtZXMsIChlbmQtc3RhcnQpLzEwMDApOworICAgIGZwcmludGYoc3RkZXJyLCAiZW5jb2RpbmcgJWQgZnJhbWVzIGluICUiIFBSSWQ2NCAiIHVzXG4iLCBuRnJhbWVzLCAoZW5kLXN0YXJ0KS8xMDAwKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgImVuY29kaW5nIHNwZWVkIGlzOiAlLjJmIGZwc1xuIiwgKG5GcmFtZXMgKiAxRTkpIC8gKGVuZC1zdGFydCkpOwogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwCmluZGV4IGM4MTc0NDMuLjBmNzI5YTMgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc2YyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3NmMi5jcHAKQEAgLTE2LDEwICsxNiwxNSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgInNmMiIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTQyLDYgKzQ3LDE4IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCit2b2xhdGlsZSBzdGF0aWMgYm9vbCBjdHJsYyA9IGZhbHNlOworCitzdGF0aWMgc2lnaGFuZGxlcl90IG9sZGhhbmRsZXIgPSBOVUxMOworCitzdGF0aWMgdm9pZCBteXNpZ2hhbmRsZXIoaW50IHNpZ251bSkgeworICAgIGlmIChzaWdudW0gPT0gU0lHSU5UKSB7CisgICAgICAgIGN0cmxjID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvbGRoYW5kbGVyKHNpZ251bSk7Cit9CisKIHN0cnVjdCBDb250cm9sbGVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBDb250cm9sbGVyKGNvbnN0IGNoYXIgKnVyaSwgYm9vbCBkZWNvZGVBdWRpbywKICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLCBib29sIHJlbmRlclRvU3VyZmFjZSkKQEAgLTYyLDcgKzc5LDMwIEBACiAgICAgdmlydHVhbCB+Q29udHJvbGxlcigpIHsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnRTdGF0aXN0aWNzKCkgeworICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gbVN0YXJ0VGltZVVzOworCisgICAgICAgIGlmIChtRGVjb2RlQXVkaW8pIHsKKyAgICAgICAgICAgIHByaW50ZigiJSIgUFJJZDY0ICIgYnl0ZXMgcmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAorICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCwKKyAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJSIgUFJJZDY0ICIgYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAorICAgICAgICAgICAgbU51bU91dHB1dEJ1ZmZlcnNSZWNlaXZlZCwKKyAgICAgICAgICAgIG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQgKiAxRTYgLyBkZWxheVVzLAorICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCwKKyAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgaWYgKGN0cmxjKSB7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICBwcmludFN0YXRpc3RpY3MoKTsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgIGN0cmxjID0gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OgogICAgICAgICAgICAgewpAQCAtNzUsNyArMTE1LDggQEAKICNlbmRpZgogCiAgICAgICAgICAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkobVVSSS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBtVVJJLmNfc3RyKCkpOwogCiAgICAgICAgICAgICAgICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9CiAgICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSk7CkBAIC05OCw3ICsxMzksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENIRUNLKG1Tb3VyY2UgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIm5vICVzIHRyYWNrIGZvdW5kXG4iLCBtRGVjb2RlQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIENIRUNLX0VRKG1Tb3VyY2UtPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CiAKQEAgLTE2Nyw0MiArMjExLDI4IEBACiAgICAgICAgICAgICAgICAgaW50MzJfdCB3aGF0OwogICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKIAotICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGaWxsVGhpc0J1ZmZlcikgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRGaWxsVGhpc0J1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBvbkZpbGxUaGlzQnVmZmVyKG1zZyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXREcmFpblRoaXNCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQ29kZWNCYXNlOjprV2hhdERyYWluVGhpc0J1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBpZiAoKG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQrKyAlIDE2KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgb25EcmFpblRoaXNCdWZmZXIobXNnKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdEVPUwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgd2hhdCA9PSBBQ29kZWM6OmtXaGF0RXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCh3aGF0ID09IEFDb2RlYzo6a1doYXRFT1MpID8gIiRcbiIgOiAiRVxuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRFT1MKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdoYXQgPT0gQ29kZWNCYXNlOjprV2hhdEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50Zigod2hhdCA9PSBDb2RlY0Jhc2U6OmtXaGF0RU9TKSA/ICIkXG4iIDogIkVcbiIpOwogCi0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBtU3RhcnRUaW1lVXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWNvZGVBdWRpbykgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlbGxkIGJ5dGVzIHJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxCeXRlc1JlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJWxsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtT3V0cHV0QnVmZmVyc1JlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQgKiAxRTYgLyBkZWxheVVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCAqIDFFNiAvIDEwMjQgLyBkZWxheVVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAgICAgICAgIHByaW50U3RhdGlzdGljcygpOwogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgaWQoKSkpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgbVNlZWtTdGF0ZSA9IFNFRUtfRkxVU0hfQ09NUExFVEVEOwogICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOwogCiAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCBpZCgpKSktPnBvc3QoNTAwMDAwMGxsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgICAgICBtRGVjb2RlTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtQ29kZWMtPmlkKCkpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVjb2RlTG9vcGVyICE9IGxvb3BlcigpKSB7CkBAIC0yMTAsMTIgKzI0MCw2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBsb29wZXIoKS0+c3RvcCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoInNvbWV0aGluZyB3ZW50IHdyb25nLCBjb2RlYyByZXBvcnRlZCBhbiBlcnJvci4iKTsKLQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVcbiIpOwotCi0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC02MzgsNiArNjYyLDggQEAKIAogICAgIGxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKGNvbnRyb2xsZXIpOwogCisgICAgc2lnbmFsKFNJR0lOVCwgbXlzaWdoYW5kbGVyKTsKKwogICAgIGNvbnRyb2xsZXItPnN0YXJ0QXN5bmMoKTsKIAogICAgIENIRUNLX0VRKGxvb3Blci0+c3RhcnQodHJ1ZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8pLCAoc3RhdHVzX3QpT0spOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCAwMzBiZjFiLi44MWVkY2I0IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtMTQsMjAgKzE0LDIyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAic3RhZ2VmcmlnaHQiCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQogI2luY2x1ZGUgImpwZWcuaCIKICNpbmNsdWRlICJTaW5lU291cmNlLmgiCiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCkBAIC00OSw4ICs1MSw2IEBACiAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KIAotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KICNpbmNsdWRlIDxndWkvR0xDb25zdW1lci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgpAQCAtODksOCArODksOCBAQAogICAgIGludDY0X3QgbWluVXMgPSBkZWNvZGVUaW1lc1VzLT5pdGVtQXQoMCk7CiAgICAgaW50NjRfdCBtYXhVcyA9IGRlY29kZVRpbWVzVXMtPml0ZW1BdChuIC0gMSk7CiAKLSAgICBwcmludGYoIm1pbiBkZWNvZGUgdGltZSAlbGxkIHVzICglLjJmIHNlY3MpXG4iLCBtaW5VcywgbWluVXMgLyAxRTYpOwotICAgIHByaW50ZigibWF4IGRlY29kZSB0aW1lICVsbGQgdXMgKCUuMmYgc2VjcylcbiIsIG1heFVzLCBtYXhVcyAvIDFFNik7CisgICAgcHJpbnRmKCJtaW4gZGVjb2RlIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcylcbiIsIG1pblVzLCBtaW5VcyAvIDFFNik7CisgICAgcHJpbnRmKCJtYXggZGVjb2RlIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcylcbiIsIG1heFVzLCBtYXhVcyAvIDFFNik7CiAKICAgICBzaXplX3QgY291bnRzWzEwMF07CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDA7ICsraSkgewpAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgICAgIGludDY0X3Qgc2xvdFVzID0gbWluVXMgKyAoaSAqIChtYXhVcyAtIG1pblVzKSAvIDEwMCk7CiAKICAgICAgICAgZG91YmxlIGZwcyA9IDFFNiAvIHNsb3RVczsKLSAgICAgICAgcHJpbnRmKCJbJS4yZiBmcHNdOiAlZFxuIiwgZnBzLCBjb3VudHNbaV0pOworICAgICAgICBwcmludGYoIlslLjJmIGZwc106ICV6dVxuIiwgZnBzLCBjb3VudHNbaV0pOwogICAgIH0KIH0KIApAQCAtMjYyLDcgKzI2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBwcmludGYoImJ1ZmZlciBoYXMgdGltZXN0YW1wICVsbGQgdXMgKCUuMmYgc2VjcylcbiIsCisgICAgICAgICAgICAgICAgcHJpbnRmKCJidWZmZXIgaGFzIHRpbWVzdGFtcCAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIHRpbWVzdGFtcFVzIC8gMUU2KTsKIAogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMjg1LDcgKzI4NSw3IEBACiAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcyA9IChyYW5kKCkgKiAoZmxvYXQpZHVyYXRpb25VcykgLyBSQU5EX01BWDsKICAgICAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhzZWVrVGltZVVzKTsKIAotICAgICAgICAgICAgICAgIHByaW50Zigic2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpXG4iLAorICAgICAgICAgICAgICAgIHByaW50Zigic2Vla2luZyB0byAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgc2Vla1RpbWVVcyAvIDFFNik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM4OCw3ICszODgsNyBAQAogICAgICAgICAvLyBzaXplcyBtYXkgYmUgZGlmZmVyZW50IGFjcm9zcyBkZWNvZGVycy4KICAgICAgICAgcHJpbnRmKCJhdmcuICUuMmYgS0Ivc2VjXG4iLCB0b3RhbEJ5dGVzIC8gMTAyNCAqIDFFNiAvIGRlbGF5KTsKIAotICAgICAgICBwcmludGYoImRlY29kZWQgYSB0b3RhbCBvZiAlbGxkIGJ5dGVzXG4iLCB0b3RhbEJ5dGVzKTsKKyAgICAgICAgcHJpbnRmKCJkZWNvZGVkIGEgdG90YWwgb2YgJSIgUFJJZDY0ICIgYnl0ZXNcbiIsIHRvdGFsQnl0ZXMpOwogICAgIH0KIH0KIApAQCAtNTc0LDcgKzU3NCw4IEBACiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogCi0gICAgICAgICAgICBwcmludGYoIiVsbGRcdCVsbGRcdCVsbGRcbiIsIHNlZWtUaW1lVXMsIHRpbWVVcywgc2Vla1RpbWVVcyAtIHRpbWVVcyk7CisgICAgICAgICAgICBwcmludGYoIiUiIFBSSWQ2NCAiXHQlIiBQUklkNjQgIlx0JSIgUFJJZDY0ICJcbiIsCisgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgdGltZVVzLCBzZWVrVGltZVVzIC0gdGltZVVzKTsKIAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwpAQCAtNjQ1LDcgKzY0Niw3IEBACiAgICAgICAgICAgICAgICAgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCA9CiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzW2pdOwogCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyVsZC8lbGQiLCBqID4gMCA/ICIsICIgOiAiIiwKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzJSIgUFJJdTMyICIvJSIgUFJJdTMyLCBqID4gMCA/ICIsICIgOiAiIiwKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlLCBwcm9maWxlTGV2ZWwubUxldmVsKTsKICAgICAgICAgICAgIH0KIApAQCAtOTM4LDkgKzkzOSwxMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ0hFQ0sodXNlU3VyZmFjZVRleEFsbG9jKTsKIAotICAgICAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgICAgICBzcDxHTENvbnN1bWVyPiB0ZXh0dXJlID0gbmV3IEdMQ29uc3VtZXIoYnEsIDAgLyogdGV4ICovKTsKLSAgICAgICAgICAgIGdTdXJmYWNlID0gbmV3IFN1cmZhY2UoYnEpOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgICAgICBzcDxHTENvbnN1bWVyPiB0ZXh0dXJlID0gbmV3IEdMQ29uc3VtZXIoY29uc3VtZXIsIDAgLyogdGV4ICovLAorICAgICAgICAgICAgICAgICAgICBHTENvbnN1bWVyOjpURVhUVVJFX0VYVEVSTkFMLCB0cnVlIC8qIHVzZUZlbmNlU3luYyAqLywKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaXNDb250cm9sbGVkQnlBcHAgKi8pOworICAgICAgICAgICAgZ1N1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgICAgIH0KIAogICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssCkBAIC05NTgsNyArOTYzLDggQEAKIAogICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGFyZ3Zba107CiAKLSAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoZmlsZW5hbWUpOworICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KKyAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOwogCiAgICAgICAgIGlmIChzdHJuY2FzZWNtcChmaWxlbmFtZSwgInNpbmU6IiwgNSkgJiYgZGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UuXG4iKTsKQEAgLTEwNzEsNyArMTA3Nyw3IEBACiAKICAgICAgICAgICAgICAgICBpbnQ2NF90IHRodW1iVGltZVVzOwogICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZ0aHVtYlRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ0aHVtYm5haWxUaW1lOiAlbGxkIHVzICglLjJmIHNlY3MpXG4iLAorICAgICAgICAgICAgICAgICAgICBwcmludGYoInRodW1ibmFpbFRpbWU6ICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJUaW1lVXMsIHRodW1iVGltZVVzIC8gMUU2KTsKICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAppbmRleCBkYmE2N2E5Li4wNTY2ZDE0IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTE1OSw3ICsxNjAsOSBAQAogTXlDb252ZXJ0aW5nU3RyZWFtU291cmNlOjpNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCiAgICAgOiBtQ3VycmVudEJ1ZmZlckluZGV4KC0xKSwKICAgICAgIG1DdXJyZW50QnVmZmVyT2Zmc2V0KDApIHsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShmaWxlbmFtZSk7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9CisgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOworCiAgICAgQ0hFQ0soZGF0YVNvdXJjZSAhPSBOVUxMKTsKIAogICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UpOwpAQCAtMzcxLDcgKzM3NCw3IEBACiAgICAgfQogCiAgICAgc3A8SU1lZGlhUGxheWVyPiBwbGF5ZXIgPQotICAgICAgICBzZXJ2aWNlLT5jcmVhdGUoY2xpZW50LCAwKTsKKyAgICAgICAgc2VydmljZS0+Y3JlYXRlKGNsaWVudCwgQVVESU9fU0VTU0lPTl9BTExPQ0FURSk7CiAKICAgICBpZiAocGxheWVyICE9IE5VTEwgJiYgcGxheWVyLT5zZXREYXRhU291cmNlKHNvdXJjZSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgcGxheWVyLT5zZXRWaWRlb1N1cmZhY2VUZXh0dXJlKHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSk7CmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybVN1cHBvcnRJbmZvLmNwcCBiL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCmluZGV4IDU0MDBiZGQuLjU4NGM2YTYgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCisrKyBiL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1NaW1lVHlwZVZlY3Rvci5zaXplKCk7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1pbWVUeXBlVmVjdG9yLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IFN0cmluZzggaXRlbSA9IG1NaW1lVHlwZVZlY3Rvci5pdGVtQXQoaSk7CiAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGl0ZW0uc3RyaW5nKCksIG1pbWVUeXBlLnN0cmluZygpKSkgewpAQCAtNTgsNyArNTgsNyBAQAogfQogCiBib29sIERybVN1cHBvcnRJbmZvOjppc1N1cHBvcnRlZEZpbGVTdWZmaXgoY29uc3QgU3RyaW5nOCYgZmlsZVR5cGUpIGNvbnN0IHsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1GaWxlU3VmZml4VmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmlsZVN1ZmZpeFZlY3Rvci5zaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBTdHJpbmc4IGl0ZW0gPSBtRmlsZVN1ZmZpeFZlY3Rvci5pdGVtQXQoaSk7CiAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGl0ZW0uc3RyaW5nKCksIGZpbGVUeXBlLnN0cmluZygpKSkgewpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rIGIvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rCmluZGV4IGRjOTczZGEuLmFhMGFiOWIgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5taworKysgYi9kcm0vZHJtc2VydmVyL0FuZHJvaWQubWsKQEAgLTM5LDQgKzM5LDYgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCmluZGV4IGRjY2QyM2QuLmQ4YWViMGMgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcApAQCAtMTAxLDcgKzEwMSw3IEBACiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpsb2FkUGx1Z0lucyhjb25zdCBTdHJpbmc4JiBwbHVnSW5EaXJQYXRoKSB7CiAgICAgbVBsdWdJbk1hbmFnZXIubG9hZFBsdWdJbnMocGx1Z0luRGlyUGF0aCk7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJblBhdGhMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwbHVnSW5QYXRoTGlzdC5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGx1Z0luUGF0aExpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgU3RyaW5nOCBwbHVnSW5QYXRoID0gcGx1Z0luUGF0aExpc3RbaV07CiAgICAgICAgIERybVN1cHBvcnRJbmZvKiBpbmZvID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJblBhdGgpLmdldFN1cHBvcnRJbmZvKDApOwogICAgICAgICBpZiAoTlVMTCAhPSBpbmZvKSB7CkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmICghbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5pc0VtcHR5KCkpIHsKICAgICAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewogICAgICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CiAgICAgICAgICAgICByRHJtRW5naW5lLmluaXRpYWxpemUodW5pcXVlSWQpOwogICAgICAgICAgICAgckRybUVuZ2luZS5zZXRPbkluZm9MaXN0ZW5lcih1bmlxdWVJZCwgdGhpcyk7CkBAIC0xNDksNyArMTQ5LDcgQEAKIHZvaWQgRHJtTWFuYWdlcjo6cmVtb3ZlQ2xpZW50KGludCB1bmlxdWVJZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwotICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CiAgICAgICAgIHJEcm1FbmdpbmUudGVybWluYXRlKHVuaXF1ZUlkKTsKICAgICB9CkBAIC0yMDgsNyArMjA4LDcgQEAKICAgICBib29sIHJlc3VsdCA9IGZhbHNlOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5QYXRoTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwbHVnSW5QYXRoTGlzdC5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGx1Z0luUGF0aExpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5QYXRoTGlzdFtpXSk7CiAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUuY2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoKTsKIApAQCAtMzE4LDcgKzMxOCw3IEBACiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpyZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKSB7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CiAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUucmVtb3ZlQWxsUmlnaHRzKHVuaXF1ZUlkKTsKICAgICAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKQEAgLTQxMiw3ICs0MTIsNyBAQAogICAgIGlmIChOVUxMICE9IGhhbmRsZSkgewogICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKIAotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewogICAgICAgICAgICAgU3RyaW5nOCBwbHVnSW5JZCA9IHBsdWdJbklkTGlzdC5pdGVtQXQoaW5kZXgpOwogICAgICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CiAgICAgICAgICAgICByZXN1bHQgPSByRHJtRW5naW5lLm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgaGFuZGxlLCBmZCwgb2Zmc2V0LCBsZW5ndGgsIG1pbWUpOwpAQCAtNDQwLDcgKzQ0MCw3IEBACiAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CiAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOwogCi0gICAgICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CiAgICAgICAgICAgICBTdHJpbmc4IHBsdWdJbklkID0gcGx1Z0luSWRMaXN0Lml0ZW1BdChpbmRleCk7CiAgICAgICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKICAgICAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUub3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBoYW5kbGUsIHVyaSwgbWltZSk7CkBAIC01NjUsNyArNTY1LDcgQEAKICAgICBTdHJpbmc4IHBsdWdJbklkKCIiKTsKIAogICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gbWltZVR5cGUpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLnNpemUoKTsgaW5kZXgrKykgewogICAgICAgICAgICAgY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvID0gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5rZXlBdChpbmRleCk7CiAKICAgICAgICAgICAgIGlmIChkcm1TdXBwb3J0SW5mby5pc1N1cHBvcnRlZE1pbWVUeXBlKG1pbWVUeXBlKSkgewpAQCAtNTgxLDcgKzU4MSw3IEBACiAgICAgU3RyaW5nOCBwbHVnSW5JZCgiIik7CiAgICAgY29uc3QgU3RyaW5nOCBmaWxlU3VmZml4ID0gcGF0aC5nZXRQYXRoRXh0ZW5zaW9uKCk7CiAKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5zaXplKCk7IGluZGV4KyspIHsKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvID0gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5rZXlBdChpbmRleCk7CiAKICAgICAgICAgaWYgKGRybVN1cHBvcnRJbmZvLmlzU3VwcG9ydGVkRmlsZVN1ZmZpeChmaWxlU3VmZml4KSkgewpAQCAtNTk5LDcgKzU5OSw3IEBACiAKIHZvaWQgRHJtTWFuYWdlcjo6b25JbmZvKGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxpc3RlbmVyTG9jayk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1TZXJ2aWNlTGlzdGVuZXJzLnNpemUoKTsgaW5kZXgrKykgeworICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBtU2VydmljZUxpc3RlbmVycy5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgaW50IHVuaXF1ZUlkID0gbVNlcnZpY2VMaXN0ZW5lcnMua2V5QXQoaW5kZXgpOwogCiAgICAgICAgIGlmICh1bmlxdWVJZCA9PSBldmVudC5nZXRVbmlxdWVJZCgpKSB7CmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDJiNzE5MDQuLjYzMzQxZTAgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0zNCw3ICszNCwxOCBAQAogc3RhdGljIFZlY3Rvcjx1aWRfdD4gdHJ1c3RlZFVpZHM7CiAKIHN0YXRpYyBib29sIGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoKSB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgLy8gVE9ETworICAgIC8vIEZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IGZvciByZWZlcmVuY2UuCisgICAgLy8gRWFjaCBPRU0gbWFudWZhY3R1cmVyIHNob3VsZCBpbXBsZW1lbnQvcmVwbGFjZSB3aXRoIHRoZWlyIG93biBzb2x1dGlvbnMuCisgICAgSVBDVGhyZWFkU3RhdGUqIGlwY1N0YXRlID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICB1aWRfdCB1aWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1VpZCgpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0cnVzdGVkVWlkcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAodHJ1c3RlZFVpZHNbaV0gPT0gdWlkKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgRHJtTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCkgewpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9QbHVnSW5NYW5hZ2VyLmgKaW5kZXggN2JiMTQzZi4uYzFkMDE5YSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUGx1Z0luTWFuYWdlci5oCkBAIC04MCw3ICs4MCw3IEBACiAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5GaWxlTGlzdCA9IGdldFBsdWdJblBhdGhMaXN0KHJzUGx1Z0luRGlyUGF0aCk7CiAKICAgICAgICAgaWYgKCFwbHVnSW5GaWxlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGx1Z0luRmlsZUxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGx1Z0luRmlsZUxpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBsb2FkUGx1Z0luKHBsdWdJbkZpbGVMaXN0W2ldKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtOTEsNyArOTEsNyBAQAogICAgICAqCiAgICAgICovCiAgICAgdm9pZCB1bmxvYWRQbHVnSW5zKCkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1fcGx1Z0luSWRMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wbHVnSW5JZExpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIHVubG9hZFBsdWdJbihtX3BsdWdJbklkTGlzdFtpXSk7CiAgICAgICAgIH0KICAgICAgICAgbV9wbHVnSW5JZExpc3QuY2xlYXIoKTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCmluZGV4IDIzNGFlZjIuLmY0MDA3MzIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcApAQCAtMzE2LDYgKzMxNiw3IEBACiAKICAgICBpZiAoLTEgPCBmaWxlRGVzYykgewogICAgICAgICBpZiAoRndkTG9ja0ZpbGVfYXR0YWNoKGZpbGVEZXNjKSA8IDApIHsKKyAgICAgICAgICAgIGNsb3NlKGZpbGVEZXNjKTsKICAgICAgICAgICAgIHJldHVybiBtaW1lU3RyaW5nOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IGNoYXIqIHBNaW1lVHlwZSA9IEZ3ZExvY2tGaWxlX0dldENvbnRlbnRUeXBlKGZpbGVEZXNjKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0Flc0N0ckRlY3J5cHRvci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjhkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKworI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtCbG9ja0JpdENvdW50ID0ga0Jsb2NrU2l6ZSAqIDg7CisKK2FuZHJvaWQ6OnN0YXR1c190IEFlc0N0ckRlY3J5cHRvcjo6ZGVjcnlwdChjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIGtleSwKKyAgICAgICAgY29uc3QgSXYgaXYsIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwKKyAgICAgICAgdWludDhfdCogZGVzdGluYXRpb24sCisgICAgICAgIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywKKyAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpIHsKKyAgICB1aW50MzJfdCBibG9ja09mZnNldCA9IDA7CisgICAgdWludDhfdCBwcmV2aW91c0VuY3J5cHRlZENvdW50ZXJba0Jsb2NrU2l6ZV07CisgICAgbWVtc2V0KHByZXZpb3VzRW5jcnlwdGVkQ291bnRlciwgMCwga0Jsb2NrU2l6ZSk7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBBRVNfS0VZIG9wZW5zc2xLZXk7CisgICAgQUVTX3NldF9lbmNyeXB0X2tleShrZXkuYXJyYXkoKSwga0Jsb2NrQml0Q291bnQsICZvcGVuc3NsS2V5KTsKKyAgICBJdiBvcGVuc3NsSXY7CisgICAgbWVtY3B5KG9wZW5zc2xJdiwgaXYsIHNpemVvZihvcGVuc3NsSXYpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgKytpKSB7CisgICAgICAgIGNvbnN0IFN1YlNhbXBsZSYgc3ViU2FtcGxlID0gc3ViU2FtcGxlc1tpXTsKKworICAgICAgICBpZiAoc3ViU2FtcGxlLm1OdW1CeXRlc09mQ2xlYXJEYXRhID4gMCkgeworICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uICsgb2Zmc2V0LCBzb3VyY2UgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gc3ViU2FtcGxlLm1OdW1CeXRlc09mQ2xlYXJEYXRhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPiAwKSB7CisgICAgICAgICAgICBBRVNfY3RyMTI4X2VuY3J5cHQoc291cmNlICsgb2Zmc2V0LCBkZXN0aW5hdGlvbiArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSwgJm9wZW5zc2xLZXksCisgICAgICAgICAgICAgICAgICAgIG9wZW5zc2xJdiwgcHJldmlvdXNFbmNyeXB0ZWRDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAmYmxvY2tPZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqYnl0ZXNEZWNyeXB0ZWRPdXQgPSBvZmZzZXQ7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQWVzQ3RyRGVjcnlwdG9yLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDE2MjY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQWVzQ3RyRGVjcnlwdG9yLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfQUVTX0NUUl9ERUNSWVBUT1JfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQUVTX0NUUl9ERUNSWVBUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBBZXNDdHJEZWNyeXB0b3IgeworcHVibGljOgorICAgIEFlc0N0ckRlY3J5cHRvcigpIHt9CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBkZWNyeXB0KGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYga2V5LCBjb25zdCBJdiBpdiwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwgdWludDhfdCogZGVzdGluYXRpb24sCisgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQWVzQ3RyRGVjcnlwdG9yKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9BRVNfQ1RSX0RFQ1JZUFRPUl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tayBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhODViNAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKQEAgLTAsMCArMSw2MiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgQWVzQ3RyRGVjcnlwdG9yLmNwcCBcCisgICAgQ2xlYXJLZXlVVUlELmNwcCBcCisgICAgQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCBcCisgICAgQ3J5cHRvRmFjdG9yeS5jcHAgXAorICAgIENyeXB0b1BsdWdpbi5jcHAgXAorICAgIERybUZhY3RvcnkuY3BwIFwKKyAgICBEcm1QbHVnaW4uY3BwIFwKKyAgICBJbml0RGF0YVBhcnNlci5jcHAgXAorICAgIEpzb25XZWJLZXkuY3BwIFwKKyAgICBTZXNzaW9uLmNwcCBcCisgICAgU2Vzc2lvbkxpYnJhcnkuY3BwIFwKKyAgICBVdGlscy5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBiaW9uaWMgXAorICAgIGV4dGVybmFsL2pzbW4gXAorICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZSBcCisgICAgZnJhbWV3b3Jrcy9hdi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleSBcCisgICAgZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKKworTE9DQUxfTU9EVUxFIDo9IGxpYmRybWNsZWFya2V5cGx1Z2luCisKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBtZWRpYWRybQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJjcnlwdG8gXAorICAgIGxpYmxvZyBcCisgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgbGlidXRpbHMgXAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJqc21uIFwKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJ1aWxkIHVuaXQgdGVzdHMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3Rlc3RzL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VHlwZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjg5NTlhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlUeXBlcy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX1RZUEVTX0hfCisjZGVmaW5lIENMRUFSS0VZX1RZUEVTX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NvbnN0IHVpbnQ4X3Qga0Jsb2NrU2l6ZSA9IEFFU19CTE9DS19TSVpFOwordHlwZWRlZiB1aW50OF90IEtleUlkW2tCbG9ja1NpemVdOwordHlwZWRlZiB1aW50OF90IEl2W2tCbG9ja1NpemVdOworCit0eXBlZGVmIGFuZHJvaWQ6OkNyeXB0b1BsdWdpbjo6U3ViU2FtcGxlIFN1YlNhbXBsZTsKKwordHlwZWRlZiBhbmRyb2lkOjpLZXllZFZlY3RvcjxhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4sCisgICAgICAgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiA+IEtleU1hcDsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX1RZUEVTX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDA1MGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlVVUlELmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2Jvb2wgaXNDbGVhcktleVVVSUQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtDbGVhcktleVVVSURbMTZdID0geworICAgICAgICAweDEwLDB4NzcsMHhFRiwweEVDLDB4QzAsMHhCMiwweDRELDB4MDIsCisgICAgICAgIDB4QUMsMHhFMywweDNDLDB4MUUsMHg1MiwweEUyLDB4RkIsMHg0QgorICAgIH07CisKKyAgICByZXR1cm4gIW1lbWNtcCh1dWlkLCBrQ2xlYXJLZXlVVUlELCBzaXplb2Yoa0NsZWFyS2V5VVVJRCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VVVJRC5oCmluZGV4IDEzY2FjNmQuLmFjOTk0MTgKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VVVJRC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKKyNpZm5kZWYgQ0xFQVJLRVlfVVVJRF9IXworI2RlZmluZSBDTEVBUktFWV9VVUlEX0hfCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK2Jvb2wgaXNDbGVhcktleVVVSUQoY29uc3QgdWludDhfdCB1dWlkWzE2XSk7CiAKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9VVUlEX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2MSUKY29weSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApjb3B5IHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKaW5kZXggMTNjYWM2ZC4uZWMxNDIwZQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaW5jbHVkZSAiQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgiCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjaW5jbHVkZSAiQ3J5cHRvRmFjdG9yeS5oIgorI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworZXh0ZXJuICJDIiB7CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK2FuZHJvaWQ6OkRybUZhY3RvcnkqIGNyZWF0ZURybUZhY3RvcnkoKSB7CisgICAgcmV0dXJuIG5ldyBjbGVhcmtleWRybTo6RHJtRmFjdG9yeSgpOworfQogCithbmRyb2lkOjpDcnlwdG9GYWN0b3J5KiBjcmVhdGVDcnlwdG9GYWN0b3J5KCkgeworICAgIHJldHVybiBuZXcgY2xlYXJrZXlkcm06OkNyeXB0b0ZhY3RvcnkoKTsKK30KKworfSAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjAlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaAppbmRleCAxM2NhYzZkLi5kOWFjZWMxCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaWZuZGVmIENMRUFSS0VZX0NSRUFURV9QTFVHSU5fRkFDVE9SSUVTX0hfCisjZGVmaW5lIENMRUFSS0VZX0NSRUFURV9QTFVHSU5fRkFDVE9SSUVTX0hfCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCitleHRlcm4gIkMiIHsKKyAgICBhbmRyb2lkOjpEcm1GYWN0b3J5KiBjcmVhdGVEcm1GYWN0b3J5KCk7CisgICAgYW5kcm9pZDo6Q3J5cHRvRmFjdG9yeSogY3JlYXRlQ3J5cHRvRmFjdG9yeSgpOworfQogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCi0KKyNlbmRpZiAvLyBDTEVBUktFWV9DUkVBVEVfUExVR0lOX0ZBQ1RPUklFU19IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTMxODliCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5jcHAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlICJDcnlwdG9GYWN0b3J5LmgiCisKKyNpbmNsdWRlICJDbGVhcktleVVVSUQuaCIKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworYm9vbCBDcnlwdG9GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ2xlYXJLZXlVVUlEKHV1aWQpOworfQorCithbmRyb2lkOjpzdGF0dXNfdCBDcnlwdG9GYWN0b3J5OjpjcmVhdGVQbHVnaW4oCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICBhbmRyb2lkOjpDcnlwdG9QbHVnaW4qKiBwbHVnaW4pIHsKKyAgICBpZiAoIWlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICpwbHVnaW4gPSBOVUxMOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGFuZHJvaWQ6OnNwPFNlc3Npb24+IHNlc3Npb24gPSBTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmZpbmRTZXNzaW9uKAorICAgICAgICAgICAgZGF0YSwgc2l6ZSk7CisgICAgKnBsdWdpbiA9IG5ldyBDcnlwdG9QbHVnaW4oc2Vzc2lvbik7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OGJjNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY2xhc3MgQ3J5cHRvRmFjdG9yeSA6IHB1YmxpYyBhbmRyb2lkOjpDcnlwdG9GYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDcnlwdG9GYWN0b3J5KCkge30KKyAgICB2aXJ0dWFsIH5DcnlwdG9GYWN0b3J5KCkge30KKworICAgIHZpcnR1YWwgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSBjb25zdDsKKworICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgY3JlYXRlUGx1Z2luKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgYW5kcm9pZDo6Q3J5cHRvUGx1Z2luKiogcGx1Z2luKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDcnlwdG9GYWN0b3J5KTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9DUllQVE9fRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhZDEzNgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5jcHAKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSAiQ3J5cHRvUGx1Z2luLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKK3VzaW5nIGFuZHJvaWQ6OkFTdHJpbmc7Cit1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKKworLy8gUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZXMgZm9yIGVycm9yIGNvZGUgYW5kIHBvc2l0aXZlIHZhbHVlcyBmb3IgdGhlIHNpemUgb2YKKy8vIGRlY3J5cHRlZCBkYXRhLiAgSW4gdGhlb3J5LCB0aGUgb3V0cHV0IHNpemUgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBpbnB1dAorLy8gc2l6ZSwgYnV0IGluIHByYWN0aWNlIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4gZm9yIEFFUy1DVFIuCitzc2l6ZV90IENyeXB0b1BsdWdpbjo6ZGVjcnlwdChib29sIHNlY3VyZSwgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZSBtb2RlLCBjb25zdCB2b2lkKiBzcmNQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHN0UHRyLCBBU3RyaW5nKiBlcnJvckRldGFpbE1zZykgeworICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgZXJyb3JEZXRhaWxNc2ctPnNldFRvKCJTZWN1cmUgZGVjcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsZWFyS2V5LiIpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgaWYgKG1vZGUgPT0ga01vZGVfVW5lbmNyeXB0ZWQpIHsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUmIHN1YlNhbXBsZSA9IHN1YlNhbXBsZXNbaV07CisKKyAgICAgICAgICAgIGlmIChzdWJTYW1wbGUubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICBlcnJvckRldGFpbE1zZy0+c2V0VG8oCisgICAgICAgICAgICAgICAgICAgICAgICAiRW5jcnlwdGVkIHN1YnNhbXBsZXMgZm91bmQgaW4gYWxsZWdlZGx5IHVuZW5jcnlwdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fREVDUllQVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRzdFB0cikgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNyY1B0cikgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3NpemVfdD4ob2Zmc2V0KTsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0ga01vZGVfQUVTX0NUUikgeworICAgICAgICBzaXplX3QgYnl0ZXNEZWNyeXB0ZWQ7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1TZXNzaW9uLT5kZWNyeXB0KGtleUlkLCBpdiwgc3JjUHRyLCBkc3RQdHIsIHN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsICZieXRlc0RlY3J5cHRlZCk7CisgICAgICAgIGlmIChyZXMgPT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihieXRlc0RlY3J5cHRlZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnJvckRldGFpbE1zZy0+c2V0VG8oIkRlY3J5cHRpb24gRXJyb3IiKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyb3JEZXRhaWxNc2ctPnNldFRvKAorICAgICAgICAgICAgICAgICJTZWxlY3RlZCBlbmNyeXB0aW9uIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgQ2xlYXJLZXkgRFJNICIKKyAgICAgICAgICAgICAgICAiUGx1Z2luLiIpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyZDllMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXworCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY2xhc3MgQ3J5cHRvUGx1Z2luIDogcHVibGljIGFuZHJvaWQ6OkNyeXB0b1BsdWdpbiB7CitwdWJsaWM6CisgICAgQ3J5cHRvUGx1Z2luKGNvbnN0IGFuZHJvaWQ6OnNwPFNlc3Npb24+JiBzZXNzaW9uKSA6IG1TZXNzaW9uKHNlc3Npb24pIHt9CisgICAgdmlydHVhbCB+Q3J5cHRvUGx1Z2luKCkge30KKworICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoY29uc3QgY2hhciogbWltZSkgY29uc3QgeworICAgICAgICBVTlVTRUQobWltZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZGVjcnlwdCgKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLCBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsCisgICAgICAgICAgICBNb2RlIG1vZGUsIGNvbnN0IHZvaWQqIHNyY1B0ciwKKyAgICAgICAgICAgIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICB2b2lkKiBkc3RQdHIsIGFuZHJvaWQ6OkFTdHJpbmcqIGVycm9yRGV0YWlsTXNnKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDcnlwdG9QbHVnaW4pOworCisgICAgYW5kcm9pZDo6c3A8U2Vzc2lvbj4gbVNlc3Npb247Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI3NWNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5jcHAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKKworI2luY2x1ZGUgIkRybVBsdWdpbi5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgorI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2Jvb2wgRHJtRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIHJldHVybiBpc0NsZWFyS2V5VVVJRCh1dWlkKTsKK30KKworYm9vbCBEcm1GYWN0b3J5Ojppc0NvbnRlbnRUeXBlU3VwcG9ydGVkKGNvbnN0IGFuZHJvaWQ6OlN0cmluZzggJmluaXREYXRhVHlwZSkgeworICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSB0eXBlcyBoYW5kZWQgYnkgSW5pdERhdGFQYXJzZXIuCisgICAgcmV0dXJuIGluaXREYXRhVHlwZSA9PSAiY2VuYyIgfHwKKyAgICAgICAgICAgaW5pdERhdGFUeXBlID09ICJ3ZWJtIjsKK30KKworYW5kcm9pZDo6c3RhdHVzX3QgRHJtRmFjdG9yeTo6Y3JlYXRlRHJtUGx1Z2luKAorICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBhbmRyb2lkOjpEcm1QbHVnaW4qKiBwbHVnaW4pIHsKKyAgICBpZiAoIWlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICpwbHVnaW4gPSBOVUxMOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKworICAgICpwbHVnaW4gPSBuZXcgRHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5OjpnZXQoKSk7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NGQzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KKworI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBEcm1GYWN0b3J5IDogcHVibGljIGFuZHJvaWQ6OkRybUZhY3RvcnkgeworcHVibGljOgorICAgIERybUZhY3RvcnkoKSB7fQorICAgIHZpcnR1YWwgfkRybUZhY3RvcnkoKSB7fQorCisgICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOworCisgICAgdmlydHVhbCBib29sIGlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAmaW5pdERhdGFUeXBlKTsKKworICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgY3JlYXRlRHJtUGx1Z2luKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgYW5kcm9pZDo6RHJtUGx1Z2luKiogcGx1Z2luKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1GYWN0b3J5KTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9EUk1fRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmY2E5NAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworI2luY2x1ZGUgIkRybVBsdWdpbi5oIgorCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBhbmRyb2lkOjpzcDsKKworc3RhdHVzX3QgRHJtUGx1Z2luOjpvcGVuU2Vzc2lvbihWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICBzZXNzaW9uSWQgPSBzZXNzaW9uLT5zZXNzaW9uSWQoKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6Y2xvc2VTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICBtU2Vzc2lvbkxpYnJhcnktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb24pOworICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KKworc3RhdHVzX3QgRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0KAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgIEtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LAorICAgICAgICBTdHJpbmc4JiBkZWZhdWx0VXJsKSB7CisgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CisgICAgaWYgKGtleVR5cGUgIT0ga0tleVR5cGVfU3RyZWFtaW5nKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzY29wZSk7CisgICAgZGVmYXVsdFVybC5jbGVhcigpOworICAgIHJldHVybiBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluaXREYXRhLCBpbml0RGF0YVR5cGUsICZyZXF1ZXN0KTsKK30KKworc3RhdHVzX3QgRHJtUGx1Z2luOjpwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UsCisgICAgICAgIFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpIHsKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzY29wZSk7CisgICAgc3RhdHVzX3QgcmVzID0gc2Vzc2lvbi0+cHJvdmlkZUtleVJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICBpZiAocmVzID09IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIGtleVNldElkLmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6Z2V0UHJvcGVydHlTdHJpbmcoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIFN0cmluZzgmIHZhbHVlKSBjb25zdCB7CisgICAgaWYgKG5hbWUgPT0gInZlbmRvciIpIHsKKyAgICAgICAgdmFsdWUgPSAiR29vZ2xlIjsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0gInZlcnNpb24iKSB7CisgICAgICAgIHZhbHVlID0gIjEuMCI7CisgICAgfSBlbHNlIGlmIChuYW1lID09ICJkZXNjcmlwdGlvbiIpIHsKKyAgICAgICAgdmFsdWUgPSAiQ2xlYXJLZXkgQ0RNIjsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0gImFsZ29yaXRobXMiKSB7CisgICAgICAgIHZhbHVlID0gIiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkFwcCByZXF1ZXN0ZWQgdW5rbm93biBzdHJpbmcgcHJvcGVydHkgJXMiLCBuYW1lLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2RmOWNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmgKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXworCisjaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6S2V5ZWRWZWN0b3I7Cit1c2luZyBhbmRyb2lkOjpMaXN0OwordXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOworCitjbGFzcyBEcm1QbHVnaW4gOiBwdWJsaWMgYW5kcm9pZDo6RHJtUGx1Z2luIHsKK3B1YmxpYzoKKyAgICBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KQorICAgICAgICAgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpIHt9CisgICAgdmlydHVhbCB+RHJtUGx1Z2luKCkge30KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRLZXlSZXF1ZXN0KAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgU3RyaW5nOCYgZGVmYXVsdFVybCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVLZXlSZXNwb25zZSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUtleXMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleVNldElkKSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoa2V5U2V0SWQpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUtleVN0YXR1cygKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChpbmZvTWFwKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvdmlzaW9uUmVxdWVzdCgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNlcnRfdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNlcnRfYXV0aG9yaXR5LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgU3RyaW5nOCYgZGVmYXVsdFVybCkgeworICAgICAgICBVTlVTRUQoY2VydF90eXBlKTsKKyAgICAgICAgVU5VU0VEKGNlcnRfYXV0aG9yaXR5KTsKKyAgICAgICAgVU5VU0VEKHJlcXVlc3QpOworICAgICAgICBVTlVTRUQoZGVmYXVsdFVybCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiB3cmFwcGVkS2V5KSB7CisgICAgICAgIFVOVVNFRChyZXNwb25zZSk7CisgICAgICAgIFVOVVNFRChjZXJ0aWZpY2F0ZSk7CisgICAgICAgIFVOVVNFRCh3cmFwcGVkS2V5KTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5wcm92aXNpb25EZXZpY2UoKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4mIHNlY3VyZVN0b3BzKSB7CisgICAgICAgIFVOVVNFRChzZWN1cmVTdG9wcyk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHNzUmVsZWFzZSkgeworICAgICAgICBVTlVTRUQoc3NSZWxlYXNlKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBTdHJpbmc4JiB2YWx1ZSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3QgeworICAgICAgICBVTlVTRUQobmFtZSk7CisgICAgICAgIFVOVVNFRCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpIHsKKyAgICAgICAgVU5VU0VEKG5hbWUpOworICAgICAgICBVTlVTRUQodmFsdWUpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIHsKKyAgICAgICAgVU5VU0VEKG5hbWUpOworICAgICAgICBVTlVTRUQodmFsdWUpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDaXBoZXJBbGdvcml0aG0oCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgU3RyaW5nOCYgYWxnb3JpdGhtKSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoYWxnb3JpdGhtKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFjQWxnb3JpdGhtKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IFN0cmluZzgmIGFsZ29yaXRobSkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGFsZ29yaXRobSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGlucHV0LAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpdiwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoa2V5SWQpOworICAgICAgICBVTlVTRUQoaW5wdXQpOworICAgICAgICBVTlVTRUQoaXYpOworICAgICAgICBVTlVTRUQob3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdCgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5wdXQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGl2LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChrZXlJZCk7CisgICAgICAgIFVOVVNFRChpbnB1dCk7CisgICAgICAgIFVOVVNFRChpdik7CisgICAgICAgIFVOVVNFRChvdXRwdXQpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChrZXlJZCk7CisgICAgICAgIFVOVVNFRChtZXNzYWdlKTsKKyAgICAgICAgVU5VU0VEKHNpZ25hdHVyZSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgbWVzc2FnZSwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2lnbmF0dXJlLCBib29sJiBtYXRjaCkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGtleUlkKTsKKyAgICAgICAgVU5VU0VEKG1lc3NhZ2UpOworICAgICAgICBVTlVTRUQoc2lnbmF0dXJlKTsKKyAgICAgICAgVU5VU0VEKG1hdGNoKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnblJTQSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWxnb3JpdGhtLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiB3cmFwcGVkS2V5LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChhbGdvcml0aG0pOworICAgICAgICBVTlVTRUQobWVzc2FnZSk7CisgICAgICAgIFVOVVNFRCh3cmFwcGVkS2V5KTsKKyAgICAgICAgVU5VU0VEKHNpZ25hdHVyZSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtUGx1Z2luKTsKKworICAgIFNlc3Npb25MaWJyYXJ5KiBtU2Vzc2lvbkxpYnJhcnk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmQ3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5jcHAKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiSW5pdERhdGFQYXJzZXIuaCIKKworI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OkFTdHJpbmc7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOworCituYW1lc3BhY2UgeworICAgIGNvbnN0IHNpemVfdCBrS2V5SWRTaXplID0gMTY7CisgICAgY29uc3Qgc2l6ZV90IGtTeXN0ZW1JZFNpemUgPSAxNjsKK30KKworYW5kcm9pZDo6c3RhdHVzX3QgSW5pdERhdGFQYXJzZXI6OnBhcnNlKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCkgeworICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiB0aGUga2V5IElEcworICAgIFZlY3Rvcjxjb25zdCB1aW50OF90Kj4ga2V5SWRzOworICAgIGlmIChpbml0RGF0YVR5cGUgPT0gImNlbmMiKSB7CisgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHJlcyA9IHBhcnNlUHNzaChpbml0RGF0YSwgJmtleUlkcyk7CisgICAgICAgIGlmIChyZXMgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGluaXREYXRhVHlwZSA9PSAid2VibSIpIHsKKyAgICAgICAgLy8gV2ViTSAiaW5pdCBkYXRhIiBpcyBqdXN0IGEgc2luZ2xlIGtleSBJRAorICAgICAgICBpZiAoaW5pdERhdGEuc2l6ZSgpICE9IGtLZXlJZFNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgfQorICAgICAgICBrZXlJZHMucHVzaChpbml0RGF0YS5hcnJheSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QKKyAgICBTdHJpbmc4IHJlcXVlc3RKc29uID0gZ2VuZXJhdGVSZXF1ZXN0KGtleUlkcyk7CisgICAgbGljZW5zZVJlcXVlc3QtPmNsZWFyKCk7CisgICAgbGljZW5zZVJlcXVlc3QtPmFwcGVuZEFycmF5KAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVxdWVzdEpzb24uc3RyaW5nKCkpLAorICAgICAgICAgICAgcmVxdWVzdEpzb24uc2l6ZSgpKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IEluaXREYXRhUGFyc2VyOjpwYXJzZVBzc2goY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgVmVjdG9yPGNvbnN0IHVpbnQ4X3QqPioga2V5SWRzKSB7CisgICAgc2l6ZV90IHJlYWRQb3NpdGlvbiA9IDA7CisKKyAgICAvLyBWYWxpZGF0ZSBzaXplIGZpZWxkCisgICAgdWludDMyX3QgZXhwZWN0ZWRTaXplID0gaW5pdERhdGEuc2l6ZSgpOworICAgIGV4cGVjdGVkU2l6ZSA9IGh0b25sKGV4cGVjdGVkU2l6ZSk7CisgICAgaWYgKG1lbWNtcCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSwgJmV4cGVjdGVkU2l6ZSwKKyAgICAgICAgICAgICAgIHNpemVvZihleHBlY3RlZFNpemUpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgcmVhZFBvc2l0aW9uICs9IHNpemVvZihleHBlY3RlZFNpemUpOworCisgICAgLy8gVmFsaWRhdGUgUFNTSCBib3ggaWRlbnRpZmllcgorICAgIGNvbnN0IGNoYXIgcHNzaElkZW50aWZpZXJbNF0gPSB7J3AnLCAncycsICdzJywgJ2gnfTsKKyAgICBpZiAobWVtY21wKCZpbml0RGF0YVtyZWFkUG9zaXRpb25dLCBwc3NoSWRlbnRpZmllciwKKyAgICAgICAgICAgICAgIHNpemVvZihwc3NoSWRlbnRpZmllcikpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKHBzc2hJZGVudGlmaWVyKTsKKworICAgIC8vIFZhbGlkYXRlIEVNRSB2ZXJzaW9uIG51bWJlcgorICAgIGNvbnN0IHVpbnQ4X3QgcHNzaFZlcnNpb24xWzRdID0gezEsIDAsIDAsIDB9OworICAgIGlmIChtZW1jbXAoJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sIHBzc2hWZXJzaW9uMSwKKyAgICAgICAgICAgICAgIHNpemVvZihwc3NoVmVyc2lvbjEpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgcmVhZFBvc2l0aW9uICs9IHNpemVvZihwc3NoVmVyc2lvbjEpOworCisgICAgLy8gVmFsaWRhdGUgc3lzdGVtIElECisgICAgaWYgKCFpc0NsZWFyS2V5VVVJRCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSkpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0ga1N5c3RlbUlkU2l6ZTsKKworICAgIC8vIFJlYWQga2V5IElEIGNvdW50CisgICAgdWludDMyX3Qga2V5SWRDb3VudDsKKyAgICBtZW1jcHkoJmtleUlkQ291bnQsICZpbml0RGF0YVtyZWFkUG9zaXRpb25dLCBzaXplb2Yoa2V5SWRDb3VudCkpOworICAgIGtleUlkQ291bnQgPSBudG9obChrZXlJZENvdW50KTsKKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKGtleUlkQ291bnQpOworICAgIGlmIChyZWFkUG9zaXRpb24gKyAoa2V5SWRDb3VudCAqIGtLZXlJZFNpemUpICE9CisgICAgICAgICAgICBpbml0RGF0YS5zaXplKCkgLSBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIGtleSBJRCBvZmZzZXRzCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtleUlkQ291bnQ7ICsraSkgeworICAgICAgICBzaXplX3Qga2V5SWRQb3NpdGlvbiA9IHJlYWRQb3NpdGlvbiArIChpICoga0tleUlkU2l6ZSk7CisgICAgICAgIGtleUlkcy0+cHVzaCgmaW5pdERhdGFba2V5SWRQb3NpdGlvbl0pOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK1N0cmluZzggSW5pdERhdGFQYXJzZXI6OmdlbmVyYXRlUmVxdWVzdChjb25zdCBWZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpIHsKKyAgICBjb25zdCBTdHJpbmc4IGtSZXF1ZXN0UHJlZml4KCJ7XCJraWRzXCI6WyIpOworICAgIGNvbnN0IFN0cmluZzgga1JlcXVlc3RTdWZmaXgoIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICBjb25zdCBTdHJpbmc4IGtCYXNlNjRQYWRkaW5nKCI9Iik7CisKKyAgICBTdHJpbmc4IHJlcXVlc3Qoa1JlcXVlc3RQcmVmaXgpOworICAgIEFTdHJpbmcgZW5jb2RlZElkOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5SWRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGVuY29kZWRJZC5jbGVhcigpOworICAgICAgICBhbmRyb2lkOjplbmNvZGVCYXNlNjQoa2V5SWRzW2ldLCBrS2V5SWRTaXplLCAmZW5jb2RlZElkKTsKKyAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiwiKTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LmFwcGVuZEZvcm1hdCgiXCIlc1wiIiwgZW5jb2RlZElkLmNfc3RyKCkpOworICAgIH0KKyAgICByZXF1ZXN0LmFwcGVuZChrUmVxdWVzdFN1ZmZpeCk7CisKKyAgICAvLyBBbmRyb2lkJ3MgQmFzZTY0IGVuY29kZXIgcHJvZHVjZXMgcGFkZGluZy4gRU1FIGZvcmJpZHMgcGFkZGluZy4KKyAgICByZXF1ZXN0LnJlbW92ZUFsbChrQmFzZTY0UGFkZGluZyk7CisgICAgcmV0dXJuIHJlcXVlc3Q7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTA1ZDJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9JTklUX0RBVEFfUEFSU0VSX0hfCisjZGVmaW5lIENMRUFSS0VZX0lOSVRfREFUQV9QQVJTRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIEluaXREYXRhUGFyc2VyIHsKK3B1YmxpYzoKKyAgICBJbml0RGF0YVBhcnNlcigpIHt9CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBwYXJzZShjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW5pdERhdGFQYXJzZXIpOworCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VQc3NoKGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8Y29uc3QgdWludDhfdCo+KiBrZXlJZHMpOworCisgICAgYW5kcm9pZDo6U3RyaW5nOCBnZW5lcmF0ZVJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX0lOSVRfREFUQV9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0pzb25XZWJLZXkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmZmFlNAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0pzb25XZWJLZXkuY3BwCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiSnNvbldlYktleSIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJKc29uV2ViS2V5LmgiCisKK25hbWVzcGFjZSB7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtLZXlzVGFnKCJrZXlzIik7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtLZXlUeXBlVGFnKCJrdHkiKTsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga1N5bW1ldHJpY0tleVZhbHVlKCJvY3QiKTsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga0tleVRhZygiayIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrS2V5SWRUYWcoImtpZCIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrQmFzZTY0UGFkZGluZygiPSIpOworfQorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBhbmRyb2lkOjpBQnVmZmVyOwordXNpbmcgYW5kcm9pZDo6QVN0cmluZzsKKworSnNvbldlYktleTo6SnNvbldlYktleSgpIHsKK30KKworSnNvbldlYktleTo6fkpzb25XZWJLZXkoKSB7Cit9CisKKy8qCisgKiBQYXJzZXMgYSBKU09OIFdlYiBLZXkgU2V0IHN0cmluZywgaW5pdGlhbGl6ZXMgYSBLZXlNYXAgd2l0aCBrZXkgaWQ6a2V5CisgKiBwYWlycyBmcm9tIHRoZSBKU09OIFdlYiBLZXkgU2V0LiBCb3RoIGtleSBpZHMgYW5kIGtleXMgYXJlIGJhc2U2NHVybAorICogZW5jb2RlZC4gVGhlIEtleU1hcCBjb250YWlucyBiYXNlNjR1cmwgZGVjb2RlZCBrZXkgaWQ6a2V5IHBhaXJzLgorICoKKyAqIEByZXR1cm4gUmV0dXJucyBmYWxzZSBmb3IgZXJyb3JzLCB0cnVlIGZvciBzdWNjZXNzLgorICovCitib29sIEpzb25XZWJLZXk6OmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoY29uc3QgU3RyaW5nOCYganNvbldlYktleVNldCwKKyAgICAgICAgS2V5TWFwKiBrZXlzKSB7CisKKyAgICBrZXlzLT5jbGVhcigpOworICAgIGlmICghcGFyc2VKc29uV2ViS2V5U2V0KGpzb25XZWJLZXlTZXQsICZtSnNvbk9iamVjdHMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBtSnNvbk9iamVjdHNbMF0gY29udGFpbnMgdGhlIGVudGlyZSBKU09OIFdlYiBLZXkgU2V0LCBpbmNsdWRpbmcKKyAgICAvLyBhbGwgdGhlIGJhc2U2NCBlbmNvZGVkIGtleXMuIEVhY2gga2V5IGlzIGFsc28gc3RvcmVkIHNlcGFyYXRlbHkgYXMKKyAgICAvLyBhIEpTT04gb2JqZWN0IGluIG1Kc29uT2JqZWN0c1sxLi5uXSB3aGVyZSBuIGlzIHRoZSB0b3RhbAorICAgIC8vIG51bWJlciBvZiBrZXlzIGluIHRoZSBzZXQuCisgICAgaWYgKCFpc0pzb25XZWJLZXlTZXQobUpzb25PYmplY3RzWzBdKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nOCBlbmNvZGVkS2V5LCBlbmNvZGVkS2V5SWQ7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGRlY29kZWRLZXksIGRlY29kZWRLZXlJZDsKKworICAgIC8vIG1Kc29uT2JqZWN0c1sxXSBjb250YWlucyB0aGUgZmlyc3QgSlNPTiBXZWIgS2V5IGluIHRoZSBzZXQKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG1Kc29uT2JqZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICBlbmNvZGVkS2V5SWQuY2xlYXIoKTsKKyAgICAgICAgZW5jb2RlZEtleS5jbGVhcigpOworCisgICAgICAgIGlmICghcGFyc2VKc29uT2JqZWN0KG1Kc29uT2JqZWN0c1tpXSwgJm1Ub2tlbnMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChmaW5kS2V5KG1Kc29uT2JqZWN0c1tpXSwgJmVuY29kZWRLZXlJZCwgJmVuY29kZWRLZXkpKSB7CisgICAgICAgICAgICBpZiAoZW5jb2RlZEtleUlkLmlzRW1wdHkoKSB8fCBlbmNvZGVkS2V5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNdXN0IGhhdmUgYm90aCBrZXkgaWQgYW5kIGtleSBpbiB0aGUgSnNvbldlYktleSBzZXQuIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZGVjb2RlQmFzZTY0U3RyaW5nKGVuY29kZWRLZXlJZCwgJmRlY29kZWRLZXlJZCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSBrZXkgaWQoJXMpIiwgZW5jb2RlZEtleUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkZWNvZGVCYXNlNjRTdHJpbmcoZW5jb2RlZEtleSwgJmRlY29kZWRLZXkpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkZWNvZGUga2V5KCVzKSIsIGVuY29kZWRLZXkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBrZXlzLT5hZGQoZGVjb2RlZEtleUlkLCBkZWNvZGVkS2V5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBKc29uV2ViS2V5OjpkZWNvZGVCYXNlNjRTdHJpbmcoY29uc3QgU3RyaW5nOCYgZW5jb2RlZFRleHQsCisgICAgICAgIFZlY3Rvcjx1aW50OF90PiogZGVjb2RlZFRleHQpIHsKKworICAgIGRlY29kZWRUZXh0LT5jbGVhcigpOworCisgICAgLy8gZW5jb2RlZFRleHQgc2hvdWxkIG5vdCBjb250YWluIHBhZGRpbmcgY2hhcmFjdGVycyBhcyBwZXIgRU1FIHNwZWMuCisgICAgaWYgKGVuY29kZWRUZXh0LmZpbmQoa0Jhc2U2NFBhZGRpbmcpICE9IC0xKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTaW5jZSBhbmRyb2lkOjpkZWNvZGVCYXNlNjQoKSByZXF1aXJlcyBwYWRkaW5nIGNoYXJhY3RlcnMsCisgICAgLy8gYWRkIHRoZW0gc28gbGVuZ3RoIG9mIGVuY29kZWRUZXh0IGlzIGV4YWN0bHkgYSBtdWx0aXBsZSBvZiA0LgorICAgIGludCByZW1haW5kZXIgPSBlbmNvZGVkVGV4dC5sZW5ndGgoKSAlIDQ7CisgICAgU3RyaW5nOCBwYWRkZWRUZXh0KGVuY29kZWRUZXh0KTsKKyAgICBpZiAocmVtYWluZGVyID4gMCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQgLSByZW1haW5kZXI7ICsraSkgeworICAgICAgICAgICAgcGFkZGVkVGV4dC5hcHBlbmQoa0Jhc2U2NFBhZGRpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgYW5kcm9pZDo6c3A8QUJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmRlY29kZUJhc2U2NChBU3RyaW5nKHBhZGRlZFRleHQuc3RyaW5nKCkpKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBjb250ZW50IGZvdW5kLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZGVjb2RlZFRleHQtPmFwcGVuZEFycmF5KGJ1ZmZlci0+YmFzZSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSnNvbldlYktleTo6ZmluZEtleShjb25zdCBTdHJpbmc4JiBqc29uT2JqZWN0LCBTdHJpbmc4KiBrZXlJZCwKKyAgICAgICAgU3RyaW5nOCogZW5jb2RlZEtleSkgeworCisgICAgU3RyaW5nOCBrZXksIHZhbHVlOworCisgICAgLy8gT25seSBhbGxvdyBzeW1tZXRyaWMga2V5LCBpLmUuICJrdHkiOiJvY3QiIHBhaXIuCisgICAgaWYgKGpzb25PYmplY3QuZmluZChrS2V5VHlwZVRhZykgPj0gMCkgeworICAgICAgICBmaW5kVmFsdWUoa0tleVR5cGVUYWcsICZ2YWx1ZSk7CisgICAgICAgIGlmICgwICE9IHZhbHVlLmNvbXBhcmUoa1N5bW1ldHJpY0tleVZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlJZFRhZykgPj0gMCkgeworICAgICAgICBmaW5kVmFsdWUoa0tleUlkVGFnLCBrZXlJZCk7CisgICAgfQorCisgICAgaWYgKGpzb25PYmplY3QuZmluZChrS2V5VGFnKSA+PSAwKSB7CisgICAgICAgIGZpbmRWYWx1ZShrS2V5VGFnLCBlbmNvZGVkS2V5KTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSnNvbldlYktleTo6ZmluZFZhbHVlKGNvbnN0IFN0cmluZzggJmtleSwgU3RyaW5nOCogdmFsdWUpIHsKKyAgICB2YWx1ZS0+Y2xlYXIoKTsKKyAgICBjb25zdCBjaGFyKiB2YWx1ZVRva2VuOworICAgIGZvciAoVmVjdG9yPFN0cmluZzg+Ojpjb25zdF9pdGVyYXRvciBuZXh0VG9rZW4gPSBtVG9rZW5zLmJlZ2luKCk7CisgICAgICAgIG5leHRUb2tlbiAhPSBtVG9rZW5zLmVuZCgpOyArK25leHRUb2tlbikgeworICAgICAgICBpZiAoMCA9PSAoKm5leHRUb2tlbikuY29tcGFyZShrZXkpKSB7CisgICAgICAgICAgICBpZiAobmV4dFRva2VuICsgMSA9PSBtVG9rZW5zLmVuZCgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdmFsdWVUb2tlbiA9ICgqKG5leHRUb2tlbiArIDEpKS5zdHJpbmcoKTsKKyAgICAgICAgICAgIHZhbHVlLT5zZXRUbyh2YWx1ZVRva2VuKTsKKyAgICAgICAgICAgIG5leHRUb2tlbisrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgSnNvbldlYktleTo6aXNKc29uV2ViS2V5U2V0KGNvbnN0IFN0cmluZzgmIGpzb25PYmplY3QpIGNvbnN0IHsKKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlzVGFnKSA9PSAtMSkgeworICAgICAgICBBTE9HRSgiSlNPTiBXZWIgS2V5IGRvZXMgbm90IGNvbnRhaW4ga2V5cy4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFBhcnNlcyBhIEpTT04gb2JqZWN0cyBzdHJpbmcgYW5kIGluaXRpYWxpemVzIGEgdmVjdG9yIG9mIHRva2Vucy4KKyAqCisgKiBAcmV0dXJuIFJldHVybnMgZmFsc2UgZm9yIGVycm9ycywgdHJ1ZSBmb3Igc3VjY2Vzcy4KKyAqLworYm9vbCBKc29uV2ViS2V5OjpwYXJzZUpzb25PYmplY3QoY29uc3QgU3RyaW5nOCYganNvbk9iamVjdCwKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+KiB0b2tlbnMpIHsKKyAgICBqc21uX3BhcnNlciBwYXJzZXI7CisKKyAgICBqc21uX2luaXQoJnBhcnNlcik7CisgICAgaW50IG51bVRva2VucyA9IGpzbW5fcGFyc2UoJnBhcnNlciwKKyAgICAgICAganNvbk9iamVjdC5zdHJpbmcoKSwganNvbk9iamVjdC5zaXplKCksIE5VTEwsIDApOworICAgIGlmIChudW1Ub2tlbnMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJQYXJzZXIgcmV0dXJucyBlcnJvciBjb2RlPSVkIiwgbnVtVG9rZW5zKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuc2lnbmVkIGludCBqc21uVG9rZW5zU2l6ZSA9IG51bVRva2VucyAqIHNpemVvZihqc21udG9rX3QpOworICAgIG1Kc21uVG9rZW5zLmNsZWFyKCk7CisgICAgbUpzbW5Ub2tlbnMuc2V0Q2FwYWNpdHkoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25PYmplY3Quc3RyaW5nKCksCisgICAgICAgIGpzb25PYmplY3Quc2l6ZSgpLCBtSnNtblRva2Vucy5lZGl0QXJyYXkoKSwgbnVtVG9rZW5zKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0b2tlbnMtPmNsZWFyKCk7CisgICAgU3RyaW5nOCB0b2tlbjsKKyAgICBjb25zdCBjaGFyICpwanM7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1Ub2tlbnM7ICsraikgeworICAgICAgICBwanMgPSBqc29uT2JqZWN0LnN0cmluZygpICsgbUpzbW5Ub2tlbnNbal0uc3RhcnQ7CisgICAgICAgIGlmIChtSnNtblRva2Vuc1tqXS50eXBlID09IEpTTU5fU1RSSU5HIHx8CisgICAgICAgICAgICAgICAgbUpzbW5Ub2tlbnNbal0udHlwZSA9PSBKU01OX1BSSU1JVElWRSkgeworICAgICAgICAgICAgdG9rZW4uc2V0VG8ocGpzLCBtSnNtblRva2Vuc1tqXS5lbmQgLSBtSnNtblRva2Vuc1tqXS5zdGFydCk7CisgICAgICAgICAgICB0b2tlbnMtPmFkZCh0b2tlbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBQYXJzZXMgSlNPTiBXZWIgS2V5IFNldCBzdHJpbmcgYW5kIGluaXRpYWxpemVzIGEgdmVjdG9yIG9mIEpTT04gb2JqZWN0cy4KKyAqCisgKiBAcmV0dXJuIFJldHVybnMgZmFsc2UgZm9yIGVycm9ycywgdHJ1ZSBmb3Igc3VjY2Vzcy4KKyAqLworYm9vbCBKc29uV2ViS2V5OjpwYXJzZUpzb25XZWJLZXlTZXQoY29uc3QgU3RyaW5nOCYganNvbldlYktleVNldCwKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+KiBqc29uT2JqZWN0cykgeworICAgIGlmIChqc29uV2ViS2V5U2V0LmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiRW1wdHkgSlNPTiBXZWIgS2V5Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGUganNtbiBwYXJzZXIgb25seSBzdXBwb3J0cyB1bmljb2RlIGVuY29kaW5nLgorICAgIGpzbW5fcGFyc2VyIHBhcnNlcjsKKworICAgIC8vIENvbXB1dGVzIG51bWJlciBvZiB0b2tlbnMuIEEgdG9rZW4gbWFya3MgdGhlIHR5cGUsIG9mZnNldCBpbgorICAgIC8vIHRoZSBvcmlnaW5hbCBzdHJpbmcuCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBudW1Ub2tlbnMgPSBqc21uX3BhcnNlKCZwYXJzZXIsCisgICAgICAgICAgICBqc29uV2ViS2V5U2V0LnN0cmluZygpLCBqc29uV2ViS2V5U2V0LnNpemUoKSwgTlVMTCwgMCk7CisgICAgaWYgKG51bVRva2VucyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBudW1Ub2tlbnMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IGpzbW5Ub2tlbnNTaXplID0gbnVtVG9rZW5zICogc2l6ZW9mKGpzbW50b2tfdCk7CisgICAgbUpzbW5Ub2tlbnMuc2V0Q2FwYWNpdHkoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25XZWJLZXlTZXQuc3RyaW5nKCksCisgICAgICAgICAgICBqc29uV2ViS2V5U2V0LnNpemUoKSwgbUpzbW5Ub2tlbnMuZWRpdEFycmF5KCksIG51bVRva2Vucyk7CisgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nOCB0b2tlbjsKKyAgICBjb25zdCBjaGFyICpwanM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Ub2tlbnM7ICsraSkgeworICAgICAgICBwanMgPSBqc29uV2ViS2V5U2V0LnN0cmluZygpICsgbUpzbW5Ub2tlbnNbaV0uc3RhcnQ7CisgICAgICAgIGlmIChtSnNtblRva2Vuc1tpXS50eXBlID09IEpTTU5fT0JKRUNUKSB7CisgICAgICAgICAgICB0b2tlbi5zZXRUbyhwanMsIG1Kc21uVG9rZW5zW2ldLmVuZCAtIG1Kc21uVG9rZW5zW2ldLnN0YXJ0KTsKKyAgICAgICAgICAgIGpzb25PYmplY3RzLT5hZGQodG9rZW4pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZTUwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Kc29uV2ViS2V5LmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIENMRUFSS0VZX0pTT05fV0VCX0tFWV9IXworI2RlZmluZSBDTEVBUktFWV9KU09OX1dFQl9LRVlfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlICJqc21uLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OktleWVkVmVjdG9yOwordXNpbmcgYW5kcm9pZDo6c3A7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOworCitjbGFzcyBKc29uV2ViS2V5IHsKKyBwdWJsaWM6CisgICAgSnNvbldlYktleSgpOworICAgIHZpcnR1YWwgfkpzb25XZWJLZXkoKTsKKworICAgIGJvb2wgZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChjb25zdCBTdHJpbmc4JiBqc29uV2ViS2V5U2V0LAorICAgICAgICAgICAgS2V5TWFwKiBrZXlzKTsKKworIHByaXZhdGU6CisgICAgVmVjdG9yPGpzbW50b2tfdD4gbUpzbW5Ub2tlbnM7CisgICAgVmVjdG9yPFN0cmluZzg+IG1Kc29uT2JqZWN0czsKKyAgICBWZWN0b3I8U3RyaW5nOD4gbVRva2VuczsKKworICAgIGJvb2wgZGVjb2RlQmFzZTY0U3RyaW5nKGNvbnN0IFN0cmluZzgmIGVuY29kZWRUZXh0LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBkZWNvZGVkVGV4dCk7CisgICAgYm9vbCBmaW5kS2V5KGNvbnN0IFN0cmluZzgmIGpzb25PYmplY3QsIFN0cmluZzgqIGtleUlkLAorICAgICAgICAgICAgU3RyaW5nOCogZW5jb2RlZEtleSk7CisgICAgdm9pZCBmaW5kVmFsdWUoY29uc3QgU3RyaW5nOCAma2V5LCBTdHJpbmc4KiB2YWx1ZSk7CisgICAgYm9vbCBpc0pzb25XZWJLZXlTZXQoY29uc3QgU3RyaW5nOCYganNvbk9iamVjdCkgY29uc3Q7CisgICAgYm9vbCBwYXJzZUpzb25PYmplY3QoY29uc3QgU3RyaW5nOCYganNvbk9iamVjdCwgVmVjdG9yPFN0cmluZzg+KiB0b2tlbnMpOworICAgIGJvb2wgcGFyc2VKc29uV2ViS2V5U2V0KGNvbnN0IFN0cmluZzgmIGpzb25XZWJLZXlTZXQsIFZlY3RvcjxTdHJpbmc4PioganNvbk9iamVjdHMpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSnNvbldlYktleSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmICAvLyBDTEVBUktFWV9KU09OX1dFQl9LRVlfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwMTZmNQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisKKyNpbmNsdWRlICJBZXNDdHJEZWNyeXB0b3IuaCIKKyNpbmNsdWRlICJJbml0RGF0YVBhcnNlci5oIgorI2luY2x1ZGUgIkpzb25XZWJLZXkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6TXV0ZXg7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOwordXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7CisKK3N0YXR1c190IFNlc3Npb246OmdldEtleVJlcXVlc3QoCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdCB7CisgICAgSW5pdERhdGFQYXJzZXIgcGFyc2VyOworICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIGluaXREYXRhVHlwZSwga2V5UmVxdWVzdCk7Cit9CisKK3N0YXR1c190IFNlc3Npb246OnByb3ZpZGVLZXlSZXNwb25zZShjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlKSB7CisgICAgU3RyaW5nOCByZXNwb25zZVN0cmluZygKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmFycmF5KCkpLCByZXNwb25zZS5zaXplKCkpOworICAgIEtleU1hcCBrZXlzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOworICAgIEpzb25XZWJLZXkgcGFyc2VyOworICAgIGlmIChwYXJzZXIuZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChyZXNwb25zZVN0cmluZywgJmtleXMpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgS2V5TWFwOjprZXlfdHlwZSYga2V5SWQgPSBrZXlzLmtleUF0KGkpOworICAgICAgICAgICAgY29uc3QgS2V5TWFwOjp2YWx1ZV90eXBlJiBrZXkgPSBrZXlzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBtS2V5TWFwLmFkZChrZXlJZCwga2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9VTktOT1dOOworICAgIH0KK30KKworc3RhdHVzX3QgU2Vzc2lvbjo6ZGVjcnlwdCgKKyAgICAgICAgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LCBjb25zdCB2b2lkKiBzb3VyY2UsCisgICAgICAgIHZvaWQqIGRlc3RpbmF0aW9uLCBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCisgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLCBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleUlkVmVjdG9yOworICAgIGtleUlkVmVjdG9yLmFwcGVuZEFycmF5KGtleUlkLCBrQmxvY2tTaXplKTsKKyAgICBpZiAobUtleU1hcC5pbmRleE9mS2V5KGtleUlkVmVjdG9yKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgIH0KKworICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5ID0gbUtleU1hcC52YWx1ZUZvcihrZXlJZFZlY3Rvcik7CisgICAgQWVzQ3RyRGVjcnlwdG9yIGRlY3J5cHRvcjsKKyAgICByZXR1cm4gZGVjcnlwdG9yLmRlY3J5cHQoCisgICAgICAgICAgICBrZXksIGl2LAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oc291cmNlKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRlc3RpbmF0aW9uKSwgc3ViU2FtcGxlcywKKyAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsIGJ5dGVzRGVjcnlwdGVkT3V0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWIwZGMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbi5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX1NFU1NJT05fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfU0VTU0lPTl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBTZXNzaW9uIDogcHVibGljIGFuZHJvaWQ6OlJlZkJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNlc3Npb24oY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpCisgICAgICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSB7fQorICAgIHZpcnR1YWwgflNlc3Npb24oKSB7fQorCisgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQoKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbklkOyB9CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBnZXRLZXlSZXF1ZXN0KAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90Pioga2V5UmVxdWVzdCkgY29uc3Q7CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlKTsKKworICAgIGFuZHJvaWQ6OnN0YXR1c190IGRlY3J5cHQoCisgICAgICAgICAgICBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHZvaWQqIHNvdXJjZSwKKyAgICAgICAgICAgIHZvaWQqIGRlc3RpbmF0aW9uLCBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCisgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vzc2lvbik7CisKKyAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDsKKworICAgIGFuZHJvaWQ6Ok11dGV4IG1NYXBMb2NrOworICAgIEtleU1hcCBtS2V5TWFwOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX1NFU1NJT05fSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQ3YzUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6TXV0ZXg7Cit1c2luZyBhbmRyb2lkOjpzcDsKK3VzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Cit1c2luZyBhbmRyb2lkOjpWZWN0b3I7CisKK011dGV4IFNlc3Npb25MaWJyYXJ5OjpzU2luZ2xldG9uTG9jazsKK1Nlc3Npb25MaWJyYXJ5KiBTZXNzaW9uTGlicmFyeTo6c1NpbmdsZXRvbiA9IE5VTEw7CisKK1Nlc3Npb25MaWJyYXJ5KiBTZXNzaW9uTGlicmFyeTo6Z2V0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNTaW5nbGV0b25Mb2NrKTsKKworICAgIGlmIChzU2luZ2xldG9uID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0QoIkluc3RhbnRpYXRpbmcgU2Vzc2lvbiBMaWJyYXJ5IFNpbmdsZXRvbi4iKTsKKyAgICAgICAgc1NpbmdsZXRvbiA9IG5ldyBTZXNzaW9uTGlicmFyeSgpOworICAgIH0KKworICAgIHJldHVybiBzU2luZ2xldG9uOworfQorCitjb25zdCBzcDxTZXNzaW9uPiYgU2Vzc2lvbkxpYnJhcnk6OmNyZWF0ZVNlc3Npb24oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7CisKKyAgICBTdHJpbmc4IHNlc3Npb25JZFN0cmluZyA9IFN0cmluZzg6OmZvcm1hdCgiJXUiLCBtTmV4dFNlc3Npb25JZCk7CisgICAgbU5leHRTZXNzaW9uSWQgKz0gMTsKKyAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgIHNlc3Npb25JZC5hcHBlbmRBcnJheSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNlc3Npb25JZFN0cmluZy5zdHJpbmcoKSksCisgICAgICAgICAgICBzZXNzaW9uSWRTdHJpbmcuc2l6ZSgpKTsKKworICAgIG1TZXNzaW9ucy5hZGQoc2Vzc2lvbklkLCBuZXcgU2Vzc2lvbihzZXNzaW9uSWQpKTsKKyAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb25JZCk7Cit9CisKK2NvbnN0IHNwPFNlc3Npb24+JiBTZXNzaW9uTGlicmFyeTo6ZmluZFNlc3Npb24oCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7CisgICAgcmV0dXJuIG1TZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uSWQpOworfQorCitjb25zdCBzcDxTZXNzaW9uPiYgU2Vzc2lvbkxpYnJhcnk6OmZpbmRTZXNzaW9uKAorICAgICAgICBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc2Vzc2lvbklkLmFwcGVuZEFycmF5KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpLCBzaXplKTsKKyAgICByZXR1cm4gZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKK30KKwordm9pZCBTZXNzaW9uTGlicmFyeTo6ZGVzdHJveVNlc3Npb24oY29uc3Qgc3A8U2Vzc2lvbj4mIHNlc3Npb24pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTtcCisgICAgbVNlc3Npb25zLnJlbW92ZUl0ZW0oc2Vzc2lvbi0+c2Vzc2lvbklkKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjODgyOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfU0VTU0lPTl9MSUJSQVJZX0hfCisjZGVmaW5lIENMRUFSS0VZX1NFU1NJT05fTElCUkFSWV9IXworCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIlNlc3Npb24uaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBTZXNzaW9uTGlicmFyeSB7CitwdWJsaWM6CisgICAgc3RhdGljIFNlc3Npb25MaWJyYXJ5KiBnZXQoKTsKKworICAgIGNvbnN0IGFuZHJvaWQ6OnNwPFNlc3Npb24+JiBjcmVhdGVTZXNzaW9uKCk7CisKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgZmluZFNlc3Npb24oCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CisKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgZmluZFNlc3Npb24oY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdm9pZCBkZXN0cm95U2Vzc2lvbihjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgc2Vzc2lvbik7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vzc2lvbkxpYnJhcnkpOworCisgICAgU2Vzc2lvbkxpYnJhcnkoKSA6IG1OZXh0U2Vzc2lvbklkKDEpIHt9CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6TXV0ZXggc1NpbmdsZXRvbkxvY2s7CisgICAgc3RhdGljIFNlc3Npb25MaWJyYXJ5KiBzU2luZ2xldG9uOworCisgICAgYW5kcm9pZDo6TXV0ZXggbVNlc3Npb25zTG9jazsKKyAgICB1aW50MzJfdCBtTmV4dFNlc3Npb25JZDsKKyAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4sIGFuZHJvaWQ6OnNwPFNlc3Npb24+ID4KKyAgICAgICAgICAgIG1TZXNzaW9uczsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9TRVNTSU9OX0xJQlJBUllfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1V0aWxzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2M2NDNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIG9wZXJhdG9yPChjb25zdCBWZWN0b3I8dWludDhfdD4gJmxocywgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZyaHMpIHsKKyAgICBpZiAobGhzLnNpemUoKSA8IHJocy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChsaHMuc2l6ZSgpID4gcmhzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtZW1jbXAoKHZvaWQgKilsaHMuYXJyYXkoKSwgKHZvaWQgKilyaHMuYXJyYXkoKSwgcmhzLnNpemUoKSkgPCAwOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9VdGlscy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTQzMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9VVElMU19IXworI2RlZmluZSBDTEVBUktFWV9VVElMU19IXworCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKy8vIEFkZCBhIGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIHRoaXMgVmVjdG9yIHNwZWNpYWxpemF0aW9uIHNvIHRoYXQgaXQgY2FuIGJlCisvLyB1c2VkIGFzIGEga2V5IGluIGEgS2V5ZWRWZWN0b3IuCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgb3BlcmF0b3I8KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbGhzLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnJocyk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpOworCisjZW5kaWYgLy8gQ0xFQVJLRVlfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0Flc0N0ckRlY3J5cHRvclVuaXR0ZXN0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0Flc0N0ckRlY3J5cHRvclVuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzllNDAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQWVzQ3RyRGVjcnlwdG9yVW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJBZXNDdHJEZWNyeXB0b3IuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIEFlc0N0ckRlY3J5cHRvclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgdWludDhfdCBLZXlba0Jsb2NrU2l6ZV07CisKKyAgICBzdGF0dXNfdCBhdHRlbXB0RGVjcnlwdChjb25zdCBLZXkmIGtleSwgY29uc3QgSXYmIGl2LCBjb25zdCB1aW50OF90KiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdGluYXRpb24sIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCkgeworICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5VmVjdG9yOworICAgICAgICBrZXlWZWN0b3IuYXBwZW5kQXJyYXkoa2V5LCBrQmxvY2tTaXplKTsKKworICAgICAgICBBZXNDdHJEZWNyeXB0b3IgZGVjcnlwdG9yOworICAgICAgICByZXR1cm4gZGVjcnlwdG9yLmRlY3J5cHQoa2V5VmVjdG9yLCBpdiwgc291cmNlLCBkZXN0aW5hdGlvbiwgc3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsIGJ5dGVzRGVjcnlwdGVkT3V0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IHRvdGFsU2l6ZT4KKyAgICB2b2lkIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2Vzcyhjb25zdCBLZXkmIGtleSwgY29uc3QgSXYmIGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGVuY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkZWNyeXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ViU2FtcGxlKiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzKSB7CisgICAgICAgIHVpbnQ4X3Qgb3V0cHV0QnVmZmVyW3RvdGFsU2l6ZV0gPSB7fTsKKyAgICAgICAgc2l6ZV90IGJ5dGVzRGVjcnlwdGVkID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKGFuZHJvaWQ6Ok9LLCBhdHRlbXB0RGVjcnlwdChrZXksIGl2LCBlbmNyeXB0ZWQsIG91dHB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc0RlY3J5cHRlZCkpOworICAgICAgICBFWFBFQ1RfRVEodG90YWxTaXplLCBieXRlc0RlY3J5cHRlZCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAob3V0cHV0QnVmZmVyLCBkZWNyeXB0ZWQsIHRvdGFsU2l6ZSkpOworICAgIH0KK307CisKK1RFU1RfRihBZXNDdHJEZWNyeXB0b3JUZXN0LCBEZWNyeXB0c0NvbnRpZ3VvdXNFbmNyeXB0ZWRCbG9jaykgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gNjQ7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMTsKKworICAgIC8vIFRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsIDB4ZDMsIDB4NWUsCisgICAgICAgIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsIDB4M2UsIDB4YWIsCisgICAgICAgIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsIDB4MDMsIDB4ZDEsCisgICAgICAgIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7MCwgNjR9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNBbGlnbmVkQmlmdXJjYXRlZEVuY3J5cHRlZEJsb2NrKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUb3RhbFNpemUgPSA2NDsKKyAgICBjb25zdCBzaXplX3Qga051bVN1YnNhbXBsZXMgPSAyOworCisgICAgLy8gVGVzdCB2ZWN0b3JzIGZyb20gTklTVC04MDAtMzhBCisgICAgS2V5IGtleSA9IHsKKyAgICAgICAgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYworICAgIH07CisKKyAgICBJdiBpdiA9IHsKKyAgICAgICAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywKKyAgICAgICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorICAgIH07CisKKyAgICB1aW50OF90IGVuY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHg4NywgMHg0ZCwgMHg2MSwgMHg5MSwgMHhiNiwgMHgyMCwgMHhlMywgMHgyNiwKKyAgICAgICAgMHgxYiwgMHhlZiwgMHg2OCwgMHg2NCwgMHg5OSwgMHgwZCwgMHhiNiwgMHhjZSwKKyAgICAgICAgMHg5OCwgMHgwNiwgMHhmNiwgMHg2YiwgMHg3OSwgMHg3MCwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg4NiwgMHgxNywgMHgxOCwgMHg3YiwgMHhiOSwgMHhmZiwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg1YSwgMHhlNCwgMHhkZiwgMHgzZSwgMHhkYiwgMHhkNSwgMHhkMywgMHg1ZSwKKyAgICAgICAgMHg1YiwgMHg0ZiwgMHgwOSwgMHgwMiwgMHgwZCwgMHhiMCwgMHgzZSwgMHhhYiwKKyAgICAgICAgMHgxZSwgMHgwMywgMHgxZCwgMHhkYSwgMHgyZiwgMHhiZSwgMHgwMywgMHhkMSwKKyAgICAgICAgMHg3OSwgMHgyMSwgMHg3MCwgMHhhMCwgMHhmMywgMHgwMCwgMHg5YywgMHhlZQorICAgIH07CisKKyAgICB1aW50OF90IGRlY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwKKyAgICAgICAgMHhlOSwgMHgzZCwgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwKKyAgICAgICAgMHhhZSwgMHgyZCwgMHg4YSwgMHg1NywgMHgxZSwgMHgwMywgMHhhYywgMHg5YywKKyAgICAgICAgMHg5ZSwgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwgMHg4ZSwgMHg1MSwKKyAgICAgICAgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywgMHhlNCwgMHgxMSwKKyAgICAgICAgMHhlNSwgMHhmYiwgMHhjMSwgMHgxOSwgMHgxYSwgMHgwYSwgMHg1MiwgMHhlZiwKKyAgICAgICAgMHhmNiwgMHg5ZiwgMHgyNCwgMHg0NSwgMHhkZiwgMHg0ZiwgMHg5YiwgMHgxNywKKyAgICAgICAgMHhhZCwgMHgyYiwgMHg0MSwgMHg3YiwgMHhlNiwgMHg2YywgMHgzNywgMHgxMAorICAgIH07CisKKyAgICBTdWJTYW1wbGUgc3ViU2FtcGxlc1trTnVtU3Vic2FtcGxlc10gPSB7CisgICAgICAgIHswLCAzMn0sCisgICAgICAgIHswLCAzMn0KKyAgICB9OworCisgICAgYXR0ZW1wdERlY3J5cHRFeHBlY3RpbmdTdWNjZXNzPGtUb3RhbFNpemU+KGtleSwgaXYsIGVuY3J5cHRlZCwgZGVjcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBrTnVtU3Vic2FtcGxlcyk7Cit9CisKK1RFU1RfRihBZXNDdHJEZWNyeXB0b3JUZXN0LCBEZWNyeXB0c1VuYWxpZ25lZEJpZnVyY2F0ZWRFbmNyeXB0ZWRCbG9jaykgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gNjQ7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMjsKKworICAgIC8vIFRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsIDB4ZDMsIDB4NWUsCisgICAgICAgIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsIDB4M2UsIDB4YWIsCisgICAgICAgIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsIDB4MDMsIDB4ZDEsCisgICAgICAgIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7MCwgMjl9LAorICAgICAgICB7MCwgMzV9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNPbmVNaXhlZFN1YlNhbXBsZSkgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gNzI7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMTsKKworICAgIC8vIEJhc2VkIG9uIHRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIC8vIDggY2xlYXIgYnl0ZXMKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywgMHgwMCwgMHg2NCwgMHgwYiwgMHhiYiwKKyAgICAgICAgLy8gNjQgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsIDB4ZDMsIDB4NWUsCisgICAgICAgIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsIDB4M2UsIDB4YWIsCisgICAgICAgIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsIDB4MDMsIDB4ZDEsCisgICAgICAgIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsIDB4MDAsIDB4NjQsIDB4MGIsIDB4YmIsCisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7OCwgNjR9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNBbGlnbmVkTWl4ZWRTdWJTYW1wbGVzKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUb3RhbFNpemUgPSA4MDsKKyAgICBjb25zdCBzaXplX3Qga051bVN1YnNhbXBsZXMgPSAyOworCisgICAgLy8gQmFzZWQgb24gdGVzdCB2ZWN0b3JzIGZyb20gTklTVC04MDAtMzhBCisgICAgS2V5IGtleSA9IHsKKyAgICAgICAgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYworICAgIH07CisKKyAgICBJdiBpdiA9IHsKKyAgICAgICAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywKKyAgICAgICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorICAgIH07CisKKyAgICB1aW50OF90IGVuY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgLy8gOCBjbGVhciBieXRlcworICAgICAgICAweGYwLCAweDEzLCAweGNhLCAweGM3LCAweDAwLCAweDY0LCAweDBiLCAweGJiLAorICAgICAgICAvLyAzMiBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHg4NywgMHg0ZCwgMHg2MSwgMHg5MSwgMHhiNiwgMHgyMCwgMHhlMywgMHgyNiwKKyAgICAgICAgMHgxYiwgMHhlZiwgMHg2OCwgMHg2NCwgMHg5OSwgMHgwZCwgMHhiNiwgMHhjZSwKKyAgICAgICAgMHg5OCwgMHgwNiwgMHhmNiwgMHg2YiwgMHg3OSwgMHg3MCwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg4NiwgMHgxNywgMHgxOCwgMHg3YiwgMHhiOSwgMHhmZiwgMHhmZCwgMHhmZiwKKyAgICAgICAgLy8gOCBjbGVhciBieXRlcworICAgICAgICAweDk0LCAweGJhLCAweDg4LCAweDJlLCAweDBlLCAweDEyLCAweDExLCAweDU1LAorICAgICAgICAvLyAzMiBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHg1YSwgMHhlNCwgMHhkZiwgMHgzZSwgMHhkYiwgMHhkNSwgMHhkMywgMHg1ZSwKKyAgICAgICAgMHg1YiwgMHg0ZiwgMHgwOSwgMHgwMiwgMHgwZCwgMHhiMCwgMHgzZSwgMHhhYiwKKyAgICAgICAgMHgxZSwgMHgwMywgMHgxZCwgMHhkYSwgMHgyZiwgMHhiZSwgMHgwMywgMHhkMSwKKyAgICAgICAgMHg3OSwgMHgyMSwgMHg3MCwgMHhhMCwgMHhmMywgMHgwMCwgMHg5YywgMHhlZQorICAgIH07CisKKyAgICB1aW50OF90IGRlY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywgMHgwMCwgMHg2NCwgMHgwYiwgMHhiYiwKKyAgICAgICAgMHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwKKyAgICAgICAgMHhlOSwgMHgzZCwgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwKKyAgICAgICAgMHhhZSwgMHgyZCwgMHg4YSwgMHg1NywgMHgxZSwgMHgwMywgMHhhYywgMHg5YywKKyAgICAgICAgMHg5ZSwgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwgMHg4ZSwgMHg1MSwKKyAgICAgICAgMHg5NCwgMHhiYSwgMHg4OCwgMHgyZSwgMHgwZSwgMHgxMiwgMHgxMSwgMHg1NSwKKyAgICAgICAgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywgMHhlNCwgMHgxMSwKKyAgICAgICAgMHhlNSwgMHhmYiwgMHhjMSwgMHgxOSwgMHgxYSwgMHgwYSwgMHg1MiwgMHhlZiwKKyAgICAgICAgMHhmNiwgMHg5ZiwgMHgyNCwgMHg0NSwgMHhkZiwgMHg0ZiwgMHg5YiwgMHgxNywKKyAgICAgICAgMHhhZCwgMHgyYiwgMHg0MSwgMHg3YiwgMHhlNiwgMHg2YywgMHgzNywgMHgxMAorICAgIH07CisKKyAgICBTdWJTYW1wbGUgc3ViU2FtcGxlc1trTnVtU3Vic2FtcGxlc10gPSB7CisgICAgICAgIHs4LCAzMn0sCisgICAgICAgIHs4LCAzMn0KKyAgICB9OworCisgICAgYXR0ZW1wdERlY3J5cHRFeHBlY3RpbmdTdWNjZXNzPGtUb3RhbFNpemU+KGtleSwgaXYsIGVuY3J5cHRlZCwgZGVjcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBrTnVtU3Vic2FtcGxlcyk7Cit9CisKK1RFU1RfRihBZXNDdHJEZWNyeXB0b3JUZXN0LCBEZWNyeXB0c1VuYWxpZ25lZE1peGVkU3ViU2FtcGxlcykgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gODA7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMjsKKworICAgIC8vIEJhc2VkIG9uIHRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIC8vIDggY2xlYXIgYnl0ZXMKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywgMHgwMCwgMHg2NCwgMHgwYiwgMHhiYiwKKyAgICAgICAgLy8gMzAgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsCisgICAgICAgIC8vIDggY2xlYXIgYnl0ZXMKKyAgICAgICAgMHg5NCwgMHhiYSwgMHg4OCwgMHgyZSwgMHgwZSwgMHgxMiwgMHgxMSwgMHg1NSwKKyAgICAgICAgLy8gMzQgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4ZmQsIDB4ZmYsIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsCisgICAgICAgIDB4ZDMsIDB4NWUsIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsCisgICAgICAgIDB4M2UsIDB4YWIsIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsCisgICAgICAgIDB4MDMsIDB4ZDEsIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsCisgICAgICAgIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsIDB4MDAsIDB4NjQsIDB4MGIsIDB4YmIsCisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OTQsIDB4YmEsCisgICAgICAgIDB4ODgsIDB4MmUsIDB4MGUsIDB4MTIsIDB4MTEsIDB4NTUsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7OCwgMzB9LAorICAgICAgICB7OCwgMzR9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNDb21wbGV4TWl4ZWRTdWJTYW1wbGVzKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUb3RhbFNpemUgPSA3MjsKKyAgICBjb25zdCBzaXplX3Qga051bVN1YnNhbXBsZXMgPSA2OworCisgICAgLy8gQmFzZWQgb24gdGVzdCB2ZWN0b3JzIGZyb20gTklTVC04MDAtMzhBCisgICAgS2V5IGtleSA9IHsKKyAgICAgICAgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYworICAgIH07CisKKyAgICBJdiBpdiA9IHsKKyAgICAgICAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywKKyAgICAgICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorICAgIH07CisKKyAgICB1aW50OF90IGVuY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgLy8gNCBjbGVhciBieXRlcworICAgICAgICAweGYwLCAweDEzLCAweGNhLCAweGM3LAorICAgICAgICAvLyAxIGVuY3J5cHRlZCBieXRlcworICAgICAgICAweDg3LAorICAgICAgICAvLyA5IGVuY3J5cHRlZCBieXRlcworICAgICAgICAweDRkLCAweDYxLCAweDkxLCAweGI2LCAweDIwLCAweGUzLCAweDI2LCAweDFiLAorICAgICAgICAweGVmLAorICAgICAgICAvLyAxMSBjbGVhciBieXRlcworICAgICAgICAweDgxLCAweDRmLCAweDI0LCAweDg3LCAweDBlLCAweGRlLCAweGJhLCAweGFkLAorICAgICAgICAweDExLCAweDliLCAweDQ2LAorICAgICAgICAvLyAyMCBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHg2OCwgMHg2NCwgMHg5OSwgMHgwZCwgMHhiNiwgMHhjZSwKKyAgICAgICAgMHg5OCwgMHgwNiwgMHhmNiwgMHg2YiwgMHg3OSwgMHg3MCwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg4NiwgMHgxNywgMHgxOCwgMHg3YiwgMHhiOSwgMHhmZiwKKyAgICAgICAgLy8gOCBjbGVhciBieXRlcworICAgICAgICAweDk0LCAweGJhLCAweDg4LCAweDJlLCAweDBlLCAweDEyLCAweDExLCAweDU1LAorICAgICAgICAvLyAzIGNsZWFyIGJ5dGVzCisgICAgICAgIDB4MTAsIDB4ZjUsIDB4MjIsCisgICAgICAgIC8vIDE0IGVuY3J5cHRlZCBieXRlcworICAgICAgICAweGZkLCAweGZmLCAweDVhLCAweGU0LCAweGRmLCAweDNlLCAweGRiLCAweGQ1LAorICAgICAgICAweGQzLCAweDVlLCAweDViLCAweDRmLCAweDA5LCAweDAyLAorICAgICAgICAvLyAyIGNsZWFyIGJ5dGVzCisgICAgICAgIDB4MDIsIDB4MDEKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsCisgICAgICAgIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsIDB4ZTksIDB4M2QsIDB4ODEsIDB4NGYsCisgICAgICAgIDB4MjQsIDB4ODcsIDB4MGUsIDB4ZGUsIDB4YmEsIDB4YWQsIDB4MTEsIDB4OWIsCisgICAgICAgIDB4NDYsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsIDB4YWUsCisgICAgICAgIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsIDB4OWUsCisgICAgICAgIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OTQsIDB4YmEsIDB4ODgsCisgICAgICAgIDB4MmUsIDB4MGUsIDB4MTIsIDB4MTEsIDB4NTUsIDB4MTAsIDB4ZjUsIDB4MjIsCisgICAgICAgIDB4OGUsIDB4NTEsIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsCisgICAgICAgIDB4ZTQsIDB4MTEsIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MDIsIDB4MDEKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7NCwgMX0sCisgICAgICAgIHswLCA5fSwKKyAgICAgICAgezExLCAyMH0sCisgICAgICAgIHs4LCAwfSwKKyAgICAgICAgezMsIDE0fSwKKyAgICAgICAgezIsIDB9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNWJiMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGRzIENsZWFyS2V5IERybSBUZXN0cworIworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBDbGVhcktleURybVVuaXRUZXN0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEFlc0N0ckRlY3J5cHRvclVuaXR0ZXN0LmNwcCBcCisgICAgSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAgXAorICAgIEpzb25XZWJLZXlVbml0dGVzdC5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBiaW9uaWMgXAorICAgIGV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAorICAgIGV4dGVybmFsL2pzbW4gXAorICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZSBcCisgICAgZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKKyAgICBmcmFtZXdvcmtzL2F2L2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5IFwKKyAgICBmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAorICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUgXAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJndGVzdCBcCisgICAgbGliZ3Rlc3RfbWFpbiBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmNyeXB0byBcCisgICAgbGliZHJtY2xlYXJrZXlwbHVnaW4gXAorICAgIGxpYmxvZyBcCisgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgbGlic3RscG9ydCBcCisgICAgbGlidXRpbHMgXAorCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Jbml0RGF0YVBhcnNlclVuaXR0ZXN0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0luaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTY1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Jbml0RGF0YVBhcnNlclVuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJJbml0RGF0YVBhcnNlci5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHsKKyAgICBjb25zdCBzaXplX3Qga0tleUlkU2l6ZSA9IDE2OworICAgIGNvbnN0IFN0cmluZzgga0NlbmNUeXBlKCJjZW5jIik7CisgICAgY29uc3QgU3RyaW5nOCBrV2ViTVR5cGUoIndlYm0iKTsKKyAgICBjb25zdCBTdHJpbmc4IGtCYXNlNjRQYWRkaW5nKCI9Iik7Cit9CisKK2NsYXNzIEluaXREYXRhUGFyc2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAgc3RhdHVzX3QgYXR0ZW1wdFBhcnNlKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCkgeworICAgICAgICBJbml0RGF0YVBhcnNlciBwYXJzZXI7CisgICAgICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIGluaXREYXRhVHlwZSwgbGljZW5zZVJlcXVlc3QpOworICAgIH0KKworICAgIHZvaWQgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nU3VjY2Vzcyhjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxTdHJpbmc4PiYgZXhwZWN0ZWRLZXlzKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzgga1JlcXVlc3RQcmVmaXgoIntcImtpZHNcIjpbIik7CisgICAgICAgIGNvbnN0IFN0cmluZzgga1JlcXVlc3RTdWZmaXgoIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7CisgICAgICAgIEFTU0VSVF9FUShhbmRyb2lkOjpPSywgYXR0ZW1wdFBhcnNlKGluaXREYXRhLCBpbml0RGF0YVR5cGUsICZyZXF1ZXN0KSk7CisKKyAgICAgICAgU3RyaW5nOCByZXF1ZXN0U3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlcXVlc3QuYXJyYXkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCByZXF1ZXN0U3RyaW5nLmZpbmQoa1JlcXVlc3RQcmVmaXgpKTsKKyAgICAgICAgRVhQRUNUX0VRKHJlcXVlc3RTdHJpbmcuc2l6ZSgpIC0ga1JlcXVlc3RTdWZmaXguc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0cmluZy5maW5kKGtSZXF1ZXN0U3VmZml4KSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXhwZWN0ZWRLZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBBU3RyaW5nIGVuY29kZWRJZEFTdHJpbmc7CisgICAgICAgICAgICBhbmRyb2lkOjplbmNvZGVCYXNlNjQoZXhwZWN0ZWRLZXlzW2ldLCBrS2V5SWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGVkSWRBU3RyaW5nKTsKKyAgICAgICAgICAgIFN0cmluZzggZW5jb2RlZElkKGVuY29kZWRJZEFTdHJpbmcuY19zdHIoKSk7CisgICAgICAgICAgICBlbmNvZGVkSWQucmVtb3ZlQWxsKGtCYXNlNjRQYWRkaW5nKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHJlcXVlc3RTdHJpbmcuY29udGFpbnMoZW5jb2RlZElkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5pdERhdGFUeXBlKSB7CisgICAgICAgIFZlY3Rvcjx1aW50OF90PiByZXF1ZXN0OworICAgICAgICBBU1NFUlRfTkUoYW5kcm9pZDo6T0ssIGF0dGVtcHRQYXJzZShpbml0RGF0YSwgaW5pdERhdGFUeXBlLCAmcmVxdWVzdCkpOworICAgICAgICBFWFBFQ1RfRVEoMCwgcmVxdWVzdC5zaXplKCkpOworICAgIH0KK307CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIFBhcnNlc1NpbmdsZUtleVBzc2gpIHsKKyAgICB1aW50OF90IHBzc2hbNTJdID0geworICAgICAgICAwLCAwLCAwLCA1MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHhhYywgMHhlMywgMHgzYywgMHgxZSwgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiwKKyAgICAgICAgMCwgMCwgMCwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDUyKTsKKworICAgIFZlY3RvcjxTdHJpbmc4PiBleHBlY3RlZEtleXM7CisgICAgZXhwZWN0ZWRLZXlzLnB1c2goU3RyaW5nOCgiMDEyMzQ1Njc4OTBBQkNERSIpKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ1N1Y2Nlc3MoaW5pdERhdGEsIGtDZW5jVHlwZSwgZXhwZWN0ZWRLZXlzKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgUGFyc2VzTXVsdGlwbGVLZXlQc3NoKSB7CisgICAgdWludDhfdCBwc3NoWzg0XSA9IHsKKyAgICAgICAgMCwgMCwgMCwgODQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG90YWwgU2l6ZQorICAgICAgICAncCcsICdzJywgJ3MnLCAnaCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQU1NICisgICAgICAgIDEsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcnNpb24KKyAgICAgICAgMHgxMCwgMHg3NywgMHhlZiwgMHhlYywgMHhjMCwgMHhiMiwgMHg0ZCwgMHgwMiwgLy8gU3lzdGVtIElECisgICAgICAgIDB4YWMsIDB4ZTMsIDB4M2MsIDB4MWUsIDB4NTIsIDB4ZTIsIDB4ZmIsIDB4NGIsCisgICAgICAgIDAsIDAsIDAsIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSBDb3VudAorICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvLyBLZXkgSUQgIzEKKyAgICAgICAgMHgzOCwgMHgzOSwgMHgzMCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgLy8gICAiMDEyMzQ1Njc4OTBBQkNERSIKKyAgICAgICAgMHg0MywgMHg2YywgMHg2NSwgMHg2MSwgMHg3MiwgMHg0YiwgMHg2NSwgMHg3OSwgLy8gS2V5IElEICMyCisgICAgICAgIDB4NDMsIDB4NmMsIDB4NjUsIDB4NjEsIDB4NzIsIDB4NGIsIDB4NjUsIDB4NzksIC8vICAgIkNsZWFyS2V5Q2xlYXJLZXkiCisgICAgICAgIDB4MjAsIDB4NDcsIDB4NGYsIDB4NGYsIDB4NDcsIDB4NGMsIDB4NDUsIDB4MjAsIC8vIEtleSBJRCAjMworICAgICAgICAweDIwLCAweDQ3LCAweDRmLCAweDRmLCAweDQ3LCAweDRjLCAweDQ1LCAweDIwLCAvLyAgICIgR09PR0xFICBHT09HTEUgIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDg0KTsKKworICAgIFZlY3RvcjxTdHJpbmc4PiBleHBlY3RlZEtleXM7CisgICAgZXhwZWN0ZWRLZXlzLnB1c2goU3RyaW5nOCgiMDEyMzQ1Njc4OTBBQkNERSIpKTsKKyAgICBleHBlY3RlZEtleXMucHVzaChTdHJpbmc4KCJDbGVhcktleUNsZWFyS2V5IikpOworICAgIGV4cGVjdGVkS2V5cy5wdXNoKFN0cmluZzgoIiBHT09HTEUgIEdPT0dMRSAiKSk7CisKKyAgICBhdHRlbXB0UGFyc2VFeHBlY3RpbmdTdWNjZXNzKGluaXREYXRhLCBrQ2VuY1R5cGUsIGV4cGVjdGVkS2V5cyk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIFBhcnNlc1dlYk0pIHsKKyAgICB1aW50OF90IGluaXREYXRhUmF3WzE2XSA9IHsKKyAgICAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLy8gS2V5IElECisgICAgICAgIDB4MzgsIDB4MzksIDB4MzAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIC8vICAgIjAxMjM0NTY3ODkwQUJDREUiCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkoaW5pdERhdGFSYXcsIDE2KTsKKworICAgIFZlY3RvcjxTdHJpbmc4PiBleHBlY3RlZEtleXM7CisgICAgZXhwZWN0ZWRLZXlzLnB1c2goU3RyaW5nOCgiMDEyMzQ1Njc4OTBBQkNERSIpKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ1N1Y2Nlc3MoaW5pdERhdGEsIGtXZWJNVHlwZSwgZXhwZWN0ZWRLZXlzKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JQc3NoVG9vU21hbGwpIHsKKyAgICB1aW50OF90IHBzc2hbMTZdID0geworICAgICAgICAwLCAwLCAwLCA1MiwKKyAgICAgICAgJ3AnLCAncycsICdzJywgJ2gnLAorICAgICAgICAxLCAwLCAwLCAwLAorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkocHNzaCwgMTYpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nRmFpbHVyZShpbml0RGF0YSwga0NlbmNUeXBlKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JXZWJNVG9vU21hbGwpIHsKKyAgICB1aW50OF90IGluaXREYXRhUmF3WzhdID0geworICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3CisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkoaW5pdERhdGFSYXcsIDgpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nRmFpbHVyZShpbml0RGF0YSwga1dlYk1UeXBlKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JQc3NoQmFkU3lzdGVtSWQpIHsKKyAgICB1aW50OF90IHBzc2hbNTJdID0geworICAgICAgICAwLCAwLCAwLCA1MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweGFjLCAweGUzLCAweDNjLCAweDFlLCAweDUyLCAweGUyLCAweGZiLCAweDRiLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHgxMCwgMHg3NywgMHhlZiwgMHhlYywgMHhjMCwgMHhiMiwgMHg0ZCwgMHgwMiwKKyAgICAgICAgMCwgMCwgMCwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDUyKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jVHlwZSk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIEZhaWxzRm9yUHNzaEJhZFNpemUpIHsKKyAgICB1aW50OF90IHBzc2hbNTJdID0geworICAgICAgICAwLCAwLCA3MCwgMjAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHhhYywgMHhlMywgMHgzYywgMHgxZSwgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiwKKyAgICAgICAgMCwgMCwgMCwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDUyKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jVHlwZSk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIEZhaWxzRm9yUHNzaFdyb25nVmVyc2lvbikgeworICAgIHVpbnQ4X3QgcHNzaFs1Ml0gPSB7CisgICAgICAgIDAsIDAsIDAsIDUyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvdGFsIFNpemUKKyAgICAgICAgJ3AnLCAncycsICdzJywgJ2gnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFNTSAorICAgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJzaW9uCisgICAgICAgIDB4MTAsIDB4NzcsIDB4ZWYsIDB4ZWMsIDB4YzAsIDB4YjIsIDB4NGQsIDB4MDIsIC8vIFN5c3RlbSBJRAorICAgICAgICAweGFjLCAweGUzLCAweDNjLCAweDFlLCAweDUyLCAweGUyLCAweGZiLCAweDRiLAorICAgICAgICAwLCAwLCAwLCAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgQ291bnQKKyAgICAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLy8gS2V5IElEICMxCisgICAgICAgIDB4MzgsIDB4MzksIDB4MzAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIC8vICAgIjAxMjM0NTY3ODkwQUJDREUiCisgICAgICAgIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgU2l6ZSAoYWx3YXlzIDApCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkocHNzaCwgNTIpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nRmFpbHVyZShpbml0RGF0YSwga0NlbmNUeXBlKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JQc3NoQmFkS2V5Q291bnQpIHsKKyAgICB1aW50OF90IHBzc2hbNTJdID0geworICAgICAgICAwLCAwLCAwLCA1MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHhhYywgMHhlMywgMHgzYywgMHgxZSwgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiwKKyAgICAgICAgMCwgMCwgMCwgNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDUyKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jVHlwZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSnNvbldlYktleVVuaXR0ZXN0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiMGQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAKQEAgLTAsMCArMSwzMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSnNvbldlYktleS5oIgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0gewordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKKworY2xhc3MgSnNvbldlYktleVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgICAgSnNvbldlYktleSogandrOworCisgICAgSnNvbldlYktleVRlc3QoKSB7CisgICAgICAgIGp3ayA9IG5ldyBKc29uV2ViS2V5OworICAgIH0KKworICAgIHZpcnR1YWwgfkpzb25XZWJLZXlUZXN0KCkgeworICAgICAgICBpZiAoandrKQorICAgICAgICAgICAgZGVsZXRlIGp3azsKKyAgICB9Cit9OworCit2b2lkIHN0cmluZ0Zyb21WZWN0b3IoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbnB1dCwKKyAgICAgICAgU3RyaW5nOCogY29udmVydGVkKSB7CisgICAgY29udmVydGVkLT5jbGVhcigpOworICAgIGlmIChpbnB1dC5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29udmVydGVkLT5hcHBlbmRGb3JtYXQoIiVjIiwgaW5wdXQuaXRlbUF0KGkpKTsKKyAgICB9Cit9CisKK3ZvaWQgdmVyaWZ5S2V5cyhjb25zdCBLZXlNYXAmIGtleXMsIGNvbnN0IFN0cmluZzgqIGNsZWFyS2V5cykgeworICAgIGlmIChrZXlzLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nOCBrZXlTdHJpbmc7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHN0cmluZ0Zyb21WZWN0b3Ioa2V5cy52YWx1ZUF0KGkpLCAma2V5U3RyaW5nKTsKKyAgICAgICAgRVhQRUNUX0VRKGtleVN0cmluZywgY2xlYXJLZXlzW2ldKTsKKyAgICB9Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgTm9TeW1tZXRyaWNLZXkpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcInJzYVwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF4XCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCIxLUdhd2dndUZ5R3JXS2F2N0FYNFZLVWdcIiIKKyAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgIn0iKTsKKworICAgIEtleU1hcCBrZXlzOworICAgIEVYUEVDVF9GQUxTRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5pc0VtcHR5KCkpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIE5vS2V5c1RhZykgeworICAgIGNvbnN0IFN0cmluZzgganMoCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAiW3siCisgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXhcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIjEtR2F3Z2d1RnlHcldLYXY3QVg0VktVZ1wiIgorICAgICAgICAgICAgICAgICJ9LCIKKyAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMlwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF5XCIiCisgICAgICAgICAgICAgICAgIn1dIgorICAgICAgICAgICAgIn0iKTsKKworICAgIEtleU1hcCBrZXlzOworICAgIEVYUEVDVF9GQUxTRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5pc0VtcHR5KCkpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIE5vS2V5SWQpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lTRT1cIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF5XCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBFWFBFQ1RfVFJVRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMSk7CisKKyAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5cygiR29vZCBkYXkhIik7CisgICAgdmVyaWZ5S2V5cyhrZXlzLCAmY2xlYXJLZXlzKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBOb0tleSkgeworICAgIGNvbnN0IFN0cmluZzgganMoCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAiXCJrZXlzXCI6IgorICAgICAgICAgICAgICAgICAgICAiW3siCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcImBcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF5XCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBFWFBFQ1RfVFJVRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMSk7CisKKyAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5cygiR29vZCBkYXkhIik7CisgICAgdmVyaWZ5S2V5cyhrZXlzLCAmY2xlYXJLZXlzKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBNYWxmb3JtZWRLZXkpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiR2F3Z2d1RnlHcldLYXY3QVg0Vj8/P1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCI2N2VmMGdkOHB2ZmQwPVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJHYXdnZ3VGeUdyV0thdjdBWDRWPz8/XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjoiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICI6XCJHYXdnZ3VGeUdyV0thdjdBWDRWPz8/XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIjY3ZWYwZ2Q4cHZmZDA9XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzNcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXpcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiIgorICAgICAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgRVhQRUNUX1RSVUUoandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cykpOworICAgIEVYUEVDVF9UUlVFKGtleXMuc2l6ZSgpID09IDEpOworCisgICAgY29uc3QgU3RyaW5nOCBjbGVhcktleXMoIkdvb2QgZGF5ISIpOworICAgIHZlcmlmeUtleXMoa2V5cywgJmNsZWFyS2V5cyk7Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgRW1wdHlKc29uV2ViS2V5KSB7CisgICAgY29uc3QgU3RyaW5nOCBqczsKKyAgICBLZXlNYXAga2V5czsKKyAgICBFWFBFQ1RfRkFMU0UoandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cykpOworICAgIEVYUEVDVF9UUlVFKGtleXMuaXNFbXB0eSgpKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBNYWxmb3JtZWRKc29uV2ViS2V5KSB7CisgICAgLy8gTWlzc2luZyBiZWdpbiBhcnJheSAnWycKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJHYXdnZ3VGeUdyV0thdjdBWDRWS1VnXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIjY3ZWYwZ2Q4cHZmZDA9XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgIl0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgRVhQRUNUX0ZBTFNFKGp3ay0+ZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChqcywgJmtleXMpKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLmlzRW1wdHkoKSk7Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgU2FtZUtleUlkKSB7CisgICAgY29uc3QgU3RyaW5nOCBqcygKKyAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICJcImtleXNcIjoiCisgICAgICAgICAgICAgICAgICAgICJbeyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXhcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUm5KcFpXNWtJU0VcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lRXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF4XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzNcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXpcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiIgorICAgICAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cyk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMik7CisKKyAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5c1tdID0KKyAgICAgICAgICAgIHsgU3RyaW5nOCgiSGVsbG8gRnJpZW5kISIpLCBTdHJpbmc4KCJHb29kIGRheSEiKSB9OworICAgIHZlcmlmeUtleXMoa2V5cywgY2xlYXJLZXlzKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBFeHRyYWN0V2VsbEZvcm1lZEtleXMpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cyXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSVFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXlcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXM1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBelwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLnNpemUoKSA9PSAyKTsKKworICAgIGNvbnN0IFN0cmluZzggY2xlYXJLZXlzW10gPQorICAgICAgICAgICAgeyBTdHJpbmc4KCJIZWxsbyBGcmllbmQhIiksIFN0cmluZzgoIkdvb2QgZGF5ISIpIH07CisgICAgdmVyaWZ5S2V5cyhrZXlzLCBjbGVhcktleXMpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIEV4dHJhY3RLZXlzKSB7CisgICAgY29uc3QgU3RyaW5nOCBqcygKKyAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICJcImtleXNcIjoiCisgICAgICAgICAgICAgICAgICAgICJbeyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXhcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUm5KcFpXNWtJU0VcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lRXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF5XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwicnNhXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVy1yc2FcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJyc2EtNjdlZjBnZDhwdmZkMD1cIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1czXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF6XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJSMjl2WkNCa1lYa2hcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLnNpemUoKSA9PSAzKTsKKworICAgIGNvbnN0IFN0cmluZzggY2xlYXJLZXlzW10gPQorICAgICAgICAgICAgeyBTdHJpbmc4KCJIZWxsbyBGcmllbmQhISIpLCBTdHJpbmc4KCJIZWxsbyBGcmllbmQhIiksCisgICAgICAgICAgICAgIFN0cmluZzgoIkdvb2QgZGF5ISIpIH07CisgICAgdmVyaWZ5S2V5cyhrZXlzLCBjbGVhcktleXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5tayBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5tawppbmRleCBhZGEyM2EyLi4yNmMyNDViIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw4IEBACiAKIExPQ0FMX01PRFVMRSA6PSBsaWJtb2NrZHJtY3J5cHRvcGx1Z2luCiAKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfU0hBUkVEX0xJQlJBUklFUykvbWVkaWFkcm0KK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBtZWRpYWRybQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJ1dGlscyBsaWJsb2cKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL01vY2tEcm1DcnlwdG9QbHVnaW4uY3BwCmluZGV4IGRmMGJjYTMuLjJlYTU1NGIgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmNwcApAQCAtMjk5LDYgKzI5OSwxMiBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgc3RhdHVzX3QgTW9ja0RybVBsdWdpbjo6dW5wcm92aXNpb25EZXZpY2UoKQorICAgIHsKKyAgICAgICAgQUxPR0QoIk1vY2tEcm1QbHVnaW46OnVucHJvdmlzaW9uRGV2aWNlKCkiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIHN0YXR1c190IE1vY2tEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKQogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtNzI2LDcgKzczMiw3IEBACiAgICAgewogICAgICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlslZF0ge2NsZWFyOiVkLCBlbmNyeXB0ZWQ6JWR9ICIsIGksCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJbJXp1XSB7Y2xlYXI6JXp1LCBlbmNyeXB0ZWQ6JXp1fSAiLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKaW5kZXggOTdkNzA1Mi4uNGI2MzI5OSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKQEAgLTg1LDYgKzg1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpOwogCisgICAgICAgIHN0YXR1c190IHVucHJvdmlzaW9uRGV2aWNlKCk7CisKICAgICAgICAgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpOwogICAgICAgICBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc1JlbGVhc2UpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCmluZGV4IDc5NjgyYjguLjJiNjA4NDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCkBAIC03NCw2ICs3NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQpOwogCisgICAgc3RhdGljICBzdGF0dXNfdCAgY29ubmVjdExlZ2FjeShpbnQgY2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBzcDxDYW1lcmE+JiBjYW1lcmEpOworCiAgICAgICAgICAgICB2aXJ0dWFsICAgICB+Q2FtZXJhKCk7CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHJlY29ubmVjdCgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCmluZGV4IGQ1MjE1NDMuLmM2MDc0ZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKQEAgLTEwMiw2ICsxMDIsMTIgQEAKICAgICB2b2lkIGR1bXAoKSBjb25zdDsKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgVmVjdG9yIGNvbnRhaW5pbmcgdGhlIHN1cHBvcnRlZCBwcmV2aWV3IGZvcm1hdHMKKyAgICAgKiBhcyBlbnVtcyBnaXZlbiBpbiBncmFwaGljcy5oLgorICAgICAqLworICAgIHZvaWQgZ2V0U3VwcG9ydGVkUHJldmlld0Zvcm1hdHMoVmVjdG9yPGludD4mIGZvcm1hdHMpIGNvbnN0OworCiAgICAgLy8gUGFyYW1ldGVyIGtleXMgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiBjYW1lcmEgYXBwbGljYXRpb24gYW5kIGRyaXZlci4KICAgICAvLyBUaGUgYWNjZXNzIChyZWFkL3dyaXRlLCByZWFkIG9ubHksIG9yIHdyaXRlIG9ubHkpIGlzIHZpZXdlZCBmcm9tIHRoZQogICAgIC8vIHBlcnNwZWN0aXZlIG9mIGFwcGxpY2F0aW9ucywgbm90IGRyaXZlci4KQEAgLTY3NCw2ICs2ODAsMTMgQEAKICAgICAvLyBIaWdoLWR5bmFtaWMgcmFuZ2UgbW9kZQogICAgIHN0YXRpYyBjb25zdCBjaGFyIExJR0hURlhfSERSW107CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0aGUgc3VwcG9ydGVkIHByZXZpZXcgZm9ybWF0cyBhcyBhbiBlbnVtIGdpdmVuIGluIGdyYXBoaWNzLmgKKyAgICAgKiBjb3Jyc3BvbmRpbmcgdG8gdGhlIGZvcm1hdCBnaXZlbiBpbiB0aGUgaW5wdXQgc3RyaW5nIG9yIC0xIGlmIG5vIHN1Y2gKKyAgICAgKiBjb252ZXJzaW9uIGV4aXN0cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IHByZXZpZXdGb3JtYXRUb0VudW0oY29uc3QgY2hhciogZm9ybWF0KTsKKwogcHJpdmF0ZToKICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8U3RyaW5nOCxTdHJpbmc4PiAgICBtTWFwOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVV0aWxzLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNmYwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQ0FNRVJBX0NMSUVOVF9DQU1FUkFVVElMU19ICisjZGVmaW5lIEFORFJPSURfQ0FNRVJBX0NMSUVOVF9DQU1FUkFVVElMU19ICisKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ2FtZXJhVXRpbHMgY29udGFpbnMgdXRpbGl0eSBtZXRob2RzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBuYXRpdmUKKyAqIGNhbWVyYSBjbGllbnQsIGFuZCB0aGUgY2FtZXJhIHNlcnZpY2UuCisgKi8KK2NsYXNzIENhbWVyYVV0aWxzIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIEFOYXRpdmVXaW5kb3cgdHJhbnNmb3JtIGZyb20gdGhlIHN0YXRpYyBjYW1lcmEKKyAgICAgICAgICogbWV0YWRhdGEuICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBzZW5zb3Igb3JpZW50YXRpb24gYW5kIGxlbnMgZmFjaW5nCisgICAgICAgICAqIGF0dHJpYnV0ZXMgb2YgdGhlIGNhbWVyYSBkZXZpY2UuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHN0YXR1c190IGdldFJvdGF0aW9uVHJhbnNmb3JtKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAorICAgICAgICAgICAgICAgIC8qb3V0Ki9pbnQzMl90KiB0cmFuc2Zvcm0pOworICAgIHByaXZhdGU6CisgICAgICAgIENhbWVyYVV0aWxzKCk7Cit9OworCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisKKyNlbmRpZiAvKiBBTkRST0lEX0NBTUVSQV9DTElFTlRfQ0FNRVJBVVRJTFNfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmggYi9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlN2Q2ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhcHR1cmVSZXN1bHQuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NBUFRVUkVSRVNVTFRfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBUFRVUkVSRVNVTFRfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ2FwdHVyZVJlc3VsdEV4dHJhcyBpcyBhIHN0cnVjdHVyZSB0byBlbmNhcHN1bGF0ZSB2YXJpb3VzIGluZGljZXMgZm9yIGEgY2FwdHVyZSByZXN1bHQuCisgKiBUaGVzZSBpbmRpY2VzIGFyZSBmcmFtZXdvcmstaW50ZXJuYWwgYW5kIG5vdCBzZW50IHRvIHRoZSBIQUwuCisgKi8KK3N0cnVjdCBDYXB0dXJlUmVzdWx0RXh0cmFzIHsKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlZ2VyIHRvIGluZGV4IHRoZSByZXF1ZXN0IHNlcXVlbmNlIHRoYXQgdGhpcyByZXN1bHQgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBpbnQzMl90IHJlcXVlc3RJZDsKKworICAgIC8qKgorICAgICAqIEFuIGludGVnZXIgdG8gaW5kZXggdGhpcyByZXN1bHQgaW5zaWRlIGEgcmVxdWVzdCBzZXF1ZW5jZSwgc3RhcnRpbmcgZnJvbSAwLgorICAgICAqLworICAgIGludDMyX3QgYnVyc3RJZDsKKworICAgIC8qKgorICAgICAqIFRPRE86IEFkZCBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGZpZWxkLgorICAgICAqLworICAgIGludDMyX3QgYWZUcmlnZ2VySWQ7CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBmaWVsZC4KKyAgICAgKi8KKyAgICBpbnQzMl90IHByZWNhcHR1cmVUcmlnZ2VySWQ7CisKKyAgICAvKioKKyAgICAgKiBBIDY0Yml0IGludGVnZXIgdG8gaW5kZXggdGhlIGZyYW1lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXN1bHQuCisgICAgICovCisgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXJ0aWFsIHJlc3VsdCBjb3VudCAoaW5kZXgpIGZvciB0aGlzIGNhcHR1cmUgcmVzdWx0LgorICAgICAqLworICAgIGludDMyX3QgcGFydGlhbFJlc3VsdENvdW50OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgb2JqZWN0IGFzIGludmFsaWQgYnkgc2V0dGluZyByZXF1ZXN0SWQgdG8gYmUgLTEuCisgICAgICovCisgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcygpCisgICAgICAgIDogcmVxdWVzdElkKC0xKSwKKyAgICAgICAgICBidXJzdElkKDApLAorICAgICAgICAgIGFmVHJpZ2dlcklkKDApLAorICAgICAgICAgIHByZWNhcHR1cmVUcmlnZ2VySWQoMCksCisgICAgICAgICAgZnJhbWVOdW1iZXIoMCksCisgICAgICAgICAgcGFydGlhbFJlc3VsdENvdW50KDApIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBpdCdzIGEgdmFsaWQgQ2FwdHVyZVJlc3VsdEV4dHJhcyBvYmplY3QuCisgICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLiBJdCBpcyB2YWxpZCBvbmx5IHdoZW4gcmVxdWVzdElkIGlzIG5vbi1uZWdhdGl2ZS4KKyAgICAgKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHJlYWRGcm9tUGFyY2VsKFBhcmNlbCogcGFyY2VsKTsKKyAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdDsKK307CisKK3N0cnVjdCBDYXB0dXJlUmVzdWx0IDogcHVibGljIHZpcnR1YWwgTGlnaHRSZWZCYXNlPENhcHR1cmVSZXN1bHQ+IHsKKyAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICBtTWV0YWRhdGE7CisgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAgICAgbVJlc3VsdEV4dHJhczsKKworICAgIENhcHR1cmVSZXN1bHQoKTsKKworICAgIENhcHR1cmVSZXN1bHQoY29uc3QgQ2FwdHVyZVJlc3VsdCYgb3RoZXJSZXN1bHQpOworCisgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgcmVhZEZyb21QYXJjZWwoUGFyY2VsKiBwYXJjZWwpOworICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworfTsKKworfQorCisjZW5kaWYgLyogQU5EUk9JRF9IQVJEV0FSRV9DQVBUVVJFUkVTVUxUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmggYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oCmluZGV4IGYzNDIxMjIuLmY3ZjA2YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuaApAQCAtMzEsNiArMzEsOCBAQAogY2xhc3MgSUNhbWVyYURldmljZVVzZXI7CiBjbGFzcyBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwogY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CitjbGFzcyBWZW5kb3JUYWdEZXNjcmlwdG9yOworY2xhc3MgU3RyaW5nMTY7CiAKIGNsYXNzIElDYW1lcmFTZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UKIHsKQEAgLTQ3LDIxICs0OSw0MCBAQAogICAgICAgICBBRERfTElTVEVORVIsCiAgICAgICAgIFJFTU9WRV9MSVNURU5FUiwKICAgICAgICAgR0VUX0NBTUVSQV9DSEFSQUNURVJJU1RJQ1MsCisgICAgICAgIEdFVF9DQU1FUkFfVkVORE9SX1RBR19ERVNDUklQVE9SLAorICAgICAgICBHRVRfTEVHQUNZX1BBUkFNRVRFUlMsCisgICAgICAgIFNVUFBPUlRTX0NBTUVSQV9BUEksCisgICAgICAgIENPTk5FQ1RfTEVHQUNZLAogICAgIH07CiAKICAgICBlbnVtIHsKICAgICAgICAgVVNFX0NBTExJTkdfVUlEID0gLTEKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIEFQSV9WRVJTSU9OXzEgPSAxLAorICAgICAgICBBUElfVkVSU0lPTl8yID0gMiwKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQgPSAtMQorICAgICAgfTsKKwogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQ2FtZXJhU2VydmljZSk7CiAKICAgICB2aXJ0dWFsIGludDMyX3QgIGdldE51bWJlck9mQ2FtZXJhcygpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pID0gMDsKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHN0cnVjdCBDYW1lcmFJbmZvKiBjYW1lcmFJbmZvKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNhbWVyYUluZm8pID0gMDsKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYVZlbmRvclRhZ0Rlc2NyaXB0b3IoCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgPSAwOwogCiAgICAgLy8gUmV0dXJucyAnT0snIGlmIG9wZXJhdGlvbiBzdWNjZWVkZWQKICAgICAvLyAtIEVycm9yczogQUxSRUFEWV9FWElTVFMgaWYgdGhlIGxpc3RlbmVyIHdhcyBhbHJlYWR5IGFkZGVkCkBAIC05Nyw2ICsxMTgsMzAgQEAKICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4mIGRldmljZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMZWdhY3lQYXJhbWV0ZXJzKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgU3RyaW5nMTYqIHBhcmFtZXRlcnMpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgT0sgaWYgZGV2aWNlIHN1cHBvcnRzIGNhbWVyYTIgYXBpLAorICAgICAqIHJldHVybnMgLUVPUE5PVFNVUFAgaWYgaXQgZG9lc24ndC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQ2FtZXJhQXBpKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbikgPSAwOworCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0aGUgZGV2aWNlIGFzIGEgbGVnYWN5IGRldmljZSBmb3IgYSBnaXZlbiBIQUwgdmVyc2lvbi4KKyAgICAgKiBGb3IgaGFsVmVyc2lvbiwgdXNlIENBTUVSQV9BUElfREVWSUNFX1ZFUlNJT05fKiBmb3IgYSBwYXJ0aWN1bGFyCisgICAgICogdmVyc2lvbiwgb3IgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCBmb3IgYSBzZXJ2aWNlLXNlbGVjdGVkIHZlcnNpb24uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0TGVnYWN5KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPElDYW1lcmE+JiBkZXZpY2UpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaCBiL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzU4YWNmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWRU5ET1JfVEFHX0RFU0NSSVBUT1JfSAorCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFBhcmNlbDsKKworLyoqCisgKiBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdHMgYXJlIHBhcmNlbGFibGUgY29udGFpbmVycyBmb3IgdGhlIHZlbmRvciB0YWcKKyAqIGRlZmluaXRpb25zIHByb3ZpZGVkLCBhbmQgYXJlIHR5cGljYWxseSB1c2VkIHRvIHBhc3MgdGhlIHZlbmRvciB0YWcKKyAqIGluZm9ybWF0aW9uIGVudW1lcmF0ZWQgYnkgdGhlIEhBTCB0byBjbGllbnRzIG9mIHRoZSBjYW1lcmEgc2VydmljZS4KKyAqLworY2xhc3MgVmVuZG9yVGFnRGVzY3JpcHRvcgorICAgICAgICA6IHB1YmxpYyBMaWdodFJlZkJhc2U8VmVuZG9yVGFnRGVzY3JpcHRvcj4geworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+VmVuZG9yVGFnRGVzY3JpcHRvcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nICdnZXQqJyBtZXRob2RzIGltcGxlbWVudCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgKiBmdW5jdGlvbnMgZGVmaW5lZCBpbgorICAgICAgICAgKiBzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUvc3lzdGVtL2NhbWVyYV92ZW5kb3JfdGFncy5oCisgICAgICAgICAqLworCisgICAgICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB2ZW5kb3IgdGFncyBkZWZpbmVkLgorICAgICAgICBpbnQgZ2V0VGFnQ291bnQoKSBjb25zdDsKKworICAgICAgICAvLyBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGlkJ3Mgb2YgdmVuZG9yIHRhZ3MgZGVmaW5lZC4KKyAgICAgICAgdm9pZCBnZXRUYWdBcnJheSh1aW50MzJfdCogdGFnQXJyYXkpIGNvbnN0OworCisgICAgICAgIC8vIFJldHVybnMgdGhlIHNlY3Rpb24gbmFtZSBzdHJpbmcgZm9yIGEgZ2l2ZW4gdmVuZG9yIHRhZyBpZC4KKyAgICAgICAgY29uc3QgY2hhciogZ2V0U2VjdGlvbk5hbWUodWludDMyX3QgdGFnKSBjb25zdDsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSB0YWcgbmFtZSBzdHJpbmcgZm9yIGEgZ2l2ZW4gdmVuZG9yIHRhZyBpZC4KKyAgICAgICAgY29uc3QgY2hhciogZ2V0VGFnTmFtZSh1aW50MzJfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8vIFJldHVybnMgdGhlIHRhZyB0eXBlIGZvciBhIGdpdmVuIHZlbmRvciB0YWcgaWQuCisgICAgICAgIGludCBnZXRUYWdUeXBlKHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIHRoZSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBpbnRvIHRoZSBnaXZlbiBwYXJjZWwuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCgKKyAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZ2V0IGEgdmVjdG9yIGNvbnRhaW5pbmcgYWxsIHZlbmRvciB0YWcKKyAgICAgICAgICogc2VjdGlvbnMsIG9yIGFuIGVtcHR5IHZlY3RvciBpZiBub25lIGFyZSBkZWZpbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IGdldEFsbFNlY3Rpb25OYW1lcygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb29rdXAgdGhlIHRhZyBpZCBmb3IgYSBnaXZlbiB0YWcgbmFtZSBhbmQgc2VjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBsb29rdXBUYWcoU3RyaW5nOCBuYW1lLCBTdHJpbmc4IHNlY3Rpb24sIC8qb3V0Ki91aW50MzJfdCogdGFnKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogRHVtcCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgdmVuZG9yIHRhZ3MgdG8gYSBmaWxlIGRlc2NyaXB0b3IuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0OworCisgICAgICAgIC8vIFN0YXRpYyBtZXRob2RzOgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBwYXJjZWwuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwsCisgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjcmlwdG9yKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gdmVuZG9yX3RhZ19vcHNfdAorICAgICAgICAgKiBzdHJ1Y3QuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZURlc2NyaXB0b3JGcm9tT3BzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHZPcHMsCisgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjcmlwdG9yKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgZ2xvYmFsIHZlbmRvciB0YWcgZGVzY3JpcHRvciB0byB1c2UgZm9yIHRoaXMgcHJvY2Vzcy4KKyAgICAgICAgICogQ2FtZXJhIG1ldGFkYXRhIG9wZXJhdGlvbnMgdGhhdCBhY2Nlc3MgdmVuZG9yIHRhZ3Mgd2lsbCB1c2UgdGhlCisgICAgICAgICAqIHZlbmRvciB0YWcgZGVmaW5pdGlvbnMgc2V0IHRoaXMgd2F5LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoY29uc3Qgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2MpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhcnMgdGhlIGdsb2JhbCB2ZW5kb3IgdGFnIGRlc2NyaXB0b3IgdXNlZCBieSB0aGlzIHByb2Nlc3MuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgdm9pZCBjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZ2xvYmFsIHZlbmRvciB0YWcgZGVzY3JpcHRvciB1c2VkIGJ5IHRoaXMgcHJvY2Vzcy4KKyAgICAgICAgICogVGhpcyB3aWxsIGNvbnRhaW4gTlVMTCBpZiBubyB2ZW5kb3IgdGFncyBhcmUgZGVmaW5lZC4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgcHJvdGVjdGVkOgorICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90Pio+IG1SZXZlcnNlTWFwcGluZzsKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIFN0cmluZzg+IG1UYWdUb05hbWVNYXA7CisgICAgICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCB1aW50MzJfdD4gbVRhZ1RvU2VjdGlvbk1hcDsgLy8gVmFsdWUgaXMgb2Zmc2V0IGluIG1TZWN0aW9ucworICAgICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgaW50MzJfdD4gbVRhZ1RvVHlwZU1hcDsKKyAgICAgICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IG1TZWN0aW9uczsKKyAgICAgICAgLy8gbXVzdCBiZSBpbnQzMl90IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBQYXJjZWw6OndyaXRlSW50MzIKKyAgICAgICAgaW50MzJfdCBtVGFnQ291bnQ7CisgICAgcHJpdmF0ZToKKyAgICAgICAgdmVuZG9yX3RhZ19vcHMgbVZlbmRvck9wczsKK307CisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KKworI2RlZmluZSBWRU5ET1JfVEFHX0RFU0NSSVBUT1JfSAorI2VuZGlmIC8qIFZFTkRPUl9UQUdfREVTQ1JJUFRPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaCBiL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oCmluZGV4IDhkYWM0ZjIuLjY3MDQ4MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oCkBAIC0yNCw5ICsyNCwxMiBAQAogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmEuaD4KIAorI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGNsYXNzIENhbWVyYU1ldGFkYXRhOwogCisKIGNsYXNzIElDYW1lcmFEZXZpY2VDYWxsYmFja3MgOiBwdWJsaWMgSUludGVyZmFjZQogewogICAgIC8qKgpAQCAtMzksMjQgKzQyLDI5IEBACiAgICAgICogRXJyb3IgY29kZXMgZm9yIENBTUVSQV9NU0dfRVJST1IKICAgICAgKi8KICAgICBlbnVtIENhbWVyYUVycm9yQ29kZSB7CisgICAgICAgIEVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SID0gLTEsIC8vIFRvIGluZGljYXRlIGFsbCBpbnZhbGlkIGVycm9yIGNvZGVzCiAgICAgICAgIEVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQgPSAwLAogICAgICAgICBFUlJPUl9DQU1FUkFfREVWSUNFID0gMSwKLSAgICAgICAgRVJST1JfQ0FNRVJBX1NFUlZJQ0UgPSAyCisgICAgICAgIEVSUk9SX0NBTUVSQV9TRVJWSUNFID0gMiwKKyAgICAgICAgRVJST1JfQ0FNRVJBX1JFUVVFU1QgPSAzLAorICAgICAgICBFUlJPUl9DQU1FUkFfUkVTVUxUID0gNCwKKyAgICAgICAgRVJST1JfQ0FNRVJBX0JVRkZFUiA9IDUsCiAgICAgfTsKIAogICAgIC8vIE9uZSB3YXkKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkRldmljZUVycm9yKENhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkRldmljZUVycm9yKENhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKIAogICAgIC8vIE9uZSB3YXkKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkRldmljZUlkbGUoKSA9IDA7CiAKICAgICAvLyBPbmUgd2F5Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25DYXB0dXJlU3RhcnRlZChpbnQzMl90IHJlcXVlc3RJZCwKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkNhcHR1cmVTdGFydGVkKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wKSA9IDA7CiAKICAgICAvLyBPbmUgd2F5Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiByZXN1bHQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvblJlc3VsdFJlY2VpdmVkKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oCmluZGV4IGY3MWYzMDIuLjM1NDg4YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAogc3RydWN0IGNhbWVyYV9tZXRhZGF0YTsKIApAQCAtMzAsNiArMzEsMTAgQEAKIGNsYXNzIENhcHR1cmVSZXF1ZXN0OwogY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CiAKK2VudW0geworICAgIE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTID0gLTEsCit9OworCiBjbGFzcyBJQ2FtZXJhRGV2aWNlVXNlciA6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CiAgICAgLyoqCkBAIC00NCw5ICs0OSw1NSBAQAogICAgICAqIFJlcXVlc3QgSGFuZGxpbmcKICAgICAgKiovCiAKKyAgICAvKioKKyAgICAgKiBGb3Igc3RyZWFtaW5nIHJlcXVlc3RzLCBvdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlcgorICAgICAqIG9mIHRoZSBwcmV2aW91cyByZXBlYXRpbmcgcmVxdWVzdC4KKyAgICAgKiBGb3Igbm9uLXN0cmVhbWluZyByZXF1ZXN0cywgb3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgZXhwZWN0ZWQgbGFzdAorICAgICAqIGZyYW1lIG51bWJlciBvZiB0aGUgY3VycmVudCByZXF1ZXN0LgorICAgICAqLwogICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIHN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOworCisgICAgLyoqCisgICAgICogRm9yIHN0cmVhbWluZyByZXF1ZXN0cywgb3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIKKyAgICAgKiBvZiB0aGUgcHJldmlvdXMgcmVwZWF0aW5nIHJlcXVlc3QuCisgICAgICogRm9yIG5vbi1zdHJlYW1pbmcgcmVxdWVzdHMsIG91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGV4cGVjdGVkIGxhc3QKKyAgICAgKiBmcmFtZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBzdWJtaXRSZXF1ZXN0TGlzdChMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKKworICAgIC8qKgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyByZXBlYXRpbmcgcmVxdWVzdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBCZWdpbiB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBiZWdpbkNvbmZpZ3VyZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IGNhbGwgdG8gZGVsZXRlU3RyZWFtLCBjcmVhdGVTdHJlYW0sCisgICAgICogb3IgZW5kQ29uZmlndXJlLiAgSXQgaXMgbm90IHZhbGlkIHRvIGNhbGwgdGhpcyB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGlkbGUuCisgICAgICogPHA+CisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgYmVnaW5Db25maWd1cmUoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBFbmQgdGhlIGRldmljZSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogZW5kQ29uZmlndXJlIG11c3QgYmUgY2FsbGVkIGFmdGVyIHN0cmVhbSBjb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlIChpLmUuIGFmdGVyCisgICAgICogYSBjYWxsIHRvIGJlZ2luQ29uZmlndXJlIGFuZCBzdWJzZXF1ZW50IGNyZWF0ZVN0cmVhbS9kZWxldGVTdHJlYW0gY2FsbHMpLiAgVGhpcworICAgICAqIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgcmVxdWVzdHMgY2FuIGJlIHN1Ym1pdHRlZC4KKyAgICAgKiA8cD4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBlbmRDb25maWd1cmUoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY3JlYXRlU3RyZWFtKApAQCAtNjQsOCArMTE1LDEyIEBACiAgICAgLy8gV2FpdCB1bnRpbCBhbGwgdGhlIHN1Ym1pdHRlZCByZXF1ZXN0cyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICB3YWl0VW50aWxJZGxlKCkgPSAgMDsKIAotICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIGFuZCBpbi1wcm9ncmVzcyB3b3JrIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZmx1c2goKSA9IDA7CisgICAgLyoqCisgICAgICogRmx1c2ggYWxsIHBlbmRpbmcgYW5kIGluLXByb2dyZXNzIHdvcmsgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgcmVwZWF0aW5nIHJlcXVlc3QuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZmx1c2goLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmgKaW5kZXggZWYzOTJmMC4uN2JlNDQ5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmgKQEAgLTYxLDYgKzYxLDE3IEBACiAgICAgLy8gIGJ1ZmZlci0+ZnJhbWVDb3VudCAgMAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMgPSBrSW52YWxpZFBUUykgPSAwOwogCisgICAgLy8gUmVsZWFzZSAoYSBwb3J0aW9uIG9mKSB0aGUgYnVmZmVyIHByZXZpb3VzbHkgb2J0YWluZWQgYnkgZ2V0TmV4dEJ1ZmZlcigpLgorICAgIC8vIEl0IGlzIHBlcm1pc3NpYmxlIHRvIGNhbGwgcmVsZWFzZUJ1ZmZlcigpIG11bHRpcGxlIHRpbWVzIHBlciBnZXROZXh0QnVmZmVyKCkuCisgICAgLy8gT24gZW50cnk6CisgICAgLy8gIGJ1ZmZlci0+ZnJhbWVDb3VudCAgbnVtYmVyIG9mIGZyYW1lcyB0byByZWxlYXNlLCBtdXN0IGJlIDw9IG51bWJlciBvZiBmcmFtZXMKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICBvYnRhaW5lZCBidXQgbm90IHlldCByZWxlYXNlZAorICAgIC8vICBidWZmZXItPnJhdyAgICAgICAgIHVudXNlZAorICAgIC8vIE9uIHJldHVybjoKKyAgICAvLyAgYnVmZmVyLT5mcmFtZUNvdW50ICAwOyBpbXBsZW1lbnRhdGlvbiBNVVNUIHNldCB0byB6ZXJvCisgICAgLy8gIGJ1ZmZlci0+cmF3ICAgICAgICAgdW5kZWZpbmVkOyBpbXBsZW1lbnRhdGlvbiBpcyBQRVJNSVRURUQgdG8gc2V0IHRvIGFueSB2YWx1ZSwKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICBzbyBpZiBjYWxsZXIgbmVlZHMgdG8gY29udGludWUgdXNpbmcgdGhpcyBidWZmZXIgaXQgbXVzdAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGtlZXAgdHJhY2sgb2YgdGhlIHBvaW50ZXIgaXRzZWxmCiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAppbmRleCBlZWYxYjQxLi41ODM2OTVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCkBAIC0zNiw3ICszNiw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgZWZmZWN0X3BhcmFtX2NibGtfdDsKK3N0cnVjdCBlZmZlY3RfcGFyYW1fY2Jsa190OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTIxOCw4ICsyMTgsOSBAQAogICAgICAqICAgICAgaGlnaGVyIHByaW9yaXRpZXMsIDAgYmVpbmcgdGhlIG5vcm1hbCBwcmlvcml0eS4KICAgICAgKiBjYmY6ICAgICAgICAgb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gKHNlZSBlZmZlY3RfY2FsbGJhY2tfdCkKICAgICAgKiB1c2VyOiAgICAgICAgcG9pbnRlciB0byBjb250ZXh0IGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIHJlY2VpdmVyLgotICAgICAqIHNlc3Npb25JRDogICBhdWRpbyBzZXNzaW9uIHRoaXMgZWZmZWN0IGlzIGFzc29jaWF0ZWQgdG8uIElmIDAsIHRoZSBlZmZlY3Qgd2lsbCBiZSBnbG9iYWwgdG8KLSAgICAgKiAgICAgIHRoZSBvdXRwdXQgbWl4LiBJZiBub3QgMCwgdGhlIGVmZmVjdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHBsYXllcnMKKyAgICAgKiBzZXNzaW9uSUQ6ICAgYXVkaW8gc2Vzc2lvbiB0aGlzIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvLgorICAgICAqICAgICAgSWYgZXF1YWwgdG8gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCB0aGUgZWZmZWN0IHdpbGwgYmUgZ2xvYmFsIHRvCisgICAgICogICAgICB0aGUgb3V0cHV0IG1peC4gIE90aGVyd2lzZSwgdGhlIGVmZmVjdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHBsYXllcnMKICAgICAgKiAgICAgIChBdWRpb1RyYWNrIG9yIE1lZGlhUExheWVyKSB3aXRoaW4gdGhlIHNhbWUgYXVkaW8gc2Vzc2lvbi4KICAgICAgKiBpbzogIEhBTCBhdWRpbyBvdXRwdXQgb3IgaW5wdXQgc3RyZWFtIHRvIHdoaWNoIHRoaXMgZWZmZWN0IG11c3QgYmUgYXR0YWNoZWQuIExlYXZlIGF0IDAgZm9yCiAgICAgICogICAgICBhdXRvbWF0aWMgb3V0cHV0IHNlbGVjdGlvbiBieSBBdWRpb0ZsaW5nZXIuCkBAIC0yMzAsOCArMjMxLDggQEAKICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAogICAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmID0gTlVMTCwKICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDAsCi0gICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IDAKKyAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCisgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FCiAgICAgICAgICAgICAgICAgICApOwogCiAgICAgLyogQ29uc3RydWN0b3IuCkBAIC0yNDIsOCArMjQzLDggQEAKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IDAsCiAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSAwCisgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkUKICAgICAgICAgICAgICAgICAgICAgKTsKIAogICAgIC8qIFRlcm1pbmF0ZXMgdGhlIEF1ZGlvRWZmZWN0IGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KQEAgLTI2NCw4ICsyNjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvRWZmZWN0LiBUaGlzIG11c3QgYmUgY2hlY2tlZApAQCAtNDUzLDYgKzQ1NCw3IEBACiAgICAgc3A8RWZmZWN0Q2xpZW50PiAgICAgICAgbUlFZmZlY3RDbGllbnQ7ICAgICAvLyBJRWZmZWN0Q2xpZW50IGltcGxlbWVudGF0aW9uCiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7ICAgICAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBkZWZlcnJlZCBwYXJhbWV0ZXIgc2V0dGluZwogICAgIGVmZmVjdF9wYXJhbV9jYmxrX3QqICAgIG1DYmxrOyAgICAgICAgICAgICAgLy8gY29udHJvbCBibG9jayBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcKKyAgICBwaWRfdCAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhZmQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQVVESU9fUE9MSUNZX0hFTFBFUl9IXworI2RlZmluZSBBVURJT19QT0xJQ1lfSEVMUEVSX0hfCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworYXVkaW9fc3RyZWFtX3R5cGVfdCBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikKK3sKKyAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTsKKyAgICB9CisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfU0NPKSA9PSBBVURJT19GTEFHX1NDTykgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ087CisgICAgfQorCisgICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZworICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOworCisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOworCisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorfQorCisjZW5kaWYgLy9BVURJT19QT0xJQ1lfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKaW5kZXggMDUyMDY0ZC4uNGVkYzFiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaApAQCAtMjYsNyArMjYsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIGF1ZGlvX3RyYWNrX2NibGtfdDsKK3N0cnVjdCBhdWRpb190cmFja19jYmxrX3Q7CiBjbGFzcyBBdWRpb1JlY29yZENsaWVudFByb3h5OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zOSw4ICszOSwxMiBAQAogICAgICAqIEtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YSBOQVRJVkVfRVZFTlRfKi4KICAgICAgKi8KICAgICBlbnVtIGV2ZW50X3R5cGUgewotICAgICAgICBFVkVOVF9NT1JFX0RBVEEgPSAwLCAgICAgICAgLy8gUmVxdWVzdCB0byByZWFkIG1vcmUgZGF0YSBmcm9tIFBDTSBidWZmZXIuCi0gICAgICAgIEVWRU5UX09WRVJSVU4gPSAxLCAgICAgICAgICAvLyBQQ00gYnVmZmVyIG92ZXJydW4gb2NjdXJyZWQuCisgICAgICAgIEVWRU5UX01PUkVfREFUQSA9IDAsICAgICAgICAvLyBSZXF1ZXN0IHRvIHJlYWQgYXZhaWxhYmxlIGRhdGEgZnJvbSBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGV2ZW50IGlzIGRlbGl2ZXJlZCBidXQgdGhlIGNhbGxiYWNrIGhhbmRsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHdhbnQgdG8gcmVhZCB0aGUgYXZhaWxhYmxlIGRhdGEsIHRoZSBoYW5kbGVyIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZXZlbnQgYnkgc2V0dGluZyBmcmFtZUNvdW50IHRvIHplcm8uCisgICAgICAgIEVWRU5UX09WRVJSVU4gPSAxLCAgICAgICAgICAvLyBCdWZmZXIgb3ZlcnJ1biBvY2N1cnJlZC4KICAgICAgICAgRVZFTlRfTUFSS0VSID0gMiwgICAgICAgICAgIC8vIFJlY29yZCBoZWFkIGlzIGF0IHRoZSBzcGVjaWZpZWQgbWFya2VyIHBvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoU2VlIHNldE1hcmtlclBvc2l0aW9uKCkpLgogICAgICAgICBFVkVOVF9ORVdfUE9TID0gMywgICAgICAgICAgLy8gUmVjb3JkIGhlYWQgaXMgYXQgYSBuZXcgcG9zaXRpb24KQEAgLTYwLDkgKzY0LDEwIEBACiAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQ7ICAgICAvLyBudW1iZXIgb2Ygc2FtcGxlIGZyYW1lcyBjb3JyZXNwb25kaW5nIHRvIHNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCBpdCBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBhdmFpbGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgZHJhaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGN1cnJlbnRseSBpZ25vcmVkLCBidXQgd2lsbCBtYWtlIHRoZSBwcmltYXJ5IGZpZWxkIGluIGZ1dHVyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjdXJyZW50bHkgaWdub3JlZCBidXQgd2lsbCBtYWtlIHRoZSBwcmltYXJ5IGZpZWxkIGluIGZ1dHVyZSkKIAogICAgICAgICBzaXplX3QgICAgICBzaXplOyAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGluIGJ5dGVzID09IGZyYW1lQ291bnQgKiBmcmFtZVNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGRyYWluZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgaXMgcmVkdW5kYW50IHdpdGggcmVzcGVjdCB0byBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIFRSQU5TRkVSX09CVEFJTiBtb2RlIGlzIGJyb2tlbiBmb3IgOC1iaXQgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgZG9uJ3QgZGVmaW5lIHRoZSBmcmFtZSBmb3JtYXQKQEAgLTc2LDcgKzgxLDcgQEAKIAogICAgIC8qIEFzIGEgY29udmVuaWVuY2UsIGlmIGEgY2FsbGJhY2sgaXMgc3VwcGxpZWQsIGEgaGFuZGxlciB0aHJlYWQKICAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcHJpb3JpdHkuIFRoaXMgdGhyZWFkCi0gICAgICogaW52b2tlcyB0aGUgY2FsbGJhY2sgd2hlbiBhIG5ldyBidWZmZXIgYmVjb21lcyByZWFkeSBvciB2YXJpb3VzIGNvbmRpdGlvbnMgb2NjdXIuCisgICAgICogaW52b2tlcyB0aGUgY2FsbGJhY2sgd2hlbiBhIG5ldyBidWZmZXIgYmVjb21lcyBhdmFpbGFibGUgb3IgdmFyaW91cyBjb25kaXRpb25zIG9jY3VyLgogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICoKICAgICAgKiBldmVudDogICB0eXBlIG9mIGV2ZW50IG5vdGlmaWVkIChzZWUgZW51bSBBdWRpb1JlY29yZDo6ZXZlbnRfdHlwZSkuCkBAIC05OSw2ICsxMDQsOCBAQAogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbgogICAgICAqICAtIE5PX0lOSVQ6IGF1ZGlvIHNlcnZlciBvciBhdWRpbyBoYXJkd2FyZSBub3QgaW5pdGlhbGl6ZWQKICAgICAgKiAgLSBCQURfVkFMVUU6IHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBmcmFtZUNvdW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgbm9uLXplcm8gaWYgc3RhdHVzIGlzIE5PX0VSUk9SLAorICAgICAqIGFuZCBpcyB1bmRlZmluZWQgb3RoZXJ3aXNlLgogICAgICAqLwogCiAgICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5GcmFtZUNvdW50KHNpemVfdCogZnJhbWVDb3VudCwKQEAgLTEwOSw3ICsxMTYsNyBAQAogICAgIC8qIEhvdyBkYXRhIGlzIHRyYW5zZmVycmVkIGZyb20gQXVkaW9SZWNvcmQKICAgICAgKi8KICAgICBlbnVtIHRyYW5zZmVyX3R5cGUgewotICAgICAgICBUUkFOU0ZFUl9ERUZBVUxULCAgIC8vIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseTsgZGV0ZXJtaW5lIGZyb20gb3RoZXIgcGFyYW1ldGVycworICAgICAgICBUUkFOU0ZFUl9ERUZBVUxULCAgIC8vIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseTsgZGV0ZXJtaW5lIGZyb20gdGhlIG90aGVyIHBhcmFtZXRlcnMKICAgICAgICAgVFJBTlNGRVJfQ0FMTEJBQ0ssICAvLyBjYWxsYmFjayBFVkVOVF9NT1JFX0RBVEEKICAgICAgICAgVFJBTlNGRVJfT0JUQUlOLCAgICAvLyBGSVhNRSBkZXByZWNhdGVkOiBjYWxsIG9idGFpbkJ1ZmZlcigpIGFuZCByZWxlYXNlQnVmZmVyKCkKICAgICAgICAgVFJBTlNGRVJfU1lOQywgICAgICAvLyBzeW5jaHJvbm91cyByZWFkKCkKQEAgLTEzNyw3ICsxNDQsNyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICAgYmUgbGFyZ2VyIGlmIHRoZSByZXF1ZXN0ZWQgc2l6ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQgYXVkaW8gSEFMCiAgICAgICogICAgICAgICAgICAgICAgICAgICBsYXRlbmN5LiAgWmVybyBtZWFucyB0byB1c2UgYSBkZWZhdWx0IHZhbHVlLgogICAgICAqIGNiZjogICAgICAgICAgICAgICAgQ2FsbGJhY2sgZnVuY3Rpb24uIElmIG5vdCBudWxsLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRvIGNvbnN1bWUgbmV3IFBDTSBkYXRhIGFuZCBpbmZvcm0gb2YgbWFya2VyLCBwb3NpdGlvbiB1cGRhdGVzLCBldGMuCisgICAgICogICAgICAgICAgICAgICAgICAgICB0byBjb25zdW1lIG5ldyBkYXRhIGFuZCBpbmZvcm0gb2YgbWFya2VyLCBwb3NpdGlvbiB1cGRhdGVzLCBldGMuCiAgICAgICogdXNlcjogICAgICAgICAgICAgICBDb250ZXh0IGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIHJlY2VpdmVyLgogICAgICAqIG5vdGlmaWNhdGlvbkZyYW1lczogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBlYWNoIHRpbWUgbm90aWZpY2F0aW9uRnJhbWVzIFBDTQogICAgICAqICAgICAgICAgICAgICAgICAgICAgZnJhbWVzIGFyZSByZWFkeSBpbiByZWNvcmQgdHJhY2sgb3V0cHV0IGJ1ZmZlci4KQEAgLTE1MSwxMSArMTU4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkUpOwogCkBAIC0xNzEsOSArMTc4LDEwIEBACiAgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgaW50aWFsaXphdGlvbgogICAgICAqICAtIElOVkFMSURfT1BFUkFUSU9OOiBBdWRpb1JlY29yZCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIG9yIHJlY29yZCBkZXZpY2UgaXMgYWxyZWFkeSBpbiB1c2UKLSAgICAgKiAgLSBCQURfVkFMVUU6IGludmFsaWQgcGFyYW1ldGVyIChjaGFubmVscywgZm9ybWF0LCBzYW1wbGVSYXRlLi4uKQorICAgICAqICAtIEJBRF9WQUxVRTogaW52YWxpZCBwYXJhbWV0ZXIgKGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNhbXBsZVJhdGUuLi4pCiAgICAgICogIC0gTk9fSU5JVDogYXVkaW8gc2VydmVyIG9yIGF1ZGlvIGhhcmR3YXJlIG5vdCBpbml0aWFsaXplZAogICAgICAqICAtIFBFUk1JU1NJT05fREVOSUVEOiByZWNvcmRpbmcgaXMgbm90IGFsbG93ZWQgZm9yIHRoZSByZXF1ZXN0aW5nIHByb2Nlc3MKKyAgICAgKiBJZiBzdGF0dXMgaXMgbm90IGVxdWFsIHRvIE5PX0VSUk9SLCBkb24ndCBjYWxsIGFueSBvdGhlciBBUElzIG9uIHRoaXMgQXVkaW9SZWNvcmQuCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzIG5vdCBsaXN0ZWQgaW4gdGhlIEF1ZGlvUmVjb3JkIGNvbnN0cnVjdG9ycyBhYm92ZToKICAgICAgKgpAQCAtMTgzLDE2ICsxOTEsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FKTsKIAotICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvUmVjb3JkLiBUaGlzIG11c3QgYmUgY2hlY2tlZAorICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvUmVjb3JkLiBUaGlzIG11c3QgYmUgY2hlY2tlZCBmb3Igc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgogICAgICAqIGJlZm9yZSB1c2luZyBhbnkgQXVkaW9SZWNvcmQgQVBJIChleGNlcHQgZm9yIHNldCgpKSwgYmVjYXVzZSB1c2luZwogICAgICAqIGFuIHVuaW5pdGlhbGl6ZWQgQXVkaW9SZWNvcmQgcHJvZHVjZXMgdW5kZWZpbmVkIHJlc3VsdHMuCiAgICAgICogU2VlIHNldCgpIG1ldGhvZCBhYm92ZSBmb3IgcG9zc2libGUgcmV0dXJuIGNvZGVzLgpAQCAtMjIxLDcgKzIyOSw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0gQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiA9IDApOwogCi0gICAgLyogU3RvcCBhIHRyYWNrLiBJZiBzZXQsIHRoZSBjYWxsYmFjayB3aWxsIGNlYXNlIGJlaW5nIGNhbGxlZC4gIE5vdGUgdGhhdCBvYnRhaW5CdWZmZXIoKSBzdGlsbAorICAgIC8qIFN0b3AgYSB0cmFjay4gIFRoZSBjYWxsYmFjayB3aWxsIGNlYXNlIGJlaW5nIGNhbGxlZC4gIE5vdGUgdGhhdCBvYnRhaW5CdWZmZXIoKSBzdGlsbAogICAgICAqIHdvcmtzIGFuZCB3aWxsIGRyYWluIGJ1ZmZlcnMgdW50aWwgdGhlIHBvb2wgaXMgZXhoYXVzdGVkLCBhbmQgdGhlbiB3aWxsIHJldHVybiBXT1VMRF9CTE9DSy4KICAgICAgKi8KICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3AoKTsKQEAgLTIzMiwxMSArMjQwLDE2IEBACiAgICAgICovCiAgICAgICAgICAgICB1aW50MzJfdCAgICBnZXRTYW1wbGVSYXRlKCkgY29uc3QgICB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQogCisgICAgLyogUmV0dXJuIHRoZSBub3RpZmljYXRpb24gZnJhbWUgY291bnQuCisgICAgICogVGhpcyBpcyBhcHByb3hpbWF0ZWx5IGhvdyBvZnRlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCwgZm9yIHRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0suCisgICAgICovCisgICAgICAgICAgICBzaXplX3QgICAgICBub3RpZmljYXRpb25GcmFtZXMoKSBjb25zdCAgeyByZXR1cm4gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsgfQorCiAgICAgLyogU2V0cyBtYXJrZXIgcG9zaXRpb24uIFdoZW4gcmVjb3JkIHJlYWNoZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgc3BlY2lmaWVkLAogICAgICAqIGEgY2FsbGJhY2sgd2l0aCBldmVudCB0eXBlIEVWRU5UX01BUktFUiBpcyBjYWxsZWQuIENhbGxpbmcgc2V0TWFya2VyUG9zaXRpb24KICAgICAgKiB3aXRoIG1hcmtlciA9PSAwIGNhbmNlbHMgbWFya2VyIG5vdGlmaWNhdGlvbiBjYWxsYmFjay4KICAgICAgKiBUbyBzZXQgYSBtYXJrZXIgYXQgYSBwb3NpdGlvbiB3aGljaCB3b3VsZCBjb21wdXRlIGFzIDAsCi0gICAgICogYSB3b3JrYXJvdW5kIGlzIHRvIHRoZSBzZXQgdGhlIG1hcmtlciBhdCBhIG5lYXJieSBwb3NpdGlvbiBzdWNoIGFzIH4wIG9yIDEuCisgICAgICogYSB3b3JrYXJvdW5kIGlzIHRvIHNldCB0aGUgbWFya2VyIGF0IGEgbmVhcmJ5IHBvc2l0aW9uIHN1Y2ggYXMgfjAgb3IgMS4KICAgICAgKiBJZiB0aGUgQXVkaW9SZWNvcmQgaGFzIGJlZW4gb3BlbmVkIHdpdGggbm8gY2FsbGJhY2sgZnVuY3Rpb24gYXNzb2NpYXRlZCwKICAgICAgKiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbC4KICAgICAgKgpAQCAtMzc4LDggKzM5MSwxMCBAQAogICAgICAqIHJldHVybmluZyB0aGUgY3VycmVudCB2YWx1ZSBieSB0aGlzIGZ1bmN0aW9uIGNhbGwuICBTdWNoIGxvc3MgdHlwaWNhbGx5IG9jY3VycyB3aGVuIHRoZQogICAgICAqIHVzZXIgc3BhY2UgcHJvY2VzcyBpcyBibG9ja2VkIGxvbmdlciB0aGFuIHRoZSBjYXBhY2l0eSBvZiBhdWRpbyBkcml2ZXIgYnVmZmVycy4KICAgICAgKiBVbml0czogdGhlIG51bWJlciBvZiBpbnB1dCBhdWRpbyBmcmFtZXMuCisgICAgICogRklYTUUgVGhlIHNpZGUtZWZmZWN0IG9mIHJlc2V0dGluZyB0aGUgY291bnRlciBtYXkgYmUgaW5jb21wYXRpYmxlIHdpdGggbXVsdGktY2xpZW50LgorICAgICAqIENvbnNpZGVyIG1ha2luZyBpdCBtb3JlIGxpa2UgQXVkaW9UcmFjazo6Z2V0VW5kZXJydW5GcmFtZXMgd2hpY2ggZG9lc24ndCBoYXZlIHNpZGUgZWZmZWN0cy4KICAgICAgKi8KLSAgICAgICAgICAgIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3Q7CisgICAgICAgICAgICB1aW50MzJfdCAgICBnZXRJbnB1dEZyYW1lc0xvc3QoKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICAvKiBjb3B5aW5nIGF1ZGlvIHJlY29yZCBvYmplY3RzIGlzIG5vdCBhbGxvd2VkICovCkBAIC00MTIsNiArNDI3LDcgQEAKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBtUGF1c2VkOyAgICAvLyB3aGV0aGVyIHRocmVhZCBpcyByZXF1ZXN0ZWQgdG8gcGF1c2UgYXQgbmV4dCBsb29wIGVudHJ5CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbVBhdXNlZEludDsgLy8gd2hldGhlciB0aHJlYWQgaW50ZXJuYWxseSByZXF1ZXN0cyBwYXVzZQogICAgICAgICBuc2Vjc190ICAgICAgICAgICAgIG1QYXVzZWROczsgIC8vIGlmIG1QYXVzZWRJbnQgdGhlbiBhc3NvY2lhdGVkIHRpbWVvdXQsIG90aGVyd2lzZSBpZ25vcmVkCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQ7ICAgLy8gd2hldGhlciB0byBpZ25vcmUgbmV4dCBtUGF1c2VkSW50IHJlcXVlc3QKICAgICB9OwogCiAgICAgICAgICAgICAvLyBib2R5IG9mIEF1ZGlvUmVjb3JkVGhyZWFkOjp0aHJlYWRMb29wKCkKQEAgLTQyMiw5ICs0MzgsMTAgQEAKICAgICAgICAgICAgIC8vICAgICAgTlNfSU5BQ1RJVkUgaW5hY3RpdmUgc28gZG9uJ3QgcnVuIGFnYWluIHVudGlsIHJlLXN0YXJ0ZWQKICAgICAgICAgICAgIC8vICAgICAgTlNfTkVWRVIgICAgbmV2ZXIgYWdhaW4KICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IE5TX1dIRU5FVkVSID0gLTEsIE5TX0lOQUNUSVZFID0gLTIsIE5TX05FVkVSID0gLTM7Ci0gICAgICAgICAgICBuc2Vjc190IHByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxBdWRpb1JlY29yZFRocmVhZD4mIHRocmVhZCk7CisgICAgICAgICAgICBuc2Vjc190IHByb2Nlc3NBdWRpb0J1ZmZlcigpOwogCiAgICAgICAgICAgICAvLyBjYWxsZXIgbXVzdCBob2xkIGxvY2sgb24gbUxvY2sgZm9yIGFsbCBfbCBtZXRob2RzCisKICAgICAgICAgICAgIHN0YXR1c190IG9wZW5SZWNvcmRfbChzaXplX3QgZXBvY2gpOwogCiAgICAgICAgICAgICAvLyBGSVhNRSBlbnVtIGlzIGZhc3RlciB0aGFuIHN0cmNtcCgpIGZvciBwYXJhbWV0ZXIgJ2Zyb20nCkBAIC00NDQsMTQgKzQ2MSwxNiBAQAogICAgIC8vIGZvciBub3RpZmljYXRpb24gQVBJcwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXE7IC8vIHJlcXVlc3RlZCBudW1iZXIgb2YgZnJhbWVzIGJldHdlZW4gZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3RvciBvciBzZXQoKQogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7IC8vIGFjdHVhbCBudW1iZXIgb2YgZnJhbWVzIGJldHdlZW4gZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiBjYWxsYmFjawotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SZWZyZXNoUmVtYWluaW5nOyAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2ggbmV4dCAyCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAgICAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUmVtYWluaW5nRnJhbWVzIGFuZCBtUmV0cnlPblBhcnRpYWxCdWZmZXIKIAogICAgIC8vIFRoZXNlIGFyZSBwcml2YXRlIHRvIHByb2Nlc3NBdWRpb0J1ZmZlcigpLCBhbmQgYXJlIG5vdCBwcm90ZWN0ZWQgYnkgYSBsb2NrCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lczsgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyB0byByZXF1ZXN0IGluIG9idGFpbkJ1ZmZlcigpCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJldHJ5T25QYXJ0aWFsQnVmZmVyOyAgLy8gc2xlZXAgYW5kIHJldHJ5IGFmdGVyIHBhcnRpYWwgb2J0YWluQnVmZmVyKCkKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZTsgICAgICAvLyBsYXN0IG9ic2VydmVkIHZhbHVlIG9mIG1TZXF1ZW5jZQorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1PYnNlcnZlZFNlcXVlbmNlOyAgICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgdmFsdWUgb2YgbVNlcXVlbmNlCiAKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTWFya2VyUG9zaXRpb247ICAgIC8vIGluIHdyYXBwaW5nIChvdmVyZmxvdykgZnJhbWUgdW5pdHMKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtTWFya2VyUmVhY2hlZDsKQEAgLTQ2MCw5ICs0NzksMTMgQEAKIAogICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXM7CiAKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsgICAgICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBjdXJyZW50IElBdWRpb1JlY29yZCwgdmFsdWUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnRlZCBiYWNrIGJ5IEF1ZGlvRmxpbmdlciB0byB0aGUgY2xpZW50CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQ7ICAgICAgICAgLy8gZnJhbWUgY291bnQgdG8gcmVxdWVzdCB0aGUgZmlyc3Qgb3IgbmV4dCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBuZXcgSUF1ZGlvUmVjb3JkIGlzIG5lZWRlZCwgbm9uLWRlY3JlYXNpbmcKKwogICAgIC8vIGNvbnN0YW50IGFmdGVyIGNvbnN0cnVjdG9yIG9yIHNldCgpCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQ7CiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7ICAgICAgICAgLy8gYXBwLWxldmVsIGZyYW1lIHNpemUgPT0gQXVkaW9GbGluZ2VyIGZyYW1lIHNpemUKQEAgLTQ3MywxMiArNDk2LDEzIEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsKICAgICB0cmFuc2Zlcl90eXBlICAgICAgICAgICBtVHJhbnNmZXI7CiAKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtSW5wdXQ7ICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dCgpCi0KLSAgICAvLyBtYXkgYmUgY2hhbmdlZCBpZiBJQXVkaW9SZWNvcmQgb2JqZWN0IGlzIHJlLWNyZWF0ZWQKKyAgICAvLyBOZXh0IDUgZmllbGRzIG1heSBiZSBjaGFuZ2VkIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkLCBidXQgYWx3YXlzICE9IDAKKyAgICAvLyBwcm92aWRlZCB0aGUgaW5pdGlhbCBzZXQoKSB3YXMgc3VjY2Vzc2Z1bAogICAgIHNwPElBdWRpb1JlY29yZD4gICAgICAgIG1BdWRpb1JlY29yZDsKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIHJlLWxvYWQgYWZ0ZXIgbUxvY2sudW5sb2NrKCkKKyAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQnVmZmVyTWVtb3J5OworICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1JbnB1dDsgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYnkgQXVkaW9TeXN0ZW06OmdldElucHV0KCkKIAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1ByaW9yaXR5OyAgLy8gYmVmb3JlIHN0YXJ0KCkKICAgICBTY2hlZFBvbGljeSAgICAgICAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4NDdhMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9QVUJMSUNfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9QVUJMSUNfSAorCisvLyBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVggaXMgdGhlIG1heGltdW0gcmF0aW8gYmV0d2VlbiB0aGUgb3JpZ2luYWwKKy8vIGF1ZGlvIHNhbXBsZSByYXRlIGFuZCB0aGUgdGFyZ2V0IHJhdGUgd2hlbiBkb3duc2FtcGxpbmcsCisvLyBhcyBwZXJtaXR0ZWQgaW4gdGhlIGF1ZGlvIGZyYW1ld29yaywgZS5nLiBBdWRpb1RyYWNrIGFuZCBBdWRpb0ZsaW5nZXIuCisvLyBJbiBwcmFjdGljZSwgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGRvd25zYW1wbGUgbW9yZSB0aGFuIDY6MQorLy8gZm9yIGJlc3QgYXVkaW8gcXVhbGl0eSwgZXZlbiB0aG91Z2ggdGhlIGF1ZGlvIGZyYW1ld29yayBwZXJtaXRzIGEgbGFyZ2VyCisvLyBkb3duc2FtcGxpbmcgcmF0aW8uCisvLyBUT0RPOiByZXBsYWNlIHdpdGggYW4gQVBJCisjZGVmaW5lIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCAyNTYKKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX1BVQkxJQ19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggMjI1ZWY3Ni4uZjhjMDE5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC02NywyMCArNjgsMjQgQEAKIAogICAgIC8vIHJldHVybnMgdHJ1ZSBpbiAqc3RhdGUgaWYgdHJhY2tzIGFyZSBhY3RpdmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0gb3IgaGF2ZSBiZWVuIGFjdGl2ZQogICAgIC8vIGluIHRoZSBwYXN0IGluUGFzdE1zIG1pbGxpc2Vjb25kcwotICAgIHN0YXRpYyBzdGF0dXNfdCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCAqc3RhdGUsIHVpbnQzMl90IGluUGFzdE1zID0gMCk7CisgICAgc3RhdGljIHN0YXR1c190IGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sICpzdGF0ZSwgdWludDMyX3QgaW5QYXN0TXMpOwogICAgIC8vIHJldHVybnMgdHJ1ZSBpbiAqc3RhdGUgaWYgdHJhY2tzIGFyZSBhY3RpdmUgZm9yIHdoYXQgcXVhbGlmaWVzIGFzIHJlbW90ZSBwbGF5YmFjawogICAgIC8vIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtIG9yIGhhdmUgYmVlbiBhY3RpdmUgaW4gdGhlIHBhc3QgaW5QYXN0TXMgbWlsbGlzZWNvbmRzLiBSZW1vdGUKICAgICAvLyBwbGF5YmFjayBpc24ndCBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBsb2NhbCBwbGF5YmFjay4KICAgICBzdGF0aWMgc3RhdHVzX3QgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCAqc3RhdGUsCi0gICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDApOworICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpOwogICAgIC8vIHJldHVybnMgdHJ1ZSBpbiAqc3RhdGUgaWYgYSByZWNvcmRlciBpcyBjdXJyZW50bHkgcmVjb3JkaW5nIHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKICAgICBzdGF0aWMgc3RhdHVzX3QgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlLCBib29sICpzdGF0ZSk7CiAKICAgICAvLyBzZXQvZ2V0IGF1ZGlvIGhhcmR3YXJlIHBhcmFtZXRlcnMuIFRoZSBmdW5jdGlvbiBhY2NlcHRzIGEgbGlzdCBvZiBwYXJhbWV0ZXJzCiAgICAgLy8ga2V5IHZhbHVlIHBhaXJzIGluIHRoZSBmb3JtOiBrZXkxPXZhbHVlMTtrZXkyPXZhbHVlMjsuLi4KICAgICAvLyBTb21lIGtleXMgYXJlIHJlc2VydmVkIGZvciBzdGFuZGFyZCBwYXJhbWV0ZXJzIChTZWUgQXVkaW9QYXJhbWV0ZXIgY2xhc3MpLgorICAgIC8vIFRoZSB2ZXJzaW9ucyB3aXRoIGF1ZGlvX2lvX2hhbmRsZV90IGFyZSBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgbWVkaWEgZnJhbWV3b3JrIHVzZSBvbmx5LgogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICBzdGF0aWMgU3RyaW5nOCAgZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cyk7CisgICAgLy8gVGhlIHZlcnNpb25zIHdpdGhvdXQgYXVkaW9faW9faGFuZGxlX3QgYXJlIGludGVuZGVkIGZvciBKTkkuCisgICAgc3RhdGljIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgc3RhdGljIFN0cmluZzggIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7CiAKICAgICBzdGF0aWMgdm9pZCBzZXRFcnJvckNhbGxiYWNrKGF1ZGlvX2Vycm9yX2NhbGxiYWNrIGNiKTsKIApAQCAtOTAsMzYgKzk1LDM3IEBACiAgICAgc3RhdGljIGZsb2F0IGxpbmVhclRvTG9nKGludCB2b2x1bWUpOwogICAgIHN0YXRpYyBpbnQgbG9nVG9MaW5lYXIoZmxvYXQgdm9sdW1lKTsKIAorICAgIC8vIFJldHVybmVkIHNhbXBsaW5nUmF0ZSBhbmQgZnJhbWVDb3VudCBvdXRwdXQgdmFsdWVzIGFyZSBndWFyYW50ZWVkCisgICAgLy8gdG8gYmUgbm9uLXplcm8gaWYgc3RhdHVzID09IE5PX0VSUk9SCiAgICAgc3RhdGljIHN0YXR1c190IGdldE91dHB1dFNhbXBsaW5nUmF0ZSh1aW50MzJfdCogc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVCk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgc3RhdGljIHN0YXR1c190IGdldE91dHB1dFNhbXBsaW5nUmF0ZUZvckF0dHIodWludDMyX3QqIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRGcmFtZUNvdW50KHNpemVfdCogZnJhbWVDb3VudCwKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRMYXRlbmN5KHVpbnQzMl90KiBsYXRlbmN5LAotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVCk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldFNhbXBsaW5nUmF0ZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogc2FtcGxpbmdSYXRlKTsKICAgICAvLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBhdWRpbyBIQUwgd3JpdGUgYnVmZmVyLiBDb3JyZXNwb25kcyB0bwotICAgIC8vIGF1ZGlvX3N0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKCkvYXVkaW9fc3RyZWFtX2ZyYW1lX3NpemUoKQorICAgIC8vIGF1ZGlvX3N0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKCkvYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKCkKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBmcmFtZUNvdW50KTsKICAgICAvLyByZXR1cm5zIHRoZSBhdWRpbyBvdXRwdXQgc3RyZWFtIGxhdGVuY3kgaW4gbXMuIENvcnJlc3BvbmRzIHRvCiAgICAgLy8gYXVkaW9fc3RyZWFtX291dC0+Z2V0X2xhdGVuY3koKQogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRMYXRlbmN5KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogbGF0ZW5jeSk7CiAKICAgICBzdGF0aWMgYm9vbCByb3V0ZWRUb0EyZHBPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKIAorICAgIC8vIHJldHVybiBzdGF0dXMgTk9fRVJST1IgaW1wbGllcyAqYnVmZlNpemUgPiAwCiAgICAgc3RhdGljIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBzaXplX3QqIGJ1ZmZTaXplKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwogCiAgICAgLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgQXVkaW9GbGluZ2VyIHRvIGF1ZGlvIEhBTCBhbmQKLSAgICAvLyBhdWRpbyBkc3AgdG8gREFDIHNpbmNlIHRoZSBvdXRwdXQgb24gd2hpY2ggdGhlIHNwZWNpZmllZCBzdHJlYW0gaXMgcGxheWluZwotICAgIC8vIGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICAvLyBhdWRpbyBkc3AgdG8gREFDIHNpbmNlIHRoZSBzcGVjaWZpZWQgb3V0cHV0IEkvTyBoYW5kbGUgaGFzIGV4aXRlZCBzdGFuZGJ5LgogICAgIC8vIHJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgogICAgIC8vIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLCBoYWxGcmFtZXMgYW5kIGRzcEZyYW1lcyBwb2ludCB0byB2YWxpZCBkYXRhCiAgICAgLy8gLSBJTlZBTElEX09QRVJBVElPTjogTm90IHN1cHBvcnRlZCBvbiBjdXJyZW50IGhhcmR3YXJlIHBsYXRmb3JtCkBAIC0xMjcsMTYgKzEzMywyNiBAQAogICAgIC8vIE5PVEU6IHRoaXMgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBoYXJkd2FyZSBwbGF0Zm9ybXMgYW5kIGl0IGlzCiAgICAgLy8gbmVjZXNzYXJ5IHRvIGNoZWNrIHJldHVybmVkIHN0YXR1cyBiZWZvcmUgdXNpbmcgdGhlIHJldHVybmVkIHZhbHVlcy4KICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24oYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmhhbEZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpkc3BGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqaGFsRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZHNwRnJhbWVzKTsKIAogICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIGlucHV0IGZyYW1lcyBsb3N0IGJ5IEhBTCBpbXBsZW1lbnRhdGlvbiwgb3IgMCBpZiB0aGUgaGFuZGxlIGlzIGludmFsaWQKLSAgICBzdGF0aWMgc2l6ZV90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CisgICAgc3RhdGljIHVpbnQzMl90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CiAKLSAgICBzdGF0aWMgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCk7Ci0gICAgc3RhdGljIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pOwotICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKTsKKyAgICAvLyBBbGxvY2F0ZSBhIG5ldyB1bmlxdWUgSUQgZm9yIHVzZSBhcyBhbiBhdWRpbyBzZXNzaW9uIElEIG9yIEkvTyBoYW5kbGUuCisgICAgLy8gSWYgdW5hYmxlIHRvIGNvbnRhY3QgQXVkaW9GbGluZ2VyLCByZXR1cm5zIEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSBpbnN0ZWFkLgorICAgIC8vIEZJWE1FIElmIEF1ZGlvRmxpbmdlciB3ZXJlIHRvIGV2ZXIgZXhoYXVzdCB0aGUgdW5pcXVlIElEIG5hbWVzcGFjZSwKKyAgICAvLyAgICAgICB0aGlzIG1ldGhvZCBjb3VsZCBmYWlsIGJ5IHJldHVybmluZyBlaXRoZXIgQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFCisgICAgLy8gICAgICAgb3IgYW4gdW5zcGVjaWZpZWQgZXhpc3RpbmcgdW5pcXVlIElELgorICAgIHN0YXRpYyBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCk7CisKKyAgICBzdGF0aWMgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKKworICAgIC8vIEdldCB0aGUgSFcgc3luY2hyb25pemF0aW9uIHNvdXJjZSB1c2VkIGZvciBhbiBhdWRpbyBzZXNzaW9uLgorICAgIC8vIFJldHVybiBhIHZhbGlkIHNvdXJjZSBvciBBVURJT19IV19TWU5DX0lOVkFMSUQgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgLy8gb3Igbm8gSFcgc3luYyBzb3VyY2UgaXMgdXNlZC4KKyAgICBzdGF0aWMgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKIAogICAgIC8vIHR5cGVzIG9mIGlvIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGV2ZW50cyByZWNlaXZlZCB3aXRoIGlvQ29uZmlnQ2hhbmdlZCgpCiAgICAgZW51bSBpb19jb25maWdfZXZlbnQgewpAQCAtMTU1LDcgKzE3MSw4IEBACiAgICAgY2xhc3MgT3V0cHV0RGVzY3JpcHRvciB7CiAgICAgcHVibGljOgogICAgICAgICBPdXRwdXREZXNjcmlwdG9yKCkKLSAgICAgICAgOiBzYW1wbGluZ1JhdGUoMCksIGZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCksIGNoYW5uZWxNYXNrKDApLCBmcmFtZUNvdW50KDApLCBsYXRlbmN5KDApICB7fQorICAgICAgICA6IHNhbXBsaW5nUmF0ZSgwKSwgZm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKSwgY2hhbm5lbE1hc2soMCksIGZyYW1lQ291bnQoMCksIGxhdGVuY3koMCkKKyAgICAgICAgICAgIHt9CiAKICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlOwogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7CkBAIC0xOTMsMjcgKzIxMCw0NCBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwogICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CisKKyAgICAvLyBDbGllbnQgbXVzdCBzdWNjZXNzZnVsbHkgaGFuZCBvZmYgdGhlIGhhbmRsZSByZWZlcmVuY2UgdG8gQXVkaW9GbGluZ2VyIHZpYSBjcmVhdGVUcmFjaygpLAorICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlT3V0cHV0KCkuCiAgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKKyAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCk7CiAgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbik7CiAgICAgc3RhdGljIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworCisgICAgLy8gQ2xpZW50IG11c3Qgc3VjY2Vzc2Z1bGx5IGhhbmQgb2ZmIHRoZSBoYW5kbGUgcmVmZXJlbmNlIHRvIEF1ZGlvRmxpbmdlciB2aWEgb3BlblJlY29yZCgpLAorICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlSW5wdXQoKS4KICAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QpOworCisgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CiAgICAgc3RhdGljIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKQEAgLTI1NSw4ICsyODksNTYgQEAKICAgICAvLyBjaGVjayBwcmVzZW5jZSBvZiBhdWRpbyBmbGluZ2VyIHNlcnZpY2UuCiAgICAgLy8gcmV0dXJucyBOT19FUlJPUiBpZiBiaW5kaW5nIHRvIHNlcnZpY2Ugc3VjY2VlZHMsIERFQURfT0JKRUNUIG90aGVyd2lzZQogICAgIHN0YXRpYyBzdGF0dXNfdCBjaGVja0F1ZGlvRmxpbmdlcigpOworCisgICAgLyogTGlzdCBhdmFpbGFibGUgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKKworICAgIC8qIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8qIENyZWF0ZSBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCisgICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHN0YXRpYyBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgLyogTGlzdCBleGlzdGluZyBhdWRpbyBwYXRjaGVzICovCisgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworCisgICAgc3RhdGljIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpOworICAgIHN0YXRpYyBzdGF0dXNfdCByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKKyAgICBzdGF0aWMgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKTsKKwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorICAgIGNsYXNzIEF1ZGlvUG9ydENhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKKyAgICB7CisgICAgcHVibGljOgorCisgICAgICAgICAgICAgICAgQXVkaW9Qb3J0Q2FsbGJhY2soKSB7fQorICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvcnRDYWxsYmFjaygpIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VEaWVkKCkgPSAwOworCisgICAgfTsKKworICAgIHN0YXRpYyB2b2lkIHNldEF1ZGlvUG9ydENhbGxiYWNrKHNwPEF1ZGlvUG9ydENhbGxiYWNrPiBjYWxsQmFjayk7CisKIHByaXZhdGU6CiAKICAgICBjbGFzcyBBdWRpb0ZsaW5nZXJDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwgcHVibGljIEJuQXVkaW9GbGluZ2VyQ2xpZW50CkBAIC0yNzUsNyArMzU3LDggQEAKICAgICAgICAgdmlydHVhbCB2b2lkIGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpOwogICAgIH07CiAKLSAgICBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgIGNsYXNzIEF1ZGlvUG9saWN5U2VydmljZUNsaWVudDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50CiAgICAgewogICAgIHB1YmxpYzoKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KCkgewpAQCAtMjgzLDYgKzM2NiwxMCBAQAogCiAgICAgICAgIC8vIERlYXRoUmVjaXBpZW50CiAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworCisgICAgICAgIC8vIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgIH07CiAKICAgICBzdGF0aWMgc3A8QXVkaW9GbGluZ2VyQ2xpZW50PiBnQXVkaW9GbGluZ2VyQ2xpZW50OwpAQCAtMzAyLDExICszODksMTEgQEAKIAogICAgIHN0YXRpYyBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiBnQXVkaW9Qb2xpY3lTZXJ2aWNlOwogCi0gICAgLy8gbWFwcGluZyBiZXR3ZWVuIHN0cmVhbSB0eXBlcyBhbmQgb3V0cHV0cwotICAgIHN0YXRpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9faW9faGFuZGxlX3Q+IGdTdHJlYW1PdXRwdXRNYXA7CiAgICAgLy8gbGlzdCBvZiBvdXRwdXQgZGVzY3JpcHRvcnMgY29udGFpbmluZyBjYWNoZWQgcGFyYW1ldGVycwogICAgIC8vIChzYW1wbGluZyByYXRlLCBmcmFtZWNvdW50LCBjaGFubmVsIGNvdW50Li4uKQogICAgIHN0YXRpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIE91dHB1dERlc2NyaXB0b3IgKj4gZ091dHB1dHM7CisKKyAgICBzdGF0aWMgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+IGdBdWRpb1BvcnRDYWxsYmFjazsKIH07CiAKIH07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCmluZGV4IGMyOWM3ZTUuLjk5ZTljM2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgPHRpbWUuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworCiBjbGFzcyBBdWRpb1RpbWVzdGFtcCB7CiBwdWJsaWM6CiAgICAgQXVkaW9UaW1lc3RhbXAoKSA6IG1Qb3NpdGlvbigwKSB7CkBAIC0zMCw0ICszMiw2IEBACiAgICAgc3RydWN0IHRpbWVzcGVjIG1UaW1lOyAgICAgLy8gY29ycmVzcG9uZGluZyBDTE9DS19NT05PVE9OSUMgd2hlbiBmcmFtZSBpcyBleHBlY3RlZCB0byBwcmVzZW50CiB9OwogCit9ICAgLy8gbmFtZXNwYWNlCisKICNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19USU1FU1RBTVBfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCA0NzM2MzY5Li5iNTI1NmYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtMjcsNyArMjcsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIGF1ZGlvX3RyYWNrX2NibGtfdDsKK3N0cnVjdCBhdWRpb190cmFja19jYmxrX3Q7CiBjbGFzcyBBdWRpb1RyYWNrQ2xpZW50UHJveHk7CiBjbGFzcyBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHk7CiAKQEAgLTM2LDExICszNiw2IEBACiBjbGFzcyBBdWRpb1RyYWNrIDogcHVibGljIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICBlbnVtIGNoYW5uZWxfaW5kZXggewotICAgICAgICBNT05PICAgPSAwLAotICAgICAgICBMRUZUICAgPSAwLAotICAgICAgICBSSUdIVCAgPSAxCi0gICAgfTsKIAogICAgIC8qIEV2ZW50cyB1c2VkIGJ5IEF1ZGlvVHJhY2sgY2FsbGJhY2sgZnVuY3Rpb24gKGNhbGxiYWNrX3QpLgogICAgICAqIEtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9UcmFjay5qYXZhIE5BVElWRV9FVkVOVF8qLgpAQCAtODIsNiArNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjdXJyZW50bHkgaWdub3JlZCwgYnV0IHdpbGwgbWFrZSB0aGUgcHJpbWFyeSBmaWVsZCBpbiBmdXR1cmUpCiAKICAgICAgICAgc2l6ZV90ICAgICAgc2l6ZTsgICAgICAgICAvLyBpbnB1dC9vdXRwdXQgaW4gYnl0ZXMgPT0gZnJhbWVDb3VudCAqIGZyYW1lU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IGl0IGlzIHVudXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGZpbGxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgaXMgcmVkdW5kYW50IHdpdGggcmVzcGVjdCB0byBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBUUkFOU0ZFUl9PQlRBSU4gbW9kZSBpcyBicm9rZW4gZm9yIDgtYml0IGRhdGEKQEAgLTkxLDcgKzg3LDcgQEAKICAgICAgICAgICAgIHZvaWQqICAgICAgIHJhdzsKICAgICAgICAgICAgIHNob3J0KiAgICAgIGkxNjsgICAgICAvLyBzaWduZWQgMTYtYml0CiAgICAgICAgICAgICBpbnQ4X3QqICAgICBpODsgICAgICAgLy8gdW5zaWduZWQgOC1iaXQsIG9mZnNldCBieSAweDgwCi0gICAgICAgIH07CisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQ6IHVudXNlZCwgb3V0cHV0OiBwb2ludGVyIHRvIGJ1ZmZlcgogICAgIH07CiAKICAgICAvKiBBcyBhIGNvbnZlbmllbmNlLCBpZiBhIGNhbGxiYWNrIGlzIHN1cHBsaWVkLCBhIGhhbmRsZXIgdGhyZWFkCkBAIC0xMjMsNiArMTE5LDggQEAKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KICAgICAgKiAgLSBOT19JTklUOiBhdWRpbyBzZXJ2ZXIgb3IgYXVkaW8gaGFyZHdhcmUgbm90IGluaXRpYWxpemVkCiAgICAgICogIC0gQkFEX1ZBTFVFOiB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uCisgICAgICogZnJhbWVDb3VudCBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi16ZXJvIGlmIHN0YXR1cyBpcyBOT19FUlJPUiwKKyAgICAgKiBhbmQgaXMgdW5kZWZpbmVkIG90aGVyd2lzZS4KICAgICAgKi8KIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5GcmFtZUNvdW50KHNpemVfdCogZnJhbWVDb3VudCwKQEAgLTE1Niw5ICsxNTQsMTAgQEAKICAgICAgKiBzdHJlYW1UeXBlOiAgICAgICAgIFNlbGVjdCB0aGUgdHlwZSBvZiBhdWRpbyBzdHJlYW0gdGhpcyB0cmFjayBpcyBhdHRhY2hlZCB0bwogICAgICAqICAgICAgICAgICAgICAgICAgICAgKGUuZy4gQVVESU9fU1RSRUFNX01VU0lDKS4KICAgICAgKiBzYW1wbGVSYXRlOiAgICAgICAgIERhdGEgc291cmNlIHNhbXBsaW5nIHJhdGUgaW4gSHouCi0gICAgICogZm9ybWF0OiAgICAgICAgICAgICBBdWRpbyBmb3JtYXQgKGUuZyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCBmb3Igc2lnbmVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAxNiBiaXRzIHBlciBzYW1wbGUpLgotICAgICAqIGNoYW5uZWxNYXNrOiAgICAgICAgQ2hhbm5lbCBtYXNrLgorICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0LiAgRm9yIG1peGVkIHRyYWNrcywgYW55IFBDTSBmb3JtYXQgc3VwcG9ydGVkIGJ5IHNlcnZlciBpcyBPSworICAgICAqICAgICAgICAgICAgICAgICAgICAgb3IgQVVESU9fRk9STUFUX1BDTV84X0JJVCB3aGljaCBpcyBoYW5kbGVkIG9uIGNsaWVudCBzaWRlLiAgRm9yIGRpcmVjdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgYW5kIG9mZmxvYWRlZCB0cmFja3MsIHRoZSBwb3NzaWJsZSBmb3JtYXQocykgZGVwZW5kcyBvbiB0aGUgb3V0cHV0IHNpbmsuCisgICAgICogY2hhbm5lbE1hc2s6ICAgICAgICBDaGFubmVsIG1hc2ssIHN1Y2ggdGhhdCBhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykgaXMgdHJ1ZS4KICAgICAgKiBmcmFtZUNvdW50OiAgICAgICAgIE1pbmltdW0gc2l6ZSBvZiB0cmFjayBQQ00gYnVmZmVyIGluIGZyYW1lcy4gVGhpcyBkZWZpbmVzIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24ncyBjb250cmlidXRpb24gdG8gdGhlCiAgICAgICogICAgICAgICAgICAgICAgICAgICBsYXRlbmN5IG9mIHRoZSB0cmFjay4gVGhlIGFjdHVhbCBzaXplIHNlbGVjdGVkIGJ5IHRoZSBBdWRpb1RyYWNrIGNvdWxkIGJlCkBAIC0xODAsMTUgKzE3OSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICAgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkICAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKIAogICAgIC8qIENyZWF0ZXMgYW4gYXVkaW8gdHJhY2sgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEF1ZGlvRmxpbmdlci4KICAgICAgKiBXaXRoIHRoaXMgY29uc3RydWN0b3IsIHRoZSB0cmFjayBpcyBjb25maWd1cmVkIGZvciBzdGF0aWMgYnVmZmVyIG1vZGUuCkBAIC0yMDksMTEgKzIxMCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwpOwogCiAgICAgLyogVGVybWluYXRlcyB0aGUgQXVkaW9UcmFjayBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCiAgICAgICogQWxzbyBkZXN0cm95cyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXVkaW9UcmFjay4KQEAgLTI0MSwxNyArMjQ0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgICAgICAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvVHJhY2suIFRoaXMgbXVzdCBiZSBjaGVja2VkIGZvciBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uCiAgICAgICogYmVmb3JlIHVzaW5nIGFueSBBdWRpb1RyYWNrIEFQSSAoZXhjZXB0IGZvciBzZXQoKSksIGJlY2F1c2UgdXNpbmcKQEAgLTI3OSw3ICsyODQsNyBAQAogICAgICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVTaXplKCkgY29uc3QgICB7IHJldHVybiBtRnJhbWVTaXplOyB9CiAKICAgICAgICAgICAgIHVpbnQzMl90ICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQ7IH0KLSAgICAgICAgICAgIHVpbnQzMl90ICAgIGZyYW1lQ291bnQoKSBjb25zdCAgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KKyAgICAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCAgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KIAogICAgIC8qIFJldHVybiB0aGUgc3RhdGljIGJ1ZmZlciBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3Igb3Igc2V0KCksIG9yIDAgZm9yIHN0cmVhbWluZyBtb2RlICovCiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtU2hhcmVkQnVmZmVyOyB9CkBAIC0zMzYsNyArMzQxLDcgQEAKICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFNhbXBsZVJhdGUodWludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKLSAgICAvKiBSZXR1cm4gY3VycmVudCBzb3VyY2Ugc2FtcGxlIHJhdGUgaW4gSHosIG9yIDAgaWYgdW5rbm93biAqLworICAgIC8qIFJldHVybiBjdXJyZW50IHNvdXJjZSBzYW1wbGUgcmF0ZSBpbiBIeiAqLwogICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwogCiAgICAgLyogRW5hYmxlcyBsb29waW5nIGFuZCBzZXRzIHRoZSBzdGFydCBhbmQgZW5kIHBvaW50cyBvZiBsb29waW5nLgpAQCAtMzYxLDcgKzM2Niw3IEBACiAgICAgLyogU2V0cyBtYXJrZXIgcG9zaXRpb24uIFdoZW4gcGxheWJhY2sgcmVhY2hlcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBzcGVjaWZpZWQsIGEgY2FsbGJhY2sgd2l0aAogICAgICAqIGV2ZW50IHR5cGUgRVZFTlRfTUFSS0VSIGlzIGNhbGxlZC4gQ2FsbGluZyBzZXRNYXJrZXJQb3NpdGlvbiB3aXRoIG1hcmtlciA9PSAwIGNhbmNlbHMgbWFya2VyCiAgICAgICogbm90aWZpY2F0aW9uIGNhbGxiYWNrLiAgVG8gc2V0IGEgbWFya2VyIGF0IGEgcG9zaXRpb24gd2hpY2ggd291bGQgY29tcHV0ZSBhcyAwLAotICAgICAqIGEgd29ya2Fyb3VuZCBpcyB0byB0aGUgc2V0IHRoZSBtYXJrZXIgYXQgYSBuZWFyYnkgcG9zaXRpb24gc3VjaCBhcyB+MCBvciAxLgorICAgICAqIGEgd29ya2Fyb3VuZCBpcyB0byBzZXQgdGhlIG1hcmtlciBhdCBhIG5lYXJieSBwb3NpdGlvbiBzdWNoIGFzIH4wIG9yIDEuCiAgICAgICogSWYgdGhlIEF1ZGlvVHJhY2sgaGFzIGJlZW4gb3BlbmVkIHdpdGggbm8gY2FsbGJhY2sgZnVuY3Rpb24gYXNzb2NpYXRlZCwgdGhlIG9wZXJhdGlvbiB3aWxsCiAgICAgICogZmFpbC4KICAgICAgKgpAQCAtNDI1LDcgKzQzMCw3IEBACiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCiAgICAgICogIC0gQkFEX1ZBTFVFOiAgcG9zaXRpb24gaXMgTlVMTAogICAgICAqLwotICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbik7CiAKICAgICAvKiBGb3Igc3RhdGljIGJ1ZmZlciBtb2RlIG9ubHksIHRoaXMgcmV0dXJucyB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBpbiBmcmFtZXMKICAgICAgKiByZWxhdGl2ZSB0byBzdGFydCBvZiBidWZmZXIuICBJdCBpcyBhbmFsb2dvdXMgdG8gdGhlIHBvc2l0aW9uIHVuaXRzIHVzZWQgYnkKQEAgLTQ1MCw5ICs0NTUsMTAgQEAKICAgICAgKiAgbm9uZS4KICAgICAgKgogICAgICAqIFJldHVybmVkIHZhbHVlOgotICAgICAqICBoYW5kbGUgb24gYXVkaW8gaGFyZHdhcmUgb3V0cHV0CisgICAgICogIGhhbmRsZSBvbiBhdWRpbyBoYXJkd2FyZSBvdXRwdXQsIG9yIEFVRElPX0lPX0hBTkRMRV9OT05FIGlmIHRoZQorICAgICAqICB0cmFjayBuZWVkZWQgdG8gYmUgcmUtY3JlYXRlZCBidXQgdGhhdCBmYWlsZWQKICAgICAgKi8KLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgIGdldE91dHB1dCgpOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgZ2V0T3V0cHV0KCkgY29uc3Q7CiAKICAgICAvKiBSZXR1cm5zIHRoZSB1bmlxdWUgc2Vzc2lvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFjay4KICAgICAgKgpAQCAtNTI4LDE1ICs1MzQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqZWxhcHNlZCA9IE5VTEwsIHNpemVfdCAqbm9uQ29udGlnID0gTlVMTCk7CiBwdWJsaWM6CiAKLS8vRUxfRklYTUUgdG8gYmUgcmVjb25jaWxlZCB3aXRoIG5ldyBvYnRhaW5CdWZmZXIoKSByZXR1cm4gY29kZXMgYW5kIGNvbnRyb2wgYmxvY2sgcHJveHkKLS8vICAgICAgICAgICAgZW51bSB7Ci0vLyAgICAgICAgICAgIE5PX01PUkVfQlVGRkVSUyA9IDB4ODAwMDAwMDEsICAgLy8gc2FtZSBuYW1lIGluIEF1ZGlvRmxpbmdlci5oLCBvayB0byBiZSBkaWZmZXJlbnQgdmFsdWUKLS8vICAgICAgICAgICAgVEVBUl9ET1dOICAgICAgID0gMHg4MDAwMDAwMiwKLS8vICAgICAgICAgICAgU1RPUFBFRCA9IDEsCi0vLyAgICAgICAgICAgIFNUUkVBTV9FTkRfV0FJVCwKLS8vICAgICAgICAgICAgU1RSRUFNX0VORAotLy8gICAgICAgIH07Ci0KICAgICAvKiBSZWxlYXNlIGEgZmlsbGVkIGJ1ZmZlciBvZiAiYXVkaW9CdWZmZXItPmZyYW1lQ291bnQiIGZyYW1lcyBmb3IgQXVkaW9GbGluZ2VyIHRvIHByb2Nlc3MuICovCiAgICAgLy8gRklYTUUgbWFrZSBwcml2YXRlIHdoZW4gb2J0YWluQnVmZmVyKCkgZm9yIFRSQU5TRkVSX09CVEFJTiBpcyByZW1vdmVkCiAgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIpOwpAQCAtNTUxLDggKzU0OCwxMSBAQAogICAgICAqICAgICAgV09VTERfQkxPQ0sgICAgICAgICB3aGVuIG9idGFpbkJ1ZmZlcigpIHJldHVybnMgc2FtZSwgb3IKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayB3YXMgc3RvcHBlZCBkdXJpbmcgdGhlIHdyaXRlCiAgICAgICogICAgICBvciBhbnkgb3RoZXIgZXJyb3IgY29kZSByZXR1cm5lZCBieSBJQXVkaW9UcmFjazo6c3RhcnQoKSBvciByZXN0b3JlVHJhY2tfbCgpLgorICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gb25seSByZXR1cm4gdW50aWwgYWxsIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJyZWQuIFNldCAnYmxvY2tpbmcnIHRvCisgICAgICogZmFsc2UgZm9yIHRoZSBtZXRob2QgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyB0byB0cnkgbXVsdGlwbGUgdGltZXMgdG8gd3JpdGUKKyAgICAgKiB0aGUgZnVsbCBjb250ZW50IG9mIHRoZSBidWZmZXIuCiAgICAgICovCi0gICAgICAgICAgICBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICAgICAgICAgIHNzaXplX3QgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcgPSB0cnVlKTsKIAogICAgIC8qCiAgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHRyYWNrLgpAQCAtNTY2LDcgKzU2Niw3IEBACiAgICAgICAgICAgICB1aW50MzJfdCAgICBnZXRVbmRlcnJ1bkZyYW1lcygpIGNvbnN0OwogCiAgICAgLyogR2V0IHRoZSBmbGFncyAqLwotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGdldEZsYWdzKCkgY29uc3QgeyBBdXRvTXV0ZXggX2wobUxvY2spOyByZXR1cm4gbUZsYWdzOyB9CiAKICAgICAvKiBTZXQgcGFyYW1ldGVycyAtIG9ubHkgcG9zc2libGUgd2hlbiB1c2luZyBkaXJlY3Qgb3V0cHV0ICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwpAQCAtNTgwLDcgKzU4MCwxNSBAQAogICAgICAqIENhdXRpb246IGNhbGxpbmcgdGhpcyBtZXRob2QgdG9vIG9mdGVuIG1heSBiZSBpbmVmZmljaWVudDsKICAgICAgKiBpZiB5b3UgbmVlZCBhIGhpZ2ggcmVzb2x1dGlvbiBtYXBwaW5nIGJldHdlZW4gZnJhbWUgcG9zaXRpb24gYW5kIHByZXNlbnRhdGlvbiB0aW1lLAogICAgICAqIGNvbnNpZGVyIGltcGxlbWVudGluZyB0aGF0IGF0IGFwcGxpY2F0aW9uIGxldmVsLCBiYXNlZCBvbiB0aGUgbG93IHJlc29sdXRpb24gdGltZXN0YW1wcy4KLSAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4KKyAgICAgKiBSZXR1cm5zIE5PX0VSUk9SICAgIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4KKyAgICAgKiAgICAgICAgIFdPVUxEX0JMT0NLIGlmIGNhbGxlZCBpbiBTVE9QUEVEIG9yIEZMVVNIRUQgc3RhdGUsIG9yIGlmIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgc3RhcnQvQUNUSVZFLCB3aGVuIHRoZSBudW1iZXIgb2YgZnJhbWVzIGNvbnN1bWVkIGlzIGxlc3MgdGhhbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGwgaGFyZHdhcmUgbGF0ZW5jeSB0byBwaHlzaWNhbCBvdXRwdXQuIEluIFdPVUxEX0JMT0NLIGNhc2VzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgb25lIG1pZ2h0IHBvbGwgYWdhaW4sIG9yIHVzZSBnZXRQb3NpdGlvbigpLCBvciB1c2UgMCBwb3NpdGlvbiBhbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgdGltZSBmb3IgdGhlIHRpbWVzdGFtcC4KKyAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OICBpZiBjYWxsZWQgb24gYSBGYXN0VHJhY2ssIHdyb25nIHN0YXRlLCBvciBzb21lIG90aGVyIGVycm9yLgorICAgICAqCisgICAgICogVGhlIHRpbWVzdGFtcCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9uIHJldHVybiwgaWYgc3RhdHVzIGlzIG5vdCBOT19FUlJPUi4KICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKIApAQCAtNTg5LDYgKzU5NywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayhjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CiAgICAgICAgICAgICBBdWRpb1RyYWNrJiBvcGVyYXRvciA9IChjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CiAKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEF0dHJpYnV0ZXNGcm9tU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0U3RyZWFtVHlwZUZyb21BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYWEpOworICAgIC8qIHBhYSBpcyBndWFyYW50ZWVkIG5vbi1OVUxMICovCisgICAgICAgICAgICBib29sICAgICAgICBpc1ZhbGlkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnBhYSk7CisKICAgICAvKiBhIHNtYWxsIGludGVybmFsIGNsYXNzIHRvIGhhbmRsZSB0aGUgY2FsbGJhY2sgKi8KICAgICBjbGFzcyBBdWRpb1RyYWNrVGhyZWFkIDogcHVibGljIFRocmVhZAogICAgIHsKQEAgLTYyNiw1MyArNjM5LDYzIEBACiAgICAgICAgICAgICAvLyAgICAgIE5TX0lOQUNUSVZFIGluYWN0aXZlIHNvIGRvbid0IHJ1biBhZ2FpbiB1bnRpbCByZS1zdGFydGVkCiAgICAgICAgICAgICAvLyAgICAgIE5TX05FVkVSICAgIG5ldmVyIGFnYWluCiAgICAgICAgICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBOU19XSEVORVZFUiA9IC0xLCBOU19JTkFDVElWRSA9IC0yLCBOU19ORVZFUiA9IC0zOwotICAgICAgICAgICAgbnNlY3NfdCBwcm9jZXNzQXVkaW9CdWZmZXIoY29uc3Qgc3A8QXVkaW9UcmFja1RocmVhZD4mIHRocmVhZCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBwcm9jZXNzU3RyZWFtRW5kKGludDMyX3Qgd2FpdENvdW50KTsKKyAgICAgICAgICAgIG5zZWNzX3QgcHJvY2Vzc0F1ZGlvQnVmZmVyKCk7CiAKKyAgICAgICAgICAgIGJvb2wgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3Q7CisgICAgICAgICAgICBib29sICAgICBpc0RpcmVjdCgpIGNvbnN0OworICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0OwogCiAgICAgICAgICAgICAvLyBjYWxsZXIgbXVzdCBob2xkIGxvY2sgb24gbUxvY2sgZm9yIGFsbCBfbCBtZXRob2RzCiAKLSAgICAgICAgICAgIHN0YXR1c190IGNyZWF0ZVRyYWNrX2woYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVwb2NoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGNyZWF0ZVRyYWNrX2woKTsKIAogICAgICAgICAgICAgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gbVN0YXRlICE9IFNUQVRFX0FDVElWRQogICAgICAgICAgICAgdm9pZCBmbHVzaF9sKCk7CiAKICAgICAgICAgICAgIHZvaWQgc2V0TG9vcF9sKHVpbnQzMl90IGxvb3BTdGFydCwgdWludDMyX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRfbCgpOwogCiAgICAgICAgICAgICAvLyBGSVhNRSBlbnVtIGlzIGZhc3RlciB0aGFuIHN0cmNtcCgpIGZvciBwYXJhbWV0ZXIgJ2Zyb20nCiAgICAgICAgICAgICBzdGF0dXNfdCByZXN0b3JlVHJhY2tfbChjb25zdCBjaGFyICpmcm9tKTsKIAotICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWQoKSBjb25zdAorICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWRfbCgpIGNvbnN0CiAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDA7IH0KIAotICAgIC8vIE5leHQgMyBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCisgICAgICAgICAgICBib29sICAgICBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSBjb25zdAorICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpICE9IDA7IH0KKworICAgICAgICAgICAgYm9vbCAgICAgaXNEaXJlY3RfbCgpIGNvbnN0CisgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQorCisgICAgICAgICAgICAvLyBpbmNyZW1lbnQgbVBvc2l0aW9uIGJ5IHRoZSBkZWx0YSBvZiBtU2VydmVyLCBhbmQgcmV0dXJuIG5ldyB2YWx1ZSBvZiBtUG9zaXRpb24KKyAgICAgICAgICAgIHVpbnQzMl90IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKKworICAgIC8vIE5leHQgNCBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCiAgICAgc3A8SUF1ZGlvVHJhY2s+ICAgICAgICAgbUF1ZGlvVHJhY2s7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAgICAgLy8gcmUtbG9hZCBhZnRlciBtTG9jay51bmxvY2soKQorICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1PdXRwdXQ7ICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoKQogCiAgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gICAgbUF1ZGlvVHJhY2tUaHJlYWQ7CisKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtVm9sdW1lWzJdOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CiAgICAgbXV0YWJsZSB1aW50MzJfdCAgICAgICAgbVNhbXBsZVJhdGU7ICAgICAgICAgICAgLy8gbXV0YWJsZSBiZWNhdXNlIGdldFNhbXBsZVJhdGUoKSBjYW4gdXBkYXRlIGl0LgotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGN1cnJlbnQgSUF1ZGlvVHJhY2sKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudDsgICAgICAgICAvLyBmcmFtZSBjb3VudCB0byByZXF1ZXN0IHRoZSBuZXh0IHRpbWUgYSBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJQXVkaW9UcmFjayBpcyBuZWVkZWQKLQorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGN1cnJlbnQgSUF1ZGlvVHJhY2ssIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgYmFjayBieSBBdWRpb0ZsaW5nZXIgdG8gdGhlIGNsaWVudAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50OyAgICAgICAgIC8vIGZyYW1lIGNvdW50IHRvIHJlcXVlc3QgdGhlIGZpcnN0IG9yIG5leHQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbmV3IElBdWRpb1RyYWNrIGlzIG5lZWRlZCwgbm9uLWRlY3JlYXNpbmcKIAogICAgIC8vIGNvbnN0YW50IGFmdGVyIGNvbnN0cnVjdG9yIG9yIHNldCgpCiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsgICAgICAgICAgICAgICAgLy8gYXMgcmVxdWVzdGVkIGJ5IGNsaWVudCwgbm90IGZvcmNlZCB0byAxNi1iaXQKICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsKKyAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyOwogICAgIHRyYW5zZmVyX3R5cGUgICAgICAgICAgIG1UcmFuc2ZlcjsKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCAgICBtT2ZmbG9hZEluZm9Db3B5OworICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190KiBtT2ZmbG9hZEluZm87CisgICAgYXVkaW9fYXR0cmlidXRlc190ICAgICAgbUF0dHJpYnV0ZXM7CiAKICAgICAvLyBtRnJhbWVTaXplIGlzIGVxdWFsIHRvIG1GcmFtZVNpemVBRiBmb3Igbm9uLVBDTSBvciAxNi1iaXQgUENNIGRhdGEuICBGb3IgOC1iaXQgUENNIGRhdGEsIGl0J3MKICAgICAvLyB0d2ljZSBhcyBsYXJnZSBhcyBtRnJhbWVTaXplIGJlY2F1c2UgZGF0YSBpcyBleHBhbmRlZCB0byAxNi1iaXQgYmVmb3JlIGl0J3Mgc3RvcmVkIGluIGJ1ZmZlci4KQEAgLTcwNSwyMSArNzI4LDM5IEBACiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsgLy8gYWN0dWFsIG51bWJlciBvZiBmcmFtZXMgYmV0d2VlbiBlYWNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IGluaXRpYWwgc291cmNlIHNhbXBsZSByYXRlCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAgICAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2ggbmV4dCAyCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAgICAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUmVtYWluaW5nRnJhbWVzIGFuZCBtUmV0cnlPblBhcnRpYWxCdWZmZXIKIAogICAgIC8vIFRoZXNlIGFyZSBwcml2YXRlIHRvIHByb2Nlc3NBdWRpb0J1ZmZlcigpLCBhbmQgYXJlIG5vdCBwcm90ZWN0ZWQgYnkgYSBsb2NrCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lczsgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyB0byByZXF1ZXN0IGluIG9idGFpbkJ1ZmZlcigpCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJldHJ5T25QYXJ0aWFsQnVmZmVyOyAgLy8gc2xlZXAgYW5kIHJldHJ5IGFmdGVyIHBhcnRpYWwgb2J0YWluQnVmZmVyKCkKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZTsgICAgICAvLyBsYXN0IG9ic2VydmVkIHZhbHVlIG9mIG1TZXF1ZW5jZQogCi0gICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlcjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTG9vcFBlcmlvZDsgICAgICAgICAgICAvLyBpbiBmcmFtZXMsIHplcm8gbWVhbnMgbG9vcGluZyBpcyBkaXNhYmxlZAorCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU1hcmtlclBvc2l0aW9uOyAgICAgICAgLy8gaW4gd3JhcHBpbmcgKG92ZXJmbG93KSBmcmFtZSB1bml0cwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1NYXJrZXJSZWFjaGVkOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbjsgICAgICAgICAgIC8vIGluIGZyYW1lcwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1VcGRhdGVQZXJpb2Q7ICAgICAgICAgIC8vIGluIGZyYW1lcywgemVybyBtZWFucyBubyBFVkVOVF9ORVdfUE9TCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNlcnZlcjsgICAgICAgICAgICAgICAgLy8gaW4gZnJhbWVzLCBsYXN0IGtub3duIG1Qcm94eS0+Z2V0UG9zaXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGNvdW50IG9mIGZyYW1lcyBjb25zdW1lZCBieSBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgYnkgbmV3IElBdWRpb1RyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgaXQgaXMgcmVzZXQgYnkgc3RvcCgpIGlzIFRCRAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Qb3NpdGlvbjsgICAgICAgICAgICAgIC8vIGluIGZyYW1lcywgbGlrZSBtU2VydmVyIGV4Y2VwdCBjb250aW51ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb25vdG9uaWNhbGx5IGFmdGVyIG5ldyBJQXVkaW9UcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgY291bGQgYmUgZWFzaWx5IHdpZGVuZWQgdG8gdWludDY0X3QKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtUmVsZWFzZWQ7ICAgICAgICAgICAgICAvLyBpbiBmcmFtZXMsIGNvdW50IG9mIGZyYW1lcyByZWxlYXNlZCB0byBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbm90IG5lY2Vzc2FyaWx5IGNvbnN1bWVkIGJ5IHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBieSBzdG9wKCkgYnV0IGNvbnRpbnVlcyBtb25vdG9uaWNhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgbmV3IElBdWRpb1RyYWNrIHRvIHJlc3RvcmUgbVBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjb3VsZCBiZSBlYXNpbHkgd2lkZW5lZCB0byB1aW50NjRfdAorICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1TdGFydFVzOyAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCB0aW1lIGFmdGVyIGZsdXNoIG9yIHN0b3AuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB1c2VkIGZvciBvZmZsb2FkZWQgYW5kIGRpcmVjdCB0cmFja3MuCiAKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZ3M7CisgICAgICAgIC8vIGNvbnN0IGFmdGVyIHNldCgpLCBleGNlcHQgZm9yIGJpdHMgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBhbmQgQVVESU9fT1VUUFVUX0ZMQUdfT0ZGTE9BRC4KKyAgICAgICAgLy8gbUxvY2sgbXVzdCBiZSBoZWxkIHRvIHJlYWQgb3Igd3JpdGUgdGhvc2UgYml0cyByZWxpYWJseS4KKwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwogCkBAIC03MzksNyArNzgwLDYgQEAKICAgICBzcDxBdWRpb1RyYWNrQ2xpZW50UHJveHk+ICAgICAgIG1Qcm94eTsgICAgICAgICAvLyBwcmltYXJ5IG93bmVyIG9mIHRoZSBtZW1vcnkKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1JblVuZGVycnVuOyAgICAgICAgICAgIC8vIHdoZXRoZXIgdHJhY2sgaXMgY3VycmVudGx5IGluIHVuZGVycnVuIHN0YXRlCi0gICAgU3RyaW5nOCAgICAgICAgICAgICAgICAgbU5hbWU7ICAgICAgICAgICAgICAgICAgLy8gc2VydmVyJ3MgbmFtZSBmb3IgdGhpcyBJQXVkaW9UcmFjawogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1QYXVzZWRQb3NpdGlvbjsKIAogcHJpdmF0ZToKQEAgLTc1NCw4ICs3OTQsOCBAQAogCiAgICAgc3A8RGVhdGhOb3RpZmllcj4gICAgICAgbURlYXRoTm90aWZpZXI7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNlcXVlbmNlOyAgICAgICAgICAgICAgLy8gaW5jcmVtZW50ZWQgZm9yIGVhY2ggbmV3IElBdWRpb1RyYWNrIGF0dGVtcHQKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtT3V0cHV0OyAgICAgICAgICAgICAgICAvLyBjYWNoZWQgb3V0cHV0IGlvIGhhbmRsZQogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRVaWQ7CisgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZDsKIH07CiAKIGNsYXNzIFRpbWVkQXVkaW9UcmFjayA6IHB1YmxpYyBBdWRpb1RyYWNrCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWEzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQ0hBUkFDVEVSX0VOQ09ESU5HX0RFVEVDVE9SX0gKKyNkZWZpbmUgX0NIQVJBQ1RFUl9FTkNPRElOR19ERVRFQ1RPUl9ICisKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KKworI2luY2x1ZGUgIlN0cmluZ0FycmF5LmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3Vjc2RldC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IgeworCisgICAgcHVibGljOgorICAgIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKTsKKyAgICAgICAgfkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKTsKKworICAgICAgICB2b2lkIGFkZFRhZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7CisgICAgICAgIHNpemVfdCBzaXplKCk7CisKKyAgICAgICAgdm9pZCBkZXRlY3RBbmRDb252ZXJ0KCk7CisgICAgICAgIHN0YXR1c190IGdldFRhZyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKipuYW1lLCBjb25zdCBjaGFyKip2YWx1ZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBVQ2hhcnNldE1hdGNoICpnZXRQcmVmZXJyZWQoCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5wdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCoqIHVjbWEsIHNpemVfdCBtYXRjaGVzLAorICAgICAgICAgICAgICAgIGJvb2wgKmdvb2RtYXRjaCwgaW50ICpoaWdoZXN0bWF0Y2gpOworCisgICAgICAgIGJvb2wgaXNGcmVxdWVudChjb25zdCB1aW50MTZfdCAqdmFsdWVzLCB1aW50MzJfdCBjKTsKKworICAgICAgICAvLyBjYWNoZWQgbmFtZSBhbmQgdmFsdWUgc3RyaW5ncywgZm9yIG5hdGl2ZSBlbmNvZGluZyBzdXBwb3J0LgorICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHRoZXNlIHdpdGggYnl0ZSBibG9iIGFycmF5cyB0aGF0IGRvbid0IHJlcXVpcmUgdGhlIGRhdGEgdG8gYmUKKyAgICAgICAgLy8gc2luZ2xlbnVsbGJ5dGUtdGVybWluYXRlZAorICAgICAgICBTdHJpbmdBcnJheSAgICAgbU5hbWVzOworICAgICAgICBTdHJpbmdBcnJheSAgICAgbVZhbHVlczsKKworICAgICAgICBVQ29udmVydGVyKiAgICAgbVV0ZjhDb252OworfTsKKworCisKK307ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggODk5ZDc5Zi4uMzFhMTRmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTUwLDYgKzUwLDcgQEAKICAgICAgICAgVFJBQ0tfVElNRUQgICA9IDEsICAvLyBjbGllbnQgcmVxdWVzdHMgYSBUaW1lZEF1ZGlvVHJhY2sKICAgICAgICAgVFJBQ0tfRkFTVCAgICA9IDIsICAvLyBjbGllbnQgcmVxdWVzdHMgYSBmYXN0IEF1ZGlvVHJhY2sgb3IgQXVkaW9SZWNvcmQKICAgICAgICAgVFJBQ0tfT0ZGTE9BRCA9IDQsICAvLyBjbGllbnQgcmVxdWVzdHMgb2ZmbG9hZCB0byBodyBjb2RlYworICAgICAgICBUUkFDS19ESVJFQ1QgPSA4LCAgIC8vIGNsaWVudCByZXF1ZXN0cyBhIGRpcmVjdCBvdXRwdXQKICAgICB9OwogICAgIHR5cGVkZWYgdWludDMyX3QgdHJhY2tfZmxhZ3NfdDsKIApAQCAtNjQsMzcgKzY1LDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT24gc3VjY2Vzc2Z1bCByZXR1cm4sIEF1ZGlvRmxpbmdlciB0YWtlcyBvdmVyIHRoZSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGFuZCB3aWxsIHJlbGVhc2UgaXQgd2hlbiB0aGUgdHJhY2sgaXMgZGVzdHJveWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3dldmVyIG9uIGZhaWx1cmUsIHRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLCAgLy8gLTEgbWVhbnMgdW51c2VkLCBvdGhlcndpc2UgbXVzdCBiZSB2YWxpZCBub24tMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQ6IGlnbm9yZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0OiBzZXJ2ZXIncyBkZXNjcmlwdGlvbiBvZiBJQXVkaW9UcmFjayBmb3IgZGlzcGxheSBpbiBsb2dzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhdHRlbXB0IHRvIHBhcnNlLCBhcyB0aGUgZm9ybWF0IGNvdWxkIGNoYW5nZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykgPSAwOwogCiAgICAgdmlydHVhbCBzcDxJQXVkaW9SZWNvcmQ+IG9wZW5SZWNvcmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBBdWRpb0ZsaW5nZXIgdGFrZXMgb3ZlciB0aGUgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBhbmQgd2lsbCByZWxlYXNlIGl0IHdoZW4gdGhlIHRyYWNrIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBvbiBmYWlsdXJlLCB0aGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsICAvLyAtMSBtZWFucyB1bnVzZWQsIG90aGVyd2lzZSBtdXN0IGJlIHZhbGlkIG5vbi0wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBidWZmZXJzLCAgIC8vIHJldHVybiB2YWx1ZSAwIG1lYW5zIGl0IGZvbGxvd3MgY2JsawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKSA9IDA7CiAKICAgICAvKiBxdWVyeSB0aGUgYXVkaW8gaGFyZHdhcmUgc3RhdGUuIFRoaXMgc3RhdGUgbmV2ZXIgY2hhbmdlcywKICAgICAgKiBhbmQgdGhlcmVmb3JlIGNhbiBiZSBjYWNoZWQuCiAgICAgICovCiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0ID0gMDsKLSNpZiAwCi0gICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgPSAwOwotI2VuZGlmCiAgICAgdmlydHVhbCAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCA9IDA7CiAKQEAgLTE0Miw0MCArMTQ1LDQxIEBACiAgICAgdmlydHVhbCBzaXplX3QgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKIAotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbihzaXplX3QgKmhhbEZyYW1lcywgc2l6ZV90ICpkc3BGcmFtZXMsCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIHNpemVfdCBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBpbnQgbmV3QXVkaW9TZXNzaW9uSWQoKSA9IDA7CisgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpIGNvbnN0ID0gMDsKIApAQCAtMTg4LDYgKzE5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyIGRvZXNuJ3QgdGFrZSBvdmVyIGhhbmRsZSByZWZlcmVuY2UgZnJvbSBjbGllbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLApAQCAtMjA5LDYgKzIxNCwyOSBAQAogICAgIC8vIGFuZCBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZS4gIEZvciBhIGRlZmluaXRpb24gb2Ygd2hhdCAibG93IFJBTSIgbWVhbnMsIHNlZQogICAgIC8vIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5pc0xvd1JhbURldmljZSgpLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UpID0gMDsKKworICAgIC8qIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cykgPSAwOworCisgICAgLyogR2V0IGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSA9IDA7CisKKyAgICAvKiBDcmVhdGUgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKKyAgICAvKiBMaXN0IGV4aXN0aW5nIGF1ZGlvIHBhdGNoZXMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKSA9IDA7CisgICAgLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CisKKyAgICAvKiBHZXQgdGhlIEhXIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgdXNlZCBmb3IgYW4gYXVkaW8gc2Vzc2lvbiAqLworICAgIHZpcnR1YWwgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggMDliOWVhNi4uMTZmZTljZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogCkBAIC01NSw2ICs1NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCkgPSAwOworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKQEAgLTYzLDEzICs3MCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiA9IDApID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KSA9IDA7CkBAIC05OSw2ICsxMTAsNDAgQEAKICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZyBvciBvZmZsb2FkIHByb3BlcnR5IGlzIGVuYWJsZWQKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKSA9IDA7CisKKyAgICAvKiBMaXN0IGF2YWlsYWJsZSBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikgPSAwOworCisgICAgLyogR2V0IGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSA9IDA7CisKKyAgICAvKiBDcmVhdGUgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKKyAgICAvKiBMaXN0IGV4aXN0aW5nIGF1ZGlvIHBhdGNoZXMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pID0gMDsKKyAgICAvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKworICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkZjA0NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSUFVRElPUE9MSUNZU0VSVklDRUNMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSUFVRElPUE9MSUNZU0VSVklDRUNMSUVOVF9ICisKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCA6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQpOworCisgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKSA9IDA7CisgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcGF0Y2ggY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpID0gMDsKK307CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCbkF1ZGlvUG9saWN5U2VydmljZUNsaWVudCA6IHB1YmxpYyBCbkludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9JQVVESU9QT0xJQ1lTRVJWSUNFQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb1JlY29yZC5oCmluZGV4IGVjY2MyY2EuLjIwMDM5ODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9SZWNvcmQuaApAQCAtMzQsOSArMzQsNiBAQAogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9SZWNvcmQpOwogCi0gICAgLyogZ2V0IHRoaXMgdHJhY2tzIGNvbnRyb2wgYmxvY2sgKi8KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdCA9IDA7Ci0KICAgICAvKiBBZnRlciBpdCdzIGNyZWF0ZWQgdGhlIHRyYWNrIGlzIG5vdCBhY3RpdmUuIENhbGwgc3RhcnQoKSB0bwogICAgICAqIG1ha2UgaXQgYWN0aXZlLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCmluZGV4IDVjOGE0ODQuLjYxOWFjNzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKQEAgLTg4LDcgKzg4LDcgQEAKICAgICAvKiBTZW5kIHBhcmFtZXRlcnMgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpID0gMDsKIAotICAgIC8qIFJldHVybiBOT19FUlJPUiBpZiB0aW1lc3RhbXAgaXMgdmFsaWQgKi8KKyAgICAvKiBSZXR1cm4gTk9fRVJST1IgaWYgdGltZXN0YW1wIGlzIHZhbGlkLiAgdGltZXN0YW1wIGlzIHVuZGVmaW5lZCBvdGhlcndpc2UuICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgPSAwOwogCiAgICAgLyogU2lnbmFsIHRoZSBwbGF5YmFjayB0aHJlYWQgZm9yIGEgY2hhbmdlIGluIGNvbnRyb2wgYmxvY2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSURybS5oIGIvaW5jbHVkZS9tZWRpYS9JRHJtLmgKaW5kZXggMzJhZTI4ZS4uNjhkZTg3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JRHJtLmgKQEAgLTcwLDYgKzcwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSkgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnByb3Zpc2lvbkRldmljZSgpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjTGlzdC5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY0xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTNlYThiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY0xpc3QuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lNRURJQUNPREVDTElTVF9ICisjZGVmaW5lIEFORFJPSURfSU1FRElBQ09ERUNMSVNUX0gKKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAgLy8gZm9yIHN0YXR1c190CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhQ29kZWNJbmZvOworCitjbGFzcyBJTWVkaWFDb2RlY0xpc3Q6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYUNvZGVjTGlzdCk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudENvZGVjcygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNwPE1lZGlhQ29kZWNJbmZvPiBnZXRDb2RlY0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZmluZENvZGVjQnlUeXBlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgYm9vbCBlbmNvZGVyLCBzaXplX3Qgc3RhcnRJbmRleCA9IDApIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgc3NpemVfdCBmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCbk1lZGlhQ29kZWNMaXN0OiBwdWJsaWMgQm5JbnRlcmZhY2U8SU1lZGlhQ29kZWNMaXN0PgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSU1FRElBQ09ERUNMSVNUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTYzZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElfTUVESUFfSFRUUF9DT05ORUNUSU9OX0hfCisKKyNkZWZpbmUgSV9NRURJQV9IVFRQX0NPTk5FQ1RJT05fSF8KKworI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uOworCisvKiogTVVTVCBzdGF5IGluIHN5bmMgd2l0aCBJTWVkaWFIVFRQQ29ubmVjdGlvbi5haWRsICovCisKK3N0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhSFRUUENvbm5lY3Rpb24pOworCisgICAgdmlydHVhbCBib29sIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpID0gMDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwgb2ZmNjRfdCBnZXRTaXplKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TUlNRVR5cGUoU3RyaW5nOCAqbWltZVR5cGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVyaShTdHJpbmc4ICp1cmkpID0gMDsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJTWVkaWFIVFRQQ29ubmVjdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIElfTUVESUFfSFRUUF9DT05ORUNUSU9OX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2ZDZjOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJX01FRElBX0hUVFBfU0VSVklDRV9IXworCisjZGVmaW5lIElfTUVESUFfSFRUUF9TRVJWSUNFX0hfCisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSU1lZGlhSFRUUENvbm5lY3Rpb247CisKKy8qKiBNVVNUIHN0YXkgaW4gc3luYyB3aXRoIElNZWRpYUhUVFBTZXJ2aWNlLmFpZGwgKi8KKworc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UgeworICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFIVFRQU2VydmljZSk7CisKKyAgICB2aXJ0dWFsIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBtYWtlSFRUUENvbm5lY3Rpb24oKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSU1lZGlhSFRUUFNlcnZpY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBJX01FRElBX0hUVFBfU0VSVklDRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDZkYmIyZDcuLjI1Mjk4MDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTI2LDYgKzI2LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CisKIGNsYXNzIElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOiBwdWJsaWMgSUludGVyZmFjZQogewogcHVibGljOgpAQCAtMzMsNiArMzUsNyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNyY1VybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAppbmRleCAwY2JkMjY5Li5kYjYyY2Q1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKQEAgLTMzLDYgKzMzLDcgQEAKIGNsYXNzIFN1cmZhY2U7CiBjbGFzcyBJU3RyZWFtU291cmNlOwogY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIAogY2xhc3MgSU1lZGlhUGxheWVyOiBwdWJsaWMgSUludGVyZmFjZQogewpAQCAtNDEsOCArNDIsMTEgQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+KiBoZWFkZXJzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiogaGVhZGVycykgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4mIHNvdXJjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IDI5OThiMzcuLmQ3ZTU4NGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCkBAIC0zNCw2ICszNCw4IEBACiBzdHJ1Y3QgSUNyeXB0bzsKIHN0cnVjdCBJRHJtOwogc3RydWN0IElIRENQOworc3RydWN0IElNZWRpYUNvZGVjTGlzdDsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVJlY29yZGVyOwogY2xhc3MgSU9NWDsKIGNsYXNzIElSZW1vdGVEaXNwbGF5OwpAQCAtNDksOSArNTEsMTQgQEAKICAgICB2aXJ0dWFsIHNwPElNZWRpYU1ldGFkYXRhUmV0cmlldmVyPiBjcmVhdGVNZXRhZGF0YVJldHJpZXZlcigpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gY3JlYXRlKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGF1ZGlvU2Vzc2lvbklkID0gMCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgIGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICBkZWNvZGUoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgIGRlY29kZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKSA9IDA7CkBAIC01OSw2ICs2Niw3IEBACiAgICAgdmlydHVhbCBzcDxJQ3J5cHRvPiAgICAgICAgIG1ha2VDcnlwdG8oKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJRHJtPiAgICAgICAgICAgIG1ha2VEcm0oKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJSERDUD4gICAgICAgICAgIG1ha2VIRENQKGJvb2wgY3JlYXRlRW5jcnlwdGlvbk1vZHVsZSkgPSAwOworICAgIHZpcnR1YWwgc3A8SU1lZGlhQ29kZWNMaXN0PiBnZXRDb2RlY0xpc3QoKSBjb25zdCA9IDA7CiAKICAgICAvLyBDb25uZWN0cyB0byBhIHJlbW90ZSBkaXNwbGF5LgogICAgIC8vICdpZmFjZScgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhbCBpbnRlcmZhY2Ugb24gd2hpY2ggdG8gbGlzdGVuIGZvcgpAQCAtOTMsOSArMTAxLDYgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBhZGRCYXR0ZXJ5RGF0YSh1aW50MzJfdCBwYXJhbXMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHB1bGxCYXR0ZXJ5RGF0YShQYXJjZWwqIHJlcGx5KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lPTVguaCBiL2luY2x1ZGUvbWVkaWEvSU9NWC5oCmluZGV4IGQ3YmUwNmYuLjU5NWU1MWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU9NWC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU9NWC5oCkBAIC0zOCw4ICszOCw4IEBACiBwdWJsaWM6CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShPTVgpOwogCi0gICAgdHlwZWRlZiB2b2lkICpidWZmZXJfaWQ7Ci0gICAgdHlwZWRlZiB2b2lkICpub2RlX2lkOworICAgIHR5cGVkZWYgdWludDMyX3QgYnVmZmVyX2lkOworICAgIHR5cGVkZWYgdWludDMyX3Qgbm9kZV9pZDsKIAogICAgIC8vIEdpdmVuIGEgbm9kZV9pZCBhbmQgdGhlIGNhbGxpbmcgcHJvY2VzcycgcGlkLCByZXR1cm5zIHRydWUgaWZmCiAgICAgLy8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBPTVggaW50ZXJmYWNlIGxpdmVzIGluIHRoZSBzYW1lCkBAIC04Nyw2ICs4NywxMCBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAogICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSA9IDA7CiAKKyAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVHcmFwaGljQnVmZmVycygKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpID0gMDsKIApAQCAtMTQzLDYgKzE0Nyw4IEBACiAgICAgICAgIElOVEVSTkFMX09QVElPTl9TVVNQRU5ELCAgLy8gZGF0YSBpcyBhIGJvb2wKICAgICAgICAgSU5URVJOQUxfT1BUSU9OX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9ERUxBWSwgIC8vIGRhdGEgaXMgYW4gaW50NjRfdAogICAgICAgICBJTlRFUk5BTF9PUFRJT05fTUFYX1RJTUVTVEFNUF9HQVAsIC8vIGRhdGEgaXMgaW50NjRfdAorICAgICAgICBJTlRFUk5BTF9PUFRJT05fU1RBUlRfVElNRSwgLy8gZGF0YSBpcyBhbiBpbnQ2NF90CisgICAgICAgIElOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFLCAvLyBkYXRhIGlzIGFuIGludDY0X3RbMl0KICAgICB9OwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW50ZXJuYWxPcHRpb24oCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsCkBAIC0xODIsOCArMTg4LDYgQEAKICAgICAgICAgICAgIE9NWF9VMzIgcmFuZ2VfbGVuZ3RoOwogICAgICAgICAgICAgT01YX1UzMiBmbGFnczsKICAgICAgICAgICAgIE9NWF9USUNLUyB0aW1lc3RhbXA7Ci0gICAgICAgICAgICBPTVhfUFRSIHBsYXRmb3JtX3ByaXZhdGU7Ci0gICAgICAgICAgICBPTVhfUFRSIGRhdGFfcHRyOwogICAgICAgICB9IGV4dGVuZGVkX2J1ZmZlcl9kYXRhOwogCiAgICAgfSB1OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTZhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQ09ERUNfSU5GT19IXworCisjZGVmaW5lIE1FRElBX0NPREVDX0lORk9fSF8KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworc3RydWN0IFBhcmNlbDsKK3N0cnVjdCBDb2RlY0NhcGFiaWxpdGllczsKKworc3RydWN0IE1lZGlhQ29kZWNJbmZvIDogcHVibGljIFJlZkJhc2UgeworICAgIHN0cnVjdCBQcm9maWxlTGV2ZWwgeworICAgICAgICB1aW50MzJfdCBtUHJvZmlsZTsKKyAgICAgICAgdWludDMyX3QgbUxldmVsOworICAgIH07CisKKyAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzIDogcHVibGljIFJlZkJhc2UgeworICAgICAgICB2b2lkIGdldFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMpIGNvbnN0OworICAgICAgICB2b2lkIGdldFN1cHBvcnRlZENvbG9yRm9ybWF0cyhWZWN0b3I8dWludDMyX3Q+ICpjb2xvckZvcm1hdHMpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBnZXRGbGFncygpIGNvbnN0OworICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gZ2V0RGV0YWlscygpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gbVByb2ZpbGVMZXZlbHM7CisgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gbUNvbG9yRm9ybWF0czsKKyAgICAgICAgdWludDMyX3QgbUZsYWdzOworICAgICAgICBzcDxBTWVzc2FnZT4gbURldGFpbHM7CisKKyAgICAgICAgQ2FwYWJpbGl0aWVzKCk7CisKKyAgICAgICAgLy8gcmVhZCBvYmplY3QgZnJvbSBwYXJjZWwgZXZlbiBpZiBvYmplY3QgY3JlYXRpb24gZmFpbHMKKyAgICAgICAgc3RhdGljIHNwPENhcGFiaWxpdGllcz4gRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7CisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCisgICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENhcGFiaWxpdGllcyk7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIE1lZGlhQ29kZWNJbmZvOworICAgIH07CisKKyAgICBib29sIGlzRW5jb2RlcigpIGNvbnN0OworICAgIGJvb2wgaGFzUXVpcmsoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisgICAgdm9pZCBnZXRTdXBwb3J0ZWRNaW1lcyhWZWN0b3I8QVN0cmluZz4gKm1pbWVzKSBjb25zdDsKKyAgICBjb25zdCBzcDxDYXBhYmlsaXRpZXM+IGdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptaW1lKSBjb25zdDsKKyAgICBjb25zdCBjaGFyICpnZXRDb2RlY05hbWUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6YXRpb24gb3ZlciBCaW5kZXIKKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8TWVkaWFDb2RlY0luZm8+IEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIHZhcmlhYmxlIHNldCBvbmx5IGluIGNvbnN0cnVjdG9yIC0gdGhlc2UgYXJlIGFjY2Vzc2VkIGJ5IE1lZGlhQ29kZWNMaXN0CisgICAgLy8gdG8gYXZvaWQgZHVwbGljYXRpb24gb2Ygc2FtZSB2YXJpYWJsZXMKKyAgICBBU3RyaW5nIG1OYW1lOworICAgIGJvb2wgbUlzRW5jb2RlcjsKKyAgICBib29sIG1IYXNTb2xlTWltZTsgLy8gd2FzIGluaXRpYWxpemVkIHdpdGggbWltZQorCisgICAgVmVjdG9yPEFTdHJpbmc+IG1RdWlya3M7CisgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgc3A8Q2FwYWJpbGl0aWVzPiA+IG1DYXBzOworCisgICAgc3A8Q2FwYWJpbGl0aWVzPiBtQ3VycmVudENhcHM7IC8vIGN1cnJlbnRseSBpbml0YWxpemVkIGNhcGFiaWxpdGllcworCisgICAgc3NpemVfdCBnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWltZSkgY29uc3Q7CisKKyAgICAvKiBNZXRob2RzIHVzZWQgYnkgTWVkaWFDb2RlY0xpc3QgdG8gY29uc3RydWN0IHRoZSBpbmZvCisgICAgICogb2JqZWN0IGZyb20gWE1MLgorICAgICAqCisgICAgICogQWZ0ZXIgaW5mbyBvYmplY3QgaXMgY3JlYXRlZDoKKyAgICAgKiAtIGFkZGl0aW9uYWwgcXVpcmtzIGNhbiBiZSBhZGRlZAorICAgICAqIC0gYWRkaXRpb25hbCBtaW1lcyBjYW4gYmUgYWRkZWQKKyAgICAgKiAgIC0gT01YIGNvZGVjIGNhcGFiaWxpdGllcyBjYW4gYmUgc2V0IGZvciB0aGUgY3VycmVudCBtaW1lLXR5cGUKKyAgICAgKiAgIC0gYSBjYXBhYmlsaXR5IGRldGFpbCBjYW4gYmUgc2V0IGZvciB0aGUgY3VycmVudCBtaW1lLXR5cGUKKyAgICAgKiAgIC0gYSBmZWF0dXJlIGNhbiBiZSBzZXQgZm9yIHRoZSBjdXJyZW50IG1pbWUtdHlwZQorICAgICAqICAgLSBpbmZvIG9iamVjdCBjYW4gYmUgY29tcGxldGVkIHdoZW4gcGFyc2luZyBvZiBhIG1pbWUtdHlwZSBpcyBkb25lCisgICAgICovCisgICAgTWVkaWFDb2RlY0luZm8oQVN0cmluZyBuYW1lLCBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm1pbWUpOworICAgIHZvaWQgYWRkUXVpcmsoY29uc3QgY2hhciAqbmFtZSk7CisgICAgc3RhdHVzX3QgYWRkTWltZShjb25zdCBjaGFyICptaW1lKTsKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplQ2FwYWJpbGl0aWVzKGNvbnN0IENvZGVjQ2FwYWJpbGl0aWVzICZjYXBzKTsKKyAgICB2b2lkIGFkZERldGFpbChjb25zdCBBU3RyaW5nICZrZXksIGNvbnN0IEFTdHJpbmcgJnZhbHVlKTsKKyAgICB2b2lkIGFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBpbnQzMl90IHZhbHVlKTsKKyAgICB2b2lkIGFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7CisgICAgdm9pZCByZW1vdmVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpOworICAgIHZvaWQgY29tcGxldGUoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhQ29kZWNJbmZvKTsKKworICAgIGZyaWVuZCBjbGFzcyBNZWRpYUNvZGVjTGlzdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQ09ERUNfSU5GT19IXworCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKaW5kZXggZWNjM2I2NS4uMzhkYmIyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKQEAgLTIwLDEwICsyMCwxMyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CisKIC8vIEFic3RyYWN0IGJhc2UgY2xhc3MKIGNsYXNzIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJCYXNlIDogcHVibGljIFJlZkJhc2UKIHsKQEAgLTMyLDYgKzM1LDcgQEAKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZSgpIHt9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCAyNmQ4NzI5Li5jZjE4YTQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KICNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogCiAvLyBGd2QgZGVjbCB0byBtYWtlIHN1cmUgZXZlcnlvbmUgYWdyZWVzIHRoYXQgdGhlIHNjb3BlIG9mIHN0cnVjdCBzb2NrYWRkcl9pbiBpcwpAQCAtOTcsNiArOTgsNyBAQAogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGxhdGVuY3koKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgbXNlY3NQZXJGcmFtZSgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGdldFNlc3Npb25JZCgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0ID0gMDsKQEAgLTEzNyw2ICsxMzksNyBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpID0gMDsKIApAQCAtMjEzLDExICsyMTYsNiBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllclNlcnZpY2U7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggOWZjOTYyYy4uZjA2MWQyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTMzLDcgKzMzLDggQEAKICAgICBDQU1DT1JERVJfUVVBTElUWV83MjBQID0gNSwKICAgICBDQU1DT1JERVJfUVVBTElUWV8xMDgwUCA9IDYsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfUVZHQSA9IDcsCi0gICAgQ0FNQ09SREVSX1FVQUxJVFlfTElTVF9FTkQgPSA3LAorICAgIENBTUNPUkRFUl9RVUFMSVRZXzIxNjBQID0gOCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9MSVNUX0VORCA9IDgsCiAKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfU1RBUlQgPSAxMDAwLAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICA9IDEwMDAsCkBAIC00NCw3ICs0NSwxNyBAQAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNzIwUCA9IDEwMDUsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUCA9IDEwMDYsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RVkdBID0gMTAwNywKLSAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EID0gMTAwNywKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzIxNjBQID0gMTAwOCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EID0gMTAwOCwKKworICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9TVEFSVCA9IDIwMDAsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MT1cgID0gMjAwMCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0hJR0ggPSAyMDAxLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNDgwUCA9IDIwMDIsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF83MjBQID0gMjAwMywKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzEwODBQID0gMjAwNCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzIxNjBQID0gMjAwNSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xJU1RfRU5EID0gMjAwNSwKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9Tb3VuZFBvb2wuaCBiL2luY2x1ZGUvbWVkaWEvU291bmRQb29sLmgKaW5kZXggMWIyMWEzNi4uZjU3MzEzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9Tb3VuZFBvb2wuaAorKysgYi9pbmNsdWRlL21lZGlhL1NvdW5kUG9vbC5oCkBAIC0xNjcsNyArMTY3LDcgQEAKICAgICBmcmllbmQgY2xhc3MgU291bmRQb29sVGhyZWFkOwogICAgIGZyaWVuZCBjbGFzcyBTb3VuZENoYW5uZWw7CiBwdWJsaWM6Ci0gICAgU291bmRQb29sKGludCBtYXhDaGFubmVscywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCBpbnQgc3JjUXVhbGl0eSk7CisgICAgU291bmRQb29sKGludCBtYXhDaGFubmVscywgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyk7CiAgICAgflNvdW5kUG9vbCgpOwogICAgIGludCBsb2FkKGNvbnN0IGNoYXIqIHVybCwgaW50IHByaW9yaXR5KTsKICAgICBpbnQgbG9hZChpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IHByaW9yaXR5KTsKQEAgLTE4Myw4ICsxODMsNyBAQAogICAgIHZvaWQgc2V0UHJpb3JpdHkoaW50IGNoYW5uZWxJRCwgaW50IHByaW9yaXR5KTsKICAgICB2b2lkIHNldExvb3AoaW50IGNoYW5uZWxJRCwgaW50IGxvb3ApOwogICAgIHZvaWQgc2V0UmF0ZShpbnQgY2hhbm5lbElELCBmbG9hdCByYXRlKTsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQotICAgIGludCBzcmNRdWFsaXR5KCkgY29uc3QgeyByZXR1cm4gbVNyY1F1YWxpdHk7IH0KKyAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHJpYnV0ZXMoKSB7IHJldHVybiAmbUF0dHJpYnV0ZXM7IH0KIAogICAgIC8vIGNhbGxlZCBmcm9tIFNvdW5kUG9vbFRocmVhZAogICAgIHZvaWQgc2FtcGxlTG9hZGVkKGludCBzYW1wbGVJRCk7CkBAIC0yMjUsOCArMjI0LDcgQEAKICAgICBMaXN0PFNvdW5kQ2hhbm5lbCo+ICAgICBtU3RvcDsKICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGludCwgc3A8U2FtcGxlPiA+ICAgbVNhbXBsZXM7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbU1heENoYW5uZWxzOwotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgIG1TdHJlYW1UeXBlOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TcmNRdWFsaXR5OworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgICAgIG1BdHRyaWJ1dGVzOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BbGxvY2F0ZWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbU5leHRTYW1wbGVJRDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtTmV4dENoYW5uZWxJRDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmggYi9pbmNsdWRlL21lZGlhL1N0cmluZ0FycmF5LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWEvU3RyaW5nQXJyYXkuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAppbmRleCAwZGY3N2MxLi5iMzVjZjMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaApAQCAtMjUsNiArMjUsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVBsYXllclNlcnZpY2U7CiBjbGFzcyBJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjsKIApAQCAtNjgsNiArNjksNyBAQAogICAgIHZvaWQgZGlzY29ubmVjdCgpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpkYXRhU291cmNlVXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCmluZGV4IDRjMDVmYzMuLjljYzIwOGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTE2MCw2ICsxNjAsOSBAQAogICAgIC8vIFBsYXliYWNrIHJhdGUgZXhwcmVzc2VkIGluIHBlcm1pbGxlICgxMDAwIGlzIG5vcm1hbCBzcGVlZCksIHNhdmVkIGFzIGludDMyX3QsIHdpdGggbmVnYXRpdmUKICAgICAvLyB2YWx1ZXMgdXNlZCBmb3IgcmV3aW5kaW5nIG9yIHJldmVyc2UgcGxheWJhY2suCiAgICAgS0VZX1BBUkFNRVRFUl9QTEFZQkFDS19SQVRFX1BFUk1JTExFID0gMTMwMCwgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKKworICAgIC8vIFNldCBhIFBhcmNlbCBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiBhIHBhcmNlbGxlZCBKYXZhIEF1ZGlvQXR0cmlidXRlIGluc3RhbmNlCisgICAgS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTID0gMTQwMCAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKIH07CiAKIC8vIEtlZXAgSU5WT0tFX0lEXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyLmphdmEuCkBAIC0xNzAsNiArMTczLDcgQEAKICAgICBJTlZPS0VfSURfU0VMRUNUX1RSQUNLID0gNCwKICAgICBJTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0sgPSA1LAogICAgIElOVk9LRV9JRF9TRVRfVklERU9fU0NBTElOR19NT0RFID0gNiwKKyAgICBJTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLID0gNwogfTsKIAogLy8gS2VlcCBNRURJQV9UUkFDS19UWVBFXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyLmphdmEuCkBAIC0xODksNiArMTkzLDggQEAKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKIH07CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKKwogY2xhc3MgTWVkaWFQbGF5ZXIgOiBwdWJsaWMgQm5NZWRpYVBsYXllckNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgSU1lZGlhRGVhdGhOb3RpZmllcgogewpAQCAtMTk5LDYgKzIwNSw3IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKQEAgLTIyMCwxMyArMjI3LDE5IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50ICptc2VjKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90ICp0eXBlKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRMb29waW5nKGludCBsb29wKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0xvb3BpbmcoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqID0gTlVMTCk7Ci0gICAgc3RhdGljICBzdGF0dXNfdCAgICAgICAgZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSk7CisgICAgc3RhdGljICBzdGF0dXNfdCAgICAgICAgZGVjb2RlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCisgICAgICAgICAgICBzaXplX3QgKnBTaXplKTsKICAgICBzdGF0aWMgIHN0YXR1c190ICAgICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpOwpAQCAtMjQyLDkgKzI1NSw2IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UmV0cmFuc21pdEVuZHBvaW50KGNvbnN0IGNoYXIqIGFkZHJTdHJpbmcsIHVpbnQxNl90IHBvcnQpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE5leHRNZWRpYVBsYXllcihjb25zdCBzcDxNZWRpYVBsYXllcj4mIHBsYXllcik7CiAKLSAgICAgICAgICAgIHN0YXR1c190IHVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCiBwcml2YXRlOgogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyX2woKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZWVrVG9fbChpbnQgbXNlYyk7CkBAIC0yNTMsNiArMjYzLDcgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBhdHRhY2hOZXdQbGF5ZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgcGxheWVyKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldF9sKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZG9TZXRSZXRyYW5zbWl0RW5kcG9pbnQoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgcGxheWVyKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBjaGVja1N0YXRlRm9yS2V5U2V0X2woaW50IGtleSk7CiAKICAgICBzcDxJTWVkaWFQbGF5ZXI+ICAgICAgICAgICAgbVBsYXllcjsKICAgICB0aHJlYWRfaWRfdCAgICAgICAgICAgICAgICAgbUxvY2tUaHJlYWRJZDsKQEAgLTI2Nyw2ICsyNzgsNyBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtUHJlcGFyZVN5bmM7CiAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgIG1QcmVwYXJlU3RhdHVzOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgICAgICBtU3RyZWFtVHlwZTsKKyAgICBQYXJjZWwqICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3A7CiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCmluZGV4IDg4YTQyYTAuLmIwYTYyYTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCkBAIC0zOSw3ICszOSw3IEBACiBlbnVtIHZpZGVvX3NvdXJjZSB7CiAgICAgVklERU9fU09VUkNFX0RFRkFVTFQgPSAwLAogICAgIFZJREVPX1NPVVJDRV9DQU1FUkEgPSAxLAotICAgIFZJREVPX1NPVVJDRV9HUkFMTE9DX0JVRkZFUiA9IDIsCisgICAgVklERU9fU09VUkNFX1NVUkZBQ0UgPSAyLAogCiAgICAgVklERU9fU09VUkNFX0xJU1RfRU5EICAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGF1ZGlvIHNvdXJjZSB0eXBlCiB9OwpAQCAtNjEsMTIgKzYxLDE4IEBACiAgICAgT1VUUFVUX0ZPUk1BVF9BQUNfQURJRiA9IDUsCiAgICAgT1VUUFVUX0ZPUk1BVF9BQUNfQURUUyA9IDYsCiAKKyAgICBPVVRQVVRfRk9STUFUX0FVRElPX09OTFlfRU5EID0gNywgLy8gVXNlZCBpbiB2YWxpZGF0aW5nIHRoZSBvdXRwdXQgZm9ybWF0LiAgU2hvdWxkIGJlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgYXQgdGhlIGVuZCBvZiB0aGUgYXVkaW8gb25seSBvdXRwdXQgZm9ybWF0cy4KKwogICAgIC8qIFN0cmVhbSBvdmVyIGEgc29ja2V0LCBsaW1pdGVkIHRvIGEgc2luZ2xlIHN0cmVhbSAqLwogICAgIE9VVFBVVF9GT1JNQVRfUlRQX0FWUCA9IDcsCiAKICAgICAvKiBILjI2NC9BQUMgZGF0YSBlbmNhcHN1bGF0ZWQgaW4gTVBFRzIvVFMgKi8KICAgICBPVVRQVVRfRk9STUFUX01QRUcyVFMgPSA4LAogCisgICAgLyogVlA4L1ZPUkJJUyBkYXRhIGluIGEgV0VCTSBjb250YWluZXIgKi8KKyAgICBPVVRQVVRfRk9STUFUX1dFQk0gPSA5LAorCiAgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGZvcm1hdCB0eXBlCiB9OwogCkBAIC03Nyw2ICs4Myw3IEBACiAgICAgQVVESU9fRU5DT0RFUl9BQUMgPSAzLAogICAgIEFVRElPX0VOQ09ERVJfSEVfQUFDID0gNCwKICAgICBBVURJT19FTkNPREVSX0FBQ19FTEQgPSA1LAorICAgIEFVRElPX0VOQ09ERVJfVk9SQklTID0gNiwKIAogICAgIEFVRElPX0VOQ09ERVJfTElTVF9FTkQgLy8gbXVzdCBiZSB0aGUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGF1ZGlvIGVuY29kZXIgdHlwZQogfTsKQEAgLTg2LDYgKzkzLDcgQEAKICAgICBWSURFT19FTkNPREVSX0gyNjMgPSAxLAogICAgIFZJREVPX0VOQ09ERVJfSDI2NCA9IDIsCiAgICAgVklERU9fRU5DT0RFUl9NUEVHXzRfU1AgPSAzLAorICAgIFZJREVPX0VOQ09ERVJfVlA4ID0gNCwKIAogICAgIFZJREVPX0VOQ09ERVJfTElTVF9FTkQgLy8gbXVzdCBiZSB0aGUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHZpZGVvIGVuY29kZXIgdHlwZQogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oCmluZGV4IGE3MzQwM2IuLmQ1NTUyNzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAogc3RydWN0IGRpcmVudDsKQEAgLTI5LDYgKzMwLDcgQEAKIAogY2xhc3MgTWVkaWFTY2FubmVyQ2xpZW50OwogY2xhc3MgU3RyaW5nQXJyYXk7CitjbGFzcyBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOwogCiBlbnVtIE1lZGlhU2NhblJlc3VsdCB7CiAgICAgLy8gVGhpcyBmaWxlIG9yIGRpcmVjdG9yeSB3YXMgc2Nhbm5lZCBzdWNjZXNzZnVsbHkuCkBAIC00MSw2ICs0MywzMSBAQAogICAgIE1FRElBX1NDQU5fUkVTVUxUX0VSUk9SLAogfTsKIAorc3RydWN0IE1lZGlhQWxidW1BcnQgeworcHVibGljOgorICAgIHN0YXRpYyBNZWRpYUFsYnVtQXJ0ICpmcm9tRGF0YShpbnQzMl90IHNpemUsIGNvbnN0IHZvaWQqIGRhdGEpOworCisgICAgc3RhdGljIHZvaWQgaW5pdChNZWRpYUFsYnVtQXJ0KiBpbnN0YW5jZSwgaW50MzJfdCBzaXplLCBjb25zdCB2b2lkKiBkYXRhKTsKKworICAgIE1lZGlhQWxidW1BcnQgKmNsb25lKCk7CisKKyAgICBjb25zdCBjaGFyICpkYXRhKCkgeworICAgICAgICByZXR1cm4gJm1EYXRhWzBdOworICAgIH0KKworICAgIGludDMyX3Qgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TaXplOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1TaXplOworICAgIGNoYXIgbURhdGFbXTsKKworICAgIC8vIFlvdSBjYW4ndCBjb25zdHJ1Y3QgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgZGlyZWN0bHkgYmVjYXVzZSB0aGlzIGlzIGEKKyAgICAvLyB2YXJpYWJsZS1zaXplZCBvYmplY3QgcGFzc2VkIHRocm91Z2ggdGhlIGJpbmRlci4KKyAgICBNZWRpYUFsYnVtQXJ0KCk7Cit9IF9fcGFja2VkOworCiBzdHJ1Y3QgTWVkaWFTY2FubmVyIHsKICAgICBNZWRpYVNjYW5uZXIoKTsKICAgICB2aXJ0dWFsIH5NZWRpYVNjYW5uZXIoKTsKQEAgLTUzLDggKzgwLDcgQEAKIAogICAgIHZvaWQgc2V0TG9jYWxlKGNvbnN0IGNoYXIgKmxvY2FsZSk7CiAKLSAgICAvLyBleHRyYWN0cyBhbGJ1bSBhcnQgYXMgYSBibG9jayBvZiBkYXRhCi0gICAgdmlydHVhbCBjaGFyICpleHRyYWN0QWxidW1BcnQoaW50IGZkKSA9IDA7CisgICAgdmlydHVhbCBNZWRpYUFsYnVtQXJ0ICpleHRyYWN0QWxidW1BcnQoaW50IGZkKSA9IDA7CiAKIHByb3RlY3RlZDoKICAgICBjb25zdCBjaGFyICpsb2NhbGUoKSBjb25zdDsKQEAgLTk0LDE1ICsxMjAsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWltZVR5cGUoY29uc3QgY2hhciogbWltZVR5cGUpID0gMDsKIAogcHJvdGVjdGVkOgotICAgIHZvaWQgY29udmVydFZhbHVlcyh1aW50MzJfdCBlbmNvZGluZyk7Ci0KLXByb3RlY3RlZDoKLSAgICAvLyBjYWNoZWQgbmFtZSBhbmQgdmFsdWUgc3RyaW5ncywgZm9yIG5hdGl2ZSBlbmNvZGluZyBzdXBwb3J0LgotICAgIFN0cmluZ0FycmF5KiAgICBtTmFtZXM7Ci0gICAgU3RyaW5nQXJyYXkqICAgIG1WYWx1ZXM7Ci0KLSAgICAvLyBkZWZhdWx0IGVuY29kaW5nIGJhc2VkIG9uIE1lZGlhU2Nhbm5lcjo6bUxvY2FsZSBzdHJpbmcKLSAgICB1aW50MzJfdCAgICAgICAgbUxvY2FsZUVuY29kaW5nOworICAgIC8vIGRlZmF1bHQgZW5jb2RpbmcgZnJvbSBNZWRpYVNjYW5uZXI6Om1Mb2NhbGUKKyAgICBTdHJpbmc4IG1Mb2NhbGU7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaAppbmRleCAyYzRhYWZmLi5iMTZlMjBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApAQCAtMjcsNyArMjcsNyBAQAogY2xhc3MgQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZSA6IHB1YmxpYyBOQkFJT19Tb3VyY2UgewogCiBwdWJsaWM6Ci0gICAgQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZShBdWRpb0J1ZmZlclByb3ZpZGVyICpwcm92aWRlciwgTkJBSU9fRm9ybWF0IGZvcm1hdCk7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZShBdWRpb0J1ZmZlclByb3ZpZGVyICpwcm92aWRlciwgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpOwogICAgIHZpcnR1YWwgfkF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UoKTsKIAogICAgIC8vIE5CQUlPX1BvcnQgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCmluZGV4IDA3ZDhjODkuLjUxNjlmMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCkBAIC00Myw5ICs0Myw5IEBACiAKICAgICAvLyBUaGlzIGlzIGFuIG92ZXItZXN0aW1hdGUsIGFuZCBjb3VsZCBkdXBlIHRoZSBjYWxsZXIgaW50byBtYWtpbmcgYSBibG9ja2luZyByZWFkKCkKICAgICAvLyBGSVhNRSBVc2UgYW4gYXVkaW8gSEFMIEFQSSB0byBxdWVyeSB0aGUgYnVmZmVyIGZpbGxpbmcgc3RhdHVzIHdoZW4gaXQncyBhdmFpbGFibGUuCi0gICAgdmlydHVhbCBzc2l6ZV90IGF2YWlsYWJsZVRvUmVhZCgpIHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgPj4gbUJpdFNoaWZ0OyB9CisgICAgdmlydHVhbCBzc2l6ZV90IGF2YWlsYWJsZVRvUmVhZCgpIHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgLyBtRnJhbWVTaXplOyB9CiAKLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCk7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQsIGludDY0X3QgcmVhZFBUUyk7CiAKICAgICAvLyBOQkFJT19TaW5rIGVuZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaAppbmRleCA3OTQ4ZDQwLi45OTQ5Yjg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKQEAgLTQzLDcgKzQzLDcgQEAKIAogICAgIC8vIFRoaXMgaXMgYW4gb3Zlci1lc3RpbWF0ZSwgYW5kIGNvdWxkIGR1cGUgdGhlIGNhbGxlciBpbnRvIG1ha2luZyBhIGJsb2NraW5nIHdyaXRlKCkKICAgICAvLyBGSVhNRSBVc2UgYW4gYXVkaW8gSEFMIEFQSSB0byBxdWVyeSB0aGUgYnVmZmVyIGVtcHR5aW5nIHN0YXR1cyB3aGVuIGl0J3MgYXZhaWxhYmxlLgotICAgIHZpcnR1YWwgc3NpemVfdCBhdmFpbGFibGVUb1dyaXRlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbUJ1ZmZlclNpemVCeXRlcyA+PiBtQml0U2hpZnQ7IH0KKyAgICB2aXJ0dWFsIHNzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgLyBtRnJhbWVTaXplOyB9CiAKICAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmgKaW5kZXggZDM4MDJmZS4uYjA5YjM1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaApAQCAtNDEsNyArNDEsNyBAQAogICAgIC8vIE5vdGU6IHdoYXRldmVyIHNoYXJlcyB0aGlzIG9iamVjdCB3aXRoIGFub3RoZXIgdGhyZWFkIG5lZWRzIHRvIGRvIHNvIGluIGFuIFNNUC1zYWZlIHdheSAobGlrZQogICAgIC8vIGNyZWF0aW5nIGl0IHRoZSBvYmplY3QgYmVmb3JlIGNyZWF0aW5nIHRoZSBvdGhlciB0aHJlYWQsIG9yIHN0b3JpbmcgdGhlIG9iamVjdCB3aXRoIGEKICAgICAvLyByZWxlYXNlX3N0b3JlKS4gT3RoZXJ3aXNlIHRoZSBvdGhlciB0aHJlYWQgY291bGQgc2VlIGEgcGFydGlhbGx5LWNvbnN0cnVjdGVkIG9iamVjdC4KLSAgICBNb25vUGlwZShzaXplX3QgcmVxRnJhbWVzLCBOQkFJT19Gb3JtYXQgZm9ybWF0LCBib29sIHdyaXRlQ2FuQmxvY2sgPSBmYWxzZSk7CisgICAgTW9ub1BpcGUoc2l6ZV90IHJlcUZyYW1lcywgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQsIGJvb2wgd3JpdGVDYW5CbG9jayA9IGZhbHNlKTsKICAgICB2aXJ0dWFsIH5Nb25vUGlwZSgpOwogCiAgICAgLy8gTkJBSU9fUG9ydCBpbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaAppbmRleCAxZGEwYzczLi5kNDIyNTc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTIsMzEgKzUzLDQxIEBACiAvLyB0aGUgY29tYmluYXRpb25zIHRoYXQgYXJlIGFjdHVhbGx5IG5lZWRlZCB3aXRoaW4gQXVkaW9GbGluZ2VyLiAgSWYgdGhlIGxpc3Qgb2YgY29tYmluYXRpb25zIGdyb3dzCiAvLyB0b28gbGFyZ2UsIHRoZW4gdGhpcyBkZWNpc2lvbiBzaG91bGQgYmUgcmUtdmlzaXRlZC4KIC8vIFNhbXBsZSByYXRlIGFuZCBjaGFubmVsIGNvdW50IGFyZSBleHBsaWNpdCwgUENNIGludGVybGVhdmVkIDE2LWJpdCBpcyBhc3N1bWVkLgotdHlwZWRlZiB1bnNpZ25lZCBOQkFJT19Gb3JtYXQ7Ci1lbnVtIHsKLSAgICBGb3JtYXRfSW52YWxpZAorc3RydWN0IE5CQUlPX0Zvcm1hdCB7CisvLyBGSVhNRSBtYWtlIHRoaXMgYSBjbGFzcywgYW5kIGNoYW5nZSBGb3JtYXRfLi4uIGdsb2JhbCBtZXRob2RzIHRvIGNsYXNzIG1ldGhvZHMKKy8vcHJpdmF0ZToKKyAgICB1bnNpZ25lZCAgICBtU2FtcGxlUmF0ZTsKKyAgICB1bnNpZ25lZCAgICBtQ2hhbm5lbENvdW50OworICAgIGF1ZGlvX2Zvcm1hdF90ICBtRm9ybWF0OworICAgIHNpemVfdCAgICAgIG1GcmFtZVNpemU7CiB9OwogCi0vLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgb2YgYW4gTkJBSU9fRm9ybWF0IGluIGJ5dGVzCi1zaXplX3QgRm9ybWF0X2ZyYW1lU2l6ZShOQkFJT19Gb3JtYXQgZm9ybWF0KTsKK2V4dGVybiBjb25zdCBOQkFJT19Gb3JtYXQgRm9ybWF0X0ludmFsaWQ7CiAKLS8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSBvZiBhbiBOQkFJT19Gb3JtYXQgYXMgYSBiaXQgc2hpZnQKLXNpemVfdCBGb3JtYXRfZnJhbWVCaXRTaGlmdChOQkFJT19Gb3JtYXQgZm9ybWF0KTsKKy8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSBvZiBhbiBOQkFJT19Gb3JtYXQgaW4gYnl0ZXMKK3NpemVfdCBGb3JtYXRfZnJhbWVTaXplKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KTsKIAogLy8gQ29udmVydCBhIHNhbXBsZSByYXRlIGluIEh6IGFuZCBjaGFubmVsIGNvdW50IHRvIGFuIE5CQUlPX0Zvcm1hdAotTkJBSU9fRm9ybWF0IEZvcm1hdF9mcm9tX1NSX0ModW5zaWduZWQgc2FtcGxlUmF0ZSwgdW5zaWduZWQgY2hhbm5lbENvdW50KTsKKy8vIEZJWE1FIHJlbmFtZQorTkJBSU9fRm9ybWF0IEZvcm1hdF9mcm9tX1NSX0ModW5zaWduZWQgc2FtcGxlUmF0ZSwgdW5zaWduZWQgY2hhbm5lbENvdW50LCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwogCiAvLyBSZXR1cm4gdGhlIHNhbXBsZSByYXRlIGluIEh6IG9mIGFuIE5CQUlPX0Zvcm1hdAotdW5zaWduZWQgRm9ybWF0X3NhbXBsZVJhdGUoTkJBSU9fRm9ybWF0IGZvcm1hdCk7Cit1bnNpZ25lZCBGb3JtYXRfc2FtcGxlUmF0ZShjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCk7CiAKIC8vIFJldHVybiB0aGUgY2hhbm5lbCBjb3VudCBvZiBhbiBOQkFJT19Gb3JtYXQKLXVuc2lnbmVkIEZvcm1hdF9jaGFubmVsQ291bnQoTkJBSU9fRm9ybWF0IGZvcm1hdCk7Cit1bnNpZ25lZCBGb3JtYXRfY2hhbm5lbENvdW50KGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KTsKIAogLy8gQ2FsbGJhY2tzIHVzZWQgYnkgTkJBSU9fU2luazo6d3JpdGVWaWEoKSBhbmQgTkJBSU9fU291cmNlOjpyZWFkVmlhKCkgYmVsb3cuCiB0eXBlZGVmIHNzaXplX3QgKCp3cml0ZVZpYV90KSh2b2lkICp1c2VyLCB2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCk7CiB0eXBlZGVmIHNzaXplX3QgKCpyZWFkVmlhX3QpKHZvaWQgKnVzZXIsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LCBpbnQ2NF90IHJlYWRQVFMpOwogCisvLyBDaGVjayB3aGV0aGVyIGFuIE5CQUlPX0Zvcm1hdCBpcyB2YWxpZAorYm9vbCBGb3JtYXRfaXNWYWxpZChjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCk7CisKKy8vIENvbXBhcmUgdHdvIE5CQUlPX0Zvcm1hdCB2YWx1ZXMKK2Jvb2wgRm9ybWF0X2lzRXF1YWwoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQxLCBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdDIpOworCiAvLyBBYnN0cmFjdCBjbGFzcyAoaW50ZXJmYWNlKSByZXByZXNlbnRpbmcgYSBkYXRhIHBvcnQuCiBjbGFzcyBOQkFJT19Qb3J0IDogcHVibGljIFJlZkJhc2UgewogCkBAIC0xMTUsMTUgKzEyNiwxNSBAQAogICAgIHZpcnR1YWwgTkJBSU9fRm9ybWF0IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1OZWdvdGlhdGVkID8gbUZvcm1hdCA6IEZvcm1hdF9JbnZhbGlkOyB9CiAKIHByb3RlY3RlZDoKLSAgICBOQkFJT19Qb3J0KE5CQUlPX0Zvcm1hdCBmb3JtYXQpIDogbU5lZ290aWF0ZWQoZmFsc2UpLCBtRm9ybWF0KGZvcm1hdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRTaGlmdChGb3JtYXRfZnJhbWVCaXRTaGlmdChmb3JtYXQpKSB7IH0KKyAgICBOQkFJT19Qb3J0KGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KSA6IG1OZWdvdGlhdGVkKGZhbHNlKSwgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZShGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCkpIHsgfQogICAgIHZpcnR1YWwgfk5CQUlPX1BvcnQoKSB7IH0KIAogICAgIC8vIEltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBpZ25vcmUgdGhlc2UgaWYgdGhleSBkb24ndCBuZWVkIHRoZW0KIAogICAgIGJvb2wgICAgICAgICAgICBtTmVnb3RpYXRlZDsgICAgLy8gbU5lZ290aWF0ZWQgaW1wbGllcyAobUZvcm1hdCAhPSBGb3JtYXRfSW52YWxpZCkKICAgICBOQkFJT19Gb3JtYXQgICAgbUZvcm1hdDsgICAgICAgIC8vIChtRm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKSBkb2VzIG5vdCBpbXBseSBtTmVnb3RpYXRlZAotICAgIHNpemVfdCAgICAgICAgICBtQml0U2hpZnQ7ICAgICAgLy8gYXNzaWduIGluIHBhcmFsbGVsIHdpdGggYW55IGFzc2lnbm1lbnQgdG8gbUZvcm1hdAorICAgIHNpemVfdCAgICAgICAgICBtRnJhbWVTaXplOyAgICAgLy8gYXNzaWduIGluIHBhcmFsbGVsIHdpdGggYW55IGFzc2lnbm1lbnQgdG8gbUZvcm1hdAogfTsKIAogLy8gQWJzdHJhY3QgY2xhc3MgKGludGVyZmFjZSkgcmVwcmVzZW50aW5nIGEgbm9uLWJsb2NraW5nIGRhdGEgc2luaywgZm9yIHVzZSBieSBhIGRhdGEgcHJvdmlkZXIuCkBAIC0yMTYsMTEgKzIyNywxMSBAQAogCiAgICAgLy8gUmV0dXJucyBOT19FUlJPUiBpZiBhIHRpbWVzdGFtcCBpcyBhdmFpbGFibGUuICBUaGUgdGltZXN0YW1wIGluY2x1ZGVzIHRoZSB0b3RhbCBudW1iZXIKICAgICAvLyBvZiBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLCB0b2dldGhlciB3aXRoIHRoZSB2YWx1ZSBvZiBDTE9DS19NT05PVE9OSUMKLSAgICAvLyBhcyBvZiB0aGlzIHByZXNlbnRhdGlvbiBjb3VudC4KKyAgICAvLyBhcyBvZiB0aGlzIHByZXNlbnRhdGlvbiBjb3VudC4gIFRoZSB0aW1lc3RhbXAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCBpZiBlcnJvciBpcyByZXR1cm5lZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgTkJBSU9fU2luayhOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzV3JpdHRlbigwKSB7IH0KKyAgICBOQkFJT19TaW5rKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzV3JpdHRlbigwKSB7IH0KICAgICB2aXJ0dWFsIH5OQkFJT19TaW5rKCkgeyB9CiAKICAgICAvLyBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8gaWdub3JlIHRoZXNlIGlmIHRoZXkgZG9uJ3QgbmVlZCB0aGVtCkBAIC0zMTEsNyArMzIyLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgb25UaW1lc3RhbXAoY29uc3QgQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgeyB9CiAKIHByb3RlY3RlZDoKLSAgICBOQkFJT19Tb3VyY2UoTkJBSU9fRm9ybWF0IGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkKSA6IE5CQUlPX1BvcnQoZm9ybWF0KSwgbUZyYW1lc1JlYWQoMCkgeyB9CisgICAgTkJBSU9fU291cmNlKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzUmVhZCgwKSB7IH0KICAgICB2aXJ0dWFsIH5OQkFJT19Tb3VyY2UoKSB7IH0KIAogICAgIC8vIEltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBpZ25vcmUgdGhlc2UgaWYgdGhleSBkb24ndCBuZWVkIHRoZW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaAppbmRleCA2ZDU5ZWE3Li5iY2JiYzA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCkBAIC0yNSw2ICsyNSw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgU3RyaW5nODsKKwogY2xhc3MgTkJMb2cgewogCiBwdWJsaWM6CkBAIC0xODcsNiArMTg5LDEwIEBACiAgICAgY29uc3QgU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5CiAgICAgY29uc3Qgc3A8SU1lbW9yeT4gbUlNZW1vcnk7IC8vIHJlZi1jb3VudGVkIHZlcnNpb24KICAgICBpbnQzMl90ICAgICBtRnJvbnQ7ICAgICAgICAgLy8gaW5kZXggb2Ygb2xkZXN0IGFja25vd2xlZGdlZCBFbnRyeQorICAgIGludCAgICAgbUZkOyAgICAgICAgICAgICAgICAvLyBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgICAgIG1JbmRlbnQ7ICAgICAgICAgICAgLy8gaW5kZW50YXRpb24gbGV2ZWwKKworICAgIHZvaWQgICAgZHVtcExpbmUoY29uc3QgU3RyaW5nOCYgdGltZXN0YW1wLCBTdHJpbmc4JiBib2R5KTsKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NxdWFzaFRpbWVzdGFtcCA9IDU7IC8vIHNxdWFzaCB0aGlzIG1hbnkgb3IgbW9yZSBhZGphY2VudCB0aW1lc3RhbXBzCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAppbmRleCA3OWE0ZWVlLi5lYmEzN2JjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApAQCAtMzAsNyArMzAsMTEgQEAKIAogcHVibGljOgogICAgIC8vIG1heEZyYW1lcyB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gYSBwb3dlciBvZiAyLCBhbmQgYWxsIHNsb3RzIGFyZSBhdmFpbGFibGUuIE11c3QgYmUgPj0gMi4KLSAgICBQaXBlKHNpemVfdCBtYXhGcmFtZXMsIE5CQUlPX0Zvcm1hdCBmb3JtYXQpOworICAgIC8vIGJ1ZmZlciBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBwaXBlIGJ1ZmZlciwKKyAgICAvLyB3aGljaCBtdXN0IGJlIG9mIHNpemUgcm91bmR1cChtYXhGcmFtZXMpICogRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpIGJ5dGVzLgorICAgIFBpcGUoc2l6ZV90IG1heEZyYW1lcywgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQsIHZvaWQgKmJ1ZmZlciA9IE5VTEwpOworCisgICAgLy8gSWYgYSBidWZmZXIgd2FzIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IsIGl0IGlzIG5vdCBhdXRvbWF0aWNhbGx5IGZyZWVkIGJ5IGRlc3RydWN0b3IuCiAgICAgdmlydHVhbCB+UGlwZSgpOwogCiAgICAgLy8gTkJBSU9fUG9ydCBpbnRlcmZhY2UKQEAgLTU3LDYgKzYxLDcgQEAKICAgICB2b2lkICogY29uc3QgICAgbUJ1ZmZlcjsKICAgICB2b2xhdGlsZSBpbnQzMl90IG1SZWFyOyAgICAgICAgIC8vIHdyaXR0ZW4gYnkgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZQogICAgIHZvbGF0aWxlIGludDMyX3QgbVJlYWRlcnM7ICAgICAgLy8gbnVtYmVyIG9mIFBpcGVSZWFkZXIgY2xpZW50cyBjdXJyZW50bHkgYXR0YWNoZWQgdG8gdGhpcyBQaXBlCisgICAgY29uc3QgYm9vbCAgICAgIG1GcmVlQnVmZmVySW5EZXN0cnVjdG9yOwogfTsKIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCmluZGV4IGNkZmI2ZmUuLmRhZjZiYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCkBAIC00MSw3ICs0MSw3IEBACiAKIHByaXZhdGU6CiAgICAgY29uc3Qgc3A8TkJBSU9fU291cmNlPiBtU291cmNlOyAgICAgLy8gdGhlIHdyYXBwZWQgc291cmNlCi0gICAgLypjb25zdCovIHNpemVfdCAgICBtRnJhbWVCaXRTaGlmdDsgLy8gbG9nMihmcmFtZSBzaXplIGluIGJ5dGVzKQorICAgIC8qY29uc3QqLyBzaXplX3QgICAgbUZyYW1lU2l6ZTsgLy8gZnJhbWUgc2l6ZSBpbiBieXRlcwogICAgIHZvaWQqICAgICAgICAgICAgICAgbUFsbG9jYXRlZDsgLy8gcG9pbnRlciB0byBiYXNlIG9mIGFsbG9jYXRlZCBtZW1vcnkKICAgICBzaXplX3QgICAgICAgICAgICAgIG1TaXplOyAgICAgIC8vIHNpemUgb2YgbUFsbG9jYXRlZCBpbiBmcmFtZXMKICAgICBzaXplX3QgICAgICAgICAgICAgIG1PZmZzZXQ7ICAgIC8vIGZyYW1lIG9mZnNldCB3aXRoaW4gbUFsbG9jYXRlZCBvZiB2YWxpZCBkYXRhCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAppbmRleCA5YjUzNGU3Li5hMGU1ZDg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oPgogI2luY2x1ZGUgPE9NWF9BdWRpby5oPgogCkBAIC0zMSw0NSArMzIsMzQgQEAKIAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgTWVtb3J5RGVhbGVyOworc3RydWN0IERlc2NyaWJlQ29sb3JGb3JtYXRQYXJhbXM7CiAKLXN0cnVjdCBBQ29kZWMgOiBwdWJsaWMgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSB7Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0RmlsbFRoaXNCdWZmZXIgICAgICA9ICdmaWxsJywKLSAgICAgICAga1doYXREcmFpblRoaXNCdWZmZXIgICAgID0gJ2RyYWknLAotICAgICAgICBrV2hhdEVPUyAgICAgICAgICAgICAgICAgPSAnZW9zICcsCi0gICAgICAgIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQgICA9ICdzY29tJywKLSAgICAgICAga1doYXRGbHVzaENvbXBsZXRlZCAgICAgID0gJ2Zjb20nLAotICAgICAgICBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQgPSAnb3V0QycsCi0gICAgICAgIGtXaGF0RXJyb3IgICAgICAgICAgICAgICA9ICdlcnJvJywKLSAgICAgICAga1doYXRDb21wb25lbnRBbGxvY2F0ZWQgID0gJ2NBbGwnLAotICAgICAgICBrV2hhdENvbXBvbmVudENvbmZpZ3VyZWQgPSAnY0NvbicsCi0gICAgICAgIGtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCA9ICdpc2ZjJywKLSAgICAgICAga1doYXRTaWduYWxlZElucHV0RU9TICAgID0gJ3Nlb3MnLAotICAgICAgICBrV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQgICAgPSAnYWxsYycsCi0gICAgICAgIGtXaGF0T01YRGllZCAgICAgICAgICAgICA9ICdPTVhkJywKLSAgICB9OwotCitzdHJ1Y3QgQUNvZGVjIDogcHVibGljIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUsIHB1YmxpYyBDb2RlY0Jhc2UgewogICAgIEFDb2RlYygpOwogCi0gICAgdm9pZCBzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKICAgICB2b2lkIGluaXRpYXRlU2V0dXAoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgc2lnbmFsRmx1c2goKTsKLSAgICB2b2lkIHNpZ25hbFJlc3VtZSgpOwotICAgIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSk7CiAKLSAgICB2b2lkIHNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkID0gZmFsc2UpOwogCi0gICAgdm9pZCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIGluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCk7Ci0gICAgdm9pZCBpbml0aWF0ZVN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlc3VtZSgpOwogCi0gICAgdm9pZCBzaWduYWxSZXF1ZXN0SURSRnJhbWUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVxdWVzdElEUkZyYW1lKCk7CiAKLSAgICBib29sIGlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2soKSB7IHJldHVybiBtSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjazsgfQorICAgIC8vIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgaW1wbGVtZW50cyB0aGUgbWVzc2FnZSBoYW5kbGluZworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgICAgICBoYW5kbGVNZXNzYWdlKG1zZyk7CisgICAgfQogCi0gICAgc3RydWN0IFBvcnREZXNjcmlwdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBzdHJ1Y3QgUG9ydERlc2NyaXB0aW9uIDogcHVibGljIENvZGVjQmFzZTo6UG9ydERlc2NyaXB0aW9uIHsKICAgICAgICAgc2l6ZV90IGNvdW50QnVmZmVycygpOwogICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySURBdChzaXplX3QgaW5kZXgpIGNvbnN0OwogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXJBdChzaXplX3QgaW5kZXgpIGNvbnN0OwpAQCAtODYsNiArNzYsMTYgQEAKICAgICAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUG9ydERlc2NyaXB0aW9uKTsKICAgICB9OwogCisgICAgc3RhdGljIGJvb2wgaXNGbGV4aWJsZUNvbG9yRm9ybWF0KAorICAgICAgICAgICAgY29uc3Qgc3A8SU9NWD4gJm9teCwgSU9NWDo6bm9kZV9pZCBub2RlLAorICAgICAgICAgICAgdWludDMyX3QgY29sb3JGb3JtYXQsIE9NWF9VMzIgKmZsZXhpYmxlRXF1aXZhbGVudCk7CisKKyAgICAvLyBSZXR1cm5zIDAgaWYgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAgTk9URTogdGhpcyBpcyB0cmVhdGVkIGJ5CisgICAgLy8gc29tZSBPTVggY29tcG9uZW50cyBhcyBhdXRvIGxldmVsLCBhbmQgYnkgb3RoZXJzIGFzIGludmFsaWQgbGV2ZWwuCisgICAgc3RhdGljIGludCAvKiBPTVhfVklERU9fQVZDTEVWRUxUWVBFICovIGdldEFWQ0xldmVsRm9yKAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcmF0ZSwgaW50IGJpdHJhdGUsCisgICAgICAgICAgICBPTVhfVklERU9fQVZDUFJPRklMRVRZUEUgcHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUNvZGVjKCk7CiAKQEAgLTExOSw2ICsxMTksOCBAQAogICAgICAgICBrV2hhdFJlcXVlc3RJRFJGcmFtZSAgICAgICAgID0gJ3JpZHInLAogICAgICAgICBrV2hhdFNldFBhcmFtZXRlcnMgICAgICAgICAgID0gJ3NldFAnLAogICAgICAgICBrV2hhdFN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVySWZFT1MgPSAnc3VibScsCisgICAgICAgIGtXaGF0T01YRGllZCAgICAgICAgICAgICAgICAgPSAnT01YZCcsCisgICAgICAgIGtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2UgICAgPSAncmVsQycsCiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtMTc4LDYgKzE4MCw4IEBACiAgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyWzJdOwogCiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKKyAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OwogCiAgICAgVmVjdG9yPEJ1ZmZlckluZm8+IG1CdWZmZXJzWzJdOwogICAgIGJvb2wgbVBvcnRFT1NbMl07CkBAIC0xOTAsNyArMTk0LDcgQEAKICAgICBib29sIG1Vc2VNZXRhZGF0YU9uRW5jb2Rlck91dHB1dDsKICAgICBib29sIG1GYXRhbEVycm9yOwogICAgIGJvb2wgbVNodXRkb3duSW5Qcm9ncmVzczsKLSAgICBib29sIG1Jc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrOworICAgIGJvb2wgbUV4cGxpY2l0U2h1dGRvd247CiAKICAgICAvLyBJZiAibUtlZXBDb21wb25lbnRBbGxvY2F0ZWQiIHdlIG9ubHkgdHJhbnNpdGlvbiBiYWNrIHRvIExvYWRlZCBzdGF0ZQogICAgIC8vIGFuZCBkbyBub3QgcmVsZWFzZSB0aGUgY29tcG9uZW50IGluc3RhbmNlLgpAQCAtMTk4LDE2ICsyMDIsMjUgQEAKIAogICAgIGludDMyX3QgbUVuY29kZXJEZWxheTsKICAgICBpbnQzMl90IG1FbmNvZGVyUGFkZGluZzsKKyAgICBpbnQzMl90IG1Sb3RhdGlvbkRlZ3JlZXM7CiAKICAgICBib29sIG1DaGFubmVsTWFza1ByZXNlbnQ7CiAgICAgaW50MzJfdCBtQ2hhbm5lbE1hc2s7CiAgICAgdW5zaWduZWQgbURlcXVldWVDb3VudGVyOwogICAgIGJvb2wgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnM7CiAgICAgaW50MzJfdCBtTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQ7CisgICAgc2l6ZV90IG1OdW1VbmRlcXVldWVkQnVmZmVyczsKIAogICAgIGludDY0X3QgbVJlcGVhdEZyYW1lRGVsYXlVczsKICAgICBpbnQ2NF90IG1NYXhQdHNHYXBVczsKIAorICAgIGludDY0X3QgbVRpbWVQZXJGcmFtZVVzOworICAgIGludDY0X3QgbVRpbWVQZXJDYXB0dXJlVXM7CisKKyAgICBib29sIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQ7CisKKyAgICBib29sIG1UdW5uZWxlZDsKKwogICAgIHN0YXR1c190IHNldEN5Y2xpY0ludHJhTWFjcm9ibG9ja1JlZnJlc2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgbW9kZSk7CiAgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzT25Qb3J0KE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICBzdGF0dXNfdCBmcmVlQnVmZmVyc09uUG9ydChPTVhfVTMyIHBvcnRJbmRleCk7CkBAIC0yMzEsNiArMjQ0LDkgQEAKICAgICBzdGF0dXNfdCBzZXRDb21wb25lbnRSb2xlKGJvb2wgaXNFbmNvZGVyLCBjb25zdCBjaGFyICptaW1lKTsKICAgICBzdGF0dXNfdCBjb25maWd1cmVDb2RlYyhjb25zdCBjaGFyICptaW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKKyAgICBzdGF0dXNfdCBjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2soaW50MzJfdCBhdWRpb0h3U3luYywKKyAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpOworCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9Qb3J0Rm9ybWF0VHlwZSgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAogICAgICAgICAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQsCkBAIC0yMzksNyArMjU1LDcgQEAKICAgICBzdGF0dXNfdCBzZXRTdXBwb3J0ZWRPdXRwdXRGb3JtYXQoKTsKIAogICAgIHN0YXR1c190IHNldHVwVmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgc3RhdHVzX3Qgc2V0dXBWaWRlb0VuY29kZXIoCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0yNDksMTAgKzI2NSwyMCBAQAogICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBjb21wcmVzc2lvbkZvcm1hdCk7CiAKKyAgICB0eXBlZGVmIHN0cnVjdCBkcmNQYXJhbXMgeworICAgICAgICBpbnQzMl90IGRyY0N1dDsKKyAgICAgICAgaW50MzJfdCBkcmNCb29zdDsKKyAgICAgICAgaW50MzJfdCBoZWF2eUNvbXByZXNzaW9uOworICAgICAgICBpbnQzMl90IHRhcmdldFJlZkxldmVsOworICAgICAgICBpbnQzMl90IGVuY29kZWRUYXJnZXRMZXZlbDsKKyAgICB9IGRyY1BhcmFtc190OworCiAgICAgc3RhdHVzX3Qgc2V0dXBBQUNDb2RlYygKICAgICAgICAgICAgIGJvb2wgZW5jb2RlciwKICAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBiaXRSYXRlLAotICAgICAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlLCBib29sIGlzQURUUyk7CisgICAgICAgICAgICBpbnQzMl90IGFhY1Byb2ZpbGUsIGJvb2wgaXNBRFRTLCBpbnQzMl90IHNick1vZGUsCisgICAgICAgICAgICBpbnQzMl90IG1heE91dHB1dENoYW5uZWxDb3VudCwgY29uc3QgZHJjUGFyYW1zX3QmIGRyYywKKyAgICAgICAgICAgIGludDMyX3QgcGNtTGltaXRlckVuYWJsZSk7CiAKICAgICBzdGF0dXNfdCBzZXR1cEFDM0NvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKTsKIApAQCAtMjczLDYgKzI5OSw3IEBACiAgICAgc3RhdHVzX3Qgc2V0dXBNUEVHNEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICBzdGF0dXNfdCBzZXR1cEgyNjNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBVkNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgc3RhdHVzX3Qgc2V0dXBIRVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHN0YXR1c190IHNldHVwVlBYRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgc3RhdHVzX3QgdmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChpbnQzMl90IHByb2ZpbGUsIGludDMyX3QgbGV2ZWwpOwpAQCAtMzAxLDExICszMjgsMTcgQEAKICAgICB2b2lkIHByb2Nlc3NEZWZlcnJlZE1lc3NhZ2VzKCk7CiAKICAgICB2b2lkIHNlbmRGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSk7CisgICAgc3RhdHVzX3QgZ2V0UG9ydEZvcm1hdChPTVhfVTMyIHBvcnRJbmRleCwgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwogCiAgICAgdm9pZCBzaWduYWxFcnJvcigKICAgICAgICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyb3IgPSBPTVhfRXJyb3JVbmRlZmluZWQsCiAgICAgICAgICAgICBzdGF0dXNfdCBpbnRlcm5hbEVycm9yID0gVU5LTk9XTl9FUlJPUik7CiAKKyAgICBzdGF0aWMgYm9vbCBkZXNjcmliZURlZmF1bHRDb2xvckZvcm1hdChEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZkZXNjcmliZVBhcmFtcyk7CisgICAgc3RhdGljIGJvb2wgZGVzY3JpYmVDb2xvckZvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8SU9NWD4gJm9teCwgSU9NWDo6bm9kZV9pZCBub2RlLAorICAgICAgICBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZkZXNjcmliZVBhcmFtcyk7CisKICAgICBzdGF0dXNfdCByZXF1ZXN0SURSRnJhbWUoKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKaW5kZXggYTgyOTkxNi4uZGQwYTEwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKTsKIAotICAgIHZpcnR1YWwgdm9pZCBzdGFydENhbWVyYVJlY29yZGluZygpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CiAKICAgICAvLyBSZXR1cm5zIHRydWUgaWYgbmVlZCB0byBza2lwIHRoZSBjdXJyZW50IGZyYW1lLgpAQCAtMTg1LDYgKzE4NSw4IEBACiAgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CiAKKyAgICB2b2lkIHJlbGVhc2VDYW1lcmEoKTsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU291cmNlTGlzdGVuZXI7CiAKQEAgLTIzMyw3ICsyMzUsNiBAQAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSk7CiAKICAgICB2b2lkIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKLSAgICB2b2lkIHJlbGVhc2VDYW1lcmEoKTsKICAgICBzdGF0dXNfdCByZXNldCgpOwogCiAgICAgQ2FtZXJhU291cmNlKGNvbnN0IENhbWVyYVNvdXJjZSAmKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xvY2tFc3RpbWF0b3IuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xvY2tFc3RpbWF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQ2ZTc1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbG9ja0VzdGltYXRvci5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIENMT0NLX0VTVElNQVRPUl9IXworCisjZGVmaW5lIENMT0NLX0VTVElNQVRPUl9IXworCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3QgQ2xvY2tFc3RpbWF0b3IgOiBSZWZCYXNlIHsKKyAgICB2aXJ0dWFsIGRvdWJsZSBlc3RpbWF0ZShkb3VibGUgeCwgZG91YmxlIHkpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSA9IDA7Cit9OworCitzdHJ1Y3QgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3IgOiBDbG9ja0VzdGltYXRvciB7CisgICAgc3RydWN0IExpbmVhckZpdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGaXQgeSA9IGEgKiB4ICsgYiwgd2hlcmUgZWFjaCBpbnB1dCBoYXMgYSB3ZWlnaHQKKyAgICAgICAgICovCisgICAgICAgIGRvdWJsZSBtWDsgIC8vIHN1bSh3X2kgKiB4X2kpCisgICAgICAgIGRvdWJsZSBtWFg7IC8vIHN1bSh3X2kgKiB4X2leMikKKyAgICAgICAgZG91YmxlIG1ZOyAgLy8gc3VtKHdfaSAqIHlfaSkKKyAgICAgICAgZG91YmxlIG1ZWTsgLy8gc3VtKHdfaSAqIHlfaV4yKQorICAgICAgICBkb3VibGUgbVhZOyAvLyBzdW0od19pICogeF9pICogeV9pKQorICAgICAgICBkb3VibGUgbVc7ICAvLyBzdW0od19pKQorCisgICAgICAgIExpbmVhckZpdCgpOworICAgICAgICB2b2lkIHJlc2V0KCk7CisgICAgICAgIHZvaWQgY29tYmluZShjb25zdCBMaW5lYXJGaXQgJmxmKTsKKyAgICAgICAgdm9pZCBhZGQoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgdyk7CisgICAgICAgIHZvaWQgc2NhbGUoZG91YmxlIHcpOworICAgICAgICBkb3VibGUgaW50ZXJwb2xhdGUoZG91YmxlIHgpOworICAgICAgICBkb3VibGUgc2l6ZSgpIGNvbnN0OworCisgICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExpbmVhckZpdCk7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEVzdGltYXRvciBmb3IgZih4KSA9IHknIHdoZXJlIGlucHV0IHknIGlzIG5vaXN5LCBidXQKKyAgICAgKiB0aGVvcmV0aWNhbGx5IGxpbmVhcjoKKyAgICAgKgorICAgICAqICAgICAgeScgPX4geSA9IGEgKiB4ICsgYgorICAgICAqCisgICAgICogSXQgdXNlcyBsaW5lYXIgZml0IHJlZ3Jlc3Npb24gb3ZlciBhIHRhcGVyaW5nIHJvbGxpbmcgd2luZG93CisgICAgICogdG8gZ2V0IGFuIGVzdGltYXRlIGZvciB5IChmcm9tIHRoZSBjdXJyZW50IGFuZCBwYXN0IGlucHV0cworICAgICAqICh4LCB5JykpLgorICAgICAqCisgICAgICogICAgIF9fX19fX19fX19fXworICAgICAqICAgIC98ICAgICAgICAgIHxcCisgICAgICogICAvIHwgICAgICAgICAgfCBcCisgICAgICogIC8gIHwgICAgICAgICAgfCAgXCAgIDwtLS0gbmV3IGRhdGEgKHgsIHknKQorICAgICAqIC8gICB8ICAgbWFpbiAgIHwgICBcCisgICAgICogPC0tPjwtLS0tLS0tLS0tPjwtLT4KKyAgICAgKiB0YWlsICAgICAgICAgICAgaGVhZAorICAgICAqCisgICAgICogd2VpZ2h0IGlzIDEgdW5kZXIgdGhlIG1haW4gd2luZG93LCB0YXBlcnMgZXhwb25lbnRpYWxseSBieQorICAgICAqIHRoZSBmYWN0b3JzIGdpdmVuIGluIHRoZSBoZWFkIGFuZCB0aGUgdGFpbC4KKyAgICAgKgorICAgICAqIEFzc3VtaW5nIHRoYXQgeCBhbmQgeScgYXJlIG1vbm90b25pYywgdGhhdCB4IGlzIHNvbWV3aGF0CisgICAgICogZXZlbmx5IHNhbXBsZWQsIGFuZCB0aGF0IGEgPX4gMSwgdGhlIGVzdGltYXRlZCB5IGlzIGFsc28KKyAgICAgKiBnb2luZyB0byBiZSBtb25vdG9uaWMuCisgICAgICovCisgICAgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3IoCisgICAgICAgICAgICBzaXplX3QgaGVhZExlbmd0aCA9IDUsIGRvdWJsZSBoZWFkRmFjdG9yID0gMC41LAorICAgICAgICAgICAgc2l6ZV90IG1haW5MZW5ndGggPSAwLCBkb3VibGUgdGFpbEZhY3RvciA9IDAuOTkpOworCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBhZGQgYSBuZXcgc2FtcGxlICh4IC0+IHknKSBhbmQgcmV0dXJuIGFuIGVzdGltYXRlZCB2YWx1ZSBmb3IgdGhlIHRydWUgeQorICAgIHZpcnR1YWwgZG91YmxlIGVzdGltYXRlKGRvdWJsZSB4LCBkb3VibGUgeSk7CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPGRvdWJsZT4gbVhIaXN0b3J5OyAvLyBjaXJjdWxhciBidWZmZXIKKyAgICBWZWN0b3I8ZG91YmxlPiBtWUhpc3Rvcnk7IC8vIGNpcmN1bGFyIGJ1ZmZlcgorICAgIExpbmVhckZpdCBtSGVhZDsKKyAgICBMaW5lYXJGaXQgbU1haW47CisgICAgTGluZWFyRml0IG1UYWlsOworICAgIGRvdWJsZSBtSGVhZEZhY3RvckludjsKKyAgICBkb3VibGUgbVRhaWxGYWN0b3I7CisgICAgZG91YmxlIG1GaXJzdFdlaWdodDsKKyAgICBzaXplX3QgbUhpc3RvcnlMZW5ndGg7CisgICAgc2l6ZV90IG1IZWFkTGVuZ3RoOworICAgIHNpemVfdCBtTnVtU2FtcGxlczsKKyAgICBzaXplX3QgbVNhbXBsZUl4OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3IpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmYyN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQ19CQVNFX0hfCisKKyNkZWZpbmUgQ09ERUNfQkFTRV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworCitzdHJ1Y3QgQ29kZWNCYXNlIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRGaWxsVGhpc0J1ZmZlciAgICAgID0gJ2ZpbGwnLAorICAgICAgICBrV2hhdERyYWluVGhpc0J1ZmZlciAgICAgPSAnZHJhaScsCisgICAgICAgIGtXaGF0RU9TICAgICAgICAgICAgICAgICA9ICdlb3MgJywKKyAgICAgICAga1doYXRTaHV0ZG93bkNvbXBsZXRlZCAgID0gJ3Njb20nLAorICAgICAgICBrV2hhdEZsdXNoQ29tcGxldGVkICAgICAgPSAnZmNvbScsCisgICAgICAgIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCA9ICdvdXRDJywKKyAgICAgICAga1doYXRFcnJvciAgICAgICAgICAgICAgID0gJ2Vycm8nLAorICAgICAgICBrV2hhdENvbXBvbmVudEFsbG9jYXRlZCAgPSAnY0FsbCcsCisgICAgICAgIGtXaGF0Q29tcG9uZW50Q29uZmlndXJlZCA9ICdjQ29uJywKKyAgICAgICAga1doYXRJbnB1dFN1cmZhY2VDcmVhdGVkID0gJ2lzZmMnLAorICAgICAgICBrV2hhdFNpZ25hbGVkSW5wdXRFT1MgICAgPSAnc2VvcycsCisgICAgICAgIGtXaGF0QnVmZmVyc0FsbG9jYXRlZCAgICA9ICdhbGxjJywKKyAgICB9OworCisgICAgdmlydHVhbCB2b2lkIHNldE5vdGlmaWNhdGlvbk1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVN0YXJ0KCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IGZhbHNlKSA9IDA7CisKKyAgICAvLyByZXF1aXJlIGFuIGV4cGxpY2l0IG1lc3NhZ2UgaGFuZGxlcgorICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXN1bWUoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVxdWVzdElEUkZyYW1lKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxTZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSA9IDA7CisKKyAgICBzdHJ1Y3QgUG9ydERlc2NyaXB0aW9uIDogcHVibGljIFJlZkJhc2UgeworICAgICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudEJ1ZmZlcnMoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEQXQoc2l6ZV90IGluZGV4KSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3A8QUJ1ZmZlcj4gYnVmZmVyQXQoc2l6ZV90IGluZGV4KSBjb25zdCA9IDA7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIFBvcnREZXNjcmlwdGlvbigpOworICAgICAgICB2aXJ0dWFsIH5Qb3J0RGVzY3JpcHRpb24oKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBvcnREZXNjcmlwdGlvbik7CisgICAgfTsKKworcHJvdGVjdGVkOgorICAgIENvZGVjQmFzZSgpOworICAgIHZpcnR1YWwgfkNvZGVjQmFzZSgpOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvZGVjQmFzZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDX0JBU0VfSF8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaAppbmRleCAxNTdiMWFhLi4zNjMwMjYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaApAQCAtMzEsNyArMzEsMTAgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOworc3RydWN0IEFTdHJpbmc7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBTdHJpbmc4Oworc3RydWN0IEhUVFBCYXNlOwogCiBjbGFzcyBEYXRhU291cmNlIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgpAQCAtNDMsOCArNDYsMTMgQEAKICAgICB9OwogCiAgICAgc3RhdGljIHNwPERhdGFTb3VyY2U+IENyZWF0ZUZyb21VUkkoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCwKKyAgICAgICAgICAgIFN0cmluZzggKmNvbnRlbnRUeXBlID0gTlVMTCwKKyAgICAgICAgICAgIEhUVFBCYXNlICpodHRwU291cmNlID0gTlVMTCk7CisKKyAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlTWVkaWFIVFRQKGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpOwogCiAgICAgRGF0YVNvdXJjZSgpIHt9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzNTYyZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERBVEFfVVJJX1NPVVJDRV9IXworCisjZGVmaW5lIERBVEFfVVJJX1NPVVJDRV9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKKworc3RydWN0IERhdGFVUklTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7CisgICAgc3RhdGljIHNwPERhdGFVUklTb3VyY2U+IENyZWF0ZShjb25zdCBjaGFyICp1cmkpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RGF0YVVSSVNvdXJjZSgpOworCitwcml2YXRlOgorICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7CisKKyAgICBEYXRhVVJJU291cmNlKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGF0YVVSSVNvdXJjZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIERBVEFfVVJJX1NPVVJDRV9IXworCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCmluZGV4IGQ5OTRjYjMuLmE5ODFkMWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCkBAIC0zMCw2ICszMCw3IEBACiBjbGFzcyBGaWxlU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgewogcHVibGljOgogICAgIEZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpOworICAgIC8vIEZpbGVTb3VyY2UgdGFrZXMgb3duZXJzaGlwIGFuZCB3aWxsIGNsb3NlIHRoZSBmZAogICAgIEZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKQEAgLTU1LDcgKzU2LDcgQEAKICAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKICAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKICAgICBpbnQ2NF90IG1Ecm1CdWZPZmZzZXQ7Ci0gICAgaW50NjRfdCBtRHJtQnVmU2l6ZTsKKyAgICBzaXplX3QgbURybUJ1ZlNpemU7CiAgICAgdW5zaWduZWQgY2hhciAqbURybUJ1ZjsKIAogICAgIHNzaXplX3QgcmVhZEF0RFJNKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKaW5kZXggM2VmNmI5YS4uMjZjZTVmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaApAQCAtNjMsOCArNjMsOCBAQAogICAgIGludDMyX3QgZ2V0VGltZVNjYWxlKCkgY29uc3QgeyByZXR1cm4gbVRpbWVTY2FsZTsgfQogCiAgICAgc3RhdHVzX3Qgc2V0R2VvRGF0YShpbnQgbGF0aXR1ZGV4MTAwMDAsIGludCBsb25naXR1ZGV4MTAwMDApOwotICAgIHZvaWQgc2V0U3RhcnRUaW1lT2Zmc2V0TXMoaW50IG1zKSB7IG1TdGFydFRpbWVPZmZzZXRNcyA9IG1zOyB9Ci0gICAgaW50MzJfdCBnZXRTdGFydFRpbWVPZmZzZXRNcygpIGNvbnN0IHsgcmV0dXJuIG1TdGFydFRpbWVPZmZzZXRNczsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRTdGFydFRpbWVPZmZzZXRNcyhpbnQgbXMpIHsgbVN0YXJ0VGltZU9mZnNldE1zID0gbXM7IH0KKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U3RhcnRUaW1lT2Zmc2V0TXMoKSBjb25zdCB7IHJldHVybiBtU3RhcnRUaW1lT2Zmc2V0TXM7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1QRUc0V3JpdGVyKCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKaW5kZXggM2Q3OTU5Ni4uYzhhNTBlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApAQCAtMTgsNiArMTgsOCBAQAogCiAjZGVmaW5lIE1FRElBX0JVRkZFUl9IXwogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuaD4KKwogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtNDMsNyArNDUsNyBAQAogICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOwogfTsKIAotY2xhc3MgTWVkaWFCdWZmZXIgeworY2xhc3MgTWVkaWFCdWZmZXIgOiBwdWJsaWMgTWVkaWFCdWZmZXJCYXNlIHsKIHB1YmxpYzoKICAgICAvLyBUaGUgdW5kZXJseWluZyBkYXRhIHJlbWFpbnMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIhCiAgICAgTWVkaWFCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwpAQCAtNTYsMTAgKzU4LDEwIEBACiAKICAgICAvLyBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgYW5kIHJldHVybnMgdGhlIGJ1ZmZlciB0byBpdHMKICAgICAvLyBhc3NvY2lhdGVkIE1lZGlhQnVmZmVyR3JvdXAgaWYgdGhlIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byAwLgotICAgIHZvaWQgcmVsZWFzZSgpOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCk7CiAKICAgICAvLyBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQuCi0gICAgdm9pZCBhZGRfcmVmKCk7CisgICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKTsKIAogICAgIHZvaWQgKmRhdGEoKSBjb25zdDsKICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaAppbmRleCAwNDg4MjkyLi5hMDA2ZjdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaApAQCAtMzQsOSArMzQsMTIgQEAKIAogICAgIHZvaWQgYWRkX2J1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKIAotICAgIC8vIEJsb2NrcyB1bnRpbCBhIGJ1ZmZlciBpcyBhdmFpbGFibGUgYW5kIHJldHVybnMgaXQgdG8gdGhlIGNhbGxlciwKLSAgICAvLyB0aGUgcmV0dXJuZWQgYnVmZmVyIHdpbGwgaGF2ZSBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLgotICAgIHN0YXR1c190IGFjcXVpcmVfYnVmZmVyKE1lZGlhQnVmZmVyICoqYnVmZmVyKTsKKyAgICAvLyBJZiBub25CbG9ja2luZyBpcyBmYWxzZSwgaXQgYmxvY2tzIHVudGlsIGEgYnVmZmVyIGlzIGF2YWlsYWJsZSBhbmQKKyAgICAvLyBwYXNzZXMgaXQgdG8gdGhlIGNhbGxlciBpbiAqYnVmZmVyLCB3aGlsZSByZXR1cm5pbmcgT0suCisgICAgLy8gVGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KKyAgICAvLyBJZiBub25CbG9ja2luZyBpcyB0cnVlIGFuZCBhIGJ1ZmZlciBpcyBub3QgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLAorICAgIC8vIGJ1ZmZlciBpcyBzZXQgdG8gTlVMTCBhbmQgaXQgcmV0dXJucyBXT1VMRF9CTE9DSy4KKyAgICBzdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcihNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgYm9vbCBub25CbG9ja2luZyA9IGZhbHNlKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKaW5kZXggNzZhYTUwMy4uNTRhNGU4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKQEAgLTI2LDEwICsyNiwxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKLXN0cnVjdCBBQ29kZWM7CiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgQVN0cmluZzsKK3N0cnVjdCBDb2RlY0Jhc2U7CiBzdHJ1Y3QgSUNyeXB0bzsKK3N0cnVjdCBJQmF0dGVyeVN0YXRzOwogc3RydWN0IFNvZnR3YXJlUmVuZGVyZXI7CiBzdHJ1Y3QgU3VyZmFjZTsKIApAQCAtNDQsMTEgKzQ1LDIwIEBACiAgICAgICAgIEJVRkZFUl9GTEFHX0VPUyAgICAgICAgID0gNCwKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIENCX0lOUFVUX0FWQUlMQUJMRSA9IDEsCisgICAgICAgIENCX09VVFBVVF9BVkFJTEFCTEUgPSAyLAorICAgICAgICBDQl9FUlJPUiA9IDMsCisgICAgICAgIENCX09VVFBVVF9GT1JNQVRfQ0hBTkdFRCA9IDQsCisgICAgfTsKKworICAgIHN0cnVjdCBCYXR0ZXJ5Tm90aWZpZXI7CisKICAgICBzdGF0aWMgc3A8TWVkaWFDb2RlYz4gQ3JlYXRlQnlUeXBlKAotICAgICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgY2hhciAqbWltZSwgYm9vbCBlbmNvZGVyKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgZW5jb2Rlciwgc3RhdHVzX3QgKmVyciA9IE5VTEwpOwogCiAgICAgc3RhdGljIHNwPE1lZGlhQ29kZWM+IENyZWF0ZUJ5Q29tcG9uZW50TmFtZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm5hbWUpOworICAgICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgY2hhciAqbmFtZSwgc3RhdHVzX3QgKmVyciA9IE5VTEwpOwogCiAgICAgc3RhdHVzX3QgY29uZmlndXJlKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCkBAIC01Niw2ICs2Niw4IEBACiAgICAgICAgICAgICBjb25zdCBzcDxJQ3J5cHRvPiAmY3J5cHRvLAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOwogCisgICAgc3RhdHVzX3Qgc2V0Q2FsbGJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZjYWxsYmFjayk7CisKICAgICBzdGF0dXNfdCBjcmVhdGVJbnB1dFN1cmZhY2Uoc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4qIGJ1ZmZlclByb2R1Y2VyKTsKIAogICAgIHN0YXR1c190IHN0YXJ0KCk7CkBAIC02NCw2ICs3NiwxMCBAQAogICAgIC8vIHVuY29uZmlndXJlZC4KICAgICBzdGF0dXNfdCBzdG9wKCk7CiAKKyAgICAvLyBSZXNldHMgdGhlIGNvZGVjIHRvIHRoZSBJTklUSUFMSVpFRCBzdGF0ZS4gIENhbiBiZSBjYWxsZWQgYWZ0ZXIgYW4gZXJyb3IKKyAgICAvLyBoYXMgb2NjdXJlZCB0byBtYWtlIHRoZSBjb2RlYyB1c2FibGUuCisgICAgc3RhdHVzX3QgcmVzZXQoKTsKKwogICAgIC8vIENsaWVudCBNVVNUIGNhbGwgcmVsZWFzZSBiZWZvcmUgcmVsZWFzaW5nIGZpbmFsIHJlZmVyZW5jZSB0byB0aGlzCiAgICAgLy8gb2JqZWN0LgogICAgIHN0YXR1c190IHJlbGVhc2UoKTsKQEAgLTEwMCwxNiArMTE2LDIyIEBACiAgICAgICAgICAgICB1aW50MzJfdCAqZmxhZ3MsCiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXRVcyA9IDBsbCk7CiAKKyAgICBzdGF0dXNfdCByZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKHNpemVfdCBpbmRleCwgaW50NjRfdCB0aW1lc3RhbXBOcyk7CiAgICAgc3RhdHVzX3QgcmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShzaXplX3QgaW5kZXgpOwogICAgIHN0YXR1c190IHJlbGVhc2VPdXRwdXRCdWZmZXIoc2l6ZV90IGluZGV4KTsKIAogICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKIAogICAgIHN0YXR1c190IGdldE91dHB1dEZvcm1hdChzcDxBTWVzc2FnZT4gKmZvcm1hdCkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0SW5wdXRGb3JtYXQoc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIGNvbnN0OwogCiAgICAgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJzKFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpidWZmZXJzKSBjb25zdDsKICAgICBzdGF0dXNfdCBnZXRPdXRwdXRCdWZmZXJzKFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpidWZmZXJzKSBjb25zdDsKIAorICAgIHN0YXR1c190IGdldE91dHB1dEJ1ZmZlcihzaXplX3QgaW5kZXgsIHNwPEFCdWZmZXI+ICpidWZmZXIpOworICAgIHN0YXR1c190IGdldE91dHB1dEZvcm1hdChzaXplX3QgaW5kZXgsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KTsKKyAgICBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlcihzaXplX3QgaW5kZXgsIHNwPEFCdWZmZXI+ICpidWZmZXIpOworCiAgICAgc3RhdHVzX3QgcmVxdWVzdElEUkZyYW1lKCk7CiAKICAgICAvLyBOb3RpZmljYXRpb24gd2lsbCBiZSBwb3N0ZWQgb25jZSB0aGVyZSAiaXMgc29tZXRoaW5nIHRvIGRvIiwgaS5lLgpAQCAtMTM1LDYgKzE1Nyw3IEBACiAgICAgICAgIFNUQVJUSU5HLAogICAgICAgICBTVEFSVEVELAogICAgICAgICBGTFVTSElORywKKyAgICAgICAgRkxVU0hFRCwKICAgICAgICAgU1RPUFBJTkcsCiAgICAgICAgIFJFTEVBU0lORywKICAgICB9OwpAQCAtMTU5LDYgKzE4Miw3IEBACiAgICAgICAgIGtXaGF0R2V0QnVmZmVycyAgICAgICAgICAgICAgICAgICAgID0gJ2dldEInLAogICAgICAgICBrV2hhdEZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdmbHVzJywKICAgICAgICAga1doYXRHZXRPdXRwdXRGb3JtYXQgICAgICAgICAgICAgICAgPSAnZ2V0TycsCisgICAgICAgIGtXaGF0R2V0SW5wdXRGb3JtYXQgICAgICAgICAgICAgICAgID0gJ2dldEknLAogICAgICAgICBrV2hhdERlcXVldWVJbnB1dFRpbWVkT3V0ICAgICAgICAgICA9ICdkSVRPJywKICAgICAgICAga1doYXREZXF1ZXVlT3V0cHV0VGltZWRPdXQgICAgICAgICAgPSAnZE9UTycsCiAgICAgICAgIGtXaGF0Q29kZWNOb3RpZnkgICAgICAgICAgICAgICAgICAgID0gJ2NvZGMnLApAQCAtMTY2LDYgKzE5MCw3IEBACiAgICAgICAgIGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uICAgID0gJ3JhY04nLAogICAgICAgICBrV2hhdEdldE5hbWUgICAgICAgICAgICAgICAgICAgICAgICA9ICdnZXROJywKICAgICAgICAga1doYXRTZXRQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgPSAnc2V0UCcsCisgICAgICAgIGtXaGF0U2V0Q2FsbGJhY2sgICAgICAgICAgICAgICAgICAgID0gJ3NldEMnLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTE3OSwyNiArMjA0LDQ2IEBACiAgICAgICAgIGtGbGFnU2F3TWVkaWFTZXJ2ZXJEaWUgICAgICAgICAgPSAxMjgsCiAgICAgICAgIGtGbGFnSXNFbmNvZGVyICAgICAgICAgICAgICAgICAgPSAyNTYsCiAgICAgICAgIGtGbGFnR2F0aGVyQ29kZWNTcGVjaWZpY0RhdGEgICAgPSA1MTIsCisgICAgICAgIGtGbGFnSXNBc3luYyAgICAgICAgICAgICAgICAgICAgPSAxMDI0LAorICAgICAgICBrRmxhZ0lzQ29tcG9uZW50QWxsb2NhdGVkICAgICAgID0gMjA0OCwKICAgICB9OwogCiAgICAgc3RydWN0IEJ1ZmZlckluZm8gewotICAgICAgICB2b2lkICptQnVmZmVySUQ7CisgICAgICAgIHVpbnQzMl90IG1CdWZmZXJJRDsKICAgICAgICAgc3A8QUJ1ZmZlcj4gbURhdGE7CiAgICAgICAgIHNwPEFCdWZmZXI+IG1FbmNyeXB0ZWREYXRhOwogICAgICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXQ7CiAgICAgICAgIGJvb2wgbU93bmVkQnlDbGllbnQ7CiAgICAgfTsKIAogICAgIFN0YXRlIG1TdGF0ZTsKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPEFMb29wZXI+IG1Db2RlY0xvb3BlcjsKLSAgICBzcDxBQ29kZWM+IG1Db2RlYzsKKyAgICBzcDxDb2RlY0Jhc2U+IG1Db2RlYzsKICAgICBBU3RyaW5nIG1Db21wb25lbnROYW1lOwogICAgIHVpbnQzMl90IG1SZXBseUlEOwogICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICBzdGF0dXNfdCBtU3RpY2t5RXJyb3I7CiAgICAgc3A8U3VyZmFjZT4gbU5hdGl2ZVdpbmRvdzsKICAgICBTb2Z0d2FyZVJlbmRlcmVyICptU29mdFJlbmRlcmVyOwogICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG1DYWxsYmFjazsKKworICAgIGJvb2wgbUJhdHRlcnlTdGF0Tm90aWZpZWQ7CisgICAgYm9vbCBtSXNWaWRlbzsKKworICAgIC8vIGluaXRpYWwgY3JlYXRlIHBhcmFtZXRlcnMKKyAgICBBU3RyaW5nIG1Jbml0TmFtZTsKKyAgICBib29sIG1Jbml0TmFtZUlzVHlwZTsKKyAgICBib29sIG1Jbml0SXNFbmNvZGVyOworCisgICAgLy8gVXNlZCBvbmx5IHRvIHN5bmNocm9uaXplIGFzeW5jaHJvbm91cyBnZXRCdWZmZXJBbmRGb3JtYXQKKyAgICAvLyBhY3Jvc3MgYWxsIHRoZSBvdGhlciAoc3luY2hyb25vdXMpIGJ1ZmZlciBzdGF0ZSBjaGFuZ2UKKyAgICAvLyBvcGVyYXRpb25zLCBzdWNoIGFzIGRlL3F1ZXVlSW4vT3V0cHV0QnVmZmVyLCBzdGFydCBhbmQKKyAgICAvLyBzdG9wL2ZsdXNoL3Jlc2V0L3JlbGVhc2UuCisgICAgTXV0ZXggbUJ1ZmZlckxvY2s7CiAKICAgICBMaXN0PHNpemVfdD4gbUF2YWlsUG9ydEJ1ZmZlcnNbMl07CiAgICAgVmVjdG9yPEJ1ZmZlckluZm8+IG1Qb3J0QnVmZmVyc1syXTsKQEAgLTIyMiw3ICsyNjcsOSBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBQb3N0QW5kQXdhaXRSZXNwb25zZSgKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKTsKIAotICAgIHN0YXR1c190IGluaXQoY29uc3QgY2hhciAqbmFtZSwgYm9vbCBuYW1lSXNUeXBlLCBib29sIGVuY29kZXIpOworICAgIHN0YXRpYyB2b2lkIFBvc3RSZXBseVdpdGhFcnJvcihpbnQzMl90IHJlcGx5SUQsIGludDMyX3QgZXJyKTsKKworICAgIHN0YXR1c190IGluaXQoY29uc3QgQVN0cmluZyAmbmFtZSwgYm9vbCBuYW1lSXNUeXBlLCBib29sIGVuY29kZXIpOwogCiAgICAgdm9pZCBzZXRTdGF0ZShTdGF0ZSBuZXdTdGF0ZSk7CiAgICAgdm9pZCByZXR1cm5CdWZmZXJzVG9Db2RlYygpOwpAQCAtMjMyLDYgKzI3OSwxMCBAQAogICAgIHN0YXR1c190IG9uUmVsZWFzZU91dHB1dEJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgc3NpemVfdCBkZXF1ZXVlUG9ydEJ1ZmZlcihpbnQzMl90IHBvcnRJbmRleCk7CiAKKyAgICBzdGF0dXNfdCBnZXRCdWZmZXJBbmRGb3JtYXQoCisgICAgICAgICAgICBzaXplX3QgcG9ydEluZGV4LCBzaXplX3QgaW5kZXgsCisgICAgICAgICAgICBzcDxBQnVmZmVyPiAqYnVmZmVyLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCk7CisKICAgICBib29sIGhhbmRsZURlcXVldWVJbnB1dEJ1ZmZlcih1aW50MzJfdCByZXBseUlELCBib29sIG5ld1JlcXVlc3QgPSBmYWxzZSk7CiAgICAgYm9vbCBoYW5kbGVEZXF1ZXVlT3V0cHV0QnVmZmVyKHVpbnQzMl90IHJlcGx5SUQsIGJvb2wgbmV3UmVxdWVzdCA9IGZhbHNlKTsKICAgICB2b2lkIGNhbmNlbFBlbmRpbmdEZXF1ZXVlT3BlcmF0aW9ucygpOwpAQCAtMjQ0LDkgKzI5NSwyOCBAQAogCiAgICAgdm9pZCBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7CiAKKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJBdmFpbGFibGUoKTsKKyAgICB2b2lkIG9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKCk7CisgICAgdm9pZCBvbkVycm9yKHN0YXR1c190IGVyciwgaW50MzJfdCBhY3Rpb25Db2RlLCBjb25zdCBjaGFyICpkZXRhaWwgPSBOVUxMKTsKKyAgICB2b2lkIG9uT3V0cHV0Rm9ybWF0Q2hhbmdlZCgpOworCiAgICAgc3RhdHVzX3Qgb25TZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKIAogICAgIHN0YXR1c190IGFtZW5kT3V0cHV0Rm9ybWF0V2l0aENvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgdXBkYXRlQmF0dGVyeVN0YXQoKTsKKyAgICBib29sIGlzRXhlY3V0aW5nKCkgY29uc3Q7CisKKyAgICAvKiBjYWxsZWQgdG8gZ2V0IHRoZSBsYXN0IGNvZGVjIGVycm9yIHdoZW4gdGhlIHN0aWNreSBmbGFnIGlzIHNldC4KKyAgICAgKiBpZiBubyBzdWNoIGNvZGVjIGVycm9yIGlzIGZvdW5kLCByZXR1cm5zIFVOS05PV05fRVJST1IuCisgICAgICovCisgICAgaW5saW5lIHN0YXR1c190IGdldFN0aWNreUVycm9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0aWNreUVycm9yICE9IDAgPyBtU3RpY2t5RXJyb3IgOiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlubGluZSB2b2lkIHNldFN0aWNreUVycm9yKHN0YXR1c190IGVycikgeworICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdTdGlja3lFcnJvcjsKKyAgICAgICAgbVN0aWNreUVycm9yID0gZXJyOworICAgIH0KIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhQ29kZWMpOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaAppbmRleCA1OTA2MjNiLi42Nzc1NGY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCkBAIC0yMCw3MCArMjAsNzIgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBNZWRpYUNvZGVjTGlzdCB7Ci0gICAgc3RhdGljIGNvbnN0IE1lZGlhQ29kZWNMaXN0ICpnZXRJbnN0YW5jZSgpOworc3RydWN0IEFNZXNzYWdlOwogCi0gICAgc3NpemVfdCBmaW5kQ29kZWNCeVR5cGUoCitzdHJ1Y3QgTWVkaWFDb2RlY0xpc3QgOiBwdWJsaWMgQm5NZWRpYUNvZGVjTGlzdCB7CisgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0SW5zdGFuY2UoKTsKKworICAgIHZpcnR1YWwgc3NpemVfdCBmaW5kQ29kZWNCeVR5cGUoCiAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlLCBib29sIGVuY29kZXIsIHNpemVfdCBzdGFydEluZGV4ID0gMCkgY29uc3Q7CiAKLSAgICBzc2l6ZV90IGZpbmRDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgZmluZENvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OwogCi0gICAgc2l6ZV90IGNvdW50Q29kZWNzKCkgY29uc3Q7Ci0gICAgY29uc3QgY2hhciAqZ2V0Q29kZWNOYW1lKHNpemVfdCBpbmRleCkgY29uc3Q7Ci0gICAgYm9vbCBpc0VuY29kZXIoc2l6ZV90IGluZGV4KSBjb25zdDsKLSAgICBib29sIGNvZGVjSGFzUXVpcmsoc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICpxdWlya05hbWUpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50Q29kZWNzKCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBnZXRTdXBwb3J0ZWRUeXBlcyhzaXplX3QgaW5kZXgsIFZlY3RvcjxBU3RyaW5nPiAqdHlwZXMpIGNvbnN0OworICAgIHZpcnR1YWwgc3A8TWVkaWFDb2RlY0luZm8+IGdldENvZGVjSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgaWYgKGluZGV4ID49IG1Db2RlY0luZm9zLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoImIvMjQ0NDUxMjciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQ29kZWNJbmZvcy5pdGVtQXQoaW5kZXgpOworICAgIH0KIAotICAgIHN0cnVjdCBQcm9maWxlTGV2ZWwgewotICAgICAgICB1aW50MzJfdCBtUHJvZmlsZTsKLSAgICAgICAgdWludDMyX3QgbUxldmVsOwotICAgIH07Ci0gICAgc3RhdHVzX3QgZ2V0Q29kZWNDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICBzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKnR5cGUsCi0gICAgICAgICAgICBWZWN0b3I8UHJvZmlsZUxldmVsPiAqcHJvZmlsZUxldmVscywKLSAgICAgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gKmNvbG9yRm9ybWF0cywKLSAgICAgICAgICAgIHVpbnQzMl90ICpmbGFncykgY29uc3Q7CisgICAgLy8gdG8gYmUgdXNlZCBieSBNZWRpYVBsYXllclNlcnZpY2UgYWxvbmUKKyAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBnZXRMb2NhbEluc3RhbmNlKCk7CiAKIHByaXZhdGU6CiAgICAgZW51bSBTZWN0aW9uIHsKICAgICAgICAgU0VDVElPTl9UT1BMRVZFTCwKICAgICAgICAgU0VDVElPTl9ERUNPREVSUywKICAgICAgICAgU0VDVElPTl9ERUNPREVSLAorICAgICAgICBTRUNUSU9OX0RFQ09ERVJfVFlQRSwKICAgICAgICAgU0VDVElPTl9FTkNPREVSUywKICAgICAgICAgU0VDVElPTl9FTkNPREVSLAorICAgICAgICBTRUNUSU9OX0VOQ09ERVJfVFlQRSwKKyAgICAgICAgU0VDVElPTl9JTkNMVURFLAogICAgIH07CiAKLSAgICBzdHJ1Y3QgQ29kZWNJbmZvIHsKLSAgICAgICAgQVN0cmluZyBtTmFtZTsKLSAgICAgICAgYm9vbCBtSXNFbmNvZGVyOwotICAgICAgICB1aW50MzJfdCBtVHlwZXM7Ci0gICAgICAgIHVpbnQzMl90IG1RdWlya3M7Ci0gICAgfTsKLQotICAgIHN0YXRpYyBNZWRpYUNvZGVjTGlzdCAqc0NvZGVjTGlzdDsKKyAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBzQ29kZWNMaXN0OworICAgIHN0YXRpYyBzcDxJTWVkaWFDb2RlY0xpc3Q+IHNSZW1vdGVMaXN0OwogCiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICBTZWN0aW9uIG1DdXJyZW50U2VjdGlvbjsKKyAgICBWZWN0b3I8U2VjdGlvbj4gbVBhc3RTZWN0aW9uczsKICAgICBpbnQzMl90IG1EZXB0aDsKKyAgICBBU3RyaW5nIG1IcmVmQmFzZTsKIAotICAgIFZlY3RvcjxDb2RlY0luZm8+IG1Db2RlY0luZm9zOwotICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNpemVfdD4gbUNvZGVjUXVpcmtzOwotICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNpemVfdD4gbVR5cGVzOworICAgIFZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4gPiBtQ29kZWNJbmZvczsKKyAgICBzcDxNZWRpYUNvZGVjSW5mbz4gbUN1cnJlbnRJbmZvOworICAgIHNwPElPTVg+IG1PTVg7CiAKICAgICBNZWRpYUNvZGVjTGlzdCgpOwogICAgIH5NZWRpYUNvZGVjTGlzdCgpOwogCiAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0gICAgdm9pZCBwYXJzZVhNTEZpbGUoRklMRSAqZmlsZSk7CisgICAgdm9pZCBwYXJzZVhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CisgICAgdm9pZCBwYXJzZVRvcExldmVsWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKTsKIAogICAgIHN0YXRpYyB2b2lkIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyKAogICAgICAgICAgICAgdm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7CkBAIC05MywxMyArOTUsMTggQEAKICAgICB2b2lkIHN0YXJ0RWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICB2b2lkIGVuZEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUpOwogCisgICAgc3RhdHVzX3QgaW5jbHVkZVhNTEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICBzdGF0dXNfdCBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICoqYXR0cnMpOwogICAgIHZvaWQgYWRkTWVkaWFDb2RlYyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUgPSBOVUxMKTsKIAogICAgIHN0YXR1c190IGFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgc3RhdHVzX3QgYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgc3RhdHVzX3QgYWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICBzdGF0dXNfdCBhZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgdm9pZCBhZGRUeXBlKGNvbnN0IGNoYXIgKm5hbWUpOwogCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBjaGFyICp0eXBlKTsKKwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhQ29kZWNMaXN0KTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyOWM4YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNZWRpYUNvZGVjU291cmNlX0hfCisjZGVmaW5lIE1lZGlhQ29kZWNTb3VyY2VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBTG9vcGVyOworY2xhc3MgQU1lc3NhZ2U7CitjbGFzcyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworY2xhc3MgTWVkaWFDb2RlYzsKK2NsYXNzIE1ldGFEYXRhOworCitzdHJ1Y3QgTWVkaWFDb2RlY1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgeworICAgIGVudW0gRmxhZ0JpdHMgeworICAgICAgICBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUICAgICAgPSAxLAorICAgICAgICBGTEFHX1VTRV9NRVRBREFUQV9JTlBVVCAgICAgPSAyLAorICAgIH07CisKKyAgICBzdGF0aWMgc3A8TWVkaWFDb2RlY1NvdXJjZT4gQ3JlYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworCisgICAgYm9vbCBpc1ZpZGVvKCkgY29uc3QgeyByZXR1cm4gbUlzVmlkZW87IH0KKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKworICAgIC8vIE1lZGlhU291cmNlCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpIHsgcmV0dXJuIG1NZXRhOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsCisgICAgICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgLy8gTWVkaWFCdWZmZXJPYnNlcnZlcgorICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKworICAgIC8vIGZvciBBSGFuZGxlclJlZmxlY3RvcgorICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFDb2RlY1NvdXJjZSgpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBQdWxsZXI7CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRQdWxsZXJOb3RpZnksCisgICAgICAgIGtXaGF0RW5jb2RlckFjdGl2aXR5LAorICAgICAgICBrV2hhdFN0YXJ0LAorICAgICAgICBrV2hhdFN0b3AsCisgICAgICAgIGtXaGF0UGF1c2UsCisgICAgfTsKKworICAgIE1lZGlhQ29kZWNTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7CisKKyAgICBzdGF0dXNfdCBvblN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOworICAgIHN0YXR1c190IGluaXQoKTsKKyAgICBzdGF0dXNfdCBpbml0RW5jb2RlcigpOworICAgIHZvaWQgcmVsZWFzZUVuY29kZXIoKTsKKyAgICBzdGF0dXNfdCBmZWVkRW5jb2RlcklucHV0QnVmZmVycygpOworICAgIHZvaWQgc2NoZWR1bGVEb01vcmVXb3JrKCk7CisgICAgc3RhdHVzX3QgZG9Nb3JlV29yayhpbnQzMl90IG51bUlucHV0LCBpbnQzMl90IG51bU91dHB1dCk7CisgICAgdm9pZCBzdXNwZW5kKCk7CisgICAgdm9pZCByZXN1bWUoaW50NjRfdCBza2lwRnJhbWVzQmVmb3JlVXMgPSAtMWxsKTsKKyAgICB2b2lkIHNpZ25hbEVPUyhzdGF0dXNfdCBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICBib29sIHJlYWNoZWRFT1MoKTsKKyAgICBzdGF0dXNfdCBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8QUxvb3Blcj4gbUNvZGVjTG9vcGVyOworICAgIHNwPEFIYW5kbGVyUmVmbGVjdG9yPE1lZGlhQ29kZWNTb3VyY2U+ID4gbVJlZmxlY3RvcjsKKyAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKKyAgICBzcDxNZXRhRGF0YT4gbU1ldGE7CisgICAgc3A8UHVsbGVyPiBtUHVsbGVyOworICAgIHNwPE1lZGlhQ29kZWM+IG1FbmNvZGVyOworICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICBMaXN0PHVpbnQzMl90PiBtU3RvcFJlcGx5SURRdWV1ZTsKKyAgICBib29sIG1Jc1ZpZGVvOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtU3RvcHBpbmc7CisgICAgYm9vbCBtRG9Nb3JlV29ya1BlbmRpbmc7CisgICAgc3A8QU1lc3NhZ2U+IG1FbmNvZGVyQWN0aXZpdHlOb3RpZnk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtRW5jb2RlcklucHV0QnVmZmVyczsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtRW5jb2Rlck91dHB1dEJ1ZmZlcnM7CisgICAgTGlzdDxNZWRpYUJ1ZmZlciAqPiBtSW5wdXRCdWZmZXJRdWV1ZTsKKyAgICBMaXN0PHNpemVfdD4gbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlczsKKyAgICBMaXN0PGludDY0X3Q+IG1EZWNvZGluZ1RpbWVRdWV1ZTsgLy8gZGVjb2RpbmcgdGltZSAodXMpIGZvciB2aWRlbworCisgICAgLy8gYXVkaW8gZHJpZnQgdGltZQorICAgIGludDY0X3QgbUZpcnN0U2FtcGxlVGltZVVzOworICAgIExpc3Q8aW50NjRfdD4gbURyaWZ0VGltZVF1ZXVlOworCisgICAgLy8gZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgcHJvdGVjdGVkIGJ5IG1PdXRwdXRCdWZmZXJMb2NrCisgICAgTXV0ZXggbU91dHB1dEJ1ZmZlckxvY2s7CisgICAgQ29uZGl0aW9uIG1PdXRwdXRCdWZmZXJDb25kOworICAgIExpc3Q8TWVkaWFCdWZmZXIqPiBtT3V0cHV0QnVmZmVyUXVldWU7CisgICAgYm9vbCBtRW5jb2RlclJlYWNoZWRFT1M7CisgICAgc3RhdHVzX3QgbUVycm9yQ29kZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhQ29kZWNTb3VyY2UpOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLyogTWVkaWFDb2RlY1NvdXJjZV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKaW5kZXggY2Y1YmVkYS4uZTY3ZDRkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCkBAIC0yNSw2ICsyNSw3IEBACiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOTsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVkM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyOwpAQCAtMzgsNiArMzksNyBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVc7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1JBVzsKQEAgLTU4LDYgKzYwLDggQEAKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfM0dQUDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1NVQlJJUDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1ZUVDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX0NFQV82MDg7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAppbmRleCA2ODZmMjg2Li4yZTY2M2VjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCkBAIC0yMyw2ICsyMywxOCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIHsKKyAgICAvLyBzdGF0dXNfdCBtYXAgZm9yIGVycm9ycyBpbiB0aGUgbWVkaWEgZnJhbWV3b3JrCisgICAgLy8gT0sgb3IgTk9fRVJST1Igb3IgMCByZXByZXNlbnRzIG5vIGVycm9yLgorCisgICAgLy8gU2VlIHN5c3RlbS9jb3JlL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmgKKyAgICAvLyBTeXN0ZW0gc3RhbmRhcmQgZXJyb3JzIGZyb20gLTEgdGhyb3VnaCAocG9zc2libHkpIC0xMzMKKyAgICAvLworICAgIC8vIEVycm9ycyB3aXRoIHNwZWNpYWwgbWVhbmluZ3MgYW5kIHNpZGUgZWZmZWN0cy4KKyAgICAvLyBJTlZBTElEX09QRVJBVElPTjogIE9wZXJhdGlvbiBhdHRlbXB0ZWQgaW4gYW4gaWxsZWdhbCBzdGF0ZSAod2lsbCB0cnkgdG8gc2lnbmFsIHRvIGFwcCkuCisgICAgLy8gREVBRF9PQkpFQ1Q6ICAgICAgICBTaWduYWwgZnJvbSBDb2RlY0Jhc2UgdG8gTWVkaWFDb2RlYyB0aGF0IE1lZGlhU2VydmVyIGhhcyBkaWVkLgorICAgIC8vIE5BTUVfTk9UX0ZPVU5EOiAgICAgU2lnbmFsIGZyb20gQ29kZWNCYXNlIHRvIE1lZGlhQ29kZWMgdGhhdCB0aGUgY29tcG9uZW50IHdhcyBub3QgZm91bmQuCisKKyAgICAvLyBNZWRpYSBlcnJvcnMKICAgICBNRURJQV9FUlJPUl9CQVNFICAgICAgICA9IC0xMDAwLAogCiAgICAgRVJST1JfQUxSRUFEWV9DT05ORUNURUQgPSBNRURJQV9FUlJPUl9CQVNFLApAQCAtNDYsMjYgKzU4LDU0IEBACiAgICAgLy8gZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmgKICAgICBEUk1fRVJST1JfQkFTRSA9IC0yMDAwLAogCi0gICAgRVJST1JfRFJNX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UsCi0gICAgRVJST1JfRFJNX05PX0xJQ0VOU0UgICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxLAotICAgIEVSUk9SX0RSTV9MSUNFTlNFX0VYUElSRUQgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMiwKLSAgICBFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDMsCi0gICAgRVJST1JfRFJNX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQgID0gRFJNX0VSUk9SX0JBU0UgLSA0LAotICAgIEVSUk9SX0RSTV9ERUNSWVBUICAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNSwKLSAgICBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDYsCi0gICAgRVJST1JfRFJNX1RBTVBFUl9ERVRFQ1RFRCAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA3LAotICAgIEVSUk9SX0RSTV9OT1RfUFJPVklTSU9ORUQgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gOCwKLSAgICBFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDksCi0gICAgRVJST1JfRFJNX1JFU09VUkNFX0JVU1kgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMCwKKyAgICBFUlJPUl9EUk1fVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UsCisgICAgRVJST1JfRFJNX05PX0xJQ0VOU0UgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMSwKKyAgICBFUlJPUl9EUk1fTElDRU5TRV9FWFBJUkVEICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAyLAorICAgIEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDMsCisgICAgRVJST1JfRFJNX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQgICA9IERSTV9FUlJPUl9CQVNFIC0gNCwKKyAgICBFUlJPUl9EUk1fREVDUllQVCAgICAgICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA1LAorICAgIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDYsCisgICAgRVJST1JfRFJNX1RBTVBFUl9ERVRFQ1RFRCAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNywKKyAgICBFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA4LAorICAgIEVSUk9SX0RSTV9ERVZJQ0VfUkVWT0tFRCAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDksCisgICAgRVJST1JfRFJNX1JFU09VUkNFX0JVU1kgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMTAsCisgICAgRVJST1JfRFJNX0lOU1VGRklDSUVOVF9PVVRQVVRfUFJPVEVDVElPTiA9IERSTV9FUlJPUl9CQVNFIC0gMTEsCisgICAgRVJST1JfRFJNX0xBU1RfVVNFRF9FUlJPUkNPREUgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMTEsCiAKLSAgICBFUlJPUl9EUk1fVkVORE9SX01BWCAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDUwMCwKLSAgICBFUlJPUl9EUk1fVkVORE9SX01JTiAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDk5OSwKKyAgICBFUlJPUl9EUk1fVkVORE9SX01BWCAgICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA1MDAsCisgICAgRVJST1JfRFJNX1ZFTkRPUl9NSU4gICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gOTk5LAogCiAgICAgLy8gSGVhcnRiZWF0IEVycm9yIENvZGVzCiAgICAgSEVBUlRCRUFUX0VSUk9SX0JBU0UgPSAtMzAwMCwKICAgICBFUlJPUl9IRUFSVEJFQVRfVEVSTUlOQVRFX1JFUVVFU1RFRCAgICAgICAgICAgICAgICAgICAgID0gSEVBUlRCRUFUX0VSUk9SX0JBU0UsCisKKyAgICAvLyBOREsgRXJyb3IgY29kZXMKKyAgICAvLyBmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbmRrL05ka01lZGlhRXJyb3IuaAorICAgIC8vIGZyb20gLTEwMDAwICgweEZGRkZEOEYwIC0gMHhGRkZGRDhFQykKKyAgICAvLyBmcm9tIC0yMDAwMCAoMHhGRkZGQjFFMCAtIDB4RkZGRkIxRDcpCisKKyAgICAvLyBDb2RlYyBlcnJvcnMgYXJlIHBlcm1pdHRlZCBmcm9tIDB4ODAwMDEwMDAgdGhyb3VnaCAweDkwMDBGRkZGCisgICAgRVJST1JfQ09ERUNfTUFYICAgID0gKHNpZ25lZCkweDkwMDBGRkZGLAorICAgIEVSUk9SX0NPREVDX01JTiAgICA9IChzaWduZWQpMHg4MDAwMTAwMCwKKworICAgIC8vIFN5c3RlbSB1bmtub3duIGVycm9ycyBmcm9tIDB4ODAwMDAwMDAgLSAweDgwMDAwMDA3IChJTlQzMl9NSU4gKyA3KQorICAgIC8vIFNlZSBzeXN0ZW0vY29yZS9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oCiB9OwogCisvLyBhY3Rpb24gY29kZXMgZm9yIE1lZGlhQ29kZWNzIHRoYXQgdGVsbCB0aGUgdXBwZXIgbGF5ZXIgYW5kIGFwcGxpY2F0aW9uCisvLyB0aGUgc2V2ZXJpdHkgb2YgYW55IGVycm9yLgorZW51bSBBY3Rpb25Db2RlIHsKKyAgICBBQ1RJT05fQ09ERV9GQVRBTCwKKyAgICBBQ1RJT05fQ09ERV9UUkFOU0lFTlQsCisgICAgQUNUSU9OX0NPREVfUkVDT1ZFUkFCTEUsCit9OworCisvLyByZXR1cm5zIHRydWUgaWYgZXJyIGlzIGEgcmVjb2duaXplZCBEUk0gZXJyb3IgY29kZQorc3RhdGljIGlubGluZSBib29sIGlzQ3J5cHRvRXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgcmV0dXJuIChFUlJPUl9EUk1fTEFTVF9VU0VEX0VSUk9SQ09ERSA8PSBlcnIgJiYgZXJyIDw9IEVSUk9SX0RSTV9VTktOT1dOKQorICAgICAgICAgICAgfHwgKEVSUk9SX0RSTV9WRU5ET1JfTUlOIDw9IGVyciAmJiBlcnIgPD0gRVJST1JfRFJNX1ZFTkRPUl9NQVgpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIE1FRElBX0VSUk9SU19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCmluZGV4IDMwNzZhOTYuLjE4MzkzM2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKQEAgLTY1LDYgKzY1LDggQEAKICAgICB2aXJ0dWFsIGNoYXIqIGdldERybVRyYWNrSW5mbyhzaXplX3QgdHJhY2tJRCwgaW50ICpsZW4pIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRVSUQodWlkX3QgdWlkKSB7CisgICAgfQogCiBwcm90ZWN0ZWQ6CiAgICAgTWVkaWFFeHRyYWN0b3IoKSA6IG1Jc0RybShmYWxzZSkge30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmQ4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0hUVFBfSF8KKworI2RlZmluZSBNRURJQV9IVFRQX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSU1lZGlhSFRUUENvbm5lY3Rpb247CisKK3N0cnVjdCBNZWRpYUhUVFAgOiBwdWJsaWMgSFRUUEJhc2UgeworICAgIE1lZGlhSFRUUChjb25zdCBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFIVFRQKCk7CisKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpOworICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpOworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBtSFRUUENvbm5lY3Rpb247CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtTGFzdEhlYWRlcnM7CisgICAgQVN0cmluZyBtTGFzdFVSSTsKKworICAgIGJvb2wgbUNhY2hlZFNpemVWYWxpZDsKKyAgICBvZmY2NF90IG1DYWNoZWRTaXplOworCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CisgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CisKKyAgICB2b2lkIGNsZWFyRFJNU3RhdGVfbCgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVkaWFIVFRQKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfSFRUUF9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAppbmRleCBmZjZhNjZlLi5iYmU0MzAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaApAQCAtMzAsNyArMzAsNyBAQAogc3RydWN0IE1lZGlhQnVmZmVyOwogc3RydWN0IE1lZGlhU291cmNlOwogc3RydWN0IE1ldGFEYXRhOwotc3RydWN0IE1QRUc0V3JpdGVyOworc3RydWN0IE1lZGlhV3JpdGVyOwogCiAvLyBNZWRpYU11eGVyIGlzIHVzZWQgdG8gbXV4IG11bHRpcGxlIHRyYWNrcyBpbnRvIGEgdmlkZW8uIEN1cnJlbnRseSwgd2Ugb25seQogLy8gc3VwcG9ydCBhIG1wNCBmaWxlIGFzIHRoZSBvdXRwdXQuCkBAIC00NCw2ICs0NCw3IEBACiAgICAgLy8gT3V0cHV0Rm9ybWF0IGlzIHVwZGF0ZWQuCiAgICAgZW51bSBPdXRwdXRGb3JtYXQgewogICAgICAgICBPVVRQVVRfRk9STUFUX01QRUdfNCA9IDAsCisgICAgICAgIE9VVFBVVF9GT1JNQVRfV0VCTSAgID0gMSwKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGZvcm1hdCB0eXBlCiAgICAgfTsKIApAQCAtMTE1LDcgKzExNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCB1aW50MzJfdCBmbGFncykgOwogCiBwcml2YXRlOgotICAgIHNwPE1QRUc0V3JpdGVyPiBtV3JpdGVyOworICAgIGNvbnN0IE91dHB1dEZvcm1hdCBtRm9ybWF0OworICAgIHNwPE1lZGlhV3JpdGVyPiBtV3JpdGVyOwogICAgIFZlY3Rvcjwgc3A8TWVkaWFBZGFwdGVyPiA+IG1UcmFja0xpc3Q7ICAvLyBFYWNoIHRyYWNrIGhhcyBpdHMgTWVkaWFBZGFwdGVyLgogICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGE7ICAvLyBNZXRhZGF0YSBmb3IgdGhlIHdob2xlIGZpbGUuCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaAppbmRleCAzODE4ZTYzLi5hNjUzZGI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oCkBAIC04Miw2ICs4MiwxMCBAQAogICAgICAgICB2b2lkIHNldExhdGVCeShpbnQ2NF90IGxhdGVuZXNzX3VzKTsKICAgICAgICAgaW50NjRfdCBnZXRMYXRlQnkoKSBjb25zdDsKIAorICAgICAgICB2b2lkIHNldE5vbkJsb2NraW5nKCk7CisgICAgICAgIHZvaWQgY2xlYXJOb25CbG9ja2luZygpOworICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3Q7CisKICAgICBwcml2YXRlOgogICAgICAgICBlbnVtIE9wdGlvbnMgewogICAgICAgICAgICAga1NlZWtUb19PcHRpb24gICAgICA9IDEsCkBAIC05MSw2ICs5NSw3IEBACiAgICAgICAgIGludDY0X3QgbVNlZWtUaW1lVXM7CiAgICAgICAgIFNlZWtNb2RlIG1TZWVrTW9kZTsKICAgICAgICAgaW50NjRfdCBtTGF0ZW5lc3NVczsKKyAgICAgICAgYm9vbCBtTm9uQmxvY2tpbmc7CiAgICAgfTsKIAogICAgIC8vIENhdXNlcyB0aGlzIHNvdXJjZSB0byBzdXNwZW5kIHB1bGxpbmcgZGF0YSBmcm9tIGl0cyB1cHN0cmVhbSBzb3VyY2UKQEAgLTEwNSw3ICsxMTAsNyBAQAogICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIHN0YXJ0KCkgYW5kIGJlZm9yZSB0aGUKICAgICAvLyBmaXJzdCByZWFkKCkgY2FsbC4KICAgICAvLyBDYWxsZWUgYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlcnMgaWYgbm8gZXJyb3IgaXMgcmV0dXJuZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJzKGNvbnN0IFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmYnVmZmVycykgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhjb25zdCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJiAvKiBidWZmZXJzICovKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaAppbmRleCA1Y2M4ZGNmLi5lMjdlYTFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCkBAIC00OCw2ICs0OCw5IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U3RhcnRUaW1lT2Zmc2V0TXMoaW50IG1zKSB7fQorICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTdGFydFRpbWVPZmZzZXRNcygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1lZGlhV3JpdGVyKCkge30KICAgICBpbnQ2NF90IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKaW5kZXggZjUxYzEyZC4uM2Y0Mjc5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApAQCAtNTMsOSArNTMsMTMgQEAKICAgICBrS2V5RVNEUyAgICAgICAgICAgICAgPSAnZXNkcycsICAvLyByYXcgZGF0YQogICAgIGtLZXlBQUNQcm9maWxlICAgICAgICA9ICdhYWNwJywgIC8vIGludDMyX3QKICAgICBrS2V5QVZDQyAgICAgICAgICAgICAgPSAnYXZjYycsICAvLyByYXcgZGF0YQorICAgIGtLZXlIVkNDICAgICAgICAgICAgICA9ICdodmNjJywgIC8vIHJhdyBkYXRhCiAgICAga0tleUQyNjMgICAgICAgICAgICAgID0gJ2QyNjMnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5Vm9yYmlzSW5mbyAgICAgICAgPSAndmluZicsICAvLyByYXcgZGF0YQogICAgIGtLZXlWb3JiaXNCb29rcyAgICAgICA9ICd2Ym9vJywgIC8vIHJhdyBkYXRhCisgICAga0tleU9wdXNIZWFkZXIgICAgICAgID0gJ29oZHInLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5T3B1c0NvZGVjRGVsYXkgICAgPSAnb2NvZCcsICAvLyB1aW50NjRfdCAoY29kZWMgZGVsYXkgaW4gbnMpCisgICAga0tleU9wdXNTZWVrUHJlUm9sbCAgID0gJ29zcHInLCAgLy8gdWludDY0X3QgKHNlZWsgcHJlcm9sbCBpbiBucykKICAgICBrS2V5V2FudHNOQUxGcmFnbWVudHMgPSAnTkFMZicsCiAgICAga0tleUlzU3luY0ZyYW1lICAgICAgID0gJ3N5bmMnLCAgLy8gaW50MzJfdCAoYm9vbCkKICAgICBrS2V5SXNDb2RlY0NvbmZpZyAgICAgPSAnY29uZicsICAvLyBpbnQzMl90IChib29sKQpAQCAtMTYyLDExICsxNjYsMTkgQEAKICAgICBrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSA9ICdjcnlTJywgIC8vIGludDMyX3QKIAogICAgIGtLZXlQc3NoICAgICAgICAgICAgICA9ICdwc3NoJywgIC8vIHJhdyBkYXRhCisKKyAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULgorICAgIGtLZXlUcmFja0lzQXV0b3NlbGVjdCA9ICdhdXRvJywgLy8gYm9vbCAoaW50MzJfdCkKKyAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULgorICAgIGtLZXlUcmFja0lzRGVmYXVsdCAgICA9ICdkZmx0JywgLy8gYm9vbCAoaW50MzJfdCkKKyAgICAvLyBTaW1pbGFyIHRvIE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUgYnV0IHBlcnRhaW5zIHRvIGF2IHRyYWNrcyBhcyB3ZWxsLgorICAgIGtLZXlUcmFja0lzRm9yY2VkICAgICA9ICdmcmNkJywgLy8gYm9vbCAoaW50MzJfdCkKIH07CiAKIGVudW0gewogICAgIGtUeXBlRVNEUyAgICAgICAgPSAnZXNkcycsCiAgICAga1R5cGVBVkNDICAgICAgICA9ICdhdmNjJywKKyAgICBrVHlwZUhWQ0MgICAgICAgID0gJ2h2Y2MnLAogICAgIGtUeXBlRDI2MyAgICAgICAgPSAnZDI2MycsCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDVhZTZmNmIuLjQwMmU3ZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCkBAIC0zMSw2ICszMSw3IEBACiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBBTWVzc2FnZTsKIHN0cnVjdCBEYXRhU291cmNlOworc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogc3RydWN0IE1lZGlhQnVmZmVyOwogc3RydWN0IE1lZGlhRXh0cmFjdG9yOwogc3RydWN0IE1lZGlhU291cmNlOwpAQCAtNDUsNiArNDYsNyBAQAogICAgIE51TWVkaWFFeHRyYWN0b3IoKTsKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaAppbmRleCA1MTIxYzE3Li5lMzQxMTYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCkBAIC0yOCw3ICsyOCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE1lZGlhQ29kZWNMaXN0Oworc3RydWN0IE1lZGlhQ29kZWNJbmZvOwogY2xhc3MgTWVtb3J5RGVhbGVyOwogc3RydWN0IE9NWENvZGVjT2JzZXJ2ZXI7CiBzdHJ1Y3QgQ29kZWNQcm9maWxlTGV2ZWw7CkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgICAgICAgIFZlY3RvcjxDb2RlY05hbWVBbmRRdWlya3M+ICptYXRjaGluZ0NvZGVjTmFtZXNBbmRRdWlya3MpOwogCiAgICAgc3RhdGljIHVpbnQzMl90IGdldENvbXBvbmVudFF1aXJrcygKLSAgICAgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNMaXN0ICpsaXN0LCBzaXplX3QgaW5kZXgpOworICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZsaXN0KTsKIAogICAgIHN0YXRpYyBib29sIGZpbmRDb2RlY1F1aXJrcyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCB1aW50MzJfdCAqcXVpcmtzKTsKIApAQCAtMzUyLDYgKzM1Miw5IEBACiAKICAgICBpbnQ2NF90IGdldERlY29kaW5nVGltZVVzKCk7CiAKKyAgICBzdGF0dXNfdCBwYXJzZUhFVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgdW5zaWduZWQgKnByb2ZpbGUsIHVuc2lnbmVkICpsZXZlbCk7CiAgICAgc3RhdHVzX3QgcGFyc2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAogICAgICAgICAgICAgdW5zaWduZWQgKnByb2ZpbGUsIHVuc2lnbmVkICpsZXZlbCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oCmluZGV4IDI2NTNiNTMuLjA5OGFhNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oCkBAIC00Nyw2ICs0Nyw3IEBACiAgcHJpdmF0ZToKICAgICB2b2lkIHdyaXRlKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG51bSk7CiAgICAgc2l6ZV90IHJlYWQoY2hhciAqZHN0LCBzaXplX3QgbnVtKTsKKyAgICBpbnQzMl90IG1Ta2lwOwogICAgIGludDMyX3QgbUZyb250UGFkZGluZzsKICAgICBpbnQzMl90IG1CYWNrUGFkZGluZzsKICAgICBpbnQzMl90IG1Xcml0ZUhlYWQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmgKaW5kZXggNjUxMGE1OS4uZWIzYWNjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuaApAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbWltZVR5cGUsCiAgICAgICAgICAgICBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCk7CiAKLSAgICB2aXJ0dWFsIGNoYXIgKmV4dHJhY3RBbGJ1bUFydChpbnQgZmQpOworICAgIHZpcnR1YWwgTWVkaWFBbGJ1bUFydCAqZXh0cmFjdEFsYnVtQXJ0KGludCBmZCk7CiAKIHByaXZhdGU6CiAgICAgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIoY29uc3QgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIgJik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaAppbmRleCBkYjVmOTQ3Li40M2I3NWZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmgKQEAgLTExMSw3ICsxMTEsNyBAQAogICAgIC8vIHBhc3MgbWV0YWRhdGEgdGhyb3VnaCB0aGUgYnVmZmVycy4gQ3VycmVudGx5LCBpdCBpcyBmb3JjZSBzZXQgdG8gdHJ1ZQogICAgIGJvb2wgaXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzKCkgY29uc3Q7CiAKLSAgICBzcDxCdWZmZXJRdWV1ZT4gZ2V0QnVmZmVyUXVldWUoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyUXVldWU7IH0KKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRQcm9kdWNlcigpIGNvbnN0IHsgcmV0dXJuIG1Qcm9kdWNlcjsgfQogCiAgICAgLy8gVG8gYmUgY2FsbGVkIGJlZm9yZSBzdGFydCgpCiAgICAgc3RhdHVzX3Qgc2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChzaXplX3QgY291bnQpOwpAQCAtMTM5LDEyICsxMzksMTcgQEAKICAgICAvLyBmcmFtZXMgaXMgc2VwYXJhdGUgdGhhbiB0aGUgb25lIGNhbGxpbmcgc3RvcC4KICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJzUmVsZWFzZWQoKTsKIAorICAgIC8vIFN1cmZhY2VNZWRpYVNvdXJjZSBjYW4ndCBoYW5kbGUgc2lkZWJhbmQgc3RyZWFtcywgc28gdGhpcyBpcyBub3QgZXhwZWN0ZWQKKyAgICAvLyB0byBldmVyIGJlIGNhbGxlZC4gRG9lcyBub3RoaW5nLgorICAgIHZpcnR1YWwgdm9pZCBvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpOworCiAgICAgc3RhdGljIGJvb2wgaXNFeHRlcm5hbEZvcm1hdCh1aW50MzJfdCBmb3JtYXQpOwogCiBwcml2YXRlOgotICAgIC8vIG1CdWZmZXJRdWV1ZSBpcyB0aGUgZXhjaGFuZ2UgcG9pbnQgYmV0d2VlbiB0aGUgcHJvZHVjZXIgYW5kCi0gICAgLy8gdGhpcyBjb25zdW1lcgotICAgIHNwPEJ1ZmZlclF1ZXVlPiBtQnVmZmVyUXVldWU7CisgICAgLy8gQSBCdWZmZXJRdWV1ZSwgcmVwcmVzZW50ZWQgYnkgdGhlc2UgaW50ZXJmYWNlcywgaXMgdGhlIGV4Y2hhbmdlIHBvaW50CisgICAgLy8gYmV0d2VlbiB0aGUgcHJvZHVjZXIgYW5kIHRoaXMgY29uc3VtZXIKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gbUNvbnN1bWVyOwogCiAgICAgc3RydWN0IFNsb3REYXRhIHsKICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUdyYXBoaWNCdWZmZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKaW5kZXggYmJhZDI3MS4uYTc5NWM4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaApAQCAtNTMsNiArNTMsOSBAQAogLy8gQ29udmVydCBhIE1JTUUgdHlwZSB0byBhIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQKIHN0YXR1c190IG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGF1ZGlvX2Zvcm1hdF90JiBmb3JtYXQsIGNvbnN0IGNoYXIqIG1pbWUpOwogCisvLyBDb252ZXJ0IGEgYWFjIHByb2ZpbGUgdG8gYSBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0Cit2b2lkIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KGF1ZGlvX2Zvcm1hdF90JiBmb3JtYXQsIHVpbnQ2NF90IGVBYWNQcm9maWxlKTsKKwogLy8gU2VuZCBpbmZvcm1hdGlvbiBmcm9tIE1ldGFEYXRhIHRvIHRoZSBIQUwgdmlhIEF1ZGlvU2luawogc3RhdHVzX3Qgc2VuZE1ldGFEYXRhVG9IYWwoc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+JiBzaW5rLCBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpOwogCkBAIC02MCw2ICs2Myw4IEBACiBib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7CiAKK0FTdHJpbmcgdXJpRGVidWdTdHJpbmcoY29uc3QgQVN0cmluZyAmdXJpLCBib29sIGluY29nbml0byA9IGZhbHNlKTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBVVElMU19IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaAppbmRleCA5ZWNlZWEzLi43MmUzZDg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaApAQCAtMTgsOCArMTgsMzcgQEAKIAogI2RlZmluZSBBX0JBU0VfSF8KIAorI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKihhKSkpCisKICNkZWZpbmUgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMobmFtZSkgXAogICAgIG5hbWUoY29uc3QgbmFtZSAmKTsgXAogICAgIG5hbWUgJm9wZXJhdG9yPShjb25zdCBuYW1lICYpCiAKKy8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2l6ZSBwYXJhbWV0ZXIgaXMgc2FmZSBmb3IgbmV3IGFycmF5IGFsbG9jYXRpb24gKDMyLWJpdCkKKyAqCisgKiBFeGFtcGxlIHVzYWdlOgorICoKKyAqIGlmICghaXNTYWZlQXJyYXlTaXplPHVpbnQzMl90PihhcnJheVNpemUpKSB7CisgKiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAqIH0KKyAqIC4uLgorICogdWludDMyX3QgKm15QXJyYXkgPSBuZXcgdWludDMyX3RbYXJyYXlTaXplXTsKKyAqCisgKiBUaGVyZSBpcyBhIGJ1ZyBpbiBnY2MgdmVyc2lvbnMgZWFybGllciB0aGFuIDQuOCB3aGVyZSB0aGUgbmV3W10gYXJyYXkgYWxsb2NhdGlvbgorICogd2lsbCBvdmVyZmxvdyBpbiB0aGUgaW50ZXJuYWwgMzIgYml0IGhlYXAgYWxsb2NhdGlvbiwgcmVzdWx0aW5nIGluIGFuCisgKiB1bmRlcmFsbG9jYXRlZCBhcnJheS4gVGhpcyBpcyBhIHNlY3VyaXR5IGlzc3VlIHRoYXQgYWxsb3dzIHBvdGVudGlhbCBvdmVyd3JpdGluZworICogb2Ygb3RoZXIgaGVhcCBkYXRhLgorICoKKyAqIEFuIGFsdGVybmF0aXZlIHRvIGNoZWNraW5nIGlzIHRvIGNyZWF0ZSBhIHNhZmUgbmV3IGFycmF5IHRlbXBsYXRlIGZ1bmN0aW9uIHdoaWNoCisgKiBlaXRoZXIgdGhyb3dzIGEgc3RkOjpiYWRfYWxsb2MgZXhjZXB0aW9uIG9yIHJldHVybnMgTlVMTC9udWxscHRyX3Q7IE5VTEwgY29uc2lkZXJlZAorICogc2FmZSBzaW5jZSBub3JtYWwgYWNjZXNzIG9mIE5VTEwgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKyAqCisgKiBodHRwczovL3NlY3VyaXR5YmxvZy5yZWRoYXQuY29tLzIwMTIvMTAvMzEvYXJyYXktYWxsb2NhdGlvbi1pbi1jeHgvCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBTPgorYm9vbCBpc1NhZmVBcnJheVNpemUoUyBzaXplKSB7CisgICAgcmV0dXJuIHNpemUgPj0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIFMgaXMgc2lnbmVkLCBpZ25vcmVkIGlmIG5vdC4KKyAgICAgICAgICAgICYmIHNpemUgPD0gMHhmZmZmZmZmZiAvIHNpemVvZihUKTsgIC8vIG1heC11bnNpZ25lZC0zMi1iaXQtaW50IC8gZWxlbWVudC1zaXplLgorfQorCiAjZW5kaWYgIC8vIEFfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmgKaW5kZXggNTUxMGIxMi4uYzNiZjBmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oCkBAIC0yNSw4ICsyNSwxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBBQml0UmVhZGVyIHsKK2NsYXNzIEFCaXRSZWFkZXIgeworcHVibGljOgogICAgIEFCaXRSZWFkZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgfkFCaXRSZWFkZXIoKTsKIAogICAgIHVpbnQzMl90IGdldEJpdHMoc2l6ZV90IG4pOwogICAgIHZvaWQgc2tpcEJpdHMoc2l6ZV90IG4pOwpAQCAtMzcsMTggKzM5LDMyIEBACiAKICAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3Q7CiAKLXByaXZhdGU6Citwcm90ZWN0ZWQ6CiAgICAgY29uc3QgdWludDhfdCAqbURhdGE7CiAgICAgc2l6ZV90IG1TaXplOwogCiAgICAgdWludDMyX3QgbVJlc2Vydm9pcjsgIC8vIGxlZnQtYWxpZ25lZCBiaXRzCiAgICAgc2l6ZV90IG1OdW1CaXRzTGVmdDsKIAotICAgIHZvaWQgZmlsbFJlc2Vydm9pcigpOworICAgIHZpcnR1YWwgdm9pZCBmaWxsUmVzZXJ2b2lyKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBQml0UmVhZGVyKTsKIH07CiAKK2NsYXNzIE5BTEJpdFJlYWRlciA6IHB1YmxpYyBBQml0UmVhZGVyIHsKK3B1YmxpYzoKKyAgICBOQUxCaXRSZWFkZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCBhdExlYXN0TnVtQml0c0xlZnQoc2l6ZV90IG4pIGNvbnN0OworCitwcml2YXRlOgorICAgIGludDMyX3QgbU51bVplcm9zOworCisgICAgdmlydHVhbCB2b2lkIGZpbGxSZXNlcnZvaXIoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE5BTEJpdFJlYWRlcik7Cit9OworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEFfQklUX1JFQURFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmgKaW5kZXggMjhmMGFlZC4uNjI5NGVlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oCkBAIC0yNyw2ICsyNyw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTWVzc2FnZTsKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZTsKIAogc3RydWN0IEFCdWZmZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgQUJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpOwpAQCAtNDIsMTEgKzQzLDE3IEBACiAKICAgICB2b2lkIHNldFJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIAorICAgIC8vIGNyZWF0ZSBidWZmZXIgZnJvbSBkdXAgb2Ygc29tZSBtZW1vcnkgYmxvY2sKKyAgICBzdGF0aWMgc3A8QUJ1ZmZlcj4gQ3JlYXRlQXNDb3B5KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBjYXBhY2l0eSk7CisKICAgICB2b2lkIHNldEludDMyRGF0YShpbnQzMl90IGRhdGEpIHsgbUludDMyRGF0YSA9IGRhdGE7IH0KICAgICBpbnQzMl90IGludDMyRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1JbnQzMkRhdGE7IH0KIAogICAgIHNwPEFNZXNzYWdlPiBtZXRhKCk7CiAKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmdldE1lZGlhQnVmZmVyQmFzZSgpOworICAgIHZvaWQgc2V0TWVkaWFCdWZmZXJCYXNlKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWZmZXIpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUJ1ZmZlcigpOwogCkBAIC01NCw2ICs2MSw4IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1GYXJld2VsbDsKICAgICBzcDxBTWVzc2FnZT4gbU1ldGE7CiAKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1NZWRpYUJ1ZmZlckJhc2U7CisKICAgICB2b2lkICptRGF0YTsKICAgICBzaXplX3QgbUNhcGFjaXR5OwogICAgIHNpemVfdCBtUmFuZ2VPZmZzZXQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaAppbmRleCBkMmU2YjI4Li4zYmI3ZDc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKQEAgLTQzLDEzICs0MywxMyBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFTdGF0ZSk7CiB9OwogCi1zdHJ1Y3QgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSA6IHB1YmxpYyBBSGFuZGxlciB7CitzdHJ1Y3QgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSB7CiAgICAgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpOwogCi0gICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKICAgICAvLyBPbmx5IHRvIGJlIGNhbGxlZCBpbiByZXNwb25zZSB0byBhIG1lc3NhZ2UuCiAgICAgdm9pZCBjaGFuZ2VTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZzdGF0ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaAppbmRleCA5NDBmYzU1Li40ZDc2YjY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmgKQEAgLTU2LDggKzU2LDYgQEAKIAogICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBzcDxBTWVzc2FnZT4gPiBtUmVwbGllczsKIAotICAgIHN0YXR1c190IHBvc3RNZXNzYWdlX2woY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDY0X3QgZGVsYXlVcyk7Ci0KICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTG9vcGVyUm9zdGVyKTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmgKaW5kZXggN2U4MjNlYi4uYTllMjM1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmgKQEAgLTUwLDYgKzUwLDcgQEAKICAgICB2b2lkIHNldERvdWJsZShjb25zdCBjaGFyICpuYW1lLCBkb3VibGUgdmFsdWUpOwogICAgIHZvaWQgc2V0UG9pbnRlcihjb25zdCBjaGFyICpuYW1lLCB2b2lkICp2YWx1ZSk7CiAgICAgdm9pZCBzZXRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcywgc3NpemVfdCBsZW4gPSAtMSk7CisgICAgdm9pZCBzZXRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgQVN0cmluZyAmcyk7CiAgICAgdm9pZCBzZXRPYmplY3QoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8UmVmQmFzZT4gJm9iaik7CiAgICAgdm9pZCBzZXRCdWZmZXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgdm9pZCBzZXRNZXNzYWdlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmb2JqKTsKQEAgLTU4LDYgKzU5LDggQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSk7CiAKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OworCiAgICAgYm9vbCBmaW5kSW50MzIoY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0OwogICAgIGJvb2wgZmluZEludDY0KGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKnZhbHVlKSBjb25zdDsKICAgICBib29sIGZpbmRTaXplKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCAqdmFsdWUpIGNvbnN0OwpAQCAtMTM0LDcgKzEzNyw5IEBACiAgICAgICAgICAgICBSZWN0IHJlY3RWYWx1ZTsKICAgICAgICAgfSB1OwogICAgICAgICBjb25zdCBjaGFyICptTmFtZTsKKyAgICAgICAgc2l6ZV90ICAgICAgbU5hbWVMZW5ndGg7CiAgICAgICAgIFR5cGUgbVR5cGU7CisgICAgICAgIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKTsKICAgICB9OwogCiAgICAgZW51bSB7CkBAIC0xNDQsMTIgKzE0OSwxNCBAQAogICAgIHNpemVfdCBtTnVtSXRlbXM7CiAKICAgICBJdGVtICphbGxvY2F0ZUl0ZW0oY29uc3QgY2hhciAqbmFtZSk7Ci0gICAgdm9pZCBmcmVlSXRlbShJdGVtICppdGVtKTsKKyAgICB2b2lkIGZyZWVJdGVtVmFsdWUoSXRlbSAqaXRlbSk7CiAgICAgY29uc3QgSXRlbSAqZmluZEl0ZW0oY29uc3QgY2hhciAqbmFtZSwgVHlwZSB0eXBlKSBjb25zdDsKIAogICAgIHZvaWQgc2V0T2JqZWN0SW50ZXJuYWwoCiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxSZWZCYXNlPiAmb2JqLCBUeXBlIHR5cGUpOwogCisgICAgc2l6ZV90IGZpbmRJdGVtSW5kZXgoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbikgY29uc3Q7CisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVzc2FnZSk7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaAppbmRleCAwZjhmMWUxLi43Yzk4Njk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmgKQEAgLTE4LDE0ICsxOCwxOSBAQAogCiAjZGVmaW5lIEFfU1RSSU5HX0hfCiAKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgU3RyaW5nODsKK3N0cnVjdCBQYXJjZWw7CisKIHN0cnVjdCBBU3RyaW5nIHsKICAgICBBU3RyaW5nKCk7CiAgICAgQVN0cmluZyhjb25zdCBjaGFyICpzKTsKICAgICBBU3RyaW5nKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBzaXplKTsKKyAgICBBU3RyaW5nKGNvbnN0IFN0cmluZzggJmZyb20pOwogICAgIEFTdHJpbmcoY29uc3QgQVN0cmluZyAmZnJvbSk7CiAgICAgQVN0cmluZyhjb25zdCBBU3RyaW5nICZmcm9tLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgbik7CiAgICAgfkFTdHJpbmcoKTsKQEAgLTY3LDE2ICs3MiwyNiBAQAogICAgIHNpemVfdCBoYXNoKCkgY29uc3Q7CiAKICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBU3RyaW5nICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KICAgICBib29sIG9wZXJhdG9yPChjb25zdCBBU3RyaW5nICZvdGhlcikgY29uc3Q7CiAgICAgYm9vbCBvcGVyYXRvcj4oY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OwogCiAgICAgaW50IGNvbXBhcmUoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OworICAgIGludCBjb21wYXJlSWdub3JlQ2FzZShjb25zdCBBU3RyaW5nICZvdGhlcikgY29uc3Q7CiAKKyAgICBib29sIGVxdWFsc0lnbm9yZUNhc2UoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OwogICAgIGJvb2wgc3RhcnRzV2l0aChjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OwogICAgIGJvb2wgZW5kc1dpdGgoY29uc3QgY2hhciAqc3VmZml4KSBjb25zdDsKKyAgICBib29sIHN0YXJ0c1dpdGhJZ25vcmVDYXNlKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgYm9vbCBlbmRzV2l0aElnbm9yZUNhc2UoY29uc3QgY2hhciAqc3VmZml4KSBjb25zdDsKIAogICAgIHZvaWQgdG9sb3dlcigpOwogCisgICAgc3RhdGljIEFTdHJpbmcgRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Q7CisKIHByaXZhdGU6CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtFbXB0eVN0cmluZzsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oCmluZGV4IDYwY2I0MWQuLjI1NWJjYmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKQEAgLTIwLDkgKzIwLDQ0IEBACiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gbWF0aCB0ZW1wbGF0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCisvKiBUIG11c3QgYmUgaW50ZWdlciB0eXBlLCBkZW4gbXVzdCBub3QgYmUgMCAqLwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgY29uc3QgVCBkaXZSb3VuZChjb25zdCBUICZub20sIGNvbnN0IFQgJmRlbikgeworICAgIGlmICgobm9tID49IDApIF4gKGRlbiA+PSAwKSkgeworICAgICAgICByZXR1cm4gKG5vbSAtIGRlbiAvIDIpIC8gZGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAobm9tICsgZGVuIC8gMikgLyBkZW47CisgICAgfQorfQorCisvKiA9PSBjZWlsKG5vbSAvIGRlbikuIFQgbXVzdCBiZSBpbnRlZ2VyIHR5cGUsIGRlbiBtdXN0IG5vdCBiZSAwICovCit0ZW1wbGF0ZTxjbGFzcyBUPgoraW5saW5lIHN0YXRpYyBjb25zdCBUIGRpdlVwKGNvbnN0IFQgJm5vbSwgY29uc3QgVCAmZGVuKSB7CisgICAgaWYgKGRlbiA8IDApIHsKKyAgICAgICAgcmV0dXJuIChub20gPCAwID8gbm9tICsgZGVuICsgMSA6IG5vbSkgLyBkZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChub20gPCAwID8gbm9tIDogbm9tICsgZGVuIC0gMSkgLyBkZW47CisgICAgfQorfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgoraW5saW5lIHN0YXRpYyBUIGFicyhjb25zdCBUICZhKSB7CisgICAgcmV0dXJuIGEgPCAwID8gLWEgOiBhOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgoraW5saW5lIHN0YXRpYyBjb25zdCBUICZtaW4oY29uc3QgVCAmYSwgY29uc3QgVCAmYikgeworICAgIHJldHVybiBhIDwgYiA/IGEgOiBiOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgoraW5saW5lIHN0YXRpYyBjb25zdCBUICZtYXgoY29uc3QgVCAmYSwgY29uc3QgVCAmYikgeworICAgIHJldHVybiBhID4gYiA/IGEgOiBiOworfQorCiB0ZW1wbGF0ZTxjbGFzcyBUPgogdm9pZCBFTlNVUkVfVU5TSUdORURfVFlQRSgpIHsKLSAgICBUIFRZUEVfTVVTVF9CRV9VTlNJR05FRFsoVCktMSA8IDAgPyAtMSA6IDBdOworICAgIFQgVFlQRV9NVVNUX0JFX1VOU0lHTkVEWyhUKS0xIDwgMCA/IC0xIDogMF0gX191bnVzZWQ7CiB9CiAKIC8vIG5lZWRsZSBpcyBpbiByYW5nZSBbaGF5U3RhcnQsIGhheVN0YXJ0ICsgaGF5U2l6ZSkKQEAgLTQyLDQgKzc3LDExIEBACiAgICAgICAgICAgICAmJiAoVSkobmVlZGxlU3RhcnQgKyBuZWVkbGVTaXplIC0gaGF5U3RhcnQpIDw9IGhheVNpemU7CiB9CiAKKy8qIFQgbXVzdCBiZSBpbnRlZ2VyIHR5cGUsIHBlcmlvZCBtdXN0IGJlIHBvc2l0aXZlICovCit0ZW1wbGF0ZTxjbGFzcyBUPgoraW5saW5lIHN0YXRpYyBUIHBlcmlvZGljRXJyb3IoY29uc3QgVCAmdmFsLCBjb25zdCBUICZwZXJpb2QpIHsKKyAgICBUIGVyciA9IGFicyh2YWwpICUgcGVyaW9kOworICAgIHJldHVybiAoZXJyIDwgKHBlcmlvZCAvIDIpKSA/IGVyciA6IChwZXJpb2QgLSBlcnIpOworfQorCiAjZW5kaWYgIC8vIEFfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQxOGZiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyQmFzZS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQlVGRkVSX0JBU0VfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfQkFTRV9IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZSB7CitwdWJsaWM6CisgICAgTWVkaWFCdWZmZXJCYXNlKCkge30KKworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFCdWZmZXJCYXNlKCkge30KKworcHJpdmF0ZToKKyAgICBNZWRpYUJ1ZmZlckJhc2UoY29uc3QgTWVkaWFCdWZmZXJCYXNlICYpOworICAgIE1lZGlhQnVmZmVyQmFzZSAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyQmFzZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmgKaW5kZXggZjIzYzMzNy4uMzdlZjY3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmgKQEAgLTI1LDYgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQUxvb3BlcjsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIE1lZGlhUGxheWVyQmFzZTsKIGNsYXNzIE1lZGlhU291cmNlOwogY2xhc3MgUGFyY2VsOwpAQCAtMzQsNyArMzUsOSBAQAogCiBjbGFzcyBUaW1lZFRleHREcml2ZXIgewogcHVibGljOgotICAgIFRpbWVkVGV4dERyaXZlcihjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lcik7CisgICAgVGltZWRUZXh0RHJpdmVyKAorICAgICAgICAgICAgY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIH5UaW1lZFRleHREcml2ZXIoKTsKIApAQCAtNzcsNiArODAsNyBAQAogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgc3A8VGltZWRUZXh0UGxheWVyPiBtUGxheWVyOwogICAgIHdwPE1lZGlhUGxheWVyQmFzZT4gbUxpc3RlbmVyOworICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CiAKICAgICAvLyBWYXJpYWJsZXMgdG8gYmUgZ3VhcmRlZCBieSBtTG9jay4KICAgICBTdGF0ZSBtU3RhdGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25kay9OZGtNZWRpYUNvZGVjLmggYi9pbmNsdWRlL25kay9OZGtNZWRpYUNvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3ZjRjOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhQ29kZWMuaApAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0NPREVDX0gKKyNkZWZpbmUgX05ES19NRURJQV9DT0RFQ19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KKworI2luY2x1ZGUgIk5ka01lZGlhQ3J5cHRvLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgorI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCitzdHJ1Y3QgQU1lZGlhQ29kZWM7Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDb2RlYyBBTWVkaWFDb2RlYzsKKworc3RydWN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbyB7CisgICAgaW50MzJfdCBvZmZzZXQ7CisgICAgaW50MzJfdCBzaXplOworICAgIGludDY0X3QgcHJlc2VudGF0aW9uVGltZVVzOworICAgIHVpbnQzMl90IGZsYWdzOworfTsKK3R5cGVkZWYgc3RydWN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbyBBTWVkaWFDb2RlY0J1ZmZlckluZm87Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDb2RlY0NyeXB0b0luZm8gQU1lZGlhQ29kZWNDcnlwdG9JbmZvOworCitlbnVtIHsKKyAgICBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNID0gNCwKKyAgICBBTUVESUFDT0RFQ19DT05GSUdVUkVfRkxBR19FTkNPREUgPSAxLAorICAgIEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCA9IC0zLAorICAgIEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0ZPUk1BVF9DSEFOR0VEID0gLTIsCisgICAgQU1FRElBQ09ERUNfSU5GT19UUllfQUdBSU5fTEFURVIgPSAtMQorfTsKKworLyoqCisgKiBDcmVhdGUgY29kZWMgYnkgbmFtZS4gVXNlIHRoaXMgaWYgeW91IGtub3cgdGhlIGV4YWN0IGNvZGVjIHlvdSB3YW50IHRvIHVzZS4KKyAqIFdoZW4gY29uZmlndXJpbmcsIHlvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRvIHVzZSB0aGUgY29kZWMgYXMgYW4KKyAqIGVuY29kZXIgb3IgZGVjb2Rlci4KKyAqLworQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZUNvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworCisvKioKKyAqIENyZWF0ZSBjb2RlYyBieSBtaW1lIHR5cGUuIE1vc3QgYXBwbGljYXRpb25zIHdpbGwgdXNlIHRoaXMsIHNwZWNpZnlpbmcgYQorICogbWltZSB0eXBlIG9idGFpbmVkIGZyb20gbWVkaWEgZXh0cmFjdG9yLgorICovCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRGVjb2RlckJ5VHlwZShjb25zdCBjaGFyICptaW1lX3R5cGUpOworCisvKioKKyAqIENyZWF0ZSBlbmNvZGVyIGJ5IG5hbWUuCisgKi8KK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVFbmNvZGVyQnlUeXBlKGNvbnN0IGNoYXIgKm1pbWVfdHlwZSk7CisKKy8qKgorICogZGVsZXRlIHRoZSBjb2RlYyBhbmQgZnJlZSBpdHMgcmVzb3VyY2VzCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2RlbGV0ZShBTWVkaWFDb2RlYyopOworCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgY29kZWMuIEZvciBkZWNvZGluZyB5b3Ugd291bGQgdHlwaWNhbGx5IGdldCB0aGUgZm9ybWF0IGZyb20gYW4gZXh0cmFjdG9yLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19jb25maWd1cmUoCisgICAgICAgIEFNZWRpYUNvZGVjKiwKKyAgICAgICAgY29uc3QgQU1lZGlhRm9ybWF0KiBmb3JtYXQsCisgICAgICAgIEFOYXRpdmVXaW5kb3cqIHN1cmZhY2UsCisgICAgICAgIEFNZWRpYUNyeXB0byAqY3J5cHRvLAorICAgICAgICB1aW50MzJfdCBmbGFncyk7CisKKy8qKgorICogU3RhcnQgdGhlIGNvZGVjLiBBIGNvZGVjIG11c3QgYmUgY29uZmlndXJlZCBiZWZvcmUgaXQgY2FuIGJlIHN0YXJ0ZWQsIGFuZCBtdXN0IGJlIHN0YXJ0ZWQKKyAqIGJlZm9yZSBidWZmZXJzIGNhbiBiZSBzZW50IHRvIGl0LgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zdGFydChBTWVkaWFDb2RlYyopOworCisvKioKKyAqIFN0b3AgdGhlIGNvZGVjLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zdG9wKEFNZWRpYUNvZGVjKik7CisKKy8qCisgKiBGbHVzaCB0aGUgY29kZWMncyBpbnB1dCBhbmQgb3V0cHV0LiBBbGwgaW5kaWNlcyBwcmV2aW91c2x5IHJldHVybmVkIGZyb20gY2FsbHMgdG8KKyAqIEFNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlciBhbmQgQU1lZGlhQ29kZWNfZGVxdWV1ZU91dHB1dEJ1ZmZlciBiZWNvbWUgaW52YWxpZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfZmx1c2goQU1lZGlhQ29kZWMqKTsKKworLyoqCisgKiBHZXQgYW4gaW5wdXQgYnVmZmVyLiBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBpbmRleCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IG9idGFpbmVkIGZyb20KKyAqIGRlcXVldWVJbnB1dEJ1ZmZlciwgYW5kIG5vdCB5ZXQgcXVldWVkLgorICovCit1aW50OF90KiBBTWVkaWFDb2RlY19nZXRJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpOworCisvKioKKyAqIEdldCBhbiBvdXRwdXQgYnVmZmVyLiBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBpbmRleCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IG9idGFpbmVkIGZyb20KKyAqIGRlcXVldWVPdXRwdXRCdWZmZXIsIGFuZCBub3QgeWV0IHF1ZXVlZC4KKyAqLwordWludDhfdCogQU1lZGlhQ29kZWNfZ2V0T3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSk7CisKKy8qKgorICogR2V0IHRoZSBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgaW5wdXQgYnVmZmVyLiBBbiBhcHAgd2lsbCB0eXBpY2FsbHkgdXNlIHRoaXMgd2l0aAorICogZ2V0SW5wdXRCdWZmZXIoKSB0byBnZXQgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIsIHRoZW4gY29weSB0aGUgZGF0YSB0byBiZSBlbmNvZGVkIG9yIGRlY29kZWQKKyAqIGludG8gdGhlIGJ1ZmZlciBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgY29kZWMuCisgKi8KK3NzaXplX3QgQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgaW50NjRfdCB0aW1lb3V0VXMpOworCisvKioKKyAqIFNlbmQgdGhlIHNwZWNpZmllZCBidWZmZXIgdG8gdGhlIGNvZGVjIGZvciBwcm9jZXNzaW5nLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19xdWV1ZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwKKyAgICAgICAgc2l6ZV90IGlkeCwgb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDY0X3QgdGltZSwgdWludDMyX3QgZmxhZ3MpOworCisvKioKKyAqIFNlbmQgdGhlIHNwZWNpZmllZCBidWZmZXIgdG8gdGhlIGNvZGVjIGZvciBwcm9jZXNzaW5nLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwKKyAgICAgICAgc2l6ZV90IGlkeCwgb2ZmX3Qgb2Zmc2V0LCBBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCB1aW50NjRfdCB0aW1lLCB1aW50MzJfdCBmbGFncyk7CisKKy8qKgorICogR2V0IHRoZSBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYnVmZmVyIG9mIHByb2Nlc3NlZCBkYXRhLgorICovCitzc2l6ZV90IEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8sIGludDY0X3QgdGltZW91dFVzKTsKK0FNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0T3V0cHV0Rm9ybWF0KEFNZWRpYUNvZGVjKik7CisKKy8qKgorICogSWYgeW91IGFyZSBkb25lIHdpdGggYSBidWZmZXIsIHVzZSB0aGlzIGNhbGwgdG8gcmV0dXJuIHRoZSBidWZmZXIgdG8KKyAqIHRoZSBjb2RlYy4gSWYgeW91IHByZXZpb3VzbHkgc3BlY2lmaWVkIGEgc3VyZmFjZSB3aGVuIGNvbmZpZ3VyaW5nIHRoaXMKKyAqIHZpZGVvIGRlY29kZXIgeW91IGNhbiBvcHRpb25hbGx5IHJlbmRlciB0aGUgYnVmZmVyLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgc2l6ZV90IGlkeCwgYm9vbCByZW5kZXIpOworCisvKioKKyAqIElmIHlvdSBhcmUgZG9uZSB3aXRoIGEgYnVmZmVyLCB1c2UgdGhpcyBjYWxsIHRvIHVwZGF0ZSBpdHMgc3VyZmFjZSB0aW1lc3RhbXAKKyAqIGFuZCByZXR1cm4gaXQgdG8gdGhlIGNvZGVjIHRvIHJlbmRlciBpdCBvbiB0aGUgb3V0cHV0IHN1cmZhY2UuIElmIHlvdQorICogaGF2ZSBub3Qgc3BlY2lmaWVkIGFuIG91dHB1dCBzdXJmYWNlIHdoZW4gY29uZmlndXJpbmcgdGhpcyB2aWRlbyBjb2RlYywKKyAqIHRoaXMgY2FsbCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUgY29kZWMuCisgKgorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yIE1lZGlhQ29kZWMucmVsZWFzZU91dHB1dEJ1ZmZlci4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZSgKKyAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLCBzaXplX3QgaWR4LCBpbnQ2NF90IHRpbWVzdGFtcE5zKTsKKworCit0eXBlZGVmIGVudW0geworICAgIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQ0xFQVIgPSAwLAorICAgIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX0NUUiA9IDEKK30gY3J5cHRvaW5mb19tb2RlX3Q7CisKKy8qKgorICogQ3JlYXRlIGFuIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyBmcm9tIHNjcmF0Y2guIFVzZSB0aGlzIGlmIHlvdSBuZWVkIHRvIHVzZSBjdXN0b20KKyAqIGNyeXB0byBpbmZvLCByYXRoZXIgdGhhbiBvbmUgb2J0YWluZWQgZnJvbSBBTWVkaWFFeHRyYWN0b3IuCisgKgorICogQU1lZGlhQ29kZWNDcnlwdG9JbmZvIGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlIG9mIGFuIChhdCBsZWFzdAorICogcGFydGlhbGx5KSBlbmNyeXB0ZWQgaW5wdXQgc2FtcGxlLgorICogQSBidWZmZXIncyBkYXRhIGlzIGNvbnNpZGVyZWQgdG8gYmUgcGFydGl0aW9uZWQgaW50byAic3Vic2FtcGxlcyIsCisgKiBlYWNoIHN1YnNhbXBsZSBzdGFydHMgd2l0aCBhIChwb3RlbnRpYWxseSBlbXB0eSkgcnVuIG9mIHBsYWluLAorICogdW5lbmNyeXB0ZWQgYnl0ZXMgZm9sbG93ZWQgYnkgYSAoYWxzbyBwb3RlbnRpYWxseSBlbXB0eSkgcnVuIG9mCisgKiBlbmNyeXB0ZWQgYnl0ZXMuCisgKiBudW1CeXRlc09mQ2xlYXJEYXRhIGNhbiBiZSBudWxsIHRvIGluZGljYXRlIHRoYXQgYWxsIGRhdGEgaXMgZW5jcnlwdGVkLgorICogVGhpcyBpbmZvcm1hdGlvbiBlbmNhcHN1bGF0ZXMgcGVyLXNhbXBsZSBtZXRhZGF0YSBhcyBvdXRsaW5lZCBpbgorICogSVNPL0lFQyBGRElTIDIzMDAxLTc6MjAxMSAiQ29tbW9uIGVuY3J5cHRpb24gaW4gSVNPIGJhc2UgbWVkaWEgZmlsZSBmb3JtYXQgZmlsZXMiLgorICovCitBTWVkaWFDb2RlY0NyeXB0b0luZm8gKkFNZWRpYUNvZGVjQ3J5cHRvSW5mb19uZXcoCisgICAgICAgIGludCBudW1zdWJzYW1wbGVzLAorICAgICAgICB1aW50OF90IGtleVsxNl0sCisgICAgICAgIHVpbnQ4X3QgaXZbMTZdLAorICAgICAgICBjcnlwdG9pbmZvX21vZGVfdCBtb2RlLAorICAgICAgICBzaXplX3QgKmNsZWFyYnl0ZXMsCisgICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXMpOworCisvKioKKyAqIGRlbGV0ZSBhbiBBTWVkaWFDb2RlY0NyeXB0b0luZm8gY3JlYXRlZCBwcmV2aW91c2x5IHdpdGggQU1lZGlhQ29kZWNDcnlwdG9JbmZvX25ldywgb3IKKyAqIG9idGFpbmVkIGZyb20gQU1lZGlhRXh0cmFjdG9yCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19kZWxldGUoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKik7CisKKy8qKgorICogVGhlIG51bWJlciBvZiBzdWJzYW1wbGVzIHRoYXQgbWFrZSB1cCB0aGUgYnVmZmVyJ3MgY29udGVudHMuCisgKi8KK3NpemVfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0TnVtU3ViU2FtcGxlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qKTsKKworLyoqCisgKiBBIDE2LWJ5dGUgb3BhcXVlIGtleQorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0S2V5KEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHVpbnQ4X3QgKmRzdCk7CisKKy8qKgorICogQSAxNi1ieXRlIGluaXRpYWxpemF0aW9uIHZlY3RvcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0SVYoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgdWludDhfdCAqZHN0KTsKKworLyoqCisgKiBUaGUgdHlwZSBvZiBlbmNyeXB0aW9uIHRoYXQgaGFzIGJlZW4gYXBwbGllZCwKKyAqIG9uZSBvZiBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0NMRUFSIG9yIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX0NUUi4KKyAqLworY3J5cHRvaW5mb19tb2RlX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldE1vZGUoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKik7CisKKy8qKgorICogVGhlIG51bWJlciBvZiBsZWFkaW5nIHVuZW5jcnlwdGVkIGJ5dGVzIGluIGVhY2ggc3Vic2FtcGxlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0Q2xlYXJCeXRlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCBzaXplX3QgKmRzdCk7CisKKy8qKgorICogVGhlIG51bWJlciBvZiB0cmFpbGluZyBlbmNyeXB0ZWQgYnl0ZXMgaW4gZWFjaCBzdWJzYW1wbGUuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRFbmNyeXB0ZWRCeXRlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCBzaXplX3QgKmRzdCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vX05ES19NRURJQV9DT0RFQ19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL25kay9OZGtNZWRpYUNyeXB0by5oIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFDcnlwdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDM3NGM1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFDcnlwdG8uaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9DUllQVE9fSAorI2RlZmluZSBfTkRLX01FRElBX0NSWVBUT19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IEFNZWRpYUNyeXB0bzsKK3R5cGVkZWYgc3RydWN0IEFNZWRpYUNyeXB0byBBTWVkaWFDcnlwdG87CisKK3R5cGVkZWYgdWludDhfdCBBTWVkaWFVVUlEWzE2XTsKKworYm9vbCBBTWVkaWFDcnlwdG9faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgQU1lZGlhVVVJRCB1dWlkKTsKKworYm9vbCBBTWVkaWFDcnlwdG9fcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIgKm1pbWUpOworCitBTWVkaWFDcnlwdG8qIEFNZWRpYUNyeXB0b19uZXcoY29uc3QgQU1lZGlhVVVJRCB1dWlkLCBjb25zdCB2b2lkICppbml0RGF0YSwgc2l6ZV90IGluaXREYXRhU2l6ZSk7CisKK3ZvaWQgQU1lZGlhQ3J5cHRvX2RlbGV0ZShBTWVkaWFDcnlwdG8qIGNyeXB0byk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gX05ES19NRURJQV9DUllQVE9fSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFEcm0uaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhRHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhZmRkOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhRHJtLmgKQEAgLTAsMCArMSw0NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9EUk1fSAorI2RlZmluZSBfTkRLX01FRElBX0RSTV9ICisKKyNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworc3RydWN0IEFNZWRpYURybTsKK3R5cGVkZWYgc3RydWN0IEFNZWRpYURybSBBTWVkaWFEcm07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCB1aW50OF90ICpwdHI7CisgICAgc2l6ZV90IGxlbmd0aDsKK30gQU1lZGlhRHJtQnl0ZUFycmF5OworCit0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1TZXNzaW9uSWQ7Cit0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1TY29wZTsKK3R5cGVkZWYgQU1lZGlhRHJtQnl0ZUFycmF5IEFNZWRpYURybUtleVNldElkOwordHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtU2VjdXJlU3RvcDsKKworCit0eXBlZGVmIGVudW0gQU1lZGlhRHJtRXZlbnRUeXBlIHsKKyAgICAvKioKKyAgICAgKiBUaGlzIGV2ZW50IHR5cGUgaW5kaWNhdGVzIHRoYXQgdGhlIGFwcCBuZWVkcyB0byByZXF1ZXN0IGEgY2VydGlmaWNhdGUgZnJvbQorICAgICAqIHRoZSBwcm92aXNpb25pbmcgc2VydmVyLiAgVGhlIHJlcXVlc3QgbWVzc2FnZSBkYXRhIGlzIG9idGFpbmVkIHVzaW5nCisgICAgICogQU1lZGlhRHJtX2dldFByb3Zpc2lvblJlcXVlc3QuCisgICAgICovCisgICAgRVZFTlRfUFJPVklTSU9OX1JFUVVJUkVEID0gMSwKKworICAgIC8qKgorICAgICAqIFRoaXMgZXZlbnQgdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgYXBwIG5lZWRzIHRvIHJlcXVlc3Qga2V5cyBmcm9tIGEgbGljZW5zZQorICAgICAqIHNlcnZlci4gIFRoZSByZXF1ZXN0IG1lc3NhZ2UgZGF0YSBpcyBvYnRhaW5lZCB1c2luZyBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdC4KKyAgICAgKi8KKyAgICBFVkVOVF9LRVlfUkVRVUlSRUQgPSAyLAorCisgICAgLyoqCisgICAgICogVGhpcyBldmVudCB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBsaWNlbnNlZCB1c2FnZSBkdXJhdGlvbiBmb3Iga2V5cyBpbiBhIHNlc3Npb24KKyAgICAgKiBoYXMgZXhwaXJlZC4gIFRoZSBrZXlzIGFyZSBubyBsb25nZXIgdmFsaWQuCisgICAgICovCisgICAgRVZFTlRfS0VZX0VYUElSRUQgPSAzLAorCisgICAgLyoqCisgICAgICogVGhpcyBldmVudCBtYXkgaW5kaWNhdGUgc29tZSBzcGVjaWZpYyB2ZW5kb3ItZGVmaW5lZCBjb25kaXRpb24sIHNlZSB5b3VyCisgICAgICogRFJNIHByb3ZpZGVyIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMKKyAgICAgKi8KKyAgICBFVkVOVF9WRU5ET1JfREVGSU5FRCA9IDQKK30gQU1lZGlhRHJtRXZlbnRUeXBlOworCit0eXBlZGVmIHZvaWQgKCpBTWVkaWFEcm1FdmVudExpc3RlbmVyKShBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIEFNZWRpYURybUV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFTaXplKTsKKworCisvKioKKyAqIFF1ZXJ5IGlmIHRoZSBnaXZlbiBzY2hlbWUgaWRlbnRpZmllZCBieSBpdHMgVVVJRCBpcyBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UsIGFuZAorICogd2hldGhlciB0aGUgZHJtIHBsdWdpbiBpcyBhYmxlIHRvIGhhbmRsZSB0aGUgbWVkaWEgY29udGFpbmVyIGZvcm1hdCBzcGVjaWZpZWQgYnkgbWltZVR5cGUuCisgKgorICogdXVpZCBpZGVudGlmaWVzIHRoZSB1bml2ZXJzYWwgdW5pcXVlIElEIG9mIHRoZSBjcnlwdG8gc2NoZW1lLiB1dWlkIG11c3QgYmUgMTYgYnl0ZXMuCisgKiBtaW1lVHlwZSBpcyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBtZWRpYSBjb250YWluZXIsIGUuZy4gInZpZGVvL21wNCIuICBJZiBtaW1lVHlwZQorICogaXMgbm90IGtub3duIG9yIHJlcXVpcmVkLCBpdCBjYW4gYmUgcHJvdmlkZWQgYXMgTlVMTC4KKyAqLworYm9vbCBBTWVkaWFEcm1faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCAqdXVpZCwgY29uc3QgY2hhciAqbWltZVR5cGUpOworCisvKioKKyAqIENyZWF0ZSBhIE1lZGlhRHJtIGluc3RhbmNlIGZyb20gYSBVVUlECisgKiB1dWlkIGlkZW50aWZpZXMgdGhlIHVuaXZlcnNhbCB1bmlxdWUgSUQgb2YgdGhlIGNyeXB0byBzY2hlbWUuIHV1aWQgbXVzdCBiZSAxNiBieXRlcy4KKyAqLworQU1lZGlhRHJtKiBBTWVkaWFEcm1fY3JlYXRlQnlVVUlEKGNvbnN0IHVpbnQ4X3QgKnV1aWQpOworCisvKioKKyAqIFJlbGVhc2UgYSBNZWRpYURybSBvYmplY3QKKyAqLwordm9pZCBBTWVkaWFEcm1fcmVsZWFzZShBTWVkaWFEcm0gKik7CisKKy8qKgorICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYW4gZXZlbnQgb2NjdXJzCisgKgorICogbGlzdGVuZXIgaXMgdGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBpbnZva2VkIG9uIGV2ZW50CisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXIoQU1lZGlhRHJtICosIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpOworCisvKioKKyAqIE9wZW4gYSBuZXcgc2Vzc2lvbiB3aXRoIHRoZSBNZWRpYURybSBvYmplY3QuICBBIHNlc3Npb24gSUQgaXMgcmV0dXJuZWQuCisgKgorICogcmV0dXJucyBNRURJQURSTV9OT1RfUFJPVklTSU9ORURfRVJST1IgaWYgcHJvdmlzaW9uaW5nIGlzIG5lZWRlZAorICogcmV0dXJucyBNRURJQURSTV9SRVNPVVJDRV9CVVNZX0VSUk9SIGlmIHJlcXVpcmVkIHJlc291cmNlcyBhcmUgaW4gdXNlCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9vcGVuU2Vzc2lvbihBTWVkaWFEcm0gKiwgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQpOworCisvKioKKyAqIENsb3NlIGEgc2Vzc2lvbiBvbiB0aGUgTWVkaWFEcm0gb2JqZWN0IHRoYXQgd2FzIHByZXZpb3VzbHkgb3BlbmVkCisgKiB3aXRoIEFNZWRpYURybV9vcGVuU2Vzc2lvbi4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2Nsb3NlU2Vzc2lvbihBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQpOworCit0eXBlZGVmIGVudW0gQU1lZGlhRHJtS2V5VHlwZSB7CisgICAgLyoqCisgICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZXMgdGhhdCB0aGUga2V5cyB3aWxsIGJlIGZvciBvbmxpbmUgdXNlLCB0aGV5IHdpbGwKKyAgICAgKiBub3QgYmUgc2F2ZWQgdG8gdGhlIGRldmljZSBmb3Igc3Vic2VxdWVudCB1c2Ugd2hlbiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQKKyAgICAgKiB0byBhIG5ldHdvcmsuCisgICAgICovCisgICAgS0VZX1RZUEVfU1RSRUFNSU5HID0gMSwKKworICAgIC8qKgorICAgICAqIFRoaXMga2V5IHJlcXVlc3QgdHlwZSBzcGVjaWZpZXMgdGhhdCB0aGUga2V5cyB3aWxsIGJlIGZvciBvZmZsaW5lIHVzZSwgdGhleQorICAgICAqIHdpbGwgYmUgc2F2ZWQgdG8gdGhlIGRldmljZSBmb3IgdXNlIHdoZW4gdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkIHRvIGEgbmV0d29yay4KKyAgICAgKi8KKyAgICBLRVlfVFlQRV9PRkZMSU5FID0gMiwKKworICAgIC8qKgorICAgICAqIFRoaXMga2V5IHJlcXVlc3QgdHlwZSBzcGVjaWZpZXMgdGhhdCBwcmV2aW91c2x5IHNhdmVkIG9mZmxpbmUga2V5cyBzaG91bGQgYmUgcmVsZWFzZWQuCisgICAgICovCisgICAgS0VZX1RZUEVfUkVMRUFTRSA9IDMKK30gQU1lZGlhRHJtS2V5VHlwZTsKKworLyoqCisgKiAgRGF0YSB0eXBlIGNvbnRhaW5pbmcge2tleSwgdmFsdWV9IHBhaXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRHJtS2V5VmFsdWVQYWlyIHsKKyAgICBjb25zdCBjaGFyICptS2V5OworICAgIGNvbnN0IGNoYXIgKm1WYWx1ZTsKK30gQU1lZGlhRHJtS2V5VmFsdWU7CisKKy8qKgorICogQSBrZXkgcmVxdWVzdC9yZXNwb25zZSBleGNoYW5nZSBvY2N1cnMgYmV0d2VlbiB0aGUgYXBwIGFuZCBhIGxpY2Vuc2Ugc2VydmVyCisgKiB0byBvYnRhaW4gb3IgcmVsZWFzZSBrZXlzIHVzZWQgdG8gZGVjcnlwdCBlbmNyeXB0ZWQgY29udGVudC4KKyAqIEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0IGlzIHVzZWQgdG8gb2J0YWluIGFuIG9wYXF1ZSBrZXkgcmVxdWVzdCBieXRlIGFycmF5IHRoYXQKKyAqIGlzIGRlbGl2ZXJlZCB0byB0aGUgbGljZW5zZSBzZXJ2ZXIuICBUaGUgb3BhcXVlIGtleSByZXF1ZXN0IGJ5dGUgYXJyYXkgaXMKKyAqIHJldHVybmVkIGluIEtleVJlcXVlc3QuZGF0YS4gIFRoZSByZWNvbW1lbmRlZCBVUkwgdG8gZGVsaXZlciB0aGUga2V5IHJlcXVlc3QgdG8KKyAqIGlzIHJldHVybmVkIGluIEtleVJlcXVlc3QuZGVmYXVsdFVybC4KKyAqCisgKiBBZnRlciB0aGUgYXBwIGhhcyByZWNlaXZlZCB0aGUga2V5IHJlcXVlc3QgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLAorICogaXQgc2hvdWxkIGRlbGl2ZXIgdG8gdGhlIHJlc3BvbnNlIHRvIHRoZSBEUk0gZW5naW5lIHBsdWdpbiB1c2luZyB0aGUgbWV0aG9kCisgKiBBTWVkaWFEcm1fcHJvdmlkZUtleVJlc3BvbnNlLgorICoKKyAqIHNjb3BlIG1heSBiZSBhIHNlc3Npb25JZCBvciBhIGtleVNldElkLCBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCBrZXlUeXBlLgorICogV2hlbiB0aGUga2V5VHlwZSBpcyBLRVlfVFlQRV9TVFJFQU1JTkcgb3IgS0VZX1RZUEVfT0ZGTElORSwgc2NvcGUgc2hvdWxkIGJlIHNldAorICogdG8gdGhlIHNlc3Npb25JZCB0aGUga2V5cyB3aWxsIGJlIHByb3ZpZGVkIHRvLiAgV2hlbiB0aGUga2V5VHlwZSBpcworICogS0VZX1RZUEVfUkVMRUFTRSwgc2NvcGUgc2hvdWxkIGJlIHNldCB0byB0aGUga2V5U2V0SWQgb2YgdGhlIGtleXMgYmVpbmcgcmVsZWFzZWQuCisgKiBSZWxlYXNpbmcga2V5cyBmcm9tIGEgZGV2aWNlIGludmFsaWRhdGVzIHRoZW0gZm9yIGFsbCBzZXNzaW9ucy4KKyAqCisgKiBpbml0IGNvbnRhaW5lci1zcGVjaWZpYyBkYXRhLCBpdHMgbWVhbmluZyBpcyBpbnRlcnByZXRlZCBiYXNlZCBvbiB0aGUgbWltZSB0eXBlCisgKiBwcm92aWRlZCBpbiB0aGUgbWltZVR5cGUgcGFyYW1ldGVyLiAgSXQgY291bGQgY29udGFpbiwgZm9yIGV4YW1wbGUsIHRoZSBjb250ZW50CisgKiBJRCwga2V5IElEIG9yIG90aGVyIGRhdGEgb2J0YWluZWQgZnJvbSB0aGUgY29udGVudCBtZXRhZGF0YSB0aGF0IGlzIHJlcXVpcmVkIGluCisgKiBnZW5lcmF0aW5nIHRoZSBrZXkgcmVxdWVzdC4gaW5pdCBtYXkgYmUgbnVsbCB3aGVuIGtleVR5cGUgaXMgS0VZX1RZUEVfUkVMRUFTRS4KKyAqCisgKiBpbml0U2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGluaXREYXRhCisgKgorICogbWltZVR5cGUgaWRlbnRpZmllcyB0aGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LgorICoKKyAqIGtleVR5cGUgc3BlY2lmZXMgdGhlIHR5cGUgb2YgdGhlIHJlcXVlc3QuIFRoZSByZXF1ZXN0IG1heSBiZSB0byBhY3F1aXJlIGtleXMgZm9yCisgKiAgIHN0cmVhbWluZyBvciBvZmZsaW5lIGNvbnRlbnQsIG9yIHRvIHJlbGVhc2UgcHJldmlvdXNseSBhY3F1aXJlZCBrZXlzLCB3aGljaCBhcmUKKyAqICAgaWRlbnRpZmllZCBieSBhIGtleVNldElkLgorICoKKyAqIG9wdGlvbmFsUGFyYW1ldGVycyBhcmUgaW5jbHVkZWQgaW4gdGhlIGtleSByZXF1ZXN0IG1lc3NhZ2UgdG8gYWxsb3cgYSBjbGllbnQKKyAqICAgYXBwbGljYXRpb24gdG8gcHJvdmlkZSBhZGRpdGlvbmFsIG1lc3NhZ2UgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyLgorICoKKyAqIG51bU9wdGlvbmFsUGFyYW1ldGVycyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzIHByb3ZpZGVkCisgKiAgIGJ5IHRoZSBjYWxsZXIKKyAqCisgKiBPbiBleGl0OgorICogICAxLiBUaGUga2V5UmVxdWVzdCBwb2ludGVyIHdpbGwgcmVmZXJlbmNlIHRoZSBvcGFxdWUga2V5IHJlcXVlc3QgZGF0YS4gIEl0CisgKiAgICAgICB3aWxsIHJlc2lkZSBpbiBtZW1vcnkgb3duZWQgYnkgdGhlIEFNZWRpYURybSBvYmplY3QsIGFuZCB3aWxsIHJlbWFpbgorICogICAgICAgYWNjZXNzaWJsZSB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0IG9yIHVudGlsIHRoZQorICogICAgICAgTWVkaWFEcm0gb2JqZWN0IGlzIHJlbGVhc2VkLgorICogICAyLiBrZXlSZXF1ZXN0U2l6ZSB3aWxsIGJlIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdAorICoKKyAqIHJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHJlcHJvdmlzaW9uaW5nIGlzIG5lZWRlZCwgZHVlIHRvIGEKKyAqIHByb2JsZW0gd2l0aCB0aGUgZGV2aWNlIGNlcnRpZmljYXRlLgorKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluaXQsIHNpemVfdCBpbml0U2l6ZSwgY29uc3QgY2hhciAqbWltZVR5cGUsIEFNZWRpYURybUtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtS2V5VmFsdWUgKm9wdGlvbmFsUGFyYW1ldGVycywgc2l6ZV90IG51bU9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgY29uc3QgdWludDhfdCAqKmtleVJlcXVlc3QsIHNpemVfdCAqa2V5UmVxdWVzdFNpemUpOworCisvKioKKyAqIEEga2V5IHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZyb20gdGhlIGxpY2Vuc2Ugc2VydmVyIGJ5IHRoZSBhcHAsIHRoZW4gaXQgaXMKKyAqIHByb3ZpZGVkIHRvIHRoZSBEUk0gZW5naW5lIHBsdWdpbiB1c2luZyBwcm92aWRlS2V5UmVzcG9uc2UuICBXaGVuIHRoZQorICogcmVzcG9uc2UgaXMgZm9yIGFuIG9mZmxpbmUga2V5IHJlcXVlc3QsIGEga2V5U2V0SWQgaXMgcmV0dXJuZWQgdGhhdCBjYW4gYmUKKyAqIHVzZWQgdG8gbGF0ZXIgcmVzdG9yZSB0aGUga2V5cyB0byBhIG5ldyBzZXNzaW9uIHdpdGggQU1lZGlhRHJtX3Jlc3RvcmVLZXlzLgorICogV2hlbiB0aGUgcmVzcG9uc2UgaXMgZm9yIGEgc3RyZWFtaW5nIG9yIHJlbGVhc2UgcmVxdWVzdCwgYSBudWxsIGtleVNldElkIGlzCisgKiByZXR1cm5lZC4KKyAqCisgKiBzY29wZSBtYXkgYmUgYSBzZXNzaW9uSWQgb3Iga2V5U2V0SWQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoZQorICogcmVzcG9uc2UuICBTY29wZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBzZXNzaW9uSWQgd2hlbiB0aGUgcmVzcG9uc2UgaXMgZm9yIGVpdGhlcgorICogc3RyZWFtaW5nIG9yIG9mZmxpbmUga2V5IHJlcXVlc3RzLiAgU2NvcGUgc2hvdWxkIGJlIHNldCB0byB0aGUga2V5U2V0SWQgd2hlbgorICogdGhlIHJlc3BvbnNlIGlzIGZvciBhIHJlbGVhc2UgcmVxdWVzdC4KKyAqCisgKiByZXNwb25zZSBwb2ludHMgdG8gdGhlIG9wYXF1ZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIKKyAqIHJlc3BvbnNlU2l6ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSByZXNwb25zZSBpbiBieXRlcworICovCisKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9wcm92aWRlS2V5UmVzcG9uc2UoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNjb3BlICpzY29wZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZVNpemUsIEFNZWRpYURybUtleVNldElkICprZXlTZXRJZCk7CisKKy8qKgorICogUmVzdG9yZSBwZXJzaXN0ZWQgb2ZmbGluZSBrZXlzIGludG8gYSBuZXcgc2Vzc2lvbi4gIGtleVNldElkIGlkZW50aWZpZXMgdGhlCisgKiBrZXlzIHRvIGxvYWQsIG9idGFpbmVkIGZyb20gYSBwcmlvciBjYWxsIHRvIEFNZWRpYURybV9wcm92aWRlS2V5UmVzcG9uc2UuCisgKgorICogc2Vzc2lvbklkIGlzIHRoZSBzZXNzaW9uIElEIGZvciB0aGUgRFJNIHNlc3Npb24KKyAqIGtleVNldElkIGlkZW50aWZpZXMgdGhlIHNhdmVkIGtleSBzZXQgdG8gcmVzdG9yZQorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVzdG9yZUtleXMoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1LZXlTZXRJZCAqa2V5U2V0SWQpOworCisvKioKKyAqIFJlbW92ZSB0aGUgY3VycmVudCBrZXlzIGZyb20gYSBzZXNzaW9uLgorICoKKyAqIGtleVNldElkIGlkZW50aWZpZXMga2V5cyB0byByZW1vdmUKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3JlbW92ZUtleXMoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqa2V5U2V0SWQpOworCisvKioKKyAqIFJlcXVlc3QgYW4gaW5mb3JtYXRpdmUgZGVzY3JpcHRpb24gb2YgdGhlIGtleSBzdGF0dXMgZm9yIHRoZSBzZXNzaW9uLiAgVGhlIHN0YXR1cyBpcworICogaW4gdGhlIGZvcm0gb2Yge2tleSwgdmFsdWV9IHBhaXJzLiAgU2luY2UgRFJNIGxpY2Vuc2UgcG9saWNpZXMgdmFyeSBieSB2ZW5kb3IsCisgKiB0aGUgc3BlY2lmaWMgc3RhdHVzIGZpZWxkIG5hbWVzIGFyZSBkZXRlcm1pbmVkIGJ5IGVhY2ggRFJNIHZlbmRvci4gIFJlZmVyIHRvIHlvdXIKKyAqIERSTSBwcm92aWRlciBkb2N1bWVudGF0aW9uIGZvciBkZWZpbml0aW9ucyBvZiB0aGUgZmllbGQgbmFtZXMgZm9yIGEgcGFydGljdWxhcgorICogRFJNIGVuZ2luZSBwbHVnaW4uCisgKgorICogT24gZW50cnksIG51bVBhaXJzIHNob3VsZCBiZSBzZXQgYnkgdGhlIGNhbGxlciB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGFpcnMKKyAqIHRoYXQgY2FuIGJlIHJldHVybmVkICh0aGUgc2l6ZSBvZiB0aGUgYXJyYXkpLiAgT24gZXhpdCwgbnVtUGFpcnMgd2lsbCBiZSBzZXQKKyAqIHRvIHRoZSBudW1iZXIgb2YgZW50cmllcyB3cml0dGVuIHRvIHRoZSBhcnJheS4gIElmIHRoZSBudW1iZXIgb2Yge2tleSwgdmFsdWV9IHBhaXJzCisgKiB0byBiZSByZXR1cm5lZCBpcyBncmVhdGVyIHRoYW4gKm51bVBhaXJzLCBNRURJQURSTV9TSE9SVF9CVUZGRVIgd2lsbCBiZSByZXR1cm5lZAorICogYW5kIG51bVBhaXJzIHdpbGwgYmUgc2V0IHRvIHRoZSBudW1iZXIgb2YgcGFpcnMgYXZhaWxhYmxlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcXVlcnlLZXlTdGF0dXMoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBBTWVkaWFEcm1LZXlWYWx1ZSAqa2V5VmFsdWVQYWlycywgc2l6ZV90ICpudW1QYWlycyk7CisKKworLyoqCisgKiBBIHByb3Zpc2lvbiByZXF1ZXN0L3Jlc3BvbnNlIGV4Y2hhbmdlIG9jY3VycyBiZXR3ZWVuIHRoZSBhcHAgYW5kIGEgcHJvdmlzaW9uaW5nCisgKiBzZXJ2ZXIgdG8gcmV0cmlldmUgYSBkZXZpY2UgY2VydGlmaWNhdGUuICBJZiBwcm92aXNpb25pbmluZyBpcyByZXF1aXJlZCwgdGhlCisgKiBFVkVOVF9QUk9WSVNJT05fUkVRVUlSRUQgZXZlbnQgd2lsbCBiZSBzZW50IHRvIHRoZSBldmVudCBoYW5kbGVyLgorICogZ2V0UHJvdmlzaW9uUmVxdWVzdCBpcyB1c2VkIHRvIG9idGFpbiB0aGUgb3BhcXVlIHByb3Zpc2lvbiByZXF1ZXN0IGJ5dGUgYXJyYXkgdGhhdAorICogc2hvdWxkIGJlIGRlbGl2ZXJlZCB0byB0aGUgcHJvdmlzaW9uaW5nIHNlcnZlci4KKyAqIE9uIGV4aXQ6CisgKiAgICAxLiBUaGUgcHJvdmlzaW9uIHJlcXVlc3QgZGF0YSB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgcHJvdmlzaW9uUmVxdWVzdCwgaW4KKyAqICAgICAgICBtZW1vcnkgb3duZWQgYnkgdGhlIEFNZWRpYURybSBvYmplY3QuICBJdCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHRoZQorICogICAgICAgIG5leHQgY2FsbCB0byBnZXRQcm92aXNpb25SZXF1ZXN0LgorICogICAgMi4gcHJvdmlzaW9uUmVxdWVzdFNpemUgd2lsbCBiZSBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QgZGF0YS4KKyAqICAgIDMuIHNlcnZlclVybCB3aWxsIHJlZmVyZW5jZSBhIE5VTEwgdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyB0aGUgVVJMCisgKiAgICAgICB0aGUgcHJvdmlzaW9uaW5nIHJlcXVlc3Qgc2hvdWxkIGJlIHNlbnQgdG8uICBJdCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsCisgKiAgICAgICB0aGUgbmV4dCBjYWxsIHRvIGdldFByb3Zpc2lvblJlcXVlc3QuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRQcm92aXNpb25SZXF1ZXN0KEFNZWRpYURybSAqLCBjb25zdCB1aW50OF90ICoqcHJvdmlzaW9uUmVxdWVzdCwKKyAgICAgICAgc2l6ZV90ICpwcm92aXNpb25SZXF1ZXN0U2l6ZSwgY29uc3QgY2hhciAqKnNlcnZlclVybCk7CisKKworLyoqCisgKiBBZnRlciBhIHByb3Zpc2lvbiByZXNwb25zZSBpcyByZWNlaXZlZCBieSB0aGUgYXBwLCBpdCBpcyBwcm92aWRlZCB0byB0aGUgRFJNCisgKiBlbmdpbmUgcGx1Z2luIHVzaW5nIHRoaXMgbWV0aG9kLgorICoKKyAqIHJlc3BvbnNlIGlzIHRoZSBvcGFxdWUgcHJvdmlzaW9uaW5nIHJlc3BvbnNlIGJ5dGUgYXJyYXkgdG8gcHJvdmlkZSB0byB0aGUKKyAqICAgRFJNIGVuZ2luZSBwbHVnaW4uCisgKiByZXNwb25zZVNpemUgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcHJvdmlzaW9uaW5nIHJlc3BvbnNlIGluIGJ5dGVzLgorICoKKyAqIHJldHVybnMgTUVESUFEUk1fREVWSUNFX1JFVk9LRURfRVJST1IgaWYgdGhlIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZQorICogc2VydmVyIHJlamVjdGVkIHRoZSByZXF1ZXN0CisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoQU1lZGlhRHJtICosCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VTaXplKTsKKworCisvKioKKyAqIEEgbWVhbnMgb2YgZW5mb3JjaW5nIGxpbWl0cyBvbiB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgc3RyZWFtcyBwZXIgc3Vic2NyaWJlcgorICogYWNyb3NzIGRldmljZXMgaXMgcHJvdmlkZWQgdmlhIFNlY3VyZVN0b3AuIFRoaXMgaXMgYWNoaWV2ZWQgYnkgc2VjdXJlbHkKKyAqIG1vbml0b3JpbmcgdGhlIGxpZmV0aW1lIG9mIHNlc3Npb25zLgorICoKKyAqIEluZm9ybWF0aW9uIGZyb20gdGhlIHNlcnZlciByZWxhdGVkIHRvIHRoZSBjdXJyZW50IHBsYXliYWNrIHNlc3Npb24gaXMgd3JpdHRlbgorICogdG8gcGVyc2lzdGVudCBzdG9yYWdlIG9uIHRoZSBkZXZpY2Ugd2hlbiBlYWNoIE1lZGlhQ3J5cHRvIG9iamVjdCBpcyBjcmVhdGVkLgorICoKKyAqIEluIHRoZSBub3JtYWwgY2FzZSwgcGxheWJhY2sgd2lsbCBiZSBjb21wbGV0ZWQsIHRoZSBzZXNzaW9uIGRlc3Ryb3llZCBhbmQgdGhlCisgKiBTZWN1cmUgU3RvcHMgd2lsbCBiZSBxdWVyaWVkLiBUaGUgYXBwIHF1ZXJpZXMgc2VjdXJlIHN0b3BzIGFuZCBmb3J3YXJkcyB0aGUKKyAqIHNlY3VyZSBzdG9wIG1lc3NhZ2UgdG8gdGhlIHNlcnZlciB3aGljaCB2ZXJpZmllcyB0aGUgc2lnbmF0dXJlIGFuZCBub3RpZmllcyB0aGUKKyAqIHNlcnZlciBzaWRlIGRhdGFiYXNlIHRoYXQgdGhlIHNlc3Npb24gZGVzdHJ1Y3Rpb24gaGFzIGJlZW4gY29uZmlybWVkLiBUaGUgcGVyc2lzdGVkCisgKiByZWNvcmQgb24gdGhlIGNsaWVudCBpcyBvbmx5IHJlbW92ZWQgYWZ0ZXIgcG9zaXRpdmUgY29uZmlybWF0aW9uIHRoYXQgdGhlIHNlcnZlcgorICogcmVjZWl2ZWQgdGhlIG1lc3NhZ2UgdXNpbmcgcmVsZWFzZVNlY3VyZVN0b3BzKCkuCisgKgorICogbnVtU2VjdXJlU3RvcHMgaXMgc2V0IGJ5IHRoZSBjYWxsZXIgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlY3VyZSBzdG9wcyB0bworICogcmV0dXJuLiAgT24gZXhpdCwgKm51bVNlY3VyZVN0b3BzIHdpbGwgYmUgc2V0IHRvIHRoZSBudW1iZXIgYWN0dWFsbHkgcmV0dXJuZWQuCisgKiBJZiAqbnVtU2VjdXJlU3RvcHMgaXMgdG9vIHNtYWxsIGZvciB0aGUgbnVtYmVyIG9mIHNlY3VyZSBzdG9wcyBhdmFpbGFibGUsCisgKiBNRURJQURSTV9TSE9SVF9CVUZGRVIgd2lsbCBiZSByZXR1cm5lZCBhbmQgKm51bVNlY3VyZVN0b3BzIHdpbGwgYmUgc2V0IHRvIHRoZQorICogbnVtYmVyIHJlcXVpcmVkLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0U2VjdXJlU3RvcHMoQU1lZGlhRHJtICosCisgICAgICAgIEFNZWRpYURybVNlY3VyZVN0b3AgKnNlY3VyZVN0b3BzLCBzaXplX3QgKm51bVNlY3VyZVN0b3BzKTsKKworLyoqCisgKiBQcm9jZXNzIHRoZSBTZWN1cmVTdG9wIHNlcnZlciByZXNwb25zZSBtZXNzYWdlIHNzUmVsZWFzZS4gIEFmdGVyIGF1dGhlbnRpY2F0aW5nCisgKiB0aGUgbWVzc2FnZSwgcmVtb3ZlIHRoZSBTZWN1cmVTdG9wcyBpZGVudGlmaWVkIGluIHRoZSByZXNwb25zZS4KKyAqCisgKiBzc1JlbGVhc2UgaXMgdGhlIHNlcnZlciByZXNwb25zZSBpbmRpY2F0aW5nIHdoaWNoIHNlY3VyZSBzdG9wcyB0byByZWxlYXNlCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9yZWxlYXNlU2VjdXJlU3RvcHMoQU1lZGlhRHJtICosCisgICAgICAgIGNvbnN0IEFNZWRpYURybVNlY3VyZVN0b3AgKnNzUmVsZWFzZSk7CisKKy8qKgorICogU3RyaW5nIHByb3BlcnR5IG5hbWU6IGlkZW50aWZpZXMgdGhlIG1ha2VyIG9mIHRoZSBEUk0gZW5naW5lIHBsdWdpbgorICovCitjb25zdCBjaGFyICpQUk9QRVJUWV9WRU5ET1IgPSAidmVuZG9yIjsKKworLyoqCisgKiBTdHJpbmcgcHJvcGVydHkgbmFtZTogaWRlbnRpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUgRFJNIGVuZ2luZSBwbHVnaW4KKyAqLworY29uc3QgY2hhciAqUFJPUEVSVFlfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsKKworLyoqCisgKiBTdHJpbmcgcHJvcGVydHkgbmFtZTogZGVzY3JpYmVzIHRoZSBEUk0gZW5naW5lIHBsdWdpbgorICovCitjb25zdCBjaGFyICpQUk9QRVJUWV9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7CisKKy8qKgorICogU3RyaW5nIHByb3BlcnR5IG5hbWU6IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY2lwaGVyIGFuZCBtYWMgYWxnb3JpdGhtcworICogc3VwcG9ydGVkIGJ5IENyeXB0b1Nlc3Npb24uICBUaGUgbGlzdCBtYXkgYmUgZW1wdHkgaWYgdGhlIERSTSBlbmdpbmUKKyAqIHBsdWdpbiBkb2VzIG5vdCBzdXBwb3J0IENyeXB0b1Nlc3Npb24gb3BlcmF0aW9ucy4KKyAqLworY29uc3QgY2hhciAqUFJPUEVSVFlfQUxHT1JJVEhNUyA9ICJhbGdvcml0aG1zIjsKKworLyoqCisgKiBSZWFkIGEgRFJNIGVuZ2luZSBwbHVnaW4gU3RyaW5nIHByb3BlcnR5IHZhbHVlLCBnaXZlbiB0aGUgcHJvcGVydHkgbmFtZSBzdHJpbmcuCisgKgorICogcHJvcGVydHlOYW1lIGlkZW50aWZpZXMgdGhlIHByb3BlcnR5IHRvIHF1ZXJ5CisgKiBPbiByZXR1cm4sIHByb3BlcnR5VmFsdWUgd2lsbCBiZSBzZXQgdG8gcG9pbnQgdG8gdGhlIHByb3BlcnR5IHZhbHVlLiAgVGhlCisgKiBtZW1vcnkgdGhhdCB0aGUgdmFsdWUgcmVzaWRlcyBpbiBpcyBvd25lZCBieSB0aGUgTkRLIE1lZGlhRHJtIEFQSSBhbmQKKyAqIHdpbGwgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gQU1lZGlhRHJtX2dldFByb3BlcnR5U3RyaW5nLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0UHJvcGVydHlTdHJpbmcoQU1lZGlhRHJtICosIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwKKyAgICAgICAgY29uc3QgY2hhciAqKnByb3BlcnR5VmFsdWUpOworCisvKioKKyAqIEJ5dGUgYXJyYXkgcHJvcGVydHkgbmFtZTogdGhlIGRldmljZSB1bmlxdWUgaWRlbnRpZmllciBpcyBlc3RhYmxpc2hlZCBkdXJpbmcKKyAqIGRldmljZSBwcm92aXNpb25pbmcgYW5kIHByb3ZpZGVzIGEgbWVhbnMgb2YgdW5pcXVlbHkgaWRlbnRpZnlpbmcgZWFjaCBkZXZpY2UuCisgKi8KK2NvbnN0IGNoYXIgKlBST1BFUlRZX0RFVklDRV9VTklRVUVfSUQgPSAiZGV2aWNlVW5pcXVlSWQiOworCisvKioKKyAqIFJlYWQgYSBEUk0gZW5naW5lIHBsdWdpbiBieXRlIGFycmF5IHByb3BlcnR5IHZhbHVlLCBnaXZlbiB0aGUgcHJvcGVydHkgbmFtZSBzdHJpbmcuCisgKiBPbiByZXR1cm4sICpwcm9wZXJ0eVZhbHVlIHdpbGwgYmUgc2V0IHRvIHBvaW50IHRvIHRoZSBwcm9wZXJ0eSB2YWx1ZS4gIFRoZQorICogbWVtb3J5IHRoYXQgdGhlIHZhbHVlIHJlc2lkZXMgaW4gaXMgb3duZWQgYnkgdGhlIE5ESyBNZWRpYURybSBBUEkgYW5kCisgKiB3aWxsIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIEFNZWRpYURybV9nZXRQcm9wZXJ0eUJ5dGVBcnJheS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFByb3BlcnR5Qnl0ZUFycmF5KEFNZWRpYURybSAqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCisgICAgICAgIEFNZWRpYURybUJ5dGVBcnJheSAqcHJvcGVydHlWYWx1ZSk7CisKKy8qKgorICogU2V0IGEgRFJNIGVuZ2luZSBwbHVnaW4gU3RyaW5nIHByb3BlcnR5IHZhbHVlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0UHJvcGVydHlTdHJpbmcoQU1lZGlhRHJtICosIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwKKyAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpOworCisvKioKKyAqIFNldCBhIERSTSBlbmdpbmUgcGx1Z2luIGJ5dGUgYXJyYXkgcHJvcGVydHkgdmFsdWUuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRQcm9wZXJ0eUJ5dGVBcnJheShBTWVkaWFEcm0gKiwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLAorICAgICAgICBjb25zdCB1aW50OF90ICp2YWx1ZSwgc2l6ZV90IHZhbHVlU2l6ZSk7CisKKy8qKgorICogSW4gYWRkaXRpb24gdG8gc3VwcG9ydGluZyBkZWNyeXB0aW9uIG9mIERBU0ggQ29tbW9uIEVuY3J5cHRlZCBNZWRpYSwgdGhlCisgKiBNZWRpYURybSBBUElzIHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gc2VjdXJlbHkgZGVsaXZlciBzZXNzaW9uIGtleXMgZnJvbQorICogYW4gb3BlcmF0b3IncyBzZXNzaW9uIGtleSBzZXJ2ZXIgdG8gYSBjbGllbnQgZGV2aWNlLCBiYXNlZCBvbiB0aGUgZmFjdG9yeS1pbnN0YWxsZWQKKyAqIHJvb3Qgb2YgdHJ1c3QsIGFuZCB0aGVuIHBlcmZvcm0gZW5jcnlwdCwgZGVjcnlwdCwgc2lnbiBhbmQgdmVyaWZ5IG9wZXJhdGlvbnMKKyAqIHdpdGggdGhlIHNlc3Npb24ga2V5IG9uIGFyYml0cmFyeSB1c2VyIGRhdGEuCisgKgorICogT3BlcmF0b3JzIGNyZWF0ZSBzZXNzaW9uIGtleSBzZXJ2ZXJzIHRoYXQgcmVjZWl2ZSBzZXNzaW9uIGtleSByZXF1ZXN0cyBhbmQgcHJvdmlkZQorICogZW5jcnlwdGVkIHNlc3Npb24ga2V5cyB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZ2VuZXJhbCBwdXJwb3NlIGNyeXB0byBvcGVyYXRpb25zLgorICoKKyAqIEdlbmVyaWMgZW5jcnlwdC9kZWNyeXB0L3NpZ24vdmVyaWZ5IG1ldGhvZHMgYXJlIGJhc2VkIG9uIHRoZSBlc3RhYmxpc2hlZCBzZXNzaW9uCisgKiBrZXlzLiAgVGhlc2Uga2V5cyBhcmUgZXhjaGFuZ2VkIHVzaW5nIHRoZSBnZXRLZXlSZXF1ZXN0L3Byb3ZpZGVLZXlSZXNwb25zZSBtZXRob2RzLgorICoKKyAqIEFwcGxpY2F0aW9ucyBvZiB0aGlzIGNhcGFiaWxpdHkgaW5jbHVkZSBzZWN1cmluZyB2YXJpb3VzIHR5cGVzIG9mIHB1cmNoYXNlZCBvcgorICogcHJpdmF0ZSBjb250ZW50LCBzdWNoIGFzIGFwcGxpY2F0aW9ucywgYm9va3MgYW5kIG90aGVyIG1lZGlhLCBwaG90b3Mgb3IgbWVkaWEKKyAqIGRlbGl2ZXJ5IHByb3RvY29scy4KKyAqLworCisvKgorICogRW5jcnlwdCB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IGlucHV0IG9mIGxlbmd0aCBkYXRhU2l6ZSB1c2luZyBhbGdvcml0aG0gc3BlY2lmaWVkCisgKiBieSBjaXBoZXJBbGdvcml0aG0sIGFuZCB3cml0ZSB0aGUgZW5jcnlwdGVkIHJlc3VsdCBpbnRvIG91dHB1dC4gIFRoZSBjYWxsZXIgbXVzdAorICogZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGFjY2VwdCBkYXRhU2l6ZSBieXRlcy4gVGhlIGtleQorICogdG8gdXNlIGlzIGlkZW50aWZpZWQgYnkgdGhlIDE2IGJ5dGUga2V5SWQuICBUaGUga2V5IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvCisgKiB0aGUgc2Vzc2lvbiB1c2luZyBwcm92aWRlS2V5UmVzcG9uc2UuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9lbmNyeXB0KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqY2lwaGVyQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqaXYsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHNpemVfdCBkYXRhU2l6ZSk7CisKKy8qCisgKiBEZWNyeXB0IHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgaW5wdXQgb2YgbGVuZ3RoIGRhdGFTaXplIHVzaW5nIGFsZ29yaXRobSBzcGVjaWZpZWQKKyAqIGJ5IGNpcGhlckFsZ29yaXRobSwgYW5kIHdyaXRlIHRoZSBkZWNyeXB0ZWQgcmVzdWx0IGludG8gb3V0cHV0LiAgVGhlIGNhbGxlciBtdXN0CisgKiBlbnN1cmUgdGhhdCB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gYWNjZXB0IGRhdGFTaXplIGJ5dGVzLiAgVGhlIGtleQorICogdG8gdXNlIGlzIGlkZW50aWZpZWQgYnkgdGhlIDE2IGJ5dGUga2V5SWQuICBUaGUga2V5IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvCisgKiB0aGUgc2Vzc2lvbiB1c2luZyBwcm92aWRlS2V5UmVzcG9uc2UuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9kZWNyeXB0KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqY2lwaGVyQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqaXYsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHNpemVfdCBkYXRhU2l6ZSk7CisKKy8qCisgKiBHZW5lcmF0ZSBhIHNpZ25hdHVyZSB1c2luZyB0aGUgc3BlY2lmaWVkIG1hY0FsZ29yaXRobSBvdmVyIHRoZSBtZXNzYWdlIGRhdGEKKyAqIHJlZmVyZW5jZWQgYnkgbWVzc2FnZSBvZiBzaXplIG1lc3NhZ2VTaXplIGFuZCBzdG9yZSB0aGUgc2lnbmF0dXJlIGluIHRoZQorICogYnVmZmVyIHJlZmVyZW5jZWQgc2lnbmF0dXJlIG9mIG1heCBzaXplICpzaWduYXR1cmVTaXplLiAgSWYgdGhlIGJ1ZmZlciBpcyBub3QKKyAqIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBzaWduYXR1cmUsIE1FRElBRFJNX1NIT1JUX0JVRkZFUiBpcyByZXR1cm5lZCBhbmQKKyAqICpzaWduYXR1cmVTaXplIGlzIHNldCB0byB0aGUgYnVmZmVyIHNpemUgcmVxdWlyZWQuICBUaGUga2V5IHRvIHVzZSBpcyBpZGVudGlmaWVkCisgKiBieSB0aGUgMTYgYnl0ZSBrZXlJZC4gIFRoZSBrZXkgbXVzdCBoYXZlIGJlZW4gbG9hZGVkIGludG8gdGhlIHNlc3Npb24gdXNpbmcKKyAqIHByb3ZpZGVLZXlSZXNwb25zZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NpZ24oQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBjaGFyICptYWNBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCB1aW50OF90ICptZXNzYWdlLCBzaXplX3QgbWVzc2FnZVNpemUsCisgICAgICAgIHVpbnQ4X3QgKnNpZ25hdHVyZSwgc2l6ZV90ICpzaWduYXR1cmVTaXplKTsKKworLyoKKyAqIFBlcmZvcm0gYSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgbWFjQWxnb3JpdGhtIG92ZXIgdGhlIG1lc3NhZ2UKKyAqIGRhdGEgcmVmZXJlbmNlZCBieSB0aGUgbWVzc2FnZSBwYXJhbWV0ZXIgb2Ygc2l6ZSBtZXNzYWdlU2l6ZS4gUmV0dXJucyBNRURJQURSTV9PSworICogaWYgdGhlIHNpZ25hdHVyZSBtYXRjaGVzLCBvdGhlcndpc2UgTUVEQUlEUk1fVkVSSUZZX0ZBSUxFRCBpcyByZXR1cm5lZC4gVGhlIGtleSB0bworICogdXNlIGlzIGlkZW50aWZpZWQgYnkgdGhlIDE2IGJ5dGUga2V5SWQuICBUaGUga2V5IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvIHRoZQorICogc2Vzc2lvbiB1c2luZyBwcm92aWRlS2V5UmVzcG9uc2UuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV92ZXJpZnkoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBjaGFyICptYWNBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCBjb25zdCB1aW50OF90ICptZXNzYWdlLCBzaXplX3QgbWVzc2FnZVNpemUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNpZ25hdHVyZSwgc2l6ZV90IHNpZ25hdHVyZVNpemUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvL19OREtfTUVESUFfRFJNX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmRrL05ka01lZGlhRXJyb3IuaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjYxM2ViCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFFcnJvci5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0VSUk9SX0gKKyNkZWZpbmUgX05ES19NRURJQV9FUlJPUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTUVESUFfT0sgPSAwLAorCisgICAgQU1FRElBX0VSUk9SX0JBU0UgICAgICAgICAgICAgICAgICA9IC0xMDAwMCwKKyAgICBBTUVESUFfRVJST1JfVU5LTk9XTiAgICAgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UsCisgICAgQU1FRElBX0VSUk9SX01BTEZPUk1FRCAgICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gMSwKKyAgICBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSAyLAorICAgIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVCAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDMsCisgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNCwKKworICAgIEFNRURJQV9EUk1fRVJST1JfQkFTRSAgICAgICAgICAgICAgPSAtMjAwMDAsCisgICAgQU1FRElBX0RSTV9OT1RfUFJPVklTSU9ORUQgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDEsCisgICAgQU1FRElBX0RSTV9SRVNPVVJDRV9CVVNZICAgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDIsCisgICAgQU1FRElBX0RSTV9ERVZJQ0VfUkVWT0tFRCAgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDMsCisgICAgQU1FRElBX0RSTV9TSE9SVF9CVUZGRVIgICAgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDQsCisgICAgQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDUsCisgICAgQU1FRElBX0RSTV9UQU1QRVJfREVURUNURUQgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDYsCisgICAgQU1FRElBX0RSTV9WRVJJRllfRkFJTEVEICAgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDcsCisgICAgQU1FRElBX0RSTV9ORUVEX0tFWSAgICAgICAgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDgsCisgICAgQU1FRElBX0RSTV9MSUNFTlNFX0VYUElSRUQgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDksCisKK30gbWVkaWFfc3RhdHVzX3Q7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gX05ES19NRURJQV9FUlJPUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL25kay9OZGtNZWRpYUV4dHJhY3Rvci5oIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTRlNzAyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfRVhUUkFDVE9SX0gKKyNkZWZpbmUgX05ES19NRURJQV9FWFRSQUNUT1JfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJOZGtNZWRpYUNvZGVjLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXQuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUNyeXB0by5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBBTWVkaWFFeHRyYWN0b3I7Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFFeHRyYWN0b3IgQU1lZGlhRXh0cmFjdG9yOworCisKKy8qKgorICogQ3JlYXRlIG5ldyBtZWRpYSBleHRyYWN0b3IKKyAqLworQU1lZGlhRXh0cmFjdG9yKiBBTWVkaWFFeHRyYWN0b3JfbmV3KCk7CisKKy8qKgorICogRGVsZXRlIGEgcHJldmlvdXNseSBjcmVhdGVkIG1lZGlhIGV4dHJhY3RvcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKEFNZWRpYUV4dHJhY3RvciopOworCisvKioKKyAqICBTZXQgdGhlIGZpbGUgZGVzY3JpcHRvciBmcm9tIHdoaWNoIHRoZSBleHRyYWN0b3Igd2lsbCByZWFkLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKEFNZWRpYUV4dHJhY3RvciosIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKKworLyoqCisgKiBTZXQgdGhlIFVSSSBmcm9tIHdoaWNoIHRoZSBleHRyYWN0b3Igd2lsbCByZWFkLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZShBTWVkaWFFeHRyYWN0b3IqLCBjb25zdCBjaGFyICpsb2NhdGlvbik7IC8vIFRPRE8gc3VwcG9ydCBoZWFkZXJzCisKKy8qKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdHJhY2tzIGluIHRoZSBwcmV2aW91c2x5IHNwZWNpZmllZCBtZWRpYSBmaWxlCisgKi8KK3NpemVfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChBTWVkaWFFeHRyYWN0b3IqKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGZvcm1hdCBvZiB0aGUgc3BlY2lmaWVkIHRyYWNrLiBUaGUgY2FsbGVyIG11c3QgZnJlZSB0aGUgcmV0dXJuZWQgZm9ybWF0CisgKi8KK0FNZWRpYUZvcm1hdCogQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KEFNZWRpYUV4dHJhY3RvciosIHNpemVfdCBpZHgpOworCisvKioKKyAqIFNlbGVjdCB0aGUgc3BlY2lmaWVkIHRyYWNrLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHJlYWRTYW1wbGVEYXRhLCBnZXRTYW1wbGVUcmFja0luZGV4IGFuZAorICogZ2V0U2FtcGxlVGltZSBvbmx5IHJldHJpZXZlIGluZm9ybWF0aW9uIGZvciB0aGUgc3Vic2V0IG9mIHRyYWNrcyBzZWxlY3RlZC4KKyAqIFNlbGVjdGluZyB0aGUgc2FtZSB0cmFjayBtdWx0aXBsZSB0aW1lcyBoYXMgbm8gZWZmZWN0LCB0aGUgdHJhY2sgaXMKKyAqIG9ubHkgc2VsZWN0ZWQgb25jZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKEFNZWRpYUV4dHJhY3RvciosIHNpemVfdCBpZHgpOworCisvKioKKyAqIFVuc2VsZWN0IHRoZSBzcGVjaWZpZWQgdHJhY2suIFN1YnNlcXVlbnQgY2FsbHMgdG8gcmVhZFNhbXBsZURhdGEsIGdldFNhbXBsZVRyYWNrSW5kZXggYW5kCisgKiBnZXRTYW1wbGVUaW1lIG9ubHkgcmV0cmlldmUgaW5mb3JtYXRpb24gZm9yIHRoZSBzdWJzZXQgb2YgdHJhY2tzIHNlbGVjdGVkLi4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3Vuc2VsZWN0VHJhY2soQU1lZGlhRXh0cmFjdG9yKiwgc2l6ZV90IGlkeCk7CisKKy8qKgorICogUmVhZCB0aGUgY3VycmVudCBzYW1wbGUuCisgKi8KK3NzaXplX3QgQU1lZGlhRXh0cmFjdG9yX3JlYWRTYW1wbGVEYXRhKEFNZWRpYUV4dHJhY3RvciosIHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IGNhcGFjaXR5KTsKKworLyoqCisgKiBSZWFkIHRoZSBjdXJyZW50IHNhbXBsZSdzIGZsYWdzLgorICovCit1aW50MzJfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRmxhZ3MoQU1lZGlhRXh0cmFjdG9yKik7IC8vIHNlZSBkZWZpbml0aW9ucyBiZWxvdworCisvKioKKyAqIFJldHVybnMgdGhlIHRyYWNrIGluZGV4IHRoZSBjdXJyZW50IHNhbXBsZSBvcmlnaW5hdGVzIGZyb20gKG9yIC0xCisgKiBpZiBubyBtb3JlIHNhbXBsZXMgYXJlIGF2YWlsYWJsZSkKKyAqLworaW50IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUcmFja0luZGV4KEFNZWRpYUV4dHJhY3RvciopOworCisvKioKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2FtcGxlJ3MgcHJlc2VudGF0aW9uIHRpbWUgaW4gbWljcm9zZWNvbmRzLgorICogb3IgLTEgaWYgbm8gbW9yZSBzYW1wbGVzIGFyZSBhdmFpbGFibGUuCisgKi8KK2ludDY0X3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUoQU1lZGlhRXh0cmFjdG9yKik7CisKKy8qKgorICogQWR2YW5jZSB0byB0aGUgbmV4dCBzYW1wbGUuIFJldHVybnMgZmFsc2UgaWYgbm8gbW9yZSBzYW1wbGUgZGF0YQorICogaXMgYXZhaWxhYmxlIChlbmQgb2Ygc3RyZWFtKS4KKyAqLworYm9vbCBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZShBTWVkaWFFeHRyYWN0b3IqKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTUVESUFFWFRSQUNUT1JfU0VFS19QUkVWSU9VU19TWU5DLAorICAgIEFNRURJQUVYVFJBQ1RPUl9TRUVLX05FWFRfU1lOQywKKyAgICBBTUVESUFFWFRSQUNUT1JfU0VFS19DTE9TRVNUX1NZTkMKK30gU2Vla01vZGU7CisKKy8qKgorICoKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NlZWtUbyhBTWVkaWFFeHRyYWN0b3IqLCBpbnQ2NF90IHNlZWtQb3NVcywgU2Vla01vZGUgbW9kZSk7CisKKy8qKgorICogbWFwcGluZyBvZiBjcnlwdG8gc2NoZW1lIHV1aWQgdG8gdGhlIHNjaGVtZSBzcGVjaWZpYyBkYXRhIGZvciB0aGF0IHNjaGVtZQorICovCit0eXBlZGVmIHN0cnVjdCBQc3NoRW50cnkgeworICAgIEFNZWRpYVVVSUQgdXVpZDsKKyAgICBzaXplX3QgZGF0YWxlbjsKKyAgICB2b2lkICpkYXRhOworfSBQc3NoRW50cnk7CisKKy8qKgorICogbGlzdCBvZiBjcnlwdG8gc2NoZW1lcyBhbmQgdGhlaXIgZGF0YQorICovCit0eXBlZGVmIHN0cnVjdCBQc3NoSW5mbyB7CisgICAgc2l6ZV90IG51bWVudHJpZXM7CisgICAgUHNzaEVudHJ5IGVudHJpZXNbMF07Cit9IFBzc2hJbmZvOworCisvKioKKyAqIEdldCB0aGUgUFNTSCBpbmZvIGlmIHByZXNlbnQuCisgKi8KK1Bzc2hJbmZvKiBBTWVkaWFFeHRyYWN0b3JfZ2V0UHNzaEluZm8oQU1lZGlhRXh0cmFjdG9yKik7CisKKworQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlQ3J5cHRvSW5mbyhBTWVkaWFFeHRyYWN0b3IgKik7CisKKworZW51bSB7CisgICAgQU1FRElBRVhUUkFDVE9SX1NBTVBMRV9GTEFHX1NZTkMgPSAxLAorICAgIEFNRURJQUVYVFJBQ1RPUl9TQU1QTEVfRkxBR19FTkNSWVBURUQgPSAyLAorfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gX05ES19NRURJQV9FWFRSQUNUT1JfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFGb3JtYXQuaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhRm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyOTc5MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhRm9ybWF0LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9GT1JNQVRfSAorI2RlZmluZSBfTkRLX01FRElBX0ZPUk1BVF9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIk5ka01lZGlhRXJyb3IuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgQU1lZGlhRm9ybWF0OwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRm9ybWF0IEFNZWRpYUZvcm1hdDsKKworQU1lZGlhRm9ybWF0ICpBTWVkaWFGb3JtYXRfbmV3KCk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFGb3JtYXRfZGVsZXRlKEFNZWRpYUZvcm1hdCopOworCisvKioKKyAqIEh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmb3JtYXQuIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgb3duZWQgYnkgdGhlIGZvcm1hdCwKKyAqIGFuZCByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gdG9TdHJpbmcsIG9yIHVudGlsIHRoZSBmb3JtYXQgaXMgZGVsZXRlZC4KKyAqLworY29uc3QgY2hhciogQU1lZGlhRm9ybWF0X3RvU3RyaW5nKEFNZWRpYUZvcm1hdCopOworCitib29sIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90ICpvdXQpOworYm9vbCBBTWVkaWFGb3JtYXRfZ2V0SW50NjQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgaW50NjRfdCAqb3V0KTsKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEZsb2F0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGZsb2F0ICpvdXQpOworLyoqCisgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvd25lZCBieSB0aGUgZm9ybWF0IGFuZCByZW1haW5zIHZhbGlkIGFzIGxvbmcgYXMgdGhlIG5hbWVkIGVudHJ5CisgKiBpcyBwYXJ0IG9mIHRoZSBmb3JtYXQuCisgKi8KK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkKiogZGF0YSwgc2l6ZV90ICpzaXplKTsKKy8qKgorICogVGhlIHJldHVybmVkIHN0cmluZyBpcyBvd25lZCBieSB0aGUgZm9ybWF0LCBhbmQgcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIGdldFN0cmluZywKKyAqIG9yIHVudGlsIHRoZSBmb3JtYXQgaXMgZGVsZXRlZC4KKyAqLworYm9vbCBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipvdXQpOworCisKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEludDMyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgdmFsdWUpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0SW50NjQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgaW50NjRfdCB2YWx1ZSk7Cit2b2lkIEFNZWRpYUZvcm1hdF9zZXRGbG9hdChBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBmbG9hdCB2YWx1ZSk7CisvKioKKyAqIFRoZSBwcm92aWRlZCBzdHJpbmcgaXMgY29waWVkIGludG8gdGhlIGZvcm1hdC4KKyAqLwordm9pZCBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKTsKKy8qKgorICogVGhlIHByb3ZpZGVkIGRhdGEgaXMgY29waWVkIGludG8gdGhlIGZvcm1hdC4KKyAqLwordm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKKworCisKKy8qKgorICogWFhYIHNob3VsZCB0aGVzZSBiZSBpbnRzL2VudW1zIHRoYXQgd2UgbG9vayB1cCBpbiBhIHRhYmxlIGFzIG5lZWRlZD8KKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQ7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0s7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQ7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTjsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUw7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUzsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1Q7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxUOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0hFSUdIVDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUlNRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NUUklERTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFNdXhlci5oIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFNdXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZDk0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25kay9OZGtNZWRpYU11eGVyLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX01VWEVSX0gKKyNkZWZpbmUgX05ES19NRURJQV9NVVhFUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIk5ka01lZGlhQ29kZWMuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXQuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgQU1lZGlhTXV4ZXI7Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFNdXhlciBBTWVkaWFNdXhlcjsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTUVESUFNVVhFUl9PVVRQVVRfRk9STUFUX01QRUdfNCA9IDAsCisgICAgQU1FRElBTVVYRVJfT1VUUFVUX0ZPUk1BVF9XRUJNICAgPSAxLAorfSBPdXRwdXRGb3JtYXQ7CisKKy8qKgorICogQ3JlYXRlIG5ldyBtZWRpYSBtdXhlcgorICovCitBTWVkaWFNdXhlciogQU1lZGlhTXV4ZXJfbmV3KGludCBmZCwgT3V0cHV0Rm9ybWF0IGZvcm1hdCk7CisKKy8qKgorICogRGVsZXRlIGEgcHJldmlvdXNseSBjcmVhdGVkIG1lZGlhIG11eGVyCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX2RlbGV0ZShBTWVkaWFNdXhlciopOworCisvKioKKyAqIFNldCBhbmQgc3RvcmUgdGhlIGdlb2RhdGEgKGxhdGl0dWRlIGFuZCBsb25naXR1ZGUpIGluIHRoZSBvdXRwdXQgZmlsZS4KKyAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIEFNZWRpYU11eGVyX3N0YXJ0LiBUaGUgZ2VvZGF0YSBpcyBzdG9yZWQKKyAqIGluIHVkdGEgYm94IGlmIHRoZSBvdXRwdXQgZm9ybWF0IGlzIEFNRURJQU1VWEVSX09VVFBVVF9GT1JNQVRfTVBFR180LCBhbmQgaXMKKyAqIGlnbm9yZWQgZm9yIG90aGVyIG91dHB1dCBmb3JtYXRzLgorICogVGhlIGdlb2RhdGEgaXMgc3RvcmVkIGFjY29yZGluZyB0byBJU08tNjcwOSBzdGFuZGFyZC4KKyAqCisgKiBCb3RoIHZhbHVlcyBhcmUgc3BlY2lmaWVkIGluIGRlZ3JlZXMuCisgKiBMYXRpdHVkZSBtdXN0IGJlIGluIHRoZSByYW5nZSBbLTkwLCA5MF0uCisgKiBMb25naXR1ZGUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWy0xODAsIDE4MF0uCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3NldExvY2F0aW9uKEFNZWRpYU11eGVyKiwgZmxvYXQgbGF0aXR1ZGUsIGZsb2F0IGxvbmdpdHVkZSk7CisKKy8qKgorICogU2V0cyB0aGUgb3JpZW50YXRpb24gaGludCBmb3Igb3V0cHV0IHZpZGVvIHBsYXliYWNrLgorICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgQU1lZGlhTXV4ZXJfc3RhcnQuIENhbGxpbmcgdGhpcworICogbWV0aG9kIHdpbGwgbm90IHJvdGF0ZSB0aGUgdmlkZW8gZnJhbWUgd2hlbiBtdXhlciBpcyBnZW5lcmF0aW5nIHRoZSBmaWxlLAorICogYnV0IGFkZCBhIGNvbXBvc2l0aW9uIG1hdHJpeCBjb250YWluaW5nIHRoZSByb3RhdGlvbiBhbmdsZSBpbiB0aGUgb3V0cHV0CisgKiB2aWRlbyBpZiB0aGUgb3V0cHV0IGZvcm1hdCBpcyBBTUVESUFNVVhFUl9PVVRQVVRfRk9STUFUX01QRUdfNCwgc28gdGhhdCBhCisgKiB2aWRlbyBwbGF5ZXIgY2FuIGNob29zZSB0aGUgcHJvcGVyIG9yaWVudGF0aW9uIGZvciBwbGF5YmFjay4KKyAqIE5vdGUgdGhhdCBzb21lIHZpZGVvIHBsYXllcnMgbWF5IGNob29zZSB0byBpZ25vcmUgdGhlIGNvbXBvc2l0aW9uIG1hdHJpeAorICogZHVyaW5nIHBsYXliYWNrLgorICogVGhlIGFuZ2xlIGlzIHNwZWNpZmllZCBpbiBkZWdyZWVzLCBjbG9ja3dpc2UuCisgKiBUaGUgc3VwcG9ydGVkIGFuZ2xlcyBhcmUgMCwgOTAsIDE4MCwgYW5kIDI3MCBkZWdyZWVzLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zZXRPcmllbnRhdGlvbkhpbnQoQU1lZGlhTXV4ZXIqLCBpbnQgZGVncmVlcyk7CisKKy8qKgorICogQWRkcyBhIHRyYWNrIHdpdGggdGhlIHNwZWNpZmllZCBmb3JtYXQuCisgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV3IHRyYWNrIG9yIGEgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBmYWlsdXJlLAorICogd2hpY2ggY2FuIGJlIGludGVycHJldGVkIGFzIGEgbWVkaWFfc3RhdHVzX3QuCisgKi8KK3NzaXplX3QgQU1lZGlhTXV4ZXJfYWRkVHJhY2soQU1lZGlhTXV4ZXIqLCBjb25zdCBBTWVkaWFGb3JtYXQqIGZvcm1hdCk7CisKKy8qKgorICogU3RhcnQgdGhlIG11eGVyLiBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIEFNZWRpYU11eGVyX2FkZFRyYWNrIGFuZAorICogYmVmb3JlIEFNZWRpYU11eGVyX3dyaXRlU2FtcGxlRGF0YS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc3RhcnQoQU1lZGlhTXV4ZXIqKTsKKworLyoqCisgKiBTdG9wcyB0aGUgbXV4ZXIuCisgKiBPbmNlIHRoZSBtdXhlciBzdG9wcywgaXQgY2FuIG5vdCBiZSByZXN0YXJ0ZWQuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3N0b3AoQU1lZGlhTXV4ZXIqKTsKKworLyoqCisgKiBXcml0ZXMgYW4gZW5jb2RlZCBzYW1wbGUgaW50byB0aGUgbXV4ZXIuCisgKiBUaGUgYXBwbGljYXRpb24gbmVlZHMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNhbXBsZXMgYXJlIHdyaXR0ZW4gaW50bworICogdGhlIHJpZ2h0IHRyYWNrcy4gQWxzbywgaXQgbmVlZHMgdG8gbWFrZSBzdXJlIHRoZSBzYW1wbGVzIGZvciBlYWNoIHRyYWNrCisgKiBhcmUgd3JpdHRlbiBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIChlLmcuIGluIHRoZSBvcmRlciB0aGV5IGFyZSBwcm92aWRlZAorICogYnkgdGhlIGVuY29kZXIuKQorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl93cml0ZVNhbXBsZURhdGEoQU1lZGlhTXV4ZXIgKm11eGVyLAorICAgICAgICBzaXplX3QgdHJhY2tJZHgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGNvbnN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqaW5mbyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfTVVYRVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKaW5kZXggN2ZkOTM3OS4uZmExYjIwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtNDgsNyArNDksNyBAQAogI2RlZmluZSBDQkxLX1NUUkVBTV9FTkRfRE9ORSAweDQwMCAvLyBzZXQgYnkgc2VydmVyIG9uIHJlbmRlciBjb21wbGV0aW9uLCBjbGVhcmVkIGJ5IGNsaWVudAogCiAvL0VMX0ZJWE1FIDIwIHNlY29uZHMgbWF5IG5vdCBiZSBlbm91Z2ggYW5kIG11c3QgYmUgcmVjb25jaWxlZCB3aXRoIG5ldyBvYnRhaW5CdWZmZXIgaW1wbGVtZW50YXRpb24KLSNkZWZpbmUgTUFYX1JVTl9PRkZMT0FERURfVElNRU9VVF9NUyAyMDAwMCAvL2Fzc3VtaW5nIHVwdG8gYSBtYXhpbXVtIG9mIDIwIHNlY29uZHMgb2Ygb2ZmbG9hZGVkCisjZGVmaW5lIE1BWF9SVU5fT0ZGTE9BREVEX1RJTUVPVVRfTVMgMjAwMDAgLy8gYXNzdW1pbmcgdXAgdG8gYSBtYXhpbXVtIG9mIDIwIHNlY29uZHMgb2Ygb2ZmbG9hZGVkCiAKIHN0cnVjdCBBdWRpb1RyYWNrU2hhcmVkU3RyZWFtaW5nIHsKICAgICAvLyBzaW1pbGFyIHRvIE5CQUlPIE1vbm9QaXBlCkBAIC02NSw3ICs2Niw5IEBACiBzdHJ1Y3QgQXVkaW9UcmFja1NoYXJlZFN0YXRpYyB7CiAgICAgU3RhdGljQXVkaW9UcmFja1NpbmdsZVN0YXRlUXVldWU6OlNoYXJlZAogICAgICAgICAgICAgICAgICAgICBtU2luZ2xlU3RhdGVRdWV1ZTsKLSAgICBzaXplX3QgICAgICAgICAgbUJ1ZmZlclBvc2l0aW9uOyAgICAvLyB1cGRhdGVkIGFzeW5jaHJvbm91c2x5IGJ5IHNlcnZlciwKKyAgICAvLyBUaGlzIGZpZWxkIHNob3VsZCBiZSBhIHNpemVfdCwgYnV0IHNpbmNlIGl0IGlzIGxvY2F0ZWQgaW4gc2hhcmVkIG1lbW9yeSB3ZQorICAgIC8vIGZvcmNlIHRvIDMyLWJpdC4gIFRoZSBjbGllbnQgYW5kIHNlcnZlciBtYXkgaGF2ZSBkaWZmZXJlbnQgdHlwZWRlZnMgZm9yIHNpemVfdC4KKyAgICB1aW50MzJfdCAgICAgICAgbUJ1ZmZlclBvc2l0aW9uOyAgICAvLyB1cGRhdGVkIGFzeW5jaHJvbm91c2x5IGJ5IHNlcnZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiZm9yIGVudGVydGFpbm1lbnQgcHVycG9zZXMgb25seSIKIH07CiAKQEAgLTk2LDExICs5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHZhbHVlIHNob3VsZCBiZSB1c2VkICJmb3IgZW50ZXJ0YWlubWVudCBwdXJwb3NlcyBvbmx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBtZWFucyBkb24ndCBtYWtlIGltcG9ydGFudCBkZWNpc2lvbnMgYmFzZWQgb24gaXQuCiAKLSAgICAgICAgICAgICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50XzsgICAgLy8gdXNlZCBkdXJpbmcgY3JlYXRpb24gdG8gcGFzcyBhY3R1YWwgdHJhY2sgYnVmZmVyIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBBdWRpb0ZsaW5nZXIgdG8gY2xpZW50LCBhbmQgbm90IHJlZmVyZW5jZWQgYWdhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgcmVtb3ZlIGhlcmUgYW5kIHJlcGxhY2UgYnkgY3JlYXRlVHJhY2soKSBpbi9vdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmFtZWQgdG8gIl8iIHRvIGRldGVjdCBpbmNvcnJlY3QgdXNlCisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgbVBhZDE7ICAgICAgLy8gdW51c2VkCiAKICAgICB2b2xhdGlsZSAgICBpbnQzMl90ICAgICBtRnV0ZXg7ICAgICAvLyBldmVudCBmbGFnOiBkb3duIChQKSBieSBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXAgKFYpIGJ5IHNlcnZlciBvciBiaW5kZXJEaWVkKCkgb3IgaW50ZXJydXB0KCkKQEAgLTEwOCwxMyArMTA3LDEyIEBACiAKIHByaXZhdGU6CiAKLSAgICAgICAgICAgICAgICBzaXplX3QgICAgICBtTWluaW11bTsgICAgICAgLy8gc2VydmVyIHdha2VzIHVwIGNsaWVudCBpZiBhdmFpbGFibGUgPj0gbU1pbmltdW0KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGZpZWxkIHNob3VsZCBiZSBhIHNpemVfdCwgYnV0IHNpbmNlIGl0IGlzIGxvY2F0ZWQgaW4gc2hhcmVkIG1lbW9yeSB3ZQorICAgICAgICAgICAgICAgIC8vIGZvcmNlIHRvIDMyLWJpdC4gIFRoZSBjbGllbnQgYW5kIHNlcnZlciBtYXkgaGF2ZSBkaWZmZXJlbnQgdHlwZWRlZnMgZm9yIHNpemVfdC4KKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBtTWluaW11bTsgICAgICAgLy8gc2VydmVyIHdha2VzIHVwIGNsaWVudCBpZiBhdmFpbGFibGUgPj0gbU1pbmltdW0KIAotICAgICAgICAgICAgICAgIC8vIENoYW5uZWwgdm9sdW1lcyBhcmUgZml4ZWQgcG9pbnQgVTQuMTIsIHNvIDB4MTAwMCBtZWFucyAxLjAuCi0gICAgICAgICAgICAgICAgLy8gTGVmdCBjaGFubmVsIGlzIGluIFswOjE1XSwgcmlnaHQgY2hhbm5lbCBpcyBpbiBbMTY6MzFdLgotICAgICAgICAgICAgICAgIC8vIEFsd2F5cyByZWFkIGFuZCB3cml0ZSB0aGUgY29tYmluZWQgcGFpciBhdG9taWNhbGx5LgotICAgICAgICAgICAgICAgIC8vIEZvciBBdWRpb1RyYWNrIG9ubHksIG5vdCB1c2VkIGJ5IEF1ZGlvUmVjb3JkLgotICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIG1Wb2x1bWVMUjsKKyAgICAgICAgICAgICAgICAvLyBTdGVyZW8gZ2FpbnMgZm9yIEF1ZGlvVHJhY2sgb25seSwgbm90IHVzZWQgYnkgQXVkaW9SZWNvcmQuCisgICAgICAgICAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgbVZvbHVtZUxSOwogCiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgbVNhbXBsZVJhdGU7ICAgIC8vIEF1ZGlvVHJhY2sgb25seTogY2xpZW50J3MgcmVxdWVzdGVkIHNhbXBsZSByYXRlIGluIEh6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIDAgPT0gZGVmYXVsdC4gV3JpdGUtb25seSBjbGllbnQsIHJlYWQtb25seSBzZXJ2ZXIuCkBAIC0xNzcsMTIgKzE3NSwxMSBAQAogCiAvLyBQcm94eSBzZWVuIGJ5IEF1ZGlvVHJhY2sgY2xpZW50IGFuZCBBdWRpb1JlY29yZCBjbGllbnQKIGNsYXNzIENsaWVudFByb3h5IDogcHVibGljIFByb3h5IHsKLXByb3RlY3RlZDoKK3B1YmxpYzoKICAgICBDbGllbnRQcm94eShhdWRpb190cmFja19jYmxrX3QqIGNibGssIHZvaWQgKmJ1ZmZlcnMsIHNpemVfdCBmcmFtZUNvdW50LCBzaXplX3QgZnJhbWVTaXplLAogICAgICAgICAgICAgYm9vbCBpc091dCwgYm9vbCBjbGllbnRJblNlcnZlcik7CiAgICAgdmlydHVhbCB+Q2xpZW50UHJveHkoKSB7IH0KIAotcHVibGljOgogICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGltZXNwZWMga0ZvcmV2ZXI7CiAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyBrTm9uQmxvY2tpbmc7CiAKQEAgLTI0NSw3ICsyNDIsMTEgQEAKICAgICB9CiAKICAgICB2b2lkICAgICAgICBzZXRNaW5pbXVtKHNpemVfdCBtaW5pbXVtKSB7Ci0gICAgICAgIG1DYmxrLT5tTWluaW11bSA9IG1pbmltdW07CisgICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIG9uIGEgNjQtYml0IGNsaWVudAorICAgICAgICBpZiAobWluaW11bSA+IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIG1pbmltdW0gPSBVSU5UMzJfTUFYOworICAgICAgICB9CisgICAgICAgIG1DYmxrLT5tTWluaW11bSA9ICh1aW50MzJfdCkgbWluaW11bTsKICAgICB9CiAKICAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCB3b3VsZCBuZWVkIHRvIGJlIG9idGFpbmVkIGFuZCByZWxlYXNlZApAQCAtMjgxLDggKzI4Miw4IEBACiAgICAgICAgIG1DYmxrLT5tU2VuZExldmVsID0gdWludDE2X3Qoc2VuZExldmVsICogMHgxMDAwKTsKICAgICB9CiAKLSAgICAvLyBjYWxsZXIgbXVzdCBsaW1pdCB0byAwIDw9IHZvbHVtZUxSIDw9IDB4MTAwMDEwMDAKLSAgICB2b2lkICAgICAgICBzZXRWb2x1bWVMUih1aW50MzJfdCB2b2x1bWVMUikgeworICAgIC8vIHNldCBzdGVyZW8gZ2FpbnMKKyAgICB2b2lkICAgICAgICBzZXRWb2x1bWVMUihnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2b2x1bWVMUikgewogICAgICAgICBtQ2Jsay0+bVZvbHVtZUxSID0gdm9sdW1lTFI7CiAgICAgfQogCkBAIC0zOTIsOCArMzkzLDEwIEBACiBjbGFzcyBBdWRpb1RyYWNrU2VydmVyUHJveHkgOiBwdWJsaWMgU2VydmVyUHJveHkgewogcHVibGljOgogICAgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eShhdWRpb190cmFja19jYmxrX3QqIGNibGssIHZvaWQgKmJ1ZmZlcnMsIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSwgYm9vbCBjbGllbnRJblNlcnZlciA9IGZhbHNlKQotICAgICAgICA6IFNlcnZlclByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIGZyYW1lU2l6ZSwgdHJ1ZSAvKmlzT3V0Ki8sIGNsaWVudEluU2VydmVyKSB7IH0KKyAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUsIGJvb2wgY2xpZW50SW5TZXJ2ZXIgPSBmYWxzZSwgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IDApCisgICAgICAgIDogU2VydmVyUHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgZnJhbWVTaXplLCB0cnVlIC8qaXNPdXQqLywgY2xpZW50SW5TZXJ2ZXIpIHsKKyAgICAgICAgbUNibGstPm1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICB9CiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9UcmFja1NlcnZlclByb3h5KCkgeyB9CiAKQEAgLTQwMSw3ICs0MDQsNyBAQAogICAgIC8vIHJldHVybiB2YWx1ZSBvZiB0aGVzZSBtZXRob2RzIG11c3QgYmUgdmFsaWRhdGVkIGJ5IHRoZSBjYWxsZXIKICAgICB1aW50MzJfdCAgICBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbUNibGstPm1TYW1wbGVSYXRlOyB9CiAgICAgdWludDE2X3QgICAgZ2V0U2VuZExldmVsX1U0XzEyKCkgY29uc3QgeyByZXR1cm4gbUNibGstPm1TZW5kTGV2ZWw7IH0KLSAgICB1aW50MzJfdCAgICBnZXRWb2x1bWVMUigpIGNvbnN0IHsgcmV0dXJuIG1DYmxrLT5tVm9sdW1lTFI7IH0KKyAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCBnZXRWb2x1bWVMUigpIGNvbnN0IHsgcmV0dXJuIG1DYmxrLT5tVm9sdW1lTFI7IH0KIAogICAgIC8vIGVzdGltYXRlZCB0b3RhbCBudW1iZXIgb2YgZmlsbGVkIGZyYW1lcyBhdmFpbGFibGUgdG8gc2VydmVyIHRvIHJlYWQsCiAgICAgLy8gd2hpY2ggbWF5IGluY2x1ZGUgbm9uLWNvbnRpZ3VvdXMgZnJhbWVzCkBAIC00NTYsOSArNDU5LDggQEAKIGNsYXNzIEF1ZGlvUmVjb3JkU2VydmVyUHJveHkgOiBwdWJsaWMgU2VydmVyUHJveHkgewogcHVibGljOgogICAgIEF1ZGlvUmVjb3JkU2VydmVyUHJveHkoYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrLCB2b2lkICpidWZmZXJzLCBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUpCi0gICAgICAgIDogU2VydmVyUHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgZnJhbWVTaXplLCBmYWxzZSAvKmlzT3V0Ki8sCi0gICAgICAgICAgICBmYWxzZSAvKmNsaWVudEluU2VydmVyKi8pIHsgfQorICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSwgYm9vbCBjbGllbnRJblNlcnZlcikKKyAgICAgICAgOiBTZXJ2ZXJQcm94eShjYmxrLCBidWZmZXJzLCBmcmFtZUNvdW50LCBmcmFtZVNpemUsIGZhbHNlIC8qaXNPdXQqLywgY2xpZW50SW5TZXJ2ZXIpIHsgfQogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF1ZGlvUmVjb3JkU2VydmVyUHJveHkoKSB7IH0KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvU3RhdGljQXVkaW9UcmFja1N0YXRlLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvU3RhdGljQXVkaW9UcmFja1N0YXRlLmgKaW5kZXggNDZhNTk0Ni4uZDQ4MzA2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1N0YXRpY0F1ZGlvVHJhY2tTdGF0ZS5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9TdGF0aWNBdWRpb1RyYWNrU3RhdGUuaApAQCAtMjUsOSArMjUsMTMgQEAKIC8vIHN0YXRlIGlzIHdyYXBwZWQgYnkgYSBTaW5nbGVTdGF0ZVF1ZXVlLgogc3RydWN0IFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSB7CiAgICAgLy8gZG8gbm90IGRlZmluZSBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBvciB2aXJ0dWFsIG1ldGhvZHMKLSAgICBzaXplX3QgIG1Mb29wU3RhcnQ7Ci0gICAgc2l6ZV90ICBtTG9vcEVuZDsKLSAgICBpbnQgICAgIG1Mb29wQ291bnQ7CisKKyAgICAvLyBUaGVzZSBmaWVsZHMgc2hvdWxkIGJvdGggYmUgc2l6ZV90LCBidXQgc2luY2UgdGhleSBhcmUgbG9jYXRlZCBpbiBzaGFyZWQgbWVtb3J5IHdlCisgICAgLy8gZm9yY2UgdG8gMzItYml0LiAgVGhlIGNsaWVudCBhbmQgc2VydmVyIG1heSBoYXZlIGRpZmZlcmVudCB0eXBlZGVmcyBmb3Igc2l6ZV90LgorICAgIHVpbnQzMl90ICAgIG1Mb29wU3RhcnQ7CisgICAgdWludDMyX3QgICAgbUxvb3BFbmQ7CisKKyAgICBpbnQgICAgICAgICBtTG9vcENvdW50OwogfTsKIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaAppbmRleCBhMjExZWQ5Li41MTkzZDAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKQEAgLTI1LDY0ICsyNSw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gQSBzaW1wbGUgYnVmZmVyIHRvIGhvbGQgYmluYXJ5IGRhdGEKLWNsYXNzIE1lZGlhQWxidW1BcnQKLXsKLXB1YmxpYzoKLSAgICBNZWRpYUFsYnVtQXJ0KCk6IG1TaXplKDApLCBtRGF0YSgwKSB7fQotCi0gICAgZXhwbGljaXQgTWVkaWFBbGJ1bUFydChjb25zdCBjaGFyKiB1cmwpIHsKLSAgICAgICAgbVNpemUgPSAwOwotICAgICAgICBtRGF0YSA9IE5VTEw7Ci0gICAgICAgIEZJTEUgKmluID0gZm9wZW4odXJsLCAiciIpOwotICAgICAgICBpZiAoIWluKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZnNlZWsoaW4sIDAsIFNFRUtfRU5EKTsKLSAgICAgICAgbVNpemUgPSBmdGVsbChpbik7ICAvLyBBbGxvY2F0aW5nIGJ1ZmZlciBvZiBzaXplIGVxdWFscyB0byB0aGUgZXh0ZXJuYWwgZmlsZSBzaXplLgotICAgICAgICBpZiAobVNpemUgPT0gMCB8fCAobURhdGEgPSBuZXcgdWludDhfdFttU2l6ZV0pID09IE5VTEwpIHsKLSAgICAgICAgICAgIGZjbG9zZShpbik7Ci0gICAgICAgICAgICBpZiAobVNpemUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1TaXplID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICByZXdpbmQoaW4pOwotICAgICAgICBpZiAoZnJlYWQobURhdGEsIDEsIG1TaXplLCBpbikgIT0gbVNpemUpIHsgIC8vIFJlYWQgZmFpbGVkLgotICAgICAgICAgICAgZGVsZXRlW10gbURhdGE7Ci0gICAgICAgICAgICBtRGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmNsb3NlKGluKTsKLSAgICB9Ci0KLSAgICBNZWRpYUFsYnVtQXJ0KGNvbnN0IE1lZGlhQWxidW1BcnQmIGNvcHkpIHsKLSAgICAgICAgbVNpemUgPSBjb3B5Lm1TaXplOwotICAgICAgICBtRGF0YSA9IE5VTEw7ICAvLyBpbml0aWFsaXplIGl0IGZpcnN0Ci0gICAgICAgIGlmIChtU2l6ZSA+IDAgJiYgY29weS5tRGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgICAgIG1EYXRhID0gbmV3IHVpbnQ4X3RbY29weS5tU2l6ZV07Ci0gICAgICAgICAgIGlmIChtRGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICBtZW1jcHkobURhdGEsIGNvcHkubURhdGEsIG1TaXplKTsKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIG1TaXplID0gMDsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgfk1lZGlhQWxidW1BcnQoKSB7Ci0gICAgICAgIGlmIChtRGF0YSAhPSAwKSB7Ci0gICAgICAgICAgICBkZWxldGVbXSBtRGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEludGVudGlvbmFsIHB1YmxpYyBhY2Nlc3MgbW9kaWZpZXI6Ci0gICAgLy8gV2UgaGF2ZSB0byBrbm93IHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8gc2hhcmUgaXQgYmV0d2VlbgotICAgIC8vIHByb2Nlc3Nlcz8KLSAgICB1aW50MzJfdCBtU2l6ZTsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gbURhdGEKLSAgICB1aW50OF90KiBtRGF0YTsgICAgICAgICAgICAvLyBBY3R1YWwgYmluYXJ5IGRhdGEKLX07Ci0KIC8vIFJlcHJlc2VudHMgYSBjb2xvciBjb252ZXJ0ZWQgKFJHQi1iYXNlZCkgdmlkZW8gZnJhbWUKIC8vIHdpdGggYml0bWFwIHBpeGVscyBzdG9yZWQgaW4gRnJhbWVCdWZmZXIKIGNsYXNzIFZpZGVvRnJhbWUKQEAgLTEyMSw4ICs2MywxMSBAQAogICAgIHVpbnQzMl90IG1EaXNwbGF5V2lkdGg7CiAgICAgdWludDMyX3QgbURpc3BsYXlIZWlnaHQ7CiAgICAgdWludDMyX3QgbVNpemU7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1EYXRhCisgICAgaW50MzJfdCAgbVJvdGF0aW9uQW5nbGU7ICAgLy8gcm90YXRpb24gYW5nbGUsIGNsb2Nrd2lzZSwgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDkwCisgICAgLy8gbURhdGEgc2hvdWxkIGJlIDY0IGJpdCBhbGlnbmVkIHRvIHByZXZlbnQgYWRkaXRpb25hbCBwYWRkaW5nCiAgICAgdWludDhfdCogbURhdGE7ICAgICAgICAgICAgLy8gQWN0dWFsIGJpbmFyeSBkYXRhCi0gICAgaW50MzJfdCAgbVJvdGF0aW9uQW5nbGU7ICAgLy8gcm90YXRpb24gYW5nbGUsIGNsb2Nrd2lzZQorICAgIC8vIHBhZCBzdHJ1Y3R1cmUgc28gaXQncyB0aGUgc2FtZSBzaXplIG9uIDY0IGJpdCBhbmQgMzIgYml0CisgICAgY2hhciAgICAgbVBhZGRpbmdbOCAtIHNpemVvZihtRGF0YSldOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQ4ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElTb3VuZFRyaWdnZXIgOiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoU291bmRUcmlnZ2VyKTsKKworICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxvYWRTb3VuZE1vZGVsKGNvbnN0IHNwPElNZW1vcnk+JiBtb2RlbE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5Tb3VuZFRyaWdnZXI6IHB1YmxpYyBCbkludGVyZmFjZTxJU291bmRUcmlnZ2VyPgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9JU09VTkRUUklHR0VSX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODA0MjlhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9DTElFTlRfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfQ0xJRU5UX0gKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJU291bmRUcmlnZ2VyQ2xpZW50IDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKworICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoU291bmRUcmlnZ2VyQ2xpZW50KTsKKworICAgIHZpcnR1YWwgdm9pZCBvblJlY29nbml0aW9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Tb3VuZE1vZGVsRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2UoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KSA9IDA7CisKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5Tb3VuZFRyaWdnZXJDbGllbnQgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVNvdW5kVHJpZ2dlckNsaWVudD4KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9DTElFTlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMGNiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9JU09VTkRUUklHR0VSX1NFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfU0VSVklDRV9ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJU291bmRUcmlnZ2VyOworY2xhc3MgSVNvdW5kVHJpZ2dlckNsaWVudDsKKworY2xhc3MgSVNvdW5kVHJpZ2dlckh3U2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlckh3U2VydmljZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4mIG1vZHVsZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpID0gMDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5Tb3VuZFRyaWdnZXJId1NlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9JU09VTkRUUklHR0VSX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjVlMWRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9ICisKKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lbW9yeURlYWxlcjsKKworY2xhc3MgU291bmRUcmlnZ2VyIDogcHVibGljIEJuU291bmRUcmlnZ2VyQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Cit7CitwdWJsaWM6CisKKyAgICB2aXJ0dWFsIH5Tb3VuZFRyaWdnZXIoKTsKKworICAgIHN0YXRpYyAgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcyk7CisgICAgc3RhdGljICBzcDxTb3VuZFRyaWdnZXI+IGF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKworICAgIHN0YXRpYyAgc3RhdHVzX3Qgc2V0Q2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKTsKKworICAgICAgICAgICAgdm9pZCBkZXRhY2goKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgbG9hZFNvdW5kTW9kZWwoY29uc3Qgc3A8SU1lbW9yeT4mIG1vZGVsTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgdW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgICAgICBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAgICAgICAgIC8vIEJwU291bmRUcmlnZ2VyQ2xpZW50CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSk7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25Tb3VuZE1vZGVsRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VTdGF0ZUNoYW5nZShjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpOworCisgICAgICAgICAgICAvL0lCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKKworICAgICAgICAgICAgc3RhdGljIHN0YXR1c190IHN0cmluZ1RvR3VpZChjb25zdCBjaGFyICpzdHIsIHNvdW5kX3RyaWdnZXJfdXVpZF90ICpndWlkKTsKKyAgICAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBndWlkVG9TdHJpbmcoY29uc3Qgc291bmRfdHJpZ2dlcl91dWlkX3QgKmd1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbik7CisKK3ByaXZhdGU6CisgICAgICAgICAgICBTb3VuZFRyaWdnZXIoc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdW5kVHJpZ2dlckNhbGxiYWNrPiYpOworICAgICAgICAgICAgc3RhdGljIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+JiBnZXRTb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKKworICAgICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiAgICAgICAgICAgICAgICAgICBtSVNvdW5kVHJpZ2dlcjsKKyAgICAgICAgICAgIGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IG1Nb2R1bGU7CisgICAgICAgICAgICBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4gICAgICAgICAgICBtQ2FsbGJhY2s7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJDYWxsYmFjay5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyQ2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTI3N2YyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyQ2FsbGJhY2suaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9DQUxMQkFDS19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0NBTExCQUNLX0gKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFNvdW5kVHJpZ2dlckNhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYzoKKworICAgICAgICAgICAgU291bmRUcmlnZ2VyQ2FsbGJhY2soKSB7fQorICAgIHZpcnR1YWwgflNvdW5kVHJpZ2dlckNhbGxiYWNrKCkge30KKworICAgIHZpcnR1YWwgdm9pZCBvblJlY29nbml0aW9uRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Tb3VuZE1vZGVsRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2Uoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VEaWVkKCkgPSAwOworCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9DQUxMQkFDS19ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci9sdnBwL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyODY4MjcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYnZpZGVvZWRpdG9ycGxheWVyCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcnBsYXllcgotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgVmlkZW9FZGl0b3JUb29scy5jcHAgXAotICAgIFZpZGVvRWRpdG9yUGxheWVyLmNwcCBcCi0gICAgUHJldmlld1BsYXllci5jcHAgXAotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JTUkMuY3BwIFwKLSAgICBEdW1teUF1ZGlvU291cmNlLmNwcCBcCi0gICAgRHVtbXlWaWRlb1NvdXJjZS5jcHAgXAotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwIFwKLSAgICBQcmV2aWV3UmVuZGVyZXIuY3BwIFwKLSAgICBJNDIwQ29sb3JDb252ZXJ0ZXIuY3BwIFwKLSAgICBOYXRpdmVXaW5kb3dSZW5kZXJlci5jcHAKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbgotCi0KLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgXAotICAgIGxpYmF1ZGlvZmxpbmdlciAgICAgICAgICAgXAotICAgIGxpYmF1ZGlvdXRpbHMgICAgICAgICAgICAgXAotICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgICAgXAotICAgIGxpYmN1dGlscyAgICAgICAgICAgICAgICAgXAotICAgIGxpYmxvZyAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYkVHTCAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYkdMRVN2MiAgICAgICAgICAgICAgICAgXAotICAgIGxpYmd1aSAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmRybWZyYW1ld29yayAgICAgICAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0ICAgICAgICAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgIGxpYnN0YWdlZnJpZ2h0X29teCAgICAgICAgXAotICAgIGxpYnN5bmMgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnVpICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnV0aWxzICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgICAgICAgXAotCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9zeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGNvcmVjZyBncmFwaGljcykgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL2x2cHAgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvZWRpdG9yIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvc2VydmljZXMvYXVkaW9mbGluZ2VyCi0KLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgIC1ETTRfRU5BQkxFX1JFTkRFUklOR01PREUgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0NPREVDUyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQVVESU9ERUMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1ZJREVPREVDIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9BVURJT0VOQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfVklERU9FTkMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1JFQURFUlMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUXzNHUFBfUkVBREVSCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotI2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYmNhYjY4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkR1bW15QXVkaW9Tb3VyY2UiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgIkR1bW15QXVkaW9Tb3VyY2UuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vc3RhdGljCi1zcDxEdW1teUF1ZGlvU291cmNlPiBEdW1teUF1ZGlvU291cmNlOjpDcmVhdGUoCi0gICAgICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgaW50NjRfdCBmcmFtZUR1cmF0aW9uVXMsIGludDY0X3QgYXVkaW9EdXJhdGlvblVzKSB7Ci0KLSAgICBBTE9HVigiQ3JlYXRlICIpOwotICAgIHJldHVybiBuZXcgRHVtbXlBdWRpb1NvdXJjZShzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEdXJhdGlvblVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0R1cmF0aW9uVXMpOwotCi19Ci0KLUR1bW15QXVkaW9Tb3VyY2U6OkR1bW15QXVkaW9Tb3VyY2UoCi0gICAgICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgaW50NjRfdCBmcmFtZUR1cmF0aW9uVXMsIGludDY0X3QgYXVkaW9EdXJhdGlvblVzKQotICAgIDogbVNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUpLAotICAgICAgbUNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpLAotICAgICAgbUZyYW1lRHVyYXRpb25VcyhmcmFtZUR1cmF0aW9uVXMpLAotICAgICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUoMCksCi0gICAgICBtQXVkaW9EdXJhdGlvblVzKGF1ZGlvRHVyYXRpb25VcyksCi0gICAgICBtVGltZVN0YW1wVXMoMCksCi0gICAgICBtQnVmZmVyR3JvdXAoTlVMTCkgewotCi0gICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPSAoaW50MzJfdCkKLSAgICAgICAgICAgICgoMUwgKiBtU2FtcGxpbmdSYXRlICogbUZyYW1lRHVyYXRpb25VcykvMTAwMDAwMCk7Ci0gICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPSBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSAgKiBtQ2hhbm5lbENvdW50OwotCi0gICAgQUxPR1YoIkNvbnN0cnVjdG9yOiBFIik7Ci0gICAgQUxPR1YoInNhbXBsaW5nUmF0ZSA9ICVkIiwgc2FtcGxpbmdSYXRlKTsKLSAgICBBTE9HVigiY2hhbm5lbENvdW50ID0gJWQiLCBjaGFubmVsQ291bnQpOwotICAgIEFMT0dWKCJmcmFtZUR1cmF0aW9uVXMgPSAlbGxkIiwgZnJhbWVEdXJhdGlvblVzKTsKLSAgICBBTE9HVigiYXVkaW9EdXJhdGlvblVzID0gJWxsZCIsIGF1ZGlvRHVyYXRpb25Vcyk7Ci0gICAgQUxPR1YoIm1OdW1iZXJPZlNhbXBsZVBlckZyYW1lID0gJWQiLCBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSk7Ci0gICAgQUxPR1YoIkNvbnN0cnVjdG9yOiBYIik7Ci19Ci0KLUR1bW15QXVkaW9Tb3VyY2U6On5EdW1teUF1ZGlvU291cmNlKCkgewotICAgIC8qIERvIG5vdGhpbmcgaGVyZT8gKi8KLSAgICBBTE9HVigifkR1bW15QXVkaW9Tb3VyY2UiKTsKLX0KLQotdm9pZCBEdW1teUF1ZGlvU291cmNlOjpzZXREdXJhdGlvbihpbnQ2NF90IGF1ZGlvRHVyYXRpb25VcykgewotICAgIEFMT0dWKCJzZXREdXJhdGlvbjogJWxsZCB1cyBhZGRlZCB0byAlbGxkIHVzIiwKLSAgICAgICAgYXVkaW9EdXJhdGlvblVzLCBtQXVkaW9EdXJhdGlvblVzKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbUF1ZGlvRHVyYXRpb25VcyArPSBhdWRpb0R1cmF0aW9uVXM7Ci19Ci0KLXN0YXR1c190IER1bW15QXVkaW9Tb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBBTE9HVigic3RhcnQ6IEUiKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIG1UaW1lU3RhbXBVcyA9IDA7Ci0KLSAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIoCi0gICAgICAgICAgICBuZXcgTWVkaWFCdWZmZXIobU51bWJlck9mU2FtcGxlUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCkpKTsKLQotICAgIEFMT0dWKCJzdGFydDogWCIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgRHVtbXlBdWRpb1NvdXJjZTo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotCi0gICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAgPSBOVUxMOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXNwPE1ldGFEYXRhPiBEdW1teUF1ZGlvU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgQUxPR1YoImdldEZvcm1hdCIpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUNoYW5uZWxDb3VudCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1TYW1wbGluZ1JhdGUpOwotICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgbUZyYW1lRHVyYXRpb25Vcyk7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkR1bW15QXVkaW9Tb3VyY2UiKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi1zdGF0dXNfdCBEdW1teUF1ZGlvU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0KLSAgICBBTE9HVigicmVhZDogRSIpOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotCi0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA+PSAwKTsKLSAgICAgICAgbVRpbWVTdGFtcFVzID0gc2Vla1RpbWVVczsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtVGltZVN0YW1wVXMgPj0gbUF1ZGlvRHVyYXRpb25VcykgewotICAgICAgICAgICAgQUxPR0koInJlYWQ6IEVPUyByZWFjaGVkICVsbGQgPiAlbGxkIiwKLSAgICAgICAgICAgICAgICBtVGltZVN0YW1wVXMsIG1BdWRpb0R1cmF0aW9uVXMpOwotCi0gICAgICAgICAgICAqb3V0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhY3F1aXJlIGJ1ZmZlciBmcm9tIG1CdWZmZXJHcm91cDogJWQiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1lbXNldCgodWludDhfdCAqKSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAwLCBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSA8PCAxKTsKLSAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpLCAobU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPDwgMSkpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtVGltZVN0YW1wVXMpOwotCi0gICAgQUxPR1YoInJlYWQ6IG9mZnNldCAgPSAlZCwgc2l6ZSA9ICVkLCBtVGltZVN0YW1wVXMgPSAlbGxkIiwKLSAgICAgICAgICAgICBidWZmZXItPnJhbmdlX29mZnNldCgpLCBidWZmZXItPnNpemUoKSwgbVRpbWVTdGFtcFVzKTsKLQotICAgIG1UaW1lU3RhbXBVcyA9IG1UaW1lU3RhbXBVcyArIG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgKm91dCA9IGJ1ZmZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfS8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZjI1YThjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgRFVNTVlfQVVESU9TT1VSQ0VfSF8KLSNkZWZpbmUgRFVNTVlfQVVESU9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZXRhRGF0YTsKLXN0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOwotCi1zdHJ1Y3QgRHVtbXlBdWRpb1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0KLXB1YmxpYzoKLSAgICBzdGF0aWMgc3A8RHVtbXlBdWRpb1NvdXJjZT4gQ3JlYXRlKAotICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lRHVyYXRpb25VcywgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLSAgICB2b2lkIHNldER1cmF0aW9uKGludDY0X3QgYXVkaW9EdXJhdGlvblVzKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkR1bW15QXVkaW9Tb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBpbnQzMl90IG1TYW1wbGluZ1JhdGU7Ci0gICAgaW50MzJfdCBtQ2hhbm5lbENvdW50OwotICAgIGludDY0X3QgbUZyYW1lRHVyYXRpb25VczsKLSAgICBpbnQzMl90IG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lOwotICAgIGludDY0X3QgbUF1ZGlvRHVyYXRpb25VczsKLSAgICBpbnQ2NF90IG1UaW1lU3RhbXBVczsKLSAgICBNdXRleCBtTG9jazsKLQotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsKLQotICAgIER1bW15QXVkaW9Tb3VyY2UoCi0gICAgICAgICAgICBpbnQzMl90IHNhbXBsaW5nUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICBpbnQ2NF90IGZyYW1lRHVyYXRpb25VcywgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXMpOwotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZQotICAgIER1bW15QXVkaW9Tb3VyY2UoY29uc3QgRHVtbXlBdWRpb1NvdXJjZSAmKTsKLSAgICBEdW1teUF1ZGlvU291cmNlICZvcGVyYXRvcj0oY29uc3QgRHVtbXlBdWRpb1NvdXJjZSAmKTsKLQotfTsKLQotfS8vbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0jZW5kaWYgLy9EVU1NWV9BVURJT1NPVVJDRV9IXwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjA2ZjkzNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkR1bW15VmlkZW9Tb3VyY2UiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotI2luY2x1ZGUgIkR1bW15VmlkZW9Tb3VyY2UuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXNwPER1bW15VmlkZW9Tb3VyY2U+IER1bW15VmlkZW9Tb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgdWludDY0X3QgY2xpcER1cmF0aW9uLCBjb25zdCBjaGFyICppbWFnZVVyaSkgewotCi0gICAgQUxPR1YoIkNyZWF0ZSIpOwotICAgIHJldHVybiBuZXcgRHVtbXlWaWRlb1NvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xpcER1cmF0aW9uLCBpbWFnZVVyaSk7Ci0KLX0KLQotCi1EdW1teVZpZGVvU291cmNlOjpEdW1teVZpZGVvU291cmNlKAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICB1aW50NjRfdCBjbGlwRHVyYXRpb24sIGNvbnN0IGNoYXIgKmltYWdlVXJpKSB7Ci0KLSAgICBBTE9HVigiQ29uc3RydWN0b3I6IEUiKTsKLQotICAgIG1GcmFtZVdpZHRoID0gd2lkdGg7Ci0gICAgbUZyYW1lSGVpZ2h0ID0gaGVpZ2h0OwotICAgIG1JbWFnZUNsaXBEdXJhdGlvbiA9IGNsaXBEdXJhdGlvbjsKLSAgICBtVXJpID0gaW1hZ2VVcmk7Ci0gICAgbUltYWdlQnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCIlcyIsIG1VcmkpOwotICAgIEFMT0dWKCJDb25zdHJ1Y3RvcjogWCIpOwotfQotCi0KLUR1bW15VmlkZW9Tb3VyY2U6On5EdW1teVZpZGVvU291cmNlKCkgewotICAgIC8qIERvIG5vdGhpbmcgaGVyZT8gKi8KLSAgICBBTE9HVigifkR1bW15VmlkZW9Tb3VyY2UiKTsKLX0KLQotCi0KLXN0YXR1c190IER1bW15VmlkZW9Tb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBBTE9HVigic3RhcnQ6IEUiKTsKLQotICAgIC8vIEdldCB0aGUgZnJhbWUgYnVmZmVyIGZyb20gdGhlIHJnYiBmaWxlLCBtVXJpLAotICAgIC8vIGFuZCBzdG9yZSBpdHMgY29udGVudCBpbnRvIGEgTWVkaWFCdWZmZXIKLSAgICBzdGF0dXNfdCBlcnIgPSBMdkdldEltYWdlVGh1bWJOYWlsKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW1VcmksCi0gICAgICAgICAgICAgICAgICAgIG1GcmFtZUhlaWdodCwgbUZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICoqKSAmbUltYWdlQnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJMdkdldEltYWdlVGh1bWJOYWlsIGZhaWxlZDogJWQiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1Jc0ZpcnN0SW1hZ2VGcmFtZSA9IHRydWU7Ci0gICAgbUltYWdlU2Vla1RpbWUgPSAwOwotICAgIG1JbWFnZVBsYXlTdGFydFRpbWUgPSAwOwotICAgIG1GcmFtZVRpbWVVcyA9IDA7Ci0KLSAgICBBTE9HVigic3RhcnQ6IFgiKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgRHVtbXlWaWRlb1NvdXJjZTo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgaWYgKG1JbWFnZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUltYWdlQnVmZmVyKTsKLSAgICAgICAgbUltYWdlQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLXNwPE1ldGFEYXRhPiBEdW1teVZpZGVvU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgQUxPR1YoImdldEZvcm1hdCIpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIG1GcmFtZVdpZHRoKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtRnJhbWVIZWlnaHQpOwotICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgbUltYWdlQ2xpcER1cmF0aW9uKTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiRHVtbXlWaWRlb1NvdXJjZSIpOwotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLXN0YXR1c190IER1bW15VmlkZW9Tb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LAotICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLQotICAgIEFMT0dWKCJyZWFkOiBFIik7Ci0KLSAgICBjb25zdCBpbnQzMl90IGtUaW1lU2NhbGUgPSAxMDAwOyAgLyogdGltZSBzY2FsZSBpbiBtcyAqLwotICAgIGJvb2wgc2Vla2luZyA9IGZhbHNlOwotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7Ci0gICAgICAgIHNlZWtpbmcgPSB0cnVlOwotICAgICAgICBtSW1hZ2VTZWVrVGltZSA9IHNlZWtUaW1lVXM7Ci0gICAgICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmbUltYWdlUGxheVN0YXJ0VGltZSwga1RpbWVTY2FsZSk7Ci0gICAgfQotCi0gICAgaWYgKChtSW1hZ2VTZWVrVGltZSA9PSBtSW1hZ2VDbGlwRHVyYXRpb24pIHx8Ci0gICAgICAgIChtRnJhbWVUaW1lVXMgPT0gKGludDY0X3QpbUltYWdlQ2xpcER1cmF0aW9uKSkgewotICAgICAgICBBTE9HVigicmVhZDogRU9TIHJlYWNoZWQiKTsKLSAgICAgICAgKm91dCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoCi0gICAgICAgICAgICBtSW1hZ2VCdWZmZXIsIChtRnJhbWVXaWR0aCAqIG1GcmFtZUhlaWdodCAqIDEuNSkpOwotCi0gICAgLy8gU2V0IHRpbWVzdGFtcCBvZiBidWZmZXIKLSAgICBpZiAobUlzRmlyc3RJbWFnZUZyYW1lKSB7Ci0gICAgICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmbUltYWdlUGxheVN0YXJ0VGltZSwga1RpbWVTY2FsZSk7Ci0gICAgICAgIG1GcmFtZVRpbWVVcyA9ICAobUltYWdlU2Vla1RpbWUgKyAxKTsKLSAgICAgICAgQUxPR1YoInJlYWQ6IGpwZyAxc3QgZnJhbWUgdGltZVVzID0gJWxsZCwgYmVnaW4gY3V0IHRpbWUgPSAlbGQiLAotICAgICAgICAgICAgbUZyYW1lVGltZVVzLCBtSW1hZ2VTZWVrVGltZSk7Ci0KLSAgICAgICAgbUlzRmlyc3RJbWFnZUZyYW1lID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTTRPU0FfVGltZSAgY3VycmVudFRpbWVNczsKLSAgICAgICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZjdXJyZW50VGltZU1zLCBrVGltZVNjYWxlKTsKLQotICAgICAgICBtRnJhbWVUaW1lVXMgPSBtSW1hZ2VTZWVrVGltZSArCi0gICAgICAgICAgICAoY3VycmVudFRpbWVNcyAtIG1JbWFnZVBsYXlTdGFydFRpbWUpICogMTAwMExMOwotCi0gICAgICAgIEFMT0dWKCJyZWFkOiBqcGcgZnJhbWUgdGltZVVzID0gJWxsZCIsIG1GcmFtZVRpbWVVcyk7Ci0gICAgfQotCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIG1GcmFtZVRpbWVVcyk7Ci0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICBtRnJhbWVXaWR0aCAqIG1GcmFtZUhlaWdodCAqIDEuNSk7Ci0KLSAgICAqb3V0ID0gYnVmZmVyOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLX0vLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTY1MTRmMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERVTU1ZX1ZJREVPU09VUkNFX0hfCi0jZGVmaW5lIERVTU1ZX1ZJREVPU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgIk00T1NBX0Nsb2NrLmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgIE1lZGlhQnVmZmVyOwotY2xhc3MgIE1ldGFEYXRhOwotCi1zdHJ1Y3QgRHVtbXlWaWRlb1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0KLXB1YmxpYzoKLSAgICBzdGF0aWMgc3A8RHVtbXlWaWRlb1NvdXJjZT4gQ3JlYXRlKAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgdWludDY0X3QgY2xpcER1cmF0aW9uLCBjb25zdCBjaGFyICppbWFnZVVyaSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkR1bW15VmlkZW9Tb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICB1aW50MzJfdCBtRnJhbWVXaWR0aDsKLSAgICB1aW50MzJfdCBtRnJhbWVIZWlnaHQ7Ci0gICAgdWludDY0X3QgbUltYWdlQ2xpcER1cmF0aW9uOwotICAgIGNvbnN0IGNoYXIgKm1Vcmk7Ci0gICAgaW50NjRfdCBtRnJhbWVUaW1lVXM7Ci0gICAgYm9vbCBtSXNGaXJzdEltYWdlRnJhbWU7Ci0gICAgdm9pZCAqbUltYWdlQnVmZmVyOwotICAgIE00T1NBX1RpbWUgbUltYWdlUGxheVN0YXJ0VGltZTsKLSAgICB1aW50MzJfdCBtSW1hZ2VTZWVrVGltZTsKLQotICAgIER1bW15VmlkZW9Tb3VyY2UoCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgdWludDY0X3QgY2xpcER1cmF0aW9uLCBjb25zdCBjaGFyICppbWFnZVVyaSk7Ci0KLSAgICAvLyBEb24ndCBjYWxsIG1lCi0gICAgRHVtbXlWaWRlb1NvdXJjZShjb25zdCBEdW1teVZpZGVvU291cmNlICYpOwotICAgIER1bW15VmlkZW9Tb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEdW1teVZpZGVvU291cmNlICYpOwotCi19OwotCi0KLX0vL25hbWVzcGFjZSBhbmRyb2lkCi0KLQotI2VuZGlmIC8vRFVNTVlfVklERU9TT1VSQ0VfSF8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjFkM2ZlLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8STQyMENvbG9yQ29udmVydGVyLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLUk0MjBDb2xvckNvbnZlcnRlcjo6STQyMENvbG9yQ29udmVydGVyKCkgewotICAgIC8vIE9wZW4gdGhlIHNoYXJlZCBsaWJyYXJ5Ci0gICAgbUhhbmRsZSA9IGRsb3BlbigibGliSTQyMGNvbG9yY29udmVydC5zbyIsIFJUTERfTk9XKTsKLQotICAgIGlmIChtSGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIkk0MjBDb2xvckNvbnZlcnRlcjogY2Fubm90IGxvYWQgbGliSTQyMGNvbG9yY29udmVydC5zbyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRmluZCB0aGUgZW50cnkgcG9pbnQKLSAgICB2b2lkICgqZ2V0STQyMENvbG9yQ29udmVydGVyKShJNDIwQ29sb3JDb252ZXJ0ZXIgKmNvbnZlcnRlcikgPQotICAgICAgICAodm9pZCAoKikoSTQyMENvbG9yQ29udmVydGVyKikpIGRsc3ltKG1IYW5kbGUsICJnZXRJNDIwQ29sb3JDb252ZXJ0ZXIiKTsKLQotICAgIGlmIChnZXRJNDIwQ29sb3JDb252ZXJ0ZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiSTQyMENvbG9yQ29udmVydGVyOiBjYW5ub3QgbG9hZCBnZXRJNDIwQ29sb3JDb252ZXJ0ZXIiKTsKLSAgICAgICAgZGxjbG9zZShtSGFuZGxlKTsKLSAgICAgICAgbUhhbmRsZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBGaWxsIHRoZSBmdW5jdGlvbiBwb2ludGVycy4KLSAgICBnZXRJNDIwQ29sb3JDb252ZXJ0ZXIodGhpcyk7Ci0KLSAgICBBTE9HSSgiSTQyMENvbG9yQ29udmVydGVyOiBsaWJJNDIwY29sb3Jjb252ZXJ0LnNvIGxvYWRlZCIpOwotfQotCi1ib29sIEk0MjBDb2xvckNvbnZlcnRlcjo6aXNMb2FkZWQoKSB7Ci0gICAgcmV0dXJuIG1IYW5kbGUgIT0gTlVMTDsKLX0KLQotSTQyMENvbG9yQ29udmVydGVyOjp+STQyMENvbG9yQ29udmVydGVyKCkgewotICAgIGlmIChtSGFuZGxlKSB7Ci0gICAgICAgIGRsY2xvc2UobUhhbmRsZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkNDhlNDQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEk0MjBfQ09MT1JfQ09OVkVSVEVSX0gKLSNkZWZpbmUgSTQyMF9DT0xPUl9DT05WRVJURVJfSAotCi0jaW5jbHVkZSA8SUk0MjBDb2xvckNvbnZlcnRlci5oPgotCi0vLyBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIEk0MjAgY29sb3IgY29udmVydGVyIGZ1bmN0aW9ucyBpbgotLy8gSUk0MjBDb2xvckNvbnZlcnRlciwgd2hpY2ggaXMgbG9hZGVkIGZyb20gYSBzaGFyZWQgbGlicmFyeS4KLWNsYXNzIEk0MjBDb2xvckNvbnZlcnRlcjogcHVibGljIElJNDIwQ29sb3JDb252ZXJ0ZXIgewotcHVibGljOgotICAgIEk0MjBDb2xvckNvbnZlcnRlcigpOwotICAgIH5JNDIwQ29sb3JDb252ZXJ0ZXIoKTsKLQotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udmVydGVyIGZ1bmN0aW9ucyBhcmUgc3VjY2Vzc2Z1bGx5IGxvYWRlZC4KLSAgICBib29sIGlzTG9hZGVkKCk7Ci1wcml2YXRlOgotICAgIHZvaWQqIG1IYW5kbGU7Ci19OwotCi0jZW5kaWYgLyogSTQyMF9DT0xPUl9DT05WRVJURVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL05hdGl2ZVdpbmRvd1JlbmRlcmVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YjM2MmVmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk5hdGl2ZVdpbmRvd1JlbmRlcmVyIgotI2luY2x1ZGUgIk5hdGl2ZVdpbmRvd1JlbmRlcmVyLmgiCi0KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Z3VpL0dMQ29uc3VtZXIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVG9vbHMuaCIKLQotI2RlZmluZSBDSEVDS19FR0xfRVJST1IgQ0hFQ0soRUdMX1NVQ0NFU1MgPT0gZWdsR2V0RXJyb3IoKSkKLSNkZWZpbmUgQ0hFQ0tfR0xfRVJST1IgQ0hFQ0soR0xlbnVtKEdMX05PX0VSUk9SKSA9PSBnbEdldEVycm9yKCkpCi0KLS8vCi0vLyBWZXJ0ZXggYW5kIGZyYWdtZW50IHByb2dyYW1zCi0vLwotCi0vLyBUaGUgbWF0cml4IGlzIGRlcml2ZWQgZnJvbQotLy8gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKLS8vCi0vLyBSICogMjU1ID0gMS4xNjQgKiAoWSAtIDE2KSArIDEuNTk2ICogKFYgLSAxMjgpCi0vLyBHICogMjU1ID0gMS4xNjQgKiAoWSAtIDE2KSAtIDAuODEzICogKFYgLSAxMjgpIC0gMC4zOTEgKiAoVSAtIDEyOCkKLS8vIEIgKiAyNTUgPSAxLjE2NCAqIChZIC0gMTYpICsgMi4wMTggKiAoVSAtIDEyOCkKLS8vCi0vLyBIZXJlIHdlIGFzc3VtZSBZVVYgYXJlIGluIHRoZSByYW5nZSBvZiBbMCwyNTVdLCBSR0IgYXJlIGluIHRoZSByYW5nZSBvZgotLy8gWzAsIDFdCi0jZGVmaW5lIFJHQjJZVVZfTUFUUklYIFwKLSJjb25zdCBtYXQ0IHJnYjJ5dXYgPSBtYXQ0KCJcCi0iICAgIDY1LjUyMjU1LCAgIC0zNy43OTM5OCwgICAxMTEuOTg3MzIsICAgICAwLjAwMDAwLCJcCi0iICAgMTI4LjYyNzI5LCAgIC03NC4xOTMzNCwgICAtOTMuODEwODgsICAgICAwLjAwMDAwLCJcCi0iICAgIDI0LjkyMjMzLCAgIDExMS45ODczMiwgICAtMTguMTc2NDQsICAgICAwLjAwMDAwLCJcCi0iICAgIDE2LjAwMDAwLCAgIDEyOC4wMDAwMCwgICAxMjguMDAwMDAsICAgICAxLjAwMDAwKTtcbiIKLQotI2RlZmluZSBZVVYyUkdCX01BVFJJWCBcCi0iY29uc3QgbWF0NCB5dXYycmdiID0gbWF0NCgiXAotIiAgIDAuMDA0NTYsICAgMC4wMDQ1NiwgICAwLjAwNDU2LCAgIDAuMDAwMDAsIlwKLSIgICAwLjAwMDAwLCAgLTAuMDAxNTMsICAgMC4wMDc5MSwgICAwLjAwMDAwLCJcCi0iICAgMC4wMDYyNiwgIC0wLjAwMzE5LCAgIDAuMDAwMDAsICAgMC4wMDAwMCwiXAotIiAgLTAuODc0MTYsICAgMC41MzEzMywgIC0xLjA4NTk5LCAgIDEuMDAwMDApO1xuIgotCi1zdGF0aWMgY29uc3QgY2hhciB2U3JjTm9ybWFsW10gPQotICAgICJhdHRyaWJ1dGUgdmVjNCB2UG9zaXRpb247XG4iCi0gICAgImF0dHJpYnV0ZSB2ZWMyIHZUZXhQb3M7XG4iCi0gICAgInVuaWZvcm0gbWF0NCB0ZXhNYXRyaXg7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgInZhcnlpbmcgZmxvYXQgdG9wRG93bjtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX1Bvc2l0aW9uID0gdlBvc2l0aW9uO1xuIgotICAgICIgIHRleENvb3JkcyA9ICh0ZXhNYXRyaXggKiB2ZWM0KHZUZXhQb3MsIDAuMCwgMS4wKSkueHk7XG4iCi0gICAgIiAgdG9wRG93biA9IHZUZXhQb3MueTtcbiIKLSAgICAifVxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgZlNyY05vcm1hbFtdID0KLSAgICAiI2V4dGVuc2lvbiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDogcmVxdWlyZVxuIgotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyRXh0ZXJuYWxPRVMgdGV4U2FtcGxlcjtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHRleENvb3JkcztcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh0ZXhTYW1wbGVyLCB0ZXhDb29yZHMpO1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBmU3JjU2VwaWFbXSA9Ci0gICAgIiNleHRlbnNpb24gR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCA6IHJlcXVpcmVcbiIKLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHRleFNhbXBsZXI7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgUkdCMllVVl9NQVRSSVgKLSAgICBZVVYyUkdCX01BVFJJWAotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgdmVjNCByZ2IgPSB0ZXh0dXJlMkQodGV4U2FtcGxlciwgdGV4Q29vcmRzKTtcbiIKLSAgICAiICB2ZWM0IHl1diA9IHJnYjJ5dXYgKiByZ2I7XG4iCi0gICAgIiAgeXV2ID0gdmVjNCh5dXYueCwgMTE3LjAsIDEzOS4wLCAxLjApO1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHl1djJyZ2IgKiB5dXY7XG4iCi0gICAgIn1cbiI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGZTcmNOZWdhdGl2ZVtdID0KLSAgICAiI2V4dGVuc2lvbiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDogcmVxdWlyZVxuIgotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyRXh0ZXJuYWxPRVMgdGV4U2FtcGxlcjtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHRleENvb3JkcztcbiIKLSAgICBSR0IyWVVWX01BVFJJWAotICAgIFlVVjJSR0JfTUFUUklYCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICB2ZWM0IHJnYiA9IHRleHR1cmUyRCh0ZXhTYW1wbGVyLCB0ZXhDb29yZHMpO1xuIgotICAgICIgIHZlYzQgeXV2ID0gcmdiMnl1diAqIHJnYjtcbiIKLSAgICAiICB5dXYgPSB2ZWM0KDI1NS4wIC0geXV2LngsIHl1di55LCB5dXYueiwgMS4wKTtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB5dXYycmdiICogeXV2O1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBmU3JjR3JhZGllbnRbXSA9Ci0gICAgIiNleHRlbnNpb24gR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCA6IHJlcXVpcmVcbiIKLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHRleFNhbXBsZXI7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgInZhcnlpbmcgZmxvYXQgdG9wRG93bjtcbiIKLSAgICBSR0IyWVVWX01BVFJJWAotICAgIFlVVjJSR0JfTUFUUklYCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICB2ZWM0IHJnYiA9IHRleHR1cmUyRCh0ZXhTYW1wbGVyLCB0ZXhDb29yZHMpO1xuIgotICAgICIgIHZlYzQgeXV2ID0gcmdiMnl1diAqIHJnYjtcbiIKLSAgICAiICB2ZWM0IG1peGluID0gdmVjNCgxNS4wLzMxLjAsIDU5LjAvNjMuMCwgMzEuMC8zMS4wLCAxLjApO1xuIgotICAgICIgIHZlYzQgeXV2MiA9IHJnYjJ5dXYgKiB2ZWM0KChtaXhpbi54eXogKiB0b3BEb3duKSwgMSk7XG4iCi0gICAgIiAgeXV2ID0gdmVjNCh5dXYueCwgeXV2Mi55LCB5dXYyLnosIDEpO1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHl1djJyZ2IgKiB5dXY7XG4iCi0gICAgIn1cbiI7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTmF0aXZlV2luZG93UmVuZGVyZXI6Ok5hdGl2ZVdpbmRvd1JlbmRlcmVyKHNwPEFOYXRpdmVXaW5kb3c+IG5hdGl2ZVdpbmRvdywKLSAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICAgIDogbU5hdGl2ZVdpbmRvdyhuYXRpdmVXaW5kb3cpCi0gICAgLCBtRHN0V2lkdGgod2lkdGgpCi0gICAgLCBtRHN0SGVpZ2h0KGhlaWdodCkKLSAgICAsIG1MYXN0VmlkZW9FZmZlY3QoLTEpCi0gICAgLCBtTmV4dFRleHR1cmVJZCgxMDApCi0gICAgLCBtQWN0aXZlSW5wdXRzKDApCi0gICAgLCBtVGhyZWFkQ21kKENNRF9JRExFKSB7Ci0gICAgY3JlYXRlVGhyZWFkKHRocmVhZFN0YXJ0LCB0aGlzKTsKLX0KLQotLy8gVGhlIGZ1bmN0aW9ucyBiZWxvdyBydW4gaW4gdGhlIEdMIHRocmVhZC4KLS8vCi0vLyBBbGwgR0wtcmVsYXRlZCB3b3JrIGlzIGRvbmUgaW4gdGhpcyB0aHJlYWQsIGFuZCBvdGhlciB0aHJlYWRzIHNlbmQKLS8vIHJlcXVlc3RzIHRvIHRoaXMgdGhyZWFkIHVzaW5nIGEgY29tbWFuZCBjb2RlLiBXZSBleHBlY3QgbW9zdCBvZiB0aGUKLS8vIHRpbWUgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSB0aHJlYWQgc2VuZGluZyBpbiByZXF1ZXN0cywgc28gd2UgbGV0Ci0vLyBvdGhlciB0aHJlYWRzIHdhaXQgdW50aWwgdGhlIHJlcXVlc3QgaXMgZmluaXNoZWQgYnkgR0wgdGhyZWFkLgotCi1pbnQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnRocmVhZFN0YXJ0KHZvaWQqIHNlbGYpIHsKLSAgICBBTE9HRCgiY3JlYXRlIHRocmVhZCIpOwotICAgICgoTmF0aXZlV2luZG93UmVuZGVyZXIqKXNlbGYpLT5nbFRocmVhZCgpOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpnbFRocmVhZCgpIHsKLSAgICBpbml0aWFsaXplRUdMKCk7Ci0gICAgY3JlYXRlUHJvZ3JhbXMoKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgYm9vbCBxdWl0ID0gZmFsc2U7Ci0gICAgd2hpbGUgKCFxdWl0KSB7Ci0gICAgICAgIHN3aXRjaCAobVRocmVhZENtZCkgewotICAgICAgICAgICAgY2FzZSBDTURfSURMRToKLSAgICAgICAgICAgICAgICBtQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNhc2UgQ01EX1JFTkRFUl9JTlBVVDoKLSAgICAgICAgICAgICAgICByZW5kZXIobVRocmVhZFJlbmRlcklucHV0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ01EX1JFU0VSVkVfVEVYVFVSRToKLSAgICAgICAgICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBtVGhyZWFkVGV4dHVyZUlkKTsKLSAgICAgICAgICAgICAgICBDSEVDS19HTF9FUlJPUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ01EX0RFTEVURV9URVhUVVJFOgotICAgICAgICAgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1UaHJlYWRUZXh0dXJlSWQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDTURfUVVJVDoKLSAgICAgICAgICAgICAgICB0ZXJtaW5hdGVFR0woKTsKLSAgICAgICAgICAgICAgICBxdWl0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvLyBUZWxsIHRoZSByZXF1ZXN0ZXIgdGhhdCB0aGUgY29tbWFuZCBpcyBmaW5pc2hlZC4KLSAgICAgICAgbVRocmVhZENtZCA9IENNRF9JRExFOwotICAgICAgICBtQ29uZC5icm9hZGNhc3QoKTsKLSAgICB9Ci0gICAgQUxPR0QoInF1aXQiKTsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6aW5pdGlhbGl6ZUVHTCgpIHsKLSAgICBtRWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgQ0hFQ0tfRUdMX0VSUk9SOwotCi0gICAgRUdMaW50IG1ham9yVmVyc2lvbjsKLSAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgIGVnbEluaXRpYWxpemUobUVnbERpc3BsYXksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotICAgIENIRUNLX0VHTF9FUlJPUjsKLQotICAgIEVHTENvbmZpZyBjb25maWc7Ci0gICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKLSAgICBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0gewotICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAotICAgICAgICBFR0xfUkVEX1NJWkUsIDgsCi0gICAgICAgIEVHTF9HUkVFTl9TSVpFLCA4LAotICAgICAgICBFR0xfQkxVRV9TSVpFLCA4LAotICAgICAgICBFR0xfTk9ORQotICAgIH07Ci0gICAgZWdsQ2hvb3NlQ29uZmlnKG1FZ2xEaXNwbGF5LCBjb25maWdBdHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7Ci0gICAgQ0hFQ0tfRUdMX0VSUk9SOwotCi0gICAgbUVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1FZ2xEaXNwbGF5LCBjb25maWcsCi0gICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIE5VTEwpOwotICAgIENIRUNLX0VHTF9FUlJPUjsKLQotICAgIEVHTGludCBjb250ZXh0QXR0cmlic1tdID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMX05PTkUgfTsKLSAgICBtRWdsQ29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQobUVnbERpc3BsYXksIGNvbmZpZywgRUdMX05PX0NPTlRFWFQsCi0gICAgICAgIGNvbnRleHRBdHRyaWJzKTsKLSAgICBDSEVDS19FR0xfRVJST1I7Ci0KLSAgICBlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLCBtRWdsQ29udGV4dCk7Ci0gICAgQ0hFQ0tfRUdMX0VSUk9SOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjp0ZXJtaW5hdGVFR0woKSB7Ci0gICAgZWdsRGVzdHJveUNvbnRleHQobUVnbERpc3BsYXksIG1FZ2xDb250ZXh0KTsKLSAgICBlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgIGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKLSAgICBlZ2xUZXJtaW5hdGUobUVnbERpc3BsYXkpOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpjcmVhdGVQcm9ncmFtcygpIHsKLSAgICBHTHVpbnQgdlNoYWRlcjsKLSAgICBsb2FkU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIHZTcmNOb3JtYWwsICZ2U2hhZGVyKTsKLQotICAgIGNvbnN0IGNoYXIqIGZTcmNbTlVNQkVSX09GX0VGRkVDVFNdID0gewotICAgICAgICBmU3JjTm9ybWFsLCBmU3JjU2VwaWEsIGZTcmNOZWdhdGl2ZSwgZlNyY0dyYWRpZW50Ci0gICAgfTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNQkVSX09GX0VGRkVDVFM7IGkrKykgewotICAgICAgICBHTHVpbnQgZlNoYWRlcjsKLSAgICAgICAgbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIGZTcmNbaV0sICZmU2hhZGVyKTsKLSAgICAgICAgY3JlYXRlUHJvZ3JhbSh2U2hhZGVyLCBmU2hhZGVyLCAmbVByb2dyYW1baV0pOwotICAgICAgICBnbERlbGV0ZVNoYWRlcihmU2hhZGVyKTsKLSAgICAgICAgQ0hFQ0tfR0xfRVJST1I7Ci0gICAgfQotCi0gICAgZ2xEZWxldGVTaGFkZXIodlNoYWRlcik7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmNyZWF0ZVByb2dyYW0oCi0gICAgR0x1aW50IHZlcnRleFNoYWRlciwgR0x1aW50IGZyYWdtZW50U2hhZGVyLCBHTHVpbnQqIG91dFBnbSkgewotCi0gICAgR0x1aW50IHByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgR0xpbnQgbGlua1N0YXR1cyA9IEdMX0ZBTFNFOwotICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7Ci0gICAgaWYgKGxpbmtTdGF0dXMgIT0gR0xfVFJVRSkgewotICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgICAgIGlmIChpbmZvTGVuKSB7Ci0gICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhpbmZvTGVuKTsKLSAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0sIGluZm9MZW4sIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlByb2dyYW0gbGluayBsb2c6XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICBwcm9ncmFtID0gMDsKLSAgICB9Ci0KLSAgICAqb3V0UGdtID0gcHJvZ3JhbTsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6bG9hZFNoYWRlcihHTGVudW0gc2hhZGVyVHlwZSwgY29uc3QgY2hhciogcFNvdXJjZSwKLSAgICAgICAgR0x1aW50KiBvdXRTaGFkZXIpIHsKLSAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZwU291cmNlLCBOVUxMKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgR0xpbnQgY29tcGlsZWQgPSAwOwotICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNvbXBpbGVkKTsKLSAgICBpZiAoIWNvbXBpbGVkKSB7Ci0gICAgICAgIEdMaW50IGluZm9MZW4gPSAwOwotICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOwotICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBpbmZvTGVuLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgQUxPR0UoIlNoYWRlciBjb21waWxlIGxvZzpcbiVzXG4iLCBidWYpOwotICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICB9Ci0gICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgIHNoYWRlciA9IDA7Ci0gICAgfQotICAgICpvdXRTaGFkZXIgPSBzaGFkZXI7Ci19Ci0KLU5hdGl2ZVdpbmRvd1JlbmRlcmVyOjp+TmF0aXZlV2luZG93UmVuZGVyZXIoKSB7Ci0gICAgQ0hFQ0sobUFjdGl2ZUlucHV0cyA9PSAwKTsKLSAgICBzdGFydFJlcXVlc3QoQ01EX1FVSVQpOwotICAgIHNlbmRSZXF1ZXN0KCk7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnJlbmRlcihSZW5kZXJJbnB1dCogaW5wdXQpIHsKLSAgICBzcDxHTENvbnN1bWVyPiBTVCA9IGlucHV0LT5tU1Q7Ci0gICAgc3A8U3VyZmFjZT4gU1RDID0gaW5wdXQtPm1TVEM7Ci0KLSAgICBpZiAoaW5wdXQtPm1Jc0V4dGVybmFsQnVmZmVyKSB7Ci0gICAgICAgIHF1ZXVlRXh0ZXJuYWxCdWZmZXIoU1RDLmdldCgpLCBpbnB1dC0+bUJ1ZmZlciwKLSAgICAgICAgICAgIGlucHV0LT5tV2lkdGgsIGlucHV0LT5tSGVpZ2h0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBxdWV1ZUludGVybmFsQnVmZmVyKFNUQy5nZXQoKSwgaW5wdXQtPm1CdWZmZXIpOwotICAgIH0KLQotICAgIFNULT51cGRhdGVUZXhJbWFnZSgpOwotICAgIGdsQ2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgY2FsY3VsYXRlUG9zaXRpb25Db29yZGluYXRlcyhpbnB1dC0+bVJlbmRlcmluZ01vZGUsCi0gICAgICAgIGlucHV0LT5tV2lkdGgsIGlucHV0LT5tSGVpZ2h0KTsKLQotICAgIGNvbnN0IEdMZmxvYXQgdGV4dHVyZUNvb3JkaW5hdGVzW10gPSB7Ci0gICAgICAgICAwLjBmLCAgMS4wZiwKLSAgICAgICAgIDAuMGYsICAwLjBmLAotICAgICAgICAgMS4wZiwgIDAuMGYsCi0gICAgICAgICAxLjBmLCAgMS4wZiwKLSAgICB9OwotCi0gICAgdXBkYXRlUHJvZ3JhbUFuZEhhbmRsZShpbnB1dC0+bVZpZGVvRWZmZWN0KTsKLQotICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtUG9zaXRpb25IYW5kbGUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwKLSAgICAgICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXMpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtUG9zaXRpb25IYW5kbGUpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1UZXhQb3NIYW5kbGUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwKLSAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobVRleFBvc0hhbmRsZSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBHTGZsb2F0IHRleE1hdHJpeFsxNl07Ci0gICAgU1QtPmdldFRyYW5zZm9ybU1hdHJpeCh0ZXhNYXRyaXgpOwotICAgIGdsVW5pZm9ybU1hdHJpeDRmdihtVGV4TWF0cml4SGFuZGxlLCAxLCBHTF9GQUxTRSwgdGV4TWF0cml4KTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIGlucHV0LT5tVGV4dHVyZUlkKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyaSgKLSAgICAgICAgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoCi0gICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnF1ZXVlSW50ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyAqYW53LAotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIpIHsKLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKLSAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChhbncsIHRpbWVVcyAqIDEwMDApOwotICAgIHN0YXR1c190IGVyciA9IGFudy0+cXVldWVCdWZmZXIoYW53LCBidWZmZXItPmdyYXBoaWNCdWZmZXIoKS5nZXQoKSwgLTEpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBBTE9HRSgicXVldWVCdWZmZXIgZmFpbGVkIHdpdGggZXJyb3IgJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhRGF0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgbWV0YURhdGEtPnNldEludDMyKGtLZXlSZW5kZXJlZCwgMSk7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnF1ZXVlRXh0ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyogYW53LAotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoYW53LCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKTsKLSAgICBuYXRpdmVfd2luZG93X3NldF91c2FnZShhbncsIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOwotCi0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOwotICAgIENIRUNLKE5PX0VSUk9SID09IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQoYW53LCAmYW5iKSk7Ci0gICAgQ0hFQ0soYW5iICE9IE5VTEwpOwotCi0gICAgLy8gQ29weSB0aGUgYnVmZmVyCi0gICAgdWludDhfdCogaW1nID0gTlVMTDsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYobmV3IEdyYXBoaWNCdWZmZXIoYW5iLCBmYWxzZSkpOwotICAgIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAodm9pZCoqKSgmaW1nKSk7Ci0gICAgY29weUk0MjBCdWZmZXIoYnVmZmVyLCBpbWcsIHdpZHRoLCBoZWlnaHQsIGJ1Zi0+Z2V0U3RyaWRlKCkpOwotICAgIGJ1Zi0+dW5sb2NrKCk7Ci0gICAgQ0hFQ0soTk9fRVJST1IgPT0gYW53LT5xdWV1ZUJ1ZmZlcihhbncsIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCksIC0xKSk7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmNvcHlJNDIwQnVmZmVyKE1lZGlhQnVmZmVyKiBzcmMsIHVpbnQ4X3QqIGRzdCwKLSAgICAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LCBpbnQgc3RyaWRlKSB7Ci0gICAgaW50IHN0cmlkZVVWID0gKHN0cmlkZSAvIDIgKyAweGYpICYgfjB4ZjsKLSAgICB1aW50OF90KiBwID0gKHVpbnQ4X3QqKXNyYy0+ZGF0YSgpICsgc3JjLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAvLyBZCi0gICAgZm9yIChpbnQgaSA9IHNyY0hlaWdodDsgaSA+IDA7IGktLSkgewotICAgICAgICBtZW1jcHkoZHN0LCBwLCBzcmNXaWR0aCk7Ci0gICAgICAgIGRzdCArPSBzdHJpZGU7Ci0gICAgICAgIHAgKz0gc3JjV2lkdGg7Ci0gICAgfQotICAgIC8vIFRoZSBzcmMgaXMgSTQyMCwgdGhlIGRzdCBpcyBZVjEyLgotICAgIC8vIFUKLSAgICBwICs9IHNyY1dpZHRoICogc3JjSGVpZ2h0IC8gNDsKLSAgICBmb3IgKGludCBpID0gc3JjSGVpZ2h0IC8gMjsgaSA+IDA7IGktLSkgewotICAgICAgICBtZW1jcHkoZHN0LCBwLCBzcmNXaWR0aCAvIDIpOwotICAgICAgICBkc3QgKz0gc3RyaWRlVVY7Ci0gICAgICAgIHAgKz0gc3JjV2lkdGggLyAyOwotICAgIH0KLSAgICAvLyBWCi0gICAgcCAtPSBzcmNXaWR0aCAqIHNyY0hlaWdodCAvIDI7Ci0gICAgZm9yIChpbnQgaSA9IHNyY0hlaWdodCAvIDI7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgbWVtY3B5KGRzdCwgcCwgc3JjV2lkdGggLyAyKTsKLSAgICAgICAgZHN0ICs9IHN0cmlkZVVWOwotICAgICAgICBwICs9IHNyY1dpZHRoIC8gMjsKLSAgICB9Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnVwZGF0ZVByb2dyYW1BbmRIYW5kbGUodWludDMyX3QgdmlkZW9FZmZlY3QpIHsKLSAgICBpZiAobUxhc3RWaWRlb0VmZmVjdCA9PSB2aWRlb0VmZmVjdCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUxhc3RWaWRlb0VmZmVjdCA9IHZpZGVvRWZmZWN0OwotICAgIGludCBpOwotICAgIHN3aXRjaCAobUxhc3RWaWRlb0VmZmVjdCkgewotICAgICAgICBjYXNlIFZJREVPX0VGRkVDVF9OT05FOgotICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT19FRkZFQ1RfU0VQSUE6Ci0gICAgICAgICAgICBpID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPX0VGRkVDVF9ORUdBVElWRToKLSAgICAgICAgICAgIGkgPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVklERU9fRUZGRUNUX0dSQURJRU5UOgotICAgICAgICAgICAgaSA9IDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGdsVXNlUHJvZ3JhbShtUHJvZ3JhbVtpXSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBtUG9zaXRpb25IYW5kbGUgPSBnbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtW2ldLCAidlBvc2l0aW9uIik7Ci0gICAgbVRleFBvc0hhbmRsZSA9IGdsR2V0QXR0cmliTG9jYXRpb24obVByb2dyYW1baV0sICJ2VGV4UG9zIik7Ci0gICAgbVRleE1hdHJpeEhhbmRsZSA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1Qcm9ncmFtW2ldLCAidGV4TWF0cml4Iik7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmNhbGN1bGF0ZVBvc2l0aW9uQ29vcmRpbmF0ZXMoCi0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQpIHsKLSAgICBmbG9hdCB4LCB5OwotICAgIHN3aXRjaCAocmVuZGVyaW5nTW9kZSkgewotICAgICAgICBjYXNlIE00eFZTU19rUmVzaXppbmc6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB4ID0gMTsKLSAgICAgICAgICAgIHkgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTR4VlNTX2tDcm9wcGluZzoKLSAgICAgICAgICAgIHggPSBmbG9hdChzcmNXaWR0aCkgLyBtRHN0V2lkdGg7Ci0gICAgICAgICAgICB5ID0gZmxvYXQoc3JjSGVpZ2h0KSAvIG1Ec3RIZWlnaHQ7Ci0gICAgICAgICAgICAvLyBNYWtlIHRoZSBzbWFsbGVyIHNpZGUgMQotICAgICAgICAgICAgaWYgKHggPiB5KSB7Ci0gICAgICAgICAgICAgICAgeCAvPSB5OwotICAgICAgICAgICAgICAgIHkgPSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB5IC89IHg7Ci0gICAgICAgICAgICAgICAgeCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNHhWU1Nfa0JsYWNrQm9yZGVyczoKLSAgICAgICAgICAgIHggPSBmbG9hdChzcmNXaWR0aCkgLyBtRHN0V2lkdGg7Ci0gICAgICAgICAgICB5ID0gZmxvYXQoc3JjSGVpZ2h0KSAvIG1Ec3RIZWlnaHQ7Ci0gICAgICAgICAgICAvLyBNYWtlIHRoZSBsYXJnZXIgc2lkZSAxCi0gICAgICAgICAgICBpZiAoeCA+IHkpIHsKLSAgICAgICAgICAgICAgICB5IC89IHg7Ci0gICAgICAgICAgICAgICAgeCA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHggLz0geTsKLSAgICAgICAgICAgICAgICB5ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzBdID0gLXg7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbMV0gPSB5OwotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzJdID0gLXg7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbM10gPSAteTsKLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1s0XSA9IHg7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbNV0gPSAteTsKLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1s2XSA9IHg7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbN10gPSB5OwotfQotCi0vLwotLy8gIFRoZSBmdW5jdGlvbnMgYmVsb3cgcnVuIGluIG90aGVyIHRocmVhZHMuCi0vLwotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpzdGFydFJlcXVlc3QoaW50IGNtZCkgewotICAgIG1Mb2NrLmxvY2soKTsKLSAgICB3aGlsZSAobVRocmVhZENtZCAhPSBDTURfSURMRSkgewotICAgICAgICBtQ29uZC53YWl0KG1Mb2NrKTsKLSAgICB9Ci0gICAgbVRocmVhZENtZCA9IGNtZDsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6c2VuZFJlcXVlc3QoKSB7Ci0gICAgbUNvbmQuYnJvYWRjYXN0KCk7Ci0gICAgd2hpbGUgKG1UaHJlYWRDbWQgIT0gQ01EX0lETEUpIHsKLSAgICAgICAgbUNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotICAgIG1Mb2NrLnVubG9jaygpOwotfQotCi1SZW5kZXJJbnB1dCogTmF0aXZlV2luZG93UmVuZGVyZXI6OmNyZWF0ZVJlbmRlcklucHV0KCkgewotICAgIEFMT0dEKCJuZXcgcmVuZGVyIGlucHV0ICVkIiwgbU5leHRUZXh0dXJlSWQpOwotICAgIFJlbmRlcklucHV0KiBpbnB1dCA9IG5ldyBSZW5kZXJJbnB1dCh0aGlzLCBtTmV4dFRleHR1cmVJZCk7Ci0KLSAgICBzdGFydFJlcXVlc3QoQ01EX1JFU0VSVkVfVEVYVFVSRSk7Ci0gICAgbVRocmVhZFRleHR1cmVJZCA9IG1OZXh0VGV4dHVyZUlkOwotICAgIHNlbmRSZXF1ZXN0KCk7Ci0KLSAgICBtTmV4dFRleHR1cmVJZCsrOwotICAgIG1BY3RpdmVJbnB1dHMrKzsKLSAgICByZXR1cm4gaW5wdXQ7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmRlc3Ryb3lSZW5kZXJJbnB1dChSZW5kZXJJbnB1dCogaW5wdXQpIHsKLSAgICBBTE9HRCgiZGVzdHJveSByZW5kZXIgaW5wdXQgJWQiLCBpbnB1dC0+bVRleHR1cmVJZCk7Ci0gICAgR0x1aW50IHRleHR1cmVJZCA9IGlucHV0LT5tVGV4dHVyZUlkOwotICAgIGRlbGV0ZSBpbnB1dDsKLQotICAgIHN0YXJ0UmVxdWVzdChDTURfREVMRVRFX1RFWFRVUkUpOwotICAgIG1UaHJlYWRUZXh0dXJlSWQgPSB0ZXh0dXJlSWQ7Ci0gICAgc2VuZFJlcXVlc3QoKTsKLQotICAgIG1BY3RpdmVJbnB1dHMtLTsKLX0KLQotLy8KLS8vICBSZW5kZXJJbnB1dAotLy8KLQotUmVuZGVySW5wdXQ6OlJlbmRlcklucHV0KE5hdGl2ZVdpbmRvd1JlbmRlcmVyKiByZW5kZXJlciwgR0x1aW50IHRleHR1cmVJZCkKLSAgICA6IG1SZW5kZXJlcihyZW5kZXJlcikKLSAgICAsIG1UZXh0dXJlSWQodGV4dHVyZUlkKSB7Ci0gICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgbVNUID0gbmV3IEdMQ29uc3VtZXIoYnEsIG1UZXh0dXJlSWQpOwotICAgIG1TVEMgPSBuZXcgU3VyZmFjZShicSk7Ci0gICAgbmF0aXZlX3dpbmRvd19jb25uZWN0KG1TVEMuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKLX0KLQotUmVuZGVySW5wdXQ6On5SZW5kZXJJbnB1dCgpIHsKLX0KLQotQU5hdGl2ZVdpbmRvdyogUmVuZGVySW5wdXQ6OmdldFRhcmdldFdpbmRvdygpIHsKLSAgICByZXR1cm4gbVNUQy5nZXQoKTsKLX0KLQotdm9pZCBSZW5kZXJJbnB1dDo6dXBkYXRlVmlkZW9TaXplKHNwPE1ldGFEYXRhPiBtZXRhKSB7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm1XaWR0aCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbUhlaWdodCkpOwotCi0gICAgaW50IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKLSAgICBpZiAobWV0YS0+ZmluZFJlY3Qoa0tleUNyb3BSZWN0LCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgewotICAgICAgICBtV2lkdGggPSByaWdodCAtIGxlZnQgKyAxOwotICAgICAgICBtSGVpZ2h0ID0gYm90dG9tIC0gdG9wICsgMTsKLSAgICB9Ci0KLSAgICAvLyBJZiByb3RhdGlvbiBkZWdyZWVzIGlzIDkwIG9yIDI3MCwgc3dhcCB3aWR0aCBhbmQgaGVpZ2h0Ci0gICAgLy8gKG1XaWR0aCBhbmQgbUhlaWdodCBhcmUgdGhlIF9yb3RhdGVkXyBzb3VyY2UgcmVjdGFuZ2xlKS4KLSAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKLSAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHJvdGF0aW9uRGVncmVlcyA9PSA5MCB8fCByb3RhdGlvbkRlZ3JlZXMgPT0gMjcwKSB7Ci0gICAgICAgIGludCB0bXAgPSBtV2lkdGg7Ci0gICAgICAgIG1XaWR0aCA9IG1IZWlnaHQ7Ci0gICAgICAgIG1IZWlnaHQgPSB0bXA7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlcklucHV0OjpyZW5kZXIoTWVkaWFCdWZmZXIqIGJ1ZmZlciwgdWludDMyX3QgdmlkZW9FZmZlY3QsCi0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLCBib29sIGlzRXh0ZXJuYWxCdWZmZXIpIHsKLSAgICBtVmlkZW9FZmZlY3QgPSB2aWRlb0VmZmVjdDsKLSAgICBtUmVuZGVyaW5nTW9kZSA9IHJlbmRlcmluZ01vZGU7Ci0gICAgbUlzRXh0ZXJuYWxCdWZmZXIgPSBpc0V4dGVybmFsQnVmZmVyOwotICAgIG1CdWZmZXIgPSBidWZmZXI7Ci0KLSAgICBtUmVuZGVyZXItPnN0YXJ0UmVxdWVzdChOYXRpdmVXaW5kb3dSZW5kZXJlcjo6Q01EX1JFTkRFUl9JTlBVVCk7Ci0gICAgbVJlbmRlcmVyLT5tVGhyZWFkUmVuZGVySW5wdXQgPSB0aGlzOwotICAgIG1SZW5kZXJlci0+c2VuZFJlcXVlc3QoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjZiNGNiYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL05hdGl2ZVdpbmRvd1JlbmRlcmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTkFUSVZFX1dJTkRPV19SRU5ERVJFUl9IXwotI2RlZmluZSBOQVRJVkVfV0lORE9XX1JFTkRFUkVSX0hfCi0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0KLS8vIFRoZSBOYXRpdmVXaW5kb3dSZW5kZXJlciBkcmF3cyB2aWRlbyBmcmFtZXMgc3RvcmVkIGluIE1lZGlhQnVmZmVycyB0bwotLy8gYW4gQU5hdGl2ZVdpbmRvdy4gIEl0IGNhbiBhcHBseSAicmVuZGVyaW5nIG1vZGUiIGFuZCBjb2xvciBlZmZlY3RzIHRvCi0vLyB0aGUgZnJhbWVzLiAiUmVuZGVyaW5nIG1vZGUiIGlzIHRoZSBvcHRpb24gdG8gZG8gcmVzaXppbmcsIGNyb3BwaW5nLAotLy8gb3IgYmxhY2stYm9yZGVyaW5nIHdoZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXNwZWN0IHJhdGlvIGFyZQotLy8gZGlmZmVyZW50LiBDb2xvciBlZmZlY3RzIGluY2x1ZGUgc2VwaWEsIG5lZ2F0aXZlLCBhbmQgZ3JhZGllbnQuCi0vLwotLy8gVGhlIGlucHV0IHRvIE5hdGl2ZVdpbmRvd1JlbmRlcmVyIGlzIHByb3ZpZGVkIGJ5IHRoZSBSZW5kZXJJbnB1dCBjbGFzcywKLS8vIGFuZCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgYWN0aXZlIFJlbmRlcklucHV0IGF0IHRoZSBzYW1lIHRpbWUuIEFsdGhvdWdoCi0vLyB3ZSBvbmx5IGV4cGVjdCB0aGF0IGhhcHBlbnMgYnJpZWZseSB3aGVuIG9uZSBjbGlwIGlzIGFib3V0IHRvIGZpbmlzaAotLy8gYW5kIHRoZSBuZXh0IGNsaXAgaXMgYWJvdXQgdG8gc3RhcnQuCi0vLwotLy8gV2UgYWxsb2NhdGUgYSBTdXJmYWNlIGZvciBlYWNoIFJlbmRlcklucHV0IGFuZCB0aGUgdXNlciBjYW4gdXNlCi0vLyB0aGUgZ2V0VGFyZ2V0V2luZG93KCkgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjb3JyZXNwb25kaW5nIEFOYXRpdmVXaW5kb3cKLS8vIGZvciB0aGF0IFN1cmZhY2UuIFRoZSBpbnRlbnRpb24gaXMgdGhhdCB0aGUgdXNlciBjYW4gcGFzcyB0aGF0Ci0vLyBBTmF0aXZlV2luZG93IHRvIE9NWENvZGVjOjpDcmVhdGUoKSBzbyB0aGUgY29kZWMgY2FuIGRlY29kZSBkaXJlY3RseQotLy8gdG8gYnVmZmVycyBwcm92aWRlZCBieSB0aGUgdGV4dHVyZS4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBHTENvbnN1bWVyOwotY2xhc3MgU3VyZmFjZTsKLWNsYXNzIFJlbmRlcklucHV0OwotCi1jbGFzcyBOYXRpdmVXaW5kb3dSZW5kZXJlciB7Ci1wdWJsaWM6Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIoc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotICAgIH5OYXRpdmVXaW5kb3dSZW5kZXJlcigpOwotCi0gICAgUmVuZGVySW5wdXQqIGNyZWF0ZVJlbmRlcklucHV0KCk7Ci0gICAgdm9pZCBkZXN0cm95UmVuZGVySW5wdXQoUmVuZGVySW5wdXQqIGlucHV0KTsKLQotcHJpdmF0ZToKLSAgICAvLyBObyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIoY29uc3QgTmF0aXZlV2luZG93UmVuZGVyZXIgJik7Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIgJm9wZXJhdG9yPShjb25zdCBOYXRpdmVXaW5kb3dSZW5kZXJlciAmKTsKLQotICAgIC8vIEluaXRpYWxpemF0aW9uIGFuZCBmaW5pYWxpemF0aW9uCi0gICAgdm9pZCBpbml0aWFsaXplRUdMKCk7Ci0gICAgdm9pZCB0ZXJtaW5hdGVFR0woKTsKLSAgICB2b2lkIGNyZWF0ZVByb2dyYW1zKCk7Ci0gICAgdm9pZCBjcmVhdGVQcm9ncmFtKAotICAgICAgICAgICAgR0x1aW50IHZlcnRleFNoYWRlciwgR0x1aW50IGZyYWdtZW50U2hhZGVyLCBHTHVpbnQqIG91dFBnbSk7Ci0gICAgdm9pZCBsb2FkU2hhZGVyKAotICAgICAgICAgICAgR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UsIEdMdWludCogb3V0U2hhZGVyKTsKLQotICAgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWQgZXZlcnkgZnJhbWUuCi0gICAgdm9pZCByZW5kZXIoUmVuZGVySW5wdXQqIGlucHV0KTsKLSAgICB2b2lkIHF1ZXVlSW50ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyogYW53LCBNZWRpYUJ1ZmZlciogYnVmZmVyKTsKLSAgICB2b2lkIHF1ZXVlRXh0ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyogYW53LCBNZWRpYUJ1ZmZlciogYnVmZmVyLAotICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICB2b2lkIGNvcHlJNDIwQnVmZmVyKE1lZGlhQnVmZmVyKiBzcmMsIHVpbnQ4X3QqIGRzdCwKLSAgICAgICAgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwgaW50IHN0cmlkZSk7Ci0gICAgdm9pZCB1cGRhdGVQcm9ncmFtQW5kSGFuZGxlKHVpbnQzMl90IHZpZGVvRWZmZWN0KTsKLSAgICB2b2lkIGNhbGN1bGF0ZVBvc2l0aW9uQ29vcmRpbmF0ZXMoTTR4VlNTX01lZGlhUmVuZGVyaW5nIHJlbmRlcmluZ01vZGUsCi0gICAgICAgICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQpOwotCi0gICAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSBpbml0aWFsaXplZCBvbmNlIGFuZCBkb2Vzbid0IGNoYW5nZSBhZnRlcndhcmRzLgotICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7Ci0gICAgaW50IG1Ec3RXaWR0aCwgbURzdEhlaWdodDsKLSAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwotICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7Ci0gICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKLSAgICBlbnVtIHsKLSAgICAgICAgRUZGRUNUX05PUk1BTCwKLSAgICAgICAgRUZGRUNUX1NFUElBLAotICAgICAgICBFRkZFQ1RfTkVHQVRJVkUsCi0gICAgICAgIEVGRkVDVF9HUkFESUVOVCwKLSAgICAgICAgTlVNQkVSX09GX0VGRkVDVFMKLSAgICB9OwotICAgIEdMdWludCBtUHJvZ3JhbVtOVU1CRVJfT0ZfRUZGRUNUU107Ci0KLSAgICAvLyBXZSB1c2Ugb25lIHNoYWRlciBwcm9ncmFtIGZvciBlYWNoIGVmZmVjdC4gbUxhc3RWaWRlb0VmZmVjdCByZW1lbWJlcnMKLSAgICAvLyB0aGUgcHJvZ3JhbSB1c2VkIGZvciB0aGUgbGFzdCBmcmFtZS4gd2hlbiB0aGUgZWZmZWN0IHVzZWQgY2hhbmdlcywKLSAgICAvLyB3ZSBjaGFuZ2UgdGhlIHByb2dyYW0gdXNlZCBhbmQgdXBkYXRlIHRoZSBoYW5kbGVzLgotICAgIHVpbnQzMl90IG1MYXN0VmlkZW9FZmZlY3Q7Ci0gICAgR0xpbnQgbVBvc2l0aW9uSGFuZGxlOwotICAgIEdMaW50IG1UZXhQb3NIYW5kbGU7Ci0gICAgR0xpbnQgbVRleE1hdHJpeEhhbmRsZTsKLQotICAgIC8vIFRoaXMgaXMgdGhlIHZlcnRleCBjb29yZGluYXRlcyB1c2VkIGZvciB0aGUgZnJhbWUgdGV4dHVyZS4KLSAgICAvLyBJdCdzIGNhbGN1bGF0ZWQgYWNjb3JkaW5nIHRoZSB0aGUgcmVuZGVyaW5nIG1vZGUgYW5kIHRoZSBzb3VyY2UgYW5kCi0gICAgLy8gZGVzdGluYXRpb24gYXNwZWN0IHJhdGlvLgotICAgIEdMZmxvYXQgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbOF07Ci0KLSAgICAvLyBXZSB1c2UgYSBkaWZmZXJlbnQgR0wgaWQgZm9yIGVhY2ggU3VyZmFjZS4KLSAgICBHTHVpbnQgbU5leHRUZXh0dXJlSWQ7Ci0KLSAgICAvLyBOdW1iZXIgb2YgZXhpc3RpbmcgUmVuZGVySW5wdXRzLCBqdXN0IGZvciBkZWJ1Z2dpbmcuCi0gICAgaW50IG1BY3RpdmVJbnB1dHM7Ci0KLSAgICAvLyBUaGUgR0wgdGhyZWFkIGZ1bmN0aW9ucwotICAgIHN0YXRpYyBpbnQgdGhyZWFkU3RhcnQodm9pZCogc2VsZik7Ci0gICAgdm9pZCBnbFRocmVhZCgpOwotCi0gICAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSB1c2VkIHRvIGNvbW11bmljYXRlIGJldHdlZW4gdGhlIEdMIHRocmVhZCBhbmQKLSAgICAvLyBvdGhlciB0aHJlYWRzLgotICAgIE11dGV4IG1Mb2NrOwotICAgIENvbmRpdGlvbiBtQ29uZDsKLSAgICBlbnVtIHsKLSAgICAgICAgQ01EX0lETEUsCi0gICAgICAgIENNRF9SRU5ERVJfSU5QVVQsCi0gICAgICAgIENNRF9SRVNFUlZFX1RFWFRVUkUsCi0gICAgICAgIENNRF9ERUxFVEVfVEVYVFVSRSwKLSAgICAgICAgQ01EX1FVSVQsCi0gICAgfTsKLSAgICBpbnQgbVRocmVhZENtZDsKLSAgICBSZW5kZXJJbnB1dCogbVRocmVhZFJlbmRlcklucHV0OwotICAgIEdMdWludCBtVGhyZWFkVGV4dHVyZUlkOwotCi0gICAgLy8gVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHNlbmQgY29tbWFuZHMgdG8gdGhlIEdMIHRocmVhZC4KLSAgICAvLyBzZW5kUmVxdWVzdCgpIGFsc28gd2FpdHMgZm9yIHRoZSBHTCB0aHJlYWQgYWNrbm93bGVkZ2VzIHRoZQotICAgIC8vIGNvbW1hbmQgaXMgZmluaXNoZWQuCi0gICAgdm9pZCBzdGFydFJlcXVlc3QoaW50IGNtZCk7Ci0gICAgdm9pZCBzZW5kUmVxdWVzdCgpOwotCi0gICAgZnJpZW5kIGNsYXNzIFJlbmRlcklucHV0OwotfTsKLQotY2xhc3MgUmVuZGVySW5wdXQgewotcHVibGljOgotICAgIC8vIFJldHVybnMgdGhlIEFOYXRpdmVXaW5kb3cgY29ycmVzcG9uZHMgdG8gdGhlIFN1cmZhY2UuCi0gICAgQU5hdGl2ZVdpbmRvdyogZ2V0VGFyZ2V0V2luZG93KCk7Ci0KLSAgICAvLyBVcGRhdGVzIHZpZGVvIGZyYW1lIHNpemUgZnJvbSB0aGUgTWVkaWFTb3VyY2UncyBtZXRhZGF0YS4gU3BlY2lmaWNhbGx5Ci0gICAgLy8gd2UgbG9vayBmb3Iga0tleVdpZHRoLCBrS2V5SGVpZ2h0LCBhbmQgKG9wdGlvbmFsbHkpIGtLZXlDcm9wUmVjdC4KLSAgICB2b2lkIHVwZGF0ZVZpZGVvU2l6ZShzcDxNZXRhRGF0YT4gbWV0YSk7Ci0KLSAgICAvLyBSZW5kZXJzIHRoZSBidWZmZXIgd2l0aCB0aGUgZ2l2ZW4gdmlkZW8gZWZmZWN0IGFuZCByZW5kaW5nIG1vZGUuCi0gICAgLy8gVGhlIHZpZGVvIGVmZmV0cyBhcmUgZGVmaW5lZCBpbiBWaWRlb0VkaXRvclRvb2xzLmgKLSAgICAvLyBTZXQgaXNFeHRlcm5hbEJ1ZmZlciB0byB0cnVlIG9ubHkgd2hlbiB0aGUgYnVmZmVyIGdpdmVuIGlzIG5vdAotICAgIC8vIHByb3ZpZGVkIGJ5IHRoZSBTdXJmYWNlLgotICAgIHZvaWQgcmVuZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQzMl90IHZpZGVvRWZmZWN0LAotICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgcmVuZGVyaW5nTW9kZSwgYm9vbCBpc0V4dGVybmFsQnVmZmVyKTsKLXByaXZhdGU6Ci0gICAgUmVuZGVySW5wdXQoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyLCBHTHVpbnQgdGV4dHVyZUlkKTsKLSAgICB+UmVuZGVySW5wdXQoKTsKLSAgICBOYXRpdmVXaW5kb3dSZW5kZXJlciogbVJlbmRlcmVyOwotICAgIEdMdWludCBtVGV4dHVyZUlkOwotICAgIHNwPEdMQ29uc3VtZXI+IG1TVDsKLSAgICBzcDxTdXJmYWNlPiBtU1RDOwotICAgIGludCBtV2lkdGgsIG1IZWlnaHQ7Ci0KLSAgICAvLyBUaGVzZSBhcmUgb25seSB2YWxpZCBkdXJpbmcgcmVuZGVyKCkgY2FsbHMKLSAgICB1aW50MzJfdCBtVmlkZW9FZmZlY3Q7Ci0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1SZW5kZXJpbmdNb2RlOwotICAgIGJvb2wgbUlzRXh0ZXJuYWxCdWZmZXI7Ci0gICAgTWVkaWFCdWZmZXIqIG1CdWZmZXI7Ci0KLSAgICBmcmllbmQgY2xhc3MgTmF0aXZlV2luZG93UmVuZGVyZXI7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE5BVElWRV9XSU5ET1dfUkVOREVSRVJfSF8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYmQ5Zjg0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlByZXZpZXdQbGF5ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJEdW1teUF1ZGlvU291cmNlLmgiCi0jaW5jbHVkZSAiRHVtbXlWaWRlb1NvdXJjZS5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yU1JDLmgiCi0jaW5jbHVkZSAiUHJldmlld1BsYXllci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLQotdm9pZCBhZGRCYXR0ZXJ5RGF0YSh1aW50MzJfdCBwYXJhbXMpIHsKLSAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQotICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEucGxheWVyIikpOwotICAgIHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPihiaW5kZXIpOwotICAgIENIRUNLKHNlcnZpY2UuZ2V0KCkgIT0gTlVMTCk7Ci0KLSAgICBzZXJ2aWNlLT5hZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOwotfQotCi1zdHJ1Y3QgUHJldmlld1BsYXllckV2ZW50IDogcHVibGljIFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQgewotICAgIFByZXZpZXdQbGF5ZXJFdmVudCgKLSAgICAgICAgICAgIFByZXZpZXdQbGF5ZXIgKnBsYXllciwKLSAgICAgICAgICAgIHZvaWQgKFByZXZpZXdQbGF5ZXI6OiptZXRob2QpKCkpCi0gICAgICAgIDogbVBsYXllcihwbGF5ZXIpLAotICAgICAgICAgIG1NZXRob2QobWV0aG9kKSB7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+UHJldmlld1BsYXllckV2ZW50KCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBmaXJlKFRpbWVkRXZlbnRRdWV1ZSAqcXVldWUsIGludDY0X3QgLyogbm93X3VzICovKSB7Ci0gICAgICAgIChtUGxheWVyLT4qbU1ldGhvZCkoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgUHJldmlld1BsYXllciAqbVBsYXllcjsKLSAgICB2b2lkIChQcmV2aWV3UGxheWVyOjoqbU1ldGhvZCkoKTsKLQotICAgIFByZXZpZXdQbGF5ZXJFdmVudChjb25zdCBQcmV2aWV3UGxheWVyRXZlbnQgJik7Ci0gICAgUHJldmlld1BsYXllckV2ZW50ICZvcGVyYXRvcj0oY29uc3QgUHJldmlld1BsYXllckV2ZW50ICYpOwotfTsKLQotUHJldmlld1BsYXllcjo6UHJldmlld1BsYXllcihOYXRpdmVXaW5kb3dSZW5kZXJlciogcmVuZGVyZXIpCi0gICAgOiBtUXVldWVTdGFydGVkKGZhbHNlKSwKLSAgICAgIG1UaW1lU291cmNlKE5VTEwpLAotICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcoZmFsc2UpLAotICAgICAgbUF1ZGlvUGxheWVyKE5VTEwpLAotICAgICAgbURpc3BsYXlXaWR0aCgwKSwKLSAgICAgIG1EaXNwbGF5SGVpZ2h0KDApLAotICAgICAgbUZsYWdzKDApLAotICAgICAgbUV4dHJhY3RvckZsYWdzKDApLAotICAgICAgbVZpZGVvQnVmZmVyKE5VTEwpLAotICAgICAgbUxhc3RWaWRlb1RpbWVVcygtMSksCi0gICAgICBtTmF0aXZlV2luZG93UmVuZGVyZXIocmVuZGVyZXIpLAotICAgICAgbUN1cnJGcmFtaW5nRWZmZWN0SW5kZXgoMCksCi0gICAgICBtRnJhbWVSR0JCdWZmZXIoTlVMTCksCi0gICAgICBtRnJhbWVZVVZCdWZmZXIoTlVMTCkgewotCi0gICAgQ0hFQ0tfRVEobUNsaWVudC5jb25uZWN0KCksIChzdGF0dXNfdClPSyk7Ci0gICAgRGF0YVNvdXJjZTo6UmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKLQotCi0gICAgbVZpZGVvUmVuZGVyZXIgPSBOVUxMOwotICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgIG1BdWRpb1BsYXllciA9IE5VTEw7Ci0gICAgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTID0gMDsKLSAgICBtQ3VycmVudE1lZGlhQmVnaW5DdXRUaW1lID0gMDsKLSAgICBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWUgPSAwOwotICAgIG1OdW1iZXJFZmZlY3RzID0gMDsKLSAgICBtRGVjb2RlZFZpZGVvVHMgPSAwOwotICAgIG1EZWNWaWRlb1RzU3RvcnlCb2FyZCA9IDA7Ci0gICAgbUN1cnJlbnRWaWRlb0VmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotICAgIG1Qcm9ncmVzc0NiSW50ZXJ2YWwgPSAwOwotICAgIG1OdW1iZXJEZWNWaWRlb0ZyYW1lcyA9IDA7Ci0gICAgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCA9IGZhbHNlOwotICAgIG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkID0gdHJ1ZTsKLQotICAgIG1WaWRlb0V2ZW50ID0gbmV3IFByZXZpZXdQbGF5ZXJFdmVudCh0aGlzLCAmUHJldmlld1BsYXllcjo6b25WaWRlb0V2ZW50KTsKLSAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtVmlkZW9MYWdFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQodGhpcywgJlByZXZpZXdQbGF5ZXI6Om9uVmlkZW9MYWdVcGRhdGUpOwotICAgIG1WaWRlb0V2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1DaGVja0F1ZGlvU3RhdHVzRXZlbnQgPSBuZXcgUHJldmlld1BsYXllckV2ZW50KAotICAgICAgICAgICAgdGhpcywgJlByZXZpZXdQbGF5ZXI6Om9uQ2hlY2tBdWRpb1N0YXR1cyk7Ci0gICAgbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVN0cmVhbURvbmVFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQoCi0gICAgICAgICAgICB0aGlzLCAmUHJldmlld1BsYXllcjo6b25TdHJlYW1Eb25lKTsKLSAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1Qcm9ncmVzc0NiRXZlbnQgPSBuZXcgUHJldmlld1BsYXllckV2ZW50KHRoaXMsCi0gICAgICAgICAmUHJldmlld1BsYXllcjo6b25Qcm9ncmVzc0NiRXZlbnQpOwotCi0gICAgbU92ZXJsYXlVcGRhdGVFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQodGhpcywKLSAgICAgICAgJlByZXZpZXdQbGF5ZXI6Om9uVXBkYXRlT3ZlcmxheUV2ZW50KTsKLSAgICBtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtUmVuZGVyaW5nTW9kZSA9IChNNHhWU1NfTWVkaWFSZW5kZXJpbmcpTUVESUFfUkVOREVSSU5HX0lOVkFMSUQ7Ci0gICAgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXNldCgpOwotfQotCi1QcmV2aWV3UGxheWVyOjp+UHJldmlld1BsYXllcigpIHsKLQotICAgIGlmIChtUXVldWVTdGFydGVkKSB7Ci0gICAgICAgIG1RdWV1ZS5zdG9wKCk7Ci0gICAgfQotCi0gICAgcmVzZXQoKTsKLQotICAgIGlmIChtVmlkZW9SZW5kZXJlcikgewotICAgICAgICBtTmF0aXZlV2luZG93UmVuZGVyZXItPmRlc3Ryb3lSZW5kZXJJbnB1dChtVmlkZW9SZW5kZXJlcik7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGNsZWFyX2woKTsKLSAgICBtQ2xpZW50LmRpc2Nvbm5lY3QoKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpjYW5jZWxQbGF5ZXJFdmVudHNfbChib29sIHVwZGF0ZVByb2dyZXNzQ2IpIHsKLSAgICBtUXVldWUuY2FuY2VsRXZlbnQobVZpZGVvRXZlbnQtPmV2ZW50SUQoKSk7Ci0gICAgbVZpZGVvRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVF1ZXVlLmNhbmNlbEV2ZW50KG1TdHJlYW1Eb25lRXZlbnQtPmV2ZW50SUQoKSk7Ci0gICAgbVN0cmVhbURvbmVFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtUXVldWUuY2FuY2VsRXZlbnQobUNoZWNrQXVkaW9TdGF0dXNFdmVudC0+ZXZlbnRJRCgpKTsKLSAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtUXVldWUuY2FuY2VsRXZlbnQobVZpZGVvTGFnRXZlbnQtPmV2ZW50SUQoKSk7Ci0gICAgbVZpZGVvTGFnRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgaWYgKHVwZGF0ZVByb2dyZXNzQ2IpIHsKLSAgICAgICAgbVF1ZXVlLmNhbmNlbEV2ZW50KG1Qcm9ncmVzc0NiRXZlbnQtPmV2ZW50SUQoKSk7Ci0gICAgICAgIG1Qcm9ncmVzc0NiRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnBhdGgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBzZXREYXRhU291cmNlX2wocGF0aCk7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldERhdGFTb3VyY2VfbChjb25zdCBjaGFyICpwYXRoKSB7Ci0gICAgcmVzZXRfbCgpOwotCi0gICAgbVVyaSA9IHBhdGg7Ci0KLSAgICAvLyBUaGUgYWN0dWFsIHdvcmsgd2lsbCBiZSBkb25lIGR1cmluZyBwcmVwYXJhdGlvbiBpbiB0aGUgY2FsbCB0bwotICAgIC8vIDo6ZmluaXNoU2V0RGF0YVNvdXJjZV9sIHRvIGF2b2lkIGJsb2NraW5nIHRoZSBjYWxsaW5nIHRocmVhZCBpbgotICAgIC8vIHNldERhdGFTb3VyY2UgZm9yIGFueSBzaWduaWZpY2FudCB0aW1lLgotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0RGF0YVNvdXJjZV9sKGNvbnN0IHNwPE1lZGlhRXh0cmFjdG9yPiAmZXh0cmFjdG9yKSB7Ci0gICAgYm9vbCBoYXZlQXVkaW8gPSBmYWxzZTsKLSAgICBib29sIGhhdmVWaWRlbyA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOyArK2kpIHsKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7Ci0KLSAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgICAgIGlmICghaGF2ZVZpZGVvICYmICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKLSAgICAgICAgICAgIHNldFZpZGVvU291cmNlKGV4dHJhY3Rvci0+Z2V0VHJhY2soaSkpOwotICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICghaGF2ZUF1ZGlvICYmICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKLSAgICAgICAgICAgIHNldEF1ZGlvU291cmNlKGV4dHJhY3Rvci0+Z2V0VHJhY2soaSkpOwotICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpIHsKLSAgICAgICAgICAgICAgICAvLyBPbmx5IGRvIHRoaXMgZm9yIHZvcmJpcyBhdWRpbywgbm9uZSBvZiB0aGUgb3RoZXIgYXVkaW8KLSAgICAgICAgICAgICAgICAvLyBmb3JtYXRzIGV2ZW4gc3VwcG9ydCB0aGlzIHJpbmd0b25lIHNwZWNpZmljIGhhY2sgYW5kCi0gICAgICAgICAgICAgICAgLy8gcmV0cmlldmluZyB0aGUgbWV0YWRhdGEgb24gc29tZSBleHRyYWN0b3JzIG1heSB0dXJuIG91dAotICAgICAgICAgICAgICAgIC8vIHRvIGJlIHZlcnkgZXhwZW5zaXZlLgotICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmaWxlTWV0YSA9IGV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGxvb3A7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVNZXRhICE9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGVNZXRhLT5maW5kSW50MzIoa0tleUF1dG9Mb29wLCAmbG9vcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsb29wICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVVE9fTE9PUElORzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGF2ZUF1ZGlvICYmIGhhdmVWaWRlbykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBBZGQgdGhlIHN1cHBvcnQgZm9yIER1bW15IGF1ZGlvKi8KLSAgICBpZiggIWhhdmVBdWRpbyApewotICAgICAgICBtQXVkaW9UcmFjayA9IER1bW15QXVkaW9Tb3VyY2U6OkNyZWF0ZSgzMjAwMCwgMiwgMjAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtUGxheUVuZFRpbWVNc2VjKSoxMDAwTEwpKTsKLSAgICAgICAgaWYobUF1ZGlvVHJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghaGF2ZUF1ZGlvICYmICFoYXZlVmlkZW8pIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbUV4dHJhY3RvckZsYWdzID0gZXh0cmFjdG9yLT5mbGFncygpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0RGF0YVNvdXJjZV9sX2pwZygpIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZV9sX2pwZyIpOwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBtQXVkaW9Tb3VyY2UgPSBEdW1teUF1ZGlvU291cmNlOjpDcmVhdGUoMzIwMDAsIDIsIDIwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtUGxheUVuZFRpbWVNc2VjKSoxMDAwTEwpKTsKLSAgICBpZihtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBzZXRBdWRpb1NvdXJjZShtQXVkaW9Tb3VyY2UpOwotICAgIH0KLSAgICBzdGF0dXNfdCBlcnJvciA9IG1BdWRpb1NvdXJjZS0+c3RhcnQoKTsKLSAgICBpZiAoZXJyb3IgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkVycm9yIHN0YXJ0aW5nIGR1bW15IGF1ZGlvIHNvdXJjZSIpOwotICAgICAgICBtQXVkaW9Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtRHVyYXRpb25VcyA9IChtUGxheUVuZFRpbWVNc2VjIC0gbVBsYXlCZWdpblRpbWVNc2VjKSoxMDAwTEw7Ci0KLSAgICBtVmlkZW9Tb3VyY2UgPSBEdW1teVZpZGVvU291cmNlOjpDcmVhdGUobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUR1cmF0aW9uVXMsIG1VcmkpOwotCi0gICAgdXBkYXRlU2l6ZVRvUmVuZGVyKG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCkpOwotICAgIHNldFZpZGVvU291cmNlKG1WaWRlb1NvdXJjZSk7Ci0gICAgc3RhdHVzX3QgZXJyMSA9IG1WaWRlb1NvdXJjZS0+c3RhcnQoKTsKLSAgICBpZiAoZXJyMSAhPSBPSykgewotICAgICAgICBtVmlkZW9Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtSXNWaWRlb1NvdXJjZUpwZyA9IHRydWU7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnJlc2V0X2woKSB7Ci0KLSAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1GbGFncyB8PSBQUkVQQVJFX0NBTkNFTExFRDsKLSAgICB9Ci0KLSAgICB3aGlsZSAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1QcmVwYXJlZENvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICBjYW5jZWxQbGF5ZXJFdmVudHNfbCgpOwotICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0gICAgbVZpZGVvVHJhY2suY2xlYXIoKTsKLQotICAgIC8vIFNodXRkb3duIGF1ZGlvIGZpcnN0LCBzbyB0aGF0IHRoZSByZXNwb25lIHRvIHRoZSByZXNldCByZXF1ZXN0Ci0gICAgLy8gYXBwZWFycyB0byBoYXBwZW4gaW5zdGFudGFuZW91c2x5IGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKLSAgICAvLyBJZiB3ZSBkaWQgdGhpcyBsYXRlciwgYXVkaW8gd291bGQgY29udGludWUgcGxheWluZyB3aGlsZSB3ZQotICAgIC8vIHNodXRkb3duIHRoZSB2aWRlby1yZWxhdGVkIHJlc291cmNlcyBhbmQgdGhlIHBsYXllciBhcHBlYXIgdG8KLSAgICAvLyBub3QgYmUgYXMgcmVzcG9uc2l2ZSB0byBhIHJlc2V0IHJlcXVlc3QuCi0gICAgaWYgKG1BdWRpb1BsYXllciA9PSBOVUxMICYmIG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIElmIHdlIGhhZCBhbiBhdWRpbyBwbGF5ZXIsIGl0IHdvdWxkIGhhdmUgZWZmZWN0aXZlbHkKLSAgICAgICAgLy8gdGFrZW4gcG9zc2Vzc2lvbiBvZiB0aGUgYXVkaW8gc291cmNlIGFuZCBzdG9wcGVkIGl0IHdoZW4KLSAgICAgICAgLy8gX2l0XyBpcyBzdG9wcGVkLiBPdGhlcndpc2UgdGhpcyBpcyBzdGlsbCBvdXIgcmVzcG9uc2liaWxpdHkuCi0gICAgICAgIG1BdWRpb1NvdXJjZS0+c3RvcCgpOwotICAgIH0KLSAgICBtQXVkaW9Tb3VyY2UuY2xlYXIoKTsKLQotICAgIG1UaW1lU291cmNlID0gTlVMTDsKLQotICAgIC8vU2luZ2xlIGF1ZGlvIHBsYXllciBpbnN0YW5jZSB1c2VkCi0gICAgLy9TbyBkb25vdCBkZWxldGUgaXQgaGVyZQotICAgIC8vSXQgaXMgZGVsZXRlZCBmcm9tIFByZXZpZXdDb250cm9sbGVyIGNsYXNzCi0gICAgLy9kZWxldGUgbUF1ZGlvUGxheWVyOwotICAgIG1BdWRpb1BsYXllciA9IE5VTEw7Ci0KLSAgICBpZiAobVZpZGVvQnVmZmVyKSB7Ci0gICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtVmlkZW9Tb3VyY2UtPnN0b3AoKTsKLQotICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGhhY2sgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBPTVgKLSAgICAgICAgLy8gY29tcG9uZW50IGlzIGNvbXBsZXRlbHkgcmVsZWFzZWQgYnkgdGhlIHRpbWUgd2UgbWF5IHRyeQotICAgICAgICAvLyB0byBpbnN0YW50aWF0ZSBpdCBhZ2Fpbi4KLSAgICAgICAgd3A8TWVkaWFTb3VyY2U+IHRtcCA9IG1WaWRlb1NvdXJjZTsKLSAgICAgICAgbVZpZGVvU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIHdoaWxlICh0bXAucHJvbW90ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHVzbGVlcCgxMDAwKTsKLSAgICAgICAgfQotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotCi0gICAgbUR1cmF0aW9uVXMgPSAtMTsKLSAgICBtRmxhZ3MgPSAwOwotICAgIG1FeHRyYWN0b3JGbGFncyA9IDA7Ci0gICAgbVZpZGVvV2lkdGggPSBtVmlkZW9IZWlnaHQgPSAtMTsKLSAgICBtVGltZVNvdXJjZURlbHRhVXMgPSAwOwotICAgIG1WaWRlb1RpbWVVcyA9IDA7Ci0KLSAgICBtU2Vla2luZyA9IE5PX1NFRUs7Ci0gICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gZmFsc2U7Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotCi0gICAgbVVyaS5zZXRUbygiIik7Ci0KLSAgICBtQ3VycmVudFZpZGVvRWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0gICAgbUlzVmlkZW9Tb3VyY2VKcGcgPSBmYWxzZTsKLSAgICBtRnJhbWVSR0JCdWZmZXIgPSBOVUxMOwotICAgIGlmKG1GcmFtZVlVVkJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUZyYW1lWVVWQnVmZmVyKTsKLSAgICAgICAgbUZyYW1lWVVWQnVmZmVyID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnBsYXkoKSB7Ci0gICAgQUxPR1YoInBsYXkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKLSAgICBtRmxhZ3MgJj0gfklORk9STUVEX0FWX0VPUzsKLSAgICByZXR1cm4gcGxheV9sKCk7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnN0YXJ0QXVkaW9QbGF5ZXJfbCgpIHsKLSAgICBBTE9HVigic3RhcnRBdWRpb1BsYXllcl9sIik7Ci0gICAgQ0hFQ0soIShtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSk7Ci0KLSAgICBpZiAobUF1ZGlvU291cmNlID09IE5VTEwgfHwgbUF1ZGlvUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmICghKG1GbGFncyAmIEFVRElPUExBWUVSX1NUQVJURUQpKSB7Ci0gICAgICAgIG1GbGFncyB8PSBBVURJT1BMQVlFUl9TVEFSVEVEOwotCi0gICAgICAgIC8vIFdlJ3ZlIGFscmVhZHkgc3RhcnRlZCB0aGUgTWVkaWFTb3VyY2UgaW4gb3JkZXIgdG8gZW5hYmxlCi0gICAgICAgIC8vIHRoZSBwcmVmZXRjaGVyIHRvIHJlYWQgaXRzIGRhdGEuCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1BsYXllci0+c3RhcnQoCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBzb3VyY2VBbHJlYWR5U3RhcnRlZCAqLyk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtQXVkaW9QbGF5ZXItPnJlc3VtZSgpOwotICAgIH0KLQotICAgIG1GbGFncyB8PSBBVURJT19SVU5OSU5HOwotCi0gICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRBdWRpb1BsYXllcihWaWRlb0VkaXRvckF1ZGlvUGxheWVyICphdWRpb1BsYXllcikgewotICAgIEFMT0dWKCJzZXRBdWRpb1BsYXllciIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgQ0hFQ0soIShtRmxhZ3MgJiBQTEFZSU5HKSk7Ci0gICAgbUF1ZGlvUGxheWVyID0gYXVkaW9QbGF5ZXI7Ci0KLSAgICBBTE9HVigiU2V0QXVkaW9QbGF5ZXIiKTsKLSAgICBtSXNDaGFuZ2VTb3VyY2VSZXF1aXJlZCA9IHRydWU7Ci0KLSAgICAvLyBjaGVjayBpZiB0aGUgbmV3IGFuZCBvbGQgc291cmNlIGFyZSBkdW1teQotICAgIHNwPE1lZGlhU291cmNlPiBhbkF1ZGlvU291cmNlID0gbUF1ZGlvUGxheWVyLT5nZXRTb3VyY2UoKTsKLSAgICBpZiAoYW5BdWRpb1NvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIEF1ZGlvIHBsYXllciBkb2VzIG5vdCBoYXZlIGFueSBzb3VyY2Ugc2V0LgotICAgICAgICBBTE9HVigic2V0QXVkaW9QbGF5ZXI6IEF1ZGlvIHBsYXllciBkb2VzIG5vdCBoYXZlIGFueSBzb3VyY2Ugc2V0Iik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBJZiBuZXcgdmlkZW8gc291cmNlIGlzIG5vdCBkdW1teSwgdGhlbiBhbHdheXMgY2hhbmdlIHNvdXJjZQotICAgIC8vIEVsc2UgYXVkaW8gcGxheWVyIGNvbnRpbnVlcyB1c2luZyBvbGQgYXVkaW8gc291cmNlIGFuZCB0aGVyZSBhcmUKLSAgICAvLyBmcmFtZSBkcm9wcyB0byBtYWludGFpbiBBViBzeW5jCi0gICAgc3A8TWV0YURhdGE+IG1ldGE7Ci0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1ldGEgPSBtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgICAgICBjb25zdCBjaGFyICpwVmlkU3JjVHlwZTsKLSAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAmcFZpZFNyY1R5cGUpKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKHBWaWRTcmNUeXBlLCAiRHVtbXlWaWRlb1NvdXJjZSIpICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiIFZpZGVvIGNsaXAgd2l0aCBzaWxlbnQgYXVkaW87IG5lZWQgdG8gY2hhbmdlIHNvdXJjZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGNvbnN0IGNoYXIgKnBTcmNUeXBlMTsKLSAgICBjb25zdCBjaGFyICpwU3JjVHlwZTI7Ci0gICAgbWV0YSA9IGFuQXVkaW9Tb3VyY2UtPmdldEZvcm1hdCgpOwotCi0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAmcFNyY1R5cGUxKSkgewotICAgICAgICBpZiAoc3RyY21wKHBTcmNUeXBlMSwgIkR1bW15QXVkaW9Tb3VyY2UiKSA9PSAwKSB7Ci0gICAgICAgICAgICBtZXRhID0gbUF1ZGlvU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgJnBTcmNUeXBlMikpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHBTcmNUeXBlMiwgIkR1bW15QXVkaW9Tb3VyY2UiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEp1c3Qgc2V0IHRoZSBuZXcgcGxheSBkdXJhdGlvbiBmb3IgdGhlIGV4aXN0aW5nIHNvdXJjZQotICAgICAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZSAqcE1lZGlhU3JjID0gYW5BdWRpb1NvdXJjZS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgRHVtbXlBdWRpb1NvdXJjZSAqcER1bW15QXVkaW9Tb3VyY2UgPSAoRHVtbXlBdWRpb1NvdXJjZSopcE1lZGlhU3JjOwotICAgICAgICAgICAgICAgICAgICAvL0luY3JlbWVudCB0aGUgZHVyYXRpb24gb2YgYXVkaW8gc291cmNlCi0gICAgICAgICAgICAgICAgICAgIHBEdW1teUF1ZGlvU291cmNlLT5zZXREdXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KSgobVBsYXlFbmRUaW1lTXNlYykqMTAwMExMKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCB0aGUgbmV3IGF1ZGlvIHNvdXJjZQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBjb250aW51ZSB1c2luZyBvbGQgc291cmNlCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRBdWRpb1BsYXllcjogc3RvcCBuZXcgYXVkaW8gc291cmNlIik7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1NvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvblN0cmVhbURvbmUoKSB7Ci0gICAgQUxPR1YoIm9uU3RyZWFtRG9uZSIpOwotICAgIC8vIFBvc3RlZCB3aGVuZXZlciBhbnkgc3RyZWFtIGZpbmlzaGVzIHBsYXlpbmcuCi0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmICghbVN0cmVhbURvbmVFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgaWYgKG1TdHJlYW1Eb25lU3RhdHVzICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgQUxPR1YoIk1FRElBX0VSUk9SICVkIiwgbVN0cmVhbURvbmVTdGF0dXMpOwotCi0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woCi0gICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIG1TdHJlYW1Eb25lU3RhdHVzKTsKLQotICAgICAgICBwYXVzZV9sKHRydWUgLyogYXQgZW9zICovKTsKLQotICAgICAgICBtRmxhZ3MgfD0gQVRfRU9TOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29uc3QgYm9vbCBhbGxEb25lID0KLSAgICAgICAgKG1WaWRlb1NvdXJjZSA9PSBOVUxMIHx8IChtRmxhZ3MgJiBWSURFT19BVF9FT1MpKQotICAgICAgICAgICAgJiYgKG1BdWRpb1NvdXJjZSA9PSBOVUxMIHx8IChtRmxhZ3MgJiBBVURJT19BVF9FT1MpKTsKLQotICAgIGlmICghYWxsRG9uZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1GbGFncyAmIChMT09QSU5HIHwgQVVUT19MT09QSU5HKSkgewotICAgICAgICBzZWVrVG9fbCgwKTsKLQotICAgICAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJNRURJQV9QTEFZQkFDS19DT01QTEVURSIpOwotICAgICAgICAvL3BhdXNlIGJlZm9yZSBzZW5kaW5nIGV2ZW50Ci0gICAgICAgIHBhdXNlX2wodHJ1ZSAvKiBhdCBlb3MgKi8pOwotCi0gICAgICAgIC8vVGhpcyBsb2NrIGlzIHVzZWQgdG8gc3luY3Jvbml6ZSBvblN0cmVhbURvbmUoKSBpbiBQcmV2aWV3UGxheWVyIGFuZAotICAgICAgICAvL3N0b3BQcmV2aWV3KCkgaW4gUHJldmlld0NvbnRyb2xsZXIKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrQ29udHJvbCk7Ci0gICAgICAgIC8qIE1ha2Ugc3VyZSBQcmV2aWV3UGxheWVyIG9ubHkgbm90aWZpZXMgTUVESUFfUExBWUJBQ0tfQ09NUExFVEUgb25jZSBmb3IgZWFjaCBjbGlwIQotICAgICAgICAgKiBJdCBoYXBwZW5zIHR3aWNlIGluIGZvbGxvd2luZyBzY2VuYXJpby4KLSAgICAgICAgICogVG8gbWFrZSB0aGUgY2xpcHMgaW4gcHJldmlldyBzdG9yeWJvYXJkIGFyZSBwbGF5ZWQgYW5kIHN3aXRjaGVkIHNtb290aGx5LAotICAgICAgICAgKiBQcmV2aWV3Q29udHJvbGxlciB1c2VzIHR3byBQcmV2aWV3UGxheWVyIGluc3RhbmNlcyBhbmQgb25lIEF1ZGlvUGxheWVyLgotICAgICAgICAgKiBUaGUgdHdvIFByZXZpZXdQbGF5ZXIgdXNlIHRoZSBzYW1lIEF1ZGlvUGxheWVyIHRvIHBsYXkgdGhlIGF1ZGlvLAotICAgICAgICAgKiBhbmQgY2hhbmdlIHRoZSBhdWRpbyBzb3VyY2Ugb2YgdGhlIEF1ZGlvUGxheWVyLgotICAgICAgICAgKiBJZiB0aGUgYXVkaW8gc291cmNlIG9mIGN1cnJlbnQgcGxheWluZyBjbGlwIGFuZCBuZXh0IGNsaXAgYXJlIGR1bW15Ci0gICAgICAgICAqIGF1ZGlvIHNvdXJjZShpbWFnZSBvciB2aWRlbyB3aXRob3V0IGF1ZGlvKSwgaXQgd2lsbCBub3QgY2hhbmdlIHRoZSBhdWRpbyBzb3VyY2UKLSAgICAgICAgICogdG8gYXZvaWQgdGhlICJhdWRpbyBnbGl0Y2giLCBhbmQga2VlcCB1c2luZyB0aGUgY3VycmVudCBhdWRpbyBzb3VyY2UuCi0gICAgICAgICAqIFdoZW4gdGhlIHZpZGVvIG9mIGN1cnJlbnQgY2xpcCByZWFjaGVkIHRoZSBFT1MsIFByZXZpZXdQbGF5ZXIgd2lsbCBzZXQgRU9TIGZsYWcKLSAgICAgICAgICogZm9yIHZpZGVvIGFuZCBhdWRpbywgYW5kIGl0IHdpbGwgbm90aWZ5IE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFLgotICAgICAgICAgKiBCdXQgdGhlIGF1ZGlvKGR1bW15IGF1ZGlvIHNvdXJjZSkgaXMgc3RpbGwgcGxheWluZyhmb3IgbmV4dCBjbGlwKSwKLSAgICAgICAgICogYW5kIHdoZW4gaXQgcmVhY2hlZCB0aGUgRU9TLCBhbmQgdmlkZW8gcmVhY2hlZCBFT1MsCi0gICAgICAgICAqIFByZXZpZXdQbGF5ZXIgd2lsbCBub3RpZnkgTUVESUFfUExBWUJBQ0tfQ09NUExFVEUgYWdhaW4uICovCi0gICAgICAgIGlmICghKG1GbGFncyAmIElORk9STUVEX0FWX0VPUykpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUExBWUJBQ0tfQ09NUExFVEUpOwotICAgICAgICAgICAgbUZsYWdzIHw9IElORk9STUVEX0FWX0VPUzsKLSAgICAgICAgfQotICAgICAgICBtRmxhZ3MgfD0gQVRfRU9TOwotICAgICAgICBBTE9HVigib25TdHJlYW1Eb25lIGVuZCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnBsYXlfbCgpIHsKLSAgICBBTE9HVigicGxheV9sIik7Ci0KLSAgICBtRmxhZ3MgJj0gflNFRUtfUFJFVklFVzsKLQotICAgIGlmIChtRmxhZ3MgJiBQTEFZSU5HKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgbVN0YXJ0TmV4dFBsYXllciA9IGZhbHNlOwotCi0gICAgaWYgKCEobUZsYWdzICYgUFJFUEFSRUQpKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHByZXBhcmVfbCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtRmxhZ3MgfD0gUExBWUlORzsKLSAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7Ci0KLSAgICBib29sIGRlZmVycmVkQXVkaW9TZWVrID0gZmFsc2U7Ci0KLSAgICBpZiAobUF1ZGlvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKG1BdWRpb1BsYXllciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXIgPSBuZXcgVmlkZW9FZGl0b3JBdWRpb1BsYXllcihtQXVkaW9TaW5rLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldFNvdXJjZShtQXVkaW9Tb3VyY2UpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFNldHRpbmdzKAotICAgICAgICAgICAgICAgICBtUHJldmlld1BsYXllckF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoCi0gICAgICAgICAgICAgICAgIG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKAotICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMsIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPUExBWUVSX1NUQVJURUQ7Ci0gICAgICAgICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBzdGFydGVkIHRoZSBNZWRpYVNvdXJjZSBpbiBvcmRlciB0byBlbmFibGUKLSAgICAgICAgICAgICAgICAvLyB0aGUgcHJlZmV0Y2hlciB0byByZWFkIGl0cyBkYXRhLgotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1BsYXllci0+c3RhcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgLy9kZWxldGUgbUF1ZGlvUGxheWVyOwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXIgPSBOVUxMOwotCi0gICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+KFBMQVlJTkcgfCBGSVJTVF9GUkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVRpbWVTb3VyY2UgPSBtQXVkaW9QbGF5ZXI7Ci0gICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPX1JVTk5JTkc7Ci0gICAgICAgICAgICAgICAgZGVmZXJyZWRBdWRpb1NlZWsgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm9vbCBpc0F1ZGlvUGxheWVyU3RhcnRlZCA9IG1BdWRpb1BsYXllci0+aXNTdGFydGVkKCk7Ci0KLSAgICAgICAgICAgIGlmIChtSXNDaGFuZ2VTb3VyY2VSZXF1aXJlZCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInBsYXlfbDogQ2hhbmdlIGF1ZGlvIHNvdXJjZSByZXF1aXJlZCIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzQXVkaW9QbGF5ZXJTdGFydGVkID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5wYXVzZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0U291cmNlKG1BdWRpb1NvdXJjZSk7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRPYnNlcnZlcih0aGlzKTsKLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0QXVkaW9NaXhTZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgbVByZXZpZXdQbGF5ZXJBdWRpb01peFNldHRpbmdzKTsKLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0QXVkaW9NaXhTdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCgKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTLCBtQ3VycmVudE1lZGlhQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzQXVkaW9QbGF5ZXJTdGFydGVkID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5yZXN1bWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gbUF1ZGlvUGxheWVyLT5zdGFydCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+KFBMQVlJTkcgfCBGSVJTVF9GUkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicGxheV9sOiBObyBTb3VyY2UgY2hhbmdlIHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMsIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnJlc3VtZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9QTEFZRVJfU1RBUlRFRDsKLSAgICAgICAgICAgIG1GbGFncyB8PSBBVURJT19SVU5OSU5HOwotICAgICAgICAgICAgbVRpbWVTb3VyY2UgPSBtQXVkaW9QbGF5ZXI7Ci0gICAgICAgICAgICBkZWZlcnJlZEF1ZGlvU2VlayA9IHRydWU7Ci0gICAgICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1UaW1lU291cmNlID09IE5VTEwgJiYgbUF1ZGlvUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgbVRpbWVTb3VyY2UgPSAmbVN5c3RlbVRpbWVTb3VyY2U7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBzZWVrIG9wdGlvbiBmb3IgSW1hZ2Ugc291cmNlIGZpbGVzIGFuZCByZWFkLgotICAgIC8vIFRoaXMgcmVzZXRzIHRoZSB0aW1lc3RhbXBpbmcgZm9yIGltYWdlIHBsYXkKLSAgICBpZiAobUlzVmlkZW9Tb3VyY2VKcGcpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgIE1lZGlhQnVmZmVyICphTG9jYWxCdWZmZXI7Ci0gICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKLSAgICAgICAgbVZpZGVvU291cmNlLT5yZWFkKCZhTG9jYWxCdWZmZXIsICZvcHRpb25zKTsKLSAgICAgICAgYUxvY2FsQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIEtpY2sgb2ZmIHZpZGVvIHBsYXliYWNrCi0gICAgICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKLSAgICB9Ci0KLSAgICBpZiAoZGVmZXJyZWRBdWRpb1NlZWspIHsKLSAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgc2VlayByZXF1ZXN0IHdoaWxlIHdlIHdlcmUgcGF1c2VkCi0gICAgICAgIC8vIGFuZCB3ZSdyZSBqdXN0IHN0YXJ0aW5nIHVwIGFnYWluLCBob25vciB0aGUgcmVxdWVzdCBub3cuCi0gICAgICAgIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKLSAgICB9Ci0KLSAgICBpZiAobUZsYWdzICYgQVRfRU9TKSB7Ci0gICAgICAgIC8vIExlZ2FjeSBiZWhhdmlvdXIsIGlmIGEgc3RyZWFtIGZpbmlzaGVzIHBsYXlpbmcgYW5kIHRoZW4KLSAgICAgICAgLy8gaXMgc3RhcnRlZCBhZ2Fpbiwgd2UgcGxheSBmcm9tIHRoZSBzdGFydC4uLgotICAgICAgICBzZWVrVG9fbCgwKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6aW5pdFJlbmRlcmVyX2woKSB7Ci0gICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKLSAgICAgICAgaWYobVZpZGVvUmVuZGVyZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBtTmF0aXZlV2luZG93UmVuZGVyZXItPmNyZWF0ZVJlbmRlcklucHV0KCk7Ci0gICAgICAgICAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTaXplVG9SZW5kZXIobVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNlZWtUbyhpbnQ2NF90IHRpbWVVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKChtRXh0cmFjdG9yRmxhZ3MgJiBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1NFRUspIHx8IChtSXNWaWRlb1NvdXJjZUpwZykpIHsKLSAgICAgICAgcmV0dXJuIHNlZWtUb19sKHRpbWVVcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmdldFZpZGVvRGltZW5zaW9ucygKLSAgICAgICAgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVZpZGVvV2lkdGggPCAwIHx8IG1WaWRlb0hlaWdodCA8IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgKndpZHRoID0gbVZpZGVvV2lkdGg7Ci0gICAgKmhlaWdodCA9IG1WaWRlb0hlaWdodDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjppbml0QXVkaW9EZWNvZGVyX2woKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtQXVkaW9UcmFjay0+Z2V0Rm9ybWF0KCk7Ci0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkgewotICAgICAgICBtQXVkaW9Tb3VyY2UgPSBtQXVkaW9UcmFjazsKLSAgICB9IGVsc2UgewotICAgICAgICBzcDxNZWRpYVNvdXJjZT4gYVJhd1NvdXJjZTsKLSAgICAgICAgYVJhd1NvdXJjZSA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgbUNsaWVudC5pbnRlcmZhY2UoKSwgbUF1ZGlvVHJhY2stPmdldEZvcm1hdCgpLAotICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBjcmVhdGVFbmNvZGVyCi0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2spOwotCi0gICAgICAgIGlmKGFSYXdTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgbUF1ZGlvU291cmNlID0gbmV3IFZpZGVvRWRpdG9yU1JDKGFSYXdTb3VyY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgaWYgKG1BdWRpb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgICAgICBzZXREdXJhdGlvbl9sKGR1cmF0aW9uVXMpOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NvdXJjZS0+c3RhcnQoKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBtQXVkaW9Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQKSkgewotICAgICAgICAvLyBGb3IgbGVnYWN5IHJlYXNvbnMgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGlnbm9yZSB0aGUgYWJzZW5jZQotICAgICAgICAvLyBvZiBhbiBhdWRpbyBkZWNvZGVyIGZvciBRQ0VMUCBpbnN0ZWFkIG9mIGFib3J0aW5nIHBsYXliYWNrCi0gICAgICAgIC8vIGFsdG9nZXRoZXIuCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICByZXR1cm4gbUF1ZGlvU291cmNlICE9IE5VTEwgPyBPSyA6IFVOS05PV05fRVJST1I7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmluaXRWaWRlb0RlY29kZXJfbCh1aW50MzJfdCBmbGFncykgewotICAgIGluaXRSZW5kZXJlcl9sKCk7Ci0KLSAgICBpZiAobVZpZGVvUmVuZGVyZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSByZW5kZXJlciIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtVmlkZW9Tb3VyY2UgPSBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICAgICAgbUNsaWVudC5pbnRlcmZhY2UoKSwgbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBtVmlkZW9UcmFjaywKLSAgICAgICAgICAgIE5VTEwsIGZsYWdzLCBtVmlkZW9SZW5kZXJlci0+Z2V0VGFyZ2V0V2luZG93KCkpOwotCi0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgaWYgKG1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgICAgICBzZXREdXJhdGlvbl9sKGR1cmF0aW9uVXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlU2l6ZVRvUmVuZGVyKG1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbVZpZGVvU291cmNlLT5zdGFydCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIG1WaWRlb1NvdXJjZS5jbGVhcigpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtVmlkZW9Tb3VyY2UgIT0gTlVMTCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLX0KLQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om9uVmlkZW9FdmVudCgpIHsKLSAgICB1aW50MzJfdCBpPTA7Ci0gICAgTTRPU0FfRVJSIGVycjEgPSBNNE5PX0VSUk9SOwotICAgIGludDY0X3QgaW1hZ2VGcmFtZVRpbWVVcyA9IDA7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmICghbVZpZGVvRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIC8vIFRoZSBldmVudCBoYXMgYmVlbiBjYW5jZWxsZWQgaW4gcmVzZXRfbCgpIGJ1dCBoYWQgYWxyZWFkeQotICAgICAgICAvLyBiZWVuIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uIGF0IHRoYXQgdGltZS4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSBmYWxzZTsKLQotICAgIGlmIChtRmxhZ3MgJiBTRUVLX1BSRVZJRVcpIHsKLSAgICAgICAgbUZsYWdzICY9IH5TRUVLX1BSRVZJRVc7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBUaW1lU291cmNlICp0c19zdCA9ICAmbVN5c3RlbVRpbWVTb3VyY2U7Ci0gICAgaW50NjRfdCB0aW1lU3RhcnRVcyA9IHRzX3N0LT5nZXRSZWFsVGltZVVzKCk7Ci0KLSAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotCi0gICAgICAgIGlmKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHNlZWsgdGhlIHZpZGVvIHNvdXJjZSBmaXJzdCwgZm9sbG93ZWQgYnkKLSAgICAgICAgICAgIC8vIHRoZSBhdWRpbyBzb3VyY2UuCi0gICAgICAgICAgICAvLyBJbiBvcmRlciB0byBhdm9pZCBqdW1wcyBpbiB0aGUgRGF0YVNvdXJjZSBvZmZzZXQgY2F1c2VkIGJ5Ci0gICAgICAgICAgICAvLyB0aGUgYXVkaW8gY29kZWMgcHJlZmV0Y2hpbmcgZGF0YSBmcm9tIHRoZSBvbGQgbG9jYXRpb25zCi0gICAgICAgICAgICAvLyB3aGlsZSB0aGUgdmlkZW8gY29kZWMgaXMgYWxyZWFkeSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgbmV3Ci0gICAgICAgICAgICAvLyBsb2NhdGlvbnMsIHdlJ2xsICJwYXVzZSIgdGhlIGF1ZGlvIHNvdXJjZSwgY2F1c2luZyBpdCB0bwotICAgICAgICAgICAgLy8gc3RvcCByZWFkaW5nIGlucHV0IGRhdGEgdW50aWwgYSBzdWJzZXF1ZW50IHNlZWsuCi0KLSAgICAgICAgICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCAmJiAobUZsYWdzICYgQVVESU9fUlVOTklORykpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgbUZsYWdzICY9IH5BVURJT19SVU5OSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUF1ZGlvU291cmNlLT5wYXVzZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFtVmlkZW9CdWZmZXIpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICBBTE9HVigiTFYgUExBWUVSIHNlZWtpbmcgdG8gJWxsZCB1cyAoJS4yZiBzZWNzKSIsIG1TZWVrVGltZVVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lVXMgLyAxRTYpOwotCi0gICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbygKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtVmlkZW9Tb3VyY2UtPnJlYWQoJm1WaWRlb0J1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soIW1WaWRlb0J1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkxWIFBMQVlFUiBWaWRlb1NvdXJjZSBzaWduYWxsZWQgZm9ybWF0IGNoYW5nZSIpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9SZW5kZXJlcklzUHJldmlldyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gaW5pdFJlbmRlcmVyX2woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2l6ZVRvUmVuZGVyKG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gU28gdmlkZW8gcGxheWJhY2sgaXMgY29tcGxldGUsIGJ1dCB3ZSBtYXkgc3RpbGwgaGF2ZQotICAgICAgICAgICAgICAgIC8vIGEgc2VlayByZXF1ZXN0IHBlbmRpbmcgdGhhdCBuZWVkcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBhdWRpbyB0cmFjawotICAgICAgICAgICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ2aWRlbyBzdHJlYW0gZW5kZWQgd2hpbGUgc2Vla2luZyEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KC0xKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiUHJldmlld1BsYXllcjogb25WaWRlb0V2ZW50IEVPUyByZWFjaGVkLiIpOwotICAgICAgICAgICAgICAgIG1GbGFncyB8PSBWSURFT19BVF9FT1M7Ci0gICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPX0FUX0VPUzsKLSAgICAgICAgICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBsYXN0IGRlY29kZWQgdGltZXN0YW1wIHRvIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgbURlY29kZWRWaWRlb1RzID0gKG1QbGF5RW5kVGltZU1zZWMqMTAwMExMKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVmlkZW9CdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBTb21lIGRlY29kZXJzLCBub3RhYmx5IHRoZSBQViBBVkMgc29mdHdhcmUgZGVjb2RlcgotICAgICAgICAgICAgICAgIC8vIHJldHVybiBzcHVyaW91cyBlbXB0eSBidWZmZXJzIHRoYXQgd2UganVzdCB3YW50IHRvIGlnbm9yZS4KLQotICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDY0X3QgdmlkZW9UaW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhtVmlkZW9CdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ2aWRlb1RpbWVVcykpOwotCi0gICAgICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgICAgIGlmICh2aWRlb1RpbWVVcyA8IG1TZWVrVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgYXJlIGJlZm9yZSBzZWVrIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZW0KLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYoKHZpZGVvVGltZVVzLzEwMDApIDwgbVBsYXlCZWdpblRpbWVNc2VjKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZyYW1lcyBhcmUgYmVmb3JlIGJlZ2luIGN1dCB0aW1lCi0gICAgICAgICAgICAgICAgICAgIC8vIERvbm90IHJlbmRlcgotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtTnVtYmVyRGVjVmlkZW9GcmFtZXMrKzsKLQotICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotICAgIHNldFBvc2l0aW9uX2wodGltZVVzKTsKLQotICAgIGlmICghbVN0YXJ0TmV4dFBsYXllcikgewotICAgICAgICBpbnQ2NF90IHBsYXliYWNrVGltZVJlbWFpbmluZyA9IChtUGxheUVuZFRpbWVNc2VjICogMTAwMExMKSAtIHRpbWVVczsKLSAgICAgICAgaWYgKHBsYXliYWNrVGltZVJlbWFpbmluZyA8PSAxNTAwMDAwKSB7Ci0gICAgICAgICAgICAvL1doZW4gbGVzcyB0aGFuIDEuNSBzZWMgb2YgcGxheWJhY2sgbGVmdAotICAgICAgICAgICAgLy8gc2VuZCBub3RpZmljYXRpb24gdG8gc3RhcnQgbmV4dCBwbGF5ZXIKLQotICAgICAgICAgICAgbVN0YXJ0TmV4dFBsYXllciA9IHRydWU7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKDB4QUFBQUFBQUEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU2Vla1R5cGUgd2FzU2Vla2luZyA9IG1TZWVraW5nOwotICAgIGZpbmlzaFNlZWtJZk5lY2Vzc2FyeSh0aW1lVXMpOwotICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCAmJiAhKG1GbGFncyAmIChBVURJT19SVU5OSU5HKSkpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gc3RhcnRBdWRpb1BsYXllcl9sKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJTdGFydGluZyB0aGUgYXVkaW8gcGxheWVyIGZhaWxlZCB3LyBlcnIgJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgVGltZVNvdXJjZSAqdHMgPSAobUZsYWdzICYgQVVESU9fQVRfRU9TKSA/ICZtU3lzdGVtVGltZVNvdXJjZSA6IG1UaW1lU291cmNlOwotCi0gICAgaWYodHMgPT0gTlVMTCkgewotICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmKCFtSXNWaWRlb1NvdXJjZUpwZykgewotICAgICAgICBpZiAobUZsYWdzICYgRklSU1RfRlJBTUUpIHsKLSAgICAgICAgICAgIG1GbGFncyAmPSB+RklSU1RfRlJBTUU7Ci0KLSAgICAgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IHRzLT5nZXRSZWFsVGltZVVzKCkgLSB0aW1lVXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQ2NF90IHJlYWxUaW1lVXMsIG1lZGlhVGltZVVzOwotICAgICAgICBpZiAoIShtRmxhZ3MgJiBBVURJT19BVF9FT1MpICYmIG1BdWRpb1BsYXllciAhPSBOVUxMCi0gICAgICAgICAgICAmJiBtQXVkaW9QbGF5ZXItPmdldE1lZGlhVGltZU1hcHBpbmcoJnJlYWxUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKLSAgICAgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IHJlYWxUaW1lVXMgLSBtZWRpYVRpbWVVczsKLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3Qgbm93VXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOwotCi0gICAgICAgIGludDY0X3QgbGF0ZW5lc3NVcyA9IG5vd1VzIC0gdGltZVVzOwotCi0gICAgICAgIGlmICh3YXNTZWVraW5nICE9IE5PX1NFRUspIHsKLSAgICAgICAgICAgIC8vIExldCdzIGRpc3BsYXkgdGhlIGZpcnN0IGZyYW1lIGFmdGVyIHNlZWtpbmcgcmlnaHQgYXdheS4KLSAgICAgICAgICAgIGxhdGVuZXNzVXMgPSAwOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJBdWRpbyB0aW1lIHN0YW1wID0gJWxsZCBhbmQgdmlkZW8gdGltZSBzdGFtcCA9ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cy0+Z2V0UmVhbFRpbWVVcygpLHRpbWVVcyk7Ci0gICAgICAgIGlmIChsYXRlbmVzc1VzID4gNDAwMDApIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIG1vcmUgdGhhbiA0MG1zIGxhdGUuCi0KLSAgICAgICAgICAgIEFMT0dWKCJMViBQTEFZRVIgd2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmVzc1VzLCBsYXRlbmVzc1VzIC8gMUU2KTsKLQotICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsYXRlbmVzc1VzIDwgLTI1MDAwKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBtb3JlIHRoYW4gMjVtcyBlYXJseS4KLSAgICAgICAgICAgIEFMT0dWKCJXZSdyZSBtb3JlIHRoYW4gMjVtcyBlYXJseSwgbGF0ZW5lc3MgJWxsZCIsIGxhdGVuZXNzVXMpOwotCi0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDI1MDAwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtVmlkZW9SZW5kZXJlcklzUHJldmlldyB8fCBtVmlkZW9SZW5kZXJlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3ID0gZmFsc2U7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gaW5pdFJlbmRlcmVyX2woKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiB0aW1lc3RhbXAgZXhjZWVkcyBlbmRDdXRUaW1lIG9mIGNsaXAsIGRvbm90IHJlbmRlcgotICAgIGlmKCh0aW1lVXMvMTAwMCkgPiBtUGxheUVuZFRpbWVNc2VjKSB7Ci0gICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOwotICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICBBTE9HVigiUHJldmlld1BsYXllcjogb25WaWRlb0V2ZW50IHRpbWVVcyA+IG1QbGF5RW5kVGltZTsgc2VuZCBFT1MuLiIpOwotICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgICAgIC8vIFNldCB0aGUgbGFzdCBkZWNvZGVkIHRpbWVzdGFtcCB0byBkdXJhdGlvbgotICAgICAgICBtRGVjb2RlZFZpZGVvVHMgPSAobVBsYXlFbmRUaW1lTXNlYyoxMDAwTEwpOwotICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woRVJST1JfRU5EX09GX1NUUkVBTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gQ2FwdHVyZSB0aGUgZnJhbWUgdGltZXN0YW1wIHRvIGJlIHJlbmRlcmVkCi0gICAgbURlY29kZWRWaWRlb1RzID0gdGltZVVzOwotCi0gICAgLy8gUG9zdCBwcm9jZXNzaW5nIHRvIGFwcGx5IHZpZGVvIGVmZmVjdHMKLSAgICBmb3IoaT0wO2k8bU51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIGVmZmVjdCBzdGFydHRpbWUgbWF0Y2hlcyB0aGUgY2xpcCBiZWluZyBwcmV2aWV3ZWQKLSAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPCAobURlY1ZpZGVvVHNTdG9yeUJvYXJkLzEwMDApKSB8fAotICAgICAgICAobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA+PQotICAgICAgICAgKChtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQvMTAwMCkgKyBtUGxheUVuZFRpbWVNc2VjIC0gbVBsYXlCZWdpblRpbWVNc2VjKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoaXMgZWZmZWN0IGRvZXNuJ3QgYmVsb25nIHRvIHRoaXMgY2xpcCwgY2hlY2sgbmV4dCBvbmUKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIGlmIGVmZmVjdCBhcHBsaWVzIHRvIHRoaXMgcGFydGljdWxhciBmcmFtZSB0aW1lc3RhbXAKLSAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPD0KLSAgICAgICAgICgoKHRpbWVVcyttRGVjVmlkZW9Uc1N0b3J5Qm9hcmQpLzEwMDApLW1QbGF5QmVnaW5UaW1lTXNlYykpICYmCi0gICAgICAgICAgICAoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUrbUVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uKSA+PQotICAgICAgICAgICAgICgoKHRpbWVVcyttRGVjVmlkZW9Uc1N0b3J5Qm9hcmQpLzEwMDApLW1QbGF5QmVnaW5UaW1lTXNlYykpCi0gICAgICAgICAgICAgICYmIChtRWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24gIT0gMCkpIHsKLSAgICAgICAgICAgIHNldFZpZGVvUG9zdFByb2Nlc3NpbmdOb2RlKAotICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlLCBUUlVFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNldFZpZGVvUG9zdFByb2Nlc3NpbmdOb2RlKAotICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlLCBGQUxTRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL1Byb3ZpZGUgdGhlIG92ZXJsYXkgVXBkYXRlIGluZGljYXRpb24gd2hlbiB0aGVyZSBpcyBhbiBvdmVybGF5IGVmZmVjdAotICAgIGlmIChtQ3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZSQU1JTkcpIHsKLSAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCAmPSB+VklERU9fRUZGRUNUX0ZSQU1JTkc7IC8vbmV2ZXIgYXBwbHkgZnJhbWluZyBoZXJlLgotICAgICAgICBpZiAoIW1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQpIHsKLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQotICAgICAgICAgICAgTTRPU0FfVUludDMyIGluZGV4OwotICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbU51bWJlckVmZmVjdHM7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGltZU1zID0gbURlY29kZWRWaWRlb1RzLzEwMDA7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRpbWVPZmZzZXQgPSBtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQvMTAwMDsKLSAgICAgICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2luZGV4XS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUpTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZykgewotICAgICAgICAgICAgICAgICAgICBpZiAoKChtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aVN0YXJ0VGltZSArIDEpIDw9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lTXMgKyB0aW1lT2Zmc2V0IC0gbVBsYXlCZWdpblRpbWVNc2VjKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aVN0YXJ0VGltZSAtIDEgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpbmRleF0udWlEdXJhdGlvbikgPj0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVNcyArIHRpbWVPZmZzZXQgLSBtUGxheUJlZ2luVGltZU1zZWMpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbmRleCA8IG1OdW1iZXJFZmZlY3RzKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJGcmFtaW5nRWZmZWN0SW5kZXggPSBpbmRleDsKLSAgICAgICAgICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBwb3N0T3ZlcmxheVVwZGF0ZUV2ZW50X2woKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiRnJhbWluZyBpbmRleCA9ICVsZCIsIG1DdXJyRnJhbWluZ0VmZmVjdEluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk5vIGZyYW1pbmcgZWZmZWN0cyBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQpIHsKLSAgICAgICAgLy9Qb3N0IHRoZSBldmVudCB3aGVuIHRoZSBvdmVybGF5IGlzIG5vIG1vcmUgdmFsaWQKLSAgICAgICAgQUxPR1YoIk92ZXJsYXkgaXMgRG9uZSIpOwotICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgICAgIHBvc3RPdmVybGF5VXBkYXRlRXZlbnRfbCgpOwotICAgIH0KLQotICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb1JlbmRlcmVyLT5yZW5kZXIobVZpZGVvQnVmZmVyLCBtQ3VycmVudFZpZGVvRWZmZWN0LAotICAgICAgICAgICAgICAgIG1SZW5kZXJpbmdNb2RlLCBtSXNWaWRlb1NvdXJjZUpwZyk7Ci0gICAgfQotCi0gICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLQotICAgIC8vIFBvc3QgcHJvZ3Jlc3MgY2FsbGJhY2sgYmFzZWQgb24gY2FsbGJhY2sgaW50ZXJ2YWwgc2V0Ci0gICAgaWYobU51bWJlckRlY1ZpZGVvRnJhbWVzID49IG1Qcm9ncmVzc0NiSW50ZXJ2YWwpIHsKLSAgICAgICAgcG9zdFByb2dyZXNzQ2FsbGJhY2tFdmVudF9sKCk7Ci0gICAgICAgIG1OdW1iZXJEZWNWaWRlb0ZyYW1lcyA9IDA7ICAvLyByZXNldCBjb3VudGVyCi0gICAgfQotCi0gICAgLy8gaWYgcmVhY2hlZCBFbmRDdXRUaW1lIG9mIGNsaXAsIHBvc3QgRU9TIGV2ZW50Ci0gICAgaWYoKHRpbWVVcy8xMDAwKSA+PSBtUGxheUVuZFRpbWVNc2VjKSB7Ci0gICAgICAgIEFMT0dWKCJQcmV2aWV3UGxheWVyOiBvblZpZGVvRXZlbnQgRU9TLiIpOwotICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOwotICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgICAgIC8vIFNldCB0aGUgbGFzdCBkZWNvZGVkIHRpbWVzdGFtcCB0byBkdXJhdGlvbgotICAgICAgICBtRGVjb2RlZFZpZGVvVHMgPSAobVBsYXlFbmRUaW1lTXNlYyoxMDAwTEwpOwotICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woRVJST1JfRU5EX09GX1NUUkVBTSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoKHdhc1NlZWtpbmcgIT0gTk9fU0VFSykgJiYgKG1GbGFncyAmIFNFRUtfUFJFVklFVykpIHsKLSAgICAgICAgICAgIG1GbGFncyAmPSB+U0VFS19QUkVWSUVXOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIW1Jc1ZpZGVvU291cmNlSnBnKSB7Ci0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgzMzAwMCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnByZXBhcmUoKSB7Ci0gICAgQUxPR1YoInByZXBhcmUiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBwcmVwYXJlX2woKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cHJlcGFyZV9sKCkgewotICAgIEFMT0dWKCJwcmVwYXJlX2wiKTsKLSAgICBpZiAobUZsYWdzICYgUFJFUEFSRUQpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbUlzQXN5bmNQcmVwYXJlID0gZmFsc2U7Ci0gICAgc3RhdHVzX3QgZXJyID0gcHJlcGFyZUFzeW5jX2woKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICB3aGlsZSAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1QcmVwYXJlZENvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVByZXBhcmVSZXN1bHQ7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnByZXBhcmVBc3luYygpIHsKLSAgICBBTE9HVigicHJlcGFyZUFzeW5jIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gcHJlcGFyZUFzeW5jX2woKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cHJlcGFyZUFzeW5jX2woKSB7Ci0gICAgQUxPR1YoInByZXBhcmVBc3luY19sIik7Ci0gICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIGFzeW5jIHByZXBhcmUgYWxyZWFkeSBwZW5kaW5nCi0gICAgfQotCi0gICAgaWYgKCFtUXVldWVTdGFydGVkKSB7Ci0gICAgICAgIG1RdWV1ZS5zdGFydCgpOwotICAgICAgICBtUXVldWVTdGFydGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBtRmxhZ3MgfD0gUFJFUEFSSU5HOwotICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQoCi0gICAgICAgICAgICB0aGlzLCAmUHJldmlld1BsYXllcjo6b25QcmVwYXJlQXN5bmNFdmVudCk7Ci0KLSAgICBtUXVldWUucG9zdEV2ZW50KG1Bc3luY1ByZXBhcmVFdmVudCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmZpbmlzaFNldERhdGFTb3VyY2VfbCgpIHsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlOwotICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3I7Ci0KLSAgICBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShtVXJpLnN0cmluZygpLCBOVUxMKTsKLQotICAgIGlmIChkYXRhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgLy9JZiBmaWxlIHR5cGUgaXMgLnJnYiwgdGhlbiBubyBuZWVkIHRvIGNoZWNrIGZvciBFeHRyYWN0b3IKLSAgICBpbnQgdXJpTGVuID0gc3RybGVuKG1VcmkpOwotICAgIGludCBzdGFydE9mZnNldCA9IHVyaUxlbiAtIDQ7Ci0gICAgaWYoIXN0cm5jYXNlY21wKG1Vcmkrc3RhcnRPZmZzZXQsICIucmdiIiwgNCkpIHsKLSAgICAgICAgZXh0cmFjdG9yID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQpOwotICAgIH0KLQotICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiZmluaXNoU2V0RGF0YVNvdXJjZV9sOiBmYWlsZWQgdG8gY3JlYXRlIGV4dHJhY3RvciIpOwotICAgICAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sX2pwZygpOwotICAgIH0KLQotICAgIHJldHVybiBzZXREYXRhU291cmNlX2woZXh0cmFjdG9yKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvblByZXBhcmVBc3luY0V2ZW50KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jRXZlbnQiKTsKLQotICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJFX0NBTkNFTExFRCkgewotICAgICAgICBBTE9HVigicHJlcGFyZSB3YXMgY2FuY2VsbGVkIGJlZm9yZSBkb2luZyBhbnl0aGluZyIpOwotICAgICAgICBhYm9ydFByZXBhcmUoVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobVVyaS5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGZpbmlzaFNldERhdGFTb3VyY2VfbCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGFib3J0UHJlcGFyZShlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1WaWRlb1RyYWNrICE9IE5VTEwgJiYgbVZpZGVvU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gaW5pdFZpZGVvRGVjb2Rlcl9sKE9NWENvZGVjOjprSGFyZHdhcmVDb2RlY3NPbmx5KTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBhYm9ydFByZXBhcmUoZXJyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMICYmIG1BdWRpb1NvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGluaXRBdWRpb0RlY29kZXJfbCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGFib3J0UHJlcGFyZShlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7Ci0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpmaW5pc2hBc3luY1ByZXBhcmVfbCgpIHsKLSAgICBBTE9HVigiZmluaXNoQXN5bmNQcmVwYXJlX2wiKTsKLSAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7Ci0gICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRVRfVklERU9fU0laRSwgMCwgMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUFJFUEFSRUQpOwotICAgIH0KLQotICAgIG1QcmVwYXJlUmVzdWx0ID0gT0s7Ci0gICAgbUZsYWdzICY9IH4oUFJFUEFSSU5HfFBSRVBBUkVfQ0FOQ0VMTEVEKTsKLSAgICBtRmxhZ3MgfD0gUFJFUEFSRUQ7Ci0gICAgbUFzeW5jUHJlcGFyZUV2ZW50ID0gTlVMTDsKLSAgICBtUHJlcGFyZWRDb25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6YWNxdWlyZUxvY2soKSB7Ci0gICAgQUxPR1YoImFjcXVpcmVMb2NrIik7Ci0gICAgbUxvY2tDb250cm9sLmxvY2soKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpyZWxlYXNlTG9jaygpIHsKLSAgICBBTE9HVigicmVsZWFzZUxvY2siKTsKLSAgICBtTG9ja0NvbnRyb2wudW5sb2NrKCk7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmxvYWRFZmZlY3RzU2V0dGluZ3MoCi0gICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdFNldHRpbmdzLCBpbnQgbkVmZmVjdHMpIHsKLQotICAgIEFMT0dWKCJsb2FkRWZmZWN0c1NldHRpbmdzIik7Ci0gICAgbU51bWJlckVmZmVjdHMgPSBuRWZmZWN0czsKLSAgICBtRWZmZWN0c1NldHRpbmdzID0gcEVmZmVjdFNldHRpbmdzOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6bG9hZEF1ZGlvTWl4U2V0dGluZ3MoCi0gICAgICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5ncykgewotCi0gICAgQUxPR1YoImxvYWRBdWRpb01peFNldHRpbmdzIik7Ci0gICAgbVByZXZpZXdQbGF5ZXJBdWRpb01peFNldHRpbmdzID0gcEF1ZGlvTWl4U2V0dGluZ3M7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoCi0gICAgICAgIE00T1NBX0NvbnRleHQgcEF1ZGlvTWl4UENNRmlsZUhhbmRsZSkgewotCi0gICAgQUxPR1YoInNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZSIpOwotICAgIG1BdWRpb01peFBDTUZpbGVIYW5kbGUgPSBwQXVkaW9NaXhQQ01GaWxlSGFuZGxlOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oCi0gICAgICAgIE00T1NBX1VJbnQzMiBhdWRpb01peFN0b3J5Qm9hcmRUUywKLSAgICAgICAgTTRPU0FfVUludDMyIGN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwKLSAgICAgICAgTTRPU0FfVUludDMyIHByaW1hcnlUcmFja1ZvbFZhbHVlICkgewotCi0gICAgQUxPR1YoInNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtIik7Ci0gICAgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTID0gYXVkaW9NaXhTdG9yeUJvYXJkVFM7Ci0gICAgbUN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSA9IGN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZTsKLSAgICBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWUgPSBwcmltYXJ5VHJhY2tWb2xWYWx1ZTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldFBsYXliYWNrQmVnaW5UaW1lKHVpbnQzMl90IG1zZWMpIHsKLQotICAgIG1QbGF5QmVnaW5UaW1lTXNlYyA9IG1zZWM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRQbGF5YmFja0VuZFRpbWUodWludDMyX3QgbXNlYykgewotCi0gICAgbVBsYXlFbmRUaW1lTXNlYyA9IG1zZWM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRTdG9yeWJvYXJkU3RhcnRUaW1lKHVpbnQzMl90IG1zZWMpIHsKLQotICAgIG1TdG9yeWJvYXJkU3RhcnRUaW1lTXNlYyA9IG1zZWM7Ci0gICAgbURlY1ZpZGVvVHNTdG9yeUJvYXJkID0gbVN0b3J5Ym9hcmRTdGFydFRpbWVNc2VjICogMTAwMExMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0UHJvZ3Jlc3NDYWxsYmFja0ludGVydmFsKHVpbnQzMl90IGNiSW50ZXJ2YWwpIHsKLQotICAgIG1Qcm9ncmVzc0NiSW50ZXJ2YWwgPSBjYkludGVydmFsOwotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRNZWRpYVJlbmRlcmluZ01vZGUoCi0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyBtb2RlLAotICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpIHsKLQotICAgIG1SZW5kZXJpbmdNb2RlID0gbW9kZTsKLQotICAgIC8qIGdldCB0aGUgdmlkZW8gd2lkdGggYW5kIGhlaWdodCBieSByZXNvbHV0aW9uICovCi0gICAgcmV0dXJuIGdldFZpZGVvU2l6ZUJ5UmVzb2x1dGlvbigKLSAgICAgICAgICAgICAgICBvdXRwdXRWaWRlb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICZtT3V0cHV0VmlkZW9XaWR0aCwgJm1PdXRwdXRWaWRlb0hlaWdodCk7Ci0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCgpIHsKLQotICAgIG1EZWNWaWRlb1RzU3RvcnlCb2FyZCA9IG1TdG9yeWJvYXJkU3RhcnRUaW1lTXNlYyAqIDEwMDBMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdFByb2dyZXNzQ2FsbGJhY2tFdmVudF9sKCkgewotICAgIGlmIChtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1Qcm9ncmVzc0NiRXZlbnRQZW5kaW5nID0gdHJ1ZTsKLQotICAgIG1RdWV1ZS5wb3N0RXZlbnQobVByb2dyZXNzQ2JFdmVudCk7Ci19Ci0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvblByb2dyZXNzQ2JFdmVudCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmICghbVByb2dyZXNzQ2JFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIC8vIElmIHBsYXliYWNrIHN0YXJ0cyBmcm9tIHByZXZpb3VzIEktZnJhbWUsCi0gICAgLy8gdGhlbiBzZW5kIGZyYW1lIHN0b3J5Ym9hcmQgZHVyYXRpb24KLSAgICBpZiAoKG1EZWNvZGVkVmlkZW9Ucy8xMDAwKSA8IG1QbGF5QmVnaW5UaW1lTXNlYykgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIDAsIG1EZWNWaWRlb1RzU3RvcnlCb2FyZC8xMDAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIDAsCi0gICAgICAgICgoKG1EZWNvZGVkVmlkZW9UcyttRGVjVmlkZW9Uc1N0b3J5Qm9hcmQpLzEwMDApLW1QbGF5QmVnaW5UaW1lTXNlYykpOwotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0T3ZlcmxheVVwZGF0ZUV2ZW50X2woKSB7Ci0gICAgaWYgKG1PdmVybGF5VXBkYXRlRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnQobU92ZXJsYXlVcGRhdGVFdmVudCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6b25VcGRhdGVPdmVybGF5RXZlbnQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmICghbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgaW50IHVwZGF0ZVN0YXRlID0gbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZD8gMTogMDsKLSAgICBub3RpZnlMaXN0ZW5lcl9sKDB4QkJCQkJCQkIsIHVwZGF0ZVN0YXRlLCBtQ3VyckZyYW1pbmdFZmZlY3RJbmRleCk7Ci19Ci0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRWaWRlb1Bvc3RQcm9jZXNzaW5nTm9kZSgKLSAgICAgICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0eXBlLCBNNE9TQV9Cb29sIGVuYWJsZSkgewotCi0gICAgdWludDMyX3QgZWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0KLSAgICAvL01hcCBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHRvIGxvY2FsIGVudW0KLSAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVGcm9tQmxhY2s6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRkFERUZST01CTEFDSzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2s6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRkFERVRPQkxBQ0s7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfQkxBQ0tBTkRXSElURTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluazoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9QSU5LOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbjoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9HUkVFTjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWE6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfU0VQSUE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX05FR0FUSVZFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZSQU1JTkc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXM6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRklGVElFUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9DT0xPUl9SR0IxNjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfR1JBRElFTlQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoZW5hYmxlID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgLy9JZiBhbHJlYWR5IHNldCwgdGhlbiBubyBuZWVkIHRvIHNldCBhZ2FpbgotICAgICAgICBpZiAoIShtQ3VycmVudFZpZGVvRWZmZWN0ICYgZWZmZWN0KSkgewotICAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCB8PSBlZmZlY3Q7Ci0gICAgICAgICAgICBpZiAoZWZmZWN0ID09IFZJREVPX0VGRkVDVF9GSUZUSUVTKSB7Ci0gICAgICAgICAgICAgICAgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlICB7Ci0gICAgICAgIC8vUmVzZXQgb25seSBpZiBhbHJlYWR5IHNldAotICAgICAgICBpZiAobUN1cnJlbnRWaWRlb0VmZmVjdCAmIGVmZmVjdCkgewotICAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCAmPSB+ZWZmZWN0OwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKHVpbnQzMl90IHdpZHRoLHVpbnQzMl90IGhlaWdodCkgewotICAgIG1WaWRlb1dpZHRoID0gd2lkdGg7Ci0gICAgbVZpZGVvSGVpZ2h0ID0gaGVpZ2h0OwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cmVhZEZpcnN0VmlkZW9GcmFtZSgpIHsKLSAgICBBTE9HVigicmVhZEZpcnN0VmlkZW9GcmFtZSIpOwotCi0gICAgaWYgKCFtVmlkZW9CdWZmZXIpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICBBTE9HVigic2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpIiwgbVNlZWtUaW1lVXMsCi0gICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzIC8gMUU2KTsKLQotICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oCi0gICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVZpZGVvU291cmNlLT5yZWFkKCZtVmlkZW9CdWZmZXIsICZvcHRpb25zKTsKLSAgICAgICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIENIRUNLKCFtVmlkZW9CdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb1NvdXJjZSBzaWduYWxsZWQgZm9ybWF0IGNoYW5nZSIpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9SZW5kZXJlcklzUHJldmlldyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gaW5pdFJlbmRlcmVyX2woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNpemVUb1JlbmRlcihtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJFT1MgcmVhY2hlZC4iKTsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOwotICAgICAgICAgICAgICAgIG1GbGFncyB8PSBBVURJT19BVF9FT1M7Ci0gICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVZpZGVvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gU29tZSBkZWNvZGVycywgbm90YWJseSB0aGUgUFYgQVZDIHNvZnR3YXJlIGRlY29kZXIKLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gc3B1cmlvdXMgZW1wdHkgYnVmZmVycyB0aGF0IHdlIGp1c3Qgd2FudCB0byBpZ25vcmUuCi0KLSAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IHZpZGVvVGltZVVzOwotICAgICAgICAgICAgQ0hFQ0sobVZpZGVvQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdmlkZW9UaW1lVXMpKTsKLSAgICAgICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvVGltZVVzIDwgbVNlZWtUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVycyBhcmUgYmVmb3JlIHNlZWsgdGltZQotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlbQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoKHZpZGVvVGltZVVzLzEwMDApIDwgbVBsYXlCZWdpblRpbWVNc2VjKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgYXJlIGJlZm9yZSBiZWdpbiBjdXQgdGltZQotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlbQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhtVmlkZW9CdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKLSAgICBzZXRQb3NpdGlvbl9sKHRpbWVVcyk7Ci0KLSAgICBtRGVjb2RlZFZpZGVvVHMgPSB0aW1lVXM7Ci0KLSAgICByZXR1cm4gT0s7Ci0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6Z2V0TGFzdFJlbmRlcmVkVGltZU1zKHVpbnQzMl90ICpsYXN0UmVuZGVyZWRUaW1lTXMpIHsKLSAgICAqbGFzdFJlbmRlcmVkVGltZU1zID0gKCgobURlY29kZWRWaWRlb1RzK21EZWNWaWRlb1RzU3RvcnlCb2FyZCkvMTAwMCktbVBsYXlCZWdpblRpbWVNc2VjKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6dXBkYXRlU2l6ZVRvUmVuZGVyKHNwPE1ldGFEYXRhPiBtZXRhKSB7Ci0gICAgaWYgKG1WaWRlb1JlbmRlcmVyKSB7Ci0gICAgICAgIG1WaWRlb1JlbmRlcmVyLT51cGRhdGVWaWRlb1NpemUobWV0YSk7Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldExpc3RlbmVyKGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnJlc2V0KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmVzZXRfbCgpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OmNsZWFyX2woKSB7Ci0gICAgbURpc3BsYXlXaWR0aCA9IDA7Ci0gICAgbURpc3BsYXlIZWlnaHQgPSAwOwotCi0gICAgaWYgKG1GbGFncyAmIFBMQVlJTkcpIHsKLSAgICAgICAgdXBkYXRlQmF0dGVyeVVzYWdlX2woKTsKLSAgICB9Ci0KLSAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1GbGFncyB8PSBQUkVQQVJFX0NBTkNFTExFRDsKLQotICAgICAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgLy8gV2UgYXJlIGJhc2ljYWxseSBkb25lIHByZXBhcmluZywgd2UncmUganVzdCBidWZmZXJpbmcKLSAgICAgICAgICAgIC8vIGVub3VnaCBkYXRhIHRvIHN0YXJ0IHBsYXliYWNrLCB3ZSBjYW4gc2FmZWx5IGludGVycnVwdCB0aGF0LgotICAgICAgICAgICAgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgbVByZXBhcmVkQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGNhbmNlbFBsYXllckV2ZW50c19sKHRydWUpOwotCi0gICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKLSAgICBtVmlkZW9UcmFjay5jbGVhcigpOwotCi0gICAgLy8gU2h1dGRvd24gYXVkaW8gZmlyc3QsIHNvIHRoYXQgdGhlIHJlc3BvbmUgdG8gdGhlIHJlc2V0IHJlcXVlc3QKLSAgICAvLyBhcHBlYXJzIHRvIGhhcHBlbiBpbnN0YW50YW5lb3VzbHkgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZAotICAgIC8vIElmIHdlIGRpZCB0aGlzIGxhdGVyLCBhdWRpbyB3b3VsZCBjb250aW51ZSBwbGF5aW5nIHdoaWxlIHdlCi0gICAgLy8gc2h1dGRvd24gdGhlIHZpZGVvLXJlbGF0ZWQgcmVzb3VyY2VzIGFuZCB0aGUgcGxheWVyIGFwcGVhciB0bwotICAgIC8vIG5vdCBiZSBhcyByZXNwb25zaXZlIHRvIGEgcmVzZXQgcmVxdWVzdC4KLSAgICBpZiAobUF1ZGlvUGxheWVyID09IE5VTEwgJiYgbUF1ZGlvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gSWYgd2UgaGFkIGFuIGF1ZGlvIHBsYXllciwgaXQgd291bGQgaGF2ZSBlZmZlY3RpdmVseQotICAgICAgICAvLyB0YWtlbiBwb3NzZXNzaW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UgYW5kIHN0b3BwZWQgaXQgd2hlbgotICAgICAgICAvLyBfaXRfIGlzIHN0b3BwZWQuIE90aGVyd2lzZSB0aGlzIGlzIHN0aWxsIG91ciByZXNwb25zaWJpbGl0eS4KLSAgICAgICAgbUF1ZGlvU291cmNlLT5zdG9wKCk7Ci0gICAgfQotICAgIG1BdWRpb1NvdXJjZS5jbGVhcigpOwotCi0gICAgbVRpbWVTb3VyY2UgPSBOVUxMOwotCi0gICAgZGVsZXRlIG1BdWRpb1BsYXllcjsKLSAgICBtQXVkaW9QbGF5ZXIgPSBOVUxMOwotCi0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNodXRkb3duVmlkZW9EZWNvZGVyX2woKTsKLSAgICB9Ci0KLSAgICBtRHVyYXRpb25VcyA9IC0xOwotICAgIG1GbGFncyA9IDA7Ci0gICAgbUV4dHJhY3RvckZsYWdzID0gMDsKLSAgICBtVGltZVNvdXJjZURlbHRhVXMgPSAwOwotICAgIG1WaWRlb1RpbWVVcyA9IDA7Ci0KLSAgICBtU2Vla2luZyA9IE5PX1NFRUs7Ci0gICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gZmFsc2U7Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotCi0gICAgbVVyaS5zZXRUbygiIik7Ci0KLSAgICBtQml0cmF0ZSA9IC0xOwotICAgIG1MYXN0VmlkZW9UaW1lVXMgPSAtMTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpub3RpZnlMaXN0ZW5lcl9sKGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikgewotICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLQotICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudChtc2csIGV4dDEsIGV4dDIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om9uVmlkZW9MYWdVcGRhdGUoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1WaWRlb0xhZ0V2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1WaWRlb0xhZ0V2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgaW50NjRfdCBhdWRpb1RpbWVVcyA9IG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lVXMoKTsKLSAgICBpbnQ2NF90IHZpZGVvTGF0ZUJ5VXMgPSBhdWRpb1RpbWVVcyAtIG1WaWRlb1RpbWVVczsKLQotICAgIGlmICghKG1GbGFncyAmIFZJREVPX0FUX0VPUykgJiYgdmlkZW9MYXRlQnlVcyA+IDMwMDAwMGxsKSB7Ci0gICAgICAgIEFMT0dWKCJ2aWRlbyBsYXRlIGJ5ICVsbGQgbXMuIiwgdmlkZW9MYXRlQnlVcyAvIDEwMDBsbCk7Ci0KLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbCgKLSAgICAgICAgICAgICAgICBNRURJQV9JTkZPLAotICAgICAgICAgICAgICAgIE1FRElBX0lORk9fVklERU9fVFJBQ0tfTEFHR0lORywKLSAgICAgICAgICAgICAgICB2aWRlb0xhdGVCeVVzIC8gMTAwMGxsKTsKLSAgICB9Ci0KLSAgICBwb3N0VmlkZW9MYWdFdmVudF9sKCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6bm90aWZ5VmlkZW9TaXplX2woKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpOwotCi0gICAgaW50MzJfdCB2V2lkdGgsIHZIZWlnaHQ7Ci0gICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOwotCi0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJnZXaWR0aCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmdkhlaWdodCkpOwotCi0gICAgbUdpdmVuV2lkdGggPSB2V2lkdGg7Ci0gICAgbUdpdmVuSGVpZ2h0ID0gdkhlaWdodDsKLQotICAgIGlmICghbWV0YS0+ZmluZFJlY3QoCi0gICAgICAgICAgICAgICAga0tleUNyb3BSZWN0LCAmY3JvcExlZnQsICZjcm9wVG9wLCAmY3JvcFJpZ2h0LCAmY3JvcEJvdHRvbSkpIHsKLQotICAgICAgICBjcm9wTGVmdCA9IGNyb3BUb3AgPSAwOwotICAgICAgICBjcm9wUmlnaHQgPSB2V2lkdGggLSAxOwotICAgICAgICBjcm9wQm90dG9tID0gdkhlaWdodCAtIDE7Ci0KLSAgICAgICAgQUxPR0QoImdvdCBkaW1lbnNpb25zIG9ubHkgJWQgeCAlZCIsIHZXaWR0aCwgdkhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0QoImdvdCBjcm9wIHJlY3QgJWQsICVkLCAlZCwgJWQiLAotICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOwotICAgIH0KLQotICAgIG1Dcm9wUmVjdC5sZWZ0ID0gY3JvcExlZnQ7Ci0gICAgbUNyb3BSZWN0LnJpZ2h0ID0gY3JvcFJpZ2h0OwotICAgIG1Dcm9wUmVjdC50b3AgPSBjcm9wVG9wOwotICAgIG1Dcm9wUmVjdC5ib3R0b20gPSBjcm9wQm90dG9tOwotCi0gICAgaW50MzJfdCBkaXNwbGF5V2lkdGg7Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAmZGlzcGxheVdpZHRoKSkgewotICAgICAgICBBTE9HVigiRGlzcGxheSB3aWR0aCBjaGFuZ2VkICglZD0+JWQpIiwgbURpc3BsYXlXaWR0aCwgZGlzcGxheVdpZHRoKTsKLSAgICAgICAgbURpc3BsYXlXaWR0aCA9IGRpc3BsYXlXaWR0aDsKLSAgICB9Ci0gICAgaW50MzJfdCBkaXNwbGF5SGVpZ2h0OwotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlIZWlnaHQsICZkaXNwbGF5SGVpZ2h0KSkgewotICAgICAgICBBTE9HVigiRGlzcGxheSBoZWlnaHQgY2hhbmdlZCAoJWQ9PiVkKSIsIG1EaXNwbGF5SGVpZ2h0LCBkaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBkaXNwbGF5SGVpZ2h0OwotICAgIH0KLQotICAgIGludDMyX3QgdXNhYmxlV2lkdGggPSBjcm9wUmlnaHQgLSBjcm9wTGVmdCArIDE7Ci0gICAgaW50MzJfdCB1c2FibGVIZWlnaHQgPSBjcm9wQm90dG9tIC0gY3JvcFRvcCArIDE7Ci0gICAgaWYgKG1EaXNwbGF5V2lkdGggIT0gMCkgewotICAgICAgICB1c2FibGVXaWR0aCA9IG1EaXNwbGF5V2lkdGg7Ci0gICAgfQotICAgIGlmIChtRGlzcGxheUhlaWdodCAhPSAwKSB7Ci0gICAgICAgIHVzYWJsZUhlaWdodCA9IG1EaXNwbGF5SGVpZ2h0OwotICAgIH0KLQotICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOwotICAgIGlmICghbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAga0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgewotICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOwotICAgIH0KLQotICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgPT0gOTAgfHwgcm90YXRpb25EZWdyZWVzID09IDI3MCkgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICAgICAgICAgIE1FRElBX1NFVF9WSURFT19TSVpFLCB1c2FibGVIZWlnaHQsIHVzYWJsZVdpZHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICAgICAgICAgIE1FRElBX1NFVF9WSURFT19TSVpFLCB1c2FibGVXaWR0aCwgdXNhYmxlSGVpZ2h0KTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnBhdXNlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOwotCi0gICAgcmV0dXJuIHBhdXNlX2woKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cGF1c2VfbChib29sIGF0X2VvcykgewotICAgIGlmICghKG1GbGFncyAmIFBMQVlJTkcpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBjYW5jZWxQbGF5ZXJFdmVudHNfbCgpOwotCi0gICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMICYmIChtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSkgewotICAgICAgICBpZiAoYXRfZW9zKSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBwbGF5ZWQgdGhlIGF1ZGlvIHN0cmVhbSB0byBjb21wbGV0aW9uIHdlCi0gICAgICAgICAgICAvLyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBzYW1wbGVzIHJlbWFpbmluZyBpbiB0aGUgYXVkaW8KLSAgICAgICAgICAgIC8vIHRyYWNrJ3MgcXVldWUgYXJlIHBsYXllZCBvdXQuCi0gICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKHRydWUgLyogcGxheVBlbmRpbmdTYW1wbGVzICovKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1GbGFncyAmPSB+QVVESU9fUlVOTklORzsKLSAgICB9Ci0KLSAgICBtRmxhZ3MgJj0gflBMQVlJTkc7Ci0gICAgdXBkYXRlQmF0dGVyeVVzYWdlX2woKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBQcmV2aWV3UGxheWVyOjppc1BsYXlpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChtRmxhZ3MgJiBQTEFZSU5HKSB8fCAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbVN1cmZhY2UgPSBzdXJmYWNlOwotICAgIHNldE5hdGl2ZVdpbmRvd19sKHN1cmZhY2UpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldFN1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtU3VyZmFjZS5jbGVhcigpOwotICAgIGlmIChidWZmZXJQcm9kdWNlciAhPSBOVUxMKSB7Ci0gICAgICAgIHNldE5hdGl2ZVdpbmRvd19sKG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyKSk7Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNodXRkb3duVmlkZW9EZWNvZGVyX2woKSB7Ci0gICAgaWYgKG1WaWRlb0J1ZmZlcikgewotICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBtVmlkZW9Tb3VyY2UtPnN0b3AoKTsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAotICAgIC8vIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IHJlbGVhc2VkIGJ5IHRoZSB0aW1lIHdlIG1heSB0cnkKLSAgICAvLyB0byBpbnN0YW50aWF0ZSBpdCBhZ2Fpbi4KLSAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVZpZGVvU291cmNlOwotICAgIG1WaWRlb1NvdXJjZS5jbGVhcigpOwotICAgIHdoaWxlICh0bXAucHJvbW90ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgdXNsZWVwKDEwMDApOwotICAgIH0KLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0TmF0aXZlV2luZG93X2woY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZSkgewotICAgIG1OYXRpdmVXaW5kb3cgPSBuYXRpdmU7Ci0KLSAgICBpZiAobVZpZGVvU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFMT0dJKCJhdHRlbXB0aW5nIHRvIHJlY29uZmlndXJlIHRvIHVzZSBuZXcgc3VyZmFjZSIpOwotCi0gICAgYm9vbCB3YXNQbGF5aW5nID0gKG1GbGFncyAmIFBMQVlJTkcpICE9IDA7Ci0KLSAgICBwYXVzZV9sKCk7Ci0KLSAgICBzaHV0ZG93blZpZGVvRGVjb2Rlcl9sKCk7Ci0KLSAgICBDSEVDS19FUShpbml0VmlkZW9EZWNvZGVyX2woKSwgKHN0YXR1c190KU9LKTsKLQotICAgIGlmIChtTGFzdFZpZGVvVGltZVVzID49IDApIHsKLSAgICAgICAgbVNlZWtpbmcgPSBTRUVLOwotICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwotICAgICAgICBtU2Vla1RpbWVVcyA9IG1MYXN0VmlkZW9UaW1lVXM7Ci0gICAgICAgIG1GbGFncyAmPSB+KEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyk7Ci0gICAgfQotCi0gICAgaWYgKHdhc1BsYXlpbmcpIHsKLSAgICAgICAgcGxheV9sKCk7Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldEF1ZGlvU2luaygKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbUF1ZGlvU2luayA9IGF1ZGlvU2luazsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0TG9vcGluZyhib29sIHNob3VsZExvb3ApIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbUZsYWdzID0gbUZsYWdzICYgfkxPT1BJTkc7Ci0KLSAgICBpZiAoc2hvdWxkTG9vcCkgewotICAgICAgICBtRmxhZ3MgfD0gTE9PUElORzsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0RHVyYXRpb25fbChpbnQ2NF90IGR1cmF0aW9uVXMpIHsKLSAgICBpZiAobUR1cmF0aW9uVXMgPCAwIHx8IGR1cmF0aW9uVXMgPiBtRHVyYXRpb25VcykgewotICAgICAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAobUR1cmF0aW9uVXMgPCAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgICpkdXJhdGlvblVzID0gbUR1cmF0aW9uVXM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpnZXRQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvblVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICpwb3NpdGlvblVzID0gbVNlZWtUaW1lVXM7Ci0gICAgfSBlbHNlIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTAotICAgICAgICAgICAgJiYgKG1BdWRpb1BsYXllciA9PSBOVUxMIHx8ICEobUZsYWdzICYgVklERU9fQVRfRU9TKSkpIHsKLSAgICAgICAgKnBvc2l0aW9uVXMgPSBtVmlkZW9UaW1lVXM7Ci0gICAgfSBlbHNlIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgewotICAgICAgICAqcG9zaXRpb25VcyA9IG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lVXMoKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcG9zaXRpb25VcyA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldFBvc2l0aW9uX2woaW50NjRfdCB0aW1lVXMpIHsKLSAgICBtVmlkZW9UaW1lVXMgPSB0aW1lVXM7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNlZWtUb19sKGludDY0X3QgdGltZVVzKSB7Ci0gICAgQUxPR1YoInNlZWtUb19sIik7Ci0gICAgaWYgKG1GbGFncyAmIENBQ0hFX1VOREVSUlVOKSB7Ci0gICAgICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47Ci0gICAgICAgIHBsYXlfbCgpOwotICAgIH0KLQotICAgIGlmICgobUZsYWdzICYgUExBWUlORykgJiYgbVZpZGVvU291cmNlICE9IE5VTEwgJiYgKG1GbGFncyAmIFZJREVPX0FUX0VPUykpIHsKLSAgICAgICAgLy8gVmlkZW8gcGxheWJhY2sgY29tcGxldGVkIGJlZm9yZSwgdGhlcmUncyBubyBwZW5kaW5nCi0gICAgICAgIC8vIHZpZGVvIGV2ZW50IHJpZ2h0IG5vdy4gSW4gb3JkZXIgZm9yIHRoaXMgbmV3IHNlZWsKLSAgICAgICAgLy8gdG8gYmUgaG9ub3JlZCwgd2UgbmVlZCB0byBwb3N0IG9uZS4KLQotICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7Ci0gICAgfQotCi0gICAgbVNlZWtpbmcgPSBTRUVLOwotICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IGZhbHNlOwotICAgIG1TZWVrVGltZVVzID0gdGltZVVzOwotICAgIG1GbGFncyAmPSB+KEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyk7Ci0KLSAgICBzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCk7Ci0KLSAgICBpZiAoIShtRmxhZ3MgJiBQTEFZSU5HKSkgewotICAgICAgICBBTE9HVigic2Vla2luZyB3aGlsZSBwYXVzZWQsIHNlbmRpbmcgU0VFS19DT01QTEVURSBub3RpZmljYXRpb24iCi0gICAgICAgICAgICAgIiBpbW1lZGlhdGVseS4iKTsKLQotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFRUtfQ09NUExFVEUpOwotICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwotCi0gICAgICAgIGlmICgobUZsYWdzICYgUFJFUEFSRUQpICYmIG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gU0VFS19QUkVWSUVXOwotICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKSB7Ci0gICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUsgJiYgbVZpZGVvU291cmNlID09IE5VTEwgJiYgbUF1ZGlvUGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvUGxheWVyLT5zZWVrVG8obVNlZWtUaW1lVXMpOwotCi0gICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRBdWRpb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSkgewotICAgIENIRUNLKHNvdXJjZSAhPSBOVUxMKTsKLSAgICBtQXVkaW9UcmFjayA9IHNvdXJjZTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRWaWRlb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSkgewotICAgIENIRUNLKHNvdXJjZSAhPSBOVUxMKTsKLSAgICBtVmlkZW9UcmFjayA9IHNvdXJjZTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpmaW5pc2hTZWVrSWZOZWNlc3NhcnkoaW50NjRfdCB2aWRlb1RpbWVVcykgewotICAgIGlmIChtU2Vla2luZyA9PSBTRUVLX1ZJREVPX09OTFkpIHsKLSAgICAgICAgbVNlZWtpbmcgPSBOT19TRUVLOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1TZWVraW5nID09IE5PX1NFRUsgfHwgKG1GbGFncyAmIFNFRUtfUFJFVklFVykpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigic2Vla2luZyBhdWRpbyB0byAlbGxkIHVzICglLjJmIHNlY3MpLiIsIHZpZGVvVGltZVVzLCB2aWRlb1RpbWVVcyAvIDFFNik7Ci0KLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHZpZGVvIHRpbWUsIHNlZWsgYXVkaW8gdG8gdGhlIG9yaWdpbmFsbHkKLSAgICAgICAgLy8gcmVxdWVzdGVkIHNlZWsgdGltZSBpbnN0ZWFkLgotCi0gICAgICAgIG1BdWRpb1BsYXllci0+c2Vla1RvKHZpZGVvVGltZVVzIDwgMCA/IG1TZWVrVGltZVVzIDogdmlkZW9UaW1lVXMpOwotICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKCFtU2Vla05vdGlmaWNhdGlvblNlbnQpIHsKLSAgICAgICAgLy8gSWYgd2UncmUgcGxheWluZyB2aWRlbyBvbmx5LCByZXBvcnQgc2VlayBjb21wbGV0ZSBub3csCi0gICAgICAgIC8vIG90aGVyd2lzZSBhdWRpbyBwbGF5ZXIgd2lsbCBub3RpZnkgdXMgbGF0ZXIuCi0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VFS19DT01QTEVURSk7Ci0gICAgICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7Ci0gICAgfQotCi0gICAgbUZsYWdzIHw9IEZJUlNUX0ZSQU1FOwotICAgIG1TZWVraW5nID0gTk9fU0VFSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvbkNoZWNrQXVkaW9TdGF0dXMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZykgewotICAgICAgICAvLyBFdmVudCB3YXMgZGlzcGF0Y2hlZCBhbmQgd2hpbGUgd2Ugd2VyZSBibG9ja2luZyBvbiB0aGUgbXV0ZXgsCi0gICAgICAgIC8vIGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICBpZiAobVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgJiYgIW1BdWRpb1BsYXllci0+aXNTZWVraW5nKCkpIHsKLSAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSBmYWxzZTsKLQotICAgICAgICBpZiAoIW1TZWVrTm90aWZpY2F0aW9uU2VudCkgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRUVLX0NPTVBMRVRFKTsKLSAgICAgICAgICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBtU2Vla2luZyA9IE5PX1NFRUs7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7Ci0gICAgaWYgKG1XYXRjaEZvckF1ZGlvRU9TICYmIG1BdWRpb1BsYXllci0+cmVhY2hlZEVPUygmZmluYWxTdGF0dXMpKSB7Ci0gICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gZmFsc2U7Ci0gICAgICAgIG1GbGFncyB8PSBBVURJT19BVF9FT1M7Ci0gICAgICAgIG1GbGFncyB8PSBGSVJTVF9GUkFNRTsKLSAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGZpbmFsU3RhdHVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdFZpZGVvRXZlbnRfbChpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBpZiAobVZpZGVvRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnRXaXRoRGVsYXkobVZpZGVvRXZlbnQsIGRlbGF5VXMgPCAwID8gMTAwMDAgOiBkZWxheVVzKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0U3RyZWFtRG9uZUV2ZW50X2woc3RhdHVzX3Qgc3RhdHVzKSB7Ci0gICAgaWYgKG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVN0cmVhbURvbmVFdmVudFBlbmRpbmcgPSB0cnVlOwotCi0gICAgbVN0cmVhbURvbmVTdGF0dXMgPSBzdGF0dXM7Ci0gICAgbVF1ZXVlLnBvc3RFdmVudChtU3RyZWFtRG9uZUV2ZW50KTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0VmlkZW9MYWdFdmVudF9sKCkgewotICAgIGlmIChtVmlkZW9MYWdFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtVmlkZW9MYWdFdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnRXaXRoRGVsYXkobVZpZGVvTGFnRXZlbnQsIDEwMDAwMDBsbCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKGludDY0X3QgZGVsYXlVcykgewotICAgIGlmIChtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnRXaXRoRGVsYXkobUNoZWNrQXVkaW9TdGF0dXNFdmVudCwgZGVsYXlVcyk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6YWJvcnRQcmVwYXJlKHN0YXR1c190IGVycikgewotICAgIENIRUNLKGVyciAhPSBPSyk7Ci0KLSAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIGVycik7Ci0gICAgfQotCi0gICAgbVByZXBhcmVSZXN1bHQgPSBlcnI7Ci0gICAgbUZsYWdzICY9IH4oUFJFUEFSSU5HfFBSRVBBUkVfQ0FOQ0VMTEVEfFBSRVBBUklOR19DT05ORUNURUQpOwotICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IE5VTEw7Ci0gICAgbVByZXBhcmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotfQotCi11aW50MzJfdCBQcmV2aWV3UGxheWVyOjpnZXRTb3VyY2VTZWVrRmxhZ3MoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHJldHVybiBtRXh0cmFjdG9yRmxhZ3M7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdEF1ZGlvRU9TKGludDY0X3QgZGVsYXlVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKGRlbGF5VXMpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RBdWRpb1NlZWtDb21wbGV0ZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbCgwIC8qIGRlbGF5VXMgKi8pOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnVwZGF0ZUJhdHRlcnlVc2FnZV9sKCkgewotICAgIHVpbnQzMl90IHBhcmFtcyA9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVRyYWNrRGVjb2RlcjsKLSAgICBpZiAoKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSAmJiAobUF1ZGlvU291cmNlICE9IG1BdWRpb1RyYWNrKSkgewotICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhVHJhY2tBdWRpbzsKLSAgICB9Ci0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja1ZpZGVvOwotICAgIH0KLSAgICBhZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWExM2I1OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBQUkVWSUVXX1BMQVlFUl9IXwotCi0jZGVmaW5lIFBSRVZJRVdfUExBWUVSX0hfCi0KLSNpbmNsdWRlICJUaW1lZEV2ZW50UXVldWUuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1RpbWVTb3VyY2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSAiTmF0aXZlV2luZG93UmVuZGVyZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjsKLXN0cnVjdCBNZWRpYUV4dHJhY3RvcjsKLQotc3RydWN0IFByZXZpZXdQbGF5ZXIgewotICAgIFByZXZpZXdQbGF5ZXIoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyKTsKLSAgICB+UHJldmlld1BsYXllcigpOwotCi0gICAgdm9pZCBzZXRMaXN0ZW5lcihjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lcik7Ci0gICAgdm9pZCByZXNldCgpOwotCi0gICAgc3RhdHVzX3QgcGxheSgpOwotICAgIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICBib29sIGlzUGxheWluZygpIGNvbnN0OwotICAgIHZvaWQgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7Ci0gICAgdm9pZCBzZXRTdXJmYWNlVGV4dHVyZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYnVmZmVyUHJvZHVjZXIpOwotICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHRpbWVVcyk7Ci0KLSAgICBzdGF0dXNfdCBnZXRWaWRlb0RpbWVuc2lvbnMoaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgY29uc3Q7Ci0KLQotICAgIC8vIEZJWE1FOiBTeW5jIGJldHdlZW4gLi4uCi0gICAgdm9pZCBhY3F1aXJlTG9jaygpOwotICAgIHZvaWQgcmVsZWFzZUxvY2soKTsKLQotICAgIHN0YXR1c190IHByZXBhcmUoKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnBhdGgpOwotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luayk7Ci0gICAgc3RhdHVzX3Qgc2V0TG9vcGluZyhib29sIHNob3VsZExvb3ApOwotICAgIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwotICAgIHN0YXR1c190IGdldFBvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uVXMpOwotCi0gICAgdWludDMyX3QgZ2V0U291cmNlU2Vla0ZsYWdzKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHBvc3RBdWRpb0VPUyhpbnQ2NF90IGRlbGF5VXMgPSAwbGwpOwotICAgIHZvaWQgcG9zdEF1ZGlvU2Vla0NvbXBsZXRlKCk7Ci0KLSAgICBzdGF0dXNfdCBsb2FkRWZmZWN0c1NldHRpbmdzKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5FZmZlY3RzKTsKLSAgICBzdGF0dXNfdCBsb2FkQXVkaW9NaXhTZXR0aW5ncyhNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpOwotICAgIHN0YXR1c190IHNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZShNNE9TQV9Db250ZXh0IHBBdWRpb01peFBDTUZpbGVIYW5kbGUpOwotICAgIHN0YXR1c190IHNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKE00T1NBX1VJbnQzMiBhdWRpb01peFN0b3J5Qm9hcmRUUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgY3VycmVudE1lZGlhQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBjdXJyZW50TWVkaWFWb2x1bWVWb2wpOwotCi0gICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tCZWdpblRpbWUodWludDMyX3QgbXNlYyk7Ci0gICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tFbmRUaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHN0YXR1c190IHNldFN0b3J5Ym9hcmRTdGFydFRpbWUodWludDMyX3QgbXNlYyk7Ci0gICAgc3RhdHVzX3Qgc2V0UHJvZ3Jlc3NDYWxsYmFja0ludGVydmFsKHVpbnQzMl90IGNiSW50ZXJ2YWwpOwotICAgIHN0YXR1c190IHNldE1lZGlhUmVuZGVyaW5nTW9kZShNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpOwotCi0gICAgc3RhdHVzX3QgcmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCgpOwotICAgIHN0YXR1c190IHNldEltYWdlQ2xpcFByb3BlcnRpZXModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7Ci0gICAgc3RhdHVzX3QgcmVhZEZpcnN0VmlkZW9GcmFtZSgpOwotICAgIHN0YXR1c190IGdldExhc3RSZW5kZXJlZFRpbWVNcyh1aW50MzJfdCAqbGFzdFJlbmRlcmVkVGltZU1zKTsKLSAgICBzdGF0dXNfdCBzZXRBdWRpb1BsYXllcihWaWRlb0VkaXRvckF1ZGlvUGxheWVyICphdWRpb1BsYXllcik7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIFBMQVlJTkcgICAgICAgICAgICAgPSAxLAotICAgICAgICBMT09QSU5HICAgICAgICAgICAgID0gMiwKLSAgICAgICAgRklSU1RfRlJBTUUgICAgICAgICA9IDQsCi0gICAgICAgIFBSRVBBUklORyAgICAgICAgICAgPSA4LAotICAgICAgICBQUkVQQVJFRCAgICAgICAgICAgID0gMTYsCi0gICAgICAgIEFUX0VPUyAgICAgICAgICAgICAgPSAzMiwKLSAgICAgICAgUFJFUEFSRV9DQU5DRUxMRUQgICA9IDY0LAotICAgICAgICBDQUNIRV9VTkRFUlJVTiAgICAgID0gMTI4LAotICAgICAgICBBVURJT19BVF9FT1MgICAgICAgID0gMjU2LAotICAgICAgICBWSURFT19BVF9FT1MgICAgICAgID0gNTEyLAotICAgICAgICBBVVRPX0xPT1BJTkcgICAgICAgID0gMTAyNCwKLSAgICAgICAgSU5GT1JNRURfQVZfRU9TICAgICA9IDIwNDgsCi0KLSAgICAgICAgLy8gV2UgYXJlIGJhc2ljYWxseSBkb25lIHByZXBhcmluZyBidXQgYXJlIGN1cnJlbnRseSBidWZmZXJpbmcKLSAgICAgICAgLy8gc3VmZmljaWVudCBkYXRhIHRvIGJlZ2luIHBsYXliYWNrIGFuZCBmaW5pc2ggdGhlIHByZXBhcmF0aW9uIHBoYXNlCi0gICAgICAgIC8vIGZvciBnb29kLgotICAgICAgICBQUkVQQVJJTkdfQ09OTkVDVEVEID0gMjA0OCwKLQotICAgICAgICAvLyBXZSdyZSB0cmlnZ2VyaW5nIGEgc2luZ2xlIHZpZGVvIGV2ZW50IHRvIGRpc3BsYXkgdGhlIGZpcnN0IGZyYW1lCi0gICAgICAgIC8vIGFmdGVyIHRoZSBzZWVrcG9pbnQuCi0gICAgICAgIFNFRUtfUFJFVklFVyAgICAgICAgPSA0MDk2LAotCi0gICAgICAgIEFVRElPX1JVTk5JTkcgICAgICAgPSA4MTkyLAotICAgICAgICBBVURJT1BMQVlFUl9TVEFSVEVEID0gMTYzODQsCi0KLSAgICAgICAgSU5DT0dOSVRPICAgICAgICAgICA9IDMyNzY4LAotICAgIH07Ci0KLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotCi0gICAgT01YQ2xpZW50IG1DbGllbnQ7Ci0gICAgVGltZWRFdmVudFF1ZXVlIG1RdWV1ZTsKLSAgICBib29sIG1RdWV1ZVN0YXJ0ZWQ7Ci0gICAgd3A8TWVkaWFQbGF5ZXJCYXNlPiBtTGlzdGVuZXI7Ci0KLSAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OwotICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwotCi0gICAgU3lzdGVtVGltZVNvdXJjZSBtU3lzdGVtVGltZVNvdXJjZTsKLSAgICBUaW1lU291cmNlICptVGltZVNvdXJjZTsKLQotICAgIFN0cmluZzggbVVyaTsKLQotICAgIHNwPE1lZGlhU291cmNlPiBtVmlkZW9UcmFjazsKLSAgICBzcDxNZWRpYVNvdXJjZT4gbVZpZGVvU291cmNlOwotICAgIGJvb2wgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXc7Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbUF1ZGlvVHJhY2s7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IG1BdWRpb1NvdXJjZTsKLSAgICBWaWRlb0VkaXRvckF1ZGlvUGxheWVyICptQXVkaW9QbGF5ZXI7Ci0gICAgaW50NjRfdCBtRHVyYXRpb25VczsKLQotICAgIGludDMyX3QgbURpc3BsYXlXaWR0aDsKLSAgICBpbnQzMl90IG1EaXNwbGF5SGVpZ2h0OwotCi0gICAgdWludDMyX3QgbUZsYWdzOwotICAgIHVpbnQzMl90IG1FeHRyYWN0b3JGbGFnczsKLQotICAgIGludDY0X3QgbVRpbWVTb3VyY2VEZWx0YVVzOwotICAgIGludDY0X3QgbVZpZGVvVGltZVVzOwotCi0gICAgZW51bSBTZWVrVHlwZSB7Ci0gICAgICAgIE5PX1NFRUssCi0gICAgICAgIFNFRUssCi0gICAgICAgIFNFRUtfVklERU9fT05MWQotICAgIH07Ci0gICAgU2Vla1R5cGUgbVNlZWtpbmc7Ci0KLSAgICBib29sIG1TZWVrTm90aWZpY2F0aW9uU2VudDsKLSAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotCi0gICAgaW50NjRfdCBtQml0cmF0ZTsgIC8vIHRvdGFsIGJpdHJhdGUgb2YgdGhlIGZpbGUgKGluIGJwcykgb3IgLTEgaWYgdW5rbm93bi4KLQotICAgIGJvb2wgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGU7Ci0gICAgYm9vbCBtV2F0Y2hGb3JBdWRpb0VPUzsKLQotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1WaWRlb0V2ZW50OwotICAgIGJvb2wgbVZpZGVvRXZlbnRQZW5kaW5nOwotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1TdHJlYW1Eb25lRXZlbnQ7Ci0gICAgYm9vbCBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZzsKLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtQ2hlY2tBdWRpb1N0YXR1c0V2ZW50OwotICAgIGJvb2wgbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nOwotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1WaWRlb0xhZ0V2ZW50OwotICAgIGJvb2wgbVZpZGVvTGFnRXZlbnRQZW5kaW5nOwotCi0gICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbUFzeW5jUHJlcGFyZUV2ZW50OwotICAgIENvbmRpdGlvbiBtUHJlcGFyZWRDb25kaXRpb247Ci0gICAgYm9vbCBtSXNBc3luY1ByZXBhcmU7Ci0gICAgc3RhdHVzX3QgbVByZXBhcmVSZXN1bHQ7Ci0gICAgc3RhdHVzX3QgbVN0cmVhbURvbmVTdGF0dXM7Ci0KLSAgICBNZWRpYUJ1ZmZlciAqbVZpZGVvQnVmZmVyOwotICAgIGludDY0X3QgbUxhc3RWaWRlb1RpbWVVczsKLSAgICBBUmVjdCBtQ3JvcFJlY3Q7Ci0gICAgaW50MzJfdCBtR2l2ZW5XaWR0aCwgbUdpdmVuSGVpZ2h0OwotCi0KLSAgICBib29sIG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkOwotCi0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIgKm1OYXRpdmVXaW5kb3dSZW5kZXJlcjsKLSAgICBSZW5kZXJJbnB1dCAqbVZpZGVvUmVuZGVyZXI7Ci0KLSAgICBpbnQzMl90IG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQ7Ci0KLSAgICAvL0RhdGEgc3RydWN0dXJlcyB1c2VkIGZvciBhdWRpbyBhbmQgdmlkZW8gZWZmZWN0cwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogbUVmZmVjdHNTZXR0aW5nczsKLSAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogbVByZXZpZXdQbGF5ZXJBdWRpb01peFNldHRpbmdzOwotICAgIE00T1NBX0NvbnRleHQgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZTsKLSAgICBNNE9TQV9VSW50MzIgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTOwotICAgIE00T1NBX1VJbnQzMiBtQ3VycmVudE1lZGlhQmVnaW5DdXRUaW1lOwotICAgIE00T1NBX1VJbnQzMiBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWU7Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyRnJhbWluZ0VmZmVjdEluZGV4OwotCi0gICAgdWludDMyX3QgbU51bWJlckVmZmVjdHM7Ci0gICAgdWludDMyX3QgbVBsYXlCZWdpblRpbWVNc2VjOwotICAgIHVpbnQzMl90IG1QbGF5RW5kVGltZU1zZWM7Ci0gICAgdWludDY0X3QgbURlY29kZWRWaWRlb1RzOyAvLyB0aW1lc3RhbXAgb2YgY3VycmVudCBkZWNvZGVkIHZpZGVvIGZyYW1lIGJ1ZmZlcgotICAgIHVpbnQ2NF90IG1EZWNWaWRlb1RzU3RvcnlCb2FyZDsgLy8gdGltZXN0YW1wIG9mIGZyYW1lIHJlbGF0aXZlIHRvIHN0b3J5Ym9hcmQKLSAgICB1aW50MzJfdCBtQ3VycmVudFZpZGVvRWZmZWN0OwotICAgIHVpbnQzMl90IG1Qcm9ncmVzc0NiSW50ZXJ2YWw7Ci0gICAgdWludDMyX3QgbU51bWJlckRlY1ZpZGVvRnJhbWVzOyAvLyBDb3VudGVyIG9mIG51bWJlciBvZiB2aWRlbyBmcmFtZXMgZGVjb2RlZAotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1Qcm9ncmVzc0NiRXZlbnQ7Ci0gICAgYm9vbCBtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZzsKLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtT3ZlcmxheVVwZGF0ZUV2ZW50OwotICAgIGJvb2wgbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmc7Ci0gICAgYm9vbCBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkOwotCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1SZW5kZXJpbmdNb2RlOwotICAgIHVpbnQzMl90IG1PdXRwdXRWaWRlb1dpZHRoOwotICAgIHVpbnQzMl90IG1PdXRwdXRWaWRlb0hlaWdodDsKLQotICAgIHVpbnQzMl90IG1TdG9yeWJvYXJkU3RhcnRUaW1lTXNlYzsKLQotICAgIGJvb2wgbUlzVmlkZW9Tb3VyY2VKcGc7Ci0gICAgYm9vbCBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZDsKLSAgICBpbnQ2NF90IG1JbWFnZUZyYW1lVGltZVVzOwotICAgIGJvb2wgbVN0YXJ0TmV4dFBsYXllcjsKLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrQ29udHJvbDsKLQotICAgIE00VklGSV9VSW50OCogIG1GcmFtZVJHQkJ1ZmZlcjsKLSAgICBNNFZJRklfVUludDgqICBtRnJhbWVZVVZCdWZmZXI7Ci0KLSAgICB2b2lkIGNhbmNlbFBsYXllckV2ZW50c19sKGJvb2wgdXBkYXRlUHJvZ3Jlc3NDYiA9IGZhbHNlKTsKLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2woY29uc3Qgc3A8TWVkaWFFeHRyYWN0b3I+ICZleHRyYWN0b3IpOwotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2VfbChjb25zdCBjaGFyICpwYXRoKTsKLSAgICB2b2lkIHNldE5hdGl2ZVdpbmRvd19sKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmUpOwotICAgIHZvaWQgcmVzZXRfbCgpOwotICAgIHZvaWQgY2xlYXJfbCgpOwotICAgIHN0YXR1c190IHBsYXlfbCgpOwotICAgIHN0YXR1c190IHBhdXNlX2woYm9vbCBhdF9lb3MgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3QgaW5pdFJlbmRlcmVyX2woKTsKLSAgICBzdGF0dXNfdCBpbml0QXVkaW9EZWNvZGVyX2woKTsKLSAgICBzdGF0dXNfdCBpbml0VmlkZW9EZWNvZGVyX2wodWludDMyX3QgZmxhZ3MgPSAwKTsKLSAgICB2b2lkIG5vdGlmeVZpZGVvU2l6ZV9sKCk7Ci0gICAgdm9pZCBub3RpZnlMaXN0ZW5lcl9sKGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwKTsKLSAgICB2b2lkIG9uVmlkZW9FdmVudCgpOwotICAgIHZvaWQgb25WaWRlb0xhZ1VwZGF0ZSgpOwotICAgIHZvaWQgb25TdHJlYW1Eb25lKCk7Ci0gICAgdm9pZCBvbkNoZWNrQXVkaW9TdGF0dXMoKTsKLSAgICB2b2lkIG9uUHJlcGFyZUFzeW5jRXZlbnQoKTsKLQotICAgIHZvaWQgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKLSAgICB2b2lkIGFib3J0UHJlcGFyZShzdGF0dXNfdCBlcnIpOwotCi0gICAgc3RhdHVzX3Qgc3RhcnRBdWRpb1BsYXllcl9sKCk7Ci0gICAgdm9pZCBzZXRWaWRlb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSk7Ci0gICAgc3RhdHVzX3QgZmluaXNoU2V0RGF0YVNvdXJjZV9sKCk7Ci0gICAgdm9pZCBzZXRBdWRpb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSk7Ci0KLSAgICBzdGF0dXNfdCBzZWVrVG9fbChpbnQ2NF90IHRpbWVVcyk7Ci0gICAgdm9pZCBzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCk7Ci0gICAgdm9pZCBmaW5pc2hTZWVrSWZOZWNlc3NhcnkoaW50NjRfdCB2aWRlb1RpbWVVcyk7Ci0KLSAgICB2b2lkIHBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbChpbnQ2NF90IGRlbGF5VXMpOwotICAgIHZvaWQgcG9zdFZpZGVvTGFnRXZlbnRfbCgpOwotICAgIHZvaWQgcG9zdFN0cmVhbURvbmVFdmVudF9sKHN0YXR1c190IHN0YXR1cyk7Ci0gICAgdm9pZCBwb3N0VmlkZW9FdmVudF9sKGludDY0X3QgZGVsYXlVcyA9IC0xKTsKLSAgICB2b2lkIHNldFZpZGVvUG9zdFByb2Nlc3NpbmdOb2RlKAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHR5cGUsIE00T1NBX0Jvb2wgZW5hYmxlKTsKLSAgICB2b2lkIHBvc3RQcm9ncmVzc0NhbGxiYWNrRXZlbnRfbCgpOwotICAgIHZvaWQgc2h1dGRvd25WaWRlb0RlY29kZXJfbCgpOwotICAgIHZvaWQgb25Qcm9ncmVzc0NiRXZlbnQoKTsKLQotICAgIHZvaWQgcG9zdE92ZXJsYXlVcGRhdGVFdmVudF9sKCk7Ci0gICAgdm9pZCBvblVwZGF0ZU92ZXJsYXlFdmVudCgpOwotCi0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZV9sX2pwZygpOwotICAgIHN0YXR1c190IHByZXBhcmVfbCgpOwotICAgIHN0YXR1c190IHByZXBhcmVBc3luY19sKCk7Ci0gICAgdm9pZCB1cGRhdGVCYXR0ZXJ5VXNhZ2VfbCgpOwotICAgIHZvaWQgdXBkYXRlU2l6ZVRvUmVuZGVyKHNwPE1ldGFEYXRhPiBtZXRhKTsKLQotICAgIHZvaWQgc2V0RHVyYXRpb25fbChpbnQ2NF90IGR1cmF0aW9uVXMpOwotICAgIHZvaWQgc2V0UG9zaXRpb25fbChpbnQ2NF90IHRpbWVVcyk7Ci0KLSAgICBQcmV2aWV3UGxheWVyKGNvbnN0IFByZXZpZXdQbGF5ZXIgJik7Ci0gICAgUHJldmlld1BsYXllciAmb3BlcmF0b3I9KGNvbnN0IFByZXZpZXdQbGF5ZXIgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFBSRVZJRVdfUExBWUVSX0hfCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjFjZmM4ZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdSZW5kZXJlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiUHJldmlld1JlbmRlcmVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiUHJldmlld1JlbmRlcmVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotUHJldmlld1JlbmRlcmVyKiBQcmV2aWV3UmVuZGVyZXI6OkNyZWF0ZVByZXZpZXdSZW5kZXJlciAoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLQotICAgIFByZXZpZXdSZW5kZXJlciogcmVuZGVyZXIgPSBuZXcgUHJldmlld1JlbmRlcmVyKHN1cmZhY2UsIHdpZHRoLCBoZWlnaHQpOwotCi0gICAgaWYgKHJlbmRlcmVyLT5pbml0KCkgIT0gMCkgewotICAgICAgICBkZWxldGUgcmVuZGVyZXI7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiByZW5kZXJlcjsKLX0KLQotUHJldmlld1JlbmRlcmVyOjpQcmV2aWV3UmVuZGVyZXIoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAotICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpCi0gICAgOiBtU3VyZmFjZShzdXJmYWNlKSwKLSAgICAgIG1XaWR0aCh3aWR0aCksCi0gICAgICBtSGVpZ2h0KGhlaWdodCkgewotfQotCi1pbnQgUHJldmlld1JlbmRlcmVyOjppbml0KCkgewotICAgIGludCBlcnIgPSAwOwotICAgIEFOYXRpdmVXaW5kb3cqIGFudyA9IG1TdXJmYWNlLmdldCgpOwotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChhbncsIE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7Ci0gICAgaWYgKGVycikgZ290byBmYWlsOwotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoCi0gICAgICAgICAgICBhbncsIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9ORVZFUiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOwotICAgIGlmIChlcnIpIGdvdG8gZmFpbDsKLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChhbncsIDMpOwotICAgIGlmIChlcnIpIGdvdG8gZmFpbDsKLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSgKLSAgICAgICAgICAgIGFudywgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKTsKLSAgICBpZiAoZXJyKSBnb3RvIGZhaWw7Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KAotICAgICAgICAgICAgYW53LCBtV2lkdGgsIG1IZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMik7Ci0gICAgaWYgKGVycikgZ290byBmYWlsOwotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0oYW53LCAwKTsKLSAgICBpZiAoZXJyKSBnb3RvIGZhaWw7Ci0KLWZhaWw6Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotUHJldmlld1JlbmRlcmVyOjp+UHJldmlld1JlbmRlcmVyKCkgewotICAgIG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobVN1cmZhY2UuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7Ci19Ci0KLQotLy8KLS8vIFByb3ZpZGVzIGEgYnVmZmVyIGFuZCBhc3NvY2lhdGVkIHN0cmlkZQotLy8gVGhpcyBidWZmZXIgaXMgYWxsb2NhdGVkIGJ5IHRoZSBTdXJmYWNlRmxpbmdlcgotLy8KLS8vIEZvciBvcHRpbWFsIGRpc3BsYXkgcGVyZm9ybWFuY2VzLCB5b3Ugc2hvdWxkIDoKLS8vIDEpIGNhbGwgZ2V0QnVmZmVyWVYxMigpCi0vLyAyKSBmaWxsIHRoZSBidWZmZXIgd2l0aCB5b3VyIGRhdGEKLS8vIDMpIGNhbGwgcmVuZGVyWVYxMigpIHRvIHRha2UgdGhlc2UgY2hhbmdlcyBpbnRvIGFjY291bnQKLS8vCi0vLyBGb3IgZWFjaCBjYWxsIHRvIGdldEJ1ZmZlcllWMTIoKSwgeW91IG11c3QgYWxzbyBjYWxsIHJlbmRlcllWMTIoKQotLy8gRXhwZWN0ZWQgZm9ybWF0IGluIHRoZSBidWZmZXIgaXMgWVYxMiBmb3JtYXRzIChzaW1pbGFyIHRvIFlVVjQyMCBwbGFuYXIgZnJvbWF0KQotLy8gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIFlWMTIgY2YgaGFyZHdhcmUvbGliaGFyZHdhcmUvaW5jbHVkZS9oYXJkd2FyZS9oYXJkd2FyZS5oCi0vLwotdm9pZCBQcmV2aWV3UmVuZGVyZXI6OmdldEJ1ZmZlcllWMTIodWludDhfdCAqKmRhdGEsIHNpemVfdCAqc3RyaWRlKSB7Ci0gICAgaW50IGVyciA9IE9LOwotCi0gICAgaWYgKChlcnIgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1TdXJmYWNlLmdldCgpLAotICAgICAgICAgICAgJm1CdWYpKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0IHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEdyYXBoaWNCdWZmZXJNYXBwZXIgJm1hcHBlciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpOwotCi0gICAgUmVjdCBib3VuZHMobVdpZHRoLCBtSGVpZ2h0KTsKLQotICAgIHZvaWQgKmRzdDsKLSAgICBDSEVDS19FUSgwLCBtYXBwZXIubG9jayhtQnVmLT5oYW5kbGUsCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAotICAgICAgICAgICAgYm91bmRzLCAmZHN0KSk7Ci0KLSAgICAqZGF0YSAgID0gKHVpbnQ4X3QqKWRzdDsKLSAgICAqc3RyaWRlID0gbUJ1Zi0+c3RyaWRlOwotfQotCi0KLS8vCi0vLyBEaXNwbGF5IHRoZSBjb250ZW50IG9mIHRoZSBidWZmZXIgcHJvdmlkZWQgYnkgbGFzdCBjYWxsIHRvIGdldEJ1ZmZlcllWMTIoKQotLy8KLS8vIFNlZSBnZXRCdWZmZXJZVjEyKCkgZm9yIGRldGFpbHMuCi0vLwotdm9pZCBQcmV2aWV3UmVuZGVyZXI6OnJlbmRlcllWMTIoKSB7Ci0gICAgaW50IGVyciA9IE9LOwotCi0gICAgR3JhcGhpY0J1ZmZlck1hcHBlciAmbWFwcGVyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCk7Ci0KLSAgICBpZiAobUJ1ZiE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLnVubG9jayhtQnVmLT5oYW5kbGUpKTsKLQotICAgICAgICBpZiAoKGVyciA9IG1TdXJmYWNlLT5BTmF0aXZlV2luZG93OjpxdWV1ZUJ1ZmZlcihtU3VyZmFjZS5nZXQoKSwgbUJ1ZiwgLTEpKSAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiU3VyZmFjZTo6cXVldWVCdWZmZXIgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1CdWYgPSBOVUxMOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UmVuZGVyZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlMjgyNzYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UmVuZGVyZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFBSRVZJRVdfUkVOREVSRVJfSF8KLQotI2RlZmluZSBQUkVWSUVXX1JFTkRFUkVSX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3VyZmFjZTsKLQotY2xhc3MgUHJldmlld1JlbmRlcmVyIHsKLXB1YmxpYzoKLQotc3RhdGljIFByZXZpZXdSZW5kZXJlciogQ3JlYXRlUHJldmlld1JlbmRlcmVyICgKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCi0gICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCk7Ci0KLSAgICB+UHJldmlld1JlbmRlcmVyKCk7Ci0KLSAgICB2b2lkIGdldEJ1ZmZlcllWMTIodWludDhfdCAqKmRhdGEsIHNpemVfdCAqc3RyaWRlKTsKLQotICAgIHZvaWQgcmVuZGVyWVYxMigpOwotCi0gICAgc3RhdGljIHNpemVfdCBBTElHTihzaXplX3QgeCwgc2l6ZV90IGFsaWdubWVudCkgewotICAgICAgICByZXR1cm4gKHggKyBhbGlnbm1lbnQgLSAxKSAmIH4oYWxpZ25tZW50IC0gMSk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIFByZXZpZXdSZW5kZXJlcigKLSAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAotICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KTsKLQotICAgIGludCBpbml0KCk7Ci0KLSAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKLSAgICBzaXplX3QgbVdpZHRoLCBtSGVpZ2h0OwotCi0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqbUJ1ZjsKLQotICAgIFByZXZpZXdSZW5kZXJlcihjb25zdCBQcmV2aWV3UmVuZGVyZXIgJik7Ci0gICAgUHJldmlld1JlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgUHJldmlld1JlbmRlcmVyICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBQUkVWSUVXX1JFTkRFUkVSX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTc2ZjhlOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWaWRlb0VkaXRvckF1ZGlvUGxheWVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgotI2luY2x1ZGUgPFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLSNpbmNsdWRlICJQcmV2aWV3UGxheWVyLmgiCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rLAotICAgICAgICBQcmV2aWV3UGxheWVyICpvYnNlcnZlcikKLSAgICA6IG1JbnB1dEJ1ZmZlcihOVUxMKSwKLSAgICAgIG1TYW1wbGVSYXRlKDApLAotICAgICAgbUxhdGVuY3lVcygwKSwKLSAgICAgIG1GcmFtZVNpemUoMCksCi0gICAgICBtTnVtRnJhbWVzUGxheWVkKDApLAotICAgICAgbVBvc2l0aW9uVGltZU1lZGlhVXMoLTEpLAotICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcygtMSksCi0gICAgICBtU2Vla2luZyhmYWxzZSksCi0gICAgICBtUmVhY2hlZEVPUyhmYWxzZSksCi0gICAgICBtRmluYWxTdGF0dXMoT0spLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUlzRmlyc3RCdWZmZXIoZmFsc2UpLAotICAgICAgbUZpcnN0QnVmZmVyUmVzdWx0KE9LKSwKLSAgICAgIG1GaXJzdEJ1ZmZlcihOVUxMKSwKLSAgICAgIG1BdWRpb1NpbmsoYXVkaW9TaW5rKSwKLSAgICAgIG1PYnNlcnZlcihvYnNlcnZlcikgewotCi0gICAgQUxPR1YoIkNvbnN0cnVjdG9yIik7Ci0gICAgbUJHQXVkaW9QQ01GaWxlSGFuZGxlID0gTlVMTDsKLSAgICBtQXVkaW9Qcm9jZXNzID0gTlVMTDsKLSAgICBtQkdBdWRpb1BDTUZpbGVMZW5ndGggPSAwOwotICAgIG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggPSAwOwotICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gMDsKLSAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgPSAwOwotICAgIG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50ID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFCZWdpbkN1dFRTID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwgPSAwOwotICAgIG1TZWVrVGltZVVzID0gMDsKLSAgICBtU291cmNlID0gTlVMTDsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6flZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoKSB7Ci0KLSAgICBBTE9HVigiRGVzdHJ1Y3RvciIpOwotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICByZXNldCgpOwotICAgIH0KLSAgICBpZiAobUF1ZGlvUHJvY2VzcyAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtQXVkaW9Qcm9jZXNzOwotICAgICAgICBtQXVkaW9Qcm9jZXNzID0gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cGF1c2UoYm9vbCBwbGF5UGVuZGluZ1NhbXBsZXMpIHsKLSAgICBBTE9HVigicGF1c2U6IHBsYXlQZW5kaW5nU2FtcGxlcz0lZCIsIHBsYXlQZW5kaW5nU2FtcGxlcyk7Ci0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgaWYgKHBsYXlQZW5kaW5nU2FtcGxlcykgewotICAgICAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5wYXVzZSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmNsZWFyKCkgewotICAgIEFMT0dWKCJjbGVhciIpOwotICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOwotICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7Ci0KLSAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBhbnkgYnVmZmVyIHdlIGhvbGQgb250byBzbyB0aGF0IHRoZQotICAgIC8vIHNvdXJjZSBpcyBhYmxlIHRvIHN0b3AoKS4KLQotICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIkF1ZGlvUGxheWVyQmFzZSByZWxlYXNpbmcgaW5wdXQgYnVmZmVyLiIpOwotCi0gICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAotICAgIC8vIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IHJlbGVhc2VkIGJ5IHRoZSB0aW1lIHdlIG1heSB0cnkKLSAgICAvLyB0byBpbnN0YW50aWF0ZSBpdCBhZ2Fpbi4KLSAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVNvdXJjZTsKLSAgICBtU291cmNlLmNsZWFyKCk7Ci0gICAgd2hpbGUgKHRtcC5wcm9tb3RlKCkgIT0gTlVMTCkgewotICAgICAgICB1c2xlZXAoMTAwMCk7Ci0gICAgfQotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLQotICAgIG1OdW1GcmFtZXNQbGF5ZWQgPSAwOwotICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzID0gLTE7Ci0gICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9IC0xOwotICAgIG1TZWVraW5nID0gZmFsc2U7Ci0gICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKLSAgICBtRmluYWxTdGF0dXMgPSBPSzsKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpyZXN1bWUoKSB7Ci0gICAgQUxPR1YoInJlc3VtZSIpOwotCi0gICAgQXVkaW9NaXhTZXR0aW5ncyBhdWRpb01peFNldHRpbmdzOwotCi0gICAgLy8gU2luZ2xlIGF1ZGlvIHBsYXllciBpcyB1c2VkOwotICAgIC8vIFBhc3Mgb24gdGhlIGF1ZGlvIGR1Y2tpbmcgcGFyYW1ldGVycwotICAgIC8vIHdoaWNoIG1pZ2h0IGhhdmUgY2hhbmdlZCB3aXRoIG5ldyBhdWRpbyBzb3VyY2UKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX3RocmVzaG9sZCA9Ci0gICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19sb3dWb2x1bWUgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ19sb3dWb2x1bWUpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19lbmFibGUgPQotICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+YkluRHVja2luZ19lbmFibGU7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdlBUVm9sTGV2ZWwgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2QlRWb2xMZXZlbCA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkVm9sdW1lKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZCVENoYW5uZWxDb3VudCA9IG1BdWRpb01peFNldHRpbmdzLT51aUJUQ2hhbm5lbENvdW50OwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZQVENoYW5uZWxDb3VudCA9IG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHM7Ci0KLSAgICAvLyBDYWxsIHRvIEF1ZGlvIG1peCBwYXJhbSBzZXR0aW5nCi0gICAgbUF1ZGlvUHJvY2Vzcy0+c2V0TWl4UGFyYW1zKGF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNlZWtUbyhpbnQ2NF90IHRpbWVfdXMpIHsKLSAgICBBTE9HVigic2Vla1RvOiAlbGxkIiwgdGltZV91cyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1TZWVraW5nID0gdHJ1ZTsKLSAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0gbVBvc2l0aW9uVGltZU1lZGlhVXMgPSAtMTsKLSAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwotICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKLQotICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQXVkaW9UcmFjay0+Zmx1c2goKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6aXNTZWVraW5nKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiaXNTZWVraW5nOiBtU2Vla2luZz0lZCIsIG1TZWVraW5nKTsKLSAgICByZXR1cm4gbVNlZWtpbmc7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cmVhY2hlZEVPUyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpIHsKLSAgICBBTE9HVigicmVhY2hlZEVPUzogc3RhdHVzPSVkIiwgbUZpbmFsU3RhdHVzKTsKLSAgICAqZmluYWxTdGF0dXMgPSBPSzsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgKmZpbmFsU3RhdHVzID0gbUZpbmFsU3RhdHVzOwotICAgIHJldHVybiBtUmVhY2hlZEVPUzsKLX0KLQotaW50NjRfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpnZXRSZWFsVGltZVVzKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIGdldFJlYWxUaW1lVXNfbCgpOwotfQotCi1pbnQ2NF90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldFJlYWxUaW1lVXNfbCgpIHsKLSAgICByZXR1cm4gLW1MYXRlbmN5VXMgKyAobU51bUZyYW1lc1BsYXllZCAqIDEwMDAwMDApIC8gbVNhbXBsZVJhdGU7Ci19Ci0KLWludDY0X3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6Z2V0TWVkaWFUaW1lVXMoKSB7Ci0gICAgQUxPR1YoImdldE1lZGlhVGltZVVzIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtUG9zaXRpb25UaW1lTWVkaWFVcyA8IDAgfHwgbVBvc2l0aW9uVGltZVJlYWxVcyA8IDApIHsKLSAgICAgICAgaWYgKG1TZWVraW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlZWtUaW1lVXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHJlYWxUaW1lT2Zmc2V0ID0gZ2V0UmVhbFRpbWVVc19sKCkgLSBtUG9zaXRpb25UaW1lUmVhbFVzOwotICAgIGlmIChyZWFsVGltZU9mZnNldCA8IDApIHsKLSAgICAgICAgcmVhbFRpbWVPZmZzZXQgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBtUG9zaXRpb25UaW1lTWVkaWFVcyArIHJlYWxUaW1lT2Zmc2V0OwotfQotCi1ib29sIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldE1lZGlhVGltZU1hcHBpbmcoCi0gICAgICAgIGludDY0X3QgKnJlYWx0aW1lX3VzLCBpbnQ2NF90ICptZWRpYXRpbWVfdXMpIHsKLSAgICBBTE9HVigiZ2V0TWVkaWFUaW1lTWFwcGluZyIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAqcmVhbHRpbWVfdXMgPSBtUG9zaXRpb25UaW1lUmVhbFVzOwotICAgICptZWRpYXRpbWVfdXMgPSBtUG9zaXRpb25UaW1lTWVkaWFVczsKLQotICAgIHJldHVybiBtUG9zaXRpb25UaW1lUmVhbFVzICE9IC0xICYmIG1Qb3NpdGlvblRpbWVNZWRpYVVzICE9IC0xOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvLyBCZWZvcmUgc2V0dGluZyBzb3VyY2UsIHN0b3AgYW55IGV4aXN0aW5nIHNvdXJjZS4KLSAgICAvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBhbnkgYnVmZmVyIHdlIGhvbGQgb250byBzbyB0aGF0IHRoZQotICAgIC8vIHNvdXJjZSBpcyBhYmxlIHRvIHN0b3AoKS4KLQotICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgcmVsZWFzaW5nIGlucHV0IGJ1ZmZlci4iKTsKLQotICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgbVNvdXJjZS5jbGVhcigpOwotICAgIH0KLQotICAgIG1Tb3VyY2UgPSBzb3VyY2U7Ci0gICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKLX0KLQotc3A8TWVkaWFTb3VyY2U+IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldFNvdXJjZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBtU291cmNlOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldE9ic2VydmVyKFByZXZpZXdQbGF5ZXIgKm9ic2VydmVyKSB7Ci0gICAgQUxPR1YoInNldE9ic2VydmVyIik7Ci0gICAgLy9DSEVDSyghbVN0YXJ0ZWQpOwotICAgIG1PYnNlcnZlciA9IG9ic2VydmVyOwotfQotCi1ib29sIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmlzU3RhcnRlZCgpIHsKLSAgICByZXR1cm4gbVN0YXJ0ZWQ7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqdXNlciwgdm9pZCAqaW5mbykgewotICAgIHN0YXRpY19jYXN0PFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKj4odXNlciktPkF1ZGlvQ2FsbGJhY2soZXZlbnQsIGluZm8pOwotfQotCi0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6QXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIHsKLSAgICBpZiAoZXZlbnQgIT0gQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOwotICAgIHNpemVfdCBudW1CeXRlc1dyaXR0ZW4gPSBmaWxsQnVmZmVyKGJ1ZmZlci0+cmF3LCBidWZmZXItPnNpemUpOwotCi0gICAgYnVmZmVyLT5zaXplID0gbnVtQnl0ZXNXcml0dGVuOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzdGFydChib29sIHNvdXJjZUFscmVhZHlTdGFydGVkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotICAgIENIRUNLKG1Tb3VyY2UgIT0gTlVMTCk7Ci0gICAgQUxPR1YoIlN0YXJ0Iik7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIE00T1NBX0VSUiByZXN1bHQgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBzdGFydFRpbWUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBzZWVrVGltZVN0YW1wID0gMDsKLSAgICBNNE9TQV9Cb29sIGJTdG9yeUJvYXJkVFNCZXlvbmRCVEVuZEN1dFRpbWUgPSBNNE9TQV9GQUxTRTsKLQotICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENyZWF0ZSB0aGUgQkcgQXVkaW8gaGFuZGxlcgotICAgIG1BdWRpb1Byb2Nlc3MgPSBuZXcgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpOwotICAgIEF1ZGlvTWl4U2V0dGluZ3MgYXVkaW9NaXhTZXR0aW5nczsKLQotICAgIC8vIFBhc3Mgb24gdGhlIGF1ZGlvIGR1Y2tpbmcgcGFyYW1ldGVycwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfdGhyZXNob2xkID0KLSAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpSW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX2xvd1ZvbHVtZSA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUF1ZGlvTWl4U2V0dGluZ3MtPnVpSW5EdWNraW5nX2xvd1ZvbHVtZSkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX2VuYWJsZSA9Ci0gICAgICAgIG1BdWRpb01peFNldHRpbmdzLT5iSW5EdWNraW5nX2VuYWJsZTsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2UFRWb2xMZXZlbCA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhVm9sdW1lVmFsKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZCVFZvbExldmVsID0KLSAgICAgICAgKChNNE9TQV9GbG9hdCltQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRWb2x1bWUpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkJUQ2hhbm5lbENvdW50ID0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQlRDaGFubmVsQ291bnQ7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdlBUQ2hhbm5lbENvdW50ID0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVsczsKLQotICAgIC8vIENhbGwgdG8gQXVkaW8gbWl4IHBhcmFtIHNldHRpbmcKLSAgICBtQXVkaW9Qcm9jZXNzLT5zZXRNaXhQYXJhbXMoYXVkaW9NaXhTZXR0aW5ncyk7Ci0KLSAgICAvLyBHZXQgdGhlIEJHIEF1ZGlvIFBDTSBmaWxlIGRldGFpbHMKLSAgICBpZiAoIG1CR0F1ZGlvUENNRmlsZUhhbmRsZSApIHsKLQotICAgICAgICAvLyBUT0RPIDogMzJiaXRzIHJlcXVpcmVkIGZvciBPU0FMLCB0byBiZSB1cGRhdGVkIG9uY2UgT1NBTCBpcyB1cGRhdGVkCi0gICAgICAgIE00T1NBX1VJbnQzMiB0bXAzMiA9IDA7Ci0gICAgICAgIHJlc3VsdCA9IE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uKG1CR0F1ZGlvUENNRmlsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCoqKSZ0bXAzMik7Ci0gICAgICAgIG1CR0F1ZGlvUENNRmlsZUxlbmd0aCA9IHRtcDMyOwotICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoID0gbUJHQXVkaW9QQ01GaWxlTGVuZ3RoOwotCi0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnN0YXJ0IE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplID0gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlTGVuZ3RoKTsKLQotICAgICAgICAvLyBHZXQgdGhlIGR1cmF0aW9uIGluIHRpbWUgb2YgdGhlIGF1ZGlvIEJUCi0gICAgICAgIGlmICggcmVzdWx0ID09IE00Tk9fRVJST1IgKSB7Ci0gICAgICAgICBBTE9HVigiVkVBUDogY2hhbm5lbHMgPSAlZCBmcmVxID0gJWQiLAotICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscywgIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5KTsKLQotICAgICAgICAgICAgLy8gTm8gdHJpbQotICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSAoKAotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlTGVuZ3RoL3NpemVvZihNNE9TQV9VSW50MTYpLwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzKSkqMTAwMCApIC8KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjogYmVnaW5DdXRNcyAlZCAsIGVuZEN1dE1zICVkIiwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpIG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNcyk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdHJpbSBwYXJ0Ci0gICAgICAgICAgICBpZiAoKG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zID09IDApICYmCi0gICAgICAgICAgICAgICAgKG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNcyAhPSAwKSkgewotICAgICAgICAgICAgICAgIC8vIEVuZCB0aW1lIGl0c2VsZiB0aGUgZmlsZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gbUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zOwotICAgICAgICAgICAgICAgIC8vIExpbWl0IHRoZSBmaWxlIGxlbmd0aCBhbHNvCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCA9ICgoCi0gICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKgotICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kpICoKLSAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMpICoKLSAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9VSW50MTYpKSAvIDEwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIChtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXMgPT0gbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgLy8gRW5kIHRpbWUgaXRzZWxmIHRoZSBmaWxlIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiAtCi0gICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXM7Ci0gICAgICAgICAgICAgICAgLy8gTGltaXQgdGhlIGZpbGUgbGVuZ3RoIGFsc28KLSAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoID0gKCgKLSAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KShtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiAqCi0gICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSkgKgotICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscykgKgotICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00T1NBX1VJbnQxNikpIC8gMTAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKChtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNcyAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAobUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgLy8gRW5kIHRpbWUgaXRzZWxmIHRoZSBmaWxlIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSBtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXMgLQotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNczsKLSAgICAgICAgICAgICAgICAvLyBMaW1pdCB0aGUgZmlsZSBsZW5ndGggYWxzbwotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggPSAoKAotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKgotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSkgKgotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzKSAqCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9VSW50MTYpKSAvIDEwMDA7IC8qbWFrZSB0byBzZWMgZnJvbSBtcyovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOiBmaWxlIGR1cmF0aW9uIHJlY29yZGVkIDogJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExhc3QgcGxheWVkIGxvY2F0aW9uIHRvIGJlIHNlZWtlZCBhdCBmb3IgbmV4dCBtZWRpYSBpdGVtCi0gICAgICAgIGlmICggcmVzdWx0ID09IE00Tk9fRVJST1IgKSB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6bUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCk7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6dWlBZGRDdHMgJWQiLAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMpOwotICAgICAgICAgICAgaWYgKG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgPj0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gKG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgLQotICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c3RhcnRUaW1lICVkIiwgc3RhcnRUaW1lKTsKLSAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSAwOwotICAgICAgICAgICAgaWYgKHN0YXJ0VGltZSkgewotICAgICAgICAgICAgICAgIGlmIChzdGFydFRpbWUgPj0gbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEJHIHRyYWNrIHNob3VsZCBiZSBsb29wZWQgYW5kIHN0YXJ0ZWQgYWdhaW4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb01peFNldHRpbmdzLT5iTG9vcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGJlZ2luIGN1dCB0aW1lIHRvIHRoZSBtb2QgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSAoKHN0YXJ0VGltZSVtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbikgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb29waW5nIGRpc2FibGVkLCBkb25vdCBkbyBCVCBNaXggLCBzZXQgdG8gZmlsZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSAobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBCVCBzdGlsbCBwcmVzZW50ICwganVzdCBzZWVrIHRvIHN0b3J5IGJvYXJkIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVTdGFtcCA9IHN0YXJ0VGltZSArIG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgc2Vla1RpbWVTdGFtcCB0byBmaWxlIGxvY2F0aW9uCi0gICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCA9ICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQxNikpLyAxMDAwIDsgLyptYWtlIHRvIHNlYyBmcm9tIG1zKi8KLQotICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gKChpbnQ2NF90KShzZWVrVGltZVN0YW1wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MTYpKS8gMTAwMCA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBXZSBhbGxvdyBhbiBvcHRpb25hbCBJTkZPX0ZPUk1BVF9DSEFOR0VEIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZwotICAgIC8vIG9mIHBsYXliYWNrLCBpZiB0aGVyZSBpcyBvbmUsIGdldEZvcm1hdCBiZWxvdyB3aWxsIHJldHJpZXZlIHRoZQotICAgIC8vIHVwZGF0ZWQgZm9ybWF0LCBpZiB0aGVyZSBpc24ndCwgd2UnbGwgc3Rhc2ggYXdheSB0aGUgdmFsaWQgYnVmZmVyCi0gICAgLy8gb2YgZGF0YSB0byBiZSB1c2VkIG9uIHRoZSBmaXJzdCBhdWRpbyBjYWxsYmFjay4KLQotICAgIENIRUNLKG1GaXJzdEJ1ZmZlciA9PSBOVUxMKTsKLQotICAgIG1GaXJzdEJ1ZmZlclJlc3VsdCA9IG1Tb3VyY2UtPnJlYWQoJm1GaXJzdEJ1ZmZlcik7Ci0gICAgaWYgKG1GaXJzdEJ1ZmZlclJlc3VsdCA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgIEFMT0dWKCJJTkZPX0ZPUk1BVF9DSEFOR0VEISEhIik7Ci0KLSAgICAgICAgQ0hFQ0sobUZpcnN0QnVmZmVyID09IE5VTEwpOwotICAgICAgICBtRmlyc3RCdWZmZXJSZXN1bHQgPSBPSzsKLSAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IHRydWU7Ci0gICAgfQotCi0gICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgYm9vbCBzdWNjZXNzID0gZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKLSAgICBDSEVDSyghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKTsKLQotICAgIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKLQotICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7Ci0gICAgc3VjY2VzcyA9IGZvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscyk7Ci0gICAgQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPm9wZW4oCi0gICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG51bUNoYW5uZWxzLCBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAotICAgICAgICAgICAgICAgIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUkNPVU5ULAotICAgICAgICAgICAgICAgICZWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpBdWRpb1NpbmtDYWxsYmFjaywgdGhpcyk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvU2luay0+bGF0ZW5jeSgpICogMTAwMDsKLSAgICAgICAgbUZyYW1lU2l6ZSA9IG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOwotCi0gICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygKLSAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fTVVTSUMsIG1TYW1wbGVSYXRlLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobnVtQ2hhbm5lbHMpLAotICAgICAgICAgICAgICAgIDAsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZBdWRpb0NhbGxiYWNrLCB0aGlzLCAwKTsKLQotICAgICAgICBpZiAoKGVyciA9IG1BdWRpb1RyYWNrLT5pbml0Q2hlY2soKSkgIT0gT0spIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvVHJhY2stPmxhdGVuY3koKSAqIDEwMDA7Ci0gICAgICAgIG1GcmFtZVNpemUgPSBtQXVkaW9UcmFjay0+ZnJhbWVTaXplKCk7Ci0KLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cmVzZXQoKSB7Ci0KLSAgICBBTE9HVigicmVzZXQiKTsKLSAgICBjbGVhcigpOwotCi0gICAgLy8gQ2FwdHVyZSB0aGUgY3VycmVudCBzZWVrIHBvaW50Ci0gICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wID0wOwotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYUJlZ2luQ3V0VFM9MDsKLX0KLQotc2l6ZV90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OkF1ZGlvU2lua0NhbGxiYWNrKAotICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luayAqYXVkaW9TaW5rLAotICAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCB2b2lkICpjb29raWUsCi0gICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KSB7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqbWUgPSAoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqKWNvb2tpZTsKLQotICAgIGlmIChldmVudCA9PSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfRklMTF9CVUZGRVIgKSB7Ci0gICAgICAgIHJldHVybiBtZS0+ZmlsbEJ1ZmZlcihidWZmZXIsIHNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotCi1zaXplX3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6ZmlsbEJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotCi0gICAgaWYgKG1SZWFjaGVkRU9TKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHNpemVfdCBzaXplX2RvbmUgPSAwOwotICAgIHNpemVfdCBzaXplX3JlbWFpbmluZyA9IHNpemU7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNEFNX0J1ZmZlcjE2IGJnRnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgTTRBTV9CdWZmZXIxNiBtaXhGcmFtZSA9IHtOVUxMLCAwfTsKLSAgICBNNEFNX0J1ZmZlcjE2IHB0RnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgaW50NjRfdCBjdXJyZW50U3RlYW1UUyA9IDA7Ci0gICAgaW50NjRfdCBzdGFydFRpbWVGb3JCVCA9IDA7Ci0gICAgTTRPU0FfRmxvYXQgZlBUVm9sTGV2ZWwgPQotICAgICAoKE00T1NBX0Zsb2F0KW1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCkvMTAwOwotICAgIE00T1NBX0ludDE2ICAgICAqcFBUTWRhdGE9TlVMTDsKLSAgICBNNE9TQV9VSW50MzIgICAgIHVpUENNc2l6ZSA9IDA7Ci0KLSAgICBib29sIHBvc3RTZWVrQ29tcGxldGUgPSBmYWxzZTsKLSAgICBib29sIHBvc3RFT1MgPSBmYWxzZTsKLQotICAgIHdoaWxlICgoc2l6ZV9yZW1haW5pbmcgPiAwKSYmKGVycj09TTROT19FUlJPUikpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgIGlmIChtU2Vla2luZykgewotICAgICAgICAgICAgICAgIGlmIChtSXNGaXJzdEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKLQotICAgICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU2Vla2luZyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgaWYgKG1PYnNlcnZlcikgewotICAgICAgICAgICAgICAgICAgICBwb3N0U2Vla0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlucHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwotCi0gICAgICAgICAgICBpZiAobUlzRmlyc3RCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBtRmlyc3RCdWZmZXI7Ci0gICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBtRmlyc3RCdWZmZXJSZXN1bHQ7Ci0KLSAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIERhdGEgaXMgUHJpbWFyeSBUcmFjaywgbWl4IHdpdGggYmFja2dyb3VuZCB0cmFjawotICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlYWRpbmcgc2FtZSBzaXplIGZyb20gQmFja2dyb3VuZCB0cmFjayBQQ00gZmlsZQotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBNaXggb25seSB3aGVuIHNraW0gcG9pbnQgaXMgYWZ0ZXIgc3RhcnRUaW1lIG9mIEJUCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAqIDEwMDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Qb3NpdGlvblRpbWVNZWRpYVVzIC0gbVNlZWtUaW1lVXMpKSA+PQotICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzICogMTAwMCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OklOU0lERSBNSVhJTkciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDaGVja2luZyAlbGxkIDw9ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludC1tQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoKTsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSAoTTRPU0FfVm9pZCopKCh1bnNpZ25lZCBpbnQpbUlucHV0QnVmZmVyLT5kYXRhKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW4gPSBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBmcCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUENNc2l6ZSA9IChtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpKS8yOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBUTWRhdGEgPSAoTTRPU0FfSW50MTYqKSAoKHVpbnQ4X3QqKSBtSW5wdXRCdWZmZXItPmRhdGEoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibWl4IHdpdGggYmFja2dyb3VuZCBtYWxsb2MgdG8gZG8gbGVuICVkIiwgbGVuKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYmdGcmFtZS5tX2RhdGFBZGRyZXNzID0gKE00T1NBX1VJbnQxNiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBsZW4sIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJiZ0ZyYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZ0ZyYW1lLm1fYnVmZmVyU2l6ZSA9IGxlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbWl4RnJhbWUubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9VSW50MTYqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW4sIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJtaXhGcmFtZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4RnJhbWUubV9idWZmZXJTaXplID0gbGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibWl4IHdpdGggYmdtIHdpdGggc2l6ZSAlbGxkIiwgbUJHQXVkaW9QQ01GaWxlTGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBvc2l0aW9uVGltZU1lZGlhVXMpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50IDw9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCAtIGxlbikpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDaGVja2luZyBtQkdBdWRpb1BDTUZpbGVIYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KW1CR0F1ZGlvUENNRmlsZUhhbmRsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJHQXVkaW9QQ01GaWxlSGFuZGxlICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbGxCdWZmZXIgc2Vla2luZyBmaWxlIHRvICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiAzMmJpdHMgcmVxdWlyZWQgZm9yIE9TQUwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRtcDMyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9maWxlUmVhZFNlZWsobUJHQXVkaW9QQ01GaWxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVQb3NpdGlvbiopJnRtcDMyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgPSB0bXAzMjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk00T1NBX2ZpbGVSZWFkU2VlayBlcnIgJWQiLChpbnQpZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2ZpbGVSZWFkRGF0YShtQkdBdWRpb1BDTUZpbGVIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50OCopYmdGcmFtZS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiopJmxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gTTRXQVJfTk9fREFUQV9ZRVQgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQnVmZmVyIEVuZCBvZiBmaWxlIHJlYWNoZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHRvIGJlZ2luIGN1dCB0aW1lIGVxdWFsIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvTWl4U2V0dGluZ3MtPmJMb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoaW50NjRfdCkobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfVUludDE2KSkgLyAxMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQnVmZmVyIExvb3BpbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gbWl4aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2Ygdm9sdW1lIG9mIHByaW1hcnkgdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZlBUVm9sTGV2ZWwgPCAxLjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJpbWFyeVRyYWNrVm9sdW1lKHBQVE1kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlQQ01zaXplLCBmUFRWb2xMZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBNNE5PX0VSUk9SICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxlUmVhZERhdGEgZm9yIGF1ZGlvIGVyciAlZCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgKz0gbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbGxCdWZmZXIgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWxsZCIsIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcHRyIGRhdGEgdG8gcHJpbWFyeSB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRGcmFtZS5tX2RhdGFBZGRyZXNzID0gKE00T1NBX1VJbnQxNiopcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRGcmFtZS5tX2J1ZmZlclNpemUgPSBsZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdG8gbWl4IGFuZCBkdWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qcm9jZXNzLT5taXhBbmREdWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRGcmFtZSwgJmJnRnJhbWUsICZtaXhGcmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIGRlY29kZWQgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbWl4RnJhbWUubV9kYXRhQWRkcmVzcywgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUF1ZGlvTWl4U2V0dGluZ3MtPmJMb29wKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIHRvIGJlZ2luIGN1dCB0aW1lIGVxdWFsIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlT3JpZ2luYWxTZWVrUG9pbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2Ygdm9sdW1lIGxldmVsIG9mIHByaW1hcnkgdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmUFRWb2xMZXZlbCA8IDEuMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcmltYXJ5VHJhY2tWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQVE1kYXRhLCB1aVBDTXNpemUsIGZQVFZvbExldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmdGcmFtZS5tX2RhdGFBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShiZ0ZyYW1lLm1fZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1peEZyYW1lLm1fZGF0YUFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1peEZyYW1lLm1fZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gbWl4aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIHZvbHVtZSBsZXZlbCBvZiBwcmltYXJ5IHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihmUFRWb2xMZXZlbCA8IDEuMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByaW1hcnlUcmFja1ZvbHVtZShwUFRNZGF0YSwgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZQVFZvbExldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0soKHN0YXR1cyA9PSBPSyAmJiBtSW5wdXRCdWZmZXIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICB8fCAoc3RhdHVzICE9IE9LICYmIG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSk7Ci0KLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmlsbEJ1ZmZlcjogbVNvdXJjZS0+cmVhZCByZXR1cm5lZCBlcnIgJWQiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgIGlmIChtT2JzZXJ2ZXIgJiYgIW1SZWFjaGVkRU9TKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc3RFT1MgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtRmluYWxTdGF0dXMgPSBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAmbVBvc2l0aW9uVGltZU1lZGlhVXMpKTsKLQotICAgICAgICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9Ci0gICAgICAgICAgICAgICAgKChtTnVtRnJhbWVzUGxheWVkICsgc2l6ZV9kb25lIC8gbUZyYW1lU2l6ZSkgKiAxMDAwMDAwKQotICAgICAgICAgICAgICAgICAgICAvIG1TYW1wbGVSYXRlOwotCi0gICAgICAgICAgICBBTE9HVigiYnVmZmVyLT5zaXplKCkgPSAlZCwgIgotICAgICAgICAgICAgICAgICAgICAgIm1Qb3NpdGlvblRpbWVNZWRpYVVzPSUuMmYgbVBvc2l0aW9uVGltZVJlYWxVcz0lLjJmIiwKLSAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgbVBvc2l0aW9uVGltZU1lZGlhVXMgLyAxRTYsIG1Qb3NpdGlvblRpbWVSZWFsVXMgLyAxRTYpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBjb3B5ID0gc2l6ZV9yZW1haW5pbmc7Ci0gICAgICAgIGlmIChjb3B5ID4gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgewotICAgICAgICAgICAgY29weSA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHkoKGNoYXIgKilkYXRhICsgc2l6ZV9kb25lLAotICAgICAgICAgICAoY29uc3QgY2hhciAqKW1JbnB1dEJ1ZmZlci0+ZGF0YSgpICsgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgIGNvcHkpOwotCi0gICAgICAgIG1JbnB1dEJ1ZmZlci0+c2V0X3JhbmdlKG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBjb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBjb3B5KTsKLQotICAgICAgICBzaXplX2RvbmUgKz0gY29weTsKLSAgICAgICAgc2l6ZV9yZW1haW5pbmcgLT0gY29weTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIG1OdW1GcmFtZXNQbGF5ZWQgKz0gc2l6ZV9kb25lIC8gbUZyYW1lU2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAocG9zdEVPUykgewotICAgICAgICBtT2JzZXJ2ZXItPnBvc3RBdWRpb0VPUygpOwotICAgIH0KLQotICAgIGlmIChwb3N0U2Vla0NvbXBsZXRlKSB7Ci0gICAgICAgIG1PYnNlcnZlci0+cG9zdEF1ZGlvU2Vla0NvbXBsZXRlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNpemVfZG9uZTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZXRBdWRpb01peFNldHRpbmdzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5ncykgewotICAgIG1BdWRpb01peFNldHRpbmdzID0gcEF1ZGlvTWl4U2V0dGluZ3M7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcEJHQXVkaW9QQ01GaWxlSGFuZGxlKXsKLSAgICBtQkdBdWRpb1BDTUZpbGVIYW5kbGUgPSBwQkdBdWRpb1BDTUZpbGVIYW5kbGU7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0QXVkaW9NaXhTdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9DdXJyZW50TWVkaWFCZWdpbkN1dFRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb0N1cnJlbnRNZWRpYVZvbHVtZVZhbCkgewotCi0gICAgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCA9IHBCR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXA7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhQmVnaW5DdXRUUyA9IHBCR0F1ZGlvQ3VycmVudE1lZGlhQmVnaW5DdXRUUzsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwgPSBwQkdBdWRpb0N1cnJlbnRNZWRpYVZvbHVtZVZhbDsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZXRQcmltYXJ5VHJhY2tWb2x1bWUoCi0gICAgTTRPU0FfSW50MTYgKmRhdGEsIE00T1NBX1VJbnQzMiBzaXplLCBNNE9TQV9GbG9hdCB2b2xMZXZlbCkgewotCi0gICAgd2hpbGUoc2l6ZS0tID4gMCkgewotICAgICAgICAqZGF0YSA9IChNNE9TQV9JbnQxNikoKCpkYXRhKSp2b2xMZXZlbCk7Ci0gICAgICAgIGRhdGErKzsKLSAgICB9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjYWY1ZTguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVkVfQVVESU9fUExBWUVSX0hfCi0jZGVmaW5lIFZFX0FVRElPX1BMQVlFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1RpbWVTb3VyY2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JNYWluLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhU291cmNlOwotY2xhc3MgQXVkaW9UcmFjazsKLWNsYXNzIFByZXZpZXdQbGF5ZXI7Ci0KLWNsYXNzIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgOiBwdWJsaWMgVGltZVNvdXJjZSB7Ci1wdWJsaWM6Ci0gICAgZW51bSB7Ci0gICAgICAgIFJFQUNIRURfRU9TLAotICAgICAgICBTRUVLX0NPTVBMRVRFCi0gICAgfTsKLQotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmssCi0gICAgICAgIFByZXZpZXdQbGF5ZXIgKmF1ZGlvT2JzZXJ2ZXIgPSBOVUxMKTsKLQotICAgIH5WaWRlb0VkaXRvckF1ZGlvUGxheWVyKCk7Ci0KLSAgICAvLyBSZXR1cm4gdGltZSBpbiB1cy4KLSAgICBpbnQ2NF90IGdldFJlYWxUaW1lVXMoKTsKLQotICAgIC8vIFJldHVybnMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBidWZmZXIgcGxheWVkIChpbiB1cykuCi0gICAgaW50NjRfdCBnZXRNZWRpYVRpbWVVcygpOwotCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmZiBhIG1hcHBpbmcgaXMgZXN0YWJsaXNoZWQsIGkuZS4gdGhlIEF1ZGlvUGxheWVyQmFzZQotICAgIC8vIGhhcyBwbGF5ZWQgYXQgbGVhc3Qgb25lIGZyYW1lIG9mIGF1ZGlvLgotICAgIGJvb2wgZ2V0TWVkaWFUaW1lTWFwcGluZyhpbnQ2NF90ICpyZWFsdGltZV91cywgaW50NjRfdCAqbWVkaWF0aW1lX3VzKTsKLQotICAgIHN0YXR1c190IHN0YXJ0KGJvb2wgc291cmNlQWxyZWFkeVN0YXJ0ZWQgPSBmYWxzZSk7Ci0gICAgdm9pZCBwYXVzZShib29sIHBsYXlQZW5kaW5nU2FtcGxlcyA9IGZhbHNlKTsKLSAgICBzdGF0dXNfdCByZXN1bWUoKTsKLSAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCB0aW1lX3VzKTsKLSAgICBib29sIGlzU2Vla2luZygpOwotICAgIGJvb2wgcmVhY2hlZEVPUyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpOwotCi0gICAgdm9pZCBzZXRBdWRpb01peFNldHRpbmdzKE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5ncyk7Ci0gICAgdm9pZCBzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoTTRPU0FfQ29udGV4dCBwQkdBdWRpb1BDTUZpbGVIYW5kbGUpOwotICAgIHZvaWQgc2V0QXVkaW9NaXhTdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCgKLSAgICAgICAgTTRPU0FfVUludDMyIHBCR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAsCi0gICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb0N1cnJlbnRNZWRpYUJlZ2luQ3V0VFMsCi0gICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb0N1cnJlbnRNZWRpYVZvbHVtZVZhbCk7Ci0KLSAgICB2b2lkIHNldE9ic2VydmVyKFByZXZpZXdQbGF5ZXIgKm9ic2VydmVyKTsKLSAgICB2b2lkIHNldFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IGdldFNvdXJjZSgpOwotCi0gICAgYm9vbCBpc1N0YXJ0ZWQoKTsKLXByaXZhdGU6Ci0KLSAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyAqbUF1ZGlvTWl4U2V0dGluZ3M7Ci0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyAqbUF1ZGlvUHJvY2VzczsKLQotICAgIE00T1NBX0NvbnRleHQgbUJHQXVkaW9QQ01GaWxlSGFuZGxlOwotICAgIGludDY0X3QgbUJHQXVkaW9QQ01GaWxlTGVuZ3RoOwotICAgIGludDY0X3QgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aDsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uOwotICAgIGludDY0X3QgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50OwotICAgIGludDY0X3QgbUJHQXVkaW9QQ01GaWxlT3JpZ2luYWxTZWVrUG9pbnQ7Ci0gICAgaW50NjRfdCBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wOwotICAgIGludDY0X3QgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhQmVnaW5DdXRUUzsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbDsKLQotICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwotICAgIHNwPEF1ZGlvVHJhY2s+IG1BdWRpb1RyYWNrOwotCi0gICAgTWVkaWFCdWZmZXIgKm1JbnB1dEJ1ZmZlcjsKLQotICAgIGludCBtU2FtcGxlUmF0ZTsKLSAgICBpbnQ2NF90IG1MYXRlbmN5VXM7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci0KLSAgICBNdXRleCBtTG9jazsKLSAgICBpbnQ2NF90IG1OdW1GcmFtZXNQbGF5ZWQ7Ci0KLSAgICBpbnQ2NF90IG1Qb3NpdGlvblRpbWVNZWRpYVVzOwotICAgIGludDY0X3QgbVBvc2l0aW9uVGltZVJlYWxVczsKLQotICAgIGJvb2wgbVNlZWtpbmc7Ci0gICAgYm9vbCBtUmVhY2hlZEVPUzsKLSAgICBzdGF0dXNfdCBtRmluYWxTdGF0dXM7Ci0gICAgaW50NjRfdCBtU2Vla1RpbWVVczsKLQotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0KLSAgICBib29sIG1Jc0ZpcnN0QnVmZmVyOwotICAgIHN0YXR1c190IG1GaXJzdEJ1ZmZlclJlc3VsdDsKLSAgICBNZWRpYUJ1ZmZlciAqbUZpcnN0QnVmZmVyOwotCi0gICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7Ci0gICAgUHJldmlld1BsYXllciAqbU9ic2VydmVyOwotCi0gICAgc3RhdGljIHZvaWQgQXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKnVzZXIsIHZvaWQgKmluZm8pOwotICAgIHZvaWQgQXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pOwotICAgIHNpemVfdCBmaWxsQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0aWMgc2l6ZV90IEF1ZGlvU2lua0NhbGxiYWNrKAotICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKLSAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICptZSwKLSAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KTsKLQotICAgIHZvaWQgcmVzZXQoKTsKLSAgICB2b2lkIGNsZWFyKCk7Ci0gICAgaW50NjRfdCBnZXRSZWFsVGltZVVzX2woKTsKLSAgICB2b2lkIHNldFByaW1hcnlUcmFja1ZvbHVtZSgKLSAgICAgICAgICAgIE00T1NBX0ludDE2ICpkYXRhLCBNNE9TQV9VSW50MzIgc2l6ZSwgTTRPU0FfRmxvYXQgdm9sTGV2ZWwpOwotCi0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllcihjb25zdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyICYpOwotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgJm9wZXJhdG9yPShjb25zdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBWRV9BVURJT19QTEFZRVJfSF8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjRmY2Y0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlICJWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6VmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpIHsKLSAgICBBTE9HVigiQ29uc3RydWN0b3IiKTsKLQotICAgIG1BdWRWb2xBcnJJbmRleCA9IDA7Ci0gICAgbURvRHVja2luZyA9IDA7Ci0gICAgbUR1Y2tpbmdfZW5hYmxlID0gMDsKLSAgICBtRHVja2luZ19sb3dWb2x1bWUgPSAwOwotICAgIG1EdWNraW5nX3RocmVzaG9sZCA9IDA7Ci0gICAgbUR1Y2tpbmdGYWN0b3IgPSAwOwotCi0gICAgbUJUVm9sTGV2ZWwgPSAwOwotICAgIG1QVFZvbExldmVsID0gMDsKLQotICAgIG1Jc1NTUkNuZWVkZWQgPSAwOwotICAgIG1DaGFubmVsQ29udmVyc2lvbiA9IDA7Ci0KLSAgICBtQlRGb3JtYXQgPSBNT05PXzE2X0JJVDsKLQotICAgIG1JblNhbXBsZVJhdGUgPSA4MDAwOwotICAgIG1PdXRTYW1wbGVSYXRlID0gMTYwMDA7Ci0gICAgbVBUQ2hhbm5lbENvdW50ID0gMjsKLSAgICBtQlRDaGFubmVsQ291bnQgPSAxOwotfQotCi1NNE9TQV9JbnQzMiBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjptaXhBbmREdWNrKAotICAgICAgICB2b2lkICpwcmltYXJ5VHJhY2tCdWZmZXIsCi0gICAgICAgIHZvaWQgKmJhY2tncm91bmRUcmFja0J1ZmZlciwKLSAgICAgICAgdm9pZCAqb3V0QnVmZmVyKSB7Ci0KLSAgICBBTE9HVigibWl4QW5kRHVjazogdHJhY2sgYnVmZmVycyAocHJpbWFyeTogMHgleCBhbmQgYmFja2dyb3VuZDogMHgleCkgIgotICAgICAgICAgICAgImFuZCBvdXQgYnVmZmVyIDB4JXgiLAotICAgICAgICAgICAgcHJpbWFyeVRyYWNrQnVmZmVyLCBiYWNrZ3JvdW5kVHJhY2tCdWZmZXIsIG91dEJ1ZmZlcik7Ci0KLSAgICBNNEFNX0J1ZmZlcjE2KiBwUHJpbWFyeVRyYWNrICAgPSAoTTRBTV9CdWZmZXIxNiopcHJpbWFyeVRyYWNrQnVmZmVyOwotICAgIE00QU1fQnVmZmVyMTYqIHBCYWNrZ3JvdW5kVHJhY2sgPSAoTTRBTV9CdWZmZXIxNiopYmFja2dyb3VuZFRyYWNrQnVmZmVyOwotICAgIE00QU1fQnVmZmVyMTYqIHBNaXhlZE91dEJ1ZmZlciAgPSAoTTRBTV9CdWZmZXIxNiopb3V0QnVmZmVyOwotCi0gICAgLy8gT3V0cHV0IHNpemUgaWYgc2FtZSBhcyBQVCBzaXplCi0gICAgcE1peGVkT3V0QnVmZmVyLT5tX2J1ZmZlclNpemUgPSBwUHJpbWFyeVRyYWNrLT5tX2J1ZmZlclNpemU7Ci0KLSAgICAvLyBCZWZvcmUgbWl4aW5nLCB3ZSBuZWVkIHRvIGhhdmUgb25seSBQVCBhcyBvdXQgYnVmZmVyCi0gICAgbWVtY3B5KCh2b2lkICopcE1peGVkT3V0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAodm9pZCAqKXBQcmltYXJ5VHJhY2stPm1fZGF0YUFkZHJlc3MsIHBNaXhlZE91dEJ1ZmZlci0+bV9idWZmZXJTaXplKTsKLQotICAgIC8vIEluaXRpYWxpemUgZHVja2luZyB2YXJpYWJsZXMKLSAgICAvLyBJbml0aWFsbHkgY29udGFpbnMgdGhlIGlucHV0IHByaW1hcnkgdHJhY2sKLSAgICBNNE9TQV9JbnQxNiAqcFBUTWRhdGEyID0gKE00T1NBX0ludDE2KilwTWl4ZWRPdXRCdWZmZXItPm1fZGF0YUFkZHJlc3M7Ci0KLSAgICAvLyBDb250YWlucyBCRyB0cmFjayBwcm9jZXNzZWQgZGF0YShsaWtlIGNoYW5uZWwgY29udmVyc2lvbiBldGMuLgotICAgIE00T1NBX0ludDE2ICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYqKSBwQmFja2dyb3VuZFRyYWNrLT5tX2RhdGFBZGRyZXNzOwotCi0gICAgLy8gU2luY2Ugd2UgbmVlZCB0byBnaXZlIHNhbXBsZSBjb3VudCBhbmQgbm90IGJ1ZmZlciBzaXplCi0gICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSA9IHBNaXhlZE91dEJ1ZmZlci0+bV9idWZmZXJTaXplIC8gMiA7Ci0KLSAgICBpZiAoKG1EdWNraW5nX2VuYWJsZSkgJiYgKG1QVFZvbExldmVsICE9IDAuMCkpIHsKLSAgICAgICAgTTRPU0FfSW50MzIgcGVha0RiVmFsdWUgPSAwOwotICAgICAgICBNNE9TQV9JbnQzMiBwcmV2aW91c0RiVmFsdWUgPSAwOwotICAgICAgICBNNE9TQV9JbnQxNiAqcFBDTTE2U2FtcGxlID0gKE00T1NBX0ludDE2KilwUHJpbWFyeVRyYWNrLT5tX2RhdGFBZGRyZXNzOwotICAgICAgICBjb25zdCBzaXplX3QgbiA9IHBQcmltYXJ5VHJhY2stPm1fYnVmZmVyU2l6ZSAvIHNpemVvZihNNE9TQV9JbnQxNik7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgbG9vcEluZGV4ID0gMDsgbG9vcEluZGV4IDwgbjsgKytsb29wSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChwUENNMTZTYW1wbGVbbG9vcEluZGV4XSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGVha0RiVmFsdWUgPSBwcmV2aW91c0RiVmFsdWUgPiBwUENNMTZTYW1wbGVbbG9vcEluZGV4XSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWUgOiBwUENNMTZTYW1wbGVbbG9vcEluZGV4XTsKLSAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWUgPSBwZWFrRGJWYWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGVha0RiVmFsdWUgPSBwcmV2aW91c0RiVmFsdWUgPiAtcFBDTTE2U2FtcGxlW2xvb3BJbmRleF0gPwotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlOiAtcFBDTTE2U2FtcGxlW2xvb3BJbmRleF07Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlID0gcGVha0RiVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtQXVkaW9Wb2x1bWVBcnJheVttQXVkVm9sQXJySW5kZXhdID0gZ2V0RGVjaWJlbFNvdW5kKHBlYWtEYlZhbHVlKTsKLQotICAgICAgICAvLyBDaGVjayBmb3IgdGhyZXNob2xkIGlzIGRvbmUgYWZ0ZXIga1Byb2Nlc3NpbmdXaW5kb3dTaXplIGN5Y2xlcwotICAgICAgICBpZiAobUF1ZFZvbEFyckluZGV4ID49IGtQcm9jZXNzaW5nV2luZG93U2l6ZSAtIDEpIHsKLSAgICAgICAgICAgIG1Eb0R1Y2tpbmcgPSBpc1RocmVzaG9sZEJyZWFjaGVkKAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9Wb2x1bWVBcnJheSwgbUF1ZFZvbEFyckluZGV4LCBtRHVja2luZ190aHJlc2hvbGQpOwotCi0gICAgICAgICAgICBtQXVkVm9sQXJySW5kZXggPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUF1ZFZvbEFyckluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBCZWxvdyBsb2dpYyBjb250cm9scyB0aGUgbWl4aW5nIHdlaWdodGFnZQotICAgICAgICAvLyBmb3IgQmFja2dyb3VuZCBhbmQgUHJpbWFyeSBUcmFja3MKLSAgICAgICAgLy8gZm9yIHRoZSBkdXJhdGlvbiBvZiB3aW5kb3cgdW5kZXIgYW5hbHlzaXMsCi0gICAgICAgIC8vIHRvIGdpdmUgZmFkZS1vdXQgZm9yIEJhY2tncm91bmQgYW5kIGZhZGUtaW4gZm9yIHByaW1hcnkKLSAgICAgICAgLy8gQ3VycmVudCBmYWRpbmcgZmFjdG9yIGlzIGRpc3RyaWJ1dGVkIGluIGVxdWFsIHJhbmdlIG92ZXIKLSAgICAgICAgLy8gdGhlIGRlZmluZWQgd2luZG93IHNpemUuCi0gICAgICAgIC8vIEZvciBhIHdpbmRvdyBzaXplID0gMjUKLSAgICAgICAgLy8gKDUwMCBtcyAod2luZG93IHVuZGVyIGFuYWx5c2lzKSAvIDIwIG1zIChzYW1wbGUgZHVyYXRpb24pKQotICAgICAgICAvLwotCi0gICAgICAgIGlmIChtRG9EdWNraW5nKSB7Ci0gICAgICAgICAgICBpZiAobUR1Y2tpbmdGYWN0b3IgPiBtRHVja2luZ19sb3dWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAvLyBGQURFIE9VVCBCRyBUcmFjawotICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBkdWNraW5nIGZhY3RvciBpbiB0b3RhbCBzdGVwcyBpbiBmYWN0b3IKLSAgICAgICAgICAgICAgICAvLyBvZiBsb3cgdm9sdW1lIHN0ZXBzIHRvIHJlYWNoIGxvdyB2b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBtRHVja2luZ0ZhY3RvciAtPSBtRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1EdWNraW5nRmFjdG9yID0gbUR1Y2tpbmdfbG93Vm9sdW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1EdWNraW5nRmFjdG9yIDwgMS4wICkgewotICAgICAgICAgICAgICAgIC8vIEZBREUgSU4gQkcgVHJhY2sKLSAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgZHVja2luZyBmYWN0b3IgaW4gdG90YWwgc3RlcHMgb2YKLSAgICAgICAgICAgICAgICAvLyBsb3cgdm9sdW1lIGZhY3RvciB0byByZWFjaCBvcmlnLnZvbHVtZSBsZXZlbAotICAgICAgICAgICAgICAgIG1EdWNraW5nRmFjdG9yICs9IG1EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUR1Y2tpbmdGYWN0b3IgPSAxLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8vIGVuZCBpZiAtIG1EdWNraW5nX2VuYWJsZQotCi0KLSAgICAvLyBNaXhpbmcgbG9naWMKLSAgICBBTE9HVigiT3V0IG9mIER1Y2tpbmcgYW5hbHlzaXMgdWlQQ01zaXplICVkICVmICVmIiwKLSAgICAgICAgICAgIG1Eb0R1Y2tpbmcsIG1EdWNraW5nRmFjdG9yLCBtQlRWb2xMZXZlbCk7Ci0gICAgd2hpbGUgKHVpUENNc2l6ZS0tID4gMCkgewotCi0gICAgICAgIC8vIFNldCB2b2wgZmFjdG9yIGZvciBCVCBhbmQgUFQKLSAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBCVE1kYXRhMSptQlRWb2xMZXZlbCk7Ci0gICAgICAgICpwUFRNZGF0YTIgPSAoTTRPU0FfSW50MTYpKCpwUFRNZGF0YTIqbVBUVm9sTGV2ZWwpOwotCi0gICAgICAgIC8vIE1peCB0aGUgdHdvIHNhbXBsZXMKLSAgICAgICAgaWYgKG1Eb0R1Y2tpbmcpIHsKLQotICAgICAgICAgICAgLy8gRHVjayB0aGUgQkcgdHJhY2sgdG8gZHVja2luZyBmYWN0b3IgdmFsdWUgYmVmb3JlIG1peGluZwotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKCpwQlRNZGF0YTEpKihtRHVja2luZ0ZhY3RvcikpOwotCi0gICAgICAgICAgICAvLyBtaXggYXMgbm9ybWFsIGNhc2UKLSAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwQlRNZGF0YTEgLzIgKyAqcFBUTWRhdGEyIC8yKTsKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKCpwQlRNZGF0YTEpKihtRHVja2luZ0ZhY3RvcikpOwotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBCVE1kYXRhMSAvMiArICpwUFRNZGF0YTIgLzIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfSW50MzIgdGVtcDsKLSAgICAgICAgaWYgKCpwQlRNZGF0YTEgPCAwKSB7Ci0gICAgICAgICAgICB0ZW1wID0gLSgqcEJUTWRhdGExKSAqIDI7IC8vIGJyaW5nIHRvIG9yaWdpbmFsIEFtcGxpdHVkZSBsZXZlbAotCi0gICAgICAgICAgICBpZiAodGVtcCA+IDMyNzY3KSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IC0zMjc2NjsgLy8gbGVzcyB0aGVuIG1heCBhbGxvd2VkIHZhbHVlCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKC10ZW1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRlbXAgPSAoKnBCVE1kYXRhMSkgKiAyOyAvLyBicmluZyB0byBvcmlnaW5hbCBBbXBsaXR1ZGUgbGV2ZWwKLSAgICAgICAgICAgIGlmICggdGVtcCA+IDMyNzY4KSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IDMyNzY3OyAvLyBsZXNzIHRoYW4gbWF4IGFsbG93ZWQgdmFsdWUKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNil0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcEJUTWRhdGExKys7Ci0gICAgICAgIHBQVE1kYXRhMisrOwotICAgIH0KLQotICAgIG1lbWNweSgodm9pZCAqKXBNaXhlZE91dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywKLSAgICAgICAgKHZvaWQgKilwQmFja2dyb3VuZFRyYWNrLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICBwQmFja2dyb3VuZFRyYWNrLT5tX2J1ZmZlclNpemUpOwotCi0gICAgQUxPR1YoIm1peEFuZER1Y2s6IFgiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfSW50MzIgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6Y2FsY3VsYXRlT3V0UmVzYW1wbGVCdWZTaXplKCkgewotCi0gICAgLy8gVGhpcyBhbHJlYWR5IHRha2VzIGNhcmUgb2YgY2hhbm5lbCBjb3VudCBpbiBtQlRCdWZmZXIubV9idWZmZXJTaXplCi0gICAgcmV0dXJuIChtT3V0U2FtcGxlUmF0ZSAvIG1JblNhbXBsZVJhdGUpICogbUJUQnVmZmVyLm1fYnVmZmVyU2l6ZTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjpzZXRNaXhQYXJhbXMoCi0gICAgICAgIGNvbnN0IEF1ZGlvTWl4U2V0dGluZ3MmIHNldHRpbmcpIHsKLSAgICBBTE9HVigic2V0TWl4UGFyYW1zIik7Ci0KLSAgICBtRHVja2luZ19lbmFibGUgICAgICAgPSBzZXR0aW5nLmx2SW5EdWNraW5nX2VuYWJsZTsKLSAgICBtRHVja2luZ19sb3dWb2x1bWUgICAgPSBzZXR0aW5nLmx2SW5EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICBtRHVja2luZ190aHJlc2hvbGQgICAgPSBzZXR0aW5nLmx2SW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBtUFRWb2xMZXZlbCAgICAgICAgICAgPSBzZXR0aW5nLmx2UFRWb2xMZXZlbDsKLSAgICBtQlRWb2xMZXZlbCAgICAgICAgICAgPSBzZXR0aW5nLmx2QlRWb2xMZXZlbCA7Ci0gICAgbUJUQ2hhbm5lbENvdW50ICAgICAgID0gc2V0dGluZy5sdkJUQ2hhbm5lbENvdW50OwotICAgIG1QVENoYW5uZWxDb3VudCAgICAgICA9IHNldHRpbmcubHZQVENoYW5uZWxDb3VudDsKLSAgICBtQlRGb3JtYXQgICAgICAgICAgICAgPSBzZXR0aW5nLmx2QlRGb3JtYXQ7Ci0gICAgbUluU2FtcGxlUmF0ZSAgICAgICAgID0gc2V0dGluZy5sdkluU2FtcGxlUmF0ZTsKLSAgICBtT3V0U2FtcGxlUmF0ZSAgICAgICAgPSBzZXR0aW5nLmx2T3V0U2FtcGxlUmF0ZTsKLQotICAgIC8vIFJlc2V0IHRoZSBmb2xsb3dpbmcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzCi0gICAgbUF1ZFZvbEFyckluZGV4ICAgICAgID0gMDsKLSAgICBtRG9EdWNraW5nICAgICAgICAgICAgPSAwOwotICAgIG1EdWNraW5nRmFjdG9yICAgICAgICA9IDEuMDsKLQotICAgIEFMT0dWKCJkdWNraW5nIGVuYWJsZSAweCV4IGxvd1ZvbHVtZSAlZiB0aHJlc2hvbGQgJWQgIgotICAgICAgICAgICAgImZQVFZvbExldmVsICVmIEJUVm9sTGV2ZWwgJWYiLAotICAgICAgICAgICAgbUR1Y2tpbmdfZW5hYmxlLCBtRHVja2luZ19sb3dWb2x1bWUsIG1EdWNraW5nX3RocmVzaG9sZCwKLSAgICAgICAgICAgIG1QVFZvbExldmVsLCBtUFRWb2xMZXZlbCk7Ci0KLSAgICAvLyBEZWNpZGVzIGlmIFNTUkMgc3VwcG9ydCBpcyBuZWVkZWQgZm9yIHRoaXMgbWl4aW5nCi0gICAgbUlzU1NSQ25lZWRlZCA9IChzZXR0aW5nLmx2SW5TYW1wbGVSYXRlICE9IHNldHRpbmcubHZPdXRTYW1wbGVSYXRlKTsKLSAgICBpZiAoc2V0dGluZy5sdkJUQ2hhbm5lbENvdW50ICE9IHNldHRpbmcubHZQVENoYW5uZWxDb3VudCl7Ci0gICAgICAgIGlmIChzZXR0aW5nLmx2QlRDaGFubmVsQ291bnQgPT0gMil7Ci0gICAgICAgICAgICBtQ2hhbm5lbENvbnZlcnNpb24gPSAxOyAvLyBjb252ZXJ0IHRvIE1PTk8KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DaGFubmVsQ29udmVyc2lvbiA9IDI7IC8vIENvbnZlcnQgdG8gU1RFUkVPCi0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtQ2hhbm5lbENvbnZlcnNpb24gPSAwOwotICAgIH0KLX0KLQotLy8gRmFzdCB3YXkgdG8gY29tcHV0ZSAxMCAqIGxvZyh2YWx1ZSkKLU00T1NBX0ludDMyIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6OmdldERlY2liZWxTb3VuZChNNE9TQV9VSW50MzIgdmFsdWUpIHsKLSAgICBBTE9HVigiZ2V0RGVjaWJlbFNvdW5kOiAlbGQiLCB2YWx1ZSk7Ci0KLSAgICBpZiAodmFsdWUgPD0gMCB8fCB2YWx1ZSA+IDB4ODAwMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHg0MDAwKSB7IC8vIDMyNzY4Ci0gICAgICAgIHJldHVybiA5MDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgyMDAwKSB7IC8vIDE2Mzg0Ci0gICAgICAgIHJldHVybiA4NDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgxMDAwKSB7IC8vIDgxOTIKLSAgICAgICAgcmV0dXJuIDc4OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDA4MDApIHsgLy8gNDAyOAotICAgICAgICByZXR1cm4gNzI7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDQwMCkgeyAvLyAyMDQ4Ci0gICAgICAgIHJldHVybiA2NjsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMjAwKSB7IC8vIDEwMjQKLSAgICAgICAgcmV0dXJuIDYwOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAxMDApIHsgLy8gNTEyCi0gICAgICAgIHJldHVybiA1NDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDgwKSB7IC8vIDI1NgotICAgICAgICByZXR1cm4gNDg7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDA0MCkgeyAvLyAxMjgKLSAgICAgICAgcmV0dXJuIDQyOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMjApIHsgLy8gNjQKLSAgICAgICAgcmV0dXJuIDM2OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMTApIHsgLy8gMzIKLSAgICAgICAgcmV0dXJuIDMwOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMDgpIHsgLy8gMTYKLSAgICAgICAgcmV0dXJuIDI0OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMDcpIHsgLy8gOAotICAgICAgICByZXR1cm4gMjQ7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAwMykgeyAvLyA0Ci0gICAgICAgIHJldHVybiAxODsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDAxKSB7IC8vIDIKLSAgICAgICAgcmV0dXJuIDEyOwotICAgIH0gZWxzZSAgeyAvLyAxCi0gICAgICAgIHJldHVybiA2OwotICAgIH0KLX0KLQotTTRPU0FfQm9vbCBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjppc1RocmVzaG9sZEJyZWFjaGVkKAotICAgICAgICBNNE9TQV9JbnQzMiogYXZlcmFnZVZhbHVlLAotICAgICAgICBNNE9TQV9JbnQzMiBzdG9yZUNvdW50LAotICAgICAgICBNNE9TQV9JbnQzMiB0aHJlc2hvbGRWYWx1ZSkgewotCi0gICAgQUxPR1YoImlzVGhyZXNob2xkQnJlYWNoZWQiKTsKLQotICAgIGludCB0b3RhbFZhbHVlID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JlQ291bnQ7ICsraSkgewotICAgICAgICB0b3RhbFZhbHVlICs9IGF2ZXJhZ2VWYWx1ZVtpXTsKLSAgICB9Ci0gICAgcmV0dXJuICh0b3RhbFZhbHVlIC8gc3RvcmVDb3VudCA+IHRocmVzaG9sZFZhbHVlKTsKLX0KLQotfS8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiN2E2OWYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVkVfQkFDS0dST1VORF9BVURJT19QUk9DX0gKLSNkZWZpbmUgVkVfQkFDS0dST1VORF9BVURJT19QUk9DX0gKLQotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9FeHBvcnQuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9VSW50MTYqICAgbV9kYXRhQWRkcmVzczsgLy8gQW5kcm9pZCBTUkMgbmVlZHMgYSBJbnQxNiBwb2ludGVyCi0gICAgTTRPU0FfVUludDMyICAgIG1fYnVmZmVyU2l6ZTsKLX0gTTRBTV9CdWZmZXIxNjsgICAgLy8gU3RydWN0dXJlIGNvbnRhaW5zIEludDE2X3QgcG9pbnRlcgotCi1lbnVtIEF1ZGlvRm9ybWF0IHsKLSAgICBNT05PXzE2X0JJVCwKLSAgICBTVEVSRU9fMTZfQklUCi19OwotCi0vLyBGb2xsb3dpbmcgc3RydWN0IHdpbGwgYmUgdXNlZCBieSBhcHAgdG8gc3VwcGx5IHRoZSBQVCBhbmQgQlQgcHJvcGVydGllcwotLy8gYWxvbmcgd2l0aCBkdWNraW5nIHZhbHVlcwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX0ludDMyIGx2SW5TYW1wbGVSYXRlOyAvLyBTYW1wbGluZyBhdWRpbyBmcmVxICg4MDAwLDE2MDAwIG9yIG1vcmUgKQotICAgIE00T1NBX0ludDMyIGx2T3V0U2FtcGxlUmF0ZTsgLy9TYW1wbGluZyBhdWRpbyBmcmVxICg4MDAwLDE2MDAwIG9yIG1vcmUgKQotICAgIEF1ZGlvRm9ybWF0IGx2QlRGb3JtYXQ7Ci0KLSAgICBNNE9TQV9JbnQzMiBsdkluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgTTRPU0FfRmxvYXQgbHZJbkR1Y2tpbmdfbG93Vm9sdW1lOwotICAgIE00T1NBX0Jvb2wgbHZJbkR1Y2tpbmdfZW5hYmxlOwotICAgIE00T1NBX0Zsb2F0IGx2UFRWb2xMZXZlbDsKLSAgICBNNE9TQV9GbG9hdCBsdkJUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfSW50MzIgbHZCVENoYW5uZWxDb3VudDsKLSAgICBNNE9TQV9JbnQzMiBsdlBUQ2hhbm5lbENvdW50OwotfSBBdWRpb01peFNldHRpbmdzOwotCi0vLyBUaGlzIGNsYXNzIGlzIGRlZmluZWQgdG8gZ2V0IFNGIFNSQyBhY2Nlc3MKLWNsYXNzIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcgewotcHVibGljOgotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcoKTsKLSAgICB+VmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpIHt9Ci0KLSAgICB2b2lkIHNldE1peFBhcmFtcyhjb25zdCBBdWRpb01peFNldHRpbmdzJiBwYXJhbXMpOwotCi0gICAgTTRPU0FfSW50MzIgbWl4QW5kRHVjaygKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogcHJpbWFyeVRyYWNrQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICB2b2lkKiBiYWNrZ3JvdW5kVHJhY2tCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqIG1peGVkT3V0cHV0QnVmZmVyKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga1Byb2Nlc3NpbmdXaW5kb3dTaXplID0gMTAsCi0gICAgfTsKLQotICAgIE00T1NBX0ludDMyIG1JblNhbXBsZVJhdGU7Ci0gICAgTTRPU0FfSW50MzIgbU91dFNhbXBsZVJhdGU7Ci0gICAgQXVkaW9Gb3JtYXQgbUJURm9ybWF0OwotCi0gICAgTTRPU0FfQm9vbCBtSXNTU1JDbmVlZGVkOwotICAgIE00T1NBX0ludDMyIG1CVENoYW5uZWxDb3VudDsKLSAgICBNNE9TQV9JbnQzMiBtUFRDaGFubmVsQ291bnQ7Ci0gICAgTTRPU0FfVUludDggbUNoYW5uZWxDb252ZXJzaW9uOwotCi0gICAgTTRPU0FfVUludDMyIG1EdWNraW5nX3RocmVzaG9sZDsKLSAgICBNNE9TQV9GbG9hdCBtRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgTTRPU0FfRmxvYXQgbUR1Y2tpbmdGYWN0b3IgOwotICAgIE00T1NBX0Jvb2wgbUR1Y2tpbmdfZW5hYmxlOwotICAgIE00T1NBX0ludDMyIG1BdWRpb1ZvbHVtZUFycmF5W2tQcm9jZXNzaW5nV2luZG93U2l6ZV07Ci0gICAgTTRPU0FfSW50MzIgbUF1ZFZvbEFyckluZGV4OwotICAgIE00T1NBX0Jvb2wgbURvRHVja2luZzsKLSAgICBNNE9TQV9GbG9hdCBtUFRWb2xMZXZlbDsKLSAgICBNNE9TQV9GbG9hdCBtQlRWb2xMZXZlbDsKLQotICAgIE00QU1fQnVmZmVyMTYgbUJUQnVmZmVyOwotCi0gICAgTTRPU0FfSW50MzIgZ2V0RGVjaWJlbFNvdW5kKE00T1NBX1VJbnQzMiB2YWx1ZSk7Ci0gICAgTTRPU0FfQm9vbCAgaXNUaHJlc2hvbGRCcmVhY2hlZChNNE9TQV9JbnQzMiogYXZlcmFnZVZhbHVlLAotICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBzdG9yZUNvdW50LCBNNE9TQV9JbnQzMiB0aHJlc2hvbGRWYWx1ZSk7Ci0KLSAgICAvLyBUaGlzIHJldHVybnMgdGhlIHNpemUgb2YgYnVmZmVyIHdoaWNoIG5lZWRzIHRvIGFsbG9jYXRlZAotICAgIC8vIGJlZm9yZSByZXNhbXBsaW5nIGlzIGNhbGxlZAotICAgIE00T1NBX0ludDMyIGNhbGN1bGF0ZU91dFJlc2FtcGxlQnVmU2l6ZSgpOwotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZS4KLSAgICBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nKGNvbnN0IFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcmKTsKLSAgICBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nJiBvcGVyYXRvcj0oCi0gICAgICAgICAgICBjb25zdCBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gVkVfQkFDS0dST1VORF9BVURJT19QUk9DX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQbGF5ZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkNjU2YzQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZpZGVvRWRpdG9yUGxheWVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JQbGF5ZXIuaCIKLSNpbmNsdWRlICJQcmV2aWV3UGxheWVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1WaWRlb0VkaXRvclBsYXllcjo6VmlkZW9FZGl0b3JQbGF5ZXIoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyKQotICAgIDogbVBsYXllcihuZXcgUHJldmlld1BsYXllcihyZW5kZXJlcikpIHsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclBsYXllciIpOwotICAgIG1QbGF5ZXItPnNldExpc3RlbmVyKHRoaXMpOwotfQotCi1WaWRlb0VkaXRvclBsYXllcjo6flZpZGVvRWRpdG9yUGxheWVyKCkgewotICAgIEFMT0dWKCJ+VmlkZW9FZGl0b3JQbGF5ZXIiKTsKLQotICAgIHJlc2V0KCk7Ci0gICAgbVZlQXVkaW9TaW5rLmNsZWFyKCk7Ci0KLSAgICBkZWxldGUgbVBsYXllcjsKLSAgICBtUGxheWVyID0gTlVMTDsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmluaXRDaGVjaygpIHsKLSAgICBBTE9HVigiaW5pdENoZWNrIik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRBdWRpb1BsYXllcihWaWRlb0VkaXRvckF1ZGlvUGxheWVyICphdWRpb1BsYXllcikgewotICAgIHJldHVybiBtUGxheWVyLT5zZXRBdWRpb1BsYXllcihhdWRpb1BsYXllcik7Ci19Ci0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKLSAgICBBTE9HSSgic2V0RGF0YVNvdXJjZSgnJXMnKSIsIHVybCk7Ci0gICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiSGVhZGVycyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UodXJsKTsKLX0KLQotLy9XZSBkb25vdCB1c2UgdGhpcyBpbiBwcmV2aWV3LCBkdW1teSBpbXBsaW1lbnRhdGlvbiBhcyB0aGlzIGlzIHB1cmUgdmlydHVhbAotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwKLSAgICBpbnQ2NF90IGxlbmd0aCkgewotICAgIEFMT0dFKCJzZXREYXRhU291cmNlKCVkLCAlbGxkLCAlbGxkKSBOb3Qgc3VwcG9ydGVkIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICByZXR1cm4gKCFPSyk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKLSAgICBBTE9HVigic2V0VmlkZW9TdXJmYWNlIik7Ci0KLSAgICBtUGxheWVyLT5zZXRTdXJmYWNlKHN1cmZhY2UpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJ1ZmZlclByb2R1Y2VyKSB7Ci0gICAgQUxPR1YoInNldFZpZGVvU3VyZmFjZVRleHR1cmUiKTsKLQotICAgIG1QbGF5ZXItPnNldFN1cmZhY2VUZXh0dXJlKGJ1ZmZlclByb2R1Y2VyKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpwcmVwYXJlKCkgewotICAgIEFMT0dWKCJwcmVwYXJlIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnByZXBhcmUoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnByZXBhcmVBc3luYygpIHsKLSAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZUFzeW5jKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzdGFydCgpIHsKLSAgICBBTE9HVigic3RhcnQiKTsKLSAgICByZXR1cm4gbVBsYXllci0+cGxheSgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotICAgIHJldHVybiBwYXVzZSgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cGF1c2UoKSB7Ci0gICAgQUxPR1YoInBhdXNlIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnBhdXNlKCk7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JQbGF5ZXI6OmlzUGxheWluZygpIHsKLSAgICBBTE9HVigiaXNQbGF5aW5nIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPmlzUGxheWluZygpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2Vla1RvKGludCBtc2VjKSB7Ci0gICAgQUxPR1YoInNlZWtUbyIpOwotICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPnNlZWtUbygoaW50NjRfdCltc2VjICogMTAwMCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQgKm1zZWMpIHsKLSAgICBBTE9HVigiZ2V0Q3VycmVudFBvc2l0aW9uIik7Ci0gICAgaW50NjRfdCBwb3NpdGlvblVzOwotICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPmdldFBvc2l0aW9uKCZwb3NpdGlvblVzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAqbXNlYyA9IChwb3NpdGlvblVzICsgNTAwKSAvIDEwMDA7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6Z2V0RHVyYXRpb24oaW50ICptc2VjKSB7Ci0gICAgQUxPR1YoImdldER1cmF0aW9uIik7Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAqbXNlYyA9IDA7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAqbXNlYyA9IChkdXJhdGlvblVzICsgNTAwKSAvIDEwMDA7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cmVzZXQoKSB7Ci0gICAgQUxPR1YoInJlc2V0Iik7Ci0gICAgbVBsYXllci0+cmVzZXQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRMb29waW5nKGludCBsb29wKSB7Ci0gICAgQUxPR1YoInNldExvb3BpbmciKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0TG9vcGluZyhsb29wKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKLSAgICBBTE9HRSgic2V0UGFyYW1ldGVyIG5vdCBpbXBsZW1lbnRlZCIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7Ci0gICAgQUxPR0UoImdldFBhcmFtZXRlciBub3QgaW1wbGVtZW50ZWQiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXBsYXllcl90eXBlIFZpZGVvRWRpdG9yUGxheWVyOjpwbGF5ZXJUeXBlKCkgewotICAgIEFMT0dWKCJwbGF5ZXJUeXBlIik7Ci0gICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6YWNxdWlyZUxvY2soKSB7Ci0gICAgQUxPR1YoImFjcXVpcmVMb2NrIik7Ci0gICAgbVBsYXllci0+YWNxdWlyZUxvY2soKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6cmVsZWFzZUxvY2soKSB7Ci0gICAgQUxPR1YoInJlbGVhc2VMb2NrIik7Ci0gICAgbVBsYXllci0+cmVsZWFzZUxvY2soKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6Omludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKLSAgICBNZWRpYVBsYXllckludGVyZmFjZTo6c2V0QXVkaW9TaW5rKGF1ZGlvU2luayk7Ci0KLSAgICBtUGxheWVyLT5zZXRBdWRpb1NpbmsoYXVkaW9TaW5rKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldE1ldGFkYXRhKAotICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpIHsKLSAgICB1c2luZyBtZWRpYTo6TWV0YWRhdGE7Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IG1QbGF5ZXItPmdldFNvdXJjZVNlZWtGbGFncygpOwotCi0gICAgTWV0YWRhdGEgbWV0YWRhdGEocmVjb3Jkcyk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtQYXVzZUF2YWlsYWJsZSwKLSAgICAgICAgICAgIGZsYWdzICYgTWVkaWFFeHRyYWN0b3I6OkNBTl9QQVVTRSk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrQmFja3dhcmRBdmFpbGFibGUsCi0gICAgICAgICAgICBmbGFncyAmIE1lZGlhRXh0cmFjdG9yOjpDQU5fU0VFS19CQUNLV0FSRCk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrRm9yd2FyZEF2YWlsYWJsZSwKLSAgICAgICAgICAgIGZsYWdzICYgTWVkaWFFeHRyYWN0b3I6OkNBTl9TRUVLX0ZPUldBUkQpOwotCi0gICAgbWV0YWRhdGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0F2YWlsYWJsZSwKLSAgICAgICAgICAgIGZsYWdzICYgTWVkaWFFeHRyYWN0b3I6OkNBTl9TRUVLKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmxvYWRFZmZlY3RzU2V0dGluZ3MoCi0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBwRWZmZWN0U2V0dGluZ3MsIGludCBuRWZmZWN0cykgewotICAgIEFMT0dWKCJsb2FkRWZmZWN0c1NldHRpbmdzIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPmxvYWRFZmZlY3RzU2V0dGluZ3MocEVmZmVjdFNldHRpbmdzLCBuRWZmZWN0cyk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpsb2FkQXVkaW9NaXhTZXR0aW5ncygKLSAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JQbGF5ZXI6IGxvYWRBdWRpb01peFNldHRpbmdzIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPmxvYWRBdWRpb01peFNldHRpbmdzKHBBdWRpb01peFNldHRpbmdzKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZSgKLSAgICBNNE9TQV9Db250ZXh0IHBBdWRpb01peFBDTUZpbGVIYW5kbGUpIHsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclBsYXllcjogbG9hZEF1ZGlvTWl4U2V0dGluZ3MiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKHBBdWRpb01peFBDTUZpbGVIYW5kbGUpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oCi0gICAgTTRPU0FfVUludDMyIGF1ZGlvTWl4U3RvcnlCb2FyZFRTLAotICAgIE00T1NBX1VJbnQzMiBjdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgTTRPU0FfVUludDMyIHByaW1hcnlUcmFja1ZvbFZhbHVlKSB7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JQbGF5ZXI6IGxvYWRBdWRpb01peFNldHRpbmdzIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKGF1ZGlvTWl4U3RvcnlCb2FyZFRTLAotICAgICBjdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsIHByaW1hcnlUcmFja1ZvbFZhbHVlKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFBsYXliYWNrQmVnaW5UaW1lKHVpbnQzMl90IG1zZWMpIHsKLSAgICBBTE9HVigic2V0UGxheWJhY2tCZWdpblRpbWUiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0UGxheWJhY2tCZWdpblRpbWUobXNlYyk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRQbGF5YmFja0VuZFRpbWUodWludDMyX3QgbXNlYykgewotICAgIEFMT0dWKCJzZXRQbGF5YmFja0VuZFRpbWUiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0UGxheWJhY2tFbmRUaW1lKG1zZWMpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0U3Rvcnlib2FyZFN0YXJ0VGltZSh1aW50MzJfdCBtc2VjKSB7Ci0gICAgQUxPR1YoInNldFN0b3J5Ym9hcmRTdGFydFRpbWUiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0U3Rvcnlib2FyZFN0YXJ0VGltZShtc2VjKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCh1aW50MzJfdCBjYkludGVydmFsKSB7Ci0gICAgQUxPR1YoInNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRQcm9ncmVzc0NhbGxiYWNrSW50ZXJ2YWwoY2JJbnRlcnZhbCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRNZWRpYVJlbmRlcmluZ01vZGUoCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgb3V0cHV0VmlkZW9TaXplKSB7Ci0KLSAgICBBTE9HVigic2V0TWVkaWFSZW5kZXJpbmdNb2RlIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldE1lZGlhUmVuZGVyaW5nTW9kZShtb2RlLCBvdXRwdXRWaWRlb1NpemUpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCgpIHsKLSAgICBBTE9HVigicmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCIpOwotICAgIHJldHVybiBtUGxheWVyLT5yZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKAotICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0SW1hZ2VDbGlwUHJvcGVydGllcyh3aWR0aCwgaGVpZ2h0KTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnJlYWRGaXJzdFZpZGVvRnJhbWUoKSB7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnJlYWRGaXJzdFZpZGVvRnJhbWUoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldExhc3RSZW5kZXJlZFRpbWVNcyh1aW50MzJfdCAqbGFzdFJlbmRlcmVkVGltZU1zKSB7Ci0gICAgbVBsYXllci0+Z2V0TGFzdFJlbmRlcmVkVGltZU1zKGxhc3RSZW5kZXJlZFRpbWVNcyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1NpbmsgaW50ZXJmYWNlICovCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJWZUF1ZGlvU2luayIKLQotaW50IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjptTWluQnVmZmVyQ291bnQgPSA0OwotYm9vbCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6bUlzT25FbXVsYXRvciA9IGZhbHNlOwotCi1WaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6VmVBdWRpb091dHB1dCgpCi0gICAgOiBtQ2FsbGJhY2soTlVMTCksCi0gICAgICBtQ2FsbGJhY2tDb29raWUoTlVMTCkgewotICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIG1MZWZ0Vm9sdW1lID0gMS4wOwotICAgIG1SaWdodFZvbHVtZSA9IDEuMDsKLSAgICBtTGF0ZW5jeSA9IDA7Ci0gICAgbU1zZWNzUGVyRnJhbWUgPSAwOwotICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKLSAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwotfQotCi1WaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6flZlQXVkaW9PdXRwdXQoKSB7Ci0gICAgY2xvc2UoKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c2V0TWluQnVmZmVyQ291bnQoKSB7Ci0KLSAgICBtSXNPbkVtdWxhdG9yID0gZmFsc2U7Ci0gICAgbU1pbkJ1ZmZlckNvdW50ID0gNDsKLX0KLQotYm9vbCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6aXNPbkVtdWxhdG9yKCkgewotCi0gICAgc2V0TWluQnVmZmVyQ291bnQoKTsKLSAgICByZXR1cm4gbUlzT25FbXVsYXRvcjsKLX0KLQotaW50IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpnZXRNaW5CdWZmZXJDb3VudCgpIHsKLQotICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7Ci0gICAgcmV0dXJuIG1NaW5CdWZmZXJDb3VudDsKLX0KLQotc3NpemVfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6YnVmZmVyU2l6ZSgpIGNvbnN0IHsKLQotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVDb3VudCgpICogZnJhbWVTaXplKCk7Ci19Ci0KLXNzaXplX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmZyYW1lQ291bnQoKSBjb25zdCB7Ci0KLSAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKTsKLX0KLQotc3NpemVfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Y2hhbm5lbENvdW50KCkgY29uc3QKLXsKLSAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtVHJhY2stPmNoYW5uZWxDb3VudCgpOwotfQotCi1zc2l6ZV90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpmcmFtZVNpemUoKSBjb25zdAotewotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVTaXplKCk7Ci19Ci0KLXVpbnQzMl90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpsYXRlbmN5ICgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1MYXRlbmN5OwotfQotCi1mbG9hdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6bXNlY3NQZXJGcmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1Nc2Vjc1BlckZyYW1lOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Z2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdCB7Ci0KLSAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtVHJhY2stPmdldFBvc2l0aW9uKHBvc2l0aW9uKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKndyaXR0ZW4pIGNvbnN0IHsKLQotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgKndyaXR0ZW4gPSBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpvcGVuKAotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbENvdW50LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCi0gICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykgewotCi0gICAgbUNhbGxiYWNrID0gY2I7Ci0gICAgbUNhbGxiYWNrQ29va2llID0gY29va2llOwotCi0gICAgLy8gQ2hlY2sgYXJndW1lbnQgImJ1ZmZlckNvdW50IiBhZ2FpbnN0IHRoZSBtaW5pbnVtIGJ1ZmZlciBjb3VudAotICAgIGlmIChidWZmZXJDb3VudCA8IG1NaW5CdWZmZXJDb3VudCkgewotICAgICAgICBBTE9HVigiYnVmZmVyQ291bnQgKCVkKSBpcyB0b28gc21hbGwgYW5kIGluY3JlYXNlZCB0byAlZCIsCi0gICAgICAgICAgICBidWZmZXJDb3VudCwgbU1pbkJ1ZmZlckNvdW50KTsKLSAgICAgICAgYnVmZmVyQ291bnQgPSBtTWluQnVmZmVyQ291bnQ7Ci0KLSAgICB9Ci0gICAgQUxPR1YoIm9wZW4oJXUsICVkLCAlZCwgJWQpIiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBmb3JtYXQsIGJ1ZmZlckNvdW50KTsKLSAgICBpZiAobVRyYWNrICE9IDApIGNsb3NlKCk7Ci0gICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgaW50IGZyYW1lQ291bnQ7Ci0KLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgbVN0cmVhbVR5cGUpICE9Ci0gICAgIE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBtU3RyZWFtVHlwZSkgIT0KLSAgICAgTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgZnJhbWVDb3VudCA9IChzYW1wbGVSYXRlKmFmRnJhbWVDb3VudCpidWZmZXJDb3VudCkvYWZTYW1wbGVSYXRlOwotCi0gICAgaWYgKGNoYW5uZWxNYXNrID09IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgewotICAgICAgICBzd2l0Y2goY2hhbm5lbENvdW50KSB7Ci0gICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9NT05POwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxBdWRpb1RyYWNrPiB0OwotICAgIGlmIChtQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIsCi0gICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgZmxhZ3MpOwotICAgIH0KLQotICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIGF1ZGlvIHRyYWNrIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIEFMT0dWKCJzZXRWb2x1bWUiKTsKLSAgICB0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7Ci0gICAgbU1zZWNzUGVyRnJhbWUgPSAxLmUzIC8gKGZsb2F0KSBzYW1wbGVSYXRlOwotICAgIG1MYXRlbmN5ID0gdC0+bGF0ZW5jeSgpOwotICAgIG1UcmFjayA9IHQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c3RhcnQoKSB7Ci0KLSAgICBBTE9HVigic3RhcnQiKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+c3RhcnQoKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbVRyYWNrLT5nZXRQb3NpdGlvbigmbU51bUZyYW1lc1dyaXR0ZW4pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0Ojpzbm9vcFdyaXRlKAotICAgIGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgICAvLyBWaXN1YWxpemF0aW9uIGJ1ZmZlcnMgbm90IHN1cHBvcnRlZAotICAgIHJldHVybjsKLQotfQotCi1zc2l6ZV90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0Ojp3cml0ZSgKLSAgICAgY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotCi0gICAgTE9HX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKLQotICAgIC8vQUxPR1YoIndyaXRlKCVwLCAldSkiLCBidWZmZXIsIHNpemUpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBzbm9vcFdyaXRlKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIHNzaXplX3QgcmV0ID0gbVRyYWNrLT53cml0ZShidWZmZXIsIHNpemUpOwotICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSByZXQgLyA0OyAvLyBhc3N1bWUgMTYgYml0IHN0ZXJlbwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c3RvcCgpIHsKLQotICAgIEFMT0dWKCJzdG9wIik7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSBtVHJhY2stPnN0b3AoKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Zmx1c2goKSB7Ci0KLSAgICBBTE9HVigiZmx1c2giKTsKLSAgICBpZiAobVRyYWNrICE9IDApIG1UcmFjay0+Zmx1c2goKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6cGF1c2UoKSB7Ci0KLSAgICBBTE9HVigiVmVBdWRpb091dHB1dDo6cGF1c2UiKTsKLSAgICBpZiAobVRyYWNrICE9IDApIG1UcmFjay0+cGF1c2UoKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Y2xvc2UoKSB7Ci0KLSAgICBBTE9HVigiY2xvc2UiKTsKLSAgICBtVHJhY2suY2xlYXIoKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0KLSAgICBBTE9HVigic2V0Vm9sdW1lKCVmLCAlZikiLCBsZWZ0LCByaWdodCk7Ci0gICAgbUxlZnRWb2x1bWUgPSBsZWZ0OwotICAgIG1SaWdodFZvbHVtZSA9IHJpZ2h0OwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnNldFZvbHVtZShsZWZ0LCByaWdodCk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OkNhbGxiYWNrV3JhcHBlcigKLSAgICAgICAgaW50IGV2ZW50LCB2b2lkICpjb29raWUsIHZvaWQgKmluZm8pIHsKLSAgICAvL0FMT0dWKCJWZUF1ZGlvT3V0cHV0OjpjYWxsYmFja3dyYXBwZXIiKTsKLSAgICBpZiAoZXZlbnQgIT0gQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBWZUF1ZGlvT3V0cHV0ICptZSA9IChWZUF1ZGlvT3V0cHV0ICopY29va2llOwotICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87Ci0KLSAgICBzaXplX3QgYWN0dWFsU2l6ZSA9ICgqbWUtPm1DYWxsYmFjaykoCi0gICAgICAgICAgICBtZSwgYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKLSAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9GSUxMX0JVRkZFUik7Ci0KLSAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOwotCi0gICAgaWYgKGFjdHVhbFNpemUgPiAwKSB7Ci0gICAgICAgIG1lLT5zbm9vcFdyaXRlKGJ1ZmZlci0+cmF3LCBhY3R1YWxTaXplKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHJlc3VsdC5hcHBlbmQoIiBWZUF1ZGlvT3V0cHV0XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUtMSwgIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsCi0gICAgICAgICAgICBtU3RyZWFtVHlwZSwgbUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRS0xLCAiICBtc2VjIHBlciBmcmFtZSglZiksIGxhdGVuY3kgKCVkKVxuIiwKLSAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lLCBtTGF0ZW5jeSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+ZHVtcChmZCwgYXJncyk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotaW50IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKSBjb25zdCB7Ci0KLSAgICByZXR1cm4gbVNlc3Npb25JZDsKLX0KLQotdWludDMyX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmdldFNhbXBsZVJhdGUoKSBjb25zdCB7Ci0gICAgaWYgKG1Nc2Vjc1BlckZyYW1lID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAodWludDMyX3QpKDEuZTMgLyBtTXNlY3NQZXJGcmFtZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4YzEyNTQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVklERU9FRElUT1JfUExBWUVSX0gKLSNkZWZpbmUgQU5EUk9JRF9WSURFT0VESVRPUl9QTEFZRVJfSAotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+Ci0jaW5jbHVkZSAiTTR4VlNTX0FQSS5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTWFpbi5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVG9vbHMuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgiCi0jaW5jbHVkZSAiTmF0aXZlV2luZG93UmVuZGVyZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgUHJldmlld1BsYXllcjsKLQotY2xhc3MgVmlkZW9FZGl0b3JQbGF5ZXIgOiBwdWJsaWMgTWVkaWFQbGF5ZXJJbnRlcmZhY2UgewotICAgIHB1YmxpYzoKLSAgICBjbGFzcyBWZUF1ZGlvT3V0cHV0OiBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZUF1ZGlvT3V0cHV0KCk7Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5WZUF1ZGlvT3V0cHV0KCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVhZHkoKSBjb25zdCB7IHJldHVybiBtVHJhY2sgIT0gTlVMTDsgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICByZWFsdGltZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZUNvdW50KCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZVNpemUoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgbGF0ZW5jeSgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGZsb2F0ICAgICAgICAgICBtc2Vjc1BlckZyYW1lKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QqKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgZ2V0U2Vzc2lvbklkKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgICAgIGdldFNhbXBsZVJhdGUoKSBjb25zdDsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBvcGVuKAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydCgpOwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBmbHVzaCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBwYXVzZSgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB2b2lkIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOyB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCxjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKLQotICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBpc09uRW11bGF0b3IoKTsKLSAgICAgICAgc3RhdGljIGludCAgICAgICAgICAgICAgZ2V0TWluQnVmZmVyQ291bnQoKTsKLSAgICBwcml2YXRlOgotICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwotICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIoCi0gICAgICAgICAgICAgICAgaW50IGV2ZW50LCB2b2lkICptZSwgdm9pZCAqaW5mbyk7Ci0KLSAgICAgICAgc3A8QXVkaW9UcmFjaz4gICAgICAgICAgbVRyYWNrOwotICAgICAgICBBdWRpb0NhbGxiYWNrICAgICAgICAgICBtQ2FsbGJhY2s7Ci0gICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0Nvb2tpZTsKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbVN0cmVhbVR5cGU7Ci0gICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwotICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7Ci0gICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwotICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTGF0ZW5jeTsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsKLSAgICAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgbUlzT25FbXVsYXRvcjsKLSAgICAgICAgc3RhdGljIGludCAgICAgICAgICAgICAgbU1pbkJ1ZmZlckNvdW50OyAvLyAxMiBmb3IgZW11bGF0b3I7IG90aGVyd2lzZSA0Ci0KLSAgICAgICAgcHVibGljOgotICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc25vb3BXcml0ZShjb25zdCB2b2lkKiwgc2l6ZV90KTsKLSAgICB9OwotCi1wdWJsaWM6Ci0gICAgVmlkZW9FZGl0b3JQbGF5ZXIoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyKTsKLSAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvclBsYXllcigpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotICAgIHZpcnR1YWwgYm9vbCBpc1BsYXlpbmcoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbyhpbnQgbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50ICptc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludCAqbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9vcGluZyhpbnQgbG9vcCk7Ci0gICAgdmlydHVhbCBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luayk7Ci0gICAgdmlydHVhbCB2b2lkIGFjcXVpcmVMb2NrKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VMb2NrKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkRWZmZWN0c1NldHRpbmdzKAotICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdFNldHRpbmdzLCBpbnQgbkVmZmVjdHMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkQXVkaW9NaXhTZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBwQXVkaW9NaXhQQ01GaWxlSGFuZGxlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHgsIE00T1NBX1VJbnQzMiB5LCBNNE9TQV9VSW50MzIgeik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrQmVnaW5UaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tFbmRUaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3Rvcnlib2FyZFN0YXJ0VGltZSh1aW50MzJfdCBtc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCh1aW50MzJfdCBjYkludGVydmFsKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFSZW5kZXJpbmdNb2RlKE00eFZTU19NZWRpYVJlbmRlcmluZyBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZpcnN0VmlkZW9GcmFtZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGFzdFJlbmRlcmVkVGltZU1zKHVpbnQzMl90ICpsYXN0UmVuZGVyZWRUaW1lTXMpOwotCi0gICAgc3RhdHVzX3Qgc2V0QXVkaW9QbGF5ZXIoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqYXVkaW9QbGF5ZXIpOwotcHJpdmF0ZToKLSAgICBQcmV2aWV3UGxheWVyICAgICAgICptUGxheWVyOwotICAgIHNwPFZlQXVkaW9PdXRwdXQ+ICAgIG1WZUF1ZGlvU2luazsKLQotICAgIFZpZGVvRWRpdG9yUGxheWVyKGNvbnN0IFZpZGVvRWRpdG9yUGxheWVyICYpOwotICAgIFZpZGVvRWRpdG9yUGxheWVyICZvcGVyYXRvcj0oY29uc3QgVmlkZW9FZGl0b3JQbGF5ZXIgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfVklERU9FRElUT1JfUExBWUVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjM2NkM2QwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJQcmV2aWV3Q29udHJvbGxlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgiCi0jaW5jbHVkZSAiUHJldmlld1JlbmRlcmVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jaW5jbHVkZSAiTTRPU0FfVGhyZWFkLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLQotVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6VmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcigpCi0gICAgOiBtQ3VycmVudFBsYXllcigwKSwKLSAgICAgIG1UaHJlYWRDb250ZXh0KE5VTEwpLAotICAgICAgbVBsYXllclN0YXRlKFZlUGxheWVySWRsZSksCi0gICAgICBtUHJlcGFyZVJlcWVzdChNNE9TQV9GQUxTRSksCi0gICAgICBtQ2xpcExpc3QoTlVMTCksCi0gICAgICBtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQoMCksCi0gICAgICBtTnVtYmVyQ2xpcHNUb1ByZXZpZXcoMCksCi0gICAgICBtU3RhcnRpbmdDbGlwSW5kZXgoMCksCi0gICAgICBtUHJldmlld0xvb3BpbmcoTTRPU0FfRkFMU0UpLAotICAgICAgbUNhbGxCYWNrQWZ0ZXJGcmFtZUNudCgwKSwKLSAgICAgIG1FZmZlY3RzU2V0dGluZ3MoTlVMTCksCi0gICAgICBtTnVtYmVyRWZmZWN0cygwKSwKLSAgICAgIG1DdXJyZW50Q2xpcE51bWJlcigtMSksCi0gICAgICBtQ2xpcFRvdGFsRHVyYXRpb24oMCksCi0gICAgICBtQ3VycmVudFZpZGVvRWZmZWN0KFZJREVPX0VGRkVDVF9OT05FKSwKLSAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKE5VTEwpLAotICAgICAgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZShOVUxMKSwKLSAgICAgIG1UYXJnZXQoTlVMTCksCi0gICAgICBtSm5pQ29va2llKE5VTEwpLAotICAgICAgbUpuaUNhbGxiYWNrKE5VTEwpLAotICAgICAgbUN1cnJlbnRQbGF5ZWREdXJhdGlvbigwKSwKLSAgICAgIG1DdXJyZW50Q2xpcER1cmF0aW9uKDApLAotICAgICAgbVZpZGVvU3RvcnlCb2FyZFRpbWVNc1VwdG9GaXJzdFByZXZpZXdDbGlwKDApLAotICAgICAgbU92ZXJsYXlTdGF0ZShPVkVSTEFZX0NMRUFSKSwKLSAgICAgIG1BY3RpdmVQbGF5ZXJJbmRleCgwKSwKLSAgICAgIG1PdXRwdXRWaWRlb1dpZHRoKDApLAotICAgICAgbU91dHB1dFZpZGVvSGVpZ2h0KDApLAotICAgICAgYlN0b3BUaHJlYWRJblByb2dyZXNzKGZhbHNlKSwKLSAgICAgIG1TZW1UaHJlYWRXYWl0KE5VTEwpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciIpOwotICAgIG1SZW5kZXJpbmdNb2RlID0gTTR4VlNTX2tCbGFja0JvcmRlcnM7Ci0gICAgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOyArK2kpIHsKLSAgICAgICAgbVZlUGxheWVyW2ldID0gTlVMTDsKLSAgICB9Ci19Ci0KLVZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6On5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyKCkgewotICAgIEFMT0dWKCJ+VmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciIpOwotICAgIE00T1NBX1VJbnQzMiBpID0gMDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8vIFN0b3AgdGhlIHRocmVhZCBpZiBpdHMgc3RpbGwgcnVubmluZwotICAgIGlmKG1UaHJlYWRDb250ZXh0ICE9IE5VTEwpIHsKLSAgICAgICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY1N0b3AobVRocmVhZENvbnRleHQpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1YoIn5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiBlcnJvciAweCV4IFwKLSAgICAgICAgICAgIGluIHRyeWluZyB0byBzdG9wIHRocmVhZCIsIGVycik7Ci0gICAgICAgICAgICAvLyBDb250aW51ZSBldmVuIGlmIGVycm9yCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jQ2xvc2UobVRocmVhZENvbnRleHQpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoIn5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiBlcnJvciAweCV4IFwKLSAgICAgICAgICAgIGluIHRyeWluZyB0byBjbG9zZSB0aHJlYWQiLCAodW5zaWduZWQgaW50KSBlcnIpOwotICAgICAgICAgICAgLy8gQ29udGludWUgZXZlbiBpZiBlcnJvcgotICAgICAgICB9Ci0KLSAgICAgICAgbVRocmVhZENvbnRleHQgPSBOVUxMOwotICAgIH0KLQotICAgIGZvciAoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7Ci0gICAgICAgICBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgaWYobVZlUGxheWVyW3BsYXllckluc3RdICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dWKCJjbGVhcmluZyBtVmVQbGF5ZXIgJWQiLCBwbGF5ZXJJbnN0KTsKLSAgICAgICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYobUNsaXBMaXN0ICE9IE5VTEwpIHsKLSAgICAgICAgLy8gQ2xlYW4gdXAKLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZDtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKG1DbGlwTGlzdFtpXS0+cEZpbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUobUNsaXBMaXN0W2ldLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT5wRmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZyZWUobUNsaXBMaXN0W2ldKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKG1DbGlwTGlzdCk7Ci0gICAgICAgIG1DbGlwTGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobUVmZmVjdHNTZXR0aW5ncykgewotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5ncyk7Ci0gICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKSB7Ci0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVSZWFkQ2xvc2UgKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotICAgICAgICBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobUJhY2tncm91bmRBdWRpb1NldHRpbmcgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKTsKLSAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmcgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKG1UYXJnZXQgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgfQotCi0gICAgbU92ZXJsYXlTdGF0ZSA9IE9WRVJMQVlfQ0xFQVI7Ci0KLSAgICBBTE9HVigiflZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgcmV0dXJucyIpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6bG9hZEVkaXRTZXR0aW5ncygKLSAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MsTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIGJnbVNldHRpbmdzKSB7Ci0KLSAgICBNNE9TQV9VSW50MzIgaSA9IDAsIGlDbGlwRHVyYXRpb24gPSAwLCByZ2JTaXplID0gMDsKLSAgICBNNFZJRklfVUludDggKnRtcCA9IE5VTEw7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigibG9hZEVkaXRTZXR0aW5ncyIpOwotICAgIEFMT0dWKCJsb2FkRWRpdFNldHRpbmdzIENoYW5uZWxzID0gJWQsIHNhbXBsaW5nIEZyZXEgJWQiLAotICAgICAgICAgIGJnbVNldHRpbmdzLT51aU5iQ2hhbm5lbHMsIGJnbVNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICApOwotICAgICAgICAgIGJnbVNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMzIwMDA7Ci0KLSAgICBBTE9HVigibG9hZEVkaXRTZXR0aW5ncyBDaGFubmVscyA9ICVkLCBzYW1wbGluZyBGcmVxICVkIiwKLSAgICAgICAgICBiZ21TZXR0aW5ncy0+dWlOYkNoYW5uZWxzLCBiZ21TZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSAgKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgLy8gQ2xlYW4gdXAgYW55IHByZXZpb3VzIEVkaXQgc2V0dGluZ3MgYmVmb3JlIGxvYWRpbmcgbmV3IG9uZXMKLSAgICBtQ3VycmVudFZpZGVvRWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0KLSAgICBpZihtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKSB7Ci0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVSZWFkQ2xvc2UgKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotICAgICAgICBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUJhY2tncm91bmRBdWRpb1NldHRpbmcpOwotICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobUNsaXBMaXN0ICE9IE5VTEwpIHsKLSAgICAgICAgLy8gQ2xlYW4gdXAKLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZDtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKG1DbGlwTGlzdFtpXS0+cEZpbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUobUNsaXBMaXN0W2ldLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT5wRmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZyZWUobUNsaXBMaXN0W2ldKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKG1DbGlwTGlzdCk7Ci0gICAgICAgIG1DbGlwTGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobUVmZmVjdHNTZXR0aW5ncykgewotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5ncyk7Ci0gICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKG1DbGlwTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZCA9IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOwotICAgICAgICBBTE9HVigibG9hZEVkaXRTZXR0aW5nczogIyBvZiBDbGlwcyA9ICVkIiwgbU51bWJlckNsaXBzSW5TdG9yeUJvYXJkKTsKLQotICAgICAgICBtQ2xpcExpc3QgPSAoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyoqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKikqcFNldHRpbmdzLT51aUNsaXBOdW1iZXIsIE00VlMsCi0gICAgICAgICAoTTRPU0FfQ2hhciopIkx2UFAsIGNvcHkgb2YgcENsaXBMaXN0Iik7Ci0KLSAgICAgICAgaWYoTlVMTCA9PSBtQ2xpcExpc3QpIHsKLSAgICAgICAgICAgIEFMT0dFKCJsb2FkRWRpdFNldHRpbmdzOiBNYWxsb2MgZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1zZXQoKHZvaWQgKiltQ2xpcExpc3QsMCwKLSAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKikqcFNldHRpbmdzLT51aUNsaXBOdW1iZXIpOwotCi0gICAgICAgIGZvcihpPTA7aTxwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjtpKyspIHsKLQotICAgICAgICAgICAgLy8gQWxsb2NhdGUgY3VycmVudCBjbGlwCi0gICAgICAgICAgICBtQ2xpcExpc3RbaV0gPQotICAgICAgICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSxNNFZTLChNNE9TQV9DaGFyKikiY2xpcCBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICBpZihtQ2xpcExpc3RbaV0gPT0gTlVMTCkgewotCi0gICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZGl0U2V0dGluZ3M6IEFsbG9jYXRpb24gZXJyb3IgZm9yIG1DbGlwTGlzdFslZF0iLCAoaW50KWkpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENvcHkgcGxhaW4gc3RydWN0dXJlCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltQ2xpcExpc3RbaV0sCi0gICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwKLSAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncykpOwotCi0gICAgICAgICAgICBpZihOVUxMICE9IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSkgewotICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+cEZpbGUgPSAoTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUsIE00VlMsCi0gICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUiKTsKLQotICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gbUNsaXBMaXN0W2ldLT5wRmlsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWRpdFNldHRpbmdzIDogRVJST1IgYWxsb2NhdGluZyBmaWxlbmFtZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbUNsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIk5VTEwgZmlsZSBwYXRoIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGR1cmF0aW9uIG9mIGFsbCBjbGlwcwotICAgICAgICAgICAgaUNsaXBEdXJhdGlvbiA9IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLQotICAgICAgICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAgICAgbUNsaXBUb3RhbER1cmF0aW9uID0gbUNsaXBUb3RhbER1cmF0aW9uK2lDbGlwRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihtRWZmZWN0c1NldHRpbmdzID09IE5VTEwpIHsKLSAgICAgICAgbU51bWJlckVmZmVjdHMgPSBwU2V0dGluZ3MtPm5iRWZmZWN0czsKLSAgICAgICAgQUxPR1YoImxvYWRFZGl0U2V0dGluZ3M6IG1OdW1iZXJFZmZlY3RzID0gJWQiLCBtTnVtYmVyRWZmZWN0cyk7Ci0KLSAgICAgICAgaWYobU51bWJlckVmZmVjdHMgIT0gMCkgewotICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5ncyA9IChNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICBtTnVtYmVyRWZmZWN0cypzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwKLSAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImVmZmVjdHMgc2V0dGluZ3MiKTsKLQotICAgICAgICAgICAgaWYobUVmZmVjdHNTZXR0aW5ncyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZmZlY3RzU2V0dGluZ3M6IEFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKW1FZmZlY3RzU2V0dGluZ3MsMCwKLSAgICAgICAgICAgICBtTnVtYmVyRWZmZWN0cypzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSk7Ci0KLSAgICAgICAgICAgIGZvcihpPTA7aTxtTnVtYmVyRWZmZWN0cztpKyspIHsKLQotICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoID0gTlVMTDsKLSAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikmKG1FZmZlY3RzU2V0dGluZ3NbaV0pLAotICAgICAgICAgICAgICAgICAodm9pZCAqKSYocFNldHRpbmdzLT5FZmZlY3RzW2ldKSwKLSAgICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykpOwotCi0gICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBwRnJhbWluZyBSR0IgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNFZJRklfSW1hZ2VQbGFuZSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLAotICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJsdnBwIGZyYW1pbmcgYnVmZmVyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWZmZWN0c1NldHRpbmdzOkFsbG9jIGVycm9yIGZvciBwRnJhbWluZ0J1ZiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIHBhY19kYXRhIChSR0IpCi0gICAgICAgICAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnJnYlR5cGUgPT0gTTRWU1MzR1BQX2tSR0I1NjUpewotICAgICAgICAgICAgICAgICAgICAgICAgcmdiU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X2hlaWdodCoyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoCi0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5yZ2JUeXBlID09IE00VlNTM0dQUF9rUkdCODg4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZ2JTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfaGVpZ2h0KjM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgibG9hZEVmZmVjdHNTZXR0aW5nczogd3JvbmcgUkdCIHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0bXAgPSAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHJnYlNpemUsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopImZyYW1pbmcgYnVmZmVyIHBhY19kYXRhIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYodG1wID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWZmZWN0c1NldHRpbmdzOkFsbG9jIGVycm9yIHBGcmFtaW5nQnVmIHBhYyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBGcmFtaW5nQnVmZmVyKi8KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV9oZWlnaHQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfc3RyaWRlOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3RvcGxlZnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0ID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0OwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRoZSBwRnJhbWluZyBkYXRhCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgcmdiU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnJnYlR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucmdiVHlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUJhY2tncm91bmRBdWRpb1NldHRpbmcgPT0gTlVMTCkgewotCi0gICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nID0gKE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIHNpemVvZihNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyksIE00VlMsCi0gICAgICAgIChNNE9TQV9DaGFyKikiTHZQUCwgY29weSBvZiBiZ21TZXR0aW5ncyIpOwotCi0gICAgICAgIGlmKE5VTEwgPT0gbUJhY2tncm91bmRBdWRpb1NldHRpbmcpIHsKLSAgICAgICAgICAgIEFMT0dFKCJsb2FkRWRpdFNldHRpbmdzOiBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyBNYWxsb2MgZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1zZXQoKHZvaWQgKiltQmFja2dyb3VuZEF1ZGlvU2V0dGluZywgMCxzaXplb2YoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqKSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKW1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLCAodm9pZCAqKWJnbVNldHRpbmdzLCBzaXplb2YoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MpKTsKLQotICAgICAgICBpZiAoIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLT5wRmlsZSAhPSBNNE9TQV9OVUxMICkgewotCi0gICAgICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZy0+cEZpbGUgPSAoTTRPU0FfVm9pZCopIGJnbVNldHRpbmdzLT5wUENNRmlsZVBhdGg7Ci0gICAgICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZy0+dWlOYkNoYW5uZWxzID0gMjsKLSAgICAgICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLT51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMzIwMDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPcGVuIHRoZSBCRyBmaWxlCi0gICAgICAgIGlmICggbUJhY2tncm91bmRBdWRpb1NldHRpbmctPnBGaWxlICE9IE00T1NBX05VTEwgKSB7Ci0gICAgICAgICAgICBlcnIgPSBNNE9TQV9maWxlUmVhZE9wZW4oJm1BdWRpb01peFBDTUZpbGVIYW5kbGUsCi0gICAgICAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmctPnBGaWxlLCBNNE9TQV9rRmlsZVJlYWQpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibG9hZEVkaXRTZXR0aW5nczogbUJhY2tncm91bmRBdWRpbyBQQ00gRmlsZSBvcGVuIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtT3V0cHV0VmlkZW9TaXplID0gcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICBtRnJhbWVTdHIucEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7Ci0gICAgQUxPR1YoInNldFN1cmZhY2UiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbVN1cmZhY2UgPSBzdXJmYWNlOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6c3RhcnRQcmV2aWV3KAotICAgIE00T1NBX1VJbnQzMiBmcm9tTVMsIE00T1NBX0ludDMyIHRvTXMsIE00T1NBX1VJbnQxNiBjYWxsQmFja0FmdGVyRnJhbWVDb3VudCwKLSAgICBNNE9TQV9Cb29sIGxvb3ApIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBpID0gMCwgaUluY3JlbWVudGVkRHVyYXRpb24gPSAwOwotICAgIEFMT0dWKCJzdGFydFByZXZpZXciKTsKLQotICAgIGlmKGZyb21NUyA+IChNNE9TQV9VSW50MzIpdG9NcykgewotICAgICAgICBBTE9HRSgic3RhcnRQcmV2aWV3OiBmcm9tTVMgPiB0b01zIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYodG9NcyA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFByZXZpZXc6IHRvTXMgaXMgMCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8vIElmIGFscmVhZHkgc3RhcnRlZCwgdGhlbiBzdG9wIHByZXZpZXcgZmlyc3QKLSAgICBmb3IoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7IHBsYXllckluc3QrKykgewotICAgICAgICBpZihtVmVQbGF5ZXJbcGxheWVySW5zdF0gIT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogc3RvcHBpbmcgcHJldmlvdXNseSBzdGFydGVkIHByZXZpZXcgcGxheWJhY2siKTsKLSAgICAgICAgICAgIHN0b3BQcmV2aWV3KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHJlbmRlclByZXZpZXcgd2FzIGNhbGxlZCBwcmV2aW91c2x5LCB0aGVuIGRlbGV0ZSBSZW5kZXJlciBvYmplY3QgZmlyc3QKLSAgICBpZihtVGFyZ2V0ICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogZGVsZXRlIHByZXZpb3VzIFByZXZpZXdSZW5kZXJlciIpOwotICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIEF1ZGlvIHBsYXllciB0byBiZSB1c2VkIGZvciBlbnRpcmUKLSAgICAvLyBzdG9yeWJvYXJkIGR1cmF0aW9uCi0gICAgbVZFQXVkaW9TaW5rID0gbmV3IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0KCk7Ci0gICAgbVZFQXVkaW9QbGF5ZXIgPSBuZXcgVmlkZW9FZGl0b3JBdWRpb1BsYXllcihtVkVBdWRpb1NpbmspOwotICAgIG1WRUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFNldHRpbmdzKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKTsKLSAgICBtVkVBdWRpb1BsYXllci0+c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotCi0gICAgLy8gQ3JlYXRlIFZpZGVvIFJlbmRlcmVyIHRvIGJlIHVzZWQgZm9yIHRoZSBlbnRpcmUgc3Rvcnlib2FyZCBkdXJhdGlvbi4KLSAgICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgIGdldFZpZGVvU2l6ZUJ5UmVzb2x1dGlvbihtT3V0cHV0VmlkZW9TaXplLCAmd2lkdGgsICZoZWlnaHQpOwotICAgIG1OYXRpdmVXaW5kb3dSZW5kZXJlciA9IG5ldyBOYXRpdmVXaW5kb3dSZW5kZXJlcihtU3VyZmFjZSwgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBsb29wID0gJWQiLCBsb29wKTsKLSAgICBtUHJldmlld0xvb3BpbmcgPSBsb29wOwotCi0gICAgQUxPR1YoInN0YXJ0UHJldmlldzogY2FsbEJhY2tBZnRlckZyYW1lQ291bnQgPSAlZCIsIGNhbGxCYWNrQWZ0ZXJGcmFtZUNvdW50KTsKLSAgICBtQ2FsbEJhY2tBZnRlckZyYW1lQ250ID0gY2FsbEJhY2tBZnRlckZyYW1lQ291bnQ7Ci0KLSAgICBmb3IgKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8a1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOyBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdID0gbmV3IFZpZGVvRWRpdG9yUGxheWVyKG1OYXRpdmVXaW5kb3dSZW5kZXJlcik7Ci0gICAgICAgIGlmKG1WZVBsYXllcltwbGF5ZXJJbnN0XSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhcnRQcmV2aWV3OkVycm9yIGNyZWF0aW5nIFZpZGVvRWRpdG9yUGxheWVyICVkIixwbGF5ZXJJbnN0KTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBvYmplY3QgY3JlYXRlZCIpOwotCi0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+c2V0Tm90aWZ5Q2FsbGJhY2sodGhpcywobm90aWZ5X2NhbGxiYWNrX2Ypbm90aWZ5KTsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogbm90aWZ5IGNhbGxiYWNrIHNldCIpOwotCi0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+bG9hZEVmZmVjdHNTZXR0aW5ncyhtRWZmZWN0c1NldHRpbmdzLAotICAgICAgICAgbU51bWJlckVmZmVjdHMpOwotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBlZmZlY3RzIHNldHRpbmdzIGxvYWRlZCIpOwotCi0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+bG9hZEF1ZGlvTWl4U2V0dGluZ3MobUJhY2tncm91bmRBdWRpb1NldHRpbmcpOwotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBBdWRpb01peFNldHRpbmdzIHNldHRpbmdzIGxvYWRlZCIpOwotCi0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBBdWRpb01peFBDTUZpbGVIYW5kbGUgc2V0Iik7Ci0KLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5zZXRQcm9ncmVzc0NhbGxiYWNrSW50ZXJ2YWwoCi0gICAgICAgICBtQ2FsbEJhY2tBZnRlckZyYW1lQ250KTsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogc2V0UHJvZ3Jlc3NDYWxsQmFja0ludGVydmFsIik7Ci0gICAgfQotCi0gICAgbVBsYXllclN0YXRlID0gVmVQbGF5ZXJJZGxlOwotICAgIG1QcmVwYXJlUmVxZXN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBpZihmcm9tTVMgPT0gMCkgewotICAgICAgICBtQ3VycmVudENsaXBOdW1iZXIgPSAtMTsKLSAgICAgICAgLy8gU2F2ZSBvcmlnaW5hbCB2YWx1ZQotICAgICAgICBtRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZSA9IG1DbGlwTGlzdFswXS0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgIG1WaWRlb1N0b3J5Qm9hcmRUaW1lTXNVcHRvRmlyc3RQcmV2aWV3Q2xpcCA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBmcm9tTVM9JWQiLCBmcm9tTVMpOwotICAgICAgICBpZihmcm9tTVMgPj0gbUNsaXBUb3RhbER1cmF0aW9uKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhcnRQcmV2aWV3OiBmcm9tTVMgPj0gbUNsaXBUb3RhbER1cmF0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgICAgIGZvcihpPTA7aTxtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7aSsrKSB7Ci0gICAgICAgICAgICBpZihmcm9tTVMgPCAoaUluY3JlbWVudGVkRHVyYXRpb24gKyAobUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLQotICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpKSkgewotICAgICAgICAgICAgICAgIC8vIFNldCB0byAxIGluZGV4IGJlbG93LAotICAgICAgICAgICAgICAgIC8vIGFzIHRocmVhZFByb2Nlc3MgZmlyc3QgaW5jcmVtZW50cyB0aGUgY2xpcCBpbmRleAotICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIHByb2Nlc3NlcyBjbGlwIGluIHRocmVhZCBsb29wCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRDbGlwTnVtYmVyID0gaS0xOwotICAgICAgICAgICAgICAgIEFMT0dEKCJzdGFydFByZXZpZXc6bUN1cnJlbnRDbGlwTnVtYmVyID0gJWQgZnJvbU1TPSVkIixpLGZyb21NUyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgICAgICAgICAgbUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWUgPSBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgICAgICAgICAgLy8gU2V0IGNvcnJlY3QgYmVnaW4gdGltZSB0byBzdGFydCBwbGF5YmFjawotICAgICAgICAgICAgICAgIGlmKChmcm9tTVMrbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkgPgotICAgICAgICAgICAgICAgIChpSW5jcmVtZW50ZWREdXJhdGlvbittQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSkgewotCi0gICAgICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSArCi0gICAgICAgICAgICAgICAgICAgICAoZnJvbU1TIC0gaUluY3JlbWVudGVkRHVyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlJbmNyZW1lbnRlZER1cmF0aW9uID0gaUluY3JlbWVudGVkRHVyYXRpb24gKwotICAgICAgICAgICAgICAgICAobUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLSBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtVmlkZW9TdG9yeUJvYXJkVGltZU1zVXB0b0ZpcnN0UHJldmlld0NsaXAgPSBpSW5jcmVtZW50ZWREdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8a1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOyBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbShmcm9tTVMsCi0gICAgICAgICBtRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZSwKLSAgICAgICAgIG1DbGlwTGlzdFtpXS0+Q2xpcFByb3BlcnRpZXMudWlDbGlwQXVkaW9Wb2x1bWVQZXJjZW50YWdlKTsKLQotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OnNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgc2V0ICVkIGN1dHRpbWUgXAotICAgICAgICAgJWQiLCBmcm9tTVMsIG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lKTsKLSAgICB9Ci0KLSAgICBtU3RhcnRpbmdDbGlwSW5kZXggPSBtQ3VycmVudENsaXBOdW1iZXIrMTsKLQotICAgIC8vIFN0YXJ0IHBsYXlpbmcgd2l0aCBwbGF5ZXIgaW5zdGFuY2UgMAotICAgIG1DdXJyZW50UGxheWVyID0gMDsKLSAgICBtQWN0aXZlUGxheWVySW5kZXggPSAwOwotCi0gICAgaWYodG9NcyA9PSAtMSkgewotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBQcmV2aWV3IHRpbGwgZW5kIG9mIHN0b3J5Ym9hcmQiKTsKLSAgICAgICAgbU51bWJlckNsaXBzVG9QcmV2aWV3ID0gbU51bWJlckNsaXBzSW5TdG9yeUJvYXJkOwotICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgIG1MYXN0UHJldmlld0NsaXBFbmRUaW1lID0KLSAgICAgICAgIG1DbGlwTGlzdFttTnVtYmVyQ2xpcHNUb1ByZXZpZXctMV0tPnVpRW5kQ3V0VGltZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IHRvTXM9JWQiLCB0b01zKTsKLSAgICAgICAgaWYoKE00T1NBX1VJbnQzMil0b01zID4gbUNsaXBUb3RhbER1cmF0aW9uKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhcnRQcmV2aWV3OiB0b01zID4gbUNsaXBUb3RhbER1cmF0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgaUluY3JlbWVudGVkRHVyYXRpb24gPSAwOwotCi0gICAgICAgIGZvcihpPTA7aTxtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7aSsrKSB7Ci0gICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKXRvTXMgPD0gKGlJbmNyZW1lbnRlZER1cmF0aW9uICsKLSAgICAgICAgICAgICAobUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLSBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgICAgICAgICAgbUxhc3RQcmV2aWV3Q2xpcEVuZFRpbWUgPSBtQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGVuZCBjdXQgdGltZSBvZiBjbGlwIGluZGV4IGkgdG8gdG9NcwotICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lID0gdG9NczsKLQotICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBjbGlwcyB0byBiZSBwcmV2aWV3ZWQgaXMgZnJvbSBpbmRleCAwIHRvIGkKLSAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgYnkgMSBhcyBpIHN0YXJ0cyBmcm9tIDAKLSAgICAgICAgICAgICAgICBtTnVtYmVyQ2xpcHNUb1ByZXZpZXcgPSBpKzE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpSW5jcmVtZW50ZWREdXJhdGlvbiA9IGlJbmNyZW1lbnRlZER1cmF0aW9uICsKLSAgICAgICAgICAgICAgICAgKG1DbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lIC0gbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPcGVuIHRoZSB0aHJlYWQgc2VtYXBob3JlCi0gICAgTTRPU0Ffc2VtYXBob3JlT3BlbigmbVNlbVRocmVhZFdhaXQsIDEpOwotCi0gICAgLy8gT3BlbiB0aGUgcHJldmlldyBwcm9jZXNzIHRocmVhZAotICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNPcGVuKCZtVGhyZWFkQ29udGV4dCwgKE00T1NBX1RocmVhZERvSXQpdGhyZWFkUHJvYyk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIEFMT0dFKCJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOk00T1NBX3RocmVhZFN5bmNPcGVuIGVycm9yICVkIiwgKGludCkgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIHN0YWNrc2l6ZQotICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24obVRocmVhZENvbnRleHQsIE00T1NBX1RocmVhZFN0YWNrU2l6ZSwKLSAgICAgKE00T1NBX0RhdGFPcHRpb24pIGtQcmV2aWV3VGhyZWFkU3RhY2tTaXplKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBBTE9HRSgiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjogdGhyZWFkU3luY1NldE9wdGlvbiBlcnJvciAlZCIsIChpbnQpIGVycik7Ci0gICAgICAgIE00T1NBX3RocmVhZFN5bmNDbG9zZShtVGhyZWFkQ29udGV4dCk7Ci0gICAgICAgIG1UaHJlYWRDb250ZXh0ID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAgLy8gU3RhcnQgdGhlIHRocmVhZAotICAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jU3RhcnQobVRocmVhZENvbnRleHQsIChNNE9TQV9Wb2lkKil0aGlzKTsKLSAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIEFMT0dFKCJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiB0aHJlYWRTeW5jU3RhcnQgZXJyb3IgJWQiLCAoaW50KSBlcnIpOwotICAgICAgICBNNE9TQV90aHJlYWRTeW5jQ2xvc2UobVRocmVhZENvbnRleHQpOwotICAgICAgICBtVGhyZWFkQ29udGV4dCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGJTdG9wVGhyZWFkSW5Qcm9ncmVzcyA9IGZhbHNlOwotCi0gICAgQUxPR1YoInN0YXJ0UHJldmlldzogcHJvY2VzcyB0aHJlYWQgc3RhcnRlZCIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9VSW50MzIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6c3RvcFByZXZpZXcoKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgdWludDMyX3QgbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXMgPSAwOwotICAgIEFMT0dWKCJzdG9wUHJldmlldyIpOwotCi0gICAgLy8gU3RvcCB0aGUgdGhyZWFkCi0gICAgaWYobVRocmVhZENvbnRleHQgIT0gTlVMTCkgewotICAgICAgICBiU3RvcFRocmVhZEluUHJvZ3Jlc3MgPSB0cnVlOwotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2tTZW0pOwotICAgICAgICAgICAgaWYgKG1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9zZW1hcGhvcmVQb3N0KG1TZW1UaHJlYWRXYWl0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNTdG9wKG1UaHJlYWRDb250ZXh0KTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdG9wUHJldmlldzogZXJyb3IgMHgleCBpbiB0cnlpbmcgdG8gc3RvcCB0aHJlYWQiLCBlcnIpOwotICAgICAgICAgICAgLy8gQ29udGludWUgZXZlbiBpZiBlcnJvcgotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY0Nsb3NlKG1UaHJlYWRDb250ZXh0KTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdG9wUHJldmlldzogZXJyb3IgMHgleCBpbiB0cnlpbmcgdG8gY2xvc2UgdGhyZWFkIiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICAgICAgLy8gQ29udGludWUgZXZlbiBpZiBlcnJvcgotICAgICAgICB9Ci0KLSAgICAgICAgbVRocmVhZENvbnRleHQgPSBOVUxMOwotICAgIH0KLQotICAgIC8vIENsb3NlIHRoZSBzZW1hcGhvcmUgZmlyc3QKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9ja1NlbSk7Ci0gICAgICAgIGlmKG1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGVyciA9IE00T1NBX3NlbWFwaG9yZUNsb3NlKG1TZW1UaHJlYWRXYWl0KTsKLSAgICAgICAgICAgIEFMT0dWKCJzdG9wUHJldmlldzogY2xvc2Ugc2VtYXBob3JlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICBtU2VtVGhyZWFkV2FpdCA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8a1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOyBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgaWYobVZlUGxheWVyW3BsYXllckluc3RdICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmKG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+aXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic3RvcCB0aGUgcGxheWVyIGZpcnN0Iik7Ci0gICAgICAgICAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGxheWVySW5zdCA9PSBtQWN0aXZlUGxheWVySW5kZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGxhc3QgcmVuZGVyZWQgZnJhbWUgdGltZSBzdGFtcAotICAgICAgICAgICAgICAgIG1WZVBsYXllclttQWN0aXZlUGxheWVySW5kZXhdLT5nZXRMYXN0UmVuZGVyZWRUaW1lTXMoJmxhc3RSZW5kZXJlZEZyYW1lVGltZU1zKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9UaGlzIGlzIHVzZWQgdG8gc3luY3Jvbml6ZSBvblN0cmVhbURvbmUoKSBpbiBQcmV2aWV3UGxheWVyIGFuZAotICAgICAgICAgICAgLy9zdG9wUHJldmlldygpIGluIFByZXZpZXdDb250cm9sbGVyCi0gICAgICAgICAgICBzcDxWaWRlb0VkaXRvclBsYXllcj4gdGVtcCA9IG1WZVBsYXllcltwbGF5ZXJJbnN0XTsKLSAgICAgICAgICAgIHRlbXAtPmFjcXVpcmVMb2NrKCk7Ci0gICAgICAgICAgICBBTE9HVigic3RvcFByZXZpZXc6IGNsZWFyaW5nIG1WZVBsYXllciIpOwotICAgICAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLmNsZWFyKCk7Ci0gICAgICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0gPSBOVUxMOwotICAgICAgICAgICAgdGVtcC0+cmVsZWFzZUxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigic3RvcFByZXZpZXc6IGNsZWFyIGF1ZGlvU2luayBhbmQgYXVkaW9QbGF5ZXIiKTsKLSAgICBtVkVBdWRpb1NpbmsuY2xlYXIoKTsKLSAgICBpZiAobVZFQXVkaW9QbGF5ZXIpIHsKLSAgICAgICAgZGVsZXRlIG1WRUF1ZGlvUGxheWVyOwotICAgICAgICBtVkVBdWRpb1BsYXllciA9IE5VTEw7Ci0gICAgfQotCi0gICAgZGVsZXRlIG1OYXRpdmVXaW5kb3dSZW5kZXJlcjsKLSAgICBtTmF0aXZlV2luZG93UmVuZGVyZXIgPSBOVUxMOwotCi0gICAgLy8gSWYgaW1hZ2UgZmlsZSBwbGF5aW5nLCB0aGVuIGZyZWUgdGhlIGJ1ZmZlciBwb2ludGVyCi0gICAgaWYobUZyYW1lU3RyLnBCdWZmZXIgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKG1GcmFtZVN0ci5wQnVmZmVyKTsKLSAgICAgICAgbUZyYW1lU3RyLnBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8vIFJlc2V0IG9yaWdpbmFsIGJlZ2luIGN1dHRpbWUgb2YgZmlyc3QgcHJldmlld2VkIGNsaXAqLwotICAgIG1DbGlwTGlzdFttU3RhcnRpbmdDbGlwSW5kZXhdLT51aUJlZ2luQ3V0VGltZSA9IG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lOwotICAgIC8vIFJlc2V0IG9yaWdpbmFsIGVuZCBjdXR0aW1lIG9mIGxhc3QgcHJldmlld2VkIGNsaXAqLwotICAgIG1DbGlwTGlzdFttTnVtYmVyQ2xpcHNUb1ByZXZpZXctMV0tPnVpRW5kQ3V0VGltZSA9IG1MYXN0UHJldmlld0NsaXBFbmRUaW1lOwotCi0gICAgbVBsYXllclN0YXRlID0gVmVQbGF5ZXJJZGxlOwotICAgIG1QcmVwYXJlUmVxZXN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBtQ3VycmVudFBsYXllZER1cmF0aW9uID0gMDsKLSAgICBtQ3VycmVudENsaXBEdXJhdGlvbiA9IDA7Ci0gICAgbVJlbmRlcmluZ01vZGUgPSBNNHhWU1Nfa0JsYWNrQm9yZGVyczsKLSAgICBtT3V0cHV0VmlkZW9XaWR0aCA9IDA7Ci0gICAgbU91dHB1dFZpZGVvSGVpZ2h0ID0gMDsKLQotICAgIEFMT0dWKCJzdG9wUHJldmlldygpIGxhc3RSZW5kZXJlZEZyYW1lVGltZU1zICVsZCIsIGxhc3RSZW5kZXJlZEZyYW1lVGltZU1zKTsKLSAgICByZXR1cm4gbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXM7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpjbGVhclN1cmZhY2UoCi0gICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciogcEZyYW1lSW5mbykgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVTdHIgPSBwRnJhbWVJbmZvOwotICAgIE00T1NBX1VJbnQzMiBvdXRwdXRCdWZmZXJXaWR0aCA9MCwgb3V0cHV0QnVmZmVySGVpZ2h0PTA7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcGxhbmVPdXRbM107Ci0gICAgQUxPR1YoIkluc2lkZSBwcmV2aWV3IGNsZWFyIGZyYW1lIik7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgLy8gRGVsZXRlIHByZXZpb3VzIHJlbmRlcmVyIGluc3RhbmNlCi0gICAgaWYobVRhcmdldCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBvdXRwdXRCdWZmZXJXaWR0aCA9IHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoOwotICAgIG91dHB1dEJ1ZmZlckhlaWdodCA9IHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodDsKLQotICAgIC8vIEluaXRpYWxpemUgdGhlIHJlbmRlcmVyCi0gICAgaWYobVRhcmdldCA9PSBOVUxMKSB7Ci0KLSAgICAgICAgbVRhcmdldCA9IFByZXZpZXdSZW5kZXJlcjo6Q3JlYXRlUHJldmlld1JlbmRlcmVyKAotICAgICAgICAgICAgc3VyZmFjZSwKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlcldpZHRoLCBvdXRwdXRCdWZmZXJIZWlnaHQpOwotCi0gICAgICAgIGlmKG1UYXJnZXQgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoInJlbmRlclByZXZpZXdGcmFtZTogY2Fubm90IGNyZWF0ZSBQcmV2aWV3UmVuZGVyZXIiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE91dCBwbGFuZQotICAgIHVpbnQ4X3QqIG91dEJ1ZmZlcjsKLSAgICBzaXplX3Qgb3V0QnVmZmVyU3RyaWRlID0gMDsKLQotICAgIEFMT0dWKCJkb01lZGlhUmVuZGVyaW5nIENBTEwgZ2V0QnVmZmVyKCkiKTsKLSAgICBtVGFyZ2V0LT5nZXRCdWZmZXJZVjEyKCZvdXRCdWZmZXIsICZvdXRCdWZmZXJTdHJpZGUpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgWVVWNDIwIHBsYW5lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBZVjEyIGZvcm1hdAotICAgIC8vSW4gWVYxMiBmb3JtYXQsIHNpemVzIG11c3QgYmUgZXZlbgotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVXaWR0aCA9ICgob3V0cHV0QnVmZmVyV2lkdGggKzEpPj4xKTw8MTsKLSAgICBNNE9TQV9VSW50MzIgeXYxMlBsYW5lSGVpZ2h0ID0gKChvdXRwdXRCdWZmZXJIZWlnaHQrMSk+PjEpPDwxOwotCi0gICAgcHJlcGFyZVlWMTJJbWFnZVBsYW5lKHBsYW5lT3V0LCB5djEyUGxhbmVXaWR0aCwgeXYxMlBsYW5lSGVpZ2h0LAotICAgICAoTTRPU0FfVUludDMyKW91dEJ1ZmZlclN0cmlkZSwgKE00VklGSV9VSW50OCAqKW91dEJ1ZmZlcik7Ci0KLSAgICAvKiBGaWxsIHRoZSBzdXJmYWNlIHdpdGggYmxhY2sgZnJhbWUgKi8KLSAgICBtZW1zZXQoKHZvaWQgKilwbGFuZU91dFswXS5wYWNfZGF0YSwweDAwLHBsYW5lT3V0WzBdLnVfd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lT3V0WzBdLnVfaGVpZ2h0ICogMS41KTsKLSAgICBtZW1zZXQoKHZvaWQgKilwbGFuZU91dFsxXS5wYWNfZGF0YSwxMjgscGxhbmVPdXRbMV0udV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVPdXRbMV0udV9oZWlnaHQpOwotICAgIG1lbXNldCgodm9pZCAqKXBsYW5lT3V0WzJdLnBhY19kYXRhLDEyOCxwbGFuZU91dFsyXS51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVPdXRbMl0udV9oZWlnaHQpOwotCi0gICAgbVRhcmdldC0+cmVuZGVyWVYxMigpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpyZW5kZXJQcmV2aWV3RnJhbWUoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciogcEZyYW1lSW5mbywKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8gKnBDdXJyRWRpdEluZm8pIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBpID0gMCwgaUluY3JlbWVudGVkRHVyYXRpb24gPSAwLCB0blRpbWVNcz0wLCBmcmFtZXNpemUgPTA7Ci0gICAgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVTdHIgPSBwRnJhbWVJbmZvOwotICAgIE00VklGSV9VSW50OCAqcGl4ZWxBcnJheSA9IE5VTEw7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChwQ3VyckVkaXRJbmZvICE9IE5VTEwpIHsKLSAgICAgICAgcEN1cnJFZGl0SW5mby0+b3ZlcmxheVNldHRpbmdzSW5kZXggPSAtMTsKLSAgICB9Ci0gICAgLy8gRGVsZXRlIHByZXZpb3VzIHJlbmRlcmVyIGluc3RhbmNlCi0gICAgaWYobVRhcmdldCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtT3V0cHV0VmlkZW9XaWR0aCA9PSAwKSB7Ci0gICAgICAgIG1PdXRwdXRWaWRlb1dpZHRoID0gcEZyYW1lU3RyLT51aUZyYW1lV2lkdGg7Ci0gICAgfQotCi0gICAgaWYobU91dHB1dFZpZGVvSGVpZ2h0ID09IDApIHsKLSAgICAgICAgbU91dHB1dFZpZGVvSGVpZ2h0ID0gcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0OwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgdGhlIHJlbmRlcmVyCi0gICAgaWYobVRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICAgICBtVGFyZ2V0ID0gUHJldmlld1JlbmRlcmVyOjpDcmVhdGVQcmV2aWV3UmVuZGVyZXIoCi0gICAgICAgICAgICBzdXJmYWNlLAotICAgICAgICAgICAgbU91dHB1dFZpZGVvV2lkdGgsIG1PdXRwdXRWaWRlb0hlaWdodCk7Ci0KLSAgICAgICAgaWYobVRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOiBjYW5ub3QgY3JlYXRlIFByZXZpZXdSZW5kZXJlciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcGl4ZWxBcnJheSA9IE5VTEw7Ci0KLSAgICAvLyBBcHBseSByb3RhdGlvbiBpZiByZXF1aXJlZAotICAgIGlmIChwRnJhbWVTdHItPnZpZGVvUm90YXRpb25EZWdyZWUgIT0gMCkgewotICAgICAgICBlcnIgPSBhcHBseVZpZGVvUm90YXRpb24oKE00T1NBX1ZvaWQgKilwRnJhbWVTdHItPnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aCwgcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgcEZyYW1lU3RyLT52aWRlb1JvdGF0aW9uRGVncmVlKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBBTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOiBjYW5ub3Qgcm90YXRlIHZpZGVvLCBlcnIgMHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICAgICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAvLyBWaWRlbyByb3RhdGlvbiBkb25lLgotICAgICAgICAgICAvLyBTd2FwIHdpZHRoIGFuZCBoZWlnaHQgaWYgOTAgb3IgMjcwIGRlZ3JlZXMKLSAgICAgICAgICAgaWYgKHBGcmFtZVN0ci0+dmlkZW9Sb3RhdGlvbkRlZ3JlZSAhPSAxODApIHsKLSAgICAgICAgICAgICAgIGludDMyX3QgdGVtcCA9IHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoOwotICAgICAgICAgICAgICAgcEZyYW1lU3RyLT51aUZyYW1lV2lkdGggPSBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQ7Ci0gICAgICAgICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQgPSB0ZW1wOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gUG9zdHByb2Nlc3NpbmcgKGFwcGx5IHZpZGVvIGVmZmVjdCkKLSAgICBpZihwRnJhbWVTdHItPmJBcHBseUVmZmVjdCA9PSBNNE9TQV9UUlVFKSB7Ci0KLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgZWZmZWN0IHN0YXJ0dGltZSBtYXRjaGVzIHRoZSBjbGlwIGJlaW5nIHByZXZpZXdlZAotICAgICAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPCBwRnJhbWVTdHItPmNsaXBCZWdpbkN1dFRpbWUpCi0gICAgICAgICAgICAgfHwobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA+PSBwRnJhbWVTdHItPmNsaXBFbmRDdXRUaW1lKSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgZWZmZWN0IGRvZXNuJ3QgYmVsb25nIHRvIHRoaXMgY2xpcCwgY2hlY2sgbmV4dCBvbmUKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lIDw9IHBGcmFtZVN0ci0+dGltZU1zKSAmJgotICAgICAgICAgICAgKChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lK21FZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbikgPj0KLSAgICAgICAgICAgICBwRnJhbWVTdHItPnRpbWVNcykgJiYgKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbiAhPSAwKSkgewotICAgICAgICAgICAgICAgIHNldFZpZGVvRWZmZWN0VHlwZShtRWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSwgVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRWaWRlb0VmZmVjdFR5cGUobUVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUsIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vUHJvdmlkZSB0aGUgb3ZlcmxheSBVcGRhdGUgaW5kaWNhdGlvbiB3aGVuIHRoZXJlIGlzIGFuIG92ZXJsYXkgZWZmZWN0Ci0gICAgICAgIGlmIChtQ3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZSQU1JTkcpIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpbmRleDsKLSAgICAgICAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgJj0gflZJREVPX0VGRkVDVF9GUkFNSU5HOyAvL25ldmVyIGFwcGx5IGZyYW1pbmcgaGVyZS4KLQotICAgICAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtTnVtYmVyRWZmZWN0czsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgIGlmKG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnVpU3RhcnRUaW1lIDw9IHBGcmFtZUluZm8tPnRpbWVNcykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgobUVmZmVjdHNTZXR0aW5nc1tpbmRleF0udWlTdGFydFRpbWUrCi0gICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aUR1cmF0aW9uKSA+PSBwRnJhbWVJbmZvLT50aW1lTXMpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoaW5kZXggPCBtTnVtYmVyRWZmZWN0cykgJiYgKHBDdXJyRWRpdEluZm8gIT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICBwQ3VyckVkaXRJbmZvLT5vdmVybGF5U2V0dGluZ3NJbmRleCA9IGluZGV4OwotICAgICAgICAgICAgICAgIEFMT0dWKCJGcmFtaW5nIGluZGV4ID0gJWQiLCBpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJObyBmcmFtaW5nIGVmZmVjdHMgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1DdXJyZW50VmlkZW9FZmZlY3QgIT0gVklERU9fRUZGRUNUX05PTkUpIHsKLSAgICAgICAgICAgIGVyciA9IGFwcGx5VmlkZW9FZmZlY3QoKE00T1NBX1ZvaWQgKilwRnJhbWVTdHItPnBCdWZmZXIsCi0gICAgICAgICAgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciwgcEZyYW1lU3RyLT51aUZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0LCBwRnJhbWVTdHItPnRpbWVNcywKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBpeGVsQXJyYXkpOwotCi0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6IGFwcGx5VmlkZW9FZmZlY3QgZXJyb3IgMHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBmcmVlKHBpeGVsQXJyYXkpOwotICAgICAgICAgICAgICAgIHBpeGVsQXJyYXkgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gQXBwbHkgdGhlIHJlbmRlcmluZyBtb2RlCi0gICAgICAgICAgICBlcnIgPSBkb0ltYWdlUmVuZGVyaW5nTW9kZSgoTTRPU0FfVm9pZCAqKXBGcmFtZVN0ci0+cEJ1ZmZlciwKLSAgICAgICAgICAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLCBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aCwKLSAgICAgICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQsIChNNE9TQV9Wb2lkICopcGl4ZWxBcnJheSk7Ci0KLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoInJlbmRlclByZXZpZXdGcmFtZTpkb0ltYWdlUmVuZGVyaW5nTW9kZSBlcnJvciAweCV4IiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICAgICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgICAgICAgICAgICAgIGZyZWUocGl4ZWxBcnJheSk7Ci0gICAgICAgICAgICAgICAgcGl4ZWxBcnJheSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLy8gQXBwbHkgdGhlIHJlbmRlcmluZyBtb2RlCi0gICAgICAgIGVyciA9IGRvSW1hZ2VSZW5kZXJpbmdNb2RlKChNNE9TQV9Wb2lkICopcEZyYW1lU3RyLT5wQnVmZmVyLAotICAgICAgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciwgcEZyYW1lU3RyLT51aUZyYW1lV2lkdGgsCi0gICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQsIChNNE9TQV9Wb2lkICopcGl4ZWxBcnJheSk7Ci0KLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6IGRvSW1hZ2VSZW5kZXJpbmdNb2RlIGVycm9yIDB4JXgiLCAodW5zaWduZWQgaW50KWVycik7Ci0gICAgICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgICAgICAgICAgZnJlZShwaXhlbEFycmF5KTsKLSAgICAgICAgICAgIHBpeGVsQXJyYXkgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1UYXJnZXQtPnJlbmRlcllWMTIoKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9Wb2lkIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnNldEpuaUNhbGxiYWNrKHZvaWQqIGNvb2tpZSwKLSAgICBqbmlfcHJvZ3Jlc3NfY2FsbGJhY2tfZmN0IGNhbGxiYWNrRmN0KSB7Ci0gICAgLy9BTE9HVigic2V0Sm5pQ2FsbGJhY2siKTsKLSAgICBtSm5pQ29va2llID0gY29va2llOwotICAgIG1KbmlDYWxsYmFjayA9IGNhbGxiYWNrRmN0OwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6cHJlcGFyZVBsYXllcigKLSAgICB2b2lkKiBwYXJhbSwgaW50IHBsYXllckluc3RhbmNlLCBpbnQgaW5kZXgpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKnBDb250cm9sbGVyID0KLSAgICAgKFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKilwYXJhbTsKLQotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBpbnN0YW5jZSAlZCBmaWxlICVkIiwgcGxheWVySW5zdGFuY2UsIGluZGV4KTsKLQotICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lID0gKGNvbnN0IGNoYXIqKSBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+cEZpbGU7Ci0gICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldERhdGFTb3VyY2UoZmlsZU5hbWUsIE5VTEwpOwotCi0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldERhdGFTb3VyY2UgaW5zdGFuY2UgJXMiLAotICAgICAoY29uc3QgY2hhciAqKXBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5wRmlsZSk7Ci0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0VmlkZW9TdXJmYWNlKAotICAgICBwQ29udHJvbGxlci0+bVN1cmZhY2UpOwotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZXRWaWRlb1N1cmZhY2UiKTsKLQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXRNZWRpYVJlbmRlcmluZ01vZGUoCi0gICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT54VlNTLk1lZGlhUmVuZGVyaW5nLAotICAgICBwQ29udHJvbGxlci0+bU91dHB1dFZpZGVvU2l6ZSk7Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldE1lZGlhUmVuZGVyaW5nTW9kZSIpOwotCi0gICAgaWYoKE00T1NBX1VJbnQzMilpbmRleCA9PSBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7Ci0gICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXRQbGF5YmFja0JlZ2luVGltZSgKLSAgICAgICAgcENvbnRyb2xsZXItPm1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXRQbGF5YmFja0JlZ2luVGltZSgKLSAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lKTsKLSAgICB9Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldFBsYXliYWNrQmVnaW5UaW1lKCVkKSIsCi0gICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSk7Ci0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0UGxheWJhY2tFbmRUaW1lKAotICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlFbmRDdXRUaW1lKTsKLSAgICBBTE9HVigicHJlcGFyZVBsYXllcjogc2V0UGxheWJhY2tFbmRUaW1lKCVkKSIsCi0gICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUVuZEN1dFRpbWUpOwotCi0gICAgaWYocENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0SW1hZ2VDbGlwUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBBTE9HVigicHJlcGFyZVBsYXllcjogc2V0SW1hZ2VDbGlwUHJvcGVydGllcyIpOwotICAgIH0KLQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5wcmVwYXJlKCk7Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHByZXBhcmVkIik7Ci0KLSAgICBpZihwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUgPiAwKSB7Ci0gICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZWVrVG8oCi0gICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUpOwotCi0gICAgICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZWVrVG8oJWQpIiwKLSAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgfQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyXS0+c2V0QXVkaW9QbGF5ZXIocENvbnRyb2xsZXItPm1WRUF1ZGlvUGxheWVyKTsKLQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5yZWFkRmlyc3RWaWRlb0ZyYW1lKCk7Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHJlYWRGaXJzdFZpZGVvRnJhbWUgb2YgY2xpcCIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnRocmVhZFByb2MoTTRPU0FfVm9pZCogcGFyYW0pIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9JbnQzMiBpbmRleCA9IDA7Ci0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqcENvbnRyb2xsZXIgPQotICAgICAoVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqKXBhcmFtOwotCi0gICAgQUxPR1YoImluc2lkZSB0aHJlYWRQcm9jIik7Ci0gICAgaWYocENvbnRyb2xsZXItPm1QbGF5ZXJTdGF0ZSA9PSBWZVBsYXllcklkbGUpIHsKLSAgICAgICAgKHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIpKys7Ci0KLSAgICAgICAgQUxPR0QoInRocmVhZFByb2M6IHBsYXlpbmcgZmlsZSBpbmRleCAlZCB0b3RhbCBjbGlwcyAlZCIsCi0gICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyLCBwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3KTsKLQotICAgICAgICBpZigoTTRPU0FfVUludDMyKXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgPj0KLSAgICAgICAgIHBDb250cm9sbGVyLT5tTnVtYmVyQ2xpcHNUb1ByZXZpZXcpIHsKLQotICAgICAgICAgICAgQUxPR0QoIkFsbCBjbGlwcyBwcmV2aWV3ZWQiKTsKLQotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcER1cmF0aW9uID0gMDsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllciA9IDA7Ci0KLSAgICAgICAgICAgIGlmKHBDb250cm9sbGVyLT5tUHJldmlld0xvb3BpbmcgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgPQotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4OwotCi0gICAgICAgICAgICAgICAgQUxPR0QoIlByZXZpZXcgbG9vcGluZyBUUlVFLCByZXN0YXJ0aW5nIGZyb20gY2xpcCBpbmRleCAlZCIsCi0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHN0b3J5IGJvYXJkIHRpbWVzdGFtcCBpbnNpZGUgdGhlIHBsYXllcgotICAgICAgICAgICAgICAgIGZvciAoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7Ci0gICAgICAgICAgICAgICAgIHBsYXllckluc3QrKykgewotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RdLT5yZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGVuZEFyZ3MgPSAwOwotICAgICAgICAgICAgICAgIGlmKHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrKAotICAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDb29raWUsIE1TR19UWVBFX1BSRVZJRVdfRU5ELCAmZW5kQXJncyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPSBWZVBsYXllckF1dG9TdG9wOwotCi0gICAgICAgICAgICAgICAgLy8gUmVzZXQgb3JpZ2luYWwgYmVnaW4gY3V0dGltZSBvZiBmaXJzdCBwcmV2aWV3ZWQgY2xpcAotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleF0tPnVpQmVnaW5DdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lOwotICAgICAgICAgICAgICAgIC8vIFJlc2V0IG9yaWdpbmFsIGVuZCBjdXR0aW1lIG9mIGxhc3QgcHJldmlld2VkIGNsaXAKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tTnVtYmVyQ2xpcHNUb1ByZXZpZXctMV0tPnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tTGFzdFByZXZpZXdDbGlwRW5kVGltZTsKLQotICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIHdhcm5pbmcgdG8gTTRPU0EgdGhyZWFkIGhhbmRsZXIKLSAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHRocmVhZCBpcyBtb3ZlZCBmcm9tIGV4ZWN1dGluZyBzdGF0ZSB0byBvcGVuIHN0YXRlCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZXg9cENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcjsKLSAgICAgICAgaWYoKE00T1NBX1VJbnQzMilwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID09IHBDb250cm9sbGVyLT5tU3RhcnRpbmdDbGlwSW5kZXgpIHsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1WaWRlb1N0b3J5Qm9hcmRUaW1lTXNVcHRvRmlyc3RQcmV2aWV3Q2xpcDsKLQotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcER1cmF0aW9uID0KLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXJdLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgLSBwQ29udHJvbGxlci0+bUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWU7Ci0KLSAgICAgICAgICAgIHByZXBhcmVQbGF5ZXIoKHZvaWQqKXBDb250cm9sbGVyLCBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIsIGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcER1cmF0aW9uOwotCi0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwRHVyYXRpb24gPQotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcl0tPnVpRW5kQ3V0VGltZSAtCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyXS0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BDb250cm9sbGVyLT5tQ3VycmVudFBsYXllcl0tPnNldFN0b3J5Ym9hcmRTdGFydFRpbWUoCi0gICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZWREdXJhdGlvbik7Ci0gICAgICAgIEFMT0dWKCJ0aHJlYWRQcm9jOiBzZXRTdG9yeWJvYXJkU3RhcnRUaW1lIik7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBuZXh0IGNsaXAgZHVyYXRpb24gZm9yIEF1ZGlvIG1peCBoZXJlCi0gICAgICAgIGlmKChNNE9TQV9VSW50MzIpcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciAhPSBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7Ci0KLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyXS0+c2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24sCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5DbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb1ZvbHVtZVBlcmNlbnRhZ2UpOwotCi0gICAgICAgICAgICBBTE9HVigidGhyZWFkUHJvYzogc2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0gZnJvbU1TICVkIFwKLSAgICAgICAgICAgICBDbGlwQmVnaW5UaW1lICVkIiwgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24gKwotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSwKLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvVm9sdW1lUGVyY2VudGFnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2FwdHVyZSB0aGUgYWN0aXZlIHBsYXllciBiZWluZyB1c2VkCi0gICAgICAgIHBDb250cm9sbGVyLT5tQWN0aXZlUGxheWVySW5kZXggPSBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXI7Ci0KLSAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXJdLT5zdGFydCgpOwotICAgICAgICBBTE9HVigidGhyZWFkUHJvYzogc3RhcnRlZCIpOwotCi0gICAgICAgIHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPSBWZVBsYXllckJ1c3k7Ci0KLSAgICB9IGVsc2UgaWYocENvbnRyb2xsZXItPm1QbGF5ZXJTdGF0ZSA9PSBWZVBsYXllckF1dG9TdG9wKSB7Ci0gICAgICAgIEFMT0dWKCJQcmV2aWV3IGNvbXBsZXRlZC4uYXV0byBzdG9wIHRoZSBwbGF5ZXIiKTsKLSAgICB9IGVsc2UgaWYgKChwQ29udHJvbGxlci0+bVBsYXllclN0YXRlID09IFZlUGxheWVyQnVzeSkgJiYgKHBDb250cm9sbGVyLT5tUHJlcGFyZVJlcWVzdCkpIHsKLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcGxheWVyIGhlcmUKLSAgICAgICAgcENvbnRyb2xsZXItPm1QcmVwYXJlUmVxZXN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHByZXBhcmVQbGF5ZXIoKHZvaWQqKXBDb250cm9sbGVyLCBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIsCi0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKzEpOwotICAgICAgICBpZiAocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGVyciA9IE00T1NBX3NlbWFwaG9yZVdhaXQocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0LAotICAgICAgICAgICAgICAgIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIXBDb250cm9sbGVyLT5iU3RvcFRocmVhZEluUHJvZ3Jlc3MpIHsKLSAgICAgICAgICAgIEFMT0dWKCJ0aHJlYWRQcm9jOiBzdGF0ZSBidXN5Li4ud2FpdCBmb3Igc2VtIik7Ci0gICAgICAgICAgICBpZiAocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9zZW1hcGhvcmVXYWl0KHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCwKLSAgICAgICAgICAgICAgICAgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoInRocmVhZFByb2M6IHNlbSB3YWl0IHJldHVybmVkIGVyciA9IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIC8vQWx3YXlzIHJldHVybiBNNE5PX0VSUk9SIHRvIGVuc3VyZSB0aGUgdGhyZWFkIGtlZXBzIHJ1bm5pbmcKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpub3RpZnkoCi0gICAgdm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpCi17Ci0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqcENvbnRyb2xsZXIgPQotICAgICAoVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqKWNvb2tpZTsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIHVpbnQzMl90IGNsaXBEdXJhdGlvbiA9IDA7Ci0gICAgc3dpdGNoIChtc2cpIHsKLSAgICAgICAgY2FzZSBNRURJQV9OT1A6IC8vIGludGVyZmFjZSB0ZXN0IG1lc3NhZ2UKLSAgICAgICAgICAgIEFMT0dWKCJNRURJQV9OT1AiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1FRElBX1BSRVBBUkVEOgotICAgICAgICAgICAgQUxPR1YoIk1FRElBX1BSRVBBUkVEIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNRURJQV9QTEFZQkFDS19DT01QTEVURToKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR0QoIm5vdGlmeTpNRURJQV9QTEFZQkFDS19DT01QTEVURSwgbUN1cnJlbnRDbGlwTnVtYmVyID0gJWQiLAotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKTsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPSBWZVBsYXllcklkbGU7Ci0KLSAgICAgICAgICAgIC8vc2VuZCBwcm9ncmVzcyBjYWxsYmFjayB3aXRoIGxhc3QgZnJhbWUgdGltZXN0YW1wCi0gICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgPT0KLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgY2xpcER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgICAgICAtIHBDb250cm9sbGVyLT5tRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGNsaXBEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcl0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgLSBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXJdLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTTRPU0FfVUludDMyIHBsYXllZER1cmF0aW9uID0gY2xpcER1cmF0aW9uK3BDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uOwotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDb29raWUsIE1TR19UWVBFX1BST0dSRVNTX0lORElDQVRJT04sCi0gICAgICAgICAgICAgICAgICZwbGF5ZWREdXJhdGlvbik7Ci0KLSAgICAgICAgICAgIGlmICgocENvbnRyb2xsZXItPm1PdmVybGF5U3RhdGUgPT0gT1ZFUkxBWV9VUERBVEUpICYmCi0gICAgICAgICAgICAgICAgKChNNE9TQV9VSW50MzIpcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciAhPQotICAgICAgICAgICAgICAgIChwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3LTEpKSkgewotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8gKnBFZGl0SW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgIChWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8pLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIkN1cnJlbnQgRWRpdCBpbmZvIik7Ci0gICAgICAgICAgICAgICAgcEVkaXRJbmZvLT5vdmVybGF5U2V0dGluZ3NJbmRleCA9IGV4dDI7Ci0gICAgICAgICAgICAgICAgcEVkaXRJbmZvLT5jbGlwSW5kZXggPSBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyOwotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tT3ZlcmxheVN0YXRlID09IE9WRVJMQVlfQ0xFQVI7Ci0gICAgICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0dfVFlQRV9PVkVSTEFZX0NMRUFSLCBwRWRpdEluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcmVlKHBFZGl0SW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKHBDb250cm9sbGVyLT5tTG9ja1NlbSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNRURJQV9FUlJPUjoKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGVycl92YWwgPSBleHQxOwotICAgICAgICAgIC8vIEFsd2F5cyBsb2cgZXJyb3JzLgotICAgICAgICAgIC8vIGV4dDE6IE1lZGlhIGZyYW1ld29yayBlcnJvciBjb2RlLgotICAgICAgICAgIC8vIGV4dDI6IEltcGxlbWVudGF0aW9uIGRlcGVuZGFudCBlcnJvciBjb2RlLgotICAgICAgICAgICAgQUxPR0UoIk1FRElBX0VSUk9SOyBlcnJvciAoJWQsICVkKSIsIGV4dDEsIGV4dDIpOwotICAgICAgICAgICAgaWYocENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgTVNHX1RZUEVfUExBWUVSX0VSUk9SLCAmZXJyX3ZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE1FRElBX0lORk86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpbmZvX3ZhbCA9IGV4dDI7Ci0gICAgICAgICAgICAvLyBleHQxOiBNZWRpYSBmcmFtZXdvcmsgZXJyb3IgY29kZS4KLSAgICAgICAgICAgIC8vIGV4dDI6IEltcGxlbWVudGF0aW9uIGRlcGVuZGFudCBlcnJvciBjb2RlLgotICAgICAgICAgICAgLy9BTE9HVygiTUVESUFfSU5GTzsgaW5mby93YXJuaW5nICglZCwgJWQpIiwgZXh0MSwgZXh0Mik7Ci0gICAgICAgICAgICBpZihwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrKHBDb250cm9sbGVyLT5tSm5pQ29va2llLAotICAgICAgICAgICAgICAgICBNU0dfVFlQRV9QUk9HUkVTU19JTkRJQ0FUSU9OLCAmaW5mb192YWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNRURJQV9TRUVLX0NPTVBMRVRFOgotICAgICAgICAgICAgQUxPR1YoIk1FRElBX1NFRUtfQ09NUExFVEU7IFJlY2VpdmVkIHNlZWsgY29tcGxldGUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1FRElBX0JVRkZFUklOR19VUERBVEU6Ci0gICAgICAgICAgICBBTE9HVigiTUVESUFfQlVGRkVSSU5HX1VQREFURTsgYnVmZmVyaW5nICVkIiwgZXh0MSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNRURJQV9TRVRfVklERU9fU0laRToKLSAgICAgICAgICAgIEFMT0dWKCJNRURJQV9TRVRfVklERU9fU0laRTsgTmV3IHZpZGVvIHNpemUgJWQgeCAlZCIsIGV4dDEsIGV4dDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8aW50PigweEFBQUFBQUFBKToKLSAgICAgICAgICAgIEFMT0dWKCJWSURFTyBQTEFZQkFDSyBBTE1PU1Qgb3ZlciwgcHJlcGFyZSBuZXh0IHBsYXllciIpOwotICAgICAgICAgICAgLy8gU2VsZWN0IG5leHQgcGxheWVyIGFuZCBwcmVwYXJlIGl0Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGNsaXAgYWZ0ZXIgdGhpcyBvbmUKLSAgICAgICAgICAgIGlmICgoTTRPU0FfVUludDMyKShwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKzEpIDwKLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3KSB7Ci0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1QcmVwYXJlUmVxZXN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIrKzsKLSAgICAgICAgICAgICAgICBpZiAocENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyID49IGtUb3RhbE51bVBsYXllckluc3RhbmNlcykgewotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBmaXJzdCBjbGlwIHRvIGJlIHBsYXllZAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKHBDb250cm9sbGVyLT5tTG9ja1NlbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8aW50PigweEJCQkJCQkJCKToKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIlZJREVPIFBMQVlCQUNLLCBVcGRhdGUgT3ZlcmxheSIpOwotICAgICAgICAgICAgaW50IG92ZXJsYXlJbmRleCA9IGV4dDI7Ci0gICAgICAgICAgICBWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvICpwRWRpdEluZm8gPQotICAgICAgICAgICAgICAgICAgICAoVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJDdXJyZW50IEVkaXQgaW5mbyIpOwotICAgICAgICAgICAgLy9leHQxID0gMTsgc3RhcnQgdGhlIG92ZXJsYXkgZGlzcGxheQotICAgICAgICAgICAgLy8gICAgID0gMjsgQ2xlYXIgdGhlIG92ZXJsYXkuCi0gICAgICAgICAgICBwRWRpdEluZm8tPm92ZXJsYXlTZXR0aW5nc0luZGV4ID0gZXh0MjsKLSAgICAgICAgICAgIHBFZGl0SW5mby0+Y2xpcEluZGV4ID0gcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcjsKLSAgICAgICAgICAgIEFMT0dWKCJwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID0gJWQiLHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIpOwotICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChleHQxID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1PdmVybGF5U3RhdGUgPSBPVkVSTEFZX1VQREFURTsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1TR19UWVBFX09WRVJMQVlfVVBEQVRFLCBwRWRpdEluZm8pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tT3ZlcmxheVN0YXRlID0gT1ZFUkxBWV9DTEVBUjsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1TR19UWVBFX09WRVJMQVlfQ0xFQVIsIHBFZGl0SW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShwRWRpdEluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJ1bnJlY29nbml6ZWQgbWVzc2FnZTogKCVkLCAlZCwgJWQpIiwgbXNnLCBleHQxLCBleHQyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzZXRWaWRlb0VmZmVjdFR5cGUoCi0gICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0eXBlLCBNNE9TQV9Cb29sIGVuYWJsZSkgewotCi0gICAgTTRPU0FfVUludDMyIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotCi0gICAgLy8gbWFwIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdG8gbG9jYWwgZW51bQotICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjazoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GQURFRlJPTUJMQUNLOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlVG9CbGFjazoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GQURFVE9CTEFDSzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZToKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9CTEFDS0FORFdISVRFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX1BJTks7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0dSRUVOOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYToKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9TRVBJQTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfTkVHQVRJVkU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmc6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRlJBTUlORzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRmlmdGllczoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GSUZUSUVTOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2OgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0NPTE9SX1JHQjE2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudDoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9HUkFESUVOVDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfTk9ORTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmKGVuYWJsZSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgIC8vIElmIGFscmVhZHkgc2V0LCB0aGVuIG5vIG5lZWQgdG8gc2V0IGFnYWluCi0gICAgICAgIGlmKCEobUN1cnJlbnRWaWRlb0VmZmVjdCAmIGVmZmVjdCkpCi0gICAgICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0IHw9IGVmZmVjdDsKLSAgICAgICAgICAgIGlmKGVmZmVjdCA9PSBWSURFT19FRkZFQ1RfRklGVElFUykgewotICAgICAgICAgICAgICAgIG1Jc0ZpZnRpZXNFZmZlY3RTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAgewotICAgICAgICAvLyBSZXNldCBvbmx5IGlmIGFscmVhZHkgc2V0Ci0gICAgICAgIGlmKG1DdXJyZW50VmlkZW9FZmZlY3QgJiBlZmZlY3QpCi0gICAgICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0ICY9IH5lZmZlY3Q7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjphcHBseVZpZGVvRWZmZWN0KAotICAgIE00T1NBX1ZvaWQgKiBkYXRhUHRyLCBNNE9TQV9VSW50MzIgY29sb3JGb3JtYXQsIE00T1NBX1VJbnQzMiB2aWRlb1dpZHRoLAotICAgIE00T1NBX1VJbnQzMiB2aWRlb0hlaWdodCwgTTRPU0FfVUludDMyIHRpbWVNcywgTTRPU0FfVm9pZCogb3V0UHRyKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICB2ZVBvc3RQcm9jZXNzUGFyYW1zIHBvc3RQcm9jZXNzUGFyYW1zOwotCi0gICAgcG9zdFByb2Nlc3NQYXJhbXMudmlkQnVmZmVyID0gKE00VklGSV9VSW50OCopZGF0YVB0cjsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy52aWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLnRpbWVNcyA9IHRpbWVNczsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy50aW1lT2Zmc2V0ID0gMDsgLy9TaW5jZSB0aW1lTVMgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIG9mZnNldCBpbiB0aGlzIGNhc2UKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5lZmZlY3RzU2V0dGluZ3MgPSBtRWZmZWN0c1NldHRpbmdzOwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLm51bWJlckVmZmVjdHMgPSBtTnVtYmVyRWZmZWN0czsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5vdXRWaWRlb1dpZHRoID0gbU91dHB1dFZpZGVvV2lkdGg7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMub3V0VmlkZW9IZWlnaHQgPSBtT3V0cHV0VmlkZW9IZWlnaHQ7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMuY3VycmVudFZpZGVvRWZmZWN0ID0gbUN1cnJlbnRWaWRlb0VmZmVjdDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5yZW5kZXJpbmdNb2RlID0gbVJlbmRlcmluZ01vZGU7Ci0gICAgaWYobUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICBwb3N0UHJvY2Vzc1BhcmFtcy5pc0ZpZnRpZXNFZmZlY3RTdGFydGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgcG9zdFByb2Nlc3NQYXJhbXMuaXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLSAgICAvL3Bvc3RQcm9jZXNzUGFyYW1zLnJlbmRlcmVyID0gbVRhcmdldDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5vdmVybGF5RnJhbWVSR0JCdWZmZXIgPSBOVUxMOwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLm92ZXJsYXlGcmFtZVlVVkJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBtVGFyZ2V0LT5nZXRCdWZmZXJZVjEyKCYocG9zdFByb2Nlc3NQYXJhbXMucE91dEJ1ZmZlciksICYocG9zdFByb2Nlc3NQYXJhbXMub3V0QnVmZmVyU3RyaWRlKSk7Ci0KLSAgICBlcnIgPSBhcHBseUVmZmVjdHNBbmRSZW5kZXJpbmdNb2RlKCZwb3N0UHJvY2Vzc1BhcmFtcywgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnNldFByZXZpZXdGcmFtZVJlbmRlcmluZ01vZGUoCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIG91dHB1dFZpZGVvU2l6ZSkgewotCi0gICAgQUxPR1YoInNldE1lZGlhUmVuZGVyaW5nTW9kZTogb3V0cHV0VmlkZW9TaXplID0gJWQiLCBvdXRwdXRWaWRlb1NpemUpOwotICAgIG1SZW5kZXJpbmdNb2RlID0gbW9kZTsKLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIC8qIGdldCB0aGUgdmlkZW8gd2lkdGggYW5kIGhlaWdodCBieSByZXNvbHV0aW9uICovCi0gICAgZXJyID0gZ2V0VmlkZW9TaXplQnlSZXNvbHV0aW9uKG91dHB1dFZpZGVvU2l6ZSwKLSAgICAgICAgICAgICAgJm1PdXRwdXRWaWRlb1dpZHRoLCAmbU91dHB1dFZpZGVvSGVpZ2h0KTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpkb0ltYWdlUmVuZGVyaW5nTW9kZSgKLSAgICBNNE9TQV9Wb2lkICogZGF0YVB0ciwgTTRPU0FfVUludDMyIGNvbG9yRm9ybWF0LCBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aCwKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9IZWlnaHQsIE00T1NBX1ZvaWQqIG91dFB0cikgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcGxhbmVJblszXSwgcGxhbmVPdXRbM107Ci0gICAgTTRWSUZJX1VJbnQ4ICppbkJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dEJ1ZmZlcldpZHRoID0wLCBvdXRwdXRCdWZmZXJIZWlnaHQ9MDsKLQotICAgIC8vZnJhbWVTaXplID0gKHZpZGVvV2lkdGgqdmlkZW9IZWlnaHQqMykgPj4gMTsKLSAgICBpbkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKWRhdGFQdHI7Ci0KLSAgICAvLyBJbiBwbGFuZQotICAgIHByZXBhcmVZVVY0MjBJbWFnZVBsYW5lKHBsYW5lSW4sIHZpZGVvV2lkdGgsCi0gICAgICB2aWRlb0hlaWdodCwgKE00VklGSV9VSW50OCAqKWluQnVmZmVyLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7Ci0KLSAgICBvdXRwdXRCdWZmZXJXaWR0aCA9IG1PdXRwdXRWaWRlb1dpZHRoOwotICAgIG91dHB1dEJ1ZmZlckhlaWdodCA9IG1PdXRwdXRWaWRlb0hlaWdodDsKLQotICAgIC8vIE91dCBwbGFuZQotICAgIHVpbnQ4X3QqIG91dEJ1ZmZlcjsKLSAgICBzaXplX3Qgb3V0QnVmZmVyU3RyaWRlID0gMDsKLQotICAgIEFMT0dWKCJkb01lZGlhUmVuZGVyaW5nIENBTEwgZ2V0QnVmZmVyKCkiKTsKLSAgICBtVGFyZ2V0LT5nZXRCdWZmZXJZVjEyKCZvdXRCdWZmZXIsICZvdXRCdWZmZXJTdHJpZGUpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgWVVWNDIwIHBsYW5lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBZVjEyIGZvcm1hdAotICAgIC8vSW4gWVYxMiBmb3JtYXQsIHNpemVzIG11c3QgYmUgZXZlbgotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVXaWR0aCA9ICgobU91dHB1dFZpZGVvV2lkdGggKzEpPj4xKTw8MTsKLSAgICBNNE9TQV9VSW50MzIgeXYxMlBsYW5lSGVpZ2h0ID0gKChtT3V0cHV0VmlkZW9IZWlnaHQrMSk+PjEpPDwxOwotCi0gICAgcHJlcGFyZVlWMTJJbWFnZVBsYW5lKHBsYW5lT3V0LCB5djEyUGxhbmVXaWR0aCwgeXYxMlBsYW5lSGVpZ2h0LAotICAgICAoTTRPU0FfVUludDMyKW91dEJ1ZmZlclN0cmlkZSwgKE00VklGSV9VSW50OCAqKW91dEJ1ZmZlcik7Ci0KLSAgICBlcnIgPSBhcHBseVJlbmRlcmluZ01vZGUocGxhbmVJbiwgcGxhbmVPdXQsIG1SZW5kZXJpbmdNb2RlKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZG9JbWFnZVJlbmRlcmluZ01vZGU6IGFwcGx5UmVuZGVyaW5nTW9kZSByZXR1cm5lZCBlcnI9MHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNzU2ZjMyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVkVfUFJFVklFV0NPTlRST0xMRVJfSAotI2RlZmluZSBBTkRST0lEX1ZFX1BSRVZJRVdDT05UUk9MTEVSX0gKLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUGxheWVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIENhbGxiYWNrIG1lY2hhbmlzbSBmcm9tIFByZXZpZXdDb250cm9sbGVyIHRvIEpuaSAgKi8KLXR5cGVkZWYgdm9pZCAoKmpuaV9wcm9ncmVzc19jYWxsYmFja19mY3QpKHZvaWQqIGNvb2tpZSwgTTRPU0FfVUludDMyIG1zZ1R5cGUsIHZvaWQgKmFyZ2MpOwotCi1zdHJ1Y3QgU3VyZmFjZTsKLXN0cnVjdCBQcmV2aWV3UmVuZGVyZXI7Ci0KLWNsYXNzIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgewotCi1wdWJsaWM6Ci0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcigpOwotICAgIH5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyKCk7Ci0KLSAgICBNNE9TQV9FUlIgbG9hZEVkaXRTZXR0aW5ncygKLSAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncywKLSAgICAgICAgICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBiZ21TZXR0aW5ncyk7Ci0KLSAgICBNNE9TQV9FUlIgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7Ci0KLSAgICBNNE9TQV9FUlIgc3RhcnRQcmV2aWV3KAotICAgICAgICAgICAgTTRPU0FfVUludDMyIGZyb21NUywgTTRPU0FfSW50MzIgdG9NcywKLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBjYWxsQmFja0FmdGVyRnJhbWVDb3VudCwKLSAgICAgICAgICAgIE00T1NBX0Jvb2wgbG9vcCkgOwotCi0gICAgTTRPU0FfVUludDMyIHN0b3BQcmV2aWV3KCk7Ci0KLSAgICBNNE9TQV9FUlIgcmVuZGVyUHJldmlld0ZyYW1lKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UsCi0gICAgICAgICAgICBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIqIHBGcmFtZUluZm8sCi0gICAgICAgICAgICBWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvICpwQ3VyckVkaXRJbmZvKTsKLQotICAgIE00T1NBX0VSUiBjbGVhclN1cmZhY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSwKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciogcEZyYW1lSW5mbyk7Ci0KLSAgICBNNE9TQV9Wb2lkIHNldEpuaUNhbGxiYWNrKAotICAgICAgICAgICAgdm9pZCogY29va2llLAotICAgICAgICAgICAgam5pX3Byb2dyZXNzX2NhbGxiYWNrX2ZjdCBjYWxsYmFja0ZjdCk7Ci0KLSAgICBzdGF0dXNfdCBzZXRQcmV2aWV3RnJhbWVSZW5kZXJpbmdNb2RlKAotICAgICAgICAgICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsCi0gICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXMgPSAyLAotICAgICAgICBrUHJldmlld1RocmVhZFN0YWNrU2l6ZSA9IDY1NTM2LAotICAgIH07Ci0KLSAgICB0eXBlZGVmIGVudW0gewotICAgICAgICBWZVBsYXllcklkbGUgPSAwLAotICAgICAgICBWZVBsYXllckJ1c3ksCi0gICAgICAgIFZlUGxheWVyQXV0b1N0b3AKLSAgICB9IFBsYXllclN0YXRlOwotCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgT1ZFUkxBWV9VUERBVEUgPSAwLAotICAgICAgICBPVkVSTEFZX0NMRUFSCi0gICAgfSBPdmVybGF5U3RhdGU7Ci0KLSAgICBzcDxWaWRlb0VkaXRvclBsYXllcj4gbVZlUGxheWVyW2tUb3RhbE51bVBsYXllckluc3RhbmNlc107Ci0gICAgaW50IG1DdXJyZW50UGxheWVyOyAgLy8gcGxheWVyIGluc3RhbmNlIGN1cnJlbnRseSBiZWluZyB1c2VkCi0gICAgc3A8U3VyZmFjZT4gIG1TdXJmYWNlOwotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgTTRPU0FfQ29udGV4dCBtVGhyZWFkQ29udGV4dDsKLSAgICBQbGF5ZXJTdGF0ZSBtUGxheWVyU3RhdGU7Ci0gICAgTTRPU0FfQm9vbCAgICBtUHJlcGFyZVJlcWVzdDsKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICoqbUNsaXBMaXN0OwotICAgIE00T1NBX1VJbnQzMiBtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7Ci0gICAgTTRPU0FfVUludDMyIG1OdW1iZXJDbGlwc1RvUHJldmlldzsKLSAgICBNNE9TQV9VSW50MzIgbVN0YXJ0aW5nQ2xpcEluZGV4OwotICAgIE00T1NBX0Jvb2wgbVByZXZpZXdMb29waW5nOwotICAgIE00T1NBX1VJbnQzMiBtQ2FsbEJhY2tBZnRlckZyYW1lQ250OwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogbUVmZmVjdHNTZXR0aW5nczsKLSAgICBNNE9TQV9VSW50MzIgbU51bWJlckVmZmVjdHM7Ci0gICAgTTRPU0FfSW50MzIgbUN1cnJlbnRDbGlwTnVtYmVyOwotICAgIE00T1NBX1VJbnQzMiBtQ2xpcFRvdGFsRHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50VmlkZW9FZmZlY3Q7Ci0gICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nOwotICAgIE00T1NBX0NvbnRleHQgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZTsKLSAgICBQcmV2aWV3UmVuZGVyZXIgKm1UYXJnZXQ7Ci0gICAgTTRPU0FfQ29udGV4dCBtSm5pQ29va2llOwotICAgIGpuaV9wcm9ncmVzc19jYWxsYmFja19mY3QgbUpuaUNhbGxiYWNrOwotICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciBtRnJhbWVTdHI7Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50UGxheWVkRHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50Q2xpcER1cmF0aW9uOwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIG1PdXRwdXRWaWRlb1NpemU7Ci0gICAgTTRPU0FfVUludDMyIG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lOwotICAgIE00T1NBX1VJbnQzMiBtTGFzdFByZXZpZXdDbGlwRW5kVGltZTsKLSAgICBNNE9TQV9VSW50MzIgbVZpZGVvU3RvcnlCb2FyZFRpbWVNc1VwdG9GaXJzdFByZXZpZXdDbGlwOwotICAgIE92ZXJsYXlTdGF0ZSBtT3ZlcmxheVN0YXRlOwotICAgIGludCBtQWN0aXZlUGxheWVySW5kZXg7Ci0KLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbVJlbmRlcmluZ01vZGU7Ci0gICAgdWludDMyX3QgbU91dHB1dFZpZGVvV2lkdGg7Ci0gICAgdWludDMyX3QgbU91dHB1dFZpZGVvSGVpZ2h0OwotICAgIGJvb2wgYlN0b3BUaHJlYWRJblByb2dyZXNzOwotICAgIE00T1NBX0NvbnRleHQgbVNlbVRocmVhZFdhaXQ7Ci0gICAgYm9vbCBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZDsKLQotICAgIHNwPFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0PiBtVkVBdWRpb1Npbms7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqbVZFQXVkaW9QbGF5ZXI7Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIqIG1OYXRpdmVXaW5kb3dSZW5kZXJlcjsKLQotICAgIE00VklGSV9VSW50OCogIG1GcmFtZVJHQkJ1ZmZlcjsKLSAgICBNNFZJRklfVUludDgqICBtRnJhbWVZVVZCdWZmZXI7Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9ja1NlbTsKLQotCi0gICAgc3RhdGljIE00T1NBX0VSUiBwcmVwYXJlUGxheWVyKHZvaWQqIHBhcmFtLCBpbnQgcGxheWVySW5zdGFuY2UsIGludCBpbmRleCk7Ci0gICAgc3RhdGljIE00T1NBX0VSUiB0aHJlYWRQcm9jKE00T1NBX1ZvaWQqIHBhcmFtKTsKLSAgICBzdGF0aWMgdm9pZCBub3RpZnkodm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOwotCi0gICAgdm9pZCBzZXRWaWRlb0VmZmVjdFR5cGUoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0eXBlLCBNNE9TQV9Cb29sIGVuYWJsZSk7Ci0KLSAgICBNNE9TQV9FUlIgYXBwbHlWaWRlb0VmZmVjdCgKLSAgICAgICAgICAgIE00T1NBX1ZvaWQgKiBkYXRhUHRyLCBNNE9TQV9VSW50MzIgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aCwgTTRPU0FfVUludDMyIHZpZGVvSGVpZ2h0LAotICAgICAgICAgICAgTTRPU0FfVUludDMyIHRpbWVNcywgTTRPU0FfVm9pZCogb3V0UHRyKTsKLQotICAgIE00T1NBX0VSUiBkb0ltYWdlUmVuZGVyaW5nTW9kZSgKLSAgICAgICAgICAgIE00T1NBX1ZvaWQgKiBkYXRhUHRyLAotICAgICAgICAgICAgTTRPU0FfVUludDMyIGNvbG9yRm9ybWF0LCBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aCwKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiB2aWRlb0hlaWdodCwgTTRPU0FfVm9pZCogb3V0UHRyKTsKLQotICAgIC8vIERvbid0IGNhbGwgbWUhCi0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcihjb25zdCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICYpOwotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgJm9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgJik7Ci19OwotCi19Ci0KLSNlbmRpZiAvLyBBTkRST0lEX1ZFX1BSRVZJRVdDT05UUk9MTEVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2ZDA4MTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVmlkZW9FZGl0b3JTUkMiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSAiVmlkZW9FZGl0b3JTUkMuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVZpZGVvRWRpdG9yU1JDOjpWaWRlb0VkaXRvclNSQyhjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvclNSQyAlcCglcCkiLCB0aGlzLCBzb3VyY2UuZ2V0KCkpOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtEZWZhdWx0U2FtcGxpbmdGcmVxZW5jeUh6ID0ga0ZyZXEzMjAwMEh6OwotICAgIG1Tb3VyY2UgPSBzb3VyY2U7Ci0gICAgbVJlc2FtcGxlciA9IE5VTEw7Ci0gICAgbUNoYW5uZWxDbnQgPSAwOwotICAgIG1TYW1wbGVSYXRlID0gMDsKLSAgICBtT3V0cHV0U2FtcGxlUmF0ZSA9IGtEZWZhdWx0U2FtcGxpbmdGcmVxZW5jeUh6OwotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgbUluaXRpYWxUaW1lU3RhbXBVcyA9IC0xOwotICAgIG1BY2N1T3V0QnVmZmVyU2l6ZSAgPSAwOwotICAgIG1TZWVrVGltZVVzID0gLTE7Ci0gICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgbUxlZnRvdmVyID0gMDsKLSAgICBtRm9ybWF0Q2hhbmdlZCA9IGZhbHNlOwotICAgIG1TdG9wUGVuZGluZyA9IGZhbHNlOwotICAgIG1TZWVrTW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0KLSAgICAvLyBJbnB1dCBTb3VyY2UgdmFsaWRhdGlvbgotICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotICAgIENIRUNLKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpOwotCi0gICAgLy8gU2V0IHRoZSBtZXRhZGF0YSBvZiB0aGUgb3V0cHV0IGFmdGVyIHJlc2FtcGxpbmcuCi0gICAgbU91dHB1dEZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICBtT3V0cHV0Rm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwga0RlZmF1bHRTYW1wbGluZ0ZyZXFlbmN5SHopOwotICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOyAgLy8gYWx3YXlzIHN0ZXJlbwotfQotCi1WaWRlb0VkaXRvclNSQzo6flZpZGVvRWRpdG9yU1JDKCkgewotICAgIEFMT0dWKCJ+VmlkZW9FZGl0b3JTUkMgJXAoJXApIiwgdGhpcywgbVNvdXJjZS5nZXQoKSk7Ci0gICAgc3RvcCgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclNSQzo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIEFMT0dWKCJzdGFydCAlcCglcCkiLCB0aGlzLCBtU291cmNlLmdldCgpKTsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgLy8gU2V0IHJlc2FtcGxlciBpZiByZXF1aXJlZAotICAgIGNoZWNrQW5kU2V0UmVzYW1wbGVyKCk7Ci0KLSAgICBtU2Vla1RpbWVVcyA9IC0xOwotICAgIG1TZWVrTW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgIG1Tb3VyY2UtPnN0YXJ0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yU1JDOjpzdG9wKCkgewotICAgIEFMT0dWKCJzdG9wICVwKCVwKSIsIHRoaXMsIG1Tb3VyY2UuZ2V0KCkpOwotICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChtQnVmZmVyKSB7Ci0gICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICBpZiAobVJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtUmVzYW1wbGVyOwotICAgICAgICBtUmVzYW1wbGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSAtMTsKLSAgICBtQWNjdU91dEJ1ZmZlclNpemUgPSAwOwotICAgIG1MZWZ0b3ZlciA9IDA7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBWaWRlb0VkaXRvclNSQzo6Z2V0Rm9ybWF0KCkgewotICAgIEFMT0dWKCJnZXRGb3JtYXQiKTsKLSAgICByZXR1cm4gbU91dHB1dEZvcm1hdDsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JTUkM6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyX291dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBBTE9HVigicmVhZCAlcCglcCkiLCB0aGlzLCBtU291cmNlLmdldCgpKTsKLSAgICAqYnVmZmVyX291dCA9IE5VTEw7Ci0KLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIGlmIChtUmVzYW1wbGVyKSB7Ci0gICAgICAgIC8vIFN0b3JlIHRoZSBzZWVrIHBhcmFtZXRlcnMKLSAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgICAgICBBTE9HVigicmVhZCBTZWVrICVsbGQiLCBzZWVrVGltZVVzKTsKLSAgICAgICAgICAgIG1TZWVrVGltZVVzID0gc2Vla1RpbWVVczsKLSAgICAgICAgICAgIG1TZWVrTW9kZSA9IG1vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBhc2sgZm9yIDEwMjQgZnJhbWVzIGluIG91dHB1dAotICAgICAgICAvLyByZXNhbXBsZXIgb3V0cHV0IGlzIGFsd2F5cyAyIGNoYW5uZWxzIGFuZCAzMiBiaXRzCi0gICAgICAgIGNvbnN0IHNpemVfdCBrT3V0cHV0RnJhbWVDb3VudCA9IDEwMjQ7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBrQnl0ZXMgPSBrT3V0cHV0RnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MzJfdCk7Ci0gICAgICAgIGludDMyX3QgKnBUbXBCdWZmZXIgPSAoaW50MzJfdCAqKWNhbGxvYygxLCBrQnl0ZXMpOwotICAgICAgICBpZiAoIXBUbXBCdWZmZXIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjYWxsb2MgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeTogJWQgYnl0ZXMiLCBrQnl0ZXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlc2FtcGxlIHRvIHRhcmdldCBxdWFsaXR5Ci0gICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKHBUbXBCdWZmZXIsIGtPdXRwdXRGcmFtZUNvdW50LCB0aGlzKTsKLQotICAgICAgICBpZiAobVN0b3BQZW5kaW5nKSB7Ci0gICAgICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICBtU3RvcFBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoYW5nZSByZXNhbXBsZXIgYW5kIHJldHJ5IGlmIGZvcm1hdCBjaGFuZ2UgaGFwcGVuZWQKLSAgICAgICAgaWYgKG1Gb3JtYXRDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBtRm9ybWF0Q2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgY2hlY2tBbmRTZXRSZXNhbXBsZXIoKTsKLSAgICAgICAgICAgIGZyZWUocFRtcEJ1ZmZlcik7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZChidWZmZXJfb3V0LCBOVUxMKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUJ1ZmZlcgotICAgICAgICBpbnQzMl90IG91dEJ1ZmZlclNpemUgPSBrT3V0cHV0RnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBvdXRCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIob3V0QnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgLy8gQ29udmVydCBiYWNrIHRvIDIgY2hhbm5lbHMgYW5kIDE2IGJpdHMKLSAgICAgICAgZGl0aGVyQW5kQ2xhbXAoCi0gICAgICAgICAgICAgICAgKGludDMyX3QgKikoKHVpbnQ4X3QqKW91dEJ1ZmZlci0+ZGF0YSgpICsgb3V0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICAgICAgICAgcFRtcEJ1ZmZlciwga091dHB1dEZyYW1lQ291bnQpOwotICAgICAgICBmcmVlKHBUbXBCdWZmZXIpOwotCi0gICAgICAgIC8vIENvbXB1dGUgYW5kIHNldCB0aGUgbmV3IHRpbWVzdGFtcAotICAgICAgICBzcDxNZXRhRGF0YT4gdG8gPSBvdXRCdWZmZXItPm1ldGFfZGF0YSgpOwotICAgICAgICBpbnQ2NF90IHRvdGFsT3V0RHVyYXRpb25VcyA9IChtQWNjdU91dEJ1ZmZlclNpemUgKiAxMDAwMDAwKSAvIChtT3V0cHV0U2FtcGxlUmF0ZSAqIDIgKiAyKTsKLSAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBtSW5pdGlhbFRpbWVTdGFtcFVzICsgdG90YWxPdXREdXJhdGlvblVzOwotICAgICAgICB0by0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBhY2N1bXVsYXRlIHNpemUKLSAgICAgICAgbUFjY3VPdXRCdWZmZXJTaXplICs9IG91dEJ1ZmZlclNpemU7Ci0gICAgICAgICpidWZmZXJfb3V0ID0gb3V0QnVmZmVyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFJlc2FtcGxpbmcgbm90IHJlcXVpcmVkLiBSZWFkIGFuZCBwYXNzLXRocm91Z2guCi0gICAgICAgIE1lZGlhQnVmZmVyICphQnVmZmVyOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZhQnVmZmVyLCBvcHRpb25zKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1YoInJlYWQgcmV0dXJucyBlcnIgPSAlZCIsIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKLSAgICAgICAgICAgIGNoZWNrQW5kU2V0UmVzYW1wbGVyKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZChidWZmZXJfb3V0LCBOVUxMKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVPUyBvciBzb21lIG90aGVyIGVycm9yCi0gICAgICAgIGlmKGVyciAhPSBPSykgewotICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgKmJ1ZmZlcl9vdXQgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAqYnVmZmVyX291dCA9IGFCdWZmZXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclNSQzo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIsIGludDY0X3QgcHRzKSB7Ci0gICAgQUxPR1YoImdldE5leHRCdWZmZXIgJWQsIGNoYW4gPSAlZCIsIHBCdWZmZXItPmZyYW1lQ291bnQsIG1DaGFubmVsQ250KTsKLSAgICB1aW50MzJfdCBkb25lID0gMDsKLSAgICB1aW50MzJfdCB3YW50ID0gcEJ1ZmZlci0+ZnJhbWVDb3VudCAqIG1DaGFubmVsQ250ICogMjsKLSAgICBwQnVmZmVyLT5yYXcgPSBtYWxsb2Mod2FudCk7Ci0KLSAgICB3aGlsZSAobVN0YXJ0ZWQgJiYgd2FudCA+IDApIHsKLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSBsZWZ0LCByZWFkIGEgbmV3IGJ1ZmZlci4KLSAgICAgICAgaWYgKCFtQnVmZmVyKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBzZWVrLCByZXNldCB0aGUgaW5pdGlhbCB0aW1lIHN0YW1wIGFuZCBhY2N1bXVsYXRlZCB0aW1lCi0gICAgICAgICAgICBSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgICAgICAgICAgaWYgKG1TZWVrVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXAgY2FjaGVNb3JlX2wgU2VlayByZXF1ZXN0ZWQgPSAlbGxkIiwgdGhpcywgbVNlZWtUaW1lVXMpOwotICAgICAgICAgICAgICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlID0gbVNlZWtNb2RlOwotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzLCBtb2RlKTsKLSAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IC0xOwotICAgICAgICAgICAgICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSAtMTsKLSAgICAgICAgICAgICAgICBtQWNjdU91dEJ1ZmZlclNpemUgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBCdWZmZXItPnJhdyk7Ci0gICAgICAgICAgICAgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImdldE5leHRCdWZmZXI6IHNvdXJjZSByZWFkIHJldHVybmVkIElORk9fRk9STUFUX0NIQU5HRUQiKTsKLSAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGNhbm5vdCBzd2l0Y2ggdG8gYSBuZXcgQXVkaW9SZXNhbXBsZXIgYmVjYXVzZQotICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBpbiBhIGNhbGxiYWNrIGNhbGxlZCBieSB0aGUgQXVkaW9SZXNhbXBsZXIgaXRzZWxmLiBTbwotICAgICAgICAgICAgICAgIC8vIGp1c3QgcmVtZW1iZXIgdGhlIGZhY3QgdGhhdCB0aGUgZm9ybWF0IGhhcyBjaGFuZ2VkLCBhbmQgbGV0Ci0gICAgICAgICAgICAgICAgLy8gcmVhZCgpIGhhbmRsZXMgdGhpcy4KLSAgICAgICAgICAgICAgICBtRm9ybWF0Q2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRU9TIG9yIHNvbWUgb3RoZXIgZXJyb3IKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiRU9TIG9yIHNvbWUgZXJyOiAlZCIsIGVycik7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2Fubm90IGNhbGwgc3RvcCgpIGhlcmUgYmVjYXVzZSBzdG9wKCkgd2lsbCByZWxlYXNlIHRoZQotICAgICAgICAgICAgICAgIC8vIEF1ZGlvUmVzYW1wbGVyLCBhbmQgd2UgYXJlIGluIGEgY2FsbGJhY2sgb2YgdGhlIEF1ZGlvUmVzYW1wbGVyLgotICAgICAgICAgICAgICAgIC8vIFNvIGp1c3QgcmVtZW1iZXIgdGhlIGZhY3QgYW5kIGxldCByZWFkKCkgY2FsbCBzdG9wKCkuCi0gICAgICAgICAgICAgICAgbVN0b3BQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyKTsKLSAgICAgICAgICAgIG1MZWZ0b3ZlciA9IG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICAgICAgaWYgKG1Jbml0aWFsVGltZVN0YW1wVXMgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGN1clRTOwotICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmcm9tID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgICAgICAgICAgICAgZnJvbS0+ZmluZEludDY0KGtLZXlUaW1lLCAmY3VyVFMpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXR0aW5nIG1Jbml0aWFsVGltZVN0YW1wVXMgdG8gJWxsZCIsIG1Jbml0aWFsVGltZVN0YW1wVXMpOwotICAgICAgICAgICAgICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSBjdXJUUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyBjb3B5IGRhdGEgdG8gdGhlIGRlc3RpbmF0aW9uCi0gICAgICAgIHVpbnQzMl90IHRvZG8gPSBtTGVmdG92ZXI7Ci0gICAgICAgIGlmICh0b2RvID4gd2FudCkgewotICAgICAgICAgICAgdG9kbyA9IHdhbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50OF90KiBlbmQgPSAodWludDhfdCopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkKLSAgICAgICAgICAgICAgICArIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBtZW1jcHkoKHVpbnQ4X3QqKXBCdWZmZXItPnJhdyArIGRvbmUsIGVuZCAtIG1MZWZ0b3ZlciwgdG9kbyk7Ci0gICAgICAgIGRvbmUgKz0gdG9kbzsKLSAgICAgICAgd2FudCAtPSB0b2RvOwotICAgICAgICBtTGVmdG92ZXIgLT0gdG9kbzsKLQotICAgICAgICAvLyBSZWxlYXNlIE1lZGlhQnVmZmVyIGFzIHNvb24gYXMgcG9zc2libGUuCi0gICAgICAgIGlmIChtTGVmdG92ZXIgPT0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gZG9uZSAvIChtQ2hhbm5lbENudCAqIDIpOwotICAgIEFMT0dWKCJnZXROZXh0QnVmZmVyIGRvbmUgJWQiLCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotdm9pZCBWaWRlb0VkaXRvclNSQzo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIpIHsKLSAgICBBTE9HVigicmVsZWFzZUJ1ZmZlcjogJXAiLCBwQnVmZmVycyk7Ci0gICAgZnJlZShwQnVmZmVyLT5yYXcpOwotICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7Ci0gICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JTUkM6OmNoZWNrQW5kU2V0UmVzYW1wbGVyKCkgewotICAgIEFMT0dWKCJjaGVja0FuZFNldFJlc2FtcGxlciIpOwotCi0gICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGtVbml0eUdhaW4gPSAweDEwMDA7Ci0gICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0gICAgQ0hFQ0soIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSk7Ci0KLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKSk7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1DaGFubmVsQ250KSk7Ci0KLSAgICAvLyBJZiBhIHJlc2FtcGxlciBleGlzdHMsIGRlbGV0ZSBpdCBmaXJzdAotICAgIGlmIChtUmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1SZXNhbXBsZXI7Ci0gICAgICAgIG1SZXNhbXBsZXIgPSBOVUxMOwotICAgIH0KLQotICAgIC8vIENsZWFyIHByZXZpb3VzIGJ1ZmZlcgotICAgIGlmIChtQnVmZmVyKSB7Ci0gICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1TYW1wbGVSYXRlICE9IG1PdXRwdXRTYW1wbGVSYXRlIHx8IG1DaGFubmVsQ250ICE9IDIpIHsKLSAgICAgICAgQUxPR1YoIlJlc2FtcGxpbmcgcmVxdWlyZWQgKCVkID0+ICVkIEh6LCAjIGNoYW5uZWxzID0gJWQpIiwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtT3V0cHV0U2FtcGxlUmF0ZSwgbUNoYW5uZWxDbnQpOwotCi0gICAgICAgIG1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgMTYgLyogYml0IGRlcHRoICovLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U2FtcGxlUmF0ZSk7Ci0gICAgICAgIENIRUNLKG1SZXNhbXBsZXIpOwotICAgICAgICBtUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKG1TYW1wbGVSYXRlKTsKLSAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKGtVbml0eUdhaW4sIGtVbml0eUdhaW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJSZXNhbXBsaW5nIG5vdCByZXF1aXJlZCAoJWQgPT4gJWQgSHosICMgY2hhbm5lbHMgPSAlZCkiLAotICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1PdXRwdXRTYW1wbGVSYXRlLCBtQ2hhbm5lbENudCk7Ci0gICAgfQotfQotCi19IC8vbmFtZXNwY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNzA3ZDRkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KLSNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKLQotY2xhc3MgVmlkZW9FZGl0b3JTUkMgOiBwdWJsaWMgTWVkaWFTb3VyY2UgLCBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7Ci0KLXB1YmxpYzoKLSAgICBWaWRlb0VkaXRvclNSQyhjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0IChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkICgKLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKTsKLQotICAgIC8vIFNhbXBsaW5nIGZyZXFlbmNpZXMKLSAgICBlbnVtIHsKLSAgICAgICAga0ZyZXE4MDAwSHogID0gODAwMCwKLSAgICAgICAga0ZyZXExMTAyNUh6ID0gMTEwMjUsCi0gICAgICAgIGtGcmVxMTIwMDBIeiA9IDEyMDAwLAotICAgICAgICBrRnJlcTE2MDAwSHogPSAxNjAwMCwKLSAgICAgICAga0ZyZXEyMjA1MEh6ID0gMjIwNTAsCi0gICAgICAgIGtGcmVxMjQwMDBIeiA9IDI0MDAwLAotICAgICAgICBrRnJlcTMyMDAwSHogPSAzMjAwMCwKLSAgICAgICAga0ZyZXE0NDEwMEh6ID0gNDQxMDAsCi0gICAgICAgIGtGcmVxNDgwMDBIeiA9IDQ4MDAwLAotICAgIH07Ci0KLXByb3RlY3RlZCA6Ci0gICAgdmlydHVhbCB+VmlkZW9FZGl0b3JTUkMoKTsKLQotcHJpdmF0ZToKLSAgICBBdWRpb1Jlc2FtcGxlciAqbVJlc2FtcGxlcjsKLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBpbnQgbUNoYW5uZWxDbnQ7Ci0gICAgaW50IG1TYW1wbGVSYXRlOwotICAgIGludDMyX3QgbU91dHB1dFNhbXBsZVJhdGU7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLSAgICBzcDxNZXRhRGF0YT4gbU91dHB1dEZvcm1hdDsKLQotICAgIE1lZGlhQnVmZmVyKiBtQnVmZmVyOwotICAgIGludDMyX3QgbUxlZnRvdmVyOwotICAgIGJvb2wgbUZvcm1hdENoYW5nZWQ7Ci0gICAgYm9vbCBtU3RvcFBlbmRpbmc7Ci0KLSAgICBpbnQ2NF90IG1Jbml0aWFsVGltZVN0YW1wVXM7Ci0gICAgaW50NjRfdCBtQWNjdU91dEJ1ZmZlclNpemU7Ci0KLSAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtU2Vla01vZGU7Ci0KLSAgICBWaWRlb0VkaXRvclNSQygpOwotICAgIHZvaWQgY2hlY2tBbmRTZXRSZXNhbXBsZXIoKTsKLQotICAgIC8vIERvbid0IGNhbGwgbWUKLSAgICBWaWRlb0VkaXRvclNSQyhjb25zdCBWaWRlb0VkaXRvclNSQyYpOwotICAgIFZpZGVvRWRpdG9yU1JDICZvcGVyYXRvcj0oY29uc3QgVmlkZW9FZGl0b3JTUkMgJik7Ci0KLX07Ci0KLX0gLy9uYW1lc3BjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JUb29scy5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjlmZDYwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JUb29scy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotI2luY2x1ZGUgIlByZXZpZXdSZW5kZXJlci5oIgotLyorIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotLyotIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotCi1jb25zdCBNNFZJRklfVUludDggICBNNFZJRklfQ2xpcFRhYmxlWzEyNTZdCi09IHsKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywKLTB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsCi0weDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLAotMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwKLTB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsCi0weDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDJiLAotMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywKLTB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsCi0weDNjLCAweDNkLCAweDNlLCAweDNmLCAweDQwLCAweDQxLCAweDQyLCAweDQzLAotMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwKLTB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsCi0weDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDViLAotMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywKLTB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsCi0weDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLCAweDcxLCAweDcyLCAweDczLAotMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwKLTB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsCi0weDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDhiLAotMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywKLTB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsCi0weDljLCAweDlkLCAweDllLCAweDlmLCAweGEwLCAweGExLCAweGEyLCAweGEzLAotMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwKLTB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsCi0weGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGJiLAotMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywKLTB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsCi0weGNjLCAweGNkLCAweGNlLCAweGNmLCAweGQwLCAweGQxLCAweGQyLCAweGQzLAotMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwKLTB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIDB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsCi0weGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGViLAotMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywKLTB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsCi0weGZjLCAweGZkLCAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKLX07Ci0KLS8qIERpdmlzaW9uIHRhYmxlIGZvciAoIDY1NTM1L3ggKTsgeCA9IDAgdG8gNTEyICovCi1jb25zdCBNNFZJRklfVUludDE2ICBNNFZJRklfRGl2VGFibGVbNTEyXQotPSB7Ci0wLCA2NTUzNSwgMzI3NjgsIDIxODQ1LCAxNjM4NCwgMTMxMDcsIDEwOTIyLCA5MzYyLAotODE5MiwgNzI4MSwgNjU1MywgNTk1NywgNTQ2MSwgNTA0MSwgNDY4MSwgNDM2OSwKLTQwOTYsIDM4NTUsIDM2NDAsIDM0NDksIDMyNzYsIDMxMjAsIDI5NzgsIDI4NDksCi0yNzMwLCAyNjIxLCAyNTIwLCAyNDI3LCAyMzQwLCAyMjU5LCAyMTg0LCAyMTE0LAotMjA0OCwgMTk4NSwgMTkyNywgMTg3MiwgMTgyMCwgMTc3MSwgMTcyNCwgMTY4MCwKLTE2MzgsIDE1OTgsIDE1NjAsIDE1MjQsIDE0ODksIDE0NTYsIDE0MjQsIDEzOTQsCi0xMzY1LCAxMzM3LCAxMzEwLCAxMjg1LCAxMjYwLCAxMjM2LCAxMjEzLCAxMTkxLAotMTE3MCwgMTE0OSwgMTEyOSwgMTExMCwgMTA5MiwgMTA3NCwgMTA1NywgMTA0MCwKLTEwMjQsIDEwMDgsIDk5MiwgOTc4LCA5NjMsIDk0OSwgOTM2LCA5MjMsCi05MTAsIDg5NywgODg1LCA4NzMsIDg2MiwgODUxLCA4NDAsIDgyOSwKLTgxOSwgODA5LCA3OTksIDc4OSwgNzgwLCA3NzEsIDc2MiwgNzUzLAotNzQ0LCA3MzYsIDcyOCwgNzIwLCA3MTIsIDcwNCwgNjk3LCA2ODksCi02ODIsIDY3NSwgNjY4LCA2NjEsIDY1NSwgNjQ4LCA2NDIsIDYzNiwKLTYzMCwgNjI0LCA2MTgsIDYxMiwgNjA2LCA2MDEsIDU5NSwgNTkwLAotNTg1LCA1NzksIDU3NCwgNTY5LCA1NjQsIDU2MCwgNTU1LCA1NTAsCi01NDYsIDU0MSwgNTM3LCA1MzIsIDUyOCwgNTI0LCA1MjAsIDUxNiwKLTUxMiwgNTA4LCA1MDQsIDUwMCwgNDk2LCA0OTIsIDQ4OSwgNDg1LAotNDgxLCA0NzgsIDQ3NCwgNDcxLCA0NjgsIDQ2NCwgNDYxLCA0NTgsCi00NTUsIDQ1MSwgNDQ4LCA0NDUsIDQ0MiwgNDM5LCA0MzYsIDQzNCwKLTQzMSwgNDI4LCA0MjUsIDQyMiwgNDIwLCA0MTcsIDQxNCwgNDEyLAotNDA5LCA0MDcsIDQwNCwgNDAyLCAzOTksIDM5NywgMzk0LCAzOTIsCi0zOTAsIDM4NywgMzg1LCAzODMsIDM4MSwgMzc4LCAzNzYsIDM3NCwKLTM3MiwgMzcwLCAzNjgsIDM2NiwgMzY0LCAzNjIsIDM2MCwgMzU4LAotMzU2LCAzNTQsIDM1MiwgMzUwLCAzNDgsIDM0NiwgMzQ0LCAzNDMsCi0zNDEsIDMzOSwgMzM3LCAzMzYsIDMzNCwgMzMyLCAzMzAsIDMyOSwKLTMyNywgMzI2LCAzMjQsIDMyMiwgMzIxLCAzMTksIDMxOCwgMzE2LAotMzE1LCAzMTMsIDMxMiwgMzEwLCAzMDksIDMwNywgMzA2LCAzMDQsCi0zMDMsIDMwMiwgMzAwLCAyOTksIDI5NywgMjk2LCAyOTUsIDI5MywKLTI5MiwgMjkxLCAyODksIDI4OCwgMjg3LCAyODYsIDI4NCwgMjgzLAotMjgyLCAyODEsIDI4MCwgMjc4LCAyNzcsIDI3NiwgMjc1LCAyNzQsCi0yNzMsIDI3MSwgMjcwLCAyNjksIDI2OCwgMjY3LCAyNjYsIDI2NSwKLTI2NCwgMjYzLCAyNjIsIDI2MSwgMjYwLCAyNTksIDI1OCwgMjU3LAotMjU2LCAyNTUsIDI1NCwgMjUzLCAyNTIsIDI1MSwgMjUwLCAyNDksCi0yNDgsIDI0NywgMjQ2LCAyNDUsIDI0NCwgMjQzLCAyNDIsIDI0MSwKLTI0MCwgMjQwLCAyMzksIDIzOCwgMjM3LCAyMzYsIDIzNSwgMjM0LAotMjM0LCAyMzMsIDIzMiwgMjMxLCAyMzAsIDIyOSwgMjI5LCAyMjgsCi0yMjcsIDIyNiwgMjI1LCAyMjUsIDIyNCwgMjIzLCAyMjIsIDIyMiwKLTIyMSwgMjIwLCAyMTksIDIxOSwgMjE4LCAyMTcsIDIxNywgMjE2LAotMjE1LCAyMTQsIDIxNCwgMjEzLCAyMTIsIDIxMiwgMjExLCAyMTAsCi0yMTAsIDIwOSwgMjA4LCAyMDgsIDIwNywgMjA2LCAyMDYsIDIwNSwKLTIwNCwgMjA0LCAyMDMsIDIwMiwgMjAyLCAyMDEsIDIwMSwgMjAwLAotMTk5LCAxOTksIDE5OCwgMTk3LCAxOTcsIDE5NiwgMTk2LCAxOTUsCi0xOTUsIDE5NCwgMTkzLCAxOTMsIDE5MiwgMTkyLCAxOTEsIDE5MSwKLTE5MCwgMTg5LCAxODksIDE4OCwgMTg4LCAxODcsIDE4NywgMTg2LAotMTg2LCAxODUsIDE4NSwgMTg0LCAxODQsIDE4MywgMTgzLCAxODIsCi0xODIsIDE4MSwgMTgxLCAxODAsIDE4MCwgMTc5LCAxNzksIDE3OCwKLTE3OCwgMTc3LCAxNzcsIDE3NiwgMTc2LCAxNzUsIDE3NSwgMTc0LAotMTc0LCAxNzMsIDE3MywgMTcyLCAxNzIsIDE3MiwgMTcxLCAxNzEsCi0xNzAsIDE3MCwgMTY5LCAxNjksIDE2OCwgMTY4LCAxNjgsIDE2NywKLTE2NywgMTY2LCAxNjYsIDE2NSwgMTY1LCAxNjUsIDE2NCwgMTY0LAotMTYzLCAxNjMsIDE2MywgMTYyLCAxNjIsIDE2MSwgMTYxLCAxNjEsCi0xNjAsIDE2MCwgMTU5LCAxNTksIDE1OSwgMTU4LCAxNTgsIDE1NywKLTE1NywgMTU3LCAxNTYsIDE1NiwgMTU2LCAxNTUsIDE1NSwgMTU0LAotMTU0LCAxNTQsIDE1MywgMTUzLCAxNTMsIDE1MiwgMTUyLCAxNTIsCi0xNTEsIDE1MSwgMTUxLCAxNTAsIDE1MCwgMTQ5LCAxNDksIDE0OSwKLTE0OCwgMTQ4LCAxNDgsIDE0NywgMTQ3LCAxNDcsIDE0NiwgMTQ2LAotMTQ2LCAxNDUsIDE0NSwgMTQ1LCAxNDQsIDE0NCwgMTQ0LCAxNDQsCi0xNDMsIDE0MywgMTQzLCAxNDIsIDE0MiwgMTQyLCAxNDEsIDE0MSwKLTE0MSwgMTQwLCAxNDAsIDE0MCwgMTQwLCAxMzksIDEzOSwgMTM5LAotMTM4LCAxMzgsIDEzOCwgMTM3LCAxMzcsIDEzNywgMTM3LCAxMzYsCi0xMzYsIDEzNiwgMTM1LCAxMzUsIDEzNSwgMTM1LCAxMzQsIDEzNCwKLTEzNCwgMTM0LCAxMzMsIDEzMywgMTMzLCAxMzIsIDEzMiwgMTMyLAotMTMyLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMCwgMTMwLCAxMzAsCi0xMzAsIDEyOSwgMTI5LCAxMjksIDEyOSwgMTI4LCAxMjgsIDEyOAotfTsKLQotY29uc3QgTTRWSUZJX0ludDMyICBjb25zdF9zdG9yYWdlMVs4XQotPSB7Ci0weDAwMDAyNTY4LCAweDAwMDAzMzQzLDB4MDAwMDA2NDksMHgwMDAwMGQwZiwgMHgwMDAwRDg2QywgMHgwMDAwRDgzQiwgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMAotfTsKLQotY29uc3QgTTRWSUZJX0ludDMyICBjb25zdF9zdG9yYWdlWzhdCi09IHsKLTB4MDAwMDI1NjgsIDB4MDAwMDMzNDMsIDB4MUJGODAwLCAweDAwMDAwNjQ5LCAweDAwMDAwZDBmLCAweDExMDE4MCwgMHg0MGNmLCAweDIyQkUwMAotfTsKLQotCi1jb25zdCBNNFZJRklfVUludDE2ICAqTTRWSUZJX0RpdlRhYmxlX3plcm8KLSA9ICZNNFZJRklfRGl2VGFibGVbMF07Ci0KLWNvbnN0IE00VklGSV9VSW50OCAgICpNNFZJRklfQ2xpcFRhYmxlX3plcm8KLSA9ICZNNFZJRklfQ2xpcFRhYmxlWzUwMF07Ci0KLU00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFyVG9ZVVY0MjBTZW1pcGxhbmFyKHZvaWQgKnVzZXJfZGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICkgewotCi0gICAgTTRWSUZJX1VJbnQzMiBpOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdCwgKnBfYnVmX3NyY191LCAqcF9idWZfc3JjX3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgIHJldHVybl9jb2RlID0gTTRWSUZJX09LOwotCi0gICAgLyogdGhlIGZpbHRlciBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHdpZHRoIGlzIGVxdWFsIHRvIHN0cmlkZSAqLwotICAgIGlmKFBsYW5lSW5bMF0udV93aWR0aCAhPSBQbGFuZUluWzBdLnVfc3RyaWRlKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lOVkFMSURfUEFSQU07Ci0KLSAgICAvKiBUaGUgaW5wdXQgWSBQbGFuZSBpcyB0aGUgc2FtZSBhcyB0aGUgb3V0cHV0IFkgUGxhbmUgKi8KLSAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bMF0ucGFjX2RhdGFbUGxhbmVJblswXS51X3RvcGxlZnRdKTsKLSAgICBwX2J1Zl9kZXN0ID0gJihQbGFuZU91dFswXS5wYWNfZGF0YVtQbGFuZU91dFswXS51X3RvcGxlZnRdKTsKLSAgICBtZW1jcHkoKHZvaWQgKilwX2J1Zl9kZXN0LCh2b2lkICopcF9idWZfc3JjICwKLSAgICAgICAgUGxhbmVPdXRbMF0udV93aWR0aCAqIFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLQotICAgIC8qIFRoZSBVIGFuZCBWIGNvbXBvbmVudHMgYXJlIHBsYW5hci4gVGhlIG5lZWQgdG8gYmUgbWFkZSBpbnRlcmxlYXZlZCAqLwotICAgIHBfYnVmX3NyY191ID0gJihQbGFuZUluWzFdLnBhY19kYXRhW1BsYW5lSW5bMV0udV90b3BsZWZ0XSk7Ci0gICAgcF9idWZfc3JjX3YgPSAmKFBsYW5lSW5bMl0ucGFjX2RhdGFbUGxhbmVJblsyXS51X3RvcGxlZnRdKTsKLSAgICBwX2J1Zl9kZXN0ICA9ICYoUGxhbmVPdXRbMV0ucGFjX2RhdGFbUGxhbmVPdXRbMV0udV90b3BsZWZ0XSk7Ci0KLSAgICBmb3IoaSA9IDA7IGkgPCBQbGFuZU91dFsxXS51X3dpZHRoKlBsYW5lT3V0WzFdLnVfaGVpZ2h0OyBpKyspCi0gICAgewotICAgICAgICAqcF9idWZfZGVzdCsrID0gKnBfYnVmX3NyY191Kys7Ci0gICAgICAgICpwX2J1Zl9kZXN0KysgPSAqcF9idWZfc3JjX3YrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHJldHVybl9jb2RlOwotfQotCi1NNFZJRklfVUludDggTTRWSUZJX1NlbWlwbGFuYXJZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApIHsKLQotICAgICBNNFZJRklfVUludDMyIGk7Ci0gICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdCwgKnBfYnVmX3NyY191LCAqcF9idWZfc3JjX3Y7Ci0gICAgIE00VklGSV9VSW50OCAqcF9idWZfZGVzdF91LCpwX2J1Zl9kZXN0X3YsKnBfYnVmX3NyY191djsKLSAgICAgTTRWSUZJX1VJbnQ4ICAgICByZXR1cm5fY29kZSA9IE00VklGSV9PSzsKLQotICAgICAvKiB0aGUgZmlsdGVyIGlzIGltcGxlbWVudGVkIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgd2lkdGggaXMgZXF1YWwgdG8gc3RyaWRlICovCi0gICAgIGlmKFBsYW5lSW5bMF0udV93aWR0aCAhPSBQbGFuZUluWzBdLnVfc3RyaWRlKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lOVkFMSURfUEFSQU07Ci0KLSAgICAgLyogVGhlIGlucHV0IFkgUGxhbmUgaXMgdGhlIHNhbWUgYXMgdGhlIG91dHB1dCBZIFBsYW5lICovCi0gICAgIHBfYnVmX3NyYyA9ICYoUGxhbmVJblswXS5wYWNfZGF0YVtQbGFuZUluWzBdLnVfdG9wbGVmdF0pOwotICAgICBwX2J1Zl9kZXN0ID0gJihQbGFuZU91dFswXS5wYWNfZGF0YVtQbGFuZU91dFswXS51X3RvcGxlZnRdKTsKLSAgICAgbWVtY3B5KCh2b2lkICopcF9idWZfZGVzdCwodm9pZCAqKXBfYnVmX3NyYyAsCi0gICAgICAgICBQbGFuZU91dFswXS51X3dpZHRoICogUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotCi0gICAgIC8qIFRoZSBVIGFuZCBWIGNvbXBvbmVudHMgYXJlIHBsYW5hci4gVGhlIG5lZWQgdG8gYmUgbWFkZSBpbnRlcmxlYXZlZCAqLwotICAgICBwX2J1Zl9zcmNfdXYgPSAmKFBsYW5lSW5bMV0ucGFjX2RhdGFbUGxhbmVJblsxXS51X3RvcGxlZnRdKTsKLSAgICAgcF9idWZfZGVzdF91ICA9ICYoUGxhbmVPdXRbMV0ucGFjX2RhdGFbUGxhbmVPdXRbMV0udV90b3BsZWZ0XSk7Ci0gICAgIHBfYnVmX2Rlc3RfdiAgPSAmKFBsYW5lT3V0WzJdLnBhY19kYXRhW1BsYW5lT3V0WzJdLnVfdG9wbGVmdF0pOwotCi0gICAgIGZvcihpID0gMDsgaSA8IFBsYW5lT3V0WzFdLnVfd2lkdGgqUGxhbmVPdXRbMV0udV9oZWlnaHQ7IGkrKykKLSAgICAgewotICAgICAgICAqcF9idWZfZGVzdF91KysgPSAqcF9idWZfc3JjX3V2Kys7Ci0gICAgICAgICpwX2J1Zl9kZXN0X3YrKyA9ICpwX2J1Zl9zcmNfdXYrKzsKLSAgICAgfQotICAgICByZXR1cm4gcmV0dXJuX2NvZGU7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgIFBsYW5lSW4gICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgTTRWSUZJX09LOiAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpIHsKLQotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpLGo7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDb250ZXh0ID0gKE00eFZTU19Db2xvclN0cnVjdCopcEZ1bmN0aW9uQ29udGV4dDsKLQotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwX2J1Zl9zcmMgPQotICAgICAgICAgJihQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotCi0gICAgICAgIHBfYnVmX2Rlc3QgPQotICAgICAgICAgJihQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW1BsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2hyb21pbmFuY2UgKi8KLSAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSB8fCBwbGFuZV9udW1iZXI9PTIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9zd2l0Y2ggKChNNE9TQV9VSW50MzIpcEZ1bmN0aW9uQ29udGV4dCkgLy8gY29tbWVudGVkIGJlY2F1c2UgYSBzdHJ1Y3R1cmUgZm9yIHRoZSBlZmZlY3RzIGNvbnRleHQgZXhpc3QKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKENvbG9yQ29udGV4dC0+Y29sb3JFZmZlY3RUeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU6Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTI4LAotICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms6Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMjU1LAotICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuOgotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDAsCi0gICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWE6Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwxMTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwxMzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBnZXQgdGhlIHIsIGcsIGIqLwotICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDAxZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweGY4MDApPj4xMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyprZWVwIHksIGJ1dCByZXBsYWNlIHUgYW5kIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBVMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBnZXQgdGhlIHIsIGcsIGIqLwotICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDAxZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweGY4MDApPj4xMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypmb3IgY29sb3IgZ3JhZGF0aW9uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoTTRPU0FfVUludDE2KSggYiAtICgoYippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAoTTRPU0FfVUludDE2KShnIC0gKChnKmkpL1BsYW5lSW5bcGxhbmVfbnVtYmVyXS51X2hlaWdodCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgciA9IChNNE9TQV9VSW50MTYpKHIgLSAoKHIqaSkvUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gVTE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gVjE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWSUZJX0lOVkFMSURfUEFSQU07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBMdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KS8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0W2pdID0gMjU1IC0gcF9idWZfc3JjW2pdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9idWZfc3JjICs9IFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0gUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBmaXhlZCBvciBhbmltYXRlZCBpbWFnZSBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgIFBsYW5lSW4gICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgTTRWSUZJX09LOiAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nKAotICAgICAgICAgICAgTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkgewotCi0gICAgTTRWSUZJX1VJbnQzMiB4LHk7Ci0KLSAgICBNNFZJRklfVUludDggKnBfaW5fWSA9IFBsYW5lSW5bMF0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luX1UgPSBQbGFuZUluWzFdLnBhY19kYXRhOwotICAgIE00VklGSV9VSW50OCAqcF9pbl9WID0gUGxhbmVJblsyXS5wYWNfZGF0YTsKLQotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBGcmFtaW5nID0gTTRPU0FfTlVMTDsKLSAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogY3VycmVudEZyYW1pbmcgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9VSW50OCAqRnJhbWluZ1JHQiA9IE00T1NBX05VTEw7Ci0KLSAgICBNNFZJRklfVUludDggKnBfb3V0MDsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MTsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MjsKLQotICAgIE00VklGSV9VSW50MzIgdG9wbGVmdFsyXTsKLQotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MSA9Ci0gICAgIChNNE9TQV9VSW50OCkoKFRSQU5TUEFSRU5UX0NPTE9SICYgMHhGRjAwKT4+OCk7Ci0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQyID0gKE00T1NBX1VJbnQ4KVRSQU5TUEFSRU5UX0NPTE9SOwotCi0jaWZuZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgRnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKXVzZXJEYXRhOwotICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZy0+cEN1cnJlbnQ7Ci0gICAgRnJhbWluZ1JHQiA9IEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIEZyYW1pbmcgPQotICAgICAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hRnJhbWluZ0N0eDsKLSAgICBpZihGcmFtaW5nID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUYodXNlckRhdGEpOwotICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZzogXAotICAgICAgICAgICAgICAgIEVycm9yIGluIE00eFZTU19pbnRlcm5hbERlY29kZUdJRjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIEZyYW1pbmcgPQotICAgICAgICAgKE00eFZTU19GcmFtaW5nU3RydWN0ICopKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+YUZyYW1pbmdDdHg7Ci0gICAgICAgIC8qIEluaXRpYWxpemVzIGZpcnN0IEdJRiB0aW1lICovCi0gICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmN1cnJlbnRfZ2lmX3RpbWUgPQotICAgICAgICAgIHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLSAgICBjdXJyZW50RnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKUZyYW1pbmc7Ci0gICAgRnJhbWluZ1JHQiA9IEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBpbnB1dCAvIG91dHB1dCBwbGFuZSBwb2ludGVycyAqLwotICAgIHBfaW5fWSArPSBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwX2luX1UgKz0gUGxhbmVJblsxXS51X3RvcGxlZnQ7Ci0gICAgcF9pbl9WICs9IFBsYW5lSW5bMl0udV90b3BsZWZ0OwotCi0gICAgcF9vdXQwID0gUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcF9vdXQxID0gUGxhbmVPdXRbMV0ucGFjX2RhdGE7Ci0gICAgcF9vdXQyID0gUGxhbmVPdXRbMl0ucGFjX2RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBEZXBlbmRpbmcgb24gdGltZSwgaW5pdGlhbGl6ZSBGcmFtaW5nIGZyYW1lIHRvIHVzZSAqLwotICAgIGlmKEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPT0gLTEpCi0gICAgewotICAgICAgICBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgY2xpcCB0aW1lIGhhcyByZWFjaCB0aGUgZHVyYXRpb24gb2Ygb25lIGZyYW1lIG9mIHRoZSBmcmFtaW5nIHBpY3R1cmUKLSAgICAgKiB3ZSBuZWVkIHRvIHN0ZXAgdG8gbmV4dCBmcmFtaW5nIHBpY3R1cmUgKi8KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgIGlmKCgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmJfYW5pbWF0ZWQgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHdoaWxlKCgoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jdXJyZW50X2dpZl90aW1lICsgY3VycmVudEZyYW1pbmctPmR1cmF0aW9uKSA8IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jbGlwVGltZSA9Ci0gICAgICAgICAgICAgcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0KLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbERlY29kZUdJRih1c2VyRGF0YSk7Ci0gICAgICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nOiBFcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihjdXJyZW50RnJhbWluZy0+ZHVyYXRpb24gIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jdXJyZW50X2dpZl90aW1lICs9IGN1cnJlbnRGcmFtaW5nLT5kdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jdXJyZW50X2dpZl90aW1lICs9Ci0gICAgICAgICAgICAgICAgIHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lIC0gRnJhbWluZy0+cHJldmlvdXNDbGlwVGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZzsKLSAgICAgICAgICAgIEZyYW1pbmdSR0IgPSBGcmFtaW5nLT5GcmFtaW5nUmdiLT5wYWNfZGF0YTsKLSAgICAgICAgfQotICAgIH0KLSNlbHNlCi0gICAgICAgICAgICBGcmFtaW5nLT5wQ3VycmVudCA9IGN1cnJlbnRGcmFtaW5nLT5wTmV4dDsKLSAgICAgICAgICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0KilGcmFtaW5nLT5wQ3VycmVudDsKLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgIEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICBGcmFtaW5nUkdCID0gY3VycmVudEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotICAgIHRvcGxlZnRbMF0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF94OwotICAgIHRvcGxlZnRbMV0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF95OwotCi0gICAgZm9yKCB4PTAgO3ggPCBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgZm9yKCB5PTAgO3kgPCBQbGFuZUluWzBdLnVfd2lkdGggOyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVG8gaGFuZGxlIGZyYW1pbmcgd2l0aCBpbnB1dCBzaXplICE9IG91dHB1dCBzaXplCi0gICAgICAgICAgICAgKiBGcmFtaW5nIGlzIGFwcGx5ZWQgaWYgY29vcmRpbmF0ZXMgbWF0Y2hlcyBiZXR3ZWVuIGZyYW1pbmcvdG9wbGVmdCBhbmQgaW5wdXQgcGxhbmUgKi8KLSAgICAgICAgICAgIGlmKCB5IDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAgJiYKLSAgICAgICAgICAgICAgICB5ID49IHRvcGxlZnRbMF0gJiYKLSAgICAgICAgICAgICAgICB4IDwgKHRvcGxlZnRbMV0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X2hlaWdodCkgJiYKLSAgICAgICAgICAgICAgICB4ID49IHRvcGxlZnRbMV0pCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKkFscGhhIGJsZW5kaW5nIHN1cHBvcnQqLwotICAgICAgICAgICAgICAgIE00T1NBX0Zsb2F0IGFscGhhQmxlbmRpbmcgPSAxOwotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqIGFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqKSgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFscGhhQmxlbmRpbmdTdHJ1Y3Q7Ci0jZWxzZQotICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKiBhbHBoYUJsZW5kaW5nU3RydWN0ID0KLSAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKikoKE00eFZTU19GcmFtaW5nU3RydWN0Kil1c2VyRGF0YSktPmFscGhhQmxlbmRpbmdTdHJ1Y3Q7Ci0jZW5kaWYgLy8jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA8IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoKE00T1NBX0Zsb2F0KShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZSAtIGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQpKnBQcm9ncmVzcy0+dWlQcm9ncmVzcy8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nICs9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nIC89IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+PSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUqMTApICYmIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA8IDEwMDAgLSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lKjEwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IChNNE9TQV9GbG9hdCkoKE00T1NBX0Zsb2F0KWFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlLzEwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPj0gMTAwMCAtIChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUqMTApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nID0gKChNNE9TQV9GbG9hdCkoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCkpKigxMDAwIC0gcFByb2dyZXNzLT51aVByb2dyZXNzKS8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nICs9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyAvPSAxMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiovCi0KLSAgICAgICAgICAgICAgICBpZigoKihGcmFtaW5nUkdCKT09dHJhbnNwYXJlbnQxKSAmJiAoKihGcmFtaW5nUkdCKzEpPT10cmFuc3BhcmVudDIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KCoocF9pbl9ZK3kreCpQbGFuZUluWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0oKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0oKihwX2luX1YrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzJdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSgqKGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKyh5LXRvcGxlZnRbMF0pKyh4LXRvcGxlZnRbMV0pKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnVfc3RyaWRlKSkqYWxwaGFCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSkrPSgqKHBfaW5fWSt5K3gqUGxhbmVJblswXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9KCooY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGErKCh5LXRvcGxlZnRbMF0pPj4xKSsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlKSkqYWxwaGFCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQxKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpKz0oKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKSkqKDEtYWxwaGFCbGVuZGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0oKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpKygoeC10b3BsZWZ0WzFdKT4+MSkqY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMl0udV9zdHJpZGUpKSphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSkrPSgqKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpKSooMS1hbHBoYUJsZW5kaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIFBsYW5lSW5bMF0udV93aWR0aCA8ICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCkgJiYKLSAgICAgICAgICAgICAgICAgICAgeSA9PSBQbGFuZUluWzBdLnVfd2lkdGgtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSR0IgPSBGcmFtaW5nUkdCICsgMiAqICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCAtIFBsYW5lSW5bMF0udV93aWR0aCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcmFtaW5nUkdCID0gRnJhbWluZ1JHQiArIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBKdXN0IGNvcHkgaW5wdXQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luX1kreSt4KlBsYW5lSW5bMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0qKHBfaW5fVSsoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0qKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBpZihwUHJvZ3Jlc3MtPmJJc0xhc3QgPT0gTTRPU0FfVFJVRQotICAgICAgICAmJiAoTTRPU0FfQm9vbCkoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5iX0lzRmlsZUdpZiA9PSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGX0NsZWFuaW5nKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKTsKLSAgICB9Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gbWFrZSBhIHZpZGVvIGxvb2sgYXMgaWYgaXQgd2FzIHRha2VuIGluIHRoZSBmaWZ0aWVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgcFVzZXJEYXRhICAgICAgIChJTikgQ29udGV4dAotICogQHBhcmFtICAgcFBsYW5lSW4gICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgcFBsYW5lT3V0ICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6ICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBGaWZ0aWVzRGF0YSwgcFBsYW5lT3V0IG9yIHBQcm9ncmVzcyBhcmUgTlVMTCAoREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKAotICAgIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApCi17Ci0gICAgTTRWSUZJX1VJbnQzMiB4LCB5LCB4U2hpZnQ7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwSW5ZID0gcFBsYW5lSW5bMF0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwT3V0WSwgKnBJblliZWdpbjsKLSAgICBNNFZJRklfVUludDggKnBJbkNyLCogcE91dENyOwotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0KLSAgICAvKiBJbnRlcm5hbCBjb250ZXh0Ki8KLSAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCogcF9GaWZ0aWVzRGF0YSA9IChNNHhWU1NfRmlmdGllc1N0cnVjdCAqKXBVc2VyRGF0YTsKLQotICAgIC8qIEluaXRpYWxpemUgaW5wdXQgLyBvdXRwdXQgcGxhbmUgcG9pbnRlcnMgKi8KLSAgICBwSW5ZICs9IHBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwT3V0WSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwSW5ZYmVnaW4gID0gcEluWTsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSAqLwotICAgIGlmKHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPCAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfcmFuZEluaXQoKTsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIqKSYocF9GaWZ0aWVzRGF0YS0+c2hpZnRSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X2hlaWdodCkgPj4gNCk7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyKikmKHBfRmlmdGllc0RhdGEtPnN0cmlwZVJhbmRvbVZhbHVlKSwgKHBQbGFuZUluWzBdLnVfd2lkdGgpPDwgMik7Ci0gICAgICAgIHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICB9Ci0KLSAgICAvKiBDaG9vc2UgcmFuZG9tIHZhbHVlcyBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGR1cmF0aW9uIG9mIGEgcGFydGlhbCBlZmZlY3QgKi8KLSAgICBlbHNlIGlmKCAocFByb2dyZXNzLT51aU91dHB1dFRpbWUgLSBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lKSA+IHBfRmlmdGllc0RhdGEtPmZpZnRpZXNFZmZlY3REdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyKikmKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV9oZWlnaHQpID4+IDQpOwotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiopJihwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X3dpZHRoKTw8IDIpOwotICAgICAgICBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyogUHV0IGluIFNlcGlhIHRoZSBjaHJvbWluYW5jZSAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMTsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwSW5DciAgPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhICArIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0OwotICAgICAgICBwT3V0Q3IgPSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YSArIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdDsKLQotICAgICAgICBmb3IgKHggPSAwOyB4IDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKDEgPT0gcGxhbmVfbnVtYmVyKQotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRDciwgMTE3LHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7IC8qIFUgdmFsdWUgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDEzOSxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBWIHZhbHVlICovCi0KLSAgICAgICAgICAgIHBJbkNyICArPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcE91dENyICs9IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB0aGUgbmV3IHBpeGVscyB2YWx1ZXMgKi8KLSAgICBmb3IoIHggPSAwIDsgeCA8IHBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4ICpwX291dFl0bXAsICpwX2luWXRtcDsKLQotICAgICAgICAvKiBDb21wdXRlIHRoZSB4U2hpZnQgKHJhbmRvbSB2YWx1ZSkgKi8KLSAgICAgICAgaWYgKDAgPT0gKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgJSA1ICkpCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgKSAlIChwUGxhbmVJblswXS51X2hlaWdodCAtIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIChwUGxhbmVJblswXS51X2hlaWdodCAtIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpICkgJSAocFBsYW5lSW5bMF0udV9oZWlnaHQgLSAxKTsKLQotICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwb2ludGVycyAqLwotICAgICAgICBwX291dFl0bXAgPSBwT3V0WSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogeVNoaWZ0IG9mIDEgcGl4ZWwgKi8KLSAgICAgICAgcF9pbll0bXAgID0gcEluWWJlZ2luICsgKHhTaGlmdCAqIHBQbGFuZUluWzBdLnVfc3RyaWRlKTsgIC8qIEFwcGx5IHRoZSB4U2hpZnQgKi8KLQotICAgICAgICBmb3IoIHkgPSAwIDsgeSA8IHBQbGFuZUluWzBdLnVfd2lkdGggOyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNldCBZIHZhbHVlICovCi0gICAgICAgICAgICBpZiAoeFNoaWZ0ID4gKHBQbGFuZUluWzBdLnVfaGVpZ2h0IC0gNCkpCi0gICAgICAgICAgICAgICAgKnBfb3V0WXRtcCA9IDQwOyAgICAgICAgLyogQWRkIHNvbWUgaG9yaXpvbnRhbCBibGFjayBsaW5lcyBiZXR3ZWVuIHRoZSB0d28gcGFydHMgb2YgdGhlIGltYWdlICovCi0gICAgICAgICAgICBlbHNlIGlmICggeSA9PSBwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSkKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gOTA7ICAgICAgICAvKiBBZGQgYSByYW5kb20gdmVydGljYWwgbGluZSBmb3IgdGhlIGJ1bGsgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gKnBfaW5ZdG1wOwotCi0KLSAgICAgICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IHBpeGVsICovCi0gICAgICAgICAgICBwX291dFl0bXArKzsKLSAgICAgICAgICAgIHBfaW5ZdG1wKys7Ci0KLSAgICAgICAgICAgIC8qIFJlc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBmb3IgdGhlIGxhc3QgcGl4ZWwqLwotICAgICAgICAgICAgaWYgKHkgPT0gKHBQbGFuZUluWzBdLnVfd2lkdGggLSAyKSkKLSAgICAgICAgICAgICAgICBwX291dFl0bXAgPSBwT3V0WTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgcE91dFkgKz0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZShNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGx1bV9mYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQotewotICAgIHVuc2lnbmVkIHNob3J0ICpwX3NyYywgKnBfZGVzdCwgKnBfc3JjX2xpbmUsICpwX2Rlc3RfbGluZTsKLSAgICB1bnNpZ25lZCBjaGFyICpwX2NzcmMsICpwX2NkZXN0LCAqcF9jc3JjX2xpbmUsICpwX2NkZXN0X2xpbmU7Ci0gICAgdW5zaWduZWQgbG9uZyBwaXhfc3JjOwotICAgIHVuc2lnbmVkIGxvbmcgdV9vdXRweCwgdV9vdXRweDI7Ci0gICAgdW5zaWduZWQgbG9uZyB1X3dpZHRoLCB1X3N0cmlkZSwgdV9zdHJpZGVfb3V0LHVfaGVpZ2h0LCBwaXg7Ci0gICAgbG9uZyBpLCBqOwotCi0gICAgLyogY29weSBvciBmaWx0ZXIgY2hyb21hICovCi0gICAgdV93aWR0aCA9IHBsYW5lX2luWzFdLnVfd2lkdGg7Ci0gICAgdV9oZWlnaHQgPSBwbGFuZV9pblsxXS51X2hlaWdodDsKLSAgICB1X3N0cmlkZSA9IHBsYW5lX2luWzFdLnVfc3RyaWRlOwotICAgIHVfc3RyaWRlX291dCA9IHBsYW5lX291dFsxXS51X3N0cmlkZTsKLSAgICBwX2NkZXN0X2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzFdLnBhY19kYXRhW3BsYW5lX291dFsxXS51X3RvcGxlZnRdOwotICAgIHBfY3NyY19saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX2luWzFdLnBhY19kYXRhW3BsYW5lX2luWzFdLnVfdG9wbGVmdF07Ci0KLSAgICBpZiAobHVtX2ZhY3RvciA+IDI1NikKLSAgICB7Ci0gICAgICAgIHBfY2Rlc3QgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzJdLnBhY19kYXRhW3BsYW5lX291dFsyXS51X3RvcGxlZnRdOwotICAgICAgICBwX2NzcmMgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfaW5bMl0ucGFjX2RhdGFbcGxhbmVfaW5bMl0udV90b3BsZWZ0XTsKLSAgICAgICAgLyogY29weSBjaHJvbWEgKi8KLSAgICAgICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSB1X3dpZHRoOyBpICE9IDA7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2NkZXN0X2xpbmUsICh2b2lkICopcF9jc3JjX2xpbmUsIHVfd2lkdGgpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfY2Rlc3QsICh2b2lkICopcF9jc3JjLCB1X3dpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NkZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgICAgICAgICAgcF9jc3JjICs9IHVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGZpbHRlciBjaHJvbWEgKi8KLSAgICAgICAgcGl4ID0gKDEwMjQgLSBsdW1fZmFjdG9yKSA8PCA3OwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfY2Rlc3QgPSBwX2NkZXN0X2xpbmU7Ci0gICAgICAgICAgICBwX2NzcmMgPSBwX2NzcmNfbGluZTsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2NkZXN0KysgPSAoKHBpeCArICgqcF9jc3JjKysgJiAweEZGKSAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NzcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICAgICAgfQotICAgICAgICBwX2NkZXN0X2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzJdLnBhY19kYXRhW3BsYW5lX291dFsyXS51X3RvcGxlZnRdOwotICAgICAgICBwX2NzcmNfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9pblsyXS5wYWNfZGF0YVtwbGFuZV9pblsyXS51X3RvcGxlZnRdOwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfY2Rlc3QgPSBwX2NkZXN0X2xpbmU7Ci0gICAgICAgICAgICBwX2NzcmMgPSBwX2NzcmNfbGluZTsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2NkZXN0KysgPSAoKHBpeCArICgqcF9jc3JjICYgMHhGRikgKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2NkZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogYXBwbHkgbHVtYSBmYWN0b3IgKi8KLSAgICB1X3dpZHRoID0gcGxhbmVfaW5bMF0udV93aWR0aDsKLSAgICB1X2hlaWdodCA9IHBsYW5lX2luWzBdLnVfaGVpZ2h0OwotICAgIHVfc3RyaWRlID0gKHBsYW5lX2luWzBdLnVfc3RyaWRlID4+IDEpOwotICAgIHVfc3RyaWRlX291dCA9IChwbGFuZV9vdXRbMF0udV9zdHJpZGUgPj4gMSk7Ci0gICAgcF9kZXN0ID0gKHVuc2lnbmVkIHNob3J0ICopICZwbGFuZV9vdXRbMF0ucGFjX2RhdGFbcGxhbmVfb3V0WzBdLnVfdG9wbGVmdF07Ci0gICAgcF9zcmMgPSAodW5zaWduZWQgc2hvcnQgKikgJnBsYW5lX2luWzBdLnBhY19kYXRhW3BsYW5lX2luWzBdLnVfdG9wbGVmdF07Ci0gICAgcF9kZXN0X2xpbmUgPSBwX2Rlc3Q7Ci0gICAgcF9zcmNfbGluZSA9IHBfc3JjOwotCi0gICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgIHsKLSAgICAgICAgcF9kZXN0ID0gcF9kZXN0X2xpbmU7Ci0gICAgICAgIHBfc3JjID0gcF9zcmNfbGluZTsKLSAgICAgICAgZm9yIChpID0gKHVfd2lkdGggPj4gMSk7IGkgIT0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwaXhfc3JjID0gKHVuc2lnbmVkIGxvbmcpICpwX3NyYysrOwotICAgICAgICAgICAgcGl4ID0gcGl4X3NyYyAmIDB4RkY7Ci0gICAgICAgICAgICB1X291dHB4ID0gKChwaXggKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICBwaXggPSAoKHBpeF9zcmMgJiAweEZGMDApID4+IDgpOwotICAgICAgICAgICAgdV9vdXRweDIgPSAoKChwaXggKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk8PCA4KSA7Ci0gICAgICAgICAgICAqcF9kZXN0KysgPSAodW5zaWduZWQgc2hvcnQpICh1X291dHB4MiB8IHVfb3V0cHgpOwotICAgICAgICB9Ci0gICAgICAgIHBfZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgcF9zcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIFJHQjU2NSBwbGFuZSB0byBZVVY0MjAgcGxhbmFyCi0gKiBAbm90ZSAgICBJdCBpcyB1c2VkIG9ubHkgZm9yIGZyYW1pbmcgZWZmZWN0Ci0gKiAgICAgICAgICBJdCBhbGxvY2F0ZXMgb3V0cHV0IFlVViBwbGFuZXMKLSAqIEBwYXJhbSAgIGZyYW1pbmdDdHggIChJTikgVGhlIGZyYW1pbmcgc3RydWN0IGNvbnRhaW5pbmcgaW5wdXQgUkdCNTY1IHBsYW5lCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciopIkFsbG9jIGZvciB0aGUgQ29udmVydGlvbiBvdXRwdXQgWVVWIik7OwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVViIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSArIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5wdXQgUkdCIDU2NSB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZyBlZmZlY3QgKi8KLSAgICBlcnIgPSBNNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IGVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQiB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgfQotCi0gICAgZnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aWV3T2Zmc2V0Q2xpcFRpbWUgPSAtMTsKLQotICAgIC8qKgotICAgICAqIE9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGNoYWluZWQgbGlzdCAobm8gYW5pbWF0ZWQgaW1hZ2Ugd2l0aCBSR0IgYnVmZmVyLi4uKSAqLwotICAgIGZyYW1pbmdDdHgtPnBDdXJyZW50ID0gZnJhbWluZ0N0eDsKLSAgICBmcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHg7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCODg4dG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIFJHQjg4OCBwbGFuZSB0byBZVVY0MjAgcGxhbmFyCi0gKiBAbm90ZSAgICBJdCBpcyB1c2VkIG9ubHkgZm9yIGZyYW1pbmcgZWZmZWN0Ci0gKiAgICAgICAgICBJdCBhbGxvY2F0ZXMgb3V0cHV0IFlVViBwbGFuZXMKLSAqIEBwYXJhbSAgIGZyYW1pbmdDdHggIChJTikgVGhlIGZyYW1pbmcgc3RydWN0IGNvbnRhaW5pbmcgaW5wdXQgUkdCODg4IHBsYW5lCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQjg4OHRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciopIkFsbG9jIGZvciB0aGUgQ29udmVydGlvbiBvdXRwdXQgWVVWIik7OwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVViIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSArIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5wdXQgUkdCODg4IHRvIFlVViA0MjAgdG8gYmUgYWJsZSB0byBtZXJnZSBpdCB3aXRoIG91dHB1dCB2aWRlbyBpbiBmcmFtaW5nIGVmZmVjdCAqLwotICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IGVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQiB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgfQotCi0gICAgZnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aWV3T2Zmc2V0Q2xpcFRpbWUgPSAtMTsKLQotICAgIC8qKgotICAgICAqIE9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGNoYWluZWQgbGlzdCAobm8gYW5pbWF0ZWQgaW1hZ2Ugd2l0aCBSR0IgYnVmZmVyLi4uKSAqLwotICAgIGZyYW1pbmdDdHgtPnBDdXJyZW50ID0gZnJhbWluZ0N0eDsKLSAgICBmcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHg7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYXV0aG9yICBQYXRyaWNlIE1hcnRpbmV6IC8gUGhpbGlwcyBEaWdpdGFsIE5ldHdvcmtzIC0gTVA0TmV0Ci0gKiBAYnJpZWYgICB0cmFuc2Zvcm0gUkdCNTY1IGltYWdlIHRvIGEgWVVWNDIwIGltYWdlLgotICogQG5vdGUgICAgQ29udmVydCBSR0I1NjUgdG8gWVVWNDIwLAotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gKiAgICAgICAgICAgICAgICAgIEdldCA0IFJHQiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gKiAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gUkdCNTY1IFBsYW5lCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gIFlVVjQyMCBidWZmZXIgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9ZLCB1MzJfc3RyaWRlMl9ZLCB1MzJfc3RyaWRlX1UsIHUzMl9zdHJpZGVfVjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9yZ2IsIHUzMl9zdHJpZGVfMnJnYjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX2NvbCwgdTMyX3JvdzsKLQotICAgIE00VklGSV9JbnQzMiAgICBpMzJfcjAwLCBpMzJfcjAxLCBpMzJfcjEwLCBpMzJfcjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfZzAwLCBpMzJfZzAxLCBpMzJfZzEwLCBpMzJfZzExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfYjAwLCBpMzJfYjAxLCBpMzJfYjEwLCBpMzJfYjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfeTAwLCBpMzJfeTAxLCBpMzJfeTEwLCBpMzJfeTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdTAwLCBpMzJfdTAxLCBpMzJfdTEwLCBpMzJfdTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdjAwLCBpMzJfdjAxLCBpMzJfdjEwLCBpMzJfdjExOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3luLCAqcHU4X3lzLCAqcHU4X3UsICpwdThfdjsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95X2RhdGEsICpwdThfdV9kYXRhLCAqcHU4X3ZfZGF0YTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9yZ2JuX2RhdGEsICpwdThfcmdibjsKLSAgICBNNFZJRklfVUludDE2ICAgdTE2X3BpeDEsIHUxNl9waXgyLCB1MTZfcGl4MywgdTE2X3BpeDQ7Ci0gICAgTTRWSUZJX1VJbnQ4IGNvdW50X251bGw9MDsKLQotICAgIC8qIENoZWNrIHBsYW5lcyBoZWlnaHQgYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYoIChwUGxhbmVJbi0+dV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0PDwxKSkgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcGxhbmVzIHdpZHRoIGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfd2lkdGggIT0gcFBsYW5lT3V0WzBdLnVfd2lkdGgpICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgIHB1OF91X2RhdGEgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHB1OF92X2RhdGEgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF9yZ2JuX2RhdGEgICA9IHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgIHUzMl9oZWlnaHQgPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGVhY2ggb3V0cHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZID0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1kgPSB1MzJfc3RyaWRlX1kgPDwgMTsKLSAgICB1MzJfc3RyaWRlX1UgPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WID0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBpbnB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfcmdiID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMnJnYiA9IHUzMl9zdHJpZGVfcmdiIDw8IDE7Ci0KLQotICAgIC8qIExvb3Agb24gZWFjaCByb3cgb2YgdGhlIG91dHB1dCBpbWFnZSwgaW5wdXQgY29vcmRpbmF0ZXMgYXJlIGVzdGltYXRlZCBmcm9tIG91dHB1dCBvbmVzICovCi0gICAgLyogVHdvIFlVViByb3dzIGFyZSBjb21wdXRlZCBhdCBlYWNoIHBhc3MgKi8KLSAgICBmb3IgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0IDt1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0yKQotICAgIHsKLSAgICAgICAgLyogQ3VycmVudCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeW4gPSBwdThfeV9kYXRhOwotICAgICAgICAvKiBOZXh0IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95cyA9IHB1OF95biArIHUzMl9zdHJpZGVfWTsKLSAgICAgICAgLyogQ3VycmVudCBVIHBsYW5lIHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF91ID0gcHU4X3VfZGF0YTsKLSAgICAgICAgLyogQ3VycmVudCBWIHBsYW5lIHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF92ID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfcmdibiA9IHB1OF9yZ2JuX2RhdGE7Ci0KLSAgICAgICAgLyogTG9vcCBvbiBlYWNoIGNvbHVtbiBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aDsgdTMyX2NvbCAhPSAwIDsgdTMyX2NvbCAtPTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEdldCBmb3VyIFJHQiA1NjUgc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgKi8KLSAgICAgICAgICAgIHUxNl9waXgxID0gKiggKE00VklGSV9VSW50MTYgKikgcHU4X3JnYm4pOwotICAgICAgICAgICAgdTE2X3BpeDIgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyBDU1RfUkdCXzE2X1NJWkUpKTsKLSAgICAgICAgICAgIHUxNl9waXgzID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgdTMyX3N0cmlkZV9yZ2IpKTsKLSAgICAgICAgICAgIHUxNl9waXg0ID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgdTMyX3N0cmlkZV9yZ2IgKyBDU1RfUkdCXzE2X1NJWkUpKTsKLQotICAgICAgICAgICAgLyogVW5wYWNrIFJHQjU2NSB0byA4Yml0IFIsIEcsIEIgKi8KLSAgICAgICAgICAgIC8qICh4LHkpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHUxNl9waXgxKTsKLSAgICAgICAgICAgIC8qICh4KzEseSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IxMCxpMzJfZzEwLGkzMl9yMTAsdTE2X3BpeDIpOwotICAgICAgICAgICAgLyogKHgseSsxKSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSx1MTZfcGl4Myk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IxMSxpMzJfZzExLGkzMl9yMTEsdTE2X3BpeDQpOwotICAgICAgICAgICAgLyogSWYgUkdCIGlzIHRyYW5zcGFyZW50IGNvbG9yICgwLCA2MywgMCksIHdlIHRyYW5zZm9ybSBpdCB0byB3aGl0ZSAoMzEsNjMsMzEpICovCi0gICAgICAgICAgICBpZihpMzJfYjAwID09IDAgJiYgaTMyX2cwMCA9PSA2MyAmJiBpMzJfcjAwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMCA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDAgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMTAgPT0gMCAmJiBpMzJfZzEwID09IDYzICYmIGkzMl9yMTAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjEwID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IxMCA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IwMSA9PSAwICYmIGkzMl9nMDEgPT0gNjMgJiYgaTMyX3IwMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAxID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjExID09IDAgJiYgaTMyX2cxMSA9PSA2MyAmJiBpMzJfcjExID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IxMSA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMTEgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgUkdCIHZhbHVlIHRvIFlVViAqLwotICAgICAgICAgICAgaTMyX3UwMCA9IFUxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgPSBWMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDAgPSBZMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgPSBVMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwID0gVjE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTEwID0gWTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotCi0gICAgICAgICAgICBpMzJfdTAxID0gVTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSA9IFYxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMSA9IFkxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLQotICAgICAgICAgICAgaTMyX3UxMSA9IFUxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgPSBWMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTEgPSBZMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGx1bWluYW5jZSBkYXRhICovCi0gICAgICAgICAgICBwdThfeW5bMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0gICAgICAgICAgICBwdThfeW5bMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0gICAgICAgICAgICBwdThfeXNbMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0gICAgICAgICAgICAqcHU4X3UgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgIC8qIFByZXBhcmUgZm9yIG5leHQgY29sdW1uICovCi0gICAgICAgICAgICBwdThfcmdibiArPSAoQ1NUX1JHQl8xNl9TSVpFPDwxKTsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBjdXJyZW50IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95biArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3lzICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgVSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3UgKys7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgViBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogRW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICAvKiBQcmVwYXJlIHBvaW50ZXJzIGZvciB0aGUgbmV4dCByb3cgKi8KLSAgICAgICAgcHU4X3lfZGF0YSArPSB1MzJfc3RyaWRlMl9ZOwotICAgICAgICBwdThfdV9kYXRhICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSArPSB1MzJfc3RyaWRlX1Y7Ci0gICAgICAgIHB1OF9yZ2JuX2RhdGEgKz0gdTMyX3N0cmlkZV8ycmdiOwotCi0KLSAgICB9IC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUHJvdG86Ci1NNFZJRklfVUludDggICAgTTRWSUZJX1JHQjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lT3V0WzNdKTsKLUF1dGhvcjogICAgIFBhdHJpY2UgTWFydGluZXogLyBQaGlsaXBzIERpZ2l0YWwgTmV0d29ya3MgLSBNUDROZXQKLVB1cnBvc2U6ICAgIGZpbGxpbmcgb2YgdGhlIFlVVjQyMCBwbGFuZSBmcm9tIGEgQkdSMjQgcGxhbmUKLUFic3RyYWN0OiAgIExvb3Agb24gZWFjaCByb3cgKCAyIHJvd3MgYnkgMiByb3dzICkKLSAgICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uICggMiBjb2wgYnkgMiBjb2wgKQotICAgICAgICAgICAgICAgICAgICBHZXQgNCBCR1Igc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgYW5kIGJ1aWxkIDQgb3V0cHV0IFkgc2FtcGxlcyBhbmQgZWFjaCBzaW5nbGUgVSAmIFYgZGF0YQotICAgICAgICAgICAgICAgIGVuZCBsb29wIG9uIGNvbAotICAgICAgICAgICAgZW5kIGxvb3Agb24gcm93Ci0KLUluOiAgICAgICAgIFJHQjI0IHBsYW5lCi1Jbk91dDogICAgICBub25lCi1PdXQ6ICAgICAgICBhcnJheSBvZiAzIE00VklGSV9JbWFnZVBsYW5lIHN0cnVjdHVyZXMKLU1vZGlmaWVkOiAgIE1MOiBSR0IgZnVuY3Rpb24gbW9kaWZpZWQgdG8gQkdSLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSkKLXsKLQotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1YsIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0KLSAgICAvKiBjaGVjayBzaXplcyAqLwotICAgIGlmKCAoUGxhbmVJbi0+dV9oZWlnaHQgIT0gUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X2hlaWdodCAhPSAoUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLQotICAgIGlmKCAoUGxhbmVJbi0+dV93aWR0aCAhPSBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV93aWR0aCAhPSAoUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotCi0KLSAgICAvKiBzZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgID0gUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3VfZGF0YSAgPSBQbGFuZU91dFsxXS5wYWNfZGF0YSArIFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhICA9IFBsYW5lT3V0WzJdLnBhY19kYXRhICsgUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogaWRlbSBmb3IgaW5wdXQgYnVmZmVyICovCi0gICAgcHU4X3JnYm5fZGF0YSAgID0gUGxhbmVJbi0+cGFjX2RhdGEgKyBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCAgID0gUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0ICA9IFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogc2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1k9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogaWRlbSBmb3IgaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMnJnYiA9IHUzMl9zdHJpZGVfcmdiIDw8IDE7Ci0KLSAgICAvKiBsb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIHR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIHVwZGF0ZSB3b3JraW5nIHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biAgPSBwdThfeV9kYXRhOwotICAgICAgICBwdThfeXMgID0gcHU4X3luICsgdTMyX3N0cmlkZV9ZOwotCi0gICAgICAgIHB1OF91ICAgPSBwdThfdV9kYXRhOwotICAgICAgICBwdThfdiAgID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfcmdibj0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBsb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBnZXQgUkdCIHNhbXBsZXMgb2YgNCBwaXhlbHMgKi8KLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwLCBwdThfcmdibiwgMCk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCwgcHU4X3JnYm4sIENTVF9SR0JfMjRfU0laRSk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSwgcHU4X3JnYm4sIHUzMl9zdHJpZGVfcmdiKTsKLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExLCBwdThfcmdibiwgdTMyX3N0cmlkZV9yZ2IgKyBDU1RfUkdCXzI0X1NJWkUpOwotCi0gICAgICAgICAgICBpMzJfdTAwID0gVTI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3YwMCA9IFYyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl95MDAgPSBZMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7ICAgICAgIC8qIG1hdHJpeCBsdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIHB1OF95blswXT0gKE00VklGSV9VSW50OClpMzJfeTAwOwotCi0gICAgICAgICAgICBpMzJfdTEwID0gVTI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3YxMCA9IFYyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl95MTAgPSBZMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBwdThfeW5bMV09IChNNFZJRklfVUludDgpaTMyX3kxMDsKLQotICAgICAgICAgICAgaTMyX3UwMSA9IFUyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl92MDEgPSBWMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfeTAxID0gWTI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgcHU4X3lzWzBdPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0KLSAgICAgICAgICAgIGkzMl91MTEgPSBVMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfdjExID0gVjI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3kxMSA9IFkyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIHB1OF95c1sxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMTsKLQotICAgICAgICAgICAgKnB1OF91ICA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAqcHU4X3YgID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgcHU4X3JnYm4gICAgKz0gIChDU1RfUkdCXzI0X1NJWkU8PDEpOwotICAgICAgICAgICAgcHU4X3luICAgICAgKz0gMjsKLSAgICAgICAgICAgIHB1OF95cyAgICAgICs9IDI7Ci0KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogZW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICBwdThfeV9kYXRhICAgICAgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSAgICs9IHUzMl9zdHJpZGVfMnJnYjsKLQotCi0gICAgfSAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKiBZVVY0MjAgdG8gWVVWNDIwICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgVHJhbnNmb3JtIFlVVjQyMCBpbWFnZSB0byBhIFlVVjQyMCBpbWFnZS4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEgKFVudXNlZCAtIGNvdWxkIGJlIE5VTEwpCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFlVViBwbGFuZSBidWZmZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBZVVYgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogRXJyb3IgaW4gcGxhbmUgaGVpZ2h0Ci0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIEVycm9yIGluIHBsYW5lIHdpZHRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQgKQotewotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdDsKLQotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHBfYnVmX2Rlc3QgPSAmKFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9idWZfZGVzdCwgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICBwX2J1Zl9zcmMgKz0gUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcF9idWZfZGVzdCArPSBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYXV0aG9yICBEYXZpZCBEYW5hIChQSElMSVBTIFNvZnR3YXJlKQotICogQGJyaWVmICAgUmVzaXplcyBZVVY0MjAgUGxhbmFyIHBsYW5lLgotICogQG5vdGUgICAgQmFzaWMgc3RydWN0dXJlIG9mIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoc3RlcCAyKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKHN0ZXAgMikKLSAqICAgICAgICAgICAgICAgICAgR2V0IGZvdXIgWSBzYW1wbGVzIGFuZCAxIFUgJiBWIHNhbXBsZQotICogICAgICAgICAgICAgICAgICBSZXNpemUgdGhlIFkgd2l0aCBjb3JyZXNwb25pbmcgVSBhbmQgViBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIFBsYWNlIHRoZSBZVVYgaW4gdGhlIG91cHV0IHBsYW5lCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3AgY29sdW1uCi0gKiAgICAgICAgICBlbmQgbG9vcCByb3cKLSAqICAgICAgICAgIEZvciByZXNpemluZyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZwotICogICAgICAgICAgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdCByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb3duIGVhY2ggY29sdW1uLgotICogICAgICAgICAgRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkCi0gKiAgICAgICAgICBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzLiBUaGUgcmF0aW8gb2YgY29tcHJlc3Npb24KLSAqICAgICAgICAgIG9yIGRpbGF0YXRpb24gaXMgZXN0aW1hdGVkIHVzaW5nIGlucHV0IGFuZCBvdXRwdXQgc2l6ZXMuCi0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFlVVjQyMCAoUGxhbmFyKSBwbGFuZSBidWZmZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBZVVY0MjAgKFBsYW5hcikgcGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogRXJyb3IgaW4gaGVpZ2h0Ci0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIEVycm9yIGluIHdpZHRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfaW4sICpwdThfZGF0YV9vdXQsICpwdThkdW07Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9wbGFuZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoX2luLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luLCB1MzJfaGVpZ2h0X291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9pbiwgdTMyX3N0cmlkZV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luYywgdTMyX3lfaW5jOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9hY2N1bSwgdTMyX3lfYWNjdW0sIHUzMl94X2FjY3VtX3N0YXJ0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2ZyYWM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl90ZW1wX3ZhbHVlOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY190b3A7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbTsKLQotICAgIE00VklGSV9VSW50OCAgICB1OFdmbGFnID0gMDsKLSAgICBNNFZJRklfVUludDggICAgdThIZmxhZyA9IDA7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGxvb3AgPSAwOwotCi0KLSAgICAvKgotICAgICBJZiBpbnB1dCB3aWR0aCBpcyBlcXVhbCB0byBvdXRwdXQgd2lkdGggYW5kIGlucHV0IGhlaWdodCBlcXVhbCB0bwotICAgICBvdXRwdXQgaGVpZ2h0IHRoZW4gTTRWSUZJX1lVVjQyMHRvWVVWNDIwIGlzIGNhbGxlZC4KLSAgICAqLwotICAgIGlmICgocFBsYW5lSW5bMF0udV9oZWlnaHQgPT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAmJgotICAgICAgICAgICAgICAocFBsYW5lSW5bMF0udV93aWR0aCA9PSBwUGxhbmVPdXRbMF0udV93aWR0aCkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX1lVVjQyMHRvWVVWNDIwKHBVc2VyRGF0YSwgcFBsYW5lSW4sIHBQbGFuZU91dCk7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBZVVYgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgIGlmICgoSVNfRVZFTihwUGxhbmVJblswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dFswXS51X2hlaWdodCkgPT0gRkFMU0UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW5bMF0udV93aWR0aCkgPT0gRkFMU0UpIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dFswXS51X3dpZHRoKSA9PSBGQUxTRSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogTG9vcCBvbiBwbGFuZXMgKi8KLSAgICBmb3IodTMyX3BsYW5lID0gMDt1MzJfcGxhbmUgPCBQTEFORVM7dTMyX3BsYW5lKyspCi0gICAgewotICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICAgICAgcHU4X2RhdGFfaW4gICAgID0gcFBsYW5lSW5bdTMyX3BsYW5lXS5wYWNfZGF0YSArIHBQbGFuZUluW3UzMl9wbGFuZV0udV90b3BsZWZ0OwotICAgICAgICBwdThfZGF0YV9vdXQgICAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS5wYWNfZGF0YSArIHBQbGFuZU91dFt1MzJfcGxhbmVdLnVfdG9wbGVmdDsKLQotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgICAgICB1MzJfc3RyaWRlX2luICAgPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfc3RyaWRlOwotICAgICAgICB1MzJfc3RyaWRlX291dCAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgICAgIHUzMl93aWR0aF9pbiAgICA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9pbiAgID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X2hlaWdodDsKLQotICAgICAgICB1MzJfd2lkdGhfb3V0ICAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X3dpZHRoOwotICAgICAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X2hlaWdodDsKLQotICAgICAgICAvKgotICAgICAgICBGb3IgdGhlIGNhc2UgLCB3aWR0aF9vdXQgPSB3aWR0aF9pbiAsIHNldCB0aGUgZmxhZyB0byBhdm9pZAotICAgICAgICBhY2Nlc3Npbmcgb25lIGNvbHVtbiBiZXlvbmQgdGhlIGlucHV0IHdpZHRoLkluIHRoaXMgY2FzZSB0aGUgbGFzdAotICAgICAgICBjb2x1bW4gaXMgcmVwbGljYXRlZCBmb3IgcHJvY2Vzc2luZwotICAgICAgICAqLwotICAgICAgICBpZiAodTMyX3dpZHRoX291dCA9PSB1MzJfd2lkdGhfaW4pIHsKLSAgICAgICAgICAgIHUzMl93aWR0aF9vdXQgPSB1MzJfd2lkdGhfb3V0LTE7Ci0gICAgICAgICAgICB1OFdmbGFnID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGguKi8KLSAgICAgICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9pbmMgICA9ICgodTMyX3dpZHRoX2luLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfaW5jICAgPSAodTMyX3dpZHRoX2luICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgIEZvciB0aGUgY2FzZSAsIGhlaWdodF9vdXQgPSBoZWlnaHRfaW4gLCBzZXQgdGhlIGZsYWcgdG8gYXZvaWQKLSAgICAgICAgYWNjZXNzaW5nIG9uZSByb3cgYmV5b25kIHRoZSBpbnB1dCBoZWlnaHQuSW4gdGhpcyBjYXNlIHRoZSBsYXN0Ci0gICAgICAgIHJvdyBpcyByZXBsaWNhdGVkIGZvciBwcm9jZXNzaW5nCi0gICAgICAgICovCi0gICAgICAgIGlmICh1MzJfaGVpZ2h0X291dCA9PSB1MzJfaGVpZ2h0X2luKSB7Ci0gICAgICAgICAgICB1MzJfaGVpZ2h0X291dCA9IHUzMl9oZWlnaHRfb3V0LTE7Ci0gICAgICAgICAgICB1OEhmbGFnID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodC4qLwotICAgICAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfaW5jICAgPSAoKHUzMl9oZWlnaHRfaW4gLSAxKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9pbmMgPSAodTMyX2hlaWdodF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeV9hY2N1bV9zdGFydC4KLSAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZQotICAgICAgICBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAqLwotICAgICAgICBpZiAodTMyX3lfaW5jID49IE1BWF9TSE9SVCkKLSAgICAgICAgewotICAgICAgICAvKgotICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbm5hbCBwYXJ0LCBhc3NpbXVuZyB0aGF0IGludGVnZXIgIHBhcnQgaXMgY29kZWQKLSAgICAgICAgb24gdGhlIDE2IGhpZ2ggYml0cyBhbmQgdGhlIGZyYWN0aW9uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICovCi0gICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHUzMl95X2luYyAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgaWYgKCF1MzJfeV9hY2N1bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdTMyX3lfYWNjdW0gPj49IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bSA9IDA7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUKLSAgICAgICAgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHUzMl94X2luYyA+PSBNQVhfU0hPUlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jICYgMHhmZmZmOwotCi0gICAgICAgICAgICBpZiAoIXUzMl94X2FjY3VtX3N0YXJ0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA+Pj0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHUzMl9oZWlnaHQgPSB1MzJfaGVpZ2h0X291dDsKLQotICAgICAgICAvKgotICAgICAgICBCaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZyBlYWNoIHJvdywgYW5kCi0gICAgICAgIHRoZW4gdXNlcyB0aGF0IHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uCi0gICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZCBjb21iaW5hdGlvbgotICAgICAgICBvZiBpdHMgZm91ciBuZWlnaGJvdXJzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYToKLSAgICAgICAgRihwJyxxJyk9ZihwLHEpUigtYSlSKGIpK2YocCxxLTEpUigtYSlSKGItMSkrZihwKzEscSlSKDEtYSlSKGIpKwotICAgICAgICBmKHArJixxKzEpUigxLWEpUihiLTEpIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14Ci0gICAgICAgIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKXdlaWdodGluZyBjb2VmZmljaWVudCBpcyB0aGUgZGlzdGFuY2UKLSAgICAgICAgZnJvbSB0aGUgbmVhcmVzdCBuZWlnaGJvciBpbiB0aGUgcCAocmVzcC4gcSkgZGlyZWN0aW9uCi0gICAgICAgICovCi0KLSAgICAgICAgZG8geyAvKiBTY2FuIGFsbCB0aGUgcm93ICovCi0KLSAgICAgICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0+PjEyKSYxNTsKLQotICAgICAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICB1MzJfeF9hY2N1bSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotCi0gICAgICAgICAgICB1MzJfd2lkdGggPSB1MzJfd2lkdGhfb3V0OwotCi0gICAgICAgICAgICBkbyB7IC8qIFNjYW4gYWxvbmcgZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLSAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgdTMyX3N0cmlkZV9pbjsKLSAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gdTMyX3hfaW5jOwotICAgICAgICAgICAgfSB3aGlsZSgtLXUzMl93aWR0aCk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICBUaGlzIHU4V2ZsYWcgZmxhZyBnZXRzIGluIHRvIGVmZmVjdCBpZiBpbnB1dCBhbmQgb3V0cHV0Ci0gICAgICAgICAgICAgICB3aWR0aCBpcyBzYW1lLCBhbmQgaGVpZ2h0IG1heSBiZSBkaWZmZXJlbnQuIFNvIHByZXZpb3VzCi0gICAgICAgICAgICAgICBwaXhlbCBpcyByZXBsaWNhdGVkIGhlcmUKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAodThXZmxhZykgewotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdThkdW0gPSAocHU4X2RhdGFfb3V0LXUzMl93aWR0aF9vdXQpOwotICAgICAgICAgICAgcHU4X2RhdGFfb3V0ID0gcHU4X2RhdGFfb3V0ICsgdTMyX3N0cmlkZV9vdXQgLSB1MzJfd2lkdGhfb3V0OwotCi0gICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHUzMl95X2luYzsKLSAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIHUzMl9zdHJpZGVfaW47Ci0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlKC0tdTMyX2hlaWdodCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgVGhpcyB1OEhmbGFnIGZsYWcgZ2V0cyBpbiB0byBlZmZlY3QgaWYgaW5wdXQgYW5kIG91dHB1dCBoZWlnaHQKLSAgICAgICAgaXMgc2FtZSwgYW5kIHdpZHRoIG1heSBiZSBkaWZmZXJlbnQuIFNvIHByZXZpb3VzIHBpeGVsIHJvdyBpcwotICAgICAgICByZXBsaWNhdGVkIGhlcmUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHU4SGZsYWcpIHsKLSAgICAgICAgICAgIGZvcihsb29wID0wOyBsb29wIDwgKHUzMl93aWR0aF9vdXQrdThXZmxhZyk7IGxvb3ArKykgewotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpKnB1OGR1bSsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotTTRPU0FfRVJSIGFwcGx5UmVuZGVyaW5nTW9kZShNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQsIE00eFZTU19NZWRpYVJlbmRlcmluZyBtZWRpYVJlbmRlcmluZykKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKG1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbCB0aGUgcmVzaXplIGZpbHRlci4gRnJvbSB0aGUgaW50ZXJtZWRpYXRlIGZyYW1lIHRvIHRoZSBlbmNvZGVyIGltYWdlIHBsYW5lICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBQbGFuZUluLCBwUGxhbmVPdXQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJhcHBseVJlbmRlcmluZ01vZGU6IE00VmlGaWxSZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNEFJUl9QYXJhbXMgUGFyYW1zOwotICAgICAgICBNNE9TQV9Db250ZXh0IG1fYWlyX2NvbnRleHQ7Ci0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lc1RlbXBbM107Ci0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVUZW1wOwotICAgICAgICBNNE9TQV9VSW50OCogcE91dFBsYW5lWSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVVID0gcFBsYW5lT3V0WzFdLnBhY19kYXRhICsgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVYgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVZID0gTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lVSA9IE5VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVYgPSBOVUxMOwotICAgICAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgICAgICAvKnRvIGtlZXAgbWVkaWEgYXNwZWN0IHJhdGlvKi8KLSAgICAgICAgLypJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lSW4tPnVfaGVpZ2h0OwotICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBQbGFuZUluLT51X3dpZHRoOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotICAgICAgICBQYXJhbXMubV9iT3V0cHV0U3RyaXBlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLQotICAgICAgICAvKioKLSAgICAgICAgTWVkaWEgcmVuZGVyaW5nOiBCbGFjayBib3JkZXJzKi8KLSAgICAgICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFswXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwocFBsYW5lT3V0WzBdLnVfaGVpZ2h0KnBQbGFuZU91dFswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLChwUGxhbmVPdXRbMV0udV9oZWlnaHQqcFBsYW5lT3V0WzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsKHBQbGFuZU91dFsyXS51X2hlaWdodCpwUGxhbmVPdXRbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9IHBQbGFuZU91dFsxXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IHBQbGFuZU91dFsxXS51X2hlaWdodDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGUgPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSBwUGxhbmVPdXRbMl0udV9oZWlnaHQ7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlID0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogQWxsb2NhdGVzIHBsYW4gaW4gbG9jYWwgaW1hZ2UgcGxhbmUgc3RydWN0dXJlICovCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCwgTTRWUywgKE00T1NBX0NoYXIqKSJhcHBseVJlbmRlcmluZ01vZGU6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJZIikgOwotICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciBhbGxvYyBpbiBhcHBseVJlbmRlcmluZ01vZGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCwgTTRWUywgKE00T1NBX0NoYXIqKSJhcHBseVJlbmRlcmluZ01vZGU6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJVIikgOwotICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIGFsbG9jIGluIGFwcGx5UmVuZGVyaW5nTW9kZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0LCBNNFZTLCAoTTRPU0FfQ2hhciopImFwcGx5UmVuZGVyaW5nTW9kZTogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclYiKSA7Ci0gICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gYXBwbHlSZW5kZXJpbmdNb2RlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwSW5QbGFuZVkgPSBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhIDsKLSAgICAgICAgICAgIHBJblBsYW5lVSA9IHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgOwotICAgICAgICAgICAgcEluUGxhbmVWID0gcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA7Ci0KLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEsWV9QTEFORV9CT1JERVJfVkFMVUUsKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSxVX1BMQU5FX0JPUkRFUl9WQUxVRSwocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBQbGFuZUluLT51X2hlaWdodCAqIHBQbGFuZU91dC0+dV93aWR0aCkgL3BQbGFuZUluLT51X3dpZHRoKSA8PSBwUGxhbmVPdXQtPnVfaGVpZ2h0KS8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0IDwgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSAoTTRPU0FfVUludDMyKSgocFBsYW5lSW4tPnVfaGVpZ2h0ICogcFBsYW5lT3V0LT51X3dpZHRoKSAvcFBsYW5lSW4tPnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIC8qbnVtYmVyIG9mIGxpbmVzIGF0IHRoZSB0b3AqLwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0gKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LVBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKml0IGlzIHdpZHRoIHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gKE00T1NBX1VJbnQzMikoKHBQbGFuZUluLT51X3dpZHRoICogcFBsYW5lT3V0LT51X2hlaWdodCkgL3BQbGFuZUluLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPSAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPSAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4qLwotICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSAocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodD4+MSk8PDE7Ci0KLSAgICAgICAgICAgIC8qQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50Ki8KLSAgICAgICAgICAgIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwSW1hZ2VQbGFuZXNUZW1wOwotCi0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICBNZWRpYSByZW5kZXJpbmc6IENyb3BwaW5nKi8KLSAgICAgICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tDcm9wcGluZykKLSAgICAgICAgewotICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgICAgICBpZigoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKmhlaWdodCB3aWxsIGJlIGNyb3BwZWQqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IChNNE9TQV9VSW50MzIpKChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ICogUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpIC9QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpKChwUGxhbmVJbi0+dV9oZWlnaHQgLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKT4+MSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyp3aWR0aCB3aWxsIGJlIGNyb3BwZWQqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkgL1BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKSgocFBsYW5lSW4tPnVfd2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbCBBSVIgZnVuY3Rpb25zICovCi0gICAgICAgIGVyciA9IE00QUlSX2NyZWF0ZSgmbV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiYXBwbHlSZW5kZXJpbmdNb2RlOiBFcnJvciB3aGVuIGluaXRpYWxpemluZyBBSVI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKG1fYWlyX2NvbnRleHQsICZQYXJhbXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiYXBwbHlSZW5kZXJpbmdNb2RlOiBFcnJvciB3aGVuIGNvbmZpZ3VyaW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICBNNEFJUl9jbGVhblVwKG1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2dldChtX2Fpcl9jb250ZXh0LCBwUGxhbmVJbiwgcFBsYW5lVGVtcCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiYXBwbHlSZW5kZXJpbmdNb2RlOiBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAobV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzBdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lWSwgKHZvaWQgKilwSW5QbGFuZVksIHBQbGFuZU91dFswXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBwSW5QbGFuZVkgKz0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcE91dFBsYW5lWSArPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFsxXS51X2hlaWdodDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVUsICh2b2lkICopcEluUGxhbmVVLCBwUGxhbmVPdXRbMV0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgcEluUGxhbmVVICs9IHBQbGFuZU91dFsxXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHBPdXRQbGFuZVUgKz0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVWLCAodm9pZCAqKXBJblBsYW5lViwgcFBsYW5lT3V0WzJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIHBJblBsYW5lViArPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwT3V0UGxhbmVWICs9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fYWlyX2NvbnRleHQgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChtX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIG1fYWlyX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLy9UT0RPOiByZW1vdmUgdGhpcyBjb2RlIGFmdGVyIGxpbmsgd2l0aCB2aWRlb2FydGlzdCBsaWIKLS8qIE00QUlSIGNvZGUqLwotI2RlZmluZSBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotI2RlZmluZSBNNEFJUl9ZVVY0MjBBX0ZPUk1BVF9TVVBQT1JURUQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUElMQVRJT04gQ0hFQ0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfQkdSNTY1X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfUkdCNTY1X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfQkdSODg4X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfUkdCODg4X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfSlBHX0ZPUk1BVF9TVVBQT1JURUQKLQotI2Vycm9yICJQbGVhc2UgZGVmaW5lIGF0IGxlYXN0IG9uZSBpbnB1dCBmb3JtYXQgZm9yIHRoZSBBSVIgY29tcG9uZW50IgotCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgSU5URVJOQUwgVFlQRVMgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgIE00QUlSX1N0YXRlcwotICogQGJyaWVmICAgICAgIFRoZSBmb2xsb3dpbmcgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBBSVIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRBSVJfa0NyZWF0ZWQsICAgICAgICAgLyoqPCBTdGF0ZSBhZnRlciBNNEFJUl9jcmVhdGUgaGFzIGJlZW4gY2FsbGVkICovCi0gICAgTTRBSVJfa0NvbmZpZ3VyZWQgICAgICAgICAgIC8qKjwgU3RhdGUgYWZ0ZXIgTTRBSVJfY29uZmlndXJlIGhhcyBiZWVuIGNhbGxlZCAqLwotfU00QUlSX1N0YXRlczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiB0aGUgQUlSLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRBSVJfU3RhdGVzICAgICAgICAgICAgICAgIG1fc3RhdGU7ICAgICAgICAgICAgLyoqPCBJbnRlcm5hbCBzdGF0ZSAqLwotICAgIE00QUlSX0lucHV0Rm9ybWF0VHlwZSAgIG1faW5wdXRGb3JtYXQ7ICAgICAgLyoqPCBJbnB1dCBmb3JtYXQgbGlrZSBZVVY0MjBQbGFuYXIsIFJHQjU2NSwgSlBHLCBldGMgLi4uICovCi0gICAgTTRBSVJfUGFyYW1zICAgICAgICAgICAgbV9wYXJhbXM7ICAgICAgICAgICAvKio8IEN1cnJlbnQgaW5wdXQgUGFyYW1ldGVyIG9mICB0aGUgcHJvY2Vzc2luZyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl94X2luY1s0XTsgICAgICAgLyoqPCByYXRpbyBiZXR3ZWVuIGlucHV0IGFuZCBvdXB1dCB3aWR0aCBmb3IgWVVWICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfaW5jWzRdOyAgICAgICAvKio8IHJhdGlvIGJldHdlZW4gaW5wdXQgYW5kIG91cHV0IGhlaWdodCBmb3IgWVVWICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnRbNF07ICAgLyoqPCBob3Jpem9udGFsIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeV9hY2N1bV9zdGFydFs0XTsgICAvKio8IFZlcnRpY2FsIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeF9hY2N1bVs0XTsgICAgIC8qKjwgc2F2ZSBvZiBob3Jpem9udGFsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfYWNjdW1bNF07ICAgICAvKio8IHNhdmUgb2YgdmVydGljYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50OCogICAgICAgICAgICBwdThfZGF0YV9pbls0XTsgICAgICAgICAvKio8IFNhdmUgb2YgaW5wdXQgcGxhbmUgcG9pbnRlcnMgaW4gY2FzZSBvZiBzdHJpcGUgbW9kZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fcHJvY1Jvd3M7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgcHJvY2Vzc2VkIHJvd3MsIHVzZWQgaW4gc3RyaXBlIG1vZGUgb25seSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1fYk9ubHlDb3B5OyAgICAgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGp1c3QgcGVyZm9ybSBhIGNvcHkgb3IgYSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbV9iRmxpcFg7ICAgICAgICAgICAgICAgLyoqPCBEZXBlbmQgb24gb3V0cHV0IG9yaWVudGF0aW9uLCB1c2VkIGR1cmluZyBwcm9jZXNzaW5nIHRvIHJldmVydCBwcm9jZXNzaW5nIG9yZGVyIGluIFggY29vcmRpbmF0ZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtX2JGbGlwWTsgICAgICAgICAgICAgICAvKio8IERlcGVuZCBvbiBvdXRwdXQgb3JpZW50YXRpb24sIHVzZWQgZHVyaW5nIHByb2Nlc3NpbmcgdG8gcmV2ZXJ0IHByb2Nlc3Npbmcgb3JkZXIgaW4gWSBjb29yZGluYXRlcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1fYlJldmVydFhZOyAgICAgICAgICAgIC8qKjwgRGVwZW5kIG9uIG91dHB1dCBvcmllbnRhdGlvbiwgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZyB0byByZXZlcnQgWCBhbmQgWSBwcm9jZXNzaW5nIG9yZGVyICgrLTkwwrAgcm90YXRpb24pICovCi19TTRBSVJfSW50ZXJuYWxDb250ZXh0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpIGlmICgocG9pbnRlcikgPT0gTTRPU0FfTlVMTCkgcmV0dXJuICgoTTRPU0FfRVJSKShyZXR2YWwpKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBNNEFJUiBQVUJMSUMgQVBJIElNUExFTUVOVEFUSU9OICoqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY3JlYXRlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LE00QUlSX0lucHV0Rm9ybWF0VHlwZSBpbnB1dEZvcm1hdCkKLSAqIEBhdXRob3IgIEFybmF1ZCBDb2xsYXJkCi0gKiBAYnJpZWYgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAoSU4vT1VUKSBBZGRyZXNzIG9mIHRoZSBjb250ZXh0IHRvIGNyZWF0ZQotICogQHBhcmFtICAgaW5wdXRGb3JtYXQ6ICAgIChJTikgaW5wdXQgZm9ybWF0IHR5cGUuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4gSW52YWxpZCBmb3JtYXRUeXBlCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgaXMgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1IgOwotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSBNNE9TQV9OVUxMIDsKLSAgICAvKiBDaGVjayB0aGF0IHRoZSBhZGRyZXNzIG9uIHRoZSBjb250ZXh0IGlzIG5vdCBOVUxMICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICAvKiBJbnRlcm5hbCBDb250ZXh0IGNyZWF0aW9uICovCi0gICAgcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00QUlSX0ludGVybmFsQ29udGV4dCksIE00QUlSLCAoTTRPU0FfQ2hhciopIkFJUiBpbnRlcm5hbCBjb250ZXh0IikgOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBwQykgOwotCi0KLSAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgZm9ybWF0IGlzIHN1cHBvcnRlZCAqLwotICAgIHN3aXRjaChpbnB1dEZvcm1hdCkKLSAgICB7Ci0jaWZkZWYgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSAgICAgICAgY2FzZSBNNEFJUl9rWVVWNDIwUDoKLSAgICAgICAgYnJlYWsgOwotI2VuZGlmCi0jaWZkZWYgTTRBSVJfWVVWNDIwQV9GT1JNQVRfU1VQUE9SVEVECi0gICAgICAgIGNhc2UgTTRBSVJfa1lVVjQyMEFQOgotICAgICAgICBicmVhayA7Ci0jZW5kaWYKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgICAgIGdvdG8gTTRBSVJfY3JlYXRlX2NsZWFudXAgOwotICAgIH0KLQotICAgIC8qKjwgU2F2ZSBpbnB1dCBmb3JtYXQgYW5kIHVwZGF0ZSBzdGF0ZSAqLwotICAgIHBDLT5tX2lucHV0Rm9ybWF0ID0gaW5wdXRGb3JtYXQ7Ci0gICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ3JlYXRlZDsKLQotICAgIC8qIFJldHVybiB0aGUgY29udGV4dCB0byB0aGUgY2FsbGVyICovCi0gICAgKnBDb250ZXh0ID0gcEMgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotCi1NNEFJUl9jcmVhdGVfY2xlYW51cDoKLSAgICAvKiBFcnJvciBtYW5hZ2VtZW50IDogd2UgZGVzdHJveSB0aGUgY29udGV4dCBpZiBuZWVkZWQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDKQotICAgIHsKLSAgICAgICAgZnJlZShwQykgOwotICAgIH0KLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgcmV0dXJuIGVyciA7Ci19Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYXV0aG9yICBBcm5hdWQgQ29sbGFyZAotICogQGJyaWVmICAgICAgIFRoaXMgZnVuY3Rpb24gZGVzdHJveXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFJUiBjb21wb25lbnQKLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UgdG8gZGVzdHJveQotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogSW50ZXJuYWwgc3RhdGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyBmdW5jdGlvbiBjYWxsLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotICAgIGZyZWUocEMpIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLQotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpCi0gKiBAYnJpZWYgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGNvbmZpZ3VyZSB0aGUgQUlSLgotICogQG5vdGUgICAgSXQgd2lsbCBzZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgY29vcmRpbmF0ZXMgYW5kIHNpemVzLAotICogICAgICAgICAgYW5kIGluZGljYXRlcyBpZiB3ZSB3aWxsIHByb2NlZWQgaW4gc3RyaXBlIG9yIG5vdC4KLSAqICAgICAgICAgIEluIGNhc2UgYSBNNEFJUl9nZXQgaW4gc3RyaXBlIG1vZGUgd2FzIG9uIGdvaW5nLCBpdCB3aWxsIGNhbmNlbCB0aGlzIHByZXZpb3VzIHByb2Nlc3NpbmcKLSAqICAgICAgICAgIGFuZCByZXNldCB0aGUgZ2V0IHByb2Nlc3MuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgICAgICAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICBwUGFyYW1zLT5tX2JPdXRwdXRTdHJpcGU6KElOKSBTdHJpcGUgbW9kZS4KLSAqIEBwYXJhbSAgIHBQYXJhbXMtPm1faW5wdXRDb29yZDogIChJTikgWCxZIGNvb3JkaW5hdGVzIG9mIHRoZSBmaXJzdCB2YWxpZCBwaXhlbCBpbiBpbnB1dC4KLSAqIEBwYXJhbSAgIHBQYXJhbXMtPm1faW5wdXRTaXplOiAgIChJTikgaW5wdXQgUk9JIHNpemUuCi0gKiBAcGFyYW0gICBwUGFyYW1zLT5tX291dHB1dFNpemU6ICAoSU4pIG91dHB1dCBzaXplLgotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gIE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDogdGhlIHJlcXVlc3RlZCBpbnB1dCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcykKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiAgICBpLHUzMl93aWR0aF9pbiwgdTMyX3dpZHRoX291dCwgdTMyX2hlaWdodF9pbiwgdTMyX2hlaWdodF9vdXQ7Ci0gICAgTTRPU0FfVUludDMyICAgIG5iX3BsYW5lczsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIGlmKE00QUlSX2tZVVY0MjBBUCA9PSBwQy0+bV9pbnB1dEZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDM7Ci0gICAgfQotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqIFNhdmUgcGFyYW1ldGVycyAqLwotICAgIHBDLT5tX3BhcmFtcyA9ICpwUGFyYW1zOwotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBpbnB1dCZvdXRwdXQgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgICAgICBpZiggKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpJjB4MSkgICAgfHwKLSAgICAgICAgICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSYweDEpKQotICAgICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUlSX0lMTEVHQUxfRlJBTUVfU0laRTsKLSAgICAgICAgfQotCi0gICAgaWYoICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpJjB4MSkgICAgfHwKLSAgICAgICAgICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpJjB4MSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BSVJfSUxMRUdBTF9GUkFNRV9TSVpFOwotICAgICAgICB9Ci0gICAgaWYoKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkgPT0gKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkpCi0gICAgICAgICYmKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpID09IChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KSkpCi0gICAgewotICAgICAgICAvKio8IE5vIHJlc2l6ZSBpbiB0aGlzIGNhc2UsIHdlIHdpbGwganVzdCBjb3B5IGlucHV0IGluIG91dHB1dCAqLwotICAgICAgICBwQy0+bV9iT25seUNvcHkgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+bV9iT25seUNvcHkgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAvKio8IEluaXRpYWxpemUgaW50ZXJuYWwgdmFyaWFibGVzIHVzZWQgZm9yIHJlc2l6ZSBmaWx0ZXIgKi8KLSAgICAgICAgZm9yKGk9MDtpPG5iX3BsYW5lcztpKyspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgdTMyX3dpZHRoX2luID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDoocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgrMSk+PjE7Ci0gICAgICAgICAgICB1MzJfaGVpZ2h0X2luID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ6KHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl93aWR0aF9vdXQgPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDoocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKzEpPj4xOwotICAgICAgICAgICAgdTMyX2hlaWdodF9vdXQgPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ6KHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQrMSk+PjE7Ci0KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgICAgICAgICAgICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2luY1tpXSAgID0gKCh1MzJfd2lkdGhfaW4tMSkgKiAweDEwMDAwKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfaW5jW2ldICAgPSAodTMyX3dpZHRoX2luICogMHgxMDAwMCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0LiovCi0gICAgICAgICAgICAgICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfaW5jW2ldICAgPSAoKHUzMl9oZWlnaHRfaW4gLSAxKSAqIDB4MTAwMDApIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfaW5jW2ldID0gKHUzMl9oZWlnaHRfaW4gKiAweDEwMDAwKSAvICh1MzJfaGVpZ2h0X291dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl95X2FjY3VtX3N0YXJ0LgotICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfaW5jW2ldID49IDB4MTAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgMTYgaGlnaCBiaXRzIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IHBDLT51MzJfeV9pbmNbaV0gJiAweGZmZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IDB4MTAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gPj49IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKjwgVGFrZSBpbnRvIGFjY291bnQgdGhhdCBZIGNvb3JkaW5hdGUgY2FuIGJlIG9kZAotICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBwdXQgYSAwLjUgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgIGZvciBVIGFuZCBWIHBsYW5lIGFzIHRoZXJlIGEgMiB0aW1lcyBzdWItc2FtcGxlZCB2cyBZKi8KLSAgICAgICAgICAgICAgICBpZigocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3kmMHgxKSYmKChpPT0xKXx8KGk9PTIpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSArPSAweDgwMDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeF9hY2N1bV9zdGFydC4KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl94X2luY1tpXSA+PSAweDEwMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gcEMtPnUzMl94X2luY1tpXSAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gMHgxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSA+Pj0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqPCBUYWtlIGludG8gYWNjb3VudCB0aGF0IFggY29vcmRpbmF0ZSBjYW4gYmUgb2RkCi0gICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHB1dCBhIDAuNSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgZm9yIFUgYW5kIFYgcGxhbmUgYXMgdGhlcmUgYSAyIHRpbWVzIHN1Yi1zYW1wbGVkIHZzIFkqLwotICAgICAgICAgICAgICAgIGlmKChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feCYweDEpJiYoKGk9PTEpfHwoaT09MikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldICs9IDB4ODAwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKio8IFJlc2V0IHZhcmlhYmxlIHVzZWQgZm9yIHN0cmlwZSBtb2RlICovCi0gICAgcEMtPm1fcHJvY1Jvd3MgPSAwOwotCi0gICAgLyoqPCBJbml0aWFsaXplIHZhciBmb3IgWC9ZIHByb2Nlc3Npbmcgb3JkZXIgYWNjb3JkaW5nIHRvIG9yaWVudGF0aW9uICovCi0gICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfRkFMU0U7Ci0gICAgc3dpdGNoKHBQYXJhbXMtPm1fb3V0cHV0T3JpZW50YXRpb24pCi0gICAgewotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BSaWdodDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tTGVmdDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0VG9wOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0VG9wOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbToKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIC8qKjwgVXBkYXRlIHN0YXRlICovCi0gICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ29uZmlndXJlZDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSB0aGUgcmVxdWVzdGVkIHJlc2l6ZWQgYXJlYSBvZiBpbnRlcmVzdCBhY2NvcmRpbmcgdG8gc2V0dGluZ3MKLSAqICAgICAgICAgIHByb3ZpZGVkIGluIE00QUlSX2NvbmZpZ3VyZS4KLSAqIEBub3RlICAgIEluIGNhc2UgdGhlIGlucHV0IGZvcm1hdCB0eXBlIGlzIEpQRUcsIGlucHV0IHBsYW5lKHMpCi0gKiAgICAgICAgICBpbiBwSW4gaXMgbm90IHVzZWQuIEluIG5vcm1hbCBtb2RlLCBkaW1lbnNpb24gc3BlY2lmaWVkIGluIG91dHB1dCBwbGFuZShzKSBzdHJ1Y3R1cmUgbXVzdCBiZSB0aGUKLSAqICAgICAgICAgIHNhbWUgdGhhbiB0aGUgb25lIHNwZWNpZmllZCBpbiBNNEFJUl9jb25maWd1cmUuIEluIHN0cmlwZSBtb2RlLCBvbmx5IHRoZSB3aWR0aCB3aWxsIGJlIHRoZSBzYW1lLAotICogICAgICAgICAgaGVpZ2h0IHdpbGwgYmUgdGFrZW4gYXMgdGhlIHN0cmlwZSBoZWlnaHQgKHR5cGljYWxseSAxNikuCi0gKiAgICAgICAgICBJbiBub3JtYWwgbW9kZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsIG9uY2UgdG8gZ2V0IHRoZSBmdWxsIG91dHB1dCBwaWN0dXJlLiBJbiBzdHJpcGUgbW9kZSwgaXQgaXMgY2FsbGVkCi0gKiAgICAgICAgICBmb3IgZWFjaCBzdHJpcGUgdGlsbCB0aGUgd2hvbGUgcGljdHVyZSBoYXMgYmVlbiByZXRyaWV2ZWQsYW5kICB0aGUgcG9zaXRpb24gb2YgdGhlIG91dHB1dCBzdHJpcGUgaW4gdGhlIG91dHB1dCBwaWN0dXJlCi0gKiAgICAgICAgICBpcyBpbnRlcm5hbGx5IGluY3JlbWVudGVkIGF0IGVhY2ggc3RlcC4KLSAqICAgICAgICAgIEFueSBjYWxsIHRvIE00QUlSX2NvbmZpZ3VyZSBkdXJpbmcgc3RyaXBlIHByb2Nlc3Mgd2lsbCByZXNldCB0aGlzIG9uZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgcGljdHVyZS4KLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UKLSAqIEBwYXJhbSAgIHBJbjogICAgICAgICAgICAoSU4pIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIGlucHV0IFBsYW5lKHMpLgotICogQHBhcmFtICAgcE91dDogICAgICAgKElOL09VVCkgIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIG91dHB1dCBQbGFuZShzKS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2dldChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEluLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dCkKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiBpLGosayx1MzJfeF9mcmFjLHUzMl95X2ZyYWMsdTMyX3hfYWNjdW0sdTMyX3lfYWNjdW0sdTMyX3NoaWZ0OwotICAgICAgICBNNE9TQV9VSW50OCAgICAqcHU4X2RhdGFfaW4sICpwdThfZGF0YV9pbl9vcmcsICpwdThfZGF0YV9pbl90bXAsICpwdThfZGF0YV9vdXQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICAgICpwdThfc3JjX3RvcDsKLSAgICAgICAgTTRPU0FfVUludDggICAgKnB1OF9zcmNfYm90dG9tOwotICAgIE00T1NBX1VJbnQzMiAgICB1MzJfdGVtcF92YWx1ZTsKLSAgICBNNE9TQV9JbnQzMiBpMzJfdG1wX29mZnNldDsKLSAgICBNNE9TQV9VSW50MzIgICAgbmJfcGxhbmVzOwotCi0KLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIC8qKjwgQ2hlY2sgc3RhdGUgKi8KLSAgICBpZihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICBpZihNNEFJUl9rWVVWNDIwQVAgPT0gcEMtPm1faW5wdXRGb3JtYXQpCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSAzOwotICAgIH0KLQotICAgIC8qKjwgTG9vcCBvbiBlYWNoIFBsYW5lICovCi0gICAgZm9yKGk9MDtpPG5iX3BsYW5lcztpKyspCi0gICAgewotCi0gICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLQotICAgICAgICB1MzJfc2hpZnQgPSAoKGk9PTApfHwoaT09MykpPzA6MTsgLyoqPCBEZXBlbmQgb24gTHVtYSBvciBDaHJvbWEgKi8KLQotICAgICAgICBpZigoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSl8fCgoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKSYmKDAgPT0gcEMtPm1fcHJvY1Jvd3MpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBGb3IgaW5wdXQsIHRha2UgY2FyZSBhYm91dCBST0kgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luICAgICA9IHBJbltpXS5wYWNfZGF0YSArIHBJbltpXS51X3RvcGxlZnQgKyAocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3g+PnUzMl9zaGlmdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV95ID4+IHUzMl9zaGlmdCkgKiBwSW5baV0udV9zdHJpZGU7Ci0KLSAgICAgICAgICAgIC8qKiBHbyBhdCBlbmQgb2YgbGluZS9jb2x1bW4gaW4gY2FzZSBYL1kgc2Nhbm5pbmcgaXMgZmxpcHBlZCAqLwotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PnUzMl9zaGlmdCkgLTEgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PnUzMl9zaGlmdCkgLTEpICogcEluW2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEluaXRpYWxpemUgYWNjdW11bGF0b3JzIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGl0IChiaWxpbmVhciBpbnRlcnBvbGF0aW9uKSAqLwotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5tX2JPbmx5Q29weSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1baV0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0gICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUgZm9yIG90aGVyIHRoYW4gZmlyc3Qgc3RyaXBlLCB3ZSBuZWVkIHRvIHJlY292ZXIgaW5wdXQgcG9pbnRlciBmcm9tIGludGVybmFsIGNvbnRleHQgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcEMtPnB1OF9kYXRhX2luW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiBldmVyeSBtb2RlLCBvdXRwdXQgZGF0YSBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX291dCAgICA9IHBPdXRbaV0ucGFjX2RhdGEgKyBwT3V0W2ldLnVfdG9wbGVmdDsKLQotICAgICAgICAvKio8IEluaXRpYWxpemUgaW5wdXQgb2Zmc2V0IGFwcGxpZWQgYWZ0ZXIgZWFjaCBwaXhlbCAqLwotICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkzMl90bXBfb2Zmc2V0ID0gcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaTMyX3RtcF9vZmZzZXQgPSAtcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiB0aGlzIGNhc2UsIG5vIGJpbGluZWFyIGludGVycG9sYXRpb24gaXMgbmVlZGVkIGFzIGlucHV0IGFuZCBvdXRwdXQgZGltZW5zaW9ucyBhcmUgdGhlIHNhbWUgKi8KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPm1fYk9ubHlDb3B5KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IE5vICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgTm8gZmxpcCBvbiBYIGFic2Npc3NhICovCi0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsb2NfaGVpZ2h0ID0gcE91dFtpXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsb2Nfd2lkdGggPSBwT3V0W2ldLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbG9jX3N0cmlkZSA9IHBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGxvY19oZWlnaHQ7IGorKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb3B5IG9uZSB3aG9sZSBsaW5lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwdThfZGF0YV9vdXQsICh2b2lkICopcHU4X2RhdGFfaW4sIGxvY193aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSBsb2Nfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luIC09IGxvY19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcGl4ZWwgb2YgMSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9ICpwdThfZGF0YV9pbi0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IChwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gcE91dFtpXS51X3dpZHRoICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKjwgSGVyZSB3ZSBoYXZlIGEgKy05MMKwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl90bXAgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBwaXhlbCBvZiAxIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKnB1OF9kYXRhX2luX3RtcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgaW5wdXQgcG9pbnRlciBpbiBvcmRlciB0byBnbyB0byBuZXh0L3Bhc3QgbGluZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fdG1wICs9IGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IChwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luIC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKjwgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotICAgICAgICBpZigzICE9IGkpICAvKio8IG90aGVyIHRoYW4gYWxwaGEgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqTm8gKy05MMKwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAocEMtPnUzMl95X2FjY3VtW2ldPj4xMikmMTU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogUmVpbml0IGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSA9IHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXTsKLQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAodTMyX3hfYWNjdW0gPj4gMTYpKSAtMSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfYWNjdW1baV0+PjE2KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeV9hY2N1bVtpXSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIC8qKiArLTkwwrAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl9vcmcgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9IChwQy0+dTMyX3hfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpKSAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bVtpXSArPSBwQy0+dTMyX3hfaW5jW2ldOwotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW5fb3JnOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgfS8qKiAzICE9IGkgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qKk5vICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHBDLT51MzJfeV9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHUzMl94X2FjY3VtID4+IDE2KSkgLTEgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9hY2N1bVtpXT4+MTYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl95X2FjY3VtW2ldID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSAvKio8IE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSAqLwotICAgICAgICAgICAgLyoqICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX29yZyA9IHB1OF9kYXRhX2luOwotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHBDLT51MzJfeF9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXTsKLQotICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNikpIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldICs9IHBDLT51MzJfeF9pbmNbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbl9vcmc7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAvKio8IE00T1NBX1RSVUUgPT0gcEMtPm1fYlJldmVydFhZICovCi0gICAgICAgIH0vKiogMyA9PSBpICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKjwgSW4gY2FzZSBvZiBzdHJpcGUgbW9kZSwgc2F2ZSBjdXJyZW50IGlucHV0IHBvaW50ZXIgKi8KLSAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+cHU4X2RhdGFfaW5baV0gPSBwdThfZGF0YV9pbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgVXBkYXRlIG51bWJlciBvZiBwcm9jZXNzZWQgcm93cywgcmVzZXQgaXQgaWYgd2UgaGF2ZSBmaW5pc2hlZCB3aXRoIHRoZSB3aG9sZSBwcm9jZXNzaW5nICovCi0gICAgcEMtPm1fcHJvY1Jvd3MgKz0gcE91dFswXS51X2hlaWdodDsKLSAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgewotICAgICAgICBpZihwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0IDw9IHBDLT5tX3Byb2NSb3dzKSAgICBwQy0+bV9wcm9jUm93cyA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA8PSBwQy0+bV9wcm9jUm93cykgcEMtPm1fcHJvY1Jvd3MgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLQotfQotLyorIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBMdkdldEltYWdlVGh1bWJOYWlsKE00T1NBX1VDaGFyICpmaWxlTmFtZSwgTTRPU0FfVm9pZCAqKnBCdWZmZXIpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGdpdmVzIFlVVjQyMCBidWZmZXIgb2YgYSBnaXZlbiBpbWFnZSBmaWxlIChpbiBhcmdiODg4IGZvcm1hdCkKLSAqIEBOb3RlOiBUaGUgY2FsbGVyIG9mIHRoZSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSB0byBmcmVlIHRoZSB5dXYgYnVmZmVyIGFsbG9jYXRlZAotICogQHBhcmFtICAgZmlsZU5hbWU6ICAgICAgIChJTikgUGF0aCB0byB0aGUgZmlsZW5hbWUgb2YgdGhlIGltYWdlIGFyZ2IgZGF0YQotICogQHBhcmFtICAgaGVpZ2h0OiAgICAgKElOKSBIZWlnaHQgb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gICAgIHdpZHRoOiAgICAgICAgICAgICAoT1VUKSBwQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHl1diBkYXRhIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmV0dXJuZWQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IHNwYWNlIHRvIGFkZCBhIG5ldyBlZmZlY3QuCi0gKiBAcmV0dXJuICBNNEVSUl9GSUxFX05PVF9GT1VORDogaWYgdGhlIGZpbGUgcGFzc2VkIGRvZXMgbm90IGV4aXN0cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTHZHZXRJbWFnZVRodW1iTmFpbChjb25zdCBjaGFyICpmaWxlTmFtZSwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9Wb2lkICoqcEJ1ZmZlcikgewotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcmdiUGxhbmUsICp5dXZQbGFuZTsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplX2FyZ2IgPSAod2lkdGggKiBoZWlnaHQgKiA0KTsgLy8gYXJnYiBkYXRhCi0gICAgTTRPU0FfQ29udGV4dCBsSW1hZ2VGaWxlRnAgID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1VJbnQ4ICpwVG1wRGF0YSA9IChNNE9TQV9VSW50OCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfYXJnYiwgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBhcmdiIGRhdGEiKTsKLSAgICBpZihwVG1wRGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJbWFnZSBjbGlwIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAgICAvKiogUmVhZCB0aGUgYXJnYiBkYXRhIGZyb20gdGhlIHBhc3NlZCBmaWxlLiAqLwotICAgIE00T1NBX0VSUiBsZXJyID0gTTRPU0FfZmlsZVJlYWRPcGVuKCZsSW1hZ2VGaWxlRnAsIChNNE9TQV9Wb2lkICopIGZpbGVOYW1lLCBNNE9TQV9rRmlsZVJlYWQpOwotCi0gICAgaWYoKGxlcnIgIT0gTTROT19FUlJPUikgfHwgKGxJbWFnZUZpbGVGcCA9PSBNNE9TQV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIEFMT0dFKCJMVlByZXZpZXdDb250cm9sbGVyOiBDYW4gbm90IG9wZW4gdGhlIGZpbGUgIik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9OT1RfRk9VTkQ7Ci0gICAgfQotICAgIGxlcnIgPSBNNE9TQV9maWxlUmVhZERhdGEobEltYWdlRmlsZUZwLCAoTTRPU0FfTWVtQWRkcjgpcFRtcERhdGEsICZmcmFtZVNpemVfYXJnYik7Ci0gICAgaWYobGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgQUxPR0UoIkxWUHJldmlld0NvbnRyb2xsZXI6IGNhbiBub3QgcmVhZCB0aGUgZGF0YSAiKTsKLSAgICAgICAgTTRPU0FfZmlsZVJlYWRDbG9zZShsSW1hZ2VGaWxlRnApOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIGxlcnI7Ci0gICAgfQotICAgIE00T1NBX2ZpbGVSZWFkQ2xvc2UobEltYWdlRmlsZUZwKTsKLQotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKTsgLy9TaXplIG9mIFlVVjQyMCBkYXRhLgotICAgIHJnYlBsYW5lLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSwgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBjbGlwIFJHQjg4OCBkYXRhIik7Ci0gICAgaWYocmdiUGxhbmUucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJbWFnZSBjbGlwIik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqIFJlbW92ZSB0aGUgYWxwaGEgY2hhbm5lbCAqLwotICAgIGZvciAoTTRPU0FfVUludDMyIGk9MCwgaiA9IDA7IGkgPCBmcmFtZVNpemVfYXJnYjsgaSsrKSB7Ci0gICAgICAgIGlmICgoaSAlIDQpID09IDApIGNvbnRpbnVlOwotICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2ldOwotICAgICAgICBqKys7Ci0gICAgfQotICAgIGZyZWUocFRtcERhdGEpOwotCi0jaWZkZWYgRklMRV9EVU1QCi0gICAgRklMRSAqZnAgPSBmb3BlbigiL3NkY2FyZC9JbnB1dC90ZXN0X3JnYi5yYXciLCAid2IiKTsKLSAgICBpZihmcCA9PSBOVUxMKQotICAgICAgICBBTE9HRSgiRXJyb3JzIGZpbGUgY2FuIG5vdCBiZSBjcmVhdGVkIik7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZ3cml0ZShyZ2JQbGFuZS5wYWNfZGF0YSwgZnJhbWVTaXplLCAxLCBmcCk7Ci0gICAgICAgIGZjbG9zZShmcCk7Ci0gICAgfQotI2VuZGlmCi0gICAgICAgIHJnYlBsYW5lLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICByZ2JQbGFuZS51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIHJnYlBsYW5lLnVfc3RyaWRlID0gd2lkdGgqMzsKLSAgICAgICAgcmdiUGxhbmUudV90b3BsZWZ0ID0gMDsKLQotICAgICAgICB5dXZQbGFuZSA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjogT3V0cHV0IHBsYW5lIFlVViIpOwotICAgICAgICB5dXZQbGFuZVswXS51X2hlaWdodCA9IGhlaWdodDsKLSAgICAgICAgeXV2UGxhbmVbMF0udV93aWR0aCA9IHdpZHRoOwotICAgICAgICB5dXZQbGFuZVswXS51X3N0cmlkZSA9IHdpZHRoOwotICAgICAgICB5dXZQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICB5dXZQbGFuZVswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh5dXZQbGFuZVswXS51X2hlaWdodCAqIHl1dlBsYW5lWzBdLnVfd2lkdGggKiAxLjUsIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0KLSAgICAgICAgeXV2UGxhbmVbMV0udV9oZWlnaHQgPSB5dXZQbGFuZVswXS51X2hlaWdodCA+PjE7Ci0gICAgICAgIHl1dlBsYW5lWzFdLnVfd2lkdGggPSB5dXZQbGFuZVswXS51X3dpZHRoID4+IDE7Ci0gICAgICAgIHl1dlBsYW5lWzFdLnVfc3RyaWRlID0geXV2UGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgeXV2UGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgeXV2UGxhbmVbMV0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoeXV2UGxhbmVbMF0ucGFjX2RhdGEgKyB5dXZQbGFuZVswXS51X2hlaWdodCAqIHl1dlBsYW5lWzBdLnVfd2lkdGgpOwotCi0gICAgICAgIHl1dlBsYW5lWzJdLnVfaGVpZ2h0ID0geXV2UGxhbmVbMF0udV9oZWlnaHQgPj4xOwotICAgICAgICB5dXZQbGFuZVsyXS51X3dpZHRoID0geXV2UGxhbmVbMF0udV93aWR0aCA+PiAxOwotICAgICAgICB5dXZQbGFuZVsyXS51X3N0cmlkZSA9IHl1dlBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgICAgIHl1dlBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHl1dlBsYW5lWzJdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKHl1dlBsYW5lWzFdLnBhY19kYXRhICsgeXV2UGxhbmVbMV0udV9oZWlnaHQgKiB5dXZQbGFuZVsxXS51X3dpZHRoKTsKLQotCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUsIHl1dlBsYW5lKTsKLSAgICAgICAgLy9lcnIgPSBNNFZJRklfQkdSODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lLCB5dXZQbGFuZSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotCi0gICAgICAgIC8vQUxPR0UoIlJHQiB0byBZVVYgZG9uZSIpOwotI2lmZGVmIEZJTEVfRFVNUAotICAgICAgICBGSUxFICpmcDEgPSBmb3BlbigiL3NkY2FyZC9JbnB1dC90ZXN0X3l1di5yYXciLCAid2IiKTsKLSAgICAgICAgaWYoZnAxID09IE5VTEwpCi0gICAgICAgICAgICBBTE9HRSgiRXJyb3JzIGZpbGUgY2FuIG5vdCBiZSBjcmVhdGVkIik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZndyaXRlKHl1dlBsYW5lWzBdLnBhY19kYXRhLCB5dXZQbGFuZVswXS51X2hlaWdodCAqIHl1dlBsYW5lWzBdLnVfd2lkdGggKiAxLjUsIDEsIGZwMSk7Ci0gICAgICAgICAgICBmY2xvc2UoZnAxKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICpwQnVmZmVyID0geXV2UGxhbmVbMF0ucGFjX2RhdGE7Ci0gICAgICAgIGZyZWUoeXV2UGxhbmUpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotfQotTTRPU0FfVm9pZCBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmUsCi0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNFZJRklfVUludDggKmJ1ZmZlciwKLSAgICBNNE9TQV9VSW50MzIgcmVwb3J0ZWRXaWR0aCwgTTRPU0FfVUludDMyIHJlcG9ydGVkSGVpZ2h0KSB7Ci0KLSAgICAvL1kgcGxhbmUKLSAgICBwbGFuZVswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgcGxhbmVbMF0udV9zdHJpZGUgPSByZXBvcnRlZFdpZHRoOwotICAgIHBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcGxhbmVbMF0ucGFjX2RhdGEgPSBidWZmZXI7Ci0KLSAgICAvLyBVIHBsYW5lCi0gICAgcGxhbmVbMV0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVbMV0udV9oZWlnaHQgPSBoZWlnaHQvMjsKLSAgICBwbGFuZVsxXS51X3N0cmlkZSA9IHJlcG9ydGVkV2lkdGggPj4gMTsKLSAgICBwbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBsYW5lWzFdLnBhY19kYXRhID0gYnVmZmVyKyhyZXBvcnRlZFdpZHRoKnJlcG9ydGVkSGVpZ2h0KTsKLQotICAgIC8vIFYgUGxhbmUKLSAgICBwbGFuZVsyXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZVsyXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lWzJdLnVfc3RyaWRlID0gcmVwb3J0ZWRXaWR0aCA+PiAxOwotICAgIHBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcGxhbmVbMl0ucGFjX2RhdGEgPSBwbGFuZVsxXS5wYWNfZGF0YSArICgocmVwb3J0ZWRXaWR0aC8yKSoocmVwb3J0ZWRIZWlnaHQvMikpOwotfQotCi1NNE9TQV9Wb2lkIHByZXBhcmVZVjEySW1hZ2VQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmUsCi0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNE9TQV9VSW50MzIgc3RyaWRlLAotICAgIE00VklGSV9VSW50OCAqYnVmZmVyKSB7Ci0KLSAgICAvL1kgcGxhbmUKLSAgICBwbGFuZVswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgcGxhbmVbMF0udV9zdHJpZGUgPSBzdHJpZGU7Ci0gICAgcGxhbmVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICBwbGFuZVswXS5wYWNfZGF0YSA9IGJ1ZmZlcjsKLQotICAgIC8vIFUgcGxhbmUKLSAgICBwbGFuZVsxXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZVsxXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lWzFdLnVfc3RyaWRlID0gYW5kcm9pZDo6UHJldmlld1JlbmRlcmVyOjpBTElHTihwbGFuZVswXS51X3N0cmlkZS8yLCAxNik7Ci0gICAgcGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBwbGFuZVsxXS5wYWNfZGF0YSA9IChidWZmZXIKLSAgICAgICAgICAgICAgICArIHBsYW5lWzBdLnVfaGVpZ2h0ICogcGxhbmVbMF0udV9zdHJpZGUKLSAgICAgICAgICAgICAgICArIChwbGFuZVswXS51X2hlaWdodC8yKSAqIGFuZHJvaWQ6OlByZXZpZXdSZW5kZXJlcjo6QUxJR04oKAotICAgICAgICAgICAgICAgICBwbGFuZVswXS51X3N0cmlkZSAvIDIpLCAxNikpOwotCi0gICAgLy8gViBQbGFuZQotICAgIHBsYW5lWzJdLnVfd2lkdGggPSB3aWR0aC8yOwotICAgIHBsYW5lWzJdLnVfaGVpZ2h0ID0gaGVpZ2h0LzI7Ci0gICAgcGxhbmVbMl0udV9zdHJpZGUgPSBhbmRyb2lkOjpQcmV2aWV3UmVuZGVyZXI6OkFMSUdOKHBsYW5lWzBdLnVfc3RyaWRlLzIsIDE2KTsKLSAgICBwbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgIHBsYW5lWzJdLnBhY19kYXRhID0gKGJ1ZmZlciArCi0gICAgIHBsYW5lWzBdLnVfaGVpZ2h0ICogYW5kcm9pZDo6UHJldmlld1JlbmRlcmVyOjpBTElHTihwbGFuZVswXS51X3N0cmlkZSwgMTYpKTsKLQotCi19Ci0KLU00T1NBX1ZvaWQgc3dhcEltYWdlUGxhbmVzKAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIpIHsKLQotICAgIHBsYW5lSW5bMF0udV9oZWlnaHQgPSBwbGFuZU91dFswXS51X2hlaWdodDsKLSAgICBwbGFuZUluWzBdLnVfd2lkdGggPSBwbGFuZU91dFswXS51X3dpZHRoOwotICAgIHBsYW5lSW5bMF0udV9zdHJpZGUgPSBwbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICBwbGFuZUluWzBdLnVfdG9wbGVmdCA9IHBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwbGFuZUluWzBdLnBhY19kYXRhID0gcGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBVIHBsYW5lICovCi0gICAgcGxhbmVJblsxXS51X3dpZHRoID0gcGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICBwbGFuZUluWzFdLnVfaGVpZ2h0ID0gcGxhbmVPdXRbMV0udV9oZWlnaHQ7Ci0gICAgcGxhbmVJblsxXS51X3N0cmlkZSA9IHBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHBsYW5lSW5bMV0udV90b3BsZWZ0ID0gcGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHBsYW5lSW5bMV0ucGFjX2RhdGEgPSBwbGFuZU91dFsxXS5wYWNfZGF0YTsKLSAgICAvKioKLSAgICAgKiBWIFBsYW5lICovCi0gICAgcGxhbmVJblsyXS51X3dpZHRoID0gcGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICBwbGFuZUluWzJdLnVfaGVpZ2h0ID0gcGxhbmVPdXRbMl0udV9oZWlnaHQ7Ci0gICAgcGxhbmVJblsyXS51X3N0cmlkZSA9IHBsYW5lT3V0WzJdLnVfc3RyaWRlOwotICAgIHBsYW5lSW5bMl0udV90b3BsZWZ0ID0gcGxhbmVPdXRbMl0udV90b3BsZWZ0OwotICAgIHBsYW5lSW5bMl0ucGFjX2RhdGEgPSBwbGFuZU91dFsyXS5wYWNfZGF0YTsKLQotICAgIGlmKHBsYW5lT3V0WzBdLnBhY19kYXRhID09IChNNFZJRklfVUludDgqKWJ1ZmZlcjEpCi0gICAgewotICAgICAgICBwbGFuZU91dFswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKWJ1ZmZlcjI7Ci0gICAgICAgIHBsYW5lT3V0WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKGJ1ZmZlcjIgKwotICAgICAgICAgcGxhbmVPdXRbMF0udV93aWR0aCpwbGFuZU91dFswXS51X2hlaWdodCk7Ci0KLSAgICAgICAgcGxhbmVPdXRbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoYnVmZmVyMiArCi0gICAgICAgICBwbGFuZU91dFswXS51X3dpZHRoKnBsYW5lT3V0WzBdLnVfaGVpZ2h0ICsKLSAgICAgICAgIHBsYW5lT3V0WzFdLnVfd2lkdGgqcGxhbmVPdXRbMV0udV9oZWlnaHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwbGFuZU91dFswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKWJ1ZmZlcjE7Ci0gICAgICAgIHBsYW5lT3V0WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKGJ1ZmZlcjEgKwotICAgICAgICAgcGxhbmVPdXRbMF0udV93aWR0aCpwbGFuZU91dFswXS51X2hlaWdodCk7Ci0KLSAgICAgICAgcGxhbmVPdXRbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoYnVmZmVyMSArCi0gICAgICAgICBwbGFuZU91dFswXS51X3dpZHRoKnBsYW5lT3V0WzBdLnVfaGVpZ2h0ICsKLSAgICAgICAgIHBsYW5lT3V0WzFdLnVfd2lkdGgqcGxhbmVPdXRbMV0udV9oZWlnaHQpOwotICAgIH0KLQotfQotCi1NNE9TQV9Wb2lkIGNvbXB1dGVQZXJjZW50YWdlRG9uZSgKLSAgICBNNE9TQV9VSW50MzIgY3RzTXMsIE00T1NBX1VJbnQzMiBlZmZlY3RTdGFydFRpbWVNcywKLSAgICBNNE9TQV9VSW50MzIgZWZmZWN0RHVyYXRpb24sIE00T1NBX0RvdWJsZSAqcGVyY2VudGFnZURvbmUpIHsKLQotICAgIE00T1NBX0RvdWJsZSB2aWRlb0VmZmVjdFRpbWUgPTA7Ci0KLSAgICAvLyBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4KLSAgICB2aWRlb0VmZmVjdFRpbWUgPQotICAgICAoTTRPU0FfSW50MzIpKGN0c01zKyAwLjUpIC0gZWZmZWN0U3RhcnRUaW1lTXM7Ci0KLSAgICAvLyBUbyBjYWxjdWxhdGUgJSwgc3Vic3RyYWN0IHRpbWVJbmNyZW1lbnQKLSAgICAvLyBiZWNhdXNlIGVmZmVjdCBzaG91bGQgZmluaXNoIG9uIHRoZSBsYXN0IGZyYW1lCi0gICAgLy8gd2hpY2ggaXMgZnJvbSBDVFMgPSAoZW9mLXRpbWVJbmNyZW1lbnQpIHRpbGwgQ1RTID0gZW9mCi0gICAgKnBlcmNlbnRhZ2VEb25lID0KLSAgICAgdmlkZW9FZmZlY3RUaW1lIC8gKChNNE9TQV9GbG9hdCllZmZlY3REdXJhdGlvbik7Ci0KLSAgICBpZigqcGVyY2VudGFnZURvbmUgPCAwLjApICpwZXJjZW50YWdlRG9uZSA9IDAuMDsKLSAgICBpZigqcGVyY2VudGFnZURvbmUgPiAxLjApICpwZXJjZW50YWdlRG9uZSA9IDEuMDsKLQotfQotCi0KLU00T1NBX1ZvaWQgY29tcHV0ZVByb2dyZXNzRm9yVmlkZW9FZmZlY3QoCi0gICAgTTRPU0FfVUludDMyIGN0c01zLCBNNE9TQV9VSW50MzIgZWZmZWN0U3RhcnRUaW1lTXMsCi0gICAgTTRPU0FfVUludDMyIGVmZmVjdER1cmF0aW9uLCBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyogZXh0UHJvZ3Jlc3MpIHsKLQotICAgIE00T1NBX0RvdWJsZSBwZXJjZW50YWdlRG9uZSA9MDsKLQotICAgIGNvbXB1dGVQZXJjZW50YWdlRG9uZShjdHNNcywgZWZmZWN0U3RhcnRUaW1lTXMsIGVmZmVjdER1cmF0aW9uLCAmcGVyY2VudGFnZURvbmUpOwotCi0gICAgZXh0UHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKSggcGVyY2VudGFnZURvbmUgKiAxMDAwICk7Ci0gICAgZXh0UHJvZ3Jlc3MtPnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpKGN0c01zICsgMC41KTsKLSAgICBleHRQcm9ncmVzcy0+dWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgZXh0UHJvZ3Jlc3MtPmJJc0xhc3QgPSBNNE9TQV9GQUxTRTsKLX0KLQotTTRPU0FfRVJSIHByZXBhcmVGcmFtaW5nU3RydWN0dXJlKAotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogZWZmZWN0c1NldHRpbmdzLCBNNE9TQV9VSW50MzIgaW5kZXgsCi0gICAgTTRWSUZJX1VJbnQ4KiBvdmVybGF5UkdCLCBNNFZJRklfVUludDgqIG92ZXJsYXlZVVYpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gRm9yY2UgaW5wdXQgUkdCIGJ1ZmZlciB0byBldmVuIHNpemUgdG8gYXZvaWQgZXJyb3JzIGluIFlVViBjb252ZXJzaW9uCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy5wRnJhbWluZ0J1ZmZlcjsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCAmIH4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgJiB+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTlVMTDsKLQotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gZWZmZWN0c1NldHRpbmdzW2luZGV4XS51aUR1cmF0aW9uOwotICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9IGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgZnJhbWluZ0N0eC0+dG9wbGVmdF95ID0gZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnRvcGxlZnRfeTsKLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLQotICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyksIE00VlMsCi0gICAgICAoTTRPU0FfQ2hhciopImFscGhhIGJsZW5kaW5nIHN0cnVjdCIpOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lID0KLSAgICAgZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0KLSAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID0KLSAgICAgZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9lbmQgPQotICAgICBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgPQotICAgICBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydCA9Ci0gICAgIGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydDsKLQotICAgIC8vIElmIG5ldyBPdmVybGF5IGJ1ZmZlciwgY29udmVydCBmcm9tIFJHQiB0byBZVVYKLSAgICBpZigob3ZlcmxheVJHQiAhPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSkgfHwgKG92ZXJsYXlZVVYgPT0gTlVMTCkgKSB7Ci0KLSAgICAgICAgLy8gSWYgWVVWIGJ1ZmZlciBleGlzdHMsIGRlbGV0ZSBpdAotICAgICAgICBpZihvdmVybGF5WVVWICE9IE5VTEwpIHsKLSAgICAgICAgICAgZnJlZShvdmVybGF5WVVWKTsKLSAgICAgICAgICAgb3ZlcmxheVlVViA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICBpZihlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MucmdiVHlwZSA9PSBNNFZTUzNHUFBfa1JHQjU2NSkgewotICAgICAgICAvLyBJbnB1dCBSR0I1NjUgcGxhbmUgaXMgcHJvdmlkZWQsCi0gICAgICAgIC8vIGxldCdzIGNvbnZlcnQgaXQgdG8gWVVWNDIwLCBhbmQgdXBkYXRlIGZyYW1pbmcgc3RydWN0dXJlCi0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihmcmFtaW5nQ3R4KTsKLSAgICB9Ci0gICAgZWxzZSBpZihlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MucmdiVHlwZSA9PSBNNFZTUzNHUFBfa1JHQjg4OCkgewotICAgICAgICAvLyBJbnB1dCBSR0I4ODggcGxhbmUgaXMgcHJvdmlkZWQsCi0gICAgICAgIC8vIGxldCdzIGNvbnZlcnQgaXQgdG8gWVVWNDIwLCBhbmQgdXBkYXRlIGZyYW1pbmcgc3RydWN0dXJlCi0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0I4ODh0b1lVVihmcmFtaW5nQ3R4KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgICAgIG92ZXJsYXlZVVYgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhOwotICAgICAgICBvdmVybGF5UkdCID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIEFMT0dWKCIgWVVWIGJ1ZmZlciByZXVzZSIpOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiWVVWIik7Ci0KLSAgICAgICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilvdmVybGF5WVVWOwotCi0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgKwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodDsKLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfd2lkdGggPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9zdHJpZGUgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhICsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQ7Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPnByZXZpZXdPZmZzZXRDbGlwVGltZSA9IC0xOwotCi0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19WaWRlb0VmZmVjdFR5cGUgY29sb3JFZmZlY3QsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMiwgTTRPU0FfVUludDE2IHJnYkNvbG9yRGF0YSkgewotCi0gICAgTTR4VlNTX0NvbG9yU3RydWN0IGNvbG9yQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGNvbG9yQ29udGV4dC5jb2xvckVmZmVjdFR5cGUgPSBjb2xvckVmZmVjdDsKLSAgICBjb2xvckNvbnRleHQucmdiMTZDb2xvckRhdGEgPSByZ2JDb2xvckRhdGE7Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKAotICAgICAoTTRPU0FfVm9pZCAqKSZjb2xvckNvbnRleHQsIHBsYW5lSW4sIHBsYW5lT3V0LCBOVUxMLAotICAgICBjb2xvckVmZmVjdCk7Ci0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBBTE9HVigiTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvciglZCkgZXJyb3IgJWQiLAotICAgICAgICAgICAgY29sb3JFZmZlY3QsIGVycik7Ci0KLSAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIxKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcjEpOwotICAgICAgICAgICAgYnVmZmVyMSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIyKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcjIpOwotICAgICAgICAgICAgYnVmZmVyMiA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvLyBUaGUgb3V0IHBsYW5lIG5vdyBiZWNvbWVzIHRoZSBpbiBwbGFuZSBmb3IgYWRkaW5nIG90aGVyIGVmZmVjdHMKLSAgICBzd2FwSW1hZ2VQbGFuZXMocGxhbmVJbiwgcGxhbmVPdXQsIGJ1ZmZlcjEsIGJ1ZmZlcjIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIGFwcGx5THVtYUVmZmVjdChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHZpZGVvRWZmZWN0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIsIE00T1NBX0ludDMyIGx1bV9mYWN0b3IpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgZXJyID0gTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZSgKLSAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSopcGxhbmVJbiwoTTRWaUNvbUltYWdlUGxhbmUqKXBsYW5lT3V0LAotICAgICAgICAgbHVtX2ZhY3RvciwgTlVMTCk7Ci0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBBTE9HRSgiTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZSglZCkgZXJyb3IgJWQiLCB2aWRlb0VmZmVjdCwgKGludCllcnIpOwotCi0gICAgICAgIGlmKE5VTEwgIT0gYnVmZmVyMSkgewotICAgICAgICAgICAgZnJlZShidWZmZXIxKTsKLSAgICAgICAgICAgIGJ1ZmZlcjE9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIyKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcjIpOwotICAgICAgICAgICAgYnVmZmVyMj0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8vIFRoZSBvdXQgcGxhbmUgbm93IGJlY29tZXMgdGhlIGluIHBsYW5lIGZvciBhZGRpbmcgb3RoZXIgZWZmZWN0cwotICAgIHN3YXBJbWFnZVBsYW5lcyhwbGFuZUluLCBwbGFuZU91dCwoTTRWSUZJX1VJbnQ4ICopYnVmZmVyMSwKLSAgICAgKE00VklGSV9VSW50OCAqKWJ1ZmZlcjIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIGFwcGx5RWZmZWN0c0FuZFJlbmRlcmluZ01vZGUodmVQb3N0UHJvY2Vzc1BhcmFtcyAqcGFyYW1zLAotICAgIE00T1NBX1VJbnQzMiByZXBvcnRlZFdpZHRoLCBNNE9TQV9VSW50MzIgcmVwb3J0ZWRIZWlnaHQpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBsYW5lSW5bM10sIHBsYW5lT3V0WzNdOwotICAgIE00VklGSV9VSW50OCAqZmluYWxPdXRwdXRCdWZmZXIgPSBOVUxMLCAqdGVtcE91dHB1dEJ1ZmZlcj0gTlVMTDsKLSAgICBNNE9TQV9Eb3VibGUgcGVyY2VudGFnZURvbmUgPTA7Ci0gICAgTTRPU0FfSW50MzIgbHVtX2ZhY3RvcjsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCBmaWZ0aWVzQ3R4OwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAwLCBpPTA7Ci0KLSAgICBmcmFtZVNpemUgPSAocGFyYW1zLT52aWRlb1dpZHRoKnBhcmFtcy0+dmlkZW9IZWlnaHQqMykgPj4gMTsKLQotICAgIGZpbmFsT3V0cHV0QnVmZmVyID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSwgTTRWUywKLSAgICAgKE00T1NBX0NoYXIqKSgibHZwcCBmaW5hbE91dHB1dEJ1ZmZlciIpKTsKLQotICAgIGlmKGZpbmFsT3V0cHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImFwcGx5RWZmZWN0c0FuZFJlbmRlcmluZ01vZGU6IG1hbGxvYyBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLy8gYWxsb2NhdGUgdGhlIHRlbXBPdXRwdXRCdWZmZXIKLSAgICB0ZW1wT3V0cHV0QnVmZmVyID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAoKHBhcmFtcy0+dmlkZW9IZWlnaHQqcGFyYW1zLT52aWRlb1dpZHRoKjMpPj4xKSwgTTRWUywgKE00T1NBX0NoYXIqKSgibHZwcCBjb2xvckJ1ZmZlciIpKTsKLQotICAgIGlmKHRlbXBPdXRwdXRCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiYXBwbHlFZmZlY3RzQW5kUmVuZGVyaW5nTW9kZTogbWFsbG9jIGVycm9yIHRlbXBPdXRwdXRCdWZmZXIiKTsKLSAgICAgICAgaWYoTlVMTCAhPSBmaW5hbE91dHB1dEJ1ZmZlcikgewotICAgICAgICAgICAgZnJlZShmaW5hbE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBmaW5hbE91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgdGhlIEluIHBsYW5lCi0gICAgcHJlcGFyZVlVVjQyMEltYWdlUGxhbmUocGxhbmVJbiwgcGFyYW1zLT52aWRlb1dpZHRoLCBwYXJhbXMtPnZpZGVvSGVpZ2h0LAotICAgICAgIHBhcmFtcy0+dmlkQnVmZmVyLCByZXBvcnRlZFdpZHRoLCByZXBvcnRlZEhlaWdodCk7Ci0KLSAgICAvLyBJbml0aWFsaXplIHRoZSBPdXQgcGxhbmUKLSAgICBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShwbGFuZU91dCwgcGFyYW1zLT52aWRlb1dpZHRoLCBwYXJhbXMtPnZpZGVvSGVpZ2h0LAotICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCBwYXJhbXMtPnZpZGVvV2lkdGgsIHBhcmFtcy0+dmlkZW9IZWlnaHQpOwotCi0gICAgLy8gVGhlIHBsYW5lSW4gY29udGFpbnMgdGhlIFlVVjQyMCBpbnB1dCBkYXRhIHRvIHBvc3Rwcm9jZXNzaW5nIG5vZGUKLSAgICAvLyBhbmQgcGxhbmVPdXQgd2lsbCBjb250YWluIHRoZSBZVVY0MjAgZGF0YSB3aXRoIGVmZmVjdAotICAgIC8vIEluIGVhY2ggc3VjY2Vzc2l2ZSBpZiBjb25kaXRpb24sIGFwcGx5IGZpbHRlciB0byBzdWNjZXNzaXZlCi0gICAgLy8gb3V0cHV0IFlVViBmcmFtZSBzbyB0aGF0IGNvbmN1cnJlbnQgZWZmZWN0cyBhcmUgYm90aCBhcHBsaWVkCi0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9CTEFDS0FORFdISVRFKSB7Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZSwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIDApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX1BJTkspIHsKLSAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rLAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgMCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfR1JFRU4pIHsKLSAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbiwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIDApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX1NFUElBKSB7Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEsCi0gICAgICAgICAgICAgIHBsYW5lSW4sIHBsYW5lT3V0LCAoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCAwKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9ORUdBVElWRSkgewotICAgICAgICBlcnIgPSBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlLAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgMCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfR1JBRElFTlQpIHsKLSAgICAgICAgLy8gZmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50LAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aVJnYjE2SW5wdXRDb2xvcik7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfQ09MT1JfUkdCMTYpIHsKLSAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNiwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnhWU1MudWlSZ2IxNklucHV0Q29sb3IpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZJRlRJRVMpIHsKLSAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKGkgPCBwYXJhbXMtPm51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgIGNvbXB1dGVQcm9ncmVzc0ZvclZpZGVvRWZmZWN0KHBhcmFtcy0+dGltZU1zLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24sICZleHRQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgIGlmKHBhcmFtcy0+aXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCkgewotICAgICAgICAgICAgICAgIGZpZnRpZXNDdHgucHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlmdGllc0N0eC5maWZ0aWVzRWZmZWN0RHVyYXRpb24gPQotICAgICAgICAgICAgIDEwMDAvcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aUZpZnRpZXNPdXRGcmFtZVJhdGU7Ci0KLSAgICAgICAgICAgIGZpZnRpZXNDdHguc2hpZnRSYW5kb21WYWx1ZSA9IDA7Ci0gICAgICAgICAgICBmaWZ0aWVzQ3R4LnN0cmlwZVJhbmRvbVZhbHVlID0gMDsKLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKAotICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopJmZpZnRpZXNDdHgsIHBsYW5lSW4sIHBsYW5lT3V0LCAmZXh0UHJvZ3Jlc3MsCi0gICAgICAgICAgICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRmlmdGllcyk7Ci0KLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIk00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyBlcnJvciAweCV4IiwgKHVuc2lnbmVkIGludCllcnIpOwotCi0gICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBmaW5hbE91dHB1dEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWxPdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihOVUxMICE9IHRlbXBPdXRwdXRCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh0ZW1wT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcE91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoZSBvdXQgcGxhbmUgbm93IGJlY29tZXMgdGhlIGluIHBsYW5lIGZvciBhZGRpbmcgb3RoZXIgZWZmZWN0cwotICAgICAgICAgICAgc3dhcEltYWdlUGxhbmVzKHBsYW5lSW4sIHBsYW5lT3V0LChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9GUkFNSU5HKSB7Ci0KLSAgICAgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgZnJhbWluZ0N0eDsKLSAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKSB7Ci0gICAgICAgICAgICAgICAgaWYoKHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lIDw9IHBhcmFtcy0+dGltZU1zICsgcGFyYW1zLT50aW1lT2Zmc2V0KSAmJgotICAgICAgICAgICAgICAgICAgICgocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUrCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uKSA+PSBwYXJhbXMtPnRpbWVNcyArIHBhcmFtcy0+dGltZU9mZnNldCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKGkgPCBwYXJhbXMtPm51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgIGNvbXB1dGVQcm9ncmVzc0ZvclZpZGVvRWZmZWN0KHBhcmFtcy0+dGltZU1zLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24sICZleHRQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgIGVyciA9IHByZXBhcmVGcmFtaW5nU3RydWN0dXJlKCZmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3MsIGksIHBhcmFtcy0+b3ZlcmxheUZyYW1lUkdCQnVmZmVyLAotICAgICAgICAgICAgICAgICAgcGFyYW1zLT5vdmVybGF5RnJhbWVZVVZCdWZmZXIpOwotCi0gICAgICAgICAgICBpZihlcnIgPT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZygKLSAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKSZmcmFtaW5nQ3R4LCBwbGFuZUluLCBwbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHguYWxwaGFCbGVuZGluZ1N0cnVjdCk7Ci0KLSAgICAgICAgICAgIGlmKGZyYW1pbmdDdHguRnJhbWluZ1l1diAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LkZyYW1pbmdZdXYpOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHguRnJhbWluZ1l1diA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0lmIHByZXBhcmVGcmFtaW5nU3RydWN0dXJlIC8gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nCi0gICAgICAgICAgICAvLyByZXR1cm5lZCBlcnJvciwgdGhlbiByZXR1cm4gZnJvbSBmdW5jdGlvbgotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLQotICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gZmluYWxPdXRwdXRCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShmaW5hbE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoTlVMTCAhPSB0ZW1wT3V0cHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUodGVtcE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUaGUgb3V0IHBsYW5lIG5vdyBiZWNvbWVzIHRoZSBpbiBwbGFuZSBmb3IgYWRkaW5nIG90aGVyIGVmZmVjdHMKLSAgICAgICAgICAgIHN3YXBJbWFnZVBsYW5lcyhwbGFuZUluLCBwbGFuZU91dCwoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfRkFERUZST01CTEFDSykgewotICAgICAgICAvKiBmaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkqLwotICAgICAgICBmb3IoaT0wO2k8cGFyYW1zLT5udW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjaykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGkgPCBwYXJhbXMtPm51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgIGNvbXB1dGVQZXJjZW50YWdlRG9uZShwYXJhbXMtPnRpbWVNcywKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSwKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uLCAmcGVyY2VudGFnZURvbmUpOwotCi0gICAgICAgICAgICAvLyBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDI0KQotICAgICAgICAgICAgbHVtX2ZhY3RvciA9IChNNE9TQV9JbnQzMikoIHBlcmNlbnRhZ2VEb25lICogMTAyNCApOwotICAgICAgICAgICAgLy8gQXBwbHkgdGhlIGRhcmtlbmluZyBlZmZlY3QKLSAgICAgICAgICAgIGVyciA9IGFwcGx5THVtYUVmZmVjdChNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrLAotICAgICAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCBsdW1fZmFjdG9yKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZBREVUT0JMQUNLKSB7Ci0gICAgICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQotICAgICAgICBmb3IoaT0wO2k8cGFyYW1zLT5udW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2spCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaSA8IHBhcmFtcy0+bnVtYmVyRWZmZWN0cykgewotICAgICAgICAgICAgY29tcHV0ZVBlcmNlbnRhZ2VEb25lKHBhcmFtcy0+dGltZU1zLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24sICZwZXJjZW50YWdlRG9uZSk7Ci0KLSAgICAgICAgICAgIC8vIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpCi0gICAgICAgICAgICBsdW1fZmFjdG9yID0gKE00T1NBX0ludDMyKSggKDEuMC1wZXJjZW50YWdlRG9uZSkgKiAxMDI0ICk7Ci0gICAgICAgICAgICAvLyBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdAotICAgICAgICAgICAgZXJyID0gYXBwbHlMdW1hRWZmZWN0KE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVUb0JsYWNrLAotICAgICAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCBsdW1fZmFjdG9yKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJkb01lZGlhUmVuZGVyaW5nIENBTEwgZ2V0QnVmZmVyKCkiKTsKLSAgICAvLyBTZXQgdGhlIG91dHB1dCBZVVY0MjAgcGxhbmUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFlWMTIgZm9ybWF0Ci0gICAgLy8gVyAmIEggZXZlbgotICAgIC8vIFlWVSBpbnN0ZWFkIG9mIFlVVgotICAgIC8vIGFsaWduIGJ1ZmZlcnMgb24gMzIgYml0cwotCi0gICAgLy8gWSBwbGFuZQotICAgIC8vaW4gWVYxMiBmb3JtYXQsIHNpemVzIG11c3QgYmUgZXZlbgotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVXaWR0aCA9ICgocGFyYW1zLT5vdXRWaWRlb1dpZHRoICsxKT4+MSk8PDE7Ci0gICAgTTRPU0FfVUludDMyIHl2MTJQbGFuZUhlaWdodCA9ICgocGFyYW1zLT5vdXRWaWRlb0hlaWdodCsxKT4+MSk8PDE7Ci0KLSAgICBwcmVwYXJlWVYxMkltYWdlUGxhbmUocGxhbmVPdXQsIHl2MTJQbGFuZVdpZHRoLCB5djEyUGxhbmVIZWlnaHQsCi0gICAgIChNNE9TQV9VSW50MzIpcGFyYW1zLT5vdXRCdWZmZXJTdHJpZGUsIChNNFZJRklfVUludDggKilwYXJhbXMtPnBPdXRCdWZmZXIpOwotCi0gICAgZXJyID0gYXBwbHlSZW5kZXJpbmdNb2RlKHBsYW5lSW4sIHBsYW5lT3V0LCBwYXJhbXMtPnJlbmRlcmluZ01vZGUpOwotCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBmaW5hbE91dHB1dEJ1ZmZlcikgewotICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgZmluYWxPdXRwdXRCdWZmZXI9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKE00T1NBX05VTEwgIT0gdGVtcE91dHB1dEJ1ZmZlcikgewotICAgICAgICBmcmVlKHRlbXBPdXRwdXRCdWZmZXIpOwotICAgICAgICB0ZW1wT3V0cHV0QnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1YoImRvVmlkZW9Qb3N0UHJvY2Vzc2luZzogYXBwbHlSZW5kZXJpbmdNb2RlIHJldHVybmVkIGVycj0lZCIsZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLWFuZHJvaWQ6OnN0YXR1c190IGdldFZpZGVvU2l6ZUJ5UmVzb2x1dGlvbigKLSAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSByZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwV2lkdGgsIHVpbnQzMl90ICpwSGVpZ2h0KSB7Ci0KLSAgICB1aW50MzJfdCBmcmFtZVdpZHRoLCBmcmFtZUhlaWdodDsKLQotICAgIGlmIChwV2lkdGggPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZ2V0VmlkZW9GcmFtZVNpemVCeVJlc29sdXRpb24gaW52YWxpZCBwb2ludGVyIGZvciBwV2lkdGgiKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKHBIZWlnaHQgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZ2V0VmlkZW9GcmFtZVNpemVCeVJlc29sdXRpb24gaW52YWxpZCBwb2ludGVyIGZvciBwSGVpZ2h0Iik7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3dpdGNoIChyZXNvbHV0aW9uKSB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDEyODsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gOTY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRUVZHQToKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSAxNjA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMTc2OwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDMyMDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQ0lGOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDM1MjsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDY0MDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSA4MDA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa05UU0M6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gNzIwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s2NDBfMzYwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDY0MDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMzYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSA4NTQ7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyODBfNzIwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDEyODA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwODBfNzIwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDEwODA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gOTYwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMTkyMDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMTA4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgdmlkZW8gcmVzb2x1dGlvbiAlZC4iLCByZXNvbHV0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgKnBXaWR0aCA9IGZyYW1lV2lkdGg7Ci0gICAgKnBIZWlnaHQgPSBmcmFtZUhlaWdodDsKLQotICAgIHJldHVybiBhbmRyb2lkOjpPSzsKLX0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGU5MExlZnRZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KSB7Ci0KLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotICAgIE00VklGSV9VSW50MzIgaSxqLCB1X3N0cmlkZTsKLSAgICBNNFZJRklfVUludDggKnBfYnVmX3NyYywgKnBfYnVmX2Rlc3Q7Ci0KLSAgICAvKio8IExvb3Agb24gWSxVIGFuZCBWIHBsYW5lcyAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspIHsKLSAgICAgICAgLyoqPCBHZXQgYWRyZXNzZXMgb2YgZmlyc3QgdmFsaWQgcGl4ZWwgaW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgLyoqPCBBcyB3ZSBoYXZlIGEgLTkwwrAgcm90YXRpb24sIGZpcnN0IG5lZWRlZCBwaXhlbCBpcyB0aGUgdXBwZXItcmlnaHQgb25lICovCi0gICAgICAgIHBfYnVmX3NyYyA9Ci0gICAgICAgICAgICAmKHBQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKSArCi0gICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQgLSAxIDsKLSAgICAgICAgcF9idWZfZGVzdCA9Ci0gICAgICAgICAgICAmKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW3BQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICB1X3N0cmlkZSA9IHBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgIC8qKjwgTG9vcCBvbiBvdXRwdXQgcm93cyAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgLyoqPCBMb29wIG9uIGFsbCBvdXRwdXQgcGl4ZWxzIGluIGEgcm93ICovCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgKnBfYnVmX2Rlc3QrKz0gKnBfYnVmX3NyYzsKLSAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKz0gdV9zdHJpZGU7ICAvKio8IEdvIHRvIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEdvIG9uIG5leHQgcm93IG9mIHRoZSBvdXRwdXQgZnJhbWUgKi8KLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAvKio8IEdvIHRvIG5leHQgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBpbnB1dCBmcmFtZSovCi0gICAgICAgICAgICBwX2J1Zl9zcmMgLT0KLSAgICAgICAgICAgICAgICBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlICogcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCArIDEgOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGU5MFJpZ2h0WVVWNDIwdG9ZVVY0MjAodm9pZCogcFVzZXJEYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkgewotCi0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLSAgICBNNFZJRklfVUludDMyIGksaiwgdV9zdHJpZGU7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotCi0gICAgLyoqPCBMb29wIG9uIFksVSBhbmQgViBwbGFuZXMgKi8KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDA7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKSB7Ci0gICAgICAgIC8qKjwgR2V0IGFkcmVzc2VzIG9mIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIC8qKjwgQXMgd2UgaGF2ZSBhICs5MMKwIHJvdGF0aW9uLCBmaXJzdCBuZWVkZWQgcGl4ZWwgaXMgdGhlIGxlZnQtZG93biBvbmUgKi8KLSAgICAgICAgcF9idWZfc3JjID0KLSAgICAgICAgICAgICYocFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pICsKLSAgICAgICAgICAgICAocFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAqIChwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoIC0gMSkpOwotICAgICAgICBwX2J1Zl9kZXN0ID0KLSAgICAgICAgICAgICYocFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHVfc3RyaWRlID0gcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgLyoqPCBMb29wIG9uIG91dHB1dCByb3dzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAvKio8IExvb3Agb24gYWxsIG91dHB1dCBwaXhlbHMgaW4gYSByb3cgKi8KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAqcF9idWZfZGVzdCsrPSAqcF9idWZfc3JjOwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyAtPSB1X3N0cmlkZTsgIC8qKjwgR28gdG8gdGhlIHByZXZpb3VzIHJvdyAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEdvIG9uIG5leHQgcm93IG9mIHRoZSBvdXRwdXQgZnJhbWUgKi8KLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAvKio8IEdvIHRvIG5leHQgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBpbnB1dCBmcmFtZSovCi0gICAgICAgICAgICBwX2J1Zl9zcmMgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlICogcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCArMSA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTE4MFlVVjQyMHRvWVVWNDIwKHZvaWQqIHBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpIHsKLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotICAgIE00VklGSV9VSW50MzIgaSxqOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdCwgdGVtcF9waXgxOwotCi0gICAgLyoqPCBMb29wIG9uIFksVSBhbmQgViBwbGFuZXMgKi8KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDA7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKSB7Ci0gICAgICAgIC8qKjwgR2V0IGFkcmVzc2VzIG9mIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIHBfYnVmX3NyYyA9Ci0gICAgICAgICAgICAmKHBQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgcF9idWZfZGVzdCA9Ci0gICAgICAgICAgICAmKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW3BQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotCi0gICAgICAgIC8qKjwgSWYgcFBsYW5lSW4gPSBwUGxhbmVPdXQsIHRoZSBhbGdvcml0aG0gd2lsbCBiZSBkaWZmZXJlbnQgKi8KLSAgICAgICAgaWYgKHBfYnVmX3NyYyA9PSBwX2J1Zl9kZXN0KSB7Ci0gICAgICAgICAgICAvKio8IEdldCBBZGRyZXNzIG9mIGxhc3QgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBmcmFtZSAqLwotICAgICAgICAgICAgcF9idWZfZGVzdCArPQotICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlKihwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodC0xKSArCi0gICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGggLSAxOwotCi0gICAgICAgICAgICAvKio8IFdlIGxvb3AgKGhlaWdodC8yKSB0aW1lcyBvbiB0aGUgcm93cy4KLSAgICAgICAgICAgICAqIEluIGNhc2UgdV9oZWlnaHQgaXMgb2RkLCB0aGUgcm93IGF0IHRoZSBtaWRkbGUgb2YgdGhlIGZyYW1lCi0gICAgICAgICAgICAgKiBoYXMgdG8gYmUgcHJvY2Vzc2VkIGFzIG11c3QgYmUgbWlycm9yZWQgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KT4+MSk7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcF9waXgxPSAqcF9idWZfZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgKnBfYnVmX2Rlc3QtLT0gKnBfYnVmX3NyYzsKLSAgICAgICAgICAgICAgICAgICAgKnBfYnVmX3NyYysrID0gdGVtcF9waXgxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKio8IEdvIG9uIG5leHQgcm93IGluIHRvcCBvZiBmcmFtZSAqLwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyArPQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgLyoqPCBHbyB0byB0aGUgbGFzdCBwaXhlbCBpbiBwcmV2aW91cyByb3cgaW4gYm90dG9tIG9mIGZyYW1lKi8KLSAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0IC09Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlIC0gcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqPCBNaXJyb3IgbWlkZGxlIHJvdyBpbiBjYXNlIGhlaWdodCBpcyBvZGQgKi8KLSAgICAgICAgICAgIGlmICgocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQlMikhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcF9idWZfc3JjID0KLSAgICAgICAgICAgICAgICAgICAgJihwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyArPQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSoocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ+PjEpOwotICAgICAgICAgICAgICAgIHBfYnVmX2Rlc3QgPQotICAgICAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKyBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgLyoqPCBXZSBsb29wIHVfd2lkdGgvMiB0aW1lcyBvbiB0aGlzIHJvdy4KLSAgICAgICAgICAgICAgICAgKiAgSW4gY2FzZSB1X3dpZHRoIGlzIG9kZCwgdGhlIHBpeGVsIGF0IHRoZSBtaWRkbGUgb2YgdGhpcyByb3cKLSAgICAgICAgICAgICAgICAgKiByZW1haW5zIHVuY2hhbmdlZCAqLwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aD4+MSk7IGorKykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wX3BpeDE9ICpwX2J1Zl9kZXN0OwotICAgICAgICAgICAgICAgICAgICAqcF9idWZfZGVzdC0tPSAqcF9idWZfc3JjOwotICAgICAgICAgICAgICAgICAgICAqcF9idWZfc3JjKysgPSB0ZW1wX3BpeDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoqPCBHZXQgQWRkcmVzcyBvZiBsYXN0IHBpeGVsIGluIHRoZSBsYXN0IHJvdyBvZiB0aGUgb3V0cHV0IGZyYW1lICovCi0gICAgICAgICAgICBwX2J1Zl9kZXN0ICs9Ci0gICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUqKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0LTEpICsKLSAgICAgICAgICAgICAgICAgcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoIC0gMTsKLQotICAgICAgICAgICAgLyoqPCBMb29wIG9uIHJvd3MgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAqcF9idWZfZGVzdC0tPSAqcF9idWZfc3JjKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqPCBHbyBvbiBuZXh0IHJvdyBpbiB0b3Agb2YgaW5wdXQgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKz0KLSAgICAgICAgICAgICAgICAgICAgcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgLyoqPCBHbyB0byBsYXN0IHBpeGVsIG9mIHByZXZpb3VzIHJvdyBpbiBib3R0b20gb2YgaW5wdXQgZnJhbWUqLwotICAgICAgICAgICAgICAgIHBfYnVmX2Rlc3QgLT0KLSAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUgLSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotTTRPU0FfRVJSIGFwcGx5VmlkZW9Sb3RhdGlvbihNNE9TQV9Wb2lkKiBwQnVmZmVyLCBNNE9TQV9VSW50MzIgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00T1NBX1VJbnQzMiByb3RhdGlvbikgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcGxhbmVJblszXSwgcGxhbmVPdXRbM107Ci0KLSAgICBpZiAocEJ1ZmZlciA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJhcHBseVZpZGVvUm90YXRpb246IE5VTEwgaW5wdXQgZnJhbWUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgTTRPU0FfVUludDgqIG91dFB0ciA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgKHdpZHRoKmhlaWdodCoxLjUpLCBNNFZTLCAoTTRPU0FfQ2hhciopKCJyb3RhdGlvbiBvdXQgcHRyIikpOwotICAgIGlmIChvdXRQdHIgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLy8gSW4gcGxhbmUKLSAgICBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShwbGFuZUluLCB3aWR0aCwKLSAgICAgICAgaGVpZ2h0LCAoTTRWSUZJX1VJbnQ4ICopcEJ1ZmZlciwgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICAvLyBPdXQgcGxhbmUKLSAgICBpZiAocm90YXRpb24gIT0gMTgwKSB7Ci0gICAgICAgIHByZXBhcmVZVVY0MjBJbWFnZVBsYW5lKHBsYW5lT3V0LCBoZWlnaHQsCi0gICAgICAgICAgICB3aWR0aCwgb3V0UHRyLCBoZWlnaHQsIHdpZHRoKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2gocm90YXRpb24pIHsKLSAgICAgICAgY2FzZSA5MDoKLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGU5MFJpZ2h0WVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcGxhbmVJbiwgcGxhbmVPdXQpOwotICAgICAgICAgICAgbWVtY3B5KHBCdWZmZXIsICh2b2lkICopb3V0UHRyLCAod2lkdGgqaGVpZ2h0KjEuNSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxODA6Ci0gICAgICAgICAgICAvLyBJbiBwbGFuZSByb3RhdGlvbiwgc28gcGxhbmVPdXQgPSBwbGFuZUluCi0gICAgICAgICAgICBNNFZJRklfUm90YXRlMTgwWVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcGxhbmVJbiwgcGxhbmVJbik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI3MDoKLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGU5MExlZnRZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwbGFuZUluLCBwbGFuZU91dCk7Ci0gICAgICAgICAgICBtZW1jcHkocEJ1ZmZlciwgKHZvaWQgKilvdXRQdHIsICh3aWR0aCpoZWlnaHQqMS41KSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImludmFsaWQgcm90YXRpb24gcGFyYW0gJWQiLCAoaW50KXJvdGF0aW9uKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGZyZWUoKHZvaWQgKilvdXRQdHIpOwotICAgIHJldHVybiBlcnI7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclRvb2xzLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWI0NjRkYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1ZFX1RPT0xTX0gKLSNkZWZpbmUgQU5EUk9JRF9WRV9UT09MU19ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICJNNFZJRklfQ2xpcC5oIgotI2luY2x1ZGUgIk00VkZMX3RyYW5zaXRpb24uaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTR4VlNTX0FQSS5oIgotI2luY2x1ZGUgIk00eFZTU19JbnRlcm5hbC5oIgotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotI2luY2x1ZGUgIlByZXZpZXdSZW5kZXJlci5oIgotCi0jZGVmaW5lIE1FRElBX1JFTkRFUklOR19JTlZBTElEIDI1NQotI2RlZmluZSBUUkFOU1BBUkVOVF9DT0xPUiAweDdFMAotI2RlZmluZSBMVU1fRkFDVE9SX01BWCAxMAotZW51bSB7Ci0gICAgVklERU9fRUZGRUNUX05PTkUgICAgICAgICAgICAgICA9IDAsCi0gICAgVklERU9fRUZGRUNUX0JMQUNLQU5EV0hJVEUgICAgICA9IDEsCi0gICAgVklERU9fRUZGRUNUX1BJTksgICAgICAgICAgICAgICA9IDIsCi0gICAgVklERU9fRUZGRUNUX0dSRUVOICAgICAgICAgICAgICA9IDQsCi0gICAgVklERU9fRUZGRUNUX1NFUElBICAgICAgICAgICAgICA9IDgsCi0gICAgVklERU9fRUZGRUNUX05FR0FUSVZFICAgICAgICAgICA9IDE2LAotICAgIFZJREVPX0VGRkVDVF9GUkFNSU5HICAgICAgICAgICAgPSAzMiwKLSAgICBWSURFT19FRkZFQ1RfRklGVElFUyAgICAgICAgICAgID0gNjQsCi0gICAgVklERU9fRUZGRUNUX0NPTE9SX1JHQjE2ICAgICAgICA9IDEyOCwKLSAgICBWSURFT19FRkZFQ1RfR1JBRElFTlQgICAgICAgICAgID0gMjU2LAotICAgIFZJREVPX0VGRkVDVF9GQURFRlJPTUJMQUNLICAgICAgPSA1MTIsCi0gICAgVklERU9fRUZGRUNUX0ZBREVUT0JMQUNLICAgICAgICA9IDIwNDgsCi19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRWSUZJX1VJbnQ4ICp2aWRCdWZmZXI7Ci0gICAgTTRPU0FfVUludDMyIHZpZGVvV2lkdGg7Ci0gICAgTTRPU0FfVUludDMyIHZpZGVvSGVpZ2h0OwotICAgIE00T1NBX1VJbnQzMiB0aW1lTXM7Ci0gICAgTTRPU0FfVUludDMyIHRpbWVPZmZzZXQ7IC8vaGFzIHRoZSBkdXJhdGlvbiBvZiBjbGlwcyBwbGF5ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhlIGZsYWcgc2hhbGwgYmUgdXNlZCBmb3IgRnJhbWluZy4KLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIGVmZmVjdHNTZXR0aW5nczsKLSAgICBNNE9TQV9VSW50MzIgbnVtYmVyRWZmZWN0czsKLSAgICBNNE9TQV9VSW50MzIgb3V0VmlkZW9XaWR0aDsKLSAgICBNNE9TQV9VSW50MzIgb3V0VmlkZW9IZWlnaHQ7Ci0gICAgTTRPU0FfVUludDMyIGN1cnJlbnRWaWRlb0VmZmVjdDsKLSAgICBNNE9TQV9Cb29sIGlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQ7Ci0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIHJlbmRlcmluZ01vZGU7Ci0gICAgdWludDhfdCAqcE91dEJ1ZmZlcjsKLSAgICBzaXplX3Qgb3V0QnVmZmVyU3RyaWRlOwotICAgIE00VklGSV9VSW50OCogIG92ZXJsYXlGcmFtZVJHQkJ1ZmZlcjsKLSAgICBNNFZJRklfVUludDgqICBvdmVybGF5RnJhbWVZVVZCdWZmZXI7Ci19IHZlUG9zdFByb2Nlc3NQYXJhbXM7Ci0KLU00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFyVG9ZVVY0MjBTZW1pcGxhbmFyKHZvaWQgKnVzZXJfZGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApOwotTTRWSUZJX1VJbnQ4IE00VklGSV9TZW1pcGxhbmFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICk7Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCxNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLCBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKTsKLQotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApOwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKCBNNE9TQV9Wb2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApOwotCi11bnNpZ25lZCBjaGFyIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX2luLCBNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfb3V0LCB1bnNpZ25lZCBsb25nIGx1bV9mYWN0b3IsIHZvaWQgKnVzZXJfZGF0YSk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpOwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCODg4dG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpOwotTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSk7Ci0KLS8qKyBIYW5kbGUgdGhlIGltYWdlIGZpbGVzIGhlcmUgKi8KLU00T1NBX0VSUiBMdkdldEltYWdlVGh1bWJOYWlsKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNE9TQV9VSW50MzIgd2lkdGgsIE00T1NBX1ZvaWQgKipwQnVmZmVyKTsKLS8qLSBIYW5kbGUgdGhlIGltYWdlIGZpbGVzIGhlcmUgKi8KLQotTTRPU0FfRVJSIGFwcGx5UmVuZGVyaW5nTW9kZShNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQsIE00eFZTU19NZWRpYVJlbmRlcmluZyBtZWRpYVJlbmRlcmluZyk7Ci0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApOwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLU00T1NBX1ZvaWQgcHJlcGFyZVlVVjQyMEltYWdlUGxhbmUoTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lLAotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRWSUZJX1VJbnQ4ICpidWZmZXIsCi0gICAgTTRPU0FfVUludDMyIHJlcG9ydGVkV2lkdGgsIE00T1NBX1VJbnQzMiByZXBvcnRlZEhlaWdodCk7Ci0KLU00T1NBX1ZvaWQgcHJlcGFyZVlWMTJJbWFnZVBsYW5lKE00VklGSV9JbWFnZVBsYW5lICpwbGFuZSwKLSAgICBNNE9TQV9VSW50MzIgd2lkdGgsIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00T1NBX1VJbnQzMiBzdHJpZGUsIE00VklGSV9VSW50OCAqYnVmZmVyKTsKLQotTTRPU0FfVm9pZCBzd2FwSW1hZ2VQbGFuZXMoCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMik7Ci0KLU00T1NBX1ZvaWQgY29tcHV0ZVBlcmNlbnRhZ2VEb25lKAotICAgICBNNE9TQV9VSW50MzIgY3RzTXMsIE00T1NBX1VJbnQzMiBlZmZlY3RTdGFydFRpbWVNcywKLSAgICAgTTRPU0FfVUludDMyIGVmZmVjdER1cmF0aW9uLCBNNE9TQV9Eb3VibGUgKnBlcmNlbnRhZ2VEb25lKTsKLQotTTRPU0FfVm9pZCBjb21wdXRlUHJvZ3Jlc3NGb3JWaWRlb0VmZmVjdCgKLSAgICAgTTRPU0FfVUludDMyIGN0c01zLCBNNE9TQV9VSW50MzIgZWZmZWN0U3RhcnRUaW1lTXMsCi0gICAgIE00T1NBX1VJbnQzMiBlZmZlY3REdXJhdGlvbiwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MqIGV4dFByb2dyZXNzKTsKLQotTTRPU0FfRVJSIHByZXBhcmVGcmFtaW5nU3RydWN0dXJlKAotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogZWZmZWN0c1NldHRpbmdzLCBNNE9TQV9VSW50MzIgaW5kZXgsCi0gICAgTTRWSUZJX1VJbnQ4KiBvdmVybGF5UkdCLCBNNFZJRklfVUludDgqIG92ZXJsYXlZVVYpOwotCi1NNE9TQV9FUlIgYXBwbHlDb2xvckVmZmVjdChNNHhWU1NfVmlkZW9FZmZlY3RUeXBlIGNvbG9yRWZmZWN0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIsIE00T1NBX1VJbnQxNiByZ2JDb2xvckRhdGEpOwotCi1NNE9TQV9FUlIgYXBwbHlMdW1hRWZmZWN0KE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdmlkZW9FZmZlY3QsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMiwgTTRPU0FfSW50MzIgbHVtX2ZhY3Rvcik7Ci0KLU00T1NBX0VSUiBhcHBseUVmZmVjdHNBbmRSZW5kZXJpbmdNb2RlKHZlUG9zdFByb2Nlc3NQYXJhbXMgKnBhcmFtcywKLSAgICBNNE9TQV9VSW50MzIgcmVwb3J0ZWRXaWR0aCwgTTRPU0FfVUludDMyIHJlcG9ydGVkSGVpZ2h0KTsKLQotYW5kcm9pZDo6c3RhdHVzX3QgZ2V0VmlkZW9TaXplQnlSZXNvbHV0aW9uKE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIHJlc29sdXRpb24sCi0gICAgdWludDMyX3QgKnBXaWR0aCwgdWludDMyX3QgKnBIZWlnaHQpOwotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwTGVmdFlVVjQyMHRvWVVWNDIwKHZvaWQqIHBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwUmlnaHRZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGUxODBZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotTTRPU0FfRVJSIGFwcGx5VmlkZW9Sb3RhdGlvbihNNE9TQV9Wb2lkKiBwQnVmZmVyLAotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRPU0FfVUludDMyIHJvdGF0aW9uKTsKLSNlbmRpZiAvLyBBTkRST0lEX1ZFX1RPT0xTX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL29zYWwvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM3Mzc2ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfb3B0aW0uaAotICogQGJyaWVmICAgICAgICBGaWxlIHJlYWRlciBmb3IgU3ltYmlhbgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCB0eXBlcyB0byByZWFkIGEgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVSRUFERVJfT1BUSU1fSAotI2RlZmluZSBNNE9TQV9GSUxFUkVBREVSX09QVElNX0gKLQotI2RlZmluZSBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLQotLyoqLwotI2lmbmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgTTRPU0FfVm9pZCogICAgICAgICgqcEZjdFB0cl9PcGVuKSggTTRPU0FfVm9pZCogZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gKCpwRmN0UHRyX1JlYWQpKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vICk7Ci0gICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAoKnBGY3RQdHJfU2VlaykoIE00T1NBX1ZvaWQqIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gKCpwRmN0UHRyX1RlbGwpKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9JbnQzMiAgICAgICAgKCpwRmN0UHRyX0Nsb3NlKSggTTRPU0FfVm9pZCogZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vICk7Ci0gICAgICAgIE00T1NBX1ZvaWQgICAgICAgICAoKnBGY3RQdHJfQWNjZXNzVHlwZSkoIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2Vzc19JbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogRmlsZU1vZGVBY2Nlc3NfT3V0ICk7Ci0KLSAgICB9IE00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyOwotI2VuZGlmCi0vKiovCi0KLQotLyogUmVhZGVyIEFQSSA6IGJ1ZmZlcml6ZWQgZnVuY3Rpb25zICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSggTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpOwotI2Vsc2UKLSAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltKCBNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIGZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0ciAqRlMpOwotI2VuZGlmCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZERhdGFfb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogc2l6ZSApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2Vla19vcHRpbSggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbiApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uX29wdGltKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gKm9wdGlvblZhbHVlICk7Ci1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb25fb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSApOwotCi0jZW5kaWYgLyogTTRPU0FfRklMRVJFQURFUl9PUFRJTV9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVl9NYWNyb3MuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWX01hY3Jvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOGQ3ZTg1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWX01hY3Jvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgICAgICAgTFZfTWFjcm9zLmgKLSogQHBhciAgICAgICAgTlhQIFNvZnR3YXJlCi0qIEBicmllZiAgICBNYWNyb3MgZGVmaW5pdGlvbiBmb3IgU21hcnRwaG9uZSB0ZWFtCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIExWX01BQ1JPU19ICi0jZGVmaW5lIExWX01BQ1JPU19ICi0KLS8qLS0tLS0tLS0tLS0tKi8KLS8qICAgIElOQ0xVREVTICAqLwotLyotLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ0hFQ0tfUFRSKGZjdCwgcCwgZXJyLCBlcnJWYWx1ZSkKLSogQG5vdGUgICAgVGhpcyBtYWNybyBjaGVja3MgdGhlIHZhbHVlIHAuIElmIGl0IGlzIE5VTEwsIGl0IHNldHMgdGhlIHZhcmlhYmxlIGVycgotKiAgICAgICAgICAgdG8gZXJyVmFsdWUgYW5kIGp1bXBzIHRvIHRoZSBsYWJlbCA8ZmN0Pl9jbGVhblVwLiBBIHRyYWNlIGlzIGRpc3BsYXllZAotKiAgICAgICAgICAgc2lnbmFsbGluZyB0aGUgZXJyb3IsIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgbGluZSBudW1iZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENIRUNLX1BUUihmY3QsIHAsIGVyciwgZXJyVmFsdWUpIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgPT0gKHApKSBcCi0gICAgeyBcCi0gICAgICAgIChlcnIpID0gKGVyclZhbHVlKSA7IFwKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoKE00T1NBX0NoYXIqKSIiICNmY3QgIihMJWQpOiAiICNwICIgaXMgTlVMTCwgcmV0dXJuaW5nICIgI2VyclZhbHVlICIiLF9fTElORV9fKSA7IFwKLSAgICAgICAgZ290byBmY3QjI19jbGVhblVwOyBcCi0gICAgfSBcCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ0hFQ0tfRVJSKGZjdCwgZXJyKQotKiBAbm90ZSAgICBUaGlzIG1hY3JvIGNoZWNrcyB0aGUgdmFsdWUgZXJyLiBJZiBpdCBpcyBub3QgTlVMTCwgYSB0cmFjZSBpcyBkaXNwbGF5ZWQKLSogICAgICAgICAgIHNpZ25hbGxpbmcgdGhlIGVycm9yLCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgdGhlIGxpbmUgbnVtYmVyLiBUaGUgbWFjcm8KLSogICAgICAgICAgIGp1bXBzIHRvIHRoZSBsYWJlbCA8ZmN0Pl9jbGVhblVwLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBDSEVDS19FUlIoZmN0LCBlcnIpIFwKLXsgXAotICAgIGlmKE00Tk9fRVJST1IgIT0gKGVycikpIFwKLSAgICB7IFwKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoKE00T1NBX0NoYXIqKSIhISEgIiAjZmN0ICIoTCVkKTogRVJST1IgMHglLjh4IHJldHVybmVkIixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXyxlcnIpIDsgXAotICAgICAgICBnb3RvIGZjdCMjX2NsZWFuVXA7IFwKLSAgICB9IFwKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIENIRUNLX0VSUihmY3QsIGVycikKLSogQG5vdGUgICAgVGhpcyBtYWNybyBjb21wYXJlcyBhIGN1cnJlbnQgc3RhdGUgd2l0aCBhIHN0YXRlIHZhbHVlLiBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsCi0qICAgICAgICAgICBlcnIgaXMgc2V0IHRvIE00RVJSX1NUQVRFLgotKiAgICAgICAgICAgQSB0cmFjZSBpcyBkaXNwbGF5ZWQgc2lnbmFsbGluZyB0aGUgZXJyb3IsIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgbGluZSBudW1iZXIuCi0qICAgICAgICAgICBUaGUgbWFjcm8ganVtcHMgdG8gdGhlIGxhYmVsIDxmY3Q+X2NsZWFuVXAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lICAgIENIRUNLX1NUQVRFKGZjdCwgc3RhdGVWYWx1ZSwgc3RhdGUpIFwKLXsgXAotICAgIGlmKChzdGF0ZVZhbHVlKSAhPSAoc3RhdGUpKSBcCi0gICAgeyBcCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKCIiICNmY3QgIiBjYWxsZWQgaW4gYmFkIHN0YXRlICVkIiwgc3RhdGUpIDsgXAotICAgICAgICAoZXJyKSA9IE00RVJSX1NUQVRFIDsgXAotICAgICAgICBnb3RvIGZjdCMjX2NsZWFuVXA7IFwKLSAgICB9IFwKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBTQUZFX0ZSRUUocCkKLSogQG5vdGUgICAgVGhpcyBtYWNybyBjaGVja3MgdGhlIHZhbHVlIG9mIHAgaXMgbm90IE5VTEwuIElmIGl0IGlzIE5VTEwsIGl0IGRvZXMKLSogICAgICAgICAgIG5vdGhpbmcuIEVsc2UsIHAgaXMgZGUgYWxsb2NhdGVkIGFuZCBzZXQgdG8gTlVMTC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU0FGRV9GUkVFKHApIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgIT0gKHApKSBcCi0gICAgeyBcCi0gICAgICAgIGZyZWUoKHApKSA7IFwKLSAgICAgICAgKHApID0gTTRPU0FfTlVMTCA7IFwKLSAgICB9IFwKLX0KLQotCi0KLSNlbmRpZiAvKi0tLSAgTFZfTUFDUk9TX0ggLS0tKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2hhclN0YXIuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0NoYXJTdGFyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2MzE2ZjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2hhclN0YXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0NoYXJTdGFyLmgKLSAqIEBpbmdyb3VwCi0gKiBAYnJpZWYgICAgICAgIGV4dGVybmFsIEFQSSBvZiB0aGUgQ2hhciBTdGFyIHNldCBvZiBmdW5jdGlvbnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0NIQVJTVEFSX0gKLSNkZWZpbmUgTTRPU0FfQ0hBUlNUQVJfSAotCi0vKiBnZW5lcmFsIE9TQUwgdHlwZXMgYW5kIHByb3RvdHlwZXMgaW5jbHVzaW9uICAgICAgICAgICAgICAgICAgICAgICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0KLS8qIHR5cGVzIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0Ffa2NockRlYyAgPSAweDAxLAotICAgTTRPU0Ffa2NockhleGEgPSAweDAyLAotICAgTTRPU0Ffa2Nock9jdCAgPSAweDAzCi19IE00T1NBX2Nock51bUJhc2U7Ci0KLS8qIGVycm9yIGFuZCB3YXJuaW5nIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRFUlJfQ0hSX1NUUl9PVkVSRkxPVyBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMSkKLSNkZWZpbmUgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMikKLSNkZWZpbmUgTTRXQVJfQ0hSX05PVF9GT1VORCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMSkKLSNkZWZpbmUgTTRXQVJfQ0hSX05VTV9SQU5HRSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMikKLSNkZWZpbmUgTTRXQVJfQ0hSX05FR0FUSVZFICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMykKLQotLyogcHJvdG90eXBlcyBvZiB0aGUgQ2hhciBTdGFyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJOQ29weSAgICAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW4yQ29weSk7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NockFyZUlkZW50aWNhbCAgIChNNE9TQV9DaGFyICAgKnN0ckluMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpzdHJJbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgICpyZXN1bHQpOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJHZXRVSW50MzIgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICp2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyR2V0VUludDE2ICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiAqdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipzdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSk7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NoclNQcmludGYgICAgICAgICAoTTRPU0FfQ2hhciAgKnN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHN0ck91dE1heExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DbG9jay5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTJlYTY5Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfQ2xvY2suaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIGNsb2NrIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9DTE9DS19ICi0jZGVmaW5lIE00T1NBX0NMT0NLX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0KLQotI2RlZmluZSBNNFdBUl9USU1FU0NBTEVfVE9PX0JJRyAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DTE9DSywweDAwMDAwMSkgLyoqPCBUaW1lIHByZWNpc2lvbiB0b28gaGlnaCBmb3IgdGhlIHN5c3RlbSovCi0jZGVmaW5lIE00RVJSX0NMT0NLX0JBRF9SRUZfWUVBUiAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00T1NBX0NMT0NLLDB4MDAwMDAxKSAvKio8IElucHV0IHllYXIgb2YgcmVmZXJlbmNlIGlzIG5laXRoZXIgMTkwMCwgbm9yIDE5NzAgbm9yIDIwMDAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi1NNE9TQUxfQ0xPQ0tfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2Nsb2NrR2V0VGltZShNNE9TQV9UaW1lKiBwVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0aW1lc2NhbGUpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLypNNE9TQV9DTE9DS19IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ29yZUlELmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9Db3JlSUQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE3MjgwMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9Db3JlSUQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE9TQV9Db3JlSUQuaAotICogQGJyaWVmICBkZWZpbmVzIHRoZSB1bmlxdWVzIGNvbXBvbmVudCBpZGVudGlmaWVycyB1c2VkIGZvciBtZW1vcnkgbWFuYWdlbWVudAotICogICAgICAgICBhbmQgb3B0aW9uSUQgbWVjaGFuaXNtCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNE9TQV9DT1JFSURfSF9fCi0jZGVmaW5lIF9fTTRPU0FfQ09SRUlEX0hfXwotCi0vKiBDb3JlSWQgYXJlIGRlZmluZWQgb24gMTQgYml0cyAqLwotLyogd2Ugc3RhcnQgZnJvbSAweDAxMDAsIGxvd2VyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIG9zYWwgY29yZSBjb21wb25lbnRzICovCi0KLS8qIHJlYWRlciBzaGVsbHMqLwotI2RlZmluZSBNNFJFQURFUl9DT01NT04gICAgIDB4MDEwMAotI2RlZmluZSBNNFJFQURFUl9BVkkgICAgICAgIDB4MDEwMQotI2RlZmluZSBNNFJFQURFUl9BTVIgICAgICAgIDB4MDEwMgotI2RlZmluZSBNNFJFQURFUl8zR1AgICAgICAgIDB4MDEwMwotI2RlZmluZSBNNFJFQURFUl9ORVQgICAgICAgIDB4MDEwNAotI2RlZmluZSBNNFJFQURFUl8zR1BfSFRUUCAgIDB4MDEwNQotI2RlZmluZSBNNFJFQURFUl9NUDMgICAgICAgIDB4MDEwNgotI2RlZmluZSBNNFJFQURFUl9XQVYgICAgICAgIDB4MDEwNwotI2RlZmluZSBNNFJFQURFUl9NSURJICAgICAgIDB4MDEwOAotI2RlZmluZSBNNFJFQURFUl9BU0YgICAgICAgIDB4MDEwOQotI2RlZmluZSBNNFJFQURFUl9SRUFMICAgICAgICAweDAxMEEKLSNkZWZpbmUgTTRSRUFERVJfQUFDICAgICAgICAweDAxMEIKLSNkZWZpbmUgTTRSRUFERVJfRkxFWCAgICAgICAgMHgwMTBDCi0jZGVmaW5lIE00UkVBREVSX0JCQSAgICAgICAgMHgwMTBECi0jZGVmaW5lIE00UkVBREVSX1NZTlRIRVNJU19BVURJTyAgICAweDAxMEUKLSNkZWZpbmUgTTRSRUFERVJfSlBFRyAgICAgICAgMHgwMTBGCi0KLQotLyogd3JpdGVyIHNoZWxscyovCi0jZGVmaW5lIE00V1JJVEVSX0NPTU1PTiAgICAgMHgwMTEwCi0jZGVmaW5lIE00V1JJVEVSX0FWSSAgICAgICAgMHgwMTExCi0jZGVmaW5lIE00V1JJVEVSX0FNUiAgICAgICAgMHgwMTEyCi0jZGVmaW5lIE00V1JJVEVSXzNHUCAgICAgICAgMHgwMTEzCi0jZGVmaW5lIE00V1JJVEVSX0pQRUcgICAgICAgIDB4MDExNgotI2RlZmluZSBNNFdSSVRFUl9NUDMgICAgICAgIDB4MDExNwotCi0vKiBkZWNvZGVyIHNoZWxscyAqLwotI2RlZmluZSBNNERFQ09ERVJfQ09NTU9OICAgIDB4MDEyMAotI2RlZmluZSBNNERFQ09ERVJfSlBFRyAgICAgIDB4MDEyMQotI2RlZmluZSBNNERFQ09ERVJfTVBFRzQgICAgIDB4MDEyMgotI2RlZmluZSBNNERFQ09ERVJfQVVESU8gICAgIDB4MDEyMwotI2RlZmluZSBNNERFQ09ERVJfQVZDICAgICAgIDB4MDEyNAotI2RlZmluZSBNNERFQ09ERVJfTUlESSAgICAgIDB4MDEyNQotI2RlZmluZSBNNERFQ09ERVJfV01BICAgICAgICAweDAxMjYKLSNkZWZpbmUgTTRERUNPREVSX1dNViAgICAgICAgMHgwMTI3Ci0jZGVmaW5lIE00REVDT0RFUl9STVYgICAgICAgIDB4MDEyOAotI2RlZmluZSBNNERFQ09ERVJfUk1BICAgICAgICAweDAxMjkKLSNkZWZpbmUgTTRERUNPREVSX0FBQyAgICAgICAweDAxMkEKLSNkZWZpbmUgTTRERUNPREVSX0JFQVRCUkVXICAweDAxMkIKLSNkZWZpbmUgTTRERUNPREVSX0VYVEVSTkFMICAweDAxMkMKLQotLyogZW5jb2RlciBzaGVsbHMgKi8KLSNkZWZpbmUgTTRFTkNPREVSX0NPTU1PTiAgICAweDAxMzAKLSNkZWZpbmUgTTRFTkNPREVSX0pQRUcgICAgICAweDAxMzEKLSNkZWZpbmUgTTRFTkNPREVSX01QRUc0ICAgICAweDAxMzIKLSNkZWZpbmUgTTRFTkNPREVSX0FVRElPICAgICAweDAxMzMKLSNkZWZpbmUgTTRFTkNPREVSX1ZJRF9OVUxMICAweDAxMzQKLSNkZWZpbmUgTTRFTkNPREVSX01KUEVHICAgICAgICAweDAxMzUKLSNkZWZpbmUgTTRFTkNPREVSX01QMyAgICAgICAgMHgwMTM2Ci0jZGVmaW5lIE00RU5DT0RFUl9IMjY0ICAgICAgICAweDAxMzcKLSNkZWZpbmUgTTRFTkNPREVSX0FBQyAgICAgICAgMHgwMTM4Ci0jZGVmaW5lIE00RU5DT0RFUl9BTVJOQiAgICAgICAgMHgwMTM5Ci0jZGVmaW5lIE00RU5DT0RFUl9BVURfTlVMTCAgMHgwMTNBCi0jZGVmaW5lIE00RU5DT0RFUl9FWFRFUk5BTCAgMHgwMTNCCi0KLS8qIGNvcmVzICovCi0jZGVmaW5lIE00SlBHX0RFQ09ERVIgICAgICAgMHgwMTQwCi0jZGVmaW5lIE00SlBHX0VOQ09ERVIgICAgICAgMHgwMTQxCi0KLSNkZWZpbmUgTTRNUDRfREVDT0RFUiAgICAgICAweDAxNDIKLSNkZWZpbmUgTTRNUDRfRU5DT0RFUiAgICAgICAweDAxNDMKLQotI2RlZmluZSBNNEFWSV9DT01NT04gICAgICAgIDB4MDE0NAotI2RlZmluZSBNNEFWSV9SRUFERVIgICAgICAgIDB4MDE0NQotI2RlZmluZSBNNEFWSV9XUklURVIgICAgICAgIDB4MDE0NgotCi0jZGVmaW5lIE00SFRUUF9FTkdJTkUgICAgICAgMHgwMTQ3Ci0KLSNkZWZpbmUgTTRPU0FfVE1QRklMRSAgICAgICAweDAxNDgKLSNkZWZpbmUgTTRUT09MX1RJTUVSICAgICAgICAweDAxNDkKLQotI2RlZmluZSBNNEFNUl9SRUFERVIgICAgICAgIDB4MDE0QQotCi0jZGVmaW5lIE00TVAzX1JFQURFUiAgICAgICAgMHgwMTRCCi0KLSNkZWZpbmUgTTRXQVZfUkVBREVSICAgICAgICAweDAxNEMKLSNkZWZpbmUgTTRXQVZfV1JJVEVSICAgICAgICAweDAxNEQKLSNkZWZpbmUgTTRXQVZfQ09NTU9OICAgICAgICAweDAxNEUKLQotI2RlZmluZSBNNEFEVFNfUkVBREVSICAgICAgICAweDAxNEYKLSNkZWZpbmUgTTRBRElGX1JFQURFUiAgICAgICAgMHgwMTZBCi0KLSNkZWZpbmUgTTRTUFMgICAgICAgICAgICAgICAweDAxNTAKLSNkZWZpbmUgTTRFWElGX0RFQ09ERVIgICAgICAweDAxNTEKLSNkZWZpbmUgTTRFWElGX0VOQ09ERVIgICAgICAweDAxNTIKLSNkZWZpbmUgTTRHSUZfREVDT0RFUiAgICAgICAweDAxNTMKLSNkZWZpbmUgTTRHSUZfRU5DT0RFUiAgICAgICAweDAxNTQKLSNkZWZpbmUgTTRQTkdfREVDT0RFUiAgICAgICAweDAxNTUKLSNkZWZpbmUgTTRQTkdfRU5DT0RFUiAgICAgICAweDAxNTYKLSNkZWZpbmUgTTRXQk1QX0RFQ09ERVIgICAgICAweDAxNTcKLSNkZWZpbmUgTTRXQk1QX0VOQ09ERVIgICAgICAweDAxNTgKLQotI2RlZmluZSBNNEFNUl9XUklURVIgICAgICAgIDB4MDE1OSAgICAvKio8IG5vIHJvb20gdG8gcHV0IGl0IGFsb25nIE00QU1SX1JFQURFUiAqLwotCi0KLSNkZWZpbmUgTTRBVkNfREVDT0RFUiAgICAgICAweDAxNUEKLSNkZWZpbmUgTTRBVkNfRU5DT0RFUiAgICAgICAweDAxNUIKLQotI2RlZmluZSBNNEFTRl9SRUFERVIgICAgICAgIDB4MDE1QwotI2RlZmluZSBNNFdNRFJNX0FHRU5UICAgICAgICAweDAxNUQKLSNkZWZpbmUgTTRNSURJX1JFQURFUiAgICAgICAgMHgwMTYyICAgIC8qKjwgbm8gcm9vbSBiZWZvcmUgdGhlIHByZXNlbnRlcnMgKi8KLSNkZWZpbmUgTTRSTV9SRUFERVIgICAgICAgICAweDE2MwotI2RlZmluZSBNNFJNVl9ERUNPREVSICAgICAgICAweDE2NAotI2RlZmluZSBNNFJNQV9ERUNPREVSICAgICAgICAweDE2NQotCi0jZGVmaW5lIE00VE9PTF9YTUwgICAgICAgICAgICAweDAxNjYKLSNkZWZpbmUgTTRUT09MX0VGUiAgICAgICAgICAgIDB4MDE2NyAgICAvKio8IERlY3J5cHRpb24gbW9kdWxlIGZvciBWaWRlbyBBcnRpc3QgKi8KLSNkZWZpbmUgTTRJQUxfRlROICAgICAgICAgICAgMHgwMTY4ICAgIC8qIEZUTiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUFMICovCi0jZGVmaW5lIE00RlROICAgICAgICAgICAgICAgIDB4MDE2OSAgICAvKiBGVE4gbGlicmFyeSAqLwotCi0vKiBwcmVzZW50ZXIgKi8KLSNkZWZpbmUgTTRQUkVTRU5URVJfQVVESU8gICAweDAxNjAKLSNkZWZpbmUgTTRQUkVTRU5URVJfVklERU8gICAweDAxNjEKLQotLyogaGlnaCBsZXZlbCBpbnRlcmZhY2VzICh2cHMsIGV0Yy4uKSovCi0jZGVmaW5lIE00VlBTICAgICAgICAgICAgICAgMHgwMTcwCi0jZGVmaW5lIE00VlRTICAgICAgICAgICAgICAgMHgwMTcxCi0jZGVmaW5lIE00VlhTICAgICAgICAgICAgICAgMHgwMTcyCi0jZGVmaW5lIE00Q0FMTEJBQ0sgICAgICAgICAgMHgwMTczCi0jZGVmaW5lIE00VkVTICAgICAgICAgICAgICAgMHgwMTc0Ci0jZGVmaW5lIE00UFJFUFJPQ0VTU19WSURFTyAgMHgwMTc1Ci0jZGVmaW5lIE00R1JBQl9BVURJTyAgICAgICAgMHgwMTc2Ci0jZGVmaW5lIE00R1JBQl9WSURFTyAgICAgICAgMHgwMTc3Ci0jZGVmaW5lIE00VlNTQVZJICAgICAgICAgICAgMHgwMTc4Ci0jZGVmaW5lIE00VlNTM0dQUCAgICAgICAgICAgMHgwMTc5Ci0jZGVmaW5lIE00UFRPM0dQUCAgICAgICAgICAgMHgwMTdBCi0jZGVmaW5lIE00UFZYX1BBUlNFUiAgICAgICAgMHgwMTdCCi0jZGVmaW5lIE00VkNTICAgICAgICAgICAgICAgIDB4MDE3QwotI2RlZmluZSBNNE1DUyAgICAgICAgICAgICAgICAweDAxN0QKLSNkZWZpbmUgTTRNTk1DICAgICAgICAgICAgICAgIDB4MDE4MCAgICAvKio8IG1ubSBjb250cm9sbGVyICovCi0jZGVmaW5lIE00VFRFWFRfUEFSU0VSICAgICAgMHgwMTgxICAgIC8qKjwgdGltZWQgdGV4dCAqLwotI2RlZmluZSBNNE1NICAgICAgICAgICAgICAgIDB4MDE4MiAgICAvKio8IE11c2ljIG1hbmFnZXIgKi8KLSNkZWZpbmUgTTRNRFAgICAgICAgICAgICAgICAgMHgwMTgzICAgIC8qKjwgTWV0YWRhdGEgcGFyc2VyICovCi0jZGVmaW5lIE00TU1TUUxDT1JFICAgICAgICAgICAgMHgwMTg0Ci0jZGVmaW5lIE00VlBTSUwgICAgICAgICAgICAgICAgMHgwMTg1Ci0jZGVmaW5lIE00RklMRUlMICAgICAgICAgICAgMHgwMTg2IC8qIElMIGZpbGUgSW50ZXJmYWNlICovCi0jZGVmaW5lIE00TVUgICAgICAgICAgICAgICAgMHgwMTg3Ci0jZGVmaW5lIE00VkVFICAgICAgICAgICAgICAgIDB4MDE4OCAgLyoqPCBWaWRlbyBlZmZlY3QgZW5naW5lICovCi0jZGVmaW5lIE00VkEgICAgICAgICAgICAgICAgMHgwMTg5IC8qIFZpZGVvQXJ0aXN0ICovCi0jZGVmaW5lIE00SlRTICAgICAgICAgICAgICAgIDB4MDE4QQotI2RlZmluZSBNNEpUU0lMICAgICAgICAgICAgICAgIDB4MDE4QgotI2RlZmluZSBNNEFJUiAgICAgICAgICAgICAgICAweDAxOEMgIC8qKjwgQUlSICovCi0jZGVmaW5lIE00U1BFICAgICAgICAgICAgICAgIDB4MDE4RCAgLyoqPCBTdGlsbCBwaWN0dXJlIGVkaXRvciAqLwotI2RlZmluZSBNNFZTICAgICAgICAgICAgICAgIDB4MDE4RSAgICAvKio8IFZpZGVvIFN0dWRpbyAoeFZTUykgKi8KLSNkZWZpbmUgTTRWRVNJTCAgICAgICAgICAgICAgICAweDAxOEYgICAgLyoqPCBWRVMgaWwgKi8KLSNkZWZpbmUgTTRJRDMgICAgICAgICAgICAgICAgMHgwMTkwICAgIC8qKjwgSUQzIFRhZyBNb2R1bGUgKi8KLSNkZWZpbmUgTTRTQyAgICAgICAgICAgICAgICAweDAxOTEgICAgLyoqPCBNZWRpYSBTY2FubmVyICovCi0jZGVmaW5lIE00VEcgICAgICAgICAgICAgICAgMHgwMTkyICAvKio8IFRodW1ibmFpbCBHZW5lcmF0b3IqLwotI2RlZmluZSBNNFRTICAgICAgICAgICAgICAgIDB4MDE5MyAgICAvKio8IFRodW1ibmFpbCBzdG9yYWdlICovCi0jZGVmaW5lIE00TUIgICAgICAgICAgICAgICAgMHgwMTk0ICAgIC8qKjwgTWVkaWEgYnJvd3NlciAqLwotCi0vKiBoaWdoIGxldmVsIGFwcGxpY2F0aW9uICh0ZXN0IG9yIGNsaWVudCBhcHApICovCi0jZGVmaW5lIE00QVBQTEkgICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIE00VkFfQVBQTEkgICAgICAgICAgICAweDAyMDEgICAgLyoqPCBWaWRlbyBBcnRpc3QgdGVzdCBhcHBsaWNhdGlvbiAqLwotCi0vKiBleHRlcm5hbCBjb21wb25lbnRzIChIVyB2aWRlbyBjb2RlY3MsIGV0Yy4pICovCi0jZGVmaW5lIE00VkRfRVhURVJOQUwgICAgICAgIDB4MDMwMAotI2RlZmluZSBNNFZFX0VYVEVSTkFMICAgICAgICAweDAzMDEKLQotCi0vKiBwcmlvcml0eSB0byBjb21iaW5lIHdpdGggbW9kdWxlIGlkcyAqLwotI2RlZmluZSBNNEhJR0hfUFJJT1JJVFkgICAgIDB4QzAwMAotI2RlZmluZSBNNE1FRElVTV9QUklPUklUWSAgIDB4ODAwMAotI2RlZmluZSBNNExPV19QUklPUklUWSAgICAgIDB4NDAwMAotI2RlZmluZSBNNERFRkFVTFRfUFJJT1JJVFkgIDB4MDAwMAotCi0KLSNlbmRpZiAvKl9fTTRPU0FfQ09SRUlEX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0RlYnVnLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9EZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjZhYjUxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRGVidWcuaAotICogQGJyaWVmICAgICAgICBEZWJ1ZyBhbmQgVHJhY2UgTWFjcm8KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBfTTRPU0FfREVCVUdfSF8KLSNkZWZpbmUgX000T1NBX0RFQlVHX0hfCi0KLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLQotLyogZGVmYXV0IHZhbHVlLCBkZWZpbmVkIG9ubHkgaWYgbm90IGRlZmluZWQgYWxyZWFkeS4gKi8KLSNpZm5kZWYgTTRUUkFDRV9JRAotI2RlZmluZSBNNFRSQUNFX0lEIE00VU5LTk9XTl9DT1JFSUQKLSNlbmRpZiAvKiBNNFRSQUNFX0lEIHVuZGVmaW5lZCAqLwotCi0KLSNkZWZpbmUgTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgMAotCi0jaWZuZGVmIE00T1NBX0RFQlVHX0xFVkVMCi0jZGVmaW5lIE00T1NBX0RFQlVHX0xFVkVMICAgICAgIDAKLSNlbmRpZgotCi0KLSNkZWZpbmUgTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgMAotCi0jaWZuZGVmIE00T1NBX1RSQUNFX0xFVkVMCi0jZGVmaW5lIE00T1NBX1RSQUNFX0xFVkVMICAgICAgIDAKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0KLSNpZiAoTTRPU0FfREVCVUdfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDEpCi0KLS8qIERlYnVnIG1hY3JvcyAqLwotZXh0ZXJuIE00T1NBX1ZvaWQgTTRPU0FfREVCVUdfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nQ29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlIgcmV0dXJuZWRFcnJvcik7Ci0KLQotI2RlZmluZSBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIGxldmVsKVwKLSAgICAgIGlmKGNvbmQpXAotICAgICAge1wKLSAgICAgICAgIE00T1NBX0RFQlVHX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXywgbGV2ZWwsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopI2NvbmQsIChNNE9TQV9DaGFyKiltc2csXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3JDb2RlKSk7XAotICAgICAgICAgcmV0dXJuKGVycm9yQ29kZSk7XAotICAgICAgfQotCi0jZGVmaW5lIE00T1NBX0RFQlVHKGVycm9yQ29kZSwgbXNnKVwKLSAgICAgICAgIE00T1NBX0RFQlVHX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXywgMSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikjZXJyb3JDb2RlLCAoTTRPU0FfQ2hhciopbXNnLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yQ29kZSkpOwotCi0jZWxzZSAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkqLwotCi0KLSNkZWZpbmUgTTRPU0FfREVCVUcoZXJyb3JDb2RlLCBtc2cpCi0KLSNlbmRpZiAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkqLwotCi0KLQotI2lmIChNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMShjb25kLCBlcnJvckNvZGUsIG1zZylcCi0gICAgICAgICBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIDEpCi0jZWxzZQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYxKGNvbmQsIGVycm9yQ29kZSwgbXNnKQotI2VuZGlmIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAxKSovCi0KLQotI2lmIChNNE9TQV9ERUJVR19MRVZFTCA+PSAyKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMikKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMihjb25kLCBlcnJvckNvZGUsIG1zZylcCi0gICAgICAgICBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIDIpCi0jZWxzZQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYyKGNvbmQsIGVycm9yQ29kZSwgbXNnKQotI2VuZGlmIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAyKSovCi0KLQotI2lmIChNNE9TQV9ERUJVR19MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMykKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMyhjb25kLCBlcnJvckNvZGUsIG1zZylcCi0gICAgICAgICBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIDMpCi0jZWxzZQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYzKGNvbmQsIGVycm9yQ29kZSwgbXNnKQotI2VuZGlmIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAzKSovCi0KLQotCi0vKiBUcmFjZSBtYWNyb3MgKi8KLQotI2lmIChNNE9TQV9UUkFDRV9MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMSkKLQotZXh0ZXJuIE00T1NBX1ZvaWQgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nTXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gKTsKLQotCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0V4XzAobXNnLCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLCAoTTRPU0FfQ2hhciopbXNnKTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF8xKG1zZywgcGFyYW0xLCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NvcmVJRClNNFRSQUNFX0lELCBsZXZlbCwgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xKTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF8yKG1zZywgcGFyYW0xLCBwYXJhbTIsIGxldmVsKVwKLSAgICAgIE00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Db3JlSUQpTTRUUkFDRV9JRCwgbGV2ZWwsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopbXNnLCBwYXJhbTEsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIpOwotCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0V4XzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLCAoTTRPU0FfQ2hhciopbXNnLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0xLHBhcmFtMiwgcGFyYW0zKTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCk7Ci0KLQotI2RlZmluZSBNNE9TQV9UUkFDRXhfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01LCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KTsKLQotI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAxKSovCi0KLQotCi0jaWYgKE00T1NBX1RSQUNFX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAxKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMChtc2cpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMChtc2csIDEpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzEobXNnLCBwYXJhbTEpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMShtc2csIHBhcmFtMSwgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMihtc2csIHBhcmFtMSwgcGFyYW0yKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzIobXNnLCBwYXJhbTEsIHBhcmFtMiwgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIDEpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpXAotICAgICAgICBNNE9TQV9UUkFDRXhfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSwgMSkKLQotI2Vsc2UgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDEpKi8KLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMChtc2cpCi0jZGVmaW5lIE00T1NBX1RSQUNFMV8xKG1zZywgcGFyYW0xKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMihtc2csIHBhcmFtMSwgcGFyYW0yKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpCi0jZGVmaW5lIE00T1NBX1RSQUNFMV80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KQotI2RlZmluZSBNNE9TQV9UUkFDRTFfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KQotCi0jZW5kaWYgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDEpKi8KLQotCi0jaWYgKE00T1NBX1RSQUNFX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAyKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMChtc2cpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMChtc2csIDIpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzEobXNnLCBwYXJhbTEpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMShtc2csIHBhcmFtMSwgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMihtc2csIHBhcmFtMSwgcGFyYW0yKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzIobXNnLCBwYXJhbTEsIHBhcmFtMiwgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIDIpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpXAotICAgICAgICBNNE9TQV9UUkFDRXhfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSwgMikKLQotI2Vsc2UgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMikgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDIpKi8KLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMChtc2cpCi0jZGVmaW5lIE00T1NBX1RSQUNFMl8xKG1zZywgcGFyYW0xKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMihtc2csIHBhcmFtMSwgcGFyYW0yKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpCi0jZGVmaW5lIE00T1NBX1RSQUNFMl80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KQotI2RlZmluZSBNNE9TQV9UUkFDRTJfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KQotI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAyKSovCi0KLQotI2lmIChNNE9TQV9UUkFDRV9MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMykKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzAobXNnKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzAobXNnLCAzKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFM18xKG1zZywgcGFyYW0xKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzEobXNnLCBwYXJhbTEsIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzIobXNnLCBwYXJhbTEsIHBhcmFtMilcCi0gICAgICAgIE00T1NBX1RSQUNFeF8yKG1zZywgcGFyYW0xLCBwYXJhbTIsIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCAzKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFM180KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSlcCi0gICAgICAgIE00T1NBX1RSQUNFeF81KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUsIDMpCi0KLSNlbHNlIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAzKSovCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzAobXNnKQotI2RlZmluZSBNNE9TQV9UUkFDRTNfMShtc2csIHBhcmFtMSkKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzIobXNnLCBwYXJhbTEsIHBhcmFtMikKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKQotI2RlZmluZSBNNE9TQV9UUkFDRTNfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCkKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSkKLQotI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAzKSovCi0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX000T1NBX0RFQlVHX0hfICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0Vycm9yLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9FcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWMzMTc3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0Vycm9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRXJyb3IuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIERlZmluaXRpb24gb2YgY29tbW9uIGVycm9yIHR5cGVzCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBjb250YWlucyBtYWNyb3MgdG8gZ2VuZXJhdGUgYW5kIGFuYWx5emUgZXJyb3IgY29kZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfRVJST1JfSAotI2RlZmluZSBNNE9TQV9FUlJPUl9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0vKiogTTRPU0FfRVJSIGlzIGEgMzIgYml0cyB1bnNpZ25lZCBpbnRlZ2VyLgotICogVG8gc29ydCByZXR1cm5lZCBjb2RlLCBhIHNwZWNpZmljIG5hbWluZyBjb252ZW50aW9uIG11c3QgYmUgZm9sbG93ZWQ6Ci0gKiAtIFNldmVyaXR5ICgyIGJpdHMpOiBJdCBtYXkgYnIgZWl0aGVyIDBiMDAgKG5vIGVycm9yKSwgMGIwMSAod2FybmluZykgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgIDBiMDEgKGZhdGFsIGVycm9yKQotICogLSBDb3JlIElEICgxNCBiaXRzKTogSXQgaXMgYSB1bmlxdWUgSUQgZm9yIGVhY2ggY29yZSBjb21wb25lbnQKLSAqIC0gRXJyb3JJRCAoMTYgYml0cyk6IEl0IGlzIHRoZSBzcGVjaWZpYyBlcnJvciBjb2RlCi0KLSAqIEVBQ0ggQ09SRSBDT01QT05FTlQgRlVOQ1RJT04gU0hPVUxEIFJFVFVSTiBBTiBNNE9TQV9FUlIKLSovCi10eXBlZGVmIE00T1NBX1VJbnQzMiAgIE00T1NBX0VSUjsKLQotI2RlZmluZSBNNF9PSyAgICAgMAotI2RlZmluZSBNNF9XQVIgICAgMQotI2RlZmluZSBNNF9FUlIgICAgMgotCi0KLS8qIE1hY3JvIHRvIHByb2Nlc3MgTTRPU0FfRVJSICovCi0KLS8qKiBUaGlzIG1hY3JvIHRlc3RzIGlmIHRoZSBwcm92aWRlZCBNNE9TQV9FUlIgaXMgYSB3YXJuaW5nIG9yIG5vdCovCi0jZGVmaW5lIE00T1NBX0VSUl9JU19XQVJOSU5HKGVycm9yKSAgICgoKChlcnJvcik+PjMwKSA9PSBNNF9XQVIpID8gMTowKQotCi0vKiogVGhpcyBtYWNybyB0ZXN0cyBpZiB0aGUgcHJvdmlkZWQgTTRPU0FfRVJSIGlzIGEgZmF0YWwgZXJyb3Igb3Igbm90Ki8KLSNkZWZpbmUgTTRPU0FfRVJSX0lTX0VSUk9SKGVycm9yKSAgICgoKChlcnJvcik+PjMwKSA9PSBNNF9FUlIpID8gMTowKQotCi0vKiogVGhpcyBtYWNybyByZXR1cm5zIGFuIGVycm9yIGNvZGUgYWNjcm9kaW5nIHRvIHRoZSAzIHByb3ZpZGVkIGZpZWxkczoKLSAgKiBAYXJnIHNldmVyaXR5OiAoSU4pIFtNNE9TQV9VSW50MzJdIFNldmVyaXR5IHRvIHB1dCBpbiB0aGUgZXJyb3IgY29kZQotICAqIEBhcmcgY29yZUlEOiAoSU4pIFtNNE9TQV9VSW50MzJdIENvcmVJRCB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUKLSAgKiBAYXJnIGVycm9ySUQ6IChJTikgW000T1NBX1VJbnQzMl0gRXJyb3JJRCB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUqLwotI2RlZmluZSBNNE9TQV9FUlJfQ1JFQVRFKHNldmVyaXR5LCBjb3JlSUQsIGVycm9ySUQpXAotICAgKE00T1NBX1VJbnQzMikoKCgoTTRPU0FfVUludDMyKXNldmVyaXR5KTw8MzApKygoKChNNE9TQV9VSW50MzIpY29yZUlEKSYweDAwM0ZGRik8PDE2KSsoKChNNE9TQV9VSW50MzIpZXJyb3JJRCkmMHgwMEZGRkYpKQotCi0vKiogVGhpcyBtYWNybyBleHRyYWN0cyB0aGUgMyBmaWVsZHMgZnJvbSB0aGUgZXJyb3I6Ci0gICogQGFyZyBlcnJvcjogKElOKSBbTTRPU0FfRVJSXSBFcnJvciBjb2RlCi0gICogQGFyZyBzZXZlcml0eTogKE9VVCkgW000T1NBX1VJbnQzMl0gU2V2ZXJpdHkgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlCi0gICogQGFyZyBjb3JlSUQ6IChPVVQpIFtNNE9TQV9VSW50MzJdIENvcmVJRCB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUKLSAgKiBAYXJnIGVycm9ySUQ6IChPVVQpIFtNNE9TQV9VSW50MzJdIEVycm9ySUQgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlKi8KLSNkZWZpbmUgTTRPU0FfRVJSX1NQTElUKGVycm9yLCBzZXZlcml0eSwgY29yZUlELCBlcnJvcklEKVwKLSAgIHsgc2V2ZXJpdHk9KE00T1NBX1VJbnQzMikoKGVycm9yKT4+MzApO1wKLSAgICAgY29yZUlEPShNNE9TQV9VSW50MzIpKCgoZXJyb3IpPj4xNikmMHgwMDNGRkYpO1wKLSAgICAgKE00T1NBX1VJbnQzMikoZXJyb3JJRD0oZXJyb3IpJjB4MDBGRkZGKTsgfQotCi0KLS8qICJmYWtlIiBDb3JlSUQsIGlzIHVzZWQgdG8gcmVwb3J0IGFuIHVua25vd24gQ29yZUlELiBVc2VkIGJ5IHRoZSB0cmFjZSBzeXN0ZW0KLXdoZW4gdGhlIGNvcmUgSUQgbWFjcm8gaXNuJ3QgZGVmaW5lZC4gRGVmaW5lZCBoZXJlIGluc3RlYWQgb2YgQ29yZUlELmggdG8gYXZvaWQKLWludHJvZHVjaW5nIGRlcGVuZGVuY2llcyB0byBjb21tb24vaW5jLiAqLwotCi0jZGVmaW5lIE00VU5LTk9XTl9DT1JFSUQgICAgMHgzRkZGIC8qIG1heCBwb3NzaWJsZSBDb3JlSUQgKi8KLQotI2RlZmluZSBNNF9DT01NT04gICAgICAgICAgIDB4MDAgIC8qKjxDb21tb24qLwotI2RlZmluZSBNNE1QNF9DT01NT04gICAgICAgIDB4MDEgIC8qKjxDb3JlIE1QNCAoY29tbW9uKSovCi0jZGVmaW5lIE00TVA0X1dSSVRFUiAgICAgICAgMHgwMiAgLyoqPENvcmUgTVA0IHdyaXRlciovCi0jZGVmaW5lIE00TVA0X1JFQURFUiAgICAgICAgMHgwMyAgLyoqPENvcmUgTVA0IHJlYWRlciovCi0jZGVmaW5lIE00UlRTUF9DT01NT04gICAgICAgMHgxMSAgLyoqPENvcmUgUlRTUCBjb21tb24qLwotI2RlZmluZSBNNFJUU1BfV1JJVEVSICAgICAgIDB4MTIgIC8qKjxDb3JlIFJUU1AgdHJhbnNtaXR0ZXIqLwotI2RlZmluZSBNNFJUU1BfUkVBREVSICAgICAgIDB4MTMgIC8qKjxDb3JlIFJUU1AgcmVjZWl2ZXIqLwotI2RlZmluZSBNNFJUUF9XUklURVIgICAgICAgIDB4MTQgIC8qKjxDb3JlIFJUUC9SVENQIHJlY2VpdmVyKi8KLSNkZWZpbmUgTTRSVFBfUkVBREVSICAgICAgICAweDE1ICAvKio8Q29yZSBSVFAvUlRDUCB0cmFuc21pdHRlciovCi0jZGVmaW5lIE00U0FQX1dSSVRFUiAgICAgICAgMHgxNiAgLyoqPENvcmUgU0FQIHRyYW5zbWl0dGVyKi8KLSNkZWZpbmUgTTRTQVBfUkVBREVSICAgICAgICAweDE3ICAvKio8Q29yZSBTQVAgcmVjZWl2ZXIqLwotI2RlZmluZSBNNERWQkhfUkVBREVSICAgICAgICAweDE4ICAvKio8Q29yZSBEVkJIIHJlY2VpdmVyKi8KLSNkZWZpbmUgTTRTRFBfV1JJVEVSICAgICAgICAweDIyICAvKio8Q29yZSBTRFAgd3JpdGVyKi8KLSNkZWZpbmUgTTRTRFBfUkVBREVSICAgICAgICAweDMxICAvKio8Q29yZSBTRFAgcmVhZGVyKi8KLSNkZWZpbmUgTTRQQUtfQU1SICAgICAgICAgICAweDMyICAvKio8Q29yZSBwYWNrZXRpemVyIEFNUiAoUkZDMzI2NykqLwotI2RlZmluZSBNNERFUEFLX0FNUiAgICAgICAgIDB4MzMgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgQU1SIChSRkMzMjY3KSovCi0jZGVmaW5lIE00UEFLX0gyNjMgICAgICAgICAgMHgzNCAgLyoqPENvcmUgcGFja2V0aXplciBIMjYzIChSRkMyNDI5KSovCi0jZGVmaW5lIE00REVQQUtfSDI2MyAgICAgICAgMHgzNSAgLyoqPENvcmUgZGUtcGFja2V0aXplciBIMjYzKFJGQzI0MjkpKi8KLSNkZWZpbmUgTTRQQUtfU0lNUExFICAgICAgICAweDM2ICAvKio8Q29yZSBwYWNrZXRpemVyIFNpbXBsZURyYWZ0IChSRkMgeHh4eCkqLwotI2RlZmluZSBNNERFUEFLX1NJTVBMRSAgICAgIDB4MzcgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgU2ltcGxlRHJhZnQgKFJGQyB4eHh4KSovCi0jZGVmaW5lIE00UEFLXzMwMTZfVklERU8gICAgMHgzOCAgLyoqPENvcmUgcGFja2V0aXplciBSRkMzMDE2IHZpZGVvKi8KLSNkZWZpbmUgTTRERVBBS18zMDE2X1ZJREVPICAweDM5ICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFJGQzMwMTYgdmlkZW8qLwotI2RlZmluZSBNNFBBS18zMDE2X0FVRElPICAgIDB4M0EgIC8qKjxDb3JlIHBhY2tldGl6ZXIgUkZDMzAxNiBhdWRpbyAoTEFUTSkqLwotI2RlZmluZSBNNERFUEFLXzMwMTZfQVVESU8gIDB4M0IgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgUkZDMzAxNiBhdWRpbyAoTEFUTSkqLwotI2RlZmluZSBNNERFUEFLX0gyNjQgICAgICAgIDB4M0MgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgSDI2NCovCi0jZGVmaW5lIE00REVQQUtfUkVBTFYgICAgICAgIDB4M0QgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgUmVhbCBWaWRlbyAqLwotI2RlZmluZSBNNERFUEFLX1JFQUxBICAgICAgICAweDNFICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFJlYWwgQXVkaW8gKi8KLSNkZWZpbmUgTTRSRFRfUkVBREVSICAgICAgICAweDNGICAvKio8Q29yZSBSRFQgcmVjZWl2ZXIqLwotI2RlZmluZSBNNFRDUF9ETVVYICAgICAgICAgIDB4NTAgIC8qKjxDb3JlIFRDUCBkZW11eCovCi0jZGVmaW5lIE00SU9EX1BBUlNFUiAgICAgICAgMHg1MSAgLyoqPENvcmUgSU9EIHBhcnNlciovCi0jZGVmaW5lIE00T1NBX0ZJTEVfQ09NTU9OICAgMHg2MSAgLyoqPE9TQUwgZmlsZSBjb21tb24qLwotI2RlZmluZSBNNE9TQV9GSUxFX1dSSVRFUiAgIDB4NjIgIC8qKjxPU0FMIGZpbGUgd3JpdGVyKi8KLSNkZWZpbmUgTTRPU0FfRklMRV9SRUFERVIgICAweDYzICAvKio8T1NBTCBmaWxlIHJlYWRlciovCi0jZGVmaW5lIE00T1NBX0ZJTEVfRVhUUkEgICAgMHg2NCAgLyoqPE9TQUwgZmlsZSBleHRyYSovCi0jZGVmaW5lIE00T1NBX0RJUkVDVE9SWSAgICAgMHg2NSAgLyoqPE9TQUwgZGlyZWN0b3J5Ki8KLSNkZWZpbmUgTTRPU0FfU09DS0VUICAgICAgICAweDcxICAvKio8T1NBTCBzb2NrZXQgKGJvdGggcmVhZGVyIGFuZCB3cml0ZXIpKi8KLSNkZWZpbmUgTTRPU0FfVEhSRUFEICAgICAgICAweDgxICAvKio8T1NBTCB0aHJlYWQqLwotI2RlZmluZSBNNE9TQV9NVVRFWCAgICAgICAgIDB4ODIgIC8qKjxPU0FMIG11dGV4Ki8KLSNkZWZpbmUgTTRPU0FfU0VNQVBIT1JFICAgICAweDgzICAvKio8T1NBTCBzZW1hcGhvcmUqLwotI2RlZmluZSBNNE9TQV9DTE9DSyAgICAgICAgIDB4ODQgIC8qKjxPU0FMIGNsb2NrKi8KLSNkZWZpbmUgTTRPU0FfTUVNT1JZICAgICAgICAweDkxICAvKio8T1NBTCBtZW1vcnkqLwotI2RlZmluZSBNNENBTExfQkFDSyAgICAgICAgIDB4QTEgIC8qKjxDYWxsIEJhY2sgZXJyb3IqLwotI2RlZmluZSBNNE9TQV9VUkkgICAgICAgICAgIDB4QjEgIC8qKjxPU0FMIFVSSSBoYW5kbGVyKi8KLSNkZWZpbmUgTTRPU0FfU1RSSU5HICAgICAgICAweEIyICAvKio8T1NBTCBzdHJpbmcqLwotI2RlZmluZSBNNFNZU19DTUFQSSAgICAgICAgIDB4QjMgIC8qKjxTWVNURU0gQ29tbW9uIE1lZGkgQVBJKi8KLSNkZWZpbmUgTTRPU0FfQ0hBUlNUQVIgICAgICAweEI0ICAvKio8T1NBTCBDaGFyU3RhciovCi0jZGVmaW5lIE00UkVBQ1RPUiAgICAgICAgICAgMHhDMSAgLyoqPENvcmUgcmVhY3RvciovCi0jZGVmaW5lIE00VEVTVCAgICAgICAgICAgICAgMHhEMSAgLyoqPFRlc3QgY29tcG9uZW50Ki8KLSNkZWZpbmUgTTRTVEFDSyAgICAgICAgICAgICAgICAweEUxICAvKio8IENvcmUgSUQgb2YgdGhlIGludGVncmF0ZWQgc3RhY2sqLwotI2RlZmluZSBNNFNUQUNLX1JFQUwgICAgICAgIDB4RTIgIC8qKjxDb3JlIElEIG9mIHRoZSBSZWFsIGludGVncmF0ZWQgc3RhY2sgKi8KLSNkZWZpbmUgTTRUT09MX0xCVlRfUEFSQU0gICAweEYxICAvKio8TEJfVlQgY29uZmlnIGZpbGUgbWFuYWdlciovCi0jZGVmaW5lIE00VE9PTF9MSU5LX0xJU1QgICAgMHhGMiAgLyoqPFRvb2wgbGlua2VkIGxpc3QqLwotI2RlZmluZSBNNFRPT0xfQkFTRTY0ICAgICAgIDB4RjMgIC8qKjxDb3JlIGJhc2U2NCBlbmNvZGVyL2RlY29kZXIqLwotCi0KLQotLyogRGVmaW5pdGlvbiBvZiBjb21tb24gZXJyb3IgY29kZXMgKi8KLS8qKiB0aGVyZSBpcyBubyBlcnJvciovCi0jZGVmaW5lIE00Tk9fRVJST1IgICAgICAgICAgICAweDAwMDAwMDAwCi0KLS8qKiBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwqLwotI2RlZmluZSBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDEpCi0vKiogVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdyovCi0jZGVmaW5lIE00RVJSX1NUQVRFICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwMikKLS8qKiBUaGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUqLwotI2RlZmluZSBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDMpCi0vKiogUHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUqLwotI2RlZmluZSBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDQpCi0jZGVmaW5lIE00RVJSX0NPTlRFWFRfRkFJTEVEICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwNSkKLSNkZWZpbmUgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDA2KQotLyoqIFRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUqLwotI2RlZmluZSBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDcpCi0vKiogVGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZSovCi0jZGVmaW5lIE00RVJSX1dSSVRFX09OTFkgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwOCkKLS8qKiBUaGlzIG9wdGlvbiBpcyBhIHJlYWQgb25seSBvbmUqLwotI2RlZmluZSBNNEVSUl9SRUFEX09OTFkgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDkpCi0vKiogVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHlldCovCi0jZGVmaW5lIE00RVJSX05PVF9JTVBMRU1FTlRFRCAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwQSkKLQotI2RlZmluZSAgICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRfQ09NTU9OLCAweDAwMDAwQikKLQotI2RlZmluZSBNNFdBUl9OT19EQVRBX1lFVCAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDEpCi0jZGVmaW5lIE00V0FSX05PX01PUkVfU1RSRUFNICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwMikKLSNkZWZpbmUgTTRXQVJfSU5WQUxJRF9USU1FICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDAzKQotI2RlZmluZSBNNFdBUl9OT19NT1JFX0FVICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDQpCi0jZGVmaW5lIE00V0FSX1RJTUVfT1VUICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwNSkKLS8qKiBUaGUgYnVmZmVyIGlzIGZ1bGwqLwotI2RlZmluZSBNNFdBUl9CVUZGRVJfRlVMTCAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDYpCi0vKiBUaGUgc2VydmVyIGFza3MgZm9yIGEgcmVkaXJlY3Rpb24gKi8KLSNkZWZpbmUgTTRXQVJfUkVESVJFQ1QgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDcpCi0jZGVmaW5lIE00V0FSX1RPT19NVUNIX1NUUkVBTVMgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwOCkKLS8qIFNGIENvZGVjIGRldGVjdGVkIElORk9fRk9STUFUX0NIQU5HRSBkdXJpbmcgZGVjb2RlICovCi0jZGVmaW5lIE00V0FSX0lORk9fRk9STUFUX0NIQU5HRSBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRfQ09NTU9OLCAweDAwMDAwOSkKLQotI2VuZGlmIC8qTTRPU0FfRVJST1JfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0V4cG9ydC5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXhwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3YTZlODEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXhwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRPU0FfRXhwb3J0LmgKLSAqIEBicmllZiAgICBEYXRhIGFjY2VzcyBleHBvcnQgdHlwZXMgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHR5cGVzIHdoaWNoIG11c3QgYmUKLSAqICAgICAgICAgIHVzZWQgdG8gaW1wb3J0IG9yIGV4cG9ydCBhbnkgZnVuY3Rpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0VYUE9SVF9ICi0jZGVmaW5lIE00T1NBX0VYUE9SVF9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLypfX2NwbHVzcGx1cyovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgT1NBTCBFWFBPUlRTICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgQ0hBUl9TVEFSICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfQ0xPQ0tfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgQ0xPQ0sgICAgICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfREFURV9FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAvKio8IE9TQUwgREFURSAgICAgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9GSUxFX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgIC8qKjwgT1NBTCBGSUxFICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIFJFQUwgVElNRSAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1NPQ0tFVF9FWFBPUlRfVFlQRSAgICAgICAgICAgIC8qKjwgU09DS0VUICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgU1RSSU5HICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfVVJJX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgIC8qKjwgT1NBTCBVUkkgICAgICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIE1FTU9SWSAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIFRSQUNFICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1RPT0xfVElNRVJfRVhQT1JUX1RZUEUgICAgICAgIC8qKjwgT1NBTCBUT09MIFRJTUVSICAgICovCi0jZGVmaW5lIE00T1NBTF9TWVNURU1fQ01fRVhQT1JUX1RZUEUgICAgICAgIC8qKjwgU1lTVEVNIENPTU1PTiBBUEkgICAgKi8KLSNkZWZpbmUgTTRPU0FMX0xJTktFRF9MSVNUX0VYUE9SVF9UWVBFICAgICAgICAvKio8IFRPT0wgTElOS0VEIExJU1QgICAgKi8KLSNkZWZpbmUgTTRPU0FMX01FTU9SWV9NQU5BR0VSX0VYUE9SVF9UWVBFICAgIC8qKjwgTUVNT1JZIE1BTkFHRVIgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9UUkFDRV9NQU5BR0VSX0VYUE9SVF9UWVBFICAgIC8qKjwgVE9PTCBUUkFDRSBNQU5BR0VSICovCi0jZGVmaW5lIE00VlBTX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAvKio8IFZQUyBBUEkgICAgICAgICAgICAqLwotI2RlZmluZSBNNEFQX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAvKio8IEFVRElPIFBSRVNFTlRFUlMgICAgKi8KLSNkZWZpbmUgTTRWUF9FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgLyoqPCBWSURFTyBQUkVTRU5URVJTICAgICovCi0jZGVmaW5lIE00Q0JfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2FsbCBiYWNrICAgICAgICAgICAgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLypfX2NwbHVzcGx1cyovCi0KLSNlbmRpZiAvKk00T1NBX0VYUE9SVF9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMmFmYjhjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVDb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlQ29tbW9uLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBGaWxlIGNvbW1vbgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCB0eXBlcyB1c2VkIGJ5IGJvdGggdGhlIGZpbGUKLSAqICAgICAgICAgICAgICAgd3JpdGVyIGFuZCBmaWxlIHJlYWRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBNNE9TQV9GSUxFQ09NTU9OX0gKLSNkZWZpbmUgTTRPU0FfRklMRUNPTU1PTl9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiCi0KLQotdHlwZWRlZiBNNE9TQV9JbnQzMiBNNE9TQV9GaWxlUG9zaXRpb247Ci0KLS8qKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXBwbGljYXRpb24gbW9kZSBhY2Nlc3MuCi0gKiAgaWUsIHRoZSBhcHBsaWNhdGlvbiB1c2VzIGEgZmlsZSBkZXNjcmlwdG9yIHRvIHJlYWQgb3IgdG8gd3JpdGUgIG9yCi0gKiAgYm90aCB0byByZWFkIGFuZCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lLgotICogIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIE1NIHByb2plY3Qgb25seS4gSXQgZW5hYmxlcyB0byByZWFkIGFuZCB3cml0ZSB0byBhIGZpbGUKLSAqICB3aXRoIG9uZSBkZXNjcmlwdG9yLgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgIE00T1NBX2tEZXNjTm9uZUFjY2VzcyAgICA9IDB4MDAsCi0gICBNNE9TQV9rRGVzY1JlYWRBY2Nlc3MgICAgPSAweDAxLCAgICAvKiogVGhlIERlc2NyaXB0b3IgcmVhZHMgb25seSBmcm9tIHRoZSBmaWxlICovCi0gICBNNE9TQV9rRGVzY1dyaXRlQWNjZXNzICAgID0gMHgwMiwgICAgLyoqIFRoZSBEZXNjcmlwdG9yIHdyaXRlcyBvbmx5IGZyb20gdGhlIGZpbGUqLwotICAgTTRPU0Ffa0Rlc2NSV0FjY2VzcyAgICAgICAgPSAweDAzICAgIC8qKiBUaGUgRGVzY3JpcHRvciByZWFkcyBhbmQgd3JpdGVzIGZyb20vaW4gdGhlIGZpbGUqLwotfSBNNE9TQV9EZXNjck1vZGVBY2Nlc3M7Ci0KLQotLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBmaWxlIG1vZGUgYWNjZXNzLiBCb3RoIHRleHQgbW9kZSBhcyBiaW5hcnkgbW9kZQotICAgIGNhbm5vdCBiZSBzZXQgdG9nZXRoZXIuKi8KLXR5cGVkZWYgZW51bQotewotICAgLyoqIFRoZSBmaWxlIG11c3QgYmUgYWNjZXNzZWQgaW4gcmVhZCBvbmx5IG1vZGUqLwotICAgTTRPU0Ffa0ZpbGVSZWFkICAgICAgICAgICAgID0gMHgwMSwKLSAgIC8qKiBUaGUgZmlsZSBtdXN0IGJlIGFjY2Vzc2VkIGluIHdyaXRlIG9ubHkgbW9kZSovCi0gICBNNE9TQV9rRmlsZVdyaXRlICAgICAgICAgICAgPSAweDAyLAotICAgLyoqIFRoZSBmaWxlIG11c3QgYmUgYWNjZXNzZWQgaW4gYXBwZW5kIG1vZGUgKEFuIGV4aXN0aW5nIGZpbGUgbXVzdAotICAgICAgIGJlIGF2YWlsYWJsZSB0byBhcHBlbmQgZGF0YSkqLwotICAgTTRPU0Ffa0ZpbGVBcHBlbmQgICAgICAgICAgID0gMHgwNCwKLSAgIC8qKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkKi8KLSAgIE00T1NBX2tGaWxlQ3JlYXRlICAgICAgICAgICA9IDB4MDgsCi0gICAvKiogRGF0YSBhcmUgcHJvY2Vzc2VkIGFzIGJpbmFyeSBvbmUsIHRoZXJlIGlzIG5vIGRhdGEgbWFuYWdlbWVudCovCi0gICBNNE9TQV9rRmlsZUlzVGV4dE1vZGUgICAgICAgPSAweDEwCi19IE00T1NBX0ZpbGVNb2RlQWNjZXNzOwotCi0KLS8qKiBUaGlzIHR5cGUgaXMgdXNlZCB0byBzdG9yZSBhIGRhdGUuKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAvKiogVGltZSBzY2FsZSAodGljayBudW1iZXIgcGVyIHNlY29uZCkqLwotICAgTTRPU0FfVUludDMyIHRpbWVTY2FsZTsKLSAgIC8qKiBEYXRlIGV4cHJlc3NlZCBpbiB0aGUgdGltZSBzY2FsZSovCi0gICBNNE9TQV9UaW1lICAgdGltZTsKLSAgIC8qKiBZZWFyIG9mIHRoZSBhYnNvbHV0ZSB0aW1lICgxOTAwLCAxOTcwIG9yIDIwMDApKi8KLSAgIE00T1NBX1VJbnQzMiByZWZlcmVuY2VZZWFyOwotfSBNNE9TQV9EYXRlOwotCi0KLS8qKiBUaGlzIHN0cnVjdXJlIGRlZmluZXMgdGhlIGZpbGUgYXR0cmlidXRlcyovCi10eXBlZGVmIHN0cnVjdAotewotICAgLyoqIFRoZSBmaWxlIG1vZGUgYWNjZXNzKi8KLSAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzICAgIG1vZGVBY2Nlc3M7Ci0gICAvKiogVGhlIGNyZWF0aW9uIGRhdGUqLwotICAgTTRPU0FfRGF0ZSAgICAgICAgICAgICAgY3JlYXRpb25EYXRlOwotICAgLyoqIFRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlKi8KLSAgIE00T1NBX0RhdGUgICAgICAgICAgICAgIG1vZGlmaWVkRGF0ZTsKLSAgIC8qKiBUaGUgbGFzdCBhY2Nlc3MgZGF0ZSAocmVhZCkqLwotICAgTTRPU0FfRGF0ZSAgICAgICAgICAgICAgbGFzdEFjY2Vzc0RhdGU7Ci19IE00T1NBX0ZpbGVBdHRyaWJ1dGU7Ci0KLQotCi0vKiogVGhpcyBlbnVtIGRlZmluZXMgdGhlIHNlZWsgYmVoYXZpb3IqLwotdHlwZWRlZiBlbnVtIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZQotewotICAgLyoqIFJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUqLwotICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nICAgICAgICAgICAgPSAweDAxLAotICAgLyoqIFJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUqLwotICAgTTRPU0Ffa0ZpbGVTZWVrRW5kICAgICAgICAgICAgICAgICAgPSAweDAyLAotICAgLyoqIFJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24qLwotICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCAgICAgICAgICAgICAgPSAweDAzCi19IE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZTsKLQotCi0vKiBFcnJvciBjb2RlcyAqLwotI2RlZmluZSBNNEVSUl9GSUxFX05PVF9GT1VORCAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0NPTU1PTiwgMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX0ZJTEVfTE9DS0VEICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfQ09NTU9OLCAweDAwMDAwMikKLSNkZWZpbmUgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9DT01NT04sIDB4MDAwMDAzKQotI2RlZmluZSBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04gIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0NPTU1PTiwgMHgwMDAwMDQpCi0KLQotI2VuZGlmIC8qTTRPU0FfRklMRUNPTU1PTl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbl9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWViYTQ1Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uX3ByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgY29tbW9uIHByaXZhdGUgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdXNlZCBieSBib3RoIHRoZSBmaWxlCi0gKiAgICAgICAgICAgICAgIHdyaXRlciBhbmQgZmlsZSByZWFkZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0ZJTEVDT01NT05fUFJJVl9ICi0jZGVmaW5lIE00T1NBX0ZJTEVDT01NT05fUFJJVl9ICi0KLQotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIE00T1NBX2lzQWNjZXNzTW9kZUFjdGl2ZWQoY29tcG91bmRfbW9kZV9hY2Nlc3MsZWxlbWVudGFyeV9tb2RlX2FjY2VzcylcCi0gICAgICAgICgoKGNvbXBvdW5kX21vZGVfYWNjZXNzKSYoZWxlbWVudGFyeV9tb2RlX2FjY2VzcykpPyAxOjApCi0KLQotdHlwZWRlZiBlbnVtIE00T1NBX0xhc3RTZWVrCi17Ci0gICBTZWVrTm9uZSwKLSAgIFNlZWtSZWFkLAotICAgU2Vla1dyaXRlCi19IE00T1NBX0xhc3RTZWVrOwotCi0vKiogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZmlsZSBjb250ZXh0Ki8KLXR5cGVkZWYgc3RydWN0IHsKLSAgIE00T1NBX1VJbnQzMiAgICAgICAgIGNvcmVJRF9yZWFkOwotICAgTTRPU0FfVUludDMyICAgICAgICAgY29yZUlEX3dyaXRlOwotICAgRklMRSogICAgICAgICAgICAgICAgZmlsZV9kZXNjOwotICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBVUkwgKi8KLSAgIE00T1NBX0NoYXIqICAgICAgICAgIHVybF9uYW1lOwotICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBmaWxlICovCi0gICBNNE9TQV9DaGFyKiAgICAgICAgICBmaWxlX25hbWU7Ci0gICAvKiogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGUgKi8KLSAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgIGZpbGVfc2l6ZTsKLSAgIC8qKiBUaGUgZmlsZSBtb2RlIGFjY2VzcyB1c2VkIHRvIG9wZW4gdGhlIGZpbGUgKi8KLSAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzIGFjY2Vzc19tb2RlOwotICAgTTRPU0FfTGFzdFNlZWsgICAgICAgY3VycmVudF9zZWVrOwotICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgcmVhZF9wb3NpdGlvbjsKLSAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgIHdyaXRlX3Bvc2l0aW9uOwotICAgTTRPU0FfQm9vbCAgICAgICAgICAgYl9pc19lbmRfb2ZfZmlsZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgIE00T1NBX0NvbnRleHQgICAgICAgIHNlbWFwaG9yZV9jb250ZXh0OwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotCi0gICAvKiBUaGVzZSB0d28gdmFyaWFibGVzIHdlcmUgYWRkZWQgdG8gbWFuYWdlIGNhc2Ugd2hlcmUgYSBmaWxlCi0gICAgKiBpcyBvcGVuZWQgaW4gcmVhZCBhbmQgd3JpdGUgbW9kZSB3aXRoIG9uZSBkZXNjcmlwdG9yICovCi0gICAgTTRPU0FfRGVzY3JNb2RlQWNjZXNzICAgIG1fRGVzY3JNb2RlQWNjZXNzOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlMb2NrTW9kZTsKLQotCi19IE00T1NBX0ZpbGVDb250ZXh0OwotCi0KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25PcGVuKE00T1NBX1VJbnQxNiBjb3JlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogVVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzIGZpbGVNb2RlQWNjZXNzKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25DbG9zZShNNE9TQV9VSW50MTYgY29yZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZUF0dHJpYnV0ZSogYXR0cmlidXRlKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRVUkwoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqIHVybCk7Ci0KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUoTTRPU0FfQ2hhciogdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogZmlsZW5hbWUpOwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vblNlZWsoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi1NNE9TQV9FUlIgTTRPU0FfVG9VVEY4X09TQUwgKE00T1NBX1ZvaWQgICAqcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAgKnBCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqYnVmZmVyT3V0U2l6ZSk7Ci0jZW5kaWYgLypVVEZfQ09OVkVSU0lPTiovCi0KLQotI2VuZGlmIC8qTTRPU0FfRklMRUNPTU1PTl9QUklWX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyMjc1NmQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXIuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgcmVhZGVyCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWNsYXJlcyBmdW5jdGlvbnMgYW5kIHR5cGVzIHRvIHJlYWQgYSBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVSRUFERVJfSAotI2RlZmluZSBNNE9TQV9GSUxFUkVBREVSX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotCi0KLS8qKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgb3B0aW9uIElEIHRvIGJlIHVzZWQgaW4gTTRPU0FfRmlsZVJlYWRHZXRPcHRpb24oKQotICAgIGFuZCBNNE9TQV9GaWxlUmVhZFNldE9wdGlvbigpKi8KLXR5cGVkZWYgZW51bSBNNE9TQV9GaWxlUmVhZE9wdGlvbklECi17Ci0gICAvKiogR2V0IHRoZSBmaWxlIHNpemUgKE00T1NBX2Zwb3MqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfUkVBREVSLCAweDAxKSwKLQotICAgICAgLyoqIEdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIChNNE9TQV9GaWxlQXR0cmlidXRlKikqLwotICAgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZUF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfUkVBREVSLCAweDAyKSwKLQotICAgLyoqIEdldCB0aGUgZmlsZSBVUkwsIHByb3ZpZGVkIGJ5IHRoZSBNNE9TQV9GaWxlUmVhZE9wZW4gKE00T1NBX0NoYXIqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRHZXRVUkwKLSAgICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwMyksCi0KLSAgIC8qKiBHZXQgdGhlIGZpbGUgcG9zaXRpb24gKE00T1NBX2Zwb3MqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb24KLSAgICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwNCksCi0KLSAgIC8qKiBDaGVjayBlbmQgb2YgZmlsZTogVFJVRSBpZiB0aGUgRU9GIGhhcyBiZWVuIHJlYWNoZWQsIEZBTFNFIGVsc2UKLSAgICAgICAoTTRPU0FfQm9vbCopKi8KLSAgIE00T1NBX2tGaWxlUmVhZElzRU9GCi0gICAgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDUpLAotCi0gICAvKiogQ2hlY2sgbG9jayBvZiBmaWxlICovCi0gICBNNE9TQV9rRmlsZVJlYWRMb2NrTW9kZQotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQURXUklURSwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDYpCi0KLX0gTTRPU0FfRmlsZVJlYWRPcHRpb25JRDsKLQotCi0KLQotCi0vKiogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBzZXQgb2YgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYWNjZXNzIHRvIGEKLSAgICBmaWxlIGluIHJlYWQgbW9kZSovCi10eXBlZGVmIHN0cnVjdAotewotICAgTTRPU0FfRVJSICgqb3BlblJlYWQpICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgTTRPU0FfRVJSICgqcmVhZERhdGEpICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBzaXplKTsKLQotICAgTTRPU0FfRVJSICgqc2VlaykgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLSAgIE00T1NBX0VSUiAoKmNsb3NlUmVhZCkgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0gICBNNE9TQV9FUlIgKCpzZXRPcHRpb24pICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX0VSUiAoKmdldE9wdGlvbikgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICpvcHRpb25WYWx1ZSk7Ci19IE00T1NBX0ZpbGVSZWFkUG9pbnRlcjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3BlbiAgICAgICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkRGF0YSAgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBzaXplKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2VlayAgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZENsb3NlICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24gICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAqb3B0aW9uVmFsdWUpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24gICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAgIC8qTTRPU0FfRklMRVJFQURFUl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlcl9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzI3YjA4Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyX3ByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfcHJpdi5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIgcHJpdmF0ZSBmb3IgQW5kcm9pZAotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfRklMRVJFQURFUl9QUklWX0gKLSNkZWZpbmUgTTRPU0FfRklMRVJFQURFUl9QUklWX0gKLQotCi0vKiogVGhvc2UgZGVmaW5lIGVuYWJsZS9kaXNhYmxlIG9wdGlvbiBJRCovCi0KLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1NJWkUgICAgICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9BVFRSSUJVVEUgICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX1VSTCAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1BPU0lUSU9OICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9JU19FT0YgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRQotCi0jZW5kaWYgLypNNE9TQV9GSUxFUkVBREVSX1BSSVZfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWExMTMzMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlci5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSB3cml0ZXIKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdG8gd3JpdGUgaW4gYSBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVXUklURVJfSAotI2RlZmluZSBNNE9TQV9GSUxFV1JJVEVSX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLQotLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBvcHRpb24gSUQgdG8gYmUgdXNlZCBpbiBNNE9TQV9GaWxlV3JpdGVHZXRPcHRpb24oKQotYW5kIE00T1NBX0ZpbGVXcml0ZVNldE9wdGlvbigpKi8KLXR5cGVkZWYgZW51bQotewotICAgLyoqIEdldCB0aGUgZmlsZSBVUkwsIHByb3ZpZGVkIGJ5IHRoZSBNNE9TQV9GaWxlV3JpdGVPcGVuIChNNE9TQV9DaGFyKikqLwotICAgTTRPU0Ffa0ZpbGVXcml0ZUdldFVSTAotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDAxKSwKLQotICAgLyoqIEdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIChNNE9TQV9GaWxlQXR0cmlidXRlKikqLwotICAgTTRPU0Ffa0ZpbGVXcml0ZUdldEF0dHJpYnV0ZQotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDAyKSwKLQotICAgLyoqIEdldCB0aGUgcmVhZGVyIGNvbnRleHQgZm9yIHJlYWQgJiB3cml0ZSBmaWxlLiAoTTRPU0FfQ29udGV4dCopKi8KLSAgIE00T1NBX2tGaWxlV3JpdGVHZXRSZWFkZXJDb250ZXh0Ci0gICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9XUklURVIsIDB4MDMpLAotCi0gICBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVBvc2l0aW9uCi0gICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9XUklURVIsIDB4MDQpLAotCi0gICBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVNpemUKLSAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1dSSVRFUiwgMHgwNSksCi0KLQotICAgIE00T1NBX2tGaWxlV3JpdGVMb2NrTW9kZQotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQURXUklURSwgTTRPU0FfRklMRV9XUklURVIsIDB4MDYpLAotCi0KLSAgIC8qKiBDaGVjayBsb2NrIG9mIGZpbGUgKi8KLSAgIE00T1NBX2tGaWxlV3JpdGVEZXNjTW9kZQotICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEV1JJVEUsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDA3KQotfSBNNE9TQV9GaWxlV3JpdGVPcHRpb25JRDsKLQotCi0vKiogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBzZXQgb2YgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYWNjZXNzIHRvIGEgZmlsZQotICAgIGluIHJlYWQgbW9kZSovCi10eXBlZGVmIHN0cnVjdAotewotICAgTTRPU0FfRVJSICgqb3BlbldyaXRlKSAgIChNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgTTRPU0FfRVJSICgqd3JpdGVEYXRhKSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKTsKLQotICAgTTRPU0FfRVJSICgqc2VlaykgICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLSAgIE00T1NBX0VSUiAoKkZsdXNoKSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLSAgIE00T1NBX0VSUiAoKmNsb3NlV3JpdGUpICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLSAgIE00T1NBX0VSUiAoKnNldE9wdGlvbikgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX0VSUiAoKmdldE9wdGlvbikgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpOwotfSBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlcjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZU9wZW4gICAgICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZURhdGEgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKTsKLQotLyogUGllcnJlIExlYmVhdXBpbiAyMDA4LzA0LzI5OiBXQVJOSU5HISB0aGUgZmVhdHVyZSBvZiBmaWxlKlNlZWsgd2hpY2ggcmV0dXJucwotdGhlIHBvc2l0aW9uIGluIHRoZSBmaWxlIChmcm9tIHRoZSBiZWdpbm5pbmcpIGFmdGVyIHRoZSBzZWVrIGluIHRoZSAicG9zaXRpb24iCi1wb2ludGVyIGhhcyBiZWVuIGZvdW5kIHRvIGJlIHVucmVsaWFibHkgKG9yIHNvbWV0aW1lcyBub3QgYXQgYWxsKSBpbXBsZW1lbnRlZAotaW4gc29tZSBPU0FMcywgc28gcmVseWluZyBvbiBpdCBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCwgdW5sZXNzIHlvdSByZWFsbHkgd2FudAotdG8gaGF2ZSBhIHBpenphIGV2ZW5pbmcuICovCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlU2VlayAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUNsb3NlICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVGbHVzaCAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIG9wdGlvblZhbHVlKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9GSUxFV1JJVEVSX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyX3ByaXYuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXJfcHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDk3MmY0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXJfcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlcl9wcml2LmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBGaWxlIHdyaXRlciBwcml2YXRlIGZvciBBbmRyb2lkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfRklMRVdSSVRFUl9QUklWX0gKLSNkZWZpbmUgTTRPU0FfRklMRVdSSVRFUl9QUklWX0gKLQotCi0vKiogVGhvc2UgZGVmaW5lIGVuYWJsZS9kaXNhYmxlIG9wdGlvbiBJRCovCi0KLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9TSVpFICAgICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfQVRUUklCVVRFICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9SRUFERVJfQ09OVEVYVCAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9QT1NJVElPTiAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1VSTCAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRQotCi0jZW5kaWYgLypNNE9TQV9GSUxFV1JJVEVSX1BSSVZfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX01lbW9yeS5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0ZDE1Y2MuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9NZW1vcnkuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGZ1bmN0aW9uIHByb3RvdHlwZXMgdG8gYWxsb2NhdGUKLSAqICAgICAgICAgICAgICAgYW5kIGZyZWUgbWVtb3J5LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9NRU1PUllfSAotI2RlZmluZSBNNE9TQV9NRU1PUllfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiIC8qZm9yIE00T1NBX0NvcmVJRCBkZWZpbml0aW9uKi8KLQotdHlwZWRlZiBNNE9TQV9JbnQzMiogTTRPU0FfTWVtQWRkcjMyOwotdHlwZWRlZiBNNE9TQV9JbnQ4KiAgTTRPU0FfTWVtQWRkcjg7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9NRU1PUllfRVhQT1JUX1RZUEUgZXh0ZXJuIE00T1NBX01lbUFkZHIzMiBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKE00T1NBX1VJbnQzMiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZyk7Ci0KLU00T1NBTF9NRU1PUllfRVhQT1JUX1RZUEUgZXh0ZXJuIE00T1NBX0VSUiBNNE9TQV9yYW5kSW5pdCh2b2lkKTsKLQotCi1NNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFIGV4dGVybiBNNE9TQV9FUlIgTTRPU0FfcmFuZChNNE9TQV9JbnQzMiogb3V0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG1heF92YWx1ZSk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX011dGV4LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9NdXRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDk2YmRkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX011dGV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9NdXRleC5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgbXV0ZXggQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfTVVURVhfSAotI2RlZmluZSBNNE9TQV9NVVRFWF9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0KLSNlbmRpZgotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX211dGV4T3BlbiggICAgTTRPU0FfQ29udGV4dCogY29udGV4dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfbXV0ZXhMb2NrKCAgICBNNE9TQV9Db250ZXh0ICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICAgdGltZW91dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfbXV0ZXhVbmxvY2soICBNNE9TQV9Db250ZXh0ICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9tdXRleENsb3NlKCAgIE00T1NBX0NvbnRleHQgIGNvbnRleHQgKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9NVVRFWF9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfT3B0aW9uSUQuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX09wdGlvbklELmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxYjkwNDQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfT3B0aW9uSUQuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX09wdGlvbklELmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBPcHRpb24gSUQgbWFjcm9zCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIG1hY3JvcyB0byBnZW5lcmF0ZSBhbmQgYW5hbHl6ZSBvcHRpb24gSUQuCi0gKiAgICAgICAgICAgICAgIE9wdGlvbiBJRCBpcyB1c2VkIGJ5IE00WVlZX1pac2V0T3B0aW9uKCkgYW5kCi0gKiAgICAgICAgICAgICAgIE00WVlZX1paZ2V0T3B0aW9uKCkgZnVuY3Rpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9PUFRJT05JRF9ICi0jZGVmaW5lIE00T1NBX09QVElPTklEX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotLyoqIE00T1NBX09wdGlvbklEIGlzIGEgMzIgYml0cyB1bnNpZ25lZCBpbnRlZ2VyLgotLSBSaWdodCBhY2Nlc3MgKDIgYml0cyk6IFNvbWUgb3B0aW9ucyBtYXkgaGF2ZSByZWFkIG9ubHksIHdyaXRlIG9ubHkgb3IgcmVhZAotICBhbmQgd3JpdGUgYWNjZXNzCi0tIENvcmUgSUQgKDE0IGJpdHMpOiBJdCBpcyBhIHVuaXF1ZSBJRCBmb3IgZWFjaCBjb3JlIGNvbXBvbmVudAotLSBTdWJPcHRpb24gSUQgKDE2IGJpdHMpOiBUbyBzZWxlY3Qgd2hpY2ggb3B0aW9uIGluIGEgc3BlY2lmaWMgY29yZSBjb21wb25lbnQKLSovCi10eXBlZGVmIE00T1NBX1VJbnQzMiBNNE9TQV9PcHRpb25JRDsKLXR5cGVkZWYgdm9pZCogICAgICAgIE00T1NBX0RhdGFPcHRpb247Ci0KLSNkZWZpbmUgTTRfUkVBRCAgICAgIDB4MDEKLSNkZWZpbmUgTTRfV1JJVEUgICAgIDB4MDIKLSNkZWZpbmUgTTRfUkVBRFdSSVRFIDB4MDMKLQotLyogTWFjcm8gdG8gcHJvY2VzcyBNNE9TQV9PcHRpb25JRCAqLwotCi0vKiogVGhpcyBtYWNybyBjcmVhdGVzIGFuIG9wdGlvbklEIGdpdmVuIHJlYWQvd3JpdGUgYWNjZXNzLAotICAgIGNvcmVJRCBhbmQgU3ViT3B0aW9uSUQqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKHJpZ2h0LCBjb3JlSUQsIGVycm9ySUQpXAotICAgKE00T1NBX0ludDMyKSgoKCgoKE00T1NBX1VJbnQzMilyaWdodCkmMHgwMyk8PDMwKSkrKCgoKE00T1NBX1VJbnQzMiljb3JlSUQpJjB4MDAzRkZGKTw8MTYpKygoKE00T1NBX1VJbnQzMillcnJvcklEKSYweDAwRkZGRikpCi0KLS8qKiBUaGlzIG1hY3JvIHNwbGl0cyBhbiBvcHRpb25JRCBpbnRvIHJlYWQvd3JpdGUgYWNjZXNzLAotICAgIGNvcmVJRCBhbmQgU3ViT3B0aW9uSUQqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfU1BMSVQob3B0aW9uSUQsIHJpZ2h0LCBjb3JlSUQsIGVycm9ySUQpXAotICAgeyByaWdodD0oTTRPU0FfVUludDgpKChvcHRpb25JRCk+PjMwKTtcCi0gICAgIGNvcmVJRD0oTTRPU0FfVUludDE2KSgoKG9wdGlvbklEKT4+MTYpJjB4MDAwMDNGRkYpO1wKLSAgICAgZXJyb3JJRD0oTTRPU0FfVUludDMyKSgob3B0aW9uSUQpJjB4MDAwMEZGRkYpOyB9Ci0KLS8qKiBUaGlzIG1hY3JvIHJldHVybnMgMSBpZiB0aGUgb3B0aW9uSUQgaXMgd3JpdGFibGUsIDAgb3RoZXJ3aXNlKi8KLSNkZWZpbmUgTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSAoKCgob3B0aW9uSUQpPj4zMCkmTTRfV1JJVEUpIT0wKQotCi0vKiogVGhpcyBtYWNybyByZXR1cm5zIDEgaWYgdGhlIG9wdGlvbklEIGlzIHJlYWRhYmxlLCAwIG90aGVyd2lzZSovCi0jZGVmaW5lIE00T1NBX09QVElPTl9JRF9JU19SRUFEQUJMRShvcHRpb25JRCkgKCgoKG9wdGlvbklEKT4+MzApJk00X1JFQUQpIT0wKQotCi0vKiogVGhpcyBtYWNybyByZXR1cm5zIDEgaWYgdGhlIG9wdGlvbklEIGhhcyBpdHMgY29yZSBJRCBlcXVhbCB0byAnY29yZUlEJywgMCBvdGhlcndpc2UqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBjb3JlSUQpXAotICAgKCgoKChvcHRpb25JRCk+PjE2KSYweDAwM0ZGRikgPT0gKGNvcmVJRCkpID8gTTRPU0FfVFJVRTpNNE9TQV9GQUxTRSkKLQotCi0jZW5kaWYgICAvKk00T1NBX09QVElPTklEX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9TZW1hcGhvcmUuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1NlbWFwaG9yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjMwNDU0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1NlbWFwaG9yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfU2VtYXBob3JlLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBzZW1hcGhvcmUgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX1NFTUFQSE9SRV9ICi0jZGVmaW5lIE00T1NBX1NFTUFQSE9SRV9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlT3BlbiggIE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAgIGluaXRpYWxOdW1iZXIgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZVBvc3QoICBNNE9TQV9Db250ZXh0ICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVXYWl0KCAgTTRPU0FfQ29udGV4dCAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgICAgdGltZW91dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlQ2xvc2UoIE00T1NBX0NvbnRleHQgIGNvbnRleHQgKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9TRU1BUEhPUkVfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZC5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhOTZhZmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfVGhyZWFkLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICB0aHJlYWQgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfVEhSRUFEX0gKLSNkZWZpbmUgTTRPU0FfVEhSRUFEX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9PcHRpb25JRC5oIgotCi0KLS8qIERlZmluaXRpb24gb2YgY29tbW9uIGVycm9yIGNvZGVzICovCi0jZGVmaW5lIE00RVJSX1RIUkVBRF9OT1RfU1RBUlRFRCBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9USFJFQUQsMHgwMDAwMDEpCi0KLQotdHlwZWRlZiBlbnVtCi17Ci0gICBNNE9TQV9rVGhyZWFkT3BlbmVkICAgPSAweDEwMCwKLSAgIE00T1NBX2tUaHJlYWRTdGFydGluZyA9IDB4MjAwLAotICAgTTRPU0Ffa1RocmVhZFJ1bm5pbmcgID0gMHgzMDAsCi0gICBNNE9TQV9rVGhyZWFkU3RvcHBpbmcgPSAweDQwMCwKLSAgIE00T1NBX2tUaHJlYWRDbG9zZWQgID0gMHg1MDAKLX0gTTRPU0FfVGhyZWFkU3RhdGU7Ci0KLQotCi10eXBlZGVmIGVudW0KLXsKLSAgIE00T1NBX2tUaHJlYWRIaWdoZXN0UHJpb3JpdHkgID0gIDB4MDAwLAotICAgTTRPU0Ffa1RocmVhZEhpZ2hQcmlvcml0eSAgICAgPSAgMHgxMDAsCi0gICBNNE9TQV9rVGhyZWFkTm9ybWFsUHJpb3JpdHkgICA9ICAweDIwMCwKLSAgIE00T1NBX2tUaHJlYWRMb3dQcmlvcml0eSAgICAgID0gIDB4MzAwLAotICAgTTRPU0Ffa1RocmVhZExvd2VzdFByaW9yaXR5ICAgPSAgMHg0MDAKLX0gTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbDsKLQotCi0KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0FfVGhyZWFkU3RhcnRlZAotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwMSksCi0KLSAgIE00T1NBX1RocmVhZFN0b3BwZWQKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDIpLAotCi0gICBNNE9TQV9UaHJlYWRQcmlvcml0eQotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwMyksCi0KLSAgIE00T1NBX1RocmVhZE5hbWUKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDQpLAotCi0gICBNNE9TQV9UaHJlYWRTdGFja1NpemUKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDUpLAotCi0gICBNNE9TQV9UaHJlYWRVc2VyRGF0YQotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwNikKLQotfSBNNE9TQV9UaHJlYWRPcHRpb25JRDsKLQotCi0KLXR5cGVkZWYgTTRPU0FfRVJSICAoKk00T1NBX1RocmVhZERvSXQpKE00T1NBX1ZvaWQqKTsKLXR5cGVkZWYgTTRPU0FfVm9pZCAoKk00T1NBX1RocmVhZENhbGxCYWNrKShNNE9TQV9Db250ZXh0LCBNNE9TQV9Wb2lkKik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY09wZW4oICAgICBNNE9TQV9Db250ZXh0KiAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZERvSXQgICAgICBmdW5jICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RhcnQoICAgIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogICAgICAgICAgIHBhcmFtICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RvcCggICAgIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jQ2xvc2UoICAgIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUoIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkU3RhdGUqICAgIHN0YXRlICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTbGVlcCggICAgICAgIE00T1NBX1VJbnQzMiAgICAgICAgICB0aW1lICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkT3B0aW9uSUQgIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gICAgICB2YWx1ZSApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbihNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEICBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiAgICAgdmFsdWUgKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9USFJFQURfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZF9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaHJlYWRfcHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDI0YjA1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZF9wcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UaHJlYWRfcHJpdi5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgVGhyZWFkIHByaXZhdGUgZm9yIEFuZHJvaWQKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX1RIUkVBRF9QUklWX0gKLSNkZWZpbmUgTTRPU0FfVEhSRUFEX1BSSVZfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0KLS8qIENvbnRleHQgZm9yIHRoZSB0aHJlYWQgKi8KLXR5cGVkZWYgc3RydWN0IE00T1NBX1RocmVhZENvbnRleHQgewotICAgTTRPU0FfVUludDMyIGNvcmVJRDsgICAgICAgICAgICAgICAgLyogdGhyZWFkIGNvbnRleHQgaWRlbnRpZmlhbnQgKi8KLSAgIHB0aHJlYWRfdCB0aHJlYWRJRDsgICAgICAgICAgICAgICAgIC8qIHRocmVhZCBpZGVudGlmaWVyLiAqLwotICAgTTRPU0FfQ2hhciogbmFtZTsgICAgICAgICAgICAgICAgICAgLyogdGhyZWFkIG5hbWUgKi8KLSAgIE00T1NBX1VJbnQzMiBzdGFja1NpemU7ICAgICAgICAgICAgIC8qIHRocmVhZCBzdGFja1NpemUgaW4gYnl0ZXMgKi8KLSAgIE00T1NBX1RocmVhZERvSXQgZnVuYzsgICAgICAgICAgICAgIC8qIHRocmVhZCBmdW5jdGlvbiAqLwotICAgTTRPU0FfVm9pZCogcGFyYW07ICAgICAgICAgICAgICAgICAgLyogdGhyZWFkIHBhcmFtZXRlciAqLwotLyoKLSAgIE00T1NBX1ZvaWQqIHVzZXJEYXRhOyAgICAgICAgICAgICAgIC8gKiB0aHJlYWQgdXNlciBkYXRhICogLwotKi8KLSAgIE00T1NBX1RocmVhZFN0YXRlIHN0YXRlOyAgICAgICAgICAgIC8qIHRocmVhZCBhdXRvbWF0b24gc3RhdGUgKi8KLSAgIE00T1NBX0NvbnRleHQgc3RhdGVNdXRleDsgICAgICAgICAgIC8qIG11dGV4IGZvciB0aHJlYWQgc3RhdGUgbWFuYWdlbWVudCAqLwotLyoKLSAgIE00T1NBX1RocmVhZENhbGxCYWNrIHN0YXJ0Q2FsbEJhY2s7IC8gKiBzdGFydGluZyB0aHJlYWQgY2FsbCBiYWNrICogLwotICAgTTRPU0FfVGhyZWFkQ2FsbEJhY2sgc3RvcENhbGxCYWNrOyAgLyAqIHN0b3BwaW5nIHRocmVhZCBjYWxsIGJhY2sgKiAvCi0qLwotICAgTTRPU0FfQ29udGV4dCBzZW1TdGFydFN0b3A7ICAgICAgICAgLyogc2VtYXBob3JlIGZvciBzdGFydCBhbmQgc3RvcCBkb19pdCAqLwotICAgTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCBwcmlvcml0eTsgLyogdGhyZWFkIHByaW9yaXR5IGxldmVsICovCi19IE00T1NBX1RocmVhZENvbnRleHQgOwotCi0KLS8qKiBUaG9zZSBkZWZpbmUgZW5hYmxlL2Rpc2FibGUgb3B0aW9uIElEKi8KLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQVJURUQgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUT1BQRUQgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgICAgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1VTRVJfREFUQSAgICAgICAgIE00T1NBX1RSVUUKLQotI2VuZGlmIC8qTTRPU0FfVEhSRUFEX1BSSVZfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RpbWUuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjFmMjVlZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UaW1lLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBUaW1lIG1hY3JvcwotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aW1lIHR5cGUgYW5kIGFzc29jaWF0ZWQgbWFjcm9zIHdoaWNoIG11c3QKLSAqICAgICAgICAgICAgICAgYmUgdXNlZCB0byBtYW5pcHVsYXRlIHRpbWUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiAkSWQ6IE00T1NBX1RpbWUuaCx2IDEuMiAyMDA3LzAxLzA1IDEzOjEyOjIyIHRoZW5hdWx0IEV4cCAkICovCi0KLSNpZm5kZWYgTTRPU0FfVElNRV9ICi0jZGVmaW5lIE00T1NBX1RJTUVfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0KLXR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyAgTTRPU0FfVGltZTsKLQotCi0vKiogVGhpcyBtYWNybyBzZXRzIHRoZSB1bmtub3duIHRpbWUgdmFsdWUgKi8KLQotI2RlZmluZSBNNE9TQV9USU1FX1VOS05PV04gMHg4MDAwMDAwMAotCi0vKiogVGhpcyBtYWNybyBjb252ZXJ0cyBhIHRpbWUgd2l0aCBhIHRpbWUgc2NhbGUgdG8gbWlsbGlzZWNvbmQuCi0gICAgVGhlIHJlc3VsdCBpcyBhIE00T1NBX0RvdWJsZSovCi0jZGVmaW5lIE00T1NBX1RJTUVfVE9fTVMocmVzdWx0LCB0aW1lLCB0aW1lc2NhbGUpXAotICAgICAgeyByZXN1bHQgPSAoMTAwMCooTTRPU0FfRG91YmxlKXRpbWUpLygoTTRPU0FfRG91YmxlKXRpbWVzY2FsZSk7IH0KLQotI2VuZGlmIC8qTTRPU0FfVElNRV9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyYTY4ZDguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UeXBlcy5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgQWJzdHJhY3Rpb24gdHlwZXMgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIHJlZGVmaW5lcyBiYXNpYyB0eXBlcyB3aGljaCBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgIHVzZWQgdG8gZGVjbGFyZSBhbnkgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBNNE9TQV9UWVBFU19ICi0jZGVmaW5lIE00T1NBX1RZUEVTX0gKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJNNE9TQV9FeHBvcnQuaCIKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi10eXBlZGVmIHNpZ25lZCBjaGFyICAgICBNNE9TQV9Cb29sOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgTTRPU0FfVUludDg7Ci10eXBlZGVmIHNpZ25lZCBjaGFyICAgICBNNE9TQV9JbnQ4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgTTRPU0FfVUludDE2OwotdHlwZWRlZiBzaWduZWQgc2hvcnQgICAgTTRPU0FfSW50MTY7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBNNE9TQV9VSW50MzI7Ci10eXBlZGVmIHNpZ25lZCBsb25nICAgICBNNE9TQV9JbnQzMjsKLQotdHlwZWRlZiBzaWduZWQgY2hhciAgICAgTTRPU0FfQ2hhcjsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIE00T1NBX1VDaGFyOwotCi10eXBlZGVmIGRvdWJsZSAgICAgICAgICBNNE9TQV9Eb3VibGU7Ci10eXBlZGVmIGZsb2F0ICAgICAgICAgICBNNE9TQV9GbG9hdDsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgTTRPU0FfV0NoYXI7Ci0KLXR5cGVkZWYgdm9pZCAgICAgICAgICAgIE00T1NBX1ZvaWQ7Ci0KLS8qIE1pbiAmIG1heCBkZWZpbml0aW9ucyovCi0jZGVmaW5lIE00T1NBX1VJTlQ4X01JTiAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUlOVDhfTUFYICAgICAgICAgICAgICAgIDI1NQotCi0jZGVmaW5lIE00T1NBX1VJTlQxNl9NSU4gICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUlOVDE2X01BWCAgICAgICAgICAgICA2NTUzNQotCi0jZGVmaW5lIE00T1NBX1VJTlQzMl9NSU4gICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUlOVDMyX01BWCAgICAgICAgMHhGRkZGRkZGRgotCi0jZGVmaW5lIE00T1NBX0lOVDhfTUlOICAgICAgICAgICAgICAgIC0xMjgKLSNkZWZpbmUgTTRPU0FfSU5UOF9NQVggICAgICAgICAgICAgICAgIDEyNwotCi0jZGVmaW5lIE00T1NBX0lOVDE2X01JTiAgICAgICAgICAgICAtMzI3NjgKLSNkZWZpbmUgTTRPU0FfSU5UMTZfTUFYICAgICAgICAgICAgICAzMjc2NwotCi0jZGVmaW5lIE00T1NBX0lOVDMyX01JTiAgICAgICAoLTB4N0ZGRkZGRkYtMSkKLSNkZWZpbmUgTTRPU0FfSU5UMzJfTUFYICAgICAgICAgMHg3RkZGRkZGRgotCi0jZGVmaW5lIE00T1NBX0NIQVJfTUlOICAgICAgICAgICAgICAgIC0xMjgKLSNkZWZpbmUgTTRPU0FfQ0hBUl9NQVggICAgICAgICAgICAgICAgIDEyNwotCi0jZGVmaW5lIE00T1NBX1VDSEFSX01JTiAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUNIQVJfTUFYICAgICAgICAgICAgICAgIDI1NQotCi0jZGVmaW5lIE00T1NBX05VTEwgICAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIE00T1NBX1RSVUUgICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIE00T1NBX0ZBTFNFICAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIE00T1NBX1dBSVRfRk9SRVZFUiAgICAgICAweGZmZmZmZmZmCi0KLSNkZWZpbmUgTTRPU0FfQ09OU1QgICAgICAgICAgICAgICAgICAgY29uc3QKLSNkZWZpbmUgTTRPU0FfSU5MSU5FICAgICAgICAgICAgICAgICBpbmxpbmUKLQotLyogUm9sbG92ZXIgb2Zmc2V0IG9mIHRoZSBjbG9jayAqLwotLyogVGhpcyB2YWx1ZSBtdXN0IGJlIHRoZSBvbmUgb2YgTTRPU0FfY2xvY2tHZXRUaW1lICovCi0jZGVmaW5lIE00T1NBX0NMT0NLX1JPTExPVkVSICAgICAgICAgICBNNE9TQV9JTlQzMl9NQVgKLQotdHlwZWRlZiB2b2lkKiAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0OwotCi0vKiogSXQgaXMgYSB1bmlxdWUgSUQgZm9yIGVhY2ggY29yZSBjb21wb25lbnQqLwotdHlwZWRlZiAgTTRPU0FfVUludDE2IE00T1NBX0NvcmVJRDsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qTTRPU0FfVFlQRVNfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjM4YjBjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWJ2aWRlb2VkaXRvcl9vc2FsCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcl9vc2FsCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgIFwKLSAgICBNNE9TQV9DaGFyU3Rhci5jIFwKLSAgICBNNE9TQV9DbG9jay5jIFwKLSAgICBNNE9TQV9GaWxlQ29tbW9uLmMgXAotICAgIE00T1NBX0ZpbGVSZWFkZXIuYyBcCi0gICAgTTRPU0FfRmlsZVdyaXRlci5jIFwKLSAgICBNNE9TQV9NdXRleC5jIFwKLSAgICBNNE9TQV9SYW5kb20uYyBcCi0gICAgTTRPU0FfU2VtYXBob3JlLmMgXAotICAgIE00T1NBX1RocmVhZC5jIFwKLSAgICBNNFBTV19EZWJ1Z1RyYWNlLmMgXAotICAgIE00UFNXX01lbW9yeUludGVyZmFjZS5jIFwKLSAgICBNNFBTV19UcmFjZS5jIFwKLSAgICBMVk9TQV9GaWxlUmVhZGVyX29wdGltLmMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGlidXRpbHMgbGlibG9nCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgLURfX0FORFJPSURfXyBcCi0gICAgLURNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0FVRElPREVDIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9WSURFT0RFQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQVVESU9FTkMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1ZJREVPRU5DIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9SRUFERVJTIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF8zR1BQX1JFQURFUgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxMWUwMDguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfb3B0aW0uYwotICogQGJyaWVmCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGZpbGVzeXN0ZW0gYWNjZXNzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiogQWRkaXRpb24gb2YgVHJhY2UgSUQgKiovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotI2lmZGVmIE00VFJBQ0VfSUQKLSN1bmRlZiBNNFRSQUNFX0lECi0jZW5kaWYKLSNkZWZpbmUgTTRUUkFDRV9JRCAgICBNNE9TQV9GSUxFX1JFQURFUgotCi0KLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jaW5jbHVkZSAiTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5oIgotCi0jZGVmaW5lIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotI2lmbmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICAjaW5jbHVkZSAiTTRPU0FfRmlsZUFjY2Vzcy5oIgotI2VuZGlmCi0KLSNkZWZpbmUgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUocmV0dmFsLCBwb2ludGVyKSBpZiAoKHBvaW50ZXIpID09IE00T1NBX05VTEwpIHJldHVybiAocmV0dmFsKTsKLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGaWxlIHJlYWRlciBjYWNoZSBidWZmZXJzIHBhcmFtZXRlcnMgKHNpemUsIG51bWJlciBvZiBidWZmZXJzLCBldGMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNE9TQV9SRUFEQlVGRkVSX1NJWkUgICAgMTAyNCoxNgotI2RlZmluZSBNNE9TQV9SRUFEQlVGRkVSX05CICAgICAgICAyCi0jZGVmaW5lIE00T1NBX1JFQURCVUZGRVJfTk9ORSAgICAtMQotI2RlZmluZSBNNE9TQV9FT0YgICAgICAgICAgICAgICAtMQotCi0jZGVmaW5lIE1BWF9GSUxMU19TSU5DRV9MQVNUX0FDQ0VTUyAgICBNNE9TQV9SRUFEQlVGRkVSX05CKjIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXIKLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBGaWxlIHJlYWRlciBCdWZmZXJzIGNvbnRleHQgKHByaXZhdGUpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgIGRhdGE7ICAgICAgICAvKio8IGJ1ZmZlciBkYXRhICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBzaXplOyAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBidWZmZXIgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIGZpbGVwb3M7ICAgIC8qKjwgcG9zaXRpb24gaW4gdGhlIGZpbGUgd2hlcmUgdGhlIGJ1ZmZlciBzdGFydHMgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIHJlbWFpbjsgICAgICAgIC8qKjwgZGF0YSBhbW91bnQgbm90IGFscmVhZHkgY29waWVkIGZyb20gYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBuYkZpbGxTaW5jZUxhc3RBY2VzczsgICAgLyoqPCBUbyBrbm93IHNpbmNlIGhvdyBtYW55IHRpbWUgd2UgZGlkbid0IHVzZSB0aGlzIGJ1ZmZlciAqLwotfSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlcl9vcHRpbTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgRmlsZSByZWFkZXIgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgRmlsZSBSZWFkZXIgY2FsbHMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIElzT3BlbmVkOyAgICAgICAvKio8IE1pY3JvIHN0YXRlIG1hY2hpbmUgKi8KLSAgICBNNE9TQV9GaWxlQXR0cmlidXRlICAgICBGaWxlQXR0cmlidXRlOyAgLyoqPCBPcGVuaW5nIG1vZGUgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgICAgICByZWFkRmlsZVBvczsgICAgLyoqPCBFZmZlY3RpdmUgcG9zaXRpb24gb2YgdGhlIEdGTCByZWFkIHBvaW50ZXIgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgICAgICBhYnNvbHV0ZVBvczsgICAgLyoqPCBWaXJ0dWFsIHBvc2l0aW9uIGZvciBuZXh0IHJlYWRpbmcgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgICAgICBmaWxlU2l6ZTsgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgZmlsZSAqLwotCi0gICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJfb3B0aW0gYnVmZmVyW000T1NBX1JFQURCVUZGRVJfTkJdOyAgLyoqPCBSZWFkIGJ1ZmZlcnMgKi8KLQotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgIGFGaWxlRGVzYzsgIC8qKjwgRmlsZSBkZXNjcmlwdG9yICovCi0KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICBGUzsgICAgICAgICAgICAvKio8IEZpbGVzeXN0ZW0gaW50ZXJmYWNlICovCi0jZWxzZQotICAgIE00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyICpGUzsgICAgICAgIC8qKjwgRmlsZXN5c3RlbSBpbnRlcmZhY2UgKi8KLSNlbmRpZgotCi19IE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbTsKLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICAgIEdsb2JhbCBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgbG93IGxldmVsIHJlYWQgYWNjZXNzICAgIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi1zdGF0aWMgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBndl9OWFBTV19SRUFET1BUX2xvd0xldmVsRnVuY3Rpb25zOwotCi1NNE9TQV9FUlIgTlhQU1dfRmlsZVJlYWRlck9wdGltX2luaXQoTTRPU0FfVm9pZCAqbG93TGV2ZWxfZnVuY3Rpb25Qb2ludGVycywgTTRPU0FfVm9pZCAqb3B0aW1pemVkX2Z1bmN0aW9uUG9pbnRlcnMpCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBsb3dMZXZlbF9mcCAgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKikgbG93TGV2ZWxfZnVuY3Rpb25Qb2ludGVyczsKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIG9wdGltaXplZF9mcCA9IChNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKSBvcHRpbWl6ZWRfZnVuY3Rpb25Qb2ludGVyczsKLQotICAgIC8vU2V0IHRoZSBvcHRpbWl6ZWQgZnVuY3Rpb25zLCB0byBiZSBjYWxsZWQgYnkgdGhlIHVzZXIKLSAgICBvcHRpbWl6ZWRfZnAtPm9wZW5SZWFkICA9IE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbTsKLSAgICBvcHRpbWl6ZWRfZnAtPnJlYWREYXRhICA9IE00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbTsKLSAgICBvcHRpbWl6ZWRfZnAtPnNlZWsgICAgICA9IE00T1NBX2ZpbGVSZWFkU2Vla19vcHRpbTsKLSAgICBvcHRpbWl6ZWRfZnAtPmNsb3NlUmVhZCA9IE00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5zZXRPcHRpb24gPSBNNE9TQV9maWxlUmVhZFNldE9wdGlvbl9vcHRpbTsKLSAgICBvcHRpbWl6ZWRfZnAtPmdldE9wdGlvbiA9IE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uX29wdGltOwotCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE5YUFNXX0ZpbGVSZWFkZXJPcHRpbV9jbGVhblVwKCkKLXsKLQotICAgIGd2X05YUFNXX1JFQURPUFRfbG93TGV2ZWxGdW5jdGlvbnMgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotTTRPU0FfRVJSIE5YUFNXX0ZpbGVSZWFkZXJPcHRpbV9nZXRMb3dMZXZlbEZ1bmN0aW9ucyhNNE9TQV9Wb2lkICoqRlMpCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiogcEZ1bmN0aW9uc1BvaW50ZXIgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKiopIEZTOwotICAgICpwRnVuY3Rpb25zUG9pbnRlciA9IGd2X05YUFNXX1JFQURPUFRfbG93TGV2ZWxGdW5jdGlvbnM7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICAgICAgICBCdWZmZXIgaGFuZGxpbmcgZnVuY3Rpb25zIGZvciBSZWFkIGFjY2VzcyAgICAgICAgIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJJbml0KE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID0gMDsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyA9IDA7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IDA7Ci0gICAgfQotCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhID0gKE00T1NBX01lbUFkZHI4KSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRPU0FfUkVBREJVRkZFUl9TSVpFLCAKLSAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckluaXQiKTsKLSAgICAgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEpOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9Wb2lkIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRnJlZShNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9JbnQ4IGk7Ci0KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgZnJlZShhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRmlsZVBvc2l0aW9uIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyQ29weShNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBpLCBNNE9TQV9GaWxlUG9zaXRpb24gcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gc2l6ZSwgTTRPU0FfTWVtQWRkcjggcERhdGEpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGNvcHlzaXplOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBvZmZzZXQ7Ci0KLSAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID09IE00T1NBX0VPRikgcmV0dXJuIE00T1NBX0VPRjsKLQotICAgIGlmKCAgIChwb3MgPCBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKQotICAgICAgIHx8IChwb3MgPiAoYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyArIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgLSAxKSkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7IC8qIG5vdGhpbmcgY29waWVkICovCi0gICAgfQotCi0gICAgb2Zmc2V0ID0gcG9zIC0gYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvczsKLQotICAgIGNvcHlzaXplID0gYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSAtIG9mZnNldDsKLSAgICBjb3B5c2l6ZSA9IChzaXplIDwgY29weXNpemUpID8gc2l6ZSA6IGNvcHlzaXplOwotCi0gICAgbWVtY3B5KCh2b2lkICopcERhdGEsICh2b2lkICopKGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgKyBvZmZzZXQpLCBjb3B5c2l6ZSk7Ci0KLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gLT0gY29weXNpemU7Ci0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgPSAwOwotCi0gICAgcmV0dXJuIGNvcHlzaXplOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBpLCBNNE9TQV9GaWxlUG9zaXRpb24gcG9zKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgZ3JpZFBvczsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgdGVtcFBvczsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIGJ1ZmZlclNpemU7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICBkaWZmOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgc2l6ZTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgZXJybm8gPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgIGZpbGVSZWFkU2l6ZSA9IDA7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICBmaWxlU2Vla1Bvc2l0aW9uID0gMDsKLSNlbHNlCi0gICAgTTRPU0FfSW50MzIgICAgICAgICByZXRfdmFsOwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgIGVycm5vOwotI2VuZGlmCi0KLSAgICBNNE9TQV9UUkFDRTNfNCgiQnVmZmVyRmlsbCAgaSA9ICVkICBwb3MgPSAlbGQgIHJlYWQgPSAlbGQgIG9sZCA9ICVsZCIsIGksIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MsIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MpOwotCi0gICAgLyogQXZvaWQgY3ljbGluZyBzdGF0ZW1lbnQgYmVjYXVzZSBvZiBFT0YgKi8KLSAgICBpZihwb3MgPj0gYXBDb250ZXh0LT5maWxlU2l6ZSkKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0KLSAgICAvKiBSZWxvY2F0ZSB0byBhYnNvbHV0ZSBwb3N0aW9uIGlmIG5lY2Vzc2FyeSAqLwotICAgIGJ1ZmZlclNpemUgPSBNNE9TQV9SRUFEQlVGRkVSX1NJWkU7Ci0gICAgdGVtcFBvcyA9IChNNE9TQV9GaWxlUG9zaXRpb24pIChwb3MgLyBidWZmZXJTaXplKTsKLSAgICBncmlkUG9zID0gdGVtcFBvcyAqIE00T1NBX1JFQURCVUZGRVJfU0laRTsKLSAgICBkaWZmID0gZ3JpZFBvcyAtIGFwQ29udGV4dC0+cmVhZEZpbGVQb3M7Ci0KLSAgICBpZihkaWZmICE9IDApCi0gICAgewotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgICAgICBmaWxlU2Vla1Bvc2l0aW9uID0gZGlmZjsKLSAgICAgICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5zZWVrKGFwQ29udGV4dC0+YUZpbGVEZXNjLCBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTZWVrUG9zaXRpb24pOwotICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gZ3JpZFBvczsKLQotICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycm5vKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0jZWxzZQotICAgICAgICByZXRfdmFsID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9TZWVrKGFwQ29udGV4dC0+YUZpbGVEZXNjLCBkaWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LCAmZXJybm8pOwotICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gZ3JpZFBvczsKLQotICAgICAgICBpZihyZXRfdmFsICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJybm8pOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotICAgIH0KLQotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgPSBhcENvbnRleHQtPnJlYWRGaWxlUG9zOwotCi0gICAgLyogUmVhZCBEYXRhICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgZmlsZVJlYWRTaXplID0gTTRPU0FfUkVBREJVRkZFUl9TSVpFOwotICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+cmVhZERhdGEoYXBDb250ZXh0LT5hRmlsZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KWFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEsICZmaWxlUmVhZFNpemUpOwotCi0gICAgc2l6ZSA9IChNNE9TQV9GaWxlUG9zaXRpb24pZmlsZVJlYWRTaXplOwotICAgIGlmICgoTTROT19FUlJPUiAhPSBlcnJubykmJihNNFdBUl9OT19EQVRBX1lFVCAhPSBlcnJubykpCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID0gTTRPU0FfRU9GOwotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPSAwOwotCi0gICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjIgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0jZWxzZQotICAgIHNpemUgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1JlYWQoYXBDb250ZXh0LT5hRmlsZURlc2MsCi0gICAgICAgIChNNE9TQV9VSW50OCAqKWFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEsIE00T1NBX1JFQURCVUZGRVJfU0laRSwgJmVycm5vKTsKLSAgICBpZihzaXplID09IC0xKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IE00T1NBX0VPRjsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID0gMDsKLQotICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVycm5vKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIyID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID0gc2l6ZTsKLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPSBzaXplOwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzID0gMDsKLQotICAgIC8qIFJldHJpZXZlIGN1cnJlbnQgcG9zaXRpb24gKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPmdldE9wdGlvbihhcENvbnRleHQtPmFGaWxlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24qKSAmYXBDb250ZXh0LT5yZWFkRmlsZVBvcyk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnJubykKLSAgICB7Ci0gICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjMgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0gICAgZWxzZSBpZiggICAoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA+PSAwKQotICAgICAgICYmIChhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplIDwgTTRPU0FfUkVBREJVRkZFUl9TSVpFKSApCi0gICAgewotICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCByZXR1cm5zIE5PIERBVEEgWUVUIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotI2Vsc2UKLSAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9UZWxsKGFwQ29udGV4dC0+YUZpbGVEZXNjLCAmZXJybm8pOwotCi0gICAgaWYoICAgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPj0gMCkKLSAgICAgICAmJiAoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA8IE00T1NBX1JFQURCVUZGRVJfU0laRSkgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMyA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSNlbmRpZiAvKk00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRiovCi0KLSAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9JbnQ4IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyTWF0Y2goTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9JbnQ4IGk7Ci0KLQotICAgIC8qIFNlbGVjdCB0aGUgYnVmZmVyIHdoaWNoIG1hdGNoZXMgd2l0aCBnaXZlbiBwb3MgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmKCAgIChwb3MgPj0gYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcykKLSAgICAgICAgICAgJiYgKHBvcyA8IChhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zICsgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00T1NBX1JFQURCVUZGRVJfTk9ORTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfSW50OCBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlclNlbGVjdChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBjdXJyZW50X2kpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfSW50OCBpLGo7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIG1pbl9hbW91bnQsbWF4X2Ftb3VudDsKLSAgICBNNE9TQV9JbnQ4IG1pbl9pLG1heF9jb3VudDsKLQotICAgIC8qIHVwZGF0ZSBuYkZpbGxTaW5jZUxhc3RBY2VzcyBmaWVsZCAqLwotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgKys7Ci0gICAgfQotCi0gICAgLyogUGxhbiBBIDogU2NhbiBmb3IgZW1wdHkgYnVmZmVyICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtYXhfY291bnQgPSBNNE9TQV9SRUFEQlVGRkVSX05COwotICAgIG1heF9hbW91bnQgPSBNQVhfRklMTFNfU0lOQ0VfTEFTVF9BQ0NFU1M7Ci0KLSAgICAvKiBQbGFuIEIgOiBTY2FuIGZvciBkZWFkIGJ1ZmZlciAqLwotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgPj0gKE00T1NBX1VJbnQzMikgbWF4X2Ftb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4X2Ftb3VudCA9IGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzOwotICAgICAgICAgICAgbWF4X2NvdW50ID0gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihtYXhfY291bnQ8TTRPU0FfUkVBREJVRkZFUl9OQikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8yKCJERUFEIEJVRkZFUjogJWQsICVkIixtYXhfY291bnQsYXBDb250ZXh0LT5idWZmZXJbbWF4X2NvdW50XS5uYkZpbGxTaW5jZUxhc3RBY2Vzcyk7Ci0gICAgICAgIHJldHVybiBtYXhfY291bnQ7Ci0gICAgfQotCi0gICAgbWluX2kgPSBjdXJyZW50X2k7Ci0gICAgbWluX2Ftb3VudCA9IE00T1NBX1JFQURCVUZGRVJfU0laRTsKLQotICAgIC8qIFNlbGVjdCB0aGUgYnVmZmVyIHdoaWNoIGlzIHRoZSBtb3N0ICJlbXB0eSIgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGogPSAoaStjdXJyZW50X2kpJU00T1NBX1JFQURCVUZGRVJfTkI7Ci0KLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbal0ucmVtYWluIDwgbWluX2Ftb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgbWluX2Ftb3VudCA9IGFwQ29udGV4dC0+YnVmZmVyW2pdLnJlbWFpbjsKLSAgICAgICAgICAgIG1pbl9pID0gajsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtaW5faTsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRPU0FfRmlsZVJlYWRlcl9DYWxjdWxhdGVTaXplKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSICAgICAgICAgICAgZXJybm8gPSBNNE5PX0VSUk9SOwotI2Vsc2UKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICByZXRfdmFsOwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgIGVycm5vOwotI2VuZGlmCi0KLSAgICAvKiBnbyB0byB0aGUgZW5kIG9mIGZpbGUqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+Z2V0T3B0aW9uKGFwQ29udGV4dC0+YUZpbGVEZXNjLCBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbiopICZhcENvbnRleHQtPmZpbGVTaXplKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnJubykKLSAgICB7Ci0gICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9DYWxjdWxhdGVTaXplIEVSUiA9IDB4JXgiLCBlcnIpOwotICAgIH0KLSNlbHNlCi0gICAgcmV0X3ZhbCA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfU2VlayhhcENvbnRleHQtPmFGaWxlRGVzYywgMCwgTTRPU0Ffa0ZpbGVTZWVrRW5kLCAmZXJybm8pOwotCi0gICAgaWYgKHJldF92YWwgIT0gMCkKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBNNE9TQV9FT0Y7Ci0gICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJybm8pOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9DYWxjdWxhdGVTaXplIEVSUiA9IDB4JXgiLCBlcnIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBSZXRyaWV2ZSBzaXplIG9mIHRoZSBmaWxlICovCi0gICAgICAgIGFwQ29udGV4dC0+ZmlsZVNpemUgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1RlbGwoYXBDb250ZXh0LT5hRmlsZURlc2MsICZlcnJubyk7Ci0gICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBhcENvbnRleHQtPmZpbGVTaXplOwotICAgIH0KLSNlbmRpZiAvKk00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRiovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgICAgICAgICAgICAgICAgICBPU0FMIGZpbGVzeXN0ZW0gQVBJICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgbWV0aG9kIG9wZW5zIHRoZSBwcm92aWRlZCBmaWxlRGVzY3JpcHRvciBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KLSogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoT1VUKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgcEZpbGVEZXNjcmlwdG9yIDogICAgICAgKElOKSBGaWxlIERlc2NyaXB0b3Igb2YgdGhlIGlucHV0IGZpbGUuCi0qIEBwYXJhbSAgICAgICBGaWxlTW9kZUFjY2VzcyA6ICAgICAgICAoSU4pIEZpbGUgbW9kZSBhY2Nlc3MuCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICAgTTRFUlJfUEFSQU1FVEVSIHBDb250ZXh0IG9yIGZpbGVEZXNjcmlwdG9yIGlzIE5VTEwKLSogQHJldHVybiAgICAgIE00RVJSX0FMTE9DICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTICAgICAgdGhlIGZpbGUgbW9kZSBhY2Nlc3MgaXMgbm90IGNvcnJlY3QgKGl0IG11c3QgYmUgZWl0aGVyIGlzVGV4dE1vZGUgb3IgcmVhZCkKLSogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EIFRoZSBmaWxlIGNhbiBub3QgYmUgb3BlbmVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0oTTRPU0FfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MpCi0jZWxzZQotICAgIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0oTTRPU0FfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0ciAqRlMpCi0jZW5kaWYKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9FUlIgICBlcnIgICAgICAgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1ZvaWQqIGFGaWxlRGVzYyA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfQm9vbCAgYnVmZmVyc19hbGxvY2F0ZWQgPSBNNE9TQV9GQUxTRTsKLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgZXJybm8gPSBNNE5PX0VSUk9SOwotI2Vsc2UKLSAgICBNNE9TQV9VSW50MTYgZXJybm87Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSBwID0gMHglcCBmZCA9ICVzIG1vZGUgPSAlbHUiLCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlRGVzY3JpcHRvciwgRmlsZU1vZGVBY2Nlc3MpOwotCi0gICAgLyogICAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCk7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwRmlsZURlc2NyaXB0b3IpOwotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIC8qICAgICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgRmlsZSByZWFkZXIgY29udGV4dC4gKi8KLSAgICBhcENvbnRleHQgPSAoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwgKE00T1NBX0NoYXIgKikiTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltIik7Ci0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9BTExPQywgYXBDb250ZXh0KTsKLQotICAgIC8qIFNldCBmaWxlc3lzdGVtIGludGVyZmFjZSAqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotCi0gICAgLypTZXQgdGhlIG9wdGltaXplZCBmdW5jdGlvbnMsIHRvIGJlIGNhbGxlZCBieSB0aGUgdXNlciovCi0KLSAgICBhcENvbnRleHQtPkZTID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfRmlsZVJlYWRQb2ludGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSJNNE9TQV9GaWxlUmVhZGVyT3B0aW1faW5pdCIpOwotICAgIGlmIChNNE9TQV9OVUxMPT1hcENvbnRleHQtPkZTKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00T1NBX0ZpbGVSZWFkZXJPcHRpbV9pbml0IC0gRVJST1IgOiBhbGxvY2F0aW9uIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGFwQ29udGV4dC0+RlMtPm9wZW5SZWFkICA9IE00T1NBX2ZpbGVSZWFkT3BlbjsKLSAgICBhcENvbnRleHQtPkZTLT5yZWFkRGF0YSAgPSBNNE9TQV9maWxlUmVhZERhdGE7Ci0gICAgYXBDb250ZXh0LT5GUy0+c2VlayAgICAgID0gTTRPU0FfZmlsZVJlYWRTZWVrOwotICAgIGFwQ29udGV4dC0+RlMtPmNsb3NlUmVhZCA9IE00T1NBX2ZpbGVSZWFkQ2xvc2U7Ci0gICAgYXBDb250ZXh0LT5GUy0+c2V0T3B0aW9uID0gTTRPU0FfZmlsZVJlYWRTZXRPcHRpb247Ci0gICAgYXBDb250ZXh0LT5GUy0+Z2V0T3B0aW9uID0gTTRPU0FfZmlsZVJlYWRHZXRPcHRpb247Ci0jZWxzZQotICAgIGFwQ29udGV4dC0+RlMgPSBGUzsKLSNlbmRpZgotCi0gICAgLyogVmVyaWZ5IGFjY2VzcyBtb2RlICovCi0gICAgaWYgKCAgICgoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUFwcGVuZCkgIT0gMCkKLSAgICAgICAgfHwgKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkgPT0gMCkpCi0gICAgewotICAgICAgICBlcnIgPSBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIC8qIE9wZW4gZmlsZSBpbiByZWFkIG1vZGUgKi8KLSAgICBpZigoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUNyZWF0ZSkgIT0gMCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogRmlsZSBpcyBvcGVuZWQgaW4gcmVhZCBvbmx5Ki8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICAgICAgICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+b3BlblJlYWQoJmFGaWxlRGVzYywgcEZpbGVEZXNjcmlwdG9yLCBGaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgICAgICAgICAgIGlmICgoYUZpbGVEZXNjID09IE00T1NBX05VTEwpfHwoTTROT19FUlJPUiAhPSBlcnJubykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICAgICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0gRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+SXNPcGVuZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICBhRmlsZURlc2MgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX09wZW4ocEZpbGVEZXNjcmlwdG9yLCBGaWxlTW9kZUFjY2VzcywgJmVycm5vKTsKLQotICAgICAgICAgICAgaWYgKGFGaWxlRGVzYyA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVycm5vKTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+SXNPcGVuZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIGdvdG8gY2xlYW51cDsKLQotICAgIC8qIEFsbG9jYXRlIGJ1ZmZlcnMgKi8KLSAgICBlcnIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckluaXQoYXBDb250ZXh0KTsKLSAgICBidWZmZXJzX2FsbG9jYXRlZCA9IE00T1NBX1RSVUU7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIGdvdG8gY2xlYW51cDsKLQotICAgIC8qIEluaXRpYWxpemUgcGFyYW1ldGVycyAqLwotICAgIGFwQ29udGV4dC0+ZmlsZVNpemUgPSAwOwotICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSAwOwotICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSAwOwotCi0gICAgLyogUmV0cmlldmUgdGhlIEZpbGUgRGVzY3JpcHRvciovCi0gICAgYXBDb250ZXh0LT5hRmlsZURlc2MgPSBhRmlsZURlc2M7Ci0KLSAgICAvKiBSZXRyaWV2ZSB0aGUgRmlsZSBtb2RlIEFjY2VzcyAqLwotICAgIGFwQ29udGV4dC0+RmlsZUF0dHJpYnV0ZS5tb2RlQWNjZXNzID0gKE00T1NBX0ZpbGVNb2RlQWNjZXNzKSBGaWxlTW9kZUFjY2VzczsKLQotICAgIC8qUmV0cmlldmUgdGhlIEZpbGUgcmVhZGVyIGNvbnRleHQgKi8KLSAgICAqcENvbnRleHQ9IChNNE9TQV9Db250ZXh0KWFwQ29udGV4dDsKLQotICAgIC8qIENvbXB1dGUgZmlsZSBzaXplICovCi0gICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9DYWxjdWxhdGVTaXplKGFwQ29udGV4dCk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIGdvdG8gY2xlYW51cDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi1jbGVhbnVwOgotCi0gICAgLyogZnJlZSBjb250ZXh0ICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gYXBDb250ZXh0KQotICAgIHsKLSAgICAgICAgaWYoYnVmZmVyc19hbGxvY2F0ZWQgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGcmVlKGFwQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmVlKCBhcENvbnRleHQpOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8xICgiTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltOiByZXR1cm5zIGVycm9yIDB4JTB4IiwgZXJyKQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCByZWFkcyB0aGUgJ3NpemUnIGJ5dGVzIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKQotKiAgICAgICAgICAgICAgICAgICAgICBhbmQgd3JpdGVzIHRoZSBkYXRhIHRvIHRoZSAnZGF0YScgcG9pbnRlci4gSWYgJ3NpemUnIGJ5dGUgY2FuIG5vdCBiZSByZWFkIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyLAotKiAgICAgICAgICAgICAgICAgICAgICAnc2l6ZScgcGFyYW1ldGVyIGlzIHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHJlYWQgYnl0ZXMuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgcERhdGEgOiAoT1VUKSBEYXRhIHBvaW50ZXIgb2YgdGhlIHJlYWQgZGF0YS4KLSogQHBhcmFtICAgICAgIHBTaXplIDogKElOT1VUKSBTaXplIG9mIHRoZSBkYXRhIHRvIHJlYWQgKGluIGJ5dGUpLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBwU2l6ZSwgZmlsZURlc2NyaXB0b3Igb3IgcERhdGEgaXMgTlVMTAotKiBAcmV0dXJuICAgICAgTTRFUlJfQUxMT0MgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWREYXRhX29wdGltKE00T1NBX0NvbnRleHQgcENvbnRleHQsTTRPU0FfTWVtQWRkcjggcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBTaXplKQotewotICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKikgcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBhU2l6ZTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gY29waWVkU2l6ZTsKLSAgICBNNE9TQV9JbnQ4IHNlbGVjdGVkX2J1ZmZlciwgY3VycmVudF9idWZmZXI7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygiTTRPU0FfZmlsZVJlYWREYXRhX29wdGltIHAgPSAweCVwICBkID0gMHglcCAgcyA9ICVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHBEYXRhLCAqcFNpemUpOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcERhdGEpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcFNpemUpOwotCi0gICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSAgICAvKiBQcmV2ZW50IHJlYWRpbmcgYmV5b25kIEVPRiAqLwotICAgIGlmKCgqcFNpemUgPiAwKSAmJiAoYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA+PSBhcENvbnRleHQtPmZpbGVTaXplKSkKLSAgICB7Ci0gICAgICAgIGNvcGllZFNpemUgPSAwOwotICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgZGF0YSBjYW4gYmUgcmVhZCBmcm9tIGEgYnVmZmVyICovCi0gICAgLyogSWYgbm90LCBmaWxsIG9uZSBhY2NvcmRpbmcgdG8gcXVhbnRpemVkIHBvc2l0aW9ucyAqLwotICAgIGNvcGllZFNpemUgPSAwOwotICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlck1hdGNoKGFwQ29udGV4dCwgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7Ci0KLSAgICBpZihzZWxlY3RlZF9idWZmZXIgPT0gTTRPU0FfUkVBREJVRkZFUl9OT05FKQotICAgIHsKLSAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJTZWxlY3QoYXBDb250ZXh0LCAwKTsKLSAgICAgICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsKGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zKTsKLSAgICB9Ci0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIGlmKGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCpwU2l6ZSA8PSAoTTRPU0FfVUludDMyKWFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkX2J1ZmZlcl0uc2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvcGllZFNpemUgPSAoTTRPU0FfVUludDMyKWFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkX2J1ZmZlcl0uc2l6ZTsKLSAgICAgICAgICAgICAgICAvKmNvcHkgdGhlIGNvbnRlbnQgaW50byBwRGF0YSovCi0gICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MsIGNvcGllZFNpemUsIHBEYXRhKTsKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygicmVhZCAgc2l6ZSA9ICVsdSAgYnVmZmVyID0gJWQgIHBvcyA9ICVsZCIsICpwU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciwgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7Ci0KLSAgICAvKiBDb3B5IGJ1ZmZlciBpbnRvIHBEYXRhICovCi0gICAgd2hpbGUoKChNNE9TQV9VSW50MzIpY29waWVkU2l6ZSA8ICpwU2l6ZSkgJiYgKGVyciA9PSBNNE5PX0VSUk9SKSkKLSAgICB7Ci0gICAgICAgIGFTaXplID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU2l6ZS1jb3BpZWRTaXplLCBwRGF0YStjb3BpZWRTaXplKTsKLSAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKLQotICAgICAgICBpZihhU2l6ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpY29waWVkU2l6ZSA8ICpwU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50X2J1ZmZlciA9IHNlbGVjdGVkX2J1ZmZlcjsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlck1hdGNoKGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZihzZWxlY3RlZF9idWZmZXIgPT0gTTRPU0FfUkVBREJVRkZFUl9OT05FKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJTZWxlY3QoYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsKGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJyID09IE00V0FSX05PX0RBVEFfWUVUKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSWYgd2UgZ290IGFsbCB0aGUgZGF0YSB0aGF0IHdlIHdhbnRlZCwgd2Ugc2hvdWxkIHJldHVybiBubyBlcnJvciovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqcFNpemUtY29waWVkU2l6ZSkgPD0gKE00T1NBX1VJbnQzMilhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF9idWZmZXJdLnNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKklmIHdlIGRpZCBub3QgZ2V0IGVub3VnaCBkYXRhLCB3ZSB3aWxsIHJldHVybiBOT19EQVRBX1lFVCovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvcHkgdGhlIGRhdGEgcmVhZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYVNpemUgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckNvcHkoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUtY29waWVkU2l6ZSwgcERhdGErY29waWVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qd2UgcmVhY2hlZCBlbmQgb2YgZmlsZSwgc28gc3RvcCB0cnlpbmcgdG8gcmVhZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBNNFdBUl9OT19NT1JFX0FVKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb3B5IHRoZSBkYXRhIHJlYWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTaXplID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUtY29waWVkU2l6ZSwgcERhdGErY29waWVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qd2UgcmVhY2hlZCBlbmQgb2YgZmlsZSwgc28gc3RvcCB0cnlpbmcgdG8gcmVhZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi1jbGVhbnVwIDoKLQotICAgIC8qIFVwZGF0ZSB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyICovCi0gICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgKyBjb3BpZWRTaXplOwotCi0gICAgaWYoKGVyciAhPSBNNE5PX0VSUk9SKSYmKGVyciE9TTRXQVJfTk9fREFUQV9ZRVQpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIk00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbSBzaXplID0gJWxkICBjb3BpZWQgPSAlbGQgIGVyciA9IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUsIGNvcGllZFNpemUsIGVycik7Ci0gICAgfQotCi0gICAgLyogRWZmZWN0aXZlIGNvcGllZCBzaXplIG11c3QgYmUgcmV0dXJuZWQgKi8KLSAgICAqcFNpemUgPSBjb3BpZWRTaXplOwotCi0KLSAgICAvKiBSZWFkIGlzIGRvbmUgKi8KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2Qgc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKS4KLSogICAgICAgICAgICAgIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciA6Ci0qICAgICAgICAgICAgICBGcm9tIHRoZSBiZWdpbm5pbmcgKHBvc2l0aW9uIE1VU1QgYmUgcG9zaXRpdmUpIDogZW5kIHBvc2l0aW9uID0gcG9zaXRpb24KLSogICAgICAgICAgICAgIEZyb20gdGhlIGVuZCAocG9zaXRpb24gTVVTVCBiZSBuZWdhdGl2ZSkgOiBlbmQgcG9zaXRpb24gPSBmaWxlIHNpemUgKyBwb3NpdGlvbgotKiAgICAgICAgICAgICAgRnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiAoc2lnbmVkIG9mZnNldCkgOiBlbmQgcG9zaXRpb24gPSBjdXJyZW50IHBvc2l0aW9uICsgcG9zaXRpb24uCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgU2Vla01vZGUgOiAgICAgIChJTikgU2VlayBhY2Nlc3MgbW9kZS4KLSogQHBhcmFtICAgICAgIHBQb3NpdGlvbiA6ICAgICAoSU4pIFBvc2l0aW9uIGluIHRoZSBmaWxlLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBTZWVrbW9kZSBvciBmaWxlRGVzY3JpcHRvciBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9BTExPQyAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KLSogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZWVrX29wdGltKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgU2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uKQotewotICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSopIHBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1RSQUNFM18zKCJNNE9TQV9maWxlUmVhZFNlZWtfb3B0aW0gcCA9IDB4JXAgbW9kZSA9ICVkIHBvcyA9ICVkIiwgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vla01vZGUsICpwUG9zaXRpb24pOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcFBvc2l0aW9uKTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIFNlZWtNb2RlKTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qPCBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KLSAgICB9Ci0KLSAgICAvKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLwotICAgIHN3aXRjaChTZWVrTW9kZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nIDoKLSAgICAgICAgICAgIGlmKCpwUG9zaXRpb24gPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsgLyoqPCBCYWQgU2Vla0FjZXNzIG1vZGUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSAqcFBvc2l0aW9uOwotICAgICAgICAgICAgKnBQb3NpdGlvbiA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0VuZCA6Ci0gICAgICAgICAgICBpZigqcFBvc2l0aW9uID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gYXBDb250ZXh0LT5maWxlU2l6ZSArICpwUG9zaXRpb247Ci0gICAgICAgICAgICAqcFBvc2l0aW9uID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvczsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCA6Ci0gICAgICAgICAgICBpZigoKGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgKyAqcFBvc2l0aW9uKSA+IGFwQ29udGV4dC0+ZmlsZVNpemUpIHx8Ci0gICAgICAgICAgICAgICAgKChhcENvbnRleHQtPmFic29sdXRlUG9zICsgKnBQb3NpdGlvbikgPCAwKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsgLyoqPCBCYWQgU2Vla0FjZXNzIG1vZGUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSBhcENvbnRleHQtPmFic29sdXRlUG9zICsgKnBQb3NpdGlvbjsKLSAgICAgICAgICAgICpwUG9zaXRpb24gPSBhcENvbnRleHQtPmFic29sdXRlUG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIGNsb3NlIHRoZSBmaWxlCi0qICAgICAgICAgICAgICAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkgYW5kIGFsc28gZnJlZXMgdGhlIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0oTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qKSBwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIE00T1NBX0VSUiBlcnJubyA9IE00Tk9fRVJST1I7Ci0jZWxzZQotICAgIE00T1NBX1VJbnQxNiBlcnJubzsKLSNlbmRpZgotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0gcCA9IDB4JXAiLCBwQ29udGV4dCApOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOwotCi0gICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsgICAgICAgLyoqPCBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KLSAgICB9Ci0KLSAgICAvKiBidWZmZXIgKi8KLSAgICBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZyZWUoYXBDb250ZXh0KTsKLQotICAgIC8qIENsb3NlIHRoZSBmaWxlICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5jbG9zZVJlYWQoYXBDb250ZXh0LT5hRmlsZURlc2MpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJybm8pCi0gICAgewotICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRDbG9zZV9vcHRpbSBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgfQotI2Vsc2UKLSAgICBhUmV0X1ZhbCA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfQ2xvc2UoYXBDb250ZXh0LT5hRmlsZURlc2MsICZlcnJubyk7Ci0KLSAgICBpZiAoYVJldF9WYWwgIT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZENsb3NlX29wdGltIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotCi0gICAgYXBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLy8+Pj4+IEdMTTIwMDkwMjEyIDogc2V0IHRoZSBsb3cgbGV2ZWwgZnVuY3Rpb24gc3RhdGljYWxseQotICAgIGlmIChhcENvbnRleHQtPkZTICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKCBhcENvbnRleHQtPkZTKTsKLSAgICB9Ci0gICAgLy88PDw8IEdMTTIwMDkwMjEyIDogc2V0IHRoZSBsb3cgbGV2ZWwgZnVuY3Rpb24gc3RhdGljYWxseQotCi0gICAgLyogRnJlZSB0aGUgY29udGV4dCAqLwotICAgIGZyZWUoYXBDb250ZXh0KTsKLQotICAgIC8qIFJldHVybiB3aXRob3V0IGVycm9yICovCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgaXMgYSBkdW1teSBmdW5jdGlvbiByZXF1aXJlZCB0byBtYWludGFpbiBmdW5jdGlvbiBwb2ludGVyCi0qICAgICAgICAgICAgICBzdHJ1Y3R1cmUuCi0qIEBub3RlICAgICAgICBUaGlzIGlzIGEgZHVtbXkgZnVuY3Rpb24gcmVxdWlyZWQgdG8gbWFpbnRhaW4gZnVuY3Rpb24gcG9pbnRlcgotKiAgICAgICAgICAgICAgc3RydWN0dXJlLgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBPcHRpb25JZCA6ICAgICAgKElOKSBJZCBvZiB0aGUgb3B0aW9uIHRvIHNldC4KLSogQHBhcmFtICAgICAgIE9wdGlvblZhbHVlIDogICAoSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24uCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uX29wdGltKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBPcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIE9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZAotKiAgICAgICAgICAgICAgd2l0aCB0aGUgb3B0aW9uSUQuVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nCi0qICAgICAgICAgICAgICB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSogQG5vdGUgICAgICAgIFRoZSBvcHRpb25zIGhhbmRsZWQgYnkgdGhlIGNvbXBvbmVudCBkZXBlbmQgb24gdGhlIGltcGxlbWVudGF0aW9uCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGNvbXBvbmVudC4KLSogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgT3B0aW9uSWQgOiAgICAgIChJTikgSWQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCi0qIEBwYXJhbSAgICAgICBwT3B0aW9uVmFsdWUgOiAgKE9VVCkgVmFsdWUgb2YgdGhlIG9wdGlvbi4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwQ29udGV4dCBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfT1BUSU9OX0lEIHRoZSBvcHRpb24gaWQgaXMgbm90IHZhbGlkLgotKiBAcmV0dXJuICAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEIFRoZSBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZEdldE9wdGlvbl9vcHRpbShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgT3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcE9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSopIHBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qKjwgVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCi0gICAgfQotCi0gICAgLyogR2V0IHRoZSBkZXNpcmVkIG9wdGlvbiBpZiBpdCBpcyBhdmFsYWlibGUgKi8KLSAgICBzd2l0Y2goT3B0aW9uSUQpCi0gICAgewotICAgICAgICAvKiBHZXQgRmlsZSBTaXplICovCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemU6LyoqPCBHZXQgc2l6ZSBvZiB0aGUgZmlsZSwgbGltaXRlZCB0byAzMiBiaXQgc2l6ZSAqLwotCi0gICAgICAgICAgICAoKihNNE9TQV9VSW50MzIgKilwT3B0aW9uVmFsdWUpID0gYXBDb250ZXh0LT5maWxlU2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIENoZWNrIEVuZCBvZiBmaWxlIE9jY3VycyAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZElzRU9GIDogICAgIC8qKjwgU2VlIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlICovCi0KLSAgICAgICAgICAgICgqKE00T1NBX0Jvb2wgKilwT3B0aW9uVmFsdWUpID0gKGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPj0gYXBDb250ZXh0LT5maWxlU2l6ZSkgPyBNNE9TQV9UUlVFIDogTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBHZXQgRmlsZSBQb3NpdGlvbiAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVQb3NpdGlvbiA6ICAgLyoqPCBHZXQgZmlsZSBwb3NpdGlvbiAqLwotCi0gICAgICAgICAgICAqKE00T1NBX0ZpbGVQb3NpdGlvbiAqKXBPcHRpb25WYWx1ZSA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBHZXQgQXR0cmlidXRlICovCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZUF0dHJpYnV0ZSA6ICAvKio8IEdldCB0aGUgZmlsZSBhdHRyaWJ1dGUgPSBhY2Nlc3MgbW9kZSAqLwotCi0gICAgICAgICAgICAoKihNNE9TQV9GaWxlQXR0cmlidXRlICopcE9wdGlvblZhbHVlKS5tb2RlQWNjZXNzID0gYXBDb250ZXh0LT5GaWxlQXR0cmlidXRlLm1vZGVBY2Nlc3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyoqPCBCYWQgb3B0aW9uIElEICovCi0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLypSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DaGFyU3Rhci5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2hhclN0YXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDgxNGNiZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DaGFyU3Rhci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00RFBBS19DaGFyU3Rhci5jCi0gKiBAaW5ncm91cAotICAqIEBicmllZiAgICAgICAgZGVmaW5pdGlvbiBvZiB0aGUgQ2hhciBTdGFyIHNldCBvZiBmdW5jdGlvbnMuCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBDaGFyIFN0YXIgc2V0IG9mIGZ1bmN0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLS8qIFdBUk5JTkc6IFNwZWNpZmljIEFuZHJvaWQgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cm5jcHkoKS4KLSAqIEBub3RlICAgICAgIEl0IGNvcGllcyBleGFjdGx5IGxlbjJDb3B5IGNoYXJhY3RlcnMgZnJvbSBwU3RySW4gdG8gcFN0ck91dCwKLSAqICAgICAgICAgICAgIHRydW5jYXRpbmcgIHBTdHJJbiBvciBhZGRpbmcgbnVsbCBjaGFyYWN0ZXJzIHRvIHBTdHJPdXQgaWYKLSAqICAgICAgICAgICAgIG5lY2Vzc2FyeS4KLSAqICAgICAgICAgICAgIC0gSWYgbGVuMkNvcHkgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgcFN0ckluLAotICogICAgICAgICAgICAgICBhIG51bGwgY2hhcmFjdGVyIGlzIGFwcGVuZGVkIGF1dG9tYXRpY2FsbHkgdG8gdGhlIGNvcGllZAotICogICAgICAgICAgICAgICBzdHJpbmcuCi0gKiAgICAgICAgICAgICAtIElmIGxlbjJDb3B5IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHBTdHJJbiwgcFN0ck91dCBpcwotICogICAgICAgICAgICAgICBwYWRkZWQgd2l0aCBudWxsIGNoYXJhY3RlcnMgdXAgdG8gbGVuZ3RoIGxlbjJDb3B5LgotICogICAgICAgICAgICAgLSBwU3RyT3V0IGFuZCBwU3RySW4gTVVTVCBOT1QgT1ZFUkxBUCAodGhpcyBpcyBOT1QgQ0hFQ0tFRCkuCi0gKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBEZXN0aW5hdGlvbiBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIFNvdXJjZSBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgbGVuMkNvcHk6IChJTikgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHBTdHJJbiB0byBjb3B5LgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwU3RyT3V0IGlzIE00T1NBX05VTEwuCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJOQ29weShNNE9TQV9DaGFyKiBwU3RyT3V0LCBNNE9TQV9DaGFyICAgKnBTdHJJbiwgTTRPU0FfVUludDMyIGxlbjJDb3B5KQotewotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJOQ29weVx0KE00T1NBX0NoYXIqICV4LE00T1NBX0NoYXIqICV4LE00T1NBX1VJbnQzMiAlbGQpIiwKLSAgICAgICAgcFN0ck91dCxwU3RySW4sbGVuMkNvcHkpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU3RyT3V0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nock5Db3B5Olx0cFN0ck91dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTdHJJbiksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJOQ29weTpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzdHJuY3B5KChjaGFyICopcFN0ck91dCwgKGNvbnN0IGNoYXIgKilwU3RySW4sIChzaXplX3QpbGVuMkNvcHkpOwotICAgIGlmKGxlbjJDb3B5IDw9IChNNE9TQV9VSW50MzIpc3RybGVuKChjb25zdCBjaGFyICopcFN0ckluKSkKLSAgICB7Ci0gICAgICAgIHBTdHJPdXRbbGVuMkNvcHldID0gJ1wwJzsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBib29sZWFuIGNvbXBhcmlzb24gb2YgcFN0ckluMSBhbmQgcFN0ckluMi4KLSAqIEBub3RlICAgICAgIFRoZSB2YWx1ZSByZXR1cm5lZCBpbiByZXN1bHQgaXMgTTRPU0FfVFJVRSBpZiB0aGUgc3RyaW5nCi0gKiAgICAgICAgICAgICBwb2ludGVkIHRvIGJ5IHBTdHJJbjEgaXMgc3RyaWN0bHkgaWRlbnRpY2FsIHRvIHRoZSBzdHJpbmcgcG9pbnRlZAotICogICAgICAgICAgICAgdG8gYnkgcFN0ckluMiwgYW5kIE00T1NBX0ZBTFNFIG90aGVyd2lzZS4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjE6IChJTikgRmlyc3QgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjI6IChJTikgU2Vjb25kIGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBjbXBSZXN1bHQ6IChPVVQpIENvbXBhcmlzb24gcmVzdWx0LgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbjEgcFN0ckluMiBvciBjbXBSZXN1bHQgaXMgTTRPU0FfTlVMTC4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2NockFyZUlkZW50aWNhbChNNE9TQV9DaGFyKiBwU3RySW4xLCBNNE9TQV9DaGFyKiBwU3RySW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCogcFJlc3VsdCkKLXsKLSAgICBNNE9TQV9VSW50MzIgaTMyLGxlbjMyOwotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJBcmVJZGVudGljYWxcdChNNE9TQV9DaGFyKiAleCxNNE9TQV9DaGFyKiAleCwiCi0gICAgICAgICJNNE9TQV9JbnQzMiogJXgpIixwU3RySW4xLHBTdHJJbjIscFJlc3VsdCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluMSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJBcmVJZGVudGljYWw6XHRwU3RySW4xIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4yLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockFyZUlkZW50aWNhbDpcdHBTdHJJbjIgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBSZXN1bHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyQXJlSWRlbnRpY2FsOlx0cFJlc3VsdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBsZW4zMiA9IChNNE9TQV9VSW50MzIpc3RybGVuKChjb25zdCBjaGFyICopcFN0ckluMSk7Ci0gICAgaWYobGVuMzIgIT0gKE00T1NBX1VJbnQzMilzdHJsZW4oKGNvbnN0IGNoYXIgKilwU3RySW4yKSkKLSAgICB7Ci0gICAgICAgICpwUmVzdWx0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGZvcihpMzI9MDtpMzI8bGVuMzI7aTMyKyspCi0gICAgewotICAgICAgICBpZihwU3RySW4xW2kzMl0gIT0gcFN0ckluMltpMzJdKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFJlc3VsdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqcFJlc3VsdCA9IE00T1NBX1RSVUU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIE00T1NBX1VJbnQzMiBmcm9tIHN0cmluZy4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGZpcnN0IHNldCBvZiBub24td2hpdGVzcGFjZQotICogICAgICAgICAgICAgY2hhcmFjdGVycyBvZiBwU3RySW4gdG8gYSBNNE9TQV9VSW50MzIgdmFsdWUgcFZhbCwgYXNzdW1pbmcgYQotICogICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gaW4gYmFzZSBwcm92aWRlZCBieSB0aGUgcGFyYW1ldGVyIGJhc2UuIHBTdHJPdXQgaXMKLSAqICAgICAgICAgICAgIHNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0Ci0gKiAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIG51bWJlciB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAotICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBuZWdhdGl2ZSBudW1iZXIsIHBTdHJPdXQgaXMgbm90IHVwZGF0ZWQsIGFuZCBwVmFsIGlzCi0gKiAgICAgICAgICAgICAgIHNldCB0byBudWxsLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG51bWVyaWNhbCBvdmVyZmxvdywgcFZhbCBpcyBzZXQgdG8gTTRPU0FfVUlOVDMyX01BWC4KLSAqICAgICAgICAgICAgIC0gaWYgcFN0ck91dCBpcyBub3QgdG8gYmUgdXNlZCwgaXQgY2FuIGJlIHNldCB0byBNNE9TQV9OVUxMLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBwVmFsOiAoT1VUKSByZWFkIHZhbHVlLgotICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgT3V0cHV0IGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBiYXNlOiAoSU4pIEJhc2Ugb2YgdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBWYWwgaXMgTTRPU0FfTlVMTC4KLSAqIEByZXR1cm4gICAgIE00RVJSX0NIUl9DT05WX0ZBSUxFRDogY29udmVyc2lvbiBmYWlsdXJlLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05VTV9SQU5HRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgotICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIE00T1NBX1VJTlQzMl9NQVguCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTkVHQVRJVkU6IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudHMgYSBuZWdhdGl2ZQotICogICAgICAgICAgICAgbnVtYmVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJHZXRVSW50MzIoTTRPU0FfQ2hhciogICAgcFN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqICAgIHBWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiAgICBwU3RyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpCi17Ci0gICAgTTRPU0FfVUludDMyIHVsOwotICAgIGNoYXIqICAgICAgICBwVGVtcDsKLQotICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJHZXRVSW50MzJcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfVUludDMyKiAleCIKLSAgICAgICAgIk00T1NBX0NoYXIqKiAleCxNNE9TQV9jaHJOdW1CYXNlICVkKSIscFN0ckluLHBWYWwscFN0ck91dCxiYXNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFVJbnQzMjpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFZhbCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MzI6XHRwVmFsIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGVycm5vID0gMDsKLSAgICBzd2l0Y2goYmFzZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rY2hyRGVjOgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwgMTApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00T1NBX2tjaHJIZXhhOgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwxNik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRPU0Ffa2Nock9jdDoKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsOCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogaGFzIGNvbnZlcnNpb24gZmFpbGVkID8gKi8KLSAgICBpZigoTTRPU0FfQ2hhciopcFRlbXAgPT0gcFN0ckluKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSAwOwotICAgICAgICByZXR1cm4gTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOwotICAgIH0KLQotICAgIC8qIHdhcyB0aGUgbnVtYmVyIG5lZ2F0aXZlID8gKi8KLSAgICBpZigqKHBTdHJJbitzdHJzcG4oKGNvbnN0IGNoYXIgKilwU3RySW4sIiBcdCIpKSA9PSAnLScpCi0gICAgewotICAgICAgICAqcFZhbCA9IDA7Ci0gICAgICAgIHJldHVybiBNNFdBUl9DSFJfTkVHQVRJVkU7Ci0gICAgfQotCi0gICAgLyogaGFzIGFuIG92ZXJmbG93IG9jY3VyZWQgPyAqLwotICAgIGlmKGVycm5vID09IEVSQU5HRSkKLSAgICB7Ci0gICAgICAgICpwVmFsID0gTTRPU0FfVUlOVDMyX01BWDsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05VTV9SQU5HRTsKLSAgICB9Ci0KLSAgICAvKiBub21pbmFsIGNhc2UgKi8KLSAgICAqcFZhbCA9IChNNE9TQV9VSW50MzIpdWw7Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgIHsKLSAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgTTRPU0FfVUludDE2IGZyb20gc3RyaW5nLgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgZmlyc3Qgc2V0IG9mIG5vbi13aGl0ZXNwYWNlCi0gKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIG9mIHBTdHJJbiB0byBhIE00T1NBX1VJbnQxNiB2YWx1ZSBwVmFsLCBhc3N1bWluZyBhCi0gKiAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBpbiBiYXNlIHByb3ZpZGVkIGJ5IHRoZSBwYXJhbWV0ZXIgYmFzZS4gcFN0ck91dCBpcwotICogICAgICAgICAgICAgc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBmb2xsb3dpbmcgdGhlIGxhc3QKLSAqICAgICAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgbnVtYmVyIHRoYXQgaGFzIGJlZW4gY29udmVydGVkLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIGNvbnZlcnNpb24sIHBTdHJPdXQgaXMgbm90Ci0gKiAgICAgICAgICAgICAgIHVwZGF0ZWQsIGFuZCBwVmFsIGlzIHNldCB0byBudWxsLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG5lZ2F0aXZlIG51bWJlciwgcFN0ck91dCBpcyBub3QgdXBkYXRlZCwgYW5kIHBWYWwgaXMKLSAqICAgICAgICAgICAgICAgc2V0IHRvIG51bGwuCi0gKiAgICAgICAgICAgICAtIGluIGNhc2Ugb2YgbnVtZXJpY2FsIG92ZXJmbG93LCBwVmFsIGlzIHNldCB0byBNNE9TQV9VSU5UMTZfTUFYLgotICogICAgICAgICAgICAgLSBpZiBwU3RyT3V0IGlzIG5vdCB0byBiZSB1c2VkLCBpdCBjYW4gYmUgc2V0IHRvIE00T1NBX05VTEwuCi0gKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBWYWw6IChPVVQpIHJlYWQgdmFsdWUuCi0gKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBPdXRwdXQgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIGJhc2U6IChJTikgQmFzZSBvZiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFZhbCBpcyBNNE9TQV9OVUxMLgotICogQHJldHVybiAgICAgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOiBjb252ZXJzaW9uIGZhaWx1cmUuCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTlVNX1JBTkdFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbnVtYmVyCi0gKiAgICAgICAgICAgICBncmVhdGVyIHRoYW4gTTRPU0FfVUlOVDE2X01BWC4KLSAqIEByZXR1cm4gICAgIE00V0FSX0NIUl9ORUdBVElWRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG5lZ2F0aXZlCi0gKiAgICAgICAgICAgICBudW1iZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2NockdldFVJbnQxNiAoTTRPU0FfQ2hhciogcFN0ckluLCBNNE9TQV9VSW50MTYgKnBWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogcFN0ck91dCwgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX1VJbnQzMiB1bDsKLSAgICBjaGFyKiAgICAgICAgcFRlbXA7Ci0KLSAgICBNNE9TQV9UUkFDRTFfNCgiTTRPU0FfY2hyR2V0VUludDE2XHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1VJbnQxNiogJXgiCi0gICAgICAgICJNNE9TQV9DaGFyKiogJXgsTTRPU0FfY2hyTnVtQmFzZSAlZCkiLHBTdHJJbixwVmFsLHBTdHJPdXQsYmFzZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFVJbnQxNjpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFZhbCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MTY6XHRwVmFsIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHN3aXRjaChiYXNlKQotICAgIHsKLSAgICBjYXNlIE00T1NBX2tjaHJEZWM6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDEwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNE9TQV9rY2hySGV4YToKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsMTYpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00T1NBX2tjaHJPY3Q6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDgpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIGhhcyBjb252ZXJzaW9uIGZhaWxlZCA/ICovCi0gICAgaWYoKE00T1NBX0NoYXIqKXBUZW1wID09IHBTdHJJbikKLSAgICB7Ci0gICAgICAgICpwVmFsID0gMDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9DT05WX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAvKiB3YXMgdGhlIG51bWJlciBuZWdhdGl2ZSA/ICovCi0gICAgaWYoKihwU3RySW4rc3Ryc3BuKChjb25zdCBjaGFyICopcFN0ckluLCIgXHQiKSkgPT0gJy0nKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSAwOwotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05FR0FUSVZFOwotICAgIH0KLQotICAgIC8qIGhhcyBhbiBvdmVyZmxvdyBvY2N1cmVkID8gKi8KLSAgICBpZih1bD5NNE9TQV9VSU5UMTZfTUFYKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSBNNE9TQV9VSU5UMTZfTUFYOwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNFdBUl9DSFJfTlVNX1JBTkdFOwotICAgIH0KLQotICAgIC8qIG5vbWluYWwgY2FzZSAqLwotICAgICpwVmFsID0gKE00T1NBX1VJbnQxNil1bDsKLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgewotICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNE9TQV9jaHJTUHJpbnRmKE00T1NBX0NoYXIgICpwU3RyT3V0LCBNNE9TQV9VSW50MzIgc3RyT3V0TWF4TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpmb3JtYXQsIC4uLikKLXsKLSAgICB2YV9saXN0ICAgICAgIG1hcmtlcjsKLSAgICBNNE9TQV9DaGFyICAgKnBUZW1wOwotICAgIE00T1NBX0NoYXIgICAqcGVyY2VudFBvaW50ZXI7Ci0gICAgTTRPU0FfQ2hhciAgICpuZXdGb3JtYXQ7Ci0gICAgTTRPU0FfSW50MzIgIG5ld0Zvcm1hdExlbmd0aD0wOwotICAgIE00T1NBX1VJbnQzMiAgY291bnRfbGwgPSAwOwotICAgIE00T1NBX1VJbnQzMiAgY291bnRfdG0gPSAwOwotICAgIE00T1NBX1VJbnQzMiAgY291bnRfYWEgPSAwOwotICAgIE00T1NBX1VJbnQzMiAgY291bnQ7Ci0gICAgTTRPU0FfVUludDMyICBuYkNoYXI7Ci0gICAgTTRPU0FfSW50MzIgICAgIGVycjsKLSAgICBNNE9TQV9DaGFyIGZsYWdDaGFyW10gICAgICAgICAgICAgPSAiJy0rICMwIjsKLSAgICBNNE9TQV9DaGFyIHdpZHRoT3JQcmVjaXNpb25DaGFyW10gPSAiKjAxMjM0NTY3ODkiOwotICAgIE00T1NBX0NoYXIgb3RoZXJQcmVmaXhDaGFyW10gICAgICA9ICJobEwiOwotICAgIE00T1NBX0NoYXIgY29udmVyc2lvbkNoYXJbXSAgICAgICA9ICJkaW91eFhuZmVFZ0djQ3NTcCUiOwotCi0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2NoclNQcmludGZcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfVUludDMyICVsZCIKLSAgICAgICAgIk00T1NBX0NoYXIqICV4KSIscFN0ck91dCxzdHJPdXRNYXhMZW4sZm9ybWF0KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyT3V0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyU1ByaW50ZjpcdHBTdHJPdXQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGZvcm1hdCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTUHJpbnRmOlx0Zm9ybWF0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIHZhX3N0YXJ0KG1hcmtlcixmb3JtYXQpOwotCi0gICAgLyogY291bnQgdGhlIG51bWJlciBvZiAlW2ZsYWdzXVt3aWR0aF1bLnByZWNpc2lvbl1sbFtjb252ZXJzaW9uXSAqLwotICAgIHBUZW1wID0gZm9ybWF0OwotICAgIHdoaWxlKCpwVGVtcCkKLSAgICB7Ci0gICAgICAgIHBlcmNlbnRQb2ludGVyID0gKE00T1NBX0NoYXIgKilzdHJjaHIoKGNvbnN0IGNoYXIgKilwVGVtcCwnJScpOyAvKiBnZXQgdGhlIG5leHQgcGVyY2VudCBjaGFyYWN0ZXIgKi8KLSAgICAgICAgaWYoIXBlcmNlbnRQb2ludGVyKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIHBUZW1wID0gcGVyY2VudFBvaW50ZXIrMTsgICAgICAgICAgIC8qIHNwYW4gaXQgKi8KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwoY29uc3QgY2hhciAqKWZsYWdDaGFyKTsgICAgLyogc3BhbiB0aGUgb3B0aW9uYWwgZmxhZ3MgKi8KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwoY29uc3QgY2hhciAqKXdpZHRoT3JQcmVjaXNpb25DaGFyKTsgLyogc3BhbiB0aGUgb3B0aW9uYWwgd2lkdGggKi8KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBpZigqcFRlbXA9PScuJykKLSAgICAgICAgewotICAgICAgICAgICAgcFRlbXArKzsKLSAgICAgICAgICAgIHBUZW1wICs9IHN0cnNwbigoY29uc3QgY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKXdpZHRoT3JQcmVjaXNpb25DaGFyKTsgLyogc3BhbiB0aGUgb3B0aW9uYWwgcHJlY2lzaW9uICovCi0gICAgICAgIH0KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBpZihzdHJsZW4oKGNvbnN0IGNoYXIgKilwVGVtcCk+PTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopcFRlbXAsImxsIiwyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3VudF9sbCsrOyAgICAgICAgICAgICAgICAgLyogSSBnb3QgT05FICovCi0gICAgICAgICAgICAgICAgcFRlbXAgKz0yOyAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJsbCIgcHJlZml4ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopcFRlbXAsInRtIiwyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3VudF90bSsrOwotICAgICAgICAgICAgICAgIHBUZW1wICs9MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilwVGVtcCwiYWEiLDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvdW50X2FhKys7Ci0gICAgICAgICAgICAgICAgcFRlbXAgKz0yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBUZW1wICs9IHN0cnNwbigoY29uc3QgY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKW90aGVyUHJlZml4Q2hhcik7IC8qIHNwYW4gdGhlIG90aGVyIG9wdGlvbmFsIHByZWZpeCAqLwotICAgICAgICBpZighKnBUZW1wKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgcFRlbXAgKz0gc3Ryc3BuKChjb25zdCBjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopY29udmVyc2lvbkNoYXIpOwotICAgICAgICBpZighKnBUZW1wKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICB9Ci0KLSAgICBjb3VudCA9IGNvdW50X2xsICsgY291bnRfdG0gKyBjb3VudF9hYTsKLQotICAgIGlmKCFjb3VudCkKLSAgICB7Ci0gICAgICAgIGVycj0gdnNucHJpbnRmKChjaGFyICopcFN0ck91dCwgKHNpemVfdClzdHJPdXRNYXhMZW4gKyAxLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbWFya2VyKTsKLSAgICAgICAgdmFfZW5kKG1hcmtlcik7Ci0gICAgICAgIGlmICgoZXJyPDApIHx8ICgoTTRPU0FfVUludDMyKWVycj5zdHJPdXRNYXhMZW4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3RyT3V0W3N0ck91dE1heExlbl0gPSAnXDAnOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9TVFJfT1ZFUkZMT1c7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgbmV3Rm9ybWF0TGVuZ3RoID0gc3RybGVuKChjb25zdCBjaGFyICopZm9ybWF0KSArIDE7Ci0KLSAgICBuZXdGb3JtYXRMZW5ndGggLT0gKGNvdW50X2xsK2NvdW50X3RtK2NvdW50X2FhKTsKLQotICAgIG5ld0Zvcm1hdCA9KE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhuZXdGb3JtYXRMZW5ndGgsCi0gICAgICAgIE00T1NBX0NIQVJTVEFSLChNNE9TQV9DaGFyKikiTTRPU0FfY2hyUHJpbnRmOiBuZXdGb3JtYXQiKTsKLSAgICBpZihNNE9TQV9OVUxMID09IG5ld0Zvcm1hdCkKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIG5ld0Zvcm1hdFtuZXdGb3JtYXRMZW5ndGgtMV0gPSAnXDAnOwotICAgIHBUZW1wID0gbmV3Rm9ybWF0OwotCi0gICAgLyogY29weSBmb3JtYXQgdG8gbmV3Rm9ybWF0LCByZXBsYWNpbmcgJVtmbGFnc11bd2lkdGhdWy5wcmVjaXNpb25dbGxbY29udmVyc2lvbl0KLSAgICAgKiBieSAlW2ZsYWdzXVt3aWR0aF1bLnByZWNpc2lvbl1JNjRbY29udmVyc2lvbl0gKi8KLSAgICB3aGlsZSgqZm9ybWF0KQotICAgIHsKLSAgICAgICAgbmJDaGFyID0gc3RyY3NwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgIiUiKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgY2hhcmFjdGVycyBiZWZvcmUgdGhlICUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqZm9ybWF0KSBicmVhazsKLSAgICAgICAgKnBUZW1wKysgPSAqZm9ybWF0Kys7ICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSAlIGNoYXJhY3RlciAqLwotICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopZmxhZ0NoYXIpOwotICAgICAgICBpZihuYkNoYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG5iQ2hhcik7ICAgICAgLyogY29weSB0aGUgZmxhZyBjaGFyYWN0ZXJzICovCi0gICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqZm9ybWF0KSBicmVhazsKLSAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKXdpZHRoT3JQcmVjaXNpb25DaGFyKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIHdpZHRoIGNoYXJhY3RlcnMgKi8KLSAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKLSAgICAgICAgICAgIHBUZW1wICAgKz1uYkNoYXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoISpmb3JtYXQpIGJyZWFrOwotICAgICAgICBpZigqZm9ybWF0PT0nLicpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwVGVtcCsrID0gKmZvcm1hdCsrOyAgICAgICAgICAgICAgLyogY29weSB0aGUgZG90IGNoYXJhY3RlciAqLwotICAgICAgICAgICAgaWYoIWZvcm1hdCkgYnJlYWs7Ci0gICAgICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopd2lkdGhPclByZWNpc2lvbkNoYXIpOwotICAgICAgICAgICAgaWYobmJDaGFyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG5iQ2hhcik7ICAgICAgLyogY29weSB0aGUgd2lkdGggY2hhcmFjdGVycyAqLwotICAgICAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKLSAgICAgICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIWZvcm1hdCkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoc3RybGVuKChjb25zdCBjaGFyICopZm9ybWF0KT49MikKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilmb3JtYXQsICJsbCIsIDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOyAvKiAlbCAqLwotICAgICAgICAgICAgICAgIGZvcm1hdCArPTI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJsbCIgcHJlZml4ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopZm9ybWF0LCAidG0iLCAyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFRlbXArKyA9ICdsJzsgLyogJWwgKi8KLSAgICAgICAgICAgICAgICBmb3JtYXQgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGFuIHRoZSAidG0iIHByZWZpeCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKWZvcm1hdCwgImFhIiwgMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7Ci0gICAgICAgICAgICAgICAgZm9ybWF0ICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgImFhIiBwcmVmaXggKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopb3RoZXJQcmVmaXhDaGFyKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIG90aGVyIFByZWZpeCAqLwotICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOwotICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7Ci0gICAgICAgIG5iQ2hhciA9IHN0cnNwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgKGNvbnN0IGNoYXIgKiljb252ZXJzaW9uQ2hhcik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsKLSAgICAgICAgICAgIGZvcm1hdCArPSBuYkNoYXI7Ci0gICAgICAgICAgICBwVGVtcCAgICs9IG5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogWmVybyB0ZXJtaW5hdGUgdGhlIGZvcm1hdCBzdHJpbmcuICovCi0gICAgKCpwVGVtcCkgPSAnXDAnOwotCi0gICAgZXJyID0gdnNucHJpbnRmKChjaGFyICopcFN0ck91dCwgKHNpemVfdClzdHJPdXRNYXhMZW4gKyAxLCAoY29uc3QgY2hhciAqKW5ld0Zvcm1hdCwgbWFya2VyKTsKLSAgICB2YV9lbmQobWFya2VyKTsKLSAgICBmcmVlKG5ld0Zvcm1hdCk7Ci0gICAgaWYgKChlcnI8MCkgfHwgKChNNE9TQV9VSW50MzIpZXJyPnN0ck91dE1heExlbikpCi0gICAgewotICAgICAgICBwU3RyT3V0W3N0ck91dE1heExlbl0gPSAnXDAnOwotICAgICAgICByZXR1cm4gTTRFUlJfQ0hSX1NUUl9PVkVSRkxPVzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DbG9jay5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2xvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTgxN2IyMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9DbG9jay5jCi0gKiBAYnJpZWYgICAgICAgIENsb2NrIHJlbGF0ZWQgZnVuY3Rpb25zCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGNsb2NrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0Nsb2NrLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYW4gYWJzb2x1dGUgdGltZSB0byBhbiB1bmtub3duIHJlZmVyZW5jZSB3aXRoCi0gKiAgICAgICAgICAgICBhIGhpZ2ggcHJlY2lzaW9uLgotICogQG5vdGUgICAgICAgSXQgbWVhbnMgaXQgY2FuIG9ubHkgYmUgdXNlZCB0byBnZXQgYSByZWxhdGl2ZSB0aW1lIGJ5IGNvbXB1dGluZwotICogICAgICAgICAgICAgZGlmZmVyZW5jZXMgYmV0d2VlbiB0byB0aW1lcy4KLSAqICAgICAgICAgICAgIEl0IGlzIHRvIHRoZSBjYWxsZXIgdG8gYWxsb2NhdGUgdGltZS4gVGltZSBpcyBleHByZXNzZWQgaW4KLSAqICAgICAgICAgICAgIHRpbWVzY2FsZSB1bml0LgotICogICAgICAgICAgICAgTTRPU0FfUk9MTE9WRVJfQ0xPQ0sgaW4gTTRPU0FfVHlwZXMuaCBtdXN0IGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgcm9sbG92ZXIKLSAqICAgICAgICAgICAgIG9mZnNldCBvZiB0aGlzIGZ1bmN0aW9uLgotICogQHBhcmFtICAgICAgdGltZTogKElOL09VVCkgdGltZQotICogQHBhcmFtICAgICAgdGltZXNjYWxlOiAoSU4pIFRoZSB0aW1lc2NhbGUgKHRpbWUgdW5pdCBwZXIgc2Vjb25kKQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNFdBUl9USU1FU0NBTEVfVE9PX0JJRzogdGhlIHByZWNpc2lvbiBvZiB0aGUgc3lzdGVtIGNsb2NrIGlzCi0gKiAgICAgICAgICAgICBub3QKLSAqICAgICAgICAgICAgIGNvbXBsaWFudCB3aXRoIHRoZSBpbnB1dCB0aW1lc2NhbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2xvY2tHZXRUaW1lKE00T1NBX1RpbWUqIHBUaW1lLCBNNE9TQV9VSW50MzIgdGltZXNjYWxlKQotewotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKLSAgICBNNE9TQV9VSW50MzIgdTMyX3RpbWUgPSAwOwotICAgIE00T1NBX1VJbnQzMiB1MzJfdGltZV9oaTsKLSAgICBNNE9TQV9VSW50MzIgdTMyX3RpbWVfbG87Ci0gICAgTTRPU0FfVUludDMyIHUzMl90aW1lX2xoOwotICAgIE00T1NBX1VJbnQzMiBmYWN0b3I7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfY2xvY2tHZXRUaW1lXHRcdE00T1NBX1RpbWUqIDB4JXhcdE00T1NBX1VJbnQzMiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lLCB0aW1lc2NhbGUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFRpbWUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2xvY2tHZXRUaW1lOiBwVGltZSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gdGltZXNjYWxlLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2xvY2tHZXRUaW1lOiB0aW1lc2NhbGUgaXMgMCIpOwotCi0gICAgZmFjdG9yID0gMTAwMDAwMCAvIHRpbWVzY2FsZTsKLQotICAgIGlmKGdldHRpbWVvZmRheSgmdHYsICZ0eikgPT0gMCkKLSAgICB7Ci0gICAgICAgIHUzMl90aW1lX2xvID0gKHR2LnR2X3NlYyAmIDB4RkZGRikgKiB0aW1lc2NhbGU7Ci0gICAgICAgIHUzMl90aW1lX2hpID0gKCgodHYudHZfc2VjID4+IDE2KSAmIDB4RkZGRikgKiB0aW1lc2NhbGUpICsgKCh1MzJfdGltZV9sbyA+PiAxNikgJiAweEZGRkYpOwotICAgICAgICB1MzJfdGltZV9sbyAmPSAweEZGRkY7Ci0gICAgICAgIHUzMl90aW1lX2xvICs9IHR2LnR2X3VzZWMgLyBmYWN0b3I7Ci0gICAgICAgIHUzMl90aW1lX2hpICs9ICgodTMyX3RpbWVfbG8gPj4gMTYpICYgMHhGRkZGKTsKLSAgICAgICAgdTMyX3RpbWVfbG8gJj0gMHhGRkZGOwotICAgICAgICB1MzJfdGltZSA9ICgodTMyX3RpbWVfaGkgJiAweDdGRkYpIDw8IDE2KSB8IHUzMl90aW1lX2xvOwotICAgIH0KLQotICAgIC8qIE00T1NBX1RpbWUgaXMgc2lnbmVkLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBtYXggdmFsdWUqLwotICAgIGlmICh1MzJfdGltZSA+IE00T1NBX0lOVDMyX01BWCkKLSAgICB7Ci0gICAgICAgIHUzMl90aW1lID0gdTMyX3RpbWUgLSBNNE9TQV9JTlQzMl9NQVg7Ci0gICAgfQotCi0gICAgKnBUaW1lID0gKE00T1NBX1RpbWUpdTMyX3RpbWU7Ci0KLSAgICBpZiggdGltZXNjYWxlID4gMTAwMDAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX1RJTUVTQ0FMRV9UT09fQklHOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUNvbW1vbi5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUNvbW1vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTJkYjVkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDb21tb24uYworKysgL2Rldi9udWxsCkBAIC0xLDY2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlQ29tbW9uLmMKLSAqIEBicmllZiAgICAgICAgRmlsZSBjb21tb24gZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHVzZWQgYnkgYm90aCB0aGUgZmlsZSB3cml0ZXIKLSAqICAgICAgICAgICAgICAgYW5kIGZpbGUgcmVhZGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBVU0VfU1RBR0VGUklHSFRfQ09ERUNTCi0jZXJyb3IgIlVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgaXMgbm90IGRlZmluZWQiCi0jZW5kaWYgLypVU0VfU1RBR0VGUklHSFRfQ09ERUNTKi8KLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYgLypVVEZfQ09OVkVSU0lPTiovCi0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIHByb3ZpZGVkIFVSTCBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KLSAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VyZWQsIHRoZSBjb250ZXh0IGlzIHNldCB0byBOVUxMLgotICogQHBhcmFtICAgICAgY29yZV9pZDogKElOKSBDb3JlIElEIG9mIHRoZSBjYWxsZXIgKE00T1NBX0ZJTEVfUkVBREVSIG9yIE00T1NBX0ZJTEVfV1JJVEVSKQotICogQHBhcmFtICAgICAgY29udGV4dDogKE9VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgdXJsOiAoSU4pIFVSTCBvZiB0aGUgaW5wdXQgZmlsZQotICogQHBhcmFtICAgICAgZmlsZU1vZGVBY2Nlc3M6IChJTikgRmlsZSBtb2RlIGFjY2VzcwotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICBmaWxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX05PVF9GT1VORDogdGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0xPQ0tFRDogdGhlIGZpbGUgaXMgbG9ja2VkIGJ5IGFuIG90aGVyCi0gKiAgICAgICAgICAgICBhcHBsaWNhdGlvbi9wcm9jZXNzCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzogdGhlIGZpbGUgbW9kZSBhY2Nlc3MgaXMgbm90IGNvcnJlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbk9wZW4oTTRPU0FfVUludDE2IGNvcmVfaWQsIE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHBVcmwsIE00T1NBX0ZpbGVNb2RlQWNjZXNzIGZpbGVNb2RlQWNjZXNzKQotewotCi0gICAgTTRPU0FfSW50MzIgaSAgICAgICAgICAgID0gMDsKLSAgICBNNE9TQV9JbnQzMiBpTW9kZSAgICAgICAgPSAwOwotICAgIE00T1NBX0ludDMyIGlTaXplICAgICAgICA9IDA7Ci0gICAgTTRPU0FfSW50MzIgaVNhdmVQb3MgICAgPSAwOwotCi0gICAgTTRPU0FfQ2hhciAgbW9kZVs0XSAgICAgICAgICAgID0gIiI7Ci0gICAgTTRPU0FfQ2hhciogcFJlYWRTdHJpbmcgICAgICAgID0gKE00T1NBX0NoYXIqKSJyIjsKLSAgICBNNE9TQV9DaGFyKiBwV3JpdGVTdHJpbmcgICAgPSAoTTRPU0FfQ2hhciopInciOwotICAgIE00T1NBX0NoYXIqIHBBcHBlbmRTdHJpbmcgICAgPSAoTTRPU0FfQ2hhciopImEiOwotICAgIE00T1NBX0NoYXIqIHBCaW5hcnlTdHJpbmcgICAgPSAoTTRPU0FfQ2hhciopImIiOwotICAgIE00T1NBX0NoYXIqIHBQbHVzU3RyaW5nICAgICAgICA9IChNNE9TQV9DaGFyKikiKyI7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEZJTEUqIHBGaWxlSGFuZGxlciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQgKnBGaWxlQ29udGV4dCAgICA9IE00T1NBX05VTEw7Ci0KLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi0gICAgLypGQjogdG8gdGVzdCB0aGUgVVRGMTYtPlVURjggY29udmVyc2lvbiBpbnRvIFZpZGVvIEFydGlzdCovCi0gICAgLypDb252ZXJ0IHRoZSBVUkwgZnJvbSBVVEYxNiB0byBVVEY4Ki8KLSAgICBNNE9TQV9Wb2lkKiB0ZW1wQ29udmVyc2lvbkJ1ZjsKLSAgICBNNE9TQV9VSW50MzIgdGVtcENvbnZlcnNpb25TaXplID0gMTAwMDsKLQotICAgIHRlbXBDb252ZXJzaW9uQnVmID0gKE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh0ZW1wQ29udmVyc2lvblNpemUgKzEsIDAsICJjb252ZXJzaW9uIGJ1ZiIpOwotICAgIGlmKHRlbXBDb252ZXJzaW9uQnVmID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3Igd2hlbiBhbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgTTRPU0FfVG9VVEY4X09TQUwocFVybCwgdGVtcENvbnZlcnNpb25CdWYsICZ0ZW1wQ29udmVyc2lvblNpemUpOwotICAgICgoTTRPU0FfQ2hhciopdGVtcENvbnZlcnNpb25CdWYpW3RlbXBDb252ZXJzaW9uU2l6ZSBdID0gJ1wwJzsKLQotICAgIHByaW50ZigiZmlsZSBvcGVuICVzXG4iLCB0ZW1wQ29udmVyc2lvbkJ1Zik7Ci0jZW5kaWYgLypVVEYgQ09OVkVSU0lPTiovCi0KLSAgICBNNE9TQV9UUkFDRTNfNCgiTTRPU0FfZmlsZUNvbW1vbk9wZW5cdFx0TTRPU0FfVUludDE2ICVkXHRNNE9TQV9Db250ZXh0KiAweCV4XHQiCi0gICAgICAgICJNNE9TQV9DaGFyKiAlc1x0ZmlsZU1vZGVBY2Nlc3MgJWQiLCBjb3JlX2lkLCBwQ29udGV4dCwgcFVybCwgZmlsZU1vZGVBY2Nlc3MpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsICAgIE00RVJSX1BBUkFNRVRFUiwgICAgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFVybCwgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgICAgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBwVXJsICBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gZmlsZU1vZGVBY2Nlc3MsICAgIE00RVJSX1BBUkFNRVRFUiwgICAgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBmaWxlTW9kZUFjY2VzcyBpcyAwIik7Ci0KLSAgICAvKiBSZWFkIG1vZGUgbm90IHNldCBmb3IgdGhlIHJlYWRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgIShmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlUmVhZCIpOwotCi0gICAgLyogUmVhZCBtb2RlIG5vdCBzZXQgZm9yIHRoZSByZWFkZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmICEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZVJlYWQiKTsKLQotICAgIC8qIE00T1NBZmlsZVJlYWRPcGVuIGNhbm5vdCBiZSB1c2VkIHdpdGggV3JpdGUgZmlsZSBtb2RlIGFjY2VzcyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlV3JpdGUiKTsKLQotICAgIC8qIEFwcGVuZCBhbmQgQ3JlYXRlIGZsYWdzIGNhbm5vdCBiZSB1c2VkIHdpdGggUmVhZCAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZUFwcGVuZCIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9GSUxFX1JFQURFUiA9PSBjb3JlX2lkKSAmJiAoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUNyZWF0ZSksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlQ3JlYXRlIik7Ci0KLSAgICAvKiBXcml0ZSBtb2RlIG5vdCBzZXQgZm9yIHRoZSB3cml0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfV1JJVEVSID09IGNvcmVfaWQpICYmICEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSwKLSAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVXcml0ZSIpOwotCi0gICAgLyogQ3JlYXRlIGZsYWcgbmVjZXNzYXJ5IGZvciBvcGVuaW5nIGZpbGUgKi8KLSAgICBpZiAoKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSAmJgotICAgICAgICAoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSYmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpKQotICAgIHsKLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFdyaXRlU3RyaW5nLCAoc2l6ZV90KTEpOwotICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwgKGNvbnN0IGNoYXIgKilwUGx1c1N0cmluZywgKHNpemVfdCkxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUFwcGVuZCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcEFwcGVuZFN0cmluZywgKHNpemVfdCkxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwgKGNvbnN0IGNoYXIgKilwUmVhZFN0cmluZywgKHNpemVfdCkxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFdyaXRlU3RyaW5nLCAoc2l6ZV90KTEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSYmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLChjb25zdCBjaGFyICopcFBsdXNTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZighKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVJc1RleHRNb2RlKSkKLSAgICB7Ci0gICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBCaW5hcnlTdHJpbmcsKHNpemVfdCkxKTsKLSAgICB9Ci0KLSAgICAvKk9wZW4gdGhlIGZpbGUqLwotCi0jaWZkZWYgVVRGX0NPTlZFUlNJT04KLSAgICAvKk9wZW4gdGhlIGNvbnZlcnRlZCBwYXRoKi8KLSAgICBwRmlsZUhhbmRsZXIgPSBmb3BlbigoY29uc3QgY2hhciAqKXRlbXBDb252ZXJzaW9uQnVmLCAoY29uc3QgY2hhciAqKW1vZGUpOwotICAgIC8qRnJlZSB0aGUgdGVtcG9yYXJ5IGRlY29kZWQgYnVmZmVyKi8KLSAgICBmcmVlKHRlbXBDb252ZXJzaW9uQnVmKTsKLSNlbHNlIC8qIFVURl9DT05WRVJTSU9OICovCi0gICAgcEZpbGVIYW5kbGVyID0gZm9wZW4oKGNvbnN0IGNoYXIgKilwVXJsLCAoY29uc3QgY2hhciAqKW1vZGUpOwotI2VuZGlmIC8qIFVURl9DT05WRVJTSU9OICovCi0KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRmlsZUhhbmRsZXIpCi0gICAgewotICAgICAgICBzd2l0Y2goZXJybm8pCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBFTk9FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfRklMRV9OT1RfRk9VTkQsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJGaWxlIG5vdCBmb3VuZDogJXMiLCBwVXJsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9OT1RfRk9VTkQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRUFDQ0VTOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0ZJTEVfTE9DS0VELCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IFBlcm1pc3Npb24gZGVuaWVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0ZJTEVfTE9DS0VEOwotICAgICAgICAgICAgfQotICAgICAgICAgY2FzZSBFSU5WQUw6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBJbnZhbGlkIEFyZ3VtZW50Iik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7Ci0gICAgICAgICB9Ci0gICAgICAgIGNhc2UgRU1GSUxFOgotICAgICAgICAgY2FzZSBFTk9TUEM6Ci0gICAgICAgIGNhc2UgRU5PTUVNOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IFRvbyBtYW55IG9wZW4gZmlsZXMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgdGhlIGZpbGUgY29udGV4dCAqLwotICAgIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfRmlsZUNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBjb3JlX2lkLCAoTTRPU0FfQ2hhciopIk00T1NBX2ZpbGVDb21tb25PcGVuOiBmaWxlIGNvbnRleHQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQpCi0gICAgewotICAgICAgICBmY2xvc2UocEZpbGVIYW5kbGVyKTsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uT3BlbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MgICAgICAgID0gcEZpbGVIYW5kbGVyOwotICAgIHBGaWxlQ29udGV4dC0+YWNjZXNzX21vZGUgICAgPSBmaWxlTW9kZUFjY2VzczsKLSAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAgICA9IFNlZWtOb25lOwotICAgIHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZSAgICA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgICogTm90ZTogTmV2ZXIgdXNlIHRoaXMgZXhwcmVzc2lvbiAiaSA9ICh2YWx1ZTEgPT0gdmFsdWUyKSA/IHg6IHk7IgotICAgICAqIGJlY2F1c2UgdGhhdCBkb2Vucyd0IGNvbXBpbGUgb24gb3RoZXIgcGxhdGZvcm1zIChBRFMgZm9yIGV4YW1wbGUpCi0gICAgICogVXNlOiBpZih2YWx1ZTEgPT0gdmFsdWUyKQotICAgICAqICAgICAgICB7IGk9IHg7IC4uZXRjCi0gICAgICovCi0gICAgcEZpbGVDb250ZXh0LT5jb3JlSURfd3JpdGUgPSAwOwotICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3JlYWQgPSAwOwotICAgIHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MgPSBNNE9TQV9rRGVzY05vbmVBY2Nlc3M7Ci0KLSAgICBpZiAoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkKLSAgICB7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3JlYWQgPSBjb3JlX2lkOwotICAgICAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gTTRPU0Ffa0Rlc2NSZWFkQWNjZXNzOwotICAgIH0KLSAgICBlbHNlIGlmIChNNE9TQV9GSUxFX1dSSVRFUiA9PSBjb3JlX2lkKQotICAgIHsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5jb3JlSURfd3JpdGUgPSBjb3JlX2lkOwotICAgICAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gTTRPU0Ffa0Rlc2NXcml0ZUFjY2VzczsKLSAgICB9Ci0KLSAgICBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gPSAwOwotICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSAwOwotCi0gICAgLyogQWxsb2NhdGUgdGhlIG1lbW9yeSB0byBzdG9yZSB0aGUgVVJMIHN0cmluZyAqLwotICAgIHBGaWxlQ29udGV4dC0+dXJsX25hbWUgPSAoTTRPU0FfQ2hhciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKSsxLAotICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9pZCwgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uT3BlbjogVVJMIG5hbWUiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnVybF9uYW1lKQotICAgIHsKLSAgICAgICAgZmNsb3NlKHBGaWxlSGFuZGxlcik7Ci0gICAgICAgIGZyZWUocEZpbGVDb250ZXh0KTsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uT3BlbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIE00T1NBX2Nock5Db3B5KHBGaWxlQ29udGV4dC0+dXJsX25hbWUsIHBVcmwsIHN0cmxlbigoY29uc3QgY2hhciAqKXBVcmwpKzEpOwotCi0gICAgLyogR2V0IHRoZSBmaWxlIG5hbWUgKi8KLSAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUocFVybCwgJnBGaWxlQ29udGV4dC0+ZmlsZV9uYW1lKTsKLSAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIGZjbG9zZShwRmlsZUhhbmRsZXIpOwotICAgICAgICBmcmVlKHBGaWxlQ29udGV4dC0+dXJsX25hbWUpOwotICAgICAgICBmcmVlKHBGaWxlQ29udGV4dCk7Ci0gICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVDb21tb25PcGVuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZU9wZW4oJihwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KSwgMSk7IC8qIEFsbG9jYXRlIHRoZSBzZW1hcGhvcmUgKi8KLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLQotCi0jaWZkZWYgVVNFX1NUQUdFRlJJR0hUX0NPREVDUwotICAgIC8vIFdvcmthcm91bmQgZm9yIGZpbGUgc3lzdGVtIGJ1ZyBvbiBTdGluZ3JheS9Ib25leWNvbWIgd2hlcmUgYSBmaWxlIHJlLWNyZWF0ZWQgd2lsbCBrZWVwCi0gICAgLy8gdGhlIG9yaWdpbmFsIGZpbGUncyBzaXplIGZpbGxlZCB3aXRoIDBzLiBEbyBub3Qgc2VlayB0byB0aGUgZW5kIHRvIGF2b2lkIGlsbCBlZmZlY3RzCi0gICAgaWYoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUFwcGVuZCkgewotICAgICAgICAvKiBHZXQgdGhlIGZpbGUgc2l6ZSAqLwotICAgICAgICBpU2F2ZVBvcyA9IGZ0ZWxsKHBGaWxlSGFuZGxlcik7ICAgICAgICAgICAgLyogICAgMS0gQ2hlY2sgdGhlIGZpcnN0IHBvc2l0aW9uICovCi0gICAgICAgIGZzZWVrKHBGaWxlSGFuZGxlciwgMCwgU0VFS19FTkQpOyAgICAgICAgLyogICAgMi0gR28gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSovCi0gICAgICAgIGlTaXplID0gZnRlbGwocEZpbGVIYW5kbGVyKTsgICAgICAgICAgICAvKiAgICAzLSBDaGVjayB0aGUgZmlsZSBzaXplICAgICAgICAqLwotICAgICAgICBmc2VlayhwRmlsZUhhbmRsZXIsIGlTYXZlUG9zLCBTRUVLX1NFVCk7LyogICAgNC0gZ28gdG8gdGhlIGZpcnN0IHBvc2l0aW9uICovCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaVNpemUgPSAwOwotICAgIH0KLSNlbHNlIC8qIFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgKi8KLSAgICAvKiBHZXQgdGhlIGZpbGUgc2l6ZSAqLwotICAgIGlTYXZlUG9zID0gZnRlbGwocEZpbGVIYW5kbGVyKTsgICAgICAgICAgICAvKiAgICAxLSBDaGVjayB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSAgICBmc2VlayhwRmlsZUhhbmRsZXIsIDAsIFNFRUtfRU5EKTsgICAgICAgIC8qICAgIDItIEdvIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUqLwotICAgIGlTaXplID0gZnRlbGwocEZpbGVIYW5kbGVyKTsgICAgICAgICAgICAvKiAgICAzLSBDaGVjayB0aGUgZmlsZSBzaXplICAgICAgICAqLwotICAgIGZzZWVrKHBGaWxlSGFuZGxlciwgaVNhdmVQb3MsIFNFRUtfU0VUKTsvKiAgICA0LSBnbyB0byB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSNlbmRpZiAvKiBVU0VfU1RBR0VGUklHSFRfQ09ERUNTICovCi0KLQotCi0gICAgLyogV2FybmluZyBwb3NzaWJsZSBvdmVyZmxvdyBpZiB0aGUgZmlsZSBpcyBoaWdoZXIgdGhhbiAyR0J5dGVzICovCi0gICAgcEZpbGVDb250ZXh0LT5maWxlX3NpemUgPSBpU2l6ZTsKLQotICAgICpwQ29udGV4dCA9IHBGaWxlQ29udGV4dDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0IGZyb20gVVRGMTYgdG8gVVRGOAotICogQHBhcmFtICAgICAgcEJ1ZmZlckluOiAoSU4pIFVURjE2IGlucHV0IHBhdGgKLSAqIEBwYXJhbSAgICAgIHBCdWZmZXJPdXQ6IChPVVQpIFVURjggb3V0cHV0IHBhdGgKLSAqIEBwYXJhbSAgICAgIGJ1ZmZlck91dFNpemU6IChJTi9PVVQpIHNpemUgb2YgdGhlIG91dHB1dCBwYXRoCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiB0aGUgb3V0cHV0IHBhdGggc2l6ZSBpcyBub3QgZW5vdWdoIHRvIGNvbnRhaW4KLSAqICAgICAgICAgICAgICAgdGhlIGRlY29kZWQgcGF0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZmRlZiBVVEZfQ09OVkVSU0lPTgotTTRPU0FfRVJSIE00T1NBX1RvVVRGOF9PU0FMIChNNE9TQV9Wb2lkICAgKnBCdWZmZXJJbiwgTTRPU0FfVUludDggICpwQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqYnVmZmVyT3V0U2l6ZSkKLXsKLSAgICBNNE9TQV9VSW50MTYgaTsKLSAgICB3Y2hhcl90ICAgICAgKndfc3RyID0gKHdjaGFyX3QgKikgcEJ1ZmZlckluOwotICAgIE00T1NBX1VJbnQzMiBsZW4sIHNpemVfbmVlZGVkLCBzaXplX2dpdmVuOwotICAgIGlmIChwQnVmZmVySW4gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgICpwQnVmZmVyT3V0PU5VTEw7Ci0gICAgICAgICpidWZmZXJPdXRTaXplPTE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGxlbiAgICAgICAgID0gd2NzbGVuKHdfc3RyKTsKLSAgICAgICAgc2l6ZV9uZWVkZWQgPSBsZW4rMTsKLSAgICAgICAgc2l6ZV9naXZlbiAgPSAqYnVmZmVyT3V0U2l6ZTsKLQotICAgICAgICpidWZmZXJPdXRTaXplPXNpemVfbmVlZGVkOwotICAgICAgICBpZiAoc2l6ZV9naXZlbiA8IHNpemVfbmVlZGVkICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCdWZmZXJPdXRbaV09KE00T1NBX1VJbnQ4KXdfc3RyW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEJ1ZmZlck91dFtsZW5dPTA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0jZW5kaWYgLypVVEYgQ09OVkVSU0lPTiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBzZWVrcyBhdCB0aGUgcHJvdmlkZWQgcG9zaXRpb24uCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBzZWVrTW9kZTogKElOKSBTZWVrIGFjY2VzcyBtb2RlCi0gKiBAcGFyYW0gICAgICBwb3NpdGlvbjogKElOL09VVCkgUG9zaXRpb24gaW4gdGhlIGZpbGUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT046IHRoZSBwb3NpdGlvbiBjYW5ub3QgYmUgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uU2VlayhNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBGaWxlUG9zKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19jdXJyZW50OwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX3NlZWs7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfbnVsbCA9IDA7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfbmVnX3VuID0gLTE7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfZmlsZV9zaXplOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX3NlZWtfZnJvbV9iZWdpbm5pbmc7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygiTTRPU0FfZmlsZUNvbW1vblNlZWtcdFx0TTRPU0FfQ29udGV4dCAweCV4XHQgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlICVkXHRNNE9TQV9GaWxlUG9zaXRpb24qIDB4JXgiLAotICAgICAgICBwQ29udGV4dCwgc2Vla01vZGUsIHBGaWxlUG9zKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IHNlZWtNb2RlLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlUG9zLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotCi0gICAgZnBvc19maWxlX3NpemUgPSBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZTsKLQotICAgIGlmKFNlZWtSZWFkID09IHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrKQotICAgIHsKLSAgICAgICAgZnBvc19jdXJyZW50ID0gcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uOwotICAgIH0KLSAgICBlbHNlIGlmKFNlZWtXcml0ZSA9PSBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlaykKLSAgICB7Ci0gICAgICAgIGZwb3NfY3VycmVudCA9IHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb247Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZwb3NfY3VycmVudCA9IDA7Ci0gICAgfQotCi0gICAgc3dpdGNoKHNlZWtNb2RlKQotICAgIHsKLSAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZwb3Nfc2VlayA9ICpwRmlsZVBvczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZwb3Nfc2VlayA9ICpwRmlsZVBvcyAtIGZwb3NfY3VycmVudDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtFbmQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZwb3Nfc2VlayA9ICpwRmlsZVBvcyArIGZwb3NfZmlsZV9zaXplIC0gZnBvc19jdXJyZW50OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZnBvc19zZWVrX2Zyb21fYmVnaW5uaW5nID0gZnBvc19jdXJyZW50ICsgZnBvc19zZWVrOwotCi0gICAgaWYoZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIGZwb3Nfc2VlaywgU0VFS19DVVIpICE9IDApCi0gICAgewotICAgICAgICBzd2l0Y2goZXJybm8pCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBFSU5WQUw6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBtZWFuaW5nIHRoZSB2YWx1ZSBmb3Igb3JpZ2luIGlzIGludmFsaWQgb3IgdGhlIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IG9mZnNldCBpcyBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSAqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT047Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBFQkFERjoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7LyogZmlsZSBoYW5kbGUgaXMgaW52YWxpZCAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSByZXR1cm5lZCBwb3NpdGlvbiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKi8KLSAgICAqcEZpbGVQb3MgPSBmcG9zX3NlZWtfZnJvbV9iZWdpbm5pbmc7Ci0KLSAgICAvKiBTRUVLIGRvbmUsIHJlc2V0IGVuZCBvZiBmaWxlIHZhbHVlICovCi0gICAgcEZpbGVDb250ZXh0LT5iX2lzX2VuZF9vZl9maWxlID0gTTRPU0FfRkFMU0U7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0byBjbG9zZSB0aGUgZmlsZSAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkKLSAqIEBub3RlICAgICAgIFRoZSBjb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyL3dyaXRlciBpcyBmcmVlZC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkNsb3NlKE00T1NBX1VJbnQxNiBjb3JlX2lkLCBNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiBpMzJfZXJyX2NvZGU9MDsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNNE9TQV9maWxlQ29tbW9uQ2xvc2VcdE00T1NBX1VJbnQxNiAlZFx0TTRPU0FfQ29udGV4dCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2lkLCBwQ29udGV4dCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsCi0gICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25DbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlQ29tbW9uQ2xvc2U6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBmcmVlKHBGaWxlQ29udGV4dC0+dXJsX25hbWUpOwotICAgIHBGaWxlQ29udGV4dC0+dXJsX25hbWUgPSBNNE9TQV9OVUxMOwotCi0gICAgZnJlZShwRmlsZUNvbnRleHQtPmZpbGVfbmFtZSk7Ci0gICAgcEZpbGVDb250ZXh0LT5maWxlX25hbWUgPSBNNE9TQV9OVUxMOwotCi0gICAgaTMyX2Vycl9jb2RlID0gZmNsb3NlKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLQotICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjID0gTTRPU0FfTlVMTDsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVDbG9zZShwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsvKiBmcmVlIHRoZSBzZW1hcGhvcmUgKi8KLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBmcmVlKHBGaWxlQ29udGV4dCk7Ci0KLSAgICBpZiAoaTMyX2Vycl9jb2RlICE9IDApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVDb21tb25DbG9zZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGZpbGUgYXR0cmlidXRlcyAoYXNzb2NpYXRlZCB0byB0aGUKLSAqICAgICAgICAgICAgIGNvbnRleHQpCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4pIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIGF0dHJpYnV0ZTogKE9VVCkgVGhlIGZpbGUgYXR0cmlidXRlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZUF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkKLXsKLQotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBmaWxlQ29udGV4dCA9IHBDb250ZXh0OwotCi0gICAgc3RydWN0IHN0YXQgVGhlU3RhdDsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlXHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgIk00T1NBX0ZpbGVBdHRyaWJ1dGUqIDB4JXgiLCBwQ29udGV4dCwgcEF0dHJpYnV0ZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQXR0cmlidXRlLCAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlIik7Ci0KLSAgICBpZihzdGF0KChjaGFyKilmaWxlQ29udGV4dC0+dXJsX25hbWUsICZUaGVTdGF0KSAhPSAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSAgICBwQXR0cmlidXRlLT5jcmVhdGlvbkRhdGUudGltZSA9IChNNE9TQV9UaW1lKVRoZVN0YXQuc3RfY3RpbWU7Ci0gICAgcEF0dHJpYnV0ZS0+bGFzdEFjY2Vzc0RhdGUudGltZSA9IChNNE9TQV9UaW1lKVRoZVN0YXQuc3RfYXRpbWU7Ci0gICAgcEF0dHJpYnV0ZS0+bW9kaWZpZWREYXRlLnRpbWUgPSAoTTRPU0FfVGltZSlUaGVTdGF0LnN0X210aW1lOwotCi0gICAgcEF0dHJpYnV0ZS0+Y3JlYXRpb25EYXRlLnRpbWVTY2FsZSA9IDE7Ci0gICAgcEF0dHJpYnV0ZS0+bGFzdEFjY2Vzc0RhdGUudGltZVNjYWxlID0gMTsKLSAgICBwQXR0cmlidXRlLT5tb2RpZmllZERhdGUudGltZVNjYWxlID0gMTsKLQotICAgIHBBdHRyaWJ1dGUtPmNyZWF0aW9uRGF0ZS5yZWZlcmVuY2VZZWFyID0gMTk3MDsKLSAgICBwQXR0cmlidXRlLT5sYXN0QWNjZXNzRGF0ZS5yZWZlcmVuY2VZZWFyID0gMTk3MDsKLSAgICBwQXR0cmlidXRlLT5tb2RpZmllZERhdGUucmVmZXJlbmNlWWVhciA9IDE5NzA7Ci0KLSAgICBwQXR0cmlidXRlLT5tb2RlQWNjZXNzID0gZmlsZUNvbnRleHQtPmFjY2Vzc19tb2RlOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBmaWxlIFVSTCAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgY29udGV4dDogKElOKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICB1cmw6IChPVVQpIFRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgVVJMIChhbGxvY2F0ZWQgYnkKLSAqICAgICAgICAgICAgIE00T1NBX2ZpbGVDb21tb25HZXRVUkwpCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0VVJMKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NoYXIqKiBwVXJsKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50MzIgICAgdWlMZW5ndGg7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZUNvbW1vbkdldFVSTFx0TTRPU0FfQ29udGV4dCAweCV4XHRNNE9TQV9DaGFyKiogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwVXJsKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkdldFVSTDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBVcmwsICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkdldFVSTDogcFVybCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICB1aUxlbmd0aCA9IHN0cmxlbigoY29uc3QgY2hhciAqKXBGaWxlQ29udGV4dC0+dXJsX25hbWUpKzE7Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IHRvIHN0b3JlIHRoZSB1cmxfbmFtZSAqLwotICAgICpwVXJsID0gKE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh1aUxlbmd0aCwgTTRPU0FfRklMRV9DT01NT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIk00T1NBX2ZpbGVDb21tb25HZXRVUkw6IHVybCIpOwotICAgIGlmKE00T1NBX05VTEwgPT0gKnBVcmwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVDb21tb25HZXRVUkwiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIE00T1NBX2Nock5Db3B5KCpwVXJsLCBwRmlsZUNvbnRleHQtPnVybF9uYW1lLCB1aUxlbmd0aCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlIG5hbWUgYXNzb2NpYXRlZAotICogICAgICAgICAgICAgdG8gdGhlIGlucHV0IFVSTC4KLSAqIEBub3RlICAgICAgIFRoZSB1c2VyIHNob3VsZCBub3QgZm9yZ2V0IHRvIGRlbGV0ZSB0aGUgb3V0cHV0IHN0cmluZyB1c2luZwotICogICAgICAgICAgICAgTTRPU0Ffc3RyRGVzdHJveQotICogQHBhcmFtICAgICAgcFVybDogICAgICAgICAgICAoSU4pIFRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgVVJMCi0gKiBAcGFyYW0gICAgICBwRmlsZU5hbWU6ICAgIChPVVQpIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgVVJMLiBJdCBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGluc2lkZSB0aGlzIGZ1bmN0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgZmlsZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUoTTRPU0FfQ2hhciogcFVybCwgTTRPU0FfQ2hhcioqIHBGaWxlTmFtZSkKLXsKLSAgICBNNE9TQV9JbnQzMiBpICAgICAgICAgICAgPSAwOwotICAgIE00T1NBX0ludDMyIGlVcmxMZW4gICAgICAgID0gMDsKLSAgICBNNE9TQV9JbnQzMiBGaWxlTmFtZUxlbiA9IDA7Ci0KLSAgICBNNE9TQV9DaGFyKiBwdHJVcmwgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9DaGFyKiBwdHJGaWxlbmFtZSAgICA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZUNvbW1vbkdldFVSTFx0TTRPU0FfQ2hhciogJXNcdE00T1NBX0NoYXIqKiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVcmwsIHBGaWxlTmFtZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVXJsLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWU6IHBVcmwgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlTmFtZSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZTogcEZpbGVOYW1lIGlzIE00T1NBX05VTEwiKTsKLQotICAgICpwRmlsZU5hbWUgPSBNNE9TQV9OVUxMOwotCi0gICAgLypQYXJzZSBVUkwqLwotICAgIGlVcmxMZW4gPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKTsKLSAgICBmb3IoaT1pVXJsTGVuLTE7IGk+PTA7IGktLSkKLSAgICB7Ci0gICAgICAgIGlmIChwVXJsW2ldICE9ICdcXCcgJiYgcFVybFtpXSAhPSAnLycpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVOYW1lTGVuKys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsgLyogZmluZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIG5hbWUgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB0ckZpbGVuYW1lID0gKE00T1NBX0NoYXIqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoRmlsZU5hbWVMZW4rMSwgTTRPU0FfRklMRV9DT01NT04sCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lOiBGaWxlbmFtZSBzdHJpbmciKTsKLSAgICBpZiAocHRyRmlsZW5hbWUgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwdHJVcmwgPSBwVXJsICsgKGlVcmxMZW4gLSBGaWxlTmFtZUxlbik7Ci0gICAgTTRPU0FfY2hyTkNvcHkocHRyRmlsZW5hbWUsIHB0clVybCwgRmlsZU5hbWVMZW4rMSk7Ci0KLSAgICAqcEZpbGVOYW1lID0gcHRyRmlsZW5hbWU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlci5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MGE3MmY1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVSZWFkZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXIuYwotICogQGF1dGhvciAgICAgICBDZWRyaWMgTGVjb3V0cmUgKGNlZHJpYy5sZWNvdXRyZUBwaGlsaXBzLmNvbSkKLSAqICAgICAgICAgICAgICAgTGF1cmVudCBGYXkgKGxhdXJlbnQuZmF5QHBoaWxpcHMuY29tKQotICogQHBhciBPcmc6ICAgICBQaGlsaXBzIERpZ2l0YWwgU3lzdGVtcyBMYWJvcmF0b3JpZXMgLSBQYXJpcyAoUERTTC1QKQotICogQGJyaWVmICAgICAgICBGaWxlIHJlYWRlciBmb3IgQW5kcm9pZAotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gcmVhZCBhIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb25fcHJpdi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgcHJvdmlkZWQgVVJMIGFuZCByZXR1cm5zIGl0cyBjb250ZXh0LgotKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cmVkLCB0aGUgY29udGV4dCBpcyBzZXQgdG8gTlVMTC4KLSogQHBhcmFtICAgICAgY29udGV4dDogKE9VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotKiBAcGFyYW0gICAgICB1cmw6IChJTikgVVJMIG9mIHRoZSBpbnB1dCBmaWxlCi0qIEBwYXJhbSAgICAgIGZpbGVNb2RlQWNjZXNzOiAoSU4pIEZpbGUgbW9kZSBhY2Nlc3MKLSogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCi0qICAgICAgICAgICAgIGZpbGUKLSogQHJldHVybiAgICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0xPQ0tFRDogdGhlIGZpbGUgaXMgbG9ja2VkIGJ5IGFuIG90aGVyCi0qICAgICAgICAgICAgIGFwcGxpY2F0aW9uL3Byb2Nlc3MKLSogQHJldHVybiAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M6IHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2VzcykKLXsKLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfZmlsZVJlYWRPcGVuIDogcEMgPSAweCVwICBmZCA9IDB4JXAgIG1vZGUgPSAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwRmlsZURlc2NyaXB0b3IsIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uT3BlbihNNE9TQV9GSUxFX1JFQURFUiwgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlRGVzY3JpcHRvciwgZmlsZU1vZGVBY2Nlc3MpOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSAnc2l6ZScgYnl0ZXMgaW4gdGhlIGNvcmUgZmlsZSByZWFkZXIKLSogICAgICAgICAgICAgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpIGFuZCB3cml0ZXMgdGhlIGRhdGEgdG8gdGhlICdkYXRhJwotKiAgICAgICAgICAgICBwb2ludGVyLgotKiBAbm90ZSAgICAgICBJZiAnc2l6ZScgYnl0ZSBjYW5ub3QgYmUgcmVhZCBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciwgJ3NpemUnCi0qICAgICAgICAgICAgIHBhcmFtZXRlciBpcyB1cGRhdGVkIHRvIG1hdGNoIHRoZSBjb3JyZWN0Ci0qIEBub3RlICAgICAgIG51bWJlciBvZiByZWFkIGJ5dGVzLgotKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0qIEBwYXJhbSAgICAgIGJ1ZmZlcjogKE9VVCkgRGF0YSBwb2ludGVyIG9mIHRoZSByZWFkIGRhdGEKLSogQHBhcmFtICAgICAgc2l6ZTogKElOL09VVCkgU2l6ZSBvZiB0aGUgZGF0YSB0byByZWFkIChpbiBieXRlcykKLSogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSogQHJldHVybiAgICAgTTRXQVJfTk9fREFUQV9ZRVQ6IHRoZXJlIGlzIG5vIGVub3VnaCBkYXRhIHRvIGZpbGwgdGhlICdkYXRhJwotKiAgICAgICAgICAgICBidWZmZXIsIHNvIHRoZSBzaXplIHBhcmFtZXRlciBoYXMgYmVlbiB1cGRhdGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkRGF0YShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9NZW1BZGRyOCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwU2l6ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfSW50MzIgICAgdWlTaXplUmVhZDsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9maWxlUmVhZERhdGEgOiBkYXRhID0gMHglcCAgc2l6ZSA9ICVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAoTTRPU0FfTlVMTCAhPSBwU2l6ZSkgPyAoKnBTaXplKSA6IDApOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWREYXRhOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gZGF0YSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWREYXRhOiBkYXRhIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU2l6ZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZERhdGE6IHBTaXplIGlzIE00T1NBX05VTEwiKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwKLSAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZVJlYWREYXRhOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKSAvKiByZWFkIHdyaXRlICovCi0gICAgewotICAgICAgICB1aVNpemVSZWFkID0gZnJlYWQoZGF0YSwgc2l6ZW9mKE00T1NBX0NoYXIpLCAqcFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOwotICAgICAgICBpZigtMSA9PSB1aVNpemVSZWFkKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBoYW5kbGUgaXMgaW52YWxpZCwgb3IgdGhlIGZpbGUgaXMgbm90IG9wZW4gZm9yIHJlYWRpbmcsIG9yIHRoZSBmaWxlIGlzIGxvY2tlZCAqLwotICAgICAgICAgICAgKnBTaXplID0gMDsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9DT05URVhUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uID0gcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uICsgdWlTaXplUmVhZDsKLSAgICAgICAgICAgIGlmICgoTTRPU0FfVUludDMyKXVpU2l6ZVJlYWQgPCAqcFNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBTaXplID0gdWlTaXplUmVhZDsKLSAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBlbmQgb2YgZmlsZSAqLwotICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBTaXplID0gdWlTaXplUmVhZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZihwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAhPSBTZWVrUmVhZCkKLSAgICB7Ci0gICAgICAgIC8qIGZzZWVrIHRvIHRoZSBsYXN0IHJlYWQgcG9zaXRpb24gKi8KLSAgICAgICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vblNlZWsocENvbnRleHQsIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uKSk7Ci0gICAgICAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlUmVhZERhdGE6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrID0gU2Vla1JlYWQ7Ci0gICAgfQotCi0gICAgLyogUmVhZCBkYXRhICovCi0gICAgdWlTaXplUmVhZCA9IGZyZWFkKGRhdGEsIHNpemVvZihNNE9TQV9DaGFyKSwgKnBTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLSAgICBpZigtMSA9PSB1aVNpemVSZWFkKQotICAgIHsKLSAgICAgICAgLyogaGFuZGxlIGlzIGludmFsaWQsIG9yIHRoZSBmaWxlIGlzIG5vdCBvcGVuIGZvciByZWFkaW5nLAotICAgICAgICAgb3IgdGhlIGZpbGUgaXMgbG9ja2VkICovCi0gICAgICAgICpwU2l6ZSA9IDA7Ci0gICAgICAgIGVyciA9IE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gKyB1aVNpemVSZWFkOwotICAgICAgICBpZiAoKE00T1NBX1VJbnQzMil1aVNpemVSZWFkIDwgKnBTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFNpemUgPSB1aVNpemVSZWFkOwotCi0gICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBlbmQgb2YgZmlsZSAqLwotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5iX2lzX2VuZF9vZl9maWxlID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFNpemUgPSB1aVNpemVSZWFkOwotICAgICAgICB9Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiBpbiB0aGUgY29yZSBmaWxlCi0gKiAgICAgICAgICAgICByZWFkZXIgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpLiBUaGUgcG9zaXRpb24gaXMgcmVsYXRlZCB0bwotICogICAgICAgICAgICAgdGhlIHNlZWtNb2RlIHBhcmFtZXRlciBpdCBjYW4gYmUgZWl0aGVyIGZyb20gdGhlIGJlZ2lubmluZywgZnJvbQotICogICAgICAgICAgICAgdGhlIGVuZCBvciBmcm9tIHRoZSBjdXJyZW50IHBvc3Rpb24uIFRvIHN1cHBvcnQgbGFyZ2UgZmlsZQotICogICAgICAgICAgICAgYWNjZXNzIChtb3JlIHRoYW4gMkdCeXRlcyksIHRoZSBwb3NpdGlvbiBpcyBwcm92aWRlZCBvbiBhIDY0Ci0gKiAgICAgICAgICAgICBiaXRzLgotICogQG5vdGUgICAgICAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uIHBvaW50ZXIKLSAqICAgICAgICAgICAgIGluIHRoZSBmaWxlIG11c3Qgbm90IGNoYW5nZS4gRWxzZSB0aGUgY3VycmVudAotICogICAgICAgICAgICAgcG9zaXRpb24gcG9pbnRlciBtdXN0IGJlIHVwZGF0ZWQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBzZWVrTW9kZTogKElOKSBTZWVrIGFjY2VzcyBtb2RlCi0gKiBAcGFyYW0gICAgICBwb3NpdGlvbjogKElOL09VVCkgUG9zaXRpb24gaW4gdGhlIGZpbGUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT046IHRoZSBwb3NpdGlvbiBjYW5ub3QgYmUgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2VlayhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZVJlYWRTZWVrIDogbW9kZSA9ICVkICBwb3MgPSAlbHUiLCBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFBvc2l0aW9uICE9IE00T1NBX05VTEwpID8gKCpwUG9zaXRpb24pIDogMCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNlZWs6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBzZWVrTW9kZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNlZWs6IHNlZWtNb2RlIGlzIDAiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9zaXRpb24sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNlZWs6IHBQb3NpdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCi0gICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVSZWFkU2Vlazogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmIChNNE9TQV9rRGVzY1JXQWNjZXNzID09IHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MpCi0gICAgewotICAgICAgICAgTTRPU0FfVUludDMyICAgIFNlZWtNb2RlT3B0aW9uOwotICAgICAgICAgLyogR28gdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gKi8KLSAgICAgICAgaWYgKE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZyA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX1NFVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE9TQV9rRmlsZVNlZWtFbmQgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19FTkQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX0NVUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE9TQV9maWxlUmVhZFNlZWs6IEVORCBXSVRIIEVSUk9SICEhISAoQ09OVkVSSU9OIEVSUk9SIEZPUiBUSEUgU0VFSyBNT0RFKSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLwotICAgICAgICBlcnIgPSBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgKnBQb3NpdGlvbiwgU2Vla01vZGVPcHRpb24pOwotICAgICAgICBpZihlcnIgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICAgICAgZXJyPSgoTTRPU0FfVUludDMyKShNNF9FUlIpPDwzMCkrKCgoTTRPU0FfRklMRV9XUklURVIpJjB4MDAzRkZGKTw8MTYpKyhNNE9TQV9JbnQxNikoZXJyKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZFNlZWsgZXJyb3I6JXgiLGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJldHVybiB3aXRob3V0IGVycm9yICovCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmKHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrICE9IFNlZWtSZWFkKQotICAgIHsKLQotICAgICAgICAvKiBmc2VlayB0byB0aGUgbGFzdCByZWFkIHBvc2l0aW9uICovCi0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbikpOwotICAgICAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVJlYWREYXRhOiBNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayA9IFNlZWtSZWFkOwotICAgIH0KLQotICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBzZWVrTW9kZSwgcFBvc2l0aW9uKTsKLSAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVSZWFkRGF0YTogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uID0gKnBQb3NpdGlvbjsKLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIGNsb3NlIHRoZSBmaWxlCi0gKiAgICAgICAgICAgICAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCi0gKiBAbm90ZSAgICAgICBUaGUgY29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlciBpcyBmcmVlZC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZENsb3NlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfZmlsZVJlYWRDbG9zZSA6IHBDID0gMHglcCIsIHBDb250ZXh0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRDbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaWYoTTRPU0FfRklMRV9XUklURVIgPT0gcEZpbGVDb250ZXh0LT5jb3JlSURfd3JpdGUpCi0gICAgewotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkNsb3NlKE00T1NBX0ZJTEVfUkVBREVSLCBwQ29udGV4dCk7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIHJldHVybiB0aGUgdmFsdWUKLSAqICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gKiAgICAgICAgICAgICBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICAndmFsdWUnIG11c3QgYmUgY2FzdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgcmVsYXRlZCB0byB0aGUKLSAqICAgICAgICAgICAgIG9wdGlvbklEIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gKiAgICAgICAgICAgICBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlICd2YWx1ZScgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5Ci0gKiAgICAgICAgICAgICB0aGlzIGZpZWxkIHRvIGl0cyBpbnRlcm5hbCB2YXJpYWJsZS4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBwT3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbgotICogQHBhcmFtICAgICAgcE9wdGlvblZhbHVlOiAoT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfV1JJVEVfT05MWTogdGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBwT3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uIDogb3B0aW9uID0gMHgleCIsIG9wdGlvbklEKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihvcHRpb25JRCA9PSAwLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbjogb3B0aW9uSUQgaXMgMCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBPcHRpb25WYWx1ZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbjogcE9wdGlvblZhbHVlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfRklMRV9SRUFERVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19SRUFEQUJMRShvcHRpb25JRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1dSSVRFX09OTFksICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbiIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbjogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1BPU0lUSU9OID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uID0gKE00T1NBX0ZpbGVQb3NpdGlvbiopcE9wdGlvblZhbHVlOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgKnBQb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbjsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1BPU0lUSU9OKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9JU19FT0YgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlUmVhZElzRU9GOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9Cb29sKiBiSXNFbmRPZkZpbGUgPSAoTTRPU0FfQm9vbCopcE9wdGlvblZhbHVlOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgKmJJc0VuZE9mRmlsZSA9IHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0lTX0VPRiovCi0KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9TSVpFID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZToKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwUG9zaXRpb24gPSAoTTRPU0FfRmlsZVBvc2l0aW9uKilwT3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBNNE9TQV9JbnQzMiBpU2F2ZVBvcyAgICA9IDA7Ci0gICAgICAgICAgICBNNE9TQV9JbnQzMiBpU2l6ZSAgICAgICAgPSAwOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBCdWdmaXg6IHVwZGF0ZSB0aGUgZmlsZSBzaXplLgotICAgICAgICAgICAgKiBXaGVuIGEgZmlsZSBpcyBpbiByZWFkIG1vZGUsIG1heSBiZSBhbm90aGVyIGFwcGxpY2F0aW9uIGlzIHdyaXRpbmcgaW4uCi0gICAgICAgICAgICAqIFNvLCB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgZmlsZSBzaXplICovCi0gICAgICAgICAgICBpU2F2ZVBvcyA9IGZ0ZWxsKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsgICAgICAgICAgICAvKjEtIENoZWNrIHRoZSBmaXJzdCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIDAsIFNFRUtfRU5EKTsgICAgICAgIC8qMi0gR28gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotICAgICAgICAgICAgaVNpemUgPSBmdGVsbChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7ICAgICAgICAgICAgICAgIC8qMy0gQ2hlY2sgdGhlIGZpbGUgc2l6ZSovCi0gICAgICAgICAgICBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgaVNhdmVQb3MsIFNFRUtfU0VUKTsgICAgLyo0LSBnbyB0byB0aGUgZmlyc3QgcG9zaXRpb24qLwotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX3NpemUgPSBpU2l6ZTsKLQotICAgICAgICAgICAgKnBQb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfU0laRSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfQVRUUklCVVRFID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlQXR0cmlidXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZShwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVBdHRyaWJ1dGUqKXBPcHRpb25WYWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9BVFRSSUJVVEUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9VUkwgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldFVSTDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25HZXRVUkwocENvbnRleHQsIChNNE9TQV9DaGFyKiopcE9wdGlvblZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9VUkwqLwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkTG9ja01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICooTTRPU0FfVUludDMyKilwT3B0aW9uVmFsdWUgPSBwRmlsZUNvbnRleHQtPm1fdWlMb2NrTW9kZTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24iKTsKLQotICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZuICAgICAgICAgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpKQotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIHNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KLSAqICAgICAgICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgJ3ZhbHVlJyBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkgdGhpcyBmaWVsZAotICogICAgICAgICAgICAgdG8gaXRzIGludGVybmFsIHZhcmlhYmxlLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIHZhbHVlOiAoSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9SRUFEX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgcmVhZCBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIDogb3B0aW9uID0gMHgleCIsIG9wdGlvbklEKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IG9wdGlvbklELCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfRklMRV9SRUFERVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24iKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1JFQURfT05MWSwgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRMb2NrTW9kZToKLSAgICAgICAgewotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5tX3VpTG9ja01vZGU9IChNNE9TQV9VSW50MzIpKihNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVdyaXRlci5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVdyaXRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzN2ZjMTczLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVXcml0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyLmMKLSAqIEBicmllZiAgICAgICAgRmlsZSB3cml0ZXIgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIHdyaXRlIGluIGEgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb25fcHJpdi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgcHJvdmlkZWQgVVJMIGFuZCByZXR1cm5zIGl0cyBjb250ZXh0LgotICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJlZCwgdGhlIGNvbnRleHQgaXMgc2V0IHRvIE5VTEwuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKE9VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgotICogQHBhcmFtICAgICAgcFVybDogKElOKSBVUkwgb2YgdGhlIGlucHV0IGZpbGUKLSAqIEBwYXJhbSAgICAgIGZpbGVNb2RlQWNjZXNzOiAoSU4pIEZpbGUgbW9kZSBhY2Nlc3MKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgZmlsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9MT0NLRUQ6IHRoZSBmaWxlIGlzIGxvY2tlZCBieSBhbiBvdGhlcgotICogICAgICAgICAgICAgYXBwbGljYXRpb24vcHJvY2VzcwotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M6IHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZU9wZW4oTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBVcmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2ZpbGVXcml0ZU9wZW4gOiBwQyA9IDB4JXAgIGZkID0gMHglcCAgbW9kZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwVXJsLCBmaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbk9wZW4oTTRPU0FfRklMRV9XUklURVIsIHBDb250ZXh0LCBwVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTW9kZUFjY2Vzcyk7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgJ3NpemUnIGJ5dGVzIHN0b3JlZCBhdCAnZGF0YScgbWVtb3J5Ci0gKiAgICAgICAgICAgICBpbiB0aGUgZmlsZSBzZWxlY3RlZCBieSBpdHMgY29udGV4dC4KLSAqIEBub3RlICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKLSAqICAgICAgICAgICAgIG1lbW9yeSBmb3IgJ2RhdGEnIHBhcmFtZXRlci4KLSAqIEBub3RlICAgICAgIE1vcmVvdmVyIHRoZSBkYXRhIHBvaW50ZXIgbXVzdCBiZSBhbGxvY2F0ZWQgdG8gc3RvcmUgYXQgbGVhc3QKLSAqICAgICAgICAgICAgICdzaXplJyBieXRlcy4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBidWZmZXI6IChJTikgRGF0YSBwb2ludGVyIG9mIHRoZSB3cml0ZSBkYXRhCi0gKiBAcGFyYW0gICAgICBzaXplOiAoSU4pIFNpemUgb2YgdGhlIGRhdGEgdG8gd3JpdGUgKGluIGJ5dGVzKQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlRGF0YShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9NZW1BZGRyOCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpU2l6ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdWlTaXplV3JpdGU7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZVdyaXRlRGF0YSA6IGRhdGEgPSAweCVwICBzaXplID0gJWx1IiwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpU2l6ZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBkYXRhLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IGRhdGEgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IHVpU2l6ZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRGF0YTogdWlTaXplIGlzIDAiKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRGF0YTogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmIChNNE9TQV9rRGVzY1JXQWNjZXNzID09IHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgICAgV3JpdGVTaXplOwotICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICBXcml0ZVNpemUgPSBmd3JpdGUoKHZvaWQgKilkYXRhLDEsIHVpU2l6ZSwgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOwotICAgICAgICBpZihXcml0ZVNpemUgIT0gdWlTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgICAgICBlcnIgPSAoKE00T1NBX1VJbnQzMikoTTRfRVJSKTw8MzApKygoKE00T1NBX0ZJTEVfV1JJVEVSKSYweDAwM0ZGRik8PDE2KSsoTTRPU0FfSW50MTYpKFdyaXRlU2l6ZSk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVdyaXRlRGF0YSBlcnJvcjoleCIsZXJyKTsKLSAgICAgICAgfQotICAgICAgICBmZmx1c2gocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOwotCi0gICAgICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uICsgV3JpdGVTaXplOwotCi0gICAgICAgIC8qIFVwZGF0ZSB0aGUgZmlsZSBzaXplICovCi0gICAgICAgIGlmKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPiBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX3NpemUgPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZihwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAhPSBTZWVrV3JpdGUpCi0gICAgewotICAgICAgICAvKiBmc2VlayB0byB0aGUgbGFzdCByZWFkIHBvc2l0aW9uICovCi0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsCi0gICAgICAgICAgICAmKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24pKTsKLQotICAgICAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgewotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotICAgICAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVdyaXRlRGF0YTogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayA9IFNlZWtXcml0ZTsKLSAgICB9Ci0KLSAgICAvKiBXcml0ZSBkYXRhICovCi0gICAgdWlTaXplV3JpdGUgPSBmd3JpdGUoZGF0YSwgc2l6ZW9mKE00T1NBX0NoYXIpLCB1aVNpemUsIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLQotICAgIGlmKHVpU2l6ZVdyaXRlID09IChNNE9TQV9VSW50MzIpLTEpCi0gICAgewotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgLyogQW4gZXJyb3Igb2NjdXJlZCAqLwotCi0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZVdyaXRlRGF0YTogZndyaXRlIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gKyB1aVNpemVXcml0ZTsKLQotICAgIC8qIFVwZGF0ZSB0aGUgZmlsZSBzaXplICovCi0gICAgaWYocEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiA+IHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplKQotICAgIHsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX3NpemUgPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uOwotICAgIH0KLQotICAgIGlmKChNNE9TQV9VSW50MzIpdWlTaXplV3JpdGUgPCB1aVNpemUpCi0gICAgewotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlV3JpdGVEYXRhIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIGluIHRoZSBjb3JlIGZpbGUKLSAqICAgICAgICAgICAgIHdyaXRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykuIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvCi0gKiAgICAgICAgICAgICB0aGUgc2Vla01vZGUgcGFyYW1ldGVyIGl0IGNhbiBiZSBlaXRoZXIgZnJvbSB0aGUgYmVnaW5uaW5nLAotICogICAgICAgICAgICAgZnJvbSB0aGUgZW5kIG9yIGZyb20gdGhlIGN1cnJlbnQgcG9zdGlvbi4gVG8gc3VwcG9ydCBsYXJnZSBmaWxlCi0gKiAgICAgICAgICAgICBhY2Nlc3MgKG1vcmUgdGhhbiAyR0J5dGVzKSwgdGhlIHBvc2l0aW9uIGlzIHByb3ZpZGVkIG9uIGEgNjQKLSAqICAgICAgICAgICAgIGJpdHMuCi0gKiBAbm90ZSAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24gcG9pbnRlcgotICogICAgICAgICAgICAgaW4gdGhlIGZpbGUgbXVzdCBub3QgY2hhbmdlLiBFbHNlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHBvaW50ZXIKLSAqICAgICAgICAgICAgIG11c3QgYmUgdXBkYXRlZC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBzZWVrTW9kZTogKElOKSBTZWVrIGFjY2VzcyBtb2RlCi0gKiBAcGFyYW0gICAgICBwb3NpdGlvbjogKElOL09VVCkgUG9zaXRpb24gaW4gdGhlIGZpbGUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT046IHRoZSBwb3NpdGlvbiBjYW5ub3QgYmUgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVTZWVrKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZVdyaXRlU2VlayA6IG1vZGUgPSAlZCAgcG9zID0gJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZWtNb2RlLCAoTTRPU0FfTlVMTCAhPSBwUG9zaXRpb24pID8gKCpwUG9zaXRpb24pIDogMCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBzZWVrTW9kZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IHNlZW1Nb2RlIGlzIDAiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9zaXRpb24sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IHBQb3NpdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZiAoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKSAvKiByZWFkIHdyaXRlICovCi0gICAgewotICAgICAgICAgTTRPU0FfVUludDMyICAgIFNlZWtNb2RlT3B0aW9uOwotICAgICAgICAvKlRoZSBwb3NpdGlvbiBmb3IgdGhlIHNlZWsgbW9kZSBiZXR3ZWVuIHRoZSBTSFAgYW5kIHRoZSBPU0FsIHBhcnQgYXJlIGRpZmZlcmVudCAqLwotICAgICAgICBpZiAoTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nID09IHNlZWtNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfU0VUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKE00T1NBX2tGaWxlU2Vla0VuZCA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX0VORDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE9TQV9rRmlsZVNlZWtDdXJyZW50ID09IHNlZWtNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfQ1VSOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00T1NBX2ZpbGVXcml0ZVNlZWs6IEVORCBXSVRIIEVSUk9SICEhISAoQ09OVkVSSU9OIEVSUk9SIEZPUiBUSEUgU0VFSyBNT0RFKSAiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR28gdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gKi8KLSAgICAgICAgZXJyID0gZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsKnBQb3NpdGlvbixTZWVrTW9kZU9wdGlvbik7Ci0gICAgICAgIGlmKGVyciAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgICAgICBlcnI9KChNNE9TQV9VSW50MzIpKE00X0VSUik8PDMwKSsoKChNNE9TQV9GSUxFX1dSSVRFUikmMHgwMDNGRkYpPDwxNikrKE00T1NBX0ludDE2KShlcnIpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVXcml0ZVNlZWsgZXJyb3I6JXgiLGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgc2Vla01vZGUsIHBQb3NpdGlvbik7Ci0KLSAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiA9ICpwUG9zaXRpb247Ci0KLSAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayA9IFNlZWtXcml0ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgd3JpdGVyIHRvIGNsb3NlIHRoZSBmaWxlCi0gKiAgICAgICAgICAgICAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCi0gKiBAbm90ZSAgICAgICBUaGUgY29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlciBpcyBmcmVlZC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlQ2xvc2UoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9maWxlV3JpdGVDbG9zZSA6IHBDID0gMHglcCIsIHBDb250ZXh0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVDbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25DbG9zZShNNE9TQV9GSUxFX1dSSVRFUiwgcENvbnRleHQpOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBmbHVzaGVzIHRoZSBzdHJlYW0gYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVGbHVzaChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlV3JpdGVGbHVzaCA6IHBDID0gMHglcCIsIHBDb250ZXh0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVGbHVzaDogcGNvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRmx1c2g6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmIChmZmx1c2gocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpICE9IDApCi0gICAgewotICAgICAgICBlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgd3JpdGVyIHRvIHJldHVybiB0aGUgdmFsdWUKLSAqICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuCi0gKiAgICAgICAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0gKiAgICAgICAgICAgICBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICAgJ3ZhbHVlJyBtdXN0IGJlIGNhc3QgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIHJlbGF0ZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICBvcHRpb25JRAotICogICAgICAgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZQotICogICAgICAgICAgICAgJ3ZhbHVlJyBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkgdGhpcyBmaWVsZAotICogICAgICAgICAgICAgdG8gaXRzIGludGVybmFsIHZhcmlhYmxlLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIKLSAqIEBwYXJhbSAgICAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIHZhbHVlOiAoT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfV1JJVEVfT05MWTogdGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcE9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24gOiBvcHRpb24gPSAweCV4Iiwgb3B0aW9uSUQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IDAsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBPcHRpb25WYWx1ZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb246IHBPdGlvblZhbHVlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfRklMRV9XUklURVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19SRUFEQUJMRShvcHRpb25JRCksIE00RVJSX1dSSVRFX09OTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX1BPU0lUSU9OID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVBvc2l0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uID0gKE00T1NBX0ZpbGVQb3NpdGlvbiopcE9wdGlvblZhbHVlOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgKnBvc2l0aW9uID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbjsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9QT1NJVElPTiovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX1NJWkUgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRGaWxlU2l6ZToKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbiA9IChNNE9TQV9GaWxlUG9zaXRpb24qKXBPcHRpb25WYWx1ZTsKLQotICAgICAgICAgICAgaWYoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGlTYXZlUG9zICAgID0gMDsKLSAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpU2l6ZSAgICAgICAgPSAwOwotCi0gICAgICAgICAgICAgICAgaVNhdmVQb3MgPSBmdGVsbChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7ICAgICAgICAgICAgLyoxLSBDaGVjayB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSAgICAgICAgICAgICAgICBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgMCwgU0VFS19FTkQpOyAgICAgICAgLyoyLSBHbyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlICovCi0gICAgICAgICAgICAgICAgKnBvc2l0aW9uID0gZnRlbGwocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOyAgICAgICAgICAgIC8qMy0gQ2hlY2sgdGhlIGZpbGUgc2l6ZSovCi0gICAgICAgICAgICAgICAgZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIGlTYXZlUG9zLCBTRUVLX1NFVCk7ICAgIC8qNC0gZ28gdG8gdGhlIGZpcnN0IHBvc2l0aW9uKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgICpwb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX1NJWkUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfVVJMID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0VVJMOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkdldFVSTCAocENvbnRleHQsIChNNE9TQV9DaGFyKiopcE9wdGlvblZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfVVJMKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfQVRUUklCVVRFID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0QXR0cmlidXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZShwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRmlsZUF0dHJpYnV0ZSopcE9wdGlvblZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9BVFRSSUJVVEUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfUkVBREVSX0NPTlRFWFQgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRSZWFkZXJDb250ZXh0OgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlTW9kZUFjY2VzcyBhY2Nlc3MgPSBwRmlsZUNvbnRleHQtPmFjY2Vzc19tb2RlOwotCi0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoIShhY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpLCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBNNE9TQV9rRmlsZVJlYWQiKTsKLQotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKCEoYWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSksIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb246IE00T1NBX2tGaWxlV3JpdGUiKTsKLQotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5jb3JlSURfcmVhZCA9IE00T1NBX0ZJTEVfUkVBREVSOwotCi0gICAgICAgICAgICAqcE9wdGlvblZhbHVlID0gcENvbnRleHQ7Ci0KLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9SRUFERVJfQ09OVEVYVCovCi0KLSAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVMb2NrTW9kZToKLSAgICAgICAgewotICAgICAgICAgICAgKihNNE9TQV9VSW50MzIqKXBPcHRpb25WYWx1ZSA9IHBGaWxlQ29udGV4dC0+bV91aUxvY2tNb2RlOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiIpOwotCi0gICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLX0KLQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSB3cml0ZXIgdG8gc2V0IHRoZSB2YWx1ZQotKiAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgotKiAgICAgICAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0qICAgICAgICAgICAgIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0qIEBub3RlICAgICAgIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKLSogICAgICAgICAgICAgJ3ZhbHVlJyBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkgdGhpcyBmaWVsZCB0byBpdHMgaW50ZXJuYWwKLSogICAgICAgICAgICAgdmFyaWFibGUuCi0qIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyCi0qIEBwYXJhbSAgICAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24KLSogQHBhcmFtICAgICAgdmFsdWU6IChJTikgVmFsdWUgb2YgdGhlIG9wdGlvbgotKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgICBNNEVSUl9SRUFEX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgcmVhZCBvbmx5IG9uZQotKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlV3JpdGVTZXRPcHRpb24gOiBvcHRpb24gPSAweCV4Iiwgb3B0aW9uSUQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBvcHRpb25JRCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX0ZJTEVfV1JJVEVSKSwKLSAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfV1JJVEFCTEUob3B0aW9uSUQpLCBNNEVSUl9SRUFEX09OTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZXRPcHRpb246IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBzd2l0Y2gob3B0aW9uSUQpCi0gICAgewotICAgICAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVMb2NrTW9kZToKLSAgICAgICAgewotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5tX3VpTG9ja01vZGUgPSAoTTRPU0FfVUludDMyKSooTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlRGVzY01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MgPSAoTTRPU0FfSW50MzIpKihNNE9TQV9JbnQzMiopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX011dGV4LmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9NdXRleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYmU2YmJhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX011dGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgICAgTXV0ZXggZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgbXV0ZXgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9NdXRleC5oIgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLQotLyogQ29udGV4dCBmb3IgdGhlIG11dGV4ICovCi10eXBlZGVmIHN0cnVjdAotewotICAgTTRPU0FfVUludDMyICAgICBjb3JlSUQ7ICAgICAgICAgICAgICAgLyogbXV0ZXggY29udGV4dCBpZGVudGlmaWFudCAqLwotICAgcHRocmVhZF9tdXRleF90ICBtdXRleDsgICAgICAgICAgICAgICAgLyogbXV0ZXggKi8KLSAgIHB0aHJlYWRfdCAgICAgICAgdGhyZWFkT3duZXJJRDsgICAgICAgIC8qIHRocmVhZCBvd25lciBpZGVudGlmaWFudCAqLwotfSBNNE9TQV9NdXRleENvbnRleHQ7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgbXV0ZXguCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIGFsbG9jYXRlcyBhIHVuaXF1ZSBjb250ZXh0LiBJdCdzIHRoZQotICogICAgICAgICAgICAgT1NBTCByZWFsIHRpbWUgcmVzcG9uc2liaWxpdHkgZm9yIG1hbmFnaW5nIGl0cyBjb250ZXh0LiBJdCBtdXN0Ci0gKiAgICAgICAgICAgICBiZSBmcmVlZCBieSB0aGUgTTRPU0FfbXV0ZXhDbG9zZSBmdW5jdGlvbi4gVGhlIGNvbnRleHQgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICB3aWxsIGJlIHNlbnQgYmFjayB0byBhbnkgT1NBTCBjb3JlIG11dGV4IGZ1bmN0aW9ucyB0byBhbGxvdwotICogICAgICAgICAgICAgcmV0cmlldmluZyBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIG9wZW5lZCBtdXRleC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OihPVVQpIENvbnRleHQgb2YgdGhlIGNyZWF0ZWQgbXV0ZXgKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRDogdGhlIGNvbnRleHQgY3JlYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX211dGV4T3BlbihNNE9TQV9Db250ZXh0KiBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9NdXRleENvbnRleHQqIHBNdXRleENvbnRleHQgPSAoTTRPU0FfTXV0ZXhDb250ZXh0KilNNE9TQV9OVUxMOwotICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgYXR0cmlidXRlID0geyAwIH07Ci0gICAgTTRPU0FfQm9vbCBvcGVuZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9tdXRleE9wZW5cdFx0TTRPU0FfQ29udGV4dCogMHgleCIsIHBDb250ZXh0KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9tdXRleE9wZW46IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9NdXRleENvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBNNE9TQV9NVVRFWCwgKE00T1NBX0NoYXIqKSJNNE9TQV9tdXRleE9wZW46IG11dGV4IGNvbnRleHQiKTsKLQotICAgIGlmKE00T1NBX05VTEwgPT0gcE11dGV4Q29udGV4dCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfbXV0ZXhPcGVuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBtdXRleCBhdHRyaWJ1dGUuICovCi0gICAgaWYgKCAwID09IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoICZhdHRyaWJ1dGUgKSApCi0gICAgewotICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBtdXRleCB0eXBlLiAqLwotICAgICAgICBpZiAoIDAgPT0gcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSggJmF0dHJpYnV0ZSwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIG11dGV4LiAqLwotICAgICAgICAgICAgaWYgKDAgPT0gcHRocmVhZF9tdXRleF9pbml0KCAmcE11dGV4Q29udGV4dC0+bXV0ZXgsICZhdHRyaWJ1dGUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3BlbmVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIERlc3Ryb3kgdGhlIG11dGV4IGF0dHJpYnV0ZS4gKi8KLSAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSggJmF0dHJpYnV0ZSApOwotICAgIH0KLQotICAgIGlmKCFvcGVuZWQpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9DT05URVhUX0ZBSUxFRCwgIk00T1NBX211dGV4T3BlbjogT1MgbXV0ZXggY3JlYXRpb24gZmFpbGVkIik7Ci0gICAgICAgIGZyZWUocE11dGV4Q29udGV4dCk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DT05URVhUX0ZBSUxFRCA7Ci0gICAgfQotCi0gICAgcE11dGV4Q29udGV4dC0+Y29yZUlEID0gTTRPU0FfTVVURVg7Ci0KLSAgICBwTXV0ZXhDb250ZXh0LT50aHJlYWRPd25lcklEID0gMDsKLQotICAgICpwQ29udGV4dCA9IChNNE9TQV9Db250ZXh0KSBwTXV0ZXhDb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgbG9ja3MgdGhlIG11dGV4LiAiQ29udGV4dCIgaWRlbnRpZmllcyB0aGUgbXV0ZXguCi0gKiBAbm90ZSAgICAgICBJZiB0aGUgbXV0ZXggaXMgYWxyZWFkeSBsb2NrZWQsIHRoZSBjYWxsaW5nIHRocmVhZCBibG9ja3MgdW50aWwKLSAqICAgICAgICAgICAgIHRoZSBtdXRleCBiZWNvbWVzIGF2YWlsYWJsZSAoYnkgY2FsbGluZyBNNE9TQV9tdXRleFVubG9jaykgb3IKLSAqICAgICAgICAgICAgICJ0aW1lb3V0IiBpcyByZWFjaGVkLiBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgbXV0ZXgKLSAqIEBwYXJhbSAgICAgIHRpbWVvdXQ6KElOKSBUaW1lIG91dCBpbiBtaWxsaXNlY29uZHMKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRXQVJfVElNRV9PVVQ6IHRpbWUgb3V0IGlzIGVsYXBzZWQgYmVmb3JlIG11dGV4IGhhcyBiZWVuCi0gKiAgICAgICAgICAgICBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9tdXRleExvY2soTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9VSW50MzIgdGltZW91dCkKLXsKLSAgICBNNE9TQV9NdXRleENvbnRleHQqIHBNdXRleENvbnRleHQgPSAoTTRPU0FfTXV0ZXhDb250ZXh0Kiljb250ZXh0OwotICAgIHB0aHJlYWRfdCAgICAgICAgICAgY3VycmVudFRocmVhZDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHJlc3VsdDsKLSAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIHRzOwotICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgbGVmdDsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9tdXRleExvY2tcdFx0TTRPU0FfQ29udGV4dCAweCV4XHRNNE9TQV9VSW50MzIgJWQiLAotICAgICAgICBjb250ZXh0LCB0aW1lb3V0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX211dGV4TG9jazogY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKHBNdXRleENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9NVVRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhMb2NrIik7Ci0KLSAgICBjdXJyZW50VGhyZWFkID0gcHRocmVhZF9zZWxmKCk7Ci0KLSAgICBpZihwTXV0ZXhDb250ZXh0IC0+dGhyZWFkT3duZXJJRCA9PSBjdXJyZW50VGhyZWFkKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleExvY2s6IFRocmVhZCB0cmllZCB0byBsb2NrIGEgbXV0ZXggaXQgYWxyZWFkeSBvd25zIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVCA7Ci0gICAgfQotCi0gICAgLyogTG9jayB0aGUgbXV0ZXguICovCi0gICAgaWYgKCBNNE9TQV9XQUlUX0ZPUkVWRVIgPT0gdGltZW91dCkKLSAgICB7Ci0gICAgICAgIGlmICggMCAhPSBwdGhyZWFkX211dGV4X2xvY2soJnBNdXRleENvbnRleHQtPm11dGV4KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhMb2NrOiBPUyBtdXRleCB3YWl0IGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmcE11dGV4Q29udGV4dC0+bXV0ZXgpOwotICAgICAgICB3aGlsZSAoICggRUJVU1kgPT0gcmVzdWx0ICkgJiYgKCAwIDwgdGltZW91dCApICkKLSAgICAgICAgewotICAgICAgICAgICAgdHMudHZfc2VjICA9IDA7Ci0gICAgICAgICAgICBpZiAoMSA8PSB0aW1lb3V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRzLnR2X25zZWMgPSAxMDAwMDAwOwotICAgICAgICAgICAgICAgIHRpbWVvdXQgLT0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cy50dl9uc2VjID0gdGltZW91dCAqIDEwMDAwMDA7Ci0gICAgICAgICAgICAgICAgdGltZW91dCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW5vc2xlZXAoJnRzLCAmbGVmdCk7Ci0gICAgICAgICAgICByZXN1bHQgPSBwdGhyZWFkX211dGV4X3RyeWxvY2soJnBNdXRleENvbnRleHQtPm11dGV4KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoMCAhPSByZXN1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChFQlVTWSA9PSByZXN1bHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX1RJTUVfT1VUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhMb2NrOiBPUyBtdXRleCB3YWl0IGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHBNdXRleENvbnRleHQtPnRocmVhZE93bmVySUQgPSBjdXJyZW50VGhyZWFkOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIHVubG9ja3MgdGhlIG11dGV4LiBUaGUgbXV0ZXggaXMgaWRlbnRpZmllZCBieQotICogICAgICAgICAgICAgaXRzIGNvbnRleHQKLSAqIEBub3RlICAgICAgIFRoZSBNNE9TQV9tdXRleExvY2sgdW5ibG9ja3MgdGhlIHRocmVhZCB3aXRoIHRoZSBoaWdoZXN0Ci0gKiAgICAgICAgICAgICBwcmlvcml0eSBhbmQgbWFkZSBpdCByZWFkeSB0byBydW4uCi0gKiBAbm90ZSAgICAgICBObyBoeXBvdGhlc2VzIGNhbiBiZSBtYWRlIG9uIHdoaWNoIHRocmVhZCB3aWxsIGJlIHVuLWJsb2NrZWQKLSAqICAgICAgICAgICAgIGJldHdlZW4gdGhyZWFkcyB3aXRoIHRoZSBzYW1lIHByaW9yaXR5LgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBtdXRleAotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9tdXRleFVubG9jayhNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRPU0FfTXV0ZXhDb250ZXh0KiBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopY29udGV4dDsKLSAgICBwdGhyZWFkX3QgY3VycmVudFRocmVhZDsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9tdXRleFVubG9ja1x0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBjb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfbXV0ZXhVbmxvY2s6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9NVVRFWCAhPSBwTXV0ZXhDb250ZXh0LT5jb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleFVubG9jayIpOwotCi0gICAgY3VycmVudFRocmVhZCA9IHB0aHJlYWRfc2VsZigpOwotCi0gICAgaWYocE11dGV4Q29udGV4dC0+dGhyZWFkT3duZXJJRCAhPSBjdXJyZW50VGhyZWFkKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleFVubG9jazogVGhyZWFkIHRyaWVkIHRvIHVubG9jayBhIG11dGV4IGl0IGRvZXNuJ3Qgb3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSAgICBwTXV0ZXhDb250ZXh0LT50aHJlYWRPd25lcklEID0gMCA7Ci0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcE11dGV4Q29udGV4dC0+bXV0ZXgpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgZGVsZXRlcyBhIG11dGV4IChpZGVudGlmeSBieSBpdHMgY29udGV4dCkuIEFmdGVyCi0gKiAgICAgICAgICAgICB0aGlzIGNhbGwsIHRoZSBtdXRleCBhbmQgaXRzIGNvbnRleHQgaXMgbm8gbW9yZSB1c2VhYmxlLiBUaGlzCi0gKiAgICAgICAgICAgICBmdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yeSByZWxhdGVkIHRvIHRoaXMgbXV0ZXguCi0gKiBAbm90ZSAgICAgICBJdCBpcyBhbiBhcHBsaWNhdGlvbiBpc3N1ZSB0byB3YXJyYW50IG5vIG1vcmUgdGhyZWFkcyBhcmUgbG9ja2VkCi0gKiAgICAgICAgICAgICBvbiB0aGUgZGVsZXRlZCBtdXRleC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgbXV0ZXgKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX211dGV4Q2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00T1NBX011dGV4Q29udGV4dCogcE11dGV4Q29udGV4dCA9IChNNE9TQV9NdXRleENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfbXV0ZXhDbG9zZVx0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfbXV0ZXhDbG9zZTogY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKHBNdXRleENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9NVVRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4VW5sb2NrIik7Ci0KLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnBNdXRleENvbnRleHQtPm11dGV4KTsKLQotICAgIGZyZWUoIHBNdXRleENvbnRleHQpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1JhbmRvbS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfUmFuZG9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyNGQwMzkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfUmFuZG9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00UFNXX1RyYWNlLmMKLSAqIEBicmllZiAgICAgICAgVHJhY2UgZnVuY3Rpb24gZm9yIHRyYWNlIG1hY3JvcwotICogQG5vdGUgICAgICAgIFRoaXMgZmlsZSBnaXZlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRyYWNlIGZ1bmN0aW9uIHVzZWQKLSAqICAgICAgICAgICAgICAgIGluIHRoZSB0cmFjZSBpbnN0cnVtZW50YXRpb24gbWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qZm9yIHByaW50ZiAqLwotI2luY2x1ZGUgPHN0ZGFyZy5oPiAvKiBBTlNJIEMgbWFjcm9zIGFuZCBkZWZzIGZvciB2YXJpYWJsZSBhcmdzICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX011dGV4LmgiCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgIE00T1NBX0VSUiBNNE9TQV9yYW5kSW5pdCgpCi0gKiBAYnJpZWYgICAgICB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIG51bWJlciBnZW5lcmF0b3IKLSAqICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIGJlZm9yZSBhbnkgY2FsbCB0byBNNE9TQV9yYW5kKCkKLSAqICAgICAgICAgICAgICAgbmVlZCB0aGUgc3RkbGliIGFuZCB0aW1lIGxpYnJhcmllcwotICogQG5vdGUKLSAqIEBwYXJhbQotICogQHJldHVybiAgICAgTTROT19FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX3JhbmRJbml0KCkKLXsKLSAgICBpbnQgaTsKLQotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotCi0gICAgLyogV2luZG93cycgcmFuZCBpcyByb3R0ZW4sIHRoZSBmaXJzdCBnZW5lcmF0ZWQgdmFsdWUgYWZ0ZXIgdGhlIGluaXQKLSAgICBhYm92ZSBpcyBub3QgcmFuZG9tIGVub3VnaCwgc28gbGV0J3Mgc2hha2UgdGhpbmdzIGEgbGl0dGxlLi4uICovCi0KLSAgICBmb3IgKGk9MDsgaTwxMDA7IGkrKykgcmFuZCgpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgICAgTTRPU0FfRVJSIE00T1NBX3JhbmQoTTRPU0FfSW50MzIqIG91dF92YWx1ZSwgTTRPU0FfVUludDMyIG1heF92YWx1ZSkKLSAqIEBicmllZiAgICAgICBUaGlzIGZ1bmN0aW9uIGdpdmVzIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDEgYW5kIG1heF92YWx1ZQotICogICAgICAgICAgICAgICAoaW5jbHVzaXZlKSB3aXRoIGFwcHJveGltYXRlbHkgZXF1YWwgcHJvYmFiaWxpdHksIGFuZAotICogICAgICAgICAgICAgICByZXR1cm5zIHRoaXMgbnVtYmVyIGluIG91dF92YWx1ZS4gRm9yIGluc3RhbmNlLCBhIG1heF92YWx1ZQotICogICAgICAgICAgICAgb2YgNiB3aWxsIHNpbXVsYXRlIGEgZmFpciA2LXNpZGVkIGRpY2Ugcm9sbC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBvdXRfdmFsdWUgKE9VVCk6IG9uIHJldHVybiwgcG9pbnRzIHRvIHJhbmRvbSByZXN1bHQKLSAqIEBwYXJhbSAgICAgICBtYXhfdmFsdWUgKElOKTogbWF4IGV4cGVjdGVkIHZhbHVlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfcmFuZChNNE9TQV9JbnQzMiogb3V0X3ZhbHVlLCBNNE9TQV9VSW50MzIgbWF4X3ZhbHVlKQotewotICAgIGlmKCAob3V0X3ZhbHVlID09IE00T1NBX05VTEwpIHx8IChtYXhfdmFsdWUgPCAxKSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgICgqb3V0X3ZhbHVlKSA9IHJhbmQoKTsKLSAgICAvKiBub3RpY2UgdGhpcyBhbGdvcml0aG0gd2lsbCBvbmx5IHdvcmsgZm9yIG1heF92YWx1ZXMgc3VjaCB0aGF0IHRoZSBtdWx0aXBsaWNhdGlvbgotICAgIHdvbid0IG92ZXJmbG93LCB3aGljaCBtZWFucyB0aGF0IG1heF92YWx1ZSB0eXBpY2FsbHkgc2hvdWxkbid0IGdvIG92ZXIgdGhlIHJhbmdlIG9mCi0gICAgYW4gSW50MTYuICovCi0gICAgKCpvdXRfdmFsdWUpID0gKCgoKm91dF92YWx1ZSkgKiBtYXhfdmFsdWUpIC8gKChNNE9TQV9VSW50MzIpUkFORF9NQVggKyAxKSkgKyAxOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU2VtYXBob3JlLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TZW1hcGhvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNiNTg1Mi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TZW1hcGhvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9TZW1hcGhvcmUuYwotICogQGJyaWVmICAgICAgICBTZW1hcGhvcmUgZm9yIFdpbmRvd3MKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgc2VtYXBob3JlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotCi0jaW5jbHVkZSA8c2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotCi0vKiBDb250ZXh0IGZvciB0aGUgc2VtYXBob3JlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBNNE9TQV9VSW50MzIgICBjb3JlSUQ7ICAgICAvKiBzZW1hcGhvcmUgY29udGV4dCBpZGVudGlmaWFudCAqLwotICAgc2VtX3QgICAgICAgICAgc2VtYXBob3JlOyAgLyogc2VtYXBob3JlICovCi19IE00T1NBX1NlbWFwaG9yZUNvbnRleHQ7Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBzZW1hcGhvcmUgd2l0aCB0aGUgImluaXRpYWxDb3VudGVyIgotICogICAgICAgICAgICAgdmFsdWUuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIGFsbG9jYXRlcyBhIHVuaXF1ZSBjb250ZXh0LiBJdCdzIHRoZQotICogICAgICAgICAgICAgT1NBTCByZWFsIHRpbWUgcmVzcG9uc2liaWxpdHkgZm9yIG1hbmFnaW5nIGl0cyBjb250ZXh0LiBJdCBtdXN0Ci0gKiAgICAgICAgICAgICBiZSBmcmVlZCBieSB0aGUgTTRPU0Ffc2VtYXBob3JlQ2xvc2UgZnVuY3Rpb24uIFRoZSBjb250ZXh0Ci0gKiAgICAgICAgICAgICBwYXJhbWV0ZXIgd2lsbCBiZSBzZW50IGJhY2sgdG8gYW55IE9TQUwgY29yZSBzZW1hcGhvcmUgZnVuY3Rpb25zCi0gKiAgICAgICAgICAgICB0byBhbGxvdyByZXRyaWV2aW5nIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgb3BlbmVkIHNlbWFwaG9yZS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KE9VVCkgQ29udGV4dCBvZiB0aGUgY3JlYXRlZCBzZW1hcGhvcmUKLSAqIEBwYXJhbSAgICAgIGluaXRpYWxfY291bnQ6KElOKSBJbml0aWFsIGNvdW50ZXIgb2YgdGhlIHNlbWFwaG9yZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcHJvdmlkZWQgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRDogdGhlIGNvbnRleHQgY3JlYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZU9wZW4oTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpbml0aWFsX2NvdW50KQotewotICAgTTRPU0FfU2VtYXBob3JlQ29udGV4dCogc2VtYXBob3JlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zZW1hcGhvcmVPcGVuXHRcdE00T1NBX0NvbnRleHQqIDB4JXhcdE00T1NBX1VJbnQzMiAiCi0gICAgICAgICAgICAgICAgICAiJWQiLCBjb250ZXh0LCBpbml0aWFsX2NvdW50KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zZW1hcGhvcmVPcGVuIik7Ci0KLSAgICpjb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgc2VtYXBob3JlQ29udGV4dCA9IChNNE9TQV9TZW1hcGhvcmVDb250ZXh0KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9TZW1hcGhvcmVDb250ZXh0KSwgTTRPU0FfU0VNQVBIT1JFLAotICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0Ffc2VtYXBob3JlT3Blbjogc2VtYXBob3JlIGNvbnRleHQiKTsKLQotICAgaWYoc2VtYXBob3JlQ29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgewotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9zZW1hcGhvcmVPcGVuIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgIH0KLQotICAgaWYgKDAgIT0gc2VtX2luaXQoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSwgMCwgaW5pdGlhbF9jb3VudCkpCi0gICB7Ci0gICAgICBmcmVlKHNlbWFwaG9yZUNvbnRleHQpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9DT05URVhUX0ZBSUxFRCwKLSAgICAgICAgICJNNE9TQV9zZW1hcGhvcmVPcGVuOiBPUyBzZW1hcGhvcmUgY3JlYXRpb24gZmFpbGVkIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9DT05URVhUX0ZBSUxFRDsKLSAgIH0KLQotICAgc2VtYXBob3JlQ29udGV4dC0+Y29yZUlEID0gTTRPU0FfU0VNQVBIT1JFIDsKLSAgICpjb250ZXh0ID0gKE00T1NBX0NvbnRleHQpc2VtYXBob3JlQ29udGV4dDsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgZGVjcmVtZW50cyAob25lIGJ5IG9uZSkgdGhlIHNlbWFwaG9yZSBjb3VudGVyLiBUaGUKLSAqICAgICAgICAgICAgIHNlbWFwaG9yZSBpcyBpZGVudGlmaWVkIGJ5IGl0cyBjb250ZXh0IFRoaXMgY2FsbCBpcyBub3QgYmxvY2tpbmcKLSAqICAgICAgICAgICAgIGlmIHRoZSBzZW1hcGhvcmUgY291bnRlciBpcyBwb3NpdGl2ZSBvciB6ZXJvIChhZnRlcgotICogICAgICAgICAgICAgZGVjcmVtZW50YXRpb24pLiBUaGlzIGNhbGwgaXMgYmxvY2tpbmcgaWYgdGhlIHNlbWFwaG9yZSBjb3VudGVyCi0gKiAgICAgICAgICAgICBpcyBsZXNzIHRoYW4gemVybyAoYWZ0ZXIgZGVjcmVtZW50YXRpb24pLCB1bnRpbCB0aGUgc2VtYXBob3JlIGlzCi0gKiAgICAgICAgICAgICB1cHBlciB0aGFuIHplcm8gKHNlZSBNNE9TQV9zZW1hcGhvcmVQb3N0KSBvciB0aW1lX291dCBpcwotICogICAgICAgICAgICAgcmVhY2hlZC4KLSAqIEBub3RlICAgICAgIElmICJ0aW1lb3V0IiB2YWx1ZSBpcyBNNE9TQV9XQUlUX0ZPUkVWRVIsIHRoZSBjYWxsaW5nIHRocmVhZAotICogICAgICAgICAgICAgd2lsbCBibG9jayBpbmRlZmluaXRlbHkgdW50aWwgdGhlIHNlbWFwaG9yZSAgaXMgdW5sb2NrZWQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHNlbWFwaG9yZQotICogQHBhcmFtICAgICAgdGltZW91dDooSU4pIFRpbWUgb3V0IGluIG1pbGxpc2Vjb25kcwotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNFdBUl9USU1FX09VVDogdGltZSBvdXQgaXMgZWxhcHNlZCBiZWZvcmUgc2VtYXBob3JlIGhhcyBiZWVuCi0gKiAgICAgICAgICAgICBhdmFpbGFibGUuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlV2FpdChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX0ludDMyIHRpbWVvdXQpCi17Ci0gICBNNE9TQV9TZW1hcGhvcmVDb250ZXh0KiBzZW1hcGhvcmVDb250ZXh0ID0gKE00T1NBX1NlbWFwaG9yZUNvbnRleHQqKWNvbnRleHQ7Ci0gICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICB0czsKLSAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgIGxlZnQ7Ci0gICBpbnQgICAgICAgICAgICAgICAgICAgICByZXN1bHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zZW1hcGhvcmVXYWl0XHRcdE00T1NBX0NvbnRleHQgMHgleFx0TTRPU0FfVUludDMyICVkIiwKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIHRpbWVvdXQpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3NlbWFwaG9yZVdhaXQiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHNlbWFwaG9yZUNvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9TRU1BUEhPUkUsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9zZW1hcGhvcmVXYWl0Iik7Ci0KLSAgIGlmICggKE00T1NBX0ludDMyKU00T1NBX1dBSVRfRk9SRVZFUiA9PSB0aW1lb3V0KQotICAgewotICAgICAgIGlmICggMCAhPSBzZW1fd2FpdCgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKSApCi0gICAgICAgewotICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9zZW1hcGhvcmVXYWl0OiBPUyBzZW1hcGhvcmUgd2FpdCBmYWlsZWQiKTsKLQotICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQgOwotICAgICAgIH0KLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgICByZXN1bHQgPSBzZW1fdHJ5d2FpdCgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKTsKLSAgICAgICB3aGlsZSAoICgoRUJVU1kgPT0gcmVzdWx0KSB8fCAoRUFHQUlOID09IHJlc3VsdCkpICYmICggMCA8IHRpbWVvdXQgKSApCi0gICAgICAgewotICAgICAgICAgICB0cy50dl9zZWMgID0gMDsKLSAgICAgICAgICAgaWYgKDEgPD0gdGltZW91dCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgdHMudHZfbnNlYyA9IDEwMDAwMDA7Ci0gICAgICAgICAgICAgICB0aW1lb3V0IC09IDE7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB0cy50dl9uc2VjID0gdGltZW91dCAqIDEwMDAwMDA7Ci0gICAgICAgICAgICAgICB0aW1lb3V0ID0gMDsKLSAgICAgICAgICAgfQotICAgICAgICAgICBuYW5vc2xlZXAoJnRzLCAmbGVmdCk7Ci0gICAgICAgICAgIHJlc3VsdCA9IHNlbV90cnl3YWl0KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUpOwotICAgICAgIH0KLSAgICAgICBpZiAoMCAhPSByZXN1bHQpCi0gICAgICAgewotICAgICAgICAgICBpZiAoKEVCVVNZID09IHJlc3VsdCkgfHwgKEVBR0FJTiA9PSByZXN1bHQpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfVElNRV9PVVQ7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3NlbWFwaG9yZVdhaXQ6IE9TIHNlbWFwaG9yZSB3YWl0IGZhaWxlZCIpOwotICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgfQotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGluY3JlbWVudHMgdGhlIHNlbWFwaG9yZSBjb3VudGVyLiBUaGUgc2VtYXBob3JlIGlzCi0gKiAgICAgICAgICAgICBpZGVudGlmaWVkIGJ5IGl0cyBjb250ZXh0Ci0gKiBAbm90ZSAgICAgICBJZiB0aGUgc2VtYXBob3JlIGNvdW50ZXIgaXMgdXBwZXIgdGhhbiB6ZXJvIChhZnRlciBhZGRpdGlvbiksCi0gKiAgICAgICAgICAgICB0aGUgTTRPU0Ffc2VtYXBob3JlV2FpdCBjYWxsIG9mIHRoZSB0aHJlYWQgd2l0aCB0aGUgaGlnaGVzdAotICogICAgICAgICAgICAgcHJpb3JpdHkgaXMgdW5ibG9ja2VkIGFuZCBtYWRlIHJlYWR5IHRvIHJ1bi4KLSAqIEBub3RlICAgICAgIE5vIGh5cG90aGVzZXMgY2FuIGJlIG1hZGUgb24gd2hpY2ggdGhyZWFkIHdpbGwgYmUgdW5ibG9ja2VkCi0gKiAgICAgICAgICAgICBiZXR3ZWVuIHRocmVhZHMgd2l0aCB0aGUgc2FtZSBwcmlvcml0eS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgc2VtYXBob3JlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZVBvc3QoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgTTRPU0FfU2VtYXBob3JlQ29udGV4dCogc2VtYXBob3JlQ29udGV4dCA9IChNNE9TQV9TZW1hcGhvcmVDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMSgiTTRPU0Ffc2VtYXBob3JlUG9zdFx0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zZW1hcGhvcmVQb3N0Iik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihzZW1hcGhvcmVDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfU0VNQVBIT1JFLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0Ffc2VtYXBob3JlUG9zdCIpOwotCi0gICBzZW1fcG9zdCgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBkZWxldGVzIGEgc2VtYXBob3JlIChpZGVudGlmeSBieSBpdHMgY29udGV4dCkuCi0gKiAgICAgICAgICAgICBBZnRlciB0aGlzIGNhbGwgdGhlIHNlbWFwaG9yZSBhbmQgaXRzIGNvbnRleHQgaXMgbm8gbW9yZQotICogICAgICAgICAgICAgdXNlYWJsZS4gVGhpcyBmdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yeSByZWxhdGVkIHRvIHRoaXMKLSAqICAgICAgICAgICAgIHNlbWFwaG9yZS4KLSAqIEBub3RlICAgICAgIEl0IGlzIGFuIGFwcGxpY2F0aW9uIGlzc3VlIHRvIHdhcnJhbnQgbm8gbW9yZSB0aHJlYWRzIGFyZSBsb2NrZWQKLSAqICAgICAgICAgICAgIG9uIHRoZSBkZWxldGVkIHNlbWFwaG9yZS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgc2VtYXBob3JlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVDbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICBNNE9TQV9TZW1hcGhvcmVDb250ZXh0KiBzZW1hcGhvcmVDb250ZXh0ID0gKE00T1NBX1NlbWFwaG9yZUNvbnRleHQqKWNvbnRleHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9zZW1hcGhvcmVDbG9zZVx0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zZW1hcGhvcmVDbG9zZSIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoc2VtYXBob3JlQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1NFTUFQSE9SRSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3NlbWFwaG9yZUNsb3NlIik7Ci0KLSAgIHNlbV9kZXN0cm95KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUpOwotCi0gICBmcmVlKHNlbWFwaG9yZUNvbnRleHQpOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9UaHJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI1NDI0NS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9UaHJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDc5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX1RocmVhZC5jCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgSW1wbGVtZW50cyBhbmQgbWFuaXB1bGF0ZSB0aHJlYWRzCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHRocmVhZHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1RocmVhZC5oIgotI2luY2x1ZGUgIk00T1NBX1RocmVhZF9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotCi0KLXZvaWQqIE00T1NBX3RocmVhZFN5bmNGb3JFdmVyRG8odm9pZCAqY29udGV4dCkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLSAgIE00T1NBX0Jvb2wgYXV0b19raWxsID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKgotICAgICAgIE00T1NBX1ZvaWQqIHVzZXJEYXRhOwotICAgICovCi0KLSAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV90aHJlYWRTeW5jRm9yRXZlckRvXHRcdExQVk9JRCAweCV4IiwgY29udGV4dCk7Ci0KLSAgICAvKgotICAgICAgIHVzZXJEYXRhID0gdGhyZWFkQ29udGV4dC0+dXNlckRhdGE7Ci0gICAgKi8KLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkUnVubmluZzsKLQotICAgTTRPU0Ffc2VtYXBob3JlUG9zdCh0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3ApOwotCi0gICB3aGlsZSh0aHJlYWRDb250ZXh0LT5zdGF0ZSA9PSBNNE9TQV9rVGhyZWFkUnVubmluZykKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBpZigodGhyZWFkQ29udGV4dC0+ZnVuYyh0aHJlYWRDb250ZXh0LT5wYXJhbSkpICE9IE00Tk9fRVJST1IpCi0gICAgICB7Ci0gICAgICAgICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgICAgICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgPT0gTTRPU0Ffa1RocmVhZFJ1bm5pbmcpCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8vUFIgMjM1NCAtIEFDTyA6IFN1cHByZXNzIHN0b3BwaW5nIHN0YXRlIGFuZCBkb24ndAotICAgICAgICAgICAgLy8gICAgICAgICB1bmxvY2sgbXV0ZXggYmVmb3JlIGNsb3NpbmcgdGhlIHRocmVhZAotICAgICAgICAgICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkT3BlbmVkOwotICAgICAgICAgICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgIH0KLQotICAgICAgICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0gICAgICB9Ci0KLSAgICAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotICAgfQotCi0KLSAgIE00T1NBX3NlbWFwaG9yZVBvc3QodGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wKTsKLQotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotCi0gICByZXR1cm4gMDsKLX0KLQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IHRocmVhZC4gQWZ0ZXIgdGhpcyBjYWxsIHRoZSB0aHJlYWQgaXMKLSAqICAgICAgICAgICAgIGlkZW50aWZpZWQgYnkgaXRzICJjb250ZXh0Ii4gVGhlIHRocmVhZCBmdW5jdGlvbiBpcyBwcm92aWRlZCBieQotICogICAgICAgICAgICAgdGhlICJmdW5jIiBwYXJhbWV0ZXIuIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyAmIGFsbG9jYXRlcyBhIHVuaXF1ZQotICogICAgICAgICAgICAgY29udGV4dC4gSXQncyB0aGUgT1NBTCByZWFsIHRpbWUgcmVzcG9uc2liaWxpdHkgZm9yIG1hbmFnaW5nIGl0cwotICogICAgICAgICAgICAgY29udGV4dC4gSXQgbXVzdCBiZSBmcmVlZCBieSB0aGUgTTRPU0FfdGhyZWFkU3luY0Nsb3NlIGZ1bmN0aW9uLgotICogICAgICAgICAgICAgVGhlIGNvbnRleHQgcGFyYW1ldGVyIHdpbGwgYmUgc2VudCBiYWNrIHRvIGFueSBPU0FMIGNvcmUgdGhyZWFkCi0gKiAgICAgICAgICAgICBmdW5jdGlvbnMgdG8gYWxsb3cgcmV0cmlldmluZyBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIG9wZW5lZAotICogICAgICAgICAgICAgdGhyZWFkLgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSB0aHJlYWQsIGJ1dCB0aGUgdGhyZWFkIGlzIG5vdCBydW5uaW5nLgotICogQG5vdGUgICAgICAgT25jZSB0aGUgdGhyZWFkIGlzIGNyZWF0ZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkT3BlbmVkLgotICogQHBhcmFtICAgICAgY29udGV4dDooT1VUKSBDb250ZXh0IG9mIHRoZSBjcmVhdGVkIHRocmVhZAotICogQHBhcmFtICAgICAgZnVuYzooSU4pICJkb0l0IiBmdW5jdGlvbiBwb2ludGVyIHRvIHJ1bgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRDogdGhlIGNvbnRleHQgY3JlYXRpb24gZmFpbGVkCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jT3BlbihNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZERvSXQgZnVuYykKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfdGhyZWFkU3luY09wZW5cdFx0TTRPU0FfQ29udGV4dCogMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX1RocmVhZERvSXQgMHgleCIsIGNvbnRleHQsIGZ1bmMpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNPcGVuIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihmdW5jID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNPcGVuIik7Ci0KLSAgICpjb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgdGhyZWFkQ29udGV4dCA9Ci0gICAgICAoTTRPU0FfVGhyZWFkQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9UaHJlYWRDb250ZXh0KSwKLSAgICAgIE00T1NBX1RIUkVBRCwgKE00T1NBX0NoYXIqKSJNNE9TQV90aHJlYWRTeW5jT3BlbjogdGhyZWFkIGNvbnRleHQiKTsKLQotICAgaWYodGhyZWFkQ29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgewotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV90aHJlYWRTeW5jT3BlbiIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPmZ1bmMgPSBmdW5jOwotICAgdGhyZWFkQ29udGV4dC0+c3RhY2tTaXplID0gNjQgKiAxMDI0OwotICAgdGhyZWFkQ29udGV4dC0+bmFtZSA9IE00T1NBX05VTEw7Ci0gICB0aHJlYWRDb250ZXh0LT50aHJlYWRJRCA9IDA7Ci0gICB0aHJlYWRDb250ZXh0LT5jb3JlSUQgPSBNNE9TQV9USFJFQUQ7Ci0gICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRPcGVuZWQ7Ci0gICB0aHJlYWRDb250ZXh0LT5wcmlvcml0eSA9IE00T1NBX2tUaHJlYWROb3JtYWxQcmlvcml0eSA7Ci0KLSAgIGVycl9jb2RlID0gTTRPU0FfbXV0ZXhPcGVuKCYodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCkpOwotCi0gICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgewotICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jT3BlbjogTTRPU0FfbXV0ZXhPcGVuIik7Ci0KLSAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgIH0KLQotICAgZXJyX2NvZGUgPSBNNE9TQV9zZW1hcGhvcmVPcGVuKCYodGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wKSwgMCk7Ci0KLSAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSkpCi0gICB7Ci0gICAgICBNNE9TQV9ERUJVRyhlcnJfY29kZSwgIk00T1NBX3RocmVhZFN5bmNPcGVuOiBNNE9TQV9zZW1hcGhvcmVPcGVuIik7Ci0KLSAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgIH0KLQotICAgKmNvbnRleHQgPSB0aHJlYWRDb250ZXh0OwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIHJ1bnMgYSBzcGVjaWZpZWQgdGhyZWFkLiBUaGUgInBhcmFtIiBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gc2V0IGEgc3BlY2lmaWMgcGFyYW1ldGVyIHRvIHRoZQotICogICAgICAgICAgICAgY3JlYXRlZCB0aHJlYWQuIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgdXNlZCBhcyB0aGUgc2Vjb25kIG9uZSBvZgotICogICAgICAgICAgICAgdGhlICJNNE9TQV9UaHJlYWREb0l0IiBmdW5jdGlvbi4KLSAqIEBub3RlICAgICAgIFRoaXMgbWV0aG9kIGlzIGEgYmxvY2tpbmcgdXAgdG8gdGhlIHRocmVhZCBpcyBydW5uaW5nLgotICogICAgICAgICAgICAgQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkT3BlbmVkLgotICogICAgICAgICAgICAgT25jZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRTdGFydGluZy4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIHRocmVhZCBpcyBydW5uaW5nLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZFJ1bm5pbmcuCi0gKiBAbm90ZSAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGltbWVkaWF0ZWx5LiBJZiB0aGUgInRocmVhZFN0YXJ0ZWQiIG9wdGlvbklECi0gKiAgICAgICAgICAgICBpcyBub3QgTlVMTCwgdGhlIHRocmVhZCB3aWxsIGNhbGwgaXQgYmVmb3JlIHJ1bm5pbmcgdGhlIGRvSXQKLSAqICAgICAgICAgICAgIGZ1bmN0aW9uLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKLSAqIEBwYXJhbSAgICAgIHBhcmFtOihJTikgQXBwbGljYXRpb24gZGF0YSB0aHJlYWQgcGFyYW1ldGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfU1RBVEU6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gICAgIE00RVJSX1RIUkVBRF9OT1RfU1RBUlRFRDogdGhlIHRocmVhZCBkaWQgbm90IHN0YXJ0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNTdGFydChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBhcmFtKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9ICAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLSAgIHB0aHJlYWRfYXR0cl90ICAgICBhdHRyaWJ1dGUgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKLSAgIGludCAgICAgICAgICAgICAgICBtaW4gICAgICAgPSAwOwotICAgaW50ICAgICAgICAgICAgICAgIG1heCAgICAgICA9IDA7Ci0gICBpbnQgICAgICAgICAgICAgICAgcHJpb3JpdHkgID0gMDsKLSAgIHN0cnVjdCBzY2hlZF9wYXJhbSBzY2hlZCAgICAgPSB7IDAgfTsKLQotICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNTdGFydFx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdE00T1NBX1ZvaWQqICIKLSAgICAgICAgICAgICAgICAgICIweCV4IiwgY29udGV4dCwgcGFyYW0pOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOwotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZE9wZW5lZCkKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVEFURSwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZFN0YXJ0aW5nOwotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLSAgIHRocmVhZENvbnRleHQtPnBhcmFtID0gcGFyYW07Ci0KLSAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfaW5pdCggJmF0dHJpYnV0ZSApICkKLSAgIHsKLSAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoICZhdHRyaWJ1dGUsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEICkgKQotICAgICAgewotICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoICZhdHRyaWJ1dGUsIChzaXplX3QpdGhyZWFkQ29udGV4dC0+c3RhY2tTaXplICkgKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSggJmF0dHJpYnV0ZSwgU0NIRURfT1RIRVIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVGVudGF0aXZlIHBhdGNoZXMgdG8gaGFuZGxlIHByaW9yaXRpZXMgaW4gYSBiZXR0ZXIgd2F5IDogKi8KLSAgICAgICAgICAgICAgICAvKiBVc2UgQW5kcm9pZCdzIHByZWRlZmluZWQgcHJpb3JpdGllcyAocmFuZ2UgKzE5Li4tMjApCi0gICAgICAgICAgICAgICAgICpyYXRoZXIgdGhhbiBMaW51eCBvbmVzICgwLi45OSkqLwotCi0gICAgICAgICAgICAgICAgLyogR2V0IG1pbiBhbmQgbWF4IHByaW9yaXRpZXMgKi8KLSAgICAgICAgICAgICAgICBtaW4gPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKCBTQ0hFRF9GSUZPICk7Ci0gICAgICAgICAgICAgICAgbWF4ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heCggU0NIRURfRklGTyApOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNTdGFydCBNQVg9JWQgTUlOPSVkIiwgbWF4LCBtaW4pOwotCi0gICAgICAgICAgICAgICAgLyogdGVudGF0aXZlIG1vZGlmaWNhdGlvbiBvZiB0aGUgcHJpb3JpdGllcyAqLwotICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgcHJpb3JpdHkgYmFzZWQgb24gZGVmYXVsdCBhbmRyb2lkIHByaW9yaXRpZXMgKi8KLSAgICAgICAgICAgICAgICAvKiBUaGlzIHByb2JhYmx5IHJlcXVpcmVzIHNvbWUgbW9yZSB0dW5pbmcsCi0gICAgICAgICAgICAgICAgICogb3V0Y29tZSBvZiB0aGlzIHByaW9yaXR5IHNldHRpbmdzIGFyZSBub3QgeWV0IHNhdGlzZmFjdG9yeSAqLwotICAgICAgICAgICAgICAgIC8qIEltcGxlbWVudGluZyB0aHJlYWQgaGFuZGxpbmcgYmFzZWQgb24gQW5kcm9pZCdzIHRocmVhZCBjcmVhdGlvbgotICAgICAgICAgICAgICAgICAqIGhlbHBlcnMgbWlnaHQgYnJpbmcgc29tZSBpbXByb3ZlbWVudCAoc2VlIHRocmVhZHMuaCkgKi8KLSAgICAgICAgICAgICAgICBzd2l0Y2godGhyZWFkQ29udGV4dC0+cHJpb3JpdHkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZExvd2VzdFByaW9yaXR5OgotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IEFORFJPSURfUFJJT1JJVFlfTk9STUFMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRMb3dQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX0RJU1BMQVk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZE5vcm1hbFByaW9yaXR5OgotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0RJU1BMQVk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZEhpZ2hQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX0FVRElPOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRIaWdoZXN0UHJpb3JpdHk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU87Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzY2hlZC5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5OwotCi0gICAgICAgICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtKCAmYXR0cmlidXRlLCAmc2NoZWQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIDAgPT0gcHRocmVhZF9jcmVhdGUoICZ0aHJlYWRDb250ZXh0LT50aHJlYWRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNNE9TQV90aHJlYWRTeW5jRm9yRXZlckRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopdGhyZWFkQ29udGV4dCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBNNE9TQV9GQUxTRSA9PSBNNE9TQV9FUlJfSVNfRVJST1IoIE00T1NBX3NlbWFwaG9yZVdhaXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfV0FJVF9GT1JFVkVSICkgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSggJmF0dHJpYnV0ZSApOwotICAgfQotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkT3BlbmVkOwotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgTTRPU0FfREVCVUcoTTRFUlJfVEhSRUFEX05PVF9TVEFSVEVELCAiTTRPU0FfdGhyZWFkU3luY1N0YXJ0Iik7Ci0KLSAgIHJldHVybiBNNEVSUl9USFJFQURfTk9UX1NUQVJURUQ7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2Qgc3RvcHMgYSBzcGVjaWZpZWQgdGhyZWFkLgotICogQG5vdGUgICAgICAgVGhpcyBjYWxsIGlzIGEgYmxvY2tpbmcgb25lIHVwIHRvIHRoZSAiTTRPU0FfVGhyZWFkRG9JdCIKLSAqICAgICAgICAgICAgIGZ1bmN0aW9uIGhhcyByZXR1cm5lZC4KLSAqICAgICAgICAgICAgIEJlZm9yZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRSdW5uaW5nLgotICogICAgICAgICAgICAgT25jZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRTdG9wcGluZy4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIHRocmVhZCBpcyBzdG9wcGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KLSAqIEBub3RlICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgb25jZSB0aGUgdGhyZWFkIGhhcyBiZWVuIHN0b3BwZWQuIElmIHRoZQotICogICAgICAgICAgICAgInRocmVhZFN0b3BwZWQiIG9wdGlvbklEIGlzIG5vdCBOVUxMLCB0aGUgdGhyZWFkIHdpbGwgY2FsbCBpdAotICogICAgICAgICAgICAgYmVmb3JlIGR5aW5nLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfU1RBVEU6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RvcChNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV90aHJlYWRTeW5jU3RvcFx0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jU3RvcCIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNTdG9wIik7Ci0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICBpZih0aHJlYWRDb250ZXh0LT5zdGF0ZSAhPSBNNE9TQV9rVGhyZWFkUnVubmluZykKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVEFURSwgIk00T1NBX3RocmVhZFN5bmNTdG9wIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgIH0KLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkU3RvcHBpbmc7Ci0KLSAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICBNNE9TQV9zZW1hcGhvcmVXYWl0KHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZE9wZW5lZDsKLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGRlbGV0ZXMgYSB0aHJlYWQgKGlkZW50aWZpZWQgYnkgaXRzIGNvbnRleHQpLiBBZnRlcgotICogICAgICAgICAgICAgdGhpcyBjYWxsIHRoZSB0aHJlYWQgYW5kIGl0cyBjb250ZXh0IGFyZSBubyBtb3JlIHVzZWFibGUuIFRoaXMKLSAqICAgICAgICAgICAgIGZ1bmN0aW9uIGZyZWVzIGFsbCB0aGUgbWVtb3J5IHJlbGF0ZWQgdG8gdGhpcyB0aHJlYWQuCi0gKiBAbm90ZSAgICAgICBCZWZvcmUgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkT3BlbmVkLgotICogICAgICAgICAgICAgT25jZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRDbG9zZWQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9TVEFURTogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNDbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV90aHJlYWRTeW5jQ2xvc2VcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5zdGF0ZSA9PSBNNE9TQV9rVGhyZWFkQ2xvc2VkLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlIik7Ci0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICBpZih0aHJlYWRDb250ZXh0LT5zdGF0ZSAhPSBNNE9TQV9rVGhyZWFkT3BlbmVkKQotICAgewotICAgICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUQVRFLCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgIH0KLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkQ2xvc2VkOwotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgZXJyX2NvZGUgPSBNNE9TQV9tdXRleENsb3NlKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgewotICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jQ2xvc2U6IE00T1NBX211dGV4Q2xvc2UiKTsKLQotICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgfQotCi0gICBlcnJfY29kZSA9IE00T1NBX3NlbWFwaG9yZUNsb3NlKHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCk7Ci0KLSAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSkpCi0gICB7Ci0gICAgICBNNE9TQV9ERUJVRyhlcnJfY29kZSwgIk00T1NBX3RocmVhZFN5bmNDbG9zZTogTTRPU0Ffc2VtYXBob3JlQ2xvc2UiKTsKLQotICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgfQotCi0gICBpZih0aHJlYWRDb250ZXh0LT5uYW1lICE9IE00T1NBX05VTEwpCi0gICB7Ci0gICAgICBmcmVlKHRocmVhZENvbnRleHQtPm5hbWUpOwotICAgfQotCi0gICBmcmVlKHRocmVhZENvbnRleHQpOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSB0aHJlYWQgdG8gcmV0dXJuIGl0cyBzdGF0ZS4KLSAqIEBub3RlICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGVhbGxvY2F0aW5nIHRoZSBzdGF0ZQotICogICAgICAgICAgICAgZmllbGQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTikgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcGFyYW0gICAgICBzdGF0ZTooT1VUKSBUaHJlYWQgc3RhdGUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZFN0YXRlKiBzdGF0ZSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLQotICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZVx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9UaHJlYWRTdGF0ZSogMHgleCIsIGNvbnRleHQsIHN0YXRlKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHN0YXRlID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlIik7Ci0KLSAgICpzdGF0ZSA9IHRocmVhZENvbnRleHQtPnN0YXRlOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjYWxsaW5nIHRocmVhZCB0byBzbGVlcCBkdXJpbmcgInRpbWVTbGVlcCIKLSAqICAgICAgICAgICAgIG1pbGxpc2Vjb25kcy4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgICAgIHRpbWU6KElOKSBUaW1lIHRvIHNsZWVwIGluIG1pbGxpc2Vjb25kcwotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU2xlZXAoTTRPU0FfVUludDMyIHRpbWUpCi17Ci0gICBzdHJ1Y3QgdGltZXNwZWMgcnF0cCA9IHsgMCwgMCB9OwotICAgc3RydWN0IHRpbWVzcGVjIHJtdHAgPSB7IDAsIDAgfTsKLQotICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3RocmVhZFNsZWVwXHRcdE00T1NBX1VJbnQzMiAlZCIsIHRpbWUpOwotCi0gICBycXRwLnR2X3NlYyA9ICh0aW1lX3QpdGltZS8xMDAwOwotICAgcnF0cC50dl9uc2VjID0gKHRpbWUlMTAwMCkgKiAxMDAwMDAwOwotICAgbmFub3NsZWVwKCZycXRwLCAmcm10cCk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZID09IE00T1NBX1RSVUUpCi0KLU00T1NBX0VSUiBNNE9TQV9TZXRUaHJlYWRTeW5jUHJpb3JpdHkoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsIHByaW9yaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsKShvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9TZXRUaHJlYWRTeW5jUHJpb3JpdHlcdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfRGF0YU9wdGlvbiAweCV4IiwgY29udGV4dCwgb3B0aW9uVmFsdWUpOwotCi0gICBpZigoTTRPU0FfVUludDMyKW9wdGlvblZhbHVlPk00T1NBX2tUaHJlYWRMb3dlc3RQcmlvcml0eSkKLSAgIHsKLSAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnByaW9yaXR5ID0gcHJpb3JpdHk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkqLwotCi0KLQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgPT0gTTRPU0FfVFJVRSkKLQotTTRPU0FfRVJSIE00T1NBX1NldFRocmVhZFN5bmNOYW1lKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9DaGFyKiBuYW1lID0gKE00T1NBX0NoYXIqKW9wdGlvblZhbHVlOwotICAgTTRPU0FfVUludDMyIG5hbWVTaXplIDsKLQotICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNOYW1lXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+bmFtZSAhPSBOVUxMKQotICAgewotICAgICAgZnJlZSh0aHJlYWRDb250ZXh0LT5uYW1lKTsKLSAgICAgIHRocmVhZENvbnRleHQtPm5hbWUgPSBNNE9TQV9OVUxMOwotICAgfQotCi0gICBpZihvcHRpb25WYWx1ZSAhPSBNNE9TQV9OVUxMKQotICAgewotICAgICAgbmFtZVNpemUgPSBzdHJsZW4oKGNvbnN0IGNoYXIgKiluYW1lKSsxOwotCi0gICAgICB0aHJlYWRDb250ZXh0LT5uYW1lID0KLSAgICAgICAgIChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmFtZVNpemUsIE00T1NBX1RIUkVBRCwKLSAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0FfU2V0VGhyZWFkU3luY05hbWU6IHRocmVhZCBuYW1lIik7Ci0KLSAgICAgIGlmKHRocmVhZENvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgIH0KLQotICAgICAgbWVtY3B5KCh2b2lkICopdGhyZWFkQ29udGV4dC0+bmFtZSwgKHZvaWQgKiluYW1lLAotICAgICAgICAgICAgICAgICAgIG5hbWVTaXplKTsKLSAgIH0KLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FKi8KLQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgPT0gTTRPU0FfVFJVRSkKLQotTTRPU0FfRVJSIE00T1NBX1NldFRocmVhZFN5bmNTdGFja1NpemUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfU2V0VGhyZWFkU3luY1N0YWNrU2l6ZVx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9EYXRhT3B0aW9uIDB4JXgiLCBjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YWNrU2l6ZSA9IChNNE9TQV9VSW50MzIpb3B0aW9uVmFsdWU7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBPU0FMLVRocmVhZCBjb21wb25lbnQgdG8gc2V0IHRoZSB2YWx1ZQotICogICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKLSAqICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGVhbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBvZiBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0gKiAgICAgICAgICAgICAidmFsdWUiIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weSB0aGlzIGZpZWxkIHRvIGl0cyBpbnRlcm5hbAotICogICAgICAgICAgICAgdmFyaWFibGUuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHBhcmFtICAgICAgb3B0aW9uSUQ6KElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICBvcHRpb25WYWx1ZTooSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9TVEFURTogdGhpcyBvcHRpb24gaXMgbm90IGF2YWlsYWJsZSBub3cKLSAqIEByZXR1cm4gICAgIE00RVJSX1JFQURfT05MWTogdGhpcyBvcHRpb24gaXMgYSByZWFkIG9ubHkgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLSAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb25cdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfT3B0aW9uSUQgJWRcdE00T1NBX0RhdGFPcHRpb24gMHgleCIsCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9USFJFQUQpLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9SRUFEX09OTFksICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlICE9IE00T1NBX2tUaHJlYWRPcGVuZWQpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RBVEUsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgIH0KLQotICAgc3dpdGNoKG9wdGlvbklEKQotICAgewotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZFByaW9yaXR5OgotICAgICAgewotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jUHJpb3JpdHkoY29udGV4dCwgb3B0aW9uVmFsdWUpOwotCi0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWROYW1lOgotICAgICAgewotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jTmFtZShjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgPT0gTTRPU0FfVFJVRSkKLSAgICAgIGNhc2UgTTRPU0FfVGhyZWFkU3RhY2tTaXplOgotICAgICAgewotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jU3RhY2tTaXplKGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSovCi0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgICAgICAgIGVycl9jb2RlID0gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgfQotICAgfQotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgcmV0dXJuIGVycl9jb2RlOwotfQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBPU0FMLVRocmVhZCB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQKLSAqICAgICAgICAgICAgIHdpdGggdGhlIG9wdGlvbklELiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogICAgICAgICAgICAgYWxsb2NhdGluZy9kZWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICAib3B0aW9uVmFsdWUiIG11c3QgYmUgY2FzdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgcmVsYXRlZCB0byB0aGUKLSAqICAgICAgICAgICAgIG9wdGlvbklELgotICogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGUtYWxsb2NhdGluZyB0aGUgInZhbHVlIgotICogICAgICAgICAgICAgZmllbGQsIHRoZSBjb3JlIE9TQUwtVGhyZWFkIGNvbXBvbmVudCBtdXN0IHBlcmZvcm0gYSBjb3B5IG9mIGl0cwotICogICAgICAgICAgICAgaW50ZXJuYWwgdmFsdWUgdG8gdGhlIHZhbHVlIGZpZWxkLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4pIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHBhcmFtICAgICAgb3B0aW9uSUQ6KElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICBvcHRpb25WYWx1ZTooT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfV1JJVEVfT05MWTogdGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvblx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9PcHRpb25JRCAlZFx0TTRPU0FfRGF0YU9wdGlvbiogMHgleCIsCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIob3B0aW9uVmFsdWUgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX1RIUkVBRCksCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfUkVBREFCTEUob3B0aW9uSUQpLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1dSSVRFX09OTFksICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIHN3aXRjaChvcHRpb25JRCkKLSAgIHsKLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWRQcmlvcml0eToKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX1RocmVhZFByaW9yaXR5TGV2ZWwqIHByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsKilvcHRpb25WYWx1ZTsKLQotICAgICAgICAgKnByaW9yaXR5ID0gdGhyZWFkQ29udGV4dC0+cHJpb3JpdHk7Ci0KLSAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZKi8KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZE5hbWU6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9DaGFyKiogbmFtZSA9IChNNE9TQV9DaGFyKiopb3B0aW9uVmFsdWU7Ci0KLSAgICAgICAgICpuYW1lID0gdGhyZWFkQ29udGV4dC0+bmFtZTsKLQotICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWRTdGFja1NpemU6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9VSW50MzIqIHN0YWNrU2l6ZSA9IChNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlOwotCi0gICAgICAgICAqc3RhY2tTaXplID0gdGhyZWFkQ29udGV4dC0+c3RhY2tTaXplOwotCi0gICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFKi8KLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfRGVidWdUcmFjZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfRGVidWdUcmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZmNiYTk0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX0RlYnVnVHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICBNNFBTV19EZWJ1Z1RyYWNlLmMKLSAqIEBicmllZiAgICAgIERlZmF1bHQgdHJhY2UgZnVuY3Rpb24gZm9yIGRlYnVnZ2luZyBtYWNyb3MKLSAqIEBub3RlICAgICAgIFRoaXMgZmlsZSBnaXZlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhY2UgZnVuY3Rpb24KLSAqICAgICAgICAgICAgIHVzZWQgaW4gdGhlIGRlYnVnIGluc3RydW1lbnRhdGlvbiBtYWNyb3MsIGJhc2VkIG9uIHByaW50Zi4KLSAqICAgICAgICAgICAgIEFwcGxpY2F0aW9uIHdyaXRlcnMgYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gaW1wbGVtZW50IHRoZWlyCi0gKiAgICAgICAgICAgICBvd24gIk00T1NBX0RlYnVnVHJhY2UiLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4gLypmb3IgcHJpbnRmICovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qI2RlZmluZSBOT19GSUxFICovIC8qIHN1cHByZXNzZXMgdGhlIGZpbGUgbmFtZSBwcmludCBvdXQgKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHZvaWQgTTRPU0FfRGVidWdUcmFjZShNNE9TQV9JbnQzMiBsaW5lLCBjaGFyKiBmaWxlLCBNNE9TQV9JbnQzMiBsZXZlbCwKLSAqICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBjb25kLCBjaGFyKiBtc2csIE00T1NBX0VSUiBlcnIpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSB0cmFjZSBmb3IgZGVidWcgdGVzdHMKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgY2FsbGVkIGluIHRoZSBkZWJ1ZyBtYWNyb3Mgb25seS4KLSAqICAgICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHByaW50Zi4KLSAqIEBwYXJhbSAgICBsaW5lIChJTik6IHRoZSBsaW5lIG51bWJlciBpbiB0aGUgc291cmNlIGZpbGUKLSAqIEBwYXJhbSAgICBmaWxlIChJTik6IHRoZSBzb3VyY2UgZmlsZSBuYW1lCi0gKiBAcGFyYW0gICAgbGV2ZWwgKElOKTogdGhlIGRlYnVnIGxldmVsCi0gKiBAcGFyYW0gICAgbXNnIChJTik6IHRoZSBlcnJvciBtZXNzYWdlCi0gKiBAcGFyYW0gICAgZXJyIChJTik6IHRoZSByZXR1cm4gdmFsdWUgKGVycm9yIGNvZGUpCi0gKiBAcmV0dXJuICAgIG5vbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBTF9UUkFDRV9FWFBPUlRfVFlQRSB2b2lkIE00T1NBX0RlYnVnVHJhY2UoTTRPU0FfSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSIGVycikKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgLyogdHJ5IHRvICJpbmRlbnQiIHRoZSByZXN1bHRpbmcgdHJhY2VzIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgKi8KLSAgICBmb3IgKGkgPTAgOyBpIDwgbGV2ZWw7IGkgKyspCi0gICAgewotICAgICAgICBwcmludGYoIiAiKTsKLSAgICB9Ci0KLSNpZmRlZiBOT19GSUxFCi0gICAgcHJpbnRmKCJFcnJvcjogJWxpLCBvbiAlczogJXNcbiIsZXJyLGNvbmQsbXNnKTsKLSNlbHNlIC8qIE5PX0ZJTEUgICAgICovCi0gICAgcHJpbnRmKCJFcnJvcjogJWxpLCBvbiAlczogJXMgTGluZSAlbHUgaW46ICVzXG4iLGVycixjb25kLG1zZyxsaW5lLGZpbGUpOwotI2VuZGlmIC8qIE5PX0ZJTEUgICAgICovCi0KLX0KLQotTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFIE00T1NBX1ZvaWQgTTRPU0FfREVCVUdfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nQ29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlIgcmV0dXJuZWRFcnJvcikKLXsKLSAgICBNNE9TQV9EZWJ1Z1RyYWNlKGxpbmUsIGZpbGVOYW1lLCBsZXZlbCwgc3RyaW5nQ29uZGl0aW9uLCBtZXNzYWdlLCByZXR1cm5lZEVycm9yKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfTWVtb3J5SW50ZXJmYWNlLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19NZW1vcnlJbnRlcmZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWE0Y2NlYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19NZW1vcnlJbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00UFNXX01lbW9yeUludGVyZmFjZS5jCi0gKiBAYnJpZWYgIE1lbW9yeSBJbnRlcmZhY2UKLSAqIEBub3RlICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIG9zYWwgbWVtb3J5IGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxtZW1vcnkuaD4KLQotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpZm5kZWYgTTRWUFNfQURWQU5DRURfTUVNT1JZX01BTkFHRVIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZuICAgICAgICAgTTRPU0FfTWVtQWRkcjMyIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE9TQV9VSW50MzIgc2l6ZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nKQotICogQGJyaWVmICAgICAgdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBtZW1vcnkgYmxvY2sgKGF0IGxlYXN0IDMyIGJpdHMgYWxpZ25lZCkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBzaXplIChJTik6IHNpemUgb2YgYWxsb2NhdGVkIGJsb2NrIGluIGJ5dGVzCi0gKiBAcGFyYW0gICAgICBjb3JlSUQgKElOKTogaWRlbnRpZmljYXRpb24gb2YgdGhlIGNhbGxlciBjb21wb25lbnQKLSAqIEBwYXJhbSAgICAgIHN0cmluZyAoSU4pOiBkZXNjcmlwdGlvbiBvZiB0aGUgYWxsb2NhdGVkIGJsb2NrIChudWxsIHRlcm1pbmF0ZWQpCi0gKiBAcmV0dXJuICAgICBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgYmxvY2ssIE00T1NBX05VTEwgaWYgbm8gbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfTWVtQWRkcjMyIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE9TQV9VSW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nKQotewotICAgIE00T1NBX01lbUFkZHIzMiBBZGRyZXNzID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICAqIElmIHNpemUgaXMgMCwgbWFsbG9jIG9uIFdJTiBPUyBhbGxvY2F0ZXMgYSB6ZXJvLWxlbmd0aCBpdGVtIGluCi0gICAgICogdGhlIGhlYXAgYW5kIHJldHVybnMgYSB2YWxpZCBwb2ludGVyIHRvIHRoYXQgaXRlbS4KLSAgICAgKiBPbiBvdGhlciBwbGF0Zm9ybXMsIG1hbGxvYyBjb3VsZCByZXR1cm5zIGFuIGludmFsaWQgcG9pbnRlcgotICAgICAqIFNvLCBET04nVCBhbGxvY2F0ZSBtZW1vcnkgb2YgMCBieXRlICovCi0gICAgaWYgKHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBZGRyZXNzOwotICAgIH0KLQotICAgIGlmIChzaXplJTQgIT0gMCkKLSAgICB7Ci0gICAgICAgIHNpemUgPSBzaXplICsgNCAtIChzaXplJTQpOwotICAgIH0KLQotICAgIEFkZHJlc3MgPSAoTTRPU0FfTWVtQWRkcjMyKSBtYWxsb2Moc2l6ZSk7Ci0KLSAgICByZXR1cm4gQWRkcmVzczsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX1RyYWNlLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19UcmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmM2Q5YTFmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX1RyYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00UFNXX1RyYWNlLmMKLSAqIEBicmllZiAgICAgICAgVHJhY2UgZnVuY3Rpb24gZm9yIHRyYWNlIG1hY3JvcwotICogQG5vdGUgICAgICAgIFRoaXMgZmlsZSBnaXZlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRyYWNlIGZ1bmN0aW9uIHVzZWQKLSAqICAgICAgICAgICAgICAgIGluIHRoZSB0cmFjZSBpbnN0cnVtZW50YXRpb24gbWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPiAvKmZvciBwcmludGYgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4gLyogQU5TSSBDIG1hY3JvcyBhbmQgZGVmcyBmb3IgdmFyaWFibGUgYXJncyAqLwotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jZGVmaW5lIE5PX0ZJTEUgLyogc3VwcHJlc3NlcyB0aGUgZmlsZSBuYW1lIHByaW50IG91dCAqLwotCi0jZGVmaW5lIE1BWF9TVFJJTkdfU0laRSAxMDI0Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogdm9pZCBNNE9TQV9UcmFjZShNNE9TQV9JbnQzMiBsaW5lLCBNNE9TQV9DaGFyKiBmaWxlICxNNE9TQV9JbnQzMiBsZXZlbCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZm9ybWF0LCAuLi4pCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSB0cmFjZSBmb3IgZGVidWcgdGVzdHMKLSAqIEBub3RlICAgIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBwcmludGYuIEZpcnN0IHRoZSB2YXJpYWJsZXMgYXJlIHJldHJpZXZlZCB1c2luZwotICogICAgICAgICAgICBBTlNJIEMgZGVmcyBhbmQgbWFjcm9zIHdoaWNoIGVuYWJsZSB0byBhY2Nlc3MgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLgotICogICAgICAgICAgICBUaGVuIHRoZSBwcmludGYgaXMgZG9uZSAod2l0aCBzb21lIG9ybmVtZW50YWwgYWRkcykuCi0gKiBAcGFyYW0gICAgbGV2ZWwgKElOKTogdGhlIGRlYnVnIGxldmVsCi0gKiBAcGFyYW0gICAgZm9ybWF0IChJTik6IHRoZSAicHJpbnRmIiBmb3JtYXRlZCBzdHJpbmcKLSAqIEBwYXJhbSAgICAuLi4gKElOKTogYXMgbWFueSBwYXJhbWV0ZXJzIGFzIHJlcXVpcmVkIC4uLgotICogQHJldHVybiAgICBub25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQUxfVFJBQ0VfRVhQT1JUX1RZUEUgdm9pZCBNNE9TQV9UcmFjZShNNE9TQV9JbnQzMiBsaW5lLCBNNE9TQV9DaGFyKiBmaWxlICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfQ2hhciogZm9ybWF0LCAuLi4pCi17Ci0gICAgTTRPU0FfQ2hhciBtZXNzYWdlW01BWF9TVFJJTkdfU0laRV07Ci0gICAgTTRPU0FfSW50MzIgaTsKLSAgICB2YV9saXN0IG1hcmtlcjsgLyogcG9pbnRlciB0byBsaXN0IG9mIGFyZ3VtZW50cyAqLwotCi0gICAgLyogZ2V0IHRoZSB2YXIgYXJndW1lbnRzIGludG8gdGhlIHN0cmluZyBtZXNzYWdlIHRvIGJlIGFibGUgdG8gcHJpbnQgKi8KLSAgICB2YV9zdGFydChtYXJrZXIsZm9ybWF0KTsgLyogc2V0IHB0ciB0byBmaXJzdCBhcmd1bWVudCBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiAqLwotICAgIHZzcHJpbnRmKChjaGFyICopbWVzc2FnZSwgKGNvbnN0IGNoYXIgKilmb3JtYXQsbWFya2VyICk7ICAvKiBmb3JtYXRzIGFuZCB3cml0ZXMgdGhlIGRhdGEgaW50byBtZXNzYWdlICovCi0gICAgdmFfZW5kKG1hcmtlcik7IC8qIHJlc2V0IHBvaW50ZXIgdG8gTlVMTCAqLwotCi0gICAgLyogZG8gdGhlIGFjdHVhbCBwcmludCAqLwotI2lmZGVmIE5PX0ZJTEUKLSAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJNNE9TQV9UcmFjZSIsICIlcyIsIChjaGFyKiltZXNzYWdlKTsKLSNlbHNlIC8qIE5PX0ZJTEUgICAgICovCi0gICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiTTRPU0FfVHJhY2UiLCAiJXMiLCAiJXMgYXQgJWx1IGluICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWVzc2FnZSwgbGluZSwgZmlsZSk7Ci0jZW5kaWYgLyogTk9fRklMRSAgICAgKi8KLQotfQotCi1NNE9TQUxfVFJBQ0VfRVhQT1JUX1RZUEUgTTRPU0FfVm9pZCBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKE00T1NBX1VJbnQzMiBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBzdHJpbmdNc2csIC4uLikKLXsKLSAgICBNNE9TQV9DaGFyIG1lc3NhZ2VbTUFYX1NUUklOR19TSVpFXTsKLSAgICBNNE9TQV9JbnQzMiBpOwotICAgIHZhX2xpc3QgbWFya2VyOyAvKiBwb2ludGVyIHRvIGxpc3Qgb2YgYXJndW1lbnRzICovCi0KLSAgICAvKiBnZXQgdGhlIHZhciBhcmd1bWVudHMgaW50byB0aGUgc3RyaW5nIG1lc3NhZ2UgdG8gYmUgYWJsZSB0byBwcmludCAqLwotICAgIHZhX3N0YXJ0KG1hcmtlcixzdHJpbmdNc2cpOyAvKiBzZXQgcHRyIHRvIGZpcnN0IGFyZ3VtZW50IGluIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uICovCi0gICAgdnNwcmludGYoKGNoYXIgKiltZXNzYWdlLCAoY29uc3QgY2hhciAqKXN0cmluZ01zZyxtYXJrZXIgKTsgIC8qIGZvcm1hdHMgYW5kIHdyaXRlcyB0aGUgZGF0YSBpbnRvIG1lc3NhZ2UgKi8KLSAgICB2YV9lbmQobWFya2VyKTsgLyogcmVzZXQgcG9pbnRlciB0byBOVUxMICovCi0KLSAgICAvKiBkbyB0aGUgYWN0dWFsIHByaW50ICovCi0jaWZkZWYgTk9fRklMRQotICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIk00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24iLCAiJXMiLCAoY2hhciopbWVzc2FnZSk7Ci0jZWxzZSAvKiBOT19GSUxFICAgICAqLwotICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIk00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24iLCAiJXMiLCAiJXMgYXQgJWx1IGluICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiltZXNzYWdlLCBsaW5lLCAoY2hhciopZmlsZSk7Ci0jZW5kaWYgLyogTk9fRklMRSAgICAgKi8KLQotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19UeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmOWQxNmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1R5cGVzLmgKLSAqIEBicmllZiAgIERlZmluaXRpb24gb2YgdHlwZXMgZm9yIHRoZSBjb3JlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIE00TVA0V19UWVBFU19ICi0jZGVmaW5lIE00TVA0V19UWVBFU19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2lmbmRlZiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUgotCi0vKiBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFNZU19TdHJlYW0uaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRDX0Z0eXBCb3gKLSAqIEBicmllZiAgICAgICBJbmZvcm1hdGlvbiB0byBidWlsZCB0aGUgJ2Z0eXAnIGF0b20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBNNE1QQUNfRlRZUF9UQUcgMHg2Njc0Nzk3MCAvKiAnZnR5cCcgKi8KLSNkZWZpbmUgTTRNUEFDX01BWF9DT01QQVRJQkxFX0JSQU5EUyAxMAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBBbGwgYnJhbmQgZmllbGRzIGFyZSBhY3R1YWxseSBjaGFyWzRdIHN0b3JlZCBpbiBiaWctZW5kaWFuIGludGVnZXIgZm9ybWF0ICovCi0KLSAgICBNNE9TQV9VSW50MzIgICAgbWFqb3JfYnJhbmQ7ICAgICAgICAgLyogZ2VuZXJhbGx5ICczZ3A0JyAgICAgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgIG1pbm9yX3ZlcnNpb247ICAgICAgIC8qIGdlbmVyYWxseSAnMDAwMCcgb3IgJ3gueCAnICAqLwotICAgIE00T1NBX1VJbnQzMiAgICBuYkNvbXBhdGlibGVCcmFuZHM7ICAvKiBudW1iZXIgb2YgY29tcGF0aWJsZSBicmFuZHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgY29tcGF0aWJsZV9icmFuZHNbTTRNUEFDX01BWF9DT01QQVRJQkxFX0JSQU5EU107ICAgLyogYXJyYXkgb2YgbWF4IGNvbXBhdGlibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmRzICovCi19IE00TVA0Q19GdHlwQm94OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19tZW1BZGRyCi0gKiBAYnJpZWYgICAgICAgIEJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHRoZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgICAgICBzaXplOwotICAgIE00T1NBX01lbUFkZHIzMiAgICBhZGRyOwotfSBNNE1QNFdfbWVtQWRkcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaW1lIHR5cGUgZm9yIHRoZSBjb3JlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBNNE9TQV9VSW50MzIgTTRNUDRXX1RpbWUzMjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgIE00TVA0V19TdGF0ZQotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgY29yZSBNUDQgd3JpdGVyIHN0YXRlcwotICogQG5vdGUgICAgICAgICBUaGVzZSBzdGF0ZXMgYXJlIHVzZWQgaW50ZXJuYWx5LCBidXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIG91dHNpZGUKLSAqICAgICAgICAgICAgICAgdGhlIHdyaXRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNUDRXX29wZW5lZCAgICAgICAgICAgID0gMHgxMDAsCi0gICAgTTRNUDRXX3JlYWR5ICAgICAgICAgICAgID0gMHgyMDAsCi0gICAgTTRNUDRXX3dyaXRpbmcgICAgICAgICAgID0gMHgzMDAsCi0gICAgTTRNUDRXX3dyaXRpbmdfc3RhcnRBVSAgID0gMHgzMDEsCi0gICAgTTRNUDRXX2Nsb3NlZCAgICAgICAgICAgID0gMHg0MDAKLX0gTTRNUDRXX1N0YXRlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW1lcmF0aW9uICAgIE00TVA0V19PcHRpb25JRAotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgY29yZSBNUDQgd3JpdGVyIG9wdGlvbnMKLSAqIEBub3RlICAgICAgICBUaGVzZSBvcHRpb25zIGdpdmUgcGFyYW1ldGVycyBmb3IgdGhlIGNvcmUgTVA0IHdyaXRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1QNFdfbWF4QVVwZXJDaHVuayAgICAgICAgPSAweEMxMDEsCi0gICAgTTRNUDRXX21heENodW5rU2l6ZSAgICAgICAgID0gMHhDMTAyLAotICAgIE00TVA0V19tYXhDaHVua0ludGVyICAgICAgICA9IDB4QzEwMywKLSAgICBNNE1QNFdfcHJlV3JpdGVDYWxsQmFjayAgICAgPSAweEMxMDQsCi0gICAgTTRNUDRXX3Bvc3RXcml0ZUNhbGxCYWNrICAgID0gMHhDMTA1LAotICAgIE00TVA0V19tYXhBVXNpemUgICAgICAgICAgICA9IDB4QzEwNiwKLSAgICBNNE1QNFdfSU9EICAgICAgICAgICAgICAgICAgPSAweEMxMTEsCi0gICAgTTRNUDRXX0VTRCAgICAgICAgICAgICAgICAgID0gMHhDMTEyLAotICAgIE00TVA0V19TRFAgICAgICAgICAgICAgICAgICA9IDB4QzExMywKLSAgICBNNE1QNFdfdHJhY2tTaXplICAgICAgICAgICAgPSAweEMxMTQsCi0gICAgTTRNUDRXX01PT1ZmaXJzdCAgICAgICAgICAgID0gMHhDMTIxLAotICAgIE00TVA0V19WMl9NT09GICAgICAgICAgICAgICA9IDB4QzEzMSwKLSAgICBNNE1QNFdfVjJfdGJsQ29tcHJlcyAgICAgICAgPSAweEMxMzIsCi0gICAgLyp3YXJuaW5nOiB1bnNwZWNpZmllZCBvcHRpb25zOiovCi0gICAgTTRNUDRXX21heEZpbGVTaXplICAgICAgICAgID0gMHhDMTUyLAotICAgIE00TVA0V19DYW1jb2RlclZlcnNpb24gICAgICA9IDB4QzE1MywgLyowMDAgdG8gOTk5ICEqLwotICAgIE00TVA0V19lc3RpbWF0ZUF1ZGlvU2l6ZSAgICA9IDB4QzE1NCwgLyphdWRpbyBBVXMgYXJlIHByb2Nlc3NlZCBhZnRlciB0aGUgdmlkZW8sICovCi0gICAgLyp0aGlzIG9wdGlvbiBNVVNUIE5PVCBiZSBzZXQgaWYgbm9uIGNvbnN0YW50IGF1ZGlvCi0gICAgZnJhbWUgc2l6ZSAoZS5nLiBpZiBTSUQpKi8KLSAgICBNNE1QNFdfZW1iZWRkZWRTdHJpbmcgICAgICAgPSAweEMxNTUsCi0gICAgTTRNUDRXX2ludGVncmF0aW9uVGFnICAgICAgID0gMHhDMTU2LAotICAgIE00TVA0V19tYXhGaWxlRHVyYXRpb24gICAgICA9IDB4QzE1NywKLSAgICBNNE1QNFdfc2V0RnR5cEJveCAgICAgICAgICAgPSAweEMxNTgsCi0gICAgTTRNUDRXX0RTSSAgICAgICAgICAgICAgICAgID0gMHhDMTU5LAotICAgIC8qIEguMjY0IHRyaW1taW5nICovCi0gICAgTTRNUDRXX01VTF9QUFNfU1BTICAgICAgICAgID0gMHhDMTYwLAotICAgIC8qIEguMjY0IHRyaW1taW5nICovCi19IE00TVA0V19PcHRpb25JRDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBBdWRpbyAmIHZpZGVvIHN0cmVhbSBJRHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBBdWRpb1N0cmVhbUlEIDEKLSNkZWZpbmUgVmlkZW9TdHJlYW1JRCAyCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGVmYXVsdCBwYXJhbWV0ZXJzIHZhbHVlcywgdGhhdCBjYW4gYmUgbW9kaWZpZWQgYnkgTTRNUDRXX3NldE9wdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIE00TVA0V19EZWZhdWx0V2lkdGggMzIwCi0jZGVmaW5lIE00TVA0V19EZWZhdWx0SGVpZ2h0IDI0MAotI2RlZmluZSBNNE1QNFdfRGVmYXVsdE1heEF1U2l6ZSAgNDA5NiAvKmJ5dGVzKi8KLSNkZWZpbmUgTTRNUDRXX0RlZmF1bHRNYXhDaHVua1NpemUgMTAwMDAwIC8qYnl0ZXMqLwotI2RlZmluZSBNNE1QNFdfRGVmYXVsdEludGVybGVhdmVEdXIgMCAvKmJ5dGVzKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfU3RyZWFtSURzaXplCi0gKiBAYnJpZWYgICAgICAgIFZpZGVvIHBsYW5lIHNpemUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRDsKLSAgICBNNE9TQV9VSW50MTYgICAgaGVpZ2h0OwotICAgIE00T1NBX1VJbnQxNiAgICB3aWR0aDsKLX0gTTRNUDRXX1N0cmVhbUlEc2l6ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX1RyYWNrRGF0YQotICogQGJyaWVmICAgICAgIEludGVybmFsIGNvcmUgTVA0IHdyaXRlciB0cmFjayBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFNZU19TdHJlYW1UeXBlICAgIHRyYWNrVHlwZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHRpbWVzY2FsZTsgICAgICAgICAgLyogVCAodmlkZW89MTAwMCksIChBTVI4PTgwMDApLCAoQU1SMTY9MTYwMDApKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHNhbXBsZVNpemU7ICAgICAgICAgLyogUyAodmlkZW89MCkqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgc3R0c1RhYmxlRW50cnlOYjsgICAvKiBKIChhdWRpbz0xKSovCi0gICAgTTRNUDRXX1RpbWUzMiAgICAgICAgbGFzdENUUzsgICAgICAgICAgIC8qIENUUyBvZiB0aGUgcHJldmlvdXMgQVUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgdG8gMC5HaXZlcyBkdXJhdGlvbiBhdCB0aGUgZW5kLiovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBzYW1wbGVOYjsgICAgICAgICAgIC8qIEsgKGF1ZGlvPUYpKi8KLX0gTTRNUDRXX1RyYWNrRGF0YTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX0F1ZGlvVHJhY2tEYXRhCi0gKiBAYnJpZWYgICAgICAgSW50ZXJuYWwgY29yZSBNUDQgd3JpdGVyIGF1ZGlvIHNwZWNpZmljIHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00TVA0V19TdGF0ZSAgICAgICAgICAgIG1pY3JvU3RhdGU7Ci0gICAgTTRNUDRXX1RyYWNrRGF0YSAgICAgICAgQ29tbW9uRGF0YTsKLSAgICBNNE9TQV9VQ2hhcioqICAgICAgICAgICBDaHVuazsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBjaHVua1NpemVUYWJsZTsKLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtPZmZzZXRUYWJsZTsKLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlOwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rVGltZU1zVGFibGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudENodW5rOyAgICAgICAvKiBJbml0IHRvIDAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRQb3M7ICAgICAgICAgLyogSW5pdCB0byAwICovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBjdXJyZW50U3RzYzsgICAgICAgIC8qIEluaXQgdG8gMCAqLwotI2VuZGlmCi0gICAgTTRNUDRXX1RpbWUzMiAgICAgICAgICAgc2FtcGxlRHVyYXRpb247ICAgICAvKiBDaGVjayAoQU1SOD0xNjApLCAoQU1SMTY9MzIwKSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTWF4Q2h1bmtTaXplOyAgICAgICAvKiBJbml0IHRvIE00TVA0V19NcDRGaWxlRGF0YS5NYXhDaHVua1NpemUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIE1heEFVU2l6ZTsgICAgICAgICAgLyogSW5pdCB0byBNNE1QNFdfTXA0RmlsZURhdGEuTWF4QVVTaXplKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBMYXN0QWxsb2NhdGVkQ2h1bms7Ci0gICAgLyogcHJldmlvdXNseSwgYXVkaW8gYXUgc2l6ZSB3YXMgc3VwcG9zZWQgY29uc3RhbnQsCi0gICAgICogd2hpY2ggaXMgYWN0dWFsbHkgbm90IHRoZSBjYXNlIGlmIHNpbGVuY2VzIChzaWQpLiovCi0gICAgLyogYXQgZmlyc3QgYXVkaW8gYXUsIHNhbXBsZVNpemUgaXMgc2V0LiBJdCBpcyBsYXRlciByZXNldCB0byAwIGlmIG5vbiBjb25zdGFudCBzaXplLiovCi0gICAgLyogU28gc2FtcGxlU2l6ZSBzaG91bGQgYmUgdGVzdGVkIHRvIGtub3cgd2VpdGhlciBvciBub3QgdGhlcmUgaXMgYSBUQUJMRV9TVFNaLiAqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIFRBQkxFX1NUU1o7IC8qIHRhYmxlIHNpemUgaXMgNEsqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzOwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIFRBQkxFX1NUVFM7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0dHNCbG9ja3M7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbWF4Qml0cmF0ZTsgICAgIC8qbm90IHVzZWQgaW4gYW1yIGNhc2UqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGF2Z0JpdHJhdGU7ICAgICAvKm5vdCB1c2VkIGluIGFtciBjYXNlKi8KLSAgICBNNE9TQV9VQ2hhciogICAgICAgICAgICBEU0k7ICAgICAgICAgICAgLyogRGVjb2RlciBTcGVjaWZpYyBJbmZvOiBNYXkgYmUgTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdGVkKSBmb3IgQU1SICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgZHNpU2l6ZTsgICAgICAgIC8qIERTSSBzaXplLCBhbHdheXMgOSBieXRlcyBmb3IgQU1SICovCi19IE00TVA0V19BdWRpb1RyYWNrRGF0YTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfVmlkZW9UcmFja0RhdGEKLSAqIEBicmllZiAgICAgICAgSW50ZXJuYWwgY29yZSBNUDQgd3JpdGVyIHZpZGVvIHNwZWNpZmljIHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00TVA0V19TdGF0ZSAgICAgICAgICAgIG1pY3JvU3RhdGU7Ci0gICAgTTRNUDRXX1RyYWNrRGF0YSAgICAgICAgQ29tbW9uRGF0YTsKLSAgICBNNE9TQV9VQ2hhcioqICAgICAgICAgICBDaHVuazsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBjaHVua1NpemVUYWJsZTsKLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtPZmZzZXRUYWJsZTsKLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlOwotICAgIE00TVA0V19UaW1lMzIqICAgICAgICAgIGNodW5rVGltZU1zVGFibGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudENodW5rOyAgICAgICAgICAgIC8qIEluaXQgdG8gMCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudFBvcyA7ICAgICAgICAgICAgIC8qIEluaXQgdG8gMCovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBjdXJyZW50U3RzYzsgICAgICAgICAgICAgLyogSW5pdCB0byAwKi8KLSNlbmRpZgotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHN0c3NUYWJsZUVudHJ5TmIgOyAgICAgICAvKiBOKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgICAgLyogWCovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgaGVpZ2h0OyAgICAgICAgICAgICAgICAgIC8qIFkqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIFRBQkxFX1NUVFM7ICAgICAgICAgICAgICAvKiB0YWJsZSBzaXplIGlzIEoqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgTTRPU0FfVUludDE2KiAgICAgICAgICAgVEFCTEVfU1RTWjsgICAgICAgICAgICAgIC8qIHRhYmxlIHNpemUgaXMgMksqLwotI2Vsc2UKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFNaOyAgICAgICAgICAgICAgLyogdGFibGUgc2l6ZSBpcyA0SyovCi0jZW5kaWYKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrczsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFNTOyAgICAgICAgICAgICAgLyogdGFibGUgc2l6ZSBpcyBOKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrczsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIE1heEFVcGVyQ2h1bms7ICAgICAgICAgICAvKkluaXQgdG8gMCwgaS5lLiBub3QgdXNlZCovCi0jZW5kaWYKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBNYXhDaHVua1NpemU7ICAgICAgICAgICAgLypJbml0IHRvIE00TVA0V19NcDRGaWxlRGF0YS5NYXhDaHVua1NpemUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIE1heEFVU2l6ZTsgICAgICAgICAgICAgICAvKkluaXQgdG8gTTRNUDRXX01wNEZpbGVEYXRhLk1heEFVU2l6ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTGFzdEFsbG9jYXRlZENodW5rOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1heEJpdHJhdGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgYXZnQml0cmF0ZTsKLSAgICBNNE9TQV9VQ2hhciogICAgICAgICAgICBEU0k7ICAgICAgICAgICAgLyogRGVjb2RlciBTcGVjaWZpYyBJbmZvOiBNYXkgYmUgTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdGVkKSBmb3IgSDI2MyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgZHNpU2l6ZTsgICAgICAgIC8qIERTSSBzaXplLCBhbHdheXMgNyBieXRlcyBmb3IgSDI2MyAqLwotfSBNNE1QNFdfVmlkZW9UcmFja0RhdGE7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19NcDRGaWxlRGF0YQotICogQGJyaWVmICAgICAgIEludGVybmFsIGNvcmUgTVA0IHdyaXRlciBwcml2YXRlIGNvbnRleHQgc3RydWN0dXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRNUDRXX1N0YXRlICAgICAgICAgICAgICAgICAgc3RhdGU7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgdXJsOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOyAgICAvKiBEIGluIG1zLCBtYXggZHVyYXRpb24gb2YgYXVkaW8mdmlkZW8qLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGZpbGVzaXplOyAgICAvKiBhY3R1YWwgZmlsZXNpemUgaW4gYnl0ZXMqLwotICAgIE00TVA0V19BdWRpb1RyYWNrRGF0YSogICAgICAgIGF1ZGlvVHJhY2tQdHI7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgaGFzQXVkaW87Ci0gICAgTTRNUDRXX1ZpZGVvVHJhY2tEYXRhKiAgICAgICAgdmlkZW9UcmFja1B0cjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBoYXNWaWRlbzsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBNYXhDaHVua1NpemU7ICAgICAgIC8qIEluaXQgdG8gMTAwMDAwKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBNYXhBVVNpemU7ICAgICAgICAgIC8qIEluaXQgdG8gNDA5NiovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgTWF4RmlsZVNpemU7ICAgICAgICAvKiBJbml0IHRvIDAsIGkuZS4gbm90IHVzZWQqLwotICAgIE00TVA0V19UaW1lMzIgICAgICAgICAgICAgICAgIEludGVybGVhdmVEdXI7ICAgICAgLyogSW5pdCB0byAwLCBpLmUuIG5vdCB1c2VkLCBtcyovCi0gICAgLyogTTRNUDRXX1dyaXRlQ2FsbEJhY2sgICAgICAgICAgICBQcmVXcml0ZUNhbGxCYWNrOyovICAgIC8qSW5pdCB0byBNNE9TQV9OVUxMKi8KLSAgICAvKiBNNE1QNFdfV3JpdGVDYWxsQmFjayAgICAgICAgICAgIFBvc3RXcml0ZUNhbGxCYWNrOyovIC8qSW5pdCB0byBNNE9TQV9OVUxMKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICBmaWxlV3JpdGVyRnVuY3Rpb25zOwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIGZpbGVSZWFkZXJGdW5jdGlvbnM7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgY2FtY29kZXJWZXJzaW9uOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlQXVkaW9TaXplOyAgLyogZGVmYXVsdCBpcyBmYWxzZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgYXVkaW9Nc0NodW5rRHVyOyAgICAvKiBpbiBtcywgc2V0IG9ubHkgaWYgZXN0aW1hdGVBdWRpb1NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRydWUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGF1ZGlvTXNTdG9wVGltZTsgICAgLyogdGltZSB0byBzdG9wIGF1ZGlvLCBzZXQgb25seSBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVBdWRpb1NpemUgaXMgdHJ1ZSovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQ7Ci0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGFic29sdXRlQ3VycmVudFBvczsgLyogbmV3IGZpZWxkIGZvciBvZmZzZXQgdXBkYXRlKi8KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0gICAgTTRPU0FfVUNoYXIqICAgICAgICAgICAgICAgICAgZW1iZWRkZWRTdHJpbmc7ICAgICAvKiAxNiBieXRlcyBzdHJpbmcsIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlbiBpZiBOVUxMKi8KLSAgICBNNE9TQV9VQ2hhciogICAgICAgICAgICAgICAgICBpbnRlZ3JhdGlvblRhZzsgICAgIC8qIDYwIGJ5dGVzIHN0cmluZywgbWVtc2V0IHRvIDAgaWYgTlVMTCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIE1heEZpbGVEdXJhdGlvbjsgICAgLyogSW5pdCB0byAwLCBpLmUuIG5vdCB1c2VkKi8KLSAgICBNNE1QNENfRnR5cEJveCAgICAgICAgICAgICAgICBmdHlwOyAgICAgICAgICAgICAgIC8qIGZ0eXAgYXRvbSwgaWYgbm90IGRlZmluZWQgc2V0IG1ham9yX2JyYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsIHdpbGwgdXNlIGRlZmF1bHQgYm94ICovCi0jaWZkZWYgX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgc2FmZXR5RmlsZVVybDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5TYWZldHlGaWxlOwotI2VuZGlmIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTVVMUFBTU1BTOwotfSBNNE1QNFdfTXA0RmlsZURhdGE7Ci0KLSNlbmRpZiAvKiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypNNE1QNFdfVFlQRVNfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19VdGlscy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiZTdhYmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1V0aWxzLmgKLSAqIEBicmllZiAgIFV0aWxpdGllcyBhbmQgcHJpdmF0ZSBmdW5jdGlvbnMgZGVjbGFyYXRpb24gZm9yIHRoZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBNNE1QNFdfVVRJTFNfSAotI2RlZmluZSBNNE1QNFdfVVRJTFNfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZm5kZWYgX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIKLQotLyogaW5jbHVkZXMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFV0aWxpdHkgZnVuY3Rpb25zIHRvIHdyaXRlIGRhdGEgaW4gYmlnIGVuZGlhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJ5dGUoTTRPU0FfVUNoYXIgYywgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotTTRPU0FfRVJSIE00TVA0V19wdXRCRTE2KE00T1NBX1VJbnQzMiB2YWwsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLU00T1NBX0VSUiBNNE1QNFdfcHV0QkUyNChNNE9TQV9VSW50MzIgdmFsLCBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMzIoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFdyaXRlIGEgYnVsayBvZiBkYXRhIGludG8gdGhlIHNwZWNpZmllZCBmaWxlLCBzaXplIGlzIGdpdmVuIGluIGJ5dGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfcHV0QmxvY2soY29uc3QgTTRPU0FfVUNoYXIqIEJsb2NrLCBNNE9TQV9VSW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb252ZXJ0IHRoZSAnbmInIHVuc2lnbmVkIGludGVnZXJzIGluICd0YWInIHRhYmxlIGZyb20gTEUgaW50byBCRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi12b2lkIE00TVA0V190YWJsZTMyVG9CRShNNE9TQV9VSW50MzIqIHRhYiwgTTRPU0FfVUludDMyIG5iKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb252ZXJ0IGFuIHVuc2lnbmVkIDMyIGJpdHMgaW50ZWdlciBmcm9tIExFIGludG8gQkUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdm9pZCBNNE1QNFdfY29udmVydEludDMyQkUoTTRPU0FfVUludDMyKiB2YWxQdHIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJlLWFsbG9jYXRpb24gZnVuY3Rpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdm9pZCogTTRNUDRXX3JlYWxsb2MoTTRPU0FfTWVtQWRkcjMyIHB0ciwgTTRPU0FfVUludDMyIG9sZFNpemUsIE00T1NBX1VJbnQzMiBuZXdTaXplKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEZS1hbGxvY2F0ZSB0aGUgY29udGV4dAotICogVGhpcyBtZXRob2QgaXMgbm8gbG9uZ2VyIGluIHRoZSB3cml0ZXIgZXh0ZXJuYWwgaW50ZXJmYWNlLCBidXQgaXMgY2FsbGVkIGZyb20KLSAqIHRoZSBmdW5jdGlvbiBNNE1QNFdfY2xvc2VXcml0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2ZyZWVDb250ZXh0KE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFB1dCBIaSBhbmQgTG8gdTE2IHBhcnQgaW4gYSB1MzIgdmFyaWFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfVm9pZCBNNE1QNFdfcHV0MzJfSGkoTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQxNiBIaSk7Ci1NNE9TQV9Wb2lkIE00TVA0V19wdXQzMl9MbyhNNE9TQV9VSW50MzIqIHRhYiwgTTRPU0FfVUludDE2IExvKTsKLU00T1NBX1VJbnQxNiBNNE1QNFdfZ2V0MzJfSGkoTTRPU0FfVUludDMyKiB0YWIpOwotTTRPU0FfVUludDE2IE00TVA0V19nZXQzMl9MbyhNNE9TQV9VSW50MzIqIHRhYik7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKk00TVA0V19VVElMU19IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1dyaXRlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1dyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzNhMjIzLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19Xcml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1QNFdfV3JpdGVyLmgKLSAqIEBicmllZiAgIENvcmUgTVA0IHdyaXRlciBpbnRlcmZhY2UKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTVA0IHdyaXRlciBpbnRlcmZhY2UgZnVuY3Rpb25zLgotICogICAgICAgICAgVGhlIE1QNCB3cml0ZXIgc3BlY2lmaWMgdHlwZXMgYXJlIGRlZmluZWQgaW4gZmlsZSBNNE1QNFdfVHlwZXMuaAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jaWZuZGVmIE00TVA0V19XUklURVJfSAotI2RlZmluZSBNNE1QNFdfV1JJVEVSX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZuZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0KLS8qIGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIk00TVA0V19UeXBlcy5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1QNFcgRXJyb3JzICYgV2FybmluZ3MgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIE00V0FSX01QNFdfT1ZFUlNJWkUgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRNUDRfV1JJVEVSICwweDAwMDAwMSkKLSNkZWZpbmUgTTRXQVJfTVA0V19OT1RfRVZBTFVBQkxFICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNE1QNF9XUklURVIgLDB4MDAwMDAyKQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgTVA0VyB2ZXJzaW9uCi0gKiBAcGFyYW0gICAgbWFqb3IgICAgICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHRoZSAnbWFqb3InIHZlcnNpb24gbnVtYmVyLgotICogQHBhcmFtICAgIG1pbm9yICAgICAgICAgICAgKE9VVCkgUG9pbnRlciB0byB0aGUgJ21pbm9yJyB2ZXJzaW9uIG51bWJlci4KLSAqIEBwYXJhbSAgICByZXZpc2lvbiAgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gdGhlICdyZXZpc2lvbicgbnVtYmVyLgotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2dldFZlcnNpb24oTTRPU0FfVUludDgqIG1ham9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBtaW5vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogcmV2aXNpb24pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBJbml0aWF0aW9uIG9mIHRoZSBNUDQgZmlsZSBjcmVhdGlvbgotICogQHBhcmFtICAgIGNvbnRleHRQdHIgICAgICAgICAgICAgKE9VVCkgUG9pbnRlciB0byB0aGUgTVA0IHdyaXRlciBjb250ZXh0IHRvIGNyZWF0ZS4KLSAqIEBwYXJhbSAgICBvdXRwdXRGaWxlRGVzY3JpcHRvciAgIChJTikgIERlc2NyaXB0b3Igb2YgdGhlIG91dHB1dCBmaWxlIHRvIG9wZW4uCi0gKiBAcGFyYW0gICAgZmlsZVdyaXRlckZ1bmN0aW9uICAgICAoSU4pICBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBzZXQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucy4KLSAqIEBwYXJhbSAgICB0ZW1wRmlsZURlc2NyaXB0b3IgICAgIChJTikgIERlc2NyaXB0b3Igb2YgdGhlIHRlbXBvcmFyeSBmaWxlIHRvIG9wZW4uCi0gKiBAcGFyYW0gICAgZmlsZVJlYWRlckZ1bmN0aW9uICAgICAoSU4pICBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBzZXQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX29wZW5Xcml0ZSggTTRPU0FfQ29udGV4dCogICAgICAgICAgICAgICAgICBjb250ZXh0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgICBmaWxlV3JpdGVyRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgICBmaWxlUmVhZGVyRnVuY3Rpb24gKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQWRkIGEgbmV3IHRyYWNrCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgKElOL09VVCkgIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBzdHJlYW1EZXNjUHRyICAgICAgICAoSU4pICAgICAgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgZm9yIHRoZSBuZXcgdHJhY2suCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgSW52YWxpZCBzdGF0ZQotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVDogIEFuIGF1ZGlvIChyZXNwLnZpZGVvKSBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBhZGRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoaXMgY29udGV4dCB3aGlsZSBhdHRlbXB0aW5nIHRvIGFkZCBhbm90aGVyIG9uZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBpcyBmb3JiaWRkZW4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfYWRkU3RyZWFtKCBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qICAgICBzdHJlYW1EZXNjUHRyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBTaWduYWwgdG8gdGhlIGNvcmUgTVA0IHdyaXRlciB0aGF0IHRoZXJlIGlzIG5vIG1vcmUgdHJhY2tzIHRvIGFkZAotICogQHBhcmFtICAgY29udGV4dCAgICAgICAgICAgICAoSU4vT1VUKSBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIEludmFsaWQgc3RhdGUKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9DT05URVhUOiAgQXVkaW8gc2l6ZSBlc3RpbWF0aW9uIGlzIHJlcXVpcmVkIGJ1dCBub3QgdHdvIHN0cmVhbXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBiZWVuIGFkZGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3N0YXJ0V3JpdGluZyggTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBBc2tzIHRoZSBjb3JlIE1QNCB3cml0ZXIgdG8gaW5pdGlhdGUgdGhlIGFjY2VzcyB1bml0IGNyZWF0aW9uIGluCi0gKiAgICAgICAgICB0aGUgc3RyZWFtSUQgdHJhY2sKLSAqIEBwYXJhbSAgIGNvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgc3RyZWFtSUQgICAgICAgICAgICAoSU4pIFN0cmVhbSBJRCBvZiB0aGUgdHJhY2suCi0gKiBAcGFyYW0gICBhdVB0ciAgICAgICAgICAgICAgIChJTi9PVVQpIEFjY2VzcyB1bml0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOlVua25vd24gc3RyZWFtIElECi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgSW52YWxpZCBzdGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3N0YXJ0QVUoIE00T1NBX0NvbnRleHQgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEICAgICAgIHN0cmVhbUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiAgICBhdVB0cik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgQXNrIHRoZSBjb3JlIE1QNCB3cml0ZXIgdG8gd3JpdGUgdGhlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW1JRCB0cmFjawotICogQG5vdGUgICAgSWYgTTRNUDRXX1dBUl9PVkVSU0laRSBpcyByZXR1cm5lZCwgTTRNUDRXX3N0YXJ0QVUgbXVzdCBub3QgYmUgY2FsbGVkIGFueW1vcmUsCi0gKiAgICAgICAgICBidXQgZGlyZWN0bHkgTTRNUDRXX2Nsb3NlV3JpdGUoKS4KLSAqIEBwYXJhbSAgIGNvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgICBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBzdHJlYW1JRCAgICAgICAgICAgIChJTikgICAgICAgU3RyZWFtIElEIG9mIHRoZSB0cmFjay4KLSAqIEBwYXJhbSAgIGF1UHRyICAgICAgICAgICAgICAgKElOL09VVCkgICBBY2Nlc3MgdW5pdC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6ICAgICAgICBVbmtub3duIHN0cmVhbSBJRAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgICAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICBJbnZhbGlkIHN0YXRlCi0gKiBAcmV0dXJuICAgIE00V0FSX01QNFdfTk9UX0VWQUxVQUJMRTogICBJdCBpcyBub3QgcG9zc2libGUgdG8gZXZhbHVhdGUgYXVkaW8gc2l6ZSBpZiBhdWRpbwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyBkb24ndCBoYXZlIGEgY29uc3RhbnQgc2l6ZS4KLSAqIEByZXR1cm4gICAgTTRXQVJfTVA0V19PVkVSU0laRTogICAgICAgIE1heCBmaWxlIHNpemUgd2FzIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19wcm9jZXNzQVUoIE00T1NBX0NvbnRleHQgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtSUQgICAgICAgc3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogICAgYXVQdHIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgQ2xvc2UgdGhlIE1QNCBmaWxlCi0gKiBAbm90ZSAgICAgIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBNUDQgd3JpdGVyLCB0aGUgTTRNUDRXX2ZyZWVDb250ZXh0IG1ldGhvZAotICogICAgICAgICAgICB3YXMgaW4gdGhlIGludGVyZmFjZSwgd2hpY2ggaXMgbm90IHRoZSBjYXNlIGFueW1vcmUuCi0gKiAgICAgICAgICAgIFRoZSBjb250ZXh0IGlzIG5vdyBhbHdheXMgZGVhbGxvY2F0ZWQgaW4gdGhlIE00TVA0V19jbG9zZVdyaXRlIGZ1bmN0aW9uLgotICogQHBhcmFtICAgICBjb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19jbG9zZVdyaXRlKCBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBBc2sgdGhlIGNvcmUgTVA0IHdyaXRlciB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTikgICAgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIG9wdGlvbiAgICAgICAgICAgICAgICAgKElOKSAgICBPcHRpb24gSUQuCi0gKiBAcGFyYW0gICAgdmFsdWVQdHIgICAgICAgICAgICAgICAoT1VUKSAgIFBvaW50ZXIgdG8gdGhlIG9wdGlvbiB2YWx1ZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6ICBOb3QgaW1wbGVtZW50ZWQgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbgotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiAgICBVbmtub3duIG9wdGlvbklECi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6ICAgIEJhZCBzdHJlYW0gSUQgaW4gdGhlIG9wdGlvbiB2YWx1ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2dldE9wdGlvbiggTTRPU0FfQ29udGV4dCAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCAgICAgICAgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gICAgKnZhbHVlUHRyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQXNrIHRoZSBjb3JlIE1QNCB3cml0ZXIgdG8gc2V0IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgIChJTi9PVVQpICBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgb3B0aW9uICAgICAgICAgICAgICAgKElOKSAgICAgIE9wdGlvbiBJRC4KLSAqIEBwYXJhbSAgICB2YWx1ZSAgICAgICAgICAgICAgICAoSU4pICAgICAgT3B0aW9uIHZhbHVlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogIE5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY3VycmVudCB2ZXJzaW9uCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6ICAgIFVua25vd24gb3B0aW9uSUQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDogICAgQmFkIHN0cmVhbSBJRCBpbiB0aGUgb3B0aW9uIHZhbHVlCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgICAgIEEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfc2V0T3B0aW9uKCBNNE9TQV9Db250ZXh0ICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgICAgICBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAgICB2YWx1ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEFzayB0aGUgY29yZSBNUDQgd3JpdGVyIHRvIHJldHVybiBpdHMgc3RhdGUuCi0gKiBAbm90ZSAgICAgQnkgc2VsZWN0aW5nIGEgc3BlY2lmaWMgc3RyZWFtSUQgKG5vdCBudWxsKSwgdGhlIGNhbGxlciBjYW4gb2J0YWluCi0gKiAgICAgICAgICAgdGhlIHN0YXRlIG9mIGEgc3BlY2lmaWMgc3RyZWFtLiBCeSB1c2luZyAwIGFzIHN0cmVhbUlEIHRoZSByZXR1cm5lZAotICogICAgICAgICAgIHN0YXRlIGlzIG5vdCBzdHJlYW0gc3BlY2lmaWMuCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4pICAgICBQb2ludGVyIHRvIHRoZSBzdGF0ZSBlbnVtZXJhdGlvbi4KLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIHN0cmVhbUlEIG9mIHRoZSBzdHJlYW0gdG8gcmV0cmlldmUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyby1zdGF0ZSAoMCBmb3IgZ2xvYmFsIHN0YXRlKS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDogICAgVW5rbm93biBzdHJlYW0gSUQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2dldFN0YXRlKCBNNE9TQV9Db250ZXh0ICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNFdfU3RhdGUqICAgIHN0YXRlUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtSUQgICBzdHJlYW1JRCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldCB0aGUgY3VycmVudGx5IGV4cGVjdGVkIGZpbGUgc2l6ZQotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSggTTRPU0FfQ29udGV4dCAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqICAgICAgICBjdXJyZW50RmlsZVNpemUpOwotCi0jZW5kaWYgLyogX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0jZW5kaWYgLypNNE1QNFdfV1JJVEVSX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFiMzJiYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGliM2dwd3JpdGVyCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcl8zZ3B3cml0ZXIKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgXAotICAgICAgTTRNUDRXX0ludGVyZmFjZS5jIFwKLSAgICAgIE00TVA0V19VdGlscy5jIFwKLSAgICAgIE00TVA0V19Xcml0ZXIuYwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgICAgICAgICAgICAgXAotICAgIGxpYnV0aWxzICAgICAgICAgICAgICBcCi0gICAgbGlidmlkZW9lZGl0b3Jfb3NhbCAgIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi0KLSMgQWxsIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHdlIGxpbmsgYWdhaW5zdC4KLUxPQ0FMX0xETElCUyA6PSBcCi0gICAgLWxwdGhyZWFkIC1sZGwKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIFwKLSAgICAtRERVUExJQ0FURV9TVFRTX0lOX0xBU1RfQVUKLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfSW50ZXJmYWNlLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfSW50ZXJmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyYzUyNTAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX0ludGVyZmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19JbnRlcmZhY2UuYwotICogQGJyaWVmICAgIDNHUFAgZmlsZSB3cml0ZXIgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIGNvbW1vbiBpbnRlcmZhY2UgZGVmaW5lZAotICogICAgICAgICAgaW4gIk00V1JJVEVSX2NvbW1vbi5oIi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLS8qKgotICogT1NBTCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiICAgICAgICAgICAgLyoqPCBPU0FMIGJhc2ljIHR5cGVzIGRlZmluaXRvbiAqLwotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgT1NBTCBmaWxlIGFjY2Vzc2VzIGltcGxlbWVudGF0aW9uICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBPU0FMIG1lbW9yeSBhY2Nlc3NlcyBpbXBsZW1lbnRhdGlvbiAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgICAgICAgICAgLyoqPCBPU0FMIGRlYnVnIHRvb2xzICovCi0KLS8qKgotICogV3JpdGVyIGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiICAgICAgICAvKio8IERlZmluaXRpb24gb2YgdGhlIHdyaXRlciBjb21tb24gaW50ZXJmYWNlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbW9kdWxlIGZvbGxvd3MgKi8KLQotI2lmZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0jaW5jbHVkZSAiTTRNUDRXX1R5cGVzX0NzdE1lbS5oIiAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgdHlwZXMgKi8KLSNpbmNsdWRlICJNNE1QNFdfV3JpdGVyX0NzdE1lbS5oIiAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgZnVuY3Rpb25zICovCi0jZWxzZQotI2luY2x1ZGUgIk00TVA0V19UeXBlcy5oIiAgICAgICAgICAgIC8qKjwgTVA0LzNHUCBjb3JlIHdyaXRlciB0eXBlcyAqLwotI2luY2x1ZGUgIk00TVA0V19Xcml0ZXIuaCIgICAgICAgICAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgZnVuY3Rpb25zICovCi0jZW5kaWYgLyogX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIgKi8KLQotLyoqCi0gKiBTcGVjaWZpYyBlcnJvcnMgZm9yIHRoaXMgbW9kdWxlICovCi0jZGVmaW5lIE00V1JJVEVSXzNHUF9FUlJfVU5TVVBQT1JURURfU1RSRUFNX1RZUEUgXAotICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFdSSVRFUl8zR1AsIDB4MDAwMDAxKQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgd3JpdGVyIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIHdyaXRlciBjYWxscyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfQ29udGV4dCAgICBwTVA0Q29udGV4dDsgICAgLyoqPCBNUDQgd3JpdGVyIGNvbnRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbWF4QVVzaXplczsgICAgICAgIC8qKjwgdGhlIG1heGltdW0gQVUgc2l6ZSBwb3NzaWJsZSAqLwotfSBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfb3BlbldyaXRlKE00V1JJVEVSX0NvbnRleHQqIHBDb250ZXh0LCB2b2lkKiBwV2hhdCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZXJQb2ludGVyKQotICogQGJyaWVmICAgIE9wZW4gYSB3cml0ZXIgc2Vzc2lvbi4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAoT1VUKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwgYWxsb2NhdGVkIGJ5IHRoaXMgZnVuY3Rpb24uCi0gKiBAcGFyYW0gICAgb3V0cHV0RmlsZURlc2NyaXB0b3IgKElOKSAgRGVzY3JpcHRvciBvZiB0aGUgb3V0cHV0IGZpbGUgdG8gY3JlYXRlLgotICogQHBhcmFtICAgIGZpbGVXcml0ZXJGdW5jdGlvbiAgICAgKElOKSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2V0IG9mIE9TQUwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSB3cml0ZSBmdW5jdGlvbnMuCi0gKiBAcGFyYW0gICAgdGVtcEZpbGVEZXNjcmlwdG9yICAgICAoSU4pICBEZXNjcmlwdG9yIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSB0byBvcGVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlVMTCBpZiBub3QgdXNlZCkKLSAqIEBwYXJhbSAgICBmaWxlUmVhZGVyRnVuY3Rpb24gICAgIChJTikgIFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHNldCBvZiBPU0FMIGZpbGUgcmVhZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyAoTlVMTCBpZiBub3QgdXNlZCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBvciBwRmlsZVB0ckZjdCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBvcGVuV3JpdGUgKEl0cyBjb3JlSUQgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfb3BlbldyaXRlKCBNNFdSSVRFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvdXRwdXRGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZXJQb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHRlbXBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZGVyUG9pbnRlciApCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiTTRXUklURVJfM0dQX29wZW5Xcml0ZSIpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVXcml0ZXJQb2ludGVyKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX29wZW5Xcml0ZTogcEZpbGVXcml0ZXJQb2ludGVyIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGNvbnRleHQgKi8KLSAgICAqcENvbnRleHQ9TTRPU0FfTlVMTDsKLSAgICBhcENvbnRleHQgPSAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgIE00V1JJVEVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCIpOwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6XAotICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBjb250ZXh0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgUmVzZXQgY29udGV4dCB2YXJpYWJsZXMgKi8KLSAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBhcENvbnRleHQtPm1heEFVc2l6ZXMgPSAwOwotCi0gICAgLyoqCi0gICAgICogICAgUmV0dXJuIHRoZSB3cml0ZXIgY29udGV4dCAqLwotICAgICpwQ29udGV4dCA9IChNNFdSSVRFUl9Db250ZXh0ICopYXBDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogICAgTGF1bmNoIHRoZSBvcGVuV3JpdGUgb2YgdGhlIE1QNCB3cml0ZXIgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX29wZW5Xcml0ZTogY2FsbGluZyBNNE1QNFdfb3BlbldyaXRlKCkiKTsKLQotICAgIGVyciA9IE00TVA0V19vcGVuV3JpdGUoJmFwQ29udGV4dC0+cE1QNENvbnRleHQsIG91dHB1dEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgcEZpbGVXcml0ZXJQb2ludGVyLCB0ZW1wRmlsZURlc2NyaXB0b3IsIHBGaWxlUmVhZGVyUG9pbnRlciApOwotCi0gICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19vcGVuV3JpdGUgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRXUklURVJfM0dQX29wZW5Xcml0ZTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZyhNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIEluZGljYXRlcyB0byB0aGUgd3JpdGVyIHRoYXQgdGhlIHNldHVwIHNlc3Npb24gaXMgZW5kZWQgYW5kIHRoYXQKLSAqICAgICAgICAgIHdlIHdpbGwgc3RhcnQgdG8gd3JpdGUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dDogICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIHN0YXJ0V3JpdGluZyAoSXRzCi0gKiAgICAgICAgICAgIGNvcmVJRCBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmcoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KiBhcENvbnRleHQgPQotICAgICAgICAgICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZzogcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfc3RhcnRXcml0aW5nOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDYWxsIHRoZSBNUDQgY29yZSB3cml0ZXIgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZzogY2FsbGluZyBNNE1QNFdfc3RhcnRXcml0aW5nKCkiKTsKLSAgICBlcnIgPSBNNE1QNFdfc3RhcnRXcml0aW5nKGFwQ29udGV4dC0+cE1QNENvbnRleHQpOwotICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc3RhcnRXcml0aW5nIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmc6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfYWRkU3RyZWFtKAotICogICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gKnBTdHJlYW1EZXNjcmlwdGlvbikKLSAqIEBicmllZiAgICAgQWRkIGEgc3RyZWFtIChhdWRpbyBvciB2aWRlbykuCi0gKiBAbm90ZSAgICAgIERlY29kZXIgc3BlY2lmaWMgaW5mbyBwcm9wZXJ0aWVzIGFyZSBjb3JyZWN0bHkgc2V0IGJlZm9yZSBjYWxsaW5nCi0gKiAgICAgICAgICAgIHRoZSBjb3JlIHdyaXRlciBhZGQgZnVuY3Rpb24KLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6ICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEBwYXJhbSAgICAgc3RyZWFtRGVzY3JpcHRpb246ICAgIChJTikgc3RyZWFtIGRlc2NyaXB0aW9uLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBTdHJlYW1EZXNjcmlwdGlvbiBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBhZGRTdHJlYW0KLSAqICAgICAgICAgICAgKEl0cyBjb3JlSUQgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1BfYWRkU3RyZWFtKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogcFN0cmVhbURlc2NyaXB0aW9uKQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQgKmFwQ29udGV4dCA9Ci0gICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MgKnBWaWRlb0luZm8gPSBNNE9TQV9OVUxMOwotICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MgKnBBdWRpb0luZm8gPSBNNE9TQV9OVUxMOwotICAgIE00TVA0V19TdHJlYW1JRHNpemUgc2l6ZVZhbHVlOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IHBDb250ZXh0PTB4JXgsICIKLSAgICAgICAgICAgICAgICAgICAicFN0cmVhbURlc2NyaXB0aW9uPTB4JXgiLAotICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwU3RyZWFtRGVzY3JpcHRpb24pOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTdHJlYW1EZXNjcmlwdGlvbiksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IHBTdHJlYW1EZXNjcmlwdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBBZGFwdCBhdWRpby92aWRlbyBzdHJlYW0gaW5mb3MgKi8KLSAgICBzd2l0Y2ggKHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2NDoKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiAiCi0gICAgICAgICAgICAgICAgICAgICJhZGRpbmcgYSBWaWRlbyBzdHJlYW0gKHN0cmVhbVR5cGU9MHgleCkiLAotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbVR5cGUpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAgICBDb21tb24gZGVzY3JpcHRpb25zICovCi0gICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbUlEID0gVmlkZW9TdHJlYW1JRDsgICAgLyoqPCBUaGUgb25seSB2YWx1ZXMgY2hlY2tlZCBieSBvdXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUgd3JpdGVyIGFyZSBzdHJlYW1JRCAqLwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT50aW1lU2NhbGUgPSAxMDAwOyAgICAgICAgICAgIC8qKjwgYW5kIHRpbWVTY2FsZSAqLwotCi0vKiBOb3QgcmVjb21tZW5kZWQgZm9yIHZpZGVvIGVkaXRpbmcgLT4gd3JpdGUgZXhwbGljaXRlbHkgdGhlICdiaXRyJyBib3ggaW50byAnZDI2MycgKi8KLS8qIFJlbSA6IGl0IGlzIFJFTCA1IG9mIDNncHAgZG9jdW1lbnRhdGlvbiAqLwotLy8gICAgICAgICAgICAvKioKLS8vICAgICAgICAgICAgICogQXZlcmFnZSBiaXQtcmF0ZSBtdXN0IG5vdCBiZSBzZXQgaW4gSDI2MyB0byBiZSBjb21wYXRpYmxlIHdpdGggUGxhdGZvcm00ICovCi0vLyAgICAgICAgICAgIGlmIChNNFNZU19rSDI2MyA9PSBwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbVR5cGUpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+YXZlcmFnZUJpdHJhdGUgPSAtMTsKLS8vICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqICAgIERlY29kZXIgc3BlY2lmaWMgaW5mbyAqLwotICAgICAgICAgICAgcFZpZGVvSW5mbyA9IChNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zICopcFN0cmVhbURlc2NyaXB0aW9uLT5kZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHBWaWRlb0luZm8tPkhlYWRlci5TaXplOwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0gKE00T1NBX01lbUFkZHIzMilwVmlkZW9JbmZvLT5IZWFkZXIucEJ1ZjsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18yKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBWaWRlbzogRFNJPTB4JXgsIERTSXNpemU9JWQiLAotICAgICAgICAgICAgICAgICBwVmlkZW9JbmZvLT5IZWFkZXIucEJ1ZiwgcFZpZGVvSW5mby0+SGVhZGVyLlNpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICBjYXNlIE00U1lTX2tBTVJfV0I6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgY2FzZSBNNFNZU19rRVZSQzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBhZGRpbmcgYW4gQXVkaW8gc3RyZWFtIChzdHJlYW1UeXBlPTB4JXgpIiwKLSAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogICAgQ29tbW9uIGRlc2NyaXB0aW9ucyAqLwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1JRCA9IEF1ZGlvU3RyZWFtSUQ7ICAgIC8qKjwgVGhlIG9ubHkgdmFsdWUgY2hlY2tlZCBieSBvdXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZSB3cml0ZXIgaXMgc3RyZWFtSUQgKi8KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAgICBEZWNvZGVyIHNwZWNpZmljIGluZm8gKi8KLSAgICAgICAgICAgIHBBdWRpb0luZm8gPSAoTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyAqKXBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBwQXVkaW9JbmZvLT5IZWFkZXIuU2l6ZTsKLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mbyA9IChNNE9TQV9NZW1BZGRyMzIpcEF1ZGlvSW5mby0+SGVhZGVyLnBCdWY7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogQXVkaW86IERTST0weCV4LCBEU0lzaXplPSVkIiwKLSAgICAgICAgICAgICAgICAgcEF1ZGlvSW5mby0+SGVhZGVyLnBCdWYsIHBBdWRpb0luZm8tPkhlYWRlci5TaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTpcCi0gICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFdSSVRFUl8zR1BfRVJSX1VOU1VQUE9SVEVEX1NUUkVBTV9UWVBFIChzdHJlYW1UeXBlPTB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNFdSSVRFUl8zR1BfRVJSX1VOU1VQUE9SVEVEX1NUUkVBTV9UWVBFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgQ2FsbCB0aGUgTVA0IGNvcmUgd3JpdGVyICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IGNhbGxpbmcgTTRNUDRXX2FkZFN0cmVhbSgpIik7Ci0gICAgZXJyID0gTTRNUDRXX2FkZFN0cmVhbShhcENvbnRleHQtPnBNUDRDb250ZXh0LHBTdHJlYW1EZXNjcmlwdGlvbik7Ci0gICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IE00TVA0V19hZGRTdHJlYW0gcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIChlcnIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIEZvciBWaWRlbywgc2V0IHRoZSBNNE1QNFdfdHJhY2tTaXplIE9wdGlvbiAqLwotICAgIHN3aXRjaCAocFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1UeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICBjYXNlIE00U1lTX2tIMjYzOgotICAgICAgICAgICAgc2l6ZVZhbHVlLnN0cmVhbUlEID0gVmlkZW9TdHJlYW1JRDsKLSAgICAgICAgICAgIHNpemVWYWx1ZS5oZWlnaHQgPSAoTTRPU0FfVUludDE2KShwVmlkZW9JbmZvLT5oZWlnaHQpOwotICAgICAgICAgICAgc2l6ZVZhbHVlLndpZHRoICA9IChNNE9TQV9VSW50MTYpKHBWaWRlb0luZm8tPndpZHRoKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18yKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBWaWRlbzogaGVpZ2h0PSVkLCB3aWR0aD0lZCIsCi0gICAgICAgICAgICAgICAgIHNpemVWYWx1ZS5oZWlnaHQsIHNpemVWYWx1ZS53aWR0aCk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBjYWxsaW5nIE00TVA0V19zZXRPcHRpb24oTTRNUDRXX3RyYWNrU2l6ZSkiKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIE00TVA0V190cmFja1NpemUsCi0gICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSZzaXplVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBNNE1QNFdfc2V0T3B0aW9uIHJldHVybnMgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9jbG9zZVdyaXRlKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgQ2xvc2UgdGhlIHdyaXRlci4gVGhlIGNvbnRleHQgaXMgZnJlZWQgaGVyZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIDNHUCB3cml0ZXIsCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgY2xvc2VXcml0ZSAoSXRzIGNvcmVJRAotICogICAgICAgICAgICBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9jbG9zZVdyaXRlKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0PShNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICAgIENhbGwgdGhlIE1QNCBjb3JlIHdyaXRlciAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IGFwQ29udGV4dC0+cE1QNENvbnRleHQpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU6IGNhbGxpbmcgTTRNUDRXX2Nsb3NlV3JpdGUoKSIpOwotICAgICAgICBlcnIgPSBNNE1QNFdfY2xvc2VXcml0ZShhcENvbnRleHQtPnBNUDRDb250ZXh0KTsKLSAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU6IE00TVA0V19jbG9zZVdyaXRlIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBEZWFsbG9jYXRlIG91ciBvd24gY29udGV4dCAqLwotICAgIGZyZWUoYXBDb250ZXh0KTsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zZXRPcHRpb24oCi0gKiAgICAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDMyIG9wdGlvbklELAotICogICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi0gKiBAYnJpZWYgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgd3JpdGVyIHRvIHNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoCi0gKiAgICAgICAgICAgIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy8KLSAqICAgICAgICAgICAgZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgVGhlIG9wdGlvbnMgaGFuZGxlZCBieSB0aGUgY29tcG9uZW50IGRlcGVuZCBvbiB0aGUgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgb2YgdGhlIGNvbXBvbmVudC4KLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6ICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHBhcmFtICAgICBwcHRpb25JZDogICAgIChJTikgSUQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCi0gKiBAcGFyYW0gICAgIE9wdGlvblZhbHVlIDogKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uIHRvIHNldC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgSUQgb2YgdGhlIG9wdGlvbiBpcyBub3QgdmFsaWQuCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIHNldE9wdGlvbiAoSXRzIGNvcmVJRAotICogICAgICAgICAgICBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zZXRPcHRpb24oCi0gICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQzMiBvcHRpb25JRCwKLSAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KiBhcENvbnRleHQgPQotICAgICAgICAgICAgKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRNUDRXX21lbUFkZHIgbWVtdmFsOwotICAgIE00U1lTX1N0cmVhbUlEVmFsdWUgb3B0dmFsOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00V1JJVEVSXzNHUF9zZXRPcHRpb246IHBDb250ZXh0PTB4JXgsIG9wdGlvbklEPTB4JXgsXAotICAgICAgICAgb3B0aW9uVmFsdWU9MHgleCIsIHBDb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1hcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfc2V0T3B0aW9uOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzd2l0Y2ggKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIE1heGltdW0gQWNjZXNzIFVuaXQgc2l6ZSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhBVVNpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTWF4QVVTaXplIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4QVVzaXplLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX21heEFVc2l6ZSkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIGNodW5jayBzaXplICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa01heENodW5ja1NpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4Q2h1bmtTaXplLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX21heENodW5rU2l6ZSlcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBGaWxlIHN0cmluZyBzaWduYXR1cmUgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmc6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcgb3B0aW9uIik7Ci0gICAgICAgICAgICAvKiBUaGUgZ2l2ZW4gTTRPU0FfRGF0YU9wdGlvbiBtdXN0IGFjdHVhbGx5Ci0gICAgICAgICAgICAgICBiZSBhIHRleHQgc3RyaW5nICovCi0gICAgICAgICAgICBtZW12YWwuYWRkciA9IChNNE9TQV9NZW1BZGRyMzIpb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICAvKio8IHRoaXMgaXMgbWF4IHN0cmluZyBzaXplIGNvcGllZCBieSB0aGUgY29yZSAqLwotICAgICAgICAgICAgbWVtdmFsLnNpemUgPSAxNjsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfZW1iZWRkZWRTdHJpbmcsICZtZW12YWwpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19lbWJlZGRlZFN0cmluZylcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBGaWxlIGludGVncmF0aW9uIHRhZyAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tJbnRlZ3JhdGlvblRhZzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tJbnRlZ3JhdGlvblRhZyBvcHRpb24iKTsKLSAgICAgICAgICAgIC8qIFRoZSBnaXZlbiBNNE9TQV9EYXRhT3B0aW9uIG11c3QgYWN0dWFsbHkKLSAgICAgICAgICAgICAgIGJlIGEgdGV4dCBzdHJpbmcgKi8KLSAgICAgICAgICAgIG1lbXZhbC5hZGRyID0gKE00T1NBX01lbUFkZHIzMilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIC8qKjwgdGhpcyBpcyBtYXggc3RyaW5nIHNpemUgY29waWVkIGJ5IHRoZSBjb3JlICovCi0gICAgICAgICAgICBtZW12YWwuc2l6ZSA9IHN0cmxlbigoY29uc3QgY2hhciAqKW9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfaW50ZWdyYXRpb25UYWcsICZtZW12YWwpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19pbnRlZ3JhdGlvblRhZykiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBGaWxlIHZlcnNpb24gc2lnbmF0dXJlICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbjoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24gb3B0aW9uIik7Ci0gICAgICAgICAgICAvKiBUaGUgZ2l2ZW4gTTRPU0FfRGF0YU9wdGlvbiBtdXN0IGFjdHVhbGx5Ci0gICAgICAgICAgICAgICBiZSBhIHZlcnNpb24gbnVtYmVyICovCi0KLSAgICAgICAgICAgIC8qKjwgSGVyZSAwIG1lYW5zIGJvdGggc3RyZWFtcyAqLwotICAgICAgICAgICAgb3B0dmFsLnN0cmVhbUlEID0gMDsKLSAgICAgICAgICAgIC8qKjwgdmVyc2lvbiBudW1iZXIgKi8KLSAgICAgICAgICAgIG9wdHZhbC52YWx1ZSA9ICooTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfQ2FtY29kZXJWZXJzaW9uLCAmb3B0dmFsKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfQ2FtY29kZXJWZXJzaW9uKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFNvbWUgb3B0aW9ucyBhcmUgcmVhZC1vbmx5ICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0ZpbGVTaXplOgotICAgICAgICBjYXNlIE00V1JJVEVSX2tGaWxlU2l6ZUF1ZGlvRXN0aW1hdGVkOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoInRyeWluZyB0byBzZXQgYSByZWFkLW9ubHkgb3B0aW9uISAoSUQ9MHgleCkiLAotICAgICAgICAgICAgICAgICAgICBvcHRpb25JRCk7Ci0gICAgICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9SRUFEX09OTFk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIE1heGltdW0gZmlsZXNpemUgbGltaXRhdGlvbiAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhGaWxlU2l6ZToKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tNYXhGaWxlU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4RmlsZVNpemUsIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfbWF4RmlsZVNpemUpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIGZpbGUgZHVyYXRpb24gbGltaXRhdGlvbiAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb246Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LE00TVA0V19tYXhGaWxlRHVyYXRpb24sIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKioKLSAgICAgICAgICogICAgU2V0ICdmdHlwJyBhdG9tICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa1NldEZ0eXBCb3g6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rU2V0RnR5cEJveCBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgTTRNUDRXX3NldEZ0eXBCb3gsIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfc2V0RnR5cEJveClcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIERlY29kZXIgU3BlY2lmaWMgSW5mbyAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tEU0k6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rRFNJIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LCBNNE1QNFdfRFNJLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX0RTSSlcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKyBILjI2NCBUcmltbWluZyAgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rTVVMX1BQU19TUFM6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTVVMX1BQU19TUFMgb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIE00TVA0V19NVUxfUFBTX1NQUywgb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19EU0kpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKi0gSC4yNjQgVHJpbW1pbmcgICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFVua25vd24gb3B0aW9uICovCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgidHJ5aW5nIHRvIHNldCBhbiB1bmtub3duIG9wdGlvbiFcCi0gICAgICAgICAgICAgICAgIChvcHRpb25JRD0weCV4KSIsIG9wdGlvbklEKTsKLSAgICAgICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRXUklURVJfM0dQX3NldE9wdGlvbjogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9nZXRPcHRpb24oCi0gKiAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDMyIG9wdGlvbklELAotICogICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi0gKiBAYnJpZWYgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgd3JpdGVyIHRvIHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoCi0gKiAgICAgICAgICAgIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy8KLSAqICAgICAgICAgICAgZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgVGhlIG9wdGlvbnMgaGFuZGxlZCBieSB0aGUgY29tcG9uZW50IGRlcGVuZCBvbiB0aGUgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgb2YgdGhlIGNvbXBvbmVudC4KLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6ICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHBhcmFtICAgICBPcHRpb25JZDogICAgICAoSU4pIElkIG9mIHRoZSBvcHRpb24gdG8gZ2V0LgotICogQHBhcmFtICAgICBwT3B0aW9uVmFsdWU6IChPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24gdG8gZ2V0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBJRCBvZiB0aGUgb3B0aW9uIGlzIG5vdCB2YWxpZC4KLSAqIEByZXR1cm4gICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiBUaGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LgotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBnZXRPcHRpb24gKEl0cyBjb3JlSUQKLSAqICAgICAgICAgICAgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0T3B0aW9uKAotICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50MzIgb3B0aW9uSUQsCi0gICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0ID0KLSAgICAgICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRXUklURVJfM0dQX2dldE9wdGlvbjogcENvbnRleHQ9MHgleCwgb3B0aW9uSUQ9MHgleCxcCi0gICAgICAgICBvcHRpb25WYWx1ZT0weCV4IiwgcENvbnRleHQsIG9wdGlvbklELCBvcHRpb25WYWx1ZSk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfZ2V0T3B0aW9uOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzd2l0Y2ggKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIE1heGltdW0gQWNjZXNzIFVuaXQgc2l6ZSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhBVVNpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiZ2V0dGluZyBNNFdSSVRFUl9rTWF4QVVTaXplIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX2dldE9wdGlvbihhcENvbnRleHQtPnBNUDRDb250ZXh0LE00TVA0V19tYXhBVXNpemUsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24qKSZvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19nZXRPcHRpb24oTTRNUDRXX21heEFVc2l6ZSkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIGNodW5jayBzaXplICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa01heENodW5ja1NpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiZ2V0dGluZyBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19nZXRPcHRpb24oYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKikmb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfZ2V0T3B0aW9uKE00TVA0V19tYXhDaHVua1NpemUpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgVGhlIGZpbGUgc2l6ZSBvcHRpb24gKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rRmlsZVNpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiZ2V0dGluZyBNNFdSSVRFUl9rRmlsZVNpemUgb3B0aW9uIik7Ci0gICAgICAgICAgICAvKiBnZXQgdGhlIGN1cnJlbnQgZmlsZSBzaXplICovCi0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfZ2V0Q3VycmVudEZpbGVTaXplKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIChNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFRoZSBmaWxlIHNpemUgd2l0aCBhdWRpbyBvcHRpb24gaGFzIGl0cyBvd24gZnVuY3Rpb24gY2FsbAotICAgICAgICAgICAgICBpbiB0aGUgTVA0IGNvcmUgd3JpdGVyICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0ZpbGVTaXplQXVkaW9Fc3RpbWF0ZWQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiZ2V0dGluZyBNNFdSSVRFUl9rRmlsZVNpemVBdWRpb0VzdGltYXRlZCBvcHRpb24iKTsKLSAgICAgICAgICAgIC8qIGdldCB0aGUgY3VycmVudCBmaWxlIHNpemUgLi4uICovCi0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfZ2V0Q3VycmVudEZpbGVTaXplKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIChNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL25vIG1vcmUgbmVlZGVkIDNncCB3cml0ZXIgaGFzIGl0cyBvd24gbWVjYW5pc20KLSAgICAgICAgICAgIC8vLyogLi4uIGFkZCB0aGUgZXN0aW1hdGVkIG5leHQgbWF4IEFVIHNpemUgKi8KLSAgICAgICAgICAgIC8vKigoTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZSkgKz0gYXBDb250ZXh0LT5tYXhBVXNpemVzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBVbmtub3duIG9wdGlvbiAqLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoInRyeWluZyB0byBnZXQgYW4gdW5rbm93biBvcHRpb24hXAotICAgICAgICAgICAgICAgICAob3B0aW9uSUQ9MHgleCkiLCBvcHRpb25JRCk7Ci0gICAgICAgICAgICByZXR1cm4gICAgKE00T1NBX0VSUilNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00V1JJVEVSXzNHUF9nZXRPcHRpb246IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfc3RhcnRBVSgKLSAqICAgICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELAotICogICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotICogQGJyaWVmICAgICBQcmVwYXJlIGFuIEFjY2VzcyBVbml0IHRvIGJlIHJlYWR5IHRvIHN0b3JlIGRhdGEKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHBhcmFtICAgICBzdHJlYW1JRDogKElOKSBJZCBvZiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBBY2Nlc3MgVW5pdAotICogICAgICAgICAgICBpcyByZWxhdGVkLgotICogQHBhcmFtICAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgcHJlcGFyZWQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEFVIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6IHN0cmVhbUlEIGlzIG5vdCBWaWRlb1N0cmVhbUlEIG5vcgotICogICAgICAgICAgICBBdWRpb1N0cmVhbUlEIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBzdGFydEFVIChJdHMgY29yZUlECi0gKiAgICAgICAgICAgIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX3N0YXJ0QVUoCi0gICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELAotICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0ID0KLSAgICAgICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRXUklURVJfM0dQX3N0YXJ0QVU6IHBDb250ZXh0PTB4JXgsIHN0cmVhbUlEPSVkLCBwQVU9MHgleCIsCi0gICAgICAgICBwQ29udGV4dCwgc3RyZWFtSUQsIHBBVSk7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9zdGFydEFVOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBBVSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfc3RhcnRBVTogcEFVIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoCi0gICAgICAgICAoKFZpZGVvU3RyZWFtSUQgIT0gc3RyZWFtSUQpICYmIChBdWRpb1N0cmVhbUlEICE9IHN0cmVhbUlEKSksCi0gICAgICAgICBNNEVSUl9CQURfU1RSRUFNX0lELAotICAgICAgICAgIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IFdyb25nIHN0cmVhbUlEIik7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRoZSBNUDQgd3JpdGVyICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9zdGFydEFVOiBjYWxsaW5nIE00TVA0V19zdGFydEFVKCkiKTsKLSAgICBlcnIgPSBNNE1QNFdfc3RhcnRBVShhcENvbnRleHQtPnBNUDRDb250ZXh0LCBzdHJlYW1JRCwgcEFVKTsKLSAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3N0YXJ0QVUgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiQVU6IGRhdGFBZGRyZXNzPTB4JXgsIHNpemU9JWQiLAotICAgICAgICAgcEFVLT5kYXRhQWRkcmVzcywgcEFVLT5zaXplKTsKLQotICAgIC8qIENvbnZlcnQgb3ZlcnNpemUgdG8gYSByZXF1ZXN0IHRvd2FyZCBWRVMgYXV0b21hdG9uICovCi0gICAgaWYgKE00V0FSX01QNFdfT1ZFUlNJWkUgPT0gZXJyKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRXQVJfV1JJVEVSX1NUT1BfUkVROwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1Bfc3RhcnRBVTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9wcm9jZXNzQVUoCi0gKiAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAqICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLSAqIEBicmllZiAgICAgV3JpdGUgYW4gQWNjZXNzIFVuaXQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHBhcmFtICAgICBzdHJlYW1JRDogKElOKSBJZCBvZiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBBY2Nlc3MgVW5pdAotICogICAgICAgICAgICBpcyByZWxhdGVkLgotICogQHBhcmFtICAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgd3JpdHRlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBBVSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOiBzdHJlYW1JRCBpcyBub3QgVmlkZW9TdHJlYW1JRCBub3IKLSAqICAgICAgICAgICAgQXVkaW9TdHJlYW1JRCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgcHJvY2Vzc0FVCi0gKiAgICAgICAgICAgIChJdHMgY29yZUlEIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX3Byb2Nlc3NBVSgKLSAgICAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KiBhcENvbnRleHQgPQotICAgICAgICAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6ICIKLSAgICAgICAgICAgICAgICAgICAicENvbnRleHQ9MHgleCwgc3RyZWFtSUQ9JWQsIHBBVT0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHN0cmVhbUlELCBwQVUpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGFwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBBVSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBwQVUgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigKLSAgICAgICAgICgoVmlkZW9TdHJlYW1JRCAhPSBzdHJlYW1JRCkgJiYgKEF1ZGlvU3RyZWFtSUQgIT0gc3RyZWFtSUQpKSwKLSAgICAgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3Byb2Nlc3NBVTogV3Jvbmcgc3RyZWFtSUQiKTsKLQotICAgIE00T1NBX1RSQUNFM180KCJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBBVTogIgotICAgICAgICAgImRhdGFBZGRyZXNzPTB4JXgsIHNpemU9JWQsIENUUz0lZCwgbmJGcmFnPSVkIiwKLSAgICAgICAgIHBBVS0+ZGF0YUFkZHJlc3MsIHBBVS0+c2l6ZSwgKE00T1NBX1VJbnQzMilwQVUtPkNUUywgcEFVLT5uYkZyYWcpOwotCi0gICAgaWYocEFVLT5zaXplID4gYXBDb250ZXh0LT5tYXhBVXNpemVzKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5tYXhBVXNpemVzID0gcEFVLT5zaXplOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRoZSBNUDQgd3JpdGVyICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IGNhbGxpbmcgTTRNUDRXX3Byb2Nlc3NBVSgpIik7Ci0gICAgZXJyID0gTTRNUDRXX3Byb2Nlc3NBVShhcENvbnRleHQtPnBNUDRDb250ZXh0LCBzdHJlYW1JRCwgcEFVKTsKLSAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3Byb2Nlc3NBVSByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIC8qIENvbnZlcnQgb3ZlcnNpemUgdG8gYSByZXF1ZXN0IHRvd2FyZCBWRVMgYXV0b21hdG9uICovCi0gICAgaWYoTTRXQVJfTVA0V19PVkVSU0laRSA9PSBlcnIpCi0gICAgewotICAgICAgICBlcnIgPSBNNFdBUl9XUklURVJfU1RPUF9SRVE7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcygKLSAqICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gKiAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAqICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpCi0gKiBAYnJpZWYgICAgIEdldCB0aGUgM0dQUCB3cml0ZXIgY29tbW9uIGludGVyZmFjZQotICogQG5vdGUgICAgICBSZXRyaWV2ZXMgdGhlIHNldCBvZiBmdW5jdGlvbnMgbmVlZGVkIHRvIHVzZSB0aGUgM0dQUCB3cml0ZXIuCi0gKiAgICAgICAgICAgIEl0IGZvbGxvd3MgdGhlIGNvbW1vbiB3cml0ZXIgaW50ZXJmYWNlLgotICogQHBhcmFtICAgICBUeXBlOiAoT1VUKSByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyB3cml0ZXIuIFdpbGwgYWx3YXlzIGJlCi0gKiAgICAgICAgICAgIE00V1JJVEVSX2szR1BQLgotICogQHBhcmFtICAgICBTcmNHbG9iYWxJbnRlcmZhY2U6IChPVVQpIE1haW4gc2V0IG9mIGZ1bmN0aW9uIHRvIHVzZSB0aGlzCi0gKiAgICAgICAgICAgIDNHUFAgd3JpdGVyCi0gKiBAcGFyYW0gICAgIFNyY0RhdGFJbnRlcmZhY2U6ICAgKE9VVCkgU2V0IG9mIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gZGF0YXMKLSAqICAgICAgICAgICAgdG8gdXNlIHRoaXMgM0dQUCB3cml0ZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcygKLSAgICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpCi17Ci0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlICpwR2xvYmFsOwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UgKnBEYXRhOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiAiCi0gICAgICAgICAiVHlwZT0weCV4LCBTcmNHbG9iYWxJbnRlcmZhY2U9MHgleCxcCi0gICAgICAgICBTcmNEYXRhSW50ZXJmYWNlPTB4JXgiLCBUeXBlLCBTcmNHbG9iYWxJbnRlcmZhY2UsIFNyY0RhdGFJbnRlcmZhY2UpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IFR5cGUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2dldEludGVyZmFjZXM6IFR5cGUgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBTcmNHbG9iYWxJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2dldEludGVyZmFjZXM6IFNyY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IFNyY0RhdGFJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2dldEludGVyZmFjZXM6IFNyY0RhdGFJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogICAgU2V0IHRoZSBvdXRwdXQgdHlwZSAqLwotICAgICpUeXBlID0gTTRXUklURVJfazNHUFA7Ci0KLSAgICAvKioKLSAgICAgKiAgICBBbGxvY2F0ZSB0aGUgZ2xvYmFsIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KLSAgICBwR2xvYmFsID0gKE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIHNpemVvZihNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UpLAotICAgICAgICAgICAgICAgIE00V1JJVEVSXzNHUCwgKE00T1NBX0NoYXIgKikiTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEdsb2JhbCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJ1bmFibGUgdG8gYWxsb2NhdGUgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlLFwKLSAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgKlNyY0dsb2JhbEludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICpTcmNEYXRhSW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgQWxsb2NhdGUgdGhlIGRhdGEgaW50ZXJmYWNlIHN0cnVjdHVyZSAqLwotICAgIHBEYXRhID0KLSAgICAgICAgKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UpLAotICAgICAgICBNNFdSSVRFUl8zR1AsIChNNE9TQV9DaGFyICopIk00V1JJVEVSX0RhdGFJbnRlcmZhY2UiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRGF0YSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJ1bmFibGUgdG8gYWxsb2NhdGUgTTRXUklURVJfRGF0YUludGVyZmFjZSxcCi0gICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIGZyZWUocEdsb2JhbCk7Ci0gICAgICAgICpTcmNHbG9iYWxJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICAqU3JjRGF0YUludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIEZpbGwgdGhlIGdsb2JhbCBpbnRlcmZhY2Ugc3RydWN0dXJlICovCi0gICAgcEdsb2JhbC0+cEZjdE9wZW4gPSBNNFdSSVRFUl8zR1Bfb3BlbldyaXRlOwotICAgIHBHbG9iYWwtPnBGY3RBZGRTdHJlYW0gPSBNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOwotICAgIHBHbG9iYWwtPnBGY3RTdGFydFdyaXRpbmcgPSBNNFdSSVRFUl8zR1Bfc3RhcnRXcml0aW5nOwotICAgIHBHbG9iYWwtPnBGY3RDbG9zZVdyaXRlID0gTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU7Ci0gICAgcEdsb2JhbC0+cEZjdFNldE9wdGlvbiA9IE00V1JJVEVSXzNHUF9zZXRPcHRpb247Ci0gICAgcEdsb2JhbC0+cEZjdEdldE9wdGlvbiA9IE00V1JJVEVSXzNHUF9nZXRPcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiAgICBGaWxsIHRoZSBkYXRhIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KLSAgICBwRGF0YS0+cFN0YXJ0QVUgPSBNNFdSSVRFUl8zR1Bfc3RhcnRBVTsKLSAgICBwRGF0YS0+cFByb2Nlc3NBVSA9IE00V1JJVEVSXzNHUF9wcm9jZXNzQVU7Ci0KLSAgICAvKioKLSAgICAgKiAgICBTZXQgdGhlIHJldHVybiB2YWx1ZXMgKi8KLSAgICAqU3JjR2xvYmFsSW50ZXJmYWNlID0gcEdsb2JhbDsKLSAgICAqU3JjRGF0YUludGVyZmFjZSA9IHBEYXRhOwotCi0gICAgTTRPU0FfVFJBQ0UyXzAoIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfVXRpbHMuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19VdGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MmUyYWQwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19VdGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1V0aWxzLmMKLSAqIEBicmllZiAgIFV0aWxpdGllcyBhbmQgcHJpdmF0ZSBmdW5jdGlvbnMgZm9yIHRoZSBNUDQgd3JpdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZm5kZWYgX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIKLQotI2luY2x1ZGUgIk00TVA0V19VdGlscy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRNUDRXX1R5cGVzLmgiCi0KLSNkZWZpbmUgRVJSX0NIRUNLKGV4cCwgZXJyKSBpZiAoIShleHApKSB7IHJldHVybiBlcnI7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJ5dGUoTTRPU0FfVUNoYXIgYywgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gZmlsZUZ1bmN0aW9uLT53cml0ZURhdGEoY29udGV4dCwgKE00T1NBX01lbUFkZHI4KSZjLCAxKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfcHV0QkUxNihNNE9TQV9VSW50MzIgdmFsLCBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKSh2YWwgPj4gOCksIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcil2YWwsIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMjQoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikodmFsID4+IDE2KSwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKSh2YWwgPj4gOCksIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcil2YWwsIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMzIoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikodmFsID4+IDI0KSwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKSh2YWwgPj4gMTYpLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIEVSUl9DSEVDSyhlcnIgPT0gTTROT19FUlJPUiwgZXJyKTsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKHZhbCA+PiA4KSwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKXZhbCwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfcHV0QmxvY2soY29uc3QgTTRPU0FfVUNoYXIqIEJsb2NrLCBNNE9TQV9VSW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sIE00T1NBX0NvbnRleHQgY29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBmaWxlRnVuY3Rpb24tPndyaXRlRGF0YShjb250ZXh0LCAoTTRPU0FfTWVtQWRkcjgpQmxvY2ssIHNpemUpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNNE1QNFdfY29udmVydEludDMyQkUoTTRPU0FfVUludDMyKiB2YWxQdHIpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9VQ2hhciBhLCBiOwotICAgIE00T1NBX1VDaGFyKiBjID0gKE00T1NBX1VDaGFyKil2YWxQdHI7Ci0gICAgYSAgICAgICA9ICooYyk7Ci0gICAgYiAgICAgICA9ICooYysxKTsKLSAgICAqKGMpICAgPSAqKGMrMyk7Ci0gICAgKihjKzEpID0gKihjKzIpOwotICAgICooYysyKSA9IGI7Ci0gICAgKihjKzMpID0gYTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE00TVA0V190YWJsZTMyVG9CRShNNE9TQV9VSW50MzIqIHRhYiwgTTRPU0FfVUludDMyIG5iKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgZm9yIChpPTA7IGk8bmI7IGkrKykKLSAgICAgICAgTTRNUDRXX2NvbnZlcnRJbnQzMkJFKCYodGFiKVtpXSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCogTTRNUDRXX3JlYWxsb2MoTTRPU0FfTWVtQWRkcjMyIHB0ciwgTTRPU0FfVUludDMyIG9sZFNpemUsIE00T1NBX1VJbnQzMiBuZXdTaXplKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfTWVtQWRkcjMyIHB0cjIgPSAoTTRPU0FfTWVtQWRkcjMyKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhuZXdTaXplLCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicmVhbGxvYyIpOwotICAgIGlmIChNNE9TQV9OVUxMICE9IHB0cjIpCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKilwdHIyLCAodm9pZCAqKXB0ciwgb2xkU2l6ZSk7Ci0gICAgfQotICAgIGZyZWUocHRyKTsKLSAgICByZXR1cm4gcHRyMjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX2ZyZWVDb250ZXh0KE00T1NBX0NvbnRleHQgY29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIE00T1NBX1VJbnQzMiBpOwotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEqIG1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8qZnJlZUNvbnRleHQgaXMgbm93IGNhbGxlZCBhZnRlciBjbG9zZVdyaXRlKi8KLSAgICBFUlJfQ0hFQ0soIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX2Nsb3NlZCwgTTRFUlJfU1RBVEUpOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPSBNNE1QNFdfY2xvc2VkOwotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgLypkZWxldGUgYWxzbyBvdGhlciBjaHVua3MgaWYgYW55Ki8KLSAgICAgICAgLypmb3IgKGk9MDsgaTw9bU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKykqLwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgICAgIGZvciAoaT0wOyBpPD1tTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuazsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbaV0pOwotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBpZiAoKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuaykgJiYKLSAgICAgICAgICAgICAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdKSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAvKm5vdyBkeW5hbWljKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuaykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSk7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0cik7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qZGVsZXRlIGFsc28gb3RoZXIgY2h1bmtzIGlmIGFueSovCi0gICAgICAgIC8qZm9yIChpPTA7IGk8PW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKyspKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgICAgICBmb3IgKGk9MDsgaTw9bU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bms7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rW2ldKTsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgaWYgKChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmspICYmCi0gICAgICAgICAgICAgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgLypub3cgZHluYW1pYyovCi0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSk7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKm5vdyBkeW5hbWljKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0cik7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfVm9pZCBNNE1QNFdfcHV0MzJfSGkoTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQxNiBIaSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgICp0YWIgJj0gMHhGRkZGOwotICAgICp0YWIgfD0gSGk8PDE2OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX1ZvaWQgTTRNUDRXX3B1dDMyX0xvKE00T1NBX1VJbnQzMiogdGFiLCBNNE9TQV9VSW50MTYgTG8pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICAqdGFiICY9IDB4RkZGRjAwMDA7Ci0gICAgKnRhYiB8PSBMbzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9VSW50MTYgTTRNUDRXX2dldDMyX0hpKE00T1NBX1VJbnQzMiogdGFiKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgcmV0dXJuICgqdGFiID4+IDE2KSAmIDB4RkZGRjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9VSW50MTYgTTRNUDRXX2dldDMyX0xvKE00T1NBX1VJbnQzMiogdGFiKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgcmV0dXJuICp0YWIgJiAweEZGRkY7Ci19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19Xcml0ZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19Xcml0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2RmYzQ0MS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfV3JpdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1Mzc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1QNFdfV3JpdGVyLmMKLSAqIEBicmllZiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBjb3JlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZuZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0KLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRNUDRXX1dyaXRlci5oIgotI2luY2x1ZGUgIk00TVA0V19VdGlscy5oIgotCi0vKiBDaGVjayBvcHRpbWlzYXRpb24gZmxhZ3MgOiBCRUdJTiAqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0jZXJyb3IgIl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIF9NNE1QNFdfTU9PVl9GSVJTVCIKLQotI2VuZGlmCi0KLSNlbmRpZgotCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0jaWZuZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0jZXJyb3IgIl9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTyBzaG91bGQgYmUgdXNlZCB3aXRoIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FIgotCi0jZW5kaWYKLQotI2VuZGlmCi0vKiBDaGVjayBvcHRpbWlzYXRpb24gZmxhZ3MgOiBFTkQgKi8KLQotI2lmbmRlZiBfTTRNUDRXX0RPTlRfVVNFX1RJTUVfSAotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2VuZGlmIC8qX000TVA0V19ET05UX1VTRV9USU1FX0gqLwotCi0vKk1BQ1JPUyovCi0jZGVmaW5lIE1BSk9SX1ZFUlNJT04gMwotI2RlZmluZSBNSU5PUl9WRVJTSU9OIDMKLSNkZWZpbmUgUkVWSVNJT04gMAotCi0jZGVmaW5lIEVSUl9DSEVDSyhleHAsIGVycikgaWYgKCEoZXhwKSkgeyByZXR1cm4gZXJyOyB9Ci0jZGVmaW5lIENMRUFOVVBvbkVSUihmdW5jKSBpZiAoKGVyciA9IGZ1bmMpICE9IE00Tk9fRVJST1IpIGdvdG8gY2xlYW51cAotCi0jZGVmaW5lIG1heChhLGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKLQotLyoqKioqKioqKioqKioqKi8KLS8qU3RhdGljIGJsb2NrcyovCi0vKioqKioqKioqKioqKioqLwotCi0vKkNvbW1vbkJsb2NrcyovCi0KLWNvbnN0IE00T1NBX1VDaGFyIERlZmF1bHRfZnR5cCBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgJ2YnLCAndCcsICd5JywgJ3AnLCAnMycsICdnJywgJ3AnLCAnNycsIDB4MDAsIDB4MDAsCi0gICAgMHgwMywgMHgwMCwgJzMnLCAnZycsICdwJywgJzcnLCAnaScsICdzJywgJ28nLCAnbScKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMiBbXSA9Ci17Ci0gICAgJ20nLCAnZCcsICdhJywgJ3QnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazMgW10gPQotewotICAgICdtJywgJ28nLCAnbycsICd2JywgMHgwMCwgMHgwMCwgMHgwMCwgMHg2QywgJ20nLCAndicsICdoJywgJ2QnLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrNCBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMywgMHhFOAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s1IFtdID0KLXsKLSAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazYgW10gPQotewotICAgICd0JywgJ3InLCAnYScsICdrJywgMHgwMCwgMHgwMCwgMHgwMCwgMHg1QywgJ3QnLCAnaycsICdoJywgJ2QnLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDEKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrNyBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s3YmlzIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrOCBbXSA9Ci17Ci0gICAgJ20nLCAnZCcsICdpJywgJ2EnLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAnbScsICdkJywgJ2gnLCAnZCcsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s5IFtdID0KLXsKLSAgICAweDU1LCAweEM0LCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazEwIFtdID0KLXsKLSAgICAnbScsICdpJywgJ24nLCAnZicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsICdkJywgJ2knLCAnbicsICdmJywgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDFDLCAnZCcsICdyJywgJ2UnLCAnZicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgJ3UnLCAncicsICdsJywgJyAnLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDEKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMTEgW10gPQotewotICAgICdzJywgJ3QnLCAnYicsICdsJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2sxMiBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICd0JywgJ3MnLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBTYW1wbGVEZXNjcmlwdGlvbkhlYWRlciBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICdzJywgJ2QnLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBTYW1wbGVEZXNjcmlwdGlvbkVudHJ5U3RhcnQgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2sxNSBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICdzJywgJ3onLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazE2IFtdID0KLXsKLSAgICAncycsICd0JywgJ3MnLCAnYycsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMTcgW10gPQotewotICAgICdzJywgJ3QnLCAnYycsICdvJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQmxvY2tTaWduYXR1cmVTa2lwSGVhZGVyIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDVFLCAncycsICdrJywgJ2knLCAncCcKLX07Ci0vKiBkdWUgdG8gY3VycmVudCBsaW1pdGF0aW9ucywgc2l6ZSBtdXN0IGJlIDE2ICovCi1jb25zdCBNNE9TQV9VQ2hhciBCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcgW10gPQotewotICAgICdOJywgJ1gnLCAnUCcsICdTJywgJ1cnLCAnICcsICdDJywgJ0EnLCAnTScsICdDJywgJ08nLCAnUicsICdEJywgJ0UnLAotICAgICdSJywgJyAnCi19OwotLyogZm9sbG93cyB0aGUgdmVyc2lvbiAobGlrZSAiIDMuMC4yIiksIHRoZW4gIiAtLSAiICovCi0vKiBkdWUgdG8gY3VycmVudCBsaW1pdGF0aW9ucywgc2l6ZSBtdXN0IGJlIDYwICovCi1jb25zdCBNNE9TQV9VQ2hhciBCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0SW50ZWdyYXRpb25UYWcgW10gPQotewotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi19OwotCi0vKlZpZGVvQmxvY2tzKi8KLS8qIDMyMCoyNDAsIG5vdyBubyBsb25nZXIgaGFyZGNvZGVkICovCi0vKiBjb25zdCBNNE9TQV9VQ2hhciBWaWRlb0Jsb2NrMVtdID0KLSAgICB7IDB4MDEsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4MDAsIDB4MDAgfTsgKi8KLWNvbnN0IE00T1NBX1VDaGFyIFZpZGVvQmxvY2sxXzEgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjEsICdoJywgJ2QnLCAnbCcsICdyJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAndicsICdpJywgJ2QnLCAnZScsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUxIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBTYW1wbGVEZXNjcmlwdGlvbkVudHJ5VmlkZW9Cb2lsZXJwbGF0ZTIgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4RkYsIDB4RkYKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIFZpZGVvQmxvY2s0IFtdID0KLXsKLSAgICAncycsICd0JywgJ3MnLCAncycsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07IC8qU1RTUyovCi0KLWNvbnN0IE00T1NBX1VDaGFyIFZpZGVvQmxvY2s1IFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDE0LCAndicsICdtJywgJ2gnLCAnZCcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgVmlkZW9SZXNvbHV0aW9ucyBbXSA9Ci17Ci0gICAgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMAotfTsKLQotLypNcDR2QmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIE1wNHZCbG9jazEgW10gPQotewotICAgICdtJywgJ3AnLCAnNCcsICd2JwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgTXA0dkJsb2NrMyBbXSA9Ci17Ci0gICAgMHgyMCwgMHgxMQotfTsKLQotLypIMjYzQmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIEgyNjNCbG9jazEgW10gPQotewotICAgICdzJywgJzInLCAnNicsICczJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgSDI2M0Jsb2NrMiBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRiwgJ2QnLCAnMicsICc2JywgJzMnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBIMjYzQmxvY2syX2JpdHIgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUYsICdkJywgJzInLCAnNicsICczJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgSDI2M0Jsb2NrMyBbXSA9Ci17Ci0gICAgJ1AnLCAnSCcsICdMJywgJ1AnLCAweDAwLCAweDBBLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBIMjYzQmxvY2s0IFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDEwLCAnYicsICdpJywgJ3QnLCAncicKLX07Ci0KLS8qSDI2NEJsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBIMjY0QmxvY2sxIFtdID0KLXsKLSAgICAnYScsICd2JywgJ2MnLCAnMScKLX07Ci0KLS8qIFN0b3JlIHRoZSBhdmNDIGZpZWxkLCB0aGUgdmVyc2lvbiAoPTEpLAotICAgIHRoZSBwcm9maWxlICg9NjYpLCB0aGUgY29tcGF0aWJpbGl0eSAoPTApLCAqLwotCi0vKiB0aGUgbGV2ZWwgKD0xMCksMTExMTExICsgTkFMIGZpZWxkIFNpemUgKD0gNCAtIDEpLAotICAgIDExMSArIG51bWJlciBvZiBQUFMgKD0xKSAqLwotCi1jb25zdCBNNE9TQV9VQ2hhciBIMjY0QmxvY2syIFtdID0KLXsKLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBoYXJkY29kZWQgRFNJIHZhbHVlcyBvZiBIMjY0QmxvY2syCi0gICAgICAgICdhJyAsICd2JyAsICdjJyAsICdDJwotfTsKLQotLypBTVJCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgQU1SQmxvY2sxIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBTVJCbG9jazFfMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgJ2gnLCAnZCcsICdsJywgJ3InLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsICdzJywgJ28nLCAndScsICduJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBdWRpb1NhbXBsZURlc2NFbnRyeUJvaWxlcnBsYXRlIFtdID0KLXsKLSAgICAweDAwLCAweDAyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBTVJEU0lIZWFkZXIgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsICdkJywgJ2EnLCAnbScsICdyJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQU1SRGVmYXVsdERTSSBbXSA9Ci17Ci0gICAgJ1AnLCAnSCcsICdMJywgJ1AnLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAxCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBTVJCbG9jazQgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsICdzJywgJ20nLCAnaCcsICdkJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwCi19OwotCi0vKkFNUjhCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgQU1SOEJsb2NrMSBbXSA9Ci17Ci0gICAgJ3MnLCAnYScsICdtJywgJ3InCi19OwotCi0vKkFNUjE2QmxvY2tzKi8KLS8qY29uc3QgTTRPU0FfVUNoYXIgQU1SMTZCbG9jazFbXSA9IHsgJ3MnLCAnYScsICd3JywgJ2InfTsqLwotCi0vKkFBQ0Jsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBBQUNCbG9jazEgW10gPQotewotICAgICdtJywgJ3AnLCAnNCcsICdhJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQUFDQmxvY2syIFtdID0KLXsKLSAgICAweDQwLCAweDE1Ci19OwotCi0vKk1QRUdDb25maWdCbG9ja3MgKEFBQyAmIE1QNFYpKi8KLWNvbnN0IE00T1NBX1VDaGFyIE1QRUdDb25maWdCbG9jazAgW10gPQotewotICAgICdlJywgJ3MnLCAnZCcsICdzJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgTVBFR0NvbmZpZ0Jsb2NrMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgTVBFR0NvbmZpZ0Jsb2NrMiBbXSA9IHsgMHgwNSB9OwotY29uc3QgTTRPU0FfVUNoYXIgTVBFR0NvbmZpZ0Jsb2NrMyBbXSA9Ci17Ci0gICAgMHgwNiwgMHgwMSwgMHgwMgotfTsKLQotLypFVlJDQmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIEVWUkNCbG9jazNfMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgJ2QnLCAnZScsICd2JywgJ2MnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBFVlJDQmxvY2szXzIgW10gPQotewotICAgICdQJywgJ0gnLCAnTCcsICdQJywgMHgwMCwgMHgwMAotfTsKLQotLypFVlJDOEJsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBFVlJDOEJsb2NrMSBbXSA9Ci17Ci0gICAgJ3MnLCAnZScsICd2JywgJ2MnCi19OwotCi0vKioqKioqKioqKiovCi0vKiBNZXRob2RzICovCi0vKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19nZXRWZXJzaW9uKE00T1NBX1VJbnQ4ICptYWpvciwgTTRPU0FfVUludDggKm1pbm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpyZXZpc2lvbiApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBtYWpvciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBtaW5vciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSByZXZpc2lvbiwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgICptYWpvciA9IE1BSk9SX1ZFUlNJT047Ci0gICAgKm1pbm9yID0gTUlOT1JfVkVSU0lPTjsKLSAgICAqcmV2aXNpb24gPSBSRVZJU0lPTjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19TVFRTX0FMTE9DX1NJWkU7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19TVFNaX0FMTE9DX1NJWkU7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19TVFNTX0FMTE9DX1NJWkU7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19DSFVOS19BTExPQ19OQjsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05COwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLS8qIHN0c2NbIF0gdGFibGUgaXMgc3BsaXR0ZWQgYXQgMTIgYml0cyAqLwotI2RlZmluZSBNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSyA0MDk1IC8qIDA9bm90dXNlZCAqLwotCi0jZWxzZQotI2RlZmluZSBNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSyAxMCAgIC8qIDA9bm90dXNlZCAqLwotCi0jZW5kaWYKLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1NNE9TQV9FUlIgTTRNUDRXX2luaXRpYWxpemVBbGxvY2F0aW9uUGFyYW1ldGVycyhNNE1QNFdfTXA0RmlsZURhdGEgKlB0ciApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgTTRPU0FfVUludDMyIG1heE1lbW9yeSwgdmVzTWVtb3J5OwotICAgIE00T1NBX1VJbnQzMiBuYlZpZGVvRnJhbWVzLCBuYkF1ZGlvRnJhbWVzOwotICAgIE00T1NBX1VJbnQzMiBhdmVyYWdlVmlkZW9DaHVuazsKLQotICAgIC8qLS0tLS0tLS0tLS0qLwotICAgIC8qIE5CX0ZSQU1FUyAqLwotICAgIC8qLS0tLS0tLS0tLS0qLwotCi0gICAgLyogbWFnaWNhbCBmb3JtdWxhIDogbWVtb3J5ID0gdmVzTWVtb3J5ICsgMTIgKiBmcmFtZXJhdGUgKiBkdXJhdGlvbiAqLwotCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0KLSAgICB2ZXNNZW1vcnkgPSAweDMyMDAwOyAvKiAyMDAga0IgKi8KLQotI2Vsc2UKLQotICAgIHZlc01lbW9yeSA9IDB4M0U4MDA7IC8qIDI1MCBrQiAqLwotCi0jZW5kaWYKLQotI2RlZmluZSBWSURFT19QT09MX01FTU9SWSAxMDAwMDAwCi0KLSAgICBtYXhNZW1vcnkgPSBWSURFT19QT09MX01FTU9SWTsKLQotICAgIGlmIChtYXhNZW1vcnkgPCB2ZXNNZW1vcnkpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIG5iVmlkZW9GcmFtZXMgPSAoIG1heE1lbW9yeSAtIHZlc01lbW9yeSkgLyAxMjsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFc6ICVkIGltYWdlcyBtYXgiLCBuYlZpZGVvRnJhbWVzKTsKLQotICAgIC8qIFZJREVPICovCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0gICAgLyogYXNzdW1lIGFuIGF2ZXJhZ2Ugb2YgMjUgZnBjIDogcmVmZXJlbmNlID0gMTUgZnBzICogMnMgKiAwLjggKi8KLQotICAgIGF2ZXJhZ2VWaWRlb0NodW5rID0gMjUwMDsKLQotI2Vsc2UKLQotICAgIGlmIChNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSyA+IDApCi0gICAgewotICAgICAgICBhdmVyYWdlVmlkZW9DaHVuayA9IDEwMCAqIE00TVA0V19WSURFT19NQVhfQVVfUEVSX0NIVU5LIC0gMjAKLSAgICAgICAgICAgICogKE00TVA0V19WSURFT19NQVhfQVVfUEVSX0NIVU5LIC0gMSk7IC8qIG1hcmdpbiAyMCUgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogYXNzdW1lIGFuIGF2ZXJhZ2Ugb2YgNTAgZnBjICovCi0gICAgICAgIGF2ZXJhZ2VWaWRlb0NodW5rID0gNTAwMDsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgTTRNUDRXX1NUVFNfQUxMT0NfU0laRSA9IG5iVmlkZW9GcmFtZXMgKiBzaXplb2YoTTRPU0FfVUludDMyKTsKLSAgICBNNE1QNFdfU1RTWl9BTExPQ19TSVpFID0gbmJWaWRlb0ZyYW1lcyAqIHNpemVvZihNNE9TQV9VSW50MTYpOwotICAgIE00TVA0V19TVFNTX0FMTE9DX1NJWkUgPSBuYlZpZGVvRnJhbWVzICogc2l6ZW9mKAotICAgICAgICBNNE9TQV9VSW50MzIpOyAvKiB2ZXJ5IGNvbnNlcnZhdGl2ZSAoYWxsIGltYWdlcyBhcmUgaW50cmEpICovCi0KLSAgICBNNE1QNFdfQ0hVTktfQUxMT0NfTkIgPSAoIG5iVmlkZW9GcmFtZXMgKiAxMDApIC8gYXZlcmFnZVZpZGVvQ2h1bmsgKyAxOwotCi0gICAgLyogQVVESU8gKi8KLQotICAgIG5iQXVkaW9GcmFtZXMgPSBuYlZpZGVvRnJhbWVzOwotICAgIC8qIGF1ZGlvIGlzIDUgZnBzLCB3aGljaCBpcyB0aGUgc21hbGxlc3QgZnJhbWVyYXRlIGZvciB2aWRlbyAqLwotCi0gICAgTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSA9IDEwMDsgLyogY29tcHJlc3NlZCAqLwotICAgIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUgPSAxMDA7IC8qIGNvbXByZXNzZWQgKi8KLQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CID0gbmJBdWRpb0ZyYW1lcyAvIDEwICsgMTsKLQotI2Vsc2UKLQotICAgIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQiA9IG5iQXVkaW9GcmFtZXMgLyAzOCArIDE7Ci0KLSNlbmRpZgotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSNlbHNlCi0KLSAgICAvKiBWSURFTyA1IG1pbiBhdCAyNSBmcHMgbnVsbC1lbmMgKi8KLQotICAgIE00TVA0V19TVFRTX0FMTE9DX1NJWkUgPSAyMDAwMDsKLSAgICBNNE1QNFdfU1RTWl9BTExPQ19TSVpFID0gMTgwMDA7Ci0gICAgTTRNUDRXX1NUU1NfQUxMT0NfU0laRSA9IDUwMDA7Ci0gICAgTTRNUDRXX0NIVU5LX0FMTE9DX05CID0gNTAwOwotCi0gICAgLyogQVVESU8gMiBtaW4gYWFjKyBudWxsLWVuYyAqLwotCi0gICAgTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSA9IDMyMDAwOwotICAgIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUgPSAyMDAwMDsKLSAgICBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIgPSAxMDAwOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfb3BlbldyaXRlKE00T1NBX0NvbnRleHQgKmNvbnRleHRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvdXRwdXRGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyICpmaWxlV3JpdGVyRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0ZW1wRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKmZpbGVSZWFkZXJGdW5jdGlvbiApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IE00T1NBX05VTEw7Ci0KLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBjb250ZXh0UHRyLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IG91dHB1dEZpbGVEZXNjcmlwdG9yLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IGZpbGVXcml0ZXJGdW5jdGlvbiwgTTRFUlJfUEFSQU1FVEVSKTsKLSNpZmRlZiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgIC8qIE9wdGlvbmFsLCBmZWF0dXJlIHdvbid0IGJlIHVzZWQgaWYgTlVMTCAqLwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoInRlbXBGaWxlRGVzY3JpcHRvciA9ICVwIiwgdGVtcEZpbGVEZXNjcmlwdG9yKTsKLQotICAgIGlmIChNNE9TQV9OVUxMID09IHRlbXBGaWxlRGVzY3JpcHRvcikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgInRlbXBGaWxlRGVzY3JpcHRvciBpcyBOVUxMLCBSRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgZmVhdHVyZSBub3QgdXNlZCIpOwotICAgIH0KLQotI2Vsc2UgLyogX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgKi8KLSAgICAvKiBOb3QgdXNlZCA6IEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IHRlbXBGaWxlRGVzY3JpcHRvciwgTTRFUlJfUEFSQU1FVEVSKTsgKi8KLSNlbmRpZiAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotICAgIC8qIE5vdCB1c2VkIDogRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gZmlsZVJlYWRlckZ1bmN0aW9uLCBNNEVSUl9QQVJBTUVURVIpOyAqLwotCi0gICAgLyogVGhlIGNvbnRleHQgcmV1c2UgbW9kZSB3YXMgc3VwcHJlc3NlZCovCi0KLSAgICBtTXA0RmlsZURhdGFQdHIgPQotICAgICAgICAoTTRNUDRXX01wNEZpbGVEYXRhICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE1QNFdfTXA0RmlsZURhdGEpLAotICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopIk1QNCB3cml0ZXIgY29udGV4dCIpOwotICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHIgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+dXJsID0gb3V0cHV0RmlsZURlc2NyaXB0b3I7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyID0gTTRPU0FfTlVMTDsKLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPSBNNE9TQV9OVUxMOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4Q2h1bmtTaXplID0gTTRNUDRXX0RlZmF1bHRNYXhDaHVua1NpemU7IC8qZGVmYXVsdCAgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPk1heEFVU2l6ZSA9IE00TVA0V19EZWZhdWx0TWF4QXVTaXplOyAgICAgICAvKmRlZmF1bHQgICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyID0KLSAgICAgICAgTTRNUDRXX0RlZmF1bHRJbnRlcmxlYXZlRHVyOyAvKmRlZmF1bHQgPSAwLCBpLmUuIG5vdCB1c2VkKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplID0gMDsgLypkZWZhdWx0ID0gMCwgaS5lLiBub3QgdXNlZCovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb24gPSAwOyAvKmRlZmF1bHQgaXMgIiAwLjAuMCIqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPQotICAgICAgICBNNE9TQV9OVUxMOyAvKmRlZmF1bHQgaXMgaW4gQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEVtYmVkZGVkU3RyaW5nICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9IE00T1NBX05VTEw7IC8qZGVmYXVsdCBpcyAwICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlRHVyYXRpb24gPSAwOyAvKmRlZmF1bHQgPSAwLCBpLmUuIG5vdCB1c2VkKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucyA9IGZpbGVXcml0ZXJGdW5jdGlvbjsKLSAgICBtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9IE00T1NBX0ZBTFNFOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPSBNNE1QNFdfb3BlbmVkOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZHVyYXRpb24gPSAwOyAvKmkqLwotICAgIC8qcGF0Y2ggZm9yIGludGVncmF0aW9uVGFnIDE3NCAtPiAyMzggKCs2NCkqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgPQotICAgICAgICAyMzg7IC8qaW5pdGlhbGl6YXRpb24gd2l0aCBjb25zdGFudCBwYXJ0IGluIGZ0eXArbWRhdCttb292K3NraXAqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9IE00T1NBX0ZBTFNFOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc0NodW5rRHVyID0KLSAgICAgICAgMDsgLypzZXQgYW5kIHVzZWQgb25seSB3aGVuIGVzdGltYXRlQXVkaW9TaXplIGlzIHRydWUqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc1N0b3BUaW1lID0KLSAgICAgICAgMDsgLypzZXQgYW5kIHVzZWQgb25seSB3aGVuIGVzdGltYXRlQXVkaW9TaXplIGlzIHRydWUqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgdHJpbW1pbmcgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmJNVUxQUFNTUFMgPSBNNE9TQV9GQUxTRTsKLSAgICAvKiAtIENSTFY2Nzc1IC1ILjI2NCB0cmltbWluZyAqLwotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgPQotICAgICAgICAzMjsgLyppbml0IHdpdGggZnR5cCArIGJlZ2lubmluZyBvZiBtZGF0IHNpemUqLwotCi0jZW5kaWYKLQotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPnNhZmV0eUZpbGVVcmwgPSB0ZW1wRmlsZURlc2NyaXB0b3I7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUgPQotICAgICAgICBNNE9TQV9GQUxTRTsgLyogTm8gbmVlZCB0byBjbGVhbiBpdCBqdXN0IHlldC4gKi8KLQotI2VuZGlmICAgICAgICAgICAgICAgLyogX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgKi8KLQotICAgIC8qIGZ0eXAgYXRvbSAqLwotCi0gICAgbWVtc2V0KCh2b2lkICopICZtTXA0RmlsZURhdGFQdHItPmZ0eXAsMCwKLSAgICAgICAgc2l6ZW9mKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cCkpOwotCi0gICAgKmNvbnRleHRQdHIgPSBtTXA0RmlsZURhdGFQdHI7Ci0KLSAgICBNNE1QNFdfaW5pdGlhbGl6ZUFsbG9jYXRpb25QYXJhbWV0ZXJzKG1NcDRGaWxlRGF0YVB0cik7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfYWRkU3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uICpzdHJlYW1EZXNjUHRyICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLQotICAgIEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBFUlJfQ0hFQ0soKCBtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19vcGVuZWQpCi0gICAgICAgIHx8IChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19yZWFkeSksIE00RVJSX1NUQVRFKTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnN0YXRlID0gTTRNUDRXX3JlYWR5OwotCi0gICAgc3dpdGNoIChzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICBjYXNlIE00U1lTX2tBQUM6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0VWUkM6Ci0gICAgICAgICAgICAvKkF1ZGlvKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5zdHJlYW1JRCA9PSBBdWRpb1N0cmVhbUlELAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYW4gYXVkaW8gdHJhY2sgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCovCi0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSwKLSAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCk7Ci0KLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYWxsb2MgbmVlZCB0byBiZSBkb25lKi8KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPSAoTTRNUDRXX0F1ZGlvVHJhY2tEYXRhCi0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE1QNFdfQXVkaW9UcmFja0RhdGEpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopIk00TVA0V19BdWRpb1RyYWNrRGF0YSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBXZSBtdXN0IGluaXQgdGhlc2UgcG9pbnRlcnMgaW4gY2FzZSBhbiBhbGxvYyBiZWxsb3cgZmFpbHMgKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKm5vdyBkeW5hbWljKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5DaHVuayIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVUNoYXIgKiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Q2h1bmsiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcyA9IDE7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA0MDI7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhDaHVua1NpemU7IC8qIGluaXQgdmFsdWUgKi8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heEFVU2l6ZTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlID0KLSAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT50aW1lU2NhbGU7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlWzBdID0gMDsgICAgIC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVswXSA9IDA7IC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGVbMF0gPSAwOyAgIC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayA9Ci0gICAgICAgICAgICAgICAgMDsgLyoxc3QgY2h1bmsgaXMgQ2h1bmtbMF0qLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zID0gMDsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjID0gMDsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V19yZWFkeTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlID0KLSAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+bWF4Qml0cmF0ZTsKLQotICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUikKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFNZU19rQU1SOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT50aW1lU2NhbGUgPT0gODAwMCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgMTYwOyAvKkFNUjgrdGltZXNjYWxlPTgwMDAgPT4gc2FtcGxlIGR1cmF0aW9uIDE2MCBjb25zdGFudCovCi0KLSAgICAgICAgICAgICAgICAvKlVzZSBnaXZlbiBEU0kgaWYgcGFzc2VkLCBlbHNlIHVzZSBkZWZhdWx0IHZhbHVlKi8KLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qYW1yIERTSSBpcyA5IGJ5dGVzIGxvbmcgISovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICA5OyAvKmFsd2F5cyA5IGZvciBhbXIqLwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPT0gOSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg5LCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICA5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsgLypkZWZhdWx0IHN0YXRpYyBibG9jayB3aWxsIGJlIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgMDsgLypidXQgdGhlIGFjdHVhbCBzdGF0aWMgZHNpIGlzIDkgYnl0ZXMgISovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtRGVzY1B0ci0+c3RyZWFtVHlwZSA9PSBNNFNZU19rRVZSQykKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+dGltZVNjYWxlID09IDgwMDAsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIDE2MDsgLypFVlJDK3RpbWVzY2FsZT04MDAwID0+IHNhbXBsZSBkdXJhdGlvbiAxNjAgY29uc3RhbnQqLwotCi0gICAgICAgICAgICAgICAgLypVc2UgZ2l2ZW4gRFNJIGlmIHBhc3NlZCwgZWxzZSB1c2UgZGVmYXVsdCB2YWx1ZSovCi0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKmV2cmMgRFNJIGlzIDYgYnl0ZXMgbG9uZyAhKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDY7IC8qYWx3YXlzIDYgZm9yIGV2cmMqLwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPT0gNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg2LCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICA2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsgLypkZWZhdWx0IHN0YXRpYyBibG9jayB3aWxsIGJlIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgMDsgLypidXQgdGhlIGFjdHVhbCBzdGF0aWMgZHNpIGlzIDYgYnl0ZXMgISovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKk00U1lTX2tBQUMqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qYXZnIGJpdHJhdGUgc2hvdWxkIGJlIHNldCovCi0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlICE9IC0xLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5tYXhCaXRyYXRlICE9IC0xLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00U1lTX2tBQUM7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIDA7IC8qZG9uJ3Qga25vdyBmb3IgYWFjLCBzbyBzZXQgMCovCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0KLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKm5vIGRzaTogcmV0dXJuIGJhZCBwYXJhbWV0ZXIgPyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNFNZU19rTVBFR180KToKLSAgICAgICAgY2FzZSAoTTRTWVNfa0gyNjQpOgotICAgICAgICBjYXNlIChNNFNZU19rSDI2Myk6Ci0gICAgICAgICAgICAvKlZpZGVvKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5zdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlELAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYSB2aWRlbyB0cmFjayBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX0ZBTFNFLAotICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhUKTsKLQotICAgICAgICAgICAgLypjaGVjayBpZiBhbGxvYyBuZWVkIHRvIGJlIGRvbmUqLwotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9IChNNE1QNFdfVmlkZW9UcmFja0RhdGEKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00TVA0V19WaWRlb1RyYWNrRGF0YSksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiTTRNUDRXX1ZpZGVvVHJhY2tEYXRhIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFdlIG11c3QgaW5pdCB0aGVzZSBwb2ludGVycyBpbiBjYXNlIGFuIGFsbG9jIGJlbGxvdyBmYWlscyAqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1ogPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgLypub3cgZHluYW1pYyovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUNoYXIgKiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+Q2h1bmsiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSNlbHNlCi0gICAgICAgICAgICAgICAgLypyZS11c2UgdGhlIHNhbWUgY2h1bmsgYW5kIGZsdXNoIGl0IHdoZW4gZnVsbCovCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1VDaGFyICopLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkNodW5rIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00TVA0V19UaW1lMzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00TVA0V19UaW1lMzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rID0gMDsKLSAgICAgICAgICAgICAgICAvKnRhYmxlcyBhcmUgbm93IGR5bmFtaWMqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX1NUVFNfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcyA9IDE7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX1NUU1pfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaIik7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1ogPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFNaX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiIpOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1oKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgPSAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX1NUU1NfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gNDYyOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT53aWR0aCA9IE00TVA0V19EZWZhdWx0V2lkdGg7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmhlaWdodCA9IE00TVA0V19EZWZhdWx0SGVpZ2h0OwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVVNpemUgPQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4QVVTaXplOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZSA9Ci0gICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+c3RyZWFtVHlwZTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heENodW5rU2l6ZTsgLyogaW5pdCB2YWx1ZSAqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVwZXJDaHVuayA9Ci0gICAgICAgICAgICAgICAgTTRNUDRXX1ZJREVPX01BWF9BVV9QRVJfQ0hVTks7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+dGltZVNjYWxlID09IDEwMDAsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlID0gMTAwMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlWzBdID0gMDsgICAgIC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVswXSA9IDA7IC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGVbMF0gPSAwOyAgIC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuayA9Ci0gICAgICAgICAgICAgICAgMDsgLyoxc3QgY2h1bmsgaXMgQ2h1bmtbMF0qLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zID0gMDsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjID0gMDsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYiA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfcmVhZHk7Ci0KLSAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlID09IE00U1lTX2tIMjYzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoIHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlID09IC0xKQotICAgICAgICAgICAgICAgICAgICB8fCAoc3RyZWFtRGVzY1B0ci0+bWF4Qml0cmF0ZSA9PSAtMSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKnRoZSBiaXRyYXRlIHdpbGwgbm90IGJlIHdyaXR0ZW4gaWYgdGhlIGJpdHJhdGUgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBmdWxseSBzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSA9IC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKnByb3ByaWV0YXJ5IHN0b3JhZ2Ugb2YgaDI2MyBiaXRyYXRlLgotICAgICAgICAgICAgICAgICAgICAgV2FybmluZzogbm90IHRoZSBhY3R1YWwgYml0cmF0ZSAoYml0IHNldCB0byAxKS4qLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5tYXhCaXRyYXRlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICgoIDAgIT0gc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypkZWNvZGVyIHNwZWNpZmljIGluZm8gc2l6ZSBpcyBzdXBwb3NlZCB0byBiZSBhbHdheXMgNyBieXRlcyBsb25nICovCi0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9PSA3LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyp1c2UgdGhlIGRlZmF1bHQgZHNpKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGUgPT0gTTRTWVNfa01QRUdfNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDIyOyAvKmV4dHJhIGJ5dGVzIChmcm9tIGgyNjMpKi8KLSAgICAgICAgICAgICAgICAvKiBhbGxvdyBEU0kgdG8gYmUgTTRPU0FfTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGUgYWN0dWFsIERTSSB3aWxsIGJlCi0gICAgICAgICAgICAgICAgIHNldCBieSBzZXRPcHRpb24uICovCi0gICAgICAgICAgICAgICAgaWYgKCggMCA9PSBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTVA0ViBzcGVjaWZpYyovCi0gICAgICAgICAgICAgICAgICAgIC8qZGVjb2RlciBzcGVjaWZpYyBpbmZvIHNpemUgaXMgc3VwcG9zZWQgdG8gYmUgYWx3YXlzIDwKLSAgICAgICAgICAgICAgICAgICAgICAgIDEwNSBzbyB0aGF0IEVTRCBzaXplIGNhbiBiZSBjb2RlZCB3aXRoIDEgYnl0ZSovCi0gICAgICAgICAgICAgICAgICAgIC8qKHRoaXMgc2hvdWxkIG5vdCBiZSByZXN0cmljdGl2ZSBiZWNhdXNlIGRzaSBpcyBhbHdheXMgc2hvcnRlciAhKSovCi0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA8IDEwNSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKmF2ZyBiaXRyYXRlIHNob3VsZCBiZSBzZXQqLwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZSAhPSAtMSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1heEJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGUgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogSDI2NCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPm1heEJpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKDAgIT0gc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogKyBILjI2NCB0cmltbWluZyAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfVFJVRSA9PSBtTXA0RmlsZURhdGFQdHItPmJNVUxQUFNTUFMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiBTUFNMZW5ndGgsIFBQU0xlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiAqRFNJOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgdGhlIERTSSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIERTSSAoU1BTICsgUFBTKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBEU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICAgICAgICAgICAgICAgICAgU1BTTGVuZ3RoID0gRFNJWzZdOwotICAgICAgICAgICAgICAgICAgICAgICAgUFBTTGVuZ3RoID0gRFNJWzEwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChzdHJlYW1EZXNjUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvKSsxMiksIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSkrMiksICh2b2lkICopKChzdHJlYW1EZXNjUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvKSsyOCksIFNQU0xlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0kpKzIgKyBTUFNMZW5ndGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChzdHJlYW1EZXNjUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvKSsyMCksIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSkrNCArIFNQU0xlbmd0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoKHN0cmVhbURlc2NQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJTcGVjaWZpY0luZm8pKzI4ICsgU1BTTGVuZ3RoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUFNMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogLSBILjI2NCB0cmltbWluZyAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgdGhlIERTSSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgRFNJIChTUFMgKyBQUFMpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qdXNlIHRoZSBkZWZhdWx0IGRzaSovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19zdGFydFdyaXRpbmcoIE00T1NBX0NvbnRleHQgY29udGV4dCApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MgPSBNNE9TQV9rRmlsZVdyaXRlIHwgTTRPU0Ffa0ZpbGVDcmVhdGU7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19yZWFkeSksIE00RVJSX1NUQVRFKTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnN0YXRlID0gTTRNUDRXX3dyaXRpbmc7Ci0KLSAgICAvKmF1ZGlvIG1pY3Jvc3RhdGUgKi8KLSAgICAvKiAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyICE9IE00T1NBX05VTEwpKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbykKLSAgICB7Ci0gICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlID09IE00TVA0V19yZWFkeSksCi0gICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V193cml0aW5nOwotCi0gICAgICAgIC8qIEZpcnN0IGF1ZGlvIGNodW5rIGFsbG9jYXRpb24gKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCi0gICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPkNodW5rWzBdIik7Ci0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgfQotCi0gICAgLyp2aWRlbyBtaWNyb3N0YXRlKi8KLSAgICAvKiAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyICE9IE00T1NBX05VTEwpKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbykKLSAgICB7Ci0gICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID09IE00TVA0V19yZWFkeSksCi0gICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V193cml0aW5nOwotCi0gICAgICAgIC8qIEZpcnN0IHZpZGVvIGNodW5rIGFsbG9jYXRpb24gKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCi0gICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkNodW5rWzBdIik7Ci0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgfQotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIC8qc2V0IGF1ZGlvTXNDaHVua0R1ciAoZHVyYXRpb24gaW4gbXMgYmVmb3JlIGEgbmV3IGNodW5rIGlzIGNyZWF0ZWQpCi0gICAgICAgICBmb3IgYXVkaW8gc2l6ZSBlc3RpbWF0aW9uKi8KLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8sIE00RVJSX0JBRF9DT05URVhUKTsKLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8sIE00RVJSX0JBRF9DT05URVhUKTsKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNDaHVua0R1ciA9Ci0gICAgICAgICAgICAyMCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplCi0gICAgICAgICAgICAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplOwotCi0gICAgICAgIGlmICgoIG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciAhPSAwKQotICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1cgotICAgICAgICAgICAgPCAyMCAqbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUKLSAgICAgICAgICAgIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNDaHVua0R1ciA9IG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1cjsKLSAgICAgICAgfQotICAgIH0KLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgIC8qb3BlbiBmaWxlIGluIHdyaXRlIGJpbmFyeSBtb2RlKi8KLQotICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+b3BlbldyaXRlKAotICAgICAgICAmbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT51cmwsIGZpbGVNb2RlQWNjZXNzKTsKLSAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLQotICAgIC8qZnR5cCBhdG9tKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1ham9yX2JyYW5kICE9IDApCi0gICAgewotICAgICAgICAvKiBQdXQgY3VzdG9taXplZCBmdHlwIGJveCAqLwotICAgICAgICBlcnIgPQotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIoMTYgKyAobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kcyAqIDQpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QkUzMihNNE1QQUNfRlRZUF9UQUcsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgICAgIGVyciA9IE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5tYWpvcl9icmFuZCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotICAgICAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLSAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1pbm9yX3ZlcnNpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtTXA0RmlsZURhdGFQdHItPmZ0eXAubmJDb21wYXRpYmxlQnJhbmRzOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmZ0eXAuY29tcGF0aWJsZV9icmFuZHNbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotICAgICAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUHV0IGRlZmF1bHQgZnR5cCBib3ggKi8KLSAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKERlZmF1bHRfZnR5cCwgc2l6ZW9mKERlZmF1bHRfZnR5cCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgfQotCi0gICAgLyppbml0IG1kYXQgdmFsdWUgd2l0aCAwIGJ1dCB0aGUgcmlnaHQgdmFsdWUgaXMgc2V0IGp1c3QgYmVmb3JlIHRoZSBmaWxlIGlzIGNsb3NlZCovCi0gICAgZXJyID0gTTRNUDRXX3B1dEJFMzIoMCwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLSAgICBlcnIgPSBNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2syLCBzaXplb2YoQ29tbW9uQmxvY2syKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICBpZiAoMCAhPSBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplCi0gICAgICAgICYmIE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsKQotICAgIHsKLSAgICAgICAgTTRPU0FfRVJSIGVycjIgPSBNNE5PX0VSUk9SOwotICAgICAgICBNNE9TQV9Db250ZXh0IHNhZmV0eUZpbGVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDMyIHNhZmV0eUZpbGVTaXplID0gMCwgYWRkZW5kdW0gPSAwOwotICAgICAgICBNNE9TQV9VQ2hhciBkdW1teURhdGFbMTAwXTsgLyogVG8gZmlsbCB0aGUgc2FmZXR5IGZpbGUgd2l0aCAqLwotCi0gICAgICAgIGVyciA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPm9wZW5Xcml0ZSgmc2FmZXR5RmlsZUNvbnRleHQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnNhZmV0eUZpbGVVcmwsIGZpbGVNb2RlQWNjZXNzKTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgIC8qIDEwJSBzZWVtcyB0byBiZSBhIHJlYXNvbmFibGUgd29yc3QgY2FzZSwgYnV0IGFsc28gcHJvdmlzaW9uIGZvciAxa2Igb2YgbW9vdiBvdmVyaGVhZC4qLwotICAgICAgICBzYWZldHlGaWxlU2l6ZSA9IDEwMDAgKyAobU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSAqIDEwICsgOTkpIC8gMTAwOwotCi0gICAgICAgIC8qIEhlcmUgd2UgYWRkIHNwYWNlIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBmYWN0IHdlIGhhdmUgdG8gZmx1c2ggYW55IHBlbmRpbmcKLSAgICAgICAgY2h1bmsgaW4gY2xvc2VXcml0ZSwgdGhpcyBzcGFjZSBpcyB0aGUgc3VtIG9mIHRoZSBtYXhpbXVtIGNodW5rIHNpemVzLCBmb3IgZWFjaAotICAgICAgICB0cmFjay4gKi8KLQotI2lmbmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbykKLSAgICAgICAgewotICAgICAgICAgICAgc2FmZXR5RmlsZVNpemUgKz0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNhZmV0eUZpbGVTaXplICs9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtc2V0KCh2b2lkICopZHVtbXlEYXRhLCAweENBLHNpemVvZihkdW1teURhdGEpKTsgLyogRm9yIGV4dHJhIHNhZmV0eS4gKi8KLQotICAgICAgICBmb3IgKCBpID0gMDsKLSAgICAgICAgICAgIGkgPCAoc2FmZXR5RmlsZVNpemUgKyBzaXplb2YoZHVtbXlEYXRhKSAtIDEpIC8gc2l6ZW9mKGR1bW15RGF0YSk7Ci0gICAgICAgICAgICBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPndyaXRlRGF0YSgKLSAgICAgICAgICAgICAgICBzYWZldHlGaWxlQ29udGV4dCwgZHVtbXlEYXRhLCBzaXplb2YoZHVtbXlEYXRhKSk7Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qIERvbid0IHJldHVybiBmcm9tIHRoZSBmdW5jdGlvbiB5ZXQsIGFzIHdlIG5lZWQgdG8gY2xvc2UgdGhlIGZpbGUgZmlyc3QuICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBJIGRvbid0IG5lZWQgdG8ga2VlcCBpdCBvcGVuLiAqLwotICAgICAgICBlcnIyID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZShzYWZldHlGaWxlQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIyKSwgZXJyMik7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlNhZmV0eSBmaWxlIGNvcnJlY3RseSBjcmVhdGVkIik7Ci0gICAgfQotI2VuZGlmIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfbmV3QXVkaW9DaHVuayggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqbGVmdFNwYWNlSW5DaHVuayApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRG91YmxlIHNjYWxlX2F1ZGlvOwotCi0jaWZuZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICBNNE9TQV9VSW50MzIgcmVhbGxvY05iOwotCi0jZW5kaWYKLQotICAgIC8qIHZpZGVvIG9ubHkgKi8KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiIE00TVA0V19uZXdBdWRpb0NodW5rIC0gZmx1c2ggYXVkaW8iKTsKLSAgICBNNE9TQV9UUkFDRTFfMigiY3VycmVudCBjaHVuayA9ICVkICBvZmZzZXQgPSAweCV4IiwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmssCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zKTsKLQotICAgIHNjYWxlX2F1ZGlvID0gMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZTsKLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICAvKmZsdXNoIGNodW5rKi8KLQotICAgIGVyciA9IE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gdGVtcCA9IG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgKLSAgICAgICAgICAgICJNNE1QNFdfbmV3QXVkaW9DaHVuazogcHV0QmxvY2sgZXJyb3Igd2hlbiBmbHVzaGluZyBjaHVuazogJSNYIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIC8qIE91Y2gsIHdlIGdvdCBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBmaWxlLCBidXQgd2UgbmVlZCB0byBwcm9wZXJseSByZWFjdCBzbyB0aGF0IHRoZQotICAgICAgICAgc3RhdGUgaXMgc3RpbGwgY29uc2lzdGVudCBhbmQgd2UgY2FuIHByb3Blcmx5IGNsb3NlIHRoZSBmaWxlIHNvIHRoYXQgd2hhdCBoYXMgYmVlbgotICAgICAgICAgcmVjb3JkZWQgc28gZmFyIGlzIG5vdCBsb3N0LiBZYXkgZXJyb3IgcmVjb3ZlcnkhICovCi0KLSAgICAgICAgLyogRmlyc3QsIHdlIGRvIG5vdCBrbm93IHdoZXJlIHdlIGFyZSBpbiB0aGUgZmlsZS4gUHV0IHVzIGJhY2sgYXQgd2hlcmUgd2Ugd2VyZSBiZWZvcmUKLSAgICAgICAgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZGF0YS4gVGhhdCB3YXksIHdlJ3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY2h1bmsgc3RhdGUgZGF0YS4gKi8KLSAgICAgICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5zZWVrKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJnRlbXApOwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAgICAgIkJhY2t0cmFja2luZyB0byBwb3NpdGlvbiAweCUwOFgsIHNlZWsgcmV0dXJuZWQgJWQgYW5kIHBvc2l0aW9uICUwOFgiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MsIGVyciwgdGVtcCk7Ci0KLSAgICAgICAgLyogVGhlbiwgZG8gbm90IHVwZGF0ZSBhbnkgaW5mbyB3aGF0c29ldmVyIGluIHRoZSB3cml0aW5nIHN0YXRlLiBUaGlzIHdpbGwgaGF2ZSB0aGUKLSAgICAgICAgIGNvbnNlcXVlbmNlIHRoYXQgaXQgd2lsbCBiZSBhcyBpZiB0aGUgY2h1bmsgaGFzIG5vdCBiZWVuIGZsdXNoZWQgeWV0LCBhbmQgdGhlcmVmb3JlCi0gICAgICAgICBpdCB3aWxsIGJlIGRvbmUgYXMgcGFydCBvZiBjbG9zZVdyaXRlICh3aGVyZSB0aGVyZSBjb3VsZCBiZSByb29tIHRvIGRvIHNvLAotICAgICAgICAgaWYgc29tZSBlbWVyZ2VuY3kgcm9vbSBpcyBmcmVlZCBmb3IgdGhhdCBwdXJwb3NlKS4gKi8KLQotICAgICAgICAvKiBBbmQgbGFzdGx5IChmb3IgaGVyZSksIHJldHVybiB0aGF0IHdlJ3ZlIHJlYWNoZWQgdGhlIGxpbWl0IG9mIGF2YWlsYWJsZSBzcGFjZS4gKi8KLQotICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICB9Ci0KLSAgICAvKnVwZGF0ZSBjaHVuayBvZmZzZXQqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rT2Zmc2V0VGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3M7Ci0KLSAgICAvKmFkZCBjaHVuayBzaXplIHRvIGFic29sdXRlQ3VycmVudFBvcyovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgKz0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgLyp1cGRhdGUgY2h1bmsgaW5mbyAqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtTaXplVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFM7Ci0KLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayArPSAxOwotICAgIC8qaWYgYXVkaW8gYW1vdW50IG9mIGRhdGEgaXMgbm90IGVzdGltYXRlZCovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gMTY7Ci0KLSAgICAvKmFsbG9jIG5ldyBjaHVuayovCi0gICAgLypvbmx5IGlmIG5vdCBhbHJlYWR5IGFsbG9jYXRlZCovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rCi0gICAgICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rKQotICAgIHsKLSAgICAgICAgLyp1cGRhdGUgTGFzdEFsbG9jYXRlZENodW5rICggLT4gPSBjdXJyZW50Q2h1bmspKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsgKz0gMTsKLQotICAgICAgICAvKm1heCBuYiBvZiBjaHVuayBpcyBub3cgZHluYW1pYyovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsKLSAgICAgICAgICAgICsgMyA+IE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19uZXdBdWRpb0NodW5rIDogYXVkaW8gY2h1bmsgdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBpZiAoKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuaykKLSAgICAgICAgICAgICUgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWFsbG9jTmIgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuawotICAgICAgICAgICAgICAgICsgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05COwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rLAotICAgICAgICAgICAgICAgICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VDaGFyICopLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGUsCi0gICAgICAgICAgICAgICAgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUludDMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2l6ZVRhYmxlLAotICAgICAgICAgICAgICAgICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VJbnQzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZSwKLSAgICAgICAgICAgICAgICAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VSW50MzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZQotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRNUDRXX1RpbWUzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlLAotICAgICAgICAgICAgICAgICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00TVA0V19UaW1lMzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE1QNFdfVGltZTMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICB9Ci0jZW5kaWYgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSwKLSAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rIik7Ci0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIH0KLQotICAgIC8qdXBkYXRlIGxlZnRTcGFjZUluQ2h1bmssIGN1cnJlbnRQb3MgYW5kIGN1cnJlbnRDaHVua0R1ciovCi0gICAgKmxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MgPSAwOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICAvKiBjaGVjayB3ZXRoZXIgdG8gdXNlIGEgbmV3IHN0c2Mgb3Igbm90ICovCi0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYyA+IDApCi0gICAgewotICAgICAgICBpZiAoKCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50U3RzY10gJiAweEZGRikgIT0gKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYwotICAgICAgICAgICAgLSAxXSAmIDB4RkZGKSkKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MgKz0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjICs9IDE7Ci0KLSAgICAvKiBtYXggbmIgb2YgY2h1bmsgaXMgbm93IGR5bmFtaWMgKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYwotICAgICAgICArIDMgPiBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX25ld0F1ZGlvQ2h1bmsgOiBhdWRpbyBzdHNjIHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgfQotCi0gICAgLyogc2V0IG5iIG9mIHNhbXBsZXMgaW4gdGhlIG5ldyBjaHVuayB0byAwICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2NdID0KLSAgICAgICAgMCArIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayA8PCAxMik7Ci0KLSNlbHNlCi0gICAgLypzZXQgbmIgb2Ygc2FtcGxlcyBpbiB0aGUgbmV3IGNodW5rIHRvIDAqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9IDA7Ci0KLSNlbmRpZgotCi0gICAgLypzZXQgdGltZSBvZiB0aGUgbmV3IGNodW5rIHRvIGxhc3RDVFMgKGZvciBpbml0aWFsaXphdGlvbiwgYnV0IHVwZGF0ZWQgZnVydGhlciB0byB0aGUKLSAgICBDVFMgb2YgdGhlIGxhc3Qgc2FtcGxlIGluIHRoZSBjaHVuaykqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAoTTRPU0FfVUludDMyKShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAqIHNjYWxlX2F1ZGlvKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19uZXdWaWRlb0NodW5rKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpsZWZ0U3BhY2VJbkNodW5rICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfdmlkZW87Ci0KLSNpZm5kZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgIE00T1NBX1VJbnQzMiByZWFsbG9jTmI7Ci0KLSNlbmRpZgotCi0gICAgLyogYXVkaW8gb25seSAqLwotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9PSBNNE9TQV9OVUxMKQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfbmV3VmlkZW9DaHVuayAtIGZsdXNoIHZpZGVvIik7Ci0gICAgTTRPU0FfVFJBQ0UxXzIoImN1cnJlbnQgY2h1bmsgPSAlZCAgb2Zmc2V0ID0gMHgleCIsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyk7Ci0KLSAgICBzY2FsZV92aWRlbyA9IDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLSAgICAvKiBzYW1wbGVzIGFyZSBhbHJlYWR5IHdyaXR0ZW4gdG8gZmlsZSAqLwotI2Vsc2UKLSAgICAvKmZsdXNoIGNodW5rKi8KLQotICAgIGVyciA9IE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gdGVtcCA9IG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgKLSAgICAgICAgICAgICJNNE1QNFdfbmV3VmlkZW9DaHVuazogcHV0QmxvY2sgZXJyb3Igd2hlbiBmbHVzaGluZyBjaHVuazogJSNYIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIC8qIE91Y2gsIHdlIGdvdCBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBmaWxlLCBidXQgd2UgbmVlZCB0byBwcm9wZXJseSByZWFjdCBzbyB0aGF0IHRoZQotICAgICAgICAgc3RhdGUgaXMgc3RpbGwgY29uc2lzdGVudCBhbmQgd2UgY2FuIHByb3Blcmx5IGNsb3NlIHRoZSBmaWxlIHNvIHRoYXQgd2hhdCBoYXMgYmVlbgotICAgICAgICAgcmVjb3JkZWQgc28gZmFyIGlzIG5vdCBsb3N0LiBZYXkgZXJyb3IgcmVjb3ZlcnkhICovCi0KLSAgICAgICAgLyogRmlyc3QsIHdlIGRvIG5vdCBrbm93IHdoZXJlIHdlIGFyZSBpbiB0aGUgZmlsZS4gUHV0IHVzIGJhY2sgYXQgd2hlcmUgd2Ugd2VyZSBiZWZvcmUKLSAgICAgICAgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZGF0YS4gVGhhdCB3YXksIHdlJ3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY2h1bmsgc3RhdGUgZGF0YS4gKi8KLSAgICAgICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5zZWVrKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJnRlbXApOwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAgICAgIkJhY2t0cmFja2luZyB0byBwb3NpdGlvbiAweCUwOFgsIHNlZWsgcmV0dXJuZWQgJWQgYW5kIHBvc2l0aW9uICUwOFgiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MsIGVyciwgdGVtcCk7Ci0gICAgICAgIC8qIFRoZW4sIGRvIG5vdCB1cGRhdGUgYW55IGluZm8gd2hhdHNvZXZlciBpbiB0aGUgd3JpdGluZyBzdGF0ZS4gVGhpcyB3aWxsIGhhdmUgdGhlCi0gICAgICAgICBjb25zZXF1ZW5jZSB0aGF0IGl0IHdpbGwgYmUgYXMgaWYgdGhlIGNodW5rIGhhcyBub3QgYmVlbiBmbHVzaGVkIHlldCwgYW5kIHRoZXJlZm9yZSBpdAotICAgICAgICAgd2lsbCBiZSBkb25lIGFzIHBhcnQgb2YgY2xvc2VXcml0ZSAod2hlcmUgdGhlcmUgY291bGQgYmUgcm9vbSB0byBkbyBzbywgaWYgc29tZQotICAgICAgICAgZW1lcmdlbmN5IHJvb20gaXMgZnJlZWQgZm9yIHRoYXQgcHVycG9zZSkuICovCi0KLSAgICAgICAgLyogQW5kIGxhc3RseSAoZm9yIGhlcmUpLCByZXR1cm4gdGhhdCB3ZSd2ZSByZWFjaGVkIHRoZSBsaW1pdCBvZiBhdmFpbGFibGUgc3BhY2UuCi0gICAgICAgICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBlcnJvciBvcmlnaW5hbGx5IHJldHVybmVkIGJ5IHB1dEJsb2NrLiAqLwotCi0gICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICAvKnVwZGF0ZSBjaHVuayBvZmZzZXQqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtPZmZzZXRUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvczsKLQotICAgIC8qYWRkIGNodW5rIHNpemUgdG8gYWJzb2x1dGVDdXJyZW50UG9zKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyArPQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAvKnVwZGF0ZSBjaHVuayBpbmZvIGJlZm9yZSB0byBnbyBmb3IgYSBuZXcgb25lKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2l6ZVRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvczsKLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIChNNE9TQV9VSW50MzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICogc2NhbGVfdmlkZW8pOwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgKz0gMTsKLSAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDE2OwotCi0gICAgLyphbGxvYyBuZXcgY2h1bmsqLwotICAgIC8qb25seSBpZiBub3QgYWxyZWFkeSBhbGxvY2F0ZWQqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuawotICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rKQotICAgIHsKLSAgICAgICAgLyp1cGRhdGUgTGFzdEFsbG9jYXRlZENodW5rICggLT4gPSBjdXJyZW50Q2h1bmspKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsgKz0gMTsKLQotICAgICAgICAvKm1heCBuYiBvZiBjaHVuayBpcyBub3cgZHluYW1pYyovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBpZiAoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rCi0gICAgICAgICAgICArIDMgPiBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfbmV3VmlkZW9DaHVuayA6IHZpZGVvIGNodW5rIHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgaWYgKCgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmspCi0gICAgICAgICAgICAlIE00TVA0V19DSFVOS19BTExPQ19OQikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVhbGxvY05iID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsKLSAgICAgICAgICAgICAgICArIE00TVA0V19DSFVOS19BTExPQ19OQjsKLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuaywKLSAgICAgICAgICAgICAgICAoIHJlYWxsb2NOYgotICAgICAgICAgICAgICAgIC0gTTRNUDRXX0NIVU5LX0FMTE9DX05CKSAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUNoYXIgKikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua09mZnNldFRhYmxlLCAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VSW50MzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtTaXplVGFibGUsICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VJbnQzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZSwgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUludDMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00TVA0V19UaW1lMzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZSwgKCByZWFsbG9jTmIKLSAgICAgICAgICAgICAgICAtIE00TVA0V19DSFVOS19BTExPQ19OQikgKiBzaXplb2YoTTRNUDRXX1RpbWUzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00TVA0V19UaW1lMzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDaHVua1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUiKTsKLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDaHVua1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10KLSAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgfQotCi0gICAgLyp1cGRhdGUgbGVmdFNwYWNlSW5DaHVuaywgY3VycmVudFBvcyBhbmQgY3VycmVudENodW5rRHVyKi8KLSAgICAqbGVmdFNwYWNlSW5DaHVuayA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyA9IDA7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgIC8qIGNoZWNrIHdldGhlciB0byB1c2UgYSBuZXcgc3RzYyBvciBub3QgKi8KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjID4gMCkKLSAgICB7Ci0gICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudFN0c2NdICYgMHhGRkYpICE9IChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MKLSAgICAgICAgICAgIC0gMV0gJiAweEZGRikpCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjICs9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYyArPSAxOwotCi0gICAgLyogbWF4IG5iIG9mIGNodW5rIGlzIG5vdyBkeW5hbWljICovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MKLSAgICAgICAgKyAzID4gTTRNUDRXX0NIVU5LX0FMTE9DX05CKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19uZXdWaWRlb0NodW5rIDogdmlkZW8gc3RzYyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgIH0KLQotICAgIC8qIHNldCBuYiBvZiBzYW1wbGVzIGluIHRoZSBuZXcgY2h1bmsgdG8gMCAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjXSA9Ci0gICAgICAgIDAgKyAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPDwgMTIpOwotCi0jZWxzZQotICAgIC8qc2V0IG5iIG9mIHNhbXBsZXMgaW4gdGhlIG5ldyBjaHVuayB0byAwKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPSAwOwotCi0jZW5kaWYKLQotICAgIC8qc2V0IHRpbWUgb2YgdGhlIG5ldyBjaHVuayB0byBsYXN0Q1RTIChmb3IgaW5pdGlhbGl6YXRpb24sIGJ1dCB1cGRhdGVkIGZ1cnRoZXIgdG8gdGhlCi0gICAgQ1RTIG9mIHRoZSBsYXN0IHNhbXBsZSBpbiB0aGUgY2h1bmspKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgKE00T1NBX1VJbnQzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMKLSAgICAgICAgKiBzY2FsZV92aWRlbyk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfc3RhcnRBVSggTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0ICphdVB0ciApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9VSW50MzIgbGVmdFNwYWNlSW5DaHVuazsKLSAgICBNNE1QNFdfVGltZTMyIGNodW5rRHVyTXM7Ci0KLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfYXVkaW87Ci0gICAgTTRPU0FfRG91YmxlIHNjYWxlX3ZpZGVvOwotCi0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBFUlJfQ0hFQ0soYXVQdHIgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIE00T1NBX1RSQUNFMl8wKCItLS0tLSBNNE1QNFdfc3RhcnRBVSAtLS0tLSIpOwotCi0gICAgLypjaGVjayBtYWNybyBzdGF0ZSovCi0gICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V193cml0aW5nKSwgTTRFUlJfU1RBVEUpOwotCi0gICAgaWYgKHN0cmVhbUlEID09IEF1ZGlvU3RyZWFtSUQpIC8qYXVkaW8gc3RyZWFtKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE1QNFdfc3RhcnRBVSAtPiBhdWRpbyIpOwotCi0gICAgICAgIHNjYWxlX2F1ZGlvID0KLSAgICAgICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSAgICAgICAgLyphdWRpbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUKLSAgICAgICAgICAgID09IE00TVA0V193cml0aW5nKSwgTTRFUlJfU1RBVEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfd3JpdGluZ19zdGFydEFVOwotCi0gICAgICAgIGxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZQotICAgICAgICAgICAgLSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoImF1ZGlvICVkICAlZCIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MsIGxlZnRTcGFjZUluQ2h1bmspOwotCi0gICAgICAgIGNodW5rRHVyTXMgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAgICAgKiBzY2FsZV9hdWRpbykgLSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudENodW5rXSk7Ci0KLSAgICAgICAgaWYgKChsZWZ0U3BhY2VJbkNodW5rIDwgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUpCi0gICAgICAgICAgICB8fCAoKCBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIgIT0gMCkKLSAgICAgICAgICAgICYmIChjaHVua0R1ck1zID49IG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1cikpKQotICAgICAgICB7Ci0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0gICAgICAgICAgICAvKiBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgdmlkZW8gc2FtcGxlIGluIHRoZSBjaHVuayAqLwotCi0gICAgICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgPiAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjbG9zZSB0aGUgb3BlbmVkIHZpZGVvIGNodW5rIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBhdWRpbyBvbmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1QNFdfbmV3VmlkZW9DaHVuayhjb250ZXh0LCAmbGVmdFNwYWNlSW5DaHVuayk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZgotICAgICAgICAgICAgLyogbm90IGVub3VnaCBzcGFjZSBpbiBjdXJyZW50IGNodW5rOiBjcmVhdGUgYSBuZXcgb25lICovCi0KLSAgICAgICAgICAgIGVyciA9IE00TVA0V19uZXdBdWRpb0NodW5rKGNvbnRleHQsICZsZWZ0U3BhY2VJbkNodW5rKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBhdVB0ci0+c2l6ZSA9IGxlZnRTcGFjZUluQ2h1bms7Ci0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPSAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zKTsKLQotI2Vsc2UKLQotICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXQotICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyk7Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgfQotICAgIGVsc2UgaWYgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpIC8qdmlkZW8gc3RyZWFtKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE1QNFdfc3RhcnRBVSAtPiB2aWRlbyIpOwotCi0gICAgICAgIHNjYWxlX3ZpZGVvID0KLSAgICAgICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSAgICAgICAgLyp2aWRlbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUKLSAgICAgICAgICAgID09IE00TVA0V193cml0aW5nKSwgTTRFUlJfU1RBVEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfd3JpdGluZ19zdGFydEFVOwotCi0gICAgICAgIGxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZQotICAgICAgICAgICAgLSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0KLSAgICAgICAgY2h1bmtEdXJNcyA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICAgICAqIHNjYWxlX3ZpZGVvKSAtIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50Q2h1bmtdKTsKLQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgICAgIGxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLQotI2VuZGlmCi0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoInZpZGVvICVkICAlZCIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MsIGxlZnRTcGFjZUluQ2h1bmspOwotCi0gICAgICAgIGlmICgoIGxlZnRTcGFjZUluQ2h1bmsgPCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZSkKLSAgICAgICAgICAgIHx8ICgoIG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciAhPSAwKQotICAgICAgICAgICAgJiYgKGNodW5rRHVyTXMgPj0gbU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyKSkKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICB8fCAoKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVcGVyQ2h1bmsgIT0gMCkKLSAgICAgICAgICAgICYmICgoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGN1cnJlbnRTdHNjXSAmIDB4RkZGKQotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVXBlckNodW5rKSkKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgICAgLypub3QgZW5vdWdoIHNwYWNlIGluIGN1cnJlbnQgY2h1bms6IGNyZWF0ZSBhIG5ldyBvbmUqLwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX25ld1ZpZGVvQ2h1bmsoY29udGV4dCwgJmxlZnRTcGFjZUluQ2h1bmspOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMl8zKCJzdGFydEFVOiBzaXplIDB4JXggcG9zIDB4JXggY2h1bmsgJXUiLCBhdVB0ci0+c2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rKTsKLQotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiYWRyID0gMHglcCIsIGF1UHRyLT5kYXRhQWRkcmVzcyk7Ci0KLSAgICAgICAgaWYgKGF1UHRyLT5kYXRhQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzMoIiBkYXRhID0gJTA4WCAlMDhYICUwOFgiLCBhdVB0ci0+ZGF0YUFkZHJlc3NbMF0sCi0gICAgICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzWzFdLCBhdVB0ci0+ZGF0YUFkZHJlc3NbMl0pOwotICAgICAgICB9Ci0KLSAgICAgICAgYXVQdHItPnNpemUgPSBsZWZ0U3BhY2VJbkNodW5rOwotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rSDI2NCkKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zICsgNCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zKTsKLQotI2Vsc2UKLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSArIDQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSk7Ci0KLSNlbHNlCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tIMjY0KQotICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0KLSAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MKLSAgICAgICAgICAgICsgNCk7IC8qIEluIEgyNjQsIHdlIG11c3Qgc3RhcnQgYnkgdGhlIGxlbmd0aCBvZiB0aGUgTkFMVSwgY29kZWQgaW4gNCBieXRlcyAqLwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXQotICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTyovCi0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLQotICAgIE00T1NBX1RSQUNFMV8zKCJNNE1QV19zdGFydEFVOiBzdGFydCBhZGRyZXNzOiVwLCBzaXplOiVsdSwgc3RyZWFtOiVkIiwKLSAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzLCBhdVB0ci0+c2l6ZSwgc3RyZWFtSUQpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3Byb2Nlc3NBVSggTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKmF1UHRyICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00TVA0V19UaW1lMzIgZGVsdGE7Ci0gICAgTTRNUDRXX1RpbWUzMiBsYXN0U2FtcGxlRHVyOwotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIC8qZXhwZWN0ZWRTaXplIGlzIHRoZSBtYXggZmlsZXNpemUgdG8gZm9yZWNhc3Qgd2hlbiBhZGRpbmcgYSBuZXcgQVU6Ki8KLSAgICBNNE9TQV9VSW50MzIgZXhwZWN0ZWRTaXplID0KLSAgICAgICAgMzI7IC8qaW5pdGlhbGl6ZWQgd2l0aCBhbiBlc3RpbWF0aW9uIG9mIHRoZSBtYXggbWV0YWRhdGEgc3BhY2UgbmVlZGVkIGZvciBhbiBBVS4qLwotICAgIE00T1NBX0RvdWJsZSBzY2FsZV9hdWRpbyA9IDAuMDsKLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfdmlkZW8gPSAwLjA7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvKmNoZWNrIG1hY3JvIHN0YXRlKi8KLSAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX3dyaXRpbmcpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMCgiTTRNUDRXX3Byb2Nlc3NBVSIpOwotCi0gICAgaWYgKHN0cmVhbUlEID09IEF1ZGlvU3RyZWFtSUQpCi0gICAgICAgIHNjYWxlX2F1ZGlvID0KLSAgICAgICAgMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZTsKLQotICAgIGlmIChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKQotICAgICAgICBzY2FsZV92aWRlbyA9Ci0gICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSAgICAvKiBQTCAyNy8xMC8yMDA4OiBhZnRlciB0aGUgcmVzdXJnZW5jZSBvZiB0aGUgQUFDIDEyOCBidWcsIEkgYWRkZWQgYSBkZWJ1ZyBjaGVjayB0aGF0Ci0gICAgIHRoZSBlbmNvZGVkIGRhdGEgZGlkbid0IG92ZXJmbG93IHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIEFVICovCi0KLSAgICBzd2l0Y2goIHN0cmVhbUlEICkKLSAgICB7Ci0gICAgICAgIGNhc2UgQXVkaW9TdHJlYW1JRDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShhdVB0ci0+c2l6ZQotICAgICAgICAgICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zCi0gICAgICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQsCi0gICAgICAgICAgICAiVWggb2guIEJ1ZmZlciBvdmVyZmxvdyBpbiB0aGUgd3JpdGVyLiBBYmFuZG9uIHNoaXAhIik7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjIoYXVQdHItPnNpemUKLSAgICAgICAgICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplLAotICAgICAgICAgICAgICAgIE00RVJSX0NPTlRFWFRfRkFJTEVELAotICAgICAgICAgICAgICAgICJPb3BzLiBBbiBBVSB3ZW50IG92ZXIgdGhlIGRlY2xhcmVkIE1heCBBVSBzaXplLlwKLSAgICAgICAgICAgICAgICAgWW91IG1pZ2h0IHdpc2ggdG8gaW52ZXN0aWdhdGUgdGhhdC4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVmlkZW9TdHJlYW1JRDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShhdVB0ci0+c2l6ZQotICAgICAgICAgICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zCi0gICAgICAgICAgICAgICAgICAgID4gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0NPTlRFWFRfRkFJTEVELAotICAgICAgICAgICAgICAgICAgICAiVWggb2guIEJ1ZmZlciBvdmVyZmxvdyBpbiB0aGUgd3JpdGVyLiBBYmFuZG9uIHNoaXAhIik7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjIoYXVQdHItPnNpemUKLSAgICAgICAgICAgICAgICAgICAgPiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQsCi0gICAgICAgICAgICAgICAgICAgICJPb3BzLiBBbiBBVSB3ZW50IG92ZXIgdGhlIGRlY2xhcmVkIE1heCBBVSBzaXplLlwKLSAgICAgICAgICAgICAgICAgICAgIFlvdSBtaWdodCB3aXNoIHRvIGludmVzdGlnYXRlIHRoYXQuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKm9ubHkgaWYgbm90IGluIHRoZSBjYXNlIGF1ZGlvIHdpdGggZXN0aW1hdGVBdWRpb1NpemUKLSAgICAoZWxzZSwgc2l6ZSBhbHJlYWR5IGVzdGltYXRlZCBhdCB0aGlzIHBvaW50KSovCi0gICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX0ZBTFNFKQotICAgICAgICB8fCAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkpCi0gICAgewotICAgICAgICAvKmNoZWNrIGZpbGVzaXplIGlmIG5lZWRlZCovCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdGVkU2l6ZSArPSBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICsgYXVQdHItPnNpemU7Ci0KLSAgICAgICAgICAgIGlmICgoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkKLSAgICAgICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgICAgID09IE00U1lTX2tIMjY0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHBlY3RlZFNpemUgKz0gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGV4cGVjdGVkU2l6ZSA+IG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZVNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoInByb2Nlc3NBVSA6ICEhIEZJTEVTSVpFIEVYQ0VFREVEICEhIik7Ci0KLSAgICAgICAgICAgICAgICAvKiBwYXRjaCBmb3IgYXV0b3N0b3AgaXMgTWF4RmlsZVNpemUgZXhjZWVkZWQgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX3Byb2Nlc3NBVSA6IHN0b3AgYXQgdGFyZ2V0ZWQgZmlsZXNpemUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qY2FzZSBhdWRpb01zU3RvcFRpbWUgaGFzIGFscmVhZHkgYmVlbiBzZXQgZHVyaW5nIHZpZGVvIHByb2Nlc3NpbmcsCi0gICAgIGFuZCBub3cgY2hlY2sgaXQgZm9yIGF1ZGlvKi8KLSAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgJiYgKHN0cmVhbUlEID09IEF1ZGlvU3RyZWFtSUQpKQotICAgIHsKLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc1N0b3BUaW1lIDw9IChhdVB0ci0+Q1RTICpzY2FsZV9hdWRpbykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGJ1Z2ZpeDogaWYgYSBuZXcgY2h1bmsgd2FzIGp1c3QgY3JlYXRlZCwgY2FuY2VsIGl0IGJlZm9yZSB0byBjbG9zZSAqLwotICAgICAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayAhPSAwKQotICAgICAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MgPT0gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmstLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogYXVkaW8gc3RvcCB0aW1lIHJlYWNoZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHN0cmVhbUlEID09IEF1ZGlvU3RyZWFtSUQpIC8qYXVkaW8gc3RyZWFtKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE1QNFdfcHJvY2Vzc0FVIC0+IGF1ZGlvIik7Ci0KLSAgICAgICAgLyphdWRpbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUKLSAgICAgICAgICAgID09IE00TVA0V193cml0aW5nX3N0YXJ0QVUpLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V193cml0aW5nOwotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyArPSBhdVB0ci0+c2l6ZTsKLSAgICAgICAgLyogV2FybmluZzogdGltZSBjb252ZXJzaW9uIGNhc3QgNjR0bzMyISAqLwotICAgICAgICBkZWx0YSA9IChNNE1QNFdfVGltZTMyKWF1UHRyLT5DVFMKLSAgICAgICAgICAgIC0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFM7Ci0KLSAgICAgICAgLyogREVCVUcgc3R0cyBlbnRyaWVzIHdoaWNoIGFyZSBlcXVhbCB0byAwICovCi0gICAgICAgIE00T1NBX1RSQUNFMl8xKCJBX0RFTFRBID0gJWxkXG4iLCBkZWx0YSk7Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAgICAgPT0gMCkgLyp0ZXN0IGlmIGZpcnN0IEFVKi8KLSAgICAgICAgewotICAgICAgICAgICAgLypzZXQgYXUgc2l6ZSovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9IGF1UHRyLT5zaXplOwotCi0gICAgICAgICAgICAvKnNhbXBsZSBkdXJhdGlvbiBpcyBhIHByaW9yaSBjb25zdGFudCBpbiBhdWRpbyBjYXNlLCAqLwotICAgICAgICAgICAgLypidXQgaWYgYW4gQXUgYXQgbGVhc3QgaGFzIGRpZmZlcmVudCBzaXplLCBhIHN0c3ogdGFibGUgd2lsbCBiZSBjcmVhdGVkICovCi0KLSAgICAgICAgICAgIC8qbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbiA9IGRlbHRhOyAqLwotICAgICAgICAgICAgLypUT0RPIHRlc3Qgc2FtcGxlIGR1cmF0aW9uPyAoc2hvdWxkIGJlIDIwbXMgaW4gQU1SOCwgMTYwIHRpY3Mgd2l0aCB0aW1lc2NhbGUgODAwMCkgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYXUgc2l6ZSBpcyBjb25zdGFudCAoYXVkaW8pICovCi0gICAgICAgICAgICAvKjAgc2FtcGxlIHNpemUgbWVhbnMgbm9uIGNvbnN0YW50IHNpemUqLwotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICE9IGF1UHRyLT5zaXplKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBBVSB3aXRoIGRpZmZlcmVudCBzaXplID0+IG5vbiBjb25zdGFudCBzaXplID0+IFNUU1ogdGFibGUgbmVlZGVkKi8KLSAgICAgICAgICAgICAgICAgICAgLypjb21wdXRhdGlvbiBvZiB0aGUgbmIgb2YgYmxvY2sgb2Ygc2l6ZSBNNE1QNFdfU1RTWl9BTExPQ19TSVpFIHRvIGFsbG9jYXRlKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAxICsgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgICAgICAgICAgICAgICogNCAvIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1oiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWgotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaSA8IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWltpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnNhbXBsZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUU1pbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmJdID0gYXVQdHItPnNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDA7IC8qdXNlZCBhcyBhIGZsYWcgaW4gdGhhdCBjYXNlKi8KLSAgICAgICAgICAgICAgICAgICAgLyptb3JlIGJ5dGVzIGluIHRoZSBmaWxlIGluIHRoYXQgY2FzZToqLwotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKmVsc2UgdGFibGUgYWxyZWFkeSBleGlzdHMqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgICAgICBpZiAoNCAqKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiArIDMpCi0gICAgICAgICAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgKk00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfcHJvY2Vzc0FVIDogYXVkaW8gc3RzeiB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICAgICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIGlmICg0ICptTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgICAgICAgICAqTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgIDE7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFNaLCAoIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrcyAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgICAgICogTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRSk7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1oKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUU1pbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zYW1wbGVOYl0gPSBhdVB0ci0+c2l6ZTsKLQotICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVsdGEgPiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBrZWVwIHRyYWNrIG9mIHJlYWwgc2FtcGxlIGR1cmF0aW9uKi8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24gPSBkZWx0YTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID09IDApIC8qdGVzdCBpZiBmaXJzdCBBVSovCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1swXSA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV0gPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAgICAgPT0gMSkgLyp0ZXN0IGlmIHNlY29uZCBBVSovCi0gICAgICAgIHsKLSNpZm5kZWYgRFVQTElDQVRFX1NUVFNfSU5fTEFTVF9BVQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0gKz0gMTsKLQotI2VuZGlmIC8qRFVQTElDQVRFX1NUVFNfSU5fTEFTVF9BVSovCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXSA9IGRlbHRhOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgKz0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gODsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qcmV0cmlldmUgbGFzdCBzYW1wbGUgZGVsdGEqLwotICAgICAgICAgICAgbGFzdFNhbXBsZUR1ciA9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgKiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKSAtIDFdOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgaWYgKDggKihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgICsgMykgPj0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RUU19BVURJT19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogYXVkaW8gc3R0cyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGlmICg4ICptTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAqTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzICs9IDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFMsICggbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgLSAxKSAqIE00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICogTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSk7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSAgICAgICAgICAgIGlmIChkZWx0YSAhPSBsYXN0U2FtcGxlRHVyKSAvKm5ldyBlbnRyeSBpbiB0aGUgdGFibGUqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpXSA9IDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIgKigKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkgKyAxXSA9IGRlbHRhOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iICs9Ci0gICAgICAgICAgICAgICAgICAgIDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qaW5jcmVhc2Ugb2YgMSB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIEFVcyB3aXRoIHNhbWUgZHVyYXRpb24qLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpIC0gMl0gKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgKz0gMTsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzY10gKz0KLSAgICAgICAgICAgIDE7Ci0KLSNlbHNlCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gKz0KLSAgICAgICAgICAgIDE7Ci0KLSNlbmRpZgotICAgICAgICAvKiBXYXJuaW5nOiB0aW1lIGNvbnZlcnNpb24gY2FzdCA2NHRvMzIhICovCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMgPQotICAgICAgICAgICAgKE00TVA0V19UaW1lMzIpYXVQdHItPkNUUzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkgLyp2aWRlbyBzdHJlYW0qLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00TVA0V19wcm9jZXNzQVUgLT4gdmlkZW8iKTsKLQotICAgICAgICAvKiBJbiBoMjY0LCB0aGUgc2l6ZSBvZiB0aGUgQVUgbXVzdCBiZSBhZGRlZCB0byB0aGUgZGF0YSAqLwotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEFkZCB0aGUgc2l6ZSBvZiB0aGUgTkFMVSBpbiBCRSAqLwotICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcFRtcERhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyAtPSAxOwotICAgICAgICAgICAgcFRtcERhdGFBZGRyZXNzID0gKE00T1NBX01lbUFkZHI4KWF1UHRyLT5kYXRhQWRkcmVzczsKLQotICAgICAgICAgICAgLy8gYml0IG1hbmlwdWxhdGlvbgotICAgICAgICAgICAgKnBUbXBEYXRhQWRkcmVzcysrID0gKE00T1NBX1VJbnQ4KSgoYXVQdHItPnNpemUgPj4gMjQpICYgMHgwMDAwMDBGRik7Ci0gICAgICAgICAgICAqcFRtcERhdGFBZGRyZXNzKysgPSAoTTRPU0FfVUludDgpKChhdVB0ci0+c2l6ZSA+PiAxNikgJiAweDAwMDAwMEZGKTsKLSAgICAgICAgICAgICpwVG1wRGF0YUFkZHJlc3MrKyA9IChNNE9TQV9VSW50OCkoKGF1UHRyLT5zaXplID4+IDgpICAmIDB4MDAwMDAwRkYpOwotICAgICAgICAgICAgKnBUbXBEYXRhQWRkcmVzcysrID0gKE00T1NBX1VJbnQ4KSgoYXVQdHItPnNpemUpICAgICAgICYgMHgwMDAwMDBGRik7Ci0KLSAgICAgICAgICAgIGF1UHRyLT5zaXplICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKnZpZGVvIG1pY3Jvc3RhdGUqLwotICAgICAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZQotICAgICAgICAgICAgPT0gTTRNUDRXX3dyaXRpbmdfc3RhcnRBVSksIE00RVJSX1NUQVRFKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX3dyaXRpbmc7Ci0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLSAgICAgICAgLyogc2FtcGxlcyBhcmUgd3JpdHRlbiB0byBmaWxlIG5vdyAqLwotCi0gICAgICAgIGVyciA9IE00TVA0V19wdXRCbG9jaygoTTRPU0FfVUNoYXIgKilhdVB0ci0+ZGF0YUFkZHJlc3MsIGF1UHRyLT5zaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gdGVtcCA9IG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zCi0gICAgICAgICAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgKLSAgICAgICAgICAgICAgICAiTTRNUDRXX3Byb2Nlc3NBVTogcHV0QmxvY2sgZXJyb3Igd2hlbiB3cml0aW5nIHVuYnVmZmVyZWQgdmlkZW8gc2FtcGxlOiAlI1giLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKiBPdWNoLCB3ZSBnb3QgYW4gZXJyb3Igd3JpdGluZyB0byB0aGUgZmlsZSwgYnV0IHdlIG5lZWQgdG8gcHJvcGVybHkgcmVhY3Qgc28gdGhhdAotICAgICAgICAgICAgIHRoZSBzdGF0ZSBpcyBzdGlsbCBjb25zaXN0ZW50IGFuZCB3ZSBjYW4gcHJvcGVybHkgY2xvc2UgdGhlIGZpbGUgc28gdGhhdCB3aGF0IGhhcwotICAgICAgICAgICAgICBiZWVuIHJlY29yZGVkIHNvIGZhciBpcyBub3QgbG9zdC4gWWF5IGVycm9yIHJlY292ZXJ5ISAqLwotCi0gICAgICAgICAgICAvKiBGaXJzdCwgd2UgZG8gbm90IGtub3cgd2hlcmUgd2UgYXJlIGluIHRoZSBmaWxlLiBQdXQgdXMgYmFjayBhdCB3aGVyZSB3ZSB3ZXJlIGJlZm9yZQotICAgICAgICAgICAgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZGF0YS4gVGhhdCB3YXksIHdlJ3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY2h1bmsgYW5kIHNhbXBsZQotICAgICAgICAgICAgIHN0YXRlIGRhdGEuYWJzb2x1dGVDdXJyZW50UG9zIGlzIG9ubHkgdXBkYXRlZCBmb3IgY2h1bmtzLCBpdCBwb2ludHMgdG8gdGhlIGJlZ2lubmluZwotICAgICAgICAgICAgIG9mIHRoZSBjaHVuayx0aGVyZWZvcmUgd2UgbmVlZCB0byBhZGQgdmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyB0byBrbm93IHdoZXJlIHdlCi0gICAgICAgICAgICAgd2VyZSBpbiB0aGUgZmlsZS4gKi8KLSAgICAgICAgICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+c2VlaygKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJnRlbXApOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICAgICAiQmFja3RyYWNraW5nIHRvIHBvc2l0aW9uIDB4JTA4WCwgc2VlayByZXR1cm5lZCAlZCBhbmQgcG9zaXRpb24gJTA4WCIsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MKLSAgICAgICAgICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcywgZXJyLCB0ZW1wKTsKLQotICAgICAgICAgICAgLyogVGhlbiwgZG8gbm90IHVwZGF0ZSBhbnkgaW5mbyB3aGF0c29ldmVyIGluIHRoZSB3cml0aW5nIHN0YXRlLiBUaGlzIHdpbGwgaGF2ZSB0aGUKLSAgICAgICAgICAgICBjb25zZXF1ZW5jZSB0aGF0IGl0IHdpbGwgYmUgYXMgaWYgdGhlIHNhbXBsZSBoYXMgbmV2ZXIgYmVlbiB3cml0dGVuLCBzbyB0aGUgY2h1bmsKLSAgICAgICAgICAgICB3aWxsIGJlIG1lcmVseSBjbG9zZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIHNhbXBsZSAodGhlIHNhbXBsZSB3ZSBhdHRlbXB0ZWQgdG8gd3JpdGUKLSAgICAgICAgICAgICBoZXJlIGlzIGxvc3QpLiAqLwotCi0gICAgICAgICAgICAvKiBBbmQgbGFzdGx5IChmb3IgaGVyZSksIHJldHVybiB0aGF0IHdlJ3ZlIHJlYWNoZWQgdGhlIGxpbWl0IG9mIGF2YWlsYWJsZSBzcGFjZS4KLSAgICAgICAgICAgICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBlcnJvciBvcmlnaW5hbGx5IHJldHVybmVkIGJ5IHB1dEJsb2NrLiAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBpZiAoKE00TVA0V19UaW1lMzIpYXVQdHItPkNUUyA8IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTKSB7Ci0gICAgICAgICAgICAvLyBEbyBub3QgcmVwb3J0IGFzIGVycm9yLCBpdCB3aWxsIGFib3J0IHRoZSBlbnRpcmUgZmlsZXdyaXRlLiBKdXN0IHNraXAgdGhpcyBmcmFtZS4KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJTa2lwIGZyYW1lLiBWaWRlbyBmcmFtZSBoYXMgdG9vIG9sZCB0aW1lc3RhbXAuIik7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyArPSBhdVB0ci0+c2l6ZTsKLQotICAgICAgICAvKiBXYXJuaW5nOiB0aW1lIGNvbnZlcnNpb24gY2FzdCA2NHRvMzIhICovCi0gICAgICAgIGRlbHRhID0gKE00TVA0V19UaW1lMzIpYXVQdHItPkNUUwotICAgICAgICAgICAgLSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUzsKLQotICAgICAgICAvKiBERUJVRyBzdHRzIGVudHJpZXMgd2hpY2ggYXJlIGVxdWFsIHRvIDAgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIlZfREVMVEEgPSAlbGRcbiIsIGRlbHRhKTsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgaWYgKDIgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgKyAzKQotICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgKk00TVA0V19TVFNaX0FMTE9DX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogdmlkZW8gc3RzeiB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgfQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBUQUJMRV9TVFNaW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYl0gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQxNilhdVB0ci0+c2l6ZTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA0OwotCi0jZWxzZQotCi0gICAgICAgIGlmICg0ICptTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICpNNE1QNFdfU1RTWl9BTExPQ19TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzICs9IDE7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaLAotICAgICAgICAgICAgICAgICggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgICAgIC0gMSkgKiBNNE1QNFdfU1RTWl9BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNaX0FMTE9DX1NJWkUpOwotCi0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIFRBQkxFX1NUU1pbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iXSA9Ci0gICAgICAgICAgICBhdVB0ci0+c2l6ZTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA0OwotCi0jZW5kaWYKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICA9PSAwKSAvKnRlc3QgaWYgZmlyc3QgQVUqLwotICAgICAgICB7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgTTRNUDRXX3B1dDMyX0xvKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0sIDEpOwotICAgICAgICAgICAgTTRNUDRXX3B1dDMyX0hpKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0sIDApOwotCi0jZWxzZQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0gPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzFdID0gMDsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iID0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gODsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID09IDEgKSAvKnRlc3QgaWYgc2Vjb25kIEFVKi8KLSAgICAgICAgewotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIE00TVA0V19wdXQzMl9IaSgmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzBdLAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpZGVsdGEpOwotCi0jZWxzZQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV0gPSBkZWx0YTsKLQotI2VuZGlmCi0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qcmV0cmlldmUgbGFzdCBzYW1wbGUgZGVsdGEqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIGxhc3RTYW1wbGVEdXIgPSBNNE1QNFdfZ2V0MzJfSGkoJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdKTsKLQotICAgICAgICAgICAgaWYgKDQgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgICsgMykgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RUU19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogdmlkZW8gc3R0cyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGxhc3RTYW1wbGVEdXIgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICogKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkgKyAxXTsKLQotICAgICAgICAgICAgaWYgKDggKm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RUU19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MgKz0gMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RUUywgKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAtIDEpICogTTRNUDRXX1NUVFNfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RUU19BTExPQ19TSVpFKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotICAgICAgICAgICAgaWYgKGRlbHRhICE9IGxhc3RTYW1wbGVEdXIpIC8qbmV3IGVudHJ5IGluIHRoZSB0YWJsZSovCi0gICAgICAgICAgICB7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgICAgIE00TVA0V19wdXQzMl9MbygmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmJdLCAxKTsKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0MzJfSGkoJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iXSwgKE00T1NBX1VJbnQxNilkZWx0YSk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMiAqKAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIpXSA9IDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAgICAgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIpKzFdID0gZGVsdGE7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgKz0KLSAgICAgICAgICAgICAgICAgICAgMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyppbmNyZWFzZSBvZiAxIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgQVVzIHdpdGggc2FtZSBkdXJhdGlvbiovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMV0gKz0gMTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpXSArPSAxOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICs9IDE7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2NdICs9Ci0gICAgICAgICAgICAxOwotCi0jZWxzZQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdICs9Ci0gICAgICAgICAgICAxOwotCi0jZW5kaWYKLQotICAgICAgICBpZiAoYXVQdHItPmF0dHJpYnV0ZSA9PSBBVV9SQVApCi0gICAgICAgIHsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBpZiAoNCAqKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYiArIDMpCi0gICAgICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RTU19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogdmlkZW8gc3RzcyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGlmICg0ICptTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICA+PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHNzQmxvY2tzCi0gICAgICAgICAgICAgICAgKk00TVA0V19TVFNTX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcyArPSAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFNTLCAoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHNzQmxvY2tzCi0gICAgICAgICAgICAgICAgICAgIC0gMSkgKiBNNE1QNFdfU1RTU19BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNTX0FMTE9DX1NJWkUpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgfQotCi0jZW5kaWYgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgVEFCTEVfU1RTU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmJdID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIgKz0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFdhcm5pbmc6IHRpbWUgY29udmVyc2lvbiBjYXN0IDY0dG8zMiEgKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMgPQotICAgICAgICAgICAgKE00TVA0V19UaW1lMzIpYXVQdHItPkNUUzsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLQotICAgIC8qIEkgbW92ZWQgc29tZSBzdGF0ZSBtb2RpZmljYXRpb24gdG8gYWZ0ZXIgd2Uga25vdyB0aGUgc2FtcGxlIGhhcyBiZWVuIHdyaXR0ZW4gY29ycmVjdGx5LiAqLwotICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9UUlVFKQotICAgICAgICAmJiAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkpCi0gICAgewotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNTdG9wVGltZSA9Ci0gICAgICAgICAgICAoTTRNUDRXX1RpbWUzMikoYXVQdHItPkNUUyAqIHNjYWxlX3ZpZGVvKTsKLSAgICB9Ci0KLSAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgIHx8IChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKSkKLSAgICB7Ci0gICAgICAgIC8qdXBkYXRlIGZpbGVTaXplKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSBhdVB0ci0+c2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgJiYgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpKQotICAgIHsKLSAgICAgICAgLyp1cGRhdGUgZmlsZXNpemUgd2l0aCBlc3RpbWF0ZWQgYXVkaW8gZGF0YSB0aGF0IHdpbGwgYmUgYWRkZWQgbGF0ZXIuICAgICovCi0gICAgICAgIC8qV2FybmluZzogQXNzdW1wdGlvbiBpcyBtYWRlIHRoYXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIC0gYXVkaW8gc2FtcGxlcyBoYXZlIGNvbnN0YW50IHNpemUgKGUuZy4gbm8gc2lkKS4gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIC0gbWF4IGF1ZGlvIHNhbXBsZSBzaXplIGhhcyBiZWVuIHNldCwgYW5kIGlzIHRoZSBhY3R1YWwgc2FtcGxlIHNpemUuICovCi0KLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc0NodW5rRHVyICE9IDAsCi0gICAgICAgICAgICBNNFdBUl9NUDRXX05PVF9FVkFMVUFCTEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplIC09Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICAgICAqIHNjYWxlX3ZpZGVvKSAqICgwLjA1LyphbHdheXMgNTAgQU1SIHNhbXBsZXMgcGVyIHNlY29uZCovCi0gICAgICAgICAgICAqKE00T1NBX0RvdWJsZSltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZQotICAgICAgICAgICAgKyAxNi8qYWRkaXRpb25hbCBkYXRhIGZvciBhIG5ldyBjaHVuayovCi0gICAgICAgICAgICAvIChNNE9TQV9Eb3VibGUpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zQ2h1bmtEdXIpKTsKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IChNNE9TQV9VSW50MzIpKCggYXVQdHItPkNUUyAqIHNjYWxlX3ZpZGVvKQotICAgICAgICAgICAgKiAoMC4wNS8qYWx3YXlzIDUwIEFNUiBzYW1wbGVzIHBlciBzZWNvbmQqLwotICAgICAgICAgICAgKihNNE9TQV9Eb3VibGUpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUKLSAgICAgICAgICAgICsgMTYvKmFkZGl0aW9uYWwgZGF0YSBmb3IgYSBuZXcgY2h1bmsqLwotICAgICAgICAgICAgLyAoTTRPU0FfRG91YmxlKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc0NodW5rRHVyKSk7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzQoInByb2Nlc3NBVSA6IHNpemUgMHgleCBtb2RlICVkIGZpbGVzaXplICVsdSBsaW1pdCAlbHUiLAotICAgICAgICBhdVB0ci0+c2l6ZSwgYXVQdHItPmF0dHJpYnV0ZSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfY2xvc2VXcml0ZSggTTRPU0FfQ29udGV4dCBjb250ZXh0ICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiBlcnIyID0gTTROT19FUlJPUiwgZXJyMyA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKldhcm5pbmc6IHRlc3Qgc2hvdWxkIGJlIGRvbmUgaGVyZSB0byBlbnN1cmUgY29udGV4dC0+cENvbnRleHQgaXMgbm90IE00T1NBX05VTEwsCi0gICAgIGJ1dCBDIGlzIG5vdCBDKysuLi4qLwotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9VQ2hhciBjYW1jb2Rlcl9tYWosIGNhbWNvZGVyX21pbiwgY2FtY29kZXJfcmV2OyAvKmNhbWNvZGVyIHZlcnNpb24qLwotICAgIE00T1NBX0Jvb2wgYkF1ZGlvID0KLSAgICAgICAgKCggbU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbykKLSAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAhPSAwKSk7IC8qKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiAhPSAwKSk7Ki8KLSAgICBNNE9TQV9Cb29sIGJWaWRlbyA9Ci0gICAgICAgICgoIG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8pCi0gICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgIT0gMCkpOyAvKigobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyICE9IE00T1NBX05VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgIT0gMCkpOyovCi0gICAgTTRPU0FfQm9vbCBiSDI2MyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkgyNjQgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJNUDRWID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQm9vbCBiQUFDID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQm9vbCBiRVZSQyA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyppbnRlcm1lZGlhdGUgdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgQSwgQiwgTiwgQUI0TjsKLQotICAgIC8qVHJhayB2YXJpYWJsZXMqLwotICAgIE00T1NBX1VJbnQzMiBhX3RyYWtJZCA9IEF1ZGlvU3RyZWFtSUQ7IC8qICAgICAoYXVkaW89MSkqLwotICAgIC8qIGZpcnN0IHRyYWsgb2Zmc2V0IGlzIDMyK21vb3ZTaXplLCBzZWNvbmQgZXF1YWxzIDMyK21vb3ZTaXplKzFzdF90cmFja19zaXplKi8KLSAgICBNNE9TQV9VSW50MzIgYV90cmFrT2Zmc2V0ID0gMzI7Ci0gICAgTTRPU0FfVUludDMyIGFfc3R0c1NpemUgPSAyNDsgICAgICAgICAgLyogQSAoYXVkaW89MjQpKi8KLSAgICBNNE9TQV9VSW50MzIgYV9zdHN6U2l6ZSA9IDIwOyAgICAgICAgICAvKiBCIChhdWRpbz0yMCkqLwotICAgIE00T1NBX1VJbnQzMiBhX3RyYWtTaXplID0gNDAyOyAgICAgICAgIC8qICAgICAoYXVkaW89NDAyKSovCi0gICAgTTRPU0FfVUludDMyIGFfbWRpYVNpemUgPSAzMDI7ICAgICAgICAgLyogICAgIChhdWRpbz0zMDIpKi8KLSAgICBNNE9TQV9VSW50MzIgYV9taW5mU2l6ZSA9IDIyOTsgICAgICAgICAvKiAgICAgKGF1ZGlvPTIyOSkqLwotICAgIE00T1NBX1VJbnQzMiBhX3N0YmxTaXplID0gMTY5OyAgICAgICAgIC8qICAgICAoYXVkaW89MTY5KSovCi0gICAgTTRPU0FfVUludDMyIGFfc3RzZFNpemUgPSA2OTsgICAgICAgICAgLyogICAgIChhdWRpbz02OSApKi8KLSAgICBNNE9TQV9VSW50MzIgYV9lc2RTaXplID0gNTM7ICAgICAgICAgICAvKiAgICAgKGF1ZGlvPTUzICkqLwotICAgIE00T1NBX1VJbnQzMiBhX2RhdGFTaXplID0gMDsgICAgICAgICAgIC8qIHRlbXA6IEF0IHRoZSBlbmQsID0gY3VycmVudFBvcyovCi0gICAgTTRNUDRXX1RpbWUzMiBhX3RyYWtEdXJhdGlvbiA9IDA7ICAgICAgLyogZXF1YWxzIGxhc3RDVFMqLwotICAgIE00TVA0V19UaW1lMzIgYV9tc1RyYWtEdXJhdGlvbiA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGFfc3RzY1NpemUgPSAyODsgICAgICAgICAgLyogMTYrMTIqbmJjaHVua3NhdWRpbyovCi0gICAgTTRPU0FfVUludDMyIGFfc3Rjb1NpemUgPSAyMDsgICAgICAgICAgLyogMTYrNCpuYmNodW5rc2F1ZGlvKi8KLQotICAgIE00T1NBX1VJbnQzMiB2X3RyYWtJZCA9IFZpZGVvU3RyZWFtSUQ7IC8qICh2aWRlbz0yKSovCi0gICAgLyogZmlyc3QgdHJhayBvZmZzZXQgaXMgMzIrbW9vdlNpemUsIHNlY29uZCBlcXVhbHMgMzIrbW9vdlNpemUrMXN0X3RyYWNrX3NpemUqLwotICAgIE00T1NBX1VJbnQzMiB2X3RyYWtPZmZzZXQgPSAzMjsKLSAgICBNNE9TQV9VSW50MzIgdl9zdHRzU2l6ZSA9IDA7ICAgICAgLyogQSAodmlkZW89MTYrOEopKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdHN6U2l6ZSA9IDA7ICAgICAgLyogQiAodmlkZW89MjArNEspKi8KLSAgICBNNE9TQV9VSW50MzIgdl90cmFrU2l6ZSA9IDA7IC8qIChoMjYzPUErQis0Tis0MjYpLCAobXA0dj1BK0IrZHNpKzROKzQ0OCkgKi8KLSAgICBNNE9TQV9VSW50MzIgdl9tZGlhU2l6ZSA9IDA7IC8qIChoMjYzPUErQis0TiszMjYpLCAobXA0dj1BK0IrZHNpKzROKzM0OCkgKi8KLSAgICBNNE9TQV9VSW50MzIgdl9taW5mU2l6ZSA9IDA7IC8qIChoMjYzPUErQis0TisyNTMpLCAobXA0dj1BK0IrZHNpKzROKzI3NSkgKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdGJsU2l6ZSA9IDA7IC8qIChoMjYzPUErQis0TisxODkpLCAobXA0dj1BK0IrZHNpKzROKzIxMSkgKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdHNkU2l6ZSA9IDA7ICAgICAgLyogKGgyNjM9MTE3KSAgICAgICAgLCAobXA0dj0xMzkrZHNpICAgICkqLwotICAgIE00T1NBX1VJbnQzMiB2X2VzZFNpemUgPSAwOyAgICAgICAvKiAoaDI2Mz0xMDEpICAgICAgICAsIChtcDR2PTE1Mytkc2kgICAgKSovCi0gICAgTTRPU0FfVUludDMyIHZfZGF0YVNpemUgPSAwOyAgICAgIC8qIHRlbXA6IEF0IHRoZSBlbmQsID0gY3VycmVudFBvcyovCi0gICAgTTRNUDRXX1RpbWUzMiB2X3RyYWtEdXJhdGlvbiA9IDA7IC8qIGVxdWFscyBsYXN0Q1RTKi8KLSAgICBNNE1QNFdfVGltZTMyIHZfbXNUcmFrRHVyYXRpb24gPSAwOwotICAgIE00T1NBX1VJbnQzMiB2X3N0c2NTaXplID0gMjg7ICAgICAvKiAxNisxMipuYmNodW5rc3ZpZGVvKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdGNvU2l6ZSA9IDIwOyAgICAgLyogMTYrNCpuYmNodW5rc3ZpZGVvKi8KLQotICAgIC8qdmlkZW8gdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdHNzU2l6ZSA9IDA7IC8qIDQqTisxNiAgICAgU1RTUyovCi0KLSAgICAvKmFhYyAmIG1wNHYgdGVtcCB2YXJpYWJsZSovCi0gICAgTTRPU0FfVUludDggZHNpID0gMDsKLQotICAgIC8qSDI2NCB2YXJpYWJsZXMqLwotICAgIE00T1NBX1VJbnQzMiB2X2F2Y0NTaXplID0gMDsgLyogZHNpKzE1Ki8KLQotICAgIC8qTVA0ViB2YXJpYWJsZXMqLwotICAgIE00T1NBX1VJbnQzMiB2X2VzZHNTaXplID0gMDsgICAgICAgIC8qIGRzaSszNyovCi0gICAgTTRPU0FfVUludDggdl9FU0Rlc2NyaXB0b3JTaXplID0KLSAgICAgICAgMDsgLyogZHNpKzIzICh3YXJuaW5nOiBjaGVjayBkc2k8MTA1IGZvciBjb2Rpbmcgc2l6ZSBvbiAxIGJ5dGUpKi8KLSAgICBNNE9TQV9VSW50OCB2X0RDRGVzY3JpcHRvclNpemUgPSAwOyAvKiBkc2krMTUqLwotCi0gICAgLypBQUMgdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgYV9lc2RzU2l6ZSA9IDA7ICAgICAgICAvKiBkc2krMzcqLwotICAgIE00T1NBX1VJbnQ4IGFfRVNEZXNjcmlwdG9yU2l6ZSA9Ci0gICAgICAgIDA7IC8qIGRzaSsyMyAod2FybmluZzogY2hlY2sgZHNpPDEwNSBmb3IgY29kaW5nIHNpemUgb24gMSBieXRlKSovCi0gICAgTTRPU0FfVUludDggYV9EQ0Rlc2NyaXB0b3JTaXplID0gMDsgLyogZHNpKzE1Ki8KLQotICAgIC8qR2VuZXJhbCB2YXJpYWJsZXMqLwotCi0gICAgLyogYXVkaW8gY2h1bmsgc2l6ZSArIHZpZGVvIGNodW5rIHNpemUqLwotICAgIE00T1NBX1VJbnQzMiBtZGF0U2l6ZSA9IDg7Ci0gICAgTTRPU0FfVUludDMyIG1vb3ZTaXplID0gMTE2OyAvKiAxMTYgKyA0MDIoYXVkaW8pICsgICAgKEErQis0Tis0MjYpKGgyNjMpIG9yICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAoQStCK2RzaSs0Tis0NDgpKG1wNHYpICAgICovCi0gICAgTTRPU0FfVUludDMyIGNyZWF0aW9uVGltZTsgLyogQyAqLwotCi0gICAgLypmbGFnIHRvIHNldCB1cCB0aGUgY2h1bmsgaW50ZXJsZWF2ZSBzdHJhdGVneSovCi0gICAgTTRPU0FfQm9vbCBiSW50ZXJsZWF2ZUFWID0KLSAgICAgICAgKGJBdWRpbyAmJiBiVmlkZW8gJiYgKG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciAhPSAwKSk7Ci0KLSAgICBNNE9TQV9Db250ZXh0IGZpbGVXcml0ZXJDb250ZXh0ID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dDsKLQotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgTTRPU0FfRG91YmxlIHNjYWxlX2F1ZGlvID0gMC4wOwotICAgIE00T1NBX0RvdWJsZSBzY2FsZV92aWRlbyA9IDAuMDsKLSAgICBNNE1QNFdfVGltZTMyIGRlbHRhOwotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIG1vb3ZQb3MsIG1kYXRQb3M7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLyptYWNybyBzdGF0ZSAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPSBNNE1QNFdfY2xvc2VkOwotCi0gICAgLyppZiBubyBkYXRhICEqLwotICAgIGlmICgoIWJBdWRpbykgJiYgKCFiVmlkZW8pKQotICAgIHsKLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsgLyp3b3VsZCBiZSBiZXR0ZXIgdG8gcmV0dXJuIGEgd2FybmluZyA/Ki8KLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgLyogUmVtb3ZlIHNhZmV0eSBmaWxlIHRvIG1ha2Ugcm9vbSBmb3Igd2hhdCBuZWVkcyB0byBiZSB3cml0dGVuIG91dCBoZXJlCi0gICAgKGNodW5rIGZsdXNoaW5nIGFuZCBtb292KS4gKi8KLQotICAgIGlmIChNNE9TQV9UUlVFID09IG1NcDRGaWxlRGF0YVB0ci0+Y2xlYW5TYWZldHlGaWxlKQotICAgIHsKLSAgICAgICAgTTRPU0FfQ29udGV4dCB0ZW1wQ29udGV4dDsKLSAgICAgICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5vcGVuV3JpdGUoJnRlbXBDb250ZXh0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsLAotICAgICAgICAgICAgTTRPU0Ffa0ZpbGVXcml0ZSB8IE00T1NBX2tGaWxlQ3JlYXRlKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZSh0ZW1wQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnNhZmV0eUZpbGVVcmwgPSBNNE9TQV9OVUxMOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmNsZWFuU2FmZXR5RmlsZSA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotI2VuZGlmIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0KLSAgICBpZiAoYlZpZGVvKQotICAgIHsKLSAgICAgICAgaWYgKChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTKSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KTsgLyoqPCBjbG9zZSB0aGUgc3RyZWFtIGFueXdheSAqLwotICAgICAgICAgICAgTTRNUDRXX2ZyZWVDb250ZXh0KGNvbnRleHQpOyAvKio8IEZyZWUgdGhlIGNvbnRleHQgY29udGVudCAqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyp2aWRlbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX2Nsb3NlZDsKLQotICAgICAgICAvKmN1cnJlbnQgY2h1bmsgaXMgdGhlIGxhc3Qgb25lIGFuZCBnaXZlcyB0aGUgdG90YWwgbnVtYmVyIG9mIHZpZGVvIGNodW5rcyAoLTEpKi8KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgdl9kYXRhU2l6ZSArPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldOwotICAgICAgICB9Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0jaWZuZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotICAgICAgICAvKmZsdXNoIGNodW5rKi8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiZmx1c2ggdmlkZW8gfCBDTE9TRSIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMygiY3VycmVudCBjaHVuayA9ICVkICBvZmZzZXQgPSAweCV4IHNpemUgPSAweCUwOFgiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmssCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyk7Ci0KLSAgICAgICAgLyp1cGRhdGUgY2h1bmsgb2Zmc2V0Ki8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotCi0gICAgICAgIC8qYWRkIGNodW5rIHNpemUgdG8gYWJzb2x1dGVDdXJyZW50UG9zKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgKz0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvczsKLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgLyp1cGRhdGUgbGFzdCBjaHVuayBzaXplLCBhbmQgYWRkIHRoaXMgdmFsdWUgdG8gdl9kYXRhU2l6ZSovCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2l6ZVRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0gICAgICAgIHZfZGF0YVNpemUgKz0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvczsgLyphZGQgbGFzdCBjaHVuayBzaXplKi8KLQotICAgICAgICB2X3RyYWtEdXJhdGlvbiA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDb21tb25EYXRhLmxhc3RDVFM7IC8qIGVxdWFscyBsYXN0Q1RTKi8KLQotICAgICAgICAvKiBidWdmaXg6IGlmIGEgbmV3IGNodW5rIHdhcyBqdXN0IGNyZWF0ZWQsIGNhbmNlbCBpdCBiZWZvcmUgdG8gY2xvc2UgKi8KLSAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuayAhPSAwKQotICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmstLTsKLSAgICAgICAgfQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudFN0c2NdICYgMHhGRkYpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MtLTsKLSAgICAgICAgfQotCi0jZW5kaWYgLypfTTRNUDRXX1VOQlVGRkVSRURfVklERU8qLwotCi0gICAgICAgIC8qIExhc3Qgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgIC8qIElmIHdlIGhhdmUgdGhlIGZpbGUgZHVyYXRpb24gd2UgdXNlIGl0LCBlbHNlIHdlIGR1cGxpY2F0ZSB0aGUgbGFzdCBBVSAqLwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPk1heEZpbGVEdXJhdGlvbiA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHVzZSBtYXggZmlsZSBkdXJhdGlvbiB0byBjYWxjdWxhdGUgZGVsdGEgb2YgbGFzdCBBVSAqLwotICAgICAgICAgICAgZGVsdGEgPSBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVEdXJhdGlvbgotICAgICAgICAgICAgICAgIC0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFM7Ci0gICAgICAgICAgICB2X3RyYWtEdXJhdGlvbiA9IG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZUR1cmF0aW9uOwotCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBpZiBtb3JlIHRoYW4gMSBmcmFtZSwgY3JlYXRlIGEgbmV3IHN0dHMgZW50cnkgKGVsc2UgYWxyZWFkeSBjcmVhdGVkKSAqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iKys7Ci0gICAgICAgICAgICB9Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBNNE1QNFdfcHV0MzJfTG8oJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdLCAxKTsKLSAgICAgICAgICAgIE00TVA0V19wdXQzMl9IaSgmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMV0sIGRlbHRhKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAqKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgLSAxKV0gPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAqKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgLSAxKSArIDFdID0gZGVsdGE7Ci0KLSNlbmRpZgotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBkdXBsaWNhdGUgdGhlIGRlbHRhIG9mIHRoZSBwcmV2aW91cyBmcmFtZSAqLwotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogaWYgbW9yZSB0aGFuIDEgZnJhbWUsIGR1cGxpY2F0ZSB0aGUgc3R0cyBlbnRyeSAoZWxzZSBhbHJlYWR5IGV4aXN0cykgKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICAgICAgdl90cmFrRHVyYXRpb24gKz0KLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX2dldDMyX0hpKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdICs9IDE7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICB2X3RyYWtEdXJhdGlvbiArPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICAgICAqIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKSArIDFdOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpXSArPSAxOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfY2xvc2VXcml0ZSA6ICEgdmlkZW9UcmFja1B0cixcCi0gICAgICAgICAgICAgICAgICAgICBjYW5ub3Qga25vdyB0aGUgZHVyYXRpb24gb2YgdGhlIHVuaXF1ZSBBVSAhIik7Ci0gICAgICAgICAgICAgICAgLyogSWYgdGhlcmUgaXMgYW4gYXVkaW8gdHJhY2ssIHdlIHVzZSBpdCBhcyBhIGZpbGUgZHVyYXRpb24KLSAgICAgICAgICAgICAgICAoYW5kIHNvLCBhcyBBVSBkdXJhdGlvbi4uLikgKi8KLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfY2xvc2VXcml0ZSA6ICEgTGV0J3MgdXNlIHRoZSBhdWRpbyB0cmFjayBkdXJhdGlvbiAhIik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICAgICAgICAgICAgICAgICAqICgxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS50aW1lc2NhbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgdl90cmFrRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzFdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBFbHNlLCB3ZSB1c2UgYSBNQUdJQ0FMIHZhbHVlICg2NiBtcykgKi8KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfY2xvc2VXcml0ZSA6ICEgTm8gYXVkaW8gdHJhY2sgLT4gdXNlIG1hZ2ljYWwgdmFsdWUgKDY2KSAhIik7IC8qICAgICovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXSA9IDY2OwotICAgICAgICAgICAgICAgICAgICB2X3RyYWtEdXJhdGlvbiA9IDY2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIENhbGN1bGF0ZSB0YWJsZSBzaXplcyAqLwotICAgICAgICBBID0gdl9zdHRzU2l6ZSA9IDE2ICsgOCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmI7IC8qIEEgKHZpZGVvPTE2KzhKKSovCi0gICAgICAgIEIgPSB2X3N0c3pTaXplID0gMjAgKyA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmI7IC8qIEIgKHZpZGVvPTIwKzRLKSovCi0gICAgICAgIE4gPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmI7Ci0gICAgICAgIEFCNE4gPSBBICsgQiArIDQgKiBOOwotCi0gICAgICAgIHNjYWxlX3ZpZGVvID0KLSAgICAgICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0gICAgICAgIHZfbXNUcmFrRHVyYXRpb24gPSAoTTRPU0FfVUludDMyKSh2X3RyYWtEdXJhdGlvbiAqIHNjYWxlX3ZpZGVvKTsKLQotICAgICAgICAvKkNvbnZlcnQgaW50ZWdlcnMgaW4gdGhlIHRhYmxlIGZyb20gTEUgaW50byBCRSovCi0jaWZuZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgTTRNUDRXX3RhYmxlMzJUb0JFKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYik7Ci0gICAgICAgIE00TVA0V190YWJsZTMyVG9CRShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMsCi0gICAgICAgICAgICAyICogKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iKSk7Ci0KLSNlbmRpZgotCi0gICAgICAgIE00TVA0V190YWJsZTMyVG9CRShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIpOwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rSDI2MykKLSAgICAgICAgewotICAgICAgICAgICAgYkgyNjMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgdl90cmFrU2l6ZSA9IEFCNE4gKyA0MjY7IC8qIChoMjYzPUErQis0Tis0MjYpKi8KLSAgICAgICAgICAgIHZfbWRpYVNpemUgPSBBQjROICsgMzI2OyAvKiAoaDI2Mz1BK0IrNE4rMzI2KSovCi0gICAgICAgICAgICB2X21pbmZTaXplID0gQUI0TiArIDI1MzsgLyogKGgyNjM9QStCKzROKzI1MykqLwotICAgICAgICAgICAgdl9zdGJsU2l6ZSA9IEFCNE4gKyAxODk7IC8qIChoMjYzPUErQis0TisxODkpKi8KLSAgICAgICAgICAgIHZfc3RzZFNpemUgPSAxMTc7ICAgICAgICAvKiAoaDI2Mz0xMTcpKi8KLSAgICAgICAgICAgIHZfZXNkU2l6ZSA9IDEwMTsgICAgICAgICAvKiAoaDI2Mz0xMDEpKi8KLQotICAgICAgICAgICAgbW9vdlNpemUgKz0gQUI0TiArIDQyNjsKLQotICAgICAgICAgICAgaWYgKCgoTTRPU0FfSW50MzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlKSAhPSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKnRoZSBvcHRpb25hbCAnYml0cicgYXRvbSBpcyBhcHBlbmRlZCB0byB0aGUgZHNpLHNvIGZpbGVzaXplIGlzIDE2IGJ5dGVzIGJpZ2dlciovCi0gICAgICAgICAgICAgICAgdl90cmFrU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICB2X21kaWFTaXplICs9IDE2OwotICAgICAgICAgICAgICAgIHZfbWluZlNpemUgKz0gMTY7Ci0gICAgICAgICAgICAgICAgdl9zdGJsU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICB2X3N0c2RTaXplICs9IDE2OwotICAgICAgICAgICAgICAgIHZfZXNkU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICBtb292U2l6ZSArPSAxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rSDI2NCkKLSAgICAgICAgewotICAgICAgICAgICAgYkgyNjQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgLyogRm9yIEgyNjQgdGhlcmUgaXMgbm8gZGVmYXVsdCBEU0ksIGFuZCBpdHMgcHJlc2VuY2UgaXMgbWFuZGF0b3J5LAotICAgICAgICAgICAgc28gY2hlY2sgdGhlIERTSSBoYXMgYmVlbiBzZXQqLwotICAgICAgICAgICAgaWYgKDAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplCi0gICAgICAgICAgICAgICAgfHwgTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TVA0V19jbG9zZVdyaXRlOiBlcnJvciwgbm8gSDI2NCBEU0kgaGFzIGJlZW4gc2V0ISIpOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1NUQVRFOwotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypIMjY0IHNpemVzIG9mIHRoZSBhdG9tKi8KLQotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBoYXJkY29kZWQgRFNJIHZhbHVlcyBvZiBIMjY0QmxvY2syCi0gICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBiTVVMUFBTU1BTIGNhc2UKLSAgICAgICAgICAgIHZfYXZjQ1NpemUgPSBzaXplb2YoTTRPU0FfVUludDMyKSArIHNpemVvZihIMjY0QmxvY2syKSArCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplOwotCi0gICAgICAgICAgICB2X3RyYWtTaXplID0gQUI0TiArIHZfYXZjQ1NpemUgKyA0MTE7Ci0gICAgICAgICAgICB2X21kaWFTaXplID0gQUI0TiArIHZfYXZjQ1NpemUgKyAzMTE7Ci0gICAgICAgICAgICB2X21pbmZTaXplID0gQUI0TiArIHZfYXZjQ1NpemUgKyAyMzg7Ci0gICAgICAgICAgICB2X3N0YmxTaXplID0gQUI0TiArIHZfYXZjQ1NpemUgKyAxNzQ7Ci0gICAgICAgICAgICB2X3N0c2RTaXplID0gICAgICAgIHZfYXZjQ1NpemUgKyAxMDI7Ci0gICAgICAgICAgICB2X2VzZFNpemUgID0gICAgICAgIHZfYXZjQ1NpemUgKyA4NjsKLQotICAgICAgICAgICAgbW9vdlNpemUgICArPSBBQjROICsgdl9hdmNDU2l6ZSArIDQxMTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tNUEVHXzQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJNUDRWID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIC8qIEZvciBNUEVHNCB0aGVyZSBpcyBubyBkZWZhdWx0IERTSSwgYW5kIGl0cyBwcmVzZW5jZSBpcyBtYW5kYXRvcnksCi0gICAgICAgICAgICBzbyBjaGVjayB0aGUgRFNJIGhhcyBiZWVuIHNldCovCi0gICAgICAgICAgICBpZiAoMCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUKLSAgICAgICAgICAgICAgICB8fCBNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX2Nsb3NlV3JpdGU6IGVycm9yLCBubyBNUEVHNCBEU0kgaGFzIGJlZW4gc2V0ISIpOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1NUQVRFOwotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypNUDRWIHZhcmlhYmxlcyovCi0gICAgICAgICAgICBkc2kgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemU7Ci0gICAgICAgICAgICB2X2VzZHNTaXplID0gMzcgKyBkc2k7ICAgICAgICAgLyogZHNpKzM3Ki8KLSAgICAgICAgICAgIHZfRVNEZXNjcmlwdG9yU2l6ZSA9Ci0gICAgICAgICAgICAgICAgMjMKLSAgICAgICAgICAgICAgICArIGRzaTsgLyogZHNpKzIzICh3YXJuaW5nOiBjaGVjayBkc2k8MTA1IGZvciBjb2Rpbmcgc2l6ZSBvbiAxIGJ5dGUpKi8KLSAgICAgICAgICAgIHZfRENEZXNjcmlwdG9yU2l6ZSA9IDE1ICsgZHNpOyAvKiBkc2krMTUqLwotCi0gICAgICAgICAgICB2X3RyYWtTaXplID0gQUI0TiArIGRzaSArIDQ0ODsgLyogKG1wNHY9QStCK2RzaSs0Tis0NDgpICAgICovCi0gICAgICAgICAgICB2X21kaWFTaXplID0gQUI0TiArIGRzaSArIDM0ODsgLyogKG1wNHY9QStCK2RzaSs0TiszNDgpICAgICovCi0gICAgICAgICAgICB2X21pbmZTaXplID0gQUI0TiArIGRzaSArIDI3NTsgLyogKG1wNHY9QStCK2RzaSs0TisyNzUpICAgICovCi0gICAgICAgICAgICB2X3N0YmxTaXplID0gQUI0TiArIGRzaSArIDIxMTsgLyogKG1wNHY9QStCK2RzaSs0TisyMTEpICAgICovCi0gICAgICAgICAgICB2X3N0c2RTaXplID0gZHNpICsgMTM5OyAgICAgICAgLyogKG1wNHY9MTM5K2RzaSkqLwotICAgICAgICAgICAgdl9lc2RTaXplID0gZHNpICsgMTIzOyAgICAgICAgIC8qIChtcDR2PTEyMytkc2kpKi8KLQotICAgICAgICAgICAgbW9vdlNpemUgKz0gQUI0TiArIGRzaSArIDQ0ODsKLSAgICAgICAgfQotCi0gICAgICAgIC8qdmlkZW8gdmFyaWFibGVzKi8KLSAgICAgICAgdl9zdHNzU2l6ZSA9IDE2ICsgNCAqIE47IC8qIDQqTisxNiAgICAgU1RTUyovCi0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgICAgICAvKiBzdHNjIHVwZGF0ZSAqLwotCi0gICAgICAgIHZfc3RzY1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICB2X3N0YmxTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgdl9taW5mU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIHZfbWRpYVNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICB2X3RyYWtTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgbW9vdlNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotCi0gICAgICAgIC8qIHN0Y28gdXBkYXRlICovCi0gICAgICAgIHZfc3Rjb1NpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X3N0YmxTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9taW5mU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfbWRpYVNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X3RyYWtTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgbW9vdlNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotCi0jZWxzZQotICAgICAgICAvKnN0c2Mvc3RjbyB1cGRhdGUqLwotCi0gICAgICAgIHZfc3RzY1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9zdGNvU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfc3RibFNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9taW5mU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X21kaWFTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfdHJha1NpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgbW9vdlNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLQotI2VuZGlmCi0KLSAgICAgICAgLyp1cGRhdGUgbGFzdCBjaHVuayB0aW1lKi8KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAgICAgdl9tc1RyYWtEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBpZiAoYkF1ZGlvKQotICAgIHsKLSAgICAgICAgaWYgKChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTKSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KTsgLyoqPCBjbG9zZSB0aGUgc3RyZWFtIGFueXdheSAqLwotICAgICAgICAgICAgTTRNUDRXX2ZyZWVDb250ZXh0KGNvbnRleHQpOyAvKio8IEZyZWUgdGhlIGNvbnRleHQgY29udGVudCAqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyphdWRpbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX2Nsb3NlZDsKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZSA9PSBNNFNZU19rQUFDKQotICAgICAgICB7Ci0gICAgICAgICAgICBiQUFDID0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKmVsc2UsIGF1ZGlvIGlzIGltcGxpY2l0ZWx5IGFtciBpbiB0aGUgZm9sbG93aW5nKi8KLSAgICAgICAgICAgIGRzaSA9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZTsgLyp2YXJpYWJsZSBzaXplKi8KLQotICAgICAgICAgICAgYV9lc2RzU2l6ZSA9IDM3ICsgZHNpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkc2krMzcqLwotICAgICAgICAgICAgYV9FU0Rlc2NyaXB0b3JTaXplID0KLSAgICAgICAgICAgICAgICAyMwotICAgICAgICAgICAgICAgICsgZHNpOyAvKiBkc2krMjMgKHdhcm5pbmc6IGNoZWNrIGRzaTwxMDUgZm9yIGNvZGluZyBzaXplIG9uIDEgYnl0ZSkqLwotICAgICAgICAgICAgYV9EQ0Rlc2NyaXB0b3JTaXplID0gMTUgKyBkc2k7ICAgICAgICAgICAgICAgICAvKiBkc2krMTUqLwotCi0gICAgICAgICAgICBhX2VzZFNpemUgPSBkc2kgKyA3MzsgLypvdmVyd3JpdGUgYV9lc2RTaXplIHdpdGggYWFjIHZhbHVlKi8KLSAgICAgICAgICAgIC8qYWRkIGRpZi4gYmV0d2VlbiBhbXIgJiBhYWMgc2l6ZXM6ICgtIDUzICsgZHNpICsgMzcpKi8KLSAgICAgICAgICAgIGFfc3RzZFNpemUgKz0gZHNpICsgMjA7Ci0gICAgICAgICAgICBhX3N0YmxTaXplICs9IGRzaSArIDIwOwotICAgICAgICAgICAgYV9taW5mU2l6ZSArPSBkc2kgKyAyMDsKLSAgICAgICAgICAgIGFfbWRpYVNpemUgKz0gZHNpICsgMjA7Ci0gICAgICAgICAgICBhX3RyYWtTaXplICs9IGRzaSArIDIwOwotICAgICAgICAgICAgbW9vdlNpemUgKz0gZHNpICsgMjA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0VWUkMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJFVlJDID0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKmVsc2UsIGF1ZGlvIGlzIGltcGxpY2l0ZWx5IGFtciBpbiB0aGUgZm9sbG93aW5nKi8KLQotICAgICAgICAgICAgLyogZXZyYyBkc2kgaXMgb25seSA2IGJ5dGVzIHdoaWxlIGFtciBkc2kgaXMgOSBieXRlcyxhbGwgb3RoZXIgYmxvY2tzIGFyZSB1bmNoYW5nZWQgKi8KLSAgICAgICAgICAgIGFfZXNkU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV9zdHNkU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV9zdGJsU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV9taW5mU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV9tZGlhU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV90cmFrU2l6ZSAtPSAzOwotICAgICAgICAgICAgbW9vdlNpemUgLT0gMzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1opCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCk7IC8qKjwgY2xvc2UgdGhlIHN0cmVhbSBhbnl3YXkgKi8KLSAgICAgICAgICAgICAgICBNNE1QNFdfZnJlZUNvbnRleHQoY29udGV4dCk7IC8qKjwgRnJlZSB0aGUgY29udGV4dCBjb250ZW50ICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypDb252ZXJ0IGludGVnZXJzIGluIHRoZSB0YWJsZSBmcm9tIExFIGludG8gQkUqLwotICAgICAgICAgICAgTTRNUDRXX3RhYmxlMzJUb0JFKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIpOwotICAgICAgICAgICAgYV9zdHN6U2l6ZSArPQotICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBhX3N0YmxTaXplICs9Ci0gICAgICAgICAgICAgICAgNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgIGFfbWluZlNpemUgKz0KLSAgICAgICAgICAgICAgICA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgYV9tZGlhU2l6ZSArPQotICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBhX3RyYWtTaXplICs9Ci0gICAgICAgICAgICAgICAgNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgIG1vb3ZTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgIH0KLQotICAgICAgICBtb292U2l6ZSArPSA0MDI7Ci0KLSAgICAgICAgLypjdXJyZW50IGNodW5rIGlzIHRoZSBsYXN0IG9uZSBhbmQgZ2l2ZXMgdGhlIHRvdGFsIG51bWJlciBvZiBhdWRpbyBjaHVua3MgKC0xKSovCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFfZGF0YVNpemUgKz0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXTsKLSAgICAgICAgfQotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgICAgICAvKmZsdXNoIGNodW5rKi8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJmbHVzaCBhdWRpbyB8IENMT1NFIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJjdXJyZW50IGNodW5rID0gJWQgIG9mZnNldCA9IDB4JXgiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmssCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyk7Ci0KLSAgICAgICAgLyp1cGRhdGUgY2h1bmsgb2Zmc2V0Ki8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotCi0gICAgICAgIC8qYWRkIGNodW5rIHNpemUgdG8gYWJzb2x1dGVDdXJyZW50UG9zKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgKz0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvczsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAvKnVwZGF0ZSBsYXN0IGNodW5rIHNpemUsIGFuZCBhZGQgdGhpcyB2YWx1ZSB0byBhX2RhdGFTaXplKi8KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTaXplVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvczsKLSAgICAgICAgYV9kYXRhU2l6ZSArPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zOyAvKmFkZCBsYXN0IGNodW5rIHNpemUqLwotCi0gICAgICAgIC8qIGJ1Z2ZpeDogaWYgYSBuZXcgY2h1bmsgd2FzIGp1c3QgY3JlYXRlZCwgY2FuY2VsIGl0IGJlZm9yZSB0byBjbG9zZSAqLwotICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rICE9IDApCi0gICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuay0tOwotICAgICAgICB9Ci0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0KLSAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50U3RzY10gJiAweEZGRikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYy0tOwotICAgICAgICB9Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTyovCi0KLSAgICAgICAgYV90cmFrRHVyYXRpb24gPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ29tbW9uRGF0YS5sYXN0Q1RTOyAvKiBlcXVhbHMgbGFzdENUUyovCi0gICAgICAgIC8qIGFkZCBsYXN0IHNhbXBsZSBkdXIgKi8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgIT0gMSkKLSAgICAgICAgewotI2lmZGVmIERVUExJQ0FURV9TVFRTX0lOX0xBU1RfQVUKLSAgICAgICAgICAgIC8qaW5jcmVhc2Ugb2YgMSB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIEFVcyB3aXRoIHNhbWUgZHVyYXRpb24qLwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICoobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICAtIDEpIC0gMl0gKz0gMTsKLQotI2VuZGlmIC8qRFVQTElDQVRFX1NUVFNfSU5fTEFTVF9BVSovCi0KLSAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uICs9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgKiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKSAtIDFdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICAgICAgPT0gTTRTWVNfa0FNUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoMTIyMDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMzIKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoMTAyMDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMjcKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoNzk1MCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAyMQotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICg3NDAwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDIwCi0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDY3MDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMTgKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoNTkwMCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAxNgotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICg1MTUwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDE0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDQ3NTAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMTMKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzY2FsZV9hdWRpbyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotICAgICAgICBhX21zVHJha0R1cmF0aW9uID0gKE00T1NBX1VJbnQzMikoYV90cmFrRHVyYXRpb24gKiBzY2FsZV9hdWRpbyk7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgICAgICAvKiBzdHNjIHVwZGF0ZSAqLwotCi0gICAgICAgIGFfc3RzY1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICBhX3N0YmxTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgYV9taW5mU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIGFfbWRpYVNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICBhX3RyYWtTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgbW9vdlNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotCi0gICAgICAgIC8qIHN0c28gdXBkYXRlICovCi0gICAgICAgIGFfc3Rjb1NpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX3N0YmxTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9taW5mU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfbWRpYVNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX3RyYWtTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgbW9vdlNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotCi0jZWxzZQotICAgICAgICAvKnN0c2Mvc3RjbyB1cGRhdGUqLwotCi0gICAgICAgIGFfc3RzY1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9zdGNvU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfc3RibFNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9taW5mU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX21kaWFTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfdHJha1NpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgbW9vdlNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLQotI2VuZGlmCi0KLSAgICAgICAgLyogY29tcHV0ZSB0aGUgbmV3IHNpemUgb2Ygc3R0cyovCi0KLSAgICAgICAgYV9zdHRzU2l6ZSA9IDE2ICsgOCAqIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSk7Ci0KLSAgICAgICAgbW9vdlNpemUgKz0gYV9zdHRzU2l6ZSAtIDI0OwotICAgICAgICBhX21kaWFTaXplICs9IGFfc3R0c1NpemUgLSAyNDsKLSAgICAgICAgYV9taW5mU2l6ZSArPSBhX3N0dHNTaXplIC0gMjQ7Ci0gICAgICAgIGFfc3RibFNpemUgKz0gYV9zdHRzU2l6ZSAtIDI0OwotICAgICAgICBhX3RyYWtTaXplICs9IGFfc3R0c1NpemUgLSAyNDsKLQotICAgICAgICAvKnVwZGF0ZSBsYXN0IGNodW5rIHRpbWUqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAgICAgYV9tc1RyYWtEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiBjaGFuZ2luZyB0aGUgd2F5IHRoZSBtZGF0IHNpemUgaXMgY29tcHV0ZWQuCi0gICAgVGhlIHJlYWwgcHVycG9zZSBvZiB0aGUgbWRhdCBzaXplIGlzIHRvIGtub3cgdGhlIGFtb3VudCB0byBza2lwIHRvIGdldCB0byB0aGUgbmV4dAotICAgIGF0b20sIHdoaWNoIGlzIHRoZSBtb292OyB0aGUgc2l6ZSBvZiBtZWRpYSBpbiB0aGUgbWRhdCBpcyBhbG1vc3Qgc2Vjb25kYXJ5LiBUaGVyZWZvcmUsCi0gICAgaXQgaXMgb2YgdXRtb3N0IGltcG9ydGFuY2UgdGhhdCB0aGUgbWRhdCBzaXplICJwb2ludHMiIHRvIHdoZXJlIHRoZSBtb292IGFjdHVhbGx5Ci0gICAgYmVnaW5zLiBOb3csIHRoZSBtb292IGJlZ2lucyByaWdodCBhZnRlciB0aGUgbGFzdCBkYXRhIHdlIHdyb3RlLCBzbyBob3cgY291bGQgdGhlIHN1bQotICAgIG9mIGFsbCBjaHVuayBzaXplcyBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgdG90YWwgc2l6ZSBvZiB3aGF0IGhhcyBiZWVuIHdyaXR0ZW4/IFdlbGwsIGl0Ci0gICAgY2FuIGhhcHBlbiB3aGVuIHRoZSB3cml0aW5nIHdhcyB1bmV4cGVjdGVkbHkgc3RvcHBlZCAoYmVjYXVzZSBvZiBsYWNrIG9mIGRpc2sgc3BhY2UsCi0gICAgZm9yIGluc3RhbmNlKSwgaW4gdGhpcyBjYXNlIGEgY2h1bmsgbWF5IGJlIHBhcnRpYWxseSB3cml0dGVuICh0aGUgcGFydGlhbCB3cml0ZSBpcyBub3QKLSAgICBuZWNlc3NhcmlseSBlcmFzZWQpIGJ1dCBpdCBtYXkgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGUgY2h1bmsgc2l6ZSBsaXN0ICh3aGljaCBtYXkKLSAgICBiZWxpZXZlIGl0IGhhc24ndCBiZWVuIHdyaXR0ZW4gb3Igb24gdGhlIGNvbnRyYXJ5IHRoYXQgaXQgaGFzIGJlZW4gZnVsbHkgd3JpdHRlbikuIEluCi0gICAgdGhlIGNhc2Ugb2Ygc3VjaCBhIG1pc21hdGNoLCB0aGVyZSBpcyBlaXRoZXIgdW51c2VkIGRhdGEgaW4gdGhlIG1kYXQgKG5vdCB2ZXJ5IGdvb2QsCi0gICAgYnV0IHRvbGVyYWJsZSkgb3Igd2hlbiByZWFkaW5nIHRoZSBsYXN0IGNodW5rIGl0IHdpbGwgcmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtb292Ci0gICAgYXMgcGFydCBvZiB0aGUgY2h1bmsgKHdoaWNoIG1lYW5zIHRoZSBsYXN0IGNodW5rIHdvbid0IGJlIGNvcnJlY3RseSBkZWNvZGVkKSwgYm90aCBvZgotICAgIHdoaWNoIGFyZSBzdGlsbCBiZXR0ZXIgdGhhbiBsb3NpbmcgdGhlIHdob2xlIHJlY29yZGluZy4gSW4gdGhlIGxvbmcgcnVuIGl0J2xsIHByb2JhYmx5Ci0gICAgYmUgYXR0ZW1wdGVkIHRvIGFsd2F5cyBjbGVhbiB1cCBiYWNrIHRvIGEgY29uc2lzdGVudCBzdGF0ZSwgYnV0IGF0IGFueSByYXRlIGl0IGlzCi0gICAgYWx3YXlzIHNhZmVyIHRvIGhhdmUgdGhlIG1kYXQgc2l6ZSBiZSBjb21wdXRlZCB1c2luZyB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIG1vb3YKLSAgICBhY3R1YWxseSBiZWdpbnMsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBzaXplIGl0IGlzIHRob3VnaHQgdGhlIG1kYXQgaGFzLgotCi0gICAgVGhlcmVmb3JlLCBJIHdpbGwgcmVjb3JkIHdoZXJlIHdlIGFyZSBqdXN0IGJlZm9yZSB3cml0aW5nIHRoZSBtb292LCB0byBzZXJ2ZSB3aGVuCi0gICAgdXBkYXRpbmcgdGhlIG1kYXQgc2l6ZS4gKi8KLQotICAgIC8qIG1kYXRTaXplICs9IGFfZGF0YVNpemUgKyB2X2RhdGFTaXplOyAqLy8qVE9ETyBhbGxvdyBmb3IgbXVsdGlwbGUgY2h1bmtzKi8KLQotICAgIC8qIEVuZCBvZiBQaWVycmUgTGViZWF1cGluIDE5LzEyLzIwMDc6IGNoYW5naW5nIHRoZSB3YXkgdGhlIG1kYXQgc2l6ZSBpcyBjb21wdXRlZC4gKi8KLQotICAgIC8qIGZpcnN0IHRyYWsgb2Zmc2V0IGlzIDMyK21vb3ZTaXplLCBzZWNvbmQgZXF1YWxzIDMyK21vb3ZTaXplKzFzdF90cmFja19zaXplKi8KLSAgICBhX3RyYWtPZmZzZXQgKz0gbW9vdlNpemU7Ci0gICAgdl90cmFrT2Zmc2V0ICs9IG1vb3ZTaXplLyorIGFfZGF0YVNpemUqLzsKLQotICAgIGlmIChiSW50ZXJsZWF2ZUFWID09IE00T1NBX0ZBTFNFKQotICAgICAgICB2X3RyYWtPZmZzZXQgKz0gYV9kYXRhU2l6ZTsKLQotICAgIC8qc3lzdGVtIHRpbWUgc2luY2UgMTk3MCAqLwotI2lmbmRlZiBfTTRNUDRXX0RPTlRfVVNFX1RJTUVfSAotCi0gICAgdGltZSgodGltZV90ICopJmNyZWF0aW9uVGltZSk7Ci0gICAgLypjb252ZXJ0IGludG8gdGltZSBzaW5jZSAxLzEvMTkwNCAwMGgwMCAobm9ybWF0aXZlKSovCi0gICAgY3JlYXRpb25UaW1lICs9IDIwODI4NDE3NjE7IC8qbmIgb2Ygc2VjIGJldHdlZW4gMTkwNCBhbmQgMTk3MCovCi0KLSNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfRE9OVF9VU0VfVElNRV9IKi8KLQotICAgIGNyZWF0aW9uVGltZSA9Ci0gICAgICAgIDB4QkJEMDkxMDA7IC8qID0gNy8xMS8yMDAzIDAwaDAwIDsgaW4gaGV4YSBiZWNhdXNlIG9mIGNvZGUgc2NyYW1ibGVyIGxpbWl0YXRpb24gd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlIGludGVnZXJzICovCi0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfRE9OVF9VU0VfVElNRV9IKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZHVyYXRpb24gPQotICAgICAgICBtYXgoYV9tc1RyYWtEdXJhdGlvbiwgdl9tc1RyYWtEdXJhdGlvbik7IC8qbWF4IGF1ZGlvL3ZpZGVvKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIC8qb3BlbiBmaWxlIGluIHdyaXRlIGJpbmFyeSBtb2RlKi8KLQotICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+b3BlbldyaXRlKCZmaWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT51cmwsIDB4MjIpOwotICAgIEVSUl9DSEVDSyhlcnIgPT0gTTROT19FUlJPUiwgZXJyKTsKLQotICAgIC8qZnR5cCBhdG9tKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1ham9yX2JyYW5kICE9IDApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgICAgICAvKiBQdXQgY3VzdG9taXplZCBmdHlwIGJveCAqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoMTYKLSAgICAgICAgICAgICsgKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5uYkNvbXBhdGlibGVCcmFuZHMgKiA0KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKE00TVBBQ19GVFlQX1RBRywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5tYWpvcl9icmFuZCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5taW5vcl92ZXJzaW9uLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kczsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5jb21wYXRpYmxlX2JyYW5kc1tpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFB1dCBkZWZhdWx0IGZ0eXAgYm94ICovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soRGVmYXVsdF9mdHlwLCBzaXplb2YoRGVmYXVsdF9mdHlwKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICB9Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgLyogc2VlayBpcyB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0gICAgLyogLi4uIG9yIHJhdGhlciwgc2VlayB1c2VkIHRvIGJlIHVzZWQgZm9yIHRoYXQsIGJ1dCBpdCBoYXMgYmVlbiBmb3VuZCB0aGlzIGZ1bmN0aW9uYWxpdHkKLSAgICBpcyBub3QgcmVsaWFibHksIG9yIHNvbWV0aW1lcyBub3QgYXQgYWxsLCBpbXBsZW1lbnRlZCBpbiB0aGUgdmFyaW91cyBPU0FMcywgc28gd2Ugbm93IGF2b2lkCi0gICAgdXNpbmcgaXQuICovCi0gICAgLyogTm90aWNlIHRoaXMgbmV3IG1ldGhvZCBhc3N1bWVzIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHRoaXMgd2lsbCBicmVhayBpZiBldmVyIHdlCi0gICAgYXJlIG92ZXJ3cml0aW5nIGEgbGFyZ2VyIGZpbGUuICovCi0KLSAgICBDTEVBTlVQb25FUlIobU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5nZXRPcHRpb24oCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQsCi0gICAgICAgIE00T1NBX2tGaWxlV3JpdGVHZXRGaWxlU2l6ZSwgKE00T1NBX0RhdGFPcHRpb24gKikgJm1vb3ZQb3MpKTsKLSAgICAvKiBtb292UG9zIHdpbGwgYmUgdXNlZCBhZnRlciB3cml0aW5nIHRoZSBtb292LiAqLwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1vb3ZTaXplLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazMsIHNpemVvZihDb21tb25CbG9jazMpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrNCwgc2l6ZW9mKENvbW1vbkJsb2NrNCksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5kdXJhdGlvbiwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s1LCBzaXplb2YoQ29tbW9uQmxvY2s1KSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgaWYgKGJBdWRpbykKLSAgICB7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3RyYWtTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrNiwgc2l6ZW9mKENvbW1vbkJsb2NrNiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3RyYWtJZCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazcsIHNpemVvZihDb21tb25CbG9jazcpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9tc1RyYWtEdXJhdGlvbiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazdiaXMsIHNpemVvZihDb21tb25CbG9jazdiaXMpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFNUkJsb2NrMSwgc2l6ZW9mKEFNUkJsb2NrMSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9tZGlhU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazgsIHNpemVvZihDb21tb25CbG9jazgpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV90cmFrRHVyYXRpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s5LCBzaXplb2YoQ29tbW9uQmxvY2s5KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBTVJCbG9jazFfMSwgc2l6ZW9mKEFNUkJsb2NrMV8xKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX21pbmZTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTAsIHNpemVvZihDb21tb25CbG9jazEwKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfc3RibFNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxMSwgc2l6ZW9mKENvbW1vbkJsb2NrMTEpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9zdHRzU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazEyLCBzaXplb2YoQ29tbW9uQmxvY2sxMiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAvKmludmVydCB0aGUgdGFibGUgZGF0YSB0byBiaWdlbmRpYW4qLwotICAgICAgICBNNE1QNFdfdGFibGUzMlRvQkUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTLAotICAgICAgICAgICAgMiAqIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgLSAxKSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUywKLSAgICAgICAgICAgICggbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKQotICAgICAgICAgICAgKiA4LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLQotICAgICAgICAvKiBzdHNkICovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3N0c2RTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFNhbXBsZURlc2NyaXB0aW9uSGVhZGVyLAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uSGVhZGVyKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfZXNkU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAvKiBzYW1wbGUgZGVzYyBlbnRyeSBpbnNpZGUgc3RzZCAqLwotICAgICAgICBpZiAoYkFBQykKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBQUNCbG9jazEsIHNpemVvZihBQUNCbG9jazEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYkVWUkMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soRVZSQzhCbG9jazEsIHNpemVvZihFVlJDOEJsb2NrMSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qZXZyYyovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvKkFNUjgqLwotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFNUjhCbG9jazEsIHNpemVvZihBTVI4QmxvY2sxKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphbXI4Ki8KLSAgICAgICAgfQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFNhbXBsZURlc2NyaXB0aW9uRW50cnlTdGFydCwKLSAgICAgICAgICAgIHNpemVvZihTYW1wbGVEZXNjcmlwdGlvbkVudHJ5U3RhcnQpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEF1ZGlvU2FtcGxlRGVzY0VudHJ5Qm9pbGVycGxhdGUsCi0gICAgICAgICAgICBzaXplb2YoQXVkaW9TYW1wbGVEZXNjRW50cnlCb2lsZXJwbGF0ZSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlCi0gICAgICAgICAgICA8PCAxNiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAvKiBEU0kgaW5zaWRlIHNhbXBsZSBkZXNjIGVudHJ5ICovCi0gICAgICAgIGlmIChiQUFDKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9lc2RzU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2swLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2swKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZShhX0VTRGVzY3JpcHRvclNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMSwKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMSksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoYV9EQ0Rlc2NyaXB0b3JTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFBQ0Jsb2NrMiwgc2l6ZW9mKEFBQ0Jsb2NrMiksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUyNChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUgKiA1LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5tYXhCaXRyYXRlLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazIsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazIpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMywKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMyksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYkVWUkMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4IGxvY2FsRHNpWzZdOwotICAgICAgICAgICAgTTRPU0FfVUludDMyIGxvY2FsSTsKLQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhFVlJDQmxvY2szXzEsIHNpemVvZihFVlJDQmxvY2szXzEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLQotICAgICAgICAgICAgLyogY29weSB0aGUgZGVmYXVsdCBibG9jayBpbiBhIGxvY2FsIHZhcmlhYmxlKi8KLSAgICAgICAgICAgIGZvciAoIGxvY2FsSSA9IDA7IGxvY2FsSSA8IDY7IGxvY2FsSSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2NhbERzaVtsb2NhbEldID0gRVZSQ0Jsb2NrM18yW2xvY2FsSV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBjb21wdXRlcyB0aGUgbnVtYmVyIG9mIHNhbXBsZSBwZXIgYXUgKi8KLSAgICAgICAgICAgIC8qIGFuZCBzdG9yZXMgaXQgaW4gdGhlIERTSSovCi0gICAgICAgICAgICAvKiBhc3N1bWVzIGEgY2hhciBpcyBlbm91Z2ggdG8gc3RvcmUgdGhlIGRhdGEqLwotICAgICAgICAgICAgbG9jYWxEc2lbNV0gPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCkobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbgotICAgICAgICAgICAgICAgIC8gMTYwKS8qRVZSQyAxIGZyYW1lIGR1cmF0aW9uKi87Ci0KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNvcHkgdmVuZG9yIG5hbWUgKi8KLSAgICAgICAgICAgICAgICBmb3IgKCBsb2NhbEkgPSAwOyBsb2NhbEkgPCA0OyBsb2NhbEkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2NhbERzaVtsb2NhbEldID0gKE00T1NBX1VJbnQ4KSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJW2xvY2FsSV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2sobG9jYWxEc2ksIDYsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgLypBTVI4Ki8KLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDggbG9jYWxEc2lbOV07Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgbG9jYWxJOwotCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFNUkRTSUhlYWRlciwgc2l6ZW9mKEFNUkRTSUhlYWRlciksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgICAgICAvKiBjb3B5IHRoZSBkZWZhdWx0IGJsb2NrIGluIGEgbG9jYWwgdmFyaWFibGUqLwotICAgICAgICAgICAgZm9yICggbG9jYWxJID0gMDsgbG9jYWxJIDwgOTsgbG9jYWxJKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvY2FsRHNpW2xvY2FsSV0gPSBBTVJEZWZhdWx0RFNJW2xvY2FsSV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBjb21wdXRlcyB0aGUgbnVtYmVyIG9mIHNhbXBsZSBwZXIgYXUgKi8KLSAgICAgICAgICAgIC8qIGFuZCBzdG9yZXMgaXQgaW4gdGhlIERTSSovCi0gICAgICAgICAgICAvKiBhc3N1bWVzIGEgY2hhciBpcyBlbm91Z2ggdG8gc3RvcmUgdGhlIGRhdGEqLwotICAgICAgICAgICAgLyogQUxFUlQhIFRoZSBwb3RlbnRpYWwgb2YgdGhlIGZvbGxvd2luZyBsaW5lIG9mIGNvZGUgdG8gZXhwbG9kZSBpbiBvdXIgZmFjZQotICAgICAgICAgICAgaXMgZW5vcm1vdXMgd2hlbiBhbnl0aGluZyAoc2FtcGxlIHJhdGUgb3Igd2hhdGV2ZXIpIHdpbGwgY2hhbmdlLiBUaGlzCi0gICAgICAgICAgICBjYWxjdWxhdGlvbiB3b3VsZCBiZSBNVUNIIGJldHRlciBoYW5kbGVkIGJ5IHRoZSBWRVMgb3Igd2hhdGV2ZXIgZGVhbHMgd2l0aAotICAgICAgICAgICAgdGhlIGVuY29kZXIgbW9yZSBkaXJlY3RseS4gKi8KLSAgICAgICAgICAgIGxvY2FsRHNpWzhdID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24KLSAgICAgICAgICAgICAgICAvIDE2MCkvKkFNUiBOQiAxIGZyYW1lIGR1cmF0aW9uKi87Ci0KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNvcHkgdmVuZG9yIG5hbWUgKi8KLSAgICAgICAgICAgICAgICBmb3IgKCBsb2NhbEkgPSAwOyBsb2NhbEkgPCA0OyBsb2NhbEkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2NhbERzaVtsb2NhbEldID0gKE00T1NBX1VJbnQ4KSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJW2xvY2FsSV0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIE1vZGUgU2V0ICovCi0gICAgICAgICAgICAgICAgZm9yICggbG9jYWxJID0gNTsgbG9jYWxJIDwgNzsgbG9jYWxJKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxEc2lbbG9jYWxJXSA9IChNNE9TQV9VSW50OCkoCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSVtsb2NhbEldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKGxvY2FsRHNpLCA5LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qZW5kIHRyYWsqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9zdHN6U2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazE1LCBzaXplb2YoQ29tbW9uQmxvY2sxNSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgLyowIHZhbHVlIGZvciBzYW1wbGVzaXplIG1lYW5zIG5vdCBjb25zdGFudCBBVSBzaXplKi8KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyCi0gICAgICAgICAgICAgICAgKiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1osCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICogNCwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9zdHNjU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazE2LCBzaXplb2YoQ29tbW9uQmxvY2sxNiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjCi0gICAgICAgICAgICArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICAgICAgKCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVtpXQotICAgICAgICAgICAgPj4gMTIpICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW2ldICYgMHhGRkYpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuawotICAgICAgICAgICAgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihpICsgMSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfc3Rjb1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxNywgc2l6ZW9mKENvbW1vbkJsb2NrMTcpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsKLSAgICAgICAgICAgICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3RyYWtPZmZzZXQsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgYV90cmFrT2Zmc2V0ICs9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV07Ci0KLSAgICAgICAgICAgIGlmICgoIGJJbnRlcmxlYXZlQVYgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPj0gaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYV90cmFrT2Zmc2V0ICs9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFNUkJsb2NrNCwgc2l6ZW9mKEFNUkJsb2NrNCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgIH0KLQotICAgIGlmIChiVmlkZW8pCi0gICAgewotICAgICAgICAvKnRyYWsqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl90cmFrU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazYsIHNpemVvZihDb21tb25CbG9jazYpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl90cmFrSWQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s3LCBzaXplb2YoQ29tbW9uQmxvY2s3KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfbXNUcmFrRHVyYXRpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s3YmlzLCBzaXplb2YoQ29tbW9uQmxvY2s3YmlzKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAvKiBJbiB0aGUgdHJhY2sgaGVhZGVyIHdpZHRoIGFuZCBoZWlnaHQgYXJlIDE2LjE2IGZpeGVkIHBvaW50IHZhbHVlcywKLSAgICAgICAgc28gc2hpZnQgbGVmdCB0aGUgcmVndWxhciBpbnRlZ2VyIHZhbHVlIGJ5IDE2LiAqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT53aWR0aCA8PCAxNiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmhlaWdodAotICAgICAgICAgICAgPDwgMTYsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X21kaWFTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrOCwgc2l6ZW9mKENvbW1vbkJsb2NrOCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3RyYWtEdXJhdGlvbiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazksIHNpemVvZihDb21tb25CbG9jazkpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFZpZGVvQmxvY2sxXzEsIHNpemVvZihWaWRlb0Jsb2NrMV8xKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X21pbmZTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTAsIHNpemVvZihDb21tb25CbG9jazEwKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3RibFNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxMSwgc2l6ZW9mKENvbW1vbkJsb2NrMTEpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9zdHRzU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazEyLCBzaXplb2YoQ29tbW9uQmxvY2sxMiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgZm9yICggaSA9IDA7Ci0gICAgICAgICAgICBpIDwgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmI7Ci0gICAgICAgICAgICBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoTTRNUDRXX2dldDMyX0xvKAotICAgICAgICAgICAgICAgICZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbaV0pLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihNNE1QNFdfZ2V0MzJfSGkoCi0gICAgICAgICAgICAgICAgJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1tpXSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jaygoY29uc3QgTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTLAotICAgICAgICAgICAgKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYikgKiA4LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLQotI2VuZGlmCi0KLSAgICAgICAgLyogc3RzZCAqLwotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0c2RTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFNhbXBsZURlc2NyaXB0aW9uSGVhZGVyLAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uSGVhZGVyKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfZXNkU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAvKiBzYW1wbGUgZGVzYyBlbnRyeSBpbnNpZGUgc3RzZCAqLwotICAgICAgICBpZiAoYk1QNFYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTXA0dkJsb2NrMSwgc2l6ZW9mKE1wNHZCbG9jazEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJIMjYzKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjNCbG9jazEsIHNpemVvZihIMjYzQmxvY2sxKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjYzKi8KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiSDI2NCkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjY0QmxvY2sxLCBzaXplb2YoSDI2NEJsb2NrMSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2NCovCi0gICAgICAgIH0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhTYW1wbGVEZXNjcmlwdGlvbkVudHJ5U3RhcnQsCi0gICAgICAgICAgICBzaXplb2YoU2FtcGxlRGVzY3JpcHRpb25FbnRyeVN0YXJ0KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhTYW1wbGVEZXNjcmlwdGlvbkVudHJ5VmlkZW9Cb2lsZXJwbGF0ZTEsCi0gICAgICAgICAgICBzaXplb2YoU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUxKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUxNihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPndpZHRoLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTE2KG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+aGVpZ2h0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhWaWRlb1Jlc29sdXRpb25zLCBzaXplb2YoVmlkZW9SZXNvbHV0aW9ucyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUyLAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uRW50cnlWaWRlb0JvaWxlcnBsYXRlMiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotCi0gICAgICAgIC8qIERTSSBpbnNpZGUgc2FtcGxlIGRlc2MgZW50cnkgKi8KLSAgICAgICAgaWYgKGJIMjYzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUaGUgaDI2MyBkc2kgZ2l2ZW4gdGhyb3VnaCB0aGUgYXBpIG11c3QgYmUgNyBieXRlcywgdGhhdCBpcywgaXQgc2hhbGwgbm90IGluY2x1ZGUKLSAgICAgICAgICAgICB0aGUgb3B0aW9uYWwgYml0cmF0ZSBib3guIEhvd2V2ZXIsIGlmIHRoZSBiaXRyYXRlIGluZm9ybWF0aW9uIGlzIHNldCBpbiB0aGUgc3RyZWFtCi0gICAgICAgICAgICAgaGFuZGxlciwgYSBiaXRyYXRlIGJveCBpcyBhcHBlbmRlZCBoZXJlIHRvIHRoZSBkc2kgKi8KLSAgICAgICAgICAgIGlmICgoKE00T1NBX0ludDMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSkgIT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2syX2JpdHIsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihIMjYzQmxvY2syX2JpdHIpLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qIGQyNjMgYm94IHdpdGggYml0ciBhdG9tICovCi0KLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2M0Jsb2NrMywgc2l6ZW9mKEgyNjNCbG9jazMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjYzKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjNCbG9jazQsIHNpemVvZihIMjYzQmxvY2s0KSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjMqLwotICAgICAgICAgICAgICAgIC8qIFBpZXJyZSBMZWJlYXVwaW4gMjAwOC8wNC8yOTogdGhlIHR3byBmb2xsb3dpbmcgbGluZXMgdXNlZCB0byBiZSBzd2FwcGVkOwotICAgICAgICAgICAgICAgIEkgY2hhbmdlZCB0byB0aGlzIG9yZGVyIGluIG9yZGVyIHRvIGNvbmZvcm0gdG8gM0dQUC4gKi8KLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjMqLwotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5tYXhCaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2MyovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2syLCBzaXplb2YoSDI2M0Jsb2NrMiksCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyogZDI2MyBib3ggKi8KLQotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2szLCBzaXplb2YoSDI2M0Jsb2NrMyksCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjMqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiTVA0VikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDMyIGJ1ZmZlclNpemVEQiA9IDUgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGF2Z0JpdHJhdGU7IC8qYnVmZmVyU2l6ZURCIHNldCB0byA1IHRpbWVzIHRoZSBiaXRyYXRlKi8KLQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfZXNkc1NpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazAsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazApLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSh2X0VTRGVzY3JpcHRvclNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazEsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazEpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSh2X0RDRGVzY3JpcHRvclNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1wNHZCbG9jazMsIHNpemVvZihNcDR2QmxvY2szKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUyNChidWZmZXJTaXplREIsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5tYXhCaXRyYXRlLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMiwKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMiksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2szLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2szKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoYkgyNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBwcHNMZW50Z2ggPSAwOyAvKiBQUFMgbGVuZ3RoICovCi0gICAgICAgICAgICBNNE9TQV9VSW50MTYgc3BzTGVudGdoID0gMDsgLyogU1BTIGxlbmd0aCAqLwotICAgICAgICAgICAgTTRPU0FfVUNoYXIgKnRtcERTSSA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJOyAvKiBEU0kgKi8KLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBOdW1iZXJPZlBQUzsKLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBsQ250UFBTOwotCi0gICAgICAgICAgICAvKiBQdXQgdGhlIGF2Y0MgKGhlYWRlciArIERTSSkgc2l6ZSAqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfYXZjQ1NpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2NCovCi0gICAgICAgICAgICAvKiBQdXQgdGhlIGF2Y0MgaGVhZGVyICovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjRCbG9jazIsIHNpemVvZihIMjY0QmxvY2syKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjY0Ki8KLSAgICAgICAgICAgIC8qIFB1dCB0aGUgRFNJIChTUFMgKyBQUFMpIGludCB0aGUgM2dwIGZvcm1hdCovCi0gICAgICAgICAgICAvKiBTUFMgbGVuZ3RoIGluIEJFICovCi0KLSAgICAgICAgICAgIGlmICgoMHgwMSAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSVswXSkgfHwKLSAgICAgICAgICAgICAgICAgKDB4NDIgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0lbMV0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCIhISEgTTRNUDRXX2Nsb3NlV3JpdGUgRVJST1IgOiBpbnZhbGlkIEFWQ0MgMHglWCAweCVYIiwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0lbMF0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJWzFdKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRG8gbm90IHN0cmlwIHRoZSBEU0kKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUiggTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpICk7LypoMjY0Ki8KLQotICAgICAgICB9Ci0KLSAgICAgICAgLyplbmQgdHJhayovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0c3pTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTUsIHNpemVvZihDb21tb25CbG9jazE1KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWltpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKChjb25zdCBNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1osCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgKiA0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLQotI2VuZGlmCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3RzY1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxNiwgc2l6ZW9mKENvbW1vbkJsb2NrMTYpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYwotICAgICAgICAgICAgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgICAgICggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbaV0KLSAgICAgICAgICAgID4+IDEyKSArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVtpXSAmIDB4RkZGKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsKLSAgICAgICAgICAgICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGkgKyAxLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9zdGNvU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazE3LCBzaXplb2YoQ29tbW9uQmxvY2sxNyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuawotICAgICAgICAgICAgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoIGJJbnRlcmxlYXZlQVYgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPj0gaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdl90cmFrT2Zmc2V0ICs9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl90cmFrT2Zmc2V0LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIHZfdHJha09mZnNldCArPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldOwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGVbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3Rzc1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFZpZGVvQmxvY2s0LCBzaXplb2YoVmlkZW9CbG9jazQpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYiAqIDQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFZpZGVvQmxvY2s1LCBzaXplb2YoVmlkZW9CbG9jazUpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICB9Ci0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgLyptZGF0Ki8KLQotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtZGF0U2l6ZSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2syLCBzaXplb2YoQ29tbW9uQmxvY2syKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgLyp3cml0ZSBkYXRhLCBhY2NvcmRpbmcgdG8gdGhlIGludGVybGVhdmUgbW9kZSAoZGVmYXVsdCBpcyBub3QgaW50ZXJsZWF2ZWQpKi8KLSAgICBpZiAoYkludGVybGVhdmVBViA9PSBNNE9TQV9GQUxTRSkKLSAgICB7Ci0gICAgICAgIGlmIChiQXVkaW8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICAgICAgICAgIGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1tpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvIChwcmV2aW91c2x5IGFfZGF0YVNpemUpKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiVmlkZW8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICAgICAgICAgIGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1tpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvIChwcmV2aW91c2x5IGFfZGF0YVNpemUpKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8qaW4gdGhpcyBtb2RlLCB3ZSBoYXZlIGF1ZGlvIGFuZCB2aWRlbyB0byBpbnRlcmxlYXZlKi8KLSAgICB7Ci0gICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1heChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuaywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rKTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1tpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvIChwcmV2aW91c2x5IGFfZGF0YVNpemUpKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1tpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvIChwcmV2aW91c2x5IGFfZGF0YVNpemUpKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIC8qc2tpcCovCi0KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEJsb2NrU2lnbmF0dXJlU2tpcEhlYWRlciwKLSAgICAgICAgc2l6ZW9mKEJsb2NrU2lnbmF0dXJlU2tpcEhlYWRlciksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgIC8qIFdyaXRlIGVtYmVkZGVkIHN0cmluZyAqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRFbWJlZGRlZFN0cmluZywKLSAgICAgICAgICAgIHNpemVvZihCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcsIDE2LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIH0KLQotICAgIC8qIFdyaXRlIHZlcyBjb3JlIHZlcnNpb24gKi8KLSAgICBjYW1jb2Rlcl9tYWogPSAoTTRPU0FfVUNoYXIpKG1NcDRGaWxlRGF0YVB0ci0+Y2FtY29kZXJWZXJzaW9uIC8gMTAwKTsKLSAgICBjYW1jb2Rlcl9taW4gPQotICAgICAgICAoTTRPU0FfVUNoYXIpKCggbU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb24gLSAxMDAgKiBjYW1jb2Rlcl9tYWopCi0gICAgICAgIC8gMTApOwotICAgIGNhbWNvZGVyX3JldiA9Ci0gICAgICAgIChNNE9TQV9VQ2hhcikobU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb24gLSAxMDAgKiBjYW1jb2Rlcl9tYWogLSAxMAotICAgICAgICAqIGNhbWNvZGVyX21pbik7Ci0KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoJyAnLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikoY2FtY29kZXJfbWFqICsgJzAnKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSgnLicsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKShjYW1jb2Rlcl9taW4gKyAnMCcpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKCcuJywgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKGNhbWNvZGVyX3JldiArICcwJyksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgIC8qIFdyaXRlIGludGVncmF0aW9uIHRhZyAqLwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyICopIiAtLSAiLCA0LAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0SW50ZWdyYXRpb25UYWcsCi0gICAgICAgICAgICBzaXplb2YoQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEludGVncmF0aW9uVGFnKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLCA2MCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICB9Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgLypvdmVyd3JpdGUgbWRhdCBzaXplKi8KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmZ0eXAubWFqb3JfYnJhbmQgIT0gMCkKLSAgICAgICAgbWRhdFBvcz0gMTYgKyBtTXA0RmlsZURhdGFQdHItPmZ0eXAubmJDb21wYXRpYmxlQnJhbmRzICogNDsKLSAgICBlbHNlCi0gICAgICAgIG1kYXRQb3MgPSAyNDsKLQotICAgIG1vb3ZQb3MgPSBtb292UG9zIC0gbWRhdFBvczsKLSAgICBtZGF0U2l6ZSA9IG1vb3ZQb3M7Ci0KLSAgICBDTEVBTlVQb25FUlIobU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5zZWVrKGZpbGVXcml0ZXJDb250ZXh0LAotICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZtZGF0UG9zKSk7IC8qc2VlayBhZnRlciBmdHlwLi4uKi8KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobWRhdFNpemUsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotY2xlYW51cDoKLQotICAgIC8qKgotICAgICogQ2xvc2UgdGhlIGZpbGUgZXZlbiBpZiBhbiBlcnJvciBvY2N1cmVkICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGVycjIgPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKG1NcDRGaWxlRGF0YVB0ci0+Ci0gICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCk7IC8qKjwgY2xvc2UgdGhlIHN0cmVhbSBhbnl3YXkgKi8KLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNUDRXX2Nsb3NlV3JpdGU6IGZpbGVXcml0ZXJGdW5jdGlvbnMtPmNsb3NlV3JpdGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIyKTsKLSAgICAgICAgfQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSNpZmRlZiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgIC8qIFJlbW92ZSBzYWZldHkgZmlsZSBpZiBzdGlsbCBwcmVzZW50IChoZXJlIGl0IGlzIGNsZWFudXAgaW4gY2FzZSBvZiBlcnJvciBhbmQgTk9UIHRoZSBub3JtYWwKLSAgICByZW1vdmFsIG9mIHRoZSBzYWZldHkgZmlsZSB0byBmcmVlIGVtZXJnZW5jeSBzcGFjZSBmb3IgdGhlIG1vb3YpLiAqLwotCi0gICAgaWYgKE00T1NBX1RSVUUgPT0gbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUpCi0gICAgewotICAgICAgICBNNE9TQV9Db250ZXh0IHRlbXBDb250ZXh0OwotICAgICAgICBlcnIzID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5vcGVuV3JpdGUoJnRlbXBDb250ZXh0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsLAotICAgICAgICAgICAgTTRPU0Ffa0ZpbGVXcml0ZSB8IE00T1NBX2tGaWxlQ3JlYXRlKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIyKQotICAgICAgICAgICAgZXJyMiA9IGVycjM7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IKLSAgICAgICAgICAgICE9IGVycjMpIC8qIE5vIHNlbnNlIGNsb3NpbmcgaWYgd2UgY291bGRuJ3Qgb3BlbiBpbiB0aGUgZmlyc3QgcGxhY2UuICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVycjMgPQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZSh0ZW1wQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycjIpCi0gICAgICAgICAgICAgICAgZXJyMiA9IGVycjM7Ci0gICAgICAgIH0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsID0gTTRPU0FfTlVMTDsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotCi0gICAgLyogRGVsZXRlIGVtYmVkZGVkIHN0cmluZyAqLwotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZykKLSAgICB7Ci0gICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIERlbGV0ZSBpbnRlZ3JhdGlvbiB0YWcgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnKQotICAgIHsKLSAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBNNE1QNFdfZnJlZUNvbnRleHQoKSBpcyBub3cgYSBwcml2YXRlIG1ldGhvZCwgY2FsbGVkIG9ubHkgZnJvbSBoZXJlKi8KLSAgICBlcnIzID0gTTRNUDRXX2ZyZWVDb250ZXh0KGNvbnRleHQpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyMykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfY2xvc2VXcml0ZTogTTRNUDRXX2ZyZWVDb250ZXh0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENob29zZSB3aGljaCBlcnJvciBjb2RlIHRvIHJldHVybiAqLwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGdpdmUgcHJpb3JpdHkgdG8gbWFpbiBlcnJvciAqLwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2Nsb3NlV3JpdGU6IHJldHVybmluZyBlcnI9MHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVsc2UgaWYgKE00Tk9fRVJST1IgIT0gZXJyMikKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEVycm9yIGZyb20gY2xvc2VXcml0ZSBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBtYWluIGVycm9yICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfY2xvc2VXcml0ZTogcmV0dXJuaW5nIGVycjI9MHgleCIsIGVycjIpOwotICAgICAgICByZXR1cm4gZXJyMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRXJyb3IgZnJvbSBNNE1QNFdfZnJlZUNvbnRleHQgaXMgcmV0dXJuZWQgb25seSBpZiB0aGVyZSBpcyBubyBtYWluIGVycm9yIGFuZAotICAgICAgICAgIG5vIGNsb3NlIGVycm9yICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfY2xvc2VXcml0ZTogcmV0dXJuaW5nIGVycjM9MHgleCIsIGVycjMpOwotICAgICAgICByZXR1cm4gZXJyMzsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19nZXRPcHRpb24oIE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAqdmFsdWVQdHIgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlICpzdHJlYW1JRHZhbHVlUHRyID0gTTRPU0FfTlVMTDsKLSAgICBNNE1QNFdfU3RyZWFtSURzaXplICpzdHJlYW1JRHNpemVQdHIgPSBNNE9TQV9OVUxMOwotICAgIE00TVA0V19tZW1BZGRyICptZW1BZGRyUHRyID0gTTRPU0FfTlVMTDsKLSAgICAvKiAgICBNNE1QNFdfV3JpdGVDYWxsQmFjayogICAgY2FsbEJhY2tQdHIgPSBNNE9TQV9OVUxMOyovCi0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBFUlJfQ0hFQ0soKCBtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19vcGVuZWQpCi0gICAgICAgIHx8IChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19yZWFkeSksIE00RVJSX1NUQVRFKTsKLQotICAgIHN3aXRjaCggb3B0aW9uICkKLSAgICB7Ci0gICAgICAgIGNhc2UgKE00TVA0V19tYXhBVXBlckNodW5rKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heENodW5rU2l6ZSk6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKSgqdmFsdWVQdHIpOwotCi0gICAgICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAoVmlkZW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgKDApOiAvKmFsbCBzdHJlYW1zKi8KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPSBtTXA0RmlsZURhdGFQdHItPk1heENodW5rU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX21heENodW5rSW50ZXIpOgotCi0gICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKSgqdmFsdWVQdHIpOwotCi0gICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0gICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPSAoTTRPU0FfVUludDMyKW1NcDRGaWxlRGF0YVB0ci0+Ci0gICAgICAgICAgICAgICAgICAgIEludGVybGVhdmVEdXI7IC8qdGltZSBjb252ZXJzaW9uICEqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX2VtYmVkZGVkU3RyaW5nKToKLSAgICAgICAgbWVtQWRkclB0ciA9IChNNE1QNFdfbWVtQWRkciAqKSgqdmFsdWVQdHIpOwotICAgICAgICAvKm1lbUFkZHJQdHIgbXVzdCBoYXZlIGJlZW4gYWxyZWFkeSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcgotICAgICAgICBhbmQgbWVtQWRkclB0ci0+c2l6ZSBpbml0aWFsaXplZCB3aXRoIHRoZSBtYXggcG9zc2libGUgbGVuZ3RoIGluIGJ5dGVzKi8KLSAgICAgICAgRVJSX0NIRUNLKG1lbUFkZHJQdHItPnNpemUgPj0gMTYsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIEVSUl9DSEVDSyhtZW1BZGRyUHRyLT5hZGRyICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIC8qbWVtQWRkclB0ci0+c2l6ZSBpcyB1cGRhdGVkIHdpdGggdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBzdHJpbmcqLwotICAgICAgICBtZW1BZGRyUHRyLT5zaXplID0gMTY7Ci0gICAgICAgIC8qaWYgbm8gdmFsdWUgd2FzIHNldCwgcmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZyAqLwotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZywgMTYpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgKHZvaWQgKilCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcsCi0gICAgICAgICAgICAxNik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX2ludGVncmF0aW9uVGFnKToKLSAgICAgICAgbWVtQWRkclB0ciA9IChNNE1QNFdfbWVtQWRkciAqKSgqdmFsdWVQdHIpOwotICAgICAgICAvKm1lbUFkZHJQdHIgbXVzdCBoYXZlIGJlZW4gYWxyZWFkeSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcgotICAgICAgICBhbmQgbWVtQWRkclB0ci0+c2l6ZSBpbml0aWFsaXplZCB3aXRoIHRoZSBtYXggcG9zc2libGUgbGVuZ3RoIGluIGJ5dGVzKi8KLSAgICAgICAgRVJSX0NIRUNLKG1lbUFkZHJQdHItPnNpemUgPj0gNjAsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIEVSUl9DSEVDSyhtZW1BZGRyUHRyLT5hZGRyICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIC8qbWVtQWRkclB0ci0+c2l6ZSBpcyB1cGRhdGVkIHdpdGggdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBzdHJpbmcqLwotICAgICAgICBtZW1BZGRyUHRyLT5zaXplID0gNjA7Ci0gICAgICAgIC8qaWYgbm8gdmFsdWUgd2FzIHNldCwgcmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZyAwICovCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLCA2MCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAodm9pZCAqKUJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRJbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgIDYwKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIChNNE1QNFdfQ2FtY29kZXJWZXJzaW9uKToKLQotICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKikoKnZhbHVlUHRyKTsKLQotICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0gbU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb247Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIChNNE1QNFdfcHJlV3JpdGVDYWxsQmFjayk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgIC8qY2FsbEJhY2tQdHIgPSAoTTRNUDRXX1dyaXRlQ2FsbEJhY2sqKSgqdmFsdWVQdHIpOwotICAgICAgICAqY2FsbEJhY2tQdHIgPSBtTXA0RmlsZURhdGFQdHItPlByZVdyaXRlQ2FsbEJhY2s7Ci0gICAgICAgIGJyZWFrOyovCi0KLSAgICBjYXNlIChNNE1QNFdfcG9zdFdyaXRlQ2FsbEJhY2spOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAvKmNhbGxCYWNrUHRyID0gKE00TVA0V19Xcml0ZUNhbGxCYWNrKikoKnZhbHVlUHRyKTsKLSAgICAgICAgKmNhbGxCYWNrUHRyID0gbU1wNEZpbGVEYXRhUHRyLT5Qb3N0V3JpdGVDYWxsQmFjazsKLSAgICAgICAgYnJlYWs7Ki8KLQotICAgIGNhc2UgKE00TVA0V19tYXhBVXNpemUpOgotCi0gICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKSgqdmFsdWVQdHIpOwotCi0gICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVTaXplOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0gICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPSBtTXA0RmlsZURhdGFQdHItPk1heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX0lPRCk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBjYXNlIChNNE1QNFdfRVNEKToKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgIGNhc2UgKE00TVA0V19TRFApOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgY2FzZSAoTTRNUDRXX3RyYWNrU2l6ZSk6Ci0gICAgICAgIHN0cmVhbUlEc2l6ZVB0ciA9IChNNE1QNFdfU3RyZWFtSURzaXplICopKCp2YWx1ZVB0cik7Ci0gICAgICAgIHN0cmVhbUlEc2l6ZVB0ci0+d2lkdGggPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPndpZHRoOwotICAgICAgICBzdHJlYW1JRHNpemVQdHItPmhlaWdodCA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+aGVpZ2h0OwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19lc3RpbWF0ZUF1ZGlvU2l6ZSk6Ci0gICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKSgqdmFsdWVQdHIpOwotICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKW1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX01PT1ZmaXJzdCk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBjYXNlIChNNE1QNFdfVjJfTU9PRik6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBjYXNlIChNNE1QNFdfVjJfdGJsQ29tcHJlcyk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfc2V0T3B0aW9uKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gdmFsdWUgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlICpzdHJlYW1JRHZhbHVlUHRyID0gTTRPU0FfTlVMTDsKLSAgICBNNE1QNFdfU3RyZWFtSURzaXplICpzdHJlYW1JRHNpemVQdHIgPSBNNE9TQV9OVUxMOwotICAgIE00TVA0V19tZW1BZGRyICptZW1BZGRyUHRyID0gTTRPU0FfTlVMTDsKLSAgICBNNFNZU19TdHJlYW1JRG1lbUFkZHIgKnN0cmVhbUlEbWVtQWRkclB0cjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8qIFZlcmlmeSBzdGF0ZSAqLwotICAgIHN3aXRjaCggb3B0aW9uICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRNUDRXX21heEZpbGVEdXJhdGlvbjoKLSAgICAgICAgY2FzZSBNNE1QNFdfRFNJOgotICAgICAgICAgICAgLyogdGhpcyBwYXJhbSBjYW4gYmUgc2V0IGF0IHRoZSBlbmQgb2YgYSByZWNvcmRpbmcgKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSAhPSBNNE1QNFdfY2xvc2VkKSwgTTRFUlJfU1RBVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE1QNFdfc2V0RnR5cEJveDoKLSAgICAgICAgICAgIC8qIHRoaXMgcGFyYW0gY2FuIG9ubHkgYmUgc2V0IGJlZm9yZSBzdGFydGluZyBhbnkgd3JpdGUgKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19vcGVuZWQsIE00RVJSX1NUQVRFKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKiBpbiBnZW5lcmFsIHBhcmFtcyBjYW4gYmUgc2V0IGF0IG9wZW4gb3IgcmVhZHkgc3RhZ2UgKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSygoIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX29wZW5lZCkKLSAgICAgICAgICAgICAgICB8fCAobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfcmVhZHkpLCBNNEVSUl9TVEFURSk7Ci0gICAgfQotCi0gICAgLyogU2V0IG9wdGlvbiAqLwotICAgIHN3aXRjaCggb3B0aW9uICkKLSAgICB7Ci0gICAgICAgIGNhc2UgKE00TVA0V19tYXhBVXBlckNodW5rKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heENodW5rU2l6ZSk6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKXZhbHVlOwotCi0gICAgICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ7IC8qbWF5YmUgdGhlIHN0cmVhbSBoYXMgbm90IGJlZW4gYWRkZWQgeWV0Ki8KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgKFZpZGVvU3RyZWFtSUQpOgotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRDsgLyptYXliZSB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBhZGRlZCB5ZXQqLwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgKDApOiAvKmFsbCBzdHJlYW1zKi8KLQotICAgICAgICAgICAgICAgICAgICAvKkluIE00TVA0V19vcGVuZWQgc3RhdGUsIG5vIHN0cmVhbSBpcyBwcmVzZW50IHlldCwgc28gb25seSBnbG9iYWwgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgbmVlZHMgdG8gYmUgdXBkYXRlZC4qLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heENodW5rU2l6ZSA9IHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heENodW5rSW50ZXIpOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKil2YWx1ZTsKLQotICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoMCk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphbGwgc3RyZWFtcyovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRNUDRXX1RpbWUzMilzdHJlYW1JRHZhbHVlUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOyAvKnRpbWUgY29udmVyc2lvbiEqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICAvKm5vdCBtZWFuaW5nZnVsbCB0byBzZXQgdGhpcyBwYXJhbWV0ZXIgb24gYSBzdHJlYW1JRCBiYXNpcyovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfbWF4RmlsZVNpemUpOgotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSA9ICooTTRPU0FfVUludDMyICopdmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfZW1iZWRkZWRTdHJpbmcpOgotICAgICAgICAgICAgbWVtQWRkclB0ciA9IChNNE1QNFdfbWVtQWRkciAqKXZhbHVlOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogSWYgbWVtQWRkclB0ci0+c2l6ZSA+IDE2IGJ5dGVzLCB0aGVuIHRoZSBzdHJpbmcgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gICAgICAgICAgICAqIElmIG1lbUFkZHJQdHItPnNpemUgPCAxNiBieXRlcywgdGhlbiByZXR1cm4gTTRFUlJfUEFSQU1FVEVSCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgRVJSX0NIRUNLKG1lbUFkZHJQdHItPnNpemUgPj0gMTYsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygxNiwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJlbWJlZGRlZFN0cmluZyIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qZWxzZSwganVzdCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzbHkgc2V0IHN0cmluZyovCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nLAotICAgICAgICAgICAgICAgICh2b2lkICopbWVtQWRkclB0ci0+YWRkciwgMTYpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX2ludGVncmF0aW9uVGFnKToKLSAgICAgICAgICAgIG1lbUFkZHJQdHIgPSAoTTRNUDRXX21lbUFkZHIgKil2YWx1ZTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIElmIG1lbUFkZHJQdHItPnNpemUgPiA2MCBieXRlcywgdGhlbiB0aGUgc3RyaW5nIHdpbGwgYmUgdHJ1bmNhdGVkLgotICAgICAgICAgICAgKiBJZiBtZW1BZGRyUHRyLT5zaXplIDwgNjAgYnl0ZXMsIHRoZW4gcGFkIHdpdGggMAotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg2MCwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJpbnRlZ3JhdGlvblRhZyIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qZWxzZSwganVzdCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzbHkgc2V0IHN0cmluZyovCi0gICAgICAgICAgICBpZiAobWVtQWRkclB0ci0+c2l6ZSA8IDYwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEludGVncmF0aW9uVGFnLAotICAgICAgICAgICAgICAgICAgICA2MCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLCBtZW1BZGRyUHRyLT5zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsIDYwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19DYW1jb2RlclZlcnNpb24pOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKil2YWx1ZTsKLQotICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmNhbWNvZGVyVmVyc2lvbiA9IHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICAvKm5vdCBtZWFuaW5nZnVsbCB0byBzZXQgdGhpcyBwYXJhbWV0ZXIgb24gYSBzdHJlYW1JRCBiYXNpcyovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfcHJlV3JpdGVDYWxsQmFjayk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgLyptTXA0RmlsZURhdGFQdHItPlByZVdyaXRlQ2FsbEJhY2sgPSAqKE00TVA0V19Xcml0ZUNhbGxCYWNrKil2YWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOyovCi0KLSAgICAgICAgY2FzZSAoTTRNUDRXX3Bvc3RXcml0ZUNhbGxCYWNrKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICAvKm1NcDRGaWxlRGF0YVB0ci0+UG9zdFdyaXRlQ2FsbEJhY2sgPSAqKE00TVA0V19Xcml0ZUNhbGxCYWNrKil2YWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOyovCi0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heEFVc2l6ZSk6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKXZhbHVlOwotCi0gICAgICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLQotICAgICAgICAgICAgICAgICAgICAvKmlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkqLwotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLQotICAgICAgICAgICAgICAgICAgICAvKmlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkqLwotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhBVVNpemUgPSBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9UUlVFKQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfSU9EKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX0VTRCk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19TRFApOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfdHJhY2tTaXplKToKLQotICAgICAgICAgICAgc3RyZWFtSURzaXplUHRyID0gKE00TVA0V19TdHJlYW1JRHNpemUgKil2YWx1ZTsKLQotICAgICAgICAgICAgaWYgKChzdHJlYW1JRHNpemVQdHItPnN0cmVhbUlEICE9IFZpZGVvU3RyZWFtSUQpCi0gICAgICAgICAgICAgICAgfHwgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfRkFMU0UpKQotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+d2lkdGggPSBzdHJlYW1JRHNpemVQdHItPndpZHRoOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+aGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURzaXplUHRyLT5oZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfZXN0aW1hdGVBdWRpb1NpemUpOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKil2YWx1ZTsKLQotICAgICAgICAgICAgLypzaGFsbCBub3Qgc2V0IHRoaXMgb3B0aW9uIGJlZm9yZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcyB3ZXJlIGFkZGVkKi8KLSAgICAgICAgICAgIC8qbm9uc2Vuc2UgdG8gc2V0IHRoaXMgb3B0aW9uIGlmIG5vdCBpbiBjYXNlIGF1ZGlvK3ZpZGVvKi8KLSAgICAgICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICB8fCAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfQm9vbClzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19NT09WZmlyc3QpOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfVjJfTU9PRik6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19WMl90YmxDb21wcmVzKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heEZpbGVEdXJhdGlvbik6Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVEdXJhdGlvbiA9ICooTTRPU0FfVUludDMyICopdmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfc2V0RnR5cEJveCk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHNpemU7Ci0KLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soKCAoTTRNUDRDX0Z0eXBCb3ggKil2YWx1ZSktPm1ham9yX2JyYW5kICE9IDAsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgICAgICAvKiBDb3B5IHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZnR5cCA9ICooTTRNUDRDX0Z0eXBCb3ggKil2YWx1ZTsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBnbG9iYWwgcG9zaXRpb24gdmFyaWFibGVzIHdpdGggdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjb21tb24gYW5kCi0gICAgICAgICAgICAgICAgIHVzZXIgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICBzaXplID0KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kcyAqIHNpemVvZihNNE9TQV9VSW50MzIpOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgPSA4LyptZGF0Ki8gKyAxNiArIHNpemU7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSA9IDIxOC8qbWRhdCttb292K3NraXAqLyArIDE2ICsgc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19EU0kpOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ciA9IChNNFNZU19TdHJlYW1JRG1lbUFkZHIgKil2YWx1ZTsKLQotICAgICAgICAgICAgICAgIC8qIE5lc3RlZCBzd2l0Y2ghIFdoZWUhICovCi0gICAgICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRG1lbUFkZHJQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEF1ZGlvU3RyZWFtSUQpOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvdGVjdCBEU0kgc2V0dGluZyA6IG9ubHkgb25jZSBhbGxvd2VkIG9uIGEgZ2l2ZW4gc3RyZWFtICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnRyYWNrVHlwZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfc2V0T3B0aW9uOiBkc2kgYWxyZWFkeSBzZXQgISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwID09IHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IHN0cmVhbUlEbWVtQWRkclB0ci0+YWRkcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfc2V0T3B0aW9uOiBCYWQgSDI2MyBkc2khIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypkZWNvZGVyIHNwZWNpZmljIGluZm8gc2l6ZSBpcyBzdXBwb3NlZCB0byBiZSBhbHdheXMgNwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgbG9uZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplID09IDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbUlEbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00U1lTX2tNUEVHXzQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3NldE9wdGlvbjogZHNpIGFscmVhZHkgc2V0ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCA9PSBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3NldE9wdGlvbjogQmFkIE1QRUc0IGRzaSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk1QNFYgc3BlY2lmaWMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplIDwgMTA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKyBILjI2NCB0cmltbWluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX1RSVUUgPT0gbU1wNEZpbGVEYXRhUHRyLT5iTVVMUFBTU1BTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHN0cmlwIHRoZSBEU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSB0aGUgRFNJIHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb246IGluIHNldCBvcHRpb24gRFNJIHNpemUgPSVkIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgRFNJIChTUFMgKyBQUFMpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplLCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtIEguMjY0IHRyaW1taW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfc2V0T3B0aW9uOiBkc2kgYWxyZWFkeSBzZXQgISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIDAgPT0gc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19zZXRPcHRpb246IEJhZCBIMjY0IGRzaSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSB0aGUgRFNJIHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgRFNJIChTUFMgKyBQUFMpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLyogSC4yNjQgVHJpbW1pbmcgICovCi0gICAgICAgIGNhc2UgTTRNUDRXX01VTF9QUFNfU1BTOgotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5iTVVMUFBTU1BTID0gKihNNE9TQV9JbnQ4ICopdmFsdWU7Ci0gICAgICAgICAgICAvKiBILjI2NCBUcmltbWluZyAgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfZ2V0U3RhdGUoIE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRNUDRXX1N0YXRlICpzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBzd2l0Y2goIHN0cmVhbUlEICkKLSAgICB7Ci0gICAgICAgIGNhc2UgKDApOgotICAgICAgICAgICAgKnN0YXRlID0gbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKEF1ZGlvU3RyZWFtSUQpOgotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqc3RhdGUgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnN0YXRlID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19nZXRDdXJyZW50RmlsZVNpemUoIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqcEN1cnJlbnRGaWxlU2l6ZSApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEVSUl9DSEVDSyhwQ3VycmVudEZpbGVTaXplICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgKnBDdXJyZW50RmlsZVNpemUgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkNGVjN2YuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9Gcm9tMmlUb01vbm9fMTYuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL0Zyb20yaVRvTW9ub18xNi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNmZmYjNmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL0Zyb20yaVRvTW9ub18xNi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0ZST00ySVRPTU9OT18xNl9IXwotI2RlZmluZSBfRlJPTTJJVE9NT05PXzE2X0hfCi0KLQotdm9pZCBGcm9tMmlUb01vbm9fMTYoICBjb25zdCBzaG9ydCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBuKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNlbmRpZiAgLyogX0ZST00ySVRPTU9OT18xNl9IXyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTFZNX1R5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9MVk1fVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI4OTc0ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9MVk1fVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlIG5hbWU6ICAgICAgICAgIExWTV9UeXBlcy5oCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEhlYWRlciBmaWxlIGRlZmluaW5nIHRoZSBzdGFuZGFyZCBMaWZlVmliZXMgdHlwZXMgZm9yIHVzZSBpbiB0aGUgYXBwbGljYXRpb24gbGF5ZXIgICovCi0vKiAgaW50ZXJmYWNlIG9mIGFsbCBMaWZlVmliZXMgbW9kdWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgTFZNX1RZUEVTX0gKLSNkZWZpbmUgTFZNX1RZUEVTX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTFZNX05VTEwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAvKiBOVUxMIHBvaW50ZXIgKi8KLQotI2RlZmluZSBMVk1fVFJVRSAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIC8qIEJvb2xlYW5zICovCi0jZGVmaW5lIExWTV9GQUxTRSAgICAgICAgICAgICAgIDAKLQotI2RlZmluZSBMVk1fTUFYSU5UXzggICAgICAgICAgICAxMjcgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gcG9zaXRpdmUgaW50ZWdlciBzaXplICovCi0jZGVmaW5lIExWTV9NQVhJTlRfMTYgICAgICAgICAgIDMyNzY3Ci0jZGVmaW5lIExWTV9NQVhJTlRfMzIgICAgICAgICAgIDIxNDc0ODM2NDcKLSNkZWZpbmUgTFZNX01BWEVOVU0gICAgICAgICAgICAgMjE0NzQ4MzY0NwotCi0jZGVmaW5lIExWTV9NT0RVTEVJRF9NQVNLICAgICAgIDB4RkYwMCAgICAgICAgICAgICAgLyogTWFzayB0byBleHRyYWN0IHRoZSBjYWxsaW5nIG1vZHVsZSBJRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGNhbGxiYWNrSWQgKi8KLSNkZWZpbmUgTFZNX0VWRU5USURfTUFTSyAgICAgICAgMHgwMEZGICAgICAgICAgICAgICAvKiBNYXNrIHRvIGV4dHJhY3QgdGhlIGNhbGxiYWNrIGV2ZW50IGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSWQgKi8KLQotLyogTWVtb3J5IHRhYmxlKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSAgICAgIDAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQSAgICAgIDEgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgZGF0YSBtZW1vcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uICovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYgICAgICAyICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGNvZWZmaWNpZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCAgICAgICAgICAgIDMgICAvKiBPZmZzZXQgdG8gdGVtcG9yYXJ5IG1lbW9yeSByZWdpb24gKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJhc2ljIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmICAgICBjaGFyICAgICAgICAgICAgICAgIExWTV9DSEFSOyAgICAgICAgICAgLyogQVNDSUkgY2hhcmFjdGVyICovCi0KLXR5cGVkZWYgICAgIGNoYXIgICAgICAgICAgICAgICAgTFZNX0lOVDg7ICAgICAgICAgICAvKiBTaWduZWQgOC1iaXQgd29yZCAqLwotdHlwZWRlZiAgICAgdW5zaWduZWQgY2hhciAgICAgICBMVk1fVUlOVDg7ICAgICAgICAgIC8qIFVuc2lnbmVkIDgtYml0IHdvcmQgKi8KLQotdHlwZWRlZiAgICAgc2hvcnQgICAgICAgICAgICAgICBMVk1fSU5UMTY7ICAgICAgICAgIC8qIFNpZ25lZCAxNi1iaXQgd29yZCAqLwotdHlwZWRlZiAgICAgdW5zaWduZWQgc2hvcnQgICAgICBMVk1fVUlOVDE2OyAgICAgICAgIC8qIFVuc2lnbmVkIDE2LWJpdCB3b3JkICovCi0KLXR5cGVkZWYgICAgIGxvbmcgICAgICAgICAgICAgICAgTFZNX0lOVDMyOyAgICAgICAgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU3RhbmRhcmQgRW51bWVyYXRlZCB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIE9wZXJhdGluZyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fTU9ERV9PRkYgICAgPSAwLAotICAgIExWTV9NT0RFX09OICAgICA9IDEsCi0gICAgTFZNX01PREVfRFVNTVkgID0gTFZNX01BWEVOVU0KLX0gTFZNX01vZGVfZW47Ci0KLQotLyogRm9ybWF0ICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fU1RFUkVPICAgICAgICAgID0gMCwKLSAgICBMVk1fTU9OT0lOU1RFUkVPICAgID0gMSwKLSAgICBMVk1fTU9OTyAgICAgICAgICAgID0gMiwKLSAgICBMVk1fU09VUkNFX0RVTU1ZICAgID0gTFZNX01BWEVOVU0KLX0gTFZNX0Zvcm1hdF9lbjsKLQotCi0vKiBXb3JkIGxlbmd0aCAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNXzE2X0JJVCAgICAgID0gMCwKLSAgICBMVk1fMzJfQklUICAgICAgPSAxLAotICAgIExWTV9XT1JETEVOR1RIX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gTFZNX1dvcmRMZW5ndGhfZW47Ci0KLQotLyogTFZNIHNhbXBsaW5nIHJhdGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fRlNfODAwMCAgPSAwLAotICAgIExWTV9GU18xMTAyNSA9IDEsCi0gICAgTFZNX0ZTXzEyMDAwID0gMiwKLSAgICBMVk1fRlNfMTYwMDAgPSAzLAotICAgIExWTV9GU18yMjA1MCA9IDQsCi0gICAgTFZNX0ZTXzI0MDAwID0gNSwKLSAgICBMVk1fRlNfMzIwMDAgPSA2LAotICAgIExWTV9GU180NDEwMCA9IDcsCi0gICAgTFZNX0ZTXzQ4MDAwID0gOCwKLSAgICBMVk1fRlNfSU5WQUxJRCA9IExWTV9NQVhFTlVNLTEsCi0gICAgTFZNX0ZTX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gTFZNX0ZzX2VuOwotCi0KLS8qIE1lbW9yeSBUeXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBICAgID0gTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSwKLSAgICBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEEgICAgPSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBLAotICAgIExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRiAgICA9IExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYsCi0gICAgTFZNX1RFTVBPUkFSWV9GQVNUICAgICAgICAgID0gTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCwKLSAgICBMVk1fTUVNT1JZVFlQRV9EVU1NWSAgICAgICAgPSBMVk1fTUFYRU5VTQotfSBMVk1fTWVtb3J5VHlwZXNfZW47Ci0KLQotLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLwotICAgIExWTV9NZW1vcnlUeXBlc19lbiAgICAgICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCi19IExWTV9NZW1vcnlSZWdpb25fc3Q7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTdGFuZGFyZCBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgTFZNX0lOVDMyICgqTFZNX0NhbGxiYWNrKSh2b2lkICAgICAgICAgICpwQ2FsbGJhY2tEYXRhLCAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLCAgIC8qIEdlbmVyYWwgcHVycG9zZSBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHRvIGEgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIGluIHRoZSBjYWxsYmFjaykgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIEdlbmVyYWxQdXJwb3NlICk7ICAgLyogR2VuZXJhbCBwdXJwb3NlIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gdG8gYmUgdXNlZCBhcyBjYWxsYmFjayBJRCkgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgIC8qIExWTV9UWVBFU19IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFEX0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9Db21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjZlNTk2ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFEX0NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsICAgICAgICBNNEFEX0NvbW1vbi5oCi0gKiBAYnJpZWYgICAgQXVkaW8gU2hlbGwgRGVjb2RlciBjb21tb24gaW50ZXJmYWNlIGRlY2xhcmF0aW9uCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGNvbW1vbiBpbnRlcmZhY2VzIHRoYXQgYXVkaW8gZGVjb2RlciBzaGVsbHMgbXVzdCBpbXBsZW1lbnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRBRF9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRBRF9DT01NT05fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfT3B0aW9uSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNERBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00QURfQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNEFEX09wdGlvbklECi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIEF1ZGlvIGRlY29kZXIgb3B0aW9ucy4KLSAqIEBub3RlICAgIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGEgZGVjb2RlciB2aWEKLSAqICAgICAgICAgICAgTTRBRF9nZXRPcHRpb25fZmN0L000QURfc2V0T3B0aW9uX2ZjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qKgotICAgICAqIFNldCB0aGUgZmxhZyBvZiBwcmVzZW5jZSBvZiBwcm90ZWN0aW9uICovCi0gICAgTTRBRF9rT3B0aW9uSURfUHJvdGVjdGlvbkFic2VudCA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00REVDT0RFUl9BVURJTywgMHgwMSksCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBmcmFtZXMgcGVyIGJsb2MgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9OYkZyYW1lUGVyQmxvYyAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00REVDT0RFUl9BVURJTywgMHgwMiksCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIEFBQyBkZWNvZGVyIHVzZXIgcGFyYW1ldGVycyAqLwotICAgIE00QURfa09wdGlvbklEX1VzZXJQYXJhbSAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNERFQ09ERVJfQVVESU8sIDB4MDMpLAotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIEFBQyBzdGVhbSB0eXBlICovCi0gICAgTTRBRF9rT3B0aW9uSURfU3RyZWFtVHlwZSAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQgLCBNNERFQ09ERVJfQVVESU8sIDB4MTApLAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBudW1iZXIgb2YgdXNlZCBieXRlcyBpbiB0aGUgbGF0ZXN0IGRlY29kZQotICAgICAodXNlZCBvbmx5IHdoZW4gZGVjb2RpbmcgQUFDIGZyb20gQURJRiBmaWxlKSAqLwotICAgIE00QURfa09wdGlvbklEX1VzZWRCeXRlcyAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQgLCBNNERFQ09ERVJfQVVESU8sIDB4MTEpLAotCi0gICAgLyogUmVhZGVyIEludGVyZmFjZSAqLwotICAgIE00QURfa09wdGlvbklEXzNncFJlYWRlckludGVyZmFjZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FVRElPLCAweDAxMiksCi0KLSAgICAvKiBBdWRpbyBBY2Nlc3MgVW5pdCAqLwotICAgIE00QURfa09wdGlvbklEX0F1ZGlvQVUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9BVURJTywgMHgxMyksCi0KLSAgICAvKiBSZWFkZXIgZXJyb3IgY29kZSAqLwotICAgIE00QURfa09wdGlvbklEX0dldEF1ZGlvQVVFcnJDb2RlID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MTQpLAotCi0gICAgLyogTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgTTRBRF9rT3B0aW9uSURfQXVkaW9OYkNoYW5uZWxzID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MTUpLAotCi0gICAgLyogU2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgTTRBRF9rT3B0aW9uSURfQXVkaW9TYW1wRnJlcXVlbmN5ID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MTYpLAotCi0gICAgLyogQXVkaW8gQVUgQ1RTICovCi0gICAgTTRBRF9rT3B0aW9uSURfQXVDVFMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9BVURJTywgMHgxNykKLQotfSBNNEFEX09wdGlvbklEOwotCi0KLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRfa1Vua25vd24gPSAwLCAgICAvKiBVbmtub3duIHN0cmVhbSB0eXBlICovCi0gICAgTTRfa0FBQywgICAgICAgICAgICAvKiBNNF9rQUFDX01BSU4gb3IgTTRfa0FBQ19MQyBvciBNNF9rQUFDX1NTUiBvciBNNF9rQUFDX0xUUCAgICAqLwotICAgIE00X2tBQUNwbHVzLCAgICAgICAgLyogRGVjb2RlciB0eXBlIGlzIEFBQyBwbHVzICovCi0gICAgTTRfa2VBQUNwbHVzICAgICAgICAvKiBEZWNvZGVyIHR5cGUgaXMgZW5oYW5jZWQgQUFDIHBsdXMgKi8KLX0gTTRfQUFDVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNEFEX1R5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXVkaW8gdHlwZXMgdXNlZCB0byBjcmVhdGUgZGVjb2RlcnMKLSAqIEBub3RlICAgIFRoaXMgZW51bSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFZQUyB0byBpZGVudGlmeSBhIGN1cnJlbnRseSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgYXVkaW8gZGVjb2RlciBpbnRlcmZhY2UuIEVhY2ggZGVjb2RlciBpcyByZWdpc3RlcmVkIHdpdGggb25lIG9mIHRoaXMgdHlwZSBhc3NvY2lhdGVkLgotICogICAgICAgICAgICBXaGVuIGEgZGVjb2RlciBpbnN0YW5jZSBpcyBuZWVkZWQsIHRoaXMgdHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5Ci0gKiAgICAgICAgICAgIGFuZCByZXRyaWV2ZSBpdHMgaW50ZXJmYWNlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00QURfa1R5cGVBTVJOQiA9IDAsCi0gICAgTTRBRF9rVHlwZUFNUldCLAotICAgIE00QURfa1R5cGVBQUMsCi0gICAgTTRBRF9rVHlwZU1QMywKLSAgICBNNEFEX2tUeXBlUENNLAotICAgIE00QURfa1R5cGVCQk11c2ljRW5naW5lLAotICAgIE00QURfa1R5cGVXTUEsCi0gICAgTTRBRF9rVHlwZVJNQSwKLSAgICBNNEFEX2tUeXBlQURQQ00sCi0gICAgTTRBRF9rVHlwZV9OQiAgLyogbnVtYmVyIG9mIGRlY29kZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotCi19IE00QURfVHlwZSA7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNEFEX0J1ZmZlcgotICogQGJyaWVmICAgICAgICBTdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSBidWZmZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHI4ICAgIG1fZGF0YUFkZHJlc3M7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fYnVmZmVyU2l6ZTsKLSAgICBpbnQ2NF90ICAgICAgICAgbV90aW1lU3RhbXBVczsKLX0gTTRBRF9CdWZmZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIEFsbG9jYXRlcyB0aGUgY29udGV4dAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChPVVQpICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogICAgKElOKSAgICBQb2ludGVyIHRvIGFuIGF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbgotICogQHBhcmFtICAgIHBVc2VyRGF0YTogICAgICAgIChJTikgICAgUG9pbnRlciB0byBVc2VyIGRhdGEKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRBRF9jcmVhdGVfZmN0KShNNEFEX0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIHZvaWQqIHBVc2VyRGF0YSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgRGVzdHJveXMgdGhlIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyCi0gKiBAbm90ZSAgICBBZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00QURfZGVzdHJveV9mY3QpICAgIChNNEFEX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgRGVjb2RlcyB0aGUgZ2l2ZW4gYXVkaW8gZGF0YQotICogQG5vdGUgICAgUGFyc2VzIGFuZCBkZWNvZGVzIHRoZSBuZXh0IGF1ZGlvIGZyYW1lLCBmcm9tIHRoZSBnaXZlbiBidWZmZXIuCi0gKiAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyBwSW5wdXRCdWZmZXJTaXplIHZhbHVlIGFjY29yZGluZyB0byB0aGUgYW1vdW50Ci0gKiAgICAgICAgICAgIG9mIGRhdGEgYWN0dWFsbHkgcmVhZC4KLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBpbnB1dEJ1ZmZlcjogICAgICAgIChJTi9PVVQpSW5wdXQgRGF0YSBidWZmZXIuIEl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBhdWRpbyBmcmFtZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIHVwZGF0ZWQgaW5zaWRlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0byByZWZsZWN0IHRoZSBzaXplIG9mIHRoZSBhY3R1YWxseSBkZWNvZGVkIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHRoZSBmaXJzdCBmcmFtZSBpbiBwSW5wdXRCdWZmZXIpCi0gKiBAcGFyYW0gICBkZWNvZGVkUENNQnVmZmVyOiAgICAoT1VUKSAgIE91dHB1dCBQQ00gYnVmZmVyIChkZWNvZGVkIGRhdGEpLgotICogQHBhcmFtICAganVtcGluZzogICAgICAgICAgICAoSU4pICAgIE00T1NBX1RSVUUgaWYgYSBqdW1wIHdhcyBqdXN0IGRvbmUsIE00T1NBX0ZBTFNFIG90aGVyd2lzZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNEFEX3N0ZXBfZmN0KSAgICAoTTRBRF9Db250ZXh0IGNvbnRleHQsIE00QURfQnVmZmVyICpwSW5wdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9CdWZmZXIgKnBEZWNvZGVkUENNQnVmZmVyLCBNNE9TQV9Cb29sIGp1bXBpbmcpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXRzIHRoZSBkZWNvZGVyIHZlcnNpb24KLSAqIEBub3RlICAgIFRoZSB2ZXJzaW9uIGlzIGdpdmVuIGluIGEgTTRfVmVyc2lvbkluZm8gc3RydWN0dXJlCi0gKgotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgIChPVVQpICAgICAgICBQb2ludGVyIHRvIHRoZSB2ZXJzaW9uIHN0cnVjdHVyZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBnaXZlbiBwb2ludGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNEFEX2dldFZlcnNpb25fZmN0KShNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlIEFBQyBjb3JlIGRlY29kZXIgYWNjb3JkaW5nIHRvCi0gKiAgICAgICAgICAgIHRoZSBzdHJlYW0gcHJvcGVydGllcyBhbmQgdG8gdGhlIG9wdGlvbnMgdGhhdCBtYXkKLSAqICAgICAgICAgICAgaGF2ZSBiZWVuIHNldCB1c2luZyBNNEFEX3NldE9wdGlvbl9mY3QKLSAqIEBub3RlICAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFBQyBkZWNvZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZXNwZWNpYWxseSBieSB0aGUgQUFDIGRlY29kZXIKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoSU4vT1VUKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6ICAgIChJTikgICAgUG9pbnRlciB0byBhbiBhdWRpbyBzdHJlYW0gZGVzY3JpcHRpb24KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00QURfc3RhcnRfZmN0KSAgICAoTTRBRF9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgUmVzZXQgdGhlIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBUaGUgY29udGV4dCBpcyBpbnZhbGlkIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRBRF9yZXNldF9mY3QpICAgIChNNEFEX0NvbnRleHQgY29udGV4dCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSBhdWRpbyBkZWNvZGVyCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgICAgIChJTikgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRBRF9zZXRPcHRpb25fZmN0KSAoTTRBRF9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgR2V0IGVuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgYXVkaW8gZGVjb2RlcgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAgICAoT1VUKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFEX2dldE9wdGlvbl9mY3QpIChNNEFEX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKTsKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00QURfSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGdlbmVyaWMgYXVkaW8gZGVjb2RlciBpbnRlcmZhY2UKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBvZiBvbmUgYXVkaW8gZGVjb2RlciB0eXBlLgotICogICAgICAgICAgICAgICAgVGhlIGRlY29kZXIgdHlwZSBpcyBvbmUgb2YgdGhlIE00QURfVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNEFEX0ludGVyZmFjZQotewotCi0gICAgTTRBRF9jcmVhdGVfZmN0KiAgICAgICAgbV9wRmN0Q3JlYXRlQXVkaW9EZWM7Ci0gICAgTTRBRF9zdGFydF9mY3QqICAgICAgICAgICAgbV9wRmN0U3RhcnRBdWRpb0RlYzsKLSAgICBNNEFEX3N0ZXBfZmN0KiAgICAgICAgICAgIG1fcEZjdFN0ZXBBdWRpb0RlYzsKLSAgICBNNEFEX2dldFZlcnNpb25fZmN0KiAgICBtX3BGY3RHZXRWZXJzaW9uQXVkaW9EZWM7Ci0gICAgTTRBRF9kZXN0cm95X2ZjdCogICAgICAgIG1fcEZjdERlc3Ryb3lBdWRpb0RlYzsKLSAgICBNNEFEX3Jlc2V0X2ZjdCogICAgICAgICAgICBtX3BGY3RSZXNldEF1ZGlvRGVjOwotICAgIE00QURfc2V0T3B0aW9uX2ZjdCogICAgICAgIG1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjOwotICAgIE00QURfZ2V0T3B0aW9uX2ZjdCogICAgICAgIG1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjOwotCi19IE00QURfSW50ZXJmYWNlOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLypfX000QURfQ09NTU9OX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QURfTnVsbC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9OdWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4MTQwY2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9OdWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNEFEX051bGwuaAotICogQGJyaWVmICAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkZWNvZGVyIHB1YmxpYyBpbnRlcmZhY2UgdGhhdCBkbyBub3RoaW5nCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZ2V0SW50ZXJmYWNlIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNEFEX05VTExfSF9fCi0jZGVmaW5lIF9fTTRBRF9OVUxMX0hfXwotCi0jaW5jbHVkZSAiTTRBRF9Db21tb24uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmIFJldHJpZXZlcyB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gcERlY29kZXJUeXBlICAgICAgICA6IHBvaW50ZXIgb24gYW4gTTRBRF9UeXBlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBkZWNvZGVyIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgZGVjb2RlcgotICogQHBhcmFtIHBEZWNvZGVySW50ZXJmYWNlICAgOiBhZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyBkZWNvZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZCBieSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYW5kIG11c3QgYmUgdW4tYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuCi0gKgotICogQHJldHVybiA6IE00Tk9fRVJST1IgIGlmIE9LCi0gKiAgICAgICAgICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBRF9OVUxMX2dldEludGVyZmFjZSggTTRBRF9UeXBlICpwRGVjb2RlclR5cGUsIE00QURfSW50ZXJmYWNlICoqcERlY29kZXJJbnRlcmZhY2UpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000QURfTlVMTF9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFJUl9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QUlSX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTQxMzYyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QUlSX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00QUlSX0FQSS5oCi0gKiBAYnJpZWYgIEFyZWEgb2YgSW50ZXJlc3QgUmVzaXplciAgQVBJCi0gKiBAbm90ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgTTRBSVJfQVBJX0gKLSNkZWZpbmUgTTRBSVJfQVBJX0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5DTFVERVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotI2luY2x1ZGUgIk00Q29tbW9uX3R5cGVzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgVFlQRVMgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRBSVJfSW5wdXRGb3JtYXRUeXBlCi0gKiBAYnJpZWYgICAgIFRoZSBmb2xsb3dpbmcgZW51bWVyYXRpb24gbGlzdHMgdGhlIGRpZmZlcmVudCBhY2NlcHRlZCBmb3JtYXQgZm9yIHRoZSBBSVIuCi0gKiBUbyBiZSBhdmFpbGFibGUsIHRoZSBhc3NvY2lhdGVkIGNvbXBpbGF0aW9uIGZsYWcgbXVzdCBiZSBkZWZpbmVkLCBlbHNlLAotICogdGhlIEFJUiB3aWxsIHJldHVybiBhbiBlcnJvciAoY29tcGlsYXRpb24gZmxhZyA6IE00QUlSX1hYWFhYWF9GT1JNQVRfU1VQUE9SVEVEKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEFJUl9rWVVWNDIwUCwKLSAgICBNNEFJUl9rWVVWNDIwQVAsCi0gICAgTTRBSVJfa0pQRwotfU00QUlSX0lucHV0Rm9ybWF0VHlwZSA7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgICAgICBNNEFJUl9Db29yZGluYXRlcwotICogQGJyaWVmICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIFggYW5kIFkgY29vcmRpbmF0ZXMgaW4gYSBnaXZlbiBwaWN0dXJlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgIG1feDsgICAgLyoqPCBYIGNvb3JkaW5hdGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV95OyAgICAvKio8IFkgY29vcmRpbmF0ZSAqLwotfU00QUlSX0Nvb3JkaW5hdGVzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgICAgICAgTTRBSVJfU2l6ZQotICogQGJyaWVmICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBkaW1lbnNpb24gb2YgYSBnaXZlbiBwaWN0dXJlIGFyZWEuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgbV93aWR0aDsgICAgLyoqPCBXaWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX2hlaWdodDsgICAgLyoqPCBIZWlnaHQgKi8KLX1NNEFJUl9TaXplOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgICAgICAgTTRBSVJfUGFyYW1zCi0gKiBAYnJpZWYgICAgIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGdldCBhIHJlc2l6ZWQgUk9JIChSZWdpb24gb2YgaW50ZXJlc3QpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRBSVJfQ29vcmRpbmF0ZXMgICAgICAgIG1faW5wdXRDb29yZDsgICAgICAgICAgICAvKio8IFggYW5kIFkgcG9zaXRpb25uaW5nIGluIHRoZSBpbnB1dCBvZiB0aGUgZmlyc3QgaW50ZXJlc3RpbmcgcGl4ZWwgKHRvcC1sZWZ0KSAqLwotICAgIE00QUlSX1NpemUgICAgICAgICAgICAgICAgbV9pbnB1dFNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBpbnRlcmVzdGluZyBhcmVhIGluc2lkZSBpbnB1dCAod2lkdGggYW5kIGhlaWdodCkqLwotICAgIE00QUlSX1NpemUgICAgICAgICAgICAgICAgbV9vdXRwdXRTaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgb3V0cHV0ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBtX2JPdXRwdXRTdHJpcGU7ICAgICAgICAgICAgLyoqPCBGbGFnIHRvIGtub3cgaWYgd2Ugd2lsbCBoYXZlIHRvIHByb3ZpZGUgb3V0cHV0IHBlciBzdHJpcGUgb3Igbm90ICovCi0gICAgTTRDT01NT05fT3JpZW50YXRpb24gICAgICAgIG1fb3V0cHV0T3JpZW50YXRpb247ICAgIC8qKjwgRGVzaXJlZCBvcmllbnRhdGlvbiBvZiB0aGUgQUlSIG91dHB1dCAqLwotfU00QUlSX1BhcmFtczsKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqIE00QUlSIEVSUk9SUyBERUZJTklUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGlzIGVycm9yIG1lYW5zIHRoYXQgdGhlIHJlcXVlc3RlZCB2aWRlbyBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gKi8KLSNkZWZpbmUgTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00QUlSLDB4MDAwMDAxKQotCi0vKiBUaGlzIGVycm9yIG1lYW5zIHRoYXQgdGhlIGlucHV0IG9yIG91dHB1dCBzaXplIGlzIGluY29ycmVjdCAqLwotI2RlZmluZSBNNEVSUl9BSVJfSUxMRUdBTF9GUkFNRV9TSVpFICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00QUlSLDB4MDAwMDAyKQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgUFVCTElDIEFQSSBERUZJTklUSU9OUyAqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpOwotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIEFJUi4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOL09VVCkgQWRkcmVzcyBvZiB0aGUgY29udGV4dCB0byBjcmVhdGUKLSAqIEBwYXJhbSAgICBpbnB1dEZvcm1hdDogICAgKElOKSBpbnB1dCBmb3JtYXQgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4gSW52YWxpZCBmb3JtYXRUeXBlCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBpcyBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfY3JlYXRlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LE00QUlSX0lucHV0Rm9ybWF0VHlwZSBpbnB1dEZvcm1hdCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGRlc3Ryb3lzIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIgY29tcG9uZW50Ci0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UgdG8gZGVzdHJveQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogSW50ZXJuYWwgc3RhdGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyBmdW5jdGlvbiBjYWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGNvbmZpZ3VyZSB0aGUgQUlSLgotICogQG5vdGUgICAgSXQgd2lsbCBzZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgY29vcmRpbmF0ZXMgYW5kIHNpemVzLAotICogICAgICAgICAgICBhbmQgaW5kaWNhdGVzIGlmIHdlIHdpbGwgcHJvY2VlZCBpbiBzdHJpcGUgb3Igbm90LgotICogICAgICAgICAgICBJbiBjYXNlIGEgTTRBSVJfZ2V0IGluIHN0cmlwZSBtb2RlIHdhcyBvbiBnb2luZywgaXQgd2lsbCBjYW5jZWwgdGhpcyBwcmV2aW91cwotICogICAgICAgICAgICBwcm9jZXNzaW5nIGFuZCByZXNldCB0aGUgZ2V0IHByb2Nlc3MuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UKLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX2JPdXRwdXRTdHJpcGU6KElOKSBTdHJpcGUgbW9kZS4KLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX2lucHV0Q29vcmQ6ICAgIChJTikgWCxZIGNvb3JkaW5hdGVzIG9mIHRoZSBmaXJzdCB2YWxpZCBwaXhlbCBpbiBpbnB1dC4KLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX2lucHV0U2l6ZTogICAgKElOKSBpbnB1dCBST0kgc2l6ZS4KLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX291dHB1dFNpemU6ICAgIChJTikgb3V0cHV0IHNpemUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICogQHJldHVybiAgICBNNEVSUl9BSVJfRk9STUFUX05PVF9TVVBQT1JURUQ6IHRoZSByZXF1ZXN0ZWQgaW5wdXQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2dldChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEluLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSB0aGUgcmVxdWVzdGVkIHJlc2l6ZWQgYXJlYSBvZiBpbnRlcmVzdCBhY2NvcmRpbmcgdG8KLSAqICAgICAgICAgICAgc2V0dGluZ3MgcHJvdmlkZWQgaW4gTTRBSVJfY29uZmlndXJlLgotICogQG5vdGUgICAgSW4gY2FzZSB0aGUgaW5wdXQgZm9ybWF0IHR5cGUgaXMgSlBFRywgaW5wdXQgcGxhbmUocykKLSAqICAgICAgICAgICAgaW4gcEluIGlzIG5vdCB1c2VkLiBJbiBub3JtYWwgbW9kZSwgZGltZW5zaW9uIHNwZWNpZmllZCBpbiBvdXRwdXQgcGxhbmUocykgc3RydWN0dXJlCi0gKiAgICAgICAgICAgIG11c3QgYmUgdGhlIHNhbWUgdGhhbiB0aGUgb25lIHNwZWNpZmllZCBpbiBNNEFJUl9jb25maWd1cmUuIEluIHN0cmlwZSBtb2RlLCBvbmx5Ci0gKiAgICAgICAgICAgIHRoZSB3aWR0aCB3aWxsIGJlIHRoZSBzYW1lLCBoZWlnaHQgd2lsbCBiZSB0YWtlbiBhcyB0aGUgc3RyaXBlIGhlaWdodCAodHlwaWNhbGx5IDE2KS4KLSAqICAgICAgICAgICAgSW4gbm9ybWFsIG1vZGUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbCBvbmNlIHRvIGdldCB0aGUgZnVsbCBvdXRwdXQgcGljdHVyZS4gSW4gc3RyaXBlCi0gKiAgICAgICAgICAgIG1vZGUsIGl0IGlzIGNhbGxlZCBmb3IgZWFjaCBzdHJpcGUgdGlsbCB0aGUgd2hvbGUgcGljdHVyZSBoYXMgYmVlbiByZXRyaWV2ZWQsYW5kCi0gKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3V0cHV0IHN0cmlwZSBpbiB0aGUgb3V0cHV0IHBpY3R1cmUgaXMgaW50ZXJuYWxseSBpbmNyZW1lbnRlZAotICogICAgICAgICAgICBhdCBlYWNoIHN0ZXAuCi0gKiAgICAgICAgICAgIEFueSBjYWxsIHRvIE00QUlSX2NvbmZpZ3VyZSBkdXJpbmcgc3RyaXBlIHByb2Nlc3Mgd2lsbCByZXNldCB0aGlzIG9uZSB0byB0aGUKLSAqICAgICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBwaWN0dXJlLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICAgcEluOiAgICAgICAgICAgIChJTikgUGxhbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5wdXQgUGxhbmUocykuCi0gKiBAcGFyYW0gICAgcE91dDogICAgICAgIChJTi9PVVQpICBQbGFuZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBvdXRwdXQgUGxhbmUocykuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpOwotCi0KLQotI2VuZGlmIC8qIE00QUlSX0FQSV9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFNUlJfQ29yZVJlYWRlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBTVJSX0NvcmVSZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWQ3MTBmMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFNUlJfQ29yZVJlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNEFNUlJfQ29yZVJlYWRlci5oCi0gKiBAYnJpZWYgICAgICAgIEltcGxlbWVudGF0aW9uIG9mIEFNUiBwYXJzZXIKLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEFQSSBkZWYuIGZvciBBTVIgUGFyc2VyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNEFNUl9DT1JFUkVBREVSX0hfXwotI2RlZmluZSBfX000QU1SX0NPUkVSRUFERVJfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00U1lTX1N0cmVhbS5oIgotI2luY2x1ZGUgIk00U1lTX0FjY2Vzc1VuaXQuaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQU1SIHJlYWRlciBFcnJvcnMgJiBXYXJuaW5ncyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00QU1SX1JFQURFUiwgMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX0FNUl9OT1RfQ09NUExJQU5UICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00QU1SX1JFQURFUiwgMHgwMDAwMDIpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICAgTTRBTVJSX1N0YXRlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBBTVIgcmVhZGVyIHN0YXRlcwotICogQG5vdGUgICAgICAgIFRoZXNlIHN0YXRlcyBhcmUgdXNlZCBpbnRlcm5hbHksIGJ1dCBjYW4gYmUgcmV0cmlldmVkIGZyb20gb3V0c2lkZSB0aGUgcmVhZGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bXsKLSAgICBNNEFNUlJfa09wZW5pbmcgICAgPSAweDAxMDAsCi0gICAgTTRBTVJSX2tPcGVuZWQgICAgPSAweDAxMDEsCi0gICAgTTRBTVJSX2tSZWFkaW5nID0gMHgwMjAwLAotICAgIE00QU1SUl9rUmVhZGluZ19uZXh0QVUgPSAweDAyMDEsCi0gICAgTTRBTVJSX2tDbG9zZWQgPSAweDMwMAotfU00QU1SUl9TdGF0ZTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfb3BlblJlYWQgKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJQb2ludGVyKiBwRmlsZUZ1bmN0aW9uKTsKLSogQGJyaWVmICAgIE00QU1SUl9PcGVuUmVhZCBwYXJzZXMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgQU1SIGFuZCBhbGxvY2F0ZXMgZGF0YSBzdHJ1Y3R1cmUKLSogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIGZpbGUgYW5kIGNyZWF0ZXMgYSBjb250ZXh0IGZvciBBTVIgIFBhcnNlci4KLSogICAgICAgICAgICAtIHNldHMgY29udGV4dCB0byBudWxsIGlmIGVycm9yIG9jY3VyZWQuCi0qIEBwYXJhbSAgICBwQ29udGV4dChPVVQpICAgICAgICA6IEFNUiBSZWFkZXIgY29udGV4dCBhbGxvY2F0ZWQgaW4gdGhlIGZ1bmN0aW9uCi0qIEBwYXJhbSAgICBwRmlsZURlc3NjcmlwdG9yKElOKTogRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCBmaWxlCi0qIEBwYXJhbSAgICBwRmlsZUZ1bmN0aW9uKElOKSAgICA6IHBvaW50ZXIgdG8gZmlsZSBmdW5jdGlvbiBmb3IgZmlsZSBhY2Nlc3MKLSoKLSogQHJldHVybnMgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBwQ29udGV4dCBhbmQvb3IgcEZpbGVEZXNjcmlwdG9yIGlzIE5VTEwKLSogQHJldHVybnMgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EIDogZmlsZSBjYW5ub3QgYmUgZm91bmQKLSogQHJldHVybnMgICAgTTRBTVJSX0VSUl9BTVJfTk9UX0NPTVBMSUFOVCA6IFR0aGUgaW5wdXQgaXMgbm90IGEgQU1SIGZpbGUKLSogQHJldHVybnMgICAgTTRPU0FfRklMRSAgICAgICAgOiBTZWUgT1NBTCBmaWxlIFNwZWMuIGZvciBkZXRhaWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfb3BlblJlYWQgKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZUZ1bmN0aW9uKTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjICk7Ci0qIEBicmllZiAgICBSZWFkcyB0aGUgbmV4dCBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBmaWxlCi0qIEBub3RlICAgICAgICBHZXQgdGhlIHN0cmVhbSBkZXNjcmlwdGlvbiBvZiB0aGUgc3RyZWFtLgotKiAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgc3RyZWFtIGluIEFNUiBmaWxlLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBwU3RyZWFtRGVzYyhPVVQpOiBEZXNjcmlwdGlvbiBvZiB0aGUgbmV4dCByZWFkIHN0cmVhbQotKgotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qIEByZXR1cm5zICAgICBNNEFNUlJfV0FSX05PX01PUkVfU1RSRUFNIDogVGhlcmUgYXJlIG5vIG1vcmUgc3RyZWFtcyBpbiB0aGUgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00QU1SUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjICk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMgKTsKLSogQGJyaWVmICAgIFByZXBhcmVzIHRoZSBBTVIgcmVhZGluZyBvZiB0aGUgc3BlY2lmaWVkIHN0cmVhbSBJZHMKLSogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgc3RhdGUgb2YgdGhlIHJlYWRlciByZWFkaW5nLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBwU3RyZWFtSURzKElOKSAgICA6IEFycmF5IG9mIHN0cmVhbSBJZHMgdG8gYmUgcHJlcGFyZWQuCi0qCi0qIEByZXR1cm5zICAgICBNNE5PX0VSUk9SICAgICAgICA6IFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgICBNNEVSUl9TVEFURSAgICAgICAgOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhpcyBzdGF0ZS4KLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgOiBBdGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMgKTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBTdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEF1KTsKLSogQGJyaWVmICAgIFJlYWRzIHRoZSBhY2Nlc3MgdW5pdCBpbnRvIHRoZSBwcm92aWRpbmcgc3RyZWFtCi0qIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyB0aGUgbWVtb3J5IHRvIGRhdGFBZGRyZXNzIGZpbGVkIGFuZCBjb3BpZWQgdGhlIGRhdGEuCi0qICAgICAgICAgICAgLVRoZSBBcHBsaWNhdGlvbiBzaG91bGQgbm90IGZyZWUgdGhlIGRhdGFBZGRyZXNzIHBvaW50ZXIuCi0qIEBwYXJhbSAgICBDb250ZXh0KElOL09VVCkgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQKLSogQHBhcmFtICAgIFN0cmVhbUlEKElOKSAgICA6IFNlbGVjdHMgdGhlIHN0cmVhbQotKiBAcGFyYW0gICAgcEF1KElOL09VVCkgICAgICAgIDogQWNjZXNzIFVuaXQKLSoKLSogQHJldHVybnMgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgIDogQXRsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0qIEByZXR1cm5zICAgICBNNFdBUl9OT19EQVRBX1lFVCAgICA6IHRoZXJlICAgIGlzIG5vIGVub3VnaCBkYXRhIG9uIHRoZSBzdHJlYW0gZm9yIG5ldyBhY2Nlc3MgdW5pdAotKiBAcmV0dXJucyAgICAgTTRXQVJfRU5EX09GX1NUUkVBTSAgICA6IFRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0KLSogQHJldHVybnMgICAgIE00QU1SUl9FUlJfSU5WQUxJRF9GUkFNRV9UWVBFIDogY3VycmVudCBmcmFtZSBoYXMgbm8gdmFsaWQgZnJhbWUgdHlwZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfbmV4dEFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfZnJlZUFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSk7Ci0qIEBicmllZiAgICBOb3RpZnkgdGhlIEFSTSBSZWFkZXIgdGhhdCBhcHBsaWNhdGlvbiB3aWxsIG5vIGxvbmdlciB1c2UgIkFVIgotKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgbWVtb3J5IHBvaW50ZWQgYnkgcEF1LT5kYXRhQWRkcmVzcyBwb2ludGVyCi0qICAgICAgICAgICAgLUNoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSByZWFkZXIgYmFjayB0byByZWFkaW5nLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBTdHJlYW1JRChJTikgICAgOiBTZWxlY3RzIHRoZSBzdHJlYW0KLSogQHBhcmFtICAgIHBBdShJTikgICAgICAgICAgICA6IEFjY2VzcyBVbml0Ci0qCi0qIEByZXR1cm5zICAgICBNNE5PX0VSUk9SICAgICAgICA6IFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgICBNNEVSUl9TVEFURSAgICAgICAgOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhpcyBzdGF0ZS4KLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgOiBBdGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfZnJlZUFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfc2VlayhNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSUQsIE00T1NBX1RpbWUgdGltZSwKLSogICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19zZWVrQWNjZXNzTW9kZSAgICBzZWVrTW9kZSwgTTRPU0FfVGltZSogcE9idGFpbkNUUyk7Ci0qIEBicmllZiAgICBUaGUgZnVuY3Rpb24gc2Vla3MgdGhlIHRhcmdldGVkIHRpbWUgaW4gdGhlIGdpdmUgc3RyZWFtIGJ5IHN0cmVhbUlkLgotKiBAbm90ZSAgICAgICAgRWFjaCBmcmFtZSBpcyBvZiAyMCBtcyBkdXJhdGlvbiwsIGJ1aWxkcyB0aGUgc2VlayB0YWJsZSBhbmQgcG9pbnRzCi0qICAgICAgICAgICAgdGhlIGZpbGUgcG9pbnRlciB0byBzdGFydGluZyBmb3IgdGhlIHJlcXVpcmVkIEFVLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBTdHJlYW1JRChJTikgICAgOiBBcnJheSBvZiBzdHJlYW0gSURzLgotKiBAcGFyYW0gICAgdGltZShJTikgICAgICAgIDogdGFyZ2V0ZWQgdGltZQotKiBAcGFyYW0gICAgc2Vla01vZGUoSU4pICAgIDogU2VsZWN0cyB0aGUgc2VlayBtb2RlCi0qIEBwYXJhbSAgICBwT2J0YWluQ1RTKE9VVCkgICAgOiBSZXR1cm5lZCB0aW1lIG5lYXJlc3QgdG8gdGFyZ2V0LgotKgotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgIDogQXRsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0qIEByZXR1cm5zICAgICBNNFdBUl9JTlZBTElEX1RJTUUgICAgOiB0aW1lIGNhbm5vdCBiZSByZWFjaGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9zZWVrKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRCwgTTRPU0FfVGltZSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1NlZWtBY2Nlc3NNb2RlICAgIHNlZWtNb2RlLCBNNE9TQV9UaW1lKiBwT2J0YWluQ1RTKTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBDb250ZXh0KTsKLSogQGJyaWVmICAgIEFNUiByZWFkZXIgY2xvc2VzIHRoZSBmaWxlCi0qIEBwYXJhbSAgICBDb250ZXh0KElOP09VVCkgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQKLSogQHJldHVybnMgICAgIE00Tk9fRVJST1IgICAgICAgIDogVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICA6IGF0bGVhc3Qgb25lIHBhcmFtZW50IGlzIE5VTEwKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9DT05URVhUICAgIDogICAgVGhlIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IHZhbGlkCi0qIEByZXR1cm5zICAgICBNNEVSUl9BTExPQyAgICAgICAgOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgICAgIE00RVJSX1NUQVRFICAgICAgICA6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiB0aGlzIHN0YXRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBDb250ZXh0KTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9nZXRTdGF0ZShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00QU1SUl9TdGF0ZSogcFN0YXRlLCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZCk7Ci0qIEBicmllZiAgICBHZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBBTVIgcmVhZGVyCi0qIEBwYXJhbSAgICBDb250ZXh0KElOL09VVCkgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQKLSogQHBhcmFtICAgIHBTdGF0ZShPVVQpICAgICAgICA6IENvcmUgQU1SIHJlYWRlciBzdGF0ZQotKiBAcGFyYW0gICAgc3RyZWFtSWQoSU4pICAgIDogU2VsZWN0cyB0aGUgc3RyZWFtIDAgZm9yIGFsbAotKgotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgICAgIDogICAgVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgOiAgICBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICA6ICAgIEF0bGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9nZXRTdGF0ZShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00QU1SUl9TdGF0ZSogcFN0YXRlLCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBTVJSX2dldFZlcnNpb24gICAgKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICBHZXRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIEFNUiByZWFkZXIKLSAqIEBwYXJhbSAgICB2ZXJzaW9uKE9VVCkgICAgOiB0aGUgc3RydWN0dXJlIHRoYXQgc3RvcmVzIHRoZSB2ZXJzaW9uIG51bWJlcnMKLSAqCi0gKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgICAgIDogICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIDogICAgdmVyc2lvbiBpcyBOVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9nZXRWZXJzaW9uICAgIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFNUlJfZ2V0bWF4QVVzaXplICAgIChNNE9TQV9Db250ZXh0IENvbnRleHQsIE00T1NBX1VJbnQzMiAqcE1heEF1U2l6ZSkKLSAqIEBicmllZiAgICBDb21wdXRlcyB0aGUgbWF4aW11bSBhY2Nlc3MgdW5pdCBzaXplIG9mIGEgc3RyZWFtCi0gKgotICogQHBhcmFtICAgIENvbnRleHQgICAgICAgIChJTikgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBNYXhBdVNpemUgICAgKE9VVCkgTWF4aW11bSBBY2Nlc3MgVW5pdCBzaXplIGluIHRoZSBzdHJlYW0KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogT25lIG9mIHRoZSBpbnB1dCBwb2ludGVyIGlzIE00T1NBX05VTEwgKERlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9nZXRtYXhBVXNpemUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNE9TQV9VSW50MzIgKnBNYXhBdVNpemUpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzKi8KLSNlbmRpZiAvKl9fTTRBTVJfQ09SRVJFQURFUl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNENvbW1vbl90eXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRDb21tb25fdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU2YTBmYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNENvbW1vbl90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00Q29tbW9uX1R5cGVzLmgKLSAqIEBicmllZiAgZGVmaW5lcyBjb21tb24gc3RydWN0dXJlcwotICogQG5vdGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBNNENPTU1PTl9UWVBFU19ICi0jZGVmaW5lIE00Q09NTU9OX1RZUEVTX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIE00Q09NTU9OX01ldGFkYXRhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tVbmtub3duTWV0YURhdGFUeXBlLAotICAgIC8qIExvY2FsIGZpbGVzICovCi0gICAgTTRDT01NT05fa1RhZ0lEM3YxLCAgICAgICAgICAgICAgICAvKio8ICBNZXRhZGF0YSBmcm9tIFRBRyBJRDMgVjEgKi8KLSAgICBNNENPTU1PTl9rVGFnSUQzdjIsICAgICAgICAgICAgICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gVEFHIElEMyBWMiAqLwotICAgIE00Q09NTU9OX2tBU0ZDb250ZW50RGVzYywgICAgICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gQVNGIGNvbnRlbnQgZGVzY3JpcHRpb24gICovCi0KLSAgICBNNENPTU1PTl9rM0dwcEFzc2V0TW92aWVCb3gsICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gYSAzZ3BwIGZpbGUgKG1vdmllIGJveCkgKi8KLSAgICBNNENPTU1PTl9rM0dwcEFzc2V0VHJhY2tCb3gsICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gYSAzZ3BwIGZpbGUgKHRyYWNrIGJveCkgKi8KLQotICAgIC8qIFN0cmVhbWluZyAqLwotICAgIE00Q09NTU9OX2tNZXRhRGF0YVNkcFNlc3Npb24sICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gYW4gU0RQIGZpbGUgKFNlc3Npb24gbGV2ZWwpICovCi0gICAgTTRDT01NT05fa01ldGFEYXRhU2RwQXVkaW8sICAgICAgICAvKio8ICBNZXRhZGF0YSBmcm9tIGFuIFNEUCBmaWxlIChtZWRpYSBhdWRpbyBsZXZlbCkgKi8KLSAgICBNNENPTU1PTl9rTWV0YURhdGFTZHBWaWRlbywgICAgICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gYW4gU0RQIGZpbGUgKG1lZGlhIHZpZGVvIGxldmVsKSAqLwotCi0gICAgTTRDT01NT05fa0pwZWdFeGlmICAgICAgICAgICAgICAgIC8qKjwgRVhJRiBpbiBKUEVHICovCi19IE00Q09NTU9OX01ldGFkYXRhVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgICBNNFZQU19FbmNvZGluZ0Zvcm1hdAotICogQGJyaWVmICAgICAgICBUZXh0IGVuY29kaW5nIGZvcm1hdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tFbmNGb3JtYXRVbmtub3duICAgID0gMCwgICAgICAvKio8IFVua25vd24gZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBNNENPTU1PTl9rRW5jRm9ybWF0QVNDSUkgICAgPSAxLCAgICAgICAgLyoqPCBJU08tODg1OS0xLiBUZXJtaW5hdGVkIHdpdGggJDAwICAgICAgICAgICAgICAgICovCi0gICAgTTRDT01NT05fa0VuY0Zvcm1hdFVURjggICAgICAgID0gMiwgICAgIC8qKjwgVVRGLTggZW5jb2RlZCBVbmljb2RlIC4gVGVybWluYXRlZCB3aXRoICQwMCAgICAqLwotICAgIE00Q09NTU9OX2tFbmNGb3JtYXRVVEYxNiAgICA9IDMgICAgICAgICAvKio8IFVURi0xNiBlbmNvZGVkIFVuaWNvZGUuIFRlcm1pbmF0ZWQgd2l0aCAkMDAgMDAgKi8KLX0gIE00Q09NTU9OX0VuY29kaW5nRm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZQU19TdHJpbmcKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBzdHJpbmcgYXR0cmlidXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgIG1fcFN0cmluZzsgICAgICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRleHQgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3VpU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBUZXh0IHNpemUgaW4gYnl0ZXMgICAgICAgICovCi0gICAgTTRDT01NT05fRW5jb2RpbmdGb3JtYXQgICAgbV9FbmNvZGluZ0Zvcm1hdDsgICAgLyoqPCBUZXh0IGVuY29kaW5nIGZvcm1hdCAgICAqLwotCi19IE00Q09NTU9OX1N0cmluZzsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRDT01NT05fQnVmZmVyCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgZ2VuZXJpYyBidWZmZXIgYXR0cmlidXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgIG1fcEJ1ZmZlcjsgICAgICAgIC8qKjwgUG9pbnRlciB0byBidWZmZXIgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3NpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIGJ1ZmZlciBpbiBieXRlcyAgICAqLwotfSBNNENPTU1PTl9CdWZmZXI7Ci0KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9OT05FLAotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9KUEcsCi0gICAgTTRDT01NT05fa01pbWVUeXBlX1BORywKLSAgICBNNENPTU1PTl9rTWltZVR5cGVfQk1QLCAgIC8qIGJpdG1hcCwgd2l0aCBoZWFkZXIgKi8KLSAgICBNNENPTU1PTl9rTWltZVR5cGVfUkdCMjQsIC8qIHJhdyBSR0IgMjQgYml0cyAqLwotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9SR0I1NjUsIC8qIHJhdywgUkdCIDE2IGJpdHMgKi8KLSAgICBNNENPTU1PTl9rTWltZVR5cGVfWVVWNDIwLAotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9NUEVHNF9JRnJhbWUgLyogUkM6IHRvIHN1cHBvcnQgUFYgYXJ0ICovCi0KLX0gTTRDT01NT05fTWltZVR5cGU7Ci0KLS8qIHBpY3R1cmUgdHlwZSBkZWZpbml0aW9uIGZyb20gaWQzdjIgdGFnKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tQaWNUeXBlX090aGVyICAgICAgICAgICAgICAgID0gMHgwMCwKLSAgICBNNENPTU1PTl9rUGljVHlwZV8zMl8zMl9JY29uICAgICAgICAgICAgPSAweDAxLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX090aGVyX0ljb24gICAgICAgICAgICA9IDB4MDIsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfRnJvbnRDb3ZlciAgICAgICAgICAgID0gMHgwMywKLSAgICBNNENPTU1PTl9rUGljVHlwZV9CYWNrQ292ZXIgICAgICAgICAgICA9IDB4MDQsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfTGVhZmxldFBhZ2UgICAgICAgICAgICA9IDB4MDUsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfTWVkaWEgICAgICAgICAgICAgICAgPSAweDA2LAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0xlYWRBcnRpc3QgICAgICAgICAgICA9IDB4MDcsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfQXJ0aXN0ICAgICAgICAgICAgICAgID0gMHgwOCwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9Db25kdWN0b3IgICAgICAgICAgICA9IDB4MDksCi0gICAgTTRDT01NT05fa1BpY1R5cGVfT3JjaGVzdHJhICAgICAgICAgICAgPSAweDBBLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0NvbXBvc2VyICAgICAgICAgICAgPSAweDBCLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0x5cmljaXN0ICAgICAgICAgICAgPSAweDBDLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX1JlY29yZGluZ0xvY2F0aW9uICAgID0gMHgwRCwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9EdXJpbmdSZWNvcmRpbmcgICAgICAgID0gMHgwRSwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9EdXJpbmdQZXJmb3JtYW5jZSAgICA9IDB4MEYsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfTW92aWVTY3JlZW5DYXB0dXJlICAgID0gMHgxMCwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9CcmlnaHRDb2xvdXJlZEZpc2ggICAgPSAweDExLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0lsbHVzdHJhdGlvbiAgICAgICAgPSAweDEyLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0FydGlzdExvZ28gICAgICAgICAgICA9IDB4MTMsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfU3R1ZGlvTG9nbyAgICAgICAgICAgID0gMHgxNAotfSBNNENPTU1PTl9QaWN0dXJlVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNENPTU1PTl9PcmllbnRhdGlvbgotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcG9zc2libGUgb3JpZW50YXRpb24gb2YgYSBmcmFtZSBhcyBkZXNjcmliZWQKLSAqICAgICAgICAgICAgaW4gdGhlIEVYSUYgc3RhbmRhcmQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93biA9IDAsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BSaWdodCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0LAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRUb3AsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3AsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRCb3R0b20sCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbQotfU00Q09NTU9OX09yaWVudGF0aW9uIDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRFWElGQ19Mb2NhdGlvbgotICogQGJyaWVmICAgICAgICBUaGUgSW1hZ2UgR1BTIGxvY2F0aW9uIChleGFtcGxlIDogNDiwNTIuMjEnICkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0Zsb2F0ICAgIGRlZ3JlZXM7Ci0gICAgTTRPU0FfRmxvYXQgICAgbWluc2VjOwotfSBNNENPTU1PTl9Mb2NhdGlvbjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRDT01NT05fTWV0YURhdGFBbGJ1bUFydAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGZpZWxkcyBvZiBhIGFsYnVtIGFydAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRDT01NT05fTWltZVR5cGUgICAgbV9taW1lVHlwZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdWlTaXplOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgbV9wRGF0YTsKLQotICAgIE00Q09NTU9OX1N0cmluZyAgICAgICAgbV9wRGVzY3JpcHRpb247Ci0KLX0gTTRDT01NT05fTWV0YURhdGFBbGJ1bUFydDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRDT01NT05fTWV0YURhdGFGaWVsZHMKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBmaWVsZHMgb2YgbWV0YWRhdGEgaW5mb3JtYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00Q09NTU9OX01ldGFkYXRhVHlwZSAgICBtX01ldGFkYXRhVHlwZTsKLQotICAgIC8qIE1ldGEgZGF0YSBmaWVsZHMgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wVGl0bGU7ICAgICAgICAgICAgLyoqPCBUaXRsZSBmb3IgdGhlIG1lZGlhICAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BBcnRpc3Q7ICAgICAgICAgICAgLyoqPCBQZXJmb3JtZXIgb3IgYXJ0aXN0ICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcEFsYnVtOyAgICAgICAgICAgIC8qKjwgQWxidW0gdGl0bGUgZm9yIHRoZSBtZWRpYSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BBdXRob3I7ICAgICAgICAgICAgLyoqPCBBdXRob3Igb2YgdGhlIG1lZGlhICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcEdlbnJlOyAgICAgICAgICAgIC8qKjwgR2VucmUgKGNhdGVnb3J5IGFuZCBzdHlsZSkgb2YgdGhlIG1lZGlhICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcERlc2NyaXB0aW9uOyAgICAgICAgLyoqPCBDYXB0aW9uIG9yIGRlc2NyaXB0aW9uIGZvciB0aGUgbWVkaWEgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wQ29weVJpZ2h0czsgICAgICAgIC8qKjwgTm90aWNlIGFib3V0IG9yZ2FuaXphdGlvbiBob2xkaW5nIGNvcHlyaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG1lZGlhIGZpbGUgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wUmVjb3JkaW5nWWVhcjsgICAgLyoqPCBSZWNvcmRpbmcgeWVhciBmb3IgdGhlIG1lZGlhICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcFJhdGluZzsgICAgICAgICAgICAvKio8IE1lZGlhIHJhdGluZyAqLwotCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcENsYXNzaWZpY2F0aW9uOyAgICAvKio8IENsYXNzaWZpY2F0aW9uIG9mIHRoZSBtZWRpYSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BLZXlXb3JkczsgICAgICAgIC8qKjwgTWVkaWEga2V5d29yZHMgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTG9jYXRpb247ICAgICAgICAvKio8IExvY2F0aW9uIGluZm9ybWF0aW9uICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcFVybDsgICAgICAgICAgICAgICAgLyoqPCBSZWZlcmVuY2Ugb2YgdGhlIHJlc291cmNlICovCi0KLSAgICBNNE9TQV9VSW50OCAgICAgICAgbV91aVRyYWNrTnVtYmVyOyAgICAvKio8IFRyYWNrIG51bWJlciBmb3IgdGhlIG1lZGlhKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV91aUR1cmF0aW9uOyAgICAgICAgLyoqPCBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzICovCi0KLSAgICBNNENPTU1PTl9NZXRhRGF0YUFsYnVtQXJ0ICAgIG1fYWxidW1BcnQ7ICAgIC8qKjwgQWxidW1BcnQgZGVzY3JpcHRpb24gKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgICAgICAgICAgICAgbV9wTW9vZDsgICAgLyoqPCBNb29kIG9mIHRoZSBtZWRpYSAqLwotCi0gICAgLyoqPCBNb2RpZnMgQUNPIDQvMTIvMDcgOiBhZGQgRXhpZiBzcGVjaWZpYyBpbmZvcyAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BDcmVhdGlvbkRhdGVUaW1lOyAgICAvKio8IGRhdGUgYW5kIHRpbWUgb3JpZ2luYWwgaW1hZ2Ugd2FzIGdlbmVyYXRlZCAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BMYXN0Q2hhbmdlRGF0ZVRpbWU7ICAgIC8qKjwgZmlsZSBjaGFuZ2UgZGF0ZSBhbmQgdGltZSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BNYW51ZmFjdHVyZXI7ICAgICAgICAvKio8IG1hbnVmYWN0dXJlciBvZiBpbWFnZSBpbnB1dCBlcXVpcG1lbnQgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTW9kZWw7ICAgICAgICAgICAgICAgIC8qKjwgbW9kZWwgb2YgaW1hZ2UgaW5wdXQgZXF1aXBtZW50ICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcFNvZnR3YXJlOyAgICAgICAgICAgIC8qKjwgc29mdHdhcmUgdXNlZCAqLwotICAgIE00Q09NTU9OX09yaWVudGF0aW9uIG1fT3JpZW50YXRpb247ICAgICAgICAvKio8IE9yaWVudGF0aW9uIG9mIHRoZSBwaWN0dXJlICovCi0KLSAgICAvKio8IE1vZGlmcyBGUyAyOS8wOC8wOCA6IGFkZGl0aW9ubmFsIEV4aWYgaW5mb3MgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV93aWR0aDsgICAgICAgICAgICAvKio8IGltYWdlIHdpZHRoIGluIHBpeGVscyAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX2hlaWdodDsgICAgICAgICAgICAvKio8IGltYWdlIGhlaWdodCBpbiBwaXhlbHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV90aHVtYm5haWxTaXplOyAgICAvKio8IHNpemUgb2YgdGhlIHRodW1ibmFpbCAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BMYXRpdHVkZVJlZjsgICAgICAgIC8qKjwgTGF0aXR1ZGUgcmVmZXJlbmNlICovCi0gICAgTTRDT01NT05fTG9jYXRpb24gbV9sYXRpdHVkZTsgICAgICAgIC8qKjwgTGF0aXR1ZGUgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTG9uZ2l0dWRlUmVmOyAgICAvKio8IExvbmdpdHVkZSByZWZlcmVuY2UgKi8KLSAgICBNNENPTU1PTl9Mb2NhdGlvbiBtX2xvbmdpdHVkZTsgICAgICAgIC8qKjwgTG9uZ2l0dWRlICAqLwotCi19IE00Q09NTU9OX01ldGFEYXRhRmllbGRzOwotCi0KLSNlbmRpZiAvKk00Q09NTU9OX1RZUEVTX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERBX1R5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERBX1R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4Y2FiN2UuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTREQV9UeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNERBX1R5cGVzLmgKLSAqIEBicmllZiAgICBEYXRhIGFjY2VzcyB0eXBlIGRlZmluaXRpb24KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIG1lZGlhIHNwZWNpZmljIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9fTTREQV9UWVBFU19IX18KLSNkZWZpbmUgX19NNERBX1RZUEVTX0hfXwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKl9fY3BsdXNwbHVzKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgICBNNF9TdHJlYW1UeXBlCi0gKiBAYnJpZWYgICAgICAgIFR5cGUgdXNlZCB0byBkZXNjcmliZSBhIHN0cmVhbSAoYXVkaW8gb3IgdmlkZW8gZGF0YSBmbG93KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNERBX1N0cmVhbVR5cGVVbmtub3duICAgICAgICAgICAgICAgID0gLTEsICAgIC8qKjwgVW5rbm93IHR5cGUgKi8KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0ICAgICAgICAgICAgPSAwLCAgICAvKio8IE1QRUctNCB2aWRlbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MyAgICAgICAgICAgID0gMSwgICAgLyoqPCBIMjYzIHZpZGVvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kICAgID0gMiwgICAgLyoqPCBBbXIgbmFycm93IGJhbmQgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0FtcldpZGVCYW5kICAgICAgICA9IDMsICAgIC8qKjwgQW1yIHdpZGUgYmFuZCBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBBQUMgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb01wMyAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgTVAzIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9NSnBlZyAgICAgICAgICAgID0gNiwgICAgLyoqPCBNSlBFRyB2aWRlbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBXYXYgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb01pZGkgICAgICAgICAgICA9IDgsICAgIC8qKjwgTWlkaSBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMgICAgICAgID0gOSwgICAgLyoqPCBNUEVHLTQgQVZDIHZpZGVvIChoMjY0KSAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURUUyAgICAgICAgICAgID0gMTAsICAgIC8qKjwgQUFDIEFEVFMgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0FhY0FESUYgICAgICAgICAgICA9IDExLCAgICAvKio8IEFBQyBBRElGIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9XbWEgICAgICAgICAgICAgICAgPSAxMiwgICAgLyoqPCBXTUEgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb1dtdiAgICAgICAgICAgICAgICA9IDEzLCAgICAvKio8IFdNViB2aWRlbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvUmVhbCAgICAgICAgICAgID0gMTQsICAgLyoqPCBSRUFMIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9SZWFsICAgICAgICAgICAgPSAxNSwgICAvKio8IFJFQUwgdmlkZW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMgICAgICAgICAgICA9IDE2LCAgIC8qKjwgRXZyYyBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVRpbWVkVGV4dCAgICAgICAgICAgID0gMjAsICAgIC8qKjwgVGltZWQgVGV4dCAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQmJhICAgICAgICAgICAgICAgID0gMjEsICAgIC8qKjwgQmVhdCBCcmV3IGF1ZGlvIGZvbWF0ICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9TbWFmICAgICAgICAgICAgPSAyMiwgICAgLyoqPCBTTUFGIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9JbWVsb2R5ICAgICAgICAgICAgPSAyMywgICAgLyoqPCBJTUVMT0RZIGF1ZGlvKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb1htZiAgICAgICAgICAgICAgICA9IDI0LCAgICAvKio8IFhNRiBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQnBjICAgICAgICAgICAgICAgID0gMjUsICAgIC8qKjwgQlBDIGF1ZGlvICovCi0KLSAgICAvKiBBRFBDTSAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQURQY20gICAgICAgICAgICA9IDI2LCAgICAvKio8IEFEUENNICovCi0KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb0FSR0I4ODg4ICAgICAgICA9IDI3Ci19IE00X1N0cmVhbVR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X1N0cmVhbUhhbmRsZXIKLSAqIEBicmllZiAgICAgICAgQmFzZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSBzdHJlYW0uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNF9TdHJlYW1UeXBlICAgIG1fc3RyZWFtVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBTdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX3N0cmVhbUlkOyAgICAgICAgICAgICAgICAgICAgLyoqPCBTdHJlYW0gSWQgKHVuaXF1ZSBudW1iZXIgZGVmaW5uaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0pICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgIG1fZHVyYXRpb247ICAgICAgICAgICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHRoZSBzdHJlYW0gaW4gbWlsbGkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9hdmVyYWdlQml0UmF0ZTsgICAgICAgICAgICAvKio8IEF2ZXJhZ2UgYml0cmF0ZSBpbiBrYi9zICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fbWF4QVVTaXplOyAgICAgICAgICAgICAgICAvKio8IE1heGltdW0gc2l6ZSBvZiBhbiBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvOyAgICAgICAgLyoqPCBQb2ludGVyIG9uIHNwZWNpZmljIGluZm9ybWF0aW9uIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNyZWF0ZSBhIGRlY29kZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBzcGVjaWZpYyBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBhYm92ZSAqLwotICAgIHZvaWQqICAgICAgICAgICAgbV9wVXNlckRhdGE7ICAgICAgICAgICAgICAgIC8qKjwgUG9pbnRlciBvbiBVc2VyIERhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5pdGlhbGl6ZWQgYnkgdGhlIHVzZXIpICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fc3RydWN0U2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgbV9iU3RyZWFtSXNPSzsgICAgICAgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHN0cmVhbSBoYXMgbm8gZXJyb3JzIGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNpbmcgaXMgZmluaXNoZWQgKi8KLSAgICBNNE9TQV9VSW50OCogICAgbV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm87ICAgICAgICAvKio8IFBvaW50ZXIgb24gc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIGRlY29kZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3BlY2lmaWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIHBvaW50ZXIgYWJvdmUgKi8KLSAgICAvLyBNUEVHNCAmIEFBQyBkZWNvZGVycyByZXF1aXJlIEVTRFMgaW5mbwotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BFU0RTSW5mbzsgICAgICAgICAgICAgICAgLyoqPCBQb2ludGVyIG9uIE1QRUc0IG9yIEFBQyBFU0RTIGJveCAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX0VTRFNJbmZvU2l6ZTsgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBNUEVHNCBvciBBQUMgRVNEUyBib3ggKi8KLX0gTTRfU3RyZWFtSGFuZGxlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyCi0gKiBAYnJpZWYgICAgICAgIEV4dGVuZGVkIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHZpZGVvIHN0cmVhbS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00X1N0cmVhbUhhbmRsZXIgICAgbV9iYXNpY1Byb3BlcnRpZXM7ICAgICAgICAvKio8IEF1ZGlvLVZpZGVvIHN0cmVhbSBjb21tb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV92aWRlb1dpZHRoOyAgICAgICAgICAgIC8qKjwgV2lkdGggb2YgdGhlIHZpZGVvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdmlkZW9IZWlnaHQ7ICAgICAgICAgICAgLyoqPCBIZWlnaHQgb2YgdGhlIHZpZGVvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgIG1fYXZlcmFnZUZyYW1lUmF0ZTsgICAgICAgIC8qKjwgQXZlcmFnZSBmcmFtZSByYXRlIG9mIHRoZSB2aWRlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHN0cmVhbSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgdmlkZW9Sb3RhdGlvbkRlZ3JlZXM7ICAgICAgICAvKio8IFZpZGVvIHJvdGF0aW9uIGRlZ3JlZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9zdHJ1Y3RTaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi19IE00X1ZpZGVvU3RyZWFtSGFuZGxlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyCi0gKiBAYnJpZWYgICAgICAgIEV4dGVuZGVkIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhbiBhdWRpbyBzdHJlYW0uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNF9TdHJlYW1IYW5kbGVyICAgIG1fYmFzaWNQcm9wZXJ0aWVzOyAgICAgICAgLyoqPCBBdWRpby1WaWRlbyBzdHJlYW0gY29tbW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fbmJDaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgYXVkaW8gc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLW1vbm8sIDItc3RlcmVvKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9ieXRlRnJhbWVMZW5ndGg7ICAgICAgICAvKio8IFNpemUgb2YgZnJhbWUgc2FtcGxlcyBpbiBieXRlcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9ieXRlU2FtcGxlU2l6ZTsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3k7ICAgIC8qKjwgU2FtcGxlIGZyZXF1ZW5jeSBpbiBrSHogKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fc3RydWN0U2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotfSBNNF9BdWRpb1N0cmVhbUhhbmRsZXI7Ci0KLSNpZmRlZiBNNFZQU19TVVBQT1JUX1RURVhUCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X1RleHRTdHJlYW1IYW5kbGVyCi0gKiBAYnJpZWYgICAgICAgIEV4dGVuZGVkIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHRleHQgc3RyZWFtLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAgICBtX2Jhc2ljUHJvcGVydGllczsgICAgLyoqPCBBdWRpby1WaWRlbyBzdHJlYW0gY29tbW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdHJhY2tXaWR0aDsgICAgICAgIC8qKjwgV2lkdGggb2YgdGhlIHZpZGVvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdHJhY2tIZWlnaHQ7ICAgICAgICAvKio8IEhlaWdodCBvZiB0aGUgdmlkZW8gaW4gdGhlIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV90cmFja1hwb3M7ICAgICAgICAvKio8IFggcG9zaXRpb24gb2YgdGhlIHRleHQgdHJhY2sgaW4gdmlkZW8gYXJlYSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV90cmFja1lwb3M7ICAgICAgICAvKio8IFkgcG9zaXRpb24gb2YgdGhlIHRleHQgdHJhY2sgaW4gdmlkZW8gYXJlYSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgYmFja19jb2xfcmdiYVs0XTsgICAgLyoqPCB0aGUgYmFja2dyb3VuZCBjb2xvciBpbiBSR0JBICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICB1aUxlbmdodDsgICAgICAgICAgICAvKio8IHRoZSBzdHJpbmcgbGVuZ2h0IGluIGJ5dGVzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBkaXNwX2ZsYWc7ICAgICAgICAgICAgLyoqPCB0aGUgd2F5IHRleHQgd2lsbCBiZSBkaXNwbGF5ZWQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIGhvcml6X2p1c3RpZjsgICAgICAgIC8qKjwgdGhlIGhvcml6b250YWwganVzdGlmaWNhdGlvbiBvZiB0aGUgdGV4dCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgdmVydGlfanVzdGlmOyAgICAgICAgLyoqPCB0aGUgdmVydGljYWwganVzdGlmaWNhdGlvbiBvZiB0aGUgdGV4dCAqLwotICAgIC8qIHN0eWxlICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBzdHlsX3N0YXJ0X2NoYXI7ICAgIC8qKjwgdGhlIGZpcnN0IGNoYXJhY3RlciBpbXBhY3RlZCBieSBzdHlsZSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgc3R5bF9lbmRfY2hhcjsgICAgICAgIC8qKjwgdGhlIGxhc3QgY2hhcmFjdGVyIGltcGFjdGVkIGJ5IHN0eWxlICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBmb250SUQ7ICAgICAgICAgICAgICAgIC8qKjwgSUQgb2YgdGhlIGZvbnQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIGZhY2Vfc3R5bGU7ICAgICAgICAgICAgLyoqPCB0aGUgdGV4dCBmYWNlLXN0eWxlOiBib2xkLCBpdGFsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmVkLCBwbGFpbihkZWZhdWx0KSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgZm9udF9zaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBpbiBwaXhlbCBvZiBmb250ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICB0ZXh0X2NvbF9yZ2JhWzRdOyAgICAvKio8IHRoZSB0ZXh0IGNvbG9yIGluIFJHQkEgKi8KLSAgICAvKiBib3ggKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgIGJveF90b3A7ICAgICAgICAgLyoqPCB0aGUgdG9wIHBvc2l0aW9uIG9mIHRleHQgYm94IGluIHRoZSB0cmFjayBhcmVhICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBib3hfbGVmdDsgICAgICAgIC8qKjwgdGhlIGxlZnQgcG9zaXRpb24gb2YgdGV4dCBib3ggaW4gdGhlIHRyYWNrIGFyZWEgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgIGJveF9ib3R0b207ICAgICAgLyoqPCB0aGUgYm90dG9tIHBvc2l0aW9uIG9mIHRleHQgYm94IGluIHRoZSB0cmFjayBhcmVhICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBib3hfcmlnaHQ7ICAgICAgIC8qKjwgdGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRleHQgYm94IGluIHRoZSB0cmFjayBhcmVhICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3N0cnVjdFNpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi19IE00X1RleHRTdHJlYW1IYW5kbGVyOwotCi0jZW5kaWYgLypNNFZQU19TVVBQT1JUX1RURVhUKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfQWNjZXNzVW5pdAotICogQGJyaWVmICAgICAgICBTdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYW4gYWNjZXNzIHVuaXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9zdHJlYW1JRDsgICAgICAgLyoqPCBJZCBvZiB0aGUgc3RyZWFtIHRvIGdldCBhbiBBVSBmcm9tICovCi0gIE00T1NBX01lbUFkZHI4ICAgICAgICBtX2RhdGFBZGRyZXNzOyAgICAgIC8qKjwgUG9pbnRlciB0byBhIG1lbW9yeSBhcmVhIHdpdGggdGhlIGVuY29kZWQgZGF0YSAqLwotICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3NpemU7ICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIGRhdGFBZHJlc3MgYXJlYSAqLwotICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtX0NUUzsgICAgICAgICAgICAvKio8IENvbXBvc2l0aW9uIFRpbWUgU3RhbXAgZm9yIHRoZSBBY2Nlc3MgVW5pdCAqLwotICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtX0RUUyA7ICAgICAgICAgICAvKio8IERlY29kZWQgVGltZSBTdGFtcCBmb3IgdGhlIEFjY2VzcyBVbml0ICovCi0gIE00T1NBX1VJbnQ4ICAgICAgICAgICAgbV9hdHRyaWJ1dGU7ICAgICAgIC8qKjwgUkFQIGluZm9ybWF0aW9uICYgQVUgY29ycnVwdGVkICovCi0gIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fbWF4c2l6ZTsgICAgICAgIC8qKjwgTWF4aW11bSBzaXplIG9mIHRoZSBBVSAqLwotICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3N0cnVjdFNpemU7ICAgICAvKio8IFN0cnVjdHVyZSBzaXplICovCi19IE00X0FjY2Vzc1VuaXQ7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qX19jcGx1c3BsdXMqLwotCi0jZW5kaWYgLyogX19NNERBX1RZUEVTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzZTMwNjIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRERUNPREVSX0NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00REVDT0RFUl9Db21tb24uaAotICogQGJyaWVmICBTaGVsbCBEZWNvZGVyIGNvbW1vbiBpbnRlcmZhY2UgZGVjbGFyYXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBjb21tb24gaW50ZXJmYWNlcyB0aGF0IGRlY29kZXIgc2hlbGxzIG11c3QgaW1wbGVtZW50Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNERFQ09ERVJfQ09NTU9OX0hfXwotI2RlZmluZSBfX000REVDT0RFUl9DT01NT05fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfT3B0aW9uSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLSNpbmNsdWRlICJNNF9VdGlscy5oIgotCi0vKiAtLS0tLSBFcnJvcnMgYW5kIFdhcm5pbmdzIC0tLS0tICovCi0KLS8qKgotICogV2FybmluZzogdGhlcmUgaXMgbm8gbmV3IGRlY29kZWQgZnJhbWUgdG8gcmVuZGVyIHNpbmNlIHRoZSBsYXN0IHJlbmRlcmluZwotICovCi0jZGVmaW5lIE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNERFQ09ERVJfQ09NTU9OLCAweDAwMDEpCi0vKioKLSAqIFdhcm5pbmc6IHRoZSBkZWJsb2NraW5nIGZpbHRlciBpcyBub3QgaW1wbGVtZW50ZWQKLSAqLwotI2RlZmluZSBNNFdBUl9ERUJMT0NLSU5HX0ZJTFRFUl9OT1RfSU1QTEVNRU5URUQgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00REVDT0RFUl9DT01NT04sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIpCi0KLQotLyogRXJyb3I6IFN0cmVhbSBIMjYzIHByb2ZpbGVzIChvdGhlciB0aGFuICAwKSBhcmUgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBNNEVSUl9ERUNPREVSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfTVBFRzQsIDB4MDAwMSkKLS8qIEVycm9yOiBTdHJlYW0gSDI2MyBub3QgYmFzZWxpbmUgbm90IHN1cHBvcnRlZCAoU3VwcG9ydGVkIHNpemVzIGFyZSBDSUYsIFFDSUYgb3IgU1FDSUYpICovCi0jZGVmaW5lIE00RVJSX0RFQ09ERVJfSDI2M19OT1RfQkFTRUxJTkUgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9NUEVHNCwgMHgwMDAyKQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00REVDT0RFUl9BVkNQcm9maWxlTGV2ZWwKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgQVZDIGRlY29kZXIgcHJvZmlsZSBhbmQgbGV2ZWwgZm9yIHRoZSBjdXJyZW50IGluc3RhbmNlCi0gKiBAbm90ZSAgICBUaGlzIG9wdGlvbnMgY2FuIGJlIHJlYWQgZnJvbSBkZWNvZGVyIHZpYSBNNERFQ09ERVJfZ2V0T3B0aW9uX2ZjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8xID0gMCwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMWIsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzFfMSwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMV8yLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8xXzMsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzIsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzJfMSwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMl8yLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8zLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8zXzEsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzNfMiwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfNCwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfNF8xLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF80XzIsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzUsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzVfMSwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlX2FuZF9MZXZlbF9PdXRfT2ZfUmFuZ2UgPSAyNTUKLX0gTTRERUNPREVSX0FWQ1Byb2ZpbGVMZXZlbDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNERFQ09ERVJfT3B0aW9uSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgZGVjb2RlciBvcHRpb25zCi0gKiBAbm90ZSAgICBUaGVzZSBvcHRpb25zIGNhbiBiZSByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBhIGRlY29kZXIgdmlhIE00REVDT0RFUl9nZXRPcHRpb25fZmN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyoqCi0gICAgR2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBjb3JlIGRlY29kZXIKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfVmVyc2lvbiAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDEpLAotICAgIC8qKgotICAgIEdldCB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudGx5IGRlY29kZWQgdmlkZW8KLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfVmlkZW9TaXplICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDAyKSwKLSAgICAvKioKLSAgICBTZXQgdGhlIGNvbnZlcnNpb24gZmlsdGVyIHRvIHVzZSBhdCByZW5kZXJpbmcKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDAzKSwKLSAgICAvKioKLSAgICBBY3RpdmF0ZSB0aGUgRGVibG9ja2luZyBmaWx0ZXIKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfRGVibG9ja2luZ0ZpbHRlciA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwNCksCi0gICAgLyoqCi0gICAgR2V0IG5leCByZW5kZXJlZCBmcmFtZSBDVFMKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfTmV4dFJlbmRlcmVkRnJhbWVDVFMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUpLAotCi0gICAgLyoqCi0gICAgU2V0IHRoZSBZVVYgZGF0YSB0byB0aGUgZHVtbXkgdmlkZW8gZGVjb2RlcgotICAgICovCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9EZWNZdXZEYXRhID0KLSAgICAgICAgTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDA2KSwKLSAgICAvKioKLSAgICBTZXQgdGhlIFlVViBkYXRhIHdpdGggY29sb3IgZWZmZWN0IGFwcGxpZWQgdG8gdGhlIGR1bW15IHZpZGVvIGRlY29kZXIKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfWXV2V2l0aEVmZmVjdE5vbkNvbnRpZ3VvdXMgPQotICAgICAgICBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDcpLAotCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Q29udGlndW91cyA9Ci0gICAgICAgIE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwOCksCi0KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX0VuYWJsZVl1dldpdGhFZmZlY3QgPQotICAgICAgICBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDkpLAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdXBwb3J0ZWQgdmlkZW8gZGVjb2RlcnMgYW5kIGNhcGFiaWxpdGllcyAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfVmlkZW9EZWNvZGVyc0FuZENhcGFiaWxpdGllcyA9Ci0gICAgICAgIE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgxMCksCi0KLSAgICAvKiBjb21tb24gdG8gTVBFRzQgZGVjb2RlcnMgKi8KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIERlY29kZXJDb25maWdJbmZvICovCi0gICAgTTRERUNPREVSX01QRUc0X2tPcHRpb25JRF9EZWNvZGVyQ29uZmlnSW5mbyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfTVBFRzQsIDB4MDEpLAotCi0gICAgLyogbGFzdCBkZWNvZGVkIGN0cyAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfQVZDTGFzdERlY29kZWRGcmFtZUNUUyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FWQyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEpCi0vKiBMYXN0IGRlY29kZWQgY3RzICovCi0KLX0gTTRERUNPREVSX09wdGlvbklEOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbwotICogQGJyaWVmICAgIENvbnRhaW5zIGluZm8gcmVhZCBmcm9tIHRoZSBNUEVHLTQgVmlkZW9PYmplY3RMYXllci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQ4ICAgICAgICB1aVByb2ZpbGU7ICAgICAgICAgICAgICAgIC8qKjwgcHJvZmlsZSBhbmQgbGV2ZWwgYXMgZGVmaW5lZCBpbiB0aGUgVmlzdWFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgU2VxdWVuY2UgaGVhZGVyLCBpZiBwcmVzZW50ICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpVGltZVNjYWxlOyAgICAgICAgICAgIC8qKjwgdGltZSBzY2FsZSBhcyBwYXJzZWQgaW4gVk9MIGhlYWRlciAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICB1aVVzZU9mUmVzeW5jaE1hcmtlcjsgICAgLyoqPCBVc2FnZSBvZiByZXN5bmNocm9uaXphdGlvbiBtYXJrZXIgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICBiRGF0YVBhcnRpdGlvbjsgICAgICAgICAgICAvKio8IElmIDEgZGF0YSBwYXJ0aXRpb25pbmcgaXMgdXNlZC4gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICBiVXNlT2ZSVkxDOyAgICAgICAgICAgICAgICAvKio8IFVzYWdlIG9mIFJWTEMgZm9yIHRoZSBzdHJlYW0gKi8KLQotfSBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm87Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNERFQ09ERVJfVmlkZW9TaXplCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHZpZGVvIHNpemUgKHdpZHRoIGFuZCBoZWlnaHQpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRyaWV2ZSB2aWEgdGhlIE00REVDT0RFUl9nZXRPcHRpb25fZmN0Ci0gKiAgICAgICAgICAgICAgICBmdW5jdGlvbiB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBkZWNvZGVkIHZpZGVvCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000REVDT0RFUl9WaWRlb1NpemUKLXsKLSAgICBNNE9TQV9VSW50MzIgICBtX3VpV2lkdGg7ICAgIC8qKjwgdmlkZW8gd2lkdGggIGluIHBpeGVscyAqLwotICAgIE00T1NBX1VJbnQzMiAgIG1fdWlIZWlnaHQ7ICAgIC8qKjwgdmlkZW8gaGVpZ2h0IGluIHBpeGVscyAqLwotCi19IE00REVDT0RFUl9WaWRlb1NpemU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udmVyc2lvbiBmaWx0ZXIKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBmaWx0ZXIgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgIHBvaW50ZXIgYW5kIGl0cyB1c2VyIGRhdGEgdmlhIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgTTRERUNPREVSX2dldE9wdGlvbl9mY3QgICAgd2l0aCB0aGUgb3B0aW9uCi0gKiAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX091dHB1dEZpbHRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNERFQ09ERVJfT3V0cHV0RmlsdGVyCi17Ci0gICAgTTRPU0FfVm9pZCAgICptX3BGaWx0ZXJGdW5jdGlvbjsgICAgLyoqPCBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgZnVuY3Rpb24gKi8KLSAgICBNNE9TQV9Wb2lkICAgKm1fcEZpbHRlclVzZXJEYXRhOyAgICAvKio8IHVzZXIgZGF0YSBvZiB0aGUgZmlsdGVyICAgICAgICAqLwotCi19IE00REVDT0RFUl9PdXRwdXRGaWx0ZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRERUNPREVSX1ZpZGVvVHlwZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSB2aWRlbyB0eXBlcyB1c2VkIHRvIGNyZWF0ZSBkZWNvZGVycwotICogQG5vdGUgICAgVGhpcyBlbnVtIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVlBTIHRvIGlkZW50aWZ5IGEgY3VycmVudGx5IHN1cHBvcnRlZAotICogICAgICAgICAgICB2aWRlbyBkZWNvZGVyIGludGVyZmFjZS4gRWFjaCBkZWNvZGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCBvbmUgb2YgdGhpcyB0eXBlIGFzc29jaWF0ZWQuCi0gKiAgICAgICAgICAgIFdoZW4gYSBkZWNvZGVyIGluc3RhbmNlIGlzIG5lZWRlZCwgdGhpcyB0eXBlIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW5kCi0gKiAgICAgICAgICAgIGFuZCByZXRyaWV2ZSBpdHMgaW50ZXJmYWNlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlTVBFRzQgPSAwLAotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlTUpQRUcsCi0gICAgTTRERUNPREVSX2tWaWRlb1R5cGVBVkMsCi0gICAgTTRERUNPREVSX2tWaWRlb1R5cGVXTVYsCi0gICAgTTRERUNPREVSX2tWaWRlb1R5cGVSRUFMLAotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlWVVWNDIwUCwKLQotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlX05CICAvKiBudW1iZXIgb2YgZGVjb2RlcnMsIGtlZXAgaXQgYXMgbGFzdCBlbnVtIGVudHJ5ICovCi0KLX0gTTRERUNPREVSX1ZpZGVvVHlwZSA7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9VSW50MzIgbVByb2ZpbGU7Ci0gICAgTTRPU0FfVUludDMyIG1MZXZlbDsKLX0gVmlkZW9Qcm9maWxlTGV2ZWw7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBWaWRlb1Byb2ZpbGVMZXZlbCAqcHJvZmlsZUxldmVsOwotICAgIE00T1NBX1VJbnQzMiBwcm9maWxlTnVtYmVyOwotfSBWaWRlb0NvbXBvbmVudENhcGFiaWxpdGllczsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00X1N0cmVhbVR5cGUgY29kZWM7Ci0gICAgVmlkZW9Db21wb25lbnRDYXBhYmlsaXRpZXMgKmNvbXBvbmVudDsKLSAgICBNNE9TQV9VSW50MzIgY29tcG9uZW50TnVtYmVyOwotfSBWaWRlb0RlY29kZXI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBWaWRlb0RlY29kZXIgKmRlY29kZXI7Ci0gICAgTTRPU0FfVUludDMyIGRlY29kZXJOdW1iZXI7Ci19IE00REVDT0RFUl9WaWRlb0RlY29kZXJzOwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjb2RlcgotICogQG5vdGUgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKE9VVCkgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gYSB2aWRlbyBzdHJlYW0gZGVzY3JpcHRpb24KLSAqIEBwYXJhbSAgICBwR2xvYmFsSW50ZXJmYWNlOiAgKElOKSAgICBQb2ludGVyIHRvIHRoZSBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2Ugc3RydWN0dXJlIHRoYXQgbXVzdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGJ5IHRoZSBkZWNvZGVyIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBzdHJlYW0KLSAqIEBwYXJhbSAgICBwRGF0YUludGVyZmFjZTogICAgKElOKSAgICBQb2ludGVyIHRvIHRoZSBNNFJFQURFUl9EYXRhSW50ZXJmYWNlIHN0cnVjdHVyZSB0aGF0IG11c3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBieSB0aGUgZGVjb2RlciB0byByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtCi0gKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgICAgIChJTikgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdGhlIGRlY29kZWQgZGF0YSBhcmUgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfY3JlYXRlX2ZjdCkgICAgKE00T1NBX0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcEdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwRGF0YUludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBkZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgZGVjb2RlcgotICogQG5vdGUgICAgYWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfZGVzdHJveV9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBnZXQgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC10aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRlY29kZXIKLSAqICAgICAgICAgIC10aGUgc2l6ZSAod2lkdGh4aGVpZ2h0KSBvZiB0aGUgaW1hZ2UKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAoSU4pICAgICAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAoSU4vT1VUKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpIHdoZXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGlzIHN0b3JlZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfZ2V0T3B0aW9uX2ZjdCkoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgYW4gb3B0aW9uIHZhbHVlIG9mIHRoZSBkZWNvZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLXRoZSBjb252ZXJzaW9uIGZpbHRlciB0byB1c2UgYXQgcmVuZGVyaW5nCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgb3B0aW9uSWQ6ICAgKElOKSAgICAgICAgSWRlbnRpZmllciBpbmRpY2F0aW5nIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4pICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgVGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIG9wdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRERUNPREVSX3NldE9wdGlvbl9mY3QpKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIERlY29kZSBBY2Nlc3MgVW5pdHMgdXAgdG8gYSB0YXJnZXQgdGltZQotICogQG5vdGUgICAgUGFyc2UgYW5kIGRlY29kZSB0aGUgc3RyZWFtIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIG91dHB1dCBhIGRlY29kZWQgaW1hZ2UgZm9yIHdoaWNoCi0gKiAgICAgICAgICAgIHRoZSBjb21wb3NpdGlvbiB0aW1lIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdG8gdGhlIHBhc3NlZCB0YXJnZXRlZCB0aW1lCi0gKiAgICAgICAgICBUaGUgZGF0YSBhcmUgcmVhZCBmcm9tIHRoZSByZWFkZXIgZGF0YSBpbnRlcmZhY2UKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIHBUaW1lOiAgICAgICAgKElOL09VVCkgICAgSU46IFRpbWUgdG8gZGVjb2RlIHVwIHRvIChpbiBtaWxsaSBzZWNvbmRlcykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIGxhc3QgZGVjb2RlZCBmcmFtZSAoaW4gbXMpCi0gKiBAcGFyYW0gICBiSnVtcDogICAgICAoSU4pICAgICAgICAwIGlmIG5vIGp1bXAgb2NjdXJlZCBqdXN0IGJlZm9yZSB0aGlzIGNhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgaWYgYSBhIGp1bXAgaGFzIGp1c3QgYmVlbiBtYWRlCi0gKiBAcGFyYW0gICB0b2xlcmFuY2U6ICAgICAgKElOKSAgICAgICAgV2UgbWF5IGRlY29kZSBhbiBlYXJsaWVyIGZyYW1lIHdpdGhpbiB0aGUgdG9sZXJhbmNlLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB0aW1lIGRpZmZlcmVuY2UgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX0FVICAgICAgICB0aGVyZSBpcyBubyBtb3JlIGFjY2VzcyB1bml0IHRvIGRlY29kZSAoZW5kIG9mIHN0cmVhbSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00REVDT0RFUl9kZWNvZGVfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9NZWRpYVRpbWUqIHBUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkp1bXAsIE00T1NBX1VJbnQzMiB0b2xlcmFuY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBSZW5kZXJzIHRoZSB2aWRlbyBhdCB0aGUgc3BlY2lmaWVkIHRpbWUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICBwVGltZTogICAgICAgKElOL09VVCkgICBJTjogVGltZSB0byByZW5kZXIgdG8gKGluIG1pbGxpIHNlY29uZGVzKQotICogICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIGFjdHVhbGx5IHJlbmRlcmVkIGZyYW1lIChpbiBtcykKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmU6KE9VVCkgICAgICAgIE91dHB1dCBwbGFuZSBmaWxsZWQgd2l0aCBkZWNvZGVkIGRhdGEgKGNvbnZlcnRlZCkKLSAqIEBwYXJhbSAgIGJGb3JjZVJlbmRlcjooSU4pICAgICAgIDEgaWYgdGhlIGltYWdlIG11c3QgYmUgcmVuZGVyZWQgZXZlbiBpdCBoYXMgYWxyZWFkeSBiZWVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdCAoaW4gd2hpY2ggY2FzZSB0aGUgZnVuY3Rpb24gY2FuIHJldHVybgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAgICBJZiB0aGUgZnJhbWUgdG8gcmVuZGVyIGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00REVDT0RFUl9yZW5kZXJfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9NZWRpYVRpbWUqIHBUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0cHV0UGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiRm9yY2VSZW5kZXIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZ2VuZXJpYyB2aWRlbyBkZWNvZGVyIGludGVyZmFjZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIG9mIG9uZSB2aWRlbyBkZWNvZGVyIHR5cGUuCi0gKiAgICAgICAgICAgICAgICBUaGUgZGVjb2RlciB0eXBlIGlzIG9uZSBvZiB0aGUgTTRERUNPREVSX1ZpZGVvVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UKLXsKLSAgICBNNERFQ09ERVJfY3JlYXRlX2ZjdCogICAgICAgIG1fcEZjdENyZWF0ZTsKLSAgICBNNERFQ09ERVJfZGVzdHJveV9mY3QqICAgICAgICBtX3BGY3REZXN0cm95OwotICAgIE00REVDT0RFUl9nZXRPcHRpb25fZmN0KiAgICBtX3BGY3RHZXRPcHRpb247Ci0gICAgTTRERUNPREVSX3NldE9wdGlvbl9mY3QqICAgIG1fcEZjdFNldE9wdGlvbjsKLSAgICBNNERFQ09ERVJfZGVjb2RlX2ZjdCogICAgICAgIG1fcEZjdERlY29kZTsKLSAgICBNNERFQ09ERVJfcmVuZGVyX2ZjdCogICAgICAgIG1fcEZjdFJlbmRlcjsKLX0gTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlOwotCi0jZW5kaWYgLypfX000REVDT0RFUl9DT01NT05fSF9fKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REVDT0RFUl9OdWxsLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfTnVsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDdkODU3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REVDT0RFUl9OdWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWRF9OdWxsLmgKLSAqIEBicmllZiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhICJudWxsIiB2aWRlbyBkZWNvZGVyLGkuZS4gYSBkZWNvZGVyCi0gKiAgICAgICAgICB0aGF0IGRvZXMgbm90IGRvIGFjdHVhbCBkZWNvZGluZy4KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBnZXRJbnRlcmZhY2UgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000REVDT0RFUl9OVUxMX0hfXwotI2RlZmluZSBfX000REVDT0RFUl9OVUxMX0hfXwotCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSBwRGVjb2RlclR5cGUgICAgICAgIDogUG9pbnRlciB0byBhIE00REVDT0RFUl9WaWRlb1R5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSBwRGVjb2RlckludGVyZmFjZSAgIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZGVjb2Rlci4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBhbmQgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotICoKLSAqIEByZXR1cm5zIDogTTROT19FUlJPUiAgaWYgT0sKLSAqICAgICAgICAgICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZ2V0SW50ZXJmYWNlKCBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UgKipwRGVjb2RlckludGVyZmFjZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKl9fTTRERUNPREVSX05VTExfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfQXVkaW9Db21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2JhMDJhMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfQXVkaW9Db21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgKLSAqIEBicmllZiAgICBWRVMgYXVkaW8gZW5jb2RlcnMgc2hlbGwgaW50ZXJmYWNlLgotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHR5cGVzIGludGVybmFsbHkgdXNlZCBieSB0aGUgVkVTIHRvIGFic3RyYWN0IGF1ZGlvIGVuY29kZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000RU5DT0RFUl9BVURJT0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNEVOQ09ERVJfQVVESU9DT01NT05fSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiICAgICAvKiBmb3IgTTRPU0FfT1BUSU9OX0lEX0NSRUFURSgpICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLSNkZWZpbmUgTTRFTkNPREVSX0FVRElPX05CX0NIQU5ORUxTX01BWCAyCi0vKiBXQVJOSU5HOiB0aGlzIHZhbHVlIG11c3QgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIGdyYWJiZWQgKi8KLS8vI2RlZmluZSBNNEVOQ09ERVJfQVVESU9fUENNX1NBTVBMRV9OVU1CRVIgOTYwICAgIC8qIGltcG9zZWQgYnkgdGhlIEFBQyBlbmNvZGVyLiAqLwotI2RlZmluZSBNNEVOQ09ERVJfQVVESU9fUENNX1NBTVBMRV9OVU1CRVIgMTAyNCAgICAvKiBpbXBvc2VkIGJ5IHRoZSBBQUMgZW5jb2Rlci4gKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW1lcmF0aW9uICAgIE00RU5DT0RFUl9BdWRpb19PcHRpb25JRAotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgY29yZSBBQUMgc2hlbGwgZW5jb2RlciBvcHRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gLyogTWF4aW11bSBnZW5lcmF0ZWQgQVUgc2l6ZSAqLwotICAgIE00RU5DT0RFUl9BdWRpb19tYXhBVXNpemUgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELE00RU5DT0RFUl9BVURJTywgMHgwMSkKLQotfSBNNEVOQ09ERVJfQXVkaW9fT3B0aW9uSUQ7Ci0KLQotIC8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX1NhbXBsaW5nRnJlcXVlbmN5Ci0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGF1ZGlvIHNhbXBsaW5nIGZyZXF1ZW5jeS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfazgwMDBIeiA9IDgwMDAsCi0gICAgTTRFTkNPREVSX2sxMTAyNUh6ID0gMTEwMjUsCi0gICAgTTRFTkNPREVSX2sxMjAwMEh6ID0gMTIwMDAsCi0gICAgTTRFTkNPREVSX2sxNjAwMEh6ID0gMTYwMDAsCi0gICAgTTRFTkNPREVSX2syMjA1MEh6ID0gMjIwNTAsCi0gICAgTTRFTkNPREVSX2syNDAwMEh6ID0gMjQwMDAsCi0gICAgTTRFTkNPREVSX2szMjAwMEh6ID0gMzIwMDAsCi0gICAgTTRFTkNPREVSX2s0NDEwMEh6ID0gNDQxMDAsCi0gICAgTTRFTkNPREVSX2s0ODAwMEh6ID0gNDgwMDAKLX0gTTRFTkNPREVSX1NhbXBsaW5nRnJlcXVlbmN5OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0Ci0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF1ZGlvIGNvbXByZXNzaW9uIGZvcm1hdHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tBTVJOQiA9IDAsCi0gICAgTTRFTkNPREVSX2tBQUMsCi0gICAgTTRFTkNPREVSX2tBdWRpb05VTEwsICAgIC8qKjwgTm8gY29tcHJlc3Npb24gKi8KLSAgICBNNEVOQ09ERVJfa01QMywKLSAgICBNNEVOQ09ERVJfa0F1ZGlvX05CICAgICAgICAvKiBudW1iZXIgb2YgZW5jb2RlcnMsIGtlZXAgaXQgYXMgbGFzdCBlbnVtIGVudHJ5ICovCi0KLX0gTTRFTkNPREVSX0F1ZGlvRm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9DaGFubmVsTnVtYmVyCi0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIG51bWJlciBvZiBhdWRpbyBjaGFubmVscy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa01vbm8gID0gMCwKLSAgICBNNEVOQ09ERVJfa1N0ZXJlbywKLSAgICBNNEVOQ09ERVJfa1N0ZXJlb05vSW50ZXJsZWF2ZQotfSBNNEVOQ09ERVJfQ2hhbm5lbE51bWJlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfQXVkaW9CaXRyYXRlCi0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBiaXRyYXRlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzRfNzVfS0JQUyAgICA9IDQ3NTAsCi0gICAgTTRFTkNPREVSX2tBdWRpb181XzE1X0tCUFMgICAgPSA1MTUwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fNV85X0tCUFMgICAgPSA1OTAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fNl83X0tCUFMgICAgPSA2NzAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fN180X0tCUFMgICAgPSA3NDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fN185NV9LQlBTICAgID0gNzk1MCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzhfS0JQUyAgICAgICAgPSA4MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTBfMl9LQlBTICAgID0gMTAyMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xMl8yX0tCUFMgICAgPSAxMjIwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzE2X0tCUFMgICAgPSAxNjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzI0X0tCUFMgICAgPSAyNDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzMyX0tCUFMgICAgPSAzMjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzQwX0tCUFMgICAgPSA0MDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzQ4X0tCUFMgICAgPSA0ODAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzU2X0tCUFMgICAgPSA1NjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzY0X0tCUFMgICAgPSA2NDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzgwX0tCUFMgICAgPSA4MDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzk2X0tCUFMgICAgPSA5NjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzExMl9LQlBTICAgID0gMTEyMDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTI4X0tCUFMgICAgPSAxMjgwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xNDRfS0JQUyAgICA9IDE0NDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzE2MF9LQlBTICAgID0gMTYwMDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTkyX0tCUFMgICAgPSAxOTIwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18yMjRfS0JQUyAgICA9IDIyNDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzI1Nl9LQlBTICAgID0gMjU2MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMzIwX0tCUFMgICAgPSAzMjAwMDAKLX0gTTRFTkNPREVSX0F1ZGlvQml0cmF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNEVOQ09ERVJfQWFjUmVndWxhdGlvbgotICogQGJyaWVmICAgICAgICBUaGUgY3VycmVudCBtb2RlIG9mIHRoZSBiaXRyYXRlIHJlZ3VsYXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tBYWNSZWd1bE5vbmUgPSAwLCAgICAvKio8IG5vIGJpdHJhdGUgcmVndWxhdGlvbiAqLwotICAgIE00RU5DT0RFUl9rQWFjQml0UmVzZXJ2b2lyICAgICAgICAvKio8IGJldHRlciBxdWFsaXR5LCBidXQgbW9yZSBDUFUgY29uc3VtZWQgKi8KLX0gTTRFTkNPREVSX0FhY1JlZ3VsYXRpb247Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0FtclNJRAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBTSUQgb2YgdGhlIEFNUiBlbmNvZGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rQW1yTm9TSUQgPSAwICAgICAvKio8IG5vIFNJRCAqLwotfSBNNEVOQ09ERVJfQW1yU0lEOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfQWFjUGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbGwgdGhlIHNldHRpbmdzIHNwZWNpZmljIHRvIHRoZSBBQUMgZW5jb2Rlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00RU5DT0RFUl9BYWNSZWd1bGF0aW9uICAgIFJlZ3VsYXRpb247Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiSGlnaFNwZWVkOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYlROUzsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJQTlM7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiSVM7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiTVM7Ci19IE00RU5DT0RFUl9BYWNQYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9BdWRpb1BhcmFtcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWxsIHRoZSBzZXR0aW5ncyBhdmFsYWlibGUgd2hlbiBlbmNvZGluZyBhdWRpby4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBzX000RU5DT0RFUl9BdWRpb1BhcmFtcwotewotICAgIE00RU5DT0RFUl9TYW1wbGluZ0ZyZXF1ZW5jeSAgICBGcmVxdWVuY3k7ICAgIC8qKjwgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgIE00RU5DT0RFUl9DaGFubmVsTnVtYmVyICAgICAgICBDaGFubmVsTnVtOyAgICAvKio8IHRoZSBudW1iZSBvZiBjaGFubmVscyAobW9ubywgc3RlcmVvLCAuLikgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9CaXRyYXRlICAgICAgICBCaXRyYXRlOyAgICAvKio8ICBiaXRyYXRlLCBzZWUgZW51bSAgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgICAgICAgIEZvcm1hdDsgICAgICAgIC8qKjwgIGF1ZGlvIGNvbXByZXNzaW9uIGZvcm1hdCwgQU1SLCBBQUMgLi4uICAqLwotICAgIHVuaW9uIHsKLSAgICAgICAgTTRFTkNPREVSX0FhY1BhcmFtcyAgICAgICAgQWFjUGFyYW07Ci0gICAgICAgIE00RU5DT0RFUl9BbXJTSUQgICAgICAgIEFtclNJRDsKLSAgICB9IFNwZWNpZlBhcmFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHRoZSBhdWRpbyBlbmNvZGVyIHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KLX0gTTRFTkNPREVSX0F1ZGlvUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8KLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGRlY29kZXIgc3BlY2lmaWMgaW5mbyBidWZmZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICBwSW5mbzsgICAgICAgIC8qKjwgdGhlIGJ1ZmZlciBhZHJlc3MgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgaW5mb1NpemU7ICAgIC8qKjwgdGhlIGJ1ZmZlciBzaXplIGluIGJ5dGVzICovCi19IE00RU5DT0RFUl9BdWRpb0RlY1NwZWNpZmljSW5mbzsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZGF0YSBidWZmZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IHRoZSB0YWJsZSBvZiBidWZmZXJzICh1bnVzZWQgYnVmZmVycyBhcmUgc2V0IHRvIE5VTEwpICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgcFRhYmxlQnVmZmVyW000RU5DT0RFUl9BVURJT19OQl9DSEFOTkVMU19NQVhdOwotICAgIC8qKjwgdGhlIHRhYmxlIG9mIHRoZSBzaXplIG9mIGNvcnJlc3BvbmRpbmcgYnVmZmVyIGF0IHNhbWUgaW5kZXggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgcFRhYmxlQnVmZmVyU2l6ZVtNNEVOQ09ERVJfQVVESU9fTkJfQ0hBTk5FTFNfTUFYXTsKLX0gTTRFTkNPREVSX0F1ZGlvQnVmZmVyOwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRBRV9pbml0KSAgICAgICAgKE00T1NBX0NvbnRleHQqIGhDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfY2xlYW5VcCkgICAgKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfb3BlbikgICAgICAgIChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEVOQ09ERVJfQXVkaW9QYXJhbXMgKnBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gKmRlY1NwZWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgZ3JhYmJlckNvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfY2xvc2UpICAgICAgICAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRBRV9zdGVwKSAgICAgICAgIChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgKmluQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciAqb3V0QnVmZmVyKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFFX2dldE9wdGlvbikgICAgKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX09wdGlvbklEICAgIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICp2YWx1ZVB0cik7Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UKLSAqIEBicmllZiAgICBEZWZpbmVzIGFsbCB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBhbiBhdWRpbyBlbmNvZGVyIHNoZWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UKLXsKLSAgICBNNEFFX2luaXQqICAgICAgICBwRmN0SW5pdDsKLSAgICBNNEFFX2NsZWFuVXAqICAgIHBGY3RDbGVhblVwOwotICAgIE00QUVfb3BlbiogICAgICAgIHBGY3RPcGVuOwotICAgIE00QUVfY2xvc2UqICAgICAgICBwRmN0Q2xvc2U7Ci0gICAgTTRBRV9zdGVwKiAgICAgICAgcEZjdFN0ZXA7Ci0gICAgTTRBRV9nZXRPcHRpb24qICAgIHBGY3RHZXRPcHRpb247Ci19IE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000RU5DT0RFUl9BVURJT0NPTU1PTl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfY29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwNjQ2MDIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNEVOQ09ERVJfY29tbW9uLmgKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0eXBlcyBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIFZFUyB0byBhYnN0cmFjdCBlbmNvZGVycwotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000RU5DT0RFUl9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRFTkNPREVSX0NPTU1PTl9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qKgotICogVmlkZW8gcHJlcHJvY2Vzc2luZyBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRWUFBfQVBJLmgiCi0KLS8qKgotICogV3JpdGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNFdSSVRFUl9jb21tb24uaCIKLQotLyogSU1BR0UgU1RBQiAqLwotLyogcGVyY2VudGFnZSBvZiBpbWFnZSBzdXBwcmVzc2VkIChjb21wdXRlZCBmcm9tIHRoZSBzdGFuZGFyZCBkaW1lbnNpb24pLiovCi0jZGVmaW5lIE00RU5DT0RFUl9TVEFCX0ZJTFRFUl9DUk9QX1BFUkNFTlRBR0UgMTAKLSAgICAgICAgLyogV0FSTklORzogdGFrZSB0aGUgaW5mZXJpb3IgZXZlbiBkaW1lbnNpb24sIGV4OiAxMCUgZm9yIFFDSUYgb3V0cHV0ID0+IDE5MngxNTggKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfT3Blbk1vZGUKLSAqIEBicmllZiAgICBEZWZpbml0aW9uIG9mIG9wZW4gbW9kZSBmb3IgdGhlIGVuY29kZXIuCi0gKiBAbm90ZSAgICBERUZBVUxUICA6IHBvaW50ZXIgdG8gTTRFTkNPREVSX29wZW4oKSB3aGljaCB1c2UgZGVmYXVsdCBwYXJhbWV0ZXJzCi0gKiAgICAgICAgICBBRFZBTkNFRCA6IHBvaW50ZXIgdG8gTTRFTkNPREVSX29wZW5fYWR2YW5jZWQoKSB3aGljaCBhbGxvdyB0byBjdXN0b21pemUKLSAqICAgICAgICAgICAgICAgICAgICAgdmFyaW91cyBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX09QRU5fREVGQVVMVCwKLSAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRAotfSBNNEVOQ09ERVJfT3Blbk1vZGU7Ci0KLSAvKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9GcmFtZVJhdGUKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgZW5jb2RlZCB2aWRlbyBmcmFtZXJhdGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rNV9GUFMsCi0gICAgTTRFTkNPREVSX2s3XzVfRlBTLAotICAgIE00RU5DT0RFUl9rMTBfRlBTLAotICAgIE00RU5DT0RFUl9rMTJfNV9GUFMsCi0gICAgTTRFTkNPREVSX2sxNV9GUFMsCi0gICAgTTRFTkNPREVSX2syMF9GUFMsCi0gICAgTTRFTkNPREVSX2syNV9GUFMsCi0gICAgTTRFTkNPREVSX2szMF9GUFMsCi0gICAgTTRFTkNPREVSX2tWQVJJQUJMRV9GUFMsICAgICAgICAgICAgLyoqPCBWYXJpYWJsZSB2aWRlbyBiaXRyYXRlICovCi0gICAgTTRFTkNPREVSX2tVU0VfVElNRVNDQUxFICAgICAgICAgICAgLyoqPCBBZHZhbmNlZCBlbmNvZGluZywgdXNlIHRpbWVzY2FsZSBpbmRpY2F0aW9uIHJhdGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBmcmFtZXJhdGUgKi8KLX0gTTRFTkNPREVSX0ZyYW1lUmF0ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfSW5wdXRGb3JtYXQKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgdmlkZW8gZm9ybWF0IG9mIHRoZSBncmFiYmluZy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa0lZVVY0MjA9MCwgLyoqPCBZVVYgNDoyOjAgcGxhbmFyIChzdGFuZGFyZCBpbnB1dCBmb3IgbXBlZy00IHZpZGVvKSAqLwotICAgIE00RU5DT0RFUl9rSVlVVjQyMiwgICAvKio8IFlVVjQyMiBwbGFuYXIgKi8KLSAgICBNNEVOQ09ERVJfa0lZVVlWLCAgICAgLyoqPCBZVVY0MjIgaW50ZXJsYWNlZCwgbHVtYSBmaXJzdCAqLwotICAgIE00RU5DT0RFUl9rSVVZVlksICAgICAvKio8IFlVVjQyMiBpbnRlcmxhY2VkLCBjaHJvbWEgZmlyc3QgKi8KLSAgICBNNEVOQ09ERVJfa0lKUEVHLCAgICAgLyoqPCBKUEVHIGNvbXByZXNzZWQgZnJhbWVzICovCi0gICAgTTRFTkNPREVSX2tJUkdCNDQ0LCAgIC8qKjwgUkdCIDEyIGJpdHMgNDo0OjQgKi8KLSAgICBNNEVOQ09ERVJfa0lSR0I1NTUsICAgLyoqPCBSR0IgMTUgYml0cyA1OjU6NSAqLwotICAgIE00RU5DT0RFUl9rSVJHQjU2NSwgICAvKio8IFJHQiAxNiBiaXRzIDU6Njo1ICovCi0gICAgTTRFTkNPREVSX2tJUkdCMjQsICAgIC8qKjwgUkdCIDI0IGJpdHMgODo4OjggKi8KLSAgICBNNEVOQ09ERVJfa0lSR0IzMiwgICAgLyoqPCBSR0IgMzIgYml0cyAgKi8KLSAgICBNNEVOQ09ERVJfa0lCR1I0NDQsICAgLyoqPCBCR1IgMTIgYml0cyA0OjQ6NCAqLwotICAgIE00RU5DT0RFUl9rSUJHUjU1NSwgICAvKio8IEJHUiAxNSBiaXRzIDU6NTo1ICovCi0gICAgTTRFTkNPREVSX2tJQkdSNTY1LCAgIC8qKjwgQkdSIDE2IGJpdHMgNTo2OjUgKi8KLSAgICBNNEVOQ09ERVJfa0lCR1IyNCwgICAgLyoqPCBCR1IgMjQgYml0cyA4Ojg6OCAqLwotICAgIE00RU5DT0RFUl9rSUJHUjMyICAgICAvKio8IEJHUiAzMiBiaXRzICAqLwotfSBNNEVOQ09ERVJfSW5wdXRGb3JtYXQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0Zvcm1hdAotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSB2aWRlbyBjb21wcmVzc2lvbiBmb3JtYXRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rTVBFRzQgPSAwLAotICAgIE00RU5DT0RFUl9rSDI2MywKLSAgICBNNEVOQ09ERVJfa0gyNjQsCi0gICAgTTRFTkNPREVSX2tKUEVHLAotICAgIE00RU5DT0RFUl9rTUpQRUcsCi0gICAgTTRFTkNPREVSX2tOVUxMLAotICAgIE00RU5DT0RFUl9rWVVWNDIwLCAgICAgICAgICAgIC8qKjwgTm8gY29tcHJlc3Npb24gKi8KLSAgICBNNEVOQ09ERVJfa1lVVjQyMiwgICAgICAgICAgICAvKio8IE5vIGNvbXByZXNzaW9uICovCi0KLSAgICBNNEVOQ09ERVJfa1ZpZGVvX05CIC8qIG51bWJlciBvZiBkZWNvZGVycywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnkgKi8KLX0gTTRFTkNPREVSX0Zvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aAotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgZnJhbWUgV2lkdGguCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX1NRQ0lGX1dpZHRoID0gMTI4LCAvKio8IFNRQ0lGIDEyOHg5NiAqLwotICAgIE00RU5DT0RFUl9RUVZHQV9XaWR0aCA9IDE2MCwgLyoqPCBRUVZHQSAxNjB4MTIwICovCi0gICAgTTRFTkNPREVSX1FDSUZfV2lkdGggID0gMTc2LCAvKio8IFFDSUYgMTc2eDE0NCAqLwotICAgIE00RU5DT0RFUl9RVkdBX1dpZHRoICA9IDMyMCwgLyoqPCBRVkdBIDMyMHgyNDAgKi8KLSAgICBNNEVOQ09ERVJfQ0lGX1dpZHRoICAgPSAzNTIsIC8qKjwgQ0lGIDM1MngyODggKi8KLSAgICBNNEVOQ09ERVJfVkdBX1dpZHRoICAgPSA2NDAsIC8qKjwgVkdBIDY0MHg0ODAgKi8KLSAgICBNNEVOQ09ERVJfU1ZHQV9XaWR0aCAgPSA4MDAsIC8qKjwgU1ZHQSA4MDB4NjAwICovCi0gICAgTTRFTkNPREVSX1hHQV9XaWR0aCAgID0gMTAyNCwgLyoqPCBYR0EgMTAyNHg3NjggKi8KLSAgICBNNEVOQ09ERVJfWFZHQV9XaWR0aCAgPSAxMjgwLCAvKio8IFhWR0EgMTI4MHgxMDI0ICovCi0vKiArUFIgTFY1ODA3ICovCi0gICAgTTRFTkNPREVSX1dWR0FfV2lkdGggID0gODAwLCAvKio8IFdWR0EgODAwIHggNDgwICovCi0gICAgTTRFTkNPREVSX05UU0NfV2lkdGggID0gNzIwLCAvKio8IE5UU0MgNzIwIHggNDgwICovCi0vKiAtUFIgTFY1ODA3ICovCi0KLS8qICtDUiBHb29nbGUgKi8KLSAgICBNNEVOQ09ERVJfNjQwXzM2MF9XaWR0aCAgID0gNjQwLCAgLyoqPCA2NDB4MzYwICovCi0gICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgIE00RU5DT0RFUl84NTRfNDgwX1dpZHRoICAgPSA4NDgsICAvKio8IDg0OHg0ODAgKi8KLSAgICBNNEVOQ09ERVJfMTI4MF83MjBfV2lkdGggID0gMTI4MCwgLyoqPCA3MjBwIDEyODB4NzIwICovCi0gICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgIE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aCAgPSAxMDg4LCAvKio8IDcyMHAgMTA4OHg3MjAgKi8KLSAgICBNNEVOQ09ERVJfOTYwXzcyMF9XaWR0aCAgID0gOTYwLCAgLyoqPCA3MjBwIDk2MHg3MjAgKi8KLSAgICBNNEVOQ09ERVJfMTkyMF8xMDgwX1dpZHRoID0gMTkyMCAgLyoqPCAxMDgwcCAxOTIweDEwODAgKi8KLS8qIC1DUiBHb29nbGUgKi8KLQotfSBNNEVOQ09ERVJfRnJhbWVXaWR0aDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfRnJhbWVIZWlnaHQKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgYXZhbGFpYmxlIGZyYW1lIEhlaWdodC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfU1FDSUZfSGVpZ2h0ID0gOTYsICAvKio8IFNRQ0lGIDEyOHg5NiAqLwotICAgIE00RU5DT0RFUl9RUVZHQV9IZWlnaHQgPSAxMjAsIC8qKjwgUVFWR0EgMTYweDEyMCAqLwotICAgIE00RU5DT0RFUl9RQ0lGX0hlaWdodCAgPSAxNDQsIC8qKjwgUUNJRiAxNzZ4MTQ0ICovCi0gICAgTTRFTkNPREVSX1FWR0FfSGVpZ2h0ICA9IDI0MCwgLyoqPCBRVkdBIDMyMHgyNDAgKi8KLSAgICBNNEVOQ09ERVJfQ0lGX0hlaWdodCAgID0gMjg4LCAvKio8IENJRiAzNTJ4Mjg4ICovCi0gICAgTTRFTkNPREVSX1ZHQV9IZWlnaHQgICA9IDQ4MCwgLyoqPCBWR0EgMzQweDQ4MCAqLwotICAgIE00RU5DT0RFUl9TVkdBX0hlaWdodCAgPSA2MDAsIC8qKjwgU1ZHQSA4MDB4NjAwICovCi0gICAgTTRFTkNPREVSX1hHQV9IZWlnaHQgICA9IDc2OCwgLyoqPCBYR0EgMTAyNHg3NjggKi8KLSAgICBNNEVOQ09ERVJfWFZHQV9IZWlnaHQgID0gMTAyNCwgLyoqPCBYVkdBIDEyODB4MTAyNCAqLwotLyogK1BSIExWNTgwNyAqLwotICAgIE00RU5DT0RFUl9XVkdBX0hlaWdodCAgPSA0ODAsIC8qKjwgV1ZHQSA4MDAgeCA0ODAgKi8KLSAgICBNNEVOQ09ERVJfTlRTQ19IZWlnaHQgID0gNDgwLCAvKio8IE5UU0MgNzIwIHggNDgwICovCi0vKiAtUFIgTFY1ODA3ICovCi0KLS8qICtDUiBHb29nbGUgKi8KLSAgICBNNEVOQ09ERVJfNjQwXzM2MF9IZWlnaHQgID0gMzYwLCAvKio8IDY0MHgzNjAgKi8KLSAgICBNNEVOQ09ERVJfODU0XzQ4MF9IZWlnaHQgID0gNDgwLCAvKio8IDg1NHg0ODAgKi8KLSAgICBNNEVOQ09ERVJfMTI4MF83MjBfSGVpZ2h0ID0gNzIwLCAvKio8IDcyMHAgMTI4MHg3MjAgKi8KLSAgICBNNEVOQ09ERVJfMTA4MF83MjBfSGVpZ2h0ID0gNzIwLCAvKio8IDcyMHAgMTA4MHg3MjAgKi8KLSAgICBNNEVOQ09ERVJfOTYwXzcyMF9IZWlnaHQgID0gNzIwLCAvKio8IDcyMHAgOTYweDcyMCAqLwotICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICBNNEVOQ09ERVJfMTkyMF8xMDgwX0hlaWdodCA9IDEwODggLyoqPCAxMDgwcCAxOTIweDEwODAgKi8KLS8qIC1DUiBHb29nbGUgKi8KLX0gTTRFTkNPREVSX0ZyYW1lSGVpZ2h0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9CaXRyYXRlCi0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBiaXRyYXRlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfazI4X0tCUFMgID0gMjgwMDAsCi0gICAgTTRFTkNPREVSX2s0MF9LQlBTICA9IDQwMDAwLAotICAgIE00RU5DT0RFUl9rNjRfS0JQUyAgPSA2NDAwMCwKLSAgICBNNEVOQ09ERVJfazk2X0tCUFMgID0gOTYwMDAsCi0gICAgTTRFTkNPREVSX2sxMjhfS0JQUyA9IDEyODAwMCwKLSAgICBNNEVOQ09ERVJfazE5Ml9LQlBTID0gMTkyMDAwLAotICAgIE00RU5DT0RFUl9rMjU2X0tCUFMgPSAyNTYwMDAsCi0gICAgTTRFTkNPREVSX2szODRfS0JQUyA9IDM4NDAwMCwKLSAgICBNNEVOQ09ERVJfazUxMl9LQlBTID0gNTEyMDAwLAotICAgIE00RU5DT0RFUl9rODAwX0tCUFMgPSA4MDAwMDAKLQotfSBNNEVOQ09ERVJfQml0cmF0ZTsKLQotLyogSU1BR0UgU1RBQiAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNEVOQ09ERVJfU3RhYk1vZGUKLSAqIEBicmllZiAgICAgICAgVGhlIGN1cnJlbnQgbW9kZSBvZiB0aGUgc3RhYmlsaXphdGlvbiBmaWx0ZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tTdGFiT2ZmID0gMCwgICAgICAgIC8qKjwgc3RhYmlsaXphdGlvbiBmaWx0ZXIgaXMgZGlzYWJsZWQgKi8KLSAgICBNNEVOQ09ERVJfa1N0YWJDZW50ZXJlZCwgICAgLyoqPCBzdGFiaWxpemF0aW9uIGZpbHRlciBpcyBlbmFibGVkLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZpZGVvIGlucHV0IGFuZCBvdXRwdXQgbXVzdCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbnMuIE91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lsbCBoYXZlIGJsYWNrIGJvcmRlcnMgKi8KLSAgICBNNEVOQ09ERVJfa1N0YWJHcmFiTW9yZSAgICAgICAgLyoqPCBzdGFiaWxpemF0aW9uIGZpbHRlciBpcyBlbmFibGVkLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZpZGVvIGlucHV0IGRpbWVuc2lvbnMgbXVzdCBiZSBiaWdnZXIgdGhhbiBvdXRwdXQuIFRoZSByYXRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluZGljYXRlZCBieSBNNEVOQ09ERVJfU1RBQl9GSUxURVJfQ1JPUF9QRVJDRU5UQUdFICovCi0KLX0gTTRFTkNPREVSX1N0YWJNb2RlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNEVOQ09ERVJfRnJhbWVNb2RlCi0gKiBAYnJpZWYgICAgICAgIFZhbHVlcyB0byBkcml2ZSB0aGUgZW5jb2RlciBiZWhhdmlvdXIgKHR5cGUgb2YgZnJhbWVzIHByb2R1Y2VkKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rTm9ybWFsRnJhbWUgPSAwLCAgIC8qKjwgbGV0IHRoZSBlbmNvZGVyIGRlY2lkZSB3aGljaCB0eXBlIG9mIGZyYW1lIHRvIGVuY29kZSAqLwotICAgIE00RU5DT0RFUl9rTGFzdEZyYW1lICAgPSAxLCAgIC8qKjwgZm9yY2UgZW5jb2RlciB0aGUgZmx1c2ggYWxsIGl0cyBidWZmZXJzIGJlY2F1c2UgaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBmcmFtZSAgKi8KLSAgICBNNEVOQ09ERVJfa0lGcmFtZSAgICAgID0gMiAgICAvKio8IGZvcmNlIGVuY29kZXIgdG8gZ2VuZXJhdGUgYW4gSSBmcmFtZSAqLwotCi19IE00RU5DT0RFUl9GcmFtZU1vZGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9QYXJhbXMKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFsbCB0aGUgc2V0dGluZ3MgYXZhbGFpYmxlIHdoZW4gZW5jb2RpbmcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBJbnB1dCAqLwotICAgIE00RU5DT0RFUl9JbnB1dEZvcm1hdCAgICBJbnB1dEZvcm1hdDsgICAgICAgIC8qKjwgSW5wdXQgdmlkZW8gZm9ybWF0IChncmFiYmluZykgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBJbnB1dEZyYW1lV2lkdGg7ICAgIC8qKjwgSW5wdXQgRnJhbWUgd2lkdGggKGdyYWJiaW5nKSAqLwotICAgIE00RU5DT0RFUl9GcmFtZUhlaWdodCAgICBJbnB1dEZyYW1lSGVpZ2h0OyAgICAvKio8IElucHV0IEZyYW1lIGhlaWdodCAoZ3JhYmJpbmcpICovCi0KLSAgICAvKiBPdXRwdXQgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBGcmFtZVdpZHRoOyAgICAgICAgICAgIC8qKjwgRnJhbWUgd2lkdGggICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgIEZyYW1lSGVpZ2h0OyAgICAgICAgLyoqPCBGcmFtZSBoZWlnaHQgICovCi0gICAgTTRFTkNPREVSX0JpdHJhdGUgICAgICAgIEJpdHJhdGU7ICAgICAgICAgICAgLyoqPCBCaXRyYXRlLCBzZWUgZW51bSAgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVSYXRlICAgICAgICBGcmFtZVJhdGU7ICAgICAgICAgICAgLyoqPCBGcmFtZXJhdGUsIHNlZSBlbnVtICAqLwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIEZvcm1hdDsgICAgICAgICAgICAgICAgLyoqPCBWaWRlbyBjb21wcmVzc2lvbiBmb3JtYXQsIEgyNjMsIE1QRUc0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUpQRUcgLi4uICAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgdmlkZW9Qcm9maWxlOyAvKiogdmlkZW8gcHJvZmlsZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgdmlkZW9MZXZlbDsgICAvKiogdmlkZW8gbGV2ZWwgKi8KLX0gTTRFTkNPREVSX1BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYWR2YW5jZWQgc2V0dGluZ3MgYXZhaWxhYmxlIGZvciBNUEVHLTQgZW5jb2RpbmcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiBJbnB1dCBwYXJhbWV0ZXJzIChncmFiYmVyIGNvdXBsZWQgd2l0aCBlbmNvZGVyKTogKi8KLSAgICBNNEVOQ09ERVJfSW5wdXRGb3JtYXQgICAgSW5wdXRGb3JtYXQ7ICAgICAgICAgICAgICAgIC8qKjwgSW5wdXQgdmlkZW8gZm9ybWF0ICovCi0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgSW5wdXRGcmFtZVdpZHRoOyAgICAgICAgICAgIC8qKjwgSW5wdXQgRnJhbWUgd2lkdGggKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVIZWlnaHQgICAgSW5wdXRGcmFtZUhlaWdodDsgICAgICAgICAgICAvKio8IElucHV0IEZyYW1lIGhlaWdodCAqLwotCi0gICAgLyoqCi0gICAgICogQ29tbW9uIHNldHRpbmdzIGZvciBIMjYzIGFuZCBNUEVHLTQ6ICovCi0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgRnJhbWVXaWR0aDsgICAgICAgICAgICAgICAgICAgIC8qKjwgRnJhbWUgd2lkdGggICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgIEZyYW1lSGVpZ2h0OyAgICAgICAgICAgICAgICAvKio8IEZyYW1lIGhlaWdodCAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBCaXRyYXRlOyAgICAgICAgICAgICAgICAgICAgLyoqPCBGcmVlIHZhbHVlIGZvciB0aGUgYml0cmF0ZSAqLwotICAgIC8qKjwgRnJhbWVyYXRlIChpZiBzZXQgdG8gTTRFTkNPREVSX2tVU0VfVElNRVNDQUxFIHVzZSB1aVJhdGVGYWN0b3IgJiB1aVRpbWVTY2FsZSBpbnN0ZWFkKSAqLwotICAgIE00RU5DT0RFUl9GcmFtZVJhdGUgICAgICAgIEZyYW1lUmF0ZTsKLSAgICAvKio8IFZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdDogSDI2MyBvciBNUEVHNCAqLwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIEZvcm1hdDsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgIHZpZGVvUHJvZmlsZTsgLyoqIG91dHB1dCB2aWRlbyBwcm9maWxlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICB2aWRlb0xldmVsOyAgIC8qKiBvdXRwdXQgdmlkZW8gbGV2ZWwgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aUhvcml6b250YWxTZWFyY2hSYW5nZTsgLyoqPCBTZXQgdG8gMCB3aWxsIHVzZSBkZWZhdWx0IHZhbHVlICgxNSkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aVZlcnRpY2FsU2VhcmNoUmFuZ2U7ICAgLyoqPCBTZXQgdG8gMCB3aWxsIHVzZSBkZWZhdWx0IHZhbHVlICgxNSkgKi8KLSAgICAvKio8IFNldCB0byAwIHdpbGwgdXNlIGRlZmF1bHQgdmFsdWUgKDB4N0ZGRiBpLmUuIGxldCBlbmdpbmUgZGVjaWRlIHdoZW4gdG8gcHV0IGFuIEkpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlTdGFydGluZ1F1YW50aXplclZhbHVlOwotICAgIC8qKjwgRW5hYmxlIGlmIHByaW9yaXR5IGlzIHF1YWxpdHksIERpc2FibGUgaWYgcHJpb3JpdHkgaXMgZnJhbWVyYXRlICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiSW50ZXJuYWxSZWd1bGF0aW9uOwotICAgIC8qKjwgUmF0aW8gYmV0d2VlbiB0aGUgZW5jb2RlciBmcmFtZSByYXRlIGFuZCB0aGUgYWN0dWFsIGZyYW1lIHJhdGUgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aVJhdGVGYWN0b3I7Ci0gICAgLyoqPCBJIGZyYW1lcyBwZXJpb2RpY2l0eSwgc2V0IHRvIDAgd2lsbCB1c2UgZGVmYXVsdCB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpSVZvcFBlcmlvZDsKLSAgICAvKio8IE1vdGlvbiBlc3RpbWF0aW9uIFtkZWZhdWx0PTAgKGFsbCB0b29scyksIGRpc2FibGU9OCAobm8gdG9vbCldICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgdWlNb3Rpb25Fc3RpbWF0aW9uVG9vbHM7Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0aW5ncyBmb3IgTVBFRy00IG9ubHk6ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlUaW1lU2NhbGU7ICAgICAgICAgICAgICAgIC8qKjwgRnJlZSB2YWx1ZSBmb3IgdGhlIHRpbWVzY2FsZSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYkVycm9yUmVzaWxpZW5jZTsgICAgICAgICAgIC8qKjwgRGlzYWJsZWQgYnkgZGVmYXVsdCAqLwotICAgIC8qKjwgRGlzYWJsZWQgYnkgZGVmYXVsdCAoaWYgZW5hYmxlZCwgYkVycm9yUmVzaWxpZW5jZSBzaG91bGQgYmUgZW5hYmxlZCB0b28hKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYkRhdGFQYXJ0aXRpb25pbmc7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYkFjUHJlZGljdGlvbjsgICAgICAgICAgIC8qKjwgQUMgcHJlZGljdGlvbiBbZGVmYXVsdD0xLCBkaXNhYmxlPTBdICovCi0KLX0gTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfU3RpbGxQaWN0dXJlUGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbGwgdGhlIHNldHRpbmdzIGF2YWxhaWJsZSB3aGVuIGVuY29kaW5nIHN0aWxsCi0gKiAgICAgICAgICAgIHBpY3R1cmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBGcmFtZVdpZHRoOyAgICAgICAgICAgIC8qKjwgRnJhbWUgd2lkdGggICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgIEZyYW1lSGVpZ2h0OyAgICAgICAgLyoqPCBGcmFtZSBoZWlnaHQgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgUXVhbGl0eTsgICAgICAgICAgICAvKio8IEJpdHJhdGUsIHNlZSBlbnVtICAqLwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIElucHV0Rm9ybWF0OyAgICAgICAgLyoqPCBZVVYgNDIwIG9yIDQyMiAgKi8KLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICBGb3JtYXQ7ICAgICAgICAgICAgICAgIC8qKjwgVmlkZW8gY29tcHJlc3Npb24gZm9ybWF0LCBIMjYzLCBNUEVHNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1KUEVHIC4uLiAgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIFByZVByb2Nlc3NOZWVkZWQ7ICAgIC8qKjwgSXMgdGhlIGNhbGwgdG8gdGhlIFZQUCBpcyBuZWNlc3NhcnkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIEVuY29kaW5nUGVyU3RyaXBlczsgICAgLyoqPCBJcyBlbmNvZGluZyBwZXIgc3RyaXBlcyAqLwotCi19IE00RU5DT0RFUl9TdGlsbFBpY3R1cmVQYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9IZWFkZXIKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBidWZmZXIgd2hlcmUgdGhlIHNlcXVlbmNlIGhlYWRlciBpcyBwdXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICBwQnVmOyAgICAgICAgLyoqPCBCdWZmZXIgZm9yIHRoZSBoZWFkZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgU2l6ZTsgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgZGF0YSAqLwotCi19IE00RU5DT0RFUl9IZWFkZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICBNNEVOQ09ERVJfT3B0aW9uSUQKLSAqIEBicmllZiBUaGlzIGVudW1zIGRlZmluZXMgYWxsIGF2YWxhaWJsZSBvcHRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qKjwgc2V0IHRoZSBmcmFnbWVudCBzaXplLCBvcHRpb24gdmFsdWUgaXMgTTRPU0FfVUludDMyIHR5cGUgKi8KLSAgICBNNEVOQ09ERVJfa09wdGlvbklEX1ZpZGVvRnJhZ21lbnRTaXplICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQ09NTU9OLCAweDAxKSwKLQotICAgIC8qKjwgc2V0IHRoZSBzdGFiaWxpemF0aW9uIGZpbHRlcmluZywgb3B0aW9uIHZhbHVlIGlzIE00RU5DT0RFUl9TdGFiTW9kZSB0eXBlICovCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9JbWFnZVN0YWJpbGl6YXRpb24gICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwMiksCi0KLSAgICAvKio8IHByZXZlbnQgd3JpdHRpbmcgb2YgYW55IEFVLCBvcHRpb24gdmFsdWUgaXMgTTRPU0FfQm9vbCB0eXBlICovCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9JbnN0YW50U3RvcCAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwMyksCi0KLSAgICAvKio8IGdldCB0aGUgRFNJIChlbmNvZGVyIGhlYWRlcikgZ2VuZXJhdGVkIGJ5IHRoZSBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9FbmNvZGVySGVhZGVyICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUQgLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQ09NTU9OLCAweDA0KSwKLS8qKyBDUiBMVjY3NzUgLUguMjY0IFRyaW1taW5nICAqLwotCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9TZXRIMjY0UHJvY2Vzc05BTFVmY3RzUHRyPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEICxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwNSksCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9IMjY0UHJvY2Vzc05BTFVDb250ZXh0ICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUQgLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQ09NTU9OLCAweDA2KQotLyotQ1IgTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAgKi8KLX0gTTRFTkNPREVSX09wdGlvbklEOwotCi0vKisgQ1IgTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAgKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVV9mY3QpKE00T1NBX1ZvaWQqYWluc3RhbmNlLE00T1NBX1VJbnQ4KiBpbmJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgIGluYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKm91dGJ1ZmYsIE00T1NBX0ludDMyICpvdXRidWZfc2l6ZSk7Ci0vLyotIENSIExWNjc3NSAtSC4yNjQgVHJpbW1pbmcgICovCi0KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRFTkNPREVSX0NvbnRleHQ7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfaW5pdCkgKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50ZXJmYWNlLAotICAgICAgICBNNFZQUF9hcHBseV9mY3QqIHBWUFBmY3QsCi0gICAgICAgIE00VlBQX0NvbnRleHQgcFZQUGN0eHQsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBFeHRlcm5hbEFQSSwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhCi0pOwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX29wZW4pICgKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSwKLSAgICAgICAgTTRPU0FfVm9pZCogcFBhcmFtcyAgICAgLyogQ2FuIGJlIE00RU5DT0RFUl9QYXJhbXMsIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcyBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX1N0aWxsUGljdHVyZVBhcmFtcyAqLwotKTsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9zdGFydCkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfc3RvcCkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfcGF1c2UpIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX3Jlc3VtZSkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfY2xvc2UpIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX2NsZWFudXApIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX3JlZ3VsQml0UmF0ZSkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9lbmNvZGUpICgKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW5QbGFuZSwKLSAgICAgICAgTTRPU0FfRG91YmxlIEN0cywKLSAgICAgICAgTTRFTkNPREVSX0ZyYW1lTW9kZSBGcmFtZU1vZGUKLSk7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfc2V0T3B0aW9uKSAgICAoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsCi0gICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUKLSk7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfZ2V0T3B0aW9uKSAgICAoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsCi0gICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUKLSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UKLSAqIEBicmllZiAgICBEZWZpbmVzIGFsbCB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBhbiBlbmNvZGVyIHNoZWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX000RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UKLXsKLSAgICBNNEVOQ09ERVJfaW5pdCogICAgICAgICAgICAgICAgcEZjdEluaXQ7Ci0gICAgTTRFTkNPREVSX29wZW4qICAgICAgICAgICAgICAgIHBGY3RPcGVuOwotCi0gICAgTTRFTkNPREVSX3N0YXJ0KiAgICAgICAgICAgIHBGY3RTdGFydDsgICAgICAgICAgLyogR3JhYmJlciBtb2RlICovCi0gICAgTTRFTkNPREVSX3N0b3AqICAgICAgICAgICAgICAgIHBGY3RTdG9wOyAgICAgICAgICAgLyogR3JhYmJlciBtb2RlICovCi0KLSAgICBNNEVOQ09ERVJfcGF1c2UqICAgICAgICAgICAgcEZjdFBhdXNlOyAgICAgICAgICAvKiBHcmFiYmVyIG1vZGUgKi8KLSAgICBNNEVOQ09ERVJfcmVzdW1lKiAgICAgICAgICAgIHBGY3RSZXN1bWU7ICAgICAgICAgLyogR3JhYmJlciBtb2RlICovCi0KLSAgICBNNEVOQ09ERVJfY2xvc2UqICAgICAgICAgICAgcEZjdENsb3NlOwotICAgIE00RU5DT0RFUl9jbGVhbnVwKiAgICAgICAgICAgIHBGY3RDbGVhbnVwOwotCi0gICAgTTRFTkNPREVSX3JlZ3VsQml0UmF0ZSogICAgIHBGY3RSZWd1bEJpdFJhdGU7Ci0gICAgTTRFTkNPREVSX2VuY29kZSogICAgICAgICAgICBwRmN0RW5jb2RlOyAgICAgICAgIC8qIFN0YW5kYWxvbmUgbW9kZSAqLwotCi0gICAgTTRFTkNPREVSX3NldE9wdGlvbiogICAgICAgIHBGY3RTZXRPcHRpb247Ci0gICAgTTRFTkNPREVSX2dldE9wdGlvbiogICAgICAgIHBGY3RHZXRPcHRpb247Ci19IE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2U7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNEVOQ09ERVJfQ09NTU9OX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000T1NBX0NvcmVJRC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRPU0FfQ29yZUlELmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0MDhmYzguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRPU0FfQ29yZUlELmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRPU0FfQ29yZUlELmgKLSAqIEBicmllZiAgZGVmaW5lcyB0aGUgdW5pcXVlcyBjb21wb25lbnQgaWRlbnRpZmllcnMgdXNlZCBmb3IgbWVtb3J5IG1hbmFnZW1lbnQKLSAqICAgICAgICAgYW5kIG9wdGlvbklEIG1lY2hhbmlzbQotICogQG5vdGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000T1NBX0NPUkVJRF9IX18KLSNkZWZpbmUgX19NNE9TQV9DT1JFSURfSF9fCi0KLS8qIENvcmVJZCBhcmUgZGVmaW5lZCBvbiAxNCBiaXRzICovCi0vKiB3ZSBzdGFydCBmcm9tIDB4MDEwMCwgbG93ZXIgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3Igb3NhbCBjb3JlIGNvbXBvbmVudHMgKi8KLQotLyogcmVhZGVyIHNoZWxscyovCi0jZGVmaW5lIE00UkVBREVSX0NPTU1PTiAgICAgMHgwMTAwCi0jZGVmaW5lIE00UkVBREVSX0FWSSAgICAgICAgMHgwMTAxCi0jZGVmaW5lIE00UkVBREVSX0FNUiAgICAgICAgMHgwMTAyCi0jZGVmaW5lIE00UkVBREVSXzNHUCAgICAgICAgMHgwMTAzCi0jZGVmaW5lIE00UkVBREVSX05FVCAgICAgICAgMHgwMTA0Ci0jZGVmaW5lIE00UkVBREVSXzNHUF9IVFRQICAgMHgwMTA1Ci0jZGVmaW5lIE00UkVBREVSX01QMyAgICAgICAgMHgwMTA2Ci0jZGVmaW5lIE00UkVBREVSX1dBViAgICAgICAgMHgwMTA3Ci0jZGVmaW5lIE00UkVBREVSX01JREkgICAgICAgMHgwMTA4Ci0jZGVmaW5lIE00UkVBREVSX0FTRiAgICAgICAgMHgwMTA5Ci0jZGVmaW5lIE00UkVBREVSX1JFQUwgICAgICAgIDB4MDEwQQotI2RlZmluZSBNNFJFQURFUl9BQUMgICAgICAgIDB4MDEwQgotI2RlZmluZSBNNFJFQURFUl9GTEVYICAgICAgICAweDAxMEMKLSNkZWZpbmUgTTRSRUFERVJfQkJBICAgICAgICAweDAxMEQKLSNkZWZpbmUgTTRSRUFERVJfU1lOVEhFU0lTX0FVRElPICAgIDB4MDEwRQotI2RlZmluZSBNNFJFQURFUl9KUEVHICAgICAgICAweDAxMEYKLQotCi0vKiB3cml0ZXIgc2hlbGxzKi8KLSNkZWZpbmUgTTRXUklURVJfQ09NTU9OICAgICAweDAxMTAKLSNkZWZpbmUgTTRXUklURVJfQVZJICAgICAgICAweDAxMTEKLSNkZWZpbmUgTTRXUklURVJfQU1SICAgICAgICAweDAxMTIKLSNkZWZpbmUgTTRXUklURVJfM0dQICAgICAgICAweDAxMTMKLSNkZWZpbmUgTTRXUklURVJfSlBFRyAgICAgICAgMHgwMTE2Ci0jZGVmaW5lIE00V1JJVEVSX01QMyAgICAgICAgMHgwMTE3Ci0KLS8qIGRlY29kZXIgc2hlbGxzICovCi0jZGVmaW5lIE00REVDT0RFUl9DT01NT04gICAgMHgwMTIwCi0jZGVmaW5lIE00REVDT0RFUl9KUEVHICAgICAgMHgwMTIxCi0jZGVmaW5lIE00REVDT0RFUl9NUEVHNCAgICAgMHgwMTIyCi0jZGVmaW5lIE00REVDT0RFUl9BVURJTyAgICAgMHgwMTIzCi0jZGVmaW5lIE00REVDT0RFUl9BVkMgICAgICAgMHgwMTI0Ci0jZGVmaW5lIE00REVDT0RFUl9NSURJICAgICAgMHgwMTI1Ci0jZGVmaW5lIE00REVDT0RFUl9XTUEgICAgICAgIDB4MDEyNgotI2RlZmluZSBNNERFQ09ERVJfV01WICAgICAgICAweDAxMjcKLSNkZWZpbmUgTTRERUNPREVSX1JNViAgICAgICAgMHgwMTI4Ci0jZGVmaW5lIE00REVDT0RFUl9STUEgICAgICAgIDB4MDEyOQotI2RlZmluZSBNNERFQ09ERVJfQUFDICAgICAgIDB4MDEyQQotI2RlZmluZSBNNERFQ09ERVJfQkVBVEJSRVcgIDB4MDEyQgotI2RlZmluZSBNNERFQ09ERVJfRVhURVJOQUwgIDB4MDEyQwotCi0vKiBlbmNvZGVyIHNoZWxscyAqLwotI2RlZmluZSBNNEVOQ09ERVJfQ09NTU9OICAgIDB4MDEzMAotI2RlZmluZSBNNEVOQ09ERVJfSlBFRyAgICAgIDB4MDEzMQotI2RlZmluZSBNNEVOQ09ERVJfTVBFRzQgICAgIDB4MDEzMgotI2RlZmluZSBNNEVOQ09ERVJfQVVESU8gICAgIDB4MDEzMwotI2RlZmluZSBNNEVOQ09ERVJfVklEX05VTEwgIDB4MDEzNAotI2RlZmluZSBNNEVOQ09ERVJfTUpQRUcgICAgICAgIDB4MDEzNQotI2RlZmluZSBNNEVOQ09ERVJfTVAzICAgICAgICAweDAxMzYKLSNkZWZpbmUgTTRFTkNPREVSX0gyNjQgICAgICAgIDB4MDEzNwotI2RlZmluZSBNNEVOQ09ERVJfQUFDICAgICAgICAweDAxMzgKLSNkZWZpbmUgTTRFTkNPREVSX0FNUk5CICAgICAgICAweDAxMzkKLSNkZWZpbmUgTTRFTkNPREVSX0FVRF9OVUxMICAweDAxM0EKLSNkZWZpbmUgTTRFTkNPREVSX0VYVEVSTkFMICAweDAxM0IKLQotLyogY29yZXMgKi8KLSNkZWZpbmUgTTRKUEdfREVDT0RFUiAgICAgICAweDAxNDAKLSNkZWZpbmUgTTRKUEdfRU5DT0RFUiAgICAgICAweDAxNDEKLQotI2RlZmluZSBNNE1QNF9ERUNPREVSICAgICAgIDB4MDE0MgotI2RlZmluZSBNNE1QNF9FTkNPREVSICAgICAgIDB4MDE0MwotCi0jZGVmaW5lIE00QVZJX0NPTU1PTiAgICAgICAgMHgwMTQ0Ci0jZGVmaW5lIE00QVZJX1JFQURFUiAgICAgICAgMHgwMTQ1Ci0jZGVmaW5lIE00QVZJX1dSSVRFUiAgICAgICAgMHgwMTQ2Ci0KLSNkZWZpbmUgTTRIVFRQX0VOR0lORSAgICAgICAweDAxNDcKLQotI2RlZmluZSBNNE9TQV9UTVBGSUxFICAgICAgIDB4MDE0OAotI2RlZmluZSBNNFRPT0xfVElNRVIgICAgICAgIDB4MDE0OQotCi0jZGVmaW5lIE00QU1SX1JFQURFUiAgICAgICAgMHgwMTRBCi0KLSNkZWZpbmUgTTRNUDNfUkVBREVSICAgICAgICAweDAxNEIKLQotI2RlZmluZSBNNFdBVl9SRUFERVIgICAgICAgIDB4MDE0QwotI2RlZmluZSBNNFdBVl9XUklURVIgICAgICAgIDB4MDE0RAotI2RlZmluZSBNNFdBVl9DT01NT04gICAgICAgIDB4MDE0RQotCi0jZGVmaW5lIE00QURUU19SRUFERVIgICAgICAgIDB4MDE0RgotI2RlZmluZSBNNEFESUZfUkVBREVSICAgICAgICAweDAxNkEKLQotI2RlZmluZSBNNFNQUyAgICAgICAgICAgICAgIDB4MDE1MAotI2RlZmluZSBNNEVYSUZfREVDT0RFUiAgICAgIDB4MDE1MQotI2RlZmluZSBNNEVYSUZfRU5DT0RFUiAgICAgIDB4MDE1MgotI2RlZmluZSBNNEdJRl9ERUNPREVSICAgICAgIDB4MDE1MwotI2RlZmluZSBNNEdJRl9FTkNPREVSICAgICAgIDB4MDE1NAotI2RlZmluZSBNNFBOR19ERUNPREVSICAgICAgIDB4MDE1NQotI2RlZmluZSBNNFBOR19FTkNPREVSICAgICAgIDB4MDE1NgotI2RlZmluZSBNNFdCTVBfREVDT0RFUiAgICAgIDB4MDE1NwotI2RlZmluZSBNNFdCTVBfRU5DT0RFUiAgICAgIDB4MDE1OAotCi0jZGVmaW5lIE00QU1SX1dSSVRFUiAgICAgICAgMHgwMTU5ICAgIC8qKjwgbm8gcm9vbSB0byBwdXQgaXQgYWxvbmcgTTRBTVJfUkVBREVSICovCi0KLQotI2RlZmluZSBNNEFWQ19ERUNPREVSICAgICAgIDB4MDE1QQotI2RlZmluZSBNNEFWQ19FTkNPREVSICAgICAgIDB4MDE1QgotCi0jZGVmaW5lIE00QVNGX1JFQURFUiAgICAgICAgMHgwMTVDCi0jZGVmaW5lIE00V01EUk1fQUdFTlQgICAgICAgIDB4MDE1RAotI2RlZmluZSBNNE1JRElfUkVBREVSICAgICAgICAweDAxNjIgICAgLyoqPCBubyByb29tIGJlZm9yZSB0aGUgcHJlc2VudGVycyAqLwotI2RlZmluZSBNNFJNX1JFQURFUiAgICAgICAgIDB4MTYzCi0jZGVmaW5lIE00Uk1WX0RFQ09ERVIgICAgICAgIDB4MTY0Ci0jZGVmaW5lIE00Uk1BX0RFQ09ERVIgICAgICAgIDB4MTY1Ci0KLSNkZWZpbmUgTTRUT09MX1hNTCAgICAgICAgICAgIDB4MDE2NgotI2RlZmluZSBNNFRPT0xfRUZSICAgICAgICAgICAgMHgwMTY3ICAgIC8qKjwgRGVjcnlwdGlvbiBtb2R1bGUgZm9yIFZpZGVvIEFydGlzdCAqLwotI2RlZmluZSBNNElBTF9GVE4gICAgICAgICAgICAweDAxNjggICAgLyogRlROIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJQUwgKi8KLSNkZWZpbmUgTTRGVE4gICAgICAgICAgICAgICAgMHgwMTY5ICAgIC8qIEZUTiBsaWJyYXJ5ICovCi0KLS8qIHByZXNlbnRlciAqLwotI2RlZmluZSBNNFBSRVNFTlRFUl9BVURJTyAgIDB4MDE2MAotI2RlZmluZSBNNFBSRVNFTlRFUl9WSURFTyAgIDB4MDE2MQotCi0vKiBoaWdoIGxldmVsIGludGVyZmFjZXMgKHZwcywgZXRjLi4pKi8KLSNkZWZpbmUgTTRWUFMgICAgICAgICAgICAgICAweDAxNzAKLSNkZWZpbmUgTTRWVFMgICAgICAgICAgICAgICAweDAxNzEKLSNkZWZpbmUgTTRWWFMgICAgICAgICAgICAgICAweDAxNzIKLSNkZWZpbmUgTTRDQUxMQkFDSyAgICAgICAgICAweDAxNzMKLSNkZWZpbmUgTTRWRVMgICAgICAgICAgICAgICAweDAxNzQKLSNkZWZpbmUgTTRQUkVQUk9DRVNTX1ZJREVPICAweDAxNzUKLSNkZWZpbmUgTTRHUkFCX0FVRElPICAgICAgICAweDAxNzYKLSNkZWZpbmUgTTRHUkFCX1ZJREVPICAgICAgICAweDAxNzcKLSNkZWZpbmUgTTRWU1NBVkkgICAgICAgICAgICAweDAxNzgKLSNkZWZpbmUgTTRWU1MzR1BQICAgICAgICAgICAweDAxNzkKLSNkZWZpbmUgTTRQVE8zR1BQICAgICAgICAgICAweDAxN0EKLSNkZWZpbmUgTTRQVlhfUEFSU0VSICAgICAgICAweDAxN0IKLSNkZWZpbmUgTTRWQ1MgICAgICAgICAgICAgICAgMHgwMTdDCi0jZGVmaW5lIE00TUNTICAgICAgICAgICAgICAgIDB4MDE3RAotI2RlZmluZSBNNE1OTUMgICAgICAgICAgICAgICAgMHgwMTgwICAgIC8qKjwgbW5tIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgTTRUVEVYVF9QQVJTRVIgICAgICAweDAxODEgICAgLyoqPCB0aW1lZCB0ZXh0ICovCi0jZGVmaW5lIE00TU0gICAgICAgICAgICAgICAgMHgwMTgyICAgIC8qKjwgTXVzaWMgbWFuYWdlciAqLwotI2RlZmluZSBNNE1EUCAgICAgICAgICAgICAgICAweDAxODMgICAgLyoqPCBNZXRhZGF0YSBwYXJzZXIgKi8KLSNkZWZpbmUgTTRNTVNRTENPUkUgICAgICAgICAgICAweDAxODQKLSNkZWZpbmUgTTRWUFNJTCAgICAgICAgICAgICAgICAweDAxODUKLSNkZWZpbmUgTTRGSUxFSUwgICAgICAgICAgICAweDAxODYgLyogSUwgZmlsZSBJbnRlcmZhY2UgKi8KLSNkZWZpbmUgTTRNVSAgICAgICAgICAgICAgICAweDAxODcKLSNkZWZpbmUgTTRWRUUgICAgICAgICAgICAgICAgMHgwMTg4ICAvKio8IFZpZGVvIGVmZmVjdCBlbmdpbmUgKi8KLSNkZWZpbmUgTTRWQSAgICAgICAgICAgICAgICAweDAxODkgLyogVmlkZW9BcnRpc3QgKi8KLSNkZWZpbmUgTTRKVFMgICAgICAgICAgICAgICAgMHgwMThBCi0jZGVmaW5lIE00SlRTSUwgICAgICAgICAgICAgICAgMHgwMThCCi0jZGVmaW5lIE00QUlSICAgICAgICAgICAgICAgIDB4MDE4QyAgLyoqPCBBSVIgKi8KLSNkZWZpbmUgTTRTUEUgICAgICAgICAgICAgICAgMHgwMThEICAvKio8IFN0aWxsIHBpY3R1cmUgZWRpdG9yICovCi0jZGVmaW5lIE00VlMgICAgICAgICAgICAgICAgMHgwMThFICAgIC8qKjwgVmlkZW8gU3R1ZGlvICh4VlNTKSAqLwotI2RlZmluZSBNNFZFU0lMICAgICAgICAgICAgICAgIDB4MDE4RiAgICAvKio8IFZFUyBpbCAqLwotI2RlZmluZSBNNElEMyAgICAgICAgICAgICAgICAweDAxOTAgICAgLyoqPCBJRDMgVGFnIE1vZHVsZSAqLwotI2RlZmluZSBNNFNDICAgICAgICAgICAgICAgIDB4MDE5MSAgICAvKio8IE1lZGlhIFNjYW5uZXIgKi8KLSNkZWZpbmUgTTRURyAgICAgICAgICAgICAgICAweDAxOTIgIC8qKjwgVGh1bWJuYWlsIEdlbmVyYXRvciovCi0jZGVmaW5lIE00VFMgICAgICAgICAgICAgICAgMHgwMTkzICAgIC8qKjwgVGh1bWJuYWlsIHN0b3JhZ2UgKi8KLSNkZWZpbmUgTTRNQiAgICAgICAgICAgICAgICAweDAxOTQgICAgLyoqPCBNZWRpYSBicm93c2VyICovCi0KLS8qIGhpZ2ggbGV2ZWwgYXBwbGljYXRpb24gKHRlc3Qgb3IgY2xpZW50IGFwcCkgKi8KLSNkZWZpbmUgTTRBUFBMSSAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgTTRWQV9BUFBMSSAgICAgICAgICAgIDB4MDIwMSAgICAvKio8IFZpZGVvIEFydGlzdCB0ZXN0IGFwcGxpY2F0aW9uICovCi0KLS8qIGV4dGVybmFsIGNvbXBvbmVudHMgKEhXIHZpZGVvIGNvZGVjcywgZXRjLikgKi8KLSNkZWZpbmUgTTRWRF9FWFRFUk5BTCAgICAgICAgMHgwMzAwCi0jZGVmaW5lIE00VkVfRVhURVJOQUwgICAgICAgIDB4MDMwMQotCi0KLS8qIHByaW9yaXR5IHRvIGNvbWJpbmUgd2l0aCBtb2R1bGUgaWRzICovCi0jZGVmaW5lIE00SElHSF9QUklPUklUWSAgICAgMHhDMDAwCi0jZGVmaW5lIE00TUVESVVNX1BSSU9SSVRZICAgMHg4MDAwCi0jZGVmaW5lIE00TE9XX1BSSU9SSVRZICAgICAgMHg0MDAwCi0jZGVmaW5lIE00REVGQVVMVF9QUklPUklUWSAgMHgwMDAwCi0KLQotI2VuZGlmIC8qX19NNE9TQV9DT1JFSURfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRQQ01SX0NvcmVSZWFkZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UENNUl9Db3JlUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhZmM1MGMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRQQ01SX0NvcmVSZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRXQVZfV2F2UmVhZGVyLmgKLSAqIEBicmllZiAgIFdBViBSZWFkZXIgZGVjbGFyYXRpb25zCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgb2YgdGhlIFdBViByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFNZU19BY2Nlc3NVbml0LmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLQotI2RlZmluZSBNNFBDTUNfRVJSX1BDTV9OT1RfQ09NUExJQU5UICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFdBVl9DT01NT04sMHgwMDAwMDEpCi0jZGVmaW5lIE00UENNQ19FUlJfUENNX05PX1NQQUNFX0FWQUlMICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00V0FWX0NPTU1PTiwweDAwMDAwMikKLSNkZWZpbmUgTTRQQ01DX0VSUl9QQ01fTk9UX1NVUFBPUlRFRCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRXQVZfQ09NTU9OLDB4MDAwMDAzKQotCi0jZGVmaW5lIE00UENNQ19XQVJfRU5EX09GX1NUUkVBTSAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00V0FWX0NPTU1PTiAsMHgwMDAwMDEpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00V0FWQ19EZWNvZGVyU3BlY2lmaWNJbmZvCi0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZGVjb2RlciBTcGVjaWZpYyBpbmZvcm1hdGlvbnMKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBXQVYgcmVhZGVyIHRvIHN0b3JlIGFsbAotICogICAgICAgICAgICAgIGRlY29kZXIgc3BlY2lmaWMgaW5mb3JtYXRpb25zOgotICogICAgICAgICAgICAgIC0gU2FtcGxlIEZyZXF1ZW5jeQotICogICAgICAgICAgICAgIC0gQXZlcmFnZSBCeXRlcyBwZXIgc2Vjb25kCi0gKiAgICAgICAgICAgICAgLSBOdW1iZXIgb2YgY2hhbm5lbHMgKDEgb3IgMikKLSAqICAgICAgICAgICAgICAtIE51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgKDggb3IgMTYpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1VJbnQzMiAgICBTYW1wbGVGcmVxdWVuY3k7Ci0gICAgTTRPU0FfVUludDMyICAgIEF2Z0J5dGVzUGVyU2VjOwotICAgIE00T1NBX1VJbnQzMiAgICBEYXRhTGVuZ3RoOwotICAgIE00T1NBX1VJbnQxNiAgICBuYkNoYW5uZWxzOwotICAgIE00T1NBX1VJbnQxNiAgICBCaXRzUGVyU2FtcGxlOwotfSBNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbzsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFdBVlJfU3RhdGUKLSAqIEBicmllZiAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBXQVYgUmVhZGVyIFN0YXRlcwotICogQG5vdGUgICAgVGhlIHN0YXRlIGF1dG9tYXRvbiBpcyBkb2N1bWVudGVkIHNlcGFyYXRlbHkKLSAqICAgICAgICAgIGNvbnN1bHQgdGhlIGRlc2lnbiBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFBDTVJfa0luaXQgICAgPSAweDAwMDAsCi0gICAgTTRQQ01SX2tPcGVuaW5nID0gMHgwMTAwLAotICAgIE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQgPSAweDAxMDEsCi0gICAgTTRQQ01SX2tSZWFkaW5nID0gMHgwMjAwLAotICAgIE00UENNUl9rUmVhZGluZ19uZXh0QVUgID0gMHgwMjAxLAotICAgIE00UENNUl9rQ2xvc2VkICA9IDB4MDMwMAotfSBNNFBDTVJfU3RhdGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRXQVZSX09wdGlvbklECi0gKiBAYnJpZWYgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgV0FWIFJlYWRlciBvcHRpb25zCi0gKiBAbm90ZSAgICBPbmx5IG9uZSBvcHRpb24gaXMgYXZhaWxhYmxlOgotICogICAgICAgICAgLSBNNFdBVlJfa1BDTWJsb2NrU2l6ZTogc2V0cyB0aGUgc2l6ZSBvZiB0aGUgUENNIGJsb2NrIHRvIHJlYWQKLSAqICAgICAgICAgICAgZnJvbSBXQVYgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRQQ01SX2tQQ01ibG9ja1NpemUgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00V0FWX1JFQURFUiwgMHgwMSkKLX0gTTRQQ01SX09wdGlvbklEOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFdBVlJfQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIFdBViBSZWFkZXIgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBXQVYgUmVhZGVyIGNhbGxzIHRvIHN0b3JlCi0gKiAgICAgICAgICAgICAgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfTWVtQWRkcjMyICAgICAgICAgICAgIG1fcERlY29kZXJTcGVjSW5mbzsvKio8IFBvaW50ZXIgdG8gdGhlIGRlY29kZXIgc3BlY2lmaWMgaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgY29udGFpbmVkIGluIHBTdHJlYW1EZXNjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbmx5IHVzZWQgdG8gZnJlZS4uLikgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgbV9wRmlsZVJlYWRGdW5jOy8qKjwgVGhlIE9TQUwgc2V0IG9mIHBvaW50ZXIgdG8gZnVuY3Rpb24gZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIG1hbmFnZW1lbnQgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgbV9maWxlQ29udGV4dDsgIC8qKjwgVGhlIGNvbnRleHQgbmVlZGVkIGJ5IE9TQUwgdG8gbWFuYWdlIEZpbGUgKi8KLSAgICBNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbyAgbV9kZWNvZGVyQ29uZmlnOy8qKjwgU3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgZGVjb2RlciAqLwotICAgIE00UENNUl9TdGF0ZSAgICAgICAgICAgICAgICBtX3N0YXRlOyAgICAgICAgLyoqPCBzdGF0ZSBvZiB0aGUgd2F2IHJlYWRlciAqLwotICAgIE00UENNUl9TdGF0ZSAgICAgICAgICAgICAgICBtX21pY3JvU3RhdGU7ICAgLyoqPCBzdGF0ZSBvZiB0aGUgcmVhZCB3YXYgc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1fYmxvY2tTaXplOyAgICAvKio8IFNpemUgb2YgdGhlIHJlYWQgYmxvY2sgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbV9vZmZzZXQ7ICAgICAgIC8qKjwgT2Zmc2V0IG9mIHRoZSBQQ00gcmVhZCAoaS5lIG1fb2Zmc2V0IG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHdpdGhvdXQgd2F2IGhlYWRlcikgKi8KLSAgICBNNE9TQV9NZW1BZGRyMzIgICAgICAgICAgICAgbV9wQXVCdWZmZXI7ICAgIC8qKjwgUmUtdXNlZCBidWZmZXIgZm9yIEFVIGNvbnRlbnQgc3RvcmFnZSAqLwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgICAgICBtX2RhdGFTdGFydE9mZnNldDsvKio8IG9mZnNldCBvZiB0aGUgcGNtIGRhdGEgYmVnaW5uaW5nIGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlICovCi19IE00UENNUl9Db250ZXh0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBQcm90b3R5cGVzIG9mIGFsbCBXQVYgcmVhZGVyIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQQ01SX29wZW5SZWFkKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlRnVuY3Rpb24pOwotTTRPU0FfRVJSIE00UENNUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjKTsKLU00T1NBX0VSUiBNNFBDTVJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMpOwotTTRPU0FfRVJSIE00UENNUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEFVKTsKLU00T1NBX0VSUiBNNFBDTVJfZnJlZUFVKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci1NNE9TQV9FUlIgTTRQQ01SX3NlZWsoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlELCBNNE9TQV9UaW1lIHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU2Vla0FjY2Vzc01vZGUgc2Vla0FjY2Vzc01vZGUsIE00T1NBX1RpbWUqIHBPYnRhaW5DVFMpOwotTTRPU0FfRVJSIE00UENNUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLU00T1NBX0VSUiBNNFBDTVJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcFZhbHVlKTsKLU00T1NBX0VSUiBNNFBDTVJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBWYWx1ZSk7Ci1NNE9TQV9FUlIgTTRQQ01SX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKTsKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSXzNncENvbS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfM2dwQ29tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyYTVhMDMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfM2dwQ29tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UkVBREVSXzNncENvbS5oCi0gKiBAYnJpZWYgICAgR2VuZXJpYyBlbmNhcHN1bGF0aW9uIG9mIHRoZSBjb3JlIDNncCByZWFkZXIKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgZ2VuZXJpYyBzaGVsbCBpbnRlcmZhY2UgcmV0cmlldmluZyBmdW5jdGlvbgotICogICAgICAgICAgICBvZiB0aGUgM0dQIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfX000UkVBREVSXzNHUENPTV9IX18KLSNkZWZpbmUgX19NNFJFQURFUl8zR1BDT01fSF9fCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiBFcnJvcjogRnVuY3Rpb24gTTRSRUFERVJfQ29tM0dQX2dldE5leHRTdHJlYW1IYW5kbGVyIG11c3QgYmUgY2FsbGVkIGJlZm9yZS4KLSAqLwotI2RlZmluZSBNNEVSUl9OT19WSURFT19TVFJFQU1fUkVUUklFVkVEX1lFVCAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00UkVBREVSXzNHUCwgMHgwMDAwMDEpCi0KLS8qKgotICogRXJyb3I6IE5vIHZpZGVvIHN0cmVhbSBIMjYzIGluIGZpbGUuCi0gKi8KLSNkZWZpbmUgTTRFUlJfVklERU9fTk9UX0gyNjMgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFJFQURFUl8zR1AsIDB4MDAwMDAyKQotCi0vKioKLSAqIFRoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSB3aXRoIHRoZSBkZWNvZGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24sIHNlZW1zIHRvIGJlIGludmFsaWQgKi8KLSNkZWZpbmUgTTRFUlJfUkVBREVSM0dQX0RFQ09ERVJfQ09ORklHX0VSUk9SICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFJFQURFUl8zR1AsIDB4MDAwMDAzKQotCi0jZGVmaW5lIE00UkVBREVSX0NPTTNHUF9NQVhWSURFT1NUUkVBTSAgNQotI2RlZmluZSBNNFJFQURFUl9DT00zR1BfTUFYQVVESU9TVFJFQU0gIDUKLSNkZWZpbmUgTTRSRUFERVJfQ09NM0dQX01BWFRFWFRTVFJFQU0gICA1Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICBtX3BGRkNvbnRleHQ7ICAgIC8qKjwgY29yZSBmaWxlIGZvcm1hdCBjb250ZXh0ICovCi0KLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgIG1fQXVkaW9TdHJlYW1zW000UkVBREVSX0NPTTNHUF9NQVhBVURJT1NUUkVBTV07Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgICBtX3BBdWRpb1N0cmVhbTsgICAgLyoqPCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGFsbG9jYXRlZCBhdWRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGhhbmRsZXIgKi8KLQotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgbV9WaWRlb1N0cmVhbXNbTTRSRUFERVJfQ09NM0dQX01BWFZJREVPU1RSRUFNXTsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgIG1fcFZpZGVvU3RyZWFtOyAgICAvKio8IHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYWxsb2NhdGVkIHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gaGFuZGxlciAqLwotCi0jaWZkZWYgTTRWUFNfU1VQUE9SVF9UVEVYVAotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgbV9UZXh0U3RyZWFtc1tNNFJFQURFUl9DT00zR1BfTUFYVEVYVFNUUkVBTV07Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgICBtX3BUZXh0U3RyZWFtOyAgICAvKio8IHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYWxsb2NhdGVkIHRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBoYW5kbGVyICovCi0jZW5kaWYgLypNNFZQU19TVVBQT1JUX1RURVhUKi8KLQotfSBNNFJFQURFUl9Db20zR1BfQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgTTRSRUFERVJfM0dQX0J1ZmZlciAoYnV0IG5vdGhpbmcgc3BlY2lmaWMgdG8gM0dQLCBub3IgdG8gYSByZWFkZXIgISkKLSAqIEBicmllZiAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIGJ1ZmZlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4Y2hhbmdlIGRhdGEgKHNob3VsZCBiZSBpbiBPU0FMKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgIHNpemU7ICAgICAgICAgICAgLyoqPCB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmZmVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgZGF0YUFkZHJlc3M7ICAgIC8qKjwgdGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAqLwotfSBNNFJFQURFUl8zR1BfQnVmZmVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00UkVBREVSXzNHUF9PcHRpb25JRAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSByZWFkZXIgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGUgM0dQIGZvcm1hdC4KLSAqIEBub3RlICAgIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGEgM0dQIHJlYWRlciB2aWEgTTRSRUFERVJfM0dQX2dldE9wdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIERlY29kZXJDb25maWdJbmZvIGZvciBIMjYzLAotICAgICAqIG9wdGlvbiB2YWx1ZSBtdXN0IGJlIGEgcG9pbnRlciB0byBNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgYWxsb2NhdGVkIGJ5IGNhbGxlciAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfSDI2M1Byb3BlcnRpZXMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSXzNHUCwgMHgwMSksCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFB1cnBsZSBMYWJzIGRybSBpbmZvcm1hdGlvbiAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfUHVycGxlTGFic0RybSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfM0dQLCAweDAyKSwKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgRmFzdCBvcGVuIG1vZGUgKE9ubHkgdGhlIGZpcnN0IEFVIG9mIGVhY2ggc3RyZWFtIHdpbGwgYmUgcGFyc2VkIC0+IGxlc3MgQ1BVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyBSQU0pLiAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9XUklURSwgTTRSRUFERVJfM0dQLCAweDAzKSwKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgQXVkaW8gb25seSBtb2RlICh0aGUgdmlkZW8gc3RyZWFtIHdvbid0IGJlIG9wZW5lZCkgKi8KLSAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0F1ZGlvT25seSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00UkVBREVSXzNHUCwgMHgwNCksCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIFZpZGVvIG9ubHkgbW9kZSAodGhlIGF1ZGlvIHN0cmVhbSB3b24ndCBiZSBvcGVuZWQpICovCi0gICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9WaWRlb09ubHkgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNFJFQURFUl8zR1AsIDB4MDUpLAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuZXh0IHZpZGVvIENUUyAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfZ2V0TmV4dFZpZGVvQ1RTID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl8zR1AsIDB4MDYpCi0KLX0gTTRSRUFERVJfM0dQX09wdGlvbklEOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00UkVBREVSXzNHUF9IMjYzUHJvcGVydGllcwotICogQGJyaWVmICAgIENvbnRhaW5zIGluZm8gYWJvdXQgSDI2MyBzdHJlYW0gcmVhZCBmcm9tIHRoZSAzR1AgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgdGhlIHByb2ZpbGUgYXMgZGVmaW5lZCBpbiB0aGUgVmlzdWFsIE9iamVjdCBTZXF1ZW5jZSBoZWFkZXIsIGlmIHByZXNlbnQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgdWlQcm9maWxlOwotICAgIC8qKjwgdGhlIGxldmVsIGFzIGRlZmluZWQgaW4gdGhlIFZpc3VhbCBPYmplY3QgU2VxdWVuY2UgaGVhZGVyLCBpZiBwcmVzZW50ICovCi0gICAgTTRPU0FfVUludDggICAgICAgIHVpTGV2ZWw7Ci0KLX0gTTRSRUFERVJfM0dQX0gyNjNQcm9wZXJ0aWVzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSAzZ3AgZmlsZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcE1lZGlhRmFtaWx5OiAgICAoT1VUKSAgICBQb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIGZhbWlseSBvZiB0aGUgZm91bmQgc3RyZWFtCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6ICAgIChPVVQpICAgIFBvaW50ZXIgdG8gYSBzdHJlYW0gaGFuZGxlciB0aGF0IHdpbGwgYmUgYWxsb2NhdGVkIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgZm91bmQgc3RyZWFtIGRlc2NyaXB0aW9uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX1NUUkVBTSAgICBObyBtb3JlIGF2YWlsYWJsZSBzdHJlYW0gaW4gdGhlIG1lZGlhIChhbGwgc3RyZWFtcyBmb3VuZCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQ29tM0dQX2dldE5leHRTdHJlYW1IYW5kbGVyKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlcik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFByZXBhcmUgdGhlICBhY2Nlc3MgdW5pdCAoQVUpCi0gKiBAbm90ZSAgICBBbiBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBhIGRlY29kZXIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgICAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdCAgICAgICAgKElOL09VVCkgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgYXUgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgdXNlciwgYW5kIG11c3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyBNNFJFQURFUl9maWxsQXVTdHJ1Y3RfZmN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIGNyZWF0aW9uKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybnMgICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9Db20zR1BfZmlsbEF1U3RydWN0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQ2xlYW5zIHVwIHRoZSBzdHJlYW0gaGFuZGxlcgotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSByZWFkZXIgc2hlbGwKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKElOL09VVCkgU3RyZWFtIGhhbmRsZXIKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQ29tM0dQX2NsZWFuVXBIYW5kbGVyKE00X1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRSRUFERVJfM0dQQ09NX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9BbXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0Ftci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNmU3Zjk3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0Ftci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFJFQURFUl9BbXIuaAotICogQGJyaWVmICBHZW5lcmljIGVuY2Fwc3VsYXRpb24gb2YgdGhlIGNvcmUgYW1yIHJlYWRlcgotICogQG5vdGUgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGdlbmVyaWMgc2hlbGwgaW50ZXJmYWNlIHJldHJpZXZpbmcgZnVuY3Rpb24KLSAqICAgICAgICAgb2YgdGhlIEFNUiByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRSRUFERVJfQU1SX0hfXwotI2RlZmluZSBfX000UkVBREVSX0FNUl9IX18KLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotKgotKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSogQHBhcmFtIHBSZHJHbG9iYWxJbnRlcmZhY2UgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBnbG9iYWwgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKiBAcGFyYW0gcFJkckRhdGFJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGRhdGEgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKgotKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0qICAgICAgICAgICAgIEVSUl9BTExPQyAgICAgIGlmIGFuIGFsbG9jYXRpb24gZmFpbGVkCi0qICAgICAgICAgICAgRVJSX1BBUkFNRVRFUiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlcyhNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKl9fTTRSRUFERVJfQU1SX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4NjNhN2UuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRSRUFERVJfQ29tbW9uLmgKLSAqIEBicmllZiAgU2hlbGwgUmVhZGVyIGNvbW1vbiBpbnRlcmZhY2UgZGVjbGFyYXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBjb21tb24gaW50ZXJmYWNlcyB0aGF0IHJlYWRlciBzaGVsbHMgbXVzdCBpbXBsZW1lbnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000UkVBREVSX0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNFJFQURFUl9DT01NT05fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00REFfVHlwZXMuaCIKLSNpbmNsdWRlICJNNENvbW1vbl90eXBlcy5oIgotCi0vKiBFUlJPUlMgKi8KLSNkZWZpbmUgTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFJFQURFUl9DT01NT04sIDB4MDAwMSkKLQotLyogV0FSTklOR1MgKi8KLSNkZWZpbmUgTTRXQVJfUkVBREVSX05PX01FVEFEQVRBICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNFJFQURFUl9DT01NT04sIDB4MDAwMSkKLSNkZWZpbmUgTTRXQVJfUkVBREVSX0lORk9STUFUSU9OX05PVF9QUkVTRU5UICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNFJFQURFUl9DT01NT04sIDB4MDAwMikKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00UkVBREVSX01lZGlhVHlwZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBNZWRpYSB0eXBlcyB1c2VkIHRvIGNyZWF0ZSBtZWRpYSByZWFkZXJzCi0gKiBAbm90ZSAgICBUaGlzIGVudW0gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBWUFMgdG8gaWRlbnRpZnkgYSBjdXJyZW50bHkgc3VwcG9ydGVkCi0gKiAgICAgICAgICBtZWRpYSByZWFkZXIgaW50ZXJmYWNlLiBFYWNoIHJlYWRlciBpcyByZWdpc3RlcmVkIHdpdGggb25lIG9mIHRoaXMgdHlwZSBhc3NvY2lhdGVkLgotICogICAgICAgICAgV2hlbiBhIHJlYWRlciBpbnN0YW5jZSBpcyBuZWVkZWQsIHRoaXMgdHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuZAotICogICAgICAgICAgYW5kIHJldHJpZXZlIGl0cyBpbnRlcmZhY2UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRSRUFERVJfa01lZGlhVHlwZVVua25vd24gICAgICAgID0gLTEsICAgIC8qKjwgVW5rbm93biBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZTNHUFAgICAgICAgICAgICA9IDAsICAgIC8qKjwgM0dQUCBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQVZJICAgICAgICAgICAgPSAxLCAgICAvKio8IEFWSSBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQU1SICAgICAgICAgICAgPSAyLCAgICAvKio8IEFNUiBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlTVAzICAgICAgICAgICAgPSAzLCAgICAvKio8IE1QMyBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlUlRTUCAgICAgICAgICAgID0gNCwgICAgLyoqPCBSVFNQIG5ldHdvcmsgYWNjZXNzZWQgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGUzR1BQSFRUUCAgICAgICAgPSA1LCAgICAvKio8IFByb2dyZXNzaXZlbHkgZG93bmxvYWRlZCAzR1BQIGZpbGUgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVQVkhUVFAgICAgICAgID0gNiwgICAgLyoqPCBQYWNrZXQgVmlkZW8gSFRUUCBwcm9wcmlldGFyeSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZVdBViAgICAgICAgICAgID0gNywgICAgLyoqPCBXQVYgZmlsZSBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZTNHUEVYVEhUVFAgICAgPSA4LCAgICAvKio8IEFuIGV4dGVybmFsIHByb2dyZXNzaXZlbHkgZG93bmxvYWRlZCAzR1BQIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVBQUMgICAgICAgICAgICA9IDksICAgIC8qKjwgQURUUyBhbmQgQURJRiBBQUMgc3VwcG9ydCAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVSRUFMICAgICAgICAgICAgPSAxMCwgICAgLyoqPCBSRUFMIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQVNGICAgICAgICAgICAgPSAxMSwgICAgLyoqPCBBU0YgTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVGTEVYVElNRSAgICAgICAgPSAxMiwgICAgLyoqPCBGbGV4VGltZSBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUJCQSAgICAgICAgICAgID0gMTMsICAgIC8qKjwgQmVhdGJyZXcgYXVkaW8gTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVTWU5USEFVRElPICAgID0gMTQsICAgIC8qKjwgU3ludGhlc2lzIGF1ZGlvIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlUENNICAgICAgICAgICAgPSAxNSwgICAgLyoqPCBQQ00gTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVKUEVHICAgICAgICAgICAgPSAxNiwgICAgLyoqPCBKUEVHIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlR0lGICAgICAgICAgICAgPSAxNywgICAgLyoqPCBHSUYgTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVBRElGICAgICAgICAgICAgPSAxOCwgICAgLyoqPCBBQUMtQURUUyBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUFEVFMgICAgICAgICAgICA9IDE5LCAgICAvKio8IEFBQy1BRFRTIE1lZGlhIHR5cGUgKi8KLQotICAgIE00UkVBREVSX2tNZWRpYVR5cGVfTkIgIC8qIG51bWJlciBvZiByZWFkZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotCi19IE00UkVBREVSX01lZGlhVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBNZWRpYSBmYW1pbHkgb2YgYSBzdHJlYW0KLSAqIEBub3RlICAgIFRoaXMgZW51bSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFZQUyB0byBpZGVudGlmeSB3aGF0IGtpbmQgb2Ygc3RyZWFtCi0gKiAgICAgICAgICBoYXMgYmVlbiByZXRyaWV2ZWQgdmlhIGdldE5leHRTdHJlYW0oKSBmdW5jdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFJFQURFUl9rTWVkaWFGYW1pbHlVbmtub3duICAgPSAtMSwKLSAgICBNNFJFQURFUl9rTWVkaWFGYW1pbHlWaWRlbyAgICAgPSAwLAotICAgIE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvICAgICA9IDEsCi0gICAgTTRSRUFERVJfa01lZGlhRmFtaWx5VGV4dCAgICAgID0gMgotfSBNNFJFQURFUl9NZWRpYUZhbWlseTsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRSRUFERVJfT3B0aW9uSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcmVhZGVyIG9wdGlvbnMKLSAqIEBub3RlICAgIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHJlYWQgZnJvbSBhIHJlYWRlciB2aWEgTTRSRUFERVJfZ2V0T3B0aW9uX2ZjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qKgotICAgIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIG1vdmllIChpbiBtcykKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9EdXJhdGlvbiA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAwKSwKLQotICAgIC8qKgotICAgIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgY29yZSByZWFkZXIKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAxKSwKLQotICAgIC8qKgotICAgIEdldCB0aGUgY29weXJpZ2h0IGZyb20gdGhlIG1lZGlhIChpZiBwcmVzZW50KQotICAgIChjdXJyZW50bHkgaW1wbGVtZW50ZWQgZm9yIDNHUFAgb25seTogY29weXJpZ2h0IGdldCBmcm9tIHRoZSBjcHJ0IGF0b20gaW4gdGhlIHVkdGEgaWYgcHJlc2VudCkKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9Db3B5cmlnaHQ9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAyKSwKLQotCi0gICAgLyoqCi0gICAgU2V0IHRoZSBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucyB0byB0aGUgcmVhZGVyICh0eXBlIG9mIHZhbHVlOiBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCAzKSwKLQotICAgIC8qKgotICAgIFNldCB0aGUgT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMgdG8gdGhlIHJlYWRlciAodHlwZSBvZiB2YWx1ZTogTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVXcml0ZXJGY3RzUHRyID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCA0KSwKLQotICAgIC8qKgotICAgIFNldCB0aGUgT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMgdG8gdGhlIHJlYWRlciAodHlwZSBvZiB2YWx1ZTogTTRPU0FfTmV0RnVuY3Rpb24qKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYU5ldEZjdHNQdHIgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgNSksCi0KLSAgICAvKioKLSAgICBDcmVhdGlvbiB0aW1lIGluIHNlYy4gc2luY2UgbWlkbmlnaHQsIEphbi4gMSwgMTk3MCAodHlwZSBvZiB2YWx1ZTogTTRPU0FfVUludDMyKikKLSAgICAoYXZhaWxhYmxlIG9ubHkgZm9yIDNHUFAgY29udGVudCwgaW5jbHVkaW5nIFBHRCkKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9DcmVhdGlvblRpbWUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgNiksCi0KLSAgICAvKioKLSAgICBCaXRyYXRlIGluIGJwcyAodHlwZSBvZiB2YWx1ZTogTTRPU0FfRG91YmxlKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDcpLAotCi0gICAgLyoqCi0gICAgVGFnIElEM3YxIG9mIE1QMyBzb3VyY2UgKHR5cGUgb2YgdmFsdWU6IE00TVAzUl9JRDNUYWcqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YxVGFnID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDgpLAotCi0gICAgLyoqCi0gICAgVGFnIElEM3YyIG9mIE1QMyBzb3VyY2UgKHR5cGUgb2YgdmFsdWU6IE00TVAzUl9JRDNUYWcqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YyVGFnID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDkpLAotCi0gICAgLyoqCi0gICAgTnVtYmVyIG9mIEFjY2VzcyBVbml0IGluIHRoZSBBdWRpbyBzdHJlYW0gKHR5cGUgb2YgdmFsdWU6IE00T1NBX1VJbnQzMiopCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfR2V0TnVtYmVyT2ZBdWRpb0F1ID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4QSksCi0KLSAgICAvKioKLSAgICBOdW1iZXIgb2YgZnJhbWVzIHBlciBibG9jCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfR2V0TmJmcmFtZVBlckJsb2MgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgMHhCKSwKLQotICAgIC8qKgotICAgIEZsYWcgZm9yIHByb3RlY3Rpb24gcHJlc2VuY2UKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9HZXRQcm90ZWN0UHJlc2VuY2UgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgMHhDKSwKLQotICAgIC8qKgotICAgIFNldCBEUk0gQ29udGV4dAotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX1NldERSTUNvbnRleHQgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHhEKSwKLQotICAgIC8qKgotICAgIEdldCBBU0YgQ29udGVudCBEZXNjcmlwdGlvbiBPYmplY3QKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9Db250ZW50RGVzY3JpcHRpb24gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHhFKSwKLQotICAgIC8qKgotICAgIEdldCBBU0YgQ29udGVudCBEZXNjcmlwdGlvbiBPYmplY3QKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9FeHRlbmRlZENvbnRlbnREZXNjcmlwdGlvbiA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCAweEYpLAotCi0gICAgLyoqCi0gICAgR2V0IEFzc2V0IDNncHAgRmllbGRzCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwQXNzZXRGaWVsZHMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxMCksCi0KLSAgICAvKioKLSAgICBTZXQgdGhlIG1heCBtZXRhZGF0YSBzaXplIHN1cHBvcnRlZCBpbiB0aGUgcmVhZGVyCi0gICAgT25seSByZWxldmFudCBpbiAzZ3AgcGFyc2VyIHRpbGwgbm93LCBidXQgY2FuIGJlIHVzZWQgZm9yIG90aGVyIHJlYWRlcnMKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9NYXhNZXRhZGF0YVNpemUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNFJFQURFUl9DT01NT04sIDB4MTEpLAotCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0dldE1ldGFkYXRhID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTIpLAotICAgIC8qKgotICAgIEdldCAzZ3BwICdmdHlwJyBhdG9tCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveCAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxMyksCi0KLQotICAgIC8qIHZhbHVlIGlzIE00T1NBX0Jvb2wqICovCi0gICAgLyogcmV0dXJuIHRoZSBkcm0gcHJvdGVjdGlvbiBzdGF0dXMgb2YgdGhlIGZpbGUqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9pc1Byb3RlY3RlZCA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDE0KSwKLQotICAgIC8qIHZhbHVlIGlzIGEgdm9pZCogKi8KLSAgICAvKiByZXR1cm4gdGhlIGFnZ3JlZ2F0ZSByaWdodHMgb2YgdGhlIGZpbGUqLwotICAgIC8qIFRoZSBidWZmZXIgbXVzdCBiZSBhbGxvY2F0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGFuZCBtdXN0IGJlIGJpZyBlbm91Z2gqLwotICAgIC8qIEJ5IGRlZmF1bHQsIHRoZSBzaXplIGZvciBXTURSTSBpcyA3NiBieXRlcyAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9nZXRBZ2dyZWdhdGVSaWdodHMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxNSksCi0gICAgLyoqCi0gICAgR2V0IEFTRiBDb250ZW50IERlc2NyaXB0aW9uIE9iamVjdAotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0V4dGVuZGVkQ29udGVudEVuY3J5cHRpb24gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCAweDE2KSwKLQotICAgIC8qKgotICAgIE51bWJlciBvZiBBY2Nlc3MgVW5pdCBpbiB0aGUgVmlkZW8gc3RyZWFtICh0eXBlIG9mIHZhbHVlOiBNNE9TQV9VSW50MzIqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mVmlkZW9BdSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDE3KSwKLQotICAgIC8qKgotICAgIENodW5rIG1vZGUgYWN0aXZhdGlvbiAgc2l6ZSBpbiBjYXNlIG9mIEpQRyByZWFkZXIgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfSnBlZ0NodW5ja1NpemUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxOCksCi0KLSAgICAvKioKLSAgICBDaGVjayBpZiBBU0YgZmlsZSBjb250YWlucyB2aWRlbyAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9oYXNWaWRlbyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDE5KSwKLQotICAgIC8qKgotICAgICBTZXQgc3BlY2lmaWMgcmVhZCBtb2RlIGZvciBSYW5kb20gQWNjZXNzIEpQRUcgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfSnBlZ1JBTW9kZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00UkVBREVSX0NPTU1PTiwgMHgyMCksCi0KLSAgICAvKioKLSAgICBHZXQgVGh1bWJuYWlsIGJ1ZmZlciBpbiBjYXNlIG9mIEpQRyByZWFkZXIgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfSnBlZ1RodW1ibmFpbCA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDIxKSwKLQotICAgIC8qKgotICAgIEdldCBGUERBVEEgYnVmZmVyIGluIGNhc2Ugb2YgSlBHIHJlYWRlciAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9KcGVnRlBEYXRhID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MjIpLAotCi0gICAgLyoqCi0gICAgR2V0IEpQRUcgaW5mbyAocHJvZ3Jlc3NpdmUsIHN1YnNhbXBsaW5nKSAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9KcGVnSW5mbz0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MjMpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotfSBNNFJFQURFUl9PcHRpb25JRDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfQ29weVJpZ2h0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBjb3B5UmlnaHQgZGVzY3JpcHRpb24KLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBjb3B5UmlnaHQgb2YgdGhlIG1lZGlhCi0gKiAgICAgICAgICAgICAgKGlmIHByZXNlbnQpIHZpYSB0aGUgZ2V0T3B0aW9uKCkgZnVuY3Rpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfQ29weVJpZ2h0Ci17Ci0gICAgLyoqCi0gICAgUG9pbnRlciB0byBjb3B5cmlnaHQgZGF0YSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gICAgKi8KLSAgICBNNE9TQV9VSW50OCogICBtX3BDb3B5UmlnaHQ7Ci0KLSAgICAvKioKLSAgICBQb2ludGVyIHRvIGNvcHlyaWdodCBzaXplLiBUaGUgcENvcHlSaWdodFNpemUgbXVzdAotICAgIGJlIEluaXRpYWxpemVkIHdpdGggdGhlIHNpemUgYXZhaWxhYmxlIGluIHRoZSBwQ29weVJpZ2h0IGJ1ZmZlcgotICAgICovCi0gICAgTTRPU0FfVUludDMyICAgbV91aUNvcHlSaWdodFNpemU7Ci0KLX0gTTRSRUFERVJfQ29weVJpZ2h0OwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfU3RyZWFtRGF0YU9wdGlvbgotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgZ2VuZXJpYyBzdHJlYW0gZGF0YSBvcHRpb24KLSAqIEBub3RlICAgICAgICBJdCBpcyB1c2VkIGlzIHVzZWQgdG8gc2V0IG9yIGdldCBhIHN0cmVhbSBzcGVjaWZpYyBkYXRhIGRlZmluZWQKLSAqICAgICAgICAgICAgICBieSBhIHJlbGV2YW50IHJlYWRlciBvcHRpb24gSUQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000UkVBREVSX1N0cmVhbURhdGFPcHRpb24KLXsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgbV9wU3RyZWFtSGFuZGxlcjsgLyoqPCBpZGVudGlmaWVyIG9mIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgbV9wT3B0aW9uVmFsdWU7ICAgLyoqPCB2YWx1ZSBvZiB0aGUgZGF0YSBvcHRpb24gdG8gZ2V0IG9yIHRvIHNldCAqLwotCi19IE00UkVBREVSX1N0cmVhbURhdGFPcHRpb247Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICAgTTRfRW5jb2RpbmdGb3JtYXQKLSAqIEBicmllZiAgICAgICAgVGV4dCBlbmNvZGluZyBmb3JtYXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vLyB0eXBlZGVmIGVudW0KLS8vIHsKLS8vICAgICBNNF9rRW5jRm9ybWF0VW5rbm93biAgICA9IDAsICAgIC8qKjwgVW5rbm93biBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLy8gICAgIE00X2tFbmNGb3JtYXRBU0NJSSAgICAgICAgPSAxLCAgLyoqPCBJU08tODg1OS0xLiBUZXJtaW5hdGVkIHdpdGggJDAwICAgICAgICAgICAgICAgICAgICovCi0vLyAgICAgTTRfa0VuY0Zvcm1hdFVURjggICAgICAgID0gMiwgICAvKio8IFVURi04IGVuY29kZWQgVW5pY29kZSAuIFRlcm1pbmF0ZWQgd2l0aCAkMDAgICAgICAgKi8KLS8vICAgICBNNF9rRW5jRm9ybWF0VVRGMTYgICAgICAgID0gMyAgIC8qKjwgVVRGLTE2IGVuY29kZWQgVW5pY29kZS4gVGVybWluYXRlZCB3aXRoICQwMCAwMCAgICAqLwotLyp9ICBNNF9FbmNvZGluZ0Zvcm1hdDsqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9TdHJpbmdBdHRyaWJ1dGVzCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgc3RyaW5nIGF0dHJpYnV0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8vIHR5cGVkZWYgc3RydWN0Ci0vLyB7Ci0vLyAgICAgTTRPU0FfVm9pZCogICAgICAgICAgICBtX3BTdHJpbmc7ICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRleHQgICAgICAgICovCi0vLyAgICAgTTRPU0FfVUludDMyICAgICAgICBtX3VpU2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGV4dCAgICAgICAgICAgICovCi0vLyAgICAgTTRfRW5jb2RpbmdGb3JtYXQgICAgbV9FbmNvZGluZ0Zvcm1hdDsgICAgLyoqPCBUZXh0IGVuY29kaW5nIGZvcm1hdCAgICAqLwotLy8gfSBNNF9TdHJpbmdBdHRyaWJ1dGVzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX0J1ZmZlcgotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgYnVmZmVyIGluIGFsbCByZWFkZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50OCogICBtX3BEYXRhOwotICAgIE00T1NBX1VJbnQzMiAgIG1fdWlCdWZmZXJTaXplOwotfSBNNFJFQURFUl9CdWZmZXI7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlTZXNzaW9uSWQ7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aU1lZGlhSWQ7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aU5iSW5zdGFuY2U7Ci0gICAgTTRPU0FfQ2hhcioqICAgICAgICAgICAgbV9wSW5zdGFuY2U7Ci19IE00X1NkcEFzc2V0SW5zdGFuY2U7Ci0vKgotdHlwZWRlZiBlbnVtCi17Ci0gICAgIE00UkVBREVSX2tVbmtub3duRm9ybWF0ICAgID0gMCwKLSAgICAgTTRSRUFERVJfa1RhZ0lEM1YxLAotICAgICBNNFJFQURFUl9rVGFnSUQzVjIsCi0gICAgTTRSRUFERVJfa0FTRkNvbnRlbnREZXNjLAotICAgIE00UkVBREVSX2szR3BwQXNzZXRCb3hGcm9tVURUQSwKLSAgICBNNFJFQURFUl9rM0dwcEFzc2V0Qm94RnJvbVNEUCwKLSAgICBNNFJFQURFUl9rSnBlZ0V4aWYKLX0gTTRSRUFERVJfTWV0YURhdGFUeXBlOyovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfM2dwQXNzZXRGaWVsZHMKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBmaWVsZHMgb2YgYSAzZ3BwIGFzc2V0IGluZm9ybWF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNENPTU1PTl9NZXRhRGF0YUZpZWxkcyAgICBtX21ldGFkYXRhOwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aVNlc3Npb25JRDsgICAgLyogRm9yIFNEUCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlNZWRpYUlEOyAgICAvKiBGb3IgU0RQICovCi0KLQotICAgIC8qIE5vdGU6IFRoZSB0d28gZm9sbG93aW5nIGZpZWxkcyB3ZXJlIGFkZGVkIGZvciBpbnRlcm5hbCB1c2UKLSAgICAgICAgKEZvciBNdXNpYyBtYW5hZ2VyIHByb2plY3QuLikgISEgKi8KLSAgICBNNF9TdHJlYW1UeXBlICAgICAgIG1fVmlkZW9TdHJlYW1UeXBlOyAgICAvKio8IFZpZGVvIHN0cmVhbSB0eXBlICovCi0gICAgTTRfU3RyZWFtVHlwZSAgICAgICBtX0F1ZGlvU3RyZWFtVHlwZTsgICAgLyoqPCBBdWRpbyBzdHJlYW0gdHlwZSAqLwotCi19IE00X01ldGFEYXRhRmllbGRzOwotCi0KLSNkZWZpbmUgTTRfTUVUQURBVEFfU1RSX05CICAgIDIyIC8qIG9uZSBzdHJpbmcgaW4gYWxidW0gYXJ0IHN0cnVjdHVyZSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aU5iQnVmZmVyOwotICAgIE00X1NkcEFzc2V0SW5zdGFuY2UqICAgIG1fcEFzc2V0SW5mb0luc3Q7ICAgIC8qIFNldCBvZiAzZ3BwIGFzc2V0IGJveGVzICovCi0gICAgTTRDT01NT05fTWV0YURhdGFBbGJ1bUFydCAgICAgICAgbV9hbGJ1bUFydDsgICAgICAgICAgICAvKiBSQzogUFYgc3BlY2lmaWMgYWxidW0gYXJ0OmFkZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlIGJlY2F1c2UgdGhpcyB0eXBlIGlzIHVzZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGJlbG93IGluIHN0cmVhbWluZyAqLwotCi19IE00UkVBREVSX25ldEluZm9zOwotCi0KLXR5cGVkZWYgdW5pb24KLXsKLSAgICBNNFJFQURFUl9CdWZmZXIgICAgICAgIG1fcFRhZ0lEM0J1ZmZlclsyXTsgICAgICAgIC8qIFRhZyBJRDMgVjEsIFYyICovCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgICBNNFJFQURFUl9CdWZmZXIgICAgICAgIG1fcEFzZkRlc2NDb250ZW50OyAgICAvKiBBU0YgZGVzY3JpcHRpb24gY29udGVudCBidWZmZXIgKi8KLSAgICAgICAgTTRSRUFERVJfQnVmZmVyICAgICAgICBtX3BBc2ZFeHREZXNjQ29udGVudDsgLyogQVNGIGV4dGVuZGVkIGRlc2NyaXB0aW9uIGNvbnRlbnQgYnVmZmVyICovCi0gICAgfSBtX2FzZjsKLSAgICBNNF9NZXRhRGF0YUZpZWxkcyAgICBtX3BNZXRhZGF0YUZpZWxkczsgICAgICAvKiBBbHJlYWR5IHBhcnNlZCBhbmQgZmlsbGVkIDNncHAgYXNzZXQgZmllbGRzICovCi0gICAgTTRSRUFERVJfbmV0SW5mb3MgICAgbV9wQXNzZXRJbmZvSW5zdGFuY2U7ICAgLyogU2V0IG9mIDNncHAgYXNzZXQgYm94ZXMgaW4gdGhlIHNkcCBmaWxlICovCi0KLX0gTTRfTWV0YWRhdGFCdWZmZXI7Ci0KLQotCi0KLS8qKioqKioqKioqKiBSRUFERVIgR0xPQkFMIEludGVyZmFjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICBjcmVhdGUgdGhlIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgICAgICAoT1VUKSAgICBwb2ludGVyIG9uIGEgcmVhZGVyIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9jcmVhdGVfZmN0KSAgICAgICAgICAoTTRPU0FfQ29udGV4dCogcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBkZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICBhZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfZGVzdHJveV9mY3QpICAgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgb3BlbiB0aGUgcmVhZGVyIGFuZCBpbml0aWFsaXplcyBpdHMgY3JlYXRlZCBpbnN0YW5jZQotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiwgZm9yIHRoZSBuZXR3b3JrIHJlYWRlciwgc2VuZHMgdGhlIERFU0NSSUJFCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBGaWxlRGVzY3JpcHRvcjogICAgKElOKSAgICBQb2ludGVyIHRvIHByb3ByaWV0YXJ5IGRhdGEgaWRlbnRpZnlpbmcgdGhlIG1lZGlhIHRvIG9wZW4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfb3Blbl9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcik7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY2xvc2UgdGhlIHJlYWRlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgIChNNFJFQURFUl9jbG9zZV9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgbWVkaWEKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcE1lZGlhRmFtaWx5OiAgICAoT1VUKSAgICBwb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgZmFtaWx5IG9mIHRoZSBmb3VuZCBzdHJlYW0KLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogICAgKE9VVCkgICAgcG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBmb3VuZCBzdHJlYW0gZGVzY3JpcHRpb24KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX1NUUkVBTSAgICBubyBtb3JlIGF2YWlsYWJsZSBzdHJlYW0gaW4gdGhlIG1lZGlhIChhbGwgc3RyZWFtcyBmb3VuZCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfZ2V0TmV4dFN0cmVhbV9mY3QpICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgKnBNZWRpYUZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqKnBTdHJlYW1IYW5kbGVyKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBmaWxsIHRoZSBhY2Nlc3MgdW5pdCBzdHJ1Y3R1cmUgd2l0aCBpbml0aWFsaXphdGlvbiB2YWx1ZXMKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAgICAoSU4pICAgICBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaGFuZGxlciB0byB3aGljaCB0aGUgYWNjZXNzIHVuaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgYXNzb2NpYXRlZAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0OiAgICAoSU4vT1VUKSBwb2ludGVyIHRvIHRoZSBhY2Nlc3MgdW5pdCAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbml0aWFsaXplCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9maWxsQXVTdHJ1Y3RfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIHN0YXJ0cyB0aGUgaW5zdGFuY2Ugb2YgdGhlIHJlYWRlcgotICogQG5vdGUgICAgb25seSBuZWVkZWQgZm9yIG5ldHdvcmsgdW50aWwgbm93Li4uCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX3N0YXJ0X2ZjdCkgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgc3RvcCByZWFkaW5nCi0gKiBAbm90ZSAgICBvbmx5IG5lZWRlZCBmb3IgbmV0d29yayB1bnRpbCBub3cuLi4gKG1ha2VzIGEgcGF1c2UpCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX3N0b3BfZmN0KSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGdldCBhbiBvcHRpb24gdmFsdWUgZnJvbSB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHJldHJpZXZlIGEgcHJvcGVydHkgdmFsdWU6Ci0gKiAgICAgICAgICAtdGhlIGR1cmF0aW9uIG9mIHRoZSBsb25nZXN0IHN0cmVhbSBvZiB0aGUgbWVkaWEKLSAqICAgICAgICAgIC10aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHJlYWRlcgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gZ2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgICAgIChPVVQpICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX2dldE9wdGlvbl9mY3QpICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLSBub3RoaW5nIGZvciB0aGUgbW9tZW50Ci0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgICAgKElOKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpIHdoZXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiBpcyBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9zZXRPcHRpb25fZmN0KSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICAgdGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcFRpbWUgICAgICAgICAgICAoSU4vT1VUKSBJTjogIHRoZSB0aW1lIHRvIGp1bXAgdG8gKGluIG1zKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiB0aGUgdGltZSB0byB3aGljaCB0aGUgc3RyZWFtIHJlYWxseSBqdW1wZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgdGhlIHN0cmVhbUlEIGRvZXMgbm90IGV4aXN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgICAoTTRSRUFERVJfanVtcF9mY3QpICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiogcFRpbWUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIHJlc2V0IHRoZSBzdHJlYW0sIHRoYXQgaXMgc2VlayBpdCB0byBiZWdpbm5pbmcgYW5kIG1ha2UgaXQgcmVhZHkgdG8gYmUgcmVhZAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIHJlc2V0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgICAgIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAgKE00UkVBREVSX3Jlc2V0X2ZjdCkgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBnZXQgdGhlIHRpbWUgb2YgdGhlIGNsb3Nlc3QgUkFQIGFjY2VzcyB1bml0IGJlZm9yZSB0aGUgZ2l2ZW4gdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICAgdGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gc2VhcmNoCi0gKiBAcGFyYW0gICAgcFRpbWUgICAgICAgICAgICAoSU4vT1VUKSBJTjogIHRoZSB0aW1lIHRvIHNlYXJjaCBmcm9tIChpbiBtcykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogdGhlIHRpbWUgKGN0cykgb2YgdGhlIHByZWNlZGluZyBSQVAgQVUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgdGhlIHN0cmVhbUlEIGRvZXMgbm90IGV4aXN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgICAoTTRSRUFERVJfZ2V0UHJldlJhcFRpbWVfZmN0KSAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwVGltZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGdlbmVyaWMgbWVkaWEgcmVhZGVyIEdMT0JBTCBpbnRlcmZhY2UKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBjb25jZXJuaW5nCi0gKiAgICAgICAgICAgICAgICBjcmVhdGlvbiBhbmQgY29udHJvbCBvZiBvbmUgcmVhZGVyIHR5cGUuCi0gKiAgICAgICAgICAgICAgICBUaGUgcmVhZGVyIHR5cGUgaXMgb25lIG9mIHRoZSBNNFJFQURFUl9NZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRSRUFERVJfY3JlYXRlX2ZjdCogICAgICAgICAgICBtX3BGY3RDcmVhdGU7Ci0gICAgTTRSRUFERVJfZGVzdHJveV9mY3QqICAgICAgICAgICBtX3BGY3REZXN0cm95OwotICAgIE00UkVBREVSX29wZW5fZmN0KiAgICAgICAgICAgICAgbV9wRmN0T3BlbjsKLSAgICBNNFJFQURFUl9jbG9zZV9mY3QqICAgICAgICAgICAgIG1fcEZjdENsb3NlOwotICAgIE00UkVBREVSX2dldE9wdGlvbl9mY3QqICAgICAgICAgbV9wRmN0R2V0T3B0aW9uOwotICAgIE00UkVBREVSX3NldE9wdGlvbl9mY3QqICAgICAgICAgbV9wRmN0U2V0T3B0aW9uOwotICAgIE00UkVBREVSX2dldE5leHRTdHJlYW1fZmN0KiAgICAgbV9wRmN0R2V0TmV4dFN0cmVhbTsKLSAgICBNNFJFQURFUl9maWxsQXVTdHJ1Y3RfZmN0KiAgICAgIG1fcEZjdEZpbGxBdVN0cnVjdDsKLSAgICBNNFJFQURFUl9zdGFydF9mY3QqICAgICAgICAgICAgIG1fcEZjdFN0YXJ0OwotICAgIE00UkVBREVSX3N0b3BfZmN0KiAgICAgICAgICAgICAgbV9wRmN0U3RvcDsKLSAgICBNNFJFQURFUl9qdW1wX2ZjdCogICAgICAgICAgICAgIG1fcEZjdEp1bXA7Ci0gICAgTTRSRUFERVJfcmVzZXRfZmN0KiAgICAgICAgICAgICBtX3BGY3RSZXNldDsKLSAgICBNNFJFQURFUl9nZXRQcmV2UmFwVGltZV9mY3QqICAgIG1fcEZjdEdldFByZXZSYXBUaW1lOwotCi19IE00UkVBREVSX0dsb2JhbEludGVyZmFjZTsKLQotCi0vKioqKioqKioqKioqKiBSRUFERVIgREFUQSBJbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0cyBhbiBhY2Nlc3MgdW5pdCAoQVUpIGZyb20gdGhlIHN0cmVhbSBoYW5kbGVyIHNvdXJjZS4KLSAqIEBub3RlICAgIEFuIEFVIGlzIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBhbW91bnQgb2YgZGF0YSB0byBiZSBkZWNvZGVkIGJ5IGEgZGVjb2RlciAoYXVkaW8vdmlkZW8pLgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICAgICAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgICAgIChJTi9PVVQpICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBhdSBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLCBhbmQgbXVzdCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdCBhZnRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJucyAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJucyAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICAgICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotICogQHJldHVybnMgICAgTTRXQVJfTk9fREFUQV9ZRVQgICAgICAgICAgICB0aGVyZSBpcyBubyBlbm91Z2ggZGF0YSBvbiB0aGUgc3RyZWFtIGZvciBuZXcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIHVuaXQKLSAqIEByZXR1cm5zICAgIE00V0FSX05PX01PUkVfQVUgICAgICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbmQgb2Ygc3RyZWFtKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAgKE00UkVBREVSX2dldE5leHRBdV9mY3QpKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZ2VuZXJpYyBtZWRpYSByZWFkZXIgREFUQSBpbnRlcmZhY2UKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBjb25jZXJuaW5nCi0gKiAgICAgICAgICAgICAgICBkYXRhIGFjY2VzcyBmb3Igb25lIHJlYWRlciB0eXBlLih0aG9zZSBmdW5jdGlvbnMgYXJlIHR5cGljYWxseSBjYWxsZWQgZnJvbQotICogICAgICAgICAgICAgICAgYSBkZWNvZGVyKSBUaGUgcmVhZGVyIHR5cGUgaXMgb25lIG9mIHRoZSBNNFJFQURFUl9NZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfRGF0YUludGVyZmFjZQotewotICAgIE00UkVBREVSX2dldE5leHRBdV9mY3QqICAgbV9wRmN0R2V0TmV4dEF1OwotCi0gICAgLyoqCi0gICAgc3RvcmVzIHRoZSBjb250ZXh0IGNyZWF0ZWQgYnkgdGhlIE00UkVBREVSX2NyZWF0ZV9mY3QoKSBmdW5jdGlvbgotICAgIHNvIGl0IGlzIGFjY2Vzc2libGUgd2l0aG91dCAgZGVjb2RlcgotICAgICovCi0gICAgTTRPU0FfQ29udGV4dCBtX3JlYWRlckNvbnRleHQ7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi19IE00UkVBREVSX0RhdGFJbnRlcmZhY2U7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2VuZGlmIC8qX19NNFJFQURFUl9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfUGNtLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9QY20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjBmYzg1Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9QY20uaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFJFQURFUl9QY20uaAotICogQGJyaWVmICAgIEdlbmVyaWMgZW5jYXBzdWxhdGlvbiBvZiB0aGUgY29yZSB3YXYgcmVhZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGdlbmVyaWMgc2hlbGwgaW50ZXJmYWNlIHJldHJpZXZpbmcgZnVuY3Rpb24KLSAqICAgICAgICAgICAgb2YgdGhlIHdhdiByZWFkZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRSRUFERVJfUENNX0hfXwotI2RlZmluZSBfX000UkVBREVSX1BDTV9IX18KLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotKgotKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSogQHBhcmFtIHBSZHJHbG9iYWxJbnRlcmZhY2UgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBnbG9iYWwgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKiBAcGFyYW0gcFJkckRhdGFJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGRhdGEgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKgotKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0qICAgICAgICAgICAgIEVSUl9BTExPQyAgICAgIGlmIGFuIGFsbG9jYXRpb24gZmFpbGVkCi0qICAgICAgICAgICAgRVJSX1BBUkFNRVRFUiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlcyhNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000UkVBREVSX1BDTV9IX18qLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRTWVNfQWNjZXNzVW5pdC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRTWVNfQWNjZXNzVW5pdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNTAzNjdjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX0FjY2Vzc1VuaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQuaAotICogQGJyaWVmICAgICAgICBBY2Nlc3MgdW5pdCBtYW5pcHVsYXRpb24KLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSwKLSAqICAgICAgICAgICAgICAgYW5kIGRlY2xhcmVzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGl0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNFNZU19BQ0NFU1NVTklUX0gKLSNkZWZpbmUgTTRTWVNfQUNDRVNTVU5JVF9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotI2luY2x1ZGUgIk00U1lTX1N0cmVhbS5oIgotCi0vKiogVGhlIGF0dHJpYnV0ZSBvZiBhIGZyYWdtZW50Ki8KLXR5cGVkZWYgZW51bSB7Ci0gIE00U1lTX2tGcmFnQXR0ck9rICAgICAgICA9IDAxLCAvKio8IFRoZSBmcmFnbWVudCBpcyBjb3JyZWN0LCB0aGVyZSBpcyBubyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZSBjYW5ub3QgYmUgMCkqLwotICBNNFNZU19rRnJhZ0F0dHJDb3JydXB0ZWQgPSAwMiwgLyoqPCBUaGUgZnJhZ21lbnQgaXMgY29ycnVwdGVkICh0aGVyZSBpcyBhdCBsZWFzdCBhIGJpdCBvciBieXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Igc29tZXdoZXJlIGluIHRoZSBmcmFnbWVudCAoc2l6ZSBjYW5ub3QgYmUgMCkqLwotICBNNFNZU19rRnJhZ0F0dHJMb3N0ICAgICAgPSAwMyAgLyoqPCBUaGUgZnJhZ21lbnQgaXMgbG9zdCwgc28gdGhlIHNpemUgbXVzdCBiZSAwLiovCi19IE00U1lTX0ZyYWdBdHRyOwotCi0KLS8qKiBBIEZyYWdtZW50IGlzIGEgcGllY2Ugb2YgYWNjZXNzIHVuaXQuIEl0IGNhbiBiZSBkZWNvZGVkIHdpdGhvdXQgZGVjb2RpbmcgdGhlIG90aGVycyovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE00T1NBX01lbUFkZHI4ICBmcmFnQWRkcmVzczsgICAvKio8IFRoZSBkYXRhIHBvaW50ZXIuIEFsbCBmcmFnbWVudHMgb2YgdGhlIHNhbWUgYWNjZXNzIHVuaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGNvbnRpZ3VvdXMgaW4gbWVtb3J5Ki8KLSAgTTRPU0FfVUludDMyICAgIHNpemU7ICAgICAgICAgIC8qKjwgVGhlIHNpemUgb2YgdGhlIGZyYWdtZW50LiBJdCBtdXN0IGJlIDAgaWYgZnJhZ21lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnZ2VkICdsb3N0JyovCi0gIE00U1lTX0ZyYWdBdHRyICBpc0NvcnJ1cHRlZDsgICAvKio8IFRoZSBhdHRyaWJ1dGUgb2YgdGhpcyBmcmFnbWVudCovCi19IE00U1lTX0ZyYWc7Ci0KLS8qKjwgVGhlIGF0dHJpYnV0ZSBvZiBhbiBhY2Nlc3MgdW5pdCovCi10eXBlZGVmIE00T1NBX1VJbnQ4IE00U1lTX0FVX0F0dHI7Ci0KLSNkZWZpbmUgQVVfQ29ycnVwdGVkICAgMHgwMSAvKio8IEF0IGxlYXN0IG9uZSBmcmFnbWVudCBvZiB0aGUgYWNjZXNzIHVuaXQgaXMgZmxhZ2dlZCBjb3JydXB0ZWQuKi8KLSNkZWZpbmUgQVVfUF9GcmFtZSAgICAgMHgwMiAvKio8IFRoZSBhY2Nlc3MgdW5pdCBpcyBhIFBfZnJhbWUqLwotI2RlZmluZSBBVV9SQVAgICAgICAgICAweDA0IC8qKjwgVGhlIGFjY2VzcyB1bml0IGlzIGEgcmFuZG9tIGFjY2VzcyBwb2ludC4qLwotCi0KLS8qKiBBbiBhY2Nlc3MgdW5pdCBpcyB0aGUgc21hbGxlc3QgcGllY2Ugb2YgZGF0YSB3aXRoIHRpbWluZyBpbmZvcm1hdGlvbi4qLwotdHlwZWRlZiBzdHJ1Y3QgewotICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogICAgc3RyZWFtIDsKLSAgTTRPU0FfTWVtQWRkcjMyICAgICAgICAgICAgIGRhdGFBZGRyZXNzOyAvKio8IFRoZSBkYXRhIHBvaW50ZXIuIFRoZSBzaXplIG9mIHRoaXMgYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBzaXplKSBtdXN0IGJlIGEgMzItYml0cyBpbnRlZ2VyIG11bHRpcGxlKi8KLSAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHNpemU7ICAgICAgICAvKio8IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBkYXRhQWRkcmVzcy4gVGhlIHNpemUgbWF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1hdGNoIGEgMzItYml0cyB3b3JkIGJvdW5kYXJ5LiovCi0gIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBDVFM7ICAgICAgICAgLyoqPCBUaGUgQ29tcG9zaXRpb24gVGltZSBTdGFtcCovCi0gIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBEVFM7ICAgICAgICAgLyoqPCBUaGUgRGVjb2RlZCBUaW1lIFN0YW1wKi8KLSAgTTRTWVNfQVVfQXR0ciAgICAgICAgICAgICAgIGF0dHJpYnV0ZTsgICAvKio8IFRoZSBhdHRyaWJ1dGUgb2YgdGhlIGFjY2VzcyB1bml0Ki8KLSAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgIG5iRnJhZzsgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZnJhZ21lbnRzLiBJdCBjYW4gYmUgMCBpZiB0aGVyZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZnJhZ21lbnQuKi8KLSAgTTRTWVNfRnJhZyoqICAgICAgICAgICAgICAgIGZyYWc7ICAgICAgICAvKio8IEFuIGFycmF5IG9mICduYkZyYWcnIGZyYWdtZW50cy4gSXQgc3RvcmVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRzIHN0cnVjdHVyZS4gVGhlIG9yaWdpbmFsIGRlZmluaXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IG9mIGZyYWcgaGFzIGJlZW4gY2hhbmdlZCBmcm9tIE00U1lTX0ZyYWcqIGZyYWdbXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gTTRTWVNfRnJhZyoqIGZyYWcgc2luY2UgdGhlIHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IG9mIHN1Y2ggc3ludGF4IGlzIG9ubHkgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQyBjb21waWxlci4gKi8KLX0gTTRTWVNfQWNjZXNzVW5pdDsKLQotLyogRXJyb3IgY29kZXMgKi8KLSNkZWZpbmUgTTRFUlJfQVVfTk9fTU9SRV9GUkFHICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRTWVNfQ01BUEksMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX0FVX0JVRkZFUl9PVkVSRkxPVyAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00U1lTX0NNQVBJLDB4MDAwMDAyKQotI2RlZmluZSBNNEVSUl9BVV9CQURfSU5ERVggICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNFNZU19DTUFQSSwweDAwMDAwMykKLSNkZWZpbmUgTTRFUlJfTk9UX0VOT1VHSF9GUkFHICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRTWVNfQ01BUEksMHgwMDAwMDQpCi0KLQotCi0jZW5kaWYgLypNNFNZU19BQ0NFU1NVTklUX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFNZU19TdHJlYW0uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX1N0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYWIwY2U3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX1N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNFNZU19TdHJlYW0uaAotICogQGJyaWVmICAgICAgICBTdHJlYW0gbWFuaXB1bGF0aW9uCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzdHJlYW0gc3RydWN0dXJlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNFNZU19TVFJFQU1fSAotI2RlZmluZSBNNFNZU19TVFJFQU1fSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0KLXR5cGVkZWYgTTRPU0FfVUludDMyIE00U1lTX1N0cmVhbUlEOwotCi0vKiogVGhlIHN0cmVhbVR5cGUgdHlwZSBwcm92aWRlcyBhIHdheSB0byBkaXN0aW5ndWlzaCBhbGwgc3RyZWFtcyAoQUFDLCBBTVIsIFlVVjQyMCwgTVBFRy00IFZpZGVvLAotICAgICBIMjYzKS4gU3RyZWFtIHR5cGVzIGNhbiBiZSBzb3J0ZWQgaW4gMiB3YXlzOgotQGFyZyAgIFNvbWUgb2YgdGhlbSBhcmUgcmF3IGRhdGEsIG90aGVycyBhcmUgZW5jb2RlZAotQGFyZyAgIFNvbWUgb2YgdGhlbSBhcmUgcmVsYXRlZCB0byBhbiBhdWRpbyBtZWRpYSwgYSB2aWRlbyBtZWRpYS4uLgotQG4gU28gYSBzcGVjaWZpYyBuYW1pbmcgY29udmVudGlvbiBoYXMgYmVlbiBkZXNpZ25lZCB0byBhbGxvdyBhIHF1aWNrIHBhcnNpbmcgb2YgdGhlIHN0cmVhbVR5cGUKLSAgICB2YWx1ZSB0byByZXR1cm4gdGhlIGFib3ZlIGNhdGVnb3JpZXMuIFN0cmVhbVR5cGUgaXMgYW4gdW4tc2lnbmVkIGludGVnZXIgb24gMTYgYml0cy4KLUBhcmcgICBUaGUgZmlyc3QgYnl0ZSAoTVNCKSBkZWZpbmVzIHRoZSBjb2RlYyB0eXBlLiBJdCBjYW4gYmUgZWl0aGVyIEF1ZGlvLFZpZGVvLCBQaWN0dXJlLAotICAgICAgICAgVGV4dCBvciBTY2VuZS4KLUBhcmcgICBUaGUgc2Vjb25kIGJ5dGUgKExTQikgZGVmaW5lcyB0aGUgc3ViLWNvZGVjcyB0eXBlIChpZSBZVVY0MjAsIFBDTV8xNiBiaXRzLCBBTVIuLi4pLgotICAgICAgICBNb3Jlb3ZlciBpZiB0aGlzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAweDgwIHRoZSBzdHJlYW0gaXMgYSByYXcgc3RyZWFtLCBlbHNlIHRoZSBzdHJlYW0KLSAgICAgICAgaXMgYW4gZW5jb2RlZCBvbmUKLUBuICAgMHgwMDAwIGlzIGEgZm9yYmlkZGVuIHZhbHVlLCBpdCBkZXNjcmliZXMgYW4gdW5rbm93biBzdHJlYW0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgIE00U1lTX2tVbmtub3duICAgICAgID0gMHgwMDAwLAotICAgLyogU3RyZWFtIHR5cGUgZGVmaW5pdGlvbgotICAgICAgIDB4WVlaWiAgIDogWVkgaXMgdGhlIGNvZGVjIHR5cGUgKEF1ZGlvLCBWaWRlbywgUGljdHVyZSwgU2NlbmUgLi4uKQotICAgICAgICAgICAgICAgICAgWlogaXMgdGhlIHN1Yi1jb2RlYyB0eXBlIChBQUMsIEFNUiAsIC4uLikKLSAgICAgICAgICAgICAgICAgICAgIGlmIFpaIGlzIGdyZWF0ZXIgdGhhbiAweDgwIGl0IGlzIGEgcmF3IGZvcm1hdCovCi0KLSAgIC8qIEF1ZGlvIG9uZXMgICA6IFJhbmdlIGZyb20gWzB4MDEwMC0weDAxRkZdKi8KLSAgIE00U1lTX2tBdWRpb1Vua25vd24gID0gMHgwMTAwLAotICAgTTRTWVNfa0FBQyAgICAgICAgICAgPSAweDAxMDEsCi0gICBNNFNZU19rQ0VMUCAgICAgICAgICA9IDB4MDEwMiwKLSAgIE00U1lTX2tBTVIgICAgICAgICAgID0gMHgwMTAzLAotICAgTTRTWVNfa0FNUl9XQiAgICAgICAgPSAweDAxMDQsCi0gICBNNFNZU19rTVAzICAgICAgICAgICA9IDB4MDEwNSwKLSAgIE00U1lTX2tNSURJICAgICAgICAgID0gMHgwMTA2LAotICAgTTRTWVNfa1dNQSAgICAgICAgICAgPSAweDAxMDcsCi0gICBNNFNZU19rUkVBTEFVRElPICAgICA9IDB4MDEwOCwKLSAgIE00U1lTX2tFVlJDICAgICAgICAgICAgPSAweDAxMDksCi0gICBNNFNZU19rUENNXzE2Yml0c1MgICA9IDB4MDE4MSwgLyogUENNIDE2IGJpdHMgU2lnbmVkICovCi0gICBNNFNZU19rUENNXzE2Yml0c1UgICA9IDB4MDE4MiwgLyogUENNIDE2IGJpdHMgVW4tc2lnbmVkICovCi0gICBNNFNZU19rUENNXzhiaXRzVSAgICA9IDB4MDE4MywgLyogUENNICA4IGJpdHMgVW4tc2lnbmVkICovCi0vKiBGaXhBQSAyMDA4LzAzLzAzIHR5cGVzOiBNNFNZU19rUENNXzE2Yml0c1MsIE00U1lTX2tQQ01fMTZiaXRzVSBhbmQgTTRTWVNfa1BDTV84Yml0c1UKLSAgIGFyZSBub3cgb25seSB1c2VkIGJ5IEF1ZGlvTWl4ZXIgYW5kIFJlYWRlckFWSSA9PiBBbiB1cGRhdGUgaXMgbmVjZXNzYXJ5IGluIHRoZSBmdXR1cmUgZm9yIHVzZQotICAgdHlwZSBNNFNZU19rUENNICovCi0gICBNNFNZU19rWE1GICAgICAgICAgICAgPSAweDAxODQsCi0gICBNNFNZU19rU01BRiAgICAgICAgICA9IDB4MDE4NSwKLSAgIE00U1lTX2tJTUVMICAgICAgICAgID0gMHgwMTg2LAotICAgTTRTWVNfa0JCQSAgICAgICAgICAgID0gMHgwMTg3LAotICAgTTRTWVNfa0JQQyAgICAgICAgICAgID0gMHgwMTg4LAotICAgTTRTWVNfa0FEUENNICAgICAgICAgPSAweDAxODksICAvKiBBRFBDTSBhZGRlZCAqLwotICAgTTRTWVNfa1BDTSAgICAgICAgICAgPSAweDAxOTAsICAvKiBzdHJlYW0gdHlwZSBhZGRlZDogUENNOyAgUFIyNTY5IGZpeEFBICovCi0gICBNNFNZU19rQXVkaW9BbGwgICAgICAgID0gMHgwMUZGLCAgLyogYWxsIGF1ZGlvIHN0cmVhbXMgKi8KLQotICAgLyogVmlkZW8gb25lcyAgIDogUmFuZ2UgWzB4MDIwMC0weDAyRkZdKi8KLSAgIE00U1lTX2tWaWRlb1Vua25vd24gID0gMHgwMjAwLAotICAgTTRTWVNfa01QRUdfNCAgICAgICAgPSAweDAyMDEsCi0gICBNNFNZU19rSDI2MyAgICAgICAgICA9IDB4MDIwMiwKLSAgIE00U1lTX2tIMjYzcHAgICAgICAgID0gMHgwMjAzLAotICAgTTRTWVNfa0gyNjQgICAgICAgICAgPSAweDAyMDQsCi0gICBNNFNZU19rUkVBTFZJREVPICAgICA9IDB4MDIwNSwKLSAgIE00U1lTX2tZVVY0MjAgICAgICAgID0gMHgwMjgxLAotICAgTTRTWVNfa1JHQjMyICAgICAgICAgPSAweDAyODIsCi0gICBNNFNZU19rQkdSMzIgICAgICAgICA9IDB4MDI4MywKLSAgIE00U1lTX2tSR0IyNCAgICAgICAgID0gMHgwMjg0LAotICAgTTRTWVNfa0JHUjI0ICAgICAgICAgPSAweDAyODUsCi0gICBNNFNZU19rVmlkZW9BbGwgICAgICAgID0gMHgwMkZGLCAgLyogYWxsIHZpZGVvIHN0cmVhbXMgKi8KLQotICAvKiBQaWN0dXJlIG9uZXMgOiBSYW5nZSBbMHgwMzAwLTB4MDNGRl0qLwotICAgTTRTWVNfa1BpY3R1cmVVbmtub3duID0gMHgwMzAwLAotICAgTTRTWVNfa0pQRUcgICAgICAgICAgID0gMHgwMzAxLAotICAgTTRTWVNfa0dJRiAgICAgICAgICAgID0gMHgwMzAyLAotICAgTTRTWVNfa0JNUCAgICAgICAgICAgID0gMHgwMzgzLAotICAgTTRTWVNfa1N0aWxsQWxsICAgICAgICAgPSAweDAzRkYsICAvKiBhbGwgc3RpbGwgcGljdHVyZSBzdHJlYW1zICovCi0KLSAgIC8qIFRleHQgb25lcyAgICA6IFJhbmdlIFsweDA0MDAtMHgwNEZGXSovCi0gICBNNFNZU19rVGV4dFVua25vd24gID0gMHgwNDAwLAotICAgTTRTWVNfa1RpbWVkVGV4dCAgICA9IDB4MDQwMSwKLSAgIE00U1lTX2tVVEY4ICAgICAgICAgPSAweDA0ODEsCi0gICBNNFNZU19rVVRGMTYgICAgICAgID0gMHgwNDgyLAotICAgTTRTWVNfa1VDUzIgICAgICAgICA9IDB4MDQ4MywKLSAgIE00U1lTX2tUZXh0QWxsICAgICAgID0gMHgwNEZGLCAgLyogYWxsIHRleHQgc3RyZWFtcyAqLwotCi0gICAvKiBTY2VuZSAmIEdyYXBoaWNzIG9uZXMgICA6IFJhbmdlIFsweDA1MDAtMHgwNUZGXSovCi0gICBNNFNZU19rU2NlbmVVbmtub3duICA9IDB4MDUwMCwKLSAgIE00U1lTX2tTTUlMICAgICAgICAgID0gMHgwNTAxLAotICAgTTRTWVNfa0JJRlMgICAgICAgICAgPSAweDA1MDIsCi0gICBNNFNZU19rU2NlbmVBbGwgICAgICAgID0gMHgwNUZGLCAgLyogYWxsIHNjZW5lIHN0cmVhbXMgKi8KLQotICAgLyogaGludGVkIG9uZXMgICA6IFJhbmdlIFsweDA2MDAtMHgwNkZGXSovCi0gICBNNFNZU19rSGludGVkVW5rbm93biA9IDB4MDYwMCwKLSAgIE00U1lTX2tSVFAgICAgICAgICAgID0gMHgwNjAxLAotICAgTTRTWVNfa01QRUcyX1RTICAgICAgPSAweDA2MDIsCi0gICBNNFNZU19rSGludGVkQWxsICAgICAgICA9IDB4MDZGRiwgIC8qIGFsbCBwYWNrZXRpemVkIHN0cmVhbXMgKi8KLQotICAgLyogTVBFRy00IHN5c3RlbSBvbmVzIDogUmFuZ2UgWzB4MDcwMC0weDA3RkZdKi8KLSAgIE00U1lTX2tTeXNVbmtub3duICAgID0gMHgwNzAwLAotICAgTTRTWVNfa09EUyAgICAgICAgICAgPSAweDA3MDEsCi0gICBNNFNZU19rSVBNUCAgICAgICAgICA9IDB4MDcwMiwKLSAgIE00U1lTX2tPQ0kgICAgICAgICAgID0gMHgwNzAzLAotICAgTTRTWVNfa1N5c0FsbCAgICAgICAgPSAweDA3RkYgLyogYWxsIHN5c3RlbSBzdHJlYW1zKi8KLX0gTTRTWVNfU3RyZWFtVHlwZSA7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgIE00U1lTX1N0cmVhbUlEICAgICBzdHJlYW1JRCA7Ci0gICBNNE9TQV9VSW50MzIgICAgICB2YWx1ZSA7Ci19IE00U1lTX1N0cmVhbUlEVmFsdWUgOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBNNFNZU19TdHJlYW1JRCAgICBzdHJlYW1JRCA7Ci0gICBNNE9TQV9VSW50MzIgICAgICBzaXplIDsKLSAgIE00T1NBX01lbUFkZHIzMiAgIGFkZHIgOwotfSBNNFNZU19TdHJlYW1JRG1lbUFkZHIgOwotCi0vKiogVGhpcyBzdHJ1Y3VyZSBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB0byBhIHN0cmVhbSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE00U1lTX1N0cmVhbUlEICAgc3RyZWFtSUQ7ICAgIC8qKjwgVGhlIElEIG9mIHRoZSBzdHJlYW0uIEl0IG11c3QgYmUgdW5pcXVlIGZvciBhIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZSBpbiBhIE1QNCBmaWxlLCB0d28gdHJhY2tzIGNhbiBub3QgaGF2ZSB0d28gdGltZXMgdGhlIHNhbWUgSUQpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBpcyBmb3JiaWRkZW4uKi8KLSAgTTRTWVNfU3RyZWFtVHlwZSBzdHJlYW1UeXBlOyAgICAvKio8IFRoZSBzdHJlYW0gdHlwZSBvZiB0aGUgc3RyZWFtKi8KLSAgTTRPU0FfVUludDggICAgICBwcm9maWxlTGV2ZWw7ICAvKio8IFRoZSBwcm9maWxlICYgbGV2ZWwgb2YgYSBzdHJlYW0uIEl0IGlzIHJlbGF0ZWQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gdHlwZSAmIHRoZSBkZWZpbml0aW9uIGNvbWVzIGZyb20gdGhlIHN0YW5kYXJkIGJvZGllcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gTVBFRy00IFZpZGVvICYgTVBFRy00IEF1ZGlvKS4gU29tZSB2YWx1ZXMgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUtZGVmaW5lZDogMHhGRT11c2VyUHJpdmF0ZSAweEZGPW5vIFByb2ZpbGUgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwgc3BlY2lmaWVkKi8KLSAgTTRPU0FfVUludDMyICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsgIC8qKjwgVGhlIGRlY29kZXIgY29uZmlndXJhdGlvbi4gVGhlc2UgYnl0ZXMgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgdG8gaW5pdGlhbGlzZSBhIGRlY29kZXIuKi8KLSAgTTRPU0FfTWVtQWRkcjMyICBkZWNvZGVyU3BlY2lmaWNJbmZvOyAvKio8IFRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIGRlY29kZXIgc3BlY2lmaWMgaW5mby4qLwotICBNNE9TQV9VSW50MzIgICAgIHRpbWVTY2FsZTsgICAgIC8qKjwgVGhlIHRpbWUgc2NhbGUgb2YgdGhlIHN0cmVhbS4gSXQgbWVhbnMgdGhhdCBhbGwgdGltaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gb2YgdGhpcyBzdHJlYW0gYXJlIGNvbXB1dGVkIGluIHRoaXMgdGltZXNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGllIHRpbWVTY2FsZSA9IDgwMDAsIG1lYW5zIHRoZXJlIGFyZSA4MDAwIHRpY2tzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIHNlY29uZCkqLwotICBNNE9TQV9UaW1lICAgICAgIGR1cmF0aW9uOyAgICAgICAgLyoqPCBUaGUgc3RyZWFtIGR1cmF0aW9uIG9mIHRoaXMgc3RyZWFtLiBUaGUgdGltZSB1bml0IGlzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgc2NhbGUuIFRoZSB2YWx1ZSBjYW4gYmUgc2V0IHRvIE00U1lTX1Vua25vd25UaW1lIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGR1cmF0aW9uIGlzIG5vdCBrbm93bi4qLwotICBNNE9TQV9JbnQzMiAgICAgIGF2ZXJhZ2VCaXRyYXRlOyAgLyoqPCBUaGUgYXZlcmFnZSBiaXRyYXRlIChpbiBiaXQgcGVyIHNlY29uZCkgb2YgdGhpcyBzdHJlYW0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdmVyYWdlIGJpdHJhdGUgaXMgY29tcHV0ZWQgb24gdGhlIHN0cmVhbSBkdXJhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgdmFsdWUgbWVhbnMgZWl0aGVyIHRoZXJlIGlzIG5vIGF2ZXJhZ2UgYml0cmF0ZSBvciBubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlIGJpdHJhdGUgaXMgcHJvdmlkZWQuKi8KLSAgTTRPU0FfSW50MzIgICAgICBtYXhCaXRyYXRlOyAgICAgIC8qKjwgVGhlIG1heGltdW0gYml0cmF0ZSAoaW4gYml0IHBlciBzZWNvbmQpIG9mIHRoaXMgc3RyZWFtLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBiaXRyYXRlIGlzIGNvbXB1dGVkIG9uIGEgc2xpZGluZyB3aW5kb3cgb2YgMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQuIC0xIHZhbHVlIG1lYW5zIGVpdGhlciB0aGVyZSBpcyBubyBtYXguIGJpdHJhdGUgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gbWF4LiBiaXRyYXRlIGlzIHByb3ZpZGVkLiovCi19IE00U1lTX1N0cmVhbURlc2NyaXB0aW9uOwotCi10eXBlZGVmIGVudW0gewotICAgTTRTWVNfa1ByZXZpb3VzUkFQICAgICAgPSAweDAxICwKLSAgIE00U1lTX2tOZXh0UkFQICAgICAgICAgID0gMHgwMiAsCi0gICBNNFNZU19rQ2xvc2VzdFJBUCAgICAgICA9IDB4MDMgLAotICAgTTRTWVNfa05vUkFQcHJldmlvdXMgICAgPSAweDExICwKLSAgIE00U1lTX2tOb1JBUG5leHQgICAgICAgID0gMHgxMiAsCi0gICBNNFNZU19rTm9SQVBjbG9zZXN0ICAgICA9IDB4MTMgLAotICAgTTRTWVNfa0JlZ2lubmluZyAgICAgICAgPSAweDIwCi19IE00U1lTX1NlZWtBY2Nlc3NNb2RlIDsKLQotI2VuZGlmIC8qTTRTWVNfU1RSRUFNX0gqLwotCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRUT09MX1ZlcnNpb25JbmZvLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFRPT0xfVmVyc2lvbkluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzAxNmI4ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFRPT0xfVmVyc2lvbkluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00VE9PTF9WZXJzaW9uSW5mby5oCi0gKiBAYnJpZWYgIGRlZmluZXMgYSBjb21tb24gdmVyc2lvbiBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKLSAqIEBub3RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNFRPT0xfVkVSU0lPTklORk9fSF9fCi0jZGVmaW5lIF9fTTRUT09MX1ZFUlNJT05JTkZPX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotLyoqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfVmVyc2lvbkluZm8KLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHZlcnNpb24gb2YgY29yZSBjb21wb25lbnQKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB0eXBpY2FsbHkgdXNlZCB0byByZXRyaWV2ZSB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgICAgICAgICAgICAgICBvZiBhIGNvbXBvbmVudCB2aWEgZ2V0T3B0aW9uIGZ1bmN0aW9uCi0gKi8KLXR5cGVkZWYgc3RydWN0IF9NNF9WZXJzaW9uSW5mbwotewotICAgIE00T1NBX1VJbnQzMiBtX21ham9yOyAgICAgICAgLyptYWpvciB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotICAgIE00T1NBX1VJbnQzMiBtX21pbm9yOyAgICAgICAgLyptaW5vciB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotICAgIE00T1NBX1VJbnQzMiBtX3JldmlzaW9uOyAgICAvKnJldmlzaW9uIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0KLSAgICAvKiBTdHJ1Y3R1cmUgc2l6ZSAqLwotICAgIE00T1NBX1VJbnQzMiBtX3N0cnVjdFNpemU7Ci0KLX0gTTRfVmVyc2lvbkluZm87Ci0KLQotI2VuZGlmIC8qX19NNFRPT0xfVkVSU0lPTklORk9fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwYmZjYjYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRWRF9FWFRFUk5BTF9JTlRFUkZBQ0VfSF9fCi0jZGVmaW5lIF9fTTRWRF9FWFRFUk5BTF9JTlRFUkZBQ0VfSF9fCi0KLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogLS0tLS0gRFNJIGJpdHN0cmVhbSBwYXJzZXIgLS0tLS0gKi8KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBhdmFpbGFibGUgdG8gY2xpZW50cyBvZiB0aGUgc2hlbGwgdG8gYWxsb3cgdGhlbSB0byBhbmFseXNlIGNsaXBzCi0odXNlZnVsIGZvciB2aWRlbyBlZGl0aW5nKSB3aXRob3V0IGhhdmluZyB0byBpbnN0YW5jaWF0ZSBhIGRlY29kZXIsIHdoaWNoIGNhbiBiZSB1c2VmdWwgcHJlY2lzZWx5Ci1pZiBIVyBkZWNvZGVycyBhcmUgYSBwb3NzaWJpbGl0eS4gKi8KLQotTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJKAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwVm9sLCBNNE9TQV9JbnQzMiBhVm9sU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8qIHBEY2ksCi0gICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvU2l6ZSogcFZpZGVvU2l6ZSk7Ci0KLU00T1NBX0VSUiBnZXRBVkNQcm9maWxlQW5kTGV2ZWwoTTRPU0FfVUludDgqIHBEU0ksIE00T1NBX0ludDMyIERTSVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKTsKLQotTTRPU0FfRVJSIGdldEgyNjNQcm9maWxlQW5kTGV2ZWwoTTRPU0FfVUludDgqIHBEU0ksIE00T1NBX0ludDMyIERTSVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKTsKLQotTTRPU0FfRVJSIGdldE1QRUc0UHJvZmlsZUFuZExldmVsKE00T1NBX1VJbnQ4IHByb2ZpbGVBbmRMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcFByb2ZpbGUsIE00T1NBX0ludDMyICpwTGV2ZWwpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNFZEX0VYVEVSTkFMX0lOVEVSRkFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfVG9vbHMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfVG9vbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2NhMzZhYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX1Rvb2xzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000VkRfVE9PTFNfSF9fCi0jZGVmaW5lIF9fTTRWRF9UT09MU19IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0vKiAtLS0tLSBiaXRzdHJlYW0gcGFyc2VyIC0tLS0tICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyIHN0cmVhbV9ieXRlOwotICAgIE00T1NBX1VJbnQzMiBzdHJlYW1faW5kZXg7Ci0gICAgTTRPU0FfTWVtQWRkcjggaW47Ci0KLX0gTTRWU19CaXRzdHJlYW1fY3R4dDsKLQotTTRPU0FfVUludDMyIE00VkRfVG9vbHNfR2V0Qml0c0Zyb21NZW1vcnkoTTRWU19CaXRzdHJlYW1fY3R4dCogcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBuYl9iaXRzKTsKLU00T1NBX0VSUiBNNFZEX1Rvb2xzX1dyaXRlQml0c1RvTWVtb3J5KE00T1NBX1VJbnQzMiBiaXRzVG9Xcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjMyIGRlc3RfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggb2Zmc2V0LCBNNE9TQV9VSW50OCBuYl9iaXRzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRWRF9UT09MU19IX18gKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkZMX3RyYW5zaXRpb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkZMX3RyYW5zaXRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzdmNzZjYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZGTF90cmFuc2l0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRUUkFOX3RyYW5zaXRpb24uaAotICogQGJyaWVmCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfX000VkZMX1RSQU5TSVRJT05fSF9fCi0jZGVmaW5lIF9fTTRWRkxfVFJBTlNJVElPTl9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVJbnQ4OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIFVJbnQzMjsKLQotdHlwZWRlZiAgICBzdHJ1Y3QgU19NNFZpQ29tSW1hZ2VQbGFuZQotewotICAgIFVJbnQzMiAgICAgICAgdV93aWR0aDsgICAgICAgICAgICAvKiBhY3RpdmUgd2lkdGgsIGluIHBpeGVscyAqLwotICAgIFVJbnQzMiAgICAgICAgdV9oZWlnaHQ7ICAgICAgICAgICAgLyogYWN0aXZlIGhlaWdodCwgaW4gbGluZXMgKi8KLSAgICBVSW50MzIgICAgICAgIHVfdG9wbGVmdDsgICAgICAgICAgICAvKiBpbmRleCBvZiAxc3QgYWN0aXZlIHBpeGVsICovCi0gICAgVUludDMyICAgICAgICB1X3N0cmlkZTsgICAgICAgICAgICAvKiBsaW5lIHN0cmlkZSwgaW4gYnl0ZXMgKi8KLSAgICBVSW50OCAgICAgICAgKnBhY19kYXRhOyAgICAgICAgICAgIC8qIGJ1ZmZlciBhZGRyZXNzICovCi19ICAgIE00VmlDb21JbWFnZVBsYW5lOwotCi10eXBlZGVmIHN0cnVjdCBTX000VkZMX21vZGlmTHVtUGFyYW0KLXsKLSAgICB1bnNpZ25lZCBzaG9ydCBsdW1fZmFjdG9yOwotICAgIHVuc2lnbmVkIHNob3J0IGNvcHlfY2hyb21hOwotfSBNNFZGTF9Nb2RpZkx1bVBhcmFtOwotCi0jZGVmaW5lICAgICBNNFZJRklfT0sgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgICAgIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVCAgICAgOAotI2RlZmluZSAgICAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEggICAgICA5Ci0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYUJ5U3RlcChNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sIE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX01vZGlmTHVtUGFyYW0gKmx1bV9wYXJhbSwgdm9pZCAqdXNlcl9kYXRhKTsKLQotdW5zaWduZWQgY2hhciBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9pbiwgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsdW1fZmFjdG9yLCB2b2lkICp1c2VyX2RhdGEpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMCAodm9pZCAqcFVzZXJEYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluMiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9VSW50MzIgUHJvZ3Jlc3MpCi0gKiBAYnJpZWYgICBCbGVuZHMgdHdvIFlVViA0OjI6MCBQbGFuYXIgaW1hZ2VzLgotICogQG5vdGUgICAgQmxlbmRzIFlVVjQyMCBwbGFuYXIgaW1hZ2VzLAotICogICAgICAgICAgTWFwIHRoZSB2YWx1ZSBvZiBwcm9ncmVzcyBmcm9tICgwIC0gMTAwMCkgdG8gKDAgLSAxMDI0KQotICogICAgICAgICAgU2V0IHRoZSByYW5nZSBvZiBibGVuZGluZ2ZhY3RvciwKLSAqICAgICAgICAgICAgICAgICAgMS4gZnJvbSAwIHRvIChQcm9ncmVzcyA8PCAxKSAgICAgICAgICAgIDtmb3IgUHJvZ3Jlc3MgPD0gNTEyCi0gKiAgICAgICAgICAgICAgICAgIDIuIGZyb20gKCggUHJvZ3Jlc3MgLSA1MTIpPDwgMSkgdG8gMTAyNCA7b3RoZXJ3aXNlCi0gKiAgICAgICAgICBTZXQgdGhlIGluY3JlbWVudCBvZiBibGVuZGluZ2ZhY3RvciBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBpbWFnZSByb3cgYnkgdGhlIGZhY3RvciwKLSAqICAgICAgICAgICAgICAgICAgPSAgKFJhbmdlLTEpIC8gKGltYWdlIHdpZHRoLTEpICA7Zm9yIHdpZHRoID49IHJhbmdlCi0gKiAgICAgICAgICAgICAgICAgID0gIChSYW5nZSkgLyAoaW1hZ2Ugd2lkdGgpICAgICAgO290aGVyd2lzZQotICogICAgICAgICAgTG9vcCBvbiBlYWNoKD0gaSkgcm93IG9mIG91dHB1dCBZIHBsYW5lIChzdGVwcyBvZiAyKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCg9IGopIGNvbHVtbiBvZiBvdXRwdXQgWSBwbGFuZSAoc3RlcHMgb2YgMikKLSAqICAgICAgICAgICAgICAgICAgR2V0IGZvdXIgWSBzYW1wbGVzIGFuZCBvbmUgVSAmIFYgc2FtcGxlIGZyb20gdHdvIGlucHV0IFlVVjQ6MjowIGltYWdlcyBhbmQKLSAqICAgICAgICAgICAgICAgICAgQ29tcHV0ZSBmb3VyIFkgc2FtcGxlIGFuZCBvbmUgVSAmIFYgc2FtcGxlIGZvciBvdXRwdXQgWVVWNDoyOjAgaW1hZ2UKLSAqICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZSBmb2xsb3dpbmcsCi0gKiAgICAgICAgICAgICAgICAgIE91dChpLGopID0gYmxlbmRpbmdmYWN0b3IoaSxqKSAqIEluMShpLGopKyAobCAtIGJsZW5kaW5nZmFjdG9yKGksaikpICogSW4yKGksaikKLSAqICAgICAgICAgICAgICBlbmQgbG9vcCBjb2x1bW4KLSAqICAgICAgICAgIGVuZCBsb29wIHJvdy4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSAgVXNlciBTcGVjaWZpYyBQYXJhbWV0ZXIKLSAqIEBwYXJhbSAgIHBQbGFuZUluMTogKElOKSAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQgZm9yIFksIFUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIHBQbGFuZUluMjogKElOKSAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQgZm9yIFksIFUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQgZm9yIFksIFUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIFByb2dyZXNzOiAgKElOKSAgUHJvZ3Jlc3MgdmFsdWUgKHZhcmllcyBiZXR3ZWVuIDAgYW5kIDEwMDApCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IEVycm9yIGluIGhlaWdodAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBFcnJvciBpbiB3aWR0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdW5zaWduZWQgY2hhciBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwICh2b2lkICpwVXNlckRhdGEsIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZpQ29tSW1hZ2VQbGFuZSAqcFBsYW5lSW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBQbGFuZU91dCwgVUludDMyIFByb2dyZXNzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8vIF9fTTRWRkxfVFJBTlNJVElPTl9IX18KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9DbGlwLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfQ2xpcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjA3NjE2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9DbGlwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00VklGSV9DbGlwLmgKLSAqIEBicmllZiAgICAgICAgR2xvYmFsIFRhYmxlIGRlZmluaXRpb24KLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQ2xpcHBpbmcgYW5kIERpdmlzaW9uIHRhYmxlIGFkZHJlc3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgICAgX000VklGSV9DTElQX0hfCi0jZGVmaW5lICAgIF9NNFZJRklfQ0xJUF9IXwotCi0vKiBDbGlwcGluZyBtYXRyaXggZm9yIFJHQiB2YWx1ZXMgKi8KLUVYVEVSTiBDTlNUIE00VklGSV9VSW50OCAgICAqTTRWSUZJX0NsaXBUYWJsZV96ZXJvOwotLyogRGl2aXNpb24gdGFibGUgZm9yICg2NTUzNS94KTsgeCA9IDAgdG8gNTEyICovCi1FWFRFUk4gQ05TVCBNNFZJRklfVUludDE2ICAgICpNNFZJRklfRGl2VGFibGVfemVybzsKLQotI2VuZGlmIC8qIF9NNFZJRklfQ0xJUF9IXyAqLwotCi0vKiBFbmQgb2YgZmlsZSBNNFZJRklfQ2xpcC5oICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9EZWZpbmVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfRGVmaW5lcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDU5MWU1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9EZWZpbmVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFZJRklfRGVmaW5lcy5oCi0gKiBAYnJpZWYgICAgICAgIE1hY3JvIERlZmluaXRpb24KLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgdGhlIG1hY3JvIHVzZWQgaW4gdGhlIGZpbHRlciBsaWJyYXJ5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9NNFZJRklfREVGSU5FU19IXwotI2RlZmluZSBfTTRWSUZJX0RFRklORVNfSF8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBNYWNyb3MgdXNlZCBmb3IgY29sb3IgdHJhbnNmb3JtIFJHQjU2NSB0byBZVVYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgQ1NUX1JHQl8xNl9TSVpFIDIKLSNkZWZpbmUgWTE2KHIsIGcsIGIpIENMSVAoICAoICggKDgwNTkzICogcikrKDc3ODU1ICogZykrKDMwNzI4ICogYikpID4+IDE1KSkKLSNkZWZpbmUgVTE2KHIsIGcsIGIpIENMSVAoMTI4KyAoICggLSg0NTQ4MyAqIHIpLSg0MzkzNiAqIGcpKygxMzQ3NzEgKiBiKSkgPj4gMTUgKSkKLSNkZWZpbmUgVjE2KHIsIGcsIGIpIENMSVAoMTI4KyAoICggKDEzNDc3MSAqIHIpLSg1NTUzMiAqIGcpLSgyMTkxNyAqIGIpKSA+PiAxNSAgKSkKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgTWFjcm9zIHVzZWQgZm9yIGNvbG9yIHRyYW5zZm9ybSBZVVYgdG8gUkdCCi0gKiAgICBCID0gMS4xNjQoWSAtIDE2KSAgICAgICAgICAgICAgICAgICsgMi4wMTgoVSAtIDEyOCkKLSAqICBHID0gMS4xNjQoWSAtIDE2KSAtIDAuODEzKFYgLSAxMjgpIC0gMC4zOTEoVSAtIDEyOCkKLSAqICBSID0gMS4xNjQoWSAtIDE2KSArIDEuNTk2KFYgLSAxMjgpCi0gKiAgQWJvdmUgQ29udmVyc2lvbiBGb3JtdWxhIGlzIGltcGxlbWVudGVkIGZvciBmaXhlZCBwb2ludCBvcGVyYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2RlZmluZSBDU1RfUkdCXzI0X1NJWkUgMwotCi0jaWZkZWYgX19SR0JfVjFfXwotI2RlZmluZSBERU1BVFJJWChSeCxHeCxCeCxZeDM3LFV4LFZ4KSBcCi0gICAgUnggPSBDTElQKCgoWXgzNyArIChWeCAqIDUxKSArIDE2KSA+PiA1KSAtIDIyMyk7IFwKLSAgICBHeCA9IENMSVAoKChZeDM3IC0gKChVeCsoVng8PDEpKSAqIDEzKSArMTYpID4+IDUpICsgMTM1KTsgXAotICAgIEJ4ID0gQ0xJUCgoKFl4MzcgKyAoVXggKiA2NSkgKyAxNikgPj4gNSkgLSAyNzcpCi0jZWxzZQotI2RlZmluZSBERU1BVFJJWChSeCxHeCxCeCxZeDI1NjgsVXgsVngpIFwKLSAgICBSeCA9IENMSVAoKChZeDI1NjggKyAgICAgICAgICAgICAgICAgKFZ4ICogMHgzMzQzKSArIChNNFZJRklfSW50MzIpMHhmZmU0MDgwMCkgPj4gMTMpKTsgXAotICAgIEd4ID0gQ0xJUCgoKFl4MjU2OCAtIChVeCAqIDB4MGM5MikgLSAoVnggKiAweDFhMWUpICsgKE00VklGSV9JbnQzMikweDAwMTEwMTgwKSA+PiAxMykpOyBcCi0gICAgQnggPSBDTElQKCgoWXgyNTY4ICsgKFV4ICogMHg0MGNmKSAgICAgICAgICAgICAgICAgICAgKyAoTTRWSUZJX0ludDMyKTB4ZmZkZDQyMDApID4+IDEzKSk7Ci0jZW5kaWYgLyogX19SR0JfVjFfXyAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgUGFja2luZyBhbmQgVW5wYWNraW5nIGlzIGRpZmZlcmVudCBmb3IgbGl0dGxlIGFuZCBiaWcgZW5kaWFuCi0gKiAgciwgZywgYiwgUngsIEd4LCBCeCBhcmUgOCBiaXQgY29sb3IgdmFsdWUKLSAqICAgIGEsIGRhdGEgYXJlIDE2IGJpdCBwaXhlbCB2YWx1ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyogUGFjayBjb21wdXRhdGlvbnMgY29tbW9uIGZvciBsaXR0bGUgZW5kaWFuIGFuZCBiaWcgZW5kaWFuIG1vZGVzICovCi0jZGVmaW5lICAgIFBBQ0tfQkdSMjQocmdiX3B0cixSeCxHeCxCeCkge3JnYl9wdHJbMF0gPSAoTTRWSUZJX1VJbnQ4KUJ4OyByZ2JfcHRyWzFdID1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OClHeDsgcmdiX3B0clsyXSA9IChNNFZJRklfVUludDgpUng7fQotI2RlZmluZSAgICBQQUNLX1JHQjI0KHJnYl9wdHIsUngsR3gsQngpIHtyZ2JfcHRyWzBdID0gKE00VklGSV9VSW50OClSeDsgcmdiX3B0clsxXSA9XAotICAgICAgICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgpR3g7IHJnYl9wdHJbMl0gPSAoTTRWSUZJX1VJbnQ4KUJ4O30KLQotI2lmZGVmIEJJR19FTkRJQU4KLSNkZWZpbmUgICAgUEFDS19SR0I1NjUoYSwgUngsIEd4LCBCeCkgKCgoUnggPj4gMykgPDwgKDExICsgKGEpKSlcCi0gICAgICAgICAgICAgICAgIHwgKChHeCA+PiAyKSA8PCAoNSArIChhKSkpIHwgKChCeCA+PiAzKSA8PCAoYSkpKQotI2RlZmluZSAgICBQQUNLX0JHUjU2NShhLCBSeCwgR3gsIEJ4KSAoKChCeCA+PiAzKSA8PCAoMTEgKyAoYSkpKVwKLSAgICAgICAgICAgICAgICAgfCAoKEd4ID4+IDIpIDw8ICg1ICsgKGEpKSkgfCAoKFJ4ID4+IDMpIDw8IChhKSkpCi0jZGVmaW5lIEdFVF9SR0I1NjUociwgZywgYiwgZGF0YSkge2IgPSAoKGRhdGEpICYgMzEpOyBnID1cCi0gICAgICAgICAgICAgICAgICAgICAoKGRhdGEgPj4gNSkgJiA2Myk7IHIgPSAoKGRhdGEgPj4gMTEpICYgMzEpO30KLSNkZWZpbmUgR0VUX0JHUjU2NShiLCBnLCByLCBkYXRhKSBcCi0gICAgciA9ICgoZGF0YSkgJiAzMSk7IFwKLSAgICBnID0gKChkYXRhID4+IDUpICYgNjMpOyBcCi0gICAgYiA9ICgoZGF0YSA+PiAxMSkgJiAzMSApOwotI2Vsc2UgLyogTElUVExFIGVuZGlhbjogMHgxMjM0NTY3OCAtPiA3OCA1NiAzNCAxMiAqLwotI2RlZmluZSAgICBQQUNLX1JHQjU2NShhLCBSeCwgR3gsIEJ4KSAoKChCeCA+PiAzKSA8PCAoOCArIChhKSkpIFwKLSAgICAgICAgICAgICAgICAgIHwgKCgoR3ggPj4gMikmMHg3KSA8PCAoMTMgKyAoYSkpKSB8ICgoR3ggPj4gNSkgPDwgKGEpKSB8ICgoUnggPj4gMykgPDwgKDMgKyBhKSkpCi0jZGVmaW5lICAgIFBBQ0tfQkdSNTY1KGEsIFJ4LCBHeCwgQngpICgoKFJ4ID4+IDMpIDw8ICgxMSArIChhKSkpIFwKLSAgICAgICAgICAgICAgICAgIHwgKChHeCA+PiAyKSA8PCAoNSArIChhKSkpIHwgKChCeCA+PiAzKSA8PCAoYSkpKQotI2RlZmluZSBHRVRfUkdCNTY1KHIsIGcsIGIsIGRhdGEpIHsgYiA9IChNNFZJRklfVUludDgpKCgoZGF0YSkgJiAweDFGMDApID4+IDgpOyBnID1cCi0gICAgICAgICAgICAgKE00VklGSV9VSW50OCkoKCgoZGF0YSkgJiAweDcpIDw8IDMpIHwgKCgoZGF0YSkgJiAweEUwMDApID4+IDEzKSk7IHIgPVwKLSAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KSgoKGRhdGEpICYgMHhGOCkgPj4gMyk7fQotI2RlZmluZSBHRVRfQkdSNTY1KGIsIGcsIHIsIGRhdGEpIFwKLSAgICBiID0gKChkYXRhKSAmIDMxKTsgXAotICAgIGcgPSAoKGRhdGEgPj4gNSkgJiA2Myk7IFwKLSAgICByID0gKChkYXRhID4+IDExKSAmIDMxICk7Ci0jZW5kaWYgLyogQklHX0VORElBTiAqLwotCi0KLSNkZWZpbmUgQ1NUX1JHQl8yNF9TSVpFIDMKLSNkZWZpbmUgWTI0KHIsZyxiKSBDTElQKCggKCAoMTk1OTUgKiByKSArICgzODQ3MCAqIGcpICsgKDk0MzcgKiBiKSApID4+MTYpKQotI2RlZmluZSBVMjQocixnLGIpIENMSVAoMTI4ICsgKCAoIC0oMTEwNTkgKiByKSAtICgyMTcwOSAqIGcpICsgKDMyNzY4ICogYikpID4+MTYpKQotI2RlZmluZSBWMjQocixnLGIpIENMSVAoMTI4ICsgKCAoICgzMjc2OCAqIHIpIC0gKDI3NDI2ICogZykgLSAoNTMyOSAqIGIpKSAgPj4xNikpCi0jZGVmaW5lIEdFVF9SR0IyNChyLGcsYixzLG8pIHIgPSBzW29dOyBnID0gc1tvICsgMV07IGIgPSBzW28gKyAyXTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBNYWNybyBmb3IgY2xpcHBpbmcgdXNpbmcgdGhlIGNsaXBwaW5nIG1hdHJpeCBmb3IgUkdCIHZhbHVlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqIENsaXAgZnVuY3Rpb24gZW5zdXJlcyB2YWx1ZXMgd2l0aCByYW5nZSBvZiAwIGFuZCAyNTUgKi8KLSNkZWZpbmUgICAgICAgIENMSVAoeCkgICAgKihNNFZJRklfQ2xpcFRhYmxlX3plcm8gKyAoeCkpCi0jZGVmaW5lICAgICAgICBDTElQX09WRiAgICAgICAgNTAwCi0jZGVmaW5lICAgICBDTElQX0xVVF9TSVpFICAgICAoMjU2ICsgMiAqIENMSVBfT1ZGKQotLyoqIERpdmlzaW9uIHRhYmxlIGZvciBSR0I1NjUgdG8gSExTIGNvbnZlcnNpb24gKi8KLSNkZWZpbmUgICAgICAgIERJVkNMSVAoeCkgICAgKihNNFZJRklfRGl2VGFibGVfemVybyArICh4KSkKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBFbmRpYW5uZXNzIChkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgTGl0dGxlIEVuZGlhbikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZiAoIWRlZmluZWQoTElUVExFX0VORElBTikgJiYgIWRlZmluZWQoQklHX0VORElBTikpCi0vKiogRGVmYXVsdCBlbmRpYW4gc2V0dGluZyAqLwotI2RlZmluZSBMSVRUTEVfRU5ESUFOCi0jZW5kaWYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBPdGhlciBtYWNyb3MgYW5kIGRlZmluZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqIFlVViBwbGFuZSBpbmRleCAqLwotI2RlZmluZSBQTEFORVMgICAgMwotI2RlZmluZSBZUGxhbmUgICAgMAotI2RlZmluZSBVUGxhbmUgICAgMQotI2RlZmluZSBWUGxhbmUgICAgMgotCi0vKiogQ2hlY2sgZm9yIHZhbHVlIGlzIEVWRU4gKi8KLSNpZm5kZWYgSVNfRVZFTgotI2RlZmluZSBJU19FVkVOKGEpICAgICghKGEgJiAweDAxKSkKLSNlbmRpZgotCi0vKiBVc2VkIGZvciBmaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiAqLwotI2lmbmRlZiBNQVhfU0hPUlQKLSNkZWZpbmUgTUFYX1NIT1JUICAgIDB4MTAwMDAKLSNlbmRpZgotCi0jZW5kaWYgLyogX000VklGSV9ERUZJTkVTX0hfICovCi0KLS8qIEVuZCBvZiBmaWxlIE00VklGSV9EZWZpbmVzLmggKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0ZpbHRlcnNBUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9GaWx0ZXJzQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNkMmZjOWQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0ZpbHRlcnNBUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00VklGSV9GaWx0ZXJzQVBJLmgKLSAqIEBicmllZiAgICAgICAgRXh0ZXJuYWwgQVBJIGFuZCBEYXRhIGRlZmluaXRpb25zIGZvciB0aGUgdmlkZW8gZmlsdGVyIGxpYnJhcnkKLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhbmQgZGVjbGFyZXMgZGF0YSBjb21tb24gdG8gdGhlIHZpZGVvIGZpbHRlciBsaWJyYXJ5OgotICogICAgICAgICAgICAgICAgICAgIC0jIGRhdGEgdHlwZXMKLSAqICAgICAgICAgICAgICAgICAgICAtIyBlcnJvciBjb2RlcwotICogICAgICAgICAgICAgICAgICAgIC0jIGV4dGVybmFsIEFQSSdzCi0gKiAgICAgICAgICAgICAgICAgICAgLSMgQVBJIGxldmVsIHN0cnVjdHVyZSBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9NNFZJRklfRklMVEVSU0FQSV9IXwotCi0jZGVmaW5lIF9NNFZJRklfRklMVEVSU0FQSV9IXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotZXh0ZXJuICJDIiB7Ci0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0gICAgLyoqCi0gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICogICAgICAgICAgICAgICAgICAgIERhdGEgdHlwZXMgZGVmaW5pdGlvbgotICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICovCi0KLSAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgTTRWSUZJX1VJbnQ4OwotICAgIHR5cGVkZWYgY2hhciBNNFZJRklfSW50ODsKLSAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IE00VklGSV9VSW50MTY7Ci0gICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIE00VklGSV9VSW50MzI7Ci0gICAgdHlwZWRlZiBzaG9ydCBNNFZJRklfSW50MTY7Ci0gICAgdHlwZWRlZiBsb25nIE00VklGSV9JbnQzMjsKLSAgICB0eXBlZGVmIGZsb2F0IE00VklGSV9GbG9hdDsKLSAgICB0eXBlZGVmIGRvdWJsZSBNNFZJRklfRG91YmxlOwotICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBNNFZJRklfRXJyb3JDb2RlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgIEVycm9yIGNvZGVzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRWSUZJX09LICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBNNFZJRklfSU5WQUxJRF9QQVJBTSAgICAgICAgICAgIDcKLSNkZWZpbmUgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUICAgICAgICA4Ci0jZGVmaW5lIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIICAgICAgICA5Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgT3RoZXIgYmFzaWMgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgQ05TVCAgICBjb25zdAotI2RlZmluZSBFWFRFUk4gICAgZXh0ZXJuCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMICAgIDAKLQotI2VuZGlmCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFICAgIDAKLSNkZWZpbmUgVFJVRSAgICAhRkFMU0UKLQotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlcyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklGSV9JbWFnZVBsYW5lCi0gKiBAYnJpZWYgICAgICAgIFRleHR1cmUgKFlVVikgcGxhbmVzIHN0cnVjdHVyZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGRldGFpbHMgdGhlIGltYWdlIHBsYW5lcyBmb3IgdGhlIG91dHB1dCB0ZXh0dXJlczoKLSAqICAgICAgICAgICAgICAgIHNpemVzIChpbiBwaXhlbHMpIGFyZSBsdW1hIHBsYW5lIHNpemVzLCB0aGUgMyBwb2ludGVycyBwb2ludAotICogICAgICAgICAgICAgICAgdG8gdGhlIFksIFUgYW5kIFYgYnVmZmVycyB3aGljaCBzdG9yZSBkYXRhIGluIHBsYW5hciBmb3JtYXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICBNNFZJRklfVUludDMyIHVfd2lkdGg7ICAgLyoqPCBXaWR0aCBvZiBsdW1hIGluIHBpeGVsIHVuaXQgKi8KLSAgICAgICAgTTRWSUZJX1VJbnQzMiB1X2hlaWdodDsgIC8qKjwgSGVpZ2h0IG9mIGx1bWEgaW4gcGl4ZWwgdW5pdCAqLwotICAgICAgICBNNFZJRklfVUludDMyIHVfdG9wbGVmdDsgLyoqPCBQb2ludGVyIHRvIGZpcnN0IHRleHR1cmUgYWN0aXZlIHBpeGVsICovCi0gICAgICAgIE00VklGSV9VSW50MzIgdV9zdHJpZGU7ICAvKio8IFN0cmlkZSB2YWx1ZSAqLwotICAgICAgICBNNFZJRklfVUludDggKnBhY19kYXRhOyAgLyoqPCBQb2ludGVyIHRvIHRoZSBkYXRhICovCi0gICAgICAgIH0gTTRWSUZJX0ltYWdlUGxhbmU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklGSV9GcmFtaW5nRGF0YQotICogQGJyaWVmICAgICAgICBEYXRhIG5lY2Vzc2FyeSB0byBhZGQgYW4gb3ZlcmxheSBvbiBhbiBpbWFnZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGRldGFpbHMgdGhlIHBvc2l0aW9uIGFuZCB0aGUgZGF0YSBvZiB0aGUgb3ZlcmxheQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIE00VklGSV9VSW50MzIKLSAgICAgICAgICAgIG1feFBvc1N0ZXA7IC8qKjwgWCBwb3NpdGlvbmluZyBvZiB0aGUgb3ZlcmxheSB2cyBtYWluIHBpY3R1cmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCBwb3NpdGlvbmluZyBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSB2cyB0aGUgbWFpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1feFBvc1N0ZXAgbXVzdCBiZSBleHByZXNzZWQgYnkgc3RlcCBvZiAxJSBhbmQgYmV0d2VlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01MC8rNTAlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAlIG1lYW5zIG92ZXJsYXkgaXMgY2VudGVyZWQgdnMgbWFpbiBwaWN0dXJlIG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFggYWJzY2lzc2EuICovCi0gICAgICAgIE00VklGSV9VSW50MzIKLSAgICAgICAgICAgIG1feVBvc1N0ZXA7IC8qKjwgWSBwb3NpdGlvbmluZyBvZiB0aGUgb3ZlcmxheSB2cyBtYWluIHBpY3R1cmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWSBwb3NpdGlvbmluZyBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSB2cyB0aGUgbWFpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1feFBvc1N0ZXAgbXVzdCBiZSBleHByZXNzZWQgYnkgc3RlcCBvZiAxJSBhbmQgYmV0d2VlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTAvKzUwJS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwJSBtZWFucyBvdmVybGF5IGlzIGNlbnRlcmVkIHZzIG1haW4gcGljdHVyZSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZIGFic2Npc3NhLiAqLwotCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lCi0gICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgbV9pbWFnZVBsYW5lOyAvKio8IFBvaW50ZXIgdG8gdGhlIGZyYW1pbmcgaW1hZ2Ugd2l0aCBhbHBoYSBjaGFubmVsICovCi0gICAgICAgIH0gTTRWSUZJX0ZyYW1pbmdEYXRhOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJRklfSExTb2Zmc2V0Ci0gKiBAYnJpZWYgICAgICAgIEhMUyBvZmZzZXQgc3RydWN0dXJlCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaGF2ZSB0aGUgaHVlLCBzYXR1cmF0aW9uIGFuZCBsaWdodG5lc3MgdmFsdWUKLSAqICAgICAgICAgICAgICAgIGZvciBxdWFsaXR5IGVuaGFuY2VtZW50LiBSYW5nZSBvZiB2YWx1ZXMgbmVjY2Vzc2FyaWx5IGJlCi0gKiAgICAgICAgICAgICAgICBodWUgPSAtMzYwIHRvIDM2MCwgc2F0ID0gMCB0byAxMDAgYW5kIGxpZ2h0ID0gMCB0MCAxMDAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICBNNFZJRklfSW50MTYgaHVlOyAgIC8qKjwgSHVlIG9mZnNldCAqLwotICAgICAgICBNNFZJRklfSW50MTYgc2F0OyAgIC8qKjwgU2F0dXJhdGlvbiBvZmZzZXQgKi8KLSAgICAgICAgTTRWSUZJX0ludDE2IGxpZ2h0OyAvKio8IExpZ2h0IG9mZnNldCAqLwotICAgICAgICB9IE00VklGSV9ITFNvZmZzZXQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklGSV9UcmFuZm9ybWF0aW9uCi0gKiBAYnJpZWYgICAgICAgIEltYWdlIFRyYW5mb3JtYXRpb24gU3RydWN0dXJlCi0gKiBAbm90ZSAgICAgICAgSW1hZ2UgVHJhbmZvcm1hdGlvbiBSZXF1ZXN0Ci0gKiAgICAgICAgICAgICAgICByb3RhdGlvbiA6IDEgLT4gKzkwZGVnIFJvdGF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgLT4gLTkwZGVnIFJvdGF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLT4gIE5vIFJvdGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgTTRWSUZJX0ludDMyIGkzMl9yb3RhdGlvbjsgLyoqPCBSb3RhdGlvbiBGbGFnICAgICAgICAqLwotICAgICAgICB9IE00VklGSV9UcmFuZm9ybWF0aW9uOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJRklfcENvbnRleHQKLSAqIEBicmllZiAgICAgICAgTmV3IFN0cnVjdHVyZXMKLSAqIEBub3RlICAgICAgICAtIyBTdHJ1Y3R1cmUgb2YgTTRWSUZJX0hMU29mZnNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIE00VklGSV9ITFNvZmZzZXQgaGxzT2Zmc2V0OyAvKio8IEhMUyBvZmZzZXQgc3RydWN0dXJlICovCi0gICAgICAgIH0gTTRWSUZJX3BDb250ZXh0OwotCi0gICAgLyoKLSAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgQVBJIGZ1bmN0aW9ucwotICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICovCi0KLSAgICAvKio8IEVmZmVjdCBmaWx0ZXJzICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXBpYVlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbnRyYXN0WVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfTmVnYXRpdmVZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9GbGlwWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfTWlycm9yWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUm90YXRlMTgwWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUm90YXRlOTBSaWdodFlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwTGVmdFlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbG9yUllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbG9yR1lVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbG9yQllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0ZyYW1pbmdSR0I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9GcmFtaW5nWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEh1ZUluWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbGRZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9XYXJtWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0vKiAgICAgICAgICAgICAgICBBRFMgQ29tcGlsZXIgICAgICAgICAgICAgICAgKi8KLQotLyogICAgICAgIEdlbmVyaWMgQVJNIGFzc2VtYmx5IGZ1bmN0aW9ucyAgICAgICAgKi8KLSNpZiBkZWZpbmVkIEFEU19BUk0KLQotICAgIC8qKiBBcHBseSBncmF5c2NhbGUgZWZmZWN0IFJHQjU2NXRvUkdCNTY1ICovCi0KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgUkdCODg4dG9SR0I4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBSR0I1NjV0b1JHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSR0I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I1NjV0b1lVVjQyMEFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQkdSNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjBBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIyIHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfVVlWWXRvWVVWNDIwQWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMCB0byBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvUkdCNTY1QWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NUFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodEFkc0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0QWRzQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRBZHNBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEFkc0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjVBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpbkJHUjU2NUFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotI2RlZmluZSBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMEFkc0FybQotI2RlZmluZSBNNFZJRklfQkdSNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9CR1I1NjV0b1lVVjQyMEFkc0FybQotI2RlZmluZSBNNFZJRklfVVlWWXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1VZVll0b1lVVjQyMEFkc0FybQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b1JHQjU2NUFkc0FybQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b0JHUjU2NUFkc0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUFkc0FybQotCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRBZHNBcm0KLQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0ICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRBZHNBcm0KLQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0ICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5SR0I1NjVBZHNBcm0KLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5CR1I1NjVBZHNBcm0KLQotLyogICAgICAgIEFSTTlFIGFzc2VtYmx5IGZ1bmN0aW9ucyAgICAgICAgKi8KLSNlbGlmIGRlZmluZWQgQURTX0FSTTlFCi0KLSAgICAvKiogQXBwbHkgZ3JheXNjYWxlIGVmZmVjdCBSR0I1NjV0b1JHQjU2NSAqLwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjg4OHRvWVVWODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNTY1dG9ZVVY1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJHQjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIEJHUjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0JHUjU2NXRvWVVWNDIwQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIyIHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfVVlWWXRvWVVWNDIwQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwIHRvIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRBZHNBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0QWRzQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEFkc0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRBZHNBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luQkdSNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIFlVVjQyMHRvWVVWNDIwIGZyb20gUUNJRiB0byBRVkdBKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0FBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0EqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQUFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0Egd2l0aCByb3RhdGlvbiArOTAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUkFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0Egd2l0aCByb3RhdGlvbiAtOTAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STEFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLS8qKiBSZXNpemVzIFlVVjQyMCBQbGFuYXIgSW1hZ2UgYW5kIHN0b3JlcyBpbiBZVVY0MjAgTGluZWFyIGZvcm1hdCB3aXRoL3dpdGhvdXQgK29yLTkwIHJvdGF0aW9uKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFBsYW5hcnRvWVVWNDIwTGluZWFyQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0jZGVmaW5lIE00VklGSV9SR0I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1JHQjU2NXRvWVVWNDIwQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX0JHUjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjBBZHNBcm05RQotI2RlZmluZSBNNFZJRklfVVlWWXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1VZVll0b1lVVjQyMEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvUkdCNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9CR1I1NjVBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9TZXRITFNpblJHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5SR0I1NjVBZHNBcm05RQotI2RlZmluZSBNNFZJRklfU2V0SExTaW5CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luQkdSNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0EgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0EgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUlIgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkwgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JMQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFBsYW5hcnRvWVVWNDIwTGluZWFyICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBQbGFuYXJ0b1lVVjQyMExpbmVhckFkc0FybTlFCi0vKiAgICAgICAgICAgICAgICBHQ0MgQ29tcGlsZXIgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBHZW5lcmljIEFSTSBhc3NlbWJseSBmdW5jdGlvbnMgICAgICAgICovCi0KLSNlbGlmIGRlZmluZWQgR0NDX0FSTQotCi0gICAgLyoqIEFwcGx5IGdyYXlzY2FsZSBlZmZlY3QgUkdCNTY1dG9SR0I1NjUgKi8KLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfR3JheXNjYWxlUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY4ODh0b1lVVjg4OCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjU2NXRvWVVWNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJHQjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwR2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBCR1I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9CR1I1NjV0b1lVVjQyMEdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NUdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjVHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1R2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0R2NjQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRHY2NBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0R2NjQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRHY2NBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjVHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luQkdSNTY1R2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0jZGVmaW5lIE00VklGSV9SR0I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1JHQjU2NXRvWVVWNDIwR2NjQXJtCi0jZGVmaW5lIE00VklGSV9CR1I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwR2NjQXJtCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvUkdCNTY1R2NjQXJtCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b0JHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvQkdSNTY1R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUdjY0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5SR0I1NjVHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5CR1I1NjVHY2NBcm0KLQotLyogICAgICAgIEFSTTlFIGFzc2VtYmx5IGZ1bmN0aW9ucyAgICAgICAgKi8KLSNlbGlmIGRlZmluZWQgR0NDX0FSTTlFCi0KLSAgICAvKiogQXBwbHkgZ3JheXNjYWxlIGVmZmVjdCBSR0I1NjV0b1JHQjU2NSAqLwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjg4OHRvWVVWODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNTY1dG9ZVVY1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1lVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUkdCNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjBHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQkdSNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjBHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NUdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NUdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0R2NjQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEdjY0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEdjY0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRHY2NBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjVHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luQkdSNTY1R2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSNkZWZpbmUgTTRWSUZJX1JHQjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjBHY2NBcm05RQotI2RlZmluZSBNNFZJRklfQkdSNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9CR1I1NjV0b1lVVjQyMEdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvUkdCNTY1R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9CR1I1NjVHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9TZXRITFNpbkJHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luQkdSNTY1R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5SR0I1NjVHY2NBcm05RQotCi0vKiBUSSBDQ1MgYXNzZW1ibHkgZmlsZXMgKi8KLSNlbGlmIGRlZmluZWQgVEk0MTFfQVJNOUUKLQotICAgIC8qKiBBcHBseSBncmF5c2NhbGUgZWZmZWN0IFJHQjU2NXRvUkdCNTY1ICovCi0KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWODg4dG9ZVVY4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY1NjV0b1lVVjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgKFBsYW5hcikgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIChQbGFuYXIpIHRvIFJlc2l6ZWQgUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgKFBsYW5hcikgdG8gUmVzaXplZCBSR0I4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMChQbGFuYXIpIHRvIFJlc2l6ZWQgYW5kIFJvdGF0ZWQgKC05MCkgUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwKFBsYW5hcikgdG8gUmVzaXplZCBhbmQgUm90YXRlZCAoKzkwKSBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAoUGxhbmFyKSB0byBSZXNpemVkIFlVVjQyMChQbGFuYXIpICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBZVVY0MjAoUGxhbmFyKSBvZiBRQ0lGIHRvIFJHQjU2NSBvZiBRVkdBIHJlc29sdXRpb24gKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0Eodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLS8qKiBSZXNpemUgWVVWNDIwKFBsYW5hcikgb2YgUUNJRiB0byBSR0I1NjUgb2YgUVZHQSByZXNvbHV0aW9uIHdpdGggcm90YXRpb24oLTkwKSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotLyoqIFJlc2l6ZSBZVVY0MjAoUGxhbmFyKSBvZiBRQ0lGIHRvIFJHQjU2NSBvZiBRVkdBIHJlc29sdXRpb24gd2l0aCByb3RhdGlvbigrOTApICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvUkdCNTY1VGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1VGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0VGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRUaTQxMUFybTlFCi0KLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0EgICAgICAgTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0FUaTQxMUFybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBVGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STCAgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkxUaTQxMUFybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSICBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUlRpNDExQXJtOUUKLQotLyogICAgICAgIEFOU0kgQyBGdW5jdGlvbnMgICAgICAgICovCi0jZWxzZQotCi0gICAgLyoqIEFwcGx5IGdyYXlzY2FsZSBlZmZlY3QgUkdCNTY1dG9SR0I1NjUgKi8KLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfR3JheXNjYWxlUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY4ODh0b1lVVjg4OCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjU2NXRvWVVWNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJHQjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBCUkc1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9CR1I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQlJHODg4IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSODg4dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVPdXRbM10pOwotICAgIC8qKiBSR0I4ODggdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSk7Ci0KLSAgICAvKiogWVVWNDIyIHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfVVlWWXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMCB0byBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1IyNCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1IyNCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBSR0IyNCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0IyNCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1lVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodCgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0KAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpblJHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luQkdSNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKlJlc2l6ZSBZVVY0MjB0b1lVVjQyMCBmcm9tIFFDSUYgdG8gUVZHQSovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0EqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqUmVzaXplIFlVVjQyMHRvUkdCNTY1IGZyb20gUUNJRiB0byBRVkdBIHdpdGggcm90YXRpb24gKzkwKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUlIodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKlJlc2l6ZSBZVVY0MjB0b1JHQjU2NSBmcm9tIFFDSUYgdG8gUVZHQSB3aXRoIHJvdGF0aW9uIC05MCovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JMKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLS8qKiBSZXNpemVzIFlVVjQyMCBQbGFuYXIgSW1hZ2UgYW5kIHN0b3JlcyBpbiBZVVY0MjAgTGluZWFyIGZvcm1hdCB3aXRoL3dpdGhvdXQgK29yLTkwIHJvdGF0aW9uKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFBsYW5hcnRvWVVWNDIwTGluZWFyKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotLyoqIFJlc2l6ZXMgWVVWNDIwIFBsYW5hciBJbWFnZSBhbmQgc3RvcmVzIGluIFlVVjQyMiBJbnRlcmxlYXZlZCBmb3JtYXQKLSAgICAgd2l0aC93aXRob3V0ICtvci05MCByb3RhdGlvbiovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBQbGFuYXJ0b1lVVjQyMkludGVybGVhdmVkKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSNlbmRpZgotCi0gICAgLyoqIGRlZmluaXRpb24gb2YgdGhlIGNvbnZlcnRlciBmdW5jdGlvbiB0eXBlcyAqLwotCi0gICAgdHlwZWRlZiBNNFZJRklfVUludDggTTRWSUZJX1BsYW5Db252ZXJ0ZXJGdW5jdGlvblR5cGUodm9pZAotICAgICAgICAqcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBpbiwgTTRWSUZJX0ltYWdlUGxhbmUqIG91dCk7Ci0KLSAgICAvKiogZGVmaW5pdGlvbiBvZiB0aGUgcHJlcHJvY2Vzc2luZyBmdW5jdGlvbiB0eXBlcyAqLwotICAgIHR5cGVkZWYgTTRWSUZJX1VJbnQ4IE00VklGSV9QcmVwcm9jZXNzRnVuY3Rpb25UeXBlKHZvaWQKLSAgICAgICAgKnBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogaW4sIE00VklGSV9JbWFnZVBsYW5lKiBvdXQpOwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFyVG9ZVVY0MjBTZW1pcGxhbmFyKHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZW1pcGxhbmFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotCi19Ci0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX000VklGSV9GSUxURVJTQVBJX0hfICovCi0KLS8qIEVuZCBvZiBmaWxlIE00VklGSV9GaWx0ZXJzQVBJLmggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VlBQX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWUFBfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2NWNhMjIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWUFBfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlBQX0FQSS5oCi0gKiBAYnJpZWYgICAgVmlkZW8gcHJlcHJvY2Vzc2luZyBBUEkgcHVibGljIGZ1bmN0aW9ucyBwcm90b3R5cGVzLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRWUFBfQVBJX0gKLSNkZWZpbmUgTTRWUFBfQVBJX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBjb21tb24gT1NBTCB0eXBlcyAqLwotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBjb21tb24gT1NBTCBlcnJvcnMgKi8KLQotLyoqCi0gKiAgICBJbmNsdWRlIFZpZGVvIGZpbHRlcnMgaW50ZXJmYWNlIGRlZmluaXRpb24gKGZvciB0aGUgTTRWSUZJX0ltYWdlUGxhbmUgdHlwZSkgKi8KLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQdWJsaWMgdHlwZSBvZiB0aGUgVmlkZW8gUHJlcHJvY2Vzc2luZyBleGVjdXRpb24gY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogICAgTTRWUFBfQ29udGV4dDsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWUFBfa0lZVVY0MjA9MCwgICAgLyoqPCBZVVYgNDoyOjAgcGxhbmFyIChzdGFuZGFyZCBpbnB1dCBmb3IgbXBlZy00IHZpZGVvKSAqLwotICAgIE00VlBQX2tJWVVWNDIyLCAgICAgICAgLyoqPCBZVVY0MjIgcGxhbmFyICovCi0gICAgTTRWUFBfa0lZVVlWLCAgICAgICAgLyoqPCBZVVY0MjIgaW50ZXJsYWNlZCwgbHVtYSBmaXJzdCAqLwotICAgIE00VlBQX2tJVVlWWSwgICAgICAgIC8qKjwgWVVWNDIyIGludGVybGFjZWQsIGNocm9tYSBmaXJzdCAqLwotICAgIE00VlBQX2tJSlBFRywgICAgICAgIC8qKjwgSlBFRyBjb21wcmVzc2VkIGZyYW1lcyAqLwotICAgIE00VlBQX2tJUkdCNDQ0LCAgICAgICAgLyoqPCBSR0IgMTIgYml0cyA0OjQ6NCAqLwotICAgIE00VlBQX2tJUkdCNTU1LCAgICAgICAgLyoqPCBSR0IgMTUgYml0cyA1OjU6NSAqLwotICAgIE00VlBQX2tJUkdCNTY1LCAgICAgICAgLyoqPCBSR0IgMTYgYml0cyA1OjY6NSAqLwotICAgIE00VlBQX2tJUkdCMjQsICAgICAgICAvKio8IFJHQiAyNCBiaXRzIDg6ODo4ICovCi0gICAgTTRWUFBfa0lSR0IzMiwgICAgICAgIC8qKjwgUkdCIDMyIGJpdHMgICovCi0gICAgTTRWUFBfa0lCR1I0NDQsICAgICAgICAvKio8IEJHUiAxMiBiaXRzIDQ6NDo0ICovCi0gICAgTTRWUFBfa0lCR1I1NTUsICAgICAgICAvKio8IEJHUiAxNSBiaXRzIDU6NTo1ICovCi0gICAgTTRWUFBfa0lCR1I1NjUsICAgICAgICAvKio8IEJHUiAxNiBiaXRzIDU6Njo1ICovCi0gICAgTTRWUFBfa0lCR1IyNCwgICAgICAgIC8qKjwgQkdSIDI0IGJpdHMgODo4OjggKi8KLSAgICBNNFZQUF9rSUJHUjMyICAgICAgICAvKio8IEJHUiAzMiBiaXRzICAqLwotfSBNNFZQUF9JbnB1dFZpZGVvRm9ybWF0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFByb3RvdHlwZSBvZiB0aGUgbWFpbiB2aWRlbyBwcmVwcm9jZXNzaW5nIGZ1bmN0aW9uCi0gKiBAbm90ZSAgICBQcmVwcm9jZXNzIG9uZSBmcmFtZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSBWUFAuCi0gKiBAcGFyYW0gICAgcFBsYW5lSW46ICAgIChJTk9VVCkgICAgSW5wdXQgSW1hZ2UKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQ6ICAgIChJTk9VVCkgICAgT3V0cHV0IEltYWdlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00VlBQX2FwcGx5X2ZjdCkgKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KTsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlBQX2luaXRWaWRlb1ByZXByb2Nlc3NpbmcoTTRWUFBfQ29udGV4dCogcENvbnRleHQpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgZXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBWaWRlbyBQcmVwcm9jZXNzaW5nIGNvbXBvbmVudC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChPVVQpIEV4ZWN1dGlvbiBjb250ZXh0IGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb24uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5LgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE5VTEwgKGRlYnVnIG9ubHkpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZQUF9pbml0VmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQqIHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWUFBfYXBwbHlWaWRlb1ByZXByb2Nlc3NpbmcoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLSAqIEBicmllZiAgICBQcmVwcm9jZXNzIG9uZSBmcmFtZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFBsYW5lSW46ICAgIChJTk9VVCkgICAgSW5wdXQgSW1hZ2UKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQ6ICAgIChJTk9VVCkgICAgT3V0cHV0IEltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBQbGFuZUluIG9yIHBQbGFuZU91dCBpcyBOVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6IFZpZGVvIFByZXByb2Nlc3NpbmcgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZQUF9hcHBseVZpZGVvUHJlcHJvY2Vzc2luZyhNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZQUF9jbGVhblVwVmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgVGhpcyBtZXRob2QgZnJlZXMgdGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgVmlkZW8gUHJlcHJvY2Vzc2luZyBjb21wb25lbnQuCi0gKiAgICAgICAgICAgIEFueSBmdXJ0aGVyIHVzYWdlIG9mIHRoZSBjb250ZXh0IHdpbGwgbGVhZCB0byB1bnByZWRpY3RhYmxlIHJlc3VsdC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE5VTEwgKGRlYnVnIG9ubHkpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZQUF9jbGVhblVwVmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZQUF9zZXRWaWRlb1ByZXByb2Nlc3NpbmdNb2RlKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VkVTX0lucHV0VmlkZW9Gb3JtYXQgZm9ybWF0KQotICogQGJyaWVmICAgIFRoaXMgbWV0aG9kIGFwcGx5IHRoZSB2aWRlbyBwcmVwcm9jZXNzaW5nIHRvIHRoZSBpbnB1dCBwbGFuZS4gUmVzdWx0IGlzIHB1dCBpbnRvIHRoZQotICogICAgICAgICAgIG91dHB1dCBwbGFuLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHBhcmFtICAgIGZvcm1hdCAgOiAgICAoSU4pIEZvcm1hdCBvZiBpbnB1dCBwbGFuZSAocmdiLCB5dXYsIC4uLikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWUFBfc2V0VmlkZW9QcmVwcm9jZXNzaW5nTW9kZShNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZQUF9JbnB1dFZpZGVvRm9ybWF0IGZvcm1hdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIERlZmluaXRpb24gb2YgdGhlIGVycm9ycyBzcGVjaWZpYyB0byB0aGlzIG1vZHVsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKjwgSW5wdXQgYW5kIG91dHB1dCBwbGFuZXMgaGF2ZSBpbmNvbXBhdGlibGUgcHJvcGVydGllcyAqLwotI2RlZmluZSBNNFZQUF9FUlJfSU1DT01QQVRJQkxFX0lOX0FORF9PVVRfUExBTkVTICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgIE00UFJFUFJPQ0VTU19WSURFTywgMHgwMDAwMDEpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogTTRWUFBfQVBJX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRXUklURVJfY29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFdSSVRFUl9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWJiN2I4Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFdSSVRFUl9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAvKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00V1JJVEVSX2NvbW1vbi5oCi0gKiBAYnJpZWYgICAgVkVTIHdyaXRlcnMgc2hlbGwgaW50ZXJmYWNlLgotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHR5cGVzIGludGVybmFsbHkgdXNlZCBieSB0aGUgVkVTIHRvIGFic3RyYWN0IHdyaXRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRXUklURVJfQ09NTU9OX0hfXwotI2RlZmluZSBfX000V1JJVEVSX0NPTU1PTl9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiICAgLyogZm9yIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyICovCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIiAgIC8qIGZvciBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqLwotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiICAgICAvKiBmb3IgTTRPU0FfT1BUSU9OX0lEX0NSRUFURSgpICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiICAgICAgIC8qIGZvciBNNFdSSVRFUl9DT01NT04gKi8KLQotI2luY2x1ZGUgIk00U1lTX1N0cmVhbS5oIiAgICAgICAvKiBmb3IgTTRTWVNfU3RyZWFtSUQgKi8KLSNpbmNsdWRlICJNNFNZU19BY2Nlc3NVbml0LmgiICAgLyogZm9yIE00U1lTX0FjY2Vzc1VuaXQgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNUDRXIEVycm9ycyAmIFdhcm5pbmdzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00V0FSX1dSSVRFUl9TVE9QX1JFUSAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00V1JJVEVSX0NPTU1PTiAsMHgwMDAwMDEpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhbGFpYmxlIG91dHB1dCBmaWxlIGZvcm1hdC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFdSSVRFUl9rVW5rbm93bj0tMSwKLSAgICBNNFdSSVRFUl9rM0dQUD0wLCAgICAgICAgICAgIC8qKjwgM0dQUCBjb21wbGlhbnQgZmlsZSAqLwotICAgIE00V1JJVEVSX2tBVkk9MSwgICAgICAgICAgICAvKio8IEFWSSBmaWxlICovCi0gICAgTTRXUklURVJfa0FNUj0yLCAgICAgICAgICAgIC8qKjwgQU1SIGZpbGUgKi8KLSAgICBNNFdSSVRFUl9rTkVUV09SSzNHUFA9MywgICAgLyoqPCAzR1BQIHZpYSBUQ1AgKi8KLSAgICBNNFdSSVRFUl9rUENNPTQsICAgICAgICAgICAgLyoqPCBQQ00gZmlsZSAqLwotICAgIE00V1JJVEVSX2tKUEVHPTUsICAgICAgICAgICAgLyoqPCBKUEVHIEVYSUYgd3JpdGVyICovCi0gICAgTTRXUklURVJfa01QMz02LCAgICAgICAgICAgIC8qKjwgTVAzIHdyaXRlciAqLwotCi0gICAgTTRXUklURVJfa1R5cGVfTkIgIC8qIG51bWJlciBvZiB3cml0ZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotCi19IE00V1JJVEVSX091dHB1dEZpbGVUeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgTTRXUklURVJfT3B0aW9uSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW1zIGRlZmluZXMgYWxsIGF2YWxhaWJsZSBvcHRpb25zLiBBbGwgdGhlIHJldXR1cm5lZCB2YWx1ZXMgYXJlIGluCi0gKiAgICAgICAgICAgTTRPU0FfVUludDMyIHR5cGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFdSSVRFUl9rTWF4QVVTaXplICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUR8TTRfV1JJVEUsIE00V1JJVEVSX0NPTU1PTiwgMHgwMSksCi0gICAgTTRXUklURVJfa01heENodW5ja1NpemUgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEfE00X1dSSVRFLCBNNFdSSVRFUl9DT01NT04sIDB4MDIpLAotICAgIE00V1JJVEVSX2tGaWxlU2l6ZSAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUQgICAgICAgICAgICAsIFwKLSAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDAzKSwgIC8qKjwgRmlsZSBzaXplIGlmIHRoZSBwcm9jZXNzIHdhcyBlbmRlZCB3aGVuIHdlIGNhbGwgdGhlIG1ldGhvZCAqLwotICAgIE00V1JJVEVSX2tGaWxlU2l6ZUF1ZGlvRXN0aW1hdGVkPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDQpLCAgICAvKio8IEZpbGUgc2l6ZSBpZiB0aGUgcHJvY2VzcyB3YXMgZW5kZWQgd2hlbiB3ZSBjYWxsIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgZXN0aW1hdGVkIHNpemUgZm9yIGF1ZGlvICovCi0gICAgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDA1KSwgICAgLyoqPCBTdHJpbmcgZW1iZWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZShTVyAtIFZFUykgKi8KLSAgICBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDYpLCAgICAvKio8IFZlcnNpb24gZW1iZWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotICAgIE00V1JJVEVSX2tJbnRlZ3JhdGlvblRhZyAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwNyksICAgIC8qKjwgU3RyaW5nIGVtYmVkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgKGNoYXJbNjBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbnRlZ3JhdGlvbiBwdXJwb3NlKSAqLwotICAgIE00V1JJVEVSX2tNYXhGaWxlU2l6ZSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICwgXAotICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDgpLCAgICAvKio8IE1heGltdW0gZmlsZSBzaXplIGxpbWl0YXRpb24gKi8KLSAgICBNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDkpLCAgICAvKio8IE1heGltdW0gZmlsZSBkdXJhdGlvbiBsaW1pdGF0aW9uICovCi0gICAgTTRXUklURVJfa1NldEZ0eXBCb3ggICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDBBKSwgICAgLyoqPCBTZXQgJ2Z0eXAnIGF0b20gKi8KLSAgICBNNFdSSVRFUl9rTWV0YURhdGEgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwQiksICAgIC8qKjwgQWRkaXRpb25uYWwgaW5mb3JtYXRpb24gdG8gc2V0IGluIHRoZSBmaWxlICovCi0gICAgTTRXUklURVJfa0RTSSAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsIFwKLSAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDBDKSwgICAgLyoqPCBUbyBzZXQgRFNJIG9mIHRoZSBmaWxlIChEZWNvZGVyIHNwZWNpZmMgaW5mbykgKi8KLSAgICBNNFdSSVRFUl9rSnBlZ1Jlc2VydmVGUERhdGEgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MEQpLCAgICAvKio8IFJlc2VydmUgc29tZSBzcGFjZSBpbiB0aGUgZmlsZSBmb3IgSlBFRyBmYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBkYXRhICovCi0gICAgTTRXUklURVJfa0pwZWdTZXRGUERhdGEgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICwgXAotICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MEUpLCAgICAvKio8IFdyaXRlIEZhc3QgUHJvY2Vzc2luZyBEYXRhIGluIHRoZSBmaWxlKi8KLSAgICAvKiArIENSTFY2Nzc1IC1ILjI2NCB0cmltbWluZyAqLwotICAgIE00V1JJVEVSX2tNVUxfUFBTX1NQUyAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsIE00V1JJVEVSX0NPTU1PTiwgMHgwRikKLSAgICAvKiAtIENSTFY2Nzc1IC1ILjI2NCB0cmltbWluZyAqLwotfSBNNFdSSVRFUl9PcHRpb25JRDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9IZWFkZXIKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBidWZmZXIgd2hlcmUgYW4gaGVhZGVyIGlzIHB1dC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHI4ICAgIHBCdWY7ICAgICAgICAvKio8IEJ1ZmZlciBmb3IgdGhlIGhlYWRlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICBTaXplOyAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBkYXRhICovCi19IE00V1JJVEVSX0hlYWRlcjsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3BlY2lmaWMgdmlkZW8gc3RyZWFtIGluZm9zLCBleHRlbnNpb24gdG8KLSAqICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDMyICAgIGhlaWdodDsgICAgICAgICAgICAgICAgLyoqPCBGcmFtZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgd2lkdGg7ICAgICAgICAgICAgICAgIC8qKjwgRnJhbWUgV2lkdGggKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgZnBzOyAgICAgICAgICAgICAgICAvKio8IFRhcmdldHRlZCBmcmFtZXJhdGUgb2YgdGhlIHZpZGVvICovCi0gICAgTTRXUklURVJfSGVhZGVyICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgLyoqPCBTZXF1ZW5jZSBoZWFkZXIgb2YgdGhlIHZpZGVvIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIgc2V0IHRvIE5VTEwgaWYgbm8gaGVhZGVyIHByZXNlbnQgKi8KLX0gTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3BlY2lmaWMgYXVkaW8gc3RyZWFtIGluZm9zLCBleHRlbnNpb24gdG8KLSAgICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDMyICAgIG5iU2FtcGxlc1BlclNlYzsgICAgLyoqPCBOdW1iZXIgb2YgU2FtcGxlcyBwZXIgc2Vjb25kICovCi0gICAgTTRPU0FfVUludDE2ICAgIG5iQml0c1BlclNhbXBsZTsgICAgLyoqPCBOdW1iZXIgb2YgQml0cyBpbiAxIHNhbXBsZSAqLwotICAgIE00T1NBX1VJbnQxNiAgICBuYkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgTTRXUklURVJfSGVhZGVyICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgLyoqPCBEZWNvZGVyIFNwZWNpZmljIEluZm8gb2YgdGhlIGF1ZGlvc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyIHNldCB0byBOVUxMIGlmIG5vIERTSSBwcmVzZW50ICovCi19IE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFdSSVRFUl9PcmllbnRhdGlvbgotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBwb3NzaWJsZSBvcmllbnRhdGlvbiBvZiBhIGZyYW1lIGFzIGRlc2NyaWJlZAotICogICAgICAgICAgICBpbiB0aGUgRVhJRiBzdGFuZGFyZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvblVua25vd24gPSAwLAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uVG9wTGVmdCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvblRvcFJpZ2h0LAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uQm90dG9tUmlnaHQsCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25Cb3R0b21MZWZ0LAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uTGVmdFRvcCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvblJpZ2h0VG9wLAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uUmlnaHRCb3R0b20sCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25MZWZ0Qm90dG9tCi19TTRXUklURVJfT3JpZW50YXRpb24gOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9NZXRhRGF0YQotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWxsIHRoZSBtZXRhIGRhdGEgdG8gc3RvcmUgaW4gdGhlIGVuY29kZWQgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBQaG9uZU1hbnVmYWN0dXJlciA7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgUGhvbmVNb2RlbCA7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgQXJ0aXN0IDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBDb3B5cmlnaHQgOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIFNvZnR3YXJlIDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBDcmVhdGlvbkRhdGU7Ci0gICAgTTRXUklURVJfT3JpZW50YXRpb24gICAgT3JpZW50YXRpb24gOwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgV2lkdGggOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIEhlaWdodCA7Ci0KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBUaHVtYm5haWxXaWR0aCA7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgVGh1bWJuYWlsSGVpZ2h0IDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIFRodW1ibmFpbFByZXNlbmNlIDsKLX1NNFdSSVRFUl9NZXRhRGF0YTsKLQotCi10eXBlZGVmIHZvaWQqIE00V1JJVEVSX0NvbnRleHQ7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFdSSVRFUl9vcGVuV3JpdGUpICAgICAgICAoTTRXUklURVJfQ29udGV4dCogaENvbnRleHQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0cHV0RmlsZURlc2NyaXB0b3IsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVyUG9pbnRlcixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB0ZW1wRmlsZURlc2NyaXB0b3IsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkZXJQb2ludGVyKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFdSSVRFUl9hZGRTdHJlYW0pICAgICAgICAoTTRXUklURVJfQ29udGV4dCAgcENvbnRleHQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbipzdHJlYW1EZXNjcmlwdGlvbik7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRXUklURVJfc3RhcnRXcml0aW5nKSAgICAoTTRXUklURVJfQ29udGV4dCAgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00V1JJVEVSX2Nsb3NlV3JpdGUpICAgICAgICAoTTRXUklURVJfQ29udGV4dCAgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00V1JJVEVSX3NldE9wdGlvbikgICAgICAgIChNNFdSSVRFUl9Db250ZXh0ICBwQ29udGV4dCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRXUklURVJfZ2V0T3B0aW9uKSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQgIHBDb250ZXh0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UKLSAqIEBicmllZiAgICBEZWZpbmVzIGFsbCB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBhIHdyaXRlciBzaGVsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlCi17Ci0gICAgTTRXUklURVJfb3BlbldyaXRlKiAgICAgICAgICAgICBwRmN0T3BlbjsKLSAgICBNNFdSSVRFUl9hZGRTdHJlYW0qICAgICAgICAgICAgICAgIHBGY3RBZGRTdHJlYW07Ci0gICAgTTRXUklURVJfc3RhcnRXcml0aW5nKiAgICAgICAgICBwRmN0U3RhcnRXcml0aW5nOwotICAgIE00V1JJVEVSX2Nsb3NlV3JpdGUqICAgICAgICAgICAgcEZjdENsb3NlV3JpdGU7Ci0gICAgTTRXUklURVJfc2V0T3B0aW9uKiAgICAgICAgICAgICAgICBwRmN0U2V0T3B0aW9uOwotICAgIE00V1JJVEVSX2dldE9wdGlvbiogICAgICAgICAgICAgICAgcEZjdEdldE9wdGlvbjsKLX0gTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlOwotCi10eXBlZGVmIE00T1NBX0VSUiAgTTRXUklURVJfc3RhcnRBVShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKTsKLXR5cGVkZWYgTTRPU0FfRVJSICBNNFdSSVRFUl9wcm9jZXNzQVUoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UKLSAqIEBicmllZiAgICBEZWZpbmVzIGFsbCB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIHRvIHdyaXRlIGRhdGEgd2l0aCBhIHdyaXRlciBzaGVsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRXUklURVJfRGF0YUludGVyZmFjZQotewotICAgIE00V1JJVEVSX3N0YXJ0QVUqICAgIHBTdGFydEFVOwotICAgIE00V1JJVEVSX3Byb2Nlc3NBVSogcFByb2Nlc3NBVTsKLQotICAgIE00V1JJVEVSX0NvbnRleHQgICAgcFdyaXRlckNvbnRleHQ7Ci0KLX0gTTRXUklURVJfRGF0YUludGVyZmFjZTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNFdSSVRFUl9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQml0U3RyZWFtUGFyc2VyLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9CaXRTdHJlYW1QYXJzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzg3NTQ1OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9CaXRTdHJlYW1QYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNF9CaXRTdHJlYW1QYXJzZXIuaAotICogQGJyaWVmICBNUEVHLTQgRmlsZSBGb3JtYXQgYml0IHN0cmVhbSB1dGlsaXR5Ci0gKiBAbm90ZSAgIFRoaXMgZmlsZSBjb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyB1c2VkIHRvIHBhcnNlIE1QRUcgc3BlY2lmaWMKLSAqICAgICAgICAgZGF0YSBzdHJ1Y3R1cmVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNF9CSVRTVFJFQU1QQVJTRVJfSF9fCi0jZGVmaW5lIF9fTTRfQklUU1RSRUFNUEFSU0VSX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotLyoqCi0qIE00X0JpdFN0cmVhbVBhcnNlcl9Jbml0LgotKgotKiBBbGxvY2F0ZXMgdGhlIGNvbnRleHQgYW5kIGluaXRpYWxpemVzIGludGVybmFsIGRhdGEKLSoKLSogQHBhcmFtIHBDb250ZXh0ICAgOiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBwYWNrYWdlIC0gQUxMT0NBVEVEIEJZIFRIRQotKiAgICAgICAgICAgICAgICAgICAgRlVOQ1RJT04gKE00T1NBX05VTEwgaWYgYWxsb2NhdGlvbiBmYWlscykKLSogQHBhcmFtIGJpdFN0cmVhbSAgOiBBIHBvaW50ZXIgdG8gdGhlIGJpdHN0cmVhbSAtIG11c3QgYmUgMzIgYml0cyBhcyBhY2Nlc3MgYXJlIDMyIGJpdHMKLSogQHBhcmFtIHNpemUgICAgICAgIDogVGhlIHNpemUgb2YgdGhlIGJpdHN0cmVhbSBpbiBieXRlcwotKgotKi8KLXZvaWQgTTRfQml0U3RyZWFtUGFyc2VyX0luaXQodm9pZCoqIHBDb250ZXh0LCB2b2lkKiBwQml0U3RyZWFtLCBNNE9TQV9JbnQzMiBzaXplKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQ2xlYW4gdXAgY29udGV4dAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTi9PVVQpICBNNF9CaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi12b2lkIE00X0JpdFN0cmVhbVBhcnNlcl9DbGVhblVwKHZvaWQqIHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgUmVhZCB0aGUgbmV4dCA8bGVuZ3RoPiBiaXRzIGluIHRoZSBiaXRzdHJlYW0uCi0gKiBAbm90ZSAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgdXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4vT1VUKSBNNF9CaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBsZW5ndGggICAgICAgIChJTikgVGhlIG51bWJlciBvZiBiaXRzIHRvIGV4dHJhY3QgZnJvbSB0aGUgYml0c3RyZWFtCi0gKiBAcmV0dXJuICAgIHRoZSByZWFkIGJpdHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9VSW50MzIgTTRfQml0U3RyZWFtUGFyc2VyX1Nob3dCaXRzKHZvaWQqIHBDb250ZXh0LCBNNE9TQV9JbnQzMiBsZW5ndGgpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBJbmNyZW1lbnQgdGhlIGJpdHN0cmVhbSBwb2ludGVyIG9mIDxsZW5ndGg+IGJpdHMuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOL09VVCkgTTRfQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbGVuZ3RoICAgICAgICAoSU4pIFRoZSBudW1iZXIgb2YgYml0IHRvIHNoaWZ0IHRoZSBiaXRzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi12b2lkIE00X0JpdFN0cmVhbVBhcnNlcl9GbHVzaEJpdHModm9pZCogcENvbnRleHQsIE00T1NBX0ludDMyIGxlbmd0aCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldCBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBwb2ludGVkIGJ5IHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAqIEl0IGRvZXMgbm90IHVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAqCi0gKiBAcGFyYW0gcENvbnRleHQgICA6IEEgcG9pbnRlciB0byB0aGUgY29udGV4dCBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIHBhY2thZ2UKLSAqIEBwYXJhbSBsZW5ndGggICAgICAgIDogVGhlIG51bWJlciBvZiBiaXQgdG8gZXh0cmFjdCBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBAcmV0dXJucyB0aGUgcmVhZCBiaXRzCi0qLwotTTRPU0FfVUludDMyIE00X0JpdFN0cmVhbVBhcnNlcl9HZXRCaXRzKHZvaWQqIHBDb250ZXh0LE00T1NBX0ludDMyIGJpdFBvcywgTTRPU0FfSW50MzIgbGVuZ3RoKTsKLQotLyoqCi0qIE00X0JpdFN0cmVhbVBhcnNlcl9SZXN0YXJ0IHJlc2V0cyB0aGUgYml0c3RyZWFtIGluZGV4ZXMuCi0qCi0qIEBwYXJhbSBwQ29udGV4dCAgIDogQSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGludGVybmFsbHkgdXNlZCBieSB0aGUgcGFja2FnZQotKgotKi8KLXZvaWQgTTRfQml0U3RyZWFtUGFyc2VyX1Jlc3RhcnQodm9pZCogcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgcG9pbnRlZCBieSB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gKiBAcmV0dXJucyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBiaXRzdHJlYW0KLSAqIEBub3RlICAgIEl0IHNob3VsZCBiZSB1c2VkIGNhcmVmdWxseSBhcyB0aGUgcG9pbnRlciBpcyBpbiB0aGUgYml0c3RyZWFtIGl0c2VsZgotICogICAgICAgICAgICBhbmQgbm8gY29weSBpcyBtYWRlLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTi9PVVQpICBNNF9CaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSovCi1NNE9TQV9VSW50OCogIE00X0JpdFN0cmVhbVBhcnNlcl9HZXRDdXJyZW50Yml0U3RyZWFtUG9pbnRlcih2b2lkKiBwQ29udGV4dCk7Ci0KLS8qKgotKiBNNF9CaXRTdHJlYW1QYXJzZXJfR2V0U2l6ZSBnZXRzIHRoZSBzaXplIG9mIHRoZSBiaXRzdHJlYW0gaW4gYnl0ZXMKLSoKLSogQHBhcmFtIHBDb250ZXh0ICAgOiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBwYWNrYWdlCi0qCi0qIEByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBiaXRzdHJlYW0gaW4gYnl0ZXMKLSovCi1NNE9TQV9JbnQzMiBNNF9CaXRTdHJlYW1QYXJzZXJfR2V0U2l6ZSh2b2lkKiBwQ29udGV4dCk7Ci0KLXZvaWQgTTRfTVBFRzRCaXRTdHJlYW1QYXJzZXJfSW5pdCh2b2lkKiogcENvbnRleHQsIHZvaWQqIHBCaXRTdHJlYW0sIE00T1NBX0ludDMyIHNpemUpOwotCi0vKioKLSogZ2V0TXBlZ0xlbmd0aEZyb21JbnRlZ2VyIHJldHVybnMgYSBkZWNvZGVkIHNpemUgdmFsdWUgZnJvbSBhbiBlbmNvZGVkIG9uZSAoU0RMKQotKgotKiBAcGFyYW0gcENvbnRleHQgICA6IEEgcG9pbnRlciB0byB0aGUgY29udGV4dCBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIHBhY2thZ2UKLSogQHBhcmFtIHZhbCA6IGVuY29kZWQgdmFsdWUKLSoKLSogQHJldHVybnMgc2l6ZSBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm0KLSovCi0KLU00T1NBX0ludDMyIE00X01QRUc0Qml0U3RyZWFtUGFyc2VyX0dldE1wZWdMZW5ndGhGcm9tSW50ZWdlcih2b2lkKiBwQ29udGV4dCwgTTRPU0FfVUludDMyIHZhbCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgRGVjb2RlIGFuIE1QRUc0IFN5c3RlbXMgZGVzY3JpcHRvciBzaXplIGZyb20gYW4gZW5jb2RlZCBTREwgc2l6ZSBkYXRhLgotICogQG5vdGUgICAgVGhlIHZhbHVlIGlzIHJlYWQgZnJvbSB0aGUgY3VycmVudCBiaXRzdHJlYW0gbG9jYXRpb24uCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOL09VVCkgIE00X0JpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHJldHVybiAgICBTaXplIGluIGEgaHVtYW4gcmVhZGFibGUgZm9ybQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0ludDMyIE00X01QRUc0Qml0U3RyZWFtUGFyc2VyX0dldE1wZWdMZW5ndGhGcm9tU3RyZWFtKHZvaWQqIHBDb250ZXh0KTsKLQotI2VuZGlmIC8qX19NNF9CSVRTVFJFQU1QQVJTRVJfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9Db21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzYwYTdkYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9Db21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNF9Db21tb24uaAotICogQGJyaWVmICBDb21tb24gZGF0YSBzdHJ1Y3R1cmUgYmV0d2VlbiBzaGVsbHMKLSAqIEBub3RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000X0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNF9DT01NT05fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBfcGFyYW1ldGVyU2V0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgYXZjCi0gKiAgICAgICAgICAgICAgIGRlY29kZXIgc3BlY2lmaWMgaW5mbwotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfcGFyYW1ldGVyU2V0Ci17Ci0gICAgTTRPU0FfVUludDE2IG1fbGVuZ3RoOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaXRlbXMqLwotICAgIE00T1NBX1VJbnQ4KiBtX3BQYXJhbWV0ZXJTZXRVbml0OyAgIC8qIEFycmF5IG9mIGl0ZW1zKi8KLX0gUGFyYW1ldGVyU2V0IDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgX2F2Y1NwZWNpZmljSW5mbwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2Ygc3BlY2lmaWMgaW5mbyBmb3IgdGhlIGF2YyBkZWNvZGVyCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9hdmNTcGVjaWZpY0luZm8KLXsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgbV9uYWxVbml0TGVuZ3RoOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIE5BTFVuaXRMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIGEgQVZDIHNhbXBsZSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICBtX251bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOyAgIC8qIE51bWJlciBvZiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0cyovCi0gICAgTTRPU0FfVUludDggICAgICAgIG1fbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0czsgICAgLyogTnVtYmVyIG9mIHBpY3R1cmUgcGFyYW1ldGVyIHNldHMqLwotICAgIFBhcmFtZXRlclNldCAgICAqbV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXQ7ICAgICAgICAvKiBTZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0cyBhcnJheSovCi0gICAgUGFyYW1ldGVyU2V0ICAgICptX3BQaWN0dXJlUGFyYW1ldGVyU2V0OyAgICAgICAgLyogUGljdHVyZSBwYXJhbWV0ZXIgc2V0cyBhcnJheSovCi19IEF2Y1NwZWNpZmljSW5mbyA7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X1N5bnRoZXNpc0F1ZGlvSW5mbwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBzcGVjaWZpYyBwb2ludGVycyB1c2VkIGZvciBzeW50aGVzaXMgYXVkaW8gZm9ybWF0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX3N5bnRoZXNpc0F1ZGlvSW5mbwotewotICAgIE00T1NBX1ZvaWQqICAgICAgICBtX3BJbnB1dEJ1ZjsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgbV9wSW5wdXRJbmZvOwotICAgIE00T1NBX1VJbnQxNiAgICBtX3VpTmJTdWJGcmFtZVBlclN0ZXA7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fdWlVc2VkQnl0ZXM7Ci19IE00X1N5bnRoZXNpc0F1ZGlvSW5mbzsKLQotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRfQUFDRG93bnNhbXBsaW5nTW9kZQotICogQGJyaWVmICAgVGhpcyBlbnVtIHN0YXRlcyBtb2RlcyBmb3IgRG93biBzYW1wbGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIEFBQ19rRFNfT0ZGICAgID0gMCwgICAgICAgIC8qKjwgTm8gRG93biBzYW1wbGluZyAqLwotICAgIEFBQ19rRFNfQllfMiAgID0gMSwgICAgICAgIC8qKjwgRG93biBzYW1wbGluZyBieSAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlID0gQUFDIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHNhbXBsaW5nIHJhdGUgPSBhYWNfc2FtcF9mcmVxLzIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGUgPSBIRV9BQUMgYW5kIGlucHV0IGlzIEFBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IHNhbXBsaW5nIHJhdGUgPSBhYWNfc2FtcF9mcmVxLihObyBkb3duc2FtcGluZykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlID0gSEVfQUFDIGFuZCBpbnB1dCBpcyBIRV9BQUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCBzYW1wbGluZyByYXRlID0gYWFjX3NhbXBfZnJlcSAoRG93bnNhbXBsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycyBpbiBTQlIgdG9vbCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHByb2ZpbGUgPSBIRV9BQUNfdjIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgU3VwcG9ydGVkICovCi0gICAgQUFDX2tEU19CWV8zICAgPSAyLCAgICAgICAgLyoqPCBEb3duIHNhbXBsaW5nIGJ5IDMgIC0gb25seSBmb3IgQUFDIHByb2ZpbGUgKi8KLSAgICBBQUNfa0RTX0JZXzQgICA9IDMsICAgICAgICAvKio8IERvd24gc2FtcGxpbmcgYnkgNCAgLSBvbmx5IGZvciBBQUMgcHJvZmlsZSAqLwotICAgIEFBQ19rRFNfQllfOCAgID0gNCAgICAgICAgLyoqPCBEb3duIHNhbXBsaW5nIGJ5IDggIC0gb25seSBmb3IgQUFDIHByb2ZpbGUgKi8KLQotfSBNNF9BQUNEb3duc2FtcGxpbmdNb2RlOwotCi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNF9BQUNPdXRwdXRNb2RlCi0gKiBAYnJpZWYgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgb3V0cHV0IG1vZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBBQUNfa01vbm8gICAgICA9IDAsICAgIC8qKjwgT3V0cHV0IGlzIE1vbm8gICovCi0gICAgQUFDX2tTdGVyZW8gICAgPSAxICAgICAvKio8IE91dHB1dCBpcyBTdGVyZW8gKi8KLX0gTTRfQUFDT3V0cHV0TW9kZTsKLQotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRfQUFDRGVjUHJvZmlsZQotICogQGJyaWVmICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIEFBQyBkZWNvZGVyIHByb2ZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBBQUNfa0FBQyAgICAgICA9IDAsICAgICAgICAvKio8IEFBQyBwcm9maWxlIChvbmx5IEFBQyBMQyBvYmplY3QgYXJlIHN1cHBvcnRlZCkgKi8KLSAgICBBQUNfa0hFX0FBQyAgICA9IDEsICAgICAgICAvKio8IEhFIEFBQyBvciBBQUMrIHByb2ZpbGUgKFNCUiBpbiBMUCBNb2RlKSAgKi8KLSAgICBBQUNfa0hFX0FBQ192MiA9IDIgICAgICAgIC8qKjwgSEUgQUFDIHYyIG9yIEVuaGFuY2VkIEFBQysgcHJvZmlsZSAoU0JSIFRvb2wgaW4gSFEgTW9kZSkgKi8KLX0gTTRfQUFDRGVjUHJvZmlsZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9BYWNEZWNvZGVyQ29uZmlnCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgc3BlY2lmaWMgc2V0dGluZ3MgYWNjb3JkaW5nIHRvCi0gKiAgICAgICAgICAgICAgICB0aGUgdXNlciByZXF1aXJlbWVudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00X0FBQ0RlY1Byb2ZpbGUgICAgICAgIG1fQUFDRGVjb2RlclByb2ZpbGU7Ci0gICAgTTRfQUFDRG93bnNhbXBsaW5nTW9kZSAgICBtX0Rvd25TYW1wbGluZ01vZGU7Ci0gICAgTTRfQUFDT3V0cHV0TW9kZSAgICAgICAgbV9PdXRwdXRNb2RlOwotCi19IE00X0FhY0RlY29kZXJDb25maWc7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YQotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHVzZXIncyBkYXRhIG5lZWRlZCB0byBkZWNvZGUgdGhlCi0gKiAgICAgICAgICAgIEFBQ3BsdXMgc3RyZWFtCi0gKiBAbm90ZSAgICBUaGUgZmllbGQgbV9wRmlyc3RBVSBpcyB1c2VkIGluIGNhc2Ugb2YgbG9jYWwgZmlsZXMgICAgYW5kCi0gKiAgICAgICAgICAgIHRoZSBmaWVsZCBtX2JJc1NickVuYWJsZWQgaXMgdXNlZCBpbiBzdHJlYW1pbmcgY2FzZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICBNNE9TQV9Wb2lkKiAgICAgICAgICAgIG1fcEZpcnN0QVU7ICAgICAgICAgICAgICAgIC8qKjwgVGhlIGZpcnN0IEFVIGZyb20gd2hlcmUgU0JSIGRhdGEgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgKGxvY2FsIGZpbGUgY2FzZSkqLwotICBNNE9TQV9Cb29sICAgICAgICAgICAgbV9iSXNTYnJFbmFibGVkOyAgICAgICAgLyoqPCBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgaWYgdGhlIHN0cmVhbSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ3BsdXMgKHN0cmVhbWluZyBjYXNlKSovCi0gIE00X0FhY0RlY29kZXJDb25maWcqICAgIG1fcEFhY0RlY29kZXJVc2VyQ29uZmlnOy8qKjwgRGVjb2RlciBzcGVjaWZpYyB1c2VyIHNldHRpbmcgKi8KLQotfSBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhOwotCi0jZW5kaWYgLyogX19NNF9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVXRpbHMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X1V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExZTA4MjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNF9VdGlscy5oCi0gKiBAYnJpZWYgICAgVXRpbGl0aWVzCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB1dGlsaXR5IG1hY3JvcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNF9VVElMU19IX18KLSNkZWZpbmUgX19NNF9VVElMU19IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiAgICBNNF9NZWRpYVRpbWUgZGVmaW5pdGlvbgotICAgIFRoaXMgdHlwZSBpcyB1c2VkIGludGVybmFsbHkgYnkgc29tZSBzaGVsbCBjb21wb25lbnRzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLXR5cGVkZWYgTTRPU0FfRG91YmxlICAgIE00X01lZGlhVGltZTsKLQotLyogICAgR0VUX01FTU9SWTMyIG1hY3JvIGRlZmluaXRpb24KLSAgICBUaGlzIG1hY3JvIGlzIHVzZWQgYnkgdGhlIDNHUCByZWFkZXIqLwotI2lmZGVmIF9fQklHX0VORElBTgotI2RlZmluZSBHRVRfTUVNT1JZMzIoeCkgKHgpCi0jZWxzZQotI2RlZmluZSBHRVRfTUVNT1JZMzIoeCkgKCAoKCh4KSYweGZmKTw8MjQpIHwgKCgoeCkmMHhmZjAwKTw8OCkgfFwKLSAgICAgKCgoeCkmMHhmZjAwMDApPj44KSB8ICgoKHgpJjB4ZmYwMDAwMDApPj4yNCkgKQotI2VuZGlmIC8qX19CSUdfRU5ESUFOKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRfVVRJTFNfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9WaWRlb0VkaXRpbmdDb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU3ZDAzZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9WaWRlb0VkaXRpbmdDb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgKLSAqIEBicmllZiAgICBWaWRlbyBFZGl0aW5nIChWU1MzR1BQLCBNQ1MsIFBUTzNHUFApIGNvbW1vbiBkZWZpbml0aW9ucwotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX19NNF9WSURFT0VESVRJTkdDT01NT05fSF9fCi0jZGVmaW5lIF9fTTRfVklERU9FRElUSU5HQ09NTU9OX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogICAgVmVyc2lvbiAqLwotLyogQ0hBTkdFX1ZFUlNJT05fSEVSRSAqLwotI2RlZmluZSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SICAgIDMKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NSU5PUiAgICAxCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04gICAgMAotCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRSAweDdmZmZmZmZmCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUwgMHg3ZmZmZmZmZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGZpbGUgZm9ybWF0IHR5cGUgdG8gYmUgdXNlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAgICAgICAgID0gMCwgICAgICAvKio8IDNHUFAgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgJiBvdXRwdXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0ICAgICAgICAgPSAxLCAgICAgIC8qKjwgTVA0ICBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCAgICAgICAgICAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVIgICAgICAgICA9IDIsICAgICAgLyoqPCBBTVIgIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0ICYgb3V0cHV0ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyAgICAgICAgID0gMywgICAgICAvKio8IE1QMyAgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgICAgICAgICAgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNICAgICAgICAgPSA0LCAgICAgIC8qKjwgUENNIFJBVyBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCAgICBSQyAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9KUEcgICAgICAgICA9IDUsICAgICAgLyoqPCBTVElMTCBQSUNUVVJFIEZFQVRVUkU6IEpQRyBmaWxlIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBpbnB1dCBBTkQgT1VUUFVUICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0JNUCAgICAgICAgID0gNiwgICAgICAvKio8IFNUSUxMIFBJQ1RVUkUgRkVBVFVSRTogQk1QIGZpbGUgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IGlucHV0IG9ubHkgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfR0lGICAgICAgICAgPSA3LCAgICAgIC8qKjwgU1RJTEwgUElDVFVSRSBGRUFUVVJFOiBHSUYgZmlsZSBtZWRpYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogaW5wdXQgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QTkcgICAgICAgICA9IDgsICAgICAgLyoqPCBTVElMTCBQSUNUVVJFIEZFQVRVUkU6IFBORyBmaWxlIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBpbnB1dCBvbmx5ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICAgID0gOSwgICAgICAvKio8IFNUSUxMIFBJQ1RVUkUgRkVBVFVSRTogQVJHQjg4ODggZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYSB0eXBlIDogaW5wdXQgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFYgICAgICAgICA9IDEwLCAgICAgLyoqPCBNNFYgIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0IG9ubHkgICAgICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkID0gMjU1ICAgICAvKio8IFVuc3VwcG9ydGVkIGZpbGUgbWVkaWEgdHlwZSAgICAgICAgICAgKi8KLX0gTTRWSURFT0VESVRJTkdfRmlsZVR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgdmlkZW8gY29tcHJlc3Npb24gZm9ybWF0cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvID0gMCwgLyoqPCBWaWRlbyBub3QgcHJlc2VudCAqLwotICAgIE00VklERU9FRElUSU5HX2tIMjYzID0gMSwgLyoqPCBIMjYzIHZpZGVvICovCi0gICAgTTRWSURFT0VESVRJTkdfa0gyNjQgPSAyLCAgICAvKio8IEgyNjQgdmlkZW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rTVBFRzQgPSAzLCAvKio8IE1QRUctNCB2aWRlbyAqLwotICAgIE00VklERU9FRElUSU5HX2tOdWxsVmlkZW8gPSAyNTQsICAvKio8IERvIG5vdCBjYXJlIHZpZGVvIHR5cGUsIHVzZSBOVUxMIGVuY29kZXIgKi8KLSAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRWaWRlbyA9IDI1NSAgICAvKio8IFVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSB0eXBlICovCi19IE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0Ci0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBhdWRpbyBmb3JtYXQuCi0gKiBAbm90ZSAgICBIRV9BQUMsIEhFX0FBQ192MiBhbmQgTVAzIGNhbiBub3QgYmUgdXNlZCBmb3IgdGhlIG91dHB1dCBhdWRpbyBmb3JtYXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gICAgICAgICAgICA9IDAsICAgIC8qKjwgQXVkaW8gbm90IHByZXNlbnQgKi8KLSAgICBNNFZJREVPRURJVElOR19rQU1SX05CICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQU1SIE5hcnJvdyBCYW5kIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa0FBQyAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEFBQyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tBQUNwbHVzICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBBQUMrIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzICAgICAgICAgICAgID0gNCwgICAgLyoqPCBFbmhhbmNlZCBBQUMrIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa01QMyAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE1QMyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tFVlJDICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBFVlJDIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa1BDTSAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFBDTSBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tOdWxsQXVkaW8gICAgICAgICAgID0gMjU0LCAgLyoqPCBEbyBub3QgY2FyZSBhdWRpbyB0eXBlLCB1c2UgTlVMTCBlbmNvZGVyICovCi0gICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW8gICAgPSAyNTUgICAgLyoqPCBVbnN1cHBvcnRlZCBhdWRpbyBzdHJlYW0gdHlwZSAqLwotfSBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFpbGFibGUgb3V0cHV0IGZyYW1lIHNpemVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VklERU9FRElUSU5HX2tTUUNJRj0wLCAvKio8IFNRQ0lGIDEyOHg5NiAgKi8KLSAgICBNNFZJREVPRURJVElOR19rUVFWR0EsICAgLyoqPCBRUVZHQSAxNjB4MTIwICovCi0gICAgTTRWSURFT0VESVRJTkdfa1FDSUYsICAgIC8qKjwgUUNJRiAgMTc2eDE0NCAqLwotICAgIE00VklERU9FRElUSU5HX2tRVkdBLCAgICAvKio8IFFWR0EgIDMyMHgyNDAgKi8KLSAgICBNNFZJREVPRURJVElOR19rQ0lGLCAgICAgLyoqPCBDSUYgICAzNTJ4Mjg4ICovCi0gICAgTTRWSURFT0VESVRJTkdfa1ZHQSwgICAgIC8qKjwgVkdBICAgNjQweDQ4MCAqLwotLyogK1BSIExWNTgwNyAqLwotICAgIE00VklERU9FRElUSU5HX2tXVkdBLCAgICAvKio8IFdWR0EgODAweDQ4MCAqLwotICAgIE00VklERU9FRElUSU5HX2tOVFNDLCAgICAvKio8IE5UU0MgNzIweDQ4MCAqLwotLyogLVBSIExWNTgwNyAqLwotCi0vKiArQ1IgR29vZ2xlICovCi0gICAgTTRWSURFT0VESVRJTkdfazY0MF8zNjAsICAvKio8IDY0MHgzNjAgKi8KLSAgICBNNFZJREVPRURJVElOR19rODU0XzQ4MCwgIC8qKjwgODU0eDQ4MCAqLwotICAgIE00VklERU9FRElUSU5HX2sxMjgwXzcyMCwgLyoqPCA3MjBwIDEyODB4NzIwICovCi0gICAgTTRWSURFT0VESVRJTkdfazEwODBfNzIwLCAvKio8IDcyMHAgMTA4MHg3MjAgKi8KLSAgICBNNFZJREVPRURJVElOR19rOTYwXzcyMCwgIC8qKjwgNzIwcCA5NjB4NzIwICovCi0gICAgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MCAvKio8MTA4MHAgMTkyMHgxMDgwKi8KLS8qIC1DUiBHb29nbGUgKi8KLQotfSBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvZnJhbWVyYXRlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWlsYWJsZSB2aWRlbyBmcmFtZXJhdGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VklERU9FRElUSU5HX2s1X0ZQUyA9IDAsCi0gICAgTTRWSURFT0VESVRJTkdfazdfNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazEwX0ZQUywKLSAgICBNNFZJREVPRURJVElOR19rMTJfNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazE1X0ZQUywKLSAgICBNNFZJREVPRURJVElOR19rMjBfRlBTLAotICAgIE00VklERU9FRElUSU5HX2syNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazMwX0ZQUwotfSBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhaWxhYmxlIG91dHB1dCBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY2llcwotICogQG5vdGUgICAgOCBrSHogaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGZyZXF1ZW5jeSBmb3IgQU1SLU5CIG91dHB1dAotICogQG5vdGUgICAgMTYga0h6IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBmcmVxdWVuY3kgZm9yIEFBQyBvdXRwdXQKLSAqIEBub3RlICAgIFRoZSByZWNvbW1lbmRlZCBwcmFjdGljZSBpcyB0byB1c2UgdGhlIERlZmF1bHQgdmFsdWUgd2hlbiBzZXR0aW5nIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0YgICAgPSAwLCAgICAvKio8IERlZmF1bHQgQXVkaW8gU2FtcGxpbmcgRnJlcXVlbmN5IGZvciBzZWxlY3RlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIG91dHB1dCBmb3JtYXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rODAwMF9BU0YgICAgPSA4MDAwLCAgICAvKio8IE5vdGU6IERlZmF1bHQgYXVkaW8gU2FtcGxpbmcgRnJlcXVlbmN5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUi1OQiBvdXRwdXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rMTEwMjVfQVNGICAgID0gMTEwMjUsCi0gICAgTTRWSURFT0VESVRJTkdfazEyMDAwX0FTRiAgICA9IDEyMDAwLAotICAgIE00VklERU9FRElUSU5HX2sxNjAwMF9BU0YgICAgPSAxNjAwMCwgICAgLyoqPCBOb3RlOiBEZWZhdWx0IGF1ZGlvIFNhbXBsaW5nIEZyZXF1ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgQUFDIG91dHB1dCAqLwotICAgIE00VklERU9FRElUSU5HX2syMjA1MF9BU0YgICAgPSAyMjA1MCwKLSAgICBNNFZJREVPRURJVElOR19rMjQwMDBfQVNGICAgID0gMjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazMyMDAwX0FTRiAgICA9IDMyMDAwLAotICAgIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0YgICAgPSA0NDEwMCwKLSAgICBNNFZJREVPRURJVElOR19rNDgwMDBfQVNGICAgID0gNDgwMDAKLQotfSBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFpbGFibGUgYXVkaW8gb3IgdmlkZW8gYml0cmF0ZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWSURFT0VESVRJTkdfa1ZBUklBQkxFX0tCUFMgPSAtMSwgICAgIC8qIG5vIHJlZ3VsYXRpb24gKi8KLSAgICBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSA9IDAsICAgLyogdW5kZWZpbmVkICovCi0gICAgTTRWSURFT0VESVRJTkdfazhfS0JQUyA9IDgwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazlfMl9LQlBTID0gOTIwMCwgICAgICAgIC8qIGV2cmMgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2sxMl8yX0tCUFMgPSAxMjIwMCwgICAgICAvKiBhbXIgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2sxNl9LQlBTID0gMTYwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazI0X0tCUFMgPSAyNDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUyA9IDMyMDAwLAotICAgIE00VklERU9FRElUSU5HX2s0MF9LQlBTID0gNDAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazQ4X0tCUFMgPSA0ODAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNTZfS0JQUyA9IDU2MDAwLAotICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTID0gNjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazgwX0tCUFMgPSA4MDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rOTZfS0JQUyA9IDk2MDAwLAotICAgIE00VklERU9FRElUSU5HX2sxMTJfS0JQUyA9IDExMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMTI4X0tCUFMgPSAxMjgwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazE2MF9LQlBTID0gMTYwMDAwLAotICAgIE00VklERU9FRElUSU5HX2sxOTJfS0JQUyA9IDE5MjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMjI0X0tCUFMgPSAyMjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTID0gMjU2MDAwLAotICAgIE00VklERU9FRElUSU5HX2syODhfS0JQUyA9IDI4ODAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMzIwX0tCUFMgPSAzMjAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTID0gMzg0MDAwLAotICAgIE00VklERU9FRElUSU5HX2s1MTJfS0JQUyA9IDUxMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rODAwX0tCUFMgPSA4MDAwMDAsCi0vKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICBNNFZJREVPRURJVElOR19rMl9NQlBTID0gMjAwMDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNV9NQlBTID0gNTAwMDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rOF9NQlBTID0gODAwMDAwMCwKLS8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotfSBNNFZJREVPRURJVElOR19CaXRyYXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklERU9FRElUSU5HX0Z0eXBCb3gKLSAqIEBicmllZiAgICAgICAgSW5mb3JtYXRpb24gdG8gYnVpbGQgdGhlICdmdHlwJyBhdG9tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNFZJREVPRURJVElOR19NQVhfQ09NUEFUSUJMRV9CUkFORFMgMTAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogQWxsIGJyYW5kIGZpZWxkcyBhcmUgYWN0dWFsbHkgY2hhcls0XSBzdG9yZWQgaW4gYmlnLWVuZGlhbiBpbnRlZ2VyIGZvcm1hdCAqLwotCi0gICAgTTRPU0FfVUludDMyICAgIG1ham9yX2JyYW5kOyAgICAgICAgICAgLyogZ2VuZXJhbGx5ICczZ3A0JyAgICAgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgIG1pbm9yX3ZlcnNpb247ICAgICAgICAgLyogZ2VuZXJhbGx5ICcwMDAwJyBvciAneC54ICcgICovCi0gICAgTTRPU0FfVUludDMyICAgIG5iQ29tcGF0aWJsZUJyYW5kczsgICAgLyogbnVtYmVyIG9mIGNvbXBhdGlibGUgYnJhbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgIGNvbXBhdGlibGVfYnJhbmRzW000VklERU9FRElUSU5HX01BWF9DT01QQVRJQkxFX0JSQU5EU107IC8qIGFycmF5IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IGNvbXBhdGlibGUgYnJhbmRzICovCi0KLX0gTTRWSURFT0VESVRJTkdfRnR5cEJveDsKLQotLyogU29tZSB1c2VmdWwgYnJhbmRzICovCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EXzAwMDAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfM0cyQSAgMHgzMzY3MzI2MQotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF8zR1A0ICAweDMzNjc3MDM0Ci0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EXzNHUDUgIDB4MzM2NzcwMzUKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfM0dQNiAgMHgzMzY3NzAzNgotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9BVkMxICAweDYxNzY2MzMxCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX0VNUCAgIDB4NjU2RDcwMjAKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfSVNPTSAgMHg2OTczNkY2RAotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9NUDQxICAweDZENzAzNDMxCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX01QNDIgIDB4NkQ3MDM0MzIKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfVkZKMSAgMHg3NjY2NkEzMQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBnYXRoZXJzIHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFuIGlucHV0IGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb21tb24gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiQW5hbHlzZWQ7ICAgICAgICAgICAvKio8IEZsYWcgdG8ga25vdyBpZiB0aGUgZmlsZSBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZW4gYWxyZWFkeSBhbmFseXNlZCBvciBub3QgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uWzNdOyAgICAgICAgICAvKio8IFZlcnNpb24gb2YgdGhlIGxpYnJhcmllcyB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIHRoZSBjbGlwIGFuYWx5c2lzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlDbGlwRHVyYXRpb247ICAgICAgLyoqPCBDbGlwIGR1cmF0aW9uIChpbiBtcykgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgICAgICBGaWxlVHlwZTsgICAgICAgICAgICAvKio8IC4zZ3AsIC5hbXIsIC5tcDMgKi8KLSAgICBNNFZJREVPRURJVElOR19GdHlwQm94ICAgICAgICAgICAgICBmdHlwOyAgICAgICAgICAgICAgICAvKio8IDNncCAnZnR5cCcgYXRvbSwgbWFqb3JfYnJhbmQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdCB1c2VkICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0ICAgICAgICAgIFZpZGVvU3RyZWFtVHlwZTsgICAgIC8qKjwgRm9ybWF0IG9mIHRoZSB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBWaWRlb0R1cmF0aW9uOyAvKio8IFZpZGVvIHRyYWNrIGR1cmF0aW9uIChpbiBtcykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvQml0cmF0ZTsgICAgICAvKio8IFZpZGVvIGF2ZXJhZ2UgYml0cmF0ZSAoaW4gYnBzKSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb01heEF1U2l6ZTsgICAgLyoqPCBNYXhpbXVtIEFjY2VzcyBVbml0IHNpemUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvV2lkdGg7ICAgICAgICAvKio8IFZpZGVvIGZyYW1lIHdpZHRoICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb0hlaWdodDsgICAgICAgLyoqPCBWaWRlbyBmcmFtZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvVGltZVNjYWxlOyAgICAvKio8IFZpZGVvIHRpbWUgc2NhbGUgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICBmQXZlcmFnZUZyYW1lUmF0ZTsgICAvKio8IEF2ZXJhZ2UgZnJhbWUgcmF0ZSBvZiB0aGUgdmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAqLwotICAgIE00T1NBX0ludDMyIHVpVmlkZW9MZXZlbDsgICAvKio8IHZpZGVvIGxldmVsKi8KLSAgICBNNE9TQV9JbnQzMiB1aVZpZGVvUHJvZmlsZTsgLyoqPCB2aWRlbyBwcm9maWxlICovCi0KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiTVBFRzRkYXRhUGFydGl0aW9uOyAvKio8IE1QRUctNCB1c2VzIGRhdGEgcGFydGl0aW9uaW5nICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYk1QRUc0cnZsYzsgICAgICAgICAgLyoqPCBNUEVHLTQgdXNlcyBSVkxDIHRvb2wgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiTVBFRzRyZXN5bmNoTWFya2VyOyAvKio8IE1QRUctNCBzdHJlYW0gdXNlcyBSZXN5bmNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFya2VyICovCi0KLSAgICAvKioKLSAgICAgKiBBdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgIEF1ZGlvU3RyZWFtVHlwZTsgICAgIC8qKjwgRm9ybWF0IG9mIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBBdWRpb0R1cmF0aW9uOyAvKio8IEF1ZGlvIHRyYWNrIGR1cmF0aW9uIChpbiBtcykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZTsgICAgICAvKio8IEF1ZGlvIGF2ZXJhZ2UgYml0cmF0ZSAoaW4gYnBzKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpQXVkaW9NYXhBdVNpemU7ICAgIC8qKjwgTWF4aW11bSBBY2Nlc3MgVW5pdCBzaXplIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHM7ICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMT1tb25vLCAyPXN0ZXJlbykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVNhbXBsaW5nRnJlcXVlbmN5OyAvKio8IFNhbXBsaW5nIGF1ZGlvIGZyZXF1ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoODAwMCBmb3IgYW1yLCAxNjAwMCBvciBtb3JlIGZvciBhYWMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlFeHRlbmRlZFNhbXBsaW5nRnJlcXVlbmN5OyAvKio8IEV4dGVuZGVkIGZyZXF1ZW5jeSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUMrLCBlQUFDKyBzdHJlYW1zICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlEZWNvZGVkUGNtU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBkZWNvZGVkIFBDTSBkYXRhICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBlZGl0aW5nIGNvbXBhdGliaWxpdHkgY2hhcnQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgYlZpZGVvSXNFZGl0YWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZpZGVvIHN0cmVhbSBjYW4gYmUgZGVjb2RlZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUtZW5jb2RlZCAqLwotICAgIE00T1NBX0Jvb2wgICAgICBiQXVkaW9Jc0VkaXRhYmxlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXVkaW8gc3RyZWFtIGNhbiBiZSBkZWNvZGVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUtZW5jb2RlZCAqLwotICAgIE00T1NBX0Jvb2wgICAgICBiVmlkZW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcDsgICAgICAgIC8qKjwgVmlkZW8gcHJvcGVydGllcyBtYXRjaCByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgcHJvcGVydGllcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICBiQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcDsgICAgICAgIC8qKjwgQXVkaW8gcHJvcGVydGllcyBtYXRjaCByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwIHByb3BlcnRpZXMgKi8KLQotICAgIC8qKgotICAgICAqIFN0aWxsIFBpY3R1cmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVN0aWxsUGljV2lkdGg7ICAgICAgICAvKio8IEltYWdlIHdpZHRoICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlTdGlsbFBpY0hlaWdodDsgICAgICAgLyoqPCBJbWFnZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBBdWRpb1ZvbHVtZVBlcmNlbnRhZ2U7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldEltYWdlRGF0YTsKLQotICAgIE00T1NBX0ludDMyICAgICB2aWRlb1JvdGF0aW9uRGVncmVlczsgICAgICAgIC8qKjwgVmlkZW8gcm90YXRpb24gZGVncmVlICovCi0KLX0gTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXM7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gICAgfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000X1ZJREVPRURJVElOR0NPTU1PTl9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTW9ub1RvMklfMTYuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL01vbm9UbzJJXzE2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0YjFjOGEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTW9ub1RvMklfMTYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9NT05PVE8ySV8xNl9IXwotI2RlZmluZSBfTU9OT1RPMklfMTZfSF8KLQotCi12b2lkIE1vbm9UbzJJXzE2KCAgY29uc3Qgc2hvcnQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IG4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2VuZGlmICAvKiBfTU9OT1RPMklfMTZfSF8gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMWI2MmUxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfTUNTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19NQ1NfSAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFQURFUlMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKiovCi0KLS8qIC0tLS0tICBBTVIgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5hbXIgZmlsZXMgKi8KLQotLyogLS0tLS0gM0dQUCAgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5tcDQsIC4zZ3AgZmlsZXMgKi8KLQotCi0vKiAtLS0tLSBNUDMgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5tcDMgZmlsZXMgKi8KLQotLyogLS0tLS0gUkFXIHJlYWRlciBzdXBwb3J0IC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTSAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCAucGNtIGZpbGVzICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogREVDT0RFUlMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotCi0vKiAtLS0tLSAgQU1SIE5CIGRlY29kZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgQU1SIE5CIHN0cmVhbXMgKi8KLQotLyogLS0tLS0gQUFDIGRlY29kZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0FVREVDX0FBQyAgICAgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgQUFDLCBBQUMrIGFuZCBlQUFDKyBzdHJlYW1zICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfVklERUNfTlVMTAotCi0vKiAtLS0tLSBNUDQvSDI2MyB2aWRlbyBkZWNvZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9WSURFQ18zR1AgICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IG1wZWc0IGFuZCBIMjYzIGRlY29kZXJzICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUAotI2RlZmluZSBHRVRfREVDT0RFUl9DT05GSUdfSU5GTwotI2VuZGlmCi0KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9WSURFT19BVkMgICAgICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IEgyNjQgZGVjb2RlcnMgKi8KLQotLyogLS0tLS0gTVAzIGRlY29kZXIgc3VwcG9ydC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzICAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCBNUDMgZGVjb2RlcnMgKi8KLQotCi0vKiAtLS0tLSBOVUxMIGRlY29kZXIgc3VwcG9ydC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAgICAgICAgLyoqIFtkZWZhdWx0XSBTdXBwb3J0IFBDTSByZWFkaW5nICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXUklURVJTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqLwotCi0vKiAtLS0tLSAzZ3Agd3JpdGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAgICAgICAgLyoqPCBbZGVmYXVsdF0gc3VwcG9ydCBlbmNhcHN1bGF0aW5nIGluIDNncCBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthbXIsYWFjfSB4IHttcGVnNCxoMjYzfSAqLwotCi0KLQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVOQ09ERVJTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLQotLyogLS0tLS0gbXBlZzQgJiBoMjYzIGVuY29kZXIgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0ICAgICAvKio8IFtkZWZhdWx0XSBzdXBwb3J0IGVuY29kaW5nIGluIG1wZWc0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2MyBmb3JtYXQge3l1dixyZ2J9ICovCi0KLS8qIC0tLS0tIGgyNjQgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDCi0KLS8qIC0tLS0tIGFtciBlbmNvZGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BTVIgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gYW1yIDEyLjIgZm9ybWF0IHthbXIsd2F2fSAqLwotCi0vKiAtLS0tLSBhYWMgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQUFDICAgICAgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gYWFjIGZvcm1hdCB7YW1yLHdhdn0gKi8KLQotCi0vKiAtLS0tLSBtcDMgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVAzICAgICAgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gbXAzIGZvcm1hdCB7bXAzfSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRUFUVVJFUyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0KLS8qIC0tLS0tIFZTUzNHUFAgJiB4VlNTIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMgLyoqPCBbZGVmYXVsdF0gaWYgZGVmaW5lZCwgaW1wbGVtZW50YXRpb24gaXMgeFZTUyBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIFZTUzNHUFAgKi8KLQotLyogLS0tLS0gU1BTIC0tLS0tICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotCi0vLyNkZWZpbmUgTTRTUFNfR0lGX05PVF9TVVBQT1JURUQgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgR0lGIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotLy8jZGVmaW5lIE00U1BTX0pQRUdfTk9UX1NVUFBPUlRFRCAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IEpQRUcgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0vLyNkZWZpbmUgTTRTUFNfUE5HX05PVF9TVVBQT1JURUQgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgUE5HIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotI2RlZmluZSBNNFNQU19XQk1QX05PVF9TVVBQT1JURUQgICAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IFdCTVAgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0jZGVmaW5lIE00U1BTX0JHUjU2NV9DT0xPUl9PVVRQVVQgIC8qKjwgW29wdGlvbl0gb3V0cHV0IGluIHN0aWxsIHBpY3R1cmUgYXBpIGlzIEJHUjU2NQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ID0gQkdSMjQpICovCi0KLSNlbHNlCi0KLSNkZWZpbmUgTTRTUFNfR0lGX05PVF9TVVBQT1JURUQgICAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBHSUYgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0vLyNkZWZpbmUgTTRTUFNfSlBFR19OT1RfU1VQUE9SVEVEIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgSlBFRyBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLSNkZWZpbmUgTTRTUFNfUE5HX05PVF9TVVBQT1JURUQgICAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBQTkcgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0jZGVmaW5lIE00U1BTX1dCTVBfTk9UX1NVUFBPUlRFRCAgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgV0JNUCBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLS8vI2RlZmluZSBNNFNQU19CR1I1NjVfQ09MT1JfT1VUUFVUIC8qKjwgW29wdGlvbl0gb3V0cHV0IGluIHN0aWxsIHBpY3R1cmUgYXBpIGlzIEJHUjU2NQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCA9IEJHUjI0KSAqLwotCi0jZW5kaWYKLQotI2RlZmluZSBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotI2RlZmluZSBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfTUNTX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvU1NSQy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvU1NSQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjFjZmNmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL1NTUkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICVuYW1lOiAgICAgICAgICBTU1JDLmggJSAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAgICBUaGUgaW5wdXQgYW5kIG91dHB1dCBibG9ja3Mgb2YgdGhlIFNSQyBhcmUgYnkgZGVmYXVsdCBibG9ja3Mgb2YgNDAgbXMuICBUaGlzIG1lYW5zIHRoYXQKLSAgICB0aGUgZm9sbG93aW5nIGRlZmF1bHQgYmxvY2sgc2l6ZXMgYXJlIHVzZWQ6Ci0KLSAgICAgICAgICBGcyAgICAgRGVmYXVsdCBCbG9jayBzaXplCi0gICAgICAgIC0tLS0tICAgICAgICAtLS0tLS0tLS0tCi0gICAgICAgICA4MDAwICAgICAgICAgICAzMjAKLSAgICAgICAgMTEwMjUgICAgICAgICAgIDQ0MQotICAgICAgICAxMjAwMCAgICAgICAgICAgNDgwCi0gICAgICAgIDE2MDAwICAgICAgICAgICA2NDAKLSAgICAgICAgMjIwNTAgICAgICAgICAgIDg4MgotICAgICAgICAyNDAwMCAgICAgICAgICAgOTYwCi0gICAgICAgIDMyMDAwICAgICAgICAgIDEyODAKLSAgICAgICAgNDQxMDAgICAgICAgICAgMTc2NAotICAgICAgICA0ODAwMCAgICAgICAgICAxOTIwCi0KLSAgICBBbiBBUEkgaXMgcHJvdmlkZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJsb2NrIHNpemUgaW50byBhbnkgbXVsdGlwbGUgb2YgdGhlIG1pbmltYWwKLSAgICBibG9jayBzaXplLgotCi0gICAgQWxsIHRoZSBzYW1wbGluZyByYXRlcyBhYm92ZSBhcmUgc3VwcG9ydGVkIGFzIGlucHV0IGFuZCBhcyBvdXRwdXQgc2FtcGxpbmcgcmF0ZQotKi8KLQotI2lmbmRlZiBfX1NTUkNfSF9fCi0jZGVmaW5lIF9fU1NSQ19IX18KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgREVGSU5JVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNTUkNfSU5TVEFOQ0VfU0laRSAgICAgICAgICA1NDgKLSNkZWZpbmUgU1NSQ19JTlNUQU5DRV9BTElHTk1FTlQgICAgIDQKLSNkZWZpbmUgU1NSQ19TQ1JBVENIX0FMSUdOTUVOVCAgICAgIDQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIFRZUEUgREVGSU5JVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBTdGF0dXMgcmV0dXJuIHZhbHVlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgU1NSQ19PSyAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KLSAgICBTU1JDX0lOVkFMSURfRlMgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAvKiBUaGUgaW5wdXQgb3IgdGhlIG91dHB1dCBzYW1wbGluZyByYXRlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQgKi8KLSAgICBTU1JDX0lOVkFMSURfTlJfQ0hBTk5FTFMgICAgPSAyLCAgICAgICAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGlzIG5vdCBlcXVhbCB0byBtb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzdGVyZW8gKi8KLSAgICBTU1JDX05VTExfUE9JTlRFUiAgICAgICAgICAgPSAzLCAgICAgICAgICAgICAgICAvKiBPbmUgb2YgdGhlIGlucHV0IHBvaW50ZXJzIGlzIE5VTEwgKi8KLSAgICBTU1JDX1dST05HX05SX1NBTVBMRVMgICAgICAgPSA0LCAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzICovCi0gICAgU1NSQ19BTExJTkdNRU5UX0VSUk9SICAgICAgID0gNSwgICAgICAgICAgICAgICAgLyogVGhlIGluc3RhbmNlIG1lbW9yeSBvciB0aGUgc2NyYXRjaCBtZW1vcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGFsbGlnbmVkICovCi0gICAgU1NSQ19JTlZBTElEX01PREUgICAgICAgICAgID0gNiwgICAgICAgICAgICAgICAgLyogQSB3cm9uZyB2YWx1ZSBoYXMgYmVlbiB1c2VkIGZvciB0aGUgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgKi8KLSAgICBTU1JDX0lOVkFMSURfVkFMVUUgICAgICAgICAgPSA3LCAgICAgICAgICAgICAgICAvKiBBbiBpbnZhbGlkIChvdXQgb2YgcmFuZ2UpIHZhbHVlIGhhcyBiZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIG9uZSBvZiB0aGUgcGFyYW1ldGVycyAqLwotICAgIExWWFhYX1JFVFVSTlNUQVRVU19EVU1NWSA9IExWTV9NQVhFTlVNCi19IFNTUkNfUmV0dXJuU3RhdHVzX2VuOwotCi0vKiBJbnN0YW5jZSBtZW1vcnkgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDMyIFN0b3JhZ2UgWyBTU1JDX0lOU1RBTkNFX1NJWkUvNCBdOwotfSBTU1JDX0luc3RhbmNlX3Q7Ci0KLS8qIFNjcmF0Y2ggbWVtb3J5ICovCi10eXBlZGVmIExWTV9JTlQzMiBTU1JDX1NjcmF0Y2hfdDsKLQotLyogTnViZXIgb2Ygc2FtcGxlcyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBTU1JDX05SX1NBTVBMRVNfREVGQVVMVCAgICAgPSAwLAotICAgIFNTUkNfTlJfU0FNUExFU19NSU4gICAgICAgICA9IDEsCi0gICAgU1NSQ19OUl9TQU1QTEVTX0RVTU1ZICAgICAgID0gTFZNX01BWEVOVU0KLX0gU1NSQ19OUl9TQU1QTEVTX01PREVfZW47Ci0KLS8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZzX2VuICAgICAgICAgICBTU1JDX0ZzX0luOwotICAgIExWTV9Gc19lbiAgICAgICAgICAgU1NSQ19Gc19PdXQ7Ci0gICAgTFZNX0Zvcm1hdF9lbiAgICAgICBTU1JDX05yT2ZDaGFubmVsczsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIE5yU2FtcGxlc0luOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgTnJTYW1wbGVzT3V0OwotfSBTU1JDX1BhcmFtc190OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBQUk9UT1RZUEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfR2V0TnJTYW1wbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyAob3Igc2FtcGxlIHBhaXJzIGZvciBzdGVyZW8pIHRvIGJlICAgICovCi0vKiAgdXNlZCBhcyBpbnB1dCBhbmQgYXMgb3V0cHV0IG9mIHRoZSBTU1JDIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kZSAgICAgICAgICAgICAgICAgICAgVGhlcmUgYXJlIHR3byBtb2RlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1JDX05SX1NBTVBFTFNfREVGQVVMVC4gIEluIHRoaXMgbW9kZSwgdGhlIGZ1bmN0aW9uICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgNDAgbXMgYmxvY2tzICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NSQ19OUl9TQU1QRUxTX01JTiB3aWxsIHJldHVybiB0aGUgbWluaW1hbCBudW1iZXIgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBzYW1wbGVzIHRoYXQgaXMgc3VwcG9ydGVkIGZvciB0aGlzIGNvbnZlcnNpb24gICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvLiAgRWFjaCBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoaXMgcmF0aW8gd2lsbCAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYWNjZXB0ZWQgYnkgdGhlIFNTUkNfSW5pdCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX1BhcmFtcyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfT0sgICAgICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX0ZTICAgICAgICAgV2hlbiB0aGUgcmVxdWVzdGVkIGlucHV0IG9yIG91dHB1dCBzYW1wbGluZyByYXRlcyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW52YWxpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9OUl9DSEFOTkVMUyBXaGVuIHRoZSBjaGFubmVsIGZvcm1hdCBpcyBub3QgZXF1YWwgdG8gTFZNX01PTk8gICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTFZNX1NURVJFTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX05VTExfUE9JTlRFUiAgICAgICBXaGVuIHBTU1JDX1BhcmFtcyBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9NT0RFICAgICAgIFdoZW4gTW9kZSBpcyBub3QgYSB2YWxpZCBzZXR0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1TU1JDX1JldHVyblN0YXR1c19lbiBTU1JDX0dldE5yU2FtcGxlcyggU1NSQ19OUl9TQU1QTEVTX01PREVfZW4gIE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NSQ19QYXJhbXNfdCogICAgICAgICAgIHBTU1JDX1BhcmFtcyApOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19HZXRTY3JhdGNoU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHNjcmF0Y2ggc2l6ZSBmb3IgYSBnaXZlbiBjb252ZXJzaW9uIHJhdGlvIGFuZCAgICAgICAgICAgKi8KLS8qICBmb3IgZ2l2ZW4gYnVmZmVyIHNpemVzIGF0IHRoZSBpbnB1dCBhbmQgYXQgdGhlIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19QYXJhbXMgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTY3JhdGNoU2l6ZSAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHNjcmF0Y2ggc2l6ZS4gIFRoZSBTU1JDX0dldFNjcmF0Y2hTaXplICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd2lsbCBmaWxsIGluIHRoZSBjb3JyZWN0IHZhbHVlIChpbiBieXRlcykuICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19PSyAgICAgICAgICAgICAgICAgd2hlbiB0aGUgZnVuY3Rpb24gY2FsbCBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfRlMgICAgICAgICBXaGVuIHRoZSByZXF1ZXN0ZWQgaW5wdXQgb3Igb3V0cHV0IHNhbXBsaW5nIHJhdGVzICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX05SX0NIQU5ORUxTIFdoZW4gdGhlIGNoYW5uZWwgZm9ybWF0IGlzIG5vdCBlcXVhbCB0byBMVk1fTU9OTyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBvciBMVk1fU1RFUkVPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfTlVMTF9QT0lOVEVSICAgICAgIFdoZW4gYW55IG9mIHRoZSBpbnB1dCBwb2ludGVycyBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICovCi0vKiAgU1NSQ19XUk9OR19OUl9TQU1QTEVTICAgV2hlbiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGlucHV0IG9yIG9uIHRoZSBvdXRwdXQgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW5jb3JyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfR2V0U2NyYXRjaFNpemUoICAgU1NSQ19QYXJhbXNfdCogICAgcFNTUkNfUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIqICAgICAgICBwU2NyYXRjaFNpemUgKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBTU1JDIG1vZHVsZSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX0luc3RhbmNlICAgICAgICAgIEluc3RhbmNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19TY3JhdGNoICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzY3JhdGNoIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX1BhcmFtcyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcElucHV0SW5TY3JhdGNoLCAgICAgICAgcG9pbnRlciB0byBhIGxvY2F0aW9uIGluIHRoZSBzY3JhdGNoIG1lbW9yeSB0aGF0IGNhbiBiZSAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHN0b3JlIHRoZSBpbnB1dCBzYW1wbGVzIChlLmcuIHRvIHNhdmUgbWVtb3J5KSAgICAgICAqLwotLyogIHBPdXRwdXRJblNjcmF0Y2ggICAgICAgIHBvaW50ZXIgdG8gYSBsb2NhdGlvbiBpbiB0aGUgc2NyYXRjaCBtZW1vcnkgdGhhdCBjYW4gYmUgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBzdG9yZSB0aGUgb3V0cHV0IHNhbXBsZXMgKGUuZy4gdG8gc2F2ZSBtZW1vcnkpICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19PSyAgICAgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfRlMgICAgICAgICBXaGVuIHRoZSByZXF1ZXN0ZWQgaW5wdXQgb3Igb3V0cHV0IHNhbXBsaW5nIHJhdGVzICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX05SX0NIQU5ORUxTIFdoZW4gdGhlIGNoYW5uZWwgZm9ybWF0IGlzIG5vdCBlcXVhbCB0byBMVk1fTU9OTyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBvciBMVk1fU1RFUkVPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfV1JPTkdfTlJfU0FNUExFUyAgIFdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIG9uIHRoZSBpbnB1dCBvciB0aGUgb3V0cHV0ICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGluY29ycmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX05VTExfUE9JTlRFUiAgICAgICBXaGVuIGFueSBvZiB0aGUgaW5wdXQgcG9pbnRlcnMgaXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAqLwotLyogIFNTUkNfQUxMSU5HTUVOVF9FUlJPUiAgIFdoZW4gdGhlIGluc3RhbmNlIG1lbW9yeSBvciB0aGUgc2NyYXRjaCBtZW1vcnkgaXMgbm90ICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgNCBieXRlcyBhbGxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gVGhlIGluaXQgZnVuY3Rpb24gd2lsbCBjbGVhciB0aGUgaW50ZXJuYWwgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfSW5pdCggU1NSQ19JbnN0YW5jZV90KiBwU1NSQ19JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NSQ19TY3JhdGNoX3QqICBwU1NSQ19TY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1JDX1BhcmFtc190KiAgIHBTU1JDX1BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2KiogICAgICBwcElucHV0SW5TY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqKiAgICAgIHBwT3V0cHV0SW5TY3JhdGNoKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfU2V0R2FpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gc2V0cyBoZWFkcm9vbSBnYWluIGFuZCB0aGUgcG9zdCBnYWluIG9mIHRoZSBTU1JDICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGJIZWFkcm9vbUdhaW5FbmFibGVkICAgIHBhcmFtZXRlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgaGVhZHJvb20gZ2FpbiBvZiB0aGUgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgU1NSQy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIExWTV9NT0RFX09OLiAgTFZNX01PREVfT0ZGICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCBpbiBjYXNlIGl0IGNhbiBiZSBndWFyYW50ZWVkIHRoYXQgdGhlIGlucHV0ICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsIGlzIGJlbG93IC02ZEIgaW4gYWxsIGNhc2VzICh0aGUgZGVmYXVsdCBoZWFkcm9vbSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgLTYgZEIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGJPdXRwdXRHYWluRW5hYmxlZCAgICAgIHBhcmFtZXRlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgb3V0cHV0IGdhaW4uICBUaGUgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSBpcyBMVk1fTU9ERV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE91dHB1dEdhaW4gICAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgb3V0cHV0IGdhaW4uICBUaGUgb3V0cHV0IGdhaW4gaXMgYSBsaW5lYXIgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FpbiB2YWx1ZS4gMHg3RkZGIGlzIGVxdWFsIHRvICs2IGRCIGFuZCAweDAwMDAgY29ycmVzcG9uZHMgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICB0byAtaW5mIGRCLiAgQnkgZGVmYXVsdCwgYSAzZEIgZ2FpbiBpcyBhcHBsaWVkLCByZXN1bHRpbmcgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFuIG92ZXJhbGwgZ2FpbiBvZiAtM2RCICgtNmRCIGhlYWRyb29tICsgM2RCIG91dHB1dCBnYWluKSovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfT0sgICAgICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19OVUxMX1BPSU5URVIgICAgICAgV2hlbiBwU1NSQ19JbnN0YW5jZSBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfTU9ERSAgICAgICBXcm9uZyB2YWx1ZSB1c2VkIGZvciB0aGUgYkhlYWRyb29tR2FpbkVuYWJsZWQgb3IgdGhlICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGJPdXRwdXRHYWluRW5hYmxlZCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX1ZBTFVFICAgICAgV2hlbiBPdXRwdXRHYWluIGlzIG91dCB0byB0aGUgcmFuZ2UgWzA7MzI3NjddICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gVGhlIFNTUkNfU2V0R2FpbnMgZnVuY3Rpb24gaXMgYW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkICAgICAgKi8KLS8qICAgICBpbiByYXJlIGNhc2VzLiAgUHJlZmVyYWJseSwgdXNlIHRoZSBkZWZhdWx0IHNldHRpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotU1NSQ19SZXR1cm5TdGF0dXNfZW4gU1NSQ19TZXRHYWlucyggU1NSQ19JbnN0YW5jZV90KiBwU1NSQ19JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Nb2RlX2VuICAgICAgYkhlYWRyb29tR2FpbkVuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTW9kZV9lbiAgICAgIGJPdXRwdXRHYWluRW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgT3V0cHV0R2FpbiApOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIFNTUkMgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfSW5zdGFuY2UgICAgICAgICAgSW5zdGFuY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19BdWRpb0luICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX0F1ZGlvT3V0ICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogU1NSQ19PSyAgICAgICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBTU1JDX05VTExfUE9JTlRFUiAgICAgICAgV2hlbiBvbmUgb2YgcFNTUkNfSW5zdGFuY2UsIHBTU1JDX0F1ZGlvSW4gb3IgcFNTUkNfQXVkaW9PdXQgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfUHJvY2VzcyggIFNTUkNfSW5zdGFuY2VfdCogcFNTUkNfSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqICAgICAgIHBTU1JDX0F1ZGlvSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqICAgICAgIHBTU1JDX0F1ZGlvT3V0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNlbmRpZiAvKiBfX1NTUkNfSF9fICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9WaWRlb0VkaXRvclJlc2FtcGxlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvVmlkZW9FZGl0b3JSZXNhbXBsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg0OTdkMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9WaWRlb0VkaXRvclJlc2FtcGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVklERU9FRElUT1JSRVNBTVBMRVJfSAotI2RlZmluZSBWSURFT0VESVRPUlJFU0FNUExFUl9ICi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi1NNE9TQV9Db250ZXh0IExWQXVkaW9SZXNhbXBsZXJDcmVhdGUoTTRPU0FfSW50MzIgYml0RGVwdGgsIE00T1NBX0ludDMyIGluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHNhbXBsZVJhdGUsIE00T1NBX0ludDMyIHF1YWxpdHkpOwotdm9pZCBMVkF1ZGlvc2V0U2FtcGxlUmF0ZShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQsTTRPU0FfSW50MzIgaW5TYW1wbGVSYXRlKTsKLXZvaWQgTFZBdWRpb3NldFZvbHVtZShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQsIE00T1NBX0ludDE2IGxlZnQsIE00T1NBX0ludDE2IHJpZ2h0KSA7Ci12b2lkIExWQXVkaW9yZXNhbXBsZV9Mb3dRdWFsaXR5KE00T1NBX0ludDE2KiBvdXQsIE00T1NBX0ludDE2KiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBvdXRGcmFtZUNvdW50LCBNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQpOwotdm9pZCBMVkRlc3Ryb3koTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0KTsKLQotdm9pZCBNb25vVG8ySV8xNiggY29uc3QgTTRPU0FfSW50MTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiBuKTsKLQotdm9pZCBGcm9tMmlUb01vbm9fMTYoIGNvbnN0IE00T1NBX0ludDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiBuKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0jZW5kaWYgLyogVklERU9FRElUT1JSRVNBTVBMRVJfSCAqLwotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL21hcmtlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvbWFya2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzY2FkZTAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvbWFya2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgTUFSS0VSX0gKLSNkZWZpbmUgTUFSS0VSX0gKLQotI2RlZmluZSBBRERfQ09ERV9NQVJLRVJfRlVOKG1fY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggIShtX2NvbmRpdGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDIxNjE0MDYyXG5cdCIgICAgICAvKiAnIWFAYicgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDQ3NzEyNTQzXG5cdCIgICAgICAvKiAnR3ElQycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjQzXG5cdCIgICAgICAvKiAnX19fQycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDI0NUY1RjVGIiAgICAgICAgICAvKiAnJF9fXycgKi8gICAgXAotICAgICAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotI2RlZmluZSBBRERfVEVYVF9NQVJLRVJfRlVOKG1fY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggIShtX2NvbmRpdGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDIxNjE0MDYyXG5cdCIgICAgICAvKiAnIWFAYicgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDQ3NzEyNTQzXG5cdCIgICAgICAvKiAnR3ElQycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjU0XG5cdCIgICAgICAvKiAnX19fVCcgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDI0NUY1RjVGIiAgICAgICAgICAvKiAnJF9fXycgKi8gICAgXAotICAgICAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000RVhJRkNfQ29tbW9uQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000RVhJRkNfQ29tbW9uQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyM2MwMmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNEVYSUZDX0NvbW1vbkFQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNEVYSUZDX0NvbW1vbkFQSS5oCi0gKiBAYnJpZWYgICAgRVhJRiBjb21tb24gZGF0YSBoZWFkZXIKLSAqIEBub3RlICAgIFRoZSB0eXBlcywgc3RydWN0dXJlcyBhbmQgbWFjcm9zIGRlZmluZWQgaW4gdGhpcyBmaWxlIGFsbG93IHJlYWRpbmcKLSAqICAgICAgICAgICAgYW5kIHdyaXRpbmcgRVhJRiBKUEVHIGltYWdlcyBjb21wbGlhbnQgc3BlYyBFWElGIDIuMgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIF9fTTRfRVhJRl9DT01NT05fQVBJX0hfXwotI2RlZmluZSBfX000X0VYSUZfQ09NTU9OX0FQSV9IX18KLQotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotI2luY2x1ZGUgIk00Q29tbW9uX3R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiB0eXBlIE00RVhJRkNfQ29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogICAgTTRFWElGQ19Db250ZXh0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEVycm9ycyAmIFdhcm5pbmdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIE00RVhJRkNfTk9fRVJSICAgICAgICAgICAgICAweDAwMDAwMDAwICAgIC8qKjwgaW52YWxpZCBwYXJhbWV0ZXIgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfUEFSQU1FVEVSICAgICAgIDB4MDAwMDAwMDEgICAgLyoqPCBpbnZhbGlkIHBhcmFtZXRlciAqLwotI2RlZmluZSBNNEVYSUZDX0VSUl9BTExPQyAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKio8IGFsbG9jYXRpb24gZXJyb3IgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfQkFEX0NPTlRFWFQgICAgIDB4MDAwMDAwMDMgICAgLyoqPCBpbnZhbGlkIGNvbnRleHQgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfTk9UX0NPTVBMSUFOVCAgIDB4MDAwMDAwMDQgICAgLyoqPCB0aGUgaW1hZ2UgaW4gYnVmZmVyIGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQRUcgY29tcGxpYW50ICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX05PX0FQUF9GT1VORCAgICAweDAwMDAwMDA1ICAgIC8qKjwgdGhlIEpQRUcgaW1hZ2UgZG9lcyBub3QgY29udGFpbiBhbnkgQVBQMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGlmIDIuMiBjb21wbGlhbnQgKi8KLSNkZWZpbmUgTTRFWElGQ19XQVJfTk9fVEhVTUJOQUlMICAgIDB4MDAwMDAwMDYgICAgLyoqPCB0aGUgRXhpZiBwYXJ0IGRvZXMgbm90IGNvbnRhaW4gYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbCAqLwotI2RlZmluZSBNNEVYSUZDX0VSUl9BUFBfVFJVTkNBVEVEICAgMHgwMDAwMDAwNyAgICAvKio8IFRoZSBBUFAxIHNlY3Rpb24gaW4gaW5wdXQgYnVmZmVyIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBjb21wbGV0ZSAqLwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00RVhJRkNfQmFzaWNUYWdzCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgYmFzaWMgdGFncyB2YWx1ZXMuCi0gKiBAbm90ZSAgICAgICAgVGhpcyBFeGlmIHJlYWRlciBmb2N1c2VzIG9uIGEgc2V0IG9mICJFbnRyeSBUYWdzIi4KLSAqICAgICAgICAgICAgICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBjb3JyZXNwb25kaW5nICJFbnRyeSBWYWx1ZXMiIG9mIHRoZXNlIHRhZ3MuCi0gKiAgICAgICAgICAgICAgICBNNEVYSUZDX0NoYXIqIGZpZWxkcyBvZiBzdHJ1Y3R1cmUgYXJlIE51bGwgdGVybWluYXRlZCBTdHJpbmdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfSW50MzIgICAgICAgIHdpZHRoOyAgICAgICAgICAgICAgICAvKio8IGltYWdlIHdpZHRoIGluIHBpeGVscyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICBoZWlnaHQ7ICAgICAgICAgICAgICAgLyoqPCBpbWFnZSBoZWlnaHQgaW4gcGl4ZWxzICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmNyZWF0aW9uRGF0ZVRpbWU7ICAgICAvKio8IGRhdGUgYW5kIHRpbWUgb3JpZ2luYWwgaW1hZ2Ugd2FzIGdlbmVyYXRlZCAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpsYXN0Q2hhbmdlRGF0ZVRpbWU7ICAgLyoqPCBmaWxlIGNoYW5nZSBkYXRlIGFuZCB0aW1lICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmRlc2NyaXB0aW9uOyAgICAgICAgICAvKio8IGltYWdlIHRpdGxlICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKm1ha2U7ICAgICAgICAgICAgICAgICAvKio8IG1hbnVmYWN0dXJlciBvZiBpbWFnZSBpbnB1dCBlcXVpcG1lbnQgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqbW9kZWw7ICAgICAgICAgICAgICAgIC8qKjwgbW9kZWwgb2YgaW1hZ2UgaW5wdXQgZXF1aXBtZW50ICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKnNvZnR3YXJlOyAgICAgICAgICAgICAvKio8IHNvZnR3YXJlIHVzZWQgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqYXJ0aXN0OyAgICAgICAgICAgICAgIC8qKjwgcGVyc29uIHdobyBjcmVhdGVkIHRoZSBpbWFnZSAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpjb3B5cmlnaHQ7ICAgICAgICAgICAgLyoqPCBjb3B5cmlnaHQgaG9sZGVyICovCi0gICAgTTRDT01NT05fT3JpZW50YXRpb24gb3JpZW50YXRpb247ICAgICAgICAvKio8IG9yaWVudGF0aW9uIG9mIGltYWdlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgIHRodW1ibmFpbFNpemU7ICAgICAgICAvKio8IHNpemUgb2YgdGhlIHRodW1ibmFpbCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAqdGh1bWJuYWlsSW1nOyAgICAgICAgLyoqPCBwb2ludGVyIHRvIHRoZSB0aHVtYm5haWwgaW4gbWFpbiBpbWFnZSBidWZmZXIqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpsYXRpdHVkZVJlZjsgICAgICAgICAgLyoqPCBsYXRpdHVkZSByZWZlcmVuY2UgKi8KLSAgICBNNENPTU1PTl9Mb2NhdGlvbiBsYXRpdHVkZTsgICAgICAgICAgICAgIC8qKjwgbGF0aXR1ZGUgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqbG9uZ2l0dWRlUmVmOyAgICAgICAgIC8qKjwgbG9uZ2l0dWRlIHJlZmVyZW5jZSAqLwotICAgIE00Q09NTU9OX0xvY2F0aW9uIGxvbmdpdHVkZTsgICAgICAgICAgICAgLyoqPCBsb25naXR1ZGUgKi8KLQotfSBNNEVYSUZDX0Jhc2ljVGFnczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEVYSUZDX2dldFZlcnNpb24gICAgKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICBnZXQgdGhlIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgZXhpZiBsaWJyYXJ5LgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHZlcnNpb24gbnVtYmVycyBpbiBhIHN0cnVjdHVyZS4KLSAqIEBwYXJhbSAgICBwVmVyc2lvbjogICAgKE9VVCkgICAgICAgIHRoZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB2ZXJzaW9uIG51bWJlcnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFWElGQ19FUlJfUEFSQU1FVEVSOiAgICAgICAgKERlYnVnIG9ubHkpIHRoZSBwYXJhbWV0ZXIgaXMgTTRFWElGQ19OVUxMLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEVYSUZDX2dldFZlcnNpb24gKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbik7Ci0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyovCi0jZW5kaWYgLyogX19NNF9FWElGX0NPTU1PTl9BUElfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhYTIwZDIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UFRPM0dQUF9BUEkuaAotICogQGJyaWVmICAgIFRoZSBQaWN0dXJlcyB0byAzR1BQIENvbnZlcnRlci4KLSAqIEBub3RlICAgIE00UFRPM0dQUCBwcm9kdWNlcyAzR1BQIGNvbXBsaWFudCBhdWRpby92aWRlbyAgZmlsZXMKLSAqICAgICAgICAgICAgZnJvbSBhbiBBTVIgTkIgYXVkaW8gZmlsZSBhbmQgcmF3IHBpY3R1cmVzIGludG8gYSBNUEVHLTQvaDI2MyAzR1BQIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX000UFRPM0dQUF9BUElfSF9fCi0jZGVmaW5lIF9fTTRQVE8zR1BQX0FQSV9IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCB0eXBlcyBmb3IgZmlsZSBhY2Nlc3MgKi8KLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotCi0vKioKLSAqICAgIERlZmluaXRpb24gb2YgTTRfVmVyc2lvbkluZm8gKi8KLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLQotLyoqCi0gKiBEZWZpbml0aW9ucyBvZiBNNFZJRklfSW1hZ2VQbGFuZSAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLS8qKgotICogQ29tbW9uIGRlZmluaXRpb25zIG9mIHZpZGVvIGVkaXRpbmcgY29tcG9uZW50cyAqLwotI2luY2x1ZGUgIk00X1ZpZGVvRWRpdGluZ0NvbW1vbi5oIgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiAgICBQdWJsaWMgdHlwZSBvZiB0aGUgTTRQVE8zR1BQIGNvbnRleHQgKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRQVE8zR1BQX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFBUTzNHUFBfUmVwbGFjZUF1ZGlvTW9kZQotICogQGJyaWVmICAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgd2F5IHRoZSBhdWRpbyBpcyBtYW5hZ2VkIGlmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgdmlkZW8KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX05vbmUgPSAwLCAgLyoqPCBBdWRpbyB0cmFjayBpcyBrZXB0IHNob3J0ZXIgdGhhbiB0aGUgdmlkZW8gdHJhY2sqLwotICAgIE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9TaWxlbmNlLCAgIC8qKjwgSWYgYXVkaW8gaXMgc2hvcnRlciwgc2lsZW5jZSBpcyBhZGRlZCBhdCB0aGUgZW5kKi8KLSAgICBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTG9vcCAgICAgICAvKio8IElmIGF1ZGlvIGlzIHNob3J0ZXIsIGxvb3AgYmFjayB0byB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSB3aG9sZSB0cmFjayBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KLX0gTTRQVE8zR1BQX0F1ZGlvUGFkZGluZ01vZGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRQVE8zR1BQX091dHB1dEZpbGVNYXhTaXplCi0gKiBAYnJpZWYgICAgRGVmaW5lcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSAzR1BQIGZpbGUgcHJvZHVjZWQgYnkgdGhlIFBUTzNHUFAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRQVE8zR1BQX2s1MF9LQiwgICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDUwIEtieXRlcyAgKi8KLSAgICBNNFBUTzNHUFBfazc1X0tCLCAgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gNzUgS2J5dGVzICAqLwotICAgIE00UFRPM0dQUF9rMTAwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byAxMDAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2sxNTBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDE1MCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfazIwMF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gMjAwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rMzAwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byAzMDAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2s0MDBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDQwMCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfazUwMF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gNTAwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rVU5MSU1JVEVEPS0xICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbm90IGxpbWl0ZWQgICAgICAgICAgICovCi19IE00UFRPM0dQUF9PdXRwdXRGaWxlTWF4U2l6ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgKE00UFRPM0dQUF9QaWN0dXJlQ2FsbGJhY2tGY3QpIChNNE9TQV9Wb2lkKiBwUGljdHVyZUN0eHQsCi0gKiBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLCBNNE9TQV9Eb3VibGUqIHBQaWN0dXJlRHVyYXRpb24pOwotICogQGJyaWVmICAgIFRoZSBpbnRlZ3JhdG9yIG11c3QgaW1wbGVtZW50IGEgZnVuY3Rpb24gZm9sbG93aW5nIHRoaXMgcHJvdG90eXBlLgotICogICAgICAgICAgICBJdHMgZ29hbCBpcyB0byBmZWVkIHRoZSBQVE8zR1BQIHdpdGggWVVWNDIwIHBpY3R1cmVzLgotICoKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgZ2l2ZW4gdG8gdGhlIFBUTzNHUFAgaW4gdGhlIE00UFRPM0dQUF9QYXJhbXMgc3RydWN0dXJlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICogQHBhcmFtICAgIHBJbWFnZVBsYW5lcyhJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhyZWUgdmFsaWQgaW1hZ2UgcGxhbmVzCi0gKiBAcGFyYW0gICAgcFBpY3R1cmVEdXJhdGlvbihPVVQpIER1cmF0aW9uIG9mIHRoZSByZXR1cm5lZCBwaWN0dXJlCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRTogVGhlIHJldHVybmVkIGltYWdlIGlzIHRoZSBsYXN0IG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsIChiZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRQVE8zR1BQX1BpY3R1cmVDYWxsYmFja0ZjdCkgKE00T1NBX1ZvaWQqIHBQaWN0dXJlQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRG91YmxlKiBwUGljdHVyZUR1cmF0aW9uKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFBUTzNHUFBfUGFyYW1zCi0gKiBAYnJpZWYgICAgTTRQVE8zR1BQIHBhcmFtZXRlcnMgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgT3V0cHV0IHZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdCwgSDI2MyBvciBNUEVHNCAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0ICAgICAgT3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgLyoqPCBPdXRwdXQgZnJhbWUgc2l6ZSA6IFNRQ0lGIHRvIFZHQSovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgICBPdXRwdXRWaWRlb0ZyYW1lU2l6ZTsKLSAgICAvKio8IFRhcmdldGVkIE91dHB1dCBiaXQtcmF0ZSwgc2VlIGVudW0qLwotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgICAgICAgT3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIC8qKjwgTWF4aW11bSBzaXplIG9mIHRoZSBvdXRwdXQgM0dQUCBmaWxlLCBzZWUgZW51bSAqLwotICAgIE00UFRPM0dQUF9PdXRwdXRGaWxlTWF4U2l6ZSAgICAgT3V0cHV0RmlsZU1heFNpemU7Ci0gICAgLyoqPCBDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYnkgdGhlIFBUTzNHUFAgdG8gZ2V0IHRoZSBpbnB1dCBwaWN0dXJlcyovCi0gICAgTTRQVE8zR1BQX1BpY3R1cmVDYWxsYmFja0ZjdCogICBwUGljdHVyZUNhbGxiYWNrRmN0OwotICAgIC8qKjwgQ29udGV4dCB0byBiZSBnaXZlbiBhcyB0aGlyZCBhcmd1bWVudCBvZiB0aGUgcGljdHVyZSBjYWxsYmFjayBmdW5jdGlvbiBjYWxsKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgIHBQaWN0dXJlQ2FsbGJhY2tDdHh0OwotICAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCBhdWRpbyB0cmFjayBmaWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICBwSW5wdXRBdWRpb1RyYWNrRmlsZTsKLSAgICAvKio8IEZvcm1hdCBvZiB0aGUgYXVkaW8gZmlsZSAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgQXVkaW9GaWxlRm9ybWF0OwotICAgIC8qKjwgVHlwZSBvZiBwcm9jZXNzaW5nIHRvIGFwcGx5IHdoZW4gYXVkaW8gaXMgc2hvcnRlciB0aGFuIHZpZGVvKi8KLSAgICBNNFBUTzNHUFBfQXVkaW9QYWRkaW5nTW9kZSAgICAgIEF1ZGlvUGFkZGluZ01vZGU7Ci0gICAgLyoqPCBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIG91dHB1dCAzR1BQIGZpbGUgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQzZ3BwRmlsZTsKLSAgICAgLyoqPCBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHRlbXBvcmFyeSBmaWxlIHRvIHN0b3JlIG1ldGFkYXRhICgibW9vdi5iaW4iKSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgcFRlbXBvcmFyeUZpbGU7Ci0gICAgLyoqPCBOdW1iZXIgb2YgaW5wdXQgWVVWIGZyYW1lcyB0byBlbmNvZGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIE5iVmlkZW9GcmFtZXM7Ci0gICAgTTRPU0FfSW50MzIgICB2aWRlb1Byb2ZpbGU7Ci0gICAgTTRPU0FfSW50MzIgICB2aWRlb0xldmVsOwotfSBNNFBUTzNHUFBfUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLSAqIEBicmllZiAgICBHZXQgdGhlIE00UFRPM0dQUCB2ZXJzaW9uLgotICogQG5vdGUgICAgQ2FuIGJlIGNhbGxlZCBhbnl0aW1lLiBEbyBub3QgbmVlZCBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwVmVyc2lvbkluZm8gICAgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2ZXJzaW9uIGluZm8gc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfSW5pdChNNFBUTzNHUFBfQ29udGV4dCogcENvbnRleHQpOwotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBNNFBUTzNHUFAgKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgTTRQVE8zR1BQIGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgIHBGaWxlUmVhZFB0ckZjdCAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZSBjb250ZXh0IHN0cnVjdHVyZSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfSW5pdChNNFBUTzNHUFBfQ29udGV4dCogcENvbnRleHQsIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX09wZW4oTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQsIE00UFRPM0dQUF9QYXJhbXMqIHBQYXJhbXMpOwotICogQGJyaWVmICAgIFNldCB0aGUgTTRQVE8zR1BQIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBtYXkgbm90IGJlIGNyZWF0ZWQgeWV0LgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHBhcmFtICAgIHBQYXJhbXMgICAgICAgICAgICAgICAgKElOKSBQb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgUFRPM0dQUC4KLSAqIEBub3RlICAgIFRoZSBwb2ludGVkIHN0cnVjdHVyZSBjYW4gYmUgZGUtYWxsb2NhdGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBiZWNhdXNlCi0gKiAgICAgICAgICAgIGl0IGlzIGludGVybmFsbHkgY29waWVkIGJ5IHRoZSBQVE8zR1BQCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBwYXJhbWV0ZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVAotICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gZm9ybWF0ICBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURQotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IHZpZGVvIGJpdC1yYXRlIHBhcmFtZXRlciBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gICAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfRklMRV9TSVpFCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCBmaWxlIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9VTkRFRklORURfQVVESU9fUEFERElORwotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IGF1ZGlvIHBhZGRpbmcgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX09wZW4oTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQsIE00UFRPM0dQUF9QYXJhbXMqIHBQYXJhbXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfU3RlcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiB0cmFuY29kaW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkc6ICAgIEVuY29kaW5nIGNvbXBsZXRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX1N0ZXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfQ2xvc2UoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZpbmlzaCB0aGUgTTRQVE8zR1BQIHRyYW5zY29kaW5nLgotICogQG5vdGUgICAgVGhlIG91dHB1dCAzR1BQIGZpbGUgaXMgcmVhZHkgdG8gYmUgcGxheWVkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIE00UFRPM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9DbG9zZShNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9DbGVhblVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTTRQVE8zR1BQLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9DbGVhblVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNFBUTzNHUFBfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9FcnJvckNvZGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9FcnJvckNvZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3YmQ1NGYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfRXJyb3JDb2Rlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBUTzNHUFBfRXJyb3JDb2Rlcy5oCi0gKiBAYnJpZWYgICAgUGljdHVyZSB0byAzZ3BwIFNlcnZpY2UgZXJyb3IgZGVmaW5pdGlvbnMuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NNFBUTzNHUFBfRXJyb3JDb2Rlc19IX18KLSNkZWZpbmUgX19NNFBUTzNHUFBfRXJyb3JDb2Rlc19IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCBjb3JlIElEIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IHZpZGVvIGZvcm1hdCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDEgKQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgICAgICAgIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDAyICkKLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBiaXQtcmF0ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURSAgICAgICAgICAgXAotICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDMgKQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzICAgICAgICBcCi0gICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAwNCApCi0vKioKLSAqICAgIFRoZSBmaWxlIHNpemUgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0lOVkFMSURfRklMRV9TSVpFICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDUgKQotLyoqCi0gKiBUaGUgaW5wdXQgYXVkaW8gZmlsZSBjb250YWlucyBhIHRyYWNrIGZvcm1hdCBub3QgaGFuZGxlZCBieSBQVE8zR1BQICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOSEFORExFRF9BVURJT19UUkFDS19JTlBVVF9GSUxFICAgICAgICAgXAotICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDYgKQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IHZpZGVvIGZvcm1hdCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDcgKQotCi0vKioKLSAqICAgIFRoZSBBTVIgZGVjb2RlciBpbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfQU1SX0RFQ09ERVJfSU5JVF9FUlJPUiAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyMCApCi0vKioKLSAqICAgIFRoZSBBTVIgZGVjb2RlciBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfQU1SX0RFQ09ERV9FUlJPUiAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyMSApCi0vKioKLSAqICAgIFRoZSBBTVIgZGVjb2RlciBjbGVhbnVwIGZhaWxlZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9BTVJfREVDT0RFUl9ERVNUUk9ZX0VSUk9SICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDIyICkKLQotLyoqCi0gKiAgICBUaGUgdmlkZW8gZW5jb2RlciBpbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVklERU9fRU5DT0RFUl9JTklUX0VSUk9SICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyMyApCi0vKioKLSAqICAgIFRoZSB2aWRlbyBlbmNvZGVyIGRlY29kaW5nIGZhaWxlZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9WSURFT19FTkNPREVfRVJST1IgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDI0ICkKLS8qKgotICogICAgVGhlIHZpZGVvIGVuY29kZXIgY2xlYW51cCBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVklERU9fRU5DT0RFUl9ERVNUUk9ZX0VSUk9SICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyNSApCi0KLS8qKgotICogICAgVGhlIG91dHB1dCBmaWxlIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX0ZJTEVfU0laRSAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDI2ICkKLQotLyoqCi0gKiAgICBUaGUgRW5jb2RpbmcgaXMgY29tcGxldGVkICovCi0jZGVmaW5lIE00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkcgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjcgKQotCi0vKioKLSAqICAgIFRoZSBFbmNvZGluZyBpcyBjb21wbGV0ZWQgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkUgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyOCApCi0KLS8qKgotICogICAgVGhlIG91dHB1dCBhdWRpbyBwYWRkaW5nIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX0FVRElPX1BBRERJTkcgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyOSApCi0KLS8qKgotICogVGhlIHZpZGVvIGVuY29kZXIgZW5jb3VudGVyZWQgYW4gQWNjZXMgVW5pdCBlcnJvcjogdmVyeSBwcm9iYWJseSBhIGZpbGUgd3JpdGUgZXJyb3IgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyQSApCi0KLSNlbmRpZiAvKiBfX000UFRPM0dQUF9FcnJvckNvZGVzX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9JbnRlcm5hbFR5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9JbnRlcm5hbFR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5MmU1NjYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oCi0gKiBAYnJpZWYgICAgUGljdHVyZSB0byAzZ3BwIFNlcnZpY2UgaW50ZXJuYWwgZGVmaW5pdGlvbnMKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZW51bSBhbmQgdHlwZXMgbm90IHZpc2libGUgdG8gdGhlIGV4dGVybmFsIHdvcmxkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotI2lmbmRlZiBfX000UFRPM0dQUF9JTlRFUk5BTFRZUEVTX0hfXwotI2RlZmluZSBfX000UFRPM0dQUF9JTlRFUk5BTFRZUEVTX0hfXwotCi0jZGVmaW5lIE00UFRPM0dQUF9WRVJTSU9OX01BSk9SICAgICAgICAzCi0jZGVmaW5lIE00UFRPM0dQUF9WRVJTSU9OX01JTk9SICAgICAgICAwCi0jZGVmaW5lIE00UFRPM0dQUF9WRVJTSU9OX1JFVklTSU9OICAgIDYKLQotLyoqCi0gKiAgICBNNFBUTzNHUFAgcHVibGljIEFQSSBhbmQgdHlwZXMgKi8KLSNpbmNsdWRlICJNNFBUTzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRfVXRpbHMuaCIKLQotLyoqCi0gKiAgICBJbnRlcm5hbGx5IHVzZWQgbW9kdWxlcyAqLwotCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiICAgIC8qIFdyaXRlIDNHUFAgZmlsZSAgICAqLwotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIiAgICAvKiBSZWFkIEFNUiBmaWxlICAgICovCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRQVE8zR1BQX1N0YXRlcwotICogQGJyaWVmICAgICAgICBNYWluIHN0YXRlIG1hY2hpbmUgb2YgdGhlIE00UFRPM0dQUC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRQVE8zR1BQX2tTdGF0ZV9DUkVBVEVEICAgICAgICAgPSAwLCAgICAvKio8IE00UFRPM0dQUF9Jbml0IGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIE00UFRPM0dQUF9rU3RhdGVfT1BFTkVEICAgICAgICAgID0gMSwgICAgLyoqPCBNNFBUTzNHUFBfT3BlbiBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNFBUTzNHUFBfa1N0YXRlX1JFQURZICAgICAgICAgICA9IDIsICAgIC8qKjwgU3RlcCBjYW4gYmUgY2FsbGVkICovCi0gICAgTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRCAgICAgICAgPSAzLCAgICAvKio8IFRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgTTRQVE8zR1BQX2tTdGF0ZV9DTE9TRUQgICAgICAgICAgPSA0ICAgICAvKio8IE91dHB1dCBmaWxlIGhhcyBiZWVuIGNyZWF0ZWQgKi8KLX0KLU00UFRPM0dQUF9TdGF0ZXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00UFRPM0dQUF9TdHJlYW1TdGF0ZQotICogQGJyaWVmICAgICAgICBTdGF0ZSBvZiBhIG1lZGlhIHN0cmVhbSBlbmNvZGluZyAoYXVkaW8gb3IgdmlkZW8pLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX05PU1RSRUFNICA9IDAsICAgIC8qKjwgTm8gc3RyZWFtIHByZXNlbnQgKi8KLSAgICBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX1NUQVJURUQgICA9IDEsICAgIC8qKjwgVGhlIHN0cmVhbSBlbmNvZGluZyBpcyBpbiBwcm9ncmVzcyAqLwotICAgIE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfRklOSVNIRUQgID0gMiAgICAvKio8IFRoZSBzdHJlYW0gaGFzIGZpbmlzaGVkIGVuY29kaW5nICovCi19Ci1NNFBUTzNHUFBfU3RyZWFtU3RhdGU7Ci0KLS8qCi0gKiBEZWZpbml0aW9uIG9mIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00UFRPM0dQUF9WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8gICAgIDAuOEYgICAgLyoqPCBNYXggQVUgc2l6ZSB3aWxsIGJlIDAuOCB0aW1lcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlVVjQ6MjowIGZyYW1lIHNpemUgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1ZJREVPX0FVX1NJWkVfVE9fQ0hVTkNLX1NJWkVfUkFUSU8gICAgMS4yRiAvKio8IE1heCBjaHVuayBzaXplIHdpbGwgYmUgMS4yIHRpbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWF4IEFVIHNpemUgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX0FVRElPX01BWF9BVV9TSVpFICAgICAgICAgICAgICAxMDAwICAgIC8qKjwgQUFDIG1heCBBVSBzaXplIHNlZW1zIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3V0IDg1MCBieXRlcyAqLwotI2RlZmluZSBNNFBUTzNHUFBfQVVESU9fTUFYX0NIVU5LX1NJWkUgICAgICAgICAgIDUwMDAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgYW5vbnltb3VzIGVudW0KLSAqIEBicmllZiAgICAgICAgZW51bSB0byBrZWVwIHRyYWNrIG9mIHRoZSBlbmNvZGVyIHN0YXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLWVudW0KLXsKLSAgICBNNFBUTzNHUFBfa05vRW5jb2RlciwKLSAgICBNNFBUTzNHUFBfa0VuY29kZXJDbG9zZWQsCi0gICAgTTRQVE8zR1BQX2tFbmNvZGVyU3RvcHBlZCwKLSAgICBNNFBUTzNHUFBfa0VuY29kZXJSdW5uaW5nCi19OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIE00UFRPM0dQUCBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBNNFBUTzNHUFAgY2FsbHMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiAgICBNNFBUTzNHUFAgbWFpbiB2YXJpYWJsZXMgKi8KLSAgICBNNFBUTzNHUFBfU3RhdGVzICAgICAgICAgICAgIG1fU3RhdGU7ICAgICAgICAgICAgLyoqPCBNNFBUTzNHUFAgaW50ZXJuYWwgc3RhdGUgKi8KLSAgICBNNFBUTzNHUFBfUGFyYW1zICAgICAgICAgICAgIG1fUGFyYW1zOyAgICAgICAgICAgLyoqPCBNNFBUTzNHUFAgcGFyYW1ldGVycywgc2V0IGJ5IHRoZSB1c2VyICovCi0gICAgTTRQVE8zR1BQX1N0cmVhbVN0YXRlICAgICAgICBtX1ZpZGVvU3RhdGU7ICAgICAgIC8qKjwgU3RhdGUgb2YgdGhlIHZpZGVvIGVuY29kaW5nICovCi0gICAgTTRQVE8zR1BQX1N0cmVhbVN0YXRlICAgICAgICBtX0F1ZGlvU3RhdGU7ICAgICAgIC8qKjwgU3RhdGUgb2YgdGhlIGF1ZGlvIGVuY29kaW5nICovCi0KLSAgICAvKioKLSAgICAgKiAgICBPU0FMIGZpbGUgcmVhZC93cml0ZSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBwT3NhbEZpbGVSZWFkOyAgICAgLyoqPCBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICBwT3NhbEZpbGVXcml0ZTsgICAgLyoqPCBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLQotICAgIC8qKgotICAgICAqICAgIFJlYWRlciBzdHVmZiAqLwotICAgIE00X0FjY2Vzc1VuaXQqICAgICAgICAgICAgICAgIG1fcFJlYWRlckF1ZGlvQVU7ICAgIC8qKjwgUmVhZCBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgICAgIG1fcFJlYWRlckF1ZGlvU3RyZWFtOy8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHJlYWQgYXVkaW8gc3RyZWFtICovCi0KLSAgICAvKioKLSAgICAgKiAgICBXcml0ZXIgc3R1ZmYgKi8KLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgbV9Xcml0ZXJWaWRlb0FVOyAgICAgICAvKio8IFdyaXR0ZW4gdmlkZW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgbV9Xcml0ZXJBdWRpb0FVOyAgICAgICAvKio8IFdyaXR0ZW4gYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNEVOQ09ERVJfSGVhZGVyKiAgICAgICAgICAgbV9wRW5jb2RlckhlYWRlcjsgICAgICAvKio8IFNlcXVlbmNlIGhlYWRlciByZXR1cm5lZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgYXQgZW5jb2RlciBjcmVhdGUgKGlmIGFueSkgKi8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogICAgbV9wV3JpdGVyVmlkZW9TdHJlYW07ICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gc3RyZWFtICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qICAgIG1fcFdyaXRlckF1ZGlvU3RyZWFtOyAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MqICBtX3BXcml0ZXJWaWRlb1N0cmVhbUluZm87ICAgIC8qKjwgVmlkZW8gcHJvcGVydGllcyBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gc3RyZWFtICovCi0gICAgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyogICAgbV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvOyAgIC8qKjwgQXVkaW8gcHJvcGVydGllcyBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc3RyZWFtICovCi0KLSAgICAvKioKLSAgICAgKiAgICBDb250ZXh0cyBvZiB0aGUgdXNlZCBtb2R1bGVzICAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BBdWRpb1JlYWRlckNvbnRleHQ7IC8qKjwgQ29udGV4dCBvZiB0aGUgYXVkaW8gcmVhZGVyIG1vZHVsZSovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIG1fcDNncFdyaXRlckNvbnRleHQ7ICAgLyoqPCBDb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyIG1vZHVsZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BNcDRFbmNvZGVyQ29udGV4dDsgIC8qKjwgTXA0IGVuY29kZXIgY29udGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICBtX2VFbmNvZGVyU3RhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkZXIgSW50ZXJmYWNlcyAqLwotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICAgbV9wUmVhZGVyR2xvYkludDsgICAgLyoqPCBSZWFkZXIgY29tbW9uIGludGVyZmFjZSwgZ2xvYmFsIHBhcnQgKi8KLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgIG1fcFJlYWRlckRhdGFJbnQ7ICAgICAvKio8IFJlYWRlciBjb21tb24gaW50ZXJmYWNlLCBkYXRhIHBhcnQgKi8KLQotICAgIC8qKgotICAgICAqIFdyaXRlciBJbnRlcmZhY2VzICovCi0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgIG1fcFdyaXRlckdsb2JJbnQ7ICAgICAvKio8IFdyaXRlciBjb21tb24gaW50ZXJmYWNlLCBnbG9iYWwgcGFydCAqLwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICBtX3BXcml0ZXJEYXRhSW50OyAgICAgLyoqPCBXcml0ZXIgY29tbW9uIGludGVyZmFjZSwgZGF0YSBwYXJ0ICovCi0KLSAgICAvKioKLSAgICAgKiBFbmNvZGVyIEludGVyZmFjZXMgKi8KLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgbV9wRW5jb2RlckludDsgICAgICAgICAgICAgICAgLyoqPCBFbmNvZGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgbV9wRW5jb2RlckV4dGVybmFsQVBJOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICBtX3BFbmNvZGVyVXNlckRhdGE7Ci0KLSAgICAvKioKLSAgICAgKiAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lKiAgICAgICAgICAgIHBTYXZlZFBsYW5lOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIHVpU2F2ZWREdXJhdGlvbjsKLQotICAgIC8qKgotICAgICAqICAgIFZpZGVvIHJhdGUgY29udHJvbCBzdHVmZiAqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICBtX2RMYXN0VmlkZW9SZWd1bEN0czsgLyoqPCBMYXN0IHRpbWUgKENUUykgdGhlIHZpZGVvIGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhdGlvbiBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9tdEN0czsgICAgICAgICAvKio8IEN1cnJlbnQgdmlkZW8gY3RzICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fbXROZXh0Q3RzOyAgICAgLyoqPCBOZXh0IHZpZGVvIENUUyB0byB0cmFuc2NvZGUgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9tdEF1ZGlvQ3RzOyAgICAvKio8IEN1cnJlbnQgYXVkaW8gY3RzICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fQXVkaW9PZmZTZXQ7ICAgLyoqPCBBdWRpbyBPZmZzZXQgdG8gYWRkIHRvIHRoZSBjdHMgaW4gbG9vcCBtb2RlKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9QcmV2QXVkaW9DdHM7ICAvKio8IFByZXZpb3VzIGF1ZGlvIGN0cyBmb3IgQUFDIGxvb3BpbmcgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9EZWx0YUF1ZGlvQ3RzOyAvKio8IERlbHRhIGF1ZGlvIGN0cyBmb3IgQUFDIGxvb3BpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbV9DdXJyZW50RmlsZVNpemU7IC8qKjwgQ3VycmVudCBPdXRwdXQgZmlsZSBzaXplICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBtX01heEZpbGVTaXplOyAgICAgLyoqPCBNYXggT3V0cHV0IGZpbGUgc2l6ZSAgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgbV9Jc0xhc3RQaWN0dXJlOyAgIC8qKjwgQSBib29sZWFuIHRoYXQgc2lnbmFscyB0byB0aGUgZW5jb2RlciB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgbGFzdCBmcmFtZSB0byBiZSBlbmNvZGVkKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgbV9iTGFzdEludGVybmFsQ2FsbEJhY2s7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1fTmJDdXJyZW50RnJhbWU7ICAvKio8IEluZGV4IG9mIHRoZSBjdXJyZW50IFlVViBmcmFtZSBlbmNvZGVkICovCi0KLSAgICAvKioKLSAgICAgKiAgICBBdWRpbyBwYWRkaW5nIG1vZGUgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBtX2JBdWRpb1BhZGRpbmdTaWxlbmNlOyAgLyoqPCBBIGJvb2xlYW4gdGhhdCBzaWduYWxzIHRoYXQgYXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVSB3aWxsIGJlIHBhZGRlZCBieSBzaWxlbmNlICovCi19IE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQ7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfYXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLSAqIEBicmllZiAgICBDYWxsIGFuIGV4dGVybmFsIGNhbGxiYWNrIHRvIGdldCB0aGUgcGljdHVyZSB0byBlbmNvZGUKLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBNNFBUTzNHUFAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAoSU4pIENvbnRhaW5zIHRoZSBpbWFnZQotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbCBjb250YWluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgWVVWNDIwIGltYWdlIHJlYWQgd2l0aCB0aGUgbV9wUGljdHVyZUNhbGxiYWNrRmN0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9hcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRQVE8zR1BQX0lOVEVSTkFMVFlQRVNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiYjcxNDEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfQVBJX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9BUElfSF9fCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0FQSS5oCi0gKiBAYnJpZWYgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIHB1YmxpYyBBUEkuCi0gKiBAbm90ZSAgICBWU1MgYWxsb3dzIGVkaXRpbmcgM0dQUCBmaWxlcy4KLSAqICAgICAgICAgIEl0IGlzIGEgc3RyYWlnaHRmb3J3YXJkIGFuZCBmdWxseSBzeW5jaHJvbm91cyBBUEkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqCi0gKiAgT1NBTCBiYXNpYyB0eXBlcyBhbmQgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKioKLSAqICBPU0FMIHR5cGVzIGZvciBmaWxlIGFjY2VzcyAqLwotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLS8qKgotICogIERlZmluaXRpb24gb2YgTTRfVmVyc2lvbkluZm8gKi8KLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLQotLyoqCi0gKiBJbWFnZSBwbGFuZXMgZGVmaW5pdGlvbiAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLS8qKgotICogQ29tbW9uIGRlZmluaXRpb25zIG9mIHZpZGVvIGVkaXRpbmcgY29tcG9uZW50cyAqLwotI2luY2x1ZGUgIk00X1ZpZGVvRWRpdGluZ0NvbW1vbi5oIgotI2luY2x1ZGUgIk00RU5DT0RFUl9BdWRpb0NvbW1vbi5oIgotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTREQV9UeXBlcy5oIgotCi0vKioKLSAqIEV4dGVuZGVkIEFQSSAoeFZTUykgKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oIgotI2VuZGlmCi0KLS8vI2luY2x1ZGUgIk00VkRfSFdfQVBJLmgiCi0vLyNpbmNsdWRlICJNNFZFX0FQSS5oIgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgRWRpdGlvbiBGZWF0dXJlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICogIFB1YmxpYyB0eXBlIG9mIHRoZSBWU1MgZWRpdCBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00VlNTM0dQUF9FZGl0Q29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgdmlkZW8gZWZmZWN0IHR5cGVzIG9mIHRoZSBWU1MzR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX05vbmUgICAgICAgICAgID0gMCwgIC8qKjwgTm8gdmlkZW8gZWZmZWN0ICovCi0gICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjayAgPSA4LCAgLyoqPCBJbnRlbmRlZCBmb3IgYmVnaW4gZWZmZWN0ICovCi0gICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2sgICAgPSAxNiwgLyoqPCBJbnRlbmRlZCBmb3IgZW5kIGVmZmVjdCAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0V4dGVybmFsICAgICAgID0gMjU2IC8qKjwgRXh0ZXJuYWwgZWZmZWN0IGZ1bmN0aW9uIGlzIHVzZWQgKi8KLSAgICAvKiByZXNlcnZlZCAyNTYgKyBuICovICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEV4dGVybmFsIGVmZmVjdCBudW1iZXIgbiAqLwotCi19IE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfQXVkaW9FZmZlY3RUeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGF1ZGlvIGVmZmVjdCB0eXBlcyBvZiB0aGUgVlNTM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9Ob25lICAgID0gMCwKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlSW4gID0gOCwgLyoqPCBJbnRlbmRlZCBmb3IgYmVnaW4gZWZmZWN0ICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dCA9IDE2IC8qKjwgSW50ZW5kZWQgZm9yIGVuZCBlZmZlY3QgKi8KLQotfSBNNFZTUzNHUFBfQXVkaW9FZmZlY3RUeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRWU1MzR1BQX1ZpZGVvVHJhbnNpdGlvblR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgdmlkZW8gZWZmZWN0IHRoYXQgY2FuIGJlIGFwcGxpZWQgZHVyaW5nIGEgdHJhbnNpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmUgICAgICA9IDAsCi0gICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0Nyb3NzRmFkZSA9IDEsCi0gICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsICA9IDI1NgotICAgIC8qIHJlc2VydmVkIDI1NiArIG4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRXh0ZXJuYWwgdHJhbnNpdGlvbiBudW1iZXIgbiAqLwotCi19IE00VlNTM0dQUF9WaWRlb1RyYW5zaXRpb25UeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRWU1MzR1BQX0F1ZGlvVHJhbnNpdGlvblR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgYXVkaW8gZWZmZWN0IHRoYXQgY2FuIGJlIGFwcGxpZWQgZHVyaW5nIGEgdHJhbnNpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmUgPSAwLAotICAgIE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGUKLQotfSBNNFZTUzNHUFBfQXVkaW9UcmFuc2l0aW9uVHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byB0aGUgZXh0ZXJuYWwgRWZmZWN0Ci0gKiAgICAgICAgICBhbmQgVHJhbnNpdGlvbiBmdW5jdGlvbnMKLSAqIEBub3RlICAgIFRoZSB1aVByb2dyZXNzIHZhbHVlIHNob3VsZCBiZSBlbm91Z2ggZm9yIG1vc3QgY2FzZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IFByb2dyZXNzIG9mIHRoZSBFZmZlY3Qgb3IgdGhlIFRyYW5zaXRpb24sIGZyb20gMCB0byAxMDAwIChvbmUgdGhvdXNhbmQpICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpUHJvZ3Jlc3M7Ci0gICAgLyoqPCBJbmRleCBvZiB0aGUgY3VycmVudCBjbGlwIChmaXJzdCBjbGlwIGluIGNhc2Ugb2YgYSBUcmFuc2l0aW9uKSwgZnJvbSAwIHRvIE4gKi8KLSAgICAvL000T1NBX1VJbnQ4ICAgICB1aUN1cnJlbnRDbGlwOwotICAgIC8qKjwgQ3VycmVudCB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIGluIHRoZSBjdXJyZW50IGNsaXAgdGltZS1saW5lICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpQ2xpcFRpbWU7Ci0gICAgLyoqPCBDdXJyZW50IHRpbWUsIGluIG1pbGxpc2Vjb25kcywgaW4gdGhlIG91dHB1dCBjbGlwIHRpbWUtbGluZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aU91dHB1dFRpbWU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgYklzTGFzdDsKLQotfSBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9jb2RlY1R5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgY29kZWMgdHlwZXMgdXNlZCB0byBjcmVhdGUgaW50ZXJmYWNlcwotICogQG5vdGUgICAgVGhpcyBlbnVtIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVlNTM0dQUCBzZXJ2aWNlcyB0byBpZGVudGlmeQotICogICAgICAgICAgICAgYSBjdXJyZW50bHkgc3VwcG9ydGVkIGNvZGVjIGludGVyZmFjZS4gRWFjaCBjb2RlYyBpcwotICogICAgICAgICAgICByZWdpc3RlcmVkIHdpdGggb25lIG9mIHRoaXMgdHlwZSBhc3NvY2lhdGVkLgotICogICAgICAgICAgICBXaGVuIGEgY29kZWMgaW5zdGFuY2UgaXMgbmVlZGVkLCB0aGlzIHR5cGUgaXMgdXNlZCB0bwotICogICAgICAgICAgICBpZGVudGlmeSBhbmQgcmV0cmlldmUgaXRzIGludGVyZmFjZS4KLSAqICAgICAgICAgICAgVGhpcyBjYW4gYmUgZXh0ZW5kZWQgZm9yIG90aGVyIGNvZGVjcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyogVmlkZW8gRGVjb2RlciBUeXBlcyAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9EZWNNUEVHNCA9IDAsCi0gICAgTTRWU1MzR1BQX2tWaWRlb0RlY0gyNjQsCi0KLSAgICAvKiBWaWRlbyBFbmNvZGVyIFR5cGVzICovCi0gICAgTTRWU1MzR1BQX2tWaWRlb0VuY01QRUc0LAotICAgIE00VlNTM0dQUF9rVmlkZW9FbmNIMjYzLAotICAgIE00VlNTM0dQUF9rVmlkZW9FbmNIMjY0LAotCi0gICAgLyogQXVkaW8gRGVjb2RlciBUeXBlcyAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9EZWNBTVJOQiwKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRGVjQUFDLAotICAgIE00VlNTM0dQUF9rQXVkaW9EZWNNUDMsCi0KLSAgICAvKiBBdWRpbyBFbmNvZGVyIFR5cGVzICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb0VuY0FNUk5CLAotICAgIE00VlNTM0dQUF9rQXVkaW9FbmNBQUMsCi0KLSAgICAvKiBudW1iZXIgb2YgY29kZWNzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSwgYmVmb3JlIGludmxhaWQgdHlwZSAqLwotICAgIE00VlNTM0dQUF9rQ29kZWNUeXBlX05CLAotICAgIC8qIGludmFsaWQgY29kZWMgdHlwZSAqLwotICAgIE00VlNTM0dQUF9rQ29kZWNUeXBlSW52YWxpZCA9IDI1NQotCi19IE00VlNTM0dQUF9jb2RlY1R5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2VkaXRWaWRlb0VmZmVjdEZjdAotICogQGJyaWVmICAgICAgIEJlZ2luIGFuZCBFbmQgdmlkZW8gZWZmZWN0IGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBieSB0aGUgaW50ZWdyYXRvcgotICogICAgICAgICAgICAgIG11c3QgbWF0Y2ggdGhpcyBwcm90b3R5cGUuCi0gKiBAbm90ZSAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdpdGggdGhlIG9yaWdpbmFsIGltYWdlIG9mIHRoZSBjbGlwLgotICogICAgICAgICAgICAgIEl0IG11c3QgYXBwbHkgdGhlIHZpZGVvIGVmZmVjdCB0byBidWlsZCB0aGUgb3V0cHV0IGltYWdlLgotICogICAgICAgICAgICAgIFRoZSBwcm9ncmVzcyBvZiB0aGUgZWZmZWN0IGlzIGdpdmVuLCBvbiBhIHNjYWxlIGZyb20gMCB0byAxMDAwLgotICogICAgICAgICAgICAgIFdoZW4gdGhlIGVmZmVjdCBmdW5jdGlvbiBpcyBjYWxsZWQsIGFsbCB0aGUgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcwotICogICAgICAgICAgICAgIGFuZCBidWZmZXJzIGFyZSB2YWxpZCBhbmQgb3duZWQgYnkgdGhlIFZTUyAzR1BQLgotICoKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQgICAgKElOKSBUaGUgZnVuY3Rpb24gY29udGV4dCwgcHJldmlvdXNseSBzZXQgYnkgdGhlIGludGVncmF0b3IKLSAqIEBwYXJhbSAgIHBJbnB1dFBsYW5lcyAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhyZWUgdmFsaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwT3V0cHV0UGxhbmVzICAgICAgIChJTi9PVVQpIE91dHB1dCAoZmlsdGVyZWQpIFlVVjQyMCBpbWFnZTogcG9pbnRlciB0byBhbiBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aHJlZSB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChJTikgU2V0IG9mIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2aWRlbyB0cmFuc2l0aW9uIHByb2dyZXNzLgotICogQHBhcmFtICAgdWlFeHRlcm5hbEVmZmVjdElkICAoSU4pIFdoaWNoIGVmZmVjdCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCAoZm9yIGV4dGVybmFsIGVmZmVjdHMpCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRWU1MzR1BQX2VkaXRWaWRlb0VmZmVjdEZjdCkKLSgKLSAgICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBPdXRwdXRQbGFuZXMsCi0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFeHRlcm5hbEVmZmVjdElkCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9lZGl0VmlkZW9UcmFuc2l0aW9uRmN0Ci0gKiBAYnJpZWYgICAgICAgRXh0ZXJuYWwgdHJhbnNpdGlvbiBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0b3IKLSAqICAgICAgICAgICAgICBtdXN0IG1hdGNoIHRoaXMgcHJvdG90eXBlLgotICogQG5vdGUgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbWFnZSBvZiB0aGUgZmlyc3QgY2xpcCBhbmQKLSAqICAgICAgICAgICAgICB0aGUgaW1hZ2Ugb2YgdGhlIHNlY29uZCBjbGlwLiBJdCBtdXN0IGJ1aWxkIHRoZSBvdXRwdXQgaW1hZ2UKLSAqICAgICAgICAgICAgICBmcm9tIHRoZSB0d28gaW5wdXQgaW1hZ2VzLgotICogICAgICAgICAgICAgIFRoZSBwcm9ncmVzcyBvZiB0aGUgdHJhbnNpdGlvbiBpcyBnaXZlbiwgb24gYSBzY2FsZSBmcm9tIDAgdG8gMTAwMC4KLSAqICAgICAgICAgICAgICBXaGVuIHRoZSBleHRlcm5hbCBmdW5jdGlvbiBpcyBjYWxsZWQsIGFsbCB0aGUgaW1hZ2UgcGxhbmUKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGFuZCBidWZmZXJzIGFyZSB2YWxpZCBhbmQgb3duZWQgYnkgdGhlIFZTUyAzR1BQLgotICoKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQgICAgKElOKSBUaGUgZnVuY3Rpb24gY29udGV4dCwgcHJldmlvdXNseSBzZXQgYnkgdGhlIGludGVncmF0b3IKLSAqIEBwYXJhbSAgIHBDbGlwMUlucHV0UGxhbmVzICAgKElOKSBGaXJzdCBpbnB1dCBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwQ2xpcDJJbnB1dFBsYW5lcyAgIChJTikgU2Vjb25kIGlucHV0IFlVVjQyMCBpbWFnZTogcG9pbnRlciB0byBhbiBhcnJheSBvZiB0aHJlZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgIHBPdXRwdXRQbGFuZXMgICAgICAgKElOL09VVCkgT3V0cHV0IChmaWx0ZXJlZCkgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgKElOKSBTZXQgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZpZGVvIGVmZmVjdCBwcm9ncmVzcy4KLSAqIEBwYXJhbSAgIHVpRXh0ZXJuYWxUcmFuc2l0aW9uSWQgICAgKElOKSBXaGljaCB0cmFuc2l0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3IgZXh0ZXJuYWwgdHJhbnNpdGlvbnMpCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRWU1MzR1BQX2VkaXRWaWRlb1RyYW5zaXRpb25GY3QpCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcENsaXAxSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBDbGlwMklucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRXh0ZXJuYWxUcmFuc2l0aW9uSWQKLSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gYXVkaW8vdmlkZW8gZWZmZWN0IGZvciB0aGUgZWRpdGlvbi4KLSAqIEBub3RlICAgIEVmZmVjdCBzdGFydCB0aW1lIGlzIHJlbGF0aXZlIHRvIG91dHB1dCBjbGlwLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgdWlTdGFydFRpbWU7ICAgICAgICAgICAvKio8IEluIG1zICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICB1aUR1cmF0aW9uOyAgICAgICAgICAgIC8qKjwgSW4gbXMgKi8KLSAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlICAgIFZpZGVvRWZmZWN0VHlwZTsgICAgICAgLyoqPCBOb25lLCBGYWRlSW4sIEZhZGVPdXQsIGV0Yy4gKi8KLSAgICBNNFZTUzNHUFBfZWRpdFZpZGVvRWZmZWN0RmN0IEV4dFZpZGVvRWZmZWN0RmN0OyAgICAgLyoqPCBFeHRlcm5hbCBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgKnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQ7LyoqPCBDb250ZXh0IGdpdmVuIHRvIHRoZSBleHRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdCBmdW5jdGlvbiAqLwotICAgIE00VlNTM0dQUF9BdWRpb0VmZmVjdFR5cGUgICAgQXVkaW9FZmZlY3RUeXBlOyAgICAgICAvKio8IE5vbmUsIEZhZGVJbiwgRmFkZU91dCAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotICAgIE00eFZTU19FZmZlY3RTZXR0aW5ncyAgICAgICAgIHhWU1M7Ci0jZW5kaWYKLQotfSBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cgotICogQGJyaWVmICAgIFRyYW5zaXRpb24gYmVoYXZpb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU3BlZWRVcCA9IDAsCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfTGluZWFyLAotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX1NwZWVkRG93biwKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9TbG93TWlkZGxlLAotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX0Zhc3RNaWRkbGUKLX0gTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXI7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSB0cmFuc2l0aW9uIHRvIGJlIGFwcGxpZWQgd2hlbiBhc3NlbWJsaW5nIHR3byBjbGlwcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IER1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLCBpbiBtaWxsaXNlY29uZHMgKHNldCB0byAwIHRvIGdldCBubyB0cmFuc2l0aW9uKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgIHVpVHJhbnNpdGlvbkR1cmF0aW9uOwotCi0gICAgLyoqPCBUeXBlIG9mIHRoZSB2aWRlbyB0cmFuc2l0aW9uICovCi0gICAgTTRWU1MzR1BQX1ZpZGVvVHJhbnNpdGlvblR5cGUgICAgVmlkZW9UcmFuc2l0aW9uVHlwZTsKLQotICAgIC8qKjwgRXh0ZXJuYWwgdHJhbnNpdGlvbiB2aWRlbyBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNFZTUzNHUFBfZWRpdFZpZGVvVHJhbnNpdGlvbkZjdCBFeHRWaWRlb1RyYW5zaXRpb25GY3Q7Ci0KLSAgICAvKio8IENvbnRleHQgb2YgdGhlIGV4dGVybmFsIHRyYW5zaXRpb24gdmlkZW8gZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAqcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQ7Ci0gICAgTTRWU1MzR1BQX0F1ZGlvVHJhbnNpdGlvblR5cGUgICAgQXVkaW9UcmFuc2l0aW9uVHlwZTsgICAvKio8IFR5cGUgb2YgdGhlIGF1ZGlvIHRyYW5zaXRpb24gKi8KLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91ciAgICAgVHJhbnNpdGlvbkJlaGF2aW91cjsgICAgLyoqPFRyYW5zaXRpb24gYmVoYXZpb3VyKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLSAgICBNNHhWU1NfVHJhbnNpdGlvblNldHRpbmdzICAgICAgICB4VlNTOwotI2VuZGlmCi0KLX0gTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gaW5wdXQgY2xpcCBmb3IgdGhlIGVkaXRpb24uCi0gKiBAbm90ZSAgICBJdCBhbHNvIGNvbnRhaW5zIHRoZSBzZXR0aW5ncyBmb3IgdGhlIGN1dCBhbmQgYmVnaW4vZW5kIGVmZmVjdHMgYXBwbGllZCB0byB0aGUgY2xpcC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgICAgKnBGaWxlOyAgICAgICAgICAgIC8qKjwgQ2xpcCBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgIEZpbGVUeXBlOyAgICAgICAgIC8qKjwgLjNncCwgLmFtciwgLm1wMyAgICAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoU2l6ZTsgICAgICAvKio8IENsaXAgcGF0aCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGQgYmVjYXVzZSBvZiBVVEYxNiBjb252ZXJzaW9uKSovCi0gICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgICBDbGlwUHJvcGVydGllczsgICAvKio8IENsaXAgYW5hbHlzaXMgcHJldmlvdXNseSBjb21wdXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlCZWdpbkN1dFRpbWU7ICAgLyoqPCBCZWdpbiBjdXQgdGltZSwgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB1aUVuZEN1dFRpbWU7ICAgICAvKio8IEVuZCBjdXQgdGltZSwgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICBiVHJhbnNjb2RpbmdSZXF1aXJlZDsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLSAgICBNNHhWU1NfQ2xpcFNldHRpbmdzICAgICAgICAgICAgIHhWU1M7Ci0jZW5kaWYKLQotfSBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZ2F0aGVycyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZWZpbmUgYSBjb21wbGV0ZQotICogICAgICAgICAgZWRpdGlvbiBvcGVyYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnQgb2YgdGhlIGNsaXAgbGlzdCBwQ2xpcExpc3QgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBOdW1iZXI7Ci0gICAgLyoqPCBUaGUgcHJvcGVydGllcyBvZiB0aGlzIGNsaXAgd2lsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBjb21wYXRpYmlsaXR5IGNoZWNraW5nICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgdWlNYXN0ZXJDbGlwOwotICAgIC8qKjwgTGlzdCBvZiB0aGUgaW5wdXQgY2xpcHMgc2V0dGluZ3MuIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdWlDbGlwTnVtYmVyCi0gICAgIGNsaXAgc2V0dGluZ3MgcG9pbnRlcnMgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICAgICAgICAgICAqKnBDbGlwTGlzdDsKLSAgICAvKio8IExpc3Qgb2YgdGhlIHRyYW5zaXRpb24gc2V0dGluZ3MuIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdWlDbGlwTnVtYmVyLTEKLSAgICAgdHJhbnNpdGlvbiBzZXR0aW5ncyBwb2ludGVycyAqLwotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgICAgICoqcFRyYW5zaXRpb25MaXN0OwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAgICAgICAgICpFZmZlY3RzOyAgICAgICAgIC8qKjwgTGlzdCBvZiBlZmZlY3RzICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICAgbmJFZmZlY3RzOyAgICAgLyoqPCBOdW1iZXIgb2YgZWZmZWN0cyBpbiB0aGUgYWJvdmUgbGlzdCAqLwotICAgIC8qKjwgRnJhbWUgcmF0ZSBhdCB3aGljaCB0aGUgbW9kaWZpZWQgdmlkZW8gc2VjdGlvbnMgd2lsbCBiZSBlbmNvZGVkICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZXJhdGUgICAgdmlkZW9GcmFtZVJhdGU7Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnBPdXRwdXRGaWxlOyAgICAgIC8qKjwgT3V0cHV0IDNHUFAgY2xpcCBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICB1aU91dHB1dFBhdGhTaXplOyAgICAvKio8IE91dHB1dCBmaWxlIHBhdGggc2l6ZSovCi0gICAgLyoqPCBUZW1wb3JhcnkgZmlsZSB0byBzdG9yZSBtZXRhZGF0YSAoIm1vb3YuYmluIikgKi8KLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgICAgICAqcFRlbXBvcmFyeUZpbGU7Ci0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0gICAgTTR4VlNTX0VkaXRTZXR0aW5ncyAgICAgICAgICAgICAgeFZTUzsKLSNlbmRpZgotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICBQVFZvbExldmVsOwotfSBNNFZTUzNHUFBfRWRpdFNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAoKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgY2hlY2tpbmcgaWYgYSBjbGlwIGlzIGNvbXBhdGlibGUgd2l0aCBWU1MgM0dQUCBlZGl0aW5nCi0gKiBAbm90ZSAgICBJdCBhbHNvIGZpbGxzIGEgQ2xpcEFuYWx5c2lzIHN0cnVjdHVyZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY2hlY2sgaWYgdHdvCi0gKiAgICAgICAgICBjbGlwcyBhcmUgY29tcGF0aWJsZQotICogQHBhcmFtICAgcENsaXAgICAgICAgICAgICAgICAoSU4pIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgM0dQUC9NUDMgY2xpcCBmaWxlLgotICogQHBhcmFtICAgcENsaXBQcm9wZXJ0aWVzICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBDbGlwUHJvcGVydGllcyBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gICBGaWxlVHlwZSAgICAgICAgICAgIChJTikgVHlwZSBvZiB0aGUgaW5wdXQgZmlsZSAoLjNncCwgLmFtciwgLm1wMykKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUFJPRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9SVkxDCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1ZJREVPX1NUUkVBTV9JTl9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAoTTRPU0FfVm9pZCAqcENsaXAsIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIEZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgICpwQ2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eSgpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiB0d28gY2xpcHMgYXJlIGNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyCi0gKiAgICAgICAgICBmb3IgVlNTIDNHUFAgZWRpdGluZyBhc3NlbWJseSBmZWF0dXJlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwMVByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgZmlyc3QgY2xpcAotICogQHBhcmFtICAgcENsaXAyUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBzZWNvbmQgY2xpcAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19QTEFURk9STQotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GUkFNRV9TSVpFCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19USU1FX1NDQUxFCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19EQVRBX1BBUlRJVElPTklORwotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgICpwQ2xpcDFQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAgKnBDbGlwMlByb3BlcnRpZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEluaXQoKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgM0dQUCBlZGl0IG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBWU1MgM0dQUCBlZGl0IGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHJGY3QgICAgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRJbml0KAotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCogcENvbnRleHQsCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QsCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVQdHJGY3QgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEFsbG93cyBmaWxsaW5nIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcwotICoKLSAqIEBub3RlICAgIFdBUk5JTkc6IHBDbGlwU2V0dGluZ3MtPnBGaWxlICAgICAgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIHBGaWxlICAgICAgICAgICAgICAgKElOKSBDbGlwIGZpbGUgbmFtZQotICogQHBhcmFtICAgZmlsZVBhdGhTaXplICAgICAgICAoSU4pIFNpemUgb2YgdGhlIGNsaXAgcGF0aCAobmVlZGVkIGZvciBVVEYxNiBjb252ZXJzaW9uKQotICogQHBhcmFtICAgIG5iRWZmZWN0cyAgICAgICAgICAgKElOKSBOYiBvZiBlZmZlY3Qgc2V0dGluZ3MgdG8gYWxsb2NhdGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGUsIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggbmJFZmZlY3RzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIER1cGxpY2F0ZXMgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSwgcGVyZm9ybWluZyBhbGxvY2F0aW9ucyBpZiByZXF1aXJlZAotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzRGVzdCAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NPcmlnICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBiQ29weUVmZmVjdHMgICAgICAgIChJTikgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZHVwbGljYXRlIGVmZmVjdHMgKGRlcHJlY2F0ZWQpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzRGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJDb3B5RWZmZWN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgRnJlZSB0aGUgcG9pbnRlcnMgYWxsb2NhdGVkIGluIHRoZSBDbGlwU2V0dGluZyBzdHJ1Y3R1cmUgKHBGaWxlLCBFZmZlY3RzKS4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKCkKLSAqIEBicmllZiAgIFNldCB0aGUgVlNTIDNHUFAgaW5wdXQgYW5kIG91dHB1dCBmaWxlcywgYW5kIHNldCB0aGUgc2V0dGluZ3MuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgcFNldHRpbmdzICAgICAgICAgICAoSU4pIEVkaXQgc2V0dGluZ3MKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0T3BlbihNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKnBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0U3RlcCgpCi0gKiBAYnJpZWYgICBQZXJmb3JtIG9uZSBzdGVwIG9mIGVkaXRpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKSBvZiB0aGUgZWRpdGluZyBvcGVyYXRpb24KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICAgICAgVlNTIDNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOkVkaXRpb24gaXMgZG9uZSwgdXNlciBzaG91bGQgbm93IGNhbGwgTTRWU1MzR1BQX2VkaXRDbG9zZSgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdFN0ZXAoTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbG9zZSgpCi0gKiBAYnJpZWYgICBGaW5pc2ggdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIG91dHB1dCAzR1BQIGZpbGUgaXMgcmVhZHkgdG8gYmUgcGxheWVkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGVkaXQgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBWU1MgM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpCi0gKiBAYnJpZWYgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgVlNTIDNHUFAgZWRpdCBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGVkaXQgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbGVhblVwKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgQXVkaW8gTWl4aW5nIEZlYXR1cmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qKgotICogIFB1YmxpYyB0eXBlIG9mIHRoZSBWU1MgYXVkaW8gbWl4aW5nIGNvbnRleHQgKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzZXR0aW5ncyBvZiB0aGUgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3JpZ2luYWxDbGlwRmlsZTsgICAgICAvKio8IElucHV0IDNHUFAgY2xpcCBmaWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRlZEF1ZGlvVHJhY2tGaWxlOyAgIC8qKjwgTmV3IGF1ZGlvIHRyYWNrICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICAgICAgICAgIEFkZGVkQXVkaW9GaWxlVHlwZTsgICAgIC8qKjwgRmlsZSBGb3JtYXQgb2YgdGhlIG5ldyBhdWRpbyBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQWRkQ3RzOyAgICAgICAgICAgICAgIC8qKjwgVGltZSwgaW4gbWlsbGlzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB3aGljaCB0aGUgYWRkZWQgYXVkaW8gdHJhY2sgaXMgaW5zZXJ0ZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlBZGRWb2x1bWU7ICAgICAgICAgICAgLyoqPCBWb2x1bWUsIGluIHBlcmNlbnRhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgYWRkZWQgYXVkaW8gdHJhY2sgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlCZWdpbkxvb3A7ICAgICAgICAgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgdGltZSBvZiB0aGUgbG9vcCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUVuZExvb3A7ICAgICAgICAgICAgICAvKio8IERlc2NyaWJlcyBpbiBtaWxsaS1zZWNvbmQgdGhlIGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG9mIHRoZSBsb29wICgwIG1lYW5zIG5vIGxvb3ApICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZW1vdmVPcmlnaW5hbDsgICAgICAvKio8IElmIHRydWUsIHRoZSBvcmlnaW5hbCBhdWRpbyB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHRha2VuIGludG8gYWNjb3VudCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0Q2xpcEZpbGU7ICAgICAgLyoqPCBPdXRwdXQgM0dQUCBjbGlwIGZpbGUgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBvcmFyeUZpbGU7ICAgICAgIC8qKjwgVGVtcG9yYXJ5IGZpbGUgdG8gc3RvcmUgbWV0YWRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtb292LmJpbiIpICovCi0gICAgLyoqPCBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIG9wdGlvbm5hbC4gVGhleSBhcmUganVzdCB1c2VkIGluIGNhc2Ugb2YgTVAzIHJlcGxhY2VtZW50LiAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgICBvdXRwdXRBU0Y7ICAgICAgICAgLyoqPCBPdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9Gb3JtYXQgICAgICAgICAgICAgIG91dHB1dEF1ZGlvRm9ybWF0OyAvKio8IE91dHB1dCBhdWRpbyBjb2RlYyhBQUMvQU1SKSovCi0gICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZSAgICAgICAgICAgICAgICAgIG91dHB1dEF1ZGlvQml0cmF0ZTsgLyoqPCBPdXRwdXQgYXVkaW8gYml0cmF0ZSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXROQkNoYW5uZWxzOyAvKio8IE91dHB1dCBhdWRpbyBuYiBvZiBjaGFubmVscyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX0R1Y2tpbmdOZWVkZWVkOwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQlRWb2xMZXZlbDsKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlBUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMb29wOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aU51bUNoYW5uZWxzOwotfSBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0KiBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiBwU2V0dGluZ3MpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgYXVkaW8gbWl4aW5nIHNldHRpbmdzCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0KAotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQqIHBDb250ZXh0LAotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiBwU2V0dGluZ3MsCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QsCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVQdHJGY3QgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcCgpCi0gKiBAYnJpZWYgICBQZXJmb3JtIG9uZSBzdGVwIG9mIGF1ZGlvIG1peGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgIChJTikgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgICAgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmaW5hbGl6YXRpb24gb3BlcmF0aW9uCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgICAgICAgICAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkc6IEF1ZGlvIG1peGluZyBpcyBvdmVyLCB1c2VyIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgY2FsbCBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpCi0gKiBAYnJpZWYgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgVlNTIGF1ZGlvIG1peGluZyBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgRXh0cmFjdCBQaWN0dXJlIEZlYXR1cmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qKgotICogIFB1YmxpYyB0eXBlIG9mIHRoZSBWU1MgZXh0cmFjdCBwaWN0dXJlIGNvbnRleHQgKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc2V0dGluZ3Mgb2YgdGhlIGV4dHJhY3QgcGljdHVyZSBhdWRpbyBvcGVyYXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRDbGlwRmlsZTsgIC8qKjwgSW5wdXQgM0dQUCBjbGlwIGZpbGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBpRXh0cmFjdGlvblRpbWU7IC8qKjwgZnJhbWUgdGltZSAoaW4gbXMpIHRvIGJlIGV4dHJhY3RlZCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXRZdXZQaWM7ICAgLyoqPCBPdXRwdXQgWVVWIHBpY3R1cmUgbmFtZSAqLwotfSBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTZXR0aW5nczsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlSW5pdCgpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBleHRyYWN0IHBpY3R1cmUgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyBleHRyYWN0IHBpY3R1cmUgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgICAgIChJTikgUG9pbnRlciB0byB2YWxpZCBleHRyYWN0IHBpY3R1cmUgc2V0dGluZ3MKLSAqIEBwYXJhbSAgICBwV2lkdGggICAgICAgICAgICAgICAgKE9VVCkgdmlkZW8gc3RyZWFtIHdpZHRoCi0gKiBAcGFyYW0gICAgcEhlaWdodCAgICAgICAgICAgICAgICAoT1VUKSB2aWRlbyBzdHJlYW0gaGVpZ2h0Ci0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVAxOiAgICBUaGUgaW5wdXQgY2xpcCBpcyBlbXB0eQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlSW5pdCgKLSAgICAgICAgTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZVNldHRpbmdzKiBwU2V0dGluZ3MsCi0gICAgICAgIE00T1NBX1VJbnQzMiAqcFdpZHRoLAotICAgICAgICBNNE9TQV9VSW50MzIgKnBIZWlnaHQsCi0gICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0ICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZVN0ZXAoKQotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBwaWN0dXJlIGV4dHJhY3Rpb24uCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFZTUyBleHRyYWN0IHBpY3R1cmUgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHBhcmFtICAgcERlY1BsYW5lcyAgICAgICAgICAgICAgICAgICAgICAoT1VUKSBQbGFuZSBpbiB3aWNoIHRoZSBleHRyYWN0ZWQgcGljdHVyZSBpcyBjb3BpZWQKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgICAgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHBpY3R1cmUgZXh0cmFjdGlvbgotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICAgICAgICAgICAgICBWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgVlNTX1dBUl9FTkRfT0ZfRVhUUkFDVF9QSUNUVVJFOiBQaWN0dXJlIGV4dHJhY3Rpb24gIGlzIG92ZXIsIHVzZXIgc2hvdWxkIG5vdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUNsZWFuVXAoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlU3RlcChNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVDb250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBEZWNQbGFuZXMsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwKCkKLSAqIEBicmllZiAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBWU1MgcGljdHVyZSBleHRyYWN0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgZXh0cmFjdCBwaWN0dXJlIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUNsZWFuVXAoTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgQ29tbW9uIGZlYXR1cmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRWZXJzaW9uKCkKLSAqIEBicmllZiAgIEdldCB0aGUgVlNTIHZlcnNpb24uCi0gKiBAbm90ZSAgICBDYW4gYmUgY2FsbGVkIGFueXRpbWUuIERvIG5vdCBuZWVkIGFueSBjb250ZXh0LgotICogQHBhcmFtICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0KLQotI2lmZGVmIFdJTjMyCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfR2V0RXJyb3JNZXNzYWdlKCkKLSAqIEBicmllZiAgIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBnaXZlbiBlcnJvciBjb2RlCi0gKiBAbm90ZSAgICBUaGUgaW5wdXQgc3RyaW5nIG11c3QgYmUgYWxyZWFkeSBhbGxvY2F0ZWQgKGFuZCBsb25nIGVub3VnaCEpCi0gKiBAcGFyYW0gICBlcnIgICAgICAgICAgICAgKElOKSBFcnJvciBjb2RlIHRvIGdldCB0aGUgZGVzY3JpcHRpb24gZnJvbQotICogQHBhcmFtICAgc01lc3NhZ2UgICAgICAgIChJTi9PVVQpIEFsbG9jYXRlZCBzdHJpbmcgaW4gd2hpY2ggdGhlIGRlc2NyaXB0aW9uIHdpbGwgYmUgY29waWVkCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgSW5wdXQgZXJyb3IgaXMgZnJvbSB0aGUgVlNTM0dQUCBtb2R1bGUKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjpJbnB1dCBlcnJvciBpcyBub3QgZnJvbSB0aGUgVlNTM0dQUCBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRFcnJvck1lc3NhZ2UoTTRPU0FfRVJSIGVyciwgTTRPU0FfQ2hhciogc01lc3NhZ2UpOwotI2VuZGlmIC8qKjwgV0lOMzIgKi8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FcnJvckNvZGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FcnJvckNvZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjNTAwZGEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXJyb3JDb2Rlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oCi0gKiBAYnJpZWYgICAgVmlkZW8gU3R1ZGlvIFNlcnZpY2UgM0dQUCBlcnJvciBkZWZpbml0aW9ucy4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX000VlNTM0dQUF9FcnJvckNvZGVzX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9FcnJvckNvZGVzX0hfXwotCi0vKioKLSAqICAgIE9TQUwgYmFzaWMgdHlwZXMgYW5kIGVycm9ycyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotLyoqCi0gKiAgICBPU0FMIGNvcmUgSUQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogV2FybmluZyBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogICAgRW5kIG9mIGVkaXRpb24sIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00VlNTM0dQUF9lZGl0Q2xvc2UoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDAxKQotCi0vKioKLSAqICAgIEVuZCBvZiBhdWRpbyBtaXhpbmcsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkcgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDEwKQotCi0vKioKLSAqICAgIEVuZCBvZiBleHRyYWN0IHBpY3R1cmUsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUNsZWFuVXAoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDIwKQotLyogUkM6IHRvIGtub3cgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWU1MzR1BQLCAweDAwMzApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFcnJvciBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBJbnZhbGlkIGZpbGUgdHlwZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwMSkKLS8qKgotICogSW52YWxpZCBlZmZlY3Qga2luZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRUZGRUNUX0tJTkQgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwMikKLS8qKgotICogSW52YWxpZCBlZmZlY3QgdHlwZSBmb3IgdmlkZW8gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VGRkVDVF9UWVBFICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDMpCi0vKioKLSAqIEludmFsaWQgZWZmZWN0IHR5cGUgZm9yIGF1ZGlvICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19FRkZFQ1RfVFlQRSAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA0KQotLyoqCi0gKiBJbnZhbGlkIHRyYW5zaXRpb24gdHlwZSBmb3IgdmlkZW8gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDUpCi0vKioKLSAqIEludmFsaWQgdHJhbnNpdGlvbiB0eXBlIGZvciBhdWRpbyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fVFJBTlNJVElPTl9UWVBFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwNikKLS8qKgotICogSW52YWxpZCB2aWRlbyBlbmNvZGluZyBmcmFtZSByYXRlICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDcpCi0gLyoqCi0gKiBFeHRlcm5hbCBlZmZlY3QgZnVuY3Rpb24gaXMgdXNlZCB3aXRob3V0IGJlaW5nIHNldCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX0VGRkVDVF9OVUxMICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwOCkKLS8qKgotICogRXh0ZXJuYWwgdHJhbnNpdGlvbiBmdW5jdGlvbiBpcyB1c2VkIHdpdGhvdXQgYmVpbmcgc2V0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRVhURVJOQUxfVFJBTlNJVElPTl9OVUxMICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA5KQotCi0vKioKLSAqIEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuIHRoZSBjbGlwIGR1cmF0aW9uICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDEwKQotLyoqCi0gKiBCZWdpbiBjdXQgdGltZSBpcyBsYXJnZXIgb3IgZXF1YWwgdGhhbiBlbmQgY3V0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDExKQotLyoqCi0gKiBUd28gY29uc2VjdXRpdmUgdHJhbnNpdGlvbnMgYXJlIG92ZXJsYXBwaW5nIG9uIG9uZSBjbGlwICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfT1ZFUkxBUFBJTkdfVFJBTlNJVElPTlMgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDEyKQotCi0vKioKLSAqIEFuIGlucHV0IDNHUFAgZmlsZSBpcyBpbnZhbGlkL2NvcnJ1cHRlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfM0dQUF9GSUxFICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxNikKLS8qKgotICogQSBmaWxlIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIHZpZGVvIGZvcm1hdCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVCAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxNykKLS8qKgotICogQSBmaWxlIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVCAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxOCkKLQotLyoqCi0gKiBBIGZpbGUgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFZTUyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVEICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxOSkKLSAvKioKLSAqICAgIEFuIGlucHV0IGNsaXAgaGFzIGFuIHVuZXhwZWN0ZWRseSBsYXJnZSBWaWRlbyBBVSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRSAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxQSkKLS8qKgotICogICAgQW4gaW5wdXQgY2xpcCBoYXMgYW4gdW5leHBlY3RlZGx5IGxhcmdlIEF1ZGlvIEFVICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQVVfVE9PX0xBUkdFICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDFCKQotLyoqCi0gKiAgICBBbiBpbnB1dCBjbGlwIGhhcyBhIGNvcnJ1cHRlZCBBdWRpbyBBTVIgQVUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVUgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxQykKLS8qKgotICogVGhlIHZpZGVvIGVuY29kZXIgZW5jb3VudGVyZWQgYW4gQWNjZXMgVW5pdCBlcnJvcjogdmVyeSBwcm9iYWJseSBhIGZpbGUgd3JpdGUgZXJyb3IgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxRCkKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRXJyb3JzIHJldHVybmVkIGJ5IE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAoKSAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogVW5zdXBwb3J0ZWQgdmlkZW8gZm9ybWF0IGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyMCkKLS8qKgotICogVW5zdXBwb3J0ZWQgSDI2MyBwcm9maWxlIGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEUgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyMSkKLS8qKgotICogVW5zdXBwb3J0ZWQgTVBFRy00IHByb2ZpbGUgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1BST0ZJTEUgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyMikKLS8qKgotICogVW5zdXBwb3J0ZWQgTVBFRy00IFJWTEMgdG9vbCBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUlZMQyAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjMpCi0vKioKLSAqIFVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjQpCi0gLyoqCi0gKiBGaWxlIGNvbnRhaW5zIG5vIHN1cHBvcnRlZCBzdHJlYW0gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDI1KQotLyoqCi0gKiBGaWxlIGNvbnRhaW5zIG5vIHZpZGVvIHN0cmVhbSBvciBhbiB1bnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDAyNikKLS8qKgotICogVW5zdXBwb3J0ZWQgdmlkZW8gcHJvZmlsZSBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fUFJPRklMRSBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDI3KQotCi0vKioKLSAqIFVuc3VwcG9ydGVkIHZpZGVvIHByb2ZpbGUgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0xFVkVMIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFcnJvcnMgcmV0dXJuZWQgYnkgTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KCkgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBBdCBsZWFzdCBvbmUgb2YgdGhlIGNsaXAgYW5hbHlzaXMgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IGFub3RoZXIgdmVyc2lvbiBvZiB0aGUgVlNTIDNHUFAgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTiAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMzApCi0vKioKLSAqIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgdmlkZW8gZm9ybWF0IChIMjYzIG9yIE1QRUc0KSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAzMSkKLS8qKgotICogICAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBmcmFtZSBzaXplICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDMyKQotLyoqCi0gKiAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIE1QRUctNCB0aW1lIHNjYWxlICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1RJTUVfU0NBTEUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDMzKQotLyoqCi0gKiAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIHVzZSBvZiBNUEVHLTQgZGF0YSBwYXJ0aXRpb25pbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fREFUQV9QQVJUSVRJT05JTkcgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDM0KQotLyoqCi0gKiAgICBNUDMgY2xpcHMgY2FuJ3QgYmUgYXNzZW1ibGVkICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDM1KQotLyoqCi0gKiAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBhdWRpbyBzdHJlYW0gdHlwZSAoZXg6IEFNUiAhPSBBQUMpICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NUUkVBTV9UWVBFICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDM2KQotLyoqCi0gKiAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBhdWRpbyBudW1iZXIgb2YgY2hhbm5lbHMgKGV4OiBzdGVyZW8gIT0gbW9ubykgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fTkJfT0ZfQ0hBTk5FTFMgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwMzcpCi0vKioKLSAqICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIHNhbXBsaW5nIGZyZXF1ZW5jeSAoZXg6IDQ0MTAwSHogIT0gMTYwMDBIeikgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDAzOCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEF1ZGlvIG1peGluZyBlcnJvciBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogVGhlIGlucHV0IDNHUFAgZmlsZSBkb2VzIG5vdCBjb250YWluIGFueSBzdXBwb3J0ZWQgYXVkaW8gb3IgdmlkZW8gdHJhY2sgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwNTApCi0vKioKLSAqIFRoZSBWb2x1bWUgb2YgdGhlIGFkZGVkIGF1ZGlvIHRyYWNrIChBZGRWb2x1bWUpIG11c3QgYmUgc3RyaWN0bHkgc3VwZXJpb3IgdGhhbiB6ZXJvICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQUREVk9MVU1FX0VRVUFMU19aRVJPICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDUxKQotLyoqCi0gKiBUaGUgdGltZSBhdCB3aGljaCB0aGUgYXVkaW8gdHJhY2sgaXMgYWRkZWQgKEFkZEN0cykgY2FuJ3QgYmUgc3VwZXJpb3IgdGhhbiB0aGUKLSAgIGlucHV0IHZpZGVvIHRyYWNrIGR1cmF0aW9uICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQUREQ1RTX0hJR0hFUl9USEFOX1ZJREVPX0RVUkFUSU9OICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDUyKQotLyoqCi0gKiBUaGUgYXVkaW8gdHJhY2sgZmlsZSBmb3JtYXQgc2V0dGluZyBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9VTkRFRklORURfQVVESU9fVFJBQ0tfRklMRV9GT1JNQVQgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTMpCi0vKioKLSAqIFRoZSBhZGRlZCBhdWRpbyB0cmFjayBzdHJlYW0gaGFzIGFuIHVuc3VwcG9ydGVkIGZvcm1hdCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwNTQpCi0vKioKLSAqIFRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSBkb2Vzbid0IHN1cHBvcnQgRVZSQywgTVAzIGF1ZGlvIHRyYWNrcyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FVRElPX01JWElOR19VTlNVUFBPUlRFRCAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwNTUpCi0vKioKLSAqIEFuIGFkZGVkIGF1ZGlvIHRyYWNrIGxpbWl0IHRoZSBhdmFpbGFibGUgZmVhdHVyZXM6IHVpQWRkQ3RzIG11c3QgYmUgMAotICAgYW5kIGJSZW1vdmVPcmlnaW5hbCBtdXN0IGJlIE00T1NBX1RSVUUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9GRUFUVVJFX1VOU1VQUE9SVEVEX1dJVEhfQVVESU9fVFJBQ0sgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA1NikKLS8qKgotICogSW5wdXQgYXVkaW8gdHJhY2sgaXMgbm90IEFNUi1OQiBub3IgQUFDIHNvIGl0IGNhbid0IGJlIG1peGVkIHdpdGggb3V0cHV0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQVVESU9fQ0FOTk9UX0JFX01JWEVEICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTcpCi0vKioKLSAqIElucHV0IGNsaXAgbXVzdCBiZSBhIDNncHAgZmlsZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0NMSVBfSVNfTk9UX0FfM0dQUCAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDU4KQotLyoqCi0gKiBCZWdpbiBsb29wIHRpbWUgaXMgaGlnaGVyIHRoYW4gZW5kIGxvb3AgdGltZSBvciBoaWdoZXIgdGhhbiBhZGRlZCBjbGlwIGR1cmF0aW9uICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQkVHSU5MT09QX0hJR0hFUl9FTkRMT09QICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTkpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEF1ZGlvIG1peGluZyBhbmQgZXh0cmFjdCBwaWN0dXJlIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEgyNjMgUHJvZmlsZSAzIGxldmVsIDEwIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNjApCi0vKioKLSAqIEZpbGUgY29udGFpbnMgbm8gdmlkZW8gc3RyZWFtIG9yIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRSAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA2MSkKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogSW50ZXJuYWwgZXJyb3IgYW5kIHdhcm5pbmcgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogSW50ZXJuYWwgc3RhdGUgZXJyb3IgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlRFUk5BTF9TVEFURSAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDEwMCkKLS8qKgotICogTHVtaW5hbmNlIGZpbHRlciBlZmZlY3QgZXJyb3IgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUiAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDEwNCkKLS8qKgotICogVHJhbnNpdGlvbiBmaWx0ZXIgZWZmZWN0IGVycm9yICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfVFJBTlNJVElPTl9GSUxURVJfRVJST1IgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMDYpCi0vKioKLSAqIFRoZSBhdWRpbyBkZWNvZGVyIGluaXRpYWxpemF0aW9uIGZhaWxlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERVJfSU5JVF9GQUlMRUQgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTEwKQotLyoqCi0gKiBUaGUgZGVjb2RlciBwcm9kdWNlZCBhbiB1bmF0dGVuZGVkIGFtb3VudCBvZiBQQ00gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVEX1BDTV9TSVpFX0lTU1VFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDExNSkKLS8qKgotICogT3V0cHV0IGZpbGUgbXVzdCBiZSAzR1BQIG9yIE1QMyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX09VVFBVVF9GSUxFX1RZUEVfRVJST1IgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTE3KQotLyoqCi0gKiBDYW4gbm90IGZpbmQgYSB2YWxpZCB2aWRlbyBmcmFtZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRSAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMTgpCi0KLSNlbmRpZiAvKiBfX000VlNTM0dQUF9FcnJvckNvZGVzX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FeHRlbmRlZF9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NjY4YjY3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0VYVEVOREVEX0FQSV9IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfRVhURU5ERURfQVBJX0hfXwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9FeHRlbmRlZF9BUEkuaAotICogQGJyaWVmICAgIEFQSSBvZiB4VlNTCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0jZXJyb3IgIioqKiB0aGUgZmxhZyBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTIHNob3VsZCBiZSBhY3RpdmF0ZWQgaW4gQ29tcGlsZXJTd2l0Y2hlc1wKLSAgICAgICAgICAgICBmb3IgVmlkZW9TdHVkaW8gKioqIgotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19nZXRUZXh0UmdiQnVmZmVyRmN0Ci0gKiBAYnJpZWYgICAgICAgIEV4dGVybmFsIHRleHQgdG8gUkdCIGJ1ZmZlciBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0b3IKLSAqICAgICAgICAgICAgICAgIG11c3QgbWF0Y2ggdGhpcyBwcm90b3R5cGUuCi0gKiBAbm90ZSAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdpdGggdGhlIHJlbmRlcmluZ0RhdGEsIHRoZSB0ZXh0IGJ1ZmZlciBhbmQKLSAqICAgICAgICAgICAgICAgIGl0cyBzaXplLiBJdCBtdXN0IGJ1aWxkIHRoZSBvdXRwdXQgUkdCIGltYWdlIHBsYW5lIGNvbnRhaW5pbmcgdGhlIHRleHQuCi0gKgotICogQHBhcmFtICAgcFJlbmRlcmluZ0RhdGEgICAgKElOKSBUaGUgZGF0YSBnaXZlbiBieSB0aGUgdXNlciBpbiBNNHhWU1NfRWZmZWN0U2V0dGluZ3MKLSAqIEBwYXJhbSAgICBwVGV4dEJ1ZmZlciAgICAgICAgKElOKSBUZXh0IGJ1ZmZlciBnaXZlbiBieSB0aGUgdXNlciBpbiBNNHhWU1NfRWZmZWN0U2V0dGluZ3MKLSAqIEBwYXJhbSAgICB0ZXh0QnVmZmVyU2l6ZSAgICAoSU4pIFRleHQgYnVmZmVyIHNpemUgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gTTR4VlNTX0VmZmVjdFNldHRpbmdzCi0gKiBAcGFyYW0gICAgcE91dHB1dFBsYW5lICAgIChJTi9PVVQpIE91dHB1dCBSR0I1NjUgaW1hZ2UKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00eFZTU19nZXRUZXh0UmdiQnVmZmVyRmN0KQotKAotICAgIE00T1NBX1ZvaWQgKnBSZW5kZXJpbmdEYXRhLAotICAgIE00T1NBX1ZvaWQgKnBUZXh0QnVmZmVyLAotICAgIE00T1NBX1VJbnQzMiB0ZXh0QnVmZmVyU2l6ZSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqKnBPdXRwdXRQbGFuZQotKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0JHTVNldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZ2F0aGVycyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBhZGQgQmFja2dyb3VuZCBtdXNpYyB0byAzZ3AgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICpwRmlsZTsgICAgICAgICAvKio8IElucHV0IGZpbGUgcGF0aCAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICBGaWxlVHlwZTsgICAgICAgLyoqPCAuM2dwLCAuYW1yLCAubXAzICAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aUFkZEN0czsgICAgICAgLyoqPCBUaW1lLCBpbiBtaWxsaXNlY29uZHMsIGF0IHdoaWNoIHRoZSBhZGRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhY2sgaXMgaW5zZXJ0ZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlBZGRWb2x1bWU7ICAgICAvKio8IFZvbHVtZSwgaW4gcGVyY2VudGFnZSwgb2YgdGhlIGFkZGVkIGF1ZGlvIHRyYWNrICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpQmVnaW5Mb29wOyAgICAvKio8IERlc2NyaWJlcyBpbiBtaWxsaS1zZWNvbmQgdGhlIHN0YXJ0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGxvb3AgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlFbmRMb29wOyAgICAgIC8qKjwgRGVzY3JpYmVzIGluIG1pbGxpLXNlY29uZCB0aGUgZW5kIHRpbWUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AgKDAgbWVhbnMgbm8gbG9vcCkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYl9EdWNraW5nTmVlZGVlZDsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgSW5EdWNraW5nX3RocmVzaG9sZDsgIC8qKjwgVGhyZXNob2xkIHZhbHVlIGF0IHdoaWNoIGJhY2tncm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljIHNoYWxsIGR1Y2sgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgbG93Vm9sdW1lOyAgICAgICAvKio8IGxvd2VyIHRoZSBiYWNrZ3JvdW5kIHRyYWNrIHRvIHRoaXMgZmFjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGluY3JlYXNlIHRoZSBwcmltYXJ5IHRyYWNrIHRvIGludmVyc2Ugb2YgdGhpcyBmYWN0b3IgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYkxvb3A7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpTnVtQ2hhbm5lbHM7Ci19IE00eFZTU19CR01TZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgdmlkZW8gZWZmZWN0IHR5cGVzIG9mIHRoZSBWU1MzR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tSR0I4ODggICAgICAgICAgID0gMCwgIC8qKjwgUkdCODg4IGRhdGEgdHlwZSAqLwotICAgIE00VlNTM0dQUF9rUkdCNTY1ICAgICAgICAgICA9IDEgIC8qKjwgUkdCNTY1IGRhdGEgdHlwZSAqLwotCi19IE00VlNTM0dQUF9SR0JUeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00eFZTU19FZmZlY3RTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBhdWRpby92aWRlbyBlZmZlY3QgZm9yIHRoZSBlZGl0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBJbiBwZXJjZW50IG9mIHRoZSBjdXQgY2xpcCBkdXJhdGlvbiAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHVpU3RhcnRQZXJjZW50OwotICAgIC8qKjwgSW4gcGVyY2VudCBvZiB0aGUgKChjbGlwIGR1cmF0aW9uKSAtIChlZmZlY3Qgc3RhcnR0aW1lKSkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aUR1cmF0aW9uUGVyY2VudDsKLSAgICAvKio8IEZyYW1pbmcgZmlsZSBwYXRoIChHSUYvUE5HIGZpbGUpLCB1c2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgKi8KLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAqcEZyYW1pbmdGaWxlUGF0aDsKLSAgICAvKio8IEZyYW1pbmcgUkdCNTY1IGJ1ZmZlciwgIHVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICpwRnJhbWluZ0J1ZmZlcjsKLSAgICAvKio8UkdCIEJ1ZmZlciB0eXBlLHVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyAqLwotICAgIE00VlNTM0dQUF9SR0JUeXBlICAgICAgICAgIHJnYlR5cGU7Ci0gICAgLyoqPCBUaGUgdG9wLWxlZnQgWCBjb29yZGluYXRlIGluIHRoZSBvdXRwdXQgcGljdHVyZSB3aGVyZSB0aGUgYWRkZWQgZnJhbWUgd2lsbCBiZSBkaXNwbGF5ZWQuCi0gICAgIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyB8fCBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHRvcGxlZnRfeDsKLSAgICAvKio8IFRoZSB0b3AtbGVmdCBZIGNvb3JkaW5hdGUgaW4gdGhlIG91dHB1dCBwaWN0dXJlIHdoZXJlIHRoZSBhZGRlZCBmcmFtZSB3aWxsIGJlIGRpc3BsYXllZC4KLSAgICAgVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSBmcmFtaW5nIHx8IFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdG9wbGVmdF95OwotICAgIC8qKjwgRG9lcyBmcmFtaW5nIGltYWdlIGlzIHJlc2l6ZWQgdG8gb3V0cHV0IHZpZGVvIHNpemUuCi0gICAgIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgIGJSZXNpemU7Ci0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgZnJhbWluZ1NjYWxlZFNpemU7Ci0vKio8IFNpemUgdG8gd2hpY2ggdGhlIHRoZSBmcmFtaW5nIGZpbGUgbmVlZHMgdG8gYmUgcmVzaXplZCAqLwotICAgIC8qKjwgVGV4dCBidWZmZXIuIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBUZXh0QnVmZmVyOwotICAgIC8qKjwgVGV4dCBidWZmZXIgc2l6ZS4gVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdGV4dEJ1ZmZlclNpemU7Ci0gICAgLyoqPCBQb2ludGVyIGNvbnRhaW5pbmcgc3BlY2lmaWMgZGF0YSB1c2VkIGJ5IHRoZSBmb250IGVuZ2luZSAoc2l6ZSwgY29sb3IuLi4pICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgcFJlbmRlcmluZ0RhdGE7Ci0gICAgLyoqPCBUZXh0IHBsYW5lIHdpZHRoLiBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aVRleHRCdWZmZXJXaWR0aDsKLSAgICAvKio8IFRleHQgcGxhbmUgaGVpZ2h0LiBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aVRleHRCdWZmZXJIZWlnaHQ7Ci0gICAgLyoqPCBQcm9jZXNzaW5nIHJhdGUgb2YgdGhlIGVmZmVjdCBhZGRlZCB3aGVuIHVzaW5nIHRoZSBGaWZ0aWVzIGVmZmVjdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHVpRmlmdGllc091dEZyYW1lUmF0ZTsKLSAgICAvKio8IFJHQjE2IGlucHV0IGNvbG9yIG9mIHRoZSBlZmZlY3QgYWRkZWQgd2hlbiB1c2luZyB0aGUgcmdiMTYgY29sb3IgZWZmZWN0ICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgdWlSZ2IxNklucHV0Q29sb3I7Ci0KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aWFscGhhQmxlbmRpbmdTdGFydDsgICAgICAgLypTdGFydCBwZXJjZW50YWdlIG9mIEFscGhhIGJsZW5kaW5nKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aWFscGhhQmxlbmRpbmdNaWRkbGU7ICAgICAgLypNaWRkbGUgcGVyY2VudGFnZSBvZiBBbHBoYSBibGVuZGluZyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgdWlhbHBoYUJsZW5kaW5nRW5kOyAgICAgICAgIC8qRW5kIHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgIHVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7ICAvKkR1cmF0aW9uLCBpbiBwZXJjZW50YWdlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QgZHVyYXRpb24sIG9mIHRoZSBGYWRlSW4gcGhhc2UqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgIHVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOyAgIC8qRHVyYXRpb24sIGluIHBlcmNlbnRhZ2Ugb2YgZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sIG9mIHRoZSBGYWRlT3V0IHBoYXNlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgd2lkdGg7ICAgLyp3aWR0aCBvZiB0aGUgQVJHQjg4ODggY2xpcCAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgb25seSBpZiB2aWRlbyBlZmZlY3QgaXMgZnJhbW1pbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgaGVpZ2h0OyAvKmhlaWdodCBvZiB0aGUgQVJHQjg4ODggY2xpcCAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgb25seSBpZiB2aWRlbyBlZmZlY3QgaXMgZnJhbW1pbmcgKi8KLX0gTTR4VlNTX0VmZmVjdFNldHRpbmdzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYWxwaGEgbWFnaWMgdHJhbnNpdGlvbiBzZXR0aW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICBwQWxwaGFGaWxlUGF0aDsgICAgICAgIC8qKjwgQWxwaGEgZmlsZSBwYXRoIChKUEcgZmlsZSkgICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICBibGVuZGluZ1BlcmNlbnQ7ICAgIC8qKjwgQmxlbmRpbmcgUGVyY2VudGFnZSBiZXR3ZWVuIDAgYW5kIDEwMCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgaXNyZXZlcnNlOyAgICAgICAgICAgIC8qKjwgZGlyZWN0IGVmZmVjdCBvciByZXZlcnNlICovCi0gICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgd2lkdGg7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgaGVpZ2h0OwotfSBNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25fRGlyZWN0aW9uCi0gKiBAYnJpZWYgICAgRGVmaW5lcyBkaXJlY3Rpb25zIGZvciB0aGUgc2xpZGUgdHJhbnNpdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX1JpZ2h0T3V0TGVmdEluLAotICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25fTGVmdE91dFJpZ2h0SW4sCi0gICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9Ub3BPdXRCb3R0b21JbiwKLSAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0JvdHRvbU91dFRvcEluCi19IE00eFZTU19TbGlkZVRyYW5zaXRpb25fRGlyZWN0aW9uOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc2xpZGUgdHJhbnNpdGlvbiBzZXR0aW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0RpcmVjdGlvbiBkaXJlY3Rpb247IC8qIGRpcmVjdGlvbiBvZiB0aGUgc2xpZGUgKi8KLX0gTTR4VlNTX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00eFZTU19UcmFuc2l0aW9uU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWRkaXRpb25hbCB0cmFuc2l0aW9uIHNldHRpbmdzIHNwZWNpZmljIHRvCi0gKiAgICAgICAgICAgIHhWU1MsIHdoaWNoIGFyZSBhcHBlbmRlZCB0byB0aGUgVlNTM0dQUCB0cmFuc2l0aW9uIHNldHRpbmdzCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qIEFueXRoaW5nIHhWU1Mtc3BlY2lmaWMsIGJ1dCBjb21tb24gdG8gYWxsIHRyYW5zaXRpb25zLCB3b3VsZCBnbyBoZXJlLAotICAgIGJlZm9yZSB0aGUgdW5pb24uICovCi0gICAgdW5pb24gewotICAgICAgICAvKio8IEFscGhhTWFnaWMgc2V0dGluZ3MsIHVzZWQgb25seSBpZiBWaWRlb1RyYW5zaXRpb25UeXBlID09Ci0gICAgICAgICAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYyAqLwotICAgICAgICBNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzICAgICAgICAqcEFscGhhTWFnaWNTZXR0aW5nczsKLSAgICAgICAgLyogb25seSBpbiBjYXNlIG9mIHNsaWRlIHRyYW5zaXRpb24uICovCi0gICAgICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyAgICAqcFNsaWRlVHJhbnNpdGlvblNldHRpbmdzOwotICAgIH0gdHJhbnNpdGlvblNwZWNpZmljOwotfSBNNHhWU1NfVHJhbnNpdGlvblNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgZGlmZmVyZW50IG1lZGlhIHJlbmRlcmluZyB1c2luZyBleGlmIG9yaWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTR4VlNTX2tSZXNpemluZyA9IDAsICAgICAgICAvKlRoZSBwaWN0dXJlIGlzIHJlc2l6ZWQsIHRoZSBhc3BlY3QgcmF0aW8gY2FuIGJlIGRpZmZlcmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgb3JpZ2luYWwgb25lLiBBbGwgb2YgdGhlIHBpY3R1cmUgaXMgcmVuZGVyZWQqLwotICAgIE00eFZTU19rQ3JvcHBpbmcsICAgICAgICAgICAgLypUaGUgcGljdHVyZSBpcyBjcm9wcGVkLCB0aGUgYXNwZWN0IHJhdGlvIGlzIHRoZSBzYW1lIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3JpZ2luYWwgb25lLiBUaGUgcGljdHVyZSBpcyBub3QgcmVuZGVyZWQgZW50aXJlbHkqLwotICAgIE00eFZTU19rQmxhY2tCb3JkZXJzICAgICAgICAvKkJsYWNrIGJvcmRlcnMgYXJlIHJlbmRlcmVkIGluIG9yZGVyIHRvIGtlZXAgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3QgcmF0aW8uIEFsbCB0aGUgcGljdHVyZSBpcyByZW5kZXJlZCovCi0KLX0gTTR4VlNTX01lZGlhUmVuZGVyaW5nOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTR4VlNTX0NsaXBTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBpbnB1dCBjbGlwIGZvciB0aGUgZWRpdGlvbi4KLSAqIEBub3RlICAgIEl0IGFsc28gY29udGFpbnMgdGhlIHNldHRpbmdzIGZvciB0aGUgY3V0IGFuZCBiZWdpbi9lbmQgZWZmZWN0cyBhcHBsaWVkIHRvIHRoZSBjbGlwLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudDsgICAgLyoqPCBCZWdpbiBjdXQgdGltZSwgaW4gcGVyY2VudCBvZiBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gKG9ubHkgZm9yIDNHUFAgY2xpcCAhKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlFbmRDdXRQZXJjZW50OyAgICAvKio8IEVuZCBjdXQgdGltZSwgaW4gcGVyY2VudCBvZiBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gKG9ubHkgZm9yIDNHUFAgY2xpcCAhKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlEdXJhdGlvbjsgICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHRoZSBjbGlwLCBpZiBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIDAsIGhhcyBwcmlvcml0eSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0VGltZSBvciB1aUVuZEN1dFBlcmNlbnQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgaXNQYW5ab29tOyAgICAgICAgICAgIC8qKjwgUkM6IEJvb2xlYW4gdXNlZCB0byBrbm93IGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW4gYW5kIHpvb20gbW9kZSBpcyBlbmFibGVkICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tWGE7ICAgICAgICAgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRYYTsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYTsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVhiOyAgICAgICAgICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGI7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWI7ICAgIC8qKjwgUkMgKi8KLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgICAgICAgICAgICBNZWRpYVJlbmRlcmluZzsgICAgICAgIC8qKjwgRkIgb25seSB1c2VkIHdpdGggSlBFRzogdG8gY3JvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplLCBvciByZW5kZXIgYmxhY2sgYm9yZGVycyovCi0KLX0gTTR4VlNTX0NsaXBTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNHhWU1NfRWRpdFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBnYXRoZXJzIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRlZmluZSBhIGNvbXBsZXRlCi0gKiAgICAgICAgICBlZGl0aW9uIG9wZXJhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBPdXRwdXQgdmlkZW8gc2l6ZSAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplICAgICAgICAgICAgIG91dHB1dFZpZGVvU2l6ZTsKLSAgICAvKio8IE91dHB1dCB2aWRlbyBmb3JtYXQgKE1QRUc0IC8gSDI2MykgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCAgICAgICAgICAgICAgICBvdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAvKio8IE91dHB1dCBhdWRpbyBmb3JtYXQgKEFBQywgQU1STkIgLi4uKSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgICAgICAgIG91dHB1dEF1ZGlvRm9ybWF0OwotICAgIC8qKjwgT3V0cHV0IGF1ZGlvIHNhbXBsaW5nIGZyZXEgKDgwMDBIeiwuLi4pICovCi0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAgICAgb3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgLyoqPCBNYXhpbXVtIG91dHB1dCBmaWxlIHNpemUgaW4gQllURVMgKGlmIHNldCB0byAwLCBubyBsaW1pdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGVTaXplOwotICAgIC8qKjwgSXMgb3V0cHV0IGF1ZGlvIG11c3QgYmUgTW9ubyA/IFZhbGlkIG9ubHkgZm9yIEFBQyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdWRpb01vbm87Ci0gICAgLyoqPCBPdXRwdXQgdmlkZW8gYml0cmF0ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIC8qKjwgT3V0cHV0IGF1ZGlvIGJpdHJhdGUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICAvKio8IEJhY2tncm91bmQgbXVzaWMgdHJhY2sgc2V0dGluZ3MgKi8KLSAgICBNNHhWU1NfQkdNU2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAqcEJHTXRyYWNrOwotICAgIC8qKjwgRnVuY3Rpb24gcG9pbnRlciBvbiB0ZXh0IHJlbmRlcmluZyBlbmdpbmUsIGlmIG5vdCB1c2VkLCBtdXN0IGJlIHNldCB0byBOVUxMICEhICovCi0gICAgTTR4VlNTX2dldFRleHRSZ2JCdWZmZXJGY3QgICAgICAgICAgICAgICAgcFRleHRSZW5kZXJpbmdGY3Q7Ci0gICAgLyoqIG91dHB1dCB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCovCi0gICAgTTRPU0FfSW50MzIgICBvdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgTTRPU0FfSW50MzIgICBvdXRwdXRWaWRlb0xldmVsOwotCi19IE00eFZTU19FZGl0U2V0dGluZ3M7Ci0KLSNlbmRpZiAvKiBfX000VlNTM0dQUF9FWFRFTkRFRF9BUElfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjY5ZmViLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfSU5URVJOQUxDT05GSUdfSF9fCi0jZGVmaW5lIF9fTTRWU1MzR1BQX0lOVEVSTkFMQ09ORklHX0hfXwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oCi0gKiBAYnJpZWYgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgbWFnaWNhbCBhbmQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqLwotLyogVmlkZW9FZGl0aW9uIGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9NSU5JTUFMX1RSQU5TSVRJT05fRFVSQVRJT04gICAgICAgICAgICAxMDAgICAgLyoqPCAxMDAgbWlsbGlzZWNvbmRzICovCi0jZGVmaW5lIE00VlNTM0dQUF9OQl9BVV9QUkVGRVRDSCAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgIC8qKjwgcHJlZmVjdCA0IEFVcyAqLwotI2RlZmluZSBNNFZTUzNHUFBfTk9fU1RTU19KVU1QX1BPSU5UICAgICAgICAgICAgICAgICAgICA0MDAwMCAvKio8IElmIDNncCBmaWxlIGRvZXMgbm90IGNvbnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBTVFNTIHRhYmxlIChubyByYXAgZnJhbWVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1wIGJhY2t3YXJkIDQwIHMgbWF4aW11bSAqLwotCi0vKioqKioqKioqKioqKioqKiovCi0vKiBXcml0ZXIgY29uZmlnICovCi0vKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQgICAgICAgICAgICAgICAgMQotI2RlZmluZSBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCAgICAgICAgICAgICAgICAyCi0KLS8qKjwgTWF4IEFVIHNpemUgd2lsbCBiZSAwLjggdGltZXMgdGhlIFlVVjQ6MjowIGZyYW1lIHNpemUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1ZJREVPX01JTl9DT01QUkVTU0lPTl9SQVRJTyAgICAgICAgICAgIDAuOUYKLS8qKjwgTWF4IGNodW5rIHNpemUgd2lsbCBiZSAxLjIgdGltZXMgdGhlIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00VlNTM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPICAgIDEuMkYKLQotLyoqIFJFQUQgQ0FSRUZVTExZIElOIENBU0UgT0YgUkVQT1JURUQgUlVOTklORyBUUk9VQkxFUwotVGhlIG1heCBBVSBzaXplIGlzIHVzZWQgdG8gcHJlLXNldCBtYXggc2l6ZSBvZiBBVSB0aGF0IGNhbiBiZSB3cml0dGVuIGluIHRoZSAzR1Agd3JpdGVyCi1Gb3IgYXVkaW8gc3RhbmRhcmQgd2l0aCB2YXJpYWJsZSBBVSBzaXplLCB0aGVyZSBjb3VsZCBiZSBzb21lIGVuY29kaW5nIHNldHRpbmdzIGxlYWRpbmcgdG8gQVUgc2l6ZQotZXhjZWVkaW5nIHRoaXMgbGltaXQuCi1Gb3IgQUFDIHN0cmVhbXMgZm9yIGluc3RhbmNlIHRoZSBhdmVyYWdlIEFVIHNpemUgaXMgZ2l2ZW4gYnk6Ci1hdiBBVSBzaXplID0gKGF2IGJpdHJhdGUgKiAxMDI0KS8oc2FtcGxpbmcgZnJlcSkKLUlmIFZTUyByZXR1cm5zIHRoZSBtZXNzYWdlOgotPj4gRVJST1I6IGF1ZGlvIEFVIHNpemUgKFhYWFgpIHRvIGNvcHkgbGFyZ2VyIHRoYW4gYWxsb2NhdGVkIG9uZSAoWVlZWSkgPT4gYWJvcnQKLT4+IFBMRUFTRSBDT05UQUNUIFNVUFBPUlQgVE8gRVhURU5EIE1BWCBBVSBTSVpFIElOIFRIRSBQUk9EVUNUIExJQlJBUlkKLUVycm9yIGlzIG1vc3QgbGlrZWx5IHRvIGhhcHBlbiB3aGVuIG1peGluZyB3aXRoIGF1ZGlvIGZ1bGwgcmVwbGFjZW1lbnQKLSAqLwotLyoqPCBBQUMgbWF4IEFVIHNpemUgLSBSRUFEIEVYUExBTkFUSU9OIEFCT1ZFICovCi0jZGVmaW5lIE00VlNTM0dQUF9BVURJT19NQVhfQVVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDIwNDgKLS8qKjwgc2V0IHRvIHg0IG1heCBBVSBzaXplIHBlciBjaHVuayAqLwotI2RlZmluZSBNNFZTUzNHUFBfQVVESU9fTUFYX0NIVU5DS19TSVpFICAgICAgICAgICAgICAgICAgICA4MTkyCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqLwotLyogSDI2MyAvIE1QRUc0IGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lICAgIE00VlNTM0dQUF9FRElUX0gyNjNfTU9EVUxPX1RJTUUgICAgICAgICAgICAyNTUKLQotI2lmZGVmIEJJR19FTkRJQU4KLS8qKjwgMHhiMyAwMSAwMCAwMCBMaXR0bGUgZW5kaWFuIC8gYjAwIDAwIDAwIDAxIGIzIGJpZyBlbmRpYW4qLwotI2RlZmluZSAgICBNNFZTUzNHUFBfRURJVF9HT1ZfSEVBREVSICAgICAgICAgICAgMHgwMDAwMDFiMwotI2Vsc2UKLS8qKjwgMHhiMyAwMSAwMCAwMCBMaXR0bGUgZW5kaWFuIC8gYjAwIDAwIDAwIDAxIGIzIGJpZyBlbmRpYW4qLwotI2RlZmluZSAgICBNNFZTUzNHUFBfRURJVF9HT1ZfSEVBREVSICAgICAgICAgICAgMHhiMzAxMDAwMAotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKi8KLS8qIEFNUiBjb25maWcgKi8KLS8qKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfV1JJVFRFTl9BTVJfVFJBQ0tfVElNRV9TQ0FMRSAgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgTTRWU1MzR1BQX0FNUl9ERUNPREVEX1BDTV9TQU1QTEVfTlVNQkVSICAgICAgICAgICAgMTYwICAgICAgICAvKio8IDIwbXMgYXQgODAwMGh6IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjB4OD0xNjAgc2FtcGxlcyAqLwotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0RFRkFVTFRfQklUUkFURSAgICAgICAgICAgICAgICAgICAxMjIwMCAgIC8qKjwgMTIuMiBrYnBzICovCi0KLS8qKioqKioqKioqKioqKi8KLS8qIEVWUkMgY29uZmlnICovCi0vKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0VWUkNfREVGQVVMVF9CSVRSQVRFICAgICAgICAgICAgICAgICAgOTIwMCAgIC8qKjwgOS4yIGticHMgKi8KLQotLyoqKioqKioqKioqKioqLwotLyogTVAzIGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqLwotCi0vKiogTWFjcm8gdG8gbWFrZSBhIGp1bXAgb24gdGhlIE1QMyB0cmFjayBvbiBzZXZlcmFsIHN0ZXBzCi0gICAgVG8gYXZvaWQgdG8gYmxvY2sgdGhlIHN5c3RlbSB3aXRoIGFuIGxvbmcgTVAzIGp1bXAsIHRoaXMgcHJvY2VzcwotICAgIGlzIGRpdmlkZWQgb24gc2V2ZXJhbCBzdGVwcy4KLSAqLwotI2RlZmluZSBNNFZTUzNHUFBfTVAzX0pVTVBFRF9BVV9OVU1CRVJfTUFYIDEwMAotCi0vKiogTWFjcm8gdG8gZGVmaW5lIHRoZSBudW1iZXIgb2YgcmVhZCBBVSB0byBhbmFseXNlIHRoZSBiaXRyYXRlCi0gICAgU28gdGhlIHByb2Nlc3Mgd2lsbCByZWFkIHRoZSBmaXJzdCBuIEFVIG9mIHRoZSBNUDMgc3RyZWFtIHRvIGdldAotICAgIHRoZSBhdmVyYWdlIGJpdHJhdGUuIG4gaXMgZGVmaW5lZCBieSB0aGlzIGRlZmluZS4KLSAqLwotI2RlZmluZSBNNFZTUzNHUFBfTVAzX0FVX05VTUJFUl9NQVggNTAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGRlZmluZSBBTVIgc2lsZW5jZSBmcmFtZXMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgICAgIDEzCi0jZGVmaW5lIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT04gMTYwCi0KLSNpZmRlZiBNNFZTUzNHUFBfU0lMRU5DRV9GUkFNRVMKLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhbTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci17Ci0gICAgMHgwNCwgMHhGRiwgMHgxOCwgMHhDNywgMHhGMCwgMHgwRCwgMHgwNCwgMHgzMywKLSAgICAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwCi19OwotI2Vsc2UKLWV4dGVybiBjb25zdCBNNE9TQV9VSW50OCBcCi0gICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhbTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBkZWZpbmUgQUFDIHNpbGVuY2UgZnJhbWVzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRSAgICAgIDQKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRV0gPQotewotICAgIDB4MDAsIDB4QzgsIDB4MjAsIDB4MDcKLX07Ci0jZWxzZQotZXh0ZXJuIGNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkVdOwotI2VuZGlmCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFICAgICAgICA2Ci0KLSNpZmRlZiBNNFZTUzNHUFBfU0lMRU5DRV9GUkFNRVMKLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFXSA9Ci17Ci0gICAgMHgyMSwgMHgxMCwgMHgwMywgMHgyMCwgMHg1NCwgMHgxQwotfTsKLSNlbHNlCi1leHRlcm4gY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT1tNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkVdOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000VlNTM0dQUF9JTlRFUk5BTENPTkZJR19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4NTU4ODIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaAotICogQGJyaWVmICAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZnVuY3Rpb24gcHJvdG90eXBlcyBub3QgdmlzaWJsZSB0byB0aGUgZXh0ZXJuYWwgd29ybGQuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0lOVEVSTkFMRlVOQ1RJT05TX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9JTlRFUk5BTEZVTkNUSU9OU19IX18KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogICAgVlNTIHB1YmxpYyBBUEkgYW5kIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotCi0vKioKLSAqICAgIFZTUyBwcml2YXRlIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLQotCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiIC8qKjwgZm9yIE00X0FjY2Vzc1VuaXQgZGVmaW5pdGlvbiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEFsbCBlcnJvcnMgYXJlIGZhdGFsIGluIHRoZSBWU1MgKi8KLSNkZWZpbmUgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycikgaWYoTTROT19FUlJPUiE9ZXJyKSByZXR1cm4gZXJyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbygpCi0gKiBAYnJpZWYgICAgT25lIHN0ZXAgb2YgdmlkZW8gcHJvY2Vzc2luZwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbygpCi0gKiBAYnJpZWYgICAgT25lIHN0ZXAgb2YgYXVkaW8gcHJvY2Vzc2luZwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcgZm9yIHRoZSBNUDMgY2xpcAotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkKLSAqIEBicmllZiAgICBPcGVuIG5leHQgY2xpcAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludE9wZW5DbGlwKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICoqaENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIERlc3Ryb3kgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlcihNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBDcmVhdGVzIHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAbm90ZQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvKCkKLSAqIEBicmllZiAgICBEbyB3aGF0IHRvIGRvIHdoZW4gdGhlIGVuZCBvZiBhIGNsaXAgdmlkZW8gdHJhY2sgaXMgcmVhY2hlZAotICogQG5vdGUgICAgSWYgdGhlcmUgaXMgYXVkaW8gb24gdGhlIGN1cnJlbnQgY2xpcCwgcHJvY2VzcyBpdCwgZWxzZSBzd2l0Y2ggdG8gdGhlIG5leHQgY2xpcAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbygpCi0gKiBAYnJpZWYgICAgRG8gd2hhdCB0byBkbyB3aGVuIHRoZSBlbmQgb2YgYSBjbGlwIGF1ZGlvIHRyYWNrIGlzIHJlYWNoZWQKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCkKLSAqIEBicmllZiAgICBDaGVjayBpZiB0aGUgY2xpcCBpcyBjb21wYXRpYmxlIHdpdGggVlNTIGVkaXRpbmcKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZhbGlkIENsaXBQcm9wZXJ0aWVzIHN0cnVjdHVyZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQ2xpcFByb3BlcnRpZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKQotICogQGJyaWVmICAgIE9wZW4gYSBjbGlwLiBDcmVhdGVzIGEgY2xpcCBjb250ZXh0LgotICogQG5vdGUKLSAqIEBwYXJhbSAgIGhDbGlwQ3R4dCAgICAgICAgICAgIChPVVQpIFJldHVybiB0aGUgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIEVkaXQgc2V0dGluZ3Mgb2YgdGhpcyBjbGlwLiBUaGUgbW9kdWxlIHdpbGwga2VlcCBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdG8gdGhpcyBwb2ludGVyCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBiU2tpcEF1ZGlvVHJhY2sgICAgICAgIChJTikgSWYgdHJ1ZSwgZG8gbm90IG9wZW4gdGhlIGF1ZGlvCi0gKiBAcGFyYW0gICAgYkZhc3RPcGVuTW9kZSAgICAgICAgKElOKSBJZiB0cnVlLCB1c2UgdGhlIGZhc3QgbW9kZSBvZiB0aGUgM2dwcCByZWFkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSB0aGUgZmlyc3QgQVUgaXMgcmVhZCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSW5pdCAoCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICoqaENsaXBDdHh0LAotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0Ci0pOwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBPcGVuICgKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLAotICAgIE00T1NBX0Jvb2wgYlNraXBBdWRpb1RyYWNrLAotICAgIE00T1NBX0Jvb2wgYkZhc3RPcGVuTW9kZSwKLSAgICBNNE9TQV9Cb29sIGJBdm9pZE9wZW5pbmdWaWRlb0RlYwotKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKCkKLSAqIEBicmllZiAgICBEZWxldGUgdGhlIGF1ZGlvIHRyYWNrLiBDbGlwIHdpbGwgYmUgbGlrZSBpZiBpdCBoYWQgbm8gYXVkaW8gdHJhY2sKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdXJyZW50VGltZSgpCi0gKiBAYnJpZWYgICAgSnVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGFuZCBkZWNvZGUgdXAgdG8gdGhlIGN1cnJlbnQgdmlkZW8gdGltZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBpQ3RzICAgICAgICAoSU4pIFRhcmdldCBDVFMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHMoTTRWU1MzR1BQX0NsaXBDb250ZXh0KiBwQ2xpcEN0eHQsIE00T1NBX0ludDMyIGlDdHMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpCi0gKiBAYnJpZWYgICAgUmVhZCBvbmUgQVUgZnJhbWUgaW4gdGhlIGNsaXAKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpCi0gKiBAYnJpZWYgICAgRGVjb2RlIHRoZSBjdXJyZW50IEFVRElPIGZyYW1lLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpCi0gKiBAYnJpZWYgICAgSnVtcCBpbiB0aGUgYXVkaW8gdHJhY2sgb2YgdGhlIGNsaXAuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBKdW1wQ3RzICAgICAgICAgICAgKElOL09VVCkgaW46dGFyZ2V0IENUUywgb3V0OiByZWFjaGVkIENUUwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsIE00T1NBX0ludDMyICpwSnVtcEN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoKQotICogQGJyaWVmICAgIENsb3NlIGEgY2xpcC4gRGVzdHJveSB0aGUgY29udGV4dC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRKdW1wTVAzKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiBqdW1waW5nIHByb2Nlc3NpbmcgZm9yIHRoZSBNUDMgY2xpcC4KLSAqIEBub3RlICAgIE9uIG9uZSBzdGVwLCB0aGUganVtcCBvZiBzZXZlcmFsIEFVIGlzIGRvbmUKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRKdW1wTVAzKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgICB0aGUgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCxwV3RyR2xvYmFsSW50ZXJmYWNlIG9yIHBXdHJEYXRhSW50ZXJmYWNlIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlIE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqIHBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFd0ckRhdGFJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckVuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIHZpZGVvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgIHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgYXVkaW8gZW5jb2Rlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsIGNvbnRleHQKLSAqICAgICAgICAgICAgIHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgICAoSU4pIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U6ICAgIChPVVQpIHRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCkKLSAqIEBicmllZiAgICBSZWdpc3RlciByZWFkZXIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlIG1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgdmlkZW8gZGVjb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIERlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSksIG9yIHRoZSBkZWNvZGVyIHR5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIGF1ZGlvIGRlY29kZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbHkgYnkgdGhlIFZTUyB0byByZWdpc3RlciBhdWRpbyBkZWNvZGVycywKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBBdWRpbyBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgdGhlIGRlY29kZXIgdHlwZSBpcyBpbnZhbGlkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsV3JpdGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB3cml0ZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB0aGUgZW5jb2RlcnMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsUmVhZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB0aGUgZGVjb2RlcnMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKCkKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCB3cml0ZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGEgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50UmVhZGVyKCkKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50UmVhZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9EZWNvZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCkKLSAqIEBicmllZiAgICBDbGVhciBlbmNvZGVycywgZGVjb2RlcnMsIHJlYWRlciBhbmQgd3JpdGVycyBpbnRlcmZhY2VzIHRhYmxlcwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfU3Vic2NyaWJlTWVkaWFBbmRDb2RlYygpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICBpbiB0aGUgVlNTLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoKQotICogQGJyaWVmICAgUmV0dXJuIHRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgQU1SIE5hcnJvdy1CYW5kIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEF1ZGlvRnJhbWUgICAoSU4pIEFNUk5CIGZyYW1lCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX1VJbnQzMiBNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0FNUk5CKE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9FVlJDKCkKLSAqIEBicmllZiAgIFJldHVybiB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIEVWUkMgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiAgICAgMCAxIDIgMwotICogICAgKy0rLSstKy0rCi0gKiAgICB8ZnIgdHlwZXwgICAgICAgICAgICAgIFJGQyAzNTU4Ci0gKiAgICArLSstKy0rLSsKLSAqCi0gKiBGcmFtZSBUeXBlOiA0IGJpdHMKLSAqICAgIFRoZSBmcmFtZSB0eXBlIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBkYXRhCi0gKiAgICBmcmFtZSBpbiB0aGUgUlRQIHBhY2tldC4KLSAqCi0gKiBGb3IgRVZSQyBhbmQgU01WIGNvZGVjcywgdGhlIGZyYW1lIHR5cGUgdmFsdWVzIGFuZCBzaXplIG9mIHRoZQotICogYXNzb2NpYXRlZCBjb2RlYyBkYXRhIGZyYW1lIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93OgotICoKLSAqIFZhbHVlICAgUmF0ZSAgICAgIFRvdGFsIGNvZGVjIGRhdGEgZnJhbWUgc2l6ZSAoaW4gb2N0ZXRzKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgIDAgICAgIEJsYW5rICAgICAgMCAgICAoMCBiaXQpCi0gKiAgIDEgICAgIDEvOCAgICAgICAgMiAgICAoMTYgYml0cykKLSAqICAgMiAgICAgMS80ICAgICAgICA1ICAgICg0MCBiaXRzOyBub3QgdmFsaWQgZm9yIEVWUkMpCi0gKiAgIDMgICAgIDEvMiAgICAgICAxMCAgICAoODAgYml0cykKLSAqICAgNCAgICAgMSAgICAgICAgIDIyICAgICgxNzEgYml0czsgNSBwYWRkZWQgYXQgZW5kIHdpdGggemVyb3MpCi0gKiAgIDUgICAgIEVyYXN1cmUgICAgMCAgICAoU0hPVUxEIE5PVCBiZSB0cmFuc21pdHRlZCBieSBzZW5kZXIpCi0gKgotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgRVZSQyBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9FVlJDKE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKQotICogQGJyaWVmICAgIEdldCB2aWRlbyBhbmQgYXVkaW8gcHJvcGVydGllcyBmcm9tIHRoZSBjbGlwIHN0cmVhbXMKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gbXVzdCByZXR1cm4gZmF0YWwgZXJyb3JzIG9ubHkgKGVycm9ycyB0aGF0IHNob3VsZCBub3QgaGFwcGVuIGluIHRoZQotICogICAgICAgICAgICAgZmluYWwgaW50ZWdyYXRlZCBwcm9kdWN0KS4KLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlQXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBSZXNldCB0aGUgYXVkaW8gZW5jb2RlciAoQ3JlYXRlIGl0IGlmIG5lZWRlZCkKLSAqIEBub3RlCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcihNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICpwQ19ld2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDX1NoZWxsQVBJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpQXVkaW9CaXRyYXRlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCkKLSAqIEBicmllZiAgICBDcmVhdGVzIGFuZCBwcmVwYXJlIHRoZSBvdXRwdXQgTVAzIGZpbGUKLSAqIEBub3RlICAgIENyZWF0ZXMgdGhlIHdyaXRlciwgQ3JlYXRlcyB0aGUgb3V0cHV0IGZpbGUsIEFkZHMgdGhlIHN0cmVhbXMsIFJlYWRpZXMgdGhlCi0gKiAgICAgICAgICAgIHdyaXRpbmcgcHJvY2VzcwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZShNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICpwQ19ld2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENfU2hlbGxBUEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyICpwT3NhRmlsZVdyaXRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBPc2FGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFRlbXBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbWF4T3V0cHV0RmlsZVNpemUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiB0d28gY2xpcHMgYXJlIGNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyIGZvcgotICogICAgICAgICAgICAgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIGZlYXR1cmUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTikgQ29udGV4dCBvZiB0aGUgYXVkaW8gbWl4ZXIKLSAqIEBwYXJhbSAgICBwSW5wdXRDbGlwUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBmaXJzdCBjbGlwCi0gKiBAcGFyYW0gICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgc2Vjb25kIGNsaXAKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOUFVUX0NMSVBfSVNfTk9UX0FfM0dQUAotICogQHJldHVybiAgTTROT19FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW5wdXRDbGlwUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQWRkZWRDbGlwUHJvcGVydGllcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soKQotICogQGJyaWVmICAgIERlbGV0ZSB0aGUgYXVkaW8gdHJhY2suIENsaXAgd2lsbCBiZSBsaWtlIGlmIGl0IGhhZCBubyBhdWRpbyB0cmFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN0YXJ0QVUoKQotICogQGJyaWVmICAgIFN0YXJ0QVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4pIEl0IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgcHJlcGFyZWQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50U3RhcnRBVShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UHJvY2Vzc0FVKCkKLSAqIEBicmllZiAgICBQcm9jZXNzQVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4pIEl0IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgd3JpdHRlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgTTRWU1MzR1BQX2ludFByb2Nlc3NBVShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VlBQKCkKLSAqIEBicmllZiAgICBXZSBpbXBsZW1lbnQgb3VyIG93biBWaWRlb1ByZVByb2Nlc3NpbmcgZnVuY3Rpb24KLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgKElOKQotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbCBjb250YWluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBZVVY0MjAgaW1hZ2UKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRWU1MzR1BQX0lOVEVSTkFMRlVOQ1RJT05TX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3OTAwZjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgKLSAqIEBicmllZiAgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGVudW0gYW5kIHR5cGVzIG5vdCB2aXNpYmxlIHRvIHRoZSBleHRlcm5hbCB3b3JsZC4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfSU5URVJOQUxUWVBFU19IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfSU5URVJOQUxUWVBFU19IX18KLQotI2RlZmluZSBNNFZTU19WRVJTSU9OX01BSk9SICAgICAgICAzCi0jZGVmaW5lIE00VlNTX1ZFUlNJT05fTUlOT1IgICAgICAgIDIKLSNkZWZpbmUgTTRWU1NfVkVSU0lPTl9SRVZJU0lPTiAgICA1Ci0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLS8qKgotICogICAgVlNTIHB1YmxpYyBBUEkgYW5kIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotCi0vKioKLSAqICAgIEludGVybmFsbHkgdXNlZCBtb2R1bGVzICovCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiICAgICAgICAvKio8IFJlYWRlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiICAgICAgICAvKio8IFdyaXRlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIiAgICAgICAgLyoqPCBEZWNvZGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfY29tbW9uLmgiICAgICAgICAvKio8IEVuY29kZXIgY29tbW9uIGludGVyZmFjZSAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiICAgICAgICAvKio8IEltYWdlIHBsYW5lcyBkZWZpbml0aW9uICovCi0jaW5jbHVkZSAiTTRSRUFERVJfM2dwQ29tLmgiICAgICAgICAvKio8IFJlYWQgM0dQUCBmaWxlICAgICAqLwotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiICAgICAgICAgICAgLyoqPCBEZWNvZGVyIGF1ZGlvICAgKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIgIC8qKjwgRW5jb2RlIGF1ZGlvICAgICovCi0KLQotI2luY2x1ZGUgIlNTUkMuaCIgICAgICAgICAgICAgICAgICAgIC8qKjwgU1NSQyAgICAgICAgICAgICAqLwotI2luY2x1ZGUgIkZyb20yaVRvTW9ub18xNi5oIiAgICAgICAgLyoqPCBTdGVyZW8gdG8gTW9ubyAgICAgKi8KLSNpbmNsdWRlICJNb25vVG8ySV8xNi5oIiAgICAgICAgICAgIC8qKjwgTW9ubyB0byBTdGVyZW8gICAgICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBXSU5ET1dfU0laRSAxMAotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRWU1MzR1BQX0VkaXRTdGF0ZQotICogQGJyaWVmICAgICAgICBNYWluIHN0YXRlIG1hY2hpbmUgb2YgdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ1JFQVRFRCAgICA9IDAsICAgIC8qKjwgTTRWU1MzR1BQX2VkaXRJbml0IGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPICAgICAgICA9IDEsICAgIC8qKjwgUHJvY2Vzc2luZyB2aWRlbyB0cmFjayAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX0FVRElPICAgICAgICA9IDIsICAgIC8qKjwgUHJvY2Vzc2luZyBhdWRpbyB0cmFjayAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX01QMyAgICAgICAgPSAzLCAgICAvKio8IFByb2Nlc3NpbmcgTVAzIGF1ZGlvIHRyYWNrICovCi0gICAgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVAgICA9IDQsICAgICAgICAvKio8IFByb2Nlc3NpbmcgYSBqdW1wIGluIGEgTVAzIGF1ZGlvIHRyYWNrICovCi0gICAgTTRWU1MzR1BQX2tFZGl0U3RhdGVfRklOSVNIRUQgICAgPSA1LCAgICAvKio8IFByb2Nlc3NpbmcgZG9uZSwgVlNTIDNHUFAgY2FuIGJlIGNsb3NlZCAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRCAgICAgICAgPSA2ICAgICAgICAvKio8IE91dHB1dCBmaWxlIGhhcyBiZWVuIGNsb3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlNTIDNHUFAgY2FuIGJlIGRlc3Ryb3llZCAqLwotfQotTTRWU1MzR1BQX0VkaXRTdGF0ZTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyoqPCBEb2luZyBSZWFkL1dyaXRlIG9wZXJhdGlvbi4gVGhpcyBvcGVyYXRpb24gd2lsbCBoYXZlIG5vIHByb2Nlc3NpbmcKLSAgICAgKiBvbiBpbnB1dCBmcmFtZXMuIE9ubHkgdGltZSBzdGFtcCBtYW5pcHVsYXRpb25zIGluIG91dHB1dCBmaWxlLiAqLwotICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSAgICA9IDEwLAotICAgIC8qKjwgRGVjb2RlIGVuY29kZSB0byBjcmVhdGUgYW4gSSBmcmFtZS4gVGhpcyBpcyBkb25lIGZvciBhIHNpbmdsZSBmcmFtZQotICAgICAqIHRvIGNyZWF0ZSBhIG5ldyByZWZlcmVuY2UgZnJhbWUuICovCi0gICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgICAgID0gMTEsCi0gICAgLyoqPCBEb2luZyBSZWFkLT5EZWNvZGUtPkZpbHRlci0+RW5jb2RlLT5Xcml0ZSBvcGVyYXRpb24gb24gdGhlIGlucHV0IGZpbGUKLSAgICAgKiB0byBjcmVhdGUgdGhlIG91dHB1dCBmaWxlLiAqLwotICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9IDEyLAotICAgIC8qKjwgQXBwbGllZCB3aGVuIFRyYW5zaXRpb24gaXMgYWN0aXZlIGFuZCBibGVuZGluZyBvZiB0d28gdmlkZW9zIGlzCi0gICAgICogcmVxdWlyZWQuICovCi0gICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OICAgID0gMTMsCi0gICAgLyoqPCBTcGVjaWFsIFJlYWQvV3JpdGUgbW9kZSB1c2VkIGFmdGVyIEJFR0lOX0NVVCBzdGF0ZS4gVGhlIGZyYW1lCi0gICAgICogaXMgYWxyZWFkeSBjb2RlZCBhcyBJIGZyYW1lIGluIEJFR0lOX0NVVCBzdGF0ZTsgc28gc2tpcCBpdC4gKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVCAgICAgPSAxNAotfQotTTRWU1MzR1BQX0VkaXRWaWRlb1N0YXRlOwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEUgICAgPSAyMCwgICAgLyoqPCBEb2luZyBSZWFkL1dyaXRlIG9wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm8gZGVjb2RpbmcvZW5jb2RpbmcpICovCi0gICAgTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9ERUNPREVfRU5DT0RFID0gMjEsICAgIC8qKjwgRG9pbmcgUmVhZC1EZWNvZGUvRmlsdGVyLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RlLVdyaXRlIG9wZXJhdGlvbiAqLwotICAgIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTiAgICA9IDIyICAgIC8qKjwgVHJhbnNpdGlvbjsgYmxlbmRpbmcgb2YgdHdvIGF1ZGlvICovCi19Ci1NNFZTUzNHUFBfRWRpdEF1ZGlvU3RhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTdGF0dXMKLSAqIEBicmllZiAgICAgICAgU3RhdHVzIG9mIHRoZSBjbGlwLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEICAgICAgICAgICAgPSAwLCAgICAvKio8IFRoZSBjbGlwIGlzIGN1cnJlbnRseSByZWFkeSBmb3IgcmVhZGluZyAqLwotICAgIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREUgICAgICAgID0gMSwgICAgLyoqPCBUaGUgY2xpcCBpcyBjdXJyZW50bHkgcmVhZHkgZm9yIGRlY29kaW5nICovCi0gICAgTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAgICA9IDIgICAgICAgIC8qKjwgVGhlIGNsaXAgaXMgY3VycmVudGx5IGluIHNwbGl0dGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVVcFRvKCkgcHJvY2Vzc2luZyAqLwotfQotTTRWU1MzR1BQX0NsaXBTdGF0dXM7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBDdXJyZW50RWZmZWN0Ci0gKiBAYnJpZWYgICAgICAgIEN1cnJlbnQgZWZmZWN0IGFwcGxpZWQgdG8gdGhlIGNsaXAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tDbGlwQ3VycmVudEVmZmVjdF9OT05FICAgID0gMCwgICAgLyoqPCBOb25lICovCi0gICAgTTRWU1MzR1BQX2tDbGlwQ3VycmVudEVmZmVjdF9CRUdJTiAgICA9IDEsICAgIC8qKjwgQmVnaW4gZWZmZWN0IGN1cnJlbnRseSBhcHBsaWVkICovCi0gICAgTTRWU1MzR1BQX2tDbGlwQ3VycmVudEVmZmVjdF9FTkQgICAgPSAyICAgICAgICAvKio8IEVuZCBlZmZlY3QgY3VycmVudGx5IGFwcGxpZWQgKi8KLX0KLU00VlNTM0dQUF9DbGlwQ3VycmVudEVmZmVjdDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTdGF0ZQotICogQGJyaWVmICAgICAgICBNYWluIHN0YXRlIG1hY2hpbmUgb2YgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTyA9IDAsICAgICAgICAgICAgLyoqPCBWaWRlbyBpcyBiZWluZyBwcm9jZXNzZWQgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVCwgIC8qKjwgQXVkaW8gaXMgYmVpbmcgcHJvY2Vzc2VkICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1NFQ09ORF9TRUdNRU5ULCAvKio8IEF1ZGlvIGlzIGJlaW5nIHByb2Nlc3NlZCAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5ULCAgLyoqPCBBdWRpbyBpcyBiZWluZyBwcm9jZXNzZWQgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfRklOSVNIRUQgICAgICAgICAgICAgIC8qKjwgUHJvY2Vzc2luZyBmaW5pc2hlZCwgdXNlciBtdXN0IG5vdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKi8KLX0KLU00VlNTM0dQUF9BdWRpb01peGluZ1N0YXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZVN0YXRlCi0gKiBAYnJpZWYgICAgICAgIE1haW4gc3RhdGUgbWFjaGluZSBvZiB0aGUgVlNTIHBpY3R1cmUgZXh0cmFjdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0V4dHJhY3RQaWN0dXJlU3RhdGVfT1BFTkVEICAgPSAwLCAgLyoqPCBWaWRlbyBjbGlwIGlzIG9wZW5lZCBhbmQgcmVhZHkgdG8gYmUgcmVhZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCB0aGUgUkFQIGJlZm9yZSB0aGUgcGljdHVyZSB0byBleHRyYWN0ICovCi0gICAgTTRWU1MzR1BQX2tFeHRyYWN0UGljdHVyZVN0YXRlX1BST0NFU1MgICAgPSAxLCAgLyoqPCBWaWRlbyBpcyBkZWNvZGVkIGZyb20gdGhlIHByZXZpb3VzIFJBUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgcGljdHVyZSB0byBleHRyYWN0ICovCi0gICAgTTRWU1MzR1BQX2tFeHRyYWN0UGljdHVyZVN0YXRlX0VYVFJBQ1RFRD0gMiAgIC8qKjwgVmlkZW8gQVUgaGFzIGJlZW4gIGRlY29kZWQsIHVzZXIgbXVzdCBub3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwICovCi19Ci1NNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTdGF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgICAgQ29kZWNzIHJlZ2lzdHJhdGlvbiBzYW1lIGFzIGluIFZQUyBhbmQgVkVTLCBzbyBsZXNzIG1hcHBpbmcKLSAqICAgICAgICAgICAgICBpcyByZXF1aXJlZCB0b3dhcmQgVlNTIGFwaSB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgICBwR2xvYmFsRmN0czsgICAgLyoqPCBvcGVuLCBjbG9zZSwgc2V0b3B0aW9uLGV0Yy4uLiBmdW5jdGlvbnMgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgcERhdGFGY3RzOyAgICAgICAgLyoqPCBkYXRhIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KLX0gTTRWU1MzR1BQX1dyaXRlckludGVyZmFjZTsKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0IEFBQ19ERUNfU1RSRUFNX1BST1BTCi0gKiBAYnJpZWYgQUFDIFN0cmVhbSBwcm9wZXJ0aWVzCi0gKiBATm90ZSBhTm9DaGFuIGFuZCBhU2FtcEZyZXEgYXJlIHVzZWQgZm9yIHBhcnNpbmcgZXZlbiB0aGUgdXNlciBwYXJhbWV0ZXJzCi0gKiAgICAgICAgYXJlIGRpZmZlcmVudC4gIFVzZXIgcGFyYW1ldGVycyB3aWxsIGJlIGlucHV0IGZvciB0aGUgb3V0cHV0IGJlaGF2aW91cgotICogICAgICAgIG9mIHRoZSBkZWNvZGVyIHdoZXJlYXMgZm9yIHBhcnNpbmcgYml0c3RyZWFtIHByb3BlcnRpZXMgYXJlIHVzZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgTTRPU0FfSW50MzIgYUF1ZGlvT2JqZWN0VHlwZTsgICAgIC8qKjwgQXVkaW8gb2JqZWN0IHR5cGUgb2YgdGhlIHN0cmVhbSAtIGluIGZhY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHR5cGUgZm91bmQgaW4gdGhlIEFjY2VzcyBVbml0IHBhcnNlZCAqLwotICBNNE9TQV9JbnQzMiBhTnVtQ2hhbjsgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgY2hhbm5lbHMgKD0xKG1vbm8pIG9yID0yKHN0ZXJlbykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGluZGljYXRlZCBieSBpbnB1dCBiaXRzdHJlYW0qLwotICBNNE9TQV9JbnQzMiBhU2FtcEZyZXE7ICAgICAgICAgICAgLyoqPCBzYW1wbGluZyBmcmVxdWVuY3kgaW4gSHogKi8KLSAgTTRPU0FfSW50MzIgYUV4dGVuc2lvblNhbXBGcmVxOyAgIC8qKjwgZXh0ZW5kZWQgc2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCA9IDAgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZXh0ZW5kZWQgZnJlcXVlbmN5ICovCi0gIE00T1NBX0ludDMyIGFTQlJQcmVzZW50OyAgICAgICAgICAvKio8IHByZXNlbmNlPTEvYWJzZW5jZT0wIG9mIFNCUiAqLwotICBNNE9TQV9JbnQzMiBhUFNQcmVzZW50OyAgICAgICAgICAgLyoqPCBwcmVzZW5jZT0xL2Fic2VuY2U9MCBvZiBQUyAqLwotICBNNE9TQV9JbnQzMiBhTWF4UENNU2FtcGxlc1BlckNoOyAgLyoqPCBtYXggbnVtYmVyIG9mIFBDTSBzYW1wbGVzIHBlciBjaGFubmVsICovCi19IEFBQ19ERUNfU1RSRUFNX1BST1BTOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dAotICogQGJyaWVmICAgICAgICBGaWxlc3lzdGVtIGFuZCBjb2RlYyByZWdpc3RyYXRpb24gZnVuY3Rpb24gcG9pbnRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyoqCi0gICAgICAqIE1lZGlhIGFuZCBDb2RlYyByZWdpc3RyYXRpb24gKi8KLSAgICAvKio8IFRhYmxlIG9mIE00VkVTX1dyaXRlckludGVyZmFjZSBzdHJ1Y3R1cmVzIGZvciBhdmFsYWlibGUgV3JpdGVycyBsaXN0ICovCi0gICAgTTRWU1MzR1BQX1dyaXRlckludGVyZmFjZSAgICBXcml0ZXJJbnRlcmZhY2VbTTRXUklURVJfa1R5cGVfTkJdOwotICAgIC8qKjwgb3BlbiwgY2xvc2UsIHNldG9wdGlvbixldGMuLi4gZnVuY3Rpb25zIG9mIHRoZSB1c2VkIHdyaXRlciovCi0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgICBwV3JpdGVyR2xvYmFsRmN0czsKLSAgICAvKio8IGRhdGEgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBvZiB0aGUgdXNlZCB3cml0ZXIgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgcFdyaXRlckRhdGFGY3RzOwotCi0gICAgLyoqPCBUYWJsZSBvZiBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlIHN0cnVjdHVyZXMgZm9yIGF2YWxhaWJsZSBlbmNvZGVycyBsaXN0ICovCi0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogICAgcFZpZGVvRW5jb2RlckludGVyZmFjZVtNNEVOQ09ERVJfa1ZpZGVvX05CXTsKLSAgICAvKio8IEZ1bmN0aW9ucyBvZiB0aGUgdXNlZCBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHM7Ci0KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2RlckV4dGVybmFsQVBJVGFibGVbTTRFTkNPREVSX2tWaWRlb19OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIHBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEk7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBwQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhOwotCi0gICAgLyoqPCBUYWJsZSBvZiBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2Ugc3RydWN0dXJlcyBmb3IgYXZhbGFpYmxlIGVuY29kZXJzIGxpc3QgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqICAgIHBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTTRFTkNPREVSX2tBdWRpb19OQl07Ci0gICAgLyoqPCBUYWJsZSBvZiBpbnRlcm5hbC9leHRlcm5hbCBmbGFncyBmb3IgYXZhbGFpYmxlIGVuY29kZXJzIGxpc3QgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJGbGFnW000RU5DT0RFUl9rQXVkaW9fTkJdOwotICAgIC8qKjwgRnVuY3Rpb25zIG9mIHRoZSB1c2VkIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzOwotCi0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKiAgIG1fcFJlYWRlckdsb2JhbEl0VGFibGVbTTRSRUFERVJfa01lZGlhVHlwZV9OQl07Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgIG1fcFJlYWRlckRhdGFJdFRhYmxlW000UkVBREVSX2tNZWRpYVR5cGVfTkJdOwotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICBtX3BSZWFkZXI7Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgIG1fcFJlYWRlckRhdGFJdDsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgbV91aU5iUmVnaXN0ZXJlZFJlYWRlcnM7Ci0KLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqICAgbV9wVmlkZW9EZWNvZGVyOwotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICBtX3BWaWRlb0RlY29kZXJJdFRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlX05CXTsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgbV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGE7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIG1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbTTRERUNPREVSX2tWaWRlb1R5cGVfTkJdOwotI2VuZGlmCi0KLSAgICBNNEFEX0ludGVyZmFjZSogICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyOwotICAgIE00QURfSW50ZXJmYWNlKiAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXJJdFRhYmxlW000QURfa1R5cGVfTkJdOwotICAgIC8qKjwgc3RvcmUgaW5kaWNlcyBvZiBleHRlcm5hbCBkZWNvZGVycyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtNNEFEX2tUeXBlX05CXTsKLQotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW000RU5DT0RFUl9rQXVkaW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGE7Ci0KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtNNEFEX2tUeXBlX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhOwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0gICAgLyogYm9vbGVhbiB0byB0ZWxsIHdoZXRoZXIgcmVnaXN0ZXJlZCBleHRlcm5hbCBPTVggY29kZWNzIHNob3VsZCBiZSBmcmVlZCBkdXJpbmcgY2xlYW51cAotICAgICBvciBuZXcgY29kZWMgcmVnaXN0cmF0aW9uKi8KLSAgICBNNE9TQV9Cb29sICAgIGJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZTsKLSNlbmRpZgotCi0KLX0gTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbnMgcmVsYXRlZCB0byBvbmUgM0dQUCBjbGlwIChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGNvbnRleHQgcmVsYXRlZCB0byBvbmUgY2xpcAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyogICAgICAgIHBTZXR0aW5nczsgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gdGhlIGNsaXAgc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgcG9zc2Vzc2VkKSAqLwotCi0gICAgTTRWU1MzR1BQX0NsaXBTdGF0dXMgICAgICAgIFZzdGF0dXM7ICAgICAgICAgICAgLyoqPCBWaWRlbyBzdGF0dXMgb2YgdGhlIGNsaXAgcmVhZGluZyAqLwotICAgIE00VlNTM0dQUF9DbGlwU3RhdHVzICAgICAgICBBc3RhdHVzOyAgICAgICAgICAgIC8qKjwgQXVkaW8gc3RhdHVzIG9mIHRoZSBjbGlwIHJlYWRpbmcgKi8KLQotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpVm9mZnNldDsgICAgICAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIE9mZnNldCBiZXR3ZWVuIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcCBhbmQgdGhlIG91dHB1dCB2aWRlbyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZWdpbiBjdXQgdGFrZW4gaW50byBhY2NvdW50KSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpQW9mZnNldDsgICAgICAgICAgIC8qKjwgW1RpbWVzY2FsZV0gT2Zmc2V0IGJldHdlZW4gdGhlIGNsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgb3V0cHV0IGF1ZGlvIHN0cmVhbSAoYmVnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dCB0YWtlbiBpbnRvIGFjY291bnQpICovCi0KLSAgICAvKioKLSAgICAgKiAzR1BQIHJlYWRlciBTdHVmZiAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIHBGaWxlUmVhZFB0ckZjdDsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0OyAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgM0dQUCByZWFkZXIgbW9kdWxlICovCi0gICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyKiAgICAgICAgcFZpZGVvU3RyZWFtOyAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgcmVhZCB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICAgICAgICBwQXVkaW9TdHJlYW07ICAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSByZWFkIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgICAgICAgVmlkZW9BVTsgICAgICAgICAgICAvKio8IFJlYWQgdmlkZW8gYWNjZXNzIHVuaXQgKHdlIGRvIG5vdCB1c2UgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBhbGxvY2F0ZSBsYXRlciwgYmVjYXVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9zdCBvZiB0aGUgdGltZSB3ZSB3aWxsIG5lZWQgaXQpICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgICAgICBBdWRpb0FVOyAgICAgICAgICAgIC8qKjwgUmVhZCBhdWRpbyBhY2Nlc3MgdW5pdCAod2UgZG8gbm90IHVzZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIGFsbG9jYXRlIGxhdGVyLCBiZWNhdXNlIG1vc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB0aW1lIHdlIHdpbGwgbmVlZCBpdCkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBiVmlkZW9BdUF2YWlsYWJsZTsgICAgLyoqPCBUZWxsIGlmIGEgdmlkZW8gQVUgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNseSByZWFkKSAqLwotICAgIC8qKjwgQm9vbGVhbiBvbmx5IHVzZWQgdG8gZml4IHRoZSBCWlogYnVnLi4uICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYkZpcnN0QXVXcml0dGVuOwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZGVjb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgcFZpRGVjQ3R4dDsgICAgICAgICAgICAvKio8IFZpZGVvIGRlY29kZXIgY29udGV4dCAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBpVmlkZW9EZWNDdHM7ICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gRm9yIHZpZGVvIGRlY29kZVVwVG8oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0dWFsIHJlYWNoZWQgY3RzICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlWaWRlb1JlbmRlckN0czsgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBGb3IgdmlkZW8gcmVuZGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdHVhbCByZWFjaGVkIGN0cyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGlzUmVuZGVyRHVwOyAgICAgICAgLyoqPCBUbyBoYW5kbGUgZHVwbGljYXRlIGZyYW1lIHJlbmRlcmluZyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugb2YgZXh0ZXJuYWwgZGVjb2RpbmcgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgICAgICAgICBsYXN0RGVjb2RlZFBsYW5lOyAgICAvKio8IExhc3QgZGVjb2RlZCBwbGFuZSAqLwotCi0gICAgLyoqCi0gICAgICogTVBFRzQgdGltZSBpbmZvIHN0dWZmIGF0IGNsaXAgbGV2ZWwgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgIGJNcGVnNEdvdlN0YXRlOyAgICAgICAgICAgIC8qKjwgTmFtZWx5LCB1cGRhdGUgb3IgaW5pdGlhbGl6YXRpb24gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgIHVpTXBlZzRQcmV2R292VmFsdWVHZXQ7ICAgIC8qKjwgUHJldmlvdXMgR292IHZhbHVlIHJlYWQgKGluIHNlY29uZCkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgIHVpTXBlZzRQcmV2R292VmFsdWVTZXQ7ICAgIC8qKjwgUHJldmlvdXMgR292IHZhbHVlIHdyaXRlIChpbiBzZWNvbmQpICovCi0KLSAgICAvKioKLSAgICAgKiBUaW1lLWxpbmUgc3R1ZmYgKi8KLSAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBDVFMgYXQgd2hpY2ggdGhlIHZpZGVvIGNsaXAgYWN0dWFsbHkgc3RhcnRzICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotICAgIC8qKjwgW01pbGxpc2Vjb25kc10gQ1RTIGF0IHdoaWNoIHRoZSBhdWRpbyBjbGlwIGFjdHVhbGx5IHN0YXJ0cyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpQWN0dWFsQXVkaW9CZWdpbkN1dDsKLSAgICAvKio8IFtNaWxsaXNlY29uZHNdIFRpbWUgYXQgd2hpY2ggdGhlIGNsaXAgbXVzdCBlbmQgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaUVuZFRpbWU7Ci0KLSAgICAvKioKLSAgICAgKiBBdWRpbyBkZWNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICBwQXVkaW9EZWNDdHh0OyAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBBTVIgZGVjb2RlciAqLwotICAgIE00QURfQnVmZmVyICAgICAgICAgICAgICAgICBBdWRpb0RlY0J1ZmZlckluOyAgICAvKio8IElucHV0IHN0cnVjdHVyZSBmb3IgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBNNEFEX0J1ZmZlciAgICAgICAgICAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJPdXQ7ICAgIC8qKjwgQnVmZmVyIGZvciB0aGUgZGVjb2RlZCBQQ00gZGF0YSAqLwotICAgIEFBQ19ERUNfU1RSRUFNX1BST1BTICAgICAgICBBYWNQcm9wZXJ0aWVzOyAgICAgIC8qKjwgU3RydWN0dXJlIGZvciBuZXcgYXBpIHRvIGdldCBBQUMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgKi8KLQotICAgIC8qKgotICAgICAqIEF1ZGlvIEFVIHRvIEZyYW1lIHNwbGl0IHN0dWZmICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiQXVkaW9GcmFtZUF2YWlsYWJsZTsgIC8qKjwgVHJ1ZSBpZiBhbiBhdWRpbyBmcmFtZSBpcyBhdmFpbGFibGUgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgIHBBdWRpb0ZyYW1lUHRyOyAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBBdWRpbyBmcmFtZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlBdWRpb0ZyYW1lU2l6ZTsgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgYXVkaW8gZnJhbWUgYXZhaWxhYmxlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICBpQXVkaW9GcmFtZUN0czsgICAgICAgLyoqPCBbVGltZXNjYWxlXSBDVFMgb2YgdGhlIGF1ZGlvIGZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgKi8KLQotICAgIC8qKgotICAgICAqIFNpbGVuY2UgZnJhbWUgc3R1ZmYgKi8KLSAgICAgLyoqPCBTaXplIHRvIHJlc2VydmUgdG8gc3RvcmUgYSBwY20gZnVsbCBvZiB6ZXJvcyBjb21wYXRpYmxlIHdpdGggbWFzdGVyIGNsaXAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlTaWxlbmNlUGNtU2l6ZTsKLSAgICAvKio8IFBvaW50ZXIgdG8gc2lsZW5jZSBmcmFtZSBkYXRhIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcCBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX1VJbnQ4KiAgICAgICAgICAgICAgICBwU2lsZW5jZUZyYW1lRGF0YTsKLSAgICAvKio8IFNpemUgb2Ygc2lsZW5jZSBmcmFtZSBkYXRhIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcCBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgLyoqPCBbVGltZXNjYWxlXSBEdXJhdGlvbiBvZiBzaWxlbmNlIGZyYW1lIGRhdGEgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIGlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgc2NhbGVfYXVkaW87ICAgICAgICAgICAgLyoqPCBmcmVxdWVuY3kgLyAxMDAwLjAgKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZXMgb2YgdGhlIHVzZWQgbW9kdWxlcyAqLwotICAgICAvKio8IEZpbGVzeXN0ZW0gYW5kIHNoZWxsIHJlYWRlciwgZGVjb2RlciBmdW5jdGlvbnMgKi8KLSAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgU2hlbGxBUEk7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgICAgICpwUGxhbmVZdXY7ICAvKiBZVVY0MjAgaW1hZ2UgcGxhbmUsIGNvbnZlcnRlZCBmcm9tIEFSR0I4ODggKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgICAgICAgbV9wUHJlUmVzaXplRnJhbWU7ICAvKiBUaGUgZGVjb2RlZCBpbWFnZSBiZWZvcmUgcmVzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NhdGVkIG9ubHkgaWYgcmVzaXplIG5lZWRlZCkqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAqcFBsYW5lWXV2V2l0aEVmZmVjdDsgLyogWVVWNDIwIGltYWdlIHBsYW5lLCB3aXRoIGNvbG9yIGVmZmVjdCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiR2V0WXV2RGF0YUZyb21EZWNvZGVyOyAgLyogQm9vbGVhbiB1c2VkIHRvIGdldCBZVVYgZGF0YSBmcm9tIGR1bW15IHZpZGVvIGRlY29kZXIgb25seSBmb3IgZmlyc3QgdGltZSAqLwotfSBNNFZTUzNHUFBfQ2xpcENvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgYW5vbnltb3VzIGVudW0KLSAqIEBicmllZiAgICAgICAgZW51bSB0byBrZWVwIHRyYWNrIG9mIHRoZSBlbmNvZGVyIHN0YXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotZW51bQotewotICAgIE00VlNTM0dQUF9rTm9FbmNvZGVyLAotICAgIE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZCwKLSAgICBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkLAotICAgIE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmcKLX07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9BdWRpb1ZpZGVvQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBhdWRpbyB2aWRlbyBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBhdWRpby92aWRlbywgZW5jb2Rpbmcvd3JpdGluZyBvcGVyYXRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogVGltaW5nIFN0dWZmICovCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAvKio8IFtNaWxsaXNlY29uZHNdIER1cmF0aW9uIG9mIHRoZSBvdXRwdXQgZmlsZSwgdXNlZCBmb3IgcHJvZ3Jlc3MgY29tcHV0YXRpb24gKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgZElucHV0VmlkQ3RzOwotICAgIC8qKjwgW01pbGxpc2Vjb25kc10gQ3VycmVudCBDVFMgb2YgdGhlIHZpZGVvIG91dHB1dCBzdHJlYW0gKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgZE91dHB1dFZpZEN0czsKLS8qKjwgW01pbGxpc2Vjb25kc10gQ3VycmVudCBDVFMgb2YgdGhlIGF1ZGlvIG91dHB1dCBzdHJlYW0gKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgZEFUbzsKLSAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBEdXJhdGlvbiBvZiB0aGUgb3V0cHV0IGZpbGUsIHVzZWQgZm9yIHByb2dyZXNzIGNvbXB1dGF0aW9uICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlPdXRwdXREdXJhdGlvbjsKLQotICAgIC8qKgotICAgICAqIE91dHB1dCBWaWRlbyBTdHJlYW0gU3R1ZmYgKi8KLSAgICBNNFNZU19TdHJlYW1UeXBlICAgICAgICAgICAgVmlkZW9TdHJlYW1UeXBlOyAgICAgICAgLyoqPCBPdXRwdXQgdmlkZW8gY29kZWMgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgb3V0cHV0VmlkZW9Qcm9maWxlOyAgLyoqPCBPdXRwdXQgdmlkZW8gcHJvZmlsZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBvdXRwdXRWaWRlb0xldmVsOyAgIC8qKjwgT3V0cHV0IHZpZGVvIGxldmVsICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9CaXRyYXRlOyAgICAgLyoqPCBBdmVyYWdlIHZpZGVvIGJpdHJhdGUgb2YgdGhlIG91dHB1dCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQgZnJvbSBpbnB1dCBiaXRyYXRlcywgZHVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zIGFuZCBjdXRzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9XaWR0aDsgICAgICAgICAgICAvKio8IE91dHB1dCBpbWFnZSB3aWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvSGVpZ2h0OyAgICAgICAgICAgIC8qKjwgT3V0cHV0IGltYWdlIGhlaWdodCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvVGltZVNjYWxlOyAgICAgICAgLyoqPCBUaW1lIHNjYWxlIHRvIHVzZSBmb3IgdGhlIGVuY29kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdHJhbnNpdGlvbiAoaWYgTVBFRy00KSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGJWaWRlb0RhdGFQYXJ0aXRpb25pbmc7ICAgIC8qKjwgRGF0YSBwYXJ0aXRpb25pbmcgdG8gdXNlIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmcgb2YgdGhlIHRyYW5zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIE1QRUctNCkgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgICBwVmlkZW9PdXRwdXREc2k7ICAgICAgICAvKio8IERlY29kZXIgU3BlY2lmaWMgSW5mbyBvZiB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUctNCB0cmFjayAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICB1aVZpZGVvT3V0cHV0RHNpU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBEZWNvZGVyIFNwZWNpZmljIEluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgb3V0cHV0IE1QRUctNCB0cmFjayAqLwotICAgIC8qKgotICAgICAqIE91dHB1dCBBdWRpbyBTdHJlYW0gU3R1ZmYgKi8KLSAgICBNNFNZU19TdHJlYW1UeXBlICAgICAgICAgICAgQXVkaW9TdHJlYW1UeXBlOyAgICAgICAgLyoqPCBUeXBlIG9mIHRoZSBvdXRwdXQgYXVkaW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpTmJDaGFubmVsczsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAoMT1tb25vLCAyPXN0ZXJlbykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGU7ICAgICAgICAgLyoqPCBBdWRpbyBhdmVyYWdlIGJpdHJhdGUgKGluIGJwcykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlTYW1wbGluZ0ZyZXF1ZW5jeTsgICAgLyoqPCBTYW1wbGluZyBhdWRpbyBmcmVxdWVuY3kgKDgwMDAgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1yLCAxNjAwMCBvciBtb3JlIGZvciBhYWMpICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgICAgcEF1ZGlvT3V0cHV0RHNpOyAgICAgICAgLyoqPCBEZWNvZGVyIFNwZWNpZmljIEluZm8gb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGF1ZGlvIHRyYWNrICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgIHVpQXVkaW9PdXRwdXREc2lTaXplOyAgICAvKio8IFNpemUgb2YgdGhlIERlY29kZXIgU3BlY2lmaWMgSW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBvdXRwdXQgYXVkaW8gdHJhY2sgKi8KLQotICAgIC8qKgotICAgICAqIEF1ZGlvIEVuY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY0N0eHQ7ICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gIHBBdWRpb0VuY0RTSTsgICAgICAgLyoqPCBEZWNvZGVyIHNwZWNpZmljIGluZm8gYnVpbHQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlciAqLwotICAgIE00RU5DT0RFUl9BdWRpb1BhcmFtcyAgICAgICAgICAgQXVkaW9FbmNQYXJhbXM7ICAgICAvKio8IENvbmZpZyBvZiB0aGUgYXVkaW8gZW5jb2RlciAqLwotCi0gICAgLyoqCi0gICAgICogU2lsZW5jZSBmcmFtZSBzdHVmZiAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVNpbGVuY2VQY21TaXplOyAgICAgICAvKio8IFNpemUgdG8gcmVzZXJ2ZSB0byBzdG9yZSBhIHBjbSBmdWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgemVyb3MgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9VSW50OCogICAgICAgICAgICAgICAgcFNpbGVuY2VGcmFtZURhdGE7ICAgICAgLyoqPCBQb2ludGVyIHRvIHNpbGVuY2UgZnJhbWUgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpU2lsZW5jZUZyYW1lU2l6ZTsgICAgIC8qKjwgU2l6ZSBvZiBzaWxlbmNlIGZyYW1lIGRhdGEgY29tcGF0aWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggbWFzdGVyIGNsaXAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgaVNpbGVuY2VGcmFtZUR1cmF0aW9uOyAgLyoqPCBbVGltZXNjYWxlXSBEdXJhdGlvbiBvZiBzaWxlbmNlIGZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgICAgIHNjYWxlX2F1ZGlvOyAgICAgICAgICAgIC8qKjwgZnJlcXVlbmN5IC8gMTAwMC4wICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBFbmNvZGVyIHN0dWZmICovCi0gICAgTTRFTkNPREVSX0NvbnRleHQgICAgICAgICAgICBwRW5jQ29udGV4dDsgICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGVuY29kZXIgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlICAgICAgICBPdXJXcml0ZXJEYXRhSW50ZXJmYWNlOyAgICAvKio8IE91ciBvd24gaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciBpbnRlcmZhY2UsIHRvIGdpdmUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVuY29kZXIgc2hlbGwgKi8KLSAgICBNNE9TQV9NZW1BZGRyMzIgICAgICAgICAgICAgICAgcER1bW15QXVCdWZmZXI7ICAgICAgICAgICAgLyoqPCBCdWZmZXIgZ2l2ZW4gdG8gdGhlIGVuY29kZXIgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgdG8gd3JpdGUgQVVzIHdlIGRvbid0IHdhbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dHB1dCAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpTXBlZzRHb3ZPZmZzZXQ7ICAgICAgICAvKio8IENsaXAgR09WIG9mZnNldCBpbiBtcyBiZXR3ZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIGFuZCBzeXN0ZW0gdGltZSAqLwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgICAgVnBwRXJyb3I7ICAgICAgICAgICAgICAgIC8qKjwgRXJyb3IgZm9yIFZQUCBhcmUgbWFza2VkIGJ5IFZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGVyLCBzbyB3ZSBtdXN0IHJlbWVtYmVyIGl0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIGVuY29kZXJTdGF0ZTsKLQotICAgIC8qKgotICAgICAqIFdyaXRlciBzdHVmZiAqLwotICAgIE00V1JJVEVSX0NvbnRleHQgICAgICAgICAgICBwM2dwV3JpdGVyQ29udGV4dDsgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgM0dQUCB3cml0ZXIgbW9kdWxlICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gICAgICAgIFdyaXRlclZpZGVvU3RyZWFtOyAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiAgICAgICAgV3JpdGVyQXVkaW9TdHJlYW07ICAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MgICAgV3JpdGVyVmlkZW9TdHJlYW1JbmZvOyAgICAvKio8IFZpZGVvIHByb3BlcnRpZXMgb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MgICAgV3JpdGVyQXVkaW9TdHJlYW1JbmZvOyAgICAvKio8IEF1ZGlvIHByb3BlcnRpZXMgb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc3RyZWFtICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIFdyaXRlclZpZGVvQVU7ICAgICAgICAgICAgLyoqPCBXcml0dGVuIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIFdyaXRlckF1ZGlvQVU7ICAgICAgICAgICAgLyoqPCBXcml0dGVuIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9NYXhBdVNpemU7ICAgICAgICAvKio8IE1heCBBVSBzaXplIHNldCB0byB0aGUgd3JpdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSB2aWRlbyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aUF1ZGlvTWF4QXVTaXplOyAgICAgICAgLyoqPCBNYXggQVUgc2l6ZSBzZXQgdG8gdGhlIHdyaXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgYXVkaW8gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlPdXRwdXRBdmVyYWdlVmlkZW9CaXRyYXRlOyAvKio8IEF2ZXJhZ2UgdmlkZW8gYml0cmF0ZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGZpbGUsIGNvbXB1dGVkIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgYml0cmF0ZXMsIGR1cmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbnMgYW5kIGN1dHMgKi8KLQotfSBNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGVkaXQgVlNTIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIFZTUyBlZGl0IG9wZXJhdGlvbnMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKgotICAgICAqIFZTUyAzR1BQIG1haW4gdmFyaWFibGVzICovCi0gICAgTTRWU1MzR1BQX0VkaXRTdGF0ZSAgICAgICAgIFN0YXRlOyAgICAgICAgICAgICAgICAgICAgLyoqPCBWU1MgaW50ZXJuYWwgc3RhdGUgKi8KLSAgICBNNFZTUzNHUFBfRWRpdFZpZGVvU3RhdGUgICAgVnN0YXRlOwotICAgIE00VlNTM0dQUF9FZGl0QXVkaW9TdGF0ZSAgICBBc3RhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VyIFNldHRpbmdzIChjb3BpZWQsIHRodXMgb3duZWQgYnkgVlNTM0dQUCkgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIHVpQ2xpcE51bWJlcjsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnQgb2YgdGhlIGNsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCBwQ2xpcExpc3QuICovCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAgICAgICAgICAgKnBDbGlwTGlzdDsgICAgICAgICAgICAvKio8IExpc3Qgb2YgdGhlIGlucHV0IGNsaXBzIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheSBvZiB1aUNsaXBOdW1iZXIgY2xpcCBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgICAqcFRyYW5zaXRpb25MaXN0OyAgICAvKio8IExpc3Qgb2YgdGhlIHRyYW5zaXRpb24gc2V0dGluZ3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkgb2YgdWlDbGlwTnVtYmVyLTEgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAgICAgICAqcEVmZmVjdHNMaXN0OyAgICAgICAgLyoqPCBMaXN0IG9mIHRoZSBlZmZlY3RzIHNldHRpbmdzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5IG9mIG5iRWZmZWN0cyBSQyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAqcEFjdGl2ZUVmZmVjdHNMaXN0OyAgICAvKio8IExpc3Qgb2YgdGhlIGFjdGl2ZSBlZmZlY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuIEFycmF5IG9mIG5iRWZmZWN0cyBSQyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgbmJFZmZlY3RzOyAgICAgICAgICAgIC8qKjwgTnVtYmVycyBvZiBlZmZlY3RzIFJDICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICBuYkFjdGl2ZUVmZmVjdHM7ICAgIC8qKjwgTnVtYmVycyBvZiBhY3RpdmUgZWZmZWN0cyBSQyAqLwotCi0gICAgLyoqCi0gICAgICogSW5wdXQgU3R1ZmYgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXA7ICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBjdXJyZW50IGNsaXAgMSBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgY2xpcCBsaXN0ICovCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0KiAgICAgICAgICAgIHBDMTsgICAgICAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBjdXJyZW50IGNsaXAgMSAqLwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogICAgICAgICAgICBwQzI7ICAgICAgICAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgY3VycmVudCBjbGlwIDIgKi8KLQotICAgIC8qKgotICAgICAqIERlY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgZE91dHB1dEZyYW1lRHVyYXRpb247ICAgIC8qKjwgW01pbGxpc2Vjb25kc10gZGlyZWN0bHkgcmVsYXRlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZnJhbWUgcmF0ZSAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAgeXV2MVszXTsgICAgICAgICAgICAvKio8IEZpcnN0IHRlbXBvcmFyeSBZVVY0MjAgaW1hZ2UgcGxhbmUgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgIHl1djJbM107ICAgICAgICAgICAgLyoqPCBTZWNvbmQgdGVtcG9yYXJ5IFlVVjQyMCBpbWFnZSBwbGFuZSAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAgeXV2M1szXTsgICAgICAgICAgICAvKio8IFRoaXJkIHRlbXBvcmFyeSBZVVY0MjAgaW1hZ2UgcGxhbmUgUkMgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgIHl1djRbM107ICAgICAgICAgICAgLyoqPCBGb3VydGggdGVtcG9yYXJ5IFlVVjQyMCBpbWFnZSBwbGFuZSBSQyAqLwotCi0gICAgLyoqCi0gICAgICogRWZmZWN0IHN0dWZmICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYkNsaXAxQXRCZWdpbkN1dDsgICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gVGhlIGNsaXAxIGlzIGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzIGJlZ2luIGN1dCAqLwotICAgIE00T1NBX0ludDggICAgICAgICAgICAgICAgICAgIGlDbGlwMUFjdGl2ZUVmZmVjdDsgICAgICAgIC8qKjwgVGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIENsaXAxICg8MCBtZWFucyBub25lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlZCBmb3IgdmlkZW8gYW5kIGF1ZGlvIGJ1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHNpbXVsdGFuZW91c2x5KSAqLwotICAgIE00T1NBX0ludDggICAgICAgICAgICAgICAgICAgIGlDbGlwMkFjdGl2ZUVmZmVjdDsgICAgICAgIC8qKjwgVGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIENsaXAyICg8MCBtZWFucyBub25lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlZCBmb3IgdmlkZW8gYW5kIGF1ZGlvIGJ1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2ltdWx0YW5lb3VzbHkpICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYlRyYW5zaXRpb25FZmZlY3Q7ICAgICAgICAvKio8IFRydWUgaWYgdGhlIHRyYW5zaXRpb24gZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYXBwbGllZCBhdCB0aGUgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lICovCi0KLSAgICAvKioKLSAgICAgKiBFbmNvZGluZyBhbmQgV3JpdGluZyBvcGVyYXRpb25zICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICBiU3VwcG9ydFNpbGVuY2U7ICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHRoZSBvdXRwdXQgc3RyZWFtIGNhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgc2lsZW5jZSAoZXZlbiBpZiBub3QgZWRpdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBleGFtcGxlIEFBQyssIGJ1dCBub3QgRVZSQykgKi8KLSAgICBNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICAgIGV3YzsgICAgICAgICAgICAgICAgLyoqPCBBdWRpbyBhbmQgdmlkZW8gZW5jb2RlL3dyaXRlIHN0dWZmICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGJJc01NUzsgICAgICAgICAgICAgICAgLyoqPCBCb29sZWFuIHVzZWQgdG8ga25vdyBpZiB3ZSBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIGEgZmlsZSB3aXRoIGFuIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgY29uc3RyYWludCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlNTVNWaWRlb0JpdHJhdGU7ICAgIC8qKjwgSWYgaW4gTU1TIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGVkIHZpZGVvIGJpdHJhdGUgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZSAgICBNTVN2aWRlb0ZyYW1lcmF0ZTsgICAgLyoqPCBJZiBpbiBNTVMgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ZWQgdmlkZW8gZnJhbWVyYXRlICovCi0KLSAgICAvKioKLSAgICAgKiBGaWxlc3lzdGVtIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIHBPc2FGaWxlUmVhZFB0cjsgICAgIC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgcE9zYUZpbGVXcml0UHRyOyAgICAgLyoqPCBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZXMgb2YgdGhlIHVzZWQgbW9kdWxlcyAqLwotICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAgICAgICAgIFNoZWxsQVBJOyAgICAgICAgICAgLyoqPCBGaWxlc3lzdGVtIGFuZCBzaGVsbCByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIGJJc3NlY29uZENsaXA7Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICpwQWN0aXZlRWZmZWN0c0xpc3QxOyAgLyoqPCBMaXN0IG9mIHRoZSBhY3RpdmUgZWZmZWN0cyBzZXR0aW5ncy4gQXJyYXkgb2YgbmJFZmZlY3RzIFJDICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgIG5iQWN0aXZlRWZmZWN0czE7ICAvKio8IE51bWJlcnMgb2YgYWN0aXZlIGVmZmVjdHMgUkMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgbV9iQ2xpcEV4dGVybmFsSGFzU3RhcnRlZDsgIC8qKjwgRmxhZyB0byBpbmRpY2F0ZSB0aGF0IGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGVmZmVjdCBpcyBhY3RpdmUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgaUluT3V0VGltZU9mZnNldDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgYkVuY29kZVRpbGxFb0Y7Ci0gICAgTTR4VlNTX0VkaXRTZXR0aW5ncyAgICAgIHhWU1M7Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgIG1fYWlyX2NvbnRleHQ7Ci0KLSAgICBNNE9TQV9Cb29sIGJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3Q7IC8qKjwgT3ZlcmxheSBmbGFnIGZvciBjbGlwMSAqLwotICAgIE00T1NBX0Jvb2wgYkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdDsgLyoqPCBPdmVybGF5IGZsYWcgZm9yIGNsaXAyLCB1c2VkIGluIHRyYW5zaXRpb24gKi8KLX0gTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGF1ZGlvIG1peGluZyBWU1MgM0dQUCBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBWU1MgM0dQUCBhdWRpbyBtaXhpbmcgb3BlcmF0aW9ucyB0byBzdG9yZQotICogICAgICAgICAgICAgICAgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKgotICAgICAqICAgIFZTUyBtYWluIHZhcmlhYmxlcyAqLwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1N0YXRlIFN0YXRlOyAgICAgICAgICAgICAgICAgICAgLyoqPCBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIHN0YXRlICovCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBjb3B5IG9mIHRoZSBpbnB1dCBzZXR0aW5ncyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgIGlBZGRDdHM7ICAgICAgICAgICAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIFRpbWUsIGluIG1pbGxpc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB3aGljaCB0aGUgYWRkZWQgYXVkaW8gdHJhY2sgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aUJlZ2luTG9vcDsgICAgICAgICAgICAgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHRpbWUgb2YgdGhlIGxvb3AgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aUVuZExvb3A7ICAgICAgICAgICAgICAgIC8qKjwgRGVzY3JpYmVzIGluIG1pbGxpLXNlY29uZCB0aGUgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG9mIHRoZSBsb29wICgwIG1lYW5zIG5vIGxvb3ApICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgYlJlbW92ZU9yaWdpbmFsOyAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgdGhlIG9yaWdpbmFsIGF1ZGlvIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHRha2VuIGludG8gYWNjb3VudCAqLwotCi0gICAgLyoqCi0gICAgICogSW5wdXQgYXVkaW8vdmlkZW8gZmlsZSAqLwotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgICAgICAgIElucHV0Q2xpcFNldHRpbmdzOyAgICAgICAgLyoqPCBTdHJ1Y3R1cmUgaW50ZXJuYWxseSB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZSB0aGUgaW5wdXQgM0dQUCBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogICAgICAgIHBJbnB1dENsaXBDdHh0OyAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBpbnB1dCAzR1BQIGNsaXAgKi8KLQotICAgIC8qKgotICAgICAqIEFkZGVkIGF1ZGlvIGZpbGUgc3R1ZmYgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICAgICAgICBBZGRlZENsaXBTZXR0aW5nczsgICAgICAgIC8qKjwgU3RydWN0dXJlIGludGVybmFsbHkgdXNlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UgdGhlIGFkZGVkIHNldHRpbmdzICovCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0KiAgICAgICAgcEFkZGVkQ2xpcEN0eHQ7ICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGFkZGVkIDNHUFAgY2xpcCAqLwotCi0gICAgLyoqCi0gICAgICogQXVkaW8gc3R1ZmYgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgZk9yaWdGYWN0b3I7ICAgICAgICAgICAgLyoqPCBGYWN0b3IgdG8gYXBwbHkgdG8gdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhY2sgZm9yIHRoZSBtaXhpbmcgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgZkFkZGVkRmFjdG9yOyAgICAgICAgICAgIC8qKjwgRmFjdG9yIHRvIGFwcGx5IHRvIHRoZSBhZGRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFjayBmb3IgdGhlIG1peGluZyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiU3VwcG9ydFNpbGVuY2U7ICAgICAgICAvKio8IEZsYWcgdG8ga25vdyBpZiB0aGUgb3V0cHV0IHN0cmVhbSBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHNpbGVuY2UgKGV2ZW4gaWYgbm90IGVkaXRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSBBQUMrLCBidXQgbm90IEVWUkMpICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJIYXNBdWRpbzsgICAgICAgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZGVsZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFjayAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiQXVkaW9NaXhpbmdJc05lZWRlZDsgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZG8gbWl4aW5nICovCi0KLSAgICAvKioKLSAgICAgKiBFbmNvZGluZyBhbmQgV3JpdGluZyBvcGVyYXRpb25zICovCi0gICAgTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAgICBld2M7ICAgICAgICAgICAgICAgIC8qKjwgQXVkaW8gYW5kIHZpZGVvIGVuY29kZS93cml0ZSBzdHVmZiAqLwotCi0gICAgLyoqCi0gICAgICogRmlsZXN5c3RlbSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBwT3NhRmlsZVJlYWRQdHI7ICAgICAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgIHBPc2FGaWxlV3JpdFB0cjsgICAgIC8qKjwgT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZXMgb2YgdGhlIHVzZWQgbW9kdWxlcyAqLwotICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCBTaGVsbEFQSTsgICAgICAgICAgICAgICAvKio8IEZpbGVzeXN0ZW0gYW5kIHNoZWxsIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciBmdW5jdGlvbnMgKi8KLQotICAgIC8qKgotICAgICAqIFNhbXBsZSBSYXRlIENvbnZlcnRvciAoU1NSQykgc3R1ZmYgKG5lZWRlZCBpbiBjYXNlIG9mIG1peGluZyB3aXRoICE9IEFTRi9uYiBvZiBjaGFubmVscykgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYl9TU1JDbmVlZGVkOyAgICAgICAgLyoqPCBJZiB0cnVlLCBTU1JDIGlzIG5lZWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCE9IEFTRiBvciBuYiBvZiBjaGFubmVscykgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgQ2hhbm5lbENvbnZlcnNpb247ICAgIC8qKjwgMT1Db252ZXJzaW9uIGZyb20gTW9ubyB0byBTdGVyZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyPVN0ZXJlbyB0byBNb25vLCAwPW5vIGNvbnZlcnNpb24gKi8KLSAgICBTU1JDX0luc3RhbmNlX3QgICAgICAgICAgICAgU3NyY0luc3RhbmNlOyAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBTc3JjICovCi0gICAgU1NSQ19TY3JhdGNoX3QqICAgICAgICAgICAgIFNzcmNTY3JhdGNoOyAgICAgICAgLyoqPCBXb3JraW5nIG1lbW9yeSBvZiB0aGUgU3NyYyAqLwotICAgIHNob3J0ICAgICAgICAgICAgICAgICAgICAgICBpU3NyY05iU2FtcGxJbjsgICAgLyoqPCBOdW1iZXIgb2Ygc2FtcGxlIHRoZSBTc3JjIG5lZWRzIGFzIGlucHV0ICovCi0gICAgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgIGlTc3JjTmJTYW1wbE91dDsgICAgLyoqPCBOdW1iZXIgb2Ygc2FtcGxlIHRoZSBTc3JjIG91dHB1dHMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFNzcmNCdWZmZXJJbjsgICAgICAgIC8qKjwgSW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFNzcmNCdWZmZXJPdXQ7ICAgICAgICAvKio8IE91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICBwUG9zSW5Tc3JjQnVmZmVySW47ICAgIC8qKjwgUG9zaXRpb24gaW50byB0aGUgU1NSQyBpbiBidWZmZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFBvc0luU3NyY0J1ZmZlck91dDsvKio8IFBvc2l0aW9uIGludG8gdGhlIFNTUkMgb3V0IGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICBwVGVtcEJ1ZmZlcjsgICAgICAgIC8qKjwgVGVtcG9yYXJ5IGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICBwUG9zSW5UZW1wQnVmZmVyOyAgICAvKio8IFBvc2l0aW9uIGluIHRlbXBvcmFyeSBidWZmZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbWluaW11bUJ1ZmZlckluOyAgICAvKio8IE1pbmltdW0gYW1vdW50IG9mIGRlY29kZWQgZGF0YSB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIGJ5IFNTUkMgYW5kIGNoYW5uZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0b3IgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYl9EdWNraW5nTmVlZGVlZDsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgSW5EdWNraW5nX3RocmVzaG9sZDsgIC8qKjwgVGhyZXNob2xkIHZhbHVlIGF0IHdoaWNoIGJhY2tncm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWMgc2hhbGwgZHVjayAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICBJbkR1Y2tpbmdfbG93Vm9sdW1lOyAgLyoqPCBsb3dlciB0aGUgYmFja2dyb3VuZCB0cmFjayB0byB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yIGFuZCBpbmNyZWFzZSB0aGUgcHJpbWFyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIHRvIGludmVyc2Ugb2YgdGhpcyBmYWN0b3IgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgbG93Vm9sdW1lOwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBhdWRpb1ZvbHVtZUFycmF5W1dJTkRPV19TSVpFXTsgLy8gc3RvcmUgcGVhayBhdWRpbyB2b2wuIGxldmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZHVyYXRpb24gZm9yIFdJTkRPV19TSVpFCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIGF1ZFZvbEFyckluZGV4OwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICBkdWNraW5nRmFjdG9yIDsgICAgIC8qKjwgbXVsdGlwbHkgYnkgdGhpcyBmYWN0b3IgdG8gYnJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQURFIElOL0ZBREUgT1VUIGVmZmVjdCAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICBmQlRWb2xMZXZlbDsKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgZlBUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJEb0R1Y2tpbmc7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJMb29wOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiTm9Mb29waW5nOwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgIHBMVkF1ZGlvUmVzYW1wbGVyOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBianVtcGZsYWc7Ci0KLX0gTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9JbnRlcm5hbEV4dHJhY3RQaWN0dXJlQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBleHRyYWN0IHBpY3R1cmUgVlNTIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIFZTUyBwaWN0dXJlIGV4dHJhY3Rpb25zIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiAgICBWU1MgbWFpbiB2YXJpYWJsZXMgKi8KLSAgICBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTdGF0ZSBTdGF0ZTsgICAgICAgICAgICAgICAgLyoqPCBWU1MgZXh0cmFjdCBwaWN0dXJlaW50ZXJuYWwgc3RhdGUgKi8KLQotICAgIC8qKgotICAgICAqIElucHV0IGZpbGVzICovCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAgICAgICAgQ2xpcFNldHRpbmdzOyAgICAgICAgICAgIC8qKjwgU3RydWN0dXJlIGludGVybmFsbHkgdXNlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZSB0aGUgaW5wdXQgM0ZQUCBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogICAgICAgIHBJbnB1dENsaXBDdHh0OyAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBpbnB1dCAzR1BQIGNsaXAgKi8KLQotICAgIC8qKgotICAgICAqIFNldHRpbmdzICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlFeHRyYWN0Q3RzOyAgICAgICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gQ3RzIG9mIHRoZSBBVQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGV4dHJhY3RlZCAqLwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gc3R1ZmYgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgIGRlY1BsYW5lc1szXTsgICAgICAgICAgICAvKio8IERlY29kZWQgWVVWNDIwIHBpY3R1cmUgcGxhbmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlWaWRlb1dpZHRoOyAgICAgICAgICAgIC8qKjwgRGVjb2RlZCBpbWFnZSB3aWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvSGVpZ2h0OyAgICAgICAgICAgIC8qKjwgRGVjb2RlZCBpbWFnZSBoZWlnaHQgKi8KLQotICAgIC8qCi0gICAgICogRGVjb2RlciBpbmZvICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgaURlY0N0czsgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIERlY29kZWQgQVUgQ3RzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgYkp1bXBGbGFnOyAgICAgLyoqPCAxIGlmIGEganVtcCBoYXMgYmVlbiBtYWRlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgaURlbHRhVGltZTsgICAvKio8IFtNaWxsaXNlY29uZHNdIFRpbWUgYmV0d2VlbiBwcmV2aW91cyBSQVAgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgdG8gZXh0cmFjdCAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgIGlHYXA7ICAgICAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBUaW1lIGJldHdlZW4ganVtcCBBVSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0aW9uIHRpbWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aVN0ZXA7ICAgICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gUHJvZ3Jlc3MgYmFyIHRpbWUgaW5jcmVtZW50ICovCi0KLSAgICAvKioKLSAgICAgKiBGaWxlc3lzdGVtIGZ1bmN0aW9ucyAqLwotICAgICAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucywgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIHBPc2FGaWxlUmVhZFB0cjsKLSAgICAvKio8IE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMsIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgcE9zYUZpbGVXcml0UHRyOwotCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYkNsaXBPcGVuZWQ7Ci19IE00VlNTM0dQUF9JbnRlcm5hbEV4dHJhY3RQaWN0dXJlQ29udGV4dDsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfSU5URVJOQUxUWVBFU19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWNlMTAyZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000WFZTU19BUElfSF9fCi0jZGVmaW5lIF9fTTRYVlNTX0FQSV9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNHhWU1NfQVBJLmgKLSAqIEBicmllZiAgICBBUEkgb2YgVmlkZW8gU3R1ZGlvIDIuMQotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9FeHRlbmRlZF9BUEkuaCIKLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0vKiBFcnJvcnMgY29kZXMgKi8KLQotLyoqCi0gKiBFbmQgb2YgYW5hbHl6aW5nID0+IHRoZSB1c2VyIGNhbiBjYWxsIE00eFZTU19QcmV2aWV3U3RhcnQgb3IgTTR4VlNTX1NhdmVTdGFydCAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDEpCi0KLS8qKgotICogRW5kIG9mIHByZXZpZXcgZ2VuZXJhdGluZyA9PiB0aGUgdXNlciBjYW4gbGF1bmNoIHZwcyB0byBzZWUgcHJldmlldy4gT25jZSBwcmV2aWV3IGlzIG92ZXIsCi0gICB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1ByZXZpZXdTdG9wKCkgdG8gYmUgYWJsZSB0byBzYXZlIGVkaXRlZCBmaWxlLCBvciB0byBjYWxsIGFub3RoZXIKLSAgIE00eFZTU19TZW5kQ29tbWFuZCgpICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfUFJFVklFV19SRUFEWSAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlMsIDB4MDAwMikKLQotLyoqCi0gKiBFbmQgb2Ygc2F2ZWQgZmlsZSBnZW5lcmF0aW9uID0+IHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU2F2ZVN0b3AoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDMpCi0KLS8qKgotICogVHJhbnNjb2RpbmcgaXMgbmVjZXNzYXJ5IHRvIGdvIGZ1cnRoZXIgLT4gaWYgdGhlIHVzZXIgZG9lcyBub3Qgd2FudCB0byBjb250aW51ZSwKLSAgaGUgbXVzdCBjYWxsIE00eFZTU19zZW5kQ29tbWFuZCgpICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfVFJBTlNDT0RJTkdfTkVDRVNTQVJZICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlMsIDB4MDAwNCkKLQotLyoqCi0gKiBJbiBjYXNlIG9mIE1NUywgdGhlIG91dHB1dCBmaWxlIHNpemUgd29uJ3QgYmUgcmVhY2hlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRCAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDUpCi0KLS8qKgotICogSlBHIGlucHV0IGZpbGUgZGltZW5zaW9ucyBhcmUgdG9vIGhpZ2ggKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9KUEdfVE9PX0JJRyAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWUywgMHgwMDAxKQotCi0vKioKLSAqIFVURiBDb252ZXJzaW9uLCB3YXJuaW5nIG9uIHRoZSBzaXplIG9mIHRoZSB0ZW1wb3JhcnkgY29udmVydGVkIGJ1ZmZlciovCi0jZGVmaW5lIE00eFZTU1dBUl9CVUZGRVJfT1VUX1RPT19TTUFMTCAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlMsIDB4MDAwNikKLQotLyoqCi0gKiBTV0lLQVIgOkVycm9yIHdoYW4gTk9fTU9SRV9TUEFDRSovCi0jZGVmaW5lIE00eFZTU0VSUl9OT19NT1JFX1NQQUNFICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlMsIDB4MDAwNykKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNHhWU1NfVmlkZW9FZmZlY3RUeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0eXBlcyBvZiB0aGUgeFZTUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGUgPSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCsxLCAvKiAyNTcgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjU4ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI1OSAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1NlcGlhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNjAgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjYxICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2MiAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1RleHQsIC8qIFRleHQgb3ZlcmxheSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNjMgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tSW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjY0ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbU91dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2NSAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoyNjYgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMjY3ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjI2OCovCi19IE00eFZTU19WaWRlb0VmZmVjdFR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTR4VlNTX1ZpZGVvVHJhbnNpdGlvblR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgdmlkZW8gZWZmZWN0IHRoYXQgY2FuIGJlIGFwcGxpZWQgZHVyaW5nIGEgdHJhbnNpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwgPSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwsIC8qMjU2Ki8KLSAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYywKLSAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfU2xpZGVUcmFuc2l0aW9uLAotICAgIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9GYWRlQmxhY2sKLQotfSBNNHhWU1NfVmlkZW9UcmFuc2l0aW9uVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX1ByZXZpZXdTZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGdhdGhlcnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIFZQUyBmb3IgcHJldmlldwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnAzZ3BQcmV2aWV3RmlsZTsKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFBDTUZpbGU7Ci0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAgICBvdXRQQ01fQVNGOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdWRpb01vbm87Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICAgICAgICAgICAgICAgICAgICpFZmZlY3RzOwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYkVmZmVjdHM7Ci0KLX0gTTR4VlNTX1ByZXZpZXdTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX3RvVVRGOEZjdAotICogQGJyaWVmICAgICAgICBUaGlzIHByb3RvdHlwZSBkZWZpbmVzIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRlZCBieSB0aGUgaW50ZWdyYXRvcgotICogICAgICAgICAgICAgICAgdG8gY29udmVydCBhIHN0cmluZyBlbmNvZGVkIGluIGFueSBmb3JtYXQgdG8gYW4gVVRGOCBzdHJpbmcuCi0gKiBAbm90ZQotICoKLSAqIEBwYXJhbSAgICBwQnVmZmVySW4gICAgICAgIElOICAgICAgICAgICAgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHN0cmluZyB0byBjb252ZXJ0IHRvIFVURjgKLSAqIEBwYXJhbSAgICBwQnVmZmVyT3V0ICAgICAgICBJTiAgICAgICAgICAgIEJ1ZmZlciBjb250YWluaW5nIHRoZSBVVEY4IGNvbnZlcnRlZCBzdHJpbmcKLSAqIEBwYXJhbSAgICBidWZmZXJPdXRTaXplICAgIElOL09VVCAgICBJTjogICAgIFNpemUgb2YgdGhlIGdpdmVuIG91dHB1dCBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBTaXplIG9mIHRoZSBjb252ZXJ0ZWQgYnVmZmVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTR4VlNTX3RvVVRGOEZjdCkKLSgKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgKnBCdWZmZXJJbiwKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICpwQnVmZmVyT3V0LAotICAgIE00T1NBX1VJbnQzMiAgICAgICAgKmJ1ZmZlck91dFNpemUKLSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX2Zyb21VVEY4RmN0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgcHJvdG90eXBlIGRlZmluZXMgdGhlIGZ1bmN0aW9uIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgICB0byBjb252ZXJ0IGFuIFVURjggc3RyaW5nIHRvIGEgc3RyaW5nIGVuY29kZWQgaW4gYW55IGZvcm1hdC4KLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgIHBCdWZmZXJJbiAgICAgICAgSU4gICAgICAgICAgICBCdWZmZXIgY29udGFpbmluZyB0aGUgVVRGOCBzdHJpbmcgdG8gY29udmVydAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGRlc2lyZWQgZm9ybWF0LgotICogQHBhcmFtICAgIHBCdWZmZXJPdXQgICAgICAgIElOICAgICAgICAgICAgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvbnZlcnRlZCBzdHJpbmcKLSAqIEBwYXJhbSAgICBidWZmZXJPdXRTaXplICAgIElOL09VVCAgICBJTjogICAgIFNpemUgb2YgdGhlIGdpdmVuIG91dHB1dCBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBTaXplIG9mIHRoZSBjb252ZXJ0ZWQgYnVmZmVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTR4VlNTX2Zyb21VVEY4RmN0KQotKAotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgKnBCdWZmZXJJbiwKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgKnBCdWZmZXJPdXQsCi0gICAgTTRPU0FfVUludDMyICAgICAgICAqYnVmZmVyT3V0U2l6ZQotKTsKLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0luaXRQYXJhbXMKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHBhcmFtZXRlcnMgZm9yIHhWU1MuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgICAgIHBGaWxlUmVhZFB0cjsKLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICAgIHBGaWxlV3JpdGVQdHI7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFBhdGg7Ci0gICAgLypGdW5jdGlvbiBwb2ludGVyIG9uIGFuIGV4dGVybmFsIHRleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwotICAgIE00eFZTU190b1VURjhGY3QgICAgICAgICAgICAgICAgcENvbnZUb1VURjhGY3Q7Ci0gICAgLypGdW5jdGlvbiBwb2ludGVyIG9uIGFuIGV4dGVybmFsIHRleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwotICAgIE00eFZTU19mcm9tVVRGOEZjdCAgICAgICAgICAgICAgICBwQ29udkZyb21VVEY4RmN0OwotCi0KLQotfSBNNHhWU1NfSW5pdFBhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0luaXQKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgeFZTUwotICogQG5vdGUgICAgICAgIEluaXRpYWxpemVzIHRoZSB4VlNTIGVkaXQgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcGFyYW1zICAgICAgICAgICAgICAgIChJTikgUGFyYW1ldGVycyBtYW5kYXRvcnkgZm9yIHhWU1MKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0luaXQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00eFZTU19Jbml0UGFyYW1zKiBwYXJhbXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfUmVkdWNlVHJhbnNjb2RlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgZ2l2ZW4gZWRpdGluZyBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8KLSAqICAgICAgICAgICAgICAgIG1pbmltaXplIHRoZSB0cmFuc2NvZGluZyB0aW1lLgotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGFuYWx5c2VzIHRoaXMgc3RydWN0dXJlLCBhbmQgaWYgbmVlZGVkLCBjaGFuZ2VzIHRoZQotICogICAgICAgICAgICAgICAgb3V0cHV0IHBhcmFtZXRlcnMgKFZpZGVvIGNvZGVjLCB2aWRlbyBzaXplLCBhdWRpbyBjb2RlYywKLSAqICAgICAgICAgICAgICAgIGF1ZGlvIG5iIG9mIGNoYW5uZWxzKSB0byBtaW5pbWl6ZSB0aGUgdHJhbnNjb2RpbmcgdGltZS4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgICAgIChJTikgRWRpdGlvbiBzZXR0aW5ncyAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogcFNldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1NlbmRDb21tYW5kCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgdG8gdGhlIHhWU1MgYW4gZWRpdGluZyBzdHJ1Y3R1cmUKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBhbmFseXNlcyB0aGlzIHN0cnVjdHVyZSwgYW5kIHByZXBhcmUgZWRpdGlvbgotICogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBNNHhWU1NfSW5pdCwgYWZ0ZXIKLSAqICAgICAgICAgICAgICAgIE00eFZTU19DbG9zZUNvbW1hbmQsIG9yIGFmdGVyIE00eFZTU19QcmV2aWV3U3RvcC4KLSAqICAgICAgICAgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU3RlcCB1bnRpbAotICogICAgICAgICAgICAgICAgaXQgcmV0dXJucyBhbm90aGVyIGVycm9yIHRoYW4gTTROT19FUlJPUi4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAgICAgKElOKSBFZGl0aW9uIHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX1NlbmRDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19QcmV2aWV3U3RhcnQKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlIHRoZSBwcmV2aWV3Ci0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgY3JlYXRlIDNHUCBwcmV2aWV3IGZpbGUgYW5kIGZpbGwgcFByZXZpZXdTZXR0aW5ncyB3aXRoCi0gKiAgICAgICAgICAgICAgICBwcmV2aWV3IHBhcmFtZXRlcnMuCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FCi0gKiAgICAgICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgdW50aWwKLSAqICAgICAgICAgICAgICAgIGl0IHJldHVybnMgYW5vdGhlciBlcnJvciB0aGFuIE00Tk9fRVJST1IuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQcmV2aWV3U2V0dGluZ3MgICAgKElOKSBQcmV2aWV3IHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX1ByZXZpZXdTdGFydChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNHhWU1NfUHJldmlld1NldHRpbmdzKiBwUHJldmlld1NldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1ByZXZpZXdTdG9wCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gdW5hbGxvY2F0ZSBwcmV2aWV3IHJlc3NvdXJjZXMgYW5kIGNoYW5nZSB4VlNTCi0gKiAgICAgICAgICAgICAgICBpbnRlcm5hbCBzdGF0ZSB0byBhbGxvdyBzYXZpbmcgb3IgcmVzZW5kIGFuIGVkaXRpbmcgY29tbWFuZAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBNNHhWU1NfU3RlcCBoYXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XQVJfUFJFVklFV19SRUFEWQotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19QcmV2aWV3U3RvcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1NhdmVTdGFydAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmUgdGhlIHNhdmUKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBjcmVhdGUgM0dQIGVkaXRlZCBmaW5hbCBmaWxlCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FCi0gKiAgICAgICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgdW50aWwKLSAqICAgICAgICAgICAgICAgIGl0IHJldHVybnMgYW5vdGhlciBlcnJvciB0aGFuIE00Tk9fRVJST1IuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBGaWxlUGF0aCAgICAgICAgICAgIChJTikgSWYgdGhlIHVzZXIgd2FudHMgdG8gcHJvdmlkZSBhIGRpZmZlcmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBmaWxlbmFtZSwgZWxzZSBjYW4gYmUgTlVMTCAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19TYXZlU3RhcnQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfU2F2ZVN0b3AKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiB1bmFsbG9jYXRlIHNhdmUgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBNNHhWU1NfU3RlcCBoYXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkUKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0b3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19TdGVwCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgZGlmZmVyZW50cyB0YXNrcywgZGVwZW5kaW5nIG9mIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb246Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBhbmFseXNlcyBlZGl0aW5nIHN0cnVjdHVyZSBpZiBjYWxsZWQgYWZ0ZXIgTTR4VlNTX1NlbmRDb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgcHJldmlldyBmaWxlIGlmIGNhbGxlZCBhZnRlciBNNHhWU1NfUHJldmlld1N0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgZmluYWwgZWRpdGVkIGZpbGUgaWYgY2FsbGVkIGFmdGVyIE00eFZTU19TYXZlU3RhcnQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uIGZyb20gMCB0byAxMDAKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvciwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIGFnYWluCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9QUkVWSUVXX1JFQURZOiAgICBQcmV2aWV3IGZpbGUgaXMgZ2VuZXJhdGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkU6ICAgICAgICBGaW5hbCBlZGl0ZWQgZmlsZSBpcyBnZW5lcmF0ZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTogICAgQW5hbHlzZSBpcyBkb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19TdGVwKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfQ2xvc2VDb21tYW5kCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBjdXJyZW50IGVkaXRpbmcgcHJvZmlsZSwgdW5hbGxvY2F0ZQotICogICAgICAgICAgICAgICAgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgY2FuIGNhbGwgYSBuZXcgTTR4VlNTX1NlbmRDb21tYW5kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0Nsb3NlQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0NsZWFuVXAKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBkZWxldGVzIGFsbCB4VlNTIHJlc3NvdXJjZXMKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIE00eFZTU19DbG9zZUNvbW1hbmQuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXQgdGhlIHZlcnNpb24gb2YgdGhlIFZpZGVvIFN0dWRpbyAyLjEKLSAqCi0gKiBAcGFyYW0gICAgcFZlcnNpb24gICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHZlcnNpb24gaW5mbyBzdHJ1Y3QKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgY29sb3IgZWZmZWN0IG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlICAgIFRoZSBwcm90b3R5cGUgb2YgdGhpcyBlZmZlY3QgZnVuY3Rpb24gaXMgZXhwb3NlZCBiZWNhdXNlIGl0IG5lZWRzIHRvCi0gKiAgICAgICAgICAgIGNhbGxlZCBieSB0aGUgVlBTIGR1cmluZyB0aGUgcHJldmlldwotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3IKLSgKLSAgICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBPdXRwdXRQbGFuZXMsCi0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kCi0pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWRkIGEgZml4ZWQgb3IgYW5pbWF0ZWQgaW1hZ2Ugb24gYW4gaW5wdXQgWVVWNDIwIHBsYW5hciBmcmFtZQotICogQG5vdGUgICAgVGhlIHByb3RvdHlwZSBvZiB0aGlzIGVmZmVjdCBmdW5jdGlvbiBpcyBleHBvc2VkIGJlY2F1c2UgaXQgbmVlZHMgdG8KLSAqICAgICAgICAgICAgY2FsbGVkIGJ5IHRoZSBWUFMgZHVyaW5nIHRoZSBwcmV2aWV3Ci0gKiBAcGFyYW0gICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgICBQbGFuZUluICAgICAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZAotKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIG1ha2UgYSB2aWRlbyBsb29rIGFzIGlmIGl0IHdhcyB0YWtlbiBpbiB0aGUgZmlmdGllcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwVXNlckRhdGEgICAgICAgKElOKSBDb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBGaWZ0aWVzRGF0YSwgcFBsYW5lT3V0IG9yIHBQcm9ncmVzcyBhcmUgTlVMTCAoREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzCi0oCi0gICAgTTRPU0FfVm9pZCAqcFVzZXJEYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQKLSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3Rab29tKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFkZCBhIGZpeGVkIG9yIGFuaW1hdGVkIGltYWdlIG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlICAgIFRoZSBwcm90b3R5cGUgb2YgdGhpcyBlZmZlY3QgZnVuY3Rpb24gaXMgZXhwb3NlZCBiZWNhdXNlIGl0IG5lZWRzIHRvCi0gKiAgICAgICAgICAgIGNhbGxlZCBieSB0aGUgVlBTIGR1cmluZyB0aGUgcHJldmlldwotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIHpvb20gdG8gYXBwbHkgKEluL091dCkKLSAqIEBwYXJhbSAgICBQbGFuZUluICAgICAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3Rab29tCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZAotKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgQWxsb3dzIGZpbGxpbmcgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgdmFsdWVzCi0gKgotICogQG5vdGUgICAgV0FSTklORzogcENsaXBTZXR0aW5ncy0+RWZmZWN0c1sgXSB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGlzIGZ1bmN0aW9uLgotICogICAgICAgICAgICAgICAgICAgcENsaXBTZXR0aW5ncy0+cEZpbGUgICAgICB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgcEZpbGUgICAgICAgICAgICAgICAoSU4pIENsaXAgZmlsZSBuYW1lCi0gKiBAcGFyYW0gICBmaWxlUGF0aFNpemUgICAgICAgIChJTikgU2l6ZSBvZiB0aGUgY2xpcCBwYXRoIChuZWVkZWQgZm9yIHRoZSBVVEYxNiBjb252ZXJzaW9uKQotICogQHBhcmFtICAgIG5iRWZmZWN0cyAgICAgICAgICAgKElOKSBOYiBvZiBlZmZlY3Qgc2V0dGluZ3MgdG8gYWxsb2NhdGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLCBNNE9TQV9Wb2lkKiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUsIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIER1cGxpY2F0ZXMgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSwgcGVyZm9ybWluZyBhbGxvY2F0aW9ucyBpZiByZXF1aXJlZAotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzRGVzdCAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NPcmlnICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBiQ29weUVmZmVjdHMgICAgICAgIChJTikgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZHVwbGljYXRlIGVmZmVjdHMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzRGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc09yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkNvcHlFZmZlY3RzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX0ZyZWVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEZyZWUgdGhlIHBvaW50ZXJzIGFsbG9jYXRlZCBpbiB0aGUgQ2xpcFNldHRpbmcgc3RydWN0dXJlIChwRmlsZSwgRWZmZWN0cykuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19GcmVlQ2xpcFNldHRpbmdzKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2dldE1DU0NvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ29udGV4dCogbWNzQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBNQ1MgY29udGV4dCB3aXRoaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBWU1Mgc3RhdGUgaGFzIG1vdmVkIHRvIGFuYWx5emluZyBzdGF0ZQotICogICAgICAgICAgICAgICAgb3IgYmV5b25kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIG1jc0NvbnRleHQgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gcG9pbnRlciBvZiBtY3MgY29udGV4dCB0byByZXR1cm4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX2dldE1DU0NvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ29udGV4dCogbWNzQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0KiBtY3NDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFZTUzNHUFAgY29udGV4dCB3aXRoaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBWU1Mgc3RhdGUgaGFzIG1vdmVkIHRvIEdlbmVyYXRpbmcKLSAqICAgICAgICAgICAgICAgIHByZXZpZXcgb3IgYmV5b25kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHZzczNncHBDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgdnNzM2dwcCBjb250ZXh0IHRvIHJldHVybgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ29udGV4dCogdnNzM2dwcENvbnRleHQpOwotCi0vLyBHZXQgc3VwcG9ydGVkIHZpZGVvIGRlY29kZXJzIGFuZCBjYXBhYmlsaXRpZXMuCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZpZGVvRGVjb2RlckNhcGFiaWxpdGllcyhNNERFQ09ERVJfVmlkZW9EZWNvZGVycyAqKmRlY29kZXJzKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0jZW5kaWYgLyogX19NNFhWU1NfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19JbnRlcm5hbC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTI5NjU3Mi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19JbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRYVlNTX0lOVEVSTkFMX0hfXwotI2RlZmluZSBfX000WFZTU19JTlRFUk5BTF9IX18KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNHhWU1NfSW50ZXJuYWwuaAotICogQGJyaWVmICAgIEludGVybmFsIG9mIFZpZGVvIEF1dGhvcmluZy4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRNQ1NfQVBJLmgiCi0jaW5jbHVkZSAiTTRNQ1NfRXJyb3JDb2Rlcy5oIgotCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00UFRPM0dQUF9FcnJvckNvZGVzLmgiCi0KLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIE00X3hWU1NfTUFKT1IgICAgICAgIDEKLSNkZWZpbmUgTTRfeFZTU19NSU5PUiAgICAgICAgNQotI2RlZmluZSBNNF94VlNTX1JFVklTSU9OICAgIDUKLQotLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGRlc2NyaWJlIHRoZSBtYXggZGltZW5zaW9ucyBvZiBhbiBpbnB1dCBKUEcgKi8KLSNkZWZpbmUgTTRYVlNTX01YX0pQR19OQl9PRl9QSVhFTFMgICAgMzkyNjAxNgotCi0vKlNpemUgb2YgdGhlIFVURiB0ZW1wb3JhcnkgY29udmVyc2lvbiBidWZmZXIga2VlcCBpbiB0aGUgVkEgaW50ZXJuYWwgY29udGV4dCBhbmQKLWFsbG9jYXRlIGF0IHRoZSBpbml0aWFsaXphdGlvbiovCi0jZGVmaW5lIFVURl9DT05WRVJTSU9OX0JVRkZFUl9TSVpFICAgICAgICAgICAgMjA0OAotCi0vKiBNYXggcGF0aCBsZW5ndGggc2l6ZSAqLwotI2RlZmluZSAgTTRYVlNTX01BWF9QQVRIX0xFTiAyNTYKLQotLyoqIERldGVybWluZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhLiAqLwotI2RlZmluZSBNNHhWU1NfQUJTKGEpICAgICAgICAgICAgICAgKCAoIChhKSA8ICgwKSApID8gKC0oYSkpIDogKGEpICkKLQotLyoqIFksVSxWIHZhbHVlcyBpbiBjYXNlIG9mIGJsYWNrIGJvcmRlcnMgcmVuZGVyaW5nICovCi0jZGVmaW5lIFlfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4MDAKLSNkZWZpbmUgVV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHg4MAotI2RlZmluZSBWX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19FZmZlY3RzQWxwaGFCbGVuZGluZwotICogQGJyaWVmICAgIEludGVybmFsIGVmZmVjdHMgYWxwaGEgYmxlbmRpbmcgcGFyYW1ldGVycwotICogQG5vdGUgICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIGludGVybmFsIGluZm9ybWF0aW9ucyB0byBjcmVhdGUgYW4gYWxwaGEKLSAqICAgICAgICAgICAgYmxlbmRpbmcgZm9yIHRoZSBlZmZlY3RzIHRleHQgYW5kIGZyYW1pbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICBtX2ZhZGVJblRpbWU7ICAgICAgICAvKlN0YXJ0IHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICBtX2ZhZGVPdXRUaW1lOyAgICAgICAgLypNaWRkbGUgcGVyY2VudGFnZSBvZiBBbHBoYSBibGVuZGluZyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgIG1fZW5kOyAgICAgICAgICAgIC8qRW5kIHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICBtX21pZGRsZTsgICAgLypEdXJhdGlvbiwgaW4gcGVyY2VudGFnZSBvZiBlZmZlY3QgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIEZhZGVJbiBwaGFzZSovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgIG1fc3RhcnQ7ICAgIC8qRHVyYXRpb24sIGluIHBlcmNlbnRhZ2Ugb2YgZWZmZWN0IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIEZhZGVPdXQgcGhhc2UqLwotCi19IE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRISVMgU1RSVUNUVVJFIE1VU1QgTk9UIEJFIE1PRElGSUVECi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAqIEBicmllZiAgICBJdCBpcyB1c2VkIGludGVybmFsbHkgYnkgeFZTUyBmb3IgZnJhbWluZyBlZmZlY3QsIGFuZCBieSBWUFMgZm9yIHByZXZpZXdpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00VklGSV9JbWFnZVBsYW5lICpGcmFtaW5nUmdiOyAgICAgICAgICAgICAgICAvKio8IGRlY29kZWQgQkdSNTY1IHBsYW5lICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKkZyYW1pbmdZdXY7ICAgICAgICAgICAgICAgIC8qKjwgY29udmVydGVkIFlVVjQyMCBwbGFuYXIgcGxhbmUgKi8KLSAgICBNNE9TQV9JbnQzMiBkdXJhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHRoZSBmcmFtZSAqLwotICAgIE00T1NBX0ludDMyIHByZXZpb3VzQ2xpcFRpbWU7ICAgICAgICAgICAgICAgIC8qKjwgUHJldmlvdXMgY2xpcCB0aW1lLCB1c2VkIGJ5IGZyYW1pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIGZvciBTQVZJTkcgKi8KLSAgICBNNE9TQV9JbnQzMiBwcmV2aWV3T2Zmc2V0Q2xpcFRpbWU7ICAgICAgICAgICAgLyoqPCBQcmV2aW91cyBjbGlwIHRpbWUsIHVzZWQgYnkgZnJhbWluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgZm9yIFBSRVZJRVcgKi8KLSAgICBNNE9TQV9JbnQzMiBwcmV2aWV3Q2xpcFRpbWU7ICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBjbGlwIHRpbWUsIHVzZWQgYnkgZnJhbWluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgZm9yIFBSRVZJRVcgKi8KLSAgICBNNE9TQV9Wb2lkKiBwQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEN1cnJlbnQgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgdXNlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZyBmaWx0ZXIgKi8KLSAgICBNNE9TQV9Wb2lkKiBwTmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOZXh0IE00eFZTU19GcmFtaW5nU3RydWN0LCBpZiBubyBtb3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgb24gY3VycmVudCBNNHhWU1NfRnJhbWluZ1N0cnVjdCAqLwotICAgIE00T1NBX1VJbnQzMiB0b3BsZWZ0X3g7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdG9wLWxlZnQgWCBjb29yZGluYXRlIGluIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgb2YgdGhlIGZpcnN0IGRlY29kZWQgcGl4ZWwgKi8KLSAgICBNNE9TQV9VSW50MzIgdG9wbGVmdF95OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFkgY29vcmRpbmF0ZSBpbiB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIG9mIHRoZSBmaXJzdCBkZWNvZGVkIHBpeGVsICovCi0gICAgTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqIGFscGhhQmxlbmRpbmdTdHJ1Y3Q7IC8qIEFscGhhIGJsZW5kaW5nIFN0cnVjdCAqLwotLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGluIGNhc2Ugb2YgZmlsZSBBUkdCODg4IHVzZWQgaW4gZnJhbWluZwotIGFzIHZpZGVvIGVmZmVjdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB3aWR0aDsgICAvKndpZHRoIG9mIHRoZSBBUkdCODg4OCBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlVzZWQgb25seSBpZiB2aWRlbyBlZmZlY3QgaXMgZnJhbW1pbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgaGVpZ2h0OyAvKmhlaWdodCBvZiB0aGUgQVJHQjg4ODggY2xpcCAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCBvbmx5IGlmIHZpZGVvIGVmZmVjdCBpcyBmcmFtbWluZyAqLwotCi19IE00eFZTU19GcmFtaW5nU3RydWN0OwotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVEhJUyBTVFJVQ1RVUkUgTVVTVCBOT1QgQkUgTU9ESUZJRUQKLSAqIHN0cnVjdCAgICBNNHhWU1NfRnJhbWluZ0NvbnRleHQKLSAqIEBicmllZiAgICBJdCBpcyB1c2VkIGludGVybmFsbHkgYnkgeFZTUyBmb3IgZnJhbWluZyBlZmZlY3QsIHdoZW4gdGhlIGZsYWcKLSAgICAgICAgICAgICAgICBERUNPREVfR0lGX09OX1NBVklORyBpcyBhY3RpdmF0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiAgICAgICAgICAgIGFGcmFtaW5nQ3R4OyAgICAgICAgLyoqPEZyYW1pbmcgc3RydWN0IGZvciB0aGUgZGVjb2RpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjdXJyZW50IGZyYW1lIG9mIHRoZSBnaWYqLwotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiAgICAgICAgICAgIGFGcmFtaW5nQ3R4X2xhc3Q7ICAgIC8qKjxGcmFtaW5nIHN0cnVjdCBmb3IgdGhlIGRlY29kaW5nIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByZXZpb3VzIGZyYW1lIG9mIHRoZSBnaWYqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgICAgICBwRmlsZVJlYWRQdHI7ICAgIC8qKjwgUG9pbnRlciBvbiBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICAgIHBGaWxlV3JpdGVQdHI7ICAgICAvKio8IFBvaW50ZXIgb24gT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFNQU0NvbnRleHQ7ICAgICAgICAvKio8U1BTIGNvbnRleHQgZm9yIHRoZSBHSUYgZGVjb2RpbmcqLwotICAgIC8vTTRTUFNfU3RyZWFtICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbTsgICAgICAgIC8qKjxHSUYgaW5wdXQgc3RyZWFtIGJ1ZmZlciBwb2ludGVyKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBFZmZlY3RGaWxlUGF0aDsgICAgLyoqPGZpbGUgcGF0aCBvZiB0aGUgZ2lmKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSAgICBvdXRwdXRWaWRlb1NpemU7ICAgIC8qKjwgT3V0cHV0IHZpZGVvIHNpemUgUkMgKi8KLSAgICAvL000U1BTX0Rpc3Bvc2FsTW9kZSAgICAgICAgICAgICAgICBkaXNwb3NhbDsgICAgICAgICAgICAvKio8cHJldmlvdXMgZnJhbWUgR0lGIGRpc3Bvc2FsKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIGJfYW5pbWF0ZWQ7ICAgICAgICAgICAgLyoqPElzIHRoZSBHSUYgYW5pbWF0ZWQ/Ki8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgYkVmZmVjdFJlc2l6ZTsgICAgICAgIC8qKjxJcyB0aGUgZ2lmIHJlc2l6ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB0b3BsZWZ0X3g7ICAgICAgICAgICAgLyoqPCBUaGUgdG9wLWxlZnQgWCBjb29yZGluYXRlIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcGljdHVyZSBvZiB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCBwaXhlbCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdG9wbGVmdF95OyAgICAgICAgICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFkgY29vcmRpbmF0ZSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBpY3R1cmUgb2YgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgcGl4ZWwgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHdpZHRoOyAgICAgICAgICAgICAgICAvKio8R0lGIHdpZHRoLCBmaWxsIGR1cmluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiB3aXRoIHRoZSBTUFMqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OyAgICAgICAgICAgICAgICAvKio8R0lGIGhlaWdodCwgZmlsbCBkdXJpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHdpdGggdGhlIFNQUyovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBlZmZlY3REdXJhdGlvbjsgICAgICAgIC8qKjxFZmZlY3QgZHVyYXRpb24qLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0U3RhcnRUaW1lOyAgICAvKio8RWZmZWN0IHN0YXJ0IHRpbWUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgY2xpcFRpbWU7ICAgICAgICAgICAgLyoqPGN1cnJlbnQgb3V0cHV0IGNsaXAgdGltZSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBmcmFtZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0X2NsaXBUaW1lOyAgICAgICAgLyoqPHByZXZpb3VzIG91dHB1dCBjbGlwIHRpbWUgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzIGZyYW1lKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3RTdGVwRHVyYXRpb247ICAgIC8qKjxUaW1lIGludGVydmFsIGJldHdlZW4gdGhlIHByZXZpb3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgYW5kIHRoZSBjdXJyZW50IGZyYW1lKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgYl9Jc0ZpbGVHaWY7ICAgICAgICAvKio8SXMgdGhlIGZyYW1pbmcgdXNpbmcgYSBnaWYgZmlsZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0X3dpZHRoOyAgICAgICAgICAgIC8qKjxMYXN0IGZyYW1lIHdpZHRoKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3RfaGVpZ2h0OyAgICAgICAgLyoqPExhc3QgZnJhbWUgaGVpZ2h0Ki8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3RfdG9wbGVmdF94OyAgICAgICAgLyoqPExhc3QgZnJhbWUgeCB0b3BsZWZ0Ki8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3RfdG9wbGVmdF95OyAgICAgICAgLyoqPExhc3QgZnJhbWUgeSB0b3BsZWZ0Ki8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZ2lmX3RpbWU7ICAgIC8qKjwgQ3VycmVudCB0aW1lIG9zIHRoZSBHSUYgaW4gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgdGltZSAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEdXJhdGlvblJhdGlvOyAgICAvKio8IEZyYW1lIGR1cmF0aW9uIHJhdGlvICovCi0gICAgTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqICAgIGFscGhhQmxlbmRpbmdTdHJ1Y3Q7LypBbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotI2lmZGVmIERFQlVHX0dJRgotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgdWlEZWJ1Z19maWxlQ291bnRlcjsvKio8Zm9yIGRlYnVnIHB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50IHRoZSBmcmFtZSBvZiB0aGUgZ2lmKi8KLSNlbmRpZiAvKkRFQlVHX0dJRiovCi19TTR4VlNTX0ZyYW1pbmdDb250ZXh0OwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMKLSAqIEBicmllZiAgICBJbnRlcm5hbCB4VlNTIHBhcmFtZXRlciBmb3IgUHRvM0dQUCBtb2R1bGUKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGlzIGZpbGxlZCBieSBNNHhWU1Nfc2VuZENvbW1hbmQgZnVuY3Rpb24sCi0gKiBAbm90ZSAgICBhbmQgaXMgdXNlZCBkdXJpbmcgTTR4VlNTX1N0ZXAgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBQdG8zR1BQIG1vZHVsZQotICogQG5vdGUgICAgQWxsIHRoZSBKUEcgZmlsZXMgdG8gdHJhbnNmb3JtIHRvIDNHUCBhcmUgY2hhaW5lZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlSW47Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwRmlsZU91dDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlVGVtcDsgICAgICAgICAgICAvKio8IHRlbXBvcmFyeSBmaWxlIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHdyaXRpbmcsIE5VTEwgaXMgY3N0bWVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciBub3QgdXNlZCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb247Ci0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICAgICBJbnB1dEZpbGVUeXBlOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICBpc0NyZWF0ZWQ7ICAgICAgICAgICAgLyoqPCBUaGlzIGJvb2xlYW4gaXMgdXNlZCB0byBrbm93IGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgZmlsZSBpcyBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgb3Igbm90ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFuWm9vbTsgICAgICAgICAgICAvKio8IFJDOiBCb29sZWFuIHVzZWQgdG8ga25vdyBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW4gYW5kIHpvb20gbW9kZSBpcyBlbmFibGVkICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tWGE7ICAgICAgICAgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRYYTsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYTsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVhiOyAgICAgICAgICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGI7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWI7ICAgIC8qKjwgUkMgKi8KLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgICAgICAgICAgICBNZWRpYVJlbmRlcmluZzsgICAgICAgIC8qKjwgRkI6IHRvIHJlbmRlciBvciBub3QgcGljdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdCByYXRpbyAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlICAgIGZyYW1lcmF0ZTsgICAgICAgICAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgcE5leHQ7ICAgICAgICAgICAgICAgIC8qKjwgQWRkcmVzcyBvZiBuZXh0IE00eFZTU19QdG8zR1BQX3BhcmFtcyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ICovCi0gICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4OndpZHRoIGFuZCBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB3aWR0aDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgaGVpZ2h0OwotCi19IE00eFZTU19QdG8zR1BQX3BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX2ZpZnRpZXNTdHJ1Y3QKLSAqIEBicmllZiAgICBJdCBpcyB1c2VkIGludGVybmFsbHkgYnkgeFZTUyBmb3IgZmlmdGllcyBlZmZlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiBmaWZ0aWVzRWZmZWN0RHVyYXRpb247ICAgIC8qKjwgRHVyYXRpb24gb2YgdGhlIHNhbWUgZWZmZWN0IGluIGEgdmlkZW8gKi8KLSAgICBNNE9TQV9JbnQzMiBwcmV2aW91c0NsaXBUaW1lOyAgICAgICAgICAvKio8IFByZXZpb3VzIGNsaXAgdGltZSwgdXNlZCBieSBmcmFtaW5nIGZpbHRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFNBVklORyAqLwotICAgIE00T1NBX1VJbnQzMiBzaGlmdFJhbmRvbVZhbHVlOyAgICAgICAgICAgICAgICAvKio8IFZlcnRpY2FsIHNoaWZ0IG9mIHRoZSBpbWFnZSAqLwotICAgICAgTTRPU0FfVUludDMyIHN0cmlwZVJhbmRvbVZhbHVlOyAgICAgICAgICAgICAgICAvKio8IEhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIHN0cmlwZSAqLwotCi19IE00eFZTU19GaWZ0aWVzU3RydWN0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfQ29sb3JSR0IxNgotICogQGJyaWVmICAgIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBieSB4VlNTIGZvciBSR0IxNiBjb2xvciBlZmZlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00eFZTU19WaWRlb0VmZmVjdFR5cGUgY29sb3JFZmZlY3RUeXBlOyAgICAvKkNvbG9yIHR5cGUgb2YgZWZmZWN0Ki8KLSAgICBNNE9TQV9VSW50MTYgICAgcmdiMTZDb2xvckRhdGE7ICAgICAgICAgICAgLypSR0IxNiBjb2xvciBvbmx5IGZvciB0aGUgUkdCMTYgY29sb3IgZWZmZWN0Ki8KLX0gTTR4VlNTX0NvbG9yU3RydWN0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0Ci0gKiBAYnJpZWYgICAgVGhlIENhbGxiYWNrIENvbnRleHQgcGFyYW1ldGVycyBmb3IgUHRvM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgbV9GaWxlSW47Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9OYkltYWdlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fSW1hZ2VDb3VudGVyOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1fdGltZUR1cmF0aW9uOwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogIG1fcEZpbGVSZWFkUHRyOwotICAgIE00VklGSV9JbWFnZVBsYW5lKiAgICAgICAgbV9wRGVjb2RlZFBsYW5lOyAvKiBVc2VkIGZvciBQYW4gYW5kIFpvb20gb25seSAqLwotICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogICAgbV9wUHRvM0dQUHBhcmFtczsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgbV9haXJfY29udGV4dDsKLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgICAgbV9tZWRpYVJlbmRlcmluZzsKLQotfSBNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNHhWU1NfU3RhdGUKLSAqIEBicmllZiAgICBJbnRlcm5hbCBTdGF0ZSBvZiB0aGUgeFZTUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rU3RhdGVJbml0aWFsaXplZCA9IDAsCi0gICAgTTR4VlNTX2tTdGF0ZUFuYWx5emluZywKLSAgICBNNHhWU1Nfa1N0YXRlT3BlbmVkLAotICAgIC8vTTR4VlNTX2tTdGF0ZUdlbmVyYXRpbmdQcmV2aWV3LAotICAgIC8vTTR4VlNTX2tTdGF0ZVByZXZpZXcsCi0gICAgTTR4VlNTX2tTdGF0ZVNhdmluZywKLSAgICBNNHhWU1Nfa1N0YXRlU2F2ZWQKLQotfSBNNHhWU1NfU3RhdGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTR4VlNTX2VkaXRNaWNyb1N0YXRlCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgTWljcm8gc3RhdGUgb2YgdGhlIHhWU1MgZm9yIHByZXZpZXdpbmcvc2F2aW5nIHN0YXRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rTWljcm9TdGF0ZUVkaXRpbmcgPSAwLAotICAgIE00eFZTU19rTWljcm9TdGF0ZUF1ZGlvTWl4aW5nCi0KLX0gTTR4VlNTX2VkaXRNaWNyb1N0YXRlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00eFZTU19lZGl0TWljcm9TdGF0ZQotICogQGJyaWVmICAgIEludGVybmFsIE1pY3JvIHN0YXRlIG9mIHRoZSB4VlNTIGZvciBhbmFseXppbmcgc3RhdGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFAgPSAwLAotICAgIE00eFZTU19rTWljcm9TdGF0ZUNvbnZlcnRQdG8zR1BQLAotICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5emVNQ1MsCi0gICAgTTR4VlNTX2tNaWNyb1N0YXRlVHJhbnNjb2RlTUNTCi0KLX0gTTR4VlNTX2FuYWx5c2VNaWNyb1N0YXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19NQ1NfcGFyYW1zCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgeFZTUyBwYXJhbWV0ZXIgZm9yIE1DUyBtb2R1bGUKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGlzIGZpbGxlZCBieSBNNHhWU1Nfc2VuZENvbW1hbmQgZnVuY3Rpb24sCi0gKiBAbm90ZSAgICBhbmQgaXMgdXNlZCBkdXJpbmcgTTR4VlNTX1N0ZXAgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBNQ1MgbW9kdWxlCi0gKiBAbm90ZSAgICBBbGwgdGhlIGlucHV0IGZpbGVzIHRvIHRyYW5zY29kZSBhcmUgY2hhaW5lZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVJbjsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVPdXQ7Ci0gICAgLyoqPCB0ZW1wb3JhcnkgZmlsZSB1c2VkIGZvciBtZXRhZGF0YSB3cml0aW5nLCBOVUxMIGlzIGNzdG1lbSB3cml0ZXIgbm90IHVzZWQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVUZW1wOwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgICAgICAgICAgICBJbnB1dEZpbGVUeXBlOwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgICAgICAgICAgICBPdXRwdXRGaWxlVHlwZTsKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSAgICAgICAgICAgIE91dHB1dFZpZGVvRnJhbWVTaXplOwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlICAgICAgICAgICAgT3V0cHV0VmlkZW9GcmFtZVJhdGU7Ci0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9Gb3JtYXQgICAgICAgICAgICAgICAgT3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAgICBPdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdWRpb01vbm87Ci0gICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZSAgICAgICAgICAgICAgICAgICAgT3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgICAgICAgICAgICAgICAgIE91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JHTTsKLSAgICAvKio8IFRoaXMgYm9vbGVhbiBpcyB1c2VkIHRvIGtub3cgaWYgdGhlIG91dHB1dCBmaWxlIGlzIGFscmVhZHkgY3JlYXRlZCBvciBub3QgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NyZWF0ZWQ7Ci0gICAgLyoqPCBBZGRyZXNzIG9mIG5leHQgTTR4VlNTX01DU19wYXJhbXMqIGVsZW1lbnQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7Ci0KLSAgICAvKkZCOiB0cmFuc2NvZGluZyBwZXIgcGFydHMqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBCZWdpbkN1dFRpbWU7ICAgIC8qKjwgQmVnaW5uaW5nIGN1dCB0aW1lIGluIGlucHV0IGZpbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgRW5kQ3V0VGltZTsgICAgICAvKio8IEVuZCBjdXQgdGltZSBpbiBpbnB1dCBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFZpZGVvVGltZXNjYWxlOyAgICAvKk91dHB1dCB0aW1lc2NhbGUqLwotCi0gICAgTTRNQ1NfTWVkaWFSZW5kZXJpbmcgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nOyAgIC8qKjwgRkI6IHRvIGNyb3AsIHJlc2l6ZSwgb3IgcmVuZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhY2sgYm9yZGVycyovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvY2xpcG51bWJlcjsKLSAgICBNNE9TQV9VSW50MzIgIG91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBNNE9TQV9VSW50MzIgIG91dHB1dFZpZGVvTGV2ZWw7Ci19IE00eFZTU19NQ1NfcGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYWxwaGEgbWFnaWMgdHJhbnNpdGlvbiBzZXR0aW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAqcFBsYW5lOwotICAgIE00T1NBX0ludDMyICAgICAgICAgYmxlbmRpbmd0aHJlc2hvbGQ7ICAgIC8qKjwgQmxlbmRpbmcgUmFuZ2UgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgaXNyZXZlcnNlOyAgICAgICAgICAgIC8qKjwgZGlyZWN0IGVmZmVjdCBvciByZXZlcnNlICovCi0KLX0gTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBpbnRlcm5hbCBzbGlkZSB0cmFuc2l0aW9uIHNldHRpbmdzCi0gKiBAbm90ZSAgICBUaGlzIHR5cGUgaGFwcGVucyB0byBtYXRjaCB0aGUgZXh0ZXJuYWwgdHJhbnNpdGlvbiBzZXR0aW5ncwotICogICAgICAgICAgICBzdHJ1Y3R1cmUgKGkuZS4gdGhlIG9uZSB3aGljaCBpcyBnaXZlbiBieSB0aGUgYXBwbGljYXRpb24pLCBidXQgYXJlCi0gKiAgICAgICAgICAgIGNvbmNlcHR1YWxseSBkaWZmZXJlbnQgdHlwZXMsIHNvIHRoYXQgaWYgKG9yIHJhdGhlciB3aGVuKSBzb21lIGRheQotICogICAgICAgICAgICB0cmFuc2xhdGlvbiBuZWVkcyB0byBvY2N1ciB3aGVuIGxvYWRpbmcgdGhlIHNldHRpbmdzIGZyb20gdGhlIGFwcCwKLSAqICAgICAgICAgICAgdGhpcyBzZXBhcmF0ZSB0eXBlIHdpbGwgYWxyZWFkeSBiZSByZWFkeS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgTTR4VlNTX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzICAgIE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX2ludGVybmFsSnBlZ0NodW5rTW9kZQotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGNodW5rIGNhbGxiYWNrIHRvIGRlY29kZQotICogICAgICAgICAgICBhIEpQRUcgYnkgY2h1bmsgbW9kZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19VVEZDb252ZXJzaW9uQ29udGV4dAotICogQGJyaWVmICAgIEludGVybmFsIFVURiBjb252ZXJzaW9uIGNvbnRleHQKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBVVEYgY29udmVyc2lvbiBpbmZvcm1hdGlvbnMKLSAqICAgICAgICAgICAgbmVlZGVkIGJ5IHRoZSB4VlNTIHRvIG1hbmFnZSB0aGUgZGlmZmVyZW50IGZvcm1hdHMgKFVURjgvMTYvQVNDSUkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKkZ1bmN0aW9uIHBvaW50ZXIgb24gYW4gZXh0ZXJuYWwgdGV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCi0gICAgTTR4VlNTX3RvVVRGOEZjdCAgICAgICAgICAgICAgICBwQ29udlRvVVRGOEZjdDsKLSAgICAvKkZ1bmN0aW9uIHBvaW50ZXIgb24gYW4gZXh0ZXJuYWwgdGV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCi0gICAgTTR4VlNTX2Zyb21VVEY4RmN0ICAgICAgICAgICAgICAgIHBDb252RnJvbVVURjhGY3Q7Ci0gICAgLypUZW1wb3JhcnkgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiBlYWNoIGNvbnZlcnNpb24qLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIC8qU2l6ZSBvZiB0aGUgcHJldmlvdXMgYnVmZmVyLCB0aGUgc2l6ZSBpcyBwcmVkZXJtaW5hdGVkKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIG1fVGVtcE91dENvbnZlcnNpb25TaXplOwotfSBNNHhWU1NfVVRGQ29udmVyc2lvbkNvbnRleHQ7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfQ29udGV4dAotICogQGJyaWVmICAgIEludGVybmFsIGNvbnRleHQgb2YgdGhlIHhWU1MKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBpbnRlcm5hbCBpbmZvcm1hdGlvbnMgbmVlZGVkIGJ5IHRoZSB4VlNTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qKjwgUG9pbnRlciBvbiBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICAgICAgcEZpbGVSZWFkUHRyOwotICAgIC8qKjwgUG9pbnRlciBvbiBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgICBwRmlsZVdyaXRlUHRyOwotICAgIC8qKjwgTG9jYWwgY29weSBvZiB2aWRlbyBlZGl0b3Igc2V0dGluZ3MgKi8KLSAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiAgICAgICAgICAgIHBTZXR0aW5nczsKLSAgICAvKio8IEN1cnJlbnQgU2V0dGluZ3Mgb2YgdmlkZW8gZWRpdG9yIHRvIHVzZSBpbiBzdGVwIGZ1bmN0aW9ucyBmb3IgcHJldmlldy9zYXZlICovCi0gICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogICAgICAgICAgICBwQ3VycmVudEVkaXRTZXR0aW5nczsKLSAgICAvKio8IEN1cnJlbnQgY29udGV4dCBvZiB2aWRlbyBlZGl0b3IgdG8gdXNlIGluIHN0ZXAgZnVuY3Rpb25zIGZvciBwcmV2aWV3L3NhdmUgKi8KLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQgICAgICAgICAgICBwQ3VycmVudEVkaXRDb250ZXh0OwotICAgIC8qKjwgVGhpcyBpcyB0byBrbm93IGlmIGEgcHJldmlvdXMgTTR4VlNTX3NlbmRDb21tYW5kIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0NsaXBOdW1iZXI7Ci0gICAgLyoqPCBBdWRpbyBtaXhpbmcgc2V0dGluZ3MsIG5lZWRlZCB0byBmcmVlIGl0IGluIE00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUgZnVuY3Rpb24qLwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiAgICBwQXVkaW9NaXhTZXR0aW5nczsKLSAgICAvKio8IEF1ZGlvIG1peGluZyBjb250ZXh0ICovCi0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCAgICBwQXVkaW9NaXhDb250ZXh0OwotICAgIC8qKjwgRmlsZSBwYXRoIGZvciBQQ00gb3V0cHV0IGZpbGU6IHVzZWQgZm9yIHByZXZpZXcsIGdpdmVuIHRvIHVzZXIgKi8KLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBjbVByZXZpZXdGaWxlOwotICAgIC8qKjwgRHVwbGljYXRpb24gb2Ygb3V0cHV0IGZpbGUgcG9pbnRlciwgdG8gYmUgYWJsZSB0byB1c2UgYXVkaW8gbWl4aW5nICovCi0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0RmlsZTsKLSAgICAvKio8IER1cGxpY2F0aW9uIG9mIHRlbXBvcmFyeSBmaWxlIHBvaW50ZXIsIHRvIGJlIGFibGUgdG8gdXNlIGF1ZGlvIG1peGluZyAqLwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBvcmFyeUZpbGU7Ci0gICAgLyoqPCBNaWNybyBzdGF0ZSBmb3IgU2F2aW5nL1ByZXZpZXdpbmcgc3RhdGUgKi8KLSAgICBNNHhWU1NfZWRpdE1pY3JvU3RhdGUgICAgICAgICAgICBlZGl0aW5nU3RlcDsKLSAgICAvKio8IE1pY3JvIHN0YXRlIGZvciBBbmFseXppbmcgc3RhdGUgKi8KLSAgICBNNHhWU1NfYW5hbHlzZU1pY3JvU3RhdGUgICAgICAgIGFuYWx5c2VTdGVwOwotICAgIC8qKjwgTmIgb2Ygc3RlcCBmb3IgYW5hbHlzaXMgb3Igc2F2ZS9wcmV2aWV3LiBVc2VkIHRvIGNvbXB1dGUgcHJvZ3Jlc3Npb24KLSAgICAgICAgIG9mIGFuYWx5c2lzIG9yIHNhdmUvcHJldmlldyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgbmJTdGVwVG90YWw7Ci0gICAgLyoqPCBDdXJyZW50IHN0ZXAgbnVtYmVyIGZvciBhbmFseXNpcyBvciBzYXZlL3ByZXZpZXcgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGVwOwotICAgIC8qKjwgVG8gYmUgYWJsZSB0byBmcmVlIHBFZmZlY3RzIGR1cmluZyBwcmV2aWV3IGNsb3NlICovCi0gICAgTTR4VlNTX1ByZXZpZXdTZXR0aW5ncyogICAgICAgICAgICBwUHJldmlld1NldHRpbmdzOwotICAgIC8qKjwgVGVtcG9yYXJ5IGZpbGUgcGF0aDogYWxsIHRlbXBvcmFyeSBmaWxlcyBhcmUgY3JlYXRlZCBoZXJlICovCi0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFBhdGg7Ci0gICAgLyoqPCBDdXJyZW50IHN0YXRlIG9mIHhWU1MgKi8KLSAgICBNNHhWU1NfU3RhdGUgICAgICAgICAgICAgICAgICAgIG1fc3RhdGU7Ci0gICAgLyoqPCBMaXN0IG9mIHN0aWxsIHBpY3R1cmVzIGlucHV0IHRvIGNvbnZlcnQgdG8gM0dQIHdpdGggcGFyYW1ldGVycyAqLwotICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogICAgICAgICAgICBwUFRvM0dQUHBhcmFtc0xpc3Q7Ci0gICAgLyoqPCBDdXJyZW50IGVsZW1lbnQgb2YgdGhlIGFib3ZlIGNoYWluZWQgbGlzdCBiZWVpbmcgcHJvY2Vzc2QgYnkgdGhlIFB0bzNHUFAgKi8KLSAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMqICAgICAgICAgICAgcFBUbzNHUFBjdXJyZW50UGFyYW1zOwotICAgIC8qKjwgQ3VycmVudCBQdG8zR1BQIGNvbnRleHQsIG5lZWRlZCB0byBjYWxsIFB0bzNHUFBfc3RlcCBmdW5jdGlvbiBpbiBNNHhWU1Nfc3RlcCBmdW5jdGlvbiAqLwotICAgIE00UFRPM0dQUF9Db250ZXh0ICAgICAgICAgICAgICAgIHBNNFBUTzNHUFBfQ3R4dDsKLSAgICAvKio8IFBvaW50ZXIgb24gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZSBQdG8zR1BQIG1vZHVsZSAqLwotICAgIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0KiAgICAgICAgcENhbGxCYWNrQ3R4dDsKLSAgICAvKio8IExpc3Qgb2YgZmlsZXMgdG8gdHJhbnNjb2RlIHdpdGggcGFyYW1ldGVycyAqLwotICAgIE00eFZTU19NQ1NfcGFyYW1zKiAgICAgICAgICAgICAgICBwTUNTcGFyYW1zTGlzdDsKLSAgICAvKio8IEN1cnJlbnQgZWxlbWVudCBvZiB0aGUgYWJvdmUgY2hhaW5lZCBsaXN0IGJlZWluZyBwcm9jZXNzZCBieSB0aGUgTUNTICovCi0gICAgTTR4VlNTX01DU19wYXJhbXMqICAgICAgICAgICAgICAgIHBNQ1NjdXJyZW50UGFyYW1zOwotICAgIC8qKjwgQ3VycmVudCBNQ1MgY29udGV4dCwgbmVlZGVkIHRvIGNhbGwgTUNTX3N0ZXAgZnVuY3Rpb24gaW4gTTR4VlNTX3N0ZXAgZnVuY3Rpb24qLwotICAgIE00TUNTX0NvbnRleHQgICAgICAgICAgICAgICAgICAgIHBNQ1NfQ3R4dDsKLSAgICAvKio8IEluZGV4IHRvIGhhdmUgdW5pcXVlIHRlbXBvcmFyeSBmaWxlbmFtZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdGVtcEZpbGVJbmRleDsKLSAgICAvKio8IEluIGNhc2Ugb2YgTU1TIHVzZSBjYXNlLCB0YXJnZXRlZCBiaXRyYXRlIHRvIHJlYWNoIG91dHB1dCBmaWxlIHNpemUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZTsKLSAgICAvKio8IElmIHRoZSBzZW5kQ29tbWFuZCBmY3QgaXMgY2FsbGVkIHR3aWNlIG9yIG1vcmUsIHRoZSBmaXJzdCBjb21wdXRlZCB0aW1lc2NhbGUKLSAgICAgICAgcmVjb3JkZWQgaGVyZSBtdXN0IGJlIHJldXNlZCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ZWRUaW1lc2NhbGU7Ci0KLSAgICAvKlVURiBDb252ZXJzaW9uIHN1cHBvcnQqLwotICAgIE00eFZTU19VVEZDb252ZXJzaW9uQ29udGV4dCAgICBVVEZDb252ZXJzaW9uQ29udGV4dDsgICAgLypVVEYgY29udmVyc2lvbiBjb250ZXh0IHN0cnVjdHVyZSovCi0KLX0gTTR4VlNTX0NvbnRleHQ7Ci0KLS8qKgotICogSW50ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RhcnRUcmFuc2NvZGluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpyb3RhdGlvbkRlZ3JlZSk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVKUEcoTTRPU0FfVm9pZCogcEZpbGVJbiwgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiogcEltYWdlUGxhbmVzKTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLE00T1NBX1VJbnQzMiBoZWlnaHQpOwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbERlY29kZUFuZFJlc2l6ZUpQRyhNNE9TQV9Wb2lkKiBwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcyk7Ci1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCxNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KTsKLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGX0luaXRpYWxpemF0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGX0NsZWFuaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0jZWxzZQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbERlY29kZUdJRihNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KTsKLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb1Jlc29sdXRpb24pOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2VuZXJhdGVBdWRpb01peEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVByZXZpZXcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVTZXR0aW5ncyhNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9DaGFyKiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgKnBGaWxlUHJvcGVydGllcyk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfQWxwaGFNYWdpYyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfQWxwaGFNYWdpY0JsZW5kaW5nKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKTsKLQotTTRPU0FfRVJSIE00eFZTU19TbGlkZVRyYW5zaXRpb24oIE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpVHJhbnNpdGlvbktpbmQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb24oTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdldFRhcmdldGVkVGltZVNjYWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFRhcmdldGVkVGltZVNjYWxlKTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEJ1ZmZlck91dCwgTTRPU0FfVUludDMyKiBjb252ZXJ0ZWRTaXplKTsKLQotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEJ1ZmZlck91dCwgTTRPU0FfVUludDMyKiBjb252ZXJ0ZWRTaXplKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotI2VuZGlmIC8qIF9fTTRYVlNTX0lOVEVSTkFMX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhODk4N2UyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TUNTX0FQSS5oCi0gKiBAYnJpZWYgICBNZWRpYSBDb252ZXJzaW9uIFNlcnZpY2UgcHVibGljIEFQSS4KLSAqIEBub3RlICAgIE1DUyBhbGxvd3MgdHJhbnNjb2RpbmcgYSAzZ3AvbXA0IGZpbGUgaW50byBhIG5ldyAzZ3AvbXA0IGZpbGUgY2hhbmdpbmcgdGhlCi0gKiAgICAgICAgICB2aWRlbyBhbmQgYXVkaW8gZW5jb2Rpbmcgc2V0dGluZ3MuCi0gKiAgICAgICAgICBJdCBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBhbmQgZnVsbHkgc3luY2hyb25vdXMgQVBJLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NNE1DU19BUElfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfQVBJX0hfXwotCi0vKioKLSAqICAgIE9TQUwgYmFzaWMgdHlwZXMgYW5kIGVycm9ycyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotLyoqCi0gKiAgICBPU0FMIHR5cGVzIGZvciBmaWxlIGFjY2VzcyAqLwotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLS8qKgotICogICAgRGVmaW5pdGlvbiBvZiBNNF9WZXJzaW9uSW5mbyAqLwotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotCi0vKioKLSAqIENvbW1vbiBkZWZpbml0aW9ucyBvZiB2aWRlbyBlZGl0aW5nIGNvbXBvbmVudHMgKi8KLSNpbmNsdWRlICJNNF9WaWRlb0VkaXRpbmdDb21tb24uaCIKLQotLyoqCi0gKiBUbyBlbmFibGUgZXh0ZXJuYWwgYXVkaW8gY29kZWNzIHJlZ2lzdGVyaW5nKi8KLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00RU5DT0RFUl9BdWRpb0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogICAgUHVibGljIHR5cGUgb2YgdGhlIE1DUyBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00TUNTX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNE1DU19NZWRpYVJlbmRlcmluZwotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIGRpZmZlcmVudCBtZWRpYSByZW5kZXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa1Jlc2l6aW5nID0gMCwgICAgLyoqPCBUaGUgbWVkaWEgaXMgcmVzaXplZCwgdGhlIGFzcGVjdCByYXRpbyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgb2YgdGhlIG1lZGlhIGlzIHJlbmRlcmVkICovCi0gICAgTTRNQ1Nfa0Nyb3BwaW5nLCAgICAgICAgLyoqPCBUaGUgbWVkaWEgaXMgY3JvcHBlZCwgdGhlIGFzcGVjdCByYXRpbyBpcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWUgYXMgdGhlIG9yaWdpbmFsIG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtZWRpYSBpcyBub3QgcmVuZGVyZWQgZW50aXJlbHkgKi8KLSAgICBNNE1DU19rQmxhY2tCb3JkZXJzICAgICAvKio8IEJsYWNrIGJvcmRlcnMgYXJlIHJlbmRlcmVkIGluIG9yZGVyIHRvIGtlZXAgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbCBhc3BlY3QgcmF0aW8uIEFsbCB0aGUgbWVkaWEgaXMgcmVuZGVyZWQgKi8KLX0gTTRNQ1NfTWVkaWFSZW5kZXJpbmc7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byB0aGUgZXh0ZXJuYWwgRWZmZWN0IGZ1bmN0aW9ucwotICogQG5vdGUgICAgVGhlIHVpUHJvZ3Jlc3MgdmFsdWUgc2hvdWxkIGJlIGVub3VnaCBmb3IgbW9zdCBjYXNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICB1aVByb2dyZXNzOyAgICAgLyoqPCBQcm9ncmVzcyBvZiB0aGUgRWZmZWN0IGZyb20gMCB0byAxMDAwIChvbmUgdGhvdXNhbmQpICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpQ2xpcFRpbWU7ICAgICAvKio8IEN1cnJlbnQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgY2xpcCB0aW1lLWxpbmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlPdXRwdXRUaW1lOyAgIC8qKjwgQ3VycmVudCB0aW1lLCBpbiBtaWxsaXNlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgb3V0cHV0IGNsaXAgdGltZS1saW5lICovCi0KLX0gTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00TUNTX0F1ZGlvRWZmZWN0VHlwZQotICogQGJyaWVmICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBhdWRpbyBlZmZlY3QgdHlwZXMgb2YgdGhlIE1DUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX05vbmUgICAgPSAwLAotICAgIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfRmFkZUluICA9IDgsIC8qKjwgSW50ZW5kZWQgZm9yIGJlZ2luIGVmZmVjdCAqLwotICAgIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dCA9IDE2LCAvKio8IEludGVuZGVkIGZvciBlbmQgZWZmZWN0ICovCi0gICAgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9FeHRlcm5hbCA9IDI1NgotCi19IE00TUNTX0F1ZGlvRWZmZWN0VHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3QKLSAqIEBicmllZiAgICAgICBBdWRpbyBlZmZlY3QgZnVuY3Rpb25zIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgbXVzdCBtYXRjaCB0aGlzIHByb3RvdHlwZS4KLSAqIEBub3RlICAgICAgICBUaGUgZnVuY3Rpb24gaXMgcHJvdmlkZWQgd2l0aCB0aGUgb3JpZ2luYWwgUENNIGRhdGEgYnVmZmVyIGFuZCBpdHMgc2l6ZS4KLSAqICAgICAgICAgICAgICBBdWRpbyBlZmZlY3QgaGF2ZSB0byBiZSBhcHBsaWVkIG9uIGl0LgotICogICAgICAgICAgICAgIFRoZSBwcm9ncmVzcyBvZiB0aGUgZWZmZWN0IGlzIGdpdmVuLCBvbiBhIHNjYWxlIGZyb20gMCB0byAxMDAwLgotICogICAgICAgICAgICAgIFdoZW4gdGhlIGVmZmVjdCBmdW5jdGlvbiBpcyBjYWxsZWQsIGFsbCB0aGUgYnVmZmVycyBhcmUgdmFsaWQgYW5kCi0gKiAgICAgICAgICAgICAgb3duZWQgYnkgdGhlIE1DUy4KLSAqCi0gKiBAcGFyYW0gICBwRnVuY3Rpb25Db250ZXh0ICAgIChJTikgVGhlIGZ1bmN0aW9uIGNvbnRleHQsIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiBAcGFyYW0gICBwUENNZGF0YSAgICAgICAgICAgIChJTi9PVVQpIHZhbGlkIFBDTSBkYXRhIGJ1ZmZlcgotICogQHBhcmFtICAgdWlQQ01zaXplICAgICAgICAgICAoSU4vT1VUKSBQQ00gZGF0YSBidWZmZXIgY29ycmVzcG9uZGluZyBzaXplCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChJTikgU2V0IG9mIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhdWRpbyBlZmZlY3QgcHJvZ3Jlc3MuCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0KQotKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgIE00T1NBX1VJbnQzMiB1aVBDTXNpemUsCi0gICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRNQ1NfRWZmZWN0U2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gYXVkaW8gZWZmZWN0IGZvciB0aGUgZWRpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgIHVpU3RhcnRUaW1lOyAgICAgICAgICAgICAgLyoqPCBJbiBtcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgdWlEdXJhdGlvbjsgICAgICAgICAgICAgICAvKio8IEluIG1zICovCi0gICAgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0ICAgICBFeHRBdWRpb0VmZmVjdEZjdDsgICAgICAgIC8qKjwgRXh0ZXJuYWwgZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAqcEV4dEF1ZGlvRWZmZWN0RmN0Q3R4dDsgIC8qKjwgQ29udGV4dCBnaXZlbiB0byB0aGUgZXh0ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNE1DU19BdWRpb0VmZmVjdFR5cGUgICAgICAgIEF1ZGlvRWZmZWN0VHlwZTsgICAgICAgICAvKio8IE5vbmUsIEZhZGVJbiwgRmFkZU91dCAqLwotCi19IE00TUNTX0VmZmVjdFNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00TUNTX091dHB1dFBhcmFtcwotICogQGJyaWVmICAgIE1DUyBPdXRwdXQgcGFyYW1ldGVycwotICogQG5vdGUgICAgIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkIGZvciBzdGlsbCBwaWN0dXJlIGlucHV0cyA6Ci0gKiAgICAgICAgICAgICAtIE91dHB1dEZpbGVUeXBlIChtdXN0IGJlIHNldCB0byBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfSlBHKQotICogICAgICAgICAgICAgLSBiRGlzY2FyZEV4aWYgbXVzdCBiZSBzZXQgdG8gTTRPU0FfVFJVRSBvciBNNE9TQV9GQUxTRQotICogICAgICAgICAgICAgLSBiQWRqdXN0T3JpZW50YXRpb24gbXVzdCBiZSBzZXQgdG8gTTRPU0FfVFJVRSBvciBNNE9TQV9GQUxTRQotICogICAgICAgICAgICAgLSAoTWVkaWFSZW5kZXJpbmcgaXMgbm90IGhhbmRsZWQgOiBvdXRwdXQgaW1hZ2UgcmVzb2x1dGlvbiBpcyBhbHdheXMKLSAgICAgICAgICAgICAgICAgc2V0IGFjY29yZGluZyB0byBCZXN0Rml0IGNyaXRlcmlhKQotICogICAgICAgICAgICBiRGlzY2FyZEV4aWYgYW5kIGJBZGp1c3RPcmllbnRhdGlvbiBhcmUgc3RpbGwgcGljdHVyZSBvbmx5IHBhcmFtZXRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IEZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgICAgICAgICAgT3V0cHV0RmlsZVR5cGU7Ci0gICAgLyoqPCBPdXRwdXQgdmlkZW8gY29tcHJlc3Npb24gZm9ybWF0LCBzZWUgZW51bSAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0ICAgICAgICAgICAgICBPdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAvKio8IE91dHB1dCBmcmFtZSBzaXplIDogUVFWR0EsIFFDSUYgb3IgU1FDSUYgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSAgICAgICAgICAgT3V0cHV0VmlkZW9GcmFtZVNpemU7Ci0gICAgLyoqPCBUYXJnZXRlZCBPdXRwdXQgZnJhbWVyYXRlLCBzZWUgZW51bSAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlICAgICAgICAgICBPdXRwdXRWaWRlb0ZyYW1lUmF0ZTsKLSAgICAvKio8IEZvcm1hdCBvZiB0aGUgYXVkaW8gaW4gdGhlIHN0cmVhbSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgICAgICBPdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICAvKio8IFNhbXBsaW5nIGZyZXF1ZW5jeSBvZiB0aGUgYXVkaW8gaW4gdGhlIHN0cmVhbSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgICBPdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotICAgIC8qKjwgU2V0IHRvIE00T1NBX1RSVUUgaWYgdGhlIG91dHB1dCBhdWRpbyBpcyBtb25vICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdWRpb01vbm87Ci0gICAgLyoqPCBPdXRwdXQgUENNIGZpbGUgaWYgbm90IE5VTEwgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBPdXRwdXRQQ01maWxlOwotICAgIC8qKjwgVG8gY3JvcCwgcmVzaXplLCBvciByZW5kZXIgYmxhY2sgYm9yZGVycyovCi0gICAgTTRNQ1NfTWVkaWFSZW5kZXJpbmcgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nOwotICAgIC8qKjwgTGlzdCBvZiBlZmZlY3RzICovCi0gICAgTTRNQ1NfRWZmZWN0U2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICpwRWZmZWN0czsKLSAgICAvKio8IE51bWJlciBvZiBlZmZlY3RzIGluIHRoZSBhYm92ZSBsaXN0ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iRWZmZWN0czsKLQotICAgIC8qLS0tIFNUSUxMIFBJQ1RVUkUgLS0tKi8KLSAgICAvKio8IFRSVUU6IEV2ZW4gaWYgdGhlIGlucHV0IGZpbGUgY29udGFpbnMgYW4gRVhJRiBzZWN0aW9uLAotICAgIHRoZSBvdXRwdXQgZmlsZSB3b24ndCBjb250YWluIGFueSBFWElGIHNlY3Rpb24uKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRpc2NhcmRFeGlmIDsKLQotICAgIC8qKjwgPVRSVUUgOiBwaWN0dXJlIG11c3QgYmUgcm90YXRlZCBpZiBFeGlmIHRhZ3MgaG9sZCBhIHJvdGF0aW9uIGluZm8KLSAgICAoYW5kIHJvdGF0aW9uIGluZm8gaXMgc2V0IHRvIDApKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkanVzdE9yaWVudGF0aW9uIDsKLSAgICAvKi0tLSBTVElMTCBQSUNUVVJFIC0tLSovCi0gICAgTTRPU0FfSW50MzIgb3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIE00T1NBX0ludDMyIG91dHB1dFZpZGVvTGV2ZWw7Ci19IE00TUNTX091dHB1dFBhcmFtczsKLQotLyotLS0gU1RJTEwgUElDVFVSRSAtLS0qLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgTTRNQ1NfU1BPdXRwdXRSZXNvbHV0aW9uCi0gKiBAYnJpZWYgICAgU3RpbGwgcGljdHVyZSBzcGVjaWZpYyA6IE1DUyBvdXRwdXQgdGFyZ2V0ZWQgZmlsZSByZXNvbHV0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tSZXNTYW1lQXNJbnB1dCAgICAgICA9IDB4MDAsIC8qd2lkdGggeCBoZWlnaHQqLwotICAgIE00TUNTX2tSZXNRVkdBICAgICAgICAgICAgICA9IDB4MDEsIC8qMzIweDI0MCovCi0gICAgTTRNQ1Nfa1Jlc1ZHQSAgICAgICAgICAgICAgID0gMHgwMiwgLyo2NDB4NDgwKi8KLSAgICBNNE1DU19rUmVzV1FWR0EgICAgICAgICAgICAgPSAweDAzLCAvKjQwMHgyNDAqLwotICAgIE00TUNTX2tSZXNXVkdBICAgICAgICAgICAgICA9IDB4MDQsIC8qODAweDQ4MCovCi0gICAgTTRNQ1Nfa1Jlc1hHQSAgICAgICAgICAgICAgID0gMHgwNSwgLyoxMDI0eDc2OCovCi0gICAgTTRNQ1Nfa1Jlc0N1c3RvbSAgICAgICAgICAgID0gMHhGRiAgLypTaXplIGlzIHNldCB2aWEgU3RpbGxQaWN0dXJlQ3VzdG9tV2lkdGgvSGVpZ2h0Ki8KLX0gTTRNQ1NfU1BPdXRwdXRSZXNvbHV0aW9uIDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICBNNE1DU19TUFN0cmF0ZWd5Ci0gKiBAYnJpZWYgICAgU3RpbGwgcGljdHVyZSBzcGVjaWZpYyA6IE1DUyBzdHJhdGVneSB0byBjb25maWd1cmUgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa0ZpbGVTaXplT25seUZpeGVkICAgICAgICAgICAgPSAweDAwLCAvKlN0aWxsUGljdHVyZVJlc29sdXRpb24gYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbGl0eUZhY3RvciBhcmUgaWdub3JlZCovCi0gICAgTTRNQ1Nfa0ZpbGVTaXplQW5kUmVzRml4ZWQgICAgICAgICAgPSAweDAxLCAvKlF1YWxpdHlGYWN0b3IgaXMgaWdub3JlZCovCi0gICAgTTRNQ1Nfa1F1YWxpdHlBbmRSZXNGaXhlZCAgICAgICAgICAgPSAweDAyICAvKk91dHB1dEZpbGVTaXplIGlzIGlnbm9yZWQqLwotfSBNNE1DU19TUFN0cmF0ZWd5IDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICBNNE1DU19TUENyb3AKLSAqIEBicmllZiAgICBTdGlsbCBwaWN0dXJlIHNwZWNpZmljIDogaW5kaWNhdGUgd2hldGhlciBjcm9wcGluZyBzaG91bGQgYmUgZG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBjaGFuZ2luZyB0aGUgcmVzb2x1dGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1DU19rTm9Dcm9wICAgICAgICAgICAgICAgID0gMHgwMCwgLypObyBDcm9wcGluZyBpcyBwZXJmb3JtZWQqLwotICAgIE00TUNTX2tDcm9wQmVmb3JlUmVzaXplICAgICAgPSAweDAxICAvKklucHV0IGltYWdlIGlzIGNyb3BwZWQgKGJlZm9yZSBjaGFuZ2luZyByZXNvbHV0aW9uKSovCi19IE00TUNTX1NQQ3JvcCA7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRNQ1NfRW5jb2RpbmdQYXJhbXMKLSAqIEBicmllZiAgICBNQ1MgZmlsZSBzaXplLCBiaXRyYXRlIGFuZCBjdXQgcGFyYW1ldGVycwotICogQG5vdGUgICAgIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkIGZvciBzdGlsbCBwaWN0dXJlIGlucHV0cyA6Ci0gKiAgICAgICAgICAgICAtIE91dHB1dEZpbGVTaXplCi0gKiAgICAgICAgICAgICAtIFN0aWxsUGljdHVyZVJlc29sdXRpb24KLSAqICAgICAgICAgICAgIC0gUXVhbGl0eUZhY3RvcgotICogICAgICAgICAgICAgLSBTdGlsbFBpY3R1cmVTdHJhdGVneQotICogICAgICAgICAgICAgLSBTdGlsbFBpY3R1cmVDdXN0b21XaWR0aC9IZWlnaHQgKGlmIFN0aWxsUGljdHVyZVJlc29sdXRpb249PU00TUNTX2tSZXNDdXN0b20pCi0gKiAgICAgICAgICAgIFN0aWxsIHBpY3R1cmUgb25seSBwYXJhbWV0ZXJzIDogU3RpbGxQaWN0dXJlUmVzb2x1dGlvbiwgUXVhbGl0eUZhY3RvciwKLSAqICAgICAgICAgICAgU3RpbGxQaWN0dXJlU3RyYXRlZ3kgYW5kIFN0aWxsUGljdHVyZUN1c3RvbVdpZHRoL0hlaWdodAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgT3V0cHV0VmlkZW9CaXRyYXRlOyAgICAgLyoqPCBUYXJnZXRlZCB2aWRlbyBiaXRyYXRlICovCi0gICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZSAgICBPdXRwdXRBdWRpb0JpdHJhdGU7ICAgICAvKio8IFRhcmdldGVkIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIEJlZ2luQ3V0VGltZTsgICAgICAgICAgIC8qKjwgQmVnaW5uaW5nIGN1dCB0aW1lIGluIGlucHV0IGZpbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIEVuZEN1dFRpbWU7ICAgICAgICAgICAgIC8qKjwgRW5kIGN1dCB0aW1lIGluIGlucHV0IGZpbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIE91dHB1dEZpbGVTaXplOyAgICAgICAgIC8qKjwgRXhwZWN0ZWQgcmVzdWx0aW5nIGZpbGUgc2l6ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgT3V0cHV0VmlkZW9UaW1lc2NhbGU7ICAgLyoqPCBPcHRpb25hbCBwYXJhbWV0ZXIgdXNlZCB0byBmaXggYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc2NhbGUgZHVyaW5nIHRyYW5zY29kaW5nICovCi0KLSAgICAvKi0tLSBTVElMTCBQSUNUVVJFIC0tLSovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICBRdWFsaXR5RmFjdG9yIDsgICAgICAgICAvKio8ID0tMSAodW5kZWZpbmVkKSBvciAwKGxvd2VzdCkuLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAoYmVzdCkgOiBUaGlzIHBhcmFtZXRlciBpcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgaW5kaWNhdGlvbiBmb3IgdGhlIEpQRUcgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIChpZiA9LTEgdGhlIE1DUyB3aWxsIHNldCBxdWFsaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5KSovCi0gICAgTTRNQ1NfU1BTdHJhdGVneSAgICAgICAgICAgIFN0aWxsUGljdHVyZVN0cmF0ZWd5IDsgLyoqPCBEZWZpbmVzIHdoaWNoIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50IGJ5IE1DUyovCi0gICAgTTRNQ1NfU1BPdXRwdXRSZXNvbHV0aW9uICAgIFN0aWxsUGljdHVyZVJlc29sdXRpb247LyoqPCBEZXNpcmVkIG91dHB1dCByZXNvbHV0aW9uIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzdGlsbCBwaWN0dXJlIGZpbGUgKi8KLSAgICAvKio8IChvbmx5IGlmIFJlc29sdXRpb249PU00TUNTX2tSZXNDdXN0b20pIDogQ3VzdG9tIG91dHB1dCBpbWFnZSB3aWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBTdGlsbFBpY3R1cmVDdXN0b21XaWR0aDsKLSAgICAvKio8IChvbmx5IGlmIFJlc29sdXRpb249PU00TUNTX2tSZXNDdXN0b20pIDogQ3VzdG9tIG91dHB1dCBpbWFnZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3VzdG9tSGVpZ2h0OwotICAgIC8qKjwgSW5kaWNhdGUgd2hldGhlciBDcm9wIHNob3VsZCBiZSBwZXJmb3JtZWQgKi8KLSAgICBNNE1DU19TUENyb3AgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3JvcDsKLSAgICAvKio8IChvbmx5IGlmIGNyb3BwaW5nKSBYIGNvb3JkaW5hdGUgb2YgdG9wbGVmdCBjb3JuZXIgb2YgdGhlIGNyb3Agd2luZG93ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUNyb3BfWDsKLSAgICAvKio8IChvbmx5IGlmIGNyb3BwaW5nKSBZIGNvb3JkaW5hdGUgb2YgdG9wbGVmdCBjb3JuZXIgb2YgdGhlIGNyb3Agd2luZG93ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUNyb3BfWTsKLSAgICAvKio8IChvbmx5IGlmIGNyb3BwaW5nKSBXaWR0aCBvZiB0aGUgY3JvcCB3aW5kb3cgKGluIHBpeGVscykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3JvcF9XOwotICAgIC8qKjwgKG9ubHkgaWYgY3JvcHBpbmcpIEhlaWdodCBvZiB0aGUgY3JvcCB3aW5kb3cgKGluIHBpeGVscykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3JvcF9IOwotICAgIC8qLS0tIFNUSUxMIFBJQ1RVUkUgLS0tKi8KLX0gTTRNQ1NfRW5jb2RpbmdQYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0gKiBAYnJpZWYgICAgR2V0IHRoZSBNQ1MgdmVyc2lvbi4KLSAqIEBub3RlIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW5pdChNNE1DU19Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZVB0ckZjdCk7Ci0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIE1DUyAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBNQ1MgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2luaXQoTTRNQ1NfQ29udGV4dCogcENvbnRleHQsIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfb3BlbihNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZUluLCBNNE9TQV9Wb2lkKiBwRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpTWF4TWV0YWRhdGFTaXplKTsKLSAqIEBicmllZiAgIFNldCB0aGUgTUNTIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBpcyBub3QgY3JlYXRlZCB5ZXQuCi0gKiAgICAgICAgICBJbiBjYXNlIG9mIHN0aWxsIHBpY3R1cmUsIGZvdXIgSW5wdXRGaWxlVHlwZSBhcmUgcG9zc2libGUKLSAqICAgICAgICAgIChNNFZJREVPRURJVElOR19rRmlsZVR5cGVfSlBHL0JNUC9HSUYvUE5HCi0gKiAgICAgICAgICBJZiBvbmUgb2YgdGhlbSBpcyBzZXQsIHRoZSBPdXRwdXRGaWxlVHlwZSBTSEFMTCBiZSBzZXQgdG8gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRwotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwRmlsZUluICAgICAgICAgICAgIChJTikgSW5wdXQgZmlsZSB0byB0cmFuc2NvZGUgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIENvbnRhaW5lciB0eXBlICguM2dwLC5hbXIsIC4uLikgb2YgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgIHBGaWxlT3V0ICAgICAgICAgICAgKElOKSBPdXRwdXQgZmlsZSB0byBjcmVhdGUgIChUaGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVJMLCBwaXBlLi4uKSBkZXBlbmRzIG9uIHRoZSBPU0FMIGltcGxlbWVudGF0aW9uKS4KLSAqIEBwYXJhbSAgIHBUZW1wRmlsZSAgICAgICAgICAgKElOKSBUZW1wb3JhcnkgZmlsZSBmb3IgdGhlIGNvbnN0YW50IG1lbW9yeSB3cml0ZXIgdG8gc3RvcmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgKCJtb292LmJpbiIpLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6ICAgVGhlIGlucHV0IGZpbGUgaGFzIG5vdCBiZWVuIGZvdW5kCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOiAgIFRoZSBpbnB1dCBmaWxlIGlzIG5vdCBhIHZhbGlkIGZpbGUsIG9yIGlzIGNvcnJ1cHRlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTTogIFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIG5vCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBhdWRpbyBvciB2aWRlbyBzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX29wZW4oTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZU91dCwgTTRPU0FfVm9pZCogcFRlbXBGaWxlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc3RlcChNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLSAqIEBicmllZiAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgdHJhbmNvZGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApIG9mIHRoZSB0cmFuc2NvZGluZwotICogQG5vdGUgICAgcFByb2dyZXNzIG11c3QgYmUgYSB2YWxpZCBhZGRyZXNzLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBPbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX1dBUl9UUkFOU0NPRElOR19ET05FOiBUcmFuc2NvZGluZyBpcyBvdmVyLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNE1DU19jbG9zZSgpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQ6IFRoZSBhdWRpbyBjb252ZXJzaW9uIChBQUMgdG8gQU1SLU5CLCBNUDMpIGZhaWxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfQUFDX1NBTVBMSU5HX0ZSRVFVRU5DWTogVGhlIGlucHV0IGZpbGUgY29udGFpbnMgYW4gQUFDIGF1ZGlvIHRyYWNrCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbiBpbnZhbGlkIHNhbXBsaW5nIGZyZXF1ZW5jeQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaG91bGQgbmV2ZXIgaGFwcGVuKQotICogQHJldHVybiAgTTRNQ1NfV0FSX1BJQ1RVUkVfQVVUT19SRVNJWkU6IFBpY3R1cmUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlc2l6ZWQgdG8gZml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gcmVxdWlyZW1lbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zdGVwKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19wYXVzZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgIFBhdXNlIHRoZSB0cmFuc2NvZGluZyBpLmUuIHJlbGVhc2UgdGhlIChleHRlcm5hbCBoYXJkd2FyZSkgdmlkZW8gZGVjb2Rlci4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG5lZWRlZCBpZiBubyBoYXJkd2FyZSBhY2NlbGVyYXRvcnMgYXJlIHVzZWQuCi0gKiAgICAgICAgICBJbiB0aGF0IGNhc2UsIHBhdXNpbmcgdGhlIE1DUyBpcyBzaW1wbHkgYWNoaWV2ZWQgYnkgdGVtcG9yYXJpbHkgc3VzcGVuZGluZwotICogICAgICAgICAgdGhlIE00TUNTX3N0ZXAgZnVuY3Rpb24gY2FsbHMuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3BhdXNlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19yZXN1bWUoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBSZXN1bWUgdGhlIHRyYW5zY29kaW5nIGFmdGVyIGEgcGF1c2UgKHNlZSBNNE1DU19wYXVzZSkuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBuZWVkZWQgaWYgbm8gaGFyZHdhcmUgYWNjZWxlcmF0b3JzIGFyZSB1c2VkLgotICogICAgICAgICAgSW4gdGhhdCBjYXNlLCByZXN1bWluZyB0aGUgTUNTIGlzIHNpbXBseSBhY2hpZXZlZCBieSBjYWxsaW5nCi0gKiAgICAgICAgICB0aGUgTTRNQ1Nfc3RlcCBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfcmVzdW1lKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19jbG9zZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIE1DUyB0cmFuc2NvZGluZy4KLSAqIEBub3RlIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2Nsb3NlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19jbGVhblVwKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBNQ1MuCi0gKiBAbm90ZSBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfY2xlYW5VcChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfYWJvcnQoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgRmluaXNoIHRoZSBNQ1MgdHJhbnNjb2RpbmcgYW5kIGZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBNQ1MKLSAqICAgICAgICAgIHdoYXRldmVyIHRoZSBzdGF0ZSBpcy4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfYWJvcnQoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMqIHBGaWxlUHJvcGVydGllcyk7Ci0gKiBAYnJpZWYgICBSZXRyaWV2ZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zIGZyb20gdGhlIGlucHV0IGZpbGUuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQcm9wZXJ0aWVzICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiBhbiBhbGxvY2F0ZWQgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIHdoaWNoIGlzIGZpbGxlZCB3aXRoIHRoZSBpbnB1dCBzdHJlYW0gcHJvcGVydGllcy4KLSAqIEBub3RlICAgIFRoZSBzdHJ1Y3R1cmUgcFByb3BlcnRpZXMgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIGZ1cnRoZXIgZGUtYWxsb2NhdGVkCi0gICAgICAgICAgICBieSB0aGUgYXBwbGljYXRpb24uIFRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgb3BlbmVkIHN0YXRlLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcEZpbGVQcm9wZXJ0aWVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX091dHB1dFBhcmFtcyogcFBhcmFtcyk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyB2aWRlbyBvdXRwdXQgcGFyYW1ldGVycy4KLSAqIEBub3RlICAgIE11c3QgYmUgY2FsbGVkIGFmdGVyIE00TUNTX29wZW4uIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBNNE1DU19zdGVwLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUGFyYW1zICAgICAgICAgICAgIChJTi9PVVQpIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyA6IE91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfUkFURV9GT1JfSDI2MyA6IE91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICogQHJldHVybiAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUICAgICA6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZm9ybWF0IHBhcmFtZXRlcgotICogQHJldHVybiAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSA6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZQotICogQHJldHVybiAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURSA6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZnJhbWUgcmF0ZQotICogQHJldHVybiAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUIDogVW5kZWZpbmVkIG91dHB1dCBhdWRpbyBmb3JtYXQgcGFyYW1ldGVyCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfRFVSQVRJT05fSVNfTlVMTCA6IFNwZWNpZmllZCBvdXRwdXQgcGFyYW1ldGVycyBkZWZpbmUgYSBudWxsIGR1cmF0aW9uIHN0cmVhbQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vIGF1ZGlvIGFuZCB2aWRlbykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3NldE91dHB1dFBhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19PdXRwdXRQYXJhbXMqIHBQYXJhbXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKQotICogQGJyaWVmICAgU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KCkuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFJhdGVzICAgICAgICAgICAgIChJTikgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOiBBdWRpbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA5NiBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOiBBdWRpbyBiaXRyYXRlIGlzIHRvbyBsb3cgKDE2IGticHMgbWluIGZvciBhYWMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMi4yIGZvciBhbXIsIDggZm9yIG1wMykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ6IEJlZ2luIGN1dCBhbmQgRW5kIGN1dCBhcmUgZXF1YWxzCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOiBCZWdpbiBjdXQgdGltZSBpcyBsYXJnZXIgdGhhbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBjbGlwIGR1cmF0aW9uCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUOiBFbmQgY3V0IHRpbWUgaXMgc21hbGxlciB0aGFuIGJlZ2luIGN1dCB0aW1lCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMOiBOb3QgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIHdob2xlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgYXQgZ2l2ZW4gYml0cmF0ZXMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g6IFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOiBWaWRlbyBiaXRyYXRlIHRvbyBsb3cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3NldEVuY29kaW5nUGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX0VuY29kaW5nUGFyYW1zKiBwUmF0ZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19nZXRFeHRlbmRlZEVuY29kaW5nUGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX0VuY29kaW5nUGFyYW1zKiBwUmF0ZXMpCi0gKiBAYnJpZWYgICBHZXQgdGhlIGV4dGVuZGVkIHZhbHVlcyBvZiB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycwotICogQG5vdGUgICAgQ291bGQgYmUgY2FsbGVkIGFmdGVyIE00TUNTX3NldEVuY29kaW5nUGFyYW1zLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBSYXRlcyAgICAgICAgICAgICAoT1VUKSBUcmFuc2NvZGluZyBwYXJhbWV0ZXJzCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ6IEVuY29kaW5nIHNldHRpbmdzIHdvdWxkIHByb2R1Y2UgYQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCBkdXJhdGlvbiBjbGlwID0gZW5jb2RpbmcgaXMgaW1wb3NzaWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydChNNE1DU19Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDogQXVkaW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gOTYga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzogQXVkaW8gYml0cmF0ZSBpcyB0b28gbG93ICgxNiBrYnBzIG1pbiBmb3IgYWFjLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIuMiBmb3IgYW1yLCA4IGZvciBtcDMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOiBCZWdpbiBjdXQgYW5kIEVuZCBjdXQgYXJlIGVxdWFscwotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjogQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIHRoYW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBjbGlwIGR1cmF0aW9uCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUOiBFbmQgY3V0IHRpbWUgaXMgc21hbGxlciB0aGFuIGJlZ2luIGN1dCB0aW1lCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMOiBOb3QgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIHdob2xlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgYXQgZ2l2ZW4gYml0cmF0ZXMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g6IFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOiAgVmlkZW8gYml0cmF0ZSB0b28gbG93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNE1DU19BUElfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0Vycm9yQ29kZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0Vycm9yQ29kZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzA0MmRiYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19FcnJvckNvZGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQVBJLmgKLSAqIEBicmllZiAgTUNTIGVycm9yIGNvZGVzIGRlZmluaXRpb25zIChNZWRpYSBDb21wcmVzc29yIFNlcnZpY2UpCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotI2lmbmRlZiBfX000TUNTX0Vycm9yQ29kZXNfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfRXJyb3JDb2Rlc19IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCBjb3JlIElEIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFdhcm5pbmcgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBFbmQgb2YgcHJvY2Vzc2luZywgdXNlciBzaG91bGQgbm93IGNhbGwgTTRNQ1NfY2xvc2UoKSAqLwotI2RlZmluZSBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORSAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRNQ1MsIDB4MSkKLS8qIE1lZGlhdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBNQ1MgKi8KLSNkZWZpbmUgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRNQ1MsIDB4MikKLS8qIEluZGljYXRlIHRoYXQgcGljdHVyZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzaXplZCB0byBmaXQgaW50byB0aGUgcmVxdWlyZWQKLSAgIHBhcmFtZXRlcnMgKGZpbGUgc2l6ZSkgKi8KLSNkZWZpbmUgTTRNQ1NfV0FSX1BJQ1RVUkVfQVVUT19SRVNJWkUgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRNQ1MsIDB4MykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEVycm9yIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qIC0tLS0tIE9QRU4gRVJST1JTIC0tLS0tICovCi0KLS8qIFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIG5vIHN1cHBvcnRlZCBzdHJlYW0gKG1heSBiZSBhIGNvcnJ1cHRlZCBmaWxlKSAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgwMSkKLS8qIFRoZSBpbnB1dCBmaWxlIGlzIGludmFsaWQvY29ycnVwdGVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEUgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDAyKQotLyogVGhlIGlucHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9WSURFT19GUkFNRV9TSVpFICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgwMykKLS8qIFRoZSBpbnB1dCB2aWRlbyBmcmFtZSBzaXplIGlzIG5vbiBtdWx0aXBsZSBvZiAxNiAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5QVVRfVklERU9fU0laRV9OT05fWDE2ICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgwNCkKLQotCi0vKiAtLS0tLSBTRVQgT1VUUFVUIFBBUkFNUyBFUlJPUlMgLS0tLS0gKi8KLQotLyogVGhlIG91dHB1dCB2aWRlbyBmb3JtYXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxMCkKLS8qIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDExKQotLyogVGhlIG91dHB1dCB2aWRlbyBmcmFtZSByYXRlIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURSAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTIpCi0vKiBUaGUgb3V0cHV0IGF1ZGlvIGZvcm1hdCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDEzKQotLyogVGhlIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nICovCi0jZGVmaW5lIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDE0KQotLyogVGhlIG91dHB1dCB2aWRlbyBmcmFtZSByYXRlIHBhcmFtZXRlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nCi0gICAoSXQgY2FuJ3QgaGFwcGVuIGluIGN1cnJlbnQgdmVyc2lvbiBvZiBNQ1MhKSAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9SQVRFX0ZPUl9IMjYzICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxNSkKLS8qIEEgbnVsbCBjbGlwIGR1cmF0aW9uIGFzIGJlZW4gY29tcHV0ZWQsIHdoaWNoIGlzIHVudmFsaWQgKHNob3VsZCBuZXZlciBoYXBwZW4hKSAqLwotI2RlZmluZSBNNE1DU19FUlJfRFVSQVRJT05fSVNfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxNikKLS8qIFRoZSAubXA0IGNvbnRhaW5lciBjYW5ub3QgaGFuZGxlIGgyNjMgY29kZWMgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0gyNjNfRk9SQklEREVOX0lOX01QNF9GSUxFICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTcpCi0KLQotLyogLS0tLS0gUFJFUEFSRSBERUNPREVSUyBFUlJPUlMgLS0tLS0gKi8KLQotLyogSDI2MyBQcm9maWxlIChvdGhlciB0aGFuIDApIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MjApCi0vKiBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBhbiBBQUMgYXVkaW8gdHJhY2sgd2l0aCBhbiBpbnZhbGlkIHNhbXBsaW5nIGZyZXF1ZW5jeQotICAgKHNob3VsZCBuZXZlciBoYXBwZW4pICovCi0jZGVmaW5lIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1kgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDIxKQotLyogVGhlIGF1ZGlvIGNvbnZlcnNpb24gKEFBQyB0byBBTVItTkIsIG9yIE1QMykgZmFpbGVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9BVURJT19DT05WRVJTSU9OX0ZBSUxFRCAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDIyKQotCi0KLS8qIC0tLS0tIFNFVCBFTkNPRElORyBQQVJBTVMgRVJST1JTIC0tLS0tICovCi0KLS8qIEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuIHRoZSBpbnB1dCBjbGlwIGR1cmF0aW9uICovCi0jZGVmaW5lIE00TUNTX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04gICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDMwKQotLyogQmVnaW4gY3V0IGFuZCBFbmQgY3V0IGFyZSBlcXVhbHMgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVCAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzEpCi0vKiBFbmQgY3V0IHRpbWUgaXMgc21hbGxlciB0aGFuIGJlZ2luIGN1dCB0aW1lICovCi0jZGVmaW5lIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDMyKQotLyogTm90IGVub3VnaCBzcGFjZSB0byBzdG9yZSB3aG9sZSBvdXRwdXQgZmlsZSBhdCBnaXZlbiBiaXRyYXRlcyAqLwotI2RlZmluZSBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzMykKLS8qIFZpZGVvIGJpdHJhdGUgaXMgdG9vIGxvdyAoYXZvaWQgdWdseSB2aWRlbykgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzQpCi0vKiBBdWRpbyBiaXRyYXRlIGlzIHRvbyBsb3cgKDE2IGticHMgbWluIGZvciBhYWMsIDEyLjIgZm9yIGFtciwgOCBmb3IgbXAzKSAqLwotI2RlZmluZSBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1cgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzNSkKLS8qIFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKSAqLwotI2RlZmluZSBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19ISUdIICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzNikKLS8qIEF1ZGlvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDk2IGticHMpICovCi0jZGVmaW5lIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0ggICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDM3KQotCi0vKiAtLS0tLSBPVEhFUlMgRVJST1JTIC0tLS0tICovCi0jZGVmaW5lIE00TUNTX0VSUl9PVVRQVVRfRklMRV9TSVpFX1RPT19TTUFMTCAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDUwKQotI2RlZmluZSBNNE1DU19FUlJfTk9NT1JFX1NQQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00TUNTLCAweDUxKQotI2RlZmluZSBNNE1DU19FUlJfRklMRV9EUk1fUFJPVEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00TUNTLCAweDUyKQotI2VuZGlmIC8qIF9fTTRNQ1NfRXJyb3JDb2Rlc19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxDb25maWcuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsQ29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmYWYxZTYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxDb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX0FQSS5oCi0gKiBAYnJpZWYgIE1DUyBpbnRlcm5hbCBjb25zdGFudCB2YWx1ZXMgc2V0dGluZ3MKLSAqIEBub3RlICAgVGhpcyBoZWFkZXIgZmlsZSBpcyBub3QgcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqLwotCi0jaWZuZGVmIF9fTTRNQ1NfSU5URVJOQUxDT05GSUdfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfSU5URVJOQUxDT05GSUdfSF9fCi0KLQotLyoqCi0gKiBEZWZpbml0aW9uIG9mIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00TUNTX0FVRElPX01BWF9DSFVOS19TSVpFICAgICAgICA3MTY4IC8qKjwgYWRkIG1wMyBlbmNvZGVyIGFuZCB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IGJpdHJhdGUgaXMgbm93IDMyMGticHMgaW5zdGVhZCBvZiAxMjhrYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhpcyB2YWx1ZSBoYXMgdG8gYmUgaW5jcmVhc2VkIGFjY29yZGluZ2x5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoKHNpemVvZihNNE9TQV9VSW50OCkqbWF4X2NoYW5uZWxfbnVtYmVyKSszCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGFrZSBhIG1hcmdpbihhZnRlciB0ZXN0cywgMiB3YXMgbm90IGVub3VnaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKk1BWF9QQ01fR1JBTlVMQVJJVFlfU0FNUExFUyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCZWZvcmU6IDQwMDAqLy8qKjwgTWFnaWNhbCAqLwotCi0vKioKLSAqIFZpZGVvIG1heCBBVSBhbmQgZnJhZ21lbnQgc2l6ZSAqLwotI2RlZmluZSBNNE1DU19WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8gICAwLjggLyoqPCBNYWdpY2FsLiBVc2VkIHRvIGRlZmluZSB0aGUgbWF4IEFVIHNpemUgKi8KLSNkZWZpbmUgTTRNQ1NfVklERU9fQ0hVTktfQVVfU0laRV9SQVRJTyAgICAgMS4yIC8qKjwgTWFnaWNhbC4gVXNlZCB0byBkZWZpbmUgdGhlIG1heCBjaHVuayBzaXplICovCi0KLS8qKgotICogVmFyaW91cyBNYWdpY2FscyAqLwotI2RlZmluZSBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lEICAgICAgICAxCi0jZGVmaW5lIE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQgICAgICAgIDIKLQotLyoqCi0gKiBHcmFudWxhcml0eSBmb3IgYXVkaW8gZW5jb2RlciAqLwotIC8qKjwgbWluaW11bSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwYXNzIGluIEFNUiBlbmNvZGluZyBjYXNlICovCi0jZGVmaW5lIE00TUNTX1BDTV9BTVJfR1JBTlVMQVJJVFlfU0FNUExFUyAxNjAKLS8qKjwgbWluaW11bSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwYXNzIGluIEFBQyBlbmNvZGluZyBjYXNlICovCi0jZGVmaW5lIE00TUNTX1BDTV9BQUNfR1JBTlVMQVJJVFlfU0FNUExFUyAxMDI0Ci0vKio8IG1pbmltdW0gbnVtYmVyIG9mIHNhbXBsZXMgdG8gcGFzcyBpbiBNUDMgZW5jb2RpbmcgY2FzZSAqLwotI2RlZmluZSBNNE1DU19QQ01fTVAzX0dSQU5VTEFSSVRZX1NBTVBMRVMgNTc2Ci0KLSNkZWZpbmUgTTRNQ1NfQVVESU9fTUFYX0FVX1NJWkUgICAgICAgICAgIDEwMjQgIC8qKjwgYWRkIG1wMyBlbmNvZGVyIGFuZCB3cml0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgbm90IHVzZWQgYW55bW9yZSwgbm93IHRoZSBtYXggQVUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgaXMgY29tcHV0ZWQgZHluYW1pY2FsbHkgYWNjb3JkaW5nIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGNoYW5uZWxzLHRoZSBtYXggUENNIGdyYW51bGFyaXR5IHNhbXBsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGEgbWFyZ2luLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJlZm9yZTogMTAyNCovLyoqPCBNYWdpY2FsICovCi0vKioKLSAqIFdyaXRlciBmaWxlIGFuZCBtb292IHNpemUgZXN0aW1hdGlvbiAqLwotI2RlZmluZSBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8gICAgMS4wNCAgLyoqPCBtYWdpY2FsIG1vb3Ygc2l6ZSBpcyBsZXNzIHRoYW4gNCUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgZmlsZSBzaXplIGluIGF2ZXJhZ2UgKi8KLQotLyoqCi0gKiBJZiAzZ3AgZmlsZSBkb2VzIG5vdCBjb250YWluIGFuIFNUU1MgdGFibGUgKG5vIHJhcCBmcmFtZXMpLAotICAganVtcCBiYWNrd2FyZCB0byBhIHNwZWNpZmllZCBsaW1pdCAqLwotI2RlZmluZSBNNE1DU19OT19TVFNTX0pVTVBfUE9JTlQgICAgICAgICAgNDAwMDAgLyoqPCA0MCBzICovCi0KLSNlbmRpZiAvKiBfX000TUNTX0lOVEVSTkFMQ09ORklHX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbEZ1bmN0aW9ucy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjFjNjc5ZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbEZ1bmN0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaAotICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGludGVybmFsCi0gKiAgICAgICAgICB0byB0aGUgTUNTLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fTTRNQ1NfSU5URVJOQUxGVU5DVElPTlNfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfSU5URVJOQUxGVU5DVElPTlNfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIk00VlBQX0FQSS5oIgotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRBcHBseVZQUCggTTRWUFBfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotICogQGJyaWVmICAgRG8gdGhlIHZpZGVvIHJlbmRlcmluZyBhbmQgdGhlIHJlc2l6ZSAoaWYgbmVlZGVkKQotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAoSU4pICAgICBWUFAgY29udGV4dCwgd2hpY2ggYWN0dWFsbHkgaXMgdGhlIE1DUwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgcFBsYW5lSW4gICAgKElOKSAgICAgQ29udGFpbnMgdGhlIGltYWdlCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbiB0aGUgb3V0cHV0IFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBFUlJfTUNTX1ZJREVPX0RFQ09ERV9FUlJPUjogdGhlIHZpZGVvIGRlY29kaW5nIGZhaWxlZAotICogQHJldHVybiAgRVJSX01DU19SRVNJWkVfRVJST1I6ICAgICAgIHRoZSByZXNpemluZyBmYWlsZWQKLSAqIEByZXR1cm4gIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfaW50QXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX1N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICAgaW4gdGhlIE1DUy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBDbGVhciBlbmNvZGVycywgZGVjb2RlcnMsIHJlYWRlciBhbmQgd3JpdGVycyBpbnRlcmZhY2VzIHRhYmxlcwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfY2xlYXJJbnRlcmZhY2VUYWJsZXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlcldyaXRlcihNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgTWVkaWFUeXBlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlICpwV3RyR2xvYmFsSW50ZXJmYWNlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSAqcFd0ckRhdGFJbnRlcmZhY2UpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgICAgY29udGV4dCB0aGUgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgcENvbnRleHQscFd0ckdsb2JhbEludGVyZmFjZSBvciBwV3RyRGF0YUludGVyZmFjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KSwgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlcldyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqIHBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3RyRGF0YUludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJFbmNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgbWVkaWFUeXBlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyB2aWRlbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICAgIGNvbnRleHQgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IG1lZGlhVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgYXVkaW8gZW5jb2Rlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsCi0gKiAgICAgICAgICBjb250ZXh0IHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgICAgICAgICAoSU4pICAgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICBtZWRpYVR5cGU6ICAgICAgICAgICAgICAoSU4pICAgVGhlIG1lZGlhIHR5cGUuCi0gKiBAcGFyYW0gICBwRW5jR2xvYmFsSW50ZXJmYWNlOiAgICAoT1VUKSAgVGhlIGVuY29kZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucy4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFJlZ2lzdGVyIHJlYWRlci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclJlYWRlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlIG1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFJlZ2lzdGVyIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgZGVjb2RlclR5cGUgICAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgIHBEZWNvZGVySW50ZXJmYWNlICAgIChJTikgRGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpLG9yIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyIHR5cGUgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgUmVnaXN0ZXIgYXVkaW8gZGVjb2RlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFseSBieSB0aGUgTUNTIHRvIHJlZ2lzdGVyIENvcmUgYXVkaW8gZGVjb2RlcnMsCi0gKiBAcGFyYW0gICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSAgICAgQXVkaW8gZGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICBwRGVjb2RlckludGVyZmFjZSAgKElOKSAgICAgQXVkaW8gZGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICBBIHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRBRF9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgVW5yZWdpc3RlciB3cml0ZXIKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFVucmVnaXN0ZXIgdGhlIGVuY29kZXJzCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRW5jb2RlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgVW5yZWdpc3RlciByZWFkZXIKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFVucmVnaXN0ZXIgdGhlIGRlY29kZXJzCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRGVjb2RlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgU2V0IGN1cnJlbnQgd3JpdGVyCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRXcml0ZXIoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBTZXQgYW4gYXVkaW8gZW5jb2RlcgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0IG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFNldCBjdXJyZW50IHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFJlYWRlciggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9EZWNvZGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQ29udGV4dCkKLSAqIEBicmllZiAgICBDaGVjayBpZiBhbiBlZmZlY3QgaGFzIHRvIGJlIGFwcGxpZWQgY3VycmVudGx5Ci0gKiBAbm90ZSAgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBzdGVwRW5jb2RpbmcgZnVuY3Rpb24KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pICAgTUNTIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQXVkaW9FZmZlY3RzKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluKCkKLSAqIEBicmllZiAgICBBcHBseSBhdWRpbyBlZmZlY3QgRmFkZUluIHRvIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQQ01kYXRhICAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgKElOKSAgICAgRWZmZWN0IHByb2dyZXNzCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluKCAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluKCkKLSAqIEBicmllZiAgICBBcHBseSBhdWRpbyBlZmZlY3QgRmFkZUluIHRvIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQQ01kYXRhICAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgKElOKSAgICAgRWZmZWN0IHByb2dyZXNzCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZU91dCggTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNE1DU19JTlRFUk5BTEZVTkNUSU9OU19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxUeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZTRmMjM2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQVBJLmgKLSAqIEBicmllZiAgTUNTIGludGVybmFsIHR5cGVzIGFuZCBzdHJ1Y3R1cmVzIGRlZmluaXRpb25zCi0gKiBAbm90ZSAgIFRoaXMgaGVhZGVyIGZpbGUgaXMgbm90IHB1YmxpYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotI2lmbmRlZiBfX000TUNTX0lOVEVSTkFMVFlQRVNfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfSU5URVJOQUxUWVBFU19IX18KLQotLyoqCi0gKiAgICBNQ1MgcHVibGljIEFQSSBhbmQgdHlwZXMgKi8KLSNpbmNsdWRlICJNNE1DU19BUEkuaCIKLSNpbmNsdWRlICJNNE1DU19FcnJvckNvZGVzLmgiCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLS8qKiBEZXRlcm1pbmUgYWJzb2x1dGUgdmFsdWUgb2YgYS4gKi8KLSNkZWZpbmUgTTRNQ1NfQUJTKGEpICAgICAgICAgICAgICAgKCAoIChhKSA8ICgwKSApID8gKC0oYSkpIDogKGEpICkKLQotCi0jZGVmaW5lIFlfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4MDAKLSNkZWZpbmUgVV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHg4MAotI2RlZmluZSBWX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0KLQotLyoqCi0gKiAgICBJbnRlcm5hbGx5IHVzZWQgbW9kdWxlcyAqLwotI2luY2x1ZGUgIk00UkVBREVSXzNncENvbS5oIiAgICAgICAgLyoqPCBSZWFkIDNHUFAgZmlsZSAgICAgKi8KLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiICAgICAgIC8qKjwgRGVjb2RlIHZpZGVvICAgICAgICovCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIgICAgICAvKio8IFZpZGVvIHJlc2l6ZSAgICAgICAqLwotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiICAgICAgICAgICAgLyoqPCBEZWNvZGVyIGF1ZGlvICAgICAgKi8KLSNpbmNsdWRlICJTU1JDLmgiICAgICAgICAgICAgICAgICAgIC8qKjwgU1NSQyAgICAgICAgICAgICAgICovCi0jaW5jbHVkZSAiRnJvbTJpVG9Nb25vXzE2LmgiICAgICAgICAvKio8IFN0ZXJlbyB0byBNb25vICAgICAqLwotI2luY2x1ZGUgIk1vbm9UbzJJXzE2LmgiICAgICAgICAgICAgLyoqPCBNb25vIHRvIFN0ZXJlbyAgICAgKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIgIC8qKjwgRW5jb2RlIGF1ZGlvICAgICAgICovCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiICAgICAgICAvKio8IFdyaXRlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotCi0vKioKLSAqICBJbnN0ZWFkIG9mIGluY2x1ZGluZyBBQUMgY29yZSBwcm9wZXJ0aWVzLCBpdCBpcyBiZXR0ZXIgdG8gcmVkZWZpbmUgdGhlIG5lZWRlZCB0eXBlCi0gKiAgQUFDX0RFQ19TVFJFQU1fUFJPUFMKLSAqICBJbiBjYXNlIG9mIGV4dGVybmFsIEFBQyBkZWNvZGVyLCBpdCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBwdXQgdGhpcyB0eXBlIGFzIHB1YmxpYwotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0IEFBQ19ERUNfU1RSRUFNX1BST1BTCi0gKiBAYnJpZWYgQUFDIFN0cmVhbSBwcm9wZXJ0aWVzCi0gKiBATm90ZSBhTm9DaGFuIGFuZCBhU2FtcEZyZXEgYXJlIHVzZWQgZm9yIHBhcnNpbmcgZXZlbiB0aGUgdXNlciBwYXJhbWV0ZXJzCi0gKiAgICAgICAgYXJlIGRpZmZlcmVudC4gIFVzZXIgcGFyYW1ldGVycyB3aWxsIGJlIGlucHV0IGZvciB0aGUgb3V0cHV0IGJlaGF2aW91cgotICogICAgICAgIG9mIHRoZSBkZWNvZGVyIHdoZXJlYXMgZm9yIHBhcnNpbmcgYml0c3RyZWFtIHByb3BlcnRpZXMgYXJlIHVzZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgTTRPU0FfSW50MzIgYUF1ZGlvT2JqZWN0VHlwZTsgICAgIC8qKjwgQXVkaW8gb2JqZWN0IHR5cGUgb2YgdGhlIHN0cmVhbSAtIGluIGZhY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHR5cGUgZm91bmQgaW4gdGhlIEFjY2VzcyBVbml0IHBhcnNlZCAqLwotICBNNE9TQV9JbnQzMiBhTnVtQ2hhbjsgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgY2hhbm5lbHMgKD0xKG1vbm8pIG9yID0yKHN0ZXJlbykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGluZGljYXRlZCBieSBpbnB1dCBiaXRzdHJlYW0qLwotICBNNE9TQV9JbnQzMiBhU2FtcEZyZXE7ICAgICAgICAgICAgLyoqPCBzYW1wbGluZyBmcmVxdWVuY3kgaW4gSHogKi8KLSAgTTRPU0FfSW50MzIgYUV4dGVuc2lvblNhbXBGcmVxOyAgIC8qKjwgZXh0ZW5kZWQgc2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCA9IDAgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZXh0ZW5kZWQgZnJlcXVlbmN5ICovCi0gIE00T1NBX0ludDMyIGFTQlJQcmVzZW50OyAgICAgICAgICAvKio8IHByZXNlbmNlPTEvYWJzZW5jZT0wIG9mIFNCUiAqLwotICBNNE9TQV9JbnQzMiBhUFNQcmVzZW50OyAgICAgICAgICAgLyoqPCBwcmVzZW5jZT0xL2Fic2VuY2U9MCBvZiBQUyAqLwotICBNNE9TQV9JbnQzMiBhTWF4UENNU2FtcGxlc1BlckNoOyAgLyoqPCBtYXggbnVtYmVyIG9mIFBDTSBzYW1wbGVzIHBlciBjaGFubmVsICovCi19IEFBQ19ERUNfU1RSRUFNX1BST1BTOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgICAgQ29kZWNzIHJlZ2lzdHJhdGlvbiBzYW1lIGFzIGluIFZQUyBhbmQgVkVTLCBzbyBsZXNzIG1hcHBpbmcKLSAqICAgICAgICAgICAgICBpcyByZXF1aXJlZCB0b3dhcmQgTUNTIGFwaSB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogcEdsb2JhbEZjdHM7ICAgIC8qKjwgb3BlbiwgY2xvc2UsIHNldG9wdGlvbixldGMuLi4gZnVuY3Rpb25zICovCi0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgcERhdGFGY3RzOyAgICAgICAgLyoqPCBkYXRhIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KLX0gTTRNQ1NfV3JpdGVySW50ZXJmYWNlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNE1DU19TdGF0ZXMKLSAqIEBicmllZiAgICAgICAgTWFpbiBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBNQ1MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tTdGF0ZV9DUkVBVEVELCAgICAgICAgICAgLyoqPCBNNE1DU19pbml0IGhhcyBiZWVuIGNhbGxlZCAgICAgICAgICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9PUEVORUQsICAgICAgICAgICAgLyoqPCBNNE1DU19vcGVuIGhhcyBiZWVuIGNhbGxlZCAgICAgICAgICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9TRVQsICAgICAgICAgICAgICAgLyoqPCBBbGwgbWFuZGF0b3J5IHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHNldCAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9SRUFEWSwgICAgICAgICAgICAgLyoqPCBBbGwgb3B0aW9ubmFsIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHNldCAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPSlVNUCwgICAgLyoqPCBNdXN0IGp1bXAgdG8gdGhlIElmcmFtZSBiZWZvcmUgdGhlIGJlZ2luIGN1dCAqLwotICAgIE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPREVDT0RFLCAgLyoqPCBNdXN0IGRlY29kZSB1cCB0byB0aGUgYmVnaW4gY3V0ICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HLCAgICAgICAgLyoqPCBTdGVwIGNhbiBiZSBjYWxsZWQgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9QQVVTRUQsICAgICAgICAgICAgLyoqPCBQYXVzZWQsIFJlc3VtZSBjYW4gYmUgY2FsbGVkICAgICAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfRklOSVNIRUQsICAgICAgICAgIC8qKjwgVHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgICAgICAgICAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfQ0xPU0VEICAgICAgICAgICAgIC8qKjwgT3V0cHV0IGZpbGUgaGFzIGJlZW4gY3JlYXRlZCAgICAgICAgICAgICovCi19IE00TUNTX1N0YXRlczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRNQ1NfU3RyZWFtU3RhdGUKLSAqIEBicmllZiAgICAgICAgU3RhdGUgb2YgYSBtZWRpYSBzdHJlYW0gZW5jb2RpbmcgKGF1ZGlvIG9yIHZpZGVvKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNICA9IDAsICAgIC8qKjwgTm8gc3RyZWFtIHByZXNlbnQgICAgICAgICAgICAgICAgICAgICovCi0gICAgTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQgICA9IDEsICAgIC8qKjwgVGhlIHN0cmVhbSBlbmNvZGluZyBpcyBpbiBwcm9ncmVzcyAqLwotICAgIE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRCAgPSAyICAgIC8qKjwgVGhlIHN0cmVhbSBoYXMgZmluaXNoZWQgZW5jb2RpbmcgICAgKi8KLX0gTTRNQ1NfU3RyZWFtU3RhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgYW5vbnltb3VzIGVudW0KLSAqIEBicmllZiAgICAgICAgZW51bSB0byBrZWVwIHRyYWNrIG9mIHRoZSBlbmNvZGVyIHN0YXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLWVudW0KLXsKLSAgICBNNE1DU19rTm9FbmNvZGVyLAotICAgIE00TUNTX2tFbmNvZGVyQ2xvc2VkLAotICAgIE00TUNTX2tFbmNvZGVyU3RvcHBlZCwKLSAgICBNNE1DU19rRW5jb2RlclJ1bm5pbmcKLX07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TUNTX0ludGVybmFsQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBNQ1MgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgTUNTIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgIGJpdFBvczsKLSAgICAgICAgICAgICAgICAgLyogYml0IGNvdW50IG9mIG51bWJlciBvZiBiaXRzIHVzZWQgc28gZmFyICovCi0KLSAgICBNNE9TQV9VSW50OCAgICpzdHJlYW1CdWZmZXI7Ci0gICAgICAgICAgICAgICAgLyogQml0c3RyZWFtIEJ1ZmZlciAqLwotCi0gICAgTTRPU0FfVUludDMyICAgIGJ5dGVDbnQ7Ci0gICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIEJ5dGVzIHdyaXR0ZW4gaW4gQml0c3RyZWFtIGJ1ZmZlciovCi0KLSAgICBNNE9TQV9VSW50MzIgICAgY3VyckJ1ZmY7Ci0gICAgICAgICAgICAgICAgLyogQ3VycmVudCBidWZmZXIgaG9sZHMsIDRieXRlcyBvZiBiaXRzdHJlYW0qLwotCi0gICAgTTRPU0FfVUludDggICBwcmV2Qnl0ZTsKLSAgICAgICAgICAgICAgICAvKiBQcmV2aW91cyBieXRlIHdyaXR0ZW4gaW4gdGhlIGJ1ZmZlciAqLwotCi0gICAgTTRPU0FfVUludDggICBwcmV2UHJldkJ5dGU7Ci0gICAgICAgICAgICAgICAgLyogUHJldmlvdXMgdG8gcHJldmlvdXMgYnl0ZSB3cml0dGVuIGluIHRoZSBidWZmZXIgKi8KLQotfU5TV0FWQ19iaXRTdHJlYW1fdF9NQ1M7Ci0KLSNkZWZpbmUgX01BWG51bV9zbGljZV9ncm91cHMgIDgKLSNkZWZpbmUgX01BWG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgIDI1NgotCi10eXBlZGVmIHN0cnVjdAotewotICBNNE9TQV9VSW50MzIgIGxldmVsX2lkY19pbmRleDsKLSAgTTRPU0FfVUludDMyICBNYXhGcmFtZU51bTsKLSAgTTRPU0FfVUludDMyICBleHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZTsKLSAgTTRPU0FfSW50MzIgICBNYXhQaWNPcmRlckNudExzYjsKLSAgTTRPU0FfSW50MzIgICBtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZzsKLQotICAvKiAocGljX29yZGVyX2NudF90eXBlID09IDEpICovCi0gIE00T1NBX0ludDMyICAgb2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKLSAgTTRPU0FfSW50MzIgICBvZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQ7Ci0gIE00T1NBX0ludDMyICAgZnJhbWVfY3JvcF9sZWZ0X29mZnNldDsKLSAgTTRPU0FfSW50MzIgICBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldDsKLSAgTTRPU0FfSW50MzIgICBmcmFtZV9jcm9wX3RvcF9vZmZzZXQ7Ci0gIE00T1NBX0ludDMyICAgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0OwotICBNNE9TQV9JbnQzMiAgIG9mZnNldF9mb3JfcmVmX2ZyYW1lW19NQVhudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlXTsKLQotICBNNE9TQV9VSW50MTYgUGljV2lkdGhJbk1iczsKLSAgTTRPU0FfVUludDE2IEZyYW1lSGVpZ2h0SW5NYnM7Ci0gIE00T1NBX1VJbnQxNiAgcGljX3dpZHRoX2luX21ic19taW51czE7Ci0gIE00T1NBX1VJbnQxNiAgcGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxOwotCi0jaWZkZWYgX0NBUF9GTU9fCi0gIE00T1NBX1VJbnQxNiBOdW1TbGljZUdyb3VwTWFwVW5pdHM7Ci0gIE00T1NBX1VJbnQxNiBNYXhQaWNTaXplSW5NYnM7Ci0jZW5kaWYgLypfQ0FQX0ZNT18qLwotCi0gIE00T1NBX1VJbnQ4ICAgcHJvZmlsZV9pZGM7Ci0gIE00T1NBX1VJbnQ4ICAgcmVzZXJ2ZWRfemVyb180Yml0czsKLSAgTTRPU0FfVUludDggICBsZXZlbF9pZGM7Ci0gIE00T1NBX1VJbnQ4ICAgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gIE00T1NBX1VJbnQ4ICAgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKLSAgTTRPU0FfVUludDggICBwaWNfb3JkZXJfY250X3R5cGU7Ci0gIC8qIGlmKHBpY19vcmRlcl9jbnRfdHlwZSA9PSAwKSAqLwotICBNNE9TQV9VSW50OCAgIGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNDsKLQotICBNNE9TQV9VSW50OCAgIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7Ci0gIC8qIGZvciggaSA9IDA7IGkgPCBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyBpKysgKSAqLwotICBNNE9TQV9VSW50OCAgIG51bV9yZWZfZnJhbWVzOwotCi0gIE00T1NBX0Jvb2wgICAgY29uc3RyYWludF9zZXQwX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgY29uc3RyYWludF9zZXQxX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgY29uc3RyYWludF9zZXQyX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgY29uc3RyYWludF9zZXQzX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgZ2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnOwotICBNNE9TQV9Cb29sICAgIGZyYW1lX21ic19vbmx5X2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgbWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBkaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnOwotICBNNE9TQV9Cb29sICAgIGZyYW1lX2Nyb3BwaW5nX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgdnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOwotICBNNE9TQV9Cb29sICAgIEFjdGl2ZTsKLQotICAvKiB2dWlfc2VxX3BhcmFtZXRlcnNfdCB2dWlfc2VxX3BhcmFtZXRlcnM7ICovCi19IENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTOwotCi10eXBlZGVmIHN0cnVjdAotewotICBNNE9TQV9JbnQxNiAgICAgICBwaWNfaW5pdF9xcF9taW51czI2OwotICBNNE9TQV9JbnQxNiAgICAgICBwaWNfaW5pdF9xc19taW51czI2OwotICBNNE9TQV9JbnQxNiAgICAgICBjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0OwotCi0vLyNpZmRlZiBfQ0FQX0ZNT18KLSAgLyogaWYoIHNsaWNlX2dyb3VwX21hcF90eXBlID0gPSAwICkgKi8KLSAgTTRPU0FfVUludDE2ICAgICAgcnVuX2xlbmd0aF9taW51czFbX01BWG51bV9zbGljZV9ncm91cHNdOwotICAvKiBlbHNlIGlmKCBzbGljZV9ncm91cF9tYXBfdHlwZSA9ID0gMiApICovCi0gIE00T1NBX1VJbnQxNiAgICAgIHRvcF9sZWZ0W19NQVhudW1fc2xpY2VfZ3JvdXBzXTsKLSAgTTRPU0FfVUludDE2ICAgICAgYm90dG9tX3JpZ2h0W19NQVhudW1fc2xpY2VfZ3JvdXBzXTsKLSAgLyogZWxzZSBpZiggc2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSA9IDYgKSAqLwotICBNNE9TQV9VSW50MTYgICAgICBwaWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxOwotICBNNE9TQV9VSW50MTYgICAgICBzbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czE7Ci0KLSAgTTRPU0FfVUludDE2IEZpcnN0TWJJblNsaWNlR3JvdXBbX01BWG51bV9zbGljZV9ncm91cHNdOwotICBNNE9TQV9VSW50MTYgTGFzdE1iSW5TbGljZUdyb3VwW19NQVhudW1fc2xpY2VfZ3JvdXBzXTsKLQotCi0gIE00T1NBX1VJbnQ4ICAqc2xpY2VfZ3JvdXBfaWQ7Ci0gIE00T1NBX1VJbnQ4ICAqTWFwVW5pdFRvU2xpY2VHcm91cE1hcDsKLSAgTTRPU0FfVUludDggICpNYlRvU2xpY2VHcm91cE1hcDsKLSAgTTRPU0FfVUludDE2ICBOdW1TbGljZUdyb3VwTWFwVW5pdHM7Ci0KLSAgTTRPU0FfVUludDggICAgICAgc2xpY2VfZ3JvdXBfbWFwX3R5cGU7Ci0gIC8qIGVsc2UgaWYoIHNsaWNlX2dyb3VwX21hcF90eXBlID0gPSAzIHx8IDQgfHwgNSAqLwotICBNNE9TQV9Cb29sICAgICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICBtYXBfaW5pdGlhbGl6ZWQ7Ci0vLyAjZW5kaWYgLypfQ0FQX0ZNT18qLwotCi0gIE00T1NBX1VJbnQ4ICAgICAgIHBpY19wYXJhbWV0ZXJfc2V0X2lkOwotICBNNE9TQV9VSW50OCAgICAgICBzZXFfcGFyYW1ldGVyX3NldF9pZDsKLSAgTTRPU0FfVUludDggICAgICBudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxOwotICBNNE9TQV9VSW50OCAgICAgIG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE7Ci0gIE00T1NBX1VJbnQ4ICAgICAgIHdlaWdodGVkX2JpcHJlZF9pZGM7Ci0gIE00T1NBX1VJbnQ4ICAgICAgIG51bV9zbGljZV9ncm91cHNfbWludXMxOwotCi0gIE00T1NBX0Jvb2wgICAgICAgIGVudHJvcHlfY29kaW5nX21vZGVfZmxhZzsKLSAgLyogaWYoIHBpY19vcmRlcl9jbnRfdHlwZSA8IDIgKSAgaW4gdGhlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgKi8KLSAgTTRPU0FfQm9vbCAgICAgICAgcGljX29yZGVyX3ByZXNlbnRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICAgICAgd2VpZ2h0ZWRfcHJlZF9mbGFnOwotICBNNE9TQV9Cb29sICAgICAgICBkZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICAgICAgY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnOwotICBNNE9TQV9Cb29sICAgICAgICByZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgQWN0aXZlOwotCi0gIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICpwX2FjdGl2ZV9zcHM7Ci19IENvbVBpY3R1cmVQYXJhbWV0ZXJTZXRfdF9NQ1M7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgICBNNE9TQV9VSW50MzIgYml0UG9zOyAgICAgICAgICAgICAgICAvKiE8IGJpdCBwb3NpdGlvbiBpbiBidWZmZXIgKi8KLSAgICAgIE00T1NBX1VJbnQzMiB0b3RhbEJpdHM7ICAgICAgICAgICAgIC8qITwgYml0IHBvc2l0aW9uIGluIGZpbGUgKHRvdGFsIGJpdHMgcmVhZCBzbyBmYXIpICovCi0KLSAgICAgIE00T1NBX1VJbnQzMiBsYXN0VG90YWxCaXRzOyAgICAgICAgIC8qITwgYml0IHBvc2l0aW9uIGluIGZpbGUgb2YgdGhlIGxhc3QgVk9QICovCi0gICAgICBNNE9TQV9VSW50MzIgbnVtQml0c0luQnVmZmVyOyAgICAgICAvKiE8IG51bWJlciBvZiBiaXRzIGluIGJ1ZmZlciAqLwotICAgICAgTTRPU0FfVUludDMyIHJlYWRhYmxlQnl0ZXNJbkJ1ZmZlcjsgLyohPCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBpbiBkZWNvZGVyIGJ1ZmZlciovCi0gICAgICBNNE9TQV9VSW50MzIgbWF4QnVmZmVyU2l6ZTsgICAgICAgICAvKiE8IG1heCBidWZmZXIgc2l6ZSBpbiBiaXQgdW5pdHMgKi8KLSAgICAgIE00T1NBX1VJbnQ4ICAqQnVmZmVyOyAgICAgICAgICAgICAgIC8qITwgY2hhciBidWZmZXIgYXQgcmVhZGluZyBmcm9tIGZpbGUgKi8KLSAgICAgIE00T1NBX0ludDMyICAgICBpOEJpdENudDsKLSAgICAgIE00T1NBX1VJbnQzMiAgICAgdWkzMlRlbXBCdWZmOwotICAgICAgTTRPU0FfSW50OCpwdWk4QmZyUHRyOwotICAgICAgTTRPU0FfVUludDMyICAgIHVpMzJMYXN0VHdvQnl0ZXM7ICAvKiE8IHN0b3JlcyB0aGUgbGFzdCByZWFkIHR3byBieXRlcyAqLwotfSBDb21CaXRTdHJlYW1NQ1NfdDsKLQotCi10eXBlZGVmIHN0cnVjdAotewotCi0gICAgTTRPU0FfSW50MzIgcHJldl9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgY3VyX2ZyYW1lX251bTsKLSAgICBNNE9TQV9JbnQzMiBwcmV2X25ld19mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKLSAgICBNNE9TQV9JbnQzMiBpc19kb25lOwotICAgIE00T1NBX0ludDMyIGlzX2ZpcnN0OwotICAgIE00T1NBX0ludDMyIGZyYW1lX2NvdW50OwotICAgIE00T1NBX0ludDMyIGZyYW1lX21vZF9jb3VudDsKLSAgICBNNE9TQV9JbnQzMiBQT0NfbHNiOwotICAgIE00T1NBX0ludDMyIFBPQ19sc2JfbW9kOwotCi0KLSAgICBNNE9TQV9VSW50MzIgICAgbV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aDsKLQotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvOyAgIC8qKjwgUG9pbnRlciBvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY3JlYXRlIGEgZGVjb2RlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOy8qKjwgU2l6ZSBvZiB0aGUgc3BlY2lmaWMgaW5mb3JtYXRpb24gcG9pbnRlciBhYm92ZSovCi0KLSAgICBNNE9TQV9VSW50OCogICAgbV9wRW5jb2RlclNQUzsKLSAgICBNNE9TQV9VSW50MzIgICAgbV9lbmNvZGVyU1BTU2l6ZTsKLQotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BFbmNvZGVyUFBTOwotICAgIE00T1NBX1VJbnQzMiAgICBtX2VuY29kZXJQUFNTaXplOwotCi0gICAgTTRPU0FfVUludDgqICAgIG1fcEZpbmFsRFNJOwotICAgIE00T1NBX1VJbnQzMiAgICBtX3BGaW5hbERTSVNpemU7Ci0KLSAgICBNNE9TQV9VSW50MzIgICAgbV9lbmNvZGVyX1NQU19DbnQ7Ci0gICAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgKnBfY2xpcF9zcHM7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fZW5jb2Rlcl9QUFNfQ250OwotICAgIENvbVBpY3R1cmVQYXJhbWV0ZXJTZXRfdF9NQ1MgICpwX2NsaXBfcHBzOwotCi0gICAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgKnBfZW5jb2Rlcl9zcHM7Ci0gICAgQ29tUGljdHVyZVBhcmFtZXRlclNldF90X01DUyAgKnBfZW5jb2Rlcl9wcHM7Ci0KLQotICAgIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICBlbmNvZGVyX3NwczsKLSAgICBDb21QaWN0dXJlUGFyYW1ldGVyU2V0X3RfTUNTICAgZW5jb2Rlcl9wcHM7Ci0gICAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgIGNsaXBfc3BzOwotCi0gICAgLyogRW5jb2RlciBTUFMgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX1VJbnQzMiBlbmNfc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDMyIGVuY19sb2cyX21heF9mcmFtZV9udW1fbWludXM0OwotICAgIE00T1NBX1VJbnQzMiBlbmNfcGljX29yZGVyX2NudF90eXBlOwotICAgIE00T1NBX1VJbnQzMiBlbmNfbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0OyAvKiBhcHBsaWNhYmxlIHdoZW4gUE9DIHR5cGUgPSAwICovCi0gICAgTTRPU0FfVUludDMyIGVuY19kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZzsKLSAgICBNNE9TQV9JbnQzMiBlbmNfb2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKLSAgICBNNE9TQV9JbnQzMiBlbmNfb2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkOwotICAgIE00T1NBX1VJbnQzMiBlbmNfbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsgLyogcmFuZ2UgMCB0byAyNTUgKi8KLSAgICAvKiBhcnJheSBvZiBzaXplIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgIGVuY19vZmZzZXRfZm9yX3JlZl9mcmFtZVsyNTZdOwotICAgIE00T1NBX1VJbnQzMiBlbmNfbnVtX3JlZl9mcmFtZXM7Ci0gICAgTTRPU0FfVUludDMyIGVuY19nYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWc7Ci0KLQotICAgIC8qIElucHV0IGNsaXAgU1BTIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9VSW50MzIgY2xpcF9zZXFfcGFyYW1ldGVyX3NldF9pZDsKLSAgICBNNE9TQV9VSW50MzIgY2xpcF9sb2cyX21heF9mcmFtZV9udW1fbWludXM0OwotICAgIE00T1NBX1VJbnQzMiBjbGlwX3BpY19vcmRlcl9jbnRfdHlwZTsKLSAgICBNNE9TQV9VSW50MzIgY2xpcF9sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQ7IC8qIGFwcGxpY2FibGUgd2hlbiBQT0MgdHlwZSA9IDAgKi8KLSAgICBNNE9TQV9VSW50MzIgY2xpcF9kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZzsKLSAgICBNNE9TQV9JbnQzMiAgY2xpcF9vZmZzZXRfZm9yX25vbl9yZWZfcGljOwotICAgIE00T1NBX0ludDMyICBjbGlwX29mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZDsKLSAgICBNNE9TQV9VSW50MzIgY2xpcF9udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyAvKiByYW5nZSAwIHRvIDI1NSAqLwotICAgIC8qIGFycmF5IG9mIHNpemUgbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSAqLwotICAgIE00T1NBX0ludDMyICBjbGlwX29mZnNldF9mb3JfcmVmX2ZyYW1lWzI1Nl07Ci0gICAgTTRPU0FfVUludDMyIGNsaXBfbnVtX3JlZl9mcmFtZXM7Ci0gICAgTTRPU0FfVUludDMyIGNsaXBfZ2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnOwotCi0gICAgTTRPU0FfVUludDMyIGZpbmFsX1BQU19JRDsKLSAgICBNNE9TQV9VSW50MzIgZmluYWxfU1BTX0lEOwotICAgIE5TV0FWQ19iaXRTdHJlYW1fdF9NQ1MgIGVuY2JzOwotCi19IE5TV0FWQ19NQ1NfdDsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TUNTX0ludGVybmFsQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIE1DUyBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBNQ1MgY2FsbHMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiBNQ1MgU3RhdGUgYW5kIHNldHRpbmdzIHN0dWZmICovCi0gICAgTTRNQ1NfU3RhdGVzICAgICAgICAgICAgU3RhdGU7ICAgICAvKio8IE1DUyBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIE00TUNTX1N0cmVhbVN0YXRlICAgICAgIFZpZGVvU3RhdGU7LyoqPCBTdGF0ZSBvZiB0aGUgdmlkZW8gZW5jb2RpbmcgKi8KLSAgICBNNE1DU19TdHJlYW1TdGF0ZSAgICAgICBBdWRpb1N0YXRlOy8qKjwgU3RhdGUgb2YgdGhlIGF1ZGlvIGVuY29kaW5nICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbm9hdWRpbzsvKio8IEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBhdWRpbyB0cmFuc2NvZGluZyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG5vdmlkZW87LyoqPCBGbGFnIHRvIGtub3cgaWYgd2UgaGF2ZSB0byBkZWFsIHdpdGggdmlkZW8gdHJhbnNjb2RpbmcgKi8KLQotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICBJbnB1dEZpbGVQcm9wZXJ0aWVzOy8qKjwgSW5wdXQgYXVkaW8vdmlkZW8gc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICBwSW5wdXRGaWxlOyAgICAgICAgICAgICAvKio8IFJlbWVtYmVyIGlucHV0IGZpbGUgcG9pbnRlciBiZXR3ZWVuIGZhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4gYW5kIG5vcm1hbCBvcGVuICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgSW5wdXRGaWxlVHlwZTsgICAgICAgICAgLyoqPCBSZW1lbWJlciBpbnB1dCBmaWxlIHR5cGUgYmV0d2VlbiBmYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuIGFuZCBub3JtYWwgb3BlbiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJGaWxlT3BlbmVkSW5GYXN0TW9kZTsgIC8qKjwgRmxhZyB0byBrbm93IGlmIGEgcGFydGljdWxhciByZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIGZhc3Qgb3BlbiAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpTWF4TWV0YWRhdGFTaXplOyAgICAgIC8qKjwgTGltaXRhdGlvbiBvbiB0aGUgbWF4IGFjY2VwdGFibGUgbW9vdgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBvZiBhIDNncHAgZmlsZSAqLwotCi0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgRW5jb2RpbmdWaWRlb0Zvcm1hdDsgICAgLyoqPCBPdXRwdXQgdmlkZW8gZm9ybWF0LCBzZXQgYnkgdGhlIHVzZXIgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBFbmNvZGluZ1dpZHRoOyAgICAgICAgICAvKio8IE91dHB1dCB2aWRlbyB3aWR0aCwgc2V0IGJ5IHRoZSB1c2VyICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgRW5jb2RpbmdIZWlnaHQ7ICAgICAgICAgLyoqPCBPdXRwdXQgdmlkZW8gaGVpZ2h0LCBzZXQgYnkgdGhlIHVzZXIgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVSYXRlICAgICBFbmNvZGluZ1ZpZGVvRnJhbWVyYXRlOyAvKio8IE91dHB1dCB2aWRlbyBmcmFtZXJhdGUsIHNldCBieSB0aGUgdXNlciovCi0KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aUJlZ2luQ3V0VGltZTsgICAgIC8qKjwgQmVnaW4gY3V0IHRpbWUsIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpRW5kQ3V0VGltZTsgICAgICAgLyoqPCBCZWdpbiBjdXQgdGltZSwgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlNYXhGaWxlU2l6ZTsgICAgICAvKio8IE1heGltdW0gb3V0cHV0IGZpbGUgc2l6ZSwgaW4gYnl0ZXMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZTsgICAgIC8qKjwgVGFyZ2V0ZWQgYXVkaW8gYml0cmF0ZSBpbiBicHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aVZpZGVvQml0cmF0ZTsgICAgIC8qKjwgVGFyZ2V0ZWQgdmlkZW8gYml0cmF0ZSBpbiBicHMgKi8KLQotICAgIE00T1NBX1VJbnQ4ICAgICB1aVByb2dyZXNzOyAgLyoqPCBQcm9ncmVzcyBpbmZvcm1hdGlvbiBzYXZlZCBhdCBlYWNoIHN0ZXAgdG8gYmUgYWJsZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQgaW4gY2FzZSBvZiBwYXVzZSAqLwotCi0gICAgLyoqCi0gICAgICogUmVhZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgcFJlYWRlckNvbnRleHQ7ICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIHJlYWRlciBtb2R1bGUgKi8KLSAgICBNNF9WaWRlb1N0cmVhbUhhbmRsZXIqICBwUmVhZGVyVmlkZW9TdHJlYW07ICAgICAgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHJlYWQgdmlkZW8gc3RyZWFtICovCi0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiAgcFJlYWRlckF1ZGlvU3RyZWFtOyAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSByZWFkIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJVbnN1cHBvcnRlZFZpZGVvRm91bmQ7ICAgLyoqPCBUcnVlIGlmIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBoYXMgYmVlbiBmb3VuZCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJVbnN1cHBvcnRlZEF1ZGlvRm91bmQ7ICAgLyoqPCBUcnVlIGlmIGFuIHVuc3VwcG9ydGVkIGF1ZGlvIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBoYXMgYmVlbiBmb3VuZCAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgIFJlYWRlclZpZGVvQVU7ICAgICAgICAgICAgLyoqPCBSZWFkIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgUmVhZGVyVmlkZW9BVTE7ICAgICAgICAgICAvKio8IFJlYWQgdmlkZW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICBSZWFkZXJWaWRlb0FVMjsgICAgICAgICAgIC8qKjwgUmVhZCB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgIFJlYWRlckF1ZGlvQVU7ICAgICAgICAgICAgLyoqPCBSZWFkIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgUmVhZGVyQXVkaW9BVTE7ICAgICAgICAgICAvKio8IFJlYWQgYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICBSZWFkZXJBdWRpb0FVMjsgICAgICAgICAgIC8qKjwgUmVhZCBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgIG1fcERhdGFBZGRyZXNzMTsgICAgICAgICAgLyoqPCBUZW1wb3JhcnkgYnVmZmVyIGZvciBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgIG1fcERhdGFBZGRyZXNzMjsgICAgICAgICAgLyoqPCBUZW1wb3JhcnkgYnVmZmVyIGZvciBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgIG1fcERhdGFWaWRlb0FkZHJlc3MxOyAgICAgLyoqPCBUZW1wb3JhcnkgYnVmZmVyIGZvciBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgIG1fcERhdGFWaWRlb0FkZHJlc3MyOyAgICAgLyoqPCBUZW1wb3JhcnkgYnVmZmVyIGZvciBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fYXVkaW9BVUR1cmF0aW9uOyAgICAgICAgLyoqPCBBdWRpbyBBVSBkdXJhdGlvbiAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgIGlBdWRpb0N0c09mZnNldDsgICAgICAgICAgLyoqPCBBdWRpbyBBVSBDVFMgb2Zmc2V0IGR1ZSB0byBiZWdpbiBjdXQgKi8KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgcFZpRGVjQ3R4dDsgICAgICAgICAvKio8IFZpZGVvIGRlY29kZXIgY29udGV4dCAqLwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICBkVmlEZWNTdGFydGluZ0N0czsgIC8qKjwgVmlkZW8gQ1RTIGF0IHdoaWNoIHRoZSBkZWNvZGUvZW5jb2RlIHdpbGwgc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VkIGZvciBiZWdpbiBjdXQgYW5kIHBhdXNlL3Jlc3VtZSkgKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgZFZpRGVjQ3VycmVudEN0czsgICAvKio8IFZpZGVvIENUUyB0byBkZWNvZGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgaVZpZGVvQmVnaW5EZWNJbmNyOyAvKio8IENUUyBzdGVwIGZvciB0aGUgYmVnaW4gY3V0IGRlY29kZSAoZG9lc24ndAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uKSAqLwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICBkQ3RzSW5jcmVtZW50OyAgICAgIC8qKjwgQ3RzIGluY3JlbWVudCBmcm9tIG9uZSB2aWRlbyBmcmFtZSB0byBhbm90aGVyKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgaXNSZW5kZXJEdXA7ICAgICAgICAvKio8IFRvIGhhbmRsZSBkdXBsaWNhdGUgZnJhbWUgcmVuZGVyaW5nIGluIGNhc2Ugb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBkZWNvZGluZyAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lKiAgICBsYXN0RGVjb2RlZFBsYW5lOyAgIC8qKjwgTGFzdCBkZWNvZGVkIHBsYW5lICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBlbmNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgIHBWaUVuY0N0eHQ7ICAgICAgICAgLyoqPCBWaWRlbyBlbmNvZGVyIGNvbnRleHQgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgcFByZVJlc2l6ZUZyYW1lOyAgICAvKio8IFRoZSBkZWNvZGVkIGltYWdlIGJlZm9yZSByZXNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBpZiByZXNpemUgbmVlZGVkIG9ubHkpKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgdWlFbmNWaWRlb0JpdHJhdGU7ICAvKio8IEFjdHVhbCB2aWRlbyBiaXRyYXRlIGZvciB0aGUgdmlkZW8gZW5jb2RlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICBvdXRwdXRWaWRlb1RpbWVzY2FsZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgZW5jb2RlclN0YXRlOwotCi0gICAgLyoqCi0gICAgICogQXVkaW8gZGVjb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICBwQXVkaW9EZWNDdHh0OyAgICAgICAgLyoqPCBBdWRpbyAoQUFDKSBkZWNvZGVyIGNvbnRleHQgKi8KLSAgICBNNEFEX0J1ZmZlciAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJJbjsgICAgIC8qKjwgSW5wdXQgc3RydWN0dXJlIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIE00QURfQnVmZmVyICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dDsgICAgLyoqPCBPdXRwdXQgc3RydWN0dXJlIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICBwUG9zSW5EZWNCdWZmZXJPdXQ7ICAgLyoqPCBQb3NpdGlvbiBpbnRvIHRoZSBkZWNvZGVyIGJ1ZmZlciAqLwotICAgIEFBQ19ERUNfU1RSRUFNX1BST1BTICBBYWNQcm9wZXJ0aWVzOyAgIC8qKjwgU3RydWN0dXJlIGZvciBuZXcgYXBpIHRvIGdldCBBQUMgcHJvcGVydGllcyAqLwotCi0gICAgLyoqCi0gICAgICogU2FtcGxlIFJhdGUgQ29udmVydG9yIChTU1JDKSBzdHVmZiAqLwotICAgIFNTUkNfSW5zdGFuY2VfdCAgICAgICAgU3NyY0luc3RhbmNlOyAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIFNzcmMgKi8KLSAgICBTU1JDX1NjcmF0Y2hfdCogICAgICAgIFNzcmNTY3JhdGNoOyAgICAgICAgLyoqPCBXb3JraW5nIG1lbW9yeSBvZiB0aGUgU3NyYyAqLwotICAgIHNob3J0ICAgICAgICAgICAgICAgICAgaVNzcmNOYlNhbXBsSW47ICAgICAvKio8IE51bWJlciBvZiBzYW1wbGUgdGhlIFNzcmMgbmVlZHMgYXMgaW5wdXQgKi8KLSAgICBzaG9ydCAgICAgICAgICAgICAgICAgIGlTc3JjTmJTYW1wbE91dDsgICAgLyoqPCBOdW1iZXIgb2Ygc2FtcGxlIHRoZSBTc3JjIG91dHB1dHMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgIHBTc3JjQnVmZmVySW47ICAgICAgLyoqPCBJbnB1dCBvZiB0aGUgU1NSQyAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgcFNzcmNCdWZmZXJPdXQ7ICAgICAvKio8IE91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgcFBvc0luU3NyY0J1ZmZlckluOyAvKio8IFBvc2l0aW9uIGludG8gdGhlIFNTUkMgaW4gYnVmZmVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICBwUG9zSW5Tc3JjQnVmZmVyT3V0Oy8qKjwgUG9zaXRpb24gaW50byB0aGUgU1NSQyBvdXQgYnVmZmVyICovCi0KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgIHBMVkF1ZGlvUmVzYW1wbGVyOwotCi0KLSAgICAvKioKLSAgICAgKiBhdWRpbyBlbmNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNDdHh0OyAvKio8IENvbnRleHQgb2YgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gIHBBdWRpb0VuY0RTSTsgLyoqPCBEZWNvZGVyIHNwZWNpZmljIGluZm8gYnVpbHQgYnkgdGhlIGVuY29kZXIqLwotICAgIE00RU5DT0RFUl9BdWRpb1BhcmFtcyAgICAgICAgICAgQXVkaW9FbmNQYXJhbXM7LyoqPCBDb25maWcgb2YgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgIHBBdWRpb0VuY29kZXJCdWZmZXI7ICAgICAgLyoqPCBJbnB1dCBvZiB0aGUgZW5jb2RlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgcFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyOyAvKio8IFBvc2l0aW9uIGludG8gdGhlIGVuY29kZXIgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICBhdWRpb0VuY29kZXJHcmFudWxhcml0eTsgIC8qKjwgTWluaW11bSBudW1iZXIgb2YgcGNtIHNhbXBsZXMgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZmVlZCBhdWRpbyBlbmNvZGVyICovCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgIHBXcml0ZXJDb250ZXh0OyAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSB3cml0ZXIgbW9kdWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICBwT3V0cHV0RmlsZTsgICAgICAgIC8qKjwgT3V0cHV0IGZpbGUgdG8gYmUgY3JlYXRlZCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgcFRlbXBvcmFyeUZpbGU7ICAgICAvKio8IFRlbXBvcmFyeSBmaWxlIHRvIGJlIGNyZWF0ZWQgdG8gc3RvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgKCJtb292LmJpbiIpICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gICBXcml0ZXJWaWRlb1N0cmVhbTsgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHdyaXR0ZW4gdmlkZW8gc3RyZWFtICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gICBXcml0ZXJBdWRpb1N0cmVhbTsgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHdyaXR0ZW4gYXVkaW8gc3RyZWFtICovCi0gICAgTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyBXcml0ZXJWaWRlb1N0cmVhbUluZm87LyoqPCBWaWRlbyBwcm9wZXJ0aWVzIG9mIHRoZSB3cml0dGVuIHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICBXcml0ZXJWaWRlb0FVOyAgICAgICAgLyoqPCBXcml0dGVuIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICBXcml0ZXJBdWRpb0FVOyAgICAgICAgLyoqPCBXcml0dGVuIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aVZpZGVvQVVDb3VudDsgICAgICAgLyoqPCBOdW1iZXIgb2YgdmlkZW8gQVUgd3JpdHRlbiBpbiBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aVZpZGVvTWF4QXVTaXplOyAgICAgLyoqPCBNYXggYWNjZXNzIHVuaXQgc2l6ZSBmb3IgdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlWaWRlb01heENodW5ja1NpemU7IC8qKjwgTWF4IGNodW5jayBzaXplIGZvciB0aGUgb3V0cHV0IHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aUF1ZGlvQVVDb3VudDsgICAvKio8IE51bWJlciBvZiBhdWRpbyBBVSB3cml0dGVuIGluIG91dHB1dCBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aUF1ZGlvTWF4QXVTaXplOyAvKio8IE1heCBhY2Nlc3MgdW5pdCBzaXplIGZvciB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aUF1ZGlvQ3RzOyAgICAgICAvKio8IEF1ZGlvIEFVIGN0cyAod2hlbiBhdWRpbyBpcyB0cmFuc2NvZGVkKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYl9pc1Jhd1dyaXRlcjsgICAgLyoqPCBCb29sZWFuIHRvIGtub3cgaWYgdGhlIHJhdyB3cml0ZXIgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgb3Igbm90ICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICBwT3V0cHV0UENNZmlsZTsgICAvKio8IE91dHB1dCBQQ00gZmlsZSBpZiBub3QgTlVMTCAqLwotCi0gICAgLyoqCi0gICAgICogRmlsZXN5c3RlbSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgIHBPc2FGaWxlUmVhZFB0cjsgLyoqPCBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgcE9zYUZpbGVXcml0UHRyOyAvKio8IE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotCi0gICAgLyoqCi0gICAgICAqIE1lZGlhIGFuZCBDb2RlYyByZWdpc3RyYXRpb24gKi8KLSAgICAvKio8IFRhYmxlIG9mIE00VkVTX1dyaXRlckludGVyZmFjZSBzdHJ1Y3R1cmVzIGZvciBhdmFsYWlibGUgV3JpdGVycyBsaXN0ICovCi0gICAgTTRNQ1NfV3JpdGVySW50ZXJmYWNlICAgICAgICAgICAgICAgV3JpdGVySW50ZXJmYWNlW000V1JJVEVSX2tUeXBlX05CXTsKLSAgICAvKio8IG9wZW4sIGNsb3NlLCBzZXRvcHRpb24sZXRjLi4uIGZ1bmN0aW9ucyBvZiB0aGUgdXNlZCB3cml0ZXIqLwotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzOwotICAgIC8qKjwgZGF0YSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIG9mIHRoZSB1c2VkIHdyaXRlciAqLwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0czsKLSAgICAvKio8IFRhYmxlIG9mIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2Ugc3RydWN0dXJlcyBmb3IgYXZhbGFpYmxlIGVuY29kZXJzIGxpc3QgKi8KLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgICAgICAgICBwVmlkZW9FbmNvZGVySW50ZXJmYWNlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIC8qKjwgRnVuY3Rpb25zIG9mIHRoZSB1c2VkIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0czsKLQotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEk7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbTTRFTkNPREVSX2tWaWRlb19OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YTsKLQotICAgIC8qKjwgVGFibGUgb2YgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlIHN0cnVjdHVyZXMgZm9yIGF2YWxhaWJsZSBlbmNvZGVycyBsaXN0ICovCi0gICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiAgICAgcEF1ZGlvRW5jb2RlckludGVyZmFjZVtNNEVOQ09ERVJfa0F1ZGlvX05CXTsKLSAgICAvKio8IFRhYmxlIG9mIGludGVybmFsL2V4dGVybmFsIGZsYWdzIGZvciBhdmFsYWlibGUgZW5jb2RlcnMgbGlzdCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJGbGFnW000RU5DT0RFUl9rQXVkaW9fTkJdOwotICAgIC8qKjwgRnVuY3Rpb25zIG9mIHRoZSB1c2VkIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0czsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNNEVOQ09ERVJfa0F1ZGlvX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudEF1ZGlvRW5jb2RlclVzZXJEYXRhOwotCi0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKiAgICAgICAgICAgbV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtNNFJFQURFUl9rTWVkaWFUeXBlX05CXTsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXRUYWJsZVtNNFJFQURFUl9rTWVkaWFUeXBlX05CXTsKLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgICAgICAgICBtX3BSZWFkZXI7Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0OwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgIG1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzOwotCi0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKiAgICAgICAgICAgbV9wVmlkZW9EZWNvZGVyOwotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICAgICAgICAgIG1fcFZpZGVvRGVjb2Rlckl0VGFibGVbTTRERUNPREVSX2tWaWRlb1R5cGVfTkJdOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRWaWRlb0RlY29kZXJVc2VyRGF0YTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlX05CXTsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICBtX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWM7Ci0KLSAgICBNNEFEX0ludGVyZmFjZSogICAgICAgICBtX3BBdWRpb0RlY29kZXI7Ci0gICAgTTRBRF9JbnRlcmZhY2UqICAgICAgICAgbV9wQXVkaW9EZWNvZGVySXRUYWJsZVtNNEFEX2tUeXBlX05CXTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXJGbGFnVGFibGVbTTRBRF9rVHlwZV9OQl07IC8qKjwgc3RvcmUgaW5kaWNlcyBvZiBleHRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJzICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtNNEFEX2tUeXBlX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICBtX3BDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGE7Ci0KLSAgICBNNE1DU19NZWRpYVJlbmRlcmluZyAgICBNZWRpYVJlbmRlcmluZzsgICAgIC8qKjwgRkI6IHRvIGNyb3AsIHJlc2l6ZSwgb3IgcmVuZGVyIGJsYWNrIGJvcmRlcnMqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgIG1fYWlyX2NvbnRleHQ7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYkV4dE9NWEF1ZERlY29kZXI7ICAvKiBFeHRlcm5hbCBPTVggQXVkaW8gZGVjb2RlciAqLwotCi0gICAgLyoqPCBGbEIgMjAwOS4wMy4wNDogQXVkaW8gZWZmZWN0cyovCi0gICAgTTRNQ1NfRWZmZWN0U2V0dGluZ3MgICAgKnBFZmZlY3RzOyAgICAgICAgICAgICAgLyoqPCBMaXN0IG9mIGVmZmVjdHMgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICBuYkVmZmVjdHM7ICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlZmZlY3RzIGluIHRoZSBhYm92ZSBsaXN0ICovCi0gICAgTTRPU0FfSW50OCAgICAgICAgICAgICAgcEFjdGl2ZUVmZmVjdE51bWJlcjsgICAgLyoqPCBFZmZlY3QgSUQgdG8gYmUgYXBwbGllZCwgaWYgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZWZmZWN0IGhhcyB0byBiZSBhcHBsaWVkIGN1cnJlbnRseSovCi0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtX2JJc1N0aWxsUGljdHVyZTsgICAgICAgLyoqPCA9VFJVRSBpZiBpbnB1dCBmaWxlIGlzIGEgc3RpbGwgcGljdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSlBFRywgUE5HLCBCTVAsIEdJRikqLwotICAgIE00TUNTX0NvbnRleHQgICAgICAgICAgIG1fcFN0aWxsUGljdHVyZUNvbnRleHQ7IC8qKjwgQ29udGV4dCBvZiB0aGUgc3RpbGwgcGljdHVyZSBwYXJ0IG9mIE1DUyovCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotICAgIE5TV0FWQ19NQ1NfdCAgICAgICAgICAgICptX3BJbnN0YW5jZTsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAqSDI2NE1DU1RlbXBCdWZmZXI7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgSDI2NE1DU1RlbXBCdWZmZXJTaXplOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIEgyNjRNQ1NUZW1wQnVmZmVyRGF0YVNpemU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYkgyNjRUcmltOwotICAgIC8qIEZsYWcgd2hlbiB0byBnZXQgIGxhc3RkZWNvZGVkZnJhbWVDVFMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBiTGFzdERlY29kZWRGcmFtZUNUUzsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICBlbmNvZGluZ1ZpZGVvUHJvZmlsZTsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICBlbmNvZGluZ1ZpZGVvTGV2ZWw7Ci0KLX0gTTRNQ1NfSW50ZXJuYWxDb250ZXh0OwotCi0KLSNlbmRpZiAvKiBfX000TUNTX0lOVEVSTkFMVFlQRVNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDcwZTZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWJ2aWRlb2VkaXRvcl9tY3MKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX21jcwotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgICBNNE1DU19BUEkuYyBcCi0gICAgICBNNE1DU19BdWRpb0VmZmVjdHMuYyBcCi0gICAgICBNNE1DU19Db2RlY3MuYyBcCi0gICAgICBNNE1DU19NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMgXAotICAgICAgTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgICBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgLURNNE1DU19XSVRIX0ZBU1RfT1BFTgotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0FQSS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQVBJLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwNTZlZjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQVBJLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDk0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE1DU19BUEkuYwotICogQGJyaWVmICBNQ1MgaW1wbGVtZW50YXRpb24gKFZpZGVvIENvbXByZXNzb3IgU2VydmljZSkKLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEFQSSBhbmQgdGhlIHByb2Nlc3Npbmcgb2YgdGhlIE1DUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluY2x1ZGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLS8qIFBDTSBzYW1wbGVzICovCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JSZXNhbXBsZXIuaCIKLS8qKgotICogRGVjb2RlciBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0KLS8qIEVuY29kZXIgaW50ZXJmYWNlKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfY29tbW9uLmgiCi0KLS8qIEVuYWJsZSBmb3IgREVCVUcgbG9nZ2luZyAqLwotLy8jZGVmaW5lIE1DU19EVU1QX1BDTV9UT19GSUxFCi0jaWZkZWYgTUNTX0RVTVBfUENNX1RPX0ZJTEUKLSNpbmNsdWRlIDxzdGRpby5oPgotRklMRSAqZmlsZV9hdV9yZWFkZXIgPSBOVUxMOwotRklMRSAqZmlsZV9wY21fZGVjb2RlciA9IE5VTEw7Ci1GSUxFICpmaWxlX3BjbV9lbmNvZGVyID0gTlVMTDsKLSNlbmRpZgotCi0vKiBDb3JlIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE1DU19BUEkuaCIKLSNpbmNsdWRlICJNNE1DU19FcnJvckNvZGVzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotI2luY2x1ZGUgIk00TUNTX1N0aWxsUGljdHVyZS5oIgotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotLyogQ29tbW9uIGhlYWRlcnMgKGZvciBhYWMpICovCi0jaW5jbHVkZSAiTTRfQ29tbW9uLmgiCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0jaW5jbHVkZSAiTTRBSVJfQVBJLmgiCi0jaW5jbHVkZSAiT01YX1ZpZGVvLmgiCi0KLS8qIFZlcnNpb24gKi8KLSNkZWZpbmUgTTRNQ1NfVkVSU0lPTl9NQUpPUiAzCi0jZGVmaW5lIE00TUNTX1ZFUlNJT05fTUlOT1IgNAotI2RlZmluZSBNNE1DU19WRVJTSU9OX1JFVklTSU9OICAzCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdGF0aWMgbG9jYWwgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBTZXQoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVdyaXRlciggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEVuY29kaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpwVHJhbnNjb2RlZFRpbWUgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0RlY29kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgICAqcENvbnRleHQgKTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0FNUk5CKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0VWUkMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja01heEZpbGVTaXplKCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICk7Ci1zdGF0aWMgTTRWSURFT0VESVRJTkdfQml0cmF0ZSBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGZyZWViaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBtb2RlICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCAqYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBuZXdTaXplICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyk7Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50TGltaXRCaXRyYXRlUGVyQ29kZWNQcm9maWxlTGV2ZWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMqIEVuY1BhcmFtcyk7Ci1zdGF0aWMgTTRPU0FfSW50MzIgTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9ySDI2M0VuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpOwotc3RhdGljIE00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvck1wZWc0RW5jKE00T1NBX0ludDMyIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfSW50MzIgYml0cmF0ZSk7Ci1zdGF0aWMgTTRPU0FfSW50MzIgTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9ySDI2NEVuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFeHRlcm5hbCBmdW5jdGlvbiB1c2VkIG9ubHkgYnkgVmlkZW9FZGl0b3IgYW5kIHRoYXQgZG9lcyBub3QgYXBwZWFyCi0gKiBpbiB0aGUgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNE1DU19vcGVuX25vcm1hbE1vZGUoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgSW5wdXRGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBGaWxlT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcFRlbXBGaWxlICk7Ci0KLS8qIEFsbCBlcnJvcnMgYXJlIGZhdGFsIGluIHRoZSBNQ1MgKi8KLSNkZWZpbmUgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycikgaWYoTTROT19FUlJPUiE9ZXJyKSByZXR1cm4gZXJyOwotCi0vKiBBIGRlZmluZSB1c2VkIHdpdGggU1NSQyAxLjA0IGFuZCBhYm92ZSB0byBhdm9pZCB0YWtpbmcgYmxvY2tzIHNtYWxsZXIKLSAqIHRoYXQgdGhlIG1pbmltYWwgYmxvY2sgc2l6ZQotICovCi0jZGVmaW5lIE00TUNTX1NTUkNfTUlOQkxPQ0tTSVpFICAgICAgICAxMDAKLQotc3RhdGljIE00T1NBX1VDaGFyIFRhYl9NQ1NbOF0gPQotewotICAgIDE3LCA1LCAzLCAzLCAxLCAxLCAxLCAxCi19OwotCi1NNE9TQV9FUlIgSDI2NE1DU19HZXRpbnN0YW5jZSggTlNXQVZDX01DU190ICoqIGluc3RhbmNlICkKLXsKLSAgICBOU1dBVkNfTUNTX3QgKnBfYnMgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIHBfYnMgPSAoTlNXQVZDX01DU190ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihOU1dBVkNfTUNTX3QpLCBNNE1DUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiTlNXQVZDX01DU190Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwX2JzICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJIMjY0TUNTX0dldGluc3RhbmNlOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwX2JzLT5wcmV2X2ZyYW1lX251bSA9IDA7Ci0gICAgcF9icy0+Y3VyX2ZyYW1lX251bSA9IDA7Ci0gICAgcF9icy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA9IDA7Ci0gICAgcF9icy0+cHJldl9uZXdfZnJhbWVfbnVtID0gMDsKLSAgICBwX2JzLT5pc19kb25lID0gMDsKLSAgICBwX2JzLT5pc19maXJzdCA9IDE7Ci0KLSAgICBwX2JzLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLQotICAgIHBfYnMtPm1fcEVuY29kZXJTUFMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fZW5jb2RlclNQU1NpemUgPSAwOwotCi0gICAgcF9icy0+bV9wRW5jb2RlclBQUyA9IE00T1NBX05VTEw7Ci0gICAgcF9icy0+bV9lbmNvZGVyUFBTU2l6ZSA9IDA7Ci0KLSAgICBwX2JzLT5tX3BGaW5hbERTSSA9IE00T1NBX05VTEw7Ci0gICAgcF9icy0+bV9wRmluYWxEU0lTaXplID0gMDsKLQotICAgIHBfYnMtPnBfY2xpcF9zcHMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fZW5jb2Rlcl9TUFNfQ250ID0gMDsKLQotICAgIHBfYnMtPnBfY2xpcF9wcHMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fZW5jb2Rlcl9QUFNfQ250ID0gMDsKLQotICAgIHBfYnMtPnBfZW5jb2Rlcl9zcHMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPnBfZW5jb2Rlcl9wcHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcF9icy0+ZW5jb2Rlcl9wcHMuc2xpY2VfZ3JvdXBfaWQgPSBNNE9TQV9OVUxMOwotCi0gICAgKmluc3RhbmNlID0gKE5TV0FWQ19NQ1NfdCAqKXBfYnM7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfVUludDMyIEgyNjRNQ1NfZ2V0Qml0cyggQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIE00T1NBX1VJbnQzMiBudW1CaXRzICkKLXsKLSAgICBNNE9TQV9VSW50MzIgdWkzMlJldEJpdHM7Ci0gICAgTTRPU0FfVUludDggKnBiczsKLSAgICBNNE9TQV9JbnQzMiBiY250OwotICAgIHBfYnMtPmk4Qml0Q250IC09IG51bUJpdHM7Ci0gICAgYmNudCA9IHBfYnMtPmk4Qml0Q250OwotCi0gICAgLyogTWVhc3VyZSB0aGUgcXVhbnRpdHkgb2YgYml0cyB0byBiZSByZWFkIGluIHVpMzJUZW1wQnVmZiAqLwotICAgIHVpMzJSZXRCaXRzID0gcF9icy0+dWkzMlRlbXBCdWZmID4+ICgzMiAtIG51bUJpdHMpOwotCi0gICAgLyogUmVhZCBudW1CaXRzIGluIHVpMzJUZW1wQnVmZiAqLwotICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA8PD0gbnVtQml0czsKLSAgICBwX2JzLT5iaXRQb3MgKz0gbnVtQml0czsKLQotICAgIGlmKCBiY250ID4gMjQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuICh1aTMyUmV0Qml0cyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7IC8qIGF0IGxlYXN0IG9uZSBieXRlIGNhbiBiZSBidWZmZXJlZCBpbiB1aTMyVGVtcEJ1ZmYgKi8KLSAgICAgICAgcGJzID0gKE00T1NBX1VJbnQ4ICopcF9icy0+cHVpOEJmclB0cjsKLQotICAgICAgICBpZiggYmNudCA8IChpbnQpKHBfYnMtPm51bUJpdHNJbkJ1ZmZlciAtIHBfYnMtPmJpdFBvcykgKQotICAgICAgICB7IC8qIG5vdCBlbm91Z2ggcmVtYWluaW5nIGJpdHMgaW4gdWkzMlRlbXBCdWZmOiBuZWVkIHRvIGJlIGZpbGxlZCAqLwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBPbiB0aGUgZmx5IGRldGVjdGlvbiBvZiBFUEIgYnl0ZSAqLwotICAgICAgICAgICAgICAgIGlmKCAoICoocGJzKSA9PSAweDAzKQotICAgICAgICAgICAgICAgICAgICAmJiAoISgoIHBic1stMV0pCi0gICAgICAgICAgICAgICAgICAgIHwgKHBic1stMl0pKSkpIC8vKHBfYnMtPnVpMzJMYXN0VHdvQnl0ZXMgJiAweDAwMDBGRkZGKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRVBCIGJ5dGUgZm91bmQ6IHNraXAgaXQgYW5kIHVwZGF0ZSBiaXRQb3MgYWNjb3JkaW5nbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGJzKSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnMtPmJpdFBvcyArPSA4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgfD0gKihwYnMpKysgPDwgKDI0IC0gYmNudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiY250ICs9IDg7Ci0gICAgICAgICAgICB9IHdoaWxlICggYmNudCA8PSAyNCApOwotCi0gICAgICAgICAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwYnM7Ci0gICAgICAgICAgICBwX2JzLT5pOEJpdENudCA9IGJjbnQ7Ci0gICAgICAgICAgICByZXR1cm4gKHVpMzJSZXRCaXRzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBwX2JzLT5iaXRQb3MgPD0gcF9icy0+bnVtQml0c0luQnVmZmVyICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAodWkzMlJldEJpdHMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKDApOwotICAgIH0KLX0KLQotTTRPU0FfVm9pZCBIMjY0TUNTX2ZsdXNoQml0cyggQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIE00T1NBX1VJbnQzMiBudW1CaXRzICkKLXsKLSAgICBNNE9TQV9VSW50OCAqcGJzOwotICAgIE00T1NBX1VJbnQzMiBiY250OwotICAgIHBfYnMtPmk4Qml0Q250IC09IG51bUJpdHM7Ci0gICAgYmNudCA9IHBfYnMtPmk4Qml0Q250OwotCi0gICAgcF9icy0+dWkzMlRlbXBCdWZmIDw8PSBudW1CaXRzOwotICAgIHBfYnMtPmJpdFBvcyArPSBudW1CaXRzOwotCi0gICAgaWYoIGJjbnQgPiAyNCApCi0gICAgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UKLSAgICB7IC8qIGF0IGxlYXN0IG9uZSBieXRlIGNhbiBiZSBidWZmZXJlZCBpbiB1aTMyVGVtcEJ1ZmYgKi8KLSAgICAgICAgcGJzID0gKE00T1NBX1VJbnQ4ICopcF9icy0+cHVpOEJmclB0cjsKLQotICAgICAgICBpZiggYmNudCA8IChwX2JzLT5udW1CaXRzSW5CdWZmZXIgLSBwX2JzLT5iaXRQb3MpICkKLSAgICAgICAgeyAgIC8qIE5vdCBlbm91Z2ggcmVtYWluaW5nIGJpdHMgaW4gdWkzMlRlbXBCdWZmOiBuZWVkIHRvIGJlIGZpbGxlZCAqLwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiAgT24gdGhlIGZseSBkZXRlY3Rpb24gb2YgRVBCIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICBpZiggKCAqKHBicykgPT0gMHgwMykgJiYgKCEoKCBwYnNbLTFdKSB8IChwYnNbLTJdKSkpICkKLSAgICAgICAgICAgICAgICB7IC8qIEpDOiBFUEIgYnl0ZSBmb3VuZDogc2tpcCBpdCBhbmQgdXBkYXRlIGJpdFBvcyBhY2NvcmRpbmdseSAqLwotICAgICAgICAgICAgICAgICAgICAocGJzKSsrOwotICAgICAgICAgICAgICAgICAgICBwX2JzLT5iaXRQb3MgKz0gODsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcF9icy0+dWkzMlRlbXBCdWZmIHw9ICoocGJzKSsrIDw8ICgyNCAtIGJjbnQpOwotICAgICAgICAgICAgICAgIGJjbnQgKz0gODsKLSAgICAgICAgICAgIH0gd2hpbGUgKCBiY250IDw9IDI0ICk7Ci0KLSAgICAgICAgICAgIHBfYnMtPnB1aThCZnJQdHIgPSAoTTRPU0FfSW50OCAqKXBiczsKLSAgICAgICAgICAgIHBfYnMtPmk4Qml0Q250ID0gYmNudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotTTRPU0FfVUludDMyIEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzICkKLXsKLSAgICBNNE9TQV9VSW50MzIgY29kZSwgbDAgPSAwLCBsMTsKLSAgICAvKiBSZWFkaW5nIDMyIEJpdHMgZnJvbSBsb2NhbCBjYWNoZSBidWZmZXIgb2YgQml0c3RyZWFtIHN0cnVjdHVyZSovCi0gICAgY29kZSA9IHBfYnMtPnVpMzJUZW1wQnVmZjsKLQotICAgIC8qIENoZWNraW5nIGluIGZpcnN0IDMgYml0cyovCi0gICAgaWYoIGNvZGUgPj4gMjkgKQotICAgIHsKLSAgICAgICAgbDAgPSBUYWJfTUNTWyhjb2RlID4+IDI5KV07Ci0gICAgICAgIGNvZGUgPSBjb2RlID4+ICgzMiAtIGwwKTsKLSAgICAgICAgSDI2NE1DU19mbHVzaEJpdHMocF9icywgbDApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb2RlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb2RlIDw8PSAzOwotCi0gICAgICAgICAgICAgICAgZm9yICggbDAgPSAzOyBjb2RlIDwgMHg4MDAwMDAwMDsgY29kZSA8PD0gMSwgbDArKyApOwotCi0gICAgICAgICAgICAgICAgaWYoIGwwIDwgMTYgKSAvKmFsbCB1c2VmdWwgYml0cyBhcmUgaW5zaWRlIHRoZSAzMiBiaXRzIHJlYWQgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlID4+ICgzMSAtIGwwKTsKLSAgICAgICAgICAgICAgICAgICAgSDI2NE1DU19mbHVzaEJpdHMocF9icywgMiAqIGwwICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsgLyogUmVhZCB0aGUgdXNlZnVsIGJpdHMgaW4gMiBwYXJ0cyAqLwotICAgICAgICAgICAgICAgICAgICBsMSA9ICggbDAgPDwgMSkgLSAzMTsKLSAgICAgICAgICAgICAgICAgICAgY29kZSA+Pj0gbDA7Ci0gICAgICAgICAgICAgICAgICAgIEgyNjRNQ1NfZmx1c2hCaXRzKHBfYnMsIDMyKTsKLSAgICAgICAgICAgICAgICAgICAgY29kZSA9ICggY29kZSA8PCBsMSkgfCBIMjY0TUNTX2dldEJpdHMocF9icywgbDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBIMjY0TUNTX2ZsdXNoQml0cyhwX2JzLCAzMik7Ci0KLSAgICAgICAgICAgICAgICBpZiggSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGlmIG51bWJlciBvZiBsZWFkaW5nIDAncyBpcyAzMiwgdGhlIG9ubHkgY29kZSBhbGxvd2VkIGlzIDEgZm9sbG93ZWQKLSAgICAgICAgICAgICAgICAgICAgYnkgMzIgMCdzICovCi0KLSAgICAgICAgICAgICAgICAgICAgLypyZWFkaW5nIDMyIG1vcmUgYml0cyBmcm9tIGJpdHN0cmVhbSBidWZmZXIqLwotICAgICAgICAgICAgICAgICAgICBjb2RlID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIDMyKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggY29kZSA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjb2RlIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyppZiBudW1iZXIgb2YgbGVhZGluZyAwJ3MgaXMgPjMyLCB0aGVuIHN5bWJvbCBpcyA+MzIgYml0cywKLSAgICAgICAgICAgICAgICB3aGljaCBpcyBhbiBlcnJvciAqLwotICAgICAgICAgICAgICAgIC8vcF9icy0+c3RhdGUgPSBfQlNfRVJSOwotICAgICAgICAgICAgICAgIC8vcF9icy0+ZmxhZ3MgfD0gX0JGX1NZTV9FUlI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAxICkgLy8ocF9icy0+c3RhdGUgPT0gX0JTX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKGNvZGUgLSAxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLU00T1NBX0ludDMyIEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzICkKLXsKLSAgICBNNE9TQV9JbnQzMiBjb2RlTm8sIHJldDsKLQotICAgIC8qIHJlYWQgdGhlIHVuc2lnbmVkIGNvZGUgbnVtYmVyICovCi0gICAgY29kZU5vID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgIC8qIG1hcCB0byB0aGUgc2lnbmVkIHZhbHVlLCBpZiB2YWx1ZSBpcyBvZGQgdGhlbiBpdCdzIHBvc2l0aXZlLAotICAgIGlmIGV2ZW4gdGhlbiBpdCdzIG5lZ2F0aXZlLCBmb3JtdWxhIGlzICgtMSleKGsrMSkqQ0VJTChrLzIpICovCi0KLSAgICByZXQgPSAoY29kZU5vICYgMHgwMSkgPyAoKCBjb2RlTm8gKyAxKSA+PiAxKSA6ICgoIC1jb2RlTm8pID4+IDEpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotTTRPU0FfVm9pZCBEZWNCaXRTdHJlYW1SZXNldF9NQ1MoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGJ5dGVzX3JlYWQgKQotewotICAgIHBfYnMtPmJpdFBvcyA9IDA7Ci0KLSAgICBwX2JzLT5sYXN0VG90YWxCaXRzID0gMDsKLSAgICBwX2JzLT5udW1CaXRzSW5CdWZmZXIgPSBieXRlc19yZWFkIDw8IDM7Ci0gICAgcF9icy0+cmVhZGFibGVCeXRlc0luQnVmZmVyID0gYnl0ZXNfcmVhZDsKLSAgICAvL3BfYnMtPnN0YXRlID0gTTROT19FUlJPUjsvL19CU19PSzsKLSAgICAvL3BfYnMtPmZsYWdzID0gMDsKLQotICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA9IDA7Ci0gICAgcF9icy0+aThCaXRDbnQgPSAwOwotICAgIHBfYnMtPnB1aThCZnJQdHIgPSAoTTRPU0FfSW50OCAqKXBfYnMtPkJ1ZmZlcjsKLSAgICBwX2JzLT51aTMyTGFzdFR3b0J5dGVzID0gMHhGRkZGRkZGRjsKLSAgICBIMjY0TUNTX2dldEJpdHMocF9icywgMCk7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1NfaW5pdEJpdHN0cmVhbSggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMgKQotewotICAgIGJTLT5iaXRQb3MgPSAwOwotICAgIGJTLT5ieXRlQ250ID0gMDsKLSAgICBiUy0+Y3VyckJ1ZmYgPSAwOwotICAgIGJTLT5wcmV2Qnl0ZSA9IDB4ZmY7Ci0gICAgYlMtPnByZXZQcmV2Qnl0ZSA9IDB4ZmY7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE5TV0FWQ01DU19wdXRCaXRzKCBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICpiUywgTTRPU0FfVUludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IGxlbmd0aCApCi17Ci0gICAgTTRPU0FfVUludDMyIG1hc2tlZFZhbHVlID0gMCwgdGVtcCA9IDA7Ci0gICAgTTRPU0FfVUludDggYnl0ZU9uZTsKLQotICAgIE00T1NBX1VJbnQzMiBsZW4xID0gKGxlbmd0aCA9PSAzMikgPyAzMSA6IGxlbmd0aDsKLQotICAgIGlmKCAhKGxlbmd0aCkgKQotICAgIHsKLSAgICAgICAgLyogTGVuZ3RoID0gMCwgcmV0dXJuIE9LKi8KLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgbWFza2VkVmFsdWUgPSAoTTRPU0FfVUludDMyKSh2YWx1ZSAmKCggMSA8PCBsZW4xKSAtIDEpKTsKLQotICAgIGlmKCAzMiA+IChsZW5ndGggKyBiUy0+Yml0UG9zKSApCi0gICAgewotICAgICAgICBiUy0+Yml0UG9zICs9IGxlbmd0aDsKLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9IG1hc2tlZFZhbHVlIDw8ICgzMiAtIGJTLT5iaXRQb3MpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0ZW1wID0gKCggYlMtPmJpdFBvcyArIGxlbmd0aCkgLSAzMik7Ci0KLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9IChtYXNrZWRWYWx1ZSA+PiAodGVtcCkpOwotCi0gICAgICAgIGJ5dGVPbmUgPQotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IChNNE9TQV9VSW50OCkoYlMtPmN1cnJCdWZmID4+IDI0KTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBieXRlT25lID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKCggYlMtPmN1cnJCdWZmID4+IDE2KSAmIDB4ZmYpOwotCi0gICAgICAgIGlmKCAoKCBiUy0+cHJldlByZXZCeXRlCi0gICAgICAgICAgICA9PSAwKSAmIChiUy0+cHJldkJ5dGUgPT0gMCkgJiAoIShieXRlT25lICYgMHhGQykpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5ieXRlQ250IC09IDE7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IDB4MDM7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+cHJldkJ5dGU7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVPbmUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCBiUy0+Y3VyckJ1ZmYgPj4gOCkgJiAweGZmKTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBieXRlT25lID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKChiUy0+Y3VyckJ1ZmYpICYweGZmKTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJTLT5jdXJyQnVmZiA9IDA7Ci0KLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9ICggbWFza2VkVmFsdWUgJigoIDEgPDwgdGVtcCkgLSAxKSkgPDwgKDMyIC0gdGVtcCk7Ci0KLSAgICAgICAgYlMtPmJpdFBvcyA9IHRlbXA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1NfcHV0Qml0KCBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICpiUywgTTRPU0FfVUludDMyIHZhbHVlICkKLXsKLSAgICBNNE9TQV9VSW50MzIgbWFza2VkVmFsdWUgPSAwLCB0ZW1wID0gMDsKLSAgICBNNE9TQV9VSW50OCBieXRlT25lOwotCi0gICAgbWFza2VkVmFsdWUgPSAodmFsdWUgPyAxIDogMCk7Ci0KLSAgICBpZiggMzIgPiAoMSArIGJTLT5iaXRQb3MpICkKLSAgICB7Ci0gICAgICAgIGJTLT5iaXRQb3MgKz0gMTsKLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9IG1hc2tlZFZhbHVlIDw8ICgzMiAtIGJTLT5iaXRQb3MpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0ZW1wID0gMDsKLQotICAgICAgICBiUy0+Y3VyckJ1ZmYgfD0gKG1hc2tlZFZhbHVlKTsKLQotICAgICAgICAvKiB3cml0aW5nIGl0IHRvIG1lbW9yeSovCi0gICAgICAgIGJ5dGVPbmUgPQotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKGJTLT5jdXJyQnVmZiA+PiAyNCk7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiAxNikgJiAweGZmKTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBieXRlT25lID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKCggYlMtPmN1cnJCdWZmID4+IDgpICYgMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoYlMtPmN1cnJCdWZmKSAmMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYlMtPmN1cnJCdWZmID0gMDsKLSAgICAgICAgYlMtPmJpdFBvcyA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0ludDMyIE5TV0FWQ01DU19wdXRSYnNwVGJpdHMoIE5TV0FWQ19iaXRTdHJlYW1fdF9NQ1MgKmJTICkKLXsKLSAgICBNNE9TQV9VSW50OCB0cmFpbEJpdHMgPSAwOwotICAgIE00T1NBX1VJbnQ4IGJ5dGVDbnQgPSAwOwotCi0gICAgdHJhaWxCaXRzID0gKE00T1NBX1VJbnQ4KShiUy0+Yml0UG9zICUgOCk7Ci0KLSAgICAvKiBBbHJlYWR5IGluIHRoZSBieXRlIGFsaWduZWQgcG9zaXRpb24sCi0gICAgUkJTUCB0cmFpbGluZyBiaXRzIHdpbGwgYmUgMTAwMCAwMDAwICovCi0gICAgaWYoIDAgPT0gdHJhaWxCaXRzICkKLSAgICB7Ci0gICAgICAgIHRyYWlsQml0cyA9ICgxIDw8IDcpOwotICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cyhiUywgdHJhaWxCaXRzLCA4KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdHJhaWxCaXRzID0gKDggLSB0cmFpbEJpdHMpOwotICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0KGJTLCAxKTsKLSAgICAgICAgdHJhaWxCaXRzLS07Ci0KLSAgICAgICAgaWYoIHRyYWlsQml0cyApCi0gICAgICAgIHsgLyogcHV0IHRyYWlsQml0cyB0aW1lcyB6ZXJvcyAqLwotICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoYlMsIDAsIHRyYWlsQml0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGb3Igd3JpdHRpbmcgdGhlIGN1cnJCdWZmIGluIHN0cmVhbUJ1ZmYgNGJ5dGUgYWxpZ25tZW50IGlzIHJlcXVpcmVkKi8KLSAgICBieXRlQ250ID0gKE00T1NBX1VJbnQ4KSgoIGJTLT5iaXRQb3MgKyA0KSAvIDgpOwotCi0gICAgc3dpdGNoKCBieXRlQ250ICkKLSAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAoTTRPU0FfVUludDgpKGJTLT5jdXJyQnVmZiA+PiAyNCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gKE00T1NBX1VJbnQ4KShiUy0+Y3VyckJ1ZmYgPj4gMjQpOwotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAoTTRPU0FfVUludDgpKGJTLT5jdXJyQnVmZiA+PiAyNCk7Ci0gICAgICAgICAgICBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpKCggYlMtPmN1cnJCdWZmID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiA4KSAmIDB4ZmYpOwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyogSXQgd2lsbCBub3QgY29tZSBoZXJlICovCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyAgICBiUy0+Yml0UG9zID0wOwotICAgIC8vICAgIGJTLT5jdXJyQnVmZiA9IDA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE5TV0FWQ01DU191RXhwVkxDKCBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICpiUywgTTRPU0FfSW50MzIgY29kZU51bSApCi17Ci0KLSAgICBNNE9TQV9JbnQzMiBsb29wLCB0ZW1wOwotICAgIE00T1NBX0ludDMyIGRhdGEgPSAwOwotICAgIE00T1NBX1VJbnQ4IGNvZGVMZW4gPSAwOwotCi0gICAgLyogVGhlIGNvZGVOdW0gY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvIGZvciB0aGlzIHVlKHYpICovCi0gICAgaWYoIGNvZGVOdW0gPCAwICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIEltcGxlbWVudGF0aW9uIGZvciBFbmNvZGluZyBvZiB0aGUgVGFibGUgOS0xIGluIHRoZSBTdGFuZGFyZCAqLwotICAgIHRlbXAgPSBjb2RlTnVtICsgMTsKLQotICAgIGZvciAoIGxvb3AgPSAwOyB0ZW1wICE9IDA7IGxvb3ArKyApCi0gICAgewotICAgICAgICB0ZW1wIC89IDI7Ci0gICAgfQotCi0gICAgY29kZUxlbiA9ICgoIGxvb3AgKiAyKSAtIDEpOwotCi0gICAgZGF0YSA9IGNvZGVOdW0gKyAxOwotCi0gICAgTlNXQVZDTUNTX3B1dEJpdHMoYlMsIGRhdGEsIGNvZGVMZW4pOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1Nfc0V4cFZMQyggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMsIE00T1NBX0ludDMyIGNvZGVOdW0gKQotewotCi0gICAgTTRPU0FfSW50MzIgbG9vcCwgdGVtcDEsIHRlbXAyOwotICAgIE00T1NBX0ludDMyIGRhdGEgPSAwOwotICAgIE00T1NBX1VJbnQ4IGNvZGVMZW4gPSAwLCBpc1Bvc2l0aXZlID0gMDsKLSAgICBNNE9TQV9VSW50MzIgYWJzY29kZU51bTsKLQotICAgIGlmKCBjb2RlTnVtID4gMCApCi0gICAgewotICAgICAgICBpc1Bvc2l0aXZlID0gMTsKLSAgICB9Ci0KLSAgICBpZiggY29kZU51bSA+IDAgKQotICAgIHsKLSAgICAgICAgYWJzY29kZU51bSA9IGNvZGVOdW07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGFic2NvZGVOdW0gPSAtY29kZU51bTsKLSAgICB9Ci0KLSAgICB0ZW1wMSA9ICggKCAoIGFic2NvZGVOdW0pIDw8IDEpIC0gaXNQb3NpdGl2ZSkgKyAxOwotICAgIHRlbXAyID0gdGVtcDE7Ci0KLSAgICBmb3IgKCBsb29wID0gMDsgbG9vcCA8IDE2ICYmIHRlbXAyICE9IDA7IGxvb3ArKyApCi0gICAgewotICAgICAgICB0ZW1wMiAvPSAyOwotICAgIH0KLQotICAgIGNvZGVMZW4gPSAoIGxvb3AgKiAyKSAtIDE7Ci0KLSAgICBkYXRhID0gdGVtcDE7Ci0KLSAgICBOU1dBVkNNQ1NfcHV0Qml0cyhiUywgZGF0YSwgY29kZUxlbik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIEgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVKCAgIE00T1NBX1ZvaWQgKmFpbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqaW5idWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGluYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKm91dGJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKm91dGJ1Zl9zaXplICkKLXsKLSAgICBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icywgYnM7Ci0gICAgTlNXQVZDX01DU190ICppbnN0YW5jZTsKLSAgICBNNE9TQV9VSW50OCBuYWx1X2luZm87Ci0gICAgTTRPU0FfSW50MzIgZm9yYmlkZGVuX2JpdCwgbmFsX3JlZl9pZGMsIG5hbF91bml0X3R5cGU7Ci0gICAgTTRPU0FfSW50MzIgZmlyc3RfbWJfaW5fc2xpY2UsIHNsaWNlX3R5cGUsIHBpY19wYXJhbWV0ZXJfc2V0X2lkLCBmcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDggdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7Ci0gICAgTTRPU0FfSW50MzIgdGVtcF9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgYml0c3RvRGlhY2FyZCwgYnl0ZXM7Ci0gICAgTTRPU0FfVUludDMyIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgTTRPU0FfSW50MzIgbmV3X2J5dGVzLCBpbml0X2JpdF9wb3M7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplOwotICAgIE00T1NBX1VJbnQzMiBjbnQ7Ci0gICAgTTRPU0FfVUludDMyIG91dGJ1ZmZwb3MgPSAwOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZV9sb3cxNiwgbmFsX3NpemVfaGlnaDE2OwotICAgIE00T1NBX1VJbnQzMiBmcmFtZV9zaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdGVtcCA9IDA7Ci0KLSAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVyIGRvZXMgbm90IHByb3ZpZGUgdGhlIHNpemUgaW4gdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIEFVLCBhZGQgaXQKLSAgICBNNE9TQV9JbnQ4ICpwVG1wQnVmZjEgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDggKnBUbXBCdWZmMiA9IE00T1NBX05VTEw7Ci0KLSAgICBwX2JzID0gJmJzOwotICAgIGluc3RhbmNlID0gKE5TV0FWQ19NQ1NfdCAqKWFpbnN0YW5jZTsKLQotICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAiSW4gIEgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVIHdpdGggRnJhbWVTaXplID0gJWQgIGluQnVmX1NpemU9JWQiLAotICAgICAgICBmcmFtZV9zaXplLCBpbmJ1Zl9zaXplKTsKLQotICAgIC8vIFN0YWdlRnJpZ2h0IGNvZGVjcyBtYXkgYWRkIGEgc3RhcnQgY29kZSwgbWFrZSBzdXJlIGl0IGlzIG5vdCBwcmVzZW50Ci0KLSAgICBpZiggIW1lbWNtcCgodm9pZCAqKWluYnVmZiwKLSAgICAgICAgIlx4MDBceDAwXHgwMFx4MDEiLCA0KSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMygKLSAgICAgICAgICAgICJIMjY0TUNTX1Byb2Nlc3NOQUxVIEVSUk9SIDogTkFMVSBzdGFydCBjb2RlIGhhcyBub3QgYmVlbiByZW1vdmVkICVkICIKLSAgICAgICAgICAgICIweCVYIDB4JVgiLCBpbmJ1Zl9zaXplLCAoKE00T1NBX1VJbnQzMiAqKWluYnVmZilbMF0sCi0gICAgICAgICAgICAoKE00T1NBX1VJbnQzMiAqKWluYnVmZilbMV0pOwotCi0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlciBkb2VzIG5vdCBwcm92aWRlIHRoZSBzaXplIGluIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBBVSwgYWRkIGl0Ci0gICAgcFRtcEJ1ZmYxID0gKE00T1NBX0ludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoaW5idWZfc2l6ZSArIDQsIE00TUNTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJ0bXBOQUxVIik7Ci0gICAgbWVtY3B5KCh2b2lkICopKHBUbXBCdWZmMSArIDQpLCAodm9pZCAqKWluYnVmZiwKLSAgICAgICAgaW5idWZfc2l6ZSk7Ci0gICAgcFRtcEJ1ZmYxWzNdID0gKCAoTTRPU0FfVUludDMyKWluYnVmX3NpemUpICYgMHgwMDAwMDBGRjsKLSAgICBwVG1wQnVmZjFbMl0gPSAoIChNNE9TQV9VSW50MzIpaW5idWZfc2l6ZSA+PiA4KSAmIDB4MDAwMDAwRkY7Ci0gICAgcFRtcEJ1ZmYxWzFdID0gKCAoTTRPU0FfVUludDMyKWluYnVmX3NpemUgPj4gMTYpICYgMHgwMDAwMDBGRjsKLSAgICBwVG1wQnVmZjFbMF0gPSAoIChNNE9TQV9VSW50MzIpaW5idWZfc2l6ZSA+PiAyNCkgJiAweDAwMDAwMEZGOwotICAgIHBUbXBCdWZmMiA9IChNNE9TQV9JbnQ4ICopaW5idWZmOwotICAgIGluYnVmZiA9IChNNE9TQV9VSW50OCAqKXBUbXBCdWZmMTsKLSAgICBpbmJ1Zl9zaXplICs9IDQ7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGhlIGF2YWlsYWJsZSBzaXplIHdhcyBzZXQKLSAgICBpZiggaW5idWZfc2l6ZSA+PSAqb3V0YnVmX3NpemUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiISEhIEgyNjRNQ1NfUHJvY2Vzc05BTFUgRVJST1IgOiBzcGVjaWZpZWQgYXZhaWxhYmxlIHNpemUgaXMgaW5jb3JyZWN0ICVkICIsCi0gICAgICAgICAgICAqb3V0YnVmX3NpemUpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotCi0KLSAgICB3aGlsZSggKE00T1NBX0ludDMyKWZyYW1lX3NpemUgPCBpbmJ1Zl9zaXplICkKLSAgICB7Ci0gICAgICAgIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbmJ1ZmYgKyBmcmFtZV9zaXplKTsKLQotICAgICAgICAvLyBVc2UgdW5zaWduZWQgdmFsdWUgdG8gZml4IGVycm9ycyBkdWUgdG8gYml0IHNpZ24gZXh0ZW5zaW9uLCB0aGlzIGZpeCBzaG91bGQgYmUgZ2VuZXJpYwotCi0gICAgICAgIG5hbF9zaXplX2hpZ2gxNiA9ICggKCAoTTRPU0FfVUludDggKilwX2JzLT5CdWZmZXIpWzBdIDw8IDgpCi0gICAgICAgICAgICArICgoTTRPU0FfVUludDggKilwX2JzLT5CdWZmZXIpWzFdOwotICAgICAgICBuYWxfc2l6ZV9sb3cxNiA9ICggKCAoTTRPU0FfVUludDggKilwX2JzLT5CdWZmZXIpWzJdIDw8IDgpCi0gICAgICAgICAgICArICgoTTRPU0FfVUludDggKilwX2JzLT5CdWZmZXIpWzNdOwotCi0gICAgICAgIG5hbHVfaW5mbyA9ICh1bnNpZ25lZCBjaGFyKXBfYnMtPkJ1ZmZlcls0XTsKLQotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3NdID0gcF9icy0+QnVmZmVyWzRdOwotCi0gICAgICAgIHBfYnMtPkJ1ZmZlciA9IHBfYnMtPkJ1ZmZlciArIDU7Ci0KLSAgICAgICAgcF9icy0+Yml0UG9zID0gMDsKLSAgICAgICAgcF9icy0+bGFzdFRvdGFsQml0cyA9IDA7Ci0gICAgICAgIHBfYnMtPm51bUJpdHNJbkJ1ZmZlciA9ICggaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA1KSA8PCAzOwotICAgICAgICBwX2JzLT5yZWFkYWJsZUJ5dGVzSW5CdWZmZXIgPSBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIDU7Ci0KLSAgICAgICAgcF9icy0+dWkzMlRlbXBCdWZmID0gMDsKLSAgICAgICAgcF9icy0+aThCaXRDbnQgPSAwOwotICAgICAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwX2JzLT5CdWZmZXI7Ci0gICAgICAgIHBfYnMtPnVpMzJMYXN0VHdvQnl0ZXMgPSAweEZGRkZGRkZGOwotCi0gICAgICAgIEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAwKTsKLQotICAgICAgICBuYWxfc2l6ZSA9ICggbmFsX3NpemVfaGlnaDE2IDw8IDE2KSArIG5hbF9zaXplX2xvdzE2OwotCi0gICAgICAgIGZyYW1lX3NpemUgKz0gbmFsX3NpemUgKyA0OwotCi0gICAgICAgIGZvcmJpZGRlbl9iaXQgPSAoIG5hbHVfaW5mbyA+PiA3KSAmIDE7Ci0gICAgICAgIG5hbF9yZWZfaWRjID0gKCBuYWx1X2luZm8gPj4gNSkgJiAzOwotICAgICAgICBuYWxfdW5pdF90eXBlID0gKG5hbHVfaW5mbykgJjB4MWY7Ci0KLSAgICAgICAgTlNXQVZDTUNTX2luaXRCaXRzdHJlYW0oJmluc3RhbmNlLT5lbmNicyk7Ci0KLSAgICAgICAgaW5zdGFuY2UtPmVuY2JzLnN0cmVhbUJ1ZmZlciA9IG91dGJ1ZmYgKyBvdXRidWZmcG9zICsgMTsKLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA4ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIDogUFBTIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDcgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlNQUyBQYWNrZXQgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciA6IFNQUyIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKG5hbF91bml0X3R5cGUgPT0gNSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgICAgICAgICAgaW5zdGFuY2UtPlBPQ19sc2IgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggbmFsX3VuaXRfdHlwZSA9PSAxKSB8fCAobmFsX3VuaXRfdHlwZSA9PSA1KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0X21iX2luX3NsaWNlID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIHNsaWNlX3R5cGUgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgICAgICAgICAvKiBGaXJzdCBNQiBpbiBzbGljZSAqLwotICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgZmlyc3RfbWJfaW5fc2xpY2UpOwotCi0gICAgICAgICAgICAvKiBTbGljZSBUeXBlICovCi0gICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBzbGljZV90eXBlKTsKLQotICAgICAgICAgICAgLyogUGljdHVyZSBQYXJhbWV0ZXIgc2V0IElkICovCi0gICAgICAgICAgICBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5waWNfcGFyYW1ldGVyX3NldF9pZDsKLSAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHBpY19wYXJhbWV0ZXJfc2V0X2lkKTsKLQotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLAotICAgICAgICAgICAgICAgIGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+ZnJhbWVfY291bnQsCi0gICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKLQotICAgICAgICAgICAgLy8gSW4gQmFzZWxpbmUgUHJvZmlsZTogZnJhbWVfbWJzX29ubHlfZmxhZyBzaG91bGQgYmUgT04KLSAgICAgICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY29kZXJfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQKLSAgICAgICAgICAgICAgICAgICAgKyA0KTsKLQotICAgICAgICAgICAgICAgIC8vIGluIGJhc2VsaW5lIHByb2ZpbGUgZmllbGRfcGljX2ZsYWcgc2hvdWxkIGJlIG9mZi4KLSAgICAgICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY29kZXJfcHBzLnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggKCBpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMucGljX29yZGVyX2NudF90eXBlID09IDEpCi0gICAgICAgICAgICAgICAgJiYgKGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZykgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgICAgICAgICAgICAgLy8gaW4gYmFzZWxpbmUgcHJvZmlsZSBmaWVsZF9waWNfZmxhZyBzaG91bGQgYmUgb2ZmLgotICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMucGljX29yZGVyX3ByZXNlbnRfZmxhZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+Y2xpcF9zcHMucGljX29yZGVyX2NudF90eXBlID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIGluc3RhbmNlLT5QT0NfbHNiLAotICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpbiBiYXNlbGluZSBwcm9maWxlIGZpZWxkX3BpY19mbGFnIHNob3VsZCBiZSBvZmYuCi0gICAgICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5waWNfb3JkZXJfcHJlc2VudF9mbGFnICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5TV0FWQ01DU19zRXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoICggaW5zdGFuY2UtPmNsaXBfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKQotICAgICAgICAgICAgICAgICYmIChpbnN0YW5jZS0+Y2xpcF9zcHMuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1Nfc0V4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCAwKTsKLQotICAgICAgICAgICAgICAgIC8vIGluIGJhc2VsaW5lIHByb2ZpbGUgZmllbGRfcGljX2ZsYWcgc2hvdWxkIGJlIG9mZi4KLSAgICAgICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY29kZXJfcHBzLnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTlNXQVZDTUNTX3NFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbnQgPSBwX2JzLT5iaXRQb3MgJiAweDc7Ci0KLSAgICAgICAgICAgIGlmKCBjbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudCA9IDggLSBjbnQ7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCBjbnQpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsIGNudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNudCA9IHBfYnMtPmJpdFBvcyA+PiAzOwotCi0gICAgICAgICAgICB3aGlsZSggY250IDwgKG5hbF9zaXplIC0gMikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgOCk7Ci0gICAgICAgICAgICAgICAgY250ID0gcF9icy0+Yml0UG9zID4+IDM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0KLSAgICAgICAgICAgIGlmKCB0ZW1wICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbnQrKzsKLSAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotCi0gICAgICAgICAgICAgICAgaWYoIDggLSBjbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgKDggLSBjbnQpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0UmJzcFRiaXRzKCZpbnN0YW5jZS0+ZW5jYnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVSA6IDEzIHRlbXAgPSAwIHRyYWlsaW5nIGJpdHMgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLT5lbmNicy5iaXRQb3MgJSA4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKDggLSBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5lbmNicy5ieXRlQ250OwotICAgICAgICAgICAgdGVtcCA9IHRlbXAgKyAxOwotCi0gICAgICAgICAgICBvdXRidWZmcG9zID0gb3V0YnVmZnBvcyArIHRlbXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqb3V0YnVmX3NpemUgPSBvdXRidWZmcG9zOwotCi0gICAgaW5zdGFuY2UtPlBPQ19sc2IgPSBpbnN0YW5jZS0+UE9DX2xzYiArIDE7Ci0KLSAgICBpZiggaW5zdGFuY2UtPlBPQ19sc2IgPT0gaW5zdGFuY2UtPlBPQ19sc2JfbW9kICkKLSAgICB7Ci0gICAgICAgIGluc3RhbmNlLT5QT0NfbHNiID0gMDsKLSAgICB9Ci0gICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gaW5zdGFuY2UtPmZyYW1lX2NvdW50ICsgMTsKLQotICAgIGlmKCBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPT0gaW5zdGFuY2UtPmZyYW1lX21vZF9jb3VudCApCi0gICAgewotICAgICAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgIH0KLQotICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXIgZG9lcyBub3QgcHJvdmlkZSB0aGUgc2l6ZSBpbiB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgQVUsIGFkZCBpdAotCi0gICAgZnJlZShwVG1wQnVmZjEpOwotICAgIHBUbXBCdWZmMSA9IE00T1NBX05VTEw7Ci0gICAgaW5idWZmID0gKE00T1NBX1VJbnQ4ICopcFRtcEJ1ZmYyOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0ludDMyIERlY1NQU01DUyggQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsCi0gICAgICAgICAgICAgICAgICAgICAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgKnNwcyApCi17Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRPU0FfSW50MzIgdGVtcF9tYXhfZHBiX3NpemU7Ci0gICAgTTRPU0FfSW50MzIgbmJfaWdub3JlX2JpdHM7Ci0gICAgTTRPU0FfSW50MzIgZXJyb3I7Ci0gICAgTTRPU0FfVUludDggcHJvZmlsZV9pZGMsIGxldmVsX2lkYywgcmVzZXJ2ZWRfemVyb180Yml0cywKLSAgICAgICAgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDggY29uc3RyYWludF9zZXQwX2ZsYWcsIGNvbnN0cmFpbnRfc2V0MV9mbGFnLAotICAgICAgICBjb25zdHJhaW50X3NldDJfZmxhZywgY29uc3RyYWludF9zZXQzX2ZsYWc7Ci0KLSAgICBzcHMtPnByb2ZpbGVfaWRjID0gKE00T1NBX1VJbnQ4KUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLSAgICBzcHMtPmNvbnN0cmFpbnRfc2V0MF9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHNwcy0+Y29uc3RyYWludF9zZXQxX2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0gICAgc3BzLT5jb25zdHJhaW50X3NldDJfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBzcHMtPmNvbnN0cmFpbnRfc2V0M19mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHJlc2VydmVkX3plcm9fNGJpdHMgPSAoTTRPU0FfVUludDgpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDQpOwotICAgIHNwcy0+bGV2ZWxfaWRjID0gKE00T1NBX1VJbnQ4KUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLSAgICBzcHMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgc3BzLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgc3BzLT5NYXhGcmFtZU51bSA9IDEgPDwgKHNwcy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOwotICAgIHNwcy0+cGljX29yZGVyX2NudF90eXBlID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICBpZiAoc3BzLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAgIHNwcy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICBzcHMtPk1heFBpY09yZGVyQ250THNiID0KLSAgICAgICAgICAgIDEgPDwgKHNwcy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7Ci0gICAgfQotICAgIGVsc2UgaWYoIHNwcy0+cGljX29yZGVyX2NudF90eXBlID09IDEgKQotICAgIHsKLSAgICAgICAgc3BzLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZyA9Ci0gICAgICAgICAgICAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICAgICAgLy8gVGhpcyBmaXggc2hvdWxkIGJlIGdlbmVyaWMgdG8gcmVtb3ZlIGNvZGVjIGRlcGVuZGVuY3kKLQotICAgICAgICBzcHMtPm9mZnNldF9mb3Jfbm9uX3JlZl9waWMgPQotICAgICAgICAgICAgSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgPQotICAgICAgICAgICAgSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLQotCi0gICAgICAgIC8qbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSBtdXN0IGJlIGluIHRoZSByYW5nZSAwLCAyNTUqLwotCi0gICAgICAgIHNwcy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAvKiBjb21wdXRlIGRlbHRhUE9DICovCi0gICAgICAgIHNwcy0+ZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGUgPSAwOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgc3BzLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGlzIGZpeCBzaG91bGQgYmUgZ2VuZXJpYyB0byByZW1vdmUgY29kZWMgZGVwZW5kZW5jeQotICAgICAgICAgICAgc3BzLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXSA9Ci0gICAgICAgICAgICAgICAgSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAgICAgc3BzLT5leHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZSArPQotICAgICAgICAgICAgICAgIHNwcy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBudW1fcmVmX2ZyYW1lcyBtdXN0IGJlIGluIHRoZSByYW5nZSAwLDE2ICovCi0gICAgc3BzLT5udW1fcmVmX2ZyYW1lcyA9IChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIHNwcy0+Z2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnID0KLSAgICAgICAgKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgc3BzLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSA9Ci0gICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICBzcHMtPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSA9Ci0gICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgIHNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIGlmICghc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnKQotICAgIHsKLSAgICAgICAgc3BzLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnID0KLSAgICAgICAgICAgIChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3BzLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnID0gMDsKLSAgICB9Ci0KLSAgICBzcHMtPlBpY1dpZHRoSW5NYnMgPSBzcHMtPnBpY193aWR0aF9pbl9tYnNfbWludXMxICsgMTsKLSAgICBzcHMtPkZyYW1lSGVpZ2h0SW5NYnMgPSAoIDIgLSBzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWcpICogXAotICAgICAgICAoc3BzLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgKyAxKTsKLSNpZmRlZiBfQ0FQX0ZNT18KLQotICAgIHNwcy0+TnVtU2xpY2VHcm91cE1hcFVuaXRzID0KLSAgICAgICAgc3BzLT5QaWNXaWR0aEluTWJzICogKHNwcy0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSk7Ci0gICAgc3BzLT5NYXhQaWNTaXplSW5NYnMgPSBzcHMtPlBpY1dpZHRoSW5NYnMgKiBzcHMtPkZyYW1lSGVpZ2h0SW5NYnM7Ci0KLSNlbmRpZiAvKl9DQVBfRk1PXyovCi0KLSAgICBzcHMtPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICBpZiggc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnID09IDAgKQotICAgICAgICBzcHMtPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgPSAxOwotCi0gICAgc3BzLT5mcmFtZV9jcm9wcGluZ19mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgaWYoIHNwcy0+ZnJhbWVfY3JvcHBpbmdfZmxhZyApCi0gICAgewotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNwcy0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldCA9IDA7Ci0gICAgICAgIHNwcy0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQgPSAwOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfdG9wX29mZnNldCA9IDA7Ci0gICAgICAgIHNwcy0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSAgICBzcHMtPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIGlmIChzcHMtPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykgewotICAgICAgICAvKiBubyBlcnJvciBtZXNzYWdlIGFzIHN0cmVhbSBjYW4gYmUgZGVjb2RlZCB3aXRob3V0IFZVSSBtZXNzYWdlcyAqLwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9JbnQzMiBEZWNQUFNNQ1MoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLAotICAgICAgICAgICAgICAgICAgICAgIENvbVBpY3R1cmVQYXJhbWV0ZXJTZXRfdF9NQ1MgKnBwcyApCi17Ci0gICAgTTRPU0FfSW50MzIgZXJyb3I7Ci0gICAgTTRPU0FfVUludDMyIHBpY19wYXJhbWV0ZXJfc2V0X2lkOwotCi0jaWZkZWYgX0NBUF9GTU9fCi0gICAgTTRPU0FfVUludDMyIGksIGxlbmd0aCwgdjsKLSNlbmRpZgotCi0gICAgTTRPU0FfSW50MzIgbmJfaWdub3JlX2JpdHM7Ci0KLSAgICBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgcHBzLT5waWNfcGFyYW1ldGVyX3NldF9pZCA9IChNNE9TQV9VSW50OClwaWNfcGFyYW1ldGVyX3NldF9pZDsKLQotICAgIHBwcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPQotICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgIC8qIGVudHJvcHlfY29kaW5nX21vZGVfZmxhZyBtdXN0IGJlIDAgb3IgMSAqLwotICAgIHBwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHBwcy0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIHBwcy0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotI2lmZGVmIF9DQVBfRk1PXwotICAgIC8qIEZNTyBzdHVmZiBiZWdpbnMgaGVyZSAqLwotCi0gICAgcHBzLT5tYXBfaW5pdGlhbGl6ZWQgPSBGQUxTRTsKLQotICAgIGlmKCBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gMCApCi0gICAgewotICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX21hcF90eXBlID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgICAgIHN3aXRjaCggcHBzLT5zbGljZV9ncm91cF9tYXBfdHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHBzLT5ydW5fbGVuZ3RoX21pbnVzMVtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHBzLT50b3BfbGVmdFtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgICAgIHBwcy0+Ym90dG9tX3JpZ2h0W2ldID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICAgICAgICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgIHBwcy0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAgICAgICAgIHBwcy0+c2xpY2VfZ3JvdXBfaWQgPSAoSDI2NFVJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICopTTRIMjY0RGVjX21hbGxvYygocHBzLT5waWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxCi0gICAgICAgICAgICAgICAgICAgICsgMSksIE00SDI2NF9DT1JFSUQsIChNNE9TQV9DaGFyICopIlBQUyIpOwotCi0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcHBzLT5zbGljZV9ncm91cF9pZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJEZWNQUFNNQ1M6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoIGxlbmd0aCA9IDAsIHYgPSBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxICsgMTsgdiAhPSAwOwotICAgICAgICAgICAgICAgICAgICB2ID4+PSAxLCBsZW5ndGgrKyApOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IHBwcy0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMTsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHBzLT5zbGljZV9ncm91cF9pZFtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KWdldEJpdHMocF92bGNfZW5naW5lLT5wX2JzLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBwcy0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSAwOwotICAgIH0KLSAgICAvKiBFbmQgb2YgRk1PIHN0dWZmICovCi0KLSNlbHNlCi0KLSNlbmRpZiAvKiBfQ0FQX0ZNT18gKi8KLQotICAgIC8qIG51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwgMzEgKi8KLQotICAgIHBwcy0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA9Ci0gICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIC8qIG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwgMzEgKi8KLSAgICBwcHMtPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICBwcHMtPndlaWdodGVkX3ByZWRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIC8qIHdlaWdodGVkX2JpcHJlZF9pZGMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwyICovCi0gICAgcHBzLT53ZWlnaHRlZF9iaXByZWRfaWRjID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDIpOwotCi0gICAgLyogcGljX2luaXRfcXBfbWludXMyNiBtdXN0IGJlIGluIHRoZSByYW5nZSAtMjYsMjUgKi8KLSAgICBwcHMtPnBpY19pbml0X3FwX21pbnVzMjYgPQotICAgICAgICAoTTRPU0FfSW50MTYpSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgIC8qIHBpY19pbml0X3FzX21pbnVzMjYgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgLTI2LDI1ICovCi0gICAgcHBzLT5waWNfaW5pdF9xc19taW51czI2ID0KLSAgICAgICAgKE00T1NBX0ludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAvKiBjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0IG11c3QgYmUgaW4gdGhlIHJhbmdlIC0xMiwrMTIgKi8KLSAgICBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXQgPQotICAgICAgICAoTTRPU0FfSW50MTYpSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICBwcHMtPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnID0KLSAgICAgICAgKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHBwcy0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHBwcy0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBIMjY0TUNTX1Byb2Nlc3NTUFNfUFBTKCBOU1dBVkNfTUNTX3QgKmluc3RhbmNlLCBNNE9TQV9VSW50OCAqaW5idWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaW5idWZfc2l6ZSApCi17Ci0gICAgQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIGJzOwotICAgIENvbUJpdFN0cmVhbU1DU190ICpwX2JzMSwgYnMxOwotCi0gICAgTTRPU0FfVUludDggbmFsdV9pbmZvID0gMDsKLSAgICBNNE9TQV9JbnQzMiBmb3JiaWRkZW5fYml0LCBuYWxfcmVmX2lkYywgbmFsX3VuaXRfdHlwZTsKLSAgICBNNE9TQV9JbnQzMiBmaXJzdF9tYl9pbl9zbGljZSwgc2xpY2VfdHlwZSwgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSAwLAotICAgICAgICBmcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDggdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7Ci0gICAgTTRPU0FfSW50MzIgdGVtcF9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgYml0c3RvRGlhY2FyZCwgYnl0ZXM7Ci0gICAgTTRPU0FfVUludDMyIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgTTRPU0FfSW50MzIgbmV3X2J5dGVzLCBpbml0X2JpdF9wb3M7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgY250LCBjbnQxOwotICAgIE00T1NBX1VJbnQzMiBvdXRidWZmcG9zID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbmFsX3NpemVfbG93MTYsIG5hbF9zaXplX2hpZ2gxNjsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVfc2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHRlbXAgPSAwOwotICAgIE00T1NBX1VJbnQ4ICpsQ2xpcERTSTsKLSAgICBNNE9TQV9VSW50OCAqbENsaXBEU0lfUFBTX3N0YXJ0OwotICAgIE00T1NBX1VJbnQzMiBsQ2xpcERTSV9QUFNfb2Zmc2V0ID0gMDsKLQotICAgIE00T1NBX1VJbnQ4ICpsUFBTX0J1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIGxQUFNfQnVmZmVyX1NpemUgPSAwOwotCi0gICAgTTRPU0FfVUludDMyIGxTaXplLCBsU2l6ZTE7Ci0gICAgTTRPU0FfVUludDMyIGxBY3RpdmVTUFNJRF9DbGlwOwotICAgIE00T1NBX1VJbnQzMiBsQ2xpcFBQU1JlbUJpdHMgPSAwOwotCi0gICAgTTRPU0FfVUludDMyIGxFbmNvZGVyX1NQU0lEID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbEVuY29kZXJfUFBTSUQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBsRW5jb2RlclBQU1JlbUJpdHMgPSAwOwotICAgIE00T1NBX1VJbnQzMiBsRm91bmQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBzaXplOwotCi0gICAgTTRPU0FfVUludDggQ2xpcF9TUFNJRFszMl0gPSB7IDAgfTsKLSAgICBNNE9TQV9VSW50OCBDbGlwX1VzZWRTUFNJRFszMl0gPSB7IDAgfTsKLSAgICBNNE9TQV9VSW50OCBDbGlwX1BQU0lEWzI1Nl0gPSB7IDAgfTsKLSAgICBNNE9TQV9VSW50OCBDbGlwX1NQU0lEX2luX1BQU1syNTZdID0geyAwIH07Ci0gICAgTTRPU0FfVUludDggQ2xpcF9Vc2VkUFBTSURbMjU2XSA9IHsgMCB9OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgcF9icyA9ICZiczsKLSAgICBwX2JzMSA9ICZiczE7Ci0KLSAgICAvKiBGaW5kIHRoZSBhY3RpdmUgU1BTIElEICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGluc3RhbmNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiSDI2NE1DU19Qcm9jZXNzU1BTX1BQUzogaW5zdGFuY2UgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaW5zdGFuY2UtPm1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGggPQotICAgICAgICAgICAgKGluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvWzRdICYgMHgwMykgKyAxOwotCi0gICAgaW5zdGFuY2UtPm1fZW5jb2Rlcl9TUFNfQ250ID0gaW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm9bNV0gJiAweDFGOwotCi0gICAgbENsaXBEU0kgPSBpbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyArIDY7Ci0KLSAgICBsQ2xpcERTSV9QUFNfb2Zmc2V0ID0gNjsKLQotICAgIGZvciAoIGNudCA9IDA7IGNudCA8IGluc3RhbmNlLT5tX2VuY29kZXJfU1BTX0NudDsgY250KysgKQotICAgIHsKLSAgICAgICAgbFNpemUgPSAoIGxDbGlwRFNJWzBdIDw8IDgpICsgbENsaXBEU0lbMV07Ci0gICAgICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyAyOwotCi0gICAgICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShsQ2xpcERTSSArIDQpOwotICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9icywgbFNpemUgLSA0KTsKLQotICAgICAgICBDbGlwX1NQU0lEW2NudF0gPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICBDbGlwX1VzZWRTUFNJRFtDbGlwX1NQU0lEW2NudF1dID0gMTsKLQotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgbFNpemU7Ci0gICAgICAgIGxDbGlwRFNJX1BQU19vZmZzZXQgPSBsQ2xpcERTSV9QUFNfb2Zmc2V0ICsgMiArIGxTaXplOwotICAgIH0KLQotICAgIGluc3RhbmNlLT5tX2VuY29kZXJfUFBTX0NudCA9IGxDbGlwRFNJWzBdOwotICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyAxOwotCi0gICAgbENsaXBEU0lfUFBTX3N0YXJ0ID0gbENsaXBEU0k7Ci0KLSAgICBmb3IgKCBjbnQgPSAwOyBjbnQgPCBpbnN0YW5jZS0+bV9lbmNvZGVyX1BQU19DbnQ7IGNudCsrICkKLSAgICB7Ci0gICAgICAgIGxTaXplID0gKCBsQ2xpcERTSVswXSA8PCA4KSArIGxDbGlwRFNJWzFdOwotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgMjsKLQotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikobENsaXBEU0kgKyAxKTsKLSAgICAgICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMsIGxTaXplIC0gMSk7Ci0KLSAgICAgICAgQ2xpcF9QUFNJRFtjbnRdID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgQ2xpcF9Vc2VkUFBTSURbQ2xpcF9QUFNJRFtjbnRdXSA9IDE7Ci0gICAgICAgIENsaXBfU1BTSURfaW5fUFBTW0NsaXBfUFBTSURbY250XV0gPQotICAgICAgICAgICAgSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgbFNpemU7Ci0gICAgfQotCi0gICAgLyogRmluZCB0aGUgY2xpcCBTUFMgSUQgdXNlZCBhdCB0aGUgY3V0IHN0YXJ0IGZyYW1lICovCi0gICAgd2hpbGUoICggKE00T1NBX0ludDMyKWZyYW1lX3NpemUpIDwgaW5idWZfc2l6ZSApCi0gICAgewotICAgICAgICBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikoaW5idWZmICsgZnJhbWVfc2l6ZSk7Ci0KLSAgICAgICAgc3dpdGNoKCBpbnN0YW5jZS0+bV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZSA9ICh1bnNpZ25lZCBjaGFyKXBfYnMtPkJ1ZmZlclswXTsKLSAgICAgICAgICAgICAgICBuYWx1X2luZm8gPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbMV07Ci0gICAgICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gcF9icy0+QnVmZmVyICsgMjsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgbmFsX3NpemVfaGlnaDE2ID0gKCBwX2JzLT5CdWZmZXJbMF0gPDwgOCkgKyBwX2JzLT5CdWZmZXJbMV07Ci0gICAgICAgICAgICAgICAgbmFsX3NpemUgPSBuYWxfc2l6ZV9oaWdoMTY7Ci0gICAgICAgICAgICAgICAgbmFsdV9pbmZvID0gKHVuc2lnbmVkIGNoYXIpcF9icy0+QnVmZmVyWzJdOwotICAgICAgICAgICAgICAgIHBfYnMtPkJ1ZmZlciA9IHBfYnMtPkJ1ZmZlciArIDM7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIG5hbF9zaXplX2hpZ2gxNiA9ICggcF9icy0+QnVmZmVyWzBdIDw8IDgpICsgcF9icy0+QnVmZmVyWzFdOwotICAgICAgICAgICAgICAgIG5hbF9zaXplX2xvdzE2ID0gKCBwX2JzLT5CdWZmZXJbMl0gPDwgOCkgKyBwX2JzLT5CdWZmZXJbM107Ci0gICAgICAgICAgICAgICAgbmFsX3NpemUgPSAoIG5hbF9zaXplX2hpZ2gxNiA8PCAxNikgKyBuYWxfc2l6ZV9sb3cxNjsKLSAgICAgICAgICAgICAgICBuYWx1X2luZm8gPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbNF07Ci0gICAgICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gcF9icy0+QnVmZmVyICsgNTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5hbF9zaXplID09IDApIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCIwIHNpemUgbmFsIHVuaXQgYXQgbGluZSAlZCIsIF9fTElORV9fKTsKLSAgICAgICAgICAgIGZyYW1lX3NpemUgKz0gaW5zdGFuY2UtPm1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGg7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHBfYnMtPmJpdFBvcyA9IDA7Ci0gICAgICAgIHBfYnMtPmxhc3RUb3RhbEJpdHMgPSAwOwotICAgICAgICBwX2JzLT5udW1CaXRzSW5CdWZmZXIgPQotICAgICAgICAgICAgKCBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIGluc3RhbmNlLT5tX051bV9CeXRlc19OQUxVbml0TGVuZ3RoIC0gMSkKLSAgICAgICAgICAgIDw8IDM7Ci0gICAgICAgIHBfYnMtPnJlYWRhYmxlQnl0ZXNJbkJ1ZmZlciA9Ci0gICAgICAgICAgICBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIGluc3RhbmNlLT5tX051bV9CeXRlc19OQUxVbml0TGVuZ3RoIC0gMTsKLQotICAgICAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgPSAwOwotICAgICAgICBwX2JzLT5pOEJpdENudCA9IDA7Ci0gICAgICAgIHBfYnMtPnB1aThCZnJQdHIgPSAoTTRPU0FfSW50OCAqKXBfYnMtPkJ1ZmZlcjsKLSAgICAgICAgcF9icy0+dWkzMkxhc3RUd29CeXRlcyA9IDB4RkZGRkZGRkY7Ci0KLSAgICAgICAgSDI2NE1DU19nZXRCaXRzKHBfYnMsIDApOwotCi0gICAgICAgIGZyYW1lX3NpemUgKz0gbmFsX3NpemUgKyBpbnN0YW5jZS0+bV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aDsKLQotICAgICAgICBmb3JiaWRkZW5fYml0ID0gKCBuYWx1X2luZm8gPj4gNykgJiAxOwotICAgICAgICBuYWxfcmVmX2lkYyA9ICggbmFsdV9pbmZvID4+IDUpICYgMzsKLSAgICAgICAgbmFsX3VuaXRfdHlwZSA9IChuYWx1X2luZm8pICYweDFmOwotCi0gICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDggKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiSDI2NE1DU19Qcm9jZXNzU1BTX1BQUygpIEVycm9yOiBQUFMiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA3ICkKLSAgICAgICAgewotICAgICAgICAgICAgLypTUFMgUGFja2V0ICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiSDI2NE1DU19Qcm9jZXNzU1BTX1BQUygpIEVycm9yOiBTUFMiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKCBuYWxfdW5pdF90eXBlID09IDEpIHx8IChuYWxfdW5pdF90eXBlID09IDUpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmlyc3RfbWJfaW5fc2xpY2UgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgc2xpY2VfdHlwZSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGxBY3RpdmVTUFNJRF9DbGlwID0gQ2xpcF9TUFNJRF9pbl9QUFNbcGljX3BhcmFtZXRlcl9zZXRfaWRdOwotCi0gICAgaW5zdGFuY2UtPmZpbmFsX1NQU19JRCA9IGxBY3RpdmVTUFNJRF9DbGlwOwotICAgIC8qIERvIHdlIG5lZWQgdG8gYWRkIGVuY29kZXIgUFBTIHRvIGNsaXAgUFBTICovCi0KLSAgICBsQ2xpcERTSSA9IGxDbGlwRFNJX1BQU19zdGFydDsKLQotICAgIGZvciAoIGNudCA9IDA7IGNudCA8IGluc3RhbmNlLT5tX2VuY29kZXJfUFBTX0NudDsgY250KysgKQotICAgIHsKLSAgICAgICAgbFNpemUgPSAoIGxDbGlwRFNJWzBdIDw8IDgpICsgbENsaXBEU0lbMV07Ci0gICAgICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyAyOwotCi0gICAgICAgIGlmKCBsQWN0aXZlU1BTSURfQ2xpcCA9PSBDbGlwX1NQU0lEX2luX1BQU1tDbGlwX1BQU0lEW2NudF1dICkKLSAgICAgICAgewotICAgICAgICAgICAgbFBQU19CdWZmZXIgPSBsQ2xpcERTSSArIDE7Ci0gICAgICAgICAgICBsUFBTX0J1ZmZlcl9TaXplID0gbFNpemUgLSAxOwotCi0gICAgICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikobENsaXBEU0kgKyAxKTsKLSAgICAgICAgICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzLCBsU2l6ZSAtIDEpOwotCi0gICAgICAgICAgICBDbGlwX1BQU0lEW2NudF0gPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgQ2xpcF9Vc2VkUFBTSURbQ2xpcF9TUFNJRFtjbnRdXSA9IDE7Ci0gICAgICAgICAgICBDbGlwX1NQU0lEX2luX1BQU1tjbnRdID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIGxDbGlwUFBTUmVtQml0cyA9ICggbFNpemUgLSAxKSA8PCAzOwotICAgICAgICAgICAgbENsaXBQUFNSZW1CaXRzIC09IHBfYnMtPmJpdFBvczsKLQotICAgICAgICAgICAgdGVtcCA9IGxDbGlwRFNJW2xTaXplIC0gMV07Ci0KLSAgICAgICAgICAgIGNudDEgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbnQxKys7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNudDErKzsKLSAgICAgICAgICAgIGxDbGlwUFBTUmVtQml0cyAtPSBjbnQxOwotCi0gICAgICAgICAgICBsU2l6ZTEgPSBpbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZSAtIDE7Ci0gICAgICAgICAgICBwX2JzMS0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTICsgMSk7Ci0gICAgICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9iczEsIGxTaXplMSk7Ci0KLSAgICAgICAgICAgIGxFbmNvZGVyX1BQU0lEID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzMSk7Ci0gICAgICAgICAgICBsRW5jb2Rlcl9TUFNJRCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9iczEpOwotCi0gICAgICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgPSAoIGxTaXplMSkgPDwgMzsKLSAgICAgICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyAtPSBwX2JzMS0+Yml0UG9zOwotCi0gICAgICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPm1fcEVuY29kZXJQUFNbbFNpemUxXTsKLQotICAgICAgICAgICAgY250MSA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlKCAoIHRlbXAgJiAweDEpID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudDErKzsKLSAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY250MSsrOwotICAgICAgICAgICAgbEVuY29kZXJQUFNSZW1CaXRzIC09IGNudDE7Ci0KLSAgICAgICAgICAgIGlmKCBsRW5jb2RlclBQU1JlbUJpdHMgPT0gbENsaXBQUFNSZW1CaXRzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSggbEVuY29kZXJQUFNSZW1CaXRzID4gOCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSBIMjY0TUNTX2dldEJpdHMocF9iczEsIDgpOwotICAgICAgICAgICAgICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgPSBsRW5jb2RlclBQU1JlbUJpdHMgLSA4OwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCB0ZW1wMSAhPSB0ZW1wMiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIGxFbmNvZGVyUFBTUmVtQml0cyA8IDggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGxFbmNvZGVyUFBTUmVtQml0cyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIGxFbmNvZGVyUFBTUmVtQml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMiA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzMSwgbEVuY29kZXJQUFNSZW1CaXRzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRlbXAxID09IHRlbXAyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsRm91bmQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbEZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyBsU2l6ZTsKLSAgICB9Ci0KLSAgICAvKiBGb3JtIHRoZSBmaW5hbCBTUFMgYW5kIFBQUyBkYXRhICovCi0KLSAgICBpZiggbEZvdW5kID09IDEgKQotICAgIHsKLSAgICAgICAgLyogTm8gbmVlZCB0byBhZGQgUFBTICovCi0gICAgICAgIGluc3RhbmNlLT5maW5hbF9QUFNfSUQgPSBDbGlwX1BQU0lEW2NudF07Ci0KLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJpbnN0YW5jZS0+bV9wRmluYWxEU0kiKTsKLQotICAgICAgICBpZiggaW5zdGFuY2UtPm1fcEZpbmFsRFNJID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiaW5zdGFuY2UtPm1fcEZpbmFsRFNJOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0lTaXplID0gaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKWluc3RhbmNlLT5tX3BGaW5hbERTSSwKLSAgICAgICAgICAgICh2b2lkICopaW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICBpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEFERCBQUFMgKi8KLSAgICAgICAgLyogZmluZCB0aGUgZnJlZSBQUFMgSUQgKi8KLQotICAgICAgICBjbnQgPSAwOwotCi0gICAgICAgIHdoaWxlKCBDbGlwX1VzZWRQUFNJRFtjbnRdICkKLSAgICAgICAgewotICAgICAgICAgICAgY250Kys7Ci0gICAgICAgIH0KLSAgICAgICAgaW5zdGFuY2UtPmZpbmFsX1BQU19JRCA9IGNudDsKLQotICAgICAgICBzaXplID0gaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgKyBpbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZQotICAgICAgICAgICAgKyAxMDsKLQotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0kgPSAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJpbnN0YW5jZS0+bV9wRmluYWxEU0kiKTsKLQotICAgICAgICBpZiggaW5zdGFuY2UtPm1fcEZpbmFsRFNJID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiaW5zdGFuY2UtPm1fcEZpbmFsRFNJOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHkoKHZvaWQgKilpbnN0YW5jZS0+bV9wRmluYWxEU0ksCi0gICAgICAgICAgICAodm9pZCAqKWluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotCi0gICAgICAgIHRlbXAgPSBpbnN0YW5jZS0+bV9wRmluYWxEU0lbbENsaXBEU0lfUFBTX29mZnNldF07Ci0gICAgICAgIHRlbXAgPSB0ZW1wICsgMTsKLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2xDbGlwRFNJX1BQU19vZmZzZXRdID0gdGVtcDsKLQotICAgICAgICAvL3RlbXAgPSBpbnN0YW5jZS0+bV9wRW5jb2RlclBQU1swXTsKLSAgICAgICAgbFNpemUxID0gaW5zdGFuY2UtPm1fZW5jb2RlclBQU1NpemUgLSAxOwotICAgICAgICBwX2JzMS0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTICsgMSk7Ci0gICAgICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzMSwgbFNpemUxKTsKLQotICAgICAgICBsRW5jb2Rlcl9QUFNJRCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9iczEpOwotICAgICAgICBsRW5jb2Rlcl9TUFNJRCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9iczEpOwotCi0gICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyA9ICggbFNpemUxKSA8PCAzOwotICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgLT0gcF9iczEtPmJpdFBvczsKLQotICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPm1fcEVuY29kZXJQUFNbbFNpemUxXTsKLQotICAgICAgICBjbnQxID0gMDsKLQotICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgY250MSsrOwotICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLSAgICAgICAgfQotICAgICAgICBjbnQxKys7Ci0gICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyAtPSBjbnQxOwotCi0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSVtpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSArIDJdID0KLSAgICAgICAgICAgIGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTWzBdOwotCi0gICAgICAgIE5TV0FWQ01DU19pbml0Qml0c3RyZWFtKCZpbnN0YW5jZS0+ZW5jYnMpOwotICAgICAgICBpbnN0YW5jZS0+ZW5jYnMuc3RyZWFtQnVmZmVyID0KLSAgICAgICAgICAgICYoaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2luc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICsgM10pOwotICAgICAgICBsUFBTX0J1ZmZlciA9IGluc3RhbmNlLT5lbmNicy5zdHJlYW1CdWZmZXI7Ci0KLSAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgaW5zdGFuY2UtPmZpbmFsX1BQU19JRCk7Ci0gICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIGluc3RhbmNlLT5maW5hbF9TUFNfSUQpOwotCi0gICAgICAgIHdoaWxlKCBsRW5jb2RlclBQU1JlbUJpdHMgPiA4ICkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzMSwgOCk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCA4KTsKLSAgICAgICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyA9IGxFbmNvZGVyUFBTUmVtQml0cyAtIDg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbEVuY29kZXJQUFNSZW1CaXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzMSwgbEVuY29kZXJQUFNSZW1CaXRzKTsKLSAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsIGxFbmNvZGVyUFBTUmVtQml0cyk7Ci0gICAgICAgIH0KLSAgICAgICAgTlNXQVZDTUNTX3B1dFJic3BUYml0cygmaW5zdGFuY2UtPmVuY2JzKTsKLQotICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPmVuY2JzLmJ5dGVDbnQ7Ci0gICAgICAgIGxQUFNfQnVmZmVyX1NpemUgPSB0ZW1wOwotICAgICAgICB0ZW1wID0gdGVtcCArIDE7Ci0KLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2luc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplXSA9Ci0gICAgICAgICAgICAoIHRlbXAgPj4gOCkgJiAweEZGOwotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0lbaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgKyAxXSA9Ci0gICAgICAgICAgICAodGVtcCkgJjB4RkY7Ci0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSVNpemUgPQotICAgICAgICAgICAgaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgKyAyICsgdGVtcDsKLSAgICB9Ci0KLSAgICAvKiBEZWNvZGUgdGhlIGNsaXAgU1BTICovCi0KLSAgICBsQ2xpcERTSSA9IGluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvICsgNjsKLQotICAgIGxDbGlwRFNJX1BQU19vZmZzZXQgPSA2OwotCi0gICAgZm9yICggY250ID0gMDsgY250IDwgaW5zdGFuY2UtPm1fZW5jb2Rlcl9TUFNfQ250OyBjbnQrKyApCi0gICAgewotICAgICAgICBsU2l6ZSA9ICggbENsaXBEU0lbMF0gPDwgOCkgKyBsQ2xpcERTSVsxXTsKLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIDI7Ci0KLSAgICAgICAgaWYoIENsaXBfU1BTSURbY250XSA9PSBpbnN0YW5jZS0+ZmluYWxfU1BTX0lEICkKLSAgICAgICAgewotICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGxDbGlwRFNJICsgMSk7Ci0gICAgICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9icywgbFNpemUgLSAxKTsKLQotICAgICAgICAgICAgZXJyID0gRGVjU1BTTUNTKHBfYnMsICZpbnN0YW5jZS0+Y2xpcF9zcHMpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL0NsaXBfU1BTSURbY250XSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAvL0NsaXBfVXNlZFNQU0lEW0NsaXBfU1BTSURbY250XV0gPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgbFNpemU7Ci0gICAgfQotCi0gICAgLyogRGVjb2RlIGVuY29kZXIgU1BTICovCi0gICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGluc3RhbmNlLT5tX3BFbmNvZGVyU1BTICsgMSk7Ci0gICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMsIGluc3RhbmNlLT5tX2VuY29kZXJTUFNTaXplIC0gMSk7Ci0gICAgZXJyID0gRGVjU1BTTUNTKHBfYnMsICZpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5udW1fcmVmX2ZyYW1lcwotICAgID4gaW5zdGFuY2UtPmNsaXBfc3BzLm51bV9yZWZfZnJhbWVzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAxMDA7IC8vbm90IHN1cHBvcnRlZAotICAgIH0KLQotICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKWxQUFNfQnVmZmVyOwotICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzLCBsUFBTX0J1ZmZlcl9TaXplKTsKLSAgICBEZWNQUFNNQ1MocF9icywgJmluc3RhbmNlLT5lbmNvZGVyX3Bwcyk7Ci0KLSAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgIGluc3RhbmNlLT5mcmFtZV9tb2RfY291bnQgPQotICAgICAgICAxIDw8IChpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOwotCi0gICAgaW5zdGFuY2UtPlBPQ19sc2IgPSAwOwotICAgIGluc3RhbmNlLT5QT0NfbHNiX21vZCA9Ci0gICAgICAgIDEgPDwgKGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgSDI2NE1DU19Qcm9jZXNzTkFMVSggTlNXQVZDX01DU190ICphaW5zdGFuY2UsIE00T1NBX1VJbnQ4ICppbmJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaW5idWZfc2l6ZSwgTTRPU0FfVUludDggKm91dGJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKm91dGJ1Zl9zaXplICkKLXsKLSAgICBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icywgYnM7Ci0gICAgTlNXQVZDX01DU190ICppbnN0YW5jZTsKLSAgICBNNE9TQV9VSW50OCBuYWx1X2luZm87Ci0gICAgTTRPU0FfSW50MzIgZm9yYmlkZGVuX2JpdCwgbmFsX3JlZl9pZGMsIG5hbF91bml0X3R5cGU7Ci0gICAgTTRPU0FfSW50MzIgZmlyc3RfbWJfaW5fc2xpY2UsIHNsaWNlX3R5cGUsIHBpY19wYXJhbWV0ZXJfc2V0X2lkLCBmcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDggdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7Ci0gICAgTTRPU0FfSW50MzIgdGVtcF9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgYml0c3RvRGlhY2FyZCwgYnl0ZXM7Ci0gICAgTTRPU0FfVUludDMyIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgTTRPU0FfSW50MzIgbmV3X2J5dGVzLCBpbml0X2JpdF9wb3M7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplOwotICAgIE00T1NBX1VJbnQzMiBjbnQ7Ci0gICAgTTRPU0FfVUludDMyIG91dGJ1ZmZwb3MgPSAwOwotICAgIC8vI2lmbmRlZiBER1JfRklYIC8vICsgbmV3Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplX2xvdzE2LCBuYWxfc2l6ZV9oaWdoMTY7Ci0gICAgLy8jZW5kaWYgLy8gKyBlbmQgbmV3Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lX3NpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wID0gMDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50OCAqYnVmZjsKLQotICAgIHBfYnMgPSAmYnM7Ci0gICAgaW5zdGFuY2UgPSAoTlNXQVZDX01DU190ICopYWluc3RhbmNlOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBpbnN0YW5jZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIkgyNjRNQ1NfUHJvY2Vzc05BTFU6IGluc3RhbmNlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKCBpbnN0YW5jZS0+aXNfZG9uZSApCi0gICAgICAgIHJldHVybiBlcnI7Ci0KLSAgICBpbmJ1ZmZbMF0gPSAweDAwOwotICAgIGluYnVmZlsxXSA9IDB4MDA7Ci0gICAgaW5idWZmWzJdID0gMHgwMDsKLSAgICBpbmJ1ZmZbM10gPSAweDAxOwotCi0KLSAgICB3aGlsZSggKE00T1NBX0ludDMyKWZyYW1lX3NpemUgPCBpbmJ1Zl9zaXplICkKLSAgICB7Ci0gICAgICAgIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbmJ1ZmYgKyBmcmFtZV9zaXplKTsKLQotCi0gICAgICAgIG5hbHVfaW5mbyA9ICh1bnNpZ25lZCBjaGFyKXBfYnMtPkJ1ZmZlcls0XTsKLQotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3NdID0gcF9icy0+QnVmZmVyWzBdOwotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAxXSA9IHBfYnMtPkJ1ZmZlclsxXTsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMl0gPSBwX2JzLT5CdWZmZXJbMl07Ci0gICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDNdID0gcF9icy0+QnVmZmVyWzNdOwotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyA0XSA9IHBfYnMtPkJ1ZmZlcls0XTsKLQotICAgICAgICBwX2JzLT5CdWZmZXIgPSBwX2JzLT5CdWZmZXIgKyA1OwotCi0gICAgICAgIHBfYnMtPmJpdFBvcyA9IDA7Ci0gICAgICAgIHBfYnMtPmxhc3RUb3RhbEJpdHMgPSAwOwotICAgICAgICBwX2JzLT5udW1CaXRzSW5CdWZmZXIgPSAoIGluYnVmX3NpemUgLSBmcmFtZV9zaXplIC0gNSkgPDwgMzsKLSAgICAgICAgcF9icy0+cmVhZGFibGVCeXRlc0luQnVmZmVyID0gaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA1OwotCi0gICAgICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA9IDA7Ci0gICAgICAgIHBfYnMtPmk4Qml0Q250ID0gMDsKLSAgICAgICAgcF9icy0+cHVpOEJmclB0ciA9IChNNE9TQV9JbnQ4ICopcF9icy0+QnVmZmVyOwotICAgICAgICBwX2JzLT51aTMyTGFzdFR3b0J5dGVzID0gMHhGRkZGRkZGRjsKLQotICAgICAgICBIMjY0TUNTX2dldEJpdHMocF9icywgMCk7Ci0KLQotCi0gICAgICAgIG5hbF9zaXplID0gaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA0OwotICAgICAgICBidWZmID0gaW5idWZmICsgZnJhbWVfc2l6ZSArIDQ7Ci0KLSAgICAgICAgd2hpbGUoIG5hbF9zaXplID4gNCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoIGJ1ZmZbMF0gPT0gMHgwMCkgJiYgKGJ1ZmZbMV0gPT0gMHgwMCkgJiYgKGJ1ZmZbMl0gPT0gMHgwMCkKLSAgICAgICAgICAgICAgICAmJiAoYnVmZlszXSA9PSAweDAxKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmID0gYnVmZiArIDE7Ci0gICAgICAgICAgICBuYWxfc2l6ZSA9IG5hbF9zaXplIC0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBuYWxfc2l6ZSA8PSA0ICkKLSAgICAgICAgewotICAgICAgICAgICAgbmFsX3NpemUgPSAwOwotICAgICAgICB9Ci0gICAgICAgIG5hbF9zaXplID0gKCBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIDQpIC0gbmFsX3NpemU7Ci0KLSAgICAgICAgLy8gICAgICBNNE9TQV9UUkFDRTFfMygiSDI2NE1DU19Qcm9jZXNzTkFMVSBmcmFtZSAgaW5wdXQgYnVmZiBzaXplID0gJWQgIGN1cnJlbnQgcG9zaXRpb24KLSAgICAgICAgLy89ICVkICAgbmFsIHNpemUgPSAlZCIsCi0gICAgICAgIC8vICBpbmJ1Zl9zaXplLCBmcmFtZV9zaXplLCAgbmFsX3NpemUgKyA0KTsKLSAgICAgICAgZnJhbWVfc2l6ZSArPSBuYWxfc2l6ZSArIDQ7Ci0KLQotCi0gICAgICAgIGZvcmJpZGRlbl9iaXQgPSAoIG5hbHVfaW5mbyA+PiA3KSAmIDE7Ci0gICAgICAgIG5hbF9yZWZfaWRjID0gKCBuYWx1X2luZm8gPj4gNSkgJiAzOwotICAgICAgICBuYWxfdW5pdF90eXBlID0gKG5hbHVfaW5mbykgJjB4MWY7Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gNSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qSURSL1BQUyBQYWNrZXQgLSBEbyBub3RoaW5nKi8KLSAgICAgICAgICAgIGluc3RhbmNlLT5pc19kb25lID0gMTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBOU1dBVkNNQ1NfaW5pdEJpdHN0cmVhbSgmaW5zdGFuY2UtPmVuY2JzKTsKLSAgICAgICAgaW5zdGFuY2UtPmVuY2JzLnN0cmVhbUJ1ZmZlciA9IG91dGJ1ZmYgKyBvdXRidWZmcG9zICsgNTsKLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA4ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkgyNjRNQ1NfUHJvY2Vzc05BTFUoKSBFcnJvcjogUFBTIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gNyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qU1BTIFBhY2tldCAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkgyNjRNQ1NfUHJvY2Vzc05BTFUoKSBFcnJvcjogU1BTIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAobmFsX3VuaXRfdHlwZSA9PSA1KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluc3RhbmNlLT5mcmFtZV9jb3VudCA9IDA7Ci0gICAgICAgICAgICBpbnN0YW5jZS0+UE9DX2xzYiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKG5hbF91bml0X3R5cGUgPT0gMSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaXJzdF9tYl9pbl9zbGljZSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBmaXJzdF9tYl9pbl9zbGljZSk7Ci0KLSAgICAgICAgICAgIHNsaWNlX3R5cGUgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgc2xpY2VfdHlwZSk7Ci0KLSAgICAgICAgICAgIHBpY19wYXJhbWV0ZXJfc2V0X2lkID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHBpY19wYXJhbWV0ZXJfc2V0X2lkKTsKLQotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLAotICAgICAgICAgICAgICAgIGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+ZnJhbWVfY291bnQsCi0gICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKLQotICAgICAgICAgICAgLy8gSW4gQmFzZWxpbmUgUHJvZmlsZTogZnJhbWVfbWJzX29ubHlfZmxhZyBzaG91bGQgYmUgT04KLQotICAgICAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gNSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgdGVtcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+Y2xpcF9zcHMucGljX29yZGVyX2NudF90eXBlID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNAotICAgICAgICAgICAgICAgICAgICArIDQpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIGluc3RhbmNlLT5QT0NfbHNiLAotICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAoIGluc3RhbmNlLT5jbGlwX3Nwcy5waWNfb3JkZXJfY250X3R5cGUgPT0gMSkKLSAgICAgICAgICAgICAgICAmJiAoaW5zdGFuY2UtPmNsaXBfc3BzLmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3NFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgdGVtcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNudCA9IHBfYnMtPmJpdFBvcyAmIDB4NzsKLQotICAgICAgICAgICAgaWYoIGNudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY250ID0gOCAtIGNudDsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIGNudCk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgY250KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY250ID0gcF9icy0+Yml0UG9zID4+IDM7Ci0KLSAgICAgICAgICAgIHdoaWxlKCBjbnQgPCAobmFsX3NpemUgLSAyKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCA4KTsKLSAgICAgICAgICAgICAgICBjbnQgPSBwX2JzLT5iaXRQb3MgPj4gMzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLQotICAgICAgICAgICAgaWYoIHRlbXAgIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY250ID0gMDsKLQotICAgICAgICAgICAgICAgIHdoaWxlKCAoIHRlbXAgJiAweDEpID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY250Kys7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wID4+IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wID4+IDE7Ci0KLSAgICAgICAgICAgICAgICBpZiggOCAtIGNudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCAoOCAtIGNudCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRSYnNwVGJpdHMoJmluc3RhbmNlLT5lbmNicyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNicy5iaXRQb3MgJSA4ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoOCAtIGluc3RhbmNlLT5lbmNicy5iaXRQb3MgJSA4KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPmVuY2JzLmJ5dGVDbnQ7Ci0gICAgICAgICAgICB0ZW1wID0gdGVtcCArIDE7Ci0KLSAgICAgICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvc10gPSAoTTRPU0FfVUludDgpKCggdGVtcCA+PiAyNCkgJiAweEZGKTsKLSAgICAgICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDFdID0gKE00T1NBX1VJbnQ4KSgoIHRlbXAgPj4gMTYpICYgMHhGRik7Ci0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAyXSA9IChNNE9TQV9VSW50OCkoKCB0ZW1wID4+IDgpICYgMHhGRik7Ci0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAzXSA9IChNNE9TQV9VSW50OCkoKHRlbXApICYweEZGKTsKLSAgICAgICAgICAgIG91dGJ1ZmZwb3MgPSBvdXRidWZmcG9zICsgdGVtcCArIDQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwX2JzLT5CdWZmZXIgPSBwX2JzLT5CdWZmZXIgLSA1OwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICZvdXRidWZmW291dGJ1ZmZwb3NdLAotICAgICAgICAgICAgICAgICh2b2lkICopcF9icy0+QnVmZmVyLCBuYWxfc2l6ZSArIDQpOwotCi0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3NdID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gMjQpJiAweEZGKTsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMV0gPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSA+PiAxNikmIDB4RkYpOzsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMl0gPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSA+PiA4KSYgMHhGRik7OwotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAzXSA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplKSYgMHhGRik7OwotCi0gICAgICAgICAgICBvdXRidWZmcG9zID0gb3V0YnVmZnBvcyArIG5hbF9zaXplICsgNDsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpvdXRidWZfc2l6ZSA9IG91dGJ1ZmZwb3M7Ci0KLSAgICBpbnN0YW5jZS0+UE9DX2xzYiA9IGluc3RhbmNlLT5QT0NfbHNiICsgMTsKLQotICAgIGlmKCBpbnN0YW5jZS0+UE9DX2xzYiA9PSBpbnN0YW5jZS0+UE9DX2xzYl9tb2QgKQotICAgIHsKLSAgICAgICAgaW5zdGFuY2UtPlBPQ19sc2IgPSAwOwotICAgIH0KLSAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSBpbnN0YW5jZS0+ZnJhbWVfY291bnQgKyAxOwotCi0gICAgaWYoIGluc3RhbmNlLT5mcmFtZV9jb3VudCA9PSBpbnN0YW5jZS0+ZnJhbWVfbW9kX2NvdW50ICkKLSAgICB7Ci0gICAgICAgIGluc3RhbmNlLT5mcmFtZV9jb3VudCA9IDA7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgICBNNE1DU19jb252ZXRGcm9tQnl0ZVN0cmVhbXRvTkFMU3RyZWFtKCAgTTRPU0FfVUludDggKmluYnVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaW5idWZfc2l6ZSApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lc2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplID0wOwotICAgIE00T1NBX1VJbnQ4ICpidWZmOwotCi0KLSAgICB3aGlsZShmcmFtZXNpemUgPCBpbmJ1Zl9zaXplKQotICAgIHsKLSAgICAgICAgICAgIG5hbF9zaXplID0gaW5idWZfc2l6ZSAtIGZyYW1lc2l6ZSAtIDQ7Ci0gICAgICAgICAgICBidWZmID0gIGluYnVmZiArIGZyYW1lc2l6ZSArIDQ7Ci0KLSAgICAgICAgICAgIHdoaWxlKG5hbF9zaXplID4gNCl7Ci0gICAgICAgICAgICAgICAgaWYoKGJ1ZmZbMF0gPT0gMHgwMCkgJiYKLSAgICAgICAgICAgICAgICAoYnVmZlsxXSA9PSAweDAwKSAmJgotICAgICAgICAgICAgICAgIChidWZmWzJdID09IDB4MDApICYmCi0gICAgICAgICAgICAgICAgKGJ1ZmZbM10gPT0gMHgwMSkpewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVmZiA9IGJ1ZmYgKyAxOwotICAgICAgICAgICAgICAgIG5hbF9zaXplID0gbmFsX3NpemUgLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKG5hbF9zaXplIDw9IDQpewotICAgICAgICAgICAgICAgIG5hbF9zaXplID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbF9zaXplID0gKGluYnVmX3NpemUgLSBmcmFtZXNpemUgLSA0KSAtIG5hbF9zaXplOwotCi0gICAgICAgIGluYnVmZltmcmFtZXNpemUgKyAwXSAgPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSA+PiAyNCkmIDB4RkYpOwotICAgICAgICBpbmJ1ZmZbZnJhbWVzaXplICsgMV0gID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gMTYpJiAweEZGKTsKLSAgICAgICAgaW5idWZmW2ZyYW1lc2l6ZSArIDJdICA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplID4+IDgpJiAweEZGKTsKLSAgICAgICAgaW5idWZmW2ZyYW1lc2l6ZSArIDNdICA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplICkmIDB4RkYpOwotICAgICAgICBmcmFtZXNpemUgKz0gbmFsX3NpemUgKyA0OwotCi0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE1DU19jb252ZXRGcm9tQnl0ZVN0cmVhbXRvTkFMU3RyZWFtIGZyYW1lc2l6ZSA9ICV4IG5hbHNpemUgPSAleCIsCi0gICAgICAgICAgICBmcmFtZXNpemUsIG5hbF9zaXplKQotICAgIH0KLQotICAgIHJldHVybiAgZXJyOwotfQotCi0KLU00T1NBX0VSUiBIMjY0TUNTX0ZyZWVpbnN0YW5jZSggTlNXQVZDX01DU190ICppbnN0YW5jZSApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGluc3RhbmNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiSDI2NE1DU19GcmVlaW5zdGFuY2U6IGluc3RhbmNlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5zbGljZV9ncm91cF9pZCApCi0gICAgewotICAgICAgICBmcmVlKGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5zbGljZV9ncm91cF9pZCk7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gaW5zdGFuY2UtPnBfZW5jb2Rlcl9zcHMgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZS0+cF9lbmNvZGVyX3Nwcyk7Ci0gICAgICAgIGluc3RhbmNlLT5wX2VuY29kZXJfc3BzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBpbnN0YW5jZS0+cF9lbmNvZGVyX3BwcyApCi0gICAgewotICAgICAgICBmcmVlKGluc3RhbmNlLT5wX2VuY29kZXJfcHBzKTsKLSAgICAgICAgaW5zdGFuY2UtPnBfZW5jb2Rlcl9wcHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlLT5tX3BGaW5hbERTSSApCi0gICAgewotICAgICAgICBmcmVlKGluc3RhbmNlLT5tX3BGaW5hbERTSSk7Ci0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gaW5zdGFuY2UgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZSk7Ci0gICAgICAgIGluc3RhbmNlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLSAqIEBicmllZiAgICBHZXQgdGhlIE1DUyB2ZXJzaW9uLgotICogQG5vdGUgQ2FuIGJlIGNhbGxlZCBhbnl0aW1lLiBEbyBub3QgbmVlZCBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwVmVyc2lvbkluZm8gICAgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2ZXJzaW9uIGluZm8gc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19nZXRWZXJzaW9uKCBNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb25JbmZvICkKLXsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRNQ1NfZ2V0VmVyc2lvbiBjYWxsZWQgd2l0aCBwVmVyc2lvbkluZm89MHgleCIsCi0gICAgICAgIHBWZXJzaW9uSW5mbyk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFZlcnNpb25JbmZvKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfZ2V0VmVyc2lvbjogcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciA9IE00TUNTX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yID0gTTRNQ1NfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gPSBNNE1DU19WRVJTSU9OX1JFVklTSU9OOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19nZXRWZXJzaW9uKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBNQ1MgKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgTUNTIGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHJGY3QgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00TUNTX2luaXQoIE00TUNTX0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QsCi0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcEZpbGVXcml0ZVB0ckZjdCApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFM18zKAotICAgICAgICAiTTRNQ1NfaW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwRmlsZVJlYWRQdHJGY3Q9MHgleCwgcEZpbGVXcml0ZVB0ckZjdD0weCV4IiwKLSAgICAgICAgcENvbnRleHQsIHBGaWxlUmVhZFB0ckZjdCwgcEZpbGVXcml0ZVB0ckZjdCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19pbml0OiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlUmVhZFB0ckZjdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2luaXQ6IHBGaWxlUmVhZFB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlV3JpdGVQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19pbml0OiBwRmlsZVdyaXRlUHRyRmN0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgdGhlIE1DUyBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KLSAgICBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00TUNTX0ludGVybmFsQ29udGV4dCksCi0gICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJNNE1DU19JbnRlcm5hbENvbnRleHQiKTsKLSAgICAqcENvbnRleHQgPSBwQzsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2luaXQoKTogdW5hYmxlIHRvIGFsbG9jYXRlIE00TUNTX0ludGVybmFsQ29udGV4dCwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIGNvbnRleHQuIEFsbCBwb2ludGVycyBtdXN0IGJlIGluaXRpYWxpemVkIHRvIE00T1NBX05VTEwKLSAgICAqIGJlY2F1c2UgQ2xlYW5VcCgpIGNhbiBiZSBjYWxsZWQganVzdCBhZnRlciBJbml0KCkuICovCi0gICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0NSRUFURUQ7Ci0gICAgcEMtPnBPc2FGaWxlUmVhZFB0ciA9IHBGaWxlUmVhZFB0ckZjdDsKLSAgICBwQy0+cE9zYUZpbGVXcml0UHRyID0gcEZpbGVXcml0ZVB0ckZjdDsKLSAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+bm9hdWRpbyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5ub3ZpZGVvID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPnVpUHJvZ3Jlc3MgPSAwOwotCi0gICAgLyoqCi0gICAgKiBSZWFkZXIgc3R1ZmYgKi8KLSAgICBwQy0+cElucHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPklucHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQ7Ci0gICAgcEMtPmJGaWxlT3BlbmVkSW5GYXN0TW9kZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5wUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmJVbnN1cHBvcnRlZFZpZGVvRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YlVuc3VwcG9ydGVkQXVkaW9Gb3VuZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5pQXVkaW9DdHNPZmZzZXQgPSAwOwotICAgIC8qIEZpcnN0IHRlbXBvcmFyeSB2aWRlbyBBVSB0byBoYXZlIG1vcmUgcHJlY2lzZSBlbmQgdmlkZW8gY3V0Ki8KLSAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9zdHJ1Y3RTaXplID0gMDsKLSAgICAvKiBTZWNvbmQgdGVtcG9yYXJ5IHZpZGVvIEFVIHRvIGhhdmUgbW9yZSBwcmVjaXNlIGVuZCB2aWRlbyBjdXQqLwotICAgIHBDLT5SZWFkZXJWaWRlb0FVMi5tX3N0cnVjdFNpemUgPSAwOwotICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX3N0cnVjdFNpemUgPSAwOwotICAgIHBDLT5SZWFkZXJBdWRpb0FVMi5tX3N0cnVjdFNpemUgPSAwOwotICAgIHBDLT5tX2F1ZGlvQVVEdXJhdGlvbiA9IDA7Ci0gICAgcEMtPm1fcERhdGFBZGRyZXNzMSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcERhdGFBZGRyZXNzMiA9IE00T1NBX05VTEw7Ci0gICAgLyogRmlyc3QgdGVtcG9yYXJ5IHZpZGVvIEFVIGRhdGEgdG8gaGF2ZSBtb3JlIHByZWNpc2UgZW5kIHZpZGVvIGN1dCovCi0gICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxID0gTTRPU0FfTlVMTDsKLSAgICAvKiBTZWNvbmQgdGVtcG9yYXJ5IHZpZGVvIEFVIGRhdGEgdG8gaGF2ZSBtb3JlIHByZWNpc2UgZW5kIHZpZGVvIGN1dCovCi0gICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogVmlkZW8gZGVjb2RlciBzdHVmZiAqLwotICAgIHBDLT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgPSAwLjA7Ci0gICAgcEMtPmlWaWRlb0JlZ2luRGVjSW5jciA9IDA7Ci0gICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgPSAwLjA7Ci0gICAgcEMtPmRDdHNJbmNyZW1lbnQgPSAwLjA7Ci0gICAgcEMtPmlzUmVuZGVyRHVwID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFZpZGVvIGVuY29kZXIgc3R1ZmYgKi8KLSAgICBwQy0+cFZpRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQcmVSZXNpemVGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnVpRW5jVmlkZW9CaXRyYXRlID0gMDsKLSAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa05vRW5jb2RlcjsKLQotICAgIC8qKgotICAgICogQXVkaW8gZGVjb2RlciBzdHVmZiAqLwotICAgIHBDLT5wQXVkaW9EZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+QXVkaW9EZWNCdWZmZXJJbi5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+QXVkaW9EZWNCdWZmZXJJbi5tX2J1ZmZlclNpemUgPSAwOwotICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gMDsKLSAgICBwQy0+cFBvc0luRGVjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAvKioKLSAgICAqIFNzcmMgc3R1ZmYgKi8KLSAgICBwQy0+cFNzcmNCdWZmZXJJbiA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmlTc3JjTmJTYW1wbEluID0gMDsKLSAgICBwQy0+aVNzcmNOYlNhbXBsT3V0ID0gMDsKLSAgICBwQy0+U3NyY1NjcmF0Y2ggPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IE00T1NBX05VTEw7Ci0gICAgLyoqCi0gICAgKiBBdWRpbyBlbmNvZGVyICovCi0gICAgcEMtPnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNEU0kuaW5mb1NpemUgPSAwOwotICAgIHBDLT5wQXVkaW9FbmNEU0kucEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgPSAwOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZXIgc3R1ZmYgKi8KLSAgICBwQy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+dWlWaWRlb0FVQ291bnQgPSAwOwotICAgIHBDLT51aVZpZGVvTWF4QXVTaXplID0gMDsKLSAgICBwQy0+dWlWaWRlb01heENodW5ja1NpemUgPSAwOwotICAgIHBDLT51aUF1ZGlvQVVDb3VudCA9IDA7Ci0gICAgcEMtPnVpQXVkaW9NYXhBdVNpemUgPSAwOwotCi0gICAgcEMtPnVpQXVkaW9DdHMgPSAwOwotICAgIHBDLT5iX2lzUmF3V3JpdGVyID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPnBPdXRwdXRQQ01maWxlID0gTTRPU0FfTlVMTDsKLQotICAgIC8qIEVuY29kaW5nIGNvbmZpZyAqLwotICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID0gTTRFTkNPREVSX2tOVUxMOyAvKio8IE5vIGZvcm1hdCBzZXQgeWV0ICovCi0gICAgcEMtPkVuY29kaW5nV2lkdGggPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTm8gc2l6ZSBzZXQgeWV0ICovCi0gICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gMDsgICAgICAgICAgICAgICAgICAgIC8qKjwgTm8gc2l6ZSBzZXQgeWV0ICovCi0gICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSAwOyAgICAgICAgICAgIC8qKjwgTm8gZnJhbWVyYXRlIHNldCB5ZXQgKi8KLQotICAgIHBDLT51aUJlZ2luQ3V0VGltZSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKio8IE5vIGJlZ2luIGN1dCAqLwotICAgIHBDLT51aUVuZEN1dFRpbWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE5vIGVuZCBjdXQgKi8KLSAgICBwQy0+dWlNYXhGaWxlU2l6ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBObyBsaW1pdCAqLwotICAgIHBDLT51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlOyAvKio8IE5vIGJpdHJhdGUgc2V0IHlldCAqLwotICAgIHBDLT51aVZpZGVvQml0cmF0ZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlOyAvKio8IE5vIGJpdHJhdGUgc2V0IHlldCAqLwotCi0gICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLQotICAgIHBDLT5vdXRwdXRWaWRlb1RpbWVzY2FsZSA9IDA7Ci0KLSAgICAvKkZCIDIwMDgvMTAvMjA6IGFkZCBtZWRpYSByZW5kZXJpbmcgcGFyYW1ldGVyIGFuZCBBSVIgY29udGV4dCB0byBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0gICAgcEMtPk1lZGlhUmVuZGVyaW5nID0gTTRNQ1Nfa1Jlc2l6aW5nOwotICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAvKiovCi0KLSAgICAvKioKLSAgICAqIEZsQiAyMDA5LjAzLjA0OiBhZGQgYXVkaW8gRWZmZWN0cyovCi0gICAgcEMtPnBFZmZlY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bmJFZmZlY3RzID0gMDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdE51bWJlciA9IC0xOwotICAgIC8qKi8KLQotICAgIC8qCi0gICAgKiBSZXNldCBwb2ludGVycyBmb3IgbWVkaWEgYW5kIGNvZGVjcyBpbnRlcmZhY2VzICovCi0gICAgZXJyID0gTTRNQ1NfY2xlYXJJbnRlcmZhY2VUYWJsZXMocEMpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoKLSAgICAqICBDYWxsIHRoZSBtZWRpYSBhbmQgY29kZWNzIHN1YnNjcmlwdGlvbiBtb2R1bGUgKi8KLSAgICBlcnIgPSBNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjKHBDKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotICAgIC8qKgotICAgICogSW5pdGlhbGl6ZSB0aGUgU3RpbGwgcGljdHVyZSBwYXJ0IG9mIE1DUyovCi0KLSAgICBlcnIgPSBNNE1DU19zdGlsbFBpY0luaXQocEMsIHBGaWxlUmVhZFB0ckZjdCwgcEZpbGVXcml0ZVB0ckZjdCk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgPSBNNE9TQV9GQUxTRTsKLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIHBDLT5tX3BJbnN0YW5jZSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJTaXplID0gMDsKLSAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZSA9IDA7Ci0gICAgcEMtPmJIMjY0VHJpbSA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyogRmxhZyB0byBnZXQgdGhlIGxhc3QgZGVjb2RlZCBmcmFtZSBjdHMgKi8KLSAgICBwQy0+Ykxhc3REZWNvZGVkRnJhbWVDVFMgPSBNNE9TQV9GQUxTRTsKLQotICAgIGlmKCBwQy0+bV9wSW5zdGFuY2UgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBlcnIgPSBIMjY0TUNTX0dldGluc3RhbmNlKCZwQy0+bV9wSW5zdGFuY2UpOwotICAgIH0KLSAgICBwQy0+YkV4dE9NWEF1ZERlY29kZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW5pdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19vcGVuKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZU91dCwgTTRPU0FfVm9pZCogcFRlbXBGaWxlKTsKLSAqIEBicmllZiAgIFNldCB0aGUgTUNTIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBpcyBub3QgY3JlYXRlZCB5ZXQuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBGaWxlSW4gICAgICAgICAgICAgKElOKSBJbnB1dCBmaWxlIHRvIHRyYW5zY29kZSAoVGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCwgcGlwZS4uLikgZGVwZW5kcyBvbiB0aGUgT1NBTCBpbXBsZW1lbnRhdGlvbikuCi0gKiBAcGFyYW0gICBtZWRpYVR5cGUgICAgICAgICAgIChJTikgQ29udGFpbmVyIHR5cGUgKC4zZ3AsLmFtcixtcDMgLi4uKSBvZiBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgcEZpbGVPdXQgICAgICAgICAgICAoSU4pIE91dHB1dCBmaWxlIHRvIGNyZWF0ZSAgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgcFRlbXBGaWxlICAgICAgICAgICAoSU4pIFRlbXBvcmFyeSBmaWxlIGZvciB0aGUgY29uc3RhbnQgbWVtb3J5IHdyaXRlciB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUgbWV0YWRhdGEgKCJtb292LmJpbiIpLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6ICAgVGhlIGlucHV0IGZpbGUgaGFzIG5vdCBiZWVuIGZvdW5kCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOiAgIFRoZSBpbnB1dCBmaWxlIGlzIG5vdCBhIHZhbGlkIGZpbGUsIG9yIGlzIGNvcnJ1cHRlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTTogIFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIG5vCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGF1ZGlvIG9yIHZpZGVvIHN0cmVhbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfb3BlbiggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCAqcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsIE00T1NBX1ZvaWQgKnBGaWxlT3V0LAotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcFRlbXBGaWxlICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00UkVBREVSX01lZGlhRmFtaWx5IG1lZGlhRmFtaWx5OwotICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoCi0gICAgICAgICJNNE1DU19vcGVuIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBGaWxlSW49MHgleCwgcEZpbGVPdXQ9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwRmlsZUluLCBwRmlsZU91dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19vcGVuOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlSW4pLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19vcGVuOiBwRmlsZUluIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKCAoIElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRykKLSAgICAgICAgfHwgKElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1BORykKLSAgICAgICAgfHwgKElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0dJRikKLSAgICAgICAgfHwgKElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0JNUCkgKQotICAgIHsKLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLSAgICAgICAgLyoqCi0gICAgICAgICogSW5kaWNhdGUgdGhhdCB3ZSBtdXN0IHVzZSB0aGUgc3RpbGwgcGljdHVyZSBmdW5jdGlvbnMqLwotCi0gICAgICAgIHBDLT5tX2JJc1N0aWxsUGljdHVyZSA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb25zKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljT3BlbihwQywgcEZpbGVJbiwgSW5wdXRGaWxlVHlwZSwgcEZpbGVPdXQpOwotCi0jZWxzZQotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX29wZW46IFN0aWxsIHBpY3R1cmUgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgdmVyc2lvbiBvZiBNQ1MiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU07Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCBNNE1DU19rU3RhdGVfQ1JFQVRFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IGZ1bmN0aW9uIGlucHV0IHBhcmFtZXRlcnMgaW50byBvdXIgY29udGV4dCAqLwotICAgIHBDLT5wSW5wdXRGaWxlID0gcEZpbGVJbjsKLSAgICBwQy0+SW5wdXRGaWxlVHlwZSA9IElucHV0RmlsZVR5cGU7Ci0gICAgcEMtPnBPdXRwdXRGaWxlID0gcEZpbGVPdXQ7Ci0gICAgcEMtPnBUZW1wb3JhcnlGaWxlID0gcFRlbXBGaWxlOwotICAgIHBDLT51aVByb2dyZXNzID0gMDsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBPcGVuIGlucHV0IGZpbGUgd2l0aCB0aGUgcmVhZGVyICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFJlYWRlcihwQ29udGV4dCwgcEMtPklucHV0RmlsZVR5cGUpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCByZWFkZXIgcmVsYXRlZCB2YXJpYWJsZXMgKi8KLSAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIEluaXRpYWxpemVzIHRoZSByZWFkZXIgc2hlbGwgYW5kIG9wZW4gdGhlIGRhdGEgZmlsZSAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdENyZWF0ZSgmcEMtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIExpbmsgdGhlIHJlYWRlciBpbnRlcmZhY2UgdG8gdGhlIHJlYWRlciBjb250ZXh0ICovCi0gICAgcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9yZWFkZXJDb250ZXh0ID0gcEMtPnBSZWFkZXJDb250ZXh0OwotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIHJlYWRlciBzaGVsbCBmaWxlIGFjY2VzcyBmdW5jdGlvbnMgKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00TUNTX1dJVEhfRkFTVF9PUEVOCi0KLSAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmJGaWxlT3BlbmVkSW5GYXN0TW9kZSApCi0gICAgewotICAgICAgICBNNE9TQV9Cb29sIHRydWVWYWx1ZSA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgLyogRm9yIGZpcnN0IGNhbGwgdXNlIGZhc3Qgb3BlbiBtb2RlICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbihwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0Zhc3RPcGVuTW9kZSwgJnRydWVWYWx1ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmJGaWxlT3BlbmVkSW5GYXN0TW9kZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0Zhc3RPcGVuTW9kZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgICAgIGlmKCAoICggKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgfHwgKCggKE00T1NBX1VJbnQzMilNNEVSUl9QQVJBTUVURVIpID09IGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE5vdCBmYXRhbCwgc29tZSByZWFkZXJzIG1heSBub3Qgc3VwcG9ydCBmYXN0IG9wZW4gbW9kZSAqLwotICAgICAgICAgICAgICAgIHBDLT5iRmlsZU9wZW5lZEluRmFzdE1vZGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX0Jvb2wgZmFsc2VWYWx1ZSA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgIC8qIEZvciBzZWNvbmQgY2FsbCB1c2Ugbm9ybWFsIG9wZW4gbW9kZSAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9GYXN0T3Blbk1vZGUsICZmYWxzZVZhbHVlKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBNNE1DU19XSVRIX0ZBU1RfT1BFTiAqLwotCi0gICAgLyoqCi0gICAgKiBPcGVuIHRoZSBpbnB1dCBmaWxlICovCi0KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RPcGVuKHBDLT5wUmVhZGVyQ29udGV4dCwgcEMtPnBJbnB1dEZpbGUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1aUR1bW15LCB1aUNvcmVJZDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RPcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlIGVycm9yIGlzIGZyb20gdGhlIGNvcmUgcmVhZGVyLCB3ZSBjaGFuZ2UgaXQgdG8gYSBwdWJsaWMgVlhTIGVycm9yICovCi0gICAgICAgIE00T1NBX0VSUl9TUExJVChlcnIsIHVpRHVtbXksIHVpQ29yZUlkLCB1aUR1bW15KTsKLQotICAgICAgICBpZiggTTRNUDRfUkVBREVSID09IHVpQ29yZUlkICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogcmV0dXJuaW5nIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZSAqLwotICAgIHdoaWxlKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgewotICAgICAgICBlcnIgPQotICAgICAgICAgICAgcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dFN0cmVhbSggcEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTdHJlYW1IYW5kbGVyKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBJbiBjYXNlIHdlIGZvdW5kIGEgQklGUyBzdHJlYW0gb3Igc29tZXRoaW5nIGVsc2UuLi4qLwotICAgICAgICBpZiggKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUpKQotICAgICAgICAgICAgfHwgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIHRoZSBmaXJzdCB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgIGlmKCAoIE00UkVBREVSX2tNZWRpYUZhbWlseVZpZGVvID09IG1lZGlhRmFtaWx5KQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjMgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBGb3VuZCBhIEgyNjMgb3IgTVBFRy00IHZpZGVvIHN0cmVhbSBpbiBpbnB1dCAzZ3BwIGNsaXAiKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBLZWVwIHBvaW50ZXIgdG8gdGhlIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9WaWRlb1N0cmVhbUhhbmRsZXIgKilwU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZFZpZGVvRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXQgb3VyIHZpZGVvIHN0cmVhbSBzdGF0ZSB2YXJpYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0gcmVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RSZXNldCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlciwgJnBDLT5SZWFkZXJWaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8qKjwgTm90IEgyNjMgb3IgTVBFRy00IChIMjY0LCBldGMuKSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogRm91bmQgYW4gdW5zdXBwb3J0ZWQgdmlkZW8gc3RyZWFtICgweCV4KSBpblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgM2dwcCBjbGlwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZFZpZGVvRm91bmQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiArQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0gICAgICAgICAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNQUyBhbmQgUFBTIGFyZSBzdG9yZWFkIGFzIHBlciB0aGUgM2dwIGZpbGUgZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIC1DUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGb3VuZCB0aGUgZmlyc3QgYXVkaW8gc3RyZWFtICovCi0gICAgICAgICAgICBlbHNlIGlmKCAoIE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvID09IG1lZGlhRmFtaWx5KQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb01wMwotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogRm91bmQgYW4gQU1SLU5CLCBBQUMgb3IgTVAzIGF1ZGlvIHN0cmVhbSBpbiBpbnB1dCBjbGlwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyICopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZEF1ZGlvRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0IG91ciBhdWRpbyBzdHJlYW0gc3RhdGUgdmFyaWFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc3RyZWFtIHJlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0UmVzZXQoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXIsICZwQy0+UmVhZGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBPdXRwdXQgbWF4IEFVIHNpemUgaXMgZXF1YWwgdG8gaW5wdXQgbWF4IEFVIHNpemUgKHRoaXMgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgKiB3aWxsIGJlIGNoYW5nZWQgaWYgdGhlcmUgaXMgYXVkaW8gdHJhbnNjb2RpbmcpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKio8IE5vdCBBTVItTkIsIEFBQywgTVAzIG5vciBFVlJDIChBTVItV0IsIFdBVi4uLikgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogRm91bmQgYW4gdW5zdXBwb3J0ZWQgYXVkaW8gc3RyZWFtICgweCV4KSBpbiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IDNncHAgY2xpcCIsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8qKjwgZW5kIG9mIHdoaWxlIChNNE5PX0VSUk9SID09IGVycikgKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgd2UgZm91bmQgYXQgbGVhc3Qgb25lIHN1cHBvcnRlZCBzdHJlYW0gKi8KLSAgICBpZiggKCBNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pCi0gICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX29wZW4oKTogcmV0dXJuaW5nIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU0iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU07Ci0gICAgfQotCi0gICAgaWYoIHBDLT5WaWRlb1N0YXRlID09IE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRWaWRlb0RlY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotICAgICAgICAvKkZCIDIwMDktMDItMDk6IHRoZSBlcnJvciBpcyBjaGVjayBhbmQgcmV0dXJuZWQgb25seSBpZiB2aWRlbyBjb2RlY3MgYXJlIGNvbXBpbGVkLAotICAgICAgICBlbHNlIG9ubHkgYXVkaW8gaXMgdXNlZCwgdGhhdCBpcyB3aHkgdGhlIGVkaXRpbmcgcHJvY2VzcyBjYW4gY29udGludWUqLwotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLQotICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotI2Vsc2UKLQotICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCAhPSBlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLQotICAgIH0KLQotICAgIGlmKCBwQy0+QXVkaW9TdGF0ZSA9PSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRCApCi0gICAgewotICAgICAgICAvL0VWUkMKLSAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYwotICAgICAgICAgICAgIT0gcFN0cmVhbUhhbmRsZXItPgotICAgICAgICAgICAgbV9zdHJlYW1UeXBlICkgLyogZGVjb2RlciBub3Qgc3VwcG9ydGVkIHlldCwgYnV0IGFsbG93IHRvIGRvIG51bGwgZW5jb2RpbmcgKi8KLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgZXJyID0gTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyhwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGJlZ2luIGN1dCBkZWNvZGluZyBpbmNyZW1lbnQgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBmcmFtZSByYXRlICovCi0gICAgaWYoIDAuICE9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZBdmVyYWdlRnJhbWVSYXRlICkgLyoqPCBzYW5pdHkgY2hlY2sgKi8KLSAgICB7Ci0gICAgICAgIHBDLT5pVmlkZW9CZWdpbkRlY0luY3IgPSAoTTRPU0FfSW50MzIpKDMwMDAuCi0gICAgICAgICAgICAvIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLgotICAgICAgICAgICAgZkF2ZXJhZ2VGcmFtZVJhdGUpOyAvKio8IGFib3V0IDMgZnJhbWVzICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5pVmlkZW9CZWdpbkRlY0luY3IgPQotICAgICAgICAgICAgMjAwOyAvKio8IGRlZmF1bHQgdmFsdWU6IDIwMCBtaWxsaXNlY29uZHMgKDMgZnJhbWVzIEAgMTVmcHMpKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfT1BFTkVEOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19vcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3N0ZXAoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0gKiBAYnJpZWYgICBQZXJmb3JtIG9uZSBzdGVwIG9mIHRyYW5jb2RpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKSBvZiB0aGUgdHJhbnNjb2RpbmcKLSAqIEBub3RlICAgIHBQcm9ncmVzcyBtdXN0IGJlIGEgdmFsaWQgYWRkcmVzcy4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgT25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORTogVHJhbnNjb2RpbmcgaXMgb3ZlciwgdXNlciBzaG91bGQgbm93IGNhbGwgTTRNQ1NfY2xvc2UoKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEOiBUaGUgYXVkaW8gY29udmVyc2lvbiAoQUFDIHRvIEFNUi1OQiBvciBNUDMpIGZhaWxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfQUFDX1NBTVBMSU5HX0ZSRVFVRU5DWTogVGhlIGlucHV0IGZpbGUgY29udGFpbnMgYW4gQUFDIGF1ZGlvIHRyYWNrCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gaW52YWxpZCBzYW1wbGluZyBmcmVxdWVuY3kgKHNob3VsZCBuZXZlciBoYXBwZW4pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zdGVwKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRNQ1Nfc3RlcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc3RlcDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUHJvZ3Jlc3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zdGVwOiBwUHJvZ3Jlc3MgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9ucyovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1N0ZXAocEMsIHBQcm9ncmVzcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX1JFQURZOgotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfaW50U3RlcFNldChwQyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPSlVNUDoKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSBwQy0+dWlQcm9ncmVzczsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXAocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0RFQ09ERToKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSBwQy0+dWlQcm9ncmVzczsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0RlY29kZShwQyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX2ludFN0ZXBFbmNvZGluZyhwQywgcFByb2dyZXNzKTsKLSAgICAgICAgICAgICAgICAvKiBTYXZlIHByb2dyZXNzIGluZm8gaW4gY2FzZSBvZiBwYXVzZSAqLwotICAgICAgICAgICAgICAgIHBDLT51aVByb2dyZXNzID0gKnBQcm9ncmVzczsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyoqPCBTdGF0ZSBlcnJvciAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX3N0ZXAoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfcGF1c2UoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBQYXVzZSB0aGUgdHJhbnNjb2RpbmcgaS5lLiByZWxlYXNlIHRoZSAoZXh0ZXJuYWwgaGFyZHdhcmUpIHZpZGVvIGRlY29kZXIuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBuZWVkZWQgaWYgbm8gaGFyZHdhcmUgYWNjZWxlcmF0b3JzIGFyZSB1c2VkLgotICogICAgICAgICAgSW4gdGhhdCBjYXNlLCBwYXVzaW5nIHRoZSBNQ1MgaXMgc2ltcGx5IGFjaGlldmVkIGJ5IHRlbXBvcmFyaWx5IHN1c3BlbmRpbmcKLSAqICAgICAgICAgIHRoZSBNNE1DU19zdGVwIGZ1bmN0aW9uIGNhbGxzLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19wYXVzZSggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRNQ1NfcGF1c2UgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX3BhdXNlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1BhdXNlKHBDKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgc3dpdGNoKCBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVA6IC8qKjwgdGhlIHZpZGVvIGRlY29kZXIgaGFzIGJlZW4gY3JlYXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UgbXVzdCBkZXN0cm95IGl0ICovCi0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9ERUNPREU6IC8qKjwgdGhlIHZpZGVvIGlzIGJlaW5nIHVzZWQsIHdlIG11c3QgZGVzdHJveSBpdCAqLwotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOiAvKio8IHRoZSB2aWRlbyBpcyBiZWluZyB1c2VkLCB3ZSBtdXN0IGRlc3Ryb3kgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgLyoqPCBPSywgbm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKio8IFN0YXRlIGVycm9yICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfcGF1c2UoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBDVFMgYXQgd2hpY2ggd2Ugd2lsbCByZXN1bWUgdGhlIGRlY29kaW5nICovCi0gICAgaWYoIHBDLT5kVmlEZWNDdXJyZW50Q3RzID4gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIHBhc3NlZCB0aGUgc3RhcnRpbmcgQ1RTLCBzbyB0aGUgcmVzdW1lIHRhcmdldCBpcyB0aGUgY3VycmVudCBDVFMgKi8KLSAgICAgICAgcEMtPmRWaURlY1N0YXJ0aW5nQ3RzID0gcEMtPmRWaURlY0N1cnJlbnRDdHM7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBoYXZlbid0IHBhc3NlZCB0aGUgc3RhcnRpbmcgQ1RTIHlldCwgc28gdGhlIHJlc3VtZSB0YXJnZXQgaXMgc3RpbGwgdGhlIHN0YXJ0aW5nIENUUwotICAgICAgICAqIC0tPiBub3RoaW5nIHRvIGRvIGluIHRoZSBlbHNlIGJsb2NrICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHZpZGVvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFZpRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZXN0cm95KHBDLT5wVmlEZWNDdHh0KTsKLSAgICAgICAgcEMtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19wYXVzZTogbV9wVmlkZW9EZWNvZGVyLT5wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogU3RhdGUgdHJhbnNpdGlvbiAqLwotICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9QQVVTRUQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfcGF1c2UoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfcmVzdW1lKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgUmVzdW1lIHRoZSB0cmFuc2NvZGluZyBhZnRlciBhIHBhdXNlIChzZWUgTTRNQ1NfcGF1c2UpLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgbmVlZGVkIGlmIG5vIGhhcmR3YXJlIGFjY2VsZXJhdG9ycyBhcmUgdXNlZC4KLSAqICAgICAgICAgIEluIHRoYXQgY2FzZSwgcmVzdW1pbmcgdGhlIE1DUyBpcyBzaW1wbHkgYWNoaWV2ZWQgYnkgY2FsbGluZwotICogICAgICAgICAgdGhlIE00TUNTX3N0ZXAgZnVuY3Rpb24uCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3Jlc3VtZSggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRNQ1NfcmVzdW1lIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19yZXN1bWU6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljUmVzdW1lKHBDKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgc3dpdGNoKCBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfUEFVU0VEOiAvKio8IE9LLCBub3RoaW5nIHRvIGRvIGhlcmUgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgLyoqPCBTdGF0ZSBlcnJvciAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX3Jlc3VtZSgpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHZpZGVvIGRlY29kZXIgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19yZXN1bWUoKTogTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcigpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTdGF0ZSB0cmFuc2l0aW9uICovCi0gICAgaWYoIDAuMCA9PSBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgYXJlIHN0aWxsIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlY29kZWQgc3RyZWFtLCBubyBuZWVkIHRvIGp1bXAsIHdlIGNhbiBwcm9jZWVkICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBKdW1waW5nICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPSlVNUDsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfcmVzdW1lKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2Nsb3NlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZpbmlzaCB0aGUgTUNTIHRyYW5zY29kaW5nLgotICogQG5vdGUgVGhlIG91dHB1dCAzR1BQIGZpbGUgaXMgcmVhZHkgdG8gYmUgcGxheWVkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfY2xvc2UoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNEVOQ09ERVJfSGVhZGVyICplbmNIZWFkZXI7Ci0gICAgTTRTWVNfU3RyZWFtSURtZW1BZGRyIHN0cmVhbUhlYWRlcjsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SLCBlcnIyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00TUNTX2Nsb3NlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19jbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluZGljYXRlIHRoYXQgY3VycmVudCBmaWxlIGlzIG5vIGxvbmdlciBhIHN0aWxsIHBpY3R1cmUqLwotICAgICAgICBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljQ2xvc2UocEMpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX0ZJTklTSEVEICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfY2xvc2UoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDbG9zZSB0aGUgZW5jb2RlciBiZWZvcmUgdGhlIHdyaXRlciB0byBiZSBjZXJ0YWluIGFsbCB0aGUgQVVzIGhhdmUgYmVlbiB3cml0dGVuIGFuZCB3ZSBjYW4KLSAgICBnZXQgdGhlIERTSS4gKi8KLQotICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIHN0YXJ0ZWQ/IERvbid0IHN0b3AgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICBpZiggTTRNQ1Nfa0VuY29kZXJSdW5uaW5nID09IHBDLT5lbmNvZGVyU3RhdGUgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AocEMtPnBWaUVuY0N0eHQpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfY2xvc2U6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIC8qIFdlbGwuLi4gaG93IHRoZSBoZWNrIGRvIHlvdSBoYW5kbGUgYSBmYWlsZWQgY2xlYW51cD8gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlclN0b3BwZWQ7Ci0gICAgfQotCi0gICAgLyogSGFzIHRoZSBlbmNvZGVyIGFjdHVhbGx5IGJlZW4gb3BlbmVkPyBEb24ndCBjbG9zZSBpdCBpZiB0aGF0J3Mgbm90IHRoZSBjYXNlLiAqLwotICAgIGlmKCBNNE1DU19rRW5jb2RlclN0b3BwZWQgPT0gcEMtPmVuY29kZXJTdGF0ZSApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZShwQy0+cFZpRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qIFdlbGwuLi4gaG93IHRoZSBoZWNrIGRvIHlvdSBoYW5kbGUgYSBmYWlsZWQgY2xlYW51cD8gKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlckNsb3NlZDsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogQ2xvc2UgdGhlIHdyaXRlciAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFdyaXRlckNvbnRleHQgKSAvKiBoYXBwZW5zIGluIHN0YXRlIF9TRVQgKi8KLSAgICB7Ci0gICAgICAgIC8qIEhXIGVuY29kZXI6IGZldGNoIHRoZSBEU0kgZnJvbSB0aGUgc2hlbGwgdmlkZW8gZW5jb2RlciwgYW5kIGZlZWQgaXQgdG8gdGhlIHdyaXRlciBiZWZvcmUKLSAgICAgICAgY2xvc2luZyBpdC4gKi8KLQotICAgICAgICBpZiggcEMtPm5vdmlkZW8gIT0gTTRPU0FfVFJVRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoIE00RU5DT0RFUl9rTVBFRzQgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpCi0gICAgICAgICAgICAgICAgfHwgKE00RU5DT0RFUl9rSDI2NCA9PSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEdldE9wdGlvbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tPcHRpb25JRF9FbmNvZGVySGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgfHwgKE00T1NBX05VTEwgPT0gZW5jSGVhZGVyLT5wQnVmKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogZmFpbGVkIHRvIGdldCB0aGUgZW5jb2RlciBoZWFkZXIgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKio8IG5vIHJldHVybiBoZXJlLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGRlYWxsb2NhdGUgYWZ0ZXIgY2xvc2UsIGV2ZW4KLSAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGZhaWxzLiAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdGhpcyBoZWFkZXIgaW4gdGhlIHdyaXRlciAqLwotICAgICAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuc3RyZWFtSUQgPSBNNE1DU19XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuc2l6ZSA9IGVuY0hlYWRlci0+U2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLmFkZHIgPSAoTTRPU0FfTWVtQWRkcjMyKWVuY0hlYWRlci0+cEJ1ZjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiY2FsbGluZyBzZXQgb3B0aW9uIik7Ci0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa0RTSSwgJnN0cmVhbUhlYWRlcik7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoInNldCBvcHRpb24gZG9uZSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBmYWlsZWQgdG8gc2V0IHRoZSBEU0kgaW4gdGhlIHdyaXRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0pCi0gICAgICAgICAgICAgICAgJiYgKE00RU5DT0RFUl9rTlVMTCA9PSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHBDLT51aUJlZ2luQ3V0VGltZSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkRlY29kZXIgc3BlY2lmaWMgaW5mbyBzaXplID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRGVjb2RlciBzcGVjaWZpYyBpbmZvIHBvaW50ZXIgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPm1fcEluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fcEZpbmFsRFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bV9wSW5zdGFuY2UtPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLCBNNE1DUywKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopImluc3RhbmNlLT5tX3BGaW5hbERTSSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+bV9wSW5zdGFuY2UtPm1fcEZpbmFsRFNJID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiaW5zdGFuY2UtPm1fcEZpbmFsRFNJOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BJbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnNpemUgPSBwQy0+bV9wSW5zdGFuY2UtPm1fcEZpbmFsRFNJU2l6ZTsKLSAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuYWRkciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiY2FsbGluZyBzZXQgb3B0aW9uIik7Ci0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa0RTSSwgJnN0cmVhbUhlYWRlcik7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoInNldCBvcHRpb24gZG9uZSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBmYWlsZWQgdG8gc2V0IHRoZSBEU0kgaW4gdGhlIHdyaXRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIFdyaXRlIGFuZCBjbG9zZSB0aGUgM0dQIG91dHB1dCBmaWxlICovCi0gICAgICAgIGVycjIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlKHBDLT5wV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIHBDLT5wV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyMik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgICAgICAgICAgICAgZXJyID0gZXJyMjsKLSAgICAgICAgICAgIC8qKjwgbm8gcmV0dXJuIGhlcmUsIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZGVhbGxvY2F0ZSBhZnRlciBjbG9zZSwgZXZlbiBpZiBpdCBmYWlscy4qLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2xvc2Ugb3V0cHV0IFBDTSBmaWxlIGlmIG5lZWRlZCAqLwotICAgIGlmKCBwQy0+cE91dHB1dFBDTWZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLT5jbG9zZVdyaXRlKHBDLT5wT3V0cHV0UENNZmlsZSk7Ci0gICAgICAgIHBDLT5wT3V0cHV0UENNZmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLypGbEIgMjAwOS4wMy4wNDogYWRkIGF1ZGlvIGVmZmVjdHMsCi0gICAgZnJlZSBlZmZlY3RzIGxpc3QqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wRWZmZWN0cyApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wRWZmZWN0cyk7Ci0gICAgICAgIHBDLT5wRWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIHBDLT5uYkVmZmVjdHMgPSAwOwotICAgIHBDLT5wQWN0aXZlRWZmZWN0TnVtYmVyID0gLTE7Ci0KLSAgICAvKioKLSAgICAqIFN0YXRlIHRyYW5zaXRpb24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQ0xPU0VEOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPkgyNjRNQ1NUZW1wQnVmZmVyICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPkgyNjRNQ1NUZW1wQnVmZmVyKTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfY2xvc2UoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19jbGVhblVwKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBNQ1MuCi0gKiBAbm90ZSBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfY2xlYW5VcCggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX2NsZWFuVXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotI2lmZGVmIE1DU19EVU1QX1BDTV9UT19GSUxFCi0KLSAgICBpZiggZmlsZV9hdV9yZWFkZXIgKQotICAgIHsKLSAgICAgICAgZmNsb3NlKGZpbGVfYXVfcmVhZGVyKTsKLSAgICAgICAgZmlsZV9hdV9yZWFkZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKCBmaWxlX3BjbV9kZWNvZGVyICkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShmaWxlX3BjbV9kZWNvZGVyKTsKLSAgICAgICAgZmlsZV9wY21fZGVjb2RlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYoIGZpbGVfcGNtX2VuY29kZXIgKQotICAgIHsKLSAgICAgICAgZmNsb3NlKGZpbGVfcGNtX2VuY29kZXIpOwotICAgICAgICBmaWxlX3BjbV9lbmNvZGVyID0gTlVMTDsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2NsZWFuVXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwsIHJldHVybmluZyBNNEVSUl9QQVJBTUVURVIiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCBNNE1DU19rU3RhdGVfQ0xPU0VEICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19jbGVhblVwKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPm1fcEluc3RhbmNlICkKLSAgICB7Ci0gICAgICAgIGVyciA9IEgyNjRNQ1NfRnJlZWluc3RhbmNlKHBDLT5tX3BJbnN0YW5jZSk7Ci0gICAgICAgIHBDLT5tX3BJbnN0YW5jZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSB2aWRlbyBlbmNvZGVyIHN0dWZmLCBpZiBuZWVkZWQgLS0tLS0gKi8KLQotICAgIGlmKCAoIE00T1NBX05VTEwgIT0gcEMtPnBWaUVuY0N0eHQpCi0gICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cykgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cChwQy0+cFZpRW5jQ3R4dCk7Ci0gICAgICAgIHBDLT5wVmlFbmNDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcDogcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhbnVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rTm9FbmNvZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW4gdGhlIEgyNjMgY2FzZSwgd2UgYWxsb2NhdGVkIG91ciBvd24gRFNJIGJ1ZmZlciAqLwotICAgIGlmKCAoIE00RU5DT0RFUl9rSDI2MyA9PSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCkKLSAgICAgICAgJiYgKE00T1NBX05VTEwgIT0gcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZikgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmKTsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQcmVSZXNpemVGcmFtZSApCi0gICAgewotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShwQy0+cFByZVJlc2l6ZUZyYW1lKTsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSB0aGUgc3NyYyBzdHVmZiAtLS0tLSAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPlNzcmNTY3JhdGNoICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPlNzcmNTY3JhdGNoKTsKLSAgICAgICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJJbiApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlckluKTsKLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wU3NyY0J1ZmZlck91dCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlck91dCk7Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYgKHBDLT5wTFZBdWRpb1Jlc2FtcGxlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTFZEZXN0cm95KHBDLT5wTFZBdWRpb1Jlc2FtcGxlcik7Ci0gICAgICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSB0aGUgYXVkaW8gZW5jb2RlciBzdHVmZiAtLS0tLSAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBBdWRpb0VuY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UocEMtPnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAocEMtPnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJCdWZmZXIpOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSBhbGwgb3RoZXIgc3R1ZmYgLS0tLS0gKi8KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgcmVhZGVycyBhbmQgdGhlIGRlY29kZXJzICovCi0gICAgTTRNQ1NfaW50Q2xlYW5VcF9SZWFkZXJzRGVjb2RlcnMocEMpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzdGlsbCBwaWN0dXJlIHJlc291cmNlcyAqLwotCi0gICAgTTRNQ1Nfc3RpbGxQaWNDbGVhblVwKHBDKTsKLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2hlbGxzIGludGVyZmFjZXMgKi8KLQotICAgIE00TUNTX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKHBDb250ZXh0KTsKLSAgICBNNE1DU191blJlZ2lzdGVyQWxsRW5jb2RlcnMocENvbnRleHQpOwotICAgIE00TUNTX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKHBDb250ZXh0KTsKLSAgICBNNE1DU191blJlZ2lzdGVyQWxsRGVjb2RlcnMocENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBjb250ZXh0IGl0c2VsZiAqLwotICAgIGZyZWUocEMpOwotICAgIHBDID0gTTRPU0FfTlVMTDsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19jbGVhblVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2Fib3J0KE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZpbmlzaCB0aGUgTUNTIHRyYW5zY29kaW5nIGFuZCBmcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTUNTCi0gKiAgICAgICAgICB3aGF0ZXZlciB0aGUgc3RhdGUgaXMuCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2Fib3J0KCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9FUlIgZXJyMSA9IE00Tk9fRVJST1I7Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENvbnRleHQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgaWYoICggcEMtPlN0YXRlID09IE00TUNTX2tTdGF0ZV9DUkVBVEVEKQotICAgICAgICB8fCAocEMtPlN0YXRlID09IE00TUNTX2tTdGF0ZV9DTE9TRUQpICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9DTE9TRUQ7Ci0KLSAgICAgICAgZXJyID0gTTRNQ1NfY2xlYW5VcChwQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2Fib3J0IDogTTRNQ1NfY2xlYW5VcCBmYWlscyBlcnIgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2FuY2VsIHRoZSBvbmdvaW5nIHByb2Nlc3NlcyBpZiBhbnkqLwotICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc3RpbGxQaWNDYW5jZWwocEMpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfYWJvcnQgOiBNNE1DU19zdGlsbFBpY0NhbmNlbCBmYWlscyBlcnIgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qU3RpbGwgcGljdHVyZSBwcm9jZXNzIGlzIG5vdyBzdG9wcGVkOyBDYXJyeSBvbiB3aXRoIGNsb3NlIGFuZCBjbGVhbnVwKi8KLSAgICAgICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICBlcnIgPSBNNE1DU19jbG9zZShwQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2Fib3J0IDogTTRNQ1NfY2xvc2UgZmFpbHMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICBlcnIxID0gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRNQ1NfY2xlYW5VcChwQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2Fib3J0IDogTTRNQ1NfY2xlYW5VcCBmYWlscyBlcnIgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlcnIgPSAoZXJyMSA9PSBNNE5PX0VSUk9SKSA/IGVyciA6IGVycjE7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzKiBwRmlsZVByb3BlcnRpZXMpOwotICogQGJyaWVmICAgUmV0cmlldmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcyBmcm9tIHRoZSBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUHJvcGVydGllcyAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gYW4gYWxsb2NhdGVkIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzCi1zdHJ1Y3R1cmUgd2hpY2ggaXMgZmlsbGVkIHdpdGggdGhlIGlucHV0IHN0cmVhbSBwcm9wZXJ0aWVzLgotICogQG5vdGUgICAgVGhlIHN0cnVjdHVyZSBwUHJvcGVydGllcyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgZnVydGhlciBkZS1hbGxvY2F0ZWQKLWJ5IHRoZSBhcHBsaWNhdGlvbi4gVGhlIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluIHRoZSBvcGVuZWQgc3RhdGUuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIFwKLSAgICAgICAgICAgICAgICAgICBwRmlsZVByb3BlcnRpZXM9MHgleCIsIHBDb250ZXh0LCBwRmlsZVByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllczogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVByb3BlcnRpZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzOiBwUHJvcGVydGllcyBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY0dldElucHV0RmlsZVByb3BlcnRpZXMocEMsIHBGaWxlUHJvcGVydGllcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIGlmKCBNNE1DU19rU3RhdGVfT1BFTkVEICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHByZXZpb3VzbHkgY29tcHV0ZWQgcHJvcGVydGllcyBpbnRvIGdpdmVuIHN0cnVjdHVyZSAqLwotICAgIG1lbWNweSgodm9pZCAqKXBGaWxlUHJvcGVydGllcywKLSAgICAgICAgKHZvaWQgKikgJnBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLAotICAgICAgICBzaXplb2YoTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMpKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zZXRPdXRwdXRQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfT3V0cHV0UGFyYW1zKiBwUGFyYW1zKTsKLSAqIEBicmllZiAgIFNldCB0aGUgTUNTIHZpZGVvIG91dHB1dCBwYXJhbWV0ZXJzLgotICogQG5vdGUgICAgTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTTRNQ1Nfb3Blbi4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIE00TUNTX3N0ZXAuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQYXJhbXMgICAgICAgICAgICAgKElOL09VVCkgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzIDogT3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfUkFURV9GT1JfSDI2MyA6IE91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCAgICAgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZvcm1hdCBwYXJhbWV0ZXIKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1JBVEUgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHJhdGUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCA6IFVuZGVmaW5lZCBvdXRwdXQgYXVkaW8gZm9ybWF0IHBhcmFtZXRlcgotICogQHJldHVybiAgTTRNQ1NfRVJSX0RVUkFUSU9OX0lTX05VTEwgOiBTcGVjaWZpZWQgb3V0cHV0IHBhcmFtZXRlcnMgZGVmaW5lIGEgbnVsbCBkdXJhdGlvbiBzdHJlYW0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm8gYXVkaW8gYW5kIHZpZGVvKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19PdXRwdXRQYXJhbXMgKnBQYXJhbXMgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9VSW50MzIgdWlGcmFtZVdpZHRoOwotICAgIE00T1NBX1VJbnQzMiB1aUZyYW1lSGVpZ2h0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigKLSAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcyBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwUGFyYW1zPTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcFBhcmFtcyk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFBhcmFtcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtczogcFBhcmFtIGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljU2V0T3V0cHV0UGFyYW1zKHBDLCBwUGFyYW1zKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgaWYoIE00TUNTX2tTdGF0ZV9PUEVORUQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIElnbm9yZSBhdWRpbyBvciB2aWRlbyBzdHJlYW0gaWYgdGhlIG91dHB1dCBkbyBub3QgbmVlZCBpdCwgKi8KLSAgICAvKiBvciBpZiB0aGUgaW5wdXQgZmlsZSBkb2VzIG5vdCBoYXZlIGFueSBhdWRpbyBvciB2aWRlbyBzdHJlYW0gKi8KLSAgICAvKkZsQiAyNi4wMi4yMDA5OiBhZGQgbXAzIGFzIG1jcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICBpZiggKCBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvKQotICAgICAgICB8fCAocEMtPlZpZGVvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNKQotICAgICAgICB8fCAocFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUikKLSAgICAgICAgfHwgKHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMpICkKLSAgICB7Ci0gICAgICAgIHBDLT5ub3ZpZGVvID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICBpZiggKCBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvKQotICAgICAgICB8fCAocEMtPkF1ZGlvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNKSApCi0gICAgewotICAgICAgICBwQy0+bm9hdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICYmIHBDLT5ub3ZpZGVvICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIiEhISBNNE1DU19zZXRPdXRwdXRQYXJhbXMgOiBjbGlwIGlzIE5VTEwsIHRoZXJlIGlzIG5vIGF1ZGlvLCBubyB2aWRlbyIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0RVUkFUSU9OX0lTX05VTEw7Ci0gICAgfQotCi0gICAgLyogU2V0IHdyaXRlciAqLwotICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRXcml0ZXIocENvbnRleHQsIHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qIFNldCB2aWRlbyBwYXJhbWV0ZXJzICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIFZpZGVvIEZvcm1hdCBjb3JyZWN0bmVzcyAqLwotCi0gICAgICAgIHN3aXRjaCggcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0ICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9IMjYzX0ZPUkJJRERFTl9JTl9NUDRfRklMRTsKLQotICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID0gTTRFTkNPREVSX2tIMjYzOwotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0KLSAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotCi0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOdWxsVmlkZW86Ci0gICAgICAgICAgICAgICAgaWYoICggcFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rSDI2MykgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0gyNjNfRk9SQklEREVOX0lOX01QNF9GSUxFOwotCi0KLSAgICAgICAgICAgICAgICAvKiBFbmNvZGVyIG5lZWRlZCBmb3IgYmVnaW4gY3V0IHRvIGdlbmVyYXRlIGFuIEktZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9IE00RU5DT0RFUl9rTlVMTDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50VmlkZW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZm9ybWF0ICglZCksXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgVmlkZW8gZnJhbWUgc2l6ZSBjb3JyZWN0bmVzcyAqLwotICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa051bGxWaWRlbyA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nV2lkdGggPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvV2lkdGg7Ci0gICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0OwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogU2V0IG91dHB1dCB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgICAgICAgICAgcEMtPmVuY29kaW5nVmlkZW9Qcm9maWxlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1Byb2ZpbGU7Ci0gICAgICAgICAgICAvKiogU2V0IHRoZSB0YXJnZXQgdmlkZW8gbGV2ZWwsIGJlY2F1c2UgaW5wdXQgM2dwIGZpbGUgbWF5Ci0gICAgICAgICAgICAgKiAgaGF2ZSB3cm9uZyB2aWRlbyBsZXZlbCB2YWx1ZSAoc29tZSBlbmNvZGVycyBkbyBub3QgcmVzcGVjdAotICAgICAgICAgICAgICogIGxldmVsIHJlc3RyaWN0aW9ucyBsaWtlIHZpZGVvIHJlc29sdXRpb24gd2hlbiBjb250ZW50IGlzIGNyZWF0ZWQpLgotICAgICAgICAgICAgICoqLwotICAgICAgICAgICAgcEMtPmVuY29kaW5nVmlkZW9MZXZlbCA9IHBQYXJhbXMtPm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICAgICAgICAgIC8vIENsaXAncyBvcmlnaW5hbCB3aWR0aCBhbmQgaGVpZ2h0IG1heSBub3QgYmUKLSAgICAgICAgICAgIC8vIG11bHRpcGxlIG9mIDE2LgotICAgICAgICAgICAgLy8gRW5zdXJlIGVuY29kaW5nIHdpZHRoIGFuZCBoZWlnaHQgYXJlIG11bHRpcGxlIG9mIDE2Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHJlbWFpbmRlciA9IHBDLT5FbmNvZGluZ1dpZHRoICUgMTY7Ci0gICAgICAgICAgICBpZiAocmVtYWluZGVyICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocmVtYWluZGVyID49IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUm9sbCBmb3J3YXJkCi0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoICsgKDE2LXJlbWFpbmRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUm9sbCBiYWNrd2FyZAotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCAtIHJlbWFpbmRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlbWFpbmRlciA9IHBDLT5FbmNvZGluZ0hlaWdodCAlIDE2OwotICAgICAgICAgICAgaWYgKHJlbWFpbmRlciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlciA+PSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJvbGwgZm9yd2FyZAotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ICsgKDE2LXJlbWFpbmRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUm9sbCBiYWNrd2FyZAotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0IC0gcmVtYWluZGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0OwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogU2V0IG91dHB1dCB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgICAgICAgICAgcEMtPmVuY29kaW5nVmlkZW9Qcm9maWxlID0gcFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlOwotICAgICAgICAgICAgcEMtPmVuY29kaW5nVmlkZW9MZXZlbCA9IHBQYXJhbXMtPm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9TUUNJRl9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9TUUNJRl9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX1FRVkdBX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX1FRVkdBX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9RQ0lGX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX1FDSUZfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0E6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX1FWR0FfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfUVZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQ0lGOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9DSUZfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfQ0lGX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX1ZHQV9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9WR0FfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLyogK1BSIExWNTgwNyAqLwotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0E6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX1dWR0FfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfV1ZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfTlRTQ19XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9OVFNDX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8qIC1QUiBMVjU4MDcqLwotICAgICAgICAgICAgICAgICAgICAvKiArQ1IgR29vZ2xlICovCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjQwXzM2MDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfNjQwXzM2MF9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfNjQwXzM2MF9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzg1NF80ODBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzg1NF80ODBfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyODBfNzIwOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfMTI4MF83MjBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzEyODBfNzIwX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl8xMDgwXzcyMF9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzk2MF83MjBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzk2MF83MjBfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzE5MjBfMTA4MF9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfMTkyMF8xMDgwX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8qIC1DUiBHb29nbGUgKi8KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoJWQpLCByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB2aWRlbyBtYXggYXUgc2l6ZSBhbmQgbWF4IGNodW5jayBzaXplLgotICAgICAgICAqIFdlIGRvIGl0IGhlcmUgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBmcmFtZSBzaXplIG9ubHksIGFuZAotICAgICAgICAqIGJlY2F1c2Ugd2UgbmVlZCBpdCBmb3IgdGhlIGZpbGUgc2l6ZS92aWRlbyBiaXRyYXRlIGVzdGltYXRpb25zICovCi0gICAgICAgIHBDLT51aVZpZGVvTWF4QXVTaXplID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKDEuNUYgKihNNE9TQV9GbG9hdCkodWlGcmFtZVdpZHRoICogdWlGcmFtZUhlaWdodCkgXAotICAgICAgICAgICAgKk00TUNTX1ZJREVPX01JTl9DT01QUkVTU0lPTl9SQVRJTyk7Ci0gICAgICAgIHBDLT51aVZpZGVvTWF4Q2h1bmNrU2l6ZSA9IChNNE9TQV9VSW50MzIpKHBDLT51aVZpZGVvTWF4QXVTaXplICAgICAgIFwKLSAgICAgICAgICAgICoKLSAgICAgICAgICAgIE00TUNTX1ZJREVPX0NIVU5LX0FVX1NJWkVfUkFUSU8pOyAvKio8IGZyb20gbWF4IEFVIHNpemUgdG8gbWF4IENodW5jayBzaXplICovCi0KLSAgICAgICAgaWYoIDAgPT0gcEMtPnVpVmlkZW9NYXhBdVNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTaXplIG1heSBiZSB6ZXJvIGluIGNhc2Ugb2YgbnVsbCBlbmNvZGluZyB3aXRoIHVucmVjb2duaXplZCBzdHJlYW0gKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IHZpZGVvIGZyYW1lIHNpemUgaXMgMCByZXR1cm5pbmdcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2l6ZSBjaGVjayBmb3IgSDI2MyAob25seSB2YWxpZCBzaXplcyBhcmUgQ0lGLCBRQ0lGIGFuZCBTUUNJRikgKi8KLQotICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa0gyNjMgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICAgICAgLyogT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIFZpZGVvIEZyYW1lIHJhdGUgY29ycmVjdG5lc3MgKi8KLSAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tOdWxsVmlkZW8gIT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazVfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazdfNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2s3XzVfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwX0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazEwX0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMl81X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazEyXzVfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazE1X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2syMF9GUFM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjVfRlBTOgotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA9IE00RU5DT0RFUl9rMjVfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMwX0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazMwX0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZnJhbWUgcmF0ZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICglZCksIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1JBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBGcmFtZSByYXRlIGNoZWNrIGZvciBIMjYzIChvbmx5IGRpdmlkZXJzIG9mIDMwIGZwcyAoMjkuOTcgYWN0dWFsbHkpKSAqLwotICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa0gyNjMgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rNV9GUFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazdfNV9GUFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEwX0ZQUzoKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIC8qIE9LICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1JBVEVfRk9SX0gyNjMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1JBVEVfRk9SX0gyNjM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTZXQgYXVkaW8gcGFyYW1ldGVycyAqLwotICAgIGlmKCBwQy0+bm9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBBdWRpbyBGb3JtYXQgY29ycmVjdG5lc3MgKi8KLSAgICAgICAgc3dpdGNoKCBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLQotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9IE00RU5DT0RFUl9rTW9ubzsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQW1yU0lEID0gTTRFTkNPREVSX2tBbXJOb1NJRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rQUFDOwotICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxNjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjIwNTBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjIwNTBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazI0MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2szMjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDQxMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazQ4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMTAyNV9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyMDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChwUGFyYW1zLT5iQXVkaW9Nb25vID09IE00T1NBX1RSVUUpID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tNb25vIDogTTRFTkNPREVSX2tTdGVyZW87Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5SZWd1bGF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rQWFjUmVndWxOb25lOyAvL000RU5DT0RFUl9rQWFjQml0UmVzZXJ2b2lyCi0gICAgICAgICAgICAgICAgICAgIC8qIHVudXNlZCAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYklTID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iTVMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJQTlMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJUTlMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgLyogVE9ETyBjaGFuZ2UgaW50byBoaWdoc3BlZWQgYXNhcCAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYkhpZ2hTcGVlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBtY3Mgb3V0cHV0IGZvcm1hdCwgYWRkIG1wMyBlbmNvZGVyKi8KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa01QMzsKLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKHBQYXJhbXMtPmJBdWRpb01vbm8gPT0gTTRPU0FfVFJVRSkgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa01vbm8gOiBNNEVOQ09ERVJfa1N0ZXJlbzsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxNjAwMEh6OwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazgwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTEwMjVfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazExMDI1SHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyMDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxMjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjIwNTBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2syNDAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s0ODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tEZWZhdWx0X0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvOgotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEVmZmVjdHMgPT0gTTRPU0FfTlVMTCB8fCBwUGFyYW1zLT5uYkVmZmVjdHMgPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGVuY29kZXIgbmVlZGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBdWRpb05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSkgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tNb25vIDogTTRFTkNPREVSX2tTdGVyZW87Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSkgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tNb25vIDogTTRFTkNPREVSX2tTdGVyZW87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcyBjYWxsaW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIgTTRWSURFT0VESVRJTkdfa051bGwsIEFNUiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rQU1STkI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IDgwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBTVJOQjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQW1yU0lEID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rQW1yTm9TSUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMgY2FsbGluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyIE00VklERU9FRElUSU5HX2tOdWxsLCBBQUMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLlJlZ3VsYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tBYWNSZWd1bE5vbmU7IC8vTTRFTkNPREVSX2tBYWNCaXRSZXNlcnZvaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2syNDAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2s0ODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYklTID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJNUyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iUE5TID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJUTlMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIGNoYW5nZSBpbnRvIGhpZ2hzcGVlZCBhc2FwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJIaWdoU3BlZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zIGNhbGxpbmdcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIgTTRWSURFT0VESVRJTkdfa051bGwsIE1QMyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2sxNjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMjIwNTBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazI0MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2szMjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rNDQxMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazQ4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rTVAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRBdWRpbzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IE91dHB1dCBhdWRpbyBmb3JtYXQgKCVkKSBpc1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21wYXRpYmxlIHdpdGggYXVkaW8gZWZmZWN0cywgcmV0dXJuaW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvKiBFVlJDCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ29udGV4dCwgcFBhcmFtcy0+XAotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgT3V0cHV0QXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rRVZSQzsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9IE00RU5DT0RFUl9rTW9ubzsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgYnJlYWs7ICovCi0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBVbmRlZmluZWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCAoJWQpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBwUGFyYW1zLT5wT3V0cHV0UENNZmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIHBDLT5wT3V0cHV0UENNZmlsZSA9IHBQYXJhbXMtPnBPdXRwdXRQQ01maWxlOwotCi0gICAgICAgIC8qIE9wZW4gb3V0cHV0IFBDTSBmaWxlICovCi0gICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHItPm9wZW5Xcml0ZSgmKHBDLT5wT3V0cHV0UENNZmlsZSksCi0gICAgICAgICAgICBwUGFyYW1zLT5wT3V0cHV0UENNZmlsZSwgTTRPU0Ffa0ZpbGVXcml0ZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5wT3V0cHV0UENNZmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLypTdG9yZSBtZWRpYSByZW5kZXJpbmcgcGFyYW1ldGVyIGludG8gdGhlIGludGVybmFsIGNvbnRleHQqLwotICAgIHBDLT5NZWRpYVJlbmRlcmluZyA9IHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nOwotCi0gICAgLyogQWRkIGF1ZGlvIGVmZmVjdHMqLwotICAgIC8qQ29weSBNQ1MgZWZmZWN0cyBzdHJ1Y3R1cmUgaW50byBpbnRlcm5hbCBjb250ZXh0Ki8KLSAgICBpZiggcFBhcmFtcy0+bmJFZmZlY3RzID4gMCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgaiA9IDA7Ci0gICAgICAgIHBDLT5uYkVmZmVjdHMgPSBwUGFyYW1zLT5uYkVmZmVjdHM7Ci0gICAgICAgIHBDLT5wRWZmZWN0cyA9IChNNE1DU19FZmZlY3RTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bmJFZmZlY3RzIFwKLSAgICAgICAgICAgICpzaXplb2YoTTRNQ1NfRWZmZWN0U2V0dGluZ3MpLCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIkFsbG9jYXRpb24gb2YgZWZmZWN0cyBsaXN0Iik7Ci0KLSAgICAgICAgaWYoIHBDLT5wRWZmZWN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IHBDLT5uYkVmZmVjdHM7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvcHkgZWZmZWN0IHRvICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikgJihwQy0+cEVmZmVjdHNbal0pLAotICAgICAgICAgICAgICAgICh2b2lkICopICYocFBhcmFtcy0+cEVmZmVjdHNbal0pLAotICAgICAgICAgICAgICAgIHNpemVvZihNNE1DU19FZmZlY3RTZXR0aW5ncykpOwotCi0gICAgICAgICAgICBzd2l0Y2goIHBDLT5wRWZmZWN0c1tqXS5BdWRpb0VmZmVjdFR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9Ob25lOgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogZWZmZWN0IHR5cGUgJWkgaXMgTm9uZSIsIGopOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0ucEV4dEF1ZGlvRWZmZWN0RmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5FeHRBdWRpb0VmZmVjdEZjdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX0ZhZGVJbjoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IGVmZmVjdCB0eXBlICVpIGlzIEZhZGVJbiIsIGopOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0ucEV4dEF1ZGlvRWZmZWN0RmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5FeHRBdWRpb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlT3V0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogZWZmZWN0IHR5cGUgJWkgaXMgRmFkZU91dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBqKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX0V4dGVybmFsOgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogZWZmZWN0IHR5cGUgJWkgaXMgRXh0ZXJuYWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBFZmZlY3RzICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IG5vIGV4dGVybmFsIGVmZmVjdCBmdW5jdGlvblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHRvIGV4dGVybmFsIGVmZmVjdCBudW1iZXIgJWkiLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5FeHRBdWRpb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBlZmZlY3QgdHlwZSBub3QgcmVjb2duaXplZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5uYkVmZmVjdHMgPSAwOwotICAgICAgICBwQy0+cEVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9TRVQ7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKQotICogQGJyaWVmICAgU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KCkuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFJhdGVzICAgICAgICAgICAgIChJTikgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOiBBdWRpbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA5NiBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOiBBdWRpbyBiaXRyYXRlIGlzIHRvbyBsb3cgKDE2IGticHMgbWluIGZvciBhYWMsIDEyLjIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW1yLCA4IGZvciBtcDMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOiBCZWdpbiBjdXQgYW5kIEVuZCBjdXQgYXJlIGVxdWFscwotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjogQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGlucHV0IGNsaXAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbgotICogQHJldHVybiAgTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVDogRW5kIGN1dCB0aW1lIGlzIHNtYWxsZXIgdGhhbiBiZWdpbiBjdXQgdGltZQotICogQHJldHVybiAgTTRNQ1NfRVJSX01BWEZJTEVTSVpFX1RPT19TTUFMTDogTm90IGVub3VnaCBzcGFjZSB0byBzdG9yZSB3aG9sZSBvdXRwdXQgZmlsZSBhdCBnaXZlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyYXRlcwotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fSElHSDogVmlkZW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gODAwIGticHMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19MT1c6ICBWaWRlbyBiaXRyYXRlIHRvbyBsb3cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3NldEVuY29kaW5nUGFyYW1zKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0VuY29kaW5nUGFyYW1zICpwUmF0ZXMgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9VSW50MzIgaiA9IDA7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigKLSAgICAgICAgIk00TUNTX3NldEVuY29kaW5nUGFyYW1zIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBSYXRlcz0weCV4IiwKLSAgICAgICAgcENvbnRleHQsIHBSYXRlcyk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zZXRFbmNvZGluZ1BhcmFtczogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUmF0ZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zZXRFbmNvZGluZ1BhcmFtczogcFJhdGVzIGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljU2V0RW5jb2RpbmdQYXJhbXMocEMsIHBSYXRlcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIGlmKCBNNE1DU19rU3RhdGVfU0VUICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcygpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIFNldCBnaXZlbiB2YWx1ZXMgKi8KLSAgICBwQy0+dWlWaWRlb0JpdHJhdGUgPSBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICBwQy0+dWlBdWRpb0JpdHJhdGUgPSBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBwQy0+dWlCZWdpbkN1dFRpbWUgPSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICBwQy0+dWlFbmRDdXRUaW1lID0gcFJhdGVzLT5FbmRDdXRUaW1lOwotICAgIHBDLT51aU1heEZpbGVTaXplID0gcFJhdGVzLT5PdXRwdXRGaWxlU2l6ZTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgYmVnaW4gY3V0IHRpbWUgdmFsaWRpdHkgKi8KLSAgICBpZiggcEMtPnVpQmVnaW5DdXRUaW1lID49IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcygpOiBCZWdpbiBjdXQgbGFyZ2VyIHRoYW4gZHVyYXRpb24gKCVkPiVkKSxcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcEMtPnVpQmVnaW5DdXRUaW1lLCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgZW5kIGN1dCB0aW1lIGlzIHRvbyBsYXJnZSwgd2Ugc2V0IGl0IHRvIHRoZSBjbGlwIGR1cmF0aW9uICovCi0gICAgaWYoIHBDLT51aUVuZEN1dFRpbWUgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgewotICAgICAgICBwQy0+dWlFbmRDdXRUaW1lID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBlbmQgY3V0IHRpbWUgdmFsaWRpdHkgKi8KLSAgICBpZiggcEMtPnVpRW5kQ3V0VGltZSA+IDAgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT51aUVuZEN1dFRpbWUgPCBwQy0+dWlCZWdpbkN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoKTogQmVnaW4gY3V0IGdyZWF0ZXIgdGhhbiBlbmQgY3V0ICglZCwlZCksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51aUJlZ2luQ3V0VGltZSwgcEMtPnVpRW5kQ3V0VGltZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID09IHBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcygpOiBCZWdpbiBhbmQgRW5kIGN1dHMgYXJlIGVxdWFsICglZCwlZCksXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnVpQmVnaW5DdXRUaW1lLCBwQy0+dWlFbmRDdXRUaW1lKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGbEIgMjAwOS4wMy4wNDogY2hlY2sgYXVkaW8gZWZmZWN0cyBzdGFydCB0aW1lIGFuZCBkdXJhdGlvbiB2YWxpZGl0eSovCi0gICAgZm9yICggaiA9IDA7IGogPCBwQy0+bmJFZmZlY3RzOyBqKysgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIG91dHB1dEVuZEN1dCA9IHBDLT51aUVuZEN1dFRpbWU7Ci0KLSAgICAgICAgaWYoIHBDLT51aUVuZEN1dFRpbWUgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dEVuZEN1dCA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5wRWZmZWN0c1tqXS51aVN0YXJ0VGltZSA+IChvdXRwdXRFbmRDdXQgLSBwQy0+dWlCZWdpbkN1dFRpbWUpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00TUNTX3NldEVuY29kaW5nUGFyYW1zKCk6IEVmZmVjdHMgc3RhcnQgdGltZSBpcyBsYXJnZXIgdGhhblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uICglZCwlZCksIHJldHVybmluZyBNNEVSUl9QQVJBTUVURVIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT51aUVuZEN1dFRpbWUgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPnBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lICsgcEMtPnBFZmZlY3RzW2pdLnVpRHVyYXRpb24gPiBcCi0gICAgICAgICAgICAob3V0cHV0RW5kQ3V0IC0gcEMtPnVpQmVnaW5DdXRUaW1lKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFJlLWFkanVzdCB0aGUgZWZmZWN0IGR1cmF0aW9uIHVudGlsIHRoZSBlbmQgb2YgdGhlIG91dHB1dCBjbGlwKi8KLSAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS51aUR1cmF0aW9uID0gKG91dHB1dEVuZEN1dCAtIHBDLT51aUJlZ2luQ3V0VGltZSkgLSBcCi0gICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgYXVkaW8gYml0cmF0ZSBjb25zaXN0ZW5jeSAqLwotICAgIGlmKCAoIHBDLT5ub2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAmJiAocEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCAhPSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCkgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSAhPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQU1STkIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+dWlBdWRpb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlIDwgTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0VWUkMKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgZWxzZSBpZihwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rRVZSQykKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYocEMtPnVpQXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazlfMl9LQlBTKQotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYocEMtPnVpQXVkaW9CaXRyYXRlIDwgTTRWSURFT0VESVRJTkdfazlfMl9LQlBTKQotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgLy8gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKkZsQiAyNi4wMi4yMDA5OiBhZGQgbXAzIGFzIG1jcyBvdXRwdXQgZm9ybWF0LCBhZGQgbXAzIGVuY29kZXIqLwotICAgICAgICAgICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa01QMyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPj0gTTRFTkNPREVSX2szMjAwMEh6ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTXBlZyBsYXllciAxKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IDMyMDAwMCApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlIDwgMzIwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA+PSBNNEVOQ09ERVJfazE2MDAwSHogKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNcGVnIGxheWVyIDIqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID4gMTYwMDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IDgwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwQy0+dWlBdWRpb0JpdHJhdGUgPCAxNjAwMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0KLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00RU5DT0RFUl9rU3RlcmVvKSApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID09IE00RU5DT0RFUl9rODAwMEh6Ci0gICAgICAgICAgICAgICAgICAgIHx8IHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPT0gTTRFTkNPREVSX2sxMTAyNUh6Ci0gICAgICAgICAgICAgICAgICAgIHx8IHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPT0gTTRFTkNPREVSX2sxMjAwMEh6ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTXBlZyBsYXllciAyLjUqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID4gNjQwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggcEMtPnVpQXVkaW9CaXRyYXRlIDwgODAwMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPT0gTTRFTkNPREVSX2tNb25vKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBDLT51aUF1ZGlvQml0cmF0ZSA8IDE2MDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRFTkNPREVSX2tTdGVyZW8pICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19zZXRFbmNvZGluZ1BhcmFtczogTVAzIGF1ZGlvIHNhbXBsaW5nIGZyZXF1ZW5jeSBlcnJvclwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCVkKSIsIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPT0gTTRFTkNPREVSX2tNb25vICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+dWlBdWRpb0JpdHJhdGUgPCBNNFZJREVPRURJVElOR19rMTZfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlIDwgTTRWSURFT0VESVRJTkdfazMyX0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogTlVMTCBhdWRpbyA6IGNvcHkgaW5wdXQgZmlsZSBiaXRyYXRlICovCi0gICAgICAgIHBDLT51aUF1ZGlvQml0cmF0ZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgIH0KLQotICAgIC8qIENoZWNrIHZpZGVvIGJpdHJhdGUgY29uc2lzdGVuY3kgKi8KLSAgICBpZiggKCBwQy0+bm92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ICE9IE00RU5DT0RFUl9rTlVMTCkgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT51aVZpZGVvQml0cmF0ZSAhPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+dWlWaWRlb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fSElHSDsKLQotICAgICAgICAgICAgaWYoIHBDLT51aVZpZGVvQml0cmF0ZSA8IE00VklERU9FRElUSU5HX2sxNl9LQlBTICkKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5VTEwgdmlkZW8gOiBjb3B5IGlucHV0IGZpbGUgYml0cmF0ZSAqLwotICAgICAgICBwQy0+dWlWaWRlb0JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICB9Ci0KLSAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb1RpbWVzY2FsZSA8PSAzMDAwMAotICAgICAgICAmJiBwUmF0ZXMtPk91dHB1dFZpZGVvVGltZXNjYWxlID4gMCApCi0gICAgewotICAgICAgICBwQy0+b3V0cHV0VmlkZW9UaW1lc2NhbGUgPSBwUmF0ZXMtPk91dHB1dFZpZGVvVGltZXNjYWxlOwotICAgIH0KLQotICAgIC8qIENoZWNrIGZpbGUgc2l6ZSAqLwotICAgIHJldHVybiBNNE1DU19pbnRDaGVja01heEZpbGVTaXplKHBDKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKQotICogQGJyaWVmICAgR2V0IHRoZSBleHRlbmRlZCB2YWx1ZXMgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIENvdWxkIGJlIGNhbGxlZCBhZnRlciBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcy4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUmF0ZXMgICAgICAgICAgICAgKE9VVCkgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOiBFbmNvZGluZyBzZXR0aW5ncyB3b3VsZCBwcm9kdWNlIGEgbnVsbCBkdXJhdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwID0gZW5jb2RpbmcgaXMgaW1wb3NzaWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcyggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0VuY29kaW5nUGFyYW1zICpwUmF0ZXMgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLQotICAgIE00T1NBX0ludDMyIG1pbmF1ZGlvYml0cmF0ZTsKLSAgICBNNE9TQV9JbnQzMiBtaW52aWRlb2JpdHJhdGU7Ci0gICAgTTRPU0FfSW50MzIgbWF4Y29tYmluZWRiaXRyYXRlOwotCi0gICAgTTRPU0FfSW50MzIgY2FsY2JpdHJhdGU7Ci0KLSAgICBNNE9TQV9VSW50MzIgbWF4ZHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIGNhbGNkdXJhdGlvbjsKLQotICAgIE00T1NBX0Jvb2wgZml4ZWRfYXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGZpeGVkX3ZpZGVvID0gTTRPU0FfRkFMU0U7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY0dldEV4dGVuZGVkRW5jb2RpbmdQYXJhbXMocEMsIHBSYXRlcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShwQy0+dWlWaWRlb0JpdHJhdGUsIDApOwotICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUocEMtPnVpQXVkaW9CaXRyYXRlLCAwKTsKLSAgICBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA9IHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICBwUmF0ZXMtPkVuZEN1dFRpbWUgPSBwQy0+dWlFbmRDdXRUaW1lOwotICAgIHBSYXRlcy0+T3V0cHV0RmlsZVNpemUgPSBwQy0+dWlNYXhGaWxlU2l6ZTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYoIE00TUNTX2tTdGF0ZV9TRVQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19nZXRFeHRlbmRlZEVuY29kaW5nUGFyYW1zKCk6IFdyb25nIFN0YXRlICglZCksXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLCBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSBtaW4gYXVkaW8gYml0cmF0ZSAqLwotICAgIGlmKCBwQy0+bm9hdWRpbyApCi0gICAgewotICAgICAgICBmaXhlZF9hdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gMDsKLSAgICAgICAgbWluYXVkaW9iaXRyYXRlID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgewotICAgICAgICBmaXhlZF9hdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0FNUk5CICkKLSAgICAgICAgewotICAgICAgICAgICAgZml4ZWRfYXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgbWluYXVkaW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgfQotICAgICAgICAvL0VWUkMKLSAgICAgICAgLy8gICAgICAgIGlmKHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tFVlJDKQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIGZpeGVkX2F1ZGlvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgLy8gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5XzJfS0JQUzsKLSAgICAgICAgLy8gICAgICAgICAgICBtaW5hdWRpb2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOV8yX0tCUFM7Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgbWNzIG91dHB1dCBmb3JtYXQqLwotICAgICAgICBlbHNlIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rTVAzICkKLSAgICAgICAgewotICAgICAgICAgICAgbWluYXVkaW9iaXRyYXRlID0KLSAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUzsgLypEZWZhdWx0IG1pbiBhdWRpbyBiaXRyYXRlIGZvciBNUEVHIGxheWVyIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYm90aCBtb25vIGFuZCBzdGVyZW8gY2hhbm5lbHMqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbWluYXVkaW9iaXRyYXRlID0gKHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2sxNl9LQlBTIDogTTRWSURFT0VESVRJTkdfazMyX0tCUFM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDaGVjayBhdWRpbyBiaXRyYXRlIGlzIGluIHRoZSBjb3JyZWN0IHJhbmdlICovCi0gICAgaWYoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIGlmKCAoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IDApCi0gICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPCBtaW5hdWRpb2JpdHJhdGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBtaW5hdWRpb2JpdHJhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOTZfS0JQUyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazk2X0tCUFM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIG1pbiB2aWRlbyBiaXRyYXRlICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICB7Ci0gICAgICAgIGZpeGVkX3ZpZGVvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSAwOwotICAgICAgICBtaW52aWRlb2JpdHJhdGUgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgIHsKLSAgICAgICAgZml4ZWRfdmlkZW8gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotICAgICAgICBtaW52aWRlb2JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWludmlkZW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazE2X0tCUFM7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgdmlkZW8gYml0cmF0ZSBpcyBpbiB0aGUgY29ycmVjdCByYW5nZSAqLwotICAgIGlmKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBpZiggKCBwQy0+dWlWaWRlb0JpdHJhdGUgPiAwKQotICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlIDwgbWludmlkZW9iaXRyYXRlKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gbWludmlkZW9iaXRyYXRlOwotICAgICAgICB9Ci0gICAgICAgIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOF9NQlBTOwotICAgICAgICB9Ci0gICAgICAgIC8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgIH0KLQotICAgIC8qIENoZWNrIGN1dCB0aW1lcyBhcmUgaW4gY29ycmVjdCByYW5nZSAqLwotICAgIGlmKCAoIHBSYXRlcy0+QmVnaW5DdXRUaW1lID49IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uKQotICAgICAgICB8fCAoKCBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA+PSBwUmF0ZXMtPkVuZEN1dFRpbWUpCi0gICAgICAgICYmIChwUmF0ZXMtPkVuZEN1dFRpbWUgPiAwKSkgKQotICAgIHsKLSAgICAgICAgcFJhdGVzLT5CZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICBwUmF0ZXMtPkVuZEN1dFRpbWUgPSAwOwotICAgIH0KLQotICAgIGlmKCBwUmF0ZXMtPkVuZEN1dFRpbWUgPT0gMCApCi0gICAgICAgIGNhbGNkdXJhdGlvbiA9Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgZWxzZQotICAgICAgICBjYWxjZHVyYXRpb24gPSBwUmF0ZXMtPkVuZEN1dFRpbWUgLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLQotICAgIC8qIHByaW9yaXR5IDEgOiBtYXggZmlsZSBzaXplICovCi0gICAgaWYoIHBSYXRlcy0+T3V0cHV0RmlsZVNpemUgPT0gMCApCi0gICAgewotICAgICAgICAvKiB3ZSBjYW4gcHV0IG1heGltdW0gdmFsdWVzIGZvciBhbGwgdW5kZWZpbmVkIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgaWYoIHBSYXRlcy0+RW5kQ3V0VGltZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKCBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkKLSAgICAgICAgICAgICYmIChmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5Nl9LQlBTOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpCi0gICAgICAgICAgICAmJiAoZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UpICkKLSAgICAgICAgewotICAgICAgICAgICAgLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s4X01CUFM7Ci0gICAgICAgICAgICAvKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBjb21wdXRlIG1heCBkdXJhdGlvbiAqLwotICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAvIChtaW52aWRlb2JpdHJhdGUgKyBtaW5hdWRpb2JpdHJhdGUpICogODAwMC4wKTsKLQotICAgICAgICBpZiggbWF4ZHVyYXRpb24KLSAgICAgICAgICAgICsgcFJhdGVzLT5CZWdpbkN1dFRpbWUgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heGR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcHJpb3JpdHkgMiA6IGN1dCB0aW1lcyAqLwotICAgICAgICBpZiggKCBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA+IDApIHx8IChwUmF0ZXMtPkVuZEN1dFRpbWUgPiAwKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPiBtYXhkdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FsY2R1cmF0aW9uID0gbWF4ZHVyYXRpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1heGNvbWJpbmVkYml0cmF0ZSA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTyAvIChjYWxjZHVyYXRpb24gLyA4MDAwLjApKTsKLQotICAgICAgICAgICAgLyogYXVkaW8gYW5kIHZpZGVvIGJpdHJhdGVzICovCi0gICAgICAgICAgICBpZiggKCBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKQotICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogc2V0IGF1ZGlvID0gMS8zIGFuZCB2aWRlbyA9IDIvMyAqLwotICAgICAgICAgICAgICAgIGlmKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlIC8gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA8IG1pbmF1ZGlvYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOTZfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5Nl9LQlBTOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShtYXhjb21iaW5lZGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUsIDApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA8IG1pbnZpZGVvYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s4X01CUFM7IC8qKyBOZXcgRW5jb2RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgMyA6IGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoICggZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPj0gbWluYXVkaW9iaXRyYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1pbnZpZGVvYml0cmF0ZSA+IG1heGNvbWJpbmVkYml0cmF0ZSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlIDwgbWluYXVkaW9iaXRyYXRlKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gbWluYXVkaW9iaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPSBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvbWJpbmVkYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSwgMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNiaXRyYXRlIDwgbWludmlkZW9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gbWludmlkZW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjYml0cmF0ZSA+IE00VklERU9FRElUSU5HX2s4X01CUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOF9NQlBTOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID4gY2FsY2JpdHJhdGUpKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gY2FsY2JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgNCA6IHZpZGVvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAoIGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA+PSBtaW52aWRlb2JpdHJhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtaW5hdWRpb2JpdHJhdGUgPiBtYXhjb21iaW5lZGJpdHJhdGUpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSwgLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPCBtaW52aWRlb2JpdHJhdGUpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUsIDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2JpdHJhdGUgPCBtaW5hdWRpb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gbWluYXVkaW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOTZfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOTZfS0JQUzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPiBjYWxjYml0cmF0ZSkpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IGNhbGNiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogcHJpb3JpdHkgMyA6IGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSAhPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgNCA6IHZpZGVvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogY29tcHV0ZSBtYXggZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgICAgICAgICAgICAgLyAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUpICogODAwMC4wKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggbWF4ZHVyYXRpb24gKyBwUmF0ZXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA+IG1heGR1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2R1cmF0aW9uID0gbWF4ZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID09IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCB3aXRoIG1pbiB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gbWludmlkZW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgbWF4IGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlKSAqIDgwMDAuMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIG1heGR1cmF0aW9uICsgcFJhdGVzLT5CZWdpbkN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPiBtYXhkdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNkdXJhdGlvbiA9IG1heGR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBzZWFyY2ggbWF4IHBvc3NpYmxlIHZpZGVvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgbWF4Y29tYmluZWRiaXRyYXRlID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKGNhbGNkdXJhdGlvbiAvIDgwMDAuMCkpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlKCAoIGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICA8IE00VklERU9FRElUSU5HX2s4X01CUFMpICkgLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUsICsxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA8PSBtYXhjb21iaW5lZGJpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gY2FsY2JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgNCA6IHZpZGVvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgd2l0aCBtaW4gYXVkaW8gYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRlIG1heCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSkgKiA4MDAwLjApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBtYXhkdXJhdGlvbiArIHBSYXRlcy0+QmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID4gbWF4ZHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjZHVyYXRpb24gPSBtYXhkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogc2VhcmNoIG1heCBwb3NzaWJsZSBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIG1heGNvbWJpbmVkYml0cmF0ZSA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChjYWxjZHVyYXRpb24gLyA4MDAwLjApKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSggKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPCBNNFZJREVPRURJVElOR19rOTZfS0JQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjYml0cmF0ZSA9IE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlLCArMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPD0gbWF4Y29tYmluZWRiaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IGNhbGNiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgbWF4IGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKG1pbnZpZGVvYml0cmF0ZSArIG1pbmF1ZGlvYml0cmF0ZSkgKiA4MDAwLjApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBtYXhkdXJhdGlvbiArIHBSYXRlcy0+QmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID4gbWF4ZHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjZHVyYXRpb24gPSBtYXhkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogc2V0IGF1ZGlvID0gMS8zIGFuZCB2aWRlbyA9IDIvMyAqLwotICAgICAgICAgICAgICAgICAgICBtYXhjb21iaW5lZGJpdHJhdGUgPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgICAgICAgICAgICAgLyAoY2FsY2R1cmF0aW9uIC8gODAwMC4wKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShtYXhjb21iaW5lZGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIDMsIDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPCBtaW5hdWRpb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gbWluYXVkaW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gTTRWSURFT0VESVRJTkdfazk2X0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazk2X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSwgMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA8IG1pbnZpZGVvYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBtaW52aWRlb2JpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s4X01CUFM7IC8qKyBOZXcgRW5jb2RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHJlY29tcHV0ZSBtYXggZHVyYXRpb24gd2l0aCBmaW5hbCBiaXRyYXRlcyAqLwotICAgIGlmKCBwUmF0ZXMtPk91dHB1dEZpbGVTaXplID4gMCApCi0gICAgewotICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAvIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSArIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlKQotICAgICAgICAgICAgKiA4MDAwLjApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtYXhkdXJhdGlvbiA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgIH0KLQotICAgIGlmKCBtYXhkdXJhdGlvbgotICAgICAgICArIHBSYXRlcy0+QmVnaW5DdXRUaW1lID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgbWF4ZHVyYXRpb24gPQotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICB9Ci0KLSAgICBpZiggcFJhdGVzLT5FbmRDdXRUaW1lID09IDAgKQotICAgIHsKLSAgICAgICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gcFJhdGVzLT5CZWdpbkN1dFRpbWUgKyBtYXhkdXJhdGlvbjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY2FsY2R1cmF0aW9uID0gcFJhdGVzLT5FbmRDdXRUaW1lIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA+IG1heGR1cmF0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gcFJhdGVzLT5CZWdpbkN1dFRpbWUgKyBtYXhkdXJhdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gOiBjb25zdHJhaW50cyBhcmUgdG9vIHN0cm9uZyAqLwotICAgIGlmKCBwUmF0ZXMtPkVuZEN1dFRpbWUgPT0gcFJhdGVzLT5CZWdpbkN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ7Ci0gICAgfQotCi0gICAgLyogZXN0aW1hdGVkIHJlc3VsdGluZyBmaWxlIHNpemUgKi8KLSAgICBwUmF0ZXMtPk91dHB1dEZpbGVTaXplID0gKE00T1NBX1VJbnQzMikoTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICogKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlICsgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUpCi0gICAgICAgICogKCggcFJhdGVzLT5FbmRDdXRUaW1lIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWUpIC8gODAwMC4wKSk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydChNNE1DU19Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgQ2hlY2sgcGFyYW1ldGVycyB0byBzdGFydAotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDk2IGticHMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIGJpdHJhdGUgaXMgdG9vIGxvdyAoMTYga2JwcyBtaW4gZm9yIGFhYywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIuMiBmb3IgYW1yLCA4IGZvciBtcDMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWdpbiBjdXQgYW5kIEVuZCBjdXQgYXJlIGVxdWFscwotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGlucHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgZHVyYXRpb24KLSAqIEByZXR1cm4gIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQ6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBjdXQgdGltZSBpcyBzbWFsbGVyIHRoYW4gYmVnaW4gY3V0IHRpbWUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9NQVhGSUxFU0laRV9UT09fU01BTEw6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCBlbm91Z2ggc3BhY2UgdG8gc3RvcmUgd2hvbGUgb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgYXQgZ2l2ZW4gYml0cmF0ZXMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlbyBiaXRyYXRlIHRvbyBsb3cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE1DU19FbmNvZGluZ1BhcmFtcyBWZXJpZnlSYXRlczsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb24qLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNDaGVja1BhcmFtc0FuZFN0YXJ0KHBDKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgaWYoIE00TUNTX2tTdGF0ZV9TRVQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBBdWRpbyBiaXRyYXRlIHNob3VsZCBub3Qgc3RheSB1bmRlZmluZWQgYXQgdGhpcyBwb2ludCAqLwotICAgIGlmKCAoIHBDLT5ub2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAmJiAocEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCAhPSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCkKLSAgICAgICAgJiYgKHBDLT51aUF1ZGlvQml0cmF0ZSA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQgOiB1bmRlZmluZWQgYXVkaW8gYml0cmF0ZSIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgIH0KLQotICAgIC8qIFZpZGVvIGJpdHJhdGUgc2hvdWxkIG5vdCBzdGF5IHVuZGVmaW5lZCBhdCB0aGlzIHBvaW50ICovCi0gICAgaWYoICggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCAhPSBNNEVOQ09ERVJfa05VTEwpCi0gICAgICAgICYmIChwQy0+dWlWaWRlb0JpdHJhdGUgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0IDogdW5kZWZpbmVkIHZpZGVvIGJpdHJhdGUiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVzsKLSAgICB9Ci0KLSAgICAvKiBTZXQgZW5kIGN1dCB0aW1lIGlmIG5lY2Vzc2FyeSAobm90IGFuIGVycm9yKSAqLwotICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID09IDAgKQotICAgIHsKLSAgICAgICAgcEMtPnVpRW5kQ3V0VGltZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgIH0KLQotICAgIC8qIEZvcmNlIGEgcmUtc2V0IHRvIGNoZWNrIHZhbGlkaXR5IG9mIHBhcmFtZXRlcnMgKi8KLSAgICBWZXJpZnlSYXRlcy5PdXRwdXRWaWRlb0JpdHJhdGUgPSBwQy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgVmVyaWZ5UmF0ZXMuT3V0cHV0QXVkaW9CaXRyYXRlID0gcEMtPnVpQXVkaW9CaXRyYXRlOwotICAgIFZlcmlmeVJhdGVzLkJlZ2luQ3V0VGltZSA9IHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICBWZXJpZnlSYXRlcy5FbmRDdXRUaW1lID0gcEMtPnVpRW5kQ3V0VGltZTsKLSAgICBWZXJpZnlSYXRlcy5PdXRwdXRGaWxlU2l6ZSA9IHBDLT51aU1heEZpbGVTaXplOwotICAgIFZlcmlmeVJhdGVzLk91dHB1dFZpZGVvVGltZXNjYWxlID0gcEMtPm91dHB1dFZpZGVvVGltZXNjYWxlOwotCi0gICAgZXJyID0gTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMocENvbnRleHQsICZWZXJpZnlSYXRlcyk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHBhcmFtZXRlcnMgY29uc2lzdGVuY3kgKi8KLSAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQgOiBpbnZhbGlkIHBhcmFtZXRlciBmb3VuZCIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQWxsIGlzIE9LIDogdXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA9IHBDLT51aVZpZGVvQml0cmF0ZTsKLSAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT51aUF1ZGlvQml0cmF0ZTsKLQotI2lmZGVmIE00TUNTX1dJVEhfRkFTVF9PUEVOCi0gICAgLyoqCi0gICAgKiBSZW1ha2UgdGhlIG9wZW4gaWYgaXQgd2FzIGRvbmUgaW4gZmFzdCBtb2RlICovCi0KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkZpbGVPcGVuZWRJbkZhc3RNb2RlICkKLSAgICB7Ci0gICAgICAgIC8qIENsb3NlIHRoZSBmaWxlIG9wZW5lZCBpbiBmYXN0IG1vZGUgKi8KLSAgICAgICAgTTRNQ1NfaW50Q2xlYW5VcF9SZWFkZXJzRGVjb2RlcnMocEMpOwotCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9DUkVBVEVEOwotCi0gICAgICAgIC8qIFJlb3BlbiBpdCBpbiBub3JtYWwgbW9kZSAqLwotICAgICAgICBlcnIgPSBNNE1DU19vcGVuKHBDb250ZXh0LCBwQy0+cElucHV0RmlsZSwgcEMtPklucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICBwQy0+cE91dHB1dEZpbGUsIHBDLT5wVGVtcG9yYXJ5RmlsZSk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQgOiBNNE1DU19PcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0jZW5kaWYgLyogTTRNQ1NfV0lUSF9GQVNUX09QRU4gKi8KLQotICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9SRUFEWTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwU2V0KE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcFNldCggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNEVOQ09ERVJfSGVhZGVyICplbmNIZWFkZXI7Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHZpZGVvIGRlY29kZXIgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpCi0gICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwpICkKLSAgICB7Ci0gICAgICAgIHBDLT5iSDI2NFRyaW0gPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICogUHJlcGFyZSB0aGUgdmlkZW8gZW5jb2RlciAqLwotICAgIGVyciA9IE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBTZXQoKTogTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCAoIHBDLT51aUJlZ2luQ3V0VGltZSAhPSAwKQotICAgICAgICAmJiAocEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KQotICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPT0gTTRFTkNPREVSX2tOVUxMKSApCi0gICAgewotCi0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgIE00RU5DT0RFUl9rT3B0aW9uSURfSDI2NFByb2Nlc3NOQUxVQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDLT5tX3BJbnN0YW5jZSk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludFN0ZXRTZXQgOnBGY3RTZXRPcHRpb24gZmFpbGVkICAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgIE00RU5DT0RFUl9rT3B0aW9uSURfU2V0SDI2NFByb2Nlc3NOQUxVZmN0c1B0ciwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmSDI2NE1DU19Qcm9jZXNzRW5jb2RlZE5BTFUpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRTdGV0U2V0IDpwRmN0U2V0T3B0aW9uIGZhaWxlZCAgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RHZXRPcHRpb24ocEMtPnBWaUVuY0N0eHQsCi0gICAgICAgICAgICBNNEVOQ09ERVJfa09wdGlvbklEX0VuY29kZXJIZWFkZXIsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpIHx8IChNNE9TQV9OVUxMID09IGVuY0hlYWRlci0+cEJ1ZikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xvc2U6IGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IG5vIHJldHVybiBoZXJlLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGRlYWxsb2NhdGUgYWZ0ZXIgY2xvc2UsIGV2ZW4gaWYgaXQgZmFpbHMuKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEhhbmRsZSBEU0kgZmlyc3QgYml0cwotI2RlZmluZSBTUFNfU1RBUlRfUE9TIDYKLQotICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJTUFNTaXplID0KLSAgICAgICAgICAgICAgICAoIGVuY0hlYWRlci0+cEJ1ZltTUFNfU1RBUlRfUE9TXSA8PCA4KQotICAgICAgICAgICAgICAgICsgZW5jSGVhZGVyLT5wQnVmW1NQU19TVEFSVF9QT1MgKyAxXTsKLSAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9wRW5jb2RlclNQUyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopKGVuY0hlYWRlci0+cEJ1ZikgKyBTUFNfU1RBUlRfUE9TICsgMjsKLQotICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJQUFNTaXplID0KLSAgICAgICAgICAgICAgICAoIGVuY0hlYWRlci0+cEJ1ZltTUFNfU1RBUlRfUE9TICsgMwotICAgICAgICAgICAgICAgICsgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJTUFNTaXplXSA8PCA4KQotICAgICAgICAgICAgICAgICsgZW5jSGVhZGVyLT5wQnVmW1NQU19TVEFSVF9QT1MgKyA0Ci0gICAgICAgICAgICAgICAgKyBwQy0+bV9wSW5zdGFuY2UtPm1fZW5jb2RlclNQU1NpemVdOwotICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX3BFbmNvZGVyUFBTID0gKE00T1NBX1VJbnQ4ICopZW5jSGVhZGVyLT5wQnVmICsgU1BTX1NUQVJUX1BPUyArIDUKLSAgICAgICAgICAgICAgICArIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZTsKLQotICAgICAgICAgICAgLyogQ2hlY2sgdGhlIERTSSBpbnRlZ3JpdHkgKi8KLSAgICAgICAgICAgIGlmKCBlbmNIZWFkZXItPlNpemUgIT0gKHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZQotICAgICAgICAgICAgICAgICsgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJQUFNTaXplICsgNSArIFNQU19TVEFSVF9QT1MpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMygKLSAgICAgICAgICAgICAgICAgICAgIiEhISBNNE1DU19pbnRTdGVwU2V0IEVSUk9SIDogaW52YWxpZCBTUFMgLyBQUFMgJWQgJWQgJWQiLAotICAgICAgICAgICAgICAgICAgICBlbmNIZWFkZXItPlNpemUsIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJQUFNTaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIGF1ZGlvIHByb2Nlc3NpbmcgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHdyaXRlciAqLwotICAgIGVyciA9IE00TUNTX2ludFByZXBhcmVXcml0ZXIocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBTZXQoKTogTTRNQ1NfaW50UHJlcGFyZVdyaXRlcigpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBKdW1wIHRoZSBhdWRpbyBzdHJlYW0gdG8gdGhlIGJlZ2luIGN1dCB0aW1lIChhbGwgQVVzIGFyZSBSQVApCi0gICAgKiBNdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIDNncHAgd3JpdGVyIGluaXQsIGJlY2F1c2UgaXQgbWF5IHdyaXRlIHRoZSBmaXJzdAotICAgICogYXVkaW8gQVUgaW4gc29tZSBjYXNlcyAqLwotICAgIGVyciA9IE00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYoIDAgPT0gcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICB7Ci0gICAgICAgIHBDLT5kVmlEZWNTdGFydGluZ0N0cyA9IDAuMDsKLSAgICAgICAgLyoqCi0gICAgICAgICogTm8gYmVnaW4gY3V0LCBkbyB0aGUgZW5jb2RpbmcgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX1BST0NFU1NJTkc7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJlbWVtYmVyIHRoYXQgd2UgbXVzdCBzdGFydCB0aGUgZGVjb2RlL2VuY29kZSBwcm9jZXNzIGF0IHRoZSBiZWdpbiBjdXQgdGltZSAqLwotICAgICAgICBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgPSAoTTRPU0FfRG91YmxlKXBDLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBKdW1waW5nICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPSlVNUDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFN0ZXBTZXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcihNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgICBQcmVwYXJlIHRoZSB2aWRlbyBkZWNvZGVyLgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRNQ1NfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVECi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVm9pZCAqZGVjb2RlclVzZXJEYXRhOwotICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIgRmlsdGVyT3B0aW9uOwotCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgZGVjb2RlciwgaWYgaXQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0ICh0byBnZXQgdmlkZW8gcHJvcGVydGllcyBmb3IgZXhhbXBsZSkgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFZpRGVjQ3R4dCApCi0gICAgewotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IHBDLT5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGE7Ci0KLSNlbHNlCi0KLSAgICAgICAgZGVjb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyA/ICovCi0KLSAgICAgICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlKCZwQy0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICZwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcywgcEMtPm1fcFJlYWRlciwKLSAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQsICZwQy0+UmVhZGVyVmlkZW9BVSwgZGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICBpZiggKE00T1NBX1VJbnQzMikoTTRFUlJfREVDT0RFUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCkgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIE91ciBkZWNvZGVyIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggSDI2MyBwcm9maWxlIG90aGVyIHRoYW4gMC4KLSAgICAgICAgICAgICogU28gaXQgcmV0dXJucyB0aGlzIGludGVybmFsIGVycm9yIGNvZGUuCi0gICAgICAgICAgICAqIFdlIHRyYW5zbGF0ZSBpdCB0byBvdXIgb3duIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rSDI2NCA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWx0ZXJPcHRpb24ubV9wRmlsdGVyRnVuY3Rpb24gPQotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopICZNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMDsKLSAgICAgICAgICAgIEZpbHRlck9wdGlvbi5tX3BGaWx0ZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24ocEMtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZGaWx0ZXJPcHRpb24pOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcihNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgICBQcmVwYXJlIHRoZSB2aWRlbyBlbmNvZGVyLgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zIEVuY1BhcmFtczsgLyoqPCBFbmNvZGVyIGFkdmFuY2VkIHBhcmFtZXRlcnMgKi8KLSAgICBNNEVOQ09ERVJfUGFyYW1zIEVuY1BhcmFtczE7Ci0gICAgTTRPU0FfRG91YmxlIGRGcmFtZVJhdGU7ICAgICAgICAgICAgLyoqPCB0bXAgdmFyaWFibGUgKi8KLQotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgaWYoIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCApCi0gICAgewotICAgICAgICAvKiBBcHByb3hpbWF0aXZlIGN0cyBpbmNyZW1lbnQgKi8KLSAgICAgICAgcEMtPmRDdHNJbmNyZW1lbnQgPSAxMDAwLjAgLyBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0KLSAgICAgICAgaWYoIHBDLT51aUJlZ2luQ3V0VGltZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogTnVsbCBlbmNvZGluZywgZG8gbm90aGluZy4iKTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogTnVsbCBlbmNvZGluZywgSS1mcmFtZSBkZWZhdWx0cy4iKTsKLQotICAgICAgICAgICAgLyogU2V0IHVzZWZ1bCBwYXJhbWV0ZXJzIHRvIGVuY29kZSB0aGUgZmlyc3QgSS1mcmFtZSAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnZpZGVvUHJvZmlsZSA9IHBDLT5lbmNvZGluZ1ZpZGVvUHJvZmlsZTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy52aWRlb0xldmVsPSBwQy0+ZW5jb2RpbmdWaWRlb0xldmVsOwotCi0gICAgICAgICAgICBzd2l0Y2goIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2NDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcjogdW5rbm93biBlbmNvZGluZyB2aWRlbyBmb3JtYXRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICglZCksIHJldHVybmluZyBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoOwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+dWlFbmNWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkludGVybmFsUmVndWxhdGlvbiA9Ci0gICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7IC8qIGRvIG5vdCBjb25zdHJhaW4gdGhlIEktZnJhbWUgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVJhdGUgPSBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZTsKLQotICAgICAgICAgICAgLyogT3RoZXIgZW5jb2Rpbmcgc2V0dGluZ3MgKHF1aXRlIGFsbCBkdW1teS4uLikgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSA9IDA7ICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlWZXJ0aWNhbFNlYXJjaFJhbmdlID0gMDsgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsgLyogbm8gZXJyb3IgcmVzaWxpZW5jZSAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCA9IDA7ICAgICAgICAgICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aU1vdGlvbkVzdGltYXRpb25Ub29scyA9Ci0gICAgICAgICAgICAgICAgMDsgLyogTTRWX01PVElPTl9FU1RfVE9PTFNfQUxMICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuYkFjUHJlZGljdGlvbiA9IE00T1NBX1RSVUU7ICAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDU7ICAgLyogaW5pdGlhbCBRUCA9IDUgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9Ci0gICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7IC8qIG5vIGRhdGEgcGFydGl0aW9uaW5nICovCi0KLSAgICAgICAgICAgIC8qIFJhdGUgZmFjdG9yICovCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlUaW1lU2NhbGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiBOb3JtYWwgZW5jb2RpbmcsIHNldCBmdWxsIGNvbmZpZy4iKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgZW5jb2RlciBzaGVsbCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBNQ1Mgc2V0dGluZ3MgKi8KLSAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0OwotICAgICAgICBFbmNQYXJhbXMuSW5wdXRGb3JtYXQgPSBNNEVOQ09ERVJfa0lZVVY0MjA7Ci0gICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZW5jb2RpbmdWaWRlb1Byb2ZpbGU7Ci0gICAgICAgIEVuY1BhcmFtcy52aWRlb0xldmVsPSBwQy0+ZW5jb2RpbmdWaWRlb0xldmVsOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFZpZGVvIGZyYW1lIHNpemUgKi8KLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aDsKLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFZpZGVvIGJpdHJhdGUgaGFzIGJlZW4gcHJldmlvdXNseSBjb21wdXRlZCAqLwotICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT51aUVuY1ZpZGVvQml0cmF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBNQ1MgdXNlIHRoZSAidHJ1ZSIgY29yZSBpbnRlcm5hbCBiaXRyYXRlIHJlZ3VsYXRpb24gKi8KLSAgICAgICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPSBNNE9TQV9UUlVFOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKi8KLQotICAgICAgICBFbmNQYXJhbXMudWlIb3Jpem9udGFsU2VhcmNoUmFuZ2UgPSAwOyAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICBFbmNQYXJhbXMudWlWZXJ0aWNhbFNlYXJjaFJhbmdlID0gMDsgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX0ZBTFNFOyAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgICAgIEVuY1BhcmFtcy51aUlWb3BQZXJpb2QgPSAwOyAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgICAgIEVuY1BhcmFtcy51aU1vdGlvbkVzdGltYXRpb25Ub29scyA9Ci0gICAgICAgICAgICAwOyAvKiBNNFZfTU9USU9OX0VTVF9UT09MU19BTEwgKi8KLSAgICAgICAgRW5jUGFyYW1zLmJBY1ByZWRpY3Rpb24gPSBNNE9TQV9UUlVFOyAgICAgLyogdXNlIEFDIHByZWRpY3Rpb24gKi8KLSAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOyAgLyogaW5pdGlhbCBRUCA9IDEwICovCi0gICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9Ci0gICAgICAgICAgICBNNE9TQV9GQUxTRTsgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFZpZGVvIGVuY29kZXIgZnJhbWUgcmF0ZSBhbmQgcmF0ZSBmYWN0b3IgKi8KLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlOwotICAgICAgICBFbmNQYXJhbXMudWlUaW1lU2NhbGUgPSBwQy0+b3V0cHV0VmlkZW9UaW1lc2NhbGU7Ci0KLSAgICAgICAgc3dpdGNoKCBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2s1X0ZQUzoKLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rN181X0ZQUzoKLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gNy41OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTBfRlBTOgotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAxMC4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTJfNV9GUFM6Ci0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDEyLjU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDE1LjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2syMF9GUFM6IC8qKjwgTVBFRy00IG9ubHkgKi8KLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gMjAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazI1X0ZQUzogLyoqPCBNUEVHLTQgb25seSAqLwotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAyNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMzBfRlBTOgotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAzMC4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcjogdW5rbm93biBlbmNvZGluZyB2aWRlbyBmcmFtZSByYXRlXAotICAgICAgICAgICAgICAgICAgICAoMHgleCksIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHR3byBmcmFtZXMgKi8KLSAgICAgICAgaWYoIE00RU5DT0RFUl9rSDI2MyA9PSBFbmNQYXJhbXMuRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmRDdHNJbmNyZW1lbnQgPSAxMDAxLjAgLyBkRnJhbWVSYXRlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyoqPCBNUEVHNCBvciBILjI2NCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZEN0c0luY3JlbWVudCA9IDEwMDAuMCAvIGRGcmFtZVJhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaW1pdCB0aGUgdmlkZW8gYml0cmF0ZSBhY2NvcmRpbmcgdG8gZW5jb2RlciBwcm9maWxlCi0gICAgICogYW5kIGxldmVsICovCi0gICAgZXJyID0gTTRNQ1NfaW50TGltaXRCaXRyYXRlUGVyQ29kZWNQcm9maWxlTGV2ZWwoJkVuY1BhcmFtcyk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IGxpbWl0IGJpdHJhdGUgcmV0dXJuZWQgZXJyIFwKLSAgICAgICAgICAgICAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB2aWRlbyBlbmNvZGVyICovCi0gICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCgmcEMtPnBWaUVuY0N0eHQsCi0gICAgICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMsIFwKLSAgICAgICAgTTRNQ1NfaW50QXBwbHlWUFAsIHBDLCBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSwgXAotICAgICAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSk7Ci0KLSAgICAvKio8IFdlIHB1dCB0aGUgTUNTIGNvbnRleHQgaW4gcGxhY2Ugb2YgdGhlIFZQUCBjb250ZXh0ICovCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IEVuY29kZXJJbnQtPnBGY3RJbml0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlckNsb3NlZDsKLQotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0gKQotICAgICAgICAvL2lmKChNNEVOQ09ERVJfa05VTEwgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpCi0gICAgICAgIC8vICAgICYmIChNNFZJREVPRURJVElOR19rSDI2NCA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpKQotICAgIHsKLSAgICAgICAgRW5jUGFyYW1zMS5JbnB1dEZvcm1hdCA9IEVuY1BhcmFtcy5JbnB1dEZvcm1hdDsKLSAgICAgICAgLy9FbmNQYXJhbXMxLklucHV0RnJhbWVXaWR0aCA9IEVuY1BhcmFtcy5JbnB1dEZyYW1lV2lkdGg7Ci0gICAgICAgIC8vRW5jUGFyYW1zMS5JbnB1dEZyYW1lSGVpZ2h0ID0gRW5jUGFyYW1zLklucHV0RnJhbWVIZWlnaHQ7Ci0gICAgICAgIEVuY1BhcmFtczEuRnJhbWVXaWR0aCA9IEVuY1BhcmFtcy5GcmFtZVdpZHRoOwotICAgICAgICBFbmNQYXJhbXMxLkZyYW1lSGVpZ2h0ID0gRW5jUGFyYW1zLkZyYW1lSGVpZ2h0OwotICAgICAgICBFbmNQYXJhbXMxLnZpZGVvUHJvZmlsZT0gRW5jUGFyYW1zLnZpZGVvUHJvZmlsZTsKLSAgICAgICAgRW5jUGFyYW1zMS52aWRlb0xldmVsPSBFbmNQYXJhbXMudmlkZW9MZXZlbDsKLSAgICAgICAgRW5jUGFyYW1zMS5CaXRyYXRlID0gRW5jUGFyYW1zLkJpdHJhdGU7Ci0gICAgICAgIEVuY1BhcmFtczEuRnJhbWVSYXRlID0gRW5jUGFyYW1zLkZyYW1lUmF0ZTsKLSAgICAgICAgRW5jUGFyYW1zMS5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7IC8vRW5jUGFyYW1zLkZvcm1hdDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIm1jcyBlbmNvZGVyIG9wZW4gcHJvZmlsZSA6JWQsIGxldmVsICVkIiwKLSAgICAgICAgICAgIEVuY1BhcmFtczEudmlkZW9Qcm9maWxlLCBFbmNQYXJhbXMxLnZpZGVvTGV2ZWwpOwotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5wVmlFbmNDdHh0LAotICAgICAgICAgICAgJnBDLT5Xcml0ZXJWaWRlb0FVLCAmRW5jUGFyYW1zMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJtY3MgZW5jb2RlciBvcGVuIEFkdiBwcm9maWxlIDolZCwgbGV2ZWwgJWQiLAotICAgICAgICAgICAgRW5jUGFyYW1zLnZpZGVvUHJvZmlsZSwgRW5jUGFyYW1zLnZpZGVvTGV2ZWwpOwotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5wVmlFbmNDdHh0LAotICAgICAgICAgICAgJnBDLT5Xcml0ZXJWaWRlb0FVLCAmRW5jUGFyYW1zKTsKLSAgICB9Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcjogRW5jb2RlckludC0+cEZjdE9wZW4gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tFbmNvZGVyU3RvcHBlZDsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0KHBDLT5wVmlFbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcjogRW5jb2RlckludC0+cEZjdFN0YXJ0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa0VuY29kZXJSdW5uaW5nOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBWaWRlbyByZXNpemUgbWFuYWdlbWVudCAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqCi0gICAgKiBDb21wYXJlIHZpZGVvIGlucHV0IHNpemUgYW5kIHZpZGVvIG91dHB1dCBzaXplIHRvIGNoZWNrIGlmIHJlc2l6ZSBpcyBuZWVkZWQgKi8KLSAgICBpZiggKCAoTTRPU0FfVUludDMyKUVuY1BhcmFtcy5GcmFtZVdpZHRoCi0gICAgICAgICE9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9XaWR0aCkKLSAgICAgICAgfHwgKChNNE9TQV9VSW50MzIpRW5jUGFyYW1zLkZyYW1lSGVpZ2h0Ci0gICAgICAgICE9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRoZSBpbnRlcm1lZGlhdGUgdmlkZW8gcGxhbmUgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIGRlY29kZWQgaW1hZ2UgYmVmb3JlCi0gICAgICAgICByZXNpemluZyAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lID0KLSAgICAgICAgICAgIChNNFZJRklfSW1hZ2VQbGFuZSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzICogc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKLSAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wUHJlUmVzaXplRnJhbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRoZSBZIHBsYW5lICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoID0gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICBtX3ZpZGVvV2lkdGg7IC8qKjwgaW5wdXQgd2lkdGggKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCA9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgbV92aWRlb0hlaWdodDsgLyoqPCBpbnB1dCBoZWlnaHQgKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X3N0cmlkZSA9IHBDLT4KLSAgICAgICAgICAgIHBQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOyAvKio8IHNpbXBsZSBjYXNlOiBzdHJpZGUgZXF1YWxzIHdpZHRoICovCi0KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgXAotICAgICAgICAgICAgKnBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQsIE00TUNTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTpcCi0gICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgdGhlIFUgcGxhbmUgKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGggPSBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgKLSAgICAgICAgICAgID4+IDE7IC8qKjwgVSB3aWR0aCBpcyBoYWxmIHRoZSBZIHdpZHRoICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQgPSBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0Ci0gICAgICAgICAgICA+PiAxOyAvKio8IFUgaGVpZ2h0IGlzIGhhbGYgdGhlIFkgaGVpZ2h0ICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0udV9zdHJpZGUgPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsgLyoqPCBzaW1wbGUgY2FzZTogc3RyaWRlIGVxdWFscyB3aWR0aCAqLwotCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPQotICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlIFwKLSAgICAgICAgICAgICpwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0LCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6XAotICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgdGhlIFYgcGxhbmUgKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGggPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsgLyoqPCBWIHdpZHRoIGVxdWFscyBVIHdpZHRoICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQgPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQ7IC8qKjwgViBoZWlnaHQgZXF1YWxzIFUgaGVpZ2h0ICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0udV9zdHJpZGUgPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMl0udV93aWR0aDsgLyoqPCBzaW1wbGUgY2FzZTogc3RyaWRlIGVxdWFscyB3aWR0aCAqLwotCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPQotICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfc3RyaWRlIFwKLSAgICAgICAgICAgICpwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfaGVpZ2h0LCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6XAotICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgUHJlcGFyZSB0aGUgQUFDIGRlY29kZXIsIHRoZSBTUkMgYW5kIHRoZSBBTVItTkIgZW5jb2RlciBhbmQgdGhlIE1QMyBlbmNvZGVyLgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBTU1JDX1JldHVyblN0YXR1c19lbgotICAgICAgICBSZXR1cm5TdGF0dXM7IC8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX0lOVDE2IE5yU2FtcGxlc01pbiA9Ci0gICAgICAgIDA7IC8qIE1pbmltYWwgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGlucHV0IG9yIG9uIHRoZSBvdXRwdXQgKi8KLSAgICBMVk1fSU5UMzIgU2NyYXRjaFNpemU7IC8qIFRoZSBzaXplIG9mIHRoZSBzY3JhdGNoIG1lbW9yeSAgICAgICAgICAgICAgICovCi0gICAgTFZNX0lOVDE2Ci0gICAgICAgICpwSW5wdXRJblNjcmF0Y2g7IC8qIFBvaW50ZXIgdG8gaW5wdXQgaW4gdGhlIHNjcmF0Y2ggYnVmZmVyICAgICAgICovCi0gICAgTFZNX0lOVDE2Ci0gICAgICAgICpwT3V0cHV0SW5TY3JhdGNoOyAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgaW4gdGhlIHNjcmF0Y2ggYnVmZmVyICAqLwotICAgIFNTUkNfUGFyYW1zX3Qgc3NyY1BhcmFtczsgICAgICAgICAgLyogTWVtb3J5IGZvciBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBNQ1NfRFVNUF9QQ01fVE9fRklMRQotCi0gICAgZmlsZV9hdV9yZWFkZXIgPSBmb3BlbigibWNzX1JlYWRlck91dHB1dC5yYXciLCAid2IiKTsKLSAgICBmaWxlX3BjbV9kZWNvZGVyID0gZm9wZW4oIm1jc19EZWNvZGVyT3V0cHV0LnBjbSIsICJ3YiIpOwotICAgIGZpbGVfcGNtX2VuY29kZXIgPSBmb3BlbigibWNzX0VuY29kZXJJbnB1dC5wY20iLCAid2IiKTsKLQotI2VuZGlmCi0KLSAgICBpZiggcEMtPm5vYXVkaW8gKQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQXVkaW9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoKTogTnVsbCBlbmNvZGluZywgZG8gbm90aGluZy4iKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBDcmVhdGUgYW5kICJzdGFydCIgdGhlIGRlY29kZXIgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5tX3BBdWRpb0RlY29kZXIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZygpOiBGYWlscyB0byBpbml0aWF0ZSB0aGUgYXVkaW8gZGVjb2Rlci4iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT19DT05WRVJTSU9OX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cEF1ZGlvRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygmcEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLCBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tBTVJfTkIgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkgewotICAgICAgICAvKiBBTVIgREVDT0RFUiBDT05GSUdVUkFUSU9OICovCi0KLSAgICAgICAgLyogbm90aGluZyBzcGVjaWZpYyB0byBkbyAqLwotICAgIH0KLSAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rRVZSQyA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKSB7Ci0gICAgICAgIC8qIEVWUkMgREVDT0RFUiBDT05GSUdVUkFUSU9OICovCi0KLSAgICAgICAgLyogbm90aGluZyBzcGVjaWZpYyB0byBkbyAqLwotICAgIH0KLSAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rTVAzID09IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApIHsKLSAgICAgICAgLyogTVAzIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogQUFDIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotICAgICAgICBNNF9BYWNEZWNvZGVyQ29uZmlnIEFhY0RlY1BhcmFtOwotCi0gICAgICAgIEFhY0RlY1BhcmFtLm1fQUFDRGVjb2RlclByb2ZpbGUgPSBBQUNfa0FBQzsKLSAgICAgICAgQWFjRGVjUGFyYW0ubV9Eb3duU2FtcGxpbmdNb2RlID0gQUFDX2tEU19PRkY7Ci0KLSAgICAgICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBTVJOQiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFhY0RlY1BhcmFtLm1fT3V0cHV0TW9kZSA9IEFBQ19rTW9ubzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZvciB0aGlzIHZlcnNpb24sIHdlIGVuY29kZSBvbmx5IGluIEFBQyAqLwotICAgICAgICAgICAgaWYoIE00RU5DT0RFUl9rTW9ubyA9PSBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQWFjRGVjUGFyYW0ubV9PdXRwdXRNb2RlID0gQUFDX2tNb25vOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFhY0RlY1BhcmFtLm1fT3V0cHV0TW9kZSA9IEFBQ19rU3RlcmVvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMocEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9Vc2VyUGFyYW0sIChNNE9TQV9EYXRhT3B0aW9uKSAmQWFjRGVjUGFyYW0pOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF8zZ3BSZWFkZXJJbnRlcmZhY2UsIChNNE9TQV9EYXRhT3B0aW9uKSBwQy0+bV9wUmVhZGVyRGF0YUl0KTsKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9BdWRpb0FVLCAoTTRPU0FfRGF0YU9wdGlvbikgJnBDLT5SZWFkZXJBdWRpb0FVKTsKLQotICAgIGlmKCBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgLyogTm90IGltcGxlbWVudGVkIGluIGFsbCBkZWNvZGVycyAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA9Ci0gICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLQotICAgIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aURlY29kZWRQY21TaXplID4gMCApCi0gICAgewotICAgICAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemU7Ci0gICAgICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSBcCi0gICAgICAgICAgICAqc2l6ZW9mKHNob3J0KSwgTTRNQ1MsIChNNE9TQV9DaGFyICopIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKTpcCi0gICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIEF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgU2V0IHRoZSBTU1JDIHBhcmFtZXRlcnMgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgc3dpdGNoKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICB7Ci0gICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU184MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxMTAyNToKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18xMTAyNTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMTIwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzE2MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMjQwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzMyMDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU180NDEwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfNDgwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXI6IGludmFsaWQgaW5wdXQgQUFDIHNhbXBsaW5nIGZyZXF1ZW5jeSAoJWQgSHopLFwKLSAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1kiLAotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1k7Ci0gICAgfQotCi0gICAgaWYoIDEgPT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzICkKLSAgICB7Ci0gICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fTU9OTzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3NyY1BhcmFtcy5TU1JDX05yT2ZDaGFubmVscyA9IExWTV9TVEVSRU87Ci0gICAgfQotCi0gICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0FBQwotICAgICAgICB8fCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rTVAzICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2s4MDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU184MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTEwMjVIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzExMDI1OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTIwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzEyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTYwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzE2MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjIwNTBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzIyMDUwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjQwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzI0MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMzIwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzMyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rNDQxMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzQ0MTAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rNDgwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZzogaW52YWxpZCBvdXRwdXQgQUFDIHNhbXBsaW5nIGZyZXF1ZW5jeSBcCi0gICAgICAgICAgICAgICAgICAgICglZCBIeiksIHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1k7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU184MDAwOwotICAgIH0KLQotCi0KLSAgICBSZXR1cm5TdGF0dXMgPSAwOwotCi0gICAgc3dpdGNoKCBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gKQotICAgIHsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAzMjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xMTAyNToKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA0NDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA2NDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18yMjA1MDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA4ODI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18yNDAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA5NjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18zMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAxMjgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfNDQxMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMTc2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9IDE5MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgUmV0dXJuU3RhdHVzID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2goIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgKQotICAgIHsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDQ0MTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzEyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gNjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDg4MjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzI0MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSA5NjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18zMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMTI4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzQ0MTAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAxNzY0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfNDgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDE5MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgUmV0dXJuU3RhdHVzID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLQotCi0gICAgaWYoIFJldHVyblN0YXR1cyAhPSBTU1JDX09LICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3Npbmc6XAotICAgICAgICAgICAgIEVycm9yIGNvZGUgJWQgcmV0dXJuZWQgYnkgdGhlIFNTUkNfR2V0TnJTYW1wbGVzIGZ1bmN0aW9uIiwKLSAgICAgICAgICAgIFJldHVyblN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgTnJTYW1wbGVzTWluID0KLSAgICAgICAgKExWTV9JTlQxNikoKHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPiBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCkKLSAgICAgICAgPyBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA6IHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4pOwotCi0gICAgd2hpbGUoIE5yU2FtcGxlc01pbiA8IE00TUNTX1NTUkNfTUlOQkxPQ0tTSVpFICkKLSAgICB7IC8qIERvbid0IHRha2UgYmxvY2tzIHNtYWxsZXIgdGhhdCB0aGUgbWluaW1hbCBibG9jayBzaXplICovCi0gICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc0luIDw8IDEpOwotICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IChMVk1fSU5UMTYpKHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0IDw8IDEpOwotICAgICAgICBOclNhbXBsZXNNaW4gPSAoTFZNX0lOVDE2KShOclNhbXBsZXNNaW4gPDwgMSk7Ci0gICAgfQotCi0KLSAgICBwQy0+aVNzcmNOYlNhbXBsSW4gPSAoTFZNX0lOVDE2KSgKLSAgICAgICAgc3NyY1BhcmFtcy4KLSAgICAgICAgTnJTYW1wbGVzSW4pOyAvKiBtdWx0aXBsaWNhdGlvbiBieSBOck9mQ2hhbm5lbHMgaXMgZG9uZSBiZWxvdyAqLwotICAgIHBDLT5pU3NyY05iU2FtcGxPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCk7Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIGlucHV0IG9mIHRoZSBTU1JDICovCi0gICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkgXAotICAgICAgICAqcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzLCBNNE1DUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJJbiIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcigpOlwKLSAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbiwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBTU1JDICovCi0gICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSBcCi0gICAgICAgICpwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMsIE00TUNTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlck91dCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVyT3V0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKTpcCi0gICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVyT3V0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotCi0gICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyID0gTFZBdWRpb1Jlc2FtcGxlckNyZWF0ZSgKLSAgICAgICAgMTYsIC8qZ0lucHV0UGFyYW1zLmx2QlRDaGFubmVsQ291bnQqLwotICAgICAgICAoTTRPU0FfSW50MTYpcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzLypzc3JjUGFyYW1zLlNTUkNfTnJPZkNoYW5uZWxzKi8sCi0gICAgICAgIChNNE9TQV9JbnQzMikocEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSkvKnNzcmNQYXJhbXMuU1NSQ19Gc19PdXQqLywgMSk7Ci0KLSAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKQotICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgIH0KLQotICAgIExWQXVkaW9zZXRTYW1wbGVSYXRlKHBDLT5wTFZBdWRpb1Jlc2FtcGxlciwKLSAgICAgICAgLypnSW5wdXRQYXJhbXMubHZJblNhbXBsZVJhdGUqLwotICAgICAgICAvKnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ki8KLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeS8qc3NyY1BhcmFtcy5TU1JDX0ZzX0luKi8pOwotCi0gICAgTFZBdWRpb3NldFZvbHVtZShwQy0+cExWQXVkaW9SZXNhbXBsZXIsIChNNE9TQV9JbnQxNikoMHgxMDAwIC8qIDB4N2ZmZiAqLyksCi0gICAgICAgIChNNE9TQV9JbnQxNikoMHgxMDAwLyoweDdmZmYqLykpOwotCi0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgSW5pdCB0aGUgYXVkaW8gZW5jb2RlciB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIEluaXRpYWxpc2UgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLQotICAgIGVyciA9IHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZzogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIE9wZW4gdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICBlcnIgPSBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICAmcEMtPkF1ZGlvRW5jUGFyYW1zLCAmcEMtPnBBdWRpb0VuY0RTSSwKLSAgICAgICAgTTRPU0FfTlVMTCAvKiBubyBncmFiYmluZyAqLyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZzogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIHRoZSBpbnB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgc3dpdGNoKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBTVJOQjoKLSAgICAgICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSA9IE00TUNTX1BDTV9BTVJfR1JBTlVMQVJJVFlfU0FNUExFUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgPSBNNE1DU19QQ01fQUFDX0dSQU5VTEFSSVRZX1NBTVBMRVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QMzoKLSAgICAgICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSA9IE00TUNTX1BDTV9NUDNfR1JBTlVMQVJJVFlfU0FNUExFUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYoIE00RU5DT0RFUl9rTW9ubyA9PSBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSApCi0gICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSAqPSBzaXplb2Yoc2hvcnQpOwotICAgIGVsc2UKLSAgICAgICAgcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5ICo9IHNpemVvZihzaG9ydCkgKiAyOwotCi0gICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIgPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSwgTTRNQ1MsCi0gICAgICAgIChNNE9TQV9DaGFyICopInBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyIik7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVdyaXRlcihNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgICBQcmVwYXJlIHRoZSB3cml0ZXIuCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgKElOKSBNQ1MgcHJpdmF0ZSBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUiAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVdyaXRlciggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdWlWZXJzaW9uOyAvKio8IFRvIHdyaXRlIGNvbXBvbmVudCB2ZXJzaW9uIGluIDNncCB3cml0ZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCBwRFNJID0gTTRPU0FfTlVMTDsgLyoqPCBUbyBjcmVhdGUgdGhlIERlY29kZXIgU3BlY2lmaWMgSW5mbyAqLwotICAgIE00U1lTX1N0cmVhbUlEVmFsdWUgb3B0aW9uVmFsdWU7IC8qKjwgRm9yIHRoZSBzZXRvcHRpb24gY2FsbHMgKi8KLSAgICBNNE9TQV9VSW50MzIgVGFyZ2V0ZWRGaWxlU2l6ZTsKLSAgICBNNE9TQV9Cb29sIGJNVUxQUFNTUFMgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogSW5pdCB0aGUgd3JpdGVyICovCi0gICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0T3BlbigmcEMtPnBXcml0ZXJDb250ZXh0LCBwQy0+cE91dHB1dEZpbGUsCi0gICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIsIHBDLT5wVGVtcG9yYXJ5RmlsZSwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogTGluayB0byB0aGUgd3JpdGVyIGNvbnRleHQgaW4gdGhlIHdyaXRlciBpbnRlcmZhY2UgKi8KLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzLT5wV3JpdGVyQ29udGV4dCA9IHBDLT5wV3JpdGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSBwcm9kdWN0IGRlc2NyaXB0aW9uIHN0cmluZyBpbiB0aGUgd3JpdHRlbiBmaWxlICovCi0gICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nLCAoTTRPU0FfRGF0YU9wdGlvbikiTlhQLVNXIDogTUNTICAgICIpOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoIChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkKLSAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOlwKLSAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBwcm9kdWN0IHZlcnNpb24gaW4gdGhlIHdyaXR0ZW4gZmlsZSAqLwotICAgIHVpVmVyc2lvbiA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUFKT1IgKiAxMDAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SICogMTAKLSAgICAgICAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OOwotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24sIChNNE9TQV9EYXRhT3B0aW9uKSAmdWlWZXJzaW9uKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogXAotICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB0aGVyZSBpcyBhIHZpZGVvIGlucHV0LCBhbGxvY2F0ZSBhbmQgZmlsbCB0aGUgdmlkZW8gc3RyZWFtIHN0cnVjdHVyZXMgZm9yIHRoZSB3cml0ZXIgKi8KLSAgICBpZiggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRmlsbCBWaWRlbyBwcm9wZXJ0aWVzIHN0cnVjdHVyZSBmb3IgdGhlIEFkZFN0cmVhbSBtZXRob2QgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5oZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQ7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8ud2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aDsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5mcHMgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiA9Ci0gICAgICAgICAgICBNNE9TQV9OVUxMOyAvKio8IFdpbGwgYmUgdXBkYXRlZCBsYXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5TaXplID0gMDsgLyoqPCBXaWxsIGJlIHVwZGF0ZWQgbGF0ZXIgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBGaWxsIFZpZGVvIHN0cmVhbSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgICAgIHN3aXRjaCggcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rTVBFRzQ6Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rTVBFR180OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tIMjYzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2NDoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tIMjY0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rTlVMTDoKLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa01QRUdfNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tIMjYzOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IGNhc2UgaW5wdXQ9TTRFTkNPREVSX2tOVUxMLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qKjwgSXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYWxyZWFkeSB0ZXN0ZWQgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHVua25vd24gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBWaWRlbyBiaXRyYXRlIHZhbHVlIHdpbGwgYmUgdGhlIHJlYWwgdmFsdWUgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQy0+dWlFbmNWaWRlb0JpdHJhdGU7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5tYXhCaXRyYXRlID0gKE00T1NBX0ludDMyKXBDLT51aUVuY1ZpZGVvQml0cmF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBtb3N0IG90aGVyIHBhcmFtZXRlcnMgYXJlICJkdW1teSIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbUlEID0gTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnRpbWVTY2FsZSA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0ucHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgc2l6ZW9mKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MpOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uZGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKSAmKHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8pOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVwZGF0ZSBFbmNvZGVyIEhlYWRlciBwcm9wZXJ0aWVzIGZvciBWaWRlbyBzdHJlYW0gaWYgbmVlZGVkICovCi0gICAgICAgIGlmKCBNNEVOQ09ERVJfa0gyNjMgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ3JlYXRlcyB0aGUgSDI2MyBEU0kgKi8KLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLlNpemUgPQotICAgICAgICAgICAgICAgIDc7IC8qKjwgSDI2MyBvdXRwdXQgRFNJIGlzIGFsd2F5cyA3IGJ5dGVzICovCi0gICAgICAgICAgICBwRFNJID0gKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg3LCBNNE1DUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAqKSJwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmIChEU0kgSDI2MykiKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcERTSSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVXcml0ZXIoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBEU0kgKEgyNjMpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBWZW5kb3IgaXMgTlhQIFNvZnR3YXJlOiBOLCBYLCBQLCBTLiAqLwotICAgICAgICAgICAgcERTSVswXSA9ICdOJzsKLSAgICAgICAgICAgIHBEU0lbMV0gPSAnWCc7Ci0gICAgICAgICAgICBwRFNJWzJdID0gJ1AnOwotICAgICAgICAgICAgcERTSVszXSA9ICdTJzsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIERlY29kZXIgdmVyc2lvbiBpcyAwICovCi0gICAgICAgICAgICBwRFNJWzRdID0gMDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIExldmVsIGlzIHRoZSBzaXh0aCBieXRlIG9mIHRoZSBEU0kuICovCi0gICAgICAgICAgICBzd2l0Y2goIHBDLT5FbmNvZGluZ1dpZHRoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9TUUNJRl9XaWR0aDoKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9RQ0lGX1dpZHRoOgotICAgICAgICAgICAgICAgICAgICBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPD0gTTRFTkNPREVSX2s2NF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMTVfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAxMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazEyOF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMTVfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSA0NTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazEyOF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAyMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazM4NF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAzMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRFTkNPREVSX2s4MDBfS0JQUy8qMjA0OCovKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSA0MDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX0NJRl9XaWR0aDoKLSAgICAgICAgICAgICAgICAgICAgaWYoICggcEMtPnVpRW5jVmlkZW9CaXRyYXRlIDw9IE00RU5DT0RFUl9rMTI4X0tCUFMpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPD0gTTRFTkNPREVSX2sxNV9GUFMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcERTSVs1XSA9IDIwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoICggcEMtPnVpRW5jVmlkZW9CaXRyYXRlIDw9IE00RU5DT0RFUl9rMzg0X0tCUFMpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPD0gTTRFTkNPREVSX2szMF9GUFMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcERTSVs1XSA9IDMwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoICggcEMtPnVpRW5jVmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICA8PSBNNEVOQ09ERVJfazgwMF9LQlBTLyoyMDQ4Ki8pCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPD0gTTRFTkNPREVSX2szMF9GUFMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcERTSVs1XSA9IDQwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogUHJvZmlsZSBpcyB0aGUgc2V2ZW50aCBieXRlIG9mIHRoZSBEU0kuICovCi0gICAgICAgICAgICBwRFNJWzZdID0gMDsKLQotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiA9IHBEU0k7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRFTkNPREVSX2tOVUxMID09IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSWYgd2UgY29weSB0aGUgc3RyZWFtIGZyb20gdGhlIGlucHV0LCB3ZSBjb3B5IGl0cyBEU0kgKi8KLQotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIuU2l6ZSA9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbzsKLQotICAgICAgICB9Ci0gICAgICAgIC8qIG90aGVyd2lzZSAoTVBFRzQpLCB0aGUgRFNJIHdpbGwgYmUgcmVjb3ZlcmVkIGZyb20gdGhlIGVuY29kZXIgbGF0ZXIgb24uICovCi0KLSAgICAgICAgLyorQ1JMVjY3NzUgLSBILjI2NCBUcmltbWluZyAgKi8KLSAgICAgICAgaWYoIHBDLT5iSDI2NFRyaW0gPT0gTTRPU0FfVFJVRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJNVUxQUFNTUFMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNVUxfUFBTX1NQUywKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmJNVUxQUFNTUFMpOwotCi0gICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOlwKLSAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNVUxfUFBTX1NQUykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qLUNSTFY2Nzc1IC0gSC4yNjQgVHJpbW1pbmcgICovCi0gICAgICAgIC8qKgotICAgICAgICAqIEFkZCB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAmcEMtPldyaXRlclZpZGVvU3RyZWFtKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0odmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVXBkYXRlIEFVIHByb3BlcnRpZXMgZm9yIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5zdHJlYW0gPSAmKHBDLT5Xcml0ZXJWaWRlb1N0cmVhbSk7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuc2l6ZSA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLkNUUyA9IDA7IC8qKiBSZXNldCB0aW1lICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLkRUUyA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSA9IEFVX1JBUDsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvQVUubmJGcmFnID0gMDsgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLmZyYWcgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCB2aWRlbyBBVSBzaXplICovCi0gICAgICAgIG9wdGlvblZhbHVlLnN0cmVhbUlEID0gTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgPSBwQy0+dWlWaWRlb01heEF1U2l6ZTsKLSAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEFVU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa01heEFVU2l6ZSwgdmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IHZpZGVvIGNodW5rIHNpemUgKi8KLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgPSBwQy0+dWlWaWRlb01heENodW5ja1NpemU7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoIChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkKLSAgICAgICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjpcCi0gICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgYW4gYXVkaW8gaW5wdXQsIGFsbG9jYXRlIGFuZCBmaWxsIHRoZSBhdWRpbyBzdHJlYW0gc3RydWN0dXJlcyBmb3IgdGhlIHdyaXRlciAqLwotICAgIGlmKCBwQy0+bm9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zIHN0cmVhbUF1ZGlvSW5mbzsKLQotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJTYW1wbGVzUGVyU2VjID0gMDsgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJCaXRzUGVyU2FtcGxlID0gMDsgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJDaGFubmVscyA9IDE7ICAgICAgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAwOyAvKio8IEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBzaGVsbCwgdGhlIERTSSBpcyB0YWtlbiBpbnRvIGFjY291bnQgaW5zdGVhZCAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEZpbGwgQXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIEFkZFN0cmVhbSBtZXRob2QgKi8KLSAgICAgICAgc3dpdGNoKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0FNUk5COgotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0FBQzoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tBQUM7Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPSBwQy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgb3V0cHV0IGZvcm1hdCovCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rTVAzOgotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa01QMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0F1ZGlvTlVMTDoKLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa01QMzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5tYXhCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0VWUkM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1BDTToKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOdWxsQXVkaW86Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRBdWRpbzoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKio8IEl0IHNob3VsZCBuZXZlciBoYXBwZW4sIGFscmVhZHkgdGVzdGVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBcCi0gICAgICAgICAgICAgICAgICAgIHVua25vd24gZm9ybWF0ICgweCV4KSwgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBNQ1MgcHJvZHVjZXMgb25seSBBTVItTkIgb3V0cHV0ICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0ucHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS50aW1lU2NhbGUgPSBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5OwotCi0gICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQXVkaW9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSWYgd2UgY29weSB0aGUgc3RyZWFtIGZyb20gdGhlIGlucHV0LCB3ZSBjb3B5IGl0cyBEU0kgKi8KLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIuU2l6ZSA9IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5wQXVkaW9FbmNEU0kucEluZm8gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVXNlIHRoZSBEU0kgZ2l2ZW4gYnkgdGhlIGVuY29kZXIgb3BlbigpICovCi0gICAgICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5TaXplID0gcEMtPnBBdWRpb0VuY0RTSS5pbmZvU2l6ZTsKLSAgICAgICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPSBwQy0+cEF1ZGlvRW5jRFNJLnBJbmZvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdyaXRlciB3aWxsIHB1dCBhIGRlZmF1bHQgUGhpbGlwcyBEU0kgKi8KLSAgICAgICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLlNpemUgPSAwOwotICAgICAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIucEJ1ZiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBPdXIgd3JpdGVyIHNoZWxsIGludGVyZmFjZSBpcyBhIGxpdHRsZSB0cmlja3k6IHdlIHB1dCBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zCi0gICAgICAgICBpbiB0aGUgRFNJIHBvaW50ZXIuLi4gKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikgJnN0cmVhbUF1ZGlvSW5mbzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgdGhlIGF1ZGlvIHN0cmVhbSB0byB0aGUgd3JpdGVyICovCi0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAmcEMtPldyaXRlckF1ZGlvU3RyZWFtKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBMaW5rIHRoZSBBVSBhbmQgdGhlIHN0cmVhbSAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zdHJlYW0gPSAmKHBDLT5Xcml0ZXJBdWRpb1N0cmVhbSk7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLkNUUyA9IDA7IC8qKiBSZXNldCB0aW1lICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLkRUUyA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLmF0dHJpYnV0ZSA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLm5iRnJhZyA9IDA7IC8qKiBObyBmcmFnbWVudCAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5mcmFnID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHdyaXRlciBhdWRpbyBtYXggQVUgc2l6ZSAqLwotICAgICAgICAvKiBBcyBtYXggYml0cmF0ZSBpcyBub3cgMzIwa2JwcyBpbnN0ZWFkIG9mIDEyOGticHMsIG1heCBBVQotICAgICAgICAgKiBzaXplIGhhcyB0byBiZSBpbmNyZWFzZWQgYWRhcHQgdGhlIG1heCBBVSBzaXplIGFjY29yZGluZyB0byB0aGUgc3RyZWFtIHR5cGUgYW5kIHRoZQotICAgICAgICAgKiBjaGFubmVscyBudW1iZXJzKi8KLSAgICAgICAgLyogQWZ0ZXIgdGVzdHMsIGEgbWFyZ2luIG9mIDMgaXMgdGFrZW4gKDIgd2FzIG5vdCBlbm91Z2ggYW5kIHJhaXNlcyB0byBtZW1vcnkgb3ZlcndyaXRlKQotICAgICAgICAgKi8KLSAgICAgICAgLy9wQy0+dWlBdWRpb01heEF1U2l6ZSA9IE00TUNTX0FVRElPX01BWF9BVV9TSVpFOwotICAgICAgICBzd2l0Y2goIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gTTRNQ1NfUENNX0FNUl9HUkFOVUxBUklUWV9TQU1QTEVTCi0gICAgICAgICAgICAgICAgICAgICogKCggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKHNob3J0KSkgKyAzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFNZU19rTVAzOgotICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gTTRNQ1NfUENNX01QM19HUkFOVUxBUklUWV9TQU1QTEVTCi0gICAgICAgICAgICAgICAgICAgICogKCggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKHNob3J0KSkgKyAzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gTTRNQ1NfUENNX0FBQ19HUkFOVUxBUklUWV9TQU1QTEVTCi0gICAgICAgICAgICAgICAgICAgICogKCggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKHNob3J0KSkgKyAzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAvKmNhc2UgTTRTWVNfa0VWUkM6Ci0gICAgICAgICAgICAgICAgcEMtPnVpQXVkaW9NYXhBdVNpemUgPSBNNE1DU19QQ01fRVZSQ19HUkFOVUxBUklUWV9TQU1QTEVTKgotICAgICAgICAgICAgICAgICgocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzICogc2l6ZW9mKHNob3J0KSkrMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ki8KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qKjwgSXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYWxyZWFkeSB0ZXN0ZWQgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHVua25vd24gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb25WYWx1ZS5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIG9wdGlvblZhbHVlLnZhbHVlID0gcEMtPnVpQXVkaW9NYXhBdVNpemU7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oYXVkaW8sXAotICAgICAgICAgICAgICAgIE00V1JJVEVSX2tNYXhBVVNpemUpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb25WYWx1ZS52YWx1ZSA9IE00TUNTX0FVRElPX01BWF9DSFVOS19TSVpFOwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKGF1ZGlvLFwKLSAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgKiBTZXQgdGhlIGxpbWl0YXRpb24gc2l6ZSBvZiB0aGUgd3JpdGVyICovCi0gICAgVGFyZ2V0ZWRGaWxlU2l6ZSA9IHBDLT51aU1heEZpbGVTaXplOwotICAgIC8qIGFkZCAxIGtCIG1hcmdpbiAqLwotICAgIGlmKCBUYXJnZXRlZEZpbGVTaXplID4gODE5MiApCi0gICAgICAgIFRhcmdldGVkRmlsZVNpemUgLT0gMTAyNDsKLQotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEZpbGVTaXplLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJlRhcmdldGVkRmlsZVNpemUpOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoIChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkKLSAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvblwKLSAgICAgICAgICAgIChNNFdSSVRFUl9rTWF4RmlsZVNpemUpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENsb3NlIHRoZSBzdHJlYW0gcmVnaXN0ZXJpbmcgaW4gb3JkZXIgdG8gYmUgcmVhZHkgdG8gd3JpdGUgZGF0YSAqLwotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0V3JpdGluZyhwQy0+cFdyaXRlckNvbnRleHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnRXcml0aW5nIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dChNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgICBETyB0aGUgYXVkaW8gYmVnaW4gY3V0LgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlDdHM7Ci0gICAgTTRPU0FfVUludDMyIHVpRnJhbWVTaXplOwotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIGFuIGF1ZGlvIGJlZ2luIGN1dCBpcyBuZWVkZWQgKi8KLSAgICBpZiggKCBNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pIHx8ICgwID09IHBDLT51aUJlZ2luQ3V0VGltZSkgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IgKGEpIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICogSnVtcCBhdCB0aGUgYmVnaW4gY3V0IHRpbWUgKi8KLSAgICBpQ3RzID0gcEMtPnVpQmVnaW5DdXRUaW1lOwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEp1bXAocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sICZpQ3RzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dDogbV9wRmN0SnVtcChBdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmVtZW1iZXIgYXVkaW8gYmVnaW4gY3V0IG9mZnNldCAqLwotICAgIHBDLT5pQXVkaW9DdHNPZmZzZXQgPSBpQ3RzOwotCi0gICAgLyoqCi0gICAgKiBBTVItTkIgJiBFVlJDOiB0aGVyZSBtYXkgYmUgbWFueSBmcmFtZXMgcGVyIEFVLgotICAgICogSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gc2xpY2UgdGhlIGZpcnN0IEFVIHRvIGtlZXAgdGhlIDIwIG1zIGN1dCBwcmVjaXNpb24gKi8KLSAgICBpZiggKCBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgPT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjCi0gICAgICAgID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlIG5leHQgZnJhbWUgQ1RTIGlzIGxvd2VyIHRoYW4gdGhlIGJlZ2luIGN1dCB0aW1lLAotICAgICAgICAqIHdlIG11c3QgcmVhZCB0aGUgQVUgYW5kIHBhcnNlIGl0cyBmcmFtZXMgdG8gcmVhY2ggdGhlCi0gICAgICAgICogbmVhcmVzdCB0byB0aGUgYmVnaW4gY3V0ICovCi0gICAgICAgIGlmKCAoIGlDdHMgKyAyMCkgPCAoTTRPU0FfSW50MzIpcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFJlYWQgdGhlIGZpcnN0IGF1ZGlvIEFVIGFmdGVyIHRoZSBqdW1wICovCi0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoKTogbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoYXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVISBSZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IG5vIGZhdGFsIGVycm9yIGhlcmUsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHB1cnN1ZSAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoKTogbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoQXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogV2hpbGUgdGhlIG5leHQgQVUgaGFzIGEgbG93ZXIgQ1RTIHRoYW4gdGhlIGJlZ2luIGN1dCB0aW1lLCB3ZSBhZHZhbmNlIHRvCi0gICAgICAgICAgICB0aGUgbmV4dCBmcmFtZSAqLwotICAgICAgICAgICAgd2hpbGUoICggaUN0cyArIDIwKSA8PSAoTTRPU0FfSW50MzIpcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpRnJhbWVTaXplID0gTTRNQ1NfaW50R2V0RnJhbWVTaXplX0FNUk5CKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aUZyYW1lU2l6ZSA9IE00TUNTX2ludEdldEZyYW1lU2l6ZV9FVlJDKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpRnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCAwID09IHVpRnJhbWVTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcnJ1cHRlZCBmcmFtZSEgV2UgZ2V0IG91dCBvZiB0aGlzIG1lc3MhCi0gICAgICAgICAgICAgICAgICAgICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBoZXJlLi4uICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldEZyYW1lU2l6ZV94eHggcmV0dXJucyAwISBSZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIE00Tk9fRVJST1I7IC8qKjwgbm8gZmF0YWwgZXJyb3IgaGVyZSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcHVyc3VlICovCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHbyB0byB0aGUgbmV4dCBmcmFtZSAqLwotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MgKz0gdWlGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplIC09IHVpRnJhbWVTaXplOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIENUUyBvZiB0aGUgbmV4dCBmcmFtZSAqLwotICAgICAgICAgICAgICAgIGlDdHMgKz0gMjA7IC8qKjwgQU1SLCBFVlJDIGZyYW1lIGR1cmF0aW9uIGlzIGFsd2F5cyAyMCBtcyAqLwotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTID0gaUN0czsKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX0RUUyA9IGlDdHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVcGRhdGUgdGhlIGF1ZGlvIGJlZ2luIGN1dCBvZmZzZXQgKi8KLSAgICAgICAgICAgIHBDLT5pQXVkaW9DdHNPZmZzZXQgPSBpQ3RzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwRW5jb2RpbmcoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQywgTTRPU0FfVUludDgqIHBQcm9ncmVzcykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFByb2dyZXNzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiB1aUF1ZGlvU3RlcENvdW50ID0gMDsKLQotICAgIC8qIC0tLS0tLS0tLS0gVklERU8gVFJBTlNDT0RJTkcgLS0tLS0tLS0tLSAqLwotCi0gICAgaWYoICggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UpICYmIChNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRAotICAgICAgICA9PSBwQy0+VmlkZW9TdGF0ZSkgKSAvKio8IElmIHRoZSB2aWRlbyBlbmNvZGluZyBpcyBnb2luZyBvbiAqLwotICAgIHsKLSAgICAgICAgaWYoIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKHBDKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcocEMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTm8gbW9yZSBzcGFjZSwgcXVpdCBwcm9wZXJseSAqLwotICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDgpKCggKCAoTTRPU0FfVUludDMyKXBDLT5kVmlEZWNDdXJyZW50Q3RzCi0gICAgICAgICAgICAgICAgLSBwQy0+dWlCZWdpbkN1dFRpbWUpICogMTAwKQotICAgICAgICAgICAgICAgIC8gKHBDLT51aUVuZEN1dFRpbWUgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKTsKLQotICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0ZJTklTSEVEOwotCi0gICAgICAgICAgICAvKiBiYWQgZmlsZSBwcm9kdWNlZCBvbiB2ZXJ5IHNob3J0IDNncCBmaWxlICovCi0gICAgICAgICAgICBpZiggcEMtPmRWaURlY0N1cnJlbnRDdHMgLSBwQy0+dWlCZWdpbkN1dFRpbWUgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogTm90aGluZyBoYXMgYmVlbiBlbmNvZGVkIC0+IGJhZCBwcm9kdWNlZCBmaWxlIC0+IGVycm9yIHJldHVybmVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogdmlkZW8gdHJhbnNjb2RpbmcgcmV0dXJuc1wKLSAgICAgICAgICAgICAgICAgICAgIE00TUNTX0VSUl9PVVRQVVRfRklMRV9TSVpFX1RPT19TTUFMTCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfT1VUUFVUX0ZJTEVfU0laRV9UT09fU01BTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0jaWZuZGVmIE00TUNTX0FVRElPT05MWQotICAgICAgICAgICAgICAgIC8qIGNsZWFuIEFJUiBjb250ZXh0IG5lZWRlZCB0byBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+bV9haXJfY29udGV4dCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogRXJyb3Igd2hlbiBjbGVhbmluZyBBSVI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX0FVRElPT05MWSovCi0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiB2aWRlbyB0cmFuc2NvZGluZyByZXR1cm5zIE00TUNTX0VSUl9OT01PUkVfU1BBQ0UiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX05PTU9SRV9TUEFDRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgVGhlIGlucHV0IHBsYW5lIGlzIG51bGwgYmVjYXVzZSB0aGUgaW5wdXQgaW1hZ2Ugd2lsbCBiZSBvYnRhaW5lZCBieSB0aGUKLSAgICAgICAgVlBQIGZpbHRlciBmcm9tIHRoZSBjb250ZXh0ICovCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiB2aWRlbyB0cmFuc2NvZGluZyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0gQVVESU8gVFJBTlNDT0RJTkcgLS0tLS0tLS0tLSAqLwotCi0gICAgaWYoICggcEMtPm5vYXVkaW8gPT0gTTRPU0FfRkFMU0UpICYmIChNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRAotICAgICAgICA9PSBwQy0+QXVkaW9TdGF0ZSkgKSAvKio8IElmIHRoZXJlIGlzIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgIHsKLSAgICAgICAgd2hpbGUoCi0gICAgICAgICAgICAvKio8IElmIHRoZSB2aWRlbyBlbmNvZGluZyBpcyBydW5uaW5nLCBlbmNvZGUgYXVkaW8gdW50aWwgd2UgcmVhY2ggdmlkZW8gdGltZSAqLwotICAgICAgICAgICAgKCAoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgJiYgKE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEID09IHBDLT5WaWRlb1N0YXRlKQotICAgICAgICAgICAgJiYgKHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICArIHBDLT5tX2F1ZGlvQVVEdXJhdGlvbiA8IHBDLT5SZWFkZXJWaWRlb0FVLm1fQ1RTKSkgfHwKLSAgICAgICAgICAgIC8qKjwgSWYgdGhlIHZpZGVvIGVuY29kaW5nIGlzIG5vdCBydW5uaW5nLCBwZXJmb3JtIDEgc3RlcCBvZiBhdWRpbyBlbmNvZGluZyAqLwotICAgICAgICAgICAgKCggTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQgPT0gcEMtPkF1ZGlvU3RhdGUpCi0gICAgICAgICAgICAmJiAodWlBdWRpb1N0ZXBDb3VudCA8IDEpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQXVkaW9TdGVwQ291bnQrKzsKLQotICAgICAgICAgICAgLyoqPCBjaGVjayBpZiBhbiBhZGlvIGVmZmVjdCBoYXMgdG8gYmUgYXBwbGllZCovCi0gICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRDaGVja0F1ZGlvRWZmZWN0cyhwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQXVkaW9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZyhwQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qKjwgQXVkaW8gdHJhbnNjb2RpbmcgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKHBDKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIE5vIG1vcmUgc3BhY2UsIHF1aXQgcHJvcGVybHkgKi8KLSAgICAgICAgICAgIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoICggKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgICAgICAtIHBDLT51aUJlZ2luQ3V0VGltZSkgKiAxMDApCi0gICAgICAgICAgICAgICAgICAgIC8gKHBDLT51aUVuZEN1dFRpbWUgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKTsKLQotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICAgICAgICAgIC8qIGJhZCBmaWxlIHByb2R1Y2VkIG9uIHZlcnkgc2hvcnQgM2dwIGZpbGUgKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgLSBwQy0+dWlCZWdpbkN1dFRpbWUgPT0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBOb3RoaW5nIGhhcyBiZWVuIGVuY29kZWQgLT4gYmFkIHByb2R1Y2VkIGZpbGUgLT4gZXJyb3IgcmV0dXJuZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHRyYW5zY29kaW5nIHJldHVybnMgTTRNQ1NfRVJSX09VVFBVVF9GSUxFX1NJWkVfVE9PX1NNQUxMIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfT1VUUFVUX0ZJTEVfU0laRV9UT09fU01BTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0jaWZuZGVmIE00TUNTX0FVRElPT05MWQotICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbiBBSVIgY29udGV4dCBuZWVkZWQgdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX2Fpcl9jb250ZXh0ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGNsZWFuaW5nIEFJUjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLypNNE1DU19BVURJT09OTFkqLwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFuc2NvZGluZyByZXR1cm5zIE00TUNTX0VSUl9OT01PUkVfU1BBQ0UiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9OT01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5BdWRpb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IGF1ZGlvIHRyYW5zY29kaW5nIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IGF1ZGlvIHRyYW5zY29kaW5nIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENoZWNrIGZvciBlbmQgY3V0ICovCi0gICAgICAgICAgICAvKiBXZSBhYnNvbHV0ZWx5IHdhbnQgdG8gaGF2ZSBsZXNzIG9yIHNhbWUgYXVkaW8gZHVyYXRpb24gYXMgdmlkZW8gLT4KLSAgICAgICAgICAgICgyKnBDLT5tX2F1ZGlvQVVEdXJhdGlvbikgKi8KLSAgICAgICAgICAgIGlmKCAoTTRPU0FfVUludDMyKXBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgKyAoMiAqcEMtPm1fYXVkaW9BVUR1cmF0aW9uKSA+IHBDLT51aUVuZEN1dFRpbWUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5BdWRpb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogLS0tLS0tLS0tLSBQUk9HUkVTUyBNQU5BR0VNRU5UIC0tLS0tLS0tLS0gKi8KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBwcm9ncmVzcyAqLwotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgPCBwQy0+dWlCZWdpbkN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDgpKCggKCAoTTRPU0FfVUludDMyKXBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgLSBwQy0+dWlCZWdpbkN1dFRpbWUpICogMTAwKQotICAgICAgICAgICAgICAgIC8gKHBDLT51aUVuZEN1dFRpbWUgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKTsKLSAgICAgICAgfQotICAgICAgICAvL3ByaW50ZigiOiAlNi4wZlxiXGJcYlxiXGJcYlxiXGIiLCBwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUyk7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5kVmlEZWNDdXJyZW50Q3RzIDwgcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSgoICggKE00T1NBX1VJbnQzMilwQy0+ZFZpRGVjQ3VycmVudEN0cwotICAgICAgICAgICAgICAgIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSAqIDEwMCkKLSAgICAgICAgICAgICAgICAvIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9wcmludGYoIjogJTYuMGZcYlxiXGJcYlxiXGJcYlxiIiwgcEMtPmRWaURlY0N1cnJlbnRDdHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrICovCi0gICAgaWYoICpwUHJvZ3Jlc3MgPiA5OSApCi0gICAgewotICAgICAgICAqcFByb2dyZXNzID0gOTk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbmNyZW1lbnQgQ1RTIGZvciBuZXh0IHN0ZXAgKi8KLSAgICBpZiggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgKz0gIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyArPSBwQy0+ZEN0c0luY3JlbWVudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogVGhlIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkIHdoZW4gbm8gc3RyZWFtIGlzIGJlaW5nIGVuY29kZWQgYW55bW9yZSAqLwotICAgIGlmKCAoICggcEMtPm5vdmlkZW8pIHx8IChNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQgPT0gcEMtPlZpZGVvU3RhdGUpKQotICAgICAgICAmJiAoKCBwQy0+bm9hdWRpbykgfHwgKE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRCA9PSBwQy0+QXVkaW9TdGF0ZSkpICkKLSAgICB7Ci0gICAgICAgIC8qIHRoZSBBSVIgcGFydCBjYW4gb25seSBiZSB1c2VkIHdoZW4gdmlkZW8gY29kZWNzIGFyZSBjb21waWxlZCovCi0jaWZuZGVmIE00TUNTX0FVRElPT05MWQotICAgICAgICAvKiBjbGVhbiBBSVIgY29udGV4dCBuZWVkZWQgdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX2Fpcl9jb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGNsZWFuaW5nIEFJUjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0jZW5kaWYgLypNNE1DU19BVURJT09OTFkqLwotICAgICAgICAvKiovCi0KLSAgICAgICAgKnBQcm9ncmVzcyA9IDEwMDsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0ZJTklTSEVEOwotICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogdHJhbnNjb2RpbmcgZmluaXNoZWQsIHJldHVybmluZyBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORSIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlDdHM7Ci0KLSAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9ERUNPREU7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICogSnVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGluIHRoZSBjbGlwIChmaXJzdCBnZXQgdGhlIHRpbWUsIHRoZW4ganVtcCkgKi8KLSAgICBpQ3RzID0gKE00T1NBX0ludDMyKXBDLT5kVmlEZWNTdGFydGluZ0N0czsKLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RHZXRQcmV2UmFwVGltZShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgaWYoIE00V0FSX1JFQURFUl9JTkZPUk1BVElPTl9OT1RfUFJFU0VOVCA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgLyogTm8gUkFQIHRhYmxlLCBqdW1wIGJhY2t3YXJkIGFuZCBwcmVkZWNvZGUgKi8KLSAgICAgICAgaUN0cyA9IChNNE9TQV9JbnQzMilwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgLSBNNE1DU19OT19TVFNTX0pVTVBfUE9JTlQ7Ci0KLSAgICAgICAgaWYoIGlDdHMgPCAwICkKLSAgICAgICAgICAgIGlDdHMgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXA6IG1fcEZjdEdldFByZXZSYXBUaW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiArIENSTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAqLwotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJIMjY0VHJpbSApCi0gICAgewotCi0gICAgICAgIC8vIFNhdmUganVtcCB0aW1lIGZvciBzYWZldHksIHRoaXMgZml4IHNob3VsZCBiZSBnZW5lcmljCi0KLSAgICAgICAgTTRPU0FfSW50MzIgaUN0c09yaSA9IGlDdHM7Ci0KLQotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RKdW1wKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXA6IG1fcEZjdEp1bXAoVikgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUxLm1fc3RydWN0U2l6ZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyVmlkZW9BVTEpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSh2aWRlbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUxLm1fc3RydWN0U2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBIMjY0TUNTX1Byb2Nlc3NTUFNfUFBTKHBDLT5tX3BJbnN0YW5jZSwKLSAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKXBDLT5SZWFkZXJWaWRlb0FVMS5tX2RhdGFBZGRyZXNzLCBwQy0+UmVhZGVyVmlkZW9BVTEubV9zaXplKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wOiBIMjY0TUNTX1Byb2Nlc3NTUFNfUFBTIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLyBSZXN0b3JlIGp1bXAgdGltZSBmb3Igc2FmZXR5LCB0aGlzIGZpeCBzaG91bGQgYmUgZ2VuZXJpYwotCi0gICAgICAgIGlDdHMgPSBpQ3RzT3JpOwotCi0KLSAgICB9Ci0gICAgLyogLSBDUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLQotICAgIC8qKgotICAgICogRGVjb2RlIG9uZSBzdGVwICovCi0gICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgPSAoTTRPU0FfRG91YmxlKShpQ3RzICsgcEMtPmlWaWRlb0JlZ2luRGVjSW5jcik7Ci0KLSAgICAvKioKLSAgICAqIEJlIHN1cmUgd2UgZG9uJ3QgZGVjb2RlIHRvbyBmYXIgKi8KLSAgICBpZiggcEMtPmRWaURlY0N1cnJlbnRDdHMgPiBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgKQotICAgIHsKLSAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgPSBwQy0+ZFZpRGVjU3RhcnRpbmdDdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBEZWNvZGUgYXQgbGVhc3Qgb25jZSB3aXRoIHRoZSBiSnVtcCBmbGFnIHRvIHRydWUgKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzOiBEZWNvZGluZyB1cFRvIENUUyAlLjNmIiwKLSAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMpOwotICAgIHBDLT5pc1JlbmRlckR1cCA9IE00T1NBX0ZBTFNFOwotICAgIGVyciA9Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZShwQy0+cFZpRGVjQ3R4dCwgJnBDLT5kVmlEZWNDdXJyZW50Q3RzLAotICAgICAgICBNNE9TQV9UUlVFLCAwKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpCi0gICAgICAgICYmIChlcnIgIT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcDogbV9wRmN0RGVjb2RlIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkRlY29kaW5nIG91dHB1dCB0aGUgc2FtZSBmcmFtZSBhcyBiZWZvcmUgMSIpOwotICAgICAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5jcmVtZW50IGRlY29kaW5nIGN0cyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzICs9IChNNE9TQV9Eb3VibGUpcEMtPmlWaWRlb0JlZ2luRGVjSW5jcjsKLQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCBwQy0+ZFZpRGVjQ3VycmVudEN0cyA+IHBDLT5kVmlEZWNTdGFydGluZ0N0cyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBCZSBzdXJlIHdlIGRvbid0IGRlY29kZSB0b28gZmFyICovCi0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzOwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9ERUNPREU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXAoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0RlY29kZSggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNF9NZWRpYVRpbWUgZERlY1RhcmdldDsKLQotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBEZWNvZGUgKi8KLSAgICBkRGVjVGFyZ2V0ID0gcEMtPmRWaURlY0N1cnJlbnRDdHM7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX2ludFN0ZXBCZWdpbkRlY29kZTogRGVjb2RpbmcgdXBUbyBDVFMgJS4zZiIsCi0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzKTsKLSAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9GQUxTRTsKLSAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUocEMtPnBWaURlY0N0eHQsICZkRGVjVGFyZ2V0LAotICAgICAgICBNNE9TQV9GQUxTRSwgMCk7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKQotICAgICAgICAmJiAoZXJyICE9IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0RlY29kZTogbV9wRmN0RGVjb2RlIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkRlY29kaW5nIG91dHB1dCB0aGUgc2FtZSBmcmFtZSBhcyBiZWZvcmUgMiIpOwotICAgICAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5jcmVtZW50IGRlY29kaW5nIGN0cyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzICs9IChNNE9TQV9Eb3VibGUpcEMtPmlWaWRlb0JlZ2luRGVjSW5jcjsKLQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiwgaWYgbmVlZGVkICovCi0gICAgaWYoICggKE00T1NBX1VJbnQzMilwQy0+ZFZpRGVjQ3VycmVudEN0cyA+IHBDLT5kVmlEZWNTdGFydGluZ0N0cykKLSAgICAgICAgfHwgKE00V0FSX05PX01PUkVfQVUgPT0gZXJyKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBCZSBzdXJlIHdlIGRvbid0IGRlY29kZSB0b28gZmFyICovCi0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gKE00T1NBX0RvdWJsZSlwQy0+ZFZpRGVjU3RhcnRpbmdDdHM7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogZGVmaW5lIEFNUiBzaWxlbmNlIGZyYW1lcyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRSAxMwotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OIDE2MAotCi0jaWZkZWYgTTRWU1MzR1BQX1NJTEVOQ0VfRlJBTUVTCi0KLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhbCi0gICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci0gICAgewotICAgICAgICAweDA0LCAweEZGLCAweDE4LCAweEM3LCAweEYwLCAweDBELCAweDA0LCAweDMzLCAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwCi0gICAgfTsKLSNlbHNlCi0KLWV4dGVybgotY29uc3QKLU00T1NBX1VJbnQ4Ci1NNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4W000VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV07Ci0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBkZWZpbmUgQUFDIHNpbGVuY2UgZnJhbWVzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRSAgICAgIDQKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT1sKLSAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFXSA9Ci0gICAgewotICAgICAgICAweDAwLCAweEM4LCAweDIwLCAweDA3Ci0gICAgfTsKLSNlbHNlCi0KLWV4dGVybiBjb25zdCBNNE9TQV9VSW50OAotTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRV07Ci0KLSNlbmRpZgotCi0jZGVmaW5lIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRSAgICAgICAgNgotCi0jaWZkZWYgTTRWU1MzR1BQX1NJTEVOQ0VfRlJBTUVTCi0KLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9bCi0gICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFXSA9Ci0gICAgewotICAgICAgICAweDIxLCAweDEwLCAweDAzLCAweDIwLCAweDU0LCAweDFDCi0gICAgfTsKLSNlbHNlCi0KLWV4dGVybiBjb25zdAotTTRPU0FfVUludDgKLU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFXTsKLQotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBpZiggcEMtPm5vYXVkaW8gKQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIGlmIGFsbCBhdWRpbyBmcmFtZSBoYXMgYmVlbiB3cml0dGVuIChoYXBwZW5zIGF0IGJlZ2luIGN1dCkgKi8KLSAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplID09IDAgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXcgQVUgaWYgbmVlZGVkICovCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTEubV9zdHJ1Y3RTaXplID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVTEpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MxID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUsCi0gICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopIlRlbXBvcmFyeSBBVTEgYnVmZmVyIik7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+bV9wRGF0YUFkZHJlc3MxID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVMSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KGF1ZGlvKSByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICAvKiBUaGUgYXVkaW8gdHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgKi8KLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShBdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypGQiAyMDA5LjA0LjAyOiBQUiBzdXJueHAjNjE2OiBDcmFzaCBpbiBNQ1Mgd2hpbGUgQXVkaW8gQVUgY29weWluZyAsCi0gICAgICAgICAgICAgY29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlKi8KLSAgICAgICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplCi0gICAgICAgID4gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENvbnN0YW50IG1lbW9yeSByZWFkZXIgY2FzZSwgd2UgbmVlZCB0byByZWFsbG9jYXRlIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyAqLwotICAgICAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YUFkZHJlc3MxKSwgcEMtPlJlYWRlckF1ZGlvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAgICAgLyogcEMtPm1fcERhdGFBZGRyZXNzMSBhbmQKLSAgICAgICAgICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgICAgIC8qIGJlY2F1c2UgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZQotICAgICAgICAgICAgICAgICBtYXhpbXVtIHZhbHVlLiBUaGVuIHRoZSB0ZXN0ICJpZihwQy0+UmVhZGVyQXVkaW9BVT8ubV9tYXhzaXplID4KLSAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplKSIgaXMgbmV2ZXIgdHJ1ZSAqLwotICAgICAgICAgICAgICAgIC8qIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLiAqLwotICAgICAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YUFkZHJlc3MyKSwgcEMtPlJlYWRlckF1ZGlvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAgICAgLyogcEMtPm1fcERhdGFBZGRyZXNzMSBhbmQKLSAgICAgICAgICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUxLm1fbWF4c2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhQWRkcmVzczEsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVTEubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTEubV9zaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTIubV9zdHJ1Y3RTaXplID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVTIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMiA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplLAotICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgQVUgYnVmZmVyIik7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+bV9wRGF0YUFkZHJlc3MyID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIEFVIGluIHRoZSBpbnB1dCBmaWxlICovCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTIubV9DVFMgPiBwQy0+UmVhZGVyQXVkaW9BVTEubV9DVFMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikgJnBDLT5SZWFkZXJBdWRpb0FVLAotICAgICAgICAgICAgICAgICh2b2lkICopICZwQy0+UmVhZGVyQXVkaW9BVTIsIHNpemVvZihNNF9BY2Nlc3NVbml0KSk7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlckF1ZGlvQVUxKTsKLQotICAgICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUKLSAgICAgICAgICAgICAgICA+IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMSksIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qICAgcEMtPm1fcERhdGFBZGRyZXNzMQotICAgICAgICAgICAgICAgICAqIGFuZCBwQy0+bV9wRGF0YUFkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqCi0gICAgICAgICAgICAgICAgICogYmVjYXVzZSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSB0YWtlCi0gICAgICAgICAgICAgICAgICogbWF4aW11bSB2YWx1ZS4gVGhlbiB0aGUgdGVzdCAiaWYocEMtPlJlYWRlckF1ZGlvQVU/Lm1fbWF4c2l6ZSA+Ci0gICAgICAgICAgICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUpIiBpcyBuZXZlciB0cnVlICoKLSAgICAgICAgICAgICAgICAgKiBhbmQgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBidWZmZXIgaXMgbmV2ZXIgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMiksIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgICogcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUKLSAgICAgICAgICAgICAgICAgKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YUFkZHJlc3MxLAotICAgICAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlckF1ZGlvQVUxLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUxLm1fc2l6ZSk7Ci0gICAgICAgICAgICBwQy0+bV9hdWRpb0FVRHVyYXRpb24gPQotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX0NUUyAtIHBDLT5SZWFkZXJBdWRpb0FVMi5tX0NUUzsKLSAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MgPSBwQy0+bV9wRGF0YUFkZHJlc3MyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICZwQy0+UmVhZGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKSAmcEMtPlJlYWRlckF1ZGlvQVUxLCBzaXplb2YoTTRfQWNjZXNzVW5pdCkpOwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVMik7Ci0gICAgICAgICAgICAvKiBDcmFzaCBpbiBNQ1Mgd2hpbGUgQXVkaW8gQVUgY29weWluZyAsCi0gICAgICAgICAgICAgKiBjb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVMi5tX21heHNpemUKLSAgICAgICAgICAgICAgICA+IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMiksIHBDLT5SZWFkZXJBdWRpb0FVMi5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgICogcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUKLSAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplIHRha2UgbWF4aW11bQotICAgICAgICAgICAgICAgICAqIHZhbHVlLiBUaGVuIHRoZSB0ZXN0ICJpZihwQy0+UmVhZGVyQXVkaW9BVT8ubV9tYXhzaXplID4gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICogbV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUpIiBpcyBuZXZlciB0cnVlCi0gICAgICAgICAgICAgICAgICogYW5kIHRoZSBzaXplIG9mIHRoZSBzZWNvbmQgYnVmZmVyIGlzIG5ldmVyIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhQWRkcmVzczEpLCBwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplKTsKLSAgICAgICAgICAgICAgICAvKiBbIEVORCBdIDIwMDkxMDA4ICBKRlYgUFIgZml4IHN1cm54cHN3IzEwNzE6IHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgIHBDLT5tX3BEYXRhQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAgICAgLyogVXBkYXRlIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcERhdGFBZGRyZXNzMiwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVMi5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMi5tX3NpemUpOwotICAgICAgICAgICAgcEMtPm1fYXVkaW9BVUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTIubV9DVFMgLSBwQy0+UmVhZGVyQXVkaW9BVTEubV9DVFM7Ci0gICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gcEMtPm1fcERhdGFBZGRyZXNzMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZygpOiBcCi0gICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KEF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB3cml0ZXIgQVUgKi8KLSAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShBdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT51aUF1ZGlvQVVDb3VudAotICAgICAgICA9PSAwICkgLyogSWYgaXQgaXMgdGhlIGZpcnN0IEFVLCB3ZSBzZXQgaXQgdG8gc2lsZW5jZQotICAgICAgICAoZWxzZSwgZXJyb3JzIDB4Mzg0MSwgMHgzODQ3IGluIG91ciBBQUMgZGVjb2RlcikgKi8KLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0FBQwotICAgICAgICAgICAgfHwgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQUFDcGx1cwotICAgICAgICAgICAgfHwgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PLAotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE11c3QgbmV2ZXIgaGFwcGVuIC4uLiovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZzogQmFkIG51bWJlciBvZiBjaGFubmVscyBpbiBhdWRpbyBpbnB1dCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAodm9pZCAqKU00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDgsCi0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0gICAgICAgICAgICAvKiBTb21lIHJlbWFpbmluZyBBTVIgQVUgbmVlZHMgdG8gYmUgY29waWVkICovCi0gICAgICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBXcml0ZXIgQVUgKi8KLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplICs9IHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikocEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgKyBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUpLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKk1QMyBjYXNlOiBjb3B5IHRoZSBBVSovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogQ29weWluZyBhdWRpbyBBVTogc2l6ZT0lZCIsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplKTsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlckF1ZGlvQVUubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemUpOwotICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDb3B5IGF1ZGlvIGRhdGEgZnJvbSByZWFkZXIgQVUgdG8gd3JpdGVyIEFVICovCi0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IENvcHlpbmcgYXVkaW8gQVU6IHNpemU9JWQiLAotICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemUpOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29udmVydCBDVFMgdW5pdCBmcm9tIG1pbGxpc2Vjb25kcyB0byB0aW1lc2NhbGUgKi8KLSAgICBwQy0+V3JpdGVyQXVkaW9BVS5DVFMgPQotICAgICAgICAoTTRPU0FfVGltZSkoKCggcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgLSBwQy0+aUF1ZGlvQ3RzT2Zmc2V0KQotICAgICAgICAqIChwQy0+V3JpdGVyQXVkaW9TdHJlYW0udGltZVNjYWxlIC8gMTAwMC4wKSkpOwotCi0gICAgaWYoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rQU1SX05CCi0gICAgICAgICYmIHBDLT51aUF1ZGlvQVVDb3VudCA9PSAwICkKLSAgICB7Ci0gICAgICAgIHBDLT5pQXVkaW9DdHNPZmZzZXQgLT0KLSAgICAgICAgICAgIDIwOyAvKiBEdXJhdGlvbiBvZiBhIHNpbGVuY2UgQU1SIEFVLCB0byBoYW5kbGUgdGhlIGR1cmF0aW9uIG9mIHRoZSBhZGRlZAotICAgICAgICAgICAgICAgIHNpbGVuY2UgZnJhbWUgKi8KLSAgICB9Ci0gICAgcEMtPldyaXRlckF1ZGlvQVUubmJGcmFnID0gMDsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogYXVkaW8gQVU6IENUUz0lZCBtcyIsCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLkNUUyk7Ci0KLSAgICAvKioKLSAgICAqIFdyaXRlIGl0IHRvIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgIHBDLT51aUF1ZGlvQVVDb3VudCsrOwotICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPldyaXRlckF1ZGlvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShBdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogQWxsIHRoZSBhdWRpbyBoYXMgYmVlbiB3cml0dGVuICovCi0gICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplID0gMDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgSW5pdCBBdWRpbyBUcmFuc2NvZGluZwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgR2VuZXJhbCBlcnJvciAqLwotCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpQnl0ZXNEZWM7IC8qKjwgTmIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBkZWNvZGVyIE9VVCBidWZmZXIgKi8KLSAgICBNNE9TQV9VSW50MzIKLSAgICAgICAgdWlEZWNvZGVyMlNzcmNfTmJCeXRlczsgLyoqPCBOYiBvZiBieXRlcyBjb3BpZWQgaW50byB0aGUgc3NyYyBJTiBidWZmZXIgKi8KLQotICAgIGludCBzc3JjRXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFcnJvciB3aGlsZSBzc3JjIHByb2Nlc3NpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlTc3JjSW5TaXplOyAvKio8IFNpemUgaW4gYnl0ZXMgb2Ygc3NyYyBpbnRwdXQgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpU3NyY0luUm9vbTsgLyoqPCBOYiBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIHNzcmMgSU4gYnVmZmVyICovCi0gICAgTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgcFNzcmNJbnB1dDsgLyoqPCBQb2ludGVyIHRvIHRoZSBnb29kIGJ1ZmZlciBsb2NhdGlvbiBmb3Igc3NyYyBpbnB1dCAqLwotICAgIE00T1NBX1VJbnQzMiB1aVNzcmNPdXRTaXplOyAvKio8IFNpemUgaW4gYnl0ZXMgb2Ygc3NyYyBvdXRwdXQgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpQnl0ZXNTc3JjOyAvKio8IE5iIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgc3NyYyBPVVQgYnVmZmVyICovCi0KLSAgICBNNE9TQV9VSW50OAotICAgICAgICBuZWVkQ2hhbm5lbENvbnZlcnNpb247IC8qKjwgRmxhZyB0byBpbmRpY2F0ZSBpZiBhIHN0ZXJlbyA8LT4gbW9ubyBjb252ZXJzaW9uIGlzIG5lZWRlZCAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZjsgLyoqPCBNdWx0aXBsaWNhdGl2ZSBjb2VmZmljaWVudCBpZiBzdGVyZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtPiBtb25vIGNvbnZlcnNpb24gaXMgYXBwbGllZCAqLwotICAgIE00T1NBX01lbUFkZHI4IHBDaGFubmVsQ29udmVydG9ySW5wdXQgPQotICAgICAgICBNNE9TQV9OVUxMOyAvKio8IFBvaW50ZXIgdG8gdGhlIGdvb2QgYnVmZmVyIGxvY2F0aW9uIGZvciBjaGFubmVsIGNvbnZlcnRvciBpbnB1dCAqLwotICAgIE00T1NBX1VJbnQzMiB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPQotICAgICAgICAwOyAvKio8IE5iIG9mIHBjbSBzYW1wbGVzIHRvIGNvbnZlcnQgaW4gY2hhbm5lbCBjb252ZXJ0b3IgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCBwQ2hhbm5lbENvbnZlcnRvck91dHB1dCA9Ci0gICAgICAgIE00T1NBX05VTEw7IC8qKjwgUG9pbnRlciB0byB0aGUgZ29vZCBidWZmZXIgbG9jYXRpb24gZm9yIGNoYW5uZWwgY29udmVydG9yIG91dHB1dCAqLwotCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YTsgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCAodGhlbiB3cml0dGVuKSBkYXRhICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpRW5jb2RlckluUm9vbTsgLyoqPCBOYiBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIGVuY29kZXIgSU4gYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpU3NyYzJFbmNvZGVyX05iQnl0ZXM7IC8qKjwgTmIgb2YgYnl0ZXMgY29waWVkIGZyb20gdGhlIHNzcmMgT1VUIGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4Ci0gICAgICAgIHBFbmNvZGVySW5wdXQ7IC8qKjwgUG9pbnRlciB0byB0aGUgZ29vZCBidWZmZXIgbG9jYXRpb24gZm9yIGVuY29kZXIgaW5wdXQgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY0luQnVmZmVyOyAgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAgLyoqPCBFbmNvZGVyIG91dHB1dCBidWZmZXIgZm9yIGFwaSAqLwotCi0gICAgTTRPU0FfSW50MTYgKnRlbXBCdWZmT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAvKkZsQiAyMDA5LjAzLjA0OiBhcHBseSBhdWRpbyBlZmZlY3RzIGlmIGFuIGVmZmVjdCBpcyBhY3RpdmUqLwotICAgIE00T1NBX0ludDggKnBBY3RpdmVFZmZlY3ROdW1iZXIgPSAmKHBDLT5wQWN0aXZlRWZmZWN0TnVtYmVyKTsKLQotICAgIHVpbnQzMl90IGVyckNvZGUgPSBNNE5PX0VSUk9SOwotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IFJFQUQgQU5EIERFQ09ERSB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB0byBlbXB0eSB0aGUgZGVjb2RlciBvdXQgYnVmZmVyIGZpcnN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQb3NJbkRlY0J1ZmZlck91dCApCi0gICAgewotICAgICAgICBnb3RvIG00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZmVlZF9yZXNhbXBsZXI7Ci0gICAgfQotCi0gICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICBNNE9TQV9OVUxMLCAmcEMtPkF1ZGlvRGVjQnVmZmVyT3V0LCBNNE9TQV9GQUxTRSk7Ci0KLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE1DU19EVU1QX1BDTV9UT19GSUxFCi0KLSAgICBmd3JpdGUocEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsIDEsIGZpbGVfcGNtX2RlY29kZXIpOwotCi0jZW5kaWYKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9HZXRBdWRpb0FVRXJyQ29kZSwgKE00T1NBX0RhdGFPcHRpb24pICZlcnJDb2RlKTsKLQotICAgIGlmICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnJDb2RlICkgewotICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyQ29kZTsKLSAgIH0KLQotICAgIC8qIFNldCB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZGVjb2RlciBvdXQgYnVmZmVyICovCi0gICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCA9IHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotCi0gICAgLyogX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgRkVFRCBSRVNBTVBMRVIgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX3wqLwotCi1tNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2ZlZWRfcmVzYW1wbGVyOgotCi0gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB0byBlbXB0eSB0aGUgc3NyYyBvdXQgYnVmZmVyIGZpcnN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgKQotICAgIHsKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX3ByZXBhcmVfaW5wdXRfYnVmZmVyOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgZGVjb2RlciBidWZmZXIgKi8KLSAgICB1aVNzcmNJblNpemUgPSBwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgIHVpQnl0ZXNEZWMgPSAoIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzCi0gICAgICAgICsgcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSkgLSBwQy0+cFBvc0luRGVjQnVmZmVyT3V0OwotCi0gICAgLyogQ2hlY2sgaWYgd2UgY2FuIGZlZWQgZGlyZWN0bHkgdGhlIFNzcmMgd2l0aCB0aGUgZGVjb2RlciBvdXQgYnVmZmVyICovCi0gICAgaWYoICggcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9PSBwQy0+cFNzcmNCdWZmZXJJbikKLSAgICAgICAgJiYgKHVpQnl0ZXNEZWMgPj0gdWlTc3JjSW5TaXplKSApCi0gICAgewotICAgICAgICBwU3NyY0lucHV0ID0gcEMtPnBQb3NJbkRlY0J1ZmZlck91dDsKLQotICAgICAgICAvKiB1cGRhdGUgZGF0YSBjb25zdW1lZCBpbnRvIGRlY29kZXIgYnVmZmVyIGFmdGVyIHJlc2FtcGxpbmcgKi8KLSAgICAgICAgaWYoIHVpQnl0ZXNEZWMgPT0gdWlTc3JjSW5TaXplICkKLSAgICAgICAgICAgIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwQy0+cFBvc0luRGVjQnVmZmVyT3V0ICs9IHVpU3NyY0luU2l6ZTsKLQotICAgICAgICBnb3RvIG00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZG9fcmVzYW1wbGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgcmVtYWluaW5nIHNwYWNlIGluIFNzcmMgYnVmZmVyIGluICovCi0gICAgdWlTc3JjSW5Sb29tID0gKCBwQy0+cFNzcmNCdWZmZXJJbiArIHVpU3NyY0luU2l6ZSkgLSBwQy0+cFBvc0luU3NyY0J1ZmZlckluOwotCi0gICAgLyoqCi0gICAgKiBOYiBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIG1pbmltdW0gYmV0d2VlbiBuYiBvZiBieXRlcyByZW1haW5pbmcgaW4KLSAgICAqIGRlY29kZXIgb3V0IGJ1ZmZlciBhbmQgc3BhY2UgcmVtYWluaW5nIGluIHNzcmMgaW4gYnVmZmVyICovCi0gICAgdWlEZWNvZGVyMlNzcmNfTmJCeXRlcyA9Ci0gICAgICAgICh1aVNzcmNJblJvb20gPCB1aUJ5dGVzRGVjKSA/IHVpU3NyY0luUm9vbSA6IHVpQnl0ZXNEZWM7Ci0KLSAgICAvKioKLSAgICAqIENvcHkgZnJvbSB0aGUgZGVjb2RlciBvdXQgYnVmZmVyIGludG8gdGhlIFNzcmMgaW4gYnVmZmVyICovCi0gICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJJbiwgKHZvaWQgKilwQy0+cFBvc0luRGVjQnVmZmVyT3V0LAotICAgICAgICB1aURlY29kZXIyU3NyY19OYkJ5dGVzKTsKLQotICAgIC8qKgotICAgICogVXBkYXRlIHRoZSBwb3NpdGlvbiBpbiB0aGUgZGVjb2RlciBvdXQgYnVmZmVyICovCi0gICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCArPSB1aURlY29kZXIyU3NyY19OYkJ5dGVzOwotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgdGhlIHBvc2l0aW9uIGluIHRoZSBTc3JjIGluIGJ1ZmZlciAqLwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gKz0gdWlEZWNvZGVyMlNzcmNfTmJCeXRlczsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgdGhlIGRlY29kZXIgYnVmZmVyIG91dCBpcyBlbXB0eSAqLwotICAgIGlmKCAoIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgLSBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcykKLSAgICAgICAgPT0gKE00T1NBX0ludDMyKXBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgIHsKLSAgICAgICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgdGhlIFNzcmMgaW4gYnVmZmVyIGlzIHJlYWR5ICg9IGZ1bGwpICovCi0gICAgaWYoICggcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHBDLT5wU3NyY0J1ZmZlckluKQotICAgICAgICA8IChNNE9TQV9JbnQzMil1aVNzcmNJblNpemUgKQotICAgIHsKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuZDsKLSAgICB9Ci0KLSAgICBwU3NyY0lucHV0ID0gcEMtPnBTc3JjQnVmZmVySW47Ci0KLSAgICAvKiB1cGRhdGUgZGF0YSBjb25zdW1lZCBpbnRvIHNzcmMgYnVmZmVyIGluIGFmdGVyIHJlc2FtcGxpbmcgKGVtcHR5KSAqLwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSBwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IERPIFRIRSBSRVNBTVBMSU5HIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19kb19yZXNhbXBsaW5nOgotCi0gICAgLyoqCi0gICAgKiBObyBuZWVkIGZvciBtZW1jb3B5LCB3ZSBjYW4gZmVlZCBTc3JjIGRpcmVjdGx5IHdpdGggdGhlIGRhdGEgaW4gdGhlIGF1ZGlvCi0gICAgZGVjb2RlciBvdXQgYnVmZmVyKi8KLQotICAgIHNzcmNFcnIgPSAwOwotCi0gICAgaWYoIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscyA9PSAxICkKLSAgICB7Ci0gICAgICAgIHRlbXBCdWZmT3V0ID0KLSAgICAgICAgICAgIChzaG9ydCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiAyCi0gICAgICAgICAgICAqICgoKnBDKS5JbnB1dEZpbGVQcm9wZXJ0aWVzKS51aU5iQ2hhbm5lbHMpLAotICAgICAgICAgICAgTTRWU1MzR1BQLChNNE9TQV9DaGFyICopICJ0ZW1wQnVmZk91dCIpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKil0ZW1wQnVmZk91dCwgMCwocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiAyCi0gICAgICAgICAgICAqICgoKnBDKS5JbnB1dEZpbGVQcm9wZXJ0aWVzKS51aU5iQ2hhbm5lbHMpKTsKLQotICAgICAgICBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eSgoc2hvcnQgKil0ZW1wQnVmZk91dCwgKHNob3J0ICopcFNzcmNJbnB1dCwKLSAgICAgICAgICAgIHBDLT5pU3NyY05iU2FtcGxPdXQsIHBDLT5wTFZBdWRpb1Jlc2FtcGxlcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlck91dCwgMCwgKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAqICgoKnBDKS5JbnB1dEZpbGVQcm9wZXJ0aWVzKS51aU5iQ2hhbm5lbHMpKTsKLQotICAgICAgICBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eSgoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAoc2hvcnQgKilwU3NyY0lucHV0LCBwQy0+aVNzcmNOYlNhbXBsT3V0LCBwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgIH0KLQotICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSApCi0gICAgewotICAgICAgICBGcm9tMmlUb01vbm9fMTYoKHNob3J0ICopdGVtcEJ1ZmZPdXQsIChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgIChzaG9ydClwQy0+aVNzcmNOYlNhbXBsT3V0KTsKLSAgICAgICAgZnJlZSh0ZW1wQnVmZk91dCk7Ci0gICAgfQotCi0KLSAgICBpZiggMCAhPSBzc3JjRXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2Rpbmc6IFNTUkNfUHJvY2VzcyByZXR1cm5zIDB4JXgsIFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQiLAotICAgICAgICAgICAgc3NyY0Vycik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgPSBwQy0+cFNzcmNCdWZmZXJPdXQ7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBQUkVQQVJFIElOUFVUIEJVRkZFUiB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19ffCovCi0KLW00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfcHJlcGFyZV9pbnB1dF9idWZmZXI6Ci0KLSAgICAvKiBTZXQgdGhlIGZsYWcgZm9yIGNoYW5uZWwgY29udmVyc2lvbiByZXF1aXJlbWVudCAqLwotICAgIGlmKCAoIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgJiYgKHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscyA9PSAyKSApCi0gICAgewotICAgICAgICBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPSAxOwotICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiA9IDQ7Ci0gICAgfQotICAgIGVsc2UgaWYoICggcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPT0gTTRFTkNPREVSX2tTdGVyZW8pCi0gICAgICAgICYmIChwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSkgKQotICAgIHsKLSAgICAgICAgbmVlZENoYW5uZWxDb252ZXJzaW9uID0gMjsKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yQ29lZmYgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPSAwOwotICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiA9IDI7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBTc3JjIGJ1ZmZlciAqLwotICAgIHVpU3NyY091dFNpemUgPSBwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KQotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLSAgICB1aUJ5dGVzU3NyYyA9Ci0gICAgICAgICggcEMtPnBTc3JjQnVmZmVyT3V0ICsgdWlTc3JjT3V0U2l6ZSkgLSBwQy0+cFBvc0luU3NyY0J1ZmZlck91dDsKLQotICAgIC8qIENoZWNrIGlmIHRoZSBzc3JjIGJ1ZmZlciBpcyBmdWxsICovCi0gICAgaWYoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID09IHBDLT5wU3NyY0J1ZmZlck91dCApCi0gICAgewotICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzID0KLSAgICAgICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSAqIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmIC8gMjsKLQotICAgICAgICAvKiBDaGVjayBpZiB3ZSBjYW4gZmVlZCBkaXJlY3RseSB0aGUgZW5jb2RlciB3aXRoIHRoZSBzc3JjIG91dCBidWZmZXIgKi8KLSAgICAgICAgaWYoICggcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgJiYgKHVpQnl0ZXNTc3JjID49IHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMpICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogdXBkYXRlIHBvc2l0aW9uIGluIHNzcmMgb3V0IGJ1ZmZlciBhZnRlciBlbmNvZGluZyAqLwotICAgICAgICAgICAgaWYoIHVpQnl0ZXNTc3JjID09IHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMgKQotICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzOwotCi0gICAgICAgICAgICAvKiBtYXJrIHRoZSBlbmNvZGVyIGJ1ZmZlciByZWFkeSAoPSBmdWxsKSAqLwotICAgICAgICAgICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIgKyBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHk7Ci0KLSAgICAgICAgICAgIGlmKCBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjaGFubmVsIGNvbnZlcnRvciB3cml0ZXMgZGlyZWN0bHkgaW50byBlbmNvZGVyIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNvZGVySW5wdXQgPSBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlcjsKLQotICAgICAgICAgICAgICAgIHBDaGFubmVsQ29udmVydG9ySW5wdXQgPSBwQy0+cFNzcmNCdWZmZXJPdXQ7Ci0gICAgICAgICAgICAgICAgcENoYW5uZWxDb252ZXJ0b3JPdXRwdXQgPSBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlcjsKLSAgICAgICAgICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPQotICAgICAgICAgICAgICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzIC8gc2l6ZW9mKHNob3J0KTsKLQotICAgICAgICAgICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19jaGFubmVsX2NvbnZlcnRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBlbmNvZGUgZGlyZWN0bHkgZnJvbSBzc3JjIG91dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBwRW5jb2RlcklucHV0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotCi0gICAgICAgICAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuY29kZV9hbmRfd3JpdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgcmVtYWluaW5nIHNwYWNlIGluIGVuY29kZXIgYnVmZmVyIGluICovCi0gICAgaWYoIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyID0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXI7Ci0gICAgfQotCi0gICAgdWlFbmNvZGVySW5Sb29tID0gKCBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciArIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSkKLSAgICAgICAgLSBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyOwotICAgIHBFbmNvZGVySW5wdXQgPSBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlcjsKLQotICAgIC8qKgotICAgICogTmIgb2YgYnl0ZXMgY29waWVkIGlzIHRoZSBtaW5pbXVtIGJldHdlZW4gbmIgb2YgYnl0ZXMgcmVtYWluaW5nIGluCi0gICAgKiBkZWNvZGVyIG91dCBidWZmZXIgYW5kIHNwYWNlIHJlbWFpbmluZyBpbiBzc3JjIGluIGJ1ZmZlciAqLwotICAgIHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMgPQotICAgICAgICAoKCB1aUVuY29kZXJJblJvb20gKiB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiAvIDIpIDwgdWlCeXRlc1NzcmMpCi0gICAgICAgID8gKHVpRW5jb2RlckluUm9vbSAqIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmIC8gMikgOiB1aUJ5dGVzU3NyYzsKLQotICAgIGlmKCBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICB7Ci0gICAgICAgIC8qIGNoYW5uZWwgY29udmVydG9yIHdyaXRlcyBkaXJlY3RseSBpbnRvIGVuY29kZXIgYnVmZmVyICovCi0gICAgICAgIHBDaGFubmVsQ29udmVydG9ySW5wdXQgPSBwQy0+cFBvc0luU3NyY0J1ZmZlck91dDsKLSAgICAgICAgcENoYW5uZWxDb252ZXJ0b3JPdXRwdXQgPSBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyOwotICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzIC8gc2l6ZW9mKHNob3J0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogY29weSBmcm9tIHRoZSBzc3JjIG91dCBidWZmZXIgaW50byB0aGUgZW5jb2RlciBpbiBidWZmZXIgKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciwgKHZvaWQgKilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgIHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMpOwotICAgIH0KLQotICAgIC8qIFVwZGF0ZSBwb3NpdGlvbiBpbiBzc3JjIG91dCBidWZmZXIgYWZ0ZXIgZW5jb2RpbmcgKi8KLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzOwotCi0gICAgLyogVXBkYXRlIHRoZSBwb3NpdGlvbiBpbiB0aGUgZW5jb2RlciBpbiBidWZmZXIgKi8KLSAgICBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyICs9Ci0gICAgICAgIHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMgKiAyIC8gdWlDaGFubmVsQ29udmVydG9yQ29lZmY7Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgc3NyYyBidWZmZXIgb3V0IGlzIGVtcHR5ICovCi0gICAgaWYoICggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQpCi0gICAgICAgID09IChNNE9TQV9JbnQzMil1aVNzcmNPdXRTaXplICkKLSAgICB7Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBnbyB0byBuZXh0IHN0YXRlbWVudCAqLwotICAgIGlmKCBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2NoYW5uZWxfY29udmVydG9yOwotICAgIGVsc2UKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuY29kZV9hbmRfd3JpdGU7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IFNURVJFTyA8LT4gTU9OTyB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi1tNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2NoYW5uZWxfY29udmVydG9yOgotCi0gICAgLyogY29udmVydCB0aGUgaW5wdXQgcGNtIHN0cmVhbSB0byBtb25vIG9yIHRvIHN0ZXJlbyAqLwotICAgIHN3aXRjaCggbmVlZENoYW5uZWxDb252ZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIGNhc2UgMTogLyogc3RlcmVvIHRvIG1vbm8gKi8KLSAgICAgICAgICAgIEZyb20yaVRvTW9ub18xNigoc2hvcnQgKilwQ2hhbm5lbENvbnZlcnRvcklucHV0LAotICAgICAgICAgICAgICAgIChzaG9ydCAqKXBDaGFubmVsQ29udmVydG9yT3V0cHV0LAotICAgICAgICAgICAgICAgIChzaG9ydCkodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzIC8gMikpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyOiAvKiBtb25vIHRvIHN0ZXJlbyAqLwotICAgICAgICAgICAgTW9ub1RvMklfMTYoKHNob3J0ICopcENoYW5uZWxDb252ZXJ0b3JJbnB1dCwKLSAgICAgICAgICAgICAgICAoc2hvcnQgKilwQ2hhbm5lbENvbnZlcnRvck91dHB1dCwKLSAgICAgICAgICAgICAgICAoc2hvcnQpdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBFTkNPREUgQU5EIFdSSVRFIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX3wqLwotCi1tNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuY29kZV9hbmRfd3JpdGU6Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgZW5jb2RlciBpbiBidWZmZXIgaXMgcmVhZHkgKD0gZnVsbCkgKi8KLSAgICBpZiggKCBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyIC0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIpCi0gICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSApCi0gICAgewotICAgICAgICBnb3RvIG00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZW5kOwotICAgIH0KLQotICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9IHBFbmNvZGVySW5wdXQ7Ci0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHk7Ci0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclsxXSA9IE00T1NBX05VTEw7Ci0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgLyogVGltZSBpbiBtcyBmcm9tIGRhdGEgc2l6ZSwgYmVjYXVzZSBpdCBpcyBQQ00xNiBzYW1wbGVzICovCi0gICAgZnJhbWVUaW1lRGVsdGEgPQotICAgICAgICAoIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICogdWlDaGFubmVsQ29udmVydG9yQ29lZmYgLyAyKQotICAgICAgICAvIHNpemVvZihzaG9ydCkgLyBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHdyaXRlciBBVSAqLwotICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6IHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qRmxCIDIwMDkuMDMuMDQ6IGFwcGx5IGF1ZGlvIGVmZmVjdHMgaWYgYW4gZWZmZWN0IGlzIGFjdGl2ZSovCi0gICAgaWYoICpwQWN0aXZlRWZmZWN0TnVtYmVyID49IDAgJiYgKnBBY3RpdmVFZmZlY3ROdW1iZXIgPCBwQy0+bmJFZmZlY3RzICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+cEVmZmVjdHNbKnBBY3RpdmVFZmZlY3ROdW1iZXJdLkV4dEF1ZGlvRWZmZWN0RmN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzIHBQcm9ncmVzczsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgcFByb2dyZXNzLnVpQ2xpcFRpbWUgPSAoTTRPU0FfVUludDMyKXBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTOwotCi0gICAgICAgICAgICBwUHJvZ3Jlc3MudWlPdXRwdXRUaW1lID0gKCBwQy0+V3JpdGVyQXVkaW9BVS5DVFMgKiAxMDAwKQotICAgICAgICAgICAgICAgIC8gcEMtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZTsKLSAgICAgICAgICAgIHRlbXBQcm9ncmVzcyA9ICggKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgIC0gcEMtPnBFZmZlY3RzWypwQWN0aXZlRWZmZWN0TnVtYmVyXS51aVN0YXJ0VGltZQotICAgICAgICAgICAgICAgIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSAqIDEwMDA7Ci0gICAgICAgICAgICBwUHJvZ3Jlc3MudWlQcm9ncmVzcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikodGVtcFByb2dyZXNzIC8gKE00T1NBX1VJbnQzMilwQy0+cEVmZmVjdHNbCi0gICAgICAgICAgICAgICAgICAgICpwQWN0aXZlRWZmZWN0TnVtYmVyXS51aUR1cmF0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEVmZmVjdHNbKnBBY3RpdmVFZmZlY3ROdW1iZXJdLkV4dEF1ZGlvRWZmZWN0RmN0KAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzWypwQWN0aXZlRWZmZWN0TnVtYmVyXS5wRXh0QXVkaW9FZmZlY3RGY3RDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDE2ICopcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdLCAmcFByb2dyZXNzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBFeHRBdWRpb0VmZmVjdEZjdCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotI2lmZGVmIE1DU19EVU1QX1BDTV9UT19GSUxFCi0KLSAgICBmd3JpdGUocEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSwgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0sIDEsCi0gICAgICAgIGZpbGVfcGNtX2VuY29kZXIpOwotCi0jZW5kaWYKLQotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+Yl9pc1Jhd1dyaXRlciApCi0gICAgewotICAgICAgICAvKiBUaGlzIGFsbG93IHRvIHdyaXRlIFBDTSBkYXRhIHRvIGZpbGUgYW5kIHRvIGVuY29kZSBBTVIgZGF0YSwKLSAgICAgICAgIHdoZW4gb3V0cHV0IGZpbGUgaXMgbm90IFJBVyAqLwotICAgICAgICBpZiggcEMtPnBPdXRwdXRQQ01maWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEMtPnBPdXRwdXRQQ01maWxlLAotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0sIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0gICAgICAgIGVyciA9IHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAocEMtPnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICAgICAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB1cGRhdGUgZGF0YSBjb25zdW1lZCBpbnRvIGVuY29kZXIgYnVmZmVyIGluIGFmdGVyIGVuY29kaW5nIChlbXB0eSkgKi8KLSAgICAgICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IEFVIGN0cyBhbmQgc2l6ZSAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0KLSAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIuCi0gICAgICAgICAgICBwVGFibGVCdWZmZXJTaXplWzBdOyAvKio8IEdldCB0aGUgc2l6ZSBvZiBlbmNvZGVkIGRhdGEgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuQ1RTICs9IGZyYW1lVGltZURlbHRhOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVwZGF0ZSBkdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCBBVSAqLwotICAgICAgICBwQy0+bV9hdWRpb0FVRHVyYXRpb24gPQotICAgICAgICAgICAgKCBmcmFtZVRpbWVEZWx0YSAqIDEwMDApIC8gcEMtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgZW5jb2RlZCBBVSB0byB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgcEMtPnVpQXVkaW9BVUNvdW50Kys7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogdXBkYXRlIGRhdGEgY29uc3VtZWQgaW50byBlbmNvZGVyIGJ1ZmZlciBpbiBhZnRlciBlbmNvZGluZyAoZW1wdHkpICovCi0gICAgICAgIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpCi0gICAgICAgICAgICBwRW5jb2RlcklucHV0OyAvKiB3aWxsIGJlIGNvbnZlcnRlZCBiYWNrIHRvIHU4KiBpbiBmaWxlIHdyaXRlICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHk7Ci0gICAgICAgIHBDLT51aUF1ZGlvQVVDb3VudCsrOwotCi0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBfX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgT05FIFBBU1MgRE9ORSB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmQ6Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKE00T1NBX01lbUFkZHI4KiBhZGRyLCBNNE9TQV9VSW50MzIgbmV3U2l6ZSkKLSAqIFVzZWQgb25seSBpbiBjYXNlIG9mIDNHUCBjb25zdGFudCBtZW1vcnkgcmVhZGVyLCB0byBiZSBhYmxlIHRvIHJlYWxsb2MgdGVtcG9yYXJ5IEFVCi0gKiBiZWNhdXNlIG1heCBBVSBzaXplIGNhbiBiZSByZWV2YWx1YXRlZCBkdXJpbmcgcmVhZGluZwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoIE00T1NBX01lbUFkZHI4ICphZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG5ld1NpemUgKQotewotICAgIGlmKCAqYWRkciAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUoKmFkZHIpOwotICAgICAgICAqYWRkciA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmV3U2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJSZWFsbG9jYXRpb24gb2YgdGVtcG9yYXJ5IEFVIGJ1ZmZlciIpOwotCi0gICAgICAgIGlmKCAqYWRkciA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKiBAYXV0aG9yICAgQWxleGlzIFZhcGlsbG9uIChOWFAgU29mdHdhcmUgVmlzaW9uKQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgLyogRHVyYXRpb24gb2YgdGhlIEFVIChmaW5kIHRoZSBuZXh0IEFVIGR1cmF0aW9uCi0gICAgICogdG8gb2J0YWluIGEgbW9yZSBwcmVjaXNlIHZpZGVvIGVuZCBjdXQpCi0gICAgICovCi0gICAgTTRPU0FfVUludDMyIHZpZGVvQVVEdXJhdGlvbiA9IDA7Ci0KLSAgICBNNE9TQV9NZW1BZGRyOCBXcml0ZWJ1ZmZlckFkZCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50MzIgbGFzdGRlY29kZWRDVFMgPSAwOwotICAgIE00X0FjY2Vzc1VuaXQgbFJlYWRlclZpZGVvQVU7IC8qKjwgUmVhZCB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKiBILjI2NCBUcmltbWluZyAqLwotICAgIGlmKCAoICggcEMtPmJIMjY0VHJpbSA9PSBNNE9TQV9UUlVFKQotICAgICAgICAmJiAocEMtPnVpVmlkZW9BVUNvdW50IDwgcEMtPm1fcEluc3RhbmNlLT5jbGlwX3Nwcy5udW1fcmVmX2ZyYW1lcykKLSAgICAgICAgJiYgKHBDLT51aUJlZ2luQ3V0VGltZSA+IDApKQotICAgICAgICB8fCAoKCBwQy0+dWlWaWRlb0FVQ291bnQgPT0gMCkgJiYgKHBDLT51aUJlZ2luQ3V0VGltZSA+IDApKSApCi0gICAgewotICAgICAgICBlcnIgPSBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKHBDKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIGlmKChwQy0+Ykxhc3REZWNvZGVkRnJhbWVDVFMgPT0gTTRPU0FfRkFMU0UpICYmIChwQy0+dWlCZWdpbkN1dFRpbWUgPiAwKSkKLSAgICB7Ci0gICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXIgZG9lcyBwcmVmZXRjaCwgdGhlIG9uZSBmcmFtZSB3ZSByZXF1ZXN0ZWQgd2lsbCBub3QgYmUgd3JpdHRlbiB1bnRpbAotICAgICAgICAvLyB0aGUgZW5jb2RlciBpcyBjbG9zZWQsIHNvIGRvIGl0IG5vdyByYXRoZXIgdGhhbiBpbiBNQ1NfY2xvc2UKLSAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICB8fCAoTTRNQ1Nfa0VuY29kZXJSdW5uaW5nICE9IHBDLT5lbmNvZGVyU3RhdGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgIiEhISBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyBFUlJPUiA6IE00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcgIgotICAgICAgICAgICAgICAgICJyZXR1cm5zIDB4JVggdy8gZW5jU3RhdGU9JWQiLCBlcnIsIHBDLT5lbmNvZGVyU3RhdGUpOwotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogU3RvcCBhbmQgY2xvc2UgdGhlIGVuY29kZXIgbm93IHRvIGZsdXNoIHRoZSBmcmFtZSAocHJlZmV0Y2gpICovCi0gICAgICAgIGlmKCBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wKHBDLT5wVmlFbmNDdHh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIiEhISBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyBFUlJPUiA6IGVuY29kZXIgc3RvcCByZXR1cm5zIDB4JVgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tFbmNvZGVyU3RvcHBlZDsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UocEMtPnBWaUVuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICIhISEgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcgRVJST1IgOiBlbmNvZGVyIGNsb3NlIHJldHVybnMgMHglWCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tFbmNvZGVyQ2xvc2VkOwotICAgIH0KLQotCi0gICAgaWYgKChwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwpCi0gICAgICAgICYmIChwQy0+Ykxhc3REZWNvZGVkRnJhbWVDVFMgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICYmIChwQy0+dWlCZWdpbkN1dFRpbWUgPiAwKSkgewotCi0gICAgICAgIHBDLT5iTGFzdERlY29kZWRGcmFtZUNUUyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbihwQy0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfQVZDTGFzdERlY29kZWRGcmFtZUNUUywgJmxhc3RkZWNvZGVkQ1RTKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZzogbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb24gcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRG8gbm90IG5lZWQgdmlkZW8gZGVjb2RlciBhbnkgbW9yZSwgbmVlZCB0byBkZXN0cm95IGl0LiBPdGhlcndpc2UgaXQKLSAgICAgICAgICogd2lsbCBjYWxsIHJlYWRlciBmdW5jdGlvbiB3aGljaCB3aWxsIGNhdXNlIGZyYW1lIGxvc3QgZHVyaW5nIHRyaW1pbmcsCi0gICAgICAgICAqIHNpbmNlIHRoZSAzZ3AgcmVhZGVyIGlzIHNoYXJlZCBiZXR3ZWVuIE1DUyBhbmQgZGVjb2Rlci4qLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cFZpRGVjQ3R4dCkgewotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVzdHJveShwQy0+cFZpRGVjQ3R4dCk7Ci0gICAgICAgICAgICBwQy0+cFZpRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2Rpbmc6IGRlY29kZXIgcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0SnVtcChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sICZsYXN0ZGVjb2RlZENUUyk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2Rpbmc6IG1fcEZjdEp1bXAoVikgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwgJmxSZWFkZXJWaWRlb0FVKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZzptX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdCh2aWRlbylcCi0gICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLCAmbFJlYWRlclZpZGVvQVUpOwotCi0gICAgICAgIGlmIChNNFdBUl9OT19NT1JFX0FVID09IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSh2aWRlbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAvKiBUaGUgYXVkaW8gdHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgKi8KLSAgICAgICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIiMjIyBbVFNfQ0hFQ0tdIE00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nICB2aWRlbyBBVSBDVFM6ICVkICIsCi0gICAgICAgICAgICBsUmVhZGVyVmlkZW9BVS5tX0NUUyk7Ci0KLQotICAgIH0KLQotCi0gICAgcEMtPmJMYXN0RGVjb2RlZEZyYW1lQ1RTID0gTTRPU0FfVFJVRTsKLQotCi0gICAgLyogRmluZCB0aGUgbmV4dCBBVSBkdXJhdGlvbiB0byBvYnRhaW4gYSBtb3JlIHByZWNpc2UgdmlkZW8gZW5kIGN1dCovCi0gICAgLyoqCi0gICAgKiBJbml0aWFsaXplcyBhIG5ldyBBVSBpZiBuZWVkZWQgKi8KLQotICAgIGlmIChwQy0+UmVhZGVyVmlkZW9BVTEubV9zdHJ1Y3RTaXplID09IDApIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICZwQy0+UmVhZGVyVmlkZW9BVTEpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplLCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlRlbXBvcmFyeSB2aWRlbyBBVTEgYnVmZmVyIik7Ci0KLSAgICAgICAgaWYgKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICZwQy0+UmVhZGVyVmlkZW9BVTEpOwotCi0gICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pXAotICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplCi0gICAgICAgICAgICA+IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlLCB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIHRlbXBvcmFyeSBidWZmZXJzICovCi0gICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEpLCBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplKTsKLSAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMQotICAgICAgICAgICAgYW5kIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgIC8qIGJlY2F1c2UgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZSBtYXhpbXVtIHZhbHVlLgotICAgICAgICAgICAgIFRoZW4gdGhlIHRlc3QgImlmKHBDLT5SZWFkZXJWaWRlb0FVPy5tX21heHNpemUgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSkiIGlzIG5ldmVyIHRydWUgKi8KLSAgICAgICAgICAgIC8qIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLiAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyKSwgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgYW5kCi0gICAgICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSwKLSAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlclZpZGVvQVUxLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9zaXplKTsKLSAgICB9Ci0KLSAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUyLm1fc3RydWN0U2l6ZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplLCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlRlbXBvcmFyeSB2aWRlbyBBVSBidWZmZXIiKTsKLQotICAgICAgICBpZiggcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogUmVhZCB0aGUgbmV4dCB2aWRlbyBBVSBpbiB0aGUgaW5wdXQgZmlsZSAqLwotICAgIGlmKCBwQy0+UmVhZGVyVmlkZW9BVTIubV9DVFMgPiBwQy0+UmVhZGVyVmlkZW9BVTEubV9DVFMgKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopICZwQy0+UmVhZGVyVmlkZW9BVSwKLSAgICAgICAgICAgICh2b2lkICopICZwQy0+UmVhZGVyVmlkZW9BVTIsIHNpemVvZihNNF9BY2Nlc3NVbml0KSk7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZQotICAgICAgICAgICAgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvbnN0YW50IG1lbW9yeSByZWFkZXIgY2FzZSwgd2UgbmVlZCB0byByZWFsbG9jYXRlIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxKSwgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgLyogYmVjYXVzZSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSB0YWtlIG1heGltdW0gdmFsdWUuCi0gICAgICAgICAgICAgVGhlbiB0aGUgdGVzdCAiaWYocEMtPlJlYWRlclZpZGVvQVU/Lm1fbWF4c2l6ZSA+IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplKSIgaXMgbmV2ZXIgdHJ1ZSAqLwotICAgICAgICAgICAgLyogYW5kIHRoZSBzaXplIG9mIHRoZSBzZWNvbmQgYnVmZmVyIGlzIG5ldmVyIGNoYW5nZWQuICovCi0gICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIpLCBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplKTsKLSAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSBhbmQKLSAgICAgICAgICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgIC8qIFVwZGF0ZSBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgPQotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVMS5tX21heHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxLAotICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyVmlkZW9BVTEubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVMS5tX3NpemUpOwotICAgICAgICB2aWRlb0FVRHVyYXRpb24gPSBwQy0+UmVhZGVyVmlkZW9BVTEubV9DVFMgLSBwQy0+UmVhZGVyVmlkZW9BVTIubV9DVFM7Ci0gICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MgPSBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKSAmcEMtPlJlYWRlclZpZGVvQVUsCi0gICAgICAgICAgICAodm9pZCAqKSAmcEMtPlJlYWRlclZpZGVvQVUxLCBzaXplb2YoTTRfQWNjZXNzVW5pdCkpOwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLAotICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVMik7Ci0KLSAgICAgICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVMi5tX21heHNpemUKLSAgICAgICAgICAgID4gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiksIHBDLT5SZWFkZXJWaWRlb0FVMi5tX21heHNpemUpOwotICAgICAgICAgICAgLyogcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxIGFuZAotICAgICAgICAgICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgIC8qIGJlY2F1c2UgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZSBtYXhpbXVtIHZhbHVlLgotICAgICAgICAgICAgIFRoZW4gdGhlIHRlc3QgImlmKHBDLT5SZWFkZXJWaWRlb0FVPy5tX21heHNpemUgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSkiIGlzIG5ldmVyIHRydWUgKi8KLSAgICAgICAgICAgIC8qIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLiAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxKSwgcEMtPlJlYWRlclZpZGVvQVUyLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgYW5kCi0gICAgICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiwKLSAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlclZpZGVvQVUyLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTIubV9zaXplKTsKLSAgICAgICAgdmlkZW9BVUR1cmF0aW9uID0gcEMtPlJlYWRlclZpZGVvQVUyLm1fQ1RTIC0gcEMtPlJlYWRlclZpZGVvQVUxLm1fQ1RTOwotICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzID0gcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxOwotICAgIH0KLQotICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSh2aWRlbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgIC8qIFRoZSB2aWRlbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoVmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBQcmVwYXJlIHRoZSB3cml0ZXIgQVUgKi8KLSAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJWaWRlb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShWaWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENvcHkgdmlkZW8gZGF0YSBmcm9tIHJlYWRlciBBVSB0byB3cml0ZXIgQVUgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiBDb3B5aW5nIHZpZGVvIEFVOiBzaXplPSVkIiwKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUpOwotICAgICAgICAgICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+SDI2NE1DU1RlbXBCdWZmZXJTaXplCi0gICAgICAgICAgICAgICAgICAgIDwgKHBDLT5SZWFkZXJWaWRlb0FVLm1fc2l6ZSArIDIwNDgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5SZWFkZXJWaWRlb0FVLm1fc2l6ZSArIDIwNDgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+SDI2NE1DU1RlbXBCdWZmZXIgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPkgyNjRNQ1NUZW1wQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikicEMtPkgyNjRNQ1NUZW1wQnVmZmVyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlckRhdGFTaXplID0gcEMtPkgyNjRNQ1NUZW1wQnVmZmVyU2l6ZTsKLQotICAgICAgICAgICAgICAgIGVyciA9IEgyNjRNQ1NfUHJvY2Vzc05BTFUocEMtPm1fcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUsIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyICopJnBDLT5IMjY0TUNTVGVtcEJ1ZmZlckRhdGFTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwQy0+bV9wSW5zdGFuY2UtPmlzX2RvbmUgPT0gMSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE1DU19jb252ZXRGcm9tQnl0ZVN0cmVhbXRvTkFMU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcyAsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcyArIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplIC0gNCk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLnNpemUgPSBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUgLSA0OwotICAgICAgICAgICAgICAgICAgICBXcml0ZWJ1ZmZlckFkZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPkgyNjRNQ1NUZW1wQnVmZmVyICsgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZSAtIDQpOwotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPkgyNjRNQ1NUZW1wQnVmZmVyRGF0YVNpemUgLSA0OwotICAgICAgICAgICAgICAgICAgICBXcml0ZWJ1ZmZlckFkZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogSC4yNjQgVHJpbW1pbmcgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUpOwotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLnNpemUgPSBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ29udmVydCBDVFMgdW5pdCBmcm9tIG1pbGxpc2Vjb25kcyB0byB0aW1lc2NhbGUgKi8KLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLkNUUyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1RpbWUpKCgoIHBDLT5SZWFkZXJWaWRlb0FVLm1fQ1RTIC0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzKQotICAgICAgICAgICAgICAgICogKHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS50aW1lU2NhbGUgLyAxMDAwLjApKSk7Ci0gICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5uYkZyYWcgPSAwOwotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuYXR0cmlidXRlID0gcEMtPlJlYWRlclZpZGVvQVUubV9hdHRyaWJ1dGU7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiB2aWRlbyBBVTogQ1RTPSVkIG1zIiwKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5DVFMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFdyaXRlIGl0IHRvIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICBwQy0+dWlWaWRlb0FVQ291bnQrKzsKLSAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNE1DU19XUklURVJfVklERU9fU1RSRUFNX0lELCAmcEMtPldyaXRlclZpZGVvQVUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoVmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJIMjY0VHJpbSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+bV9wSW5zdGFuY2UtPmlzX2RvbmUgPT0gMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKFdyaXRlYnVmZmVyQWRkIC0gNCksCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MpLCA0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoV3JpdGVidWZmZXJBZGQgLSA0KSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPkgyNjRNQ1NUZW1wQnVmZmVyKSwgNCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLyogSC4yNjQgVHJpbW1pbmcgKi8KLSAgICB9Ci0gICAgLyoqCi0gICAgKiBDaGVjayBmb3IgZW5kIGN1dC4gKi8KLSAgICAvKiBCdWcgZml4IDExLzEyLzIwMDg6IFdlIGFic29sdXRlbHkgd2FudCB0byBoYXZlIGxlc3Mgb3Igc2FtZSB2aWRlbyBkdXJhdGlvbiAtPgotICAgICgyKnZpZGVvQVVEdXJhdGlvbikgdG8gaGF2ZSBhIG1vcmUgcHJlY2lzZSBlbmQgY3V0Ki8KLSAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUubV9DVFMgKyAoMiAqdmlkZW9BVUR1cmF0aW9uKSA+IHBDLT51aUVuZEN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKiBAYXV0aG9yICAgQWxleGlzIFZhcGlsbG9uIChOWFAgU29mdHdhcmUgVmlzaW9uKQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNF9NZWRpYVRpbWUgbXRUcmFuc2NvZGVkVGltZSA9IDAuMDsKLSAgICBNNEVOQ09ERVJfRnJhbWVNb2RlIEZyYW1lTW9kZTsKLSAgICBNNE9TQV9JbnQzMiBkZXJpdmUgPSAwOwotCi0gICAgLyoqCi0gICAgKiBHZXQgdmlkZW8gQ1RTIHRvIGRlY29kZSAqLwotICAgIG10VHJhbnNjb2RlZFRpbWUgPSBwQy0+ZFZpRGVjQ3VycmVudEN0czsKLSAgICBGcmFtZU1vZGUgPSBNNEVOQ09ERVJfa05vcm1hbEZyYW1lOwotCi0gICAgLyoqCi0gICAgKiBEZWNvZGUgdmlkZW8gKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcoKTogQ2FsbGluZyBtX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZSglLjJmKSIsCi0gICAgICAgIG10VHJhbnNjb2RlZFRpbWUpOwotICAgIHBDLT5pc1JlbmRlckR1cCA9IE00T1NBX0ZBTFNFOwotICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZShwQy0+cFZpRGVjQ3R4dCwgJm10VHJhbnNjb2RlZFRpbWUsCi0gICAgICAgIE00T1NBX0ZBTFNFLCAwKTsKLQotICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgewotICAgICAgICBGcmFtZU1vZGUgPQotICAgICAgICAgICAgTTRFTkNPREVSX2tMYXN0RnJhbWU7IC8qKjwgV2Ugd2lsbCBnaXZlIHRoaXMgdmFsdWUgdG8gdGhlIGVuY29kZXIgdG8KLSAgICAgICAgICAgIGFzayBmb3IgdGhlIGVuZCBvZiB0aGUgZW5jb2RpbmcgKi8KLSAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgfQotICAgIGVsc2UgaWYoIGVyciA9PSBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRGVjb2Rpbmcgb3V0cHV0IHRoZSBzYW1lIGZyYW1lIGFzIGJlZm9yZSAzIik7Ci0gICAgICAgIHBDLT5pc1JlbmRlckR1cCA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcoKTogbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgZm9yIGVuZCBjdXQuCi0gICAgKiBXZSBtdXN0IGNoZWNrIGhlcmUgaWYgdGhlIGVuZCBjdXQgaXMgcmVhY2hlZCwgYmVjYXVzZSBpbiB0aGF0IGNhc2Ugd2UgbXVzdAotICAgICogY2FsbCB0aGUgbGFzdCBlbmNvZGUgc3RlcCAoLT4gYkxhc3RGcmFtZSBzZXQgdG8gdHJ1ZSkgKi8KLSAgICBpZiggKCBwQy0+ZFZpRGVjQ3VycmVudEN0cyArIHBDLT5kQ3RzSW5jcmVtZW50ICkgPj0gKHBDLT51aUVuZEN1dFRpbWUKLSAgICAgICAgKyBNNE1DU19BQlMocEMtPmRWaURlY1N0YXJ0aW5nQ3RzIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSkgKQotICAgIHsKLSAgICAgICAgRnJhbWVNb2RlID0KLSAgICAgICAgICAgIE00RU5DT0RFUl9rTGFzdEZyYW1lOyAvKio8IFdlIHdpbGwgZ2l2ZSB0aGlzIHZhbHVlIHRvIHRoZSBlbmNvZGVyIHRvCi0gICAgICAgICAgICBhc2sgZm9yIHRoZSBlbmQgb2YgdGhlIGVuY29kaW5nICovCi0gICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICBkZXJpdmUgPSAoTTRPU0FfSW50MzIpKCggcEMtPmRWaURlY0N1cnJlbnRDdHMgKyBwQy0+ZEN0c0luY3JlbWVudCArIDAuNSkKLSAgICAgICAgICAgIC0gKHBDLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICsgTTRNQ1NfQUJTKHBDLT5kVmlEZWNTdGFydGluZ0N0cyAtIHBDLT51aUJlZ2luQ3V0VGltZSkpKTsKLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgc3RhcnRpbmcgQ1RTIHRvIGhhdmUgYSBtb3JlIHByZWNpc2UgdmFsdWUgKAotICAgIHRoZSBiZWdpbiBjdXQgaXMgbm90IGEgcmVhbCBDVFMpKi8KLSAgICBpZiggcEMtPnVpVmlkZW9BVUNvdW50ID09IDAgKQotICAgIHsKLSAgICAgICAgcEMtPmRWaURlY1N0YXJ0aW5nQ3RzID0gbXRUcmFuc2NvZGVkVGltZTsKLSAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgPSBwQy0+ZFZpRGVjU3RhcnRpbmdDdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBFbmNvZGUgdmlkZW8gKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcoKTogQ2FsbGluZyBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSB3aXRoIHZpZGVvQ3RzXAotICAgICAgICAgPSAlLjJmIixwQy0+UmVhZGVyVmlkZW9BVS5tX0NUUyk7Ci0gICAgcEMtPnVpVmlkZW9BVUNvdW50Kys7Ci0gICAgLyogdXBkYXRlIHRoZSBnaXZlbiBkdXJhdGlvbiAodGhlIGJlZ2luIGN1dCBpcyBub3QgYSByZWFsIENUUykqLwotICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZShwQy0+cFZpRW5jQ3R4dCwgTTRPU0FfTlVMTCwKLSAgICAgICAgKHBDLT5kVmlEZWNDdXJyZW50Q3RzIC0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzIC0gKGRlcml2ZSA+PiAxKSksCi0gICAgICAgIEZyYW1lTW9kZSk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKE00TUNTX0ludGVybmFsQ29udGV4dCogcENvbnRleHQpCi0gKiBAYXV0aG9yICAgRG91bnlhIE1hbmFpIChOWFAgU29mdHdhcmUgVmlzaW9uKQotICogQGJyaWVmICAgIFJldHJpZXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcyBmcm9tIHRoZSBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIERlY0NvbmZJbmZvOwotICAgIE00UkVBREVSXzNHUF9IMjYzUHJvcGVydGllcyBIMjYzcHJvcDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiB2aWRlb0JpdHJhdGU7Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSB2aWRlb1NpemU7Ci0gICAgTTRfQUFDVHlwZSBpQWFjVHlwZSA9IDA7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQywgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczogcEMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCBjb21tb24gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYkFuYWx5c2VkID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuRmlsZVR5cGUgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZlcnNpb25bMF0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZlcnNpb25bMV0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZlcnNpb25bMl0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0gMDsKLQotICAgIG1lbXNldCgodm9pZCAqKSAmcEMtPklucHV0RmlsZVByb3BlcnRpZXMuZnR5cCwKLSAgICAgICAgMCwgc2l6ZW9mKE00VklERU9FRElUSU5HX0Z0eXBCb3gpKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgdmlkZW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb01heEF1U2l6ZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSA9IDAuMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvTGV2ZWwgPQotICAgICAgICBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJNUEVHNGRhdGFQYXJ0aXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iTVBFRzRydmxjID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYk1QRUc0cmVzeW5jaE1hcmtlciA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCBhdWRpbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvTWF4QXVTaXplID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA9IDA7Ci0KLSAgICAvKiBSZXNldCBjb21wYXRpYmlsaXR5IGNoYXJ0IChub3QgdXNlZCBpbiBNQ1MpICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYlZpZGVvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iVmlkZW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVBFRzQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tIMjYzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVW5rbm93bjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkVmlkZW87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpZiBiaXRyYXRlIG5vdCBhdmFpbGFibGUgcmV0cmlldmUgYW4gZXN0aW1hdGlvbiBvZiB0aGUgb3ZlcmFsbCBiaXRyYXRlICovCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0KLSAgICAgICAgaWYoIDAgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlLCAmdmlkZW9CaXRyYXRlKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogd2UgZ2V0IHRoZSBvdmVyYWxsIGJpdHJhdGUsIHN1YnN0cmFjdCB0aGUgYXVkaW8gYml0cmF0ZSBpZiBhbnkgKi8KLSAgICAgICAgICAgICAgICB2aWRlb0JpdHJhdGUgLT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlID0gdmlkZW9CaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUmV0cmlldmUgdGhlIFByb2ZpbGUgJiBMZXZlbCAqLwotICAgICAgICBpZiggKCBNNFZJREVPRURJVElOR19rSDI2MyAhPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpCi0gICAgICAgICAgICAmJiAoTTRWSURFT0VESVRJTkdfa0gyNjQKLSAgICAgICAgICAgICE9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBVc2UgdGhlIERTSSBwYXJzaW5nIGZ1bmN0aW9uIGZyb20gdGhlIGV4dGVybmFsIHZpZGVvIHNoZWxsIGRlY29kZXIuCi0gICAgICAgICAgICBTZWUgdGhlIGNvbW1lbnRzIGluIE00VlNTM0dQUF9DbGlwQW5hbHlzaXMuYywgaXQncyBwcmV0dHkgbXVjaCB0aGUKLSAgICAgICAgICAgIHNhbWUgaXNzdWUuICovCi0KLSAgICAgICAgICAgIGVyciA9IE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJKHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmRGVjQ29uZkluZm8sICZ2aWRlb1NpemUpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJIHJldHVybnMgMHglMDhYIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGggPSB2aWRlb1NpemUubV91aVdpZHRoOwotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV92aWRlb0hlaWdodCA9IHZpZGVvU2l6ZS5tX3VpSGVpZ2h0OwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IERlY0NvbmZJbmZvLnVpVGltZVNjYWxlOwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYk1QRUc0ZGF0YVBhcnRpdGlvbiA9Ci0gICAgICAgICAgICAgICAgRGVjQ29uZkluZm8uYkRhdGFQYXJ0aXRpb247Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iTVBFRzRydmxjID0gRGVjQ29uZkluZm8uYlVzZU9mUlZMQzsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJNUEVHNHJlc3luY2hNYXJrZXIgPQotICAgICAgICAgICAgICAgIERlY0NvbmZJbmZvLnVpVXNlT2ZSZXN5bmNoTWFya2VyOwotCi0gICAgICAgICAgICBlcnIgPSBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChEZWNDb25mSW5mby51aVByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0xldmVsKSk7Ci0gICAgICAgICAgICBpZiAoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICAgICBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rSDI2MyA9PQotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkgewotCi0gICAgICAgICAgICBlcnIgPSBnZXRIMjYzUHJvZmlsZUFuZExldmVsKHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0xldmVsKSk7Ci0gICAgICAgICAgICBpZiAoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICAgICBnZXRIMjYzUHJvZmlsZUFuZExldmVsIHJldHVybnMgMHglMDhYIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogRm9yIGgyNjMgc2V0IGRlZmF1bHQgdGltZXNjYWxlIDogMzAwMDA6MTAwMSAqLwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IDMwMDAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBNNFZJREVPRURJVElOR19rSDI2NCA9PQotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkgewotCi0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlID0gMzAwMDA7Ci0gICAgICAgICAgICBlcnIgPSBnZXRBVkNQcm9maWxlQW5kTGV2ZWwocEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1Byb2ZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgJihwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvTGV2ZWwpKTsKLSAgICAgICAgICAgIGlmICggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMoKTpcCi0gICAgICAgICAgICAgICAgICAgIGdldEFWQ1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEhlcmUgYmVjYXVzZSB3aWR0aCB4IGhlaWdodCBpcyBjb3JyZWN0IG9ubHkgYWZ0ZXIgZHNpIHBhcnNpbmcKLSAgICAgICAgKGRvbmUgaW4gY3JlYXRlIGRlY29kZXIpICovCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV92aWRlb0hlaWdodDsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9XaWR0aDsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbiA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb247Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZBdmVyYWdlRnJhbWVSYXRlID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYXZlcmFnZUZyYW1lUmF0ZTsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb01heEF1U2l6ZSA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZTsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudmlkZW9Sb3RhdGlvbkRlZ3JlZXMgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+dmlkZW9Sb3RhdGlvbkRlZ3JlZXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRWaWRlbzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEF1ZGlvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb01wMzoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYzoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rRVZSQzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVVbmtub3duOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRBdWRpbzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAoIE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvRGVjb2RlcikKLSAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wQXVkaW9EZWNDdHh0KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOiBjYWxsaW5nIENyZWF0ZUF1ZGlvRGVjb2RlciwgdXNlckRhdGE9IDB4JXgiLAotICAgICAgICAgICAgICAgIHBDLT5tX3BDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmJFeHRPTVhBdWREZWNvZGVyICkgewotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzKHBDKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQXVkaW9EZWNDdHh0LCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBBQUMgcHJvcGVydGllcyovCi0gICAgICAgICAgICAgICAgICAgIC8vZ2V0IGZyb20gUmVhZGVyOyB0ZW1wb3JhcnksIHRpbGwgQXVkaW8gZGVjb2RlciBzaGVsbCBBUEkgYXZhaWxhYmxlIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBBQUMgcHJvcGVydGllcwotICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX1N0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmlBYWNUeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBlcnIgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlBYWNUeXBlID0gTTRfa0FBQzsgLy9zZXQgdG8gZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYyByZXR1cm5zIHN0cmVhbVR5cGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlBYWNUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggaUFhY1R5cGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tBQUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVNCUlByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hUFNQcmVzZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeTsgLy9UT0RPCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hUFNQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeTsgLy9UT0RPCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRfa1Vua25vd246Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOiBBQUMgTkJDaGFucz0lZCwgU2FtcGxGcmVxPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXM6XAotICAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL0VWUkMKLSAgICAgICAgaWYoIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogZGVjb2RlciBub3QgaW1wbGVtZW50ZWQgeWV0LCBwcm92aWRlIHNvbWUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBudWxsIGVuY29kaW5nICovCi0gICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDgwMDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBCdWdmaXggUDRNRTAwMDAxMTI4OiBXaXRoIHNvbWUgSU1UQyBmaWxlcywgdGhlIEFNUiBiaXQgcmF0ZSBpcyAwIGticHMgYWNjb3JkaW5nCi0gICAgICAgICB0aGUgR2V0UHJvcGVydGllcyBmdW5jdGlvbiAqLwotICAgICAgICBpZiggMCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tBTVJfTkIKLSAgICAgICAgICAgICAgICA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQmV0dGVyIHJldHVybmluZyBhIGd1ZXNzZWQgMTIuMiBrYnBzIHZhbHVlIHRoYW4gYSBzdXJlLXRvLWJlLWZhbHNlCi0gICAgICAgICAgICAgICAgMCBrYnBzIHZhbHVlISAqLwotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00VklERU9FRElUSU5HX2tFVlJDCi0gICAgICAgICAgICAgICAgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEJldHRlciByZXR1cm5pbmcgYSBndWVzc2VkIDguNSBrYnBzIHZhbHVlIHRoYW4gYSBzdXJlLXRvLWJlLWZhbHNlCi0gICAgICAgICAgICAgICAgMCBrYnBzIHZhbHVlISAqLwotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazlfMl9LQlBTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlQml0cmF0ZTsKLQotICAgICAgICAgICAgICAgIC8qIENhbiBoYXBwZW4gYWxzbyBmb3IgYWFjLCBpbiB0aGlzIGNhc2Ugd2UgY2FsY3VsYXRlIGFuIGFwcHJveGltYXRpdmUgKi8KLSAgICAgICAgICAgICAgICAvKiB2YWx1ZSBmcm9tIGdsb2JhbCBiaXRyYXRlIGFuZCB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmRmlsZUJpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXM6IE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVCaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgIC0gcEMtPgotICAgICAgICAgICAgICAgICAgICBJbnB1dEZpbGVQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgICAgICB1aVZpZGVvQml0cmF0ZSAvKiBub3JtYWxseSBzZXR0ZWQgdG8gMCwgaWYgbm8gdmlkZW8gKi87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbiA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb247Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemU7Ci0KLSAgICAgICAgLyogQnVnOiB3aXRoIGFhYywgdmFsdWUgaXMgMCB1bnRpbCBkZWNvZGVyIHN0YXJ0KCkgaXMgY2FsbGVkICovCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemUgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9ieXRlRnJhbWVMZW5ndGgKLSAgICAgICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAgICAgKiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICAgICAgLyogTmV3IGFhYyBwcm9wZXJ0aWVzICovCi0gICAgICAgIGlmKCBNNERBX1N0cmVhbVR5cGVBdWRpb0FhYwotICAgICAgICAgICAgPT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID0gcEMtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW47Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXE7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM7Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlFeHRlbmRlZFNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYUV4dGVuc2lvblNhbXBGcmVxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcEMtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRBdWRpbzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBHZXQgJ2Z0eXAnIGF0b20gKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveCwgJnBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZ0eXApOwotCi0gICAgLyogQW5hbHlzaXMgaXMgc3VjY2Vzc2Z1bCAqLwotICAgIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uCi0gICAgICAgID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbiApCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0KLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICBlbHNlCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0KLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLQotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkZpbGVUeXBlID0gcEMtPklucHV0RmlsZVR5cGU7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYkFuYWx5c2VkID0gTTRPU0FfVFJVRTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1VJbnQzMiBNNE1DU19pbnRHZXRGcmFtZVNpemVfQU1STkIoTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBBTVIgTmFycm93LUJhbmQgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ3BBdWRpb0ZyYW1lICAgKElOKSBBTVJOQiBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1DU19pbnRHZXRGcmFtZVNpemVfQU1STkIoIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICkKLXsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVUeXBlID0gKCAoICpwQXVkaW9GcmFtZSkgJigweEYgPDwgMykpID4+IDM7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA5NTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNDc1MCBicHMgKi8KLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxMDM7Ci0gICAgICAgICAgICBicmVhazsgLyogIDUxNTAgYnBzICovCi0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTE4OwotICAgICAgICAgICAgYnJlYWs7IC8qICA1OTAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDEzNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNjcwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNDg7Ci0gICAgICAgICAgICBicmVhazsgLyogIDc0MDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTU5OwotICAgICAgICAgICAgYnJlYWs7IC8qICA3OTUwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDIwNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAxMDIwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAyNDQ7Ci0gICAgICAgICAgICBicmVhazsgLyogMTIwMDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMzk7Ci0gICAgICAgICAgICBicmVhazsgLyogU0lEIChTaWxlbmNlKSAqLwotCi0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qIE5vIGRhdGEgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEdldEZyYW1lU2l6ZV9BTVJOQigpOiBDb3JydXB0ZWQgQU1SIGZyYW1lISByZXR1cm5pbmcgMC4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiAoMSArICgoIGZyYW1lU2l6ZSArIDcpIC8gOCkpOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1VJbnQzMiBNNE1DU19pbnRHZXRGcmFtZVNpemVfRVZSQyhNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSkKLSAqIEBicmllZiAgIFJldHVybiB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIEVWUkMgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiAgICAgMCAxIDIgMwotICogICAgKy0rLSstKy0rCi0gKiAgICB8ZnIgdHlwZXwgICAgICAgICAgICAgIFJGQyAzNTU4Ci0gKiAgICArLSstKy0rLSsKLSAqCi0gKiBGcmFtZSBUeXBlOiA0IGJpdHMKLSAqICAgIFRoZSBmcmFtZSB0eXBlIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBkYXRhCi0gKiAgICBmcmFtZSBpbiB0aGUgUlRQIHBhY2tldC4KLSAqCi0gKiBGb3IgRVZSQyBhbmQgU01WIGNvZGVjcywgdGhlIGZyYW1lIHR5cGUgdmFsdWVzIGFuZCBzaXplIG9mIHRoZQotICogYXNzb2NpYXRlZCBjb2RlYyBkYXRhIGZyYW1lIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93OgotICoKLSAqIFZhbHVlICAgUmF0ZSAgICAgIFRvdGFsIGNvZGVjIGRhdGEgZnJhbWUgc2l6ZSAoaW4gb2N0ZXRzKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgIDAgICAgIEJsYW5rICAgICAgMCAgICAoMCBiaXQpCi0gKiAgIDEgICAgIDEvOCAgICAgICAgMiAgICAoMTYgYml0cykKLSAqICAgMiAgICAgMS80ICAgICAgICA1ICAgICg0MCBiaXRzOyBub3QgdmFsaWQgZm9yIEVWUkMpCi0gKiAgIDMgICAgIDEvMiAgICAgICAxMCAgICAoODAgYml0cykKLSAqICAgNCAgICAgMSAgICAgICAgIDIyICAgICgxNzEgYml0czsgNSBwYWRkZWQgYXQgZW5kIHdpdGggemVyb3MpCi0gKiAgIDUgICAgIEVyYXN1cmUgICAgMCAgICAoU0hPVUxEIE5PVCBiZSB0cmFuc21pdHRlZCBieSBzZW5kZXIpCi0gKgotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgRVZSQyBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1DU19pbnRHZXRGcmFtZVNpemVfRVZSQyggTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKQotewotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVR5cGUgPSAoICpwQXVkaW9GcmFtZSkgJjB4MEY7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qICBibGFuayAqLwotCi0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE2OwotICAgICAgICAgICAgYnJlYWs7IC8qICAxLzggKi8KLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA0MDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMS80ICovCi0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgZnJhbWVTaXplID0gODA7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEvMiAqLwotCi0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE3MTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMSAqLwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsgLyogIGVyYXN1cmUgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEdldEZyYW1lU2l6ZV9FVlJDKCk6IENvcnJ1cHRlZCBFVlJDIGZyYW1lISByZXR1cm5pbmcgMC4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiAoMSArICgoIGZyYW1lU2l6ZSArIDcpIC8gOCkpOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja01heEZpbGVTaXplKE00TUNTX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgQ2hlY2sgaWYgbWF4IGZpbGUgc2l6ZSBpcyBncmVhdGVyIGVub3VnaCB0byBlbmNvZGUgYSBmaWxlIHdpdGggdGhlCi0gKiAgICAgICAgICAgY3VycmVudCBzZWxlY3RlZCBiaXRyYXRlcyBhbmQgZHVyYXRpb24uCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUgotICogQHJldHVybiAgIE00TUNTX0VSUl9NQVhGSUxFU0laRV9UT09fU01BTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja01heEZpbGVTaXplKCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9VSW50MzIgZHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIGF1ZGlvYml0cmF0ZTsKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9iaXRyYXRlOwotCi0gICAgLyogZnJlZSBmaWxlIHNpemUgOiBPSyAqLwotICAgIGlmKCBwQy0+dWlNYXhGaWxlU2l6ZSA9PSAwICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKiBkdXJhdGlvbiAqLwotICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID09IDAgKQotICAgIHsKLSAgICAgICAgZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiAtIHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZHVyYXRpb24gPSBwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lOwotICAgIH0KLQotICAgIC8qIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICBpZiggcEMtPm5vYXVkaW8gKQotICAgIHsKLSAgICAgICAgYXVkaW9iaXRyYXRlID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgewotICAgICAgICBhdWRpb2JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tBTVJOQjoKLSAgICAgICAgICAgICAgICBhdWRpb2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIC8vRVZSQwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0VWUkM6Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgYXVkaW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazlfMl9LQlBTOwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKiBBQUMgYW5kIE1QMyovCi0gICAgICAgICAgICAgICAgYXVkaW9iaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgKHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rMTZfS0JQUyA6IE00VklERU9FRElUSU5HX2szMl9LQlBTOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGF1ZGlvYml0cmF0ZSA9IHBDLT51aUF1ZGlvQml0cmF0ZTsKLSAgICB9Ci0KLSAgICAvKiB2aWRlbyBiaXRyYXRlICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICB7Ci0gICAgICAgIHZpZGVvYml0cmF0ZSA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCApCi0gICAgewotICAgICAgICB2aWRlb2JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPnVpVmlkZW9CaXRyYXRlID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICB7Ci0gICAgICAgIHZpZGVvYml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxNl9LQlBTOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2aWRlb2JpdHJhdGUgPSBwQy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgfQotCi0gICAgLyogbWF4IGZpbGUgc2l6ZSAqLwotICAgIGlmKCAoTTRPU0FfVUludDMyKXBDLT51aU1heEZpbGVTaXplCi0gICAgICAgIDwgKE00T1NBX1VJbnQzMikoTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICogKGF1ZGlvYml0cmF0ZSArIHZpZGVvYml0cmF0ZSkgKiAoZHVyYXRpb24gLyA4MDAwLjApKSApCi0gICAgICAgIHJldHVybiBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSURFT0VESVRJTkdfQml0cmF0ZSBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShNNE9TQV9VSW50MzIgZnJlZWJpdHJhdGUsIE00T1NBX0ludDggbW9kZSkKLSAqIEBicmllZiAgICBSZXR1cm5zIHRoZSBjbG9zZXN0IGJpdHJhdGUgdmFsdWUgZnJvbSB0aGUgZW51bSBsaXN0IG9mIHR5cGUgTTRWSURFT0VESVRJTkdfQml0cmF0ZQotICogQHBhcmFtICAgIGZyZWViaXRyYXRlOiB1bnNpZ25lZCBpbnQgdmFsdWUKLSAqIEBwYXJhbSAgICBtb2RlOiAtMTpwcmV2aW91cywwOmN1cnJlbnQsMTpuZXh0Ci0gKiBAcmV0dXJuICAgYml0cmF0ZSB2YWx1ZSBpbiBlbnVtIGxpc3QgTTRWSURFT0VESVRJTkdfQml0cmF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRWSURFT0VESVRJTkdfQml0cmF0ZQotTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoIE00T1NBX0ludDMyIGZyZWViaXRyYXRlLCBNNE9TQV9JbnQ4IG1vZGUgKQotewotICAgIE00T1NBX0ludDMyIGJpdGFycmF5IFtdID0KLSAgICB7Ci0gICAgICAgIDAsIE00VklERU9FRElUSU5HX2sxNl9LQlBTLCBNNFZJREVPRURJVElOR19rMjRfS0JQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFMsIE00VklERU9FRElUSU5HX2s0OF9LQlBTLAotICAgICAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUywgTTRWSURFT0VESVRJTkdfazk2X0tCUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2sxMjhfS0JQUywgTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTLAotICAgICAgICBNNFZJREVPRURJVElOR19rMjU2X0tCUFMsIE00VklERU9FRElUSU5HX2syODhfS0JQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTLCBNNFZJREVPRURJVElOR19rNTEyX0tCUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2s4MDBfS0JQUywgTTRWSURFT0VESVRJTkdfazJfTUJQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazVfTUJQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazhfTUJQUywgLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgIE00T1NBX0lOVDMyX01BWAotICAgIH07Ci0KLSAgICBjb25zdCBNNE9TQV9VSW50MzIgbmJiaXRyYXRlcyA9IDE0OwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgZm9yICggaSA9IDA7IGZyZWViaXRyYXRlID49IGJpdGFycmF5W2ldOyBpKysgKTsKLQotICAgIHN3aXRjaCggbW9kZSApCi0gICAgewotICAgICAgICBjYXNlIC0xOiAvKiBwcmV2aW91cyAqLwotICAgICAgICAgICAgaWYoIGkgPD0gMiApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJpdGFycmF5W2kgLSAyXTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMDogLyogY3VycmVudCAqLwotICAgICAgICAgICAgaWYoIGkgPD0gMSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJpdGFycmF5W2kgLSAxXTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTogLyogbmV4dCAqLwotICAgICAgICAgICAgaWYoIGkgPj0gbmJiaXRyYXRlcyApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00T1NBX0lOVDMyX01BWDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gYml0YXJyYXlbaV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50Q2xlYW5VcF9SZWFkZXJzRGVjb2RlcnMoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgRnJlZSBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBNNE1DU19vcGVuKCkKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50Q2xlYW5VcF9SZWFkZXJzRGVjb2RlcnMoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzIGNhbGxlZCB3aXRoIHBDPTB4JXgiLCBwQyk7Ci0KLSAgICAvKiovCi0gICAgLyogLS0tLS0gRnJlZSB2aWRlbyBkZWNvZGVyIHN0dWZmLCBpZiBuZWVkZWQgLS0tLS0gKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wVmlEZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlc3Ryb3kocEMtPnBWaURlY0N0eHQpOwotICAgICAgICBwQy0+cFZpRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2NsZWFuVXA6IG1fcFZpZGVvRGVjb2Rlci0+cEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSB0aGUgYXVkaW8gZGVjb2RlciBzdHVmZiAtLS0tLSAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBBdWRpb0RlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0KTsKLSAgICAgICAgcEMtPnBBdWRpb0RlY0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBtX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgcmVhZGVyIHN0dWZmLCBpZiBuZWVkZWQgLS0tLS0gKi8KLSAgICAvLyBXZSBjYW5ub3QgZnJlZSB0aGUgcmVhZGVyIGJlZm9yZSBkZWNvZGVycyBiZWNhdXNlIHRoZSBkZWNvZGVycyBtYXkgcmVhZAotICAgIC8vIGZyb20gdGhlIHJlYWRlciAoaW4gYW5vdGhlciB0aHJlYWQpIGJlZm9yZSBiZWluZyBzdG9wcGVkLgotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPgotICAgICAgICBwUmVhZGVyQ29udGV4dCApIC8qKjwgbWF5IGJlIE00T1NBX05VTEwgaWYgTTRNQ1Nfb3BlbiB3YXMgbm90IGNhbGxlZCAqLwotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0Q2xvc2UocEMtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfY2xlYW5VcDogbV9wUmVhZGVyLT5tX3BGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3REZXN0cm95KHBDLT5wUmVhZGVyQ29udGV4dCk7Ci0gICAgICAgIHBDLT5wUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2NsZWFuVXA6IG1fcFJlYWRlci0+bV9wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BEYXRhQWRkcmVzczEgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BEYXRhQWRkcmVzczEpOwotICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MxID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcERhdGFBZGRyZXNzMiAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcERhdGFBZGRyZXNzMik7Ci0gICAgICAgIHBDLT5tX3BEYXRhQWRkcmVzczIgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICAvKkJ1ZyBmaXggMTEvMTIvMjAwOCAodG8gb2J0YWluIG1vcmUgcHJlY2lzZSB2aWRlbyBlbmQgY3V0KSovCi0gICAgaWYoIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxKTsKLSAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIpOwotICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLiBJdCBpcyB0aGUgc2FtZSBhcyBNNE1DU19vcGVuIHdpdGhvdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19XSVRIX0ZBU1RfT1BFTiBmbGFnCi1JdCBpcyB1c2VkIGluIFZpZGVvQXJ0aXN0Ci0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBpcyBub3QgY3JlYXRlZCB5ZXQuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBGaWxlSW4gICAgICAgICAgICAgKElOKSBJbnB1dCBmaWxlIHRvIHRyYW5zY29kZSAoVGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCwgcGlwZS4uLikgZGVwZW5kcyBvbiB0aGUgT1NBTCBpbXBsZW1lbnRhdGlvbikuCi0gKiBAcGFyYW0gICBtZWRpYVR5cGUgICAgICAgICAgIChJTikgQ29udGFpbmVyIHR5cGUgKC4zZ3AsLmFtciwgLi4uKSBvZiBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgcEZpbGVPdXQgICAgICAgICAgICAoSU4pIE91dHB1dCBmaWxlIHRvIGNyZWF0ZSAgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCwgcGlwZS4uLikgZGVwZW5kcyBvbiB0aGUgT1NBTCBpbXBsZW1lbnRhdGlvbikuCi0gKiBAcGFyYW0gICBwVGVtcEZpbGUgICAgICAgICAgIChJTikgVGVtcG9yYXJ5IGZpbGUgZm9yIHRoZSBjb25zdGFudCBtZW1vcnkgd3JpdGVyIHRvIHN0b3JlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhICgibW9vdi5iaW4iKS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiAgIFRoZSBpbnB1dCBmaWxlIGhhcyBub3QgYmVlbiBmb3VuZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTogICBUaGUgaW5wdXQgZmlsZSBpcyBub3QgYSB2YWxpZCBmaWxlLCBvciBpcyBjb3JydXB0ZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU06ICBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBubwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYXVkaW8gb3IgdmlkZW8gc3RyZWFtCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19vcGVuX25vcm1hbE1vZGUoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgbWVkaWFGYW1pbHk7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBGaWxlSW49MHgleCxcCi0gICAgIHBGaWxlT3V0PTB4JXgiLCBwQ29udGV4dCwgcEZpbGVJbiwgcEZpbGVPdXQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlSW4pICwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlOiBwRmlsZUluIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmICgoSW5wdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfSlBHKQotICAgICAgICB8fChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QTkcpCi0gICAgICAgIHx8KElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0dJRikKLSAgICAgICAgfHwoSW5wdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQk1QKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19vcGVuX25vcm1hbE1vZGU6IFN0aWxsIHBpY3R1cmUgaXMgbm90XAotICAgICAgICAgICAgIHN1cHBvcnRlZCB3aXRoIHRoaXMgZnVuY3Rpb24iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiAoTTRNQ1Nfa1N0YXRlX0NSRUFURUQgIT0gcEMtPlN0YXRlKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IGZ1bmN0aW9uIGlucHV0IHBhcmFtZXRlcnMgaW50byBvdXIgY29udGV4dCAqLwotICAgIHBDLT5wSW5wdXRGaWxlICAgICA9IHBGaWxlSW47Ci0gICAgcEMtPklucHV0RmlsZVR5cGUgID0gSW5wdXRGaWxlVHlwZTsKLSAgICBwQy0+cE91dHB1dEZpbGUgICAgPSBwRmlsZU91dDsKLSAgICBwQy0+cFRlbXBvcmFyeUZpbGUgPSBwVGVtcEZpbGU7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogT3BlbiBpbnB1dCBmaWxlIHdpdGggdGhlIHJlYWRlciAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRSZWFkZXIocENvbnRleHQsIHBDLT5JbnB1dEZpbGVUeXBlKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgcmVhZGVyIHJlbGF0ZWQgdmFyaWFibGVzICovCi0gICAgcEMtPlZpZGVvU3RhdGUgICAgICAgICAgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPkF1ZGlvU3RhdGUgICAgICAgICAgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIEluaXRpYWxpemVzIHRoZSByZWFkZXIgc2hlbGwgYW5kIG9wZW4gdGhlIGRhdGEgZmlsZSAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdENyZWF0ZSgmcEMtPnBSZWFkZXJDb250ZXh0KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IG1fcFJlYWRlci0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBMaW5rIHRoZSByZWFkZXIgaW50ZXJmYWNlIHRvIHRoZSByZWFkZXIgY29udGV4dCAqLwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcmVhZGVyQ29udGV4dCA9IHBDLT5wUmVhZGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSByZWFkZXIgc2hlbGwgZmlsZSBhY2Nlc3MgZnVuY3Rpb25zICovCi0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0ciwKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBtX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogT3BlbiB0aGUgaW5wdXQgZmlsZSAqLwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdE9wZW4ocEMtPnBSZWFkZXJDb250ZXh0LCBwQy0+cElucHV0RmlsZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHVpRHVtbXksIHVpQ29yZUlkOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IG1fcFJlYWRlci0+bV9wRmN0T3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotCi0gICAgICAgIGlmIChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRSkpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogcmV0dXJuaW5nIE00TUNTX0VSUl9GSUxFX0RSTV9QUk9URUNURUQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfRklMRV9EUk1fUFJPVEVDVEVEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIElmIHRoZSBlcnJvciBpcyBmcm9tIHRoZSBjb3JlIHJlYWRlciwgd2UgY2hhbmdlIGl0IHRvIGEgcHVibGljIFZYUyBlcnJvciAqLwotICAgICAgICAgICAgTTRPU0FfRVJSX1NQTElUKGVyciwgdWlEdW1teSwgdWlDb3JlSWQsIHVpRHVtbXkpOwotICAgICAgICAgICAgaWYgKE00TVA0X1JFQURFUiA9PSB1aUNvcmVJZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgc3RyZWFtcyBmcm9tIHRoZSBpbnB1dCBmaWxlICovCi0gICAgd2hpbGUgKE00Tk9fRVJST1IgPT0gZXJyKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dFN0cmVhbShwQy0+cFJlYWRlckNvbnRleHQsICZtZWRpYUZhbWlseSwKLSAgICAgICAgICAgICZwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gY2FzZSB3ZSBmb3VuZCBhIEJJRlMgc3RyZWFtIG9yIHNvbWV0aGluZyBlbHNlLi4uKi8KLSAgICAgICAgaWYoKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRSkpCi0gICAgICAgICAgICB8fCAoZXJyID09ICgoTTRPU0FfVUludDMyKU00V0FSX1RPT19NVUNIX1NUUkVBTVMpKSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIHRoZSBmaXJzdCB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgIGlmICgoTTRSRUFERVJfa01lZGlhRmFtaWx5VmlkZW8gPT0gbWVkaWFGYW1pbHkpIFwKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKE00REFfU3RyZWFtVHlwZVZpZGVvSDI2Mz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFT19BVkMKLSAgICAgICAgICAgICAgICAgICAgfHwoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2Yz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkpCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICB8fCgoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2Yz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgJiYocEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbTTRERUNPREVSX2tWaWRlb1R5cGVBVkNdICE9IE00T1NBX05VTEwpKSkKLSNlbmRpZgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgIEZvdW5kIGEgSDI2MyBvciBNUEVHLTQgdmlkZW8gc3RyZWFtIGluIGlucHV0IDNncHAgY2xpcCIpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEtlZXAgcG9pbnRlciB0byB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0gPSAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKilwU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZFZpZGVvRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXQgb3VyIHZpZGVvIHN0cmVhbSBzdGF0ZSB2YXJpYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0gcmVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RSZXNldCh2aWRlbykgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LCBwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHZpZGVvKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8qKjwgTm90IEgyNjMgb3IgTVBFRy00IChIMjY0LCBldGMuKSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiB1bnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gKDB4JXgpIGluIGlucHV0IDNncHAgY2xpcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRm91bmQgdGhlIGZpcnN0IGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgZWxzZSBpZiAoKE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvID09IG1lZGlhRmFtaWx5KQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kPT1wU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChNNERBX1N0cmVhbVR5cGVBdWRpb01wMz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBGb3VuZCBhbiBBTVItTkIsIEFBQyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBvciBNUDMgYXVkaW8gc3RyZWFtIGluIGlucHV0IGNsaXAiKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBLZWVwIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZEF1ZGlvRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0IG91ciBhdWRpbyBzdHJlYW0gc3RhdGUgdmFyaWFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc3RyZWFtIHJlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0UmVzZXQoYXVkaW8pIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwgcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChhdWRpbykgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBPdXRwdXQgbWF4IEFVIHNpemUgaXMgZXF1YWwgdG8gaW5wdXQgbWF4IEFVIHNpemUgKHRoaXMgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgKiB3aWxsIGJlIGNoYW5nZWQgaWYgdGhlcmUgaXMgYXVkaW8gdHJhbnNjb2RpbmcpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKjwgTm90IEFNUi1OQiwgQUFDLCBNUDMgbm9yIEVWUkMgKEFNUi1XQiwgV0FWLi4uKSAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IEZvdW5kIGFuIHVuc3VwcG9ydGVkIGF1ZGlvIHN0cmVhbVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgleCkgaW4gaW5wdXQgM2dwcCBjbGlwIiwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZEF1ZGlvRm91bmQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gLyoqPCBlbmQgb2Ygd2hpbGUgKE00Tk9fRVJST1IgPT0gZXJyKSAqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayB3ZSBmb3VuZCBhdCBsZWFzdCBvbmUgc3VwcG9ydGVkIHN0cmVhbSAqLwotICAgIGlmKChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiByZXR1cm5pbmcgXAotICAgICAgICAgICAgTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTSIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTTsKLSAgICB9Ci0KLSNpZm5kZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgaWYocEMtPlZpZGVvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQpCi0gICAgewotICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZihwQy0+QXVkaW9TdGF0ZSA9PSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRCkKLSAgICB7Ci0gICAgICAgIC8vRVZSQwotICAgICAgICBpZihNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMgIT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgIC8qIGRlY29kZXIgbm90IHN1cHBvcnRlZCB5ZXQsIGJ1dCBhbGxvdyB0byBkbyBudWxsIGVuY29kaW5nICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0RlY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKHBDKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6XAotICAgICAgICAgICAgIE00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgYmVnaW4gY3V0IGRlY29kaW5nIGluY3JlbWVudCBhY2NvcmRpbmcgdG8gdGhlIGlucHV0IGZyYW1lIHJhdGUgKi8KLSAgICBpZiAoMC4gIT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuZkF2ZXJhZ2VGcmFtZVJhdGUpIC8qKjwgc2FuaXR5IGNoZWNrICovCi0gICAgewotICAgICAgICBwQy0+aVZpZGVvQmVnaW5EZWNJbmNyID0gKE00T1NBX0ludDMyKSgzMDAwLiBcCi0gICAgICAgICAgICAvIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZBdmVyYWdlRnJhbWVSYXRlKTsgLyoqPCBhYm91dCAzIGZyYW1lcyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+aVZpZGVvQmVnaW5EZWNJbmNyID0gMjAwOyAvKio8IGRlZmF1bHQgdmFsdWU6IDIwMCBtaWxsaXNlY29uZHMgKDMgZnJhbWVzIEAgMTVmcHMpKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfT1BFTkVEOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQykgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRBRF9CdWZmZXIgb3V0cHV0QnVmZmVyOwotICAgIHVpbnQzMl90IG9wdGlvblZhbHVlID0wOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzIDpzdGFydCIpOwotCi0gICAgLy8gRGVjb2RlIGZpcnN0IGF1ZGlvIGZyYW1lIGZyb20gY2xpcCB0byBnZXQgcHJvcGVydGllcyBmcm9tIGNvZGVjCi0KLSAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkgewotCi0gICAgICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICAgICAmcEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sICYocEMtPkFhY1Byb3BlcnRpZXMpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50Q2hlY2tBbmRHZXRDb2RlY1Byb3BlcnRpZXM6IG1fcEZjdENyZWF0ZUF1ZGlvRGVjIFwKLSAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF8zZ3BSZWFkZXJJbnRlcmZhY2UsIChNNE9TQV9EYXRhT3B0aW9uKSBwQy0+bV9wUmVhZGVyRGF0YUl0KTsKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9BdWRpb0FVLCAoTTRPU0FfRGF0YU9wdGlvbikgJnBDLT5SZWFkZXJBdWRpb0FVKTsKLQotICAgIGlmKCBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjICE9IE00T1NBX05VTEwgKSB7Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzOiBtX3BGY3RTdGFydEF1ZGlvRGVjIFwKLSAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgb3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLQotICAgIGlmKCBvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplID4gMCApIHsKLQotICAgICAgICBvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUgXAotICAgICAgICAgICAgKnNpemVvZihzaG9ydCksIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gb3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MgKSB7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0ZXBBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgTTRPU0FfTlVMTCwgJm91dHB1dEJ1ZmZlciwgTTRPU0FfRkFMU0UpOwotCi0gICAgaWYgKCBlcnIgPT0gTTRXQVJfSU5GT19GT1JNQVRfQ0hBTkdFICkgewotCi0gICAgICAgIC8vIEdldCB0aGUgcHJvcGVydGllcyBmcm9tIGNvZGVjIG5vZGUKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMocEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgIE00QURfa09wdGlvbklEX0F1ZGlvTmJDaGFubmVscywgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgLy8gUmVzZXQgUmVhZGVyIHN0cnVjdHVyZSB2YWx1ZSBhbHNvCi0gICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscyA9IG9wdGlvblZhbHVlOwotCi0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9TYW1wRnJlcXVlbmN5LCAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICAvLyBSZXNldCBSZWFkZXIgc3RydWN0dXJlIHZhbHVlIGFsc28KLSAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IG9wdGlvblZhbHVlOwotCi0gICAgICAgIGlmIChNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKSB7Ci0KLSAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuID0KLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICAgICAgfQotCi0gICAgfSBlbHNlIGlmKCBlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50Q2hlY2tBbmRHZXRDb2RlY1Byb3BlcnRpZXM6XAotICAgICAgICAgICAgbV9wRmN0U3RlcEF1ZGlvRGVjIHJldHVybnMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgfQotCi0gICAgZnJlZShvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcyk7Ci0KLSAgICAvLyBSZXNldCB0aGUgc3RyZWFtIHJlYWRlcgotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50Q2hlY2tBbmRHZXRDb2RlY1Byb3BlcnRpZXNcCi0gICAgICAgICAgICBFcnJvciBpbiByZXNldGluZyByZWFkZXI6IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci0KLX0KLQotTTRPU0FfRVJSIE00TUNTX2ludExpbWl0Qml0cmF0ZVBlckNvZGVjUHJvZmlsZUxldmVsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zKiBFbmNQYXJhbXMpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgc3dpdGNoIChFbmNQYXJhbXMtPkZvcm1hdCkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoKLSAgICAgICAgICAgIEVuY1BhcmFtcy0+Qml0cmF0ZSA9IE00TUNTX2ludExpbWl0Qml0cmF0ZUZvckgyNjNFbmMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLT52aWRlb1Byb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLT52aWRlb0xldmVsLCBFbmNQYXJhbXMtPkJpdHJhdGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QRUc0OgotICAgICAgICAgICAgRW5jUGFyYW1zLT5CaXRyYXRlID0gTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9yTXBlZzRFbmMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLT52aWRlb1Byb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLT52aWRlb0xldmVsLCBFbmNQYXJhbXMtPkJpdHJhdGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjQ6Ci0gICAgICAgICAgICBFbmNQYXJhbXMtPkJpdHJhdGUgPSBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JIMjY0RW5jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9MZXZlbCwgRW5jUGFyYW1zLT5CaXRyYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50TGltaXRCaXRyYXRlUGVyQ29kZWNQcm9maWxlTGV2ZWw6IFwKLSAgICAgICAgICAgICAgICBXcm9uZyBlbmMgZm9ybWF0ICVkIiwgRW5jUGFyYW1zLT5Gb3JtYXQpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLQotfQotCi1NNE9TQV9JbnQzMiBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JIMjY0RW5jKE00T1NBX0ludDMyIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfSW50MzIgYml0cmF0ZSkgewotCi0gICAgTTRPU0FfSW50MzIgdmlkQml0cmF0ZSA9IDA7Ci0KLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lOgotICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlTWFpbjoKLQotICAgICAgICAgICAgc3dpdGNoIChsZXZlbCkgewotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2NDAwMCkgPyA2NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxYjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTI4MDAwKSA/IDEyODAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTkyMDAwKSA/IDE5MjAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMzg0MDAwKSA/IDM4NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMzoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNzY4MDAwKSA/IDc2ODAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyMDAwMDAwKSA/IDIwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDQwMDAwMDApID8gNDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNDAwMDAwMCkgPyA0MDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDM6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEwMDAwMDAwKSA/IDEwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDMxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxNDAwMDAwMCkgPyAxNDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjAwMDAwMDApID8gMjAwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjAwMDAwMDApID8gMjAwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDUwMDAwMDAwKSA/IDUwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA1MDAwMDAwMCkgPyA1MDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw1OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxMzUwMDAwMDApID8gMTM1MDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDUxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNDAwMDAwMDApID8gMjQwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDoKLSAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDgwMDAwKSA/IDgwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDFiOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxNjAwMDApID8gMTYwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDExOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNDAwMDApID8gMjQwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDEyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA0ODAwMDApID8gNDgwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDEzOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA5NjAwMDApID8gOTYwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDI1MDAwMDApID8gMjUwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNTAwMDAwMCkgPyA1MDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDIyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA1MDAwMDAwKSA/IDUwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMzoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTI1MDAwMDApID8gMTI1MDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMzE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDE3NTAwMDAwKSA/IDE3NTAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDMyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNTAwMDAwMCkgPyAyNTAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNTAwMDAwMCkgPyAyNTAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw0MToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNjI1MDAwMDApID8gNjI1MDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDYyNTAwMDAwKSA/IDYyNTAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDU6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDE2ODc1MDAwMCkgPyAxNjg3NTAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNTE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDMwMDAwMDAwMCkgPyAzMDAwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBXZSBkbyBub3QgaGFuZGxlIGFueSBvdGhlciBBVkMgcHJvZmlsZSBmb3Igbm93LgotICAgICAgICAgICAgLy8gUmV0dXJuIGlucHV0IGJpdHJhdGUKLSAgICAgICAgICAgIHZpZEJpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZpZEJpdHJhdGU7Ci19Ci0KLU00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvck1wZWc0RW5jKE00T1NBX0ludDMyIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfSW50MzIgYml0cmF0ZSkgewotCi0gICAgTTRPU0FfSW50MzIgdmlkQml0cmF0ZSA9IDA7Ci0KLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlOgotICAgICAgICAgICAgc3dpdGNoIChsZXZlbCkgewotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDA6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDY0MDAwKSA/IDY0MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMGI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyODAwMCkgPyAxMjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2NDAwMCkgPyA2NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyODAwMCkgPyAxMjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwzOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAzODQwMDApID8gMzg0MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhbmRsZSBhbnkgb3RoZXIgTVBFRzQgcHJvZmlsZSBmb3Igbm93LgotICAgICAgICAgICAgLy8gUmV0dXJuIGlucHV0IGJpdHJhdGUKLSAgICAgICAgICAgIHZpZEJpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZpZEJpdHJhdGU7Ci19Ci0KLU00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvckgyNjNFbmMoTTRPU0FfSW50MzIgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLCBNNE9TQV9JbnQzMiBiaXRyYXRlKSB7Ci0KLSAgICBNNE9TQV9JbnQzMiB2aWRCaXRyYXRlID0gMDsKLQotICAgIHN3aXRjaCAocHJvZmlsZSkgewotICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lOgotICAgICAgICAgICAgc3dpdGNoIChsZXZlbCkgewotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsMTA6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDY0MDAwKSA/IDY0MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzTGV2ZWwyMDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTI4MDAwKSA/IDEyODAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsMzA6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDM4NDAwMCkgPyAzODQwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBXZSBkbyBub3QgaGFuZGxlIGFueSBvdGhlciBIMjYzIHByb2ZpbGUgZm9yIG5vdy4KLSAgICAgICAgICAgIC8vIFJldHVybiBpbnB1dCBiaXRyYXRlCi0gICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB2aWRCaXRyYXRlOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQXVkaW9FZmZlY3RzLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19BdWRpb0VmZmVjdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDg4ZGU2OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19BdWRpb0VmZmVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQVBJLmMKLSAqIEBicmllZiAgTUNTIGltcGxlbWVudGF0aW9uIChWaWRlbyBDb21wcmVzc29yIFNlcnZpY2UpCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBBUEkgYW5kIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBNQ1MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgICAvKio8IE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgICAvKio8IE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0vKiBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00TUNTX0FQSS5oIgotI2luY2x1ZGUgIk00TUNTX0Vycm9yQ29kZXMuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbEZ1bmN0aW9ucy5oIgotCi0vKiBDb21tb24gaGVhZGVycyAoZm9yIGFhYykgKi8KLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLQotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotI2luY2x1ZGUgIk00VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgiCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja0F1ZGlvRWZmZWN0cyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDb250ZXh0KQotICogQGJyaWVmICAgIENoZWNrIGlmIGFuIGVmZmVjdCBoYXMgdG8gYmUgYXBwbGllZCBjdXJyZW50bHkKLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgc3RlcEVuY29kaW5nIGZ1bmN0aW9uCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBNQ1MgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQykKLXsKLSAgICBNNE9TQV9JbnQ4ICpwQWN0aXZlRWZmZWN0TnVtYmVyID0gJihwQy0+cEFjdGl2ZUVmZmVjdE51bWJlcik7Ci0KLSAgICAqcEFjdGl2ZUVmZmVjdE51bWJlciA9IC0xOwotCi0gICAgaWYocEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgPiBwQy0+dWlCZWdpbkN1dFRpbWUKLSAgICAmJiBwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUyA8IHBDLT51aUVuZEN1dFRpbWUpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgb3V0cHV0UmVsYXRlZFRpbWUgPSAwOwotICAgICAgICBNNE9TQV9VSW50OCB1aUVmZmVjdEluZGV4ID0gMDsKLSAgICAgICAgb3V0cHV0UmVsYXRlZFRpbWUgPQotICAgICAgICAoTTRPU0FfVUludDMyKShwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUyAgLSBwQy0+dWlCZWdpbkN1dFRpbWUgKyAwLjUpOwotCi0gICAgICAgIGZvcih1aUVmZmVjdEluZGV4PTA7IHVpRWZmZWN0SW5kZXg8cEMtPm5iRWZmZWN0czsgdWlFZmZlY3RJbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKG91dHB1dFJlbGF0ZWRUaW1lID49Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikocEMtPnBFZmZlY3RzW3VpRWZmZWN0SW5kZXhdLnVpU3RhcnRUaW1lKSkgJiYKLSAgICAgICAgICAgICAgICAob3V0cHV0UmVsYXRlZFRpbWUgPAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5wRWZmZWN0c1t1aUVmZmVjdEluZGV4XS51aVN0YXJ0VGltZSArXAotICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1t1aUVmZmVjdEluZGV4XS51aUR1cmF0aW9uKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBBY3RpdmVFZmZlY3ROdW1iZXIgPSB1aUVmZmVjdEluZGV4OwotICAgICAgICAgICAgICAgIHVpRWZmZWN0SW5kZXggPSBwQy0+bmJFZmZlY3RzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IEZhZGVJbiB0byBwUENNZGF0YQotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUENNZGF0YSAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgKElOKSAgICAgRWZmZWN0IHByb2dyZXNzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluKCAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MpCi17Ci0gICAgLyogd2Ugd2lsbCBjYXN0IGVhY2ggSW50MTYgc2FtcGxlIGludG8gdGhpcyBJbnQzMiB2YXJpYWJsZSAqLwotICAgIE00T1NBX0ludDMyIGkzMnNhbXBsZTsKLQotICAgIC8qKgotICAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+IDEwMDApCi0gICAgewotICAgICAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPSAxMDAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyb20gYnVmZmVyIHNpemUgKGJ5dGVzKSB0byBudW1iZXIgb2Ygc2FtcGxlIChpbnQxNik6IGRpdmlkZSBieSB0d28gKi8KLSAgICB1aVBDTXNpemUgPj49IDE7Ci0KLSAgICAvKioKLSAgICAgKiBMb29wIG9uIHNhbXBsZXMgKi8KLSAgICB3aGlsZSAodWlQQ01zaXplLS0+MCkgLyoqPCBkZWNyZW1lbnRpbmcgdG8gb3B0aW1pemUgKi8KLSAgICB7Ci0gICAgICAgIGkzMnNhbXBsZSA9ICpwUENNZGF0YTsKLSAgICAgICAgaTMyc2FtcGxlICo9IHBQcm9ncmVzcy0+dWlQcm9ncmVzczsKLSAgICAgICAgaTMyc2FtcGxlIC89IDEwMDA7Ci0gICAgICAgICpwUENNZGF0YSsrID0gKE00T1NBX0ludDE2KWkzMnNhbXBsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbjogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZU91dCgpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IEZhZGVJbiB0byBwUENNZGF0YQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBDTWRhdGEgICAgKElOL09VVCkgSW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pICAgICBTaXplIG9mIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgIChJTikgICAgIEVmZmVjdCBwcm9ncmVzcwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZU91dCggTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MpCi17Ci0gICAgLyogd2Ugd2lsbCBjYXN0IGVhY2ggSW50MTYgc2FtcGxlIGludG8gdGhpcyBJbnQzMiB2YXJpYWJsZSAqLwotICAgIE00T1NBX0ludDMyIGkzMnNhbXBsZTsKLQotICAgIC8qKgotICAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+IDEwMDApCi0gICAgewotICAgICAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPSAxMDAwOwotICAgIH0KLSAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPSAxMDAwIC0gcFByb2dyZXNzLT51aVByb2dyZXNzOwotCi0gICAgLyoqCi0gICAgICogRnJvbSBidWZmZXIgc2l6ZSAoYnl0ZXMpIHRvIG51bWJlciBvZiBzYW1wbGUgKGludDE2KTogZGl2aWRlIGJ5IHR3byAqLwotICAgIHVpUENNc2l6ZSA+Pj0gMTsKLQotICAgIC8qKgotICAgICAqIExvb3Agb24gc2FtcGxlcyAqLwotICAgIHdoaWxlICh1aVBDTXNpemUtLT4wKSAvKio8IGRlY3JlbWVudGluZyB0byBvcHRpbWl6ZSAqLwotICAgIHsKLSAgICAgICAgaTMyc2FtcGxlID0gKnBQQ01kYXRhOwotICAgICAgICBpMzJzYW1wbGUgKj0gcFByb2dyZXNzLT51aVByb2dyZXNzOwotICAgICAgICBpMzJzYW1wbGUgLz0gMTAwMDsKLSAgICAgICAgKnBQQ01kYXRhKysgPSAoTTRPU0FfSW50MTYpaTMyc2FtcGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZU91dDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQ29kZWNzLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19Db2RlY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU0NDkyYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19Db2RlY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDkxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE1DU19Db2RlY3MuYwotICogQGJyaWVmICBNQ1MgaW1wbGVtZW50YXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgcmVsYXRlZCB0byBhdWRpby92aWRlbwotICogICAgICAgICBjb2RlYyBtYW5pcHVsYXRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbmNsdWRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgICAgICAgICAvKiBJbmNsdWRlIGZvciBPU0FMIGRlYnVnIHNlcnZpY2VzICovCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIiAgICAvKiBJbnRlcm5hbCB0eXBlcyBvZiB0aGUgTUNTICovCi0KLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfVklERUNfM0dQCi0jaW5jbHVkZSAiTTRfTVBFRzRWSV9WaWRlb0hhbmRsZXIuaCIgIC8qbmVlZGVkIGZvciByZW5kZXJlciBlcnJvciBjb2RlcyovCi0jZW5kaWYKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX2NsZWFySW50ZXJmYWNlVGFibGVzKCkKLSAqIEBicmllZiAgICBDbGVhciBlbmNvZGVycywgZGVjb2RlcnMsIHJlYWRlciBhbmQgd3JpdGVycyBpbnRlcmZhY2VzIHRhYmxlcwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX2NsZWFySW50ZXJmYWNlVGFibGVzKE00TUNTX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogSW5pdGlhbGlzYXRpb24gdGhhdCB3aWxsIGFsbG93IHRvIGNoZWNrIGlmIHJlZ2lzdGVyaW5nIHR3aWNlICovCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0KLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE00V1JJVEVSX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRFTkNPREVSX2tBdWRpb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJGbGFnW2ldID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGlzYXRpb24gdGhhdCB3aWxsIGFsbG93IHRvIGNoZWNrIGlmIHJlZ2lzdGVyaW5nIHR3aWNlICovCi0gICAgcEMtPm1fcFJlYWRlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdCAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFJlYWRlcnMgID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNFJFQURFUl9rTWVkaWFUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gICA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgcEMtPm1fcEN1cnJlbnRWaWRlb0RlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRWaWRlb0RlYyA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IE00REVDT0RFUl9rVmlkZW9UeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0gICAgfQotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0gICAgZm9yIChpID0gMDsgaSA8IE00QURfa1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJGbGFnVGFibGVbaV0gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyV3JpdGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICB0aGUgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICAgTTRFUlJfUEFSQU1FVEVSICAgICBwQ29udGV4dCxwV3RyR2xvYmFsSW50ZXJmYWNlIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3RyRGF0YUludGVyZmFjZSBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVidWcgb25seSksIG9yIGludmFsaWQgTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyV3JpdGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00V1JJVEVSX091dHB1dEZpbGVUeXBlIE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogcFd0ckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXdHJEYXRhSW50ZXJmYWNlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBDID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNQ1M6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckdsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAicFd0ckdsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00TUNTX3JlZ2lzdGVyV3JpdGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwV3RyRGF0YUludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAicFd0ckRhdGFJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlcldyaXRlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoIk1DUzogTTRNQ1NfcmVnaXN0ZXJXcml0ZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCxcCi0gICAgIHBXdHJHbG9iYWxJbnRlcmZhY2U9MHgleCwgcFd0ckRhdGFJbnRlcmZhY2U9MHgleCIsIHBDLHBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgIHBXdHJEYXRhSW50ZXJmYWNlKTsKLQotICAgIGlmKChNZWRpYVR5cGUgPT0gTTRXUklURVJfa1Vua25vd24pIHx8IChNZWRpYVR5cGUgPj0gTTRXUklURVJfa1R5cGVfTkIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgbWVkaWEgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQy0+V3JpdGVySW50ZXJmYWNlW01lZGlhVHlwZV0ucEdsb2JhbEZjdHMgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAvKiBhIHdyaXRlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgISovCi0gICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiVGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCIpOwotICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNhdmUgd3JpdGVyIGludGVyZmFjZSBpbiBjb250ZXh0ICovCi0gICAgcEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBHbG9iYWxGY3RzID0gcFd0ckdsb2JhbEludGVyZmFjZTsKLSAgICBwQy0+V3JpdGVySW50ZXJmYWNlW01lZGlhVHlwZV0ucERhdGFGY3RzID0gcFd0ckRhdGFJbnRlcmZhY2U7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckVuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIHZpZGVvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIgKAotICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChwQyA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTUNTOiBjb250ZXh0IGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBFbmNHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk1DUzogTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCxcCi0gICAgICAgICBwRW5jR2xvYmFsSW50ZXJmYWNlPTB4JXgiLCBwQywgcEVuY0dsb2JhbEludGVyZmFjZSk7Ci0KLSAgICBpZiAoTWVkaWFUeXBlID49IE00RU5DT0RFUl9rVmlkZW9fTkIpCi0gICAgewotICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgdmlkZW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAvKiBjYW4gYmUgbGVnaXRpbWF0ZSwgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBvbmUgdmVyc2lvbiB0aGF0IGNhbiB1c2UgZXh0ZXJuYWwgZW5jb2RlcnMKLSAgICAgICAgYnV0IHdoaWNoIHN0aWxsIGhhcyB0aGUgYnVpbHQtaW4gb25lIHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGFuIGV4dGVybmFsIGVuY29kZXI7IGluCi0gICAgICAgIHRoaXMgY2FzZSB0aGUgbmV3IGVuY29kZXIgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lIChpLmUuIHdlIHVucmVnaXN0ZXIgaXQgZmlyc3QpLiAqLwotICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotICAgICAgICBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNhdmUgZW5jb2RlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBwRW5jR2xvYmFsSW50ZXJmYWNlOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgYW5kIGV4dGVybmFsIEFQSSB3aWxsIGJlIHNldCBieSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGluIHRoZSBjYXNlCi0gICAgb2YgYW4gZXh0ZXJuYWwgZW5jb2RlciAoYWRkIGl0IGFzIGEgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGxvbmcgcnVuPykgKi8KLSAgICBwQy0+cFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIGF1ZGlvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgICAgICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGU6ICAgICAgICAgICAgICAgIChJTikgVGhlIG1lZGlhIHR5cGUuCi0gKiBAcGFyYW0gICAgcEVuY0dsb2JhbEludGVyZmFjZTogICAgKE9VVCkgdGhlIGVuY29kZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBDID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNQ1M6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocEVuY0dsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAicEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyIik7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTUNTOiBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LFwKLSAgICAgICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U9MHgleCIsIHBDLCBwRW5jR2xvYmFsSW50ZXJmYWNlKTsKLQotICAgIGlmIChNZWRpYVR5cGUgPj0gTTRFTkNPREVSX2tBdWRpb19OQikKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIGF1ZGlvIGVuY29kZXIgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSk7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0pOwotICAgICAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTYXZlIGVuY29kZXIgaW50ZXJmYWNlIGluIGNvbnRleHQgKi8KLSAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gcEVuY0dsb2JhbEludGVyZmFjZTsKLSAgICBwQy0+cEF1ZGlvRW5jb2RlckZsYWdbTWVkaWFUeXBlXSA9IE00T1NBX0ZBTFNFOyAvKiBpbnRlcm5hbCBlbmNvZGVyICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclJlYWRlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgcmVhZGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgbWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcFJkckRhdGFJbnRlcmZhY2UpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJkckdsb2JhbEludGVyZmFjZSksCi0gICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE1DU19yZWdpc3RlclJlYWRlcjogaW52YWxpZCBwb2ludGVyIG9uIGdsb2JhbCBpbnRlcmZhY2UiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJkckRhdGFJbnRlcmZhY2UpLAotICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRNQ1NfcmVnaXN0ZXJSZWFkZXI6IGludmFsaWQgcG9pbnRlciBvbiBkYXRhIGludGVyZmFjZSIpOwotCi0gICAgaWYgKG1lZGlhVHlwZSA9PSBNNFJFQURFUl9rTWVkaWFUeXBlVW5rbm93biB8fCBtZWRpYVR5cGUgPj0gTTRSRUFERVJfa01lZGlhVHlwZV9OQikKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIG1lZGlhIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgLyogYSByZWFkZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkICEqLwotICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIlRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQiKTsKLSAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSA9IHBSZHJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW21lZGlhVHlwZV0gICA9IHBSZHJEYXRhSW50ZXJmYWNlOwotCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzKys7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgdmlkZW8gZGVjb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIERlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSksIG9yIHRoZSBkZWNvZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwRGVjb2RlckludGVyZmFjZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlcjogaW52YWxpZCBwb2ludGVyIG9uIGRlY29kZXIgaW50ZXJmYWNlIik7Ci0KLSAgICBpZiAoZGVjb2RlclR5cGUgPj0gTTRERUNPREVSX2tWaWRlb1R5cGVfTkIpCi0gICAgewotICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgdmlkZW8gZGVjb2RlciB0eXBlIik7Ci0gICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0jaWZuZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgICAgICAvKiBhIGRlY29kZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkICEqLwotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiRGVjb2RlciBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSNlbHNlIC8qIGV4dGVybmFsIGRlY29kZXJzIGFyZSBwb3NzaWJsZSAqLwotICAgICAgICAvKiBjYW4gYmUgbGVnaXRpbWF0ZSwgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBvbmUgdmVyc2lvbiB0aGF0IGNhbiB1c2UgZXh0ZXJuYWwgZGVjb2RlcnMKLSAgICAgICAgYnV0IHdoaWNoIHN0aWxsIGhhcyB0aGUgYnVpbHQtaW4gb25lIHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGFuIGV4dGVybmFsIGRlY29kZXI7IGluCi0gICAgICAgIHRoaXMgY2FzZSB0aGUgbmV3IGRlY29kZXIgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lIChpLmUuIHdlIHVucmVnaXN0ZXIgaXQgZmlyc3QpLiAqLwotICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIC8qIG9oLCBhbmQgZG9uJ3QgZm9yZ2V0IHRoZSB1c2VyIGRhdGEsIHRvby4gKi8KLSAgICAgICAgaWYgKHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0jZW5kaWYgLyogYXJlIGV4dGVybmFsIGRlY29kZXJzIHBvc3NpYmxlPyAqLwotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IHBEZWNvZGVySW50ZXJmYWNlOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgLyogVGhlIGFjdHVhbCB1c2VyRGF0YSB3aWxsIGJlIHNldCBieSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGluIHRoZSBjYXNlCi0gICAgb2YgYW4gZXh0ZXJuYWwgZGVjb2RlciAoYWRkIGl0IGFzIGEgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGxvbmcgcnVuPykgKi8KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjKys7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgYXVkaW8gZGVjb2RlcgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbHkgYnkgdGhlIE1DUyB0bwotICogICAgICAgICAgICAgIHJlZ2lzdGVyIGF1ZGlvIGRlY29kZXJzLAotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgICAgICAoSU4pIEF1ZGlvIGRlY29kZXIgdHlwZQotICogQHBhcmFtICAgIHBEZWNvZGVySW50ZXJmYWNlICAgIChJTikgQXVkaW8gZGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwsIG9yIHRoZSBkZWNvZGVyIHR5cGUgaXMgaW52YWxpZChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYgKGRlY29kZXJUeXBlID49IE00QURfa1R5cGVfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBhdWRpbyBkZWNvZGVyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBwRGVjb2RlckludGVyZmFjZTsKLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX0ZBTFNFOyAvKiBpbnRlcm5hbCBkZWNvZGVyICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsV3JpdGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB3cml0ZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbFdyaXRlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRXUklURVJfa1R5cGVfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyApOwotICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRW5jb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGVuY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxFbmNvZGVycyhNNE1DU19Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNEVOQ09ERVJfa1ZpZGVvX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSApOwotICAgICAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE00RU5DT0RFUl9rQXVkaW9fTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZW5jb2RlcnMgaW50ZXJmYWNlcyovCi0gICAgICAgICAgICBpZiAoTTRPU0FfRkFMU0UgPT0gcEMtPnBBdWRpb0VuY29kZXJGbGFnW2ldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsUmVhZGVycyhNNE1DU19Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNFJFQURFUl9rTWVkaWFUeXBlX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSApOwotICAgICAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gKTsKLSAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFJlYWRlcnMgPSAwOwotICAgIHBDLT5tX3BSZWFkZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbERlY29kZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHRoZSBkZWNvZGVycwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRGVjb2RlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRERUNPREVSX2tWaWRlb1R5cGVfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldICk7Ci0gICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRBRF9rVHlwZV9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qRG9uJ3QgZnJlZSBleHRlcm5hbCBhdWRpbyBkZWNvZGVycyBpbnRlcmZhY2VzKi8KLSAgICAgICAgICAgIGlmIChNNE9TQV9GQUxTRSA9PSBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2ldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbaV0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50V3JpdGVyKCkKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCB3cml0ZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50V3JpdGVyKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSB3cml0ZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0OgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFY6Ci0gICAgICAgICAgICB3cml0ZXJUeXBlID0gTTRXUklURVJfazNHUFA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2tBTVI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVAzOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2tNUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNOgotICAgICAgICAgICAgcEMtPmJfaXNSYXdXcml0ZXIgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2tQQ007Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICJXcml0ZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9IHBDLT5Xcml0ZXJJbnRlcmZhY2Vbd3JpdGVyVHlwZV0ucEdsb2JhbEZjdHM7Ci0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cyA9IHBDLT5Xcml0ZXJJbnRlcmZhY2Vbd3JpdGVyVHlwZV0ucERhdGFGY3RzOwotCi0gICAgaWYgKHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMIHx8IHBDLT5wV3JpdGVyRGF0YUZjdHMgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzLT5wV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50VmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNEVOQ09ERVJfRm9ybWF0IGVuY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tIMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa01QRUc0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQwotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiVmlkZW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbZW5jb2RlclR5cGVdOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJID0gcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSA9IHBDLT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBpZiAocEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0IG1lZGlhVHlwZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGVuY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tBQUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa01QMzsKLSAgICAgICAgICAgIGJyZWFrOwotLy9FVlJDCi0vLyAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLS8vICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0VWUkM7Ci0vLyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgIkF1ZGlvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSA9IHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBpZiAocEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJBdWRpbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRSZWFkZXIoKQotICogQGJyaWVmICAgIFNldCBjdXJyZW50IHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlICAgICAgICAgICAgKElOKSBNZWRpYSB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRSZWFkZXIoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00UkVBREVSX01lZGlhVHlwZSByZWFkZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0OgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFY6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZTNHUFA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVBTVI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVAzOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVNUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICJSZWFkZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5tX3BSZWFkZXIgICAgICAgPSBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtyZWFkZXJUeXBlXTsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW3JlYWRlclR5cGVdOwotCi0gICAgaWYgKHBDLT5tX3BSZWFkZXIgPT0gTTRPU0FfTlVMTCB8fCBwQy0+bV9wUmVhZGVyRGF0YUl0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJSZWFkZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoIChtZWRpYVR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ6Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNERFQ09ERVJfa1ZpZGVvVHlwZU1QRUc0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVBVkM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICJWaWRlbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyID0gcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIHBDLT5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGEgPQotICAgICAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0gICAgaWYgKHBDLT5tX3BWaWRlb0RlY29kZXIgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgIlZpZGVvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9EZWNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNEFEX1R5cGUgZGVjb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoIChtZWRpYVR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUFNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM6Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWNBRFRTOgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURJRjoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUFBQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0vL0VWUkMKLS8vICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYzoKLS8vICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlRVZSQzsKLS8vICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiQXVkaW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXTsKLSAgICBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotCi0gICAgaWYgKHBDLT5tX3BBdWRpb0RlY29kZXIgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgIkF1ZGlvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjMxY2E4Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jCi0gKiBAYnJpZWYgIE1lZGlhIHJlYWRlcnMgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIHN1YnNjcmlwdGlvbiBvZiBzdXBwb3J0ZWQgbWVkaWEKLSAqICAgICAgICAgcmVhZGVycyBhbmQgZGVjb2RlcnMgZm9yIHRoZSBNQ1MuIFBvdGVudGlhbCBzdXBwb3J0IGNhbgotICogICAgICAgICBiZSBhY3RpdmF0ZWQgb3IgZGUtYWN0aXZhdGVkCi0gKiAgICAgICAgIHVzaW5nIGNvbXBpbGF0aW9uIGZsYWdzIHNldCBpbiB0aGUgcHJvamVjdHMgc2V0dGluZ3MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluY2x1ZGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbFR5cGVzLmgiICAgICAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgTUNTIHNwZWNpZmljIHR5cGVzICovCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaCIgICAgICAgICAgICAvKio8IFJlZ2lzdHJhdGlvbiBtb2R1bGUgKi8KLQotLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHJlYWRlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyogUmVhZGVyIHJlZ2lzdHJhdGlvbiA6IGF0IGxlYXN0IG9uZSByZWFkZXIgbXVzdCBiZSBkZWZpbmVkICovCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUAotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0jZXJyb3IgIm5vIHJlYWRlciByZWdpc3RlcmVkIgotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMyAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAqLwotCi0vKiBJbmNsdWRlIGZpbGVzIGZvciBlYWNoIHJlYWRlciB0byBzdWJzY3JpYmUgKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSNpbmNsdWRlICJWaWRlb0VkaXRvcjNncFJlYWRlci5oIgotI2VuZGlmCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSNpbmNsdWRlICJNNFJFQURFUl9BbXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTXAzUmVhZGVyLmgiCi0jZW5kaWYKLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgdmlkZW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmgiCi0KLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKiBXcml0ZXIgcmVnaXN0cmF0aW9uIDogYXQgbGVhc3Qgb25lIHdyaXRlciBtdXN0IGJlIGRlZmluZWQgKi8KLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfQU1SCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfUENNCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX01QMwotI2Vycm9yICJubyB3cml0ZXIgcmVnaXN0ZXJlZCIKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl9NUDMgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl9QQ00gKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICovCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfQU1SICovCi0KLS8qIEluY2x1ZGUgZmlsZXMgZm9yIGVhY2ggd3JpdGVyIHRvIHN1YnNjcmliZSAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX0FNUgotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl9BTVJfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ci0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQCi1leHRlcm4gTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKCBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSogVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKTsKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX1BDTQotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl9QQ01fZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ci0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9NUDMKLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfTVAzX2dldEludGVyZmFjZXMoIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHZpZGVvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaCIKLQotCi0vKiBJbmNsdWRlIGZpbGVzIGZvciBlYWNoIHZpZGVvIGVuY29kZXIgdG8gc3Vic2NyaWJlICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0vLyNpbmNsdWRlICJNNE1QNEVfaW50ZXJmYWNlLmgiCi0jZW5kaWYKLQotCi0jZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgXAotICAgIGlmICgocG9pbnRlcikgPT0gTTRPU0FfTlVMTCkgcmV0dXJuICgoTTRPU0FfRVJSKShyZXR2YWwpKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfU3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyB0aGUgcmVhZGVyLCBkZWNvZGVycywgd3JpdGVycyBhbmQgZW5jb2RlcnMKLSAqICAgICAgICAgIGluIHRoZSBNQ1MuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQgaXMgTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhNNE1DU19Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRSRUFERVJfTWVkaWFUeXBlICAgICAgICAgIHJlYWRlck1lZGlhVHlwZTsKLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgcFJlYWRlckdsb2JhbEludGVyZmFjZTsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2U7Ci0KLSAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSAgICAgd3JpdGVyTWVkaWFUeXBlOwotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICBwV3JpdGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICBwV3JpdGVyRGF0YUludGVyZmFjZTsKLQotICAgIE00QURfVHlwZSAgICAgICAgICAgICAgICAgICBhdWRpb0RlY29kZXJUeXBlOwotICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCAgICAgICBhdWRpb0NvZGVjVHlwZTsKLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqIHBBdWRpb0NvZGVjSW50ZXJmYWNlOwotICAgIE00QURfSW50ZXJmYWNlKiAgICAgICAgICAgICBwQXVkaW9EZWNvZGVySW50ZXJmYWNlOwotCi0gICAgTTRERUNPREVSX1ZpZGVvVHlwZSAgICAgICAgIHZpZGVvRGVjb2RlclR5cGU7Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgICAgIHZpZGVvQ29kZWNUeXBlOwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqICBwVmlkZW9Db2RlY0ludGVyZmFjZTsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqICAgcFZpZGVvRGVjb2RlckludGVyZmFjZTsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpOwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgcmVhZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSAzR1AgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSAgICBlcnIgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UoJnJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSXzNHUCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclJlYWRlciggcENvbnRleHQsIHJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgM0dQIHJlYWRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAqLwotCi0gICAgLyogLS0tIEFNUiAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUgotICAgIGVyciA9IE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzKCAgICZyZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBBTVIgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SICovCi0KLSAgICAvKiAtLS0gTVAzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2UoJnJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX01QMyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclJlYWRlciggcENvbnRleHQsIHJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgTVAzIHJlYWRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMyAqLwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICB2aWRlbyBkZWNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gTVBFRzQgJiBIMjYzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFQ18zR1AKLQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9NUEVHNCggJnZpZGVvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopJnBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNERFQ09ERVJfTVBFRzQgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXIoICAgcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBNUEVHNCBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9WSURFQ18zR1AgKi8KLQotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFT19BVkMKLQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9IMjY0KCAmdmlkZW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKikmcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX0FWQyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlciggICBwQ29udGV4dCwgdmlkZW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIEFWQyBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9WSURFT19BVkMgKi8KLQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICBhdWRpbyBkZWNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gQU1STkIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKCZhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEFEIFBISUxJUFMgQU1STkIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoICAgcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBQSElMSVBTIEFNUk5CIGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CICovCi0KLSAgICAvKiAtLS0gQUFDIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19BQUMKLQotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoJmF1ZGlvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBRCBQSElMSVBTIEFBQyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlciggICBwQ29udGV4dCwgYXVkaW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIFBISUxJUFMgQUFDIGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX0FBQyAqLwotCi0gICAgLyogLS0tIE1QMyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfTVAzKCZhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUQgUEhJTElQUyBNUDMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoICAgcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBQSElMSVBTIE1QMyBkZWNvZGVyIik7Ci0jZW5kaWYgIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzICovCi0KLSAgICAvKiAtLS0gRVZSQyAtLS0gKi8KLQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSBQQ00gLS0tICovCi0KLQotICAgIC8qIC0tLSAzR1BQIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotICAgIC8qIHJldHJpZXZlcyB0aGUgM0dQUCB3cml0ZXIgbWVkaWEgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKCAgICZ3cml0ZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBXcml0ZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBXcml0ZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRXUklURVJfM0dQIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyV3JpdGVyKCBwQ29udGV4dCwgd3JpdGVyTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciAzR1BQIHdyaXRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAgKi8KLQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICB2aWRlbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gTVBFRzQgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSAgICAgICAvKiByZXRyaWV2ZXMgdGhlIE1QRUc0IGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9NUEVHNCgmdmlkZW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9NUEVHNCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlciggICBwQ29udGV4dCwgdmlkZW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gTVBFRzQgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNCAqLwotCi0gICAgLyogLS0tIEgyNjMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoJnZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9IMjYzIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKCBwQ29udGV4dCwgdmlkZW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIHZpZGVvIEgyNjMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNCAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQwotICAgIC8qIHJldHJpZXZlcyB0aGUgSDI2MyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NCgmdmlkZW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00SDI2NEUgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIHBDb250ZXh0LCB2aWRlb0NvZGVjVHlwZSwgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gSDI2NCBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQyAqLwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICBhdWRpbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gQU1SIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUgotICAgICAgIC8qIHJldHJpZXZlcyB0aGUgQU1SIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BTVJOQigmYXVkaW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEF1ZGlvQ29kZWNJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEFNUiBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciggICBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgYXVkaW8gQU1SIGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQU1SICovCi0KLSAgICAvKiAtLS0gQUFDIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FBQwotICAgIC8qIHJldHJpZXZlcyB0aGUgQUFDIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BQUMoJmF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBQUMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoICAgcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFBQyBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FBQyAqLwotCi0KLQotICAgIC8qIC0tLSBNUDMgLS0tICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QMwotICAgIC8qIHJldHJpZXZlcyB0aGUgTVAzIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9NUDMoJmF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDNFIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIE1QMyBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QMyAqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19WaWRlb1ByZVByb2Nlc3NpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ5ZjY4ZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19WaWRlb1ByZVByb2Nlc3NpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKLSAqIEBicmllZiAgTUNTIGltcGxlbWVudGF0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBlbmNvZGVyIGNhbGxiYWNrIG9mIHRoZSBNQ1MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW5jbHVkZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgICAgICAgLyogT1NBTCBtZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgICAgICAvKiBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotCi0vKiBDb3JlIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfRXJyb3JDb2Rlcy5oIgotCi0vKioKLSAqIFZpZGVvIHByZXByb2Nlc3NpbmcgaW50ZXJmYWNlIGRlZmluaXRpb24gKi8KLSNpbmNsdWRlICJNNFZQUF9BUEkuaCIKLQotLyoqCi0gKiBWaWRlbyBmaWx0ZXJzICovCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIgLyoqPCBmb3IgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAoKSAqLwotCi0jaWZuZGVmIE00TUNTX0FVRElPT05MWQotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLS8qKi8KLQotCi0KLQotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRBcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotICogQGJyaWVmICAgIERvIHRoZSB2aWRlbyByZW5kZXJpbmcgYW5kIHRoZSByZXNpemUgKGlmIG5lZWRlZCkKLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBNQ1MgaW50ZXJuYWwgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHBQbGFuZUluICAgIChJTikgQ29udGFpbnMgdGhlIGltYWdlCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0ICAgIChJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyBwbGFuZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00TUNTX0VSUl9WSURFT19ERUNPREVfRVJST1I6IHRoZSB2aWRlbyBkZWNvZGluZyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRNQ1NfRVJSX1JFU0laRV9FUlJPUjogdGhlIHJlc2l6aW5nIGZhaWxlZAotICogQHJldHVybiAgICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19pbnRBcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi17Ci0gICAgTTRPU0FfRVJSICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0vKiBUaGlzIHBhcnQgaXMgdXNlZCBvbmx5IGlmIHZpZGVvIGNvZGVjcyBhcmUgY29tcGlsZWQqLwotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSAgICAvKioKLSAgICAgKiBUaGUgVlBQIGNvbnRleHQgaXMgYWN0dWFsbHkgdGhlIE1DUyBjb250ZXh0ISAqLwotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KikocENvbnRleHQpOwotCi0gICAgTTRfTWVkaWFUaW1lIG10Q3RzID0gcEMtPmRWaURlY0N1cnJlbnRDdHM7Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIENsb3NpbmcgYWZ0ZXIgYW4gZXJyb3Igb2NjdXJlZCwgaXQgbWF5IGhhcHBlbiB0aGF0IHBSZWFkZXJWaWRlb0FVLT5tX2RhdGFBZGRyZXNzIGhhcwotICAgICAqIG5vdCBiZWVuIGFsbG9jYXRlZCB5ZXQuIFdoZW4gY2xvc2luZyBpbiBwYXVzZSBtb2RlLCB0aGUgZGVjb2RlciBjYW4gYmUgbnVsbC4KLSAgICAgKiBXZSBkb24ndCB3YW50IGFuIGVycm9yIHRvIGJlIHJldHVybmVkIGJlY2F1c2UgaXQgd291bGQgaW50ZXJydXB0IHRoZSBjbG9zZSBwcm9jZXNzIGFuZAotICAgICAqIHRodXMgc29tZSByZXNvdXJjZXMgd291bGQgYmUgbG9ja2VkLiBTbyB3ZSByZXR1cm4gTTROT19FUlJPUi4KLSAgICAgKi8KLSAgICAvKiBJbml0aWFsaXplIHRvIGJsYWNrIHBsYW5lIHRoZSBvdXRwdXQgcGxhbmUgaWYgdGhlIG1lZGlhIHJlbmRlcmluZwotICAgICBpcyBibGFjayBib3JkZXJzICovCi0gICAgaWYocEMtPk1lZGlhUmVuZGVyaW5nID09IE00TUNTX2tCbGFja0JvcmRlcnMpCi0gICAgewotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMF0ucGFjX2RhdGEsWV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0KnBQbGFuZU91dFswXS51X3N0cmlkZSkpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMV0ucGFjX2RhdGEsVV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0KnBQbGFuZU91dFsxXS51X3N0cmlkZSkpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0KnBQbGFuZU91dFsyXS51X3N0cmlkZSkpOwotICAgIH0KLSAgICBlbHNlIGlmICgoTTRPU0FfTlVMTCA9PSBwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzKSB8fAotICAgICAgICAgICAgIChNNE9TQV9OVUxMID09IHBDLT5wVmlEZWNDdHh0KSkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBXZSBtdXN0IGZpbGwgdGhlIGlucHV0IG9mIHRoZSBlbmNvZGVyIHdpdGggYSBkdW1teSBpbWFnZSwgYmVjYXVzZQotICAgICAgICAgKiBlbmNvZGluZyBub2lzZSBsZWFkcyB0byBhIGh1Z2UgdmlkZW8gQVUsIGFuZCB0aHVzIGEgd3JpdGVyIGJ1ZmZlciBvdmVyZmxvdy4gKi8KLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfc3RyaWRlICogcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICAgcFBsYW5lT3V0WzFdLnVfc3RyaWRlICogcFBsYW5lT3V0WzFdLnVfaGVpZ2h0KTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICAgcFBsYW5lT3V0WzJdLnVfc3RyaWRlICogcFBsYW5lT3V0WzJdLnVfaGVpZ2h0KTsKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50QXBwbHlWUFA6IHBSZWFkZXJWaWRlb0FVLT5tX2RhdGFBZGRyZXNzIGlzIE00T1NBX05VTEwsXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBpZihwQy0+aXNSZW5kZXJEdXAgPT0gTTRPU0FfRkFMU0UpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogICAgbV9wUHJlUmVzaXplRnJhbWUgZGlmZmVyZW50IHRoYW4gTTRPU0FfTlVMTCBtZWFucyB0aGF0IHJlc2l6aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cFByZVJlc2l6ZUZyYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiogRkIgMjAwOC8xMC8yMDoKLSAgICAgICAgICAgIFVzZWQgZm9yIGNyb3BwaW5nIGFuZCBibGFjayBib3JkZXJzKi8KLSAgICAgICAgICAgIE00QUlSX1BhcmFtcyBQYXJhbXM7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRBcHBseVZQUDogTmVlZCB0byByZXNpemUiKTsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcihwQy0+cFZpRGVjQ3R4dCwgJm10Q3RzLAotICAgICAgICAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRBcHBseVZQUDogbV9wRmN0UmVuZGVyIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHBDLT5NZWRpYVJlbmRlcmluZyA9PSBNNE1DU19rUmVzaXppbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBDYWxsIHRoZSByZXNpemUgZmlsdGVyLiBGcm9tIHRoZSBpbnRlcm1lZGlhdGUgZnJhbWUgdG8gdGhlIGVuY29kZXIKLSAgICAgICAgICAgICAgICAgKiBpbWFnZSBwbGFuZQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWUsIHBQbGFuZU91dCk7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludEFwcGx5VlBQOiBNNFZpRmlsUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lc1RlbXBbM107Ci0gICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZVRlbXA7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVkgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogcE91dFBsYW5lVSA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVWID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lWSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lVSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lViA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGkgPSAwOwotCi0gICAgICAgICAgICAgICAgLypGQiAyMDA4LzEwLzIwOiB0byBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0gICAgICAgICAgICAgICAgLypJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPnBQcmVSZXNpemVGcmFtZS0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBwQy0+cFByZVJlc2l6ZUZyYW1lLT51X3dpZHRoOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9iT3V0cHV0U3RyaXBlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgTWVkaWEgcmVuZGVyaW5nOiBCbGFjayBib3JkZXJzKi8KLSAgICAgICAgICAgICAgICBpZihwQy0+TWVkaWFSZW5kZXJpbmcgPT0gTTRNQ1Nfa0JsYWNrQm9yZGVycykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IHBQbGFuZU91dFsxXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZSA9IHBQbGFuZU91dFsxXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSBwUGxhbmVPdXRbMl0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUgPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlcyBwbGFuIGluIGxvY2FsIGltYWdlIHBsYW5lIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMF1cCi0gICAgICAgICAgICAgICAgICAgICAgICAudV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyWSIpIDsKLSAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gTTRNQ1NfaW50QXBwbHlWUFAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMV1cCi0gICAgICAgICAgICAgICAgICAgICAgICAudV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyVSIpIDsKLSAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gTTRNQ1NfaW50QXBwbHlWUFAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMl1cCi0gICAgICAgICAgICAgICAgICAgICAgICAudV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLChNNE9TQV9DaGFyICopIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJWIikgOwotICAgICAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciBhbGxvYyBpbiBNNE1DU19pbnRBcHBseVZQUCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVZID0gcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA7Ci0gICAgICAgICAgICAgICAgICAgIHBJblBsYW5lVSA9IHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgOwotICAgICAgICAgICAgICAgICAgICBwSW5QbGFuZVYgPSBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhIDsKLQotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhLFlfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+cFByZVJlc2l6ZUZyYW1lLT51X2hlaWdodCAqIHBQbGFuZU91dC0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5wUHJlUmVzaXplRnJhbWUtPnVfd2lkdGgpIDw9IHBQbGFuZU91dC0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPCBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+cFByZVJlc2l6ZUZyYW1lLT51X2hlaWdodCAqIHBQbGFuZU91dC0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+cFByZVJlc2l6ZUZyYW1lLT51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qbnVtYmVyIG9mIGxpbmVzIGF0IHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KT4+MSkpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE1DU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaXQgaXMgd2lkdGggc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5wUHJlUmVzaXplRnJhbWUtPnVfd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwUGxhbmVPdXQtPnVfaGVpZ2h0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5wUHJlUmVzaXplRnJhbWUtPnVfaGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoLVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKT4+MSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoLVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aC1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLypXaWR0aCBhbmQgaGVpZ2h0IGhhdmUgdG8gYmUgZXZlbiovCi0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSAocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQ+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgIC8qQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPT0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwSW1hZ2VQbGFuZXNUZW1wOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgIE1lZGlhIHJlbmRlcmluZzogQ3JvcHBpbmcqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5NZWRpYVJlbmRlcmluZyA9PSBNNE1DU19rQ3JvcHBpbmcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBpZigoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypoZWlnaHQgd2lsbCBiZSBjcm9wcGVkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5wUHJlUmVzaXplRnJhbWUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSk+PjEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyp3aWR0aCB3aWxsIGJlIGNyb3BwZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocEMtPnBQcmVSZXNpemVGcmFtZS0+dV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgPT0gcEMtPm1fYWlyX2NvbnRleHQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNEFJUl9jcmVhdGUoJnBDLT5tX2Fpcl9jb250ZXh0LCBNNEFJUl9rWVVWNDIwUCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBpbml0aWFsaXppbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEFJUl9jb25maWd1cmUocEMtPm1fYWlyX2NvbnRleHQsICZQYXJhbXMpOwotICAgICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBjb25maWd1cmluZyBBSVI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEFJUl9nZXQocEMtPm1fYWlyX2NvbnRleHQsIHBDLT5wUHJlUmVzaXplRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXApOwotICAgICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBnZXR0aW5nIEFJUiBwbGFuZTogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKHBDLT5NZWRpYVJlbmRlcmluZyA9PSBNNE1DU19rQmxhY2tCb3JkZXJzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMF0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCAgICh2b2lkICopcE91dFBsYW5lWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBJblBsYW5lWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMF0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW5QbGFuZVkgKz0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0UGxhbmVZICs9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFsxXS51X2hlaWdodDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoICAgKHZvaWQgKilwT3V0UGxhbmVVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEluUGxhbmVVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFsxXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJblBsYW5lVSArPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQbGFuZVUgKz0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzJdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggICAodm9pZCAqKXBPdXRQbGFuZVYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwSW5QbGFuZVYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVWICs9IHBQbGFuZU91dFsyXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcE91dFBsYW5lViArPSBwUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDM7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50QXBwbHlWUFA6IERvbid0IG5lZWQgcmVzaXppbmciKTsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcihwQy0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXRDdHMsIHBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50QXBwbHlWUFA6IG1fcEZjdFJlbmRlciByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBDLT5sYXN0RGVjb2RlZFBsYW5lID0gcFBsYW5lT3V0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBDb3B5IGxhc3QgZGVjb2RlZCBwbGFuZSB0byBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICogcFBsYW5lT3V0WzBdLnVfd2lkdGgpKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQbGFuZU91dFsxXS51X2hlaWdodCAqIHBQbGFuZU91dFsxXS51X3dpZHRoKSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmxhc3REZWNvZGVkUGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChwUGxhbmVPdXRbMl0udV9oZWlnaHQgKiBwUGxhbmVPdXRbMl0udV93aWR0aCkpOwotICAgICAgICBwQy0+bGFzdERlY29kZWRQbGFuZSA9IHBQbGFuZU91dDsKLSAgICB9Ci0KLQotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50QXBwbHlWUFA6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjYWExNWIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGlidnNzCi0jCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFOj0gbGlidmlkZW9lZGl0b3JfY29yZQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgICBNNFBUTzNHUFBfQVBJLmMgXAotICAgICAgTTRQVE8zR1BQX1ZpZGVvUHJlUHJvY2Vzc2luZy5jIFwKLSAgICAgIE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwLmMgXAotICAgICAgTTR4VlNTX0FQSS5jIFwKLSAgICAgIE00eFZTU19pbnRlcm5hbC5jIFwKLSAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZy5jIFwKLSAgICAgIE00VlNTM0dQUF9DbGlwLmMgXAotICAgICAgTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jIFwKLSAgICAgIE00VlNTM0dQUF9Db2RlY3MuYyBcCi0gICAgICBNNFZTUzNHUFBfRWRpdC5jIFwKLSAgICAgIE00VlNTM0dQUF9FZGl0QXVkaW8uYyBcCi0gICAgICBNNFZTUzNHUFBfRWRpdFZpZGVvLmMgXAotICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYyBcCi0gICAgICBNNENoYW5uZWxDb252ZXJ0ZXIuYyBcCi0gICAgICBNNFZEX0VYVEVSTkFMX0JpdHN0cmVhbVBhcnNlci5jIFwKLSAgICAgIE00QUlSX0FQSS5jIFwKLSAgICAgIE00UkVBREVSX1BjbS5jIFwKLSAgICAgIE00UENNUl9Db3JlUmVhZGVyLmMgXAotICAgICAgTTRBRF9OdWxsLmMgXAotICAgICAgTTRBTVJSX0NvcmVSZWFkZXIuYyBcCi0gICAgICBNNFJFQURFUl9BbXIuYyBcCi0gICAgICBNNFZEX1Rvb2xzLmMgXAotICAgICAgVmlkZW9FZGl0b3JSZXNhbXBsZXIuY3BwIFwKLSAgICAgIE00REVDT0RFUl9OdWxsLmMKLQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgIFwKLSAgICBsaWJhdWRpb2ZsaW5nZXIgICAgICAgICAgICAgXAotICAgIGxpYmF1ZGlvdXRpbHMgICAgICAgICAgICAgICBcCi0gICAgbGliYmluZGVyICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJjdXRpbHMgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmxvZyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWEgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodCAgICAgICAgICAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gICBcCi0gICAgbGlic3RhZ2VmcmlnaHRfb214ICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgICAgICAgICBcCi0gICAgbGlidmlkZW9lZGl0b3JfdmlkZW9maWx0ZXJzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcnBsYXllciAgICAgICAgXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9tY3MgXAotICAgIGxpYnZpZGVvZWRpdG9yX3N0YWdlZnJpZ2h0c2hlbGxzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl8zZ3B3cml0ZXIgXAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAotICAgICQoVE9QKS9zeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlIFwKLSAgICAkKFRPUCkvc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUKLQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi0KLSMgQWxsIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHdlIGxpbmsgYWdhaW5zdC4KLUxPQ0FMX0xETElCUyA6PSBcCi0gICAgLWxwdGhyZWFkIC1sZGwKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIFwKLSAgICAtRE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0VubyBcCi0gICAgLURERUNPREVfR0lGX09OX1NBVklORwotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QURfTnVsbC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFEX051bGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2QxZWM3My4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QURfTnVsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNEFEX051bGwuYwotICogQGJyaWVmICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIE1QMyBkZWNvZGVyIHB1YmxpYyBpbnRlcmZhY2UKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgIm51bGwiIGF1ZGlvIGRlY29kZXIsIHRoYXQgaXMgYSBkZWNvZGVyCi0gKiAgICAgICAgICB0aGF0IGRvIG5vdGhpbmcgZXhjZXB0IGdldHRpbmcgQVUgZnJvbSB0aGUgcmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRBRF9OdWxsLmgiCi0KLSNkZWZpbmUgTTRBRF9GT1JDRV8xNkJJVFMKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBOVUxMIEF1ZGlvIERlY29kZXIgdmVyc2lvbiBpbmZvcm1hdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSNkZWZpbmUgTTRBRF9OVUxMX01BSk9SICAgIDEKLSNkZWZpbmUgTTRBRF9OVUxMX01JTk9SICAgIDEKLSNkZWZpbmUgTTRBRF9OVUxMX1JFVklTSU9OIDQKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRBRF9OdWxsQ29udGV4dAotICogQGJyaWVmICAgICAgICBJbnRlcm5hbCBudWxsIGRlY29kZXIgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBQb2ludGVyIHRvIHRoZSBzdHJlYW0gaGFuZGxlciBwcm92aWRlZCBieSB0aGUgdXNlciAqLwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgbV9wQXVkaW9TdHJlYW1oYW5kbGVyOwotfSBNNEFEX051bGxDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTlhQIE1QMyBkZWNvZGVyIGZ1bmN0aW9ucyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG51bGwgZGVjb2RlcgotICogQG5vdGUgICAgQWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKE9VVCkgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAoSU4pICAgIFBvaW50ZXIgdG8gYW4gYXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gKiBAcGFyYW0gICAgcFVzZXJEYXRhOiAgICAgICAgKElOKSAgICBQb2ludGVyIHRvIFVzZXIgZGF0YQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgIE00QURfTlVMTF9jcmVhdGUoICBNNEFEX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpCi17Ci0gICAgTTRBRF9OdWxsQ29udGV4dCogcEM7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00QURfTlVMTF9jcmVhdGU6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNEFEX05VTExfY3JlYXRlOiBpbnZhbGlkIHBvaW50ZXIgcFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIHBDID0gKE00QURfTnVsbENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRBRF9OdWxsQ29udGV4dCksCi0gICAgICAgICAgICAgICAgIE00REVDT0RFUl9BVURJTywgKE00T1NBX0NoYXIgKikiTTRBRF9OdWxsQ29udGV4dCIpOwotICAgIGlmIChwQyA9PSAoTTRBRF9OdWxsQ29udGV4dCopMCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJDYW4gbm90IGFsbG9jYXRlIG51bGwgZGVjb2RlciBjb250ZXh0Iik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAqcENvbnRleHQgPSBwQzsKLQotICAgIHBDLT5tX3BBdWRpb1N0cmVhbWhhbmRsZXIgPSBwU3RyZWFtSGFuZGxlcjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBEZXN0cm95cyB0aGUgaW5zdGFuY2Ugb2YgdGhlIG51bGwgZGVjb2RlcgotICogQG5vdGUgICAgIEFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICoKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgIE00QURfTlVMTF9kZXN0cm95KE00QURfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00QURfTnVsbENvbnRleHQqIHBDID0gKE00QURfTnVsbENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKGNvbnRleHQgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwgIk00QURfTlVMTF9kZXN0cm95OiBpbnZhbGlkIGNvbnRleHQiKTsKLQotICAgIGZyZWUocEMpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgU2ltcGx5IG91dHB1dCB0aGUgZ2l2ZW4gYXVkaW8gZGF0YQotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgIHBJbnB1dEJ1ZmZlcjogICAgIChJTi9PVVQpSW5wdXQgRGF0YSBidWZmZXIuIEl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBhdWRpbyBmcmFtZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIHVwZGF0ZWQgaW5zaWRlIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byByZWZsZWN0IHRoZSBzaXplIG9mIHRoZSBhY3R1YWxseSBkZWNvZGVkIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHRoZSBmaXJzdCBmcmFtZSBpbiBwSW5wdXRCdWZmZXIpCi0gKiBAcGFyYW0gICBwRGVjb2RlZFBDTUJ1ZmZlcjogKE9VVCkgIE91dHB1dCBQQ00gYnVmZmVyIChkZWNvZGVkIGRhdGEpLgotICogQHBhcmFtICAganVtcGluZzogICAgICAgICAgIChJTikgICBNNE9TQV9UUlVFIGlmIGEganVtcCB3YXMganVzdCBkb25lLCBNNE9TQV9GQUxTRSBvdGhlcndpc2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgICBNNEFEX05VTExfc3RlcChNNEFEX0NvbnRleHQgY29udGV4dCwgTTRBRF9CdWZmZXIgKnBJbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX0J1ZmZlciAqcERlY29kZWRQQ01CdWZmZXIsIE00T1NBX0Jvb2wganVtcGluZykKLXsKLSAgICBNNEFEX051bGxDb250ZXh0KiBwQyA9IChNNEFEX051bGxDb250ZXh0Kiljb250ZXh0OwotCi0gICAgLypUaGUgVlBTIHNlbmRzIGEgemVybyBidWZmZXIgYXQgdGhlIGVuZCovCi0gICAgaWYgKDAgPT0gcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICB9Ci0KLSAgICBpZiAocElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUgPiBwRGVjb2RlZFBDTUJ1ZmZlci0+bV9idWZmZXJTaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0jaWZkZWYgTTRBRF9GT1JDRV8xNkJJVFMKLSAgICAvKmlmIHJlYWQgc2FtcGxlcyBhcmUgOCBiaXRzLCBjb21wbGV0ZSB0aGVtIHRvIDE2IGJpdHMqLwotICAgIGlmIChwQy0+bV9wQXVkaW9TdHJlYW1oYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID09IDEpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgaTsKLSAgICAgICAgTTRPU0FfSW50MTYgIHZhbDsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdmFsID0gKE00T1NBX0ludDE2KSgoTTRPU0FfVUludDgpKHBJbnB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzc1tpXSkgLSAxMjgpOwotCi0gICAgICAgICAgICBwRGVjb2RlZFBDTUJ1ZmZlci0+bV9kYXRhQWRkcmVzc1tpKjJdICAgPSAoTTRPU0FfSW50OCkodmFsPj44KTsKLSAgICAgICAgICAgIHBEZWNvZGVkUENNQnVmZmVyLT5tX2RhdGFBZGRyZXNzW2kqMisxXSA9IChNNE9TQV9JbnQ4KSh2YWwmMHgwMGZmKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRGVjb2RlZFBDTUJ1ZmZlci0+bV9kYXRhQWRkcmVzcywgKHZvaWQgKilwSW5wdXRCdWZmZXItPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmZlci0+bV9idWZmZXJTaXplICk7Ci0gICAgfQotI2Vsc2UgLypNNEFEX0ZPUkNFXzE2QklUUyovCi0gICAgbWVtY3B5KCh2b2lkICopcERlY29kZWRQQ01CdWZmZXItPm1fZGF0YUFkZHJlc3MsICh2b2lkICopcElucHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSApOwotI2VuZGlmIC8qTTRBRF9GT1JDRV8xNkJJVFMqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgR2V0cyB0aGUgZGVjb2RlciB2ZXJzaW9uCi0gKiBAbm90ZSAgICBUaGUgdmVyc2lvbiBpcyBnaXZlbiBpbiBhIE00X1ZlcnNpb25JbmZvIHN0cnVjdHVyZQotICoKLSAqIEBwYXJhbSAgIHBWYWx1ZTogICAgIChPVVQpICAgICAgIFBvaW50ZXIgdG8gdGhlIHZlcnNpb24gc3RydWN0dXJlCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIHBWZXJzaW9uSW5mbyBwb2ludGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgIE00QURfTlVMTF9nZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVmVyc2lvbkluZm8gPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00QURfTlVMTF9nZXRWZXJzaW9uOiBpbnZhbGlkIHBvaW50ZXIgcFZlcnNpb25JbmZvIik7Ci0KLSAgICAvKiBVcCB1bnRpbCBub3csIHRoZSBudWxsIGRlY29kZXIgdmVyc2lvbiBpcyBub3QgYXZhaWxhYmxlICovCi0KLSAgICAvKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0gICAgcFZlcnNpb25JbmZvLT5tX21ham9yICAgICAgICA9IE00QURfTlVMTF9NQUpPUjsgICAgICAvKm1ham9yIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yICAgICAgICA9IE00QURfTlVMTF9NSU5PUjsgICAgICAvKm1pbm9yIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0gICAgcFZlcnNpb25JbmZvLT5tX3JldmlzaW9uICAgID0gTTRBRF9OVUxMX1JFVklTSU9OOyAgICAvKnJldmlzaW9uIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0gICAgcFZlcnNpb25JbmZvLT5tX3N0cnVjdFNpemU9c2l6ZW9mKE00X1ZlcnNpb25JbmZvKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBnZXRJbnRlcmZhY2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMgb2YgTlhQIE1QMyBkZWNvZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiBSZXRyaWV2ZXMgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVjb2RlcgotICogQHBhcmFtIHBEZWNvZGVyVHlwZSAgICAgICAgOiBwb2ludGVyIG9uIGFuIE00QURfVHlwZSAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgZGVjb2RlciB0eXBlIHN1cHBvcnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGRlY29kZXIKLSAqIEBwYXJhbSBwRGVjb2RlckludGVyZmFjZSAgIDogYWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgaW50ZXJmYWNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgZGVjb2Rlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyLgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgaWYgT0sKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBRF9OVUxMX2dldEludGVyZmFjZSggTTRBRF9UeXBlICpwRGVjb2RlclR5cGUsIE00QURfSW50ZXJmYWNlICoqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgKnBEZWNvZGVySW50ZXJmYWNlID0gKCAgTTRBRF9JbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00QURfSW50ZXJmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfQVVESU8sIChNNE9TQV9DaGFyICopIk00QURfSW50ZXJmYWNlIiApOwotICAgIGlmIChNNE9TQV9OVUxMID09ICpwRGVjb2RlckludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAqcERlY29kZXJUeXBlID0gTTRBRF9rVHlwZVBDTTsKLQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyAgICAgICA9IE00QURfTlVMTF9jcmVhdGU7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyAgICAgID0gTTRBRF9OVUxMX2Rlc3Ryb3k7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFN0ZXBBdWRpb0RlYyAgICAgICAgID0gTTRBRF9OVUxMX3N0ZXA7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdEdldFZlcnNpb25BdWRpb0RlYyAgID0gTTRBRF9OVUxMX2dldFZlcnNpb247Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFN0YXJ0QXVkaW9EZWMgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0UmVzZXRBdWRpb0RlYyAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjICAgID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QUlSX0FQSS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFJUl9BUEkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjI4OTdiMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QUlSX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNEFJUl9BUEkuYwotICogQGJyaWVmICBBcmVhIG9mIEludGVyZXN0IFJlc2l6ZXIgIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jZGVmaW5lIE00QUlSX1lVVjQyMF9GT1JNQVRfU1VQUE9SVEVECi0jZGVmaW5lIE00QUlSX1lVVjQyMEFfRk9STUFUX1NVUFBPUlRFRAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QSUxBVElPTiBDSEVDS1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9CR1I1NjVfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9SR0I1NjVfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9CR1I4ODhfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9SR0I4ODhfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9KUEdfRk9STUFUX1NVUFBPUlRFRAotCi0jZXJyb3IgIlBsZWFzZSBkZWZpbmUgYXQgbGVhc3Qgb25lIGlucHV0IGZvcm1hdCBmb3IgdGhlIEFJUiBjb21wb25lbnQiCi0KLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5DTFVERVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqIE00QUlSIElOVEVSTkFMIFRZUEVTIERFRklOSVRJT05TICoqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICBNNEFJUl9TdGF0ZXMKLSAqIEBicmllZiAgICAgICBUaGUgZm9sbG93aW5nIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGludGVybmFsIHN0YXRlcyBvZiB0aGUgQUlSLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEFJUl9rQ3JlYXRlZCwgICAgICAgIC8qKjwgU3RhdGUgYWZ0ZXIgTTRBSVJfY3JlYXRlIGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIE00QUlSX2tDb25maWd1cmVkICAgICAgLyoqPCBTdGF0ZSBhZnRlciBNNEFJUl9jb25maWd1cmUgaGFzIGJlZW4gY2FsbGVkICovCi19TTRBSVJfU3RhdGVzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgICAgICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiB0aGUgQUlSLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00QUlSX1N0YXRlcyAgICAgICAgICAgIG1fc3RhdGU7ICAgICAgICAvKio8IEludGVybmFsIHN0YXRlICovCi0gICAgTTRBSVJfSW5wdXRGb3JtYXRUeXBlICAgbV9pbnB1dEZvcm1hdDsgIC8qKjwgSW5wdXQgZm9ybWF0IGxpa2UgWVVWNDIwUGxhbmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQjU2NSwgSlBHLCBldGMgLi4uICovCi0gICAgTTRBSVJfUGFyYW1zICAgICAgICAgICAgbV9wYXJhbXM7ICAgICAgIC8qKjwgQ3VycmVudCBpbnB1dCBQYXJhbWV0ZXIgb2YgIHRoZSBwcm9jZXNzaW5nICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfaW5jWzRdOyAgIC8qKjwgcmF0aW8gYmV0d2VlbiBpbnB1dCBhbmQgb3VwdXQgd2lkdGggZm9yIFlVViAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl95X2luY1s0XTsgICAvKio8IHJhdGlvIGJldHdlZW4gaW5wdXQgYW5kIG91cHV0IGhlaWdodCBmb3IgWVVWICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnRbNF07ICAgIC8qKjwgaG9yaXpvbnRhbCBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnRbNF07ICAgIC8qKjwgVmVydGljYWwgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl94X2FjY3VtWzRdOyAvKio8IHNhdmUgb2YgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl95X2FjY3VtWzRdOyAvKio8IHNhdmUgb2YgdmVydGljYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50OCogICAgICAgICAgICBwdThfZGF0YV9pbls0XTsgLyoqPCBTYXZlIG9mIGlucHV0IHBsYW5lIHBvaW50ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSBvZiBzdHJpcGUgbW9kZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fcHJvY1Jvd3M7ICAgICAvKio8IE51bWJlciBvZiBwcm9jZXNzZWQgcm93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiBzdHJpcGUgbW9kZSBvbmx5ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBtX2JPbmx5Q29weTsgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGp1c3QgcGVyZm9ybSBhIGNvcHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBtX2JGbGlwWDsgICAgIC8qKjwgRGVwZW5kIG9uIG91dHB1dCBvcmllbnRhdGlvbiwgdXNlZCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgdG8gcmV2ZXJ0IHByb2Nlc3Npbmcgb3JkZXIgaW4gWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIG1fYkZsaXBZOyAgICAgLyoqPCBEZXBlbmQgb24gb3V0cHV0IG9yaWVudGF0aW9uLCB1c2VkIGR1cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyB0byByZXZlcnQgcHJvY2Vzc2luZyBvcmRlciBpbiBZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgbV9iUmV2ZXJ0WFk7ICAvKio8IERlcGVuZCBvbiBvdXRwdXQgb3JpZW50YXRpb24sIHVzZWQgZHVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRvIHJldmVydCBYIGFuZCBZIHByb2Nlc3Npbmcgb3JkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKy05MLAgcm90YXRpb24pICovCi19TTRBSVJfSW50ZXJuYWxDb250ZXh0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpXAotICAgICBpZiAoKHBvaW50ZXIpID09IE00T1NBX05VTEwpIHJldHVybiAoKE00T1NBX0VSUikocmV0dmFsKSk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgUFVCTElDIEFQSSBJTVBMRU1FTlRBVElPTiAqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgKElOL09VVCkgQWRkcmVzcyBvZiB0aGUgY29udGV4dCB0byBjcmVhdGUKLSAqIEBwYXJhbSAgICBpbnB1dEZvcm1hdDogICAoSU4pIGlucHV0IGZvcm1hdCB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLiBJbnZhbGlkIGZvcm1hdFR5cGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IGlzIGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRBSVJfY3JlYXRlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LE00QUlSX0lucHV0Rm9ybWF0VHlwZSBpbnB1dEZvcm1hdCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUiA7Ci0gICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0KiBwQyA9IE00T1NBX05VTEwgOwotCi0gICAgLyogQ2hlY2sgdGhhdCB0aGUgYWRkcmVzcyBvbiB0aGUgY29udGV4dCBpcyBub3QgTlVMTCAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgLyogSW50ZXJuYWwgQ29udGV4dCBjcmVhdGlvbiAqLwotICAgIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNEFJUl9JbnRlcm5hbENvbnRleHQpLAotICAgICAgICAgTTRBSVIsKE00T1NBX0NoYXIgKikiQUlSIGludGVybmFsIGNvbnRleHQiKSA7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIHBDKSA7Ci0KLQotICAgIC8qIENoZWNrIGlmIHRoZSBpbnB1dCBmb3JtYXQgaXMgc3VwcG9ydGVkICovCi0gICAgc3dpdGNoKGlucHV0Rm9ybWF0KQotICAgIHsKLSNpZmRlZiBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotICAgICAgICBjYXNlIE00QUlSX2tZVVY0MjBQOgotICAgICAgICBicmVhayA7Ci0jZW5kaWYKLSNpZmRlZiBNNEFJUl9ZVVY0MjBBX0ZPUk1BVF9TVVBQT1JURUQKLSAgICAgICAgY2FzZSBNNEFJUl9rWVVWNDIwQVA6Ci0gICAgICAgIGJyZWFrIDsKLSNlbmRpZgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZXJyID0gTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOwotICAgICAgICAgICAgZ290byBNNEFJUl9jcmVhdGVfY2xlYW51cCA7Ci0gICAgfQotCi0gICAgLyoqPCBTYXZlIGlucHV0IGZvcm1hdCBhbmQgdXBkYXRlIHN0YXRlICovCi0gICAgcEMtPm1faW5wdXRGb3JtYXQgPSBpbnB1dEZvcm1hdDsKLSAgICBwQy0+bV9zdGF0ZSA9IE00QUlSX2tDcmVhdGVkOwotCi0gICAgLyogUmV0dXJuIHRoZSBjb250ZXh0IHRvIHRoZSBjYWxsZXIgKi8KLSAgICAqcENvbnRleHQgPSBwQyA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci0KLU00QUlSX2NyZWF0ZV9jbGVhbnVwOgotICAgIC8qIEVycm9yIG1hbmFnZW1lbnQgOiB3ZSBkZXN0cm95IHRoZSBjb250ZXh0IGlmIG5lZWRlZCAqLwotICAgIGlmKE00T1NBX05VTEwgIT0gcEMpCi0gICAgewotICAgICAgICBmcmVlKHBDKSA7Ci0gICAgfQotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICByZXR1cm4gZXJyIDsKLX0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGRlc3Ryb3lzIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIgY29tcG9uZW50Ci0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UgdG8gZGVzdHJveQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogSW50ZXJuYWwgc3RhdGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyBmdW5jdGlvbiBjYWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRBSVJfY2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dCA7Ci0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7Ci0KLSAgICAvKio8IENoZWNrIHN0YXRlICovCi0gICAgaWYoKE00QUlSX2tDcmVhdGVkICE9IHBDLT5tX3N0YXRlKSYmKE00QUlSX2tDb25maWd1cmVkICE9IHBDLT5tX3N0YXRlKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0gICAgZnJlZShwQykgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotCi19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcykKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gd2lsbCBjb25maWd1cmUgdGhlIEFJUi4KLSAqIEBub3RlICAgIEl0IHdpbGwgc2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGNvb3JkaW5hdGVzIGFuZCBzaXplcywKLSAqICAgICAgICAgIGFuZCBpbmRpY2F0ZXMgaWYgd2Ugd2lsbCBwcm9jZWVkIGluIHN0cmlwZSBvciBub3QuCi0gKiAgICAgICAgICBJbiBjYXNlIGEgTTRBSVJfZ2V0IGluIHN0cmlwZSBtb2RlIHdhcyBvbiBnb2luZywgaXQgd2lsbCBjYW5jZWwgdGhpcyBwcmV2aW91cwotICogICAgICAgICAgcHJvY2Vzc2luZyBhbmQgcmVzZXQgdGhlIGdldCBwcm9jZXNzLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgICAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9iT3V0cHV0U3RyaXBlOihJTikgU3RyaXBlIG1vZGUuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9pbnB1dENvb3JkOiAgICAoSU4pIFgsWSBjb29yZGluYXRlcyBvZiB0aGUgZmlyc3QgdmFsaWQgcGl4ZWwgaW4gaW5wdXQuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9pbnB1dFNpemU6ICAgIChJTikgaW5wdXQgUk9JIHNpemUuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9vdXRwdXRTaXplOiAgICAoSU4pIG91dHB1dCBzaXplLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gICAgTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOiB0aGUgcmVxdWVzdGVkIGlucHV0IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcykKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiAgICBpLHUzMl93aWR0aF9pbiwgdTMyX3dpZHRoX291dCwgdTMyX2hlaWdodF9pbiwgdTMyX2hlaWdodF9vdXQ7Ci0gICAgTTRPU0FfVUludDMyICAgIG5iX3BsYW5lczsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIGlmKE00QUlSX2tZVVY0MjBBUCA9PSBwQy0+bV9pbnB1dEZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDM7Ci0gICAgfQotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqIFNhdmUgcGFyYW1ldGVycyAqLwotICAgIHBDLT5tX3BhcmFtcyA9ICpwUGFyYW1zOwotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBpbnB1dCZvdXRwdXQgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgICAgICBpZiggKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpJjB4MSkgICAgfHwKLSAgICAgICAgICAgICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSYweDEpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUlSX0lMTEVHQUxfRlJBTUVfU0laRTsKLSAgICAgICAgfQotCi0gICAgIGlmKCAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSYweDEpICAgIHx8Ci0gICAgICAgICAgICAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSYweDEpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUlSX0lMTEVHQUxfRlJBTUVfU0laRTsKLSAgICAgICAgfQotICAgIGlmKCgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpID09IChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAmJigocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSA9PSAocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpKQotICAgIHsKLSAgICAgICAgLyoqPCBObyByZXNpemUgaW4gdGhpcyBjYXNlLCB3ZSB3aWxsIGp1c3QgY29weSBpbnB1dCBpbiBvdXRwdXQgKi8KLSAgICAgICAgcEMtPm1fYk9ubHlDb3B5ID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPm1fYk9ubHlDb3B5ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyoqPCBJbml0aWFsaXplIGludGVybmFsIHZhcmlhYmxlcyB1c2VkIGZvciByZXNpemUgZmlsdGVyICovCi0gICAgICAgIGZvcihpPTA7aTxuYl9wbGFuZXM7aSsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHUzMl93aWR0aF9pbiA9ICgoaT09MCl8fChpPT0zKSk/cEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg6XAotICAgICAgICAgICAgICAgIChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl9oZWlnaHRfaW4gPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDpcCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl93aWR0aF9vdXQgPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDpcCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl9oZWlnaHRfb3V0ID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OlwKLSAgICAgICAgICAgICAgICAocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCsxKT4+MTsKLQotICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGguKi8KLSAgICAgICAgICAgICAgICBpZiAodTMyX3dpZHRoX291dCA+PSB1MzJfd2lkdGhfaW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfaW5jW2ldICAgPSAoKHUzMl93aWR0aF9pbi0xKSAqIDB4MTAwMDApIC8gKHUzMl93aWR0aF9vdXQtMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9pbmNbaV0gICA9ICh1MzJfd2lkdGhfaW4gKiAweDEwMDAwKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQuKi8KLSAgICAgICAgICAgICAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9pbmNbaV0gICA9ICgodTMyX2hlaWdodF9pbiAtIDEpICogMHgxMDAwMCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9pbmNbaV0gPSAodTMyX2hlaWdodF9pbiAqIDB4MTAwMDApIC8gKHUzMl9oZWlnaHRfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9pbmNbaV0gPj0gMHgxMDAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbm5hbCBwYXJ0LCBhc3NpbXVuZyB0aGF0IGludGVnZXIgIHBhcnQgaXMgY29kZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSAxNiBoaWdoIGJpdHMgYW5kIHRoZSBmcmFjdGlvbm5hbCBvbiB0aGUgMTUgbG93IGJpdHMKLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID0gcEMtPnUzMl95X2luY1tpXSAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID0gMHgxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA+Pj0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqPCBUYWtlIGludG8gYWNjb3VudCB0aGF0IFkgY29vcmRpbmF0ZSBjYW4gYmUgb2RkCi0gICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHB1dCBhIDAuNSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgZm9yIFUgYW5kIFYgcGxhbmUgYXMgdGhlcmUgYSAyIHRpbWVzIHN1Yi1zYW1wbGVkIHZzIFkqLwotICAgICAgICAgICAgICAgIGlmKChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feSYweDEpJiYoKGk9PTEpfHwoaT09MikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldICs9IDB4ODAwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4KLSAgICAgICAgICAgICAgICAgICAgMCBhbmQgMC41Ci0gICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3hfaW5jW2ldID49IDB4MTAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPSBwQy0+dTMyX3hfaW5jW2ldICYgMHhmZmZmOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPSAweDEwMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID4+PSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKio8IFRha2UgaW50byBhY2NvdW50IHRoYXQgWCBjb29yZGluYXRlIGNhbiBiZSBvZGQKLSAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gcHV0IGEgMC41IG9mZnNldAotICAgICAgICAgICAgICAgICAgICBmb3IgVSBhbmQgViBwbGFuZSBhcyB0aGVyZSBhIDIgdGltZXMgc3ViLXNhbXBsZWQgdnMgWSovCi0gICAgICAgICAgICAgICAgaWYoKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV94JjB4MSkmJigoaT09MSl8fChpPT0yKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gKz0gMHg4MDAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgUmVzZXQgdmFyaWFibGUgdXNlZCBmb3Igc3RyaXBlIG1vZGUgKi8KLSAgICBwQy0+bV9wcm9jUm93cyA9IDA7Ci0KLSAgICAvKio8IEluaXRpYWxpemUgdmFyIGZvciBYL1kgcHJvY2Vzc2luZyBvcmRlciBhY2NvcmRpbmcgdG8gb3JpZW50YXRpb24gKi8KLSAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9GQUxTRTsKLSAgICBzd2l0Y2gocFBhcmFtcy0+bV9vdXRwdXRPcmllbnRhdGlvbikKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgotICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbVJpZ2h0OgotICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRUb3A6Ci0gICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3A6Ci0gICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbToKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIC8qKjwgVXBkYXRlIHN0YXRlICovCi0gICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ29uZmlndXJlZDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSB0aGUgcmVxdWVzdGVkIHJlc2l6ZWQgYXJlYSBvZiBpbnRlcmVzdCBhY2NvcmRpbmcgdG8KLSAqICAgICAgICAgIHNldHRpbmdzICBwcm92aWRlZCBpbiBNNEFJUl9jb25maWd1cmUuCi0gKiBAbm90ZSAgICBJbiBjYXNlIHRoZSBpbnB1dCBmb3JtYXQgdHlwZSBpcyBKUEVHLCBpbnB1dCBwbGFuZShzKQotICogICAgICAgICAgaW4gcEluIGlzIG5vdCB1c2VkLiBJbiBub3JtYWwgbW9kZSwgZGltZW5zaW9uIHNwZWNpZmllZCBpbiBvdXRwdXQgcGxhbmUocykgc3RydWN0dXJlCi0gKiAgICAgICAgICBtdXN0IGJlIHRoZSBzYW1lIHRoYW4gdGhlIG9uZSBzcGVjaWZpZWQgaW4gTTRBSVJfY29uZmlndXJlLiBJbiBzdHJpcGUgbW9kZSwgb25seSB0aGUKLSAqICAgICAgICAgIHdpZHRoIHdpbGwgYmUgdGhlIHNhbWUsIGhlaWdodCB3aWxsIGJlIHRha2VuIGFzIHRoZSBzdHJpcGUgaGVpZ2h0ICh0eXBpY2FsbHkgMTYpLgotICogICAgICAgICAgSW4gbm9ybWFsIG1vZGUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbCBvbmNlIHRvIGdldCB0aGUgZnVsbCBvdXRwdXQgcGljdHVyZS4KLSAqICAgICAgICAgIEluIHN0cmlwZSBtb2RlLCBpdCBpcyBjYWxsZWQgZm9yIGVhY2ggc3RyaXBlIHRpbGwgdGhlIHdob2xlIHBpY3R1cmUgaGFzIGJlZW4KLSAqICAgICAgICAgIHJldHJpZXZlZCxhbmQgIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3V0cHV0IHN0cmlwZSBpbiB0aGUgb3V0cHV0IHBpY3R1cmUKLSAqICAgICAgICAgIGlzIGludGVybmFsbHkgaW5jcmVtZW50ZWQgYXQgZWFjaCBzdGVwLgotICogICAgICAgICAgQW55IGNhbGwgdG8gTTRBSVJfY29uZmlndXJlIGR1cmluZyBzdHJpcGUgcHJvY2VzcyB3aWxsIHJlc2V0IHRoaXMgb25lIHRvIHRoZQotICogICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgcGljdHVyZS4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZQotICogQHBhcmFtICAgIHBJbjogICAgICAgICAgICAoSU4pIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIGlucHV0IFBsYW5lKHMpLgotICogQHBhcmFtICAgIHBPdXQ6ICAgICAgICAoSU4vT1VUKSAgUGxhbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgb3V0cHV0IFBsYW5lKHMpLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00QUlSX2dldChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEluLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dCkKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiBpLGosayx1MzJfeF9mcmFjLHUzMl95X2ZyYWMsdTMyX3hfYWNjdW0sdTMyX3lfYWNjdW0sdTMyX3NoaWZ0OwotICAgICAgICBNNE9TQV9VSW50OCAgICAqcHU4X2RhdGFfaW4sICpwdThfZGF0YV9pbl9vcmcsICpwdThfZGF0YV9pbl90bXAsICpwdThfZGF0YV9vdXQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICAgICpwdThfc3JjX3RvcDsKLSAgICAgICAgTTRPU0FfVUludDggICAgKnB1OF9zcmNfYm90dG9tOwotICAgIE00T1NBX1VJbnQzMiAgICB1MzJfdGVtcF92YWx1ZTsKLSAgICBNNE9TQV9JbnQzMiAgICBpMzJfdG1wX29mZnNldDsKLSAgICBNNE9TQV9VSW50MzIgICAgbmJfcGxhbmVzOwotCi0KLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIC8qKjwgQ2hlY2sgc3RhdGUgKi8KLSAgICBpZihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICBpZihNNEFJUl9rWVVWNDIwQVAgPT0gcEMtPm1faW5wdXRGb3JtYXQpCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSAzOwotICAgIH0KLQotICAgIC8qKjwgTG9vcCBvbiBlYWNoIFBsYW5lICovCi0gICAgZm9yKGk9MDtpPG5iX3BsYW5lcztpKyspCi0gICAgewotCi0gICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLQotICAgICAgICB1MzJfc2hpZnQgPSAoKGk9PTApfHwoaT09MykpPzA6MTsgLyoqPCBEZXBlbmQgb24gTHVtYSBvciBDaHJvbWEgKi8KLQotICAgICAgICBpZigoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSlcCi0gICAgICAgICAgICB8fCgoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKSYmKDAgPT0gcEMtPm1fcHJvY1Jvd3MpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBGb3IgaW5wdXQsIHRha2UgY2FyZSBhYm91dCBST0kgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luICAgICA9IHBJbltpXS5wYWNfZGF0YSArIHBJbltpXS51X3RvcGxlZnQgXAotICAgICAgICAgICAgICAgICsgKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV94Pj51MzJfc2hpZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICArIChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feSA+PiB1MzJfc2hpZnQpICogcEluW2ldLnVfc3RyaWRlOwotCi0gICAgICAgICAgICAvKiogR28gYXQgZW5kIG9mIGxpbmUvY29sdW1uIGluIGNhc2UgWC9ZIHNjYW5uaW5nIGlzIGZsaXBwZWQgKi8KLSAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9ICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj51MzJfc2hpZnQpIC0xIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fYkZsaXBZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9ICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj51MzJfc2hpZnQpIC0xKVwKLSAgICAgICAgICAgICAgICAgICAgICogcEluW2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEluaXRpYWxpemUgYWNjdW11bGF0b3JzIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGl0IChiaWxpbmVhciBpbnRlcnBvbGF0aW9uKSAqLwotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5tX2JPbmx5Q29weSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1baV0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0gICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUgZm9yIG90aGVyIHRoYW4gZmlyc3Qgc3RyaXBlLCB3ZSBuZWVkIHRvIHJlY292ZXIgaW5wdXQKLSAgICAgICAgICAgICAgICAgcG9pbnRlciBmcm9tIGludGVybmFsIGNvbnRleHQgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcEMtPnB1OF9kYXRhX2luW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiBldmVyeSBtb2RlLCBvdXRwdXQgZGF0YSBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX291dCAgICA9IHBPdXRbaV0ucGFjX2RhdGEgKyBwT3V0W2ldLnVfdG9wbGVmdDsKLQotICAgICAgICAvKio8IEluaXRpYWxpemUgaW5wdXQgb2Zmc2V0IGFwcGxpZWQgYWZ0ZXIgZWFjaCBwaXhlbCAqLwotICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkzMl90bXBfb2Zmc2V0ID0gcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaTMyX3RtcF9vZmZzZXQgPSAtcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiB0aGlzIGNhc2UsIG5vIGJpbGluZWFyIGludGVycG9sYXRpb24gaXMgbmVlZGVkIGFzIGlucHV0IGFuZCBvdXRwdXQgZGltZW5zaW9ucwotICAgICAgICAgICAgYXJlIHRoZSBzYW1lICovCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5tX2JPbmx5Q29weSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBObyArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgTm8gZmxpcCBvbiBYIGFic2Npc3NhICovCi0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb3B5IG9uZSB3aG9sZSBsaW5lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwdThfZGF0YV9vdXQsICh2b2lkICopcHU4X2RhdGFfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRbaV0udV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSBwSW5baV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gLT0gcEluW2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHBpeGVsIG9mIDEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAqcHU4X2RhdGFfaW4tLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSAocE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9IHBPdXRbaV0udV93aWR0aCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKio8IEhlcmUgd2UgaGF2ZSBhICstOTCwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl90bXAgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBwaXhlbCBvZiAxIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKnB1OF9kYXRhX2luX3RtcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgaW5wdXQgcG9pbnRlciBpbiBvcmRlciB0byBnbyB0byBuZXh0L3Bhc3QgbGluZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fdG1wICs9IGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IChwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luIC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKjwgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotICAgICAgICBpZigzICE9IGkpICAgIC8qKjwgb3RoZXIgdGhhbiBhbHBoYSBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKipObyArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHBDLT51MzJfeV9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtICh1MzJfeF9hY2N1bSA+PiAxNikpIC0xIDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl95X2FjY3VtW2ldPj4xNikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3lfYWNjdW1baV0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIC8qKiArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX29yZyA9IHB1OF9kYXRhX2luOwotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHBDLT51MzJfeF9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXTsKLQotICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNikpIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1baV0gKz0gcEMtPnUzMl94X2luY1tpXTsKLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luX29yZzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0vKiogMyAhPSBpICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvKipObyArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHBDLT51MzJfeV9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAodTMyX3hfYWNjdW0gPj4gMTYpKSAtMSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlPSAodTMyX3RlbXBfdmFsdWUgPj4gNykqMHhmZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9hY2N1bVtpXT4+MTYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl95X2FjY3VtW2ldID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IC8qKjwgTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZICovCi0gICAgICAgICAgICAvKiogKy05MLAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl9vcmcgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9IChwQy0+dTMyX3hfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpKSAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bSA+PiAxMikmMTU7IC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldICs9IHBDLT51MzJfeF9pbmNbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbl9vcmc7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAvKio8IE00T1NBX1RSVUUgPT0gcEMtPm1fYlJldmVydFhZICovCi0gICAgICAgIH0vKiogMyA9PSBpICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKjwgSW4gY2FzZSBvZiBzdHJpcGUgbW9kZSwgc2F2ZSBjdXJyZW50IGlucHV0IHBvaW50ZXIgKi8KLSAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+cHU4X2RhdGFfaW5baV0gPSBwdThfZGF0YV9pbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgVXBkYXRlIG51bWJlciBvZiBwcm9jZXNzZWQgcm93cywgcmVzZXQgaXQgaWYgd2UgaGF2ZSBmaW5pc2hlZAotICAgICAgICAgd2l0aCB0aGUgd2hvbGUgcHJvY2Vzc2luZyAqLwotICAgIHBDLT5tX3Byb2NSb3dzICs9IHBPdXRbMF0udV9oZWlnaHQ7Ci0gICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgIHsKLSAgICAgICAgaWYocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA8PSBwQy0+bV9wcm9jUm93cykgICAgcEMtPm1fcHJvY1Jvd3MgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZihwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPD0gcEMtPm1fcHJvY1Jvd3MpICAgIHBDLT5tX3Byb2NSb3dzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBTVJSX0NvcmVSZWFkZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBTVJSX0NvcmVSZWFkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjMwZjlkYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QU1SUl9Db3JlUmVhZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00QU1SUl9Db3JlUmVhZGVyLmMKLSAqIEBicmllZiAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBBTVIgcGFyc2VyCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBUEkgSW1wbGVtZW50YXRpb24gZm9yCi0gKiAgICAgICAgICAgICAgQU1SIFBhcnNlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaW5jbHVkZSAiTTRBTVJSX0NvcmVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1heGltdW0gYml0cmF0ZSBwZXIgYW1yIHR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00QU1SUl9OQl9NQVhfQklUX1JBVEUgICAgMTIyMDAKLSNkZWZpbmUgTTRBTVJSX1dCX01BWF9CSVRfUkFURSAgICAyMzg1MAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFNUiByZWFkZXIgY29udGV4dCBJRAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRBTVJSX0NPTlRFWFRJRCAgICAweDQxNGQ1MjUyCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQW4gQU1SIGZyYW1lIGlzIDIwbXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00QU1SUl9GUkFNRV9MRU5HVEggICAgIDIwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRm9yIHRoZSBzZWVrLCB0aGUgZmlsZSBpcyBzcGxpdHRlZCBpbiA0MCBzZWdtZW50cyBmb3IgZmFzdGVyIHNlYXJjaAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgICAgTTRBTVJSX05VTV9TRUVLX0VOVFJJRVMgNDAKLQotI2RlZmluZSBNNEFNUlJfTkJfU0FNUExFX0ZSRVFVRU5DWSA4MDAwICAgICAgICAvKio8IE5hcnJvdyBiYW5kIHNhbXBsaW5nIHJhdGUgKi8KLSNkZWZpbmUgTTRBTVJSX1dCX1NBTVBMRV9GUkVRVUVOQ1kgMTYwMDAgICAgLyoqPCBXaWRlIGJhbmQgc2FtcGxpbmcgcmF0ZSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFNUiByZWFkZXIgdmVyc2lvbiBudW1iZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyogQ0hBTkdFX1ZFUlNJT05fSEVSRSAqLwotI2RlZmluZSBNNEFNUlJfVkVSU0lPTl9NQUpPUiAxCi0jZGVmaW5lIE00QU1SUl9WRVJTSU9OX01JTk9SIDExCi0jZGVmaW5lIE00QU1SUl9WRVJTSU9OX1JFVklTSU9OIDMKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfQU1SUl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIEludGVybmFsIEFNUiByZWFkZXIgY29udGV4dCBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICBtX2NvbnRleHRJZCA7ICAgICAgLyogRml4ZWQgSWQuIHRvIGNoZWNrIGZvciB2YWxpZCBDb250ZXh0Ki8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgbV9wT3NhRmlsZVB0ckZjdDsgIC8qIEZpbGUgZnVuY3Rpb24gcG9pbnRlciAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBtX3BTdHJlYW1IYW5kbGVyOyAgLyogU3RyZWFtIERlc2NyaXB0aW9uICovCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgIG1fcFNlZWtJbmRleDsgICAgICAvKiBTZWVrIEluZGV4IFRhYmxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgIG1fc2Vla0ludGVydmFsOyAgICAvKiBTdG9yZXMgdGhlIHNlZWsgSW50ZXJ2YWwgc3RvcmVkIGluIHRoZSBJbmRleCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICBtX21heEF1U2l6ZTsgICAgICAgLyogU3RvcmVzIHRoZSBtYXggQXUgU2l6ZSAqLwotICAgIE00T1NBX01lbUFkZHIzMiAgICAgICAgICBtX3BkYXRhQWRkcmVzczsgICAgLyogUG9pbnRlciB0byBzdG9yZSBBVSBkYXRhICovCi0gICAgTTRTWVNfU3RyZWFtVHlwZSAgICAgICAgIG1fc3RyZWFtVHlwZTsgICAgICAvKiBTdG9yZXMgdGhlIHN0cmVhbSB0eXBlIEFNUiBOQiBvciBXQiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICBtX3BBTVJGaWxlOyAgICAgICAgLyogRGF0YSBzdG9yYWdlICovCi0gICAgTTRBTVJSX1N0YXRlICAgICAgICAgICAgIG1fc3RhdHVzOyAgICAgICAgICAvKiBBTVIgUmVhZGVyIFN0YXR1cyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICBtX3N0cnVjdFNpemU7ICAgICAgLyogc2l6ZSBvZiBzdHJ1Y3R1cmUqLwotfSBNNF9BTVJSX0NvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUGFyc2VyIGludGVybmFsIGZ1bmN0aW9ucywgbm90IHVzYWJsZSBmcm9tIG91dHNpZGUgdGhlIHJlYWRlciBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRBdVNpemUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSk7Ci1NNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEJpdHJhdGUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRBdVNpemUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSkKLSAqIEBicmllZiAgICBJbnRlcm5hbCBmdW5jdGlvbiB0byB0aGUgQU1SIFBhcnNlciwgcmV0dXJucyB0aGUgQVUgc2l6ZSBvZiB0aGUgRnJhbWUKLSAqIEBub3RlICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBzdHJlYW0gdHlwZSBhbmQgdGhlIGZyYW1ldHlwZSBhbmQgcmV0dXJucyB0aGUKLSAqICAgICAgICAgICBmcmFtZSBsZW5naHQKLSAqIEBwYXJhbSAgICBmcmFtZVR5cGUoSU4pICAgIDogQU1SIGZyYW1lIHR5cGUKLSAqIEBwYXJhbSAgICBzdHJlYW1UeXBlKElOKSAgICA6IEFNUiBzdHJlYW0gdHlwZSBOQiBvciBXQgotICogQHJldHVybnMgIFRoZSBmcmFtZSBzaXplIGJhc2VkIG9uIHRoZSBmcmFtZSB0eXBlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEF1U2l6ZShNNE9TQV9VSW50MzIgZnJhbWVUeXBlLCAgTTRTWVNfU3RyZWFtVHlwZSBzdHJlYW1UeXBlKQotewotICAgIGNvbnN0IE00T1NBX1VJbnQzMiAgICBNNEFNUlJfTkJfQVVTSVpFW109ezEzLDE0LDE2LDE4LDIwLDIxLDI3LDMyLDYsNiw2fTsKLSAgICBjb25zdCBNNE9TQV9VSW50MzIgICAgTTRBTVJSX1dCX0FVU0laRVtdPXsxOCwyNCwzMywzNyw0MSw0Nyw1MSw1OSw2MSw2fTsKLQotICAgIGlmICggc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICkKLSAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRBTVJSX05CX0FVU0laRVtmcmFtZVR5cGVdOwotICAgIH0KLSAgICBlbHNlIC8qIE00U1lTX2tBTVJfV0IgKi8KLSAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRBTVJSX1dCX0FVU0laRVtmcmFtZVR5cGVdOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEJpdHJhdGUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSkKLSAqIEBicmllZiAgICBJbnRlcm5hbCBmdW5jdGlvbiB0byB0aGUgQU1SIFBhcnNlciwgcmV0dXJucyB0aGUgQml0IHJhdGUgb2YgdGhlIEZyYW1lCi0gKiBAbm90ZSAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgc3RyZWFtIHR5cGUgYW5kIHRoZSBmcmFtZXR5cGUgYW5kIHJldHVybnMgdGhlCi0gKiAgICAgICAgICAgYml0IHJhdGUgZm9yIHRoZSBnaXZlbiBmcmFtZS4KLSAqIEBwYXJhbSAgICBmcmFtZVR5cGUoSU4pICAgIDogQU1SIGZyYW1lIHR5cGUKLSAqIEBwYXJhbSAgICBzdHJlYW1UeXBlKElOKSAgICA6IEFNUiBzdHJlYW0gdHlwZSBOQiBvciBXQgotICogQHJldHVybnMgIFRoZSBmcmFtZSdzIGJpdCByYXRlIGJhc2VkIG9uIHRoZSBmcmFtZSB0eXBlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEJpdHJhdGUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSkKLXsKLSAgICBjb25zdCBNNE9TQV9VSW50MzIgICAgTTRBTVJSX05CX0JJVFJBVEVbXT0KLSAgICAgICAgezQ3NTAsNTE1MCw1OTAwLDY3MDAsNzQwMCw3OTUwLDEwMjAwLDEyMjAwLDEyMjAwLDEyMjAwLDEyMjAwfTsKLSAgICBjb25zdCBNNE9TQV9VSW50MzIgICAgTTRBTVJSX1dCX0JJVFJBVEVbXT0KLSAgICAgICAgezY2MDAsODg1MCwxMjY1MCwxNDI1MCwxNTg1MCwxODI1MCwxOTg1MCwyMzA1MCwyMzg1MCwxMjIwMH07Ci0KLSAgICBpZiAoIHN0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00QU1SUl9OQl9CSVRSQVRFW2ZyYW1lVHlwZV07Ci0gICAgfQotICAgIGVsc2UgLyogTTRTWVNfa0FNUl9XQiAqLwotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEFNUlJfV0JfQklUUkFURVtmcmFtZVR5cGVdOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfb3BlblJlYWQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVGdW5jdGlvbikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiAgICBwU3RyZWFtQ29udGV4dDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIGZpbGVQb3M7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTRFUlJfRklMRV9OT1RfRk9VTkQgOwotICAgIE00T1NBX1VJbnQzMiBzaXplIDsKLSAgICBNNE9TQV9VSW50MzIgZGF0YSA7Ci0gICAgTTRPU0FfQ2hhciAqTTRfVG9rZW47Ci0gICAgTTRPU0FfVUludDMyICp0b2tlblB0cjsKLQotICAgIC8qIEhlYWRlciBmb3IgQU1SIE5CICovCi0gICAgTTRPU0FfVUludDMyIE00X0FNUl8xICAgICAgID0gMHg0ZDQxMjEyMzsKLSAgICBNNE9TQV9VSW50MzIgTTRfQU1SX05CXzIgICAgPSAweDAwMDAwYTUyOwotCi0gICAgLyogSGVhZGVyIGZvciBBTVIgV0IgKi8KLSAgICBNNE9TQV9VSW50MzIgTTRfQU1SX1dCXzIgICAgPSAweDQyNTcyZDUyOwotICAgIE00T1NBX1VJbnQzMiBNNF9BTVJfV0JfMyAgICA9IDB4MDAwMDAwMGE7Ci0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlRGVzY3JpcHRvciksTTRFUlJfUEFSQU1FVEVSLCJGaWxlIERlc2MuIE00T1NBX05VTEwiKTsKLQotICAgIE00X1Rva2VuID0gKE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfTWVtQWRkcjMyKSozLCBNNEFNUl9SRUFERVIsCi0gICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopKCJNNF9Ub2tlbiIpKTsKLSAgICBpZihNNE9TQV9OVUxMID09IE00X1Rva2VuKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYzKChNNE9TQV9OVUxMID09IE00X1Rva2VuKSxNNEVSUl9BTExPQywiTWVtIEFsbG9jIGZhaWxlZCAtIE00X1Rva2VuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQyA7Ci0gICAgfQotCi0gICAgcFN0cmVhbUNvbnRleHQ9IChNNF9BTVJSX0NvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRfQU1SUl9Db250ZXh0KSwgTTRBTVJfUkVBREVSLAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikoInBTdHJlYW1Db250ZXh0IikpOwotICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpCi0gICAgewotICAgICAgICBmcmVlKE00X1Rva2VuKTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQyA7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCA9IE00QU1SUl9DT05URVhUSUQ7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RydWN0U2l6ZT1zaXplb2YoTTRfQU1SUl9Db250ZXh0KTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdD1wRmlsZUZ1bmN0aW9uIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEwgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlID0gTTRPU0FfTlVMTCA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzID0gTTRBTVJSX2tPcGVuaW5nIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4ID0gTTRPU0FfTlVMTCA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsID0gMDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemUgPSAwIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIGVycj1wU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+b3BlblJlYWQoJnBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAoTTRPU0FfQ2hhciopcEZpbGVEZXNjcmlwdG9yLE00T1NBX2tGaWxlUmVhZCApOwotICAgIGlmICggZXJyICE9IE00Tk9fRVJST1IgKQotICAgIHsKLSAgICAgICAgLyogTTRPU0FfREVCVUdfSUYzKChlcnIgIT0gTTROT19FUlJPUiksZXJyLCJGaWxlIG9wZW4gZmFpbGVkIik7ICovCi0gICAgICAgIGZyZWUocFN0cmVhbUNvbnRleHQpOwotICAgICAgICBmcmVlKE00X1Rva2VuKTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0gICAgICAgIHJldHVybiBlcnIgOwotICAgIH0KLQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rT3BlbmluZyA7Ci0KLSAgICBzaXplID0gNjsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00X1Rva2VuLCAmc2l6ZSk7Ci0gICAgaWYoc2l6ZSAhPSA2KQotICAgIHsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIHRva2VuUHRyID0gKE00T1NBX1VJbnQzMiopTTRfVG9rZW4gOwotICAgIC8qIENoZWNrIGZvciB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgaGVhZGVyIGNvbW1vbiB0byBXQiBhbmQgTkIqLwotICAgIGlmICgqdG9rZW5QdHIgIT0gTTRfQU1SXzEpCi0gICAgewotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgdG9rZW5QdHIrKzsKLSAgICBkYXRhID0gKnRva2VuUHRyICYgMHgwMDAwRkZGRiA7Ci0gICAgLyogQ2hlY2sgaWYgdGhlIG5leHQgcGFydCBpcyBOYXJyb3cgYmFuZCBoZWFkZXIgKi8KLSAgICBpZiAoZGF0YSE9IE00X0FNUl9OQl8yKQotICAgIHsKLSAgICAgICAgLyogU3RyZWFtIGlzIEFNUiBXaWRlIEJhbmQgKi8KLSAgICAgICAgZmlsZVBvcyA9IDQ7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJmZpbGVQb3MpOwotICAgICAgICBzaXplID0gNTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnJlYWREYXRhKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNF9Ub2tlbiwgJnNpemUpOwotICAgICAgICBpZihzaXplICE9IDUpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIHRva2VuUHRyPShNNE9TQV9VSW50MzIqKU00X1Rva2VuOwotICAgICAgICAvKiBDaGVjayBmb3IgdGhlIFdpZGUgYmFuZCBoYWRlciAqLwotICAgICAgICBpZigqdG9rZW5QdHIhPSBNNF9BTVJfV0JfMikKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgdG9rZW5QdHIrKzsKLSAgICAgICAgZGF0YSA9ICp0b2tlblB0ciAmIDB4MDAwMDAwRkYgOwotICAgICAgICBpZihkYXRhIT0gTTRfQU1SX1dCXzMpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPSBNNFNZU19rQU1SX1dCIDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU3RyZWFtIGlzIGEgTmFycm93IGJhbmQgc3RyZWFtICovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPSBNNFNZU19rQU1SIDsKLSAgICB9Ci0gICAgLyogIE5vIFByb2ZpbGUgbGV2ZWwgZGVmaW5lZCAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rT3BlbmVkOwotCi0gICAgZnJlZShNNF9Ub2tlbik7Ci0gICAgKnBDb250ZXh0ID0gcFN0cmVhbUNvbnRleHQgOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi1jbGVhbnVwOgotCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSkKLSAgICB7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5jbG9zZVJlYWQocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUpOwotICAgIH0KLQotICAgIGZyZWUoTTRfVG9rZW4pOwotICAgIGZyZWUocFN0cmVhbUNvbnRleHQpOwotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9BTVJfTk9UX0NPTVBMSUFOVDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiAgICBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotICAgIE00T1NBX0NoYXIgICAgICAgICAgICBmcmFtZUhlYWRlciwgZnJhbWVUeXBlIDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHNpemUsIGF1Q291bnQ9MDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIGZpbGVQb3M7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFN0cmVhbURlc2MpLE00RVJSX1BBUkFNRVRFUiwiU3RyZWFtIERlc2MuIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCAhPSBNNEFNUlJfQ09OVEVYVElEKSxNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICJCYWQgQ29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyAhPSBNNEFNUlJfa09wZW5lZCksIE00RVJSX1NUQVRFLCAiSW52YWxpZCBTdGF0ZSIpOwotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIpCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9TVFJFQU0gOwotICAgIH0KLQotICAgIHNpemUgPSAxOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkmZnJhbWVIZWFkZXIsICZzaXplKTsKLQotICAgIC8qIFhGRkYgRlhYWCAtPiBGIGlzIHRoZSBGcmFtZSB0eXBlICovCi0gICAgZnJhbWVUeXBlID0gKCBmcmFtZUhlYWRlciAmIDB4NzggKSA+PiAzIDsKLQotICAgIGlmICggZnJhbWVUeXBlID09IDE1ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19EQVRBX1lFVCA7Ci0gICAgfQotCi0gICAgaWYgKCggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICkgJiYgKCBmcmFtZVR5cGUgPiAxMSApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICB9Ci0KLSAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSAmJiAoIGZyYW1lVHlwZSA+IDkgKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FNUl9JTlZBTElEX0ZSQU1FX1RZUEU7Ci0gICAgfQotCi0gICAgLyogQXZlcmFnZSBiaXQgcmF0ZSBpcyBhc3NpZ25lZCB0aGUgYml0cmF0ZSBvZiB0aGUgZmlyc3QgZnJhbWUgKi8KLSAgICBwU3RyZWFtRGVzYy0+YXZlcmFnZUJpdHJhdGUgPSBNNEFNUlJfZ2V0Qml0cmF0ZShmcmFtZVR5cGUscFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICBmaWxlUG9zID0gLTE7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsCi0gICAgICAgICAmZmlsZVBvcyk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHBTdHJlYW1EZXNjICovCi0gICAgcFN0cmVhbURlc2MtPnByb2ZpbGVMZXZlbCA9IDB4RkYgOwotICAgIHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDAgOwotICAgIHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTCA7Ci0gICAgcFN0cmVhbURlc2MtPm1heEJpdHJhdGUgPSAocFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PQotICAgICAgICBNNFNZU19rQU1SICk/TTRBTVJSX05CX01BWF9CSVRfUkFURTpNNEFNUlJfV0JfTUFYX0JJVF9SQVRFOwotICAgIHBTdHJlYW1EZXNjLT5wcm9maWxlTGV2ZWwgPSAweEZGIDsKLSAgICBwU3RyZWFtRGVzYy0+c3RyZWFtSUQgPSAxOwotICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZTsKLQotICAgIC8qIFRpbWVzY2FsZSBlcXVhbHMgU2FtcGxpbmcgRnJlcXVlbmN5OiBOQi04MDAwIEh6LCBXQi0xNjAwMCBIeiAqLwotICAgIHBTdHJlYW1EZXNjLT50aW1lU2NhbGUgPSAocFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICk/ODAwMDoxNjAwMDsKLSAgICBwU3RyZWFtRGVzYy0+ZHVyYXRpb24gPSBNNE9TQV9USU1FX1VOS05PV047Ci0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlciA9Ci0gICAgICAgICAoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24pLAotICAgICAgICAgICAgIE00QU1SX1JFQURFUiwgKE00T1NBX0NoYXIgKikoInBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyIikpOwotICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogQ29weSB0aGUgU3RyZWFtIERlc2MuIGludG8gdGhlIENvbnRleHQgKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+YXZlcmFnZUJpdHJhdGUgPSBwU3RyZWFtRGVzYy0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmRlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZHVyYXRpb24gPSBNNE9TQV9USU1FX1VOS05PV047Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPnByb2ZpbGVMZXZlbCA9IDB4RkYgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5zdHJlYW1JRCA9IDE7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPnN0cmVhbVR5cGUgPSBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPnRpbWVTY2FsZSA9IHBTdHJlYW1EZXNjLT50aW1lU2NhbGUgOwotCi0gICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBBY2Nlc3MgVW5pdCBpbiB0aGUgRmlsZSB0byBnZXQgdGhlICovCi0gICAgLyogZHVyYXRpb24gb2YgdGhlIHN0cmVhbSA9IDIwIG1zICogbnVtYmVyIG9mIGFjY2VzcyB1bml0ICovCi0gICAgd2hpbGUoMSkKLSAgICB7Ci0gICAgICAgIHNpemUgPSAxOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KSZmcmFtZUhlYWRlciwgJnNpemUpOwotICAgICAgICBpZiAoIHNpemUgPT0gMCkKLSAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgZnJhbWVUeXBlID0gKGZyYW1lSGVhZGVyICYgMHg3OCkgPj4gMyA7Ci0gICAgICAgIC8qIEdldCB0aGUgZnJhbWUgc2l6ZSBhbmQgc2tpcCBzbyBtYW55IGJ5dGVzICovCi0gICAgICAgIGlmKGZyYW1lVHlwZSAhPSAxNSl7Ci0gICAgICAgICAgICAvKiBHTEEgMjAwNTA2Mjggd2hlbiBmcmFtZXR5cGUgaXMgPjEwIHdlIHJlYWQgb3ZlciBhIHRhYmxlICovCi0gICAgICAgICAgICBpZihmcmFtZVR5cGUgPiAxMCkKLSAgICAgICAgICAgICAgICBjb250aW51ZSA7Ci0KLSAgICAgICAgICAgIHNpemUgPSBNNEFNUlJfZ2V0QXVTaXplKGZyYW1lVHlwZSwgcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBpZihzaXplID4gcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemUgPSBzaXplIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbGVQb3MgPSBzaXplLTE7Ci0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwgJmZpbGVQb3MpOwotICAgICAgICAgICAgYXVDb3VudCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogRWFjaCBGcmFtZSBpcyAyMCBtIFNlYy4gKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZHVyYXRpb24gPSBhdUNvdW50ICogTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgcFN0cmVhbURlc2MtPmR1cmF0aW9uID0gcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmR1cmF0aW9uIDsKLQotICAgIC8qIFB1dCB0aGUgZmlsZSBwb2ludGVyIGJhY2sgYXQgdGhlIGZpcnN0IEFjY2VzcyB1bml0ICovCi0gICAgaWYoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApCi0gICAgewotICAgICAgICBmaWxlUG9zID0gNjsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyk7Ci0gICAgfQotICAgIGlmICggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SX1dCICkKLSAgICB7Ci0gICAgICAgIGZpbGVQb3MgPSA5OwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZmaWxlUG9zKTsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9zdGFydFJlYWRpbmcoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlEcyApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiBzaXplID0gMCA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFN0cmVhbUlEcyksTTRFUlJfUEFSQU1FVEVSLCJTdHJlYW0gSWRzLiBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tPcGVuZWQpLCBNNEVSUl9TVEFURSwgIkludmFsaWQgU3RhdGUiKTsKLQotICAgIHdoaWxlKCBwU3RyZWFtSURzW3NpemVdICE9IDAgKQotICAgIHsKLSAgICAgICAgaWYoIHBTdHJlYW1JRHNbc2l6ZSsrXSAhPSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQgOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBkYXRhIEFkZHJlc3MgZm9yIHVzZSBpbiBOZXh0QVUoKSAqLwotICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKQotICAgIHsKLSAgICAgICAgc2l6ZSA9IHBTdHJlYW1Db250ZXh0LT5tX21heEF1U2l6ZSA7Ci0gICAgICAgIC8qIGRhdGFBZGRyZXNzIGlzIG93bmVkIGJ5IFBhcnNlciwgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBkZWxldGUgb3IgZnJlZSBpdCAqLwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MgPShNNE9TQV9NZW1BZGRyMzIpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemUgKyAoNCAtIHNpemUgJSA0KSwKLSAgICAgICAgICAgIE00QU1SX1JFQURFUiwgKE00T1NBX0NoYXIgKikoInBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcyIpKTsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVR19JRjMoKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKSxNNEVSUl9BTExPQywKLSAgICAgICAgICAgICAgICAgICAgIk1lbSBBbGxvYyBmYWlsZWQgLSBkYXRhQWRkcmVzcyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFNldCB0aGUgc3RhdGUgb2YgY29udGV4dCB0byBSZWFkaW5nICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzID0gTTRBTVJSX2tSZWFkaW5nIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBTdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEF1KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfQ2hhciAgICAgICAgZnJhbWVIZWFkZXIgOwotICAgIE00T1NBX0NoYXIgICAgICAgIGZyYW1lVHlwZSA7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgIGF1U2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgICAgc2l6ZSA7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlUG9zOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBBdSksTTRFUlJfUEFSQU1FVEVSLCJBY2Nlc3MgVW5pdCAuIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCAhPSBNNEFNUlJfQ09OVEVYVElEKSxNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICJCYWQgQ29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyAhPSBNNEFNUlJfa1JlYWRpbmcpLCBNNEVSUl9TVEFURSwgIkludmFsaWQgU3RhdGUiKTsKLQotICAgIGlmICggU3RyZWFtSUQgIT0gMSApCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgfQotCi0gICAgLyogUmVhZCB0aGUgZnJhbWUgaGVhZGVyIGJ5dGUgKi8KLSAgICBzaXplID0gcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MsICZzaXplKTsKLSAgICBpZihzaXplICE9IHBTdHJlYW1Db250ZXh0LT5tX21heEF1U2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIGZyYW1lSGVhZGVyID0gKChNNE9TQV9NZW1BZGRyOClwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpWzBdOwotCi0gICAgZnJhbWVUeXBlID0gKCBmcmFtZUhlYWRlciAmIDB4NzggKSA+PiAzIDsKLQotICAgIGlmICgoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApICYmCi0gICAgICAgICggZnJhbWVUeXBlID4gMTEgKSAmJiAoIGZyYW1lVHlwZSAhPSAxNSApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICB9Ci0KLSAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSAmJgotICAgICAgICAoIGZyYW1lVHlwZSA+IDkgKSAmJiAoIGZyYW1lVHlwZSAhPSAxNSApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICB9Ci0KLSAgICAvKiBHZXQgdGhlIGZyYW1lIHNpemUgKi8KLSAgICBpZihmcmFtZVR5cGUgPT0gMTUpCi0gICAgewotICAgICAgICBhdVNpemUgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBhdVNpemUgPSBNNEFNUlJfZ2V0QXVTaXplKGZyYW1lVHlwZSwgcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0gICAgfQotCi0gICAgc2l6ZSAtPSBhdVNpemUgOwotICAgIGlmKHNpemUgIT0gMCkKLSAgICB7Ci0gICAgICAgIGZpbGVQb3MgPSAtKChNNE9TQV9GaWxlUG9zaXRpb24pc2l6ZSk7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsICZmaWxlUG9zKTsKLSAgICB9Ci0KLSAgICBwQXUtPnNpemUgPSBhdVNpemUgOwotCi0gICAgLyogZXZlbiB3aGVuIGZyYW1lVHlwZSA9PSAxNSAobm8gZGF0YSBmcmFtZSksIEFSTSBjb3JlIGRlY29kZXIgb3V0cHV0cyBmdWxsIFBDTSBidWZmZXIgKi8KLSAgICAvKmlmKGZyYW1lVHlwZSA9PSAxNSApCi0gICAgewotICAgICAgICBwQXUtPkNUUyArPSAwOwotICAgIH0qLwotICAgIC8qZWxzZSovCi0gICAgewotICAgICAgICBwQXUtPkNUUyArPSBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICB9Ci0KLQotICAgIHBBdS0+RFRTID0gcEF1LT5DVFMgOwotICAgIHBBdS0+YXR0cmlidXRlID0gTTRTWVNfa0ZyYWdBdHRyT2s7Ci0KLSAgICBwQXUtPnN0cmVhbSA9IHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyOwotICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MgOwotCi0gICAgaWYoZnJhbWVIZWFkZXIgJiAweDgwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlIHRoZSBzdGF0ZSB0byBpbXBsZW1lbnQgTmV4dEF1LT5mcmVlQXUtPk5leHRBdSBGU00gKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgPSBNNEFNUlJfa1JlYWRpbmdfbmV4dEFVIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfZnJlZUFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQXUpLE00RVJSX1BBUkFNRVRFUiwiQWNjZXNzIFVuaXQgLiBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tSZWFkaW5nX25leHRBVSksIE00RVJSX1NUQVRFLAotICAgICAgICAgIkludmFsaWQgU3RhdGUiKTsKLQotICAgIGlmICgoIFN0cmVhbUlEICE9IDEgKSAmJiAoIFN0cmVhbUlEICE9IDApKQotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgIH0KLQotICAgIC8qIENoYW5nZSB0aGUgc3RhdGUgdG8gUmVhZGluZyBzbyBhcyB0byBhbGxvdyBhY2Nlc3MgdG8gbmV4dCBBVSAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rUmVhZGluZyA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX3NlZWsoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlELCBNNE9TQV9UaW1lIHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsIE00T1NBX1RpbWUqIHBPYnRhaW5DVFMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9VSW50MzIgY291bnQsIHByZXZBVSwgbmV4dEFVIDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZSA7Ci0gICAgTTRPU0FfVUludDMyIGF1U2l6ZSA7Ci0gICAgTTRPU0FfVUludDMyIHBvc2l0aW9uLCBwYXJ0U2Vla1RpbWU7Ci0gICAgTTRPU0FfVUludDMyIGF1Q291bnQgPSAwLCBza2lwQXVDb3VudCA9IDAgOwotICAgIE00T1NBX0NoYXIgICAgZnJhbWVIZWFkZXIgOwotICAgIE00T1NBX0NoYXIgICAgZnJhbWVUeXBlIDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIGZpbGVQb3M7Ci0gICAgTTRPU0FfRG91YmxlIHRpbWVfZG91YmxlOwotCi0gICAgLypNYWtlIGV4cGxpY2l0IHRpbWUgY2FzdCwgYnV0IHRha2UgY2FyZSB0aGF0IHRpbWVzY2FsZSBpcyBub3QgdXNlZCAhISEqLwotICAgIE00T1NBX1RJTUVfVE9fTVModGltZV9kb3VibGUsIHRpbWUsIDEwMDApOwotCi0gICAgKnBPYnRhaW5DVFMgPSAwOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tSZWFkaW5nKSAmJiBcCi0gICAgICAgICggcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzICE9IE00QU1SUl9rT3BlbmVkKSwgTTRFUlJfU1RBVEUsICJJbnZhbGlkIFN0YXRlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCh0aW1lX2RvdWJsZSA8IDApLE00RVJSX1BBUkFNRVRFUiwibmVnYXRpdmUgdGltZSIpOwotCi0gICAgLyogQ29taW5nIHRvIHNlZWsgZm9yIHRoZSBmaXJzdCB0aW1lLCBuZWVkIHRvIGJ1aWxkIHRoZSBzZWVrSW5kZXggVGFibGUgKi8KLSAgICBpZihNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpCi0gICAgewotICAgICAgICBNNE9TQV9Eb3VibGUgZHVyYXRpb25fZG91YmxlOwotCi0gICAgICAgIGNvdW50ID0gMCA7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXggPQotICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNEFNUlJfTlVNX1NFRUtfRU5UUklFUyAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICBNNEFNUl9SRUFERVIsIChNNE9TQV9DaGFyICopKCJwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4IikpOwotCi0gICAgICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYzKChNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpLE00RVJSX0FMTE9DLAotICAgICAgICAgICAgICAgICJNZW0gQWxsb2MgRmFpbGVkIC0gU2Vla0luZGV4Iik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0MgOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcG9pbnQgdG8gdGhlIGZpcnN0IEFVICovCi0gICAgICAgIGlmKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlUG9zID0gNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qaWYgKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVQb3MgPSA5OwotICAgICAgICB9Ci0KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyk7Ci0KLSAgICAgICAgLyogU2V0IHRoZSBwb3N0aW9uIHRvIGJlZ2luaW5nIG9mIGZpcnN0IEFVICovCi0gICAgICAgIHBvc2l0aW9uID0gKHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgIT0gTTRTWVNfa0FNUik/OTo2OwotCi0gICAgICAgIC8qTWFrZSBleHBsaWNpdCB0aW1lIGNhc3QsIGJ1dCB0YWtlIGNhcmUgdGhhdCB0aW1lc2NhbGUgaXMgbm90IHVzZWQgISEhKi8KLSAgICAgICAgTTRPU0FfVElNRV9UT19NUyhkdXJhdGlvbl9kb3VibGUsIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5kdXJhdGlvbiwgMTAwMCk7Ci0KLSAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBzZWVrIEludGVydmFsIGR1cmF0aW9uIGJhc2VkIG9uIHRvdGFsIGR1dGF0aW9uICovCi0gICAgICAgIC8qIEludGVydmFsID0gKGR1cmF0aW9uIC8gRU5UUklFUykgaW4gbXVsdGlwbGVzIG9mIEFVIGZyYW1lIGxlbmd0aCAqLwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwgPQotICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKGR1cmF0aW9uX2RvdWJsZSAvIE00QU1SUl9OVU1fU0VFS19FTlRSSUVTKSA7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCAvPSBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsICo9IE00QU1SUl9GUkFNRV9MRU5HVEggOwotICAgICAgICBza2lwQXVDb3VudCA9IHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCAvIE00QU1SUl9GUkFNRV9MRU5HVEggOwotCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXhbY291bnQrK109cG9zaXRpb247Ci0gICAgICAgIHdoaWxlKGNvdW50IDwgTTRBTVJSX05VTV9TRUVLX0VOVFJJRVMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplID0gMTsKLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KSZmcmFtZUhlYWRlciwgJnNpemUpOwotICAgICAgICAgICAgaWYgKCBzaXplID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJhbWVUeXBlID0gKGZyYW1lSGVhZGVyICYgMHg3OCkgPj4gMyA7Ci0gICAgICAgICAgICBpZihmcmFtZVR5cGUgIT0gMTUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBidWdmaXggUm9uYW4gQ291c3luIDA1LzA0LzIwMDY6IEluIHRoZSBjb3JlIHJlYWRlciBBTVIsIHRoZQotICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9uIE00QU1SUl9zZWVrIGRvZXNuJ3QgY2hlY2sgdGhlIGZyYW1lVHlwZSAqLwotICAgICAgICAgICAgICAgIGlmICgoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApICYmICggZnJhbWVUeXBlID4gMTAgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSAmJiAoIGZyYW1lVHlwZSA+IDkgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhdVNpemUgPSBNNEFNUlJfZ2V0QXVTaXplKGZyYW1lVHlwZSwgcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gKz0gYXVTaXplIDsKLSAgICAgICAgICAgICAgICBmaWxlUG9zID0gYXVTaXplLTE7Ci0gICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LCAmZmlsZVBvcyk7Ci0gICAgICAgICAgICAgICAgYXVDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc2l0aW9uICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogU2tpcCB0aGUgbnVtYmVyIG9mIEFVJ3MgYXMgcGVyIGludGVydmFsIGFuZCBzdG9yZSBpbiB0aGUgSW5kZXggdGFibGUgKi8KLSAgICAgICAgICAgIGlmICggKHNraXBBdUNvdW50ICE9IDApICYmICEoYXVDb3VudCAlIHNraXBBdUNvdW50KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4W2NvdW50KytdID0gcG9zaXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LyogRW5kIG9mIEJ1aWxkaW5nIHRoZSBzZWVrIHRhYmxlICovCi0KLSAgICAvKiBVc2UgdGhlIHNlZWsgdGFibGUgdG8gc2VlayB0aGUgcmVxdWlyZWQgdGltZSBpbiB0aGUgc3RyZWFtICovCi0KLSAgICAvKiBJZiB3ZSBhcmUgc2Vla2luZyB0aGUgYmVnaW5pbmcgb2YgdGhlIGZpbGUgcG9pbnQgdG8gZmlyc3QgQVUgKi8KLSAgICBpZiAoIHNlZWtNb2RlID09IE00U1lTX2tCZWdpbm5pbmcgKQotICAgIHsKLSAgICAgICAgaWYoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVQb3MgPSA2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyppZiAoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUl9XQiApKi8KLSAgICAgICAgewotICAgICAgICAgICAgZmlsZVBvcyA9IDk7Ci0gICAgICAgIH0KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyApOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUiA7Ci0gICAgfQotCi0gICAgLyogR2V0IHRoZSBOZWFyZXN0IFNlY29uZCAqLwotICAgIGlmICgwICE9IHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCkKLSAgICB7Ci0gICAgICAgIHBvc2l0aW9uID0gKE00T1NBX1VJbnQzMikodGltZV9kb3VibGUgLyBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKmF2b2lkIGRpdmlzaW9uIGJ5IDAqLwotICAgICAgICBwb3NpdGlvbiA9IDA7Ci0gICAgfQotCi0gICAgLyogV2UgaGF2ZSBvbmx5IDQwIHNlZWsgSW5kZXguICovCi0gICAgcG9zaXRpb249KHBvc2l0aW9uID49IE00QU1SUl9OVU1fU0VFS19FTlRSSUVTKT9NNEFNUlJfTlVNX1NFRUtfRU5UUklFUy0xOnBvc2l0aW9uOwotCi0gICAgLyogU2Vla0luZGV4IHdpbGwgcG9pbnQgdG8gbmVhcmVzdCBBdSwgd2UgbmVlZCB0byBzZWFyY2ggZm9yIHRoZQotICAgIHJlcXVpcmVkIHRpbWUgZm9ybSB0aGF0IHBvc2l0aW9uICovCi0gICAgcGFydFNlZWtUaW1lID0gKE00T1NBX1VJbnQzMil0aW1lX2RvdWJsZSAtIHBvc2l0aW9uICogcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsOwotCi0gICAgcG9zaXRpb24gPSBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4W3Bvc2l0aW9uXTsKLQotICAgIGlmKCFwb3NpdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUUgOwotICAgIH0KLQotICAgIC8qIHBvaW50IHRoZSBmaWxlIHBvaW50ZXIgdG8gbmVhcmVzdCBBVSAqLwotICAgIGZpbGVQb3MgPSBwb3NpdGlvbjsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgJmZpbGVQb3MgKTsKLQotICAgIGlmICggcGFydFNlZWtUaW1lID09IDApCi0gICAgewotICAgICAgICAqcE9idGFpbkNUUyA9IHRpbWU7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgICpwT2J0YWluQ1RTID0gKE00T1NBX1RpbWUpKHRpbWVfZG91YmxlIC0gKE00T1NBX0RvdWJsZSlwYXJ0U2Vla1RpbWUpOwotCi0gICAgc3dpdGNoKHNlZWtNb2RlKQotICAgIHsKLSAgICAgICAgLyogR2V0IHRoZSBBVSBiZWZvcmUgdGhlIHRhcmdldCB0aW1lICovCi0gICAgICAgIGNhc2UgTTRTWVNfa1ByZXZpb3VzUkFQOgotICAgICAgICBjYXNlIE00U1lTX2tOb1JBUHByZXZpb3VzOgotICAgICAgICAgICAgcG9zaXRpb24gPSBwYXJ0U2Vla1RpbWUgLyBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgICAgIGlmICggIShwYXJ0U2Vla1RpbWUgJSBNNEFNUlJfRlJBTUVfTEVOR1RIKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gLS0gOwotICAgICAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgICAgLyogR2V0IHRoZSBDbG9zZXN0IEFVIGZvbGxvd2luZyB0aGUgdGFyZ2V0IHRpbWUgKi8KLSAgICAgICAgY2FzZSBNNFNZU19rTmV4dFJBUDoKLSAgICAgICAgY2FzZSBNNFNZU19rTm9SQVBuZXh0OgotICAgICAgICAgICAgcG9zaXRpb24gPSAocGFydFNlZWtUaW1lICsgTTRBTVJSX0ZSQU1FX0xFTkdUSCApLyBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qICBHZXQgdGhlIGNsb3Nlc3QgQVUgdG8gdGFyZ2V0IHRpbWUgKi8KLSAgICAgICAgY2FzZSBNNFNZU19rQ2xvc2VzdFJBUDoKLSAgICAgICAgY2FzZSBNNFNZU19rTm9SQVBjbG9zZXN0OgotICAgICAgICAgICAgcHJldkFVID0gcGFydFNlZWtUaW1lLShwYXJ0U2Vla1RpbWUvTTRBTVJSX0ZSQU1FX0xFTkdUSCkqTTRBTVJSX0ZSQU1FX0xFTkdUSDsKLSAgICAgICAgICAgIG5leHRBVSA9Ci0gICAgICAgICAgICAgICAgICgocGFydFNlZWtUaW1lK000QU1SUl9GUkFNRV9MRU5HVEgpL000QU1SUl9GUkFNRV9MRU5HVEgpKk00QU1SUl9GUkFNRV9MRU5HVEggLVwKLSAgICAgICAgICAgICAgICAgICAgIHBhcnRTZWVrVGltZSA7Ci0gICAgICAgICAgICBpZihwcmV2QVUgPCBuZXh0QVUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwYXJ0U2Vla1RpbWUgLyBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IChwYXJ0U2Vla1RpbWUgKyBNNEFNUlJfRlJBTUVfTEVOR1RIICkvIE00QU1SUl9GUkFNRV9MRU5HVEggOwotICAgICAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFNZU19rQmVnaW5uaW5nOgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjb3VudCA9IDAgOwotICAgIC8qIFNraXAgdGhlIEFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0gdG8gc2tpcCB0aGUgcGFydCBzZWVrIHRpbWUsCi0gICAgICAgdG8gcmVhY2ggdGhlIHJlcXVpcmVkIHRhcmdldCB0aW1lICovCi0gICAgd2hpbGUoY291bnQgPCBwb3NpdGlvbiApCi0gICAgewotICAgICAgICBzaXplID0gMTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnJlYWREYXRhKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkmZnJhbWVIZWFkZXIsICZzaXplKTsKLSAgICAgICAgaWYgKCBzaXplID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIHRoZSB0YXJnZXQgdGltZSBpcyBpbnZhbGlkLCBwb2ludCB0byBiZWdpbmluZyBhbmQgcmV0dXJuICovCi0gICAgICAgICAgICAqcE9idGFpbkNUUyA9IDA7Ci0gICAgICAgICAgICBmaWxlUG9zID0gcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleFswXTsKLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZmaWxlUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUUgOwotICAgICAgICB9Ci0gICAgICAgICpwT2J0YWluQ1RTICs9IE00QU1SUl9GUkFNRV9MRU5HVEg7IC8qU2hvdWxkIHVzZSBNNE9TQV9JTlQ2NF9BREQgISEqLwotICAgICAgICBjb3VudCsrOwotICAgICAgICBmcmFtZVR5cGUgPSAoZnJhbWVIZWFkZXIgJiAweDc4KSA+PiAzIDsKLSAgICAgICAgaWYoZnJhbWVUeXBlID09IDE1KQotICAgICAgICB7Ci0gICAgICAgICAgICBhdVNpemUgPSAxIDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF1U2l6ZSA9IE00QU1SUl9nZXRBdVNpemUoZnJhbWVUeXBlLCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbGVQb3MgPSBhdVNpemUtMTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwgJmZpbGVQb3MpOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKiBDbG9zZSB0aGUgQU1SIHN0cmVhbSAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5jbG9zZVJlYWQocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUpOwotCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzPU00QU1SUl9rQ2xvc2VkIDsKLQotICAgIC8qIENoZWNrIGlmIEFVIGRhdGEgQWRkcmVzcyBpcyBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBmcmVlIGl0ICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpCi0gICAgewotICAgICAgICBmcmVlKHBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcyk7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgdGhlIHN0cmVhbSBoYW5kbGVyIGlzIGFsbG9jYXRlZCBtZW1vcnkgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyKQotICAgIHsKLSAgICAgICAgZnJlZShwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlcik7Ci0gICAgfQotCi0gICAgLyogU2VlayB0YWJsZSBpcyBjcmVhdGVkIG9ubHkgd2hlbiBzZWVrIGlzIHVzZWQsIHNvIGNoZWNrIGlmIG1lbW9yeSBpcyBhbGxvY2F0ZWQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpCi0gICAgewotICAgICAgICBmcmVlKHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpOwotICAgIH0KLQotICAgIC8qIEZyZWUgdGhlIGNvbnRleHQgKi8KLSAgICBmcmVlKHBTdHJlYW1Db250ZXh0KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0U3RhdGUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNEFNUlJfU3RhdGUqIHBTdGF0ZSwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCAhPSBNNEFNUlJfQ09OVEVYVElEKSxNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICJCYWQgQ29udGV4dCIpOwotCi0gICAgaWYgKCggc3RyZWFtSWQgIT0gMSApICYmICggc3RyZWFtSWQgIT0gMCkpCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgfQotCi0gICAgKnBTdGF0ZSA9IHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0VmVyc2lvbiAgICAoTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRBTVJSX2dldFZlcnNpb24gY2FsbGVkIHdpdGggcFZlcnNpb246IDB4JXhcbiIsIHBWZXJzaW9uKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKChNNE9TQV9VSW50MzIpIHBWZXJzaW9uID09IDApLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJwVmVyc2lvbiBpcyBOVUxMIGluIE00QU1SUl9nZXRWZXJzaW9uIik7Ci0KLSAgICBwVmVyc2lvbi0+bV9tYWpvciA9IE00QU1SUl9WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uLT5tX21pbm9yID0gTTRBTVJSX1ZFUlNJT05fTUlOT1I7Ci0gICAgcFZlcnNpb24tPm1fcmV2aXNpb24gPSBNNEFNUlJfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9nZXRtYXhBVXNpemUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNE9TQV9VSW50MzIgKnBNYXhBdVNpemUpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gQ29udGV4dCksICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00QU1SUl9nZXRtYXhBVXNpemU6IENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwTWF4QXVTaXplKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00QU1SUl9nZXRtYXhBVXNpemU6IHBNYXhBdVNpemUgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgKnBNYXhBdVNpemUgPSBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNENoYW5uZWxDb252ZXJ0ZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRDaGFubmVsQ29udmVydGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjYTU1NTAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNENoYW5uZWxDb252ZXJ0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNENoYW5uZWxDb3ZlcnRlci5jCi0gKiBAYnJpZWYKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotdm9pZCBNb25vVG8ySV8xNiggY29uc3Qgc2hvcnQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBuKQotewotICAgIHNob3J0IGlpOwotICAgIHNyYyArPSBuLTE7Ci0gICAgZHN0ICs9IChuKjIpLTE7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgICpkc3QtLSA9ICpzcmM7Ci0gICAgICAgICpkc3QtLSA9ICpzcmMtLTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgRnJvbTJpVG9Nb25vXzE2KCBjb25zdCBzaG9ydCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgbikKLXsKLSAgICBzaG9ydCBpaTsKLSAgICBsb25nIFRlbXA7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pewotICAgICAgICBUZW1wID0gKGxvbmcpKihzcmMrKyk7Ci0gICAgICAgIFRlbXAgKz0gKGxvbmcpKihzcmMrKyk7Ci0gICAgICAgICooZHN0KyspID0gKHNob3J0KShUZW1wID4+MSk7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000REVDT0RFUl9OdWxsLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000REVDT0RFUl9OdWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwZGFkMzAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNERFQ09ERVJfTnVsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotLyoqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIE00REVDT0RFUl9OdWxsLmMNCi0gKiBAYnJpZWYgICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTnVsbCBkZWNvZGVyIHB1YmxpYyBpbnRlcmZhY2UNCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBhICJudWxsIiB2aWRlbyBkZWNvZGVyLCBpLmUuIGEgZGVjb2Rlcg0KLSAqICAgICAgICAgIHRoYXQgZG9lcyBub3RoaW5nDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCINCi0NCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCINCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCINCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiDQotI2luY2x1ZGUgIk00REFfVHlwZXMuaCINCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIg0KLSNpbmNsdWRlICJNNERFQ09ERVJfTnVsbC5oIg0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBOVUxMIFZpZGVvIERlY29kZXIgdmVyc2lvbiBpbmZvcm1hdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLS8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8NCi0jZGVmaW5lIE00REVDT0RFUl9OVUxMX01BSk9SICAgIDENCi0jZGVmaW5lIE00REVDT0RFUl9OVUxMX01JTk9SICAgIDANCi0jZGVmaW5lIE00REVDT0RFUl9OVUxMX1JFVklTSU9OIDANCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogc3RydWN0dXJlICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0DQotICogQGJyaWVmICAgICAgIERlZmluZXMgdGhlIGludGVybmFsIGNvbnRleHQgb2YgYSB2aWRlbyBkZWNvZGVyIGluc3RhbmNlDQotICogQG5vdGUgICAgICAgIFRoZSBjb250ZXh0IGlzIGFsbG9jYXRlZCBhbmQgZnJlZWQgYnkgdGhlIHZpZGVvIGRlY29kZXINCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BMaWJyYXJ5OyAgICAgICAgICAgIC8vIENvcmUgbGlicmFyeSBpZGVudGlmaWVyDQotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICBtX0RlY29kZXJJZDsgICAgICAgICAgIC8vIENvcmUgZGVjb2RlciBpZGVudGlmaWVyDQotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICBtX1JlbmRlcmVySWQ7ICAgICAgICAgIC8vIENvcmUgcmVuZGVyZXIgaWRlbnRpZmllcg0KLSAgICBNNF9WaWRlb1N0cmVhbUhhbmRsZXIqICAgbV9wVmlkZW9TdHJlYW1oYW5kbGVyOyAvLyBWaWRlbyBzdHJlYW0gZGVzY3JpcHRpb24NCi0gICAgTTRfQWNjZXNzVW5pdCogICAgICAgICAgIG1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGU7IC8vIEFjY2VzcyB1bml0IHVzZWQgdG8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgYW5kIGRlY29kZSBvbmUgZnJhbWUNCi0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgIG1fcFVzZXJEYXRhOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBhbnkgdXNlciBkYXRhDQotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICBtX3BSZWFkZXI7ICAgICAgICAgICAgIC8vIFJlYWRlciBkYXRhIGludGVyZmFjZQ0KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgbV9iRG9SZW5kZXJpbmc7ICAgICAgICAvLyBEZWNpZGVzIGlmIHJlbmRlciByZXF1aXJlZA0KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgbV9zdHJ1Y3RTaXplOyAgICAgICAgICAvLyBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUNCi0NCi0gICAgTTRERUNPREVSX091dHB1dEZpbHRlciogbV9wVmlkZW9GaWx0ZXI7ICAgICAgICAgLy8gQ29sb3IgY29udmVyc2lvbiBmaWx0ZXINCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgKnBEZWNZdXZEYXRhOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBZdXYgZGF0YSBwbGFuZQ0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAqcERlY1l1dldpdGhFZmZlY3Q7ICAgICAvLyBQb2ludGVyIHRvIFl1diBwbGFuZSB3aXRoIGNvbG9yIGVmZmVjdA0KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgYll1dldpdGhFZmZlY3RTZXQ7ICAgICAvLyBPcmlnaW5hbCBZdXYgZGF0YSBPUiBZdXYgd2l0aCBjb2xvciBlZmZlY3QNCi0NCi19IE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0Ow0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKiogTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyDQotICogQG5vdGUgICAgQWxsb2NhdGVzIHRoZSBjb250ZXh0DQotICoNCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgKE9VVCkgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyDQotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXI6IChJTikgICAgUG9pbnRlciB0byBhIHZpZGVvIHN0cmVhbSBkZXNjcmlwdGlvbg0KLSAqIEBwYXJhbSAgIHBTcmNJbnRlcmZhY2U6ICAoSU4pICAgIFBvaW50ZXIgdG8gdGhlIE00UkVBREVSX0RhdGFJbnRlcmZhY2UNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgdGhhdCBtdXN0IGJlIHVzZWQgYnkgdGhlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciB0byByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtDQotICogQHBhcmFtICAgcEFjY2Vzc1VuaXQgICAgIChJTikgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikgd2hlcmUgZGVjb2RlZCBkYXRhDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHN0b3JlZA0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICBBIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBBdCBsZWFzdCBvbmUgaW5wdXQgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXINCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZWFkZXJEYXRhSW50ZXJmYWNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCogcEFjY2Vzc1VuaXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpIHsNCi0NCi0gICAgTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0gTTRPU0FfTlVMTDsNCi0NCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQgPSAoTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyAoDQotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KSwgTTRERUNPREVSX01QRUc0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00X1ZpZGVvSGFuZGxlcl9Db250ZXh0Iik7DQotICAgIGlmIChwU3RyZWFtQ29udGV4dCA9PSAwKSB7DQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7DQotICAgIH0NCi0NCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RydWN0U2l6ZSA9IHNpemVvZihNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCk7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcExpYnJhcnkgICAgICAgICAgICAgID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciAgID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fRGVjb2RlcklkICAgICAgICAgICAgID0gLTE7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX1JlbmRlcmVySWQgICAgICAgICAgICA9IC0xOw0KLQ0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wVXNlckRhdGEgPSBNNE9TQV9OVUxMOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9iRG9SZW5kZXJpbmcgPSBNNE9TQV9UUlVFOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wVmlkZW9GaWx0ZXIgPSBNNE9TQV9OVUxMOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+Yll1dldpdGhFZmZlY3RTZXQgPSBNNE9TQV9GQUxTRTsNCi0NCi0gICAgKnBDb250ZXh0PXBTdHJlYW1Db250ZXh0Ow0KLSAgICByZXR1cm4gTTROT19FUlJPUjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIERlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyDQotICogQG5vdGUgICAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQNCi0gKg0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcg0KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9kZXN0cm95KE00T1NBX0NvbnRleHQgcENvbnRleHQpIHsNCi0NCi0gICAgTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0gKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KilwQ29udGV4dDsNCi0NCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0KSwNCi0gICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00REVDT0RFUl9OVUxMX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7DQotDQotICAgIGZyZWUocFN0cmVhbUNvbnRleHQpOw0KLQ0KLSAgICByZXR1cm4gTTROT19FUlJPUjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIEdldCBhbiBvcHRpb24gdmFsdWUgZnJvbSB0aGUgZGVjb2Rlcg0KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToNCi0gKg0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBvcHRpb25JZDogICAoSU4pICAgICAgICBJbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBnZXQNCi0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4vT1VUKSAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSB3aGVyZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiBpcyBzdG9yZWQNCi0gKg0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZCAoaW4gREVCVUcgb25seSkNCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICBXaGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lDQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkDQotICogQHJldHVybiAgTTRFUlJfTk9UX0lNUExFTUVOVEVEICAgRnVuY3Rpb24gbm90IGltcGxlbWVudGVkDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gIHBWYWx1ZSkgew0KLQ0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOw0KLX0NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgU2V0IGFuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBub3RlICAgIEFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOg0KLSAqDQotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSAgIG9wdGlvbklkOiAgIChJTikgICAgICAgIElkZW50aWZpZXIgaW5kaWNhdGluZyB0aGUgb3B0aW9uIHRvIHNldA0KLSAqIEBwYXJhbSAgIHBWYWx1ZTogICAgIChJTikgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZA0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICBUaGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQ0KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZA0KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBvcHRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsNCi0NCi0gICAgTTRERUNPREVSX091dHB1dEZpbHRlciAqcEZpbHRlck9wdGlvbjsNCi0NCi0gICAgTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQgKnBTdHJlYW1Db250ZXh0ID0NCi0gICAgICAgIChNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCopY29udGV4dDsNCi0NCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7DQotICAgIE00T1NBX1VJbnQzMiBoZWlnaHQgPSAwOw0KLSAgICBNNE9TQV9VSW50OCAqcF9zcmMsKnBfZGVzOw0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFRlbXBEZWNZdXZEYXRhID0gTTRPU0FfTlVMTDsNCi0NCi0gICAgc3dpdGNoIChvcHRpb25JZCkgew0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX0RlY1l1dkRhdGE6DQotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhID0gKE00VklGSV9JbWFnZVBsYW5lICopcFZhbHVlOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3RDb250aWd1b3VzOg0KLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdCA9IChNNFZJRklfSW1hZ2VQbGFuZSAqKXBWYWx1ZTsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0Og0KLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5iWXV2V2l0aEVmZmVjdFNldCA9IChNNE9TQV9Cb29sKXBWYWx1ZTsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91czoNCi0gICAgICAgICAgICBwVGVtcERlY1l1dkRhdGEgPSAgKE00VklGSV9JbWFnZVBsYW5lICopcFZhbHVlOw0KLQ0KLSAgICAgICAgICAgIHBfZGVzID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X3RvcGxlZnQ7DQotICAgICAgICAgICAgcF9zcmMgPSBwVGVtcERlY1l1dkRhdGFbMF0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICAgICAgcFRlbXBEZWNZdXZEYXRhWzBdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV9oZWlnaHQ7DQotICAgICAgICAgICAgIGhlaWdodCsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLA0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnVfd2lkdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBwX2RlcyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV9zdHJpZGU7DQotICAgICAgICAgICAgICAgIHBfc3JjICs9IHBUZW1wRGVjWXV2RGF0YVswXS51X3N0cmlkZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcF9kZXMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV90b3BsZWZ0Ow0KLSAgICAgICAgICAgIHBfc3JjID0gcFRlbXBEZWNZdXZEYXRhWzFdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgcFRlbXBEZWNZdXZEYXRhWzFdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV9oZWlnaHQ7DQotICAgICAgICAgICAgIGhlaWdodCsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLA0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnVfd2lkdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBwX2RlcyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV9zdHJpZGU7DQotICAgICAgICAgICAgICAgIHBfc3JjICs9IHBUZW1wRGVjWXV2RGF0YVsxXS51X3N0cmlkZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcF9kZXMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV90b3BsZWZ0Ow0KLSAgICAgICAgICAgIHBfc3JjID0gcFRlbXBEZWNZdXZEYXRhWzJdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgcFRlbXBEZWNZdXZEYXRhWzJdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV9oZWlnaHQ7DQotICAgICAgICAgICAgIGhlaWdodCsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLA0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnVfd2lkdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBwX2RlcyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV9zdHJpZGU7DQotICAgICAgICAgICAgICAgIHBfc3JjICs9IHBUZW1wRGVjWXV2RGF0YVsyXS51X3N0cmlkZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyOg0KLSAgICAgICAgICAgIHBGaWx0ZXJPcHRpb24gPSAoTTRERUNPREVSX091dHB1dEZpbHRlciopcFZhbHVlOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX0RlYmxvY2tpbmdGaWx0ZXI6DQotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gZXJyOw0KLX0NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgRGVjb2RlIHZpZGVvIEFjY2VzcyBVbml0cyB1cCB0byBhIHRhcmdldCB0aW1lDQotICogQG5vdGUgICAgUGFyc2UgYW5kIGRlY29kZSB0aGUgdmlkZW8gdW50aWwgaXQgY2FuIG91dHB1dCBhIGRlY29kZWQgaW1hZ2UNCi0gKiAgICAgICAgICBmb3Igd2hpY2ggdGhlIGNvbXBvc2l0aW9uIHRpbWUgaXMgZXF1YWwgb3IgZ3JlYXRlciB0byB0aGUNCi0gKiAgICAgICAgICBwYXNzZWQgdGFyZ2V0ZWQgdGltZS4NCi0gKiAgICAgICAgICBUaGUgZGF0YSBhcmUgcmVhZCBmcm9tIHRoZSByZWFkZXIgZGF0YSBpbnRlcmZhY2UgcGFzc2VkIHRvDQotICogICAgICAgICAgTTRERUNPREVSX01QRUc0X2NyZWF0ZS4NCi0gKg0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBwVGltZTogICAgICAoSU4vT1VUKSAgICBJTjogVGltZSB0byBkZWNvZGUgdXAgdG8gKGluIG1zZWMpDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIGxhc3QgZGVjb2RlZCBmcmFtZSAoaW4gbXNlYykNCi0gKiBAcGFyYW0gICBiSnVtcDogICAgICAoSU4pICAgICAgICAwIGlmIG5vIGp1bXAgb2NjdXJlZCBqdXN0IGJlZm9yZSB0aGlzIGNhbGwNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGlmIGEgYSBqdW1wIGhhcyBqdXN0IGJlZW4gbWFkZQ0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0DQotICogQHJldHVybiAgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBhY2Nlc3MgdW5pdCB0byBkZWNvZGUgKEVPUykNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZGVjb2RlKE00T1NBX0NvbnRleHQgY29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X01lZGlhVGltZSogcFRpbWUsIE00T1NBX0Jvb2wgYkp1bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0b2xlcmFuY2UpIHsKLQ0KLSAgICAvLyBEbyBub3RoaW5nOyBpbnB1dCB0aW1lIHN0YW1wIGl0c2VsZiByZXR1cm5lZA0KLSAgICByZXR1cm4gTTROT19FUlJPUjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIFJlbmRlcnMgdGhlIHZpZGVvIGF0IHRoZSBzcGVjaWZpZWQgdGltZS4NCi0gKiBAbm90ZQ0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAoSU4pICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBwVGltZTogICAgICAgKElOL09VVCkgICBJTjogVGltZSB0byByZW5kZXIgdG8gKGluIG1zZWNzKQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDpUaW1lIG9mIHRoZSByZW5kZXJlZCBmcmFtZSAoaW4gbXMpDQotICogQHBhcmFtICAgcE91dHB1dFBsYW5lOihPVVQpICAgICAgT3V0cHV0IHBsYW5lIGZpbGxlZCB3aXRoIGRlY29kZWQgZGF0YQ0KLSAqIEBwYXJhbSAgIGJGb3JjZVJlbmRlcjooSU4pICAgICAgIDEgaWYgdGhlIGltYWdlIG11c3QgYmUgcmVuZGVyZWQgZXZlbiBpdA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHJlbmRlcmVkIGFscmVhZHkNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdA0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQNCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkNCi0gKiBAcmV0dXJuICBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAgICBJZiB0aGUgZnJhbWUgaGFzIGFscmVhZHkgYmVlbiByZW5kZXJlZA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9yZW5kZXIoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9NZWRpYVRpbWUqIHBUaW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwdXRQbGFuZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkZvcmNlUmVuZGVyKSB7DQotDQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOw0KLSAgICBNNE9TQV9VSW50MzIgaGVpZ2h0Ow0KLSAgICBNNE9TQV9VSW50OCAqcF9zcmMsKnBfZGVzOw0KLSAgICBNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCogICAgcFN0cmVhbUNvbnRleHQgPQ0KLSAgICAgICAgKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0Kiljb250ZXh0Ow0KLQ0KLSAgICBpZiAocFN0cmVhbUNvbnRleHQtPmJZdXZXaXRoRWZmZWN0U2V0ID09IE00T1NBX1RSVUUpIHsNCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzBdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzBdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMF0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzBdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzFdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzFdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMV0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzFdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzJdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzJdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzJdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMl0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzJdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzBdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzBdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzBdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMF0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMF0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzBdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVswXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzFdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzFdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzFdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMV0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMV0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzFdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVsxXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzJdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzJdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzJdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMl0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzJdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCh2b2lkICopcF9zcmMscE91dHB1dFBsYW5lWzJdLnVfd2lkdGgpOw0KLSAgICAgICAgICAgIHBfZGVzICs9IHBPdXRwdXRQbGFuZVsyXS51X3N0cmlkZTsNCi0gICAgICAgICAgICBwX3NyYyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMl0udV9zdHJpZGU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGVycjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiBSZXRyaWV2ZXMgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSBwRGVjb2RlclR5cGUgICAgICAgIDogUG9pbnRlciB0byBhIE00REVDT0RFUl9WaWRlb1R5cGUNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGRlY29kZXIgdHlwZQ0KLSAqIEBwYXJhbSBwRGVjb2RlckludGVyZmFjZSAgIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0bw0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGRlY29kZXIuDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZCBieQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBhbmQgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLg0KLSAqDQotICogQHJldHVybnMgOiBNNE5PX0VSUk9SICBpZiBPSw0KLSAqICAgICAgICAgICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZ2V0SW50ZXJmYWNlIChNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqKnBEZWNvZGVySW50ZXJmYWNlKSB7DQotDQotICAgICpwRGVjb2RlckludGVyZmFjZSA9DQotICAgICAgICAoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoDQotICAgICAgICAgc2l6ZW9mKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSksDQotICAgICAgICAgTTRERUNPREVSX01QRUc0LCAoTTRPU0FfQ2hhciAqKSJNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UiKTsNCi0NCi0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBEZWNvZGVySW50ZXJmYWNlKSB7DQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7DQotICAgIH0NCi0NCi0gICAgKnBEZWNvZGVyVHlwZSA9IE00REVDT0RFUl9rVmlkZW9UeXBlWVVWNDIwUDsNCi0NCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICA9IE00REVDT0RFUl9OVUxMX2NyZWF0ZTsNCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICA9IE00REVDT0RFUl9OVUxMX2Rlc3Ryb3k7DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gPSBNNERFQ09ERVJfTlVMTF9nZXRPcHRpb247DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gPSBNNERFQ09ERVJfTlVMTF9zZXRPcHRpb247DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3REZWNvZGUgICAgPSBNNERFQ09ERVJfTlVMTF9kZWNvZGU7DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RSZW5kZXIgICAgPSBNNERFQ09ERVJfTlVMTF9yZW5kZXI7DQotDQotICAgIHJldHVybiBNNE5PX0VSUk9SOw0KLX0NCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UENNUl9Db3JlUmVhZGVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UENNUl9Db3JlUmVhZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzNDMyNTQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBDTVJfQ29yZVJlYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBDTV9QQ01SZWFkZXIuYwotICogQGJyaWVmICAgUENNIHJlYWRlciBpbXBsZW1lbnRhdGlvbgotICogQG5vdGUgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIG9mIHRoZSBQQ00gcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotI2luY2x1ZGUgIk00UENNUl9Db3JlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQQ00gcmVhZGVyIHZlcnNpb24gbnVtYmVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0jZGVmaW5lIE00UENNUl9WRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgTTRQQ01SX1ZFUlNJT05fTUlOT1IgMAotI2RlZmluZSBNNFBDTVJfVkVSU0lPTl9SRVZJU0lPTiAwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9vcGVuUmVhZChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcFVybCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyUG9pbnRlciogcEZpbGVGdW5jdGlvbikKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgYSBQQ00gZmlsZQotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIG9wZW5zIGEgUENNIGZpbGUKLSAqICAgICAgICAgIC0gaW5pdGlhbGl6ZXMgUENNIGNvbnRleHQsCi0gKiAgICAgICAgICAtIHZlcmlmaWVzIFBDTSBmaWxlIGZvcm1hdAotICogICAgICAgICAgLSBGaWxsIGRlY29kZXIgY29uZmlnIHN0cnVjdHVyZQotICogICAgICAgICAgLSBDaGFuZ2VzIHN0YXRlIG9mIHRoZSByZWFkZXIgaW4gJ09wZW5pbmcnCi0gKiBAcGFyYW0gICBwQ29udGV4dDogKE9VVCkgUG9pbnRlciBvbiB0aGUgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBwVXJsOiAoSU4pIE5hbWUgb2YgdGhlIFBDTSBmaWxlCi0gKiBAcGFyYW0gICBwRmlsZUZ1bmN0aW9uczogKElOKSBQb2ludGVyIG9uIHRoZSBmaWxlIGFjY2VzcyBmdW5jdGlvbnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IgZHVyaW5nIHRoZSBvcGVuaW5nCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgIHBDb250ZXh0IGFuZC9vciBwVXJsIGFuZC9vciBwRmlsZUZ1bmN0aW9uIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICBNNEVSUl9GSUxFX05PVF9GT1VORCAgICAgICAgICAgIHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotICogQHJldHVybiAgTTRQQ01DX0VSUl9QQ01fTk9UX0NPTVBMSUFOVCAgICB0aGUgZmlsZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGNvbXBsaWFudCwgbm8gUklGRiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbGFjayBvZiBhbnkgbWFuZGF0b3J5IGNodW5rLgotICogQHJldHVybiAgTTRQQ01DX0VSUl9QQ01fTk9UX1NVUFBPUlRFRCAgICB0aGUgUENNIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcgotICogQHJldHVybiAgQW55IE00T1NBX0ZJTEUgZXJyb3JzICAgICAgICAgICBzZWUgT1NBTCBGaWxlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbGVkIGVycm9ycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX29wZW5SZWFkKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlRnVuY3Rpb24pCi17Ci0gICAgTTRPU0FfRVJSICAgICAgIGVycjsKLSAgICBNNFBDTVJfQ29udGV4dCAqY29udGV4dDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgcFRlbXBVUkw7Ci0gICAgTTRPU0FfQ2hhciAgICAgICAgdmFsdWVbNl07Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gcENvbnRleHQpfHwgKE00T1NBX05VTEwgPT0gcFVybCkgfHwoTTRPU0FfTlVMTCA9PSBwRmlsZUZ1bmN0aW9uKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGVzIHRoZSBjb250ZXh0ICovCi0gICAgY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgY29udGV4dCA9IChNNFBDTVJfQ29udGV4dCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRQQ01SX0NvbnRleHQpLCBNNFdBVl9SRUFERVIsCi0gICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFBDTVJfb3BlblJlYWQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAqcENvbnRleHQgPSAoTTRPU0FfQ29udGV4dCljb250ZXh0OwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCAqLwotICAgIGNvbnRleHQtPm1fb2Zmc2V0ID0gMDsKLQotICAgIGNvbnRleHQtPm1fc3RhdGUgICAgICAgICAgICA9IE00UENNUl9rSW5pdDsKLSAgICBjb250ZXh0LT5tX21pY3JvU3RhdGUgICAgICAgPSBNNFBDTVJfa0luaXQ7Ci0gICAgY29udGV4dC0+bV9wRmlsZVJlYWRGdW5jICAgID0gTTRPU0FfTlVMTDsKLSAgICBjb250ZXh0LT5tX2ZpbGVDb250ZXh0ICAgICAgPSBNNE9TQV9OVUxMOwotICAgIGNvbnRleHQtPm1fcEF1QnVmZmVyICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgY29udGV4dC0+bV9wRGVjb2RlclNwZWNJbmZvID0gTTRPU0FfTlVMTDsKLQotICAgIC8qIFNldCBzYW1wbGUgZnJlcXVlbmN5ICovCi0gICAgcFRlbXBVUkwgPSAoTTRPU0FfQ2hhciopcFVybCArIChzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKS0xMSk7Ci0gICAgTTRPU0FfY2hyTkNvcHkodmFsdWUsIHBUZW1wVVJMLCA1KTsKLSAgICBNNE9TQV9jaHJHZXRVSW50MzIocFRlbXBVUkwsICYoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLlNhbXBsZUZyZXF1ZW5jeSksCi0gICAgICAgICBNNE9TQV9OVUxMLCBNNE9TQV9rY2hyRGVjKTsKLQotICAgIC8qIFNldCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBwVGVtcFVSTCArPSA2OwotICAgIE00T1NBX2Nock5Db3B5KHZhbHVlLCBwVGVtcFVSTCwgMSk7Ci0gICAgTTRPU0FfY2hyR2V0VUludDE2KHBUZW1wVVJMLCAmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzKSwKLSAgICAgICAgIE00T1NBX05VTEwsIE00T1NBX2tjaHJEZWMpOwotCi0gICAgTTRPU0FfY2hyTkNvcHkocFVybCxwVXJsLCAoc3RybGVuKChjb25zdCBjaGFyICopcFVybCktMTIpKTsKLSAgICAvKiBPcGVuIHRoZSBmaWxlICovCi0gICAgY29udGV4dC0+bV9maWxlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgZXJyID0gcEZpbGVGdW5jdGlvbi0+b3BlblJlYWQoJihjb250ZXh0LT5tX2ZpbGVDb250ZXh0KSwgcFVybCwgTTRPU0Ffa0ZpbGVSZWFkKTsKLSAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5CaXRzUGVyU2FtcGxlID0gMTY7Ci0gICAgY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLkF2Z0J5dGVzUGVyU2VjID0gY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLlNhbXBsZUZyZXF1ZW5jeSAqIDIgXAotICAgICAgICAqIGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzOwotICAgIGVyciA9IHBGaWxlRnVuY3Rpb24tPmdldE9wdGlvbihjb250ZXh0LT5tX2ZpbGVDb250ZXh0LCBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZSwKLSAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKikmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5EYXRhTGVuZ3RoKSk7Ci0gICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBjb250ZXh0LT5tX2Jsb2NrU2l6ZSA9IDIwNDggKiBjb250ZXh0LT5tX2RlY29kZXJDb25maWcubmJDaGFubmVsczsgIC8vIFJhdyBQQ00uICBIZW5jZSwgZ2V0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNodW5rIG9mIGRhdGEKLQotICAgIGlmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5TYW1wbGVGcmVxdWVuY3kgPT0gODAwMCkKLSAgICB7Ci0gICAgICAgIC8qIEFNUiBjYXNlLCBubyBwYiAqLwotICAgICAgICBjb250ZXh0LT5tX2Jsb2NrU2l6ZSA9IGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzICpcCi0gICAgICAgICAgICAgKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5TYW1wbGVGcmVxdWVuY3kgLyA1MCkgKiBcCi0gICAgICAgICAgICAgICAgKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5CaXRzUGVyU2FtcGxlIC8gOCk7Ci0gICAgfQotICAgIGlmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5TYW1wbGVGcmVxdWVuY3kgPT0gMTYwMDApCi0gICAgewotICAgICAgICAvKiBBQUMgY2FzZSwgd2UgY2FuJ3QgcmVhZCBvbmx5IDIwIG1zIGJsb2NrcyAqLwotICAgICAgICBjb250ZXh0LT5tX2Jsb2NrU2l6ZSA9IDIwNDggKiBjb250ZXh0LT5tX2RlY29kZXJDb25maWcubmJDaGFubmVsczsKLSAgICB9Ci0gICAgY29udGV4dC0+bV9kYXRhU3RhcnRPZmZzZXQgPSAwOwotICAgIGNvbnRleHQtPm1fcEZpbGVSZWFkRnVuYyA9IHBGaWxlRnVuY3Rpb247Ci0KLSAgICBjb250ZXh0LT5tX3BBdUJ1ZmZlciA9IChNNE9TQV9NZW1BZGRyMzIpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGNvbnRleHQtPm1fYmxvY2tTaXplLCBNNFdBVl9SRUFERVIsCi0gICAgICAgICAoTTRPU0FfQ2hhciAqKSJDb3JlIFBDTSByZWFkZXIgQWNjZXNzIFVuaXQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBjb250ZXh0LT5tX3BBdUJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlIHN0YXRlICovCi0gICAgY29udGV4dC0+bV9zdGF0ZSA9IE00UENNUl9rT3BlbmluZzsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi1jbGVhbnVwOgotCi0gICAgLyogQ2xvc2UgdGhlIGZpbGUgKi8KLSAgICBpZihjb250ZXh0LT5tX3BGaWxlUmVhZEZ1bmMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgY29udGV4dC0+bV9wRmlsZVJlYWRGdW5jLT5jbG9zZVJlYWQoY29udGV4dC0+bV9maWxlQ29udGV4dCk7Ci0KLSAgICAvKiBGcmVlIGludGVybmFsIGNvbnRleHQgKi8KLSAgICBmcmVlKGNvbnRleHQpOwotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBwU3RyZWFtRGVzYykKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gZ2V0IHRoZSAodW5pcXVlKSBzdHJlYW0gb2YgYSBQQ00gZmlsZQotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIEFsbG9jYXRlcyBhbmQgZmlsbHMgdGhlIGRlY29kZXIgc3BlY2lmaWMgaW5mbyBzdHJ1Y3R1cmUKLSAqICAgICAgICAgIC0gRmlsbHMgZGVjb2RlciBzcGVjaWZpYyBpbmZvcyBzdHJ1Y3R1cmUKLSAqICAgICAgICAgIC0gRmlsbHMgcFN0cmVhbURlc2Mgc3RydWN0dXJlIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBTdHJlYW1EZXNjOiAoSU4pIFN0cmVhbSBEZXNjcmlwdGlvbiBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgQW55IE00T1NBX0ZJTEUgICAgICBlcnJvcnMgc2VlIE9TQUwgRmlsZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxlZCBlcnJvcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjKQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0gKE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBjb250ZXh0KXx8IChNNE9TQV9OVUxMID09IHBTdHJlYW1EZXNjKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKGMtPm1fc3RhdGUgPT0gTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgLyogQ2hlY2sgUmVhZGVyJ3MgbV9zdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIE9ubHkgb25lIHN0cmVhbSBpcyBjb250YWluZWQgaW4gUENNIGZpbGUgKi8KLSAgICBwU3RyZWFtRGVzYy0+c3RyZWFtSUQgPSAxOwotICAgIC8qIE5vdCB1c2VkICovCi0gICAgcFN0cmVhbURlc2MtPnByb2ZpbGVMZXZlbCA9IDA7Ci0gICAgcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc2l6ZW9mKE00UENNQ19EZWNvZGVyU3BlY2lmaWNJbmZvKTsKLQotICAgIC8qIEFsbG9jYXRlcyBkZWNvZGVyIHNwZWNpZmljIGluZm8gc3RydWN0dXJlICovCi0gICAgcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgIHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgKE00T1NBX01lbUFkZHIzMilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoIHNpemVvZihNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbyksIE00V0FWX1JFQURFUiwKLSAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFBDTVJfZ2V0TmV4dFN0cmVhbSIpOwotICAgIGlmKHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIC8qIEZpbGwgZGVjb2RlclNwZWNpZmljSW5mbyBzdHJ1Y3R1cmUsIHdpdGggZGVjb2RlciBjb25maWcgc3RydWN0dXJlIGZpbGxlZCBpbiAnb3BlbnJlYWQnCi0gICAgICAgICBmdW5jdGlvbiAqLwotICAgIG1lbWNweSgodm9pZCAqKXBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgKHZvaWQgKikmYy0+bV9kZWNvZGVyQ29uZmlnLCBzaXplb2YoTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8pKTsKLQotICAgIC8qIEZpbGwgb3RoZXIgZmllbGRzIG9mIHBTdHJlYW1EZXNjIHN0cnVjdHVyZSAqLwotICAgIHBTdHJlYW1EZXNjLT50aW1lU2NhbGUgPSAxMDAwOwotICAgIHBTdHJlYW1EZXNjLT5kdXJhdGlvbiA9IChNNE9TQV9UaW1lKSgoKE00T1NBX0RvdWJsZSkoYy0+bV9kZWNvZGVyQ29uZmlnLkRhdGFMZW5ndGgpXAotICAgICAgICAgLyAoTTRPU0FfRG91YmxlKShjLT5tX2RlY29kZXJDb25maWcuQXZnQnl0ZXNQZXJTZWMpKSpwU3RyZWFtRGVzYy0+dGltZVNjYWxlKTsKLSAgICBwU3RyZWFtRGVzYy0+YXZlcmFnZUJpdHJhdGUgPSBjLT5tX2RlY29kZXJDb25maWcuQXZnQnl0ZXNQZXJTZWMgKiA4Oy8qIGluIGJpdHMsIG11bHRpcGx5IGJ5IDgqLwotICAgIHBTdHJlYW1EZXNjLT5tYXhCaXRyYXRlID0gcFN0cmVhbURlc2MtPmF2ZXJhZ2VCaXRyYXRlOyAvKiBQQ00gc3RyZWFtIGhhcyBjb25zdGFudCBiaXRyYXRlICovCi0KLSAgICAvKiBEZXRlcm1pbmVzIFN0cmVhbSB0eXBlICovCi0gICAgc3dpdGNoKGMtPm1fZGVjb2RlckNvbmZpZy5CaXRzUGVyU2FtcGxlKQotICAgIHsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgc3dpdGNoKGMtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rUENNXzhiaXRzVTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgICAgICAgICBjYXNlIDI6Ci0vLyAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rUENNXzhiaXRzUzsgLyogPz8/IDhiaXRzIHN0ZXJlbyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZGVmaW5lZCA/ICovCi0vLyAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgIHN3aXRjaChjLT5tX2RlY29kZXJDb25maWcubmJDaGFubmVscykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gTTRTWVNfa1BDTV8xNmJpdHNVOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gTTRTWVNfa1BDTV8xNmJpdHNTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgIH0KLQotICAgIGMtPm1fcERlY29kZXJTcGVjSW5mbyA9IHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvOwotCi0gICAgYy0+bV9zdGF0ZSA9IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX3N0YXJ0UmVhZGluZyhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSURzKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBzdGFydHMgcmVhZGluZyB0aGUgdW5pcXVlIHN0cmVhbSBvZiBhIFBDTSBmaWxlCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCByZWFkZXIncyBzdGF0ZSBhbGxvd3MgdG8gc3RhcnQgcmVhZGluZyBhIHN0cmVhbQotICogICAgICAgICAgLSBDaGVjayB0aGF0IHByb3ZpZGVkIFN0cmVhbUlkIGlzIGNvcnJlY3QgKGFsd2F5cyB0cnVlLCBvbmx5IG9uZSBzdHJlYW0uLi4pCi0gKiAgICAgICAgICAgIEluIHRoZSBwbGF5ZXIgYXBwbGljYXRpb24sIGEgU3RyZWFtSWQgdGFibGUgaXMgaW5pdGlhbGl6ZWQgYXMgZm9sbG93OgotICogICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHBTdHJlYW1JRFsyXT17MSwwfTsKLSAqICAgICAgICAgIC0gQ2hhbmdlIHN0YXRlIG9mIHRoZSByZWFkZXIgaW4gJ1JlYWRpbmcnCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIHN0cmVhbUlEOiAoSU4pIFN0cmVhbSBzZWxlY3Rpb24KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9TVFJFQU1fSUQgYXQgbGVhc3Qgb25lIG9mIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICogICAgICAgICAgKHNob3VsZCBuZXZlciBoYXBwZW4gaWYgdGFibGUgcFN0cmVhbUlEIGlzIGNvcnJlY3RseSBpbml0aWFsaXplZCBhcyBhYm92ZSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9zdGFydFJlYWRpbmcoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlEcykKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gY29udGV4dCkgfHwgKE00T1NBX05VTEwgPT0gcFN0cmVhbUlEcykpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIFJlYWRlcidzIHN0YXRlICovCi0gICAgaWYoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmdfc3RyZWFtUmV0cmlldmVkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIENoZWNrIHBTdHJlYW1JRCBhbmQgaWYgdGhleSdyZSBPSywgY2hhbmdlIHJlYWRlcidzIHN0YXRlICovCi0gICAgaWYocFN0cmVhbUlEc1swXSA9PSAxIHx8IHBTdHJlYW1JRHNbMF0gPT0gMCkKLSAgICAvKiBGaXJzdCBhbmQgdW5pcXVlIHN0cmVhbSBjb250YWluZWQgaW4gUENNIGZpbGUgKi8KLSAgICB7Ci0gICAgICAgIGMtPm1fc3RhdGUgPSBNNFBDTVJfa1JlYWRpbmc7Ci0gICAgICAgIGMtPm1fbWljcm9TdGF0ZSA9IE00UENNUl9rUmVhZGluZzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbmV4dCBBVSBjb250YWluZWQgaW4gdGhlIFBDTSBmaWxlCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCByZWFkZXIncyBzdGF0ZSBhbGxvd3MgdG8gcmVhZCBhbiBBVQotICogICAgICAgICAgLSBBbGxvY2F0ZXMgbWVtb3J5IHRvIHN0b3JlIHJlYWQgQVUKLSAqICAgICAgICAgIC0gUmVhZCBkYXRhIGZyb20gZmlsZSBhbmQgc3RvcmUgdGhlbSBpbnRvIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeQotICogICAgICAgICAgLSBGaWxsIEFVIHN0cnVjdHVyZSBmaWxlZHMgKENUUy4uLikKLSAqICAgICAgICAgIC0gQ2hhbmdlIHN0YXRlIG9mIHRoZSByZWFkZXIgaW4gJ1JlYWRpbmcnIChub3QgdXNlZnVsLi4uKQotICogICAgICAgICAgLSBDaGFuZ2UgTWljcm8gc3RhdGUgJ1JlYWRpbmcnIGluIE00UENNUl9rUmVhZGluZ19uZXh0QVUKLSAqICAgICAgICAgICAgKEFVIGlzIHJlYWQgYW5kIGNhbiBiZSBkZWxldGVkKQotICogICAgICAgICAgLSBDaGVjayBpZiB0aGUgbGFzdCBBVSBoYXMgYmVlbiByZWFkIG9yIGlmIHdlJ3JlIGFib3V0IHRvIHJlYWQgaXQKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgc3RyZWFtSUQ6IChJTikgU3RyZWFtIHNlbGVjdGlvbgotICogQHBhcmFtICAgcEFVOiAoSU4vT1VUKSBBY2NlcyBVbml0IFN0cnVjdHVyZQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gIE00TTRXQVJfTk9fREFUQV9ZRVQgdGhlcmUgaXMgbm8gZW5vdWdoIGRhdGEgaW4gdGhlIGZpbGUgdG8gcHJvdmlkZSBhIG5ldyBhY2Nlc3MgdW5pdC4KLSAqIEByZXR1cm4gIE00V0FSX0VORF9PRl9TVFJFQU0gVGhlcmUgaXMgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0aGUgc2FtcGxlIG51bWJlciBpcyBiaWdnZXIgdGhlIG1heGltdW0gb25lLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX25leHRBVShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPSAoTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBzaXplX3JlYWQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gY29udGV4dCkgfHwgKE00T1NBX05VTEwgPT0gcEFVKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgUmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZihjLT5tX3N0YXRlICE9IE00UENNUl9rUmVhZGluZyAmJiBjLT5tX21pY3JvU3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlcyBBVSBkYXRhQWRyZXNzICovCi0gICAgcEFVLT5kYXRhQWRkcmVzcyA9IGMtPm1fcEF1QnVmZmVyOwotICAgIHNpemVfcmVhZCAgICAgICAgPSBjLT5tX2Jsb2NrU2l6ZTsKLQotICAgIGlmKChjLT5tX29mZnNldCArIHNpemVfcmVhZCkgPj0gYy0+bV9kZWNvZGVyQ29uZmlnLkRhdGFMZW5ndGgpCi0gICAgewotICAgICAgICBzaXplX3JlYWQgPSBjLT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aCAtIGMtPm1fb2Zmc2V0OwotICAgIH0KLQotICAgIC8qIFJlYWQgZGF0YSBpbiBmaWxlLCBhbmQgY29weSBpdCB0byBBVSBTdHJ1Y3R1cmUgKi8KLSAgICBlcnIgPSBjLT5tX3BGaWxlUmVhZEZ1bmMtPnJlYWREYXRhKGMtPm1fZmlsZUNvbnRleHQsIChNNE9TQV9NZW1BZGRyOClwQVUtPmRhdGFBZGRyZXNzLAotICAgICAgICAgKE00T1NBX1VJbnQzMiAqKSZzaXplX3JlYWQpOwotICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGVzIHRoZSBuZXcgbV9vZmZzZXQsIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UncmUgYXQgZW5kIG9mIHJlYWRpbmcgb3Igbm90ICovCi0gICAgYy0+bV9vZmZzZXQgPSBjLT5tX29mZnNldCArIHNpemVfcmVhZDsKLQotICAgIC8qIEZpbGwgb3RoZXJzIHBhcmFtZXRlcnMgb2YgQVUgc3RydWN0dXJlICovCi0gICAgcEFVLT5DVFMgPQotICAgICAgICAgKE00T1NBX1RpbWUpKCgoTTRPU0FfRG91YmxlKWMtPm1fb2Zmc2V0LyhNNE9TQV9Eb3VibGUpYy0+bV9kZWNvZGVyQ29uZmlnLkF2Z0J5dGVzUGVyU2VjKVwKLSAgICAgICAgICAgICoxMDAwKTsKLSAgICBwQVUtPkRUUyA9IHBBVS0+Q1RTOwotCi0gICAgcEFVLT5hdHRyaWJ1dGUgID0gMDsKLSAgICBwQVUtPmZyYWcgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBBVS0+bmJGcmFnICAgICA9IDA7Ci0gICAgcEFVLT5zdHJlYW0gICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQVUtPnNpemUgICAgICAgPSBzaXplX3JlYWQ7Ci0KLSAgICAvKiBDaGFuZ2Ugc3RhdGVzICovCi0gICAgYy0+bV9zdGF0ZSA9IE00UENNUl9rUmVhZGluZzsgLyogTm90IGNoYW5nZWQgLi4uICovCi0gICAgYy0+bV9taWNyb1N0YXRlID0gTTRQQ01SX2tSZWFkaW5nX25leHRBVTsgLyogQVUgaXMgcmVhZCBhbmQgY2FuIGJlIGRlbGV0ZWQgKi8KLQotICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIgQVUgdG8gcmVhZCAqLwotICAgIC8qIGllOiBpZiBkZWNvZGVkIG5iIG9mIGJ5dGVzID0gbmIgb2YgYnl0ZXMgdG8gZGVjb2RlLAotICAgICAgICAgaXQgbWVhbnMgdGhlcmUgaXMgbm8gbW9yZSBBVSB0byBkZWNvZGUgKi8KLSAgICBpZihjLT5tX29mZnNldCA+PSBjLT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfZnJlZUFVKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIEFVIHByb3ZpZGVkIGluIHBhcmFtZXRlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIHRvIGZyZWUgYW4gQVUKLSAqICAgICAgICAgIC0gRnJlZSBkYXRhQWRkcmVzcyBmaWVsZCBvZiBBVSBzdHJ1Y3R1cmUKLSAqICAgICAgICAgIC0gQ2hhbmdlIHN0YXRlIG9mIHRoZSByZWFkZXIgaW4gJ1JlYWRpbmcnIChub3QgdXNlZnVsLi4uKQotICogICAgICAgICAgLSBDaGFuZ2UgTWljcm8gc3RhdGUgJ1JlYWRpbmcnIGluIE00UENNUl9rUmVhZGluZyAoYW5vdGhlciBBVSBjYW4gYmUgcmVhZCkKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgc3RyZWFtSUQ6IChJTikgU3RyZWFtIHNlbGVjdGlvbgotICogQHBhcmFtICAgcEFVOiAoSU4pIEFjY2VzIFVuaXQgU3RydWN0dXJlCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfU1RBVEUgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX2ZyZWVBVShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPSAoTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKChNNE9TQV9OVUxMID09IGNvbnRleHQgKSB8fCAoTTRPU0FfTlVMTCA9PSBwQVUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBSZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nICYmIGMtPm1fbWljcm9TdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmdfbmV4dEFVKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIHBBVS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogQ2hhbmdlIHN0YXRlcyAqLwotICAgIGMtPm1fc3RhdGUgPSBNNFBDTVJfa1JlYWRpbmc7IC8qIE5vdCBjaGFuZ2VkIC4uLiAqLwotICAgIGMtPm1fbWljcm9TdGF0ZSA9IE00UENNUl9rUmVhZGluZzsgLyogQVUgaXMgZGVsZXRlZCwgYW5vdGhlciBBVSBjYW4gYmUgcmVhZCAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9zZWVrKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaW1lIHRpbWUsIE00U1lTX3NlZWtBY2Nlc3NNb2RlIHNlZWtBY2Nlc3NNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUqIHBPYnRhaW5DVFNbXSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gc2Vla3MgaW50byB0aGUgUENNIGZpbGUgYXQgdGhlIHByb3ZpZGVkIHRpbWUKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyB0byBzZWVrCi0gKiAgICAgICAgICAtIERldGVybWluZXMgZnJvbSBwcm92aWRlZCB0aW1lIG1fb2Zmc2V0IHRvIHNlZWsgaW4gZmlsZQotICogICAgICAgICAgLSBJZiBtX29mZnNldCBpcyBjb3JyZWN0LCBzZWVrIGluIGZpbGUKLSAqICAgICAgICAgIC0gVXBkYXRlIG5ldyBtX29mZnNldCBpbiBQQ00gcmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgcFN0cmVhbUlEOiAoSU4pIFN0cmVhbSBzZWxlY3Rpb24gKG5vdCB1c2VkLCBvbmx5IDEgc3RyZWFtKQotICogQHBhcmFtICAgdGltZTogKElOKSBUYXJnZXRlZCB0aW1lCi0gKiBAcGFyYW0gICBzZWVrTW9kZTogKElOKSBTZWxlY3RzIHRoZSBzZWVrIGFjY2VzcyBtb2RlCi0gKiBAcGFyYW0gICBwT2J0YWluQ1RTW106IChPVVQpIFJldHVybmVkIFRpbWUgKG5vdCB1c2VkKQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICBNNFdBUl9JTlZBTElEX1RJTUUgICAgICBTcGVjaWZpZWQgdGltZSBpcyBub3QgcmVhY2hhYmxlCi0gKiBAcGFyYW0gICBNNEVSUl9OT1RfSU1QTEVNRU5URUQgICBUaGlzIHNlZWsgbW9kZSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfc2VlayhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSUQsIE00T1NBX1RpbWUgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TZWVrQWNjZXNzTW9kZSBzZWVrQWNjZXNzTW9kZSwgTTRPU0FfVGltZSogcE9idGFpbkNUUykKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIG9mZnNldDsKLSAgICBNNE9TQV9VSW50MzIgYWxpZ25tZW50OwotICAgIE00T1NBX1VJbnQzMiBzaXplX3JlYWQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gY29udGV4dCkgfHwgKE00T1NBX05VTEwgPT0gcFN0cmVhbUlEKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgUmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZihjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQgJiYgYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgc3dpdGNoKHNlZWtBY2Nlc3NNb2RlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rQmVnaW5uaW5nOgotICAgICAgICAgICAgLyogRGV0ZXJtaW5lIG1fb2Zmc2V0IGZyb20gdGltZSovCi0gICAgICAgICAgICBvZmZzZXQgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHRpbWUgKiAoKE00T1NBX0RvdWJsZSkoYy0+bV9kZWNvZGVyQ29uZmlnLkF2Z0J5dGVzUGVyU2VjKSAvIDEwMDApKTsKLSAgICAgICAgICAgIC8qKiBjaGVjayB0aGUgYWxpZ25tZW50IG9uIHNhbXBsZSBib3VuZGFyeSAqLwotICAgICAgICAgICAgYWxpZ25tZW50ID0gYy0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHMqYy0+bV9kZWNvZGVyQ29uZmlnLkJpdHNQZXJTYW1wbGUvODsKLSAgICAgICAgICAgIGlmIChvZmZzZXQlYWxpZ25tZW50ICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0IC09IG9mZnNldCVhbGlnbm1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKmFkZCB0aGUgaGVhZGVyIG9mZnNldCovCi0gICAgICAgICAgICBvZmZzZXQgKz0gYy0+bV9kYXRhU3RhcnRPZmZzZXQ7Ci0gICAgICAgICAgICAvKiBJZiBtX29mZnNldCBpcyBvdmVyIGZpbGUgc2l6ZSAtPiBJbnZhbGlkIHRpbWUgKi8KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiAoYy0+bV9kYXRhU3RhcnRPZmZzZXQgKyBjLT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX0lOVkFMSURfVElNRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBTZWVrIGZpbGUgKi8KLSAgICAgICAgICAgICAgICBzaXplX3JlYWQgPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gYy0+bV9wRmlsZVJlYWRGdW5jLT5zZWVrKGMtPm1fZmlsZUNvbnRleHQsIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVQb3NpdGlvbiAqKSAmc2l6ZV9yZWFkKTsKLSAgICAgICAgICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBtX29mZnNldCBpbiBNNFBDTVJfY29udGV4dCAqLwotICAgICAgICAgICAgICAgIGMtPm1fb2Zmc2V0ID0gb2Zmc2V0IC0gYy0+bV9kYXRhU3RhcnRPZmZzZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX2Nsb3NlUmVhZChNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGNsb3NlcyBQQ00gZmlsZSwgYW5kIGZyZWVzIGNvbnRleHQKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyBjbG9zZSB0aGUgUENNIGZpbGUKLSAqICAgICAgICAgIC0gQ2xvc2VzIHRoZSBmaWxlCi0gKiAgICAgICAgICAtIEZyZWUgc3RydWN0dXJlcwotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfY2xvc2VSZWFkKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoTTRPU0FfTlVMTCA9PSBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZihjLT5tX3BEZWNvZGVyU3BlY0luZm8gIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoYy0+bV9wRGVjb2RlclNwZWNJbmZvKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBSZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLSAgICBlbHNlIGlmKGMtPm1fbWljcm9TdGF0ZSA9PSBNNFBDTVJfa1JlYWRpbmdfbmV4dEFVKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IGMtPm1fcEF1QnVmZmVyKQotICAgIHsKLSAgICAgICAgZnJlZShjLT5tX3BBdUJ1ZmZlcik7Ci0gICAgfQotCi0gICAgLyogQ2xvc2UgdGhlIGZpbGUgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBjLT5tX3BGaWxlUmVhZEZ1bmMpCi0gICAgewotICAgICAgICBlcnIgPSBjLT5tX3BGaWxlUmVhZEZ1bmMtPmNsb3NlUmVhZChjLT5tX2ZpbGVDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKiBGcmVlIGludGVybmFsIGNvbnRleHQgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBjKQotICAgIHsKLSAgICAgICAgZnJlZShjKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBWYWx1ZSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gZ2V0IG9wdGlvbiBvZiB0aGUgUENNIFJlYWRlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIHRvIGdldCBhbiBvcHRpb24KLSAqICAgICAgICAgIC0gUmV0dXJuIGNvcnJlc3BvbmRpbmcgb3B0aW9uIHZhbHVlCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24gdG8gZ2V0Ci0gKiBAcGFyYW0gICBwVmFsdWU6IChPVVQpIFZhcmlhYmxlIHdoZXJlIHRoZSBvcHRpb24gdmFsdWUgaXMgcmV0dXJuZWQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMLgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZS4KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIHRoaXMgb3B0aW9uIGlzIG5vdCBhdmFpbGFibGUgbm93LgotICogQHJldHVybiAgTTRFUlJfTk9UX0lNUExFTUVOVEVEICAgdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBwVmFsdWUpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPShNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoTTRPU0FfTlVMTCA9PSBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayByZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKChjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZykgJiYgKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZClcCi0gICAgICAgICAmJiAoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIERlcGVuZCBvZiB0aGUgT3B0aW9uSUQsIHRoZSB2YWx1ZSB0byByZXR1cm4gaXMgZGlmZmVyZW50ICovCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFBDTVJfa1BDTWJsb2NrU2l6ZToKLSAgICAgICAgICAgICpwVmFsdWUgPSAmYy0+bV9ibG9ja1NpemU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFBDTVJfT3B0aW9uSUQgb3B0aW9uSUQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gVmFsdWUpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHNldCBvcHRpb24gb2YgdGhlIFBDTSBSZWFkZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyB0byBzZXQgYW4gb3B0aW9uCi0gKiAgICAgICAgICAtIFNldCBjb3JyZXNwb25kaW5nIG9wdGlvbiB2YWx1ZQotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uIHRvIGdldAotICogQHBhcmFtICAgVmFsdWU6IChJTikgVmFyaWFibGUgd2hlcmUgdGhlIG9wdGlvbiB2YWx1ZSBpcyBzdG9yZWQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMLgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZS4KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIHRoaXMgb3B0aW9uIGlzIG5vdCBhdmFpbGFibGUgbm93LgotICogQHJldHVybiAgTTRFUlJfTk9UX0lNUExFTUVOVEVEICAgdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIFZhbHVlKQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0oTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKGNvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZigoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmcpICYmIChjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQpXAotICAgICAgICAgJiYgKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBEZXBlbmQgb2YgdGhlIE9wdGlvbklELCB0aGUgdmFsdWUgdG8gc2V0IGlzIGRpZmZlcmVudCAqLwotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRQQ01SX2tQQ01ibG9ja1NpemU6Ci0gICAgICAgICAgICBjLT5tX2Jsb2NrU2l6ZSA9IChNNE9TQV9VSW50MzIpVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQQ01SX2dldFZlcnNpb24gKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzEoIk00UENNUl9nZXRWZXJzaW9uIGNhbGxlZCB3aXRoIHBWZXJzaW9uOiAweCV4IiwgcFZlcnNpb24pOwotICAgIE00T1NBX0RFQlVHX0lGMSgoKE00T1NBX1VJbnQzMikgcFZlcnNpb24gPT0gMCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBWZXJzaW9uIGlzIE5VTEwgaW4gTTRQQ01SX2dldFZlcnNpb24iKTsKLQotICAgIHBWZXJzaW9uLT5tX21ham9yID0gTTRQQ01SX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb24tPm1fbWlub3IgPSBNNFBDTVJfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbi0+bV9yZXZpc2lvbiA9IE00UENNUl9WRVJTSU9OX1JFVklTSU9OOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9BUEkuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX0FQSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNDJmZmI3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQVE8zR1BQX0FQSS5jCi0gKiBAYnJpZWYgICBQaWN0dXJlIHRvIDNncHAgU2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKjE2IGJ5dGVzIHNpZ25hdHVyZSB0byBiZSB3cml0dGVuIGluIHRoZSBnZW5lcmF0ZWQgM2dwIGZpbGVzICovCi0jZGVmaW5lIE00UFRPM0dQUF9TSUdOQVRVUkUgICAgICJOWFAtU1cgOiBQVE8zR1BQIgotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLS8qKgotICogIE91ciBoZWFkZXIgKi8KLSNpbmNsdWRlICJNNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00UFRPM0dQUF9BUEkuaCIKLQotLyoqCi0gKiAgT3VyIGVycm9ycyAqLwotI2luY2x1ZGUgIk00UFRPM0dQUF9FcnJvckNvZGVzLmgiCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5oIgotI2VuZGlmCi0KLQotLyoqCi0gKiAgT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgICAgIC8qIE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgICAgICAgLyogT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKiogVmFyaW91cyBNYWdpY2FscyAqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00UFRPM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTTRQVE8zR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQgICAgICAgICAgICAgICAgMgotI2RlZmluZSBNNFBUTzNHUFBfUVVBTlRJWkVSX1NURVAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8qKjwgUXVhbnRpemVyIHN0ZXAgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19QUk9GSUxFX0xFVkVMICAgICAgICAgICAgMHhGRiAgICAvKio8IE5vIHNwZWNpZmljIHByb2ZpbGUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCAqLwotI2RlZmluZSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX0FNUl9USU1FX1NDQUxFICAgICAgICAgICA4MDAwICAgIC8qKjwgQU1SICovCi0jZGVmaW5lIE00UFRPM0dQUF9CSVRSQVRFX1JFR1VMQVRJT05fQ1RTX1BFUklPRF9JTl9NUyAgIDUwMCAgICAgLyoqPCBNQUdJQ0FMICovCi0jZGVmaW5lIE00UFRPM0dQUF9NQVJHRV9PRl9GSUxFX1NJWkUgICAgICAgICAgICAgICAgICAgIDI1MDAwICAgLyoqPCBNQUdJQ0FMICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGRlZmluZSAgIEFNUiAxMi4yIGticHMgc2lsZW5jZSBmcmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzEyMl9TSVpFICAgICAzMgotI2RlZmluZSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMTIyX0RVUkFUSU9OIDIwCi1jb25zdCBNNE9TQV9VSW50OCBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfMTIyX0ZSQU1FW000UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8xMjJfU0laRV09Ci17IDB4M0MsIDB4OTEsIDB4MTcsIDB4MTYsIDB4QkUsIDB4NjYsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDEsIDB4RTcsIDB4QUYsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLQotI2RlZmluZSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgICAgIDEzCi0jZGVmaW5lIE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT04gMjAKLWNvbnN0IE00T1NBX1VJbnQ4IE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV8wNDhfRlJBTUVbTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci17IDB4MDQsIDB4RkYsIDB4MTgsIDB4QzcsIDB4RjAsIDB4MEQsIDB4MDQsIDB4MzMsIDB4RkYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKiogIlByaXZhdGUiIGZ1bmN0aW9ucyAqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIE00T1NBX0VSUiBNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyhNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKiAiRXh0ZXJuYWwiIGZ1bmN0aW9ucyAqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIHBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKTsKLWV4dGVybiBNNE9TQV9FUlIgTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpOwotZXh0ZXJuIE00T1NBX0VSUiBNNFJFQURFUl8zR1BfZ2V0SW50ZXJmYWNlcyhNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKiAiU3RhdGljIiBmdW5jdGlvbnMgKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgTTRPU0FfRVJSIE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwV3JpdGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgbXRJbmNDdHMpOwotc3RhdGljIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0KiBwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcFdyaXRlckF1ZGlvQVUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgbXRJbmNDdHMpOwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0gKiBAYnJpZWYgICBHZXQgdGhlIE00UFRPM0dQUCB2ZXJzaW9uLgotICogQG5vdGUgICAgQ2FuIGJlIGNhbGxlZCBhbnl0aW1lLiBEbyBub3QgbmVlZCBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgIHBWZXJzaW9uSW5mbyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfR2V0VmVyc2lvbiBjYWxsZWQgd2l0aCBwVmVyc2lvbkluZm89MHgleCIsIHBWZXJzaW9uSW5mbyk7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTD09cFZlcnNpb25JbmZvKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiTTRQVE8zR1BQX0dldFZlcnNpb246IHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBwVmVyc2lvbkluZm8tPm1fbWFqb3IgICAgICAgPSBNNFBUTzNHUFBfVkVSU0lPTl9NQUpPUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fbWlub3IgICAgICAgPSBNNFBUTzNHUFBfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gICAgPSBNNFBUTzNHUFBfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfSW5pdChNNFBUTzNHUFBfQ29udGV4dCogcENvbnRleHQpOwotICogQGJyaWVmICAgSW5pdGlhbGl6ZXMgdGhlIE00UFRPM0dQUCAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIE00UFRPM0dQUCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICBwRmlsZVJlYWRQdHJGY3QgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9Jbml0KCAgIE00UFRPM0dQUF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZVB0ckZjdCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAqcEM7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX0luaXQgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIk00UFRPM0dQUF9Jbml0OiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgQWxsb2NhdGUgdGhlIE00UFRPM0dQUCBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KLSAgICBwQyA9IChNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQpLCBNNFBUTzNHUFAsCi0gICAgICAgIChNNE9TQV9DaGFyICopIk00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQiKTsKLSAgICAqcENvbnRleHQgPSBwQzsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfU3RlcCgpOiB1bmFibGUgdG8gYWxsb2NhdGUgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCxcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEluaXQgdGhlIGNvbnRleHQuIEFsbCBwb2ludGVycyBtdXN0IGJlIGluaXRpYWxpemVkIHRvIE00T1NBX05VTEwgYmVjYXVzZSBDbGVhblVwKCkKLSAgICAgICAgY2FuIGJlIGNhbGxlZCBqdXN0IGFmdGVyIEluaXQoKS4gKi8KLSAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfQ1JFQVRFRDsKLSAgICBwQy0+bV9WaWRlb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+bV9BdWRpb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLQotICAgIC8qKgotICAgICAqICBSZWFkZXIgc3R1ZmYgKi8KLSAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVSAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSAgICA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAgKiAgV3JpdGVyIHN0dWZmICovCi0gICAgcEMtPm1fcEVuY29kZXJIZWFkZXIgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0gICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbz0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgICogIENvbnRleHRzIG9mIHRoZSB1c2VkIG1vZHVsZXMgICovCi0gICAgcEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcDNncFdyaXRlckNvbnRleHQgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX2VFbmNvZGVyU3RhdGUgPSBNNFBUTzNHUFBfa05vRW5jb2RlcjsKLQotICAgIC8qKgotICAgICAqICBJbnRlcmZhY2VzIG9mIHRoZSB1c2VkIG1vZHVsZXMgKi8KLSAgICBwQy0+bV9wUmVhZGVyR2xvYkludCAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJbnQgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BXcml0ZXJHbG9iSW50ICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyRGF0YUludCAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcEVuY29kZXJJbnQgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BFbmNvZGVyRXh0ZXJuYWxBUEkgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BFbmNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgICogRmlsbCB0aGUgT1NBTCBmaWxlIGZ1bmN0aW9uIHNldCAqLwotICAgIHBDLT5wT3NhbEZpbGVSZWFkID0gcEZpbGVSZWFkUHRyRmN0OwotICAgIHBDLT5wT3NhbEZpbGVXcml0ZSA9IHBGaWxlV3JpdGVQdHJGY3Q7Ci0KLSAgICAvKioKLSAgICAgKiAgVmlkZW8gcmF0ZSBjb250cm9sIHN0dWZmICovCi0gICAgcEMtPm1fbXRDdHMgICAgICAgICAgICAgPSAwLjBGOwotICAgIHBDLT5tX210TmV4dEN0cyAgICAgICAgID0gMC4wRjsKLSAgICBwQy0+bV9tdEF1ZGlvQ3RzICAgICAgICA9IDAuMEY7Ci0gICAgcEMtPm1fQXVkaW9PZmZTZXQgICAgICAgPSAwLjBGOwotICAgIHBDLT5tX2RMYXN0VmlkZW9SZWd1bEN0cz0gMC4wRjsKLSAgICBwQy0+bV9QcmV2QXVkaW9DdHMgICAgICA9IDAuMEY7Ci0gICAgcEMtPm1fRGVsdGFBdWRpb0N0cyAgICAgPSAwLjBGOwotCi0gICAgcEMtPm1fTWF4RmlsZVNpemUgICAgICAgPSAwOwotICAgIHBDLT5tX0N1cnJlbnRGaWxlU2l6ZSAgID0gMDsKLQotICAgIHBDLT5tX0lzTGFzdFBpY3R1cmUgICAgICAgICA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX2JBdWRpb1BhZGRpbmdTaWxlbmNlICA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX2JMYXN0SW50ZXJuYWxDYWxsQmFjayA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX05iQ3VycmVudEZyYW1lICAgICAgICA9IDA7Ci0KLSAgICBwQy0+cFNhdmVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT51aVNhdmVkRHVyYXRpb24gPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9Jbml0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9PcGVuKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0LCBNNFBUTzNHUFBfUGFyYW1zKiBwUGFyYW1zKTsKLSAqIEBicmllZiAgIFNldCB0aGUgTTRQVE8zR1BQIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBtYXkgbm90IGJlIGNyZWF0ZWQgeWV0LgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUGFyYW1zICAgICAgICAgICAgIChJTikgUG9pbnRlciB0byB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIFBUTzNHUFAuCi0gKiBAbm90ZSAgICBUaGUgcG9pbnRlZCBzdHJ1Y3R1cmUgY2FuIGJlIGRlLWFsbG9jYXRlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYmVjYXVzZQotICogICAgICAgICAgaXQgaXMgaW50ZXJuYWxseSBjb3BpZWQgYnkgdGhlIFBUTzNHUFAKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE00UFRPM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgcGFyYW1ldGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUgICAgICBUaGUgb3V0cHV0IHZpZGVvIGJpdC1yYXRlIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgICBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfRklMRV9TSVpFICAgICAgICAgIFRoZSBvdXRwdXQgZmlsZSBzaXplIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkRFRklORURfQVVESU9fUEFERElORyAgICAgICAgICAgICBUaGUgb3V0cHV0IGF1ZGlvIHBhZGRpbmcgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX1VOSEFORExFRF9BVURJT19UUkFDS19JTlBVVF9GSUxFICAgIFRoZSBpbnB1dCBhdWRpbyBmaWxlIGNvbnRhaW5zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHRyYWNrIGZvcm1hdCBub3QgaGFuZGxlZCBieSBQVE8zR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfT3BlbihNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCwgTTRQVE8zR1BQX1BhcmFtcyogcFBhcmFtcykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAgICpwQyA9IChNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgICAgbWVkaWFGYW1pbHk7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgcFN0cmVhbUhhbmRsZXI7Ci0gICAgTTRSRUFERVJfTWVkaWFUeXBlICAgICAgcmVhZGVyTWVkaWFUeXBlOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00UFRPM0dQUF9PcGVuIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBQYXJhbXM9MHgleCIsIHBDb250ZXh0LCBwUGFyYW1zKTsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLCBcCi0gICAgICAgICAgICAgICAgICAgICJNNFBUTzNHUFBfT3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUGFyYW1zKSwgIE00RVJSX1BBUkFNRVRFUiwgXAotICAgICAgICAgICAgICAgICAgICAiTTRQVE8zR1BQX09wZW46IHBQYXJhbXMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIHBhcmFtZXRlcnMgY29ycmVjdG5lc3MgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFBhcmFtcy0+cFBpY3R1cmVDYWxsYmFja0ZjdCksCi0gICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNFBUTzNHUFBfT3BlbjogcEMtPm1fUGFyYW1zLnBQaWN0dXJlQ2FsbGJhY2tGY3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUGFyYW1zLT5wUGljdHVyZUNhbGxiYWNrQ3R4dCksCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAiTTRQVE8zR1BQX09wZW46IHBDLT5tX1BhcmFtcy5wUGljdHVyZUNhbGxiYWNrQ3R4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBQYXJhbXMtPnBPdXRwdXQzZ3BwRmlsZSksCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRQVE8zR1BQX09wZW46IHBDLT5tX1BhcmFtcy5wT3V0cHV0M2dwcEZpbGUgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUGFyYW1zLT5wVGVtcG9yYXJ5RmlsZSksCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRQVE8zR1BQX09wZW46IHBDLT5tX1BhcmFtcy5wVGVtcG9yYXJ5RmlsZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBGb3JtYXQgKi8KLSAgICBpZiggKE00VklERU9FRElUSU5HX2tIMjYzICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa01QRUc0ICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa0gyNjQgIT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQpKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmb3JtYXQiKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUOwotICAgICB9Ci0KLSAgICAgLyoqCi0gICAgICogVmlkZW8gQml0cmF0ZSAqLwotICAgIGlmKCEoKE00VklERU9FRElUSU5HX2sxNl9LQlBTICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMjRfS0JQUyAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazMyX0tCUFMgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s0OF9LQlBTICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rNjRfS0JQUyAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazk2X0tCUFMgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2sxMjhfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMTkyX0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2syODhfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMzg0X0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazUxMl9LQlBTICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s4MDBfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgKE00VklERU9FRElUSU5HX2syX01CUFMgICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rNV9NQlBTICAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazhfTUJQUyAgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkpKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBiaXRyYXRlIik7Ci0gICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZnJhbWUgc2l6ZSAqLwotICAgIGlmICghKChNNFZJREVPRURJVElOR19rU1FDSUYgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tRUVZHQSA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa1FDSUYgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tRVkdBID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rQ0lGICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa1ZHQSAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0KLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa05UU0MgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tXVkdBID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotCi0gICAgICAgICAgKE00VklERU9FRElUSU5HX2s2NDBfMzYwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rODU0XzQ4MCA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfazEyODBfNzIwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rMTA4MF83MjAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2s5NjBfNzIwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rMTkyMF8xMDgwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSkpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9PcGVuOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUiKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXhpbXVtIHNpemUgb2YgdGhlIG91dHB1dCAzR1BQIGZpbGUgKi8KLSAgICBpZiAoISgoTTRQVE8zR1BQX2s1MF9LQiAgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rNzVfS0IgICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazEwMF9LQiAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2sxNTBfS0IgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rMjAwX0tCICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazMwMF9LQiAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2s0MDBfS0IgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rNTAwX0tCICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfa1VOTElNSVRFRCA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkpKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIG91dHB1dCAzR1BQIGZpbGUgc2l6ZSIpOwotICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9GSUxFX1NJWkU7Ci0gICAgfQotCi0gICAgLyogQXVkaW8gcGFkZGluZyAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBQYXJhbXMtPnBJbnB1dEF1ZGlvVHJhY2tGaWxlKSB7Ci0gICAgICAgIGlmICgoISggKE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Ob25lICAgPT0gcFBhcmFtcy0+QXVkaW9QYWRkaW5nTW9kZSkgfHwKLSAgICAgICAgICAgICAgICAoTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX1NpbGVuY2U9PSBwUGFyYW1zLT5BdWRpb1BhZGRpbmdNb2RlKSB8fAotICAgICAgICAgICAgICAgIChNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTG9vcCAgID09IHBQYXJhbXMtPkF1ZGlvUGFkZGluZ01vZGUpKSkpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIGF1ZGlvIHBhZGRpbmciKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfQVVESU9fUEFERElORzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgU2l6ZSBjaGVjayBmb3IgSDI2MyAob25seSB2YWxpZCBzaXplcyBhcmUgQ0lGLCBRQ0lGIGFuZCBTUUNJRikgKi8KLSAgICBpZiAoKE00VklERU9FRElUSU5HX2tIMjYzID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa1NRQ0lGICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa1FDSUYgIT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpICYmCi0gICAgICAgIChNNFZJREVPRURJVElOR19rQ0lGICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW4oKTpcCi0gICAgICAgICAgICAgcmV0dXJuaW5nIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyIpOwotICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiAoTTRQVE8zR1BQX2tTdGF0ZV9DUkVBVEVEICE9IHBDLT5tX1N0YXRlKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLCBwQy0+bV9TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3B5IHRoZSBNNFBUTzNHUFBfUGFyYW1zIHN0cnVjdHVyZSAqLwotICAgIG1lbWNweSgodm9pZCAqKSgmcEMtPm1fUGFyYW1zKSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBQYXJhbXMsIHNpemVvZihNNFBUTzNHUFBfUGFyYW1zKSk7Ci0gICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuOiBvdXRwdXRWaWRlb0JpdHJhdGUgPSAlZCIsIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIE9wZW4gaW5wdXQgZmlsZSB3aXRoIHRoZSByZWFkZXIgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fUGFyYW1zLnBJbnB1dEF1ZGlvVHJhY2tGaWxlKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIHJlYWRlciBpbnRlcmZhY2UgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBhdWRpbyBmaWxlIHR5cGUgKi8KLSAgICAgICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5BdWRpb0ZpbGVGb3JtYXQpCi0gICAgICAgIHsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SOgotICAgICAgICBlcnIgPSBNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlcyggJnJlYWRlck1lZGlhVHlwZSwgJnBDLT5tX3BSZWFkZXJHbG9iSW50LAotICAgICAgICAgICAgICAgICZwQy0+bV9wUmVhZGVyRGF0YUludCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgQUFDX1NVUFBPUlRFRAotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOgotICAgICAgICAgICAgZXJyID0gTTRSRUFERVJfM0dQX2dldEludGVyZmFjZXMoICZyZWFkZXJNZWRpYVR5cGUsICZwQy0+bV9wUmVhZGVyR2xvYkludCwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5tX3BSZWFkZXJEYXRhSW50KTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTogTTRSRUFERVJfM0dQX2dldEludGVyZmFjZXMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOSEFORExFRF9BVURJT19UUkFDS19JTlBVVF9GSUxFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBJbml0aWFsaXplcyB0aGUgcmVhZGVyIHNoZWxsICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RDcmVhdGUoJnBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBwUmVhZGVyR2xvYkludC0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fcFJlYWRlckRhdGFJbnQtPm1fcmVhZGVyQ29udGV4dCA9IHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQ7Ci0gICAgICAgIC8qKjwgTGluayB0aGUgcmVhZGVyIGludGVyZmFjZSB0byB0aGUgcmVhZGVyIGNvbnRleHQgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgICogIFNldCB0aGUgcmVhZGVyIHNoZWxsIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucyAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0U2V0T3B0aW9uKHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIsICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+cE9zYWxGaWxlUmVhZCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IHBSZWFkZXJHbG9iSW50LT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogIE9wZW4gdGhlIGlucHV0IGF1ZGlvIGZpbGUgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdE9wZW4ocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5wSW5wdXRBdWRpb1RyYWNrRmlsZSk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IHBSZWFkZXJHbG9iSW50LT5tX3BGY3RPcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0RGVzdHJveShwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0KTsKLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgR2V0IHRoZSBhdWRpbyBzdHJlYW1zIGZyb20gdGhlIGlucHV0IGZpbGUgKi8KLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgd2hpbGUgKE00Tk9fRVJST1IgPT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0R2V0TmV4dFN0cmVhbShwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICZtZWRpYUZhbWlseSwgJnBTdHJlYW1IYW5kbGVyKTsKLQotICAgICAgICAgICAgaWYoKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKio8IEZvdW5kIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgIGlmICgoTTRSRUFERVJfa01lZGlhRmFtaWx5QXVkaW8gPT0gbWVkaWFGYW1pbHkpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0gPSAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKilwU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBLZWVwIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX09wZW4oKTogRm91bmQgYW4gYXVkaW8gc3RyZWFtIGluIGlucHV0Iik7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIEFsbG9jYXRlIGF1ZGlvIEFVIHVzZWQgZm9yIHJlYWQgb3BlcmF0aW9ucyAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVSA9IChNNF9BY2Nlc3NVbml0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0FjY2Vzc1VuaXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRQVE8zR1BQLChNNE9TQV9DaGFyICopInBSZWFkZXJBdWRpb0FVIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5tX3BSZWFkZXJBdWRpb0FVKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW4oKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBSZWFkZXJBdWRpb0FVLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAgSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLCBwQy0+bV9wUmVhZGVyQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJHbG9iSW50LT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChNNFdBUl9OT19NT1JFX1NUUkVBTSAhPSBlcnIpIC8qKjwgVW5leHBlY3RlZCBlcnJvciBjb2RlICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckdsb2JJbnQtPm1fcEZjdEdldE5leHRTdHJlYW0gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IC8qIHdoaWxlKi8KLSAgICB9IC8qaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fUGFyYW1zLnBJbnB1dEF1ZGlvVHJhY2tGaWxlKSovCi0KLSAgICBwQy0+bV9WaWRlb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9TVEFSVEVEOwotCi0gICAgLyoqCi0gICAgICogSW5pdCB0aGUgYXVkaW8gc3RyZWFtICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEMtPm1fQXVkaW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdFJlc2V0KHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTogcFJlYWRlckRhdGFJbnQtPm1fcEZjdFJlc2V0KGF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfT1BFTkVEOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtYXggRmlsZSBzaXplICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRGaWxlTWF4U2l6ZSkKLSAgICB7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazUwX0tCOiAgcEMtPm1fTWF4RmlsZVNpemUgPSA1MDAwMDsgIGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2s3NV9LQjogIHBDLT5tX01heEZpbGVTaXplID0gNzUwMDA7ICBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rMTAwX0tCOiBwQy0+bV9NYXhGaWxlU2l6ZSA9IDEwMDAwMDsgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazE1MF9LQjogcEMtPm1fTWF4RmlsZVNpemUgPSAxNTAwMDA7IGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2syMDBfS0I6IHBDLT5tX01heEZpbGVTaXplID0gMjAwMDAwOyBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rMzAwX0tCOiBwQy0+bV9NYXhGaWxlU2l6ZSA9IDMwMDAwMDsgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazQwMF9LQjogcEMtPm1fTWF4RmlsZVNpemUgPSA0MDAwMDA7IGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2s1MDBfS0I6IHBDLT5tX01heEZpbGVTaXplID0gNTAwMDAwOyBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rVU5MSU1JVEVEOgotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX09wZW4oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX1N0ZXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiB0cmFuY29kaW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgTTRQVE8zR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkcgRW5jb2RpbmcgY29tcGxldGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfU3RlcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgbF91aUF1ZGlvU3RlcENvdW50ID0gMDsKLSAgICBNNE9TQV9JbnQzMiAgSnVtcFRvVGltZSA9IDA7Ci0gICAgTTRPU0FfVGltZSAgbXRJbmNDdHM7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTD09cENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00UFRPM0dQUF9TdGVwOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYgKCAhKChNNFBUTzNHUFBfa1N0YXRlX09QRU5FRCA9PSBwQy0+bV9TdGF0ZSkgfHwgKE00UFRPM0dQUF9rU3RhdGVfUkVBRFkgPT0gcEMtPm1fU3RhdGUpKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwgcEMtPm1fU3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioKLSAgICAgKiAgSW4gY2FzZSB0aGlzIGlzIHRoZSBmaXJzdCBzdGVwLCB3ZSBwcmVwYXJlIHRoZSBkZWNvZGVyLCB0aGUgZW5jb2RlciBhbmQgdGhlIHdyaXRlciAqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0YXRlX09QRU5FRCA9PSBwQy0+bV9TdGF0ZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNFBUTzNHUFBfU3RlcCgpOiBUaGlzIGlzIHRoZSBmaXJzdCBzdGVwLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmciKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogIFByZXBhcmUgdGhlIHJlYWRlciwgdGhlIGRlY29kZXIsIHRoZSBlbmNvZGVyLCB0aGUgd3JpdGVyLi4uICovCi0gICAgICAgIGVyciA9IE00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKHBDKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgICAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfUkVBRFk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9TdGVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIChhKSIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsgLyoqPCB3ZSBvbmx5IGRvIHRoYXQgaW4gdGhlIGZpcnN0IHN0ZXAsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IFJFQUwgc3RlcCB3aWxsIGJlIHRoZSBuZXh0IG9uZSAqLwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSB0YXJnZXRlZCBmaWxlIHNpemUuCi0gICAgICogV2UgZG8gdGhhdCBiZWZvcmUgdGhlIGVuY29kaW5nLCBiZWNhdXNlIHRoZSBjb3JlIGVuY29kZXIgaGFzIHRvIGtub3cgaWYgdGhpcyBpcwotICAgICAqIHRoZSBsYXN0IGZyYW1lIHRvIGVuY29kZSAqLwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0R2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9rRmlsZVNpemVBdWRpb0VzdGltYXRlZCwgKE00T1NBX0RhdGFPcHRpb24pICZwQy0+bV9DdXJyZW50RmlsZVNpemUpOwotICAgIGlmICgoMCAhPSBwQy0+bV9NYXhGaWxlU2l6ZSkgJiYKLSAgICAgICAgLyoqPCBBZGQgYSBtYXJnZSB0byB0aGUgZmlsZSBzaXplIGluIG9yZGVyIHRvIG5ldmVyIGV4Y2VlZCB0aGUgbWF4IGZpbGUgc2l6ZSAqLwotICAgICAgICgocEMtPm1fQ3VycmVudEZpbGVTaXplICsgTTRQVE8zR1BQX01BUkdFX09GX0ZJTEVfU0laRSkgPj0gcEMtPm1fTWF4RmlsZVNpemUpKQotICAgIHsKLSAgICAgICAgcEMtPm1fSXNMYXN0UGljdHVyZSA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIEF0IHRoYXQgcG9pbnQgd2UgYXJlIGluIE00UFRPM0dQUF9rU3RhdGVfUkVBRFkgc3RhdGUKLSAgICAqICBXZSBwZXJmb3JtIG9uZSBzdGVwIG9mIHZpZGVvIGVuY29kaW5nCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyoqKioqKioqKioqKiogVklERU8gRU5DT0RJTkcgKioqKioqKioqKioqKioqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX1NUQVJURUQgPT0gcEMtPm1fVmlkZW9TdGF0ZSkgLyoqPElmIHRoZSB2aWRlbyBlbmNvZGluZyBpcyBnb2luZyBvbiovCi0gICAgeyAgIC8qKgotICAgICAgICAgKiBDYWxsIHRoZSBlbmNvZGVyICAqLwotICAgICAgICBwQy0+bV9OYkN1cnJlbnRGcmFtZSsrOwotCi0gICAgICAgIC8qIENoZWNrIGlmIGl0IGlzIHRoZSBsYXN0IGZyYW1lIHRoZSB0byBlbmNvZGUgKi8KLSAgICAgICAgaWYoKHBDLT5tX1BhcmFtcy5OYlZpZGVvRnJhbWVzID4gMCkgXAotICAgICAgICAgICAgJiYgKHBDLT5tX05iQ3VycmVudEZyYW1lID49IHBDLT5tX1BhcmFtcy5OYlZpZGVvRnJhbWVzKSkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1fSXNMYXN0UGljdHVyZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTJfMigiTTRQVE8zR1BQX1N0ZXAoKTogQ2FsbGluZyBwRW5jb2RlckludC0+cEZjdEVuY29kZSB3aXRoIHZpZGVvQ3RzID0gJS4yZlwKLSAgICAgICAgICAgICAgICAgICAgICAgbmIgPSAlbHUiLCBwQy0+bV9tdEN0cywgcEMtPm1fTmJDdXJyZW50RnJhbWUpOwotCi0gICAgICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0RW5jb2RlKHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCwgTTRPU0FfTlVMTCwKLSAgICAgICAgICAgIC8qKjwgVGhlIGlucHV0IHBsYW5lIGlzIG51bGwgYmVjYXVzZSB0aGUgaW5wdXQgUGljdHVyZSB3aWxsIGJlIG9idGFpbmVkIGJ5IHRoZVwKLSAgICAgICAgICAgIFZQUCBmaWx0ZXIgZnJvbSB0aGUgY29udGV4dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX210Q3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bV9Jc0xhc3RQaWN0dXJlID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0xhc3RGcmFtZSA6IE00RU5DT0RFUl9rTm9ybWFsRnJhbWUpICk7Ci0gICAgICAgIC8qKjwgTGFzdCBwYXJhbSBzZXQgdG8gTTRPU0FfVFJVRSBzaWduYWxzIHRoYXQgdGhpcyBpcyB0aGUgbGFzdCBmcmFtZSB0byBiZSBlbmNvZGVkLFwKLSAgICAgICAgTTRPU0FfRkFMU0UgZWxzZSAqLwotCi0gICAgICAgIE00T1NBX1RSQUNFM18yKCJNNFBUTzNHUFBfU3RlcCgpOiBwRW5jb2RlckludC0+cEZjdEVuY29kZSByZXR1cm5zIDB4JXgsIHZpZEZvcm1hdCA9MHgleCIsCi0gICAgICAgICAgICBlcnIsIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgIGlmKChNNE5PX0VSUk9SID09IGVycikgJiYgKE00VklERU9FRElUSU5HX2tIMjY0ID09IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENoZWNrIGlmIGxhc3QgZnJhbWUuKgotICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX0lzTGFzdFBpY3R1cmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9TdGVwKCk6IExhc3QgcGljdHVyZSIpOwotICAgICAgICAgICAgICAgIHBDLT5tX1ZpZGVvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpIC8qKjwgVGhlIHZpZGVvIGVuY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfU3RlcCgpOiBwRW5jb2RlckludC0+cEZjdEVuY29kZSByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgIHBDLT5tX1ZpZGVvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSAgICAgLyoqPCBVbmV4cGVjdGVkIGVycm9yIGNvZGUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaWYoICgoKE00T1NBX1VJbnQzMilNNFdBUl9XUklURVJfU1RPUF9SRVEpID09IGVycikgfHwKLSAgICAgICAgICAgICAgICAgICAgKCgoTTRPU0FfVUludDMyKU00RVJSX0FMTE9DKSA9PSBlcnIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1N0ZXA6IHJldHVybmluZyBFUlJfUFRPM0dQUF9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBwRW5jb2RlckludC0+cEZjdEVuY29kZShsYXN0KSAoYSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvKio8IEVuZCBvZiB2aWRlbyBlbmNvZGluZyAqLwotCi0KLSAgICAvKioqKioqIEFVRElPIFRSQU5TQ09ESU5HIChyZWFkICsgbnVsbCBlbmNvZGluZyArIHdyaXRlKSAqKioqKiovCi0gICAgaWYgKE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfU1RBUlRFRCA9PSBwQy0+bV9BdWRpb1N0YXRlKQotICAgIHsKLSAgICAgICAgd2hpbGUgKCAoTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9TVEFSVEVEID09IHBDLT5tX0F1ZGlvU3RhdGUpICYmCi0gICAgICAgICAgICAgICAgKHBDLT5tX210QXVkaW9DdHMgPCBwQy0+bV9tdE5leHRDdHMpKQotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxfdWlBdWRpb1N0ZXBDb3VudCsrOwotICAgICAgICAgICAgaWYgKE00T1NBX0ZBTFNFID09IHBDLT5tX2JBdWRpb1BhZGRpbmdTaWxlbmNlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgUmVhZCB0aGUgbmV4dCBhdWRpbyBBVSBpbiB0aGUgaW5wdXQgQXVkaW8gZmlsZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSW50LT5tX3BGY3RHZXROZXh0QXUocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSwgcEMtPm1fcFJlYWRlckF1ZGlvQVUpOwotICAgICAgICAgICAgICAgIHBDLT5tX210QXVkaW9DdHMgPSBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9DVFMgKyBwQy0+bV9BdWRpb09mZlNldDsKLQotICAgICAgICAgICAgICAgIGlmIChNNFdBUl9OT19NT1JFX0FVID09IGVycikgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRQVE8zR1BQX1N0ZXAoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnQtPm1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuQXVkaW9QYWRkaW5nTW9kZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTm9uZToKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX0F1ZGlvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9TaWxlbmNlOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEbyBub3RoaW5nIGlmIHRoZSBpbnB1dCBhdWRpbyBmaWxlIGZvcm1hdCBpcyBub3QgQU1SICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9BdWRpb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fYkF1ZGlvUGFkZGluZ1NpbGVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTG9vcDoKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSnVtcCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhdWRpbyBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdEp1bXAocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSwgJkp1bXBUb1RpbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVhZGVyRGF0YUludC0+bV9wRmN0UmVzZXQoYXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fbXRBdWRpb0N0cyArPSAyMDsgLyo8IFNFTUMgYnVnIGZpeGVkIGF0IEx1bmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fQXVkaW9PZmZTZXQgPSBwQy0+bV9tdEF1ZGlvQ3RzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAnQlpaWicgYnVnIGZpeDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdEluY0N0cyA9IChNNE9TQV9UaW1lKSgocEMtPm1fbXRBdWRpb0N0cykgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+dGltZVNjYWxlIC8gMTAwMC4wKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZShwQy0+bV9wV3JpdGVyRGF0YUludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCAmcEMtPm1fV3JpdGVyQXVkaW9BVSwgbXRJbmNDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UFRPM0dQUF9BZGRBbXJTaWxlbmNlU2lkIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LyoqPCBBZGQgPT4gbm8gYXVkaW8gY3RzIGluY3JlbWVudC4uLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX0F1ZGlvT2ZmU2V0ID0gcEMtPm1fbXRBdWRpb0N0cyArIHBDLT5tX0RlbHRhQXVkaW9DdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZjogc3dpdGNoICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IHBSZWFkZXJEYXRhSW50LT5tX3BGY3RHZXROZXh0QXUoQXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogU2F2ZSB0aGUgZGVsdGEgQ3RzIChBQUMgb25seSkgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fRGVsdGFBdWRpb0N0cyA9IHBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX0NUUyAtIHBDLT5tX1ByZXZBdWRpb0N0czsKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fUHJldkF1ZGlvQ3RzICA9IHBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX0NUUzsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIFByZXBhcmUgdGhlIHdyaXRlciBBVSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wV3JpdGVyRGF0YUludC0+cFN0YXJ0QVUocEMtPm1fcDNncFdyaXRlckNvbnRleHQsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcEMtPm1fV3JpdGVyQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IHBXcml0ZXJEYXRhSW50LT5wU3RhcnRBVShBdWRpbylcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAgQ29weSBhdWRpbyBkYXRhIGZyb20gcmVhZGVyIEFVIHRvIHdyaXRlciBBVSAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRQVE8zR1BQX1N0ZXAoKTogQ29weWluZyBhdWRpbyBBVTogc2l6ZT0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fc2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIENvbnZlcnQgQ1RTIHVuaXQgZnJvbSBtaWxsaXNlY29uZHMgdG8gdGltZXNjYWxlICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLkNUUyAgPSAoTTRPU0FfVGltZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5tX0F1ZGlvT2ZmU2V0ICsgcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fQ1RTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT50aW1lU2NhbGUgLyAxMDAwLjApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5DVFMgPSAoTTRPU0FfVGltZSkocEMtPm1fbXRBdWRpb0N0cyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+dGltZVNjYWxlIC8gMTAwMC4wKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5uYkZyYWcgPSAwOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRQVE8zR1BQX1N0ZXAoKTogYXVkaW8gQVU6IENUUz0lZCBtcyIsIHBDLT5tX210QXVkaW9DdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fQ1RTKi8pOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAgV3JpdGUgaXQgdG8gdGhlIG91dHB1dCBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BXcml0ZXJEYXRhSW50LT5wUHJvY2Vzc0FVKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5tX1dyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IHBXcml0ZXJEYXRhSW50LT5wUHJvY2Vzc0FVKEF1ZGlvKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKio8IE00T1NBX1RSVUUgPT0gcEMtPm1fYkF1ZGlvUGFkZGluZ1NpbGVuY2UgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kID09Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIEZpbGwgaW4gYXVkaW8gYXUgd2l0aCBzaWxlbmNlICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX210QXVkaW9DdHMgKz0gMjA7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFBhZGQgd2l0aCBzaWxlbmNlICovCi0gICAgICAgICAgICAgICAgICAgIG10SW5jQ3RzID0gKE00T1NBX1RpbWUpKHBDLT5tX210QXVkaW9DdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICogKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+dGltZVNjYWxlIC8gMTAwMC4wKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UwNDhGcmFtZShwQy0+bV9wV3JpdGVyRGF0YUludCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCAmcEMtPm1fV3JpdGVyQXVkaW9BVSwgbXRJbmNDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IE00UFRPM0dQUF9BZGRBbXJTaWxlbmNlU2lkIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IERvIG5vdGhpbmcgaWYgdGhlIGlucHV0IGF1ZGlvIGZpbGUgZm9ybWF0IGlzIG5vdCBBTVIgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX0F1ZGlvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9IC8qKjwgd2hpbGUgKi8KLSAgICB9IC8qKjwgRW5kIG9mIGF1ZGlvIGVuY29kaW5nICovCi0KLSAgICBwQy0+bV9tdEN0cyA9IHBDLT5tX210TmV4dEN0czsKLQotICAgIC8qKgotICAgICAqICBUaGUgdHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgd2hlbiBubyBzdHJlYW0gaXMgYmVpbmcgZW5jb2RlZCBhbnltb3JlICovCi0gICAgaWYgKE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfRklOSVNIRUQgPT0gcEMtPm1fVmlkZW9TdGF0ZSkKLSAgICB7Ci0gICAgICAgIHBDLT5tX1N0YXRlID0gTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UFRPM0dQUF9TdGVwKCk6IHRyYW5zY29kaW5nIGZpbmlzaGVkLCByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICByZXR1cm4gTTRQVE8zR1BQX1dBUl9FTkRfT0ZfUFJPQ0VTU0lORzsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX1N0ZXAoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IgKGIpIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9DbG9zZShNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBGaW5pc2ggdGhlIE00UFRPM0dQUCB0cmFuc2NvZGluZy4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgIE00UFRPM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfQ2xvc2UoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgKnBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfRVJSICAgIG9zYUVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGxhc3RDVFM7Ci0gICAgTTRFTkNPREVSX0hlYWRlciogZW5jSGVhZGVyOwotICAgIE00U1lTX1N0cmVhbUlEbWVtQWRkciBzdHJlYW1IZWFkZXI7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX0Nsb3NlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTD09cENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsICJNNFBUTzNHUFBfQ2xvc2U6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmICgocEMtPm1fU3RhdGUgIT0gTTRQVE8zR1BQX2tTdGF0ZV9PUEVORUQpICYmCi0gICAgICAgIChwQy0+bV9TdGF0ZSAhPSBNNFBUTzNHUFBfa1N0YXRlX1JFQURZKSAmJgotICAgICAgICAocEMtPm1fU3RhdGUgIT0gTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRCkpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0Nsb3NlKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsIHBDLT5tX1N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiBGaW5pc2ggdGhlIGVuY29kaW5nICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0YXRlX1JFQURZID09IHBDLT5tX1N0YXRlKQotICAgIHsKLSAgICAgICAgcEMtPm1fU3RhdGUgPSBNNFBUTzNHUFBfa1N0YXRlX0ZJTklTSEVEOwotICAgIH0KLQotICAgIGlmIChNNFBUTzNHUFBfa0VuY29kZXJSdW5uaW5nID09IHBDLT5tX2VFbmNvZGVyU3RhdGUpCi0gICAgewotICAgICAgICBpZiAocEMtPm1fcEVuY29kZXJJbnQtPnBGY3RTdG9wICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9zYUVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0U3RvcChwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gb3NhRXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfY2xvc2U6IG1fcEVuY29kZXJJbnQtPnBGY3RTdG9wIHJldHVybnMgMHgleCIsIG9zYUVycik7Ci0gICAgICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rRW5jb2RlclN0b3BwZWQ7Ci0gICAgfQotCi0gICAgLyogSGFzIHRoZSBlbmNvZGVyIGFjdHVhbGx5IGJlZW4gb3BlbmVkPyBEb24ndCBjbG9zZSBpdCBpZiB0aGF0J3Mgbm90IHRoZSBjYXNlLiAqLwotICAgIGlmIChNNFBUTzNHUFBfa0VuY29kZXJTdG9wcGVkID09IHBDLT5tX2VFbmNvZGVyU3RhdGUpCi0gICAgewotICAgICAgICBvc2FFcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdENsb3NlKHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IG9zYUVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9jbG9zZTogbV9wRW5jb2RlckludC0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsIG9zYUVycik7Ci0gICAgICAgICAgICAvKiBXZWxsLi4uIGhvdyB0aGUgaGVjayBkbyB5b3UgaGFuZGxlIGEgZmFpbGVkIGNsZWFudXA/ICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+bV9lRW5jb2RlclN0YXRlID0gTTRQVE8zR1BQX2tFbmNvZGVyQ2xvc2VkOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiBDbG9zZSAzR1Agb3V0ICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcDNncFdyaXRlckNvbnRleHQpICAvKiBoYXBwZW5zIGluIHN0YXRlIF9TRVQgKi8KLSAgICB7Ci0gICAgICAgIC8qIEhXIGVuY29kZXI6IGZldGNoIHRoZSBEU0kgZnJvbSB0aGUgc2hlbGwgdmlkZW8gZW5jb2RlciwgYW5kIGZlZWQgaXQgdG8gdGhlIHdyaXRlciBiZWZvcmUKLSAgICAgICAgY2xvc2luZyBpdC4gKi8KLSAgICAgICAgaWYgKChNNFZJREVPRURJVElOR19rTVBFRzQgPT0gcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KQotICAgICAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tIMjY0ID09IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9zYUVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0R2V0T3B0aW9uKHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa09wdGlvbklEX0VuY29kZXJIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikmZW5jSGVhZGVyKTsKLSAgICAgICAgICAgIGlmICggKE00Tk9fRVJST1IgIT0gb3NhRXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX2Nsb3NlOiBmYWlsZWQgdG8gZ2V0IHRoZSBlbmNvZGVyIGhlYWRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgb3NhRXJyKTsKLSAgICAgICAgICAgICAgICAvKio8IG5vIHJldHVybiBoZXJlLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGRlYWxsb2NhdGUgYWZ0ZXIgY2xvc2UsIGV2ZW4gaWYgXAotICAgICAgICAgICAgICAgIGl0IGZhaWxzLiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHNldCB0aGlzIGhlYWRlciBpbiB0aGUgd3JpdGVyICovCi0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnN0cmVhbUlEID0gTTRQVE8zR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnNpemUgPSBlbmNIZWFkZXItPlNpemU7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLmFkZHIgPSAoTTRPU0FfTWVtQWRkcjMyKWVuY0hlYWRlci0+cEJ1ZjsKLSAgICAgICAgICAgICAgICBvc2FFcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa0RTSSwgJnN0cmVhbUhlYWRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gb3NhRXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9jbG9zZTogZmFpbGVkIHRvIHNldCB0aGUgRFNJIGluIHRoZSB3cml0ZXIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyIDB4JXgpICAgIiwgb3NhRXJyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBVcGRhdGUgbGFzdCBWaWRlbyBDVFMgKi8KLSAgICAgICAgbGFzdENUUyA9IChNNE9TQV9VSW50MzIpcEMtPm1fbXRDdHM7Ci0KLSAgICAgICAgb3NhRXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb24sICZsYXN0Q1RTKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gb3NhRXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0Nsb3NlOiBTZXRPcHRpb24oTTRXUklURVJfa01heEZpbGVEdXJhdGlvbikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBvc2FFcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogV3JpdGUgYW5kIGNsb3NlIHRoZSAzR1Agb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgb3NhRXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RDbG9zZVdyaXRlKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gb3NhRXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0Nsb3NlOiBwV3JpdGVyR2xvYkludC0+cEZjdENsb3NlV3JpdGUgcmV0dXJucyAweCV4Iiwgb3NhRXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuIHlldCwgd2UgaGF2ZSB0byBjbG9zZSBvdGhlciB0aGluZ3MgKi8KLSAgICAgICAgfQotICAgICAgICBwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhdGUgdHJhbnNpdGlvbiAqLwotICAgIHBDLT5tX1N0YXRlID0gTTRQVE8zR1BQX2tTdGF0ZV9DTE9TRUQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX0Nsb3NlKCk6IHJldHVybmluZyAweCV4Iiwgb3NhRXJyKTsKLSAgICByZXR1cm4gb3NhRXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9DbGVhblVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBNNFBUTzNHUFAuCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfQ2xlYW5VcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfQ2xlYW5VcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsICJNNFBUTzNHUFBfQ2xlYW5VcDogcENvbnRleHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogIEZpcnN0IGNhbGwgQ2xvc2UsIGlmIG5lZWRlZCwgdG8gY2xlYW4gdGhlIHZpZGVvIGVuY29kZXIgKi8KLQotICAgIGlmICgoTTRQVE8zR1BQX2tTdGF0ZV9PUEVORUQgPT0gcEMtPm1fU3RhdGUpIHx8IChNNFBUTzNHUFBfa1N0YXRlX1JFQURZID09IHBDLT5tX1N0YXRlKQotICAgICAgICB8fCAoTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRCA9PSBwQy0+bV9TdGF0ZSkpCi0gICAgewotICAgICAgICBlcnIgPSBNNFBUTzNHUFBfQ2xvc2UocENvbnRleHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xlYW5VcDogTTRQVE8zR1BQX0Nsb3NlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2UgaGF2ZSB0byBmcmVlIG90aGVyIGNvbXBvbmVudHMgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBGcmVlIEF1ZGlvIHJlYWRlciBzdHVmZiwgaWYgbmVlZGVkICovCi0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0KSAvKio8IG1heSBiZSBNNE9TQV9OVUxMIGlmIE00UFRPM0dQUF9PcGVuIHdhcyBub3RcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkICovCi0gICAgewotCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RDbG9zZShwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXA6IHBSZWFkZXJHbG9iSW50LT5tX3BGY3RDbG9zZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIGhhdmUgdG8gZnJlZSBvdGhlciBjb21wb25lbnRzICovCi0gICAgICAgIH0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdERlc3Ryb3kocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCk7Ci0gICAgICAgIHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xlYW5VcDogcFJlYWRlckdsb2JJbnQtPm1fcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBoYXZlIHRvIGZyZWUgb3RoZXIgY29tcG9uZW50cyAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvQVUpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BSZWFkZXJBdWRpb0FVKTsKLSAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvQVUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBGcmVlIHZpZGVvIGVuY29kZXIgc3R1ZmYsIGlmIG5lZWRlZCAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0Q2xlYW51cChwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQpOwotICAgICAgICBwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xlYW5VcDogcEVuY29kZXJJbnQtPnBGY3REZXN0cm95IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2UgaGF2ZSB0byBmcmVlIG90aGVyIGNvbXBvbmVudHMgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtKTsKLSAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0pOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvKTsKLSAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8pOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqICBGcmVlIHRoZSBzaGVsbHMgaW50ZXJmYWNlcyAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJHbG9iSW50KQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyR2xvYkludCk7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJHbG9iSW50ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckRhdGFJbnQpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BSZWFkZXJEYXRhSW50KTsKLSAgICAgICAgcEMtPm1fcFJlYWRlckRhdGFJbnQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcEVuY29kZXJJbnQpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BFbmNvZGVySW50KTsKLSAgICAgICAgcEMtPm1fcEVuY29kZXJJbnQgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJHbG9iSW50KQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wV3JpdGVyR2xvYkludCk7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJHbG9iSW50ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyRGF0YUludCkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFdyaXRlckRhdGFJbnQpOwotICAgICAgICBwQy0+bV9wV3JpdGVyRGF0YUludCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIC8qKjwgRG8gbm90IGZyZWUgcEMtPnBPc2FNZW1vcnlQdHJGY3QgYW5kIHBDLT5wT3NhTWVtb3J5UHRyRmN0LCBiZWNhdXNlIGl0J3Mgb3duZWQgYnkgdGhlIFwKLSAgICBhcHBsaWNhdGlvbiAqLwotCi0gICAgLyoqCi0gICAgICogIEZyZWUgdGhlIGNvbnRleHQgaXRzZWxmICovCi0gICAgZnJlZShwQyk7Ci0gICAgcEMgPSBNNE9TQV9OVUxMOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9DbGVhblVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKiogSU5URVJOQUwgRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCogcEMpOwotICogQGJyaWVmICAgUHJlcGFyZSBhbGwgcmVzb3VyY2VzIGFuZCBpbnRlcmZhY2VzIGZvciB0aGUgdHJhbnNjb2RpbmcuCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIGZpcnN0IE00T1NBX1N0ZXAoKSBjYWxsCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAoSU4pIE00UFRPM0dQUCBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKiBAcmV0dXJuICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyhNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KiBwQykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBvdXRwdXRGaWxlVHlwZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aVZlcnNpb247Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgZW5jRm9ybWF0OwotICAgIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcyAgIEVuY1BhcmFtczsgICAgLyoqPCBFbmNvZGVyIGFkdmFuY2VkIHBhcmFtZXRlcnMgKi8KLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlICAgICBvcHRpb25WYWx1ZTsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyBjYWxsZWQgd2l0aCBwQz0weCV4IiwgcEMpOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKi8KLSAgICAvKioqKioqKiogVmlkZW8gRW5jb2RlciBQYXJhbWVzIGluaXQgKioqKioqKiovCi0gICAgLyoqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qKgotICAgICAqICBHZXQgdGhlIGNvcnJlY3QgZW5jb2RlciBpbnRlcmZhY2UgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KCZlbmNGb3JtYXQsICZwQy0+bV9wRW5jb2RlckludCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotI2Vsc2UgLyogc29mdHdhcmUgTVBFRzQgZW5jb2RlciBub3QgYXZhaWxhYmxlISAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJObyBNUEVHNCBlbmNvZGVyIGF2YWlsYWJsZSEgRGlkIHlvdSBmb3JnZXQgdG8gcmVnaXN0ZXIgb25lPyIpOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1NUQVRFOwotI2VuZGlmIC8qIHNvZnR3YXJlIE1QRUc0IGVuY29kZXIgYXZhaWxhYmxlPyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoJmVuY0Zvcm1hdCwgJnBDLT5tX3BFbmNvZGVySW50LAotICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0jZWxzZSAvKiBzb2Z0d2FyZSBIMjYzIGVuY29kZXIgbm90IGF2YWlsYWJsZSEgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gSDI2MyBlbmNvZGVyIGF2YWlsYWJsZSEgRGlkIHlvdSBmb3JnZXQgdG8gcmVnaXN0ZXIgb25lPyIpOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1NUQVRFOwotI2VuZGlmIC8qIHNvZnR3YXJlIEgyNjMgZW5jb2RlciBhdmFpbGFibGU/ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDCi0gICAgICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoJmVuY0Zvcm1hdCwgJnBDLT5tX3BFbmNvZGVySW50LAotICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0jZWxzZSAvKiBzb2Z0d2FyZSBIMjY0IGVuY29kZXIgbm90IGF2YWlsYWJsZSEgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IE5vIEgyNjQgZW5jb2RlciBhdmFpbGFibGUhXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpZCB5b3UgZm9yZ2V0IHRvIHJlZ2lzdGVyIG9uZT8iKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9TVEFURTsKLSNlbmRpZiAvKiBzb2Z0d2FyZSBIMjY0IGVuY29kZXIgYXZhaWxhYmxlPyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHVua25vd24gZm9ybWF0IDB4JXggcmV0dXJuaW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9NNFBUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoInN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpOiBnZXRJbnRlcmZhY2VzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEZpbGwgZW5jb2RlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBNNFBUTzNHUFAgc2V0dGluZ3MgKi8KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGZyYW1lIHNpemUgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVTaXplKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUYgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1NRQ0lGX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9TUUNJRl9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRUVZHQSA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfUVFWR0FfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX1FRVkdBX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUYgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1FDSUZfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX1FDSUZfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQSA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfUVZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfUVZHQV9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUYgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX0NJRl9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfQ0lGX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1ZHQSA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfVkdBX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9WR0FfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLS8qICtQUiBMVjU4MDcgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQSA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfV1ZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfV1ZHQV9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX05UU0NfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX05UU0NfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLS8qIC1QUiBMVjU4MDcgKi8KLS8qICtDUiBHb29nbGUgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjQwXzM2MDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl82NDBfMzYwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl82NDBfMzYwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl84NTRfNDgwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl84NTRfNDgwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfMTI4MF83MjBfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSXzEyODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTA4MF83MjA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfMTA4MF83MjBfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl85NjBfNzIwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl85NjBfNzIwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyMF8xMDgwOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfMTkyMF8xMDgwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0vKiAtQ1IgR29vZ2xlICovCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTTRQVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVNpemUpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRTsKLSAgICB9Ci0KLSAgICBFbmNQYXJhbXMuSW5wdXRGb3JtYXQgPSBNNEVOQ09ERVJfa0lZVVY0MjA7Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBiaXRyYXRlICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0OF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s2NF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s5Nl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjhfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyX0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syODhfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzg0X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazUxMl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4MDBfS0JQUzoKLS8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syX01CUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazVfTUJQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOF9NQlBTOgotLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTOgotLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s4X01CUFM7Ci0vKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZ1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9NNFBUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBmb3JtYXQgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCAgICA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MyA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ICAgID0gTTRFTkNPREVSX2tIMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ICAgID0gTTRFTkNPREVSX2tIMjY0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZ1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9NNFBUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBmcmFtZSByYXRlIChzZXQgaXQgdG8gbWF4ID0gMzAgZnBzKSAqLwotICAgIEVuY1BhcmFtcy51aVRpbWVTY2FsZSA9IDMwOwotICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOwotCi0gICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IE00RU5DT0RFUl9rMzBfRlBTOwotCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiAzR1Agb3V0IGluaXQgKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qIEdldCB0aGUgM0dQUCB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgZXJyID0gTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoJm91dHB1dEZpbGVUeXBlLCAmcEMtPm1fcFdyaXRlckdsb2JJbnQsICZwQy0+bV9wV3JpdGVyRGF0YUludCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIEluaXQgdGhlIDNHUFAgd3JpdGVyICovCi0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RPcGVuKCZwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgcEMtPm1fUGFyYW1zLnBPdXRwdXQzZ3BwRmlsZSwKLSAgICAgICAgcEMtPnBPc2FsRmlsZVdyaXRlLCBwQy0+bV9QYXJhbXMucFRlbXBvcmFyeUZpbGUsIHBDLT5wT3NhbEZpbGVSZWFkKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMaW5rIHRvIHRoZSB3cml0ZXIgY29udGV4dCBpbiB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5tX3BXcml0ZXJEYXRhSW50LT5wV3JpdGVyQ29udGV4dCA9IHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogIFNldCB0aGUgcHJvZHVjdCBkZXNjcmlwdGlvbiBzdHJpbmcgaW4gdGhlIHdyaXR0ZW4gZmlsZSAqLwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCBNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00UFRPM0dQUF9TSUdOQVRVUkUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogXAotICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldCB0aGUgcHJvZHVjdCB2ZXJzaW9uIGluIHRoZSB3cml0dGVuIGZpbGUgKi8KLSAgICB1aVZlcnNpb24gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SKjEwMCArIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IqMTAKLSAgICAgICAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OOwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikmdWlWZXJzaW9uKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbikgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQWxsb2NhdGUgYW5kIGZpbGwgdGhlIHZpZGVvIHN0cmVhbSBzdHJ1Y3R1cmVzIGZvciB0aGUgd3JpdGVyICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtID0KLSAgICAgICAgKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKSwgTTRQVE8zR1BQLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJwV3JpdGVyVmlkZW9TdHJlYW0iKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0pCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBXcml0ZXJWaWRlb1N0cmVhbSwgXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvID0KLSAgICAgICAgKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyksIE00UFRPM0dQUCwKLSAgICAgICAgKE00T1NBX0NoYXIgKikicFdyaXRlclZpZGVvU3RyZWFtSW5mbyIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8pCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBXcml0ZXJWaWRlb1N0cmVhbUluZm8sXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGwgVmlkZW8gcHJvcGVydGllcyBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+aGVpZ2h0ICAgICAgICA9IEVuY1BhcmFtcy5GcmFtZUhlaWdodDsKLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT53aWR0aCAgICAgICAgID0gRW5jUGFyYW1zLkZyYW1lV2lkdGg7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+ZnBzICAgICAgICAgICA9IDA7ICAgICAgICAvKio8IE5vdCB1c2VkIGJ5IHRoZSBjb3JlIHdyaXRlciAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8tPkhlYWRlci5wQnVmICAgPSBNNE9TQV9OVUxMOwotICAgIC8qKiBObyBoZWFkZXIsIHdpbGwgYmUgc2V0IGJ5IHNldE9wdGlvbiAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8tPkhlYWRlci5TaXplICAgPSAwOwotCi0gICAgLyoqCi0gICAgICogIEZpbGwgVmlkZW8gc3RyZWFtIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIEFkZFN0cmVhbSBtZXRob2QgKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnN0cmVhbUlEID0gTTRQVE8zR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBmb3JtYXQgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnN0cmVhbVR5cGUgPSBNNFNZU19rTVBFR180OyAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5zdHJlYW1UeXBlID0gTTRTWVNfa0gyNjM7ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+c3RyZWFtVHlwZSA9IE00U1lTX2tIMjY0OyAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTTRQVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmlkZW8gYml0cmF0ZSAqLwotICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjRfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzJfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDhfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjRfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjg4X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s1MTJfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwX0tCUFM6Ci0vKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMl9NQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s1X01CUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazhfTUJQUzoKLS8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5hdmVyYWdlQml0cmF0ZSA9IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTIDoKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+YXZlcmFnZUJpdHJhdGUgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHVua25vd24gZm9ybWF0IDB4JXggcmV0dXJuaW5nXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX000UFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFOwotICAgIH0KLQotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+ZHVyYXRpb24gICAgICAgICAgICAgICAgICA9IDA7ICAgICAgICAvKio8IER1cmF0aW9uIGlzIG5vdCBrbm93biAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+dGltZVNjYWxlICAgICAgICAgICAgICAgICA9IDA7ICAgIC8qKjwgTm90IHVzZWQgYnkgdGhlIGNvcmUgd3JpdGVyICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5tYXhCaXRyYXRlICAgICAgICAgICAgICAgID0gcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5hdmVyYWdlQml0cmF0ZTsKLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnByb2ZpbGVMZXZlbCAgICAgICAgICAgICAgPSAwOyAgICAvKio8IE5vdCB1c2VkIGJ5IHRoZSBjb3JlIHdyaXRlciAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+ZGVjb2RlclNwZWNpZmljSW5mbyAgICAgICA9IChNNE9TQV9NZW1BZGRyMzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbyk7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAgID0gc2l6ZW9mKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIEFVIHByb3BlcnRpZXMgZm9yIHZpZGVvIHN0cmVhbSAqLwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuQ1RTICAgICAgICAgPSBwQy0+bV9Xcml0ZXJWaWRlb0FVLkRUUyA9IDA7ICAvKiogUmVzZXQgdGltZSAqLwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuc2l6ZSAgICAgICAgPSAwOwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuZnJhZyAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUubmJGcmFnICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogTm8gZnJhZ21lbnQgKi8KLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLnN0cmVhbSAgICAgID0gcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtOwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuYXR0cmlidXRlICAgPSBBVV9SQVA7Ci0gICAgcEMtPm1fV3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAgKiAgSWYgdGhlcmUgaXMgYW4gYXVkaW8gaW5wdXQsIGFsbG9jYXRlIGFuZCBmaWxsIHRoZSBhdWRpbyBzdHJlYW0gc3RydWN0dXJlcyBmb3IgdGhlIHdyaXRlciAqLwotICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtID0KLSAgICAgICAgICAgIChNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiksIE00UFRPM0dQUCwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopInBXcml0ZXJBdWRpb1N0cmVhbSIpOwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZygpOiB1bmFibGUgdG8gYWxsb2NhdGUgcFdyaXRlckF1ZGlvU3RyZWFtLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvID0KLSAgICAgICAgICAgIChNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MpLCBNNFBUTzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwV3JpdGVyQXVkaW9TdHJlYW1JbmZvIik7Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZygpOiB1bmFibGUgdG8gYWxsb2NhdGUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckF1ZGlvU3RyZWFtSW5mbywgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvLT5uYlNhbXBsZXNQZXJTZWMgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPm5iQml0c1BlclNhbXBsZSA9IDA7IC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mby0+bmJDaGFubmVscyA9IDE7ICAgICAgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotCi0gICAgICAgIGlmKCAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0pICYmIC8qIGF1ZGlvIGNvdWxkIGhhdmUgYmVlbiBkaXNjYXJkZWQgKi8KLSAgICAgICAgICAgIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbykgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiB3ZSBjb3B5IHRoZSBzdHJlYW0gZnJvbSB0aGUgaW5wdXQsIHdlIGNvcHkgaXRzIERTSSAqLwotICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mby0+SGVhZGVyLlNpemUgPQotICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPkhlYWRlci5wQnVmID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogV3JpdGVyIHdpbGwgcHV0IGEgZGVmYXVsdCBEU0kgKi8KLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPkhlYWRlci5TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPkhlYWRlci5wQnVmID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGQgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICBzd2l0Y2ggKHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLSAgICAgICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnN0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0FhYzoKLSAgICAgICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnN0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0gICAgICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5zdHJlYW1UeXBlID0gTTRTWVNfa0VWUkM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogdW5oYW5kbGVkIGF1ZGlvIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBGaWxsIEF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+c3RyZWFtSUQgICAgICAgICAgICAgICAgICA9IE00UFRPM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPmR1cmF0aW9uICAgICAgICAgICAgICAgICAgPSAwOy8qKjwgRHVyYXRpb24gaXMgbm90IGtub3duIHlldCAqLwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnRpbWVTY2FsZSAgICAgICAgICAgICAgICAgPSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX0FNUl9USU1FX1NDQUxFOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnByb2ZpbGVMZXZlbCAgICAgICAgICAgICAgPSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1BST0ZJTEVfTEVWRUw7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+YXZlcmFnZUJpdHJhdGUgICAgICAgICAgICA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5tYXhCaXRyYXRlICAgICAgICAgICAgICAgID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5hdmVyYWdlQml0cmF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogT3VyIHdyaXRlciBzaGVsbCBpbnRlcmZhY2UgaXMgYSBsaXR0bGUgdHJpY2t5OiB3ZSBwdXQgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyBcCi0gICAgICAgICAgICBpbiB0aGUgRFNJIHBvaW50ZXIuLi4gKi8KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMilwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVcGRhdGUgQVUgcHJvcGVydGllcyBmb3IgYXVkaW8gc3RyZWFtICovCi0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuQ1RTICAgICAgICAgPSBwQy0+bV9Xcml0ZXJBdWRpb0FVLkRUUyA9IDA7ICAvKiogUmVzZXQgdGltZSAqLwotICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLnNpemUgICAgICAgID0gMDsKLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5mcmFnICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUubmJGcmFnICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogTm8gZnJhZ21lbnQgKi8KLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5zdHJlYW0gICAgICA9IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbTsKLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5hdHRyaWJ1dGUgICA9IEFVX1JBUDsKLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogVmlkZW8gRW5jb2RlciBJbml0ICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKioKLSAgICAgKiBQVE8gdXNlcyBpdHMgb3duIGJpdHJhdGUgcmVndWxhdGlvbiwgbm90IHRoZSAidHJ1ZSIgY29yZSByZWd1bGF0aW9uICovCi0gICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPSBNNE9TQV9UUlVFOyAvL000T1NBX0ZBTFNFOwotICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSBNNFBUTzNHUFBfUVVBTlRJWkVSX1NURVA7Ci0KLSAgICBFbmNQYXJhbXMudmlkZW9Qcm9maWxlID0gcEMtPm1fUGFyYW1zLnZpZGVvUHJvZmlsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9MZXZlbCA9IHBDLT5tX1BhcmFtcy52aWRlb0xldmVsOwotCi0gICAgLyoqCi0gICAgICogT3RoZXIgZW5jb2RlciBzZXR0aW5ncyAqLwotCi0gICAgRW5jUGFyYW1zLnVpSG9yaXpvbnRhbFNlYXJjaFJhbmdlICA9IDA7ICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpVmVydGljYWxTZWFyY2hSYW5nZSAgICA9IDA7ICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgICAgICAgICA9IE00T1NBX0ZBTFNFOyAgIC8qIG5vIGVycm9yIHJlc2lsaWVuY2UgKi8KLSAgICBFbmNQYXJhbXMudWlJVm9wUGVyaW9kICAgICAgICAgICAgID0gMTU7ICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpTW90aW9uRXN0aW1hdGlvblRvb2xzICA9IDA7ICAgICAgICAgICAgIC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uICAgICAgICAgICAgPSBNNE9TQV9UUlVFOyAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyAgICAgICAgPSBNNE9TQV9GQUxTRTsgICAvKiBubyBkYXRhIHBhcnRpdGlvbmluZyAqLwotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdmlkZW8gZW5jb2RlciAqLwotICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0SW5pdCgmcEMtPm1fcE1wNEVuY29kZXJDb250ZXh0LCBwQy0+bV9wV3JpdGVyRGF0YUludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UFRPM0dQUF9hcHBseVZQUCwgcEMsIHBDLT5tX3BFbmNvZGVyRXh0ZXJuYWxBUEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wRW5jb2RlclVzZXJEYXRhKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IEVuY29kZXJJbnQtPnBGY3RJbml0IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rRW5jb2RlckNsb3NlZDsKLQotICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0T3BlbihwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQsICZwQy0+bV9Xcml0ZXJWaWRlb0FVLCAmRW5jUGFyYW1zKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IEVuY29kZXJJbnQtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rRW5jb2RlclN0b3BwZWQ7Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdFN0YXJ0KQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcEVuY29kZXJJbnQtPnBGY3RTdGFydChwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBFbmNvZGVySW50LT5wRmN0U3RhcnQgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+bV9lRW5jb2RlclN0YXRlID0gTTRQVE8zR1BQX2tFbmNvZGVyUnVubmluZzsKLQotICAgIC8qKgotICAgICAqIE5vIG1vcmUgIHNldG9wdGlvbiBvbiAiTTRFTkNPREVSX2tWaWRlb0ZyYWdtZW50U2l6ZSIgaGVyZS4KLSAgICAgKiBJdCBpcyBub3cgYXV0b21hdGljbHkgYW5kICJzbWFydGx5IiBzZXQgaW4gdGhlIGVuY29kZXIgc2hlbGwuICovCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqIDNHUCBvdXQgYWRkIHN0cmVhbXMgICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0QWRkU3RyZWFtKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0pOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RBZGRTdHJlYW0odmlkZW8pIHJldHVybnNcCi0gICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB2aWRlbyBtYXggYXUgc2l6ZSAqLwotICAgIG9wdGlvblZhbHVlLnN0cmVhbUlEICAgID0gTTRQVE8zR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgb3B0aW9uVmFsdWUudmFsdWUgPSAoTTRPU0FfVUludDMyKSgxLjVGICogKE00T1NBX0Zsb2F0KShwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT53aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT5oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE00UFRPM0dQUF9WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8pOwotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyxNNFdSSVRFUl9rTWF4QVVTaXplOiAldSIsb3B0aW9uVmFsdWUudmFsdWUpOwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBwV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbih2aWRlbyxcCi0gICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tNYXhBVVNpemUpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHZpZGVvIG1heCBjaHVuY2sgc2l6ZSAqLwotICAgIG9wdGlvblZhbHVlLnZhbHVlID0gKE00T1NBX1VJbnQzMikoKE00T1NBX0Zsb2F0KW9wdGlvblZhbHVlLnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAqIE00UFRPM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcsTTRXUklURVJfa01heENodW5ja1NpemU6ICV1IixvcHRpb25WYWx1ZS52YWx1ZSk7Ci0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24odmlkZW8sXAotICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSkgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdEFkZFN0cmVhbShwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0QWRkU3RyZWFtKGF1ZGlvKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgYXVkaW8gbWF4IGF1IHNpemUgKi8KLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgICAgICAgPSBNNFBUTzNHUFBfQVVESU9fTUFYX0FVX1NJWkU7Ci0gICAgICAgIG9wdGlvblZhbHVlLnN0cmVhbUlEICAgID0gTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4QVVTaXplLChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24oYXVkaW8sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa01heEFVU2l6ZSkgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IGF1ZGlvIG1heCBjaHVuY2sgc2l6ZSAqLwotICAgICAgICBvcHRpb25WYWx1ZS52YWx1ZSA9IE00UFRPM0dQUF9BVURJT19NQVhfQ0hVTktfU0laRTsgLyoqPCBNYWdpY2FsICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSwoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKGF1ZGlvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tNYXhDaHVuY2tTaXplKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2xvc2UgdGhlIHN0cmVhbSByZWdpc3RlcmluZyBpbiBvcmRlciB0byBiZSByZWFkeSB0byB3cml0ZSBkYXRhICovCi0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTdGFydFdyaXRpbmcocEMtPm1fcDNncFdyaXRlckNvbnRleHQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RTdGFydFdyaXRpbmcgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMTIyRnJhbWUoTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBXcml0ZXJBdWRpb0FVLCBNNE9TQV9UaW1lIG10SW5jQ3RzKQotICogQGJyaWVmICAgV3JpdGUgYW4gQU1SIDEyLjJrYnBzIHNpbGVuY2UgRlJBTUUgaW50byB0aGUgd3JpdGVyCi0gKiBAbm90ZSAgICBNYWlubHkgdXNlZCB0byBmaXggdGhlICdienonIGJ1Zy4uLgotICogQHBhcmFtICAgcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UgKElOKSAgICB3cml0ZXIgZGF0YSBpbnRlcmZhY2VzCi0gKiAgICAgICAgICBwV3JpdGVyQ29udGV4dCAgICAgICAgICAoSU4vT1VUKXdyaXRlciBjb250ZXh0Ci0gKiAgICAgICAgICBwV3JpdGVyQXVkaW9BVSAgICAgICAgICAoT1VUKSAgIHdyaXRlciBhdWRpbyBhY2Nlc3MgdW5pdAotICogICAgICAgICAgbXRJbmNDdHMgICAgICAgICAgICAgICAgKElOKSAgICB3cml0ZXIgQ1RTCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTEyMkZyYW1lKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcFdyaXRlckF1ZGlvQVUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSBtdEluY0N0cykKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgZXJyID0gcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UtPnBTdGFydEFVKHBXcml0ZXJDb250ZXh0LCBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyQXVkaW9BVSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZTogcFdyaXRlckRhdGFJbnQtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCV4ISIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbWVtY3B5KCh2b2lkICopcFdyaXRlckF1ZGlvQVUtPmRhdGFBZGRyZXNzLAotICAgICAodm9pZCAqKU00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV8xMjJfRlJBTUUsIE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8xMjJfU0laRSk7Ci0gICAgcFdyaXRlckF1ZGlvQVUtPnNpemUgICAgPSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMTIyX1NJWkU7Ci0gICAgcFdyaXRlckF1ZGlvQVUtPkNUUyAgICAgPSBtdEluY0N0czsKLSAgICBwV3JpdGVyQXVkaW9BVS0+bmJGcmFnICA9IDA7Ci0KLSAgICBlcnIgPSBwV3JpdGVyRGF0YUludEludGVyZmFjZS0+cFByb2Nlc3NBVShwV3JpdGVyQ29udGV4dCwgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyQXVkaW9BVSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZTogcFdyaXRlckRhdGFJbnQtPnBQcm9jZXNzQVUoc2lsZW5jZSkgXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UwNDhGcmFtZShNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0KiBwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcFdyaXRlckF1ZGlvQVUsIE00T1NBX1RpbWUgbXRJbmNDdHMpCi0gKiBAYnJpZWYgICBXcml0ZSBhbiBBTVIgMTIuMmticHMgc2lsZW5jZSBGUkFNRSBpbnRvIHRoZSB3cml0ZXIKLSAqIEBub3RlICAgIE1haW5seSB1c2VkIHRvIGZpeCB0aGUgJ2J6eicgYnVnLi4uCi0gKiBAcGFyYW0gICBwV3JpdGVyRGF0YUludEludGVyZmFjZSAoSU4pICAgIHdyaXRlciBkYXRhIGludGVyZmFjZXMKLSAqICAgICAgICAgIHBXcml0ZXJDb250ZXh0ICAgICAgICAgIChJTi9PVVQpd3JpdGVyIGNvbnRleHQKLSAqICAgICAgICAgIHBXcml0ZXJBdWRpb0FVICAgICAgICAgIChPVVQpICAgd3JpdGVyIGF1ZGlvIGFjY2VzcyB1bml0Ci0gKiAgICAgICAgICBtdEluY0N0cyAgICAgICAgICAgICAgICAoSU4pICAgIHdyaXRlciBDVFMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWUoTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0KiBwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBXcml0ZXJBdWRpb0FVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSBtdEluY0N0cykKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgZXJyID0gcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UtPnBTdGFydEFVKHBXcml0ZXJDb250ZXh0LCBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckF1ZGlvQVUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWU6IHBXcml0ZXJEYXRhSW50LT5wU3RhcnRBVShhdWRpbylcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1lbWNweSgodm9pZCAqKXBXcml0ZXJBdWRpb0FVLT5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAodm9pZCAqKU00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV8wNDhfRlJBTUUsCi0gICAgICAgICAgICAgICAgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFKTsKLSAgICBwV3JpdGVyQXVkaW9BVS0+c2l6ZSAgICA9IE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICBwV3JpdGVyQXVkaW9BVS0+Q1RTICAgICA9IG10SW5jQ3RzOwotICAgIHBXcml0ZXJBdWRpb0FVLT5uYkZyYWcgID0gMDsKLQotICAgIGVyciA9IHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLT5wUHJvY2Vzc0FVKHBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgcFdyaXRlckF1ZGlvQVUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWU6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFJbnQtPnBQcm9jZXNzQVUoc2lsZW5jZSkgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfVmlkZW9QcmVQcm9jZXNzaW5nLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTZhNjQ5OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQVE8zR1BQX1ZpZGVvUHJlUHJvY2Vzc2luZy5jCi0gKiBAYnJpZWYgICBQaWN0dXJlIHRvIDNncHAgU2VydmljZSB2aWRlbyBwcmVwcm9jZXNzaW5nIG1hbmFnZW1lbnQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqCi0gKiAgICBPU0FMIERlYnVnIHV0aWxpdGllcyAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLS8qKgotICogICAgT1NBTCBNZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotCi0vKioKLSAqICAgIERlZmluaXRpb24gb2YgdGhlIE00UFRPM0dQUCBpbnRlcm5hbCBjb250ZXh0ICovCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaCIKLQotLyoqCi0gKiAgICBEZWZpbml0aW9uIG9mIHRoZSBNNFBUTzNHUFAgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0Vycm9yQ29kZXMuaCIKLQotLyogSWYgdGltZSBpbmNyZW1lbnQgaXMgdG9vIGxvdyB0aGVuIHdlIGhhdmUgYW4gaW5maW5pdGUgYWxsb2MgbG9vcCBpbnRvIE00VmlFbmNDYXB0dXJlRnJhbWUoKSAqLwotLyogVGltZSBpbmNyZW1lbnQgc2hvdWxkIG1hdGNoIDMwIGZwcyBtYXhpbXVtICovCi0jZGVmaW5lIE00UFRPM0dQUF9NSU5fVElNRV9JTkNSRU1FTlQgMzMuMzMzMzMzNAotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9hcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICAgQ2FsbCBhbiBleHRlcm5hbCBjYWxsYmFjayB0byBnZXQgdGhlIHBpY3R1cmUgdG8gZW5jb2RlCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFZQUCBjb250ZXh0LCB3aGljaCBhY3R1YWxseSBpcyB0aGUgTTRQVE8zR1BQIGludGVybmFsIGNvbnRleHQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgKElOKSBDb250YWlucyB0aGUgaW1hZ2UKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQgICAgKElOL09VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiAzIHBsYW5lcyB0aGF0IHdpbGwgY29udGFpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IFlVVjQyMCBpbWFnZSByZWFkIHdpdGggdGhlIG1fcFBpY3R1cmVDYWxsYmFja0ZjdAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX2FwcGx5VlBQKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSICAgIGVycjsKLSAgICBNNE9TQV9Eb3VibGUgbXREdXJhdGlvbjsKLSAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgIC8qKiogTk9URSAqKiovCi0gICAgLyogSXQncyBPSyB0byBnZXQgcFBsYW5lSW4gPT0gTTRPU0FfTlVMTCBoZXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBzaW5jZSBpdCBoYXMgYmVlbiBnaXZlbiBOVUxMIGluIHRoZSBwRmN0RW5jb2RlKCkgY2FsbC4gICAgICAgICAgICAqLwotICAgIC8qIEl0J3MgYmVjYXVzZSB3ZSB1c2UgdGhlIE00UFRPM0dQUCBpbnRlcm5hbCBjb250ZXh0IHRvICAgICAgICAgICAgKi8KLSAgICAvKiB0cmFuc21pdCB0aGUgZW5jb2RlciBpbnB1dCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVGhlIGlucHV0IGRhdGEgaXMgdGhlIGltYWdlIHJlYWQgZnJvbSB0aGUgbV9wUGljdHVyZUNhbGxiYWNrRmN0ICAgICovCi0KLSAgICAvKioKLSAgICAgKiAgICBUaGUgVlBQIGNvbnRleHQgaXMgYWN0dWFsbHkgdGhlIE00UFRPM0dQUCBjb250ZXh0ISAqLwotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgKnBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqICBHZXQgdGhlIHBpY3R1cmUgdG8gZW5jb2RlICovCi0gICAgaWYgKE00T1NBX0ZBTFNFID09IHBDLT5tX2JMYXN0SW50ZXJuYWxDYWxsQmFjaykKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX1BhcmFtcy5wUGljdHVyZUNhbGxiYWNrRmN0KHBDLT5tX1BhcmFtcy5wUGljdHVyZUNhbGxiYWNrQ3R4dCwgcFBsYW5lT3V0LAotICAgICAgICAgICAgICZtdER1cmF0aW9uKTsKLQotICAgICAgICAvKiBJbiBjYXNlIG9mIGVycm9yIHdoZW4gZ2V0dGluZyBZVVYgdG8gZW5jb2RlIChleDogZXJyb3Igd2hlbiBkZWNvZGluZyBhIEpQRUcpICovCi0gICAgICAgIGlmKChNNE5PX0VSUk9SICE9IGVycikgJiYgKCgoTTRPU0FfVUludDMyKU00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFKSAhPSBlcnIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElmIGVuZCBvZiBlbmNvZGluZyBpcyBhc2tlZCBieSB0aGUgc2l6ZSBsaW1pdGF0aW9uIHN5c3RlbSwKLSAgICAgICAgICogd2UgbXVzdCBlbmQgdGhlIGVuY29kaW5nIHRoZSBzYW1lIHdheSB0aGF0IHdoZW4gaXQgaXMgYXNrZWQgYnkgdGhlCi0gICAgICAgICAqIHBpY3R1cmUgY2FsbGJhY2sgKGEuay5hLiB0aGUgaW50ZWdyYXRvcikuCi0gICAgICAgICAqIFRodXMgd2Ugc2ltdWxhdGUgdGhlIExhc3RQaWN0dXJlIGNvZGUgcmV0dXJuOiAqLwotICAgICAgICBpZiAoTTRPU0FfVFJVRSA9PSBwQy0+bV9Jc0xhc3RQaWN0dXJlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCgoTTRPU0FfVUludDMyKU00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFKSA9PSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5tX2JMYXN0SW50ZXJuYWxDYWxsQmFjayA9IE00T1NBX1RSVUU7IC8qIFRvZ2dsZSBmbGFnIGZvciB0aGUgZmluYWwgY2FsbCBvZiB0aGUgQ0IqLwotICAgICAgICAgICAgcEMtPm1fSXNMYXN0UGljdHVyZSAgICAgICAgID0gTTRPU0FfVFJVRTsgLyogVG8gc3RvcCB0aGUgZW5jb2RlciAqLwotICAgICAgICAgICAgcEMtPnBTYXZlZFBsYW5lICAgICAgICAgICAgID0gcFBsYW5lT3V0OyAgLyogU2F2ZSB0aGUgbGFzdCBZVVYgcGxhbmUgcHRyICovCi0gICAgICAgICAgICBwQy0+dWlTYXZlZER1cmF0aW9uICAgICAgICAgPSAoTTRPU0FfVUludDMyKW10RHVyYXRpb247IC8qIFNhdmUgdGhlIGxhc3QgZHVyYXRpb24gKi8KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKio8IE5vdCBuZWNlc3NhcnkgaGVyZSBiZWNhdXNlIHRoZSBsYXN0IGZyYW1lIGR1cmF0aW9uIGlzIHNldCB0byB0aGUtbGFzdC1idXQtb25lIGJ5Ci0gICAgICAgICAgICAgICAgdGhlIGxpZ2h0IHdyaXRlciAqLwotICAgICAgICAvKio8IE9ubHkgbmVjZXNzYXJ5IGZvciBwQy0+bV9tdE5leHRDdHMgYmVsb3cuLi4qLwotICAgICAgICBtdER1cmF0aW9uID0gcEMtPnVpU2F2ZWREdXJhdGlvbjsKLQotCi0gICAgICAgIC8qKiBDb3B5IHRoZSBsYXN0IFlVViBwbGFuZSBpbnRvIHRoZSBjdXJyZW50IG9uZQotICAgICAgICAgKiAodGhlIGxhc3QgcGljIGlzIHNwbGl0ZWQgZHVlIHRvIHRoZSBjYWxsYmFjayBleHRyYS1jYWxsLi4uICovCi0gICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lT3V0W2ldLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wU2F2ZWRQbGFuZVtpXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtpXS51X3N0cmlkZSAqIHBQbGFuZU91dFtpXS51X2hlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBUaW1lSW5jcmVtZW50IHNob3VsZCBiZSAzMCBmcHMgbWF4aW11bSAqLwotICAgIGlmKG10RHVyYXRpb24gPCBNNFBUTzNHUFBfTUlOX1RJTUVfSU5DUkVNRU5UKQotICAgIHsKLSAgICAgICAgbXREdXJhdGlvbiA9IE00UFRPM0dQUF9NSU5fVElNRV9JTkNSRU1FTlQ7Ci0gICAgfQotCi0gICAgcEMtPm1fbXROZXh0Q3RzICs9IG10RHVyYXRpb247Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX2FwcGx5VlBQOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UkVBREVSX0Ftci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9BbXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDg1OTE1Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UkVBREVSX0Ftci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRSRUFERVJfQW1yLmMKLSAqIEBicmllZiAgR2VuZXJpYyBlbmNhcHN1bGF0aW9uIG9mIHRoZSBjb3JlIGFtciByZWFkZXIKLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGdlbmVyaWMgTTRSRUFERVIgaW50ZXJmYWNlCi0gKiAgICAgICAgIG9uIHRvcCBvZiB0aGUgQU1SIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotI2luY2x1ZGUgIk00X1V0aWxzLmgiCi0KLSNpbmNsdWRlICJNNEFNUlJfQ29yZVJlYWRlci5oIgotI2luY2x1ZGUgIk00UkVBREVSX0Ftci5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFJFQURFUl9BTVJfQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGludGVybmFsIGNvbnRleHQgb2YgYSBhbXIgcmVhZGVyIGluc3RhbmNlCi0gKiBAbm90ZSAgICAgICAgVGhlIGNvbnRleHQgaXMgYWxsb2NhdGVkIGFuZCBkZS1hbGxvY2F0ZWQgYnkgdGhlIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNFJFQURFUl9BTVJfQ29udGV4dAotewotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgIG1fcENvcmVDb250ZXh0OyAgICAgLyoqPCBjb3JlIGFtciByZWFkZXIgY29udGV4dCAqLwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogIG1fcEF1ZGlvU3RyZWFtOyAgICAgLyoqPCBwb2ludGVyIG9uIHRoZSBhdWRpbyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiByZXR1cm5lZCBieSB0aGUgY29yZSAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgIG1fYXVkaW9BdTsgICAgICAgICAgLyoqPCBhdWRpbyBhY2Nlc3MgdW5pdCB0byBiZSBmaWxsZWQgYnkgdGhlIGNvcmUgKi8KLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICBtX21heER1cmF0aW9uOyAgICAgIC8qKjwgZHVyYXRpb24gb2YgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgbV9wT3NhRmlsZVJlYWRlckZjdHM7ICAgIC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zICovCi0KLX0gTTRSRUFERVJfQU1SX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgICBhbGxvY2F0ZXMgdGhlIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChPVVQpICAgIHBvaW50ZXIgb24gYSByZWFkZXIgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0KQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiBwUmVhZGVyQ29udGV4dDsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2NyZWF0ZTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHBSZWFkZXJDb250ZXh0ID0gKE00UkVBREVSX0FNUl9Db250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00UkVBREVSX0FNUl9Db250ZXh0KSwKLSAgICAgICAgIE00UkVBREVSX0FNUiwgKE00T1NBX0NoYXIgKikiTTRSRUFERVJfQU1SX0NvbnRleHQiKTsKLSAgICBpZiAocFJlYWRlckNvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bV9wQXVkaW9TdHJlYW0gID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9hdWRpb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9tYXhEdXJhdGlvbiA9IDA7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1fcENvcmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9wT3NhRmlsZVJlYWRlckZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgKnBDb250ZXh0ID0gcFJlYWRlckNvbnRleHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZGVzdHJveSB0aGUgaW5zdGFuY2Ugb2YgdGhlIHJlYWRlcgotICogQG5vdGUgICAgIGFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9kZXN0cm95KE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICBwQz0oTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfZGVzdHJveSgpOiBNNFJFQURFUl9BTVJfZGVzdHJveTogY29udGV4dCBpcyBNNE9TQV9OVUxMLFwKLSAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgZnJlZShwQyk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBvcGVuIHRoZSByZWFkZXIgYW5kIGluaXRpYWxpemVzIGl0cyBjcmVhdGVkIGluc3RhbmNlCi0gKiBAbm90ZSAgICAgdGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgQU1SIGZpbGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcEZpbGVEZXNjcmlwdG9yOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gcHJvcHJpZXRhcnkgZGF0YSBpZGVudGlmeWluZyB0aGUgbWVkaWEgdG8gb3BlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfb3BlbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcikKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgIGVycjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX29wZW46IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBGaWxlRGVzY3JpcHRvciksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgZXJyID0gTTRBTVJSX29wZW5SZWFkKCAmcEMtPm1fcENvcmVDb250ZXh0LCBwRmlsZURlc2NyaXB0b3IsIHBDLT5tX3BPc2FGaWxlUmVhZGVyRmN0cyk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY2xvc2UgdGhlIHJlYWRlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFJFQURFUl9BTVJfY2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgICBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICAgZXJyOwotICAgIE00QU1SUl9TdGF0ZSBTdGF0ZTsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfY2xvc2U6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfY2xvc2UoKTogTTRSRUFERVJfQU1SX2Nsb3NlOiBjb250ZXh0IGlzIE00T1NBX05VTEwsXAotICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9QQVJBTUVURVIiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfZ2V0U3RhdGUocEMtPm1fcENvcmVDb250ZXh0LCAmU3RhdGUsCi0gICAgICAgICAgICAgICAgKChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pLT5tX3N0cmVhbUlkKTsKLSAgICAgICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfY2xvc2U6IGVycm9yIHdoZW4gY2FsbGluZyBNNEFNUlJfZ2V0U3RhdGVcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID09IFN0YXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFNUlJfZnJlZUFVKHBDLT5tX3BDb3JlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSktPm1fc3RyZWFtSWQsICAmcEMtPm1fYXVkaW9BdSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9jbG9zZTogZXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0XG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogRGVsZXRlIHRoZSBEU0kgaWYgbmVlZGVkICovCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKFwKLSAgICAgICAgICAgICAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pOwotCi0gICAgICAgICAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbmFsbHkgZGVzdHJveSB0aGUgc3RyZWFtIGhhbmRsZXIgKi8KLSAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9TdHJlYW0pOwotICAgICAgICBwQy0+bV9wQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BDb3JlQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00QU1SUl9jbG9zZVJlYWQocEMtPm1fcENvcmVDb250ZXh0KTsKLSAgICAgICAgcEMtPm1fcENvcmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSBtZWRpYQotICogQG5vdGUgICAgY3VycmVudCB2ZXJzaW9uIG5lZWRzIHRvIHRyYW5zbGF0ZSBNNFNZU19TdHJlYW0gdG8gTTRfU3RyZWFtSGFuZGxlcgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBNZWRpYUZhbWlseTogICAoT1VUKSAgcG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkIE00UkVBREVSX01lZGlhRmFtaWx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIGZhbWlseSBvZiB0aGUgZm91bmQgc3RyZWFtCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6IChPVVQpICBwb2ludGVyIHRvIGEgc3RyZWFtIGhhbmRsZXIgdGhhdCB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYW5kIGZpbGxlZCB3aXRoIHRoZSBmb3VuZCBzdHJlYW0gZGVzY3JpcHRpb24KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX1NUUkVBTSAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYSAoYWxsIHN0cmVhbXMgZm91bmQpCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG1vZGUgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlclBhcmFtKQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDPShNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRTWVNfU3RyZWFtSUQgICAgICAgICAgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiBzdHJlYW1EZXNjOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogIHBBdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgcFN0cmVhbUhhbmRsZXI7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW06IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhRmFtaWx5ID09IDApLCAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIE1lZGlhRmFtaWx5Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlclBhcmFtID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciIpOwotCi0gICAgZXJyID0gTTRBTVJSX2dldE5leHRTdHJlYW0oIHBDLT5tX3BDb3JlQ29udGV4dCwgJnN0cmVhbURlc2MpOwotICAgIGlmIChlcnIgPT0gTTRXQVJfTk9fTU9SRV9TVFJFQU0pCi0gICAgewotICAgICAgICBzdHJlYW1JZEFycmF5WzBdID0gMDsKLSAgICAgICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0gICAgICAgIGVyciA9IE00QU1SUl9zdGFydFJlYWRpbmcocEMtPm1fcENvcmVDb250ZXh0LCBzdHJlYW1JZEFycmF5KTsKLSAgICAgICAgaWYgKChNNE9TQV9VSW50MzIpTTRFUlJfQUxMT0MgPT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW06IE00QU1SUl9zdGFydFJlYWRpbmcgcmV0dXJucyBNNEVSUl9BTExPQyEiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNOwotICAgIH0KLSAgICBlbHNlIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlciA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0FNUiwgKE00T1NBX0NoYXIgKikiTTRfQXVkaW9TdHJlYW1IYW5kbGVyIik7Ci0gICAgaWYgKHBBdWRpb1N0cmVhbUhhbmRsZXIgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgcFN0cmVhbUhhbmRsZXIgPShNNF9TdHJlYW1IYW5kbGVyKikocEF1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgKnBTdHJlYW1IYW5kbGVyUGFyYW0gPSBwU3RyZWFtSGFuZGxlcjsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0gPSBwQXVkaW9TdHJlYW1IYW5kbGVyOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAvKgotICAgICAqIEF1ZGlvIHN0cmVhbSBoYW5kbGVyIGZpZWxkcyBhcmUgaW5pdGlhbGlzZWQgd2l0aCAwIHZhbHVlLgotICAgICAqIFRoZXkgd2lsbCBiZSBwcm9wZXJseSBzZXQgYnkgdGhlIEFNUiBkZWNvZGVyCi0gICAgICovCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggICA9IDA7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSAgICA9IDA7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzICAgICAgICA9IDA7Ci0KLSAgICBwU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyAgICA9IChNNE9TQV9VSW50OCopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkICAgICAgICAgICAgICAgID0gc3RyZWFtRGVzYy5zdHJlYW1JRDsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9kdXJhdGlvbiAgICAgICAgICAgICAgICA9IHN0cmVhbURlc2MuZHVyYXRpb247Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhICAgICAgICAgICAgICAgPSAodm9pZCopc3RyZWFtRGVzYy50aW1lU2NhbGU7IC8qdHJpY2sgdG8gY2hhbmdlKi8KLQotICAgIGlmIChzdHJlYW1EZXNjLmR1cmF0aW9uID4gcEMtPm1fbWF4RHVyYXRpb24pCi0gICAgewotICAgICAgICBwQy0+bV9tYXhEdXJhdGlvbiA9IHN0cmVhbURlc2MuZHVyYXRpb247Ci0gICAgfQotICAgIHBTdHJlYW1IYW5kbGVyLT5tX2F2ZXJhZ2VCaXRSYXRlICAgICAgICAgID0gc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZTsKLQotICAgIE00QU1SUl9nZXRtYXhBVXNpemUocEMtPm1fcENvcmVDb250ZXh0LCAmcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplKTsKLQotICAgIHN3aXRjaCAoc3RyZWFtRGVzYy5zdHJlYW1UeXBlKQotICAgIHsKLSAgICBjYXNlIE00U1lTX2tBTVI6Ci0gICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgPSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRTWVNfa0FNUl9XQjoKLSAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yV2lkZUJhbmQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGZpbGwgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSB3aXRoIGluaXRpYWxpemF0aW9uIHZhbHVlcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6IChJTikgICAgIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBoYW5kbGVyIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSBhY2Nlc3MgdW5pdCB3aWxsIGJlIGFzc29jaWF0ZWQKLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdDogICAgKElOL09VVCkgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluaXRpYWxpemUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcEF1LT5zaXplICAgICAgICA9IDA7Ci0gICAgLyogSkM6IGJ1ZyBmaXggMTE5NyAoc2V0IENUUyB0byAtMjAgaW4gb3JkZXIgdGhlIGZpcnN0IEFVIENUUyBpcyAwKSAqLwotICAgIHBBdS0+Q1RTICAgICAgICAgPSAtMjA7Ci0gICAgcEF1LT5EVFMgICAgICAgICA9IC0yMDsKLSAgICBwQXUtPmF0dHJpYnV0ZSAgID0gMDsKLSAgICBwQXUtPm5iRnJhZyAgICAgID0gMDsKLQotICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgICAgICAgICA9IDA7Ci0gICAgLyogSkM6IGJ1ZyBmaXggMTE5NyAoc2V0IENUUyB0byAtMjAgaW4gb3JkZXIgdGhlIGZpcnN0IEFVIENUUyBpcyAwKSAqLwotICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgICAgICAgICA9IC0yMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9EVFMgICAgICAgICAgPSAtMjA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyAgPSBNNE9TQV9OVUxMOy8qcEJ1ZmZlcjsqLwotICAgIHBBY2Nlc3NVbml0LT5tX21heHNpemUgICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJlYW1JRCAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJ1Y3RTaXplICAgPSBzaXplb2YoTTRfQWNjZXNzVW5pdCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZ2V0IGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC0gdGhlIGR1cmF0aW9uIG9mIHRoZSBsb25nZXN0IHN0cmVhbSBvZiB0aGUgbWVkaWEKLSAqICAgICAgICAgIC0gdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSByZWFkZXIgKG5vdCBpbXBsZW1lbnRlZCB5ZXQpCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBnZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgICAgKE9VVCkgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkKLQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCAgICAgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpCi0gICAgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uIDoKLSAgICAgICAgewotICAgICAgICAgICAgKihNNE9TQV9UaW1lKilwVmFsdWUgPSBwQy0+bV9tYXhEdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCaXRyYXRlID0gMDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFNUlJfZ2V0VmVyc2lvbigoTTRfVmVyc2lvbkluZm8qKXBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLSB0aGUgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgb3B0aW9uSWQ6ICAgKElOKSAgICAgICAgSWRlbnRpZmllciBpbmRpY2F0aW5nIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4pICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQgICAgIFRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBvcHRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksICAgICBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaChvcHRpb25JZCkKLSAgICB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIgOgotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bV9wT3NhRmlsZVJlYWRlckZjdHMgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKilwVmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIHJlc2V0IHRoZSBzdHJlYW0sIHRoYXQgaXMgc2VlayBpdCB0byBiZWdpbm5pbmcgYW5kIG1ha2UgaXQgcmVhZHkgdG8gYmUgcmVhZAotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBpcyB0byBiZSBkZXByZWNhdGVkIGluIG5leHQgdmVyc2lvbnMKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICB0aGUgc3RyZWFtSUQgZG9lcyBub3QgZXhpc3QKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEUgICAgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRXQVJfSU5WQUxJRF9USU1FICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSBjYW4gbm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX3Jlc2V0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgICAgICAgICAgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgIHRpbWU2NCA9IDA7Ci0gICAgTTRBTVJSX1N0YXRlICAgICAgICAgICAgU3RhdGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX3Jlc2V0OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGVyciA9IE00QU1SUl9nZXRTdGF0ZShwQy0+bV9wQ29yZUNvbnRleHQsICZTdGF0ZSwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpOwotICAgIGlmIChNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID09IFN0YXRlKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRBTVJSX2ZyZWVBVShwQy0+bV9wQ29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfcmVzZXQ6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBmb3IgcmVzZXQgZHVyaW5nIHBsYXliYWNrICovCi0gICAgLyogKHNldCBDVFMgdG8gLTIwIGluIG9yZGVyIHRoZSBmaXJzdCBBVSBDVFMgaXMgMCkgKi8KLSAgICBwQXUtPkNUUyA9IC0yMDsKLSAgICBwQXUtPkRUUyA9IC0yMDsKLQotICAgIGVyciA9IE00QU1SUl9zZWVrKHBDLT5tX3BDb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSwgdGltZTY0LCBNNFNZU19rQmVnaW5uaW5nLCAmdGltZTY0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX3Jlc2V0OiBlcnJvciB3aGVuIGNhbGxpbmcgTTRBTVJSX3NlZWsoKVxuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAganVtcCBpbnRvIHRoZSBzdHJlYW0gYXQgdGhlIHNwZWNpZmllZCB0aW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgICB0aGUgc3RyZWFtIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcFRpbWUgICAgICAgICAgICAoSU4vT1VUKSBJTjogIHRoZSB0aW1lIHRvIGp1bXAgdG8gKGluIG1zKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiB0aGUgdGltZSB0byB3aGljaCB0aGUgc3RyZWFtIHJlYWxseSBqdW1wZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgTTRXQVJfSU5WQUxJRF9USU1FICAgICAgICB0aGUgdGltZSBjYW4gbm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2p1bXAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqIHBUaW1lKQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7Ci0gICAgTTRBTVJSX1N0YXRlICAgICAgICAgICAgU3RhdGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfM0dQX2p1bXA6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2p1bXA6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRBTVJSX2dldFN0YXRlKHBDLT5tX3BDb3JlQ29udGV4dCwgJlN0YXRlLCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCk7Ci0gICAgaWYgKE00QU1SUl9rUmVhZGluZ19uZXh0QVUgPT0gU3RhdGUpCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfZnJlZUFVKHBDLT5tX3BDb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9qdW1wOiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBzdHJlYW1JZEFycmF5WzBdID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0KLSAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLSAgICBlcnIgPSBNNEFNUlJfc2VlayhwQy0+bV9wQ29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXksIHRpbWU2NCwgTTRTWVNfa05vUkFQcHJldmlvdXMsICZ0aW1lNjQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfanVtcDogZXJyb3Igd2hlbiBjYWxsaW5nIE00QU1SUl9zZWVrKClcbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICpwVGltZSA9IChNNE9TQV9JbnQzMil0aW1lNjQ7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldHMgYW4gYWNjZXNzIHVuaXQgKEFVKSBmcm9tIHRoZSBzdHJlYW0gaGFuZGxlciBzb3VyY2UuCi0gKiBAbm90ZSAgICBBbiBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBhIGRlY29kZXIgKGF1ZGlvL3ZpZGVvKS4KLSAqICAgICAgICAgIEluIHRoZSBjdXJyZW50IHZlcnNpb24sIHdlIG5lZWQgdG8gdHJhbnNsYXRlIE00T1NBX0FjY2Vzc1VuaXQgdG8gTTRfQWNjZXNzVW5pdAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgIChJTikgICAgICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0ICAgICAoSU4vT1VUKSAgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB1bml0IHRvIGZpbGwgd2l0aCByZWFkIGRhdGEgKHRoZSBhdQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLCBhbmQgbXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBieSBjYWxsaW5nIE00UkVBREVSX2ZpbGxBdVN0cnVjdF9mY3QgYWZ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24pCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX0FVICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtIChlbmQgb2Ygc3RyZWFtKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZ2V0TmV4dEF1KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgIHRpbWVTY2FsZTsKLSAgICBNNEFNUlJfU3RhdGUgICAgICAgICAgICBTdGF0ZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIC8qIGtlZXAgdHJhY2Ugb2YgdGhlIGFsbG9jYXRlZCBidWZmZXJzIGluIEFVIHRvIGJlIGFibGUgdG8gZnJlZSB0aGVtIGF0IGRlc3Ryb3koKQotICAgICAgIGJ1dCBiZSBhd2FyZSB0aGF0IHN5c3RlbSBpcyByaXNreSBhbmQgd291bGQgbmVlZCB1cGdyYWRlIGlmIG1vcmUgdGhhbgotICAgICAgIG9uZSB2aWRlbyBhbmQgb25lIGF1ZGlvIEFVIGlzIG5lZWRlZCAqLwotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGVyciA9IE00QU1SUl9nZXRTdGF0ZShwQy0+bV9wQ29yZUNvbnRleHQsICZTdGF0ZSwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpOwotICAgIGlmIChNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID09IFN0YXRlKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRBTVJSX2ZyZWVBVShwQy0+bV9wQ29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BVklfZ2V0TmV4dEF1OiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBwQXUtPm5iRnJhZyA9IDA7Ci0gICAgZXJyID0gTTRBTVJSX25leHRBVShwQy0+bV9wQ29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotCi0gICAgaWYgKGVyciA9PSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgdGltZVNjYWxlID0gKE00T1NBX0Zsb2F0KShNNE9TQV9JbnQzMikocFN0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhKS8xMDAwOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOClwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9DVFMgID0gKE00X01lZGlhVGltZSlwQXUtPkNUUy8qL3RpbWVTY2FsZSovOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9EVFMgID0gKE00X01lZGlhVGltZSlwQXUtPkRUUy8qL3RpbWVTY2FsZSovOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgPSBwQXUtPmF0dHJpYnV0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZT0wOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotKgotKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSogQHBhcmFtIHBSZHJHbG9iYWxJbnRlcmZhY2UgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBnbG9iYWwgaW50ZXJmYWNlIGltcGxlbWVudGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKiBAcGFyYW0gcFJkckRhdGFJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGRhdGEgaW50ZXJmYWNlIGltcGxlbWVudGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKgotKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0qICAgICAgICAgICAgRVJSX0FMTE9DICAgICAgaWYgYW4gYWxsb2NhdGlvbiBmYWlsZWQKLSogICAgICAgICAgICBFUlJfUEFSQU1FVEVSICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwTWVkaWFUeXBlID09IDApLCAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNZWRpYVR5cGUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZHJHbG9iYWxJbnRlcmZhY2UgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlczogaW52YWxpZCBwb2ludGVyIHRvIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJkckRhdGFJbnRlcmZhY2UgPT0gMCksICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRSRUFERVJfRGF0YUludGVyZmFjZSIpOwotCi0gICAgKnBSZHJHbG9iYWxJbnRlcmZhY2UgPQotICAgICAgICAgKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBzaXplb2YoTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKSwKLSAgICAgICAgICAgICBNNFJFQURFUl9BTVIsIChNNE9TQV9DaGFyICopIk00UkVBREVSX0dsb2JhbEludGVyZmFjZSIgKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcFJkckdsb2JhbEludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgICpwUmRyRGF0YUludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgKnBSZHJEYXRhSW50ZXJmYWNlID0gKE00UkVBREVSX0RhdGFJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0RhdGFJbnRlcmZhY2UpLAotICAgICAgICAgTTRSRUFERVJfQU1SLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9EYXRhSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBSZHJEYXRhSW50ZXJmYWNlKQotICAgIHsKLSAgICAgICAgZnJlZSgqcFJkckdsb2JhbEludGVyZmFjZSk7Ci0gICAgICAgICpwUmRyR2xvYmFsSW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICpwTWVkaWFUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZUFNUjsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfY3JlYXRlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICAgICAgICAgPSBNNFJFQURFUl9BTVJfZGVzdHJveTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RPcGVuICAgICAgICAgICAgID0gTTRSRUFERVJfQU1SX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgICAgICA9IE00UkVBREVSX0FNUl9jbG9zZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfQU1SX2dldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfQU1SX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtICAgID0gTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW07Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RmlsbEF1U3RydWN0ICAgICA9IE00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RhcnQgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RvcCAgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0SnVtcCAgICAgICAgICAgICA9IE00UkVBREVSX0FNUl9qdW1wOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFJlc2V0ICAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfcmVzZXQ7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0UHJldlJhcFRpbWUgICA9IE00T1NBX05VTEw7IC8qYWxsIEFVcyBhcmUgUkFQKi8KLQotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0QXUgICAgICAgICAgPSBNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OwotCi0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9QY20uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfUGNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzMzkzMGIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9QY20uYworKysgL2Rldi9udWxsCkBAIC0xLDcyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFJFQURFUl9XYXYuYwotICogQGJyaWVmICBHZW5lcmljIGVuY2Fwc3VsYXRpb24gb2YgdGhlIGNvcmUgcGNtIHJlYWRlcgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZ2VuZXJpYyBNNFJFQURFUiBpbnRlcmZhY2UKLSAqICAgICAgICAgb24gdG9wIG9mIHRoZSBQQ00gcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0jaW5jbHVkZSAiTTRQQ01SX0NvcmVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFJFQURFUl9QY20uaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX1dBVl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiBhIHdhdiByZWFkZXIgaW5zdGFuY2UKLSAqIEBub3RlICAgICAgICBUaGUgY29udGV4dCBpcyBhbGxvY2F0ZWQgYW5kIGRlLWFsbG9jYXRlZCBieSB0aGUgcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IF9NNFJFQURFUl9QQ01fQ29udGV4dAotewotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgIG1fY29yZUNvbnRleHQ7ICAgICAgICAvKio8IGNvcmUgd2F2IHJlYWRlciBjb250ZXh0ICovCi0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgbV9wQXVkaW9TdHJlYW07ICAgICAgIC8qKjwgcG9pbnRlciBvbiB0aGUgYXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgbV9hdWRpb0F1OyAgICAgICAgICAgIC8qKjwgYXVkaW8gYWNjZXNzIHVuaXQgdG8gYmUgZmlsbGVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgbV9wT3NhRmlsZVJlYWRlckZjdHM7IC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zICovCi0KLX0gTTRSRUFERVJfUENNX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBDcmVhdGVzIGEgd2F2IHJlYWRlciBpbnN0YW5jZQotICogQG5vdGUgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgICAgICAoT1VUKSAgUG9pbnRlciB0byBhIHdhdiByZWFkZXIgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwUmVhZGVyQ29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocENvbnRleHQgPT0gMCksICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fY3JlYXRlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcFJlYWRlckNvbnRleHQgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRSRUFERVJfUENNX0NvbnRleHQpLAotICAgICAgICAgTTRSRUFERVJfV0FWLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9QQ01fQ29udGV4dCIpOwotICAgIGlmIChwUmVhZGVyQ29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBSZWFkZXJDb250ZXh0LT5tX2NvcmVDb250ZXh0ICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BBdWRpb1N0cmVhbSAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX2F1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BPc2FGaWxlUmVhZGVyRmN0cyAgPSBNNE9TQV9OVUxMOwotCi0gICAgKnBDb250ZXh0ID0gcFJlYWRlckNvbnRleHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBEZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGUgY29udGV4dCBpcyB1bi1hbGxvY2F0ZWQKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAgKElOKSBjb250ZXh0IG9mIHRoZSBuZXR3b3JrIHJlYWRlcgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmcmVlKHBDKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEluaXRpYWxpemVzIHRoZSByZWFkZXIgaW5zdGFuY2UKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAgICAoSU4pICAgIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBwRmlsZURlc2NyaXB0b3I6ICAgKElOKSAgICBQb2ludGVyIHRvIHByb3ByaWV0YXJ5IGRhdGEgaWRlbnRpZnlpbmcgdGhlIG1lZGlhIHRvIG9wZW4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fb3BlbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcikKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9vcGVuOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwRmlsZURlc2NyaXB0b3IpLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgZXJyID0gTTRQQ01SX29wZW5SZWFkKCYocEMtPm1fY29yZUNvbnRleHQpLCAoTTRPU0FfQ2hhciopcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgcEMtPm1fcE9zYUZpbGVSZWFkZXJGY3RzKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICBjbG9zZSB0aGUgcmVhZGVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9jbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fY2xvc2U6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBGcmVlIGF1ZGlvIEFVIGFuZCBhdWRpbyBzdHJlYW0gKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9hdWRpb0F1LmRhdGFBZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFBDTVJfZnJlZUFVKHBDLT5tX2NvcmVDb250ZXh0LCBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fc3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgICZwQy0+bV9hdWRpb0F1KTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2Nsb3NlOiBFcnJvciB3aGVuIGZyZWVpbmcgYXVkaW8gYWNjZXNzIHVuaXQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX2NvcmVDb250ZXh0KQotICAgIHsKLSAgICAgICAgLyogQ2xvc2UgdGhhIFBDTSBmaWxlICovCi0gICAgICAgZXJyID0gTTRQQ01SX2Nsb3NlUmVhZChwQy0+bV9jb3JlQ29udGV4dCk7Ci0gICAgICAgcEMtPm1fY29yZUNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWU6Ci0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgIChJTikgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIHZvaWQqIHBWYWx1ZSkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fc2V0T3B0aW9uOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX3NldE9wdGlvbjogaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpCi0gICAgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyIDoKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1fcE9zYUZpbGVSZWFkZXJGY3RzID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopcFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFJldHJpZXZlcyB0aGUgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIHJlYWRlciwgZ2l2ZW4gYW4gb3B0aW9uIElELgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAoSU4pIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBvcHRpb25JZDogKElOKSBvcHRpb24gaWRlbnRpZmljYXRvciB3aG9zZSBvcHRpb24gdmFsdWUgaXMgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtICAgcFZhbHVlOiAgKE9VVCkgb3B0aW9uIHZhbHVlIHJldHJpZXZlZC4KLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIHJlcXVpcmVkIG9wdGlvbiBpZGVudGlmaWNhdG9yIGlzIHVua25vd24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgdm9pZCogcFZhbHVlKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDb250ZXh0ID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVyciAgICAgID0gTTROT19FUlJPUjsKLQotICAgIC8qIG5vIGNoZWNrIG9mIGNvbnRleHQgYXQgdGhpcyBsZXZlbCBiZWNhdXNlIHNvbWUgb3B0aW9uIGRvZXMgbm90IG5lZWQgaXQgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBWYWx1ZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXRPcHRpb246IGludmFsaWQgcG9pbnRlciBvbiB2YWx1ZSIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkKLSAgICB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfRHVyYXRpb246Ci0gICAgICAgICooKE00T1NBX1VJbnQzMiopcFZhbHVlKSA9IHBDb250ZXh0LT5tX3BBdWRpb1N0cmVhbS0+bV9kdXJhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICBlcnIgPSBNNFBDTVJfZ2V0VmVyc2lvbigoTTRfVmVyc2lvbkluZm8qKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQ29weXJpZ2h0OgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQ29udGV4dC0+bV9wQXVkaW9TdHJlYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gcENvbnRleHQtPm1fcEF1ZGlvU3RyZWFtLT5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCaXRyYXRlID0gMDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2dldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSBtZWRpYQotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSAgY29udGV4dCBvZiB0aGUgbmV0d29yayByZWFkZXIKLSAqIEBwYXJhbSAgIHBNZWRpYUZhbWlseTogICAoT1VUKSBwb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZmlsbGVkCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKE9VVCkgcG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgYW5kIGZpbGxlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGZvdW5kIHN0cmVhbSBkZXNjcmlwdGlvbgotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYSAoYWxsIHN0cmVhbXMgZm91bmQpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UkVBREVSX01lZGlhRmFtaWx5ICpwTWVkaWFGYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqKnBTdHJlYW1IYW5kbGVyKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDPShNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0vKiAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICBwU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ki8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiBzdHJlYW1EZXNjOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogIHBBdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgZkR1cmF0aW9uOwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8qIHBEc2k7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhRmFtaWx5ID09IDApLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIE1lZGlhRmFtaWx5Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciIpOwotCi0gICAgZXJyID0gTTRQQ01SX2dldE5leHRTdHJlYW0oIHBDLT5tX2NvcmVDb250ZXh0LCAmc3RyZWFtRGVzYyk7Ci0gICAgaWYgKGVyciA9PSBNNFdBUl9OT19NT1JFX1NUUkVBTSkKLSAgICB7Ci0gICAgICAgIHN0cmVhbUlkQXJyYXlbMF0gPSAwOwotICAgICAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLSAgICAgICAgZXJyID0gTTRQQ01SX3N0YXJ0UmVhZGluZyhwQy0+bV9jb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSk7IC8qdG8gcHV0IGluIG9wZW4gZnVuY3Rpb24qLwotCi0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOyAvKmFsc28gcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNKi8KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHN0cmVhbURlc2Muc3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0F1ZGlvVW5rbm93bjoKLSAgICAgICAgY2FzZSBNNFNZU19rUENNXzE2Yml0c1M6Ci0gICAgICAgIGNhc2UgTTRTWVNfa1BDTV8xNmJpdHNVOgotICAgICAgICBjYXNlIE00U1lTX2tQQ01fOGJpdHNVOgotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBmb3VuZCBhdWRpbyBzdHJlYW0iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseVVua25vd247Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGZvdW5kIFVOS05PV04gc3RyZWFtIik7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpLAotICAgICAgICAgTTRSRUFERVJfV0FWLCAoTTRPU0FfQ2hhciAqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKLSAgICBpZiAocEF1ZGlvU3RyZWFtSGFuZGxlciA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0gPSAoTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotCi0gICAgcERzaSA9IChNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbyopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwRHNpID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGludmFsaWQgZGVjb2RlciBzcGVjaWZpYyBpbmZvIGluIHN0cmVhbSIpOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IHBEc2ktPlNhbXBsZUZyZXF1ZW5jeTsKLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplICAgID0gKE00T1NBX1VJbnQzMikocERzaS0+Qml0c1BlclNhbXBsZS84KTsKLSAgICAvKiBtX2J5dGVGcmFtZUxlbmd0aCBpcyBiYWRseSBuYW1lZDogaXQgaXMgbm90IGluIGJ5dGVzIGJ1dCBpbiBzYW1wbGVzIG51bWJlciAqLwotICAgIGlmKHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPT0gODAwMCkKLSAgICB7Ci0gICAgICAgIC8qIEFNUiBjYXNlICovCi0gICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoICAgPQotICAgICAgICAgICAgICgoKHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGUvOCkvNTApL3BEc2ktPm5iQ2hhbm5lbHMpXAotICAgICAgICAgICAgICAgIC9wQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplOy8qLzUwIHRvIGdldCBhcm91bmQgMjAgbXMgb2YgYXVkaW8qLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBBQUMgQ2FzZSAqLwotICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9Ci0gICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKChzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlLzgpLzE1LjYyNSkvcERzaS0+bmJDaGFubmVscylcCi0gICAgICAgICAgICAgICAgL3BBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemU7Ci0gICAgfQotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzICAgICAgICA9IHBEc2ktPm5iQ2hhbm5lbHM7Ci0KLSAgICBNNE9TQV9USU1FX1RPX01TKCBmRHVyYXRpb24sIHN0cmVhbURlc2MuZHVyYXRpb24sIHN0cmVhbURlc2MudGltZVNjYWxlKTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fZHVyYXRpb24gICAgICAgICAgICAgICAgPSAoTTRPU0FfSW50MzIpZkR1cmF0aW9uOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyAgICA9IChNNE9TQV9VSW50OCopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fc3RyZWFtSWQgICAgICAgICAgICAgICAgPSBzdHJlYW1EZXNjLnN0cmVhbUlEOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9wVXNlckRhdGEgICAgICAgICAgICAgICA9Ci0gICAgICAgICh2b2lkKilzdHJlYW1EZXNjLnRpbWVTY2FsZTsgLyp0cmljayB0byBjaGFuZ2UqLwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9hdmVyYWdlQml0UmF0ZSAgICAgICAgICA9IHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGU7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX21heEFVU2l6ZSAgICAgICAgICAgICAgID0KLSAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoKnBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemVcCi0gICAgICAgICAgICAqcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9zdHJlYW1UeXBlICAgICAgICAgICAgICA9IE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtOwotCi0gICAgKnBTdHJlYW1IYW5kbGVyID0gcEMtPm1fcEF1ZGlvU3RyZWFtOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgZmlsbCB0aGUgYWNjZXNzIHVuaXQgc3RydWN0dXJlIHdpdGggaW5pdGlhbGl6YXRpb24gdmFsdWVzCi0gKiBAbm90ZQotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAoSU4pIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKElOKSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaGFuZGxlciB0byB3aGljaCB0aGUgYWNjZXNzIHVuaXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhc3NvY2lhdGVkCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdDogICAgKElOKSBwb2ludGVyIHRvIHRoZSBhY2Nlc3MgdW5pdChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikgdG8gaW5pdGlhbGl6ZQotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9maWxsQXVTdHJ1Y3Q6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBBdS0+c2l6ZSAgICAgICAgPSAwOwotICAgIHBBdS0+Q1RTICAgICAgICAgPSAwOwotICAgIHBBdS0+RFRTICAgICAgICAgPSAwOwotICAgIHBBdS0+YXR0cmlidXRlICAgPSAwOwotICAgIHBBdS0+bmJGcmFnICAgICAgPSAwOwotCi0gICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9DVFMgICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0RUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyAgPSBNNE9TQV9OVUxMOy8qcEJ1ZmZlcjsqLwotICAgIHBBY2Nlc3NVbml0LT5tX21heHNpemUgICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJlYW1JRCAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJ1Y3RTaXplICAgPSBzaXplb2YoTTRfQWNjZXNzVW5pdCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICByZXNldCB0aGUgc3RyZWFtLCB0aGF0IGlzOiBzZWVrIGl0IHRvIGJlZ2lubmluZyBhbmQgbWFrZSBpdCByZWFkeSB0byBiZSByZWFkCi0gKiBAbm90ZQotICogQHBhcmFtICAgY29udGV4dDogICAgICAgIChJTikgY29udGV4dCBvZiB0aGUgbmV0d29yayByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyOiAoSU4pIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIHJlc2V0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9yZXNldChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgIHRpbWU2NCA9IDA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9QQ01fcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX3Jlc2V0OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRQQ01SX2ZyZWVBVShwQy0+bV9jb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9yZXNldDogZXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0Iik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIHBBdS0+Q1RTID0gMDsKLSAgICBwQXUtPkRUUyA9IDA7Ci0KLSAgICAvKiBUaGlzIGNhbGwgaXMgbmVlZGVkIG9ubHkgd2hlbiByZXBsYXkgZHVyaW5nIHBsYXliYWNrICovCi0gICAgZXJyID0gTTRQQ01SX3NlZWsocEMtPm1fY29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXksIHRpbWU2NCwgTTRTWVNfa0JlZ2lubmluZywgJnRpbWU2NCk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldCB0aGUgbmV4dCBhY2Nlc3MgdW5pdCBvZiB0aGUgc3BlY2lmaWVkIHN0cmVhbQotICogQG5vdGUKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyICAoSU4pICAgICAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgIHBBY2Nlc3NVbml0ICAgICAoSU4vT1VUKSAgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB1bml0IHRvIGZpbGwgd2l0aCByZWFkIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlIGF1IHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIsIGFuZCBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGNhbGxpbmcgTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdCBhZnRlciBjcmVhdGlvbikKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJucyBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJucyBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotICogQHJldHVybnMgTTRXQVJfTk9fREFUQV9ZRVQgICAgICAgICAgIHRoZXJlIGlzIG5vIGVub3VnaCBkYXRhIG9uIHRoZSBzdHJlYW0gZm9yIG5ldyBhY2Nlc3MgdW5pdAotICogQHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgICAgIHRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0gKGVuZCBvZiBzdHJlYW0pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZ2V0TmV4dEF1KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIC8qIGtlZXAgdHJhY2Ugb2YgdGhlIGFsbG9jYXRlZCBidWZmZXJzIGluIEFVIHRvIGJlIGFibGUgdG8gZnJlZSB0aGVtIGF0IGRlc3Ryb3koKQotICAgICAgIGJ1dCBiZSBhd2FyZSB0aGF0IHN5c3RlbSBpcyByaXNreSBhbmQgd291bGQgbmVlZCB1cGdyYWRlIGlmIG1vcmUgdGhhbgotICAgICAgIG9uZSB2aWRlbyBhbmQgb25lIGF1ZGlvIEFVIGlzIG5lZWRlZCAqLwotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRQQ01SX2ZyZWVBVShwQy0+bV9jb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9nZXROZXh0QXU6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBBdS0+bmJGcmFnID0gMDsKLSAgICBlcnIgPSBNNFBDTVJfbmV4dEFVKHBDLT5tX2NvcmVDb250ZXh0LCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCwgcEF1KTsKLQotICAgIGlmIChlcnIgPT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzID0gKE00T1NBX01lbUFkZHI4KXBBdS0+ZGF0YUFkZHJlc3M7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgPSBwQXUtPnNpemU7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgPSAoTTRPU0FfRG91YmxlKXBBdS0+Q1RTOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9EVFMgID0gKE00T1NBX0RvdWJsZSlwQXUtPkRUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlID0gcEF1LT5hdHRyaWJ1dGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemU9MDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAganVtcCBpbnRvIHRoZSBzdHJlYW0gYXQgdGhlIHNwZWNpZmllZCB0aW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXIgIChJTikgICAgIHRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgcFRpbWUgICAgICAgICAgIChJTi9PVVQpIElOOiAgdGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiB0aGUgdGltZSB0byB3aGljaCB0aGUgc3RyZWFtIHJlYWxseSBqdW1wZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1dCBpbiB0aGlzIHJlYWRlciwgd2UgZG8gbm90IG1vZGlmeSB0aGUgdGltZQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgdGhlIHN0cmVhbUlEIGRvZXMgbm90IGV4aXN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fanVtcChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICBNNE9TQV9JbnQzMiogcFRpbWUpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgICAgICAgICAgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgdGltZTY0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfUENNX2p1bXA6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fanVtcDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBUaW1lID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9QQ01fanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLQotICAgIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9qdW1wOiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRQQ01SX2ZyZWVBVShwQy0+bV9jb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9qdW1wOiBFcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXQiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgc3RyZWFtSWRBcnJheVswXSA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotCi0gICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0KLSAgICBlcnIgPSBNNFBDTVJfc2VlayhwQy0+bV9jb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSwgdGltZTY0LCBNNFNZU19rQmVnaW5uaW5nLCAmdGltZTY0KTsKLQotICAgICpwVGltZSA9IChNNE9TQV9JbnQzMil0aW1lNjQ7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotICoKLSAqIEBwYXJhbSBwTWVkaWFUeXBlICAgICAgICAgIDogUG9pbnRlciBvbiBhIE00UkVBREVSX01lZGlhVHlwZSAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSAqIEBwYXJhbSBwUmRyR2xvYmFsSW50ZXJmYWNlIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZ2xvYmFsIGludGVyZmFjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBieSB0aGlzIHJlYWRlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotICogQHBhcmFtIHBSZHJEYXRhSW50ZXJmYWNlICAgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBkYXRhIGludGVyZmFjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBieSB0aGlzIHJlYWRlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotICoKLSAqIEByZXR1cm5zIDogTTROT19FUlJPUiAgICAgaWYgT0sKLSAqICAgICAgICAgICAgRVJSX0FMTE9DICAgICAgaWYgYW4gYWxsb2NhdGlvbiBmYWlsZWQKLSAqICAgICAgICAgICAgRVJSX1BBUkFNRVRFUiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRSRUFERVJfUENNX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwTWVkaWFUeXBlID09IDApLCAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNZWRpYVR5cGUgcGFzc2VkIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmRyR2xvYmFsSW50ZXJmYWNlID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZHJEYXRhSW50ZXJmYWNlID09IDApLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlczogaW52YWxpZCBwb2ludGVyIHRvIE00UkVBREVSX0RhdGFJbnRlcmZhY2UiKTsKLQotICAgICpwUmRyR2xvYmFsSW50ZXJmYWNlID0KLSAgICAgICAgIChNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSksIE00UkVBREVSX1dBViwKLSAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9QQ00gR2xvYmFsSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBSZHJHbG9iYWxJbnRlcmZhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgICpwUmRyRGF0YUludGVyZmFjZSA9Ci0gICAgICAgICAoTTRSRUFERVJfRGF0YUludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBzaXplb2YoTTRSRUFERVJfRGF0YUludGVyZmFjZSksIE00UkVBREVSX1dBViwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopICJNNFJFQURFUl9QQ00gRGF0YUludGVyZmFjZSIpOwotICAgIGlmIChNNE9TQV9OVUxMID09ICpwUmRyRGF0YUludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgIGZyZWUoKnBSZHJHbG9iYWxJbnRlcmZhY2UpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgKnBNZWRpYVR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlUENNOwotCi0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlICAgICAgICAgICA9IE00UkVBREVSX1BDTV9jcmVhdGU7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RGVzdHJveSAgICAgICAgICA9IE00UkVBREVSX1BDTV9kZXN0cm95OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdE9wZW4gICAgICAgICAgICAgPSBNNFJFQURFUl9QQ01fb3BlbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RDbG9zZSAgICAgICAgICAgID0gTTRSRUFERVJfUENNX2Nsb3NlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0YXJ0ICAgICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0b3AgICAgICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbiAgICAgICAgPSBNNFJFQURFUl9QQ01fZ2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFNldE9wdGlvbiAgICAgICAgPSBNNFJFQURFUl9QQ01fc2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldE5leHRTdHJlYW0gICAgPSBNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RGaWxsQXVTdHJ1Y3QgICAgID0gTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RKdW1wICAgICAgICAgICAgID0gTTRSRUFERVJfUENNX2p1bXA7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0UmVzZXQgICAgICAgICAgICA9IE00UkVBREVSX1BDTV9yZXNldDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRQcmV2UmFwVGltZSAgID0gTTRPU0FfTlVMTDsgLyphbGwgQVVzIGFyZSBSQVAqLwotCi0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcEZjdEdldE5leHRBdSAgICAgICAgICA9IE00UkVBREVSX1BDTV9nZXROZXh0QXU7Ci0KLSAgICAoKnBSZHJEYXRhSW50ZXJmYWNlKS0+bV9yZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M2N2U3Mi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfRVhURVJOQUxfQml0c3RyZWFtUGFyc2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNNFZEX1Rvb2xzLmgiCi0jaW5jbHVkZSAiTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgiCi0jaW5jbHVkZSAiT01YX1ZpZGVvLmgiCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYwotICogQGJyaWVmCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGV4dGVybmFsIEJpdHN0cmVhbSBwYXJzZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDggY29kZTsKLSAgICBNNE9TQV9JbnQzMiBwcm9maWxlOwotICAgIE00T1NBX0ludDMyIGxldmVsOwotfSBjb2RlUHJvZmlsZUxldmVsOwotCi1zdGF0aWMgY29kZVByb2ZpbGVMZXZlbCBtcGVnNFByb2ZpbGVMZXZlbFRhYmxlW10gPSB7Ci0gICAgezB4MDEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4MDIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4MDMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4MDQsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNGF9LAotICAgIHsweDA1LCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDV9LAotICAgIHsweDA4LCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDB9LAotICAgIHsweDExLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHgxMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlLE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4MjEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDIyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHgzMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1haW4sIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4MzMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweDM0LCBPTVhfVklERU9fTVBFRzRQcm9maWxlTWFpbiwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKLSAgICB7MHg0MiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZU5iaXQsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4NTEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4NjEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGYWNlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDYyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlRmFjZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHg3MSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4NzIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVCYXNpY0FuaW1hdGVkLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDgxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDgyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDkxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHg5MiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4OTMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweDk0LCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKLSAgICB7MHhhMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhhMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHhhMywgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHhiMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGIyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4YjMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZywgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHhiNCwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCBPTVhfVklERU9fTVBFRzRMZXZlbDR9LAotICAgIHsweGMxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGMyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweGQxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhkMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4ZDMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweGYwLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMH0sCi0gICAgezB4ZjEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhmMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweGYzLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4ZjQsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKLSAgICB7MHhmNSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDV9Ci19OwotCi1NNE9TQV9VSW50MzIgTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeShNNFZTX0JpdHN0cmVhbV9jdHh0KiBwYXJzaW5nQ3R4dCwKLSAgICAgTTRPU0FfVUludDMyIG5iX2JpdHMpCi17Ci0gICAgICAgIHJldHVybihNNFZEX1Rvb2xzX0dldEJpdHNGcm9tTWVtb3J5KHBhcnNpbmdDdHh0LG5iX2JpdHMpKTsKLX0KLQotTTRPU0FfRVJSIE00VkRfRVhURVJOQUxfV3JpdGVCaXRzVG9NZW1vcnkoTTRPU0FfVUludDMyIGJpdHNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHIzMiBkZXN0X2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggb2Zmc2V0LCBNNE9TQV9VSW50OCBuYl9iaXRzKQotewotICAgICAgICByZXR1cm4gKE00VkRfVG9vbHNfV3JpdGVCaXRzVG9NZW1vcnkoIGJpdHNUb1dyaXRlLGRlc3RfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgIG5iX2JpdHMpKTsKLX0KLQotTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJKE00T1NBX1VJbnQ4KiBwVm9sLCBNNE9TQV9JbnQzMiBhVm9sU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyogcERjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1NpemUqIHBWaWRlb1NpemUpCi17Ci0gICAgTTRWU19CaXRzdHJlYW1fY3R4dCBwYXJzaW5nQ3R4dDsKLSAgICBNNE9TQV9VSW50MzIgY29kZSwgajsKLSAgICBNNE9TQV9NZW1BZGRyOCBzdGFydDsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX1VJbnQzMiB0aW1lX2luY3JfbGVuZ3RoOwotICAgIE00T1NBX1VJbnQ4IHZvbF92ZXJpZD0wLCBiX2hpZXJhcmNoeV90eXBlOwotCi0gICAgLyogUGFyc2luZyB2YXJpYWJsZXMgKi8KLSAgICBNNE9TQV9VSW50OCB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV9lbmFibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHJlZHVjZWRfcmVzb2x1dGlvbl92b3BfZW5hYmxlID0gMDsKLSAgICBNNE9TQV9VSW50OCBzY2FsYWJpbGl0eSA9IDA7Ci0gICAgTTRPU0FfVUludDggZW5oYW5jZW1lbnRfdHlwZSA9IDA7Ci0gICAgTTRPU0FfVUludDggY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IGludGVybGFjZWQgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IDA7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX2JyaWdodG5lc3NfY2hhbmdlID0gMDsKLSAgICBNNE9TQV9VSW50OCBxdWFudF9wcmVjaXNpb24gPSAwOwotCi0gICAgLyogRmlsbCB0aGUgc3RydWN0dXJlIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzICovCi0gICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoICAgICAgICAgICAgICA9IDA7Ci0gICAgcFZpZGVvU2l6ZS0+bV91aUhlaWdodCAgICAgICAgICAgICA9IDA7Ci0KLSAgICBwRGNpLT51aVRpbWVTY2FsZSAgICAgICAgICA9IDA7Ci0gICAgcERjaS0+dWlQcm9maWxlICAgICAgICAgICAgPSAwOwotICAgIHBEY2ktPnVpVXNlT2ZSZXN5bmNoTWFya2VyID0gMDsKLSAgICBwRGNpLT5iRGF0YVBhcnRpdGlvbiAgICAgICA9IE00T1NBX0ZBTFNFOwotICAgIHBEY2ktPmJVc2VPZlJWTEMgICAgICAgICAgID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKiBSZXNldCB0aGUgYml0c3RyZWFtIGNvbnRleHQgKi8KLSAgICBwYXJzaW5nQ3R4dC5zdHJlYW1fYnl0ZSA9IDA7Ci0gICAgcGFyc2luZ0N0eHQuc3RyZWFtX2luZGV4ID0gODsKLSAgICBwYXJzaW5nQ3R4dC5pbiA9IChNNE9TQV9JbnQ4ICopcFZvbDsKLQotICAgIHN0YXJ0ID0gKE00T1NBX0ludDggKilwVm9sOwotCi0gICAgLyogU3RhcnQgcGFyc2luZyAqLwotICAgIHdoaWxlIChwYXJzaW5nQ3R4dC5pbiAtIHN0YXJ0IDwgYVZvbFNpemUpCi0gICAgewotICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICBpZiAoY29kZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBjb2RlIGZvdW5kICovCi0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gMHgyMC4uMHgyRiA6IHZpZGVvX29iamVjdF9sYXllcl9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChjb2RlID4gMHgxRikgJiYgKGNvZGUgPCAweDMwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogcmFuZG9tIGFjY2Vzc2libGUgdm9sICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsvKiB2aWRlbyBvYmplY3QgdHlwZSBpbmRpY2F0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBpcyBvYmplY3QgbGF5ZXIgaWRlbnRpZmllciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCk7IC8qIHZpZGVvIG9iamVjdCBsYXllciB2ZXJpZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsgLyogdmlkZW8gb2JqZWN0IGxheWVyIHByaW9yaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KTsvKiBhc3BlY3QgcmF0aW8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDE1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7IC8qIHBhcl93aWR0aCBhbmQgcGFyX2hlaWdodCAoOCs4KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Lyogdm9sIGNvbnRyb2wgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyk7LyogY2hyb21hIGZvcm1hdCArIGxvdyBkZWxheSAoMysxKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiB2YnYgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyKTsvKiBmaXJzdCBhbmQgbGF0dGVyIGhhbGYgYml0cmF0ZSArIDIgbWFya2VyIGJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE1ICsgMSArIDE1ICsgMSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSk7LyogZmlyc3QgYW5kIGxhdHRlciBoYWxmIHZidiBidWZmZXIgc2l6ZSArIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxmIHZidiBvY2N1cGFuY3kgKyBtYXJrZXIgYml0cyAoMTUrMSszKzExKzEpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7LyogZmlyc3QgaGFsZiB2YnYgb2NjdXBhbmN5ICsgbWFya2VyIGJpdHMgKDE1KzEpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsgLyogdmlkZW8gb2JqZWN0IGxheWVyIHNoYXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkIHRvIHNhdmUgaXQgZm9yIHZvcCBwYXJzaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAoTTRPU0FfVUludDgpY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gMCkgcmV0dXJuIDA7IC8qIG9ubHkgcmVjdGFuZ3VsYXIgY2FzZSBzdXBwb3J0ZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7IC8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsgLyogVk9QIHRpbWUgaW5jcmVtZW50IHJlc29sdXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPnVpVGltZVNjYWxlID0gY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcHV0ZXMgdGltZSBpbmNyZW1lbnQgbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgICAgICAgICBqICAgID0gY29kZSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IDMyKSAmJiAoaiAhPSAwKTsgaiA+Pj0xKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfaW5jcl9sZW5ndGggPSAoaSA9PSAwKSA/IDEgOiBpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBGaXhlZCBWT1AgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9pbmNyX2xlbmd0aCk7LyogRml4ZWQgVk9QIHRpbWUgaW5jcmVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAhPSAxKSAvKiAxID0gQmluYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDApIC8qIDAgPSByZWN0YW5ndWxhciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMpOy8qIFdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb1NpemUtPm1fdWlXaWR0aCA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBIZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvU2l6ZS0+bV91aUhlaWdodCA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogaW50ZXJsYWNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogT0JNQyBkaXNhYmxlICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZvbF92ZXJpZCA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsvKiBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzcHJpdGVfZW5hYmxlID09IDEpIHx8IChzcHJpdGVfZW5hYmxlID09IDIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3ByaXRlIHN0YXRpYyA9IDEgYW5kIFNwcml0ZSBHTUMgPSAyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwcml0ZV9lbmFibGUgIT0gMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyk7Lyogc3ByaXRlIHdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgaGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgbCBjb29yZGluYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgdG9wIGNvb3JkaW5hdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYpOy8qIHNwcml0ZSB3YXJwaW5nIHBvaW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsvKiBzcHJpdGUgd2FycGluZyBhY2N1cmFjeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBzcHJpdGUgYnJpZ2h0bmVzcyBjaGFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2UgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ByaXRlX2VuYWJsZSAhPSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogbG93IGxhdGVuY3kgc3ByaXRlIGVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodm9sX3ZlcmlkICE9IDEpICYmICh2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBzYWRjdCBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7IC8qIG5vdCA4IGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KTsvKiBxdWFudCBwcmVjaXNpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudF9wcmVjaXNpb24gPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOy8qIGJpdHMgcGVyIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyZXlzY2FsZSBub3Qgc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyk7IC8qIG5vZ3JheSBxdWFudCB1cGRhdGUgKyBjb21wb3NpdGlvbiBtZXRob2QgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lYXIgY29tcG9zaXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHF1YW50IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogbG9hZCBpbnRyYSBxdWFudCBtYXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7LyogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IDY0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogbG9hZCBub24gaW50cmEgcXVhbnQgbWF0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOy8qICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICAgID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCA2NCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2xfdmVyaWQgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogcXVhcnRlciBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGNvbXBsZXhpdHkgZXN0aW1hdGlvbiBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4aXR5X2VzdGltYXRpb25fZGlzYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHJlc3luYyBtYXJrZXIgZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlVc2VPZlJlc3luY2hNYXJrZXIgPSAoY29kZSkgPyAwIDogMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGRhdGEgcGFydGl0aW9ubmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT5iRGF0YVBhcnRpdGlvbiA9IChjb2RlKSA/IE00T1NBX1RSVUUgOiBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldmVyc2libGUgVkxDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT5iVXNlT2ZSVkxDID0gKGNvZGUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sX3ZlcmlkICE9IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsvKiBuZXdwcmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZHVjZWQgcmVzb2x1dGlvbiB2b3AgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VkX3Jlc29sdXRpb25fdm9wX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOy8qIHNjYWxhYmlsaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJpbGl0eSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGllcmFyY2h5IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfaGllcmFyY2h5X3R5cGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWYgbGF5ZXIgaWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZiBzYW1wbGluZyBkaXJlY3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhvciBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaG9yIHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmhhbmNlbWVudCB0eXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmhhbmNlbWVudF90eXBlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghYl9oaWVyYXJjaHlfdHlwZSkgJiYgKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSByZWYgc2hhcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIHJlZiB0ZXh0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYXBlIGhvciBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFwZSBob3Igc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcGUgdmVydCBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFwZSB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweEIwIDogdmlzdWFsX29iamVjdF9zZXF1ZW5jZV9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjb2RlID09IDB4QjApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT51aVByb2ZpbGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIDB4QjUgOiB2aXN1YWxfb2JqZWN0X3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNvZGUgPT0gMHhCNSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgb2JqZWN0IGxheWVyIGlkZW50aWZpZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aXN1YWwgb2JqZWN0IHZlcmlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xfdmVyaWQgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlzdWFsIG9iamVjdCBsYXllciBwcmlvcml0eSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWxpZ24gb24gYnl0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sX3ZlcmlkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIGVuZCAtLS0tLSAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPj4gMikgPT0gMHgyMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogSDI2MyAuLi4tPiB3cm9uZyovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgZ2V0QVZDUHJvZmlsZUFuZExldmVsKE00T1NBX1VJbnQ4KiBwRFNJLCBNNE9TQV9JbnQzMiBEU0lTaXplLAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpwUHJvZmlsZSwgTTRPU0FfSW50MzIgKnBMZXZlbCkgewotCi0gICAgTTRPU0FfVUludDE2IGluZGV4ID0gMjg7IC8qIHRoZSAyOXRoIGJ5dGUgaXMgU1BTIHN0YXJ0ICovCi0gICAgTTRPU0FfQm9vbCBjb25zdHJhaW50U2V0MzsKLQotICAgIGlmICgocFByb2ZpbGUgPT0gTTRPU0FfTlVMTCkgfHwgKHBMZXZlbCA9PSBNNE9TQV9OVUxMKSkgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmICgoRFNJU2l6ZSA8PSBpbmRleCkgfHwgKHBEU0kgPT0gTTRPU0FfTlVMTCkpIHsKLSAgICAgICAgQUxPR0UoImdldEFWQ1Byb2ZpbGVBbmRMZXZlbDogRFNJIGlzIGludmFsaWQiKTsKLSAgICAgICAgKnBQcm9maWxlID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgICAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBjb25zdHJhaW50U2V0MyA9IChwRFNJW2luZGV4KzJdICYgMHgxMCk7Ci0gICAgQUxPR1YoImdldEFWQ1Byb2ZpbGVBbmRMZXZlbCBwcm9maWxlX2J5dGUgJWQsIGxldmVsX2J5dGU6ICVkIGNvbnN0cmFpbjNmbGFnIiwKLSAgICAgICAgICBwRFNJW2luZGV4KzFdLCBwRFNJW2luZGV4KzNdLCBjb25zdHJhaW50U2V0Myk7Ci0KLSAgICBzd2l0Y2ggKHBEU0lbaW5kZXgrMV0pIHsKLSAgICAgICAgY2FzZSA2NjoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3NzoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVFeHRlbmRlZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExMDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIyOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ0OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDQ0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgfQotCi0gICAgc3dpdGNoIChwRFNJW2luZGV4KzNdKSB7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRTZXQzKQotICAgICAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxYjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDEzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDIxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMjI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMzE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw0MTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDUxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICB9Ci0gICAgQUxPR1YoImdldEFWQ1Byb2ZpbGVBbmRMZXZlbCBwcm9maWxlICVsZCBsZXZlbCAlbGQiLCAqcFByb2ZpbGUsICpwTGV2ZWwpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCogcERTSSwgTTRPU0FfSW50MzIgRFNJU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcFByb2ZpbGUsIE00T1NBX0ludDMyICpwTGV2ZWwpIHsKLQotICAgIE00T1NBX1VJbnQxNiBpbmRleCA9IDc7IC8qIHRoZSA1dGggYW5kIDZ0aCBieXRlcyBjb250YWluIHRoZSBsZXZlbCBhbmQgcHJvZmlsZSAqLwotCi0gICAgaWYgKChwUHJvZmlsZSA9PSBNNE9TQV9OVUxMKSB8fCAocExldmVsID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIGludmFsaWQgcG9pbnRlciBmb3IgcFByb2ZpbGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAoKERTSVNpemUgPCBpbmRleCkgfHwgKHBEU0kgPT0gTTRPU0FfTlVMTCkpIHsKLSAgICAgICAgQUxPR0UoImdldEgyNjNQcm9maWxlQW5kTGV2ZWw6IERTSSBpcyBpbnZhbGlkIik7Ci0gICAgICAgICpwUHJvZmlsZSA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICAgICAgKnBMZXZlbCA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIHByb2ZpbGVfYnl0ZSAlZCwgbGV2ZWxfYnl0ZSIsCi0gICAgICAgICAgcERTSVs2XSwgcERTSVs1XSk7Ci0gICAgLyogZ2V0IHRoZSBIMjYzIGxldmVsICovCi0gICAgc3dpdGNoIChwRFNJWzVdKSB7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDMwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDQ1OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDUwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDYwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDcwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICpwTGV2ZWwgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgIH0KLQotICAgIC8qIGdldCBIMjYzIHByb2ZpbGUgKi8KLSAgICBzd2l0Y2ggKHBEU0lbNl0pIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSDMyMENvZGluZzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybmV0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybGFjZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIHByb2ZpbGUgJWxkIGxldmVsICVsZCIsICpwUHJvZmlsZSwgKnBMZXZlbCk7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCBwcm9maWxlQW5kTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKSB7Ci0KLSAgICBNNE9TQV9VSW50MzIgaSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgaWYgKChwUHJvZmlsZSA9PSBNNE9TQV9OVUxMKSB8fCAocExldmVsID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbCBwcm9maWxlQW5kTGV2ZWwgJWQiLCBwcm9maWxlQW5kTGV2ZWwpOwotICAgIGxlbmd0aCA9IHNpemVvZihtcGVnNFByb2ZpbGVMZXZlbFRhYmxlKSAvc2l6ZW9mKG1wZWc0UHJvZmlsZUxldmVsVGFibGVbMF0pOwotICAgICpwUHJvZmlsZSA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaWYgKG1wZWc0UHJvZmlsZUxldmVsVGFibGVbaV0uY29kZSA9PSBwcm9maWxlQW5kTGV2ZWwpIHsKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IG1wZWc0UHJvZmlsZUxldmVsVGFibGVbaV0ucHJvZmlsZTsKLSAgICAgICAgICAgICpwTGV2ZWwgPSBtcGVnNFByb2ZpbGVMZXZlbFRhYmxlW2ldLmxldmVsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoImdldE1QRUc0UHJvZmlsZUFuZExldmVsIHByb2ZpbGUgJWxkIGxldmVsICVsZCIsICpwUHJvZmlsZSwgKnBMZXZlbCk7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfVG9vbHMuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9Ub29scy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZGI0YjQxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9Ub29scy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLSNpbmNsdWRlICJNNFZEX1Rvb2xzLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFZEX1Rvb2xzLmMKLSAqIEBicmllZgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBoZWxwZXIgZnVuY3Rpb25zIGZvciBCaXRzdHJlYW0gcGFyc2VyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfVUludDMyIE00VkRfVG9vbHNfR2V0Qml0c0Zyb21NZW1vcnkoTTRWU19CaXRzdHJlYW1fY3R4dCogcGFyc2luZ0N0eHQsCi0gICAgIE00T1NBX1VJbnQzMiBuYl9iaXRzKQotewotICAgIE00T1NBX1VJbnQzMiAgICBjb2RlOwotICAgIE00T1NBX1VJbnQzMiAgICBpOwotICAgIGNvZGUgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9iaXRzOyBpKyspCi0gICAgewotICAgICAgICBpZiAocGFyc2luZ0N0eHQtPnN0cmVhbV9pbmRleCA9PSA4KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL000T1NBX21lbWNweSggKE00T1NBX01lbUFkZHI4KSYocGFyc2luZ0N0eHQtPnN0cmVhbV9ieXRlKSwgcGFyc2luZ0N0eHQtPmluLAotICAgICAgICAgICAgLy8gICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7Ci0gICAgICAgICAgICBwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgPSAodW5zaWduZWQgY2hhcikocGFyc2luZ0N0eHQtPmluKVswXTsKLSAgICAgICAgICAgIHBhcnNpbmdDdHh0LT5pbisrOwotICAgICAgICAgICAgLy9mcmVhZCgmc3RyZWFtX2J5dGUsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwxLGluKTsKLSAgICAgICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1faW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGNvZGUgPSAoY29kZSA8PCAxKTsKLSAgICAgICAgY29kZSB8PSAoKHBhcnNpbmdDdHh0LT5zdHJlYW1fYnl0ZSAmIDB4ODApID4+IDcpOwotCi0gICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1fYnl0ZSA9IChwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgPDwgMSk7Ci0gICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1faW5kZXgrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29kZTsKLX0KLQotTTRPU0FfRVJSIE00VkRfVG9vbHNfV3JpdGVCaXRzVG9NZW1vcnkoTTRPU0FfVUludDMyIGJpdHNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHIzMiBkZXN0X2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggb2Zmc2V0LCBNNE9TQV9VSW50OCBuYl9iaXRzKQotewotICAgIE00T1NBX1VJbnQ4IGksajsKLSAgICBNNE9TQV9VSW50MzIgdGVtcF9kZXN0ID0gMCwgbWFzayA9IDAsIHRlbXAgPSAxOwotICAgIE00T1NBX1VJbnQzMiBpbnB1dCA9IGJpdHNUb1dyaXRlOwotICAgIGlucHV0ID0gKGlucHV0IDw8ICgzMiAtIG5iX2JpdHMgLSBvZmZzZXQpKTsKLQotICAgIC8qIFB1dCBkZXN0aW5hdGlvbiBidWZmZXIgdG8gMCAqLwotICAgIGZvcihqPTA7ajwzO2orKykKLSAgICB7Ci0gICAgICAgIGZvcihpPTA7aTw4O2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKGoqOCkraSA+PSBvZmZzZXQgJiYgKGoqOCkraSA8IG5iX2JpdHMgKyBvZmZzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWFzayB8PSAodGVtcCA8PCAoKDcqKGorMSkpLWkraikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1hc2sgPSB+bWFzazsKLSAgICAqZGVzdF9iaXRzICY9IG1hc2s7Ci0KLSAgICAvKiBQYXJzZSBpbnB1dCBiaXRzLCBhbmQgZmlsbCBvdXRwdXQgYnVmZmVyICovCi0gICAgZm9yKGo9MDtqPDM7aisrKQotICAgIHsKLSAgICAgICAgZm9yKGk9MDtpPDg7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoaio4KStpID49IG9mZnNldCAmJiAoaio4KStpIDwgbmJfYml0cyArIG9mZnNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gKChpbnB1dCAmICgweDgwMDAwMDAwID4+IG9mZnNldCkpID4+ICgzMS1vZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAvLypkZXN0X2JpdHMgfD0gKHRlbXAgPDwgKDMxIC0gaSkpOwotICAgICAgICAgICAgICAgICpkZXN0X2JpdHMgfD0gKHRlbXAgPDwgKCg3KihqKzEpKS1pK2opKTsKLSAgICAgICAgICAgICAgICBpbnB1dCA9IChpbnB1dCA8PCAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmJiNDZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMC5jCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgQ29sb3IgQ29udmVyc2lvbiBGaWx0ZXIKLSAqICAgICAgICAgICAtIyBDb250YWlucyB0aGUgZm9ybWF0IGNvbnZlcnNpb24gZmlsdGVycyBmcm9tIFJHQjU2NSB0byBZVVY0MjAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgdHJhbnNmb3JtIFJHQjU2NSBpbWFnZSB0byBhIFlVVjQyMCBpbWFnZS4KLSAqIEBub3RlICAgIENvbnZlcnQgUkdCNTY1IHRvIFlVVjQyMCwKLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKCAyIHJvd3MgYnkgMiByb3dzICkKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uICggMiBjb2wgYnkgMiBjb2wgKQotICogICAgICAgICAgICAgICAgICBHZXQgNCBSR0Igc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgYW5kIGJ1aWxkIDQgb3V0cHV0IFkgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBhbmQgZWFjaCBzaW5nbGUgVSAmIFYgZGF0YQotICogICAgICAgICAgICAgIGVuZCBsb29wIG9uIGNvbAotICogICAgICAgICAgZW5kIGxvb3Agb24gcm93Ci0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBTcGVjaWZpYyBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFJHQjU2NSBQbGFuZQotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvICBZVVY0MjAgYnVmZmVyIFBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IFlVViBQbGFuZSBoZWlnaHQgaXMgT0RECi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIFlVViBQbGFuZSB3aWR0aCBpcyBPREQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1Y7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0gICAgTTRWSUZJX1VJbnQxNiAgIHUxNl9waXgxLCB1MTZfcGl4MiwgdTE2X3BpeDMsIHUxNl9waXg0OwotICAgIE00VklGSV9VSW50OCBjb3VudF9udWxsPTA7Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgaGVpZ2h0IGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfaGVpZ2h0ICE9IHBQbGFuZU91dFswXS51X2hlaWdodCkgICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0PDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIC8qIENoZWNrIHBsYW5lcyB3aWR0aCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiggKHBQbGFuZUluLT51X3dpZHRoICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzFdLnVfd2lkdGg8PDEpKSB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsyXS51X3dpZHRoPDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfeV9kYXRhID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfdV9kYXRhID0gcFBsYW5lT3V0WzFdLnBhY19kYXRhICsgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsgcFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfcmdibl9kYXRhICAgPSBwUGxhbmVJbi0+cGFjX2RhdGEgKyBwUGxhbmVJbi0+dV90b3BsZWZ0OwotCi0gICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfd2lkdGggPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlMl9ZID0gdTMyX3N0cmlkZV9ZIDw8IDE7Ci0gICAgdTMyX3N0cmlkZV9VID0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IHBQbGFuZUluLT51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlXzJyZ2IgPSB1MzJfc3RyaWRlX3JnYiA8PCAxOwotCi0KLSAgICAvKiBMb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIFR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIEN1cnJlbnQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3luID0gcHU4X3lfZGF0YTsKLSAgICAgICAgLyogTmV4dCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeXMgPSBwdThfeW4gKyB1MzJfc3RyaWRlX1k7Ci0gICAgICAgIC8qIEN1cnJlbnQgVSBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdSA9IHB1OF91X2RhdGE7Ci0gICAgICAgIC8qIEN1cnJlbnQgViBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdiA9IHB1OF92X2RhdGE7Ci0KLSAgICAgICAgcHU4X3JnYm4gPSBwdThfcmdibl9kYXRhOwotCi0gICAgICAgIC8qIExvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXQgZm91ciBSR0IgNTY1IHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICB1MTZfcGl4MSA9ICooIChNNFZJRklfVUludDE2ICopIHB1OF9yZ2JuKTsKLSAgICAgICAgICAgIHUxNl9waXgyID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICB1MTZfcGl4MyA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiKSk7Ci0gICAgICAgICAgICB1MTZfcGl4NCA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0KLSAgICAgICAgICAgIC8qIFVucGFjayBSR0I1NjUgdG8gOGJpdCBSLCBHLCBCICovCi0gICAgICAgICAgICAvKiAoeCx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCx1MTZfcGl4MSk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMTAsaTMyX2cxMCxpMzJfcjEwLHUxNl9waXgyKTsKLSAgICAgICAgICAgIC8qICh4LHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEsdTE2X3BpeDMpOwotICAgICAgICAgICAgLyogKHgrMSx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMTEsaTMyX2cxMSxpMzJfcjExLHUxNl9waXg0KTsKLSAgICAgICAgICAgIC8qIElmIFJHQiBpcyB0cmFuc3BhcmVudCBjb2xvciAoMCwgNjMsIDApLCB3ZSB0cmFuc2Zvcm0gaXQgdG8gd2hpdGUgKDMxLDYzLDMxKSAqLwotICAgICAgICAgICAgaWYoaTMyX2IwMCA9PSAwICYmIGkzMl9nMDAgPT0gNjMgJiYgaTMyX3IwMCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDAgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAwID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjEwID09IDAgJiYgaTMyX2cxMCA9PSA2MyAmJiBpMzJfcjEwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IxMCA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMTAgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMDEgPT0gMCAmJiBpMzJfZzAxID09IDYzICYmIGkzMl9yMDEgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAxID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMSA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IxMSA9PSAwICYmIGkzMl9nMTEgPT0gNjMgJiYgaTMyX3IxMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMTEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjExID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBDb252ZXJ0IFJHQiB2YWx1ZSB0byBZVVYgKi8KLSAgICAgICAgICAgIGkzMl91MDAgPSBVMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICBpMzJfdjAwID0gVjE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTAwID0gWTE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotCi0gICAgICAgICAgICBpMzJfdTEwID0gVTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3YxMCA9IFYxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kxMCA9IFkxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLQotICAgICAgICAgICAgaTMyX3UwMSA9IFUxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl92MDEgPSBWMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDEgPSBZMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0KLSAgICAgICAgICAgIGkzMl91MTEgPSBVMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfdjExID0gVjE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTExID0gWTE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotCi0gICAgICAgICAgICAvKiBTdG9yZSBsdW1pbmFuY2UgZGF0YSAqLwotICAgICAgICAgICAgcHU4X3luWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAwOwotICAgICAgICAgICAgcHU4X3luWzFdID0gKE00VklGSV9VSW50OClpMzJfeTEwOwotICAgICAgICAgICAgcHU4X3lzWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAxOwotICAgICAgICAgICAgcHU4X3lzWzFdID0gKE00VklGSV9VSW50OClpMzJfeTExOwotICAgICAgICAgICAgKnB1OF91ID0gKE00VklGSV9VSW50OCkoKGkzMl91MDAgKyBpMzJfdTAxICsgaTMyX3UxMCArIGkzMl91MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICpwdThfdiA9IChNNFZJRklfVUludDgpKChpMzJfdjAwICsgaTMyX3YwMSArIGkzMl92MTAgKyBpMzJfdjExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAvKiBQcmVwYXJlIGZvciBuZXh0IGNvbHVtbiAqLwotICAgICAgICAgICAgcHU4X3JnYm4gKz0gKENTVF9SR0JfMTZfU0laRTw8MSk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgY3VycmVudCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeW4gKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95cyArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIFUgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgLyogVXBkYXRlIFYgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF92ICsrOwotICAgICAgICB9IC8qIEVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgLyogUHJlcGFyZSBwb2ludGVycyBmb3IgdGhlIG5leHQgcm93ICovCi0gICAgICAgIHB1OF95X2RhdGEgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSArPSB1MzJfc3RyaWRlX1U7Ci0gICAgICAgIHB1OF92X2RhdGEgKz0gdTMyX3N0cmlkZV9WOwotICAgICAgICBwdThfcmdibl9kYXRhICs9IHUzMl9zdHJpZGVfMnJnYjsKLQotCi0gICAgfSAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0vKiBFbmQgb2YgZmlsZSBNNFZJRklfUkdCNTY1dG9ZVVY0MjAuYyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9BdWRpb01peGluZy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQXVkaW9NaXhpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmYwYmMwNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9BdWRpb01peGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nLmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGF1ZGlvIG1peGluZyBpbXBsZW1lbnRhdGlvbi4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9FcnJvckNvZGVzLmgiCi0KLS8qIFB1dCB0aGUgZGVmaW5pdGlvbiBvZiBzaWxlbmNlIGZyYW1lcyBoZXJlICovCi0jZGVmaW5lIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oIgotCi0vKioKLSAqIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKio8IE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JSZXNhbXBsZXIuaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFN0YXRpYyBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbiggTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKnBTZXR0aW5ncyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfQm9vbCBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCggTTRPU0FfSW50MzIgKmF2ZXJhZ2VWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHN0b3JlQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aHJlc2hvbGRWYWx1ZSApOwotLyoqCi0gKiAgICBJbnRlcm5hbCB3YXJuaW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWU1MzR1BQLCAweDAwMzApCi0KLS8qIEEgZGVmaW5lIHVzZWQgd2l0aCBTU1JDIDEuMDQgYW5kIGFib3ZlIHRvIGF2b2lkIHRha2luZwotYmxvY2tzIHNtYWxsZXIgdGhhdCB0aGUgbWluaW1hbCBibG9jayBzaXplICovCi0jZGVmaW5lIE00VlNTX1NTUkNfTUlOQkxPQ0tTSVpFICAgICAgICA2MDAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0KiBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiBwU2V0dGluZ3MpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgYXVkaW8gbWl4aW5nIHNldHRpbmdzCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKnBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBGaWxlV3JpdGVQdHJGY3QgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEM7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwU2V0dGluZ3M9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0OiBwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0OiBwRmlsZVJlYWRQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVdyaXRlUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcEZpbGVXcml0ZVB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggcFNldHRpbmdzLT51aUJlZ2luTG9vcCA+IHBTZXR0aW5ncy0+dWlFbmRMb29wICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQ6IEJlZ2luIGxvb3AgdGltZSBpcyBoaWdoZXIgdGhhbiBlbmQgbG9vcCB0aW1lISIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KLSAgICBwQyA9IChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQKLSAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCksCi0gICAgICAgIE00VlNTM0dQUCwoTTRPU0FfQ2hhciAqKSJNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQiKTsKLSAgICAqcENvbnRleHQgPSBwQzsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoKTogdW5hYmxlIHRvIGFsbG9jYXRlIFwKLSAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCxyZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgbWVtc2V0KCh2b2lkICopcEMgLDAsCi0gICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQpKTsKLSAgICAvKioKLSAgICAqIENvcHkgdGhpcyBzZXR0aW5nIGluIGNvbnRleHQgKi8KLSAgICBwQy0+aUFkZEN0cyA9IHBTZXR0aW5ncy0+dWlBZGRDdHM7Ci0gICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IHBTZXR0aW5ncy0+YlJlbW92ZU9yaWdpbmFsOwotICAgIHBDLT5iX0R1Y2tpbmdOZWVkZWVkID0gcFNldHRpbmdzLT5iX0R1Y2tpbmdOZWVkZWVkOwotICAgIHBDLT5JbkR1Y2tpbmdfdGhyZXNob2xkID0gcFNldHRpbmdzLT5JbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIHBDLT5mQlRWb2xMZXZlbCA9IHBTZXR0aW5ncy0+ZkJUVm9sTGV2ZWw7Ci0gICAgcEMtPmZQVFZvbExldmVsID0gcFNldHRpbmdzLT5mUFRWb2xMZXZlbDsKLSAgICBwQy0+SW5EdWNraW5nX2xvd1ZvbHVtZSA9IHBTZXR0aW5ncy0+SW5EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICBwQy0+YkRvRHVja2luZyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iTG9vcCA9IHBTZXR0aW5ncy0+Ykxvb3A7Ci0gICAgcEMtPmJOb0xvb3BpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+Ymp1bXBmbGFnID0gTTRPU0FfVFJVRTsKLSAgICAvKioKLSAgICAqIEluaXQgc29tZSBjb250ZXh0IHZhcmlhYmxlcyAqLwotCi0gICAgcEMtPnBJbnB1dENsaXBDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFkZGVkQ2xpcEN0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5mT3JpZ0ZhY3RvciA9IDEuMEY7Ci0gICAgcEMtPmZBZGRlZEZhY3RvciA9IDAuMEY7Ci0gICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iSGFzQXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEluaXQgUEMtPmV3YyBtZW1iZXJzICovCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgcEMtPmV3Yy5iVmlkZW9EYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9IDE7Ci0gICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5wQXVkaW9FbmNEU0kucEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEVuY0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucER1bW15QXVCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IE00T1NBX05VTEw7Ci0gICAgLyoqCi0gICAgKiBTZXQgdGhlIE9TQUwgZmlsZXN5c3RlbSBmdW5jdGlvbiBzZXQgKi8KLSAgICBwQy0+cE9zYUZpbGVSZWFkUHRyID0gcEZpbGVSZWFkUHRyRmN0OwotICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIgPSBwRmlsZVdyaXRlUHRyRmN0OwotCi0gICAgLyoqCi0gICAgKiBTc3JjIHN0dWZmICovCi0gICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5wU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVGVtcEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+U3NyY1NjcmF0Y2ggPSBNNE9TQV9OVUxMOwotICAgIHBDLT51aUJlZ2luTG9vcCA9IHBTZXR0aW5ncy0+dWlCZWdpbkxvb3A7Ci0gICAgcEMtPnVpRW5kTG9vcCA9IHBTZXR0aW5ncy0+dWlFbmRMb29wOwotCi0gICAgLyoKLSAgICAqIFJlc2V0IHBvaW50ZXJzIGZvciBtZWRpYSBhbmQgY29kZWNzIGludGVyZmFjZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKiAgQ2FsbCB0aGUgbWVkaWEgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24gbW9kdWxlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIE9wZW4gaW5wdXQgY2xpcCwgYWRkZWQgY2xpcCBhbmQgb3V0cHV0IGNsaXAgYW5kIHByb2NlZWQgd2l0aCB0aGUgc2V0dGluZ3MgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKHBDLCBwU2V0dGluZ3MpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgbWFpbiBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTzsKLSAgICBlbHNlCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOwotCi0gICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gPSAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICBDbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAvKmdJbnB1dFBhcmFtcy5sdkJUQ2hhbm5lbENvdW50Ki8KLSAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBMVkF1ZGlvUmVzYW1wbGVyQ3JlYXRlKDE2LAotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzLAotICAgICAgICAvKiBnSW5wdXRQYXJhbXMubHZPdXRTYW1wbGVSYXRlKi8oTTRPU0FfSW50MzIpcFNldHRpbmdzLT5vdXRwdXRBU0YsIDEpOwotICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cExWQXVkaW9SZXNhbXBsZXIgKQotICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgIH0KLSAgICAgICAgTFZBdWRpb3NldFNhbXBsZVJhdGUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLAotICAgICAgICAvKmdJbnB1dFBhcmFtcy5sdkluU2FtcGxlUmF0ZSovCi0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5KTsKLQotICAgIExWQXVkaW9zZXRWb2x1bWUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYpKDB4MTAwMCApLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYpKDB4MTAwMCApKTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBhdWRpbyBtaXhpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dCAgICAgICAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHBhcmFtICAgICBwUHJvZ3Jlc3MgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIGZpbmFsaXphdGlvbiBvcGVyYXRpb24KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgVlNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HOiBBdWRpbyBtaXhpbmcgaXMgb3ZlciwgdXNlciBzaG91bGQgbm93IGNhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAoIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFByb2dyZXNzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwKLSAgICAgICAgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBTdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyhwQyk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb21wdXRlIHRoZSBwcm9ncmVzcyBwZXJjZW50YWdlCi0gICAgICAgICAgICAqIE5vdGU6IGF1ZGlvIGFuZCB2aWRlbyBDVFMgYXJlIG5vdCBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgICAgICogdGhlIGNhbGwgb2YgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvICovCi0KLSAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogRmlyc3QgMC01MCUgc2VnbWVudCBpcyBkZWRpY2F0ZWQgdG8gc3RhdGUgOgotICAgICAgICAgICAgICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX1ZJREVPICovCi0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSg1MCAqIChwQy0+ZXdjLldyaXRlclZpZGVvQVUuQ1RTKQotICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlcmUgbWF5IGJlIG5vIGF1ZGlvIHRyYWNrIChSZW1vdmUgYXVkaW8gdHJhY2sgZmVhdHVyZSkuCi0gICAgICAgICAgICAqIEluIHRoYXQgY2FzZSB3ZSBkb3VibGUgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSAqLwotICAgICAgICAgICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gPT0gcEMtPmV3Yy5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoICpwUHJvZ3Jlc3MpIDw8PSAxOyAvKio8IHgyICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCAqcFByb2dyZXNzID49IDUwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0KLSAgICAgICAgICAgICAgICAgICAgNDk7IC8qKjwgVmlkZW8gcHJvY2Vzc2luZyBpcyBub3QgZ3JlYXRlciB0aGFuIDUwJSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+Ykhhc0F1ZGlvICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFZpZGVvIGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gYXVkaW8gYW5kIHJldHVybiBPSyAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmlBZGRDdHMgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogTm8gYXVkaW8sIHN0YXRlIHRyYW5zaXRpb24gdG8gRklOSVNIRUQgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDoKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgIT0gLXBDLT5wQWRkZWRDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgJiYgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgLSAwLjUpCi0gICAgICAgICAgICAgICAgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvID4gcEMtPnVpRW5kTG9vcAotICAgICAgICAgICAgICAgICYmIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBDLT5iTG9vcCA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+Yk5vTG9vcGluZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfSW50MzIganVtcENUUyA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbSwgJmp1bXBDVFMpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IGVycm9yIHdoZW4ganVtcGluZyBpbiBhZGRlZCBhdWRpbyBjbGlwOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVXNlIG9mZnNldCB0byBnaXZlIGEgY29ycmVjdCBDVFMgLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQW9mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5iUmVtb3ZlT3JpZ2luYWwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peChwQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZShwQyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb21wdXRlIHRoZSBwcm9ncmVzcyBwZXJjZW50YWdlCi0gICAgICAgICAgICAqIE5vdGU6IGF1ZGlvIGFuZCB2aWRlbyBDVFMgYXJlIG5vdCBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgICAgICogdGhlIGNhbGwgb2YgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvICovCi0gICAgICAgICAgICBpZiggMCAhPSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBTZWNvbmQgNTAtMTAwJSBzZWdtZW50IGlzIGRlZGljYXRlZCB0byBzdGF0ZXMgOgotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJTy4uLiAqLwotICAgICAgICAgICAgICAgIC8qIEZvciBBdWRpbyB0aGUgcHJvZ3Jlc3MgY29tcHV0YXRpb24gaXMgYmFzZWQgb24gZEF0byBhbmQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIGl0IGlzIG1vcmUgYWNjdXJhdGUgKi8KLSAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSg1MAotICAgICAgICAgICAgICAgICAgICArICg1MCAqIHBDLT5ld2MuZEFUbyAtIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aVZvZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgIC8gKHBDLT5ld2MuaU91dHB1dER1cmF0aW9uKSk7IC8qKjwgNTAgZm9yIDEwMC8yICoqLwotCi0gICAgICAgICAgICAgICAgaWYoICpwUHJvZ3Jlc3MgPj0gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgOTk7IC8qKjwgSXQncyBub3QgcmVhbGx5IGZpbmlzaGVkLCBJIHByZWZlciB0byByZXR1cm4gbGVzcyB0aGFuIDEwMCUgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDk5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXVkaW8gaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byBGSU5JU0hFRCAqLwotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpbyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfRklOSVNIRUQ6Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBQcm9ncmVzcyBwZXJjZW50YWdlOiBmaW5hbGl6ZSBmaW5pc2hlZCAtPiAxMDAlICovCi0gICAgICAgICAgICAqcFByb2dyZXNzID0gMTAwOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQXVkaW8gbWl4aW5nIGlzIGZpbmlzaGVkLCByZXR1cm4gY29ycmVjdCB3YXJuaW5nICovCi0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogU3RhdGUgZXJyb3IgKDB4JXgpISBSZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCggTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiBsYXN0Q1RTOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsCi0gICAgICAgIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENvbnRleHQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpOiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBwQ29udGV4dCBpc1wKLSAgICAgICAgICAgICBNNE9TQV9OVUxMLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBJbnB1dCAzR1BQIGZpbGUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cElucHV0Q2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBBZGRlZCAzR1BQIGZpbGUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEFkZGVkQ2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQWRkZWRDbGlwQ3R4dCk7Ci0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgM0dQIHdyaXRlci4gSW4gbm9ybWFsIHVzZSBjYXNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLAotICAgICAgYnV0IG5vdCBpbiBhYm9ydCB1c2UgY2FzZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgKQotICAgIHsKLSAgICAgICAgLyogVXBkYXRlIGxhc3QgVmlkZW8gQ1RTICovCi0gICAgICAgIGxhc3RDVFMgPSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uLCAmbGFzdENUUyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IFNldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlKAotICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4gdGhlIGVycm9yIGJlY2F1c2Ugd2UgaGF2ZSBvdGhlciB0aGluZ3MgdG8gZnJlZSEgKi8KLSAgICAgICAgfQotICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIEF1ZGlvIGVuY29kZXIgY29udGV4dCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc3NyYyBzdHVmZiAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPlNzcmNTY3JhdGNoICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPlNzcmNTY3JhdGNoKTsKLSAgICAgICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJJbiApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlckluKTsKLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAmJiAoTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDApICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBTc3JjQnVmZmVyT3V0KTsKLSAgICAgICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFRlbXBCdWZmZXIgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFRlbXBCdWZmZXIpOwotICAgICAgICBwQy0+cFRlbXBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChwQy0+cExWQXVkaW9SZXNhbXBsZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIExWRGVzdHJveShwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgICAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2hlbGxzIGludGVyZmFjZXMgKi8KLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycygmcEMtPlNoZWxsQVBJKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgY29udGV4dCAqLwotICAgIGZyZWUocENvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKiogICAgICAgICAgICAgICAgICBTVEFUSUMgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgYXVkaW8gbWl4aW5nIHNldHRpbmdzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dEFTRiA9IDA7Ci0gICAgTTRFTkNPREVSX0hlYWRlciAqZW5jSGVhZGVyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBTZXR0aW5ncz0weCV4IiwKLSAgICAgICAgcEMsIHBTZXR0aW5ncyk7Ci0KLSAgICAvKioKLSAgICAqIFRoZSBBZGQgVm9sdW1lIG11c3QgYmUgKHN0cmljdGx5KSBzdXBlcmlvciB0aGFuIHplcm8gKi8KLSAgICBpZiggcFNldHRpbmdzLT51aUFkZFZvbHVtZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogQWRkVm9sdW1lIGlzIHplcm8sXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQUREVk9MVU1FX0VRVUFMU19aRVJPIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTzsKLSAgICB9Ci0gICAgLyoKLSAgICBlbHNlIGlmKHBTZXR0aW5ncy0+dWlBZGRWb2x1bWUgPj0gMTAwKSAvLyBJZiB2b2x1bWUgaXMgc2V0IHRvIDEwMCwgbm8gbW9yZSBvcmlnaW5hbCBhdWRpbyAuLi4KLSAgICB7Ci0gICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgICovCi0gICAgLyoqCi0gICAgKiBCdWlsZCB0aGUgaW5wdXQgY2xpcCBzZXR0aW5ncyAqLwotICAgIHBDLT5JbnB1dENsaXBTZXR0aW5ncy5wRmlsZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+cE9yaWdpbmFsQ2xpcEZpbGU7IC8qKjwgSW5wdXQgM0dQUCBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MuRmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDsKLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MudWlCZWdpbkN1dFRpbWUgPQotICAgICAgICAwOyAvKio8IE5vIG5vdGlvbiBvZiBjdXQgZm9yIHRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSAqLwotICAgIHBDLT5JbnB1dENsaXBTZXR0aW5ncy51aUVuZEN1dFRpbWUgPQotICAgICAgICAwOyAvKio8IE5vIG5vdGlvbiBvZiBjdXQgZm9yIHRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSAqLwotCi0gICAgLyoqCi0gICAgKiBPcGVuIHRoZSBvcmlnaW5hbCBBdWRpby9WaWRlbyAzR1BQIGNsaXAgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEluaXQoJnBDLT5wSW5wdXRDbGlwQ3R4dCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q2xpcEluaXQob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBPcGVuKHBDLT5wSW5wdXRDbGlwQ3R4dCwgJnBDLT5JbnB1dENsaXBTZXR0aW5ncywKLSAgICAgICAgTTRPU0FfRkFMU0UsIE00T1NBX0ZBTFNFLCBNNE9TQV9UUlVFKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDbGlwT3BlbihvcmlnKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cElucHV0Q2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgICAgIHsKLSAgICAgICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICAvKioKLSAgICAqIElmIHRoZXJlIGlzIG5vIHZpZGVvLCBpdCdzIGFuIGVycm9yICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBubyB2aWRlbyBzdHJlYW0gaW4gY2xpcCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBjbGlwIHByb3BlcnRpZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcyhwQy0+cElucHV0Q2xpcEN0eHQsCi0gICAgICAgICZwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBCdWlsZCB0aGUgYWRkZWQgY2xpcCBzZXR0aW5ncyAqLwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5wRmlsZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+cEFkZGVkQXVkaW9UcmFja0ZpbGU7IC8qKjwgQWRkZWQgZmlsZSBkZXNjcmlwdG9yICovCi0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLkZpbGVUeXBlID0gcFNldHRpbmdzLT5BZGRlZEF1ZGlvRmlsZVR5cGU7Ci0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLnVpQmVnaW5DdXRUaW1lID0KLSAgICAgICAgMDsgLyoqPCBObyBub3Rpb24gb2YgY3V0IGZvciB0aGUgYXVkaW8gbWl4aW5nIGZlYXR1cmUgKi8KLSAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MudWlFbmRDdXRUaW1lICAgPSAwOy8qKjwgTm8gbm90aW9uIG9mIGN1dCBmb3IgdGhlIGF1ZGlvIG1peGluZyBmZWF0dXJlICovCi0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscz0KLSAgICAgICAgcFNldHRpbmdzLT51aU51bUNoYW5uZWxzOwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5PSAgICBwU2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+QWRkZWRDbGlwU2V0dGluZ3MucEZpbGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogT3BlbiB0aGUgYWRkZWQgQXVkaW8gY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEluaXQoJnBDLT5wQWRkZWRDbGlwQ3R4dCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENsaXBJbml0KGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBPcGVuKHBDLT5wQWRkZWRDbGlwQ3R4dCwgJnBDLT5BZGRlZENsaXBTZXR0aW5ncywKLSAgICAgICAgICAgIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENsaXBPcGVuKGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8sIGl0J3MgYW4gZXJyb3IgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBubyBhdWRpbyBub3IgdmlkZW8gc3RyZWFtIGluIGNsaXAsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSBjbGlwIHByb3BlcnRpZXMgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMocEMtPnBBZGRlZENsaXBDdHh0LAotICAgICAgICAgICAgJnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoYWRkZWQpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2goIHBTZXR0aW5ncy0+b3V0cHV0QVNGICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDE2MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMjA1MF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gMjIwNTA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSAyNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDMyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gNDQxMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSA0ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIHBhcmFtZXRlciBpbiBvdXRwdXQgQVNGICIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPmJSZW1vdmVPcmlnaW5hbCA9PSBNNE9TQV9UUlVFCi0gICAgICAgICAgICAmJiAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QMyB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa1BDTQotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICE9IG91dHB1dEFTRgotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMpICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dEFTRiA9IE00VklERU9FRElUSU5HX2s4MDAwX0FTRjsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gMzIwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDIwNDggKiBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICBvdXRwdXRBU0Y7Ci0KLSAgICAgICAgICAgIGlmKCBvdXRwdXRBU0YgIT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gY2FsbCBTU1JDIGluIG9yZGVyIHRvIGFsaWduIEFTRiBhbmQvb3IgbmIgb2YgY2hhbm5lbHMgKi8KLSAgICAgICAgICAgICAgICAvKiBNb3Jlb3ZlciwgYXVkaW8gZW5jb2RlciBtYXkgYmUgbmVlZGVkIGluIGNhc2Ugb2YgYXVkaW8gcmVwbGFjaW5nLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICA8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyB0byBNb25vICovCi0gICAgICAgICAgICAgICAgcEMtPkNoYW5uZWxDb252ZXJzaW9uID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscwotICAgICAgICAgICAgICAgID4gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogTW9ubyB0byBTdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPSAyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzID0KLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBjb21wYXRpYmlsaXR5IGNoYXJ0ICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkocEMsCi0gICAgICAgICAgICAmcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgJnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgbG9vcCBwYXJhbWV0ZXJzICovCi0gICAgICAgIGlmKCBwQy0+dWlCZWdpbkxvb3AgPiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgYmVnaW4gbG9vcCB0aW1lIGlzIGhpZ2hlciB0aGFuIGFkZGVkIGNsaXAgYXVkaW8gZHVyYXRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0JFR0lOTE9PUF9ISUdIRVJfRU5ETE9PUDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIE9rLCBsZXQncyBnbyB3aXRoIHRoaXMgYXVkaW8gdHJhY2sgKi8KLSAgICAgICAgcEMtPmJIYXNBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5vIGFkZGVkIGZpbGUsIGZvcmNlIHJlbW92ZSBvcmlnaW5hbCAqLwotICAgICAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MuRmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQ7Ci0gICAgICAgIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9UUlVFOwotICAgICAgICBwQy0+Ykhhc0F1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSB2aWRlbyBwcm9wZXJ0aWVzIG9mIHRoZSBpbnB1dCBjbGlwIHRvIHRoZSBvdXRwdXQgcHJvcGVydGllcyAqLwotICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoOwotICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0OwotICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgIHBDLT5ld2MuYlZpZGVvRGF0YVBhcnRpdGlvbmluZyA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iTVBFRzRkYXRhUGFydGl0aW9uOwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlOwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvTGV2ZWw7Ci0gICAgc3dpdGNoKCBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tIMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tNUEVHXzQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBBZGQgYSBsaW5rIHRvIHZpZGVvIGRzaSAqLwotICAgIGlmKCBNNFNZU19rSDI2NCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSApCi0gICAgewotCi0gICAgICAgIC8qIEZvciBILjI2NCBlbmNvZGVyIGNhc2UKLSAgICAgICAgKiBGZXRjaCB0aGUgRFNJIGZyb20gdGhlIHNoZWxsIHZpZGVvIGVuY29kZXIsIGFuZCBmZWVkIGl0IHRvIHRoZSB3cml0ZXIgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogZ2V0IERTSSBmb3IgSDI2NCBzdHJlYW0iKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IHBDLT5ld2MucEVuY0NvbnRleHQgaXMgTlVMTCIpOwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQsIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogZW5jSGVhZGVyLT5wQnVmPTB4JXgsIHNpemU9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVuY0hlYWRlci0+cEJ1ZiwgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IHNlbmQgRFNJIGZvciBIMjY0IHN0cmVhbSB0byAzR1Agd3JpdGVyIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBuZXcgRFNJICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGVuY0hlYWRlci0+U2l6ZSwgTTRWU1MzR1BQLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQy0+ZXdjLnBWaWRlb091dHB1dERzaSAoSDI2NCkiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFZpZGVvT3V0cHV0RHNpIChIMjY0KSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IChNNE9TQV9VSW50MTYpZW5jSGVhZGVyLT5TaXplOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLCAodm9pZCAqKWVuY0hlYWRlci0+cEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlciByZXR1cm5lZCBlcnJvciAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBwQy0+ZXdjLnBFbmNDb250ZXh0IGlzIE5VTEwsIGNhbm5vdCBnZXQgdGhlIERTSSIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGlucHV0IGNsaXAgdmlkZW8gc3RyZWFtIHR5cGUgPSAweCV4IiwKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBhdWRpbyBwcm9wZXJ0aWVzIG9mIHRoZSBhZGRlZCBjbGlwIHRvIHRoZSBvdXRwdXQgcHJvcGVydGllcyAqLwotICAgIGlmKCBwQy0+Ykhhc0F1ZGlvICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+YlJlbW92ZU9yaWdpbmFsID09IE00T1NBX1RSVUUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgIC8qIGlmIG91dHB1dCBzZXR0aW5ncyBhcmUgZGlmZmVyZW50cyBmcm9tIGFkZGVkIGNsaXAgc2V0dGluZ3MsCi0gICAgICAgICAgICB3ZSBuZWVkIHRvIHJlZW5jb2RlIEJHTSAqLwotICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gb3V0cHV0QVNGCi0gICAgICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscwotICAgICAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogU2V0IHJlYWRlciBEU0kgdG8gTlVMTCAodW5rbm93biksIHdlIHdpbGwgdXNlIGVuY29kZXIgRFNJIGxhdGVyICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4OwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPSAxMjIwMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gODAwMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0gMzIwOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBQUMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNDhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLnVpTmJDaGFubmVscyA9PSAyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYml0cmF0ZSBoYXZlIHRvIGJlIGRvdWJsZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlICs9IHBDLT5ld2MudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0gcFNldHRpbmdzLT5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPT0gMSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05POwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAxMDI0OyAvKiBBQUMgaXMgYWx3YXlzIDEwMjQvRnJlcSBzYW1wbGUgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAxNjA7IC8qIEVWUkMgZnJhbWVzIGFyZSAyMCBtcyBhdCA4MDAwIEh6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWtlcyBpdCBlYXNpZXIgdG8gZmFjdG9yaXplIGFtciBhbmQgZXZyYyBjb2RlKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUENNOgotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHJlYWRlciBEU0kgdG8gTlVMTCAodW5rbm93biksIHdlIHdpbGwgdXNlIGVuY29kZXIgRFNJIGxhdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDgwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxMl8yX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05POwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0OyAvKiBBQUMgaXMgYWx3YXlzIDEwMjQvRnJlcSBzYW1wbGUgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEFkZCBhIGxpbmsgdG8gYXVkaW8gZHNpICovCi0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSAoTTRPU0FfTWVtQWRkcjgpcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBQUM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBObyBhdWRpbyB0cmFjayBpbiBpbnB1dCBmaWxlLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBBZGQgYSBsaW5rIHRvIGF1ZGlvIGRzaSAqLwotICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQy0+cElucHV0Q2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IGNvbW1vbiAnc2lsZW5jZSBmcmFtZSBzdHVmZicgdG8gQ2xpcENvbnRleHQgKi8KLSAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnVpU2lsZW5jZVBjbVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZVBjbVNpemU7Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YSA9IHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT51aVNpbGVuY2VGcmFtZVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgIC1wQy0+cElucHV0Q2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsgLyogUmVzZXQgdGltZSAqLwotCi0gICAgLyoqCi0gICAgKiBDb3B5IGNvbW1vbiAnc2lsZW5jZSBmcmFtZSBzdHVmZicgdG8gQ2xpcENvbnRleHQgKi8KLSAgICBpZiggcEMtPmJIYXNBdWRpbyApCi0gICAgewotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpU2lsZW5jZVBjbVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZVBjbVNpemU7Ci0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEgPSBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpU2lsZW5jZUZyYW1lU2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbyA9IHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAtcEMtPnBBZGRlZENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qIFJlc2V0IHRpbWUgKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIEFkZEN0cyBpcyBsb3dlciB0aGFuIG9yaWdpbmFsIGNsaXAgZHVyYXRpb24gKi8KLSAgICBpZiggKCBNNE9TQV9OVUxMICE9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtKQotICAgICAgICAmJiAocEMtPmlBZGRDdHMgPiAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IHVpQWRkQ3RzIGlzIGxhcmdlciB0aGFuIHZpZGVvIGR1cmF0aW9uLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTiIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BRERDVFNfSElHSEVSX1RIQU5fVklERU9fRFVSQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB0aGUgYXVkaW8gdHJhY2tzIGFyZSBub3QgY29tcGF0aWJsZSwgcmVwbGFjZSBpbnB1dCB0cmFjayBieSBzaWxlbmNlICovCi0gICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBhdWRpbyBtaXhpbmcgaXMgcmVxdWlyZWQgKi8KLSAgICBpZiggKCAoIHBDLT5iSGFzQXVkaW8pICYmIChNNE9TQV9GQUxTRQotICAgICAgICA9PSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNFZGl0YWJsZSkpCi0gICAgICAgIHx8IChNNE9TQV9UUlVFID09IHBDLT5iUmVtb3ZlT3JpZ2luYWwpICkgLyp8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwU2V0dGluZ3MtPnVpQWRkVm9sdW1lID49IDEwMCkpICovCi0gICAgewotICAgICAgICBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIG91dHB1dCBhdWRpbyBjYW4gc3VwcG9ydCBzaWxlbmNlIGZyYW1lcwotICAgIFRyaWNrIGkgdXNlIGJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwIGZpbGVkIHRvIHN0b3JlIHRoYXQgICovCi0gICAgaWYoIHBDLT5iSGFzQXVkaW8gKQotICAgIHsKLSAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwOwotCi0gICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5pQWRkQ3RzID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICBpQWRkQ3RzIHNob3VsZCBiZSBzZXQgdG8gMCB3aXRoIHRoaXMgYXVkaW8gdHJhY2sgISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0ZFQVRVUkVfVU5TVVBQT1JURURfV0lUSF9BVURJT19UUkFDSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIDAgPCBwQy0+dWlFbmRMb29wICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgIHVpRW5kTG9vcCBzaG91bGQgYmUgc2V0IHRvIDAgd2l0aCB0aGlzIGF1ZGlvIHRyYWNrICEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9GRUFUVVJFX1VOU1VQUE9SVEVEX1dJVEhfQVVESU9fVFJBQ0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoIHBDLT5iX0R1Y2tpbmdOZWVkZWVkID09IE00T1NBX0ZBTFNFKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgZmFjdG9yIHRvIGFwcGx5IHRvIHNhbXBsZSB0byBkbyB0aGUgbWl4aW5nICovCi0gICAgICAgIHBDLT5mQWRkZWRGYWN0b3IgPSAwLjUwRjsKLSAgICAgICAgcEMtPmZPcmlnRmFjdG9yID0gMC41MEY7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIFNTUkMgaXMgbmVlZGVkICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgbnVtZXJhdG9yLCBkZW5vbWluYXRvciwgcmF0aW8sIHJhdGlvQnVmZmVyOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEluaXQgdGhlIFNTUkMgbW9kdWxlICovCi0gICAgICAgIFNTUkNfUmV0dXJuU3RhdHVzX2VuCi0gICAgICAgICAgICBSZXR1cm5TdGF0dXM7IC8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIExWTV9JTlQxNiBOclNhbXBsZXNNaW4gPQotICAgICAgICAgICAgMDsgLyogTWluaW1hbCBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgaW5wdXQgb3Igb24gdGhlIG91dHB1dCAqLwotICAgICAgICBMVk1fSU5UMzIKLSAgICAgICAgICAgIFNjcmF0Y2hTaXplOyAvKiBUaGUgc2l6ZSBvZiB0aGUgc2NyYXRjaCBtZW1vcnkgICAgICAgICAgICAgICAqLwotICAgICAgICBMVk1fSU5UMTYKLSAgICAgICAgICAgICpwSW5wdXRJblNjcmF0Y2g7IC8qIFBvaW50ZXIgdG8gaW5wdXQgaW4gdGhlIHNjcmF0Y2ggYnVmZmVyICAgICAgICovCi0gICAgICAgIExWTV9JTlQxNgotICAgICAgICAgICAgKgotICAgICAgICAgICAgcE91dHB1dEluU2NyYXRjaDsgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGluIHRoZSBzY3JhdGNoIGJ1ZmZlciAgKi8KLSAgICAgICAgU1NSQ19QYXJhbXNfdCBzc3JjUGFyYW1zOyAgICAgICAgICAvKiBNZW1vcnkgZm9yIGluaXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBzd2l0Y2goIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzgwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzExMDI1OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEyMDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18xMjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzIyMDUwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18yNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzQ0MTAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU180ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGludmFsaWQgYWRkZWQgY2xpcCBzYW1wbGluZyBmcmVxdWVuY3kgKCVkIEh6KSxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfQURERURfQVVESU9fU1RSRUFNOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIDEgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fTU9OTzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fU1RFUkVPOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKCBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU184MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzI0MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU180NDEwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogaW52YWxpZCBvdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICglZCBIeiksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQiLAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBSZXR1cm5TdGF0dXMgPSAwOwotCi0gICAgICAgIHN3aXRjaCAoc3NyY1BhcmFtcy5TU1JDX0ZzX0luKXsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAzMjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID00NDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gICAgNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzE2MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9ICAgIDY0MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18yMjA1MDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAgICA4ODI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMjQwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gICAgOTYwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzMyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9IDEyODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfNDQxMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMTc2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU180ODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBSZXR1cm5TdGF0dXMgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzc3JjUGFyYW1zLlNTUkNfRnNfT3V0KXsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAzMjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9NDQxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzEyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQ9ICAgIDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18xNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAgICA2NDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dD0gICAgODgyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzI0MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQ9ICAgIDk2MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18zMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMTI4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU180NDEwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAxNzY0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBSZXR1cm5TdGF0dXMgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKCBSZXR1cm5TdGF0dXMgIT0gU1NSQ19PSyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOlwKLSAgICAgICAgICAgICAgICBFcnJvciBjb2RlICVkIHJldHVybmVkIGJ5IHRoZSBTU1JDX0dldE5yU2FtcGxlcyBmdW5jdGlvbiIsCi0gICAgICAgICAgICAgICAgUmV0dXJuU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDsKLSAgICAgICAgfQotCi0gICAgICAgIE5yU2FtcGxlc01pbiA9Ci0gICAgICAgICAgICAoTFZNX0lOVDE2KSgoc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA+IHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0KQotICAgICAgICAgICAgPyBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA6IHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4pOwotCi0gICAgICAgIHdoaWxlKCBOclNhbXBsZXNNaW4gPCBNNFZTU19TU1JDX01JTkJMT0NLU0laRSApCi0gICAgICAgIHsgLyogRG9uJ3QgdGFrZSBibG9ja3Mgc21hbGxlciB0aGF0IHRoZSBtaW5pbWFsIGJsb2NrIHNpemUgKi8KLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc0luIDw8IDEpOwotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA8PCAxKTsKLSAgICAgICAgICAgIE5yU2FtcGxlc01pbiA9IChMVk1fSU5UMTYpKE5yU2FtcGxlc01pbiA8PCAxKTsKLSAgICAgICAgfQotICAgICAgICBwQy0+aVNzcmNOYlNhbXBsSW4gPSAoTFZNX0lOVDE2KSgKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuCi0gICAgICAgICAgICBOclNhbXBsZXNJbik7IC8qIG11bHRpcGxpY2F0aW9uIGJ5IE5yT2ZDaGFubmVscyBpcyBkb25lIGJlbG93ICovCi0gICAgICAgIHBDLT5pU3NyY05iU2FtcGxPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCk7Ci0KLSAgICAgICAgbnVtZXJhdG9yID0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgIGRlbm9taW5hdG9yID0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAqIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgaWYoIG51bWVyYXRvciAlIGRlbm9taW5hdG9yID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByYXRpb0J1ZmZlciA9IChNNE9TQV9VSW50MzIpKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJhdGlvQnVmZmVyID0gKE00T1NBX1VJbnQzMikobnVtZXJhdG9yIC8gZGVub21pbmF0b3IpICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJhdGlvID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICogcmF0aW9CdWZmZXIpIC8gKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgaWYoIHJhdGlvID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IHRoZSBpbnB1dCBzaXplIG9mIFNTUkMgYnVmZmVySW4gaXMgYmlnZ2VyIHRoYW4gdGhlIGFza2VkIGJ1ZmZlciAqLwotICAgICAgICAgICAgcEMtPm1pbmltdW1CdWZmZXJJbiA9IHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByYXRpbysrOyAvKiBXZSB1c2UgdGhlIGltbWVkaWF0ZSBzdXBlcmlvciBpbnRlZ2VyICovCi0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gcmF0aW8gKiAocEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBpbnB1dCBvZiB0aGUgU1NSQyAqLwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJJbiA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5taW5pbXVtQnVmZmVySW4KLSAgICAgICAgICAgICsgcEMtPnBBZGRlZENsaXBDdHh0LT4KLSAgICAgICAgICAgIEF1ZGlvRGVjQnVmZmVyT3V0LgotICAgICAgICAgICAgbV9idWZmZXJTaXplLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlckluIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbiwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgLyogVGhlICIzIiB2YWx1ZSBiZWxvdyBzaG91bGQgYmUgb3B0aW1pemVkIC4uLiBvbmUgZGF5IC4uLiAqLwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzICogcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICogcEMtPmV3Yy51aU5iQ2hhbm5lbHMsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJPdXQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXIgbmVlZGVkIGluIGNhc2Ugb2YgY2hhbm5lbCBjb252ZXJzaW9uICovCi0gICAgICAgIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlICIzIiB2YWx1ZSBiZWxvdyBzaG91bGQgYmUgb3B0aW1pemVkIC4uLiBvbmUgZGF5IC4uLiAqLwotICAgICAgICAgICAgcEMtPnBUZW1wQnVmZmVyID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMgKiBwQy0+aVNzcmNOYlNhbXBsT3V0Ci0gICAgICAgICAgICAgICAgKiBzaXplb2Yoc2hvcnQpICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscywgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlck91dCIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFRlbXBCdWZmZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBUZW1wQnVmZmVyLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cFBvc0luVGVtcEJ1ZmZlciA9IHBDLT5wVGVtcEJ1ZmZlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICB7Ci0gICAgICAgIHBDLT5taW5pbXVtQnVmZmVySW4gPQotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bWluaW11bUJ1ZmZlckluCi0gICAgICAgICAgICArIHBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dC4KLSAgICAgICAgICAgIG1fYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJJbiIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlckluICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogXAotICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwU3NyY0J1ZmZlckluLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluID0gKE00T1NBX01lbUFkZHI4KXBDLT5wU3NyY0J1ZmZlckluOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIG91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgICAgICAvKiBUaGUgIjMiIHZhbHVlIGJlbG93IHNob3VsZCBiZSBvcHRpbWl6ZWQgLi4uIG9uZSBkYXkgLi4uICovCi0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJPdXQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgIH0KLSAgICBlbHNlIGlmKCAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVAzKXx8Ci0gICAgICAgICAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rUENNKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBtaW5idWZmZXIgPSAwOwotCi0gICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBQUMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gMjA0OCAqIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotICAgICAgICAgICAgbWluYnVmZmVyID0gcEMtPm1pbmltdW1CdWZmZXJJbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gMzIwOwotCi0gICAgICAgICAgICBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgPiAzMjAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1pbmJ1ZmZlciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1pbmJ1ZmZlciA9IHBDLT5taW5pbXVtQnVmZmVySW47IC8qIE5vdCByZWFsbHkgcG9zc2libGUgLi4uKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJCYWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCwgaW4gY2FzZSBvZiBNUDMgcmVwbGFjaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygyICogbWluYnVmZmVyLCBNNFZTUzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlckluIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbixcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IHBDLT5wUG9zSW5Tc3JjQnVmZmVySW47Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IHBDLT5wU3NyY0J1ZmZlckluOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgYXVkaW8gZW5jb2RlciBpcyBuZWVkZWQgdG8gZG8gYXVkaW8gbWl4aW5nIG9yIGF1ZGlvIHJlc2FtcGxpbmcgKi8KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgfHwgTTRWSURFT0VESVRJTkdfa1BDTQotICAgICAgICA9PSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgIHx8IE00VklERU9FRElUSU5HX2tNUDMKLSAgICAgICAgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgIT0gb3V0cHV0QVNGCi0gICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMKLSAgICAgICAgIT0gcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXQgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcigmcEMtPmV3YywgJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSW4gY2FzZSBvZiBQQ00sIE1QMyBvciBhdWRpbyByZXBsYWNlIHdpdGggcmVlbmNvZGluZywgdXNlIGVuY29kZXIgRFNJICovCi0gICAgICAgIGlmKCBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID09IDAgJiYgKE00VklERU9FRElUSU5HX2tQQ00KLSAgICAgICAgICAgID09IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgIHx8IE00VklERU9FRElUSU5HX2tNUDMgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gb3V0cHV0QVNGCi0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscykgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5ld2MucEF1ZGlvRW5jRFNJLmluZm9TaXplOwotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSBwQy0+ZXdjLnBBdWRpb0VuY0RTSS5wSW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdCB0aGUgb3V0cHV0IDNHUFAgZmlsZSAqLwotICAgIC8qMTEvMTIvMjAwOCBDUjMyODMgYWRkIHRoZSBtYXggb3V0cHV0IGZpbGUgc2l6ZSBmb3IgdGhlIE1NUyB1c2UgY2FzZSBpbiBWaWRlb0FydGlzdCovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLCBwU2V0dGluZ3MtPnBPdXRwdXRDbGlwRmlsZSwKLSAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwgMCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKCkKLSAqIEBicmllZiAgICBXcml0ZSBhbiBhdWRpbyBzaWxlbmNlIGZyYW1lIGludG8gdGhlIHdyaXRlcgotICogQG5vdGUgICAgTWFpbmx5IHVzZWQgd2hlbiBwYWRkaW5nIHdpdGggc2lsZW5jZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlOlwKLSAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8wKCJBICMjIyMgc2lsZW5jZSBBVSIpOwotCi0gICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAodm9pZCAqKXBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEsIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplKTsKLQotICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgIChNNE9TQV9UaW1lKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJCIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8pLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2U6XAotICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHNpbGVuY2UpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmRBVG8gKz0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyhNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgdmlkZW8uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MTYgb2Zmc2V0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIiAgVklERU8gc3RlcCA6IGRWVG8gPSAlZiAgc3RhdGUgPSAlZCAgb2Zmc2V0ID0gJWxkIiwKLSAgICAgICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzLCBwQy0+U3RhdGUsIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aVZvZmZzZXQpOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIHRoZSBpbnB1dCB2aWRlbyBBVSAqLwotICAgIGVyciA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0sCi0gICAgICAgICZwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbygpOiBtX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICVsZCBbIDB4JXggXSIsCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX0NUUywgcEMtPnBJbnB1dENsaXBDdHh0LT5pVm9mZnNldCwKLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSk7Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgb2Zmc2V0ID0gMDsKLSAgICAvKiBmb3IgaC4yNjQgc3RyZWFtIGRvIG5vdCByZWFkIHRoZSAxc3QgNCBieXRlcyBhcyB0aGV5IGFyZSBoZWFkZXIgaW5kaWNhdG9ycyAqLwotICAgIGlmKCBwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlCi0gICAgICAgID09IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKCk6IGlucHV0IHN0cmVhbSB0eXBlIEgyNjQiKTsKLSAgICAgICAgb2Zmc2V0ID0gNDsKLSAgICB9Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSAgLT0gIG9mZnNldDsKLSAgICAvKioKLSAgICAqIENoZWNrIHRoYXQgdGhlIHZpZGVvIEFVIGlzIG5vdCBsYXJnZXIgdGhhbiBleHBlY3RlZCAqLwotICAgIGlmKCBwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9zaXplID4gcEMtPmV3Yy51aVZpZGVvTWF4QXVTaXplICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbzogQVUgc2l6ZSBncmVhdGVyIHRoYW4gTWF4QXVTaXplICglZD4lZCkhXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFIiwKLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemUsIHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSk7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvcHkgdGhlIGlucHV0IEFVIHBheWxvYWQgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgKHZvaWQgKikocEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fZGF0YUFkZHJlc3MgKyBvZmZzZXQpLAotICAgICAgICAocEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSkpOwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBpbnB1dCBBVSBwYXJhbWV0ZXJzIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUyA9Ci0gICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX0NUUyArIDAuNSk7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX2F0dHJpYnV0ZTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgTTRPU0FfVFJBQ0UyXzIoIkQgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbHUgWyAweCV4IF0iLAotICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuQ1RTLCBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW86IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgYXVkaW8uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCIgIEFVRElPIG1peCAgOiBkQVRvID0gJWYgIHN0YXRlID0gJWQgIG9mZnNldCA9ICVsZCIsCi0gICAgICAgIHBDLT5ld2MuZEFUbywgcEMtPlN0YXRlLCBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0KTsKLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgQWRkQ3RzICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+aUFkZEN0cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBGaXJzdCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gc2Vjb25kIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1NFQ09ORF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zaXRpb24gZnJvbSByZWFkaW5nIHN0YXRlIHRvIGVuY29kaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IgKDEtPjIpIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgKSAvKio8IE1peCAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCB0aGUgYWRkZWQgYXVkaW8gQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgfHwgcEMtPmJfU1NSQ25lZWRlZCA9PSBNNE9TQV9UUlVFCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIGNhc2Ugb2Ygc2FtcGxpbmcgZnJlcSBjb252ZXJzaW9uIGFuZC9vciBjaGFubmVsIGNvbnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVhZCBuZXh0IEFVIHdpbGwgYmUgICAgY2FsbGVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkUgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpRW5kTG9vcCA+IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSnVtcCBhdCB0aGUgQmVnaW4gbG9vcCB0aW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zaXRpb24gZnJvbSBlbmNvZGluZyBzdGF0ZSB0byByZWFkaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNlY29uZCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhpcmQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykgYSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCB0aGUgb3JpZ2luYWwgYXVkaW8gQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiRiAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUFvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5iX1NTUkNuZWVkZWQgPT0gTTRPU0FfRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUGVyZm9ybSB0aGUgYXVkaW8gbWl4aW5nICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKHBDKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8qKjwgTm8gbWl4LCBqdXN0IGNvcHkgYWRkZWQgYXVkaW8gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZChwQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIERlY2lkZSB3aGF0IHRvIGRvIHdoZW4gYXVkaW8gaXMgb3ZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICdCWlpaJyBidWcgZml4OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZShwQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgYXVkaW8gZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAobG9vcCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2l0aW9uIHRvIGJlZ2luIGN1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1lbmNvZGUgZmFpbHMgZXJyID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU2Vjb25kIHNlZ21lbnQgaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byB0aGlyZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykgYiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygyKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogVmlkZW8gZHVyYXRpb24gcmVhY2hlZCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsgLyoqPCBTaW11bGF0ZSBlbmQgb2YgZmlsZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZyhwQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKDMpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdmlkZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy5kQVRvID49IHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvIGR1cmF0aW9uIHJlYWNoZWQsIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOyAvKio8IFNpbXVsYXRlIGVuZCBvZiBmaWxlIGVycm9yICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBhdWRpby4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCIgIEFVRElPIHJlcGwgOiBkQVRvID0gJWYgIHN0YXRlID0gJWQgIG9mZnNldCA9ICVsZCIsCi0gICAgICAgIHBDLT5ld2MuZEFUbywgcEMtPlN0YXRlLCBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0KTsKLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVwbGFjZSB0aGUgU0lEIChzaWxlbmNlKSBwYXlsb2FkIGluIHRoZSB3cml0ZXIgQVUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIEFkZEN0cyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLmRBVG8gPj0gcEMtPmlBZGRDdHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRmlyc3Qgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHNlY29uZCBhbmQgcmV0dXJuIE9LICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKDEtPjIpIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpRW5kTG9vcCA+IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSnVtcCBhdCB0aGUgQmVnaW4gbG9vcCB0aW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwgJnRpbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RKdW1wKGF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqICdCWlpaJyBidWcgZml4OgotICAgICAgICAgICAgICAgICAgICAgICAgKiBhZGQgYSBzaWxlbmNlIGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBhdWRpbyBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAobG9vcCkiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFNlY29uZCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhpcmQgYW5kIHJldHVybiBPSyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSB0aGlyZCBzZWdtZW50IChzaWxlbmNlKSBpcyBvbmx5IGRvbmUgaWYgc3VwcG9ydGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgKiBJbiBvdGhlciBjYXNlLCB3ZSBmaW5pc2ggaGVyZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SICgyLT5GKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKDIpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjbGlwICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6IENsaXAgZHVyYXRpb24gcmVhY2hlZCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsgLyoqPCBTaW11bGF0ZSBlbmQgb2YgZmlsZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlcGxhY2UgdGhlIFNJRCAoc2lsZW5jZSkgcGF5bG9hZCBpbiB0aGUgd3JpdGVyIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW8gZHVyYXRpb24gcmVhY2hlZCwgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7IC8qKjwgU2ltdWxhdGUgZW5kIG9mIGZpbGUgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBSZWFkIG9uZSBBVSBmcm9tIHRoZSBvcmlnaW5hbCBhdWRpbyBmaWxlIGFuZCB3cml0ZSBpdCB0byB0aGUgb3V0cHV0Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogUmVhZCB0aGUgaW5wdXQgb3JpZ2luYWwgYXVkaW8gQVUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cElucHV0Q2xpcEN0eHQpOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIkcgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cElucHV0Q2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0IC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygpOiBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZzogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSB0aGUgaW5wdXQgQVUgcHJvcGVydGllcyB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwQy0+cElucHV0Q2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0OwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBBVSBpdHNlbGYgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICh2b2lkICopcEMtPnBJbnB1dENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciwgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICBNNE9TQV9UUkFDRTJfMigiSCAtLS0tIHdyaXRlIDogY3RzICA9ICVsZCBbIDB4JXggXSIsCi0gICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyAvIHBDLT5ld2Muc2NhbGVfYXVkaW8pLAotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZzogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbmNyZW1lbnQgdGhlIGF1ZGlvIENUUyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5ld2MuZEFUbyArPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFJlYWQgb25lIEFVIGZyb20gdGhlIGFkZGVkIGF1ZGlvIGZpbGUgYW5kIHdyaXRlIGl0IHRvIHRoZSBvdXRwdXQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGlmKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyB8fAotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tQQ00gfHwKLSAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9PSBNNE9TQV9UUlVFIHx8Ci0gICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDApCi0gICAgewotICAgICAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY0luQnVmZmVyOyAvKio8IEVuY29kZXIgaW5wdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyCi0gICAgICAgICAgICBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgICAgIE00T1NBX1RpbWUKLSAgICAgICAgICAgIGZyYW1lVGltZURlbHRhOyAvKio8IER1cmF0aW9uIG9mIHRoZSBlbmNvZGVkICh0aGVuIHdyaXR0ZW4pIGRhdGEgKi8KLSAgICAgICAgTTRPU0FfTWVtQWRkcjggdGVtcFBvc0J1ZmZlcjsKLQotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KHBDKTsKLQotICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZDpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCBlbmQgb2YgYWRkZWQgZmlsZSIpOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0IHJldHVybmVkIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPSBwQy0+cFNzcmNCdWZmZXJPdXQ7Ci0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICBmcmFtZVRpbWVEZWx0YSA9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiSyAqKioqIGJsZW5kIEFVcyIpOwotICAgICAgICAvKioKLSAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQsICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoKTpcCi0gICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0KLSAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIuCi0gICAgICAgICAgICBwVGFibGVCdWZmZXJTaXplWzBdOyAvKio8IEdldCB0aGUgc2l6ZSBvZiBlbmNvZGVkIGRhdGEgKi8KLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgICAgICAvKiBVcGRhdGUgZGVjb2RlZCBidWZmZXIgaGVyZSAqLwotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgKyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJPdXQsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLT0KLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJJbiArIHBDLT5taW5pbXVtQnVmZmVySW47Ci0gICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09IHBDLT5taW5pbXVtQnVmZmVySW47Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkogLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgcEMtPmV3Yy5kQVRvICs9IGZyYW1lVGltZURlbHRhIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVhZCB0aGUgYWRkZWQgYXVkaW8gQVUgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMygiSSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKCk6IG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHByb3BlcnRpZXMgdG8gdGhlIG91dHB1dCBBVSAqLwotCi0gICAgICAgIC8qKiBUSEUgQ0hFQ0sgQkVMT1cgSVMgQURERUQgVE8gUFJFVkVOVCBJU1NVRVMgTElOS0VEIFRPIFBSRS1BTExPQ0FURUQgTUFYIEFVIFNJWkUKLSAgICAgICAgbWF4IEFVIHNpemUgaXMgc2V0IGJhc2VkIG9uIE00VlNTM0dQUF9BVURJT19NQVhfQVVfU0laRSBkZWZpbmVkIGluIGZpbGUKLSAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgsIElmIHRoaXMgZXJyb3Igb2NjdXJzIGluY3JlYXNlIHRoZSBsaW1pdCBzZXQgaW4gdGhpcyBmaWxlCi0gICAgICAgICovCi0gICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPiBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICJFUlJPUjogYXVkaW8gQVUgc2l6ZSAoJWQpIHRvIGNvcHkgbGFyZ2VyIHRoYW4gYWxsb2NhdGVkIG9uZSAoJWQpID0+IGFib3J0IiwKLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIlBMRUFTRSBDT05UQUNUIFNVUFBPUlQgVE8gRVhURU5EIE1BWCBBVSBTSVpFIElOIFRIRSBQUk9EVUNUIExJQlJBUlkiKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEU7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvcHkgdGhlIEFVIGl0c2VsZiAqLwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIsIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkogLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgcEMtPmV3Yy5kQVRvICs9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIENvbnZlcnQgUENNIG9mIGFkZGVkIHRyYWNrIHRvIHRoZSByaWdodCBBU0YgLyBuYiBvZiBDaGFubmVscwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBpbnQgc3NyY0VycjsgLyoqPCBFcnJvciB3aGlsZSBzc3JjIHByb2Nlc3NpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICBNNE9TQV9NZW1BZGRyOCB0ZW1wUG9zQnVmZmVyOwotCi0gICAgTTRPU0FfVUludDMyIG91dEZyYW1lQ291bnQgPSB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXM7Ci0gICAgLyogRG8gd2UgbmVlZCB0byBmZWVkIFNTUkMgYnVmZmVyIEluID8gKi8KLSAgICAvKioKLSAgICAqIFJDOiBUaGlzIGlzIG5vdCByZWFsbHkgb3B0aW11bSAobWVtbW92ZSkuIFdlIHNob3VsZCBoYW5kbGUgdGhpcyB3aXRoIGxpbmtlZCBsaXN0LiAqLwotICAgIHdoaWxlKCBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gcEMtPnBTc3JjQnVmZmVySW4gPCAoTTRPU0FfSW50MzIpcEMtPm1pbmltdW1CdWZmZXJJbiApCi0gICAgewotICAgICAgICAvKiBXZSBuZWVkIHRvIGdldCBtb3JlIFBDTSBkYXRhICovCi0gICAgICAgIGlmIChwQy0+Yk5vTG9vcGluZyA9PSBNNE9TQV9UUlVFKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEFkZGVkQ2xpcEN0eHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHBDLT5ianVtcGZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgTTRPU0FfSW50MzIgdGltZSA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcFwKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICZ0aW1lKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgpOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+Ymp1bXBmbGFnID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkUgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQWRkZWRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLSAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocEMtPmJOb0xvb3BpbmcgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+dWlFbmRMb29wID0wOyAvKiBWYWx1ZSAwIG1lYW5zIG5vIGxvb3BpbmcgaXMgcmVxdWlyZWQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLSAgICAgICAgICAgIGlmKCBwQy0+dWlFbmRMb29wID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBKdW1wIGF0IHRoZSBCZWdpbiBsb29wIHRpbWUgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBBZGRlZENsaXBDdHh0LT4KLSAgICAgICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtLCAmdGltZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVHJhbnNpdGlvbiBmcm9tIGVuY29kaW5nIHN0YXRlIHRvIHJlYWRpbmcgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBTZWNvbmQgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoaXJkIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoKTpcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTyAoMi0+MykgYSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KCk6IG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmc6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoYWRkZWQpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgZGVjb2RlZCBkYXRhIGludG8gU1NSQyBidWZmZXIgaW4gKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICh2b2lkICopcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotICAgICAgICAvKiBVcGRhdGUgcG9zaXRpb24gcG9pbnRlciBpbnRvIFNTUkMgYnVmZmVyIEluICovCi0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiArPQotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgfQotCi0gICAgLyogRG8gdGhlIHJlc2FtcGxpbmcgLyBjaGFubmVsIGNvbnZlcnNpb24gaWYgbmVlZGVkICg9ZmVlZCBidWZmZXIgb3V0KSAqLwotICAgIGlmKCBwQy0+Yl9TU1JDbmVlZGVkID09IE00T1NBX1RSVUUgKQotICAgIHsKLSAgICAgICAgcEMtPkNoYW5uZWxDb252ZXJzaW9uID0gMDsKLSAgICAgICAgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSggcEMtPnBQb3NJblRlbXBCdWZmZXIgLSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMikocEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICAgICAqcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscykKLSAgICAgICAgICAgICAgICAvIHBDLT5DaGFubmVsQ29udmVyc2lvbiApCi0gICAgICAgICAgICAgICAgLyogV2UgdXNlIENoYW5uZWxDb252ZXJzaW9uIHZhcmlhYmxlIGJlY2F1c2UgaW4gY2FzZSAyLCB3ZSBuZWVkIHR3aWNlIGxlc3MgZGF0YSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzcmNFcnIgPSAwOwotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBDLT5wUG9zSW5UZW1wQnVmZmVyLDAsCi0gICAgICAgICAgICAgICAgICAgIChwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSAqIHBDLT5ld2MudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgICAgICAgICBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eSgoc2hvcnQqKXBDLT5wUG9zSW5UZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAoc2hvcnQqKXBDLT5wU3NyY0J1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0LAotICAgICAgICAgICAgICAgICAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgICAgICAgICAgICAgIGlmKCAwICE9IHNzcmNFcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydDogU1NSQ19Qcm9jZXNzIHJldHVybnMgMHgleCwgcmV0dXJuaW5nICIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzc3JjRXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNzcmNFcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgKz0gcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBTU1JDIGJ1ZmZlckluICovCi0gICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wU3NyY0J1ZmZlckluICsgKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09IHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzc3JjRXJyID0gMDsKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwwLAotICAgICAgICAgICAgICAgICAgICAocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiBwQy0+ZXdjLnVpTmJDaGFubmVscykpOwotCi0gICAgICAgICAgICAgICAgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoKHNob3J0KilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgKHNob3J0KilwQy0+cFNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmlTc3JjTmJTYW1wbE91dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKLSAgICAgICAgICAgICAgICBpZiggMCAhPSBzc3JjRXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQ6IFNTUkNfUHJvY2VzcyByZXR1cm5zIDB4JXgsIHJldHVybmluZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3NyY0Vycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzc3JjRXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSAqIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgLyogVXBkYXRlIFNTUkMgYnVmZmVySW4gKi8KLSAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gKyAocEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0gcEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29udmVydCBTdGVyZW88LT5Nb25vICovCi0gICAgICAgIHN3aXRjaCggcEMtPkNoYW5uZWxDb252ZXJzaW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOiAvKiBObyBjaGFubmVsIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOiAvKiBzdGVyZW8gdG8gbW9ubyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fMTYoKHNob3J0ICopcEMtPnBUZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KSh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHBUZW1wQnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHMpOyAvKiBCdWZmZXIgaXMgaW4gYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wVGVtcEJ1ZmZlciwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjogLyogbW9ubyB0byBzdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTW9ub1RvMklfMTYoKHNob3J0ICopcEMtPnBUZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KXVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wVGVtcEJ1ZmZlciwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgewotICAgICAgICAvL000T1NBX1VJbnQzMiB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPQotICAgICAgICAvLyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSAvIHNpemVvZihzaG9ydCkgLwotICAgICAgICAvLyBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICAvKiBDb252ZXJ0IFN0ZXJlbzwtPk1vbm8gKi8KLSAgICAgICAgc3dpdGNoKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6IC8qIE5vIGNoYW5uZWwgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6IC8qIHN0ZXJlbyB0byBtb25vICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub18xNigoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBwVGVtcEJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVySW4KLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHMpOyAvKiBCdWZmZXIgaXMgaW4gYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjogLyogbW9ubyB0byBzdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTW9ub1RvMklfMTYoKHNob3J0ICopcEMtPnBTc3JjQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQpdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9IHBDLT5wU3NyY0J1ZmZlckluCi0gICAgICAgICAgICAgICAgICAgICAgICArICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJJbiwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09Ci0gICAgICAgICAgICAgICAgICAgICAgICAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5vIGNoYW5uZWwgY29udmVyc2lvbiBub3Igc2FtcGwuIGZyZXEuIGNvbnZlcnNpb24gbmVlZGVkLCBqdXN0IGJ1ZmZlciBtYW5hZ2VtZW50ICovCi0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBQb3NJblNzcmNCdWZmZXJJbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfSW50MzIgTTRWU1MzR1BQX2dldERlY2liZWxTb3VuZCggTTRPU0FfVUludDMyIHZhbHVlICkKLSAgICB7Ci0gICAgaW50IGRiU291bmQgPSAxOwotCi0gICAgaWYoIHZhbHVlID09IDAgKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmKCB2YWx1ZSA+IDB4NDAwMCAmJiB2YWx1ZSA8PSAweDgwMDAgKSAgICAgIC8vIDMyNzY4Ci0gICAgICAgIGRiU291bmQgPSA5MDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgyMDAwICYmIHZhbHVlIDw9IDB4NDAwMCApIC8vIDE2Mzg0Ci0gICAgICAgIGRiU291bmQgPSA4NDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgxMDAwICYmIHZhbHVlIDw9IDB4MjAwMCApIC8vIDgxOTIKLSAgICAgICAgZGJTb3VuZCA9IDc4OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDA4MDAgJiYgdmFsdWUgPD0gMHgxMDAwICkgLy8gNDAyOAotICAgICAgICBkYlNvdW5kID0gNzI7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDQwMCAmJiB2YWx1ZSA8PSAweDA4MDAgKSAvLyAyMDQ4Ci0gICAgICAgIGRiU291bmQgPSA2NjsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMjAwICYmIHZhbHVlIDw9IDB4MDQwMCApIC8vIDEwMjQKLSAgICAgICAgZGJTb3VuZCA9IDYwOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAxMDAgJiYgdmFsdWUgPD0gMHgwMjAwICkgLy8gNTEyCi0gICAgICAgIGRiU291bmQgPSA1NDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDgwICYmIHZhbHVlIDw9IDB4MDEwMCApIC8vIDI1NgotICAgICAgICBkYlNvdW5kID0gNDg7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDA0MCAmJiB2YWx1ZSA8PSAweDAwODAgKSAvLyAxMjgKLSAgICAgICAgZGJTb3VuZCA9IDQyOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMjAgJiYgdmFsdWUgPD0gMHgwMDQwICkgLy8gNjQKLSAgICAgICAgZGJTb3VuZCA9IDM2OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMTAgJiYgdmFsdWUgPD0gMHgwMDIwICkgLy8gMzIKLSAgICAgICAgZGJTb3VuZCA9IDMwOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDggJiYgdmFsdWUgPD0gMHgwMDEwICkgLy8xNgotICAgICAgICBkYlNvdW5kID0gMjQ7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDAwNyAmJiB2YWx1ZSA8PSAweDAwMDggKSAvLzgKLSAgICAgICAgZGJTb3VuZCA9IDI0OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDMgJiYgdmFsdWUgPD0gMHgwMDA3ICkgLy8gNAotICAgICAgICBkYlNvdW5kID0gMTg7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDAwMSAmJiB2YWx1ZSA8PSAweDAwMDMgKSAvLzIKLSAgICAgICAgZGJTb3VuZCA9IDEyOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMCAmJiB2YWx1ZSA8PSAweDAwMDEgKSAgLy8gMQotICAgICAgICBkYlNvdW5kID0gNjsKLQotICAgIGVsc2UKLSAgICAgICAgZGJTb3VuZCA9IDA7Ci0KLSAgICByZXR1cm4gZGJTb3VuZDsKLSAgICB9Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBNaXggdGhlIGN1cnJlbnQgYXVkaW8gQVVzIChkZWNvZGVyLCBtaXgsIGVuY29kZSkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZygKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTE7Ci0gICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhMjsKLSAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplOwotCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YTsgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCAodGhlbiB3cml0dGVuKSBkYXRhICovCi0gICAgTTRPU0FfTWVtQWRkcjggdGVtcFBvc0J1ZmZlcjsKLSAgICAvKiBkdWNraW5nIHZhcmlhYmxlICovCi0gICAgTTRPU0FfVUludDE2IGxvb3BJbmRleCA9IDA7Ci0gICAgTTRPU0FfSW50MTYgKnBQQ00xNlNhbXBsZSA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50MzIgcGVha0RiVmFsdWUgPSAwOwotICAgIE00T1NBX0ludDMyIHByZXZpb3VzRGJWYWx1ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAvKioKLSAgICAqIERlY29kZSBvcmlnaW5hbCBhdWRpbyB0cmFjayBBVSAqLwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cElucHV0Q2xpcEN0eHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAKLSAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQocEMpOwotCi0gICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQURERURfQVVESU8gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0IHJldHVybmVkIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVEX1BDTV9TSVpFX0lTU1VFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcFBDTWRhdGEyID0gKE00T1NBX0ludDE2ICopcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBEZWNvZGUgYWRkZWQgYXVkaW8gdHJhY2sgQVUgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cEFkZGVkQ2xpcEN0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZzpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShhZGRlZCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBkZWNvZGVkIHRoZSBzYW1lIGFtb3VudCBvZiBQQ00gc2FtcGxlcyAqLwotICAgICAgICBpZiggcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICE9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOlwKLSAgICAgICAgICAgICAgICBib3RoIGNsaXBzIEFVIG11c3QgaGF2ZSB0aGUgc2FtZSBkZWNvZGVkIFBDTSBzaXplISIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQVVESU9fREVDT0RFRF9QQ01fU0laRV9JU1NVRTsKLSAgICAgICAgfQotICAgICAgICBwUENNZGF0YTIgPSAoTTRPU0FfSW50MTYgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBNaXggdGhlIHR3byBkZWNvZGVkIFBDTSBhdWRpb3MgKi8KLSAgICBwUENNZGF0YTEgPQotICAgICAgICAoTTRPU0FfSW50MTYgKilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgdWlQQ01zaXplID0gcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgLyAyOyAvKmJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpKi8KLQotICAgIGlmKCBwQy0+Yl9EdWNraW5nTmVlZGVlZCApCi0gICAgewotICAgICAgICBsb29wSW5kZXggPSAwOwotICAgICAgICBwZWFrRGJWYWx1ZSA9IDA7Ci0gICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotCi0gICAgICAgIHBQQ00xNlNhbXBsZSA9IChNNE9TQV9JbnQxNiAqKXBDLT5wSW5wdXRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotCi0gICAgICAgIC8vQ2FsY3VsYXRlIHRoZSBwZWFrIHZhbHVlCi0gICAgICAgICB3aGlsZSggbG9vcEluZGV4Ci0gICAgICAgICAgICAgPCBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgLyBzaXplb2YoTTRPU0FfSW50MTYpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdID49IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBlYWtEYlZhbHVlID0gcHJldmlvdXNEYlZhbHVlID4gcFBDTTE2U2FtcGxlW2xvb3BJbmRleF0KLSAgICAgICAgICAgICAgICA/IHByZXZpb3VzRGJWYWx1ZSA6IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdOwotICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBlYWtEYlZhbHVlID0gcHJldmlvdXNEYlZhbHVlID4gLXBQQ00xNlNhbXBsZVtsb29wSW5kZXhdCi0gICAgICAgICAgICAgICAgPyBwcmV2aW91c0RiVmFsdWUgOiAtcFBDTTE2U2FtcGxlW2xvb3BJbmRleF07Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlID0gcGVha0RiVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb29wSW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5hdWRpb1ZvbHVtZUFycmF5W3BDLT5hdWRWb2xBcnJJbmRleF0gPQotICAgICAgICAgICAgTTRWU1MzR1BQX2dldERlY2liZWxTb3VuZChwZWFrRGJWYWx1ZSk7Ci0KLSAgICAgICAgLyogV0lORE9XX1NJWkUgaXMgMTAgYnkgZGVmYXVsdCBhbmQgY2hlY2sgZm9yIHRocmVzaG9sZCBpcyBkb25lIGFmdGVyIDEwIGN5Y2xlcyAqLwotICAgICAgICBpZiggcEMtPmF1ZFZvbEFyckluZGV4ID49IFdJTkRPV19TSVpFIC0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5iRG9EdWNraW5nID0KLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCgoTTRPU0FfSW50MzIgKikmKHBDLT5hdWRpb1ZvbHVtZUFycmF5KSwKLSAgICAgICAgICAgICAgICBwQy0+YXVkVm9sQXJySW5kZXgsIHBDLT5JbkR1Y2tpbmdfdGhyZXNob2xkKTsKLQotICAgICAgICAgICAgcEMtPmF1ZFZvbEFyckluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5hdWRWb2xBcnJJbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKkJlbG93IGxvZ2ljIGNvbnRyb2xzIHRoZSBtaXhpbmcgd2VpZ2h0YWdlIGZvciBCYWNrZ3JvdW5kIFRyYWNrIGFuZCBQcmltYXJ5IFRyYWNrCi0gICAgICAgICpmb3IgdGhlIGR1cmF0aW9uIG9mIHdpbmRvdyB1bmRlciBhbmFseXNpcyB0byBnaXZlIGZhZGUtb3V0IGZvciBCYWNrZ3JvdW5kIGFuZCBmYWRlLWluCi0gICAgICAgICpmb3IgcHJpbWFyeQotICAgICAgICAqCi0gICAgICAgICpDdXJyZW50IGZhZGluZyBmYWN0b3IgaXMgZGlzdHJpYnV0ZWQgaW4gZXF1YWwgcmFuZ2Ugb3ZlciB0aGUgZGVmaW5lZCB3aW5kb3cgc2l6ZS4KLSAgICAgICAgKgotICAgICAgICAqRm9yIGEgd2luZG93IHNpemUgPSAyNSAoNTAwIG1zICh3aW5kb3cgdW5kZXIgYW5hbHlzaXMpIC8gMjAgbXMgKHNhbXBsZSBkdXJhdGlvbikpCi0gICAgICAgICoKLSAgICAgICAgKi8KLQotICAgICAgICBpZiggcEMtPmJEb0R1Y2tpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPmR1Y2tpbmdGYWN0b3IKLSAgICAgICAgICAgICAgICA+IHBDLT5JbkR1Y2tpbmdfbG93Vm9sdW1lICkgLy8gRkFERSBPVVQgQkcgVHJhY2sKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIGluIGZhY3RvciBvZiBsb3cgdm9sdW1lIHN0ZXBzIHRvIHJlYWNoCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvdyB2b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciAtPSAocEMtPkluRHVja2luZ19sb3dWb2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5kdWNraW5nRmFjdG9yID0gcEMtPkluRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPmR1Y2tpbmdGYWN0b3IgPCAxLjAgKSAvLyBGQURFIElOIEJHIFRyYWNrCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIG9mIGxvdyB2b2x1bWUgZmFjdG9yIHRvIHJlYWNoCi0gICAgICAgICAgICAgICAgLy8gb3JpZy52b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciArPSAocEMtPkluRHVja2luZ19sb3dWb2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciA9IDEuMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBlbmRpZiAtIGR1Y2tpbmdfZW5hYmxlICovCi0KLSAgICAgICAgLyogTWl4aW5nIExvZ2ljICovCi0KLSAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ludDMyIHRlbXA7Ci0KLSAgICAgICAgICAgLyogc2V0IHZvbCBmYWN0b3IgZm9yIEJUIGFuZCBQVCAqLwotICAgICAgICAgICAgKnBQQ01kYXRhMiA9IChNNE9TQV9JbnQxNikoKnBQQ01kYXRhMiAqIHBDLT5mQlRWb2xMZXZlbCk7Ci0KLSAgICAgICAgICAgICpwUENNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwUENNZGF0YTEgKiBwQy0+ZlBUVm9sTGV2ZWwpOwotCi0gICAgICAgICAgICAvKiBtaXggdGhlIHR3byBzYW1wbGVzICovCi0KLSAgICAgICAgICAgICpwUENNZGF0YTIgPSAoTTRPU0FfSW50MTYpKCggKnBQQ01kYXRhMikgKiAocEMtPmR1Y2tpbmdGYWN0b3IpKTsKLSAgICAgICAgICAgICpwUENNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwUENNZGF0YTIgLyAyICsgKnBQQ01kYXRhMSAvIDIpOwotCi0KLSAgICAgICAgICAgIGlmKCAqcFBDTWRhdGExIDwgMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IC0oICpwUENNZGF0YTEpCi0gICAgICAgICAgICAgICAgICAgICogMjsgLy8gYnJpbmcgdG8gc2FtZSBBbXBsaXR1ZGUgbGV2ZWwgYXMgaXQgd2FzIG9yaWdpbmFsCi0KLSAgICAgICAgICAgICAgICBpZiggdGVtcCA+IDMyNzY3ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwUENNZGF0YTEgPSAtMzI3NjY7IC8vIGxlc3MgdGhlbiBtYXggYWxsb3dlZCB2YWx1ZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgtdGVtcCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wID0gKCAqcFBDTWRhdGExKQotICAgICAgICAgICAgICAgICogMjsgLy8gYnJpbmcgdG8gc2FtZSBBbXBsaXR1ZGUgbGV2ZWwgYXMgaXQgd2FzIG9yaWdpbmFsCi0KLSAgICAgICAgICAgIGlmKCB0ZW1wID4gMzI3NjggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwUENNZGF0YTEgPSAzMjc2NzsgLy8gbGVzcyB0aGFuIG1heCBhbGxvd2VkIHZhbHVlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQQ01kYXRhMSA9IChNNE9TQV9JbnQxNil0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBQQ01kYXRhMisrOwotICAgICAgICAgICAgcFBDTWRhdGExKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApCi0gICAgICAgewotICAgICAgICAvKiBtaXggdGhlIHR3byBzYW1wbGVzICovCi0gICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgqcFBDTWRhdGExICogcEMtPmZPcmlnRmFjdG9yICogcEMtPmZQVFZvbExldmVsCi0gICAgICAgICAgICAgICArICpwUENNZGF0YTIgKiBwQy0+ZkFkZGVkRmFjdG9yICogcEMtPmZCVFZvbExldmVsICk7Ci0KLSAgICAgICAgICAgIHBQQ01kYXRhMSsrOwotICAgICAgICAgICAgcFBDTWRhdGEyKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgcEMtPnBTc3JjQnVmZmVyT3V0IGJ1ZmZlciAqLwotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCB8fCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICB7Ci0gICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICsgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJPdXQsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC09Ci0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICB7Ci0gICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJJbgotICAgICAgICAgICAgKyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgIH0KLQotICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UyXzAoIksgKioqKiBibGVuZCBBVXMiKTsKLQotICAgIC8qKgotICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKCk6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBBVSBjdHMgYW5kIHNpemUgKi8KLSAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9Ci0gICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgTTRPU0FfVFJBQ0UyXzIoIkwgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmc6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbmNyZW1lbnQgdGhlIGF1ZGlvIENUUyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5ld2MuZEFUbyArPSBmcmFtZVRpbWVEZWx0YSAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgRGVjb2RlL2VuY29kZSBhIGZldyBBVSBiYWNrd2FyZCB0byBpbml0aWF0ZSB0aGUgZW5jb2RlciBmb3IgbGF0ZXIgTWl4IHNlZ21lbnQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YSA9IDA7IC8qKjwgRHVyYXRpb24gb2YgdGhlIGVuY29kZWQgKHRoZW4gd3JpdHRlbikgZGF0YSAqLwotCi0gICAgTTRPU0FfSW50MzIgaVRhcmdldEN0cywgaUN1cnJlbnRDdHM7Ci0KLSAgICAvKioKLSAgICAqICdCWlpaJyBidWcgZml4OgotICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZShwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigpOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpQ3VycmVudEN0cyA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAvKiBEbyBub3QgZG8gcHJlLWVuY29kZSBzdGVwIGlmIHRoZXJlIGlzIG5vIG1peGluZyAocmVtb3ZlLCAxMDAgJSwgb3Igbm90IGVkaXRhYmxlKSAqLwotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQWR2YW5jZSBpbiB0aGUgb3JpZ2luYWwgYXVkaW8gc3RyZWFtIHRvIHJlYWNoIHRoZSBjdXJyZW50IHRpbWUKLSAgICAgICAgKiAoV2UgZG9uJ3Qgd2FudCBpQXVkaW9DVFMgdG8gYmUgbW9kaWZpZWQgYnkgdGhlIGp1bXAgZnVuY3Rpb24sCi0gICAgICAgICogc28gd2UgaGF2ZSB0byB1c2UgYSBsb2NhbCB2YXJpYWJsZSkuICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocEMtPnBJbnB1dENsaXBDdHh0LCAmaUN1cnJlbnRDdHMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KCkgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKjwgZG9uJ3QgdHJ5IHRvIHByZS1kZWNvZGUgaWYgY2xpcCBpcyBhdCBpdHMgYmVnaW5uaW5nLi4uICovCi0gICAgICAgIGlmKCBpQ3VycmVudEN0cyA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgYSBmZXcgQVVzIGJhY2t3YXJkICovCi0gICAgICAgICAgICBpVGFyZ2V0Q3RzID0gaUN1cnJlbnRDdHMgLSBNNFZTUzNHUFBfTkJfQVVfUFJFRkVUQ0gKLSAgICAgICAgICAgICAgICAqIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotCi0gICAgICAgICAgICBpZiggaVRhcmdldEN0cyA8IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSAwOyAvKio8IFNhbml0eSBjaGVjayAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KHBDLT5wSW5wdXRDbGlwQ3R4dCwgJmlUYXJnZXRDdHMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIERlY29kZS9lbmNvZGUgdXAgdG8gdGhlIHdhbnRlZCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgd2hpbGUoIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPCBpQ3VycmVudEN0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJNIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQW9mZnNldAotICAgICAgICAgICAgICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShiKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOiBERUNPREVfRU5DT0RFLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk4gKioqKiBwcmUtZW5jb2RlIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LCAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsKLSAgICAgICAgICAgICAgICAwXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk8gLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVIHJldHVybnMgMHgleCEiLCAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmRBVG8gKz0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXIoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgRW5jUGFyYW1zOwotCi0gICAgLyoqCi0gICAgKiBTaW11bGF0ZSBhIHdyaXRlciBpbnRlcmZhY2Ugd2l0aCBvdXIgc3BlY2lmaWMgZnVuY3Rpb24gKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFByb2Nlc3NBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRQcm9jZXNzQVU7IC8qKjwgVGhpcyBmdW5jdGlvbiBpcyBWU1MgM0dQUCBzcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wU3RhcnRBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTdGFydEFVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgZm9sbG93IHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBXcml0ZXJDb250ZXh0ID0KLSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQpCi0gICAgICAgIHBDOyAvKio8IFdlIGdpdmUgdGhlIGludGVybmFsIGNvbnRleHQgYXMgd3JpdGVyIGNvbnRleHQgKi8KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBlbmNvZGVyIGludGVyZmFjZSwgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6IHNldEN1cnJlbnRFbmNvZGVyIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBlbmNvZGVyIHNoZWxsIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIFZTUyBzZXR0aW5ncyAqLwotCi0gICAgLyogQ29tbW9uIHBhcmFtZXRlcnMgKi8KLSAgICBFbmNQYXJhbXMuSW5wdXRGb3JtYXQgPSBNNEVOQ09ERVJfa0lZVVY0MjA7Ci0gICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggPSBwQy0+ZXdjLnVpVmlkZW9XaWR0aDsKLSAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQ7Ci0gICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlOwotICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZXdjLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9MZXZlbCA9IHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIC8qIE5vIHN0cmljdCByZWd1bGF0aW9uIGluIHZpZGVvIGVkaXRvciAqLwotICAgIC8qIEJlY2F1c2Ugb2YgdGhlIGVmZmVjdHMgYW5kIHRyYW5zaXRpb25zIHdlIHNob3VsZCBhbGxvdyBtb3JlIGZsZXhpYmlsaXR5ICovCi0gICAgLyogQWxzbyBpdCBwcmV2ZW50cyB0byBkcm9wIGltcG9ydGFudCBmcmFtZXMKLSAgICAgICh3aXRoIGEgYmFkIHJlc3VsdCBvbiBzaGVkdWxpbmcgYW5kIGJsb2NrIGVmZmV0Y3MpICovCi0gICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRFTkNPREVSX2tWQVJJQUJMRV9GUFM7Ci0KLSAgICAvKioKLSAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKGRlZmF1bHRzKSAqLwotICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSA9IDA7ICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aVZlcnRpY2FsU2VhcmNoUmFuZ2UgPSAwOyAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7ICAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCA9IDA7ICAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpTW90aW9uRXN0aW1hdGlvblRvb2xzID0gMDsgICAgIC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uID0gTTRPU0FfVFJVRTsgICAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsgICAvKiBpbml0aWFsIFFQID0gMTAgKi8KLSAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotICAgIHN3aXRjaCggcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUEVHNDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDg7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gMTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5ld2MuYlZpZGVvRGF0YVBhcnRpdGlvbmluZyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBNNFNZU19IMjY0Iik7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBVbmtub3duIHZpZGVvU3RyZWFtVHlwZSAweCV4IiwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBFbmNQYXJhbXMuQml0cmF0ZSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLQotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdEluaXQiKTsKLSAgICAvKioKLSAgICAqIEluaXQgdGhlIHZpZGVvIGVuY29kZXIgKGFkdmFuY2VkIHNldHRpbmdzIHZlcnNpb24gb2YgdGhlIGVuY29kZXIgT3BlbiBmdW5jdGlvbikgKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0KCZwQy0+ZXdjLnBFbmNDb250ZXh0LAotICAgICAgICAmcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZTUzNHUFBfaW50VlBQLCBwQywKLSAgICAgICAgcEMtPlNoZWxsQVBJLnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEksCi0gICAgICAgIHBDLT5TaGVsbEFQSS5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyQ2xvc2VkOwotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdE9wZW4iKTsKLSAgICBNNE9TQV9UUkFDRTFfMigidnNzOiBhdWRpbyBtaXggZW5jb2RlciBvcGVuIHByb2ZpbGUgOiVkLCBsZXZlbCAlZCIsCi0gICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUsIEVuY1BhcmFtcy52aWRlb0xldmVsKTsKLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLldyaXRlclZpZGVvQVUsICZFbmNQYXJhbXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdFN0YXJ0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnQgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyUnVubmluZzsKLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIERlc3Ryb3kgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEVuY0NvbnRleHQgKQotICAgIHsKLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmcgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIG9wZW5lZD8gRG9uJ3QgY2xvc2UgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyQ2xvc2VkOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa05vRW5jb2RlcjsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVzZXQgdmFyaWFibGUgKi8KLSAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfQm9vbCBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCggTTRPU0FfSW50MzIgKmF2ZXJhZ2VWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgc3RvcmVDb3VudCwgTTRPU0FfSW50MzIgdGhyZXNob2xkVmFsdWUgKQotewotICAgIE00T1NBX0Jvb2wgcmVzdWx0ID0gMDsKLSAgICBpbnQgaTsKLSAgICBpbnQgZmluYWxWYWx1ZSA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IHN0b3JlQ291bnQ7IGkrKyApCi0gICAgICAgIGZpbmFsVmFsdWUgKz0gYXZlcmFnZVZhbHVlW2ldOwotCi0gICAgZmluYWxWYWx1ZSA9IGZpbmFsVmFsdWUgLyBzdG9yZUNvdW50OwotCi0KLSAgICBpZiggZmluYWxWYWx1ZSA+IHRocmVzaG9sZFZhbHVlICkKLSAgICAgICAgcmVzdWx0ID0gTTRPU0FfVFJVRTsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IE00T1NBX0ZBTFNFOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDA2MTJmMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9DbGlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfQ2xpcC5jCi0gKiBAYnJpZWYgICAgSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gaW5wdXQgY2xpcCBtYW5hZ2VtZW50LgotICogQG5vdGUgICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIHN0YXRpYywgaS5lLiBub24gcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiAgICBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0KLS8qKgotICogICAgT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiIC8qIE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyogT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLQotLyoqCi0gKiBDb21tb24gaGVhZGVycyAoZm9yIGFhYykgKi8KLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLQotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotI2luY2x1ZGUgIk00VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgiCi0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotLyogT3NhbCBoZWFkZXIgZmlsZW5vICovCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkZWZpbmUgICAgU3RhdGljIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApOwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKQotICogQGJyaWVmICAgIE9wZW4gYSBjbGlwLiBDcmVhdGVzIGEgY2xpcCBjb250ZXh0LgotICogQG5vdGUKLSAqIEBwYXJhbSAgIGhDbGlwQ3R4dCAgICAgICAgICAgIChPVVQpIFJldHVybiB0aGUgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIEVkaXQgc2V0dGluZ3Mgb2YgdGhpcyBjbGlwLiBUaGUgbW9kdWxlIHdpbGwga2VlcCBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdG8gdGhpcyBwb2ludGVyCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBiU2tpcEF1ZGlvVHJhY2sgICAgICAgIChJTikgSWYgdHJ1ZSwgZG8gbm90IG9wZW4gdGhlIGF1ZGlvCi0gKiBAcGFyYW0gICAgYkZhc3RPcGVuTW9kZSAgICAgICAgKElOKSBJZiB0cnVlLCB1c2UgdGhlIGZhc3QgbW9kZSBvZiB0aGUgM2dwcCByZWFkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSB0aGUgZmlyc3QgQVUgaXMgcmVhZCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSW5pdCggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICoqIGhDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QgKQotewotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gaENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBJbml0OiBoQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcEluaXQ6IHBGaWxlUmVhZFB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIHRoZSBjbGlwIGNvbnRleHQgKi8KLSAgICAqaENsaXBDdHh0ID0KLSAgICAgICAgKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0NsaXBDb250ZXh0KSwKLSAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJNNFZTUzNHUFBfQ2xpcENvbnRleHQiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09ICpoQ2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBJbml0KCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBNNFZTUzNHUFBfQ2xpcENvbnRleHQsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwSW5pdCgpOiBjbGlwQ3R4dD0weCV4IiwgKmhDbGlwQ3R4dCk7Ci0KLQotICAgIC8qKgotICAgICogVXNlIHRoaXMgc2hvcnRjdXQgdG8gc2ltcGxpZnkgdGhlIGNvZGUgKi8KLSAgICBwQ2xpcEN0eHQgPSAqaENsaXBDdHh0OwotCi0gICAgLyogSW5pYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgbWVtc2V0KCh2b2lkICopcENsaXBDdHh0LCAwLHNpemVvZihNNFZTUzNHUFBfQ2xpcENvbnRleHQpKTsKLQotICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogSW5pdCB0aGUgY2xpcCBjb250ZXh0ICovCi0gICAgcENsaXBDdHh0LT5pVm9mZnNldCA9IDA7Ci0gICAgcENsaXBDdHh0LT5pQW9mZnNldCA9IDA7Ci0gICAgcENsaXBDdHh0LT5Wc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0gICAgcENsaXBDdHh0LT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0KLSAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gMDsKLSAgICBwQ2xpcEN0eHQtPmlWaWRlb1JlbmRlckN0cyA9IDA7Ci0gICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPmJWaWRlb0F1QXZhaWxhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBDdHh0LT5iRmlyc3RBdVdyaXR0ZW4gPSBNNE9TQV9GQUxTRTsKLQotICAgIHBDbGlwQ3R4dC0+Yk1wZWc0R292U3RhdGUgPSBNNE9TQV9GQUxTRTsKLQotICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgPSAwOwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gMDsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgcENsaXBDdHh0LT5wRmlsZVJlYWRQdHJGY3QgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXYgICA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoKLSAgICAqIFJlc2V0IHBvaW50ZXJzIGZvciBtZWRpYSBhbmQgY29kZWNzIGludGVyZmFjZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoKLSAgICAqICBDYWxsIHRoZSBtZWRpYSBhbmQgY29kZWNzIHN1YnNjcmlwdGlvbiBtb2R1bGUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYygmcENsaXBDdHh0LT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLy8gVGhpcyBtZXRob2QgbWFwcyB0aGUgZnJlcXVlbmN5IHZhbHVlIHRvIGEgc3RyaW5nLgotc3RhdGljIGNvbnN0IGNoYXIqIGZyZXFUb1N0cmluZyhpbnQgZnJlcSkgewotICAgIHN3aXRjaCAoZnJlcSkgewotICAgIGNhc2UgODAwMDoKLSAgICAgICAgcmV0dXJuICJfODAwMCI7Ci0gICAgY2FzZSAxMTAyNToKLSAgICAgICAgcmV0dXJuICJfMTEwMjUiOwotICAgIGNhc2UgMTIwMDA6Ci0gICAgICAgIHJldHVybiAiXzEyMDAwIjsKLSAgICBjYXNlIDE2MDAwOgotICAgICAgICByZXR1cm4gIl8xNjAwMCI7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgICAgcmV0dXJuICJfMjIwNTAiOwotICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgIHJldHVybiAiXzI0MDAwIjsKLSAgICBjYXNlIDMyMDAwOgotICAgICAgICByZXR1cm4gIl8zMjAwMCI7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgICAgcmV0dXJuICJfNDQxMDAiOwotICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgIHJldHVybiAiXzQ4MDAwIjsKLSAgICBkZWZhdWx0OgotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiVW5zdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZTogJWQgSHoiLCBmcmVxKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0vLyBUaGlzIG1ldGhvZCBtYXBzIHRoZSBudW1iZXIgb2YgY2hhbm5lbCB2YWx1ZSB0bwotLy8gYSBzdHJpbmcgdGhhdCB3aWxsIGJlIHBhcnQgb2YgYSBmaWxlIG5hbWUgZXh0ZW5zaW9uCi1zdGF0aWMgY29uc3QgY2hhciogY2hhbm5lbFRvU3RyaW5nQW5kRmlsZUV4dChpbnQgY2hhbm5lbHMpIHsKLSAgICBzd2l0Y2ggKGNoYW5uZWxzKSB7Ci0gICAgY2FzZSAxOgotICAgICAgICByZXR1cm4gIl8xLnBjbSI7Ci0gICAgY2FzZSAyOgotICAgICAgICByZXR1cm4gIl8yLnBjbSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIlVuc3VwcG9ydGVkICVkIGNoYW5uZWxzIiwgY2hhbm5lbHMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIE5vdGU6IGlmIHRoZSBjbGlwIGlzIG9wZW5lZCBpbiBmYXN0IG1vZGUsIGl0IGNhbiBvbmx5IGJlIHVzZWQgZm9yIGFuYWx5c2lzIGFuZCBub3RoaW5nIGVsc2UuICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBPcGVuKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncywgTTRPU0FfQm9vbCBiU2tpcEF1ZGlvVHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkZhc3RPcGVuTW9kZSwgTTRPU0FfQm9vbCBiQXZvaWRPcGVuaW5nVmlkZW9EZWMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgbWVkaWFGYW1pbHk7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXI7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAgZHVtbXlTdHJlYW1IYW5kbGVyOwotICAgIE00T1NBX0ludDMyIGlEdXJhdGlvbjsKLSAgICBNNE9TQV9Wb2lkICpkZWNvZGVyVXNlckRhdGE7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8gZHVtbXk7Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSB2aWRlb1NpemVGcm9tRFNJOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0gICAgTTRERUNPREVSX091dHB1dEZpbHRlciBGaWx0ZXJPcHRpb247Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBwQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwiKTsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBjYWxsZWQgd2l0aCBwQ2xpcEN0eHQ6IDB4JXgsIGJBdm9pZE9wZW5pbmdWaWRlb0RlYz0weCV4IiwKLSAgICAgICAgcENsaXBDdHh0LCBiQXZvaWRPcGVuaW5nVmlkZW9EZWMpOwotICAgIC8qKgotICAgICogS2VlcCBhIHBvaW50ZXIgdG8gdGhlIGNsaXAgc2V0dGluZ3MuIFJlbWVtYmVyIHRoYXQgd2UgZG9uJ3QgcG9zc2VzcyBpdCEgKi8KLSAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncyA9IHBDbGlwU2V0dGluZ3M7Ci0gICAgaWYoTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSkgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBJbWFnZSBzdHJlYW07IHNldCBjdXJyZW50IHZpZCBkZWMiKTsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5TaGVsbEFQSSwgTTREQV9TdHJlYW1UeXBlVmlkZW9BUkdCODg4OCk7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAmZHVtbXlTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXIsCi0gICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCwKLSAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPlZpZGVvQVUsCi0gICAgICAgICAgICAgICAgICBkZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogXAotICAgICAgICAgICAgICAgIG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IFwKLSAgICAgICAgICAgIFZpZCBkZWMgc3RhcnRlZDsgcFZpRGVjQ3R4dD0weCV4IiwgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgY29ycmVjdCByZWFkZXIgaW50ZXJmYWNlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRSZWFkZXIoJnBDbGlwQ3R4dC0+U2hlbGxBUEksCi0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIDNHUFAgb3IgTVAzIHJlYWRlciAqLwotICAgIGVyciA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUoJnBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIExpbmsgdGhlIHJlYWRlciBpbnRlcmZhY2UgdG8gdGhlIHJlYWRlciBjb250ZXh0ICh1c2VkIGJ5IHRoZSBkZWNvZGVyIHRvIGtub3cgdGhlIHJlYWRlcikgKi8KLSAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9yZWFkZXJDb250ZXh0ID0KLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSBPU0FMIHJlYWQgZnVuY3Rpb24gc2V0ICovCi0gICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikocENsaXBDdHh0LT5wRmlsZVJlYWRQdHJGY3QpKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGZhc3Qgb3BlbiBtb2RlIGlmIGFza2VkICgzR1BQIG9ubHkpICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSApCi0gICAgewotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBiRmFzdE9wZW5Nb2RlICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlLCBNNE9TQV9OVUxMKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oRmFzdE9wZW5Nb2RlKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHNraXAgYXVkaW8gb3B0aW9uIGlmIGFza2VkICovCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IGJTa2lwQXVkaW9UcmFjayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX1ZpZGVvT25seSwgTTRPU0FfTlVMTCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oVmlkZW9Pbmx5KSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNKSB7Ci0gICAgICAgIC8vIENvbXBvc2UgdGhlIHRlbXAgZmlsZW5hbWUgd2l0aCBzYW1wbGUgcmF0ZSBhbmQgY2hhbm5lbCBpbmZvcm1hdGlvbi4KLSAgICAgICAgY29uc3QgY2hhciogZnJlcVN0ciA9IGZyZXFUb1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotCi0gICAgICAgIGlmIChmcmVxU3RyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TQU1QTElOR19GUkVRVUVOQ1k7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBjaGFyKiBjaGFuU3RyID0gY2hhbm5lbFRvU3RyaW5nQW5kRmlsZUV4dCgKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0KLSAgICAgICAgaWYgKGNoYW5TdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19OQl9PRl9DSEFOTkVMUzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFsbG9jYXRlIG9uZSBieXRlIG1vcmUgdG8gaG9sZCB0aGUgbnVsbCB0ZXJtaW5hdG9yCi0gICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPQotICAgICAgICAgICAgc3RybGVuKHBDbGlwU2V0dGluZ3MtPnBGaWxlKSArIHN0cmxlbihmcmVxU3RyKSArIHN0cmxlbihjaGFuU3RyKSArIDE7Ci0KLSAgICAgICAgY2hhciogcFRlbXBGaWxlID0gKGNoYXIgKikgbWFsbG9jKGxlbmd0aCk7Ci0gICAgICAgIGlmIChwVGVtcEZpbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtYWxsb2MgJWQgYnl0ZXMgZmFpbCIsbGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1zZXQocFRlbXBGaWxlLCAwLCBsZW5ndGgpOwotICAgICAgICBtZW1jcHkocFRlbXBGaWxlLCBwQ2xpcFNldHRpbmdzLT5wRmlsZSwgc3RybGVuKHBDbGlwU2V0dGluZ3MtPnBGaWxlKSk7Ci0gICAgICAgIHN0cm5jYXQocFRlbXBGaWxlLCBmcmVxU3RyLCBzdHJsZW4oZnJlcVN0cikpOwotICAgICAgICBzdHJuY2F0KHBUZW1wRmlsZSwgY2hhblN0ciwgc3RybGVuKGNoYW5TdHIpKTsKLQotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0T3BlbiggcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgcFRlbXBGaWxlKTsKLSAgICAgICAgaWYgKHBUZW1wRmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBUZW1wRmlsZSk7Ci0gICAgICAgICAgICBwVGVtcEZpbGUgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmICggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG9wZW4gcGNtIGZpbGUgcmV0dXJucyBlcnJvciA6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIC8qKgotICAgICAgICAqIE9wZW4gdGhlIDNHUFAvTVAzIGNsaXAgZmlsZSAqLwotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0T3BlbiggcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSk7Ci0gICAgfQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdWlEdW1teSwgdWlDb3JlSWQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdE9wZW4gcmV0dXJucyAweCV4IiwgZXJyKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgZXJyb3IgaXMgZnJvbSB0aGUgY29yZSByZWFkZXIsIHdlIGNoYW5nZSBpdCB0byBhIHB1YmxpYyBWU1MzR1BQIGVycm9yICovCi0gICAgICAgIE00T1NBX0VSUl9TUExJVChlcnIsIHVpRHVtbXksIHVpQ29yZUlkLCB1aUR1bW15KTsKLQotICAgICAgICBpZiggTTRNUDRfUkVBREVSID09IHVpQ29yZUlkICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlZBTElEXzNHUFBfRklMRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgKi8KLSAgICB3aGlsZSggZXJyID09IE00Tk9fRVJST1IgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRTdHJlYW0oCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LCAmbWVkaWFGYW1pbHksICZwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgLyppbiBjYXNlIHdlIGZvdW5kIGEgQklGUyBzdHJlYW0gb3Igc29tZXRoaW5nIGVsc2UuLi4qLwotICAgICAgICBpZiggKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUpKQotICAgICAgICAgICAgfHwgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIGEgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICBpZiggKCBtZWRpYUZhbWlseSA9PSBNNFJFQURFUl9rTWVkaWFGYW1pbHlWaWRlbykKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MyA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNAotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YwotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhIEgyNjMgb3IgTVBFRy00IG9yIEgyNjQgdmlkZW8gc3RyZWFtIGluIGlucHV0IDNncHAgY2xpcDsgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1ZpZGVvU3RyZWFtSGFuZGxlciAqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RSZXNldCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBIMjYzIG9yIE1QRUctNCAoSDI2NCwgZXRjLikgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTX2VkaXRDbGlwT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZvdW5kIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSAoMHgleCkgaW4gaW5wdXQgM2dwcCBjbGlwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgZWxzZSBpZiggKCBtZWRpYUZhbWlseSA9PSBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbykKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZAotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiBBTVItTkIgb3IgQUFDIG9yIE1QMyBhdWRpbyBzdHJlYW0gaW4gaW5wdXQgY2xpcDsgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00X0F1ZGlvU3RyZWFtSGFuZGxlciAqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RSZXNldChhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBBTVItTkIgb3IgQUFDIChBTVItV0IuLi4pICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiB1bnN1cHBvcnRlZCBhdWRpbyBzdHJlYW0gKDB4JXgpIGluIGlucHV0IDNncHAvbXAzIGNsaXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dFN0cmVhbSgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0IFZpZGVvIGRlY29kZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgewotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAvKiBJZiBleHRlcm5hbCBkZWNvZGVycyBhcmUgcG9zc2libGUsIGl0J3MgYmVzdCB0byBhdm9pZCBvcGVuaW5nIHRoZSBkZWNvZGVyIGlmIHRoZSBjbGlwIGlzIG9ubHkKLSAgZ29pbmcgdG8gYmUgdXNlZCBmb3IgYW5hbHlzaXMsIGFzIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQgZm9yIHRoZSBhbmFseXNpcyBpbiB0aGUgY2FzZSBvZiBhCi0gIHBvc3NpYmxlIGV4dGVybmFsIGRlY29kZXIgYW55d2F5LCBhbmQgZWl0aGVyIHRoZXJlIGNvdWxkIGJlIG5vIGRlY29kZXIgYXQgdGhpcyBwb2ludCBvciB0aGUgSFcKLSAgZGVjb2RlciBjb3VsZCBiZSBwcmVzZW50LCB3aGljaCB3ZSB3YW50IHRvIGF2b2lkIG9wZW5pbmcgZm9yIHRoYXQuIFNlZSBjb21tZW50cyBpbgotICBpbnRCdWlsZEFuYWx5c2lzIGZvciBtb3JlIGRldGFpbHMuICovCi0KLSAgLyogQ0hBTkdFTUUgVGVtcG9yYXJpbHkgb25seSBkbyB0aGlzIGZvciBNUEVHNCwgc2luY2UgZm9yIG5vdyBvbmx5IE1QRUc0IGV4dGVybmFsIGRlY29kZXJzIGFyZQotICBzdXBwb3J0ZWQsIGFuZCB0aGUgZm9sbG93aW5nIHdvdWxkbid0IHdvcmsgZm9yIEgyNjMgc28gYSByZWxlYXNlIHdoZXJlIGV4dGVybmFsIGRlY29kZXJzIGFyZQotICBwb3NzaWJsZSwgYnV0IG5vdCB1c2VkLCB3b3VsZG4ndCB3b3JrIHdpdGggSDI2MyBzdHVmZi4gKi8KLQotICAgICAgICBpZiggYkF2b2lkT3BlbmluZ1ZpZGVvRGVjICYmIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBPb3BzISBUaGUgbWVyZSBhY3Qgb2Ygb3BlbmluZyB0aGUgZGVjb2RlciBhbHNvIHJlc3VsdHMgaW4gdGhlIGltYWdlIHNpemUgYmVpbmcKLSAgICAgICAgICAgIGZpbGxlZCBpbiB0aGUgdmlkZW8gc3RyZWFtISBDb21wZW5zYXRlIGZvciB0aGlzIGJ5IHVzaW5nIFBhcnNlVmlkZW9EU0kgdG8gZmlsbAotICAgICAgICAgICAgdGhpcyBpbmZvLiAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogTXBlZzQgc3RyZWFtOyB2aWQgZGVjIG5vdCBzdGFydGVkIik7Ci0gICAgICAgICAgICBlcnIgPSBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSShwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmZHVtbXksICZ2aWRlb1NpemVGcm9tRFNJKTsKLQotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fdmlkZW9XaWR0aCA9IHZpZGVvU2l6ZUZyb21EU0kubV91aVdpZHRoOwotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQgPQotICAgICAgICAgICAgICAgIHZpZGVvU2l6ZUZyb21EU0kubV91aUhlaWdodDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IE1wNC9IMjYzL0gyNjQgc3RyZWFtOyBzZXQgY3VycmVudCB2aWQgZGVjIik7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlcigmcENsaXBDdHh0LT5TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICAgICAgICAgIGRlY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGE7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlKAotICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlciwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCwKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5WaWRlb0FVLCBkZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICBpZiggKCAoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEKSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgfHwgKCgoTTRPU0FfVUludDMyKU00RVJSX0RFQ09ERVJfSDI2M19OT1RfQkFTRUxJTkUpID09IGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogT3VyIGRlY29kZXIgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBIMjYzIHByb2ZpbGUgb3RoZXIgdGhhbiAwLgotICAgICAgICAgICAgICAgICogU28gaXQgcmV0dXJucyB0aGlzIGludGVybmFsIGVycm9yIGNvZGUuCi0gICAgICAgICAgICAgICAgKiBXZSB0cmFuc2xhdGUgaXQgdG8gb3VyIG93biBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IFZpZCBkZWMgc3RhcnRlZDsgcFZpRGVjQ3R4dD0weCV4IiwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQpOwotCi0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YwotICAgICAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbHRlck9wdGlvbi5tX3BGaWx0ZXJGdW5jdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopICZNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMDsKLSAgICAgICAgICAgICAgICBGaWx0ZXJPcHRpb24ubV9wRmlsdGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmRmlsdGVyT3B0aW9uKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uXAotICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIgT0siKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdCBBdWRpbyBkZWNvZGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyKHBDbGlwQ3R4dCk7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBBdWRpbyBkZWMgc3RhcnRlZDsgY29udGV4dD0weCV4IiwKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3N0cmVhbUlEID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zaXplID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fRFRTID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fYXR0cmlidXRlID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fbWF4c2l6ZSA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3N0cnVjdFNpemUgPSBzaXplb2YocENsaXBDdHh0LT5BdWRpb0FVKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIGxvbmdlc3Qgc3RyZWFtICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJBbmFseXNlZCApCi0gICAgewotICAgICAgICAvKiBJZiBhbHJlYWR5IGNhbGN1bGF0ZWQgc2V0IGl0IHRvIHByZXZpb3VzIHZhbHVlICovCi0gICAgICAgIC8qIEJlY2F1c2UgZmFzdCBvcGVuIGFuZCBmdWxsIG9wZW4gY2FuIHJldHVybiBhIGRpZmZlcmVudCB2YWx1ZSwKLSAgICAgICAgICAgaXQgY2FuIG1pc21hdGNoIHVzZXIgc2V0dGluZ3MgKi8KLSAgICAgICAgLyogVmlkZW8gdHJhY2sgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBhdWRpbyB0cmFjayAoaWYgdmlkZW8gdHJhY2sgaXMgc2hvcnRlciB0aGFuCi0gICAgICAgICAgIGF1ZGlvIHRyYWNrLCBpdCBjYW4gbGVkIHRvIGN1dCBsYXJnZXIgdGhhbiBleHBlY3RlZCkgKi8KLSAgICAgICAgaUR1cmF0aW9uID0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0KLSAgICAgICAgaWYoIGlEdXJhdGlvbiA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgaUR1cmF0aW9uID0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEVsc2UgY29tcHV0ZSBpdCBmcm9tIHN0cmVhbXMgKi8KLSAgICAgICAgaUR1cmF0aW9uID0gMDsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlEdXJhdGlvbiA9IChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSkgJiYgKChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbikKLSAgICAgICAgICAgID4gaUR1cmF0aW9uKSAmJiBpRHVyYXRpb24gPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlEdXJhdGlvbiA9IChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiBlbmQgdGltZSBpcyBub3QgdXNlZCwgd2Ugc2V0IGl0IHRvIHRoZSB2aWRlbyB0cmFjayBkdXJhdGlvbiAqLwotICAgIGlmKCAwID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT51aUVuZEN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnVpRW5kQ3V0VGltZSA9IChNNE9TQV9VSW50MzIpaUR1cmF0aW9uOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+aUVuZFRpbWUgPSAoTTRPU0FfSW50MzIpcENsaXBDdHh0LT5wU2V0dGluZ3MtPnVpRW5kQ3V0VGltZTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soKQotICogQGJyaWVmICAgIERlbGV0ZSB0aGUgYXVkaW8gdHJhY2suIENsaXAgd2lsbCBiZSBsaWtlIGlmIGl0IGhhZCBubyBhdWRpbyB0cmFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgLyoqCi0gICAgKiBCdXQgd2UgZG9uJ3QgaGF2ZSB0byBmcmVlIHRoZSBhdWRpbyBzdHJlYW0uIEl0IHdpbGwgYmUgZnJlZWQgYnkgdGhlIHJlYWRlciB3aGVuIGNsb3NpbmcgaXQqLwotICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogV2Ugd2lsbCByZXR1cm4gYSBjb25zdGFudCBzaWxlbmNlIEFNUiBBVS4KLSAgICAqIFdlIHNldCBpdCBoZXJlIG9uY2UsIGluc3RlYWQgb2YgYXQgZWFjaCByZWFkIGF1ZGlvIHN0ZXAuICovCi0gICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhOwotICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAoaXQgbmVlZHMgdG8gYmUgcmUtYWxsb2NhdGVkIHRvIHN0b3JlIHNpbGVuY2UKLSAgICAgIGZyYW1lIGV2ZW50dWFsbHkpKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdXJyZW50VGltZSgpCi0gKiBAYnJpZWYgICAgSnVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGFuZCBkZWNvZGUgdXAgdG8gdGhlIGN1cnJlbnQgdmlkZW8gdGltZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBpQ3RzICAgICAgICAoSU4pIFRhcmdldCBDVFMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpQ3RzICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpUmFwQ3RzLCBpQ2xpcEN0czsKLSAgICBNNF9NZWRpYVRpbWUgZERlY29kZVRpbWU7Ci0gICAgTTRPU0FfQm9vbCBiQ2xpcEp1bXAgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIHRoZSB0aW1lIGluIHRoZSBjbGlwIGJhc2UgKi8KLSAgICBpQ2xpcEN0cyA9IGlDdHMgLSBwQ2xpcEN0eHQtPmlWb2Zmc2V0OwotCi0gICAgLyoqCi0gICAgKiBJZiB3ZSB3ZXJlIHJlYWRpbmcgdGhlIGNsaXAsIHdlIG11c3QganVtcCB0byB0aGUgcHJldmlvdXMgUkFQCi0gICAgKiB0byBkZWNvZGUgZnJvbSB0aGF0IHBvaW50LiAqLwotICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCA9PSBwQ2xpcEN0eHQtPlZzdGF0dXMgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogVGhlIGRlY29kZXIgbXVzdCBiZSB0b2xkIHRvIGp1bXAgKi8KLSAgICAgICAgYkNsaXBKdW1wID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgPSBpQ2xpcEN0czsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBSZW1lbWJlciB0aGUgY2xpcCByZWFkaW5nIHN0YXRlICovCi0gICAgICAgIHBDbGlwQ3R4dC0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB3ZSBhcmUgaW4gZGVjb2RlVXBUbygpIHByb2Nlc3MsIGNoZWNrIGlmIHdlIG5lZWQgdG8gZG8KLSAgICBvbmUgbW9yZSBzdGVwIG9yIGlmIGRlY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gPT0gcENsaXBDdHh0LT5Wc3RhdHVzICkKLSAgICB7Ci0gICAgICAgIC8qIERvIGEgc3RlcCBvZiA1MDAgbXMgZGVjb2RpbmcgKi8KLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgKz0gNTAwOwotCi0gICAgICAgIGlmKCBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyA+IGlDbGlwQ3RzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGFyZ2V0IHRpbWUgcmVhY2hlZCwgd2Ugc3dpdGNoIGJhY2sgdG8gREVDT0RFIG1vZGUgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gaUNsaXBDdHM7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPlZzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoImMgLCwsLCBkZWNvZGUgdXAgdG8gOiAlbGQiLCBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEp1c3QgZGVjb2RlIGF0IGN1cnJlbnQgY2xpcCBjdHMgKi8KLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgPSBpQ2xpcEN0czsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiZCAsLCwsIGRlY29kZSB1cCB0byA6ICVsZCIsIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIERlY29kZSB1cCB0byB0aGUgdGFyZ2V0ICovCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0czogRGVjb2RpbmcgdXBUbyBDVFMgJS4zZiwgcENsaXBDdHh0PTB4JXgiLAotICAgICAgICBkRGVjb2RlVGltZSwgcENsaXBDdHh0KTsKLQotICAgIGREZWNvZGVUaW1lID0gKE00T1NBX0RvdWJsZSlwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0czsKLSAgICBwQ2xpcEN0eHQtPmlzUmVuZGVyRHVwID0gTTRPU0FfRkFMU0U7Ci0gICAgZXJyID0KLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZShwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICZkRGVjb2RlVGltZSwgYkNsaXBKdW1wLCAwKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpCi0gICAgICAgICYmIChlcnIgIT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzOiBtX3BGY3REZWNvZGUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5pc1JlbmRlckR1cCA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHM6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCkKLSAqIEBicmllZiAgICBSZWFkIG9uZSBBVSBmcmFtZSBpbiB0aGUgY2xpcAotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKAotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBOTyBBVURJTyAtLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgewotICAgICAgICAvKiBJZiB0aGVyZSBpcyBubyBhdWRpbyB0cmFjaywgd2UgcmV0dXJuIHNpbGVuY2UgQVVzICovCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzICs9IHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJiICMjIyMgYmxhbmsgdHJhY2siKTsKLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBBTVItTkIsIEVWUkMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIGVsc2UgaWYoICggTTRWSURFT0VESVRJTkdfa0FNUl9OQgotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKQotICAgICAgICB8fCAoTTRWSURFT0VESVRJTkdfa0VWUkMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTm8gQVUgYXZhaWxhYmxlLCBzbyB3ZSBtdXN0IG11c3QgcmVhZCBvbmUgZnJvbSB0aGUgb3JpZ2luYWwgdHJhY2sgcmVhZGVyICovCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCB0aGUgY3VycmVudCBBTVIgZnJhbWUgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVhZCBBVSAqLwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzczsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBBTVIgZnJhbWUgQ1RTICovCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgICAgICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCAoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyKSAmJiAoTTRWSURFT0VESVRJTkdfa0FNUl9OQgotICAgICAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHRoZXJlIGlzIGxlc3MgYXVkaW8gdGhhbiB0aGUgc3RyZWFtIGR1cmF0aW9uIGluZGljYXRlZCwKLSAgICAgICAgICAgICAgICAqIHdlIHJldHVybiBzaWxlbmNlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gKi8KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0gcENsaXBDdHh0LT51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJhICMjIyMgc2lsZW5jZSBBVSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBNNFdBUl9OT19NT1JFX0FVICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSAoc2lsZW5jZSkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyoqPCBmYXRhbCBlcnJvciAob3Igbm8gc2lsZW5jZSBpbiBFVlJDKSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BTVI6IG1fcEZjdEdldE5leHRBdSgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIGJBdWRpb0ZyYW1lQXZhaWxhYmxlICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBHbyB0byB0aGUgbmV4dCBBTVIgZnJhbWUgaW4gdGhlIEFVICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyICs9IHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluY3JlbWVudCBDVFM6IG9uZSBBTVIgZnJhbWUgaXMgMjAgbXMgbG9uZyAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlZCBBTVIgZnJhbWUgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9BTVJOQigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0cik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0VWUkMoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAwID09IHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogQVUgZnJhbWUgc2l6ZSA9PSAwLFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQU1SX0FVIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID4gcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogQVUgZnJhbWUgc2l6ZSBncmVhdGVyIHRoYW4gQVUgc2l6ZSEsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BTVJfQVUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGlmIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgQVUgaGFzIGJlZW4gcmVhY2hlZCBvciBub3QgKi8KLSAgICAgICAgaWYoICggcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciArIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSkKLSAgICAgICAgICAgIDwgKHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzICsgcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmJBdWRpb0ZyYW1lQXZhaWxhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOyAvKio8IHdpbGwgYmUgdXNlZCBmb3IgbmV4dCBjYWxsICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBBQUMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIGVsc2UgaWYoICggTTRWSURFT0VESVRJTkdfa0FBQwotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKQotICAgICAgICB8fCAoTTRWSURFT0VESVRJTkdfa0FBQ3BsdXMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tlQUFDcGx1cwotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKSApCi0gICAgewotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbwotICAgICAgICAgICAgICAgICsgMC41KTsKLQotICAgICAgICAgICAgLyogUGF0Y2ggYmVjYXVzZSBtX0NUUyBpcyB1bmZvcnR1bmF0ZWx5IHJvdW5kZWQgaW4gM2dwIHJlYWRlciBzaGVsbCAqLwotICAgICAgICAgICAgLyogKGN0cyBpcyBub3QgYW4gaW50ZWdlciB3aXRoIGZyZXF1ZW5jeSAyNCBrSHogZm9yIGV4YW1wbGUpICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0gKCAoIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICArIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gMikKLSAgICAgICAgICAgICAgICAvIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uKQotICAgICAgICAgICAgICAgICogcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSWYgdGhlcmUgaXMgbGVzcyBhdWRpbyB0aGFuIHRoZSBzdHJlYW0gZHVyYXRpb24gaW5kaWNhdGVkLAotICAgICAgICAgICAgKiB3ZSByZXR1cm4gc2lsZW5jZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoImEgIyMjIyBzaWxlbmNlIEFVIik7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBNNFdBUl9OT19NT1JFX0FVICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BQUM6XAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVIChzaWxlbmNlKSIpOwotICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKio8IGZhdGFsIGVycm9yICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFBQzogbV9wRmN0R2V0TmV4dEF1KCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0gTVAzLCBvdGhlcnMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgJnBDbGlwQ3R4dC0+QXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCktTVAzOiBtX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzOwotICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPSAoTTRPU0FfVUludDE2KXBDbGlwQ3R4dC0+QXVkaW9BVS5tX3NpemU7Ci0gICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvCi0gICAgICAgICAgICArIDAuNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIENyZWF0ZXMgYW5kIGluaXRpYWxpemUgdGhlIGF1ZGlvIGRlY29kZXIgZm9yIHRoZSBjbGlwLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfU3RyZWFtVHlwZSBhdWRpb3R5cGU7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICBNNF9BQUNUeXBlIGlBYWNUeXBlID0gMDsKLQotI2VuZGlmCi0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcHJvcGVyIGF1ZGlvIGRlY29kZXIgKi8KLQotICAgIGF1ZGlvdHlwZSA9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGU7Ci0KLSAgICAvL0VWUkMKLSAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjCi0gICAgICAgICE9IGF1ZGlvdHlwZSApIC8qIGRlY29kZXIgbm90IHN1cHBvcnRlZCB5ZXQsIGJ1dCBhbGxvdyB0byBkbyBudWxsIGVuY29kaW5nICovCi0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoJnBDbGlwQ3R4dC0+U2hlbGxBUEksIGF1ZGlvdHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZXMgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2RlciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoKTogRmFpbHMgdG8gaW5pdGlhdGUgdGhlIGF1ZGlvIGRlY29kZXIuIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERVJfSU5JVF9GQUlMRUQ7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0ICkKLSAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcENsaXBDdHh0LT5TaGVsbEFQSS5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9QY20gIT0gYXVkaW90eXBlKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgIE00T1NBX05VTEwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlY1wKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgQ3JlYXRpbmcgZXh0ZXJuYWwgYXVkaW8gZGVjb2RlciBvZiB0eXBlIDB4JXgiLCBhdWRpb3R5cGUpOwotICAgICAgICAgICAgLyogRXh0ZXJuYWwgT01YIGNvZGVjcyBhcmUgdXNlZCovCi0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEFBQyBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgICAgICAgICAgLypnZXQgZnJvbSBSZWFkZXI7IHRlbXBvcmFyeSwgdGlsbCBBdWRpbyBkZWNvZGVyIHNoZWxsIEFQSQotICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBnZXQgdGhlIEFBQyBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMocENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmaUFhY1R5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBlcnIgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpQWFjVHlwZSA9IE00X2tBQUM7IC8vc2V0IHRvIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBzdHJlYW1UeXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlBYWNUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIGlBYWNUeXBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFFeHRlbnNpb25TYW1wRnJlcSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6IEFBQyBOQkNoYW5zPSVkLCBTYW1wbEZyZXE9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2Vsc2UKLSAgICAgICAgLyogVHJpY2ssIEkgdXNlIHBVc2VyRGF0YSB0byByZXRyaWV2ZSBhYWMgcHJvcGVydGllcywKLSAgICAgICAgICAgd2FpdGluZyBmb3Igc29tZSBiZXR0ZXIgaW1wbGVtZW50YXRpb24uLi4gKi8KLQotICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwgJihwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICBNNE9TQV9OVUxMIC8qIHRvIGJlIGNoYW5nZWQgd2l0aCBIVyBpbnRlcmZhY2VzICovKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICB9Ci0KLSAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogQU1SIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogRVZSQyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBub3RoaW5nIHNwZWNpZmljIHRvIGRvICovCi0gICAgfQotICAgIGVsc2UgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogTVAzIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICB7Ci0gICAgICAgIC8qIEFBQyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBEZWNvZGUgaGlnaCBxdWFsaXR5IGFhYyBidXQgZGlzYWJsZSBQUyBhbmQgU0JSICovCi0gICAgICAgIC8qIEJlY2F1c2Ugd2UgaGF2ZSB0byBtaXggZGlmZmVyZW50IGtpbmQgb2YgQUFDIHNvIHdlIG11c3QgdGFrZSB0aGUgbG93ZXN0IGNhcGFiaWxpdHkgKi8KLSAgICAgICAgLyogSW4gTUNTIGl0IHdhcyBub3QgbmVlZGVkIGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgc3RyZWFtICovCi0gICAgICAgIE00X0FhY0RlY29kZXJDb25maWcgQWFjRGVjUGFyYW07Ci0KLSAgICAgICAgQWFjRGVjUGFyYW0ubV9BQUNEZWNvZGVyUHJvZmlsZSA9IEFBQ19rQUFDOwotICAgICAgICBBYWNEZWNQYXJhbS5tX0Rvd25TYW1wbGluZ01vZGUgPSBBQUNfa0RTX09GRjsKLQotICAgICAgICBpZiggTTRFTkNPREVSX2tNb25vID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa01vbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa1N0ZXJlbzsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgIE00QURfa09wdGlvbklEX1VzZXJQYXJhbSwgKE00T1NBX0RhdGFPcHRpb24pICZBYWNEZWNQYXJhbSk7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjICkgewotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEXzNncFJlYWRlckludGVyZmFjZSwKLSAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCk7Ci0KLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF9BdWRpb0FVLAotICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjICkKLSAgICB7Ci0gICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZCBpbiBhbGwgZGVjb2RlcnMgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0YXJ0QXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6XAotICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0KLSAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgKiBzaXplb2YoTTRPU0FfSW50MTYpLAotICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigpOlwKLSAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCkKLSAqIEBicmllZiAgICBEZWNvZGUgdGhlIGN1cnJlbnQgQVVESU8gZnJhbWUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKAotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBTaWxlbmNlIG1vZGUgKi8KLSAgICBpZiggcENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YQotICAgICAgICA9PSAoTTRPU0FfVUludDggKilwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlTaWxlbmNlUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX0ludDE2KSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFAsKE00T1NBX0NoYXIgKikgIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIEF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbGwgaXQgd2l0aCAwICg9IHBjbSBzaWxlbmNlKSAqLwotICAgICAgICBtZW1zZXQocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLDAsCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKiBzaXplb2YoTTRPU0FfSW50MTYpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QQ00pCi0gICAgewotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOCkgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0cjsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSAgPSBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemU7Ci0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgKHZvaWQgKilwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcywgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBTdGFuZGFyZCBkZWNvZGluZyBtb2RlICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRGVjb2RlIGN1cnJlbnQgQU1SIGZyYW1lICovCi0gICAgICAgIGlmICggcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciAhPSBNNE9TQV9OVUxMICkgewotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyOwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fdGltZVN0YW1wVXMgPQotICAgICAgICAgICAgIChpbnQ2NF90KSAocENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyAqIDEwMDBMTCk7Ci0KLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4sICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0LAotICAgICAgICAgICAgIE00T1NBX0ZBTFNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFBhc3MgTnVsbCBpbnB1dCBidWZmZXIKLSAgICAgICAgICAgIC8vIFJlYWRlciBpbnZva2VkIGZyb20gQXVkaW8gZGVjb2RlciBzb3VyY2UKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgIE00T1NBX05VTEwsICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0LAotICAgICAgICAgICAgIE00T1NBX0ZBTFNFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCk6XAotICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKQotICogQGJyaWVmICAgIEp1bXAgaW4gdGhlIGF1ZGlvIHRyYWNrIG9mIHRoZSBjbGlwLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwSnVtcEN0cyAgICAgICAgICAgIChJTi9PVVQpIGluOnRhcmdldCBDVFMsIG91dDogcmVhY2hlZCBDVFMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcEp1bXBDdHMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfSW50MzIgaVRhcmdldEN0czsKLSAgICBNNE9TQV9JbnQzMiBpSnVtcEN0c01zOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwQ3R4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQ6IHBDbGlwQ3R4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBKdW1wQ3RzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdDogcEp1bXBDdHMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaVRhcmdldEN0cyA9ICpwSnVtcEN0czsKLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8gc3RyZWFtLCB3ZSBzaW11bGF0ZSBhIGp1bXAgYXQgdGhlIHRhcmdldCBqdW1wIENUUyAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIHRoZSB0YXJnZXQgQ1RTIHdpbGwgYmUgcmVhY2hlZCBhdCBuZXh0IFJlYWRGcmFtZSBjYWxsICh0aHVzIHRoZSAtMjApICovCi0gICAgICAgICpwSnVtcEN0cyA9IGlUYXJnZXRDdHMgLSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAvKiBQYXRjaCBiZWNhdXNlIG1fQ1RTIGlzIHVuZm9ydHVuYXRlbHkgcm91bmRlZCBpbiAzZ3AgcmVhZGVyIHNoZWxsICovCi0gICAgICAgIC8qIChjdHMgaXMgbm90IGFuIGludGVnZXIgd2l0aCBmcmVxdWVuY3kgMjQga0h6IGZvciBleGFtcGxlKSAqLwotICAgICAgICAqcEp1bXBDdHMgPSAoICggKnBKdW1wQ3RzICsgcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyAyKQotICAgICAgICAgICAgLyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbikKLSAgICAgICAgICAgICogcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgKgotICAgICAgICAgICAgcEp1bXBDdHM7IC8qIHNpbXVsYXRlIGEgcmVhZCBhdCBqdW1wIHBvc2l0aW9uIGZvciBsYXRlciBzaWxlbmNlIEFVcyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9JbnQzMiBjdXJyZW50X3RpbWUgPSAwOwotICAgICAgICBNNE9TQV9JbnQzMiBsb29wX2NvdW50ZXIgPSAwOwotCi0gICAgICAgIGlmKCAoTTREQV9TdHJlYW1UeXBlQXVkaW9NcDMKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUoICggbG9vcF9jb3VudGVyIDwgTTRWU1MzR1BQX01QM19KVU1QRURfQVVfTlVNQkVSX01BWCkKLSAgICAgICAgICAgICAgICAmJiAoY3VycmVudF90aW1lIDwgaVRhcmdldEN0cykgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQ6IG1fcEZjdEdldE5leHRBdSgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGN1cnJlbnRfdGltZSA9IChNNE9TQV9JbnQzMilwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFM7Ci0gICAgICAgICAgICAgICAgbG9vcF9jb3VudGVyKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGUgY3VycmVudCBBVSBpcyBzdG9yZWQgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvCi0gICAgICAgICAgICAgICAgKyAwLjUpOwotCi0gICAgICAgICAgICAqcEp1bXBDdHMgPSBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgaW4gdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgaUp1bXBDdHNNcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKSgqcEp1bXBDdHMgLyBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZpSnVtcEN0c01zKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTogbV9wRmN0SnVtcCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKnBKdW1wQ3RzID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKGlKdW1wQ3RzTXMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgLyogUGF0Y2ggYmVjYXVzZSBtX0NUUyBpcyB1bmZvcnR1bmF0ZWx5IHJvdW5kZWQgaW4gM2dwIHJlYWRlciBzaGVsbCAqLwotICAgICAgICAgICAgLyogKGN0cyBpcyBub3QgYW4gaW50ZWdlciB3aXRoIGZyZXF1ZW5jeSAyNCBrSHogZm9yIGV4YW1wbGUpICovCi0gICAgICAgICAgICAqcEp1bXBDdHMgPSAoICggKnBKdW1wQ3RzICsgcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyAyKQotICAgICAgICAgICAgICAgIC8gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24pCi0gICAgICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPSAwOyAvKiBObyBmcmFtZSByZWFkIHlldCAqLwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVG8gZGV0ZWN0IHNvbWUgbWF5LWJlIGJ1Z3MsIEkgcHJlZmVyIHRvIHJlc2V0IGFsbCB0aGVzZSBhZnRlciBhIGp1bXAgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSW4gQU1SLCB3ZSBoYXZlIHRvIG1hbmFnZSBtdWx0aS1mcmFtZWQgQVVzLAotICAgICAgICAgICAgYnV0IGFsc28gaW4gQUFDIHRoZSBqdW1wIGNhbiBiZSAxIEFVIHRvbyBtdWNoIGJhY2t3YXJkICovCi0gICAgICAgICAgICBpZiggKnBKdW1wQ3RzIDwgaVRhcmdldEN0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBKdW1wIGRvZXNuJ3QgcmVhZCBhbnkgQVUsIHdlIG11c3QgcmVhZCBhdCBsZWFzdCBvbmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcEN0eHQpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShhKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlYWQgQVUgZnJhbWVzIGFzIGxvbmcgYXMgd2UgcmVhY2ggdGhlIEFVIGJlZm9yZSB0aGUgdGFyZ2V0IENUUwotICAgICAgICAgICAgICAgICogKHNvIHRoZSB0YXJnZXQgd2lsbCBiZSByZWFjaGVkIHdoZW4gdGhlIHVzZXIgY2FsbCBSZWFkTmV4dEF1ZGlvRnJhbWUpLiAqLwotICAgICAgICAgICAgICAgIHdoaWxlKCBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIDwgKGlUYXJnZXRDdHMgLSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShiKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXR1cm4gdGhlIENUUyB0aGF0IHdpbGwgYmUgcmVhY2hlZCBhdCBuZXh0IFJlYWRGcmFtZSAqLwotICAgICAgICAgICAgICAgICpwSnVtcEN0cyA9IHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgKyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCkKLSAqIEBicmllZiAgICBDbG9zZSBhIGNsaXAuIERlc3Ryb3kgdGhlIGNvbnRleHQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBJbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbG9zZSggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbG9zZTogcENsaXBDdHh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdmlkZW8gZGVjb2RlciBjb250ZXh0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlEZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZXN0cm95KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLSAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIGF1ZGlvIGRlY29kZXIgY29udGV4dCAgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2U6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBVSBpcyBhbGxvY2F0ZWQgYnkgcmVhZGVyLgotICAgICogSWYgbm8gYXVkaW8gdHJhY2ssIGF1ZGlvIEFVIGlzIHNldCBhdCAnc2lsZW50JyAoU0lEKSBieSBWU1MuCi0gICAgKiBBcyBhIGNvbnNlcXVlbmNlLCBpZiBhdWRpbyBBVSBpcyBzZXQgdG8gJ3NpbGVudCcgKHN0YXRpYykKLSAgICBpdCBjYW4ndCBiZSBmcmVlIHVubGVzcyBpdCBpcyBzZXQgdG8gTlVMTCAqLwotICAgIGlmKCAoIChNNE9TQV9NZW1BZGRyOClNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4Ci0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKQotICAgICAgICB8fCAoKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEKLSAgICAgICAgPT0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MpICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdENsb3NlKAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoKTogbV9wUmVhZGVyLT5tX3BGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZXN0cm95IHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgY29udGV4dCAqLwotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0RGVzdHJveSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCk6IG1fcFJlYWRlci0+bV9wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoQ3R4dD0weCV4KTogcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICBwQ2xpcEN0eHQpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1IsIGVycjI7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbGVhblVwOiBwQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSB2aWRlbyBkZWNvZGVyIGNvbnRleHQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlc3Ryb3koCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQpOwotICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgYXVkaW8gZGVjb2RlciBjb250ZXh0ICAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXA6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgZXJyID0gZXJyMjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBVSBpcyBhbGxvY2F0ZWQgYnkgcmVhZGVyLgotICAgICogSWYgbm8gYXVkaW8gdHJhY2ssIGF1ZGlvIEFVIGlzIHNldCBhdCAnc2lsZW50JyAoU0lEKSBieSBWU1MuCi0gICAgKiBBcyBhIGNvbnNlcXVlbmNlLCBpZiBhdWRpbyBBVSBpcyBzZXQgdG8gJ3NpbGVudCcgKHN0YXRpYykKLSAgICBpdCBjYW4ndCBiZSBmcmVlIHVubGVzcyBpdCBpcyBzZXQgdG8gTlVMTCAqLwotICAgIGlmKCAoIChNNE9TQV9NZW1BZGRyOClNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4Ci0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKQotICAgICAgICB8fCAoKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEKLSAgICAgICAgPT0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MpICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgKi8KLSAgICAgICAgZXJyMiA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVycjIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCk6IG1fcFJlYWRlci0+bV9wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZXN0cm95IHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgY29udGV4dCAqLwotICAgICAgICBlcnIyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdERlc3Ryb3koCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgpOiBtX3BSZWFkZXItPm1fcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZihwQ2xpcEN0eHQtPnBQbGFuZVl1diAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGlmKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1diA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0ICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgaWYocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QpOwotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHNoZWxscyBpbnRlcmZhY2VzICovCi0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcDogcENsaXBDdHh0PTB4JXgiLCBwQ2xpcEN0eHQpOwotICAgIC8qKgotICAgICogRnJlZSB0aGUgY2xpcCBjb250ZXh0ICovCi0gICAgZnJlZShwQ2xpcEN0eHQpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9BTVJOQigpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBBTVIgTmFycm93LUJhbmQgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQXVkaW9GcmFtZSAgIChJTikgQU1STkIgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICkKLXsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVUeXBlID0gKCAoICpwQXVkaW9GcmFtZSkgJigweEYgPDwgMykpID4+IDM7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA5NTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNDc1MCBicHMgKi8KLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxMDM7Ci0gICAgICAgICAgICBicmVhazsgLyogIDUxNTAgYnBzICovCi0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTE4OwotICAgICAgICAgICAgYnJlYWs7IC8qICA1OTAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDEzNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNjcwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNDg7Ci0gICAgICAgICAgICBicmVhazsgLyogIDc0MDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTU5OwotICAgICAgICAgICAgYnJlYWs7IC8qICA3OTUwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDIwNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAxMDIwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAyNDQ7Ci0gICAgICAgICAgICBicmVhazsgLyogMTIwMDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMzk7Ci0gICAgICAgICAgICBicmVhazsgLyogU0lEIChTaWxlbmNlKSAqLwotCi0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qIE5vIGRhdGEgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoKTogQ29ycnVwdGVkIEFNUiBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9FVlJDKCkKLSAqIEBicmllZiAgIFJldHVybiB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIEVWUkMgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiAgICAgMCAxIDIgMwotICogICAgKy0rLSstKy0rCi0gKiAgICB8ZnIgdHlwZXwgICAgICAgICAgICAgIFJGQyAzNTU4Ci0gKiAgICArLSstKy0rLSsKLSAqCi0gKiBGcmFtZSBUeXBlOiA0IGJpdHMKLSAqICAgIFRoZSBmcmFtZSB0eXBlIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBkYXRhCi0gKiAgICBmcmFtZSBpbiB0aGUgUlRQIHBhY2tldC4KLSAqCi0gKiBGb3IgRVZSQyBhbmQgU01WIGNvZGVjcywgdGhlIGZyYW1lIHR5cGUgdmFsdWVzIGFuZCBzaXplIG9mIHRoZQotICogYXNzb2NpYXRlZCBjb2RlYyBkYXRhIGZyYW1lIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93OgotICoKLSAqIFZhbHVlICAgUmF0ZSAgICAgIFRvdGFsIGNvZGVjIGRhdGEgZnJhbWUgc2l6ZSAoaW4gb2N0ZXRzKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgIDAgICAgIEJsYW5rICAgICAgMCAgICAoMCBiaXQpCi0gKiAgIDEgICAgIDEvOCAgICAgICAgMiAgICAoMTYgYml0cykKLSAqICAgMiAgICAgMS80ICAgICAgICA1ICAgICg0MCBiaXRzOyBub3QgdmFsaWQgZm9yIEVWUkMpCi0gKiAgIDMgICAgIDEvMiAgICAgICAxMCAgICAoODAgYml0cykKLSAqICAgNCAgICAgMSAgICAgICAgIDIyICAgICgxNzEgYml0czsgNSBwYWRkZWQgYXQgZW5kIHdpdGggemVyb3MpCi0gKiAgIDUgICAgIEVyYXN1cmUgICAgMCAgICAoU0hPVUxEIE5PVCBiZSB0cmFuc21pdHRlZCBieSBzZW5kZXIpCi0gKgotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgRVZSQyBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQyggTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKQotewotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVR5cGUgPSAoICpwQXVkaW9GcmFtZSkgJjB4MEY7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qICBibGFuayAqLwotCi0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE2OwotICAgICAgICAgICAgYnJlYWs7IC8qICAxLzggKi8KLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA0MDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMS80ICovCi0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgZnJhbWVTaXplID0gODA7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEvMiAqLwotCi0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE3MTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMSAqLwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsgLyogIGVyYXN1cmUgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQygpOiBDb3JydXB0ZWQgRVZSQyBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNEFEX0J1ZmZlciBvdXRwdXRCdWZmZXI7Ci0gICAgdWludDMyX3Qgb3B0aW9uVmFsdWUgPTA7Ci0KLSAgICAvLyBEZWNvZGUgZmlyc3QgYXVkaW8gZnJhbWUgZnJvbSBjbGlwIHRvIGdldCBwcm9wZXJ0aWVzIGZyb20gY29kZWMKLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICYocENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzKSk7Ci0KLSAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlLAotICAgICAoTTRPU0FfRGF0YU9wdGlvbikgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQpOwotCi0gICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX0F1ZGlvQVUsCi0gICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgIGlmKCBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyAhPSBNNE9TQV9OVUxMICkgewotCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0KTsKLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzOiBcCi0gICAgICAgICAgICAgICAgIG1fcEZjdFN0YXJ0QXVkaW9EZWMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgb3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAqIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVTYW1wbGVTaXplCi0gICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLQotICAgIGlmKCBvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplID4gMCApIHsKLQotICAgICAgICBvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUgXAotICAgICAgICAgICAgKnNpemVvZihzaG9ydCksIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikib3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzICkgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgb3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00T1NBX05VTEwsICZvdXRwdXRCdWZmZXIsIE00T1NBX0ZBTFNFKTsKLQotICAgIGlmICggZXJyID09IE00V0FSX0lORk9fRk9STUFUX0NIQU5HRSApIHsKLQotICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnRpZXMgZnJvbSBjb2RlYyBub2RlCi0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9OYkNoYW5uZWxzLCAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW4gPSBvcHRpb25WYWx1ZTsKLSAgICAgICAgLy8gUmVzZXQgUmVhZGVyIHN0cnVjdHVyZSB2YWx1ZSBhbHNvCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPSBvcHRpb25WYWx1ZTsKLQotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9TYW1wRnJlcXVlbmN5LCAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxID0gb3B0aW9uVmFsdWU7Ci0gICAgICAgIC8vIFJlc2V0IFJlYWRlciBzdHJ1Y3R1cmUgdmFsdWUgYWxzbwotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IG9wdGlvblZhbHVlOwotCi0gICAgfSBlbHNlIGlmKCBlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgIG1fcEZjdFN0ZXBBdWRpb0RlYyByZXR1cm5zIGVyciA9IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIGZyZWUob3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MpOwotCi0gICAgLy8gUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIKLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0UmVzZXQoCi0gICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50Q2hlY2tBbmRHZXRDb2RlY0FhY1Byb3BlcnRpZXNcCi0gICAgICAgICAgICBFcnJvciBpbiByZXNldGluZyByZWFkZXI6IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyYzZkN2EuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKLSAqIEBicmllZiAgICBJbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgcmVsYXRlZCB0byBhbmFseXNpcyBvZiBpbnB1dCBjbGlwcwotICogQG5vdGUgICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIHN0YXRpYywgaS5lLiBub24gcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiAgICBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLQotCi0vKioKLSAqICAgIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKiBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qIE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiBhIGNsaXAgaXMgY29tcGF0aWJsZSB3aXRoIFZTUyAzR1BQIGVkaXRpbmcKLSAqIEBub3RlICAgIEl0IGFsc28gZmlsbHMgYSBDbGlwQW5hbHlzaXMgc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0d28KLSAqICAgICAgICBjbGlwcyBhcmUgY29tcGF0aWJsZQotICogQHBhcmFtICAgIHBDbGlwICAgICAgICAgICAgICAgIChJTikgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCAzR1BQL01QMyBjbGlwIGZpbGUuCi0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBDbGlwUHJvcGVydGllcyBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gICAgRmlsZVR5cGUgICAgICAgICAgICAoSU4pIFR5cGUgb2YgdGhlIGlucHV0IGZpbGUgKC4zZ3AsIC5hbXIsIC5tcDMpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVECi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0gyNjNfUFJPRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9QUk9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1JWTEMKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCggTTRPU0FfVm9pZCAqcENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdCApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIENsaXBTZXR0aW5nczsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCBjYWxsZWQgd2l0aCBwQ2xpcD0weCV4LCBwQ2xpcFByb3BlcnRpZXM9MHgleCIsCi0gICAgICAgIHBDbGlwLCBwQ2xpcFByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOiBwQ2xpcCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwUHJvcGVydGllcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6IHBDbGlwUHJvcGVydGllcyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEJ1aWxkIGR1bW15IGNsaXAgc2V0dGluZ3MsIGluIG9yZGVyIHRvIHVzZSB0aGUgZWRpdENsaXBPcGVuIGZ1bmN0aW9uICovCi0gICAgQ2xpcFNldHRpbmdzLnBGaWxlID0gcENsaXA7Ci0gICAgQ2xpcFNldHRpbmdzLkZpbGVUeXBlID0gRmlsZVR5cGU7Ci0gICAgQ2xpcFNldHRpbmdzLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICBDbGlwU2V0dGluZ3MudWlFbmRDdXRUaW1lID0gMDsKLQotICAgIC8qIENsaXAgcHJvcGVydGllcyBub3QgYnVpbGQgeWV0LCBzZXQgYXQgbGVhc3QgdGhpcyBmbGFnICovCi0gICAgQ2xpcFNldHRpbmdzLkNsaXBQcm9wZXJ0aWVzLmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBPcGVuIHRoZSBjbGlwIGluIGZhc3Qgb3BlbiBtb2RlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQ2xpcENvbnRleHQsIHBGaWxlUmVhZFB0ckZjdCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludENsaXBJbml0KCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEZyZWUgdGhlIGNsaXAgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcE9wZW4ocENsaXBDb250ZXh0LCAmQ2xpcFNldHRpbmdzLCBNNE9TQV9GQUxTRSwKLSAgICAgICAgTTRPU0FfVFJVRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludENsaXBPcGVuKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotCi0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEhlcmUgaXQgaXMgYmV0dGVyIHRvIHJldHVybiB0aGUgRWRpdGluZyBzcGVjaWZpYyBlcnJvciBjb2RlICovCi0gICAgICAgIGlmKCAoICgoTTRPU0FfVUludDMyKU00RVJSX0RFQ09ERVJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQpID09IGVycikKLSAgICAgICAgICAgIHx8ICgoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfTk9UX0JBU0VMSU5FKSA9PSBlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwT3BlbigpIHJldHVybnMgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFuYWx5c2UgdGhlIGNsaXAgKi8KLSAgICBpZihNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggIT0gcENsaXBDb250ZXh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlKSB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKHBDbGlwQ29udGV4dCwgcENsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJlZSB0aGUgY2xpcCAqLwotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwQ29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogRnJlZSB0aGUgY2xpcCAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UocENsaXBDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOiBNNFZTU19pbnRDbGlwQ2xvc2UoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayB0aGUgY2xpcCBpcyBjb21wYXRpYmxlIHdpdGggVlNTIGVkaXRpbmcgKi8KLSAgICBpZihNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggIT0gQ2xpcFNldHRpbmdzLkZpbGVUeXBlKSB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcocENsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIHR3byBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgZm9yCi0gKiAgICAgICAgVlNTIDNHUFAgZWRpdGluZyBhc3NlbWJseSBmZWF0dXJlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ2xpcDFQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIGZpcnN0IGNsaXAKLSAqIEBwYXJhbSAgICBwQ2xpcDJQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIHNlY29uZCBjbGlwCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRQotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19EQVRBX1BBUlRJVElPTklORwotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcDFQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgKnBDbGlwMlByb3BlcnRpZXMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiB2aWRlb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiBhdWRpb19lcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfQm9vbCBiQ2xpcDFJc0FBQyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkNsaXAySXNBQUMgPSBNNE9TQV9GQUxTRTsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkgY2FsbGVkIHdpdGggcENsaXAxQW5hbHlzaXM9MHgleCxcCi0gICAgICAgICAgICAgICAgICAgcENsaXAyQW5hbHlzaXM9MHgleCIsIHBDbGlwMVByb3BlcnRpZXMsIHBDbGlwMlByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXAxUHJvcGVydGllcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTogcENsaXAxUHJvcGVydGllcyBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwMlByb3BlcnRpZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHk6IHBDbGlwMlByb3BlcnRpZXMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaWYoICggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyA9PSBwQ2xpcDFQcm9wZXJ0aWVzLT5GaWxlVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVIgPT0gcENsaXAxUHJvcGVydGllcy0+RmlsZVR5cGUpICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQ2xpcDFQcm9wZXJ0aWVzICE9IHBDbGlwMlByb3BlcnRpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OiBNUDMgQ0FOIE9OTFkgQkUgQ1VULFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX01QM19BU1NFTUJMWTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdlIGFyZSBpbiBWU1MgU3BsaXR0ZXIgbW9kZSAqLwotICAgICAgICAgICAgZ290byBhdWRpb19hbmFseXNpczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqIEF1ZGlvICoqKioqKioqKioqKi8KLQotYXVkaW9fYW5hbHlzaXM6Ci0gICAgaWYoIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gIT0gcENsaXAxUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQUFDICovCi0gICAgICAgIHN3aXRjaCggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgIGJDbGlwMUlzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwQ2xpcDJQcm9wZXJ0aWVzLT4KLSAgICAgICAgQXVkaW9TdHJlYW1UeXBlICkgLyoqPCBpZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGF1ZGlvIGZvcm1hdCBpcyBBQUMgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgYkNsaXAySXNBQUMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8sIHRoZSBjbGlwcyBhcmUgY29tcGF0aWJsZXMgLi4uICovCi0gICAgaWYoICggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICE9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8pCi0gICAgICAgICYmIChwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbykgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBoYXZlIHNhbWUgYXVkaW8gc3RyZWFtIHR5cGUKLSAgICAgICAgKiBBbmQgbGV0X3Mgc2F5IEFBQywgQUFDKyBhbmQgZUFBQysgYXJlIG1peGFibGUgKi8KLSAgICAgICAgaWYoICggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAhPSBwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUpCi0gICAgICAgICAgICAmJiAoKCBNNE9TQV9GQUxTRSA9PSBiQ2xpcDFJc0FBQykgfHwgKE00T1NBX0ZBTFNFID09IGJDbGlwMklzQUFDKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgICAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIEF1ZGlvIFN0cmVhbSBUeXBlIik7Ci0KLSAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NUUkVBTV9UWVBFOwotICAgICAgICAgICAgZ290byBhbmFseXNpc19kb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBoYXZlIHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgICAgIGlmKCBwQ2xpcDFQcm9wZXJ0aWVzLT51aU5iQ2hhbm5lbHMgIT0gcENsaXAyUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTogQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBOYiBvZiBDaGFubmVscyIpOwotICAgICAgICAgICAgYXVkaW9fZXJyID0gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fTkJfT0ZfQ0hBTk5FTFM7Ci0gICAgICAgICAgICBnb3RvIGFuYWx5c2lzX2RvbmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBib3RoIGNsaXBzIGhhdmUgc2FtZSBzYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICAgICAgaWYoIHBDbGlwMVByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICE9IHBDbGlwMlByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgICAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIFNhbXBsaW5nIEZyZXF1ZW5jeSIpOwotICAgICAgICAgICAgYXVkaW9fZXJyID0gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZOwotICAgICAgICAgICAgZ290byBhbmFseXNpc19kb25lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcENsaXAyUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotCi1hbmFseXNpc19kb25lOgotICAgIGlmKCB2aWRlb19lcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHJldHVybiB2aWRlb19lcnI7Ci0KLSAgICBpZiggYXVkaW9fZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICByZXR1cm4gYXVkaW9fZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKQotICogQGJyaWVmICAgIEdldCB2aWRlbyBhbmQgYXVkaW8gcHJvcGVydGllcyBmcm9tIHRoZSBjbGlwIHN0cmVhbXMKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gbXVzdCByZXR1cm4gZmF0YWwgZXJyb3JzIG9ubHkgKGVycm9ycyB0aGF0IHNob3VsZCBub3QgaGFwcGVuCi0gKiAgICAgICAgaW4gdGhlIGZpbmFsIGludGVncmF0ZWQgcHJvZHVjdCkuCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZhbGlkIENsaXBQcm9wZXJ0aWVzIHN0cnVjdHVyZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIERlY0NvbmZpZ0luZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSBkdW1teVNpemU7Ci0gICAgTTRERUNPREVSX0FWQ1Byb2ZpbGVMZXZlbCBBVkNQcm9mbGU7Ci0KLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCB2aWRlbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBWaWRlb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9NYXhBdVNpemUgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1RpbWVTY2FsZSA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5mQXZlcmFnZUZyYW1lUmF0ZSA9IDAuMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9Qcm9maWxlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0xldmVsID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNGRhdGFQYXJ0aXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJ2bGMgPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJlc3luY2hNYXJrZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIG1lbXNldCgodm9pZCAqKSAmcENsaXBQcm9wZXJ0aWVzLT5mdHlwLDAsCi0gICAgICAgIHNpemVvZihwQ2xpcFByb3BlcnRpZXMtPmZ0eXApKTsKLQotICAgIC8qKgotICAgICogVmlkZW8gQW5hbHlzaXMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgewotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9XaWR0aCA9IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0hlaWdodCA9IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvSGVpZ2h0OwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmZBdmVyYWdlRnJhbWVSYXRlID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0KLSAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVBFRzQ7Ci0KLSAgIC8qIFRoaXMgaXNzdWUgaXMgc28gaW5jcmVkaWJseSBzdHVwaWQgdGhhdCBpdCdzIGRlcHJlc3NpbmcuIEJhc2ljYWxseSwgYSBmaWxlIGNhbiBiZSBhbmFseXNlZAotICAgb3V0c2lkZSBvZiBhbnkgY29udGV4dCAoYmVzaWRlcyB0aGF0IG9mIHRoZSBjbGlwIGl0c2VsZiksIHNvIHRoYXQgZm9yIGluc3RhbmNlIHR3byBjbGlwcyBjYW4KLSAgIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkgYmVmb3JlIGFsbG9jYXRpbmcgYW4gZWRpdCBjb250ZXh0IGZvciBlZGl0aW5nIHRoZW0uIEJ1dCB0aGlzCi0gICBtZWFucyB0aGVyZSBpcyBubyB3YXkgaW4gaGVjayB0byBwYXNzIGFuIGV4dGVybmFsIHZpZGVvIGRlY29kZXIgKHRvIGJlZ2luIHdpdGgpIHRvIHRoaXMKLSAgIGZ1bmN0aW9uLCBhcyB0aGV5IHdvcmsgYnkgYmVpbmcgcmVnaXN0ZXJlZCBpbiBhbiBleGlzdGluZyBjb250ZXh0OyBmdXJ0aGVybW9yZSwgaXQgaXMgYWN0dWFsbHkKLSAgIHByZXR0eSBvdmVya2lsbCB0byB1c2UgYSBmdWxsIGRlY29kZXIgZm9yIHRoYXQsIG1vcmVzbyBhIEhBUkRXQVJFIGRlY29kZXIganVzdCB0byBnZXQgdGhlCi0gICBjbGlwIGNvbmZpZyBpbmZvLiBJbiBmYWN0LCB0aGUgaGFyZHdhcmUgaXRzZWxmIGRvZXNuJ3QgcHJvdmlkZSB0aGlzIHNlcnZpY2UsIGluIHRoZSBjYXNlIG9mIGEKLSAgIEhXIGRlY29kZXIsIHRoZSBzaGVsbCBidWlsZHMgdGhlIGNvbmZpZyBpbmZvIGl0c2VsZiwgc28gd2UgZG9uJ3QgbmVlZCB0aGUgYWN0dWFsIGRlY29kZXIsIG9ubHkKLSAgIGEgZGV0YWNoZWQgZnVuY3Rpb25hbGl0eSBvZiBpdC4gU28gaW4gY2FzZSBIVy9leHRlcm5hbCBkZWNvZGVycyBtYXkgYmUgcHJlc2VudCwgd2UgaW5zdGVhZCB1c2UKLSAgIGRpcmVjdGx5IHRoZSBEU0kgcGFyc2luZyBmdW5jdGlvbiBvZiB0aGUgc2hlbGwgSFcgZGVjb2RlciAod2hpY2ggd2Uga25vdyB0byBiZSBwcmVzZW50LCBzaW5jZQotICAgSFcgZGVjb2RlcnMgYXJlIHBvc3NpYmxlKSB0byBnZXQgdGhlIGNvbmZpZyBpbmZvLiBOb3RpY2UgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGV2ZW4gaWYgdGhlCi0gICBzb2Z0d2FyZSBkZWNvZGVyIGlzIGFjdHVhbGx5IHByZXNlbnQgYW5kIGV2ZW4gaWYgaXQgd2lsbCBlbmQgdXAgYmVpbmcgYWN0dWFsbHkgdXNlZDogZmlndXJpbmcKLSAgIG91dCB0aGUgY29uZmlnIGRvZXMgbm90IGludm9sdmUgYWN0dWFsIGRlY29kaW5nIG5vciB0aGUgcGFydGljdWxhcml0aWVzIG9mIGEgc3BlY2lmaWMgZGVjb2RlciwKLSAgIGl0J3MgdGhlIGZhY3QgdGhhdCBpdCdzIE1QRUc0IHRoYXQgbWF0dGVycywgc28gaXQgc2hvdWxkIG5vdCBiZSBmdW5jdGlvbmFsbHkgYW55IGRpZmZlcmVudAotICAgZnJvbSB0aGUgd2F5IGl0IHdhcyBkb25lIGJlZm9yZSAoYW5kIGl0J3MgbGlnaHQgZW5vdWdoIGZvciBwZXJmb3JtYW5jZSBub3QgdG8gYmUgYW55IHByb2JsZW0KLSAgICAgICAgIHdoYXRzb2V2ZXIpLiAqLwotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0kocENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRlY0NvbmZpZ0luZm8sICZkdW1teVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0kgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1RpbWVTY2FsZSA9Ci0gICAgICAgICAgICAgICAgICAgIERlY0NvbmZpZ0luZm8udWlUaW1lU2NhbGU7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRkYXRhUGFydGl0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgRGVjQ29uZmlnSW5mby5iRGF0YVBhcnRpdGlvbjsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJ2bGMgPQotICAgICAgICAgICAgICAgICAgICBEZWNDb25maWdJbmZvLmJVc2VPZlJWTEM7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRyZXN5bmNoTWFya2VyID0KLSAgICAgICAgICAgICAgICAgICAgRGVjQ29uZmlnSW5mby51aVVzZU9mUmVzeW5jaE1hcmtlcjsKLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChEZWNDb25maWdJbmZvLnVpUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1Byb2ZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTGV2ZWwpKTsKLSAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1QRUc0UHJvZmlsZUFuZExldmVsIHJldHVybnMgMHglMDhYIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICAvKiBIMjYzIHRpbWUgc2NhbGUgaXMgYWx3YXlzIDMwMDAwICovCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvVGltZVNjYWxlID0gMzAwMDA7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRIMjYzUHJvZmlsZUFuZExldmVsKHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9MZXZlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcygpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIGVyciA9IGdldEFWQ1Byb2ZpbGVBbmRMZXZlbChwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTGV2ZWwpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFWQ1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXM6IHVua25vd24gaW5wdXQgdmlkZW8gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgIC8qKiBXZSBkbyBub3QgcmV0dXJuIGVycm9yIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgKiAgVGhlIHZpZGVvIGZvcm1hdCBjb21wYXRpYmlsaXR5IGNoZWNrIHdpbGwgYmUgZG9uZSBsYXR0ZXIgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbiA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplOwotCi0gICAgICAgIC8qIGlmIHZpZGVvIGJpdHJhdGUgbm90IGF2YWlsYWJsZSByZXRyaWV2ZSBhbiBlc3RpbWF0aW9uIG9mIHRoZSBvdmVyYWxsIGJpdHJhdGUgKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0KLSAgICAgICAgaWYoIDAgPT0gcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0JpdHJhdGUpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogd2UgZ2V0IHRoZSBvdmVyYWxsIGJpdHJhdGUsIHN1YnN0cmFjdCB0aGUgYXVkaW8gYml0cmF0ZSBpZiBhbnkgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9CaXRyYXRlIC09Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXNldCBhdWRpbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW87Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9NYXhBdVNpemUgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlFeHRlbmRlZFNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpRGVjb2RlZFBjbVNpemUgPSAwOwotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBbmFseXNpcyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQU1SX05COwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQUFDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYzoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0VWUkM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9QY206Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tQQ007Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzOiB1bmtub3duIGlucHV0IGF1ZGlvIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiEiLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBXZSBkbyBub3QgcmV0dXJuIGVycm9yIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdWRpbyBmb3JtYXQgY29tcGF0aWJpbGl0eSBjaGVjayB3aWxsIGJlIGRvbmUgbGF0dGVyICovCi0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcEF1ZGlvRHVyYXRpb24gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbjsKLQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyA9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aURlY29kZWRQY21TaXplID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEJ1Z2ZpeCBQNE1FMDAwMDExMjg6IFdpdGggc29tZSBJTVRDIGZpbGVzLCB0aGUgQU1SIGJpdCByYXRlIGlzIDAga2JwcwotICAgICAgICBhY2NvcmRpbmcgdGhlIEdldFByb3BlcnRpZXMgZnVuY3Rpb24gKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0KLSAgICAgICAgaWYoIDAgPT0gcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rQU1SX05CID09IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqQmV0dGVyIHJldHVybmluZyBhIGd1ZXNzZWQgMTIuMiBrYnBzIHZhbHVlIHRoYW4gYSBzdXJlLXRvLWJlLWZhbHNlIDAga2JwcyB2YWx1ZSEqLwotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUgPSBNNFZTUzNHUFBfQU1SX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00VklERU9FRElUSU5HX2tFVlJDID09IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqQmV0dGVyIHJldHVybmluZyBhIGd1ZXNzZWQgOS4yIGticHMgdmFsdWUgdGhhbiBhIHN1cmUtdG8tYmUtZmFsc2UgMCBrYnBzIHZhbHVlISovCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FVlJDX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LCBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogd2UgZ2V0IHRoZSBvdmVyYWxsIGJpdHJhdGUsIHN1YnN0cmFjdCB0aGUgdmlkZW8gYml0cmF0ZSBpZiBhbnkgKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSAtPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIE5ldyBhYWMgcHJvcGVydGllcyAqLwotICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyA9IHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbjsKLSAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcTsKLQotICAgICAgICAgICAgaWYoIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQUFDcGx1czsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBHZXQgJ2Z0eXAnIGF0b20gKi8KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveCwgJnBDbGlwUHJvcGVydGllcy0+ZnR5cCk7Ci0KLSAgICAvKioKLSAgICAqIFdlIHdyaXRlIHRoZSBWU1MgM0dQUCB2ZXJzaW9uIGluIHRoZSBjbGlwIGFuYWx5c2lzIHRvIGJlIHN1cmUgdGhlIGludGVncmF0b3IgZG9lc24ndAotICAgICogbWl4IG9sZGVyIGFuYWx5c2lzIHJlc3VsdHMgd2l0aCBuZXdlciBsaWJyYXJpZXMgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SOwotICAgIHBDbGlwUHJvcGVydGllcy0+VmVyc2lvblsxXSA9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1I7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzJdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHBDbGlwUHJvcGVydGllcy0+RmlsZVR5cGUgPSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGU7Ci0KLSAgICBpZiggcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBWaWRlb0R1cmF0aW9uCi0gICAgICAgID4gcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uICkKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBEdXJhdGlvbiA9IHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICBlbHNlCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwRHVyYXRpb24gPSBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcEF1ZGlvRHVyYXRpb247Ci0KLSAgICAvKiBSZXNldCBjb21wYXRpYmlsaXR5IGNoYXJ0ICovCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5iVmlkZW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iVmlkZW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEFuYWx5c2lzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJBbmFseXNlZCA9IE00T1NBX1RSVUU7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKQotICogQGJyaWVmICAgIENoZWNrIGlmIHRoZSBjbGlwIGlzIGNvbXBhdGlibGUgd2l0aCBWU1MgZWRpdGluZwotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKAotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgKQotewotICAgIE00T1NBX1VJbnQzMiB1aU5iT2ZWYWxpZFN0cmVhbXMgPSAwOwotICAgIE00T1NBX0VSUiB2aWRlb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiBhdWRpb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIC8qKioqKioqKiogZmlsZSB0eXBlICoqKioqKioqKi8KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SID09IHBDbGlwUHJvcGVydGllcy0+RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZzpcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyA9PSBwQ2xpcFByb3BlcnRpZXMtPkZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBWaWRlbyAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbwotICAgICAgICAhPSBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYSB2aWRlbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qIENoZWNrIHZpZGVvIGZvcm1hdCBpcyBNUEVHLTQsIEgyNjMgb3IgSDI2NCAqLwotICAgICAgICBzd2l0Y2goIHBDbGlwUHJvcGVydGllcy0+VmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgICAgICB1aU5iT2ZWYWxpZFN0cmVhbXMrKzsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJWaWRlb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKjwgS08sIHdlIHJldHVybiBlcnJvciAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpOiB1bnN1cHBvcnRlZCB2aWRlbyBmb3JtYXQiKTsKLSAgICAgICAgICAgICAgICB2aWRlb19lcnIgPSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBBdWRpbyBvbmx5IHN0cmVhbSBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFZTUyBlZGl0aW5nIGZlYXR1cmUKLSAgICAgICAgKHVubGVzcyBpbiB0aGUgTVAzIGNhc2UpICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKTogTm8gdmlkZW8gc3RyZWFtIGluIGNsaXAiKTsKLSAgICAgICAgdmlkZW9fZXJyID0gTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqIEF1ZGlvICoqKioqKioqKi8KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwQ2xpcFByb3BlcnRpZXMtPgotICAgICAgICBBdWRpb1N0cmVhbVR5cGUgKSAvKio8IGlmIHRoZXJlIGlzIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYXVkaW8gZm9ybWF0IGlzIEFNUi1OQiwgRVZSQyBvciBBQUMgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIHVpTmJPZlZhbGlkU3RyZWFtcysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpTmJPZlZhbGlkU3RyZWFtcysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgIC8qPCBPSywgd2UgcHJvY2VlZCwgbm8gcmV0dXJuICovCi0gICAgICAgICAgICAgICAgdWlOYk9mVmFsaWRTdHJlYW1zKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qPCBLTywgd2UgcmV0dXJuIGVycm9yICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IHVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIpOwotICAgICAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU2lsZW5jZSBpcyBhbHdheXMgZWRpdGFibGUgKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB2YWxpZCBzdHJlYW0gaW4gdGhlIGZpbGUuLi4gKi8KLSAgICBpZiggdmlkZW9fZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICByZXR1cm4gdmlkZW9fZXJyOwotCi0gICAgaWYoIGF1ZGlvX2VyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgcmV0dXJuIGF1ZGlvX2VycjsKLQotICAgIGlmKCAwID09IHVpTmJPZlZhbGlkU3RyZWFtcyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IEZpbGUgY29udGFpbnMgbm8gc3VwcG9ydGVkIHN0cmVhbSxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIHR3byBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgZm9yCi0gKiAgICAgICAgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIGZlYXR1cmUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTikgQ29udGV4dCBvZiB0aGUgYXVkaW8gbWl4ZXIKLSAqIEBwYXJhbSAgICBwSW5wdXRDbGlwUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBmaXJzdCBjbGlwCi0gKiBAcGFyYW0gICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgc2Vjb25kIGNsaXAKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTgotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KCBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcElucHV0Q2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQWRkZWRDbGlwUHJvcGVydGllcyApCi17Ci0gICAgTTRPU0FfQm9vbCBiQ2xpcDFJc0FBQyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkNsaXAySXNBQUMgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgc2V0dGluZ3MgKi8KLSAgICBwSW5wdXRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHRoYXQgYW5hbHlzaXMgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoaXMgdmVyc2lvbiBvZiB0aGUgVlNTM0dQUCBsaWJyYXJ5ICovCi0gICAgaWYoICggcElucHV0Q2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gIT0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUikKLSAgICAgICAgfHwgKHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzFdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IpCi0gICAgICAgIHx8IChwSW5wdXRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsyXQotICAgICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHk6IFRoZSBjbGlwIGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZFwKLSAgICAgICAgICAgIGJ5IGFub3RoZXIgdmVyc2lvbiwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04iKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT047Ci0gICAgfQotCi0gICAgaWYoICggcEFkZGVkQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gIT0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUikKLSAgICAgICAgfHwgKHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzFdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IpCi0gICAgICAgIHx8IChwQWRkZWRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsyXQotICAgICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHk6IFRoZSBjbGlwIGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZFwKLSAgICAgICAgICAgIGJ5IGFub3RoZXIgdmVyc2lvbiwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04iKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT047Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBpbnB1dCBmaWxlIHR5cGUgKioqKioqKioqLwotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICE9IHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5GaWxlVHlwZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX0NMSVBfSVNfTk9UX0FfM0dQUCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFA7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBpbnB1dCBhdWRpbyAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwSW5wdXRDbGlwUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQU1SLU5CIG9yIEFBQyAqLwotICAgICAgICBzd2l0Y2goIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwSW5wdXRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYkNsaXAxSXNBQUMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNpbGVuY2UgaXMgYWx3YXlzIGVkaXRhYmxlICovCi0gICAgICAgIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqIGFkZGVkIGF1ZGlvICoqKioqKioqKi8KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICE9IHBBZGRlZENsaXBQcm9wZXJ0aWVzLT4KLSAgICAgICAgQXVkaW9TdHJlYW1UeXBlICkgLyoqPCBpZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGF1ZGlvIGZvcm1hdCBpcyBBTVItTkIgb3IgQUFDICovCi0gICAgICAgIHN3aXRjaCggcEFkZGVkQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyogSSB1c2UgdGhpcyBmaWVsZCB0byBrbm93IGlmIHNpbGVuY2Ugc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qIEkgdXNlIHRoaXMgZmllbGQgdG8ga25vdyBpZiBzaWxlbmNlIHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgICAgIGJDbGlwMklzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUENNOgotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLQotICAgICAgICAgICAgICAgIGlmKCBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiQ2xpcDJJc0FBQyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6IC8qUkMqLwotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBUaGUgd3JpdGVyIGNhbm5vdCB3cml0ZSB0aGlzICBpbnRvIGEgM2dwcCAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eTpcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBTaWxlbmNlIGlzIGFsd2F5cyBlZGl0YWJsZSAqLwotICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLSAgICB9Ci0KLSAgICBpZiggcEMtPmJSZW1vdmVPcmlnaW5hbCA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICE9IHBBZGRlZENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogV2UgbmVlZCB0byBjYWxsIFNTUkMgaW4gb3JkZXIgdG8gYWxpZ24gQVNGIGFuZC9vciBuYiBvZiBjaGFubmVscyAqLwotICAgICAgICAgICAgLyogTW9yZW92ZXIsIGF1ZGlvIGVuY29kZXIgbWF5IGJlIG5lZWRlZCBpbiBjYXNlIG9mIGF1ZGlvIHJlcGxhY2luZy4uLiAqLwotICAgICAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgPCBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogU3RlcmVvIHRvIE1vbm8gKi8KLSAgICAgICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgPiBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogTW9ubyB0byBTdGVyZW8gKi8KLSAgICAgICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwSW5wdXRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ29kZWNzLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9Db2RlY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNlZDkzNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9Db2RlY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00VlNTM0dQUF9Db2RlY3MuYwotICogQGJyaWVmICBWU1MgaW1wbGVtZW50YXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgcmVsYXRlZCB0byBhdWRpby92aWRlbwotICogICAgICAgICAgICBjb2RlYyBtYW5pcHVsYXRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBPU0FMIGRlYnVnIHNlcnZpY2VzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIiAvKio8IEludGVybmFsIHR5cGVzIG9mIHRoZSBWU1MgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoKQotICogQGJyaWVmICAgIENsZWFyIGVuY29kZXJzLCBkZWNvZGVycywgcmVhZGVyIGFuZCB3cml0ZXJzIGludGVyZmFjZXMgdGFibGVzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIFRoZSBjb250ZXh0IGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9jbGVhckludGVyZmFjZVRhYmxlcyggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyApCi17Ci0gICAgTTRPU0FfVUludDggaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBJbml0aWFsaXNhdGlvbiB0aGF0IHdpbGwgYWxsb3cgdG8gY2hlY2sgaWYgcmVnaXN0ZXJpbmcgdHdpY2UgKi8KLSAgICBwQy0+cFdyaXRlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEkgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRXUklURVJfa1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00RU5DT0RFUl9rQXVkaW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpc2F0aW9uIHRoYXQgd2lsbCBhbGxvdyB0byBjaGVjayBpZiByZWdpc3RlcmluZyB0d2ljZSAqLwotICAgIHBDLT5tX3BSZWFkZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycyA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00UkVBREVSX2tNZWRpYVR5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEFEX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2ldID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHBDLT5wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgIGNvbnRleHQgdGhlIHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQscFd0ckdsb2JhbEludGVyZmFjZSBvciBwV3RyRGF0YUludGVyZmFjZSBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSAqcFd0ckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSAqcFd0ckRhdGFJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckdsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicFd0ckdsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckRhdGFJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInBXdHJEYXRhSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgaW4gTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyIik7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIlZTUzogTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBXdHJHbG9iYWxJbnRlcmZhY2U9MHgleCxcCi0gICAgICAgIHBXdHJEYXRhSW50ZXJmYWNlPTB4JXgiLAotICAgICAgICBwQywgcFd0ckdsb2JhbEludGVyZmFjZSwgcFd0ckRhdGFJbnRlcmZhY2UpOwotCi0gICAgaWYoICggTWVkaWFUeXBlID09IE00V1JJVEVSX2tVbmtub3duKSB8fCAoTWVkaWFUeXBlID49IE00V1JJVEVSX2tUeXBlX05CKSApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBtZWRpYSB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5Xcml0ZXJJbnRlcmZhY2VbTWVkaWFUeXBlXS5wR2xvYmFsRmN0cyAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIGEgd3JpdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJUaGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFNhdmUgd3JpdGVyIGludGVyZmFjZSBpbiBjb250ZXh0ICovCi0gICAgcEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBHbG9iYWxGY3RzID0gcFd0ckdsb2JhbEludGVyZmFjZTsKLSAgICBwQy0+V3JpdGVySW50ZXJmYWNlW01lZGlhVHlwZV0ucERhdGFGY3RzID0gcFd0ckRhdGFJbnRlcmZhY2U7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIHZpZGVvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgIGNvbnRleHQgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocEVuY0dsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJWU1M6IE00VlNTM0dQUF9yZWdpc3RlckVuY29kZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcEVuY0dsb2JhbEludGVyZmFjZT0weCV4LFwKLSAgICAgICAgTWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgcEVuY0dsb2JhbEludGVyZmFjZSwgTWVkaWFUeXBlKTsKLQotICAgIGlmKCBNZWRpYVR5cGUgPj0gTTRFTkNPREVSX2tWaWRlb19OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIkludmFsaWQgdmlkZW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICAvKiBjYW4gYmUgbGVnaXRpbWF0ZSwgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBvbmUgdmVyc2lvbiB0aGF0IGNhbiB1c2UgZXh0ZXJuYWwgZW5jb2RlcnMKLSAgICAgICAgYnV0IHdoaWNoIHN0aWxsIGhhcyB0aGUgYnVpbHQtaW4gb25lIHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGFuIGV4dGVybmFsIGVuY29kZXI7IGluCi0gICAgICAgIHRoaXMgY2FzZSB0aGUgbmV3IGVuY29kZXIgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lIChpLmUuIHdlIHVucmVnaXN0ZXIgaXQgZmlyc3QpLiAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFNhdmUgZW5jb2RlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBwRW5jR2xvYmFsSW50ZXJmYWNlOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgYW5kIGV4dGVybmFsIEFQSSB3aWxsIGJlIHNldCBieSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGluIHRoZSBjYXNlCi0gICAgb2YgYW4gZXh0ZXJuYWwgZW5jb2RlciAoYWRkIGl0IGFzIGEgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGxvbmcgcnVuPykgKi8KLSAgICBwQy0+cFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBhdWRpbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICBjb250ZXh0IHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgICAoSU4pIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U6ICAgIChPVVQpIHRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocEVuY0dsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJWU1M6IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciBjYWxsZWQgcENvbnRleHQ9MHgleCwgcEVuY0dsb2JhbEludGVyZmFjZT0weCV4LFwKLSAgICAgICAgTWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgcEVuY0dsb2JhbEludGVyZmFjZSwgTWVkaWFUeXBlKTsKLQotICAgIGlmKCBNZWRpYVR5cGUgPj0gTTRFTkNPREVSX2tBdWRpb19OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIkludmFsaWQgYXVkaW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLyoKLSAgICAqIFNhdmUgZW5jb2RlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBwRW5jR2xvYmFsSW50ZXJmYWNlOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tNZWRpYVR5cGVdID0gTTRPU0FfRkFMU0U7IC8qIGludGVybmFsIGVuY29kZXIgKi8KLSAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcjogcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbMHgleF0gPSAweCV4IiwKLSAgICAgICAgTWVkaWFUeXBlLCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclJlYWRlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgcmVhZGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgbWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZHJEYXRhSW50ZXJmYWNlICkKLXsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmRyR2xvYmFsSW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZ2xvYmFsIGludGVyZmFjZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmRyRGF0YUludGVyZmFjZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9yZWdpc3RlclJlYWRlcjogaW52YWxpZCBwb2ludGVyIG9uIGRhdGEgaW50ZXJmYWNlIik7Ci0KLSAgICBpZiggbWVkaWFUeXBlID09IE00UkVBREVSX2tNZWRpYVR5cGVVbmtub3duCi0gICAgICAgIHx8IG1lZGlhVHlwZSA+PSBNNFJFQURFUl9rTWVkaWFUeXBlX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIG1lZGlhIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIGEgcmVhZGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJUaGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSA9IHBSZHJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW21lZGlhVHlwZV0gPSBwUmRyRGF0YUludGVyZmFjZTsKLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycysrOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBSZWdpc3RlciB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHBhcmFtICAgIHBEZWNvZGVySW50ZXJmYWNlICAgIChJTikgRGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSApCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYoIGRlY29kZXJUeXBlID49IE00REVDT0RFUl9rVmlkZW9UeXBlX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiSW52YWxpZCB2aWRlbyBkZWNvZGVyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwgKQotICAgIHsKLSNpZm5kZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgICAgIC8qIGEgZGVjb2RlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgISovCi0KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJEZWNvZGVyIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotCi0jZWxzZSAvKiBleHRlcm5hbCBkZWNvZGVycyBhcmUgcG9zc2libGUgKi8KLSAgICAgICAgLyogY2FuIGJlIGxlZ2l0aW1hdGUsIGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgb25lIHZlcnNpb24gdGhhdCBjYW4gdXNlIGV4dGVybmFsIGRlY29kZXJzCi0gICAgICAgIGJ1dCB3aGljaCBzdGlsbCBoYXMgdGhlIGJ1aWx0LWluIG9uZSB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBhbiBleHRlcm5hbCBkZWNvZGVyOyBpbgotICAgICAgICB0aGlzIGNhc2UgdGhlIG5ldyBkZWNvZGVyIHNpbXBseSByZXBsYWNlcyB0aGUgb2xkIG9uZSAoaS5lLiB3ZSB1bnJlZ2lzdGVyIGl0IGZpcnN0KS4gKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgLyogb2gsIGFuZCBkb24ndCBmb3JnZXQgdGhlIHVzZXIgZGF0YSwgdG9vLiAqLwotICAgICAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0jZW5kaWYgLyogYXJlIGV4dGVybmFsIGRlY29kZXJzIHBvc3NpYmxlPyAqLwotCi0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gcERlY29kZXJJbnRlcmZhY2U7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgd2lsbCBiZSBzZXQgYnkgdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpbiB0aGUgY2FzZQotICAgIG9mIGFuIGV4dGVybmFsIGRlY29kZXIgKGFkZCBpdCBhcyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBsb25nIHJ1bj8pICovCi0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMrKzsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgYXVkaW8gZGVjb2RlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFseSBieSB0aGUgVlNTIHRvIHJlZ2lzdGVyIE5YUCBhdWRpbyBkZWNvZGVycywKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBBdWRpbyBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICBBIHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9UeXBlIGRlY29kZXJUeXBlLCBNNEFEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYoIGRlY29kZXJUeXBlID49IE00QURfa1R5cGVfTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJJbnZhbGlkIGF1ZGlvIGRlY29kZXIgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBwRGVjb2RlckludGVyZmFjZTsKLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2RlY29kZXJUeXBlXSA9Ci0gICAgICAgIE00T1NBX0ZBTFNFOyAvKiBpbnRlcm5hbCBkZWNvZGVyICovCi0gICAgcEMtPnBBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMgKQotewotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNFdSSVRFUl9rVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMpOwotICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMpOwotICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRW5jb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGVuY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVyczogcEM9MHgleCIsIHBDKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEVOQ09ERVJfa0F1ZGlvX05COyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICAgICAgewotCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZW5jb2RlcnMgaW50ZXJmYWNlcyovCi0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPnBBdWRpb0VuY29kZXJGbGFnW2ldICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0pOwotICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRSRUFERVJfa01lZGlhVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSk7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSk7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzID0gMDsKLSAgICBwQy0+bV9wUmVhZGVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGRlY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVyczogcEM9MHgleCIsIHBDKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRERUNPREVSX2tWaWRlb1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZSApCi0gICAgICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSk7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEFEX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICAgICAgewotCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZGVjb2RlcnMgaW50ZXJmYWNlcyovCi0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtpXSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFdyaXRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgd3JpdGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2goIG1lZGlhVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2szR1BQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRSwKLSAgICAgICAgICAgICAgICAiV3JpdGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU7Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gcEMtPldyaXRlckludGVyZmFjZVt3cml0ZXJUeXBlXS5wR2xvYmFsRmN0czsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gcEMtPldyaXRlckludGVyZmFjZVt3cml0ZXJUeXBlXS5wRGF0YUZjdHM7Ci0KLSAgICBpZiggcEMtPnBXcml0ZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwKLSAgICAgICAgfHwgcEMtPnBXcml0ZXJEYXRhRmN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFLAotICAgICAgICAgICAgIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU7Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00RU5DT0RFUl9Gb3JtYXQgZW5jb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFULAotICAgICAgICAgICAgICAgICJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbZW5jb2RlclR5cGVdOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJID0KLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBpZiggcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFULAotICAgICAgICAgICAgIlZpZGVvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbVR5cGUgbWVkaWFUeXBlICkKLXsKLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgZW5jb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogZW5jb2RlciB0eXBlIEFNUiIpOwotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyOiBlbmNvZGVyIHR5cGUgQUFDIik7Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAiQXVkaW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyOiBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVsweCV4XT0weCV4LFwKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gMHgleCIsCi0gICAgICAgIGVuY29kZXJUeXBlLCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtlbmNvZGVyVHlwZV0sCi0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyk7Ci0KLSAgICBpZiggcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFULAotICAgICAgICAgICAgIkF1ZGlvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBdWRpbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFJlYWRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgcmVhZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50UmVhZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRSRUFERVJfTWVkaWFUeXBlIHJlYWRlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0OgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFY6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZTNHUFA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVI6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZUFNUjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzoKLSAgICAgICAgICAgIHJlYWRlclR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVQQ007Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUsCi0gICAgICAgICAgICAgICAgIlJlYWRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFOwotICAgIH0KLQotICAgIHBDLT5tX3BSZWFkZXIgPSBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtyZWFkZXJUeXBlXTsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW3JlYWRlclR5cGVdOwotCi0gICAgaWYoIHBDLT5tX3BSZWFkZXIgPT0gTTRPU0FfTlVMTCB8fCBwQy0+bV9wUmVhZGVyRGF0YUl0ID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUsCi0gICAgICAgICAgICAiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRTsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzIoIk00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9EZWNvZGVyOiBwQz0weCV4LCBtZWRpYVR5cGU9MHgleCIsCi0gICAgICAgIHBDLCBtZWRpYVR5cGUpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVBVkM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb0FSR0I4ODg4OgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNERFQ09ERVJfa1ZpZGVvVHlwZVlVVjQyMFA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFULAotICAgICAgICAgICAgICAgICJWaWRlbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV07Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhID0KLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLSAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2RlciA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQsCi0gICAgICAgICAgICAiVmlkZW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlZpZGVvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzIoIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9EZWNvZGVyOiBwQz0weCV4LCBtZWRpYVR5cGU9MHgleCIsCi0gICAgICAgIHBDLCBtZWRpYVR5cGUpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVBTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM6Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWNBRFRTOgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURJRjoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUFBQzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVNUDM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlUENNOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFULAotICAgICAgICAgICAgICAgICJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEgPQotICAgICAgICBwQy0+cEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotCi0gICAgaWYoIHBDLT5tX3BBdWRpb0RlY29kZXIgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFULAotICAgICAgICAgICAgIkF1ZGlvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0LmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmOGI3ZDUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0VkaXQuYwotICogQGJyaWVmICAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgZWRpdCBBUEkgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0KLS8qKgotICogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIiAvKio8IE9TQUwgc3RyaW5nIG1hbmFnZW1lbnQgKi8KLQotI2lmZGVmIFdJTjMyCi0jaW5jbHVkZSAic3RyaW5nLmgiICAgICAgICAgLyoqPCBmb3Igc3RyY3B5IChEb24ndCB3YW50IHRvIGdldCBkZXBlbmRlbmNpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggTTRPU0FfU3RyaW5nLi4uKSAqLwotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgKi8KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGF0aWMgbG9jYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrKAotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRUcmFuc2l0aW9uU2V0dGluZ3NTYW5pdHlDaGVjaygKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICpwVHJhbnNpdGlvbiApOwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludEZyZWVTZXR0aW5nc0xpc3QoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q3JlYXRlTVAzT3V0cHV0RmlsZSggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcE91dHB1dEZpbGUgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aU1hc3RlckNsaXAgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0QXZlcmFnZVZpZGVvQml0cmF0ZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldFZlcnNpb24oKQotICogQGJyaWVmICAgIEdldCB0aGUgVlNTIDNHUFAgdmVyc2lvbi4KLSAqIEBub3RlICAgIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0VmVyc2lvbiggTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uSW5mbyApCi17Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9HZXRWZXJzaW9uIGNhbGxlZCB3aXRoIHBWZXJzaW9uSW5mbz0weCV4IiwKLSAgICAgICAgcFZlcnNpb25JbmZvKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwVmVyc2lvbkluZm8pLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfR2V0VmVyc2lvbjogcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciA9IE00VlNTX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yID0gTTRWU1NfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gPSBNNFZTU19WRVJTSU9OX1JFVklTSU9OOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0SW5pdCgpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyAzR1BQIGVkaXQgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEluaXQoIE00VlNTM0dQUF9FZGl0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcEZpbGVXcml0ZVB0ckZjdCApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDOwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBcCi0gICAgICAgIHBGaWxlUmVhZFB0ckZjdD0weCV4LCBwRmlsZVdyaXRlUHRyRmN0PTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcEZpbGVSZWFkUHRyRmN0LCBwRmlsZVdyaXRlUHRyRmN0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQ6IHBGaWxlUmVhZFB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlV3JpdGVQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQ6IHBGaWxlV3JpdGVQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSB0aGUgVlNTIGNvbnRleHQgYW5kIHJldHVybiBpdCB0byB0aGUgdXNlciAqLwotICAgIHBDID0gKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCksCi0gICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikiTTRWU1MzR1BQX0ludGVybmFsQ29udGV4dCIpOwotICAgICpwQ29udGV4dCA9IHBDOwotICAgICAgICAvKiBJbmlhbGl6YXRpb24gb2YgY29udGV4dCBWYXJpYWJsZXMgKi8KLSAgICBtZW1zZXQoKHZvaWQgKilwQywgMCxzaXplb2YoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQpKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdCgpOiB1bmFibGUgdG8gYWxsb2NhdGUgTTRWU1MzR1BQX0ludGVybmFsQ29udGV4dCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotCi0gICAgLyogSW5pdCB0aGUgY29udGV4dC4gKi8KLSAgICBwQy0+dWlDbGlwTnVtYmVyID0gMDsKLSAgICBwQy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT51aUN1cnJlbnRDbGlwID0gMDsKLSAgICBwQy0+cEMxID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEMyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2MVswXS5wYWNfZGF0YSA9IHBDLT55dXYxWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYxWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2MlswXS5wYWNfZGF0YSA9IHBDLT55dXYyWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYyWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2M1swXS5wYWNfZGF0YSA9IHBDLT55dXYzWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2NFswXS5wYWNfZGF0YSA9IHBDLT55dXY0WzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXY0WzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+YkNsaXAxQXRCZWdpbkN1dCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5pQ2xpcDFBY3RpdmVFZmZlY3QgPSAwOwotICAgIHBDLT5pQ2xpcDJBY3RpdmVFZmZlY3QgPSAwOwotICAgIHBDLT5iVHJhbnNpdGlvbkVmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogSW5pdCBQQy0+ZXdjIG1lbWJlcnMgKi8KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICA9IDAuMDsKLSAgICBwQy0+ZXdjLmRPdXRwdXRWaWRDdHMgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kQVRvID0gMC4wOwotICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uID0gMDsKLSAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgcEMtPmV3Yy51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAwOwotICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDA7Ci0gICAgcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlID0gMDsKLSAgICBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgIHBDLT5ld2MudWlOYkNoYW5uZWxzID0gMTsKLSAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0gMDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEF1ZGlvRW5jRFNJLmluZm9TaXplID0gMDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0RTSS5wSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0gMDsKLSAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAwOwotICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSAwLjA7Ci0gICAgcEMtPmV3Yy5wRW5jQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5wRHVtbXlBdUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5pTXBlZzRHb3ZPZmZzZXQgPSAwOwotICAgIHBDLT5ld2MuVnBwRXJyb3IgPSAwOwotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tOb0VuY29kZXI7Ci0gICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVZpZGVvTWF4QXVTaXplID0gMDsKLSAgICBwQy0+ZXdjLnVpQXVkaW9NYXhBdVNpemUgPSAwOwotICAgIC8qKgotICAgICogS2VlcCB0aGUgT1NBTCBmaWxlIGZ1bmN0aW9ucyBwb2ludGVyIHNldCBpbiBvdXIgY29udGV4dCAqLwotICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcEMtPnBPc2FGaWxlV3JpdFB0ciA9IHBGaWxlV3JpdGVQdHJGY3Q7Ci0KLSAgICAvKgotICAgICogUmVzZXQgcG9pbnRlcnMgZm9yIG1lZGlhIGFuZCBjb2RlY3MgaW50ZXJmYWNlcyAqLwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoKLSAgICAqICBDYWxsIHRoZSBtZWRpYSBhbmQgY29kZWNzIHN1YnNjcmlwdGlvbiBtb2R1bGUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qKgotICAgICogVXBkYXRlIG1haW4gc3RhdGUgYXV0b21hdG9uICovCi0gICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ1JFQVRFRDsKLSAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgLyogVGhlIGZsYWcgaXMgc2V0IHRvIGZhbHNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgY2xpcCAqLwotICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQy0+YklzTU1TID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQy0+aUluT3V0VGltZU9mZnNldCA9IDA7Ci0gICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm5iQWN0aXZlRWZmZWN0cyA9IDA7Ci0gICAgcEMtPm5iQWN0aXZlRWZmZWN0czEgPSAwOwotICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYWlyX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRJbml0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBBbGxvd3MgZmlsbGluZyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlIHdpdGggZGVmYXVsdCB2YWx1ZXMKLSAqCi0gKiBAbm90ZSAgICBXQVJOSU5HOiBwQ2xpcFNldHRpbmdzLT5FZmZlY3RzWyBdIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwRmlsZSAgICAgICAgICAgICAgIChJTikgQ2xpcCBmaWxlIG5hbWUKLSAqIEBwYXJhbSAgIGZpbGVQYXRoU2l6ZSAgICAgICAgKElOKSBDbGlwIHBhdGggc2l6ZSAobmVlZGVkIGZvciBVVEYgMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MoIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRmlsZSwgTTRPU0FfVUludDMyIGZpbGVQYXRoU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyApCi17Ci0gICAgTTRPU0FfVUludDggdWlGeDsKLQotICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MgY2FsbGVkIHdpdGggcENsaXBTZXR0aW5ncz0weCVwIiwKLSAgICAgICAgcENsaXBTZXR0aW5ncyk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3MgaXMgTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGNsaXAgc2V0dGluZ3MgdG8gZGVmYXVsdCAqLwotICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlID0gTTRPU0FfTlVMTDsgICAgICAgIC8qKjwgbm8gZmlsZSAqLwotICAgIHBDbGlwU2V0dGluZ3MtPkZpbGVUeXBlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkOyAvKio8IHVuZGVmaW5lZCAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEZpbGUgKQotICAgIHsKLSAgICAgICAgLy9wQ2xpcFNldHRpbmdzLT5wRmlsZSA9IChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwRmlsZSkrMSwgTTRWU1MzR1BQLAotICAgICAgICAvLyAicENsaXBTZXR0aW5ncy0+cEZpbGUiKTsKLSAgICAgICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIGJlY2F1c2Ugb2YgdXRmIDE2IGNvbnZlcnNpb24qLwotICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmaWxlUGF0aFNpemUgKyAxLCBNNFZTUzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQ2xpcFNldHRpbmdzLT5wRmlsZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3MtPnBGaWxlICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzIDogRVJST1IgYWxsb2NhdGluZyBmaWxlbmFtZSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIC8vbWVtY3B5KHBDbGlwU2V0dGluZ3MtPnBGaWxlLCBwRmlsZSwgc3RybGVuKHBGaWxlKSsxKTsKLSAgICAgICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIGJlY2F1c2Ugb2YgdXRmIDE2IGNvbnZlcnNpb24qLwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQ2xpcFNldHRpbmdzLT5wRmlsZSwgKHZvaWQgKilwRmlsZSwgZmlsZVBhdGhTaXplICsgMSk7Ci0gICAgfQotCi0gICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIHRvIHN1cHBvcnQgVVRGMTYgY29udmVyc2lvbiovCi0gICAgcENsaXBTZXR0aW5ncy0+ZmlsZVBhdGhTaXplID0gZmlsZVBhdGhTaXplICsgMTsKLSAgICAvKiovCi0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYkFuYWx5c2VkID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuRmlsZVR5cGUgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMF0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMV0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMl0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0gMDsKLQotICAgIHBDbGlwU2V0dGluZ3MtPnVpQmVnaW5DdXRUaW1lID0gMDsgLyoqPCBubyBiZWdpbiBjdXQgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT51aUVuZEN1dFRpbWUgPSAwOyAgIC8qKjwgbm8gZW5kIGN1dCAqLwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJTZXRJbWFnZURhdGEgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgdmlkZW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb01heEF1U2l6ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSA9IDAuMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvTGV2ZWwgPQotICAgICAgICBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJNUEVHNGRhdGFQYXJ0aXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iTVBFRzRydmxjID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYk1QRUc0cmVzeW5jaE1hcmtlciA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCBhdWRpbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvTWF4QXVTaXplID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA9IDA7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0U2V0RGVmYXVsdFNldHRpbmdzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIER1cGxpY2F0ZXMgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSwgcGVyZm9ybWluZyBhbGxvY2F0aW9ucyBpZiByZXF1aXJlZAotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzRGVzdCAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NPcmlnICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBiQ29weUVmZmVjdHMgICAgICAgIChJTikgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZHVwbGljYXRlIGVmZmVjdHMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSCi1NNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkNvcHlFZmZlY3RzICkKLXsKLSAgICBNNE9TQV9VSW50OCB1aUZ4OwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyBjYWxsZWQgd2l0aCBkZXN0PTB4JXAgc3JjPTB4JXAiLAotICAgICAgICBwQ2xpcFNldHRpbmdzRGVzdCwgcENsaXBTZXR0aW5nc09yaWcpOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3NEZXN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3NEZXN0IGlzIE5VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc09yaWcpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5nc09yaWcgaXMgTlVMTCIpOwotCi0gICAgLyogQ29weSBwbGFpbiBzdHJ1Y3R1cmUgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwQ2xpcFNldHRpbmdzRGVzdCwKLSAgICAgICAgKHZvaWQgKilwQ2xpcFNldHRpbmdzT3JpZywgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MpKTsKLQotICAgIC8qIER1cGxpY2F0ZSBmaWxlbmFtZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSApCi0gICAgewotICAgICAgICAvL3BDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSA9Ci0gICAgICAgIC8vIChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwQ2xpcFNldHRpbmdzT3JpZy0+cEZpbGUpKzEsIE00VlNTM0dQUCwKLSAgICAgICAgLy8gInBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSIpOwotICAgICAgICAvKkZCOiBjbGlwIHBhdGggc2l6ZSBpcyBuZWVkZWQgZm9yIHV0ZiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgLypGQiAyMDA4LzEwLzE2OiBiYWQgYWxsb2NhdGlvbiBzaXplIHdoaWNoIHJhaXNlcyBhIGNyYXNoKi8KLSAgICAgICAgcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemUgKyAxLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MgOiBFUlJPUiBhbGxvY2F0aW5nIGZpbGVuYW1lIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgLypGQjogY2xpcCBwYXRoIHNpemUgaXMgbmVlZGVkIGZvciB1dGYgMTYgY29udmVyc2lvbiovCi0gICAgICAgIC8vbWVtY3B5KHBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSwgcENsaXBTZXR0aW5nc09yaWctPnBGaWxlLAotICAgICAgICAvLyBzdHJsZW4ocENsaXBTZXR0aW5nc09yaWctPnBGaWxlKSsxKTsKLSAgICAgICAgLypGQiAyMDA4LzEwLzE2OiBiYWQgYWxsb2NhdGlvbiBzaXplIHdoaWNoIHJhaXNlcyBhIGNyYXNoKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlLCAodm9pZCAqKXBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSwKLSAgICAgICAgICAgIHBDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemUvKisxKi8pOwotICAgICAgICAoIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAqKXBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSlbcENsaXBTZXR0aW5nc09yaWctPmZpbGVQYXRoU2l6ZV0gPSAnXDAnOwotICAgIH0KLQotICAgIC8qIER1cGxpY2F0ZSBlZmZlY3RzICovCi0gICAgLyogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLQotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEZyZWUgdGhlIHBvaW50ZXJzIGFsbG9jYXRlZCBpbiB0aGUgQ2xpcFNldHRpbmcgc3RydWN0dXJlIChwRmlsZSwgRWZmZWN0cykuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyApCi17Ci0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5ncyBpcyBOVUxMIik7Ci0KLSAgICAvKiBmcmVlIGZpbGVuYW1lICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBTZXR0aW5ncy0+cEZpbGUgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcFNldHRpbmdzLT5wRmlsZSk7Ci0gICAgICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBmcmVlIGVmZmVjdHMgc2V0dGluZ3MgKi8KLSAgICAvKiAgICBpZihNNE9TQV9OVUxMICE9IHBDbGlwU2V0dGluZ3MtPkVmZmVjdHMpCi0gICAgewotICAgIGZyZWUocENsaXBTZXR0aW5ncy0+RWZmZWN0cyk7Ci0gICAgcENsaXBTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9IFJDICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKCkKLSAqIEBicmllZiAgICAgU2V0IHRoZSBWU1MgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KLSAqIEBub3RlICAgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgbWF5IG5vdCBiZSBjcmVhdGVkIHlldC4KLSAqIEBwYXJhbSAgICAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgICBwU2V0dGluZ3MgICAgICAgICAgIChJTikgRWRpdCBzZXR0aW5ncwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKnBTZXR0aW5ncyApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgb3V0cHV0RmlsZVR5cGUgPQotICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQ7IC8qKjwgM0dQUCBvciBNUDMgKHdlIGRvbid0IGRvIEFNUiBvdXRwdXQpICovCi0gICAgTTRPU0FfVUludDMyIHVpQzFkdXJhdGlvbiwgdWlDMmR1cmF0aW9uOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW4gY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcFNldHRpbmdzPTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcFNldHRpbmdzKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTZXR0aW5ncy0+cENsaXBMaXN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBwU2V0dGluZ3MtPnBDbGlwTGlzdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCggcFNldHRpbmdzLT51aUNsaXBOdW1iZXIgPiAxKQotICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggKCBwQy0+U3RhdGUgIT0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ1JFQVRFRCkKLSAgICAgICAgJiYgKHBDLT5TdGF0ZSAhPSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9DTE9TRUQpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogU3RhdGUgZXJyb3IgKDB4JXgpISBSZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSBhbnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgaW50ZXJuYWwgc2V0dGluZ3MgbGlzdCAqLwotICAgIE00VlNTM0dQUF9pbnRGcmVlU2V0dGluZ3NMaXN0KHBDKTsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgdXNlciBzZXR0aW5ncyBpbiBvdXIgY29udGV4dCAqLwotICAgIHBDLT51aUNsaXBOdW1iZXIgPSBwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgY2xpcCBsaXN0ICovCi0gICAgcEMtPnBDbGlwTGlzdCA9Ci0gICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKQotICAgICAgICAqIHBDLT51aUNsaXBOdW1iZXIsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBDbGlwTGlzdCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDbGlwTGlzdCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+U2V0dGluZ3MucENsaXBMaXN0LFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKCYocEMtPnBDbGlwTGlzdFtpXSksCi0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwgTTRPU0FfVFJVRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IGVmZmVjdHMgbGlzdCBSQyAqLwotCi0gICAgLypGQiBidWcgZml4IDE5LjAzLjIwMDggaWYgdGhlIG51bWJlciBvZiBlZmZlY3RzIGlzIDAgLT4gY3Jhc2gqLwotICAgIGlmKCBwU2V0dGluZ3MtPm5iRWZmZWN0cyA+IDAgKQotICAgIHsKLSAgICAgICAgcEMtPm5iRWZmZWN0cyA9IHBTZXR0aW5ncy0+bmJFZmZlY3RzOwotICAgICAgICBwQy0+cEVmZmVjdHNMaXN0ID0gKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncwotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykgKiBwQy0+bmJFZmZlY3RzLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cEVmZmVjdHNMaXN0Iik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBFZmZlY3RzTGlzdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+cEVmZmVjdHNMaXN0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPm5iRWZmZWN0czsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICYocEMtPnBFZmZlY3RzTGlzdFtpXSksCi0gICAgICAgICAgICAgICAgKHZvaWQgKikgJihwU2V0dGluZ3MtPkVmZmVjdHNbaV0pLAotICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGFjdGl2ZSBlZmZlY3RzIGxpc3QgUkMgKi8KLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1VJbnQ4KSAqIHBDLT5uYkVmZmVjdHMsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5wQWN0aXZlRWZmZWN0c0xpc3QiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbGxvY2F0ZSBhY3RpdmUgZWZmZWN0cyBsaXN0ICovCi0gICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVUludDgpICogcEMtPm5iRWZmZWN0cywKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBBY3RpdmVFZmZlY3RzTGlzdCIpOwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPm5iRWZmZWN0cyA9IDA7Ci0gICAgICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMgPSAwOwotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzMSA9IDA7Ci0gICAgICAgIHBDLT5wRWZmZWN0c0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotICAgIC8qKgotICAgICogVGVzdCB0aGUgY2xpcCBhbmFseXNpcyBkYXRhLCBpZiBpdCBpcyBub3QgcHJvdmlkZWQsIGFuYWx5c2UgdGhlIGNsaXBzIGJ5IG91cnNlbHZlcy4gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5iQW5hbHlzZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEFuYWx5c2lzIG5vdCBwcm92aWRlZCBieSB0aGUgaW50ZWdyYXRvciAqLwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcChwQy0+cENsaXBMaXN0W2ldLnBGaWxlLAotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0uRmlsZVR5cGUsICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGNsaXAgY29tcGF0aWJpbGl0eSAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlICE9TTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgYWxsIHRoZSBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIFZTUyAzR1BQICovCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoJWQpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBpLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayB0aGUgbWFzdGVyIGNsaXAgdmVyc3VzIGFsbCB0aGUgb3RoZXIgb25lcy4KLSAgICAgICAgKGluY2x1ZGluZyBtYXN0ZXIgY2xpcCB3aXRoIGl0c2VsZiwgZWxzZSB2YXJpYWJsZXMgZm9yIG1hc3RlciBjbGlwCi0gICAgICAgIGFyZSBub3QgcHJvcGVybHkgc2V0dGVkKSAqLwotICAgICAgICBpZihwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlICE9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoCi0gICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIC8qIGluIGNhc2Ugb2Ygd2FybmluZyByZWdhcmRpbmcgYXVkaW8gaW5jb21wYXRpYmlsaXR5LAotICAgICAgICAgICAgICAgIGVkaXRpbmcgY29udGludWVzICovCi0gICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkgXAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkKSByZXR1cm5zIDB4JXghIiwgaSwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogU2VhcmNoIGF1ZGlvIHRyYWNrcyB0aGF0IGNhbm5vdCBiZSBlZGl0ZWQgOgotICAgICogICAtIGRlbGV0ZSBhbGwgYXVkaW8gZWZmZWN0cyBmb3IgdGhlIGNsaXAKLSAgICAqICAgLSBpZiBtYXN0ZXIgY2xpcCBpcyBlZGl0YWJsZSBsZXQgdGhlIHRyYW5zaXRpb24KLSAgICAoYmFkIHRyYWNrIHdpbGwgYmUgcmVwbGFjZWQgbGF0ZXIgd2l0aCBzaWxlbmNlKQotICAgICogICAtIGlmIG1hc3RlciBjbGlwIGlzIG5vdCBlZGl0YWJsZSBzd2l0Y2ggdG8gYSBkdW1teSB0cmFuc2l0aW9uIChvbmx5IGNvcHkvcGFzdGUpICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBwQy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNFZGl0YWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpRng7Ci0KLSAgICAgICAgICAgIGZvciAoIHVpRnggPSAwOyB1aUZ4IDwgcEMtPm5iRWZmZWN0czsgdWlGeCsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNMaXN0W3VpRnhdLkF1ZGlvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgICAgICA9IE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX05vbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAoIGkgPCAocEMtPnVpQ2xpcE51bWJlciAtIDEpKQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9GQUxTRSA9PSBwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgdWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy5iQXVkaW9Jc0VkaXRhYmxlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPkF1ZGlvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAgICAgPSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogV2UgYWRkIGEgdHJhbnNpdGlvbiBvZiBkdXJhdGlvbiAwIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgY2xpcC4KLSAgICAqIEl0IHdpbGwgc3VwcHJlc3MgYSB3aG9sZSBidW5jaCBhIHRlc3QgbGF0dGVyIGluIHRoZSBwcm9jZXNzaW5nLi4uICovCi0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdCA9IChNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzCi0gICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKQotICAgICAgICAqIChwQy0+dWlDbGlwTnVtYmVyKSwgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cFRyYW5zaXRpb25MaXN0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFRyYW5zaXRpb25MaXN0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5TZXR0aW5ncy5wVHJhbnNpdGlvbkxpc3QsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKio8IGNvcHkgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgKHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyIC0gMSk7IGkrKyApCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKikgJihwQy0+cFRyYW5zaXRpb25MaXN0W2ldKSwKLSAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0sCi0gICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykpOwotICAgIH0KLQotICAgIC8qKjwgV2UgZmlsbCB0aGUgbGFzdCAiZHVtbXkiIHRyYW5zaXRpb24gKi8KLSAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUNsaXBOdW1iZXIgLSAxXS51aVRyYW5zaXRpb25EdXJhdGlvbiA9IDA7Ci0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDbGlwTnVtYmVyCi0gICAgICAgIC0gMV0uVmlkZW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ2xpcE51bWJlcgotICAgICAgICAtIDFdLkF1ZGlvVHJhbnNpdGlvblR5cGUgPSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZTsKLQotICAgIC8qKgotICAgICogQXZvaWQgd2VpcmQgY2xpcCBzZXR0aW5ncyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpXS5GaWxlVHlwZSAhPU00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrKCZwQy0+cENsaXBMaXN0W2ldKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IChwU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gIT0gMCkgewotICAgICAgICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbjsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpKzFdLkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlCZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaV0uRmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lIC0gcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZSA9IDA7Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaSsxXS5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpKzFdLnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlFbmRDdXRUaW1lIC0gcEMtPnBDbGlwTGlzdFtpKzFdLnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlCZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTWF4aW11bSB0cmFuc2l0aW9uIGR1cmF0aW9uIGJldHdlZW4gY2xpcCBuIGFuZCBjbGlwIG4rMSBpcyB0aGUgZHVyYXRpb24KLSAgICAgICAgKiBvZiB0aGUgc2hvcnRlc3QgY2xpcCAqLwotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQzFkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKjwgZHVyYXRpb24gb2YgY2xpcCBuIGlzIHRoZSBlbmQgY3V0IHRpbWUgKi8KLSAgICAgICAgICAgIHVpQzFkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBTdWJzdHJhY3QgYmVnaW4gY3V0ICovCi0gICAgICAgIHVpQzFkdXJhdGlvbiAtPSBwQy0+cENsaXBMaXN0W2ldLnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgIC8qKjwgQ2hlY2sgdGhhdCB0aGUgdHJhbnNpdGlvbiBpcyBzaG9ydGVyIHRoYW4gY2xpcCBuICovCi0gICAgICAgIGlmKCBwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uID4gdWlDMWR1cmF0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbiA9IHVpQzFkdXJhdGlvbiAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2kgKyAxXS51aUVuZEN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUMyZHVyYXRpb24gPQotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaSArIDFdLkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IGR1cmF0aW9uIG9mIGNsaXAgbisxIGlzIHRoZSBlbmQgY3V0IHRpbWUgKi8KLSAgICAgICAgICAgIHVpQzJkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaSArIDFdLnVpRW5kQ3V0VGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgU3Vic3RyYWN0IGJlZ2luIGN1dCAqLwotICAgICAgICB1aUMyZHVyYXRpb24gLT0gcEMtPnBDbGlwTGlzdFtpICsgMV0udWlCZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgLyoqPCBDaGVjayB0aGF0IHRoZSB0cmFuc2l0aW9uIGlzIHNob3J0ZXIgdGhhbiBjbGlwIG4rMSAqLwotICAgICAgICBpZiggcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbiA+IHVpQzJkdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gPSB1aUMyZHVyYXRpb24gLSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQXZvaWQgd2VpcmQgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBlcnIgPQotICAgICAgICAgICAgTTRWU1MzR1BQX2ludFRyYW5zaXRpb25TZXR0aW5nc1Nhbml0eUNoZWNrKCZwQy0+cFRyYW5zaXRpb25MaXN0W2ldKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q2xpcFNldHRpbmdzU2FuaXR5Q2hlY2sgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayB0aGF0IHR3byB0cmFuc2l0aW9ucyBhcmUgbm90IG92ZXJsYXBwaW5nCi0gICAgICAgICAgKG5vIG92ZXJsYXBwaW5nIHBvc3NpYmxlIGZvciBmaXJzdCBjbGlwKSAqLwotICAgICAgICBpZiggaSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlcmUgaXMgYSB0cmFuc2l0aW9uIG92ZXJsYXAgaWYgdGhlIHN1bSBvZiB0aGUgZHVyYXRpb24gb2YKLSAgICAgICAgICAgICAgdHdvIGNvbnNlY3V0aXZlIHRyYW5zaXRpb25zCi0gICAgICAgICAgICAqIGlzIGhpZ2hlciB0aGFuIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2xpcCBpbi1iZXR3ZWVuLiAqLwotICAgICAgICAgICAgaWYoICggcEMtPnBUcmFuc2l0aW9uTGlzdFtpIC0gMV0udWlUcmFuc2l0aW9uRHVyYXRpb24KLSAgICAgICAgICAgICAgICArIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24pID49IHVpQzFkdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE92ZXJsYXBwaW5nIHRyYW5zaXRpb25zIG9uIGNsaXAgJWQsXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9PVkVSTEFQUElOR19UUkFOU0lUSU9OUyIsCi0gICAgICAgICAgICAgICAgICAgIGkpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX09WRVJMQVBQSU5HX1RSQU5TSVRJT05TOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBPdXRwdXQgY2xpcCBkdXJhdGlvbiAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHN1bSBvZiB0aGUgY2xpcCBkdXJhdGlvbiAqLwotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgcEMtPgotICAgICAgICAgICAgICAgIHBDbGlwTGlzdFsKLSAgICAgICAgICAgICAgICAgICAgaV0uQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBWaWRlb0R1cmF0aW9uOyAvKiBPbmx5IHZpZGVvIHRyYWNrIGR1cmF0aW9uIGlzIGltcG9ydGFudCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgZGV2aWF0aW9uIGlmIGF1ZGlvIHRyYWNrIGlzIGxvbmdlciAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKz0KLSAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZTsgLyoqPCBBZGQgZW5kIGN1dCAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gLT0KLSAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlCZWdpbkN1dFRpbWU7IC8qKjwgUmVtb3ZlIGJlZ2luIGN1dCAqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFJlbW92ZSB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gKGl0IGlzIGNvdW50ZWQgdHdpY2UpICovCi0gICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uIC09IHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgfQotCi0gICAgLyogR2V0IHZpZGVvIHByb3BlcnRpZXMgZnJvbSBvdXRwdXQgcHJvcGVydGllcyAqLwotCi0gICAgLyogR2V0IG91dHB1dCB3aWR0aCBhbmQgaGVpZ2h0ICovCi0gICAgc3dpdGNoKHBDLT54VlNTLm91dHB1dFZpZGVvU2l6ZSkgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTI4OwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gOTY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDE2MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMzIwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMzUyOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1ZHQToKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gNjQwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiArUFIgTFY1ODA3ICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDgwMDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSA3MjA7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qIC1QUiBMVjU4MDcgKi8KLSAgICAgICAgICAgIC8qICtDUiBHb29nbGUgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjQwXzM2MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gNjQwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMzYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gTTRFTkNPREVSXzg1NF80ODBfV2lkdGg7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjgwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTI4MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotCi0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gOTYwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTkyMDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDEwODg7IC8vIG5lZWQgdG8gYmUgbXVsdGlwbGVzIG9mIDE2Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKiBJZiBvdXRwdXQgdmlkZW8gc2l6ZSBpcyBub3QgZ2l2ZW4sIHdlIHRha2UgUUNJRiBzaXplICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBubyBvdXRwdXQgdmlkZW8gc2l6ZSBnaXZlbiwgZGVmYXVsdCB0byBRQ0lGISIpOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBwQy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rUUNJRjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSAgICAgICAgPSAzMDsKLSAgICBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgID0gMDsKLSAgICAvKiBTZXQgb3V0cHV0IHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsICovCi0gICAgcEMtPmV3Yy5vdXRwdXRWaWRlb1Byb2ZpbGUgPSBwQy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgcEMtPmV3Yy5vdXRwdXRWaWRlb0xldmVsID0gcEMtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIHN3aXRjaChwQy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCkgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlID0gTTRTWVNfa01QRUdfNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBhdWRpbyBwcm9wZXJ0aWVzIG9mIHRoZSBtYXN0ZXIgY2xpcCB0byB0aGUgb3V0cHV0IHByb3BlcnRpZXMgKi8KLSAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgIHBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPgotICAgICAgICB1aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotCi0gICAgc3dpdGNoKCBwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTjsKLSAgICAgICAgICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLQotICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6Ci0gICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0gMDsKLSAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZSwgbXAzIGNvcmUgcmVhZGVyIHJldHVybiBhIHRpbWUgaW4gbXMgKi8KLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSAxLjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAxNjA7IC8qIEVWUkMgZnJhbWVzIGFyZSAyMCBtcyBhdCA4MDAwIEh6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFrZXMgaXQgZWFzaWVyIHRvIGZhY3Rvcml6ZSBhbXIgYW5kIGV2cmMgY29kZSkgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTxwQy0+dWlDbGlwTnVtYmVyOyBpKyspIHsKLSAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaV0uYlRyYW5zY29kaW5nUmVxdWlyZWQgPT0gTTRPU0FfRkFMU0UpIHsKLSAgICAgICAgICAgIC8qKiBJZiBub3QgdHJhbnNjb2RlZCBpbiBBbmFseXNpcyBwaGFzZSwgY2hlY2sKLSAgICAgICAgICAgICAqIGlmIHRyYW5zY29kaW5nIHJlcXVpcmVkIG5vdwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICE9Ci0gICAgICAgICAgICAgICAgICBwQy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCl8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoICE9Ci0gICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGgpIHx8Ci0gICAgICAgICAgICAgICAgICAocEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ICE9Ci0gICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KSB8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09Ci0gICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0gyNjQpIHx8Ci0gICAgICAgICAgICAgICAgICAocEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rTVBFRzQgJiYKLSAgICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGUgIT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlKSkgewotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0uYlRyYW5zY29kaW5nUmVxdWlyZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoqIElmIGJUcmFuc2NvZGluZ1JlcXVpcmVkIGlzIHRydWUsIGl0IG1lYW5zIHRoZSBjbGlwIGhhcwotICAgICAgICAgICAgICogYmVlbiB0cmFuc2NvZGVkIGluIEFuYWx5c2lzIHBoYXNlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLmJUcmFuc2NvZGluZ1JlcXVpcmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgKiBXZSBwcm9kdWNlIGEgM2dwcCBmaWxlLCB1bmxlc3MgaXQgaXMgbXAzICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tNUDMgPT0gcEMtPgotICAgICAgICBwQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIG91dHB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzsKLSAgICBlbHNlCi0gICAgICAgIG91dHB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0KLSAgICAvKioKLSAgICAqIEJld2FyZSwgYSBudWxsIGR1cmF0aW9uIHdvdWxkIGxlYWQgdG8gYSBkaXZpZGUgYnkgemVybyBlcnJvciAoYmV0dGVyIHNhZmUgdGhhbiBzb3JyeS4uLikgKi8KLSAgICBpZiggMCA9PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgewotICAgICAgICBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiA9IDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBPcGVuIGZpcnN0IGNsaXAgKi8KLSAgICBwQy0+dWlDdXJyZW50Q2xpcCA9IDA7Ci0KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICA9IDAuMDsKLSAgICBwQy0+ZXdjLmRPdXRwdXRWaWRDdHMgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kQVRvID0gMC4wOwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAocEMpOwotICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciAmJiBlcnIgIT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRG8gdGhlIHZpZGVvIHN0dWZmIGluIDNHUFAgQXVkaW8vVmlkZW8gY2FzZSAqLwotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCA9PSBvdXRwdXRGaWxlVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHRoZSBEZWNvZGVyIFNwZWNpZmljIEluZm8gZm9yIHRoZSBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIHN0cmVhbXMgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKHBDLAotICAgICAgICAgICAgcFNldHRpbmdzLT51aU1hc3RlckNsaXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbmNyZW1lbnQgZm9yIHRoZSB0cmFuc2l0aW9uIGZpbGUgKi8KLSAgICAgICAgc3dpdGNoKCBwU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDcuNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTBfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDEwLjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDEyLjU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE1X0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAxNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMF9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gMjAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDI1LjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMwX0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAzMC4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuKCk6IGludmFsaWQgdmlkZW9GcmFtZVJhdGUgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00U1lTX2tNUEVHXzQgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlBbHBoYTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBNUEVHLTQgY2FzZS4KLSAgICAgICAgICAgICogVGltZSBzY2FsZSBvZiB0aGUgdHJhbnNpdGlvbiBlbmNvZGVyIG11c3QgYmUgdGhlIHNhbWUgdGhhbiB0aGUKLSAgICAgICAgICAgICogdGltZXNjYWxlIG9mIHRoZSBpbnB1dCBmaWxlcy4KLSAgICAgICAgICAgICogU28gdGhlIGZyYW1lIGR1cmF0aW9uIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgdGltZSBzY2FsZSwKLSAgICAgICAgICAgICogYnV0IHdpdGhvdXQgYmVlaW5nIHRvbyBzaG9ydC4KLSAgICAgICAgICAgICogRm9yIHRoYXQsIHdlIG11c3QgY29tcHV0ZSBhbHBoYSAoaW50ZWdlcikgc28gdGhhdDoKLSAgICAgICAgICAgICogICAgICAgICAgICAgKGFscGhhIHggMTAwMCkvRW5jb2RlclRpbWVTY2FsZSA+IE1pbkZyYW1lRHVyYXRpb24KLSAgICAgICAgICAgICoqLwotCi0gICAgICAgICAgICB1aUFscGhhID0gKE00T1NBX1VJbnQzMikoKCBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSkgLyAxMDAwLjAgKyAwLjUpOwotCi0gICAgICAgICAgICBpZiggdWlBbHBoYSA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICggdWlBbHBoYSAqIDEwMDAuMCkgLyBwQy0+ZXdjLnVpVmlkZW9UaW1lU2NhbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRTWVNfa0gyNjMgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIwX0ZQUzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbigpOiBpbnZhbGlkIHZpZGVvRnJhbWVSYXRlIGZvciBIMjYzLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEU7Ci0gICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgTVAzIG91dHB1dCBmaWxlICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMgPT0gb3V0cHV0RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgTTRSRUFERVJfQnVmZmVyIG1wM3RhZ0J1ZmZlcjsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUocEMsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRDcmVhdGVNUDNPdXRwdXRGaWxlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBUaGUgSUQzdjIgdGFnIGNvdWxkIGJlIGF0IGFueSBwbGFjZSBpbiB0aGUgbXAzIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFRoZSBtcDMgcmVhZGVyIG9ubHkgY2hlY2tzIGZldyBieXRlcyBpbiB0aGUgYmVnaW5uaW5nIG9mCi0gICAgICAgICAgIHN0cmVhbSB0byBsb29rIGZvciBhIElEM3YyIHRhZyAgKi8KLSAgICAgICAgLyogSXQgbWVhbnMgdGhhdCBpZiB0aGUgSUQzdjIgdGFnIGlzIG5vdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHRoZSByZWFkZXIgZG8KLSAgICAgICAgYXMgdGhlcmUgaXMgbm8gdGhlc2UgbWV0YWRhdGEgKi8KLQotICAgICAgICAvKiBSZXRyaWV2ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjIgVGFnICovCi0gICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MlRhZywKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmbXAzdGFnQnVmZmVyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNE1QM1JfZ2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBXcml0ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjIgVGFnIGluIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICBpZiggMCAhPSBtcDN0YWdCdWZmZXIubV91aUJ1ZmZlclNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpbXAzdGFnQnVmZmVyLm1fcERhdGEsIG1wM3RhZ0J1ZmZlci5tX3VpQnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGcmVlIGJlZm9yZSB0aGUgZXJyb3IgY2hlY2tpbmcgYW55d2F5ICovCi0gICAgICAgICAgICBmcmVlKG1wM3RhZ0J1ZmZlci5tX3BEYXRhKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEVycm9yIGNoZWNraW5nICovCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBXcml0ZURhdGEoSUQzdjJUYWcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplID0gMDsKLSAgICAgICAgICAgIG1wM3RhZ0J1ZmZlci5tX3BEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgM0dQUCBvdXRwdXQgZmlsZSAqLwotICAgIGVsc2UgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQID09IG91dHB1dEZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIDExLzEyLzIwMDggQ1IzMjgzIE1NUyB1c2UgY2FzZSBpbiBWaWRlb0FydGlzdDogU2V0IG1heCBvdXRwdXQgZmlsZSBzaXplIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUsCi0gICAgICAgICAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUsCi0gICAgICAgICAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIERlZmF1bHQgZXJyb3IgY2FzZSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogaW52YWxpZCBvdXRwdXRGaWxlVHlwZSA9IDB4JXgsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfT1VUUFVUX0ZJTEVfVFlQRV9FUlJPUiIsCi0gICAgICAgICAgICBvdXRwdXRGaWxlVHlwZSk7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9PVVRQVVRfRklMRV9UWVBFX0VSUk9SOyAvKio8IHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duIHRvIHRoZSB1c2VyICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0aWFsaXplIHN0YXRlICovCi0gICAgaWYoIE00U1lTX2tNUDMgPT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gdGhlIE1QMyBjYXNlIHdlIHVzZSBhIHNwZWNpYWwgYXVkaW8gc3RhdGUgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIHN0YXJ0IHdpdGggdGhlIHZpZGVvIHByb2Nlc3NpbmcgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0aWFsaXplIHN0YXRlLgotICAgICogVGhlIGZpcnN0IGNsaXAgaXMgaW5kZXBlbmRhbnQgdG8gdGhlICJ2aXJ0dWFsIHByZXZpb3VzIGNsaXBzIiwKLSAgICAqIHNvIGl0J3MgbGlrZSBpZiB3ZSB3aGVyZSBpbiBSZWFkL1dyaXRlIG1vZGUgYmVmb3JlIGl0LiAqLwotICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfUkVBRF9XUklURTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRPcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0U3RlcCgpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBlZGl0aW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTIDNHUFAgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgIHBQcm9ncmVzcyAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIGVkaXRpbmcgb3BlcmF0aW9uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgIFZTUyAzR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOiBFZGl0aW9uIGlzIGRvbmUsIHVzZXIgc2hvdWxkIG5vdyBjYWxsCi0gKiAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xvc2UoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRTdGVwKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiB1aVByb2dyZXNzQXVkaW8sIHVpUHJvZ3Jlc3NWaWRlbywgdWlQcm9ncmVzczsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0U3RlcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdFN0ZXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFByb2dyZXNzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRTdGVwOiBwUHJvZ3Jlc3MgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gYW5kIHNlbGVjdCBjb3JyZWN0IHByb2Nlc3NpbmcgKi8KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPOgotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW8ocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9BVURJTzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzOgotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA6Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdFN0ZXAoKTogaW52YWxpZCBpbnRlcm5hbCBzdGF0ZSAoMHgleCksIHJldHVybmluZyBNNEVSUl9TVEFURSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBwcm9ncmVzcy4KLSAgICAqIFdlIGRvIHRoZSBjb21wdXRpbmcgd2l0aCAzMmJpdHMgcHJlY2lzaW9uIGJlY2F1c2UgaW4gc29tZSAodmVyeSkgZXh0cmVtZSBjYXNlLCB3ZSBtYXkgZ2V0Ci0gICAgKiB2YWx1ZXMgaGlnaGVyIHRoYW4gMjU2ICguLi4pICovCi0gICAgdWlQcm9ncmVzc0F1ZGlvID0KLSAgICAgICAgKCAoTTRPU0FfVUludDMyKShwQy0+ZXdjLmRBVG8gKiAxMDApKSAvIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uOwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgdWlQcm9ncmVzc1ZpZGVvID0gKChNNE9TQV9VSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzICogMTAwKSkgLyBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLQotICAgIHVpUHJvZ3Jlc3MgPSB1aVByb2dyZXNzQXVkaW8gKyB1aVByb2dyZXNzVmlkZW87Ci0KLSAgICBpZiggKCBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFNZU19rQXVkaW9Vbmtub3duKQotICAgICAgICAmJiAocEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgIT0gTTRTWVNfa1ZpZGVvVW5rbm93bikgKQotICAgICAgICB1aVByb2dyZXNzIC89IDI7Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKCB1aVByb2dyZXNzID4gMTAwICkKLSAgICB7Ci0gICAgICAgICpwUHJvZ3Jlc3MgPSAxMDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpwUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDgpdWlQcm9ncmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB0aGUgZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRTdGVwKCk6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKCkKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIFZTUyBlZGl0IG9wZXJhdGlvbi4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgKElOKSBWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfRVJSIHJldHVybmVkRXJyb3IgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBsYXN0Q1RTOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0Q2xvc2UgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24uCi0gICAgKiBJbiAidGhlb3J5Iiwgd2Ugc2hvdWxkIG5vdCBhdXRob3JpemUgY2xvc2luZyBpZiB3ZSBhcmUgaW4gQ1JFQVRFRCBzdGF0ZS4KLSAgICAqIEJ1dCBpbiBwcmFjdGljZSwgaW4gY2FzZSB0aGUgb3BlbmluZyBmYWlsZWQsIGl0IG1heSBoYXZlIGJlZW4gcGFydGlhbGx5IGRvbmUuCi0gICAgKiBJbiB0aGF0IGNhc2Ugd2UgaGF2ZSB0byBmcmVlIHNvbWUgb3BlbmVkIHJlc3NvdXJjZXMgYnkgY2FsbGluZyBDbG9zZS4gKi8KLSAgICBpZiggTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ0xPU0VEID09IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBXcm9uZyBzdGF0ZSAoMHgleCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBUaGVyZSBtYXkgYmUgYW4gZW5jb2RlciB0byBkZXN0cm95ICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IE00VlNTM0dQUF9lZGl0RGVzdHJveVZpZGVvRW5jb2RlcigpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIHJldHVybmVkRXJyb3IgPSBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBpZiggTTRTWVNfa01QMyA9PSBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBNUDMgY2FzZSAqLwotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+Y2xvc2VXcml0ZShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSBvdXRwdXQgM0dQUCBjbGlwLCBpZiBpdCBoYXMgYmVlbiBvcGVuZWQgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBsYXN0IFZpZGVvIENUUyAqLwotICAgICAgICAgICAgbGFzdENUUyA9IHBDLT5ld2MuaU91dHB1dER1cmF0aW9uOwotCi0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb24sICZsYXN0Q1RTKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IFNldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogcEZjdENsb3NlV3JpdGUoT1VUKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUgotICAgICAgICAgICAgICAgICAgICA9PSByZXR1cm5lZEVycm9yICkgLyoqPCB3ZSByZXR1cm4gdGhlIGZpcnN0IGVycm9yIHRoYXQgaGFwcGVuZWQgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybmVkRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIG91dHB1dCB2aWRlbyBEU0ksIGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpKTsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgb3V0cHV0IGF1ZGlvIERTSSwgaWYgaXQgaGFzIGJlZW4gY3JlYXRlZCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kpOwotICAgICAgICBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBjbGlwMSwgaWYgbmVlZGVkICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBDMSApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocEMtPnBDMSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChDMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IKLSAgICAgICAgICAgICAgICA9PSByZXR1cm5lZEVycm9yICkgLyoqPCB3ZSByZXR1cm4gdGhlIGZpcnN0IGVycm9yIHRoYXQgaGFwcGVuZWQgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm5lZEVycm9yID0gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBDLT5wQzEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgY2xpcDIsIGlmIG5lZWRlZCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQzIgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQzIpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAoQzIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SCi0gICAgICAgICAgICAgICAgPT0gcmV0dXJuZWRFcnJvciApIC8qKjwgd2UgcmV0dXJuIHRoZSBmaXJzdCBlcnJvciB0aGF0IGhhcHBlbmVkICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuZWRFcnJvciA9IGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+cEMyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHRlbXBvcmFyeSBZVVYgcGxhbmVzICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djFbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MVswXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYxWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MVsxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYxWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djFbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYxWzJdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djFbMl0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djJbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYyWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MlsxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYyWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djJbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYyWzJdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djJbMl0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MlsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogUkMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2M1swXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYzWzBdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djNbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYzWzFdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djNbMV0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2M1sxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djNbMl0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2M1syXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBSQyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXY0WzBdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djRbMF0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2NFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djRbMV0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2NFsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXY0WzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2NFsyXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXY0WzJdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djRbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogUkMgRnJlZSBlZmZlY3RzIGxpc3QgKi8KLSAgICBpZiggcEMtPnBFZmZlY3RzTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBFZmZlY3RzTGlzdCk7Ci0gICAgICAgIHBDLT5wRWZmZWN0c0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogUkMgRnJlZSBhY3RpdmUgZWZmZWN0cyBsaXN0ICovCi0gICAgaWYoIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QpOwotICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogIEZyZWUgYWN0aXZlIGVmZmVjdHMgbGlzdCAqLwotICAgIGlmKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxKTsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZihwQy0+bV9haXJfY29udGV4dCAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRDbG9zZSgpOiByZXR1cm5pbmcgMHgleCIsIHJldHVybmVkRXJyb3IpOwotICAgIHJldHVybiByZXR1cm5lZEVycm9yOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsZWFuVXAoKQotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBWU1MgZWRpdCBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbGVhblVwKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRDbGVhblVwIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSwgaWYgbmVlZGVkLgotICAgICogSW4gInRoZW9yeSIsIHdlIHNob3VsZCBub3QgY2xvc2UgaWYgd2UgYXJlIGluIENSRUFURUQgc3RhdGUuCi0gICAgKiBCdXQgaW4gcHJhY3RpY2UsIGluIGNhc2UgdGhlIG9wZW5pbmcgZmFpbGVkLCBpdCBtYXkgaGF2ZSBiZWVuIHBhcnRpYWxseSBkb25lLgotICAgICogSW4gdGhhdCBjYXNlIHdlIGhhdmUgdG8gZnJlZSBzb21lIG9wZW5lZCByZXNzb3VyY2VzIGJ5IGNhbGxpbmcgQ2xvc2UuICovCi0gICAgaWYoIE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBjYWxsaW5nIE00VlNTM0dQUF9lZGl0Q2xvc2UiKTsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDbG9zZShwQyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBNNFZTUzNHUFBfZWRpdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdmlkZW8gZW5jb2RlciBkdW1teSBBVSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucER1bW15QXVCdWZmZXIgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+ZXdjLnBEdW1teUF1QnVmZmVyKTsKLSAgICAgICAgcEMtPmV3Yy5wRHVtbXlBdUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBBdWRpbyBlbmNvZGVyIGNvbnRleHQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcDogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhblVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzaGVsbHMgaW50ZXJmYWNlcyAqLwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsV3JpdGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsUmVhZGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCZwQy0+U2hlbGxBUEkpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzZXR0aW5ncyBjb3BpZWQgaW4gdGhlIGludGVybmFsIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdChwQyk7Ci0KLSAgICAvKioKLSAgICAqIEZpbmFsbHksIEZyZWUgY29udGV4dCAqLwotICAgIGZyZWUocEMpOwotICAgIHBDID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRDbGVhblVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNpZmRlZiBXSU4zMgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldEVycm9yTWVzc2FnZSgpCi0gKiBAYnJpZWYgICAgUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGdpdmVuIGVycm9yIGNvZGUKLSAqIEBub3RlICAgIFRoZSBpbnB1dCBzdHJpbmcgbXVzdCBiZSBhbHJlYWR5IGFsbG9jYXRlZCAoYW5kIGxvbmcgZW5vdWdoISkKLSAqIEBwYXJhbSAgICBlcnIgICAgICAgICAgICAgICAgKElOKSBFcnJvciBjb2RlIHRvIGdldCB0aGUgZGVzY3JpcHRpb24gZnJvbQotICogQHBhcmFtICAgIHNNZXNzYWdlICAgICAgICAoSU4vT1VUKSBBbGxvY2F0ZWQgc3RyaW5nIGluIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiB3aWxsIGJlIGNvcGllZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgSW5wdXQgZXJyb3IgaXMgZnJvbSB0aGUgVlNTM0dQUCBtb2R1bGUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOklucHV0IGVycm9yIGlzIG5vdCBmcm9tIHRoZSBWU1MzR1BQIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0RXJyb3JNZXNzYWdlKCBNNE9TQV9FUlIgZXJyLCBNNE9TQV9DaGFyICpzTWVzc2FnZSApCi17Ci0gICAgc3dpdGNoKCBlcnIgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19UUkFOU0lUSU9OX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0FVRElPX1RSQU5TSVRJT05fVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX0VGRkVDVF9OVUxMOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRVhURVJOQUxfVFJBTlNJVElPTl9OVUxMIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRU5EX0NVVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9PVkVSTEFQUElOR19UUkFOU0lUSU9OUzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfT1ZFUkxBUFBJTkdfVFJBTlNJVElPTlMiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEXzNHUFBfRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQU1SX0VESVRJTkdfVU5TVVBQT1JURUQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0UiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19BVV9UT09fTEFSR0U6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0gyNjNfUFJPRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1BST0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUFJPRklMRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUlZMQzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9SVkxDIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRlJBTUVfU0laRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1RJTUVfU0NBTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fREFUQV9QQVJUSVRJT05JTkc6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0RBVEFfUEFSVElUSU9OSU5HIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU1RSRUFNX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TVFJFQU1fVFlQRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19OQl9PRl9DSEFOTkVMUzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX05CX09GX0NIQU5ORUxTIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NBTVBMSU5HX0ZSRVFVRU5DWToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9BRERWT0xVTUVfRVFVQUxTX1pFUk86Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTjoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQUREQ1RTX0hJR0hFUl9USEFOX1ZJREVPX0RVUkFUSU9OIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5ERUZJTkVEX0FVRElPX1RSQUNLX0ZJTEVfRk9STUFUOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTkRFRklORURfQVVESU9fVFJBQ0tfRklMRV9GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU06Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FVRElPX01JWElOR19VTlNVUFBPUlRFRDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQVVESU9fTUlYSU5HX1VOU1VQUE9SVEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRkVBVFVSRV9VTlNVUFBPUlRFRF9XSVRIX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfRVJSX0ZFQVRVUkVfVU5TVVBQT1JURURfV0lUSF9BVURJT19UUkFDSyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQVVESU9fQ0FOTk9UX0JFX01JWEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5QVVRfQ0xJUF9JU19OT1RfQV8zR1BQOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1A6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0JFR0lOTE9PUF9ISUdIRVJfRU5ETE9PUCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1ZJREVPX1NUUkVBTV9JTl9GSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKio8IE5vdCBhIFZTUzNHUFAgZXJyb3IgKi8KLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIiIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKiAgIFNUQVRJQyBGVU5DVElPTlMgICAqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygpCi0gKiBAYnJpZWYgICAgU2ltcGxpZnkgdGhlIGdpdmVuIGNsaXAgc2V0dGluZ3MKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gbWF5IG1vZGlmeSB0aGUgZ2l2ZW4gc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwQ2xpcCAgICAoSU4vT1VUKSBDbGlwIHNldHRpbmdzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTDoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcCApCi17Ci0gICAgTTRPU0FfVUludDggdWlGeDsKLSAgICBNNE9TQV9VSW50MzIKLSAgICAgICAgdWlDbGlwQWN0dWFsRHVyYXRpb247IC8qKjwgdGhlIGNsaXAgZHVyYXRpb24gb25jZSB0aGUgY3V0cyBhcmUgZG9uZSAqLwotICAgIE00T1NBX1VJbnQzMiB1aUR1cmF0aW9uOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqcEZ4OwotCi0gICAgLyoqCi0gICAgKiBJZiBiZWdpbiBjdXQgaXMgdG9vIGZhciwgcmV0dXJuIGFuIGVycm9yICovCi0gICAgdWlEdXJhdGlvbiA9IHBDbGlwLT5DbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLQotICAgIGlmKCBwQ2xpcC0+dWlCZWdpbkN1dFRpbWUgPiB1aUR1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjazogJWQgPiAlZCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04iLAotICAgICAgICAgICAgcENsaXAtPnVpQmVnaW5DdXRUaW1lLCB1aUR1cmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgZW5kIGN1dCBpcyB0b28gZmFyLCBzZXQgdG8gemVybyAoaXQgbWVhbnMgbm8gZW5kIGN1dCkgKi8KLSAgICBpZiggcENsaXAtPnVpRW5kQ3V0VGltZSA+IHVpRHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgcENsaXAtPnVpRW5kQ3V0VGltZSA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIGFjdHVhbCBjbGlwIGR1cmF0aW9uIChvbmNlIGN1dHMgYXJlIGRvbmUpICovCi0gICAgaWYoIDAgPT0gcENsaXAtPnVpRW5kQ3V0VGltZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBObyBlbmQgY3V0ICovCi0gICAgICAgIHVpQ2xpcEFjdHVhbER1cmF0aW9uID0gdWlEdXJhdGlvbiAtIHBDbGlwLT51aUJlZ2luQ3V0VGltZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoIHBDbGlwLT51aUJlZ2luQ3V0VGltZSA+PSBwQ2xpcC0+dWlFbmRDdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjazogJWQgPiAlZCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQiLAotICAgICAgICAgICAgICAgIHBDbGlwLT51aUJlZ2luQ3V0VGltZSwgcENsaXAtPnVpRW5kQ3V0VGltZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRU5EX0NVVDsKLSAgICAgICAgfQotICAgICAgICB1aUNsaXBBY3R1YWxEdXJhdGlvbiA9IHBDbGlwLT51aUVuZEN1dFRpbWUgLSBwQ2xpcC0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRUcmFuc2l0aW9uU2V0dGluZ3NTYW5pdHlDaGVjaygpCi0gKiBAYnJpZWYgICAgU2ltcGxpZnkgdGhlIGdpdmVuIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqIEBub3RlICAgICBUaGlzIGZ1bmN0aW9uIG1heSBtb2RpZnkgdGhlIGdpdmVuIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBUcmFuc2l0aW9uICAgIChJTi9PVVQpIFRyYW5zaXRpb24gc2V0dGluZ3MKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTDoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VHJhbnNpdGlvblNldHRpbmdzU2FuaXR5Q2hlY2soCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqcFRyYW5zaXRpb24gKQotewotICAgIC8qKgotICAgICogTm8gdHJhbnNpdGlvbiAqLwotICAgIGlmKCAwID09IHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiApCi0gICAgewotICAgICAgICBwVHJhbnNpdGlvbi0+VmlkZW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgICAgICBwVHJhbnNpdGlvbi0+QXVkaW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgIH0KLSAgICBlbHNlIGlmKCAoIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lCi0gICAgICAgID09IHBUcmFuc2l0aW9uLT5WaWRlb1RyYW5zaXRpb25UeXBlKQotICAgICAgICAmJiAoTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmUKLSAgICAgICAgPT0gcFRyYW5zaXRpb24tPkF1ZGlvVHJhbnNpdGlvblR5cGUpICkKLSAgICB7Ci0gICAgICAgIHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBleHRlcm5hbCB0cmFuc2l0aW9uIGZ1bmN0aW9uIGlzIHNldCAqLwotICAgIGlmKCAoIHBUcmFuc2l0aW9uLT5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgID49IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCkKLSAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcFRyYW5zaXRpb24tPkV4dFZpZGVvVHJhbnNpdGlvbkZjdCkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRVhURVJOQUxfVFJBTlNJVElPTl9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IG1pbmltYWwgdHJhbnNpdGlvbiBkdXJhdGlvbiAqLwotICAgIGlmKCAoIHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiA+IDApCi0gICAgICAgICYmIChwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24KLSAgICAgICAgPCBNNFZTUzNHUFBfTUlOSU1BTF9UUkFOU0lUSU9OX0RVUkFUSU9OKSApCi0gICAgewotICAgICAgICBwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24gPQotICAgICAgICAgICAgTTRWU1MzR1BQX01JTklNQUxfVFJBTlNJVElPTl9EVVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRGcmVlU2V0dGluZ3NMaXN0KCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBzZXR0aW5ncyBjb3BpZWQgaW4gdGhlIGludGVybmFsIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdCgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzZXR0aW5ncyBsaXN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBDbGlwTGlzdCApCi0gICAgewotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5ncygmKHBDLT5wQ2xpcExpc3RbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZyZWUocEMtPnBDbGlwTGlzdCk7Ci0gICAgICAgIHBDLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdHJhbnNpdGlvbiBsaXN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBUcmFuc2l0aW9uTGlzdCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wVHJhbnNpdGlvbkxpc3QpOwotICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlTVAzT3V0cHV0RmlsZSgpCi0gKiBAYnJpZWYgICAgICAgIENyZWF0ZXMgYW5kIHByZXBhcmUgdGhlIG91dHB1dCBNUCBmaWxlCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBPdXRwdXRGaWxlICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgZXJyID0KLSAgICAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ci0+b3BlbldyaXRlKCZwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBwT3V0cHV0RmlsZSwKLSAgICAgICAgTTRPU0Ffa0ZpbGVXcml0ZSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGU6IFdyaXRlT3BlbiByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgpCi0gKiBAYnJpZWYgICBDcmVhdGVzIGFuZCBwcmVwYXJlIHRoZSBvdXRwdXQgTVAzIGZpbGUKLSAqIEBub3RlICAgIENyZWF0ZXMgdGhlIHdyaXRlciwgQ3JlYXRlcyB0aGUgb3V0cHV0IGZpbGUsIEFkZHMgdGhlIHN0cmVhbXMsCi0gICAgICAgICAgIFJlYWRpZXMgdGhlIHdyaXRpbmcgcHJvY2VzcwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCBNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICpwQ19ld2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcE9zYUZpbGVXcml0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcE9zYUZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBUZW1wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbWF4T3V0cHV0RmlsZVNpemUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpVmVyc2lvbjsKLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlIHRlbXA7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSBjYWxsZWQgd2l0aCBwQ19ld2M9MHgleCwgcE91dHB1dEZpbGU9MHgleCIsCi0gICAgICAgIHBDX2V3YywgcE91dHB1dEZpbGUpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENfZXdjKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiBwQ19ld2MgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwT3V0cHV0RmlsZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogcE91dHB1dEZpbGUgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyogU2V0IHdyaXRlciAqLwotICAgIGVyciA9Ci0gICAgICAgIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKHBDX1NoZWxsQVBJLCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RPcGVuKCZwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBwT3V0cHV0RmlsZSwgcE9zYUZpbGVXcml0UHRyLCBwVGVtcEZpbGUsIHBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4gcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBzaWduYXR1cmUgb3B0aW9uIG9mIHRoZSB3cml0ZXIgKi8KLSAgICBlcnIgPQotICAgICAgICBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nLCAoTTRPU0FfRGF0YU9wdGlvbikiTlhQLVNXIDogVlNTICAgICIpOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKjExLzEyLzIwMDggQ1IzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3Q6Ci0gICAgU2V0IHRoZSBtYXggb3V0cHV0IGZpbGUgc2l6ZSBvcHRpb24gaW4gdGhlIHdyaXRlciBzbyB0aGF0IHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlCi0gICAgc21hbGxlciB0aGFuIHRoZSBnaXZlbiBmaWxlIHNpemUgbGltaXRhdGlvbiovCi0gICAgaWYoIG1heE91dHB1dEZpbGVTaXplID4gMCApCi0gICAgewotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRXUklURVJfa01heEZpbGVTaXplLCAmbWF4T3V0cHV0RmlsZVNpemUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHdyaXRlciBzZXQgb3B0aW9uIE00V1JJVEVSX2tNYXhGaWxlU2l6ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIHZlcnNpb24gb3B0aW9uIG9mIHRoZSB3cml0ZXIgKi8KLSAgICB1aVZlcnNpb24gPQotICAgICAgICAoTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUiAqIDEwMCArIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IgKiAxMAotICAgICAgICArIE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pOwotICAgIGVyciA9Ci0gICAgICAgIHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uLCAoTTRPU0FfRGF0YU9wdGlvbikgJnVpVmVyc2lvbik7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKCgoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggTTRTWVNfa1ZpZGVvVW5rbm93biAhPSBwQ19ld2MtPlZpZGVvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLmhlaWdodCA9IHBDX2V3Yy0+dWlWaWRlb0hlaWdodDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8ud2lkdGggPSBwQ19ld2MtPnVpVmlkZW9XaWR0aDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uZnBzID0KLSAgICAgICAgICAgIDAuMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgcENfZXdjLT5wVmlkZW9PdXRwdXREc2k7IC8qKjwgUHJldmlvdXNseSBjb21wdXRlZCBvdXRwdXQgRFNJICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5TaXplID0gcENfZXdjLT4KLSAgICAgICAgICAgIHVpVmlkZW9PdXRwdXREc2lTaXplOyAvKio8IFByZXZpb3VzbHkgY29tcHV0ZWQgb3V0cHV0IERTSSBzaXplICovCi0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gcENfZXdjLT5WaWRlb1N0cmVhbVR5cGU7Ci0KLSAgICAgICAgc3dpdGNoKCBwQ19ld2MtPlZpZGVvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgICAgIC8qKjwgV2UgSEFWRSB0byBwdXQgYSB2YWx1ZSBoZXJlLi4uICovCi0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5tYXhCaXRyYXRlID0gcENfZXdjLT51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogdW5rbm93biBpbnB1dCB2aWRlbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUISIsCi0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+VmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0udGltZVNjYWxlID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0ucHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0uZHVyYXRpb24gPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLQotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgIHNpemVvZihNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpICYocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8pOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFkZCB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbSgKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsICZwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbSh2aWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgQVUgcHJvcGVydGllcyBmb3IgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5hdHRyaWJ1dGUgPSBBVV9SQVA7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5DVFMgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUuRFRTID0gMDsgICAgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLmZyYWcgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUubmJGcmFnID0gMDsgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5zaXplID0gMDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLnN0cmVhbSA9ICYocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IHZpZGVvIEFVIHNpemUgKi8KLSAgICAgICAgcENfZXdjLT51aVZpZGVvTWF4QXVTaXplID0gKE00T1NBX1VJbnQzMikoMS41RgotICAgICAgICAgICAgKihNNE9TQV9GbG9hdCkocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8ud2lkdGgKLSAgICAgICAgICAgICogcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uaGVpZ2h0KQotICAgICAgICAgICAgKiBNNFZTUzNHUFBfVklERU9fTUlOX0NPTVBSRVNTSU9OX1JBVElPKTsKLSAgICAgICAgdGVtcC5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICB0ZW1wLnZhbHVlID0gcENfZXdjLT51aVZpZGVvTWF4QXVTaXplOwotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnRlbXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCB2aWRlbyBjaHVuayBzaXplICovCi0gICAgICAgIHRlbXAuc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgdGVtcC52YWx1ZSA9IChNNE9TQV9VSW50MzIpKHBDX2V3Yy0+dWlWaWRlb01heEF1U2l6ZSBcCi0gICAgICAgICAgICAqIE00VlNTM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPKTsgLyoqPCBmcm9tIG1heCBBVSBzaXplIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggQ2h1bmNrIHNpemUgKi8KLSAgICAgICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgcENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heENodW5ja1NpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnRlbXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBNNFNZU19rQXVkaW9Vbmtub3duICE9IHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3Mgc3RyZWFtQXVkaW9JbmZvOwotCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYlNhbXBsZXNQZXJTZWMgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYkJpdHNQZXJTYW1wbGUgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYkNoYW5uZWxzID0gMTsgICAgICAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0KLSAgICAgICAgaWYoIHBDX2V3Yy0+cEF1ZGlvT3V0cHV0RHNpICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiB3ZSBjb3B5IHRoZSBzdHJlYW0gZnJvbSB0aGUgaW5wdXQsIHdlIGNvcHkgaXRzIERTSSAqLwotICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5TaXplID0gcENfZXdjLT51aUF1ZGlvT3V0cHV0RHNpU2l6ZTsKLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIucEJ1ZiA9IHBDX2V3Yy0+cEF1ZGlvT3V0cHV0RHNpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogV3JpdGVyIHdpbGwgcHV0IGEgZGVmYXVsdCBEU0kgKi8KLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIuU2l6ZSA9IDA7Ci0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtSW5mby5uYlNhbXBsZXNQZXJTZWMgPQotICAgICAgICAgICAgcENfZXdjLT51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZSA9IHBDX2V3Yy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbUluZm8ubmJDaGFubmVscyA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDX2V3Yy0+dWlOYkNoYW5uZWxzOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtSW5mby5uYkJpdHNQZXJTYW1wbGUgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICBzd2l0Y2goIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBzaGVsbCwgdGhlIERTSSBpcyB0YWtlbiBpbnRvIGFjY291bnQgaW5zdGVhZCAqLwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPSBwQ19ld2MtPnVpQXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBzaGVsbCwgdGhlIERTSSBpcyB0YWtlbiBpbnRvIGFjY291bnQgaW5zdGVhZCAqLwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QMzogLyoqPCB0aGVyZSBjYW4ndCBiZSBNUDMgdHJhY2sgaW4gM0dQUCBmaWxlIC0+IGVycm9yICovCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiB1bmtub3duIG91dHB1dCBhdWRpbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUISIsCi0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBPdXIgd3JpdGVyIHNoZWxsIGludGVyZmFjZSBpcyBhIGxpdHRsZSB0cmlja3k6IHdlIHB1dCBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zCi0gICAgICAgIGluIHRoZSBEU0kgcG9pbnRlci4uLiAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikgJnN0cmVhbUF1ZGlvSW5mbzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBMaW5rIHRoZSBBVSBhbmQgdGhlIHN0cmVhbSAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuc3RyZWFtID0gJihwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgIC1wQ19ld2MtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLkRUUyA9IDA7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5hdHRyaWJ1dGUgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUubmJGcmFnID0gMDsgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5mcmFnID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAmcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IGF1ZGlvIEFVIHNpemUgKi8KLSAgICAgICAgcENfZXdjLT51aUF1ZGlvTWF4QXVTaXplID0gTTRWU1MzR1BQX0FVRElPX01BWF9BVV9TSVpFOwotICAgICAgICB0ZW1wLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIHRlbXAudmFsdWUgPSBwQ19ld2MtPnVpQXVkaW9NYXhBdVNpemU7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEFVU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmdGVtcCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa01heEFVU2l6ZSwgYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IGF1ZGlvIGNodW5jayBzaXplICovCi0gICAgICAgIHRlbXAuc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRDsKLSAgICAgICAgdGVtcC52YWx1ZSA9IE00VlNTM0dQUF9BVURJT19NQVhfQ0hVTkNLX1NJWkU7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZ0ZW1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTWF4QVVTaXplLCBhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbCBzdHJlYW1zIGFkZGVkLCB3ZSdyZSBub3cgcmVhZHkgdG8gd3JpdGUgKi8KLSAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTdGFydFdyaXRpbmcoCi0gICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0V3JpdGluZygpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCkKLSAqIEBicmllZiAgICBHZW5lcmF0ZSBhIEgyNjMgb3IgTVBFRy00IGRlY29kZXIgc3BlY2lmaWMgaW5mbyBjb21wYXRpYmxlIHdpdGggYWxsIGlucHV0IHZpZGVvCi0gKiAgICAgICAgICAgIHRyYWNrcy4gQ29weSBhdWRpbyBkc2kgZnJvbSBtYXN0ZXIgY2xpcC4KLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aU1hc3RlckNsaXAgKQotewotICAgIE00T1NBX0ludDMyIGlSZXN5bmNoTWFya2VyRHNpSW5kZXg7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUZvckRzaTsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIERlY0NvbmZpZ0luZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSBkdW1teVNpemU7Ci0gICAgTTRPU0FfQm9vbCBiR2V0RFNpRnJvbUVuY29kZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIE00RU5DT0RFUl9IZWFkZXIgKmVuY0hlYWRlcjsKLSAgICBNNFNZU19TdHJlYW1JRG1lbUFkZHIgc3RyZWFtSGVhZGVyOwotCi0gICAgcFN0cmVhbUZvckRzaSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXAgPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgKiBIMjYzIGNhc2UgKi8KLSAgICBpZiggTTRTWVNfa0gyNjMgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSDI2MyBvdXRwdXQgRFNJIGlzIGFsd2F5cyA3IGJ5dGVzICovCi0gICAgICAgIHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUgPSA3OwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5ld2MucFZpZGVvT3V0cHV0RHNpIChIMjYzKSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFZpZGVvT3V0cHV0RHNpIChIMjYzKSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiAoV2Ugb3ZlcnJpZGUgdGhlIGlucHV0IHZlbmRvciBpbmZvLgotICAgICAgICAqIEF0IGxlYXN0IHdlIGtub3cgdGhhdCBub3RoaW5nIHNwZWNpYWwgd2lsbCBiZSB0cmllZCB3aXRoIFBITFAtc3RhbXBlZAotICAgICAgICAgIGVkaXRlZCBzdHJlYW1zLi4uKSAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVswXSA9ICdQJzsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbMV0gPSAnSCc7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpWzJdID0gJ0wnOwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVszXSA9ICdQJzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZWNvZGVyIHZlcnNpb24gaXMgMCAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs0XSA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTGV2ZWwgaXMgdGhlIHNpeHRoIGJ5dGUgaW4gdGhlIERTSSAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs1XSA9IHBDLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUHJvZmlsZSBpcyB0aGUgc2V2ZW50aCBieXRlIGluIHRoZSBEU0kqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs2XSA9IHBDLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE1QRUctNCBjYXNlICovCi0gICAgZWxzZSBpZiggTTRTWVNfa01QRUdfNCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSB8fAotICAgICAgICBNNFNZU19rSDI2NCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSkgewotCi0gICAgICAgIC8qIEZvciBNUEVHNCBhbmQgSC4yNjQgZW5jb2RlciBjYXNlCi0gICAgICAgICogRmV0Y2ggdGhlIERTSSBmcm9tIHRoZSBzaGVsbCB2aWRlbyBlbmNvZGVyLCBhbmQgZmVlZCBpdCB0byB0aGUgd3JpdGVyIGJlZm9yZQotICAgICAgICBjbG9zaW5nIGl0LiAqLwotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTogZ2V0IERTSSBmb3IgSDI2NCBzdHJlYW0iKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTogcEMtPmV3Yy5wRW5jQ29udGV4dCBpcyBOVUxMIik7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQsIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOiBlbmNIZWFkZXItPnBCdWY9MHgleCwgc2l6ZT0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5wQnVmLCBlbmNIZWFkZXItPlNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgIHNlbmQgRFNJIGZvciB2aWRlbyBzdHJlYW0gdG8gM0dQIHdyaXRlciIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgbmV3IERTSSAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhlbmNIZWFkZXItPlNpemUsIE00VlNTM0dQUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKEgyNjQpIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBWaWRlb091dHB1dERzaSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IChNNE9TQV9VSW50MTYpZW5jSGVhZGVyLT5TaXplOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLCAodm9pZCAqKWVuY0hlYWRlci0+cEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0IGlzIE5VTEwsIGNhbm5vdCBnZXQgdGhlIERTSSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcFN0cmVhbUZvckRzaSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXAgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogQ29tcHV0ZSBBdWRpbyBEU0kgKi8KLSAgICBpZiggTTRTWVNfa0F1ZGlvVW5rbm93biAhPSBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICBpZiggdWlNYXN0ZXJDbGlwID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDbGlwIGlzIGFscmVhZHkgb3BlbmVkICovCi0gICAgICAgICAgICBwU3RyZWFtRm9yRHNpID0gJihwQy0+cEMxLT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBXZSBjYW4gdXNlIHRoZSBmYXN0IG9wZW4gbW9kZSB0byBnZXQgdGhlIERTSSAqLwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQ2xpcCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEluaXQoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwQ2xpcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQ2xpcCwgJnBDLT5wQ2xpcExpc3RbdWlNYXN0ZXJDbGlwXSwKLSAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRSwgTTRPU0FfVFJVRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXApOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBTdHJlYW1Gb3JEc2kgPSAmKHBDbGlwLT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBuZXcgRFNJICovCi0gICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIHBTdHJlYW1Gb3JEc2ktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCk6XAotICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwQXVkaW9PdXRwdXREc2ksIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5ld2MudWlBdWRpb091dHB1dERzaVNpemUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwU3RyZWFtRm9yRHNpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLnBBdWRpb091dHB1dERzaSwKLSAgICAgICAgICAgICh2b2lkICopcFN0cmVhbUZvckRzaS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb091dHB1dERzaVNpemUpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIElmIGEgY2xpcCBoYXMgYmVlbiB0ZW1wb3JhcmlseSBvcGVuZWQgdG8gZ2V0IGl0cyBEU0ksIGNsb3NlIGl0ICovCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoKQotICogQGJyaWVmICAgIFN3aXRjaCBmcm9tIHRoZSBjdXJyZW50IGNsaXAgdG8gdGhlIG5leHQgb25lCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQzEgKQotICAgIHsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpIHsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgIGZyZWUocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpOwotICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSBjdXJyZW50IGZpcnN0IGNsaXAgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQzEpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcDogTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKEMxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqICBpbmNyZW1lbnQgY2xpcCBjb3VudGVyICovCi0gICAgICAgIHBDLT51aUN1cnJlbnRDbGlwKys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBsYXN0IGNsaXAgKi8KLSAgICBpZiggcEMtPnVpQ3VycmVudENsaXAgPj0gcEMtPnVpQ2xpcE51bWJlciApCi0gICAgewotICAgICAgICBwQy0+cEMxID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfRklOSVNIRUQ7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6XAotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbG9zZShDMSkgcmV0dXJucyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB0aGUgbmV4dCBjbGlwIGhhcyBhbHJlYWR5IGJlIG9wZW5lZCwgc2V0IGl0IGFzIGZpcnN0IGNsaXAgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEMyICkKLSAgICB7Ci0gICAgICAgIHBDLT5wQzEgPSBwQy0+cEMyOwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5wQzItPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSA9IHBDLT5wQzItPm1fcFByZVJlc2l6ZUZyYW1lOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wQzIgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0OwotICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLSAgICAvKioKLSAgICAqIGVsc2Ugb3BlbiBpdCAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRPcGVuQ2xpcChwQywgJnBDLT5wQzEsCi0gICAgICAgICAgICAmcEMtPnBDbGlwTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0pOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcDogTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgc2Vjb25kIGNsaXAgaGFzIG5vdCBiZWVuIG9wZW5lZCB5ZXQsCi0gICAgICAgICAgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGhhcyBiZWVuIG5vIHRyYW5zaXRpb24uCi0gICAgICAgICogU28gYm90aCBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIHRpbWVzIGFyZSBPSy4KLSAgICAgICAgKiBTbyB3ZSBjYW4gc2V0IGJvdGggdmlkZW8yIGFuZCBhdWRpbyBvZmZzZXRzICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWRkIGN1cnJlbnQgdmlkZW8gb3V0cHV0IENUUyB0byB0aGUgY2xpcCB2aWRlbyBvZmZzZXQgKi8KLQotICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICBwQy0+cEMxLT5pVm9mZnNldCArPSAoTTRPU0FfVUludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgY3VycmVudCBhdWRpbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIGF1ZGlvIG9mZnNldCAqLwotICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCArPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogMjAwNS0wMy0yNDogQnVnRml4IGZvciBhdWRpby12aWRlbyBzeW5jaHJvOgotICAgICAgICAqIFRoZXJlIG1heSBiZSBhIHBvcnRpb24gb2YgdGhlIGR1cmF0aW9uIG9mIGFuIGF1ZGlvIEFVIG9mIGRlc3luY2hybyBhdCBlYWNoIGFzc2VtYmx5LgotICAgICAgICAqIEl0IGxlYWRzIHRvIGFuIGF1ZGlibGUgZGVzeW5jaHJvIHdoZW4gdGhlcmUgYXJlIGEgbG90IG9mIGNsaXBzIGFzc2VtYmxlZC4KLSAgICAgICAgKiBUaGlzIGJ1ZyBmaXggYWxsb3dzIHRvIHJlc3luY2ggdGhlIGF1ZGlvIHRyYWNrIHdoZW4gdGhlIGRlbHRhIGlzIGhpZ2hlcgotICAgICAgICAqIHRoYW4gb25lIGF1ZGlvIEFVIGR1cmF0aW9uLgotICAgICAgICAqIFdlIFN0ZXAgb25lIEFVIGluIHRoZSBzZWNvbmQgY2xpcCBhbmQgd2UgY2hhbmdlIHRoZSBhdWRpbyBvZmZzZXQgYWNjb3JkaW5nbHkuICovCi0gICAgICAgIGlmKCAoIHBDLT5wQzEtPmlBb2Zmc2V0Ci0gICAgICAgICAgICAtIChNNE9TQV9JbnQzMikocEMtPnBDMS0+aVZvZmZzZXQgKnBDLT5wQzEtPnNjYWxlX2F1ZGlvICsgMC41KSkKLSAgICAgICAgPiBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBZHZhbmNlIG9uZSBBTVIgZnJhbWUgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVwZGF0ZSBhdWRpbyBvZmZzZXQgYWNjb3JkaW5nbHkqLwotICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLT0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluaXQgc3RhcnRpbmcgc3RhdGUgZm9yIHRoaXMgY2xpcCBwcm9jZXNzaW5nICovCi0gICAgaWYoIE00U1lTX2tNUDMgPT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gdGhlIE1QMyBjYXNlIHdlIHVzZSBhIHNwZWNpYWwgYXVkaW8gc3RhdGUgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIHN0YXJ0IHdpdGggdGhlIHZpZGVvIHByb2Nlc3NpbmcgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0KLSAgICAgICAgaWYoIHBDLT5Wc3RhdGUgIT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogaWYgbm90IGEgdHJhbnNpdGlvbiB0aGVuIHJlc2V0IHByZXZpb3VzIHZpZGVvIHN0YXRlICovCi0gICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIFRoZSBmbGFncyBhcmUgc2V0IHRvIGZhbHNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgY2xpcCAqLwotICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgLyogUkM6IHRvIGtub3cgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi0gICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVA7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbygpCi0gKiBAYnJpZWYgICAgRG8gd2hhdCB0byBkbyB3aGVuIHRoZSBlbmQgb2YgYSBjbGlwIHZpZGVvIHRyYWNrIGlzIHJlYWNoZWQKLSAqIEBub3RlICAgIElmIHRoZXJlIGlzIGF1ZGlvIG9uIHRoZSBjdXJyZW50IGNsaXAsIHByb2Nlc3MgaXQsIGVsc2Ugc3dpdGNoIHRvIHRoZSBuZXh0IGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogVmlkZW8gaXMgZG9uZSBmb3IgdGhpcyBjbGlwLCBub3cgd2UgZG8gdGhlIGF1ZGlvICovCi0gICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQVVESU87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsaXAgZG9uZSwgZG8gdGhlIG5leHQgb25lICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvOiBNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oKQotICogQGJyaWVmICAgIERvIHdoYXQgdG8gZG8gd2hlbiB0aGUgZW5kIG9mIGEgY2xpcCBhdWRpbyB0cmFjayBpcyByZWFjaGVkCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIENsaXAgZG9uZSwgZG8gdGhlIG5leHQgb25lICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbzogTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFN0YXJ0IHdpdGggdGhlIHZpZGVvICovCi0gICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkKLSAqIEBicmllZiAgICBPcGVuIG5leHQgY2xpcAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRPcGVuQ2xpcCggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKiogaENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsgLyoqPCBzaG9ydGN1dCAqLwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDMyIGlDdHM7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBcIiVzXCIiLAotICAgICAgICAoTTRPU0FfQ2hhciAqKXBDbGlwU2V0dGluZ3MtPnBGaWxlKTsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSW5pdChoQ2xpcCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBNNFZTUzNHUFBfaW50Q2xpcEluaXQoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgaWYoICpoQ2xpcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCpoQ2xpcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBzaG9ydGN1dCAqLwotICAgIHBDbGlwID0gKmhDbGlwOwotCi0gICAgaWYgKHBDbGlwU2V0dGluZ3MtPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCApIHsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzID0gJnBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzOwotICAgICAgICBwQ2xpcC0+cFNldHRpbmdzID0gcENsaXBTZXR0aW5nczsKLSAgICAgICAgcENsaXAtPmlFbmRUaW1lID0gcENsaXBTZXR0aW5ncy0+dWlFbmRDdXRUaW1lOwotICAgIH0KLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQ2xpcCwgcENsaXBTZXR0aW5ncywKLSAgICAgICAgICAgICAgTTRPU0FfRkFMU0UsIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IFwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwT3BlbigpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXApOwotICAgICAgICAqaENsaXAgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKSB7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcyA9ICZwQ2xpcC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvcHkgY29tbW9uICdzaWxlbmNlIGZyYW1lIHN0dWZmJyB0byBDbGlwQ29udGV4dCAqLwotICAgIHBDbGlwLT51aVNpbGVuY2VQY21TaXplID0gcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplOwotICAgIHBDbGlwLT5wU2lsZW5jZUZyYW1lRGF0YSA9IHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgcENsaXAtPnVpU2lsZW5jZUZyYW1lU2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgIHBDbGlwLT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICBwQ2xpcC0+c2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcENsaXAtPmlBdWRpb0ZyYW1lQ3RzID0gLXBDbGlwLT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qIFJlc2V0IHRpbWUgKi8KLQotICAgIC8qKgotICAgICogSWYgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG91dHB1dCBhdWRpbyBmb3JtYXQsCi0gICAgKiB3ZSByZW1vdmUgaXQuIFNvIGl0IHdpbGwgYmUgcmVwbGFjZWQgYnkgc2lsZW5jZSAqLwotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjayhwQ2xpcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBY3R1YWwgYmVnaW4gY3V0ICovCi0gICAgaWYoIDAgPT0gcENsaXBTZXR0aW5ncy0+dWlCZWdpbkN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcENsaXAtPmlWb2Zmc2V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBb2Zmc2V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZihwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSnVtcCB0aGUgdmlkZW8gdG8gdGhlIHRhcmdldCBiZWdpbiBjdXQgdG8gZ2V0IHRoZSBhY3R1YWwgYmVnaW4gY3V0IHZhbHVlICovCi0gICAgICAgICAgICBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQ2xpcFNldHRpbmdzLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgIGlDdHMgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAocENsaXAtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXAtPnBWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBtX3BGY3RKdW1wKFYpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVcGRhdGUgY2xpcCBvZmZzZXQgd2l0aCB0aGUgdmlkZW8gYmVnaW4gY3V0ICovCi0gICAgICAgICAgICBwQ2xpcC0+aVZvZmZzZXQgPSAtcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSnVtcCB0aGUgYXVkaW8gdG8gdGhlIHZpZGVvIGFjdHVhbCBiZWdpbiBjdXQgKi8KLSAgICAgICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rTVAzICE9IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+aUFjdHVhbEF1ZGlvQmVnaW5DdXQgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0gICAgICAgICAgICAgICAgaUN0cyA9IChNNE9TQV9JbnQzMikocENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0Ci0gICAgICAgICAgICAgICAgICAgICogcENsaXAtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocENsaXAsICZpQ3RzKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoQSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjbGlwIG9mZnNldCB3aXRoIHRoZSBhdWRpbyBiZWdpbiBjdXQgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcC0+aUFvZmZzZXQgPSAtaUN0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEZvciB0aGUgTVAzLCB0aGUganVtcCBpcyBub3QgZG9uZSBiZWNhdXNlIG9mIHRoZSBWQlIsCi0gICAgICAgICAgICAgICAgICBpdCBjb3VsZCBiZSBub3QgZW5vdWdoIGFjY3VyYXRlICovCi0gICAgICAgICAgICAgICAgcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKXBDbGlwU2V0dGluZ3MtPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgaWYgKChwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKSkgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogUmVhZCB0aGUgZmlyc3QgVmlkZW8gQVUgb2YgdGhlIGNsaXAgKi8KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICBwQ2xpcC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcC0+cFZpZGVvU3RyZWFtLCAmcENsaXAtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2UgKGFscmVhZHkhKSByZWFjaCB0aGUgZW5kIG9mIHRoZSBjbGlwLCB3ZSBmaWx0ZXIgdGhlIGVycm9yLgotICAgICAgICAgICAgICAgICogSXQgd2lsbCBiZSBjb3JyZWN0bHkgbWFuYWdlZCBhdCB0aGUgZmlyc3Qgc3RlcC4gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IFwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGggID0gcENsaXBQcm9wZXJ0aWVzLT51aVN0aWxsUGljV2lkdGg7Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQgPSBwQ2xpcFByb3BlcnRpZXMtPnVpU3RpbGxQaWNIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLyogc3RhdGUgY2hlY2sgbm90IHRvIGFsbG9jYXRlIGJ1ZmZlciBkdXJpbmcgc2F2ZSBzdGFydCAqLwotCi0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogVmlkZW8gcmVzaXplIG1hbmFnZW1lbnQgICAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgaW5wdXQgY2xpcCBpcyBhIHJvdGF0ZSB2aWRlbyBvciB0aGUgb3V0cHV0IHJlc29sdXRpb24gaXMgZGlmZmVyZW50Ci0gICAgICAgICogZnJvbSB0aGUgaW5wdXQgcmVzb2x1dGlvbiwgdGhlbiB0aGUgdmlkZW8gZnJhbWUgbmVlZHMgdG8gYmUgcm90YXRlZAotICAgICAgICAqIG9yIHJlc2l6ZWQsIGZvcmNlIHRvIHJlc2l6ZSBtb2RlICovCi0gICAgICAgIGlmICgoKE00T1NBX1VJbnQzMilwQy0+ZXdjLnVpVmlkZW9XaWR0aCAhPQotICAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9XaWR0aCkgfHwKLSAgICAgICAgICAgICgoTTRPU0FfVUludDMyKXBDLT5ld2MudWlWaWRlb0hlaWdodCAhPQotICAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQpIHx8Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnZpZGVvUm90YXRpb25EZWdyZWVzICE9IDApIHsKLQotICAgICAgICAgICAgaWYgKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIHZpZGVvIHBsYW5lIHRoYXQgd2lsbAotICAgICAgICAgICAgICAgICAgcmVjZWl2ZSB0aGUgZGVjb2RlZCBpbWFnZSBiZWZvcmUgcmVzaXppbmcgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWUgPQotICAgICAgICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWU1MzR1BQLAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicFByZVJlc2l6ZUZyYW1lIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBZIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGggID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGg7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3N0cmlkZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jICgKLSAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgKiBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBVIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGggID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQgPj4gMTsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyAoCi0gICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlICogcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBWIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGggPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfc3RyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPQotICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKAotICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X3N0cmlkZSAqIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBUaGUgdmlkZW8gaXMgY3VycmVudGx5IGluIHJlYWRpbmcgbW9kZSAqLwotICAgICAgICBwQ2xpcC0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIH0KLQotICAgIGlmKCAoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUpCi0gICAgICAgICYmIChNNFZJREVPRURJVElOR19rTVAzICE9IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBSZWFkIHRoZSBmaXJzdCBBdWRpbyBBVSBvZiB0aGUgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcCk7Ci0KLSAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBUaGUgYXVkaW8gaXMgY3VycmVudGx5IGluIHJlYWRpbmcgbW9kZSAqLwotICAgICAgICBwQ2xpcC0+QXN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludE9wZW5DbGlwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dEF2ZXJhZ2VWaWRlb0JpdHJhdGUoKQotICogQGJyaWVmICAgIEF2ZXJhZ2UgYml0cmF0ZSBvZiB0aGUgb3V0cHV0IGZpbGUsIGNvbXB1dGVkIGZyb20gaW5wdXQgYml0cmF0ZXMsCi0gKiAgICAgICAgICBkdXJhdGlvbnMsIHRyYW5zaXRpb25zIGFuZCBjdXRzLgotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0QXZlcmFnZVZpZGVvQml0cmF0ZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDU18wLCAqcENTXzEsICpwQ1NfMjsKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICpwVDAsICpwVDI7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX1VJbnQzMiB0MF9kdXJhdGlvbiwgdDJfZHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIHQwX2JpdHJhdGUsIHQyX2JpdHJhdGU7Ci0gICAgTTRPU0FfVUludDMyIGMxX2R1cmF0aW9uOwotCi0gICAgTTRPU0FfVUludDMyIHRvdGFsX2R1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiB0b3RhbF9iaXRzdW07Ci0KLSAgICB0b3RhbF9kdXJhdGlvbiA9IDA7Ci0gICAgdG90YWxfYml0c3VtID0gMDsKLQotICAgIC8qIExvb3Agb24gdGhlIG51bWJlciBvZiBjbGlwcyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDU18xID0gJnBDLT5wQ2xpcExpc3RbaV07Ci0KLSAgICAgICAgdDBfZHVyYXRpb24gPSAwOwotICAgICAgICB0MF9iaXRyYXRlID0gcENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotICAgICAgICB0Ml9kdXJhdGlvbiA9IDA7Ci0gICAgICAgIHQyX2JpdHJhdGUgPSBwQ1NfMS0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0KLSAgICAgICAgLyogVHJhbnNpdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBjbGlwICovCi0gICAgICAgIGlmKCBpID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDU18wID0gJnBDLT5wQ2xpcExpc3RbaSAtIDFdOwotICAgICAgICAgICAgcFQwID0gJnBDLT5wVHJhbnNpdGlvbkxpc3RbaSAtIDFdOwotCi0gICAgICAgICAgICBpZiggcFQwLT5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgICAgICAgICAgIT0gTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHQwX2R1cmF0aW9uID0gcFQwLT51aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIGlmKCBwQ1NfMC0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgPiB0MF9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQwX2JpdHJhdGUgPSBwQ1NfMC0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogVHJhbnNpdGlvbiB3aXRoIHRoZSBuZXh0IGNsaXAgKi8KLSAgICAgICAgaWYoIGkgPCBwQy0+dWlDbGlwTnVtYmVyIC0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDU18yID0gJnBDLT5wQ2xpcExpc3RbaSArIDFdOwotICAgICAgICAgICAgcFQyID0gJnBDLT5wVHJhbnNpdGlvbkxpc3RbaV07Ci0KLSAgICAgICAgICAgIGlmKCBwVDItPlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAhPSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfTm9uZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdDJfZHVyYXRpb24gPSBwVDItPnVpVHJhbnNpdGlvbkR1cmF0aW9uOwotCi0gICAgICAgICAgICAgICAgaWYoIHBDU18yLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA+IHQyX2JpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdDJfYml0cmF0ZSA9IHBDU18yLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDaGVjayBmb3IgY3V0IHRpbWVzICovCi0gICAgICAgIGlmKCBwQ1NfMS0+dWlFbmRDdXRUaW1lID4gMCApCi0gICAgICAgICAgICBjMV9kdXJhdGlvbiA9IHBDU18xLT51aUVuZEN1dFRpbWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGMxX2R1cmF0aW9uID0gcENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0KLSAgICAgICAgaWYoIHBDU18xLT51aUJlZ2luQ3V0VGltZSA+IDAgKQotICAgICAgICAgICAgYzFfZHVyYXRpb24gLT0gcENTXzEtPnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgIGMxX2R1cmF0aW9uIC09IHQwX2R1cmF0aW9uICsgdDJfZHVyYXRpb247Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBiaXRzdW0gYW5kIGR1cmF0aW9uICovCi0gICAgICAgIHRvdGFsX2R1cmF0aW9uICs9IGMxX2R1cmF0aW9uICsgdDBfZHVyYXRpb24gLyAyICsgdDJfZHVyYXRpb24gLyAyOwotCi0gICAgICAgIHRvdGFsX2JpdHN1bSArPQotICAgICAgICAgICAgYzFfZHVyYXRpb24gKiAocENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlIC8gMTAwMCkKLSAgICAgICAgICAgICsgKHQwX2JpdHJhdGUgLyAxMDAwKSAqIHQwX2R1cmF0aW9uIC8gMgotICAgICAgICAgICAgKyAodDJfYml0cmF0ZSAvIDEwMDApICogdDJfZHVyYXRpb24gLyAyOwotICAgIH0KLQotICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPSAoIHRvdGFsX2JpdHN1bSAvIHRvdGFsX2R1cmF0aW9uKSAqIDEwMDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXRBdWRpby5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdEF1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0Njg4M2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdEF1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfRWRpdEF1ZGlvLmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGVkaXQgQVBJIGltcGxlbWVudGF0aW9uLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqIE91ciBoZWFkZXIgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0vKioKLSAqIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKio8IE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotI2RlZmluZSBQV1JfRlhQX0ZSQUNUX01BWCAgICAgICAgICAgICgzMjc2OCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXRpYyBsb2NhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvRWZmZWN0cyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX1VJbnQ4IHVpQ2xpcE51bWJlciApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdCggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9VSW50OCB1aUNsaXAxb3JDbGlwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9JbnQxNiAqcFBDTWRhdGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSApOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGp1bXBpbmcgcHJvY2Vzc2luZyBmb3IgdGhlIE1QMyBjbGlwLgotICogQG5vdGUgICAgT24gb25lIHN0ZXAsIHRoZSBqdW1wIG9mIHNldmVyYWwgQVUgaXMgZG9uZQotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwID0gcEMtPnBDMTsgLyoqPCBzaG9ydGN1dCAqLwotICAgIE00T1NBX0ludDMyIEp1bXBDdHM7Ci0KLSAgICBKdW1wQ3RzID0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0OwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChwQ2xpcCwgJkp1bXBDdHMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChBKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoIEp1bXBDdHMgPj0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX01QMzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgY2xpcCBvZmZzZXQgd2l0aCB0aGUgYXVkaW8gYmVnaW4gY3V0ICovCi0gICAgICAgIHBDbGlwLT5pQW9mZnNldCA9IC1KdW1wQ3RzOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFRoZSBhdWRpbyBpcyBjdXJyZW50bHkgaW4gcmVhZGluZyBtb2RlICovCi0gICAgICAgIHBDbGlwLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcgZm9yIHRoZSBNUDMgY2xpcAotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwID0gcEMtPnBDMTsgLyoqPCBzaG9ydGN1dCAqLwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBpbnB1dCBBVSB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIHBDbGlwLT5wQXVkaW9GcmFtZVB0ciwgKE00T1NBX1VJbnQzMilwQ2xpcC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcCk7Ci0KLSAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLCAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgY3VycmVudCB0aW1lICh0bz10YytUKSAqLwotICAgICAgICBwQy0+ZXdjLmRBVG8gPQotICAgICAgICAgICAgKCBwQ2xpcC0+aUF1ZGlvRnJhbWVDdHMgKyBwQ2xpcC0+aUFvZmZzZXQpIC8gcENsaXAtPnNjYWxlX2F1ZGlvOwotCi0gICAgICAgIGlmKCAoTTRPU0FfSW50MzIpKHBDbGlwLT5pQXVkaW9GcmFtZUN0cyAvIHBDbGlwLT5zY2FsZV9hdWRpbyArIDAuNSkKLSAgICAgICAgICAgID49IHBDbGlwLT5pRW5kVGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00UkVBREVSX0J1ZmZlciBtcDN0YWdCdWZmZXI7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGUgZHVyYXRpb24gaXMgYmV0dGVyIHJlc3BlY3RlZCBpZiB0aGUgZmlyc3QgQVUgYW5kIGxhc3QgQVUgYXJlIGJvdGggYWJvdmUKLSAgICAgICAgICAgIHRoZSBjdXQgdGltZSAqLwotICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgcENsaXAtPnBBdWRpb0ZyYW1lUHRyLAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpcENsaXAtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAvKiBUaGUgSUQzdjEgdGFnIGlzIGFsd2F5cyBhdCB0aGUgZW5kIG9mIHRoZSBtcDMgZmlsZSBzbyB0aGUgZW5kIG9mIHRoZSBjdXR0aW5nCi0gICAgICAgICAgICBwcm9jZXNzIGlzIHdhaXRlZCAqLwotICAgICAgICAgICAgLyogYmVmb3JlIHdyaXRpbmcgdGhlIG1ldGFkYXRhIGluIHRoZSBvdXRwdXQgZmlsZSovCi0KLSAgICAgICAgICAgIC8qIFJldHJpZXZlIHRoZSBkYXRhIG9mIHRoZSBJRDN2MSBUYWcgKi8KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQ2xpcC0+cFJlYWRlckNvbnRleHQsIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MVRhZywKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm1wM3RhZ0J1ZmZlcik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDM6IE00TVAzUl9nZXRPcHRpb24gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBXcml0ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjEgVGFnIGluIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICAgICAgaWYoIDAgIT0gbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KW1wM3RhZ0J1ZmZlci5tX3BEYXRhLCBtcDN0YWdCdWZmZXIubV91aUJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRnJlZSBiZWZvcmUgdGhlIGVycm9yIGNoZWNraW5nIGFueXdheSAqLwotICAgICAgICAgICAgICAgIGZyZWUobXAzdGFnQnVmZmVyLm1fcERhdGEpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFcnJvciBjaGVja2luZyAqLwotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDM6XAotICAgICAgICAgICAgICAgICAgICAgICAgcE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEoSUQzdjFUYWcpIHJldHVybnMgMHgleCIsICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplID0gMDsKLSAgICAgICAgICAgICAgICBtcDN0YWdCdWZmZXIubV9wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFRoZSBFbmQgQ3V0IGhhcyBiZWVuIHJlYWNoZWQgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyhwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMgOiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpICYmIChNNE9TQV9GQUxTRQotICAgICAgICAgICAgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSkgKSAvKio8IFJlYWNoZWQgZW5kIG9mIGNsaXAgKi8KLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKAotICAgICAgICAgICAgICAgIHBDKTsgLyoqPCBDbGlwIGRvbmUsIGRvIHRoZSBuZXh0IG9uZSAqLwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBpbnQzMl90IGF1VGltZVN0YW1wID0gLTE7Ci0KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY0luQnVmZmVyOyAgLyoqPCBFbmNvZGVyIGlucHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNPdXRCdWZmZXI7IC8qKjwgRW5jb2RlciBvdXRwdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICBNNE9TQV9UaW1lCi0gICAgICAgIGZyYW1lVGltZURlbHRhOyAvKio8IER1cmF0aW9uIG9mIHRoZSBlbmNvZGVkICh0aGVuIHdyaXR0ZW4pIGRhdGEgKi8KLSAgICBNNE9TQV9Cb29sIGJTdG9wQXVkaW87Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgZW5kIGN1dCAqLwotICAgIGlmKCAoIHBDLT5ld2MuZEFUbyAtIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8gKyAwLjUpCi0gICAgICAgID49IHBDLT5wQzEtPmlFbmRUaW1lICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEF1ZGlvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8ocEMpOwotCi0gICAgICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgJiYgZXJyICE9IE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgQXVkaW8gTW9kZSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IG91dHB1dCBDVFMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoCi0gICAgICAgIHBDKTsgLyoqPCBUaGlzIGZ1bmN0aW9uIGNoYW5nZSB0aGUgcEMtPkFzdGF0ZSB2YXJpYWJsZSEgKi8KLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiICBBVURJTyBzdGVwIDogZEFUbyA9ICVmICBzdGF0ZSA9ICVkICBvZmZzZXQgPSAlbGQiLAotICAgICAgICBwQy0+ZXdjLmRBVG8sIHBDLT5Bc3RhdGUsIHBDLT5wQzEtPmlBb2Zmc2V0KTsKLQotICAgIGJTdG9wQXVkaW8gPSBNNE9TQV9GQUxTRTsKLQotICAgIHN3aXRjaCggcEMtPkFzdGF0ZSApCi0gICAgewotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgUkVBRF9XUklURSBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfUkVBRF9XUklURToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8gUkVBRF9XUklURSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICBSRUFEX1dSSVRFOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvbXB1dGUgb3V0cHV0IGF1ZGlvIENUUyAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgPQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyArIHBDLT5wQzEtPmlBb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBCWlpaIGJ1ZyBmaXggKHJlYWQtd3JpdGUgY2FzZSk6Ci0gICAgICAgICAgICAgICAgKiBSZXBsYWNlIHRoZSBmaXJzdCBBTVIgQVUgb2YgdGhlIHN0cmVhbSB3aXRoIGEgc2lsZW5jZSBBVS4KLSAgICAgICAgICAgICAgICAqIEl0IHJlbW92ZXMgYW5ub3lpbmcgIkJaWloiIGF1ZGlvIGdsaXRjaC4KLSAgICAgICAgICAgICAgICAqIEl0IGlzIG5vdCBuZWVkZWQgaWYgdGhlcmUgaXMgYSBiZWdpbiBjdXQuCi0gICAgICAgICAgICAgICAgKiBJdCBpcyBub3QgbmVlZGVkIGZvciB0aGUgZmlyc3QgY2xpcC4KLSAgICAgICAgICAgICAgICAqIEJlY2F1c2Ugb2YgYW5vdGhlciBidWdmaXggKDIwMDUtMDMtMjQpLCB0aGUgZmlyc3QgQVUgd3JpdHRlbiBtYXkgYmUKLSAgICAgICAgICAgICAgICAqIHRoZSBzZWNvbmQgb25lIHdoaWNoIENUUyBpcyAyMC4gSGVuY2UgdGhlIGN0czwyMSB0ZXN0LgotICAgICAgICAgICAgICAgICogKHRoZSBCWlpaIGVmZmVjdCBvY2N1cnMgZXZlbiB3aXRoIHRoZSBzZWNvbmQgQVUhKSAqLwotICAgICAgICAgICAgICAgIGlmKCAoIE00T1NBX0ZBTFNFID09IHBDLT5wQzEtPmJGaXJzdEF1V3JpdHRlbikKLSAgICAgICAgICAgICAgICAgICAgJiYgKDAgIT0gcEMtPnVpQ3VycmVudENsaXApICYmIChwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICA8IChwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiArIDEpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb3B5IGEgc2lsZW5jZSBBVSB0byB0aGUgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSwgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiQSAjIyMjIHNpbGVuY2UgQVUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggKE00T1NBX1VJbnQzMilwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplCi0gICAgICAgICAgICAgICAgICAgIDwgcEMtPmV3Yy51aUF1ZGlvTWF4QXVTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPnBBdWRpb0ZyYW1lUHRyLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBSRUFEX1dSSVRFOiBBVSBzaXplIGdyZWF0ZXIgdGhhbiBNYXhBdVNpemUgXAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkPiVkKSEgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQVVfVE9PX0xBUkdFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUsIHBDLT5ld2MudWlBdWRpb01heEF1U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFRoaXMgYm9vbGVhbiBpcyBvbmx5IHVzZWQgdG8gZml4IHRoZSBCWlogYnVnLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+YkZpcnN0QXVXcml0dGVuID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJCIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qMTEvMTIvMjAwOCBDUiAzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3QKLSAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRXQVJfV1JJVEVSX1NUT1BfUkVRIGlzIHJldHVybmVkIHdoZW4gdGhlIHRhcmdldGVkIG91dHB1dCBmaWxlCi0gICAgICAgICAgICAgICAgICAgIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLAotICAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogRmlsZSB3YXMgY3V0IHRvIGF2b2lkIG92ZXJzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURfV1JJVEU6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXVkaW8gaXMgbm93IGluIHJlYWQgbW9kZSAodGhlcmUgbWF5IGJlIGEgImlmKHN0YXR1cyE9UkVBRCkiIGhlcmUsCi0gICAgICAgICAgICAgICAgYnV0IGl0IGlzIHJlbW92ZWQgZm9yIG9wdGltaXphdGlvbikgKi8KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogUkVBRF9XUklURTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjdXJyZW50IHRpbWUgKHRvPXRjK1QpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZEFUbyA9ICggcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW87Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoTTRPU0FfRkFMU0UgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSWYgb3V0cHV0IGlzIG90aGVyIHRoYW4gQU1SIG9yIEFBQwotICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gRVZSQyx3ZSBjYW4ndCB3cml0ZSBzaWxlbmNlIGludG8gaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFNvIHdlIHNpbXBseSBlbmQgaGVyZS4qLwotICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgREVDT0RFX0VOQ09ERSBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfREVDT0RFX0VOQ09ERToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8gREVDT0RFX0VOQ09ERSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHdlIHdlcmUgcmVhZGluZyB0aGUgY2xpcCwgd2UgbXVzdCBqdW1wIGEgZmV3IEFVIGJhY2t3YXJkIHRvIGRlY29kZS9lbmNvZGUKLSAgICAgICAgICAgICAgICAod2l0aG91dCB3cml0aW5nIHJlc3VsdCkgZnJvbSB0aGF0IHBvaW50LiAqLwotICAgICAgICAgICAgICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCA9PSBwQy0+cEMxLT5Bc3RhdHVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGlUYXJnZXRDdHMsIGlDdXJyZW50Q3RzOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBwQy0+cEMxLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlBdWRpb0ZyYW1lQ3RzICkgLyoqPGRvbid0IHRyeSB0byBwcmUtZGVjb2RlIGlmIGNsaXAgaXMgYXQgaXRzIGJlZ2lubmluZy4gKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYSBmZXcgQVVzIGJhY2t3YXJkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpQ3VycmVudEN0cyA9IHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzOwotICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldEN0cyA9IGlDdXJyZW50Q3RzIC0gTTRWU1MzR1BQX05CX0FVX1BSRUZFVENICi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlUYXJnZXRDdHMgPCAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVGFyZ2V0Q3RzID0gMDsgLyoqPCBTYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChwQy0+cEMxLCAmaVRhcmdldEN0cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMSk7IC8qKjwgcmVhZCBBVSB3aGVyZSB3ZSBqdW1wZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkQgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREUtcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShhKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRGVjb2RlL2VuY29kZSB1cCB0byB0aGUgd2FudGVkIHBvc2l0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgPCBpQ3VycmVudEN0cyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJFICoqKiogcHJlLWVuY29kZSIpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvL2lmKDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0pCi0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBBdWRpb0ZyYW1lUHRyID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aW1lc3RhbXAgb2YgbGFzdCByZWFkIEFVCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cEF1ZGlvRGVjQ3R4dCwgTTRBRF9rT3B0aW9uSURfQXVDVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmYXVUaW1lU3RhbXApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1VGltZVN0YW1wID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBhdWRpbyB0aW1lc3RhbXAgcmV0dXJuZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX0lOVkFMSURfVElNRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyA9IGF1VGltZVN0YW1wOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBBdWRpbyBpcyBub3cgT0sgZm9yIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkFzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5wQXVkaW9GcmFtZVB0ciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGltZXN0YW1wIG9mIGxhc3QgcmVhZCBBVQotICAgICAgICAgICAgICAgIHBDLT5wQzEtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX0F1Q1RTLAotICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmF1VGltZVN0YW1wKTsKLQotICAgICAgICAgICAgICAgIGlmIChhdVRpbWVTdGFtcCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IGludmFsaWQgYXVkaW8gXAotICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wIHJldHVybmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgPSBhdVRpbWVTdGFtcDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QocEMsIDEsIChNNE9TQV9JbnQxNgotICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRFbmRBdWRpb0VmZmVjdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb21wdXRlIG91dHB1dCBhdWRpbyBDVFMgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldDsKLQotICAgICAgICAgICAgICAgIC8qIE1heSBoYXBwZW4gd2l0aCBjb3JydXB0ZWQgaW5wdXQgZmlsZXMgKHdoaWNoIGhhdmUgc3R0cyBlbnRyaWVzIG5vdAotICAgICAgICAgICAgICAgIG11bHRpcGxlIG9mIFNpbGVuY2VGcmFtZUR1cmF0aW9uKSAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIDwgMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEJaWlogYnVnIGZpeCAoZGVjb2RlLWVuY29kZSBjYXNlKToKLSAgICAgICAgICAgICAgICAqIChZZXMsIHRoZSBCenogYnVnIG1heSBhbHNvIG9jY3VyIHdoZW4gd2UgcmUtZW5jb2RlLiBJdCBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgKiAgb2NjdXIgYXQgdGhlIGRlY29kZSBiZWZvcmUgdGhlIGVuY29kZSwgYnV0IGF0IHRoZSBwbGF5YmFjayEpCi0gICAgICAgICAgICAgICAgKiBSZXBsYWNlIHRoZSBmaXJzdCBBTVIgQVUgb2YgdGhlIGVuY29kZWQgc3RyZWFtIHdpdGggYSBzaWxlbmNlIEFVLgotICAgICAgICAgICAgICAgICogSXQgcmVtb3ZlcyBhbm5veWluZyAiQlpaWiIgYXVkaW8gZ2xpdGNoLgotICAgICAgICAgICAgICAgICogSXQgaXMgbm90IG5lZWRlZCBpZiB0aGVyZSBpcyBhIGJlZ2luIGN1dC4KLSAgICAgICAgICAgICAgICAqIEl0IGlzIG5vdCBuZWVkZWQgZm9yIHRoZSBmaXJzdCBjbGlwLgotICAgICAgICAgICAgICAgICogQmVjYXVzZSBvZiBhbm90aGVyIGJ1Z2ZpeCAoMjAwNS0wMy0yNCksIHRoZSBmaXJzdCBBVSB3cml0dGVuIG1heSBiZQotICAgICAgICAgICAgICAgICogdGhlIHNlY29uZCBvbmUgd2hpY2ggQ1RTIGlzIDIwLiBIZW5jZSB0aGUgY3RzPDIxIHRlc3QuCi0gICAgICAgICAgICAgICAgKiAodGhlIEJaWlogZWZmZWN0IG9jY3VycyBldmVuIHdpdGggdGhlIHNlY29uZCBBVSEpICovCi0gICAgICAgICAgICAgICAgaWYoICggTTRPU0FfRkFMU0UgPT0gcEMtPnBDMS0+YkZpcnN0QXVXcml0dGVuKQotICAgICAgICAgICAgICAgICAgICAmJiAoMCAhPSBwQy0+dWlDdXJyZW50Q2xpcCkgJiYgKHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIDwgKHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uICsgMSkpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcHkgYSBzaWxlbmNlIEFNUiBBVSB0byB0aGUgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSwgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRyAjIyMjIHNpbGVuY2UgQVUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBmaWx0ZXJlZCBQQ00gYXVkaW8gZGlyZWN0bHkgaW50byB0aGUgb3V0cHV0IEFVICovCi0KLSAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVGltZSBpbiBtcyBmcm9tIGRhdGEgc2l6ZSwgYmVjYXVzZSBpdCBpcyBQQ00xNiBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiSCArKysrIGVuY29kZSBBVSIpOwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0gICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgKiBPTVggQXVkaW8gZGVjIHNoZWxsIGRvZXMgaW50ZXJuYWwgYnVmZmVyaW5nIGFuZCBoZW5jZSBkb2VzIG5vdCByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgYSBQQ00gYnVmZmVyIGZvciBldmVyeSBkZWNvZGVTdGVwIGNhbGwuKgotICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAwICE9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICkKLSAgICAgICAgICAgICAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBTZXQgQVUgc2l6ZSAqLwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWwotICAgICAgICAgICAgICAgICAgICAgICAgMF07IC8qKjwgR2V0IHRoZSBzaXplIG9mIGVuY29kZWQgZGF0YSAqLwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVGhpcyBib29sZWFuIGlzIG9ubHkgdXNlZCB0byBmaXggdGhlIEJaWiBidWcuLi4gKi8KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5iRmlyc3RBdVdyaXR0ZW4gPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkkgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBXcml0ZSB0aGUgQVUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoxMS8xMi8yMDA4IENSIDMyODMgTU1TIHVzZSBjYXNlIGZvciBWaWRlb0FydGlzdAotICAgICAgICAgICAgICAgICAgICB0aGUgd2FybmluZyBNNFdBUl9XUklURVJfU1RPUF9SRVEgaXMgcmV0dXJuZWQgd2hlbiB0aGUgdGFyZ2V0ZWQgb3V0cHV0IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLAotICAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogRmlsZSB3YXMgY3V0IHRvIGF2b2lkIG92ZXJzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVhZCB0aGUgbmV4dCBhdWRpbyBmcmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkogLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogVXBkYXRlIGN1cnJlbnQgdGltZSAodG89dGMrVCkgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kQVRvID0gKCBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyArIHBDLT5wQzEtPmlBb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbzsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBNNFdBUl9OT19NT1JFX0FVID09IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9GQUxTRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBvdXRwdXQgaXMgb3RoZXIgdGhhbiBBTVIgb3IgQUFDCi0gICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBFVlJDLHdlIGNhbid0IHdyaXRlIHNpbGVuY2UgaW50byBpdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogU28gd2Ugc2ltcGx5IGVuZCBoZXJlLiovCi0gICAgICAgICAgICAgICAgICAgICAgICBiU3RvcEF1ZGlvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBUUkFOU0lUSU9OIE1PREUgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9UUkFOU0lUSU9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbyBUUkFOU0lUSU9OIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2Ugd2VyZSByZWFkaW5nIHRoZSBjbGlwLCB3ZSBtdXN0IGp1bXAgYSBmZXcgQVUgYmFja3dhcmQgdG8gZGVjb2RlL2VuY29kZQotICAgICAgICAgICAgICAgICh3aXRob3V0IHdyaXRpbmcgcmVzdWx0KSBmcm9tIHRoYXQgcG9pbnQuICovCi0gICAgICAgICAgICAgICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEID09IHBDLT5wQzEtPkFzdGF0dXMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaVRhcmdldEN0cywgaUN1cnJlbnRDdHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIDAKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IHBDLT5wQzEtPgotICAgICAgICAgICAgICAgICAgICAgICAgaUF1ZGlvRnJhbWVDdHMgKSAvKio8ZG9uJ3QgdHJ5IHRvIHByZS1kZWNvZGUgaWYgY2xpcCBpcyBhdCBpdHMgYmVnaW5uaW5nLiovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBKdW1wIGEgZmV3IEFVcyBiYWNrd2FyZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaUN1cnJlbnRDdHMgPSBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSBpQ3VycmVudEN0cyAtIE00VlNTM0dQUF9OQl9BVV9QUkVGRVRDSAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpVGFyZ2V0Q3RzIDwgMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldEN0cyA9IDA7IC8qKjwgU2FuaXR5IGNoZWNrICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocEMtPnBDMSwgJmlUYXJnZXRDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT04tcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0IHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEpOyAvKio8IHJlYWQgQVUgd2hlcmUgd2UganVtcGVkICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJLIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoYSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIERlY29kZS9lbmNvZGUgdXAgdG8gdGhlIHdhbnRlZCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIDwgaUN1cnJlbnRDdHMgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT04tcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJMICoqKiogcHJlLWVuY29kZSIpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk0gLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKGIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBBdWRpbyBpcyBub3cgT0sgZm9yIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkFzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBmaXJzdCBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShDMSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBEZWNvZGUgdGhlIHNlY29uZCBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShDMikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBib3RoIGNsaXBzIGRlY29kZWQgdGhlIHNhbWUgYW1vdW50IG9mIFBDTSBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICAgICAhPSBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRVJSIDogQXVkaW9UcmFuc2l0aW9uOiBib3RoIGNsaXBzIEFVIG11c3QgaGF2ZSB0aGUgc2FtZSBkZWNvZGVkXAotICAgICAgICAgICAgICAgICAgICAgICAgUENNIHNpemUhIHBjMSBzaXplPTB4JXgsIHBDMiBzaXplID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAvKk9NWCBBdWRpbyBkZWNvZGVyIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICogT01YIEF1ZGlvIGRlYyBzaGVsbCBkb2VzIGludGVybmFsIGJ1ZmZlcmluZyBhbmQgaGVuY2UgZG9lcyBub3QgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgKiBTbyBQQ00gYnVmZmVyIHNpemVzIG1pZ2h0IGJlIDAgb3IgZGlmZmVyZW50IGZvciBjbGlwMSBhbmQgY2xpcDIuCi0gICAgICAgICAgICAgICAgICAgICogU28gbm8gbmVlZCB0byByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlICovCi0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86ICwgcGMxIEF1ZEJ1ZmYgc2l6ZT0weCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQzIgQXVkQnVmZiBzaXplID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERURfUENNX1NJWkVfSVNTVUU7Ci0KLSNlbmRpZiAvLyBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGF1ZGlvIGVmZmVjdCBvbiBjbGlwMSAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QocEMsIDEsIChNNE9TQV9JbnQxNgotICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KEMxKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgYXVkaW8gZWZmZWN0IG9uIGNsaXAyICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5pQ2xpcDJBY3RpdmVFZmZlY3QgPj0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdChwQywgMiwgKE00T1NBX0ludDE2Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKXBDLT5wQzItPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QoQzIpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSB0cmFuc2l0aW9uIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24ocEMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQxNiAqKXBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQxNiAqKXBDLT5wQzItPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk4gKioqKiBibGVuZCBBVXMiKTsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LCAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCBBVSBjdHMgYW5kIHNpemUgKi8KLQotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWwotICAgICAgICAgICAgICAgICAgICAwXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgKz0gZnJhbWVUaW1lRGVsdGE7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk8gLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qMTEvMTIvMjAwOCBDUiAzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCx0aGUgd2FybmluZyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJQIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKEMxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUiBzZWNvbmRhcnlFcnJvcjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjdXJyZW50IHRpbWUgKHRvPXRjK1QpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRBVG8gPSAoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzICsgcEMtPnBDMS0+aUFvZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgaW4gdGhlIHNlY29uZCBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlFcnJvciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiUSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzItPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzItPmlBb2Zmc2V0IC8gcEMtPnBDMi0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1Ioc2Vjb25kYXJ5RXJyb3IpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoQzIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlFcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggKCBNNFdBUl9OT19NT1JFX0FVID09IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRXQVJfTk9fTU9SRV9BVSA9PSBzZWNvbmRhcnlFcnJvcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00T1NBX0ZBTFNFID09IHBDLT5iU3VwcG9ydFNpbGVuY2UpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIG91dHB1dCBpcyBvdGhlciB0aGFuIEFNUiBvciBBQUMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIEVWUkMsd2UgY2FuJ3Qgd3JpdGUgc2lsZW5jZSBpbnRvIGl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU28gd2Ugc2ltcGx5IGVuZCBoZXJlLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgIHwqLwotICAgICAgICAgICAgLyp8IEVSUk9SIENBU0UgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX198Ki8KLQotICAgICAgICBkZWZhdWx0OgotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IGludmFsaWQgaW50ZXJuYWwgc3RhdGUgKDB4JXgpLCBcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5URVJOQUxfU1RBVEUiLAotICAgICAgICAgICAgICAgIHBDLT5Bc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5URVJOQUxfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBhcmUgZm9yY2VkIHRvIHN0b3AgYXVkaW8gKi8KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBiU3RvcEF1ZGlvICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEF1ZGlvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8ocEMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoKQotICogQGJyaWVmICAgIENoZWNrIHdoaWNoIGF1ZGlvIHByb2Nlc3MgbW9kZSB3ZSBtdXN0IHVzZSwgZGVwZW5kaW5nIG9uIHRoZSBvdXRwdXQgQ1RTLgotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIGNvbnN0IE00T1NBX0ludDMyIFREID0gcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgIHVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uOyAvKio8IFRyYW5zaXRpb24gZHVyYXRpb24gKi8KLQotICAgIGNvbnN0IE00VlNTM0dQUF9FZGl0QXVkaW9TdGF0ZSBwcmV2aW91c0FzdGF0ZSA9IHBDLT5Bc3RhdGU7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIENsaXAxIGlzIG9uIGl0cyBiZWdpbiBjdXQsIG9yIGluIGl0cyBiZWdpbiBlZmZlY3Qgb3IgZW5kIGVmZmVjdCB6b25lICovCi0gICAgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKHBDLCAxKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgd2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uIHdpdGggbmV4dCBjbGlwICovCi0gICAgaWYoICggVEQgPiAwKSAmJiAoKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gLSBwQy0+cEMxLT5pQW9mZnNldAotICAgICAgICAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvICsgMC41KSA+PSAocEMtPnBDMS0+aUVuZFRpbWUgLSBURCkpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTjsKLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBEbyB3ZSBlbnRlciB0aGUgdHJhbnNpdGlvbiBzZWN0aW9uID8gKi8KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTiAhPSBwcmV2aW91c0FzdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcGVuIHNlY29uZCBjbGlwIGZvciB0cmFuc2l0aW9uLCBpZiBub3QgeWV0IG9wZW5lZCAqLwotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDMiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludE9wZW5DbGlwKHBDLCAmcEMtPnBDMiwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXAgKyAxXSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlOiBNNFZTUzNHUFBfaW50T3BlbkNsaXAoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJbiBjYXNlIG9mIHNob3J0IHRyYW5zaXRpb24gYW5kIGJhZCBsdWNrICguLi4pLCB0aGVyZSBtYXkgYmUgbm8gdmlkZW8gQVUKLSAgICAgICAgICAgICAgICAqIGluIHRoZSB0cmFuc2l0aW9uLiBJbiB0aGF0IGNhc2UsIHRoZSBzZWNvbmQgY2xpcCBoYXMgbm90IGJlZW4gb3BlbmVkLgotICAgICAgICAgICAgICAgICogU28gd2UgbXVzdCB1cGRhdGUgdGhlIHZpZGVvIG9mZnNldCBoZXJlLiAqLwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgLyoqPCBBZGQgY3VycmVudCB2aWRlbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIG9mZnNldCAqLwotICAgICAgICAgICAgICAgIHBDLT5wQzItPmlWb2Zmc2V0ICs9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBZGQgY3VycmVudCBhdWRpbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIG9mZnNldAotICAgICAgICAgICAgKiAodmlkZW8gb2Zmc2V0IGhhcyBhbHJlYWR5IGJlZW4gc2V0IHdoZW4gZG9pbmcgdGhlIHZpZGVvIHRyYW5zaXRpb24pICovCi0gICAgICAgICAgICBwQy0+cEMyLT5pQW9mZnNldCArPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogMjAwNS0wMy0yNDogQnVnRml4IGZvciBhdWRpby12aWRlbyBzeW5jaHJvOgotICAgICAgICAgICAgKiBUaGVyZSBtYXkgYmUgYSBwb3J0aW9uIG9mIHRoZSBkdXJhdGlvbiBvZiBhbiBhdWRpbyBBVSBvZiBkZXN5bmNocm8gYXQgZWFjaCBhc3NlbWJseS4KLSAgICAgICAgICAgICogSXQgbGVhZHMgdG8gYW4gYXVkaWJsZSBkZXN5bmNocm8gd2hlbiB0aGVyZSBhcmUgYSBsb3Qgb2YgY2xpcHMgYXNzZW1ibGVkLgotICAgICAgICAgICAgKiBUaGlzIGJ1ZyBmaXggYWxsb3dzIHRvIHJlc3luY2ggdGhlIGF1ZGlvIHRyYWNrIHdoZW4gdGhlIGRlbHRhIGlzIGhpZ2hlcgotICAgICAgICAgICAgKiB0aGFuIG9uZSBhdWRpbyBBVSBkdXJhdGlvbi4KLSAgICAgICAgICAgICogV2UgU3RlcCBvbmUgQVUgaW4gdGhlIHNlY29uZCBjbGlwIGFuZCB3ZSBjaGFuZ2UgdGhlIGF1ZGlvIG9mZnNldCBhY2NvcmRpbmdseS4gKi8KLSAgICAgICAgICAgIGlmKCAoIHBDLT5wQzItPmlBb2Zmc2V0Ci0gICAgICAgICAgICAgICAgLSAoTTRPU0FfSW50MzIpKHBDLT5wQzItPmlWb2Zmc2V0ICpwQy0+cEMyLT5zY2FsZV9hdWRpbyArIDAuNSkpCi0gICAgICAgICAgICAgICAgICAgID4gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQWR2YW5jZSBvbmUgQU1SIGZyYW1lICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBDMik7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiWiAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMyLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+aUFvZmZzZXQgLyBwQy0+cEMyLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVcGRhdGUgYXVkaW8gb2Zmc2V0IGFjY29yZGluZ2x5Ki8KLSAgICAgICAgICAgICAgICBwQy0+cEMyLT5pQW9mZnNldCAtPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGJlZ2luIGFuZCBlbmQgZWZmZWN0cyBmb3IgY2xpcDIgKi8KLSAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKHBDLCAyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgYXJlIG5vdCBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgaWYgY3VycmVudCBtb2RlIGlzIFJlYWQvV3JpdGUgb3IgRGVjb2RlL0VuY29kZSAqLwotICAgICAgICBpZiggcEMtPmlDbGlwMUFjdGl2ZUVmZmVjdCA+PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfREVDT0RFX0VOQ09ERTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGNyZWF0ZS9kZXN0cm95IGFuIGVuY29kZXIgKi8KLSAgICBpZiggKCBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEUgPT0gcHJldmlvdXNBc3RhdGUpCi0gICAgICAgICYmIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgIChNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEUgIT0gcEMtPkFzdGF0ZSkgKSAvKio8IGVuY29kZSBtb2RlICovCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdWlBdWRpb0JpdHJhdGU7Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBtYXggYml0cmF0ZSBkZXBlbmRpbmcgb24gaW5wdXQgZmlsZXMgYml0cmF0ZXMgYW5kIHRyYW5zaXRpb25zICovCi0gICAgICAgIGlmKCBwQy0+QXN0YXRlID09IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIE1heCBvZiB0aGUgdHdvIGJsZW5kZWQgZmlsZXMgKi8KLSAgICAgICAgICAgIGlmKCBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPiBwQy0+cEMyLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlICkKLSAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBDMi0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNhbWUgYXMgaW5wdXQgZmlsZSAqLwotICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGUgPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ3JlYXRlIHRoZSBlbmNvZGVyICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoJnBDLT5ld2MsICZwQy0+U2hlbGxBUEksCi0gICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZTogTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKCkKLSAqIEBicmllZiAgICBDaGVjayB3aGljaCBhdWRpbyBlZmZlY3QgbXVzdCBiZSBhcHBsaWVkIGF0IHRoZSBjdXJyZW50IHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQywgTTRPU0FfVUludDggdWlDbGlwTnVtYmVyICkKLXsKLSAgICBNNE9TQV9VSW50OCB1aUNsaXBJbmRleDsKLSAgICBNNE9TQV9VSW50OCB1aUZ4SW5kZXg7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNE9TQV9JbnQzMiBCQywgRUM7Ci0gICAgTTRPU0FfSW50OCAqcGlDbGlwQWN0aXZlRWZmZWN0OwotICAgIE00T1NBX0ludDMyIHQ7Ci0KLSAgICBpZiggMSA9PSB1aUNsaXBOdW1iZXIgKQotICAgIHsKLSAgICAgICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcDsKLSAgICAgICAgcENsaXAgPSBwQy0+cEMxOwotICAgICAgICBwaUNsaXBBY3RpdmVFZmZlY3QgPSAmKHBDLT5pQ2xpcDFBY3RpdmVFZmZlY3QpOwotICAgIH0KLSAgICBlbHNlIC8qKjwgKDIgPT0gdWlDbGlwTnVtYmVyKSAqLwotICAgIHsKLSAgICAgICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcCArIDE7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcGlDbGlwQWN0aXZlRWZmZWN0ID0gJihwQy0+aUNsaXAyQWN0aXZlRWZmZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNob3J0Y3V0cyBmb3IgY29kZSByZWFkYWJpbGl0eSAqLwotICAgIEJDID0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0OwotICAgIEVDID0gcENsaXAtPmlFbmRUaW1lOwotCi0gICAgLyoqCi0gICAgQ2hhbmdlIHRoZSBhYnNvbHV0IHRpbWUgdG8gY2xpcCByZWxhdGVkIHRpbWUKLSAgICAgUkMgdCA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvIC0gcENsaXAtPmlBb2Zmc2V0L3BDbGlwLT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgPCByb3VuZGluZyAqLzsKLSAgICB0ID0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8vKi0gcENsaXAtPmlBb2Zmc2V0L3BDbGlwLT5zY2FsZV9hdWRpbyovCi0gICAgICAgICsgMC41KTsgLyoqPCByb3VuZGluZyAqLwotICAgIDsKLQotICAgIC8qKgotICAgICogRGVmYXVsdDogbm8gZWZmZWN0IGFjdGl2ZSAqLwotICAgICpwaUNsaXBBY3RpdmVFZmZlY3QgPSAtMTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgdGhlIHRocmVlIGVmZmVjdHMgKi8KLSAgICAvLyBSQyAgICBmb3IgKHVpRnhJbmRleD0wOyB1aUZ4SW5kZXg8cEMtPnBDbGlwTGlzdFt1aUNsaXBJbmRleF0ubmJFZmZlY3RzOyB1aUZ4SW5kZXgrKykKLSAgICBmb3IgKCB1aUZ4SW5kZXggPSAwOyB1aUZ4SW5kZXggPCBwQy0+bmJFZmZlY3RzOyB1aUZ4SW5kZXgrKyApCi0gICAgewotICAgICAgICAvKiogU2hvcnRjdXQsIHJldmVyc2Ugb3JkZXIgYmVjYXVzZSBvZiBwcmlvcml0eSBiZXR3ZWVuIGVmZmVjdHMKLSAgICAgICAgKCBFbmRFZmZlY3QgYWx3YXlzIGNsZWFuICkgKi8KLSAgICAgICAgcEZ4ID0gJihwQy0+cEVmZmVjdHNMaXN0W3BDLT5uYkVmZmVjdHMgLSAxIC0gdWlGeEluZGV4XSk7Ci0KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX05vbmUgIT0gcEZ4LT5BdWRpb0VmZmVjdFR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYWN0dWFsbHkgYSB2aWRlbyBlZmZlY3QgKi8KLSAgICAgICAgICAgIGlmKCAoIHQgPj0gKE00T1NBX0ludDMyKSgvKkJDICsqL3BGeC0+dWlTdGFydFRpbWUpKQotICAgICAgICAgICAgICAgICYmIC8qKjwgQXJlIHdlIGFmdGVyIHRoZSBzdGFydCB0aW1lIG9mIHRoZSBlZmZlY3Q/ICovCi0gICAgICAgICAgICAgICAgKHQgPCAoTTRPU0FfSW50MzIpKC8qQkMgKyovcEZ4LT51aVN0YXJ0VGltZSArIHBGeC0+Ci0gICAgICAgICAgICAgICAgdWlEdXJhdGlvbikpICkgLyoqPCBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBhY3RpdmUgZWZmZWN0ICovCi0gICAgICAgICAgICAgICAgKnBpQ2xpcEFjdGl2ZUVmZmVjdCA9IHBDLT5uYkVmZmVjdHMgLSAxIC0gdWlGeEluZGV4OwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBUaGUgZmlyc3QgZWZmZWN0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSwgdGhlbiB0aGUgc2Vjb25kIG9uZSwKLSAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHRoaXJzIG9uZS4KLSAgICAgICAgICAgICAgICAqIEhlbmNlLCBhcyBzb29uIGFzIHdlIGZvdW5kIGFuIGFjdGl2ZSBlZmZlY3QsIHdlIGNhbiBnZXQgb3V0IG9mIHRoaXMgbG9vcCAqLwotICAgICAgICAgICAgICAgIHVpRnhJbmRleCA9IHBDLT5uYkVmZmVjdHM7IC8qKiBnZXQgb3V0IG9mIHRoZSBmb3IgbG9vcCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEJ1Z2ZpeDogVGhlIGR1cmF0aW9uIG9mIHRoZSBlbmQgZWZmZWN0IGhhcyBiZWVuIHNldCBhY2NvcmRpbmcgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VkIGNsaXAgZHVyYXRpb24uCi0gICAgICAgICAgICAqIElmIHRoZSBhbm5vdW5jZWQgZHVyYXRpb24gaXMgc21hbGxlciB0aGFuIHRoZSByZWFsIG9uZSwgdGhlIGVuZCBlZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgICB3b24ndCBiZSBhcHBsaWVkIGF0Ci0gICAgICAgICAgICAqIHRoZSB2ZXJ5IGVuZCBvZiB0aGUgY2xpcC4gVG8gc29sdmUgdGhpcyBpc3N1ZSB3ZSBmb3JjZSB0aGUgZW5kIGVmZmVjdC4gKi8KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdCgpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IHRvIHBQQ01kYXRhCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgdWlDbGlwMW9yQ2xpcDIgICAgKElOL09VVCkgMSBmb3IgZmlyc3QgY2xpcCwgMiBmb3Igc2Vjb25kIGNsaXAKLSAqIEBwYXJhbSAgICBwUENNZGF0YSAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX1VJbnQ4IHVpQ2xpcDFvckNsaXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAqcFBDTWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVBDTXNpemUgKQotewotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nczsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNE9TQV9JbnQzMgotICAgICAgICBpMzJzYW1wbGU7IC8qKjwgd2Ugd2lsbCBjYXN0IGVhY2ggSW50MTYgc2FtcGxlIGludG8gdGhpcyBJbnQzMiB2YXJpYWJsZSAqLwotICAgIE00T1NBX0ludDMyIGlQb3M7Ci0gICAgTTRPU0FfSW50MzIgaUR1cjsKLQotICAgIE00T1NBX0RFQlVHX0lGMigoIDEgIT0gdWlDbGlwMW9yQ2xpcDIpICYmICgyICE9IHVpQ2xpcDFvckNsaXAyKSwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludEJlZ2luQXVkaW9FZmZlY3Q6IHVpQ2xpcDFvckNsaXAyIGludmFsaWQiKTsKLQotICAgIGlmKCAxID09IHVpQ2xpcDFvckNsaXAyICkKLSAgICB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICAgICAgcENsaXBTZXR0aW5ncyA9ICYocEMtPnBDbGlwTGlzdFtwQy0+Ci0gICAgICAgICAgICB1aUN1cnJlbnRDbGlwXSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGNsaXAgc2V0dGluZ3MgKi8KLSAgICAgICAgLy8gUkMgICAgICAgIHBGeCA9ICYocENsaXBTZXR0aW5ncy0+RWZmZWN0c1twQy0+aUNsaXAxQWN0aXZlRWZmZWN0XSk7LyoqPCBHZXQgYSBzaG9ydGN1dAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBwRnggPSAmKHBDLT4KLSAgICAgICAgICAgIHBFZmZlY3RzTGlzdFtwQy0+Ci0gICAgICAgICAgICBpQ2xpcDFBY3RpdmVFZmZlY3RdKTsgLyoqPCBHZXQgYSBzaG9ydGN1dCB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBNNE9TQV9ERUJVR19JRjIoKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0IDwgMCkKLSAgICAgICAgICAgIHx8IChwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID4gMiksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogaUNsaXAxQWN0aXZlRWZmZWN0IGludmFsaWQiKTsKLSAgICB9Ci0gICAgZWxzZSAvKio8IGlmICgyPT11aUNsaXAxb3JDbGlwMikgKi8KLSAgICB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcENsaXBTZXR0aW5ncyA9ICYocEMtPnBDbGlwTGlzdFtwQy0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgKyAxXSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGNsaXAgc2V0dGluZ3MgKi8KLSAgICAgICAgLy8gUkMgICAgICAgIHBGeCA9ICYocENsaXBTZXR0aW5ncy0+RWZmZWN0c1twQy0+aUNsaXAyQWN0aXZlRWZmZWN0XSk7LyoqPCBHZXQgYSBzaG9ydGN1dAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBwRnggPSAmKHBDLT4KLSAgICAgICAgICAgIHBFZmZlY3RzTGlzdFtwQy0+Ci0gICAgICAgICAgICBpQ2xpcDJBY3RpdmVFZmZlY3RdKTsgLyoqPCBHZXQgYSBzaG9ydGN1dCB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBNNE9TQV9ERUJVR19JRjIoKCBwQy0+aUNsaXAyQWN0aXZlRWZmZWN0IDwgMCkKLSAgICAgICAgICAgIHx8IChwQy0+aUNsaXAyQWN0aXZlRWZmZWN0ID4gMiksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogaUNsaXAyQWN0aXZlRWZmZWN0IGludmFsaWQiKTsKLSAgICB9Ci0KLSAgICBpRHVyID0gKE00T1NBX0ludDMyKXBGeC0+dWlEdXJhdGlvbjsKLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICBpUG9zID0KLSAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKyAwLjUgLSBwQ2xpcC0+aUFvZmZzZXQgLyBwQ2xpcC0+c2NhbGVfYXVkaW8pCi0gICAgICAgIC0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0IC0gcEZ4LT51aVN0YXJ0VGltZTsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrICovCi0gICAgaWYoIGlQb3MgPiBpRHVyICkKLSAgICB7Ci0gICAgICAgIGlQb3MgPSBpRHVyOwotICAgIH0KLSAgICBlbHNlIGlmKCBpUG9zIDwgMCApCi0gICAgewotICAgICAgICBpUG9zID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEF0IHRoaXMgcG9pbnQsIGlQb3MgaXMgdGhlIGVmZmVjdCBwcm9ncmVzcywgaW4gYSAwIHRvIGlEdXIgYmFzZSAqLwotICAgIHN3aXRjaCggcEZ4LT5BdWRpb0VmZmVjdFR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlSW46Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcmlnaW5hbCBzYW1wbGVzIGFyZSBzaWduZWQgMTZiaXRzLgotICAgICAgICAgICAgKiBXZSBjb252ZXJ0IGl0IHRvIHNpZ25lZCAzMmJpdHMgYW5kIG11bHRpcGx5IGl0IGJ5IGlQb3MuCi0gICAgICAgICAgICAqIFNvIHdlIG11c3QgYXNzdXJlIHRoYXQgaVBvcyBpcyBub3QgaGlnaGVyIHRoYXQgMTZiaXRzIG1heC4KLSAgICAgICAgICAgICogaVBvcyBtYXggdmFsdWUgaXMgaUR1ciwgc28gd2UgdGVzdCBpRHVyLiAqLwotICAgICAgICAgICAgd2hpbGUoIGlEdXIgPiBQV1JfRlhQX0ZSQUNUX01BWCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaUR1ciA+Pj0KLSAgICAgICAgICAgICAgICAgICAgMjsgLyoqPCBkaXZpZGUgYnkgMiB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgKGluc3RlYWQgb2YgNCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3ZSBoYXZlIGVub3VnaCBkeW5hbWljLi4pICovCi0gICAgICAgICAgICAgICAgaVBvcyA+Pj0gMjsgLyoqPCBpZGVtICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGcm9tIGJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpOiBkaXZpZGUgYnkgdHdvICovCi0gICAgICAgICAgICB1aVBDTXNpemUgPj49IDE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBMb29wIG9uIHNhbXBsZXMgKi8KLSAgICAgICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKSAvKio8IGRlY3JlbWVudGluZyB0byBvcHRpbWl6ZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMnNhbXBsZSA9ICpwUENNZGF0YTsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgKj0gaVBvczsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgLz0gaUR1cjsKLSAgICAgICAgICAgICAgICAqcFBDTWRhdGErKyA9IChNNE9TQV9JbnQxNilpMzJzYW1wbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dDoKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIHN3aXRjaCBmcm9tIDAtPkR1ciB0byBEdXItPjAgaW4gb3JkZXIgdG8gZG8gZmFkZU9VVCBpbnN0ZWFkIG9mIGZhZGVJTiAqLwotICAgICAgICAgICAgaVBvcyA9IGlEdXIgLSBpUG9zOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogT3JpZ2luYWwgc2FtcGxlcyBhcmUgc2lnbmVkIDE2Yml0cy4KLSAgICAgICAgICAgICogV2UgY29udmVydCBpdCB0byBzaWduZWQgMzJiaXRzIGFuZCBtdWx0aXBseSBpdCBieSBpUG9zLgotICAgICAgICAgICAgKiBTbyB3ZSBtdXN0IGFzc3VyZSB0aGF0IGlQb3MgaXMgbm90IGhpZ2hlciB0aGF0IDE2Yml0cyBtYXguCi0gICAgICAgICAgICAqIGlQb3MgbWF4IHZhbHVlIGlzIGlEdXIsIHNvIHdlIHRlc3QgaUR1ci4gKi8KLSAgICAgICAgICAgIHdoaWxlKCBpRHVyID4gUFdSX0ZYUF9GUkFDVF9NQVggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlEdXIgPj49Ci0gICAgICAgICAgICAgICAgICAgIDI7IC8qKjwgZGl2aWRlIGJ5IDIgd291bGQgYmUgbW9yZSBsb2dpY2FsIChpbnN0ZWFkIG9mIDQpLAotICAgICAgICAgICAgICAgICAgICAgICBidXQgd2UgaGF2ZSBlbm91Z2ggZHluYW1pYy4uKSAqLwotICAgICAgICAgICAgICAgIGlQb3MgPj49IDI7IC8qKjwgaWRlbSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJvbSBidWZmZXIgc2l6ZSAoYnl0ZXMpIHRvIG51bWJlciBvZiBzYW1wbGUgKGludDE2KTogZGl2aWRlIGJ5IHR3byAqLwotICAgICAgICAgICAgdWlQQ01zaXplID4+PSAxOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTG9vcCBvbiBzYW1wbGVzLCBhcHBseSB0aGUgZmFkZSBmYWN0b3Igb24gZWFjaCAqLwotICAgICAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApIC8qKjwgZGVjcmVtZW50aW5nIGNvdW50ZXIgdG8gb3B0aW1pemUgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgPSAqcFBDTWRhdGE7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlICo9IGlQb3M7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlIC89IGlEdXI7Ci0gICAgICAgICAgICAgICAgKnBQQ01kYXRhKysgPSAoTTRPU0FfSW50MTYpaTMyc2FtcGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0OiB1bmtub3duIGF1ZGlvIGVmZmVjdCB0eXBlICgweCV4KSxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19FRkZFQ1RfVFlQRSIsCi0gICAgICAgICAgICAgICAgcEZ4LT5BdWRpb0VmZmVjdFR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19FRkZFQ1RfVFlQRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgdHJhbnNpdGlvbiBlZmZlY3QgdG8gdHdvIFBDTSBidWZmZXIKLSAqIEBub3RlICAgIFRoZSByZXN1bHQgb2YgdGhlIHRyYW5zaXRpb24gaXMgcHV0IGluIHRoZSBmaXJzdCBidWZmZXIuCi0gKiAgICAgICAgICBJIGtub3cgaXQncyBub3QgYmVhdXRpZnVsLCBidXQgaXQgZml0cyBteSBjdXJyZW50IG5lZWRzLCBhbmQgaXQncyBlZmZpY2llbnQhCi0gKiAgICAgICAgICBTbyB3aHkgYm90aGVyIHdpdGggYSB0aGlyZCBvdXRwdXQgYnVmZmVyPwotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUENNZGF0YTEgICAgKElOL09VVCkgRmlyc3QgaW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHBQQ01kYXRhMiAgICAoSU4pIFNlY29uZCBpbnB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pIFNpemUgb2YgYm90aCBQQ00gYnVmZmVycwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbiggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX0ludDE2ICpwUENNZGF0YTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpMzJzYW1wbGUxLAotICAgICAgICBpMzJzYW1wbGUyOyAvKio8IHdlIHdpbGwgY2FzdCBlYWNoIEludDE2IHNhbXBsZSBpbnRvIHRoaXMgSW50MzIgdmFyaWFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiBpUG9zMSwgaVBvczI7Ci0gICAgTTRPU0FfSW50MzIgaUR1ciA9IChNNE9TQV9JbnQzMilwQy0+Ci0gICAgICAgIHBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBlbmQgY3V0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICBpUG9zMSA9IHBDLT5wQzEtPmlFbmRUaW1lIC0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8KLSAgICAgICAgKyAwLjUgLSBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvKTsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrICovCi0gICAgaWYoIGlQb3MxID4gaUR1ciApCi0gICAgewotICAgICAgICBpUG9zMSA9IGlEdXI7Ci0gICAgfQotICAgIGVsc2UgaWYoIGlQb3MxIDwgMCApCi0gICAgewotICAgICAgICBpUG9zMSA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQb3NpdGlvbiBvZiBzZWNvbmQgY2xpcCBpbiB0aGUgdHJhbnNpdGlvbiAqLwotICAgIGlQb3MyID0gaUR1ciAtIGlQb3MxOwotCi0gICAgLyoqCi0gICAgKiBBdCB0aGlzIHBvaW50LCBpUG9zMiBpcyB0aGUgdHJhbnNpdGlvbiBwcm9ncmVzcywgaW4gYSAwIHRvIGlEdXIgYmFzZS4KLSAgICAqIGlQb3MxIGlzIHRoZSB0cmFuc2l0aW9uIHByb2dyZXNzLCBpbiBhIGlEVXIgdG8gMCBiYXNlLiAqLwotICAgIHN3aXRjaCggcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uQXVkaW9UcmFuc2l0aW9uVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGU6Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcmlnaW5hbCBzYW1wbGVzIGFyZSBzaWduZWQgMTZiaXRzLgotICAgICAgICAgICAgKiBXZSBjb252ZXJ0IGl0IHRvIHNpZ25lZCAzMmJpdHMgYW5kIG11bHRpcGx5IGl0IGJ5IGlQb3MuCi0gICAgICAgICAgICAqIFNvIHdlIG11c3QgYXNzdXJlIHRoYXQgaVBvcyBpcyBub3QgaGlnaGVyIHRoYXQgMTZiaXRzIG1heC4KLSAgICAgICAgICAgICogaVBvcyBtYXggdmFsdWUgaXMgaUR1ciwgc28gd2UgdGVzdCBpRHVyLiAqLwotICAgICAgICAgICAgd2hpbGUoIGlEdXIgPiBQV1JfRlhQX0ZSQUNUX01BWCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaUR1ciA+Pj0KLSAgICAgICAgICAgICAgICAgICAgMjsgLyoqPCBkaXZpZGUgYnkgMiB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgKGluc3RlYWQgb2YgNCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3ZSBoYXZlIGVub3VnaCBkeW5hbWljLi4pICovCi0gICAgICAgICAgICAgICAgaVBvczEgPj49IDI7IC8qKjwgaWRlbSAqLwotICAgICAgICAgICAgICAgIGlQb3MyID4+PSAyOyAvKio8IGlkZW0gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZyb20gYnVmZmVyIHNpemUgKGJ5dGVzKSB0byBudW1iZXIgb2Ygc2FtcGxlIChpbnQxNik6IGRpdmlkZSBieSB0d28gKi8KLSAgICAgICAgICAgIHVpUENNc2l6ZSA+Pj0gMTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIExvb3Agb24gc2FtcGxlcywgYXBwbHkgdGhlIGZhZGUgZmFjdG9yIG9uIGVhY2ggKi8KLSAgICAgICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKSAvKio8IGRlY3JlbWVudGluZyBjb3VudGVyIHRvIG9wdGltaXplICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlMSA9ICpwUENNZGF0YTE7IC8qKjwgR2V0IGNsaXAxIHNhbXBsZSAqLwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTEgKj0gaVBvczE7ICAgICAvKio8IG11bHRpcGx5IGJ5IGZhZGUgbnVtZXJhdG9yICovCi0gICAgICAgICAgICAgICAgaTMyc2FtcGxlMSAvPSBpRHVyOyAgICAgIC8qKjwgZGl2aWRlIGJ5IGZhZGUgZGVub21pbmF0b3IgKi8KLQotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTIgPSAqcFBDTWRhdGEyOyAvKio8IEdldCBjbGlwMiBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUyICo9IGlQb3MyOyAgICAgLyoqPCBtdWx0aXBseSBieSBmYWRlIG51bWVyYXRvciAqLwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTIgLz0gaUR1cjsgICAgICAvKio8IGRpdmlkZSBieSBmYWRlIGRlbm9taW5hdG9yICovCi0KLSAgICAgICAgICAgICAgICAqcFBDTWRhdGExKysgPSAoTTRPU0FfSW50MTYpKGkzMnNhbXBsZTEKLSAgICAgICAgICAgICAgICAgICAgKyBpMzJzYW1wbGUyKTsgLyoqPCBtaXggdGhlIHR3byBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgcFBDTWRhdGEyKys7IC8qKjwgZG9uJ3QgZm9yZ2V0IHRvIGluY3JlbWVudCB0aGUgc2Vjb25kIGJ1ZmZlciAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZToKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGlzIGlzIGEgc3R1cGlkLW5vbiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgTm9uZSB0cmFuc2l0aW9uLi4uCi0gICAgICAgICAgICAqIFdlIGNvcHkgdGhlIFBDTSBmcmFtZXMgKi8KLSAgICAgICAgICAgIGlmKCBpUG9zMSA8IChpRHVyID4+IDEpICkgLyoqPCBzZWNvbmQgaGFsZiBvZiB0cmFuc2l0aW9uICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBQQ00gdG8gdGhlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUENNZGF0YTEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcFBDTWRhdGEyLCB1aVBDTXNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIHRoZSBvdXRwdXQgbXVzdCBiZSBwdXQgaW4gdGhlIGZpcnN0IGJ1ZmZlci4KLSAgICAgICAgICAgICogRm9yIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSBub24tdHJhbnNpdGlvbiBpdCdzIGFscmVhZHkgdGhlIGNhc2UhCi0gICAgICAgICAgICAqIFNvIHdlIGhhdmUgbm90aGluZyB0byBkbyBoZXJlLi4uCi0gICAgICAgICAgICAqLwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb246IHVua25vd24gdHJhbnNpdGlvbiB0eXBlICgweCV4KSxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEUiLAotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLkF1ZGlvVHJhbnNpdGlvblR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbjogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgUmVzZXQgdGhlIGF1ZGlvIGVuY29kZXIgKENyZWF0ZSBpdCBpZiBuZWVkZWQpCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlciggTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAqcENfZXdjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUF1ZGlvQml0cmF0ZSApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogSWYgYW4gZW5jb2RlciBhbHJlYWR5IGV4aXN0LCB3ZSBkZXN0cm95IGl0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENfZXdjLT5wQXVkaW9FbmNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKAotICAgICAgICAgICAgcENfZXdjLT5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAoCi0gICAgICAgICAgICBwQ19ld2MtPnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCByZXR1cm5zIDB4JXgiLCAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcENfZXdjLT5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZXMgYSBuZXcgZW5jb2RlciAgKi8KLSAgICBzd2l0Y2goIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgICAgICAvL0VWUkMKLSAgICAgICAgICAgIC8vICAgICAgICBjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tFVlJDOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IE00VlNTM0dQUF9FVlJDX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9IE00RU5DT0RFUl9rTW9ubzsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IE00VlNTM0dQUF9BTVJfREVGQVVMVF9CSVRSQVRFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BbXJTSUQgPSBNNEVOQ09ERVJfa0Ftck5vU0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQ19ld2MtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjIwNTBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjQwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDQxMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlQXVkaW9FbmNvZGVyOiBpbnZhbGlkIGlucHV0IEFBQyBzYW1wbGluZyBmcmVxdWVuY3lcCi0gICAgICAgICAgICAgICAgICAgICAgICAoJWQgSHopLCByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVSX0lOSVRfRkFJTEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERVJfSU5JVF9GQUlMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSAocENfZXdjLT51aU5iQ2hhbm5lbHMgPT0gMSkKLSAgICAgICAgICAgICAgICA/IE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5SZWd1bGF0aW9uID0KLSAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0FhY1JlZ3VsTm9uZTsgLy9NNEVOQ09ERVJfa0FhY0JpdFJlc2Vydm9pcgotICAgICAgICAgICAgLyogdW51c2VkICovCi0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJJUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iTVMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYlBOUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iVE5TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAvKiBUT0RPIGNoYW5nZSBpbnRvIGhpZ2hzcGVlZCBhc2FwICovCi0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJIaWdoU3BlZWQgPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotCi0gICAgICAgICAgICAvKiBRdWFudGlmeSB2YWx1ZSAoY2VpbCBvbmUpICovCi0gICAgICAgICAgICBpZiggdWlBdWRpb0JpdHJhdGUgPD0gMTYwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDE2MDAwOwotCi0gICAgICAgICAgICBlbHNlIGlmKCB1aUF1ZGlvQml0cmF0ZSA8PSAyNDAwMCApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gMjQwMDA7Ci0KLSAgICAgICAgICAgIGVsc2UgaWYoIHVpQXVkaW9CaXRyYXRlIDw9IDMyMDAwICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSAzMjAwMDsKLQotICAgICAgICAgICAgZWxzZSBpZiggdWlBdWRpb0JpdHJhdGUgPD0gNDgwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDQ4MDAwOwotCi0gICAgICAgICAgICBlbHNlIGlmKCB1aUF1ZGlvQml0cmF0ZSA8PSA2NDAwMCApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gNjQwMDA7Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSA5NjAwMDsKLQotICAgICAgICAgICAgLyogU3BlY2lhbCByZXF1aXJlbWVudCBvZiBvdXIgZW5jb2RlciAqLwotICAgICAgICAgICAgaWYoICggcENfZXdjLT51aU5iQ2hhbm5lbHMgPT0gMikKLSAgICAgICAgICAgICAgICAmJiAocENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlIDwgMzIwMDApICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSAzMjAwMDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6IFVuZGVmaW5lZCBvdXRwdXQgYXVkaW8gZm9ybWF0ICglZCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBhdWRpbyBlbmNvZGVyICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjpcCi0gICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCBjYWxsZWQgd2l0aCB1c2VyZGF0YSAweCV4IiwKLSAgICAgICAgcENfU2hlbGxBUEktPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEpOwotICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDX2V3Yy0+cEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgcENfU2hlbGxBUEktPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEpOwotCi0jZWxzZQotCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCgmcENfZXdjLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICBNNE9TQV9OVUxMIC8qIG5vIEhXIGVuY29kZXIgKi8pOwotCi0jZW5kaWYKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBPcGVuIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQ19ld2MtPnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICZwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLCAmcENfZXdjLT5wQXVkaW9FbmNEU0ksCi0gICAgICAgIE00T1NBX05VTEwgLyogbm8gZ3JhYmJpbmcgKi8pOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdFZpZGVvLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0VmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjE5ZjQxMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0VmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM5NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9FZGl0VmlkZW8uYwotICogQGJyaWVmICAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgZWRpdCBBUEkgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jdW5kZWYgTTRPU0FfVFJBQ0VfTEVWRUwKLSNkZWZpbmUgTTRPU0FfVFJBQ0VfTEVWRUwgMQotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqIE91ciBoZWFkZXIgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0vLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLS8qKgotICogY29tcG9uZW50IGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRWRkxfdHJhbnNpdGlvbi5oIiAvKio8IHZpZGVvIGVmZmVjdHMgKi8KLQotLypmb3IgdHJhbnNpdGlvbiBiZWhhdmlvdXIqLwotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmgiCi0vKiogRGV0ZXJtaW5lIGFic29sdXRlIHZhbHVlIG9mIGEuICovCi0jZGVmaW5lIE00eFZTU19BQlMoYSkgKCAoIChhKSA8ICgwKSApID8gKC0oYSkpIDogKGEpICkKLSNkZWZpbmUgWV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHgwMAotI2RlZmluZSBVX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0jZGVmaW5lIFZfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4ODAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXRpYyBsb2NhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkCi1NNFZTUzNHUFBfaW50Q2hlY2tWaWRlb0VmZmVjdHMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aUNsaXBOdW1iZXIgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoCi0gICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwgTTRPU0FfQm9vbCBiU2tpcEZyYW1pbmdFZmZlY3QpOwotCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQgKTsKLQotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKnBBVSApOwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFNldEgyNjNUaW1lQ291bnRlciggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdWlDdHMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlDdHNTZWMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnBDdHNTZWMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVdpZHRoLCBNNE9TQV9VSW50MzIgdWlIZWlnaHQgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoCi0gICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVJbiwgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUoCi0gICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLAotICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW5wbGFuZSwKLSAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcE91dHBsYW5lKTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OCAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0KTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfTWVkaWFUaW1lIHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiSXNDbGlwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Um90YXRlVmlkZW8oTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcm90YXRpb25EZWdyZWUpOwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiB2aWRlbyBwcm9jZXNzaW5nCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfSW50MzIgaUN0cywgaU5leHRDdHM7Ci0gICAgTTRFTkNPREVSX0ZyYW1lTW9kZSBGcmFtZU1vZGU7Ci0gICAgTTRPU0FfQm9vbCBiU2tpcEZyYW1lOwotICAgIE00T1NBX1VJbnQxNiBvZmZzZXQ7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIGVuZCBjdXQuIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcKLSAgICAgKiB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgKi8KLSAgICBpZiAoICgoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBDLT5wQzEtPmlWb2Zmc2V0Ci0gICAgICAgICsgcEMtPmlJbk91dFRpbWVPZmZzZXQpID49IHBDLT5wQzEtPmlFbmRUaW1lICkKLSAgICB7Ci0gICAgICAgIC8qIFJlLWFkanVzdCB2aWRlbyB0byBwcmVjaXNlIGN1dCB0aW1lICovCi0gICAgICAgIHBDLT5pSW5PdXRUaW1lT2Zmc2V0ID0gKChNNE9TQV9JbnQzMikocEMtPmV3Yy5kSW5wdXRWaWRDdHMpKQotICAgICAgICAgICAgLSBwQy0+cEMxLT5pVm9mZnNldCArIHBDLT5pSW5PdXRUaW1lT2Zmc2V0IC0gcEMtPnBDMS0+aUVuZFRpbWU7Ci0gICAgICAgIGlmICggcEMtPmlJbk91dFRpbWVPZmZzZXQgPCAwICkgewotICAgICAgICAgICAgcEMtPmlJbk91dFRpbWVPZmZzZXQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVmlkZW8gaXMgZG9uZSBmb3IgdGhpcyBjbGlwICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbyhwQyk7Ci0KLSAgICAgICAgLyogUkM6IHRvIGtub3cgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVyciAmJiBlcnIgIT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBEb24ndCBjaGFuZ2UgdGhlIHN0YXRlcyBpZiB3ZSBhcmUgaW4gZGVjb2RlVXBUbygpICovCi0gICAgaWYgKCAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMxLT5Wc3RhdHVzKQotICAgICAgICAmJiAoKCBwQy0+cEMyID09IE00T1NBX05VTEwpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPICE9IHBDLT5wQzItPlZzdGF0dXMpKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBWaWRlbyBNb2RlLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgb3V0cHV0IENUUyAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoCi0gICAgICAgICAgICBwQyk7IC8qKjwgVGhpcyBmdW5jdGlvbiBjaGFuZ2UgdGhlIHBDLT5Wc3RhdGUgdmFyaWFibGUhICovCi0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgc3dpdGNoKCBwQy0+VnN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qIF9fX19fX19fX19fX19fX19fICovCi0gICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgIC8qfCBSRUFEX1dSSVRFIE1PREUgfCovCi0gICAgICAgIC8qfF9fX19fX19fX19fX19fX19ffCovCi0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU6Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvIFJFQURfV1JJVEUiKTsKLQotICAgICAgICAgICAgICAgIGJTa2lwRnJhbWUgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2Ugd2VyZSBkZWNvZGluZyB0aGUgY2xpcCwgd2UgbXVzdCBqdW1wIHRvIGJlIHN1cmUKLSAgICAgICAgICAgICAgICAqIHRvIGdldCB0byB0aGUgZ29vZCBwb3NpdGlvbi4gKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQgIT0gcEMtPnBDMS0+VnN0YXR1cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBKdW1wIHRvIHRhcmdldCB2aWRlbyB0aW1lICh0YyA9IHRvLVQpICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBpQ3RzID0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRJbnB1dFZpZEN0cykgLSBwQy0+cEMxLT5pVm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9XUklURTogbV9wUmVhZGVyLT5tX3BGY3RKdW1wKFYxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+cEMxLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9XUklURTogbV9wUmVhZGVyLT5tX3BGY3RHZXROZXh0QXUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiQSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+VmlkZW9BVS5tX0NUUywgcEMtPnBDMS0+aVZvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBmcmFtZSBoYXMgYmVlbiBhbHJlYWR5IHdyaXR0ZW4gaW4gQkVHSU4gQ1VUIHN0ZXAgLT4gc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnBDMS0+VmlkZW9BVS5tX0NUUyA9PSBpQ3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+cEMxLT5pVmlkZW9SZW5kZXJDdHMgPj0gaUN0cyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogVGhpcyBmcmFtZSBoYXMgYmVlbiBhbHJlYWR5IHdyaXR0ZW4gaW4gQkVHSU4gQ1VUIHN0ZXAgLT4gc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIHBDLT5Wc3RhdGUgPT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQpCi0gICAgICAgICAgICAgICAgICAgICYmIChwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgICAgICsgcEMtPnBDMS0+aVZvZmZzZXQgPD0gcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUykgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZW1lbWJlciB0aGUgY2xpcCByZWFkaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgLy8gUm91bmRpbmcgaXMgdG8gY29tcGVuc2F0ZSByZWFkZXIgaW1wcmVjaXNpb24gKG1fQ1RTIGlzIGFjdHVhbGx5IGFuIGludGVnZXIpCi0gICAgICAgICAgICAgICAgaUN0cyA9ICgoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpIC0gcEMtPnBDMS0+aVZvZmZzZXQgLSAxOwotICAgICAgICAgICAgICAgIGlOZXh0Q3RzID0gaUN0cyArICgoTTRPU0FfSW50MzIpcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKSArIDE7Ci0gICAgICAgICAgICAgICAgLyogQXZvaWQgdG8gd3JpdGUgYSBsYXN0IGZyYW1lIG9mIGR1cmF0aW9uIDAgKi8KLSAgICAgICAgICAgICAgICBpZiggaU5leHRDdHMgPiBwQy0+cEMxLT5pRW5kVGltZSApCi0gICAgICAgICAgICAgICAgICAgIGlOZXh0Q3RzID0gcEMtPnBDMS0+aUVuZFRpbWU7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHRoZSBBVSBpcyBnb29kIHRvIGJlIHdyaXR0ZW4sIHdyaXRlIGl0LCBlbHNlIGp1c3Qgc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIE00T1NBX0ZBTFNFID09IGJTa2lwRnJhbWUpCi0gICAgICAgICAgICAgICAgICAgICYmICgoIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPj0gaUN0cykKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPCBpTmV4dEN0cykKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5wQzEtPlZpZGVvQVUubV9zaXplID4gMCkpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFJFQURfV1JJVEU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoVmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogQ29weSB0aGUgaW5wdXQgQVUgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuYXR0cmlidXRlID0gcEMtPnBDMS0+VmlkZW9BVS5tX2F0dHJpYnV0ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUyA9IChNNE9TQV9UaW1lKXBDLT5wQzEtPlZpZGVvQVUubV9DVFMgKwotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1RpbWUpcEMtPnBDMS0+aVZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICs9IHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgLyogZm9yIGguMjY0IHN0cmVhbSBkbyBub3QgcmVhZCB0aGUgMXN0IDQgYnl0ZXMgYXMgdGhleSBhcmUgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3JzICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+cEMxLT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YyApCi0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSA0OwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPnBDMS0+VmlkZW9BVS5tX3NpemUgLSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSA+IHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogUkVBRF9XUklURTogQVUgc2l6ZSBncmVhdGVyIHRoYW5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEF1U2l6ZSAoJWQ+JWQpISByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5zaXplLCBwQy0+ZXdjLnVpVmlkZW9NYXhBdVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPnBDMS0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzICsgb2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSB0aW1lIGluZm8gZm9yIHRoZSBDb3VudGVyIFRpbWUgU3lzdGVtIHRvIGJlIGVxdWFsIHRvIHRoZSBiaXQKLSAgICAgICAgICAgICAgICAgICAgLXN0cmVhbSB0aW1lKi8KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFVwZGF0ZVRpbWVJbmZvKHBDLCAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkIgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbHUgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUywgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHdhcm5pbmcgTTRXQVJfV1JJVEVSX1NUT1BfUkVRIGlzIHJldHVybmVkIHdoZW4gdGhlIHRhcmdldGVkIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc2l6ZSBpcyByZWFjaGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLCB0aGUgd2FybmluZyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCBuZXh0IEFVIGZvciBuZXh0IHN0ZXAgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBDMS0+cFZpZGVvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5wQzEtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICVsZCBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTLCBwQy0+cEMxLT5pVm9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjaWRlIHdldGhlciB0byByZWFkIG9yIHRvIGluY3JlbWVudCB0aW1lIGluY3JlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggKCBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPj0gaU5leHRDdHMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypJbmNyZW1lbnQgdGltZSBieSB0aGUgZW5jb2RpbmcgcGVyaW9kIChOT19NT1JFX0FVIG9yIHJlYWRlciBpbiBhZHZhbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICs9IHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3dpdGNoIChmcm9tIEFGVEVSX0NVVCkgdG8gbm9ybWFsIG1vZGUgYmVjYXVzZSB0aW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBubyBtb3JlIGZyb3plbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIG90aGVyIGNhc2VzIChyZWFkZXIgbGF0ZSksIGp1c3QgbGV0IHRoZSByZWFkZXIgY2F0Y2ggdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRWVG8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBDMS0+cFZpZGVvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+cEMxLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFJFQURfV1JJVEU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiRCAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMsIHBDLT5wQzEtPmlWb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBERUNPREVfRU5DT0RFIE1PREUgfCovCi0gICAgICAgICAgICAvKnwgICBCRUdJTl9DVVQgTU9ERSAgIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERToKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvIERFQ09ERV9FTkNPREUgLyBCRUdJTl9DVVQiKTsKLQotICAgICAgICAgICAgaWYgKChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAgICAgKE00T1NBX0ZBTFNFID09Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYlNldEltYWdlRGF0YSkpIHsKLQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4KHBDLCBwQy0+cEMxKTsKLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4IGVycj0leCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSB2aWRlbyB1cCB0byB0aGUgdGFyZ2V0IHRpbWUKLSAgICAgICAgICAgICAgICAod2lsbCBqdW1wIHRvIHRoZSBwcmV2aW91cyBSQVAgaWYgbmVlZGVkICkgKi8KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKHBDLT5wQzEsIChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cyk7Ci0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZWNvZGVWaWRlb1VwVG9DdHMgcmV0dXJucyBlcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIElmIHRoZSBkZWNvZGluZyBpcyBub3QgY29tcGxldGVkLCBkbyBvbmUgbW9yZSBzdGVwIHdpdGggdGltZSBmcm96ZW4gKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMxLT5Wc3RhdHVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHZpZGVvIHByZS1wcm9jZXNzaW5nIGVycm9yIGJlZm9yZSBjYWxsaW5nIHRoZSBlbmNvZGVyICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IE00Tk9fRVJST1I7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRSArKysrIGVuY29kZSBBVSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIGZyYW1lKHJlbmRlcmluZyxmaWx0ZXJpbmcgYW5kIHdyaXRpbmcgd2lsbCBiZSBkb25lCi0gICAgICAgICAgICAgICAgIGluIGVuY29kZXIgY2FsbGJhY2tzKSovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5Wc3RhdGUgPT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgKQotICAgICAgICAgICAgICAgICAgICBGcmFtZU1vZGUgPSBNNEVOQ09ERVJfa0lGcmFtZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIEZyYW1lTW9kZSA9IE00RU5DT0RFUl9rTm9ybWFsRnJhbWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZShwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzLCBGcmFtZU1vZGUpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgaGFkIGEgVlBQIGVycm9yLi4uICovCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSwgcmV0dXJuaW5nIFZwcEVycj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAhPSBwQy0+ZXdjLlZwcEVycm9yICkKLSAgICAgICAgICAgICAgICAgICAgewotI2VuZGlmIC8vTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQy0+ZXdjLlZwcEVycm9yOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL000VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIC8qKjwgLi4ub3IgYW4gZW5jb2RlciBlcnJvciAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoICgoTTRPU0FfVUludDMyKU00RVJSX0FMTE9DKSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgZmlsZSBzaXplIGlzIHJlYWNoZWQKLSAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCwgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUKLSAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBGaWxlIHdhcyBjdXQgdG8gYXZvaWQgb3ZlcnNpemUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW5jcmVtZW50IHRpbWUgYnkgdGhlIGVuY29kaW5nIHBlcmlvZCAoZm9yIGJlZ2luIGN1dCwgZG8gbm90IGluY3JlbWVudCB0byBub3QKLSAgICAgICAgICAgICAgICBsb29zZSBQLWZyYW1lcykgKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFID09IHBDLT5Wc3RhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kSW5wdXRWaWRDdHMgKz0gcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBUUkFOU0lUSU9OIE1PREUgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyBUUkFOU0lUSU9OIik7Ci0KLSAgICAgICAgICAgICAgICAvKiBEb24ndCBkZWNvZGUgbW9yZSB0aGFuIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgIGlmKCAhKCggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMxLT5Wc3RhdHVzKQotICAgICAgICAgICAgICAgICAgICAmJiAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMyLT5Wc3RhdHVzKSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBjbGlwMSB2aWRlbyB1cCB0byB0aGUgdGFyZ2V0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgKHdpbGwganVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGlmIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZBTFNFID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OChwQywgcEMtPnBDMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4IGVycj0leCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0cyhwQy0+cEMxLAotICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludERlY29kZVZpZGVvVXBUb0N0cyhDMSkgcmV0dXJucyBlcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgZGVjb2RpbmcgaXMgbm90IGNvbXBsZXRlZCwgZG8gb25lIG1vcmUgc3RlcCB3aXRoIHRpbWUgZnJvemVuICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPID09IHBDLT5wQzEtPlZzdGF0dXMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIERvbid0IGRlY29kZSBtb3JlIHRoYW4gbmVlZGVkICovCi0gICAgICAgICAgICAgICAgaWYoICEoKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPICE9IHBDLT5wQzItPlZzdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPID09IHBDLT5wQzEtPlZzdGF0dXMpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBEZWNvZGUgdGhlIGNsaXAyIHZpZGVvIHVwIHRvIHRoZSB0YXJnZXQgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgKHdpbGwganVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGlmIG5lZWRlZCkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwQy0+cEMyLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GQUxTRSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJTZXRJbWFnZURhdGEpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4KHBDLCBwQy0+cEMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODggZXJyPSV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHMocEMtPnBDMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZWNvZGVWaWRlb1VwVG9DdHMoQzIpIHJldHVybnMgZXJyPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGRlY29kaW5nIGlzIG5vdCBjb21wbGV0ZWQsIGRvIG9uZSBtb3JlIHN0ZXAgd2l0aCB0aW1lIGZyb3plbiAqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMyLT5Wc3RhdHVzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSB2aWRlbyBwcmUtcHJvY2Vzc2luZyBlcnJvciBiZWZvcmUgY2FsbGluZyB0aGUgZW5jb2RlciAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBNNE5PX0VSUk9SOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkYgKioqKiBibGVuZCBBVXMiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBmcmFtZSAocmVuZGVyaW5nLCBmaWx0ZXJpbmcgYW5kIHdyaXRpbmcgd2lsbCBiZSBkb25lCi0gICAgICAgICAgICAgICAgaW4gZW5jb2RlciBjYWxsYmFja3MgKi8KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZShwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cywgTTRFTkNPREVSX2tOb3JtYWxGcmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIGVuY29kZSByZXR1cm5zIGEgcHJvY2VzcyBmcmFtZSBlcnJvciwgaXQgaXMgbGlrZWx5IHRvIGJlIGEgVlBQIGVycm9yICovCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSwgcmV0dXJuaW5nIFZwcEVycj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAhPSBwQy0+ZXdjLlZwcEVycm9yICkKLSAgICAgICAgICAgICAgICAgICAgewotCi0jZW5kaWYgLy9NNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBDLT5ld2MuVnBwRXJyb3I7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLy9NNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKSAvKio8IC4uLm9yIGFuIGVuY29kZXIgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAoKE00T1NBX1VJbnQzMilNNEVSUl9BTExPQykgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgIGZpbGUgc2l6ZSBpcyByZWFjaGVkCi0gICAgICAgICAgICAgICAgICAgIFRoZSBlZGl0aW5nIGlzIHRoZW4gZmluaXNoZWQsIHRoZSB3YXJuaW5nIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIGlzCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJbmNyZW1lbnQgdGltZSBieSB0aGUgZW5jb2RpbmcgcGVyaW9kICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArPSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fICovCi0gICAgICAgICAgICAvKnwgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBFUlJPUiBDQVNFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19ffCovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogaW52YWxpZCBpbnRlcm5hbCBzdGF0ZSAoMHgleCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+VnN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSgpCi0gKiBAYnJpZWYgICAgQ2hlY2sgd2hpY2ggdmlkZW8gcHJvY2VzcyBtb2RlIHdlIG11c3QgdXNlLCBkZXBlbmRpbmcgb24gdGhlIG91dHB1dCBDVFMuCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgY29uc3QgTTRPU0FfSW50MzIgIHQgPSAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgLyoqPCBUcmFuc2l0aW9uIGR1cmF0aW9uICovCi0gICAgY29uc3QgTTRPU0FfSW50MzIgVEQgPSBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgIE00T1NBX0ludDMyIGlUbXA7Ci0KLSAgICBjb25zdCBNNFZTUzNHUFBfRWRpdFZpZGVvU3RhdGUgcHJldmlvdXNWc3RhdGUgPSBwQy0+VnN0YXRlOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBDbGlwMSBpcyBvbiBpdHMgYmVnaW4gY3V0LCBvciBpbiBhbiBlZmZlY3Qgem9uZSAqLwotICAgIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cyhwQywgMSk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiB3aXRoIG5leHQgY2xpcCAqLwotICAgIGlmKCAoIFREID4gMCkgJiYgKCggdCAtIHBDLT5wQzEtPmlWb2Zmc2V0KSA+PSAocEMtPnBDMS0+aUVuZFRpbWUgLSBURCkpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTjsKLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBPcGVuIHNlY29uZCBjbGlwIGZvciB0cmFuc2l0aW9uLCBpZiBub3QgeWV0IG9wZW5lZCAqLwotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cEMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnBDMS0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRPcGVuQ2xpcChwQywgJnBDLT5wQzIsCi0gICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXAgKyAxXSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9lZGl0T3BlbkNsaXAgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEFkZCBjdXJyZW50IHZpZGVvIG91dHB1dCBDVFMgdG8gdGhlIGNsaXAgb2Zmc2V0Ci0gICAgICAgICAgICAqIChhdWRpbyBvdXRwdXQgQ1RTIGlzIG5vdCB5ZXQgYXQgdGhlIHRyYW5zaXRpb24sIHNvIGF1ZGlvCi0gICAgICAgICAgICAqICBvZmZzZXQgY2FuJ3QgYmUgdXBkYXRlZCB5ZXQpLiAqLwotICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIHBDLT5wQzItPmlWb2Zmc2V0ICs9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAyMDA1LTAzLTI0OiBCdWdGaXggZm9yIGF1ZGlvLXZpZGVvIHN5bmNocm86Ci0gICAgICAgICAgICAqIFVwZGF0ZSB0cmFuc2l0aW9uIGR1cmF0aW9uIGR1ZSB0byB0aGUgYWN0dWFsIHZpZGVvIHRyYW5zaXRpb24gYmVnaW5uaW5nIHRpbWUuCi0gICAgICAgICAgICAqIEl0IHdpbGwgYXZvaWQgZGVzeW5jaHJvbml6YXRpb24gd2hlbiBkb2luZyB0aGUgYXVkaW8gdHJhbnNpdGlvbi4gKi8KLSAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIGlUbXAgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKVwKLSAgICAgICAgICAgICAtIChwQy0+cEMxLT5pRW5kVGltZSAtIFREICsgcEMtPnBDMS0+aVZvZmZzZXQpOwotICAgICAgICAgICAgaWYgKGlUbXAgPCAoTTRPU0FfSW50MzIpcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb24pCi0gICAgICAgICAgICAvKio8IFRlc3QgaW4gY2FzZSBvZiBhIHZlcnkgc2hvcnQgdHJhbnNpdGlvbiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPgotICAgICAgICAgICAgICAgICAgICB1aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbiAtPSBpVG1wOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBEb24ndCBmb3JnZXQgdG8gYWxzbyBjb3JyZWN0IHRoZSB0b3RhbCBkdXJhdGlvbiB1c2VkIGZvciB0aGUgcHJvZ3Jlc3MgYmFyCi0gICAgICAgICAgICAgICAgKiAoaXQgd2FzIGNvbXB1dGVkIHdpdGggdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gZHVyYXRpb24pLiAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICs9IGlUbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKio8IE5vICJlbHNlIiBoZXJlIGJlY2F1c2UgaXQncyBoYXJkIHByZWRpY3QgdGhlIGVmZmVjdCBvZiAwIGR1cmF0aW9uIHRyYW5zaXRpb24uLi4qLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgZWZmZWN0cyBmb3IgY2xpcDIgKi8KLSAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrVmlkZW9FZmZlY3RzKHBDLCAyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgYXJlIG5vdCBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyogSWYgdGhlcmUgaXMgYW4gZWZmZWN0IHdlIGdvIHRvIGRlY29kZS9lbmNvZGUgbW9kZSAqLwotICAgICAgICBpZigocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHx8IChwQy0+bmJBY3RpdmVFZmZlY3RzMSA+IDApIHx8Ci0gICAgICAgICAgICAocEMtPnBDMS0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgfHwKLSAgICAgICAgICAgIChwQy0+cEMxLT5wU2V0dGluZ3MtPmJUcmFuc2NvZGluZ1JlcXVpcmVkID09IE00T1NBX1RSVUUpKSB7Ci0gICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFOwotICAgICAgICB9Ci0gICAgICAgIC8qIFdlIGRvIGEgYmVnaW4gY3V0LCBleGNlcHQgaWYgYWxyZWFkeSBkb25lICh0aW1lIGlzIG5vdCBwcm9ncmVzc2luZyBiZWNhdXNlIHdlIHdhbnQKLSAgICAgICAgdG8gY2F0Y2ggYWxsIFAtZnJhbWVzIGFmdGVyIHRoZSBjdXQpICovCi0gICAgICAgIGVsc2UgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJDbGlwMUF0QmVnaW5DdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREU7Ci0gICAgICAgICAgICAgICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiggKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVCA9PSBwcmV2aW91c1ZzdGF0ZSkKLSAgICAgICAgICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpICkgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIEVsc2Ugd2UgYXJlIGluIGRlZmF1bHQgY29weS9wYXN0ZSBtb2RlICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgICAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUID09IHByZXZpb3VzVnN0YXRlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgY3VycmVudEJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAgICAgICAgICAgICAvKiBEbyB3ZSBuZWVkIHRvIHJlZW5jb2RlIHRoZSB2aWRlbyB0byBkb3duZ3JhZGUgdGhlIGJpdHJhdGUgb3Igbm90ID8gKi8KLSAgICAgICAgICAgICAgICAvKiBMZXQncyBjb21wdXRlIHRoZSBjaXJyZW50IGJpdHJhdGUgb2YgdGhlIGN1cnJlbnQgZWRpdGVkIGNsaXAgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlLCAmY3VycmVudEJpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBFcnJvciB3aGVuIGdldHRpbmcgbmV4dCBiaXRyYXRlIG9mIGVkaXRlZCBjbGlwOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogUmVtb3ZlIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBjdXJyZW50Qml0cmF0ZSAtPSAxMjIwMDsKLQotICAgICAgICAgICAgICAgIC8qIFRlc3QgaWYgd2UgZ28gaW50byBjb3B5L3Bhc3RlIG1vZGUgb3IgaW50byBkZWNvZGUvZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBpZiggY3VycmVudEJpdHJhdGUgPiBwQy0+dWlNTVNWaWRlb0JpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCEoKHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID09IE00T1NBX1RSVUUpICYmCi0gICAgICAgICAgICAgICAgICAgIChwQy0+VnN0YXRlID09IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSkpICYmCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iRW5jb2RlVGlsbEVvRiA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUZXN0IGlmIHdlIGdvIGludG8gY29weS9wYXN0ZSBtb2RlIG9yIGludG8gZGVjb2RlL2VuY29kZSBtb2RlCi0gICAgICAgICAgICAgICAgICogSWYgYW4gZXh0ZXJuYWwgZWZmZWN0IGhhcyBiZWVuIGFwcGxpZWQgb24gdGhlIGN1cnJlbnQgY2xpcAotICAgICAgICAgICAgICAgICAqIHRoZW4gY29udGludWUgdG8gYmUgaW4gZGVjb2RlL2VuY29kZSBtb2RlIHRpbGwgZW5kIG9mCi0gICAgICAgICAgICAgICAgICogY2xpcCB0byBhdm9pZCBILjI2NCBkaXN0b3J0aW9uLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGNyZWF0ZSBhbiBlbmNvZGVyICovCi0gICAgaWYoICggKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEUgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVAotICAgICAgICA9PSBwcmV2aW91c1ZzdGF0ZSkpIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgICYmICgoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwQy0+VnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcEMtPlZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTgotICAgICAgICA9PSBwQy0+VnN0YXRlKSkgLyoqPCBlbmNvZGUgbW9kZSAqLwotICAgICAgICAmJiBwQy0+YklzTU1TID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENyZWF0ZSB0aGUgZW5jb2RlciwgaWYgbm90IGNyZWF0ZWQgYWxyZWFkeSovCi0gICAgICAgIGlmIChwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9PSBNNFZTUzNHUFBfa05vRW5jb2RlcikgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIgXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+YklzTU1TID09IE00T1NBX1RSVUUgJiYgcEMtPmV3Yy5wRW5jQ29udGV4dCA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENyZWF0ZSB0aGUgZW5jb2RlciAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlOiBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBXaGVuIHdlIGdvIGZyb20gZmlsdGVyaW5nIHRvIHJlYWQvd3JpdGUsIHdlIG11c3QgYWN0IGxpa2UgYSBiZWdpbiBjdXQsCi0gICAgKiBiZWNhdXNlIHRoZSBsYXN0IGZpbHRlcmVkIGltYWdlIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgb3JpZ2luYWwgaW1hZ2UuICovCi0gICAgZWxzZSBpZiggKCAoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwcmV2aW91c1ZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTgotICAgICAgICA9PSBwcmV2aW91c1ZzdGF0ZSkpIC8qKjwgZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgJiYgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSA9PSBwQy0+VnN0YXRlKSAvKio8IHJlYWQgbW9kZSAqLwotICAgICAgICAmJiAocEMtPmJFbmNvZGVUaWxsRW9GID09IE00T1NBX0ZBTFNFKSApCi0gICAgewotICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBkZXN0cm95IGFuIGVuY29kZXIgKi8KLSAgICBlbHNlIGlmKCAoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFID09IHByZXZpb3VzVnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT04KLSAgICAgICAgPT0gcHJldmlvdXNWc3RhdGUpKSAvKio8IGVuY29kZSBtb2RlICovCi0gICAgICAgICYmICgoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSA9PSBwQy0+VnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQKLSAgICAgICAgPT0gcEMtPlZzdGF0ZSkpIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgICYmIHBDLT5iSXNNTVMgPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRGVzdHJveSB0aGUgcHJldmlvdXNseSBjcmVhdGVkIGVuY29kZXIgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U3RhcnRBVSgpCi0gKiBAYnJpZWYgICAgU3RhcnRBVSB3cml0ZXItbGlrZSBpbnRlcmZhY2UgdXNlZCBmb3IgdGhlIFZTUyAzR1BQIG9ubHkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6IChJTikgSXQgaXMgdGhlIFZTUyAzR1BQIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBzdHJlYW1JRDogKElOKSBJZCBvZiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBBY2Nlc3MgVW5pdCBpcyByZWxhdGVkLgotICogQHBhcmFtICAgIHBBVTogICAgICAoSU4vT1VUKSBBY2Nlc3MgVW5pdCB0byBiZSBwcmVwYXJlZC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTdGFydEFVKCBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpTWF4QXVTaXplOwotCi0gICAgLyoqCi0gICAgKiBHaXZlbiBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBWU1MzR1BQIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIC8qKgotICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCBwQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTdGFydEFVOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFN0YXJ0QVU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UHJvY2Vzc0FVKCkKLSAqIEBicmllZiAgICBQcm9jZXNzQVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4pIEl0IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgd3JpdHRlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFByb2Nlc3NBVSggTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIEdpdmVuIGNvbnRleHQgaXMgYWN0dWFsbHkgdGhlIFZTUzNHUFAgY29udGV4dCAqLwotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotCi0gICAgLyoqCi0gICAgKiBGaXggdGhlIGVuY29kZWQgQVUgdGltZSAqLwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzID0gcEFVLT5DVFM7Ci0gICAgLyoqCi0gICAgKiBVcGRhdGUgdGltZSBpbmZvIGZvciB0aGUgQ291bnRlciBUaW1lIFN5c3RlbSB0byBiZSBlcXVhbCB0byB0aGUgYml0LXN0cmVhbSB0aW1lICovCi0gICAgTTRWU1MzR1BQX2ludFVwZGF0ZVRpbWVJbmZvKHBDLCBwQVUpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgQVUgKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCBwQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRQcm9jZXNzQVU6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRQcm9jZXNzQVU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRWUFAoKQotICogQGJyaWVmICAgIFdlIGltcGxlbWVudCBvdXIgb3duIFZpZGVvUHJlUHJvY2Vzc2luZyBmdW5jdGlvbgotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBWUFAgY29udGV4dCwgd2hpY2ggYWN0dWFsbHkgaXMgdGhlIFZTUyAzR1BQIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAoSU4pCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0ICAgIChJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyBwbGFuZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50VlBQKCBNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNF9NZWRpYVRpbWUgdHM7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBUbXAgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9JbWFnZVBsYW5lICpwTGFzdERlY29kZWRGcmFtZSA9IE00T1NBX05VTEwgOwotICAgIE00VklGSV9JbWFnZVBsYW5lICpwRGVjb2RlclJlbmRlckZyYW1lID0gTTRPU0FfTlVMTDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwVGVtcDFbM10scFRlbXAyWzNdOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBUZW1wUGxhbmVDbGlwMVszXSxwVGVtcFBsYW5lQ2xpcDJbM107Ci0gICAgTTRPU0FfVUludDMyICBpID0gMCwgeXV2RnJhbWVXaWR0aCA9IDAsIHl1dkZyYW1lSGVpZ2h0ID0gMDsKLSAgICBNNE9TQV9Cb29sIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAvKioKLSAgICAqIFZQUCBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBWU1MzR1BQIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wMSwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcDIsIDAsIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSk7Ci0gICAgbWVtc2V0KCh2b2lkICopcFRlbXBQbGFuZUNsaXAxLCAwLCAzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSkpOwotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wUGxhbmVDbGlwMiwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgVlBQIGVycm9yIHJlbWVtYmVyZWQgaW4gY29udGV4dCAqLwotICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiBBdCB0aGUgZW5kIG9mIHRoZSBlZGl0aW5nLCB3ZSBtYXkgYmUgY2FsbGVkIHdoZW4gbm8gbW9yZSBjbGlwIGlzIGxvYWRlZC4KLSAgICAqIChiZWNhdXNlIHRvIGNsb3NlIHRoZSBlbmNvZGVyIHByb3Blcmx5IGl0IG11c3QgYmUgc3RlcHBlZCBvbmUgb3IgdHdpY2UuLi4pICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDMSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBtdXN0IGZpbGwgdGhlIGlucHV0IG9mIHRoZSBlbmNvZGVyIHdpdGggYSBkdW1teSBpbWFnZSwgYmVjYXVzZQotICAgICAgICAqIGVuY29kaW5nIG5vaXNlIGxlYWRzIHRvIGEgaHVnZSB2aWRlbyBBVSwgYW5kIHRodXMgYSB3cml0ZXIgYnVmZmVyIG92ZXJmbG93LiAqLwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMF0ucGFjX2RhdGEsMCwKLSAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3N0cmlkZSAqIHBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgcFBsYW5lT3V0WzFdLnVfc3RyaWRlICogcFBsYW5lT3V0WzFdLnVfaGVpZ2h0KTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICBwUGxhbmVPdXRbMl0udV9zdHJpZGUgKiBwUGxhbmVPdXRbMl0udV9oZWlnaHQpOwotCi0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiByZXR1cm5pbmcgTTROT19FUlJPUiAoYWJvcnQpIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICoqKioqKioqKioqKioqKiogVHJhbnNpdGlvbiBjYXNlICoqKioqKioqKioqKioqKiovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJUcmFuc2l0aW9uRWZmZWN0ICkKLSAgICB7Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMSwgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMSkgcmV0dXJucyAweCV4LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7IC8qKjwgUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuLi4pICovCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAyLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCgyKSByZXR1cm5zIDB4JXgsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SIiwgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYxLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMykgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYyLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoNCkgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYzLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMykgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbiB0aGUgY2xpcDEgYmFzZTogdHMgPSB0byAtIE9mZnNldCAqLwotICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICB0cyA9IHBDLT5ld2MuZElucHV0VmlkQ3RzIC0gcEMtPnBDMS0+aVZvZmZzZXQ7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUmVuZGVyIENsaXAxICovCi0gICAgICAgIGlmKCBwQy0+cEMxLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3QocEMsIHBDLT5wQzEsIHRzLCBNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBQbGFuZUNsaXAxLCBwVGVtcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXQpOwotICAgICAgICAgICAgaWYgKChNNE5PX0VSUk9SICE9IGVycikgJiYKLSAgICAgICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICE9IGVycikpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAvKiogUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICogZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKHBDLT5wQzEtPmlzUmVuZGVyRHVwID09IE00T1NBX1RSVUUpIHx8Ci0gICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FID09IGVycikpIHsKLSAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIGlmIChwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBDb3B5IGxhc3QgZGVjb2RlZCBwbGFuZSB0byBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzBdLnVfaGVpZ2h0ICogcFRtcFswXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFsxXS51X2hlaWdodCAqIHBUbXBbMV0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMl0udV9oZWlnaHQgKiBwVG1wWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX0VSUl9OT19WQUxJRF9WSURfRlJBTUU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgZXJyLCBfX0ZJTEVfXywgX19MSU5FX18pOwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHRpbWUgaW4gdGhlIGNsaXAyIGJhc2U6IHRzID0gdG8gLSBPZmZzZXQgKi8KLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgdHMgPSBwQy0+ZXdjLmRJbnB1dFZpZEN0cyAtIHBDLT5wQzItPmlWb2Zmc2V0OwotICAgICAgICAvKioKLSAgICAgICAgKiBSZW5kZXIgQ2xpcDIgKi8KLSAgICAgICAgaWYoIHBDLT5wQzItPmlzUmVuZGVyRHVwID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0KHBDLCBwQy0+cEMyLCB0cywgTTRPU0FfRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFBsYW5lQ2xpcDIsIHBUZW1wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dCk7Ci0gICAgICAgICAgICBpZiAoKE00Tk9fRVJST1IgIT0gZXJyKSAmJgotICAgICAgICAgICAgICAgICAoTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgIT0gZXJyKSkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3QgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIC8qKiBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgKiBlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4qLwotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgocEMtPnBDMi0+aXNSZW5kZXJEdXAgPT0gTTRPU0FfVFJVRSkgfHwKLSAgICAgICAgICAgICAoTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgPT0gZXJyKSkgewotICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYyOwotICAgICAgICAgICAgaWYgKHBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmUgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMi0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMF0udV9oZWlnaHQgKiBwVG1wWzBdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzFdLnVfaGVpZ2h0ICogcFRtcFsxXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMyLT5sYXN0RGVjb2RlZFBsYW5lWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFsyXS51X2hlaWdodCAqIHBUbXBbMl0udV93aWR0aCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMygiQ2FuIG5vdCBmaW5kIGFuIGlucHV0IGZyYW1lLiBTZXQgZXJyb3IgMHgleCBpbiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICBlcnIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmUgPSBwVG1wOwotICAgICAgICB9Ci0KLQotICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uKHBDLCBwVG1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbiByZXR1cm5zIDB4JXgsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgIHJldHVybiAgTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuLi4pICovCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChpPTA7IGkgPCAzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBUZW1wUGxhbmVDbGlwMltpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcFBsYW5lQ2xpcDJbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wUGxhbmVDbGlwMltpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHBUZW1wUGxhbmVDbGlwMVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcFBsYW5lQ2xpcDFbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wUGxhbmVDbGlwMVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwVGVtcDJbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXAyW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcDJbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocFRlbXAxW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMVtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAxW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqKioqKioqKioqKioqKioqIE5vIFRyYW5zaXRpb24gY2FzZSAqKioqKioqKioqKioqKioqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiBOTyB0cmFuc2l0aW9uIGNhc2UiKTsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbiB0aGUgY2xpcCBiYXNlOiB0cyA9IHRvIC0gT2Zmc2V0ICovCi0gICAgICAgIHRzID0gcEMtPmV3Yy5kSW5wdXRWaWRDdHMgLSBwQy0+cEMxLT5pVm9mZnNldDsKLSAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVuZGVyICovCi0gICAgICAgIGlmIChwQy0+cEMxLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9GQUxTRSkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWUFA6IHJlbmRlcmR1cCBmYWxzZSIpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICAgQ2hlY2sgaWYgcmVzaXppbmcgaXMgbmVlZGVkICovCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgICAgIGlmICgocEMtPnBDMS0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bmJBY3RpdmVFZmZlY3RzID09IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBDMS0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9PSBNNE9TQV9GQUxTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXQsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00T1NBX0ZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BGY3RSZW5kZXIoKSByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoMCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdW4tcm90YXRlZCBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCA9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB5dXZGcmFtZUhlaWdodCA9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVZpZGVvKCkgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJZiB3ZSBkbyBtb2RpZnkgdGhlIGltYWdlLCB3ZSBuZWVkIGFuIGludGVybWVkaWF0ZQotICAgICAgICAgICAgICAgICAgICAqIGltYWdlIHBsYW5lICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwVGVtcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdmlkZW8gZnJhbWUgbmVlZCB0byBiZSByZXNpemVkLCB0aGVuIGFwcGx5IHRoZSBvdmVybGF5IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBmcmFtZSB3YXMgcmVuZGVyZWQgd2l0aCByZW5kZXJpbmcgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICogSGVyZSBza2lwIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCB3aGVuIGFwcGx5aW5nIHZpZGVvIEVmZmVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZUVmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLCBwVGVtcDEsIGJTa2lwRnJhbWVFZmZlY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoKSBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lPSBwVGVtcDE7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFByZXBhcmUgb3ZlcmxheSB0ZW1wb3JhcnkgYnVmZmVyIGlmIG92ZXJsYXkgZXhpc3QgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3dpZHRoLCBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCwgcmV0dXJuaW5nIE00Tk9fRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBEbyByZW5kZXJpbmcgbW9kZS4gKi8KLSAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpIHsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT54VlNTLk1lZGlhUmVuZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSwgcFRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBBcHBseSBvdmVybGF5IGlmIG92ZXJsYXkgaXMgZXhpc3QgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBUbXA7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheShwQywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIHBUbXApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcFRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXNldCBvcmlnaW5hbCB3aWR0aCBhbmQgaGVpZ2h0IGZvciByZXNpemUgZnJhbWUgcGxhbmUKLSAgICAgICAgICAgICAgICBpZiAoMCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzICYmCi0gICAgICAgICAgICAgICAgICAgIDE4MCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFNldFlVVjQyMFBsYW5lKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCwgeXV2RnJhbWVIZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogTk8gcmVzaXplIHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKiBJZiB3ZSBkbyBtb2RpZnkgdGhlIGltYWdlLCB3ZSBuZWVkIGFuCi0gICAgICAgICAgICAgICAgICAgICAqIGludGVybWVkaWF0ZSBpbWFnZSBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcFRlbXAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSGVyZSB3ZSBkbyBub3Qgc2tpcCB0aGUgb3ZlcmxheSBlZmZlY3Qgc2luY2UKLSAgICAgICAgICAgICAgICAgICAgICogb3ZlcmxheSBhbmQgdmlkZW8gZnJhbWUgYXJlIGJvdGggb2Ygc2FtZSByZXNvbHV0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLHBQbGFuZU91dCxiU2tpcEZyYW1lRWZmZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgICAgICBwQy0+cEMxLT5pVmlkZW9SZW5kZXJDdHMgPSAoTTRPU0FfSW50MzIpdHM7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiByZW5kZXJkdXAgdHJ1ZSIpOwotCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29weSBsYXN0IGRlY29kZWQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmUgIT0gTTRPU0FfTlVMTCkgewotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0ICogXAotICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X2hlaWdodCAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X3dpZHRoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9FUlJfTk9fVkFMSURfVklEX0ZSQU1FOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMygiQ2FuIG5vdCBmaW5kIGFuIGlucHV0IGZyYW1lLiBTZXQgZXJyb3IgMHgleCBpbiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgX19GSUxFX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSWYgd2UgZG8gbW9kaWZ5IHRoZSBpbWFnZSwgd2UgbmVlZCBhbgotICAgICAgICAgICAgICAgICAgICAqIGludGVybWVkaWF0ZSBpbWFnZSBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdmlkZW8gZnJhbWUgbmVlZCB0byBiZSByZXNpemVkLCB0aGVuIGFwcGx5IHRoZSBvdmVybGF5IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBmcmFtZSB3YXMgcmVuZGVyZWQgd2l0aCByZW5kZXJpbmcgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICogSGVyZSBza2lwIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCB3aGVuIGFwcGx5aW5nIHZpZGVvIEVmZmVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZUVmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUscFRlbXAxLCBiU2tpcEZyYW1lRWZmZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZT0gcFRlbXAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUgPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogUHJlcGFyZSBvdmVybGF5IHRlbXBvcmFyeSBidWZmZXIgaWYgb3ZlcmxheSBleGlzdCAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcDIsIHBDLT5ld2MudWlWaWRlb1dpZHRoLCBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCwgcmV0dXJuaW5nIE00Tk9fRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogRG8gcmVuZGVyaW5nIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wU2V0dGluZ3MtPnhWU1MuTWVkaWFSZW5kZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIHBUbXApOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogQXBwbHkgb3ZlcmxheSBpZiBvdmVybGF5IGlzIGV4aXN0ICovCi0gICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAyLCBwVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUpIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgcExhc3REZWNvZGVkRnJhbWUgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVswXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzBdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVsxXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzFdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVsyXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEhlcmUgd2UgZG8gbm90IHNraXAgdGhlIG92ZXJsYXkgZWZmZWN0IHNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAqIG92ZXJsYXkgYW5kIHZpZGVvIGFyZSBib3RoIG9mIHNhbWUgcmVzb2x1dGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBiU2tpcEZyYW1lRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExhc3REZWNvZGVkRnJhbWUsIHBUbXAsYlNraXBGcmFtZUVmZmVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludFZQUDogUmVuZGVyZWQgYXQgQ1RTICUuM2YiLCB0cyk7Ci0KLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocFRlbXAxW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMVtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAxW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwVGVtcDJbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXAyW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcDJbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheSgpCi0gKiBAYnJpZWYgICAgQXBwbHkgdmlkZW8gb3ZlcmxheSBmcm9tIHBQbGFuZUluIHRvIHBQbGFuZU91dAotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcElucHV0UGxhbmVzICAgIChJTikgSW5wdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHBhcmFtICAgIHBPdXRwdXRQbGFuZXMgICAoSU4vT1VUKSBPdXRwdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheSAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkgewotCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNE9TQV9Eb3VibGUgVmlkZW9FZmZlY3RUaW1lOwotICAgIE00T1NBX0RvdWJsZSBQZXJjZW50YWdlRG9uZTsKLSAgICBNNE9TQV9VSW50OCBOdW1BY3RpdmVFZmZlY3RzID0wOwotICAgIE00T1NBX1VJbnQzMiBDdHMgPSAwOwotICAgIE00T1NBX0ludDMyIG5leHRFZmZlY3RUaW1lOwotICAgIE00T1NBX0ludDMyIHRtcDsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBwQ2xpcCA9IHBDLT5wQzE7Ci0gICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgTnVtQWN0aXZlRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHMxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzOwotICAgIH0KLSAgICBmb3IgKGk9MDsgaTxOdW1BY3RpdmVFZmZlY3RzOyBpKyspIHsKLSAgICAgICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgKwotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uIC0gcEZ4LT51aVN0YXJ0VGltZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0W2ldXSk7Ci0gICAgICAgICAgICAvKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4gKi8KLSAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBWaWRlb0VmZmVjdFRpbWUgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRG8gdGhlIGZyYW1pbmcob3ZlcmxheSkgZWZmZWN0IG9ubHksCi0gICAgICAgICAqIHNraXAgb3RoZXIgY29sb3IgZWZmZWN0IHdoaWNoIGhhZCBiZWVuIGFwcGxpZWQgKi8KLSAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFRvIGNhbGN1bGF0ZSAlLCBzdWJzdHJhY3QgdGltZUluY3JlbWVudCBiZWNhdXNlIGVmZmVjdCBzaG91bGQgZmluaXNoCi0gICAgICAgICAqIG9uIHRoZSBsYXN0IGZyYW1lIHdoaWNoIGlzIHByZXNlbnRlZCBmcm9tIENUUyA9IGVvZi10aW1lSW5jcmVtZW50IHRpbGwgQ1RTID0gZW9mICovCi0gICAgICAgIFBlcmNlbnRhZ2VEb25lID0gVmlkZW9FZmZlY3RUaW1lIC8gKChNNE9TQV9GbG9hdClwRngtPnVpRHVyYXRpb24pOwotCi0gICAgICAgIGlmIChQZXJjZW50YWdlRG9uZSA8IDAuMCkgewotICAgICAgICAgICAgUGVyY2VudGFnZURvbmUgPSAwLjA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFBlcmNlbnRhZ2VEb25lID4gMS4wKSB7Ci0gICAgICAgICAgICBQZXJjZW50YWdlRG9uZSA9IDEuMDsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDAwKSAqLwotICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKFBlcmNlbnRhZ2VEb25lICogMTAwMCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSBwcm9ncmVzcyBpbmZvIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiAqLwotICAgICAgICBleHRQcm9ncmVzcy51aVByb2dyZXNzID0gKE00T1NBX1VJbnQzMil0bXA7Ci0gICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgIGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgIGV4dFByb2dyZXNzLnVpQ2xpcFRpbWUgPSBleHRQcm9ncmVzcy51aU91dHB1dFRpbWUgLSBwQ2xpcC0+aVZvZmZzZXQ7Ci0gICAgICAgIGV4dFByb2dyZXNzLmJJc0xhc3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgbmV4dEVmZmVjdFRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzIFwKLSAgICAgICAgICAgICsgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKTsKLSAgICAgICAgaWYgKG5leHRFZmZlY3RUaW1lID49IChNNE9TQV9JbnQzMikocEZ4LT51aVN0YXJ0VGltZSArIHBGeC0+dWlEdXJhdGlvbikpIHsKLSAgICAgICAgICAgIGV4dFByb2dyZXNzLmJJc0xhc3QgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IHBGeC0+RXh0VmlkZW9FZmZlY3RGY3QocEZ4LT5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0LAotICAgICAgICAgICAgcFBsYW5lSW4sIHBQbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgcEZ4LT5WaWRlb0VmZmVjdFR5cGUgLSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5OiBcCi0gICAgICAgICAgICAgICAgRXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5OiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoKQotICogQGJyaWVmICAgIEFwcGx5IHZpZGVvIGVmZmVjdCBmcm9tIHBQbGFuZUluIHRvIHBQbGFuZU91dAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICB1aUNsaXAxb3JDbGlwMiAgICAoSU4vT1VUKSAxIGZvciBmaXJzdCBjbGlwLCAyIGZvciBzZWNvbmQgY2xpcAotICogQHBhcmFtICAgIHBJbnB1dFBsYW5lcyAgICAoSU4pIElucHV0IHJhdyBZVVY0MjAgaW1hZ2UKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgIChJTi9PVVQpIE91dHB1dCByYXcgWVVWNDIwIGltYWdlCi0gKiBAcGFyYW0gICAgYlNraXBGcmFtaW5nRWZmZWN0IChJTikgc2tpcCBmcmFtaW5nIGVmZmVjdCBmbGFnCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gICAgTTRPU0FfQm9vbCBiU2tpcEZyYW1pbmdFZmZlY3QpIHsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqcEZ4OwotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzIGV4dFByb2dyZXNzOwotCi0gICAgTTRPU0FfRG91YmxlIFZpZGVvRWZmZWN0VGltZTsKLSAgICBNNE9TQV9Eb3VibGUgUGVyY2VudGFnZURvbmU7Ci0gICAgTTRPU0FfSW50MzIgdG1wOwotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZVRlbXBJbjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lVGVtcE91dDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgcFRlbXBZdXZQbGFuZVszXTsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX1VJbnQ4IE51bUFjdGl2ZUVmZmVjdHMgPTA7Ci0KLQotICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICBpZiAocEMtPmJJc3NlY29uZENsaXAgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTnVtQWN0aXZlRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHM7Ci0gICAgfQotCi0gICAgbWVtc2V0KCh2b2lkICopcFRlbXBZdXZQbGFuZSwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgdGVtcG9yYXJ5IHBsYW5lIGlmIG5lZWRlZCBSQyAqLwotICAgIGlmIChOdW1BY3RpdmVFZmZlY3RzID4gMSkgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXBZdXZQbGFuZSwgcFBsYW5lT3V0LT51X3dpZHRoLAotICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0LT51X2hlaWdodCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoNCkgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKE51bUFjdGl2ZUVmZmVjdHMgICUgMiA9PSAwKQotICAgIHsKLSAgICAgICAgcFBsYW5lVGVtcEluID0gcFBsYW5lSW47Ci0gICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwVGVtcFl1dlBsYW5lOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwUGxhbmVUZW1wSW4gPSBwUGxhbmVJbjsKLSAgICAgICAgcFBsYW5lVGVtcE91dCA9IHBQbGFuZU91dDsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTxOdW1BY3RpdmVFZmZlY3RzOyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPmJJc3NlY29uZENsaXAgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgewotCi0KLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVRyYW5zaXRpb25EdXJhdGlvbi0gcEZ4LT51aVN0YXJ0VGltZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0W2ldXSk7Ci0gICAgICAgICAgICAvKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4gKi8KLSAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBWaWRlb0VmZmVjdFRpbWUgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgLyogVG8gY2FsY3VsYXRlICUsIHN1YnN0cmFjdCB0aW1lSW5jcmVtZW50IGJlY2F1c2UgZWZmZWN0IHNob3VsZCBmaW5pc2ggb24gdGhlIGxhc3QgZnJhbWUqLwotICAgICAgICAvKiB3aGljaCBpcyBwcmVzZW50ZWQgZnJvbSBDVFMgPSBlb2YtdGltZUluY3JlbWVudCB0aWxsIENUUyA9IGVvZiAqLwotICAgICAgICBQZXJjZW50YWdlRG9uZSA9IFZpZGVvRWZmZWN0VGltZQotICAgICAgICAgICAgLyAoKE00T1NBX0Zsb2F0KXBGeC0+dWlEdXJhdGlvbi8qLSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24qLyk7Ci0KLSAgICAgICAgaWYoIFBlcmNlbnRhZ2VEb25lIDwgMC4wICkKLSAgICAgICAgICAgIFBlcmNlbnRhZ2VEb25lID0gMC4wOwotCi0gICAgICAgIGlmKCBQZXJjZW50YWdlRG9uZSA+IDEuMCApCi0gICAgICAgICAgICBQZXJjZW50YWdlRG9uZSA9IDEuMDsKLQotICAgICAgICBzd2l0Y2goIHBGeC0+VmlkZW9FZmZlY3RUeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrOgotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29tcHV0ZSB3aGVyZSB3ZSBhcmUgaW4gdGhlIGVmZmVjdCAoc2NhbGUgaXMgMC0+MTAyNCkuICovCi0gICAgICAgICAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKShQZXJjZW50YWdlRG9uZSAqIDEwMjQpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcEluLAotICAgICAgICAgICAgICAgICAgICAoTTRWaUNvbUltYWdlUGxhbmUgKilwUGxhbmVUZW1wT3V0LCB0bXAsIE00T1NBX05VTEwpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJucyBlcnJvciAweCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlVG9CbGFjazoKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpICovCi0gICAgICAgICAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKSgoIDEuMCAtIFBlcmNlbnRhZ2VEb25lKSAqIDEwMjQpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcEluLAotICAgICAgICAgICAgICAgICAgICAoTTRWaUNvbUltYWdlUGxhbmUgKilwUGxhbmVUZW1wT3V0LCB0bXAsIE00T1NBX05VTEwpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJucyBlcnJvciAweCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiggcEZ4LT5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICAgICAgPj0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEN0cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIG5leHRFZmZlY3RUaW1lOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMDApICovCi0gICAgICAgICAgICAgICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoUGVyY2VudGFnZURvbmUgKiAxMDAwKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIHByb2dyZXNzIGluZm8gcHJvdmlkZWQgdG8gdGhlIGV4dGVybmFsIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKXRtcDsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlPdXRwdXRUaW1lID0gKE00T1NBX1VJbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0czsKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSAtIHBDbGlwLT5pVm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MuYklzTGFzdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0VGltZSA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kSW5wdXRWaWRDdHMgXAotICAgICAgICAgICAgICAgICAgICAgICAgKyBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZihuZXh0RWZmZWN0VGltZSA+PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUgKyBwRngtPnVpRHVyYXRpb24pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRQcm9ncmVzcy5iSXNMYXN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBIZXJlIHNraXAgdGhlIGZyYW1pbmcgZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgKiBkbyB0aGUgZnJhbWluZyBlZmZlY3QgYWZ0ZXIgYXBwbHkgcmVuZGVyaW5nIG1vZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwRngtPnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTTRPU0FfTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWluZ0VmZmVjdCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFBsYW5lVGVtcE91dFswXS5wYWNfZGF0YSwgcFBsYW5lVGVtcEluWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXBJblswXS51X2hlaWdodCAqIHBQbGFuZVRlbXBJblswXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUGxhbmVUZW1wT3V0WzFdLnBhY19kYXRhLCBwUGxhbmVUZW1wSW5bMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lVGVtcEluWzFdLnVfaGVpZ2h0ICogcFBsYW5lVGVtcEluWzFdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBQbGFuZVRlbXBPdXRbMl0ucGFjX2RhdGEsIHBQbGFuZVRlbXBJblsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wSW5bMl0udV9oZWlnaHQgKiBwUGxhbmVUZW1wSW5bMl0udV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBGeC0+RXh0VmlkZW9FZmZlY3RGY3QocEZ4LT5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXBJbiwgcFBsYW5lVGVtcE91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGeC0+VmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogdW5rbm93biBlZmZlY3QgdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRngtPlZpZGVvRWZmZWN0VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRUZGRUNUX1RZUEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJDIFVwZGF0ZXMgcFRlbXBQbGFuZUluIGFuZCBwVGVtcFBsYW5lT3V0IGRlcGVuZGluZyBvbiBjdXJyZW50IGVmZmVjdCAqLwotICAgICAgICBpZiAoKChpICUgMiA9PSAwKSAmJiAoTnVtQWN0aXZlRWZmZWN0cyAgJSAyID09IDApKQotICAgICAgICAgICAgfHwgKChpICUgMiAhPSAwKSAmJiAoTnVtQWN0aXZlRWZmZWN0cyAlIDIgIT0gMCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGxhbmVUZW1wSW4gPSBwVGVtcFl1dlBsYW5lOwotICAgICAgICAgICAgcFBsYW5lVGVtcE91dCA9IHBQbGFuZU91dDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQbGFuZVRlbXBJbiA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwVGVtcFl1dlBsYW5lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgaWYocFRlbXBZdXZQbGFuZVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBUZW1wWXV2UGxhbmVbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcFRlbXBZdXZQbGFuZVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgdmlkZW8gdHJhbnNpdGlvbiBlZmZlY3QgcEMxK3BDMi0+cFBsYW5lT3V0Ci0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgIChJTi9PVVQpIE91dHB1dCByYXcgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbiggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlQcm9ncmVzczsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgY29uc3QgTTRPU0FfSW50MzIgaUR1ciA9IChNNE9TQV9JbnQzMilwQy0+Ci0gICAgICAgIHBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBlbmQgY3V0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoKE00T1NBX0RvdWJsZSlwQy0+cEMxLT5pRW5kVGltZSkgLSBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArCi0gICAgICAgICgoTTRPU0FfRG91YmxlKXBDLT5wQzEtPmlWb2Zmc2V0KTsKLSAgICAvKioKLSAgICAqIFdlIG11c3QgcmVtb3ZlIHRoZSBkdXJhdGlvbiBvZiBvbmUgZnJhbWUsIGVsc2Ugd2Ugd291bGQgYWxtb3N0IG5ldmVyIHJlYWNoIHRoZSBlbmQKLSAgICAqIChJdCdzIGtpbmQgb2YgYSAicGlsZSBhbmQgaW50ZXJ2YWxzIiBpc3N1ZSkuICovCi0gICAgaVByb2dyZXNzIC09IChNNE9TQV9JbnQzMilwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0KLSAgICBpZiggaVByb2dyZXNzIDwgMCApIC8qKjwgU2FuaXR5IGNoZWNrcyAqLwotICAgIHsKLSAgICAgICAgaVByb2dyZXNzID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uLCBvbiBhIGJhc2UgMTAwMCAqLwotICAgIGlQcm9ncmVzcyA9ICggKCBpRHVyIC0gaVByb2dyZXNzKSAqIDEwMDApIC8gaUR1cjsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrcyAqLwotICAgIGlmKCBpUHJvZ3Jlc3MgPCAwICkKLSAgICB7Ci0gICAgICAgIGlQcm9ncmVzcyA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIGlQcm9ncmVzcyA+IDEwMDAgKQotICAgIHsKLSAgICAgICAgaVByb2dyZXNzID0gMTAwMDsKLSAgICB9Ci0KLSAgICBzd2l0Y2goIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlRyYW5zaXRpb25CZWhhdmlvdXIgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9TcGVlZFVwOgotICAgICAgICAgICAgaVByb2dyZXNzID0gKCBpUHJvZ3Jlc3MgKiBpUHJvZ3Jlc3MpIC8gMTAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfTGluZWFyOgotICAgICAgICAgICAgLypkbyBub3RoaW5nKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU3BlZWREb3duOgotICAgICAgICAgICAgaVByb2dyZXNzID0gKE00T1NBX0ludDMyKShzcXJ0KGlQcm9ncmVzcyAqIDEwMDApKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU2xvd01pZGRsZToKLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoc3FydChpUHJvZ3Jlc3MgKiA1MDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKCggKCAoIGlQcm9ncmVzcyAtIDUwMCkgKiAoaVByb2dyZXNzIC0gNTAwKSkKLSAgICAgICAgICAgICAgICAgICAgLyA1MDApICsgNTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfRmFzdE1pZGRsZToKLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoKCBpUHJvZ3Jlc3MgKiBpUHJvZ3Jlc3MpIC8gNTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPSAoTTRPU0FfSW50MzIpKHNxcnQoKCBpUHJvZ3Jlc3MgLSA1MDApICogNTAwKSArIDUwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLypkbyBub3RoaW5nKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHN3aXRjaCggcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uVmlkZW9UcmFuc2l0aW9uVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGU6Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQXBwbHkgdGhlIHRyYW5zaXRpb24gZWZmZWN0ICovCi0gICAgICAgICAgICBlcnIgPSBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwKE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcEMtPnl1djEsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcEMtPnl1djIsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lT3V0LCBpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1RSQU5TSVRJT05fRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9UUkFOU0lUSU9OX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmU6Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhpcyBpcyBhIHN0dXBpZC1ub24gb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIE5vbmUgdHJhbnNpdGlvbi4uLgotICAgICAgICAgICAgKiBXZSBjb3B5IHRoZSBZVVYgZnJhbWUgKi8KLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKSAvKio8IGZpcnN0IGhhbGYgb2YgdHJhbnNpdGlvbiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQbGFuZSA9IHBDLT55dXYxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKio8IHNlY29uZCBoYWxmIG9mIHRyYW5zaXRpb24gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGxhbmUgPSBwQy0+eXV2MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBZVVYgZnJhbWVzICovCi0gICAgICAgICAgICBpID0gMzsKLQotICAgICAgICAgICAgd2hpbGUoIGktLSA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFtpXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilwUGxhbmVbaV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtpXS51X3N0cmlkZSAqIHBQbGFuZU91dFtpXS51X2hlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYoIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICA+PSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBwcm9ncmVzcyBpbmZvIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKWlQcm9ncmVzczsKLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSAtIHBDLT5wQzEtPmlWb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXBdLkV4dFZpZGVvVHJhbnNpdGlvbkZjdCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXBdLnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+eXV2MSwgcEMtPnl1djIsIHBQbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT4KLSAgICAgICAgICAgICAgICAgICAgdWlDdXJyZW50Q2xpcF0uVmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICAgICAgICAgICAgICAtIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCB2aWRlbyB0cmFuc2l0aW9uIGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uOiB1bmtub3duIHRyYW5zaXRpb24gdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fVFJBTlNJVElPTl9UWVBFOwotICAgICAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb246IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50VXBkYXRlVGltZUluZm8oKQotICogQGJyaWVmICAgIFVwZGF0ZSBiaXQgc3RyZWFtIHRpbWUgaW5mbyBieSBDb3VudGVyIFRpbWUgU3lzdGVtIHRvIGJlIGNvbXBsaWFudCB3aXRoCi0gKiAgICAgICAgICBwbGF5ZXJzIHVzaW5nIGJpdCBzdHJlYW0gdGltZSBpbmZvCi0gKiBAbm90ZSAgICBIMjYzIHVzZXMgYW4gYWJzb2x1dGUgdGltZSBjb3VudGVyIHVubGlrZSBNUEVHNCB3aGljaCB1c2VzIEdyb3VwIE9mIFZvcHMKLSAqICAgICAgICAgIChHT1YsIHNlZSB0aGUgc3RhbmRhcmQpCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgICAgICAgICAgKElOL09VVCkgcmV0dXJucyB0aW1lIHVwZGF0ZWQgdmlkZW8gQVUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9mZnNldCBiZXR3ZWVuIHN5c3RlbSBhbmQgdmlkZW8gdGltZSAoTVBFRzQgb25seSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGNsaXAgKE1QRUc0IG9ubHkpCi0gKiBAcmV0dXJuICAgIG5vdGhpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKnBBVSApCi17Ci0gICAgTTRPU0FfVUludDggdWlUbXA7Ci0gICAgTTRPU0FfVUludDMyIHVpQ3RzID0gMDsKLSAgICBNNE9TQV9NZW1BZGRyOCBwVG1wOwotICAgIE00T1NBX1VJbnQzMiB1aUFkZDsKLSAgICBNNE9TQV9VSW50MzIgdWlDdXJyR292OwotICAgIE00T1NBX0ludDggaURpZmY7Ci0KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCA9IHBDLT5wQzE7Ci0gICAgTTRPU0FfSW50MzIgKnBPZmZzZXQgPSAmKHBDLT5ld2MuaU1wZWc0R292T2Zmc2V0KTsKLQotICAgIC8qKgotICAgICogU2V0IEgyNjMgdGltZSBjb3VudGVyIGZyb20gc3lzdGVtIHRpbWUgKi8KLSAgICBpZiggTTRTWVNfa0gyNjMgPT0gcEFVLT5zdHJlYW0tPnN0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgdWlUbXAgPSAoTTRPU0FfVUludDgpKChNNE9TQV9VSW50MzIpKCAoIHBBVS0+Q1RTICogMzApIC8gMTAwMSArIDAuNSkKLSAgICAgICAgICAgICUgTTRWU1MzR1BQX0VESVRfSDI2M19NT0RVTE9fVElNRSk7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoKE00T1NBX01lbUFkZHI4KShwQVUtPmRhdGFBZGRyZXNzKSwKLSAgICAgICAgICAgIHVpVG1wKTsKLSAgICB9Ci0gICAgLyoKLSAgICAqIFNldCBNUEVHNCBHT1YgdGltZSBjb3VudGVyIHJlZ2FyZGluZyB2aWRlbyBhbmQgc3lzdGVtIHRpbWUgKi8KLSAgICBlbHNlIGlmKCBNNFNZU19rTVBFR180ID09IHBBVS0+c3RyZWFtLT5zdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICogSWYgR09WLgotICAgICAgICAqIGJld2FyZSBvZiBsaXR0bGUvYmlnIGVuZGlhbiEgKi8KLSAgICAgICAgLyogY29ycmVjdGlvbjogcmVhZCA4IGJpdHMgYmxvY2sgaW5zdGVhZCBvZiBvbmUgMzIgYml0cyBibG9jayAqLwotICAgICAgICBNNE9TQV9VSW50OCAqdGVtcDggPSAoTTRPU0FfVUludDggKikocEFVLT5kYXRhQWRkcmVzcyk7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wMzIgPSAwOwotCi0gICAgICAgIHRlbXAzMiA9ICggMHgwMDAwMDBmZiAmIChNNE9TQV9VSW50MzIpKCp0ZW1wOCkpCi0gICAgICAgICAgICArICgweDAwMDBmZjAwICYgKChNNE9TQV9VSW50MzIpKCoodGVtcDggKyAxKSkpIDw8IDgpCi0gICAgICAgICAgICArICgweDAwZmYwMDAwICYgKChNNE9TQV9VSW50MzIpKCoodGVtcDggKyAyKSkpIDw8IDE2KQotICAgICAgICAgICAgKyAoMHhmZjAwMDAwMCAmICgoTTRPU0FfVUludDMyKSgqKHRlbXA4ICsgMykpKSA8PCAyNCk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzIoIlJDOiBUZW1wMzI6IDB4JXgsIGRhdGFBZGRyZXNzOiAweCV4XG4iLCB0ZW1wMzIsCi0gICAgICAgICAgICAqKHBBVS0+ZGF0YUFkZHJlc3MpKTsKLQotICAgICAgICBpZiggTTRWU1MzR1BQX0VESVRfR09WX0hFQURFUiA9PSB0ZW1wMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVG1wID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKHBBVS0+ZGF0YUFkZHJlc3MKLSAgICAgICAgICAgICAgICArIDEpOyAvKio8IEp1bXAgdG8gdGhlIHRpbWUgY29kZSAoanVzdCBhZnRlciB0aGUgMzIgYml0cyBoZWFkZXIpICovCi0gICAgICAgICAgICB1aUFkZCA9IChNNE9TQV9VSW50MzIpKHBBVS0+Q1RTKSsoICpwT2Zmc2V0KTsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPmJNcGVnNEdvdlN0YXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX0ZBTFNFOiAvKjwgSU5JVCAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWRlbyB0aW1lID0gY2VpbCAoc3lzdGVtIHRpbWUgKyBvZmZzZXQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUN0cyA9ICggdWlBZGQgKyA5OTkpIC8gMTAwMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IHVwZGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKCAqcE9mZnNldCkgKz0gKCggdWlDdHMgKiAxMDAwKSAtIHVpQWRkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB2YWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZVNldCA9IHVpQ3RzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGF0ZSB0byAnZmlyc3QnICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPmJNcGVnNEdvdlN0YXRlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0FfVFJVRTogLyo8IFVQREFURSAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgY3VycmVudCBHb3YgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdihwVG1wLCAmdWlDdXJyR292KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlkZW8gdGltZSA9IGZsb29yIG9yIGNlaWwgKHN5c3RlbSB0aW1lICsgb2Zmc2V0KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlDdHMgPSAodWlBZGQgLyAxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlEaWZmID0gKE00T1NBX0ludDgpKHVpQ3VyckdvdgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlR2V0IC0gdWlDdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZVNldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNlaWxpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpRGlmZiA+IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ3RzICs9IChNNE9TQV9VSW50MzIpKGlEaWZmKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCB1cGRhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICpwT2Zmc2V0KSArPSAoKCB1aUN0cyAqIDEwMDApIC0gdWlBZGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHZhbHVlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlR2V0ID0gdWlDdXJyR292OwotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlU2V0ID0gdWlDdHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdihwVG1wLCB1aUN0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrVmlkZW9FZmZlY3RzKCkKLSAqIEBicmllZiAgICBDaGVjayB3aGljaCB2aWRlbyBlZmZlY3QgbXVzdCBiZSBhcHBsaWVkIGF0IHRoZSBjdXJyZW50IHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpQ2xpcE51bWJlciApCi17Ci0gICAgTTRPU0FfVUludDggdWlDbGlwSW5kZXg7Ci0gICAgTTRPU0FfVUludDggdWlGeEluZGV4LCBpOwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICpwRng7Ci0gICAgTTRPU0FfSW50MzIgT2ZmLCBCQywgRUM7Ci0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBNNE9TQV9JbnQzMiB0ID0gKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotCi0gICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcDsKLSAgICBpZiAodWlDbGlwTnVtYmVyID09IDEpIHsKLSAgICAgICAgcENsaXAgPSBwQy0+cEMxOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBTaG9ydGN1dHMgZm9yIGNvZGUgcmVhZGFiaWxpdHkgKi8KLSAgICBPZmYgPSBwQ2xpcC0+aVZvZmZzZXQ7Ci0gICAgQkMgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0gICAgRUMgPSBwQ2xpcC0+aUVuZFRpbWU7Ci0KLSAgICBpID0gMDsKLQotICAgIGZvciAoIHVpRnhJbmRleCA9IDA7IHVpRnhJbmRleCA8IHBDLT5uYkVmZmVjdHM7IHVpRnhJbmRleCsrICkKLSAgICB7Ci0gICAgICAgIC8qKiBTaG9ydGN1dCwgcmV2ZXJzZSBvcmRlciBiZWNhdXNlIG9mIHByaW9yaXR5IGJldHdlZW4gZWZmZWN0cyhFbmRFZmZlY3QgYWx3YXlzIGNsZWFuICkqLwotICAgICAgICBwRnggPSAmKHBDLT5wRWZmZWN0c0xpc3RbcEMtPm5iRWZmZWN0cyAtIDEgLSB1aUZ4SW5kZXhdKTsKLQotICAgICAgICBpZiggTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfTm9uZSAhPSBwRngtPlZpZGVvRWZmZWN0VHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhY3R1YWxseSBhIHZpZGVvIGVmZmVjdCAqLwotCi0gICAgICAgICAgICAgaWYodWlDbGlwTnVtYmVyID09MSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBBcmUgd2UgYWZ0ZXIgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGVmZmVjdD8KLSAgICAgICAgICAgICAgICAgKiBvciBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICggKHQgPj0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHQgPD0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lICsgcEZ4LT51aUR1cmF0aW9uKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGFjdGl2ZSBlZmZlY3QocykgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdFtpXSA9IHBDLT5uYkVmZmVjdHMtMS11aUZ4SW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjb3VudGVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogRm9yIGFsbCBleHRlcm5hbCBlZmZlY3RzIHNldCB0aGlzIGZsYWcgdG8gdHJ1ZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEZ4LT5WaWRlb0VmZmVjdFR5cGUgPiBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fYkNsaXBFeHRlcm5hbEhhc1N0YXJ0ZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPyAqLwotICAgICAgICAgICAgICAgIGlmICggKChNNE9TQV9JbnQzMikodCArIHBDLT5wVHJhbnNpdGlvbkxpc3RbdWlDbGlwSW5kZXhdLnVpVHJhbnNpdGlvbkR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICA+PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUpKQotICAgICAgICAgICAgICAgICAgICAmJiAoIChNNE9TQV9JbnQzMikodCArIHBDLT5wVHJhbnNpdGlvbkxpc3RbdWlDbGlwSW5kZXhdLnVpVHJhbnNpdGlvbkR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICA8PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUgKyBwRngtPnVpRHVyYXRpb24pKSApIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFNldCB0aGUgYWN0aXZlIGVmZmVjdChzKSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXSA9IHBDLT5uYkVmZmVjdHMtMS11aUZ4SW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjb3VudGVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIEZvciBhbGwgZXh0ZXJuYWwgZWZmZWN0cyBzZXQgdGhpcyBmbGFnIHRvIHRydWUuICovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBGeC0+VmlkZW9FZmZlY3RUeXBlID4gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBUaGUgdGhpcmQgZWZmZWN0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSwgdGhlbiB0aGUgc2Vjb25kIG9uZSwgdGhlbiB0aGUgZmlyc3Qgb25lLgotICAgICAgICAgICAgICAgICAgICAgKiBIZW5jZSwgYXMgc29vbiBhcyB3ZSBmb3VuZCBhbiBhY3RpdmUgZWZmZWN0LCB3ZSBjYW4gZ2V0IG91dCBvZiB0aGlzIGxvb3AgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTRWSURFT0VESVRJTkdfa0gyNjQgIT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgTXBlZzQgYW5kIEgyNjMgY2xpcHMsIGZ1bGwgZGVjb2RlIGVuY29kZSBub3QgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fYkNsaXBFeHRlcm5hbEhhc1N0YXJ0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZigxPT11aUNsaXBOdW1iZXIpCi0gICAgewotICAgIC8qKgotICAgICAqIFNhdmUgbnVtYmVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMgPSBpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzMSA9IGk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGFuZ2UgdGhlIGFic29sdXQgdGltZSB0byBjbGlwIHJlbGF0ZWQgdGltZSAqLwotICAgIHQgLT0gT2ZmOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBhcmUgb24gdGhlIGJlZ2luIGN1dCAoZm9yIGNsaXAxIG9ubHkpICovCi0gICAgaWYoICggMCAhPSBCQykgJiYgKHQgPT0gQkMpICYmICgxID09IHVpQ2xpcE51bWJlcikgKQotICAgIHsKLSAgICAgICAgcEMtPmJDbGlwMUF0QmVnaW5DdXQgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+YkNsaXAxQXRCZWdpbkN1dCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgRW5jUGFyYW1zOwotCi0gICAgLyoqCi0gICAgKiBTaW11bGF0ZSBhIHdyaXRlciBpbnRlcmZhY2Ugd2l0aCBvdXIgc3BlY2lmaWMgZnVuY3Rpb24gKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFByb2Nlc3NBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRQcm9jZXNzQVU7IC8qKjwgVGhpcyBmdW5jdGlvbiBpcyBWU1MgM0dQUCBzcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wU3RhcnRBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTdGFydEFVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgZm9sbG93IHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBXcml0ZXJDb250ZXh0ID0KLSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQpCi0gICAgICAgIHBDOyAvKio8IFdlIGdpdmUgdGhlIGludGVybmFsIGNvbnRleHQgYXMgd3JpdGVyIGNvbnRleHQgKi8KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBlbmNvZGVyIGludGVyZmFjZSwgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBzZXRDdXJyZW50RW5jb2RlciByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgZW5jb2RlciBzaGVsbCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBWU1Mgc2V0dGluZ3MgKi8KLQotICAgIC8qIENvbW1vbiBwYXJhbWV0ZXJzICovCi0gICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoID0gcEMtPmV3Yy51aVZpZGVvV2lkdGg7Ci0gICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gcEMtPmV3Yy51aVZpZGVvSGVpZ2h0OwotICAgIEVuY1BhcmFtcy51aVRpbWVTY2FsZSA9IHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZTsKLQotICAgIGlmKCBwQy0+YklzTU1TID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qIE5vIHN0cmljdCByZWd1bGF0aW9uIGluIHZpZGVvIGVkaXRvciAqLwotICAgICAgICAvKiBCZWNhdXNlIG9mIHRoZSBlZmZlY3RzIGFuZCB0cmFuc2l0aW9ucyB3ZSBzaG91bGQgYWxsb3cgbW9yZSBmbGV4aWJpbGl0eSAqLwotICAgICAgICAvKiBBbHNvIGl0IHByZXZlbnRzIHRvIGRyb3AgaW1wb3J0YW50IGZyYW1lcyAod2l0aCBhIGJhZCByZXN1bHQgb24gc2hlZHVsaW5nIGFuZAotICAgICAgICBibG9jayBlZmZldGNzKSAqLwotICAgICAgICBFbmNQYXJhbXMuYkludGVybmFsUmVndWxhdGlvbiA9IE00T1NBX0ZBTFNFOwotICAgICAgICAvLyBWYXJpYWJsZSBmcmFtZXJhdGUgaXMgbm90IHN1cHBvcnRlZCBieSBTdGFnZUZyaWdodCBlbmNvZGVycwotICAgICAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRFTkNPREVSX2szMF9GUFM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEluIGNhc2Ugb2YgTU1TIG1vZGUsIHdlIG5lZWQgdG8gZW5hYmxlIGJpdHJhdGUgcmVndWxhdGlvbiB0byBiZSBzdXJlICovCi0gICAgICAgIC8qIHRvIHJlYWNoIHRoZSB0YXJnZXRlZCBvdXRwdXQgZmlsZSBzaXplICovCi0gICAgICAgIEVuY1BhcmFtcy5iSW50ZXJuYWxSZWd1bGF0aW9uID0gTTRPU0FfVFJVRTsKLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IHBDLT5NTVN2aWRlb0ZyYW1lcmF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKGRlZmF1bHRzKSAqLwotICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSA9IDA7ICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aVZlcnRpY2FsU2VhcmNoUmFuZ2UgPSAwOyAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7ICAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCA9IDA7ICAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpTW90aW9uRXN0aW1hdGlvblRvb2xzID0gMDsgICAgIC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uID0gTTRPU0FfVFJVRTsgICAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsgICAvKiBpbml0aWFsIFFQID0gMTAgKi8KLSAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotICAgIC8qKgotICAgICogU2V0IHRoZSB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZXdjLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9MZXZlbD0gcEMtPmV3Yy5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgc3dpdGNoICggcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUEVHNDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDg7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gKE00T1NBX1VJbnQ4KSgoIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbgotICAgICAgICAgICAgICAgICogcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlKSAvIDEwMDAuMCArIDAuNSk7Ci0KLSAgICAgICAgICAgIGlmKCBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID09IDAgKQotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IE00U1lTX0gyNjQiKTsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2NDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgLy9FbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRWSURFT0VESVRJTkdfazVfRlBTOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBVbmtub3duIHZpZGVvU3RyZWFtVHlwZSAweCV4IiwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT51aU1NU1ZpZGVvQml0cmF0ZTsgLyogUkMgKi8KLSAgICAgICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gMDsgLyogV2UgbGV0IHRoZSBlbmNvZGVyIGNob29zZSB0aGUgdGltZXNjYWxlICovCi0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IGNhbGxpbmcgZW5jb2RlciBwRmN0SW5pdCIpOwotICAgIC8qKgotICAgICogSW5pdCB0aGUgdmlkZW8gZW5jb2RlciAoYWR2YW5jZWQgc2V0dGluZ3MgdmVyc2lvbiBvZiB0aGUgZW5jb2RlciBPcGVuIGZ1bmN0aW9uKSAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UsIE00VlNTM0dQUF9pbnRWUFAsIHBDLAotICAgICAgICBwQy0+U2hlbGxBUEkucEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSwKLSAgICAgICAgcEMtPlNoZWxsQVBJLnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcjogY2FsbGluZyBlbmNvZGVyIHBGY3RPcGVuIik7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLldyaXRlclZpZGVvQVUsICZFbmNQYXJhbXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQ7Ci0gICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdFN0YXJ0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmc7Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgRGVzdHJveSB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wRW5jQ29udGV4dCApCi0gICAgewotICAgICAgICBpZiggTTRWU1MzR1BQX2tFbmNvZGVyUnVubmluZyA9PSBwQy0+ZXdjLmVuY29kZXJTdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSGFzIHRoZSBlbmNvZGVyIGFjdHVhbGx5IGJlZW4gb3BlbmVkPyBEb24ndCBjbG9zZSBpdCBpZiB0aGF0J3Mgbm90IHRoZSBjYXNlLiAqLwotICAgICAgICBpZiggTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZCA9PSBwQy0+ZXdjLmVuY29kZXJTdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cCByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rTm9FbmNvZGVyOwotICAgICAgICAvKioKLSAgICAgICAgKiBSZXNldCB2YXJpYWJsZSAqLwotICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFNldEgyNjNUaW1lQ291bnRlcigpCi0gKiBAYnJpZWYgICAgTW9kaWZ5IHRoZSB0aW1lIGNvdW50ZXIgb2YgdGhlIGdpdmVuIEgyNjMgdmlkZW8gQVUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEF1RGF0YUJ1ZmZlciAgICAoSU4vT1VUKSBIMjYzIFZpZGVvIEFVIHRvIG1vZGlmeQotICogQHBhcmFtICAgIHVpQ3RzICAgICAgICAgICAgKElOKSAgICAgTmV3IHRpbWUgY291bnRlciB2YWx1ZQotICogQHJldHVybiAgICBub3RoaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpQ3RzICkKLXsKLSAgICAvKgotICAgICogIFRoZSBIMjYzIHRpbWUgY291bnRlciBpcyA4IGJpdHMgbG9jYXRlZCBvbiB0aGUgIngiIGJlbG93OgotICAgICoKLSAgICAqICAgfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfAotICAgICogICAgPz8/Pz8/Pz8gPz8/Pz8/Pz8gPz8/Pz8/eHggeHh4eHh4Pz8KLSAgICAqLwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgMiBiaXRzIG9uIHRoZSB0aGlyZCBieXRlICovCi0gICAgcEF1RGF0YUJ1ZmZlclsyXSA9ICggcEF1RGF0YUJ1ZmZlclsyXSAmIDB4RkMpIHwgKCggdWlDdHMgPj4gNikgJiAweDMpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgNiBiaXRzIG9uIHRoZSBmb3VydGggYnl0ZSAqLwotICAgIHBBdURhdGFCdWZmZXJbM10gPSAoICggdWlDdHMgPDwgMikgJiAweEZDKSB8IChwQXVEYXRhQnVmZmVyWzNdICYgMHgzKTsKLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdigpCi0gKiBAYnJpZWYgICAgTW9kaWZ5IHRoZSB0aW1lIGluZm8gZnJvbSBHcm91cCBPZiBWT1AgdmlkZW8gQVUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEF1RGF0YUJ1ZmZlciAgICAoSU4pICAgIE1QRUc0IFZpZGVvIEFVIHRvIG1vZGlmeQotICogQHBhcmFtICAgIHVpQ3RzU2VjICAgICAgICAgICAgKElOKSAgICAgTmV3IEdPViB0aW1lIGluZm8gaW4gc2Vjb25kIHVuaXQKLSAqIEByZXR1cm4gICAgbm90aGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50U2V0TVBFRzRHb3YoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpQ3RzU2VjICkKLXsKLSAgICAvKgotICAgICogIFRoZSBNUEVHLTQgdGltZSBjb2RlIGxlbmd0aCBpcyAxOCBiaXRzOgotICAgICoKLSAgICAqICAgICBoaCAgICAgbW0gICAgbWFya2VyICAgIHNzCi0gICAgKiAgICB4eHh4eHx4eHggeHh4ICAgICAxICAgIHh4eHggeHggPz8/Pz8/Ci0gICAgKiAgIHwtLS0tLSAtLS18LS0tICAgICAtICAgIC0tLS18LS0gLS0tLS0tfAotICAgICovCi0gICAgTTRPU0FfVUludDggdWlIaDsKLSAgICBNNE9TQV9VSW50OCB1aU1tOwotICAgIE00T1NBX1VJbnQ4IHVpU3M7Ci0gICAgTTRPU0FfVUludDggdWlUbXA7Ci0KLSAgICAvKioKLSAgICAqIFdyaXRlIHRoZSAyIGxhc3QgYml0cyBzcyAqLwotICAgIHVpU3MgPSAoTTRPU0FfVUludDgpKHVpQ3RzU2VjICUgNjApOyAvKio8IG1vZHVsbyBwYXJ0ICovCi0gICAgcEF1RGF0YUJ1ZmZlclsyXSA9ICgoICggdWlTcyAmIDB4MDMpIDw8IDYpIHwgKHBBdURhdGFCdWZmZXJbMl0gJiAweDNGKSk7Ci0KLSAgICBpZiggdWlDdHNTZWMgPCA2MCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgMyBsYXN0IGJpdHMgb2YgbW0sIHRoZSBtYXJrZXIgYml0ICgweDEwICovCi0gICAgICAgIHBBdURhdGFCdWZmZXJbMV0gPSAoKCAweDEwKSB8ICh1aVNzID4+IDIpKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgNSBiaXRzIG9mIGhoIGFuZCAzIG9mIG1tIChvdXQgb2YgNikgKi8KLSAgICAgICAgcEF1RGF0YUJ1ZmZlclswXSA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdyaXRlIHRoZSAzIGxhc3QgYml0cyBvZiBtbSwgdGhlIG1hcmtlciBiaXQgKDB4MTAgKi8KLSAgICAgICAgdWlUbXAgPSAoTTRPU0FfVUludDgpKHVpQ3RzU2VjIC8gNjApOyAvKio8IGludGVnZXIgcGFydCAqLwotICAgICAgICB1aU1tID0gKE00T1NBX1VJbnQ4KSh1aVRtcCAlIDYwKTsKLSAgICAgICAgcEF1RGF0YUJ1ZmZlclsxXSA9ICgoIHVpTW0gPDwgNSkgfCAoMHgxMCkgfCAodWlTcyA+PiAyKSk7Ci0KLSAgICAgICAgaWYoIHVpVG1wIDwgNjAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogV3JpdGUgdGhlIDUgYml0cyBvZiBoaCBhbmQgMyBvZiBtbSAob3V0IG9mIDYpICovCi0gICAgICAgICAgICBwQXVEYXRhQnVmZmVyWzBdID0gKCh1aU1tID4+IDMpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBXcml0ZSB0aGUgNSBiaXRzIG9mIGhoIGFuZCAzIG9mIG1tIChvdXQgb2YgNikgKi8KLSAgICAgICAgICAgIHVpSGggPSAoTTRPU0FfVUludDgpKHVpVG1wIC8gNjApOwotICAgICAgICAgICAgcEF1RGF0YUJ1ZmZlclswXSA9ICgoIHVpSGggPDwgMykgfCAodWlNbSA+PiAzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludEdldE1QRUc0R292KCkKLSAqIEBicmllZiAgICBHZXQgdGhlIHRpbWUgaW5mbyBmcm9tIEdyb3VwIE9mIFZPUCB2aWRlbyBBVQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQXVEYXRhQnVmZmVyICAgIChJTikgICAgTVBFRzQgVmlkZW8gQVUgdG8gbW9kaWZ5Ci0gKiBAcGFyYW0gICAgcEN0c1NlYyAgICAgICAgICAgIChPVVQpICAgIEN1cnJlbnQgR09WIHRpbWUgaW5mbyBpbiBzZWNvbmQgdW5pdAotICogQHJldHVybiAgICBub3RoaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnBDdHNTZWMgKQotewotICAgIC8qCi0gICAgKiAgVGhlIE1QRUctNCB0aW1lIGNvZGUgbGVuZ3RoIGlzIDE4IGJpdHM6Ci0gICAgKgotICAgICogICAgIGhoICAgICBtbSAgICBtYXJrZXIgICAgc3MKLSAgICAqICAgIHh4eHh4fHh4eCB4eHggICAgIDEgICAgeHh4eCB4eCA/Pz8/Pz8KLSAgICAqICAgfC0tLS0tIC0tLXwtLS0gICAgIC0gICAgLS0tLXwtLSAtLS0tLS18Ci0gICAgKi8KLSAgICBNNE9TQV9VSW50OCB1aUhoOwotICAgIE00T1NBX1VJbnQ4IHVpTW07Ci0gICAgTTRPU0FfVUludDggdWlTczsKLSAgICBNNE9TQV9VSW50OCB1aVRtcDsKLSAgICBNNE9TQV9VSW50MzIgdWlDdHNTZWM7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgc3MgKi8KLSAgICB1aVNzID0gKCggcEF1RGF0YUJ1ZmZlclsyXSAmIDB4QzApID4+IDYpOwotICAgIHVpVG1wID0gKCggcEF1RGF0YUJ1ZmZlclsxXSAmIDB4MEYpIDw8IDIpOwotICAgIHVpQ3RzU2VjID0gdWlTcyArIHVpVG1wOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIG1tICovCi0gICAgdWlNbSA9ICgoIHBBdURhdGFCdWZmZXJbMV0gJiAweEUwKSA+PiA1KTsKLSAgICB1aVRtcCA9ICgoIHBBdURhdGFCdWZmZXJbMF0gJiAweDA3KSA8PCAzKTsKLSAgICB1aU1tID0gdWlNbSArIHVpVG1wOwotICAgIHVpQ3RzU2VjID0gKCB1aU1tICogNjApICsgdWlDdHNTZWM7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgaGggKi8KLSAgICB1aUhoID0gKCggcEF1RGF0YUJ1ZmZlclswXSAmIDB4RjgpID4+IDMpOwotCi0gICAgaWYoIHVpSGggKQotICAgIHsKLSAgICAgICAgdWlDdHNTZWMgPSAoIHVpSGggKiAzNjAwKSArIHVpQ3RzU2VjOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBpbiBzZWMgKi8KLSAgICAqcEN0c1NlYyA9IHVpQ3RzU2VjOwotCi0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoKQotICogQGJyaWVmICAgIEFsbG9jYXRlIHRoZSB0aHJlZSBZVVYgNDoyOjAgcGxhbmVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBQbGFuZXMgICAgKElOL09VVCkgdmFsaWQgcG9pbnRlciB0byAzIE00VklGSV9JbWFnZVBsYW5lIHN0cnVjdHVyZXMKLSAqIEBwYXJhbSAgICB1aVdpZHRoICAgIChJTikgICAgIEltYWdlIHdpZHRoCi0gKiBAcGFyYW0gICAgdWlIZWlnaHQoSU4pICAgICBJbWFnZSBoZWlnaHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpV2lkdGgsIE00T1NBX1VJbnQzMiB1aUhlaWdodCApCi17Ci0gICAgaWYgKHBQbGFuZXMgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiBJbnZhbGlkIHBQbGFuZXMgcG9pbnRlciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICAvKiBpZiB0aGUgYnVmZmVyIGlzIG5vdCBOVUxMIGFuZCBzYW1lIHNpemUgd2l0aCB0YXJnZXQgc2l6ZSwKLSAgICAgKiBkbyBub3QgbWFsbG9jIGFnYWluKi8KLSAgICBpZiAocFBsYW5lc1swXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMICYmCi0gICAgICAgIHBQbGFuZXNbMF0udV93aWR0aCA9PSB1aVdpZHRoICYmCi0gICAgICAgIHBQbGFuZXNbMF0udV9oZWlnaHQgPT0gdWlIZWlnaHQpIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgcFBsYW5lc1swXS51X3dpZHRoID0gdWlXaWR0aDsKLSAgICBwUGxhbmVzWzBdLnVfaGVpZ2h0ID0gdWlIZWlnaHQ7Ci0gICAgcFBsYW5lc1swXS51X3N0cmlkZSA9IHVpV2lkdGg7Ci0gICAgcFBsYW5lc1swXS51X3RvcGxlZnQgPSAwOwotCi0gICAgaWYgKHBQbGFuZXNbMF0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBQbGFuZXNbMF0ucGFjX2RhdGEpOwotICAgICAgICBwUGxhbmVzWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocFBsYW5lc1swXS51X3N0cmlkZQotICAgICAgICAqIHBQbGFuZXNbMF0udV9oZWlnaHQsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFBsYW5lc1swXS5wYWNfZGF0YSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFBsYW5lc1swXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjA6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUGxhbmVzWzBdLnBhY19kYXRhLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcFBsYW5lc1sxXS51X3dpZHRoID0gcFBsYW5lc1swXS51X3dpZHRoID4+IDE7Ci0gICAgcFBsYW5lc1sxXS51X2hlaWdodCA9IHBQbGFuZXNbMF0udV9oZWlnaHQgPj4gMTsKLSAgICBwUGxhbmVzWzFdLnVfc3RyaWRlID0gcFBsYW5lc1sxXS51X3dpZHRoOwotICAgIHBQbGFuZXNbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBpZiAocFBsYW5lc1sxXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocFBsYW5lc1sxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBQbGFuZXNbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBwUGxhbmVzWzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwUGxhbmVzWzFdLnVfc3RyaWRlCi0gICAgICAgICogcFBsYW5lc1sxXS51X2hlaWdodCwgTTRWU1MzR1BQLChNNE9TQV9DaGFyICopICJwUGxhbmVzWzFdLnBhY19kYXRhIik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwUGxhbmVzWzFdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMDogdW5hYmxlIHRvIGFsbG9jYXRlIHBQbGFuZXNbMV0ucGFjX2RhdGEsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilwUGxhbmVzWzBdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwUGxhbmVzWzJdLnVfd2lkdGggPSBwUGxhbmVzWzFdLnVfd2lkdGg7Ci0gICAgcFBsYW5lc1syXS51X2hlaWdodCA9IHBQbGFuZXNbMV0udV9oZWlnaHQ7Ci0gICAgcFBsYW5lc1syXS51X3N0cmlkZSA9IHBQbGFuZXNbMl0udV93aWR0aDsKLSAgICBwUGxhbmVzWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgaWYgKHBQbGFuZXNbMl0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBQbGFuZXNbMl0ucGFjX2RhdGEpOwotICAgICAgICBwUGxhbmVzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgcFBsYW5lc1syXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocFBsYW5lc1syXS51X3N0cmlkZQotICAgICAgICAqIHBQbGFuZXNbMl0udV9oZWlnaHQsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFBsYW5lc1syXS5wYWNfZGF0YSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFBsYW5lc1syXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjA6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUGxhbmVzWzJdLnBhY19kYXRhLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICBmcmVlKCh2b2lkICopcFBsYW5lc1swXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilwUGxhbmVzWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQbGFuZXNbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgbWVtc2V0KCh2b2lkICopcFBsYW5lc1swXS5wYWNfZGF0YSwgMCwgcFBsYW5lc1swXS51X3N0cmlkZSpwUGxhbmVzWzBdLnVfaGVpZ2h0KTsKLSAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVzWzFdLnBhY19kYXRhLCAwLCBwUGxhbmVzWzFdLnVfc3RyaWRlKnBQbGFuZXNbMV0udV9oZWlnaHQpOwotICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZXNbMl0ucGFjX2RhdGEsIDAsIHBQbGFuZXNbMl0udV9zdHJpZGUqcFBsYW5lc1syXS51X2hlaWdodCk7Ci0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQpOwotKiBAYnJpZWYgICAgSXQgQ292ZXJ0cyBhbmQgcmVzaXplcyBhIEFSR0I4ODg4IGltYWdlIHRvIFlVVjQyMAotKiBAbm90ZQotKiBAcGFyYW0gICAgcEZpbGVJbiAgICAgICAgIChJTikgVGhlIEFSR0I4ODggaW5wdXQgZmlsZQotKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyICAgIChJTikgUG9pbnRlciBvbiBmaWxlc3lzdGVtIGZ1bmN0aW9ucwotKiBAcGFyYW0gICAgcEltYWdlUGxhbmVzICAgIChJTi9PVVQpIFBvaW50ZXIgb24gWVVWNDIwIG91dHB1dCBwbGFuZXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0I4ODg4IGltYWdlICB3aWxsIGJlIGNvbnZlcnRlZCBhbmQgcmVzaXplZCB0byBvdXRwdXQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotKiBAcGFyYW0gd2lkdGggICAgICAgKElOKSB3aWR0aCBvZiB0aGUgQVJHQjg4ODgKLSogQHBhcmFtIGhlaWdodCAgICAgIChJTikgaGVpZ2h0IG9mIHRoZSBBUkdCODg4OAotKiBAcmV0dXJuICAgTTROT19FUlJPUjogTm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX0FMTE9DOiBtZW1vcnkgZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkgewotICAgIE00T1NBX0NvbnRleHQgcEFSR0JJbjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSByZ2JQbGFuZTEgLHJnYlBsYW5lMjsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplX2FyZ2IgPSB3aWR0aCAqIGhlaWdodCAqIDQ7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZV9yZ2I4ODggPSB3aWR0aCAqIGhlaWdodCAqIDM7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLGo9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9VSW50OCAqcEFyZ2JQbGFuZSA9Ci0gICAgICAgIChNNE9TQV9VSW50OCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiYXJnYiBkYXRhIik7Ci0gICAgaWYgKHBBcmdiUGxhbmUgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjA6IFwKLSAgICAgICAgICAgIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEFSR0IgcGxhbmUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEdldCBmaWxlIHNpemUgKi8KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPm9wZW5SZWFkKCZwQVJHQkluLCBwRmlsZUluLCBNNE9TQV9rRmlsZVJlYWQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgOiBcCi0gICAgICAgICAgICBDYW4gbm90IG9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGVJbiwgZXJyKTsKLSAgICAgICAgZnJlZShwQXJnYlBsYW5lKTsKLSAgICAgICAgcEFyZ2JQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBBcmdiUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgQ2FuIG5vdCByZWFkIEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICBwQXJnYlBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIGVyciA9IHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNFZTUzNHUFBfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBcCi0gICAgICAgICAgICBDYW4gbm90IGNsb3NlIEFSR0I4ODg4ICBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICBwQXJnYlBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIHJnYlBsYW5lMS5wYWNfZGF0YSA9Ci0gICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfcmdiODg4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIlJHQjg4OCBwbGFuZTEiKTsKLSAgICBpZihyZ2JQbGFuZTEucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmdiIHBsYW5lMSIpOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcmdiUGxhbmUxLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgIHJnYlBsYW5lMS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcmdiUGxhbmUxLnVfc3RyaWRlID0gd2lkdGgqMzsKLSAgICByZ2JQbGFuZTEudV90b3BsZWZ0ID0gMDsKLQotCi0gICAgLyoqIFJlbW92ZSB0aGUgYWxwaGEgY2hhbm5lbCAqLwotICAgIGZvciAoaT0wLCBqID0gMDsgaSA8IGZyYW1lU2l6ZV9hcmdiOyBpKyspIHsKLSAgICAgICAgaWYgKChpICUgNCkgPT0gMCkgY29udGludWU7Ci0gICAgICAgIHJnYlBsYW5lMS5wYWNfZGF0YVtqXSA9IHBBcmdiUGxhbmVbaV07Ci0gICAgICAgIGorKzsKLSAgICB9Ci0gICAgZnJlZShwQXJnYlBsYW5lKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHJlc2l6aW5nIGlzIHJlcXVpcmVkIHdpdGggY29sb3IgY29udmVyc2lvbiAqLwotICAgIGlmKHdpZHRoICE9IHBJbWFnZVBsYW5lcy0+dV93aWR0aCB8fCBoZWlnaHQgIT0gcEltYWdlUGxhbmVzLT51X2hlaWdodCkgewotCi0gICAgICAgIGZyYW1lU2l6ZV9yZ2I4ODggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0ICogMzsKLSAgICAgICAgcmdiUGxhbmUyLnBhY19kYXRhID0KLSAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfcmdiODg4LCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJyZ2IgUGxhbmUyIik7Ci0gICAgICAgIGlmKHJnYlBsYW5lMi5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmdiIHBsYW5lMiIpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHJnYlBsYW5lMi51X2hlaWdodCA9ICBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICByZ2JQbGFuZTIudV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgcmdiUGxhbmUyLnVfc3RyaWRlID0gcEltYWdlUGxhbmVzLT51X3dpZHRoKjM7Ci0gICAgICAgIHJnYlBsYW5lMi51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgIC8qIFJlc2l6aW5nICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZ2JQbGFuZTEsICZyZ2JQbGFuZTIpOwotICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3IgcmVzaXppbmcgUkdCODg4IHRvIFJHQjg4ODogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUyLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKkNvbnZlcnRpbmcgUmVzaXplZCBSR0I4ODggdG8gWVVWNDIwICovCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUyLCBwSW1hZ2VQbGFuZXMpOwotICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3IgY29udmVydGluZyBmcm9tIFJHQjg4OCB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gTTRWSUZJX1JHQjg4OHRvWVVWNDIwKE00T1NBX05VTEwsICZyZ2JQbGFuZTEsIHBJbWFnZVBsYW5lcyk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgfQotY2xlYW51cDoKLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgZXhpdCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwbGFuZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRBSVJfUGFyYW1zIGFpclBhcmFtczsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXNUZW1wWzNdOwotICAgIE00T1NBX1VJbnQzMiBpID0gMDsKLQotICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQmxhY2tCb3JkZXJzKSB7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRwbGFuZVswXS5wYWNfZGF0YSwgWV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAocE91dHBsYW5lWzBdLnVfaGVpZ2h0KnBPdXRwbGFuZVswXS51X3N0cmlkZSkpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0cGxhbmVbMV0ucGFjX2RhdGEsIFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgKHBPdXRwbGFuZVsxXS51X2hlaWdodCpwT3V0cGxhbmVbMV0udV9zdHJpZGUpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcE91dHBsYW5lWzJdLnBhY19kYXRhLCBWX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgIChwT3V0cGxhbmVbMl0udV9oZWlnaHQqcE91dHBsYW5lWzJdLnVfc3RyaWRlKSk7Ci0gICAgfQotCi0gICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tSZXNpemluZykgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSByZXNpemUgZmlsdGVyLgotICAgICAgICAqIEZyb20gdGhlIGludGVybWVkaWF0ZSBmcmFtZSB0byB0aGUgZW5jb2RlciBpbWFnZSBwbGFuZSAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wbGFuZSwgcE91dHBsYW5lKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgIE00VmlGaWxSZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVkgPQotICAgICAgICAgICAgcE91dHBsYW5lWzBdLnBhY19kYXRhICsgcE91dHBsYW5lWzBdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVUgPQotICAgICAgICAgICAgcE91dHBsYW5lWzFdLnBhY19kYXRhICsgcE91dHBsYW5lWzFdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVYgPQotICAgICAgICAgICAgcE91dHBsYW5lWzJdLnBhY19kYXRhICsgcE91dHBsYW5lWzJdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lWSA9IE00T1NBX05VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVUgPSBNNE9TQV9OVUxMOwotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVWID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKiBUbyBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0gICAgICAgIC8qIEluaXRpYWxpemUgQUlSIFBhcmFtcyovCi0gICAgICAgIGFpclBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAwOwotICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwSW5wbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcElucGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBPdXRwbGFuZS0+dV93aWR0aDsKLSAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBPdXRwbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIGFpclBhcmFtcy5tX2JPdXRwdXRTdHJpcGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotCi0gICAgICAgIC8qKgotICAgICAgICBNZWRpYSByZW5kZXJpbmc6IEJsYWNrIGJvcmRlcnMqLwotICAgICAgICBpZiAocmVuZGVyaW5nTW9kZSA9PSBNNHhWU1Nfa0JsYWNrQm9yZGVycykgewotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gcE91dHBsYW5lWzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gcE91dHBsYW5lWzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSA9IHBPdXRwbGFuZVswXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBwT3V0cGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSBwT3V0cGxhbmVbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlID0gcE91dHBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IHBPdXRwbGFuZVsyXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IHBPdXRwbGFuZVsyXS51X2hlaWdodDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUgPSBwT3V0cGxhbmVbMl0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBbGxvY2F0ZXMgcGxhbiBpbiBsb2NhbCBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJwSW1hZ2VQbGFuZVRlbXAgWSIpIDsKLSAgICAgICAgICAgIGlmIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogQWxsb2MgRXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikicEltYWdlUGxhbmVUZW1wIFUiKSA7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IEFsbG9jIEVycm9yIik7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikicEltYWdlUGxhbmVUZW1wIFYiKSA7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IEFsbG9jIEVycm9yIik7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBmcmVlKHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEluUGxhbmVZID0gcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA7Ci0gICAgICAgICAgICBwSW5QbGFuZVUgPSBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhIDsKLSAgICAgICAgICAgIHBJblBsYW5lViA9IHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhLCBZX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhLCBVX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhLCBWX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlKSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQgPQotICAgICAgICAgICAgICAgIChwSW5wbGFuZS0+dV9oZWlnaHQgKiBwT3V0cGxhbmUtPnVfd2lkdGgpIC9wSW5wbGFuZS0+dV93aWR0aDsKLQotICAgICAgICAgICAgaWYgKGhlaWdodCA8PSBwT3V0cGxhbmUtPnVfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIHRoZSBib3R0b20gc2lkZSAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBPdXRwbGFuZS0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIE51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wICovCi0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkgKgotICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpICoKLSAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpICoKLSAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwT3V0cGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwSW5wbGFuZS0+dV93aWR0aCAqIHBPdXRwbGFuZS0+dV9oZWlnaHQpL3BJbnBsYW5lLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoIC0KLSAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4gKi8KLSAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPQotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodD4+MSk8PDE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50ICovCi0gICAgICAgICAgICBpZiAoYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09Ci0gICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkgewotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpIHsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBsYW5lVGVtcCA9IHBJbWFnZVBsYW5lc1RlbXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTWVkaWEgcmVuZGVyaW5nOiBDcm9wcGluZyovCi0gICAgICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQ3JvcHBpbmcpIHsKLSAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwT3V0cGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcE91dHBsYW5lLT51X3dpZHRoOwotICAgICAgICAgICAgaWYgKChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA8Ci0gICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAvKiBIZWlnaHQgd2lsbCBiZSBjcm9wcGVkICovCi0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgKgotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikoKHBJbnBsYW5lLT51X2hlaWdodCAtCi0gICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKT4+MSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIFdpZHRoIHdpbGwgYmUgY3JvcHBlZCAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKSgocElucGxhbmUtPnVfd2lkdGggLQotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKT4+MSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGxhbmVUZW1wID0gcE91dHBsYW5lOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9haXJfY29udGV4dCkgewotICAgICAgICAgICAgZXJyID0gTTRBSVJfY3JlYXRlKCZwQy0+bV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgICAgICBNNEFJUl9jcmVhdGUgcmV0dXJuZWQgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKHBDLT5tX2Fpcl9jb250ZXh0LCAmYWlyUGFyYW1zKTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gY29uZmlndXJpbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfZ2V0KHBDLT5tX2Fpcl9jb250ZXh0LCBwSW5wbGFuZSwgcFBsYW5lVGVtcCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IFwKLSAgICAgICAgICAgICAgICBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpIHsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPHBPdXRwbGFuZVswXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lWSwgKHZvaWQgKilwSW5QbGFuZVksCi0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0cGxhbmVbMF0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgcEluUGxhbmVZICs9IHBPdXRwbGFuZVswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHBPdXRQbGFuZVkgKz0gcE91dHBsYW5lWzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpPTA7IGk8cE91dHBsYW5lWzFdLnVfaGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVVLCAodm9pZCAqKXBJblBsYW5lVSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwbGFuZVsxXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBwSW5QbGFuZVUgKz0gcE91dHBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcE91dFBsYW5lVSArPSBwT3V0cGxhbmVbMV0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxwT3V0cGxhbmVbMl0udV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVYsICh2b2lkICopcEluUGxhbmVWLAotICAgICAgICAgICAgICAgICAgICAgICAgcE91dHBsYW5lWzJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIHBJblBsYW5lViArPSBwT3V0cGxhbmVbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwT3V0UGxhbmVWICs9IHBPdXRwbGFuZVsyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLWNsZWFuVXA6Ci0gICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpIHsKLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODggKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqIHBDbGlwQ3R4dCkgewotCi0gICAgTTRPU0FfRVJSIGVycj0gTTROT19FUlJPUjsKLQotICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgWVVWIHBsYW5lCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXYgPQotICAgICAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAoTTRPU0FfQ2hhciopInBQbGFuZVl1diIpOwotCi0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2ID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNIZWlnaHQ7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljV2lkdGg7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV9zdHJpZGUgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSA9Ci0gICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ICogcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCAqIDEuNSwKLSAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X2hlaWdodCA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ID4+MTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3dpZHRoID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnVfc3RyaWRlID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV93aWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKAotICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSArCi0gICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGgpOwotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV9oZWlnaHQgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV93aWR0aCA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGggPj4gMTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsyXS51X3N0cmlkZSA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzJdLnVfd2lkdGg7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0ucGFjX2RhdGEgKwotICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV9oZWlnaHQgKiBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3dpZHRoKTsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwICgKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnBGaWxlLAotICAgICAgICBwQy0+cE9zYUZpbGVSZWFkUHRyLAotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1diwKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNXaWR0aCwKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNIZWlnaHQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBZVVYgZGF0YSB0byB0aGUgZGVjb2RlciB1c2luZyBzZXRvcHRpb24KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uICgKLSAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0RlY1l1dkRhdGEsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhID0gTTRPU0FfVFJVRTsKLQotICAgIC8vIEFsbG9jYXRlIFl1diBwbGFuZSB3aXRoIGVmZmVjdAotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCA9Ci0gICAgIChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIqKSJwUGxhbmVZdXZXaXRoRWZmZWN0Iik7Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA9IHBDLT5ld2MudWlWaWRlb0hlaWdodDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA9IHBDLT5ld2MudWlWaWRlb1dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3N0cmlkZSA9IHBDLT5ld2MudWlWaWRlb1dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3RvcGxlZnQgPSAwOwotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhID0KLSAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ICogcEMtPmV3Yy51aVZpZGVvV2lkdGggKiAxLjUsCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImltYWdlQ2xpcCBZVVYgZGF0YSIpOwotICAgIGlmIChwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0KTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X2hlaWdodCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzFdLnVfd2lkdGggPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3N0cmlkZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICsKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3dpZHRoKTsKLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X2hlaWdodCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzJdLnVfd2lkdGggPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3N0cmlkZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzFdLnBhY19kYXRhICsKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3dpZHRoKTsKLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Q29udGlndW91cywKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0KE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfTWVkaWFUaW1lIHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiSXNDbGlwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50OCBudW1FZmZlY3RzID0gMDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcERlY29kZXJSZW5kZXJGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIHl1dkZyYW1lV2lkdGggPSAwLCB5dXZGcmFtZUhlaWdodCA9IDA7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBUbXAgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBUZW1wWzNdOwotICAgIE00T1NBX1VJbnQ4IGkgPSAwOwotICAgIE00T1NBX0Jvb2wgYlNraXBGcmFtaW5nRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcCwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLSAgICAvKiBSZXNpemUgb3Igcm90YXRlIGNhc2UgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIElmIHdlIGRvIG1vZGlmeSB0aGUgaW1hZ2UsIHdlIG5lZWQgYW4gaW50ZXJtZWRpYXRlIGltYWdlIHBsYW5lICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgIChwQy0+bmJBY3RpdmVFZmZlY3RzID09IDApICYmCi0gICAgICAgICAgICAocENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID09IE00T1NBX0ZBTFNFKSkgewotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0VuYWJsZVl1dldpdGhFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIHsKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0LCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfRW5hYmxlWXV2V2l0aEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfRkFMU0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSAhPQotICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgaWYgKDAgIT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2F2ZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHVuLXJvdGF0ZWQgZnJhbWUKLSAgICAgICAgICAgICAgICB5dXZGcmFtZVdpZHRoID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHl1dkZyYW1lSGVpZ2h0ID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Um90YXRlVmlkZW8ocENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVZpZGVvKCkgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogU2V0IHRoZSBuZXcgdmlkZW8gc2l6ZSBmb3IgdGVtcG9yYXJ5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIG51bUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHMxOwotICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBudW1FZmZlY3RzID4gMCkgewotICAgICAgICAgICAgcENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIC8qIElmIHZpZGVvIGZyYW1lIG5lZWQgdG8gYmUgcmVzaXplZCBvciByb3RhdGVkLAotICAgICAgICAgICAgICogdGhlbiBhcHBseSB0aGUgb3ZlcmxheSBhZnRlciB0aGUgZnJhbWUgd2FzIHJlbmRlcmVkIHdpdGggcmVuZGVyaW5nIG1vZGUuCi0gICAgICAgICAgICAgKiBIZXJlIHNraXAgdGhlIGZyYW1pbmcob3ZlcmxheSkgZWZmZWN0IHdoZW4gYXBwbHlpbmcgdmlkZW8gRWZmZWN0LiAqLwotICAgICAgICAgICAgYlNraXBGcmFtaW5nRWZmZWN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsIHBSZXNpemVQbGFuZSwgYlNraXBGcmFtaW5nRWZmZWN0KTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KCkgZXJyIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lPSBwUmVzaXplUGxhbmU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZTsKLSAgICAgICAgfQotICAgICAgICAvKiBEbyByZW5kZXJpbmcgbW9kZSAqLwotICAgICAgICBpZiAoKHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9PSBNNE9TQV9UUlVFKSB8fAotICAgICAgICAgICAgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSAhPQotICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpIHsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3dpZHRoLCBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcEMtPnl1djE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUgKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnhWU1MuTWVkaWFSZW5kZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLHBUbXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfd2lkdGgsIHBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBUZW1wOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZSAocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+eFZTUy5NZWRpYVJlbmRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUscFRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFRlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBBcHBseSBvdmVybGF5IGlmIG92ZXJsYXkgZXhpc3QqLwotICAgICAgICAgICAgaWYgKGJJc0NsaXAxID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwgcEMtPnl1djEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPmxhc3REZWNvZGVkUGxhbmUgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsIHBDLT55dXYyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkpIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAocFRlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmxhc3REZWNvZGVkUGxhbmUgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZnJlZSB0aGUgdGVtcCBidWZmZXIKLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocFRlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAocEMtPm5iQWN0aXZlRWZmZWN0cyA9PSAwKSAmJgotICAgICAgICAgICAgIChwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkpIHsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+eXV2MSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91cywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcEMtPnl1djIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCBkZWNvZGVyIHNldE9wdGlvbiBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9IE00T1NBX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzZXQgb3JpZ2luYWwgd2lkdGggYW5kIGhlaWdodCBmb3IgcmVzaXplIGZyYW1lIHBsYW5lCi0gICAgICAgIGlmICgwICE9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcyAmJgotICAgICAgICAgICAgMTgwICE9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcykgewotCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50U2V0WVVWNDIwUGxhbmUocENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZGcmFtZVdpZHRoLCB5dXZGcmFtZUhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIE5vIHJvdGF0ZSBvciBubyByZXNpemUgY2FzZSovCi0gICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICBudW1FZmZlY3RzID0gcEMtPm5iQWN0aXZlRWZmZWN0czsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG51bUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgJnRzLCBwUGxhbmVOb1Jlc2l6ZSwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBSZW5kZXIgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiU2tpcEZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywgcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnl1djEsIGJTa2lwRnJhbWluZ0VmZmVjdCk7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywgcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnl1djIsIGJTa2lwRnJhbWluZ0VmZmVjdCk7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0IGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwVG1wID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgJnRzLCBwVG1wLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIFJlbmRlciByZXR1cm5zIGVycm9yIDB4JXgsIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKLSAgICAgICAgfQotICAgICAgICBwQ2xpcEN0eHQtPmlWaWRlb1JlbmRlckN0cyA9IChNNE9TQV9JbnQzMil0czsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHJvdGF0aW9uRGVncmVlKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBvdXRQbGFuZVszXTsKLQotICAgIGlmIChyb3RhdGlvbkRlZ3JlZSAhPSAxODApIHsKLSAgICAgICAgLy8gU3dhcCB3aWR0aCBhbmQgaGVpZ2h0IG9mIGluIHBsYW5lCi0gICAgICAgIG91dFBsYW5lWzBdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodDsKLSAgICAgICAgb3V0UGxhbmVbMF0udV9oZWlnaHQgPSBwUGxhbmVJblswXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVswXS51X3N0cmlkZSA9IG91dFBsYW5lWzBdLnVfd2lkdGg7Ci0gICAgICAgIG91dFBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIG91dFBsYW5lWzBdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgKG91dFBsYW5lWzBdLnVfc3RyaWRlKm91dFBsYW5lWzBdLnVfaGVpZ2h0KSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIm91dCBZIHBsYW5lIGZvciByb3RhdGlvbiIpKTsKLSAgICAgICAgaWYgKG91dFBsYW5lWzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIG91dFBsYW5lWzFdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodC8yOwotICAgICAgICBvdXRQbGFuZVsxXS51X2hlaWdodCA9IHBQbGFuZUluWzBdLnVfd2lkdGgvMjsKLSAgICAgICAgb3V0UGxhbmVbMV0udV9zdHJpZGUgPSBvdXRQbGFuZVsxXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBvdXRQbGFuZVsxXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIChvdXRQbGFuZVsxXS51X3N0cmlkZSpvdXRQbGFuZVsxXS51X2hlaWdodCksIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciopKCJvdXQgVSBwbGFuZSBmb3Igcm90YXRpb24iKSk7Ci0gICAgICAgIGlmIChvdXRQbGFuZVsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKCh2b2lkICopb3V0UGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0UGxhbmVbMl0udV93aWR0aCA9IHBQbGFuZUluWzBdLnVfaGVpZ2h0LzI7Ci0gICAgICAgIG91dFBsYW5lWzJdLnVfaGVpZ2h0ID0gcFBsYW5lSW5bMF0udV93aWR0aC8yOwotICAgICAgICBvdXRQbGFuZVsyXS51X3N0cmlkZSA9IG91dFBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgICAgIG91dFBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIG91dFBsYW5lWzJdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgKG91dFBsYW5lWzJdLnVfc3RyaWRlKm91dFBsYW5lWzJdLnVfaGVpZ2h0KSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIm91dCBWIHBsYW5lIGZvciByb3RhdGlvbiIpKTsKLSAgICAgICAgaWYgKG91dFBsYW5lWzJdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUoKHZvaWQgKilvdXRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKCh2b2lkICopb3V0UGxhbmVbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoKHJvdGF0aW9uRGVncmVlKSB7Ci0gICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICBNNFZJRklfUm90YXRlOTBSaWdodFlVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBQbGFuZUluLCBvdXRQbGFuZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgIC8vIEluIHBsYW5lIHJvdGF0aW9uLCBzbyBwbGFuZU91dCA9IHBsYW5lSW4KLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGUxODBZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwUGxhbmVJbiwgcFBsYW5lSW4pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyNzA6Ci0gICAgICAgICAgICBNNFZJRklfUm90YXRlOTBMZWZ0WVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcFBsYW5lSW4sIG91dFBsYW5lKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiaW52YWxpZCByb3RhdGlvbiBwYXJhbSAlZCIsIChpbnQpcm90YXRpb25EZWdyZWUpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHJvdGF0aW9uRGVncmVlICE9IDE4MCkgewotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVJblswXS5wYWNfZGF0YSwgMCwKLSAgICAgICAgICAgIChwUGxhbmVJblswXS51X3dpZHRoKnBQbGFuZUluWzBdLnVfaGVpZ2h0KSk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZUluWzFdLnBhY19kYXRhLCAwLAotICAgICAgICAgICAgKHBQbGFuZUluWzFdLnVfd2lkdGgqcFBsYW5lSW5bMV0udV9oZWlnaHQpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lSW5bMl0ucGFjX2RhdGEsIDAsCi0gICAgICAgICAgICAocFBsYW5lSW5bMl0udV93aWR0aCpwUGxhbmVJblsyXS51X2hlaWdodCkpOwotICAgICAgICAvLyBDb3B5IFksIFUgYW5kIFYgcGxhbmVzCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZUluWzBdLnBhY19kYXRhLCAodm9pZCAqKW91dFBsYW5lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgKHBQbGFuZUluWzBdLnVfd2lkdGgqcFBsYW5lSW5bMF0udV9oZWlnaHQpKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lSW5bMV0ucGFjX2RhdGEsICh2b2lkICopb3V0UGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAocFBsYW5lSW5bMV0udV93aWR0aCpwUGxhbmVJblsxXS51X2hlaWdodCkpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVJblsyXS5wYWNfZGF0YSwgKHZvaWQgKilvdXRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgIChwUGxhbmVJblsyXS51X3dpZHRoKnBQbGFuZUluWzJdLnVfaGVpZ2h0KSk7Ci0KLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzJdLnBhY19kYXRhKTsKLQotICAgICAgICAvLyBTd2FwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbiBwbGFuZQotICAgICAgICB1aW50MzJfdCB0ZW1wID0gMDsKLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzBdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzBdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMF0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblswXS51X3N0cmlkZSA9IHBQbGFuZUluWzBdLnVfd2lkdGg7Ci0KLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzFdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzFdLnVfd2lkdGggPSBwUGxhbmVJblsxXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMV0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblsxXS51X3N0cmlkZSA9IHBQbGFuZUluWzFdLnVfd2lkdGg7Ci0KLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzJdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzJdLnVfd2lkdGggPSBwUGxhbmVJblsyXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMl0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblsyXS51X3N0cmlkZSA9IHBQbGFuZUluWzJdLnVfd2lkdGg7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmIChwbGFuZUluID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5VTEwgaW4gcGxhbmUsIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcGxhbmVJblswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcGxhbmVJblswXS51X2hlaWdodCA9IGhlaWdodDsKLSAgICBwbGFuZUluWzBdLnVfc3RyaWRlID0gcGxhbmVJblswXS51X3dpZHRoOwotCi0gICAgcGxhbmVJblsxXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZUluWzFdLnVfaGVpZ2h0ID0gaGVpZ2h0LzI7Ci0gICAgcGxhbmVJblsxXS51X3N0cmlkZSA9IHBsYW5lSW5bMV0udV93aWR0aDsKLQotICAgIHBsYW5lSW5bMl0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVJblsyXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lSW5bMl0udV9zdHJpZGUgPSBwbGFuZUluWzFdLnVfd2lkdGg7Ci0KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMzBmNzA1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwotICogQGJyaWVmICAgIE1lZGlhIHJlYWRlcnMgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBzdWJzY3JpcHRpb24gb2Ygc3VwcG9ydGVkIG1lZGlhCi0gKiAgICAgICAgICAgIHJlYWRlcnMgYW5kIGRlY29kZXJzIGZvciB0aGUgVlNTLiBQb3RlbnRpYWwgc3VwcG9ydCBjYW4KLSAqICAgICAgICAgICAgYmUgYWN0aXZhdGVkIG9yIGRlLWFjdGl2YXRlZAotICogICAgICAgICAgICB1c2luZyBjb21waWxhdGlvbiBmbGFncyBzZXQgaW4gdGhlIHByb2plY3RzIHNldHRpbmdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiICAgICAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgVlNTIHNwZWNpZmljIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiICAgICAgICAgICAgLyoqPCBSZWdpc3RyYXRpb24gbW9kdWxlICovCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICByZWFkZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLS8qIFJlYWRlciByZWdpc3RyYXRpb24gOiBhdCBsZWFzdCBvbmUgcmVhZGVyIG11c3QgYmUgZGVmaW5lZCAqLwotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00KLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19OVUxMCi0jZXJyb3IgIm5vIHJlYWRlciByZWdpc3RlcmVkIgotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTSAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMyAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAqLwotCi0vKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBNUEVHNCBkZWNvZGVyICovCi0jaWYgIWRlZmluZWQoTTRWU1NfU1VQUE9SVF9WSURFQ18zR1ApICYmICFkZWZpbmVkKE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUykKLSNlcnJvciAiV2FpdCwgd2hhdD8iCi0vKiAiSGV5LCB0aGlzIGlzIHRoZSBWU1MzR1BQIHNwZWFraW5nLiBQcmF5IHRlbGwsIGhvdyB0aGUgaGVjayBkbyB5b3UgZXhwZWN0IG1lIHRvIGJlIGFibGUgdG8gZG8KLWFueSBlZGl0aW5nIHdpdGhvdXQgYSBidWlsdC1pbiB2aWRlbyBkZWNvZGVyLCBub3IgdGhlIHBvc3NpYmlsaXR5IHRvIHJlY2VpdmUgYW4gZXh0ZXJuYWwgb25lPyEKLVNlcmlvdXNseSwgSSdkIGxvdmUgdG8ga25vdy4iICovCi0jZW5kaWYKLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCByZWFkZXIgdG8gc3Vic2NyaWJlICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3IzZ3BSZWFkZXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUgotI2luY2x1ZGUgIk00UkVBREVSX0Ftci5oIgotI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JNcDNSZWFkZXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTQotI2luY2x1ZGUgIk00UkVBREVSX1BjbS5oIgotI2VuZGlmCi0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgYXVkaW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmgiCi0jaW5jbHVkZSAiTTRERUNPREVSX051bGwuaCIKLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX05VTEwKLSNpbmNsdWRlICJNNEFEX051bGwuaCIKLSNlbmRpZgotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKiBXcml0ZXIgcmVnaXN0cmF0aW9uIDogYXQgbGVhc3Qgb25lIHdyaXRlciBtdXN0IGJlIGRlZmluZWQgKi8KLS8vI2lmbmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotI2Vycm9yICJubyB3cml0ZXIgcmVnaXN0ZXJlZCIKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICovCi0vLyNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIgKi8KLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCB3cml0ZXIgdG8gc3Vic2NyaWJlICovCi0vLyNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIKLS8qZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl9BTVJfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi1NNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi1NNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ki8KLS8vI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHZpZGVvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaCIKLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICBhdWRpbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotCi0jZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKVwKLSAgICByZXR1cm4gKChNNE9TQV9FUlIpKHJldHZhbCkpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfU3Vic2NyaWJlTWVkaWFBbmRDb2RlYygpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICBpbiB0aGUgVlNTLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNFJFQURFUl9NZWRpYVR5cGUgICAgICAgICAgcmVhZGVyTWVkaWFUeXBlOwotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICAgICBwUmVhZGVyRGF0YUludGVyZmFjZTsKLQotICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlICAgICB3cml0ZXJNZWRpYVR5cGU7Ci0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgIHBXcml0ZXJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgIHBXcml0ZXJEYXRhSW50ZXJmYWNlOwotCi0gICAgTTRBRF9UeXBlICAgICAgICAgICAgICAgICAgIGF1ZGlvRGVjb2RlclR5cGU7Ci0gICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0ICAgICAgIGF1ZGlvQ29kZWNUeXBlOwotICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSogcEF1ZGlvQ29kZWNJbnRlcmZhY2U7Ci0gICAgTTRBRF9JbnRlcmZhY2UqICAgICAgICAgICAgIHBBdWRpb0RlY29kZXJJbnRlcmZhY2U7Ci0KLSAgICBNNERFQ09ERVJfVmlkZW9UeXBlICAgICAgICAgdmlkZW9EZWNvZGVyVHlwZTsKLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICAgICAgdmlkZW9Db2RlY1R5cGU7Ci0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogIHBWaWRlb0NvZGVjSW50ZXJmYWNlOwotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICBwVmlkZW9EZWNvZGVySW50ZXJmYWNlOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCk7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICByZWFkZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIDNHUCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUAotICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSggJnJlYWRlck1lZGlhVHlwZSwgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl8zR1AgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciAzR1AgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQICovCi0KLSAgICAvKiAtLS0gQU1SIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0gICAgZXJyID0gTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoICZyZWFkZXJNZWRpYVR5cGUsICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBBTVIgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SICovCi0KLSAgICAvKiAtLS0gTVAzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlKCAmcmVhZGVyTWVkaWFUeXBlLCAmcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX01QMyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIE1QMyByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgKi8KLQotICAgIC8qIC0tLSBQQ00gLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00KLSAgICBlcnIgPSBNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlcyggJnJlYWRlck1lZGlhVHlwZSwgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTSBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIFBDTSByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00gKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0ICYgSDI2MyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERUNfM0dQCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KCZ2aWRlb0RlY29kZXJUeXBlLCAoTTRPU0FfVm9pZCAqKSZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX01QRUc0IGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlciggcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsIHBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgTVBFRzQgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfVklERUNfM0dQICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1ZJREVPX0FWQwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9IMjY0KCZ2aWRlb0RlY29kZXJUeXBlLCAoTTRPU0FfVm9pZCAqKSZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX0gyNjQgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCBwQ29udGV4dCwgdmlkZW9EZWNvZGVyVHlwZSwgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBIMjY0IGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUCAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFQ19OVUxMCi0gICAgZXJyID0gTTRERUNPREVSX05VTExfZ2V0SW50ZXJmYWNlKAotICAgICAgICAgICAgICAmdmlkZW9EZWNvZGVyVHlwZSwgJnBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWRCBOVUxMIERlY29kZXIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgICBwQ29udGV4dCwgdmlkZW9EZWNvZGVyVHlwZSwgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBcCi0gICAgICAgIGNhbid0IHJlZ2lzdGVyIHZpZGVvIE5VTEwgZGVjb2RlciIpOwotI2VuZGlmCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICBhdWRpbyBkZWNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gQU1STkIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKCZhdWRpb0RlY29kZXJUeXBlLCAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00IEFNUk5CIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQU1STkIgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfQU1STkIgKi8KLQotICAgIC8qIC0tLSBBQUMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX0FBQwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoJmF1ZGlvRGVjb2RlclR5cGUsICZwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTQgQUFDIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQUFDIGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX0FBQyAqLwotCi0gICAgLyogLS0tIE1QMyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QMygmYXVkaW9EZWNvZGVyVHlwZSwgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNCBNUDMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKCBwQ29udGV4dCwgYXVkaW9EZWNvZGVyVHlwZSwgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBNUDMgZGVjb2RlciIpOwotI2VuZGlmICAvKiBNNFZTU19TVVBQT1JUX0FVREVDX01QMyAqLwotCi0KLSAgICAvKiAtLS0gTlVMTCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTAotICAgIGVyciA9IE00QURfTlVMTF9nZXRJbnRlcmZhY2UoICZhdWRpb0RlY29kZXJUeXBlLCAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUQgTlVMTCBEZWNvZGVyIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgRVZSQyBkZWNvZGVyIik7Ci0jZW5kaWYgIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAqLwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotCi0gICAgLyogLS0tIDNHUFAgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQCi0gICAgLyogcmV0cmlldmVzIHRoZSAzR1BQIHdyaXRlciBtZWRpYSB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoICZ3cml0ZXJNZWRpYVR5cGUsICZwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAmcFdyaXRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFdSSVRFUl8zR1AgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCBwQ29udGV4dCwgd3JpdGVyTWVkaWFUeXBlLCBwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciAzR1BQIHdyaXRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAgKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZW5jb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0IC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgLyogcmV0cmlldmVzIHRoZSBNUEVHNCBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9NUEVHNCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIHBDb250ZXh0LCB2aWRlb0NvZGVjVHlwZSwgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gTVBFRzQgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNCAqLwotCi0gICAgLyogLS0tIEgyNjMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9IMjYzIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLCBwVmlkZW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciB2aWRlbyBIMjYzIGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjQgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBNNEgyNjRFIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLCBwVmlkZW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciB2aWRlbyBIMjY0IGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDICovCi0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIGF1ZGlvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSBBTVIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQU1SCi0gICAgLyogcmV0cmlldmVzIHRoZSBBTVIgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKCZhdWRpb0NvZGVjVHlwZSwgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBTVIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFNUiBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUiAqLwotCi0gICAgLyogLS0tIEFBQyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEFBQyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKCZhdWRpb0NvZGVjVHlwZSwgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBQUMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFBQyBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FBQyAqLwotCi0gICAgLyogLS0tIEVWUkMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfRVZSQwotICAgIC8qIHJldHJpZXZlcyB0aGUgRVZSQyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBNNEVWUkNfZ2V0SW50ZXJmYWNlcyggJmF1ZGlvQ29kZWNUeXBlLCAmcEF1ZGlvQ29kZWNJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEVWUkMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEVWUkMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9FVlJDICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICBwQ29udGV4dC0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlID0gTTRPU0FfVFJVRTsgICAvKiB3aGVuIE5YUCBTVyBjb2RlY3MgYXJlIHJlZ2lzdGVyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGFsbG93IHVucmVnaXN0cmF0aW9uKi8KLSNlbmRpZgotCi0KLSAgICByZXR1cm4gZXJyOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19BUEkuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX0FQSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZjU0MTBiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTR4VlNTX0FQSS5jCi0gKiBAYnJpZWYgICAgQVBJIG9mIGVYdGVuZGVkIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIChWaWRlbyBTdHVkaW8gMi4xKQotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqIE9TQUwgbWFpbiB0eXBlcyBhbmQgZXJyb3JzICoqKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0vLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oIgotCi0vKioKLSAqIFZTUyAzR1BQIEFQSSBkZWZpbml0aW9uICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioKLUJlZ2luIG9mIHhWU1MgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0jaW5jbHVkZSAiTTR4VlNTX0ludGVybmFsLmgiCi0KLS8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX0luaXQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00eFZTU19Jbml0UGFyYW1zKiBwUGFyYW1zKQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSB4VlNTCi0gKiBAbm90ZSAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIHhWU1MgZWRpdCBvcGVyYXRpb24gKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwYXJhbXMgICAgICAgICAgICAgICAgKElOKSBQYXJhbWV0ZXJzIG1hbmRhdG9yeSBmb3IgeFZTUwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNHhWU1NfSW5pdCggTTRPU0FfQ29udGV4dCAqcENvbnRleHQsIE00eFZTU19Jbml0UGFyYW1zICpwUGFyYW1zICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwLCBpOwotCi0gICAgaWYoIHBQYXJhbXMgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUGFyYW1ldGVyIHN0cnVjdHVyZSBmb3IgTTR4VlNTX0luaXQgZnVuY3Rpb24gaXMgTlVMTCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBwUGFyYW1zLT5wRmlsZVJlYWRQdHIgPT0gTTRPU0FfTlVMTAotICAgICAgICB8fCBwUGFyYW1zLT5wRmlsZVdyaXRlUHRyID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAicEZpbGVSZWFkUHRyIG9yIHBGaWxlV3JpdGVQdHIgaW4gTTR4VlNTX0luaXRQYXJhbXMgc3RydWN0dXJlIGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19Db250ZXh0KSwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgeFZTUyBsYXllciIpOwotCi0gICAgaWYoIHhWU1NfY29udGV4dCA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19Jbml0Iik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIGZpbGUgcmVhZC93cml0ZSBmdW5jdGlvbnMgcG9pbnRlcnMgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciA9IHBQYXJhbXMtPnBGaWxlUmVhZFB0cjsKLSAgICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIgPSBwUGFyYW1zLT5wRmlsZVdyaXRlUHRyOwotCi0gICAgLypVVEYgQ29udmVyc2lvbiBzdXBwb3J0OiBjb3B5IGNvbnZlcnNpb24gZnVuY3Rpb25zIHBvaW50ZXJzIGFuZCBhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5Ci0gICAgIGJ1ZmZlciovCi0gICAgaWYoIHBQYXJhbXMtPnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBpZiggcFBhcmFtcy0+cENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCA9Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cENvbnZGcm9tVVRGOEZjdDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgPQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBDb252VG9VVEY4RmN0OwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSA9Ci0gICAgICAgICAgICAgICAgVVRGX0NPTlZFUlNJT05fQlVGRkVSX1NJWkU7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoVVRGX0NPTlZFUlNJT05fQlVGRkVSX1NJWkUKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50OCksCi0gICAgICAgICAgICAgICAgTTRWQSwgKE00T1NBX0NoYXIgKikiTTR4VlNTX0luaXQ6IFVURiBjb252ZXJzaW9uIGJ1ZmZlciIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX0luaXQ6IG9uZSBVVEYgY29udmVyc2lvbiBwb2ludGVyIGlzIG51bGwgYW5kIHRoZSBvdGhlclwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBudWxsIik7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplID0gMDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgPQotICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggcFBhcmFtcy0+cFRlbXBQYXRoICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgLypObyBuZWVkIHRvIGNvbnZlcnQgaW50byBVVEY4IGFzIGFsbCBpbnB1dCBvZiB4VlNTIGFyZSBpbiBVVEY4Ci0gICAgICAgICh0aGUgY29udmVyc2lvbiBjdXN0b21lciBmb3JtYXQgaW50byBVVEY4Ci0gICAgICAgIGlzIGRvbmUgaW4gVkEvVkFMKSovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwUGFyYW1zLT5wVGVtcFBhdGgpICsgMSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgUGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGVzIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCAodm9pZCAqKXBQYXJhbXMtPnBUZW1wUGF0aCwKLSAgICAgICAgICAgIHN0cmxlbihwUGFyYW1zLT5wVGVtcFBhdGgpICsgMSk7Ci0gICAgICAgIC8qIFRPRE86IENoZWNrIHRoYXQgbm8gcHJldmlvdXMgeFZTUyB0ZW1wb3JhcnkgZmlsZXMgYXJlIHByZXNlbnQgPyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGVzIGlzIE5VTEwiKTsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQpOwotICAgICAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzID0KLSAgICAgICAgKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MpLAotICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb3B5IG9mIFZTUyBzdHJ1Y3R1cmUiKTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19Jbml0Iik7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgcG9pbnRlcnMgaW4gcFNldHRpbmdzICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOyAvKiBSQyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBUaGlzIGlzIHVzZWQgdG8ga25vdyBpZiB0aGUgdXNlciBoYXMgYWRkZWQgb3IgcmVtb3ZlZCBzb21lIG1lZGlhcyAqLwotICAgIHhWU1NfY29udGV4dC0+cHJldmlvdXNDbGlwTnVtYmVyID0gMDsKLQotICAgIC8qICJTdGF0ZSBtYWNoaW5lIiAqLwotICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPSAwOwotICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBJbml0aWFsaXplIFB0bzNHUFAgYW5kIE1DUyBsaXN0cyAqLwotICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9IE00T1NBX05VTEw7Ci0KLSAgICB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXggPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IDA7Ci0KLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotCi0gICAgLypGQjogaW5pdGlhbGl6ZSB0byBhdm9pZCBjcmFzaCB3aGVuIGVycm9yIGR1cmluZyB0aGUgZWRpdGluZyovCi0gICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBJbml0aWFsaXplIHN0YXRlIGlmIGFsbCBpbml0aWFsaXphdGlvbnMgYXJlIGNvcnJlY3RzICovCi0gICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0gTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkOwotCi0gICAgLyogaW5pdGlhbGl6ZSBNQ1MgY29udGV4dCovCi0gICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgKnBDb250ZXh0ID0geFZTU19jb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBnaXZlbiBlZGl0aW5nIHN0cnVjdHVyZSBpbiBvcmRlciB0bwotICogICAgICAgICAgICAgICAgbWluaW1pemUgdGhlIHRyYW5zY29kaW5nIHRpbWUuCi0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgYW5hbHlzZXMgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBpZiBuZWVkZWQsIGNoYW5nZXMgdGhlCi0gKiAgICAgICAgICAgICAgICBvdXRwdXQgcGFyYW1ldGVycyAoVmlkZW8gY29kZWMsIHZpZGVvIHNpemUsIGF1ZGlvIGNvZGVjLAotICogICAgICAgICAgICAgICAgYXVkaW8gbmIgb2YgY2hhbm5lbHMpIHRvIG1pbmltaXplIHRoZSB0cmFuc2NvZGluZyB0aW1lLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAgICAgKElOKSBFZGl0aW9uIHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUoIE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyBmaWxlUHJvcGVydGllczsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX0Jvb2wgYkF1ZGlvVHJhbnNpdGlvbiA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYklzQkdNUmVwbGFjZSA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkZvdW5kOwotICAgIE00T1NBX1VJbnQzMiB2aWRlb0NvbmZpZ1s5XSA9Ci0gICAgewotICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi0gICAgfTsKLSAgICAvKiogSW5kZXggPC0+IFZpZGVvIGNvbmZpZyAqKi8KLSAgICAvKiAwOiAgICAgICAgSDI2MyAgU1FDSUYgICAgICAgICovCi0gICAgLyogMTogICAgICAgIEgyNjMgIFFDSUYgICAgICAgICovCi0gICAgLyogMjogICAgICAgIEgyNjMgIENJRiAgICAgICAgKi8KLSAgICAvKiAzOiAgICAgICAgTVBFRzQgU1FDSUYgICAgICAgICovCi0gICAgLyogNDogICAgICAgIE1QRUc0IFFRVkdBICAgICAgICAqLwotICAgIC8qIDU6ICAgICAgICBNUEVHNCBRQ0lGICAgICAgICAqLwotICAgIC8qIDY6ICAgICAgICBNUEVHNCBRVkdBICAgICAgICAqLwotICAgIC8qIDc6ICAgICAgICBNUEVHNCBDSUYgICAgICAgICovCi0gICAgLyogODogICAgICAgIE1QRUc0IFZHQSAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBNNE9TQV9VSW50MzIgYXVkaW9Db25maWdbM10gPQotICAgIHsKLSAgICAgICAgMCwgMCwgMAotICAgIH07Ci0gICAgLyoqIEluZGV4IDwtPiBBdWRpbyBjb25maWcgKiovCi0gICAgLyogMDogICAgQU1SICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIDE6ICAgIEFBQyAgICAxNmtIeiBtb25vICAgICAgICAqLwotICAgIC8qIDI6ICAgIEFBQyAxNmtIeiBzdGVyZW8gICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgXAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZU9wZW5lZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBudW1iZXIgb2YgY2xpcHMgKi8KLSAgICBpZiggcFNldHRpbmdzLT51aUNsaXBOdW1iZXIgPT0gMCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGhlIG51bWJlciBvZiBpbnB1dCBjbGlwIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgISIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGEgYmFja2dyb3VuZCBtdXNpYywgYW5kIGlmIGl0cyBhdWRpbyB3aWxsIHJlcGxhY2UgaW5wdXQgY2xpcCBhdWRpbyAqLwotICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lID09IDEwMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJJc0JHTVJlcGxhY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogUGFyc2UgYWxsIGNsaXBzLCBhbmQgZ2l2ZSBvY2N1cmVuY2VzIG9mIGVhY2ggY29tYmluYXRpb24gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgLyogV2UgaWdub3JlIEpQRyBpbnB1dCBmaWxlcyBhcyB0aGV5IGFyZSBhbHdheXMgdHJhbnNjb2RlZCAqLwotICAgICAgICBpZiggcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IDA7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmQ29udmVydGVkU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19SZWR1Y2VUcmFuc2NvZGU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFbmQgb2YgdGhlIHV0ZiBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKHhWU1NfY29udGV4dCwgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIC8vZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgIC8vICAgICAmZmlsZVByb3BlcnRpZXMpOwotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlID8gKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDaGVjayBiZXN0IHZpZGVvIHNldHRpbmdzICovCi0gICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDEyOAotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gOTYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbMF0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzNdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDE2MAotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gMTIwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzRdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDE3NgotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gMTQ0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjYzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzFdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1s1XSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAzMjAKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDI0MCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1s2XSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAzNTIKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDI4OCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2MyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1syXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbN10gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVZpZGVvV2lkdGggPT0gNjQwCi0gICAgICAgICAgICAgICAgJiYgZmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9PSA0ODAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbOF0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgQkdNIHRoYXQgcmVwbGFjZXMgZXhpc3RpbmcgYXVkaW8gdHJhY2ssIHdlIGRvIG5vdCBjYXJlIGFib3V0Ci0gICAgICAgICAgICBhdWRpbyB0cmFjayBhcyBpdCB3aWxsIGJlIHJlcGxhY2VkICovCi0gICAgICAgICAgICAvKiBJZiBub3QsIHdlIHRyeSB0byBtaW5pbWl6ZSBhdWRpbyByZWVuY29kaW5nICovCi0gICAgICAgICAgICBpZiggYklzQkdNUmVwbGFjZSA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDE2MDAwICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Db25maWdbMV0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDE2MDAwICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Db25maWdbMl0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhdWRpb0NvbmZpZ1swXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmQgYmVzdCBvdXRwdXQgdmlkZW8gZm9ybWF0ICh0aGUgbW9zdCBvY2N1cmluZyBjb21iaW5hdGlvbikgKi8KLSAgICBqID0gMDsKLSAgICBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgOTsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCB2aWRlb0NvbmZpZ1tpXSA+PSB2aWRlb0NvbmZpZ1tqXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGogPSBpOwotICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBiRm91bmQgKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBqICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tIMjYzOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rU1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa0NJRjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KQotICAgICAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2tNUEVHNCA6IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rU1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rTVBFRzQgOiBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1FRVkdBOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRQ0lGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRVkdBOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rTVBFRzQgOiBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1ZHQTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmQgYmVzdCBvdXRwdXQgYXVkaW8gZm9ybWF0ICh0aGUgbW9zdCBvY2N1cmluZyBjb21iaW5hdGlvbikgKi8KLSAgICBqID0gMDsKLSAgICBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgMzsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBhdWRpb0NvbmZpZ1tpXSA+PSBhdWRpb0NvbmZpZ1tqXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGogPSBpOwotICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBiRm91bmQgKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBqICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rQUFDOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TZW5kQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncykKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnaXZlcyB0byB0aGUgeFZTUyBhbiBlZGl0aW5nIHN0cnVjdHVyZQotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGFuYWx5c2VzIHRoaXMgc3RydWN0dXJlLCBhbmQgcHJlcGFyZSBlZGl0aW9uCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIE00eFZTU19Jbml0LCBhZnRlcgotICogICAgICAgICAgICAgICAgTTR4VlNTX0Nsb3NlQ29tbWFuZCwgb3IgYWZ0ZXIgTTR4VlNTX1ByZXZpZXdTdG9wLgotICogICAgICAgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIHVudGlsCi0gKiAgICAgICAgICAgICAgICBpdCByZXR1cm5zIGFub3RoZXIgZXJyb3IgdGhhbiBNNE5PX0VSUk9SLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgICAgICAgICAoSU4pIEVkaXRpb24gc2V0dGluZ3MgKGFsbG9jYXRlZCBieSB0aGUgdXNlcikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1NlbmRDb21tYW5kKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX1VJbnQ4IG5iT2ZTYW1lQ2xpcCA9IDA7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9Cb29sIGlzTmV3QkdNID0gTTRPU0FfVFJVRTsKLSAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQdG8zR1BQX2xhc3QgPSBNNE9TQV9OVUxMOwotICAgIE00eFZTU19NQ1NfcGFyYW1zICpwTUNTX2xhc3QgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgaGVpZ2h0LCBzYW1wbGluZ0ZyZXE7Ci0gICAgTTRPU0FfQm9vbCBiSXNUcmFuc2NvZGluZyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0ludDMyIHRvdGFsRHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dFNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoID0gMDsKLSAgICBNNE9TQV9JbnQ4IG1hc3RlckNsaXAgPSAtMTsKLQotICAgIGkgPSAwOwotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgXAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZU9wZW5lZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19TZW5kQ29tbWFuZCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIFN0YXRlIGlzIGJhY2sgdG8gaW5pdGlhbGl6ZWQgdG8gYWxsb3cgY2FsbCBvZiBjbGVhbnVwIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQ7Ci0KLSAgICAvKiBDaGVjayBpZiBhIHByZXZpb3VzIHNlbmRDb21tYW5kIGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPnByZXZpb3VzQ2xpcE51bWJlciAhPSAwICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBwQ21wUmVzdWx0ID0gMDsKLQotICAgICAgICAvKiBDb21wYXJlIEJHTSBpbnB1dCAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgXAotICAgICAgICAgICAgJiYgcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0KLSAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIGF1ZGlvIG91dHB1dCBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZCAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9PQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IEJHTSBpcyB0aGUgc2FtZSBhcyBiZWZvcmUsIHNvLCBubyBuZWVkIHRvIHJlZGVjb2RlIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIkJHTSBpcyB0aGUgc2FtZSBhcyBiZWZvcmUsIG5vdGhpbmcgdG8gZGVjb2RlIik7Ci0gICAgICAgICAgICAgICAgICAgIGlzTmV3QkdNID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdW5hbGxvY2F0ZSBQQ00gcHJldmlldyBmaWxlIHBhdGggaW4gaW50ZXJuYWwgY29udGV4dCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdW5hbGxvY2F0ZSBQQ00gcHJldmlldyBmaWxlIHBhdGggaW4gaW50ZXJuYWwgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgb3V0cHV0IHNldHRpbmdzIGhhdmUgY2hhbmdlZCAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWwKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIGl0IGlzIHRoZSBjYXNlLCB3ZSBjYW4ndCByZXVzZSBhbHJlYWR5IHRyYW5zY29kZWQvY29udmVydGVkIGZpbGVzICovCi0gICAgICAgICAgICAvKiBzbywgd2UgZGVsZXRlIHRoZXNlIGZpbGVzIGFuZCByZW1vdmUgdGhlbSBmcm9tIGNoYWluZWQgbGlzdCAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyAqcFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0OwotICAgICAgICAgICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyAqcFBhcmFtc19zYXV2OwotCi0gICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZUluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlVGVtcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0jaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZVRlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfc2F1djsKLSAgICAgICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19iZ20gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBIZXJlLCB3ZSBkbyBub3QgZGVsZXRlIEJHTSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+aXNCR00gIT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVUZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3NhdXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfYmdtID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qUFIgUDRNRTAwMDAzMTgyIGluaXRpYWxpemUgdGhpcyBwb2ludGVyIGJlY2F1c2UgdGhlIGZvbGxvd2luZyBwYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgd2lsbCBiZSBkZWFsbG9jYXRlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcyAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcFBhcmFtcy0+aXNCR00gIT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19iZ20tPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtc19iZ207Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBNYXliZSBuZWVkIHRvIGltcGxlbWVudCBmcmFtZXJhdGUgY2hhbmdpbmcgKi8KLSAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogVW5hbGxvY2F0ZSBwcmV2aW91cyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgTTR4VlNTX2ZyZWVTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyk7Ci0KLSAgICAgICAgLypVbmFsbG9jYXRlIG91dHB1dCBmaWxlIHBhdGgqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gMDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBDbGlwcyByZWdpc3RlcmluZwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBDb3B5IHNldHRpbmdzIGZyb20gdXNlciBnaXZlbiBzdHJ1Y3R1cmUgdG8gb3VyICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vID0gcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgLyp4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlOyovCi0gICAgLypGQjogVkFMIENSIFA0TUUwMDAwMzA3NgotICAgIFRoZSBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIGJpdHJhdGUgYXJlIGdpdmVuIGJ5IHRoZSB1c2VyIGluIHRoZSBlZGl0aW9uIHNldHRpbmdzIHN0cnVjdHVyZSovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5QVFZvbExldmVsID0gcFNldHRpbmdzLT5QVFZvbExldmVsOwotCi0gICAgLypGQjogYnVnIGZpeCBpZiB0aGUgb3V0cHV0IHBhdGggaXMgZ2l2ZW4gaW4gTTR4VlNTX3NlbmRDb21tYW5kKi8KLQotICAgIGlmKCBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgcFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID4gMCApCi0gICAgewotICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlOwotICAgICAgICAvKkFzIGFsbCBpbnB1dHMgb2YgdGhlIHhWU1MgYXJlIGluIFVURjgsIGNvbnZlcnQgdGhlIG91dHB1dCBmaWxlIHBhdGggaW50byB0aGUKLSAgICAgICAgY3VzdG9tZXIgZm9ybWF0Ki8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU2VuZENvbW1hbmQ6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBsZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyBcCi0gICAgICAgICAgICAocFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm91dHB1dCBmaWxlIHBhdGgiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSArIDEpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSAwOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyID0gcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlID0gcFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0KLSAgICAgICAgMDsgLyogV2l0aCBWU1MgMi4wLCB0aGlzIG5ldyBwYXJhbSBpcyBtYW5kYXRvcnkgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdDsgLyogQ1IgdGV4dCBoYW5kbGluZyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplOwotCi0gICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSAhPSAwIFwKLSAgICAgICAgJiYgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ICE9IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19TZW5kQ29tbWFuZDogSW1wb3NzaWJsZSB0byBsaW1pdCBmaWxlXAotICAgICAgICAgICAgICAgICAgICAgICBzaXplIHdpdGggb3RoZXIgYXVkaW8gb3V0cHV0IHRoYW4gQUFDIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwgPSAwOwotICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXAgPSAwOwotCi0gICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ICE9IE00VklERU9FRElUSU5HX2tNUEVHNAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAhPSBNNFZJREVPRURJVElOR19rSDI2MwotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAhPSBNNFZJREVPRURJVElOR19rSDI2NCApCi0gICAgewotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvOwotICAgIH0KLQotICAgIC8qIEdldCBvdXRwdXQgd2lkdGgvaGVpZ2h0ICovCi0gICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICB3aWR0aCA9IDEyODsKLSAgICAgICAgICAgIGhlaWdodCA9IDk2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICB3aWR0aCA9IDE2MDsKLSAgICAgICAgICAgIGhlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICB3aWR0aCA9IDE3NjsKLSAgICAgICAgICAgIGhlaWdodCA9IDE0NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0E6Ci0gICAgICAgICAgICB3aWR0aCA9IDMyMDsKLSAgICAgICAgICAgIGhlaWdodCA9IDI0MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgIHdpZHRoID0gMzUyOwotICAgICAgICAgICAgaGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgd2lkdGggPSA2NDA7Ci0gICAgICAgICAgICBoZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qICtQUiBMVjU4MDcgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgICAgIHdpZHRoID0gODAwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgICAgIHdpZHRoID0gNzIwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiAtUFIgTFY1ODA3ICovCi0gICAgICAgICAgICAvKiArQ1IgR29vZ2xlICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgICAgICB3aWR0aCA9IDY0MDsKLSAgICAgICAgICAgIGhlaWdodCA9IDM2MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0KLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLQotICAgICAgICAgICAgd2lkdGggPSBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aDsKLQotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgICAgICB3aWR0aCA9IDEyODA7Ci0gICAgICAgICAgICBoZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICAgICAgICAgIHdpZHRoID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgaGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIHdpZHRoID0gOTYwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyMF8xMDgwOgotICAgICAgICAgICAgd2lkdGggPSAxOTIwOwotICAgICAgICAgICAgaGVpZ2h0ID0gTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogLUNSIEdvb2dsZSAqLwotICAgICAgICBkZWZhdWx0OiAvKiBJZiBvdXRwdXQgdmlkZW8gc2l6ZSBpcyBub3QgZ2l2ZW4sIHdlIHRha2UgUUNJRiBzaXplICovCi0gICAgICAgICAgICB3aWR0aCA9IDE3NjsKLSAgICAgICAgICAgIGhlaWdodCA9IDE0NDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBHZXQgb3V0cHV0IFNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMTYwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMjA1MF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAyMjA1MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDI0MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMzIwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA0NDEwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDQ4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA4MDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAxNjAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgY2xpcC90cmFuc2l0aW9ucyBpZiBjbGlwIG51bWJlciBpcyBub3QgbnVsbCAuLi4gKi8KLSAgICBpZiggMCA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgKQotICAgIHsKLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPQotICAgICAgICAgICAgKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyBcCi0gICAgICAgICAgICAoc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikqeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MsIGNvcHkgb2YgcENsaXBMaXN0Iik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvKiBTZXQgY2xpcCBsaXN0IHRvIE5VTEwgKi8KLSAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdCwwLAotICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikKLSAgICAgICAgICAgICp4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA+IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0KLSAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqKiApIFwKLSAgICAgICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKikgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICooeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSBcCi0gICAgICAgICAgICAgICAgInhWU1MsIGNvcHkgb2YgcFRyYW5zaXRpb25MaXN0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogU2V0IHRyYW5zaXRpb24gbGlzdCB0byBOVUxMICovCi0gICAgICAgICAgICBtZW1zZXQoCi0gICAgICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0LDAsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKikKLSAgICAgICAgICAgICAgICAqKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBlbHNlLCB0aGVyZSBpcyBhIHBiIGluIHRoZSBpbnB1dCBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gY2xpcCBpbiB0aGlzIHNldHRpbmdzIGxpc3QgISEiKTsKLSAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgIC8qKi8KLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBSQyBBbGxvY2F0ZSBlZmZlY3RzIHNldHRpbmdzICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0cyA9IHBTZXR0aW5ncy0+bmJFZmZlY3RzOwotCi0gICAgaWYoIDAgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+bmJFZmZlY3RzICkKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5uYkVmZmVjdHMgKiBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImVmZmVjdHMgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHMgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvKkZCIGJ1ZyBmaXggMTkuMDMuMjAwODogdGhlc2UgcG9pbnRlcnMgd2VyZSBub3QgaW5pdGlhbGl6ZWQgLT4gY3Jhc2ggd2hlbiBmcmVlKi8KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+bmJFZmZlY3RzOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggPQotICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0KLSAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqLwotICAgIH0KLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnRhcmdldGVkVGltZXNjYWxlID09IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHBUYXJnZXRlZFRpbWVTY2FsZSA9IDA7Ci0KLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGUoeFZTU19jb250ZXh0LCBwU2V0dGluZ3MsCi0gICAgICAgICAgICAmcFRhcmdldGVkVGltZVNjYWxlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgfHwgcFRhcmdldGVkVGltZVNjYWxlID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IHBUYXJnZXRlZFRpbWVTY2FsZTsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRvdGFsIGR1cmF0aW9uIHZhcmlhYmxlICovCi0gICAgdG90YWxEdXJhdGlvbiA9IDA7Ci0KLSAgICAvKiBQYXJzaW5nIGxpc3Qgb2YgY2xpcHMgZ2l2ZW4gYnkgYXBwbGljYXRpb24sIGFuZCBwcmVwYXJlIGFuYWx5emluZyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8qIEFsbG9jYXRlIGN1cnJlbnQgY2xpcCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jIFwKLSAgICAgICAgICAgIChzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyksIE00VlMsIChNNE9TQV9DaGFyICopImNsaXAgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29weSBjbGlwIHNldHRpbmdzIGZyb20gZ2l2ZW4gc3RydWN0dXJlIHRvIG91ciB4VlNTX2NvbnRleHQgc3RydWN0dXJlICovCi0gICAgICAgIGVyciA9Ci0gICAgICAgICAgICBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0sCi0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyByZXR1cm4gZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgIGlmKCBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0KLSAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0sCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZXh0ZXJuYWwgZWZmZWN0IGNvbnRleHQgdG8gTlVMTCwgdG8ga25vdyBpZiBpbnB1dCBqcGcgaGFzIGFscmVhZHkgYmVlbgotICAgICAgICAgICAgZGVjb2RlZCBvciBub3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT5WaWRlb1RyYW5zaXRpb25UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdHJhbnNpdGlvbiB0eXBlIGlzIGFscGhhIG1hZ2ljLCB3ZSBuZWVkIHRvIGRlY29kZSBpbnB1dCBmaWxlICovCi0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYzoKLSAgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgb3VyIGFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSB0byBoYXZlIGEgY29weSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgb25lICovCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIklucHV0IEFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENvcHkgZGF0YSBmcm9tIHRoZSBwcm92aWRlZCBhbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgdG91IG91cgotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MpKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBvdXIgYWxwaGEgbWFnaWMgaW5wdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGggPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RybGVuKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+cEFscGhhRmlsZVBhdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICArIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJBbHBoYSBtYWdpYyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPnBBbHBoYUZpbGVQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENvcHkgZGF0YSBmcm9tIHRoZSBwcm92aWRlZCBhbHBoYSBtYWdpYyBmaWxlbmFtZSB0byBvdXIgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTkNvcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLCBzdHJsZW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoKSArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIGFsbCB0cmFuc2l0aW9uIHRvIGtub3cgaWYgdGhlIGlucHV0IGpwZyBoYXMgYWxyZWFkeSBiZWVuIGRlY29kZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCBpOyBqKysgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtqXS0+VmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLCAoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2pdLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYU1hZ2ljU2V0dGluZ3MtPnBBbHBoYUZpbGVQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFscGhhU2V0dGluZ3M7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgMSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5wUGxhbmUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzICopKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2pdLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSktPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MudHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+YmxlbmRpbmdQZXJjZW50ID4gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+YmxlbmRpbmdQZXJjZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAxMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZGluZ1BlcmNlbnQpICogMjU1IC8gMjAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+YmxlbmRpbmd0aHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MtPmlzcmV2ZXJzZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT5pc3JldmVyc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoYXQgdGhlIGlucHV0IGpwZyBmaWxlIGZvciBhbHBoYSBtYWdpYyBoYXMgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVlbiBkZWNvZGVkIC0+IG5vIG5lZGQgdG8gZGVjb2RlIGl0IGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfQWxwaGFNYWdpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGpwZyBoYXMgbm90IGJlZW4gZGVjb2RlZCB5ZXQgLi4uICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0Ci0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKm91dHB1dFBsYW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyAqYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOiBnZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aF9BUkdCODg4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT53aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHRfQVJHQjg4OCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+aGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUcmFuc2l0aW9uTGlzdE00eFZTU19TZW5kQ29tbWFuZCB3aWR0aCBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhfQVJHQjg4OCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRyYW5zaXRpb25MaXN0TTR4VlNTX1NlbmRDb21tYW5kIGhlaWdodCEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodF9BUkdCODg4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmUgPSAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdXRwdXQgcGxhbmUgZm9yIEFscGhhIG1hZ2ljIHRyYW5zaXRpb24iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG91dHB1dFBsYW5lID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV93aWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV9zdHJpZGUgPSB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCggd2lkdGggKiBoZWlnaHQgKiAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jIGZvciB0aGUgQWxwaGEgbWFnaWMgcGFjX2RhdGEgb3V0cHV0IFlVViIpOwotICAgICAgICAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggb3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShvdXRwdXRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzFdLnVfd2lkdGggPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMV0udV9oZWlnaHQgPSBoZWlnaHQgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS51X3N0cmlkZSA9IHdpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS5wYWNfZGF0YSA9IG91dHB1dFBsYW5lWzBdLnBhY19kYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXRQbGFuZVswXS51X3dpZHRoICogb3V0cHV0UGxhbmVbMF0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsyXS51X3dpZHRoID0gd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzJdLnVfaGVpZ2h0ID0gaGVpZ2h0ID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0udV9zdHJpZGUgPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0ucGFjX2RhdGEgPSBvdXRwdXRQbGFuZVsxXS5wYWNfZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0UGxhbmVbMV0udV93aWR0aCAqIG91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT5wQWxwaGFGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IHBDb252RnJvbVVURjhGY3QgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgRW5kIG9mIHRoZSBjb252ZXJzaW9uLCB1c2UgdGhlIGRlY29kZWQgcGF0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOiBjb252ZXJ0ICsgcmVzaXppbmcgZnJvbSBBUkdCODg4OCB0byB5dXY0MjAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCBvdXRwdXRQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aF9BUkdCODg4LCBoZWlnaHRfQVJHQjg4OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShvdXRwdXRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUob3V0cHV0UGxhbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBkZWNvZGluZyBhbHBoYSBtYWdpYyBKUEVHOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhbHBoYSBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopIkFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSAyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MtPnBQbGFuZSA9IG91dHB1dFBsYW5lOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50ID4gMCAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZGluZ1BlcmNlbnQgPD0gMTAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50KSAqIDI1NSAvIDIwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5pc3JldmVyc2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzcmV2ZXJzZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGFscGhhU2V0dGluZ3MtPmJsZW5kaW5ndGhyZXNob2xkID09IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPSBNNHhWU1NfQWxwaGFNYWdpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfU2xpZGVUcmFuc2l0aW9uOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgKnNsaWRlU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZVNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKikiSW50ZXJuYWwgc2xpZGUgdHJhbnNpdGlvbiBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBzbGlkZVNldHRpbmdzICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBKdXN0IGNvcHkgdGhlIGxvbmUgcGFyYW1ldGVyIGZyb20gdGhlIGlucHV0IHNldHRpbmdzIHRvIHRoZSBpbnRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlU2V0dGluZ3MtPmRpcmVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MudHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTbGlkZVRyYW5zaXRpb25TZXR0aW5ncy0+ZGlyZWN0aW9uOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBuZWVkIHRvIGtlZXAgb3VyIGNvcHkgb2YgdGhlIHNldHRpbmdzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucFNsaWRlVHJhbnNpdGlvblNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0gJk00eFZTU19TbGlkZVRyYW5zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IHNsaWRlU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9GYWRlQmxhY2s6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9ICZNNHhWU1NfRmFkZUJsYWNrVHJhbnNpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5FeHRWaWRlb1RyYW5zaXRpb25GY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0OwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9UcmFuc2l0aW9uVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSAvLyBzd2l0Y2gKLQotICAgICAgICAgICAgLyogVXBkYXRlIHRvdGFsX2R1cmF0aW9uIHdpdGggdHJhbnNpdGlvbiBkdXJhdGlvbiAqLwotICAgICAgICAgICAgdG90YWxEdXJhdGlvbiAtPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT51aVRyYW5zaXRpb25EdXJhdGlvbjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09Ci0gICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5pc1Bhblpvb20pIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIG91dF9pbWdbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfaW1nX3RtcFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcEFSR0JGaWxlSW47Ci0gICAgICAgICAgICAgICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0KLSAgICAgICAgICAgICAgICAvKiBQYXJzZSBQdG8zR1BQIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8ga25vdyBpZiBpbnB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0OwotICAgICAgICAgICAgICAgICAgICAvKiBXZSBwYXJzZSBhbGwgUHRvM2dwcCBQYXJhbSBjaGFpbmVkIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZUluKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDbXBSZXN1bHQgPT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+ZHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+ZHVyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuTWVkaWFSZW5kZXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyApCi0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBKUEcgZmlsZW5hbWUgd2l0aCBleGlzdGluZyAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlcGxhY2VBUkdCXzNHUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdmFyaWFibGUsIGluIGNhc2Ugc29tZSBwaWN0dXJlcyBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBiZXR3ZWVuIHR3byAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsbHMgdG8gTTR4VlNTX3NlbmRDb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwUHRvM0dQUF9sYXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0X2ltZywgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEsIChNNE9TQV9DaGFyICopIiVzaW1nJWQuM2dwIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9jaHJTUHJpbnRmKG91dF9pbWdfdG1wLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSwgIiVzaW1nJWQudG1wIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICNlbmRpZiAvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4Kys7Ci0KLSAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBsYXN0IGVsZW1lbnQgUHRvM0dQUCBwYXJhbXMgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgcFBhcmFtcyA9IChNNHhWU1NfUHRvM0dQUF9wYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19QdG8zR1BQX3BhcmFtcyksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkVsZW1lbnQgb2YgUHRvM0dQUCBQYXJhbXMiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBQcm9ibGVtIHdoZW4gYWxsb2NhdGluZyBvbmUgZWxlbWVudCBQdG8zR1BQIFBhcmFtcyIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZXMgcGZpbGV4eHggbWVtYmVycyBvZiBwUGFyYW1zIHRvIGJlIGFibGUgdG8gZnJlZSB0aGVtIGNvcnJlY3RseSAqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9IE00eFZTU19rUmVzaXppbmc7Ci0KLSAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOmdldCB0aGUgd2lkdGggYW5kIGhlaWdodCAqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPmhlaWdodCA9IHBTZXR0aW5ncy0+cENsaXBMaXN0WwotICAgICAgICAgICAgICAgICAgICBpXS0+Q2xpcFByb3BlcnRpZXMudWlTdGlsbFBpY0hlaWdodDsgLy9BUkdCX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+d2lkdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFsKLSAgICAgICAgICAgICAgICAgICAgICAgIGldLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljV2lkdGg7IC8vQVJHQl9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJDTElQIE00eFZTU19TZW5kQ29tbWFuZCBBUkdCODg4OCBIID0gJWQiLCBwUGFyYW1zLT5oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoIkNMSVAgTTR4VlNTX1NlbmRDb21tYW5kIEFSR0I4ODg4IFcgPSAlZCIsIHBQYXJhbXMtPndpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgeFZTUyBjb250ZXh0IHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoaXMgZWxlbWVudCBpbiBjYXNlIG9mIG90aGVyIGZpbGUgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQdG8zR1BQX2xhc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IHBvaW50ZXIgb2YgdGhlIHByZXZpb3VzIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHRvM0dQUF9sYXN0LT5wTmV4dCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgc2F2ZSBvZiBsYXN0IGVsZW1lbnQgb2YgdGhlIGNoYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFB0bzNHUFBfbGFzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGwgdGhlIGxhc3QgTTR4VlNTX1B0bzNHUFBfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBkdXJhdGlvbiBpcyBmaWxsZWQsIGxldCdzIHVzZSBpdCBpbnN0ZWFkIG9mIEVuZEN1dFRpbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb24gIT0gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPklucHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwgKE00T1NBX1ZvaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogcENvbnZGcm9tVVRGOEZjdCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUHRvM0dQUCBQYXJhbXM6IGZpbGUgaW4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlSW4gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZUluLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IGlucHV0IGZpbGUgcGF0aCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayB0aGF0IEpQRyBmaWxlIGlzIHByZXNlbnQgb24gdGhlIEZTIChQNE1FMDAwMDI5NzQpIGJ5IGp1c3Qgb3BlbmluZwotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBjbG9zaW5nIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5vcGVuUmVhZCgmcEFSR0JGaWxlSW4sIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVJlYWQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBvcGVuIGlucHV0IGpwZyBmaWxlICVzLCBlcnJvcjogMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5jbG9zZVJlYWQocEFSR0JGaWxlSW4pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBjbG9zZSBpbnB1dCBqcGcgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF9pbWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF9pbWcsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IHBDb252RnJvbVVURjhGY3QgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlB0bzNHUFAgUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVPdXQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZU91dCwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBvdXRwdXQgZmlsZSBwYXRoICovCi0KLSAgICAjaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfaW1nX3RtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopb3V0X2ltZ190bXAsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJQdG8zR1BQIFBhcmFtczogZmlsZSB0ZW1wIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZVRlbXAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZVRlbXAsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgdGVtcG9yYXJ5IGZpbGUgcGF0aCAqLwotCi0gICAgI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGwgUGFuQW5kWm9vbSBzZXR0aW5ncyBpZiBuZWVkZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLmlzUGFuWm9vbSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNQYW5ab29tID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5pc1Bhblpvb207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBQYW4gJiBab29tIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhhID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAwIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGEgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWEgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAwIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGIgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWIgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21YYSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFlhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21YYiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFhiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFliOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzUGFuWm9vbSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyorIFBSIE5vOiBibHJueHBzdyMyMjMqLwotICAgICAgICAgICAgICAgICAgICAgICAgLypJbnRpYWxpemluZyB0aGUgVmlkZW8gRnJhbWUgUmF0ZSBhcyBpdCBtYXkgbm90IGJlIGludGlhbGl6ZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLypPdGhlciBjaGFuZ2VzIG1hZGUgaXMgQCBNNHhWU1NfSW50ZXJuYWwuYyBAIGxpbmUgMTUxOCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDMzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gNDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjBfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA1MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDY2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA4MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSAxMzM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDIwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk1ha2luZyBEZWZhdWx0IEZyYW1lIFJhdGUgQCAxNSBGUFMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA2NjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKi1QUiBObzogYmxybnhwc3cjMjIzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLk1lZGlhUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tDcm9wcGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNDcmVhdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsKys7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBiVHJhbnNjb2RpbmdSZXF1aXJlZCB0byBUUlVFIHRvIGluZGljYXRlIHRoZSBrZW5idXJuIHZpZGVvIGhhcwotICAgICAgICAgICAgICAgICAgICAgICAgKiBiZWVuIGdlbmVyYXRlZCBpbiBhbmFseXNpcyBwaGFzZSwgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgdGFuc2NvZGVkIGFnYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGluIHNhdmluZyBwaGFzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsKLQotICAgIHJlcGxhY2VBUkdCXzNHUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0b3RhbCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPSBwUGFyYW1zLT5kdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjaW5nIGluIFZTUyBzdHJ1Y3R1cmUgdGhlIEpQRyBmaWxlIGJ5IHRoZSAzZ3AgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byBVVEY4LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBwUGFyYW1zLT5wRmlsZU91dDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcFBhcmFtcy0+cEZpbGVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMSksIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgZmlsZSBwYXRoIG9mIEFSR0IgdG8gM2dwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCAobGVuZ3RoICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIGJlY2F1c2Ugb2YgVVRGMTYgY29udmVyc2lvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDNHUCBpbnB1dCBmaWxlIHR5cGUgY2FzZQotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX000ViApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKiBOZWVkIHRvIGNhbGwgTUNTIGluIGNhc2UgM0dQIHZpZGVvL2F1ZGlvIHR5cGVzIGFyZSBub3QgY29tcGF0aWJsZQotICAgICAgICAgICAgKEgyNjMvTVBFRzQgb3IgQU1STkIvQUFDKSAqLwotICAgICAgICAgICAgLyogPT4gTmVlZCB0byBmaWxsIE1DU19QYXJhbXMgc3RydWN0dXJlIHdpdGggdGhlIHJpZ2h0IHBhcmFtZXRlcnMgISAqLwotICAgICAgICAgICAgLyogTmVlZCBhbHNvIHRvIHBhcnNlIE1DUyBwYXJhbXMgc3RydWN0IHRvIGNoZWNrIGlmIGZpbGUgaGFzIGFscmVhZHkgYmVlbiB0cmFuc2NvZGVkICovCi0KLSAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXM7Ci0gICAgICAgICAgICBNNE9TQV9Cb29sIGF1ZGlvSXNEaWZmZXJlbnQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIE00T1NBX0Jvb2wgdmlkZW9Jc0RpZmZlcmVudCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgTTRPU0FfQm9vbCBiQXVkaW9Nb25vOwotICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBmaWxlIHByb3BlcnRpZXMgc3RydWN0dXJlICovCi0KLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKSAmZmlsZVByb3BlcnRpZXMsMCwKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMpKTsKLQotICAgICAgICAgICAgLy9maWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotCi0gICAgICAgICAgICAvKiBQcmV2ZW50IGZyb20gYmFkIGluaXRpYWxpemluZyBvZiBwZXJjZW50YWdlIGN1dCB0aW1lICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUVuZEN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IDEwMCB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQmVnaW5DdXRQZXJjZW50ID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGVzZSBwZXJjZW50YWdlIGN1dCB0aW1lIGhhdmUgcHJvYmFibHkgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgICAgICAgICAvKiBMZXQncyBub3QgdXNlIHRoZW0gYnkgc2V0dGluZyB0aGVtIHRvIDAgKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRW5kQ3V0UGVyY2VudCA9IDA7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUJlZ2luQ3V0UGVyY2VudCA9Ci0gICAgICAgICAgICAgICAgICAgIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkCi0gICAgICAgICAgICAgICAgICAgICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoeFZTU19jb250ZXh0LCBwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgJmZpbGVQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8ga25vdyBpZiBpbnB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gY29udmVydGVkICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgICAgICAgICAvKiBXZSBwYXJzZSBhbGwgTUNTIFBhcmFtIGNoYWluZWQgbGlzdCAqLwotICAgICAgICAgICAgICAgIHdoaWxlKCBwUGFyYW1zICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIFVURjgsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFBhcmFtcy0+cEZpbGVJbjsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwUGFyYW1zLT5wRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4IHJldHVybnMgZXJyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBJZiBpbnB1dCBmaWxlbmFtZXMgYXJlIHRoZSBzYW1lLCBhbmQgaWYgdGhpcyBpcyBub3QgYSBCR00sIHdlIGNhbiByZXVzZQotICAgICAgICAgICAgICAgICAgICB0aGUgdHJhbnNjb2RlZCBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgJiYgcFBhcmFtcy0+aXNCR00gPT0gTTRPU0FfRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocFBhcmFtcy0+RW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcFBhcmFtcy0+RW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUgPT0gMTAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIDNHUCBmaWxlbmFtZSB3aXRoIHRyYW5zY29kZWQgM0dQIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVwbGFjZTNHUF8zR1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOdWxsQXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIDNHUCBmaWxlbmFtZSB3aXRoIHRyYW5zY29kZWQgM0dQIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXBsYWNlM0dQXzNHUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdmFyaWFibGUsIGluIGNhc2Ugc29tZSAzR1AgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkCi0gICAgICAgICAgICAgICAgICAgIGJldHdlZW4gdHdvICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGNhbGxzIHRvIE00eFZTU19zZW5kQ29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBwTUNTX2xhc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIHBlcmNlbnRhZ2UgaW5mb3JtYXRpb24gbGV0J3MgdXNlIGl0Li4uICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUVuZEN1dFBlcmNlbnQgIT0gMAotICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlCZWdpbkN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBwZXJjZW50YWdlIGluZm9ybWF0aW9uIGFyZSBub3QgY29ycmVjdCBhbmQgaWYgZHVyYXRpb24gZmllbGQgaXMgbm90IGZpbGxlZCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0UGVyY2VudAotICAgICAgICAgICAgICAgICAgICA8PSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudCkKLSAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBCYWQgcGVyY2VudGFnZSBmb3IgYmVnaW4gYW5kIGVuZCBjdXQgdGltZSAhIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFdlIHRyYW5zZm9ybSB0aGUgcGVyY2VudGFnZSBpbnRvIGFic29sdXRlIHRpbWUgKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA9IChNNE9TQV9VSW50MzIpKAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudAotICAgICAgICAgICAgICAgICAgICAqIGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uIC8gMTAwKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPSAoTTRPU0FfVUludDMyKSgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgdWlFbmRDdXRQZXJjZW50Ci0gICAgICAgICAgICAgICAgICAgICogZmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLyAxMDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogLi4uT3RoZXJ3aXNlLCB3ZSB1c2UgYWJzb2x1dGUgdGltZS4gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBlbmRDdXRUaW1lID09IDAsIGl0IG1lYW5zIGFsbCB0aGUgZmlsZSBpcyB0YWtlbi4gTGV0J3MgY2hhbmdlIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgZHVyYXRpb24sIHRvIGFjY3VyYXRlIHByZXZpZXcuICovCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9PSAwCi0gICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA+IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIGR1cmF0aW9uIGZpZWxkIGlzIGZpbGxlZCwgaXQgaGFzIHByaW9yaXR5IG9uIG90aGVyIGZpZWxkcyBvbiBFbmRDdXRUaW1lLAotICAgICAgICAgICAgIHNvIGxldCdzIHVzZSBpdCAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlEdXJhdGlvbiAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAreFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA+IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIG91dHB1dCB2aWRlbyBmb3JtYXQgaXMgbm90IHNldCwgd2UgdGFrZSB2aWRlbyBmb3JtYXQgb2YgdGhlIGZpcnN0IDNHUCB2aWRlbyAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0Ci0gICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9IGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZTsKLSAgICAgICAgICAgICAgICAvL000T1NBX1RSQUNFMl8xKCJPdXRwdXQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzZXQsIHNldCBpdCB0byBjdXJyZW50IGNsaXA6ICVkIiwKLSAgICAgICAgICAgICAgICAvLyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJPdXRwdXQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzZXQsIGFuIGVycm9yIHBhcmFtZXRlciBpcyByZXR1cm5lZC4iKTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0gZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKAotICAgICAgICAgICAgICAgICAgICAiT3V0cHV0IGF1ZGlvIGZvcm1hdCBpcyBub3Qgc2V0IC0+IHJlbW92ZSBhdWRpbyB0cmFjayBvZiBjbGlwOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJBdWRpb01vbm8gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rQUFDCi0gICAgICAgICAgICAgICAgJiYgKGZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gc2FtcGxpbmdGcmVxCi0gICAgICAgICAgICAgICAgfHwgYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8pKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXVkaW9Jc0RpZmZlcmVudCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgLyogSWYgd2Ugd2FudCB0byByZXBsYWNlIGF1ZGlvLCB0aGVyZSBpcyBubyBuZWVkIHRvIHRyYW5zY29kZSBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogdGVtcCBmaXggOlBUIHZvbHVtZSBub3QgaGVyYWQgaW4gdGhlIHNlY29uZCBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCAvKihwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9PSAxMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCovCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gKSAvKjExLzEyLzIwMDggQ1IgMzI4MyBWQUwgZm9yIHRoZSBNTVMKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZSBjYXNlLCB3ZSBuZWVkIHRvIHRyYW5zY29kZSBleGNlcHQgdGhlIG1lZGlhIHdpdGhvdXQgYXVkaW8qLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0lzRGlmZmVyZW50ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9Jc0RpZmZlcmVudCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEhlcmUgY2hlY2sgdGhlIGNsaXAgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwsIGlmIGl0IGV4Y2VlZHMKLSAgICAgICAgICAgICAqIHRoZSBwcm9maWxlIGFuZCBsZXZlbCBvZiBleHBvcnQgZmlsZSwgdGhlbiB0aGUgZmlsZSBuZWVkcwotICAgICAgICAgICAgICogdG8gYmUgdHJhbnNjb2RlZChkbyBub3QgZG8gY29tcHJlc3MgZG9tYWluIHRyaW0pLgotICAgICAgICAgICAgICogQWxzbyBmb3IgTVBFRzQgZm9tYXJ0LCBhbHdheXMgZG8gdHJhbnNjb2Rpbmcgc2luY2UgSFcgZW5jb2RlcgotICAgICAgICAgICAgICogbWF5IHVzZSBkaWZmZXJlbnQgdGltZSBzY2FsZSB2YWx1ZSB0aGFuIHRoZSBpbnB1dCBjbGlwKi8KLSAgICAgICAgICAgaWYgKChmaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSA+Ci0gICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUpIHx8Ci0gICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9MZXZlbCA+Ci0gICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsKSB8fAotICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSkgewotICAgICAgICAgICAgICAgLyogU2V0IGJUcmFuc2NvZGluZ1JlcXVpcmVkIHRvIFRSVUUgdG8gaW5kaWNhdGUgdGhlIHZpZGVvIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAqIHRyYW5zY29kZWQgaW4gTUNTLiAqLwotICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICB2aWRlb0lzRGlmZmVyZW50ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggdmlkZW9Jc0RpZmZlcmVudCA9PSBNNE9TQV9UUlVFIHx8IGF1ZGlvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIG91dF8zZ3BbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwX3RtcFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLQotICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0XzNncCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEsIChNNE9TQV9DaGFyICopIiVzdmlkJWQuM2dwIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0XzNncF90bXAsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxLCAiJXN2aWQlZC50bXAiLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRPU0FfY2hyU1ByaW50ZjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCsrOwotCi0gICAgICAgICAgICAgICAgcFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNHhWU1NfTUNTX3BhcmFtcyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX01DU19wYXJhbXMpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJFbGVtZW50IG9mIE1DUyBQYXJhbXMgKGZvciAzR1ApIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogUHJvYmxlbSB3aGVuIGFsbG9jYXRpbmcgb25lIGVsZW1lbnQgTUNTIFBhcmFtcyIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nID0gTTR4VlNTX2tSZXNpemluZzsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT52aWRlb2NsaXBudW1iZXIgPSBpOyAvLyBJbmRpY2F0ZXMgdmlkZW8gY2xpcCBpbmRleAotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSB4VlNTIGNvbnRleHQgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgcG9pbnRlciBvZiB0aGUgcHJldmlvdXMgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgICAgICBwTUNTX2xhc3QtPnBOZXh0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBTYXZlIHRoaXMgZWxlbWVudCBpbiBjYXNlIG9mIG90aGVyIGZpbGUgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgIHBNQ1NfbGFzdCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAvKiBGaWxsIHRoZSBsYXN0IE00eFZTU19NQ1NfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5JbnB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDsKLQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvVGltZXNjYWxlID0geFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZTsKLQotICAgICAgICAgICAgICAgIC8qIFdlIGRvIG5vdCBuZWVkIHRvIHJlZW5jb2RlIHZpZGVvIGlmIGl0cyBwYXJhbWV0ZXJzIGRvIG5vdCBkaWZmZXIgKi8KLSAgICAgICAgICAgICAgICAvKiBmcm9tIG91dHB1dCBzZXR0aW5ncyBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgaWYoIHZpZGVvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKkZCOiBWQUwgQ1IgUDRNRTAwMDAzMDc2Ci0gICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gYml0cmF0ZSBpcyBub3cgZGlyZWN0bHkgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gdGhlIGVkaXRpb24KLSAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mgc3RydWN0dXJlIElmIHRoZSBiaXRyYXRlIGdpdmVuIGJ5IHRoZSB1c2VyIGlzIGlycmVsZXZhbnQKLSAgICAgICAgICAgICAgICAgICAgKHRoZSBNQ1MgbWluaW11bSBhbmQgbWF4aW11bSB2aWRlbyBiaXRyYXRlIGFyZSB1c2VkKSwKLSAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCB2aWRlbyBiaXRyYXRlIGlzIGhhcmRjb2RlZCBhY2NvcmRpbmcgdG8gdGhlIG91dHB1dCB2aWRlbyBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPj0gTTRWSURFT0VESVRJTkdfazE2X0tCUFMKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazhfTUJQUyApIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s0OF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2sxMjhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2szODRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNTEyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogU2hvdWxkIG5vdCBoYXBwZW4gISEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5vdXRwdXRWaWRlb1Byb2ZpbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5vdXRwdXRWaWRlb0xldmVsID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa051bGxWaWRlbzsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazE1X0ZQUzsgLyogTXVzdCBiZSBzZXQsIG90aGVyd2lzZSwgTUNTIHJldHVybnMgYW4gZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggYXVkaW9Jc0RpZmZlcmVudCA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0OwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOb25lQXVkaW86Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IFZBTCBDUiBQNE1FMDAwMDMwNzYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCBhdWRpbyBiaXRyYXRlIGluIHRoZSBBQUMgY2FzZSBpcyBub3cgZGlyZWN0bHkgZ2l2ZW4gYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXIgaW4gdGhlIGVkaXRpb24gc2V0dGluZ3Mgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBiaXRyYXRlIGdpdmVuIGJ5IHRoZSB1c2VyIGlzIGlycmVsZXZhbnQgb3IgdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgTUNTIG1pbmltdW0gYW5kIG1heGltdW0gYXVkaW8gYml0cmF0ZSBhcmUgdXNlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgYXVkaW8gYml0cmF0ZSBpcyBoYXJkIGNvZGVkIGFjY29yZGluZyB0byB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHNhbXBsaW5nIGZyZXF1ZW5jeSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgYXVkaW8gYml0cmF0ZSBpcyBjb3JyZWN0bHkgZGVmaW5lZCovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypNb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DUyB2YWx1ZXMgZm9yIEFBQyBNb25vIGFyZSBtaW46IDE2a2JwcyBhbmQgbWF4OiAxOTIga2JwcyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2sxNl9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypTdGVyZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTIHZhbHVlcyBmb3IgQUFDIE1vbm8gYXJlIG1pbjogMzJrYnBzIGFuZCBtYXg6IDE5MiBrYnBzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2szMl9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgYXVkaW8gYml0cmF0ZSBpcyBoYXJkIGNvZGVkIGFjY29yZGluZyB0byB0aGUgb3V0cHV0IGF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyBmcmVxdWVuY3kqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE2MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2syNF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIyMDUwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNDhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDgwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJpdHJhdGUgaGF2ZSB0byBiZSBkb3VibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfazgwMDBfQVNGICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJldmVudCBmcm9tIHVuYWxsb3dlZCBzYW1wbGluZyBmcmVxdWVuY2llcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBTaG91bGQgbm90IGhhcHBlbiAhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FNUl9OQjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa051bGxBdWRpbzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIGluIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlSW4sICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IGlucHV0IGZpbGUgcGF0aCAqLwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3AsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVPdXQsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IG91dHB1dCBmaWxlIHBhdGggKi8KLQotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gb3V0XzNncF90bXA7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopb3V0XzNncF90bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTUNTIDNHUCBQYXJhbXM6IGZpbGUgdGVtcCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlVGVtcCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlVGVtcCwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgdGVtcG9yYXJ5IGZpbGUgcGF0aCAqLwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLQotI2VuZGlmIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAvKkZCIDIwMDgvMTAvMjAga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8sIGFkZCBtZWRpYSByZW5kZXJpbmcgcGFyYW1ldGVyKi8KLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLk1lZGlhUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rQ3JvcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tSZXNpemluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmc7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLypGQjogdHJhbnNjb2RpbmcgcGVyIHBhcnRzKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5CZWdpbkN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5FbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lOwotCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzQkdNID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNDcmVhdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCsrOwotICAgICAgICAgICAgICAgIGJJc1RyYW5zY29kaW5nID0gTTRPU0FfVFJVRTsKLQotcmVwbGFjZTNHUF8zR1A6Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIHRvdGFsIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgLSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAgICAgICAgIC8qIFJlcGxhY2luZyBpbiBWU1Mgc3RydWN0dXJlIHRoZSBvcmlnaW5hbCAzR1AgZmlsZSBieSB0aGUgdHJhbnNjb2RlZCAzR1AgZmlsZSAqLwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFBhcmFtcy0+cEZpbGVPdXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwUGFyYW1zLT5wRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUyBmaWxlIHBhdGggb2YgM2dwIHRvIDNncCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCAobGVuZ3RoICsgMSkpOwotICAgICAgICAgICAgICAgIC8qRkI6IGFkZCBmaWxlIHBhdGggc2l6ZSBiZWNhdXNlIG9mIFVURiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLQotICAgICAgICAgICAgICAgIC8qIFdlIGRlZmluZSBtYXN0ZXIgY2xpcCBhcyBmaXJzdCAzR1AgaW5wdXQgY2xpcCAqLwotICAgICAgICAgICAgICAgIC8qaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9PSAwICYmIGZpbGVQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdG90YWwgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAtIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogV2UgZGVmaW5lIG1hc3RlciBjbGlwIGFzIGZpcnN0IDNHUCBpbnB1dCBjbGlwICovCi0gICAgICAgICAgICBpZiggbWFzdGVyQ2xpcCA9PSAtMQotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICBPdGhlciBpbnB1dCBmaWxlIHR5cGUgY2FzZQotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkJhZCBmaWxlIHR5cGUgYXMgaW5wdXQgY2xpcCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKiBQYXJzZSBhbGwgZWZmZWN0cyB0byBtYWtlIHNvbWUgYWRqdXN0bWVudCBmb3IgZnJhbWluZywgKgotICAgICogdGV4dCBhbmQgdG8gdHJhbnNmb3JtIHJlbGF0aXZlIHRpbWUgaW50byBhYnNvbHV0ZSB0aW1lICoKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGZvciAoIGogPSAwOyBqIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0czsgaisrICkKLSAgICB7Ci0gICAgICAgIC8qIENvcHkgZWZmZWN0IHRvICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKSAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICh2b2lkICopICYocFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLQotICAgICAgICAvKiBQcmV2ZW50IGZyb20gYmFkIGluaXRpYWxpemluZyBvZiBlZmZlY3QgcGVyY2VudGFnZSB0aW1lICovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpRHVyYXRpb25QZXJjZW50ID4gMTAwCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpU3RhcnRQZXJjZW50ID4gMTAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlc2UgcGVyY2VudGFnZSB0aW1lIGhhdmUgcHJvYmFibHkgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgICAgIC8qIExldCdzIG5vdCB1c2UgdGhlbSBieSBzZXR0aW5nIHRoZW0gdG8gMCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aUR1cmF0aW9uUGVyY2VudCA9IDA7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpU3RhcnRQZXJjZW50ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIHdlIGhhdmUgcGVyY2VudGFnZSBpbmZvcm1hdGlvbiBsZXQncyB1c2UgaXQuLi4gT3RoZXJ3aXNlLCB3ZSB1c2UgYWJzb2x1dGUgdGltZS4gKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlEdXJhdGlvblBlcmNlbnQgIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lID0gKE00T1NBX1VJbnQzMikodG90YWxEdXJhdGlvbgotICAgICAgICAgICAgICAgICogeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aVN0YXJ0UGVyY2VudAotICAgICAgICAgICAgICAgIC8gMTAwKTsKLSAgICAgICAgICAgIC8qIFRoZSBwZXJjZW50YWdlIG9mIGVmZmVjdCBkdXJhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZHVyYXRpb24gb2YgdGhlIGNsaXAgLQotICAgICAgICAgICAgc3RhcnQgdGltZSAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIEVmZmVjdHNbal0udWlEdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHRvdGFsRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlEdXJhdGlvblBlcmNlbnQKLSAgICAgICAgICAgICAgICAvIDEwMCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZiB0aGVyZSBpcyBhIGZyYW1pbmcgZWZmZWN0LCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGZyYW1pbmcgZWZmZWN0IHN0cnVjdHVyZSAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nICkKLSAgICAgICAgewotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgIE00eFZTU19GcmFtaW5nQ29udGV4dCAqZnJhbWluZ0N0eDsKLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0jZWxzZQotCi0gICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCAqZnJhbWluZ0N0eDsKLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgICAgICAgICBNNE9TQV9DaGFyICpwRXh0MiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgTTRPU0FfSW50MzIgcmVzdWx0MSwgcmVzdWx0MjsKLQotICAgICAgICAgICAgLyogQ29weSBmcmFtaW5nIGZpbGUgcGF0aCAqLwotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aCA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgpCi0gICAgICAgICAgICAgICAgICAgICsgMSwgTTRWUywgKE00T1NBX0NoYXIgKikiTG9jYWwgRnJhbWluZyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoLCBzdHJsZW4oCi0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgpICsgMSk7Ci0KLSAgICAgICAgICAgICAgICBwRXh0MiA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgIH0KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgIGZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nQ29udGV4dCksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBTUFNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5iRWZmZWN0UmVzaXplID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLmJSZXNpemU7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRWZmZWN0RmlsZVBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBGaWxlUmVhZFB0ciA9IHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEZpbGVXcml0ZVB0ciA9IHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cjsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmVmZmVjdER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS51aUR1cmF0aW9uOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+Yl9Jc0ZpbGVHaWYgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+Yl9hbmltYXRlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgICAgICAvKiBPdXRwdXQgcmF0aW8gZm9yIHRoZSBlZmZlY3QgaXMgc3RvcmVkIGluIHVpRmlmdGllc091dEZyYW1lUmF0ZSBwYXJhbWV0ZXJzIG9mIHRoZQotICAgICAgICAgICAgZXh0ZW5kZWQgeFZTUyBlZmZlY3RzIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlGaWZ0aWVzT3V0RnJhbWVSYXRlCi0gICAgICAgICAgICAgICAgIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+ZnJhbWVEdXJhdGlvblJhdGlvID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0Zsb2F0KSgoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnVpRmlmdGllc091dEZyYW1lUmF0ZSkgLyAxMDAwLjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmZyYW1lRHVyYXRpb25SYXRpbyA9IDEuMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypBbHBoYSBibGVuZGluZyovCi0gICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBhbHBoYSBibGVuZGluZyBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0cyovCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZSA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPSAxMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPiAxMDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZSA9IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0ID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA9IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPiAwCi0gICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKkFsbG9jYXRlIHRoZSBhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypGaWxsIHRoZSBhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kID0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlID0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQgPQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydDsKLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lCi0gICAgICAgICAgICAgICAgICAgICsgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAwIC0gZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTG9jYWwgRnJhbWluZyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0jZWxzZQotCi0gICAgICAgICAgICBmcmFtaW5nQ3R4ID0gKE00eFZTU19GcmFtaW5nU3RydWN0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICBpZiggZnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0KLSAgICAgICAgICAgIC8qIEJ1Z0ZpeCAxLjIuMDogTGVhayB3aGVuIGRlY29kaW5nIGVycm9yICovCi0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotICAgICAgICAgICAgLyogU2F2ZSBmcmFtaW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHg7Ci0KLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgICAgICAgICAgaWYoIHBFeHQyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERlY29kZSB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB0byB0aGUgZWZmZWN0LCBhbmQgZmlsbCBmcmFtaW5nIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIHBFeHQyICs9IChzdHJsZW4oKGNvbnN0IGNoYXIgKilwRXh0MikgLSA0KTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdDEgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwRXh0MiwoY29uc3QgY2hhciAqKSIucmdiIik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0MiA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBFeHQyLChjb25zdCBjaGFyICopIi5SR0IiKTsKLQotICAgICAgICAgICAgICAgIGlmKCAwID09IHJlc3VsdDEgfHwgMCA9PSByZXN1bHQyICkKLSAgICAgICAgICAgICAgICB7Ci0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ1N0cnVjdCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGOiBDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBTUFMgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cEN1cnJlbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsgLyogT25seSB1c2VkIGJ5IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLSAgICAgICAgICAgICAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPndpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1Mud2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJGUkFNTUlORyBCRUZPUkUgTTR4VlNTX1NlbmRDb21tYW5kICAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+d2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRlJBTU1JTkcgQkVGT1JFIE00eFZTU19TZW5kQ29tbWFuZCAgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPmhlaWdodCk7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJGUkFNSU5HIFdJRFRIIEJFRk9SRSBNNHhWU1NfU2VuZENvbW1hbmQgICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT53aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJGUkFNSU5HIEhFSUdIVCBCRUZPUkUgTTR4VlNTX1NlbmRDb21tYW5kICAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+aGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVQTkcgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFNQUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE5vdCBzdXBwb3J0ZWQgc3RpbGwgcGljdHVyZSBmb3JtYXQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBQbGFuZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF94OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLQotICAgICAgICAgICAgICAgIC8qIEJ1Z0ZpeCAxLjIuMDogTGVhayB3aGVuIGRlY29kaW5nIGVycm9yICovCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgICAgIC8qIEZvcmNlIGlucHV0IFJHQiBidWZmZXIgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbiBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGggJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgJiB+MTsKLSAgICAgICAgICAgICAgICAvKiBJbnB1dCBSR0IgcGxhbmUgaXMgcHJvdmlkZWQsIGxldCdzIGNvbnZlcnQgaXQgdG8gWVVWNDIwLCBhbmQgdXBkYXRlIGZyYW1pbmcKLSAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4KTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgICAgIC8qIEZvcmNlIGlucHV0IFJHQiBidWZmZXIgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbiBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV93aWR0aCAmIH4xOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLnVfaGVpZ2h0ICYgfjE7Ci0gICAgICAgICAgICAgICAgLyogSW5wdXQgUkdCIHBsYW5lIGlzIHByb3ZpZGVkLCBsZXQncyBjb252ZXJ0IGl0IHRvIFlVVjQyMCwgYW5kIHVwZGF0ZSBmcmFtaW5nCi0gICAgICAgICAgICAgICAgIHN0cnVjdHVyZSAgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoZnJhbWluZ0N0eCk7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIFJHQiB0byBZVVY6IDB3JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IE5vIGlucHV0IGltYWdlL3BsYW5lIHByb3ZpZGVkIGZvciBmcmFtaW5nIGVmZmVjdC4iKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogQ1I6IEFkZCB0ZXh0IGhhbmRsaW5nIHdpdGggZXh0ZXJuYWwgdGV4dCBpbnRlcmZhY2UgKi8KLSAgICAgICAgLyogSWYgZWZmZWN0IHR5cGUgaXMgdGV4dCwgd2UgY2FsbCBleHRlcm5hbCB0ZXh0IGZ1bmN0aW9uIHRvIGdldCBSR0IgNTY1IGJ1ZmZlciAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9UZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ2FsbCB0aGUgZm9udCBlbmdpbmUgZnVuY3Rpb24gcG9pbnRlciB0byBnZXQgUkdCNTY1IGJ1ZmZlciAqLwotICAgICAgICAgICAgLyogV2UgdHJhbnNmb3JtIHRleHQgZWZmZWN0IGludG8gZnJhbWluZyBlZmZlY3QgZnJvbSBidWZmZXIgKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKkZCOiBhZGQgVVRGIGNvbnZlcnRpb24gZm9yIHRleHQgYnVmZmVyKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ0NvbnRleHQgKmZyYW1pbmdDdHg7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCAqZnJhbWluZ0N0eDsKLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ0NvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5iRWZmZWN0UmVzaXplID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5iUmVzaXplOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRmlsZVJlYWRQdHIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0cjsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRmlsZVdyaXRlUHRyID0geFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmVmZmVjdER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0udWlEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5iX0lzRmlsZUdpZiA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmJfYW5pbWF0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHg7Ci0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF95OwotCi0gICAgICAgICAgICAgICAgLyogQnVnRml4IDEuMi4wOiBMZWFrIHdoZW4gZGVjb2RpbmcgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5kdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLQotICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcqLwotICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIGFscGhhIGJsZW5kaW5nIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3RzKi8KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID0gMTAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlID0gMTAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA+IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA9IDEwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPiAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qQWxsb2NhdGUgdGhlIGFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSovCi0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qRmlsbCB0aGUgYWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0OwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAxMDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgLSBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jZWxzZQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCAoZm9yIHRleHQpIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF95ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKiBCdWdGaXggMS4yLjA6IExlYWsgd2hlbiBkZWNvZGluZyBlcnJvciAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgLyogU2F2ZSBmcmFtaW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0gICAgICAgICAgICAgICAgLyogRkI6IGNoYW5nZXMgZm9yIFZpZGVvIEFydGlzdDogbWVtY29weSBwVGV4dEJ1ZmZlciBzbyB0aGF0IGl0IGNhbiBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgYWZ0ZXIgYSBjb21wbGV0ZSBhbmFseXNpcyovCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19TZW5kQ29tbWFuZDogcFRleHRCdWZmZXIgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKkNvbnZlcnQgdGV4dCBidWZmZXIgaW50byBjdXN0b21lciBmb3JtYXQgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXI7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSArIDEsCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkxvY2FsIHRleHQgYnVmZmVyIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyID0KLSAgICAgICAgICAgICAgICAvLyBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyKSsxLAotICAgICAgICAgICAgICAgIC8vIE00VlMsICJMb2NhbCB0ZXh0IGJ1ZmZlciBlZmZlY3QiKTsKLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdCi0gICAgICAgICAgICAgICAgICAgIC8vLnhWU1MucFRleHRCdWZmZXIsIChNNE9TQV9NZW1BZGRyOClwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSArIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qQWxsb2NhdGUgdGhlIHRleHQgUkdCIGJ1ZmZlciovCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUkdCIHN0cnVjdHVyZSBmb3IgdGhlIHRleHQgZWZmZWN0Iik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpVGV4dEJ1ZmZlcldpZHRoCi0gICAgICAgICAgICAgICAgICAgID09IDAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlUZXh0QnVmZmVySGVpZ2h0ID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiB0ZXh0IHBsYW5lIHdpZHRoIGFuZCBoZWlnaHQgYXJlIG5vdCBkZWZpbmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGlucHV0IFJHQiB0ZXh0IGJ1ZmZlciBhbmQgZm9yY2UgaXQgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbgotICAgICAgICAgICAgICAgICBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlUZXh0QnVmZmVyV2lkdGggJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy51aVRleHRCdWZmZXJIZWlnaHQgJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICAyICogZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICogZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJUZXh0IFJHQiBwbGFuZS0+cGFjX2RhdGEiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIC8qIENhbGwgdGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gKi8KLQotICAgICAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBUZXh0UmVuZGVyaW5nRmN0KAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBSZW5kZXJpbmdEYXRhLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGV4dCByZW5kZXJpbmcgZXh0ZXJuYWwgZnVuY3Rpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBSR0IgYnVmZmVyIGlzIHNldCAqLwotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uIGRpZCBub3Qgc2V0IFJHQiBidWZmZXIgY29ycmVjdGx5ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29udmVydCBSR0IgcGxhbmUgdG8gWVVWNDIwIGFuZCB1cGRhdGUgZnJhbWluZyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIFJHQiB0byBZVVY6IDB3JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0jZWxzZQotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAvKiBDYWxsIHRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uICovCi0KLSAgICAgICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wUmVuZGVyaW5nRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAmKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGV4dCByZW5kZXJpbmcgZXh0ZXJuYWwgZnVuY3Rpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBSR0IgYnVmZmVyIGlzIHNldCAqLwotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gZGlkIG5vdCBzZXQgUkdCIGJ1ZmZlciBjb3JyZWN0bHkgISIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IFJHQiBwbGFuZSB0byBZVVY0MjAgYW5kIHVwZGF0ZSBmcmFtaW5nIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihmcmFtaW5nQ3R4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IGVycm9yIHdoZW4gY29udmVydGluZyBSR0IgdG8gWVVWOiAwdyV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgICAgICAgICAgICAgLyogQ2hhbmdlIGludGVybmFsbHkgZWZmZWN0IHR5cGUgZnJvbSAidGV4dCIgdG8gZnJhbWluZyAqLwotCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZzsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLmJSZXNpemUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTm8gdGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gc2V0ICEhIik7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIGRhdGEgbmVlZGVkIGJ5IHRoZSBGaWZ0aWVzIGVmZmVjdCAqLwotICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCAqZmlmdGllc0N0eDsKLQotICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGV4cGVjdGVkIGZyYW1lIHJhdGUgZm9yIHRoZSBmaWZ0aWVzIGVmZmVjdCAobXVzdCBiZSBhYm92ZSAwKSAqLwotICAgICAgICAgICAgaWYoIDAgPT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy51aUZpZnRpZXNPdXRGcmFtZVJhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiVGhlIGZyYW1lIHJhdGUgZm9yIHRoZSBmaWZ0aWVzIGVmZmVjdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwICEiKTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaWZ0aWVzQ3R4ID0gKE00eFZTU19GaWZ0aWVzU3RydWN0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GaWZ0aWVzU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmaWZ0aWVzIGVmZmVjdCIpOwotCi0gICAgICAgICAgICBpZiggZmlmdGllc0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmlmdGllc0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgZmlmdGllc0N0eC0+ZmlmdGllc0VmZmVjdER1cmF0aW9uID0gMTAwMCAvIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlGaWZ0aWVzT3V0RnJhbWVSYXRlOwotICAgICAgICAgICAgZmlmdGllc0N0eC0+c2hpZnRSYW5kb21WYWx1ZSA9IDA7Ci0gICAgICAgICAgICBmaWZ0aWVzQ3R4LT5zdHJpcGVSYW5kb21WYWx1ZSA9IDA7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgdGhlIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIGZpZnRpZXNDdHg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBkYXRhIG5lZWRlZCBieSB0aGUgQ29sb3IgZWZmZWN0ICovCi0gICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNgotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1BpbmsKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW4KLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmUKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfQ29sb3JTdHJ1Y3QgKkNvbG9yQ3R4OwotCi0gICAgICAgICAgICBDb2xvckN0eCA9Ci0gICAgICAgICAgICAgICAgKE00eFZTU19Db2xvclN0cnVjdCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0NvbG9yU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBjb2xvciBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIENvbG9yQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb2xvckN0eC0+Y29sb3JFZmZlY3RUeXBlID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGU7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2Ci0gICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbG9yQ3R4LT5yZ2IxNkNvbG9yRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlSZ2IxNklucHV0Q29sb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29sb3JDdHgtPnJnYjE2Q29sb3JEYXRhID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU2F2ZSB0aGUgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBjb3JyZXNwb25kaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgQ29sb3JDdHg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIEJhY2tncm91bmQgbXVzaWMgcmVnaXN0ZXJpbmcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgJiYgaXNOZXdCR00gPT0gTTRPU0FfVFJVRSApCi0gICAgewotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotCi0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zOwotICAgICAgICBNNE9TQV9DaGFyICpvdXRfcGNtOwotICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0jZW5kaWYKLQotICAgICAgICAvKiBXZSBzYXZlIG91dHB1dCBmaWxlIHBvaW50ZXIsIGJlY2F1c2Ugd2Ugd2lsbCBuZWVkIHRvIHVzZSBpdCB3aGVuIHNhdmluZyBhdWRpbyBtaXhlZAotICAgICAgICAgZmlsZSAobGFzdCBzYXZlIHN0ZXApICovCi0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcG9yYXJ5RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZTsKLQotICAgICAgICAvKiBJZiBhIHByZXZpb3VzIEJHTSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIGRlbGV0ZSBpdCAqLwotICAgICAgICAvKiBIZXJlIGNhbiBiZSBpbXBsZW1lbnRlZCB0ZXN0IHRvIGtub3cgaWYgdGhlIHNhbWUgQkdNIGlzIHJlZ2lzdGVyZWQgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPgotICAgICAgICAgICAgICAgICAgICBwRmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgQkdNICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9Ci0gICAgICAgICAgICAoTTR4VlNTX0JHTVNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikieFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgaW5wdXQgc3RydWN0dXJlIHRvIG91ciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAotICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAotICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19CR01TZXR0aW5ncykpOwotICAgICAgICAvKiBBbGxvY2F0ZSBmaWxlIG5hbWUsIGFuZCBjb3B5IGZpbGUgbmFtZSBidWZmZXIgdG8gb3VyIHN0cnVjdHVyZSAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0KLSAgICAgICAgICAgIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoc3RybGVuKHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKQotICAgICAgICAgICAgKyAxKSwgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUyBCR00gZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICBzdHJsZW4ocFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpICsgMSk7Ci0KLSNpZmRlZiBQUkVWSUVXX0VOQUJMRUQKLSAgICAgICAgLyogRGVjb2RlIEJHTSB0cmFjayB0byBwY20gb3V0cHV0IGZpbGUgKi8KLQotICAgICAgICBwUGFyYW1zID0KLSAgICAgICAgICAgIChNNHhWU1NfTUNTX3BhcmFtcyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX01DU19wYXJhbXMpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiRWxlbWVudCBvZiBNQ1MgUGFyYW1zIChmb3IgQkdNKSIpOwotCi0gICAgICAgIGlmKCBwUGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IFByb2JsZW0gd2hlbiBhbGxvY2F0aW5nIG9uZSBlbGVtZW50IE1DUyBQYXJhbXMiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXJzIGluIGNhc2Ugb2YgcHJvYmxlbSAoUFIgMjI3MykgKi8KLSAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBwUGFyYW1zLT5CZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICBwUGFyYW1zLT5FbmRDdXRUaW1lID0gMDsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdAotICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHhWU1MgY29udGV4dCB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtczsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfdGVtcCA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19wcmV2ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8gZmluZCBhbmQgZGVsZXRlIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICB3aGlsZSggcFBhcmFtc190ZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBQQ00gdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXNfdGVtcC0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXAtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENoYWluIHByZXZpb3VzIGVsZW1lbnQgd2l0aCBuZXh0IGVsZW1lbnQgPSByZW1vdmUgQkdNIGNoYWluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0IGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfcHJldiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2LT5wTmV4dCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgY3VycmVudCBwb2ludGVyIGlzIHRoZSBmaXJzdCBvZiB0aGUgY2hhaW5lZCBsaXN0IGFuZCBuZXh0IHBvaW50ZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgdGhlIGNoYWluZWQgbGlzdCBpcyBOVUxMICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGl0IG1lYW5zIHRoYXQgdGhlcmUgd2FzIG9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogPT4gd2UgcHV0IHRoZSBjb250ZXh0IHZhcmlhYmxlIHRvIE5VTEwgdG8gcmVhZmZlY3QgdGhlIGZpcnN0IGNoYWluZWQgbGlzdAotICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wID09IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfdGVtcC0+cE5leHQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgQkdNIHBvaW50ZXIgaXMgdGhlIGZpcnN0IG9uZSwgYnV0IHRoZXJlIGFyZSBvdGhlcnMgZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgIGFmdGVyIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIFNvLCB3ZSBuZWVkIHRvIGNoYW5nZSBmaXJzdCBjaGFpbmVkIGxpc3QgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwUGFyYW1zX3RlbXAtPnBOZXh0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfcHJldiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wTmV4dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2ID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBwUGFyYW1zX3ByZXY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBXZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW5lZCBsaXN0IHRvIGJlIGFibGUgdG8gYWRkIG5ldwotICAgICAgICAgICAgIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICBwTUNTX2xhc3QgPSBwUGFyYW1zX3ByZXY7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgaXQgbWVhbnMgdGhhdCB0aGVyZSB3YXMgb25seSBvbmUgZWxlbWVudCBpbiB0aGUgY2hhaW5lZCBsaXN0ICovCi0gICAgICAgICAgICAgICAgLyogU28sIHdlIG5lZWQgdG8gc2F2ZSB0aGUgbmV3IHBhcmFtcyovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgcG9pbnRlciBvZiB0aGUgcHJldmlvdXMgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgIHBNQ1NfbGFzdC0+cE5leHQgPSBwUGFyYW1zOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvKiBGaWxsIHRoZSBsYXN0IE00eFZTU19NQ1NfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgcFBhcmFtcy0+SW5wdXRGaWxlVHlwZSA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlOwotICAgICAgICBwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QQ007Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUgPSBNNFZJREVPRURJVElOR19rUUNJRjsKLSAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGUgPSBNNFZJREVPRURJVElOR19rMTVfRlBTOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FBQyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0KLSAgICAgICAgICAgIC8qRkI6IFZBTCBDUiBQNE1FMDAwMDMwNzYKLSAgICAgICAgICAgIFRoZSBvdXRwdXQgYXVkaW8gYml0cmF0ZSBpbiB0aGUgQUFDIGNhc2UgaXMgbm93IGRpcmVjdGx5IGdpdmVuIGJ5IHRoZSB1c2VyKi8KLSAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIGF1ZGlvIGJpdHJhdGUgaXMgY29ycmVjdGx5IGRlZmluZWQqLwotICAgICAgICAgICAgLypNb25vCi0gICAgICAgICAgICBNQ1MgdmFsdWVzIGZvciBBQUMgTW9ubyBhcmUgbWluOiAxNmticHMgYW5kIG1heDogMTkyIGticHMqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2sxNl9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKlN0ZXJlbwotICAgICAgICAgICAgTUNTIHZhbHVlcyBmb3IgQUFDIE1vbm8gYXJlIG1pbjogMzJrYnBzIGFuZCBtYXg6IDE5MiBrYnBzKi8KLSAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2szMl9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2szMl9LQlBTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBhcmFtcy0+YkF1ZGlvTW9ubyA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ID0gTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlOwotCi0gICAgICAgIC8qIFByZXBhcmUgb3V0cHV0IGZpbGVuYW1lICovCi0gICAgICAgIC8qIDIxIGlzIHRoZSBzaXplIG9mICJwcmV2aWV3XzE2MDAwXzIucGNtIiArIFwwICovCi0gICAgICAgIG91dF9wY20gPQotICAgICAgICAgICAgKE00T1NBX0NoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKQotICAgICAgICAgICAgKyAyMSwgTTRWUywgKE00T1NBX0NoYXIgKikiVGVtcCBjaGFyKiBmb3IgcGNtUHJldmlld0ZpbGUiKTsKLQotICAgICAgICBpZiggb3V0X3BjbSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29weSB0ZW1wb3JhcnkgcGF0aCB0byBmaW5hbCBwcmV2aWV3IHBhdGggc3RyaW5nICovCi0gICAgICAgIE00T1NBX2Nock5Db3B5KG91dF9wY20sIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLAotICAgICAgICAgICAgc3RybGVuKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKSArIDEpOwotCi0gICAgICAgIC8qIERlcGVuZGluZyBvZiB0aGUgb3V0cHV0IHNhbXBsZSBmcmVxdWVuY3kgYW5kIG5iIG9mIGNoYW5uZWxzLCB3ZSBjb25zdHJ1Y3QgcHJldmlldwotICAgICAgICBvdXRwdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29uc3RydWN0IG91dHB1dCB0ZW1wb3JhcnkgUENNIGZpbGVuYW1lICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0X3BjbSwgKGNvbnN0IGNoYXIgKikicHJldmlld18xNjAwMF8xLnBjbVwwIiwKLSAgICAgICAgICAgICAgICAgICAgMjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfcGNtLCAoY29uc3QgY2hhciAqKSJwcmV2aWV3XzE2MDAwXzIucGNtXDAiLAotICAgICAgICAgICAgICAgICAgICAyMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSBQQ00gZmlsZW5hbWUgKi8KLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfcGNtLCAoY29uc3QgY2hhciAqKSJwcmV2aWV3XzA4MDAwXzEucGNtXDAiLCAyMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggb3V0X3BjbSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKG91dF9wY20pOwotICAgICAgICAgICAgICAgIG91dF9wY20gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIGF1ZGlvIG91dHB1dCBmb3JtYXQgXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0gb3V0X3BjbTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgcERlY29kZWRQYXRoID0gb3V0X3BjbTsKLSAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfcGNtLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicGNtUHJldmlld0ZpbGUiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICBmcmVlKG91dF9wY20pOwotICAgICAgICAgICAgb3V0X3BjbSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUsICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLQotICAgICAgICAvKiBGcmVlIHRlbXBvcmFyeSBvdXRwdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgaWYoIG91dF9wY20gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUob3V0X3BjbSk7Ci0gICAgICAgICAgICBvdXRfcGNtID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyBCR00gUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlT3V0LCh2b2lkICopIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUsCi0gICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IG91dHB1dCBmaWxlIHBhdGggKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLQotICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+Ci0gICAgICAgICAgICAgICAgcEZpbGUsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTUNTIEJHTSBQYXJhbXM6IGZpbGUgaW4iKTsKLQotICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZUluLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgaW5wdXQgZmlsZSBwYXRoICovCi0KLSAgICAgICAgcFBhcmFtcy0+aXNCR00gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUGFyYW1zLT5pc0NyZWF0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCsrOwotICAgICAgICBiSXNUcmFuc2NvZGluZyA9IE00T1NBX1RSVUU7Ci0jZW5kaWYgLyogUFJFVklFV19FTkFCTEVEICovCi0KLSAgICB9Ci0gICAgZWxzZSBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIGlzTmV3QkdNID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0jaWZkZWYgUFJFVklFV19FTkFCTEVECi0gICAgICAgIC8qIEJHTSBpcyB0aGUgc2FtZSBhcyBwcmV2aW91c2x5LCBubyBuZWVkIHRvIHJlZGVjb2RlIGF1ZGlvICovCi0gICAgICAgIC8qIE5lZWQgdG8gdXBkYXRlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0LCB0byBzaWduYWwgTTR4VlNTX3N0ZXAgZnVuY3Rpb24gdG8gc2tpcAotICAgICAgICBCR00gZGVjb2RpbmcgKi8KLQotICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc190ZW1wID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfcHJldiA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKiBQUkVWSUVXX0VOQUJMRUQgKi8KLSAgICAgICAgLyogV2Ugc2F2ZSBvdXRwdXQgZmlsZSBwb2ludGVyLCBiZWNhdXNlIHdlIHdpbGwgbmVlZCB0byB1c2UgaXQgd2hlbiBzYXZpbmcgYXVkaW8KLSAgICAgICAgIG1peGVkIGZpbGUgKGxhc3Qgc2F2ZSBzdGVwKSAqLwotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBvcmFyeUZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGU7Ci0KLSAgICAgICAgLyogUmUtd3JpdGUgQkdNIHNldHRpbmdzIGluIGNhc2UgdGhleSBoYXZlIGNoYW5nZWQgYmV0d2VlbiB0d28gc2VuZENvbW1hbmQgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZEN0cyA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZEN0czsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcCA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUVuZExvb3AgPQotICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlFbmRMb29wOwotCi0jaWZkZWYgUFJFVklFV19FTkFCTEVECi0gICAgICAgIC8qIFBhcnNlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0IHRvIGZpbmQgYW5kIGRlbGV0ZSBCR00gZWxlbWVudCAqLwotCi0gICAgICAgIHdoaWxlKCBwUGFyYW1zX3RlbXAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcC0+aXNDcmVhdGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcDsKLSAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qIFBSRVZJRVdfRU5BQkxFRCAqLwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNHhWU1NfU2VuZENvbW1hbmQgaGFzIGJlZW4gcmVjYWxsZWQsIEJHTSBpcyB0aGUgc2FtZSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gQkdNIGluIHRoaXMgeFZTUyBjb21tYW5kIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotICAgICAgICAgICAgLyogTmVlZCB0byByZW1vdmUgTUNTIHByZXZpb3VzIHBhcmFtcyBjaGFpbmVkIGxpc3QgKi8KLQotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfdGVtcCA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19wcmV2ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8gZmluZCBhbmQgZGVsZXRlIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICB3aGlsZSggcFBhcmFtc190ZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBDaGFpbiBwcmV2aW91cyBlbGVtZW50IHdpdGggbmV4dCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3ByZXYgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldi0+cE5leHQgPSBwUGFyYW1zX3RlbXAtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIGN1cnJlbnQgcG9pbnRlciBpcyB0aGUgZmlyc3Qgb2YgdGhlIGNoYWluZWQgbGlzdCBhbmQgbmV4dCBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY2hhaW5lZCBsaXN0IGlzIE5VTEwgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogaXQgbWVhbnMgdGhhdCB0aGVyZSB3YXMgb25seSBvbmUgZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiA9PiB3ZSBwdXQgdGhlIGNvbnRleHQgdmFyaWFibGUgdG8gTlVMTCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wID09IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfdGVtcC0+cE5leHQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgQkdNIHBvaW50ZXIgaXMgdGhlIGZpcnN0IG9uZSwgYnV0IHRoZXJlIGFyZSBvdGhlcnMKLSAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFmdGVyIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIFNvLCB3ZSBuZWVkIHRvIGNoYW5nZSBmaXJzdCBjaGFpbmVkIGxpc3QgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwUGFyYW1zX3RlbXAtPnBOZXh0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSW4gYWxsIG90aGVyIGNhc2VzLCBub3RoaW5nIGVsc2UgdG8gZG8gZXhjZXB0IGZyZWVpbmcgdGhlIGNoYWluZWQKLSAgICAgICAgICAgICAgICAgICAgbGlzdCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2ID0gcFBhcmFtc190ZW1wOwotICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKiBQUkVWSUVXX0VOQUJMRUQgKi8KLSAgICAgICAgICAgIC8qIEhlcmUsIHdlIHVuYWxsb2NhdGUgYWxsIEJHTSBjb21wb25lbnRzIGFuZCBwdXQgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgeFZTUy5wQkdNdHJhY2sgdG8gTlVMTCAqLwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlZCB0byBiZSBhYmxlIHRvIG1peCB3aXRoIHZpZGVvIG9ubHkgZmlsZXMgLT4gaW4gY2FzZSBubyBtYXN0ZXIgY2xpcCBpcyBmb3VuZAotICAgIChpLmUgb25seSBKUEcgaW5wdXQgb3IgdmlkZW8gb25seSBpbnB1dCkgKi8KLSAgICAvKiBhbmQgaWYgdGhlcmUgaXMgYSBCR00sIHdlIGZvcmNlIHRoZSBhZGRlZCB2b2x1bWUgdG8gMTAwIChpLmUgcmVwbGFjZSBhdWRpbykgKi8KLQotICAgIGlmKCBtYXN0ZXJDbGlwID09IC0xCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIEluIHRoYXQgY2FzZSwgaXQgbWVhbnMgdGhhdCBubyBpbnB1dCAzR1AgZmlsZSBoYXMgYSB2aWRlbyB0cmFjay4KLSAgICAgICAgVGhlcmVmb3JlLCBpZiBhIG1peGluZyBpcyBhc2tlZCwgaXQgd2lsbCBmYWlsLiBUaHVzLCB3ZSBmb3JjZSByZXBsYWNlIGF1ZGlvLiAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lID0gMTAwOwotICAgIH0KLQotICAgIC8qIFNhdmUgY2xpcCBudW1iZXIgdG8ga25vdyBpZiBhIE00eFZTU19zZW5kQ29tbWFuZCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCAqLwotICAgIHhWU1NfY29udGV4dC0+cHJldmlvdXNDbGlwTnVtYmVyID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsKLQotICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVBbmFseXppbmc7Ci0KLSAgICAvKiBJbiBjYXNlIG9mIE1NUyB1c2UgY2FzZSwgd2UgY29tcHV0ZSBoZXJlIHRoZSBtYXggdmlkZW8gYml0cmF0ZSAqLwotICAgIC8qIEluIGNhc2Ugb2YgdG9vIGxvdyBiaXRyYXRlLCBhIHNwZWNpZmljIHdhcm5pbmcgaXMgcmV0dXJuZWQgKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUgIT0gMCAmJiB0b3RhbER1cmF0aW9uID4gMCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgZmlsZVByb3BlcnRpZXM7Ci0gICAgICAgIE00T1NBX0RvdWJsZSByYXRpbzsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZQotICAgICAgICAgICAgICAgID09IDEwMCApIC8qIFdlIGFyZSBpbiAicmVwbGFjZSBhdWRpbyBtb2RlLCBuZWVkIHRvIGNoZWNrIHRoZSBmaWxldHlwZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBEZWNvZGVkUGF0aDsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlOwotICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBCR00gdHJhY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgLyplcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKHhWU1NfY29udGV4dCwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICB4VlNTLnBCR010cmFjay0+cEZpbGUsICZmaWxlUHJvcGVydGllcyk7Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCBhbiBlcnJvcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBJbXBvc3NpYmxlIHRvIHVzZSBNTVMgbW9kZSB3aXRoIEJHTSAhPSBBTVItTkIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZQotICAgICAgICAgICAgICAgICAgICAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SCi0gICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+RmlsZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX3NlbmRDb21tYW5kOiBCYWQgaW5wdXQgQkdNIGZpbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIHRhcmdldGVkIGJpdHJhdGUsIHdpdGggOCUgbWFyZ2luIChtb292KSAqLwotICAgICAgICBpZiggdG90YWxEdXJhdGlvbiA+IDEwMDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAqIDggKiAwLjg0KSAvICh0b3RhbER1cmF0aW9uIC8gMTAwMCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJlbW92ZSBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPj0gMTIyMDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGUgLT0gMTIyMDA7IC8qIE9ubHkgQU1SIGlzIHN1cHBvcnRlZCBpbiBNTVMgY2FzZSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgYW4gaW5kaWNhdG9yIG9mICJjb21wbGV4aXR5IiBkZXBlbmRpbmcgb24gbmIgb2Ygc2VxdWVuY2VzIGFuZCB0b3RhbCBkdXJhdGlvbiAqLwotICAgICAgICAvKiBUaGUgaGlnaGVzdCBpcyB0aGUgbnVtYmVyIG9mIHNlcXVlbmNlcywgdGhlIG1vcmUgdGhlcmUgYXJlIHNvbWUgSSBmcmFtZXMgKi8KLSAgICAgICAgLyogSW4gdGhhdCBjYXNlLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVkdWNlIHRoZSB0YXJnZXQgYml0cmF0ZSAqLwotICAgICAgICByYXRpbyA9Ci0gICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyCi0gICAgICAgICAgICAqIDEwMDAwMCkgLyAoTTRPU0FfRG91YmxlKSh0b3RhbER1cmF0aW9uKSk7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAgICAgIlJhdGlvIGNsaXBfbmIvZHVyYXRpb24gPSAlZlxuVGFyZ2V0ZWQgYml0cmF0ZSA9ICVkXG5Ub3RhbCBkdXJhdGlvbjogJWQiLAotICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcgotICAgICAgICAgICAgKiAxMDAwMDApIC8gKE00T1NBX0RvdWJsZSkodG90YWxEdXJhdGlvbikpLAotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlLCB0b3RhbER1cmF0aW9uKTsKLQotICAgICAgICBpZiggcmF0aW8gPiA1MCAmJiByYXRpbyA8PSA3NSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBwb3RlbnRpYWwgcmlzayBvZiBoYXZpbmcgYSBoaWdoZXIgZmlsZSBzaXplCi0gICAgICAgICAgICB0aGFuIHNwZWNpZmllZCAqLwotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlIC09IChNNE9TQV9VSW50MzIpKHRhcmdldGVkQml0cmF0ZSAqIDAuMSk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMigKLSAgICAgICAgICAgICAgICAiTmV3IGJpdHJhdGUxICEhXG5SYXRpbyBjbGlwX25iL2R1cmF0aW9uID0gJWZcblRhcmdldGVkIGJpdHJhdGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgcmF0aW8sIHRhcmdldGVkQml0cmF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcmF0aW8gPiA3NSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZSAtPSAoTTRPU0FfVUludDMyKSh0YXJnZXRlZEJpdHJhdGUgKiAwLjE1KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKAotICAgICAgICAgICAgICAgICJOZXcgYml0cmF0ZTIgISFcblJhdGlvIGNsaXBfbmIvZHVyYXRpb24gPSAlZlxuVGFyZ2V0ZWQgYml0cmF0ZSA9ICVkIiwKLSAgICAgICAgICAgICAgICByYXRpbywgdGFyZ2V0ZWRCaXRyYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qQ1IgMzI4MyBNTVMgdXNlIGNhc2UgZm9yIFZBTDoKLSAgICAgICAgRGVjcmVhc2UgdGhlIG91dHB1dCBmaWxlIHNpemUgdG8ga2VlcCBhIG1hcmdpbiBvZiA1JQotICAgICAgICBUaGUgd3JpdGVyIHdpbGwgc3RvcCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQgZmlsZSBzaXplIHdpbGwgYmUgcmVhY2hlZCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplIC09Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSAqIDAuMDUpOwotCi0gICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDMyMDAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gMzIwMDA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPCAzMjAwMCApICAgICAgICAgICAgICAvKjQ4MDAwKSovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDMyMDAwOyAvKjQ4MDAwOyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDQ4MDAwICkgICAgICAgICAgICAgIC8qNjQwMDApKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gNDgwMDA7IC8qNjQwMDA7Ki8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfT1VUUFVURklMRVNJWkVfRVhDRUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlIDwgNjQwMDAgKSAgICAgICAgICAgICAgLyoxMjgwMDApKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gNjQwMDA7IC8qMTI4MDAwOyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlIDwgMTI4MDAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gMTI4MDAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9PVVRQVVRGSUxFU0laRV9FWENFRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDE5MjAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDE5MjAwMDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfT1VUUFVURklMRVNJWkVfRVhDRUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBDYW5ub3QgaGFwcGVuICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IEVycm9yIGluIG91dHB1dCBmaWxlU2l6ZSAhIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IChNNE9TQV9VSW50MzIpdGFyZ2V0ZWRCaXRyYXRlOwotICAgIH0KLQotICAgIGlmKCBiSXNUcmFuc2NvZGluZyApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9UUkFOU0NPRElOR19ORUNFU1NBUlk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TYXZlU3RhcnQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ2hhciogcEZpbGVQYXRoKQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmUgdGhlIHNhdmUKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBjcmVhdGUgM0dQIGVkaXRlZCBmaW5hbCBmaWxlCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FCi0gKiAgICAgICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgdW50aWwKLSAqICAgICAgICAgICAgICAgIGl0IHJldHVybnMgYW5vdGhlciBlcnJvciB0aGFuIE00Tk9fRVJST1IuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBGaWxlUGF0aCAgICAgICAgICAgIChJTikgSWYgdGhlIHVzZXIgd2FudHMgdG8gcHJvdmlkZSBhIGRpZmZlcmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBmaWxlbmFtZSwgZWxzZSBjYW4gYmUgTlVMTCAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0YXJ0KCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkICpwRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qQWRkIGZvciBVVEYgY29udmVyc2lvbjogY29weSB0aGUgcFNldHRpbmdzIHN0cnVjdHVyZSBpbnRvIGEgbmV3IHBDdXJyZW50RWRpdFNldHRpbmdzKi8KLSAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwRWRpdFNhdmluZ1NldHRpbmdzID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX1VJbnQzMiBvZmZzZXQgPSAwOwotICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyA9IDA7Ci0gICAgLypvbmx5IGZvciBVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgIC8qKi8KLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlT3BlbmVkICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1NhdmVTdGFydCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIFJDOiB0byB0ZW1wb3JhcnkgaGFuZGxlIGNoYW5naW5nIG9mIG91dHB1dCBmaWxlcGF0aCAqLwotICAgIC8qIFRPIEJFIENIQU5HRUQgQ0xFQU5MWSBXSVRIIEEgTUFMTE9DL01FTUNQWSAhISEhICovCi0gICAgaWYoIHBGaWxlUGF0aCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qaXQgbWVhbnMgdGhhdCBwT3V0cHV0RmlsZSBoYXMgYmVlbiBhbGxvY2F0ZWQgaW4gTTR4VlNTX3NlbmRDb21tYW5kKCkqLwotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHBGaWxlUGF0aDsKLSAgICAgICAgLypBcyBhbGwgaW5wdXRzIG9mIHRoZSB4VlNTIGFyZSBpbiBVVEY4LCBjb252ZXJ0IHRoZSBvdXRwdXQgZmlsZSBwYXRoIGludG8gdGhlIGN1c3RvbWVyCi0gICAgICAgICBmb3JtYXQqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBGaWxlUGF0aCwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgZmlsZVBhdGhTaXplID0gbGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmaWxlUGF0aFNpemUgKyAxLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1NhdmVTdGFydDogb3V0cHV0IGZpbGUiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUsICh2b2lkICopcERlY29kZWRQYXRoLCBmaWxlUGF0aFNpemUgKyAxKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZVtmaWxlUGF0aFNpemVdID0gJ1wwJzsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0geFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBmaWxlUGF0aFNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKioqLwotCi0gICAgLypGQjogQWRkIGZvciBVVEYgY29udmVyc2lvbjogY29weSB0aGUgcFNldHRpbmdzIHN0cnVjdHVyZSBpbnRvIGEgbmV3IHBDdXJyZW50RWRpdFNldHRpbmdzKi8KLSAgICAvKkl0IGlzIHRoZSBzYW1lIHByaW5jaXBsZSBhcyBpbiB0aGUgUHJldmlld1N0YXJ0KCkqLwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MgPQotICAgICAgICAoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyksCi0gICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIlNhdmluZywgY29weSBvZiBWU1Mgc3RydWN0dXJlIik7Ci0KLSAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IHNldHRpbmdzIGZyb20gaW5wdXQgc3RydWN0dXJlICovCi0gICAgbWVtY3B5KCh2b2lkICopICYocEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUyksCi0gICAgICAgICh2b2lkICopICYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MpLAotICAgICAgICBzaXplb2YoTTR4VlNTX0VkaXRTZXR0aW5ncykpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwRWRpdFNhdmluZ1NldHRpbmdzIHN0cnVjdHVyZSAqLwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKLQotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlID0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcDsgLyogVlNTMi4wIG1hbmRhdG9yeSBwYXJhbWV0ZXIgKi8KLQotICAgIC8qIEFsbG9jYXRlIHNhdmluZ1NldHRpbmdzLnBDbGlwTGlzdC9wVHJhbnNpdGlvbnMgc3RydWN0dXJlICovCi0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0ID0gKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKgotICAgICAgICAqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikKLSAgICAgICAgKnBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciwKLSAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUywgc2F2aW5nICwgY29weSBvZiBwQ2xpcExpc3QiKTsKLQotICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA+IDEgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKgotICAgICAgICAgICAgKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICopCi0gICAgICAgICAgICAqKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpLAotICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUywgc2F2aW5nLCBjb3B5IG9mIHBUcmFuc2l0aW9uTGlzdCIpOwotCi0gICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0gKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyBjbGlwIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGkgPCBwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIKLSAgICAgICAgICAgIC0gMSApIC8qIEJlY2F1c2UgdGhlcmUgaXMgMSBsZXNzIHRyYW5zaXRpb24gdGhhbiBjbGlwIG51bWJlciAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPQotICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzCi0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpLAotICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyB0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgLy8gQWRkIE1QNCBmaWxlIHN1cHBvcnQKLQotICAgICAgICBpZiggKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFApCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDQpCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFYpCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpCi0KLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29weSBkYXRhIGZyb20gZ2l2ZW4gc3RydWN0dXJlIHRvIG91ciBzYXZpbmcgc3RydWN0dXJlICovCi0gICAgICAgICAgICBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLAotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFIC8qIHJlbW92ZSBlZmZlY3RzICovKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZTsKLSAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkCi0gICAgICAgICAgICAgICAgICAgICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIGZyZWUoCi0gICAgICAgICAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUpOwotICAgICAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSAoTTRPU0FfVm9pZAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyB0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIGJlY2F1c2Ugb2YgVVRGIDE2IGNvbnZlcnNpb24qLwotICAgICAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLQotICAgICAgICAgICAgaWYoIGkKLSAgICAgICAgICAgICAgICA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIKLSAgICAgICAgICAgICAgICAtIDEgKSAvKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IEVycm9yIHdoZW4gcGFyc2luZyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldOlwKLSAgICAgICAgICAgICAgICAgQmFkIGZpbGUgdHlwZSIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgdmlkZW8gZWZmZWN0cywgdXNlZCB0byBrbm93IGhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgdG8gYWxsb2NhdGUqLwotICAgIC8qIEZCIDIwMDgvMTAvMTU6IHJlbW92ZWQgOiBub3QgY29tcGF0aWJsZSB3aXRoIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX05vbmUKLSAgICBmb3Ioaj0wO2o8eFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0cztqKyspCi0gICAgewotICAgIGlmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSAhPSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9Ob25lKQotICAgIHsKLSAgICBuYkVmZmVjdHMrKzsKLSAgICB9Ci0gICAgfSovCi0gICAgbmJFZmZlY3RzID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0czsKLQotICAgIC8qIEFsbG9jYXRlIGVmZmVjdHMgc2F2aW5nIHN0cnVjdHVyZSB3aXRoIGNvcnJlY3QgbnVtYmVyIG9mIGVmZmVjdHMgKi8KLSAgICBpZiggbmJFZmZlY3RzICE9IDAgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+RWZmZWN0cyA9Ci0gICAgICAgICAgICAoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5iRWZmZWN0cwotICAgICAgICAgICAgKiBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICopIlNhdmluZyBzZXR0aW5ncywgZWZmZWN0cyB0YWJsZSBvZiBzdHJ1Y3R1cmUgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+RWZmZWN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSnVzdCBjb3B5IGVmZmVjdCBzdHJ1Y3R1cmUgdG8gc2F2aW5nIHN0cnVjdHVyZSwgYXMgZWZmZWN0cyB0aW1lIGFyZSBub3cgKi8KLSAgICAgICAgLyogcmVsYXRpdmUgdG8gb3V0cHV0IGNsaXAgdGltZSovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPkVmZmVjdHMsCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzLAotICAgICAgICAgICAgbmJFZmZlY3RzICogc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5FZmZlY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9Ci0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+bmJFZmZlY3RzID0gbmJFZmZlY3RzOwotCi0gICAgaWYoIHBGaWxlUGF0aCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gcEZpbGVQYXRoOwotICAgIH0KLQotICAgIC8qIFNhdmUgcG9pbnRlciBvZiBzYXZpbmcgdmlkZW8gZWRpdG9yIHRvIHVzZSBpbiBzdGVwIGZ1bmN0aW9uICovCi0gICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyA9IHBFZGl0U2F2aW5nU2V0dGluZ3M7Ci0KLSAgICAvKiBDaGFuZ2Ugb3V0cHV0IGZpbGUgbmFtZSB0byB0ZW1wb3Jhcnkgb3V0cHV0IGZpbGUgbmFtZSwgYmVjYXVzZSBmaW5hbCBmaWxlIHdpbGwgYmUKLSAgICAgZ2VuZXJhdGVkIGJ5IGF1ZGlvIG1peGVyICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0KLSAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwW000WFZTU19NQVhfUEFUSF9MRU5dOwotICAgICAgICBNNE9TQV9DaGFyIG91dF8zZ3BfdG1wW000WFZTU19NQVhfUEFUSF9MRU5dOwotCi0gICAgICAgIC8qKi8KLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPQotICAgICAgICAgICAgKE00eFZTU19CR01TZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0JHTVNldHRpbmdzKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAqKSJTYXZpbmcgc2V0dGluZ3MsIGVmZmVjdHMgdGFibGUgb2Ygc3RydWN0dXJlIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBKdXN0IGNvcHkgZWZmZWN0IHN0cnVjdHVyZSB0byBzYXZpbmcgc3RydWN0dXJlLCBhcyBlZmZlY3RzIHRpbWUgYXJlIG5vdyAqLwotICAgICAgICAvKiByZWxhdGl2ZSB0byBvdXRwdXQgY2xpcCB0aW1lKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2ssCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjaywKLSAgICAgICAgICAgIHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpKTsKLQotICAgICAgICAvKiBBbGxvY2F0ZSBmaWxlIG5hbWUsIGFuZCBjb3B5IGZpbGUgbmFtZSBidWZmZXIgdG8gb3VyIHN0cnVjdHVyZSAqLwotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAoc3RybGVuKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpCi0gICAgICAgICAgICArIDEpLAotICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiU2F2aW5nIHN0cnVjdCB4VlNTIEJHTSBmaWxlIHBhdGgiKTsKLQotICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICBzdHJsZW4oeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSkKLSAgICAgICAgICAgICsgMSk7Ci0KLSAgICAgICAgLypDb3B5IEJHTSB0cmFjayBmaWxlIHBhdGgqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVURiBjb252ZXJzaW9uKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0KLSAgICAgICAgICAgIGZyZWUocEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBUZW1wIGZpbGVuYW1lIGluIGNhc2Ugb2YgQkdNIik7Ci0KLSAgICAgICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKi8KLQotICAgICAgICBNNE9TQV9jaHJOQ29weShvdXRfM2dwLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEpOwotICAgICAgICBNNE9TQV9jaHJOQ29weShvdXRfM2dwX3RtcCwgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxKTsKLQotICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW91dF8zZ3AsIChjb25zdCBjaGFyICopInNhdmV0ZW1wLjNncFwwIiwgMTMpOwotICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0XzNncF90bXAsIChjb25zdCBjaGFyICopInNhdmV0ZW1wLnRtcFwwIiwgMTMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3AsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NhdmVTdGFydDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPQotICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19TYXZlU3RhcnQ6IFRlbXAgZmlsZW5hbWUgaW4gY2FzZSBvZiBCR00iKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IGxlbmd0aCArIDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF8zZ3BfdG1wOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3BfdG1wLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBUZW1wb3JhcnkgZmlsZSIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlLAotICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwotCi0gICAgICAgIC8qIFB1dCBuYiBvZiBzdGVwIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nIHRvIDIsIGJlY2F1c2UgYXVkaW8gbWl4aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsID0gMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qIFB1dCBuYiBvZiBzdGVwIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nIHRvIDEsIGJlY2F1c2Ugbm8gYXVkaW8gbWl4aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsID0gMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqKiovCi0KLSAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAvKiovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgLyogVE9ETzogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFJlaW5pdGlhbGl6ZSBjdXJyZW50IHN0ZXAgbnVtYmVyIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nICovCi0gICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCA9IDA7Ci0KLSAgICAvKiBDaGFuZ2UgeFZTUyBzdGF0ZSAqLwotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVTYXZpbmc7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TYXZlU3RvcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHVuYWxsb2NhdGUgc2F2ZSByZXNzb3VyY2VzIGFuZCBjaGFuZ2UgeFZTUwotICogICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIE00eFZTU19TdGVwIGhhcyByZXR1cm5lZAotICogICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORQotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0b3AoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlU2F2aW5nICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1NhdmVTdG9wIGZ1bmN0aW9uISBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogRnJlZSBzYXZpbmcgc3RydWN0dXJlcyAqLwotICAgIE00eFZTU19pbnRlcm5hbEZyZWVTYXZpbmcoeFZTU19jb250ZXh0KTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlU2F2ZWQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TdGVwKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgZGlmZmVyZW50cyB0YXNrcywgZGVwZW5kaW5nIG9mIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb246Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBhbmFseXNlcyBlZGl0aW5nIHN0cnVjdHVyZSBpZiBjYWxsZWQgYWZ0ZXIgTTR4VlNTX1NlbmRDb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgcHJldmlldyBmaWxlIGlmIGNhbGxlZCBhZnRlciBNNHhWU1NfUHJldmlld1N0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgZmluYWwgZWRpdGVkIGZpbGUgaWYgY2FsbGVkIGFmdGVyIE00eFZTU19TYXZlU3RhcnQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAgICAgICAgICAgICAgICAgKElOL09VVCkgUG9pbnRlciBvbiBhbiBpbnRlZ2VyIGdpdmluZyBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgaW5kaWNhdGlvbiAoYmV0d2VlbiAwLTEwMCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvciwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIGFnYWluCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9QUkVWSUVXX1JFQURZOiAgICBQcmV2aWV3IGZpbGUgaXMgZ2VuZXJhdGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkU6ICAgICAgICBGaW5hbCBlZGl0ZWQgZmlsZSBpcyBnZW5lcmF0ZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTogICAgQW5hbHlzZSBpcyBkb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU3RlcCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCBwVnNzQ3R4dCA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dDsKLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBBdWRpb01peGluZ0N0eHQgPQotICAgICAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDggdWlQcm9ncmVzcyA9IDA7Ci0KLSAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+bV9zdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVTYXZpbmc6Ci0gICAgICAgIC8vY2FzZSBNNHhWU1Nfa1N0YXRlR2VuZXJhdGluZ1ByZXZpZXc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAKLSAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlRWRpdGluZyApIC8qIFZTUyAtPiBjcmVhdGluZyBlZmZlY3RzLCB0cmFuc2l0aW9ucyAuLi4gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBWU1NDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBWc3NDdHh0OwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0U3RlcChwVnNzQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKSAmJiAoZXJyICE9IE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU3RlcDogTTRWU1MzR1BQX2VkaXRTdGVwIHJldHVybmVkIDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSA/ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQICkKLSAgICAgICAgICAgICAgICAgICAgewotI2lmbmRlZiBET19OT1RfUkVNT1ZFX1RFTVBfRklMRVMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHdlIGNhbiBkZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBzdGVwLCBjaGVjayB0aGUgdGVtcCBmaWxlIGlzIG5vdCB1c2Ugc29tZXdoZXJlIGVsc2UgYWZ0ZXIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBjbXBSZXN1bHQgPSAtMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IHBWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPCBwVlNTQ29udGV4dC0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwVlNTQ29udGV4dC0+cENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0uZmlsZVBhdGhTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBWU1NDb250ZXh0LT5wQ2xpcExpc3RbaV0uZmlsZVBhdGhTaXplICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcFJlc3VsdCA9IG1lbWNtcCgodm9pZCAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKHZvaWQgKilwVlNTQ29udGV4dC0+cENsaXBMaXN0W2ldLnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZTU0NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLmZpbGVQYXRoU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNtcFJlc3VsdCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXQgbWVhbnMgd2UgZm91bmQgYSBjb3JyZXNwb25kaW5nIGZpbGUsIHdlIGRvIG5vdCBkZWxldGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY21wUmVzdWx0ICE9IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBDb252ZXJ0ZWRTaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICp0b3RvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgKnBUbXBTdHI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHJlc3VsdCBpbiBVVEY4IHRvIGNoZWNrIGlmIHdlIGNhbiBkZWxldGUgaXQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFZTU0NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLnBGaWxlLCAoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRtcFN0ciA9IHBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdG90byAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzIHRlbXBvcmFyeSBmaWxlcyBjYW4gYmUgaW1nWFhYLjNncCBvciB2aWRYWFguM2dwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJsZW4oKGNvbnN0IGNoYXIgKilwVG1wU3RyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMCk7IC8qIEJlY2F1c2UgdGVtcG9yYXJ5IGZpbGVzIGhhdmUgYSBsZW5ndGggYXQgbW9zdCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFRtcFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopImltZyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0b3RvICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RvID0gKE00T1NBX0NoYXIgKilzdHJzdHIoKGNvbnN0IGNoYXIgKilwVG1wU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopInZpZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVycgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTROT19FUlJPUiApIC8qIEl0IG1lYW5zIHRoZSBmaWxlIGlzIGEgdGVtcG9yYXJ5IGZpbGUsIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gZGVsZXRlIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbcFZTU0NvbnRleHQtPnVpQ3VycmVudENsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qIERPX05PVF9SRU1PVkVfVEVNUF9GSUxFUyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogV2hlbiBhIHN0ZXAgaXMgY29tcGxldGUsIGluY3JlbWVudCBjdXJyZW50U3RlcCBhbmQgcmVzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgdW5sZXNzIHByb2dyZXNzIHdvdWxkIGJlIHdyb25nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZSh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciAgYmxybnhwc3cjMjM0LS0tPiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyo8LS0tLSBGaXggZm9yICBibHJueHBzdyMyMzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuIEF1ZGlvIG1peGluZyBjb21wb25lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZSh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5lZGl0aW5nU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZyApIC8qIEF1ZGlvIG1peGluZzogbWl4L3JlcGxhY2UgYXVkaW8gdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgd2l0aCBnaXZlbiBCR00gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAocEF1ZGlvTWl4aW5nQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkcpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ01haW46IE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAgcmV0dXJuZWQgMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBXaGVuIGEgc3RlcCBpcyBjb21wbGV0ZSwgaW5jcmVtZW50IGN1cnJlbnRTdGVwIGFuZCByZXNldAotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyB1bmxlc3MgcHJvZ3Jlc3Mgd291bGQgYmUgd3JvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3N0ZXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIHN0YXRlIGluIHN0ZXAgZnVuY3Rpb24gISIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlQW5hbHl6aW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rTWljcm9TdGF0ZUFuYWx5c2VQdG8zR1BQICkgLyogUHRvM0dQUCwgYW5hbHlzaW5nIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyA9PSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBUbzNHUFBwYXJhbXNMaXN0OyAvKiBDdXJyZW50IFB0bzNHUFAgUGFyYW1ldGVyIGlzIHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsgLyogQ3VycmVudCBQdG8zR1BQIFBhcmFtZXRlciBpcyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00T1NBX05VTEwgKSAvKiBJdCBtZWFucyB0aGVyZSBpcyBubyBuZXh0IGltYWdlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBzdGVwIHRvIE1DUyBwaGFzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfc3RlcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHl6ZU1DUzsgLyogQ2hhbmdlIEFuYWx5emluZyBtaWNybyBzdGF0ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1MgcGhhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhpcyBmaWxlIGhhcyB0byBiZSBjb252ZXJ0ZWQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCwgd2UganVzdCByZXR1cm4gTTROT19FUlJPUiwgYW5kIGdvIHRvIG5leHQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPmlzQ3JlYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuaW5nIFB0bzNHUFAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQ29udmVydFB0bzNHUFA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVDb252ZXJ0UHRvM0dQUCApIC8qIFB0bzNHUFAsIGNvbnZlcnRpbmcgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00UFRPM0dQUF9TdGVwKHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHByb2dyZXNzIGJhciAqLwotICAgICAgICAgICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDYWxsQmFja0N0eHQtPm1fTmJJbWFnZSA+IDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0LT5tX0ltYWdlQ291bnRlciAqIDEwMCkgLyAoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0LT5tX05iSW1hZ2UgLTEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggZXJyICE9IE00Tk9fRVJST1IpICYmIChlcnIKLSAgICAgICAgICAgICAgICAgICAgICAgICE9ICgoTTRPU0FfVUludDMyKU00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkcpKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPIEJFIENIRUNLRUQgTk8gTEVBS1MgICEhISEhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1N0ZXA6IE00UFRPM0dQUF9TdGVwIHJldHVybmVkIDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBWU1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGVycgotICAgICAgICAgICAgICAgICAgICAgICAgPT0gKChNNE9TQV9VSW50MzIpTTRQVE8zR1BQX1dBUl9FTkRfT0ZfUFJPQ0VTU0lORykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IFdoZW4gYSBzdGVwIGlzIGNvbXBsZXRlLCBpbmNyZW1lbnQgY3VycmVudFN0ZXAgYW5kIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyB1bmxlc3MgcHJvZ3Jlc3Mgd291bGQgYmUgd3JvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFA7IC8qIFdlIGdvIGJhY2sgdG8gYW5hbHl6ZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbmV4dCBmaWxlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJDICEhISEhISEhICovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+aXNDcmVhdGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBUbyBhdm9pZCByZWNvbnZlcnRpbmcgaXQgaWYgYW5vdGhlciBTZW5kQ29tbWFuZCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qU1M6Ymxybnhwc3cjICAyMzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncCByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBWU1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5emVNQ1MgKSAvKiBNQ1M6IGFuYWx5emluZyBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9PSBNNE9TQV9OVUxMIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNQ1NwYXJhbXNMaXN0OyAvKiBDdXJyZW50IE1DUyBQYXJhbWV0ZXIgaXMgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zICE9IE00T1NBX05VTEwgXAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7IC8qIEN1cnJlbnQgTUNTIFBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoZXJlIGlzIG5vIG5leHQgaW1hZ2UgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsgLyogUmVpbml0IEFuYWx5emluZyBtaWNybyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rU3RhdGVPcGVuZWQ7IC8qIENoYW5nZSB4VlNTIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOyAvKiBFbmQgb2YgQW5hbHlzaXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsgLyogUmVpbml0IEFuYWx5emluZyBtaWNybyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa1N0YXRlT3BlbmVkOyAvKiBDaGFuZ2UgeFZTUyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mIEFuYWx5c2lzICovCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGlzIGZpbGUgaGFzIHRvIGJlIHRyYW5zY29kZWQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCwgd2UganVzdCByZXR1cm4gTTROT19FUlJPUiwgYW5kIGdvIHRvIG5leHQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+aXNDcmVhdGVkID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogT3BlbmluZyBNQ1MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiByb3RhdGlvbkRlZ3JlZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nKHhWU1NfY29udGV4dCwgJnJvdGF0aW9uRGVncmVlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcgcmV0dXJuZWRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXggPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT52aWRlb2NsaXBudW1iZXI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXRzIGFyZSBkb25lIGluIHRoZSBNQ1MsIHNvIHdlIG5lZWQgdG8gcmVwbGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJlZ2luQ3V0VGltZSBhbmQgZW5kQ3V0VGltZSB0byBrZWVwIHRoZSBlbnRpcmUgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaW5kZXhdLT51aUVuZEN1dFRpbWUgPSAwOwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcgcmV0dXJuZWQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOyBNQ1MgY29udGV4dDogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVUcmFuc2NvZGVNQ1M7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldGFpbiByb3RhdGlvbiBpbmZvIG9mIHRyaW1tZWQgLyB0cmFuc2NvZGVkIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaW5kZXhdLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudmlkZW9Sb3RhdGlvbkRlZ3JlZXMgPSByb3RhdGlvbkRlZ3JlZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rTWljcm9TdGF0ZVRyYW5zY29kZU1DUyApCi0gICAgICAgICAgICAgICAgICAgIC8qIE1DUzogdHJhbnNjb2RpbmcgZmlsZSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc3RlcCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAvKlNTOmJscm54cHN3IyAgMjM0ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRNQ1NfRVJSX05PTU9SRV9TUEFDRSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUTyBCRSBDSEVDS0VEIE5PIExFQUtTICAhISEhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOiBNNE1DU19zdGVwIHJldHVybmVkIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIE1DUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBlcnIgPT0gTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IFdoZW4gYSBzdGVwIGlzIGNvbXBsZXRlLCBpbmNyZW1lbnQgY3VycmVudFN0ZXAgYW5kIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzIHVubGVzcyBwcm9ncmVzcyB3b3VsZCBiZSB3cm9uZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTOyAvKiBXZSBnbyBiYWNrIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHl6ZSBwYXJhbWV0ZXJzIHRvIHNlZSBpZiB0aGVyZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG5leHQgZmlsZSB0byB0cmFuc2NvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJDICEhISEhISEhISovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5pc0NyZWF0ZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qIFRvIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb252ZXJ0aW5nIGl0IGlmIGFub3RoZXIgU2VuZENvbW1hbmQgaXMgY2FsbGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZyByZXR1cm5lZCAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlID8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJCYWQgbWljcm8gc3RhdGUgaW4gYW5hbHl6aW5nIHN0YXRlIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1N0ZXAgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotZW5kX3N0ZXA6Ci0gICAgLyogQ29tcHV0ZSBwcm9ncmVzc2lvbiAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsICE9IDAgKQotICAgIHsKLSAgICAgICAgKnBQcm9ncmVzcyA9IChNNE9TQV9VSW50OCkoKCAoIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXAgKiAxMDApIFwKLSAgICAgICAgICAgIC8gKHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwpKQotICAgICAgICAgICAgKyAodWlQcm9ncmVzcyAvICh4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsKSkpOwotCi0gICAgICAgIGlmKCAqcFByb2dyZXNzID4gMTAwICkKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDEwMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFByb2dyZXNzID0gMTAwOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfQ2xvc2VDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBjdXJyZW50IGVkaXRpbmcgcHJvZmlsZSwgdW5hbGxvY2F0ZQotICogICAgICAgICAgICAgICAgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgY2FuIGNhbGwgYSBuZXcgTTR4VlNTX1NlbmRDb21tYW5kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19DbG9zZUNvbW1hbmQoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgLyogRGVwZW5kaW5nIG9mIHRoZSBzdGF0ZSwgZGlmZmVyZW50cyB0aGluZ3MgaGF2ZSB0byBiZSBkb25lICovCi0gICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlT3BlbmVkOgotICAgICAgICAgICAgLyogTm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVTYXZpbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlRWRpdGluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXggZm9yIGJscm54cHN3IzIzNC0tLS0+Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0Nsb3NlQ29tbWFuZDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5lZGl0aW5nU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlKHhWU1NfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU0VSUl9OT19NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19DbG9zZUNvbW1hbmQ6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiA8LS0tLUZpeCBmb3IgYmxybnhwc3cjMjM0Ki8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyogV2UgZnJlZSB0aGlzIHBvaW50ZXIgb25seSBpZiBhIEJHTSB0cmFjayBpcyBwcmVzZW50LCBiZWNhdXNlIGluIHRoYXQgY2FzZSwKLSAgICAgICAgICAgICAgICB0aGlzIHBvaW50ZXIgb3ducyB0byB1cyAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApIHsKLSAgICAgICAgICAgICAgICAgICAgLyppZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0qLwotICAgICAgICAgICAgICAgICAgICAvKmlmKE00T1NBX05VTEwgIT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlU2F2ZWQ6Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVBbmFseXppbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlQ29udmVydFB0bzNHUFAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBQdG8zR1BQIG1vZHVsZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiBGaXggZm9yIGJscm54cHN3IzIzNC0tLS0+Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04pICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AgcmV0dXJuZWQgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogPC0tLS0tRml4IGZvciBibHJueHBzdyMyMzQ+Ki8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVUcmFuc2NvZGVNQ1MgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBNQ1MgbW9kdWxlICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX2Fib3J0KHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IE00TUNTX2Fib3J0IHJldHVybmVkIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogPC0tLUZpeCBmb3IgYmxybnhwc3cjMjM0Ki8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX0Nsb3NlQ29tbWFuZCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLQotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVJbml0aWFsaXplZDsgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfQ2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgYWxsIHhWU1MgcmVzc291cmNlcwotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTTR4VlNTX0Nsb3NlQ29tbWFuZC4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0NsZWFuVXAoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX0NsZWFuVXA6ZW50ZXJpbmciKTsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoXAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX0NsZWFuVXAgZnVuY3Rpb24hIFN0YXRlIGlzICVkIixcCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVVEYgY29udmVyc2lvbjogZnJlZSB0ZW1wb3JhcnkgYnVmZmVyKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIpOwotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciA9Ci0gICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLQotICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MpOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1RSQUNFM18wKCJNNHhWU1NfQ2xlYW5VcDpsZWF2aW5nICIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXQgdGhlIHZlcnNpb24gb2YgdGhlIFZpZGVvIFN0dWRpbyAyLjEKLSAqCi0gKiBAcGFyYW0gICAgcFZlcnNpb24gICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHZlcnNpb24gaW5mbyBzdHJ1Y3QKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0dldFZlcnNpb24oIE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbiApCi17Ci0gICAgLyogSnVzdCB1c2VkIGZvciBhIGdyZXAgaW4gY29kZSAqLwotICAgIC8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSAgICBzdGF0aWMgY29uc3QgTTRPU0FfQ2hhciBjVmVyc2lvblsyNl0gPSAiTlhQU1dfVmlkZW9TdHVkaW8yMV8xXzNfMCI7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwVmVyc2lvbiApCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBWZXJzaW9uLT5tX21ham9yID0gTTRfeFZTU19NQUpPUjsKLSAgICBwVmVyc2lvbi0+bV9taW5vciA9IE00X3hWU1NfTUlOT1I7Ci0gICAgcFZlcnNpb24tPm1fcmV2aXNpb24gPSBNNF94VlNTX1JFVklTSU9OOwotICAgIHBWZXJzaW9uLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfVmVyc2lvbkluZm8pOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEFsbG93cyBmaWxsaW5nIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcwotICoKLSAqIEBub3RlICAgIFdBUk5JTkc6IHBDbGlwU2V0dGluZ3MtPkVmZmVjdHNbIF0gd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlICAgICAgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIHBGaWxlICAgICAgICAgICAgICAgKElOKSBDbGlwIGZpbGUgbmFtZQotICogQHBhcmFtICAgZmlsZVBhdGhTaXplICAgICAgICAoSU4pIFNpemUgb2YgdGhlIGNsaXAgcGF0aCAobmVlZGVkIGZvciB0aGUgVVRGMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzKCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcEZpbGUsIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggbmJFZmZlY3RzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzIGNhbGxlZCB3aXRoIHBDbGlwU2V0dGluZ3M9MHglcCIsCi0gICAgICAgIHBDbGlwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3MgaXMgTlVMTCIpOwotCi0gICAgLyogQ3JlYXRlIGluaGVyaXRlZCBWU1MzR1BQIHN0dWZmICovCi0gICAgLyplcnIgPSBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyhwQ2xpcFNldHRpbmdzLCBwRmlsZSxuYkVmZmVjdHMpOyovCi0gICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIChuZWVkZWQgZm9yIFVURiAxNiBjb252ZXJzaW9uKSovCi0gICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5ncywgcEZpbGUsIGZpbGVQYXRoU2l6ZSwKLSAgICAgICAgbmJFZmZlY3RzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyA6XAotICAgICAgICAgICAgICAgICAgICAgICBFUlJPUiBpbiBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgY2xpcCBzZXR0aW5ncyB0byBkZWZhdWx0ICovCi0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy51aUJlZ2luQ3V0UGVyY2VudCA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy51aUVuZEN1dFBlcmNlbnQgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MudWlEdXJhdGlvbiA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5pc1Bhblpvb20gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21Ub3BsZWZ0WGEgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuUGFuWm9vbVRvcGxlZnRZYSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5QYW5ab29tVG9wbGVmdFhiID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21Ub3BsZWZ0WWIgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuUGFuWm9vbVhhID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21YYiA9IDA7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBEdXBsaWNhdGVzIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUsIHBlcmZvcm1pbmcgYWxsb2NhdGlvbnMgaWYgcmVxdWlyZWQKLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc0Rlc3QgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzT3JpZyAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgYkNvcHlFZmZlY3RzICAgICAgICAoSU4pIEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGR1cGxpY2F0ZSBlZmZlY3RzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJDb3B5RWZmZWN0cyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MgY2FsbGVkIHdpdGggZGVzdD0weCVwIHNyYz0weCVwIiwKLSAgICAgICAgcENsaXBTZXR0aW5nc0Rlc3QsIHBDbGlwU2V0dGluZ3NPcmlnKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzRGVzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3NEZXN0IGlzIE5VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc09yaWcpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzT3JpZyBpcyBOVUxMIik7Ci0KLSAgICAvKiBDYWxsIGluaGVyaXRlZCBWU1MzR1BQIGR1cGxpY2F0aW9uICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgIHBDbGlwU2V0dGluZ3NPcmlnLCBiQ29weUVmZmVjdHMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzIDpcCi0gICAgICAgICAgICAgICAgICAgICAgIEVSUk9SIGluIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19GcmVlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBwb2ludGVycyBhbGxvY2F0ZWQgaW4gdGhlIENsaXBTZXR0aW5nIHN0cnVjdHVyZSAocEZpbGUsIEVmZmVjdHMsIC4uLikuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyApCi17Ci0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19GcmVlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzIGlzIE5VTEwiKTsKLQotICAgIC8qIEZyZWUgaW5oZXJpdGVkIFZTUzNHUFAgc3R1ZmYgKi8KLSAgICBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5ncyk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19nZXRNQ1NDb250ZXh0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NvbnRleHQqIG1jc0NvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgTUNTIGNvbnRleHQgd2l0aGluIHRoZSB4VlNTIGludGVybmFsIGNvbnRleHQKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgVlNTIHN0YXRlIGhhcyBtb3ZlZCB0byBhbmFseXppbmcgc3RhdGUgb3IKLSAqIGJleW9uZAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBtY3NDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgbWNzIGNvbnRleHQgdG8gcmV0dXJuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfZ2V0TUNTQ29udGV4dCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0ICptY3NDb250ZXh0ICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19nZXRNQ1NDb250ZXh0OiBwQ29udGV4dCBpcyBOVUxMIik7Ci0KLSAgICBpZiggeFZTU19jb250ZXh0LT5tX3N0YXRlID09IE00eFZTU19rU3RhdGVJbml0aWFsaXplZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2dldE1DU0NvbnRleHQ6IEJhZCBzdGF0ZSEgU3RhdGUgaXMgJWQiLFwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAqbWNzQ29udGV4dCA9IHhWU1NfY29udGV4dC0+cE1DU19DdHh0OwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19nZXRWU1MzR1BQQ29udGV4dChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0KiBtY3NDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFZTUzNHUFAgY29udGV4dCB3aXRoaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBWU1Mgc3RhdGUgaGFzIG1vdmVkIHRvIEdlbmVyYXRpbmcgcHJldmlldwotICogICAgICAgICAgICAgIG9yIGJleW9uZAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHZzczNncHBDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgdnNzM2dwcCBjb250ZXh0IHRvIHJldHVybgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZTUzNHUFBDb250ZXh0KCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0ICp2c3MzZ3BwQ29udGV4dCApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQ6IHBDb250ZXh0IGlzIE5VTEwiKTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPCBNNHhWU1Nfa1N0YXRlU2F2aW5nICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQ6IEJhZCBzdGF0ZSEgU3RhdGUgaXMgJWQiLFwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAqdnNzM2dwcENvbnRleHQgPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQ7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZpZGVvRGVjb2RlckNhcGFiaWxpdGllcyhNNERFQ09ERVJfVmlkZW9EZWNvZGVycyAqKmRlY29kZXJzKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvLyBDYWxsIHRoZSBkZWNvZGVyIGFwaSBkaXJlY3RseQotICAgIC8vIHRvIGdldCBhbGwgdGhlIHZpZGVvIGRlY29kZXIgY2FwYWJsaXRpZXMuCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0VmlkZW9EZWNvZGVyc0FuZENhcGFiaWxpdGllcyhkZWNvZGVycyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX2ludGVybmFsLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19pbnRlcm5hbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NGE2ZjQwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX2ludGVybmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNHhWU1NfaW50ZXJuYWwuYwotICogQGJyaWVmICAgIEludGVybmFsIGZ1bmN0aW9ucyBvZiBleHRlbmRlZCBWaWRlbyBTdHVkaW8gU2VydmljZSAoVmlkZW8gU3R1ZGlvIDIuMSkKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotI2luY2x1ZGUgIk00eFZTU19BUEkuaCIKLSNpbmNsdWRlICJNNHhWU1NfSW50ZXJuYWwuaCIKLQotLypmb3IgcmdiMTYgY29sb3IgZWZmZWN0Ki8KLSNpbmNsdWRlICJNNFZJRklfRGVmaW5lcy5oIgotI2luY2x1ZGUgIk00VklGSV9DbGlwLmgiCi0KLS8qKgotICogY29tcG9uZW50IGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRWRkxfdHJhbnNpdGlvbi5oIiAgICAgICAgICAgIC8qKjwgdmlkZW8gZWZmZWN0cyAqLwotCi0vKiBJbnRlcm5hbCBoZWFkZXIgZmlsZSBvZiBWU1MgaXMgaW5jbHVkZWQgYmVjYXVzZSBvZiBNTVMgdXNlIGNhc2UgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotCi0vKkV4aWYgaGVhZGVyIGZpbGVzIHRvIGFkZCBpbWFnZSByZW5kZXJpbmcgc3VwcG9ydCAoY3JvcHBpbmcsIGJsYWNrIGJvcmRlcnMpKi8KLSNpbmNsdWRlICJNNEVYSUZDX0NvbW1vbkFQSS5oIgotLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotI2RlZmluZSBUUkFOU1BBUkVOVF9DT0xPUiAweDdFMAotCi0vKiBQcm90b3R5cGUgb2YgTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAgZnVuY3Rpb24gKGF2b2lkIGdyZWVuIGVmZmVjdCBvZiB0cmFuc3BhcmVuY3kgY29sb3IpICovCi1NNFZJRklfVUludDggTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLQotLypzcGVjaWFsIE1DUyBmdW5jdGlvbiB1c2VkIG9ubHkgaW4gVmlkZW9BcnRpc3QgYW5kIFZpZGVvU3R1ZGlvIHRvIG9wZW4gdGhlIG1lZGlhIGluIHRoZSBub3JtYWwKLSBtb2RlLiBUaGF0IHdheSB0aGUgbWVkaWEgZHVyYXRpb24gaXMgYWNjdXJhdGUqLwotZXh0ZXJuIE00T1NBX0VSUiBNNE1DU19vcGVuX25vcm1hbE1vZGUoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgSW5wdXRGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBNQ1MgKDNHUCB0cmFuc2NvZGVyKSB3aXRoIHRoZSBnaXZlbgotICogICAgICAgICAgICAgICAgcGFyYW1ldGVycwotICogQG5vdGUgICAgICAgIFRoZSB0cmFuc2NvZGluZyBwYXJhbWV0ZXJzIGFyZSBnaXZlbiBieSB0aGUgaW50ZXJuYWwgeFZTUyBjb250ZXh0LgotICogICAgICAgICAgICAgICAgVGhpcyBjb250ZXh0IGNvbnRhaW5zIGEgcG9pbnRlciBvbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZQotICogICAgICAgICAgICAgICAgY2hhaW5lZCBsaXN0IG9mIE1DUyBwYXJhbWV0ZXJzLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqcm90YXRpb25EZWdyZWUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE1DU19Db250ZXh0IG1jc19jb250ZXh0OwotICAgIE00TUNTX091dHB1dFBhcmFtcyBQYXJhbXM7Ci0gICAgTTRNQ1NfRW5jb2RpbmdQYXJhbXMgUmF0ZXM7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgY2xpcFByb3BzOwotCi0gICAgZXJyID0gTTRNQ1NfaW5pdCgmbWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX2luaXQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX29wZW4obWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlSW4sCi0gICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5JbnB1dEZpbGVUeXBlLAotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlT3V0LAotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX29wZW46IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgY2xpcCBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgZXJyID0gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhtY3NfY29udGV4dCwgJmNsaXBQcm9wcyk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICAqcm90YXRpb25EZWdyZWUgPSBjbGlwUHJvcHMudmlkZW9Sb3RhdGlvbkRlZ3JlZXM7Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsIE1DUyBwYXJhbWV0ZXJzIHdpdGggdGhlIHBhcmFtZXRlcnMgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IGVsZW1lbnQgb2YgdGhlCi0gICAgICAgTUNTIHBhcmFtZXRlcnMgY2hhaW5lZCBsaXN0ICovCi0gICAgUGFyYW1zLk91dHB1dEZpbGVUeXBlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0RmlsZVR5cGU7Ci0gICAgUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0ID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgUGFyYW1zLm91dHB1dFZpZGVvUHJvZmlsZT0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIFBhcmFtcy5vdXRwdXRWaWRlb0xldmVsID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+b3V0cHV0VmlkZW9MZXZlbDsKLSAgICBQYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVNpemUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZTsKLSAgICBQYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVJhdGUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZTsKLSAgICBQYXJhbXMuT3V0cHV0QXVkaW9Gb3JtYXQgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICBQYXJhbXMuT3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotICAgIFBhcmFtcy5iQXVkaW9Nb25vID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+YkF1ZGlvTW9ubzsKLSAgICBQYXJhbXMucE91dHB1dFBDTWZpbGUgPSBNNE9TQV9OVUxMOwotICAgIC8qRkIgMjAwOC8xMC8yMDogYWRkIG1lZGlhIHJlbmRlcmluZyBwYXJhbWV0ZXIgdG8ga2VlcCBhc3BlY3QgcmF0aW8qLwotICAgIHN3aXRjaCh4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5NZWRpYVJlbmRlcmluZykKLSAgICB7Ci0gICAgY2FzZSBNNHhWU1Nfa1Jlc2l6aW5nOgotICAgICAgICBQYXJhbXMuTWVkaWFSZW5kZXJpbmcgPSBNNE1DU19rUmVzaXppbmc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTR4VlNTX2tDcm9wcGluZzoKLSAgICAgICAgUGFyYW1zLk1lZGlhUmVuZGVyaW5nID0gTTRNQ1Nfa0Nyb3BwaW5nOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00eFZTU19rQmxhY2tCb3JkZXJzOgotICAgICAgICBQYXJhbXMuTWVkaWFSZW5kZXJpbmcgPSBNNE1DU19rQmxhY2tCb3JkZXJzOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgLyoqLwotICAgIC8vIG5ldyBwYXJhbXMgYWZ0ZXIgaW50ZWdyYXRpbmcgTUNTIDIuMAotICAgIC8vIFNldCB0aGUgbnVtYmVyIG9mIGF1ZGlvIGVmZmVjdHM7IDAgZm9yIG5vdy4KLSAgICBQYXJhbXMubmJFZmZlY3RzID0gMDsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gZWZmZWN0OyBudWxsIGZvciBub3cuCi0gICAgUGFyYW1zLnBFZmZlY3RzID0gTlVMTDsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gZWZmZWN0OyBudWxsIGZvciBub3cuCi0gICAgUGFyYW1zLmJEaXNjYXJkRXhpZiA9IE00T1NBX0ZBTFNFOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyBlZmZlY3Q7IG51bGwgZm9yIG5vdy4KLSAgICBQYXJhbXMuYkFkanVzdE9yaWVudGF0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgLy8gbmV3IHBhcmFtcyBhZnRlciBpbnRlZ3JhdGluZyBNQ1MgMi4wCi0KLSAgICAvKioKLSAgICAgKiBTZXQgb3V0cHV0IHBhcmFtZXRlcnMgKi8KLSAgICBlcnIgPSBNNE1DU19zZXRPdXRwdXRQYXJhbXMobWNzX2NvbnRleHQsICZQYXJhbXMpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19zZXRPdXRwdXRQYXJhbXM6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgUmF0ZXMuT3V0cHV0VmlkZW9CaXRyYXRlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIFJhdGVzLk91dHB1dEF1ZGlvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBSYXRlcy5CZWdpbkN1dFRpbWUgPSAwOwotICAgIFJhdGVzLkVuZEN1dFRpbWUgPSAwOwotICAgIFJhdGVzLk91dHB1dEZpbGVTaXplID0gMDsKLQotICAgIC8qRkI6IHRyYW5zY29kaW5nIHBlciBwYXJ0cyovCi0gICAgUmF0ZXMuQmVnaW5DdXRUaW1lID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+QmVnaW5DdXRUaW1lOwotICAgIFJhdGVzLkVuZEN1dFRpbWUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5FbmRDdXRUaW1lOwotICAgIFJhdGVzLk91dHB1dFZpZGVvVGltZXNjYWxlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9UaW1lc2NhbGU7Ci0KLSAgICBlcnIgPSBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyhtY3NfY29udGV4dCwgJlJhdGVzKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydChtY3NfY29udGV4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQ6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBNQ1MgY29udGV4dCB0byBiZSBhYmxlIHRvIGNhbGwgTUNTIHN0ZXAgZnVuY3Rpb24gaW4gTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCA9IG1jc19jb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgTUNTICgzR1AgdHJhbnNjb2RlcikKLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IE00TUNTX2Nsb3NlKHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nOiBFcnJvciBpbiBNNE1DU19jbG9zZTogMHgleCIsIGVycik7Ci0gICAgICAgIE00TUNTX2Fib3J0KHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRoaXMgTUNTIGluc3RhbmNlICovCi0gICAgZXJyID0gTTRNQ1NfY2xlYW5VcCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZzogRXJyb3IgaW4gTTRNQ1NfY2xlYW5VcDogMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLSAqIEBicmllZiAgICBJdCBDb3ZlcnRzIGFuZCByZXNpemVzIGEgQVJHQjg4ODggaW1hZ2UgdG8gWVVWNDIwCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGaWxlSW4gICAgICAgICAgICAoSU4pIFRoZSBJbWFnZSBpbnB1dCBmaWxlCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyICAgIChJTikgUG9pbnRlciBvbiBmaWxlc3lzdGVtIGZ1bmN0aW9ucwotICogQHBhcmFtICAgIHBJbWFnZVBsYW5lcyAgICAoSU4vT1VUKSBQb2ludGVyIG9uIFlVVjQyMCBvdXRwdXQgcGxhbmVzIGFsbG9jYXRlZCBieSB0aGUgdXNlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJHQjg4ODggaW1hZ2UgIHdpbGwgYmUgY29udmVydGVkIGFuZCByZXNpemVkICB0byBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotICpAcGFyYW0gICAgd2lkdGggICAgICAgIChJTikgd2lkdGggb2YgdGhlIEFSR0I4ODg4Ci0gKkBwYXJhbSAgICBoZWlnaHQgICAgICAgICAgICAoSU4pIGhlaWdodCBvZiB0aGUgQVJHQjg4ODgKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IG1lbW9yeSBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkKLXsKLSAgICBNNE9TQV9Db250ZXh0IHBBUkdCSW47Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcmdiUGxhbmUxICxyZ2JQbGFuZTI7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZV9hcmdiPSh3aWR0aCAqIGhlaWdodCAqIDQpOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKTsgLy9TaXplIG9mIFJHQjg4OCBkYXRhLgotICAgIE00T1NBX1VJbnQzMiBpID0gMCxqPSAwOwotICAgIE00T1NBX0VSUiBlcnI9TTROT19FUlJPUjsKLQotCi0gICAgTTRPU0FfVUludDggKnBUbXBEYXRhID0gKE00T1NBX1VJbnQ4KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZV9hcmdiLAotICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBhcmdiIGRhdGEiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIEVudGVyaW5nIDoiKTsKLSAgICBpZihwVG1wRGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6XAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIDp3aWR0aCBhbmQgaGVpZ2h0ICVkICVkIiwKLSAgICAgICAgd2lkdGggLGhlaWdodCk7Ci0gICAgLyogR2V0IGZpbGUgc2l6ZSAobWFuZGF0b3J5IGZvciBjaHVuayBkZWNvZGluZykgKi8KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPm9wZW5SZWFkKCZwQVJHQkluLCBwRmlsZUluLCBNNE9TQV9rRmlsZVJlYWQpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIDpcCi0gICAgICAgICAgICBDYW4ndCBvcGVuIGlucHV0IEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBUbXBEYXRhLCAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIENhbid0IGNsb3NlIEFSR0I4ODg4XAotICAgICAgICAgICAgIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgZXJyID0gcEZpbGVSZWFkUHRyLT5jbG9zZVJlYWQocEFSR0JJbik7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgQ2FuJ3QgY2xvc2UgQVJHQjg4ODggXAotICAgICAgICAgICAgIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICByZ2JQbGFuZTEucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIqKSJJbWFnZSBjbGlwIFJHQjg4OCBkYXRhIik7Ci0gICAgaWYocmdiUGxhbmUxLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICAgICByZ2JQbGFuZTEudV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHJnYlBsYW5lMS51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIHJnYlBsYW5lMS51X3N0cmlkZSA9IHdpZHRoKjM7Ci0gICAgICAgIHJnYlBsYW5lMS51X3RvcGxlZnQgPSAwOwotCi0KLSAgICAvKiogUmVtb3ZlIHRoZSBhbHBoYSBjaGFubmVsICovCi0gICAgZm9yIChpPTAsIGogPSAwOyBpIDwgZnJhbWVTaXplX2FyZ2I7IGkrKykgewotICAgICAgICBpZiAoKGkgJSA0KSA9PSAwKSBjb250aW51ZTsKLSAgICAgICAgcmdiUGxhbmUxLnBhY19kYXRhW2pdID0gcFRtcERhdGFbaV07Ci0gICAgICAgIGorKzsKLSAgICB9Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotCi0gICAgLyogVG8gQ2hlY2sgaWYgcmVzaXppbmcgaXMgcmVxdWlyZWQgd2l0aCBjb2xvciBjb252ZXJzaW9uICovCi0gICAgaWYod2lkdGggIT0gcEltYWdlUGxhbmVzLT51X3dpZHRoIHx8IGhlaWdodCAhPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIFJlc2l6aW5nIDoiKTsKLSAgICAgICAgZnJhbWVTaXplID0gICggcEltYWdlUGxhbmVzLT51X3dpZHRoICogcEltYWdlUGxhbmVzLT51X2hlaWdodCAqIDMpOwotICAgICAgICByZ2JQbGFuZTIucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplLCBNNFZTLAotICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwotICAgICAgICBpZihyZ2JQbGFuZTIucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgICAgICByZ2JQbGFuZTIudV9oZWlnaHQgPSAgcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgIHJnYlBsYW5lMi51X3dpZHRoID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgcmdiUGxhbmUyLnVfc3RyaWRlID0gcEltYWdlUGxhbmVzLT51X3dpZHRoKjM7Ci0gICAgICAgICAgICByZ2JQbGFuZTIudV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAvKiBSZXNpemluZyBSR0I4ODggdG8gUkdCODg4ICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsICZyZ2JQbGFuZTEsICZyZ2JQbGFuZTIpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJlc2l6ZSBSR0I4ODggdG8gUkdCODg4OiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTIucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAvKkNvbnZlcnRpbmcgUmVzaXplZCBSR0I4ODggdG8gWVVWNDIwICovCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUyLCBwSW1hZ2VQbGFuZXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQjg4OCB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJSR0IgdG8gWVVWIGRvbmUiKTsKLQotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBOTyAgUmVzaXppbmcgOiIpOwotICAgICAgICBlcnIgPSBNNFZJRklfUkdCODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lMSwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJSR0IgdG8gWVVWIGRvbmUiKTsKLSAgICB9Ci1jbGVhbnVwOgotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBsZWF2aW5nIDoiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGhlaWdodCk7Ci0gKiBAYnJpZWYgICAgSXQgQ292ZXJ0cyBhIEFSR0I4ODg4IGltYWdlIHRvIFlVVjQyMAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRmlsZUluICAgICAgICAgICAgKElOKSBUaGUgSW1hZ2UgaW5wdXQgZmlsZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ciAgICAoSU4pIFBvaW50ZXIgb24gZmlsZXN5c3RlbSBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMgICAgKElOL09VVCkgUG9pbnRlciBvbiBZVVY0MjAgb3V0cHV0IHBsYW5lcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0I4ODg4IGltYWdlICB3aWxsIGJlIGNvbnZlcnRlZCBhbmQgcmVzaXplZCAgdG8gb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotICogQHBhcmFtICAgIHdpZHRoICAgICAgICAoSU4pIHdpZHRoIG9mIHRoZSBBUkdCODg4OAotICogQHBhcmFtICAgIGhlaWdodCAgICAgICAgICAgIChJTikgaGVpZ2h0IG9mIHRoZSBBUkdCODg4OAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogbWVtb3J5IGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSoqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqeXV2UGxhbmUgPSBNNE9TQV9OVUxMOwotCi0gICAgeXV2UGxhbmUgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKLSAgICBpZih5dXZQbGFuZSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6XAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHl1dlBsYW5lWzBdLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgIHl1dlBsYW5lWzBdLnVfd2lkdGggPSB3aWR0aDsKLSAgICB5dXZQbGFuZVswXS51X3N0cmlkZSA9IHdpZHRoOwotICAgIHl1dlBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgeXV2UGxhbmVbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoeXV2UGxhbmVbMF0udV9oZWlnaHQgXAotICAgICAgICAqIHl1dlBsYW5lWzBdLnVfd2lkdGggKiAxLjUsIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0KLSAgICB5dXZQbGFuZVsxXS51X2hlaWdodCA9IHl1dlBsYW5lWzBdLnVfaGVpZ2h0ID4+MTsKLSAgICB5dXZQbGFuZVsxXS51X3dpZHRoID0geXV2UGxhbmVbMF0udV93aWR0aCA+PiAxOwotICAgIHl1dlBsYW5lWzFdLnVfc3RyaWRlID0geXV2UGxhbmVbMV0udV93aWR0aDsKLSAgICB5dXZQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgIHl1dlBsYW5lWzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKHl1dlBsYW5lWzBdLnBhY19kYXRhICsgeXV2UGxhbmVbMF0udV9oZWlnaHQgXAotICAgICAgICAqIHl1dlBsYW5lWzBdLnVfd2lkdGgpOwotCi0gICAgeXV2UGxhbmVbMl0udV9oZWlnaHQgPSB5dXZQbGFuZVswXS51X2hlaWdodCA+PjE7Ci0gICAgeXV2UGxhbmVbMl0udV93aWR0aCA9IHl1dlBsYW5lWzBdLnVfd2lkdGggPj4gMTsKLSAgICB5dXZQbGFuZVsyXS51X3N0cmlkZSA9IHl1dlBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgeXV2UGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICB5dXZQbGFuZVsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSh5dXZQbGFuZVsxXS5wYWNfZGF0YSArIHl1dlBsYW5lWzFdLnVfaGVpZ2h0IFwKLSAgICAgICAgKiB5dXZQbGFuZVsxXS51X3dpZHRoKTsKLSAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCggcEZpbGVJbixwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2UGxhbmUsIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIHJldHVybiBlcnJvcjogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgZnJlZSh5dXZQbGFuZSk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgICAgICpwSW1hZ2VQbGFuZXMgPSB5dXZQbGFuZTsKLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMCA6TGVhdmluZyIpOwotICAgIHJldHVybiBlcnI7Ci0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdCAoTTRPU0FfVm9pZCogcFBpY3R1cmVDdHh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFBpY3R1cmVEdXJhdGlvbik7Ci0gKiBAYnJpZWYgICAgSXQgZmVlZHMgdGhlIFBUTzNHUFAgd2l0aCBZVVY0MjAgcGljdHVyZXMuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIGdpdmVuIHRvIHRoZSBQVE8zR1BQIGluIHRoZSBNNFBUTzNHUFBfUGFyYW1zIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcwotICogQHBhcmFtICAgIHBQaWN0dXJlRHVyYXRpb24oT1VUKSBEdXJhdGlvbiBvZiB0aGUgcmV0dXJuZWQgcGljdHVyZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU6IFRoZSByZXR1cm5lZCBpbWFnZSBpcyB0aGUgbGFzdCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdChNNE9TQV9Wb2lkKiBwUGljdHVyZUN0eHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRG91YmxlKiBwUGljdHVyZUR1cmF0aW9uKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQ4ICAgIGxhc3RfZnJhbWVfZmxhZyA9IDA7Ci0gICAgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQqIHBDID0gKE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0KikgKHBQaWN0dXJlQ3R4dCk7Ci0KLSAgICAvKlVzZWQgZm9yIHBhbiZ6b29tKi8KLSAgICBNNE9TQV9VSW50OCB0ZW1wUGFuem9vbVhhID0gMDsKLSAgICBNNE9TQV9VSW50OCB0ZW1wUGFuem9vbVhiID0gMDsKLSAgICBNNEFJUl9QYXJhbXMgUGFyYW1zOwotICAgIC8qKi8KLQotICAgIC8qVXNlZCBmb3IgY3JvcHBpbmcgYW5kIGJsYWNrIGJvcmRlcnMqLwotICAgIE00T1NBX0NvbnRleHQgICAgcFBpY3R1cmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgcGljdHVyZVNpemUgPSAwIDsKLSAgICBNNE9TQV9VSW50OCogICAgcGljdHVyZUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgLy9NNEVYSUZDX0NvbnRleHQgcEV4aWZDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNEVYSUZDX0Jhc2ljVGFncyBwQmFzaWNUYWdzOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lczEgPSBwSW1hZ2VQbGFuZXNbMF07Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcEltYWdlUGxhbmVzMiA9IHBJbWFnZVBsYW5lc1sxXTsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXMzID0gcEltYWdlUGxhbmVzWzJdOwotICAgIC8qKi8KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBQaWN0dXJlQ3R4dCksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcFBpY3R1cmVDdHh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBJbWFnZVBsYW5lcyksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcEltYWdlUGxhbmVzIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBQaWN0dXJlRHVyYXRpb24pLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcFBpY3R1cmVEdXJhdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgOkVudGVyaW5nIik7Ci0gICAgLypQUiBQNE1FMDAwMDMxODEgSW4gY2FzZSB0aGUgaW1hZ2UgbnVtYmVyIGlzIDAsIHBhbiZ6b29tIGNhbiBub3QgYmUgdXNlZCovCi0gICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tICYmIHBDLT5tX05iSW1hZ2UgPT0gMCkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20gPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSAgICAvKklmIG5vIGNyb3BwaW5nL2JsYWNrIGJvcmRlcnMgb3IgcGFuJnpvb20sIGp1c3QgZGVjb2RlIGFuZCByZXNpemUgdGhlIHBpY3R1cmUqLwotICAgIGlmKHBDLT5tX21lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcgJiYgTTRPU0FfRkFMU0UgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGFuZCByZXNpemUgaW5wdXQgQVJHQjg4ODggZmlsZSB0byBZVVY0MjAgKi8KLSAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgMTogd2lkdGggYW5kIGhlZ2h0ICVkICVkIiwKLSAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAocEMtPm1fRmlsZUluLAotICAgICAgICAgICAgIHBDLT5tX3BGaWxlUmVhZFB0ciwgcEltYWdlUGxhbmVzLHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCwKLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGRlY29kaW5nIEpQRUc6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qSW4gY2FzZSBvZiBjcm9wcGluZywgYmxhY2sgYm9yZGVycyBvciBwYW4mem9vbSwgY2FsbCB0aGUgRVhJRiByZWFkZXIgYW5kIHRoZSBBSVIqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wdXRlcyByYXRpb3MgKi8KLSAgICAgICAgaWYocEMtPm1fcERlY29kZWRQbGFuZSA9PSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENvbnZlcnQgaW5wdXQgQVJHQjg4ODggZmlsZSB0byBZVVY0MjAgKi8KLSAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdCAyOiB3aWR0aCBhbmQgaGVnaHQgJWQgJWQiLAotICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4OHRvWVVWNDIwKHBDLT5tX0ZpbGVJbiwgcEMtPm1fcEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICYocEMtPm1fcERlY29kZWRQbGFuZSkscEMtPm1fcFB0bzNHUFBwYXJhbXMtPndpZHRoLHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5oZWlnaHQpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gZGVjb2RpbmcgSlBFRzogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wRGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBZVVY0MjAgcGxhbmFyIGlzIHJldHVybmVkIGJ1dCBhbGxvY2F0aW9uIGlzIG1hZGUgb25seSBvbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29udGlnb3VzIHBsYW5lcyBpbiBtZW1vcnkpICovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZS0+cGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLypJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aDsKLSAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgUGFyYW1zLm1fYk91dHB1dFN0cmlwZSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRPcmllbnRhdGlvbiA9IE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ7Ci0KLSAgICAgICAgLypJbml0aWFsaXplIEV4aWYgcGFyYW1zIHN0cnVjdHVyZSovCi0gICAgICAgIHBCYXNpY1RhZ3Mub3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOwotCi0gICAgICAgIC8qKgotICAgICAgICBQYW4mem9vbSBwYXJhbXMqLwotICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qU2F2ZSByYXRpbyB2YWx1ZXMsIHRoZXkgY2FuIGJlIHJldXNlZCBpZiB0aGUgbmV3IHJhdGlvcyBhcmUgMCovCi0gICAgICAgICAgICB0ZW1wUGFuem9vbVhhID0gKE00T1NBX1VJbnQ4KXBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGE7Ci0gICAgICAgICAgICB0ZW1wUGFuem9vbVhiID0gKE00T1NBX1VJbnQ4KXBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGI7Ci0gICAgICAgICAgICAvKkNoZWNrIHRoYXQgdGhlIHJhdGlvIGlzIG5vdCAwKi8KLSAgICAgICAgICAgIC8qQ2hlY2sgKGEpIHBhcmFtZXRlcnMqLwotICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG1heFJhdGlvID0gMDsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA+PQotICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYSkKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpcyBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsgdGVtcFBhbnpvb21YYSA+IDEwMDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG92ZXJzaXplIGlzIG1heFJhdGlvKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFJhdGlvID0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgKyB0ZW1wUGFuem9vbVhhIC0gMTAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYSkKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaXMgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArIHRlbXBQYW56b29tWGEgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdmVyc2l6ZSBpcyBtYXhSYXRpbyovCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSYXRpbyA9IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhICsgdGVtcFBhbnpvb21YYSAtIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypNb2RpZnkgdGhlIChhKSBwYXJhbWV0ZXJzOiovCi0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPj0gbWF4UmF0aW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSAoYSkgdG9wbGVmdCBwYXJhbWV0ZXJzIGNhbiBiZSBtb3ZlZCB0byBrZWVwIHRoZSBzYW1lIGFyZWEgc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhIC09IG1heFJhdGlvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1vdmUgdGhlIChhKSB0b3BsZWZ0IHBhcmFtZXRlciB0byAwIGJ1dCB0aGUgcmF0aW8gd2lsbCBiZSBhbHNvIGZ1cnRoZXIKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGEpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYSkgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCB0byBtYXRjaCB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypUaGUgbmV3IHJhdGlvIGlzIHRoZSBvcmlnaW5hbCBvbmUqLwotICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgPSB0ZW1wUGFuem9vbVhhOwotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgKyBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA+IDEwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkNoYW5nZSB0aGUgcmF0aW8gaWYgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChhKSBwYXJhbWV0ZXJzIGlzCi0gICAgICAgICAgICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSA9IDEwMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSArIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID4gMTAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qQ2hhbmdlIHRoZSByYXRpbyBpZiB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGEpIHBhcmFtZXRlcnMgaXMKLSAgICAgICAgICAgICAgICAgICAgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhID0gMTAwMCAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qQ2hlY2sgKGIpIHBhcmFtZXRlcnMqLwotICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG1heFJhdGlvID0gMDsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiA+PQotICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYikKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaXMgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiArIHRlbXBQYW56b29tWGIgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdmVyc2l6ZSBpcyBtYXhSYXRpbyovCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSYXRpbyA9IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiICsgdGVtcFBhbnpvb21YYiAtIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgcmF0aW8gaXMgMCwgdGhhdCBtZWFucyB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGIpCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgKyB0ZW1wUGFuem9vbVhiID4gMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3ZlcnNpemUgaXMgbWF4UmF0aW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmF0aW8gPSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiArIHRlbXBQYW56b29tWGIgLSAxMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qTW9kaWZ5IHRoZSAoYikgcGFyYW1ldGVyczoqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGIpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYikgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCB0byBtYXRjaCB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPj0gbWF4UmF0aW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSAoYikgdG9wbGVmdCBwYXJhbWV0ZXJzIGNhbiBiZSBtb3ZlZCB0byBrZWVwIHRoZSBzYW1lIGFyZWEgc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliIC09IG1heFJhdGlvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1vdmUgdGhlIChiKSB0b3BsZWZ0IHBhcmFtZXRlciB0byAwIGJ1dCB0aGUgcmF0aW8gd2lsbCBiZSBhbHNvIGZ1cnRoZXIKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qVGhlIG5ldyByYXRpbyBpcyB0aGUgb3JpZ2luYWwgb25lKi8KLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiID0gdGVtcFBhbnpvb21YYjsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiICsgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgPiAxMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypDaGFuZ2UgdGhlIHJhdGlvIGlmIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYikgcGFyYW1ldGVycyBpcwotICAgICAgICAgICAgICAgICAgICBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgPSAxMDAwIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgKyBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiA+IDEwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkNoYW5nZSB0aGUgcmF0aW8gaWYgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChiKSBwYXJhbWV0ZXJzIGlzCi0gICAgICAgICAgICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9IDEwMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29tcHV0ZXMgQUlSIHBhcmFtZXRlcnMgKi8KLS8qICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9VSW50MzIpKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKgotICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiIFwKLSAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX1VJbnQzMikocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKgotICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliXAotICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0KLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoTTRPU0FfVUludDMyKShwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0KLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gIChNNE9TQV9VSW50MzIpKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0gKi8KLSAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgdXNpbmcgcEMtPm1fTmJJbWFnZSB3ZSBoYXZlIHRvIHVzZSAocEMtPm1fTmJJbWFnZS0xKSBhcyBwQy0+bV9JbWFnZUNvdW50ZXIKLSAgICAgICAgICAgIC8vIHdpbGwgYmUgeC0xIG1heCBmb3IgeCBuby4gb2YgZnJhbWVzCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9VSW50MzIpKCgoKE00T1NBX0RvdWJsZSlwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgKwotICAgICAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiXAotICAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSkgKgotICAgICAgICAgICAgICAgIHBDLT5tX0ltYWdlQ291bnRlcikgLyAoTTRPU0FfRG91YmxlKXBDLT5tX05iSW1hZ2UtMSkpIC8gMTAwMCkpOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPQotICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoKChNNE9TQV9Eb3VibGUpcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKgotICAgICAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArCi0gICAgICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWJcCi0gICAgICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhKSAqCi0gICAgICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZS0xKSkgLyAxMDAwKSk7Ci0KLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCgoTTRPU0FfRG91YmxlKXBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKgotICAgICAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKShwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiXAotICAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZS0xKSkgLyAxMDAwKSk7Ci0KLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCgoKE00T1NBX0RvdWJsZSlwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgKwotICAgICAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgXAotICAgICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEpICoKLSAgICAgICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlLTEpKSAvIDEwMDApKTsKLQotICAgICAgICAgICAgaWYoKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoICsgUGFyYW1zLm1faW5wdXRDb29yZC5tX3gpXAotICAgICAgICAgICAgICAgICA+IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIFwKLSAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dENvb3JkLm1feDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCArIFBhcmFtcy5tX2lucHV0Q29vcmQubV95KVwKLSAgICAgICAgICAgICAgICAgPiBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRDb29yZC5tX3k7Ci0gICAgICAgICAgICB9Ci0KLQotCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgfQotCi0KLQotICAgIC8qKgotICAgICAgICBQaWN0dXJlIHJlbmRlcmluZzogQmxhY2sgYm9yZGVycyovCi0KLSAgICAgICAgaWYocEMtPm1fbWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1swXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzWzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHQqcEltYWdlUGxhbmVzWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICBGaXJzdCB3aXRob3V0IHBhbiZ6b29tKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKHBCYXNpY1RhZ3Mub3JpZW50YXRpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOgotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRPcmllbnRhdGlvbiA9IE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbUxlZnQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpIDw9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPCBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qbnVtYmVyIG9mIGxpbmVzIGF0IHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KT4+MSkpKnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzWzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyB3aWR0aCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzLT51X2hlaWdodCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzJdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpIDwgcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKml0IGlzIGhlaWdodCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIHRvcCBhbmQgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJvdHRvbSBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkpPj4xKSpwSW1hZ2VQbGFuZXNbMF0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEltYWdlUGxhbmVzWzJdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKml0IGlzIHdpZHRoIHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzJdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgIFNlY29uZGx5IHdpdGggcGFuJnpvb20qLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaChwQmFzaWNUYWdzLm9yaWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93bjoKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tUmlnaHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgICAgICAgICAvKk5PIFJPVEFUSU9OKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICogcEltYWdlUGxhbmVzLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCkgPD0gcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA8IFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIG91dHB1dCB2aWRlbyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gb3V0cHV0IGhlaWdodCBpZiB0aGUgaW5wdXQgaW1hZ2UgYXNwZWN0IHJhdGlvIGlzIGtlcHQgYW5kIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IHdpZHRoIGlzIHRoZSBzY3JlZW4gd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBJbnB1dFNpemVIZWlnaHRNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0gKHRlbXBPdXRwdXRTaXplSGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIGlucHV0IGhlaWdodCBhY2NvcmRpbmcgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BvcnRpb25hbCB0byB0aGUgbWF4aW11bSBvdXRwdXQgaGVpZ2h0KSovCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHBJbWFnZVBsYW5lcy0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkvdGVtcE91dHB1dFNpemVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHRlbXBJbnB1dFNpemVIZWlnaHRNYXg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBjb250YWluZWQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGltYWdlIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGNvbnRhaW5lZCBpbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIGhlaWdodCB3aWxsIGJlIHRoZSBtYXhpbXVtIHBvc3NpYmxlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV95Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZUhlaWdodE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3lcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGlucHV0IHBhbiB6b29tIGFyZWEgY2FuIGJlIGV4dGVuZGVkIHN5bW1ldHJpY2FsbHkgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCBhbmQgYm90dG9tIHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSAtPSAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihQYXJhbXMubV9pbnB1dENvb3JkLm1feSA8IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV95ICsgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBhYm92ZSB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBiZWxvdyB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSBib3R0b20qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGVtcElucHV0U2l6ZUhlaWdodE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgaGVpZ2h0IG9mIHRoZSBBSVIgaXMgdGhlIG1heGltdW0gcG9zc2libGUgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgaGVpZ2h0IG9mIHRoZSBBSVIgaXMgYWxsIHRoZSBpbnB1dCBpbWFnZSBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVtcE91dHB1dFNpemVIZWlnaHQqcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkqcEltYWdlUGxhbmVzWzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1syXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCB3aWR0aCBpZiB0aGUgaW5wdXQgaW1hZ2UgYXNwZWN0IHJhdGlvIGlzIGtlcHQgYW5kIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBPdXRwdXRTaXplV2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzLT51X2hlaWdodCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0V2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3V0cHV0IGhlaWdodCBpcyB0aGUgc2NyZWVuIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRTaXplV2lkdGggPSAodGVtcE91dHB1dFNpemVXaWR0aD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qTWF4aW11bSBpbnB1dCB3aWR0aCBhY2NvcmRpbmcgdG8gdGhlIG1heGltdW0gb3V0cHV0IHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAocHJvcG9ydGlvbmFsIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV93aWR0aCpQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC90ZW1wT3V0cHV0U2l6ZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gKHRlbXBJbnB1dFNpemVXaWR0aE1heD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgd2lkdGggaXMgY29udGFpbmVkIGludG8gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGVtcElucHV0U2l6ZVdpZHRoTWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIHdpZHRoIHdpbGwgYmUgdGhlIG1heGltdW0gcG9zc2libGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV94Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgcGFuIHpvb20gYXJlYSBjYW4gYmUgZXh0ZW5kZWQgc3ltbWV0cmljYWxseSBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCBhbmQgbGVmdCBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggLT0gKCh0ZW1wSW5wdXRTaXplV2lkdGhNYXhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0Q29vcmQubV94IDwgcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feCArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBhYm92ZSB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgbGVmdCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGVyZSBpcyBub3QgZW5vdWdoIHBsYWNlIGJlbG93IHRoZSBpbnB1dCBwYW4gem9vbSBhcmVhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSByaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRlbXBJbnB1dFNpemVXaWR0aE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSB0ZW1wSW5wdXRTaXplV2lkdGhNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyBhbGwgdGhlIGlucHV0IGltYWdlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wT3V0cHV0U2l6ZVdpZHRoKnBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgICAgICAvKlJPVEFUSU9OKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCkgPCBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID4gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCBoZWlnaHQgaWYgdGhlIGlucHV0IGltYWdlIGFzcGVjdCByYXRpbyBpcyBrZXB0IGFuZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcE91dHB1dFNpemVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBJbnB1dFNpemVIZWlnaHRNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcE91dHB1dFNpemVIZWlnaHQgPSAodGVtcE91dHB1dFNpemVIZWlnaHQ+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gaW5wdXQgaGVpZ2h0IGFjY29yZGluZyB0byB0aGUgbWF4aW11bSBvdXRwdXQgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3J0aW9uYWwgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZUhlaWdodE1heCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQqUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdGVtcE91dHB1dFNpemVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHRlbXBJbnB1dFNpemVIZWlnaHRNYXg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBjb250YWluZWQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgaW1hZ2Ugd2lkdGggKHJvdGF0aW9uIGluY2x1ZGVkKSovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgY29udGFpbmVkIGluIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoIChyb3RhdGlvbiBpbmNsdWRlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIHdpZHRoIHdpbGwgYmUgdGhlIG1heGltdW0gcG9zc2libGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgodGVtcElucHV0U2l6ZUhlaWdodE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBQYXJhbXMubV9pbnB1dENvb3JkLm1feAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLShQYXJhbXMubV9pbnB1dENvb3JkLm1feCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCBwYW4gem9vbSBhcmVhIGNhbiBiZSBleHRlbmRlZCBzeW1tZXRyaWNhbGx5IG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgYW5kIGxlZnQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94IC09ICgodGVtcElucHV0U2l6ZUhlaWdodE1heCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPCBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV94ICsgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGVyZSBpcyBub3QgZW5vdWdoIHBsYWNlIG9uIHRoZSBsZWZ0IG9mIHRoZSBpbnB1dCBwYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSBhcmVhIHRvIGV4dGVuZCBpdCBzeW1tZXRyaWNhbGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBleHRlbmQgaXQgdG8gdGhlIG1heGltdW0gb24gdGhlIGxlZnQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBvbiB0aGUgcmlnaHQgb2YgdGhlIGlucHV0IHBhbiB6b29tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhIHRvIGV4dGVuZCBpdCBzeW1tZXRyaWNhbGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBleHRlbmQgaXQgdG8gdGhlIG1heGltdW0gb24gdGhlIHJpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLSB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCB3aWR0aCBvZiB0aGUgQUlSIGlzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHRlbXBJbnB1dFNpemVIZWlnaHRNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgZ3JlYXRlciB0aGFuIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoIChyb3RhdGlvbiBpbmNsdWRlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyBhbGwgdGhlIGlucHV0IGltYWdlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wT3V0cHV0U2l6ZUhlaWdodCpwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpKT4+MSkqcEltYWdlUGxhbmVzWzBdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW1hZ2VQbGFuZXNbMV0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1syXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIG91dHB1dCB2aWRlbyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gb3V0cHV0IHdpZHRoIGlmIHRoZSBpbnB1dCBpbWFnZSBhc3BlY3QgcmF0aW8gaXMga2VwdCBhbmQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IHdpZHRoIGlzIHRoZSBzY3JlZW4gaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wRmluYWxJbnB1dFdpZHRoID0gMCwgdGVtcEZpbmFsT3V0cHV0V2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3V0cHV0IGhlaWdodCBpcyB0aGUgc2NyZWVuIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0PSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0gKHRlbXBPdXRwdXRTaXplV2lkdGg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gaW5wdXQgd2lkdGggYWNjb3JkaW5nIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3J0aW9uYWwgdG8gdGhlIG1heGltdW0gb3V0cHV0IHdpZHRoKSovCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPQotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV93aWR0aCpQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpL3RlbXBPdXRwdXRTaXplV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPSAodGVtcElucHV0U2l6ZVdpZHRoTWF4Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW50byB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQgKHJvdGF0aW9uIGluY2x1ZGVkKSovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplV2lkdGhNYXggPD0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGhlaWdodCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgbm8gYmxhY2sgYm9yZGVycywgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgd2lsbCBiZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhlIGlucHV0IEFJUiBoZWlnaHQgd2lsbCBiZSB0aGUgbWF4aW11bSBwb3NzaWJsZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCh0ZW1wSW5wdXRTaXplV2lkdGhNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV95Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgcGFuIHpvb20gYXJlYSBjYW4gYmUgZXh0ZW5kZWQgc3ltbWV0cmljYWxseSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmlnaHQgYW5kIGxlZnQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95IC09ICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPCBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feSArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2Ugb24gdGhlIHRvcCBvZiB0aGUgaW5wdXQgcGFuIHpvb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBvbiB0aGUgYm90dG9tIG9mIHRoZSBpbnB1dCBwYW4gem9vbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSBib3R0b20qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGVtcElucHV0U2l6ZVdpZHRoTWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCBoZWlnaHQgb2YgdGhlIEFJUiBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IHRlbXBJbnB1dFNpemVXaWR0aE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5wdXRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGhlaWdodCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgYmxhY2sgYm9yZGVycyBhcmUgbmVjZXNzYXJ5IHRvIGtlZXAgYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlucHV0IGhlaWdodCBvZiB0aGUgQUlSIGlzIGFsbCB0aGUgaW5wdXQgaW1hZ2UgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbXBPdXRwdXRTaXplV2lkdGgqcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypXaWR0aCBhbmQgaGVpZ2h0IGhhdmUgdG8gYmUgZXZlbiovCi0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSAocEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgLypDaGVjayB0aGF0IHZhbHVlcyBhcmUgY29oZXJlbnQqLwotICAgICAgICAgICAgaWYoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID09IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgIFBpY3R1cmUgcmVuZGVyaW5nOiBSZXNpemluZyBhbmQgQ3JvcHBpbmcqLwotICAgICAgICBpZihwQy0+bV9tZWRpYVJlbmRlcmluZyAhPSBNNHhWU1Nfa0JsYWNrQm9yZGVycykKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKHBCYXNpY1RhZ3Mub3JpZW50YXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQ6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbVJpZ2h0OgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbToKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3A6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICBQaWN0dXJlIHJlbmRlcmluZzogQ3JvcHBpbmcqLwotICAgICAgICBpZihwQy0+bV9tZWRpYVJlbmRlcmluZyA9PSBNNHhWU1Nfa0Nyb3BwaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDxQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBIZWlnaHQgPSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgLypoZWlnaHQgd2lsbCBiZSBjcm9wcGVkKi8KLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAgKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgXAotICAgICAgICAgICAgICAgICAgICAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKTsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgKz0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAgICAgKCh0ZW1wSGVpZ2h0IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSk+PjEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcFdpZHRoPSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAvKndpZHRoIHdpbGwgYmUgY3JvcHBlZCovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAgKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICogUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMilcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggKz0gKE00T1NBX0ludDMyKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKE00T1NBX0ludDMyKSh0ZW1wV2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICBpZihNNE9TQV9OVUxMID09IHBDLT5tX2Fpcl9jb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFJUl9jcmVhdGUoJnBDLT5tX2Fpcl9jb250ZXh0LCBNNEFJUl9rWVVWNDIwUCk7Ci0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgcEMtPm1fcERlY29kZWRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBpbml0aWFsaXppbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKHBDLT5tX2Fpcl9jb250ZXh0LCAmUGFyYW1zKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKLSAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBjb25maWd1cmluZyBBSVI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lKTsKLSAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2dldChwQy0+bV9haXJfY29udGV4dCwgcEMtPm1fcERlY29kZWRQbGFuZSwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEltYWdlUGxhbmVzWzBdID0gcEltYWdlUGxhbmVzMTsKLSAgICAgICAgcEltYWdlUGxhbmVzWzFdID0gcEltYWdlUGxhbmVzMjsKLSAgICAgICAgcEltYWdlUGxhbmVzWzJdID0gcEltYWdlUGxhbmVzMzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudCB0aGUgaW1hZ2UgY291bnRlciAqLwotICAgIHBDLT5tX0ltYWdlQ291bnRlcisrOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgZW5kIG9mIHNlcXVlbmNlICovCi0gICAgbGFzdF9mcmFtZV9mbGFnICAgID0gKHBDLT5tX0ltYWdlQ291bnRlciA+PSBwQy0+bV9OYkltYWdlKTsKLQotICAgIC8qKgotICAgICAqIEtlZXAgdGhlIHBpY3R1cmUgZHVyYXRpb24gKi8KLSAgICAqcFBpY3R1cmVEdXJhdGlvbiA9IHBDLT5tX3RpbWVEdXJhdGlvbjsKLQotICAgIGlmICgxID09IGxhc3RfZnJhbWVfZmxhZykKLSAgICB7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fYWlyX2NvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gY2xlYW5pbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcERlY29kZWRQbGFuZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IExlYXZpbmcgIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgUHRvM0dQUCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBUaGUgIlBpY3R1cmVzIHRvIDNHUFAiIHBhcmFtZXRlcnMgYXJlIGdpdmVuIGJ5IHRoZSBpbnRlcm5hbCB4VlNTCi0gKiAgICAgICAgICAgIGNvbnRleHQuIFRoaXMgY29udGV4dCBjb250YWlucyBhIHBvaW50ZXIgb24gdGhlIGN1cnJlbnQgZWxlbWVudAotICogICAgICAgICAgICBvZiB0aGUgY2hhaW5lZCBsaXN0IG9mIFB0bzNHUFAgcGFyYW1ldGVycy4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRTogVGhlIHJldHVybmVkIGltYWdlIGlzIHRoZSBsYXN0IG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIERlZmluaXRpb25zIHRvIGdlbmVyYXRlIGR1bW15IEFNUiBmaWxlIHVzZWQgdG8gYWRkIEFNUiBzaWxlbmNlIGluIGZpbGVzIGdlbmVyYXRlZAotICAgICBieSBQdG8zR1BQICovCi0gICAgI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgICAgIDEzCi0gICAgLyogVGhpcyBjb25zdGFudCBpcyBkZWZpbmVkIGluIE00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oICovCi0gICAgZXh0ZXJuIGNvbnN0IE00T1NBX1VJbnQ4XAotICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OFtNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkVdOwotCi0gICAgLyogQU1SIHNpbGVudCBmcmFtZSB1c2VkIHRvIGNvbXB1dGUgZHVtbXkgQU1SIHNpbGVuY2UgZmlsZSAqLwotICAgICNkZWZpbmUgTTRWU1MzR1BQX0FNUl9IRUFERVJfU0laRSA2Ci0gICAgY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FNUl9IRUFERVJbTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci0gICAgeyAweDIzLCAweDIxLCAweDQxLCAweDRkLCAweDUyLCAweDBhIH07Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRQVE8zR1BQX0NvbnRleHQgcE00UFRPM0dQUF9DdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNFBUTzNHUFBfUGFyYW1zIFBhcmFtczsKLSAgICAgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQqICAgIHBDYWxsQmFja0N0eHQ7Ci0gICAgTTRPU0FfQm9vbCBjbXBSZXN1bHQ9TTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQ29udGV4dCBwRHVtbXlBTVJGaWxlOwotICAgIE00T1NBX0NoYXIgb3V0X2FtcltNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLSAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgIE00T1NBX0NoYXIqIHBEZWNvZGVkUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBNNFBUTzNHUFAgaW5zdGFuY2UgKi8KLSAgICBlcnIgPSBNNFBUTzNHUFBfSW5pdCggJnBNNFBUTzNHUFBfQ3R4dCwgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIsCi0gICAgICAgICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AgcmV0dXJuZWQgJWxkXG4iLGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcENhbGxCYWNrQ3R4dCA9IChNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCksCi0gICAgICAgICBNNFZTLChNNE9TQV9DaGFyICopICJQdG8zZ3BwIGNhbGxiYWNrIHN0cnVjdCIpOwotICAgIGlmKHBDYWxsQmFja0N0eHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVTaXplID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplOwotICAgIFBhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0OwotICAgIFBhcmFtcy52aWRlb1Byb2ZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgUGFyYW1zLnZpZGVvTGV2ZWwgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgImR1bW15IiBhbXIgZmlsZSBjb250YWluaW5nIHNpbGVuY2UgaW4gdGVtcG9yYXJ5IGZvbGRlciAqLwotICAgIE00T1NBX2Nock5Db3B5KG91dF9hbXIsIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSk7Ci0gICAgc3RybmNhdCgoY2hhciAqKW91dF9hbXIsIChjb25zdCBjaGFyICopImR1bW15LmFtclwwIiwgMTApOwotCi0gICAgLyoqCi0gICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgdGhlIHRlbXBvcmFyeSBwYXRoIGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgcERlY29kZWRQYXRoID0gb3V0X2FtcjsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgb3V0X2FtciwKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCopIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3A6XAotICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0KLSAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHItPm9wZW5Xcml0ZSgmcER1bW15QU1SRmlsZSwgcERlY29kZWRQYXRoLCBNNE9TQV9rRmlsZVdyaXRlKTsKLQotICAgIC8qQ29tbWVudGVkIGJlY2F1c2Ugb2YgdGhlIHVzZSBvZiB0aGUgVVRGIGNvbnZlcnNpb24gc2VlIGFib3ZlKi8KLS8qICAgIGVyciA9IHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0ci0+b3BlbldyaXRlKCZwRHVtbXlBTVJGaWxlLCBvdXRfYW1yLCBNNE9TQV9rRmlsZVdyaXRlKTsKLSAqLwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IENhbid0IG9wZW4gb3V0cHV0IGR1bW15IGFtciBmaWxlICVzLFwKLSAgICAgICAgICAgICBlcnJvcjogMHgleFxuIixvdXRfYW1yLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9ICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHItPndyaXRlRGF0YShwRHVtbXlBTVJGaWxlLAotICAgICAgICAoTTRPU0FfSW50OCopTTRWU1MzR1BQX0FNUl9IRUFERVIsIE00VlNTM0dQUF9BTVJfSEVBREVSX1NJWkUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IENhbid0IHdyaXRlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcyxcCi0gICAgICAgICAgICAgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT53cml0ZURhdGEocER1bW15QU1SRmlsZSwKLSAgICAgICAgIChNNE9TQV9JbnQ4KilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4LCBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IFwKLSAgICAgICAgICAgIENhbid0IHdyaXRlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT5jbG9zZVdyaXRlKHBEdW1teUFNUkZpbGUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IFwKLSAgICAgICAgICAgIENhbid0IGNsb3NlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsIHBhcmFtZXRlcnMgZm9yIFB0bzNHUFAgd2l0aCB0aGUgcGFyYW1ldGVycyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiB0aGUKLSAgICAgKiBQdG8zR1BQIHBhcmFtZXRlcnMgY2hhaW5lZCBsaXN0IGFuZCB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyAqLwotLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlID09IDApIHsKLSAgICAgICAgUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSAgICA9IE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgICBQYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIH0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljVG8zR1A6IHZpZGVvIGJpdHJhdGUgPSAlZCIsCi0gICAgICAgIFBhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpOwotLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgUGFyYW1zLk91dHB1dEZpbGVNYXhTaXplICAgID0gTTRQVE8zR1BQX2tVTkxJTUlURUQ7Ci0gICAgUGFyYW1zLnBQaWN0dXJlQ2FsbGJhY2tGY3QgICAgPSBNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OwotICAgIFBhcmFtcy5wUGljdHVyZUNhbGxiYWNrQ3R4dCAgICA9IHBDYWxsQmFja0N0eHQ7Ci0gICAgLypGQjogY2hhbmdlIHRvIHVzZSB0aGUgY29udmVydGVkIHBhdGggKFVURiBjb252ZXJzaW9uKSBzZWUgdGhlIGNvbnZlcnNpb24gYWJvdmUqLwotICAgIC8qRml4IDotIEFkZGluZyBBdWRpbyBUcmFjayBpbiBJbWFnZSBhcyBpbnB1dCA6QXVkaW9UYXJja0ZpbGUgU2V0dGluZyB0byBOVUxMICovCi0gICAgUGFyYW1zLnBJbnB1dEF1ZGlvVHJhY2tGaWxlICAgID0gTTRPU0FfTlVMTDsvLyhNNE9TQV9Wb2lkKilwRGVjb2RlZFBhdGg7Ly9vdXRfYW1yOwotICAgIFBhcmFtcy5BdWRpb1BhZGRpbmdNb2RlICAgICAgICA9IE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Mb29wOwotICAgIFBhcmFtcy5BdWRpb0ZpbGVGb3JtYXQgICAgICAgID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUjsKLSAgICBQYXJhbXMucE91dHB1dDNncHBGaWxlICAgICAgICA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5wRmlsZU91dDsKLSAgICBQYXJhbXMucFRlbXBvcmFyeUZpbGUgICAgICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPnBGaWxlVGVtcDsKLSAgICAvKitQUiBObzogIGJscm54cHN3IzIyMyovCi0gICAgLypJbmNyZWFzaW5nIGZyZXF1ZW5jeSBvZiBGcmFtZSwgY2FsY3VsYXRpbmcgTm9zIG9mIEZyYW1lID0gZHVyYXRpb24gL0ZQUyAqLwotICAgIC8qT3RoZXIgY2hhbmdlcyBtYWRlIGlzIEAgTTR4VlNTX0FQSS5jIEAgbGluZSAzODQxIGluIE00eFZTU19TZW5kQ29tbWFuZCovCi0gICAgLypJZiBjYXNlIGNoZWNrIGZvciBQYW5ab29tIHJlbW92ZWQgKi8KLSAgICBQYXJhbXMuTmJWaWRlb0ZyYW1lcyAgICAgICAgICAgID0gKE00T1NBX1VJbnQzMikKLSAgICAgICAgKHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5kdXJhdGlvbiBcCi0gICAgICAgICAgICAvIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5mcmFtZXJhdGUpOyAvKiAqLwotICAgIHBDYWxsQmFja0N0eHQtPm1fdGltZUR1cmF0aW9uICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPmZyYW1lcmF0ZTsKLSAgICAvKi1QUiBObzogIGJscm54cHN3IzIyMyovCi0gICAgcENhbGxCYWNrQ3R4dC0+bV9JbWFnZUNvdW50ZXIgICAgPSAwOwotICAgIHBDYWxsQmFja0N0eHQtPm1fRmlsZUluICAgICAgICAgICAgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+cEZpbGVJbjsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX05iSW1hZ2UgICAgICAgID0gUGFyYW1zLk5iVmlkZW9GcmFtZXM7Ci0gICAgcENhbGxCYWNrQ3R4dC0+bV9wRmlsZVJlYWRQdHIgICAgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0cjsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX3BEZWNvZGVkUGxhbmUgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDYWxsQmFja0N0eHQtPm1fcFB0bzNHUFBwYXJhbXMgICAgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtczsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX2Fpcl9jb250ZXh0ICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX21lZGlhUmVuZGVyaW5nID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPk1lZGlhUmVuZGVyaW5nOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzICovCi0gICAgZXJyID0gTTRQVE8zR1BQX09wZW4ocE00UFRPM0dQUF9DdHh0LCAmUGFyYW1zKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4gcmV0dXJuZWQ6IDB4JXhcbiIsZXJyKTsKLSAgICAgICAgaWYocENhbGxCYWNrQ3R4dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDYWxsQmFja0N0eHQpOwotICAgICAgICAgICAgcENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgTTRQVE8zR1BQX0NsZWFuVXAocE00UFRPM0dQUF9DdHh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGNvbnRleHQgdG8gYmUgYWJsZSB0byBjYWxsIFB0bzNHUFAgc3RlcCBmdW5jdGlvbiBpbiBNNHhWU1Nfc3RlcCBmdW5jdGlvbiAqLwotICAgIHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0ID0gcE00UFRPM0dQUF9DdHh0OwotICAgIHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCA9IHBDYWxsQmFja0N0eHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBQdG8zR1BQCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9DaGFyIG91dF9hbXJbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBQVE8zR1BQIGNhbGxiYWNrIGNvbnRleHQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0KTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5hbGl6ZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBlcnIgPSBNNFBUTzNHUFBfQ2xvc2UoeFZTU19jb250ZXh0LT5wTTRQVE8zR1BQX0N0eHQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xvc2UgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICBNNFBUTzNHUFBfQ2xlYW5VcCh4VlNTX2NvbnRleHQtPnBNNFBUTzNHUFBfQ3R4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSB0aGlzIE00UFRPM0dQUCBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00UFRPM0dQUF9DbGVhblVwKHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXAgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBkdW1teS5hbXIgZmlsZSAqLwotICAgIE00T1NBX2Nock5Db3B5KG91dF9hbXIsIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSk7Ci0gICAgc3RybmNhdCgoY2hhciAqKW91dF9hbXIsIChjb25zdCBjaGFyICopImR1bW15LmFtclwwIiwgMTApOwotCi0gICAgLyoqCi0gICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgdGhlIHRlbXBvcmFyeSBwYXRoIGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgcERlY29kZWRQYXRoID0gb3V0X2FtcjsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgb3V0X2FtciwKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCopIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncDpcCi0gICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgfQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBEZWNvZGVkUGF0aCk7Ci0KLSAgICAvKkNvbW1lbnRlZCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgdGhlIFVURiBjb252ZXJzaW9uKi8KLS8qICAgIHJlbW92ZShvdXRfYW1yKTsKLSAqLwotCi0gICAgeFZTU19jb250ZXh0LT5wTTRQVE8zR1BQX0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIFJHQjU2NSBwbGFuZSB0byBZVVY0MjAgcGxhbmFyCi0gKiBAbm90ZSAgICBJdCBpcyB1c2VkIG9ubHkgZm9yIGZyYW1pbmcgZWZmZWN0Ci0gKiAgICAgICAgICAgIEl0IGFsbG9jYXRlcyBvdXRwdXQgWVVWIHBsYW5lcwotICogQHBhcmFtICAgIGZyYW1pbmdDdHggICAgKElOKSBUaGUgZnJhbWluZyBzdHJ1Y3QgY29udGFpbmluZyBpbnB1dCBSR0I1NjUgcGxhbmUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKLSAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aFwKLSAgICAgICAgICAgICpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciAqKVwKLSAgICAgICAgICAgICAgICAiQWxsb2MgZm9yIHRoZSBDb252ZXJ0aW9uIG91dHB1dCBZVVYiKTs7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhIFwKLSAgICAgICAgKyBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0OwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSBcCi0gICAgICAgICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5wdXQgUkdCIDU2NSB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZwotICAgICAgZWZmZWN0ICovCi0gICAgZXJyID0gTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAoTTRPU0FfTlVMTCwgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiwgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOlwKLSAgICAgICAgICAgICBlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgIH0KLQotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlld09mZnNldENsaXBUaW1lID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IG9uZSBlbGVtZW50IGluIHRoZSBjaGFpbmVkIGxpc3QgKG5vIGFuaW1hdGVkIGltYWdlIHdpdGggUkdCIGJ1ZmZlci4uLikgKi8KLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTZXRQbGFuZVRyYW5zcGFyZW50KE00T1NBX1VJbnQ4KiBwbGFuZUluLCBNNE9TQV9VSW50MzIgc2l6ZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgaTsKLSAgICBNNE9TQV9VSW50OCogcGxhbmUgPSBwbGFuZUluOwotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MSA9IChNNE9TQV9VSW50OCkoKFRSQU5TUEFSRU5UX0NPTE9SICYgMHhGRjAwKT4+OCk7Ci0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQyID0gKE00T1NBX1VJbnQ4KVRSQU5TUEFSRU5UX0NPTE9SOwotCi0gICAgZm9yKGk9MDsgaTwoc2l6ZT4+MSk7IGkrKykKLSAgICB7Ci0gICAgICAgICpwbGFuZSsrID0gdHJhbnNwYXJlbnQxOwotICAgICAgICAqcGxhbmUrKyA9IHRyYW5zcGFyZW50MjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSQkc4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3QsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBPdXRwdXRWaWRlb1Jlc29sdXRpb24pCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgQVJHQjg4ODggaW5wdXQgZmlsZSAgdG8gWVVWNDIwIHdoZW51c2VkIGZvciBmcmFtbWluZyBlZmZlY3QKLSAqIEBub3RlICAgIFRoZSBpbnB1dCBBUkdCODg4OCBmaWxlIHBhdGggaXMgY29udGFpbmVkIGluIHRoZSBwRWZmZWN0IHN0cnVjdHVyZQotICogICAgICAgICAgICBJZiB0aGUgQVJHQjg4ODggbXVzdCBiZSByZXNpemVkIHRvIGZpdCBvdXRwdXQgdmlkZW8gc2l6ZSwgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICB3aWxsIGRvIGl0LgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRWZmZWN0ICAgICAgICAoSU4pIFRoZSBlZmZlY3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9ucyBvbgotICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSB0byBkZWNvZGUsIHJlc2l6aW5nIC4uLgotICogQHBhcmFtICAgIGZyYW1pbmdDdHggICAgKElOL09VVCkgU3RydWN0dXJlIGluIHdoaWNoIHRoZSBvdXRwdXQgUkdCIHdpbGwgYmUgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqIEByZXR1cm4gICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IEZpbGUgbm90IGZvdW5kLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemVcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb1Jlc29sdXRpb24pCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfQ29udGV4dCBwQVJHQkluOwotICAgIE00T1NBX1VJbnQzMiBmaWxlX3NpemU7Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBoZWlnaHQsIHdpZHRoX291dCwgaGVpZ2h0X291dDsKLSAgICBNNE9TQV9Wb2lkKiBwRmlsZSA9IHBFZmZlY3QtPnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDEgPSAoTTRPU0FfVUludDgpKChUUkFOU1BBUkVOVF9DT0xPUiAmIDB4RkYwMCk+PjgpOwotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MiA9IChNNE9TQV9VSW50OClUUkFOU1BBUkVOVF9DT0xPUjsKLSAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgIE00T1NBX0NoYXIqIHBEZWNvZGVkUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLGogPSAwOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHJnYlBsYW5lOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemVfYXJnYj0oZnJhbWluZ0N0eC0+d2lkdGggKiBmcmFtaW5nQ3R4LT5oZWlnaHQgKiA0KTsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wQWxwaGFQZXJjZW50ID0gMDsKLSAgICBNNFZJRklfVUludDgqIFRlbXBQYWNEYXRhID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MTYgKnB0ciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIHogPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6IEVudGVyaW5nICIpOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Qgd2lkdGggYW5kIGhlaWdodCAlZCAlZCAiLAotICAgICAgICBmcmFtaW5nQ3R4LT53aWR0aCxmcmFtaW5nQ3R4LT5oZWlnaHQpOwotCi0gICAgTTRPU0FfVUludDggKnBUbXBEYXRhID0gKE00T1NBX1VJbnQ4KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZV9hcmdiLCBNNFZTLCAoTTRPU0FfQ2hhciopXAotICAgICAgICAiSW1hZ2UgYXJnYiBkYXRhIik7Ci0gICAgaWYocFRtcERhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IHRoZSBmaWxlIHBhdGggaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0Ki8KLSAgICBwRGVjb2RlZFBhdGggPSBwRmlsZTsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgcEZpbGUsCi0gICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsRGVjb2RlUE5HOlwKLSAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IixlcnIpOwotICAgICAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotCi0gICAgIC8qIE9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSBhbmQgc3RvcmUgaXQgaW50byBtZW1vcnkgKi8KLSAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+b3BlblJlYWQoJnBBUkdCSW4sIHBEZWNvZGVkUGF0aCwgTTRPU0Ffa0ZpbGVSZWFkKTsKLQotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIkNhbid0IG9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGUsIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0geFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBUbXBEYXRhLCAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIGVyciA9ICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIkNhbid0IGNsb3NlIGlucHV0IHBuZyBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZSwgZXJyKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIHJnYlBsYW5lLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+aGVpZ2h0OwotICAgIHJnYlBsYW5lLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT53aWR0aDsKLSAgICByZ2JQbGFuZS51X3N0cmlkZSA9IHJnYlBsYW5lLnVfd2lkdGgqMzsKLSAgICByZ2JQbGFuZS51X3RvcGxlZnQgPSAwOwotCi0gICAgZnJhbWVTaXplID0gKHJnYlBsYW5lLnVfd2lkdGggKiByZ2JQbGFuZS51X2hlaWdodCAqIDMpOyAvL1NpemUgb2YgUkdCODg4IGRhdGEKLSAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoKGZyYW1lU2l6ZSkrICgyICogZnJhbWluZ0N0eC0+d2lkdGgpKSwKLSAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwotICAgIGlmKHJnYlBsYW5lLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICBSZW1vdmUgdGhlIGFscGhhIGNoYW5uZWwgICIpOwotCi0gICAgLyogcHJlbXVsdGlwbGllZCBhbHBoYSAlIG9uIFJHQiAqLwotICAgIGZvciAoaT0wLCBqID0gMDsgaSA8IGZyYW1lU2l6ZV9hcmdiOyBpICs9IDQpIHsKLSAgICAgICAgLyogdGhpcyBpcyBhbHBoYSB2YWx1ZSAqLwotICAgICAgICBpZiAoKGkgJSA0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wQWxwaGFQZXJjZW50ID0gcFRtcERhdGFbaV07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSICovCi0gICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2pdID0gcFRtcERhdGFbaSsxXTsKLSAgICAgICAgaisrOwotCi0gICAgICAgIC8qIEcgKi8KLSAgICAgICAgaWYgKHRlbXBBbHBoYVBlcmNlbnQgPiAwKSB7Ci0gICAgICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2krMl07Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0gZWxzZSB7LyogSW4gY2FzZSBvZiBhbHBoYSB2YWx1ZSAwLCBtYWtlIEdSRUVOIHRvIDI1NSAqLwotICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbal0gPSAyNTU7IC8vcFRtcERhdGFbaSsyXTsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEIgKi8KLSAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbal0gPSBwVG1wRGF0YVtpKzNdOwotICAgICAgICBqKys7Ci0gICAgfQotCi0gICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogY29udmVydCBSR0I4ODggdG8gUkdCNTY1ICovCi0KLSAgICAvKiBhbGxvY2F0ZSB0ZW1wIFJHQiA1NjUgYnVmZmVyICovCi0gICAgVGVtcFBhY0RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplICsKLSAgICAgICAgICAgICAgICAgICAgICAgKDQgKiAoZnJhbWluZ0N0eC0+d2lkdGggKyBmcmFtaW5nQ3R4LT5oZWlnaHQgKyAxKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIkltYWdlIGNsaXAgUkdCNTY1IGRhdGEiKTsKLSAgICBpZiAoVGVtcFBhY0RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCBSR0I1NjUgZGF0YSIpOwotICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHB0ciA9IChNNE9TQV9VSW50MTYgKilUZW1wUGFjRGF0YTsKLSAgICB6ID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBqIDsgaSArPSAzKQotICAgIHsKLSAgICAgICAgcHRyW3orK10gPSBQQUNLX1JHQjU2NSgwLCAgIHJnYlBsYW5lLnBhY19kYXRhW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbaSsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2krMl0pOwotICAgIH0KLQotICAgIC8qIGZyZWUgdGhlIFJCRzg4OCBhbmQgYXNzaWduIFJHQjU2NSAqLwotICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgIHJnYlBsYW5lLnBhY19kYXRhID0gVGVtcFBhY0RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBvdXRwdXQgc2l6ZXMgYXJlIG9kZCAqLwotICAgIGlmKHJnYlBsYW5lLnVfaGVpZ2h0ICUgMiAhPSAwKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4KiBvdXRwdXRfcGFjX2RhdGEgPSByZ2JQbGFuZS5wYWNfZGF0YTsKLSAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICAgICBvdXRwdXQgaGVpZ2h0IGlzIG9kZCAgIik7Ci0gICAgICAgIG91dHB1dF9wYWNfZGF0YSArPXJnYlBsYW5lLnVfd2lkdGggKiByZ2JQbGFuZS51X2hlaWdodCoyOwotCi0gICAgICAgIGZvcihpPTA7aTxyZ2JQbGFuZS51X3dpZHRoO2krKykKLSAgICAgICAgewotICAgICAgICAgICAgKm91dHB1dF9wYWNfZGF0YSsrID0gdHJhbnNwYXJlbnQxOwotICAgICAgICAgICAgKm91dHB1dF9wYWNfZGF0YSsrID0gdHJhbnNwYXJlbnQyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIGp1c3QgYWRkIGEgd2hpdGUgbGluZSB0byB0aGUgUE5HIHRoYXQgd2lsbCBiZSB0cmFuc3BhcmVudCAqLwotICAgICAgICByZ2JQbGFuZS51X2hlaWdodCsrOwotICAgIH0KLSAgICBpZihyZ2JQbGFuZS51X3dpZHRoICUgMiAhPSAwKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIGFkZCBhIG5ldyBjb2x1bW4gb2Ygd2hpdGUgKD10cmFuc3BhcmVudCksIGJ1dCB3ZSBuZWVkIHRvIHBhcnNlIGFsbCBSR0IgbGluZXMgLi4uICovCi0gICAgICAgIE00T1NBX1VJbnQzMiBpOwotICAgICAgICBNNFZJRklfVUludDgqIG5ld1JHQnBhY19kYXRhOwotICAgICAgICBNNFZJRklfVUludDgqIG91dHB1dF9wYWNfZGF0YSwgKmlucHV0X3BhY19kYXRhOwotCi0gICAgICAgIHJnYlBsYW5lLnVfd2lkdGgrKzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6IFwKLSAgICAgICAgICAgICBvdXRwdXQgd2lkdGggaXMgb2RkICAiKTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgUkdCIG91dHB1dCBidWZmZXIgaW4gd2hpY2ggYWxsIGRlY29kZWQgZGF0YQotICAgICAgICAgICsgd2hpdGUgbGluZSB3aWxsIGJlIGNvcGllZCAqLwotICAgICAgICBuZXdSR0JwYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhyZ2JQbGFuZS51X2hlaWdodCpyZ2JQbGFuZS51X3dpZHRoKjJcCi0gICAgICAgICAgICAqc2l6ZW9mKE00VklGSV9VSW50OCksIE00VlMsIChNNE9TQV9DaGFyICopIk5ldyBGcmFtaW5nIEdJRiBPdXRwdXQgcGFjX2RhdGEgUkdCIik7Ci0KLSAgICAgICAgaWYobmV3UkdCcGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gXAotICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0cHV0X3BhY19kYXRhPSBuZXdSR0JwYWNfZGF0YTsKLSAgICAgICAgaW5wdXRfcGFjX2RhdGEgPSByZ2JQbGFuZS5wYWNfZGF0YTsKLQotICAgICAgICBmb3IoaT0wO2k8cmdiUGxhbmUudV9oZWlnaHQ7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilvdXRwdXRfcGFjX2RhdGEsICh2b2lkICopaW5wdXRfcGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgIChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotCi0gICAgICAgICAgICBvdXRwdXRfcGFjX2RhdGEgKz0gKChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotICAgICAgICAgICAgLyogUHV0IHRoZSBwaXhlbCB0byB0cmFuc3BhcmVuY3kgY29sb3IgKi8KLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MTsKLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MjsKLQotICAgICAgICAgICAgaW5wdXRfcGFjX2RhdGEgKz0gKChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IG5ld1JHQnBhY19kYXRhOwotICAgIH0KLQotICAgIC8qIHJlc2V0IHN0cmlkZSAqLwotICAgIHJnYlBsYW5lLnVfc3RyaWRlID0gcmdiUGxhbmUudV93aWR0aCoyOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBjaGFpbmVkIGxpc3QgcGFyYW1ldGVycyAqLwotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlld09mZnNldENsaXBUaW1lID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IG9uZSBlbGVtZW50IGluIHRoZSBjaGFpbmVkIGxpc3QgKG5vIGFuaW1hdGVkIGltYWdlIC4uLikgKi8KLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotCi0gICAgLyoqCi0gICAgICogR2V0IG91dHB1dCB3aWR0aC9oZWlnaHQgKi8KLSAgICAgc3dpdGNoKE91dHB1dFZpZGVvUmVzb2x1dGlvbikKLSAgICAvL3N3aXRjaCh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUpCi0gICAgewotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICB3aWR0aF9vdXQgPSAxMjg7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA5NjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgIHdpZHRoX291dCA9IDE2MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDEyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgd2lkdGhfb3V0ID0gMTc2OwotICAgICAgICBoZWlnaHRfb3V0ID0gMTQ0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICB3aWR0aF9vdXQgPSAzMjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSAyNDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgd2lkdGhfb3V0ID0gMzUyOwotICAgICAgICBoZWlnaHRfb3V0ID0gMjg4OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgIHdpZHRoX291dCA9IDY0MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDQ4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgd2lkdGhfb3V0ID0gODAwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNDgwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICB3aWR0aF9vdXQgPSA3MjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA0ODA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgIHdpZHRoX291dCA9IDY0MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDM2MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgICAgICB3aWR0aF9vdXQgPSBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDQ4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgIHdpZHRoX291dCA9IDEyODA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA3MjA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwODBfNzIwOgotICAgICAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0gICAgICAgIHdpZHRoX291dCA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDcyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgd2lkdGhfb3V0ID0gOTYwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNzIwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgIHdpZHRoX291dCA9IDE5MjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSBNNEVOQ09ERVJfMTkyMF8xMDgwX0hlaWdodDsKLSAgICAgICAgYnJlYWs7Ci0gICAgLyoqCi0gICAgICogSWYgb3V0cHV0IHZpZGVvIHNpemUgaXMgbm90IGdpdmVuLCB3ZSB0YWtlIFFDSUYgc2l6ZSwKLSAgICAgKiBzaG91bGQgbm90IGhhcHBlbiwgYmVjYXVzZSBhbHJlYWR5IGRvbmUgaW4gTTR4VlNTX3NlbmRDb21tYW5kICovCi0gICAgZGVmYXVsdDoKLSAgICAgICAgd2lkdGhfb3V0ID0gMTc2OwotICAgICAgICBoZWlnaHRfb3V0ID0gMTQ0OwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgcGxhbmVzIHN0cnVjdHVyZXMgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKLSAgICAgICAgIChNNE9TQV9DaGFyICopIkZyYW1pbmcgT3V0cHV0IHBsYW5lIFJHQiIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXNpemUgUkdCIGlmIG5lZWRlZCAqLwotICAgIGlmKChwRWZmZWN0LT54VlNTLmJSZXNpemUpICYmCi0gICAgICAgICAocmdiUGxhbmUudV93aWR0aCAhPSB3aWR0aF9vdXQgfHwgcmdiUGxhbmUudV9oZWlnaHQgIT0gaGVpZ2h0X291dCkpCi0gICAgewotICAgICAgICB3aWR0aCA9IHdpZHRoX291dDsKLSAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0X291dDsKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDogXAotICAgICAgICAgICAgIE5ldyBXaWR0aCBhbmQgaGVpZ2h0ICVkICVkICAiLHdpZHRoLGhlaWdodCk7Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPSBoZWlnaHRfb3V0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gd2lkdGhfb3V0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgqMjsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV90b3BsZWZ0ID0gMDsKLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KmZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICBGcmFtaW5nUmdiLT51X3dpZHRoKjIqc2l6ZW9mKE00VklGSV9VSW50OCksIE00VlMsCi0gICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJGcmFtaW5nIE91dHB1dCBwYWNfZGF0YSBSR0IiKTsKLQotICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBcCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCIpOwotICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6ICBSZXNpemluZyBOZWVkZWQgIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICAgICAgcmdiUGxhbmUudV9oZWlnaHQgJiByZ2JQbGFuZS51X3dpZHRoICVkICVkIixyZ2JQbGFuZS51X2hlaWdodCxyZ2JQbGFuZS51X3dpZHRoKTsKLQotICAgICAgICAvL2VyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsICZyZ2JQbGFuZSxmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKLSAgICAgICAgZXJyID0gTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUoTTRPU0FfTlVMTCwgJnJnYlBsYW5lLGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpOwotCi0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCA6XAotICAgICAgICAgICAgICAgIHdoZW4gcmVzaXppbmcgUkdCIHBsYW5lOiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHJnYlBsYW5lLnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6XAotICAgICAgICAgICAgICBSZXNpemluZyBOb3QgTmVlZGVkICIpOwotCi0gICAgICAgIHdpZHRoID0gcmdiUGxhbmUudV93aWR0aDsKLSAgICAgICAgaGVpZ2h0ID0gcmdiUGxhbmUudV9oZWlnaHQ7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfc3RyaWRlID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCoyOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3RvcGxlZnQgPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9IHJnYlBsYW5lLnBhY19kYXRhOwotICAgIH0KLQotCi0gICAgaWYocEVmZmVjdC0+eFZTUy5iUmVzaXplKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZvcmNlIHRvcGxlZnQgdG8gMCBmb3IgcHVyZSBmcmFtaW5nIGVmZmVjdCAqLwotICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPSAwOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCAgUkdCIG91dHB1dCB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZwotICAgICBlZmZlY3QgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIgKikiRnJhbWluZyBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCIpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8vIEFsbG9jIGZvciBZLCBVIGFuZCBWIHBsYW5lcwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCA9ICgod2lkdGgrMSk+PjEpPDwxOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSAoKGhlaWdodCsxKT4+MSk8PDE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSAoKHdpZHRoKzEpPj4xKTw8MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jCi0gICAgICAgICgoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoKmZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiQWxsb2MgZm9yIHRoZSBvdXRwdXQgWSIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKCgoaGVpZ2h0KzEpPj4xKTw8MSk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9zdHJpZGUgPSAoKCh3aWR0aCsxKT4+MSk8PDEpPj4xOwotCi0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0LCBNNFZTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJBbGxvYyBmb3IgdGhlIG91dHB1dCBVIik7Ci0gICAgaWYgKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCA9ICgoKHdpZHRoKzEpPj4xKTw8MSk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X2hlaWdodCA9ICgoKGhlaWdodCsxKT4+MSk8PDEpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKLQotCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiQWxsb2MgZm9yIHRoZSAgb3V0cHV0IFYiKTsKLSAgICBpZiAoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6XAotICAgICAgICBjb252ZXJ0IFJHQiB0byBZVVYgIik7Ci0KLSAgICAvL2VyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgZXJyID0gTTRWSUZJX1JHQjU2NXRvWVVWNDIwKE00T1NBX05VTEwsIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IsICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLQotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJTUFMgcG5nOiBlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgIH0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDogIExlYXZpbmcgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIFZTUyBmb3IgZWRpdGluZwotICogQG5vdGUgICAgSXQgYWxzbyBzZXQgc3BlY2lhbCB4VlNTIGVmZmVjdCBhcyBleHRlcm5hbCBlZmZlY3RzIGZvciB0aGUgVlNTCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogQWxsb2NhdGlvbiBlcnJvciAobm8gbW9yZSBtZW1vcnkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCogeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0KilwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQgcFZzc0N0eHQ7Ci0gICAgTTRPU0FfVUludDMyIGksajsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgVlNTIDNHUFAgZWRpdGlvbiBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9lZGl0SW5pdCggJnBWc3NDdHh0LCB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciwgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlOiBNNFZTUzNHUFBfZWRpdEluaXQgcmV0dXJuZWQgMHgleFxuIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIFZTUyBjb250ZXh0IHRvIE5VTEwgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQqIHBWU1NDb250ZXh0ID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCopcFZzc0N0eHQ7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0OwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplIDsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlIDsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZSA7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLmJBdWRpb01vbm8gPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubzsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgIC8qIEluIGNhc2Ugb2YgTU1TIHVzZSBjYXNlLCB3ZSBmaWxsIGRpcmVjdGx5IGludG8gdGhlIFZTUyBjb250ZXh0IHRoZSB0YXJnZXRlZCBiaXRyYXRlICovCi0gICAgaWYoeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgIT0gMCkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0KiBwVlNTQ29udGV4dCA9IChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCopcFZzc0N0eHQ7Ci0KLSAgICAgICAgcFZTU0NvbnRleHQtPmJJc01NUyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBWU1NDb250ZXh0LT51aU1NU1ZpZGVvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlOwotICAgICAgICBwVlNTQ29udGV4dC0+TU1TdmlkZW9GcmFtZXJhdGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGU7Ci0gICAgfQotCi0gICAgLypXYXJuaW5nOiBzaW5jZSB0aGUgYWRkaW5nIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgcFNldHRpbmdzIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIG5leHQKLSAgICBwYXJ0IGluICBwQ3VycmVudEVkaXRTZXR0aW5ncyAodGhlcmUgaXMgYSBzcGVjaWZpYyBjdXJyZW50IGVkaXRpbmcgc3RydWN0dXJlIGZvciB0aGUgc2F2aW5nLAotICAgICBhcyBmb3IgdGhlIHByZXZpZXcpKi8KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9ucywgZm9yIHNhdmluZyBtb2RlICh0byBiZSBtb3ZlZCB0bwotICAgICAgTTR4VlNTX3NhdmVTdGFydCgpID8pKi8KLSAgICBmb3IgKGk9MDsgaTx4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaj0wOyBqPHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPm5iRWZmZWN0czsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZSA9PQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZTsKLSAgICAgICAgICAgICAgICAvKmNvbW1lbnRlZCBGQiovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldAotICAgICAgICAgICAgICAgICBkdXJpbmcgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rID09Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluazsgLyoqPCB3ZSBkb24ndAotICAgICAgICAgICAgICAgIC8vIHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbiA9PQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYSA9PQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIC8vIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYTsKLSAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICBzZW5kQ29tbWFuZCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgPT0KLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgZnJhbWluZyBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZSA9PQotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yOwotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgLy8gKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlOwotICAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZzsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGZyYW1pbmcgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbUluID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdFpvb207Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21JbjsgLyoqPCB3ZSBkb24ndCB1c2UgYW55Ci0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0ID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbU91dDsgLyoqPCB3ZSBkb24ndCB1c2UgYW55Ci0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2ID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjsKLSAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgY29sb3IgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgPT0KLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIC8vIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2OwotICAgICAgICAgICAgICAgIC8qKjwgd2UgZG9uJ3QgdXNlIGFueSBmdW5jdGlvbiBjb250ZXh0ICovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbiB0aGUgVlNTIDNHUFAgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdE9wZW4ocFZzc0N0eHQsIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGU6XAotICAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0T3BlbiByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIFZTUyBjb250ZXh0IHRvIE5VTEwgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIFZTUyBjb250ZXh0IHRvIGJlIGFibGUgdG8gY2xvc2UgLyBmcmVlIFZTUyBsYXRlciAqLwotICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IHBWc3NDdHh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgVlNTCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCBwVnNzQ3R4dCA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2xvc2UgdGhlIFZTUyAzR1BQICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0Q2xvc2UocFZzc0N0eHQpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGU6XAotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsb3NlIHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNldCB0aGUgVlNTIGNvbnRleHQgdG8gTlVMTCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSB0aGlzIFZTUzNHUFAgZWRpdGlvbiBpbnN0YW5jZSAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBWU1MgY29udGV4dCB0byBOVUxMICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZTogXAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcCByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIFZTUyBmb3IgYXVkaW8gbWl4aW5nCi0gKiBAbm90ZSAgICBJdCB0YWtlcyBpdHMgcGFyYW1ldGVycyBmcm9tIHRoZSBCR00gc2V0dGluZ3MgaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKioqCi0gKiBGQjogdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBzdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIHNhdmluZyBpcyBub3cgdGhlCi0gKiAgcEN1cnJlbnRFZGl0U2V0dGluZ3MgYW5kIG5vdCB0aGUgcFNldHRpbmdzCi0gKiBUaGlzIGNoYW5nZSBoYXMgYmVlbiBhZGRlZCBmb3IgdGhlIFVURiBzdXBwb3J0Ci0gKiBBbGwgdGhlICJ4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgInhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MiCi0gKioqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBBdWRpb01peFNldHRpbmdzOwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcEF1ZGlvTWl4aW5nQ3R4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGUgYXVkaW8gbWl4aW5nIHNldHRpbmdzIHN0cnVjdHVyZSBhbmQgZmlsbCBpdCB3aXRoIEJHTSBwYXJhbWV0ZXJzICovCi0gICAgcEF1ZGlvTWl4U2V0dGluZ3MgPSAoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwotICAgICAgICAoc2l6ZW9mKE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKSwgTTRWUywgKE00T1NBX0NoYXIgKikicEF1ZGlvTWl4U2V0dGluZ3MiKTsKLSAgICBpZihwQXVkaW9NaXhTZXR0aW5ncyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsR2VuZXJhdGVBdWRpb01peEZpbGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZSA9PQotICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFApCi0gICAgewotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKChNNE9TQV9Db250ZXh0KXhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAoTTRPU0FfQ2hhciopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgICAmZmlsZVByb3BlcnRpZXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlOlwKLSAgICAgICAgICAgICAgICAgaW1wb3NzaWJsZSB0byByZXRyaWV2ZSBhdWRpbyBCR00gcHJvcGVydGllcyAtPlwKLSAgICAgICAgICAgICAgICAgICAgIHJlZW5jb2RpbmcgYXVkaW8gYmFja2dyb3VuZCBtdXNpYyIsIGVycik7Ci0gICAgICAgICAgICBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0KzE7Ci0gICAgICAgICAgICAgICAgICAvKiBUbyBmb3JjZSBCR00gZW5jb2RpbmcgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIHBBdWRpb01peFNldHRpbmdzLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9GQUxTRTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+QWRkZWRBdWRpb0ZpbGVUeXBlID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5wQWRkZWRBdWRpb1RyYWNrRmlsZSA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRWb2x1bWUgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWU7Ci0KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0QVNGID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dEF1ZGlvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlOdW1DaGFubmVscyA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlOdW1DaGFubmVsczsKLQotICAgIHBBdWRpb01peFNldHRpbmdzLT5iX0R1Y2tpbmdOZWVkZWVkID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPmJfRHVja2luZ05lZWRlZWQ7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPmZCVFZvbExldmVsID0KLSAgICAgKE00T1NBX0Zsb2F0ICl4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUvMTAwOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5JbkR1Y2tpbmdfdGhyZXNob2xkID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPkluRHVja2luZ19sb3dWb2x1bWUgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+bG93Vm9sdW1lLzEwMDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+ZlBUVm9sTGV2ZWwgPQotICAgICAoTTRPU0FfRmxvYXQpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPlBUVm9sTGV2ZWwvMTAwOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5iTG9vcCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+Ykxvb3A7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vKQotICAgIHsKLSAgICAgICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscyA9IDI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbCBhdWRpbyBtaXggc2V0dGluZ3Mgd2l0aCBCR00gcGFyYW1ldGVycyAqLwotICAgIHBBdWRpb01peFNldHRpbmdzLT51aUJlZ2luTG9vcCA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlFbmRMb29wID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpRW5kTG9vcDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRDdHM7Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgZmlsZSBvZiB0aGUgYXVkaW8gbWl4ZXIgd2lsbCBiZSBmaW5hbCBmaWxlIChhdWRpbyBtaXhpbmcgaXMgdGhlIGxhc3Qgc3RlcCkgKi8KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cE91dHB1dENsaXBGaWxlID0geFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPSB4VlNTX2NvbnRleHQtPnBUZW1wb3JhcnlGaWxlOwotCi0gICAgLyoqCi0gICAgICogSW5wdXQgZmlsZSBvZiB0aGUgYXVkaW8gbWl4ZXIgaXMgYSB0ZW1wb3JhcnkgZmlsZSBjb250YWluaW5nIGFsbCBhdWRpby92aWRlbyBlZGl0aW9ucyAqLwotICAgIHBBdWRpb01peFNldHRpbmdzLT5wT3JpZ2luYWxDbGlwRmlsZSA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlOwotCi0gICAgLyoqCi0gICAgICogU2F2ZSBhdWRpbyBtaXhpbmcgc2V0dGluZ3MgcG9pbnRlciB0byBiZSBhYmxlIHRvIGZyZWUgaXQgaW4KLSAgICAgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSBmdW5jdGlvbiAqLwotICAgIHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgPSBwQXVkaW9NaXhTZXR0aW5nczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoJnBBdWRpb01peGluZ0N0eHQsIHBBdWRpb01peFNldHRpbmdzLAotICAgICAgICAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIsIHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cik7Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGJlIGFibGUgdG8gY2FsbCBhdWRpbyBtaXhpbmcgc3RlcCBmdW5jdGlvbiBpbgotICAgICAgTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQgPSBwQXVkaW9NaXhpbmdDdHh0OwotCi0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlOlwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0IHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgLy9NNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKHBBdWRpb01peGluZ0N0eHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBWU1MgZm9yIGF1ZGlvIG1peGluZwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICAqIEZyZWUgdGhpcyBWU1MzR1BQIGF1ZGlvIG1peGluZyBpbnN0YW5jZSAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4Q29udGV4dCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCh4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlOlwKLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBWU1MgYXVkaW8gbWl4aW5nIHNldHRpbmdzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wQXVkaW9NaXhTZXR0aW5ncyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBBdWRpb01peFNldHRpbmdzKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQXVkaW9NaXhTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlUHJldmlldyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBwcmV2aWV3IGVkaXRpb24gc3RydWN0dXJlIHVzZWQgdG8gZ2VuZXJhdGUKLSAqICAgICAgICAgICAgcHJldmlldy4zZ3AgZmlsZSBnaXZlbiB0byB0aGUgVlBTCi0gKiBAbm90ZSAgICBJdCBhbHNvIGZyZWUgdGhlIHByZXZpZXcgc3RydWN0dXJlIGdpdmVuIHRvIHRoZSBWUFMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlUHJldmlldyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgIGZvcihpPTA7IGk8eFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKyspCi0gICAgewotICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pOwotCi0gICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdFtpXSkpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KLSAgICAgICAgaWYoaSAhPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXItMSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBjbGlwL3RyYW5zaXRpb24gbGlzdCAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0KSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBvdXRwdXQgcHJldmlldyBmaWxlIHBhdGggKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRlbXBvcmFyeSBwcmV2aWV3IGZpbGUgcGF0aCAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSAibG9jYWwiIEJHTSBzZXR0aW5ncyAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgY3VycmVudCBlZGl0IHNldHRpbmdzIHN0cnVjdHVyZSAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgcHJldmlldyBlZmZlY3RzIGdpdmVuIHRvIGFwcGxpY2F0aW9uICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSB4VlNTX2NvbnRleHQtPnBQcmV2aWV3U2V0dGluZ3MtPkVmZmVjdHMpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+RWZmZWN0cyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVNhdmluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBzYXZpbmcgZWRpdGlvbiBzdHJ1Y3R1cmUgdXNlZCB0byBnZW5lcmF0ZQotICogICAgICAgICAgICBvdXRwdXQuM2dwIGZpbGUgZ2l2ZW4gdG8gdGhlIFZQUwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDggaTsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBmb3IoaT0wOyBpPHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pOwotCi0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgICAgICBpZihpICE9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpQ2xpcE51bWJlci0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoXAotICAgICAgICAgICAgICAgICAgICAoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBsaXN0ICovCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0cykpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5uYkVmZmVjdHMgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZyZWUgb3V0cHV0IHNhdmluZyBmaWxlIHBhdGggKi8KLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSB0ZW1wb3Jhcnkgc2F2aW5nIGZpbGUgcGF0aCAqLwotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlICJsb2NhbCIgQkdNIHNldHRpbmdzICovCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSBjdXJyZW50IGVkaXQgc2V0dGluZ3Mgc3RydWN0dXJlICovCi0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfZnJlZVNldHRpbmdzKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIGFuIE00VlNTM0dQUF9FZGl0U2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAoSU4pIFBvaW50ZXIgb24gTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyBzdHJ1Y3R1cmUgdG8gZnJlZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVTZXR0aW5ncyhNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MpCi17Ci0gICAgTTRPU0FfVUludDggaSxqOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVhY2ggY2xpcCAuLi4gKi8KLSAgICBmb3IoaT0wOyBpPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKyspCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGZyZWUgY2xpcCBzZXR0aW5ncyAqLwotICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyhwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSk7Ci0KLSAgICAgICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldKSk7Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGZyZWUgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBpZihpIDwgcFNldHRpbmdzLT51aUNsaXBOdW1iZXItMSkgLyogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+VmlkZW9UcmFuc2l0aW9uVHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0FscGhhTWFnaWM6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogSW4gY2FzZSBvZiBBbHBoYSBNYWdpYyB0cmFuc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lIGV4dHJhIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBmcmVlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoKCgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmUtPnBhY19kYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCktPnBQbGFuZS0+cGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgoKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKilcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCktPnBQbGFuZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5wUGxhbmUgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGo9aSsxO2o8cFNldHRpbmdzLT51aUNsaXBOdW1iZXItMTtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+VmlkZW9UcmFuc2l0aW9uVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwQ21wUmVzdWx0PTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDbXBSZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgZXh0cmEgaW50ZXJuYWwgYWxwaGEgbWFnaWMgc3RydWN0dXJlIGFuZCBwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgdG8gTlVMTCB0byBhdm9pZCByZWZyZWVpbmcgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3Rbal0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2pdLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfU2xpZGVUcmFuc2l0aW9uOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBTbGlkZVRyYW5zaXRpb25TZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEZyZWUgdHJhbnNpdGlvbiBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSkpOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgY2xpcCBsaXN0ICovCi0gICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRyYW5zaXRpb24gbGlzdCAqLwotICAgIGlmKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOwotICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUkM6IEZyZWUgZWZmZWN0cyBsaXN0ICovCi0gICAgaWYocFNldHRpbmdzLT5FZmZlY3RzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmb3IoaT0wOyBpPHBTZXR0aW5ncy0+bmJFZmZlY3RzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRm9yIGVhY2ggY2xpcCwgZnJlZSBmcmFtaW5nIHN0cnVjdHVyZSBpZiBuZWVkZWQgKi8KLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZwotICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfVGV4dCkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nQ29udGV4dCogZnJhbWluZ0N0eCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0OwotI2Vsc2UKLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0OwotICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4X3NhdmU7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmczMTAyU3RydWN0KiBmcmFtaW5nQ3R4X2ZpcnN0ID0gZnJhbWluZ0N0eDsKLSNlbmRpZgotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4ICE9IE00T1NBX05VTEwpIC8qIEJ1Z2ZpeCAxLjIuMDogY3Jhc2gsIHRyeWluZyB0byBmcmVlIG5vbiBleGlzdGFudAotICAgICAgICAgICAgICAgICBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtaW5nWXV2WzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMl0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2IgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nWXV2ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1l1dik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLypJbiBjYXNlIHRoZXJlIGFyZSBzdGlsbCBhbGxvY2F0ZWQqLwotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5wU1BTQ29udGV4dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIE00U1BTX2Rlc3Ryb3koZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCAgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eCAhPSBNNE9TQV9OVUxMKSAvKiBCdWdmaXggMS4yLjA6IGNyYXNoLCB0cnlpbmcgdG8gZnJlZSBub24KLSAgICAgICAgICAgICAgICAgICAgZXhpc3RhbnQgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eF9zYXZlID0gZnJhbWluZ0N0eC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4ID0gZnJhbWluZ0N0eF9zYXZlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogYnVnIGZpeCBQNE1FMDAwMDMwMDIqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IHdoaWxlKGZyYW1pbmdDdHhfZmlyc3QgIT0gZnJhbWluZ0N0eCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIEZpZnRpZXMgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19GaWZ0aWVzU3RydWN0KiBGaWZ0aWVzQ3R4ID0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQ7Ci0KLSAgICAgICAgICAgICAgICBpZihGaWZ0aWVzQ3R4ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKEZpZnRpZXNDdHgpOwotICAgICAgICAgICAgICAgICAgICBGaWZ0aWVzQ3R4ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTYgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGUgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1BpbmsgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuID09IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICB8fCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYSA9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgfHwgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgfHwgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEZyZWUgQ29sb3IgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDdHggPSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dDsKLQotICAgICAgICAgICAgICAgIGlmKENvbG9yQ3R4ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKENvbG9yQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgQ29sb3JDdHggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogRnJlZSBzaW1wbGUgZmllbGRzICovCi0gICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucFRleHRCdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBUZXh0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHMpOwotICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0vLyAgICBNNE9TQV9VSW50OCBpLGo7Ci0KLSAgICAvKiBGcmVlICJsb2NhbCIgQkdNIHNldHRpbmdzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgTTR4VlNTX2ZyZWVTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyk7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zKiBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3Q7Ci0gICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogcFBhcmFtc19zYXV2OwotCi0gICAgICAgIHdoaWxlKHBQYXJhbXMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwUGFyYW1zLT5wRmlsZU91dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwUGFyYW1zLT5wRmlsZVRlbXAgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVUZW1wKTsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0jZW5kaWYvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgZnJlZShwUGFyYW1zX3NhdXYpOwotICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zKiBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgTTR4VlNTX01DU19wYXJhbXMqIHBQYXJhbXNfc2F1djsKLQotICAgICAgICB3aGlsZShwUGFyYW1zICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlSW4gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlSW4pOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVUZW1wICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0jaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotI2VuZGlmLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gcFBhcmFtczsKLSAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBSZWluaXQgYWxsIGNvbnRleHQgdmFyaWFibGVzICovCi0gICAgeFZTU19jb250ZXh0LT5wcmV2aW91c0NsaXBOdW1iZXIgPSAwOwotICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPSBNNHhWU1Nfa01pY3JvU3RhdGVFZGl0aW5nOwotICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPSBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsKLSAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCA9IDA7Ci0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IDA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogcEZpbGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmUgcHJvcGVydGllcyBvZiBhbiBpbnB1dCAzR1AgZmlsZSB1c2luZyBNQ1MKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRmlsZSAgICAgICAgICAgIChJTikgM0dQIGZpbGUgdG8gYW5hbHlzZQotICogQHBhcmFtICAgIHBGaWxlUHJvcGVydGllcyAgICAoSU4vT1VUKSBQb2ludGVyIG9uIGEgc3RydWN0dXJlIHRoYXQgd2lsbCBjb250YWluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgM0dQIGZpbGUgcHJvcGVydGllcwotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9DaGFyKiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE1DU19Db250ZXh0IG1jc19jb250ZXh0OwotCi0gICAgZXJyID0gTTRNQ1NfaW5pdCgmbWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXM6IEVycm9yIGluIE00TUNTX2luaXQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qb3BlbiB0aGUgTUNTIGluIHRoZSAibm9ybWFsIG9wZW5pbmciIG1vZGUgdG8gcmV0cmlldmUgdGhlIGV4YWN0IGR1cmF0aW9uKi8KLSAgICBlcnIgPSBNNE1DU19vcGVuX25vcm1hbE1vZGUobWNzX2NvbnRleHQsIHBGaWxlLCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCwKLSAgICAgICAgTTRPU0FfTlVMTCwgTTRPU0FfTlVMTCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXM6IEVycm9yIGluIE00TUNTX29wZW46IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhtY3NfY29udGV4dCwgcEZpbGVQcm9wZXJ0aWVzKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX2Fib3J0KG1jc19jb250ZXh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllczogRXJyb3IgaW4gTTRNQ1NfYWJvcnQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBUYXJnZXRlZFRpbWVTY2FsZSkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZSB0YXJnZXRlZCB0aW1lIHNjYWxlCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSAgICBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICogQHBhcmFtICAgIHBUYXJnZXRlZFRpbWVTY2FsZSAgICAoT1VUKSAgICBUYXJnZXRlZCB0aW1lIHNjYWxlCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwVGFyZ2V0ZWRUaW1lU2NhbGUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdG90YWxEdXJhdGlvbiA9IDA7Ci0gICAgTTRPU0FfVUludDggaSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHRlbXBUaW1lU2NhbGUgPSAwLCB0ZW1wRHVyYXRpb24gPSAwOwotCi0gICAgZm9yKGk9MDtpPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyO2krKykKLSAgICB7Ci0gICAgICAgIC8qc2VhcmNoIHRpbWVzY2FsZSBvbmx5IGluIG1wZWc0IGNhc2UqLwotICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAKLSAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0Ci0gICAgICAgICAgICB8fCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX000VikKLSAgICAgICAgewotICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgZmlsZVByb3BlcnRpZXM7Ci0KLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0KLSAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKikgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0luaXQ6XAotICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKkVuZCBvZiB0aGUgY29udmVyc2lvbjogdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBEZWNvZGVkUGF0aCwgJmZpbGVQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgLypnZXQgaW5wdXQgZmlsZSBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgIC8qZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+cEZpbGUsICZmaWxlUHJvcGVydGllcyk7Ki8KLSAgICAgICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZTpcCi0gICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzIHJldHVybmVkOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRlbXBEdXJhdGlvbiA8IChwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFRpbWVTY2FsZSA9IGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRHVyYXRpb24gPSAocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRlbXBEdXJhdGlvbiA8IChmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAtIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBUaW1lU2NhbGUgPSBmaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcER1cmF0aW9uID0gKGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkKLSAgICAgICAgewotICAgICAgICAgICAgLyp0aGUgdGltZXNjYWxlIGlzIDMwIGZvciBQVE8zR1AqLwotICAgICAgICAgICAgKnBUYXJnZXRlZFRpbWVTY2FsZSA9IDMwOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHRlbXBUaW1lU2NhbGUgPj0gMzApLypEZWZpbmUgYSBtaW5pbXVtIHRpbWUgc2NhbGUsIG90aGVyd2lzZSBpZiB0aGUgdGltZXNjYWxlIGlzIG5vdAotICAgIGVub3VnaCwgdGhlcmUgd2lsbCBiZSBhbiBpbmZpbml0ZSBsb29wIGluIHRoZSBzaGVsbCBlbmNvZGVyKi8KLSAgICB7Ci0gICAgICAgICpwVGFyZ2V0ZWRUaW1lU2NhbGUgPSB0ZW1wVGltZVNjYWxlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFRhcmdldGVkVGltZVNjYWxlID0gMzA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotewotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpLGo7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDb250ZXh0ID0gKE00eFZTU19Db2xvclN0cnVjdCopcEZ1bmN0aW9uQ29udGV4dDsKLQotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHBfYnVmX2Rlc3QgPSAmKFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDaHJvbWluYW5jZSAqLwotICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xIHx8IHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KQotICAgICAgICAgICAgICAgIC8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDI1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDExNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTM5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2IHIgPSAwLGcgPSAwLGIgPSAwLHkgPSAwLHUgPSAwLHYgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBnZXQgdGhlIHIsIGcsIGIqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDAwMWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDA3ZTApPj41OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweGY4MDApPj4xMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsIChNNE9TQV9VSW50OCl2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50OgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZmlyc3QgZ2V0IHRoZSByLCBnLCBiKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwMDFmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHhmODAwKT4+MTE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmZvciBjb2xvciBncmFkYXRpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoTTRPU0FfVUludDE2KSggYiAtICgoYippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gKE00T1NBX1VJbnQxNikoZyAtICgoZyppKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKE00T1NBX1VJbnQxNikociAtICgocippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBMdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KQotICAgICAgICAgICAgICAgIC8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0W2pdID0gMjU1IC0gcF9idWZfc3JjW2pdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9idWZfc3JjICs9IFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0gUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBmaXhlZCBvciBhbmltYXRlZCBpbWFnZSBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJblszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkKLXsKLSAgICBNNFZJRklfVUludDMyIHgseTsKLQotICAgIE00VklGSV9VSW50OCAqcF9pbl9ZID0gUGxhbmVJblswXS5wYWNfZGF0YTsKLSAgICBNNFZJRklfVUludDggKnBfaW5fVSA9IFBsYW5lSW5bMV0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luX1YgPSBQbGFuZUluWzJdLnBhY19kYXRhOwotCi0gICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIEZyYW1pbmcgPSBNNE9TQV9OVUxMOwotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBjdXJyZW50RnJhbWluZyA9IE00T1NBX05VTEw7Ci0gICAgTTRWSUZJX1VJbnQ4ICpGcmFtaW5nUkdCID0gTTRPU0FfTlVMTDsKLQotICAgIE00VklGSV9VSW50OCAqcF9vdXQwOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQxOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQyOwotCi0gICAgTTRWSUZJX1VJbnQzMiB0b3BsZWZ0WzJdOwotCi0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQxID0gKE00T1NBX1VJbnQ4KSgoVFJBTlNQQVJFTlRfQ09MT1IgJiAweEZGMDApPj44KTsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDIgPSAoTTRPU0FfVUludDgpVFJBTlNQQVJFTlRfQ09MT1I7Ci0KLSNpZm5kZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopdXNlckRhdGE7Ci0gICAgY3VycmVudEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKilGcmFtaW5nLT5wQ3VycmVudDsKLSAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0KLSAgICAvKkZCKi8KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgRnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKSgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFGcmFtaW5nQ3R4OwotICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZzsKLSAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0gICAgLyplbmQgRkIqLwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBpbnB1dCAvIG91dHB1dCBwbGFuZSBwb2ludGVycyAqLwotICAgIHBfaW5fWSArPSBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwX2luX1UgKz0gUGxhbmVJblsxXS51X3RvcGxlZnQ7Ci0gICAgcF9pbl9WICs9IFBsYW5lSW5bMl0udV90b3BsZWZ0OwotCi0gICAgcF9vdXQwID0gUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcF9vdXQxID0gUGxhbmVPdXRbMV0ucGFjX2RhdGE7Ci0gICAgcF9vdXQyID0gUGxhbmVPdXRbMl0ucGFjX2RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBEZXBlbmRpbmcgb24gdGltZSwgaW5pdGlhbGl6ZSBGcmFtaW5nIGZyYW1lIHRvIHVzZSAqLwotICAgIGlmKEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPT0gLTEpCi0gICAgewotICAgICAgICBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgY2xpcCB0aW1lIGhhcyByZWFjaCB0aGUgZHVyYXRpb24gb2Ygb25lIGZyYW1lIG9mIHRoZSBmcmFtaW5nIHBpY3R1cmUKLSAgICAgKiB3ZSBuZWVkIHRvIHN0ZXAgdG8gbmV4dCBmcmFtaW5nIHBpY3R1cmUgKi8KLQotICAgIEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICBGcmFtaW5nUkdCID0gY3VycmVudEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotICAgIHRvcGxlZnRbMF0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF94OwotICAgIHRvcGxlZnRbMV0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF95OwotCi0gICAgZm9yKCB4PTAgO3ggPCBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgZm9yKCB5PTAgO3kgPCBQbGFuZUluWzBdLnVfd2lkdGggOyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVG8gaGFuZGxlIGZyYW1pbmcgd2l0aCBpbnB1dCBzaXplICE9IG91dHB1dCBzaXplCi0gICAgICAgICAgICAgKiBGcmFtaW5nIGlzIGFwcGx5ZWQgaWYgY29vcmRpbmF0ZXMgbWF0Y2hlcyBiZXR3ZWVuIGZyYW1pbmcvdG9wbGVmdCBhbmQgaW5wdXQgcGxhbmUgKi8KLSAgICAgICAgICAgIGlmKCB5IDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAgJiYKLSAgICAgICAgICAgICAgICB5ID49IHRvcGxlZnRbMF0gJiYKLSAgICAgICAgICAgICAgICB4IDwgKHRvcGxlZnRbMV0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X2hlaWdodCkgJiYKLSAgICAgICAgICAgICAgICB4ID49IHRvcGxlZnRbMV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypBbHBoYSBibGVuZGluZyBzdXBwb3J0Ki8KLSAgICAgICAgICAgICAgICBNNE9TQV9GbG9hdCBhbHBoYUJsZW5kaW5nID0gMTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyogIGFscGhhQmxlbmRpbmdTdHJ1Y3QgPVwKLSAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKilcCi0gICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFscGhhQmxlbmRpbmdTdHJ1Y3Q7Ci0KLSAgICAgICAgICAgICAgICBpZihhbHBoYUJsZW5kaW5nU3RydWN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgXAotICAgICAgICAgICAgICAgICAgICA8IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQgLyAxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoKE00T1NBX0Zsb2F0KShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBQcm9ncmVzcy0+dWlQcm9ncmVzcy8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgLz0gMTAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocFByb2dyZXNzLT51aVByb2dyZXNzID49IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPlwKLSAgICAgICAgICAgICAgICAgICAgbV9mYWRlSW5UaW1lKjEwKSAmJiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPCAxMDAwXAotICAgICAgICAgICAgICAgICAgICAgLSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lKjEwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IChNNE9TQV9GbG9hdClcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKE00T1NBX0Zsb2F0KWFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlLzEwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPj0gMTAwMCAtIChNNE9TQV9VSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCAvIDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9ICgoTTRPU0FfRmxvYXQpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kKSkqKDEwMDAgLSBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nIC89IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiovCi0KLSAgICAgICAgICAgICAgICBpZigoKihGcmFtaW5nUkdCKT09dHJhbnNwYXJlbnQxKSAmJiAoKihGcmFtaW5nUkdCKzEpPT10cmFuc3BhcmVudDIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KCoocF9pbl9ZK3kreCpQbGFuZUluWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fVSsoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMV0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDAreSt4KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKyh5LXRvcGxlZnRbMF0pXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoeC10b3BsZWZ0WzFdKSpjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSkpKmFscGhhQmxlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fWSt5K3gqUGxhbmVJblswXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlKSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSkrPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9VKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsxXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlKSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSkrPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiggUGxhbmVJblswXS51X3dpZHRoIDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAmJgotICAgICAgICAgICAgICAgICAgICB5ID09IFBsYW5lSW5bMF0udV93aWR0aC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JHQiA9IEZyYW1pbmdSR0IgKyAyIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICogKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBsYW5lSW5bMF0udV93aWR0aCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcmFtaW5nUkdCID0gRnJhbWluZ1JHQiArIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBKdXN0IGNvcHkgaW5wdXQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luX1kreSt4KlBsYW5lSW5bMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIG1ha2UgYSB2aWRlbyBsb29rIGFzIGlmIGl0IHdhcyB0YWtlbiBpbiB0aGUgZmlmdGllcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwVXNlckRhdGEgICAgICAgKElOKSBDb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBGaWZ0aWVzRGF0YSwgcFBsYW5lT3V0IG9yIHBQcm9ncmVzcyBhcmUgTlVMTCAoREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyggTTRPU0FfVm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkKLXsKLSAgICBNNFZJRklfVUludDMyIHgsIHksIHhTaGlmdDsKLSAgICBNNFZJRklfVUludDggKnBJblkgPSBwUGxhbmVJblswXS5wYWNfZGF0YTsKLSAgICBNNFZJRklfVUludDggKnBPdXRZLCAqcEluWWJlZ2luOwotICAgIE00VklGSV9VSW50OCAqcEluQ3IsKiBwT3V0Q3I7Ci0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLQotICAgIC8qIEludGVybmFsIGNvbnRleHQqLwotICAgIE00eFZTU19GaWZ0aWVzU3RydWN0KiBwX0ZpZnRpZXNEYXRhID0gKE00eFZTU19GaWZ0aWVzU3RydWN0ICopcFVzZXJEYXRhOwotCi0gICAgLyogQ2hlY2sgdGhlIGlucHV0cyAoZGVidWcgb25seSkgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBfRmlmdGllc0RhdGEgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInhWU1M6IHBfRmlmdGllc0RhdGEgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBQbGFuZU91dCA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAieFZTUzogcF9QbGFuZU91dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFByb2dyZXNzID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInhWU1M6IHBfUHJvZ3Jlc3MgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMiKTsKLQotICAgIC8qIEluaXRpYWxpemUgaW5wdXQgLyBvdXRwdXQgcGxhbmUgcG9pbnRlcnMgKi8KLSAgICBwSW5ZICs9IHBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwT3V0WSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwSW5ZYmVnaW4gID0gcEluWTsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSAqLwotICAgIGlmKHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPCAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfcmFuZEluaXQoKTsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIgKikmKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV9oZWlnaHQpID4+IDQpOwotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiAqKSYocF9GaWZ0aWVzRGF0YS0+c3RyaXBlUmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV93aWR0aCk8PCAyKTsKLSAgICAgICAgcF9GaWZ0aWVzRGF0YS0+cHJldmlvdXNDbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLQotICAgIC8qIENob29zZSByYW5kb20gdmFsdWVzIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZHVyYXRpb24gb2YgYSBwYXJ0aWFsIGVmZmVjdCAqLwotICAgIGVsc2UgaWYoIChwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZSAtIHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUpXAotICAgICAgICAgPiBwX0ZpZnRpZXNEYXRhLT5maWZ0aWVzRWZmZWN0RHVyYXRpb24pCi0gICAgewotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiAqKSYocF9GaWZ0aWVzRGF0YS0+c2hpZnRSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X2hlaWdodCkgPj4gNCk7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyICopJihwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X3dpZHRoKTw8IDIpOwotICAgICAgICBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyogUHV0IGluIFNlcGlhIHRoZSBjaHJvbWluYW5jZSAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMTsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwSW5DciAgPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhICArIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0OwotICAgICAgICBwT3V0Q3IgPSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YSArIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdDsKLQotICAgICAgICBmb3IgKHggPSAwOyB4IDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKDEgPT0gcGxhbmVfbnVtYmVyKQotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRDciwgMTE3LHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7IC8qIFUgdmFsdWUgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDEzOSxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBWIHZhbHVlICovCi0KLSAgICAgICAgICAgIHBJbkNyICArPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcE91dENyICs9IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB0aGUgbmV3IHBpeGVscyB2YWx1ZXMgKi8KLSAgICBmb3IoIHggPSAwIDsgeCA8IHBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4ICpwX291dFl0bXAsICpwX2luWXRtcDsKLQotICAgICAgICAvKiBDb21wdXRlIHRoZSB4U2hpZnQgKHJhbmRvbSB2YWx1ZSkgKi8KLSAgICAgICAgaWYgKDAgPT0gKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgJSA1ICkpCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgKSAlIChwUGxhbmVJblswXS51X2hlaWdodCAtIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIChwUGxhbmVJblswXS51X2hlaWdodCAtIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpICkgXAotICAgICAgICAgICAgICAgICUgKHBQbGFuZUluWzBdLnVfaGVpZ2h0IC0gMSk7Ci0KLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcG9pbnRlcnMgKi8KLSAgICAgICAgcF9vdXRZdG1wID0gcE91dFkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHlTaGlmdCBvZiAxIHBpeGVsICovCi0gICAgICAgIHBfaW5ZdG1wICA9IHBJblliZWdpbiArICh4U2hpZnQgKiBwUGxhbmVJblswXS51X3N0cmlkZSk7ICAvKiBBcHBseSB0aGUgeFNoaWZ0ICovCi0KLSAgICAgICAgZm9yKCB5ID0gMCA7IHkgPCBwUGxhbmVJblswXS51X3dpZHRoIDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTZXQgWSB2YWx1ZSAqLwotICAgICAgICAgICAgaWYgKHhTaGlmdCA+IChwUGxhbmVJblswXS51X2hlaWdodCAtIDQpKQotICAgICAgICAgICAgICAgICpwX291dFl0bXAgPSA0MDsgICAgICAgIC8qIEFkZCBzb21lIGhvcml6b250YWwgYmxhY2sgbGluZXMgYmV0d2VlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gcGFydHMgb2YgdGhlIGltYWdlICovCi0gICAgICAgICAgICBlbHNlIGlmICggeSA9PSBwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSkKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gOTA7ICAgICAgICAvKiBBZGQgYSByYW5kb20gdmVydGljYWwgbGluZSBmb3IgdGhlIGJ1bGsgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gKnBfaW5ZdG1wOwotCi0KLSAgICAgICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IHBpeGVsICovCi0gICAgICAgICAgICBwX291dFl0bXArKzsKLSAgICAgICAgICAgIHBfaW5ZdG1wKys7Ci0KLSAgICAgICAgICAgIC8qIFJlc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBmb3IgdGhlIGxhc3QgcGl4ZWwqLwotICAgICAgICAgICAgaWYgKHkgPT0gKHBQbGFuZUluWzBdLnVfd2lkdGggLSAyKSkKLSAgICAgICAgICAgICAgICBwX291dFl0bXAgPSBwT3V0WTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgcE91dFkgKz0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbSggKQotICogQGJyaWVmICAgIFpvb20gaW4vb3V0IHZpZGVvIGVmZmVjdCBmdW5jdGlvbnMuCi0gKiBAbm90ZSAgICBUaGUgZXh0ZXJuYWwgdmlkZW8gZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSBpcyBzZXQgdG8KLSAqIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX1pvb21JbiBvciBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0LgotICoKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQgICAgKElOKSBUaGUgZnVuY3Rpb24gY29udGV4dCwgcHJldmlvdXNseSBzZXQgYnkgdGhlIGludGVncmF0b3IKLSAqIEBwYXJhbSAgICBwSW5wdXRQbGFuZXMgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgICAgICAoSU4vT1VUKSBPdXRwdXQgKGZpbHRlcmVkKSBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgICAgICAoSU4pIFNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlkZW8gdHJhbnNpdGlvbiBwcm9ncmVzcy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3Rab29tKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQKLSkKLXsKLSAgICBNNE9TQV9VSW50MzIgYm94V2lkdGg7Ci0gICAgTTRPU0FfVUludDMyIGJveEhlaWdodDsKLSAgICBNNE9TQV9VSW50MzIgYm94UG9zWDsKLSAgICBNNE9TQV9VSW50MzIgYm94UG9zWTsKLSAgICBNNE9TQV9VSW50MzIgcmF0aW8gPSAwOwotICAgIC8qICAqIDEuMTg5MjA3IGJldHdlZW4gcmF0aW8gKi8KLSAgICAvKiB6b29tIGJldHdlZW4geDEgYW5kIHgxNiAqLwotICAgIE00T1NBX1VJbnQzMiByYXRpb3RhYlsxN10gPXsxMDI0LDEyMTgsMTQ0OCwxNzIyLDIwNDgsMjQzNSwyODk2LDM0NDQsNDA5Niw0ODcxLDU3OTMsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ODg5LDgxOTIsOTc0MiwxMTU4NSwxMzc3NywxNjM4NH07Ci0gICAgTTRPU0FfVUludDMyIGlrOwotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgYm94UGxhbmVbM107Ci0KLSAgICBpZihNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0ID09IChNNE9TQV9VSW50MzIpcEZ1bmN0aW9uQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vcmF0aW8gPSAxNiAtICgxNSAqIHBQcm9ncmVzcy0+dWlQcm9ncmVzcykvMTAwMDsKLSAgICAgICAgcmF0aW8gPSAxNiAtIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAvIDY2IDsKLSAgICB9Ci0gICAgZWxzZSBpZihNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tSW4gPT0gKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KQotICAgIHsKLSAgICAgICAgLy9yYXRpbyA9IDEgKyAoMTUgKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIHJhdGlvID0gMSArIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAvIDY2IDsKLSAgICB9Ci0KLSAgICBmb3IoaWs9MDtpazwzO2lrKyspewotCi0gICAgICAgIGJveFBsYW5lW2lrXS51X3N0cmlkZSA9IHBJbnB1dFBsYW5lc1tpa10udV9zdHJpZGU7Ci0gICAgICAgIGJveFBsYW5lW2lrXS5wYWNfZGF0YSA9IHBJbnB1dFBsYW5lc1tpa10ucGFjX2RhdGE7Ci0KLSAgICAgICAgYm94SGVpZ2h0ID0gKCBwSW5wdXRQbGFuZXNbaWtdLnVfaGVpZ2h0IDw8IDEwICkgLyByYXRpb3RhYltyYXRpb107Ci0gICAgICAgIGJveFdpZHRoID0gKCBwSW5wdXRQbGFuZXNbaWtdLnVfd2lkdGggPDwgMTAgKSAvIHJhdGlvdGFiW3JhdGlvXTsKLSAgICAgICAgYm94UGxhbmVbaWtdLnVfaGVpZ2h0ID0gKGJveEhlaWdodCkmKH4xKTsKLSAgICAgICAgYm94UGxhbmVbaWtdLnVfd2lkdGggPSAoYm94V2lkdGgpJih+MSk7Ci0KLSAgICAgICAgYm94UG9zWSA9IChwSW5wdXRQbGFuZXNbaWtdLnVfaGVpZ2h0ID4+IDEpIC0gKGJveFBsYW5lW2lrXS51X2hlaWdodCA+PiAxKTsKLSAgICAgICAgYm94UG9zWCA9IChwSW5wdXRQbGFuZXNbaWtdLnVfd2lkdGggPj4gMSkgLSAoYm94UGxhbmVbaWtdLnVfd2lkdGggPj4gMSk7Ci0gICAgICAgIGJveFBsYW5lW2lrXS51X3RvcGxlZnQgPSBib3hQb3NZICogYm94UGxhbmVbaWtdLnVfc3RyaWRlICsgYm94UG9zWDsKLSAgICB9Ci0KLSAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCAoTTRWSUZJX0ltYWdlUGxhbmUqKSZib3hQbGFuZSwgcE91dHB1dFBsYW5lcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gKi8KLSAgICByZXR1cm4oTTROT19FUlJPUik7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19BbHBoYU1hZ2ljKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgY29sb3IgZWZmZWN0IG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgdXNlckRhdGEgICAgICAgIChJTikgQ29udGFpbnMgYSBwb2ludGVyIG9uIGEgc2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICAgUGxhbmVJbjEgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hciBmcm9tIHZpZGVvIDEKLSAqIEBwYXJhbSAgICBQbGFuZUluMiAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyIGZyb20gdmlkZW8gMgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlUcmFuc2l0aW9uS2luZChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfQWxwaGFNYWdpYyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLCBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKiBhbHBoYUNvbnRleHQ7Ci0gICAgTTRWSUZJX0ludDMyIGFscGhhUHJvZ3Jlc3NMZXZlbDsKLQotICAgIE00VklGSV9JbWFnZVBsYW5lKiBwbGFuZXN3YXA7Ci0gICAgTTRWSUZJX1VJbnQzMiB4LHk7Ci0KLSAgICBNNFZJRklfVUludDggKnBfb3V0MDsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MTsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MjsKLSAgICBNNFZJRklfVUludDggKmFscGhhTWFzazsKLSAgICAvKiAiT2xkIGltYWdlIiAqLwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfWTsKLSAgICBNNFZJRklfVUludDggKnBfaW4xX1U7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9WOwotICAgIC8qICJOZXcgaW1hZ2UiICovCi0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9ZOwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfVTsKLSAgICBNNFZJRklfVUludDggKnBfaW4yX1Y7Ci0KLSAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgYWxwaGFDb250ZXh0ID0gKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqKXVzZXJEYXRhOwotCi0gICAgYWxwaGFQcm9ncmVzc0xldmVsID0gKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAqIDEyOCkvMTAwMDsKLQotICAgIGlmKCBhbHBoYUNvbnRleHQtPmlzcmV2ZXJzZSAhPSBNNE9TQV9GQUxTRSkKLSAgICB7Ci0gICAgICAgIGFscGhhUHJvZ3Jlc3NMZXZlbCA9IDEyOCAtIGFscGhhUHJvZ3Jlc3NMZXZlbDsKLSAgICAgICAgcGxhbmVzd2FwID0gUGxhbmVJbjE7Ci0gICAgICAgIFBsYW5lSW4xID0gUGxhbmVJbjI7Ci0gICAgICAgIFBsYW5lSW4yID0gcGxhbmVzd2FwOwotICAgIH0KLQotICAgIHBfb3V0MCA9IFBsYW5lT3V0WzBdLnBhY19kYXRhOwotICAgIHBfb3V0MSA9IFBsYW5lT3V0WzFdLnBhY19kYXRhOwotICAgIHBfb3V0MiA9IFBsYW5lT3V0WzJdLnBhY19kYXRhOwotCi0gICAgYWxwaGFNYXNrID0gYWxwaGFDb250ZXh0LT5wUGxhbmUtPnBhY19kYXRhOwotCi0gICAgLyogIk9sZCBpbWFnZSIgKi8KLSAgICBwX2luMV9ZID0gUGxhbmVJbjFbMF0ucGFjX2RhdGE7Ci0gICAgcF9pbjFfVSA9IFBsYW5lSW4xWzFdLnBhY19kYXRhOwotICAgIHBfaW4xX1YgPSBQbGFuZUluMVsyXS5wYWNfZGF0YTsKLSAgICAvKiAiTmV3IGltYWdlIiAqLwotICAgIHBfaW4yX1kgPSBQbGFuZUluMlswXS5wYWNfZGF0YTsKLSAgICBwX2luMl9VID0gUGxhbmVJbjJbMV0ucGFjX2RhdGE7Ci0gICAgcF9pbjJfViA9IFBsYW5lSW4yWzJdLnBhY19kYXRhOwotCi0gICAgIC8qKgotICAgICAqIEZvciBlYWNoIGNvbHVtbiAuLi4gKi8KLSAgICBmb3IoIHk9MDsgeTxQbGFuZU91dC0+dV9oZWlnaHQ7IHkrKyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGFuZCBlYWNoIHJvdyBvZiB0aGUgYWxwaGEgbWFzayAqLwotICAgICAgICBmb3IoIHg9MDsgeDxQbGFuZU91dC0+dV93aWR0aDsgeCsrICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBJZiB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgcGl4ZWwgb2YgdGhlIGFscGhhIG1hc2sgaXMgPiB0byB0aGUgY3VycmVudCB0aW1lCi0gICAgICAgICAgICAgKiAoIGN1cnJlbnQgdGltZSBpcyBub3JtYWxpemVkIG9uIFswLTI1NV0gKSAqLwotICAgICAgICAgICAgaWYoIGFscGhhUHJvZ3Jlc3NMZXZlbCA8IGFscGhhTWFza1t4K3kqUGxhbmVPdXQtPnVfd2lkdGhdICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSBrZWVwICJvbGQgaW1hZ2UiIGluIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICooIHBfb3V0MCt4K3kqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSoocF9pbjFfWSt4K3kqUGxhbmVJbjFbMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMV9VKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjFbMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MisoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMV9WKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjFbMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIHRha2UgIm5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luMl9ZK3greSpQbGFuZUluMlswXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQxKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1UrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHVzZXJEYXRhICAgICAgICAoSU4pIENvbnRhaW5zIGEgcG9pbnRlciBvbiBhIHNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIFBsYW5lSW4xICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIgZnJvbSB2aWRlbyAxCi0gKiBAcGFyYW0gICAgUGxhbmVJbjIgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hciBmcm9tIHZpZGVvIDIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpVHJhbnNpdGlvbktpbmQoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyogYWxwaGFDb250ZXh0OwotICAgIE00VklGSV9JbnQzMiBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0gICAgTTRWSUZJX0ludDMyIGFscGhhQmxlbmRMZXZlbE1pbjsKLSAgICBNNFZJRklfSW50MzIgYWxwaGFCbGVuZExldmVsTWF4OwotICAgIE00VklGSV9JbnQzMiBhbHBoYUJsZW5kUmFuZ2U7Ci0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVzd2FwOwotICAgIE00VklGSV9VSW50MzIgeCx5OwotICAgIE00VklGSV9JbnQzMiBhbHBoYU1hc2tWYWx1ZTsKLQotICAgIE00VklGSV9VSW50OCAqcF9vdXQwOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQxOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQyOwotICAgIE00VklGSV9VSW50OCAqYWxwaGFNYXNrOwotICAgIC8qICJPbGQgaW1hZ2UiICovCi0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9ZOwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfVTsKLSAgICBNNFZJRklfVUludDggKnBfaW4xX1Y7Ci0gICAgLyogIk5ldyBpbWFnZSIgKi8KLSAgICBNNFZJRklfVUludDggKnBfaW4yX1k7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9VOwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfVjsKLQotCi0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGFscGhhQ29udGV4dCA9IChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKil1c2VyRGF0YTsKLQotICAgIGFscGhhUHJvZ3Jlc3NMZXZlbCA9IChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgKiAxMjgpLzEwMDA7Ci0KLSAgICBpZiggYWxwaGFDb250ZXh0LT5pc3JldmVyc2UgIT0gTTRPU0FfRkFMU0UpCi0gICAgewotICAgICAgICBhbHBoYVByb2dyZXNzTGV2ZWwgPSAxMjggLSBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0gICAgICAgIHBsYW5lc3dhcCA9IFBsYW5lSW4xOwotICAgICAgICBQbGFuZUluMSA9IFBsYW5lSW4yOwotICAgICAgICBQbGFuZUluMiA9IHBsYW5lc3dhcDsKLSAgICB9Ci0KLSAgICBhbHBoYUJsZW5kTGV2ZWxNaW4gPSBhbHBoYVByb2dyZXNzTGV2ZWwtYWxwaGFDb250ZXh0LT5ibGVuZGluZ3RocmVzaG9sZDsKLQotICAgIGFscGhhQmxlbmRMZXZlbE1heCA9IGFscGhhUHJvZ3Jlc3NMZXZlbCthbHBoYUNvbnRleHQtPmJsZW5kaW5ndGhyZXNob2xkOwotCi0gICAgYWxwaGFCbGVuZFJhbmdlID0gKGFscGhhQ29udGV4dC0+YmxlbmRpbmd0aHJlc2hvbGQpKjI7Ci0KLSAgICBwX291dDAgPSBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwX291dDEgPSBQbGFuZU91dFsxXS5wYWNfZGF0YTsKLSAgICBwX291dDIgPSBQbGFuZU91dFsyXS5wYWNfZGF0YTsKLQotICAgIGFscGhhTWFzayA9IGFscGhhQ29udGV4dC0+cFBsYW5lLT5wYWNfZGF0YTsKLQotICAgIC8qICJPbGQgaW1hZ2UiICovCi0gICAgcF9pbjFfWSA9IFBsYW5lSW4xWzBdLnBhY19kYXRhOwotICAgIHBfaW4xX1UgPSBQbGFuZUluMVsxXS5wYWNfZGF0YTsKLSAgICBwX2luMV9WID0gUGxhbmVJbjFbMl0ucGFjX2RhdGE7Ci0gICAgLyogIk5ldyBpbWFnZSIgKi8KLSAgICBwX2luMl9ZID0gUGxhbmVJbjJbMF0ucGFjX2RhdGE7Ci0gICAgcF9pbjJfVSA9IFBsYW5lSW4yWzFdLnBhY19kYXRhOwotICAgIHBfaW4yX1YgPSBQbGFuZUluMlsyXS5wYWNfZGF0YTsKLQotICAgIC8qIGFwcGx5IEFscGhhIE1hZ2ljIG9uIGVhY2ggcGl4ZWwgKi8KLSAgICAgICBmb3IoIHk9MDsgeTxQbGFuZU91dC0+dV9oZWlnaHQ7IHkrKyApCi0gICAgewotICAgICAgICBmb3IoIHg9MDsgeDxQbGFuZU91dC0+dV93aWR0aDsgeCsrICkKLSAgICAgICAgewotICAgICAgICAgICAgYWxwaGFNYXNrVmFsdWUgPSBhbHBoYU1hc2tbeCt5KlBsYW5lT3V0LT51X3dpZHRoXTsKLSAgICAgICAgICAgIGlmKCBhbHBoYUJsZW5kTGV2ZWxNYXggPCBhbHBoYU1hc2tWYWx1ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogV2Uga2VlcCAib2xkIGltYWdlIiBpbiBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAqKCBwX291dDAreCt5KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0qKHBfaW4xX1kreCt5KlBsYW5lSW4xWzBdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDErKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVSsoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzFdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVisoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzJdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIChhbHBoYUJsZW5kTGV2ZWxNaW4gPCBhbHBoYU1hc2tWYWx1ZSkmJgotICAgICAgICAgICAgICAgICAgICAoYWxwaGFNYXNrVmFsdWUgPD0gYWxwaGFCbGVuZExldmVsTWF4ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIGJsZW5kICJvbGQgYW5kIG5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KE00VklGSV9VSW50OCkKLSAgICAgICAgICAgICAgICAgICAgKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbikqKCAqKHBfaW4xX1kreCt5KlBsYW5lSW4xWzBdLnVfc3RyaWRlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsoYWxwaGFCbGVuZExldmVsTWF4LWFscGhhTWFza1ZhbHVlKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKCAqKHBfaW4yX1kreCt5KlBsYW5lSW4yWzBdLnVfc3RyaWRlKSkgKS9hbHBoYUJsZW5kUmFuZ2UgKTsKLQotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0oTTRWSUZJX1VJbnQ4KVwKLSAgICAgICAgICAgICAgICAgICAgKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbikqKCAqKHBfaW4xX1UrKHg+PjEpKyh5Pj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICpQbGFuZUluMVsxXS51X3N0cmlkZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyhhbHBoYUJsZW5kTGV2ZWxNYXgtYWxwaGFNYXNrVmFsdWUpKiggKihwX2luMl9VKyh4Pj4xKSsoeT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQbGFuZUluMlsxXS51X3N0cmlkZSkpICkvYWxwaGFCbGVuZFJhbmdlICk7Ci0KLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgpKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbilcCi0gICAgICAgICAgICAgICAgICAgICAgICAqKCAqKHBfaW4xX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMVsyXS51X3N0cmlkZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoYWxwaGFCbGVuZExldmVsTWF4LWFscGhhTWFza1ZhbHVlKSooICoocF9pbjJfVisoeD4+MSkrKHk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBsYW5lSW4yWzJdLnVfc3RyaWRlKSkgKS9hbHBoYUJsZW5kUmFuZ2UgKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIHRha2UgIm5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luMl9ZK3greSpQbGFuZUluMlswXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQxKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1UrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotI2RlZmluZSBNNFhYWF9TYW1wbGVBZGRyZXNzKHBsYW5lLCB4LCB5KSAgKCAocGxhbmUpLnBhY19kYXRhICsgKHBsYW5lKS51X3RvcGxlZnQgKyAoeSlcCi0gICAgICogKHBsYW5lKS51X3N0cmlkZSArICh4KSApCi0KLXN0YXRpYyB2b2lkIE00WFhYX0NvcHlQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogZGVzdCwgTTRWSUZJX0ltYWdlUGxhbmUqIHNvdXJjZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgaGVpZ2h0LCB3aWR0aCwgc291cmNlU3RyaWRlLCBkZXN0U3RyaWRlLCB5OwotICAgIE00T1NBX01lbUFkZHI4ICAgIHNvdXJjZVdhbGssIGRlc3RXYWxrOwotCi0gICAgLyogY2FjaGUgdGhlIHZhcnMgdXNlZCBpbiB0aGUgbG9vcCBzbyBhcyB0byBhdm9pZCB0aGVtIGJlaW5nIHJlcGVhdGVkbHkgZmV0Y2hlZCBhbmQKLSAgICAgcmVjb21wdXRlZCBmcm9tIG1lbW9yeS4gKi8KLSAgICBoZWlnaHQgPSBkZXN0LT51X2hlaWdodDsKLSAgICB3aWR0aCA9IGRlc3QtPnVfd2lkdGg7Ci0KLSAgICBzb3VyY2VXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoKnNvdXJjZSwgMCwgMCk7Ci0gICAgc291cmNlU3RyaWRlID0gc291cmNlLT51X3N0cmlkZTsKLQotICAgIGRlc3RXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoKmRlc3QsIDAsIDApOwotICAgIGRlc3RTdHJpZGUgPSBkZXN0LT51X3N0cmlkZTsKLQotICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopZGVzdFdhbGssICh2b2lkICopc291cmNlV2Fsaywgd2lkdGgpOwotICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwotICAgICAgICBzb3VyY2VXYWxrICs9IHNvdXJjZVN0cmlkZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTR4VlNTX1ZlcnRpY2FsU2xpZGVUcmFuc2l0aW9uKE00VklGSV9JbWFnZVBsYW5lKiB0b3BQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBib3R0b21QbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAgICBzaGlmdFVWKQotewotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyogRG8gdGhyZWUgbG9vcHMsIG9uZSBmb3IgZWFjaCBwbGFuZSB0eXBlLCBpbiBvcmRlciB0byBhdm9pZCBoYXZpbmcgdG9vIG1hbnkgYnVmZmVycwotICAgICJob3QiIGF0IHRoZSBzYW1lIHRpbWUgKGJldHRlciBmb3IgY2FjaGUpLiAqLwotICAgIGZvciAoaT0wOyBpPDM7IGkrKykKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiAgICB0b3BQYXJ0SGVpZ2h0LCBib3R0b21QYXJ0SGVpZ2h0LCB3aWR0aCwgc291cmNlU3RyaWRlLCBkZXN0U3RyaWRlLCB5OwotICAgICAgICBNNE9TQV9NZW1BZGRyOCAgICBzb3VyY2VXYWxrLCBkZXN0V2FsazsKLQotICAgICAgICAvKiBjYWNoZSB0aGUgdmFycyB1c2VkIGluIHRoZSBsb29wIHNvIGFzIHRvIGF2b2lkIHRoZW0gYmVpbmcgcmVwZWF0ZWRseSBmZXRjaGVkIGFuZAotICAgICAgICAgcmVjb21wdXRlZCBmcm9tIG1lbW9yeS4gKi8KLSAgICAgICAgaWYgKDAgPT0gaSkgLyogWSBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBib3R0b21QYXJ0SGVpZ2h0ID0gMipzaGlmdFVWOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogVSBhbmQgViBwbGFuZXMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgYm90dG9tUGFydEhlaWdodCA9IHNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgdG9wUGFydEhlaWdodCA9IFBsYW5lT3V0W2ldLnVfaGVpZ2h0IC0gYm90dG9tUGFydEhlaWdodDsKLSAgICAgICAgd2lkdGggPSBQbGFuZU91dFtpXS51X3dpZHRoOwotCi0gICAgICAgIHNvdXJjZVdhbGsgPSAoTTRPU0FfTWVtQWRkcjgpTTRYWFhfU2FtcGxlQWRkcmVzcyh0b3BQbGFuZVtpXSwgMCwgYm90dG9tUGFydEhlaWdodCk7Ci0gICAgICAgIHNvdXJjZVN0cmlkZSA9IHRvcFBsYW5lW2ldLnVfc3RyaWRlOwotCi0gICAgICAgIGRlc3RXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIDApOwotICAgICAgICBkZXN0U3RyaWRlID0gUGxhbmVPdXRbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgLyogRmlyc3QgdGhlIHBhcnQgZnJvbSB0aGUgdG9wIHNvdXJjZSBjbGlwIGZyYW1lLiAqLwotICAgICAgICBmb3IgKHk9MDsgeTx0b3BQYXJ0SGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWRlc3RXYWxrLCAodm9pZCAqKXNvdXJjZVdhbGssIHdpZHRoKTsKLSAgICAgICAgICAgIGRlc3RXYWxrICs9IGRlc3RTdHJpZGU7Ci0gICAgICAgICAgICBzb3VyY2VXYWxrICs9IHNvdXJjZVN0cmlkZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGFuZCBub3cgY2hhbmdlIHRoZSB2YXJzIHRvIGNvcHkgdGhlIHBhcnQgZnJvbSB0aGUgYm90dG9tIHNvdXJjZSBjbGlwIGZyYW1lLiAqLwotICAgICAgICBzb3VyY2VXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoYm90dG9tUGxhbmVbaV0sIDAsIDApOwotICAgICAgICBzb3VyY2VTdHJpZGUgPSBib3R0b21QbGFuZVtpXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBkZXN0V2FsayBpcyBhbHJlYWR5IGF0IE00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIHRvcFBhcnRIZWlnaHQpICovCi0KLSAgICAgICAgZm9yICh5PTA7IHk8Ym90dG9tUGFydEhlaWdodDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2FsaywgKHZvaWQgKilzb3VyY2VXYWxrLCB3aWR0aCk7Ci0gICAgICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwotICAgICAgICAgICAgc291cmNlV2FsayArPSBzb3VyY2VTdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTR4VlNTX0hvcml6b250YWxTbGlkZVRyYW5zaXRpb24oTTRWSUZJX0ltYWdlUGxhbmUqIGxlZnRQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHJpZ2h0UGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICAgIHNoaWZ0VVYpCi17Ci0gICAgTTRPU0FfVUludDMyIGksIHk7Ci0gICAgLyogSWYgd2Ugc2hpZnRlZCBieSBleGFjdGx5IDAsIG9yIGJ5IHRoZSB3aWR0aCBvZiB0aGUgdGFyZ2V0IGltYWdlLCB0aGVuIHdlIHdvdWxkIGdldCB0aGUgbGVmdAotICAgIGZyYW1lIG9yIHRoZSByaWdodCBmcmFtZSwgcmVzcGVjdGl2ZWx5LiBUaGVzZSBjYXNlcyBhcmVuJ3QgaGFuZGxlZCB0b28gd2VsbCBieSB0aGUgZ2VuZXJhbAotICAgIGhhbmRsaW5nLCBzaW5jZSB0aGV5IHJlc3VsdCBpbiAwLXNpemUgbWVtY29waWVzLCBzbyBtaWdodCBhcyB3ZWxsIHBhcnRpY3VsYXJpemUgdGhlbS4gKi8KLQotICAgIGlmICgwID09IHNoaWZ0VVYpICAgIC8qIG91dHB1dCBsZWZ0IGZyYW1lICovCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpPDM7IGkrKykgLyogZm9yIGVhY2ggWVVWIHBsYW5lICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00WFhYX0NvcHlQbGFuZSgmKFBsYW5lT3V0W2ldKSwgJihsZWZ0UGxhbmVbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChQbGFuZU91dFsxXS51X3dpZHRoID09IHNoaWZ0VVYpIC8qIG91dHB1dCByaWdodCBmcmFtZSAqLwotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaTwzOyBpKyspIC8qIGZvciBlYWNoIFlVViBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNFhYWF9Db3B5UGxhbmUoJihQbGFuZU91dFtpXSksICYocmlnaHRQbGFuZVtpXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0KLSAgICAvKiBEbyB0aHJlZSBsb29wcywgb25lIGZvciBlYWNoIHBsYW5lIHR5cGUsIGluIG9yZGVyIHRvIGF2b2lkIGhhdmluZyB0b28gbWFueSBidWZmZXJzCi0gICAgImhvdCIgYXQgdGhlIHNhbWUgdGltZSAoYmV0dGVyIGZvciBjYWNoZSkuICovCi0gICAgZm9yIChpPTA7IGk8MzsgaSsrKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyICAgIGhlaWdodCwgbGVmdFBhcnRXaWR0aCwgcmlnaHRQYXJ0V2lkdGg7Ci0gICAgICAgIE00T1NBX1VJbnQzMiAgICBsZWZ0U3RyaWRlLCAgICByaWdodFN0cmlkZSwgICAgZGVzdFN0cmlkZTsKLSAgICAgICAgTTRPU0FfTWVtQWRkcjggICAgbGVmdFdhbGssICAgIHJpZ2h0V2FsaywgICAgZGVzdFdhbGtMZWZ0LCBkZXN0V2Fsa1JpZ2h0OwotCi0gICAgICAgIC8qIGNhY2hlIHRoZSB2YXJzIHVzZWQgaW4gdGhlIGxvb3Agc28gYXMgdG8gYXZvaWQgdGhlbSBiZWluZyByZXBlYXRlZGx5IGZldGNoZWQKLSAgICAgICAgYW5kIHJlY29tcHV0ZWQgZnJvbSBtZW1vcnkuICovCi0gICAgICAgIGhlaWdodCA9IFBsYW5lT3V0W2ldLnVfaGVpZ2h0OwotCi0gICAgICAgIGlmICgwID09IGkpIC8qIFkgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcmlnaHRQYXJ0V2lkdGggPSAyKnNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBVIGFuZCBWIHBsYW5lcyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICByaWdodFBhcnRXaWR0aCA9IHNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgbGVmdFBhcnRXaWR0aCA9IFBsYW5lT3V0W2ldLnVfd2lkdGggLSByaWdodFBhcnRXaWR0aDsKLQotICAgICAgICBsZWZ0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKGxlZnRQbGFuZVtpXSwgcmlnaHRQYXJ0V2lkdGgsIDApOwotICAgICAgICBsZWZ0U3RyaWRlID0gbGVmdFBsYW5lW2ldLnVfc3RyaWRlOwotCi0gICAgICAgIHJpZ2h0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKHJpZ2h0UGxhbmVbaV0sIDAsIDApOwotICAgICAgICByaWdodFN0cmlkZSA9IHJpZ2h0UGxhbmVbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgZGVzdFdhbGtMZWZ0ID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIDApOwotICAgICAgICBkZXN0V2Fsa1JpZ2h0ID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIGxlZnRQYXJ0V2lkdGgsIDApOwotICAgICAgICBkZXN0U3RyaWRlID0gUGxhbmVPdXRbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWRlc3RXYWxrTGVmdCwgKHZvaWQgKilsZWZ0V2FsaywgbGVmdFBhcnRXaWR0aCk7Ci0gICAgICAgICAgICBsZWZ0V2FsayArPSBsZWZ0U3RyaWRlOwotCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2Fsa1JpZ2h0LCAodm9pZCAqKXJpZ2h0V2FsaywgcmlnaHRQYXJ0V2lkdGgpOwotICAgICAgICAgICAgcmlnaHRXYWxrICs9IHJpZ2h0U3RyaWRlOwotCi0gICAgICAgICAgICBkZXN0V2Fsa0xlZnQgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgICAgIGRlc3RXYWxrUmlnaHQgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLU00T1NBX0VSUiBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotewotICAgIE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyogc2V0dGluZ3MgPQotICAgICAgICAgKE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyopdXNlckRhdGE7Ci0gICAgTTRPU0FfVUludDMyICAgIHNoaWZ0VVY7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiaW5zaWRlIE00eFZTU19TbGlkZVRyYW5zaXRpb24iKTsKLSAgICBpZiAoKE00eFZTU19TbGlkZVRyYW5zaXRpb25fUmlnaHRPdXRMZWZ0SW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikKLSAgICAgICAgfHwgKE00eFZTU19TbGlkZVRyYW5zaXRpb25fTGVmdE91dFJpZ2h0SW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikgKQotICAgIHsKLSAgICAgICAgLyogaG9yaXpvbnRhbCBzbGlkZSAqLwotICAgICAgICBzaGlmdFVWID0gKChQbGFuZU91dFsxXSkudV93aWR0aCAqIHBQcm9ncmVzcy0+dWlQcm9ncmVzcykvMTAwMDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19TbGlkZVRyYW5zaXRpb24gdXBwZXI6IHNoaWZ0VVYgPSAlZCxwcm9ncmVzcyA9ICVkIiwKLSAgICAgICAgICAgIHNoaWZ0VVYscFByb2dyZXNzLT51aVByb2dyZXNzICk7Ci0gICAgICAgIGlmIChNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX1JpZ2h0T3V0TGVmdEluID09IHNldHRpbmdzLT5kaXJlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFB1dCB0aGUgcHJldmlvdXMgY2xpcCBmcmFtZSByaWdodCwgdGhlIG5leHQgY2xpcCBmcmFtZSBsZWZ0LCBhbmQgcmV2ZXJzZSBzaGlmdFVWCi0gICAgICAgICAgICAoc2luY2UgaXQncyBhIHNoaWZ0IGZyb20gdGhlIGxlZnQgZnJhbWUpIHNvIHRoYXQgd2Ugc3RhcnQgb3V0IG9uIHRoZSByaWdodAotICAgICAgICAgICAgKGkuZS4gbm90IGxlZnQpIGZyYW1lLCBpdAotICAgICAgICAgICAgYmVpbmcgZnJvbSB0aGUgcHJldmlvdXMgY2xpcC4gKi8KLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfSG9yaXpvbnRhbFNsaWRlVHJhbnNpdGlvbihQbGFuZUluMiwgUGxhbmVJbjEsIFBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAoUGxhbmVPdXRbMV0pLnVfd2lkdGggLSBzaGlmdFVWKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIExlZnQgb3V0LCByaWdodCBpbiovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfSG9yaXpvbnRhbFNsaWRlVHJhbnNpdGlvbihQbGFuZUluMSwgUGxhbmVJbjIsIFBsYW5lT3V0LCBzaGlmdFVWKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiB2ZXJ0aWNhbCBzbGlkZSAqLwotICAgICAgICBzaGlmdFVWID0gKChQbGFuZU91dFsxXSkudV9oZWlnaHQgKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfU2xpZGVUcmFuc2l0aW9uIGJvdHRvbTogc2hpZnRVViA9ICVkLHByb2dyZXNzID0gJWQiLHNoaWZ0VVYsCi0gICAgICAgICAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgKTsKLSAgICAgICAgaWYgKE00eFZTU19TbGlkZVRyYW5zaXRpb25fVG9wT3V0Qm90dG9tSW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgLyogUHV0IHRoZSBwcmV2aW91cyBjbGlwIGZyYW1lIHRvcCwgdGhlIG5leHQgY2xpcCBmcmFtZSBib3R0b20uICovCi0gICAgICAgICAgICByZXR1cm4gTTR4VlNTX1ZlcnRpY2FsU2xpZGVUcmFuc2l0aW9uKFBsYW5lSW4xLCBQbGFuZUluMiwgUGxhbmVPdXQsIHNoaWZ0VVYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogQm90dG9tIG91dCwgdG9wIGluICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfVmVydGljYWxTbGlkZVRyYW5zaXRpb24oUGxhbmVJbjIsIFBsYW5lSW4xLCBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAoUGxhbmVPdXRbMV0pLnVfaGVpZ2h0IC0gc2hpZnRVVik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBOb3RlOiBpdCBtaWdodCBiZSB3b3J0aHdoaWxlIHRvIGRvIHNvbWUgcGFyYW1ldGVyIGNoZWNraW5nLCBzZWUgaWYgZGltZW5zaW9ucyBtYXRjaCwgZXRjLiwKLSAgICBhdCBsZWFzdCBpbiBkZWJ1ZyBtb2RlLiAqLwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19GYWRlQmxhY2tUcmFuc2l0aW9uKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgZmFkZSB0byBibGFjayBhbmQgdGhlbiBhIGZhZGUgZnJvbSBibGFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgIFBsYW5lSW4gICAgICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb24oTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotewotICAgIE00T1NBX0ludDMyIHRtcCA9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLQotICAgIGlmKChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpIDwgNTAwKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpICovCi0gICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoKDEuMCAtICgoTTRPU0FfRmxvYXQpKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyoyKS8xMDAwKSkgKiAxMDI0ICk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFwcGx5IHRoZSBkYXJrZW5pbmcgZWZmZWN0ICovCi0gICAgICAgIGVyciA9IE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoIChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVJbjEsCi0gICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lKilQbGFuZU91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb246IE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJuc1wKLSAgICAgICAgICAgICAgICAgZXJyb3IgMHgleCwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpLiAqLwotICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKCAoKChNNE9TQV9GbG9hdCkoKChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MtNTAwKSoyKSkvMTAwMCkpICogMTAyNCApOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICBlcnIgPSBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVJbjIsCi0gICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lKilQbGFuZU91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogY29udmVydGVkU2l6ZSkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0IGZyb20gdGhlIGN1c3RvbWVyIGZvcm1hdCB0byBVVEY4Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAoSU4pICAgIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlckluICAgICAgICAoSU4pICAgIEJ1ZmZlciB0byBjb252ZXJ0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlck91dCAgICAgICAgKE9VVCkgICAgQ29udmVydGVkIGJ1ZmZlcgotICogQHBhcmFtICAgIGNvbnZlcnRlZFNpemUgICAgKE9VVCkgICAgU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LCBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIHBCdWZmZXJPdXQgPSBwQnVmZmVySW47Ci0gICAgaWYoeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemU7Ci0KLSAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMAotICAgICAgICAgICAgLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgZXJyID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdCgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLAotICAgICAgICAgICAgKE00T1NBX1VJbnQ4Kil4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiopJkNvbnZlcnRlZFNpemUpOwotICAgICAgICBpZihlcnIgPT0gTTR4VlNTV0FSX0JVRkZFUl9PVVRfVE9PX1NNQUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGODogcENvbnZUb1VURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0KLSAgICAgICAgICAgIC8qZnJlZSB0b28gc21hbGwgYnVmZmVyKi8KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKTsKLQotICAgICAgICAgICAgLypyZS1hbGxvY2F0ZSB0aGUgYnVmZmVyKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICAgID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhDb252ZXJ0ZWRTaXplKnNpemVvZihNNE9TQV9VSW50OCksIE00VkEsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBVVEYgY29udmVyc2lvbiBidWZmZXIiKTsKLSAgICAgICAgICAgIGlmKE00T1NBX05VTEwgPT0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUgPSBDb252ZXJ0ZWRTaXplOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMCwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QoKE00T1NBX1ZvaWQqKXBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBwQ29udlRvVVRGOEZjdCByZXR1cm4gMHgleCIsZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBwQ29udlRvVVRGOEZjdCByZXR1cm4gMHgleCIsZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLypkZWNvZGVkIHBhdGgqLwotICAgICAgICBwQnVmZmVyT3V0ID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICgqY29udmVydGVkU2l6ZSkgPSBDb252ZXJ0ZWRTaXplOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY29udmVydCBmcm9tIFVURjggdG8gdGhlIGN1c3RvbWVyIGZvcm1hdAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlckluICAgICAgICAoSU4pICAgIEJ1ZmZlciB0byBjb252ZXJ0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlck91dCAgICAgICAgKE9VVCkgICAgQ29udmVydGVkIGJ1ZmZlcgotICogQHBhcmFtICAgIGNvbnZlcnRlZFNpemUgICAgKE9VVCkgICAgU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LCBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIHBCdWZmZXJPdXQgPSBwQnVmZmVySW47Ci0gICAgaWYoeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBDb252ZXJ0ZWRTaXplID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZTsKLQotICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwwLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUpOwotCi0gICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdFwKLSAgICAgICAgICAgICgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLChNNE9TQV9VSW50OCopeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAoTTRPU0FfVUludDMyKikmQ29udmVydGVkU2l6ZSk7Ci0gICAgICAgIGlmKGVyciA9PSBNNHhWU1NXQVJfQlVGRkVSX09VVF9UT09fU01BTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjg6IHBDb252RnJvbVVURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0KLSAgICAgICAgICAgIC8qZnJlZSB0b28gc21hbGwgYnVmZmVyKi8KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKTsKLQotICAgICAgICAgICAgLypyZS1hbGxvY2F0ZSB0aGUgYnVmZmVyKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICAgID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKENvbnZlcnRlZFNpemUqc2l6ZW9mKE00T1NBX1VJbnQ4KSwgTTRWQSwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGODogVVRGIGNvbnZlcnNpb24gYnVmZmVyIik7Ci0gICAgICAgICAgICBpZihNNE9TQV9OVUxMID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUgPSBDb252ZXJ0ZWRTaXplOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMCwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKil4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjg6IHBDb252RnJvbVVURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4OiBwQ29udkZyb21VVEY4RmN0IHJldHVybiAweCV4IixlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAvKmRlY29kZWQgcGF0aCovCi0gICAgICAgIHBCdWZmZXJPdXQgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgKCpjb252ZXJ0ZWRTaXplKSA9IENvbnZlcnRlZFNpemU7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9WaWRlb0VkaXRvclJlc2FtcGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTEyOWMzYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSAiQXVkaW9NaXhlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUmVzYW1wbGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFZpZGVvRWRpdG9yUmVzYW1wbGVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIgewotCi0gICAgcHVibGljOgotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcik7Ci0KLSAgICBlbnVtIHsgLy9TYW1wbGluZyBmcmVxCi0gICAgIGtGcmVxODAwMEh6ID0gODAwMCwKLSAgICAga0ZyZXExMTAyNUh6ID0gMTEwMjUsCi0gICAgIGtGcmVxMTIwMDBIeiA9IDEyMDAwLAotICAgICBrRnJlcTE2MDAwSHogPSAxNjAwMCwKLSAgICAga0ZyZXEyMjA1MEh6ID0gMjIwNTAsCi0gICAgIGtGcmVxMjQwMDBIeiA9IDI0MDAwLAotICAgICBrRnJlcTMyMDAwSHogPSAzMjAwMCwKLSAgICAga0ZyZXE0NDEwMCA9IDQ0MTAwLAotICAgICBrRnJlcTQ4MDAwID0gNDgwMDAsCi0gICAgfTsKLQotICAgIEF1ZGlvUmVzYW1wbGVyICptUmVzYW1wbGVyOwotICAgIGludDE2X3QqIG1JbnB1dDsKLSAgICBpbnQgbmJDaGFubmVsczsKLSAgICBpbnQgbmJTYW1wbGVzOwotICAgIE00T1NBX0ludDMyIG91dFNhbXBsaW5nUmF0ZTsKLSAgICBNNE9TQV9JbnQzMiBpblNhbXBsaW5nUmF0ZTsKLQotICAgIGludDE2X3QgKm1UbXBJbkJ1ZmZlcjsKLX07Ci0KLSNkZWZpbmUgTUFYX1NBTVBMRURVUkFUSU9OX0ZPUl9DT05WRVJUSU9OIDQwIC8vbXMKLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JSZXNhbXBsZXI6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyLCBpbnQ2NF90IHB0cykgewotCi0gICAgdWludDMyX3QgZGF0YVNpemUgPSBwQnVmZmVyLT5mcmFtZUNvdW50ICogdGhpcy0+bmJDaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKLSAgICBtVG1wSW5CdWZmZXIgPSAoaW50MTZfdCopbWFsbG9jKGRhdGFTaXplKTsKLSAgICBtZW1jcHkobVRtcEluQnVmZmVyLCB0aGlzLT5tSW5wdXQsIGRhdGFTaXplKTsKLSAgICBwQnVmZmVyLT5yYXcgPSAodm9pZCopbVRtcEluQnVmZmVyOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUmVzYW1wbGVyOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlcikgewotCi0gICAgaWYocEJ1ZmZlci0+cmF3ICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShwQnVmZmVyLT5yYXcpOwotICAgICAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOwotICAgICAgICBtVG1wSW5CdWZmZXIgPSBOVUxMOwotICAgIH0KLSAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLX0KLQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0NvbnRleHQgIExWQXVkaW9SZXNhbXBsZXJDcmVhdGUoTTRPU0FfSW50MzIgYml0RGVwdGgsIE00T1NBX0ludDMyIGluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHNhbXBsZVJhdGUsIE00T1NBX0ludDMyIHF1YWxpdHkpIHsKLQotICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyICpjb250ZXh0ID0gbmV3IFZpZGVvRWRpdG9yUmVzYW1wbGVyKCk7Ci0gICAgY29udGV4dC0+bVJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoCi0gICAgICAgIGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7Ci0gICAgaWYgKGNvbnRleHQtPm1SZXNhbXBsZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY29udGV4dC0+bVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShhbmRyb2lkOjpWaWRlb0VkaXRvclJlc2FtcGxlcjo6a0ZyZXEzMjAwMEh6KTsKLSAgICBjb250ZXh0LT5tUmVzYW1wbGVyLT5zZXRWb2x1bWUoMHgxMDAwLCAweDEwMDApOwotICAgIGNvbnRleHQtPm5iQ2hhbm5lbHMgPSBpbkNoYW5uZWxDb3VudDsKLSAgICBjb250ZXh0LT5vdXRTYW1wbGluZ1JhdGUgPSBzYW1wbGVSYXRlOwotICAgIGNvbnRleHQtPm1JbnB1dCA9IE5VTEw7Ci0gICAgY29udGV4dC0+bVRtcEluQnVmZmVyID0gTlVMTDsKLQotICAgIHJldHVybiAoKE00T1NBX0NvbnRleHQgKWNvbnRleHQpOwotfQotCi0KLXZvaWQgTFZBdWRpb3NldFNhbXBsZVJhdGUoTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0LCBNNE9TQV9JbnQzMiBpblNhbXBsZVJhdGUpIHsKLQotICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyICpjb250ZXh0ID0KLSAgICAgIChWaWRlb0VkaXRvclJlc2FtcGxlciAqKXJlc2FtcGxlckNvbnRleHQ7Ci0gICAgY29udGV4dC0+bVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShpblNhbXBsZVJhdGUpOwotICAgIC8qCi0gICAgICogbmJTYW1wbGVzIGlzIGNhbGN1bGF0ZWQgZm9yIDQwbXMgd29ydGggb2YgZGF0YTtoZW5jZSBzYW1wbGUgcmF0ZQotICAgICAqIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBuYlNhbXBsZXMKLSAgICAgKi8KLSAgICBjb250ZXh0LT5pblNhbXBsaW5nUmF0ZSA9IGluU2FtcGxlUmF0ZTsKLSAgICAvLyBBbGxvY2F0ZSBidWZmZXIgZm9yIG1heGltdW0gYWxsb3dlZCBudW1iZXIgb2Ygc2FtcGxlcy4KLSAgICBjb250ZXh0LT5tSW5wdXQgPSAoaW50MTZfdCopbWFsbG9jKCAoaW5TYW1wbGVSYXRlICogTUFYX1NBTVBMRURVUkFUSU9OX0ZPUl9DT05WRVJUSU9OICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+bmJDaGFubmVscyAqIHNpemVvZihpbnQxNl90KSkgLyAxMDAwKTsKLX0KLQotdm9pZCBMVkF1ZGlvc2V0Vm9sdW1lKE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCwgTTRPU0FfSW50MTYgbGVmdCwgTTRPU0FfSW50MTYgcmlnaHQpIHsKLQotICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyICpjb250ZXh0ID0KLSAgICAgICAoVmlkZW9FZGl0b3JSZXNhbXBsZXIgKilyZXNhbXBsZXJDb250ZXh0OwotICAgIGNvbnRleHQtPm1SZXNhbXBsZXItPnNldFZvbHVtZShsZWZ0LHJpZ2h0KTsKLX0KLQotdm9pZCBMVkRlc3Ryb3koTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0KSB7Ci0KLSAgICBWaWRlb0VkaXRvclJlc2FtcGxlciAqY29udGV4dCA9Ci0gICAgICAgKFZpZGVvRWRpdG9yUmVzYW1wbGVyICopcmVzYW1wbGVyQ29udGV4dDsKLQotICAgIGlmIChjb250ZXh0LT5tVG1wSW5CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBmcmVlKGNvbnRleHQtPm1UbXBJbkJ1ZmZlcik7Ci0gICAgICAgIGNvbnRleHQtPm1UbXBJbkJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGNvbnRleHQtPm1JbnB1dCAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUoY29udGV4dC0+bUlucHV0KTsKLSAgICAgICAgY29udGV4dC0+bUlucHV0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoY29udGV4dC0+bVJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBjb250ZXh0LT5tUmVzYW1wbGVyOwotICAgICAgICBjb250ZXh0LT5tUmVzYW1wbGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoY29udGV4dCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBjb250ZXh0OwotICAgICAgICBjb250ZXh0ID0gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoTTRPU0FfSW50MTYqIG91dCwgTTRPU0FfSW50MTYqIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIG91dEZyYW1lQ291bnQsIE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCkgewotCi0gICAgVmlkZW9FZGl0b3JSZXNhbXBsZXIgKmNvbnRleHQgPQotICAgICAgKFZpZGVvRWRpdG9yUmVzYW1wbGVyICopcmVzYW1wbGVyQ29udGV4dDsKLSAgICBpbnQzMl90ICpwVG1wQnVmZmVyID0gTlVMTDsKLQotICAgIGNvbnRleHQtPm5iU2FtcGxlcyA9IChjb250ZXh0LT5pblNhbXBsaW5nUmF0ZSAqIG91dEZyYW1lQ291bnQpIC8gY29udGV4dC0+b3V0U2FtcGxpbmdSYXRlOwotICAgIG1lbWNweShjb250ZXh0LT5tSW5wdXQsaW5wdXQsKGNvbnRleHQtPm5iU2FtcGxlcyAqIGNvbnRleHQtPm5iQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpKTsKLQotICAgIC8qCi0gICAgIFNSQyBtb2R1bGUgYWx3YXlzIGdpdmVzIHN0ZXJlbyBvdXRwdXQsIGhlbmNlIDIgZm9yIHN0ZXJlbyBhdWRpbwotICAgICovCi0gICAgcFRtcEJ1ZmZlciA9IChpbnQzMl90KiltYWxsb2Mob3V0RnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MzJfdCkpOwotICAgIG1lbXNldChwVG1wQnVmZmVyLCAweDAwLCBvdXRGcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQzMl90KSk7Ci0KLSAgICBjb250ZXh0LT5tUmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCAqKXBUbXBCdWZmZXIsCi0gICAgICAgKHNpemVfdClvdXRGcmFtZUNvdW50LCAoVmlkZW9FZGl0b3JSZXNhbXBsZXIgKilyZXNhbXBsZXJDb250ZXh0KTsKLSAgICAvLyBDb252ZXJ0IGJhY2sgdG8gMTYgYml0cwotICAgIGRpdGhlckFuZENsYW1wKChpbnQzMl90KilvdXQsIHBUbXBCdWZmZXIsIG91dEZyYW1lQ291bnQpOwotICAgIGZyZWUocFRtcEJ1ZmZlcik7Ci0gICAgcFRtcEJ1ZmZlciA9IE5VTEw7Ci19Ci0KLX0KLQotfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhOWEwMTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvcjNncFJlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvcjNncFJlYWRlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCAzR1AgUmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl8zR1BSRUFERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl8zR1BSRUFERVJfSAotCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotI2VuZGlmIC8qIFZJREVPRURJVE9SXzNHUFJFQURFUl9IICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQzYjgwMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEF1ZGlvIERlY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIFZJREVPRURJVE9SX0FVRElPREVDT0RFUl9ICi0jZGVmaW5lIFZJREVPRURJVE9SX0FVRElPREVDT0RFUl9ICi0KLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FBQyhNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfQU1STkIoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUldCKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9NUDMoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpOwotCi0jZW5kaWYgLyogVklERU9FRElUT1JfQVVESU9ERUNPREVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjRmNmIwNC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEF1ZGlvIEVuY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIFZJREVPRURJVE9SX0FVRElPRU5DT0RFUl9ICi0jZGVmaW5lIFZJREVPRURJVE9SX0FVRElPRU5DT0RFUl9ICi0KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BQUMoCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9NUDMoCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UpOwotCi0jZW5kaWYgLyogVklERU9FRElUT1JfQVVESU9FTkNPREVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JCdWZmZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JCdWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FmZjZhNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvckJ1ZmZlci5jCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgQnVmZmVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiAgIFZJREVPRURJVE9SX0JVRkZFUl9ICi0jZGVmaW5lICAgVklERU9FRElUT1JfQlVGRkVSX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotI2luY2x1ZGUgIk00X1V0aWxzLmgiCi0KLSNpbmNsdWRlICJMVl9NYWNyb3MuaCIKLQotLyotLS0gQ29yZSBpZCBmb3IgVklERU9FRElUT1IgQnVmZmVyIGFsbG9jYXRpb25zICAtLS0qLwotI2RlZmluZSBWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwgMHgwMTJGCi0KLS8qIC0tLS0tIGVycm9ycyAgLS0tLS0qLwotI2RlZmluZSBNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwsMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX05PX0JVRkZFUl9NQVRDSCBcCi0gICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLDB4MDAwMDAyKQotCi10eXBlZGVmIGVudW0gewotICAgIFZJREVPRURJVE9SX0JVRkZFUl9rRW1wdHkgPSAwLAotICAgIFZJREVPRURJVE9SX0JVRkZFUl9rRmlsbGVkLAotfSBWSURFT0VESVRPUl9CVUZGRVJfU3RhdGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3RydWN0dXJlICAgIExWT01YX0JVRkZFUl9CdWZmZXIKLSAqIEBicmllZiAgICAgICBPbmUgT01YIEJ1ZmZlciBhbmQgZGF0YSByZWxhdGVkIHRvIGl0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1ZvaWQqIHBEYXRhOyAgICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBkYXRhKi8KLSAgICBNNE9TQV9VSW50MzIgc2l6ZTsKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfU3RhdGUgc3RhdGU7IC8qKjwgQnVmZmVyIHN0YXRlICovCi0gICAgTTRPU0FfVUludDMyIGlkeDsgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBidWZmZXIgaW5zaWRlIHRoZSBwb29sICovCi0gICAgTTRfTWVkaWFUaW1lICAgIGJ1ZmZDVFM7ICAgICAgICAvKio8IFRpbWUgc3RhbXAgb2YgdGhlIGJ1ZmZlciAqLwotfSBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0cnVjdHVyZSAgICBMVk9NWF9CVUZGRVJfUG9vbAotICogQGJyaWVmICAgICAgIFN0cnVjdHVyZSB0byBtYW5hZ2UgYnVmZmVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiBwTlhQQnVmZmVyOwotICAgIE00T1NBX1VJbnQzMiBOQjsKLSAgICBNNE9TQV9DaGFyKiBwb29sTmFtZTsKLX0gVklERU9FRElUT1JfQlVGRkVSX1Bvb2w7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmIC8vX19jcGx1c3BsdXMKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqKiBwcG9vbCwKLSAqICAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycykKLSAqIEBicmllZiAgIEFsbG9jYXRlIGEgcG9vbCBvZiBuYkJ1ZmZlcnMgYnVmZmVycwotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wgdG8gY3JlYXRlCi0gKiBAcGFyYW0gICBuYkJ1ZmZlcnMgIDogSU4gVGhlIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBwb29sCi0gKiBAcGFyYW0gICBwb29sTmFtZSAgIDogSU4gYSBuYW1lIGdpdmVuIHRvIHRoZSBwb29sCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqKiBwcG9vbCwKLSAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycywgTTRPU0FfQ2hhciogcG9vbE5hbWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKExWT01YX0JVRkZFUl9Qb29sKiBwcG9vbCkKLSAqIEBicmllZiAgIERlYWxsb2NhdGUgYSBidWZmZXIgcG9vbAotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wgdG8gZnJlZQotICogQHJldHVybiAgRXJyb3IgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZnJlZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sLAotICogICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiogcE5YUEJ1ZmZlcikKLSAqIEBicmllZiAgIFJldHVybnMgYSBidWZmZXIgaW4gYSBnaXZlbiBzdGF0ZQotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wKLSAqIEBwYXJhbSAgIGRlc2lyZWRTdGF0ZSA6IElOIFRoZSBidWZmZXIgc3RhdGUKLSAqIEBwYXJhbSAgIHBOWFBCdWZmZXIgOiBJTiBUaGUgc2VsZWN0ZWQgYnVmZmVyCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfU3RhdGUgZGVzaXJlZFN0YXRlLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiogcE5YUEJ1ZmZlcik7Ci0KLQotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9pbml0UG9vbEJ1ZmZlcnMoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sLAotICAgICAgICBNNE9TQV9VSW50MzIgbFNpemUpOwotCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldE9sZGVzdEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCAqcG9vbCwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX1N0YXRlIGRlc2lyZWRTdGF0ZSwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcioqIHBOWFBCdWZmZXIpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvL19fY3BsdXNwbHVzCi0jZW5kaWYgLypWSURFT0VESVRPUl9CVUZGRVJfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JNYWluLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzNiNTE3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JNYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX1ZJREVPX0VESVRPUl9BUElfSF9fCi0jZGVmaW5lIF9fVklERU9fRURJVE9SX0FQSV9IX18KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLXR5cGVkZWYgZW51bQotewotICAgIE1TR19UWVBFX1BST0dSRVNTX0lORElDQVRJT04sICAgICAvLyBQbGF5YmFjayBwcm9ncmVzcyBpbmRpY2F0aW9uIGV2ZW50Ci0gICAgTVNHX1RZUEVfUExBWUVSX0VSUk9SLCAgICAgICAgICAgIC8vIFBsYXliYWNrIGVycm9yCi0gICAgTVNHX1RZUEVfUFJFVklFV19FTkQsICAgICAgICAgICAgIC8vIFByZXZpZXcgb2YgY2xpcHMgaXMgY29tcGxldGUKLSAgICBNU0dfVFlQRV9PVkVSTEFZX1VQREFURSwgICAgICAgICAgLy8gdXBkYXRlIG92ZXJsYXkgZHVyaW5nIHByZXZpZXcKLSAgICBNU0dfVFlQRV9PVkVSTEFZX0NMRUFSLCAgICAgICAgICAgLy8gY2xlYXIgdGhlIG92ZXJsYXkKLX0gcHJvZ3Jlc3NfY2FsbGJhY2tfbXNnX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgb3ZlcmxheVNldHRpbmdzSW5kZXg7Ci0gICAgaW50IGNsaXBJbmRleDsKLX0gVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkICAgICAqcEZpbGU7ICAgICAgICAgICAgICAgICAgIC8qKiBQQ00gZmlsZSBwYXRoICovCi0gICAgTTRPU0FfQm9vbCAgICAgYlJlbW92ZU9yaWdpbmFsOyAgICAgICAgICAvKiogSWYgdHJ1ZSwgdGhlIG9yaWdpbmFsIGF1ZGlvIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHRha2VuIGludG8gYWNjb3VudCAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpTmJDaGFubmVsczsgICAgICAgICAgICAvKiogTnVtYmVyIG9mIGNoYW5uZWxzICgxPW1vbm8sIDI9c3RlcmVvKSBvZiBCR00gY2xpcCovCi0gICAgTTRPU0FfVUludDMyICAgdWlTYW1wbGluZ0ZyZXF1ZW5jeTsgICAgIC8qKiBTYW1wbGluZyBhdWRpbyBmcmVxdWVuY3kgKDgwMDAgZm9yIGFtciwgMTYwMDAgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgZm9yIGFhYykgb2YgQkdNIGNsaXAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeTsgLyoqIEV4dGVuZGVkIGZyZXF1ZW5jeSBmb3IgQUFDKywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVBQUMrIHN0cmVhbXMgb2YgQkdNIGNsaXAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpQWRkQ3RzOyAgICAgICAgICAgICAgICAvKiogVGltZSwgaW4gbWlsbGlzZWNvbmRzLCBhdCB3aGljaCB0aGUgYWRkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHRyYWNrIGlzIGluc2VydGVkICovCi0gICAgTTRPU0FfVUludDMyICAgdWlBZGRWb2x1bWU7ICAgICAgICAgICAgIC8qKiBWb2x1bWUsIGluIHBlcmNlbnRhZ2UsIG9mIHRoZSBhZGRlZCBhdWRpbyB0cmFjayAqLwotICAgIE00T1NBX1VJbnQzMiAgIGJlZ2luQ3V0TXM7Ci0gICAgTTRPU0FfVUludDMyICAgZW5kQ3V0TXM7Ci0gICAgTTRPU0FfSW50MzIgICAgZmlsZVR5cGU7Ci0gICAgTTRPU0FfQm9vbCAgICAgYkxvb3A7ICAgICAgICAgICAgICAgICAgIC8qKiBMb29waW5nIG9uL29mZiAqKi8KLSAgICAvKiBBdWRpbyBkdWNraW5nICovCi0gICAgTTRPU0FfVUludDMyICAgdWlJbkR1Y2tpbmdfdGhyZXNob2xkOyAgIC8qKiBUaHJlc2hvbGQgdmFsdWUgYXQgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgbXVzaWMgc2hhbGwgZHVjayAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpSW5EdWNraW5nX2xvd1ZvbHVtZTsgICAvKiogbG93ZXIgdGhlIGJhY2tncm91bmQgdHJhY2sgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZmFjdG9yIG9mIGN1cnJlbnQgbGV2ZWwgKi8KLSAgICBNNE9TQV9Cb29sICAgICBiSW5EdWNraW5nX2VuYWJsZTsgICAgICAgLyoqIGVuYWJsZSBkdWNraW5nICovCi0gICAgTTRPU0FfVUludDMyICAgdWlCVENoYW5uZWxDb3VudDsgICAgICAgIC8qKiBjaGFubmVsIGNvdW50IGZvciBCVCAqLwotICAgIE00T1NBX1ZvaWQgICAgICpwUENNRmlsZVBhdGg7Ci19IE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQgICAgICAqcEJ1ZmZlcjsgICAgICAgICAgICAvKiBZVVY0MjAgYnVmZmVyIG9mIGZyYW1lIHRvIGJlIHJlbmRlcmVkKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdGltZU1zOyAgICAgICAgICAgIC8qIHRpbWUgc3RhbXAgb2YgdGhlIGZyYW1lIHRvIGJlIHJlbmRlcmVkKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlTdXJmYWNlV2lkdGg7ICAgIC8qIFN1cmZhY2UgZGlzcGxheSB3aWR0aCovCi0gICAgTTRPU0FfVUludDMyICAgIHVpU3VyZmFjZUhlaWdodDsgICAgLyogU3VyZmFjZSBkaXNwbGF5IGhlaWdodCovCi0gICAgTTRPU0FfVUludDMyICAgIHVpRnJhbWVXaWR0aDsgICAgICAgIC8qIEZyYW1lIHdpZHRoKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlGcmFtZUhlaWdodDsgICAgICAgIC8qIEZyYW1lIGhlaWdodCovCi0gICAgTTRPU0FfQm9vbCAgICAgIGJBcHBseUVmZmVjdDsgICAgICAgIC8qIEFwcGx5IHZpZGVvIGVmZmVjdHMgYmVmb3JlIHJlbmRlciovCi0gICAgTTRPU0FfVUludDMyICAgIGNsaXBCZWdpbkN1dFRpbWU7ICAvKiBDbGlwIGJlZ2luIGN1dCB0aW1lIHJlbGF0aXZlIHRvIHN0b3J5Ym9hcmQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgY2xpcEVuZEN1dFRpbWU7ICAgIC8qIENsaXAgZW5kIGN1dCB0aW1lIHJlbGF0aXZlIHRvIHN0b3J5Ym9hcmQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdmlkZW9Sb3RhdGlvbkRlZ3JlZTsgLyogVmlkZW8gcm90YXRpb24gZGVncmVlICovCi0KLX0gVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyOwotI2VuZGlmIC8qX19WSURFT19FRElUT1JfQVBJX0hfXyovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViM2JlNDAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvck1wM1JlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvck1wM1JlYWRlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBNUDMgUmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl9NUDNSRUFERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl9NUDNSRUFERVJfSAotCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotI2VuZGlmIC8qIFZJREVPRURJVE9SX01QM1JFQURFUl9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVXRpbHMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMjFiMjFkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JVdGlscy5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBVdGlsaXRpZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIEFORFJPSURfVVRJTFNfSF8KLSNkZWZpbmUgQU5EUk9JRF9VVElMU19IXwotCi0vKioqKioqKioqKioqKioqKioqKgotICogICAgIEhFQURFUlMgICAgICoKLSAqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLQotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWSURFT0VESVRPUl9DSEVDSyh0ZXN0LCBlcnJDb2RlKQotICogQG5vdGUgVGhpcyBtYWNybyBkaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlIGFuZCBnb2VzIHRvIGZ1bmN0aW9uIGNsZWFuVXAgbGFiZWwKLSAqICAgICAgIGlmIHRoZSB0ZXN0IGZhaWxzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBWSURFT0VESVRPUl9DSEVDSyh0ZXN0LCBlcnJDb2RlKSBcCi17IFwKLSAgICBpZiggISh0ZXN0KSApIHsgXAotICAgICAgICBBTE9HVigiISEhICVzIChMJWQpIGNoZWNrIGZhaWxlZCA6ICIgI3Rlc3QgIiwgeWllbGRzIGVycm9yIDB4JS44eCIsIFwKLSAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgZXJyQ29kZSk7IFwKLSAgICAgICAgZXJyID0gKGVyckNvZGUpOyBcCi0gICAgICAgIGdvdG8gY2xlYW5VcDsgXAotICAgIH0gXAotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTQUZFX0ZSRUUocCkKLSAqIEBub3RlIFRoaXMgbWFjcm8gY2FsbHMgZnJlZSBhbmQgbWFrZXMgc3VyZSB0aGUgcG9pbnRlciBpcyBzZXQgdG8gTlVMTC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgU0FGRV9GUkVFKHApIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgIT0gKHApKSB7IFwKLSAgICAgICAgZnJlZSgocCkpIDsgXAotICAgICAgICAocCkgPSBNNE9TQV9OVUxMIDsgXAotICAgIH0gXAotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTQUZFX01BTExPQyhwLCB0eXBlLCBjb3VudCwgY29tbWVudCkKLSAqIEBub3RlIFRoaXMgbWFjcm8gYWxsb2NhdGVzIGEgYnVmZmVyLCBjaGVja3MgZm9yIHN1Y2Nlc3MgYW5kIGZpbGxzIHRoZSBidWZmZXIKLSAqICAgICAgIHdpdGggMC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgU0FGRV9NQUxMT0MocCwgdHlwZSwgY291bnQsIGNvbW1lbnQpIFwKLXsgXAotICAgIChwKSA9ICh0eXBlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKHR5cGUpKihjb3VudCksIDB4RkYsKE00T1NBX0NoYXIqKWNvbW1lbnQpO1wKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IChwKSwgTTRFUlJfQUxMT0MpOyBcCi0gICAgbWVtc2V0KCh2b2lkICopKHApLCAwLHNpemVvZih0eXBlKSooY291bnQpKTsgXAotfQotCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioKLSAgICAgKiAgICBVVElMSVRJRVMgICAgICoKLSAgICAgKioqKioqKioqKioqKioqKioqKiovCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIERJU1BMQVkgTUVUQURBVEEgQ09OVEVOVCAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGRpc3BsYXlNZXRhRGF0YShjb25zdCBzcDxNZXRhRGF0YT4gbWV0YSk7Ci0KLS8vIEJ1aWxkIHRoZSBBVkMgY29kZWMgc3BjaWZpYyBpbmZvIGZyb20gdGhlIFN0YWdlRnJpZ2h0IGVuY29kZXJzIG91dHB1dAotc3RhdHVzX3QgYnVpbGRBVkNDb2RlY1NwZWNpZmljRGF0YSh1aW50OF90ICoqb3V0cHV0RGF0YSwgc2l6ZV90ICpvdXRwdXRTaXplLAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgTWV0YURhdGEgKnBhcmFtKTsKLQotfS8vbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0jZW5kaWYgLy9BTkRST0lEX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlZWEzYTYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBkZWNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl9WSURFT0RFQ09ERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl9WSURFT0RFQ09ERVJfSAotCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsCi0gICAgICAgIE00T1NBX0NvbnRleHQgKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9IMjY0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsCi0gICAgICAgIE00T1NBX0NvbnRleHQgKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlX01QRUc0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsCi0gICAgICAgIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0U29mdHdhcmVJbnRlcmZhY2VfSDI2NCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLAotICAgICAgICBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFZpZGVvRGVjb2RlcnNBbmRDYXBhYmlsaXRpZXMoCi0gICAgTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMqKiBkZWNvZGVycyk7Ci0KLSNlbmRpZiAvLyBWSURFT0VESVRPUl9WSURFT0RFQ09ERVJfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzYyNjQzLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfSW50ZXJuYWwuaAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIHZpZGVvIGRlY29kZXIgaW50ZXJuYWwgaGVhZGVyIGZpbGUqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00X0NvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0jaW5jbHVkZSAiTTREQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQnVmZmVyLmgiCi0jaW5jbHVkZSAiTTRWRF9Ub29scy5oIgotI2luY2x1ZGUgIkk0MjBDb2xvckNvbnZlcnRlci5oIgotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvcmVjdC5oPgotI2luY2x1ZGUgPE9NWF9WaWRlby5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotCi0jZGVmaW5lIFZJREVPRURJVE9SX1ZJREVDX1NIRUxMX1ZFUl9NQUpPUiAgICAgMAotI2RlZmluZSBWSURFT0VESVRPUl9WSURFQ19TSEVMTF9WRVJfTUlOT1IgICAgIDAKLSNkZWZpbmUgVklERU9FRElUT1JfVklERUNfU0hFTExfVkVSX1JFVklTSU9OICAxCi0KLS8qIEVSUk9SUyAqLwotI2RlZmluZSBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgMHhGRiwgMHgwMDAxKQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgVklERU9FRElUT1Jfa01wZWc0VmlkZW9EZWMsCi0gICAgVklERU9FRElUT1Jfa0gyNjNWaWRlb0RlYywKLSAgICBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjCi19IFZJREVPRURJVE9SX0NvZGVjVHlwZTsKLQotCi0vKnR5cGVkZWYgc3RydWN0ewotICAgIE00T1NBX1VJbnQzMiBzdHJlYW1fYnl0ZTsKLSAgICBNNE9TQV9VSW50MzIgc3RyZWFtX2luZGV4OwotICAgIE00T1NBX01lbUFkZHI4IGluOwotCi19IFZJREVPRURJVE9SX1ZJREVPX0JpdHN0cmVhbV9jdHh0OyovCi0KLXR5cGVkZWYgTTRWU19CaXRzdHJlYW1fY3R4dCBWSURFT0VESVRPUl9WSURFT19CaXRzdHJlYW1fY3R4dDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgLyoqIFN0YWdlZnJpZ3RoIHBhcmFtcyAqLwotICAgIE9NWENsaWVudCAgICAgICAgICAgICAgIG1DbGllbnQ7IC8qKjwgT01YIENsaWVudCBzZXNzaW9uIGluc3RhbmNlLiAqLwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgIG1WaWRlb0RlY29kZXI7IC8qKjwgU3RhZ2VmcmlnaHQgZGVjb2RlciBpbnN0YW5jZSAqLwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgIG1SZWFkZXJTb3VyY2U7IC8qKjwgUmVhZGVyIGFjY2VzcyA+ICovCi0KLSAgICAvKiBSRUFERVIgKi8KLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKm1fcFJlYWRlckdsb2JhbDsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICAqbV9wUmVhZGVyOwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgICptX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlOwotCi0gICAgLyogU1RSRUFNIFBBUkFNUyAqLwotICAgIE00X1ZpZGVvU3RyZWFtSGFuZGxlciogIG1fcFZpZGVvU3RyZWFtaGFuZGxlcjsKLQotICAgIC8qIFVzZXIgZmlsdGVyIHBhcmFtcy4gKi8KLSAgICBNNFZJRklfUGxhbkNvbnZlcnRlckZ1bmN0aW9uVHlwZSAqbV9wRmlsdGVyOwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICptX3BGaWx0ZXJVc2VyRGF0YTsKLQotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgIG1fbGFzdERlY29kZWRDVFM7Ci0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgbV9sYXN0UmVuZGVyQ3RzOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1SZWFjaGVkRU9TOwotICAgIFZJREVPRURJVE9SX0NvZGVjVHlwZSAgIG1EZWNvZGVyVHlwZTsKLSAgICBNNERFQ09ERVJfVmlkZW9TaXplICAgICBtX1ZpZGVvU2l6ZTsKLSAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8gbV9EY2k7IC8qKjwgRGVjb2RlciBDb25maWcgaW5mbyAqLwotICAgIFZJREVPRURJVE9SX0JVRkZFUl9Qb29sICptX3BEZWNCdWZmZXJQb29sOyAvKio8IERlY29kZWQgYnVmZmVyIHBvb2wgKi8KLSAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSAgICBkZWNPdXB1dENvbG9yRm9ybWF0OwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbU5iSW5wdXRGcmFtZXM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUZpcnN0SW5wdXRDdHM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUxhc3RJbnB1dEN0czsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtTmJSZW5kZXJlZEZyYW1lczsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtRmlyc3RSZW5kZXJlZEN0czsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtTGFzdFJlbmRlcmVkQ3RzOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1OYk91dHB1dEZyYW1lczsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtRmlyc3RPdXRwdXRDdHM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUxhc3RPdXRwdXRDdHM7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgbUdpdmVuV2lkdGgsIG1HaXZlbkhlaWdodDsgLy9Vc2VkIGluIGNhc2Ugb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lORk9fRk9STUFUX0NIQU5HRUQKLSAgICBBUmVjdCAgICAgICAgICAgICAgICAgICBtQ3JvcFJlY3Q7ICAvLyBUaGVzZSBhcmUgb2J0YWluZWQgZnJvbSBrS2V5Q3JvcFJlY3QuCi0gICAgSTQyMENvbG9yQ29udmVydGVyKiAgICAgbUk0MjBDb2xvckNvbnZlcnRlcjsKLQotICAgIC8vIFRpbWUgaW50ZXJ2YWwgYmV0d2VlbiB0d28gY29uc2VxdXRpdmUvbmVpZ2hib3JpbmcgdmlkZW8gZnJhbWVzLgotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgIG1GcmFtZUludGVydmFsTXM7Ci0KLX0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dDsKLQotfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkNTE1NGYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBlbmNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl9WSURFT0VOQ09ERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl9WSURFT0VOQ09ERVJfSAotCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NChNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKTsKLQotI2VuZGlmIC8vVklERU9FRElUT1JfVklERU9FTkNPREVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTMwYjg1ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgTWVkaWFCdWZmZXJQdWxsZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yVXRpbHMuY3BwIFwKLSAgICBWaWRlb0VkaXRvckJ1ZmZlci5jIFwKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgY29yZWNnIGdyYXBoaWNzKSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvbHZwcCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvZWRpdG9yIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgIFwKLSAgICBsaWJjdXRpbHMgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJtZWRpYSAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodCAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICBsaWJzdGFnZWZyaWdodF9vbXggICAgICAgIFwKLSAgICBsaWJndWkgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcnBsYXllciAgICAgIFwKLQotTE9DQUxfQ0ZMQUdTICs9IFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbgotCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX3N0YWdlZnJpZ2h0c2hlbGxzCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9NZWRpYUJ1ZmZlclB1bGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjODI2OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlclB1bGxlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlICJNZWRpYUJ1ZmZlclB1bGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLQotTWVkaWFCdWZmZXJQdWxsZXI6Ok1lZGlhQnVmZmVyUHVsbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAotICAgICAgbUFza1RvU3RhcnQoZmFsc2UpLAotICAgICAgbUFza1RvU3RvcChmYWxzZSksCi0gICAgICBtQWNxdWlyZVN0b3BwZWQoZmFsc2UpLAotICAgICAgbVJlbGVhc2VTdG9wcGVkKGZhbHNlKSwKLSAgICAgIG1Tb3VyY2VFcnJvcihPSykgewotCi0gICAgYW5kcm9pZENyZWF0ZVRocmVhZChhY3F1aXJlVGhyZWFkU3RhcnQsIHRoaXMpOwotICAgIGFuZHJvaWRDcmVhdGVUaHJlYWQocmVsZWFzZVRocmVhZFN0YXJ0LCB0aGlzKTsKLX0KLQotTWVkaWFCdWZmZXJQdWxsZXI6On5NZWRpYUJ1ZmZlclB1bGxlcigpIHsKLSAgICBzdG9wKCk7Ci19Ci0KLWJvb2wgTWVkaWFCdWZmZXJQdWxsZXI6Omhhc01lZGlhU291cmNlUmV0dXJuZWRFcnJvcigpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHJldHVybiAoKG1Tb3VyY2VFcnJvciAhPSBPSykgPyB0cnVlIDogZmFsc2UpOwotfQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6c3RhcnQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBtQXNrVG9TdGFydCA9IHRydWU7Ci0gICAgbUFjcXVpcmVDb25kLnNpZ25hbCgpOwotICAgIG1SZWxlYXNlQ29uZC5zaWduYWwoKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6c3RvcCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIG1Bc2tUb1N0b3AgPSB0cnVlOwotICAgIG1BY3F1aXJlQ29uZC5zaWduYWwoKTsKLSAgICBtUmVsZWFzZUNvbmQuc2lnbmFsKCk7Ci0gICAgd2hpbGUgKCFtQWNxdWlyZVN0b3BwZWQgfHwgIW1SZWxlYXNlU3RvcHBlZCkgewotICAgICAgICBtVXNlckNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgLy8gUmVsZWFzZSByZW1haW5pbmcgYnVmZmVycwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUJ1ZmZlcnMuaXRlbUF0KGkpLT5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVsZWFzZUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVJlbGVhc2VCdWZmZXJzLml0ZW1BdChpKS0+cmVsZWFzZSgpOwotICAgIH0KLQotICAgIG1CdWZmZXJzLmNsZWFyKCk7Ci0gICAgbVJlbGVhc2VCdWZmZXJzLmNsZWFyKCk7Ci19Ci0KLU1lZGlhQnVmZmVyKiBNZWRpYUJ1ZmZlclB1bGxlcjo6Z2V0QnVmZmVyTm9uQmxvY2tpbmcoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBpZiAobUJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICBNZWRpYUJ1ZmZlciogYiA9IG1CdWZmZXJzLml0ZW1BdCgwKTsKLSAgICAgICAgbUJ1ZmZlcnMucmVtb3ZlQXQoMCk7Ci0gICAgICAgIHJldHVybiBiOwotICAgIH0KLX0KLQotTWVkaWFCdWZmZXIqIE1lZGlhQnVmZmVyUHVsbGVyOjpnZXRCdWZmZXJCbG9ja2luZygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHdoaWxlIChtQnVmZmVycy5lbXB0eSgpICYmICFtQWNxdWlyZVN0b3BwZWQpIHsKLSAgICAgICAgbVVzZXJDb25kLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGlmIChtQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBiID0gbUJ1ZmZlcnMuaXRlbUF0KDApOwotICAgICAgICBtQnVmZmVycy5yZW1vdmVBdCgwKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhQnVmZmVyUHVsbGVyOjpwdXRCdWZmZXIoTWVkaWFCdWZmZXIqIGJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgbVJlbGVhc2VCdWZmZXJzLnB1c2goYnVmZmVyKTsKLSAgICBtUmVsZWFzZUNvbmQuc2lnbmFsKCk7Ci19Ci0KLWludCBNZWRpYUJ1ZmZlclB1bGxlcjo6YWNxdWlyZVRocmVhZFN0YXJ0KHZvaWQqIGFyZykgewotICAgIE1lZGlhQnVmZmVyUHVsbGVyKiBzZWxmID0gKE1lZGlhQnVmZmVyUHVsbGVyKilhcmc7Ci0gICAgc2VsZi0+YWNxdWlyZVRocmVhZEZ1bmMoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IE1lZGlhQnVmZmVyUHVsbGVyOjpyZWxlYXNlVGhyZWFkU3RhcnQodm9pZCogYXJnKSB7Ci0gICAgTWVkaWFCdWZmZXJQdWxsZXIqIHNlbGYgPSAoTWVkaWFCdWZmZXJQdWxsZXIqKWFyZzsKLSAgICBzZWxmLT5yZWxlYXNlVGhyZWFkRnVuYygpOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIE1lZGlhQnVmZmVyUHVsbGVyOjphY3F1aXJlVGhyZWFkRnVuYygpIHsKLSAgICBtTG9jay5sb2NrKCk7Ci0KLSAgICAvLyBXYWl0IGZvciB0aGUgc3RhcnQgc2lnbmFsCi0gICAgd2hpbGUgKCFtQXNrVG9TdGFydCAmJiAhbUFza1RvU3RvcCkgewotICAgICAgICBtQWNxdWlyZUNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgLy8gTG9vcCB1bnRpbCB3ZSBhcmUgYXNrZWQgdG8gc3RvcCwgb3IgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvIHJlYWQKLSAgICB3aGlsZSAoIW1Bc2tUb1N0b3ApIHsKLSAgICAgICAgTWVkaWFCdWZmZXIqIHBCdWZmZXI7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtU291cmNlLT5yZWFkKCZwQnVmZmVyLCBOVUxMKTsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICBtU291cmNlRXJyb3IgPSByZXN1bHQ7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1CdWZmZXJzLnB1c2gocEJ1ZmZlcik7Ci0gICAgICAgIG1Vc2VyQ29uZC5zaWduYWwoKTsKLSAgICB9Ci0KLSAgICBtQWNxdWlyZVN0b3BwZWQgPSB0cnVlOwotICAgIG1Vc2VyQ29uZC5zaWduYWwoKTsKLSAgICBtTG9jay51bmxvY2soKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6cmVsZWFzZVRocmVhZEZ1bmMoKSB7Ci0gICAgbUxvY2subG9jaygpOwotCi0gICAgLy8gV2FpdCBmb3IgdGhlIHN0YXJ0IHNpZ25hbAotICAgIHdoaWxlICghbUFza1RvU3RhcnQgJiYgIW1Bc2tUb1N0b3ApIHsKLSAgICAgICAgbVJlbGVhc2VDb25kLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIC8vIExvb3AgdW50aWwgd2UgYXJlIGFza2VkIHRvIHN0b3AKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAobVJlbGVhc2VCdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChtQXNrVG9TdG9wKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1SZWxlYXNlQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBNZWRpYUJ1ZmZlciogcEJ1ZmZlciA9IG1SZWxlYXNlQnVmZmVycy5pdGVtQXQoMCk7Ci0gICAgICAgIG1SZWxlYXNlQnVmZmVycy5yZW1vdmVBdCgwKTsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHBCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgIH0KLQotICAgIG1SZWxlYXNlU3RvcHBlZCA9IHRydWU7Ci0gICAgbVVzZXJDb25kLnNpZ25hbCgpOwotICAgIG1Mb2NrLnVubG9jaygpOwotfQotCi19OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTWVkaWFCdWZmZXJQdWxsZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTWVkaWFCdWZmZXJQdWxsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3MmE1My4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTUVESUFfQlVGRkVSX1BVTExFUl9ICi0jZGVmaW5lIF9NRURJQV9CVUZGRVJfUFVMTEVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBNZWRpYVNvdXJjZTsKLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKLQotLyoKLSAqIEFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGNhbiBwdWxsIGEgbGlzdCBvZiBtZWRpYSBidWZmZXJzCi0gKiBmcm9tIGEgTWVkaWFTb3VyY2UgcmVwZWF0ZWRseS4gVGhlIHVzZXIgY2FuIHRoZW4gZ2V0IHRoZQotICogYnVmZmVycyBmcm9tIHRoYXQgbGlzdC4KLSAqLwotc3RydWN0IE1lZGlhQnVmZmVyUHVsbGVyIHsKLXB1YmxpYzoKLSAgICBNZWRpYUJ1ZmZlclB1bGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSk7Ci0gICAgfk1lZGlhQnVmZmVyUHVsbGVyKCk7Ci0KLSAgICAvLyBTdGFydCB0byBidWlsZCB1cCB0aGUgbGlzdCBvZiB0aGUgYnVmZmVycy4KLSAgICB2b2lkIHN0YXJ0KCk7Ci0KLSAgICAvLyBSZWxlYXNlIHRoZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgYnVmZmVycywgYW5kIHN0b3AKLSAgICAvLyBwdWxsaW5nIGJ1ZmZlcnMgZnJvbSB0aGUgTWVkaWFTb3VyY2UuCi0gICAgdm9pZCBzdG9wKCk7Ci0KLSAgICAvLyBHZXQgYSBidWZmZXIgZnJvbSB0aGUgbGlzdC4gSWYgdGhlcmUgaXMgbm8gYnVmZmVyIGF2YWlsYWJsZQotICAgIC8vIGF0IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgTlVMTCBpcyByZXR1cm5lZC4KLSAgICBNZWRpYUJ1ZmZlciogZ2V0QnVmZmVyQmxvY2tpbmcoKTsKLQotICAgIC8vIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSBsaXN0LiBJZiB0aGVyZSBpcyBubyBidWZmZXIgYXZhaWxhYmxlCi0gICAgLy8gYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBpdCBibG9ja3Mgd2FpdGluZyBmb3IKLSAgICAvLyBhIGJ1ZmZlciB0byBiZWNvbWUgYXZhaWxhYmxlIG9yIHVudGlsIHN0b3AoKSBpcyBjYWxsZWQuCi0gICAgTWVkaWFCdWZmZXIqIGdldEJ1ZmZlck5vbkJsb2NraW5nKCk7Ci0KLSAgICAvLyBBZGQgYSBidWZmZXIgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhdmFpbGFibGUgbWVkaWEgYnVmZmVycwotICAgIHZvaWQgcHV0QnVmZmVyKE1lZGlhQnVmZmVyKiBidWZmZXIpOwotCi0gICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc291cmNlIHJldHVybmVkIGFuIGVycm9yIG9yIG5vdC4KLSAgICBib29sIGhhc01lZGlhU291cmNlUmV0dXJuZWRFcnJvcigpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBpbnQgYWNxdWlyZVRocmVhZFN0YXJ0KHZvaWQqIGFyZyk7Ci0gICAgdm9pZCBhY3F1aXJlVGhyZWFkRnVuYygpOwotCi0gICAgc3RhdGljIGludCByZWxlYXNlVGhyZWFkU3RhcnQodm9pZCogYXJnKTsKLSAgICB2b2lkIHJlbGVhc2VUaHJlYWRGdW5jKCk7Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBWZWN0b3I8TWVkaWFCdWZmZXIqPiBtQnVmZmVyczsKLSAgICBWZWN0b3I8TWVkaWFCdWZmZXIqPiBtUmVsZWFzZUJ1ZmZlcnM7Ci0KLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgIENvbmRpdGlvbiBtVXNlckNvbmQ7ICAgICAvLyBmb3IgdGhlIHVzZXIgb2YgdGhpcyBjbGFzcwotICAgIENvbmRpdGlvbiBtQWNxdWlyZUNvbmQ7ICAvLyBmb3IgdGhlIGFjcXVpcmUgdGhyZWFkCi0gICAgQ29uZGl0aW9uIG1SZWxlYXNlQ29uZDsgIC8vIGZvciB0aGUgcmVsZWFzZSB0aHJlYWQKLQotICAgIGJvb2wgbUFza1RvU3RhcnQ7ICAgICAgLy8gQXNrcyB0aGUgdGhyZWFkcyB0byBzdGFydAotICAgIGJvb2wgbUFza1RvU3RvcDsgICAgICAgLy8gQXNrcyB0aGUgdGhyZWFkcyB0byBzdG9wCi0gICAgYm9vbCBtQWNxdWlyZVN0b3BwZWQ7ICAvLyBUaGUgYWNxdWlyZSB0aHJlYWQgaGFzIHN0b3BwZWQKLSAgICBib29sIG1SZWxlYXNlU3RvcHBlZDsgIC8vIFRoZSByZWxlYXNlIHRocmVhZCBoYXMgc3RvcHBlZAotICAgIHN0YXR1c190IG1Tb3VyY2VFcnJvcjsgLy8gRXJyb3IgcmV0dXJuZWQgYnkgTWVkaWFTb3VyY2UgcmVhZAotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZSEKLSAgICBNZWRpYUJ1ZmZlclB1bGxlcihjb25zdCBNZWRpYUJ1ZmZlclB1bGxlciYpOwotICAgIE1lZGlhQnVmZmVyUHVsbGVyJiBvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJQdWxsZXImKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gX01FRElBX0JVRkZFUl9QVUxMRVJfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvcjNncFJlYWRlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTljZjllYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvcjNncFJlYWRlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCAzR1AgUmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl8zR1BSRUFERVIiCi0KLS8qKgotICogSEVBREVSUwotICoKLSAqLwotI2RlZmluZSBWSURFT0VESVRPUl9CSVRTVFJFQU1fUEFSU0VSCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yM2dwUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVXRpbHMuaCIKLSNpbmNsdWRlICJNNFJFQURFUl8zZ3BDb20uaCIKLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLSNpZmRlZiBWSURFT0VESVRPUl9CSVRTVFJFQU1fUEFSU0VSCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNF9VdGlscy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJFU0RTLmgiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0vKioKLSAqIFNPVVJDRSBDTEFTUwotICovCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEFycmF5IG9mIEFNUiBOQi9XQiBiaXRyYXRlcwotICogQG5vdGUgICAgQXJyYXkgdG8gbWF0Y2ggdGhlIG1vZGUgYW5kIHRoZSBiaXQgcmF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLWNvbnN0IE00T1NBX1VJbnQzMiBWaWRlb0VkaXRvcjNncFJlYWRlcl9BbXJCaXRSYXRlIFsyIC8qIDhrSHogLyAxNmtIeiAgICAgKi9dCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOSAvKiB0aGUgYml0cmF0ZSBtb2RlICovXSA9Ci17Ci0gICAgezQ3NTAsIDUxNTAsIDU5MDAsICA2NzAwLCAgNzQwMCwgIDc5NTAsICAxMDIwMCwgMTIyMDAsIDB9LAotICAgIHs2NjAwLCA4ODUwLCAxMjY1MCwgMTQyNTAsIDE1ODUwLCAxODI1MCwgMTk4NTAsIDIzMDUwLCAyMzg1MH0KLX07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Ci0gKiBAYnJpZWY6VGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udGV4dCBvZiB0aGUgU3RhZ2VGcmlnaHQgM0dQIHNoZWxsIFJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gICAgICAgICAgICAgIG1EYXRhU291cmNlOwotICAgIHNwPE1lZGlhRXh0cmFjdG9yPiAgICAgICAgICBtRXh0cmFjdG9yOwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgICAgICBtQXVkaW9Tb3VyY2U7Ci0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgICAgIG1WaWRlb1NvdXJjZTsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgbVZpZGVvU3RyZWFtSGFuZGxlcjsKLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgbUF1ZGlvQXU7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIG1WaWRlb0F1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBtTWF4RHVyYXRpb247Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgIG1GaWxlU2l6ZTsKLSAgICBNNF9TdHJlYW1UeXBlICAgICAgICAgICAgICAgbVN0cmVhbVR5cGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1TdHJlYW1JZDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbVRyYWNrczsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUN1cnJUcmFjazsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vla2luZzsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vla1RpbWU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIG1WaWRlb1NlZWtpbmc7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICAgIG1WaWRlb1NlZWtUaW1lOwotCi19IFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQ7Ci0KLSNpZmRlZiBWSURFT0VESVRPUl9CSVRTVFJFQU1fUEFSU0VSCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgSW50ZXJuYWwgQml0U3RyZWFtUGFyc2VyIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDMyKiAgIG1QYml0U3RyZWFtOyAgIC8qKjwgYml0c3RyZWFtIHBvaW50ZXIgKDMyYml0cyBhbGlnbmVkKSAqLwotICAgIE00T1NBX0ludDMyICAgICBtU2l6ZTsgICAgICAgICAvKio8IGJpdHN0cmVhbSBzaXplIGluIGJ5dGVzICovCi0gICAgTTRPU0FfSW50MzIgICAgIG1JbmRleDsgICAgICAgIC8qKjwgYnl0ZSBpbmRleCAqLwotICAgIE00T1NBX0ludDMyICAgICBtQml0SW5kZXg7ICAgICAvKio8IGJpdCBpbmRleCAqLwotICAgIE00T1NBX0ludDMyICAgICBtU3RydWN0U2l6ZTsgICAvKio8IHNpemUgb2Ygc3RydWN0dXJlICovCi19IFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEFsbG9jYXRlcyB0aGUgY29udGV4dCBhbmQgaW5pdGlhbGl6ZXMgaW50ZXJuYWwgZGF0YS4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChPVVQpICBQb2ludGVyIHRvIHRoZSBCaXRTdHJlYW1QYXJzZXIgY29udGV4dCB0byBjcmVhdGUuCi0gKiBAcGFyYW0gICBiaXRTdHJlYW0gICBBIHBvaW50ZXIgdG8gdGhlIGJpdHN0cmVhbQotICogQHBhcmFtICAgc2l6ZSAgICAgICAgVGhlIHNpemUgb2YgdGhlIGJpdHN0cmVhbSBpbiBieXRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgdm9pZCBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJJbml0KHZvaWQqKiBwQ29udGV4dCwKLSAgICAgICAgdm9pZCogcEJpdFN0cmVhbSwgTTRPU0FfSW50MzIgc2l6ZSkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0OwotCi0gICAgKnBDb250ZXh0PU00T1NBX05VTEw7Ci0gICAgcFN0cmVhbUNvbnRleHQgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBzaXplb2YoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCksIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikiM0dQIEJpdFN0cmVhbVBhcnNlciBDb250ZXh0Iik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwU3RyZWFtQ29udGV4dC0+bVBiaXRTdHJlYW09KE00T1NBX1VJbnQzMiopcEJpdFN0cmVhbTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bVNpemU9c2l6ZTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bUluZGV4PTA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleD0wOwotICAgIHBTdHJlYW1Db250ZXh0LT5tU3RydWN0U2l6ZSA9Ci0gICAgICAgIHNpemVvZihWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KTsKLQotICAgICpwQ29udGV4dD1wU3RyZWFtQ29udGV4dDsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIENsZWFuIHVwIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChJTi9PVVQpICBCaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ2xlYW5VcCh2b2lkKiBwQ29udGV4dCkgewotICAgIGZyZWUoKE00T1NBX0ludDMyKilwQ29udGV4dCk7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgUmVhZCB0aGUgbmV4dCA8bGVuZ3RoPiBiaXRzIGluIHRoZSBiaXRzdHJlYW0uCi0gKiBAbm90ZSAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgdXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChJTi9PVVQpIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHBhcmFtICAgbGVuZ3RoICAgICAgKElOKSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gZXh0cmFjdCBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqIEByZXR1cm4gIHRoZSByZWFkIGJpdHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyBNNE9TQV9VSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHModm9pZCogcENvbnRleHQsCi0gICAgICAgIE00T1NBX0ludDMyIGxlbmd0aCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfVUludDMyIHVfbWFzazsKLSAgICBNNE9TQV9VSW50MzIgcmV0dmFsOwotICAgIE00T1NBX0ludDMyIGlfb3ZmOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wU3RyZWFtQ29udGV4dCksIDAsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0czppbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcmV0dmFsPShNNE9TQV9VSW50MzIpR0VUX01FTU9SWTMyKHBTdHJlYW1Db250ZXh0LT5cCi0gICAgICAgIG1QYml0U3RyZWFtWyBwU3RyZWFtQ29udGV4dC0+bUluZGV4IF0pOwotICAgIGlfb3ZmID0gcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCArIGxlbmd0aCAtIDMyOwotICAgIHVfbWFzayA9IChsZW5ndGggPj0gMzIpID8gMHhmZmZmZmZmZjogKDEgPDwgbGVuZ3RoKSAtIDE7Ci0KLSAgICAvKiBkbyB3ZSBoYXZlIGVub3VnaCBiaXRzIGF2YWlsYmxlIGluIHRoZSBjdXJyZW50IHdvcmQoMzJiaXRzKSovCi0gICAgaWYgKGlfb3ZmIDw9IDApIHsKLSAgICAgICAgcmV0dmFsPShyZXR2YWwgPj4gKC0gaV9vdmYpKSAmIHVfbWFzazsKLSAgICB9IGVsc2UgewotICAgICAgICBNNE9TQV9VSW50MzIgdV9uZXh0d29yZCA9IChNNE9TQV9VSW50MzIpR0VUX01FTU9SWTMyKAotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1QYml0U3RyZWFtWyBwU3RyZWFtQ29udGV4dC0+bUluZGV4ICsgMSBdKTsKLSAgICAgICAgTTRPU0FfVUludDMyIHVfbXNiX21hc2ssIHVfbXNiX3ZhbHVlLCB1X2xzYl9tYXNrLCB1X2xzYl92YWx1ZTsKLQotICAgICAgICB1X21zYl9tYXNrID0gKCgxIDw8ICgzMiAtIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXgpKSAtIDEpIDw8IGlfb3ZmOwotICAgICAgICB1X21zYl92YWx1ZSA9IHJldHZhbCA8PCBpX292ZjsKLSAgICAgICAgdV9sc2JfbWFzayA9ICgxIDw8IGlfb3ZmKSAtIDE7Ci0gICAgICAgIHVfbHNiX3ZhbHVlID0gdV9uZXh0d29yZCA+PiAoMzIgLSBpX292Zik7Ci0gICAgICAgIHJldHZhbD0gKHVfbXNiX3ZhbHVlICYgdV9tc2JfbWFzayApIHwgKHVfbHNiX3ZhbHVlICYgdV9sc2JfbWFzayk7Ci0gICAgfQotICAgIC8qIHJldHVybiB0aGUgYml0cy4uLiovCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgSW5jcmVtZW50IHRoZSBiaXRzdHJlYW0gcG9pbnRlciBvZiA8bGVuZ3RoPiBiaXRzLgotICogQHBhcmFtICAgcENvbnRleHQgICAgKElOL09VVCkgQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBsZW5ndGggICAgICAoSU4pIFRoZSBudW1iZXIgb2YgYml0IHRvIHNoaWZ0IHRoZSBiaXRzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgdm9pZCBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHModm9pZCogcENvbnRleHQsCi0gICAgICAgIE00T1NBX0ludDMyIGxlbmd0aCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0PSgKLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgdmFsOwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB2YWw9cFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCArIGxlbmd0aDsKLSAgICAvKiB1cGRhdGUgdGhlIGJpdHMuLi4qLwotICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXggKz0gbGVuZ3RoOwotCi0gICAgaWYgKHZhbCAtIDMyID49IDApIHsKLSAgICAgICAgLyogdXBkYXRlIHRoZSBiaXRzLi4uKi8KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCAtPSAzMjsKLSAgICAgICAgLyogdXBkYXRlIHRoZSB3b3JkcyovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tSW5kZXgrKzsKLSAgICB9Ci19Ci0KLXN0YXRpYyBNNE9TQV9VSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyR2V0Qml0cygKLSAgICAgICAgdm9pZCogcENvbnRleHQsTTRPU0FfSW50MzIgYml0UG9zLCBNNE9TQV9JbnQzMiBiaXRMZW5ndGgpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KiBwU3RyZWFtQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0ludDMyIGJpdExvY2F0aW9uLCBiaXRJbmRleDsKLSAgICBNNE9TQV9VSW50MzIgcmV0dmFsPTA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEw9PXBTdHJlYW1Db250ZXh0KSwgMCwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckdldEJpdHM6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBjb21wdXRlcyB0aGUgd29yZCBsb2NhdGlvbiovCi0gICAgYml0TG9jYXRpb249Yml0UG9zLzMyOwotICAgIGJpdEluZGV4PShiaXRQb3MpICUgMzI7Ci0KLSAgICBpZiAoYml0TG9jYXRpb24gPCBwU3RyZWFtQ29udGV4dC0+bVNpemUpIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHVfbWFzazsKLSAgICAgICAgTTRPU0FfSW50MzIgaV9vdmYgPSBiaXRJbmRleCArIGJpdExlbmd0aCAtIDMyOwotICAgICAgICByZXR2YWw9KE00T1NBX1VJbnQzMilHRVRfTUVNT1JZMzIoCi0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bVBiaXRTdHJlYW1bIGJpdExvY2F0aW9uIF0pOwotCi0gICAgICAgIHVfbWFzayA9IChiaXRMZW5ndGggPj0gMzIpID8gMHhmZmZmZmZmZjogKDEgPDwgYml0TGVuZ3RoKSAtIDE7Ci0KLSAgICAgICAgaWYgKGlfb3ZmIDw9IDApIHsKLSAgICAgICAgICAgIHJldHZhbD0ocmV0dmFsID4+ICgtIGlfb3ZmKSkgJiB1X21hc2s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdV9uZXh0d29yZCA9IChNNE9TQV9VSW50MzIpR0VUX01FTU9SWTMyKAotICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tUGJpdFN0cmVhbVsgYml0TG9jYXRpb24gKyAxIF0pOwotICAgICAgICAgICAgTTRPU0FfVUludDMyIHVfbXNiX21hc2ssIHVfbXNiX3ZhbHVlLCB1X2xzYl9tYXNrLCB1X2xzYl92YWx1ZTsKLQotICAgICAgICAgICAgdV9tc2JfbWFzayA9ICgoMSA8PCAoMzIgLSBiaXRJbmRleCkpIC0gMSkgPDwgaV9vdmY7Ci0gICAgICAgICAgICB1X21zYl92YWx1ZSA9IHJldHZhbCA8PCBpX292ZjsKLSAgICAgICAgICAgIHVfbHNiX21hc2sgPSAoMSA8PCBpX292ZikgLSAxOwotICAgICAgICAgICAgdV9sc2JfdmFsdWUgPSB1X25leHR3b3JkID4+ICgzMiAtIGlfb3ZmKTsKLSAgICAgICAgICAgIHJldHZhbD0gKHVfbXNiX3ZhbHVlICYgdV9tc2JfbWFzayApIHwgKHVfbHNiX3ZhbHVlICYgdV9sc2JfbWFzayk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyUmVzdGFydCh2b2lkKiBwQ29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvKiByZXNldHMgdGhlIGJpdHN0cmVhbSBwb2ludGVycyovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1JbmRleD0wOwotICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXg9MDsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgR2V0IGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIHBvaW50ZWQgYnkgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICogQG5vdGUgICBJdCBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHkgYXMgdGhlIHBvaW50ZXIgaXMgaW4gdGhlIGJpdHN0cmVhbSBpdHNlbGYKLSAqICAgICAgICAgYW5kIG5vIGNvcHkgaXMgbWFkZS4KLSAqIEBwYXJhbSAgcENvbnRleHQgICAgKElOL09VVCkgIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBiaXRzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX1VJbnQ4KiAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfR2V0Q3VycmVudGJpdFN0cmVhbVBvaW50ZXIoCi0gICAgICAgIHZvaWQqIHBDb250ZXh0KSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCogcFN0cmVhbUNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wU3RyZWFtQ29udGV4dCksIDAsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcmV0dXJuIChNNE9TQV9VSW50OCopKChNNE9TQV9VSW50OCopcFN0cmVhbUNvbnRleHQtPm1QYml0U3RyZWFtICsgXAotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bUluZGV4ICogc2l6ZW9mKE00T1NBX1VJbnQzMikgKyBcCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXgvOCkgOwotfQotCi1zdGF0aWMgTTRPU0FfSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyR2V0U2l6ZSh2b2lkKiBwQ29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTD09cFN0cmVhbUNvbnRleHQpLCAwLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHJldHVybiBwU3RyZWFtQ29udGV4dC0+bVNpemU7Ci19Ci0KLQotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfTVBFRzRCaXRTdHJlYW1QYXJzZXJJbml0KHZvaWQqKiBwQ29udGV4dCwKLSAgICAgICAgdm9pZCogcEJpdFN0cmVhbSwgTTRPU0FfSW50MzIgc2l6ZSkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckluaXQocENvbnRleHQsIHBCaXRTdHJlYW0sIHNpemUpOwotfQotc3RhdGljIE00T1NBX0ludDMyIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0dldE1wZWdMZW5ndGhGcm9tSW50ZWdlcih2b2lkKiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIHZhbCkgewotICAgIE00T1NBX1VJbnQzMiBsZW5ndGg9MDsKLSAgICBNNE9TQV9VSW50MzIgbnVtQnl0ZXM9MDsKLSAgICBNNE9TQV9VSW50MzIgYj0wOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wQ29udGV4dCksIDAsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogdGhlIGxlbmd0aCBpcyBlbmNvZGVkIGFzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuIFRoZSBoaWdoZXN0IGJpdCBpcyB1c2VkCi0gICAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbGVuZ3RoIGNvbnRpbnVlcyBvbiB0aGUgbmV4dCBieXRlLgotCi0gICAgVGhlIGxlbmd0aCBjYW4gYmU6IDB4ODAgMHg4MCAweDgwIDB4MjIKLSAgICBvZiBqdXN0ICAgICAgICAgICAgMHgyMiAoaGlnaGVzdCBiaXQgbm90IHNldCkKLQotICAgICovCi0KLSAgICBkbyB7Ci0gICAgICAgIGI9KHZhbCAmICgoMHhmZik8PCAoOCAqIG51bUJ5dGVzKSkpPj4gKDggKiBudW1CeXRlcyk7Ci0gICAgICAgIGxlbmd0aD0obGVuZ3RoIDw8IDcpIHwgKGIgJiAweDdmKTsKLSAgICAgICAgbnVtQnl0ZXMrKzsKLSAgICB9IHdoaWxlICgoYiAmIDB4ODApICYmIG51bUJ5dGVzIDwgNCk7Ci0KLSAgICByZXR1cm4gbGVuZ3RoOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgIERlY29kZSBhbiBNUEVHNCBTeXN0ZW1zIGRlc2NyaXB0b3Igc2l6ZSBmcm9tIGFuIGVuY29kZWQgU0RMIHNpemUgZGF0YQotICogQG5vdGUgICBUaGUgdmFsdWUgaXMgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBsb2NhdGlvbi4KLSAqIEBwYXJhbSAgcENvbnRleHQgICAgKElOL09VVCkgIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHJldHVybiBTaXplIGluIGEgaHVtYW4gcmVhZGFibGUgZm9ybQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgTTRPU0FfSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfR2V0TXBlZ0xlbmd0aEZyb21TdHJlYW0odm9pZCogcENvbnRleHQpewotICAgIE00T1NBX1VJbnQzMiBsZW5ndGg9MDsKLSAgICBNNE9TQV9VSW50MzIgbnVtQnl0ZXM9MDsKLSAgICBNNE9TQV9VSW50MzIgYj0wOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wQ29udGV4dCksIDAsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogdGhlIGxlbmd0aCBpcyBlbmNvZGVkIGFzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuIFRoZSBoaWdoZXN0IGJpdCBpcyB1c2VkCi0gICAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbGVuZ3RoIGNvbnRpbnVlcyBvbiB0aGUgbmV4dCBieXRlLgotCi0gICAgVGhlIGxlbmd0aCBjYW4gYmU6IDB4ODAgMHg4MCAweDgwIDB4MjIKLSAgICBvZiBqdXN0ICAgICAgICAgICAgMHgyMiAoaGlnaGVzdCBiaXQgbm90IHNldCkKLSAgICAqLwotCi0gICAgZG8gewotICAgICAgICBiPVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHBDb250ZXh0LCA4KTsKLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBDb250ZXh0LCA4KTsKLSAgICAgICAgbGVuZ3RoPShsZW5ndGggPDwgNykgfCAoYiAmIDB4N2YpOwotICAgICAgICBudW1CeXRlcysrOwotICAgIH0gd2hpbGUgKChiICYgMHg4MCkgJiYgbnVtQnl0ZXMgPCA0KTsKLQotICAgIHJldHVybiBsZW5ndGg7Ci19Ci0jZW5kaWYgLyogVklERU9FRElUT1JfQklUU1RSRUFNX1BBUlNFUiAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgM2dwIHJlYWRlcgotICogQG5vdGUgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgcENvbnRleHQ6ICAgICAgIChPVVQpICAgcG9pbnRlciBvbiBhIHJlYWRlciBjb250ZXh0Ci0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgdmFsaWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gTlVMTDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0ICwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jcmVhdGUgYmVnaW4iKTsKLQotICAgIC8qIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uICovCi0gICAgU0FGRV9NQUxMT0MocEMsIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQsIDEsICJWaWRlb0VkaXRvcjNncFJlYWRlciIpOwotCi0gICAgbWVtc2V0KHBDLCBzaXplb2YoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCksIDApOwotCi0gICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1WaWRlb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLQotICAgIHBDLT5tQXVkaW9TZWVraW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1BdWRpb1NlZWtUaW1lID0gMDsKLQotICAgIHBDLT5tVmlkZW9TZWVraW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1WaWRlb1NlZWtUaW1lID0gMDsKLQotICAgIHBDLT5tTWF4RHVyYXRpb24gPSAwOwotCi0gICAgKnBDb250ZXh0PXBDOwotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY3JlYXRlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY3JlYXRlIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICBkZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgM2dwIHJlYWRlcgotKiBAbm90ZSBhZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgcENvbnRleHQgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveShNNE9TQV9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Rlc3Ryb3kgYmVnaW4iKTsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBTQUZFX0ZSRUUocEMtPm1BdWRpb0F1LmRhdGFBZGRyZXNzKTsKLSAgICBwQy0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIFNBRkVfRlJFRShwQy0+bVZpZGVvQXUuZGF0YUFkZHJlc3MpOwotICAgIHBDLT5tVmlkZW9BdS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgU0FGRV9GUkVFKHBDKTsKLSAgICBwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveSBubyBlcnJvciIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveSBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIG9wZW4gdGhlIHJlYWRlciBhbmQgaW5pdGlhbGl6ZXMgaXRzIGNyZWF0ZWQgaW5zdGFuY2UKLSogQG5vdGUgICAgIHRoaXMgZnVuY3Rpb24gb3BlbiB0aGUgbWVkaWEgZmlsZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgcEZpbGVEZXNjcmlwdG9yOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gcHJvcHJpZXRhcnkgZGF0YSBpZGVudGlmeWluZwotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZWRpYSB0byBvcGVuCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0qIEByZXR1cm4gICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lZGlhIGlzIERSTSBwcm90ZWN0ZWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBzdGFydCAiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbjogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEZpbGVEZXNjcmlwdG9yKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBzdGFydCAlcyIsCi0gICAgICAgIChjaGFyKilwRmlsZURlc2NyaXB0b3IpOwotICAgIC8vcEMtPm1EYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgoY2hhciopcEZpbGVEZXNjcmlwdG9yKTsKLSAgICBwQy0+bURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSAoKGNoYXIqKXBGaWxlRGVzY3JpcHRvcik7Ci0KLSAgICBpZiAocEMtPm1EYXRhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBDLT5tRXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShwQy0+bURhdGFTb3VyY2UsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7Ci0KLSAgICBpZiAocEMtPm1FeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBleHRyYWN0b3IgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGlzRFJNUHJvdGVjdGVkID0gMDsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHBDLT5tRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOwotICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5SXNEUk0sICZpc0RSTVByb3RlY3RlZCk7Ci0gICAgaWYgKGlzRFJNUHJvdGVjdGVkKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGVycm9yIC0gRFJNIFByb3RlY3RlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRTsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGNsb3NlIHRoZSByZWFkZXIKLSogQG5vdGUgICAgIGNsb3NlIHRoZSAzR1AgZmlsZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotKiBAcmV0dXJuICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9jbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0ICpwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEgKnBBdWRpb1NiclVzZXJEYXRhOwotICAgIE00X0FjY2Vzc1VuaXQgKnBBVTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jbG9zZSBiZWdpbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2U6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBpZiAocEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlIEF1ZGlvIik7Ci0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSkpIHsKLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJEYXRhID0gKE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEqKShcCi0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhKTsKLQotICAgICAgICAgICAgcEFVID0gKE00X0FjY2Vzc1VuaXQqKXBBdWRpb1NiclVzZXJEYXRhLT5tX3BGaXJzdEFVOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEFVKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQVUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQXVkaW9TYnJVc2VyRGF0YS0+bV9wQWFjRGVjb2RlclVzZXJDb25maWcpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBBdWRpb1NiclVzZXJEYXRhLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fcEFhY0RlY29kZXJVc2VyQ29uZmlnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocEF1ZGlvU2JyVXNlckRhdGEpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8gIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgZnJlZShwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8pOwotICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRmluYWxseSBkZXN0cm95IHRoZSBzdHJlYW0gaGFuZGxlciAqLwotICAgICAgICBmcmVlKHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIHBDLT5tQXVkaW9Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS5jbGVhcigpOwotICAgIH0KLSAgICBpZiAocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlIFZpZGVvICIpOwotCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvKSB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgbV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8pOwotICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8gIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgZnJlZShwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8pOwotICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGRlc3Ryb3kgdGhlIHN0cmVhbSBoYW5kbGVyICovCi0gICAgICAgIGZyZWUocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS0+c3RvcCgpOwotICAgICAgICBwQy0+bVZpZGVvU291cmNlLmNsZWFyKCk7Ci0gICAgfQotICAgIHBDLT5tRXh0cmFjdG9yLmNsZWFyKCk7Ci0gICAgcEMtPm1EYXRhU291cmNlLmNsZWFyKCk7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2UgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGdldCBhbiBvcHRpb24gZnJvbSB0aGUgM2dwIHJlYWRlcgotKiBAbm90ZSAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSoKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gZ2V0Ci0qIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgKE9VVCkgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB1c2VyKSB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0qCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKiBAcmV0dXJuICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgTTRFUlJfVklERU9fTk9UX0gyNjMgICAgTm8gdmlkZW8gc3RyZWFtIEgyNjMgaW4gZmlsZS4KLSogQHJldHVybiAgIE00RVJSX05PX1ZJREVPX1NUUkVBTV9SRVRSSUVWRURfWUVUCi0qICAgICAgICAgICBGdW5jdGlvbiAzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gYmVnaW4gJWQiLCBvcHRpb25JZCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb246IGludmFsaWQgcG9pbnRlciBvbiB2YWx1ZSIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIGR1cmF0aW9uICVkIixwQy0+bU1heER1cmF0aW9uKTsKLSAgICAgICAgICAgICooTTRPU0FfVGltZSopcFZhbHVlID0gcEMtPm1NYXhEdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uOiBNNFJFQURFUl9rT3B0aW9uSURfVmVyc2lvbiIpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0NvcHlyaWdodDoKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIj4+Pj4+Pj4gICBNNFJFQURFUl9rT3B0aW9uSURfQ29weXJpZ2h0Iik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQ3JlYXRpb25UaW1lOgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIE00UkVBREVSX2tPcHRpb25JRF9DcmVhdGlvblRpbWUiKTsKLSAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0KLSAgICAgICAgICAgIGlmIChwQy0+bU1heER1cmF0aW9uICE9IDApIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMlRtcCA9IChNNE9TQV9VSW50MzIpcEMtPm1NYXhEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAqcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKShwQy0+bUZpbGVTaXplICogODAwMC4wIC8gcEMtPm1NYXhEdXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIGJpdHJhdGUgJWxkIiwgKnBCaXRyYXRlKTsKLSAgICAgICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9IMjYzUHJvcGVydGllczoKLSAgICAgICAgewotICAgICAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gbm8gdmlkZW9TdHJlYW0gcmV0cmlldmVkIik7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9OT19WSURFT19TVFJFQU1fUkVUUklFVkVEX1lFVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKChNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjMgIT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX3N0cmVhbVR5cGUpIHx8IChwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPCA3KSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gRFNJIFNpemUgJWQiLAotICAgICAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9WSURFT19OT1RfSDI2MzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogTUFHSUNBTCBpbiB0aGUgZGVjb2RlciBjb25maSBIMjYzOiB0aGUgN3RoIGJ5dGUgaXMgdGhlIHByb2ZpbGUKLSAgICAgICAgICAgICAqIG51bWJlciwgNnRoIGJ5dGUgaXMgdGhlIGxldmVsIG51bWJlciAqLwotICAgICAgICAgICAgKChNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgKilwVmFsdWUpLT51aVByb2ZpbGUgPQotICAgICAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvWzZdOwotICAgICAgICAgICAgKChNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgKilwVmFsdWUpLT51aUxldmVsID0KLSAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mb1s1XTsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRSRUFERVJfM0dQX2tPcHRpb25JRF9cCi0gICAgICAgICAgICBIMjYzUHJvcGVydGllcyBlbmQiKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00UkVBREVSXzNHUF9rT3B0aW9uSURfUHVycGxlTGFic0RybToKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyT3B0aW9uIE00UkVBREVSXzNHUF9rT3B0aW9uSURfUHVycGxlTGFic0RybSIpOwotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mQXVkaW9BdToKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVPcHRpb24gTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mQXVkaW9BdSIpOwotICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfR2V0TnVtYmVyT2ZWaWRlb0F1OgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIDpHZXROdW1iZXJPZlZpZGVvQXUiKTsKLSAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0dldE1ldGFkYXRhOgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIE00UkVBREVSX2tPcHRpb25JRF9HZXRNZXRhZGF0YSIpOwotICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveDoKLSAgICAgICAgLyogdXNlZCBvbmx5IGZvciBTRU1DICovCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRSRUFERVJfa09wdGlvbklEXzNncEZ0eXBCb3giKTsKLSAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsgLy9jaGVjayB0aGlzCi0gICAgICAgIGJyZWFrOwotCi0jaWZkZWYgT1BUSU9OSURfR0VUX05FWFRfVklERU9fQ1RTCi0gICAgY2FzZSBNNFJFQURFUl8zR1Bfa09wdGlvbklEX2dldE5leHRWaWRlb0NUUzoKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbjogZ2V0TmV4dFZpZGVvQ1RTIik7Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRFUlJfQkFEX09QVElPTl9JRCIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIGVuZDogb3B0aW9uSUQ6IHgleCIsIG9wdGlvbklkKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIHNldCBhbiBvcHRpb24gb24gdGhlIDNncCByZWFkZXIKLSogQG5vdGUgTm8gb3B0aW9uIGNhbiBiZSBzZXQgeWV0LgotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBzZXQKLSogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAoSU4pICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHVzZXIpIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0qIEByZXR1cm4gICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9zZXRPcHRpb24gYmVnaW4gJWQiLG9wdGlvbklkKTsKLQotICAgIHN3aXRjaChvcHRpb25JZCkgewotICAgICAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0cjoKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9PcHRpb25JRD4oTTRSRUFERVJfM0dQX2tPcHRpb25JRF9BdWRpb09ubHkpOgotICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHN0YXRpY19jYXN0PE00T1NBX09wdGlvbklEPihNNFJFQURFUl8zR1Bfa09wdGlvbklEX1ZpZGVvT25seSk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8TTRPU0FfT3B0aW9uSUQ+KE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlKToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9PcHRpb25JRD4oTTRSRUFERVJfa09wdGlvbklEX01heE1ldGFkYXRhU2l6ZSk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9zZXRPcHRpb246IHJldHVybnMgTTRFUlJfQkFEX09QVElPTl9JRCIpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3NldE9wdGlvbiBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgZmlsbCB0aGUgYWNjZXNzIHVuaXQgc3RydWN0dXJlIHdpdGggaW5pdGlhbGl6YXRpb24gdmFsdWVzCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICAgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8gd2hpY2gKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWNjZXNzIHVuaXQgd2lsbCBiZSBhc3NvY2lhdGVkCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdDogICAgKElOL09VVCkgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQgKGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBjYWxsZXIpIHRvIGluaXRpYWxpemUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3QoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjIGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjdCBiZWdpbiIpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwQWNjZXNzVW5pdCBzdHJ1Y3R1cmUgKi8KLSAgICBwQWNjZXNzVW5pdC0+bV9zaXplICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fRFRTICAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzICA9IE00T1NBX05VTEw7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fbWF4c2l6ZSAgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cmVhbUlEICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cnVjdFNpemUgICA9IHNpemVvZihNNF9BY2Nlc3NVbml0KTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3QgZW5kIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotKiBAbm90ZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAoSU4pICAgdGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0qIEBwYXJhbSAgICBwVGltZSAgICAgICAgICAgKEkvTylJTiAgdGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQgdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNE9TQV9JbnQzMiogcFRpbWUpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBNNE9TQV9UaW1lIHRpbWU2NDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXA6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXA6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIGJlZ2luIik7Ci0KLSAgICBpZiAoKnBUaW1lID09IChwU3RyZWFtSGFuZGxlci0+bV9kdXJhdGlvbikpIHsKLSAgICAgICAgKnBUaW1lIC09IDE7Ci0gICAgfQotICAgIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIHRpbWUgdXMgJWxkICIsIHRpbWU2NCk7Ci0KLSAgICBpZiAoKHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyICE9IE00T1NBX05VTEwpICYmCi0gICAgICAgICAgICAocFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQgPT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpKQotICAgICAgICAgICAgewotICAgICAgICBwQXUgPSAmcEMtPm1BdWRpb0F1OwotICAgICAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICAgICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0KLSAgICAgICAgdGltZTY0ID0gdGltZTY0ICogMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pY3JvIHNlYyAqLwotICAgICAgICBwQy0+bUF1ZGlvU2Vla2luZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBDLT5tQXVkaW9TZWVrVGltZSA9IHRpbWU2NDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgQVVESU8gdGltZSB1cyAlbGQgIiwgdGltZTY0KTsKLSAgICB9IGVsc2UgaWYgKChwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciAhPSBNNE9TQV9OVUxMKSAmJgotICAgICAgICAgICAgKHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkID09IHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tVmlkZW9BdTsKLSAgICAgICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgICAgIHRpbWU2NCA9IHRpbWU2NCAqIDEwMDA7IC8qIENvbnZlcnQgdGhlIHRpbWUgaW50byBtaWNybyBzZWMgKi8KLSAgICAgICAgcEMtPm1WaWRlb1NlZWtpbmcgPSBNNE9TQV9UUlVFOwotICAgICAgICBwQy0+bVZpZGVvU2Vla1RpbWUgPSB0aW1lNjQ7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIFZJREVPIHRpbWUgdXMgJWxkICIsIHRpbWU2NCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgdGltZTY0ID0gdGltZTY0IC8gMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pbGxpIHNlYyAqLwotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIHRpbWUgbXMgYmVmb3JlIHNlZWtzZXQgJWxkICIsIHRpbWU2NCk7Ci0KLSAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpdGltZTY0OwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgZW5kIik7Ci0gICAgZXJyID0gTTROT19FUlJPUjsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgcmVzZXQgdGhlIHN0cmVhbSwgdGhhdCBpcyBzZWVrIGl0IHRvIGJlZ2lubmluZyBhbmQgbWFrZSBpdCByZWFkeQotKiBAbm90ZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgKElOKSAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcikgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiBwQXU7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQgPSAwOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0IGJlZ2luIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bUF1ZGlvQXU7Ci0gICAgfSBlbHNlIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tVmlkZW9BdTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQgcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9yZXNldCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgR2V0cyBhbiBhY2Nlc3MgdW5pdCAoQVUpIGZyb20gdGhlIHN0cmVhbSBoYW5kbGVyIHNvdXJjZS4KLSogQG5vdGUgICBBbiBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBkZWNvZGVyCi0qCi0qIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAoSU4pIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgIChJTykgUG9pbnRlciB0byBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0qIEByZXR1cm5zICBNNEVSUl9BTExPQyAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgIE00V0FSX05PX01PUkVfQVUgICAgIHRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDPShWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBpbnQ2NF90IHRlbXBUaW1lNjQgPSAwOwotICAgIE1lZGlhQnVmZmVyICptTWVkaWFCdWZmZXIgPSBOVUxMOwotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgIE00T1NBX0Jvb2wgZmxhZyA9IE00T1NBX0ZBTFNFOwotICAgIHN0YXR1c190IGVycm9yOwotICAgIGludDMyX3QgaTMyVG1wID0gMDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoIHBDPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgYmVnaW4iKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBhdWRpbyBzdHJlYW0iKTsKLSAgICAgICAgcEF1ID0gJnBDLT5tQXVkaW9BdTsKLSAgICAgICAgaWYgKHBDLT5tQXVkaW9TZWVraW5nID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgYXVkaW8gc2VlayB0aW1lOiAlbGQiLAotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TZWVrVGltZSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhwQy0+bUF1ZGlvU2Vla1RpbWUpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwKLSAgICAgICAgICAgICAgICAoaW50NjRfdCopJnRlbXBUaW1lNjQpOwotICAgICAgICAgICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NlZWtpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGZsYWcgPSBNNE9TQV9UUlVFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBhdWRpbyBubyBzZWVrOiIpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICBpZiAobU1lZGlhQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsCi0gICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KikmdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IHZpZGVvIHN0ZXJhbSAiKTsKLSAgICAgICAgcEF1ID0gJnBDLT5tVmlkZW9BdTsKLSAgICAgICAgaWYocEMtPm1WaWRlb1NlZWtpbmcgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgZmxhZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IHNlZWs6ICVsZCIscEMtPm1WaWRlb1NlZWtUaW1lKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHBDLT5tVmlkZW9TZWVrVGltZSwKLSAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IGZyZWUgdGhlIE1lZGlhQnVmZmVyIik7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnJvciA9IHBDLT5tVmlkZW9Tb3VyY2UtPnJlYWQoJm1NZWRpYUJ1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWRTNncFJlYWRlcl9nZXROZXh0QXUgTWVkaWFCdWZmZXIgJXggLCBlcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlciwgZXJyb3IpOwotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgJmkzMlRtcCkgJiYgaTMyVG1wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlNZTkMgRlJBTUUgRk9VTkQtLSVkIiwgaTMyVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBdS0+YXR0cmlidXRlID0gQVVfUkFQOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcEF1LT5hdHRyaWJ1dGUgPSBBVV9QX0ZyYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KikmdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgICAgIH0gd2hpbGUodGVtcFRpbWU2NCA8IHBDLT5tVmlkZW9TZWVrVGltZSk7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJWRTNncFJlYWRlcl9nZXROZXh0QXU6IHZpZGVvICB0aW1lIHdpdGggc2VlayAgPSAlbGxkOiIsCi0gICAgICAgICAgICAgICAgdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU2Vla2luZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSB2aWRlbyBubyBzZWVrOiIpOwotICAgICAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIGlmKG1NZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICZpMzJUbXApICYmIGkzMlRtcCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiU1lOQyBGUkFNRSBGT1VORC0tJWQiLCBpMzJUbXApOwotICAgICAgICAgICAgICAgICAgICBwQXUtPmF0dHJpYnV0ZSA9IEFVX1JBUDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBBdS0+YXR0cmlidXRlID0gQVVfUF9GcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLAotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCopJnRlbXBUaW1lNjQpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWRTNncFJlYWRlcl9nZXROZXh0QXU6IHZpZGVvIG5vIHNlZWsgdGltZSA9ICVsbGQ6IiwKLSAgICAgICAgICAgICAgICAgICAgdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZFM2dwUmVhZGVyX2dldE5leHRBdTp2aWRlbyBubyBzZWVrIHRpbWUgYnVmZmVyIGlzIE5VTEwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKG1NZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmKCAocEF1LT5kYXRhQWRkcmVzcyA9PSBOVUxMKSB8fCAgKHBBdS0+c2l6ZSA8IFwKLSAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpKSB7Ci0gICAgICAgICAgICBpZihwQXUtPmRhdGFBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKChNNE9TQV9JbnQzMiopcEF1LT5kYXRhQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiQnVmZmVyIGxlbmdodCA9ICVkICwlZCIsKG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgK1wKLSAgICAgICAgICAgICAgICAzKSAmIH4weDMsKG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpKTsKLQotICAgICAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IChNNE9TQV9JbnQzMiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIChtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpICsgMykgJiB+MHgzLE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyIgKTsKLSAgICAgICAgICAgIGlmKHBBdS0+ZGF0YUFkZHJlc3MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgbWFsbG9jIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQXUtPnNpemUgPSBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBBdS0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKSgoY29uc3QgY2hhciAqKW1NZWRpYUJ1ZmZlci0+ZGF0YSgpICsgbU1lZGlhQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICAgICBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICBpZiggKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgICYmCi0gICAgICAgICAgICAocFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSA9PSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjKSApIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplID0gbU1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpsYnVmZmVyOwotCi0gICAgICAgICAgICBsYnVmZmVyID0gKE00T1NBX1VJbnQ4ICopIHBBdS0+ZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICBBTE9HVigicEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3Mgc2l6ZSA9ICV4IixzaXplKTsKLQotICAgICAgICAgICAgbGJ1ZmZlclswXSA9IChzaXplID4+IDI0KSAmIDB4RkY7Ci0gICAgICAgICAgICBsYnVmZmVyWzFdID0gKHNpemUgPj4gMTYpICYgMHhGRjsKLSAgICAgICAgICAgIGxidWZmZXJbMl0gPSAoc2l6ZSA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICBsYnVmZmVyWzNdID0gKHNpemUpICYgMHhGRjsKLSAgICAgICAgfQotCi0gICAgICAgIHBBdS0+Q1RTID0gdGVtcFRpbWU2NDsKLQotICAgICAgICBwQXUtPkNUUyA9IHBBdS0+Q1RTIC8gMTAwMDsgLy9jb252ZXJ0aW5nIHRoZSBtaWNyb3NlYyB0byBtaWxsaXNlYwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IENUUyA9ICVsZCIscEF1LT5DVFMpOwotCi0gICAgICAgIHBBdS0+RFRTICA9IHBBdS0+Q1RTOwotICAgICAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICBwQXUtPmF0dHJpYnV0ZSA9IE00U1lTX2tGcmFnQXR0ck9rOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOwotCi0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzID0gKE00T1NBX0ludDgqKSBwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9tYXhzaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9DVFMgPSBwQXUtPkNUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fRFRTID0gcEF1LT5EVFM7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSA9IHBBdS0+YXR0cmlidXRlOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTogTTRXQVJfTk9fTU9SRV9BVSAoRU9TKSByZWFjaGVkIik7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgPSAwOwotICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLSAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0KLSAgICBwQXUtPm5iRnJhZyA9IDA7Ci0gICAgbU1lZGlhQnVmZmVyID0gTlVMTDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IGVuZCAiKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBTcGxpdCB0aGUgQVZDIERTSSBpbiBpdHMgZGlmZmVyZW50IGNvbXBvbmVudHMgYW5kIHdyaXRlIGl0IGluCi0gKiAgICAgICAgICBPTkUgbWVtb3J5IGJ1ZmZlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyOiAgICAgICAgIChJTi9PVVQpIFRoZSBNUEVHNC1BVkMgc3RyZWFtCi0gKiBAcGFyYW0gICBwRGVjb2RlckNvbmZpZ0xvY2FsOiAgICAoSU4pIFRoZSBEU0kgYnVmZmVyCi0gKiBAcGFyYW0gICBkZWNvZGVyQ29uZmlnU2l6ZUxvY2FsOiAoSU4pIFRoZSBEU0kgYnVmZmVyIHNpemUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBFUlJfRklMRV9TWU5UQVhfRVJST1IgICBwRGVjb2RlckNvbmZpZ0xvY2FsIGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9BbmFseXNlQXZjRHNpKAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRPU0FfSW50MzIqIHBEZWNvZGVyQ29uZmlnTG9jYWwsCi0gICAgICAgIE00T1NBX0ludDMyIGRlY29kZXJDb25maWdTaXplTG9jYWwpIHsKLSAgICBzdHJ1Y3QgX2F2Y1NwZWNpZmljSW5mbyAqcEF2Y1NwZWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MzIgdWlTcGVjSW5mb1NpemU7Ci0gICAgTTRPU0FfQ29udGV4dCBwQml0UGFyc2VyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfTWVtQWRkcjggcFBvczsKLQotICAgIC8qKgotICAgICAqIEZpcnN0IHBhcnNpbmcgdG8gZ2V0IHRoZSB0b3RhbCBhbGxvY2F0aW9uIHNpemUgKHdlIG11c3Qgbm90IGRvCi0gICAgICogbXVsdGlwbGUgbWFsbG9jLCBidXQgb25seSBvbmUgaW5zdGVhZCkgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX0ludDMyIHZhbDsKLSAgICAgICAgTTRPU0FfVUludDMyIGksajsKLSAgICAgICAgTTRPU0FfVUludDggbmFsVW5pdExlbmd0aDsKLSAgICAgICAgTTRPU0FfVUludDggIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOwotICAgICAgICBNNE9TQV9VSW50MzIgdWlUb3RhbFNpemVPZlNQUyA9IDA7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICBudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzOwotICAgICAgICBNNE9TQV9VSW50MzIgdWlUb3RhbFNpemVPZlBQUyA9IDA7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1aVNpemU7Ci0gICAgICAgIHN0cnVjdCBfYXZjU3BlY2lmaWNJbmZvIGF2Y1NwSWY7Ci0KLSAgICAgICAgYXZjU3BJZi5tX25hbFVuaXRMZW5ndGggPSAwOwotCi0gICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBEZWNvZGVyQ29uZmlnTG9jYWwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9SRUFERVIzR1BfREVDT0RFUl9DT05GSUdfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9NUEVHNEJpdFN0cmVhbVBhcnNlckluaXQoJnBCaXRQYXJzZXJDb250ZXh0LAotICAgICAgICAgICAgcERlY29kZXJDb25maWdMb2NhbCwgZGVjb2RlckNvbmZpZ1NpemVMb2NhbCk7Ci0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEJpdFBhcnNlckNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gY29uZmlndXJhdGlvbiB2ZXJzaW9uICovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gYXZjIHByb2ZpbGUgaW5kaWNhdGlvbiovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gcHJvZmlsZSBjb21wYXRpYmlsaXR5ICovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gYXZjIGxldmVsIGluZGljYXRpb24qLwotICAgICAgICB2YWw9VmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAvKiA2IGJpdHMgcmVzZXJ2ZWQgMTExMTExYiAyIGJpdHMgbGVuZ3RoIFNpemUgbWludXMgb25lKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1fbmFsVW5pdExlbmd0aCAqLwotCi0gICAgICAgIG5hbFVuaXRMZW5ndGggPSAoTTRPU0FfVUludDgpKCh2YWwgJiAweDAzKSArIDEpOy8qMGIxMTExMTEwMCovCi0gICAgICAgIGlmIChuYWxVbml0TGVuZ3RoID4gNCkgewotICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ2xlYW5VcChwQml0UGFyc2VyQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNQUyB0YWJsZSAqLwotICAgICAgICAgICAgdmFsPVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHBCaXRQYXJzZXJDb250ZXh0LAotICAgICAgICAgICAgOCk7LyogMyBiaXRzLXJlc2VydmVkIDExMWItNSBiaXRzIG51bWJlciBvZiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Ki8KLSAgICAgICAgICAgIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzID0gdmFsICYgMHgxRjsKLSAgICAgICAgICAgIC8qMUYgaW5zdGVhZCBvZiBFMCovIC8qMGIxMTEwMDAwMCovIC8qTnVtYmVyIG9mIHNlcSBwYXJhbWV0ZXIgc2V0cyovCi0gICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBudW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogR2V0IHRoZSBzaXplIG9mIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgIHVpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICAgICAgdWlUb3RhbFNpemVPZlNQUyArPSB1aVNpemU7Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgMTYpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqUmVhZCB0aGUgZWxlbWVudChkb250IGtlZXAgaXQsIHdlIG9ubHkgd2FudCBzaXplIHJpZ2h0IG5vdykgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajx1aVNpemU7IGorKykgewotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNQUyB0YWJsZSAqLwotICAgICAgICAgICAgbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0cz0oTTRPU0FfVUludDgpXAotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHBCaXRQYXJzZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICA4KTsKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaSA8IG51bU9mUGljdHVyZVBhcmFtZXRlclNldHM7IGkrKykgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGlzIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICB1aVNpemUgPSAoTTRPU0FfVUludDMyKQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDE2KTsKLSAgICAgICAgICAgICAgICB1aVRvdGFsU2l6ZU9mUFBTICs9IHVpU2l6ZTsKLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICpSZWFkIHRoZSBlbGVtZW50KGRvbnQga2VlcCBpdCx3ZSBvbmx5IHdhbnQgc2l6ZSByaWdodCBub3cpKi8KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajx1aVNpemU7IGorKykgewotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGZ1bGwgYnVmZmVyICovCi0gICAgICAgICAgICB1aVNwZWNJbmZvU2l6ZSA9IHNpemVvZihzdHJ1Y3QgX2F2Y1NwZWNpZmljSW5mbykgKwotICAgICAgICAgICAgICAgICAgICAgbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHMgKiBzaXplb2Yoc3RydWN0IF9wYXJhbWV0ZXJTZXQpCi0gICAgICAgICAgICAgICAgICAgICArIC8qKjwgc2l6ZSBvZiB0aGUgdGFibGUgb2YgU1BTIGVsZW1lbnRzICovCi0gICAgICAgICAgICAgICAgICAgICBudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzICAqIHNpemVvZihzdHJ1Y3QgX3BhcmFtZXRlclNldCkKLSAgICAgICAgICAgICAgICAgICAgICsgLyoqPCBzaXplIG9mIHRoZSB0YWJsZSBvZiBQUFMgZWxlbWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgIHVpVG90YWxTaXplT2ZTUFMgKwotICAgICAgICAgICAgICAgICAgICAgdWlUb3RhbFNpemVPZlBQUzsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQWxsb2NhdGUgdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvID0oc3RydWN0IF9hdmNTcGVjaWZpY0luZm8qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh1aVNwZWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiTVBFRy00IEFWQyBEZWNvZGVyU3BlY2lmaWMiKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBBdmNTcGVjSW5mbykgewotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTZXQgdGhlIHBvaW50ZXJzIHRvIHRoZSBjb3JyZWN0IHBhcnQgb2YgdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX25hbFVuaXRMZW5ndGggPSBuYWxVbml0TGVuZ3RoOwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX251bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzID0KLSAgICAgICAgICAgICAgICBudW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0czsKLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9udW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzICA9Ci0gICAgICAgICAgICAgICAgbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0czsKLQotICAgICAgICAgICAgLyogV2UgcGxhY2UgdGhlIFNQUyBwYXJhbSBzZXRzIHRhYmxlIGFmdGVyIG1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQgKi8KLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXQ9IChzdHJ1Y3QgX3BhcmFtZXRlclNldCopKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkoJnBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldCkgKwotICAgICAgICAgICAgICAgIHNpemVvZihwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQpKTsKLSAgICAgICAgICAgIC8qV2UgcGxhY2UgdGhlIFBQUyBwYXJhbSBzZXRzIHRhYmxlIGFmdGVyIHRoZSBTUFMgcGFyYW0gc2V0cyB0YWJsZSovCi0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQgPSAoc3RydWN0IF9wYXJhbWV0ZXJTZXQqKSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXQpICsKLSAgICAgICAgICAgICAgICAobnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHMgKiBzaXplb2Yoc3RydWN0IF9wYXJhbWV0ZXJTZXQpKSk7Ci0gICAgICAgICAgICAvKio8IFRoZSBkYXRhIHdpbGwgYmUgcGxhY2VkIGFmdGVyIHRoZSBQUFMgcGFyYW0gc2V0cyB0YWJsZSAqLwotICAgICAgICAgICAgcFBvcyA9IChNNE9TQV9NZW1BZGRyOClwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQgKwotICAgICAgICAgICAgICAgIChudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzICogc2l6ZW9mKHN0cnVjdCBfcGFyYW1ldGVyU2V0KSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogcmVzZXQgdGhlIGJpdCBwYXJzZXIgKi8KLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2Vjb25kIHBhcnNpbmcgdG8gY29weSB0aGUgZGF0YSAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBBdmNTcGVjSW5mbykgewotICAgICAgICBNNE9TQV9JbnQzMiBpLGo7Ci0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfTVBFRzRCaXRTdHJlYW1QYXJzZXJJbml0KCZwQml0UGFyc2VyQ29udGV4dCwKLSAgICAgICAgICAgIHBEZWNvZGVyQ29uZmlnTG9jYWwsIGRlY29kZXJDb25maWdTaXplTG9jYWwpOwotCi0gICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBCaXRQYXJzZXJDb250ZXh0KSB7Ci0gICAgICAgICAgICBmcmVlKHBBdmNTcGVjSW5mbyk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIGNvbmZpZ3VyYXRpb24gdmVyc2lvbiAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIGF2YyBwcm9maWxlIGluZGljYXRpb24qLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIHByb2ZpbGUgY29tcGF0aWJpbGl0eSAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIGF2YyBsZXZlbCBpbmRpY2F0aW9uKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgIC8qIG1fbmFsVW5pdExlbmd0aCAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAvKiAzIGJpdHMgLS0gcmVzZXJ2ZWQgMTExYiAtLSA1IGJpdHMgbnVtYmVyIG9mIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQqLwotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgcEF2Y1NwZWNJbmZvLT5tX251bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOyBpKyspIHsKLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9sZW5ndGggPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMoCi0gICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDE2KTsKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwxNik7Ci0KLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwUG9zOyAgLyoqPCBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgIHBQb3MgKz0gcEF2Y1NwZWNJbmZvLT5tX3BTZXF1ZW5jZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aDsKLSAgICAgICAgICAgICAgICAvKio8IGluY3JlbWVudCB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgZm9yIChqPTA7IGo8cEF2Y1NwZWNJbmZvLT5tX3BTZXF1ZW5jZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aDtqKyspewotICAgICAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdFtqXT0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogbnVtYmVyIG9mIHDDrmN0dXJlIHBhcmFtZXRlciBzZXQqLwotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgcEF2Y1NwZWNJbmZvLT5tX251bU9mUGljdHVyZVBhcmFtZXRlclNldHM7IGkrKykgewotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0W2ldLm1fbGVuZ3RoID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKAotICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsMTYpOwotCi0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwUG9zOyAgIC8qKjwgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICBwUG9zICs9IHBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aDsKLSAgICAgICAgICAgICAgICAvKio8IGluY3JlbWVudCB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgZm9yIChqPTA7IGo8cEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0W2ldLm1fbGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdFtqXSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHVpU3BlY0luZm9TaXplOwotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IChNNE9TQV9VSW50OCopcEF2Y1NwZWNJbmZvOwotICAgIH0KLSAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgID0gIGRlY29kZXJDb25maWdTaXplTG9jYWw7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvICA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBkZWNvZGVyQ29uZmlnU2l6ZUxvY2FsLCBNNFJFQURFUl8zR1AsCi0gICAgICAgIChNNE9TQV9DaGFyKikiTVBFRy00IEFWQyBEZWNvZGVyU3BlY2lmaWMiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIG1lbWNweSgodm9pZCAqICkgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAodm9pZCAqIClwRGVjb2RlckNvbmZpZ0xvY2FsLAotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotY2xlYW51cDoKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDbGVhblVwKHBCaXRQYXJzZXJDb250ZXh0KTsKLSAgICByZXR1cm4gTTRFUlJfUkVBREVSM0dQX0RFQ09ERVJfQ09ORklHX0VSUk9SOwotfQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgM2dwIGZpbGUKLSogQG5vdGUKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgcE1lZGlhRmFtaWx5OiBPVVQpICAgcG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSB0aGF0IHdpbGwgYmUgZmlsbGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBtZWRpYSBmYW1pbHkgb2YgdGhlIGZvdW5kIHN0cmVhbQotKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6KE9VVCkgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmaWxsZWQgd2l0aCB0aGUgZm91bmQgc3RyZWFtIGRlc2NyaXB0aW9uCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKiBAcmV0dXJuICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICoqcFN0cmVhbUhhbmRsZXIpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQz0oVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uIHN0cmVhbURlc2M7Ci0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00X1ZpZGVvU3RyZWFtSGFuZGxlciogcFZpZGVvU3RyZWFtSGFuZGxlcjsKLSAgICBNNE9TQV9JbnQ4ICpEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9JbnQzMiBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9MCwgbWF4QVVTaXplID0gMDsKLQotICAgIE00X1N0cmVhbVR5cGUgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVVua25vd247Ci0gICAgTTRPU0FfVUludDggdGVtcCwgaSwgdHJhY2tDb3VudDsKLSAgICBNNE9TQV9Cb29sIGhhdmVBdWRpbyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgaGF2ZVZpZGVvID0gTTRPU0FfRkFMU0U7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgID0gTlVMTDsKLSAgICBpbnQ2NF90IER1cmF0aW9uID0gMDsKLSAgICBNNE9TQV9VSW50OCogRGVjb2RlclNwZWNpZmljID0gTTRPU0FfTlVMTCA7Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpkYXRhOwotICAgIHNpemVfdCBzaXplOwotICAgIGNvbnN0IHZvaWQgKmNvZGVjX3NwZWNpZmljX2RhdGE7Ci0gICAgc2l6ZV90IGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZTsKLSAgICBNNE9TQV9JbnQzMiAgcHRlbXBUaW1lOwotICAgIE00T1NBX0ludDMyICBhdmdGUFM9MDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBiZWdpbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhRmFtaWx5ICAgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImdldE5leHRTdHJlYW1IYW5kbGVyOiBpbnZhbGlkIHBvaW50ZXIgdG8gTWVkaWFGYW1pbHkiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJnZXROZXh0U3RyZWFtSGFuZGxlcjogaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIHRyYWNrQ291bnQgPSBwQy0+bUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKLSAgICB0ZW1wID0gcEMtPm1DdXJyVHJhY2s7Ci0KLSAgICBpZih0ZW1wID49IHRyYWNrQ291bnQpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIGVycm9yID0gJWQiLAotICAgICAgICAgICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0pOwotICAgICAgICByZXR1cm4gKE00V0FSX05PX01PUkVfU1RSRUFNKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBtZXRhID0gcEMtPm1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEodGVtcCk7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgICAgICBpZiAoIWhhdmVWaWRlbyAmJiAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU291cmNlID0gcEMtPm1FeHRyYWN0b3ItPmdldFRyYWNrKHRlbXApOwotICAgICAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS0+c3RhcnQoKTsKLQotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseVZpZGVvOwotICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBnZXRUcmFjayBjYWxsZWQiKTsKLSAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlckdldE5leHRTdHJlYW1IYW5kbGVyIHN0cmVhbVR5cGVOT05FIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IHN0cmVhbSB0eXBlOiAlZCAiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICBpZihzdHJlYW1UeXBlICE9IE00REFfU3RyZWFtVHlwZVVua25vd24pIHsKLSAgICAgICAgICAgICAgICBwQy0+bVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgICAgICAgICAgICAgIHBDLT5tU3RyZWFtSWQgPSBwQy0+bUN1cnJUcmFjazsKLQotICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXIgPSAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MKLSAgICAgICAgICAgICAgICAgICAgKHNpemVvZihNNF9WaWRlb1N0cmVhbUhhbmRsZXIpLCBNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRfVmlkZW9TdHJlYW1IYW5kbGVyIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcFZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXItPm1fc3RydWN0U2l6ZT1zaXplb2YoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKTsKLQotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmKHBWaWRlb1N0cmVhbUhhbmRsZXItPm1fdmlkZW9XaWR0aCkpOwotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCopJihwVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKSAgPSAoTTRfU3RyZWFtSGFuZGxlciopKHBWaWRlb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sIChpbnQ2NF90KikmKER1cmF0aW9uKSk7Ci0gICAgICAgICAgICAgICAgKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2R1cmF0aW9uKSA9IChpbnQzMl90KSgoRHVyYXRpb24pLzEwMDApOyAvLyBjb252ZXJzaW9uIHRvIG1TCi0gICAgICAgICAgICAgICAgcEMtPm1NYXhEdXJhdGlvbiA9ICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kdXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5tTWF4RHVyYXRpb24gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgdG9vIHNob3J0OiAlbGxkIFVzIiwgRHVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFZpZGVvU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBtX2R1cmF0aW9uICVkIiwKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24pOwotCi0gICAgICAgICAgICAgICAgb2ZmNjRfdCBmaWxlU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgcEMtPm1EYXRhU291cmNlLT5nZXRTaXplKCZmaWxlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgcEMtPm1GaWxlU2l6ZSAgPSBmaWxlU2l6ZTsKLQotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBtX2ZpbGVTaXplICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1GaWxlU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgKGludDMyX3QqKSYobWF4QVVTaXplKSk7Ci0gICAgICAgICAgICAgICAgaWYobWF4QVVTaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4QVVTaXplID0gNzAwMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX21heEFVU2l6ZSA9IG1heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICBBTE9HVigiPDw8PDw8PDw8PCAgIHZpZGVvOiBtTWF4QVVTaXplIGZyb20gTVA0IGV4dHJhY3RvcjogJWQiLAotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9tYXhBVVNpemUpOwotCi0gICAgICAgICAgICAgICAgKChNNF9TdHJlYW1IYW5kbGVyKilwVmlkZW9TdHJlYW1IYW5kbGVyKS0+bV9hdmVyYWdlQml0UmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPm1GaWxlU2l6ZSAqIDgwMDApL3BDLT5tTWF4RHVyYXRpb247Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIG1fYXZlcmFnZUJpdHJhdGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAoKE00X1N0cmVhbUhhbmRsZXIqKXBWaWRlb1N0cmVhbUhhbmRsZXIpLT5tX2F2ZXJhZ2VCaXRSYXRlKTsKLQotCi0gICAgICAgICAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmKGF2Z0ZQUykpOwotICAgICAgICAgICAgICAgIEFMT0dWKCI8PDw8PDw8PDw8ICAgdmlkZW86IEF2ZXJhZ2UgRlBTIGZyb20gTVA0IGV4dHJhY3RvcjogJWQiLAotICAgICAgICAgICAgICAgICAgICBhdmdGUFMpOwotCi0gICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlID0oTTRPU0FfRmxvYXQpIGF2Z0ZQUzsKLSAgICAgICAgICAgICAgICBBTE9HVigiPDw8PDw8PDw8PCAgIHZpZGVvOiBBdmVyYWdlIEZQUyBmcm9tIE1QNCBleHRyYWN0b3IgaW4gRkxPQVQ6ICVmIiwKLSAgICAgICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlKTsKLQotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdmlkZW8gcm90YXRpb24gZGVncmVlCi0gICAgICAgICAgICAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZTsKLSAgICAgICAgICAgICAgICBpZighbWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlKSkgewotICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkRlZ3JlZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXItPnZpZGVvUm90YXRpb25EZWdyZWVzID0gcm90YXRpb25EZWdyZWU7Ci0KLSAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKikocFZpZGVvU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIERTSSBpbmZvICovCi0gICAgICAgICAgICAgICAgaWYoTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzID09IHN0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlEMjYzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUCwoTTRPU0FfQ2hhciopIkgyNjMgRFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gRGVjb2RlclNwZWNpZmljKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVkVfZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IEgyNjMgZHNpIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YyA9PSBzdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWNJbmZvID0gKE00T1NBX0ludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mb1NpemUsIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJIMjY0IERlY29kZXJTcGVjaWZpYyIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWNJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncF9nZXROZXh0U3RyZWFtIGlzIE5VTEwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilkYXRhLCBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJEU0kgU2l6ZSAlZCIsIGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX0FuYWx5c2VBdmNEc2koKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIqKURlY29kZXJTcGVjaWZpY0luZm8sIGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImRlY3NpemUgJWQsIGgyNjRkZWNzaXplICVkOiAlZCIsICgqcFN0cmVhbUhhbmRsZXIpLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLCAoKnBTdHJlYW1IYW5kbGVyKS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgbV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgIT0gRGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNCA9PSBzdHJlYW1UeXBlKSApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRVNEUyBlc2RzKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEVTRFNJbmZvID0gKE00T1NBX1VJbnQ4KilcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIk00ViBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoKnBTdHJlYW1IYW5kbGVyKS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEVTRFNJbmZvLCAodm9pZCAqKWRhdGEsIHNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKCZjb2RlY19zcGVjaWZpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZFIE1QNCBkc2lzaXplOiAlZCwgJXgiLCBjb2RlY19zcGVjaWZpY19kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIiBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gRGVjb2RlclNwZWNpZmljKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW0gTk8gdmlkZW8gc3RyZWFtIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbSBOTyB2aWRlbyBzdHJlYW0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmICghaGF2ZUF1ZGlvICYmICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtIGF1ZGlvIGdldFRyYWNrIGNhbGxlZCIpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NvdXJjZSA9IHBDLT5tRXh0cmFjdG9yLT5nZXRUcmFjayhwQy0+bUN1cnJUcmFjayk7Ci0gICAgICAgICAgICBwQy0+bUF1ZGlvU291cmNlLT5zdGFydCgpOwotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotCi0gICAgICAgICAgICBpZighc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDsKLSAgICAgICAgICAgIH0gZWxzZSBpZighc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yV2lkZUJhbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWEgc3RyZWFtdHlwZSBVbmtub3duICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoc3RyZWFtVHlwZSAhPSBNNERBX1N0cmVhbVR5cGVVbmtub3duKSB7Ci0gICAgICAgICAgICAgICAgcEMtPm1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgICAgICAgICBwQy0+bVN0cmVhbUlkID0gcEMtPm1DdXJyVHJhY2s7Ci0KLSAgICAgICAgICAgICAgICBBTE9HVigiVkUgc3RyZWFtdHlwZSAlZCAsaWQgJWQiLCAgc3RyZWFtVHlwZSwgcEMtPm1DdXJyVHJhY2spOwotCi0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlciA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwotICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlciksIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJ1Y3RTaXplPXNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemUgICA9IDA7Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzICAgICAgID0gMDsKLSAgICAgICAgICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5PSAwOwotICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoICA9IDA7Ci0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKSA9IChNNF9TdHJlYW1IYW5kbGVyKikocEF1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPQotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2F2ZXJhZ2VCaXRSYXRlID0gMDsKLSAgICAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyPShNNF9TdHJlYW1IYW5kbGVyKilwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fRVNEU0luZm9TaXplID0gMDsKLQotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAoaW50MzJfdCopJihtYXhBVVNpemUpKTsKLSAgICAgICAgICAgICAgICBpZihtYXhBVVNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtYXhBVVNpemUgPSA3MDAwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fbWF4QVVTaXplID0gbWF4QVVTaXplOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWRSBBdWRpbyBtTWF4QVVTaXplIGZyb20gTVA0IGV4dHJhY3RvcjogJWQiLCBtYXhBVVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZCA9PSBzdHJlYW1UeXBlKSB8fAotICAgICAgICAgICAgICAgIChNNERBX1N0cmVhbVR5cGVBdWRpb0FtcldpZGVCYW5kID09IHN0cmVhbVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZyZXFJbmRleCA9IDA7IC8qKjwgQU1SIE5CICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG1vZGVTZXQ7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBwQml0UGFyc2VyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICBpZihNNERBX1N0cmVhbVR5cGVBdWRpb0FtcldpZGVCYW5kID09IHN0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlcUluZGV4ID0gMTsgLyoqPCBBTVIgV0IgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICAgICAgICAgIGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oJmNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiQU1SIERlY29kZXJTcGVjaWZpYyIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKURlY29kZXJTcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9VQ2hhciBBbXJEc2lbXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB7J1AnLCdIJywnTCcsJ1AnLDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDEsfTsKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSA5OwotICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIlBITFAgRGVjb2RlclNwZWNpZmljIiApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihmcmVxSW5kZXggPT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbXJEc2lbOF0gPSAweDAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQW1yRHNpWzhdID0gMHgwMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGk8IDk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljW2ldID0gQW1yRHNpW2ldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9hdmVyYWdlQml0UmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0FtckJpdFJhdGVbZnJlcUluZGV4XVs3XTsKLSAgICAgICAgICAgIH0gZWxzZSBpZigoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gc3RyZWFtVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0VTRFNJbmZvU2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplLCBNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIkFBQyBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09ICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilkYXRhLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygmY29kZWNfc3BlY2lmaWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWRWRzaSAlZCwleCIsY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOwotICAgICAgICAgICAgICAgICAgICBpZiAoKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIkFBQyBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilEZWNvZGVyU3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljb2RlY19zcGVjaWZpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbSBtU3RyZWFtVHlwZTogbm9uZSAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiVkUgbm9hdWRpby12aWRlbyBzdHJlYW06cEMtPm1DdXJyVHJhY2sgPSAlZCAiLHBDLT5tQ3VyclRyYWNrKTsKLSAgICAgICAgICAgIHBDLT5tQ3VyclRyYWNrKys7IC8vSW5jcmVtZW50IGN1cnJlbnQgdHJhY2sgdG8gZ2V0IHRoZSBuZXh0IHRyYWNrCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZFIFN0cmVhbVR5cGU6ICVkLCBzdHJlbWhhbmRsZXIgJXgiLHN0cmVhbVR5cGUsICpwU3RyZWFtSGFuZGxlciApOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fc3RyZWFtSWQgICA9IHBDLT5tU3RyZWFtSWQ7Ci0gICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BVc2VyRGF0YSAgPSBNNE9TQV9OVUxMOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgbWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwKLSAgICAgICAgICAgIChpbnQ2NF90KikmKER1cmF0aW9uKSk7Ci0KLSAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24gPSAoaW50MzJfdCkoRHVyYXRpb24gLyAxMDAwKTsKLQotICAgICAgICBwQy0+bU1heER1cmF0aW9uID0gKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2R1cmF0aW9uKTsKLSAgICAgICAgQUxPR1YoIlZFIHN0ciBkdXJhdGlvbiBkdXJhdGlvbjogJWQgIiwgKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24pOwotCi0gICAgICAgIC8qIEluIEFBQyBjYXNlOiBQdXQgdGhlIGZpcnN0IEFVIGluIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhCi0gICAgICAgICAqc2luY2UgZGVjb2RlciBoYXMgdG8ga25vdyBpZiBzdHJlYW0gY29udGFpbnMgU0JSIGRhdGEoSW1wbGljaXQgc2lnKSAqLwotICAgICAgICBpZihNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PSAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhKiAgcEF1ZGlvU2JyVXNlcmRhdGE7Ci0KLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJkYXRhID0gKE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSksTTRSRUFERVJfM0dQLAotICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSIpOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEF1ZGlvU2JyVXNlcmRhdGEpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcFVzZXJEYXRhID0gcEF1ZGlvU2JyVXNlcmRhdGE7Ci0gICAgICAgICAgICBwQXVkaW9TYnJVc2VyZGF0YS0+bV9iSXNTYnJFbmFibGVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJkYXRhLT5tX3BGaXJzdEFVID0gKE00X0FjY2Vzc1VuaXQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRfQWNjZXNzVW5pdCksTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIjFzdCBBQUMgQVUiKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBBdWRpb1NiclVzZXJkYXRhLT5tX3BGaXJzdEFVKSB7Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEtPm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEtPm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnID0gKE00X0FhY0RlY29kZXJDb25maWcqKVwKLSAgICAgICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0FhY0RlY29kZXJDb25maWcpLE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnIik7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXVkaW9TYnJVc2VyZGF0YS0+bV9wQWFjRGVjb2RlclVzZXJDb25maWcpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09ICgqcFN0cmVhbUhhbmRsZXIpLT5tX3N0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcEF1ZGlvU3RyZWFtSGFuZGxlciA9Ci0gICAgICAgICAgICAgICAgKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopKCpwU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgICAgICBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhKiBwVXNlckRhdGEgPSAoTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSopXAotICAgICAgICAgICAgICAgIChwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BVc2VyRGF0YSk7Ci0KLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjdChwQywgKCpwU3RyZWFtSGFuZGxlciksCi0gICAgICAgICAgICAgICAgKE00X0FjY2Vzc1VuaXQqKXBVc2VyRGF0YS0+bV9wRmlyc3RBVSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1KHBDLCAoKnBTdHJlYW1IYW5kbGVyKSwKLSAgICAgICAgICAgICAgICAoTTRfQWNjZXNzVW5pdCopcFVzZXJEYXRhLT5tX3BGaXJzdEFVKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIDEuICJNNFdBUl9OT19NT1JFX0FVID09IGVyciIgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gbW9yZQotICAgICAgICAgICAgICogYWNjZXNzIHVuaXQgZnJvbSB0aGUgY3VycmVudCB0cmFjay4gSW4gb3RoZXIgd29yZHMsIHRoZXJlCi0gICAgICAgICAgICAgKiBpcyBvbmx5IGEgc2luZ2xlIGFjY2VzcyB1bml0IGZyb20gdGhlIGN1cnJlbnQgdHJhY2ssIGFuZAotICAgICAgICAgICAgICogdGhlIHBhcnNpbmcgb2YgdGhpcyB0cmFjayBoYXMgcmVhY2hlZCBFT1MuIFRoZSByZWFzb24gd2h5Ci0gICAgICAgICAgICAgKiB0aGUgZmlyc3QgYWNjZXNzIHVuaXQgbmVlZHMgdG8gYmUgcGFyc2VkIGhlcmUgaXMgYmVjYXVzZSBmb3IKLSAgICAgICAgICAgICAqIHNvbWUgYXVkaW8gY29kZWMgKGxpa2UgQUFDKSwgdGhlIHZlcnkgZmlyc3QgYWNjZXNzIHVuaXQKLSAgICAgICAgICAgICAqIG11c3QgYmUgZGVjb2RlZCBiZWZvcmUgaXRzIGNvbmZpZ3VyYXRpb24vZW5jb2RpbmcgcGFyYW1ldGVycwotICAgICAgICAgICAgICogKHN1Y2ggYXMgIyBvZiBjaGFubmVscyBhbmQgc2FtcGxlIHJhdGUpIGNhbiBiZSBjb3JyZWN0bHkKLSAgICAgICAgICAgICAqIGRldGVybWluZWQuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogMi4gInRyYWNrQ291bnQgPiBwQy0+bUN1cnJUcmFjayIgaW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG90aGVyCi0gICAgICAgICAgICAgKiB0cmFja3MgdG8gYmUgcGFyc2VkLCBpbiBhZGRpdGlvbiB0byB0aGUgY3VycmVudCB0cmFjay4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBXaGVuIGJvdGggY29uZGl0aW9ucyAxICYgMiBob2xkLCBvdGhlciB0cmFja3Mgc2hvdWxkIGJlCi0gICAgICAgICAgICAgKiBwYXJzZWQuIFRodXMsIHdlIHNob3VsZCBub3QgYmFpbCBvdXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChNNFdBUl9OT19NT1JFX0FVID09IGVyciAmJiB0cmFja0NvdW50ID4gcEMtPm1DdXJyVHJhY2spIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQocEMsICgqcFN0cmVhbUhhbmRsZXIpKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcEMtPm1DdXJyVHJhY2srKzsgLy9JbmNyZW1lbnQgdGhlIGN1cnJlbnQgdHJhY2sgdG8gZ2V0IG5leHQgdHJhY2sKLSAgICBBTE9HVigicEMtPm1DdXJyVHJhY2sgPSAlZCIscEMtPm1DdXJyVHJhY2spOwotCi0gICAgaWYgKCFoYXZlQXVkaW8gJiYgIWhhdmVWaWRlbykgewotICAgICAgICAqcE1lZGlhRmFtaWx5PU00UkVBREVSX2tNZWRpYUZhbWlseVVua25vd247Ci0gICAgICAgIHJldHVybiBNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRTsKLSAgICB9Ci1FcnJvcjoKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgZW5kIGVycm9yID0gJWQiLGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRPU0FfSW50MzIqIHBUaW1lKQotewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQgKnBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTWVkaWFCdWZmZXIgKm1NZWRpYUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQ7Ci0gICAgaW50NjRfdCB0ZW1wVGltZTY0ID0gMDsKLSAgICBzdGF0dXNfdCBlcnJvcjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZSBiZWdpbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWU6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lIGludmFsaWQgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWU6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0gICAgaWYgKCpwVGltZSA9PSAocFN0cmVhbUhhbmRsZXItPm1fZHVyYXRpb24pKSB7Ci0gICAgICAgICpwVGltZSAtPSAxOwotICAgIH0KLQotICAgIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZSAqIDEwMDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUgc2VlayB0aW1lOiAlbGQiLHRpbWU2NCk7Ci0gICAgb3B0aW9ucy5zZXRTZWVrVG8odGltZTY0LCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgZXJyb3IgPSBwQy0+bVZpZGVvU291cmNlLT5yZWFkKCZtTWVkaWFCdWZmZXIsICZvcHRpb25zKTsKLSAgICBpZiAoZXJyb3IgIT0gT0spIHsKLSAgICAgICAgLy9DYW4gbm90IGdldCB0aGUgcHJldmlvdXMgU3luYy4KLSAgICAgICAgLy9NdXN0IGJlIGVuZCBvZiBzdHJlYW0uCi0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgKGludDY0X3QqKSZ0ZW1wVGltZTY0KTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUgcmVhZCB0aW1lICVsZCwgJXgiLCB0ZW1wVGltZTY0LAotICAgICAgICBtTWVkaWFCdWZmZXIpOwotCi0gICAgKnBUaW1lID0gKE00T1NBX0ludDMyKSh0ZW1wVGltZTY0IC8gMTAwMCk7Ci0KLSAgICBpZihtTWVkaWFCdWZmZXIgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBBTE9HVigiIG1NZWRpYUJ1ZmZlciBzaXplID0gJWQgbGVuZ3RoICVkIiwgbU1lZGlhQnVmZmVyLT5zaXplKCksCi0gICAgICAgICAgICBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgbU1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1NZWRpYUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLQotICAgIGlmKGVycm9yICE9IE9LKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZSBlbmQgXAotICAgICAgICAgICAgTTRXQVJfUkVBREVSX0lORk9STUFUSU9OX05PVF9QUkVTRU5UIik7Ci0gICAgICAgIHJldHVybiBNNFdBUl9SRUFERVJfSU5GT1JNQVRJT05fTk9UX1BSRVNFTlQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lIGVuZDogZXJyICV4IiwgZXJyKTsKLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci19Ci0KLWV4dGVybiAiQyIgewotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZShNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBNZWRpYVR5cGUsICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZHJHbG9iYWxJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmRyRGF0YUludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UgYmVnaW4iKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlICVkIDB4JXggMHgleCIsICpwTWVkaWFUeXBlLAotICAgICAgICAqcFJkckdsb2JhbEludGVyZmFjZSwqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0gICAgU0FGRV9NQUxMT0MoKnBSZHJHbG9iYWxJbnRlcmZhY2UsIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSIpOwotICAgIFNBRkVfTUFMTE9DKCpwUmRyRGF0YUludGVyZmFjZSwgTTRSRUFERVJfRGF0YUludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSIpOwotCi0gICAgKnBNZWRpYVR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlM0dQUDsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2NyZWF0ZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95ICAgICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9kZXN0cm95OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdE9wZW4gICAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2U7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0T3B0aW9uICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFNldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtID0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXI7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RmlsbEF1U3RydWN0ID0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWN0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0YXJ0ICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RvcCAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RKdW1wICAgICAgICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFJlc2V0ICAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldFByZXZSYXBUaW1lID0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWU7Ci0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcEZjdEdldE5leHRBdSAgICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1OwotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3JlYWRlckNvbnRleHQgICAgICA9IE00T1NBX05VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgU0FGRV9GUkVFKCpwUmRyR2xvYmFsSW50ZXJmYWNlKTsKLSAgICAgICAgU0FGRV9GUkVFKCpwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi19ICAvKiBleHRlcm4gIkMiICovCi0KLX0gIC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRjN2VhMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEF1ZGlvIERlY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZJREVPRURJVE9SX0FVRElPREVDT0RFUiIKLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclV0aWxzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgIERFRklOSVRJT05TICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLS8vIFZlcnNpb24KLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01JTk9SIDAKLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX1JFViAgIDAKLQotLy8gRm9yY2UgdXNpbmcgc29mdHdhcmUgZGVjb2RlciBhcyBlbmdpbmUgZG9lcyBub3Qgc3VwcG9ydCBwcmVmZXRjaAotI2RlZmluZSBWSURFT0VESVRPUl9GT1JDRUNPREVDIGtTb2Z0d2FyZUNvZGVjc09ubHkKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIHNwPFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlPiBDcmVhdGUoCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBmb3JtYXQsIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB+VmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGVudW0gU3RhdGUgewotICAgICAgICAgICAgQ1JFQVRFRCwKLSAgICAgICAgICAgIFNUQVJURUQsCi0gICAgICAgICAgICBFUlJPUgotICAgICAgICB9OwotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZShjb25zdCBzcDxNZXRhRGF0YT4mIGZvcm1hdCwKLSAgICAgICAgIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpOwotICAgICAgICBzcDxNZXRhRGF0YT4gbUZvcm1hdDsKLSAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyKj4gbUJ1ZmZlcnM7Ci0gICAgICAgIE11dGV4IG1Mb2NrOyAgLy8gcHJvdGVjdHMgbUJ1ZmZlcnMKLSAgICAgICAgYm9vbCBtSXNFT1M7Ci0gICAgICAgIFN0YXRlIG1TdGF0ZTsKLSAgICAgICAgdm9pZCogbURlY1NoZWxsQ29udGV4dDsKLSAgICAgICAgLy8gRG9uJ3QgY2FsbCBtZS4KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UoY29uc3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UmKTsKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UmIG9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlICYpOwotfTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dAotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFN0YWdlRnJpZ2h0IGF1ZGlvIGRlY29kZXIKLSAqICAgICAgICAgICBzaGVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00QURfVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY29kZXJUeXBlOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgICAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBzcDxWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZT4gIG1EZWNvZGVyU291cmNlOwotICAgIE9NWENsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudDsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgICAgICAgIG1EZWNvZGVyOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5iT3V0cHV0Q2hhbm5lbHM7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJJbnB1dEZyYW1lczsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYk91dHB1dEZyYW1lczsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICAqbV9wUmVhZGVyOwotICAgIE00X0FjY2Vzc1VuaXQqIG1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGU7Ci0gICAgTTRPU0FfRVJSIHJlYWRlckVyckNvZGU7Ci0gICAgaW50MzJfdCB0aW1lU3RhbXBNczsKLQotfSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0OwotCi1zcDxWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZT4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBmb3JtYXQsIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpIHsKLQotICAgIHNwPFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlPiBhU291cmNlID0KLSAgICAgICAgbmV3IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlKGZvcm1hdCwgZGVjb2RlclNoZWxsQ29udGV4dCk7Ci0KLSAgICByZXR1cm4gYVNvdXJjZTsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIGZvcm1hdCwgdm9pZCogZGVjb2RlclNoZWxsQ29udGV4dCk6Ci0gICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgICAgbUlzRU9TKGZhbHNlKSwKLSAgICAgICAgbVN0YXRlKENSRUFURUQpLAotICAgICAgICBtRGVjU2hlbGxDb250ZXh0KGRlY29kZXJTaGVsbENvbnRleHQpIHsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZSgpIHsKLQotICAgIGlmKCBTVEFSVEVEID09IG1TdGF0ZSApIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICptZXRhKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBpZiggQ1JFQVRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RhcnQ6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBTVEFSVEVEOwotCi1jbGVhblVwOgotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RhcnQgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3AoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcCBiZWdpbiIpOwotCi0gICAgaWYoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3A6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoIW1CdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgaW50IG4gPSBtQnVmZmVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICBtQnVmZmVycy5pdGVtQXQoaSktPnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVygiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3AgOiAlZCBidWZmZXIgcmVtYWluZWQiLCBuKTsKLSAgICAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBDUkVBVEVEOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9wIEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXNwPE1ldGFEYXRhPiBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpnZXRGb3JtYXQiKTsKLSAgICByZXR1cm4gbUZvcm1hdDsKLX0KLQotc3RhdGljIE1lZGlhQnVmZmVyKiByZWFkQnVmZmVyRnJvbVJlYWRlcigKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY0NvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfQWNjZXNzVW5pdCogcEFjY2Vzc1VuaXQgPSBwRGVjQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZTsKLQotICAgIC8vIEdldCBuZXh0IEFVIGZyb20gcmVhZGVyLgotICAgIGxlcnIgPSBwRGVjQ29udGV4dC0+bV9wUmVhZGVyLT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICBwRGVjQ29udGV4dC0+bV9wUmVhZGVyLT5tX3JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcERlY0NvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICBwQWNjZXNzVW5pdCk7Ci0KLSAgICBpZiAobGVyciA9PSBNNFdBUl9OT19NT1JFX0FVKSB7Ci0gICAgICAgIEFMT0dWKCJyZWFkQnVmZmVyRnJvbVJlYWRlciA6IEVPUyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBwRGVjQ29udGV4dC0+dGltZVN0YW1wTXMgPSBwQWNjZXNzVW5pdC0+bV9DVFM7Ci0KLSAgICBNZWRpYUJ1ZmZlciogbmV3QnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKChzaXplX3QpcEFjY2Vzc1VuaXQtPm1fc2l6ZSk7Ci0gICAgbWVtY3B5KCh2b2lkICopKChNNE9TQV9JbnQ4KiluZXdCdWZmZXItPmRhdGEoKSArIG5ld0J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAodm9pZCAqKXBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzLCBwQWNjZXNzVW5pdC0+bV9zaXplKTsKLSAgICBuZXdCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgKHBBY2Nlc3NVbml0LT5tX0NUUyAqIDEwMDBMTCkpOwotICAgIHJldHVybiBuZXdCdWZmZXI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpyZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIHJlYWRPcHRpb25zOwotCi0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY0NvbnRleHQgPQotICAgICAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCAqKW1EZWNTaGVsbENvbnRleHQ7Ci0KLSAgICBpZiAoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnJlYWQgaW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSByZWFkZXIgaWYgd2UgZG9uJ3QgaGF2ZSBhbnkKLSAgICBpZihtQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBuZXdCdWZmZXIgPSByZWFkQnVmZmVyRnJvbVJlYWRlcihwRGVjQ29udGV4dCk7Ci0gICAgICAgIGlmICghbmV3QnVmZmVyKSB7Ci0gICAgICAgICAgICAqYnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHBEZWNDb250ZXh0LT5yZWFkZXJFcnJDb2RlID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0gICAgICAgIG1CdWZmZXJzLnB1c2gobmV3QnVmZmVyKTsKLSAgICB9Ci0gICAgKmJ1ZmZlciA9IG1CdWZmZXJzLml0ZW1BdCgwKTsKLSAgICBtQnVmZmVycy5yZW1vdmVBdCgwKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY0NvbnRleHQgPQotICAgICAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCAqKW1EZWNTaGVsbENvbnRleHQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyIGJlZ2luIik7Ci0KLSAgICAvLyBJZiB0aGUgdXNlciBkaWRuJ3QgZ2l2ZSB1cyBhIGJ1ZmZlciwgZ2V0IGl0IGZyb20gdGhlIHJlYWRlci4KLSAgICBpZihidWZmZXIgPT0gTlVMTCkgewotICAgICAgICBNZWRpYUJ1ZmZlciogbmV3QnVmZmVyID0gcmVhZEJ1ZmZlckZyb21SZWFkZXIocERlY0NvbnRleHQpOwotICAgICAgICBpZiAoIW5ld0J1ZmZlcikgewotICAgICAgICAgICAgcERlY0NvbnRleHQtPnJlYWRlckVyckNvZGUgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICBtQnVmZmVycy5wdXNoKGJ1ZmZlcik7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlciBFTkQiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgIFRPT0xTICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMoTTRPU0FfSW50OCogcERhdGEsCi0gICAgICAgIE00T1NBX1VJbnQzMiBkYXRhU2l6ZSwgTTRPU0FfVUludDggbmJCaXRzLCBNNE9TQV9JbnQzMiogcFJlc3VsdCwKLSAgICAgICAgTTRPU0FfVUludDMyKiBwT2Zmc2V0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgc3RhcnRCeXRlID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc3RhcnRCaXQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBlbmRCeXRlID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZW5kQml0ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgY3VycmVudEJ5dGUgPSAwOwotICAgIE00T1NBX1VJbnQzMiByZXN1bHQgPSAwOwotICAgIE00T1NBX1VJbnQzMiB1aTMyVG1wID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdWkzMk1hc2sgPSAwOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERhdGEsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwT2Zmc2V0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKDMyID49IG5iQml0cywgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygoKnBPZmZzZXQgKyBuYkJpdHMpIDw9IDgqZGF0YVNpemUsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyBiZWdpbiIpOwotCi0gICAgc3RhcnRCeXRlICAgPSAoKnBPZmZzZXQpID4+IDM7Ci0gICAgZW5kQnl0ZSAgICAgPSAoKnBPZmZzZXQgKyBuYkJpdHMpID4+IDM7Ci0gICAgc3RhcnRCaXQgICAgPSAoKnBPZmZzZXQpICUgODsKLSAgICBlbmRCaXQgICAgICA9ICgqcE9mZnNldCArIG5iQml0cykgJSA4OwotICAgIGN1cnJlbnRCeXRlID0gc3RhcnRCeXRlOwotCi0gICAgLy8gRXh0cmFjdCB0aGUgcmVxdWVzdGVkIG51bmJlciBvZiBiaXRzIGZyb20gbWVtb3J5Ci0gICAgd2hpbGUoIGN1cnJlbnRCeXRlIDw9IGVuZEJ5dGUpIHsKLSAgICAgICAgdWkzMk1hc2sgPSAweDAwMDAwMEZGOwotICAgICAgICBpZiggY3VycmVudEJ5dGUgPT0gc3RhcnRCeXRlICkgewotICAgICAgICAgICAgdWkzMk1hc2sgPj49IHN0YXJ0Qml0OwotICAgICAgICB9Ci0gICAgICAgIHVpMzJUbXAgPSB1aTMyTWFzayAmICgoTTRPU0FfVUludDMyKXBEYXRhW2N1cnJlbnRCeXRlXSk7Ci0gICAgICAgIGlmKCBjdXJyZW50Qnl0ZSA9PSBlbmRCeXRlICkgewotICAgICAgICAgICAgdWkzMlRtcCA+Pj0gKDgtZW5kQml0KTsKLSAgICAgICAgICAgIHJlc3VsdCA8PD0gZW5kQml0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0IDw8PSA4OwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCB8PSB1aTMyVG1wOwotICAgICAgICBjdXJyZW50Qnl0ZSsrOwotICAgIH0KLQotICAgICpwUmVzdWx0ID0gcmVzdWx0OwotICAgICpwT2Zmc2V0ICs9IG5iQml0czsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotI2RlZmluZSBGUkVRX1RBQkxFX1NJWkUgMTYKLWNvbnN0IE00T1NBX1VJbnQzMiBBRF9BQUNfRlJFUV9UQUJMRVtGUkVRX1RBQkxFX1NJWkVdID0KLSAgICB7OTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLAotICAgIDMyMDAwLCAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTAsIDAsIDAsIDB9OwotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wYXJzZV9BQUNfRFNJKE00T1NBX0ludDgqIHBEU0ksCi0gICAgICAgIE00T1NBX1VJbnQzMiBkc2lTaXplLCBBQUNfREVDX1NUUkVBTV9QUk9QUyogcFByb3BlcnRpZXMpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBvZmZzZXQgPSAwOwotICAgIE00T1NBX0ludDMyIHJlc3VsdCA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSBiZWdpbiIpOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERTSSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBQcm9wZXJ0aWVzLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gR2V0IHRoZSBvYmplY3QgdHlwZQotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMocERTSSwgZHNpU2l6ZSwgNSwgJnJlc3VsdCwgJm9mZnNldCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgc3dpdGNoKCByZXN1bHQgKSB7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIC8qIEF1ZGlvIE9iamVjdCBUeXBlIGlzIDIgKEFBQyBMb3cgQ29tcGxleGl0eSkgKi8KLSAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5hUFNQcmVzZW50ICA9IDA7Ci0gICAgICAgICAgICBwUHJvcGVydGllcy0+YVNCUlByZXNlbnQgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIC8qIEF1ZGlvIE9iamVjdCBUeXBlIGlzIDUgKFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24pICovCi0gICAgICAgICAgICBwUHJvcGVydGllcy0+YVBTUHJlc2VudCAgPSAwOwotICAgICAgICAgICAgcFByb3BlcnRpZXMtPmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgLyogQXVkaW8gT2JqZWN0IFR5cGUgaXMgMjkgKFBhcmFtZXRyaWMgU3RlcmVvKSAqLwotICAgICAgICAgICAgcFByb3BlcnRpZXMtPmFQU1ByZXNlbnQgID0gMTsKLSAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJwYXJzZV9BQUNfRFNJIEVSUk9SIDogb2JqZWN0IHR5cGUgJWQgaXMgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiaW52YWxpZCBBQUMgb2JqZWN0IHR5cGUiLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwUHJvcGVydGllcy0+YUF1ZGlvT2JqZWN0VHlwZSA9IChNNE9TQV9JbnQzMilyZXN1bHQ7Ci0KLSAgICAvLyBHZXQgdGhlIGZyZXF1ZW5jeSBpbmRleAotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMocERTSSwgZHNpU2l6ZSwgNCwgJnJlc3VsdCwgJm9mZnNldCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soKDAgPD0gcmVzdWx0KSAmJiAoRlJFUV9UQUJMRV9TSVpFID4gcmVzdWx0KSwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwUHJvcGVydGllcy0+YVNhbXBGcmVxID0gQURfQUFDX0ZSRVFfVEFCTEVbcmVzdWx0XTsKLSAgICBwUHJvcGVydGllcy0+YUV4dGVuc2lvblNhbXBGcmVxID0gMDsKLQotICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyhwRFNJLCBkc2lTaXplLCA0LCAmcmVzdWx0LCAmb2Zmc2V0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICBwUHJvcGVydGllcy0+YU51bUNoYW4gPSAoTTRPU0FfVUludDMyKXJlc3VsdDsKLQotICAgIC8vIFNldCB0aGUgbWF4IFBDTSBzYW1wbGVzIHBlciBjaGFubmVsCi0gICAgcFByb3BlcnRpZXMtPmFNYXhQQ01TYW1wbGVzUGVyQ2ggPSAocFByb3BlcnRpZXMtPmFTQlJQcmVzZW50KSA/IDIwNDggOiAxMDI0OwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3BhcnNlX0FBQ19EU0kgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3BhcnNlX0FBQ19EU0kgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiBFTkdJTkUgSU5URVJGQUNFICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3koTTRBRF9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRGVjb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBTdG9wIHRoZSBncmFwaAotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXIuZ2V0KCkgKSB7Ci0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPnN0b3AoKTsKLSAgICB9Ci0KLSAgICAvLyBEZXN0cm95IHRoZSBncmFwaAotICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJTb3VyY2UuY2xlYXIoKTsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyLmNsZWFyKCk7Ci0gICAgcERlY29kZXJDb250ZXh0LT5tQ2xpZW50LmRpc2Nvbm5lY3QoKTsKLQotICAgIFNBRkVfRlJFRShwRGVjb2RlckNvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveSA6IERPTkUiKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IDogZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZShNNEFEX1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfQ29udGV4dCogcENvbnRleHQsIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgIHZvaWQqIHBVc2VyRGF0YSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgQUFDX0RFQ19TVFJFQU1fUFJPUFMgYWFjUHJvcGVydGllczsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBzcDxNZXRhRGF0YT4gZGVjb2Rlck1ldGFEYXRhID0gTlVMTDsKLSAgICBjb25zdCBjaGFyKiBtaW1lID0gTlVMTDsKLSAgICB1aW50MzJfdCBjb2RlY0ZsYWdzID0gMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgYmVnaW46IGRlY29kZXJUeXBlICVkIiwgZGVjb2RlclR5cGUpOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwU3RyZWFtSGFuZGxlciwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uCi0gICAgU0FGRV9NQUxMT0MocERlY29kZXJDb250ZXh0LCBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0LCAxLAotICAgICAgICAiQXVkaW9EZWNvZGVyIik7Ci0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBkZWNvZGVyVHlwZTsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBwU3RyZWFtSGFuZGxlcjsKLQotICAgIHBEZWNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgID0gMDsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcyA9IDA7Ci0gICAgcERlY29kZXJDb250ZXh0LT5yZWFkZXJFcnJDb2RlID0gTTROT19FUlJPUjsKLSAgICBwRGVjb2RlckNvbnRleHQtPnRpbWVTdGFtcE1zID0gLTE7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlIDogbWF4QVVTaXplICVkIiwKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIG1ldGEgZGF0YSBmb3IgdGhlIGRlY29kZXIKLSAgICBkZWNvZGVyTWV0YURhdGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgc3dpdGNoKCBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyVHlwZSApIHsKLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQU1STkI6Ci0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COwotICAgICAgICAgICAgLy8gRW5naW5lIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggPSAxNjA7Ci0gICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZQotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID0gMjsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDgwMDA7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa1R5cGVBTVJXQjoKLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7Ci0KLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggPSAxNjA7Ci0gICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZQotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID0gMjsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDE2MDAwOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQUFDOgotICAgICAgICAgICAgLy8gUmVqZWN0IEFEVFMgJiBBRElGIChvciBhbnkgaW5jb3JyZWN0IHR5cGUpCi0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PQotICAgICAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSxNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwotCi0gICAgICAgICAgICBkZWNvZGVyTWV0YURhdGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRVNEU0luZm8sCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLm1fRVNEU0luZm9TaXplKTsKLQotICAgICAgICAgICAgLy8gRW5naW5lIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIC8vIFJldHJpZXZlIHNhbXBsaW5nIGZyZXF1ZW5jeSBhbmQgbnVtYmVyIG9mIGNoYW5uZWxzIGZyb20gdGhlIERTSQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfSW50OCopcFN0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLlwKLSAgICAgICAgICAgICAgICAgICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmYWFjUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9IDEwMjQ7Ci0gICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZQotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID0gMjsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgYWFjUHJvcGVydGllcy5hU2FtcEZyZXE7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgYWFjUHJvcGVydGllcy5hTnVtQ2hhbjsKLQotICAgICAgICAgICAgLy8gQ29weSB0aGUgc3RyZWFtIHByb3BlcnRpZXMgaW50byB1c2VyZGF0YQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcFVzZXJEYXRhICkgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmYWFjUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEFBQ19ERUNfU1RSRUFNX1BST1BTKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa1R5cGVNUDM6Ci0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIkF1ZGlvRGVjb2Rlcl9vcGVuIDogaW5jb3JyZWN0IGlucHV0IGZvcm1hdCIsCi0gICAgICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlY29kZXJNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOwotICAgIGRlY29kZXJNZXRhRGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsCi0gICAgICAgIChpbnQzMl90KXBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgZGVjb2Rlck1ldGFEYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LAotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyk7Ci0gICAgZGVjb2Rlck1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sCi0gICAgICAgIChpbnQ2NF90KXBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgZGVjb2RlciBzb3VyY2UKLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgZGVjb2Rlck1ldGFEYXRhLCAodm9pZCAqKXBEZWNvZGVyQ29udGV4dCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlLmdldCgpLAotICAgICAgICBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgcmVzdWx0ID0gcERlY29kZXJDb250ZXh0LT5tQ2xpZW50LmNvbm5lY3QoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgT01YIGNvZGVjCi0jaWZkZWYgVklERU9FRElUT1JfRk9SQ0VDT0RFQwotICAgIGNvZGVjRmxhZ3MgfD0gT01YQ29kZWM6OlZJREVPRURJVE9SX0ZPUkNFQ09ERUM7Ci0jZW5kaWYgLyogVklERU9FRElUT1JfRk9SQ0VDT0RFQyAqLwotCi0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUocERlY29kZXJDb250ZXh0LT5cCi0gICAgICAgIG1DbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgIGRlY29kZXJNZXRhRGF0YSwgZmFsc2UsIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJTb3VyY2UsIE5VTEwsCi0gICAgICAgICAgICBjb2RlY0ZsYWdzKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXIuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIEdldCB0aGUgb3V0cHV0IGNoYW5uZWxzLCB0aGUgZGVjb2RlciBtaWdodCBvdmVyd3JpdGUgdGhlIGlucHV0IG1ldGFkYXRhCi0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LAotICAgICAgICAmcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyk7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSA6IG91dHB1dCBjaGFuICVkIiwKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyk7Ci0KLSAgICAvLyBTdGFydCB0aGUgZGVjb2RlcgotICAgIHJlc3VsdCA9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPnN0YXJ0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICAqcENvbnRleHQgPSBwRGVjb2RlckNvbnRleHQ7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSA6IERPTkUiKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95KHBEZWNvZGVyQ29udGV4dCk7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfQUFDKE00QURfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXIsIHZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSgKLSAgICAgICAgTTRBRF9rVHlwZUFBQywgcENvbnRleHQsIHBTdHJlYW1IYW5kbGVyLHBVc2VyRGF0YSk7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9BTVJOQihNNEFEX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyLCB2b2lkKiBwVXNlckRhdGEpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUoCi0gICAgICAgIE00QURfa1R5cGVBTVJOQiwgcENvbnRleHQsIHBTdHJlYW1IYW5kbGVyLCBwVXNlckRhdGEpOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfQU1SV0IoTTRBRF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwU3RyZWFtSGFuZGxlciwgdm9pZCogcFVzZXJEYXRhKSB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlKAotICAgICAgICBNNEFEX2tUeXBlQU1SV0IsIHBDb250ZXh0LCBwU3RyZWFtSGFuZGxlciwgcFVzZXJEYXRhKTsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX01QMyhNNEFEX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyLCB2b2lkKiBwVXNlckRhdGEpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUoCi0gICAgICAgIE00QURfa1R5cGVNUDMsIHBDb250ZXh0LCBwU3RyZWFtSGFuZGxlciwgcFVzZXJEYXRhKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlcigKLSAgICAgICAgTTRBRF9Db250ZXh0IHBDb250ZXh0LCBNNEFEX0J1ZmZlciogcElucHV0QnVmZmVyKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNZWRpYUJ1ZmZlciogYnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcElucHV0QnVmZmVyICkgewotICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoKHNpemVfdClwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKSgoTTRPU0FfSW50OCopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgICh2b2lkICopcElucHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLCBwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSk7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBwSW5wdXRCdWZmZXItPm1fdGltZVN0YW1wVXMpOwotICAgIH0KLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlLT5zdG9yZUJ1ZmZlcihidWZmZXIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIoTTRBRF9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyLCBNNEFEX0J1ZmZlciogcE91cHV0QnVmZmVyKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBpbnQzMl90IGkzMlRtcCA9IDA7Ci0gICAgaW50NjRfdCBpNjRUbXAgPSAwOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IGJ1ZmZlciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBPdXB1dEJ1ZmZlciwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBEZWNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIFByb2Nlc3MgdGhlIHJldHVybmVkIGRhdGEKLSAgICBpZiggMCA9PSBidWZmZXItPnJhbmdlX2xlbmd0aCgpICkgewotICAgICAgICAvLyBEZWNvZGVyIGhhcyBubyBkYXRhIHlldCwgbm90aGluZyB1bnVzdWFsCi0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0KLSAgICBwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcysrOwotCi0gICAgaWYoIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzID09Ci0gICAgICAgIChNNE9TQV9VSW50MzIpcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyApIHsKLSAgICAgICAgLy8gSnVzdCBjb3B5IHRoZSBQQ01zCi0gICAgICAgIHBPdXB1dEJ1ZmZlci0+bV9idWZmZXJTaXplID0gKE00T1NBX1VJbnQzMilidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3VwdXRCdWZmZXItPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKSgoKE00T1NBX01lbUFkZHI4KWJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIH0gZWxzZSBpZiggcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgPAotICAgICAgICAoTTRPU0FfVUludDMyKXBEZWNvZGVyQ29udGV4dC0+bU5iT3V0cHV0Q2hhbm5lbHMgKSB7Ci0gICAgICAgIC8vIFRoZSBkZWNvZGVyIGZvcmNlcyBzdGVyZW8gb3V0cHV0LCBkb3duc2FtcGxlCi0gICAgICAgIHBPdXB1dEJ1ZmZlci0+bV9idWZmZXJTaXplID0gKE00T1NBX1VJbnQzMikoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKS8yKTsKLSAgICAgICAgTTRPU0FfSW50MTYqIHBEYXRhSW4gID0gKChNNE9TQV9JbnQxNiopYnVmZmVyLT5kYXRhKCkpICsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0gICAgICAgIE00T1NBX0ludDE2KiBwRGF0YU91dCA9IChNNE9TQV9JbnQxNiopcE91cHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzOwotICAgICAgICBNNE9TQV9JbnQxNiogcERhdGFFbmQgPSBwRGF0YUluICsgXAotICAgICAgICAgICAgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkvc2l6ZW9mKE00T1NBX0ludDE2KSk7Ci0gICAgICAgIHdoaWxlKCBwRGF0YUluIDwgcERhdGFFbmQgKSB7Ci0gICAgICAgICAgICAqcERhdGFPdXQgPSAqcERhdGFJbjsKLSAgICAgICAgICAgIHBEYXRhSW4rPTI7Ci0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhlIGRlY29kZXIgZm9yY2VzIG1vbm8gb3V0cHV0LCBub3Qgc3VwcG9ydGVkCi0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICAvLyBSZWxlYXNlIHRoZSBidWZmZXIKLSAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcE91cHV0QnVmZmVyLT5tX2J1ZmZlclNpemUgPSAwOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3N0ZXAoTTRBRF9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNEFEX0J1ZmZlciogcElucHV0QnVmZmVyLCBNNEFEX0J1ZmZlciogcE91dHB1dEJ1ZmZlciwKLSAgICAgICAgTTRPU0FfQm9vbCBiSnVtcCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0gICAgTWVkaWFCdWZmZXIqIG91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIHBEZWNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLQotICAgIC8vIFB1c2ggdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgZGVjb2RlciBzb3VyY2UKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIocERlY29kZXJDb250ZXh0LAotICAgICAgICBwSW5wdXRCdWZmZXIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgLy8gUmVhZAotICAgIHJlc3VsdCA9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPnJlYWQoJm91dHB1dEJ1ZmZlciwgTlVMTCk7Ci0gICAgaWYgKElORk9fRk9STUFUX0NIQU5HRUQgPT0gcmVzdWx0KSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwOiBBdWRpbyBkZWNvZGVyIFwKLSAgICAgICAgIHJldHVybmVkIElORk9fRk9STUFUX0NIQU5HRUQiKTsKLSAgICAgICAgQ0hFQ0sob3V0cHV0QnVmZmVyID09IE5VTEwpOwotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPmdldEZvcm1hdCgpOwotICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudDsKLQotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmY2hhbm5lbENvdW50KSk7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwOiBzYW1wbGluZ0ZyZXEgPSAlZCIsIHNhbXBsZVJhdGUpOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDogY2hhbm5lbENudCA9ICVkIiwgY2hhbm5lbENvdW50KTsKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICh1aW50MzJfdClzYW1wbGVSYXRlOwotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9Ci0gICAgICAgICAodWludDMyX3QpY2hhbm5lbENvdW50OwotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dENoYW5uZWxzID0gY2hhbm5lbENvdW50OwotCi0gICAgICAgIHJldHVybiBNNFdBUl9JTkZPX0ZPUk1BVF9DSEFOR0U7Ci0gICAgfSBlbHNlIGlmIChFUlJPUl9FTkRfT0ZfU1RSRUFNID09IHJlc3VsdCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDogQXVkaW8gZGVjb2RlciBcCi0gICAgICAgICByZXR1cm5lZCBFUlJPUl9FTkRfT0ZfU1RSRUFNIik7Ci0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+cmVhZGVyRXJyQ29kZSA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0gZWxzZSBpZiAoT0sgIT0gcmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0IHRoZSBQQ00gYnVmZmVyCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcihwRGVjb2RlckNvbnRleHQsCi0gICAgICAgIG91dHB1dEJ1ZmZlciwgcE91dHB1dEJ1ZmZlcik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbiBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBWZXJzaW9uSW5mbywgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciAgICAgID0gVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9taW5vciAgICAgID0gVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01JTk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9yZXZpc2lvbiAgID0gVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX1JFVjsKLSAgICBwVmVyc2lvbkluZm8tPm1fc3RydWN0U2l6ZSA9IHNpemVvZihNNF9WZXJzaW9uSW5mbyk7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRWZXJzaW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc2V0T3B0aW9uKE00QURfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KiBwRGVjb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3NldE9wdGlvbiBiZWdpbiAweCVYIiwgb3B0aW9uSUQpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgc3dpdGNoKCBvcHRpb25JRCApIHsKLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9VSW50MzI+KE00QURfa09wdGlvbklEX1VzZXJQYXJhbSk6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJzZXRPcHRpb24gVXNlclBhcmFtIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlOgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyc2V0T3B0aW9uIDNncFJlYWRlckludGVyZmFjZSIpOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tX3BSZWFkZXIgPQotICAgICAgICAgICAgIChNNFJFQURFUl9EYXRhSW50ZXJmYWNlICopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0F1ZGlvQVU6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJzZXRPcHRpb24gQXVkaW9BVSIpOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlID0KLSAgICAgICAgICAgICAoTTRfQWNjZXNzVW5pdCAqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gIHVuc3VwcG9ydGVkIG9wdGlvbklkIDB4JVgiLAotICAgICAgICAgICAgICAgIG9wdGlvbklEKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiggKChNNE9TQV9VSW50MzIpTTROT19FUlJPUiA9PSBlcnIpIHx8ICgoTTRPU0FfVUludDMyKU00RVJSX05PVF9JTVBMRU1FTlRFRCA9PSBlcnIpICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc2V0T3B0aW9uIGVycm9yIDB4JVgiLCBlcnIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbihNNEFEX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRPcHRpb24gYmVnaW46IG9wdGlvbklEIDB4JVgiLCBvcHRpb25JRCk7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRGVjb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotCi0gICAgICAgIGNhc2UgTTRBRF9rT3B0aW9uSURfR2V0QXVkaW9BVUVyckNvZGU6Ci0gICAgICAgICAgICAqKHVpbnQzMl90ICopb3B0aW9uVmFsdWUgPSBwRGVjb2RlckNvbnRleHQtPnJlYWRlckVyckNvZGU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0F1ZGlvTmJDaGFubmVsczoKLSAgICAgICAgICAgICoodWludDMyX3QgKilvcHRpb25WYWx1ZSA9Ci0gICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0F1ZGlvU2FtcEZyZXF1ZW5jeToKLSAgICAgICAgICAgICoodWludDMyX3QgKilvcHRpb25WYWx1ZSA9Ci0gICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tPcHRpb25JRF9BdUNUUzoKLSAgICAgICAgICAgICoodWludDMyX3QgKilvcHRpb25WYWx1ZSA9IHBEZWNvZGVyQ29udGV4dC0+dGltZVN0YW1wTXM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiB1bnN1cHBvcnRlZCBvcHRpb25JZCAweCVYIiwKLSAgICAgICAgICAgICAgICBvcHRpb25JRCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfQkFEX09QVElPTl9JRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0T3B0aW9uIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERlY29kZXJUeXBlLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERlY29kZXJJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlIGJlZ2luICVkIDB4JXggMHgleCIsCi0gICAgICAgIGRlY29kZXJUeXBlLCBwRGVjb2RlclR5cGUsIHBEZWNvZGVySW50ZXJmYWNlKTsKLQotICAgIFNBRkVfTUFMTE9DKCpwRGVjb2RlckludGVyZmFjZSwgTTRBRF9JbnRlcmZhY2UsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlciIpOwotCi0gICAgKnBEZWNvZGVyVHlwZSA9IGRlY29kZXJUeXBlOwotCi0gICAgc3dpdGNoKCBkZWNvZGVyVHlwZSApIHsKLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQU1STkI6Ci0gICAgICAgICAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgPQotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9BTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00QURfa1R5cGVBTVJXQjoKLSAgICAgICAgICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyA9Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX0FNUldCOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRBRF9rVHlwZUFBQzoKLSAgICAgICAgICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyA9Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX0FBQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00QURfa1R5cGVNUDM6Ci0gICAgICAgICAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgPQotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9NUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWRUFEX2dldEludGVyZmFjZSBFUlJPUjogdW5zdXBwb3J0ZWQgdHlwZSAlZCIsIGRlY29kZXJUeXBlKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyAgID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveTsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0UmVzZXRBdWRpb0RlYyAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTdGFydEF1ZGlvRGVjICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFN0ZXBBdWRpb0RlYyAgICAgID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0R2V0VmVyc2lvbkF1ZGlvRGVjID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbjsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMgPQotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb247Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0T3B0aW9uOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpwRGVjb2RlckludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpIHsKLSAgICBBTE9HVigiVEVTVDogQUFDIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00QURfa1R5cGVBQUMsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0gICAgQUxPR1YoIlRFU1Q6IEFNUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEFEX2tUeXBlQU1STkIsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUldCKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEFEX2tUeXBlQU1SV0IsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QMyhNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRBRF9rVHlwZU1QMywgcERlY29kZXJUeXBlLCBwRGVjb2RlckludGVyZmFjZSk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5MWYzZWUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBBdWRpbyBFbmNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl9BVURJT0VOQ09ERVIiCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLQotLyoqKiBERUZJTklUSU9OUyAqKiovCi0vLyBGb3JjZSB1c2luZyBzb2Z0d2FyZSBlbmNvZGVyIGFzIGVuZ2luZSBkb2VzIG5vdCBzdXBwb3J0IHByZWZldGNoCi0jZGVmaW5lIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMga1NvZnR3YXJlQ29kZWNzT25seQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1zdHJ1Y3QgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIHNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBDcmVhdGUoCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBpbnQzMl90IHN0b3JlQnVmZmVyKE1lZGlhQnVmZmVyICpidWZmZXIpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RydWN0IE1lZGlhQnVmZmVyQ2hhaW4gewotICAgICAgICAgICAgTWVkaWFCdWZmZXIqIGJ1ZmZlcjsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG5leHRMaW5rOwotICAgICAgICB9OwotICAgICAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgICAgIENSRUFURUQsCi0gICAgICAgICAgICBTVEFSVEVELAotICAgICAgICAgICAgRVJST1IKLSAgICAgICAgfTsKLQotICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBtRmlyc3RCdWZmZXJMaW5rOwotICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBtTGFzdEJ1ZmZlckxpbms7Ci0gICAgICAgIGludDMyX3QgbU5iQnVmZmVyOwotICAgICAgICBTdGF0ZSBtU3RhdGU7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtRW5jRm9ybWF0OwotCi0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KTsKLQotICAgICAgICAvLyBEb24ndCBjYWxsIG1lLgotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZShjb25zdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSYpOwotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSYgb3BlcmF0b3I9KAotICAgICAgICAgICAgY29uc3QgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UmKTsKLX07Ci0KLXNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KSB7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OkNyZWF0ZSIpOwotICAgIHNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBhU291cmNlID0KLSAgICAgICAgbmV3IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKGZvcm1hdCk7Ci0KLSAgICByZXR1cm4gYVNvdXJjZTsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKAotICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KToKLSAgICAgICAgbUZpcnN0QnVmZmVyTGluayhOVUxMKSwKLSAgICAgICAgbUxhc3RCdWZmZXJMaW5rKE5VTEwpLAotICAgICAgICBtTmJCdWZmZXIoMCksCi0gICAgICAgIG1TdGF0ZShDUkVBVEVEKSwKLSAgICAgICAgbUVuY0Zvcm1hdChmb3JtYXQpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlIik7Ci19Ci0KLQotVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSgpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSIpOwotCi0gICAgaWYoIFNUQVJURUQgPT0gbVN0YXRlICkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RhcnQiKTsKLQotICAgIGlmKCBDUkVBVEVEICE9IG1TdGF0ZSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdGFydCBFUlJPUiA6IGludmFsaWQgc3RhdGUgJWQiLAotICAgICAgICAgICAgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gU1RBUlRFRDsKLQotY2xlYW5VcDoKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0YXJ0IEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9wKCkgewotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9wIik7Ci0KLSAgICBpZiggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcCBFUlJPUjogaW52YWxpZCBzdGF0ZSAlZCIsCi0gICAgICAgICAgICBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGkgPSAwOwotICAgIE1lZGlhQnVmZmVyQ2hhaW4qIHRtcExpbmsgPSBOVUxMOwotICAgIHdoaWxlKCBtRmlyc3RCdWZmZXJMaW5rICkgewotICAgICAgICBpKys7Ci0gICAgICAgIHRtcExpbmsgPSBtRmlyc3RCdWZmZXJMaW5rOwotICAgICAgICBtRmlyc3RCdWZmZXJMaW5rID0gbUZpcnN0QnVmZmVyTGluay0+bmV4dExpbms7Ci0gICAgICAgIGRlbGV0ZSB0bXBMaW5rOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3AgOiAlZCBidWZmZXIgcmVtYWluZWQiLCBpKTsKLSAgICBtRmlyc3RCdWZmZXJMaW5rID0gTlVMTDsKLSAgICBtTGFzdEJ1ZmZlckxpbmsgPSBOVUxMOwotCi0gICAgbVN0YXRlID0gQ1JFQVRFRDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcCBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zcDxNZXRhRGF0YT4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OmdldEZvcm1hdCIpOwotICAgIHJldHVybiBtRW5jRm9ybWF0OwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgcmVhZE9wdGlvbnM7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgTWVkaWFCdWZmZXJDaGFpbiogdG1wTGluayA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnJlYWQiKTsKLQotICAgIGlmICggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZCBFUlJPUiA6IGludmFsaWQgc3RhdGUgJWQiLAotICAgICAgICAgICAgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgaWYoIE5VTEwgPT0gbUZpcnN0QnVmZmVyTGluayApIHsKLSAgICAgICAgKmJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZCA6IEVPUyIpOwotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0gICAgKmJ1ZmZlciA9IG1GaXJzdEJ1ZmZlckxpbmstPmJ1ZmZlcjsKLQotICAgIHRtcExpbmsgPSBtRmlyc3RCdWZmZXJMaW5rOwotICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBtRmlyc3RCdWZmZXJMaW5rLT5uZXh0TGluazsKLSAgICBpZiggTlVMTCA9PSBtRmlyc3RCdWZmZXJMaW5rICkgewotICAgICAgICBtTGFzdEJ1ZmZlckxpbmsgPSBOVUxMOwotICAgIH0KLSAgICBkZWxldGUgdG1wTGluazsKLSAgICBtTmJCdWZmZXItLTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZCBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQzMl90IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyIik7Ci0KLSAgICBNZWRpYUJ1ZmZlckNoYWluKiBuZXdMaW5rID0gbmV3IE1lZGlhQnVmZmVyQ2hhaW47Ci0gICAgbmV3TGluay0+YnVmZmVyID0gYnVmZmVyOwotICAgIG5ld0xpbmstPm5leHRMaW5rID0gTlVMTDsKLSAgICBpZiggTlVMTCAhPSBtTGFzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgIG1MYXN0QnVmZmVyTGluay0+bmV4dExpbmsgPSBuZXdMaW5rOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBuZXdMaW5rOwotICAgIH0KLSAgICBtTGFzdEJ1ZmZlckxpbmsgPSBuZXdMaW5rOwotICAgIG1OYkJ1ZmZlcisrOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlciBFTkQiKTsKLSAgICByZXR1cm4gbU5iQnVmZmVyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UgKgotICoqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dAotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFN0YWdlRnJpZ2h0IGF1ZGlvCi0gKiAgICAgICAgICAgZW5jb2RlciBzaGVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgICAgICAgICAgICAgbUZvcm1hdDsKLSAgICBNNEVOQ09ERVJfQXVkaW9QYXJhbXMqICAgICAgICAgICAgbUNvZGVjUGFyYW1zOwotICAgIE00RU5DT0RFUl9BdWRpb0RlY1NwZWNpZmljSW5mbyAgICBtRFNJOwotICAgIHNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBtRW5jb2RlclNvdXJjZTsKLSAgICBPTVhDbGllbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudDsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgICAgICAgbUVuY29kZXI7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYklucHV0RnJhbWVzOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJPdXRwdXRGcmFtZXM7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdE91dHB1dEN0czsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RPdXRwdXRDdHM7Ci19IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQ7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbGVhbnVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xlYW51cCBiZWdpbiIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dC0+bURTSS5wSW5mbyk7Ci0gICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dCk7Ci0gICAgcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xlYW51cCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdCBiZWdpbjogZm9ybWF0ICVkIiwgZm9ybWF0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LCBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0LCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIiKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICAqcENvbnRleHQgPSBwRW5jb2RlckNvbnRleHQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAocEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X0FBQyhNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tBQUMsIHBDb250ZXh0LCBwVXNlckRhdGEpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdF9BTVJOQihNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tBTVJOQiwgcENvbnRleHQsIHBVc2VyRGF0YSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X01QMyhNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tNUDMsIHBDb250ZXh0LCBwVXNlckRhdGEpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbG9zZSBiZWdpbiIpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMpOwotCi0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+c3RvcCgpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIuY2xlYXIoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuZGlzY29ubmVjdCgpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UuY2xlYXIoKTsKLQotICAgIEFMT0dWKCJBdWRpb0VuY29kZXJfY2xvc2U6SU4gJWQgZnJhbWVzLE9VVCAlZCBmcmFtZXMgZnJvbSAlbGxkIHRvICVsbGQiLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcywgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMpOwotCi0gICAgaWYoIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgIT0gcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlOnNvbWUgZnJhbWVzIHdlcmUgbm90IGVuY29kZWQgJWQgJWQiLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcywgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyk7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UgYmVnaW4gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvUGFyYW1zICpwUGFyYW1zLCBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gKnBEU0ksCi0gICAgICAgIE00T1NBX0NvbnRleHQgcEdyYWJiZXJDb250ZXh0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIHNwPE1ldGFEYXRhPiBlbmNvZGVyTWV0YWRhdGEgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBOVUxMOwotICAgIGludDMyX3QgaU5iQ2hhbm5lbCA9IDA7Ci0gICAgdWludDMyX3QgY29kZWNGbGFncyA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbiBiZWdpbiIpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBQYXJhbXMsICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERTSSwgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgcERTSS0+cEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBEU0ktPmluZm9TaXplID0gMDsKLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgID0gMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcyA9IDA7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgPSAtMTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0T3V0cHV0Q3RzICA9IC0xOwotCi0gICAgLy8gQWxsb2NhdGUgJiBpbml0aWFsaXplIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4gOiBwYXJhbXMgRj0lZCBDTj0lZCBCUj0lZCBGPSVkIiwKLSAgICAgICAgcFBhcmFtcy0+RnJlcXVlbmN5LCBwUGFyYW1zLT5DaGFubmVsTnVtLCBwUGFyYW1zLT5CaXRyYXRlLAotICAgICAgICBwUGFyYW1zLT5Gb3JtYXQpOwotICAgIFNBRkVfTUFMTE9DKHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLCBNNEVOQ09ERVJfQXVkaW9QYXJhbXMsIDEsCi0gICAgICAgICJWSURFT0VESVRPUiBDb2RlY1BhcmFtcyIpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmVxdWVuY3kgID0gcFBhcmFtcy0+RnJlcXVlbmN5OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5DaGFubmVsTnVtID0gcFBhcmFtcy0+Q2hhbm5lbE51bTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Qml0cmF0ZSAgICA9IHBQYXJhbXMtPkJpdHJhdGU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCAgICAgPSBwUGFyYW1zLT5Gb3JtYXQ7Ci0KLSAgICAvLyBDaGVjayBvdXRwdXQgZm9ybWF0IGNvbnNpc3RlbmN5Ci0gICAgVklERU9FRElUT1JfQ0hFQ0socEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCA9PQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFnZUZyaWdodCBncmFwaCBidWlsZGluZwotICAgICAqLwotICAgIC8vIENyZWF0ZSB0aGUgbWV0YSBkYXRhIGZvciB0aGUgZW5jb2RlcgotICAgIGVuY29kZXJNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQU1STkI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIkF1ZGlvRW5jb2Rlcl9vcGVuIDogaW5jb3JyZWN0IGlucHV0IGZvcm1hdCIsCi0gICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyZXF1ZW5jeSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkJpdHJhdGUpOwotCi0gICAgc3dpdGNoKCBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Q2hhbm5lbE51bSApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01vbm86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlOYkNoYW5uZWwgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa1N0ZXJlbzoKLSAgICAgICAgewotICAgICAgICAgICAgaU5iQ2hhbm5lbCA9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIkF1ZGlvRW5jb2Rlcl9vcGVuIDogaW5jb3JyZWN0IGNoYW5uZWwgbnVtYmVyIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGlOYkNoYW5uZWwpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBlbmNvZGVyIHNvdXJjZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgICAgICBlbmNvZGVyTWV0YWRhdGEpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZS5nZXQoKSwKLSAgICAgICAgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ29ubmVjdCB0byB0aGUgT01YIGNsaWVudAotICAgIHJlc3VsdCA9IHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5jb25uZWN0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIE9NWCBjb2RlYwotI2lmZGVmIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMKLSAgICBjb2RlY0ZsYWdzIHw9IE9NWENvZGVjOjpWSURFT0VESVRPUl9GT1JDRUNPREVDOwotI2VuZGlmIC8qIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMgKi8KLSAgICAvLyBGSVhNRToKLSAgICAvLyBXZSBhcmUgbW92aW5nIGF3YXkgdG8gdXNlIHNvZnR3YXJlIEFBQ0VuY29kZXIgYW5kIGluc3RlYWQgdXNlIE9NWC1iYXNlZAotICAgIC8vIHNvZnR3YXJlIEFBQyBhdWRpbyBlbmNvZGVyLiBXZSB3YW50IHRvIHVzZSBBQUNFbmNvZGVyIGZvciBub3cuIEFmdGVyIHdlCi0gICAgLy8gZml4IHRoZSBpbnRlcmZhY2UgaXNzdWUgd2l0aCB0aGUgT01YLWJhc2VkIEFBQyBhdWRpbyBlbmNvZGVyLCB3ZSBzaG91bGQKLSAgICAvLyB0aGVuIHNldCB0aGUgY29tcG9uZW50IG5hbWUgYmFjayB0byBOVUxMIHRvIGFsbG93IHRoZSBzeXN0ZW0gdG8gcGljayB1cAotICAgIC8vIHRoZSByaWdodCBBQUMgYXVkaW8gZW5jb2Rlci4KLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5pbnRlcmZhY2UoKSwgZW5jb2Rlck1ldGFkYXRhLCB0cnVlLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZSwgIkFBQ0VuY29kZXIiIC8qIGNvbXBvbmVudCBuYW1lICovLAotICAgICAgICAgICAgY29kZWNGbGFncyk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLmdldCgpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBTdGFydCB0aGUgZ3JhcGgKLSAgICByZXN1bHQgPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLT5zdGFydCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gR2V0IEFBQyBEU0ksIHRoaXMgY29kZSBjYW4gb25seSB3b3JrIHdpdGggc29mdHdhcmUgZW5jb2RlcgotICAgIGlmKCBNNEVOQ09ERVJfa0FBQyA9PSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ICkgewotICAgICAgICBpbnQzMl90ICAgICAgaXNDb2RlY0NvbmZpZyA9IDA7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgICAgICAgID0gTlVMTDsKLQotICAgICAgICAvLyBSZWFkIG9uY2UgdG8gZ2V0IHRoZSBEU0kKLSAgICAgICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+cmVhZCgmYnVmZmVyLCBOVUxMKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywKLSAgICAgICAgICAgICZpc0NvZGVjQ29uZmlnKSAmJiBpc0NvZGVjQ29uZmlnLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAgICAgLy8gU2F2ZSB0aGUgRFNJCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bURTSS5pbmZvU2l6ZSA9IChNNE9TQV9VSW50MzIpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LT5tRFNJLnBJbmZvLCBNNE9TQV9JbnQ4LAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRFNJLmluZm9TaXplLCAiRW5jb2RlciBoZWFkZXIiKTsKLQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRW5jb2RlckNvbnRleHQtPm1EU0kucEluZm8sCi0gICAgICAgICAgICAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bURTSS5pbmZvU2l6ZSk7Ci0KLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICpwRFNJID0gcEVuY29kZXJDb250ZXh0LT5tRFNJOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbiA6IERPTkUiKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UocEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyKiBwSW5CdWZmZXIpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50OCogcERhdGEgPSBNNE9TQV9OVUxMOwotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgPSBOVUxMOwotICAgIGludDMyX3QgbmJCdWZmZXIgPSAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBiZWdpbiIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5DaGFubmVsTnVtICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rTW9ubzoKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa1N0ZXJlbzoKLSAgICAgICAgICAgIC8vIExldCB0aGUgTWVkaWFCdWZmZXIgb3duIHRoZSBkYXRhIHNvIHdlIGRvbid0IGhhdmUgdG8gZnJlZSBpdAotICAgICAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKChzaXplX3QpcEluQnVmZmVyLT5wVGFibGVCdWZmZXJTaXplWzBdKTsKLSAgICAgICAgICAgIHBEYXRhID0gKE00T1NBX0ludDgqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBEYXRhLCAodm9pZCAqKXBJbkJ1ZmZlci0+cFRhYmxlQnVmZmVyWzBdLAotICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+cFRhYmxlQnVmZmVyU2l6ZVswXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWRUFFX3Byb2Nlc3NJbnB1dEJ1ZmZlciB1bnN1cHBvcnRlZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gJWQiLAotICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5DaGFubmVsTnVtKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciA6IHN0b3JlICVkIGJ5dGVzIiwKLSAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgLy8gUHVzaCB0aGUgYnVmZmVyIHRvIHRoZSBzb3VyY2UKLSAgICBuYkJ1ZmZlciA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UtPnN0b3JlQnVmZmVyKGJ1ZmZlcik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYoIE5VTEwgIT0gYnVmZmVyICkgewotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyLCBNNEVOQ09ERVJfQXVkaW9CdWZmZXIqIHBPdXRCdWZmZXIpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIEN0cyA9IDA7Ci0gICAgaW50MzJfdCBpMzJUbXAgPSAwOwotICAgIGludDY0X3QgaTY0VG1wID0gMDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGJlZ2luIik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gYnVmZmVyLCAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBPdXRCdWZmZXIsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBQcm9jZXNzIHRoZSByZXR1cm5lZCBBVQotICAgIGlmKCAwID09IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKSB7Ci0gICAgICAgIC8vIEVuY29kZXIgaGFzIG5vIGRhdGEgeWV0LCBub3RoaW5nIHVudXN1YWwKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgOiBidWZmZXIgaXMgZW1wdHkiKTsKLSAgICAgICAgcE91dEJ1ZmZlci0+cFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0gICAgaWYoIGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgJmkzMlRtcCkgJiYgaTMyVG1wICkgewotICAgICAgICAvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHdpdGggc29mdHdhcmUgZW5jb2RlciwKLSAgICAgICAgICogRFNJIHdhcyByZXRyaWV2ZWQgYmVmb3JlaGFuZCAqLwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfU1RBVEUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBDVFMKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmaTY0VG1wKSwKLSAgICAgICAgICAgIE00RVJSX1NUQVRFKTsKLSAgICAgICAgQ3RzID0gKE00T1NBX0ludDMyKShpNjRUbXAvMTAwMCk7Ci0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMrKzsKLSAgICAgICAgaWYoIDAgPiBwRW5jb2RlckNvbnRleHQtPm1GaXJzdE91dHB1dEN0cyApIHsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzID0gaTY0VG1wOwotICAgICAgICB9Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgPSBpNjRUbXA7Ci0KLSAgICAgICAgLy8gRm9ybWF0IHRoZSBBVQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0QnVmZmVyLT5wVGFibGVCdWZmZXJbMF0sCi0gICAgICAgICAgICAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICBwT3V0QnVmZmVyLT5wVGFibGVCdWZmZXJTaXplWzBdID0gKE00T1NBX1VJbnQzMilidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICAvLyBSZWxlYXNlIHRoZSBidWZmZXIKLSAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9zdGVwKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciogcEluQnVmZmVyLCBNNEVOQ09ERVJfQXVkaW9CdWZmZXIqIHBPdXRCdWZmZXIpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgPSBOVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAgYmVnaW4iKTsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBJbkJ1ZmZlciwgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwT3V0QnVmZmVyLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLQotICAgIC8vIFB1c2ggdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgZW5jb2RlciBzb3VyY2UKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LHBJbkJ1ZmZlcik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBSZWFkCi0gICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+cmVhZCgmYnVmZmVyLCBOVUxMKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIFByb3ZpZGUgdGhlIGVuY29kZWQgQVUgdG8gdGhlIHdyaXRlcgotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LCBidWZmZXIsCi0gICAgICAgIHBPdXRCdWZmZXIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfc3RlcCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbiBiZWdpbiBvcHRpb25JRCAweCVYIiwgb3B0aW9uSUQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb24gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb24gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGZvcm1hdCwgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcEZvcm1hdCwgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwRW5jb2RlckludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2UgMHgleCAweCV4IixwRm9ybWF0LAotICAgICAgICBwRW5jb2RlckludGVyZmFjZSk7Ci0gICAgU0FGRV9NQUxMT0MoKnBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UsIDEsCi0gICAgICAgICJBdWRpb0VuY29kZXIiKTsKLQotICAgICpwRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgc3dpdGNoKCBmb3JtYXQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0SW5pdCA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXRfQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0FNUk5COgotICAgICAgICB7Ci0gICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X0FNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QMzoKLSAgICAgICAgewotICAgICAgICAgICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RJbml0ID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdF9NUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlOiB1bnN1cHBvcnRlZCBmb3JtYXQgJWQiLAotICAgICAgICAgICAgICAgIGZvcm1hdCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RDbGVhblVwICAgICAgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbGVhbnVwOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0T3BlbiAgICAgICAgID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbjsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdENsb3NlICAgICAgICA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0U3RlcCAgICAgICAgID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfc3RlcDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEdldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbjsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcEVuY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX2tBQUMsIHBGb3JtYXQsIHBFbmNvZGVySW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BTVJOQigKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX2tBTVJOQiwgcEZvcm1hdCwgcEVuY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QMygKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVAzIG5vIGVycm9yIik7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEVOQ09ERVJfa01QMywgcEZvcm1hdCwgcEVuY29kZXJJbnRlcmZhY2UpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQnVmZmVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0Y2ZhN2MuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckJ1ZmZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JCdWZmZXIuYwotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEJ1ZmZlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSN1bmRlZiBNNE9TQV9UUkFDRV9MRVZFTAotI2RlZmluZSBNNE9TQV9UUkFDRV9MRVZFTCAxCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckJ1ZmZlci5oIgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotCi0jZGVmaW5lIFZJREVPRURJVE9SX0JVRkZFUE9PTF9NQVhfTkFNRV9TSVpFIDQwCi0KLSNkZWZpbmUgVklERU9FRElUT1JfU0FGRV9GUkVFKHApIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgIT0gcCkgXAotICAgIHsgXAotICAgICAgICBmcmVlKHApOyBcCi0gICAgICAgIHAgPSBNNE9TQV9OVUxMOyBcCi0gICAgfSBcCi19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiogcHBvb2wsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycykKLSAqIEBicmllZiAgIEFsbG9jYXRlIGEgcG9vbCBvZiBuYkJ1ZmZlcnMgYnVmZmVycwotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wgdG8gY3JlYXRlCi0gKiBAcGFyYW0gICBuYkJ1ZmZlcnMgIDogSU4gVGhlIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBwb29sCi0gKiBAcGFyYW0gICBwb29sTmFtZSAgIDogSU4gYSBuYW1lIGdpdmVuIHRvIHRoZSBwb29sCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqKiBwcG9vbCwKLSAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycywgTTRPU0FfQ2hhciogcG9vbE5hbWUpCi17Ci0gICAgTTRPU0FfRVJSIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwb29sOwotICAgIE00T1NBX1VJbnQzMiBpbmRleDsKLQotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sIDogcHBvb2wgPSAweCV4IG5iQnVmZmVycyA9ICVkICIsCi0gICAgICAgIHBwb29sLCBuYkJ1ZmZlcnMpOwotCi0gICAgcG9vbCA9IE00T1NBX05VTEw7Ci0gICAgcG9vbCA9IChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgc2l6ZW9mKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKSwgVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLAotICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbDogcG9vbCIpKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwb29sKQotICAgIHsKLSAgICAgICAgbGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICBnb3RvIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2xfQ2xlYW51cDsKLSAgICB9Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCA6IEFsbG9jYXRpbmcgUG9vbCBidWZmZXJzIik7Ci0gICAgcG9vbC0+cE5YUEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcG9vbC0+cE5YUEJ1ZmZlciA9IChWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIpKm5iQnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiQlVGRkVSX2FsbG9jYXRlUG9vbDogcE5YUEJ1ZmZlciIpKTsKLSAgICBpZihNNE9TQV9OVUxMID09IHBvb2wtPnBOWFBCdWZmZXIpCi0gICAgewotICAgICAgICBsZXJyID0gTTRFUlJfQUxMT0M7Ci0gICAgICAgIGdvdG8gVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbF9DbGVhbnVwOwotICAgIH0KLQotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5iQnVmZmVyczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCA6IEFsbG9jYXRpbmcgUG9vbCBuYW1lIGJ1ZmZlciIpOwotICAgIHBvb2wtPnBvb2xOYW1lID0gTTRPU0FfTlVMTDsKLSAgICBwb29sLT5wb29sTmFtZSA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUE9PTF9NQVhfTkFNRV9TSVpFLFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCwKLSAgICAgICAgKE00T1NBX0NoYXIqKSgiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbDogcG9vbG5hbWUiKSk7Ci0gICAgaWYocG9vbC0+cG9vbE5hbWUgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGxlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgZ290byBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sX0NsZWFudXA7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgOiBBc3NpZ25pbmcgUG9vbCBuYW1lIGJ1ZmZlciIpOwotCi0gICAgbWVtc2V0KCh2b2lkICopcG9vbC0+cG9vbE5hbWUsIDAsVklERU9FRElUT1JfQlVGRkVQT09MX01BWF9OQU1FX1NJWkUpOwotICAgIG1lbWNweSgodm9pZCAqKXBvb2wtPnBvb2xOYW1lLCAodm9pZCAqKXBvb2xOYW1lLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVBPT0xfTUFYX05BTUVfU0laRS0xKTsKLQotICAgIHBvb2wtPk5CID0gbmJCdWZmZXJzOwotCi1WSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sX0NsZWFudXA6Ci0gICAgaWYoTTROT19FUlJPUiAhPSBsZXJyKQotICAgIHsKLSAgICAgICAgVklERU9FRElUT1JfU0FGRV9GUkVFKHBvb2wtPnBOWFBCdWZmZXIpOwotICAgICAgICBWSURFT0VESVRPUl9TQUZFX0ZSRUUocG9vbC0+cG9vbE5hbWUpOwotICAgICAgICBWSURFT0VESVRPUl9TQUZFX0ZSRUUocG9vbCk7Ci0gICAgfQotICAgICpwcG9vbCA9IHBvb2w7Ci0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgRU5EIik7Ci0KLSAgICByZXR1cm4gbGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wpCi0gKiBAYnJpZWYgICBEZWFsbG9jYXRlIGEgYnVmZmVyIHBvb2wKLSAqCi0gKiBAcGFyYW0gICBwcG9vbCAgICAgIDogSU4gVGhlIGJ1ZmZlciBwb29sIHRvIGZyZWUKLSAqIEByZXR1cm4gIEVycm9yIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiAgaiA9IDA7Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sIDogcHBvb2wgPSAweCV4IiwgcHBvb2wpOwotCi0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGZvciAoaiA9IDA7IGogPCBwcG9vbC0+TkI7IGorKykKLSAgICB7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEpOwotICAgICAgICAgICAgcHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocHBvb2wgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIFNBRkVfRlJFRShwcG9vbC0+cE5YUEJ1ZmZlcik7Ci0gICAgICAgIFNBRkVfRlJFRShwcG9vbC0+cG9vbE5hbWUpOwotICAgICAgICBTQUZFX0ZSRUUocHBvb2wpOwotICAgIH0KLQotICAgIHJldHVybihlcnIpOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wsCi0gKiAgICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKQotICogQGJyaWVmICAgUmV0dXJucyBhIGJ1ZmZlciBpbiBhIGdpdmVuIHN0YXRlCi0gKgotICogQHBhcmFtICAgcHBvb2wgICAgICA6IElOIFRoZSBidWZmZXIgcG9vbAotICogQHBhcmFtICAgZGVzaXJlZFN0YXRlIDogSU4gVGhlIGJ1ZmZlciBzdGF0ZQotICogQHBhcmFtICAgcE5YUEJ1ZmZlciA6IElOIFRoZSBzZWxlY3RlZCBidWZmZXIKLSAqIEByZXR1cm4gIEVycm9yIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9TdGF0ZSBkZXNpcmVkU3RhdGUsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0Jvb2wgYkZvdW5kID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfVUludDMyIGksIGlidWY7Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlciBmcm9tICVzIGluIHN0YXRlPSVkIiwKLSAgICAgICAgcHBvb2wtPnBvb2xOYW1lLCBkZXNpcmVkU3RhdGUpOwotCi0gICAgaWJ1ZiA9IDA7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IHBwb29sLT5OQjsgaSsrKQotICAgIHsKLSAgICAgICAgYkZvdW5kID0gKHBwb29sLT5wTlhQQnVmZmVyW2ldLnN0YXRlID09IGRlc2lyZWRTdGF0ZSk7Ci0gICAgICAgIGlmIChiRm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlidWYgPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZighYkZvdW5kKQotICAgIHsKLSAgICAgICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIgTm8gYnVmZmVyIGF2YWlsYWJsZSBpbiBzdGF0ZSAlZCIsCi0gICAgICAgICAgICBkZXNpcmVkU3RhdGUpOwotICAgICAgICAqcE5YUEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFOwotICAgIH0KLQotICAgIC8qIGNhc2Ugd2hlcmUgYSBidWZmZXIgaGFzIGJlZW4gZm91bmQgKi8KLSAgICAqcE5YUEJ1ZmZlciA9ICYocHBvb2wtPnBOWFBCdWZmZXJbaWJ1Zl0pOwotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXI6IGlkeCA9ICVkIiwgaWJ1Zik7Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9pbml0UG9vbEJ1ZmZlcnMoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBvb2wsCi0gICAgTTRPU0FfVUludDMyIGxTaXplKQotewotICAgIE00T1NBX0VSUiAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgIGluZGV4LCBqOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIHBvb2wgKi8KLSAgICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IHBvb2wtPk5COyBpbmRleCsrKQotICAgIHsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0ucERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5wRGF0YSA9IChNNE9TQV9Wb2lkKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICBsU2l6ZSwgVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLAotICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiQlVGRkVSX2luaXRQb29sQnVmZmVyczogQnVmZmVyIGRhdGEiKSk7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgPT0gcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0ucERhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbmRleDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgIT0gcG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5zaXplID0gMDsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uc3RhdGUgPSBWSURFT0VESVRPUl9CVUZGRVJfa0VtcHR5OwotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5pZHggPSBpbmRleDsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uYnVmZkNUUyA9IC0xOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldE9sZGVzdEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCAqcG9vbCwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX1N0YXRlIGRlc2lyZWRTdGF0ZSwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcioqIHBOWFBCdWZmZXIpCi17Ci0gICAgTTRPU0FfRVJSICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiAgaW5kZXgsIGo7Ci0gICAgTTRfTWVkaWFUaW1lICBjYW5kaWRhdGVUaW1lU3RhbXAgPSAoTTRfTWVkaWFUaW1lKTB4N2ZmZmZmZjsKLSAgICBNNE9TQV9Cb29sICAgIGJGb3VuZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgKnBOWFBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIGZvcihpbmRleCA9IDA7IGluZGV4PCBwb29sLT5OQjsgaW5kZXgrKykKLSAgICB7Ci0gICAgICAgIGlmKHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnN0YXRlID09IGRlc2lyZWRTdGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uYnVmZkNUUyA8PSBjYW5kaWRhdGVUaW1lU3RhbXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBjYW5kaWRhdGVUaW1lU3RhbXAgPSBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5idWZmQ1RTOwotICAgICAgICAgICAgICAgICAgICAqcE5YUEJ1ZmZlciA9ICYocG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKE00T1NBX0ZBTFNFID09IGJGb3VuZCkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfZ2V0T2xkZXN0QnVmZmVyIFdBUk5JTkcgbm8gYnVmZmVyIGF2YWlsYWJsZSIpOwotICAgICAgICBlcnIgPSBNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvck1wM1JlYWRlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWY1M2M1NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIE1QMyBSZWFkZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl9NUDNSRUFERVIiCi0KLS8qKgotICogSEVBREVSUwotICoKLSAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTXAzUmVhZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0vKioKLSAqIFNPVVJDRSBDTEFTUwotICovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8qKgotICogRU5HSU5FIElOVEVSRkFDRQotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dAotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFNGIE1QMyByZWFkZXIgc2hlbGwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHNwPERhdGFTb3VyY2U+ICAgICAgICAgICAgICBtRGF0YVNvdXJjZTsKLSAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gICAgICAgICAgbUV4dHJhY3RvcjsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgbU1lZGlhU291cmNlOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgICBtQXVkaW9BdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbU1heER1cmF0aW9uOwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICBtU3RyZWFtTnVtYmVyOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBtU2Vla2luZzsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtRXh0cmFjdG9yRmxhZ3M7Ci19IFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIE1QMyByZWFkZXIKLSAqIEBub3RlICAgICBhbGxvY2F0ZXMgdGhlIGNvbnRleHQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoT1VUKSAgICBwb2ludGVyIG9uIGEgcmVhZGVyIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9jcmVhdGUgYmVnaW4iKTsKLQotICAgIC8qIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uICovCi0gICAgU0FGRV9NQUxMT0MocFJlYWRlckNvbnRleHQsIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlciIpOwotCi0gICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tTWF4RHVyYXRpb24gPSAwOwotICAgICpwQ29udGV4dCA9IHBSZWFkZXJDb250ZXh0OwotCi1jbGVhblVwOgotICAgIGlmIChNNE5PX0VSUk9SID09IGVycikgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgIGRlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIHRoZSBNUDMgcmVhZGVyCi0gKiBAbm90ZSAgICAgIGFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKiBAcGFyYW0gICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBUaGUgaW5wdXQgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmVhZGVyQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZGVzdHJveSBiZWdpbiIpOwotCi0gICAgU0FGRV9GUkVFKHBSZWFkZXJDb250ZXh0KTsKLWNsZWFuVXA6Ci0gICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBvcGVuIHRoZSByZWFkZXIgYW5kIGluaXRpYWxpemVzIGl0cyBjcmVhdGVkIGluc3RhbmNlCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBNUDMgZmlsZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwRmlsZURlc2NyaXB0b3I6ICAgIChJTikgICAgUG9pbnRlciB0byBwcm9wcmlldGFyeSBkYXRhIGlkZW50aWZ5aW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZWRpYSB0byBvcGVuCi0KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFICAgdGhlIG1lZGlhIGlzIERSTSBwcm90ZWN0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcil7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gYmVnaW4iKTsKLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJlYWRlckNvbnRleHQpLCAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbjogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEZpbGVEZXNjcmlwdG9yKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBzdGFydCAlcyIsCi0gICAgICAgIChjaGFyKilwRmlsZURlc2NyaXB0b3IpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlICgoY2hhciopcEZpbGVEZXNjcmlwdG9yKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBEYXRhc291cmNlIGVuZCIpOwotCi0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIERhdGFzb3VyY2UgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXh0cmFjdG9yIHN0YXJ0Iik7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKAotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UsTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXh0cmFjdG9yIGVuZCIpOwotCi0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yID09IE5VTEwpICAgIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXh0cmFjdG9yIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLSAgICBwUmVhZGVyQ29udGV4dC0+bVN0cmVhbU51bWJlciA9IDA7Ci0KLSAgICBpbnQzMl90IGlzRFJNUHJvdGVjdGVkID0gMDsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOwotICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5SXNEUk0sICZpc0RSTVByb3RlY3RlZCk7Ci0gICAgaWYgKGlzRFJNUHJvdGVjdGVkKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGVycm9yIC0gRFJNIFByb3RlY3RlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRTsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjbG9zZSB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGNsb3NlcyB0aGUgTVAzIHJlYWRlcgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY2xvc2UgYmVnaW4iKTsKLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZWFkZXJDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgZnJlZShwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pOwotICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLlwKLSAgICAgICAgICAgICAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5cCi0gICAgICAgICAgICAgICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGRlc3Ryb3kgdGhlIHN0cmVhbSBoYW5kbGVyICovCi0gICAgICAgIGZyZWUocFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdS5kYXRhQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdS5kYXRhQWRkcmVzcyk7Ci0gICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS0+c3RvcCgpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UuY2xlYXIoKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci5jbGVhcigpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZS5jbGVhcigpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZ2V0IGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSByZWFkZXIKLSAqIEBub3RlCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBnZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgKE9VVCkgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdXNlcikgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE9wdGlvbiBiZWdpbjogb3B0aW9uSWQ9ICVkICIsKGludClvcHRpb25JZCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJlYWRlckNvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpIHsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9EdXJhdGlvbjoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIk1wM1JlYWRlciBkdXJhdGlvbj0lbGQiLHBSZWFkZXJDb250ZXh0LT5tTWF4RHVyYXRpb24pOwotICAgICAgICAgICAgKihNNE9TQV9UaW1lKilwVmFsdWUgPSBwUmVhZGVyQ29udGV4dC0+bU1heER1cmF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZToKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwQml0cmF0ZSA9IChNNE9TQV9VSW50MzIqKXBWYWx1ZTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEJpdHJhdGUgPSAwOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YxVGFnOgotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YyVGFnOgotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0dldE1ldGFkYXRhOgotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uOiAgTTRFUlJfQkFEX09QVElPTl9JRCIpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgYW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIG9wdGlvbklkOiAgIChJTikgICAgICAgIElkZW50aWZpZXIgaW5kaWNhdGluZyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgcFZhbHVlOiAgICAgKElOKSAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdXNlcikgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICBUaGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgb3B0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCBiZWdpbjogb3B0aW9uSWQ6ICVkIFZhbHVlOiAlZCAiLAotICAgICAgICAoaW50KW9wdGlvbklkLChpbnQpcFZhbHVlKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmVhZGVyQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBWYWx1ZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgdmFsdWUgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKG9wdGlvbklkKSB7Ci0gICAgICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyOgotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgIChJTikgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcihJTikgICBzdHJlYW0gZGVzY3JpcHRpb24gb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgICBwVGltZSAgICAgICAgIChJL08pSU46dGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIE00T1NBX0ludDMyKiBwVGltZSkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiBwQXU7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcCBiZWdpbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLQotICAgIGlmKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwUmVhZGVyQ29udGV4dC0+XAotICAgICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyKXsKLSAgICAgICAgcEF1ID0gJnBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgc3RyZWFtSWRBcnJheVswXSA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXAgdGltZSBtcyAlbGQgIiwgdGltZTY0KTsKLQotICAgIHBBdS0+Q1RTID0gdGltZTY0OwotICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgdGltZTY0ID0gdGltZTY0ICogMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pY3JvIHNlYyAqLwotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wIHRpbWUgdXMgJWxkICIsIHRpbWU2NCk7Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bVNlZWtpbmcgPSBNNE9TQV9UUlVFOwotICAgIHBSZWFkZXJDb250ZXh0LT5tU2Vla1RpbWUgPSB0aW1lNjQ7Ci0KLSAgICB0aW1lNjQgPSB0aW1lNjQgLyAxMDAwOyAvKiBDb252ZXJ0IHRoZSB0aW1lIGludG8gbWlsbGkgc2VjICovCi0gICAgKnBUaW1lID0gKE00T1NBX0ludDMyKXRpbWU2NDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcCBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldCB0aGUgbmV4dCBzdHJlYW0gZm91bmQgaW4gdGhlIG1lZGlhIGZpbGUKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBNZWRpYUZhbWlseTogICAoT1VUKSBwb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZWRpYSBmYW1pbHkgb2YgdGhlIGZvdW5kIHN0cmVhbQotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAoT1VUKSBwb2ludGVyIHRvIGEgc3RyZWFtIGhhbmRsZXIgdGhhdCB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBhbmQgZmlsbGVkIHdpdGggc3RyZWFtIGRlc2NyaXB0aW9uCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00V0FSX05PX01PUkVfU1RSRUFNICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00UkVBREVSX01lZGlhRmFtaWx5ICpwTWVkaWFGYW1pbHksCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlclBhcmFtKSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uIHN0cmVhbURlc2M7Ci0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00X1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyOwotICAgIE00T1NBX1VJbnQ4IHR5cGUsIHRlbXA7Ci0gICAgTTRPU0FfQm9vbCBoYXZlQXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IE5VTEw7Ci0gICAgaW50NjRfdCBEdXJhdGlvbjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIGJlZ2luIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmVhZGVyQ29udGV4dCA9PSAwKSwgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBNZWRpYUZhbWlseSA9PSAwKSwgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW06IGludmFsaWQgcG9pbnRlciB0byBNZWRpYUZhbWlseSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXJQYXJhbSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIHN0cmVhbSBudW1iZXIgPSAlZCIsCi0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tU3RyZWFtTnVtYmVyKTsKLSAgICBpZiAocFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXIgPj0gMSkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBtYXggbnVtYmVyIG9mIHN0cmVhbSByZWFjaGVkIik7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgcFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXIgPSBwUmVhZGVyQ29udGV4dC0+bVN0cmVhbU51bWJlciArIDE7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gbnVtYmVyIG9mIFRyYWNrcyVkIiwKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCkpOwotICAgIGZvciAodGVtcCA9IDA7IHRlbXAgPCBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsgdGVtcCsrKSB7Ci0gICAgICAgIG1ldGEgPSBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSh0ZW1wKTsKLSAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgICAgIGlmICghaGF2ZUF1ZGlvICYmICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKLSAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UgPQotICAgICAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLT5nZXRUcmFjayh0ZW1wKTsKLSAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UtPnN0YXJ0KCk7Ci0gICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhdmVBdWRpbykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWhhdmVBdWRpbykgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBubyBtb3JlIHN0cmVhbSAiKTsKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1EYXRhU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3RvckZsYWdzID0gcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3ItPmZsYWdzKCk7Ci0gICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotCi0gICAgc3RyZWFtRGVzYy5kdXJhdGlvbiA9IG1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZEdXJhdGlvbik7Ci0gICAgc3RyZWFtRGVzYy5kdXJhdGlvbiA9IChNNE9TQV9UaW1lKUR1cmF0aW9uLzEwMDA7Ci0KLSAgICBtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsIChpbnQzMl90Kikmc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZSk7Ci0gICAgbWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAoaW50MzJfdCopJnN0cmVhbURlc2MudGltZVNjYWxlKTsKLSAgICBBTE9HVigiQml0cmF0ZSA9ICVkLCBTYW1wbGVSYXRlID0gJWQgZHVyYXRpb24gPSAlbGxkIiwKLSAgICAgICAgc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZSxzdHJlYW1EZXNjLnRpbWVTY2FsZSxEdXJhdGlvbi8xMDAwKTsKLQotICAgIHN0cmVhbURlc2Muc3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgc3RyZWFtRGVzYy5wcm9maWxlTGV2ZWwgPSAweEZGIDsKLSAgICBzdHJlYW1EZXNjLnN0cmVhbUlEID0gcFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXI7Ci0gICAgc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICBzdHJlYW1EZXNjLm1heEJpdHJhdGUgPSBzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlOwotCi0gICAgLyogICAgQWxsb2NhdGUgdGhlIGF1ZGlvIHN0cmVhbSBoYW5kbGVyIGFuZCBzZXQgaXRzIHBhcmFtZXRlcnMgICAgKi8KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKSwgTTRSRUFERVJfTVAzLAotICAgICAgICAoTTRPU0FfQ2hhciopIk00X0F1ZGlvU3RyZWFtSGFuZGxlciIpOwotCi0gICAgaWYgKHBBdWRpb1N0cmVhbUhhbmRsZXIgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBtYWxsb2MgZmFpbGVkIik7Ci0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS5jbGVhcigpOwotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UuY2xlYXIoKTsKLQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHBTdHJlYW1IYW5kbGVyID0oTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICpwU3RyZWFtSGFuZGxlclBhcmFtID0gcFN0cmVhbUhhbmRsZXI7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBwQXVkaW9TdHJlYW1IYW5kbGVyOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlcik7Ci0KLSAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIG1ldGEgaXMgTlVMTCIpOwotICAgIH0KLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSBzdHJlYW1EZXNjLnRpbWVTY2FsZTsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgIChNNE9TQV9VSW50OCopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICBzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotCi0gICAgbWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsCi0gICAgICAgIChpbnQzMl90KikmcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzKTsKLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9IDExNTI7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSA9IDI7Ci0KLSAgICBwU3RyZWFtSGFuZGxlci0+bV9wVXNlckRhdGEgPSBOVUxMOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkID0gc3RyZWFtRGVzYy5zdHJlYW1JRDsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9kdXJhdGlvbiA9IHN0cmVhbURlc2MuZHVyYXRpb247Ci0gICAgcFJlYWRlckNvbnRleHQtPm1NYXhEdXJhdGlvbiA9IHN0cmVhbURlc2MuZHVyYXRpb247Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fYXZlcmFnZUJpdFJhdGUgPSBzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlOwotCi0gICAgcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplID0gMDsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGZpbGwgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSB3aXRoIGluaXRpYWxpemF0aW9uIHZhbHVlcwotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICAgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8gd2hpY2gKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjY2VzcyB1bml0IHdpbGwgYmUgYXNzb2NpYXRlZAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0OiAgICAoSU4vT1VUKSBwb2ludGVyIHRvIHRoZSBhY2Nlc3MgdW5pdCAoYWxsb2NhdGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIpIHRvIGluaXRpYWxpemUKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3QoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX0FjY2Vzc1VuaXQgKnBBdTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0IGludmFsaWQgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdCBzdGFydCAiKTsKLSAgICBpZihwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcFJlYWRlckNvbnRleHQtPlwKLSAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcil7Ci0gICAgICAgIHBBdSA9ICZwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgcEF1IHN0cnVjdHVyZSAqLwotICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBBdS0+c2l6ZSAgICAgICAgPSAwOwotICAgIHBBdS0+Q1RTICAgICAgICAgPSAwOwotICAgIHBBdS0+RFRTICAgICAgICAgPSAwOwotICAgIHBBdS0+YXR0cmlidXRlICAgPSAwOwotICAgIHBBdS0+bmJGcmFnICAgICAgPSAwOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwQWNjZXNzVW5pdCBzdHJ1Y3R1cmUgKi8KLSAgICBwQWNjZXNzVW5pdC0+bV9zaXplICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fRFRTICAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzICA9IE00T1NBX05VTEw7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fbWF4c2l6ZSAgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cmVhbUlEICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cnVjdFNpemUgICA9IHNpemVvZihNNF9BY2Nlc3NVbml0KTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3QgZW5kIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICByZXNldCB0aGUgc3RyZWFtLCBpLmUgc2VlayBpdCB0byB0aGUgYmVnaW5uaW5nCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBjb250ZXh0OiAgICAgICAgICAoSU4pICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gcmVzZXQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyKSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogcEF1OwotICAgIE00T1NBX1RpbWUgdGltZTY0ID0gMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldCBzdGFydCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX3Jlc2V0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcFJlYWRlckNvbnRleHQtPlwKLSAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBwQXUgPSAmcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBzdHJlYW1JZEFycmF5WzBdID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0gICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bVNlZWtpbmcgPSBNNE9TQV9UUlVFOwotICAgIHBSZWFkZXJDb250ZXh0LT5tU2Vla1RpbWUgPSB0aW1lNjQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldHMgYW4gYWNjZXNzIHVuaXQgKEFVKSBmcm9tIHRoZSBzdHJlYW0gaGFuZGxlciBzb3VyY2UuCi0gKiBAbm90ZSAgICBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBkZWNvZGVyCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgICAgKElOKSBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyIChJTikgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdCAgICAoSS9PKVBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQgdG8gZmlsbCB3aXRoIHJlYWQgZGF0YQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm5zICAgTTRFUlJfQUxMT0MgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJucyAgIE00V0FSX05PX01PUkVfQVUgIHRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogcEF1OwotICAgIE1lZGlhQnVmZmVyICptQXVkaW9CdWZmZXI7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1IHN0YXJ0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmVhZGVyQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwUmVhZGVyQ29udGV4dC0+XAotICAgICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgIHBBdSA9ICZwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdTogU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwUmVhZGVyQ29udGV4dC0+bVNlZWtpbmcpIHsKLSAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8ocFJlYWRlckNvbnRleHQtPm1TZWVrVGltZSk7Ci0gICAgfQotCi0gICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS0+cmVhZCgmbUF1ZGlvQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICBpZiAobUF1ZGlvQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKChwQXUtPmRhdGFBZGRyZXNzID09IE5VTEwpIHx8Ci0gICAgICAgICAgICAocEF1LT5zaXplIDwgbUF1ZGlvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkpIHsKLSAgICAgICAgICAgIGlmIChwQXUtPmRhdGFBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKChNNE9TQV9JbnQzMiopcEF1LT5kYXRhQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gKE00T1NBX0ludDMyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgKG1BdWRpb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyAzKSAmIH4weDMsCi0gICAgICAgICAgICAgICAgTTRSRUFERVJfTVAzLCAoTTRPU0FfQ2hhciopInBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzIiApOwotCi0gICAgICAgICAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdSBtYWxsb2MgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UuY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQXUtPnNpemUgPSBtQXVkaW9CdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBtZW1jcHkoKE00T1NBX01lbUFkZHI4KXBBdS0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAoY29uc3QgY2hhciAqKW1BdWRpb0J1ZmZlci0+ZGF0YSgpICsgbUF1ZGlvQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgIG1BdWRpb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotCi0gICAgICAgIG1BdWRpb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgKGludDY0X3QqKSZwQXUtPkNUUyk7Ci0KLQotICAgICAgICBwQXUtPkNUUyA9IHBBdS0+Q1RTIC8gMTAwMDsgLypjb252ZXJ0aW5nIHRoZSBtaWNyb3NlYyB0byBtaWxsaXNlYyAqLwotICAgICAgICBwQXUtPkRUUyAgPSBwQXUtPkNUUzsKLSAgICAgICAgcEF1LT5hdHRyaWJ1dGUgPSBNNFNZU19rRnJhZ0F0dHJPazsKLSAgICAgICAgbUF1ZGlvQnVmZmVyLT5yZWxlYXNlKCk7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdSBBVSBDVFMgPSAlbGQiLHBBdS0+Q1RTKTsKLQotICAgICAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyA9IChNNE9TQV9JbnQ4KikgcEF1LT5kYXRhQWRkcmVzczsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSA9IHBBdS0+c2l6ZTsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fQ1RTID0gcEF1LT5DVFM7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX0RUUyA9IHBBdS0+RFRTOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgPSBwQXUtPmF0dHJpYnV0ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1IEVPUyByZWFjaGVkLiIpOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplPTA7Ci0gICAgICAgIGVyciA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgfQotICAgIHBBdS0+bmJGcmFnID0gMDsKLQotICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bVNlZWtpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBtQXVkaW9CdWZmZXIgPSBOVUxMOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXUgZW5kIik7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2U6IGJlZ2luIik7Ci0gICAgLyogSW5wdXQgcGFyYW1ldGVycyBjaGVjayAqLwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcE1lZGlhVHlwZSwgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFJkckdsb2JhbEludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZHJEYXRhSW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgU0FGRV9NQUxMT0MoKnBSZHJHbG9iYWxJbnRlcmZhY2UsIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSIpOwotICAgIFNBRkVfTUFMTE9DKCpwUmRyRGF0YUludGVyZmFjZSwgTTRSRUFERVJfRGF0YUludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSIpOwotCi0gICAgKnBNZWRpYVR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlTVAzOwotCi0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlICAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3k7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0T3BlbiAgICAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RDbG9zZSAgICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9jbG9zZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRPcHRpb247Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfc2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldE5leHRTdHJlYW0gPQotICAgICAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEZpbGxBdVN0cnVjdCA9Ci0gICAgICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTdGFydCAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0b3AgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0SnVtcCAgICAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RSZXNldCAgICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRQcmV2UmFwVGltZSA9IE00T1NBX05VTEw7Ci0KLSAgICAoKnBSZHJEYXRhSW50ZXJmYWNlKS0+bV9wRmN0R2V0TmV4dEF1ICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXU7Ci0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcmVhZGVyQ29udGV4dCAgICAgID0gTTRPU0FfTlVMTDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBTQUZFX0ZSRUUoKnBSZHJHbG9iYWxJbnRlcmZhY2UpOwotICAgICAgICBTQUZFX0ZSRUUoKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlOiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotfSAgLyogZXh0ZXJuICJDIiAqLwotfSAgLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JVdGlscy5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTcyMzdkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JVdGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yVXRpbHMuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgVXRpbGl0aWVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiU0ZfdXRpbHMiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvclV0aWxzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLQotLyogQW5kcm9pZCBpbmNsdWRlcyovCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICBERUJVRyBMRVZFTCBTRVRVUCAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgTE9HMSBBTE9HRSAgICAvKkVSUk9SUyBMb2dnaW5nKi8KLSNkZWZpbmUgTE9HMiBBTE9HSSAgICAvKldBUk5JTkcgTG9nZ2luZyovCi0jZGVmaW5lIExPRzMgLy9BTE9HViAgLypDT01NRU5UUyBMb2dnaW5nKi8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi12b2lkIGRpc3BsYXlNZXRhRGF0YShjb25zdCBzcDxNZXRhRGF0YT4gbWV0YSkgewotCi0gICAgY29uc3QgY2hhciogY2hhckRhdGE7Ci0gICAgaW50MzJfdCBpbnQzMkRhdGE7Ci0gICAgaW50NjRfdCBpbnQ2NERhdGE7Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkKiBkYXRhOwotICAgIHZvaWQqIHB0cjsKLSAgICBzaXplX3Qgc2l6ZTsKLQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlNSU1FVHlwZSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5V2lkdGggJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5SGVpZ2h0ICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUlGcmFtZXNJbnRlcnZhbCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVN0cmlkZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlTdHJpZGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlTbGljZUhlaWdodCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlTbGljZUhlaWdodCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlDaGFubmVsQ291bnQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVNhbXBsZVJhdGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUJpdFJhdGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5RVNEUyB0eXBlPSVkIHNpemU9JWQiLCB0eXBlLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFWQ0MgZGF0YT0weCVYIHR5cGU9JWQgc2l6ZT0lZCIsCi0gICAgICAgICAgICAqKCh1bnNpZ25lZCBpbnQqKWRhdGEpLCB0eXBlLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVZvcmJpc0luZm8gdHlwZT0lZCBzaXplPSVkIiwgdHlwZSwgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzQm9va3MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Vm9yYmlzQm9va3MgdHlwZT0lZCBzaXplPSVkIiwgdHlwZSwgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVdhbnRzTkFMRnJhZ21lbnRzLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVdhbnRzTkFMRnJhZ21lbnRzICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5SXNTeW5jRnJhbWUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUlzQ29kZWNDb25maWcgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlUaW1lLCAmaW50NjREYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVRpbWUgJWxsZCIsIGludDY0RGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUR1cmF0aW9uLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUR1cmF0aW9uICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Q29sb3JGb3JtYXQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZFBvaW50ZXIoa0tleVBsYXRmb3JtUHJpdmF0ZSwgJnB0cikpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlQbGF0Zm9ybVByaXZhdGUgcG9pbnRlcj0weCV4IiwgKGludDMyX3QpIHB0cik7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleURlY29kZXJDb21wb25lbnQgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUJ1ZmZlcklELCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUJ1ZmZlcklEICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleU1heElucHV0U2l6ZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZpbnQ2NERhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VGh1bWJuYWlsVGltZSAlbGxkIiwgaW50NjREYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBbGJ1bSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUFydGlzdCwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFydGlzdCAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBbGJ1bUFydGlzdCwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtQXJ0aXN0ICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUNvbXBvc2VyLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Q29tcG9zZXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5R2VucmUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlHZW5yZSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlUaXRsZSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVRpdGxlICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleVllYXIsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlZZWFyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUFsYnVtQXJ0LCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtQXJ0IHR5cGU9JWQgc2l6ZT0lZCIsIHR5cGUsIHNpemUpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtQXJ0TUlNRSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBdXRob3IsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBdXRob3IgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUNEVHJhY2tOdW1iZXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGlzY051bWJlciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleURpc2NOdW1iZXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGF0ZSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleURhdGUgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5V3JpdGVyLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5V3JpdGVyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlUaW1lU2NhbGUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VGltZVNjYWxlICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVZpZGVvUHJvZmlsZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVZpZGVvTGV2ZWwsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VmlkZW9MZXZlbCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleTY0Qml0RmlsZU9mZnNldCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXk2NEJpdEZpbGVPZmZzZXQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlGaWxlVHlwZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlGaWxlVHlwZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRyYWNrVGltZVN0YXR1cywgJmludDY0RGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlUcmFja1RpbWVTdGF0dXMgJWxsZCIsIGludDY0RGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVJlYWxUaW1lUmVjb3JkaW5nLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVJlYWxUaW1lUmVjb3JkaW5nICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci19Ci0KLS8qKgotICogVGhpcyBjb2RlIHdhcyBleHRyYWN0ZWQgZnJvbSBTdGFnZUZyaWdodCBNUEVHNCB3cml0ZXIKLSAqIElzIGlzIHVzZWQgdG8gcGFyc2UgYW5kIGZvcm1hdCB0aGUgQVZDIGNvZGVjIHNwZWNpZmljIGluZm8gcmVjZWl2ZWQKLSAqIGZyb20gU3RhZ2VGcmlnaHQgZW5jb2RlcnMKLSAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQgPSAweDA3Owotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05hbFVuaXRUeXBlUGljUGFyYW1TZXQgPSAweDA4Owotc3RydWN0IEFWQ1BhcmFtU2V0IHsKLSAgICBBVkNQYXJhbVNldCh1aW50MTZfdCBsZW5ndGgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpCi0gICAgICAgIDogbUxlbmd0aChsZW5ndGgpLCBtRGF0YShkYXRhKSB7fQotCi0gICAgdWludDE2X3QgbUxlbmd0aDsKLSAgICBjb25zdCB1aW50OF90ICptRGF0YTsKLX07Ci1zdHJ1Y3QgQVZDQ29kZWNTcGVjaWZpY0NvbnRleHQgewotICAgIExpc3Q8QVZDUGFyYW1TZXQ+IG1TZXFQYXJhbVNldHM7Ci0gICAgTGlzdDxBVkNQYXJhbVNldD4gbVBpY1BhcmFtU2V0czsKLSAgICB1aW50OF90IG1Qcm9maWxlSWRjOwotICAgIHVpbnQ4X3QgbVByb2ZpbGVDb21wYXRpYmxlOwotICAgIHVpbnQ4X3QgbUxldmVsSWRjOwotfTsKLQotY29uc3QgdWludDhfdCAqcGFyc2VQYXJhbVNldChBVkNDb2RlY1NwZWNpZmljQ29udGV4dCogcEMsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW5ndGgsIGludCB0eXBlLCBzaXplX3QgKnBhcmFtU2V0TGVuKSB7Ci0gICAgQ0hFQ0sodHlwZSA9PSBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldCB8fAotICAgICAgICAgIHR5cGUgPT0ga05hbFVuaXRUeXBlUGljUGFyYW1TZXQpOwotCi0gICAgc2l6ZV90IGJ5dGVzTGVmdCA9IGxlbmd0aDsKLSAgICB3aGlsZSAoYnl0ZXNMZWZ0ID4gNCAgJiYKLSAgICAgICAgICAgIG1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsICZkYXRhW2xlbmd0aCAtIGJ5dGVzTGVmdF0sIDQpKSB7Ci0gICAgICAgIC0tYnl0ZXNMZWZ0OwotICAgIH0KLSAgICBpZiAoYnl0ZXNMZWZ0IDw9IDQpIHsKLSAgICAgICAgYnl0ZXNMZWZ0ID0gMDsgLy8gTGFzdCBwYXJhbWV0ZXIgc2V0Ci0gICAgfQotICAgIGNvbnN0IHVpbnQ4X3QgKm5leHRTdGFydENvZGUgPSAmZGF0YVtsZW5ndGggLSBieXRlc0xlZnRdOwotICAgICpwYXJhbVNldExlbiA9IG5leHRTdGFydENvZGUgLSBkYXRhOwotICAgIGlmICgqcGFyYW1TZXRMZW4gPT0gMCkgewotICAgICAgICBBTE9HRSgiUGFyYW0gc2V0IGlzIG1hbGZvcm1lZCwgc2luY2UgaXRzIGxlbmd0aCBpcyAwIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIEFWQ1BhcmFtU2V0IHBhcmFtU2V0KCpwYXJhbVNldExlbiwgZGF0YSk7Ci0gICAgaWYgKHR5cGUgPT0ga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQpIHsKLSAgICAgICAgaWYgKCpwYXJhbVNldExlbiA8IDQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJTZXEgcGFyYW1ldGVyIHNldCBtYWxmb3JtZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQy0+bVNlcVBhcmFtU2V0cy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBwQy0+bVByb2ZpbGVJZGMgPSBkYXRhWzFdOwotICAgICAgICAgICAgcEMtPm1Qcm9maWxlQ29tcGF0aWJsZSA9IGRhdGFbMl07Ci0gICAgICAgICAgICBwQy0+bUxldmVsSWRjID0gZGF0YVszXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwQy0+bVByb2ZpbGVJZGMgIT0gZGF0YVsxXSB8fAotICAgICAgICAgICAgICAgIHBDLT5tUHJvZmlsZUNvbXBhdGlibGUgIT0gZGF0YVsyXSB8fAotICAgICAgICAgICAgICAgIHBDLT5tTGV2ZWxJZGMgIT0gZGF0YVszXSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJJbmNvbnNpc3RlbnQgcHJvZmlsZS9sZXZlbCBmb3VuZCBpbiBzZXEgcGFyYW1ldGVyIHNldHMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+bVNlcVBhcmFtU2V0cy5wdXNoX2JhY2socGFyYW1TZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDLT5tUGljUGFyYW1TZXRzLnB1c2hfYmFjayhwYXJhbVNldCk7Ci0gICAgfQotICAgIHJldHVybiBuZXh0U3RhcnRDb2RlOwotfQotCi1zdGF0dXNfdCBidWlsZEFWQ0NvZGVjU3BlY2lmaWNEYXRhKHVpbnQ4X3QgKipwT3V0cHV0RGF0YSwgc2l6ZV90ICpwT3V0cHV0U2l6ZSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIE1ldGFEYXRhICpwYXJhbSkKLXsKLSAgICAvL0FMT0dWKCJidWlsZEFWQ0NvZGVjU3BlY2lmaWNEYXRhIik7Ci0KLSAgICBpZiAoIChwT3V0cHV0RGF0YSA9PSBOVUxMKSB8fCAocE91dHB1dFNpemUgPT0gTlVMTCkgKSB7Ci0gICAgICAgIEFMT0dFKCJvdXRwdXQgaXMgaW52YWxpZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmICgqcE91dHB1dERhdGEgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQWxyZWFkeSBoYXZlIGNvZGVjIHNwZWNpZmljIGRhdGEiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgQUxPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJWQiLCBzaXplKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICAvLyBEYXRhIGlzIGluIHRoZSBmb3JtIG9mIEFWQ0NvZGVjU3BlY2lmaWNEYXRhCi0gICAgaWYgKG1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIGRhdGEsIDQpKSB7Ci0gICAgICAgIC8vIDIgYnl0ZXMgZm9yIGVhY2ggb2YgdGhlIHBhcmFtZXRlciBzZXQgbGVuZ3RoIGZpZWxkCi0gICAgICAgIC8vIHBsdXMgdGhlIDcgYnl0ZXMgZm9yIHRoZSBoZWFkZXIKLSAgICAgICAgaWYgKHNpemUgPCA0ICsgNykgewotICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJWQiLCBzaXplKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAqcE91dHB1dFNpemUgPSBzaXplOwotICAgICAgICAqcE91dHB1dERhdGEgPSAodWludDhfdCopbWFsbG9jKHNpemUpOwotICAgICAgICBtZW1jcHkoKnBPdXRwdXREYXRhLCBkYXRhLCBzaXplKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIEFWQ0NvZGVjU3BlY2lmaWNDb250ZXh0IGN0eDsKLSAgICB1aW50OF90ICpvdXRwdXREYXRhID0gTlVMTDsKLSAgICBzaXplX3Qgb3V0cHV0U2l6ZSA9IDA7Ci0KLSAgICAvLyBDaGVjayBpZiB0aGUgZGF0YSBpcyB2YWxpZAotICAgIHVpbnQ4X3QgdHlwZSA9IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0OwotICAgIGJvb2wgZ290U3BzID0gZmFsc2U7Ci0gICAgYm9vbCBnb3RQcHMgPSBmYWxzZTsKLSAgICBjb25zdCB1aW50OF90ICp0bXAgPSBkYXRhOwotICAgIGNvbnN0IHVpbnQ4X3QgKm5leHRTdGFydENvZGUgPSBkYXRhOwotICAgIHNpemVfdCBieXRlc0xlZnQgPSBzaXplOwotICAgIHNpemVfdCBwYXJhbVNldExlbiA9IDA7Ci0gICAgb3V0cHV0U2l6ZSA9IDA7Ci0gICAgd2hpbGUgKGJ5dGVzTGVmdCA+IDQgJiYgIW1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIHRtcCwgNCkpIHsKLSAgICAgICAgdHlwZSA9ICgqKHRtcCArIDQpKSAmIDB4MUY7Ci0gICAgICAgIGlmICh0eXBlID09IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0KSB7Ci0gICAgICAgICAgICBpZiAoZ290UHBzKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlNQUyBtdXN0IGNvbWUgYmVmb3JlIFBQUyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWdvdFNwcykgewotICAgICAgICAgICAgICAgIGdvdFNwcyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0U3RhcnRDb2RlID0gcGFyc2VQYXJhbVNldCgmY3R4LCB0bXAgKyA0LCBieXRlc0xlZnQgLSA0LCB0eXBlLAotICAgICAgICAgICAgICAgICZwYXJhbVNldExlbik7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrTmFsVW5pdFR5cGVQaWNQYXJhbVNldCkgewotICAgICAgICAgICAgaWYgKCFnb3RTcHMpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiU1BTIG11c3QgY29tZSBiZWZvcmUgUFBTIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZ290UHBzKSB7Ci0gICAgICAgICAgICAgICAgZ290UHBzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHRTdGFydENvZGUgPSBwYXJzZVBhcmFtU2V0KCZjdHgsIHRtcCArIDQsIGJ5dGVzTGVmdCAtIDQsIHR5cGUsCi0gICAgICAgICAgICAgICAgJnBhcmFtU2V0TGVuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJPbmx5IFNQUyBhbmQgUFBTIE5hbCB1bml0cyBhcmUgZXhwZWN0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmV4dFN0YXJ0Q29kZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTW92ZSBvbiB0byBmaW5kIHRoZSBuZXh0IHBhcmFtZXRlciBzZXQKLSAgICAgICAgYnl0ZXNMZWZ0IC09IG5leHRTdGFydENvZGUgLSB0bXA7Ci0gICAgICAgIHRtcCA9IG5leHRTdGFydENvZGU7Ci0gICAgICAgIG91dHB1dFNpemUgKz0gKDIgKyBwYXJhbVNldExlbik7Ci0gICAgfQotCi0gICAgewotICAgICAgICAvLyBDaGVjayBvbiB0aGUgbnVtYmVyIG9mIHNlcSBwYXJhbWV0ZXIgc2V0cwotICAgICAgICBzaXplX3QgblNlcVBhcmFtU2V0cyA9IGN0eC5tU2VxUGFyYW1TZXRzLnNpemUoKTsKLSAgICAgICAgaWYgKG5TZXFQYXJhbVNldHMgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIkNvdW5kIG5vdCBmaW5kIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoblNlcVBhcmFtU2V0cyA+IDB4MUYpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUb28gbWFueSBzZXEgcGFyYW1ldGVyIHNldHMgKCVkKSBmb3VuZCIsIG5TZXFQYXJhbVNldHMpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgb24gdGhlIG51bWJlciBvZiBwaWMgcGFyYW1ldGVyIHNldHMKLSAgICAgICAgc2l6ZV90IG5QaWNQYXJhbVNldHMgPSBjdHgubVBpY1BhcmFtU2V0cy5zaXplKCk7Ci0gICAgICAgIGlmIChuUGljUGFyYW1TZXRzID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VuZCBub3QgZmluZCBwaWN0dXJlIHBhcmFtZXRlciBzZXQiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5QaWNQYXJhbVNldHMgPiAweEZGKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVG9vIG1hbnkgcGljIHBhcmFtZXRlciBzZXRzICglZCkgZm91bmQiLCBuUGljUGFyYW1TZXRzKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJU08gMTQ0OTYtMTU6IEFWQyBmaWxlIGZvcm1hdAotICAgIG91dHB1dFNpemUgKz0gNzsgIC8vIDcgbW9yZSBieXRlcyBpbiB0aGUgaGVhZGVyCi0gICAgb3V0cHV0RGF0YSA9ICh1aW50OF90ICopbWFsbG9jKG91dHB1dFNpemUpOwotICAgIHVpbnQ4X3QgKmhlYWRlciA9IG91dHB1dERhdGE7Ci0gICAgaGVhZGVyWzBdID0gMTsgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uCi0gICAgaGVhZGVyWzFdID0gY3R4Lm1Qcm9maWxlSWRjOyAgICAgICAgICAgLy8gcHJvZmlsZSBpbmRpY2F0aW9uCi0gICAgaGVhZGVyWzJdID0gY3R4Lm1Qcm9maWxlQ29tcGF0aWJsZTsgICAgLy8gcHJvZmlsZSBjb21wYXRpYmlsaXR5Ci0gICAgaGVhZGVyWzNdID0gY3R4Lm1MZXZlbElkYzsKLQotICAgIC8vIDYtYml0ICcxMTExMTEnIGZvbGxvd2VkIGJ5IDItYml0IHRvIGxlbmd0aFNpemVNaW51dXNPbmUKLSAgICBpbnQzMl90IHVzZTJCeXRlTmFsTGVuZ3RoID0gMDsKLSAgICBpZiAocGFyYW0gJiYKLSAgICAgICAgcGFyYW0tPmZpbmRJbnQzMihrS2V5MkJ5dGVOYWxMZW5ndGgsICZ1c2UyQnl0ZU5hbExlbmd0aCkgJiYKLSAgICAgICAgdXNlMkJ5dGVOYWxMZW5ndGgpIHsKLSAgICAgICAgaGVhZGVyWzRdID0gMHhmYyB8IDE7ICAvLyBsZW5ndGggc2l6ZSA9PSAyIGJ5dGVzCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaGVhZGVyWzRdID0gMHhmYyB8IDM7ICAvLyBsZW5ndGggc2l6ZSA9PSA0IGJ5dGVzCi0gICAgfQotCi0gICAgLy8gMy1iaXQgJzExMScgZm9sbG93ZWQgYnkgNS1iaXQgbnVtU2VxdWVuY2VQYXJhbWV0ZXJTZXRzCi0gICAgaW50IG5TZXF1ZW5jZVBhcmFtU2V0cyA9IGN0eC5tU2VxUGFyYW1TZXRzLnNpemUoKTsKLSAgICBoZWFkZXJbNV0gPSAweGUwIHwgblNlcXVlbmNlUGFyYW1TZXRzOwotICAgIGhlYWRlciArPSA2OwotICAgIGZvciAoTGlzdDxBVkNQYXJhbVNldD46Oml0ZXJhdG9yIGl0ID0gY3R4Lm1TZXFQYXJhbVNldHMuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IGN0eC5tU2VxUGFyYW1TZXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIC8vIDE2LWJpdCBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aAotICAgICAgICB1aW50MTZfdCBzZXFQYXJhbVNldExlbmd0aCA9IGl0LT5tTGVuZ3RoOwotICAgICAgICBoZWFkZXJbMF0gPSBzZXFQYXJhbVNldExlbmd0aCA+PiA4OwotICAgICAgICBoZWFkZXJbMV0gPSBzZXFQYXJhbVNldExlbmd0aCAmIDB4ZmY7Ci0gICAgICAgIC8vQUxPR0UoIiMjIyBTUFMgJWQgJWQgJWQiLCBzZXFQYXJhbVNldExlbmd0aCwgaGVhZGVyWzBdLCBoZWFkZXJbMV0pOwotCi0gICAgICAgIC8vIFNQUyBOQUwgdW5pdCAoc2VxdWVuY2UgcGFyYW1ldGVyIGxlbmd0aCBieXRlcykKLSAgICAgICAgbWVtY3B5KCZoZWFkZXJbMl0sIGl0LT5tRGF0YSwgc2VxUGFyYW1TZXRMZW5ndGgpOwotICAgICAgICBoZWFkZXIgKz0gKDIgKyBzZXFQYXJhbVNldExlbmd0aCk7Ci0gICAgfQotCi0gICAgLy8gOC1iaXQgblBpY3R1cmVQYXJhbWV0ZXJTZXRzCi0gICAgaW50IG5QaWN0dXJlUGFyYW1TZXRzID0gY3R4Lm1QaWNQYXJhbVNldHMuc2l6ZSgpOwotICAgIGhlYWRlclswXSA9IG5QaWN0dXJlUGFyYW1TZXRzOwotICAgIGhlYWRlciArPSAxOwotICAgIGZvciAoTGlzdDxBVkNQYXJhbVNldD46Oml0ZXJhdG9yIGl0ID0gY3R4Lm1QaWNQYXJhbVNldHMuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IGN0eC5tUGljUGFyYW1TZXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIC8vIDE2LWJpdCBwaWN0dXJlIHBhcmFtZXRlciBzZXQgbGVuZ3RoCi0gICAgICAgIHVpbnQxNl90IHBpY1BhcmFtU2V0TGVuZ3RoID0gaXQtPm1MZW5ndGg7Ci0gICAgICAgIGhlYWRlclswXSA9IHBpY1BhcmFtU2V0TGVuZ3RoID4+IDg7Ci0gICAgICAgIGhlYWRlclsxXSA9IHBpY1BhcmFtU2V0TGVuZ3RoICYgMHhmZjsKLS8vQUxPR0UoIiMjIyBQUFMgJWQgJWQgJWQiLCBwaWNQYXJhbVNldExlbmd0aCwgaGVhZGVyWzBdLCBoZWFkZXJbMV0pOwotCi0gICAgICAgIC8vIFBQUyBOYWwgdW5pdCAocGljdHVyZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aCBieXRlcykKLSAgICAgICAgbWVtY3B5KCZoZWFkZXJbMl0sIGl0LT5tRGF0YSwgcGljUGFyYW1TZXRMZW5ndGgpOwotICAgICAgICBoZWFkZXIgKz0gKDIgKyBwaWNQYXJhbVNldExlbmd0aCk7Ci0gICAgfQotCi0gICAgKnBPdXRwdXRTaXplID0gb3V0cHV0U2l6ZTsKLSAgICAqcE91dHB1dERhdGEgPSBvdXRwdXREYXRhOwotICAgIHJldHVybiBPSzsKLX0KLX0vLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU5MTczMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBkZWNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVklERU9FRElUT1JfVklERU9ERUNPREVSIgotLyoqKioqKioqKioqKioqKioqKioKLSAqICAgICBIRUFERVJTICAgICAqCi0gKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotI2luY2x1ZGUgIk00VkRfVG9vbHMuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLS8qKioqKioqKioqKioqKioqKioqKgotICogICBERUZJTklUSU9OUyAgICAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE1BWF9ERUNfQlVGRkVSUyAxMAotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqICAgU09VUkNFIENMQVNTICAgKgotICoqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci1zdGF0aWMgTTRPU0FfRVJSIGNvcHlCdWZmZXJUb1F1ZXVlKAotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQsCi0gICAgTWVkaWFCdWZmZXIqIHBEZWNvZGVkQnVmZmVyKTsKLQotY2xhc3MgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLQotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0LAotICAgICAgICAgICAgVklERU9FRElUT1JfQ29kZWNUeXBlIGNvZGVjVHlwZSwKLSAgICAgICAgICAgIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpOwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotCi0gICAgcHJvdGVjdGVkIDoKLSAgICAgICAgdmlydHVhbCB+VmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtRm9ybWF0OwotICAgICAgICBNZWRpYUJ1ZmZlciogbUJ1ZmZlcjsKLSAgICAgICAgTWVkaWFCdWZmZXJHcm91cCogbUdyb3VwOwotICAgICAgICBNdXRleCBtTG9jazsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogbXBEZWNTaGVsbENvbnRleHQ7Ci0gICAgICAgIGludDMyX3QgbU1heEFVU2l6ZTsKLSAgICAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICAgICAgVklERU9FRElUT1JfQ29kZWNUeXBlIG1Db2RlY1R5cGU7Ci0KLSAgICAgICAgLy8gRG9uJ3QgY2FsbCBtZQotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZShjb25zdCBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSAmKTsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UgJm9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlICYpOwotfTsKLQotVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCwgVklERU9FRElUT1JfQ29kZWNUeXBlIGNvZGVjVHlwZSwKLSAgICAgICAgdm9pZCAqZGVjb2RlclNoZWxsQ29udGV4dCkgOgotICAgICAgICBtRm9ybWF0KGZvcm1hdCksCi0gICAgICAgIG1CdWZmZXIoTlVMTCksCi0gICAgICAgIG1Hcm91cChOVUxMKSwKLSAgICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgICBtQ29kZWNUeXBlKGNvZGVjVHlwZSkgewotICAgIG1wRGVjU2hlbGxDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKSBkZWNvZGVyU2hlbGxDb250ZXh0OwotfQotCi1WaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZTo6flZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlKCkgewotICAgIGlmIChtU3RhcnRlZCA9PSB0cnVlKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjpzdGFydCgKLSAgICAgICAgTWV0YURhdGEgKnBhcmFtcykgewotCi0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICBpZiAobUZvcm1hdC0+ZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZtTWF4QVVTaXplKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGtLZXlNYXhJbnB1dFNpemUiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICAgICAgaWYgKG1Hcm91cCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRkFUQUw6IG1lbW9yeSBsaW1pdGF0aW9uICEgIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0KLSAgICAgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtTWF4QVVTaXplKSk7Ci0KLSAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjpzdG9wKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgIC8vIEZJWE1FOgotICAgICAgICAgICAgLy8gV2h5IGRvIHdlIG5lZWQgdG8gY2hlY2sgb24gdGhlIHJlZiBjb3VudD8KLSAgICAgICAgICAgIGludCByZWZfY291bnQgPSBtQnVmZmVyLT5yZWZjb3VudCgpOwotICAgICAgICAgICAgQUxPR1YoIk1lZGlhQnVmZmVyIHJlZmNvdW50IGlzICVkIixyZWZfY291bnQpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZfY291bnQ7ICsraSkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIG1Hcm91cDsKLSAgICAgICAgbUdyb3VwID0gTlVMTDsKLSAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotCi0gICAgcmV0dXJuIG1Gb3JtYXQ7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjpyZWFkKE1lZGlhQnVmZmVyKiogYnVmZmVyX291dCwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgaWYgKG9wdGlvbnMgIT0gTlVMTCkgewotICAgICAgICBpbnQ2NF90IHRpbWVfdXM7Ci0gICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICAgICAgb3B0aW9ucy0+Z2V0U2Vla1RvKCZ0aW1lX3VzLCAmbW9kZSk7Ci0gICAgICAgIGlmIChtb2RlICE9IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCByZWFkIG9wdGlvbnMiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9FUlIgZXJyOwotICAgICAgICBNNE9TQV9JbnQzMiByYXBUaW1lID0gdGltZV91cyAvIDEwMDA7Ci0KLSAgICAgICAgLyotLS0gUmV0cmlldmUgdGhlIHByZXZpb3VzIFJBUCB0aW1lIC0tLSovCi0gICAgICAgIGVyciA9IG1wRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXJHbG9iYWwtPm1fcEZjdEdldFByZXZSYXBUaW1lKAotICAgICAgICAgICAgICAgICAgbXBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlci0+bV9yZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKW1wRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAmcmFwVGltZSk7Ci0KLSAgICAgICAgaWYgKGVyciA9PSBNNFdBUl9SRUFERVJfSU5GT1JNQVRJT05fTk9UX1BSRVNFTlQpIHsKLSAgICAgICAgICAgIC8qIE5vIFJBUCB0YWJsZSwganVtcCBiYWNrd2FyZCBhbmQgcHJlZGVjb2RlICovCi0gICAgICAgICAgICByYXBUaW1lIC09IDQwMDAwOwotICAgICAgICAgICAgaWYocmFwVGltZSA8IDApIHJhcFRpbWUgPSAwOwotICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoImdldCByYXAgdGltZSBlcnJvciA9IDB4JXhcbiIsICh1aW50MzJfdCllcnIpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBtcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyR2xvYmFsLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgIG1wRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXItPm1fcmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopbXBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAmcmFwVGltZSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoImp1bXAgZXJyID0gMHgleFxuIiwgKHVpbnQzMl90KWVycik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKmJ1ZmZlcl9vdXQgPSBOVUxMOwotCi0gICAgTTRPU0FfRVJSIGxlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKLSAgICBpZiAobGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gbGVycjsKLSAgICB9Ci0gICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7ICAvLyBjbGVhciBhbGwgdGhlIG1ldGEgZGF0YQotCi0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIC8vZ2V0TmV4dCBBVSBmcm9tIHJlYWRlci4KLSAgICAgICAgTTRfQWNjZXNzVW5pdCogcEFjY2Vzc1VuaXQgPSBtcERlY1NoZWxsQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZTsKLSAgICAgICAgbGVyciA9IG1wRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICAgICBtcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyLT5tX3JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKW1wRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgcEFjY2Vzc1VuaXQpOwotICAgICAgICBpZiAobGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCB8fCBsZXJyID09IE00V0FSX05PX01PUkVfQVUpIHsKLSAgICAgICAgICAgICpidWZmZXJfb3V0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9jb3B5IHRoZSByZWFkZXIgQVUgYnVmZmVyIHRvIG1CdWZmZXIKLSAgICAgICAgTTRPU0FfVUludDMyIGxTaXplICA9IChwQWNjZXNzVW5pdC0+bV9zaXplID4gKE00T1NBX1VJbnQzMiltTWF4QVVTaXplKVwKLSAgICAgICAgICAgID8gKE00T1NBX1VJbnQzMiltTWF4QVVTaXplIDogcEFjY2Vzc1VuaXQtPm1fc2l6ZTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopbUJ1ZmZlci0+ZGF0YSgpLCh2b2lkICopcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBsU2l6ZSk7Ci0KLSAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGxTaXplKTsKLSAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcyA9IChpbnQ2NF90KSAocEFjY2Vzc1VuaXQtPm1fQ1RTICogMTAwMCk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgZnJhbWVUaW1lVXMpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgdGhlIEFVIHN0YXJ0IGNvZGUgZm9yIEgyNjQKLSAgICAgICAgaWYgKFZJREVPRURJVE9SX2tIMjY0VmlkZW9EZWMgPT0gbUNvZGVjVHlwZSkgewotICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9KHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgICAgIGRhdGFbMF09MDsKLSAgICAgICAgICAgIGRhdGFbMV09MDsKLSAgICAgICAgICAgIGRhdGFbMl09MDsKLSAgICAgICAgICAgIGRhdGFbM109MTsKLSAgICAgICAgfQotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLAotICAgICAgICAgICAgKHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSA9PSAweDA0KT8gMSA6IDApOwotICAgICAgICAqYnVmZmVyX291dCA9IG1CdWZmZXI7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIE00T1NBX1VJbnQzMiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgVklERU9FRElUT1JfVklERU9fQml0c3RyZWFtX2N0eHQqIHBhcnNpbmdDdHh0LCBNNE9TQV9VSW50MzIgbmJfYml0cykgewotICAgIHJldHVybiAoTTRWRF9Ub29sc19HZXRCaXRzRnJvbU1lbW9yeSgoTTRWU19CaXRzdHJlYW1fY3R4dCopIHBhcnNpbmdDdHh0LAotICAgICAgICAgICAgbmJfYml0cykpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWxQYXJzZVZpZGVvRFNJKE00T1NBX1VJbnQ4KiBwVm9sLAotICAgICAgICBNNE9TQV9JbnQzMiBhVm9sU2l6ZSwgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvKiBwRGNpLAotICAgICAgICBNNERFQ09ERVJfVmlkZW9TaXplKiBwVmlkZW9TaXplKSB7Ci0KLSAgICBWSURFT0VESVRPUl9WSURFT19CaXRzdHJlYW1fY3R4dCBwYXJzaW5nQ3R4dDsKLSAgICBNNE9TQV9VSW50MzIgY29kZSwgajsKLSAgICBNNE9TQV9NZW1BZGRyOCBzdGFydDsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX1VJbnQzMiB0aW1lX2luY3JfbGVuZ3RoOwotICAgIE00T1NBX1VJbnQ4IHZvbF92ZXJpZD0wLCBiX2hpZXJhcmNoeV90eXBlOwotCi0gICAgLyogUGFyc2luZyB2YXJpYWJsZXMgKi8KLSAgICBNNE9TQV9VSW50OCB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV9lbmFibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHJlZHVjZWRfcmVzb2x1dGlvbl92b3BfZW5hYmxlID0gMDsKLSAgICBNNE9TQV9VSW50OCBzY2FsYWJpbGl0eSA9IDA7Ci0gICAgTTRPU0FfVUludDggZW5oYW5jZW1lbnRfdHlwZSA9IDA7Ci0gICAgTTRPU0FfVUludDggY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IGludGVybGFjZWQgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IDA7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX2JyaWdodG5lc3NfY2hhbmdlID0gMDsKLSAgICBNNE9TQV9VSW50OCBxdWFudF9wcmVjaXNpb24gPSAwOwotCi0gICAgLyogRmlsbCB0aGUgc3RydWN0dXJlIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzICovCi0gICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoICAgICAgPSAwOwotICAgIHBWaWRlb1NpemUtPm1fdWlIZWlnaHQgICAgID0gMDsKLQotICAgIHBEY2ktPnVpVGltZVNjYWxlICAgICAgICAgID0gMDsKLSAgICBwRGNpLT51aVByb2ZpbGUgICAgICAgICAgICA9IDA7Ci0gICAgcERjaS0+dWlVc2VPZlJlc3luY2hNYXJrZXIgPSAwOwotICAgIHBEY2ktPmJEYXRhUGFydGl0aW9uICAgICAgID0gTTRPU0FfRkFMU0U7Ci0gICAgcERjaS0+YlVzZU9mUlZMQyAgICAgICAgICAgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIFJlc2V0IHRoZSBiaXRzdHJlYW0gY29udGV4dCAqLwotICAgIHBhcnNpbmdDdHh0LnN0cmVhbV9ieXRlID0gMDsKLSAgICBwYXJzaW5nQ3R4dC5zdHJlYW1faW5kZXggPSA4OwotICAgIHBhcnNpbmdDdHh0LmluID0gKE00T1NBX01lbUFkZHI4KSBwVm9sOwotCi0gICAgc3RhcnQgPSAoTTRPU0FfTWVtQWRkcjgpIHBWb2w7Ci0KLSAgICAvKiBTdGFydCBwYXJzaW5nICovCi0gICAgd2hpbGUgKHBhcnNpbmdDdHh0LmluIC0gc3RhcnQgPCBhVm9sU2l6ZSkgewotICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgaWYgKGNvZGUgPT0gMCkgewotICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICBpZiAoY29kZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCw4KTsKLSAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGNvZGUgZm91bmQgKi8KLSAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweDIwLi4weDJGIDogdmlkZW9fb2JqZWN0X2xheWVyX3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPiAweDFGKSAmJiAoY29kZSA8IDB4MzApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDMxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkIHRvIHNhdmUgaXQgZm9yIHZvcCBwYXJzaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAoTTRPU0FfVUludDgpY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAvKiBvbmx5IHJlY3Rhbmd1bGFyIGNhc2Ugc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlUaW1lU2NhbGUgPSBjb2RlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21wdXRlcyB0aW1lIGluY3JlbWVudCBsZW5ndGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGogICAgPSBjb2RlIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwgMzIpICYmIChqICE9IDApOyBqID4+PTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2luY3JfbGVuZ3RoID0gKGkgPT0gMCkgPyAxIDogaTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgdGltZV9pbmNyX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAhPSAxKSB7IC8qIDEgPSBCaW5hcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7LyogV2lkdGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTMpOy8qIEhlaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9TaXplLT5tX3VpSGVpZ2h0ID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBpbnRlcmxhY2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxhY2VkID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBPQk1DIGRpc2FibGUgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYodm9sX3ZlcmlkID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Lyogc3ByaXRlIGVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV9lbmFibGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDIpOy8qIHNwcml0ZSBlbmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfZW5hYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNwcml0ZV9lbmFibGUgPT0gMSkgfHwgKHNwcml0ZV9lbmFibGUgPT0gMikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ByaXRlX2VuYWJsZSAhPSAyKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7Lyogc3ByaXRlIHdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsvKiBzcHJpdGUgaGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsvKiBzcHJpdGUgbCBjb29yZGluYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsvKiBzcHJpdGUgdG9wIGNvb3JkaW5hdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDYpOy8qIHNwcml0ZSB3YXJwaW5nIHBvaW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAyKTsvKiBzcHJpdGUgd2FycGluZyBhY2N1cmFjeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBzcHJpdGUgYnJpZ2h0bmVzcyBjaGFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2UgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ByaXRlX2VuYWJsZSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2b2xfdmVyaWQgIT0gMSkgJiYgKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAhPSAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Lyogc2FkY3QgZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsgLyogbm90IDggYml0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNCk7LyogcXVhbnQgcHJlY2lzaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRfcHJlY2lzaW9uID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOy8qIGJpdHMgcGVyIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyZXlzY2FsZSBub3Qgc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogcXVhbnQgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogbG9hZCBpbnRyYSBxdWFudCBtYXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOy8qICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IDY0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBsb2FkIG5vbiBpbnRyYSBxdWFudCBtYXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOy8qICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IDY0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sX3ZlcmlkICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogcXVhcnRlciBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogY29tcGxleGl0eSBlc3RpbWF0aW9uIGRpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHJlc3luYyBtYXJrZXIgZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlVc2VPZlJlc3luY2hNYXJrZXIgPSAoY29kZSkgPyAwIDogMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogZGF0YSBwYXJ0aXRpb25uZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPmJEYXRhUGFydGl0aW9uID0gKGNvZGUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogcmV2ZXJzaWJsZSBWTEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT5iVXNlT2ZSVkxDID0gKGNvZGUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sX3ZlcmlkICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogbmV3cHJlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlZF9yZXNvbHV0aW9uX3ZvcF9lbmFibGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Lyogc2NhbGFiaWxpdHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmlsaXR5ID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBoaWVyYXJjaHkgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfaGllcmFyY2h5X3R5cGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNCk7LyogcmVmIGxheWVyIGlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHJlZiBzYW1wbGluZyBkaXJlY3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7LyogaG9yIHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDUpOy8qIGhvciBzYW1wbGluZyBmYWN0b3IgTSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsvKiB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDUpOy8qIHZlcnQgc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogZW5oYW5jZW1lbnQgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuaGFuY2VtZW50X3R5cGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFiX2hpZXJhcmNoeV90eXBlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHVzZSByZWYgc2hhcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiB1c2UgcmVmIHRleHR1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIDB4QjAgOiB2aXN1YWxfb2JqZWN0X3NlcXVlbmNlX3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNvZGUgPT0gMHhCMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgOCk7LyogcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlQcm9maWxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweEI1IDogdmlzdWFsX29iamVjdF9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjb2RlID09IDB4QjUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGlzIG9iamVjdCBsYXllciBpZGVudGlmaWVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOyAvKiB2aXN1YWwgb2JqZWN0IHZlcmlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sX3ZlcmlkID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNyk7IC8qIFJlYWxpZ24gb24gYnl0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSBlbmQgLS0tLS0gKi8KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPj4gMikgPT0gMHgyMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogSDI2MyAuLi4tPiB3cm9uZyovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9TZW1pcGxhbmFyWVZVNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLAotICAgICAgICBNNFZJRklfVUludDggKmlueXV2LCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQgKSB7Ci0gICAgTTRWSUZJX1VJbnQ4IHJldHVybl9jb2RlID0gTTRWSUZJX09LOwotICAgIE00VklGSV9VSW50OCAqb3V0eXV2ID0KLSAgICAgICAgKChNNFZJRklfVUludDgqKSYoUGxhbmVPdXRbMF0ucGFjX2RhdGFbUGxhbmVPdXRbMF0udV90b3BsZWZ0XSkpOwotICAgIGludDMyX3Qgd2lkdGggPSBQbGFuZU91dFswXS51X3dpZHRoOwotICAgIGludDMyX3QgaGVpZ2h0ID0gUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICBpbnQzMl90IG91dFlzaXplID0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgdWludDMyX3QgKm91dHkgPSAgKHVpbnQzMl90ICopIG91dHl1djsKLSAgICB1aW50MTZfdCAqb3V0Y2IgPQotICAgICAgICAodWludDE2X3QgKikgJihQbGFuZU91dFsxXS5wYWNfZGF0YVtQbGFuZU91dFsxXS51X3RvcGxlZnRdKTsKLSAgICB1aW50MTZfdCAqb3V0Y3IgPQotICAgICAgICAodWludDE2X3QgKikgJihQbGFuZU91dFsyXS5wYWNfZGF0YVtQbGFuZU91dFsyXS51X3RvcGxlZnRdKTsKLQotICAgIC8qIFkgY29weWluZyAqLwotICAgIG1lbWNweSgodm9pZCAqKW91dHksICh2b2lkICopaW55dXYsIG91dFlzaXplKTsKLQotICAgIC8qIFUgJiBWIGNvcHlpbmcgKi8KLSAgICB1aW50MzJfdCAqaW55dXZfNCA9ICh1aW50MzJfdCAqKSAoaW55dXYgKyBvdXRZc2l6ZSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBoZWlnaHQgPj4gMTsgaSA+IDA7IC0taSkgewotICAgICAgICBmb3IgKGludDMyX3QgaiA9IHdpZHRoID4+IDI7IGogPiAwOyAtLWopIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSAqaW55dXZfNCsrOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcFUgPSB0ZW1wICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBVID0gdGVtcFUgfCAoKHRlbXAgPj4gOCkgJiAweEZGMDApOwotCi0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wViA9ICh0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBWID0gdGVtcFYgfCAoKHRlbXAgPj4gMTYpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgLy8gRmxpcCBVIGFuZCBWCi0gICAgICAgICAgICAqb3V0Y2IrKyA9IHRlbXBWOwotICAgICAgICAgICAgKm91dGNyKysgPSB0ZW1wVTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0dXJuX2NvZGU7Ci19Ci12b2lkIGxvZ1N1cHBvcnREZWNvZGVyc0FuZENhcGFiaWxpdGllcyhNNERFQ09ERVJfVmlkZW9EZWNvZGVycyogZGVjb2RlcnMpIHsKLSAgICBWaWRlb0RlY29kZXIgKnBEZWNvZGVyOwotICAgIFZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzICpwT214Q29tcG9uZW50cyA9IE5VTEw7Ci0gICAgVmlkZW9Qcm9maWxlTGV2ZWwgKnBQcm9maWxlTGV2ZWwgPSBOVUxMOwotICAgIHBEZWNvZGVyID0gZGVjb2RlcnMtPmRlY29kZXI7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGk8IGRlY29kZXJzLT5kZWNvZGVyTnVtYmVyOyBpKyspIHsKLSAgICAgICAgQUxPR1YoIlN1cHBvcnRlZCBDb2RlY1slZF0gOiVkIiwgaSwgcERlY29kZXItPmNvZGVjKTsKLSAgICAgICAgcE9teENvbXBvbmVudHMgPSBwRGVjb2Rlci0+Y29tcG9uZW50OwotICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgIHBEZWNvZGVyLT5jb21wb25lbnROdW1iZXI7IGorKykgewotICAgICAgICAgICBwUHJvZmlsZUxldmVsID0gcE9teENvbXBvbmVudHMtPnByb2ZpbGVMZXZlbDsKLSAgICAgICAgICAgQUxPR1YoIi0tPmNvbXBvbmVudCAlZCIsIGopOwotICAgICAgICAgICBmb3Ioc2l6ZV90IGsgPSAwOyBrIDwgcE9teENvbXBvbmVudHMtPnByb2ZpbGVOdW1iZXI7IGsrKykgewotICAgICAgICAgICAgICAgQUxPR1YoIi0tPnByb2ZpbGU6JWxkIG1heExldmVsOiVsZCIsIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwtPm1MZXZlbCk7Ci0gICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsKys7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgcE9teENvbXBvbmVudHMrKzsKLSAgICAgICAgfQotICAgICAgICBwRGVjb2RlcisrOwotICAgIH0KLX0KLQotTTRPU0FfRVJSIHF1ZXJ5VmlkZW9EZWNvZGVyQ2FwYWJpbGl0aWVzCi0gICAgKE00REVDT0RFUl9WaWRlb0RlY29kZXJzKiogZGVjb2RlcnMpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBjb25zdCBjaGFyICprTWltZVR5cGVzW10gPSB7Ci0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMKLSAgICB9OwotCi0gICAgaW50MzJfdCBzdXBwb3J0Rm9ybWF0cyA9IHNpemVvZihrTWltZVR5cGVzKSAvIHNpemVvZihrTWltZVR5cGVzWzBdKTsKLSAgICBNNERFQ09ERVJfVmlkZW9EZWNvZGVycyAqcERlY29kZXJzOwotICAgIFZpZGVvRGVjb2RlciAqcERlY29kZXI7Ci0gICAgVmlkZW9Db21wb25lbnRDYXBhYmlsaXRpZXMgKnBPbXhDb21wb25lbnRzID0gTlVMTDsKLSAgICBWaWRlb1Byb2ZpbGVMZXZlbCAqcFByb2ZpbGVMZXZlbCA9IE5VTEw7Ci0gICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKLSAgICBTQUZFX01BTExPQyhwRGVjb2RlcnMsIE00REVDT0RFUl9WaWRlb0RlY29kZXJzLCAxLCAiVmlkZW9EZWNvZGVycyIpOwotICAgIFNBRkVfTUFMTE9DKHBEZWNvZGVyLCBWaWRlb0RlY29kZXIsIHN1cHBvcnRGb3JtYXRzLAotICAgICAgICAiVmlkZW9EZWNvZGVyIik7Ci0gICAgcERlY29kZXJzLT5kZWNvZGVyID0gcERlY29kZXI7Ci0KLSAgICBwRGVjb2RlcnMtPmRlY29kZXJOdW1iZXI9IHN1cHBvcnRGb3JtYXRzOwotICAgIHN0YXR1cyA9IGNsaWVudC5jb25uZWN0KCk7Ci0gICAgQ0hFQ0soc3RhdHVzID09IE9LKTsKLSAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHNpemVvZihrTWltZVR5cGVzKSAvIHNpemVvZihrTWltZVR5cGVzWzBdKTsKLSAgICAgICAgICAgICArK2spIHsKLSAgICAgICAgICAgIFZlY3RvcjxDb2RlY0NhcGFiaWxpdGllcz4gcmVzdWx0czsKLSAgICAgICAgICAgIENIRUNLX0VRKFF1ZXJ5Q29kZWNzKGNsaWVudC5pbnRlcmZhY2UoKSwga01pbWVUeXBlc1trXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIC8vIHF1ZXJ5RGVjb2RlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRzKSwgKHN0YXR1c190KU9LKTsKLQotICAgICAgICAgICAgaWYgKHJlc3VsdHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgU0FGRV9NQUxMT0MocE9teENvbXBvbmVudHMsIFZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzLAotICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnNpemUoKSwgIlZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzIik7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIks9JWQiLGspOwotICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5jb21wb25lbnQgPSBwT214Q29tcG9uZW50czsKLSAgICAgICAgICAgICAgICBwRGVjb2Rlci0+Y29tcG9uZW50TnVtYmVyID0gcmVzdWx0cy5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIgIGRlY29kZXIgJyVzJyBzdXBwb3J0cyAiLAotICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldLm1Db21wb25lbnROYW1lLnN0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJOT1RISU5HLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotI2lmIDAKLSAgICAgICAgICAgICAgICAvLyBGSVhNRToKLSAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgaWdub3JlIHRoZSBzb2Z0d2FyZSBjb2RlY3MgYW5kIG1ha2UgSXNTb2Z0d2FyZUNvZGVjKCkKLSAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHB1YmljIEFQSSBmcm9tIE9NWENvZGVjLmNwcAotICAgICAgICAgICAgICAgIGlmIChJc1NvZnR3YXJlQ29kZWMocmVzdWx0c1tpXS5tQ29tcG9uZW50TmFtZS5zdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIklnbm9yZSBzb2Z0d2FyZSBjb2RlYyAlcyIsIHJlc3VsdHNbaV0ubUNvbXBvbmVudE5hbWUuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIC8vIENvdW50IHRoZSBzdXBwb3J0ZWQgcHJvZmlsZXMKLSAgICAgICAgICAgICAgICBpbnQzMl90IHByb2ZpbGVOdW1iZXIgPSAwOwotICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZmlsZSA9IC0xOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVzdWx0c1tpXS5tUHJvZmlsZUxldmVscy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCAmcHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0ubVByb2ZpbGVMZXZlbHNbal07Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBhc3N1bWUgdGhhdCB0aGUgcHJvZmlsZXMgYXJlIG9yZGVyZWQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbC5tUHJvZmlsZSAhPSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlID0gcHJvZmlsZUxldmVsLm1Qcm9maWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZU51bWJlcisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNBRkVfTUFMTE9DKHBQcm9maWxlTGV2ZWwsIFZpZGVvUHJvZmlsZUxldmVsLAotICAgICAgICAgICAgICAgICAgICBwcm9maWxlTnVtYmVyLCAiVmlkZW9Qcm9maWxlTGV2ZWwiKTsKLSAgICAgICAgICAgICAgICBwT214Q29tcG9uZW50cy0+cHJvZmlsZUxldmVsID0gcFByb2ZpbGVMZXZlbDsKLSAgICAgICAgICAgICAgICBwT214Q29tcG9uZW50cy0+cHJvZmlsZU51bWJlciA9IHByb2ZpbGVOdW1iZXI7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG1heCBMZXZlbCBmb3IgZWFjaCBwcm9maWxlLgotICAgICAgICAgICAgICAgIGludDMyX3QgbWF4TGV2ZWwgPSAtMTsKLSAgICAgICAgICAgICAgICBwcm9maWxlID0gLTE7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZU51bWJlciA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsICZwcm9maWxlTGV2ZWwgPQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpXS5tUHJvZmlsZUxldmVsc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gLTEgJiYgbWF4TGV2ZWwgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBwcm9maWxlTGV2ZWwubVByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IHByb2ZpbGVMZXZlbC5tTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsLT5tUHJvZmlsZSA9IHByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsLT5tTGV2ZWwgPSBtYXhMZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlZCBwcm9maWxlOiAlbGQsIG1heCBsZXZlbDogJWxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgcFByb2ZpbGVMZXZlbC0+bVByb2ZpbGUsIHBQcm9maWxlTGV2ZWwtPm1MZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbC5tUHJvZmlsZSAhPSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlID0gcHJvZmlsZUxldmVsLm1Qcm9maWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBwcm9maWxlTGV2ZWwubUxldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZU51bWJlcisrOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bVByb2ZpbGUgPSBwcm9maWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bUxldmVsID0gbWF4TGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJWQgcHJvZmlsZTogJWxkLCBtYXggbGV2ZWw6ICVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlLCBwUHJvZmlsZUxldmVsLT5tTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVMZXZlbC5tTGV2ZWwgPiBtYXhMZXZlbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBwcm9maWxlTGV2ZWwubUxldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bUxldmVsID0gbWF4TGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJWQgcHJvZmlsZTogJWxkLCBtYXggbGV2ZWw6ICVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlLCBwUHJvZmlsZUxldmVsLT5tTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcE9teENvbXBvbmVudHMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghc3RyY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywga01pbWVUeXBlc1trXSkpCi0gICAgICAgICAgICAgICAgcERlY29kZXItPmNvZGVjID0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzsKLSAgICAgICAgICAgIGlmICghc3RyY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBrTWltZVR5cGVzW2tdKSkKLSAgICAgICAgICAgICAgICBwRGVjb2Rlci0+Y29kZWMgPSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OwotICAgICAgICAgICAgaWYgKCFzdHJjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Mywga01pbWVUeXBlc1trXSkpCi0gICAgICAgICAgICAgICAgcERlY29kZXItPmNvZGVjID0gTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOwotCi0gICAgICAgICAgICBwRGVjb2RlcisrOwotICAgIH0KLQotICAgIGxvZ1N1cHBvcnREZWNvZGVyc0FuZENhcGFiaWxpdGllcyhwRGVjb2RlcnMpOwotICAgICpkZWNvZGVycyA9IHBEZWNvZGVyczsKLWNsZWFuVXA6Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKgotICogRU5HSU5FIElOVEVSRkFDRSAqCi0gKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE1ldGFEYXRhKiBtZXRhKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgYm9vbCBzdWNjZXNzID0gT0s7Ci0gICAgaW50MzJfdCB3aWR0aCA9IDA7Ci0gICAgaW50MzJfdCBoZWlnaHQgPSAwOwotICAgIGludDMyX3QgZnJhbWVTaXplID0gMDsKLSAgICBpbnQzMl90IHZXaWR0aCwgdkhlaWdodDsKLSAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gbWV0YSwgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIGJlZ2luIik7Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgc3VjY2VzcyA9IG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ2V2lkdGgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKFRSVUUgPT0gc3VjY2VzcywgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBzdWNjZXNzID0gbWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZ2SGVpZ2h0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhUUlVFID09IHN1Y2Nlc3MsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigidldpZHRoID0gJWQsIHZIZWlnaHQgPSAlZCIsIHZXaWR0aCwgdkhlaWdodCk7Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCA9IHZXaWR0aDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQgPSB2SGVpZ2h0OwotCi0gICAgaWYgKCFtZXRhLT5maW5kUmVjdCgKLSAgICAgICAgICAgICAgICBrS2V5Q3JvcFJlY3QsICZjcm9wTGVmdCwgJmNyb3BUb3AsICZjcm9wUmlnaHQsICZjcm9wQm90dG9tKSkgewotCi0gICAgICAgIGNyb3BMZWZ0ID0gY3JvcFRvcCA9IDA7Ci0gICAgICAgIGNyb3BSaWdodCA9IHZXaWR0aCAtIDE7Ci0gICAgICAgIGNyb3BCb3R0b20gPSB2SGVpZ2h0IC0gMTsKLQotICAgICAgICBBTE9HVigiZ290IGRpbWVuc2lvbnMgb25seSAlZCB4ICVkIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoImdvdCBjcm9wIHJlY3QgJWQsICVkLCAlZCwgJWQiLAotICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOwotICAgIH0KLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1Dcm9wUmVjdC5sZWZ0ID0gY3JvcExlZnQ7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUNyb3BSZWN0LnJpZ2h0ID0gY3JvcFJpZ2h0OwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1Dcm9wUmVjdC50b3AgPSBjcm9wVG9wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1Dcm9wUmVjdC5ib3R0b20gPSBjcm9wQm90dG9tOwotCi0gICAgd2lkdGggPSBjcm9wUmlnaHQgLSBjcm9wTGVmdCArIDE7Ci0gICAgaGVpZ2h0ID0gY3JvcEJvdHRvbSAtIGNyb3BUb3AgKyAxOwotCi0gICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgOiBXPSVkIEg9JWQiLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygoMCAhPSB3aWR0aCkgJiYgKDAgIT0gaGVpZ2h0KSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIGlmKCAoTTRPU0FfTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sKSAmJgotICAgICAgICAocERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGggID09IFwKLSAgICAgICAgICAgICh1aW50MzJfdCl3aWR0aCkgJiYKLSAgICAgICAgKHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCA9PSBcCi0gICAgICAgICAgICAodWludDMyX3QpaGVpZ2h0KSApIHsKLSAgICAgICAgLy8gTm8gbmVlZCB0byByZWNvbmZpZ3VyZQotICAgICAgICBnb3RvIGNsZWFuVXA7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhICByZXNldDogVz0lZCBIPSVkIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgLy8gVXBkYXRlIHRoZSBzdHJlYW0gaGFuZGxlciBwYXJhbWV0ZXJzCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGggID0gd2lkdGg7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0ID0gaGVpZ2h0OwotICAgIGZyYW1lU2l6ZSA9ICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKLQotICAgIC8vIENvbmZpZ3VyZSB0aGUgYnVmZmVyIHBvb2wKLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sICkgewotICAgICAgICBBTE9HVigiVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSA6IHJlc2V0IHRoZSBidWZmZXIgcG9vbCIpOwotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfZnJlZVBvb2wocERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCk7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBlcnIgPSAgVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCgmcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCwKLSAgICAgICAgTUFYX0RFQ19CVUZGRVJTLCAoTTRPU0FfQ2hhciopIlZJREVPRURJVE9SX0RlY29kZWRCdWZmZXJQb29sIik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgZXJyID0gVklERU9FRElUT1JfQlVGRkVSX2luaXRQb29sQnVmZmVycyhwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sLAotICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSArIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoICogMik7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sICkgewotICAgICAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wpOwotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveShNNE9TQV9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveSBiZWdpbiIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvLyBSZWxlYXNlIHRoZSBjb2xvciBjb252ZXJ0ZXIKLSAgICBkZWxldGUgcERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcjsKLQotICAgIC8vIERlc3Ryb3kgdGhlIGdyYXBoCi0gICAgaWYoIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXIgIT0gTlVMTCApIHsKLSAgICAgICAgQUxPR1YoIiMjIyBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95IDogcmVsZWFzaW5nIGRlY29kZXIiKTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+c3RvcCgpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLmNsZWFyKCk7Ci0gICAgfQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1DbGllbnQuZGlzY29ubmVjdCgpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UuY2xlYXIoKTsKLQotICAgIC8vIFJlbGVhc2UgbWVtb3J5Ci0gICAgaWYoIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgIT0gTTRPU0FfTlVMTCApIHsKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgU0FGRV9GUkVFKHBEZWNTaGVsbENvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTlVMTDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUoTTRPU0FfQ29udGV4dCAqcENvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZWFkZXJEYXRhSW50ZXJmYWNlLAotICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCwgTTRPU0FfVm9pZCAqcFVzZXJEYXRhKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7Ci0gICAgYm9vbCBzdWNjZXNzID0gVFJVRTsKLSAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZSA9IDA7Ci0gICAgc3A8TWV0YURhdGE+IGRlY29kZXJNZXRhZGF0YSA9IE5VTEw7Ci0gICAgaW50IGRlY29kZXJPdXRwdXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFN0cmVhbUhhbmRsZXIsICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmVhZGVyRGF0YUludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uCi0gICAgU0FGRV9NQUxMT0MocERlY1NoZWxsQ29udGV4dCwgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyIik7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyID0KLSAgICAgICAgKE00X1ZpZGVvU3RyZWFtSGFuZGxlciopcFN0cmVhbUhhbmRsZXI7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZSA9IHBBY2Nlc3NVbml0OwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlckdsb2JhbCA9IHBSZWFkZXJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyID0gcFJlYWRlckRhdGFJbnRlcmZhY2U7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0cyA9IC0xOwotICAgIHN3aXRjaCggcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSApIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjM6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rSDI2M1ZpZGVvRGVjOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDoKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSA9IFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjOwotICAgICAgICAgICAgLy8gUGFyc2UgdGhlIFZPTCBoZWFkZXIKLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2ludGVybmFsUGFyc2VWaWRlb0RTSSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKXBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+XAotICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+XAotICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICZwRGVjU2hlbGxDb250ZXh0LT5tX0RjaSwgJnBEZWNTaGVsbENvbnRleHQtPm1fVmlkZW9TaXplKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzoKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSA9IFZJREVPRURJVE9SX2tIMjY0VmlkZW9EZWM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiVmlkZW9EZWNvZGVyX2NyZWF0ZSA6IGluY29ycmVjdCBzdHJlYW0gdHlwZSIsCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYklucHV0RnJhbWVzICAgICA9IDA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMgICAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdElucHV0Q3RzICAgICAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYlJlbmRlcmVkRnJhbWVzICA9IDA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0UmVuZGVyZWRDdHMgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdFJlbmRlcmVkQ3RzICAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYk91dHB1dEZyYW1lcyAgICA9IDA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzICAgID0gLTE7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgICAgID0gLTE7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCAgID0gTTRPU0FfTlVMTDsKLQotICAgIC8vIENhbGN1bGF0ZSB0aGUgaW50ZXJ2YWwgYmV0d2VlbiB0d28gdmlkZW8gZnJhbWVzLgotICAgIENIRUNLKHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlID4gMCk7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZyYW1lSW50ZXJ2YWxNcyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fYXZlcmFnZUZyYW1lUmF0ZTsKLQotICAgIC8qKgotICAgICAqIFN0YWdlRnJpZ2h0IGdyYXBoIGJ1aWxkaW5nCi0gICAgICovCi0gICAgZGVjb2Rlck1ldGFkYXRhID0gbmV3IE1ldGFEYXRhOwotICAgIHN3aXRjaCggcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlICkgewotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tIMjYzVmlkZW9EZWM6Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIlZpZGVvRGVjb2Rlcl9jcmVhdGUgOiBpbmNvcnJlY3Qgc3RyZWFtIHR5cGUiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZSk7Ci0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoKTsKLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGRlY29kZXIgc291cmNlCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZSA9IG5ldyBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgKLSAgICAgICAgZGVjb2Rlck1ldGFkYXRhLCBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUsCi0gICAgICAgICh2b2lkICopcERlY1NoZWxsQ29udGV4dCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tUmVhZGVyU291cmNlLmdldCgpLAotICAgICAgICBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgc3RhdHVzID0gcERlY1NoZWxsQ29udGV4dC0+bUNsaWVudC5jb25uZWN0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gc3RhdHVzLCBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGRlY29kZXIKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUNsaWVudC5pbnRlcmZhY2UoKSwKLSAgICAgICAgZGVjb2Rlck1ldGFkYXRhLCBmYWxzZSwgcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLmdldCgpLAotICAgICAgICBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLQotICAgIC8vIEdldCB0aGUgb3V0cHV0IGNvbG9yIGZvcm1hdAotICAgIHN1Y2Nlc3MgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAotICAgICAgICBrS2V5Q29sb3JGb3JtYXQsICZjb2xvckZvcm1hdCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soVFJVRSA9PSBzdWNjZXNzLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPmRlY091cHV0Q29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpY29sb3JGb3JtYXQ7Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+c2V0SW50MzIoa0tleVdpZHRoLAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aCk7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPnNldEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCk7Ci0KLSAgICAvLyBHZXQgdGhlIGNvbG9yIGNvbnZlcnRlcgotICAgIHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIgPSBuZXcgSTQyMENvbG9yQ29udmVydGVyOwotICAgIGlmIChwRGVjU2hlbGxDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyLT5pc0xvYWRlZCgpKSB7Ci0gICAgICAgIGRlY29kZXJPdXRwdXQgPSBwRGVjU2hlbGxDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyLT5nZXREZWNvZGVyT3V0cHV0Rm9ybWF0KCk7Ci0gICAgfQotCi0gICAgaWYgKGRlY29kZXJPdXRwdXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICBkZWxldGUgcERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcjsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgQUxPR0koImRlY29kZXIgb3V0cHV0IGZvcm1hdCA9IDB4JVhcbiIsIGRlY29kZXJPdXRwdXQpOwotCi0gICAgLy8gQ29uZmlndXJlIHRoZSBidWZmZXIgcG9vbCBmcm9tIHRoZSBtZXRhZGF0YQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YShwRGVjU2hlbGxDb250ZXh0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS5nZXQoKSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBTdGFydCB0aGUgZ3JhcGgKLSAgICBzdGF0dXMgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5zdGFydCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHN0YXR1cywgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgKnBDb250ZXh0ID0gKE00T1NBX0NvbnRleHQpcERlY1NoZWxsQ29udGV4dDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95KHBEZWNTaGVsbENvbnRleHQpOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIDogRE9ORSIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvU29mdHdhcmVEZWNvZGVyX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcFJlYWRlckRhdGFJbnRlcmZhY2UsCi0gICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0LCBNNE9TQV9Wb2lkICpwVXNlckRhdGEpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKLSAgICBib29sIHN1Y2Nlc3MgPSBUUlVFOwotICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBzaXplID0gMDsKLSAgICBzcDxNZXRhRGF0YT4gZGVjb2Rlck1ldGFkYXRhID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBTdHJlYW1IYW5kbGVyLCAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFJlYWRlckRhdGFJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvLyBDb250ZXh0IGFsbG9jYXRpb24gJiBpbml0aWFsaXphdGlvbgotICAgIFNBRkVfTUFMTE9DKHBEZWNTaGVsbENvbnRleHQsIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvclZpZGVvRGVjb2RlciIpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciA9Ci0gICAgICAgIChNNF9WaWRlb1N0cmVhbUhhbmRsZXIqKXBTdHJlYW1IYW5kbGVyOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGUgPSBwQWNjZXNzVW5pdDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXJHbG9iYWwgPSBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlciA9IHBSZWFkZXJEYXRhSW50ZXJmYWNlOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgPSAtMTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHMgPSAtMTsKLSAgICBzd2l0Y2goIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgKSB7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID0gVklERU9FRElUT1Jfa0gyNjNWaWRlb0RlYzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rTXBlZzRWaWRlb0RlYzsKLSAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBWT0wgaGVhZGVyCi0gICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbFBhcnNlVmlkZW9EU0koCi0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmcERlY1NoZWxsQ29udGV4dC0+bV9EY2ksICZwRGVjU2hlbGxDb250ZXh0LT5tX1ZpZGVvU2l6ZSk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIlZpZGVvRGVjb2Rlcl9jcmVhdGUgOiBpbmNvcnJlY3Qgc3RyZWFtIHR5cGUiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAgICAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdElucHV0Q3RzICAgICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RJbnB1dEN0cyAgICAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJSZW5kZXJlZEZyYW1lcyAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdFJlbmRlcmVkQ3RzICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RSZW5kZXJlZEN0cyAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMgICAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdE91dHB1dEN0cyAgICA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0T3V0cHV0Q3RzICAgICA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgICA9IE00T1NBX05VTEw7Ci0KLSAgICAvLyBDYWxjdWxhdGUgdGhlIGludGVydmFsIGJldHdlZW4gdHdvIHZpZGVvIGZyYW1lcy4KLSAgICBpZihwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fYXZlcmFnZUZyYW1lUmF0ZSA+IDApewotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRnJhbWVJbnRlcnZhbE1zID0KLSAgICAgICAgICAgIDEwMDAuMCAvIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YWdlRnJpZ2h0IGdyYXBoIGJ1aWxkaW5nCi0gICAgICovCi0gICAgZGVjb2Rlck1ldGFkYXRhID0gbmV3IE1ldGFEYXRhOwotICAgIHN3aXRjaCggcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlICkgewotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tIMjYzVmlkZW9EZWM6Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIlZpZGVvRGVjb2Rlcl9jcmVhdGUgOiBpbmNvcnJlY3Qgc3RyZWFtIHR5cGUiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZSk7Ci0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoKTsKLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGRlY29kZXIgc291cmNlCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZSA9IG5ldyBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgKLSAgICAgICAgZGVjb2Rlck1ldGFkYXRhLCBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUsCi0gICAgICAgICh2b2lkICopcERlY1NoZWxsQ29udGV4dCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tUmVhZGVyU291cmNlLmdldCgpLAotICAgICAgICBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgc3RhdHVzID0gcERlY1NoZWxsQ29udGV4dC0+bUNsaWVudC5jb25uZWN0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gc3RhdHVzLCBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAgQUxPR0koIlVzaW5nIHNvZnR3YXJlIGNvZGVjcyBvbmx5Iik7Ci0gICAgLy8gQ3JlYXRlIHRoZSBkZWNvZGVyCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1DbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgIGRlY29kZXJNZXRhZGF0YSwgZmFsc2UsIHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UsTlVMTCxPTVhDb2RlYzo6a1NvZnR3YXJlQ29kZWNzT25seSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLmdldCgpLAotICAgICAgICBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAvLyBHZXQgdGhlIG91dHB1dCBjb2xvciBmb3JtYXQKLSAgICBzdWNjZXNzID0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKLSAgICAgICAga0tleUNvbG9yRm9ybWF0LCAmY29sb3JGb3JtYXQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKFRSVUUgPT0gc3VjY2VzcywgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5kZWNPdXB1dENvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWNvbG9yRm9ybWF0OwotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPnNldEludDMyKGtLZXlXaWR0aCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGgpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5zZXRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQpOwotCi0gICAgLy8gQ29uZmlndXJlIHRoZSBidWZmZXIgcG9vbCBmcm9tIHRoZSBtZXRhZGF0YQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YShwRGVjU2hlbGxDb250ZXh0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS5nZXQoKSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBTdGFydCB0aGUgZ3JhcGgKLSAgICBzdGF0dXMgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5zdGFydCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHN0YXR1cywgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgKnBDb250ZXh0ID0gKE00T1NBX0NvbnRleHQpcERlY1NoZWxsQ29udGV4dDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95KHBEZWNTaGVsbENvbnRleHQpOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIDogRE9ORSIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkgewotICAgIE00T1NBX0VSUiBsZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKSBjb250ZXh0OwotICAgIE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSogcFZpZGVvU2l6ZTsKLSAgICBNNE9TQV9VSW50MzIqIHBOZXh0RnJhbWVDdHM7Ci0gICAgTTRPU0FfVUludDMyICpwbGFzdERlY29kZWRGcmFtZUN0czsKLSAgICBNNERFQ09ERVJfQVZDUHJvZmlsZUxldmVsKiBwcm9maWxlOwotICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyogcERlY0NvbmZJbmZvOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbiBiZWdpbiIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkgewotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfQVZDTGFzdERlY29kZWRGcmFtZUNUUzoKLSAgICAgICAgICAgICBwbGFzdERlY29kZWRGcmFtZUN0cyA9IChNNE9TQV9VSW50MzIgKikgcFZhbHVlOwotICAgICAgICAgICAgICpwbGFzdERlY29kZWRGcmFtZUN0cyA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFM7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX1ZlcnNpb246Ci0gICAgICAgICAgICBwVmVyc2lvbkluZm8gPSAoTTRfVmVyc2lvbkluZm8qKXBWYWx1ZTsKLQotICAgICAgICAgICAgcFZlcnNpb25JbmZvLT5tX21ham9yID0gVklERU9FRElUT1JfVklERUNfU0hFTExfVkVSX01BSk9SOwotICAgICAgICAgICAgcFZlcnNpb25JbmZvLT5tX21pbm9yPSBWSURFT0VESVRPUl9WSURFQ19TSEVMTF9WRVJfTUlOT1I7Ci0gICAgICAgICAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gPSBWSURFT0VESVRPUl9WSURFQ19TSEVMTF9WRVJfUkVWSVNJT047Ci0gICAgICAgICAgICBwVmVyc2lvbkluZm8tPm1fc3RydWN0U2l6ZT1zaXplb2YoTTRfVmVyc2lvbkluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX1ZpZGVvU2l6ZToKLSAgICAgICAgICAgIC8qKiBPbmx5IFZQUyB1c2VzIHRoaXMgT3B0aW9uIElELiAqLwotICAgICAgICAgICAgcFZpZGVvU2l6ZSA9IChNNERFQ09ERVJfVmlkZW9TaXplKilwVmFsdWU7Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlXaWR0aCwKLSAgICAgICAgICAgICAgICAoaW50MzJfdCopKCZwVmlkZW9TaXplLT5tX3VpV2lkdGgpKTsKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleUhlaWdodCwKLSAgICAgICAgICAgICAgICAoaW50MzJfdCopKCZwVmlkZW9TaXplLT5tX3VpSGVpZ2h0KSk7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0T3B0aW9uIDogVz0lZCBIPSVkIiwKLSAgICAgICAgICAgICAgICBwVmlkZW9TaXplLT5tX3VpV2lkdGgsIHBWaWRlb1NpemUtPm1fdWlIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX05leHRSZW5kZXJlZEZyYW1lQ1RTOgotICAgICAgICAgICAgLyoqIEhvdyB0byBnZXQgdGhpcyBpbmZvcm1hdGlvbi4gU0YgZGVjb2RlciBkb2VzIG5vdCBwcm92aWRlIHRoaXMuICoKLSAgICAgICAgICAgICoqIExldCB1cyBwcm92aWRlIGxhc3QgZGVjb2RlZCBmcmFtZSBDVFMgYXMgb2Ygbm93LiAqCi0gICAgICAgICAgICAqKiBPbmx5IFZQUyB1c2VzIHRoaXMgT3B0aW9uIElELiAqLwotICAgICAgICAgICAgcE5leHRGcmFtZUN0cyA9IChNNE9TQV9VSW50MzIgKilwVmFsdWU7Ci0gICAgICAgICAgICAqcE5leHRGcmFtZUN0cyA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERFQ09ERVJfTVBFRzRfa09wdGlvbklEX0RlY29kZXJDb25maWdJbmZvOgotICAgICAgICAgICAgaWYocERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID09IFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjKSB7Ci0gICAgICAgICAgICAgICAgKCooTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvKilwVmFsdWUpID0KLSAgICAgICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9EY2k7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGxlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0T3B0aW9uOiBlbmQgd2l0aCBlcnIgPSAweCV4IiwgbGVycik7Ci0gICAgcmV0dXJuIGxlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsKLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCAqcERlY1NoZWxsQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KikgY29udGV4dDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9zZXRPcHRpb24gYmVnaW4iKTsKLQotICAgIHN3aXRjaCAob3B0aW9uSWQpIHsKLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX091dHB1dEZpbHRlcjogewotICAgICAgICAgICAgICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIqIHBPdXRwdXRGaWx0ZXIgPQotICAgICAgICAgICAgICAgICAgICAoTTRERUNPREVSX091dHB1dEZpbHRlciopIHBWYWx1ZTsKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BGaWx0ZXIgPQotICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX1BsYW5Db252ZXJ0ZXJGdW5jdGlvblR5cGUqKXBPdXRwdXRGaWx0ZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9wRmlsdGVyRnVuY3Rpb247Ci0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRmlsdGVyVXNlckRhdGEgPQotICAgICAgICAgICAgICAgICAgICBwT3V0cHV0RmlsdGVyLT5tX3BGaWx0ZXJVc2VyRGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfRGVibG9ja2luZ0ZpbHRlcjoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbGVyciA9IE00RVJSX0JBRF9DT05URVhUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3NldE9wdGlvbjogZW5kIHdpdGggZXJyID0gMHgleCIsIGxlcnIpOwotICAgIHJldHVybiBsZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfTWVkaWFUaW1lKiBwVGltZSwgTTRPU0FfQm9vbCBiSnVtcCwgTTRPU0FfVUludDMyIHRvbGVyYW5jZSkgewotICAgIE00T1NBX0VSUiBsZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKSBjb250ZXh0OwotICAgIGludDY0X3QgbEZyYW1lVGltZTsKLSAgICBNZWRpYUJ1ZmZlciogcERlY29kZXJCdWZmZXIgPSBOVUxMOwotICAgIE1lZGlhQnVmZmVyKiBwTmV4dEJ1ZmZlciA9IE5VTEw7Ci0gICAgc3RhdHVzX3QgZXJyU3RhdHVzOwotICAgIGJvb2wgbmVlZFNlZWsgPSBiSnVtcDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUgYmVnaW4iKTsKLQotICAgIGlmKCBNNE9TQV9UUlVFID09IHBEZWNTaGVsbENvbnRleHQtPm1SZWFjaGVkRU9TICkgewotICAgICAgICAvLyBEbyBub3QgY2FsbCByZWFkKCksIGl0IGNvdWxkIGxlYWQgdG8gYSBmcmVlemUKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZSA6IEVPUyBhbHJlYWR5IHJlYWNoZWQiKTsKLSAgICAgICAgbGVyciA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgIGdvdG8gVklERU9FRElUT1JfVmlkZW9EZWNvZGVfY2xlYW5VUDsKLSAgICB9Ci0gICAgaWYocERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyA+PSAqcFRpbWUpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9kZWNvZGU6IEFscmVhZHkgZGVjb2RlZCB1cCB0byB0aGlzIHRpbWUgQ1RTID0gJWxmLiIsCi0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTKTsKLSAgICAgICAgZ290byBWSURFT0VESVRPUl9WaWRlb0RlY29kZV9jbGVhblVQOwotICAgIH0KLSAgICBpZihNNE9TQV9UUlVFID09IGJKdW1wKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGU6IEp1bXAgY2FsbGVkIik7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgPSAtMTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0UmVuZGVyQ3RzID0gLTE7Ci0gICAgfQotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLSAgICBpZiAoMCA+IHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdElucHV0Q3RzKXsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMgPSAqcFRpbWU7Ci0gICAgfQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0SW5wdXRDdHMgPSAqcFRpbWU7Ci0KLSAgICB3aGlsZSAocERlY29kZXJCdWZmZXIgPT0gTlVMTCB8fCBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTICsgdG9sZXJhbmNlIDwgKnBUaW1lKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUsIGZyYW1lQ1RTID0gJWxmLCBEZWNvZGVVcFRvID0gJWxmIiwKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMsICpwVGltZSk7Ci0KLSAgICAgICAgLy8gUmVhZCB0aGUgYnVmZmVyIGZyb20gdGhlIHN0YWdlZnJpZ2h0IGRlY29kZXIKLSAgICAgICAgaWYgKG5lZWRTZWVrKSB7Ci0gICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgICAgIGludDY0X3QgdGltZV91cyA9ICpwVGltZSAqIDEwMDA7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyh0aW1lX3VzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgICAgICAgICBlcnJTdGF0dXMgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5yZWFkKCZwTmV4dEJ1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgbmVlZFNlZWsgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyclN0YXR1cyA9IHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPnJlYWQoJnBOZXh0QnVmZmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBFT1MgYW5kIGZvcm1hdCBjaGFuZ2UKLSAgICAgICAgaWYgKGVyclN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBBTE9HVigiRW5kIG9mIHN0cmVhbSByZWFjaGVkLCByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSAiKTsKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1SZWFjaGVkRU9TID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGxlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICAgICAgLy8gSWYgd2UgZGVjb2RlZCBhIGJ1ZmZlciBiZWZvcmUgRU9TLCB3ZSBzdGlsbCBuZWVkIHRvIHB1dCBpdAotICAgICAgICAgICAgLy8gaW50byB0aGUgcXVldWUuCi0gICAgICAgICAgICBpZiAocERlY29kZXJCdWZmZXIgJiYgYkp1bXApIHsKLSAgICAgICAgICAgICAgICBjb3B5QnVmZmVyVG9RdWV1ZShwRGVjU2hlbGxDb250ZXh0LCBwRGVjb2RlckJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnb3RvIFZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA7Ci0gICAgICAgIH0gZWxzZSBpZiAoSU5GT19GT1JNQVRfQ0hBTkdFRCA9PSBlcnJTdGF0dXMpIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfZGVjb2RlIDogc291cmNlIHJldHVybnMgSU5GT19GT1JNQVRfQ0hBTkdFRCIpOwotICAgICAgICAgICAgbGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSgKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LAotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLmdldCgpKTsKLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGxlcnIgKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiEhISBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUgRVJST1IgOiAiCi0gICAgICAgICAgICAgICAgICAgICJWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIHJldHVybnMgMHglWCIsIGxlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXJyU3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlIEVSUk9SOjB4JXgoJWQpIiwKLSAgICAgICAgICAgICAgICBlcnJTdGF0dXMsZXJyU3RhdHVzKTsKLSAgICAgICAgICAgIGxlcnIgPSBlcnJTdGF0dXM7Ci0gICAgICAgICAgICBnb3RvIFZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgT01YQ29kZWMgY2xpZW50IHNob3VsZCBleHBlY3QgdG8gcmVjZWl2ZSAwLWxlbmd0aCBidWZmZXJzCi0gICAgICAgIC8vIGFuZCBkcm9wIHRoZSAwLWxlbmd0aCBidWZmZXJzLgotICAgICAgICBpZiAocE5leHRCdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHBOZXh0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyB3ZSBoYXZlIGEgZ29vZCBuZXh0IGJ1ZmZlciwgcmVsZWFzZSB0aGUgcHJldmlvdXMgb25lLgotICAgICAgICBpZiAocERlY29kZXJCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgcERlY29kZXJCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIHBEZWNvZGVyQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBwRGVjb2RlckJ1ZmZlciA9IHBOZXh0QnVmZmVyOwotCi0gICAgICAgIC8vIFJlY29yZCB0aGUgdGltZXN0YW1wIG9mIGxhc3QgZGVjb2RlZCBidWZmZXIKLSAgICAgICAgcERlY29kZXJCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZsRnJhbWVUaW1lKTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyA9IChNNF9NZWRpYVRpbWUpKGxGcmFtZVRpbWUvMTAwMCk7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUsZGVjb2RlZCBmcmFtZXRpbWUgPSAlbGYsc2l6ZSA9ICVkIiwKLSAgICAgICAgICAgIChNNF9NZWRpYVRpbWUpbEZyYW1lVGltZSwgcERlY29kZXJCdWZmZXItPnNpemUoKSApOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIG5lZWQgdG8gc2F2ZSBhIGJ1ZmZlciBpZiBiSnVtcCA9PSBmYWxzZSB0byBhIHF1ZXVlLiBUaGVzZQotICAgICAgICAgKiBidWZmZXJzIGhhdmUgYSB0aW1lc3RhbXAgPj0gdGhlIHRhcmdldCB0aW1lLCAqcFRpbWUgKGZvciBpbnN0YW5jZSwKLSAgICAgICAgICogdGhlIHRyYW5zaXRpb24gYmV0d2VlbiB0d28gdmlkZW9zLCBvciBhIHRyaW1taW5nIHBvc3Rpb24gaW5zaWRlCi0gICAgICAgICAqIG9uZSB2aWRlbyksIHNpbmNlIHRoZXkgYXJlIHBhcnQgb2YgdGhlIHRyYW5zaXRpb24gY2xpcCBvciB0aGUKLSAgICAgICAgICogdHJpbW1lZCB2aWRlby4KLSAgICAgICAgICoKLSAgICAgICAgICogSWYgKnBUaW1lIGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYW55IG9mIHRoZSBleGlzdGluZwotICAgICAgICAgKiB2aWRlbyBmcmFtZXMsIHdlIHdvdWxkIGxpa2UgdG8gZ2V0IHRoZSBidWZmZXIgcmlnaHQgYmVmb3JlICpwVGltZQotICAgICAgICAgKiBhbmQgaW4gdGhlIHRyYW5zY29kaW5nIHBocmFzZSwgdGhpcyB2aWRlbyBmcmFtZSB3aWxsIGJlIGVuY29kZWQKLSAgICAgICAgICogYXMgYSBrZXkgZnJhbWUgYW5kIGJlY29tZXMgdGhlIGZpcnN0IHZpZGVvIGZyYW1lIGZvciB0aGUgdHJhbnNpdGlvbiBvciB0aGUKLSAgICAgICAgICogdHJpbW1lZCB2aWRlbyB0byBiZSBnZW5lcmF0ZWQuIFRoaXMgYnVmZmVyIG11c3QgYWxzbyBiZSBxdWV1ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqLwotICAgICAgICBpbnQ2NF90IHRhcmdldFRpbWVNcyA9Ci0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyArCi0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUZyYW1lSW50ZXJ2YWxNcyArCi0gICAgICAgICAgICAgICAgdG9sZXJhbmNlOwotICAgICAgICBpZiAoIWJKdW1wIHx8IHRhcmdldFRpbWVNcyA+ICpwVGltZSkgewotICAgICAgICAgICAgbGVyciA9IGNvcHlCdWZmZXJUb1F1ZXVlKHBEZWNTaGVsbENvbnRleHQsIHBEZWNvZGVyQnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChsZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBnb3RvIFZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMrKzsKLSAgICBpZiAoIDAgPiBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgKSB7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdE91dHB1dEN0cyA9ICpwVGltZTsKLSAgICB9Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgPSAqcFRpbWU7Ci0KLVZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA6Ci0gICAgKnBUaW1lID0gcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUzsKLSAgICBpZiAocERlY29kZXJCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBwRGVjb2RlckJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBwRGVjb2RlckJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZTogZW5kIHdpdGggMHgleCIsIGxlcnIpOwotICAgIHJldHVybiBsZXJyOwotfQotCi1zdGF0aWMgTTRPU0FfRVJSIGNvcHlCdWZmZXJUb1F1ZXVlKAotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQsCi0gICAgTWVkaWFCdWZmZXIqIHBEZWNvZGVyQnVmZmVyKSB7Ci0KLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlciogdG1wRGVjQnVmZmVyOwotCi0gICAgLy8gR2V0IGEgYnVmZmVyIGZyb20gdGhlIHF1ZXVlCi0gICAgbGVyciA9IFZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIocERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX2tFbXB0eSwgJnRtcERlY0J1ZmZlcik7Ci0gICAgaWYgKGxlcnIgPT0gKE00T1NBX1VJbnQzMilNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFKSB7Ci0gICAgICAgIGxlcnIgPSBWSURFT0VESVRPUl9CVUZGRVJfZ2V0T2xkZXN0QnVmZmVyKAotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCwKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9rRmlsbGVkLCAmdG1wRGVjQnVmZmVyKTsKLSAgICAgICAgdG1wRGVjQnVmZmVyLT5zdGF0ZSA9IFZJREVPRURJVE9SX0JVRkZFUl9rRW1wdHk7Ci0gICAgICAgIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChsZXJyICE9IE00Tk9fRVJST1IpIHJldHVybiBsZXJyOwotCi0gICAgLy8gQ29sb3IgY29udmVydCBvciBjb3B5IGZyb20gdGhlIGdpdmVuIE1lZGlhQnVmZmVyIHRvIG91ciBidWZmZXIKLSAgICBpZiAocERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcikgewotICAgICAgICBpZiAocERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlci0+Y29udmVydERlY29kZXJPdXRwdXRUb0k0MjAoCi0gICAgICAgICAgICAodWludDhfdCAqKXBEZWNvZGVyQnVmZmVyLT5kYXRhKCksLy8gPz8gKyBwRGVjb2RlckJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksICAgLy8gZGVjb2RlckJpdHMKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoLCAgLy8gZGVjb2RlcldpZHRoCi0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQsICAvLyBkZWNvZGVySGVpZ2h0Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ3JvcFJlY3QsICAvLyBkZWNvZGVyUmVjdAotICAgICAgICAgICAgdG1wRGVjQnVmZmVyLT5wRGF0YSAvKiBkc3RCaXRzICovKSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJjb252ZXJ0RGVjb2Rlck91dHB1dFRvSTQyMCBmYWlsZWQiKTsKLSAgICAgICAgICAgIGxlcnIgPSBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBEZWNTaGVsbENvbnRleHQtPmRlY091cHV0Q29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICBpbnQzMl90IHdpZHRoID0gcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIGludDMyX3QgaGVpZ2h0ID0gcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0OwotICAgICAgICBpbnQzMl90IHlQbGFuZVNpemUgPSB3aWR0aCAqIGhlaWdodDsKLSAgICAgICAgaW50MzJfdCB1dlBsYW5lU2l6ZSA9IHdpZHRoICogaGVpZ2h0IC8gNDsKLSAgICAgICAgaW50MzJfdCBvZmZzZXRTcmMgPSAwOwotCi0gICAgICAgIGlmICgoIHdpZHRoID09IHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoICkgICYmCi0gICAgICAgICAgICAoIGhlaWdodCA9PSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQgKSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcFRtcEJ1ZmYgPSAoTTRPU0FfTWVtQWRkcjgpcERlY29kZXJCdWZmZXItPmRhdGEoKSArIHBEZWNvZGVyQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopdG1wRGVjQnVmZmVyLT5wRGF0YSwgKHZvaWQgKilwVG1wQnVmZiwgeVBsYW5lU2l6ZSk7Ci0KLSAgICAgICAgICAgIG9mZnNldFNyYyArPSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCAqIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodDsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpdG1wRGVjQnVmZmVyLT5wRGF0YSArIHlQbGFuZVNpemUpLAotICAgICAgICAgICAgICAgICh2b2lkICopKHBUbXBCdWZmICsgb2Zmc2V0U3JjKSwgdXZQbGFuZVNpemUpOwotCi0gICAgICAgICAgICBvZmZzZXRTcmMgKz0gKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoID4+IDEpICogKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodCA+PiAxKTsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpdG1wRGVjQnVmZmVyLT5wRGF0YSArIHlQbGFuZVNpemUgKyB1dlBsYW5lU2l6ZSksCi0gICAgICAgICAgICAgICAgKHZvaWQgKikocFRtcEJ1ZmYgKyBvZmZzZXRTcmMpLCB1dlBsYW5lU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBwVG1wQnVmZiA9IChNNE9TQV9NZW1BZGRyOClwRGVjb2RlckJ1ZmZlci0+ZGF0YSgpICsgcERlY29kZXJCdWZmZXItPnJhbmdlX29mZnNldCgpOwotICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcFRtcEJ1ZmZEc3QgPSAoTTRPU0FfTWVtQWRkcjgpdG1wRGVjQnVmZmVyLT5wRGF0YTsKLSAgICAgICAgICAgIGludDMyX3QgaW5kZXg7Ci0KLSAgICAgICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBoZWlnaHQ7IGluZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcEJ1ZmZEc3QsICh2b2lkICopcFRtcEJ1ZmYsIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwVG1wQnVmZkRzdCArPSB3aWR0aDsKLSAgICAgICAgICAgICAgICBwVG1wQnVmZiArPSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcFRtcEJ1ZmYgKz0gKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoICogKCBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQgLSBoZWlnaHQpKTsKLSAgICAgICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBoZWlnaHQgPj4gMTsgaW5kZXgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wQnVmZkRzdCwgKHZvaWQgKilwVG1wQnVmZiwgd2lkdGggPj4gMSk7Ci0gICAgICAgICAgICAgICAgcFRtcEJ1ZmZEc3QgKz0gd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICBwVG1wQnVmZiArPSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCA+PiAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwVG1wQnVmZiArPSAoKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoICogKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodCAtIGhlaWdodCkpIC8gNCk7Ci0gICAgICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgaGVpZ2h0ID4+IDE7IGluZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcEJ1ZmZEc3QsICh2b2lkICopcFRtcEJ1ZmYsIHdpZHRoID4+IDEpOwotICAgICAgICAgICAgICAgIHBUbXBCdWZmRHN0ICs9IHdpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgcFRtcEJ1ZmYgKz0gcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggPj4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJWaWRlb0RlY29kZXJfZGVjb2RlOiB1bmV4cGVjdGVkIGNvbG9yIGZvcm1hdCAweCVYIiwKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPmRlY091cHV0Q29sb3JGb3JtYXQpOwotICAgICAgICBsZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHRtcERlY0J1ZmZlci0+YnVmZkNUUyA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFM7Ci0gICAgdG1wRGVjQnVmZmVyLT5zdGF0ZSA9IFZJREVPRURJVE9SX0JVRkZFUl9rRmlsbGVkOwotICAgIHRtcERlY0J1ZmZlci0+c2l6ZSA9IHBEZWNvZGVyQnVmZmVyLT5zaXplKCk7Ci0KLSAgICByZXR1cm4gbGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlcihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X01lZGlhVGltZSogcFRpbWUsIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0cHV0UGxhbmUsCi0gICAgICAgIE00T1NBX0Jvb2wgYkZvcmNlUmVuZGVyKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KikgY29udGV4dDsKLSAgICBNNE9TQV9VSW50MzIgbGluZGV4LCBpOwotICAgIE00T1NBX1VJbnQ4KiBwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotICAgIE00VklGSV9JbWFnZVBsYW5lIHRtcFBsYW5lSW4sIHRtcFBsYW5lT3V0OwotICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqIHBUbXBWSURFT0VESVRPUkJ1ZmZlciwgKnBSZW5kZXJWSURFT0VESVRPUkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIE00X01lZGlhVGltZSBjYW5kaWRhdGVUaW1lU3RhbXAgPSAtMTsKLSAgICBNNE9TQV9Cb29sIGJGb3VuZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlciBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwVGltZSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBPdXRwdXRQbGFuZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIFRoZSBvdXRwdXQgYnVmZmVyIGlzIGFscmVhZHkgYWxsb2NhdGVkLCBqdXN0IGNvcHkgdGhlIGRhdGEKLSAgICBpZiAoICgqcFRpbWUgPD0gcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0UmVuZGVyQ3RzKSAmJgotICAgICAgICAgICAgKE00T1NBX0ZBTFNFID09IGJGb3JjZVJlbmRlcikgKSB7Ci0gICAgICAgIEFMT0dWKCJWSURFT0VESVRPUl9WSURFT19yZW5kZXIgRnJhbWUgaW4gdGhlIHBhc3QiKTsKLSAgICAgICAgZXJyID0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUU7Ci0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9yZW5kZXI6IGxhc3RSZW5kZXJlZCB0aW1lID0gJWxmLHJlcXVlc3RlZCByZW5kZXIgdGltZSA9ICIKLSAgICAgICAgIiVsZiIsIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0cywgKnBUaW1lKTsKLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIGJ1ZmZlciBhcHByb3ByaWF0ZSBmb3IgcmVuZGVyaW5nLiAgKi8KLSAgICBmb3IgKGk9MDsgaSA8IHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wtPk5COyBpKyspIHsKLSAgICAgICAgcFRtcFZJREVPRURJVE9SQnVmZmVyID0gJnBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2xcCi0gICAgICAgICAgICAtPnBOWFBCdWZmZXJbaV07Ci0gICAgICAgIGlmIChwVG1wVklERU9FRElUT1JCdWZmZXItPnN0YXRlID09IFZJREVPRURJVE9SX0JVRkZFUl9rRmlsbGVkKSB7Ci0gICAgICAgICAgICAvKiogRnJlZSBhbGwgdGhvc2UgYnVmZmVycyBvbGRlciB0aGFuIGxhc3QgcmVuZGVyZWQgZnJhbWUuICovCi0gICAgICAgICAgICBpZiAocFRtcFZJREVPRURJVE9SQnVmZmVyLT5idWZmQ1RTIDwgcERlY1NoZWxsQ29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBtX2xhc3RSZW5kZXJDdHMpIHsKLSAgICAgICAgICAgICAgICBwVG1wVklERU9FRElUT1JCdWZmZXItPnN0YXRlID0gVklERU9FRElUT1JfQlVGRkVSX2tFbXB0eTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqIEdldCB0aGUgYnVmZmVyIHdpdGggYXBwcm9wcmlhdGUgdGltZXN0YW1wICAqLwotICAgICAgICAgICAgaWYgKCAocFRtcFZJREVPRURJVE9SQnVmZmVyLT5idWZmQ1RTID49IHBEZWNTaGVsbENvbnRleHQtPlwKLSAgICAgICAgICAgICAgICAgICAgbV9sYXN0UmVuZGVyQ3RzKSAmJgotICAgICAgICAgICAgICAgIChwVG1wVklERU9FRElUT1JCdWZmZXItPmJ1ZmZDVFMgPD0gKnBUaW1lKSAmJgotICAgICAgICAgICAgICAgIChwVG1wVklERU9FRElUT1JCdWZmZXItPmJ1ZmZDVFMgPiBjYW5kaWRhdGVUaW1lU3RhbXApKSB7Ci0gICAgICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwUmVuZGVyVklERU9FRElUT1JCdWZmZXIgPSBwVG1wVklERU9FRElUT1JCdWZmZXI7Ci0gICAgICAgICAgICAgICAgY2FuZGlkYXRlVGltZVN0YW1wID0gcFRtcFZJREVPRURJVE9SQnVmZmVyLT5idWZmQ1RTOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfcmVuZGVyOiBmb3VuZCBhIGJ1ZmZlciB3aXRoIHRpbWVzdGFtcCA9ICVsZiIsCi0gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVRpbWVTdGFtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKE00T1NBX0ZBTFNFID09IGJGb3VuZCkgewotICAgICAgICBlcnIgPSBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRTsKLSAgICAgICAgZ290byBjbGVhblVwOwotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgMyBvdXB1dCAlZCAlZCAlZCAlZCIsCi0gICAgICAgIHBPdXRwdXRQbGFuZVswXS51X3dpZHRoLCBwT3V0cHV0UGxhbmVbMF0udV9oZWlnaHQsCi0gICAgICAgIHBPdXRwdXRQbGFuZVswXS51X3RvcGxlZnQsIHBPdXRwdXRQbGFuZVswXS51X3N0cmlkZSk7Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHMgPSBjYW5kaWRhdGVUaW1lU3RhbXA7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BGaWx0ZXIgKSB7Ci0gICAgICAgIC8vIEZpbHRlcmluZyB3YXMgcmVxdWVzdGVkCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lIHRtcFBsYW5lWzNdOwotICAgICAgICAvLyBQcmVwYXJlIHRoZSBvdXRwdXQgaW1hZ2UgZm9yIGNvbnZlcnNpb24KLSAgICAgICAgdG1wUGxhbmVbMF0udV93aWR0aCAgID0KLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoOwotICAgICAgICB0bXBQbGFuZVswXS51X2hlaWdodCAgPQotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0OwotICAgICAgICB0bXBQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICB0bXBQbGFuZVswXS51X3N0cmlkZSAgPSB0bXBQbGFuZVswXS51X3dpZHRoOwotICAgICAgICB0bXBQbGFuZVswXS5wYWNfZGF0YSAgPSAoTTRWSUZJX1VJbnQ4KilwUmVuZGVyVklERU9FRElUT1JCdWZmZXItPnBEYXRhOwotICAgICAgICB0bXBQbGFuZVsxXS51X3dpZHRoICAgPSB0bXBQbGFuZVswXS51X3dpZHRoLzI7Ci0gICAgICAgIHRtcFBsYW5lWzFdLnVfaGVpZ2h0ICA9IHRtcFBsYW5lWzBdLnVfaGVpZ2h0LzI7Ci0gICAgICAgIHRtcFBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHRtcFBsYW5lWzFdLnVfc3RyaWRlICA9IHRtcFBsYW5lWzBdLnVfc3RyaWRlLzI7Ci0gICAgICAgIHRtcFBsYW5lWzFdLnBhY19kYXRhICA9IHRtcFBsYW5lWzBdLnBhY19kYXRhICsKLSAgICAgICAgICAgICh0bXBQbGFuZVswXS51X3N0cmlkZSAqIHRtcFBsYW5lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgdG1wUGxhbmVbMl0udV93aWR0aCAgID0gdG1wUGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgdG1wUGxhbmVbMl0udV9oZWlnaHQgID0gdG1wUGxhbmVbMV0udV9oZWlnaHQ7Ci0gICAgICAgIHRtcFBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHRtcFBsYW5lWzJdLnVfc3RyaWRlICA9IHRtcFBsYW5lWzFdLnVfc3RyaWRlOwotICAgICAgICB0bXBQbGFuZVsyXS5wYWNfZGF0YSAgPSB0bXBQbGFuZVsxXS5wYWNfZGF0YSArCi0gICAgICAgICAgICAodG1wUGxhbmVbMV0udV9zdHJpZGUgKiB0bXBQbGFuZVsxXS51X2hlaWdodCk7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlciB3ID0gJWQgSCA9ICVkIiwKLSAgICAgICAgICAgIHRtcFBsYW5lWzBdLnVfd2lkdGgsdG1wUGxhbmVbMF0udV9oZWlnaHQpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BGaWx0ZXIoTTRPU0FfTlVMTCwgJnRtcFBsYW5lWzBdLCBwT3V0cHV0UGxhbmUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEp1c3QgY29weSB0aGUgWVVWNDIwUCBidWZmZXIKLSAgICAgICAgTTRPU0FfTWVtQWRkcjggdGVtcEJ1ZmZQdHIgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBSZW5kZXJWSURFT0VESVRPUkJ1ZmZlci0+cERhdGE7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wV2lkdGggPQotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSGVpZ2h0ID0KLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodDsKLQotICAgICAgICBtZW1jcHkoKHZvaWQgKikgcE91dHB1dFBsYW5lWzBdLnBhY19kYXRhLCAodm9pZCAqKXRlbXBCdWZmUHRyLAotICAgICAgICAgICAgdGVtcFdpZHRoICogdGVtcEhlaWdodCk7Ci0gICAgICAgIHRlbXBCdWZmUHRyICs9ICh0ZW1wV2lkdGggKiB0ZW1wSGVpZ2h0KTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopIHBPdXRwdXRQbGFuZVsxXS5wYWNfZGF0YSwgKHZvaWQgKil0ZW1wQnVmZlB0ciwKLSAgICAgICAgICAgICh0ZW1wV2lkdGgvMikgKiAodGVtcEhlaWdodC8yKSk7Ci0gICAgICAgIHRlbXBCdWZmUHRyICs9ICgodGVtcFdpZHRoLzIpICogKHRlbXBIZWlnaHQvMikpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKikgcE91dHB1dFBsYW5lWzJdLnBhY19kYXRhLCAodm9pZCAqKXRlbXBCdWZmUHRyLAotICAgICAgICAgICAgKHRlbXBXaWR0aC8yKSAqICh0ZW1wSGVpZ2h0LzIpKTsKLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJSZW5kZXJlZEZyYW1lcysrOwotICAgIGlmICggMCA+IHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdFJlbmRlcmVkQ3RzICkgewotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RSZW5kZXJlZEN0cyA9ICpwVGltZTsKLSAgICB9Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RSZW5kZXJlZEN0cyA9ICpwVGltZTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgICpwVGltZSA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0czsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlciBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZShNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqIHBEZWNvZGVySW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLQotICAgIHBEZWNvZGVySW50ZXJmYWNlID0gKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBzaXplb2YoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKSwgTTRERUNPREVSX0VYVEVSTkFMLAotICAgICAgICAoTTRPU0FfQ2hhciopIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZSIgKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRGVjb2RlckludGVyZmFjZSkgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgKnBEZWNvZGVyVHlwZSA9IGRlY29kZXJUeXBlOwotCi0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdENyZWF0ZSAgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZTsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0RGVzdHJveSAgID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveTsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0R2V0T3B0aW9uID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0T3B0aW9uOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3RTZXRPcHRpb24gPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9zZXRPcHRpb247Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdERlY29kZSAgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZTsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0UmVuZGVyICAgID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyOwotCi0gICAgKnBEZWNJbnRlcmZhY2UgPSAoTTRPU0FfQ29udGV4dClwRGVjb2RlckludGVyZmFjZTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlKE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogcERlY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotCi0gICAgcERlY29kZXJJbnRlcmZhY2UgPSAoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIHNpemVvZihNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UpLCBNNERFQ09ERVJfRVhURVJOQUwsCi0gICAgICAgIChNNE9TQV9DaGFyKikiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlIiApOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAqcERlY29kZXJUeXBlID0gZGVjb2RlclR5cGU7Ci0KLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0Q3JlYXRlICAgID0gVmlkZW9FZGl0b3JWaWRlb1NvZnR3YXJlRGVjb2Rlcl9jcmVhdGU7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdERlc3Ryb3kgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3k7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdEdldE9wdGlvbiA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbjsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0U2V0T3B0aW9uID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfc2V0T3B0aW9uOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3REZWNvZGUgICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGU7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdFJlbmRlciAgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlcjsKLQotICAgICpwRGVjSW50ZXJmYWNlID0gKE00T1NBX0NvbnRleHQpcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9NUEVHNCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLCBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZShNNERFQ09ERVJfa1ZpZGVvVHlwZU1QRUc0LAotICAgICAgICBwRGVjb2RlclR5cGUsIHBEZWNJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoTTRERUNPREVSX2tWaWRlb1R5cGVBVkMsCi0gICAgICAgIHBEZWNvZGVyVHlwZSwgcERlY0ludGVyZmFjZSk7Ci0KLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlX01QRUc0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0U29mdHdhcmVJbnRlcmZhY2UoTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNCwKLSAgICAgICAgcERlY29kZXJUeXBlLCBwRGVjSW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlX0gyNjQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZShNNERFQ09ERVJfa1ZpZGVvVHlwZUFWQywKLSAgICAgICAgcERlY29kZXJUeXBlLCBwRGVjSW50ZXJmYWNlKTsKLQotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0VmlkZW9EZWNvZGVyc0FuZENhcGFiaWxpdGllcygKLSAgICBNNERFQ09ERVJfVmlkZW9EZWNvZGVycyoqIGRlY29kZXJzKSB7Ci0gICAgcmV0dXJuIHF1ZXJ5VmlkZW9EZWNvZGVyQ2FwYWJpbGl0aWVzKGRlY29kZXJzKTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDc4NzY4MC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBlbmNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVklERU9FRElUT1JfVklERU9FTkNPREVSIgotCi0vKioqKioqKioqKioqKioqKioqKgotICogICAgIEhFQURFUlMgICAgICoKLSAqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotI2luY2x1ZGUgIk1lZGlhQnVmZmVyUHVsbGVyLmgiCi0jaW5jbHVkZSA8STQyMENvbG9yQ29udmVydGVyLmg+Ci0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KLSNpbmNsdWRlICJPTVhfVmlkZW8uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgIERFRklOSVRJT05TICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gRm9yY2UgdXNpbmcgaGFyZHdhcmUgZW5jb2RlcgotI2RlZmluZSBWSURFT0VESVRPUl9GT1JDRUNPREVDIGtIYXJkd2FyZUNvZGVjc09ubHkKLQotI2lmICFkZWZpbmVkKFZJREVPRURJVE9SX0ZPUkNFQ09ERUMpCi0gICAgI2Vycm9yICJDYW5ub3QgZm9yY2UgRFNJIHJldHJpZXZhbCBpZiBjb2RlYyB0eXBlIGlzIG5vdCBmaXhlZCIKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqICAgU09VUkNFIENMQVNTICAgKgotICoqKioqKioqKioqKioqKioqKioqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgcHVibGljOgotICAgICAgICBzdGF0aWMgc3A8VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U+IENyZWF0ZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBpbnQzMl90IHN0b3JlQnVmZmVyKE1lZGlhQnVmZmVyICpidWZmZXIpOwotICAgICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0TnVtYmVyT2ZCdWZmZXJzSW5RdWV1ZSgpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RydWN0IE1lZGlhQnVmZmVyQ2hhaW4gewotICAgICAgICAgICAgTWVkaWFCdWZmZXIqIGJ1ZmZlcjsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG5leHRMaW5rOwotICAgICAgICB9OwotICAgICAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgICAgIENSRUFURUQsCi0gICAgICAgICAgICBTVEFSVEVELAotICAgICAgICAgICAgRVJST1IKLSAgICAgICAgfTsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQpOwotCi0gICAgICAgIC8vIERvbid0IGNhbGwgbWUKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoY29uc3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UgJik7Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlICZvcGVyYXRvcj0oCi0gICAgICAgICAgICAgICAgY29uc3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UgJik7Ci0KLSAgICAgICAgTWVkaWFCdWZmZXJDaGFpbiogbUZpcnN0QnVmZmVyTGluazsKLSAgICAgICAgTWVkaWFCdWZmZXJDaGFpbiogbUxhc3RCdWZmZXJMaW5rOwotICAgICAgICBpbnQzMl90ICAgICAgICAgICBtTmJCdWZmZXI7Ci0gICAgICAgIGJvb2wgICAgICAgICAgICAgIG1Jc0VPUzsKLSAgICAgICAgU3RhdGUgICAgICAgICAgICAgbVN0YXRlOwotICAgICAgICBzcDxNZXRhRGF0YT4gICAgICBtRW5jRm9ybWF0OwotICAgICAgICBNdXRleCAgICAgICAgICAgICBtTG9jazsKLSAgICAgICAgQ29uZGl0aW9uICAgICAgICAgbUJ1ZmZlckNvbmQ7Ci19OwotCi1zcDxWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZT4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCkgewotCi0gICAgc3A8VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U+IGFTb3VyY2UgPQotICAgICAgICBuZXcgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoZm9ybWF0KTsKLSAgICByZXR1cm4gYVNvdXJjZTsKLX0KLQotVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlKAotICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KToKLSAgICAgICAgbUZpcnN0QnVmZmVyTGluayhOVUxMKSwKLSAgICAgICAgbUxhc3RCdWZmZXJMaW5rKE5VTEwpLAotICAgICAgICBtTmJCdWZmZXIoMCksCi0gICAgICAgIG1Jc0VPUyhmYWxzZSksCi0gICAgICAgIG1TdGF0ZShDUkVBVEVEKSwKLSAgICAgICAgbUVuY0Zvcm1hdChmb3JtYXQpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlIik7Ci19Ci0KLVZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjp+VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoKSB7Ci0KLSAgICAvLyBTYWZldHkgY2xlYW4gdXAKLSAgICBpZiggU1RBUlRFRCA9PSBtU3RhdGUgKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdGFydChNZXRhRGF0YSAqbWV0YSkgewotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdGFydCgpIGJlZ2luIik7Ci0KLSAgICBpZiggQ1JFQVRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RhcnQ6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0gICAgbVN0YXRlID0gU1RBUlRFRDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RhcnQoKSBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcCgpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcCgpIGJlZ2luIik7Ci0KLSAgICBpZiggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcDogaW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIFJlbGVhc2UgdGhlIGJ1ZmZlciBjaGFpbgotICAgIGludDMyX3QgaSA9IDA7Ci0gICAgTWVkaWFCdWZmZXJDaGFpbiogdG1wTGluayA9IE5VTEw7Ci0gICAgd2hpbGUoIG1GaXJzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgIGkrKzsKLSAgICAgICAgdG1wTGluayA9IG1GaXJzdEJ1ZmZlckxpbms7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBtRmlyc3RCdWZmZXJMaW5rLT5uZXh0TGluazsKLSAgICAgICAgZGVsZXRlIHRtcExpbms7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcCA6ICVkIGJ1ZmZlciByZW1haW5lZCIsIGkpOwotICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBOVUxMOwotICAgIG1MYXN0QnVmZmVyTGluayA9IE5VTEw7Ci0KLSAgICBtU3RhdGUgPSBDUkVBVEVEOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9wKCkgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3A8TWV0YURhdGE+IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OmdldEZvcm1hdCIpOwotICAgIHJldHVybiBtRW5jRm9ybWF0OwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6cmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyByZWFkT3B0aW9uczsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlckNoYWluKiB0bXBMaW5rID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6cmVhZCgpIGJlZ2luIik7Ci0KLSAgICBpZiAoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnJlYWQ6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICB3aGlsZSAobUZpcnN0QnVmZmVyTGluayA9PSBOVUxMICYmICFtSXNFT1MpIHsKLSAgICAgICAgbUJ1ZmZlckNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgLy8gRW5kIG9mIHN0cmVhbT8KLSAgICBpZiAobUZpcnN0QnVmZmVyTGluayA9PSBOVUxMKSB7Ci0gICAgICAgICpidWZmZXIgPSBOVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnJlYWQgOiBFT1MiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgLy8gR2V0IGEgYnVmZmVyIGZyb20gdGhlIGNoYWluCi0gICAgKmJ1ZmZlciA9IG1GaXJzdEJ1ZmZlckxpbmstPmJ1ZmZlcjsKLSAgICB0bXBMaW5rID0gbUZpcnN0QnVmZmVyTGluazsKLSAgICBtRmlyc3RCdWZmZXJMaW5rID0gbUZpcnN0QnVmZmVyTGluay0+bmV4dExpbms7Ci0KLSAgICBpZiAoIE5VTEwgPT0gbUZpcnN0QnVmZmVyTGluayApIHsKLSAgICAgICAgbUxhc3RCdWZmZXJMaW5rID0gTlVMTDsKLSAgICB9Ci0gICAgZGVsZXRlIHRtcExpbms7Ci0gICAgbU5iQnVmZmVyLS07Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnJlYWQoKSBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQzMl90IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIoKSBiZWdpbiIpOwotCi0gICAgaWYoIE5VTEwgPT0gYnVmZmVyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyIDogcmVhY2hlZCBFT1MiKTsKLSAgICAgICAgbUlzRU9TID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBuZXdMaW5rID0gbmV3IE1lZGlhQnVmZmVyQ2hhaW47Ci0gICAgICAgIG5ld0xpbmstPmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgbmV3TGluay0+bmV4dExpbmsgPSBOVUxMOwotICAgICAgICBpZiggTlVMTCAhPSBtTGFzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgICAgICBtTGFzdEJ1ZmZlckxpbmstPm5leHRMaW5rID0gbmV3TGluazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBuZXdMaW5rOwotICAgICAgICB9Ci0gICAgICAgIG1MYXN0QnVmZmVyTGluayA9IG5ld0xpbms7Ci0gICAgICAgIG1OYkJ1ZmZlcisrOwotICAgIH0KLSAgICBtQnVmZmVyQ29uZC5zaWduYWwoKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyKCkgZW5kIik7Ci0gICAgcmV0dXJuIG1OYkJ1ZmZlcjsKLX0KLQotaW50MzJfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Z2V0TnVtYmVyT2ZCdWZmZXJzSW5RdWV1ZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHJldHVybiBtTmJCdWZmZXI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb250ZXh0IG9mIHRoZSBTdGFnZUZyaWdodCB2aWRlbyBlbmNvZGVyCi0gKiAgICAgICAgICAgc2hlbGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIENSRUFURUQgICA9IDB4MSwKLSAgICBPUEVORUQgICAgPSAweDIsCi0gICAgU1RBUlRFRCAgID0gMHg0LAotICAgIEJVRkZFUklORyA9IDB4OCwKLSAgICBSRUFESU5HICAgPSAweDEwCi19IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX1N0YXRlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfU3RhdGUgICAgIG1TdGF0ZTsKLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICAgICAgICAgICAgbUZvcm1hdDsKLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgICAgbVdyaXRlckRhdGFJbnRlcmZhY2U7Ci0gICAgTTRWUFBfYXBwbHlfZmN0KiAgICAgICAgICAgICAgICAgIG1QcmVQcm9jRnVuY3Rpb247Ci0gICAgTTRWUFBfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgIG1QcmVQcm9jQ29udGV4dDsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICAgICAgICAgICAgbUFjY2Vzc1VuaXQ7Ci0gICAgTTRFTkNPREVSX1BhcmFtcyogICAgICAgICAgICAgICAgIG1Db2RlY1BhcmFtczsKLSAgICBNNEVOQ09ERVJfSGVhZGVyICAgICAgICAgICAgICAgICAgbUhlYWRlcjsKLSAgICBIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVV9mY3QqICAgbUgyNjROQUxVUG9zdFByb2Nlc3NGY3Q7Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgIG1IMjY0TkFMVVBvc3RQcm9jZXNzQ3R4OwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICBtTGFzdENUUzsKLSAgICBzcDxWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZT4gbUVuY29kZXJTb3VyY2U7Ci0gICAgT01YQ2xpZW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnQ7Ci0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgICAgICAgICAgIG1FbmNvZGVyOwotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFICAgICAgICAgICAgICBtRW5jb2RlckNvbG9yRm9ybWF0OwotICAgIE1lZGlhQnVmZmVyUHVsbGVyKiAgICAgICAgICAgICAgICBtUHVsbGVyOwotICAgIEk0MjBDb2xvckNvbnZlcnRlciogICAgICAgICAgICAgICBtSTQyMENvbG9yQ29udmVydGVyOwotCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYklucHV0RnJhbWVzOwotICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RJbnB1dEN0czsKLSAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJbnB1dEN0czsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5iT3V0cHV0RnJhbWVzOwotICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RPdXRwdXRDdHM7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0T3V0cHV0Q3RzOwotCi0gICAgTWVkaWFQcm9maWxlcyAqbVZpZGVvRWRpdG9yUHJvZmlsZTsKLSAgICBpbnQzMl90IG1NYXhQcmVmZXRjaEZyYW1lczsKLX0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dDsKLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgIFRPT0xTICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSShNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGFEYXRhKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0gICAgaW50MzJfdCBuYkJ1ZmZlciA9IDA7Ci0gICAgaW50MzJfdCBzdHJpZGUgPSAwOwotICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKLSAgICBpbnQzMl90IGZyYW1lcmF0ZSA9IDA7Ci0gICAgaW50MzJfdCBpc0NvZGVjQ29uZmlnID0gMDsKLSAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgdWludDMyX3QgY29kZWNGbGFncyA9IDA7Ci0gICAgTWVkaWFCdWZmZXIqIGlucHV0QnVmZmVyID0gTlVMTDsKLSAgICBNZWRpYUJ1ZmZlciogb3V0cHV0QnVmZmVyID0gTlVMTDsKLSAgICBzcDxWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZT4gZW5jb2RlclNvdXJjZSA9IE5VTEw7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXIgPSBOVUxMOzsKLSAgICBPTVhDbGllbnQgY2xpZW50OwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSSBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gbWV0YURhdGEuZ2V0KCksIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soQ1JFQVRFRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBlbmNvZGVyIHNvdXJjZQotICAgIGVuY29kZXJTb3VyY2UgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKG1ldGFEYXRhKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IGVuY29kZXJTb3VyY2UuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENvbm5lY3QgdG8gdGhlIE9NWCBjbGllbnQKLSAgICByZXN1bHQgPSBjbGllbnQuY29ubmVjdCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBPTVggY29kZWMKLSAgICAvLyBWSURFT0VESVRPUl9GT1JDRUNPREVDIE1VU1QgYmUgZGVmaW5lZCBoZXJlCi0gICAgY29kZWNGbGFncyB8PSBPTVhDb2RlYzo6VklERU9FRElUT1JfRk9SQ0VDT0RFQzsKLSAgICBlbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZShjbGllbnQuaW50ZXJmYWNlKCksIG1ldGFEYXRhLCB0cnVlLAotICAgICAgICBlbmNvZGVyU291cmNlLCBOVUxMLCBjb2RlY0ZsYWdzKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IGVuY29kZXIuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8qKgotICAgICAqIFNlbmQgZmFrZSBmcmFtZXMgYW5kIHJldHJpZXZlIHRoZSBEU0kKLSAgICAgKi8KLSAgICAvLyBTZW5kIGEgZmFrZSBmcmFtZSB0byB0aGUgc291cmNlCi0gICAgbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5U3RyaWRlLCAgICAgJnN0cmlkZSk7Ci0gICAgbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAgICAgJmhlaWdodCk7Ci0gICAgbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJmZyYW1lcmF0ZSk7Ci0gICAgc2l6ZSA9IChzaXplX3QpKHN0cmlkZSpoZWlnaHQqMykvMjsKLSAgICBpbnB1dEJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihzaXplKTsKLSAgICBpbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCAwKTsKLSAgICBuYkJ1ZmZlciA9IGVuY29kZXJTb3VyY2UtPnN0b3JlQnVmZmVyKGlucHV0QnVmZmVyKTsKLSAgICBlbmNvZGVyU291cmNlLT5zdG9yZUJ1ZmZlcihOVUxMKTsgLy8gU2lnbmFsIEVPUwotCi0gICAgLy8gQ2FsbCByZWFkIG9uY2UgdG8gZ2V0IHRoZSBEU0kKLSAgICByZXN1bHQgPSBlbmNvZGVyLT5zdGFydCgpOzsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLSAgICByZXN1bHQgPSBlbmNvZGVyLT5yZWFkKCZvdXRwdXRCdWZmZXIsIE5VTEwpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAga0tleUlzQ29kZWNDb25maWcsICZpc0NvZGVjQ29uZmlnKSAmJiBpc0NvZGVjQ29uZmlnLCBNNEVSUl9TVEFURSk7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMID09IHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmLCBNNEVSUl9TVEFURSk7Ci0gICAgaWYgKCBNNEVOQ09ERVJfa0gyNjQgPT0gcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0ICkgewotICAgICAgICAvLyBGb3IgSDI2NCwgZm9ybWF0IHRoZSBEU0kKLSAgICAgICAgcmVzdWx0ID0gYnVpbGRBVkNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgICAgICh1aW50OF90KiopKCYocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYpKSwKLSAgICAgICAgICAgIChzaXplX3QqKSgmKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5TaXplKSksCi0gICAgICAgICAgICAoY29uc3QgdWludDhfdCopb3V0cHV0QnVmZmVyLT5kYXRhKCkgKyBvdXRwdXRCdWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgb3V0cHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgZW5jb2Rlci0+Z2V0Rm9ybWF0KCkuZ2V0KCkpOwotICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gRm9yIE1QRUc0LCBqdXN0IGNvcHkgdGhlIERTSQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIuU2l6ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKW91dHB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIFNBRkVfTUFMTE9DKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmLCBNNE9TQV9JbnQ4LAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUsICJFbmNvZGVyIGhlYWRlciIpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1ZiwKLSAgICAgICAgICAgICh2b2lkICopKChNNE9TQV9NZW1BZGRyOCkob3V0cHV0QnVmZmVyLT5kYXRhKCkpK291dHB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUpOwotICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICByZXN1bHQgPSBlbmNvZGVyLT5zdG9wKCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLWNsZWFuVXA6Ci0gICAgLy8gRGVzdHJveSB0aGUgZ3JhcGgKLSAgICBpZiAoIGVuY29kZXIgIT0gTlVMTCApIHsgZW5jb2Rlci5jbGVhcigpOyB9Ci0gICAgY2xpZW50LmRpc2Nvbm5lY3QoKTsKLSAgICBpZiAoIGVuY29kZXJTb3VyY2UgIT0gTlVMTCApIHsgZW5jb2RlclNvdXJjZS5jbGVhcigpOyB9Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXREU0kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXREU0kgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKgotICogRU5HSU5FIElOVEVSRkFDRSAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soQ1JFQVRFRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gUmVsZWFzZSBtZW1vcnkKLSAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYpOwotICAgIFNBRkVfRlJFRShwRW5jb2RlckNvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludGVyZmFjZSwKLSAgICAgICAgTTRWUFBfYXBwbHlfZmN0KiBwVlBQZmN0LCBNNFZQUF9Db250ZXh0IHBWUFBjdHh0LAotICAgICAgICBNNE9TQV9Wb2lkKiBwRXh0ZXJuYWxBUEksIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBpbnQgZW5jb2RlcklucHV0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0IGJlZ2luOiBmb3JtYXQgICVkIiwgZm9ybWF0KTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFZQUGZjdCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBWUFBjdHh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gQ29udGV4dCBhbGxvY2F0aW9uICYgaW5pdGlhbGl6YXRpb24KLSAgICBTQUZFX01BTExPQyhwRW5jb2RlckNvbnRleHQsIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvclZpZGVvRW5jb2RlciIpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gQ1JFQVRFRDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tV3JpdGVyRGF0YUludGVyZmFjZSA9IHBXcml0ZXJEYXRhSW50ZXJmYWNlOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVByZVByb2NGdW5jdGlvbiA9IHBWUFBmY3Q7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tUHJlUHJvY0NvbnRleHQgPSBwVlBQY3R4dDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXIgPSBOVUxMOwotCi0gICAgLy8gR2V0IGNvbG9yIGNvbnZlcnRlciBhbmQgZGV0ZXJtaW5lIGVuY29kZXIgaW5wdXQgZm9ybWF0Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyID0gbmV3IEk0MjBDb2xvckNvbnZlcnRlcjsKLSAgICBpZiAocEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyLT5pc0xvYWRlZCgpKSB7Ci0gICAgICAgIGVuY29kZXJJbnB1dCA9IHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlci0+Z2V0RW5jb2RlcklucHV0Rm9ybWF0KCk7Ci0gICAgfQotICAgIGlmIChlbmNvZGVySW5wdXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICBkZWxldGUgcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIgPSBOVUxMOwotICAgIH0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyQ29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpZW5jb2RlcklucHV0OwotICAgIEFMT0dJKCJlbmNvZGVyIGlucHV0IGZvcm1hdCA9IDB4JVhcbiIsIGVuY29kZXJJbnB1dCk7Ci0KLSAgICAqcENvbnRleHQgPSBwRW5jb2RlckNvbnRleHQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwKHBFbmNvZGVyQ29udGV4dCk7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0IEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9IMjYzKE00RU5DT0RFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRlcmZhY2UsIE00VlBQX2FwcGx5X2ZjdCogcFZQUGZjdCwKLSAgICAgICAgTTRWUFBfQ29udGV4dCBwVlBQY3R4dCwgTTRPU0FfVm9pZCogcEV4dGVybmFsQVBJLCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpCi0gICAgICAgIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9rSDI2MywgcENvbnRleHQsCi0gICAgICAgIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBwVlBQZmN0LCBwVlBQY3R4dCwgcEV4dGVybmFsQVBJLCBwVXNlckRhdGEpOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X01QRUc0KE00RU5DT0RFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRlcmZhY2UsIE00VlBQX2FwcGx5X2ZjdCogcFZQUGZjdCwKLSAgICAgICAgTTRWUFBfQ29udGV4dCBwVlBQY3R4dCwgTTRPU0FfVm9pZCogcEV4dGVybmFsQVBJLCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpCi0gICAgICAgIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9rTVBFRzQsIHBDb250ZXh0LAotICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSwgcFZQUGZjdCwgcFZQUGN0eHQsIHBFeHRlcm5hbEFQSSwgcFVzZXJEYXRhKTsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9IMjY0KE00RU5DT0RFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRlcmZhY2UsIE00VlBQX2FwcGx5X2ZjdCogcFZQUGZjdCwKLSAgICAgICAgTTRWUFBfQ29udGV4dCBwVlBQY3R4dCwgTTRPU0FfVm9pZCogcEV4dGVybmFsQVBJLCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpCi0gICAgICAgIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9rSDI2NCwgcENvbnRleHQsCi0gICAgICAgIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBwVlBQZmN0LCBwVlBQY3R4dCwgcEV4dGVybmFsQVBJLCBwVXNlckRhdGEpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2UoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT1BFTkVEID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBSZWxlYXNlIG1lbW9yeQotICAgIFNBRkVfRlJFRShwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcyk7Ci0KLSAgICAvLyBEZXN0cm95IHRoZSBncmFwaAotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIuY2xlYXIoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuZGlzY29ubmVjdCgpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UuY2xlYXIoKTsKLQotICAgIGRlbGV0ZSBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXI7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyID0gTlVMTDsKLQotICAgIGRlbGV0ZSBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyID0gTlVMTDsKLQotICAgIC8vIFNldCB0aGUgbmV3IHN0YXRlCi0gICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBDUkVBVEVEOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2UgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfb3BlbihNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVLCBNNE9TQV9Wb2lkKiBwUGFyYW1zKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNEVOQ09ERVJfUGFyYW1zKiBwQ29kZWNQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIHNwPE1ldGFEYXRhPiBlbmNvZGVyTWV0YWRhdGEgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBOVUxMOwotICAgIGludDMyX3QgaVByb2ZpbGUgPSAwOwotICAgIGludDMyX3QgaUxldmVsID0gMDsKLQotICAgIGludDMyX3QgaUZyYW1lUmF0ZSA9IDA7Ci0gICAgdWludDMyX3QgY29kZWNGbGFncyA9IDA7Ci0KLSAgICBBTE9HVigiPj4+IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW4gYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBBVSwgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFBhcmFtcywgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgcENvZGVjUGFyYW1zID0gKE00RU5DT0RFUl9QYXJhbXMqKXBQYXJhbXM7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soQ1JFQVRFRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ29udGV4dCBpbml0aWFsaXphdGlvbgotICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQgPSBwQVU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tVmlkZW9FZGl0b3JQcm9maWxlID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1NYXhQcmVmZXRjaEZyYW1lcyA9Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVZpZGVvRWRpdG9yUHJvZmlsZS0+Z2V0VmlkZW9FZGl0b3JDYXBQYXJhbUJ5TmFtZSgKLSAgICAgICAgIm1heFByZWZldGNoWVVWRnJhbWVzIik7Ci0KLSAgICAvLyBBbGxvY2F0ZSAmIGluaXRpYWxpemUgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAgICBTQUZFX01BTExPQyhwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcywgTTRFTkNPREVSX1BhcmFtcywgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyIik7Ci0KLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5JbnB1dEZvcm1hdCA9IHBDb2RlY1BhcmFtcy0+SW5wdXRGb3JtYXQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPklucHV0RnJhbWVXaWR0aCA9Ci0gICAgICAgIHBDb2RlY1BhcmFtcy0+SW5wdXRGcmFtZVdpZHRoOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5JbnB1dEZyYW1lSGVpZ2h0ID0KLSAgICAgICAgcENvZGVjUGFyYW1zLT5JbnB1dEZyYW1lSGVpZ2h0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoID0gcENvZGVjUGFyYW1zLT5GcmFtZVdpZHRoOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodCA9IHBDb2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkJpdHJhdGUgPSBwQ29kZWNQYXJhbXMtPkJpdHJhdGU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lUmF0ZSA9IHBDb2RlY1BhcmFtcy0+RnJhbWVSYXRlOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgPSBwQ29kZWNQYXJhbXMtPkZvcm1hdDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+dmlkZW9Qcm9maWxlID0gcENvZGVjUGFyYW1zLT52aWRlb1Byb2ZpbGU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPnZpZGVvTGV2ZWw9IHBDb2RlY1BhcmFtcy0+dmlkZW9MZXZlbDsKLQotICAgIC8vIENoZWNrIG91dHB1dCBmb3JtYXQgY29uc2lzdGVuY3kgYW5kIHJlc29sdXRpb24KLSAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCA9PSBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQsCi0gICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soMCA9PSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aCAgJSAxNiwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygwID09IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodCAlIDE2LAotICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLyoqCi0gICAgICogU3RhZ2VGcmlnaHQgZ3JhcGggYnVpbGRpbmcKLSAgICAgKi8KLQotICAgIC8vIENyZWF0ZSB0aGUgbWV0YSBkYXRhIGZvciB0aGUgZW5jb2RlcgotICAgIGVuY29kZXJNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tIMjYzOgotICAgICAgICAgICAgbWltZSAgICAgPSBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUEVHNDoKLSAgICAgICAgICAgIG1pbWUgICAgID0gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjQ6Ci0gICAgICAgICAgICBtaW1lICAgICA9IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJWaWRlb0VuY29kZXJfb3BlbiA6IGluY29ycmVjdCBpbnB1dCBmb3JtYXQiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaVByb2ZpbGUgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+dmlkZW9Qcm9maWxlOwotICAgIGlMZXZlbCA9IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT52aWRlb0xldmVsOwotICAgIEFMT0dWKCJFbmNvZGVyIG1pbWUgJXMgcHJvZmlsZSAlZCwgbGV2ZWwgJWQiLAotICAgICAgICBtaW1lLGlQcm9maWxlLCBpTGV2ZWwpOwotICAgIEFMT0dWKCJFbmNvZGVyIHcgJWQsIGggJWQsIGJpdHJhdGUgJWQsIGZwcyAlZCIsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5CaXRyYXRlLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVSYXRlKTsKLSAgICBDSEVDSyhpUHJvZmlsZSAhPSAweDdmZmZmZmZmKTsKLSAgICBDSEVDSyhpTGV2ZWwgIT0gMHg3ZmZmZmZmZik7Ci0KLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIGlQcm9maWxlKTsKLSAgICAvL0ZJWE1FOgotICAgIC8vIFRlbXA6IERvIG5vdCBzZXQgdGhlIGxldmVsIGZvciBNcGVnNCAvIEguMjYzIEVuYwotICAgIC8vIGFzIE9NWC5OdmlkaWEubXA0LmVuY29kZXIgYW5kIE9NWC5OdmlkaWEuaDI2My5lbmNvZGVyCi0gICAgLy8gcmV0dXJuIDB4ODAwMDEwMTkKLSAgICBpZiAocEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCA9PSBNNEVOQ09ERVJfa0gyNjQpIHsKLSAgICAgICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9MZXZlbCwgaUxldmVsKTsKLSAgICB9Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlTdHJpZGUsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodCk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2xpY2VIZWlnaHQsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodCk7Ci0KLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVJhdGUgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2s1X0ZQUzogICAgaUZyYW1lUmF0ZSA9IDU7ICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazdfNV9GUFM6ICBpRnJhbWVSYXRlID0gODsgIGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTBfRlBTOiAgIGlGcmFtZVJhdGUgPSAxMDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2sxMl81X0ZQUzogaUZyYW1lUmF0ZSA9IDEzOyBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazE1X0ZQUzogICBpRnJhbWVSYXRlID0gMTU7IGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjBfRlBTOiAgIGlGcmFtZVJhdGUgPSAyMDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2syNV9GUFM6ICAgaUZyYW1lUmF0ZSA9IDI1OyBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazMwX0ZQUzogICBpRnJhbWVSYXRlID0gMzA7IGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rVkFSSUFCTEVfRlBTOgotICAgICAgICAgICAgaUZyYW1lUmF0ZSA9IDMwOwotICAgICAgICAgICAgQUxPR0koIkZyYW1lIHJhdGUgc2V0IHRvIE00RU5DT0RFUl9rVkFSSUFCTEVfRlBTOiBzZXQgdG8gMzAiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa1VTRV9USU1FU0NBTEU6Ci0gICAgICAgICAgICBpRnJhbWVSYXRlID0gMzA7Ci0gICAgICAgICAgICBBTE9HSSgiRnJhbWUgcmF0ZSBzZXQgdG8gTTRFTkNPREVSX2tVU0VfVElNRVNDQUxFOiAgc2V0IHRvIDMwIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJWaWRlb0VuY29kZXJfb3BlbjppbmNvcnJlY3QgZnJhbWVyYXRlIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBpRnJhbWVSYXRlKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlCaXRSYXRlLAotICAgICAgICAoaW50MzJfdClwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Qml0cmF0ZSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAxKTsKLQotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyQ29sb3JGb3JtYXQpOwotCi0gICAgaWYgKHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgIT0gTTRFTkNPREVSX2tIMjYzKSB7Ci0gICAgICAgIC8vIEdldCB0aGUgZW5jb2RlciBEU0kKLSAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0RFNJKHBFbmNvZGVyQ29udGV4dCwgZW5jb2Rlck1ldGFkYXRhKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHRoZSBlbmNvZGVyIHNvdXJjZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgICAgICBlbmNvZGVyTWV0YWRhdGEpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKAotICAgICAgICBOVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENvbm5lY3QgdG8gdGhlIE9NWCBjbGllbnQKLSAgICByZXN1bHQgPSBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuY29ubmVjdCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBPTVggY29kZWMKLSNpZmRlZiBWSURFT0VESVRPUl9GT1JDRUNPREVDCi0gICAgY29kZWNGbGFncyB8PSBPTVhDb2RlYzo6VklERU9FRElUT1JfRk9SQ0VDT0RFQzsKLSNlbmRpZiAvKiBWSURFT0VESVRPUl9GT1JDRUNPREVDICovCi0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5pbnRlcmZhY2UoKSwgZW5jb2Rlck1ldGFkYXRhLCB0cnVlLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLCBOVUxMLCBjb2RlY0ZsYWdzKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIuZ2V0KCksIE00RVJSX1NUQVRFKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfb3BlbiA6IERPTkUiKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXIgPSBuZXcgTWVkaWFCdWZmZXJQdWxsZXIoCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIpOwotCi0gICAgLy8gU2V0IHRoZSBuZXcgc3RhdGUKLSAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IE9QRU5FRDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2UocEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW4gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Eb3VibGUgQ3RzLAotICAgICAgICBNNE9TQV9Cb29sIGJSZWFjaGVkRU9TKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwT3V0UGxhbmVbM107Ci0gICAgTWVkaWFCdWZmZXIqIGJ1ZmZlciA9IE5VTEw7Ci0gICAgaW50MzJfdCBuYkJ1ZmZlciA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIGJlZ2luOiBjdHMgICVmIiwgQ3RzKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBwT3V0UGxhbmVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIHBPdXRQbGFuZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcE91dFBsYW5lWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIGlmICggTTRPU0FfRkFMU0UgPT0gYlJlYWNoZWRFT1MgKSB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBzaXplWSA9IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoICoKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodDsKLSAgICAgICAgTTRPU0FfVUludDMyIHNpemVVID0gc2l6ZVkgPj4gMjsKLSAgICAgICAgTTRPU0FfVUludDMyIHNpemUgID0gc2l6ZVkgKyAyKnNpemVVOwotICAgICAgICBNNE9TQV9VSW50OCogcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoKHNpemVfdClzaXplKTsKLSAgICAgICAgcERhdGEgPSAoTTRPU0FfVUludDgqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICAvLyBQcmVwYXJlIHRoZSBvdXRwdXQgaW1hZ2UgZm9yIHByZS1wcm9jZXNzaW5nCi0gICAgICAgIHBPdXRQbGFuZVswXS51X3dpZHRoICAgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aDsKLSAgICAgICAgcE91dFBsYW5lWzBdLnVfaGVpZ2h0ICA9IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodDsKLSAgICAgICAgcE91dFBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHBPdXRQbGFuZVswXS51X3N0cmlkZSAgPSBwT3V0UGxhbmVbMF0udV93aWR0aDsKLSAgICAgICAgcE91dFBsYW5lWzFdLnVfd2lkdGggICA9IHBPdXRQbGFuZVswXS51X3dpZHRoLzI7Ci0gICAgICAgIHBPdXRQbGFuZVsxXS51X2hlaWdodCAgPSBwT3V0UGxhbmVbMF0udV9oZWlnaHQvMjsKLSAgICAgICAgcE91dFBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHBPdXRQbGFuZVsxXS51X3N0cmlkZSAgPSBwT3V0UGxhbmVbMF0udV9zdHJpZGUvMjsKLSAgICAgICAgcE91dFBsYW5lWzJdLnVfd2lkdGggICA9IHBPdXRQbGFuZVsxXS51X3dpZHRoOwotICAgICAgICBwT3V0UGxhbmVbMl0udV9oZWlnaHQgID0gcE91dFBsYW5lWzFdLnVfaGVpZ2h0OwotICAgICAgICBwT3V0UGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcE91dFBsYW5lWzJdLnVfc3RyaWRlICA9IHBPdXRQbGFuZVsxXS51X3N0cmlkZTsKLQotICAgICAgICBwT3V0UGxhbmVbMF0ucGFjX2RhdGEgPSBwRGF0YTsKLSAgICAgICAgcE91dFBsYW5lWzFdLnBhY19kYXRhID0gcERhdGEgKyBzaXplWTsKLSAgICAgICAgcE91dFBsYW5lWzJdLnBhY19kYXRhID0gcERhdGEgKyBzaXplWSArIHNpemVVOwotCi0gICAgICAgIC8vIEFwcGx5IHByZS1wcm9jZXNzaW5nCi0gICAgICAgIGVyciA9IHBFbmNvZGVyQ29udGV4dC0+bVByZVByb2NGdW5jdGlvbigKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVByZVByb2NDb250ZXh0LCBNNE9TQV9OVUxMLCBwT3V0UGxhbmUpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgICAgICAvLyBDb252ZXJ0IE1lZGlhQnVmZmVyIHRvIHRoZSBlbmNvZGVyIGlucHV0IGZvcm1hdCBpZiBuZWNlc3NhcnkKLSAgICAgICAgaWYgKHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcikgewotICAgICAgICAgICAgSTQyMENvbG9yQ29udmVydGVyKiBjb252ZXJ0ZXIgPSBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0gICAgICAgICAgICBpbnQgYWN0dWFsV2lkdGggPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aDsKLSAgICAgICAgICAgIGludCBhY3R1YWxIZWlnaHQgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQ7Ci0KLSAgICAgICAgICAgIGludCBlbmNvZGVyV2lkdGgsIGVuY29kZXJIZWlnaHQ7Ci0gICAgICAgICAgICBBUmVjdCBlbmNvZGVyUmVjdDsKLSAgICAgICAgICAgIGludCBlbmNvZGVyQnVmZmVyU2l6ZTsKLQotICAgICAgICAgICAgaWYgKGNvbnZlcnRlci0+Z2V0RW5jb2RlcklucHV0QnVmZmVySW5mbygKLSAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0LAotICAgICAgICAgICAgICAgICZlbmNvZGVyV2lkdGgsICZlbmNvZGVySGVpZ2h0LAotICAgICAgICAgICAgICAgICZlbmNvZGVyUmVjdCwgJmVuY29kZXJCdWZmZXJTaXplKSA9PSAwKSB7Ci0KLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciogbmV3QnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGVuY29kZXJCdWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb252ZXJ0ZXItPmNvbnZlcnRJNDIwVG9FbmNvZGVySW5wdXQoCi0gICAgICAgICAgICAgICAgICAgIHBEYXRhLCAgLy8gc3JjQml0cwotICAgICAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyV2lkdGgsIGVuY29kZXJIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZXJSZWN0LAotICAgICAgICAgICAgICAgICAgICAodWludDhfdCopbmV3QnVmZmVyLT5kYXRhKCkgKyBuZXdCdWZmZXItPnJhbmdlX29mZnNldCgpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNvbnZlcnRJNDIwVG9FbmNvZGVySW5wdXQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIG5ldyBidWZmZXIKLSAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIG1ldGFkYXRhCi0gICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCAoaW50NjRfdCkoQ3RzKjEwMDApKTsKLSAgICB9Ci0KLSAgICAvLyBQdXNoIHRoZSBidWZmZXIgdG8gdGhlIHNvdXJjZSwgYSBOVUxMIGJ1ZmZlciwgbm90aWZpZXMgdGhlIHNvdXJjZSBvZiBFT1MKLSAgICBuYkJ1ZmZlciA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UtPnN0b3JlQnVmZmVyKGJ1ZmZlcik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBlcnJvciAweCVYIiwgZXJyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiggTlVMTCAhPSBidWZmZXIgKSB7Ci0gICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwgTWVkaWFCdWZmZXIqIGJ1ZmZlcikgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIEN0cyA9IDA7Ci0gICAgaW50MzJfdCBpMzJUbXAgPSAwOwotICAgIGludDY0X3QgaTY0VG1wID0gMDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBidWZmZXIsICAgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIFByb2Nlc3MgdGhlIHJldHVybmVkIEFVCi0gICAgaWYgKCAwID09IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKSB7Ci0gICAgICAgIC8vIEVuY29kZXIgaGFzIG5vIGRhdGEgeWV0LCBub3RoaW5nIHVudXN1YWwKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgOiBidWZmZXIgaXMgZW1wdHkiKTsKLSAgICAgICAgZ290byBjbGVhblVwOwotICAgIH0KLSAgICBWSURFT0VESVRPUl9DSEVDSygwID09ICgoTTRPU0FfVUludDMyKWJ1ZmZlci0+ZGF0YSgpKSU0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZ2V0KCksIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgaWYgKCBidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzQ29kZWNDb25maWcsICZpMzJUbXApICYmIGkzMlRtcCApewotICAgICAgICB7ICAgLy8gRGlzcGxheSB0aGUgRFNJCi0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBEU0kgJWQiLAotICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICAgICAgdWludDhfdCogdG1wID0gKHVpbnQ4X3QqKShidWZmZXItPmRhdGEoKSk7Ci0gICAgICAgICAgICBmb3IoIHVpbnQzMl90IGk9MDsgaTxidWZmZXItPnJhbmdlX2xlbmd0aCgpOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkRTSSBbJWRdICUuMlgiLCBpLCB0bXBbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhlIENUUwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZpNjRUbXApLAotICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzKys7Ci0gICAgICAgIGlmICggMCA+IHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzICkgewotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgPSBpNjRUbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdE91dHB1dEN0cyA9IGk2NFRtcDsKLQotICAgICAgICBDdHMgPSAoTTRPU0FfSW50MzIpKGk2NFRtcC8xMDAwKTsKLSAgICAgICAgQUxPR1YoIltUU19DSEVDS10gVkkvRU5DIFdSSVRFIGZyYW1lICVkIEAgJWxsZCAtPiAlZCAobGFzdCAlZCkiLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMsIGk2NFRtcCwgQ3RzLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyk7Ci0gICAgICAgIGlmICggQ3RzIDwgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyApIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBXQVJOSU5HIDogQ3RzIGlzIGdvaW5nICIKLSAgICAgICAgICAgICJiYWNrd2FyZHMgJWQgPCAlZCIsIEN0cywgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyk7Ci0gICAgICAgICAgICBnb3RvIGNsZWFuVXA7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgOiAlZCAlZCIsCi0gICAgICAgICAgICBDdHMsIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMpOwotCi0gICAgICAgIC8vIFJldHJpZXZlIHRoZSBBVSBjb250YWluZXIKLSAgICAgICAgZXJyID0gcEVuY29kZXJDb250ZXh0LT5tV3JpdGVyRGF0YUludGVyZmFjZS0+cFN0YXJ0QVUoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Xcml0ZXJEYXRhSW50ZXJmYWNlLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnN0cmVhbS0+c3RyZWFtSUQsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0KTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAgICAgLy8gRm9ybWF0IHRoZSBBVQotICAgICAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPD0gcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZSwKLSAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIC8vIFJlbW92ZSBIMjY0IEFVIHN0YXJ0IGNvZGUKLSAgICAgICAgaWYgKCBNNEVOQ09ERVJfa0gyNjQgPT0gcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0ICkgewotICAgICAgICAgICAgaWYgKCFtZW1jbXAoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIFwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KSApIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpICsgNCwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIDQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAoTTRFTkNPREVSX2tIMjY0ID09IHBFbmNvZGVyQ29udGV4dC0+bUZvcm1hdCkgJiYKLSAgICAgICAgICAgIChNNE9TQV9OVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUgyNjROQUxVUG9zdFByb2Nlc3NGY3QpICkgewotICAgICAgICAvLyBIMjY0IHRyaW1taW5nIGNhc2UsIE5BTFUgcG9zdCBwcm9jZXNzaW5nIGlzIG5lZWRlZAotICAgICAgICBNNE9TQV9JbnQzMiBvdXRwdXRTaXplID0gcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZTsKLSAgICAgICAgZXJyID0gcEVuY29kZXJDb250ZXh0LT5tSDI2NE5BTFVQb3N0UHJvY2Vzc0ZjdCgKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUgyNjROQUxVUG9zdFByb2Nlc3NDdHgsCi0gICAgICAgICAgICAoTTRPU0FfVUludDgqKWJ1ZmZlci0+ZGF0YSgpK2J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpLAotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICZvdXRwdXRTaXplKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnNpemUgPSAoTTRPU0FfVUludDMyKW91dHB1dFNpemU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGUgQVUgY2FuIGp1c3QgYmUgY29waWVkCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5cCi0gICAgICAgICAgICAgICAgZGF0YUFkZHJlc3MsICh2b2lkICopKChNNE9TQV9NZW1BZGRyOCkoYnVmZmVyLT5kYXRhKCkpK2J1ZmZlci0+XAotICAgICAgICAgICAgICAgIHJhbmdlX29mZnNldCgpKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKWJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsJmkzMlRtcCkgJiYgaTMyVG1wKXsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmF0dHJpYnV0ZSA9IEFVX1JBUDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmF0dHJpYnV0ZSA9IEFVX1BfRnJhbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyA9IEN0czsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+Q1RTID0gQ3RzOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5EVFMgPSBDdHM7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXI6IEFVIEAgMHglWCAweCVYICVkICVkIiwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgKnBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZSwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPkNUUyk7Ci0KLSAgICAgICAgLy8gV3JpdGUgdGhlIEFVCi0gICAgICAgIGVyciA9IHBFbmNvZGVyQ29udGV4dC0+bVdyaXRlckRhdGFJbnRlcmZhY2UtPnBQcm9jZXNzQVUoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Xcml0ZXJEYXRhSW50ZXJmYWNlLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnN0cmVhbS0+c3RyZWFtSUQsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0KTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYpOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIuU2l6ZSA9IDA7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEluUGxhbmUsIE00T1NBX0RvdWJsZSBDdHMsCi0gICAgICAgIE00RU5DT0RFUl9GcmFtZU1vZGUgRnJhbWVNb2RlKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlciogb3V0cHV0QnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUgMHglWCAlZiAlZCIsIHBJblBsYW5lLCBDdHMsIEZyYW1lTW9kZSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBpZiAoIFNUQVJURUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgKSB7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gQlVGRkVSSU5HOwotICAgIH0KLSAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgKEJVRkZFUklORyB8IFJFQURJTkcpICYgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLSAgICBpZiAoIDAgPiBwRW5jb2RlckNvbnRleHQtPm1GaXJzdElucHV0Q3RzICkgewotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1GaXJzdElucHV0Q3RzID0gQ3RzOwotICAgIH0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0SW5wdXRDdHMgPSBDdHM7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIDB4JVggJWQgJWYgKCVkKSIsIHBJblBsYW5lLCBGcmFtZU1vZGUsCi0gICAgICAgIEN0cywgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyk7Ci0KLSAgICAvLyBQdXNoIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIGVuY29kZXIgc291cmNlCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKHBFbmNvZGVyQ29udGV4dCwgQ3RzLAotICAgICAgICBNNE9TQV9GQUxTRSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBOb3RpZnkgdGhlIHNvdXJjZSBpbiBjYXNlIG9mIEVPUwotICAgIGlmICggTTRFTkNPREVSX2tMYXN0RnJhbWUgPT0gRnJhbWVNb2RlICkgewotICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQsIDAsIE00T1NBX1RSVUUpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICB9Ci0KLSAgICBpZiAoIEJVRkZFUklORyA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSApIHsKLSAgICAgICAgLy8gUHJlZmV0Y2ggaXMgY29tcGxldGUsIHN0YXJ0IHJlYWRpbmcKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBSRUFESU5HOwotICAgIH0KLSAgICAvLyBSZWFkCi0gICAgd2hpbGUgKDEpICB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpvdXRwdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+Z2V0QnVmZmVyTm9uQmxvY2tpbmcoKTsKLQotICAgICAgICBpZiAob3V0cHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGludDMyX3QgWVVWQnVmZmVyTnVtYmVyID0KLSAgICAgICAgICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZS0+Z2V0TnVtYmVyT2ZCdWZmZXJzSW5RdWV1ZSgpOwotICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGNvbmZpZ3VyZWQgbWF4aW11bSBudW1iZXIgb2YgcHJlZmV0Y2ggWVVWIGZyYW1lcyBpcwotICAgICAgICAgICAgICogbm90IGV4Y2VlZGVkLiBUaGlzIGlzIHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzYWdlIG9mIHZpZGVvIGVkaXRvciBlbmdpbmUuCi0gICAgICAgICAgICAgKiBUaGUgdmFsdWUgb2YgbWF4aW11bSBwcmVmZXRjaCBZdXYgZnJhbWVzIGlzIGRlZmluZWQgaW4gbWVkaWFfcHJvZmlsZXMueG1sICovCi0gICAgICAgICAgICBpZiAoKFlVVkJ1ZmZlck51bWJlciA8IHBFbmNvZGVyQ29udGV4dC0+bU1heFByZWZldGNoRnJhbWVzKSB8fAotICAgICAgICAgICAgICAgIChwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPmhhc01lZGlhU291cmNlUmV0dXJuZWRFcnJvcigpCi0gICAgICAgICAgICAgICAgICAgID09IHRydWUpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBQcm92aWRlIHRoZSBlbmNvZGVkIEFVIHRvIHRoZSB3cml0ZXIKLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5wdXRCdWZmZXIob3V0cHV0QnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgIGVyciAgICAgICAgICAgICA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgICByZXN1bHQgICAgICAgICAgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9QRU5FRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAgPSAwOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMgID0gLTEuMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0SW5wdXRDdHMgICA9IC0xLjA7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMgPSAwOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzID0gLTE7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdE91dHB1dEN0cyAgPSAtMTsKLQotICAgIHJlc3VsdCA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXItPnN0YXJ0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPnN0YXJ0KCk7Ci0KLSAgICAvLyBTZXQgdGhlIG5ldyBzdGF0ZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gU1RBUlRFRDsKLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTWVkaWFCdWZmZXIqIG91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIFNlbmQgRU9TIGFnYWluIHRvIG1ha2Ugc3VyZSB0aGUgc291cmNlIGRvZXNuJ3QgYmxvY2suCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKHBFbmNvZGVyQ29udGV4dCwgMCwKLSAgICAgICAgTTRPU0FfVFJVRSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBQcm9jZXNzIHRoZSByZW1haW5pbmcgYnVmZmVycyBpZiBuZWNlc3NhcnkKLSAgICBpZiAoIChCVUZGRVJJTkcgfCBSRUFESU5HKSAmIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlICkgewotICAgICAgICB3aGlsZSAoMSkgIHsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICpvdXRwdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+Z2V0QnVmZmVyQmxvY2tpbmcoKTsKLQotICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlciA9PSBOVUxMKSBicmVhazsKLQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcigKLSAgICAgICAgICAgICAgICBwRW5jb2RlckNvbnRleHQsIG91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5wdXRCdWZmZXIob3V0cHV0QnVmZmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gU1RBUlRFRDsKLSAgICB9Ci0KLSAgICAvLyBTdG9wIHRoZSBncmFwaCBtb2R1bGUgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgKCBTVEFSVEVEID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlICkgewotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPnN0b3AoKTsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+c3RvcCgpOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IE9QRU5FRDsKLSAgICB9Ci0KLSAgICBpZiAocEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAhPSBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcykgewotICAgICAgICBBTE9HVygiU29tZSBmcmFtZXMgd2VyZSBub3QgZW5jb2RlZDogaW5wdXQoJWQpICE9IG91dHB1dCglZCkiLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcywgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdG9wIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcmVndWxCaXRSYXRlKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgQUxPR1coInJlZ3VsQml0UmF0ZSBpcyBub3QgaW1wbGVtZW50ZWQiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbihNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24gc3RhcnQgb3B0aW9uSUQgMHglWCIsIG9wdGlvbklEKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIHN3aXRjaCggb3B0aW9uSUQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tPcHRpb25JRF9TZXRIMjY0UHJvY2Vzc05BTFVmY3RzUHRyOgotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSDI2NE5BTFVQb3N0UHJvY2Vzc0ZjdCA9Ci0gICAgICAgICAgICAgICAgKEgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVX2ZjdCopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa09wdGlvbklEX0gyNjRQcm9jZXNzTkFMVUNvbnRleHQ6Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IMjY0TkFMVVBvc3RQcm9jZXNzQ3R4ID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfQ29udGV4dClvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24gbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb24oTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uIGJlZ2luIG9wdGluSWQgMHglWCIsIG9wdGlvbklEKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlcjoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKAotICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICAqKE00RU5DT0RFUl9IZWFkZXIqKilvcHRpb25WYWx1ZSA9ICYocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb24gbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlKE00RU5DT0RFUl9Gb3JtYXQgZm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBGb3JtYXQsICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcEVuY29kZXJJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIGJlZ2luIDB4JXggMHgleCAlZCIsIHBGb3JtYXQsCi0gICAgICAgIHBFbmNvZGVySW50ZXJmYWNlLCBtb2RlKTsKLQotICAgIFNBRkVfTUFMTE9DKCpwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyIik7Ci0KLSAgICAqcEZvcm1hdCA9IGZvcm1hdDsKLQotICAgIHN3aXRjaCggZm9ybWF0ICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X0gyNjM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUEVHNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X01QRUc0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2NDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X0gyNjQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIDogdW5zdXBwb3J0ZWQgZm9ybWF0ICVkIiwKLSAgICAgICAgICAgICAgICBmb3JtYXQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdE9wZW4gICAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW47Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RTdGFydCAgICAgICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFN0b3AgICAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0b3A7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RQYXVzZSAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0UmVzdW1lICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdENsb3NlICAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0Q2xlYW51cCAgICAgID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFJlZ3VsQml0UmF0ZSA9Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3JlZ3VsQml0UmF0ZTsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEVuY29kZSAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZTsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFNldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbjsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEdldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbjsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcEVuY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjYzKE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoTTRFTkNPREVSX2tIMjYzLCBwRm9ybWF0LAotICAgICAgICAgICAgcEVuY29kZXJJbnRlcmZhY2UsIG1vZGUpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoTTRFTkNPREVSX2tNUEVHNCwgcEZvcm1hdCwKLSAgICAgICAgICAgcEVuY29kZXJJbnRlcmZhY2UsIG1vZGUpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSl7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZShNNEVOQ09ERVJfa0gyNjQsIHBGb3JtYXQsCi0gICAgICAgICAgIHBFbmNvZGVySW50ZXJmYWNlLCBtb2RlKTsKLQotfQotCi19ICAvLyBleHRlcm4gIkMiCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTJkMjExMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0jaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSNpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1YTUzMGMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWJ2aWRlb2ZpbHRlcnMKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX3ZpZGVvZmlsdGVycwotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjAuYyBcCi0gICAgICBNNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYyBcCi0gICAgICBNNFZJRklfUmVzaXplUkdCNTY1dG9SR0I1NjUuYyBcCi0gICAgICBNNFZJRklfQ2xpcC5jIFwKLSAgICAgIE00VklGSV9SZXNpemVZVVZ0b0JHUjU2NS5jIFwKLSAgICAgIE00VklGSV9SR0I4ODh0b1lVVjQyMC5jIFwKLSAgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMC5jIFwKLSAgICAgIE00VkZMX3RyYW5zaXRpb24uYwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotIyBBbGwgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgd2UgbGluayBhZ2FpbnN0LgotTE9DQUxfTERMSUJTIDo9IFwKLSAgICAtbHB0aHJlYWQgLWxkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWRkxfdHJhbnNpdGlvbi5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VkZMX3RyYW5zaXRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmE1ZTBiNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWRkxfdHJhbnNpdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRUUkFOX3RyYW5zaXRpb24uYwotICogQGJyaWVmCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqIE9TQUwgKG1lbXNldCBhbmQgbWVtY3B5KSAqKiovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLSNpbmNsdWRlICJNNFZGTF90cmFuc2l0aW9uLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIExJVFRMRV9FTkRJQU4KLSNkZWZpbmUgTTRWRkxfU1dBUF9TSE9SVChhKSBhID0gKChhICYgMHhGRikgPDwgOCkgfCAoKGEgJiAweEZGMDApID4+IDgpCi0jZWxzZQotI2RlZmluZSBNNFZGTF9TV0FQX1NIT1JUKGEpCi0jZW5kaWYKLQotI2RlZmluZSBMVU1fRkFDVE9SX01BWCAxMAotCi0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYUJ5U3RlcChNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sIE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRkxfTW9kaWZMdW1QYXJhbSAqbHVtX3BhcmFtLCB2b2lkICp1c2VyX2RhdGEpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgKnBfc3JjLCAqcF9kZXN0LCAqcF9zcmNfbGluZSwgKnBfZGVzdF9saW5lOwotICAgIHVuc2lnbmVkIGxvbmcgcGl4X3NyYzsKLSAgICB1bnNpZ25lZCBsb25nIHVfb3V0cHgsIHVfb3V0cHgyOwotICAgIHVuc2lnbmVkIGxvbmcgdV93aWR0aCwgdV9zdHJpZGUsIHVfc3RyaWRlX291dCx1X2hlaWdodCwgcGl4OwotICAgIHVuc2lnbmVkIGxvbmcgbGYxLCBsZjIsIGxmMzsKLSAgICBsb25nIGksIGo7Ci0KLSAgICBpZiAobHVtX3BhcmFtLT5jb3B5X2Nocm9tYSAhPSAwKQotICAgIHsKLSAgICAgICAgLyogY29weSBjaHJvbWEgcGxhbmUgKi8KLQotICAgIH0KLQotICAgIC8qIGFwcGx5IGx1bWEgZmFjdG9yICovCi0gICAgdV93aWR0aCA9IHBsYW5lX2luWzBdLnVfd2lkdGg7Ci0gICAgdV9oZWlnaHQgPSBwbGFuZV9pblswXS51X2hlaWdodDsKLSAgICB1X3N0cmlkZSA9IChwbGFuZV9pblswXS51X3N0cmlkZSA+PiAxKTsKLSAgICB1X3N0cmlkZV9vdXQgPSAocGxhbmVfb3V0WzBdLnVfc3RyaWRlID4+IDEpOwotICAgIHBfZGVzdCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcGxhbmVfb3V0WzBdLnBhY19kYXRhW3BsYW5lX291dFswXS51X3RvcGxlZnRdOwotICAgIHBfc3JjID0gKHVuc2lnbmVkIHNob3J0ICopICZwbGFuZV9pblswXS5wYWNfZGF0YVtwbGFuZV9pblswXS51X3RvcGxlZnRdOwotICAgIHBfZGVzdF9saW5lID0gcF9kZXN0OwotICAgIHBfc3JjX2xpbmUgPSBwX3NyYzsKLQotICAgIHN3aXRjaChsdW1fcGFyYW0tPmx1bV9mYWN0b3IpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgICAgLyogdmVyeSBzcGVjaWZpYyBjYXNlIDogc2V0IGx1bWEgcGxhbmUgdG8gMTYgKi8KLSAgICAgICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2Rlc3QsMTYsIHVfd2lkdGgpOwotICAgICAgICAgICAgcF9kZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgMToKLSAgICAgICAgLyogMC4yNSAqLwotICAgICAgICBsZjEgPSA2OyBsZjIgPSA2OyBsZjMgPSA3OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAgIC8qIDAuMzc1ICovCi0gICAgICAgIGxmMSA9IDc7IGxmMiA9IDc7IGxmMyA9IDc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgICAgLyogMC41ICovCi0gICAgICAgIGxmMSA9IDc7IGxmMiA9IDc7IGxmMyA9IDg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgICAgLyogMC42MjUgKi8KLSAgICAgICAgbGYxID0gNzsgbGYyID0gODsgbGYzID0gODsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgICAvKiAwLjc1ICovCi0gICAgICAgIGxmMSA9IDg7IGxmMiA9IDg7IGxmMyA9IDg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgICAgLyogMC44NzUgKi8KLSAgICAgICAgbGYxID0gOTsgbGYyID0gODsgbGYzID0gNzsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgbGYxID0gODsgbGYyID0gODsgbGYzID0gOTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgIHsKLSAgICAgICAgcF9kZXN0ID0gcF9kZXN0X2xpbmU7Ci0gICAgICAgIHBfc3JjID0gcF9zcmNfbGluZTsKLSAgICAgICAgZm9yIChpID0gKHVfd2lkdGggPj4gMSk7IGkgIT0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwaXhfc3JjID0gKHVuc2lnbmVkIGxvbmcpICpwX3NyYysrOwotICAgICAgICAgICAgcGl4ID0gcGl4X3NyYyAmIDB4RkY7Ci0gICAgICAgICAgICB1X291dHB4ID0gKCgocGl4IDw8IGxmMSkgKyAocGl4IDw8IGxmMikgKyAocGl4IDw8IGxmMykgKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICBwaXggPSAoKHBpeF9zcmMgJiAweEZGMDApID4+IDgpOwotICAgICAgICAgICAgdV9vdXRweDIgPSAoKCgocGl4IDw8IGxmMSkgKyAocGl4IDw8IGxmMikgKyAocGl4IDw8IGxmMykgKSA+PiBMVU1fRkFDVE9SX01BWCk8PCA4KSA7Ci0gICAgICAgICAgICAqcF9kZXN0KysgPSAodW5zaWduZWQgc2hvcnQpICh1X291dHB4MiB8IHVfb3V0cHgpOwotICAgICAgICB9Ci0gICAgICAgIHBfZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgcF9zcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotdW5zaWduZWQgY2hhciBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsdW1fZmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgKnBfc3JjLCAqcF9kZXN0LCAqcF9zcmNfbGluZSwgKnBfZGVzdF9saW5lOwotICAgIHVuc2lnbmVkIGNoYXIgKnBfY3NyYywgKnBfY2Rlc3QsICpwX2NzcmNfbGluZSwgKnBfY2Rlc3RfbGluZTsKLSAgICB1bnNpZ25lZCBsb25nIHBpeF9zcmM7Ci0gICAgdW5zaWduZWQgbG9uZyB1X291dHB4LCB1X291dHB4MjsKLSAgICB1bnNpZ25lZCBsb25nIHVfd2lkdGgsIHVfc3RyaWRlLCB1X3N0cmlkZV9vdXQsdV9oZWlnaHQsIHBpeDsKLSAgICBsb25nIGksIGo7Ci0KLSAgICAvKiBjb3B5IG9yIGZpbHRlciBjaHJvbWEgKi8KLSAgICB1X3dpZHRoID0gcGxhbmVfaW5bMV0udV93aWR0aDsKLSAgICB1X2hlaWdodCA9IHBsYW5lX2luWzFdLnVfaGVpZ2h0OwotICAgIHVfc3RyaWRlID0gcGxhbmVfaW5bMV0udV9zdHJpZGU7Ci0gICAgdV9zdHJpZGVfb3V0ID0gcGxhbmVfb3V0WzFdLnVfc3RyaWRlOwotICAgIHBfY2Rlc3RfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMV0ucGFjX2RhdGFbcGxhbmVfb3V0WzFdLnVfdG9wbGVmdF07Ci0gICAgcF9jc3JjX2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfaW5bMV0ucGFjX2RhdGFbcGxhbmVfaW5bMV0udV90b3BsZWZ0XTsKLQotICAgIGlmIChsdW1fZmFjdG9yID4gMjU2KQotICAgIHsKLSAgICAgICAgcF9jZGVzdCA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMl0ucGFjX2RhdGFbcGxhbmVfb3V0WzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIHBfY3NyYyA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9pblsyXS5wYWNfZGF0YVtwbGFuZV9pblsyXS51X3RvcGxlZnRdOwotICAgICAgICAvKiBjb3B5IGNocm9tYSAqLwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfY2Rlc3RfbGluZSwgKHZvaWQgKilwX2NzcmNfbGluZSwgdV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9jZGVzdCwodm9pZCAqKSBwX2NzcmMsIHVfd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY2Rlc3QgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgICAgICAgICBwX2NzcmMgKz0gdV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogZmlsdGVyIGNocm9tYSAqLwotICAgICAgICBwaXggPSAoMTAyNCAtIGx1bV9mYWN0b3IpIDw8IDc7Ci0gICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9jZGVzdCA9IHBfY2Rlc3RfbGluZTsKLSAgICAgICAgICAgIHBfY3NyYyA9IHBfY3NyY19saW5lOwotICAgICAgICAgICAgZm9yIChpID0gdV93aWR0aDsgaSAhPSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfY2Rlc3QrKyA9ICgocGl4ICsgKCpwX2NzcmMrKyAmIDB4RkYpICogbHVtX2ZhY3RvcikgPj4gTFVNX0ZBQ1RPUl9NQVgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIHBfY2Rlc3RfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMl0ucGFjX2RhdGFbcGxhbmVfb3V0WzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIHBfY3NyY19saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX2luWzJdLnBhY19kYXRhW3BsYW5lX2luWzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9jZGVzdCA9IHBfY2Rlc3RfbGluZTsKLSAgICAgICAgICAgIHBfY3NyYyA9IHBfY3NyY19saW5lOwotICAgICAgICAgICAgZm9yIChpID0gdV93aWR0aDsgaSAhPSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfY2Rlc3QrKyA9ICgocGl4ICsgKCpwX2NzcmMgJiAweEZGKSAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NzcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBhcHBseSBsdW1hIGZhY3RvciAqLwotICAgIHVfd2lkdGggPSBwbGFuZV9pblswXS51X3dpZHRoOwotICAgIHVfaGVpZ2h0ID0gcGxhbmVfaW5bMF0udV9oZWlnaHQ7Ci0gICAgdV9zdHJpZGUgPSAocGxhbmVfaW5bMF0udV9zdHJpZGUgPj4gMSk7Ci0gICAgdV9zdHJpZGVfb3V0ID0gKHBsYW5lX291dFswXS51X3N0cmlkZSA+PiAxKTsKLSAgICBwX2Rlc3QgPSAodW5zaWduZWQgc2hvcnQgKikgJnBsYW5lX291dFswXS5wYWNfZGF0YVtwbGFuZV9vdXRbMF0udV90b3BsZWZ0XTsKLSAgICBwX3NyYyA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcGxhbmVfaW5bMF0ucGFjX2RhdGFbcGxhbmVfaW5bMF0udV90b3BsZWZ0XTsKLSAgICBwX2Rlc3RfbGluZSA9IHBfZGVzdDsKLSAgICBwX3NyY19saW5lID0gcF9zcmM7Ci0KLSAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgewotICAgICAgICBwX2Rlc3QgPSBwX2Rlc3RfbGluZTsKLSAgICAgICAgcF9zcmMgPSBwX3NyY19saW5lOwotICAgICAgICBmb3IgKGkgPSAodV93aWR0aCA+PiAxKTsgaSAhPSAwOyBpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBpeF9zcmMgPSAodW5zaWduZWQgbG9uZykgKnBfc3JjKys7Ci0gICAgICAgICAgICBwaXggPSBwaXhfc3JjICYgMHhGRjsKLSAgICAgICAgICAgIHVfb3V0cHggPSAoKHBpeCAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIHBpeCA9ICgocGl4X3NyYyAmIDB4RkYwMCkgPj4gOCk7Ci0gICAgICAgICAgICB1X291dHB4MiA9ICgoKHBpeCAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTw8IDgpIDsKLSAgICAgICAgICAgICpwX2Rlc3QrKyA9ICh1bnNpZ25lZCBzaG9ydCkgKHVfb3V0cHgyIHwgdV9vdXRweCk7Ci0gICAgICAgIH0KLSAgICAgICAgcF9kZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICBwX3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMCAodm9pZCAqcFVzZXJEYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluMiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBQcm9ncmVzcykKLSAqIEBicmllZiAgIEJsZW5kcyB0d28gWVVWIDQ6MjowIFBsYW5hciBpbWFnZXMuCi0gKiBAbm90ZSAgICBCbGVuZHMgWVVWNDIwIHBsYW5hciBpbWFnZXMsCi0gKiAgICAgICAgICBNYXAgdGhlIHZhbHVlIG9mIHByb2dyZXNzIGZyb20gKDAgLSAxMDAwKSB0byAoMCAtIDEwMjQpCi0gKiAgICAgICAgICBTZXQgdGhlIHJhbmdlIG9mIGJsZW5kaW5nZmFjdG9yLAotICogICAgICAgICAgICAgICAgICAxLiBmcm9tIDAgdG8gKFByb2dyZXNzIDw8IDEpICAgICAgICAgICAgO2ZvciBQcm9ncmVzcyA8PSA1MTIKLSAqICAgICAgICAgICAgICAgICAgMi4gZnJvbSAoKCBQcm9ncmVzcyAtIDUxMik8PCAxKSB0byAxMDI0IDtvdGhlcndpc2UKLSAqICAgICAgICAgIFNldCB0aGUgaW5jcmVtZW50IG9mIGJsZW5kaW5nZmFjdG9yIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGltYWdlIHJvdyBieSB0aGUgZmFjdG9yLAotICogICAgICAgICAgICAgICAgICA9ICAoUmFuZ2UtMSkgLyAoaW1hZ2Ugd2lkdGgtMSkgIDtmb3Igd2lkdGggPj0gcmFuZ2UKLSAqICAgICAgICAgICAgICAgICAgPSAgKFJhbmdlKSAvIChpbWFnZSB3aWR0aCkgICAgICA7b3RoZXJ3aXNlCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2goPSBpKSByb3cgb2Ygb3V0cHV0IFkgcGxhbmUgKHN0ZXBzIG9mIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoKD0gaikgY29sdW1uIG9mIG91dHB1dCBZIHBsYW5lIChzdGVwcyBvZiAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIG9uZSBVICYgViBzYW1wbGUgZnJvbSB0d28gaW5wdXQgWVVWNDoyOjAgaW1hZ2VzIGFuZAotICogICAgICAgICAgICAgICAgICBDb21wdXRlIGZvdXIgWSBzYW1wbGUgYW5kIG9uZSBVICYgViBzYW1wbGUgZm9yIG91dHB1dCBZVVY0OjI6MCBpbWFnZQotICogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlIGZvbGxvd2luZywKLSAqICAgICAgICAgICAgICAgICAgT3V0KGksaikgPSBibGVuZGluZ2ZhY3RvcihpLGopICogSW4xKGksaikrIChsIC0gYmxlbmRpbmdmYWN0b3IoaSxqKSkgKkluMihpLGopCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3AgY29sdW1uCi0gKiAgICAgICAgICBlbmQgbG9vcCByb3cuCi0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgIFVzZXIgU3BlY2lmaWMgUGFyYW1ldGVyCi0gKiBAcGFyYW0gICBwUGxhbmVJbjE6IChJTikgIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcyBtYWludGFpbmVkCi0gKiAgICAgICAgICAgZm9yIFksIFUgYW5kIFYgcGxhbmVzLgotICogQHBhcmFtICAgcFBsYW5lSW4yOiAoSU4pICBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGltYWdlIHBsYW5lIHN0cnVjdHVyZXMgbWFpbnRhaW5lZAotICogICAgICAgICAgIGZvciBZLCBVIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQKLSAqICAgICAgICAgICBmb3IgWSwgVSBhbmQgViBwbGFuZXMuCi0gKiBAcGFyYW0gICBQcm9ncmVzczogIChJTikgIFByb2dyZXNzIHZhbHVlICh2YXJpZXMgYmV0d2VlbiAwIGFuZCAxMDAwKQotICogQHJldHVybiAgTTRWSUZJX09LOiBObyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBFcnJvciBpbiBoZWlnaHQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgRXJyb3IgaW4gd2lkdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiogQ2hlY2sgZm9yIHZhbHVlIGlzIEVWRU4gKi8KLSNpZm5kZWYgSVNfRVZFTgotI2RlZmluZSBJU19FVkVOKGEpICAoIShhICYgMHgwMSkpCi0jZW5kaWYKLQotLyoqIFVzZWQgZm9yIGZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uICovCi0jaWZuZGVmIE1BWF9TSE9SVAotI2RlZmluZSBNQVhfU0hPUlQgICAweDEwMDAwCi0jZW5kaWYKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgICAgMAotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgICAwCi0jZGVmaW5lIFRSVUUgICAgIUZBTFNFCi0jZW5kaWYKLQotdW5zaWduZWQgY2hhciBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVJbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBQcm9ncmVzcykKLXsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9zdGFydDEsKnB1OF9kYXRhX1Vfc3RhcnQxLCpwdThfZGF0YV9WX3N0YXJ0MTsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9zdGFydDIsKnB1OF9kYXRhX1Vfc3RhcnQyLCpwdThfZGF0YV9WX3N0YXJ0MjsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9zdGFydDMsKnB1OF9kYXRhX1Vfc3RhcnQzLCpwdThfZGF0YV9WX3N0YXJ0MzsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9jdXJyZW50MSwgKnB1OF9kYXRhX1lfbmV4dDEsICpwdThfZGF0YV9VMSwgKnB1OF9kYXRhX1YxOwotICAgIFVJbnQ4ICAgICpwdThfZGF0YV9ZX2N1cnJlbnQyLCAqcHU4X2RhdGFfWV9uZXh0MiwgKnB1OF9kYXRhX1UyLCAqcHU4X2RhdGFfVjI7Ci0gICAgVUludDggICAgKnB1OF9kYXRhX1lfY3VycmVudDMsKnB1OF9kYXRhX1lfbmV4dDMsICpwdThfZGF0YV9VMywgKnB1OF9kYXRhX1YzOwotICAgIFVJbnQzMiAgIHUzMl9zdHJpZGVfWTEsIHUzMl9zdHJpZGUyX1kxLCB1MzJfc3RyaWRlX1UxLCB1MzJfc3RyaWRlX1YxOwotICAgIFVJbnQzMiAgIHUzMl9zdHJpZGVfWTIsIHUzMl9zdHJpZGUyX1kyLCB1MzJfc3RyaWRlX1UyLCB1MzJfc3RyaWRlX1YyOwotICAgIFVJbnQzMiAgIHUzMl9zdHJpZGVfWTMsIHUzMl9zdHJpZGUyX1kzLCB1MzJfc3RyaWRlX1UzLCB1MzJfc3RyaWRlX1YzOwotICAgIFVJbnQzMiAgIHUzMl9oZWlnaHQsICB1MzJfd2lkdGg7Ci0gICAgVUludDMyICAgdTMyX2JsZW5kZmFjdG9yLCB1MzJfc3RhcnRBLCB1MzJfZW5kQSwgdTMyX2JsZW5kX2luYywgdTMyX3hfYWNjdW07Ci0gICAgVUludDMyICAgdTMyX2NvbCwgdTMyX3JvdywgdTMyX3JhbmdlQSwgdTMyX3Byb2dyZXNzOwotICAgIFVJbnQzMiAgIHUzMl9VMSx1MzJfVjEsdTMyX1UyLHUzMl9WMiwgdTMyX1kxLCB1MzJfWTI7Ci0KLQotICAgIC8qIENoZWNrIHRoZSBZIHBsYW5lIGhlaWdodCBpcyBFVkVOIGFuZCBpbWFnZSBwbGFuZSBoZWlnaHRzIGFyZSBzYW1lICovCi0gICAgaWYoIChJU19FVkVOKHBQbGFuZUluMVswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZUluMlswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dFswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVJbjFbMF0udV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVJbjJbMF0udV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIC8qIENoZWNrIHRoZSBZIHBsYW5lIHdpZHRoIGlzIEVWRU4gYW5kIGltYWdlIHBsYW5lIHdpZHRocyBhcmUgc2FtZSAqLwotICAgIGlmKCAoSVNfRVZFTihwUGxhbmVJbjFbMF0udV93aWR0aCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgICB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVJbjJbMF0udV93aWR0aCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgICB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXRbMF0udV93aWR0aCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lSW4xWzBdLnVfd2lkdGggICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lSW4yWzBdLnVfd2lkdGggICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dDEgWVVWNDIwIGltYWdlIHBsYW5lcyAqLwotICAgIHB1OF9kYXRhX1lfc3RhcnQxID0gcFBsYW5lSW4xWzBdLnBhY19kYXRhICsgcFBsYW5lSW4xWzBdLnVfdG9wbGVmdDsKLSAgICBwdThfZGF0YV9VX3N0YXJ0MSA9IHBQbGFuZUluMVsxXS5wYWNfZGF0YSArIHBQbGFuZUluMVsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X2RhdGFfVl9zdGFydDEgPSBwUGxhbmVJbjFbMl0ucGFjX2RhdGEgKyBwUGxhbmVJbjFbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0MiBZVVY0MjAgaW1hZ2UgcGxhbmVzICovCi0gICAgcHU4X2RhdGFfWV9zdGFydDIgPSBwUGxhbmVJbjJbMF0ucGFjX2RhdGEgKyBwUGxhbmVJbjJbMF0udV90b3BsZWZ0OwotICAgIHB1OF9kYXRhX1Vfc3RhcnQyID0gcFBsYW5lSW4yWzFdLnBhY19kYXRhICsgcFBsYW5lSW4yWzFdLnVfdG9wbGVmdDsKLSAgICBwdThfZGF0YV9WX3N0YXJ0MiA9IHBQbGFuZUluMlsyXS5wYWNfZGF0YSArIHBQbGFuZUluMlsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IFlVVjQyMCBpbWFnZSBwbGFuZXMgKi8KLSAgICBwdThfZGF0YV9ZX3N0YXJ0MyA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X2RhdGFfVV9zdGFydDMgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHB1OF9kYXRhX1Zfc3RhcnQzID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsgcFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgc3RyaWRlIGZvciB0aGUgbmV4dCByb3cgaW4gZWFjaCBpbnB1dDEgWVVWNDIwIHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZMSA9IHBQbGFuZUluMVswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1UxID0gcFBsYW5lSW4xWzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfVjEgPSBwUGxhbmVJbjFbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIHN0cmlkZSBmb3IgdGhlIG5leHQgcm93IGluIGVhY2ggaW5wdXQyIFlVVjQyMCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWTIgPSBwUGxhbmVJbjJbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9VMiA9IHBQbGFuZUluMlsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YyID0gcFBsYW5lSW4yWzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzdHJpZGUgZm9yIHRoZSBuZXh0IHJvdyBpbiBlYWNoIG91dHB1dCBZVVY0MjAgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kzID0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfVTMgPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WMyA9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIHUzMl9zdHJpZGUyX1kxICAgPSB1MzJfc3RyaWRlX1kxIDw8IDE7Ci0gICAgdTMyX3N0cmlkZTJfWTIgICA9IHUzMl9zdHJpZGVfWTIgPDwgMTsKLSAgICB1MzJfc3RyaWRlMl9ZMyAgID0gdTMyX3N0cmlkZV9ZMyA8PCAxOwotCi0gICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotICAgIHUzMl93aWR0aCAgPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLQotICAgIC8qIFVzZXIgU3BlY2lmaWVkIFByb2dyZXNzIHZhbHVlICovCi0gICAgdTMyX3Byb2dyZXNzID0gUHJvZ3Jlc3M7Ci0KLSAgICAvKiBNYXAgUHJvZ3Jlc3MgdmFsdWUgZnJvbSAoMCAtIDEwMDApIHRvICgwIC0gMTAyNCkgLT4gZm9yIG9wdGltaXNhdGlvbiAqLwotICAgIGlmKHUzMl9wcm9ncmVzcyA8IDEwMDApCi0gICAgICAgIHUzMl9wcm9ncmVzcyA9ICgodTMyX3Byb2dyZXNzIDw8IDEwKSAvIDEwMDApOwotICAgIGVsc2UKLSAgICAgICAgdTMyX3Byb2dyZXNzID0gMTAyNDsKLQotICAgIC8qIFNldCB0aGUgcmFuZ2Ugb2YgYmxlbmRpbmdmYWN0b3IgKi8KLSAgICBpZih1MzJfcHJvZ3Jlc3MgPD0gNTEyKQotICAgIHsKLSAgICAgICAgdTMyX3N0YXJ0QSA9IDA7Ci0gICAgICAgIHUzMl9lbmRBICAgPSAodTMyX3Byb2dyZXNzIDw8IDEpOwotICAgIH0KLSAgICBlbHNlIC8qIHUzMl9wcm9ncmVzcyA+IDUxMiAqLwotICAgIHsKLSAgICAgICAgdTMyX3N0YXJ0QSA9ICh1MzJfcHJvZ3Jlc3MgLSA1MTIpIDw8IDE7Ci0gICAgICAgIHUzMl9lbmRBICAgPSAgMTAyNDsKLSAgICB9Ci0gICAgdTMyX3JhbmdlQSA9IHUzMl9lbmRBIC0gdTMyX3N0YXJ0QTsKLQotICAgIC8qIFNldCB0aGUgaW5jcmVtZW50IG9mIGJsZW5kaW5nZmFjdG9yIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGltYWdlIHJvdyAqLwotICAgIGlmICgodTMyX3dpZHRoID49IHUzMl9yYW5nZUEpICYmICh1MzJfcmFuZ2VBID4gMCkgKQotICAgIHsKLSAgICAgICAgdTMyX2JsZW5kX2luYyAgID0gKCh1MzJfcmFuZ2VBLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGggLSAxKTsKLSAgICB9Ci0gICAgZWxzZSAvKiAodTMyX3dpZHRoIDwgdTMyX3JhbmdlQSkgfHwgKHUzMl9yYW5nZUEgPCAwKSAqLwotICAgIHsKLSAgICAgICAgdTMyX2JsZW5kX2luYyAgID0gKHUzMl9yYW5nZUEgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aCk7Ci0gICAgfQotCi0gICAgLyogVHdvIFlVVjQyMCByb3dzIGFyZSBjb21wdXRlZCBhdCBlYWNoIHBhc3MgKi8KLSAgICBmb3IgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0OyB1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0yKQotICAgIHsKLSAgICAgICAgLyogU2V0IHBvaW50ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJvdyBmb3IgZWFjaCBpbnB1dCBpbWFnZTEgcGxhbmUgKi8KLSAgICAgICAgcHU4X2RhdGFfWV9jdXJyZW50MSA9IHB1OF9kYXRhX1lfc3RhcnQxOwotICAgICAgICBwdThfZGF0YV9VMSA9IHB1OF9kYXRhX1Vfc3RhcnQxOwotICAgICAgICBwdThfZGF0YV9WMSA9IHB1OF9kYXRhX1Zfc3RhcnQxOwotCi0gICAgICAgIC8qIFNldCBwb2ludGVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3cgZm9yIGVhY2ggaW5wdXQgaW1hZ2UyIHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX1lfY3VycmVudDIgPSBwdThfZGF0YV9ZX3N0YXJ0MjsKLSAgICAgICAgcHU4X2RhdGFfVTIgPSBwdThfZGF0YV9VX3N0YXJ0MjsKLSAgICAgICAgcHU4X2RhdGFfVjIgPSBwdThfZGF0YV9WX3N0YXJ0MjsKLQotICAgICAgICAvKiBTZXQgcG9pbnRlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcm93IGZvciBlYWNoIG91dHB1dCBpbWFnZSBwbGFuZSAqLwotICAgICAgICBwdThfZGF0YV9ZX2N1cnJlbnQzID0gcHU4X2RhdGFfWV9zdGFydDM7Ci0gICAgICAgIHB1OF9kYXRhX1UzID0gcHU4X2RhdGFfVV9zdGFydDM7Ci0gICAgICAgIHB1OF9kYXRhX1YzID0gcHU4X2RhdGFfVl9zdGFydDM7Ci0KLSAgICAgICAgLyogU2V0IHBvaW50ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcm93IGZvciBpbWFnZSBsdW1hIHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX1lfbmV4dDEgPSBwdThfZGF0YV9ZX2N1cnJlbnQxICsgdTMyX3N0cmlkZV9ZMTsKLSAgICAgICAgcHU4X2RhdGFfWV9uZXh0MiA9IHB1OF9kYXRhX1lfY3VycmVudDIgKyB1MzJfc3RyaWRlX1kyOwotICAgICAgICBwdThfZGF0YV9ZX25leHQzID0gcHU4X2RhdGFfWV9jdXJyZW50MyArIHUzMl9zdHJpZGVfWTM7Ci0KLSAgICAgICAgLyogSW5pdGlhbGlzZSBibGVuZGZhY3RvciAqLwotICAgICAgICB1MzJfYmxlbmRmYWN0b3IgICA9IHUzMl9zdGFydEE7Ci0gICAgICAgIC8qIEJsZW5kZmFjdG9yIEluY3JlbWVudCBhY2N1bXVsYXRvciAqLwotICAgICAgICB1MzJfeF9hY2N1bSA9IDA7Ci0KLSAgICAgICAgLyogTG9vcCBvbiBlYWNoIGNvbHVtbiBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aDsgdTMyX2NvbCAhPSAwIDsgdTMyX2NvbCAtPTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYmxlbmRpbmcgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfYmxlbmRmYWN0b3IgPSB1MzJfc3RhcnRBICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgseSkgb2YgaW5wdXQgSW1hZ2UxICovCi0gICAgICAgICAgICB1MzJfWTEgPSAqcHU4X2RhdGFfWV9jdXJyZW50MSsrOwotCi0gICAgICAgICAgICAvKiBHZXQgY2hyb21pbmFuY2UyIHZhbHVlICovCi0gICAgICAgICAgICB1MzJfVTEgPSAqcHU4X2RhdGFfVTErKzsKLSAgICAgICAgICAgIHUzMl9WMSA9ICpwdThfZGF0YV9WMSsrOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCx5KSBvZiBpbnB1dCBJbWFnZTIgKi8KLSAgICAgICAgICAgIHUzMl9ZMiA9ICpwdThfZGF0YV9ZX2N1cnJlbnQyKys7Ci0KLSAgICAgICAgICAgIC8qIEdldCBjaHJvbWluYW5jZTIgdmFsdWUgKi8KLSAgICAgICAgICAgIHUzMl9VMiA9ICpwdThfZGF0YV9VMisrOwotICAgICAgICAgICAgdTMyX1YyID0gKnB1OF9kYXRhX1YyKys7Ci0KLSAgICAgICAgICAgIC8qIENvbXB1dGUgTHVtYSB2YWx1ZSAoeCx5KSBvZiBPdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgICAgICpwdThfZGF0YV9ZX2N1cnJlbnQzKysgID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1kyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMjQgLSB1MzJfYmxlbmRmYWN0b3IpKnUzMl9ZMSkgPj4gMTApOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBjaHJvbWEoVSkgdmFsdWUgb2YgT3V0cHV0IGltYWdlICovCi0gICAgICAgICAgICAqcHU4X2RhdGFfVTMrKyAgICAgICAgICA9IChVSW50OCkoKHUzMl9ibGVuZGZhY3RvciAqIHUzMl9VMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMDI0IC0gdTMyX2JsZW5kZmFjdG9yKSp1MzJfVTEpID4+IDEwKTsKLSAgICAgICAgICAgIC8qIENvbXB1dGUgY2hyb21hKFYpIHZhbHVlIG9mIE91dHB1dCBpbWFnZSAqLwotICAgICAgICAgICAgKnB1OF9kYXRhX1YzKysgICAgICAgICAgPSAoVUludDgpKCh1MzJfYmxlbmRmYWN0b3IgKiB1MzJfVjIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1YxKSA+PiAxMCk7Ci0KLSAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4LHkrMSkgb2YgaW5wdXQgSW1hZ2UxICovCi0gICAgICAgICAgICB1MzJfWTEgPSAqcHU4X2RhdGFfWV9uZXh0MSsrOwotCi0gICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgseSsxKSBvZiBpbnB1dCBJbWFnZTIgKi8KLSAgICAgICAgICAgIHUzMl9ZMiA9ICpwdThfZGF0YV9ZX25leHQyKys7Ci0KLSAgICAgICAgICAgIC8qIENvbXB1dGUgTHVtYSB2YWx1ZSAoeCx5KzEpIG9mIE91dHB1dCBpbWFnZSovCi0gICAgICAgICAgICAqcHU4X2RhdGFfWV9uZXh0MysrID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1kyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1kxKSA+PiAxMCk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl9ibGVuZF9pbmM7Ci0KLSAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYmxlbmRpbmcgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfYmxlbmRmYWN0b3IgPSB1MzJfc3RhcnRBICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgrMSx5KSBvZiBpbnB1dCBJbWFnZTEgKi8KLSAgICAgICAgICAgIHUzMl9ZMSA9ICpwdThfZGF0YV9ZX2N1cnJlbnQxKys7Ci0KLSAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4KzEseSkgb2YgaW5wdXQgSW1hZ2UyICovCi0gICAgICAgICAgICB1MzJfWTIgPSAqcHU4X2RhdGFfWV9jdXJyZW50MisrOwotCi0gICAgICAgICAgICAvKiBDb21wdXRlIEx1bWEgdmFsdWUgKHgrMSx5KSBvZiBPdXRwdXQgaW1hZ2UqLwotICAgICAgICAgICAgKnB1OF9kYXRhX1lfY3VycmVudDMrKyA9IChVSW50OCkoKHUzMl9ibGVuZGZhY3RvciAqIHUzMl9ZMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMjQgLSB1MzJfYmxlbmRmYWN0b3IpKnUzMl9ZMSkgPj4gMTApOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCsxLHkrMSkgb2YgaW5wdXQgSW1hZ2UxICovCi0gICAgICAgICAgICB1MzJfWTEgPSAqcHU4X2RhdGFfWV9uZXh0MSsrOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCsxLHkrMSkgb2YgaW5wdXQgSW1hZ2UyICovCi0gICAgICAgICAgICB1MzJfWTIgPSAqcHU4X2RhdGFfWV9uZXh0MisrOwotCi0gICAgICAgICAgICAvKiBDb21wdXRlIEx1bWEgdmFsdWUgKHgrMSx5KzEpIG9mIE91dHB1dCBpbWFnZSovCi0gICAgICAgICAgICAqcHU4X2RhdGFfWV9uZXh0MysrID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1kyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1kxKSA+PiAxMCk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl9ibGVuZF9pbmM7Ci0KLSAgICAgICAgICAgIC8qIFdvcmtpbmcgcG9pbnRlcnMgYXJlIGluY3JlbWVudGVkIGp1c3QgYWZ0ZXIgZWFjaCBzdG9yYWdlICovCi0KLSAgICAgICAgfS8qIEVuZCBvZiByb3cgc2Nhbm5pbmcgKi8KLQotICAgICAgICAvKiBVcGRhdGUgd29ya2luZyBwb2ludGVyIG9mIGlucHV0IGltYWdlMSBmb3IgbmV4dCByb3cgKi8KLSAgICAgICAgcHU4X2RhdGFfWV9zdGFydDEgKz0gdTMyX3N0cmlkZTJfWTE7Ci0gICAgICAgIHB1OF9kYXRhX1Vfc3RhcnQxICs9IHUzMl9zdHJpZGVfVTE7Ci0gICAgICAgIHB1OF9kYXRhX1Zfc3RhcnQxICs9IHUzMl9zdHJpZGVfVjE7Ci0KLSAgICAgICAgLyogVXBkYXRlIHdvcmtpbmcgcG9pbnRlciBvZiBpbnB1dCBpbWFnZTIgZm9yIG5leHQgcm93ICovCi0gICAgICAgIHB1OF9kYXRhX1lfc3RhcnQyICs9IHUzMl9zdHJpZGUyX1kyOwotICAgICAgICBwdThfZGF0YV9VX3N0YXJ0MiArPSB1MzJfc3RyaWRlX1UyOwotICAgICAgICBwdThfZGF0YV9WX3N0YXJ0MiArPSB1MzJfc3RyaWRlX1YyOwotCi0gICAgICAgIC8qIFVwZGF0ZSB3b3JraW5nIHBvaW50ZXIgb2Ygb3V0cHV0IGltYWdlIGZvciBuZXh0IHJvdyAqLwotICAgICAgICBwdThfZGF0YV9ZX3N0YXJ0MyArPSB1MzJfc3RyaWRlMl9ZMzsKLSAgICAgICAgcHU4X2RhdGFfVV9zdGFydDMgKz0gdTMyX3N0cmlkZV9VMzsKLSAgICAgICAgcHU4X2RhdGFfVl9zdGFydDMgKz0gdTMyX3N0cmlkZV9WMzsKLQotICAgIH0vKiBFbmQgb2YgY29sdW1uIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMC5jICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfQkdSNTY1dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfQkdSNTY1dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzYwODc2Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMKLSAqIEBicmllZiAgICBDb250YWluIHZpZGVvIGxpYnJhcnkgZnVuY3Rpb24KLSAqIEBub3RlICAgICBDb2xvciBDb252ZXJzaW9uIEZpbHRlcgotICogICAgICAgICAgIC0jIENvbnRhaW5zIHRoZSBmb3JtYXQgY29udmVyc2lvbiBmaWx0ZXJzIGZyb20gQkdSNTY1IHRvIFlVVjQyMAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICBUcmFuc2Zvcm0gQkdSNTY1IGltYWdlIHRvIGEgWVVWNDIwIGltYWdlLgotICogQG5vdGUgICAgQ29udmVydCBCR1I1NjUgdG8gWVVWNDIwLAotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gKiAgICAgICAgICAgICAgICAgIEdldCA0IEJHUiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gKiAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gQkdSNTY1IFBsYW5lCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gIFlVVjQyMCBidWZmZXIgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNFZJRklfVUludDggICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoLCB1MzJfaGVpZ2h0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX1ksIHUzMl9zdHJpZGUyX1ksIHUzMl9zdHJpZGVfVSwgdTMyX3N0cmlkZV9WOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2JnciwgdTMyX3N0cmlkZV8yYmdyOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY29sLCB1MzJfcm93OwotCi0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9yMDAsIGkzMl9yMDEsIGkzMl9yMTAsIGkzMl9yMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9nMDAsIGkzMl9nMDEsIGkzMl9nMTAsIGkzMl9nMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9iMDAsIGkzMl9iMDEsIGkzMl9iMTAsIGkzMl9iMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl95MDAsIGkzMl95MDEsIGkzMl95MTAsIGkzMl95MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl91MDAsIGkzMl91MDEsIGkzMl91MTAsIGkzMl91MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl92MDAsIGkzMl92MDEsIGkzMl92MTAsIGkzMl92MTE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeW4sICpwdThfeXMsICpwdThfdSwgKnB1OF92OwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3lfZGF0YSwgKnB1OF91X2RhdGEsICpwdThfdl9kYXRhOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2Jncm5fZGF0YSwgKnB1OF9iZ3JuOwotICAgIE00VklGSV9VSW50MTYgICB1MTZfcGl4MSwgdTE2X3BpeDIsIHUxNl9waXgzLCB1MTZfcGl4NDsKLQotICAgIC8qIENoZWNrIHBsYW5lcyBoZWlnaHQgYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYoIChwUGxhbmVJbi0+dV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0PDwxKSkgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcGxhbmVzIHdpZHRoIGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfd2lkdGggIT0gcFBsYW5lT3V0WzBdLnVfd2lkdGgpICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfdV9kYXRhICA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArIHBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3ZfZGF0YSAgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF9iZ3JuX2RhdGEgICA9IHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCAgID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCAgPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGVhY2ggb3V0cHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZID0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1kgPSB1MzJfc3RyaWRlX1kgPDwgMTsKLSAgICB1MzJfc3RyaWRlX1UgPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WID0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBpbnB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfYmdyID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMmJnciA9IHUzMl9zdHJpZGVfYmdyIDw8IDE7Ci0KLSAgICAvKiBMb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIFR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIEN1cnJlbnQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3luID0gcHU4X3lfZGF0YTsKLSAgICAgICAgLyogTmV4dCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeXMgPSBwdThfeW4gKyB1MzJfc3RyaWRlX1k7Ci0gICAgICAgIC8qIEN1cnJlbnQgVSBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdSA9IHB1OF91X2RhdGE7Ci0gICAgICAgIC8qIEN1cnJlbnQgViBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdiA9IHB1OF92X2RhdGE7Ci0KLSAgICAgICAgcHU4X2Jncm4gPSBwdThfYmdybl9kYXRhOwotCi0gICAgICAgIC8qIExvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXQgZm91ciBCR1IgNTY1IHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICB1MTZfcGl4MSA9ICooIChNNFZJRklfVUludDE2ICopIHB1OF9iZ3JuKTsKLSAgICAgICAgICAgIHUxNl9waXgyID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9iZ3JuICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICB1MTZfcGl4MyA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfYmdybiArIHUzMl9zdHJpZGVfYmdyKSk7Ci0gICAgICAgICAgICB1MTZfcGl4NCA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfYmdybiArIHUzMl9zdHJpZGVfYmdyICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICAvKiBVbnBhY2sgUkdCNTY1IHRvIDhiaXQgUiwgRywgQiAqLwotICAgICAgICAgICAgLyogKHgseSkgKi8KLSAgICAgICAgICAgIEdFVF9CR1I1NjUoaTMyX2IwMCwgaTMyX2cwMCwgaTMyX3IwMCwgdTE2X3BpeDEpOwotICAgICAgICAgICAgLyogKHgrMSx5KSAqLwotICAgICAgICAgICAgR0VUX0JHUjU2NShpMzJfYjEwLCBpMzJfZzEwLCBpMzJfcjEwLCB1MTZfcGl4Mik7Ci0gICAgICAgICAgICAvKiAoeCx5KzEpICovCi0gICAgICAgICAgICBHRVRfQkdSNTY1KGkzMl9iMDEsIGkzMl9nMDEsIGkzMl9yMDEsIHUxNl9waXgzKTsKLSAgICAgICAgICAgIC8qICh4KzEseSsxKSAqLwotICAgICAgICAgICAgR0VUX0JHUjU2NShpMzJfYjExLCBpMzJfZzExLCBpMzJfcjExLCB1MTZfcGl4NCk7Ci0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgQkdSIHZhbHVlIHRvIFlVViAqLwotICAgICAgICAgICAgaTMyX3UwMCA9IFUxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgPSBWMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDAgPSBZMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgPSBVMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwID0gVjE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTEwID0gWTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotCi0gICAgICAgICAgICBpMzJfdTAxID0gVTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSA9IFYxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMSA9IFkxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLQotICAgICAgICAgICAgaTMyX3UxMSA9IFUxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgPSBWMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTEgPSBZMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGx1bWluYW5jZSBkYXRhICovCi0gICAgICAgICAgICBwdThfeW5bMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0gICAgICAgICAgICBwdThfeW5bMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0gICAgICAgICAgICBwdThfeXNbMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGNocm9tYSBkYXRhICovCi0gICAgICAgICAgICAqcHU4X3UgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgLyogUHJlcGFyZSBmb3IgbmV4dCBjb2x1bW4gKi8KLSAgICAgICAgICAgIHB1OF9iZ3JuICs9IChDU1RfUkdCXzE2X1NJWkU8PDEpOwotICAgICAgICAgICAgLyogVXBkYXRlIGN1cnJlbnQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3luICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgbmV4dCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeXMgKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBVIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdSArKzsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBWIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdiArKzsKLSAgICAgICAgfSAvKiBFbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIC8qIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICBwdThfeV9kYXRhICAgICAgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X2Jncm5fZGF0YSAgICs9IHUzMl9zdHJpZGVfMmJncjsKLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9DbGlwLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0NsaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQyOTBiMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0NsaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9DbGlwLmMKLSAqIEBicmllZiAgICBNYW5hZ2VtZW50IG9mIHRoZSBSR0IgQ2xpcHBpbmcgbWF0cml4IGluY2x1c2lvbiBhbmQgRGl2aXNpb24gVGFibGUKLSAqIEBub3RlICAgICAtIyBDbGlwcGluZyBNYXRyaXggaXMgdXNlZCBpbiBvcmRlciB0byBwcm9wZXJseSBtYW5hZ2UgdGhlIGluY2x1c2lvbiBvZgotICogICAgICAgICAgIHRoZSBleHRlcm5hbCBSR0IgQ2xpcHBpbmcgbWF0cml4IHVzZWQgZm9yIGNvbG9yIGNvbnZlcnNpb24uCi0gKiAgICAgICAgICAgVGhpcyBmaWxlIEhBUyBUTyBCRSBjb21waWxlZCB3aXRoIGFsbCBjb2xvciBjb252ZXJzaW9uIGZpbHRlcnMgcHJvamVjdAotICogICAgICAgICAgIC0jIERpdmlzaW9uIHRhYmxlIGlzIHVzZWQgaW4gUkdCIHRvIEhMUyBjb2xvciBjb252ZXJzaW9uCi0gKiAgICAgICAgICAgSW1wb3J0YW50OiBUaGlzIGZpbGUgbXVzdCBiZSBjb21waWxlZCBkdXJpbmcgdGhlIGFzc2VtYmx5IGxpYnJhcnkgYnVpbGRpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLUNOU1QgTTRWSUZJX1VJbnQ4ICAgTTRWSUZJX0NsaXBUYWJsZVsxMjU2XQotPSB7Ci0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsCi0weDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLAotMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywKLTB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsCi0weDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLCAweDIxLCAweDIyLCAweDIzLAotMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwKLTB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsCi0weDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNhLCAweDNiLAotMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywKLTB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsCi0weDRjLCAweDRkLCAweDRlLCAweDRmLCAweDUwLCAweDUxLCAweDUyLCAweDUzLAotMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwKLTB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsCi0weDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDZiLAotMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywKLTB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsIDB4N2IsCi0weDdjLCAweDdkLCAweDdlLCAweDdmLCAweDgwLCAweDgxLCAweDgyLCAweDgzLAotMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwKLTB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIDB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsCi0weDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweDliLAotMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywKLTB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YWIsCi0weGFjLCAweGFkLCAweGFlLCAweGFmLCAweGIwLCAweGIxLCAweGIyLCAweGIzLAotMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwKLTB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsCi0weGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGNiLAotMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywKLTB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsCi0weGRjLCAweGRkLCAweGRlLCAweGRmLCAweGUwLCAweGUxLCAweGUyLCAweGUzLAotMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwKLTB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsCi0weGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZiLAotMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCi19OwotCi0vKiBEaXZpc2lvbiB0YWJsZSBmb3IgKCA2NTUzNS94ICk7IHggPSAwIHRvIDUxMiAqLwotQ05TVCBNNFZJRklfVUludDE2ICBNNFZJRklfRGl2VGFibGVbNTEyXQotPSB7Ci0wLCA2NTUzNSwgMzI3NjgsIDIxODQ1LCAxNjM4NCwgMTMxMDcsIDEwOTIyLCA5MzYyLAotODE5MiwgNzI4MSwgNjU1MywgNTk1NywgNTQ2MSwgNTA0MSwgNDY4MSwgNDM2OSwKLTQwOTYsIDM4NTUsIDM2NDAsIDM0NDksIDMyNzYsIDMxMjAsIDI5NzgsIDI4NDksCi0yNzMwLCAyNjIxLCAyNTIwLCAyNDI3LCAyMzQwLCAyMjU5LCAyMTg0LCAyMTE0LAotMjA0OCwgMTk4NSwgMTkyNywgMTg3MiwgMTgyMCwgMTc3MSwgMTcyNCwgMTY4MCwKLTE2MzgsIDE1OTgsIDE1NjAsIDE1MjQsIDE0ODksIDE0NTYsIDE0MjQsIDEzOTQsCi0xMzY1LCAxMzM3LCAxMzEwLCAxMjg1LCAxMjYwLCAxMjM2LCAxMjEzLCAxMTkxLAotMTE3MCwgMTE0OSwgMTEyOSwgMTExMCwgMTA5MiwgMTA3NCwgMTA1NywgMTA0MCwKLTEwMjQsIDEwMDgsIDk5MiwgOTc4LCA5NjMsIDk0OSwgOTM2LCA5MjMsCi05MTAsIDg5NywgODg1LCA4NzMsIDg2MiwgODUxLCA4NDAsIDgyOSwKLTgxOSwgODA5LCA3OTksIDc4OSwgNzgwLCA3NzEsIDc2MiwgNzUzLAotNzQ0LCA3MzYsIDcyOCwgNzIwLCA3MTIsIDcwNCwgNjk3LCA2ODksCi02ODIsIDY3NSwgNjY4LCA2NjEsIDY1NSwgNjQ4LCA2NDIsIDYzNiwKLTYzMCwgNjI0LCA2MTgsIDYxMiwgNjA2LCA2MDEsIDU5NSwgNTkwLAotNTg1LCA1NzksIDU3NCwgNTY5LCA1NjQsIDU2MCwgNTU1LCA1NTAsCi01NDYsIDU0MSwgNTM3LCA1MzIsIDUyOCwgNTI0LCA1MjAsIDUxNiwKLTUxMiwgNTA4LCA1MDQsIDUwMCwgNDk2LCA0OTIsIDQ4OSwgNDg1LAotNDgxLCA0NzgsIDQ3NCwgNDcxLCA0NjgsIDQ2NCwgNDYxLCA0NTgsCi00NTUsIDQ1MSwgNDQ4LCA0NDUsIDQ0MiwgNDM5LCA0MzYsIDQzNCwKLTQzMSwgNDI4LCA0MjUsIDQyMiwgNDIwLCA0MTcsIDQxNCwgNDEyLAotNDA5LCA0MDcsIDQwNCwgNDAyLCAzOTksIDM5NywgMzk0LCAzOTIsCi0zOTAsIDM4NywgMzg1LCAzODMsIDM4MSwgMzc4LCAzNzYsIDM3NCwKLTM3MiwgMzcwLCAzNjgsIDM2NiwgMzY0LCAzNjIsIDM2MCwgMzU4LAotMzU2LCAzNTQsIDM1MiwgMzUwLCAzNDgsIDM0NiwgMzQ0LCAzNDMsCi0zNDEsIDMzOSwgMzM3LCAzMzYsIDMzNCwgMzMyLCAzMzAsIDMyOSwKLTMyNywgMzI2LCAzMjQsIDMyMiwgMzIxLCAzMTksIDMxOCwgMzE2LAotMzE1LCAzMTMsIDMxMiwgMzEwLCAzMDksIDMwNywgMzA2LCAzMDQsCi0zMDMsIDMwMiwgMzAwLCAyOTksIDI5NywgMjk2LCAyOTUsIDI5MywKLTI5MiwgMjkxLCAyODksIDI4OCwgMjg3LCAyODYsIDI4NCwgMjgzLAotMjgyLCAyODEsIDI4MCwgMjc4LCAyNzcsIDI3NiwgMjc1LCAyNzQsCi0yNzMsIDI3MSwgMjcwLCAyNjksIDI2OCwgMjY3LCAyNjYsIDI2NSwKLTI2NCwgMjYzLCAyNjIsIDI2MSwgMjYwLCAyNTksIDI1OCwgMjU3LAotMjU2LCAyNTUsIDI1NCwgMjUzLCAyNTIsIDI1MSwgMjUwLCAyNDksCi0yNDgsIDI0NywgMjQ2LCAyNDUsIDI0NCwgMjQzLCAyNDIsIDI0MSwKLTI0MCwgMjQwLCAyMzksIDIzOCwgMjM3LCAyMzYsIDIzNSwgMjM0LAotMjM0LCAyMzMsIDIzMiwgMjMxLCAyMzAsIDIyOSwgMjI5LCAyMjgsCi0yMjcsIDIyNiwgMjI1LCAyMjUsIDIyNCwgMjIzLCAyMjIsIDIyMiwKLTIyMSwgMjIwLCAyMTksIDIxOSwgMjE4LCAyMTcsIDIxNywgMjE2LAotMjE1LCAyMTQsIDIxNCwgMjEzLCAyMTIsIDIxMiwgMjExLCAyMTAsCi0yMTAsIDIwOSwgMjA4LCAyMDgsIDIwNywgMjA2LCAyMDYsIDIwNSwKLTIwNCwgMjA0LCAyMDMsIDIwMiwgMjAyLCAyMDEsIDIwMSwgMjAwLAotMTk5LCAxOTksIDE5OCwgMTk3LCAxOTcsIDE5NiwgMTk2LCAxOTUsCi0xOTUsIDE5NCwgMTkzLCAxOTMsIDE5MiwgMTkyLCAxOTEsIDE5MSwKLTE5MCwgMTg5LCAxODksIDE4OCwgMTg4LCAxODcsIDE4NywgMTg2LAotMTg2LCAxODUsIDE4NSwgMTg0LCAxODQsIDE4MywgMTgzLCAxODIsCi0xODIsIDE4MSwgMTgxLCAxODAsIDE4MCwgMTc5LCAxNzksIDE3OCwKLTE3OCwgMTc3LCAxNzcsIDE3NiwgMTc2LCAxNzUsIDE3NSwgMTc0LAotMTc0LCAxNzMsIDE3MywgMTcyLCAxNzIsIDE3MiwgMTcxLCAxNzEsCi0xNzAsIDE3MCwgMTY5LCAxNjksIDE2OCwgMTY4LCAxNjgsIDE2NywKLTE2NywgMTY2LCAxNjYsIDE2NSwgMTY1LCAxNjUsIDE2NCwgMTY0LAotMTYzLCAxNjMsIDE2MywgMTYyLCAxNjIsIDE2MSwgMTYxLCAxNjEsCi0xNjAsIDE2MCwgMTU5LCAxNTksIDE1OSwgMTU4LCAxNTgsIDE1NywKLTE1NywgMTU3LCAxNTYsIDE1NiwgMTU2LCAxNTUsIDE1NSwgMTU0LAotMTU0LCAxNTQsIDE1MywgMTUzLCAxNTMsIDE1MiwgMTUyLCAxNTIsCi0xNTEsIDE1MSwgMTUxLCAxNTAsIDE1MCwgMTQ5LCAxNDksIDE0OSwKLTE0OCwgMTQ4LCAxNDgsIDE0NywgMTQ3LCAxNDcsIDE0NiwgMTQ2LAotMTQ2LCAxNDUsIDE0NSwgMTQ1LCAxNDQsIDE0NCwgMTQ0LCAxNDQsCi0xNDMsIDE0MywgMTQzLCAxNDIsIDE0MiwgMTQyLCAxNDEsIDE0MSwKLTE0MSwgMTQwLCAxNDAsIDE0MCwgMTQwLCAxMzksIDEzOSwgMTM5LAotMTM4LCAxMzgsIDEzOCwgMTM3LCAxMzcsIDEzNywgMTM3LCAxMzYsCi0xMzYsIDEzNiwgMTM1LCAxMzUsIDEzNSwgMTM1LCAxMzQsIDEzNCwKLTEzNCwgMTM0LCAxMzMsIDEzMywgMTMzLCAxMzIsIDEzMiwgMTMyLAotMTMyLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMCwgMTMwLCAxMzAsCi0xMzAsIDEyOSwgMTI5LCAxMjksIDEyOSwgMTI4LCAxMjgsIDEyOAotfTsKLQotQ05TVCBNNFZJRklfSW50MzIgIGNvbnN0X3N0b3JhZ2UxWzhdCi09IHsKLTB4MDAwMDI1NjgsIDB4MDAwMDMzNDMsMHgwMDAwMDY0OSwweDAwMDAwZDBmLCAweDAwMDBEODZDLCAweDAwMDBEODNCLCAweDAwMDEwMDAwLCAweDAwMDEwMDAwCi19OwotCi1DTlNUIE00VklGSV9JbnQzMiAgY29uc3Rfc3RvcmFnZVs4XQotPSB7Ci0weDAwMDAyNTY4LCAweDAwMDAzMzQzLCAweDFCRjgwMCwgMHgwMDAwMDY0OSwgMHgwMDAwMGQwZiwgMHgxMTAxODAsIDB4NDBjZiwgMHgyMkJFMDAKLX07Ci0KLQotQ05TVCBNNFZJRklfVUludDE2ICAqTTRWSUZJX0RpdlRhYmxlX3plcm8KLSA9ICZNNFZJRklfRGl2VGFibGVbMF07Ci0KLUNOU1QgTTRWSUZJX1VJbnQ4ICAgKk00VklGSV9DbGlwVGFibGVfemVybwotID0gJk00VklGSV9DbGlwVGFibGVbNTAwXTsKLQotCi0vKiBFbmQgb2YgZmlsZSBNNFZJRklfQ2xpcC5jICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCNTY1dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCNTY1dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzRjYmQ1Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1JHQjU2NXRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIENvbG9yIENvbnZlcnNpb24gRmlsdGVyCi0gKiAgICAgICAgICAgQ29udGFpbnMgdGhlIGZvcm1hdCBjb252ZXJzaW9uIGZpbHRlcnMgZnJvbSBSR0I1NjUgdG8gWVVWNDIwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucywgYW5kIHR5cGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRmlsdGVyc0FQSS5oIgotLyogTWFjcm8gZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRGVmaW5lcy5oIgotLyogQ2xpcCB0YWJsZSBkZWNsYXJhdGlvbiAqLwotI2luY2x1ZGUgICAgIk00VklGSV9DbGlwLmgiCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICB0cmFuc2Zvcm0gUkdCNTY1IGltYWdlIHRvIGEgWVVWNDIwIGltYWdlLgotICogQG5vdGUgICAgQ29udmVydCBSR0I1NjUgdG8gWVVWNDIwLAotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gKiAgICAgICAgICAgICAgICAgIEdldCA0IFJHQiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gKiAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gUkdCNTY1IFBsYW5lCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gIFlVVjQyMCBidWZmZXIgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1Y7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0gICAgTTRWSUZJX1VJbnQxNiAgIHUxNl9waXgxLCB1MTZfcGl4MiwgdTE2X3BpeDMsIHUxNl9waXg0OwotCi0gICAgLyogQ2hlY2sgcGxhbmVzIGhlaWdodCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiAoKHBQbGFuZUluLT51X2hlaWdodCAhPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMV0udV9oZWlnaHQ8PDEpKSAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsyXS51X2hlaWdodDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgd2lkdGggYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYgKChwUGxhbmVJbi0+dV93aWR0aCAhPSBwUGxhbmVPdXRbMF0udV93aWR0aCkgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsxXS51X3dpZHRoPDwxKSkgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMl0udV93aWR0aDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3lfZGF0YSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3VfZGF0YSA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArIHBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3ZfZGF0YSA9IHBQbGFuZU91dFsyXS5wYWNfZGF0YSArIHBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3JnYm5fZGF0YSAgID0gcFBsYW5lSW4tPnBhY19kYXRhICsgcFBsYW5lSW4tPnVfdG9wbGVmdDsKLQotICAgIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgdTMyX3dpZHRoID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCA9IHBQbGFuZU91dFswXS51X2hlaWdodDsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gZWFjaCBvdXRwdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kgPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZTJfWSA9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YgPSBwUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGlucHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9yZ2IgPSBwUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV8ycmdiID0gdTMyX3N0cmlkZV9yZ2IgPDwgMTsKLQotCi0gICAgLyogTG9vcCBvbiBlYWNoIHJvdyBvZiB0aGUgb3V0cHV0IGltYWdlLCBpbnB1dCBjb29yZGluYXRlcyBhcmUgZXN0aW1hdGVkIGZyb20gb3V0cHV0IG9uZXMgKi8KLSAgICAvKiBUd28gWVVWIHJvd3MgYXJlIGNvbXB1dGVkIGF0IGVhY2ggcGFzcyAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHQgO3UzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPTIpCi0gICAgewotICAgICAgICAvKiBDdXJyZW50IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biA9IHB1OF95X2RhdGE7Ci0gICAgICAgIC8qIE5leHQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3lzID0gcHU4X3luICsgdTMyX3N0cmlkZV9ZOwotICAgICAgICAvKiBDdXJyZW50IFUgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3UgPSBwdThfdV9kYXRhOwotICAgICAgICAvKiBDdXJyZW50IFYgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3YgPSBwdThfdl9kYXRhOwotCi0gICAgICAgIHB1OF9yZ2JuID0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBMb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoOyB1MzJfY29sICE9IDAgOyB1MzJfY29sIC09MikKLSAgICAgICAgewotICAgICAgICAgICAgLyogR2V0IGZvdXIgUkdCIDU2NSBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgdTE2X3BpeDEgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSBwdThfcmdibik7Ci0gICAgICAgICAgICB1MTZfcGl4MiA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIENTVF9SR0JfMTZfU0laRSkpOwotICAgICAgICAgICAgdTE2X3BpeDMgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYikpOwotICAgICAgICAgICAgdTE2X3BpeDQgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYiArIENTVF9SR0JfMTZfU0laRSkpOwotCi0gICAgICAgICAgICAvKiBVbnBhY2sgUkdCNTY1IHRvIDhiaXQgUiwgRywgQiAqLwotICAgICAgICAgICAgLyogKHgseSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX3IwMCxpMzJfZzAwLGkzMl9iMDAsdTE2X3BpeDEpOwotICAgICAgICAgICAgLyogKHgrMSx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfcjEwLGkzMl9nMTAsaTMyX2IxMCx1MTZfcGl4Mik7Ci0gICAgICAgICAgICAvKiAoeCx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9yMDEsaTMyX2cwMSxpMzJfYjAxLHUxNl9waXgzKTsKLSAgICAgICAgICAgIC8qICh4KzEseSsxKSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfcjExLGkzMl9nMTEsaTMyX2IxMSx1MTZfcGl4NCk7Ci0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgUkdCIHZhbHVlIHRvIFlVViAqLwotICAgICAgICAgICAgaTMyX3UwMCA9IFUxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgPSBWMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDAgPSBZMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgPSBVMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwID0gVjE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTEwID0gWTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotCi0gICAgICAgICAgICBpMzJfdTAxID0gVTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSA9IFYxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMSA9IFkxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLQotICAgICAgICAgICAgaTMyX3UxMSA9IFUxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgPSBWMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTEgPSBZMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGx1bWluYW5jZSBkYXRhICovCi0gICAgICAgICAgICBwdThfeW5bMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0gICAgICAgICAgICBwdThfeW5bMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0gICAgICAgICAgICBwdThfeXNbMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGNocm9tYSBkYXRhICovCi0gICAgICAgICAgICAqcHU4X3UgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgLyogUHJlcGFyZSBmb3IgbmV4dCBjb2x1bW4gKi8KLSAgICAgICAgICAgIHB1OF9yZ2JuICs9IChDU1RfUkdCXzE2X1NJWkU8PDEpOwotICAgICAgICAgICAgLyogVXBkYXRlIGN1cnJlbnQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3luICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgbmV4dCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeXMgKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBVIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdSArKzsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBWIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdiArKzsKLSAgICAgICAgfSAvKiBFbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIC8qIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICBwdThfeV9kYXRhICs9IHUzMl9zdHJpZGUyX1k7Ci0gICAgICAgIHB1OF91X2RhdGEgKz0gdTMyX3N0cmlkZV9VOwotICAgICAgICBwdThfdl9kYXRhICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSArPSB1MzJfc3RyaWRlXzJyZ2I7Ci0KLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCODg4dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCODg4dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg1YTJhNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1JHQjg4OHRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLQotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Qcm90bzoKLU00VklGSV9VSW50OCAgICBNNFZJRklfUkdCODg4dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSk7Ci1QdXJwb3NlOiAgICBmaWxsaW5nIG9mIHRoZSBZVVY0MjAgcGxhbmUgZnJvbSBhIEJHUjI0IHBsYW5lCi1BYnN0cmFjdDogICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICAgICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gICAgICAgICAgICAgICAgICAgIEdldCA0IEJHUiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzIGFuZAotICAgICAgICAgICAgICAgICAgICBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gICAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gICAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLQotSW46ICAgICAgICAgICAgUkdCMjQgcGxhbmUKLUluT3V0OiAgICAgICAgbm9uZQotT3V0OiAgICAgICAgYXJyYXkgb2YgMyBNNFZJRklfSW1hZ2VQbGFuZSBzdHJ1Y3R1cmVzCi1Nb2RpZmllZDogICAgTUw6IFJHQiBmdW5jdGlvbiBtb2RpZmllZCB0byBCR1IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNFZJRklfVUludDggTTRWSUZJX1JHQjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSkKLXsKLSAgICBNNFZJRklfVUludDMyICAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1YsIHUzMl9zdHJpZGVfcmdiLFwKLSAgICAgICAgICAgICAgICAgICAgIHUzMl9zdHJpZGVfMnJnYjsKLSAgICBNNFZJRklfVUludDMyICAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0KLSAgICAvKiBjaGVjayBzaXplcyAqLwotICAgIGlmKCAoUGxhbmVJbi0+dV9oZWlnaHQgIT0gUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpICAgIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X2hlaWdodCAhPSAoUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLQotICAgIGlmKCAoUGxhbmVJbi0+dV93aWR0aCAhPSBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKFBsYW5lT3V0WzFdLnVfd2lkdGg8PDEpKSAgICB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV93aWR0aCAhPSAoUGxhbmVPdXRbMl0udV93aWR0aDw8MSkpKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0KLQotICAgIC8qIHNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3lfZGF0YSAgICA9IFBsYW5lT3V0WzBdLnBhY19kYXRhICsgUGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgIHB1OF91X2RhdGEgICAgPSBQbGFuZU91dFsxXS5wYWNfZGF0YSArIFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhICAgID0gUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBpZGVtIGZvciBpbnB1dCBidWZmZXIgKi8KLSAgICBwdThfcmdibl9kYXRhICAgID0gUGxhbmVJbi0+cGFjX2RhdGEgKyBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCAgICA9IFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCAgICA9IFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogc2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1k9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogaWRlbSBmb3IgaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMnJnYiA9IHUzMl9zdHJpZGVfcmdiIDw8IDE7Ci0KLSAgICAvKiBsb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIHR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICAgICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIHVwZGF0ZSB3b3JraW5nIHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biAgICA9IHB1OF95X2RhdGE7Ci0gICAgICAgIHB1OF95cyAgICA9IHB1OF95biArIHUzMl9zdHJpZGVfWTsKLQotICAgICAgICBwdThfdSAgICA9IHB1OF91X2RhdGE7Ci0gICAgICAgIHB1OF92ICAgID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfcmdibj0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBsb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UqLwotICAgICAgICBmb3IgICAgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBnZXQgUkdCIHNhbXBsZXMgb2YgNCBwaXhlbHMgKi8KLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwLCBwdThfcmdibiwgMCk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCwgcHU4X3JnYm4sIENTVF9SR0JfMjRfU0laRSk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSwgcHU4X3JnYm4sIHUzMl9zdHJpZGVfcmdiKTsKLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExLCBwdThfcmdibiwgdTMyX3N0cmlkZV9yZ2IgKyBDU1RfUkdCXzI0X1NJWkUpOwotCi0gICAgICAgICAgICBpMzJfdTAwICAgID0gVTI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3YwMCAgICA9IFYyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl95MDAgICAgPSBZMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7ICAgICAgICAvKiBtYXRyaXggbHVtaW5hbmNlICovCi0gICAgICAgICAgICBwdThfeW5bMF09IChNNFZJRklfVUludDgpaTMyX3kwMDsKLQotICAgICAgICAgICAgaTMyX3UxMCAgICA9IFUyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl92MTAgICAgPSBWMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfeTEwICAgID0gWTI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgcHU4X3luWzFdPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0KLSAgICAgICAgICAgIGkzMl91MDEgICAgPSBVMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfdjAxICAgID0gVjI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3kwMSAgICA9IFkyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIHB1OF95c1swXT0gKE00VklGSV9VSW50OClpMzJfeTAxOwotCi0gICAgICAgICAgICBpMzJfdTExICAgID0gVTI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3YxMSAgICA9IFYyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl95MTEgICAgPSBZMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0KLSAgICAgICAgICAgICpwdThfdSAgICA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAqcHU4X3YgICAgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3YwMCArIGkzMl92MDEgKyBpMzJfdjEwICsgaTMyX3YxMSArIDIpID4+IDIpOwotCi0gICAgICAgICAgICBwdThfcmdibiAgICArPSAgKENTVF9SR0JfMjRfU0laRTw8MSk7Ci0gICAgICAgICAgICBwdThfeW4gICAgICAgICs9IDI7Ci0gICAgICAgICAgICBwdThfeXMgICAgICAgICs9IDI7Ci0KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogZW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICBwdThfeV9kYXRhICAgICAgICArPSB1MzJfc3RyaWRlMl9ZOwotICAgICAgICBwdThfdV9kYXRhICAgICAgICArPSB1MzJfc3RyaWRlX1U7Ci0gICAgICAgIHB1OF92X2RhdGEgICAgICAgICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSAgICArPSB1MzJfc3RyaWRlXzJyZ2I7Ci0KLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I1NjV0b1JHQjU2NS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I1NjV0b1JHQjU2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTdlNGVkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCNTY1dG9SR0I1NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMKLSAqIEBicmllZiAgICBDb250YWluIHZpZGVvIGxpYnJhcnkgZnVuY3Rpb24KLSAqIEBub3RlICAgICBUaGlzIGZpbGUgaGFzIGEgUmVzaXplIGZpbHRlciBmdW5jdGlvbgotICogICAgICAgICAgIEdlbmVyaWMgcmVzaXppbmcgb2YgUkdCNTY1IChQbGFuYXIpIGltYWdlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIFJlc2l6ZXMgUkdCNTY1IFBsYW5hciBwbGFuZS4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gUkdCNTY1IChQbGFuYXIpIHBsYW5lIGJ1ZmZlcgotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvIFJHQjU2NSAoUGxhbmFyKSBwbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBFcnJvciBpbiBoZWlnaHQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgRXJyb3IgaW4gd2lkdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X2RhdGFfaW47Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X2RhdGFfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGhfaW4sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW4sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luLCB1MzJfc3RyaWRlX291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfaW5jLCB1MzJfeV9pbmM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2FjY3VtLCB1MzJfeV9hY2N1bSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3lfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX1J0ZW1wX3ZhbHVlLHUzMl9HdGVtcF92YWx1ZSx1MzJfQnRlbXBfdmFsdWU7Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X3NyY190b3A7Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X3NyY19ib3R0b207Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDAsIGkzMl9nMDAsIGkzMl9yMDA7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDEsIGkzMl9nMDEsIGkzMl9yMDE7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDIsIGkzMl9nMDIsIGkzMl9yMDI7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDMsIGkzMl9nMDMsIGkzMl9yMDM7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgIGNvdW50X3RyYW5zPTA7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIFJHQiB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgaWYgKChJU19FVkVOKHBQbGFuZUluLT51X2hlaWdodCkgPT0gRkFMU0UpIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dC0+dV9oZWlnaHQpID09IEZBTFNFKSkgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIGlmICgoSVNfRVZFTihwUGxhbmVJbi0+dV93aWR0aCkgPT0gRkFMU0UpIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dC0+dV93aWR0aCkgPT0gRkFMU0UpKSB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICBwdTE2X2RhdGFfaW4gICAgPSAoTTRWSUZJX1VJbnQxNiopKHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQpOwotICAgIHB1MTZfZGF0YV9vdXQgICA9IChNNFZJRklfVUludDE2KikocFBsYW5lT3V0LT5wYWNfZGF0YSArIHBQbGFuZU91dC0+dV90b3BsZWZ0KTsKLQotICAgIC8qIEdldCB0aGUgbWVtb3J5IGp1bXAgY29ycmVzcG9uZGluZyB0byBhIHJvdyBqdW1wICovCi0gICAgdTMyX3N0cmlkZV9pbiAgID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfb3V0ICA9IHBQbGFuZU91dC0+dV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgdTMyX3dpZHRoX2luICAgID0gcFBsYW5lSW4tPnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodF9pbiAgID0gcFBsYW5lSW4tPnVfaGVpZ2h0OwotCi0gICAgdTMyX3dpZHRoX291dCAgID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgIHUzMl9oZWlnaHRfb3V0ICA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0KLSAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKSB7Ci0gICAgICAgIHUzMl94X2luYyAgID0gKCh1MzJfd2lkdGhfaW4tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aF9vdXQtMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdTMyX3hfaW5jICAgPSAodTMyX3dpZHRoX2luICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQuKi8KLSAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikgewotICAgICAgICB1MzJfeV9pbmMgICA9ICgodTMyX2hlaWdodF9pbiAtIDEpICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0X291dC0xKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1MzJfeV9pbmMgPSAodTMyX2hlaWdodF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgIH0KLQotICAgIC8qCi0gICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeV9hY2N1bV9zdGFydC4KLSAgICB1MzJfeV9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgKi8KLSAgICBpZiAodTMyX3lfaW5jID49IE1BWF9TSE9SVCkgewotICAgICAgICAvKgotICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25hbCBwYXJ0LCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICBvbiB0aGUgMTYgaGlnaCBiaXRzIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICovCi0gICAgICAgIHUzMl95X2FjY3VtID0gdTMyX3lfaW5jICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3lfYWNjdW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX3lfYWNjdW0gPj49IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdTMyX3lfYWNjdW0gPSAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAqLwotICAgIGlmICh1MzJfeF9pbmMgPj0gTUFYX1NIT1JUKSB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3hfYWNjdW1fc3RhcnQpIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSAwOwotICAgIH0KLQotICAgIHUzMl9oZWlnaHQgPSB1MzJfaGVpZ2h0X291dDsKLQotICAgIC8qCi0gICAgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdAotICAgIHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZQotICAgIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOgotICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpCi0gICAgd2l0aCAgUih4KSA9IC8geCsxICAtMSA9PCB4ID08IDAgXCAxLXggIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKXdlaWdodGluZyBjb2VmZmljaWVudAotICAgIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBuZWFyZXN0IG5laWdoYm9yIGluIHRoZSBwIChyZXNwLiBxKSBkaXJlY3Rpb24KLSAgICAqLwotCi0gICAgZG8geyAvKiBTY2FuIGFsbCB0aGUgcm93ICovCi0KLSAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtPj4xMikmMTU7Ci0KLSAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgIHUzMl94X2FjY3VtID0gdTMyX3hfYWNjdW1fc3RhcnQ7Ci0KLSAgICAgICAgdTMyX3dpZHRoID0gdTMyX3dpZHRoX291dDsKLQotICAgICAgICBkbyB7IC8qIFNjYW4gYWxvbmcgZWFjaCByb3cgKi8KLSAgICAgICAgICAgIHB1MTZfc3JjX3RvcCA9IHB1MTZfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNik7Ci0gICAgICAgICAgICBwdTE2X3NyY19ib3R0b20gPSBwdTE2X3NyY190b3AgKyAodTMyX3N0cmlkZV9pbj4+MSk7Ci0gICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBpZiAoKHUzMl9oZWlnaHQgPT0gMSkgJiYgKHUzMl9oZWlnaHRfaW4gPT0gdTMyX2hlaWdodF9vdXQpKSB7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCwoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMF0pOwotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfdG9wWzFdKTsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLChNNFZJRklfVUludDE2KXB1MTZfc3JjX3RvcFswXSk7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAzLGkzMl9nMDMsaTMyX3IwMywoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLChNNFZJRklfVUludDE2KXB1MTZfc3JjX3RvcFswXSk7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSwoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMV0pOwotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfYm90dG9tWzBdKTsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLChNNFZJRklfVUludDE2KXB1MTZfc3JjX2JvdHRvbVsxXSk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU29sdXRpb24gdG8gYXZvaWQgZ3JlZW4gZWZmZWN0cyBkdWUgdG8gdHJhbnNwYXJlbmN5ICovCi0gICAgICAgICAgICBjb3VudF90cmFucyA9IDA7Ci0KLSAgICAgICAgICAgIC8qIElmIFJHQiBpcyB0cmFuc3BhcmVudCBjb2xvciAoMCwgNjMsIDApLCB3ZSB0cmFuc2Zvcm0gaXQgdG8gd2hpdGUgKDMxLDYzLDMxKSAqLwotICAgICAgICAgICAgaWYgKGkzMl9iMDAgPT0gMCAmJiBpMzJfZzAwID09IDYzICYmIGkzMl9yMDAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAwID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMCA9IDMxOwotICAgICAgICAgICAgICAgIGNvdW50X3RyYW5zKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaTMyX2IwMSA9PSAwICYmIGkzMl9nMDEgPT0gNjMgJiYgaTMyX3IwMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAxID0gMzE7Ci0gICAgICAgICAgICAgICAgY291bnRfdHJhbnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpMzJfYjAyID09IDAgJiYgaTMyX2cwMiA9PSA2MyAmJiBpMzJfcjAyID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMiA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDIgPSAzMTsKLSAgICAgICAgICAgICAgICBjb3VudF90cmFucysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkzMl9iMDMgPT0gMCAmJiBpMzJfZzAzID09IDYzICYmIGkzMl9yMDMgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAzID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMyA9IDMxOwotICAgICAgICAgICAgICAgIGNvdW50X3RyYW5zKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb3VudF90cmFucyA+IDIpIHsKLSAgICAgICAgICAgICAgICAvKiBwaXhlbCBpcyB0cmFuc3BhcmVudCAqLwotICAgICAgICAgICAgICAgIHUzMl9SdGVtcF92YWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgdTMyX0d0ZW1wX3ZhbHVlID0gNjM7Ci0gICAgICAgICAgICAgICAgdTMyX0J0ZW1wX3ZhbHVlID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdTMyX1J0ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChpMzJfcjAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfcjAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfcjAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfcjAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICB1MzJfR3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKGkzMl9nMDAqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9nMDEqdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMl9nMDIqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9nMDMqdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgIHUzMl9CdGVtcF92YWx1ZSA9ICAoTTRWSUZJX1VJbnQ4KSgoKGkzMl9iMDAqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9iMDEqdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMl9iMDIqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9iMDMqdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKnB1MTZfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDE2KSggKCgodTMyX0d0ZW1wX3ZhbHVlICYgMHgzOCkgPj4gMykgfCAodTMyX0J0ZW1wX3ZhbHVlIDw8IDMpKSB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgoKHUzMl9HdGVtcF92YWx1ZSAmIDB4NykgPDwgNSApIHwgdTMyX1J0ZW1wX3ZhbHVlKTw8OCApKTsKLQotICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl94X2luYzsKLQotICAgICAgICB9IHdoaWxlKC0tdTMyX3dpZHRoKTsKLQotCi0gICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICB1MzJfeV9hY2N1bSArPSB1MzJfeV9pbmM7Ci0gICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpIHsKLSAgICAgICAgICAgIHB1MTZfZGF0YV9pbiA9IHB1MTZfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbj4+MSk7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLQotICAgIH0gd2hpbGUoLS11MzJfaGVpZ2h0KTsKLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGViOWQ0NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVJHQjg4OHRvUkdCODg4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfUmVzaXplWVVWNDIwdG9ZVVY0MjAuYwotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIFRoaXMgZmlsZSBoYXMgYSBSZXNpemUgZmlsdGVyIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgLSMgR2VuZXJpYyByZXNpemluZyBvZiBZVVY0MjAgKFBsYW5hcikgaW1hZ2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIFJlc2l6ZXMgWVVWNDIwIFBsYW5hciBwbGFuZS4KLSAqIEBub3RlICAgIEJhc2ljIHN0cnVjdHVyZSBvZiB0aGUgZnVuY3Rpb24KLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKHN0ZXAgMikKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uIChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgICAgIEdldCBmb3VyIFkgc2FtcGxlcyBhbmQgMSBVICYgViBzYW1wbGUKLSAqICAgICAgICAgICAgICAgICAgUmVzaXplIHRoZSBZIHdpdGggY29ycmVzcG9uaW5nIFUgYW5kIFYgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBQbGFjZSB0aGUgWVVWIGluIHRoZSBvdXB1dCBwbGFuZQotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93Ci0gKiAgICAgICAgICBGb3IgcmVzaXppbmcgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcKLSAqICAgICAgICAgIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG93biBlYWNoIGNvbHVtbi4KLSAqICAgICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZAotICogICAgICAgICAgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3Vycy4gVGhlIHJhdGlvIG9mIGNvbXByZXNzaW9uCi0gKiAgICAgICAgICBvciBkaWxhdGF0aW9uIGlzIGVzdGltYXRlZCB1c2luZyBpbnB1dCBhbmQgb3V0cHV0IHNpemVzLgotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pIFVzZXIgRGF0YQotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVY0MjAgKFBsYW5hcikgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gWVVWNDIwIChQbGFuYXIpIHBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IEVycm9yIGluIGhlaWdodAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBFcnJvciBpbiB3aWR0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9kYXRhX2luOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGhfaW4sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW4sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luLCB1MzJfc3RyaWRlX291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfaW5jLCB1MzJfeV9pbmM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2FjY3VtLCB1MzJfeV9hY2N1bSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3lfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX1J0ZW1wX3ZhbHVlLHUzMl9HdGVtcF92YWx1ZSx1MzJfQnRlbXBfdmFsdWU7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX3RvcDsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9zcmNfYm90dG9tOwotICAgIE00VklGSV9VSW50MzIgICAgaTMyX2IwMCwgaTMyX2cwMCwgaTMyX3IwMDsKLSAgICBNNFZJRklfVUludDMyICAgIGkzMl9iMDEsIGkzMl9nMDEsIGkzMl9yMDE7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICBpMzJfYjAyLCBpMzJfZzAyLCBpMzJfcjAyOwotICAgIE00VklGSV9VSW50MzIgICAgaTMyX2IwMywgaTMyX2cwMywgaTMyX3IwMzsKLQotICAgIC8qIENoZWNrIGZvciB0aGUgWVVWIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGV2ZW4gKi8KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW4tPnVfaGVpZ2h0KSA9PSBGQUxTRSkgICAgfHwKLSAgICAgICAgKElTX0VWRU4ocFBsYW5lT3V0LT51X2hlaWdodCkgPT0gRkFMU0UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW4tPnVfd2lkdGgpID09IEZBTFNFKSB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXQtPnVfd2lkdGgpID09IEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLQotICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICAgICAgcHU4X2RhdGFfaW4gICAgID0gKE00VklGSV9VSW50OCopKHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQpOwotICAgICAgICBwdThfZGF0YV9vdXQgICAgPSAoTTRWSUZJX1VJbnQ4KikocFBsYW5lT3V0LT5wYWNfZGF0YSArIHBQbGFuZU91dC0+dV90b3BsZWZ0KTsKLQotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgICAgICB1MzJfc3RyaWRlX2luICAgPSBwUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgICAgIHUzMl9zdHJpZGVfb3V0ICA9IHBQbGFuZU91dC0+dV9zdHJpZGU7Ci0KLSAgICAgICAgLyogU2V0IHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSBpbWFnZSAqLwotICAgICAgICB1MzJfd2lkdGhfaW4gICAgPSBwUGxhbmVJbi0+dV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9pbiAgID0gcFBsYW5lSW4tPnVfaGVpZ2h0OwotCi0gICAgICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9vdXQgID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLQotICAgICAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgICAgIGlmICh1MzJfd2lkdGhfb3V0ID49IHUzMl93aWR0aF9pbikKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfaW5jICAgPSAoKHUzMl93aWR0aF9pbi0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2luYyAgID0gKHUzMl93aWR0aF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQuKi8KLSAgICAgICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2luYyAgID0gKCh1MzJfaGVpZ2h0X2luIC0gMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfaW5jID0gKHUzMl9oZWlnaHRfaW4gKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHUzMl95X2luYyA+PSBNQVhfU0hPUlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICAgICAgb24gdGhlIDE2IGhpZ2ggYml0cyBhbmQgdGhlIGZyYWN0aW9ubmFsIG9uIHRoZSAxNSBsb3cgYml0cwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gdTMyX3lfaW5jICYgMHhmZmZmOwotCi0gICAgICAgICAgICBpZiAoIXUzMl95X2FjY3VtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1MzJfeV9hY2N1bSA+Pj0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gMDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgICAgICovCi0gICAgICAgIGlmICh1MzJfeF9pbmMgPj0gTUFYX1NIT1JUKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IHUzMl94X2luYyAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgaWYgKCF1MzJfeF9hY2N1bV9zdGFydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB1MzJfaGVpZ2h0ID0gdTMyX2hlaWdodF9vdXQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdAotICAgICAgICByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb253IGVhY2ggY29sdW1uLiBFYWNoIGVzdGltYXRlZCBwaXhlbCBpbiB0aGUKLSAgICAgICAgb3V0cHV0IGltYWdlIGlzIGEgd2VpZ2h0ZWQgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3VycyBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6Ci0gICAgICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpCi0gICAgICAgIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14ICAwID08IHggPTwgMSBhbmQgYSAocmVzcC4gYil3ZWlnaHRpbmcgY29lZmZpY2llbnQKLSAgICAgICAgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIG5lYXJlc3QgbmVpZ2hib3IgaW4gdGhlIHAgKHJlc3AuIHEpIGRpcmVjdGlvbgotICAgICAgICAqLwotCi0gICAgICAgIGRvIHsgLyogU2NhbiBhbGwgdGhlIHJvdyAqLwotCi0gICAgICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtPj4xMikmMTU7Ci0KLSAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSB1MzJfeF9hY2N1bV9zdGFydDsKLQotICAgICAgICAgICAgdTMyX3dpZHRoID0gdTMyX3dpZHRoX291dDsKLQotICAgICAgICAgICAgZG8geyAvKiBTY2FuIGFsb25nIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNikqMzsKLSAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgKHUzMl9zdHJpZGVfaW4pOwotICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgIGlmICgodTMyX3dpZHRoID09IDEpICYmICh1MzJfd2lkdGhfaW4gPT0gdTMyX3dpZHRoX291dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBpbnB1dCBoZWlnaHQgaXMgZXF1YWwgdG8gb3V0cHV0IGhlaWdodCBhbmQgaW5wdXQgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gb3V0cHV0IHdpZHRoLCByZXBsaWNhdGUgdGhlIGNvcm5lciBwaXhlbHMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1MzJfaGVpZ2h0ID09IDEpICYmICh1MzJfaGVpZ2h0X2luID09IHUzMl9oZWlnaHRfb3V0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgIFdoZW4gaW5wdXQgaGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBvdXRwdXQgaGVpZ2h0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCB3aWR0aCBlcXVhbCB0byBvdXRwdXQgd2lkdGgsIHJlcGxpY2F0ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uIGZvciBpbnRlcnBvbGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfYm90dG9tLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfYm90dG9tLDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBpbnB1dCBoZWlnaHQgaXMgZXF1YWwgdG8gb3V0cHV0IGhlaWdodCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgd2lkdGggbm90IGVxdWFsIHRvIG91dHB1dCB3aWR0aCwgcmVwbGljYXRlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICByb3cgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1MzJfaGVpZ2h0ID09IDEpICYmICh1MzJfaGVpZ2h0X2luID09IHUzMl9oZWlnaHRfb3V0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfdG9wLDMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfYm90dG9tLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfYm90dG9tLDMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHUzMl9SdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgoaTMyX3IwMCooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3IwMSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyX3IwMiooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3IwMyp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgdTMyX0d0ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChpMzJfZzAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfZzAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfZzAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfZzAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICB1MzJfQnRlbXBfdmFsdWUgPSAgKE00VklGSV9VSW50OCkoKChpMzJfYjAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfYjAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfYjAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfYjAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSB1MzJfQnRlbXBfdmFsdWUgOwotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IHUzMl9HdGVtcF92YWx1ZSA7Ci0gICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gdTMyX1J0ZW1wX3ZhbHVlIDsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gdTMyX3hfaW5jOwotCi0gICAgICAgICAgICB9IHdoaWxlKC0tdTMyX3dpZHRoKTsKLQotICAgICAgICAgICAgLy9wdTE2X2RhdGFfb3V0ID0gcHUxNl9kYXRhX291dCArICh1MzJfc3RyaWRlX291dD4+MSkgLSAodTMyX3dpZHRoX291dCk7Ci0KLSAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gdTMyX3lfaW5jOwotICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqICh1MzJfc3RyaWRlX2luKSA7Ci0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlKC0tdTMyX2hlaWdodCk7Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVZVVZ0b0JHUjU2NS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVZVVZ0b0JHUjU2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDQyZTgwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9CR1I1NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9SZXNpemVZVVY0MjB0b0JHUjU2NS5jCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgVGhpcyBmaWxlIGhhcyBhIENvbWJvIGZpbHRlciBmdW5jdGlvbgotICogICAgICAgICAgIC0jIFJlc2l6ZXMgWVVWNDIwIGFuZCBjb252ZXJ0cyB0byBSR1I1NjUgd2l0aCByb3RhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSh2b2lkICpwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgUmVzaXplIFlVVjQyMCBwbGFuZSBhbmQgY29udmVydHMgdG8gQkdSNTY1IHdpdGggKzkwIHJvdGF0aW9uLgotICogQG5vdGUgICAgQmFzaWMgc3R1cnR1cmUgb2YgdGhlIGZ1bmN0aW9uCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93IChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoc3RlcCAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIDEgdSAmIFYgc2FtcGxlCi0gKiAgICAgICAgICAgICAgICAgIFJlc2l6ZSB0aGUgWSB3aXRoIGNvcnJlc3BvbmluZyBVIGFuZCBWIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgQ29tcHV0ZSB0aGUgZm91ciBjb3JyZXNwb25kaW5nIFIgRyBCIHZhbHVlcwotICogICAgICAgICAgICAgICAgICBQbGFjZSB0aGUgUiBHIEIgaW4gdGhlIG91cHV0IHBsYW5lIGluIHJvdGF0ZWQgZmFzaGlvbgotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93Ci0gKiAgICAgICAgICBGb3IgcmVzaXppbmcgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcKLSAqICAgICAgICAgIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG93biBlYWNoIGNvbHVtbi4KLSAqICAgICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZAotICogICAgICAgICAgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3Vycy4gVGhlIHJhdGlvIG9mIGNvbXByZXNzaW9uCi0gKiAgICAgICAgICBvciBkaWxhdGF0aW9uIGlzIGVzdGltYXRlZCB1c2luZyBpbnB1dCBhbmQgb3V0cHV0IHNpemVzLgotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVYgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwQ29udGV4dDogKElOKSBDb250ZXh0IFBvaW50ZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBCR1I1NjUgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSh2b2lkKiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfaW5bUExBTkVTXSwgKnB1OF9kYXRhX2luMVtQTEFORVNdLCpwdThfZGF0YV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICpwdTMyX3JnYl9kYXRhX2N1cnJlbnQsICpwdTMyX3JnYl9kYXRhX25leHQsICpwdTMyX3JnYl9kYXRhX3N0YXJ0OwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aF9pbltQTEFORVNdLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luW1BMQU5FU10sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luW1BMQU5FU107Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfb3V0LCB1MzJfc3RyaWRlMl9vdXQsIHUzMl93aWR0aDJfUkdCLCB1MzJfaGVpZ2h0Ml9SR0I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luY1tQTEFORVNdLCB1MzJfeV9pbmNbUExBTkVTXTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfYWNjdW1fWSwgdTMyX3hfYWNjdW1fVSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2FjY3VtX1ksIHUzMl95X2FjY3VtX1U7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWNfWSwgdTMyX3hfZnJhY19VLCB1MzJfeV9mcmFjX1ksdTMyX3lfZnJhY19VOwotICAgIE00VklGSV9JbnQzMiAgICBVXzMyLCBWXzMyLCBZXzMyLCBZdmFsXzMyOwotICAgIE00VklGSV9VSW50OCAgICB1OF9SZWQsIHU4X0dyZWVuLCB1OF9CbHVlOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfcm93LCB1MzJfY29sOwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9wbGFuZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMSwgdTMyX3JnYl90ZW1wMjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMyx1MzJfcmdiX3RlbXA0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY2hlY2tfc2l6ZTsKLQotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY190b3BfWSwqcHU4X3NyY190b3BfVSwqcHU4X3NyY190b3BfViA7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbV9ZLCAqcHU4X3NyY19ib3R0b21fVSwgKnB1OF9zcmNfYm90dG9tX1Y7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIFlVViB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfaGVpZ2h0KTsKLSAgICBpZiggdTMyX2NoZWNrX3NpemUgPT0gRkFMU0UgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfd2lkdGgpOwotICAgIGlmICh1MzJfY2hlY2tfc2l6ZSA9PSBGQUxTRSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0KLSAgICB9Ci0gICAgLyogTWFrZSB0aGUgb3VwdXQgd2lkdGggYW5kIGhlaWdodCBhcyBldmVuICovCi0gICAgcFBsYW5lT3V0LT51X2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQgJiAweEZGRkZGRkZFOwotICAgIHBQbGFuZU91dC0+dV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aCAmIDB4RkZGRkZGRkU7Ci0gICAgcFBsYW5lT3V0LT51X3N0cmlkZSA9IHBQbGFuZU91dC0+dV9zdHJpZGUgJiAweEZGRkZGRkZDOwotCi0gICAgLyogQXNzaWdubWVudCBvZiBvdXRwdXQgcG9pbnRlciAqLwotICAgIHB1OF9kYXRhX291dCAgICA9IHBQbGFuZU91dC0+cGFjX2RhdGEgKyBwUGxhbmVPdXQtPnVfdG9wbGVmdDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCB3aWR0aChyb3RhdGVkKSAqLwotICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCBoZWlnaHQocm90YXRlZCkgKi8KLSAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotCi0gICAgdTMyX3dpZHRoMl9SR0IgID0gcFBsYW5lT3V0LT51X3dpZHRoID4+IDE7Ci0gICAgdTMyX2hlaWdodDJfUkdCID0gcFBsYW5lT3V0LT51X2hlaWdodCA+PiAxOwotCi0gICAgdTMyX3N0cmlkZV9vdXQgPSBwUGxhbmVPdXQtPnVfc3RyaWRlID4+IDE7Ci0gICAgdTMyX3N0cmlkZTJfb3V0ID0gcFBsYW5lT3V0LT51X3N0cmlkZSA+PiAyOwotCi0gICAgZm9yKHUzMl9wbGFuZSA9IDA7IHUzMl9wbGFuZSA8IFBMQU5FUzsgdTMyX3BsYW5lKyspCi0gICAgewotICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICAgICAgcHU4X2RhdGFfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0ucGFjX2RhdGEgKyBwUGxhbmVJblt1MzJfcGxhbmVdLnVfdG9wbGVmdDsKLQotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgICAgICB1MzJfc3RyaWRlX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfc3RyaWRlOwotCi0gICAgICAgIC8qIFNldCB0aGUgYm91bmRzIG9mIHRoZSBhY3RpdmUgaW1hZ2UgKi8KLSAgICAgICAgdTMyX3dpZHRoX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfd2lkdGg7Ci0gICAgICAgIHUzMl9oZWlnaHRfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV9oZWlnaHQ7Ci0gICAgfQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGggZm9yIFkgUGxhbmUuICovCi0gICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luW1lQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbWVBsYW5lXSAgID0gKCh1MzJfd2lkdGhfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1lQbGFuZV0gICA9ICh1MzJfd2lkdGhfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0IGZvciBZIFBsYW5lLiovCi0gICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW5bWVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdICAgPSAoKHUzMl9oZWlnaHRfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdID0gKHUzMl9oZWlnaHRfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGggZm9yIFUgYW5kIFYgUGxhbmVzLiAqLwotICAgIGlmICh1MzJfd2lkdGgyX1JHQiA+PSB1MzJfd2lkdGhfaW5bVVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl94X2luY1tVUGxhbmVdICAgPSAoKHUzMl93aWR0aF9pbltVUGxhbmVdLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGgyX1JHQi0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1VQbGFuZV0gICA9ICh1MzJfd2lkdGhfaW5bVVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoMl9SR0IpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodCBmb3IgVSBhbmQgViBQbGFuZXMuICovCi0KLSAgICBpZiAodTMyX2hlaWdodDJfUkdCID49IHUzMl9oZWlnaHRfaW5bVVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tVUGxhbmVdICAgPSAoKHUzMl9oZWlnaHRfaW5bVVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodDJfUkdCLTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbVVBsYW5lXSAgPSAodTMyX2hlaWdodF9pbltVUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0Ml9SR0IpOwotICAgIH0KLQotICAgIHUzMl95X2luY1tWUGxhbmVdID0gdTMyX3lfaW5jW1VQbGFuZV07Ci0gICAgdTMyX3hfaW5jW1ZQbGFuZV0gPSB1MzJfeF9pbmNbVVBsYW5lXTsKLQotICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICovCi0gICAgaWYgKHUzMl95X2luY1tZUGxhbmVdID4gTUFYX1NIT1JUKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICAgIEtlZXAgdGhlIGZyYWN0aW9ubmFsIHBhcnQsIGFzc2ltdW5nIHRoYXQgaW50ZWdlciAgcGFydCBpcyBjb2RlZCBvbiB0aGUgMTYgaGlnaCBiaXRzLAotICAgICAgICAgICAgYW5kIHRoZSBmcmFjdGlvbm5hbCBvbiB0aGUgMTUgbG93IGJpdHMKLSAgICAgICAgKi8KLSAgICAgICAgdTMyX3lfYWNjdW1fWSA9IHUzMl95X2luY1tZUGxhbmVdICYgMHhmZmZmOwotICAgICAgICB1MzJfeV9hY2N1bV9VID0gdTMyX3lfaW5jW1VQbGFuZV0gJiAweGZmZmY7Ci0KLSAgICAgICAgaWYgKCF1MzJfeV9hY2N1bV9ZKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bV9ZID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fVSA9IE1BWF9TSE9SVDsKLSAgICAgICAgfQotICAgICAgICB1MzJfeV9hY2N1bV9ZID4+PSAxOwotICAgICAgICB1MzJfeV9hY2N1bV9VID4+PSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeV9hY2N1bV9ZID0gMDsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA9IDA7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgKi8KLSAgICBpZiAodTMyX3hfaW5jW1lQbGFuZV0gPiBNQVhfU0hPUlQpCi0gICAgewotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IHUzMl94X2luY1tZUGxhbmVdICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3hfYWNjdW1fc3RhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gMDsKLSAgICB9Ci0KLSAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ID0gKE00VklGSV9VSW50MzIqKXB1OF9kYXRhX291dDsKLQotICAgIC8qCi0gICAgICAgIEJpbGluZWFyIGludGVycG9sYXRpb24gbGluZWFybHkgaW50ZXJwb2xhdGVzIGFsb25nIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQKLSAgICAgICAgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG9udyBlYWNoIGNvbHVtbi4gRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlCi0gICAgICAgIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhIDoKLSAgICAgICAgRihwJyxxJyk9ZihwLHEpUigtYSlSKGIpK2YocCxxLTEpUigtYSlSKGItMSkrZihwKzEscSlSKDEtYSlSKGIpK2YocCsmLHErMSlSKDEtYSlSKGItMSkKLSAgICAgICAgd2l0aCAgUih4KSA9IC8geCsxICAtMSA9PCB4ID08IDAgXCAxLXggIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKSB3ZWlnaHRpbmcgY29lZmZpY2llbnQKLSAgICAgICAgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIG5lYXJlc3QgbmVpZ2hib3IgaW4gdGhlIHAgKHJlc3AuIHEpIGRpcmVjdGlvbgotICAgICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodF9vdXQ7IHUzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPSAyKQotICAgIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fWSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotICAgICAgICB1MzJfeF9hY2N1bV9VID0gdTMyX3hfYWNjdW1fc3RhcnQ7Ci0KLSAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICB1MzJfeV9mcmFjX1kgPSAodTMyX3lfYWNjdW1fWSA+PiAxMikgJiAxNTsKLSAgICAgICAgdTMyX3lfZnJhY19VID0gKHUzMl95X2FjY3VtX1UgPj4gMTIpICYgMTU7Ci0KLSAgICAgICAgLyogUkdCIGN1cnJlbnQgbGluZSBwb3NpdGlvbiBwb2ludGVyICovCi0gICAgICAgIHB1MzJfcmdiX2RhdGFfY3VycmVudCA9IHB1MzJfcmdiX2RhdGFfc3RhcnQgOwotCi0gICAgICAgIC8qIFJHQiBuZXh0IGxpbmUgcG9zaXRpb24gcG9pbnRlciAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX25leHQgICAgPSBwdTMyX3JnYl9kYXRhX2N1cnJlbnQgKyAodTMyX3N0cmlkZTJfb3V0KTsKLQotICAgICAgICAvKiBZIFBsYW5lIG5leHQgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X2RhdGFfaW4xW1lQbGFuZV0gPSBwdThfZGF0YV9pbltZUGxhbmVdOwotCi0gICAgICAgIHUzMl9yZ2JfdGVtcDMgPSB1MzJfeV9hY2N1bV9ZICsgKHUzMl95X2luY1tZUGxhbmVdKTsKLSAgICAgICAgaWYgKHUzMl9yZ2JfdGVtcDMgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luMVtZUGxhbmVdID0gIHB1OF9kYXRhX2luW1lQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl9yZ2JfdGVtcDMgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bWVBsYW5lXSk7Ci0gICAgICAgICAgICB1MzJfcmdiX3RlbXAzICY9IDB4ZmZmZjsKLSAgICAgICAgfQotICAgICAgICB1MzJfcmdiX3RlbXA0ID0gKHUzMl9yZ2JfdGVtcDMgPj4gMTIpICYgMTU7Ci0KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoX291dDsgdTMyX2NvbCAhPSAwOyB1MzJfY29sIC09IDIpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLyogSW5wdXQgWSBwbGFuZSBlbGVtZW50cyAqLwotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luW1lQbGFuZV0gKyAodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogSW5wdXQgVSBQbGFuZSBlbGVtZW50cyAqLwotICAgICAgICAgICAgcHU4X3NyY190b3BfVSA9IHB1OF9kYXRhX2luW1VQbGFuZV0gKyAodTMyX3hfYWNjdW1fVSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9VID0gcHU4X3NyY190b3BfVSArIHUzMl9zdHJpZGVfaW5bVVBsYW5lXTsKLQotICAgICAgICAgICAgcHU4X3NyY190b3BfViA9IHB1OF9kYXRhX2luW1ZQbGFuZV0gKyAodTMyX3hfYWNjdW1fVSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9WID0gcHU4X3NyY190b3BfViArIHUzMl9zdHJpZGVfaW5bVlBsYW5lXTsKLQotICAgICAgICAgICAgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yIGZvciBZIHBsYW5lICovCi0gICAgICAgICAgICB1MzJfeF9mcmFjX1kgPSAodTMyX3hfYWNjdW1fWSA+PiAxMikmMTU7Ci0gICAgICAgICAgICAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgZm9yIFUgYW5kIFYgcGxhbmVzICovCi0gICAgICAgICAgICB1MzJfeF9mcmFjX1UgPSAodTMyX3hfYWNjdW1fVSA+PiAxMikmMTU7Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBVXzMyID0gKCgocHU4X3NyY190b3BfVVswXSooMTYtdTMyX3hfZnJhY19VKSArIHB1OF9zcmNfdG9wX1VbMV0qdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfVSkgKyAocHU4X3NyY19ib3R0b21fVVswXSooMTYtdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1VbMV0qdTMyX3hfZnJhY19VKSp1MzJfeV9mcmFjX1UgKSA+PiA4KTsKLQotICAgICAgICAgICAgVl8zMiA9ICgoKHB1OF9zcmNfdG9wX1ZbMF0qKDE2LXUzMl94X2ZyYWNfVSkgKyBwdThfc3JjX3RvcF9WWzFdKnUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1UpKyAocHU4X3NyY19ib3R0b21fVlswXSooMTYtdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1ZbMV0qdTMyX3hfZnJhY19VKSp1MzJfeV9mcmFjX1UgKSA+PiA4KTsKLQotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1kpICsgKHB1OF9zcmNfYm90dG9tX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9ZWzFdKnUzMl94X2ZyYWNfWSkqdTMyX3lfZnJhY19ZICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1UgKz0gKHUzMl94X2luY1tVUGxhbmVdKTsKLQotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAxID0gUEFDS19CR1I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMSA9IFBBQ0tfQkdSNTY1KDE2LHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbmRpZiAgLyogTElUVExFX0VORElBTiAqLwotCi0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbjFbWVBsYW5lXSsodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3JnYl90ZW1wNCkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfcmdiX3RlbXA0ICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1kgKz0gdTMyX3hfaW5jW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19ZID0gKHUzMl94X2FjY3VtX1kgPj4gMTIpJjE1OwotCi0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMiA9IFBBQ0tfQkdSNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDIgPSBQQUNLX0JHUjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW5bWVBsYW5lXSArICh1MzJfeF9hY2N1bV9ZID4+IDE2KSA7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19ZKSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl95X2ZyYWNfWSApID4+IDgpOwotCi0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX2N1cnJlbnQpKysgPSB1MzJfcmdiX3RlbXAxIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19CR1I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9jdXJyZW50KSsrID0gdTMyX3JnYl90ZW1wMSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfQkdSNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdKyAodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3JnYl90ZW1wNCkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfcmdiX3RlbXA0ICk+PjgpOwotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9ZICs9IHUzMl94X2luY1tZUGxhbmVdOwotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMj1ZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyPVlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX25leHQpKysgPSB1MzJfcmdiX3RlbXAyIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19CR1I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9uZXh0KSsrID0gdTMyX3JnYl90ZW1wMiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfQkdSNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLSAgICAgICAgfSAgIC8qIEVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgdTMyX3lfYWNjdW1fWSAgPSAgdTMyX3JnYl90ZW1wMyArICh1MzJfeV9pbmNbWVBsYW5lXSk7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgKz0gKHUzMl95X2luY1tVUGxhbmVdKTsKLQotICAgICAgICAvKiBZIHBsYW5lIHJvdyB1cGRhdGUgKi8KLSAgICAgICAgaWYgKHUzMl95X2FjY3VtX1kgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1lQbGFuZV0gPSAgcHU4X2RhdGFfaW4xW1lQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzJfeV9hY2N1bV9ZID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1lQbGFuZV0pKTsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1kgJj0gMHhmZmZmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bWVBsYW5lXSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdOwotICAgICAgICB9Ci0gICAgICAgIC8qIFUgYW5kIFYgcGxhbmVzIHJvdyB1cGRhdGUgKi8KLSAgICAgICAgaWYgKHUzMl95X2FjY3VtX1UgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1VQbGFuZV0gPSAgcHU4X2RhdGFfaW5bVVBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3lfYWNjdW1fVSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltVUGxhbmVdKTsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1ZQbGFuZV0gPSAgcHU4X2RhdGFfaW5bVlBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3lfYWNjdW1fVSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltWUGxhbmVdKTsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1UgJj0gMHhmZmZmOwotICAgICAgICB9Ci0gICAgICAgIC8qIEJHUiBwb2ludGVyIFVwZGF0ZSAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ICs9IHUzMl9zdHJpZGVfb3V0OwotCi0gICAgfSAgIC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9SR0I1NjUuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9SR0I1NjUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWRhOWQwNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVlVVnRvUkdCNTY1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfUmVzaXplWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQuYwotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIFRoaXMgZmlsZSBoYXMgYSBDb21ibyBmaWx0ZXIgZnVuY3Rpb24KLSAqICAgICAgICAgICAtIyBSZXNpemVzIFlVVjQyMCBhbmQgY29udmVydHMgdG8gUkdSNTY1IHdpdGggcm90YXRpb24KLSAqIEBkYXRlCi0gKiAgICAgICAgICAgLSAyMDA0LzA4LzExOiBDcmVhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0KHZvaWQgKnBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgUmVzaXplIFlVVjQyMCBwbGFuZSBhbmQgY29udmVydHMgdG8gUkdCNTY1IHdpdGggKzkwIHJvdGF0aW9uLgotICogQG5vdGUgICAgQmFzaWMgc3R1cnR1cmUgb2YgdGhlIGZ1bmN0aW9uCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93IChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoc3RlcCAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIDEgdSAmIFYgc2FtcGxlCi0gKiAgICAgICAgICAgICAgICAgIFJlc2l6ZSB0aGUgWSB3aXRoIGNvcnJlc3BvbmluZyBVIGFuZCBWIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgQ29tcHV0ZSB0aGUgZm91ciBjb3JyZXNwb25kaW5nIFIgRyBCIHZhbHVlcwotICogICAgICAgICAgICAgICAgICBQbGFjZSB0aGUgUiBHIEIgaW4gdGhlIG91cHV0IHBsYW5lIGluIHJvdGF0ZWQgZmFzaGlvbgotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93Ci0gKiAgICAgICAgICBGb3IgcmVzaXppbmcgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcKLSAqICAgICAgICAgIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG93biBlYWNoIGNvbHVtbi4KLSAqICAgICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZAotICogICAgICAgICAgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3Vycy4gVGhlIHJhdGlvIG9mIGNvbXByZXNzaW9uCi0gKiAgICAgICAgICBvciBkaWxhdGF0aW9uIGlzIGVzdGltYXRlZCB1c2luZyBpbnB1dCBhbmQgb3V0cHV0IHNpemVzLgotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVYgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwQ29udGV4dDogKElOKSBDb250ZXh0IFBvaW50ZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBCR1I1NjUgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1KHZvaWQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfaW5bUExBTkVTXSwgKnB1OF9kYXRhX2luMVtQTEFORVNdLCpwdThfZGF0YV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICpwdTMyX3JnYl9kYXRhX2N1cnJlbnQsICpwdTMyX3JnYl9kYXRhX25leHQsICpwdTMyX3JnYl9kYXRhX3N0YXJ0OwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aF9pbltQTEFORVNdLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luW1BMQU5FU10sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luW1BMQU5FU107Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfb3V0LCB1MzJfc3RyaWRlMl9vdXQsIHUzMl93aWR0aDJfUkdCLCB1MzJfaGVpZ2h0Ml9SR0I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luY1tQTEFORVNdLCB1MzJfeV9pbmNbUExBTkVTXTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfYWNjdW1fWSwgdTMyX3hfYWNjdW1fVSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2FjY3VtX1ksIHUzMl95X2FjY3VtX1U7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWNfWSwgdTMyX3hfZnJhY19VLCB1MzJfeV9mcmFjX1ksdTMyX3lfZnJhY19VOwotICAgIE00VklGSV9JbnQzMiAgICBVXzMyLCBWXzMyLCBZXzMyLCBZdmFsXzMyOwotICAgIE00VklGSV9VSW50OCAgICB1OF9SZWQsIHU4X0dyZWVuLCB1OF9CbHVlOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfcm93LCB1MzJfY29sOwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9wbGFuZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMSwgdTMyX3JnYl90ZW1wMjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMyx1MzJfcmdiX3RlbXA0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY2hlY2tfc2l6ZTsKLQotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY190b3BfWSwqcHU4X3NyY190b3BfVSwqcHU4X3NyY190b3BfViA7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbV9ZLCAqcHU4X3NyY19ib3R0b21fVSwgKnB1OF9zcmNfYm90dG9tX1Y7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlICB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfaGVpZ2h0KTsKLSAgICBpZiggdTMyX2NoZWNrX3NpemUgPT0gRkFMU0UgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfd2lkdGgpOwotICAgIGlmICh1MzJfY2hlY2tfc2l6ZSA9PSBGQUxTRSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0KLSAgICB9Ci0gICAgLyogTWFrZSB0aGUgb3VwdXQgd2lkdGggYW5kIGhlaWdodCBhcyBldmVuICovCi0gICAgcFBsYW5lT3V0LT51X2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQgJiAweEZGRkZGRkZFOwotICAgIHBQbGFuZU91dC0+dV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aCAmIDB4RkZGRkZGRkU7Ci0gICAgcFBsYW5lT3V0LT51X3N0cmlkZSA9IHBQbGFuZU91dC0+dV9zdHJpZGUgJiAweEZGRkZGRkZDOwotCi0gICAgLyogQXNzaWdubWVudCBvZiBvdXRwdXQgcG9pbnRlciAqLwotICAgIHB1OF9kYXRhX291dCAgICA9IHBQbGFuZU91dC0+cGFjX2RhdGEgKyBwUGxhbmVPdXQtPnVfdG9wbGVmdDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCB3aWR0aChyb3RhdGVkKSAqLwotICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCBoZWlnaHQocm90YXRlZCkgKi8KLSAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotCi0gICAgLyogU2V0IHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSBpbWFnZSAqLwotICAgIHUzMl93aWR0aDJfUkdCICA9IHBQbGFuZU91dC0+dV93aWR0aCA+PiAxOwotICAgIHUzMl9oZWlnaHQyX1JHQiA9IHBQbGFuZU91dC0+dV9oZWlnaHQgPj4gMTsKLSAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgIHUzMl9zdHJpZGVfb3V0ID0gcFBsYW5lT3V0LT51X3N0cmlkZSA+PiAxOwotICAgIHUzMl9zdHJpZGUyX291dCA9IHBQbGFuZU91dC0+dV9zdHJpZGUgPj4gMjsKLQotICAgIGZvcih1MzJfcGxhbmUgPSAwOyB1MzJfcGxhbmUgPCBQTEFORVM7IHUzMl9wbGFuZSsrKQotICAgIHsKLSAgICAgICAgLyogU2V0IHRoZSB3b3JraW5nIHBvaW50ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0L291dHB1dCBkYXRhIGZpZWxkICovCi0gICAgICAgIHB1OF9kYXRhX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnBhY19kYXRhICsgcFBsYW5lSW5bdTMyX3BsYW5lXS51X3RvcGxlZnQ7Ci0KLSAgICAgICAgLyogR2V0IHRoZSBtZW1vcnkganVtcCBjb3JyZXNwb25kaW5nIHRvIGEgcm93IGp1bXAgKi8KLSAgICAgICAgdTMyX3N0cmlkZV9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgICAgIHUzMl93aWR0aF9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X3dpZHRoOwotICAgICAgICB1MzJfaGVpZ2h0X2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfaGVpZ2h0OwotICAgIH0KLSAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoIGZvciBZIFBsYW5lLiovCi0gICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luW1lQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbWVBsYW5lXSAgID0gKCh1MzJfd2lkdGhfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1lQbGFuZV0gICA9ICh1MzJfd2lkdGhfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0IGZvciBZIFBsYW5lLiovCi0gICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW5bWVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdICAgPSAoKHUzMl9oZWlnaHRfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdID0gKHUzMl9oZWlnaHRfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGggZm9yIFUgYW5kIFYgUGxhbmVzLiovCi0gICAgaWYgKHUzMl93aWR0aDJfUkdCID49IHUzMl93aWR0aF9pbltVUGxhbmVdKQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1VQbGFuZV0gICA9ICgodTMyX3dpZHRoX2luW1VQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aDJfUkdCLTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbVVBsYW5lXSAgID0gKHUzMl93aWR0aF9pbltVUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGgyX1JHQik7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0IGZvciBVIGFuZCBWIFBsYW5lcy4qLwotCi0gICAgaWYgKHUzMl9oZWlnaHQyX1JHQiA+PSB1MzJfaGVpZ2h0X2luW1VQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbVVBsYW5lXSAgID0gKCh1MzJfaGVpZ2h0X2luW1VQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHQyX1JHQi0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3lfaW5jW1VQbGFuZV0gID0gKHUzMl9oZWlnaHRfaW5bVVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodDJfUkdCKTsKLSAgICB9Ci0KLSAgICB1MzJfeV9pbmNbVlBsYW5lXSA9IHUzMl95X2luY1tVUGxhbmVdOwotICAgIHUzMl94X2luY1tWUGxhbmVdID0gdTMyX3hfaW5jW1VQbGFuZV07Ci0KLSAgICAvKgotICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICovCi0gICAgaWYgKHUzMl95X2luY1tZUGxhbmVdID4gTUFYX1NIT1JUKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkIG9uIHRoZSAxNiBoaWdoIGJpdHMsCi0gICAgICAgIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICovCi0gICAgICAgIHUzMl95X2FjY3VtX1kgPSB1MzJfeV9pbmNbWVBsYW5lXSAmIDB4ZmZmZjsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA9IHUzMl95X2luY1tVUGxhbmVdICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3lfYWNjdW1fWSkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfYWNjdW1fWSA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1UgPSBNQVhfU0hPUlQ7Ci0gICAgICAgIH0KLSAgICAgICAgdTMyX3lfYWNjdW1fWSA+Pj0gMTsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA+Pj0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3lfYWNjdW1fWSA9IDA7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgPSAwOwotCi0gICAgfQotCi0gICAgLyoKLSAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAqLwotICAgIGlmICh1MzJfeF9pbmNbWVBsYW5lXSA+IE1BWF9TSE9SVCkKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jW1lQbGFuZV0gJiAweGZmZmY7Ci0KLSAgICAgICAgaWYgKCF1MzJfeF9hY2N1bV9zdGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSBNQVhfU0hPUlQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA+Pj0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSAwOwotICAgIH0KLSAgICAvKiBJbnRpYWxpc2UgdGhlIFJHQiBwb2ludGVyICovCi0gICAgcHUzMl9yZ2JfZGF0YV9zdGFydCA9IChNNFZJRklfVUludDMyKilwdThfZGF0YV9vdXQ7Ci0KLSAgICAvKgotICAgICAgICBCaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZyBlYWNoIHJvdywgYW5kIHRoZW4gdXNlcyB0aGF0Ci0gICAgICAgIHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZQotICAgICAgICBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZCBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYSA6Ci0gICAgICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpCi0gICAgICAgIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14ICAwID08IHggPTwgMSBhbmQgYSAocmVzcC4gYikgd2VpZ2h0aW5nIGNvZWZmaWNpZW50Ci0gICAgICAgIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBuZWFyZXN0IG5laWdoYm9yIGluIHRoZSBwIChyZXNwLiBxKSBkaXJlY3Rpb24KLSAgICAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHRfb3V0OyB1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0gMikKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX1kgPSB1MzJfeF9hY2N1bV9zdGFydDsKLSAgICAgICAgdTMyX3hfYWNjdW1fVSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotCi0gICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgdTMyX3lfZnJhY19ZID0gKHUzMl95X2FjY3VtX1kgPj4gMTIpICYgMTU7Ci0gICAgICAgIHUzMl95X2ZyYWNfVSA9ICh1MzJfeV9hY2N1bV9VID4+IDEyKSAmIDE1OwotCi0gICAgICAgIC8qIFJHQiBjdXJyZW50IGxpbmUgUG9zaXRpb24gUG9pbnRlciAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX2N1cnJlbnQgPSBwdTMyX3JnYl9kYXRhX3N0YXJ0IDsKLQotICAgICAgICAvKiBSR0IgbmV4dCBsaW5lIHBvc2l0aW9uIHBvaW50ZXIgKi8KLSAgICAgICAgcHUzMl9yZ2JfZGF0YV9uZXh0ICAgID0gcHUzMl9yZ2JfZGF0YV9jdXJyZW50ICsgKHUzMl9zdHJpZGUyX291dCk7Ci0KLSAgICAgICAgLyogWSBQbGFuZSBuZXh0IHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF9kYXRhX2luMVtZUGxhbmVdID0gcHU4X2RhdGFfaW5bWVBsYW5lXTsKLQotICAgICAgICB1MzJfcmdiX3RlbXAzID0gdTMyX3lfYWNjdW1fWSArICh1MzJfeV9pbmNbWVBsYW5lXSk7Ci0gICAgICAgIGlmICh1MzJfcmdiX3RlbXAzID4+IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbjFbWVBsYW5lXSA9ICBwdThfZGF0YV9pbltZUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfcmdiX3RlbXAzID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1lQbGFuZV0pOwotICAgICAgICAgICAgdTMyX3JnYl90ZW1wMyAmPSAweGZmZmY7Ci0gICAgICAgIH0KLSAgICAgICAgdTMyX3JnYl90ZW1wNCA9ICh1MzJfcmdiX3RlbXAzID4+IDEyKSAmIDE1OwotCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aF9vdXQ7IHUzMl9jb2wgIT0gMDsgdTMyX2NvbCAtPSAyKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qIElucHV0IFkgcGxhbmUgZWxlbWVudHMgKi8KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbltZUGxhbmVdICsgKHUzMl94X2FjY3VtX1kgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIElucHV0IFUgUGxhbmUgZWxlbWVudHMgKi8KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1UgPSBwdThfZGF0YV9pbltVUGxhbmVdICsgKHUzMl94X2FjY3VtX1UgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fVSA9IHB1OF9zcmNfdG9wX1UgKyB1MzJfc3RyaWRlX2luW1VQbGFuZV07Ci0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1YgPSBwdThfZGF0YV9pbltWUGxhbmVdICsgKHUzMl94X2FjY3VtX1UgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fViA9IHB1OF9zcmNfdG9wX1YgKyB1MzJfc3RyaWRlX2luW1ZQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciBmb3IgWSBQbGFuZSAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19ZID0gKHUzMl94X2FjY3VtX1kgPj4gMTIpJjE1OwotICAgICAgICAgICAgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yIGZvciBVIGFuZCBWIFBsYW5lcyAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19VID0gKHUzMl94X2FjY3VtX1UgPj4gMTIpJjE1OwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgVV8zMiA9ICgoKHB1OF9zcmNfdG9wX1VbMF0qKDE2LXUzMl94X2ZyYWNfVSkgKyBwdThfc3JjX3RvcF9VWzFdKnUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1UpICsgKHB1OF9zcmNfYm90dG9tX1VbMF0qKDE2LXUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9VWzFdKnUzMl94X2ZyYWNfVSkqdTMyX3lfZnJhY19VICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIFZfMzIgPSAoKChwdThfc3JjX3RvcF9WWzBdKigxNi11MzJfeF9mcmFjX1UpICsgcHU4X3NyY190b3BfVlsxXSp1MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19VKSArIChwdThfc3JjX2JvdHRvbV9WWzBdKigxNi11MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fVlsxXSp1MzJfeF9mcmFjX1UpKnUzMl95X2ZyYWNfVSApID4+IDgpOwotCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfWSkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfeV9mcmFjX1kgKSA+PiA4KTsKLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fVSArPSAodTMyX3hfaW5jW1VQbGFuZV0pOwotCi0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDEgPSBQQUNLX1JHQjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAxID0gUEFDS19SR0I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdKyh1MzJfeF9hY2N1bV9ZID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfcmdiX3RlbXA0KSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl9yZ2JfdGVtcDQgKSA+PiA4KTsKLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fWSArPSB1MzJfeF9pbmNbWVBsYW5lXTsKLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19ZID0gKHUzMl94X2FjY3VtX1kgPj4gMTIpJjE1OwotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAgLyogX19SR0JfVjFfX3YgKi8KLQotICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDIgPSBQQUNLX1JHQjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAyID0gUEFDS19SR0I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luW1lQbGFuZV0gKyAodTMyX3hfYWNjdW1fWSA+PiAxNikgOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfWSkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfeV9mcmFjX1kgKSA+PiA4KTsKLSAgICAgICAgICAgIC8qIFlVViB0byBSR0IgKi8KLSAgICAgICAgICAgICNpZmRlZiBfX1JHQl9WMV9fCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfY3VycmVudCkrKyA9IHUzMl9yZ2JfdGVtcDEgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX1JHQjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX2N1cnJlbnQpKysgPSB1MzJfcmdiX3RlbXAxIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19SR0I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW4xW1lQbGFuZV0rICh1MzJfeF9hY2N1bV9ZID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfcmdiX3RlbXA0KSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl9yZ2JfdGVtcDQgKT4+OCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1kgKz0gdTMyX3hfaW5jW1lQbGFuZV07Ci0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyPVlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzI9WV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfbmV4dCkrKyA9IHUzMl9yZ2JfdGVtcDIgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX1JHQjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX25leHQpKysgPSB1MzJfcmdiX3RlbXAyIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19SR0I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotICAgICAgICB9ICAgLyogRW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICB1MzJfeV9hY2N1bV9ZICA9ICB1MzJfcmdiX3RlbXAzICsgKHUzMl95X2luY1tZUGxhbmVdKTsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSArPSAodTMyX3lfaW5jW1VQbGFuZV0pOwotCi0gICAgICAgIC8qIFkgcGxhbmUgcm93IHVwZGF0ZSAqLwotICAgICAgICBpZiAodTMyX3lfYWNjdW1fWSA+PiAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bWVBsYW5lXSA9ICBwdThfZGF0YV9pbjFbWVBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMl95X2FjY3VtX1kgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bWVBsYW5lXSkpOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fWSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbltZUGxhbmVdID0gcHU4X2RhdGFfaW4xW1lQbGFuZV07Ci0gICAgICAgIH0KLSAgICAgICAgLyogVSBhbmQgViBwbGFuZXMgcm93IHVwZGF0ZSAqLwotICAgICAgICBpZiAodTMyX3lfYWNjdW1fVSA+PiAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bVVBsYW5lXSA9ICBwdThfZGF0YV9pbltVUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfeV9hY2N1bV9VID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1VQbGFuZV0pOwotICAgICAgICAgICAgcHU4X2RhdGFfaW5bVlBsYW5lXSA9ICBwdThfZGF0YV9pbltWUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfeV9hY2N1bV9VID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1ZQbGFuZV0pOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fVSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ICs9IHUzMl9zdHJpZGVfb3V0OwotCi0gICAgfSAgIC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvdXRpbHMuY3BwIGIvbWVkaWEvY29tbW9uX3RpbWUvdXRpbHMuY3BwCmluZGV4IDY1MzkxNzEuLjkxY2YyZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvbW1vbl90aW1lL3V0aWxzLmNwcAorKysgYi9tZWRpYS9jb21tb25fdGltZS91dGlscy5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKIH0KIAogdm9pZCBkZXNlcmlhbGl6ZVNvY2thZGRyKGNvbnN0IFBhcmNlbCogcCwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqIGFkZHIpIHsKLSAgICBtZW1zZXQoYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKyAgICBtZW1zZXQoYWRkciwgMCwgc2l6ZW9mKCphZGRyKSk7CiAKICAgICBhZGRyLT5zc19mYW1pbHkgPSBwLT5yZWFkSW50MzIoKTsKICAgICBzd2l0Y2goYWRkci0+c3NfZmFtaWx5KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5tayBiL21lZGlhL2ltZ191dGlscy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZDAwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE1IEBACisjIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0J5dGVBcnJheU91dHB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0J5dGVBcnJheU91dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzM5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvQnl0ZUFycmF5T3V0cHV0LmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfQllURV9BUlJBWV9PVVRQVVRfSAorI2RlZmluZSBJTUdfVVRJTFNfQllURV9BUlJBWV9PVVRQVVRfSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IGFjY3VtdWxhdGVzIHdyaXR0ZW4gYnl0ZXMgaW50byBhIGJ1ZmZlci4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgQnl0ZUFycmF5T3V0cHV0IDogcHVibGljIE91dHB1dCB7CisgICAgcHVibGljOgorCisgICAgICAgIEJ5dGVBcnJheU91dHB1dCgpOworCisgICAgICAgIHZpcnR1YWwgfkJ5dGVBcnJheU91dHB1dCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcGVuIHRoaXMgQnl0ZUFycmF5T3V0cHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBidWZmZXIuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGdpdmVuIGluIHRoZSBjb3VudAorICAgICAgICAgKiBhcmd1bWVudCB3aWxsIGJlIHdyaXR0ZW4uICBCeXRlcyB3aWxsIGJlIHdyaXR0ZW4gZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIHN0YXJ0aW5nCisgICAgICAgICAqIGF0IHRoZSBpbmRleCBnaXZlbiBpbiB0aGUgb2Zmc2V0IGFyZ3VtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbG9zZSB0aGlzIEJ5dGVBcnJheU91dHB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBjdXJyZW50IHNpemUgb2YgdGhlIGFycmF5IG9mIGJ5dGVzIHdyaXR0ZW4uCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBwb2ludGVyIHRvIGFycmF5IG9mIGJ5dGVzIHdyaXR0ZW4uICBJdCBpcyBub3QgdmFsaWQgdG8gdXNlIHRoaXMgcG9pbnRlciBpZgorICAgICAgICAgKiBvcGVuLCB3cml0ZSwgb3IgY2xvc2UgaXMgY2FsbGVkIGFmdGVyIHRoaXMgbWV0aG9kLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBjb25zdCB1aW50OF90KiBnZXRBcnJheSgpIGNvbnN0OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBWZWN0b3I8dWludDhfdD4gbUJ5dGVBcnJheTsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19CWVRFX0FSUkFZX09VVFBVVF9IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4OWIwMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19ETkdfVVRJTFNfSAorI2RlZmluZSBJTUdfVVRJTFNfRE5HX1VUSUxTX0gKKworI2luY2x1ZGUgPGltZ191dGlscy9CeXRlQXJyYXlPdXRwdXQuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvRW5kaWFuVXRpbHMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworI2RlZmluZSBORUxFTVMoeCkgKChpbnQpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkpCisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3IgYnVpbGRpbmcgdmFsdWVzIGZvciB0aGUgT3Bjb2RlTGlzdCB0YWdzIHNwZWNpZmllZAorICogaW4gdGhlIEFkb2JlIERORyAxLjQgc3BlYy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgT3Bjb2RlTGlzdEJ1aWxkZXIgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPE9wY29kZUxpc3RCdWlsZGVyPiB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIENmYUxheW91dCB7CisgICAgICAgICAgICBDRkFfUkdHQiA9IDAsCisgICAgICAgICAgICBDRkFfR1JCRywKKyAgICAgICAgICAgIENGQV9HQlJHLAorICAgICAgICAgICAgQ0ZBX0JHR1IsCisgICAgICAgIH07CisKKyAgICAgICAgT3Bjb2RlTGlzdEJ1aWxkZXIoKTsKKyAgICAgICAgdmlydHVhbCB+T3Bjb2RlTGlzdEJ1aWxkZXIoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0b3RhbCBzaXplIG9mIHRoaXMgb3Bjb2RlIGxpc3QgaW4gYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIG9wY29kZXMgZGVmaW5lZCBpbiB0aGlzIGxpc3QuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldENvdW50KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIHRoZSBvcGNvZGUgbGlzdCBpbnRvIHRoZSBnaXZlbiBidWZmZXIuICBUaGlzIGJ1ZmZlcgorICAgICAgICAgKiBtdXN0IGJlIGFibGUgdG8gaG9sZCBhdCBsZWFzdCBhcyBtYW55IGVsZW1lbnRzIGFzIHJldHVybmVkCisgICAgICAgICAqIGJ5IGNhbGxpbmcgdGhlIGdldFNpemUoKSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBidWlsZE9wTGlzdCgvKm91dCovIHVpbnQ4X3QqIGJ1ZikgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBHYWluTWFwIG9wY29kZShzKSBmb3IgdGhlIGdpdmVuIG1ldGFkYXRhIHBhcmFtZXRlcnMuICBUaGUgZ2l2ZW4KKyAgICAgICAgICogQ0ZBIGxheW91dCBtdXN0IG1hdGNoIHRoZSBsYXlvdXQgb2YgdGhlIHNoYWRpbmcgbWFwIHBhc3NlZCBpbnRvIHRoZQorICAgICAgICAgKiBsZW5zU2hhZGluZ01hcCBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApOworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIEdhaW5NYXAgb3Bjb2RlIHdpdGggdGhlIGdpdmVuIGZpZWxkcy4gIFRoZSBtYXBHYWlucyBhcnJheQorICAgICAgICAgKiBtdXN0IGhhdmUgbWFwUG9pbnRzViAqIG1hcFBvaW50c0ggKiBtYXBQbGFuZXMgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRHYWluTWFwKHVpbnQzMl90IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgcm93UGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xQaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hcFBvaW50c1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQb2ludHNILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcFNwYWNpbmdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcFNwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcE9yaWdpblYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWFwT3JpZ2luSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hcFBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBtYXBHYWlucyk7CisKKyAgICAgICAgLy8gVE9ETzogQWRkIG90aGVyIE9wY29kZSBtZXRob2RzCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRkxBR19PUFRJT05BTCA9IDB4MXU7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBGTEFHX09QVElPTkFMX0ZPUl9QUkVWSUVXID0gMHgydTsKKworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIEdBSU5fTUFQX0lEID0gOSwKKyAgICAgICAgICAgIExTTV9SX0lORCA9IDAsCisgICAgICAgICAgICBMU01fR0VfSU5EID0gMSwKKyAgICAgICAgICAgIExTTV9HT19JTkQgPSAyLAorICAgICAgICAgICAgTFNNX0JfSU5EID0gMywKKyAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCBtQ291bnQ7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dCBtT3BMaXN0OworICAgICAgICBFbmRpYW5PdXRwdXQgbUVuZGlhbk91dDsKKworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX0ROR19VVElMU19IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9FbmRpYW5VdGlscy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0VuZGlhblV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5YmUxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9FbmRpYW5VdGlscy5oCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19FTkRJQU5fVVRJTFMKKyNkZWZpbmUgSU1HX1VUSUxTX0VORElBTl9VVElMUworCisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIEVuZGlhbm5lc3MgdHlwZXMgc3VwcG9ydGVkLgorICovCitlbnVtIEFORFJPSURfQVBJIEVuZGlhbm5lc3MgeworICAgIFVOREVGSU5FRF9FTkRJQU4sIC8vIERlZmF1bHQgZW5kaWFubmVzcyB3aWxsIGJlIHVzZWQuCisgICAgQklHLAorICAgIExJVFRMRQorfTsKKworLyoqCisgKiBDb252ZXJ0IGZyb20gdGhlIG5hdGl2ZSBkZXZpY2UgZW5kaWFubmVzcyB0byBiaWcgZW5kaWFuLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCBjb252ZXJ0VG9CaWdFbmRpYW4oVCBpbik7CisKKy8qKgorICogQ29udmVydCBmcm9tIHRoZSBuYXRpdmUgZGV2aWNlIGVuZGlhbm5lc3MgdG8gbGl0dGxlIGVuZGlhbi4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgY29udmVydFRvTGl0dGxlRW5kaWFuKFQgaW4pOworCisvKioKKyAqIEEgdXRpbGl0eSBjbGFzcyBmb3Igd3JpdGluZyB0byBhbiBPdXRwdXQgd2l0aCB0aGUgZ2l2ZW4gZW5kaWFubmVzcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgRW5kaWFuT3V0cHV0IDogcHVibGljIE91dHB1dCB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogV3JhcCB0aGUgZ2l2ZW4gT3V0cHV0LiAgQ2FsbGluZyB3cml0ZSBtZXRob2RzIHdpbGwgcmVzdWx0IGluCisgICAgICAgICAqIHdyaXRlcyB0byB0aGlzIG91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIEVuZGlhbk91dHB1dChPdXRwdXQqIG91dCwgRW5kaWFubmVzcyBlbmQ9TElUVExFKTsKKworICAgICAgICB2aXJ0dWFsIH5FbmRpYW5PdXRwdXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbCBvcGVuIG9uIHRoZSB3cmFwcGVkIG91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsIGNsb3NlIG9uIHRoZSB3cmFwcGVkIG91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBlbmRpYW5uZXNzIHRvIHVzZSB3aGVuIHdyaXRpbmcuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0RW5kaWFubmVzcyhFbmRpYW5uZXNzIGVuZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgZW5kaWFubmVzcy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgRW5kaWFubmVzcyBnZXRFbmRpYW5uZXNzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY3VycmVudCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGlzIEVuZGlhbk91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q3VycmVudE9mZnNldCgpIGNvbnN0OworCisKKyAgICAgICAgLy8gVE9ETzogc3dpdGNoIHdyaXRlIG1ldGhvZHMgdG8gdWludDMyX3QgaW5zdGVhZCBvZiBzaXplX3QsCisgICAgICAgIC8vIHRoZSBtYXggc2l6ZSBvZiBhIFRJRkYgZmlsZXMgaXMgYm91bmRlZAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgd2lsbCB3cml0ZSBlbGVtZW50cyBmcm9tIGdpdmVuIGlucHV0IGJ1ZmZlciB0byB0aGUgb3V0cHV0LgorICAgICAgICAgKiBDb3VudCBlbGVtZW50cyBpbiB0aGUgYnVmZmVyIHdpbGwgYmUgd3JpdHRlbiB3aXRoIHRoZSBlbmRpYW5uZXNzIHNldCBmb3IgdGhpcworICAgICAgICAgKiBFbmRpYW5PdXRwdXQuICBJZiB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGF0IG1hbnkgZWxlbWVudHMgd2lsbAorICAgICAgICAgKiBiZSBza2lwcGVkIGluIHRoZSBidWZmZXIgYmVmb3JlIHdyaXRpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCBpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHVpbnQxNl90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCBpbnQxNl90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB1aW50MzJfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgaW50MzJfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDY0X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IGludDY0X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IGZsb2F0KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCBkb3VibGUqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgaW5saW5lIHN0YXR1c190IHdyaXRlSGVscGVyKGNvbnN0IFQqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB1aW50MzJfdCBtT2Zmc2V0OworICAgICAgICBPdXRwdXQqIG1PdXRwdXQ7CisgICAgICAgIEVuZGlhbm5lc3MgbUVuZGlhbjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZUhlbHBlcihjb25zdCBUKiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIGFzc2VydChvZmZzZXQgPD0gY291bnQpOworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKFQpOworICAgIHN3aXRjaChtRW5kaWFuKSB7CisgICAgICAgIGNhc2UgQklHOiB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gb2Zmc2V0OyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIFQgdG1wID0gY29udmVydFRvQmlnRW5kaWFuPFQ+KGJ1ZltvZmZzZXQgKyBpXSk7CisgICAgICAgICAgICAgICAgaWYgKChyZXMgPSBtT3V0cHV0LT53cml0ZShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmdG1wKSwgMCwgc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtT2Zmc2V0ICs9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIExJVFRMRTogeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IG9mZnNldDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBUIHRtcCA9IGNvbnZlcnRUb0xpdHRsZUVuZGlhbjxUPihidWZbb2Zmc2V0ICsgaV0pOworICAgICAgICAgICAgICAgIGlmICgocmVzID0gbU91dHB1dC0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnRtcCksIDAsIHNpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbU9mZnNldCArPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDhfdCBjb252ZXJ0VG9CaWdFbmRpYW4odWludDhfdCBpbikgeworICAgIHJldHVybiBpbjsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDhfdCBjb252ZXJ0VG9CaWdFbmRpYW4oaW50OF90IGluKSB7CisgICAgcmV0dXJuIGluOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDE2X3QgY29udmVydFRvQmlnRW5kaWFuKHVpbnQxNl90IGluKSB7CisgICAgcmV0dXJuIGh0b2JlMTYoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgaW50MTZfdCBjb252ZXJ0VG9CaWdFbmRpYW4oaW50MTZfdCBpbikgeworICAgIHJldHVybiBodG9iZTE2KGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQzMl90IGNvbnZlcnRUb0JpZ0VuZGlhbih1aW50MzJfdCBpbikgeworICAgIHJldHVybiBodG9iZTMyKGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDMyX3QgY29udmVydFRvQmlnRW5kaWFuKGludDMyX3QgaW4pIHsKKyAgICByZXR1cm4gaHRvYmUzMihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB1aW50NjRfdCBjb252ZXJ0VG9CaWdFbmRpYW4odWludDY0X3QgaW4pIHsKKyAgICByZXR1cm4gaHRvYmU2NChpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQ2NF90IGNvbnZlcnRUb0JpZ0VuZGlhbihpbnQ2NF90IGluKSB7CisgICAgcmV0dXJuIGh0b2JlNjQoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDhfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4odWludDhfdCBpbikgeworICAgIHJldHVybiBpbjsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDhfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4oaW50OF90IGluKSB7CisgICAgcmV0dXJuIGluOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDE2X3QgY29udmVydFRvTGl0dGxlRW5kaWFuKHVpbnQxNl90IGluKSB7CisgICAgcmV0dXJuIGh0b2xlMTYoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgaW50MTZfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4oaW50MTZfdCBpbikgeworICAgIHJldHVybiBodG9sZTE2KGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQzMl90IGNvbnZlcnRUb0xpdHRsZUVuZGlhbih1aW50MzJfdCBpbikgeworICAgIHJldHVybiBodG9sZTMyKGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDMyX3QgY29udmVydFRvTGl0dGxlRW5kaWFuKGludDMyX3QgaW4pIHsKKyAgICByZXR1cm4gaHRvbGUzMihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB1aW50NjRfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4odWludDY0X3QgaW4pIHsKKyAgICByZXR1cm4gaHRvbGU2NChpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQ2NF90IGNvbnZlcnRUb0xpdHRsZUVuZGlhbihpbnQ2NF90IGluKSB7CisgICAgcmV0dXJuIGh0b2xlNjQoaW4pOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfRU5ESUFOX1VUSUxTKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVJbnB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVJbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNGYyMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRmlsZUlucHV0LmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfRklMRV9JTlBVVF9ICisjZGVmaW5lIElNR19VVElMU19GSUxFX0lOUFVUX0gKKworI2luY2x1ZGUgPGltZ191dGlscy9JbnB1dC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHJlYWRpbmcgZnJvbSBhIGZpbGUuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIEZpbGVJbnB1dCA6IHB1YmxpYyBJbnB1dCB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgZmlsZSBpbnB1dCBmb3IgdGhlIGdpdmVuIHBhdGguCisgICAgICAgICAqLworICAgICAgICBGaWxlSW5wdXQoU3RyaW5nOCBwYXRoKTsKKworICAgICAgICB2aXJ0dWFsIH5GaWxlSW5wdXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3BlbiBhIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgcGF0aCBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYWQgYnl0ZXMgZnJvbSB0aGUgZmlsZSBpbnRvIHRoZSBnaXZlbiBidWZmZXIuICBBdCBtb3N0LCB0aGUgbnVtYmVyCisgICAgICAgICAqIG9mIGJ5dGVzIGdpdmVuIGluIHRoZSBjb3VudCBhcmd1bWVudCB3aWxsIGJlIHJlYWQuICBCeXRlcyB3aWxsIGJlIHdyaXR0ZW4KKyAgICAgICAgICogaW50byB0aGUgZ2l2ZW4gYnVmZmVyIHN0YXJ0aW5nIGF0IHRoZSBpbmRleCBnaXZlbiBpbiB0aGUgb2Zmc2V0IGFyZ3VtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgTk9UX0VOT1VHSF9EQVRBIGlmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuICBJZiBhbgorICAgICAgICAgKiBlcnJvciBoYXMgb2NjdXJyZWQsIHRoaXMgd2lsbCByZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyIHRoYW4gTk9UX0VOT1VHSF9EQVRBLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWQodWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBwYXRoIGdpdmVuIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgRklMRSAqbUZwOworICAgICAgICBTdHJpbmc4IG1QYXRoOworICAgICAgICBib29sIG1PcGVuOworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworCisjZW5kaWYgLypJTUdfVVRJTFNfSU5QVVRfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRmlsZU91dHB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDViZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVPdXRwdXQuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19GSUxFX09VVFBVVF9ICisjZGVmaW5lIElNR19VVElMU19GSUxFX09VVFBVVF9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitjbGFzcyBBTkRST0lEX0FQSSBGaWxlT3V0cHV0IDogcHVibGljIE91dHB1dCB7CisgICAgcHVibGljOgorICAgICAgICBGaWxlT3V0cHV0KFN0cmluZzggcGF0aCk7CisgICAgICAgIHZpcnR1YWwgfkZpbGVPdXRwdXQoKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgRklMRSAqbUZwOworICAgICAgICBTdHJpbmc4IG1QYXRoOworICAgICAgICBib29sIG1PcGVuOworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX0ZJTEVfT1VUUFVUX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0lucHV0LmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvSW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTAzNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0lucHV0LmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfSU5QVVRfSAorI2RlZmluZSBJTUdfVVRJTFNfSU5QVVRfSAorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdXNlZCBhcyBhIHNvdXJjZSBvZiBieXRlcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgSW5wdXQgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+SW5wdXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3BlbiB0aGlzIElucHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWFkIGJ5dGVzIGludG8gdGhlIGdpdmVuIGJ1ZmZlci4gIEF0IG1vc3QsIHRoZSBudW1iZXIgb2YgYnl0ZXMgZ2l2ZW4gaW4gdGhlCisgICAgICAgICAqIGNvdW50IGFyZ3VtZW50IHdpbGwgYmUgcmVhZC4gIEJ5dGVzIHdpbGwgYmUgd3JpdHRlbiBpbnRvIHRoZSBnaXZlbiBidWZmZXIgc3RhcnRpbmcKKyAgICAgICAgICogYXQgdGhlIGluZGV4IGdpdmVuIGluIHRoZSBvZmZzZXQgYXJndW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciBOT1RfRU5PVUdIX0RBVEEgaWYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIElmIGFuCisgICAgICAgICAqIGVycm9yIGhhcyBvY2N1cnJlZCwgdGhpcyB3aWxsIHJldHVybiBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXIgdGhhbiBOT1RfRU5PVUdIX0RBVEEuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZCh1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTa2lwcyBieXRlcyBpbiB0aGUgaW5wdXQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBza2lwcGVkLCBvciBOT1RfRU5PVUdIX0RBVEEgaWYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIElmIGFuCisgICAgICAgICAqIGVycm9yIGhhcyBvY2N1cnJlZCwgdGhpcyB3aWxsIHJldHVybiBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXIgdGhhbiBOT1RfRU5PVUdIX0RBVEEuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNzaXplX3Qgc2tpcChzaXplX3QgY291bnQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbG9zZSB0aGUgSW5wdXQuICBJdCBpcyBub3QgdmFsaWQgdG8gY2FsbCBvcGVuIG9uIGEgcHJldmlvdXNseSBjbG9zZWQgSW5wdXQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworCisjZW5kaWYgLypJTUdfVVRJTFNfSU5QVVRfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvT3JkZXJhYmxlLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvT3JkZXJhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyNTNhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9PcmRlcmFibGUuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19PUkRFUkFCTEUKKyNkZWZpbmUgSU1HX1VUSUxTX09SREVSQUJMRQorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisjZGVmaW5lIENPTVBBUkVfREVGKG9wKSBcCitpbmxpbmUgYm9vbCBvcGVyYXRvciBvcCAoY29uc3QgT3JkZXJhYmxlJiBvcmRlcmFibGUpIGNvbnN0OworCisvKioKKyAqIFN1YmNsYXNzZXMgb2YgT3JkZXJhYmxlIGNhbiBiZSBjb21wYXJlZCBhbmQgc29ydGVkLiAgVGhpcyBpcworICogaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjcmVhdGUgc29ydGVkIGFycmF5cyBvZiBUSUZGIGVudHJpZXMKKyAqIGFuZCBJRkRzLgorICovCitjbGFzcyBBTkRST0lEX0FQSSBPcmRlcmFibGUgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfk9yZGVyYWJsZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wYXJpc29uIG9wZXJhdG90b3JzIGFyZSBiYXNlZCBvbiB0aGUgdmFsdWUgcmV0dXJuZWQKKyAgICAgICAgICogZnJvbSB0aGlzIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q29tcGFyYWJsZVZhbHVlKCkgY29uc3QgPSAwOworCisgICAgICAgIENPTVBBUkVfREVGKD4pCisgICAgICAgIENPTVBBUkVfREVGKDwpCisgICAgICAgIENPTVBBUkVfREVGKD49KQorICAgICAgICBDT01QQVJFX0RFRig8PSkKKyAgICAgICAgQ09NUEFSRV9ERUYoPT0pCisgICAgICAgIENPTVBBUkVfREVGKCE9KQorfTsKKworI3VuZGVmIENPTVBBUkVfREVGCisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19PUkRFUkFCTEUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL091dHB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL091dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmFlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvT3V0cHV0LmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfT1VUUFVUX0gKKyNkZWZpbmUgSU1HX1VUSUxTX09VVFBVVF9ICisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB1c2VkIHRvIG91dHB1dCBieXRlcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgT3V0cHV0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfk91dHB1dCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcGVuIHRoaXMgT3V0cHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBidWZmZXIuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGdpdmVuIGluIHRoZSBjb3VudAorICAgICAgICAgKiBhcmd1bWVudCB3aWxsIGJlIHdyaXR0ZW4uICBCeXRlcyB3aWxsIGJlIHdyaXR0ZW4gZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIHN0YXJ0aW5nCisgICAgICAgICAqIGF0IHRoZSBpbmRleCBnaXZlbiBpbiB0aGUgb2Zmc2V0IGFyZ3VtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvc2UgdGhpcyBPdXRwdXQuICBJdCBpcyBub3QgdmFsaWQgdG8gY2FsbCBvcGVuIG9uIGEgcHJldmlvdXNseSBjbG9zZWQgT3V0cHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19PVVRQVVRfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvUGFpci5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1BhaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjUxY2FjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1BhaXIuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19QQUlSX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1BBSVJfSAorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIEdlbmVyaWMgcGFpciB1dGlsaXR5IGNsYXNzLiAgTm90aGluZyBzcGVjaWFsIGhlcmUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEYsIHR5cGVuYW1lIFM+CitjbGFzcyBBTkRST0lEX0FQSSBQYWlyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEYgZmlyc3Q7CisgICAgICAgIFMgc2Vjb25kOworCisgICAgICAgIFBhaXIoKSB7fQorCisgICAgICAgIFBhaXIoY29uc3QgUGFpciYgbykgOiBmaXJzdChvLmZpcnN0KSwgc2Vjb25kKG8uc2Vjb25kKSB7fQorCisgICAgICAgIFBhaXIoY29uc3QgRiYgZiwgY29uc3QgUyYgcykgOiBmaXJzdChmKSwgc2Vjb25kKHMpIHt9Cit9OworCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfUEFJUl9IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9Tb3J0ZWRFbnRyeVZlY3Rvci5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1NvcnRlZEVudHJ5VmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1OWE4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9Tb3J0ZWRFbnRyeVZlY3Rvci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1NPUlRFRF9FTlRSWV9WRUNUT1JfSAorI2RlZmluZSBJTUdfVVRJTFNfU09SVEVEX0VOVFJZX1ZFQ1RPUl9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFN1YmNsYXNzIG9mIFNvcnRlZFZlY3RvciB0aGF0IGhhcyBiZWVuIGV4dGVuZGVkIHRvCisgKiBkbyBjb21wYXJpc29ucy9sb29rdXBzIGJhc2VkIG9uIHRoZSB0YWcgSUQgb2YgdGhlIGVudHJpZXMuCisgKi8KK2NsYXNzIFNvcnRlZEVudHJ5VmVjdG9yIDogcHVibGljIFNvcnRlZFZlY3RvcjxzcDxUaWZmRW50cnk+ID4geworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+U29ydGVkRW50cnlWZWN0b3IoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IHdpdGggdGhlIGdpdmVuIHRhZyBJRCwgb3IKKyAgICAgICAgICogLTEgaWYgbm9uZSBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICBzc2l6ZV90IGluZGV4T2ZUYWcodWludDE2X3QgdGFnKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbXBhcmUgdGFnIElELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBpbnQgZG9fY29tcGFyZShjb25zdCB2b2lkKiBsaHMsIGNvbnN0IHZvaWQqIHJocykgY29uc3Q7Cit9OworCisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19TT1JURURfRU5UUllfVkVDVE9SX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1N0cmlwU291cmNlLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvU3RyaXBTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWM2YjYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1N0cmlwU291cmNlLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfU1RSSVBfU09VUkNFX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1NUUklQX1NPVVJDRV9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBUaGlzIGNsYXNzIGFjdHMgYXMgYSBkYXRhIHNvdXJjZSBmb3Igc3RyaXBzIHNldCBpbiBhIFRpZmZJZmQuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIFN0cmlwU291cmNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflN0cmlwU291cmNlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIGNvdW50IGJ5dGVzIHRvIHRoZSBzdHJlYW0uCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvU3RyZWFtKE91dHB1dCYgc3RyZWFtLCB1aW50MzJfdCBjb3VudCkgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHNvdXJjZSBJRkQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldElmZCgpIGNvbnN0ID0gMDsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19TVFJJUF9TT1VSQ0VfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGFnRGVmaW5pdGlvbnMuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UYWdEZWZpbml0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YTc0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGFnRGVmaW5pdGlvbnMuaApAQCAtMCwwICsxLDEzOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfVEFHX0RFRklOSVRJT05fSAorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9UQUdfREVGSU5JVElPTl9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5Lmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBUYWcgZGVmaW5pdGlvbnMgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBzdGFuZGFyZCBUSUZGIGNvbXBhdGlibGUgdGFncy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgVGFnRGVmaW5pdGlvbiB7CisgICAgLy8gVGhlIHRhZyBuYW1lLgorICAgIGNvbnN0IGNoYXIqIHRhZ05hbWU7CisgICAgLy8gVGhlIHNwZWNpZmllZCB0YWcgSUQuCisgICAgY29uc3QgdWludDE2X3QgdGFnSWQ7CisgICAgLy8gVGhlIGRlZmF1bHQgdHlwZSBmb3IgdGhpcyB0YWcuICBUaGlzIG11c3QgYmUgYSB2YWxpZCBUSUZGIHR5cGUuCisgICAgY29uc3QgVGFnVHlwZSBkZWZhdWx0VHlwZTsKKyAgICAvLyBUaGUgZGVmYXVsdCBJbWFnZSBGaWxlIERpcmVjdG9yeSAoSUZEKSBmb3IgdGhpcyB0YWcuCisgICAgY29uc3QgdWludDMyX3QgZGVmYXVsdElmZDsKKyAgICAvLyBUaGUgdmFsaWQgY291bnQgZm9yIHRoaXMgdGFnLCBvciAwIGlmIHRoZSBjb3VudCBpcyBub3QgZml4ZWQuCisgICAgY29uc3QgdWludDMyX3QgZml4ZWRDb3VudDsKKyAgICAvLyBUaGUgZW5kaWFubmVzcyBvZiB0aGUgdGFnIHZhbHVlLCBvciBVTkRFRklORURfRU5ESUFOIGlmIHRoZXJlIGlzIG5vIGZpeGVkIGVuZGlhbgorICAgIGNvbnN0IEVuZGlhbm5lc3MgZml4ZWRFbmRpYW47Cit9IFRhZ0RlZmluaXRpb25fdDsKKworLyoqCisgKiBDb252ZW5pZW5jZSBkZWZpbmVzIGZvciB0YWcgaWRzLgorICovCitlbnVtIHsKKyAgICBUQUdfUkFXVE9QUkVWSUVXR0FJTiA9IDB4QzdBOHUsCisgICAgVEFHX05FV1JBV0lNQUdFRElHRVNUID0gMHhDN0E3dSwKKyAgICBUQUdfT1JJR0lOQUxERUZBVUxUQ1JPUFNJWkUgPSAweEM3OTN1LAorICAgIFRBR19PUklHSU5BTEJFU1RRVUFMSVRZRklOQUxTSVpFID0gMHhDNzkydSwKKyAgICBUQUdfT1JJR0lOQUxERUZBVUxURklOQUxTSVpFID0gMHhDNzkxdSwKKyAgICBUQUdfUFJPRklMRUhVRVNBVE1BUEVOQ09ESU5HID0gMHhDN0EzdSwKKyAgICBUQUdfUFJPRklMRUxPT0tUQUJMRUVOQ09ESU5HID0gMHhDN0E0dSwKKyAgICBUQUdfQkFTRUxJTkVFWFBPU1VSRU9GRlNFVCA9IDB4QzdBNXUsCisgICAgVEFHX0RFRkFVTFRCTEFDS1JFTkRFUiA9IDB4QzdBNnUsCisgICAgVEFHX0RFRkFVTFRVU0VSQ1JPUCA9IDB4QzdCNXUsCisgICAgVEFHX05PSVNFUFJPRklMRSA9IDB4Qzc2MXUsCisgICAgVEFHX09QQ09ERUxJU1QzID0gMHhDNzRFdSwKKyAgICBUQUdfT1BDT0RFTElTVDIgPSAweEM3NDF1LAorICAgIFRBR19PUENPREVMSVNUMSA9IDB4Qzc0MHUsCisgICAgVEFHX1BST0ZJTEVMT09LVEFCTEVEQVRBID0gMHhDNzI2dSwKKyAgICBUQUdfUFJPRklMRUxPT0tUQUJMRURJTVMgPSAweEM3MjV1LAorICAgIFRBR19ST1dJTlRFUkxFQVZFRkFDVE9SID0gMHhDNzFGdSwKKyAgICBUQUdfU1VCVElMRUJMT0NLU0laRSA9IDB4QzcxRXUsCisgICAgVEFHX09SSUdJTkFMUkFXRklMRURJR0VTVCA9IDB4QzcxRHUsCisgICAgVEFHX1JBV0lNQUdFRElHRVNUID0gMHhDNzFDdSwKKyAgICBUQUdfUFJFVklFV0RBVEVUSU1FID0gMHhDNzFCdSwKKyAgICBUQUdfUFJFVklFV0NPTE9SU1BBQ0UgPSAweEM3MUF1LAorICAgIFRBR19QUkVWSUVXU0VUVElOR1NESUdFU1QgPSAweEM3MTl1LAorICAgIFRBR19QUkVWSUVXU0VUVElOR1NOQU1FID0gMHhDNzE4dSwKKyAgICBUQUdfUFJFVklFV0FQUExJQ0FUSU9OVkVSU0lPTiA9IDB4QzcxN3UsCisgICAgVEFHX1BSRVZJRVdBUFBMSUNBVElPTk5BTUUgPSAweEM3MTZ1LAorICAgIFRBR19GT1JXQVJETUFUUklYMiA9IDB4QzcxNXUsCisgICAgVEFHX0ZPUldBUkRNQVRSSVgxID0gMHhDNzE0dSwKKyAgICBUQUdfUFJPRklMRUNPUFlSSUdIVCA9IDB4QzZGRXUsCisgICAgVEFHX1BST0ZJTEVFTUJFRFBPTElDWSA9IDB4QzZGRHUsCisgICAgVEFHX1BST0ZJTEVUT05FQ1VSVkUgPSAweEM2RkN1LAorICAgIFRBR19QUk9GSUxFSFVFU0FUTUFQREFUQTIgPSAweEM2RkJ1LAorICAgIFRBR19QUk9GSUxFSFVFU0FUTUFQREFUQTEgPSAweEM2RkF1LAorICAgIFRBR19QUk9GSUxFSFVFU0FUTUFQRElNUyA9IDB4QzZGOXUsCisgICAgVEFHX1BST0ZJTEVOQU1FID0gMHhDNkY4dSwKKyAgICBUQUdfTk9JU0VSRURVQ1RJT05BUFBMSUVEID0gMHhDNkY3dSwKKyAgICBUQUdfQVNTSE9UUFJPRklMRU5BTUUgPSAweEM2RjZ1LAorICAgIFRBR19FWFRSQUNBTUVSQVBST0ZJTEVTID0gMHhDNkY1dSwKKyAgICBUQUdfUFJPRklMRUNBTElCUkFUSU9OU0lHTkFUVVJFID0gMHhDNkY0dSwKKyAgICBUQUdfQ0FNRVJBQ0FMSUJSQVRJT05TSUdOQVRVUkUgPSAweEM2RjN1LAorICAgIFRBR19DT0xPUklNRVRSSUNSRUZFUkVOQ0UgPSAweEM2QkZ1LAorICAgIFRBR19DVVJSRU5UUFJFUFJPRklMRU1BVFJJWCA9IDB4QzY5MnUsCisgICAgVEFHX0NVUlJFTlRJQ0NQUk9GSUxFID0gMHhDNjkxdSwKKyAgICBUQUdfQVNTSE9UUFJFUFJPRklMRU1BVFJJWCA9IDB4QzY5MHUsCisgICAgVEFHX0FTU0hPVElDQ1BST0ZJTEUgPSAweEM2OEZ1LAorICAgIFRBR19NQVNLRURBUkVBUyA9IDB4QzY4RXUsCisgICAgVEFHX0FDVElWRUFSRUEgPSAweEM2OER1LAorICAgIFRBR19PUklHSU5BTFJBV0ZJTEVEQVRBID0gMHhDNjhDdSwKKyAgICBUQUdfT1JJR0lOQUxSQVdGSUxFTkFNRSA9IDB4QzY4QnUsCisgICAgVEFHX1JBV0RBVEFVTklRVUVJRCA9IDB4QzY1RHUsCisgICAgVEFHX01BS0VSTk9URVNBRkVUWSA9IDB4QzYzNXUsCisgICAgVEFHX0ROR1BSSVZBVEVEQVRBID0gMHhDNjM0dSwKKyAgICBUQUdfU0hBRE9XU0NBTEUgPSAweEM2MzN1LAorICAgIFRBR19BTlRJQUxJQVNTVFJFTkdUSCA9IDB4QzYzMnUsCisgICAgVEFHX0NIUk9NQUJMVVJSQURJVVMgPSAweEM2MzF1LAorICAgIFRBR19MRU5TSU5GTyA9IDB4QzYzMHUsCisgICAgVEFHX0NBTUVSQVNFUklBTE5VTUJFUiA9IDB4QzYyRnUsCisgICAgVEFHX0xJTkVBUlJFU1BPTlNFTElNSVQgPSAweEM2MkV1LAorICAgIFRBR19CQVlFUkdSRUVOU1BMSVQgPSAweEM2MkR1LAorICAgIFRBR19CQVNFTElORVNIQVJQTkVTUyA9IDB4QzYyQ3UsCisgICAgVEFHX0JBU0VMSU5FTk9JU0UgPSAweEM2MkJ1LAorICAgIFRBR19CQVNFTElORUVYUE9TVVJFID0gMHhDNjJBdSwKKyAgICBUQUdfQVNTSE9UV0hJVEVYWSA9IDB4QzYyOXUsCisgICAgVEFHX0FTU0hPVE5FVVRSQUwgPSAweEM2Mjh1LAorICAgIFRBR19BTkFMT0dCQUxBTkNFID0gMHhDNjI3dSwKKyAgICBUQUdfUkVEVUNUSU9OTUFUUklYMiA9IDB4QzYyNnUsCisgICAgVEFHX1JFRFVDVElPTk1BVFJJWDEgPSAweEM2MjV1LAorICAgIFRBR19DQU1FUkFDQUxJQlJBVElPTjIgPSAweEM2MjR1LAorICAgIFRBR19DQU1FUkFDQUxJQlJBVElPTjEgPSAweEM2MjN1LAorICAgIFRBR19DT0xPUk1BVFJJWDIgPSAweEM2MjJ1LAorICAgIFRBR19DT0xPUk1BVFJJWDEgPSAweEM2MjF1LAorICAgIFRBR19DQUxJQlJBVElPTklMTFVNSU5BTlQyID0gMHhDNjVCdSwKKyAgICBUQUdfQ0FMSUJSQVRJT05JTExVTUlOQU5UMSA9IDB4QzY1QXUsCisgICAgVEFHX0RFRkFVTFRDUk9QU0laRSA9IDB4QzYyMHUsCisgICAgVEFHX0RFRkFVTFRDUk9QT1JJR0lOID0gMHhDNjFGdSwKKyAgICBUQUdfQkVTVFFVQUxJVFlTQ0FMRSA9IDB4QzY1Q3UsCisgICAgVEFHX0RFRkFVTFRTQ0FMRSA9IDB4QzYxRXUsCisgICAgVEFHX1dISVRFTEVWRUwgPSAweEM2MUR1LAorICAgIFRBR19CTEFDS0xFVkVMREVMVEFWID0gMHhDNjFDdSwKKyAgICBUQUdfQkxBQ0tMRVZFTERFTFRBSCA9IDB4QzYxQnUsCisgICAgVEFHX0JMQUNLTEVWRUwgPSAweEM2MUF1LAorICAgIFRBR19CTEFDS0xFVkVMUkVQRUFURElNID0gMHhDNjE5dSwKKyAgICBUQUdfTElORUFSSVpBVElPTlRBQkxFID0gMHhDNjE4dSwKKyAgICBUQUdfQ0ZBTEFZT1VUID0gMHhDNjE3dSwKKyAgICBUQUdfQ0ZBUExBTkVDT0xPUiA9IDB4QzYxNnUsCisgICAgVEFHX0xPQ0FMSVpFRENBTUVSQU1PREVMID0gMHhDNjE1dSwKKyAgICBUQUdfVU5JUVVFQ0FNRVJBTU9ERUwgPSAweEM2MTR1LAorICAgIFRBR19ETkdCQUNLV0FSRFZFUlNJT04gPSAweEM2MTN1LAorICAgIFRBR19ETkdWRVJTSU9OID0gMHhDNjEydSwKKyAgICBUQUdfU1VCRklMRVRZUEUgPSAweDAwRkZ1LAorICAgIFRBR19ZUkVTT0xVVElPTiA9IDB4MDExQnUsCisgICAgVEFHX1hSRVNPTFVUSU9OID0gMHgwMTFBdSwKKyAgICBUQUdfVEhSRVNISE9MRElORyA9IDB4MDEwN3UsCisgICAgVEFHX1NUUklQT0ZGU0VUUyA9IDB4MDExMXUsCisgICAgVEFHX1NUUklQQllURUNPVU5UUyA9IDB4MDExN3UsCisgICAgVEFHX1NPRlRXQVJFID0gMHgwMTMxdSwKKyAgICBUQUdfU0FNUExFU1BFUlBJWEVMID0gMHgwMTE1dSwKKyAgICBUQUdfUk9XU1BFUlNUUklQID0gMHgwMTE2dSwKKyAgICBUQUdfUkVTT0xVVElPTlVOSVQgPSAweDAxMjh1LAorICAgIFRBR19QTEFOQVJDT05GSUdVUkFUSU9OID0gMHgwMTFDdSwKKyAgICBUQUdfUEhPVE9NRVRSSUNJTlRFUlBSRVRBVElPTiA9IDB4MDEwNnUsCisgICAgVEFHX09SSUVOVEFUSU9OID0gMHgwMTEydSwKKyAgICBUQUdfTkVXU1VCRklMRVRZUEUgPSAweDAwRkV1LAorICAgIFRBR19NT0RFTCA9IDB4MDExMHUsCisgICAgVEFHX01JTlNBTVBMRVZBTFVFID0gMHgwMTE4dSwKKyAgICBUQUdfTUFYU0FNUExFVkFMVUUgPSAweDAxMTl1LAorICAgIFRBR19NQUtFID0gMHgwMTBGdSwKKyAgICBUQUdfSU1BR0VXSURUSCA9IDB4MDEwMHUsCisgICAgVEFHX0lNQUdFTEVOR1RIID0gMHgwMTAxdSwKKyAgICBUQUdfSU1BR0VERVNDUklQVElPTiA9IDB4MDEwRXUsCisgICAgVEFHX0hPU1RDT01QVVRFUiA9IDB4MDEzQ3UsCisgICAgVEFHX0dSQVlSRVNQT05TRVVOSVQgPSAweDAxMjJ1LAorICAgIFRBR19HUkFZUkVTUE9OU0VDVVJWRSA9IDB4MDEyM3UsCisgICAgVEFHX0ZSRUVPRkZTRVRTID0gMHgwMTIwdSwKKyAgICBUQUdfRlJFRUJZVEVDT1VOVFMgPSAweDAxMjF1LAorICAgIFRBR19GSUxMT1JERVIgPSAweDAxMEF1LAorICAgIFRBR19FWFRSQVNBTVBMRVMgPSAweDAxNTJ1LAorICAgIFRBR19EQVRFVElNRSA9IDB4MDEzMnUsCisgICAgVEFHX0NPUFlSSUdIVCA9IDB4ODI5OHUsCisgICAgVEFHX0NPTVBSRVNTSU9OID0gMHgwMTAzdSwKKyAgICBUQUdfQ09MT1JNQVAgPSAweDAxNDB1LAorICAgIFRBR19DRUxMV0lEVEggPSAweDAxMDh1LAorICAgIFRBR19DRUxMTEVOR1RIID0gMHgwMTA5dSwKKyAgICBUQUdfQklUU1BFUlNBTVBMRSA9IDB4MDEwMnUsCisgICAgVEFHX0FSVElTVCA9IDB4MDEzQnUsCisgICAgVEFHX0VYSUZWRVJTSU9OID0gMHg5MDAwdSwKKyAgICBUQUdfQ0ZBUkVQRUFUUEFUVEVSTkRJTSA9IDB4ODI4RHUsCisgICAgVEFHX0RBVEVUSU1FT1JJR0lOQUwgPSAweDkwMDN1LAorICAgIFRBR19DRkFQQVRURVJOID0gMHg4MjhFdSwKKyAgICBUQUdfU1VCSUZEUyA9IDB4MDE0QXUsCisgICAgVEFHX1RJRkZFUFNUQU5EQVJESUQgPSAweDkyMTZ1LAorICAgIFRBR19FWFBPU1VSRVRJTUUgPSAweDgyOUF1LAorICAgIFRBR19JU09TUEVFRFJBVElOR1MgPSAweDg4Mjd1LAorICAgIFRBR19GT0NBTExFTkdUSCA9IDB4OTIwQXUsCisgICAgVEFHX0ZOVU1CRVIgPSAweDgyOUR1LAorICAgIFRBR19HUFNJTkZPID0gMHg4ODI1dSwKKyAgICBUQUdfR1BTVkVSU0lPTklEID0gMHgwdSwKKyAgICBUQUdfR1BTTEFUSVRVREVSRUYgPSAweDF1LAorICAgIFRBR19HUFNMQVRJVFVERSA9IDB4MnUsCisgICAgVEFHX0dQU0xPTkdJVFVERVJFRiA9IDB4M3UsCisgICAgVEFHX0dQU0xPTkdJVFVERSA9IDB4NHUsCisgICAgVEFHX0dQU1RJTUVTVEFNUCA9IDB4N3UsCisgICAgVEFHX0dQU0RBVEVTVEFNUCA9IDB4MDAxRHUsCit9OworCisvKioKKyAqIFRJRkZfRVBfVEFHX0RFRklOSVRJT05TIGNvbnRhaW5zIHRhZ3MgZGVmaW5lZCBpbiB0aGUgVElGRiBFUCBzcGVjCisgKi8KK2NvbnN0IFRhZ0RlZmluaXRpb25fdCBUSUZGX0VQX1RBR19ERUZJTklUSU9OU1tdID0gIHsKKyAgICB7IC8vIFBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24KKyAgICAgICAgIlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24iLAorICAgICAgICAweDAxMDZ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU3ViSWZkcworICAgICAgICAiU3ViSWZkcyIsCisgICAgICAgIDB4MDE0QXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENGQVBhdHRlcm4KKyAgICAgICAgIkNGQVBhdHRlcm4iLAorICAgICAgICAweDgyOEV1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDRkFSZXBlYXRQYXR0ZXJuRGltCisgICAgICAgICJDRkFSZXBlYXRQYXR0ZXJuRGltIiwKKyAgICAgICAgMHg4MjhEdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIERhdGVUaW1lT3JpZ2luYWwKKyAgICAgICAgIkRhdGVUaW1lT3JpZ2luYWwiLAorICAgICAgICAweDkwMDN1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDIwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFRpZmYvRVBTdGFuZGFyZElECisgICAgICAgICJUaWZmIiwKKyAgICAgICAgMHg5MjE2dSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRXhwb3N1cmVUaW1lCisgICAgICAgICJFeHBvc3VyZVRpbWUiLAorICAgICAgICAweDgyOUF1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gSVNPU3BlZWRSYXRpbmdzCisgICAgICAgICJJU09TcGVlZFJhdGluZ3MiLAorICAgICAgICAweDg4Mjd1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRm9jYWxMZW5ndGgKKyAgICAgICAgIkZvY2FsTGVuZ3RoIiwKKyAgICAgICAgMHg5MjBBdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEZOdW1iZXIKKyAgICAgICAgIkZOdW1iZXIiLAorICAgICAgICAweDgyOUR1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR1BTSW5mbworICAgICAgICAiR1BTSW5mbyIsCisgICAgICAgIDB4ODgyNXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdQU1ZlcnNpb25JRAorICAgICAgICAiR1BTVmVyc2lvbklEIiwKKyAgICAgICAgMHgwdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR1BTTGF0aXR1ZGVSZWYKKyAgICAgICAgIkdQU0xhdGl0dWRlUmVmIiwKKyAgICAgICAgMHgxdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdQU0xhdGl0dWRlCisgICAgICAgICJHUFNMYXRpdHVkZSIsCisgICAgICAgIDB4MnUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMywKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNMb25naXR1ZGVSZWYKKyAgICAgICAgIkdQU0xvbmdpdHVkZVJlZiIsCisgICAgICAgIDB4M3UsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNMb25naXR1ZGUKKyAgICAgICAgIkdQU0xvbmdpdHVkZSIsCisgICAgICAgIDB4NHUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMywKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNUaW1lU3RhbXAKKyAgICAgICAgIkdQU1RpbWVTdGFtcCIsCisgICAgICAgIDB4N3UsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMywKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgLypUT0RPOiBSZW1haW5pbmcgVElGRiBFUCB0YWdzKi8KK307CisKKy8qKgorICogRVhJRl8yXzNfVEFHX0RFRklOSVRJT05TIGNvbnRhaW5zIHRhZ3MgZGVmaW5lZCBpbiB0aGUgSmVpdGEgRVhJRiAyLjMgc3BlYworICovCitjb25zdCBUYWdEZWZpbml0aW9uX3QgRVhJRl8yXzNfVEFHX0RFRklOSVRJT05TW10gPSB7CisgICAgeyAvLyBFeGlmVmVyc2lvbgorICAgICAgICAiRXhpZlZlcnNpb24iLAorICAgICAgICAweDkwMDB1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIElGRF8wLAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdQU0RhdGVTdGFtcAorICAgICAgICAiR1BTRGF0ZVN0YW1wIiwKKyAgICAgICAgMHgwMDFEdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAxMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgLypUT0RPOiBSZW1haW5pbmcgRVhJRiAyLjMgdGFncyovCit9OworCisvKioKKyAqIFRJRkZfNl9UQUdfREVGSU5JVElPTlMgY29udGFpbnMgdGFncyBkZWZpbmVkIGluIHRoZSBUSUZGIDYuMCBzcGVjCisgKi8KK2NvbnN0IFRhZ0RlZmluaXRpb25fdCBUSUZGXzZfVEFHX0RFRklOSVRJT05TW10gPSB7CisgICAgeyAvLyBTdWJGaWxlVHlwZQorICAgICAgICAiU3ViRmlsZVR5cGUiLAorICAgICAgICAweDAwRkZ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQXJ0aXN0CisgICAgICAgICJBcnRpc3QiLAorICAgICAgICAweDAxM0J1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQml0c1BlclNhbXBsZQorICAgICAgICAiQml0c1BlclNhbXBsZSIsCisgICAgICAgIDB4MDEwMnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDZWxsTGVuZ3RoCisgICAgICAgICJDZWxsTGVuZ3RoIiwKKyAgICAgICAgMHgwMTA5dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENlbGxXaWR0aAorICAgICAgICAiQ2VsbFdpZHRoIiwKKyAgICAgICAgMHgwMTA4dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENvbG9yTWFwCisgICAgICAgICJDb2xvck1hcCIsCisgICAgICAgIDB4MDE0MHUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDb21wcmVzc2lvbgorICAgICAgICAiQ29tcHJlc3Npb24iLAorICAgICAgICAweDAxMDN1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ29weXJpZ2h0CisgICAgICAgICJDb3B5cmlnaHQiLAorICAgICAgICAweDgyOTh1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRGF0ZVRpbWUKKyAgICAgICAgIkRhdGVUaW1lIiwKKyAgICAgICAgMHgwMTMydSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAyMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBFeHRyYVNhbXBsZXMKKyAgICAgICAgIkV4dHJhU2FtcGxlcyIsCisgICAgICAgIDB4MDE1MnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBGaWxsT3JkZXIKKyAgICAgICAgIkZpbGxPcmRlciIsCisgICAgICAgIDB4MDEwQXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBGcmVlQnl0ZUNvdW50cworICAgICAgICAiRnJlZUJ5dGVDb3VudHMiLAorICAgICAgICAweDAxMjF1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBGcmVlT2Zmc2V0cworICAgICAgICAiRnJlZU9mZnNldHMiLAorICAgICAgICAweDAxMjB1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHcmF5UmVzcG9uc2VDdXJ2ZQorICAgICAgICAiR3JheVJlc3BvbnNlQ3VydmUiLAorICAgICAgICAweDAxMjN1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR3JheVJlc3BvbnNlVW5pdAorICAgICAgICAiR3JheVJlc3BvbnNlVW5pdCIsCisgICAgICAgIDB4MDEyMnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBIb3N0Q29tcHV0ZXIKKyAgICAgICAgIkhvc3RDb21wdXRlciIsCisgICAgICAgIDB4MDEzQ3UsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBJbWFnZURlc2NyaXB0aW9uCisgICAgICAgICJJbWFnZURlc2NyaXB0aW9uIiwKKyAgICAgICAgMHgwMTBFdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEltYWdlTGVuZ3RoCisgICAgICAgICJJbWFnZUxlbmd0aCIsCisgICAgICAgIDB4MDEwMXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEltYWdlV2lkdGgKKyAgICAgICAgIkltYWdlV2lkdGgiLAorICAgICAgICAweDAxMDB1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBNYWtlCisgICAgICAgICJNYWtlIiwKKyAgICAgICAgMHgwMTBGdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE1heFNhbXBsZVZhbHVlCisgICAgICAgICJNYXhTYW1wbGVWYWx1ZSIsCisgICAgICAgIDB4MDExOXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBNaW5TYW1wbGVWYWx1ZQorICAgICAgICAiTWluU2FtcGxlVmFsdWUiLAorICAgICAgICAweDAxMTh1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gTW9kZWwKKyAgICAgICAgIk1vZGVsIiwKKyAgICAgICAgMHgwMTEwdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE5ld1N1YmZpbGVUeXBlCisgICAgICAgICJOZXdTdWJmaWxlVHlwZSIsCisgICAgICAgIDB4MDBGRXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9yaWVudGF0aW9uCisgICAgICAgICJPcmllbnRhdGlvbiIsCisgICAgICAgIDB4MDExMnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQaG90b01ldHJpY0ludGVycHJldGF0aW9uCisgICAgICAgICJQaG90b01ldHJpY0ludGVycHJldGF0aW9uIiwKKyAgICAgICAgMHgwMTA2dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFBsYW5hckNvbmZpZ3VyYXRpb24KKyAgICAgICAgIlBsYW5hckNvbmZpZ3VyYXRpb24iLAorICAgICAgICAweDAxMUN1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUmVzb2x1dGlvblVuaXQKKyAgICAgICAgIlJlc29sdXRpb25Vbml0IiwKKyAgICAgICAgMHgwMTI4dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJvd3NQZXJTdHJpcAorICAgICAgICAiUm93c1BlclN0cmlwIiwKKyAgICAgICAgMHgwMTE2dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU2FtcGxlc1BlclBpeGVsCisgICAgICAgICJTYW1wbGVzUGVyUGl4ZWwiLAorICAgICAgICAweDAxMTV1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU29mdHdhcmUKKyAgICAgICAgIlNvZnR3YXJlIiwKKyAgICAgICAgMHgwMTMxdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFN0cmlwQnl0ZUNvdW50cworICAgICAgICAiU3RyaXBCeXRlQ291bnRzIiwKKyAgICAgICAgMHgwMTE3dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU3RyaXBPZmZzZXRzCisgICAgICAgICJTdHJpcE9mZnNldHMiLAorICAgICAgICAweDAxMTF1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBTdWJmaWxlVHlwZQorICAgICAgICAiU3ViZmlsZVR5cGUiLAorICAgICAgICAweDAwRkZ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gVGhyZXNoaG9sZGluZworICAgICAgICAiVGhyZXNoaG9sZGluZyIsCisgICAgICAgIDB4MDEwN3UsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBYUmVzb2x1dGlvbgorICAgICAgICAiWFJlc29sdXRpb24iLAorICAgICAgICAweDAxMUF1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gWVJlc29sdXRpb24KKyAgICAgICAgIllSZXNvbHV0aW9uIiwKKyAgICAgICAgMHgwMTFCdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKK307CisKKy8qKgorICogRE5HX1RBR19ERUZJTklUSU9OUyBjb250YWlucyB0YWdzIGRlZmluZWQgaW4gdGhlIERORyAxLjQgc3BlYworICovCitjb25zdCBUYWdEZWZpbml0aW9uX3QgRE5HX1RBR19ERUZJTklUSU9OU1tdID0geworICAgIHsgLy8gRE5HVmVyc2lvbgorICAgICAgICAiRE5HVmVyc2lvbiIsCisgICAgICAgIDB4QzYxMnUsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEROR0JhY2t3YXJkVmVyc2lvbgorICAgICAgICAiRE5HQmFja3dhcmRWZXJzaW9uIiwKKyAgICAgICAgMHhDNjEzdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gVW5pcXVlQ2FtZXJhTW9kZWwKKyAgICAgICAgIlVuaXF1ZUNhbWVyYU1vZGVsIiwKKyAgICAgICAgMHhDNjE0dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIExvY2FsaXplZENhbWVyYU1vZGVsCisgICAgICAgICJMb2NhbGl6ZWRDYW1lcmFNb2RlbCIsCisgICAgICAgIDB4QzYxNXUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDRkFQbGFuZUNvbG9yCisgICAgICAgICJDRkFQbGFuZUNvbG9yIiwKKyAgICAgICAgMHhDNjE2dSwKKyAgICAgICAgQllURSwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDRkFMYXlvdXQKKyAgICAgICAgIkNGQUxheW91dCIsCisgICAgICAgIDB4QzYxN3UsCisgICAgICAgIFNIT1JULAorICAgICAgICBSQVdfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIExpbmVhcml6YXRpb25UYWJsZQorICAgICAgICAiTGluZWFyaXphdGlvblRhYmxlIiwKKyAgICAgICAgMHhDNjE4dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQmxhY2tMZXZlbFJlcGVhdERpbQorICAgICAgICAiQmxhY2tMZXZlbFJlcGVhdERpbSIsCisgICAgICAgIDB4QzYxOXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBSQVdfSUZELAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJsYWNrTGV2ZWwKKyAgICAgICAgIkJsYWNrTGV2ZWwiLAorICAgICAgICAweEM2MUF1LAorICAgICAgICBMT05HLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJsYWNrTGV2ZWxEZWx0YUgKKyAgICAgICAgIkJsYWNrTGV2ZWxEZWx0YUgiLAorICAgICAgICAweEM2MUJ1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQmxhY2tMZXZlbERlbHRhVgorICAgICAgICAiQmxhY2tMZXZlbERlbHRhViIsCisgICAgICAgIDB4QzYxQ3UsCisgICAgICAgIFNSQVRJT05BTCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBXaGl0ZUxldmVsCisgICAgICAgICJXaGl0ZUxldmVsIiwKKyAgICAgICAgMHhDNjFEdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBEZWZhdWx0U2NhbGUKKyAgICAgICAgIkRlZmF1bHRTY2FsZSIsCisgICAgICAgIDB4QzYxRXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJlc3RRdWFsaXR5U2NhbGUKKyAgICAgICAgIkJlc3RRdWFsaXR5U2NhbGUiLAorICAgICAgICAweEM2NUN1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBEZWZhdWx0Q3JvcE9yaWdpbgorICAgICAgICAiRGVmYXVsdENyb3BPcmlnaW4iLAorICAgICAgICAweEM2MUZ1LAorICAgICAgICBMT05HLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIERlZmF1bHRDcm9wU2l6ZQorICAgICAgICAiRGVmYXVsdENyb3BTaXplIiwKKyAgICAgICAgMHhDNjIwdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDYWxpYnJhdGlvbklsbHVtaW5hbnQxCisgICAgICAgICJDYWxpYnJhdGlvbklsbHVtaW5hbnQxIiwKKyAgICAgICAgMHhDNjVBdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENhbGlicmF0aW9uSWxsdW1pbmFudDIKKyAgICAgICAgIkNhbGlicmF0aW9uSWxsdW1pbmFudDIiLAorICAgICAgICAweEM2NUJ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ29sb3JNYXRyaXgxCisgICAgICAgICJDb2xvck1hdHJpeDEiLAorICAgICAgICAweEM2MjF1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENvbG9yTWF0cml4MgorICAgICAgICAiQ29sb3JNYXRyaXgyIiwKKyAgICAgICAgMHhDNjIydSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDYW1lcmFDYWxpYnJhdGlvbjEKKyAgICAgICAgIkNhbWVyYUNhbGlicmF0aW9uMSIsCisgICAgICAgIDB4QzYyM3UsCisgICAgICAgIFNSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ2FtZXJhQ2FsaWJyYXRpb24yCisgICAgICAgICJDYW1lcmFDYWxpYnJhdGlvbjIiLAorICAgICAgICAweEM2MjR1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJlZHVjdGlvbk1hdHJpeDEKKyAgICAgICAgIlJlZHVjdGlvbk1hdHJpeDEiLAorICAgICAgICAweEM2MjV1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJlZHVjdGlvbk1hdHJpeDIKKyAgICAgICAgIlJlZHVjdGlvbk1hdHJpeDIiLAorICAgICAgICAweEM2MjZ1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFuYWxvZ0JhbGFuY2UKKyAgICAgICAgIkFuYWxvZ0JhbGFuY2UiLAorICAgICAgICAweEM2Mjd1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQXNTaG90TmV1dHJhbAorICAgICAgICAiQXNTaG90TmV1dHJhbCIsCisgICAgICAgIDB4QzYyOHUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBBc1Nob3RXaGl0ZVhZCisgICAgICAgICJBc1Nob3RXaGl0ZVhZIiwKKyAgICAgICAgMHhDNjI5dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJhc2VsaW5lRXhwb3N1cmUKKyAgICAgICAgIkJhc2VsaW5lRXhwb3N1cmUiLAorICAgICAgICAweEM2MkF1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJhc2VsaW5lTm9pc2UKKyAgICAgICAgIkJhc2VsaW5lTm9pc2UiLAorICAgICAgICAweEM2MkJ1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQmFzZWxpbmVTaGFycG5lc3MKKyAgICAgICAgIkJhc2VsaW5lU2hhcnBuZXNzIiwKKyAgICAgICAgMHhDNjJDdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJheWVyR3JlZW5TcGxpdAorICAgICAgICAiQmF5ZXJHcmVlblNwbGl0IiwKKyAgICAgICAgMHhDNjJEdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBMaW5lYXJSZXNwb25zZUxpbWl0CisgICAgICAgICJMaW5lYXJSZXNwb25zZUxpbWl0IiwKKyAgICAgICAgMHhDNjJFdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENhbWVyYVNlcmlhbE51bWJlcgorICAgICAgICAiQ2FtZXJhU2VyaWFsTnVtYmVyIiwKKyAgICAgICAgMHhDNjJGdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIExlbnNJbmZvCisgICAgICAgICJMZW5zSW5mbyIsCisgICAgICAgIDB4QzYzMHUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgNCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDaHJvbWFCbHVyUmFkaXVzCisgICAgICAgICJDaHJvbWFCbHVyUmFkaXVzIiwKKyAgICAgICAgMHhDNjMxdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQW50aUFsaWFzU3RyZW5ndGgKKyAgICAgICAgIkFudGlBbGlhc1N0cmVuZ3RoIiwKKyAgICAgICAgMHhDNjMydSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU2hhZG93U2NhbGUKKyAgICAgICAgIlNoYWRvd1NjYWxlIiwKKyAgICAgICAgMHhDNjMzdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEROR1ByaXZhdGVEYXRhCisgICAgICAgICJETkdQcml2YXRlRGF0YSIsCisgICAgICAgIDB4QzYzNHUsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE1ha2VyTm90ZVNhZmV0eQorICAgICAgICAiTWFrZXJOb3RlU2FmZXR5IiwKKyAgICAgICAgMHhDNjM1dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJhd0RhdGFVbmlxdWVJRAorICAgICAgICAiUmF3RGF0YVVuaXF1ZUlEIiwKKyAgICAgICAgMHhDNjVEdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDE2LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9yaWdpbmFsUmF3RmlsZU5hbWUKKyAgICAgICAgIk9yaWdpbmFsUmF3RmlsZU5hbWUiLAorICAgICAgICAweEM2OEJ1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gT3JpZ2luYWxSYXdGaWxlRGF0YQorICAgICAgICAiT3JpZ2luYWxSYXdGaWxlRGF0YSIsCisgICAgICAgIDB4QzY4Q3UsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIEJJRworICAgIH0sCisgICAgeyAvLyBBY3RpdmVBcmVhCisgICAgICAgICJBY3RpdmVBcmVhIiwKKyAgICAgICAgMHhDNjhEdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgNCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBNYXNrZWRBcmVhcworICAgICAgICAiTWFza2VkQXJlYXMiLAorICAgICAgICAweEM2OEV1LAorICAgICAgICBMT05HLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFzU2hvdElDQ1Byb2ZpbGUKKyAgICAgICAgIkFzU2hvdElDQ1Byb2ZpbGUiLAorICAgICAgICAweEM2OEZ1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFzU2hvdFByZVByb2ZpbGVNYXRyaXgKKyAgICAgICAgIkFzU2hvdFByZVByb2ZpbGVNYXRyaXgiLAorICAgICAgICAweEM2OTB1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEN1cnJlbnRJQ0NQcm9maWxlCisgICAgICAgICJDdXJyZW50SUNDUHJvZmlsZSIsCisgICAgICAgIDB4QzY5MXUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ3VycmVudElDQ1Byb2ZpbGUKKyAgICAgICAgIkN1cnJlbnRJQ0NQcm9maWxlIiwKKyAgICAgICAgMHhDNjkxdSwKKyAgICAgICAgVU5ERUZJTkVELAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDdXJyZW50UHJlUHJvZmlsZU1hdHJpeAorICAgICAgICAiQ3VycmVudFByZVByb2ZpbGVNYXRyaXgiLAorICAgICAgICAweEM2OTJ1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENvbG9yaW1ldHJpY1JlZmVyZW5jZQorICAgICAgICAiQ29sb3JpbWV0cmljUmVmZXJlbmNlIiwKKyAgICAgICAgMHhDNkJGdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENhbWVyYUNhbGlicmF0aW9uU2lnbmF0dXJlCisgICAgICAgICJDYW1lcmFDYWxpYnJhdGlvblNpZ25hdHVyZSIsCisgICAgICAgIDB4QzZGM3UsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlQ2FsaWJyYXRpb25TaWduYXR1cmUKKyAgICAgICAgIlByb2ZpbGVDYWxpYnJhdGlvblNpZ25hdHVyZSIsCisgICAgICAgIDB4QzZGNHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBFeHRyYUNhbWVyYVByb2ZpbGVzCisgICAgICAgICJFeHRyYUNhbWVyYVByb2ZpbGVzIiwKKyAgICAgICAgMHhDNkY1dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQXNTaG90UHJvZmlsZU5hbWUKKyAgICAgICAgIkFzU2hvdFByb2ZpbGVOYW1lIiwKKyAgICAgICAgMHhDNkY2dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE5vaXNlUmVkdWN0aW9uQXBwbGllZAorICAgICAgICAiTm9pc2VSZWR1Y3Rpb25BcHBsaWVkIiwKKyAgICAgICAgMHhDNkY3dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZU5hbWUKKyAgICAgICAgIlByb2ZpbGVOYW1lIiwKKyAgICAgICAgMHhDNkY4dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVIdWVTYXRNYXBEaW1zCisgICAgICAgICJQcm9maWxlSHVlU2F0TWFwRGltcyIsCisgICAgICAgIDB4QzZGOXUsCisgICAgICAgIExPTkcsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAzLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVIdWVTYXRNYXBEYXRhMQorICAgICAgICAiUHJvZmlsZUh1ZVNhdE1hcERhdGExIiwKKyAgICAgICAgMHhDNkZBdSwKKyAgICAgICAgRkxPQVQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVIdWVTYXRNYXBEYXRhMgorICAgICAgICAiUHJvZmlsZUh1ZVNhdE1hcERhdGEyIiwKKyAgICAgICAgMHhDNkZCdSwKKyAgICAgICAgRkxPQVQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVUb25lQ3VydmUKKyAgICAgICAgIlByb2ZpbGVUb25lQ3VydmUiLAorICAgICAgICAweEM2RkN1LAorICAgICAgICBGTE9BVCwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUVtYmVkUG9saWN5CisgICAgICAgICJQcm9maWxlRW1iZWRQb2xpY3kiLAorICAgICAgICAweEM2RkR1LAorICAgICAgICBMT05HLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlQ29weXJpZ2h0CisgICAgICAgICJQcm9maWxlQ29weXJpZ2h0IiwKKyAgICAgICAgMHhDNkZFdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEZvcndhcmRNYXRyaXgxCisgICAgICAgICJGb3J3YXJkTWF0cml4MSIsCisgICAgICAgIDB4QzcxNHUsCisgICAgICAgIFNSQVRJT05BTCwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRm9yd2FyZE1hdHJpeDIKKyAgICAgICAgIkZvcndhcmRNYXRyaXgyIiwKKyAgICAgICAgMHhDNzE1dSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3QXBwbGljYXRpb25OYW1lCisgICAgICAgICJQcmV2aWV3QXBwbGljYXRpb25OYW1lIiwKKyAgICAgICAgMHhDNzE2dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIFBSRVZJRVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByZXZpZXdBcHBsaWNhdGlvblZlcnNpb24KKyAgICAgICAgIlByZXZpZXdBcHBsaWNhdGlvblZlcnNpb24iLAorICAgICAgICAweEM3MTd1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgUFJFVklFV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJldmlld1NldHRpbmdzTmFtZQorICAgICAgICAiUHJldmlld1NldHRpbmdzTmFtZSIsCisgICAgICAgIDB4QzcxOHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUkVWSUVXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3U2V0dGluZ3NEaWdlc3QKKyAgICAgICAgIlByZXZpZXdTZXR0aW5nc0RpZ2VzdCIsCisgICAgICAgIDB4QzcxOXUsCisgICAgICAgIEJZVEUsCisgICAgICAgIFBSRVZJRVdfSUZELAorICAgICAgICAxNiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3Q29sb3JTcGFjZQorICAgICAgICAiUHJldmlld0NvbG9yU3BhY2UiLAorICAgICAgICAweEM3MUF1LAorICAgICAgICBMT05HLAorICAgICAgICBQUkVWSUVXX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3RGF0ZVRpbWUKKyAgICAgICAgIlByZXZpZXdEYXRlVGltZSIsCisgICAgICAgIDB4QzcxQnUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUkVWSUVXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBSYXdJbWFnZURpZ2VzdAorICAgICAgICAiUmF3SW1hZ2VEaWdlc3QiLAorICAgICAgICAweEM3MUN1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMTYsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gT3JpZ2luYWxSYXdGaWxlRGlnZXN0CisgICAgICAgICJPcmlnaW5hbFJhd0ZpbGVEaWdlc3QiLAorICAgICAgICAweEM3MUR1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMTYsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU3ViVGlsZUJsb2NrU2l6ZQorICAgICAgICAiU3ViVGlsZUJsb2NrU2l6ZSIsCisgICAgICAgIDB4QzcxRXUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDIsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUm93SW50ZXJsZWF2ZUZhY3RvcgorICAgICAgICAiUm93SW50ZXJsZWF2ZUZhY3RvciIsCisgICAgICAgIDB4QzcxRnUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUxvb2tUYWJsZURpbXMKKyAgICAgICAgIlByb2ZpbGVMb29rVGFibGVEaW1zIiwKKyAgICAgICAgMHhDNzI1dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDMsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUxvb2tUYWJsZURhdGEKKyAgICAgICAgIlByb2ZpbGVMb29rVGFibGVEYXRhIiwKKyAgICAgICAgMHhDNzI2dSwKKyAgICAgICAgRkxPQVQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9wY29kZUxpc3QxCisgICAgICAgICJPcGNvZGVMaXN0MSIsCisgICAgICAgIDB4Qzc0MHUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgQklHCisgICAgfSwKKyAgICB7IC8vIE9wY29kZUxpc3QyCisgICAgICAgICJPcGNvZGVMaXN0MiIsCisgICAgICAgIDB4Qzc0MXUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgQklHCisgICAgfSwKKyAgICB7IC8vIE9wY29kZUxpc3QzCisgICAgICAgICJPcGNvZGVMaXN0MyIsCisgICAgICAgIDB4Qzc0RXUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgQklHCisgICAgfSwKKyAgICB7IC8vIE5vaXNlUHJvZmlsZQorICAgICAgICAiTm9pc2VQcm9maWxlIiwKKyAgICAgICAgMHhDNzYxdSwKKyAgICAgICAgRE9VQkxFLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIERlZmF1bHRVc2VyQ3JvcAorICAgICAgICAiRGVmYXVsdFVzZXJDcm9wIiwKKyAgICAgICAgMHhDN0I1dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRGVmYXVsdEJsYWNrUmVuZGVyCisgICAgICAgICJEZWZhdWx0QmxhY2tSZW5kZXIiLAorICAgICAgICAweEM3QTZ1LAorICAgICAgICBMT05HLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCYXNlbGluZUV4cG9zdXJlT2Zmc2V0CisgICAgICAgICJCYXNlbGluZUV4cG9zdXJlT2Zmc2V0IiwKKyAgICAgICAgMHhDN0E1dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVMb29rVGFibGVFbmNvZGluZworICAgICAgICAiUHJvZmlsZUxvb2tUYWJsZUVuY29kaW5nIiwKKyAgICAgICAgMHhDN0E0dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUh1ZVNhdE1hcEVuY29kaW5nCisgICAgICAgICJQcm9maWxlSHVlU2F0TWFwRW5jb2RpbmciLAorICAgICAgICAweEM3QTN1LAorICAgICAgICBMT05HLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcmlnaW5hbERlZmF1bHRGaW5hbFNpemUKKyAgICAgICAgIk9yaWdpbmFsRGVmYXVsdEZpbmFsU2l6ZSIsCisgICAgICAgIDB4Qzc5MXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9yaWdpbmFsQmVzdFF1YWxpdHlGaW5hbFNpemUKKyAgICAgICAgIk9yaWdpbmFsQmVzdFF1YWxpdHlGaW5hbFNpemUiLAorICAgICAgICAweEM3OTJ1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcmlnaW5hbERlZmF1bHRDcm9wU2l6ZQorICAgICAgICAiT3JpZ2luYWxEZWZhdWx0Q3JvcFNpemUiLAorICAgICAgICAweEM3OTN1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBOZXdSYXdJbWFnZURpZ2VzdAorICAgICAgICAiTmV3UmF3SW1hZ2VEaWdlc3QiLAorICAgICAgICAweEM3QTd1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMTYsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUmF3VG9QcmV2aWV3R2FpbgorICAgICAgICAiUmF3VG9QcmV2aWV3R2FpbiIsCisgICAgICAgIDB4QzdBOHUsCisgICAgICAgIERPVUJMRSwKKyAgICAgICAgUFJFVklFV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfVEFHX0RFRklOSVRJT05fSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkVudHJ5LmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkVudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2NzJiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmRW50cnkuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9FTlRSWQorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9FTlRSWQorCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9FbmRpYW5VdGlscy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworI2RlZmluZSBDT01QQVJFX0RFRihvcCkgXAoraW5saW5lIGJvb2wgb3BlcmF0b3Igb3AgKGNvbnN0IFRpZmZFbnRyeSYgZW50cnkpIGNvbnN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaG9sZHMgYSBzaW5nbGUgVElGRiBJRkQgZW50cnkuCisgKgorICogU3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gc3VwcG9ydCBhc3NpZ25tZW50IGFuZCBjb3B5aW5nIG9wZXJhdGlvbnMuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIFRpZmZFbnRyeSA6IHB1YmxpYyBUaWZmV3JpdGFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+VGlmZkVudHJ5KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIHRoZSAxMi1ieXRlIElGRCBlbnRyeSB0byB0aGUgb3V0cHV0LiBUaGUgZ2l2ZW4gb2Zmc2V0IHdpbGwgYmUKKyAgICAgICAgICogc2V0IGFzIHRoZSB0YWcgdmFsdWUgaWYgdGhlIHNpemUgb2YgdGhlIHRhZyB2YWx1ZSBleGNlZWRzIHRoZSBtYXgKKyAgICAgICAgICogc2l6ZSBmb3IgdGhlIFRJRkYgVmFsdWUgZmllbGQgKDQgYnl0ZXMpLCBhbmQgc2hvdWxkIGJlIHdvcmQgYWxpZ25lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUYWdJbmZvKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY291bnQgc2V0IGZvciB0aGlzIGVudHJ5LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBUSUZGIENvdW50CisgICAgICAgICAqIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRDb3VudCgpIGNvbnN0ID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0YWcgaWQgc2V0IGZvciB0aGlzIGVudHJ5LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBUSUZGIFRhZworICAgICAgICAgKiBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDE2X3QgZ2V0VGFnKCkgY29uc3QgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHR5cGUgc2V0IGZvciB0aGlzIGVudHJ5LiAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVElGRiBUeXBlCisgICAgICAgICAqIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBUYWdUeXBlIGdldFR5cGUoKSBjb25zdCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZGVmaW5lZCBlbmRpYW5uZXNzIGZvciB0aGlzIGVudHJ5LiAgSWYgdGhpcyBpcyBkZWZpbmVkLAorICAgICAgICAgKiB0aGUgdGFnIHZhbHVlIHdpbGwgYmUgd3JpdHRlbiB3aXRoIHRoZSBnaXZlbiBieXRlIG9yZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBFbmRpYW5uZXNzIGdldEVuZGlhbm5lc3MoKSBjb25zdCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoaXMgZW50cnkuICBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBUSUZGIFZhbHVlCisgICAgICAgICAqIGZpZWxkLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE5VTEwgaWYgdGhlIHZhbHVlIGlzIE5VTEwsIG9yIGlmIHRoZSB0eXBlIHVzZWQgZG9lcyBub3QKKyAgICAgICAgICogbWF0Y2ggdGhlIHR5cGUgb2YgdGhpcyB0YWcuCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBjb25zdCBUKiBnZXREYXRhKCkgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvcmNlIHRoZSB0eXBlIHVzZWQgaGVyZSB0byBiZSBhIHZhbGlkIFRJRkYgdHlwZS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBOVUxMIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBOVUxMLCBvciBpZiB0aGUgdHlwZSBnaXZlbiBkb2VzCisgICAgICAgICAqIG5vdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgZ2l2ZW4uCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgY29uc3QgVCogZm9yY2VWYWxpZFR5cGUoVGFnVHlwZSB0eXBlLCBjb25zdCBUKiB2YWx1ZSk7CisKKyAgICAgICAgdmlydHVhbCBjb25zdCB2b2lkKiBnZXREYXRhSGVscGVyKCkgY29uc3QgPSAwOworCisgICAgICAgIENPTVBBUkVfREVGKD4pCisgICAgICAgIENPTVBBUkVfREVGKDwpCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGVudW0geworICAgICAgICAgICAgTUFYX1BSSU5UX1NUUklOR19MRU5HVEggPSAyNTYKKyAgICAgICAgfTsKK307CisKKyNkZWZpbmUgQ09NUEFSRShvcCkgXAorYm9vbCBUaWZmRW50cnk6Om9wZXJhdG9yIG9wIChjb25zdCBUaWZmRW50cnkmIGVudHJ5KSBjb25zdCB7IFwKKyAgICByZXR1cm4gZ2V0Q29tcGFyYWJsZVZhbHVlKCkgb3AgZW50cnkuZ2V0Q29tcGFyYWJsZVZhbHVlKCk7IFwKK30KKworQ09NUEFSRSg+KQorQ09NUEFSRSg8KQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBUKiBUaWZmRW50cnk6OmdldERhdGEoKSBjb25zdCB7CisgICAgY29uc3QgVCogdmFsdWUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihnZXREYXRhSGVscGVyKCkpOworICAgIHJldHVybiBmb3JjZVZhbGlkVHlwZTxUPihnZXRUeXBlKCksIHZhbHVlKTsKK30KKworI3VuZGVmIENPTVBBUkUKKyN1bmRlZiBDT01QQVJFX0RFRgorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfVElGRl9FTlRSWSovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkVudHJ5SW1wbC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZFbnRyeUltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWNjYjVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZFbnRyeUltcGwuaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9FTlRSWV9JTVBMCisjZGVmaW5lIElNR19VVElMU19USUZGX0VOVFJZX0lNUEwKKworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSWZkLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZFbnRyeS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvRW5kaWFuVXRpbHMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBUaWZmRW50cnlJbXBsIDogcHVibGljIFRpZmZFbnRyeSB7CisgICAgcHVibGljOgorICAgICAgICBUaWZmRW50cnlJbXBsKHVpbnQxNl90IHRhZywgVGFnVHlwZSB0eXBlLCB1aW50MzJfdCBjb3VudCwgRW5kaWFubmVzcyBlbmQsIGNvbnN0IFQqIGRhdGEpOworICAgICAgICB2aXJ0dWFsIH5UaWZmRW50cnlJbXBsKCk7CisKKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVEYXRhKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdDsKKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVUYWdJbmZvKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdDsKKworICAgICAgICB1aW50MzJfdCBnZXRDb3VudCgpIGNvbnN0OworICAgICAgICB1aW50MTZfdCBnZXRUYWcoKSBjb25zdDsKKyAgICAgICAgVGFnVHlwZSBnZXRUeXBlKCkgY29uc3Q7CisgICAgICAgIEVuZGlhbm5lc3MgZ2V0RW5kaWFubmVzcygpIGNvbnN0OworICAgICAgICBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBnZXRDb21wYXJhYmxlVmFsdWUoKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgY29uc3Qgdm9pZCogZ2V0RGF0YUhlbHBlcigpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBnZXRBY3R1YWxTaXplKCkgY29uc3Q7CisKKyAgICAgICAgdWludDE2X3QgbVRhZzsKKyAgICAgICAgdWludDE2X3QgbVR5cGU7CisgICAgICAgIHVpbnQzMl90IG1Db3VudDsKKyAgICAgICAgRW5kaWFubmVzcyBtRW5kOworICAgICAgICBWZWN0b3I8VD4gbURhdGE7CisKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUaWZmRW50cnlJbXBsPFQ+OjpUaWZmRW50cnlJbXBsKHVpbnQxNl90IHRhZywgVGFnVHlwZSB0eXBlLCB1aW50MzJfdCBjb3VudCwgRW5kaWFubmVzcyBlbmQsCisgICAgICAgIGNvbnN0IFQqIGRhdGEpCisgICAgICAgIDogbVRhZyh0YWcpLCBtVHlwZShzdGF0aWNfY2FzdDx1aW50MTZfdD4odHlwZSkpLCBtQ291bnQoY291bnQpLCBtRW5kKGVuZCkgeworICAgIGNvdW50ID0gKHR5cGUgPT0gUkFUSU9OQUwgfHwgdHlwZSA9PSBTUkFUSU9OQUwpID8gY291bnQgKiAyIDogY291bnQ7CisgICAgc3NpemVfdCBpbmRleCA9IG1EYXRhLmFwcGVuZEFycmF5KGRhdGEsIGNvdW50KTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgdmVjdG9yIGZvciBkYXRhLiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUaWZmRW50cnlJbXBsPFQ+Ojp+VGlmZkVudHJ5SW1wbCgpIHt9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1aW50MzJfdCBUaWZmRW50cnlJbXBsPFQ+OjpnZXRDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvdW50OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordWludDE2X3QgVGlmZkVudHJ5SW1wbDxUPjo6Z2V0VGFnKCkgY29uc3QgeworICAgIHJldHVybiBtVGFnOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVGFnVHlwZSBUaWZmRW50cnlJbXBsPFQ+OjpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUYWdUeXBlPihtVHlwZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCB2b2lkKiBUaWZmRW50cnlJbXBsPFQ+OjpnZXREYXRhSGVscGVyKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihtRGF0YS5hcnJheSgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3NpemVfdCBUaWZmRW50cnlJbXBsPFQ+OjpnZXRTaXplKCkgY29uc3QgeworICAgIHVpbnQzMl90IHRvdGFsID0gZ2V0QWN0dWFsU2l6ZSgpOworICAgIFdPUkRfQUxJR04odG90YWwpCisgICAgcmV0dXJuICh0b3RhbCA8PSBPRkZTRVRfU0laRSkgPyAwIDogdG90YWw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1aW50MzJfdCBUaWZmRW50cnlJbXBsPFQ+OjpnZXRBY3R1YWxTaXplKCkgY29uc3QgeworICAgIHVpbnQzMl90IHRvdGFsID0gc2l6ZW9mKFQpICogbUNvdW50OworICAgIGlmIChnZXRUeXBlKCkgPT0gUkFUSU9OQUwgfHwgZ2V0VHlwZSgpID09IFNSQVRJT05BTCkgeworICAgICAgICAvLyAyIGludHMgc3RvcmVkIGZvciBlYWNoIHJhdGlvbmFsLCBtdWx0aXBseSBieSAyCisgICAgICAgIHRvdGFsIDw8PSAxOworICAgIH0KKyAgICByZXR1cm4gdG90YWw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFbmRpYW5uZXNzIFRpZmZFbnRyeUltcGw8VD46OmdldEVuZGlhbm5lc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1FbmQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1aW50MzJfdCBUaWZmRW50cnlJbXBsPFQ+OjpnZXRDb21wYXJhYmxlVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1UYWc7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0dXNfdCBUaWZmRW50cnlJbXBsPFQ+Ojp3cml0ZVRhZ0luZm8odWludDMyX3Qgb2Zmc2V0LCAvKm91dCovRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0IHsKKyAgICBhc3NlcnQoKG9mZnNldCAlIFRJRkZfV09SRF9TSVpFKSA9PSAwKTsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmbVRhZywgMCwgMSksIHJldCk7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJm1UeXBlLCAwLCAxKSwgcmV0KTsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmbUNvdW50LCAwLCAxKSwgcmV0KTsKKworICAgIHVpbnQzMl90IGRhdGFTaXplID0gZ2V0QWN0dWFsU2l6ZSgpOworICAgIGlmIChkYXRhU2l6ZSA+IE9GRlNFVF9TSVpFKSB7CisgICAgICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZvZmZzZXQsIDAsIDEpLCByZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gbUNvdW50OworICAgICAgICBpZiAoZ2V0VHlwZSgpID09IFJBVElPTkFMIHx8IGdldFR5cGUoKSA9PSBTUkFUSU9OQUwpIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmF0aW9uYWxzIGFyZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2YgaW50cy4gIEVhY2gKKyAgICAgICAgICAgICAqIHJhdGlvbmFsIGlzIHJlcHJlc2VudGVkIGJ5IDIgaW50cy4gIFRvIHJlY292ZXIgdGhlCisgICAgICAgICAgICAgKiBzaXplIG9mIHRoZSBhcnJheSBoZXJlLCBtdWx0aXBseSB0aGUgY291bnQgYnkgMi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY291bnQgPDw9IDE7CisgICAgICAgIH0KKyAgICAgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUobURhdGEuYXJyYXkoKSwgMCwgY291bnQpLCByZXQpOworICAgICAgICBaRVJPX1RJTExfV09SRChvdXQsIGRhdGFTaXplLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdHVzX3QgVGlmZkVudHJ5SW1wbDxUPjo6d3JpdGVEYXRhKHVpbnQzMl90IG9mZnNldCwgRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0IHsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKworICAgIC8vIFNvbWUgdGFncyBoYXZlIGZpeGVkLWVuZGlhbiB2YWx1ZSBvdXRwdXQKKyAgICBFbmRpYW5uZXNzIHRtcCA9IFVOREVGSU5FRF9FTkRJQU47CisgICAgaWYgKG1FbmQgIT0gVU5ERUZJTkVEX0VORElBTikgeworICAgICAgICB0bXAgPSBvdXQtPmdldEVuZGlhbm5lc3MoKTsKKyAgICAgICAgb3V0LT5zZXRFbmRpYW5uZXNzKG1FbmQpOworICAgIH0KKworICAgIHVpbnQzMl90IGNvdW50ID0gbUNvdW50OworICAgIGlmIChnZXRUeXBlKCkgPT0gUkFUSU9OQUwgfHwgZ2V0VHlwZSgpID09IFNSQVRJT05BTCkgeworICAgICAgICAvKioKKyAgICAgICAgICogUmF0aW9uYWxzIGFyZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2YgaW50cy4gIEVhY2gKKyAgICAgICAgICogcmF0aW9uYWwgaXMgcmVwcmVzZW50ZWQgYnkgMiBpbnRzLiAgVG8gcmVjb3ZlciB0aGUKKyAgICAgICAgICogc2l6ZSBvZiB0aGUgYXJyYXkgaGVyZSwgbXVsdGlwbHkgdGhlIGNvdW50IGJ5IDIuCisgICAgICAgICAqLworICAgICAgICBjb3VudCA8PD0gMTsKKyAgICB9CisKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZShtRGF0YS5hcnJheSgpLCAwLCBjb3VudCksIHJldCk7CisKKyAgICBpZiAobUVuZCAhPSBVTkRFRklORURfRU5ESUFOKSB7CisgICAgICAgIG91dC0+c2V0RW5kaWFubmVzcyh0bXApOworICAgIH0KKworICAgIC8vIFdyaXRlIHRvIG5leHQgd29yZCBhbGlnbm1lbnQKKyAgICBaRVJPX1RJTExfV09SRChvdXQsIHNpemVvZihUKSAqIGNvdW50LCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBzdGF0dXNfdCBUaWZmRW50cnlJbXBsPHNwPFRpZmZJZmQ+ID46OndyaXRlVGFnSW5mbyh1aW50MzJfdCBvZmZzZXQsCisgICAgICAgIC8qb3V0Ki9FbmRpYW5PdXRwdXQqIG91dCkgY29uc3QgeworICAgIGFzc2VydCgob2Zmc2V0ICUgVElGRl9XT1JEX1NJWkUpID09IDApOworICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZtVGFnLCAwLCAxKSwgcmV0KTsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmbVR5cGUsIDAsIDEpLCByZXQpOworICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZtQ291bnQsIDAsIDEpLCByZXQpOworCisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJm9mZnNldCwgMCwgMSksIHJldCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQzMl90IFRpZmZFbnRyeUltcGw8c3A8VGlmZklmZD4gPjo6Z2V0QWN0dWFsU2l6ZSgpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0b3RhbCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGF0YS5zaXplKCk7ICsraSkgeworICAgICAgICB0b3RhbCArPSBtRGF0YVtpXS0+Z2V0U2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gdG90YWw7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBzdGF0dXNfdCBUaWZmRW50cnlJbXBsPHNwPFRpZmZJZmQ+ID46OndyaXRlRGF0YSh1aW50MzJfdCBvZmZzZXQsIEVuZGlhbk91dHB1dCogb3V0KSBjb25zdCB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1Db3VudDsgKytpKSB7CisgICAgICAgIEJBSUxfT05fRkFJTChtRGF0YVtpXS0+d3JpdGVEYXRhKG9mZnNldCwgb3V0KSwgcmV0KTsKKyAgICAgICAgb2Zmc2V0ICs9IG1EYXRhW2ldLT5nZXRTaXplKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19USUZGX0VOVFJZX0lNUEwqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmSGVscGVycy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZIZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2OWU0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmSGVscGVycy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19USUZGX0hFTFBFUlNfSAorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9IRUxQRVJTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworY29uc3QgdWludDhfdCBaRVJPX1dPUkRbXSA9IHswLCAwLCAwLCAwfTsKKworI2RlZmluZSBCQUlMX09OX0ZBSUwoeCwgZmxhZykgXAorICAgIGlmICgoZmxhZyA9ICh4KSkgIT0gT0spIHJldHVybiBmbGFnOworCisjZGVmaW5lIEJZVEVTX1RJTExfV09SRChpbmRleCkgXAorICAgICgoVElGRl9XT1JEX1NJWkUgLSAoKGluZGV4KSAlIFRJRkZfV09SRF9TSVpFKSkgJSBUSUZGX1dPUkRfU0laRSkKKworI2RlZmluZSBXT1JEX0FMSUdOKGNvdW50KSBcCisgICAgY291bnQgKz0gQllURVNfVElMTF9XT1JEKGNvdW50KTsKKworI2RlZmluZSBaRVJPX1RJTExfV09SRChvdXRwdXQsIGluZGV4LCByZXQpIFwKKyAgICB7IFwKKyAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IEJZVEVTX1RJTExfV09SRChpbmRleCk7IFwKKyAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIHsgXAorICAgICAgICAgICAgQkFJTF9PTl9GQUlMKChvdXRwdXQpLT53cml0ZShaRVJPX1dPUkQsIDAsIHJlbWFpbmluZyksIHJldCk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisvKioKKyAqIEJhc2ljIFRJRkYgaGVhZGVyIGNvbnN0YW50cy4KKyAqLworZW51bSB7CisgICAgQkFEX09GRlNFVCA9IDAsCisgICAgVElGRl9XT1JEX1NJWkUgPSA0LCAvLyBTaXplIGluIGJ5dGVzCisgICAgSUZEX0hFQURFUl9TSVpFID0gMiwgLy8gU2l6ZSBpbiBieXRlcworICAgIElGRF9GT09URVJfU0laRSA9IDQsIC8vIFNpemUgaW4gYnl0ZXMKKyAgICBUSUZGX0VOVFJZX1NJWkUgPSAxMiwgLy8gU2l6ZSBpbiBieXRlcworICAgIE1BWF9JRkRfRU5UUklFUyA9IFVJTlQxNl9NQVgsCisgICAgRklMRV9IRUFERVJfU0laRSA9IDgsIC8vIFNpemUgaW4gYnl0ZXMKKyAgICBFTkRJQU5fTUFSS0VSX1NJWkUgPSAyLCAvLyBTaXplIGluIGJ5dGVzCisgICAgVElGRl9NQVJLRVJfU0laRSA9IDIsIC8vIFNpemUgaW4gYnl0ZXMKKyAgICBPRkZTRVRfTUFSS0VSX1NJWkUgPSA0LCAvLyBTaXplIGluIGJ5dGVzCisgICAgVElGRl9GSUxFX01BUktFUiA9IDQyLAorICAgIEJJR19FTkRJQU5fTUFSS0VSID0gMHg0RDREdSwKKyAgICBMSVRUTEVfRU5ESUFOX01BUktFUiA9IDB4NDk0OXUKK307CisKKy8qKgorICogQ29uc3RhbnRzIGZvciB0aGUgVElGRiB0YWcgdHlwZXMuCisgKi8KK2VudW0gVGFnVHlwZSB7CisgICAgVU5LTk9XTl9UQUdUWVBFID0gMCwKKyAgICBCWVRFPTEsCisgICAgQVNDSUksCisgICAgU0hPUlQsCisgICAgTE9ORywKKyAgICBSQVRJT05BTCwKKyAgICBTQllURSwKKyAgICBVTkRFRklORUQsCisgICAgU1NIT1JULAorICAgIFNMT05HLAorICAgIFNSQVRJT05BTCwKKyAgICBGTE9BVCwKKyAgICBET1VCTEUKK307CisKKy8qKgorICogU2l6ZXMgb2YgdGhlIFRJRkYgZW50cnkgZmllbGRzIChpbiBieXRlcykuCisgKi8KK2VudW0geworICAgIFRBR19TSVpFID0gMiwKKyAgICBUWVBFX1NJWkUgPSAyLAorICAgIENPVU5UX1NJWkUgPSA0LAorICAgIE9GRlNFVF9TSVpFID0gNAorfTsKKworLyoqCisgKiBDb252ZW5pZW5jZSBJRkQgaWQgY29uc3RhbnRzLgorICovCitlbnVtIHsKKyAgICBJRkRfMCA9IDAsCisgICAgUkFXX0lGRCwKKyAgICBQUk9GSUxFX0lGRCwKKyAgICBQUkVWSUVXX0lGRAorfTsKKworaW5saW5lIHNpemVfdCBnZXRUeXBlU2l6ZShUYWdUeXBlIHR5cGUpIHsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIFVOREVGSU5FRDoKKyAgICAgICAgY2FzZSBBU0NJSToKKyAgICAgICAgY2FzZSBCWVRFOgorICAgICAgICBjYXNlIFNCWVRFOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgU0hPUlQ6CisgICAgICAgIGNhc2UgU1NIT1JUOgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgY2FzZSBTTE9ORzoKKyAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICBjYXNlIFJBVElPTkFMOgorICAgICAgICBjYXNlIFNSQVRJT05BTDoKKyAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgICAgICByZXR1cm4gODsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworaW5saW5lIHVpbnQzMl90IGNhbGN1bGF0ZUlmZFNpemUoc2l6ZV90IG51bWJlck9mRW50cmllcykgeworICAgIHJldHVybiBJRkRfSEVBREVSX1NJWkUgKyBJRkRfRk9PVEVSX1NJWkUgKyBUSUZGX0VOVFJZX1NJWkUgKiBudW1iZXJPZkVudHJpZXM7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19USUZGX0hFTFBFUlNfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZklmZC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZJZmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWI1YzlhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZJZmQuaApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9JRkRfSAorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9JRkRfSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmRW50cnkuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1NvcnRlZEVudHJ5VmVjdG9yLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIGEgc2luZ2xlIFRJRkYgSW1hZ2UgRmlsZSBEaXJlY3RvcnkgKElGRCkgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgbWFwcyB0byB0aGUgVElGRiBJRkQgc3RydWN0dXJlIHRoYXQgaXMgbG9naWNhbGx5IGNvbXBvc2VkIG9mOgorICogLSBBIDItYnl0ZSBmaWVsZCBsaXN0aW5nIHRoZSBudW1iZXIgb2YgZW50cmllcy4KKyAqIC0gQSBsaXN0IG9mIDEyLWJ5dGUgVElGRiBlbnRyaWVzLgorICogLSBBIDQtYnl0ZSBvZmZzZXQgdG8gdGhlIG5leHQgSUZELgorICovCitjbGFzcyBBTkRST0lEX0FQSSBUaWZmSWZkIDogcHVibGljIFRpZmZXcml0YWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBUaWZmSWZkKHVpbnQzMl90IGlmZElkKTsKKyAgICAgICAgdmlydHVhbCB+VGlmZklmZCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBUaWZmRW50cnkgdG8gdGhpcyBJRkQgb3IgcmVwbGFjZSBhbiBleGlzdGluZyBlbnRyeSB3aXRoIHRoZQorICAgICAgICAgKiBzYW1lIHRhZyBJRC4gIE5vIHZhbGlkYXRpb24gaXMgZG9uZS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRW50cnkoY29uc3Qgc3A8VGlmZkVudHJ5PiYgZW50cnkpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgSUZELiAgVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBhIGxpbmtlZAorICAgICAgICAgKiBsaXN0IG9mIElGRHMgYXMgZGVmaW5lZCBieSB0aGUgVElGRiA2LjAgc3BlYy4sIGFuZCBpcyBub3QgaW5jbHVkZWQKKyAgICAgICAgICogd2hlbiBjYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBJRkQgYW5kIGVudHJpZXMgZm9yIHRoZSBnZXRTaXplKCkKKyAgICAgICAgICogbWV0aG9kICh1bmxpa2UgU3ViSUZEcykuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0TmV4dElmZChjb25zdCBzcDxUaWZmSWZkPiYgaWZkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IElGRCwgb3IgTlVMTCBpZiBub25lIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3A8VGlmZklmZD4gZ2V0TmV4dElmZCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgSUZEIGRhdGEuICBUaGlzIGluY2x1ZGVzIHRoZSBJRkQgaGVhZGVyLCBlbnRyaWVzLCBmb290ZXIsCisgICAgICAgICAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgKHJlY3Vyc2l2ZWx5IGluY2x1ZGluZworICAgICAgICAgKiBzdWItSUZEcykuICBUaGUgd3JpdHRlbiBhbW91bnQgc2hvdWxkIGVuZCBvbiBhIHdvcmQgYm91bmRhcnksIGFuZAorICAgICAgICAgKiB0aGUgZ2l2ZW4gb2Zmc2V0IHNob3VsZCBiZSB3b3JkIGFsaWduZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlRGF0YSh1aW50MzJfdCBvZmZzZXQsIC8qb3V0Ki9FbmRpYW5PdXRwdXQqIG91dCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgSUZELiBUaGlzIGluY2x1ZGVzIHRoZSBJRkQgaGVhZGVyLCBlbnRyaWVzLCBmb290ZXIsCisgICAgICAgICAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgKHJlY3Vyc2l2ZWx5IGluY2x1ZGluZworICAgICAgICAgKiBhbnkgc3ViLUlGRHMpLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGlkIG9mIHRoaXMgSUZELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRJZCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYW4gZW50cnkgd2l0aCB0aGUgZ2l2ZW4gdGFnIElELgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlIGVudHJ5IGlmIGl0IGV4aXN0cywgb3IgYW4gZW1wdHkgc3Ryb25nCisgICAgICAgICAqIHBvaW50ZXIuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNwPFRpZmZFbnRyeT4gZ2V0RW50cnkodWludDE2X3QgdGFnKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIHRoZSBlbnRyeSB3aXRoIHRoZSBnaXZlbiB0YWcgSUQgaWYgaXQgZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbW92ZUVudHJ5KHVpbnQxNl90IHRhZyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byB2YWxpZGF0ZSBhbmQgc2V0IHN0cmlwLXJlbGF0ZWQgaW1hZ2UgdGFncy4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBzZXRzIGFsbCBzdHJpcCByZWxhdGVkIHRhZ3MsIGJ1dCBsZWF2ZXMgb2Zmc2V0IHZhbHVlcyB1bml0aWFsaXplZC4KKyAgICAgICAgICogc2V0U3RyaXBPZmZzZXRzIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGRlc2lyZWQgb2Zmc2V0IGJlZm9yZSB3cml0aW5nLgorICAgICAgICAgKiBUaGUgc3RyaXAgdGFnIHZhbHVlcyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBleGlzdGluZyB0YWdzIGZvciBpbWFnZQorICAgICAgICAgKiBkaW1lbnNpb25zIGFuZCBwaXhlbCB0eXBlIHNldCBpbiB0aGUgSUZELgorICAgICAgICAgKgorICAgICAgICAgKiBEb2VzIG5vdCBoYW5kbGUgcGxhbmFyIGltYWdlIGNvbmZpZ3VyYXRpb25zIChQbGFuYXJDb25maWd1cmF0aW9uICE9IDEpLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdmFsaWRhdGVBbmRTZXRTdHJpcFRhZ3MoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHZhbGlkYXRlQW5kU2V0U3RyaXBUYWdzIGhhcyBiZWVuIGNhbGxlZCwgYnV0IG5vdCBzZXRTdHJpcE9mZnNldHMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIGJvb2wgdW5pbml0aWFsaXplZE9mZnNldHMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCBiZWdpbm5pbmcgb2Zmc2V0IGZvciBzdHJpcHMuCisgICAgICAgICAqCisgICAgICAgICAqIENhbGwgdGhpcyB0byB1cGRhdGUgdGhlIHN0cmlwIG9mZnNldHMgYmVmb3JlIGNhbGxpbmcgd3JpdGVEYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyaXBPZmZzZXQodWludDMyX3Qgb2Zmc2V0KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBzdHJpcHMgaW4gYnl0ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgc3VtcyB0aGUgYnl0ZSBjb3VudCBhdCBlYWNoIHN0cmlwIG9mZnNldCwgYW5kIHJldHVybnMKKyAgICAgICAgICogdGhlIHRvdGFsIGNvdW50IG9mIGJ5dGVzIHN0b3JlZCBpbiBzdHJpcHMgZm9yIHRoaXMgSUZELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJpcFNpemUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBJRkQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJpbnQgYSBmb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIElGRCB0byBsb2djYXQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGxvZygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdmFsdWUgdXNlZCB0byBkZXRlcm1pbmUgc29ydCBvcmRlci4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q29tcGFyYWJsZVZhbHVlKCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgY2hlY2tBbmRHZXRPZmZzZXQodWludDMyX3Qgb2Zmc2V0KSBjb25zdDsKKyAgICAgICAgU29ydGVkRW50cnlWZWN0b3IgbUVudHJpZXM7CisgICAgICAgIHNwPFRpZmZJZmQ+IG1OZXh0SWZkOworICAgICAgICB1aW50MzJfdCBtSWZkSWQ7CisgICAgICAgIGJvb2wgbVN0cmlwT2Zmc2V0c0luaXRpYWxpemVkOworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfSUZEX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MmNlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZldyaXRhYmxlLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9XUklUQUJMRQorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9XUklUQUJMRQorCisjaW5jbHVkZSA8aW1nX3V0aWxzL09yZGVyYWJsZS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9FbmRpYW5VdGlscy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVGlmZldyaXRhYmxlIHN1YmNsYXNzZXMgcmVwcmVzZW50IFRJRkYgbWV0YWRhdGEgb2JqZWN0cyB0aGF0IGNhbiBiZSB3cml0dGVuCisgKiB0byBhbiBFbmRpYW5PdXRwdXQgb2JqZWN0LiAgVGhpcyBpcyB1c2VkIGZvciBUSUZGIGVudHJpZXMgYW5kIElGRHMuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIFRpZmZXcml0YWJsZSA6IHB1YmxpYyBPcmRlcmFibGUsIHB1YmxpYyBMaWdodFJlZkJhc2U8VGlmZldyaXRhYmxlPiB7CisgICAgcHVibGljOgorICAgICAgICBUaWZmV3JpdGFibGUoKTsKKyAgICAgICAgdmlydHVhbCB+VGlmZldyaXRhYmxlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBvdXRwdXQuIFRoZSBnaXZlbiBvZmZzZXQgaXMgdXNlZCB0byBjYWxjdWxhdGUKKyAgICAgICAgICogdGhlIGhlYWRlciBvZmZzZXQgZm9yIHZhbHVlcyB3cml0dGVuLiAgVGhlIG9mZnNldCBpcyBkZWZpbmVkCisgICAgICAgICAqIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFRJRkYgaGVhZGVyLCBhbmQgaXMgd29yZCBhbGlnbmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZURhdGEodWludDMyX3Qgb2Zmc2V0LCAvKm91dCovRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0ID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBzaXplIG9mIHRoZSBkYXRhIHRvIHdyaXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0ID0gMDsKKworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfV1JJVEFCTEUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZXcml0ZXIuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhZjIzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmV3JpdGVyLmgKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfV1JJVEVSX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1RJRkZfV1JJVEVSX0gKKworI2luY2x1ZGUgPGltZ191dGlscy9FbmRpYW5VdGlscy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9TdHJpcFNvdXJjZS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmRW50cnlJbXBsLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RhZ0RlZmluaXRpb25zLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZJZmQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitjbGFzcyBUaWZmRW50cnk7CitjbGFzcyBUaWZmSWZkOworY2xhc3MgT3V0cHV0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIFRJRkYgSUZEcyB0aGF0IGNhbiBiZSB3cml0dGVuIGFzIGEKKyAqIGNvbXBsZXRlIERORyBmaWxlIGhlYWRlci4KKyAqCisgKiBUaGlzIG1hcHMgdG8gdGhlIFRJRkYgaGVhZGVyIHN0cnVjdHVyZSB0aGF0IGlzIGxvZ2ljYWxseSBjb21wb3NlZCBvZjoKKyAqIC0gQW4gOC1ieXRlIGZpbGUgaGVhZGVyIGNvbnRhaW5pbmcgYW4gZW5kaWFubmVzcyBpbmRpY2F0b3IsIHRoZSBUSUZGCisgKiAgIGZpbGUgbWFya2VyLCBhbmQgdGhlIG9mZnNldCB0byB0aGUgZmlyc3QgSUZELgorICogLSBBIGxpc3Qgb2YgVElGRiBJRkQgc3RydWN0dXJlcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgVGlmZldyaXRlciA6IHB1YmxpYyBMaWdodFJlZkJhc2U8VGlmZldyaXRlcj4geworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBTdWJJZmRUeXBlIHsKKyAgICAgICAgICAgIFNVQklGRCA9IDAsCisgICAgICAgICAgICBHUFNJTkZPCisgICAgICAgIH07CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBUaWZmV3JpdGVyIHdpdGggdGhlIGRlZmF1bHQgdGFnIG1hcHBpbmdzLiBUaGlzIGVuYWJsZXMKKyAgICAgICAgICogYWxsIG9mIHRoZSB0YWdzIGRlZmluZWQgaW4gVGFnRGVmaW5pdGlvbnMuaCwgYW5kIHVzZXMgdGhlIGZvbGxvd2luZworICAgICAgICAgKiBtYXBwaW5nIHByZWNlZGVuY2UgdG8gcmVzb2x2ZSBjb2xsaXNpb25zOgorICAgICAgICAgKiAoaGlnaGVzdCBwcmVjZWRlbmNlKSBUSUZGL0VQID4gRE5HID4gRVhJRiAyLjMgPiBUSUZGIDYuMAorICAgICAgICAgKi8KKyAgICAgICAgVGlmZldyaXRlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgVGlmZldyaXRlciB3aXRoIHRoZSBnaXZlbiB0YWcgbWFwcGluZ3MuICBUaGUgbWFwcGluZworICAgICAgICAgKiBwcmVjZWRlbmNlIHdpbGwgYmUgaW4gdGhlIG9yZGVyIHRoYXQgdGhlIGRlZmluaXRpb24gbWFwcyBhcmUgZ2l2ZW4sCisgICAgICAgICAqIHdoZXJlIHRoZSBsb3dlciBpbmRleCBtYXAgZ2V0cyBwcmVjZWRlbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHdpdGggdXNlci1kZWZpbmVkIGRlZmluaXRpb25zLCBvciBkZWZpbml0aW9ucyBmb3JtCisgICAgICAgICAqIFRhZ0RlZmluaXRpb25zLmgKKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGVuYWJsZWREZWZpbml0aW9ucyBtYXBwaW5nIG9iamVjdCBpcyBvd25lZCBieSB0aGUgY2FsbGVyLCBhbmQgbXVzdAorICAgICAgICAgKiBzdGF5IGFsaXZlIGZvciB0aGUgbGlmZXNwYW4gb2YgdGhlIGNvbnN0cnVjdGVkIFRpZmZXcml0ZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgVGlmZldyaXRlcihLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4qIGVuYWJsZWREZWZpbml0aW9ucywKKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKKworICAgICAgICB2aXJ0dWFsIH5UaWZmV3JpdGVyKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIGEgVElGRiBoZWFkZXIgY29udGFpbmluZyBlYWNoIElGRCBzZXQuICBUaGlzIHdpbGwgcmVjdXJzaXZlbHkKKyAgICAgICAgICogd3JpdGUgYWxsIFN1YklGRHMgYW5kIHRhZ3MuCisgICAgICAgICAqCisgICAgICAgICAqIEFueSBTdHJpcFNvdXJjZXMgcGFzc2VkIGluIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGFzIGltYWdlIHN0cmlwcworICAgICAgICAgKiBhdCB0aGUgYXBwcm9wcmlhdGUgb2ZmZXN0cy4gIFRoZSBTdHJpcEJ5dGVDb3VudHMsIFJvd3NQZXJTdHJpcCwgYW5kCisgICAgICAgICAqIFN0cmlwT2Zmc2V0cyB0YWdzIG11c3QgYmUgc2V0IHRvIHVzZSB0aGlzLiAgVG8gc2V0IHRoZXNlIHRhZ3MgaW4gYQorICAgICAgICAgKiBnaXZlbiBJRkQsIHVzZSB0aGUgYWRkU3RyaXAgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShPdXRwdXQqIG91dCwgU3RyaXBTb3VyY2UqKiBzb3VyY2VzLCBzaXplX3Qgc291cmNlc0NvdW50LAorICAgICAgICAgICAgICAgIEVuZGlhbm5lc3MgZW5kID0gTElUVExFKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGUgYSBUSUZGIGhlYWRlciBjb250YWluaW5nIGVhY2ggSUZEIHNldC4gIFRoaXMgd2lsbCByZWN1cnNpdmVseQorICAgICAgICAgKiB3cml0ZSBhbGwgU3ViSUZEcyBhbmQgdGFncy4KKyAgICAgICAgICoKKyAgICAgICAgICogSW1hZ2UgZGF0YSBmb3Igc3RyaXBzIG9yIHRpbGVzIG11c3QgYmUgd3JpdHRlbiBzZXBhcmF0ZWx5IGF0IHRoZQorICAgICAgICAgKiBhcHByb3ByaWF0ZSBvZmZzZXRzLiAgVGhlc2Ugb2Zmc2V0cyBtdXN0IG5vdCBmYWxsIHdpdGhpbiB0aGUgZmlsZQorICAgICAgICAgKiBoZWFkZXIgd3JpdHRlbiB0aGlzIHdheS4gIFRoZSBzaXplIG9mIHRoZSBoZWFkZXIgd3JpdHRlbiBpcyBnaXZlbgorICAgICAgICAgKiBieSB0aGUgZ2V0VG90YWxTaXplKCkgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShPdXRwdXQqIG91dCwgRW5kaWFubmVzcyBlbmQgPSBMSVRUTEUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgdGhlIFRJRkYgaGVhZGVyLiAgVGhpcyBpbmNsdWRlcyBhbGwKKyAgICAgICAgICogSUZEcywgdGFncywgYW5kIHZhbHVlcyBzZXQgZm9yIHRoaXMgVGlmZldyaXRlci4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0VG90YWxTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhbiBlbnRyeSB0byB0aGUgSUZEIHdpdGggdGhlIGdpdmVuIElELgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBWYWxpZAorICAgICAgICAgKiBlcnJvciBjb2RlcyBmb3IgdGhpcyBtZXRob2QgYXJlOgorICAgICAgICAgKiAtIEJBRF9JTkRFWCAtIFRoZSBnaXZlbiB0YWcgZG9lc24ndCBleGlzdC4KKyAgICAgICAgICogLSBCQURfVkFMVUUgLSBUaGUgZ2l2ZW4gY291bnQgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWlyZWQgY291bnQgZm9yCisgICAgICAgICAqICAgICAgICAgICAgICAgdGhpcyB0YWcuCisgICAgICAgICAqIC0gQkFEX1RZUEUgIC0gVGhlIHR5cGUgb2YgdGhlIGdpdmVuIGRhdGEgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgIHR5cGUgcmVxdWlyZWQgZm9yIHRoaXMgdGFnLgorICAgICAgICAgKiAtIE5BTUVfTk9UX0ZPVU5EIC0gTm8gaWZkIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRW50cnkoY29uc3Qgc3A8VGlmZkVudHJ5PiYgZW50cnksIHVpbnQzMl90IGlmZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGFuIGVudHJ5IGZvciBhIGtub3duIHRhZyBhbmQgYWRkIGl0IHRvIHRoZSBJRkQgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICAgICAqIFRoaXMgdGFnIG11c3QgYmUgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIGRlZmluaXRpb24gdmVjdG9ycyB0aGlzIFRJRkYgd3JpdGVyCisgICAgICAgICAqIHdhcyBjb25zdHJ1Y3RlZCB3aXRoLiBUaGUgY291bnQgYW5kIHR5cGUgYXJlIHZhbGlkYXRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4gVmFsaWQKKyAgICAgICAgICogZXJyb3IgY29kZXMgZm9yIHRoaXMgbWV0aG9kIGFyZToKKyAgICAgICAgICogLSBCQURfSU5ERVggLSBUaGUgZ2l2ZW4gdGFnIGRvZXNuJ3QgZXhpc3QuCisgICAgICAgICAqIC0gQkFEX1ZBTFVFIC0gVGhlIGdpdmVuIGNvdW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHJlcXVpcmVkIGNvdW50IGZvcgorICAgICAgICAgKiAgICAgICAgICAgICAgIHRoaXMgdGFnLgorICAgICAgICAgKiAtIEJBRF9UWVBFICAtIFRoZSB0eXBlIG9mIHRoZSBnaXZlbiBkYXRhIGlzbid0IGNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgICB0eXBlIHJlcXVpcmVkIGZvciB0aGlzIHRhZy4KKyAgICAgICAgICogLSBOQU1FX05PVF9GT1VORCAtIE5vIGlmZCBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0dXNfdCBhZGRFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBUKiBkYXRhLCB1aW50MzJfdCBpZmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZCBhbiBlbnRyeSBmb3IgYSBrbm93biB0YWcuICBUaGlzIHRhZyBtdXN0IGJlIG9uZSBvZiB0aGUgdGFncworICAgICAgICAgKiBkZWZpbmVkIGluIG9uZSBvZiB0aGUgZGVmaW5pdGlvbiB2ZWN0b3JzIHRoaXMgVElGRiB3cml0ZXIgd2FzIGNvbnN0cnVjdGVkCisgICAgICAgICAqIHdpdGguIFRoZSBjb3VudCBhbmQgdHlwZSBhcmUgdmFsaWRhdGVkLiBJZiB0aGlzIHN1Y2NlZWRzLCB0aGUgcmVzdWx0aW5nCisgICAgICAgICAqIGVudHJ5IHdpbGwgYmUgcGxhY2VkIGluIHRoZSBvdXRFbnRyeSBwb2ludGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBWYWxpZAorICAgICAgICAgKiBlcnJvciBjb2RlcyBmb3IgdGhpcyBtZXRob2QgYXJlOgorICAgICAgICAgKiAtIEJBRF9JTkRFWCAtIFRoZSBnaXZlbiB0YWcgZG9lc24ndCBleGlzdC4KKyAgICAgICAgICogLSBCQURfVkFMVUUgLSBUaGUgZ2l2ZW4gY291bnQgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWlyZWQgY291bnQgZm9yCisgICAgICAgICAqICAgICAgICAgICAgICAgdGhpcyB0YWcuCisgICAgICAgICAqIC0gQkFEX1RZUEUgIC0gVGhlIHR5cGUgb2YgdGhlIGdpdmVuIGRhdGEgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgIHR5cGUgcmVxdWlyZWQgZm9yIHRoaXMgdGFnLgorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdHVzX3QgYnVpbGRFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBUKiBkYXRhLAorICAgICAgICAgICAgICAgICAgLypvdXQqL3NwPFRpZmZFbnRyeT4qIG91dEVudHJ5KSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gc2V0IHRoZSBzdHJpcCByZWxhdGVkIHRhZ3MgZm9yIGEgZ2l2ZW4gSUZELgorICAgICAgICAgKgorICAgICAgICAgKiBDYWxsIHRoaXMgYmVmb3JlIHVzaW5nIGEgU3RyaXBTb3VyY2UgYXMgYW4gaW5wdXQgdG8gd3JpdGUuCisgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgdGFncyBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZDoKKyAgICAgICAgICogLSBJbWFnZVdpZHRoCisgICAgICAgICAqIC0gSW1hZ2VMZW5ndGgKKyAgICAgICAgICogLSBTYW1wbGVzUGVyUGl4ZWwKKyAgICAgICAgICogLSBCaXRzUGVyU2FtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJpcCh1aW50MzJfdCBpZmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIFRJRkYgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gdGFnIElEIGluIHRoZSBJRkQgd2l0aCB0aGUgZ2l2ZW4gSUQsCisgICAgICAgICAqIG9yIGFuIGVtcHR5IHBvaW50ZXIgaWYgbm9uZSBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNwPFRpZmZFbnRyeT4gZ2V0RW50cnkodWludDE2X3QgdGFnLCB1aW50MzJfdCBpZmQpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmUgdGhlIFRJRkYgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gdGFnIElEIGluIHRoZSBnaXZlbiBJRkQgaWYgaXQgZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbW92ZUVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgaWZkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIGVtcHR5IElGRCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAqIGxpc3Qgb2YgSUZEcy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkSWZkKHVpbnQzMl90IGlmZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBlbXB0eSBJRkQgd2l0aCB0aGUgZ2l2ZW4gSUQgYW5kIGFkZCBpdCBhcyBhIFN1YklmZCBvZiB0aGUKKyAgICAgICAgICogcGFyZW50IElGRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3ViSWZkKHVpbnQzMl90IHBhcmVudElmZCwgdWludDMyX3QgaWZkLCBTdWJJZmRUeXBlIHR5cGUgPSBTVUJJRkQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHR5cGUgZm9yIHRoZSBnaXZlbiB0YWcgSUQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIFRhZ1R5cGUgZ2V0RGVmYXVsdFR5cGUodWludDE2X3QgdGFnKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBjb3VudCBmb3IgYSBnaXZlbiB0YWcgSUQsIG9yIDAgaWYgdGhpcworICAgICAgICAgKiB0YWcgbm9ybWFsbHkgaGFzIGEgdmFyaWFibGUgY291bnQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERlZmF1bHRDb3VudCh1aW50MTZfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW4gSUZEIHdpdGggdGhlIGdpdmVuIElEIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgYm9vbCBoYXNJZmQodWludDMyX3QgaWZkKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIGEgZGVmaW5pdGlvbiBleGlzdCBmb3IgdGhlIGdpdmVuIHRhZyBJRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgYm9vbCBjaGVja0lmRGVmaW5lZCh1aW50MTZfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0YWcgaWYgYSBkZWZpbml0aW9uIGV4aXN0cyBmb3IgdGhlIGdpdmVuIHRhZworICAgICAgICAgKiBJRCwgb3IgbnVsbCBpZiBubyBkZWZpbml0aW9uIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogZ2V0VGFnTmFtZSh1aW50MTZfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcmludCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgSUZEcyBhbmQgZW50cmllcyB0byBsb2djYXQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGFuIGVudHJ5LiAgTm8gdmFsaWRhdGlvbiBpcyBkb25lLgorICAgICAgICAgKgorICAgICAgICAgKiBXQVJOSU5HOiBVc2luZyB0aGlzIG1ldGhvZCBjYW4gcmVzdWx0IGluIGNyZWF0aW5nIHBvb3JseSBmb3JtYXR0ZWQKKyAgICAgICAgICogVElGRiBmaWxlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBhIFRpZmZFbnRyeSB3aXRoIHRoZSBnaXZlbiB0YWcsIHR5cGUsIGNvdW50LCBlbmRpYW5uZXNzLAorICAgICAgICAgKiBhbmQgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyBzcDxUaWZmRW50cnk+IHVuY2hlY2tlZEJ1aWxkRW50cnkodWludDE2X3QgdGFnLCBUYWdUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwgRW5kaWFubmVzcyBlbmQsIGNvbnN0IFQqIGRhdGEpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGJ1aWxkIGF0YWctdG8tZGVmaW5pdGlvbiBtYXBwaW5nIGZyb20gYSBnaXZlbgorICAgICAgICAgKiBhcnJheSBvZiB0YWcgZGVmaW5pdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgS2V5ZWRWZWN0b3I8dWludDE2X3QsIGNvbnN0IFRhZ0RlZmluaXRpb25fdCo+IGJ1aWxkVGFnTWFwKAorICAgICAgICAgICAgICAgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9ucywgc2l6ZV90IGxlbmd0aCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGVudW0geworICAgICAgICAgICAgREVGQVVMVF9OVU1fVEFHX01BUFMgPSA0LAorICAgICAgICB9OworCisgICAgICAgIHNwPFRpZmZJZmQ+IGZpbmRMYXN0SWZkKCk7CisgICAgICAgIHN0YXR1c190IHdyaXRlRmlsZUhlYWRlcihFbmRpYW5PdXRwdXQmIG91dCk7CisgICAgICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogbG9va3VwRGVmaW5pdGlvbih1aW50MTZfdCB0YWcpIGNvbnN0OworICAgICAgICBzdGF0dXNfdCBjYWxjdWxhdGVPZmZzZXRzKCk7CisKKyAgICAgICAgc3A8VGlmZklmZD4gbUlmZDsKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIHNwPFRpZmZJZmQ+ID4gbU5hbWVkSWZkczsKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDE2X3QsIGNvbnN0IFRhZ0RlZmluaXRpb25fdCo+KiBtVGFnTWFwczsKKyAgICAgICAgc2l6ZV90IG1OdW1UYWdNYXBzOworCisgICAgICAgIHN0YXRpYyBLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4gc1RhZ01hcHNbXTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0dXNfdCBUaWZmV3JpdGVyOjpidWlsZEVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IFQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAvKm91dCovc3A8VGlmZkVudHJ5Piogb3V0RW50cnkpIGNvbnN0IHsKKyAgICBjb25zdCBUYWdEZWZpbml0aW9uX3QqIGRlZmluaXRpb24gPSBsb29rdXBEZWZpbml0aW9uKHRhZyk7CisKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gc3VjaCB0YWcgZXhpc3RzIGZvciBpZCAleC4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgdWludDMyX3QgZml4ZWRDb3VudCA9IGRlZmluaXRpb24tPmZpeGVkQ291bnQ7CisgICAgaWYgKGZpeGVkQ291bnQgPiAwICYmIGZpeGVkQ291bnQgIT0gY291bnQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNvdW50ICVkIGZvciB0YWcgJXggKGV4cGVjdHMgJWQpLiIsIF9fRlVOQ1RJT05fXywgY291bnQsIHRhZywKKyAgICAgICAgICAgICAgICBmaXhlZENvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBUYWdUeXBlIGZpeGVkVHlwZSA9IGRlZmluaXRpb24tPmRlZmF1bHRUeXBlOworICAgIGlmIChUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlKGZpeGVkVHlwZSwgZGF0YSkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgdHlwZSB1c2VkIGZvciB0YWcgdmFsdWUgZm9yIHRhZyAleC4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisKKyAgICAqb3V0RW50cnkgPSBuZXcgVGlmZkVudHJ5SW1wbDxUPih0YWcsIGZpeGVkVHlwZSwgY291bnQsCisgICAgICAgIGRlZmluaXRpb24tPmZpeGVkRW5kaWFuLCBkYXRhKTsKKworICAgIHJldHVybiBPSzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXR1c190IFRpZmZXcml0ZXI6OmFkZEVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IFQqIGRhdGEsIHVpbnQzMl90IGlmZCkgeworICAgIHNwPFRpZmZFbnRyeT4gb3V0RW50cnk7CisKKyAgICBzdGF0dXNfdCByZXQgPSBidWlsZEVudHJ5PFQ+KHRhZywgY291bnQsIGRhdGEsICZvdXRFbnRyeSk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBidWlsZCBlbnRyeSBmb3IgdGFnICV4LiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gYWRkRW50cnkob3V0RW50cnksIGlmZCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzcDxUaWZmRW50cnk+IFRpZmZXcml0ZXI6OnVuY2hlY2tlZEJ1aWxkRW50cnkodWludDE2X3QgdGFnLCBUYWdUeXBlIHR5cGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICBFbmRpYW5uZXNzIGVuZCwgY29uc3QgVCogZGF0YSkgeworICAgIFRpZmZFbnRyeUltcGw8VD4qIGVudHJ5ID0gbmV3IFRpZmZFbnRyeUltcGw8VD4odGFnLCB0eXBlLCBjb3VudCwgZW5kLCBkYXRhKTsKKyAgICByZXR1cm4gc3A8VGlmZkVudHJ5PihlbnRyeSk7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfV1JJVEVSX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9BbmRyb2lkLm1rIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzQ4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0FuZHJvaWQubWsKQEAgLTAsMCArMSw2MiBAQAorIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICBFbmRpYW5VdGlscy5jcHAgXAorICBGaWxlSW5wdXQuY3BwIFwKKyAgRmlsZU91dHB1dC5jcHAgXAorICBTb3J0ZWRFbnRyeVZlY3Rvci5jcHAgXAorICBJbnB1dC5jcHAgXAorICBPdXRwdXQuY3BwIFwKKyAgT3JkZXJhYmxlLmNwcCBcCisgIFRpZmZJZmQuY3BwIFwKKyAgVGlmZldyaXRhYmxlLmNwcCBcCisgIFRpZmZXcml0ZXIuY3BwIFwKKyAgVGlmZkVudHJ5LmNwcCBcCisgIFRpZmZFbnRyeUltcGwuY3BwIFwKKyAgQnl0ZUFycmF5T3V0cHV0LmNwcCBcCisgIERuZ1V0aWxzLmNwcCBcCisgIFN0cmlwU291cmNlLmNwcCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICBsaWJleHBhdCBcCisgIGxpYnV0aWxzIFwKKyAgbGliY3V0aWxzIFwKKyAgbGliY2FtZXJhX21ldGFkYXRhIFwKKyAgbGliY2FtZXJhX2NsaWVudAorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgJChMT0NBTF9QQVRIKS8uLi9pbmNsdWRlIFwKKyAgc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlCisKK0xPQ0FMX0NGTEFHUyArPSBcCisgIC1XYWxsIFwKKyAgLVdleHRyYSBcCisgIC1XZXJyb3IgXAorICAtZnZpc2liaWxpdHk9aGlkZGVuCisKK2lmbmVxICgkKGZpbHRlciB1c2VyZGVidWcgZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSwpCisgICAgIyBFbmFibGUgYXNzZXJ0KCkgaW4gZW5nIGJ1aWxkcworICAgIExPQ0FMX0NGTEFHUyArPSAtVU5ERUJVRyAtRExPR19OREVCVUc9MQorZW5kaWYKKworTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkvLi4vaW5jbHVkZQorCitMT0NBTF9NT0RVTEUgOj0gbGliaW1nX3V0aWxzCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvQnl0ZUFycmF5T3V0cHV0LmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvQnl0ZUFycmF5T3V0cHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjJkMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9CeXRlQXJyYXlPdXRwdXQuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvQnl0ZUFycmF5T3V0cHV0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK0J5dGVBcnJheU91dHB1dDo6Qnl0ZUFycmF5T3V0cHV0KCkge30KKworQnl0ZUFycmF5T3V0cHV0Ojp+Qnl0ZUFycmF5T3V0cHV0KCkge30KKworc3RhdHVzX3QgQnl0ZUFycmF5T3V0cHV0OjpvcGVuKCkgeworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQnl0ZUFycmF5T3V0cHV0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIGlmIChtQnl0ZUFycmF5LmFwcGVuZEFycmF5KGJ1ZiArIG9mZnNldCwgY291bnQpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSB0byBCeXRlQXJyYXlPdXRwdXQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBCeXRlQXJyYXlPdXRwdXQ6OmNsb3NlKCkgeworICAgIG1CeXRlQXJyYXkuY2xlYXIoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NpemVfdCBCeXRlQXJyYXlPdXRwdXQ6OmdldFNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CeXRlQXJyYXkuc2l6ZSgpOworfQorCitjb25zdCB1aW50OF90KiBCeXRlQXJyYXlPdXRwdXQ6OmdldEFycmF5KCkgY29uc3QgeworICAgIHJldHVybiBtQnl0ZUFycmF5LmFycmF5KCk7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYjRhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcApAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGltZ191dGlscy9EbmdVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworT3Bjb2RlTGlzdEJ1aWxkZXI6Ok9wY29kZUxpc3RCdWlsZGVyKCkgOiBtQ291bnQoMCksIG1PcExpc3QoKSwgbUVuZGlhbk91dCgmbU9wTGlzdCwgQklHKSB7CisgICAgaWYobUVuZGlhbk91dC5vcGVuKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBPcGVuIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KK30KKworT3Bjb2RlTGlzdEJ1aWxkZXI6On5PcGNvZGVMaXN0QnVpbGRlcigpIHsKKyAgICBpZihtRW5kaWFuT3V0LmNsb3NlKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDbG9zZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICB9Cit9CisKK3NpemVfdCBPcGNvZGVMaXN0QnVpbGRlcjo6Z2V0U2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU9wTGlzdC5nZXRTaXplKCkgKyBzaXplb2YobUNvdW50KTsKK30KKwordWludDMyX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmdldENvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtQ291bnQ7Cit9CisKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjpidWlsZE9wTGlzdCh1aW50OF90KiBidWYpIGNvbnN0IHsKKyAgICB1aW50MzJfdCBjb3VudCA9IGNvbnZlcnRUb0JpZ0VuZGlhbihtQ291bnQpOworICAgIG1lbWNweShidWYsICZjb3VudCwgc2l6ZW9mKGNvdW50KSk7CisgICAgbWVtY3B5KGJ1ZiArIHNpemVvZihjb3VudCksIG1PcExpc3QuZ2V0QXJyYXkoKSwgbU9wTGlzdC5nZXRTaXplKCkpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZEdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCkgeworICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCA9IGFjdGl2ZUFyZWFSaWdodCAtIGFjdGl2ZUFyZWFMZWZ0OworICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQgPSBhY3RpdmVBcmVhQm90dG9tIC0gYWN0aXZlQXJlYVRvcDsKKyAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBsc21IZWlnaHQ7CisgICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gbHNtV2lkdGg7CisKKyAgICBmbG9hdCByZWRNYXBbbHNtV2lkdGggKiBsc21IZWlnaHRdOworICAgIGZsb2F0IGdyZWVuRXZlbk1hcFtsc21XaWR0aCAqIGxzbUhlaWdodF07CisgICAgZmxvYXQgZ3JlZW5PZGRNYXBbbHNtV2lkdGggKiBsc21IZWlnaHRdOworICAgIGZsb2F0IGJsdWVNYXBbbHNtV2lkdGggKiBsc21IZWlnaHRdOworCisgICAgc2l6ZV90IGxzbU1hcFNpemUgPSBsc21XaWR0aCAqIGxzbUhlaWdodCAqIDQ7CisKKyAgICAvLyBTcGxpdCBsZW5zIHNoYWRpbmcgbWFwIGNoYW5uZWxzIGludG8gc2VwYXJhdGUgYXJyYXlzCisgICAgc2l6ZV90IGogPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbHNtTWFwU2l6ZTsgaSArPSA0LCArK2opIHsKKyAgICAgICAgcmVkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9SX0lORF07CisgICAgICAgIGdyZWVuRXZlbk1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR0VfSU5EXTsKKyAgICAgICAgZ3JlZW5PZGRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dPX0lORF07CisgICAgICAgIGJsdWVNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0JfSU5EXTsKKyAgICB9CisKKyAgICB1aW50MzJfdCByZWRUb3AgPSAwOworICAgIHVpbnQzMl90IHJlZExlZnQgPSAwOworICAgIHVpbnQzMl90IGdyZWVuRXZlblRvcCA9IDA7CisgICAgdWludDMyX3QgZ3JlZW5FdmVuTGVmdCA9IDE7CisgICAgdWludDMyX3QgZ3JlZW5PZGRUb3AgPSAxOworICAgIHVpbnQzMl90IGdyZWVuT2RkTGVmdCA9IDA7CisgICAgdWludDMyX3QgYmx1ZVRvcCA9IDE7CisgICAgdWludDMyX3QgYmx1ZUxlZnQgPSAxOworCisgICAgc3dpdGNoKGNmYSkgeworICAgICAgICBjYXNlIENGQV9SR0dCOgorICAgICAgICAgICAgcmVkVG9wID0gMDsKKyAgICAgICAgICAgIHJlZExlZnQgPSAwOworICAgICAgICAgICAgZ3JlZW5FdmVuVG9wID0gMDsKKyAgICAgICAgICAgIGdyZWVuRXZlbkxlZnQgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRUb3AgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRMZWZ0ID0gMDsKKyAgICAgICAgICAgIGJsdWVUb3AgPSAxOworICAgICAgICAgICAgYmx1ZUxlZnQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZBX0dSQkc6CisgICAgICAgICAgICByZWRUb3AgPSAwOworICAgICAgICAgICAgcmVkTGVmdCA9IDE7CisgICAgICAgICAgICBncmVlbkV2ZW5Ub3AgPSAwOworICAgICAgICAgICAgZ3JlZW5FdmVuTGVmdCA9IDA7CisgICAgICAgICAgICBncmVlbk9kZFRvcCA9IDE7CisgICAgICAgICAgICBncmVlbk9kZExlZnQgPSAxOworICAgICAgICAgICAgYmx1ZVRvcCA9IDE7CisgICAgICAgICAgICBibHVlTGVmdCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRkFfR0JSRzoKKyAgICAgICAgICAgIHJlZFRvcCA9IDE7CisgICAgICAgICAgICByZWRMZWZ0ID0gMDsKKyAgICAgICAgICAgIGdyZWVuRXZlblRvcCA9IDA7CisgICAgICAgICAgICBncmVlbkV2ZW5MZWZ0ID0gMDsKKyAgICAgICAgICAgIGdyZWVuT2RkVG9wID0gMTsKKyAgICAgICAgICAgIGdyZWVuT2RkTGVmdCA9IDE7CisgICAgICAgICAgICBibHVlVG9wID0gMDsKKyAgICAgICAgICAgIGJsdWVMZWZ0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENGQV9CR0dSOgorICAgICAgICAgICAgcmVkVG9wID0gMTsKKyAgICAgICAgICAgIHJlZExlZnQgPSAxOworICAgICAgICAgICAgZ3JlZW5FdmVuVG9wID0gMDsKKyAgICAgICAgICAgIGdyZWVuRXZlbkxlZnQgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRUb3AgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRMZWZ0ID0gMDsKKyAgICAgICAgICAgIGJsdWVUb3AgPSAwOworICAgICAgICAgICAgYmx1ZUxlZnQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gQ0ZBIGxheW91dCAlZCIsIF9fRlVOQ1RJT05fXywgY2ZhKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovcmVkVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9yZWRMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbFBpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNWKi9sc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c0gqL2xzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nViovc3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdIKi9zcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luViovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luSCovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBHYWlucyovcmVkTWFwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovZ3JlZW5FdmVuVG9wLAorICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9ncmVlbkV2ZW5MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAvKmNvbFBpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNWKi9sc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c0gqL2xzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nViovc3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdIKi9zcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luViovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luSCovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBHYWlucyovZ3JlZW5FdmVuTWFwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovZ3JlZW5PZGRUb3AsCisgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqL2dyZWVuT2RkTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lKi8wLAorICAgICAgICAgICAgICAgICAgICAgLypwbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAvKnJvd1BpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgLypjb2xQaXRjaCovMiwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzViovbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNIKi9sc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ1YqL3NwYWNpbmdWLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nSCovc3BhY2luZ0gsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpblYqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpbkgqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwR2FpbnMqL2dyZWVuT2RkTWFwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovYmx1ZVRvcCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovYmx1ZUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMiwKKyAgICAgICAgICAgICAgICAgICAgIC8qY29sUGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c1YqL2xzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzSCovbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdWKi9zcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ0gqL3NwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5WKi8wLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5IKi8wLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcEdhaW5zKi9ibHVlTWFwKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkR2Fpbk1hcCh1aW50MzJfdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJvd1BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sUGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQb2ludHNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFwUG9pbnRzSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBTcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBTcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBPcmlnaW5WLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcE9yaWdpbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbWFwR2FpbnMpIHsKKworICAgIHVpbnQzMl90IG9wY29kZUlkID0gR0FJTl9NQVBfSUQ7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKCZvcGNvZGVJZCwgMCwgMSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIHVpbnQ4X3QgdmVyc2lvbltdID0gezEsIDMsIDAsIDB9OworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUodmVyc2lvbiwgMCwgTkVMRU1TKHZlcnNpb24pKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgLy8gRG8gbm90IGluY2x1ZGUgb3B0aW9uYWwgZmxhZyBmb3IgcHJldmlldywgYXMgdGhpcyBjYW4gaGF2ZSBhIGxhcmdlIGVmZmVjdCBvbiB0aGUgb3V0cHV0LgorICAgIHVpbnQzMl90IGZsYWdzID0gRkxBR19PUFRJT05BTDsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoJmZsYWdzLCAwLCAxKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgY29uc3QgdWludDMyX3QgTlVNQkVSX0lOVF9BUkdTID0gMTE7CisgICAgY29uc3QgdWludDMyX3QgTlVNQkVSX0RPVUJMRV9BUkdTID0gNDsKKworICAgIHVpbnQzMl90IHRvdGFsU2l6ZSA9IE5VTUJFUl9JTlRfQVJHUyAqIHNpemVvZih1aW50MzJfdCkgKyBOVU1CRVJfRE9VQkxFX0FSR1MgKiBzaXplb2YoZG91YmxlKSArCisgICAgICAgICAgICBtYXBQb2ludHNWICogbWFwUG9pbnRzSCAqIG1hcFBsYW5lcyAqIHNpemVvZihmbG9hdCk7CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKCZ0b3RhbFNpemUsIDAsIDEpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICAvLyBCYXRjaCB3cml0ZXMgYXMgbXVjaCBhcyBwb3NzaWJsZQorICAgIHVpbnQzMl90IHNldHRpbmdzMVtdID0geyB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFBvaW50c1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwUG9pbnRzSCB9OworCisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZShzZXR0aW5nczEsIDAsIE5FTEVNUyhzZXR0aW5nczEpKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZG91YmxlIHNldHRpbmdzMltdID0geyBtYXBTcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwU3BhY2luZ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcE9yaWdpblYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcE9yaWdpbkggfTsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoc2V0dGluZ3MyLCAwLCBORUxFTVMoc2V0dGluZ3MyKSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoJm1hcFBsYW5lcywgMCwgMSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUobWFwR2FpbnMsIDAsIG1hcFBvaW50c1YgKiBtYXBQb2ludHNIICogbWFwUGxhbmVzKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgbUNvdW50Kys7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0VuZGlhblV0aWxzLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvRW5kaWFuVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODFjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0VuZGlhblV0aWxzLmNwcApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL0VuZGlhblV0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitFbmRpYW5PdXRwdXQ6OkVuZGlhbk91dHB1dChPdXRwdXQqIG91dCwgRW5kaWFubmVzcyBlbmQpCisgICAgICAgIDogbU9mZnNldCgwKSwgbU91dHB1dChvdXQpLCBtRW5kaWFuKGVuZCkge30KKworRW5kaWFuT3V0cHV0Ojp+RW5kaWFuT3V0cHV0KCkge30KKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0OjpvcGVuKCkgeworICAgIG1PZmZzZXQgPSAwOworICAgIHJldHVybiBtT3V0cHV0LT5vcGVuKCk7Cit9CisKK3N0YXR1c190IEVuZGlhbk91dHB1dDo6Y2xvc2UoKSB7CisgICAgcmV0dXJuIG1PdXRwdXQtPmNsb3NlKCk7Cit9CisKK3ZvaWQgRW5kaWFuT3V0cHV0OjpzZXRFbmRpYW5uZXNzKEVuZGlhbm5lc3MgZW5kKSB7CisgICAgbUVuZGlhbiA9IGVuZDsKK30KKwordWludDMyX3QgRW5kaWFuT3V0cHV0OjpnZXRDdXJyZW50T2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBtT2Zmc2V0OworfQorCitFbmRpYW5uZXNzIEVuZGlhbk91dHB1dDo6Z2V0RW5kaWFubmVzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUVuZGlhbjsKK30KKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmKChyZXMgPSBtT3V0cHV0LT53cml0ZShidWYsIG9mZnNldCwgY291bnQpKSA9PSBPSykgeworICAgICAgICBtT2Zmc2V0ICs9IGNvdW50OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBFbmRpYW5PdXRwdXQ6OndyaXRlKGNvbnN0IGludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICByZXR1cm4gd3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmKSwgb2Zmc2V0LCBjb3VudCk7Cit9CisKKyNkZWZpbmUgREVGSU5FX1dSSVRFKF90eXBlXykgXAorc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZShjb25zdCBfdHlwZV8qIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7IFwKKyAgICByZXR1cm4gd3JpdGVIZWxwZXI8X3R5cGVfPihidWYsIG9mZnNldCwgY291bnQpOyBcCit9CisKK0RFRklORV9XUklURSh1aW50MTZfdCkKK0RFRklORV9XUklURShpbnQxNl90KQorREVGSU5FX1dSSVRFKHVpbnQzMl90KQorREVGSU5FX1dSSVRFKGludDMyX3QpCitERUZJTkVfV1JJVEUodWludDY0X3QpCitERUZJTkVfV1JJVEUoaW50NjRfdCkKKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZShjb25zdCBmbG9hdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICBhc3NlcnQoc2l6ZW9mKGZsb2F0KSA9PSBzaXplb2YodWludDMyX3QpKTsKKyAgICByZXR1cm4gd3JpdGVIZWxwZXI8dWludDMyX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihidWYpLCBvZmZzZXQsIGNvdW50KTsKK30KKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZShjb25zdCBkb3VibGUqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7CisgICAgYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOworICAgIHJldHVybiB3cml0ZUhlbHBlcjx1aW50NjRfdD4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCo+KGJ1ZiksIG9mZnNldCwgY291bnQpOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlSW5wdXQuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlSW5wdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OGU3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0ZpbGVJbnB1dC5jcHAKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGltZ191dGlscy9GaWxlSW5wdXQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworRmlsZUlucHV0OjpGaWxlSW5wdXQoU3RyaW5nOCBwYXRoKSA6IG1GcChOVUxMKSwgbVBhdGgocGF0aCksIG1PcGVuKGZhbHNlKSB7fQorCitGaWxlSW5wdXQ6On5GaWxlSW5wdXQoKSB7CisgICAgaWYgKG1PcGVuKSB7CisgICAgICAgIEFMT0dFKCIlczogRmlsZUlucHV0IGRlc3Ryb3llZCB3aXRob3V0IGNhbGxpbmcgY2xvc2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICB9CisKK30KKworc3RhdHVzX3QgRmlsZUlucHV0OjpvcGVuKCkgeworICAgIGlmIChtT3BlbikgeworICAgICAgICBBTE9HVygiJXM6IE9wZW4gY2FsbGVkIHdoZW4gZmlsZSAlcyBhbHJlYWR5IG9wZW4uIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgbUZwID0gOjpmb3BlbihtUGF0aCwgInJiIik7CisgICAgaWYgKCFtRnApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1PcGVuID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NzaXplX3QgRmlsZUlucHV0OjpyZWFkKHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7CisgICAgaWYgKCFtT3BlbikgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCByZWFkIGZpbGUgJXMsIGZpbGUgbm90IG9wZW4uIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc2l6ZV90IGJ5dGVzUmVhZCA9IDo6ZnJlYWQoYnVmICsgb2Zmc2V0LCBzaXplb2YodWludDhfdCksIGNvdW50LCBtRnApOworICAgIGludCBlcnJvciA9IDo6ZmVycm9yKG1GcCk7CisgICAgaWYgKGVycm9yICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciAlZCBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIGZpbGUgJXMuIiwgX19GVU5DVElPTl9fLCBlcnJvciwgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEVuZCBvZiBmaWxlIHJlYWNoZWQKKyAgICBpZiAoOjpmZW9mKG1GcCkgIT0gMCAmJiBieXRlc1JlYWQgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIHJldHVybiBieXRlc1JlYWQ7Cit9CisKK3N0YXR1c190IEZpbGVJbnB1dDo6Y2xvc2UoKSB7CisgICAgaWYoIW1PcGVuKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2xvc2UgY2FsbGVkIHdoZW4gZmlsZSAlcyBhbHJlYWR5IGNsb3NlLiIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgaWYoOjpmY2xvc2UobUZwKSAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNsb3NlIGZpbGUgJXMuIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldCA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU9wZW4gPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0ZpbGVPdXRwdXQuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlT3V0cHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTc2M2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlT3V0cHV0LmNwcApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL0ZpbGVPdXRwdXQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworRmlsZU91dHB1dDo6RmlsZU91dHB1dChTdHJpbmc4IHBhdGgpIDogbUZwKE5VTEwpLCBtUGF0aChwYXRoKSwgbU9wZW4oZmFsc2UpIHt9CisKK0ZpbGVPdXRwdXQ6On5GaWxlT3V0cHV0KCkgeworICAgIGlmIChtT3BlbikgeworICAgICAgICBBTE9HVygiJXM6IERlc3RydWN0b3IgY2FsbGVkIHdpdGggJXMgc3RpbGwgb3Blbi4iLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEZpbGVPdXRwdXQ6Om9wZW4oKSB7CisgICAgaWYgKG1PcGVuKSB7CisgICAgICAgIEFMT0dXKCIlczogT3BlbiBjYWxsZWQgd2hlbiBmaWxlICVzIGFscmVhZHkgb3Blbi4iLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBtRnAgPSA6OmZvcGVuKG1QYXRoLCAid2IiKTsKKyAgICBpZiAoIW1GcCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU9wZW4gPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRmlsZU91dHB1dDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICBpZiAoIW1PcGVuKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHdyaXRlIGZpbGUgJXMsIGZpbGUgbm90IG9wZW4uIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgOjpmd3JpdGUoYnVmICsgb2Zmc2V0LCBzaXplb2YodWludDhfdCksIGNvdW50LCBtRnApOworCisgICAgaW50IGVycm9yID0gOjpmZXJyb3IobUZwKTsKKyAgICBpZiAoZXJyb3IgIT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yICVkIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgZmlsZSAlcy4iLCBfX0ZVTkNUSU9OX18sIGVycm9yLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRmlsZU91dHB1dDo6Y2xvc2UoKSB7CisgICAgaWYoIW1PcGVuKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2xvc2UgY2FsbGVkIHdoZW4gZmlsZSAlcyBhbHJlYWR5IGNsb3NlLiIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgaWYoOjpmY2xvc2UobUZwKSAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNsb3NlIGZpbGUgJXMuIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldCA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU9wZW4gPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0lucHV0LmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvSW5wdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ODIwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0lucHV0LmNwcApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL0lucHV0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitJbnB1dDo6fklucHV0KCkge30KKworc3RhdHVzX3QgSW5wdXQ6Om9wZW4oKSB7IHJldHVybiBPSzsgfQorCitzdGF0dXNfdCBJbnB1dDo6Y2xvc2UoKSB7IHJldHVybiBPSzsgfQorCitzc2l6ZV90IElucHV0Ojpza2lwKHNpemVfdCBjb3VudCkgeworICAgIGNvbnN0IHNpemVfdCBTS0lQX0JVRl9TSVpFID0gMTAyNDsKKyAgICB1aW50OF90IHNraXBCdWZbU0tJUF9CVUZfU0laRV07CisKKyAgICBzaXplX3QgcmVtYWluaW5nID0gY291bnQ7CisgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKKyAgICAgICAgc2l6ZV90IGFtdCA9IChTS0lQX0JVRl9TSVpFID4gcmVtYWluaW5nKSA/IHJlbWFpbmluZyA6IFNLSVBfQlVGX1NJWkU7CisgICAgICAgIHNzaXplX3QgcmV0ID0gcmVhZChza2lwQnVmLCAwLCBhbXQpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaWYocmV0ID09IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBmaWxlIGVuY291bnRlcmVkCisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSBjb3VudCkgeworICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIG5vIGJ5dGVzLCByZXR1cm4gRU9GCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIG51bSBieXRlcyByZWFkCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudCAtIHJlbWFpbmluZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBSZXR1cm4gZXJyb3IgY29kZS4KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmVtYWluaW5nIC09IHJldDsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL09yZGVyYWJsZS5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL09yZGVyYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwZjEyMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvT3JkZXJhYmxlLmNwcApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL09yZGVyYWJsZS5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisjZGVmaW5lIENPTVBBUkUob3ApIFwKK2Jvb2wgT3JkZXJhYmxlOjpvcGVyYXRvciBvcCAoY29uc3QgT3JkZXJhYmxlJiBvcmRlcmFibGUpIGNvbnN0IHsgXAorICAgIHJldHVybiBnZXRDb21wYXJhYmxlVmFsdWUoKSBvcCBvcmRlcmFibGUuZ2V0Q29tcGFyYWJsZVZhbHVlKCk7IFwKK30KKworQ09NUEFSRSg+KQorQ09NUEFSRSg8KQorQ09NUEFSRSg+PSkKK0NPTVBBUkUoPD0pCitDT01QQVJFKD09KQorQ09NUEFSRSghPSkKKworT3JkZXJhYmxlOjp+T3JkZXJhYmxlKCkge30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL21lZGlhL2ltZ191dGlscy9zcmMvT3V0cHV0LmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjYlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBtZWRpYS9pbWdfdXRpbHMvc3JjL091dHB1dC5jcHAKaW5kZXggMTNjYWM2ZC4uMGUzOTViOQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9PdXRwdXQuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK091dHB1dDo6fk91dHB1dCgpIHt9CitzdGF0dXNfdCBPdXRwdXQ6Om9wZW4oKSB7IHJldHVybiBPSzsgfQorc3RhdHVzX3QgT3V0cHV0OjpjbG9zZSgpIHsgcmV0dXJuIE9LOyB9CiAKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL1NvcnRlZEVudHJ5VmVjdG9yLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvU29ydGVkRW50cnlWZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZTFmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1NvcnRlZEVudHJ5VmVjdG9yLmNwcApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL1NvcnRlZEVudHJ5VmVjdG9yLmg+CisKKyNpbmNsdWRlIDx1dGlscy9UeXBlSGVscGVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworU29ydGVkRW50cnlWZWN0b3I6On5Tb3J0ZWRFbnRyeVZlY3RvcigpIHt9CisKK3NzaXplX3QgU29ydGVkRW50cnlWZWN0b3I6OmluZGV4T2ZUYWcodWludDE2X3QgdGFnKSBjb25zdCB7CisgICAgLy8gVE9ETzogVXNlIGJpbmFyeSBzZWFyY2ggaGVyZS4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmdldFRhZygpID09IHRhZykgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgU29ydGVkRW50cnlWZWN0b3I6OmRvX2NvbXBhcmUoY29uc3Qgdm9pZCogbGhzLCBjb25zdCB2b2lkKiByaHMpIGNvbnN0IHsKKyAgICBjb25zdCBzcDxUaWZmRW50cnk+KiBsRW50cnkgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHNwPFRpZmZFbnRyeT4qPihsaHMpOworICAgIGNvbnN0IHNwPFRpZmZFbnRyeT4qIHJFbnRyeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3A8VGlmZkVudHJ5Pio+KHJocyk7CisgICAgcmV0dXJuIGNvbXBhcmVfdHlwZSgqKmxFbnRyeSwgKipyRW50cnkpOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9TdHJpcFNvdXJjZS5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY2JQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gbWVkaWEvaW1nX3V0aWxzL3NyYy9TdHJpcFNvdXJjZS5jcHAKaW5kZXggMTNjYWM2ZC4uNTdiNjA4MgotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9TdHJpcFNvdXJjZS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaW5jbHVkZSA8aW1nX3V0aWxzL1N0cmlwU291cmNlLmg+CiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworU3RyaXBTb3VyY2U6On5TdHJpcFNvdXJjZSgpIHt9CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KLQorfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZkVudHJ5LmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZkVudHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjIwZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmRW50cnkuY3BwCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZJZmQuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitUaWZmRW50cnk6On5UaWZmRW50cnkoKSB7fQorCisvKioKKyAqIFNwZWNpYWxpemUgZm9yIGVhY2ggdmFsaWQgdHlwZSwgaW5jbHVkaW5nIHN1Yi1JRkRzLgorICoKKyAqIFZhbHVlcyB3aXRoIHR5cGVzIG90aGVyIHRoYW4gdGhlIG9uZXMgZ2l2ZW4gaGVyZSBzaG91bGQgbm90IGNvbXBpbGUuCisgKi8KKwordGVtcGxhdGU8PgorY29uc3Qgc3A8VGlmZklmZD4qIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8c3A8VGlmZklmZD4gPihUYWdUeXBlIHR5cGUsIGNvbnN0IHNwPFRpZmZJZmQ+KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IExPTkcpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ2lmZCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IHVpbnQ4X3QqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8dWludDhfdD4oVGFnVHlwZSB0eXBlLCBjb25zdCB1aW50OF90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IEJZVEUgfHwgdHlwZSA9PSBBU0NJSSB8fCB0eXBlID09IFVOREVGSU5FRCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAndWludDhfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IGludDhfdCogVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZTxpbnQ4X3Q+KFRhZ1R5cGUgdHlwZSwgY29uc3QgaW50OF90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IFNCWVRFIHx8IHR5cGUgPT0gQVNDSUkgfHwgdHlwZSA9PSBVTkRFRklORUQpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ2ludDhfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IHVpbnQxNl90KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPHVpbnQxNl90PihUYWdUeXBlIHR5cGUsIGNvbnN0IHVpbnQxNl90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IFNIT1JUKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBWYWx1ZSBvZiB0eXBlICd1aW50MTZfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IGludDE2X3QqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8aW50MTZfdD4oVGFnVHlwZSB0eXBlLCBjb25zdCBpbnQxNl90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IFNTSE9SVCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAnaW50MTZfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IHVpbnQzMl90KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPHVpbnQzMl90PihUYWdUeXBlIHR5cGUsIGNvbnN0IHVpbnQzMl90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IExPTkcgfHwgdHlwZSA9PSBSQVRJT05BTCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAndWludDMyX3QnIGlzIG5vdCB2YWxpZCBmb3IgdGFnIHdpdGggVElGRiB0eXBlICVkLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHR5cGUpOworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCBpbnQzMl90KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPGludDMyX3Q+KFRhZ1R5cGUgdHlwZSwgY29uc3QgaW50MzJfdCogdmFsdWUpIHsKKyAgICBpZiAodHlwZSA9PSBTTE9ORyB8fCB0eXBlID09IFNSQVRJT05BTCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAnaW50MzJfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IGRvdWJsZSogVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZTxkb3VibGU+KFRhZ1R5cGUgdHlwZSwgY29uc3QgZG91YmxlKiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IERPVUJMRSkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAnZG91YmxlJyBpcyBub3QgdmFsaWQgZm9yIHRhZyB3aXRoIFRJRkYgdHlwZSAlZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8PgorY29uc3QgZmxvYXQqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8ZmxvYXQ+KFRhZ1R5cGUgdHlwZSwgY29uc3QgZmxvYXQqIHZhbHVlKSB7CisgICAgaWYgKHR5cGUgPT0gRkxPQVQpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ2Zsb2F0JyBpcyBub3QgdmFsaWQgZm9yIHRhZyB3aXRoIFRJRkYgdHlwZSAlZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworU3RyaW5nOCBUaWZmRW50cnk6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIFN0cmluZzggb3V0cHV0OworICAgIHVpbnQzMl90IGNvdW50ID0gZ2V0Q291bnQoKTsKKyAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCJbaWQ6ICV4LCB0eXBlOiAlZCwgY291bnQ6ICV1LCB2YWx1ZTogJyIsIGdldFRhZygpLCBnZXRUeXBlKCksIGNvdW50KTsKKworICAgIHNpemVfdCBjYXBwZWRDb3VudCA9IGNvdW50OworICAgIGlmIChjb3VudCA+IE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIKSB7CisgICAgICAgIGNhcHBlZENvdW50ID0gTUFYX1BSSU5UX1NUUklOR19MRU5HVEg7CisgICAgfQorCisgICAgVGFnVHlwZSB0eXBlID0gZ2V0VHlwZSgpOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFVOREVGSU5FRDoKKyAgICAgICAgY2FzZSBCWVRFOiB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTx1aW50OF90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJXUgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFTQ0lJOiB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlZF9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZ2V0RGF0YTx1aW50OF90PigpKTsKKyAgICAgICAgICAgIHNpemVfdCBsZW4gPSBjb3VudDsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgIGxlbiA9IE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCh0eXBlZF9kYXRhLCBsZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTSE9SVDogeworICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIHR5cGVkX2RhdGEgPSBnZXREYXRhPHVpbnQxNl90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJXUgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIExPTkc6IHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTx1aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiV1ICIsIHR5cGVkX2RhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBSQVRJT05BTDogeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHR5cGVkX2RhdGEgPSBnZXREYXRhPHVpbnQzMl90PigpOworICAgICAgICAgICAgY2FwcGVkQ291bnQgPDw9IDE7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyBpKz0yKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJXUvJXUgIiwgdHlwZWRfZGF0YVtpXSwgdHlwZWRfZGF0YVtpICsgMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTQllURTogeworICAgICAgICAgICAgY29uc3QgaW50OF90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxpbnQ4X3Q+KCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCIlZCAiLCB0eXBlZF9kYXRhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU1NIT1JUOiB7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxpbnQxNl90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJWQgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNMT05HOiB7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxpbnQzMl90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJWQgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNSQVRJT05BTDogeworICAgICAgICAgICAgY29uc3QgaW50MzJfdCogdHlwZWRfZGF0YSA9IGdldERhdGE8aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGNhcHBlZENvdW50IDw8PSAxOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgaSs9MikgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiVkLyVkICIsIHR5cGVkX2RhdGFbaV0sIHR5cGVkX2RhdGFbaSArIDFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRkxPQVQ6IHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxmbG9hdD4oKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiVmICIsIHR5cGVkX2RhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBET1VCTEU6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdHlwZWRfZGF0YSA9IGdldERhdGE8ZG91YmxlPigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJWYgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJ1bmtub3duIHR5cGUgIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb3VudCA+IE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIKSB7CisgICAgICAgIG91dHB1dC5hcHBlbmQoIi4uLiIpOworICAgIH0KKyAgICBvdXRwdXQuYXBwZW5kKCInXSIpOworICAgIHJldHVybiBvdXRwdXQ7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZFbnRyeUltcGwuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApjb3B5IHRvIG1lZGlhL2ltZ191dGlscy9zcmMvVGlmZkVudHJ5SW1wbC5jcHAKaW5kZXggMTNjYWM2ZC4uMjU3YzI2NgotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmRW50cnlJbXBsLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5SW1wbC5oPgogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKIAotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSCAqLwotCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmSWZkLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZklmZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZiMDBjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZklmZC5jcHAKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVGlmZklmZCIKKworI2luY2x1ZGUgPGltZ191dGlscy9UYWdEZWZpbml0aW9ucy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSWZkLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZXcml0ZXIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworVGlmZklmZDo6VGlmZklmZCh1aW50MzJfdCBpZmRJZCkKKyAgICAgICAgOiBtTmV4dElmZCgpLCBtSWZkSWQoaWZkSWQpLCBtU3RyaXBPZmZzZXRzSW5pdGlhbGl6ZWQoZmFsc2UpIHt9CisKK1RpZmZJZmQ6On5UaWZmSWZkKCkge30KKworc3RhdHVzX3QgVGlmZklmZDo6YWRkRW50cnkoY29uc3Qgc3A8VGlmZkVudHJ5PiYgZW50cnkpIHsKKyAgICBzaXplX3Qgc2l6ZSA9IG1FbnRyaWVzLnNpemUoKTsKKyAgICBpZiAoc2l6ZSA+PSBNQVhfSUZEX0VOVFJJRVMpIHsKKyAgICAgICAgQUxPR1coIiVzOiBGYWlsZWQgdG8gYWRkIGVudHJ5IGZvciB0YWcgMHgleCB0byBJRkQgJXUsIHRvbyBtYW55IGVudHJpZXMgaW4gSUZEISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlbnRyeS0+Z2V0VGFnKCksIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgaWYgKG1FbnRyaWVzLmFkZChlbnRyeSkgPCAwKSB7CisgICAgICAgIEFMT0dXKCIlczogRmFpbGVkIHRvIGFkZCBlbnRyeSBmb3IgdGFnIDB4JXggdG8gaWZkICV1LiIsIF9fRlVOQ1RJT05fXywgZW50cnktPmdldFRhZygpLAorICAgICAgICAgICAgICAgIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3A8VGlmZkVudHJ5PiBUaWZmSWZkOjpnZXRFbnRyeSh1aW50MTZfdCB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUVudHJpZXMuaW5kZXhPZlRhZyh0YWcpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBObyBlbnRyeSBmb3IgdGFnIDB4JXggaW4gaWZkICV1LiIsIF9fRlVOQ1RJT05fXywgdGFnLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG1FbnRyaWVzW2luZGV4XTsKK30KKwordm9pZCBUaWZmSWZkOjpyZW1vdmVFbnRyeSh1aW50MTZfdCB0YWcpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUVudHJpZXMuaW5kZXhPZlRhZyh0YWcpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIG1FbnRyaWVzLnJlbW92ZUF0KGluZGV4KTsKKyAgICB9Cit9CisKKwordm9pZCBUaWZmSWZkOjpzZXROZXh0SWZkKGNvbnN0IHNwPFRpZmZJZmQ+JiBpZmQpIHsKKyAgICBtTmV4dElmZCA9IGlmZDsKK30KKworc3A8VGlmZklmZD4gVGlmZklmZDo6Z2V0TmV4dElmZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5leHRJZmQ7Cit9CisKK3VpbnQzMl90IFRpZmZJZmQ6OmNoZWNrQW5kR2V0T2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgY29uc3QgeworICAgIHNpemVfdCBzaXplID0gbUVudHJpZXMuc2l6ZSgpOworCisgICAgaWYgKHNpemUgPiBNQVhfSUZEX0VOVFJJRVMpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgY2FsY3VsYXRlIElGRCBvZmZzZXRzLCBJRkQgJXUgY29udGFpbnMgdG9vIG1hbnkgZW50cmllcy4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9PRkZTRVQ7CisgICAgfQorCisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICBBTE9HVygiJXM6IENvdWxkIG5vdCBjYWxjdWxhdGUgSUZEIG9mZnNldHMsIElGRCAldSBjb250YWlucyBubyBlbnRyaWVzLiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX09GRlNFVDsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ID09IEJBRF9PRkZTRVQpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgY2FsY3VsYXRlIElGRCBvZmZzZXRzLCBJRkQgJXUgaGFkIGEgYmFkIGluaXRpYWwgb2Zmc2V0LiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX09GRlNFVDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBpZmRTaXplID0gY2FsY3VsYXRlSWZkU2l6ZShzaXplKTsKKyAgICBXT1JEX0FMSUdOKGlmZFNpemUpOworICAgIHJldHVybiBvZmZzZXQgKyBpZmRTaXplOworfQorCitzdGF0dXNfdCBUaWZmSWZkOjp3cml0ZURhdGEodWludDMyX3Qgb2Zmc2V0LCAvKm91dCovRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0IHsKKyAgICBhc3NlcnQoKG9mZnNldCAlIFRJRkZfV09SRF9TSVpFKSA9PSAwKTsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKworICAgIEFMT0dWKCIlczogSUZEICV1IHdyaXR0ZW4gdG8gb2Zmc2V0ICV1IiwgX19GVU5DVElPTl9fLCBtSWZkSWQsIG9mZnNldCApOworICAgIHVpbnQzMl90IHZhbHVlT2Zmc2V0ID0gY2hlY2tBbmRHZXRPZmZzZXQob2Zmc2V0KTsKKyAgICBpZiAodmFsdWVPZmZzZXQgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCBzaXplID0gbUVudHJpZXMuc2l6ZSgpOworCisgICAgLy8gV3JpdGVyIElGRCBoZWFkZXIgKDIgYnl0ZXMsIG51bWJlciBvZiBlbnRyaWVzKS4KKyAgICB1aW50MTZfdCBoZWFkZXIgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oc2l6ZSk7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJmhlYWRlciwgMCwgMSksIHJldCk7CisKKyAgICAvLyBXcml0ZSB0YWcgZW50cmllcworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIEJBSUxfT05fRkFJTChtRW50cmllc1tpXS0+d3JpdGVUYWdJbmZvKHZhbHVlT2Zmc2V0LCBvdXQpLCByZXQpOworICAgICAgICB2YWx1ZU9mZnNldCArPSBtRW50cmllc1tpXS0+Z2V0U2l6ZSgpOworICAgIH0KKworICAgIC8vIFdyaXRlciBJRkQgZm9vdGVyICg0IGJ5dGVzLCBvZmZzZXQgdG8gbmV4dCBJRkQpLgorICAgIHVpbnQzMl90IGZvb3RlciA9IChtTmV4dElmZCAhPSBOVUxMKSA/IG9mZnNldCArIGdldFNpemUoKSA6IDA7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJmZvb3RlciwgMCwgMSksIHJldCk7CisKKyAgICBhc3NlcnQob3V0LT5nZXRDdXJyZW50T2Zmc2V0KCkgPT0gb2Zmc2V0ICsgY2FsY3VsYXRlSWZkU2l6ZShzaXplKSk7CisKKyAgICAvLyBXcml0ZSB6ZXJvZXMgdGlsbCB3b3JkIGFsaWduZWQKKyAgICBaRVJPX1RJTExfV09SRChvdXQsIGNhbGN1bGF0ZUlmZFNpemUoc2l6ZSksIHJldCk7CisKKyAgICAvLyBXcml0ZSB2YWx1ZXMgZm9yIGVhY2ggdGFnIGVudHJ5CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGxhc3QgPSBvdXQtPmdldEN1cnJlbnRPZmZzZXQoKTsKKyAgICAgICAgLy8gT25seSB3cml0ZSB2YWx1ZXMgdGhhdCBhcmUgdG9vIGxhcmdlIHRvIGZpdCBpbiB0aGUgMTItYnl0ZSBUSUZGIGVudHJ5CisgICAgICAgIGlmIChtRW50cmllc1tpXS0+Z2V0U2l6ZSgpID4gT0ZGU0VUX1NJWkUpIHsKKyAgICAgICAgICAgIEJBSUxfT05fRkFJTChtRW50cmllc1tpXS0+d3JpdGVEYXRhKG91dC0+Z2V0Q3VycmVudE9mZnNldCgpLCBvdXQpLCByZXQpOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBuZXh0ID0gb3V0LT5nZXRDdXJyZW50T2Zmc2V0KCk7CisgICAgICAgIHNpemVfdCBkaWZmID0gKG5leHQgLSBsYXN0KTsKKyAgICAgICAgc2l6ZV90IGFjdHVhbCA9IG1FbnRyaWVzW2ldLT5nZXRTaXplKCk7CisgICAgICAgIGlmIChkaWZmICE9IGFjdHVhbCkgeworICAgICAgICAgICAgQUxPR1coIlNpemVzIGRvIG5vdCBtYXRjaCBmb3IgdGFnICV4LiBFeHBlY3RlZCAlenUsIHJlY2VpdmVkICV6dSIsCisgICAgICAgICAgICAgICAgICAgIG1FbnRyaWVzW2ldLT5nZXRUYWcoKSwgYWN0dWFsLCBkaWZmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzc2VydChvdXQtPmdldEN1cnJlbnRPZmZzZXQoKSA9PSBvZmZzZXQgKyBnZXRTaXplKCkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc2l6ZV90IFRpZmZJZmQ6OmdldFNpemUoKSBjb25zdCB7CisgICAgc2l6ZV90IHNpemUgPSBtRW50cmllcy5zaXplKCk7CisgICAgdWludDMyX3QgdG90YWwgPSBjYWxjdWxhdGVJZmRTaXplKHNpemUpOworICAgIFdPUkRfQUxJR04odG90YWwpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIHRvdGFsICs9IG1FbnRyaWVzW2ldLT5nZXRTaXplKCk7CisgICAgfQorICAgIHJldHVybiB0b3RhbDsKK30KKwordWludDMyX3QgVGlmZklmZDo6Z2V0SWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JZmRJZDsKK30KKwordWludDMyX3QgVGlmZklmZDo6Z2V0Q29tcGFyYWJsZVZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBtSWZkSWQ7Cit9CisKK3N0YXR1c190IFRpZmZJZmQ6OnZhbGlkYXRlQW5kU2V0U3RyaXBUYWdzKCkgeworICAgIHNwPFRpZmZFbnRyeT4gd2lkdGhFbnRyeSA9IGdldEVudHJ5KFRBR19JTUFHRVdJRFRIKTsKKyAgICBpZiAod2lkdGhFbnRyeSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXNuJ3QgaGF2ZSBhIEltYWdlV2lkdGggdGFnIHNldCIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxUaWZmRW50cnk+IGhlaWdodEVudHJ5ID0gZ2V0RW50cnkoVEFHX0lNQUdFTEVOR1RIKTsKKyAgICBpZiAoaGVpZ2h0RW50cnkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IElGRCAldSBkb2Vzbid0IGhhdmUgYSBJbWFnZUxlbmd0aCB0YWcgc2V0IiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFRpZmZFbnRyeT4gc2FtcGxlc0VudHJ5ID0gZ2V0RW50cnkoVEFHX1NBTVBMRVNQRVJQSVhFTCk7CisgICAgaWYgKHNhbXBsZXNFbnRyeSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXNuJ3QgaGF2ZSBhIFNhbXBsZXNQZXJQaXhlbCB0YWcgc2V0IiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFRpZmZFbnRyeT4gYml0c0VudHJ5ID0gZ2V0RW50cnkoVEFHX0JJVFNQRVJTQU1QTEUpOworICAgIGlmIChiaXRzRW50cnkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IElGRCAldSBkb2Vzbid0IGhhdmUgYSBCaXRzUGVyU2FtcGxlIHRhZyBzZXQiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWludDMyX3Qgd2lkdGggPSAqKHdpZHRoRW50cnktPmdldERhdGE8dWludDMyX3Q+KCkpOworICAgIHVpbnQzMl90IGhlaWdodCA9ICooaGVpZ2h0RW50cnktPmdldERhdGE8dWludDMyX3Q+KCkpOworICAgIHVpbnQxNl90IGJpdHNQZXJTYW1wbGUgPSAqKGJpdHNFbnRyeS0+Z2V0RGF0YTx1aW50MTZfdD4oKSk7CisgICAgdWludDE2X3Qgc2FtcGxlc1BlclBpeGVsID0gKihzYW1wbGVzRW50cnktPmdldERhdGE8dWludDE2X3Q+KCkpOworCisgICAgaWYgKChiaXRzUGVyU2FtcGxlICUgOCkgIT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEJpdHNQZXJTYW1wbGUgJWQgaW4gSUZEICV1IGlzIG5vdCBieXRlLWFsaWduZWQuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUsIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWludDMyX3QgYnl0ZXNQZXJTYW1wbGUgPSBiaXRzUGVyU2FtcGxlIC8gODsKKworICAgIC8vIENob29zZSBzdHJpcCBzaXplIGFzIGNsb3NlIHRvIDhrYiBhcyBwb3NzaWJsZSB3aXRob3V0IHNwbGl0dGluZyByb3dzLgorICAgIC8vIElmIHRoZSByb3cgbGVuZ3RoIGlzID44a2IsIGVhY2ggc3RyaXAgd2lsbCBvbmx5IGNvbnRhaW4gYSBzaW5nbGUgcm93LgorICAgIGNvbnN0IHVpbnQzMl90IHJvd0xlbmd0aEJ5dGVzID0gYnl0ZXNQZXJTYW1wbGUgKiBzYW1wbGVzUGVyUGl4ZWwgKiB3aWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCBpZGVhbENodW5rU2l6ZSA9ICgxIDw8IDEzKTsgLy8gOGtiCisgICAgdWludDMyX3Qgcm93c1BlckNodW5rID0gaWRlYWxDaHVua1NpemUgLyByb3dMZW5ndGhCeXRlczsKKyAgICByb3dzUGVyQ2h1bmsgPSAocm93c1BlckNodW5rID09IDApID8gMSA6IHJvd3NQZXJDaHVuazsKKyAgICBjb25zdCB1aW50MzJfdCBhY3R1YWxDaHVua1NpemUgPSByb3dMZW5ndGhCeXRlcyAqIHJvd3NQZXJDaHVuazsKKworICAgIGNvbnN0IHVpbnQzMl90IGxhc3RDaHVua1Jvd3MgPSBoZWlnaHQgJSByb3dzUGVyQ2h1bms7CisgICAgY29uc3QgdWludDMyX3QgbGFzdENodW5rU2l6ZSA9IGxhc3RDaHVua1Jvd3MgKiByb3dMZW5ndGhCeXRlczsKKworICAgIGlmIChhY3R1YWxDaHVua1NpemUgPiAvKm1heCBzdHJpcCBzaXplIGZvciBUSUZGL0VQKi82NTUzNikgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmlwIGxlbmd0aCB0b28gbG9uZy4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCBudW1TdHJpcHMgPSBoZWlnaHQgLyByb3dzUGVyQ2h1bms7CisKKyAgICAvLyBBZGQgYW5vdGhlciBzdHJpcCBmb3IgdGhlIGluY29tcGxldGUgY2h1bmsuCisgICAgaWYgKGxhc3RDaHVua1Jvd3MgPiAwKSB7CisgICAgICAgIG51bVN0cmlwcyArPSAxOworICAgIH0KKworICAgIC8vIFB1dCBlYWNoIHJvdyBpbiBpdCdzIG93biBzdHJpcAorICAgIHVpbnQzMl90IHJvd3NQZXJTdHJpcFZhbCA9IHJvd3NQZXJDaHVuazsKKyAgICBzcDxUaWZmRW50cnk+IHJvd3NQZXJTdHJpcCA9IFRpZmZXcml0ZXI6OnVuY2hlY2tlZEJ1aWxkRW50cnkoVEFHX1JPV1NQRVJTVFJJUCwgTE9ORywgMSwKKyAgICAgICAgICAgIFVOREVGSU5FRF9FTkRJQU4sICZyb3dzUGVyU3RyaXBWYWwpOworCisgICAgaWYgKHJvd3NQZXJTdHJpcCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGJ1aWxkIGVudHJ5IGZvciBSb3dzUGVyU3RyaXAgdGFnLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQzMl90PiBieXRlQ291bnRzOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHJpcHM7ICsraSkgeworICAgICAgICBpZiAobGFzdENodW5rUm93cyA+IDAgJiYgaSA9PSAobnVtU3RyaXBzIC0gMSkpIHsKKyAgICAgICAgICAgIGJ5dGVDb3VudHMuYWRkKGxhc3RDaHVua1NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnl0ZUNvdW50cy5hZGQoYWN0dWFsQ2h1bmtTaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCBieXRlIGNvdW50cyBmb3IgZWFjaCBzdHJpcAorICAgIHNwPFRpZmZFbnRyeT4gc3RyaXBCeXRlQ291bnRzID0gVGlmZldyaXRlcjo6dW5jaGVja2VkQnVpbGRFbnRyeShUQUdfU1RSSVBCWVRFQ09VTlRTLCBMT05HLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bVN0cmlwcyksIFVOREVGSU5FRF9FTkRJQU4sIGJ5dGVDb3VudHMuYXJyYXkoKSk7CisKKyAgICBpZiAoc3RyaXBCeXRlQ291bnRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgYnVpbGQgZW50cnkgZm9yIFN0cmlwQnl0ZUNvdW50cyB0YWcuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IHN0cmlwT2Zmc2V0c1ZlY3RvcjsKKyAgICBzdHJpcE9mZnNldHNWZWN0b3IucmVzaXplKG51bVN0cmlwcyk7CisKKyAgICAvLyBTZXQgdW5pbml0aWFsaXplZCBvZmZzZXRzCisgICAgc3A8VGlmZkVudHJ5PiBzdHJpcE9mZnNldHMgPSBUaWZmV3JpdGVyOjp1bmNoZWNrZWRCdWlsZEVudHJ5KFRBR19TVFJJUE9GRlNFVFMsIExPTkcsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtU3RyaXBzKSwgVU5ERUZJTkVEX0VORElBTiwgc3RyaXBPZmZzZXRzVmVjdG9yLmFycmF5KCkpOworCisgICAgaWYgKHN0cmlwT2Zmc2V0cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGJ1aWxkIGVudHJ5IGZvciBTdHJpcE9mZnNldHMgdGFnLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYoYWRkRW50cnkoc3RyaXBCeXRlQ291bnRzKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBhZGQgZW50cnkgZm9yIFN0cmlwQnl0ZUNvdW50cyB0byBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYoYWRkRW50cnkocm93c1BlclN0cmlwKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBhZGQgZW50cnkgZm9yIFN0cmlwQnl0ZUNvdW50cyB0byBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYoYWRkRW50cnkoc3RyaXBPZmZzZXRzKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBhZGQgZW50cnkgZm9yIFN0cmlwQnl0ZUNvdW50cyB0byBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbVN0cmlwT2Zmc2V0c0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgVGlmZklmZDo6dW5pbml0aWFsaXplZE9mZnNldHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TdHJpcE9mZnNldHNJbml0aWFsaXplZDsKK30KKworc3RhdHVzX3QgVGlmZklmZDo6c2V0U3RyaXBPZmZzZXQodWludDMyX3Qgb2Zmc2V0KSB7CisKKyAgICAvLyBHZXQgb2xkIG9mZnNldHMgYW5kIGJ5dGVjb3VudHMKKyAgICBzcDxUaWZmRW50cnk+IG9sZE9mZnNldHMgPSBnZXRFbnRyeShUQUdfU1RSSVBPRkZTRVRTKTsKKyAgICBpZiAob2xkT2Zmc2V0cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXMgbm90IGNvbnRhaW4gU3RyaXBPZmZzZXRzIGVudHJ5LiIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxUaWZmRW50cnk+IHN0cmlwQnl0ZUNvdW50cyA9IGdldEVudHJ5KFRBR19TVFJJUEJZVEVDT1VOVFMpOworICAgIGlmIChzdHJpcEJ5dGVDb3VudHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IElGRCAldSBkb2VzIG5vdCBjb250YWluIFN0cmlwQnl0ZUNvdW50cyBlbnRyeS4iLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWludDMyX3Qgb2Zmc2V0c0NvdW50ID0gb2xkT2Zmc2V0cy0+Z2V0Q291bnQoKTsKKyAgICB1aW50MzJfdCBieXRlQ291bnQgPSBzdHJpcEJ5dGVDb3VudHMtPmdldENvdW50KCk7CisgICAgaWYgKG9mZnNldHNDb3VudCAhPSBieXRlQ291bnQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJpcE9mZnNldHMgY291bnQgKCV1KSBkb2Vzbid0IG1hdGNoIFN0cmlwQnl0ZUNvdW50cyBjb3VudCAoJXUpIGluIElGRCAldSIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9mZnNldHNDb3VudCwgYnl0ZUNvdW50LCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNvbnN0IHVpbnQzMl90KiBzdHJpcEJ5dGVDb3VudHNBcnJheSA9IHN0cmlwQnl0ZUNvdW50cy0+Z2V0RGF0YTx1aW50MzJfdD4oKTsKKworICAgIHNpemVfdCBudW1TdHJpcHMgPSBvZmZzZXRzQ291bnQ7CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IHN0cmlwT2Zmc2V0czsKKworICAgIC8vIENhbGN1bGF0ZSB1cGRhdGVkIGJ5dGUgb2Zmc2V0cworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RyaXBzOyArK2kpIHsKKyAgICAgICAgc3RyaXBPZmZzZXRzLmFkZChvZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gc3RyaXBCeXRlQ291bnRzQXJyYXlbaV07CisgICAgfQorCisgICAgc3A8VGlmZkVudHJ5PiBuZXdPZmZzZXRzID0gVGlmZldyaXRlcjo6dW5jaGVja2VkQnVpbGRFbnRyeShUQUdfU1RSSVBPRkZTRVRTLCBMT05HLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bVN0cmlwcyksIFVOREVGSU5FRF9FTkRJQU4sIHN0cmlwT2Zmc2V0cy5hcnJheSgpKTsKKworICAgIGlmIChuZXdPZmZzZXRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsdCBub3QgYnVpbGQgdXBkYXRlZCBvZmZzZXRzIGVudHJ5IGluIElGRCAldSIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoYWRkRW50cnkobmV3T2Zmc2V0cykgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYWRkIHVwZGF0ZWQgb2Zmc2V0cyBlbnRyeSBpbiBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordWludDMyX3QgVGlmZklmZDo6Z2V0U3RyaXBTaXplKCkgY29uc3QgeworICAgIHNwPFRpZmZFbnRyeT4gc3RyaXBCeXRlQ291bnRzID0gZ2V0RW50cnkoVEFHX1NUUklQQllURUNPVU5UUyk7CisgICAgaWYgKHN0cmlwQnl0ZUNvdW50cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXMgbm90IGNvbnRhaW4gU3RyaXBCeXRlQ291bnRzIGVudHJ5LiIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjb3VudCA9IHN0cmlwQnl0ZUNvdW50cy0+Z2V0Q291bnQoKTsKKyAgICBjb25zdCB1aW50MzJfdCogYnl0ZUNvdW50cyA9IHN0cmlwQnl0ZUNvdW50cy0+Z2V0RGF0YTx1aW50MzJfdD4oKTsKKworICAgIHVpbnQzMl90IHRvdGFsID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PHNpemVfdD4oY291bnQpOyArK2kpIHsKKyAgICAgICAgdG90YWwgKz0gYnl0ZUNvdW50c1tpXTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsOworfQorCitTdHJpbmc4IFRpZmZJZmQ6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIHNpemVfdCBzID0gbUVudHJpZXMuc2l6ZSgpOworICAgIFN0cmluZzggb3V0cHV0OworICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIltpZmQ6ICV4LCBudW1fZW50cmllczogJXp1LCBlbnRyaWVzOlxuIiwgZ2V0SWQoKSwgcyk7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG1FbnRyaWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG91dHB1dC5hcHBlbmQoIlx0Iik7CisgICAgICAgIG91dHB1dC5hcHBlbmQobUVudHJpZXNbaV0tPnRvU3RyaW5nKCkpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgICBvdXRwdXQuYXBwZW5kKCIsIG5leHRfaWZkOiAleF0iLCAoKG1OZXh0SWZkICE9IE5VTEwpID8gbU5leHRJZmQtPmdldElkKCkgOiAwKSk7CisgICAgcmV0dXJuIG91dHB1dDsKK30KKwordm9pZCBUaWZmSWZkOjpsb2coKSBjb25zdCB7CisgICAgc2l6ZV90IHMgPSBtRW50cmllcy5zaXplKCk7CisgICAgQUxPR0koIltpZmQ6ICV4LCBudW1fZW50cmllczogJXp1LCBlbnRyaWVzOlxuIiwgZ2V0SWQoKSwgcyk7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHM7ICsraSkgeworICAgICAgICBBTE9HSSgiXHQlcyIsIG1FbnRyaWVzW2ldLT50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICB9CisgICAgQUxPR0koIiwgbmV4dF9pZmQ6ICV4XSIsICgobU5leHRJZmQgIT0gTlVMTCkgPyBtTmV4dElmZC0+Z2V0SWQoKSA6IDApKTsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRhYmxlLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjQlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBtZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0YWJsZS5jcHAKaW5kZXggMTNjYWM2ZC4uZjhkN2RlNwotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGFibGUuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmV3JpdGFibGUuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworI2luY2x1ZGUgPGFzc2VydC5oPgogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKIAorVGlmZldyaXRhYmxlOjpUaWZmV3JpdGFibGUoKSB7fQorCitUaWZmV3JpdGFibGU6On5UaWZmV3JpdGFibGUoKSB7fQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGVyLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0MTczNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRlci5jcHAKQEAgLTAsMCArMSwzOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVGlmZldyaXRlciIKKworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmV3JpdGVyLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RhZ0RlZmluaXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK0tleWVkVmVjdG9yPHVpbnQxNl90LCBjb25zdCBUYWdEZWZpbml0aW9uX3QqPiBUaWZmV3JpdGVyOjpidWlsZFRhZ01hcCgKKyAgICAgICAgICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbnMsIHNpemVfdCBsZW5ndGgpIHsKKyAgICBLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4gbWFwOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBtYXAuYWRkKGRlZmluaXRpb25zW2ldLnRhZ0lkLCBkZWZpbml0aW9ucyArIGkpOworICAgIH0KKyAgICByZXR1cm4gbWFwOworfQorCisjZGVmaW5lIENPTVBBUkUob3ApIFwKK2Jvb2wgT3JkZXJhYmxlOjpvcGVyYXRvciBvcCAoY29uc3QgT3JkZXJhYmxlJiBvcmRlcmFibGUpIGNvbnN0IHsgXAorICAgIHJldHVybiBnZXRDb21wYXJhYmxlVmFsdWUoKSBvcCBvcmRlcmFibGUuZ2V0Q29tcGFyYWJsZVZhbHVlKCk7IFwKK30KKworI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSBcCisgICAgKHNpemVvZihhcnJheSkgLyBzaXplb2YoYXJyYXlbMF0pKQorCitLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4gVGlmZldyaXRlcjo6c1RhZ01hcHNbXSA9IHsKKyAgICBidWlsZFRhZ01hcChUSUZGX0VQX1RBR19ERUZJTklUSU9OUywgQVJSQVlfU0laRShUSUZGX0VQX1RBR19ERUZJTklUSU9OUykpLAorICAgIGJ1aWxkVGFnTWFwKEROR19UQUdfREVGSU5JVElPTlMsIEFSUkFZX1NJWkUoRE5HX1RBR19ERUZJTklUSU9OUykpLAorICAgIGJ1aWxkVGFnTWFwKEVYSUZfMl8zX1RBR19ERUZJTklUSU9OUywgQVJSQVlfU0laRShFWElGXzJfM19UQUdfREVGSU5JVElPTlMpKSwKKyAgICBidWlsZFRhZ01hcChUSUZGXzZfVEFHX0RFRklOSVRJT05TLCBBUlJBWV9TSVpFKFRJRkZfNl9UQUdfREVGSU5JVElPTlMpKQorfTsKKworVGlmZldyaXRlcjo6VGlmZldyaXRlcigpIDogbVRhZ01hcHMoc1RhZ01hcHMpLCBtTnVtVGFnTWFwcyhERUZBVUxUX05VTV9UQUdfTUFQUykge30KKworVGlmZldyaXRlcjo6VGlmZldyaXRlcihLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4qIGVuYWJsZWREZWZpbml0aW9ucywKKyAgICAgICAgc2l6ZV90IGxlbmd0aCkgOiBtVGFnTWFwcyhlbmFibGVkRGVmaW5pdGlvbnMpLCBtTnVtVGFnTWFwcyhsZW5ndGgpIHt9CisKK1RpZmZXcml0ZXI6On5UaWZmV3JpdGVyKCkge30KKworc3RhdHVzX3QgVGlmZldyaXRlcjo6d3JpdGUoT3V0cHV0KiBvdXQsIFN0cmlwU291cmNlKiogc291cmNlcywgc2l6ZV90IHNvdXJjZXNDb3VudCwKKyAgICAgICAgRW5kaWFubmVzcyBlbmQpIHsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBFbmRpYW5PdXRwdXQgZW5kT3V0KG91dCwgZW5kKTsKKworICAgIGlmIChtSWZkID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUaWZmIGhlYWRlciBpcyBlbXB0eS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVpbnQzMl90IHRvdGFsU2l6ZSA9IGdldFRvdGFsU2l6ZSgpOworCisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIHVpbnQzMl90PiBvZmZzZXRWZWN0b3I7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OYW1lZElmZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG1OYW1lZElmZHNbaV0tPnVuaW5pdGlhbGl6ZWRPZmZzZXRzKCkpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmlwU2l6ZSA9IG1OYW1lZElmZHNbaV0tPmdldFN0cmlwU2l6ZSgpOworICAgICAgICAgICAgaWYgKG1OYW1lZElmZHNbaV0tPnNldFN0cmlwT2Zmc2V0KHRvdGFsU2l6ZSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBzZXQgc3RyaXAgb2Zmc2V0cy4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbFNpemUgKz0gc3RyaXBTaXplOworICAgICAgICAgICAgV09SRF9BTElHTih0b3RhbFNpemUpOworICAgICAgICAgICAgb2Zmc2V0VmVjdG9yLmFkZChtTmFtZWRJZmRzLmtleUF0KGkpLCB0b3RhbFNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IG9mZlZlY1NpemUgPSBvZmZzZXRWZWN0b3Iuc2l6ZSgpOworICAgIGlmIChvZmZWZWNTaXplICE9IHNvdXJjZXNDb3VudCkgeworICAgICAgICBBTE9HRSgiJXM6IE1pc21hdGNoIGJldHdlZW4gbnVtYmVyIG9mIElGRHMgd2l0aCB1bmluaXRpYWxpemVkIHN0cmlwcyAoJXp1KSBhbmQiCisgICAgICAgICAgICAgICAgIiBzb3VyY2VzICglenUpLiIsIF9fRlVOQ1RJT05fXywgb2ZmVmVjU2l6ZSwgc291cmNlc0NvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBCQUlMX09OX0ZBSUwod3JpdGVGaWxlSGVhZGVyKGVuZE91dCksIHJldCk7CisKKyAgICB1aW50MzJfdCBvZmZzZXQgPSBGSUxFX0hFQURFUl9TSVpFOworICAgIHNwPFRpZmZJZmQ+IGlmZCA9IG1JZmQ7CisgICAgd2hpbGUoaWZkICE9IE5VTEwpIHsKKyAgICAgICAgQkFJTF9PTl9GQUlMKGlmZC0+d3JpdGVEYXRhKG9mZnNldCwgJmVuZE91dCksIHJldCk7CisgICAgICAgIG9mZnNldCArPSBpZmQtPmdldFNpemUoKTsKKyAgICAgICAgaWZkID0gaWZkLT5nZXROZXh0SWZkKCk7CisgICAgfQorCisgICAgaWYgKExPR19OREVCVUcgPT0gMCkgeworICAgICAgICBsb2coKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9mZlZlY1NpemU7ICsraSkgeworICAgICAgICB1aW50MzJfdCBpZmRLZXkgPSBvZmZzZXRWZWN0b3Iua2V5QXQoaSk7CisgICAgICAgIHVpbnQzMl90IG5leHRPZmZzZXQgPSBvZmZzZXRWZWN0b3JbaV07CisgICAgICAgIHVpbnQzMl90IHNpemVUb1dyaXRlID0gbU5hbWVkSWZkc1tpZmRLZXldLT5nZXRTdHJpcFNpemUoKTsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNvdXJjZXNDb3VudDsgKytqKSB7CisgICAgICAgICAgICBpZiAoc291cmNlc1tqXS0+Z2V0SWZkKCkgPT0gaWZkS2V5KSB7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBzb3VyY2VzW2ldLT53cml0ZVRvU3RyZWFtKGVuZE91dCwgc2l6ZVRvV3JpdGUpKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCB3cml0ZSB0byBzdHJlYW0sIHJlY2VpdmVkICVkLiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgWkVST19USUxMX1dPUkQoJmVuZE91dCwgc2l6ZVRvV3JpdGUsIHJldCk7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTm8gc3RyZWFtIGZvciBieXRlIHN0cmlwcyBmb3IgSUZEICV1IiwgX19GVU5DVElPTl9fLCBpZmRLZXkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQobmV4dE9mZnNldCA9PSBlbmRPdXQuZ2V0Q3VycmVudE9mZnNldCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBUaWZmV3JpdGVyOjp3cml0ZShPdXRwdXQqIG91dCwgRW5kaWFubmVzcyBlbmQpIHsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBFbmRpYW5PdXRwdXQgZW5kT3V0KG91dCwgZW5kKTsKKworICAgIGlmIChtSWZkID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUaWZmIGhlYWRlciBpcyBlbXB0eS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBCQUlMX09OX0ZBSUwod3JpdGVGaWxlSGVhZGVyKGVuZE91dCksIHJldCk7CisKKyAgICB1aW50MzJfdCBvZmZzZXQgPSBGSUxFX0hFQURFUl9TSVpFOworICAgIHNwPFRpZmZJZmQ+IGlmZCA9IG1JZmQ7CisgICAgd2hpbGUoaWZkICE9IE5VTEwpIHsKKyAgICAgICAgQkFJTF9PTl9GQUlMKGlmZC0+d3JpdGVEYXRhKG9mZnNldCwgJmVuZE91dCksIHJldCk7CisgICAgICAgIG9mZnNldCArPSBpZmQtPmdldFNpemUoKTsKKyAgICAgICAgaWZkID0gaWZkLT5nZXROZXh0SWZkKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKworY29uc3QgVGFnRGVmaW5pdGlvbl90KiBUaWZmV3JpdGVyOjpsb29rdXBEZWZpbml0aW9uKHVpbnQxNl90IHRhZykgY29uc3QgeworICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbiA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtVGFnTWFwczsgKytpKSB7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtVGFnTWFwc1tpXS5pbmRleE9mS2V5KHRhZyk7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBkZWZpbml0aW9uID0gbVRhZ01hcHNbaV1baW5kZXhdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gZGVmaW5pdGlvbiBleGlzdHMgZm9yIHRhZyB3aXRoIGlkICV4LiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICB9CisgICAgcmV0dXJuIGRlZmluaXRpb247Cit9CisKK3NwPFRpZmZFbnRyeT4gVGlmZldyaXRlcjo6Z2V0RW50cnkodWludDE2X3QgdGFnLCB1aW50MzJfdCBpZmQpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KGlmZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIElGRCAlZCBzZXQgZm9yIHRoaXMgd3JpdGVyLiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBtTmFtZWRJZmRzW2luZGV4XS0+Z2V0RW50cnkodGFnKTsKK30KKwordm9pZCBUaWZmV3JpdGVyOjpyZW1vdmVFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGlmZCkgeworICAgIHNzaXplX3QgaW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkoaWZkKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBtTmFtZWRJZmRzW2luZGV4XS0+cmVtb3ZlRW50cnkodGFnKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFRpZmZXcml0ZXI6OmFkZEVudHJ5KGNvbnN0IHNwPFRpZmZFbnRyeT4mIGVudHJ5LCB1aW50MzJfdCBpZmQpIHsKKyAgICB1aW50MTZfdCB0YWcgPSBlbnRyeS0+Z2V0VGFnKCk7CisKKyAgICBjb25zdCBUYWdEZWZpbml0aW9uX3QqIGRlZmluaXRpb24gPSBsb29rdXBEZWZpbml0aW9uKHRhZyk7CisKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gZGVmaW5pdGlvbiBleGlzdHMgZm9yIHRhZyAweCV4LiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KGlmZCk7CisKKyAgICAvLyBBZGQgYSBuZXcgSUZEIGlmIG5lY2Vzc2FyeQorICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBJRkQgJXUgZXhpc3RzLiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHNwPFRpZmZJZmQ+IHNlbGVjdGVkSWZkICA9IG1OYW1lZElmZHNbaW5kZXhdOworICAgIHJldHVybiBzZWxlY3RlZElmZC0+YWRkRW50cnkoZW50cnkpOworfQorCitzdGF0dXNfdCBUaWZmV3JpdGVyOjphZGRTdHJpcCh1aW50MzJfdCBpZmQpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KGlmZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IElmZCAldSBkb2Vzbid0IGV4aXN0LCBjYW5ub3QgYWRkIHN0cmlwIGVudHJpZXMuIiwgX19GVU5DVElPTl9fLCBpZmQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxUaWZmSWZkPiBzZWxlY3RlZCA9IG1OYW1lZElmZHNbaW5kZXhdOworICAgIHJldHVybiBzZWxlY3RlZC0+dmFsaWRhdGVBbmRTZXRTdHJpcFRhZ3MoKTsKK30KKworc3RhdHVzX3QgVGlmZldyaXRlcjo6YWRkSWZkKHVpbnQzMl90IGlmZCkgeworICAgIHNzaXplX3QgaW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkoaWZkKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IElmZCB3aXRoIElEIDB4JXggYWxyZWFkeSBleGlzdHMuIiwgX19GVU5DVElPTl9fLCBpZmQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFRpZmZJZmQ+IG5ld0lmZCA9IG5ldyBUaWZmSWZkKGlmZCk7CisgICAgaWYgKG1JZmQgPT0gTlVMTCkgeworICAgICAgICBtSWZkID0gbmV3SWZkOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwPFRpZmZJZmQ+IGxhc3QgPSBmaW5kTGFzdElmZCgpOworICAgICAgICBsYXN0LT5zZXROZXh0SWZkKG5ld0lmZCk7CisgICAgfQorCisgICAgaWYobU5hbWVkSWZkcy5hZGQoaWZkLCBuZXdJZmQpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBhZGQgbmV3IElGRCAweCV4LiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFRpZmZXcml0ZXI6OmFkZFN1YklmZCh1aW50MzJfdCBwYXJlbnRJZmQsIHVpbnQzMl90IGlmZCwgU3ViSWZkVHlwZSB0eXBlKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1OYW1lZElmZHMuaW5kZXhPZktleShpZmQpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogSWZkIHdpdGggSUQgMHgleCBhbHJlYWR5IGV4aXN0cy4iLCBfX0ZVTkNUSU9OX18sIGlmZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3NpemVfdCBwYXJlbnRJbmRleCA9IG1OYW1lZElmZHMuaW5kZXhPZktleShwYXJlbnRJZmQpOworICAgIGlmIChwYXJlbnRJbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBQYXJlbnQgSUZEIHdpdGggSUQgMHgleCBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudElmZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VGlmZklmZD4gcGFyZW50ID0gbU5hbWVkSWZkc1twYXJlbnRJbmRleF07CisgICAgc3A8VGlmZklmZD4gbmV3SWZkID0gbmV3IFRpZmZJZmQoaWZkKTsKKworICAgIHVpbnQxNl90IHN1YklmZFRhZzsKKyAgICBpZiAodHlwZSA9PSBTVUJJRkQpIHsKKyAgICAgICAgc3ViSWZkVGFnID0gVEFHX1NVQklGRFM7CisgICAgfSBlbHNlIGlmICh0eXBlID09IEdQU0lORk8pIHsKKyAgICAgICAgc3ViSWZkVGFnID0gVEFHX0dQU0lORk87CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIFN1YklGRCB0eXBlICVkLiIsIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VGlmZkVudHJ5PiBzdWJJZmRzID0gcGFyZW50LT5nZXRFbnRyeShzdWJJZmRUYWcpOworICAgIGlmIChzdWJJZmRzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGJ1aWxkRW50cnkoc3ViSWZkVGFnLCAxLCAmbmV3SWZkLCAmc3ViSWZkcykgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBidWlsZCBTdWJJZmQgZW50cnkgaW4gSUZEIDB4JXguIiwgX19GVU5DVElPTl9fLCBwYXJlbnRJZmQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0eXBlID09IEdQU0lORk8pIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGFkZCBHUFNJbmZvIFN1YklGRCB0byBJRkQgJXUsIG9uZSBhbHJlYWR5IGV4aXN0cy4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGlmZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yPHNwPFRpZmZJZmQ+ID4gc3ViSWZkTGlzdDsKKyAgICAgICAgY29uc3Qgc3A8VGlmZklmZD4qIG9sZElmZEFycmF5ID0gc3ViSWZkcy0+Z2V0RGF0YTxzcDxUaWZmSWZkPiA+KCk7CisgICAgICAgIGlmIChzdWJJZmRMaXN0LmFwcGVuZEFycmF5KG9sZElmZEFycmF5LCBzdWJJZmRzLT5nZXRDb3VudCgpKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGJ1aWxkIFN1YklmZCBlbnRyeSBpbiBJRkQgMHgleC4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudElmZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1YklmZExpc3QuYWRkKG5ld0lmZCkgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBidWlsZCBTdWJJZmQgZW50cnkgaW4gSUZEIDB4JXguIiwgX19GVU5DVElPTl9fLCBwYXJlbnRJZmQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gc3ViSWZkTGlzdC5zaXplKCk7CisgICAgICAgIGlmIChidWlsZEVudHJ5KHN1YklmZFRhZywgY291bnQsIHN1YklmZExpc3QuYXJyYXkoKSwgJnN1YklmZHMpIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYnVpbGQgU3ViSWZkIGVudHJ5IGluIElGRCAweCV4LiIsIF9fRlVOQ1RJT05fXywgcGFyZW50SWZkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGFyZW50LT5hZGRFbnRyeShzdWJJZmRzKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYWRkIFN1YklmZCBlbnRyeSBpbiBJRkQgMHgleC4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudElmZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYobU5hbWVkSWZkcy5hZGQoaWZkLCBuZXdJZmQpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBhZGQgbmV3IElGRCAweCV4LiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1RhZ1R5cGUgVGlmZldyaXRlcjo6Z2V0RGVmYXVsdFR5cGUodWludDE2X3QgdGFnKSBjb25zdCB7CisgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9uID0gbG9va3VwRGVmaW5pdGlvbih0YWcpOworICAgIGlmIChkZWZpbml0aW9uID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgZmluZCBkZWZpbml0aW9uIGZvciB0YWcgJXgiLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgIHJldHVybiBVTktOT1dOX1RBR1RZUEU7CisgICAgfQorICAgIHJldHVybiBkZWZpbml0aW9uLT5kZWZhdWx0VHlwZTsKK30KKwordWludDMyX3QgVGlmZldyaXRlcjo6Z2V0RGVmYXVsdENvdW50KHVpbnQxNl90IHRhZykgY29uc3QgeworICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbiA9IGxvb2t1cERlZmluaXRpb24odGFnKTsKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGZpbmQgZGVmaW5pdGlvbiBmb3IgdGFnICV4IiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGRlZmluaXRpb24tPmZpeGVkQ291bnQ7Cit9CisKK2Jvb2wgVGlmZldyaXRlcjo6aGFzSWZkKHVpbnQzMl90IGlmZCkgY29uc3QgeworICAgIHNzaXplX3QgaW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkoaWZkKTsKKyAgICByZXR1cm4gaW5kZXggPj0gMDsKK30KKworYm9vbCBUaWZmV3JpdGVyOjpjaGVja0lmRGVmaW5lZCh1aW50MTZfdCB0YWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9va3VwRGVmaW5pdGlvbih0YWcpICE9IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIqIFRpZmZXcml0ZXI6OmdldFRhZ05hbWUodWludDE2X3QgdGFnKSBjb25zdCB7CisgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9uID0gbG9va3VwRGVmaW5pdGlvbih0YWcpOworICAgIGlmIChkZWZpbml0aW9uID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBkZWZpbml0aW9uLT50YWdOYW1lOworfQorCitzcDxUaWZmSWZkPiBUaWZmV3JpdGVyOjpmaW5kTGFzdElmZCgpIHsKKyAgICBzcDxUaWZmSWZkPiBpZmQgPSBtSWZkOworICAgIHdoaWxlKGlmZCAhPSBOVUxMKSB7CisgICAgICAgIHNwPFRpZmZJZmQ+IG5leHRJZmQgPSBpZmQtPmdldE5leHRJZmQoKTsKKyAgICAgICAgaWYgKG5leHRJZmQgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWZkID0gbmV4dElmZDsKKyAgICB9CisgICAgcmV0dXJuIGlmZDsKK30KKworc3RhdHVzX3QgVGlmZldyaXRlcjo6d3JpdGVGaWxlSGVhZGVyKEVuZGlhbk91dHB1dCYgb3V0KSB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgdWludDE2X3QgZW5kTWFya2VyID0gKG91dC5nZXRFbmRpYW5uZXNzKCkgPT0gQklHKSA/IEJJR19FTkRJQU5fTUFSS0VSIDogTElUVExFX0VORElBTl9NQVJLRVI7CisgICAgQkFJTF9PTl9GQUlMKG91dC53cml0ZSgmZW5kTWFya2VyLCAwLCAxKSwgcmV0KTsKKworICAgIHVpbnQxNl90IHRpZmZNYXJrZXIgPSBUSUZGX0ZJTEVfTUFSS0VSOworICAgIEJBSUxfT05fRkFJTChvdXQud3JpdGUoJnRpZmZNYXJrZXIsIDAsIDEpLCByZXQpOworCisgICAgdWludDMyX3Qgb2Zmc2V0TWFya2VyID0gRklMRV9IRUFERVJfU0laRTsKKyAgICBCQUlMX09OX0ZBSUwob3V0LndyaXRlKCZvZmZzZXRNYXJrZXIsIDAsIDEpLCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3VpbnQzMl90IFRpZmZXcml0ZXI6OmdldFRvdGFsU2l6ZSgpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0b3RhbFNpemUgPSBGSUxFX0hFQURFUl9TSVpFOworICAgIHNwPFRpZmZJZmQ+IGlmZCA9IG1JZmQ7CisgICAgd2hpbGUoaWZkICE9IE5VTEwpIHsKKyAgICAgICAgdG90YWxTaXplICs9IGlmZC0+Z2V0U2l6ZSgpOworICAgICAgICBpZmQgPSBpZmQtPmdldE5leHRJZmQoKTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsU2l6ZTsKK30KKwordm9pZCBUaWZmV3JpdGVyOjpsb2coKSBjb25zdCB7CisgICAgQUxPR0koIiVzOiBUaWZmV3JpdGVyOiIsIF9fRlVOQ1RJT05fXyk7CisgICAgc2l6ZV90IGxlbmd0aCA9IG1OYW1lZElmZHMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgbU5hbWVkSWZkc1tpXS0+bG9nKCk7CisgICAgfQorfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliY3B1c3RhdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYmNwdXN0YXRzL0FuZHJvaWQubWsKaW5kZXggYjUwNjM1My4uZWUyODNhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliY3B1c3RhdHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJjcHVzdGF0cy9BbmRyb2lkLm1rCkBAIC0xLDQgKzEsNCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC04LDQgKzgsNiBAQAogCiBMT0NBTF9NT0RVTEUgOj0gbGliY3B1c3RhdHMKIAorTE9DQUxfQ0ZMQUdTIDo9IC1zdGQ9Z251KysxMSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcCBiL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcAppbmRleCA2Mzc0MDJhLi5jZmRjYjUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5jcHAKKysrIGIvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCi0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CkBAIC0yMTgsNyArMjE3LDcgQEAKICNkZWZpbmUgRlJFUV9TSVpFIDY0CiAgICAgICAgICAgICBjaGFyIGZyZXFfcGF0aFtGUkVRX1NJWkVdOwogI2RlZmluZSBGUkVRX0RJR0lUIDI3Ci0gICAgICAgICAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKE1BWF9DUFUgPD0gMTApOworICAgICAgICAgICAgc3RhdGljX2Fzc2VydChNQVhfQ1BVIDw9IDEwLCAiTUFYX0NQVSB0b28gbGFyZ2UiKTsKICNkZWZpbmUgRlJFUV9QQVRIICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHU/L2NwdWZyZXEvc2NhbGluZ19jdXJfZnJlcSIKICAgICAgICAgICAgIHN0cmxjcHkoZnJlcV9wYXRoLCBGUkVRX1BBVEgsIHNpemVvZihmcmVxX3BhdGgpKTsKICAgICAgICAgICAgIGZyZXFfcGF0aFtGUkVRX0RJR0lUXSA9IGNwdU51bSArICcwJzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKaW5kZXggMmJiNmRiZS4uZTBjYThhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKQEAgLTE1LDE2ICsxNSwxMCBAQAogCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4CiAKLWlmZXEgKCQoVEFSR0VUX09TKS0kKFRBUkdFVF9TSU1VTEFUT1IpLGxpbnV4LXRydWUpCi1MT0NBTF9MRExJQlMgKz0gLWxkbAotZW5kaWYKLQogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCi0KIExPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCmluZGV4IGQ4NGJjYTYuLjRhNDEwMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwpAQCAtMTYsNyArMTYsOCBAQAogCiAjZGVmaW5lIExPR19UQUcgIkVmZmVjdERvd25taXgiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KQEAgLTI5LDI1ICszMCwxMyBAQAogCiAjZGVmaW5lIE1JTlVTXzNfREJfSU5fUTE5XzEyIDI4OTYgLy8gLTNkQiA9IDAuNzA3ICogMl4xMiA9IDI4OTYKIAorLy8gc3Vic2V0IG9mIHBvc3NpYmxlIGF1ZGlvX2NoYW5uZWxfbWFza190IHZhbHVlcywgYW5kIEFVRElPX0NIQU5ORUxfT1VUXyogcmVuYW1lZCB0byBDSEFOTkVMX01BU0tfKgogdHlwZWRlZiBlbnVtIHsKLSAgICBDSEFOTkVMX01BU0tfU1VSUk9VTkQgPSBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCwKLSAgICBDSEFOTkVMX01BU0tfUVVBRF9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKLSAgICAvLyBsaWtlIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQgd2l0aCAqX1NJREVfKiBpbnN0ZWFkIG9mICpfQkFDS18qLCBzYW1lIGNoYW5uZWwgb3JkZXIKLSAgICBDSEFOTkVMX01BU0tfUVVBRF9TSURFID0KLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQsCi0gICAgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsCi0gICAgLy8gbGlrZSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIHdpdGggKl9TSURFXyogaW5zdGVhZCBvZiAqX0JBQ0tfKiwgc2FtZSBjaGFubmVsIG9yZGVyCi0gICAgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfU0lERSA9Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfTEVGVCB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hULAotICAgIENIQU5ORUxfTUFTS183UE9JTlQxX1NJREVfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCisgICAgQ0hBTk5FTF9NQVNLX1FVQURfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSywKKyAgICBDSEFOTkVMX01BU0tfUVVBRF9TSURFID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFLAorICAgIENIQU5ORUxfTUFTS181UE9JTlQxX0JBQ0sgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfU0lERSA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSwKKyAgICBDSEFOTkVMX01BU0tfN1BPSU5UMSA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCiB9IGRvd25taXhfaW5wdXRfY2hhbm5lbF9tYXNrX3Q7CiAKIC8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGRvd25taXggZWZmZWN0CkBAIC05OSw3ICs4OCw3IEBACiAvLyBzdHJpY3RseSBmb3IgdGVzdGluZywgbG9ncyB0aGUgaW5kaWNlcyBvZiB0aGUgY2hhbm5lbHMgZm9yIGEgZ2l2ZW4gbWFzaywKIC8vIHVzZXMgdGhlIHNhbWUgY29kZSBhcyBEb3dubWl4X2ZvbGRHZW5lcmljKCkKIHZvaWQgRG93bm1peF90ZXN0SW5kZXhDb21wdXRhdGlvbih1aW50MzJfdCBtYXNrKSB7Ci0gICAgQUxPR0koIlRlc3RpbmcgaW5kZXggY29tcHV0YXRpb24gZm9yIDB4JXg6IiwgbWFzayk7CisgICAgQUxPR0koIlRlc3RpbmcgaW5kZXggY29tcHV0YXRpb24gZm9yIDB4JSIgUFJJeDMyICI6IiwgbWFzayk7CiAgICAgLy8gY2hlY2sgYWdhaW5zdCB1bnN1cHBvcnRlZCBjaGFubmVscwogICAgIGlmIChtYXNrICYga1Vuc3VwcG9ydGVkKSB7CiAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjaGFubmVscyAodG9wIG9yIGZyb250IGxlZnQvcmlnaHQgb2YgY2VudGVyKSIpOwpAQCAtMTI5LDcgKzExOCw3IEBACiAgICAgICAgIGhhc0JhY2tzID0gdHJ1ZTsKICAgICB9CiAKLSAgICBjb25zdCBpbnQgbnVtQ2hhbiA9IHBvcGNvdW50KG1hc2spOworICAgIGNvbnN0IGludCBudW1DaGFuID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1hc2spOwogICAgIGNvbnN0IGJvb2wgaGFzRkMgPSAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpID09IEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUik7CiAgICAgY29uc3QgYm9vbCBoYXNMRkUgPQogICAgICAgICAgICAgKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSkgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSk7CkBAIC0yMjAsNyArMjA5LDcgQEAKIAogICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdCkgbW9kdWxlOwogCi0gICAgQUxPR1YoIkRvd25taXhMaWJfQ3JlYXRlKCkgJXAgLCBzaXplICVkIiwgbW9kdWxlLCBzaXplb2YoZG93bm1peF9tb2R1bGVfdCkpOworICAgIEFMT0dWKCJEb3dubWl4TGliX0NyZWF0ZSgpICVwICwgc2l6ZSAlenUiLCBtb2R1bGUsIHNpemVvZihkb3dubWl4X21vZHVsZV90KSk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTI1NCw3ICsyNDMsNyBAQAogICAgICAgICBBTE9HVigiRG93bm1peExpYl9HZXREZXNjcmlwdG9yKCkgaT0lZCIsIGkpOwogICAgICAgICBpZiAobWVtY21wKHV1aWQsICZnRGVzY3JpcHRvcnNbaV0tPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBnRGVzY3JpcHRvcnNbaV0sIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgICAgICAgICBBTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvciAtIFVVSUQgbWF0Y2hlZCBkb3dubWl4IHR5cGUgJWQsIFVVSUQgPSAleCIsCisgICAgICAgICAgICBBTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvciAtIFVVSUQgbWF0Y2hlZCBkb3dubWl4IHR5cGUgJWQsIFVVSUQgPSAlIiBQUkl4MzIsCiAgICAgICAgICAgICAgICAgIGksIGdEZXNjcmlwdG9yc1tpXS0+dXVpZC50aW1lTG93KTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CkBAIC0zMjgsNyArMzE3LDcgQEAKICAgICAgICAgICAvLyBieXBhc3MgdGhlIG9wdGltaXplZCBkb3dubWl4IHJvdXRpbmVzIGZvciB0aGUgY29tbW9uIGZvcm1hdHMKICAgICAgICAgICBpZiAoIURvd25taXhfZm9sZEdlbmVyaWMoCiAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgewotICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHgleCBpcyBub3Qgc3VwcG9ydGVkIiwgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOworICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHglIiBQUkl4MzIgIiBpcyBub3Qgc3VwcG9ydGVkIiwgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CkBAIC0zMzksMjAgKzMyOCwxNyBAQAogICAgICAgICBjYXNlIENIQU5ORUxfTUFTS19RVUFEX1NJREU6CiAgICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tUXVhZChwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLX1NVUlJPVU5EOgotICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbVN1cnJvdW5kKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfNVBPSU5UMV9CQUNLOgogICAgICAgICBjYXNlIENIQU5ORUxfTUFTS181UE9JTlQxX1NJREU6CiAgICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzdQT0lOVDFfU0lERV9CQUNLOgorICAgICAgICBjYXNlIENIQU5ORUxfTUFTS183UE9JTlQxOgogICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTdQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKCFEb3dubWl4X2ZvbGRHZW5lcmljKAogICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAweCV4IGlzIG5vdCBzdXBwb3J0ZWQiLCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgQUxPR0UoIk11bHRpY2hhbm5lbCBjb25maWd1cmF0aW9uIDB4JSIgUFJJeDMyICIgaXMgbm90IHN1cHBvcnRlZCIsIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzgwLDcgKzM2Niw3IEBACiAKICAgICBwRG93bm1peGVyID0gKGRvd25taXhfb2JqZWN0X3QqKSAmcER3bU1vZHVsZS0+Y29udGV4dDsKIAotICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKyAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIGNvbW1hbmQgJSIgUFJJdTMyICIgY21kU2l6ZSAlIiBQUkl1MzIsIGNtZENvZGUsIGNtZFNpemUpOwogCiAgICAgc3dpdGNoIChjbWRDb2RlKSB7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CkBAIC00MDQsNyArMzkwLDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOgotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICVkLCBwUmVwbHlEYXRhOiAlcCIsCisgICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gcENtZERhdGEgJXAsICpyZXBseVNpemUgJSIgUFJJdTMyICIsIHBSZXBseURhdGE6ICVwIiwKICAgICAgICAgICAgICAgICBwQ21kRGF0YSwgKnJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CiAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAogICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fApAQCAtNDEzLDcgKzM5OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnJlcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwUmVwbHlEYXRhOwogICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgcENtZERhdGEsIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpOwotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNIHBhcmFtICVkLCByZXBseVNpemUgJWQiLAorICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNIHBhcmFtICUiIFBSSWQzMiAiLCByZXBseVNpemUgJSIgUFJJdTMyLAogICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXJlcC0+ZGF0YSwgcmVwLT52c2l6ZSk7CiAgICAgICAgIHJlcC0+c3RhdHVzID0gRG93bm1peF9nZXRQYXJhbWV0ZXIocERvd25taXhlciwgKihpbnQzMl90ICopcmVwLT5kYXRhLCAmcmVwLT52c2l6ZSwKICAgICAgICAgICAgICAgICByZXAtPmRhdGEgKyBzaXplb2YoaW50MzJfdCkpOwpAQCAtNDIxLDggKzQwNyw4IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTToKLSAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBjbWRTaXplICVkIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICVkLCAiIFwKLSAgICAgICAgICAgICAgICAicFJlcGx5RGF0YSAlcCIsIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBjbWRTaXplICVkIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICIsIHBSZXBseURhdGEgJXAiLCBjbWRTaXplLCBwQ21kRGF0YSwgKnJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CiAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IChjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpCiAgICAgICAgICAgICAgICAgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gKGludClzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtNDcxLDcgKzQ1Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogICAgICAgICAvLyBGSVhNRSBjaGFuZ2UgdHlwZSBpZiBwbGF5aW5nIG9uIGhlYWRzZXQgdnMgc3BlYWtlcgotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfU0VUX0RFVklDRTogMHglMDh4IiwgKih1aW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6IDB4JTA4IiBQUkl4MzIsICoodWludDMyX3QgKilwQ21kRGF0YSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IHsKQEAgLTQ5MSw3ICs0NzcsNyBAQAogICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IChpbnQpc2l6ZW9mKHVpbnQzMl90KSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOiAlZCIsICoodWludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERTogJSIgUFJJdTMyLCAqKHVpbnQzMl90ICopcENtZERhdGEpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0U6CkBAIC01MDAsNyArNDg2LDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiRG93bm1peF9Db21tYW5kIGludmFsaWQgY29tbWFuZCAlZCIsY21kQ29kZSk7CisgICAgICAgIEFMT0dXKCJEb3dubWl4X0NvbW1hbmQgaW52YWxpZCBjb21tYW5kICUiIFBSSXUzMiwgY21kQ29kZSk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtNjI5LDcgKzYxNSw5IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIG1lbWNweSgmcER3bU1vZHVsZS0+Y29uZmlnLCBwQ29uZmlnLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSk7CisgICAgaWYgKCZwRHdtTW9kdWxlLT5jb25maWcgIT0gcENvbmZpZykgeworICAgICAgICBtZW1jcHkoJnBEd21Nb2R1bGUtPmNvbmZpZywgcENvbmZpZywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpOworICAgIH0KIAogICAgIGlmIChpbml0KSB7CiAgICAgICAgIHBEb3dubWl4ZXItPnR5cGUgPSBET1dOTUlYX1RZUEVfRk9MRDsKQEAgLTY0MSw3ICs2MjksOCBAQAogICAgICAgICAgICAgQUxPR0UoIkRvd25taXhfQ29uZmlndXJlIGVycm9yOiBpbnB1dCBjaGFubmVsIG1hc2sgY2FuJ3QgYmUgMCIpOwogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KLSAgICAgICAgcERvd25taXhlci0+aW5wdXRfY2hhbm5lbF9jb3VudCA9IHBvcGNvdW50KHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICAgICAgcERvd25taXhlci0+aW5wdXRfY2hhbm5lbF9jb3VudCA9CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICB9CiAKICAgICBEb3dubWl4X1Jlc2V0KHBEb3dubWl4ZXIsIGluaXQpOwpAQCAtNjk3LDMxICs2ODYsMzEgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotaW50IERvd25taXhfc2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHNpemVfdCBzaXplLCB2b2lkICpwVmFsdWUpIHsKK2ludCBEb3dubWl4X3NldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLCB2b2lkICpwVmFsdWUpIHsKIAogICAgIGludDE2X3QgdmFsdWUxNjsKLSAgICBBTE9HVigiRG93bm1peF9zZXRQYXJhbWV0ZXIsIGNvbnRleHQgJXAsIHBhcmFtICVkLCB2YWx1ZTE2ICVkLCB2YWx1ZTMyICVkIiwKKyAgICBBTE9HVigiRG93bm1peF9zZXRQYXJhbWV0ZXIsIGNvbnRleHQgJXAsIHBhcmFtICUiIFBSSWQzMiAiLCB2YWx1ZTE2ICUiIFBSSWQxNiAiLCB2YWx1ZTMyICUiIFBSSWQzMiwKICAgICAgICAgICAgIHBEb3dubWl4ZXIsIHBhcmFtLCAqKGludDE2X3QgKilwVmFsdWUsICooaW50MzJfdCAqKXBWYWx1ZSk7CiAKICAgICBzd2l0Y2ggKHBhcmFtKSB7CiAKICAgICAgIGNhc2UgRE9XTk1JWF9QQVJBTV9UWVBFOgogICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoZG93bm1peF90eXBlX3QpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIoRE9XTk1JWF9QQVJBTV9UWVBFKSBpbnZhbGlkIHNpemUgJWQsIHNob3VsZCBiZSAlZCIsCisgICAgICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIoRE9XTk1JWF9QQVJBTV9UWVBFKSBpbnZhbGlkIHNpemUgJSIgUFJJdTMyICIsIHNob3VsZCBiZSAlenUiLAogICAgICAgICAgICAgICAgICAgICBzaXplLCBzaXplb2YoZG93bm1peF90eXBlX3QpKTsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CiAgICAgICAgIHZhbHVlMTYgPSAqKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgIEFMT0dWKCJzZXQgRE9XTk1JWF9QQVJBTV9UWVBFLCB0eXBlICVkIiwgdmFsdWUxNik7CisgICAgICAgIEFMT0dWKCJzZXQgRE9XTk1JWF9QQVJBTV9UWVBFLCB0eXBlICUiIFBSSWQxNiwgdmFsdWUxNik7CiAgICAgICAgIGlmICghKCh2YWx1ZTE2ID4gRE9XTk1JWF9UWVBFX0lOVkFMSUQpICYmICh2YWx1ZTE2IDw9IERPV05NSVhfVFlQRV9MQVNUKSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJEb3dubWl4X3NldFBhcmFtZXRlciBpbnZhbGlkIERPV05NSVhfUEFSQU1fVFlQRSB2YWx1ZSAlZCIsIHZhbHVlMTYpOworICAgICAgICAgICAgQUxPR0UoIkRvd25taXhfc2V0UGFyYW1ldGVyIGludmFsaWQgRE9XTk1JWF9QQVJBTV9UWVBFIHZhbHVlICUiIFBSSWQxNiwgdmFsdWUxNik7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBEb3dubWl4ZXItPnR5cGUgPSAoZG93bm1peF90eXBlX3QpIHZhbHVlMTY7CiAgICAgICAgIGJyZWFrOwogCiAgICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbWV0ZXIgJWQiLCBwYXJhbSk7CisgICAgICAgIEFMT0dFKCJEb3dubWl4X3NldFBhcmFtZXRlciB1bmtub3duIHBhcmFtZXRlciAlIiBQUklkMzIsIHBhcmFtKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogfQpAQCAtNzUzLDI0ICs3NDIsMjQgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHNpemVfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSkgeworaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKSB7CiAgICAgaW50MTZfdCAqcFZhbHVlMTY7CiAKICAgICBzd2l0Y2ggKHBhcmFtKSB7CiAKICAgICBjYXNlIERPV05NSVhfUEFSQU1fVFlQRToKICAgICAgIGlmICgqcFNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKLSAgICAgICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgaW52YWxpZCBwYXJhbWV0ZXIgc2l6ZSAlZCBmb3IgRE9XTk1JWF9QQVJBTV9UWVBFIiwgKnBTaXplKTsKKyAgICAgICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgaW52YWxpZCBwYXJhbWV0ZXIgc2l6ZSAlIiBQUkl1MzIgIiBmb3IgRE9XTk1JWF9QQVJBTV9UWVBFIiwgKnBTaXplKTsKICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgIH0KICAgICAgIHBWYWx1ZTE2ID0gKGludDE2X3QgKilwVmFsdWU7CiAgICAgICAqcFZhbHVlMTYgPSAoaW50MTZfdCkgcERvd25taXhlci0+dHlwZTsKICAgICAgICpwU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKLSAgICAgIEFMT0dWKCJEb3dubWl4X2dldFBhcmFtZXRlciBET1dOTUlYX1BBUkFNX1RZUEUgaXMgJWQiLCAqcFZhbHVlMTYpOworICAgICAgQUxPR1YoIkRvd25taXhfZ2V0UGFyYW1ldGVyIERPV05NSVhfUEFSQU1fVFlQRSBpcyAlIiBQUklkMTYsICpwVmFsdWUxNik7CiAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbWV0ZXIgJWQiLCBwYXJhbSk7CisgICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbWV0ZXIgJSIgUFJJZDE2LCBwYXJhbSk7CiAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKQEAgLTgyNSw2NSArODE0LDYgQEAKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERvd25taXhfZm9sZEZyb21TdXJyb3VuZCgpCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFB1cnBvc2U6Ci0gKiBkb3dubWl4IGEgInN1cnJvdW5kIHNvdW5kIiAobW9ubyByZWFyKSBzaWduYWwgdG8gc3RlcmVvCi0gKgotICogSW5wdXRzOgotICogIHBTcmMgICAgICAgc3Vycm91bmQgc2lnbmFsIHRvIGRvd25taXgKLSAqICBudW1GcmFtZXMgIHRoZSBudW1iZXIgb2Ygc3Vycm91bmQgZnJhbWVzIHRvIGRvd25taXgKLSAqICBhY2N1bXVsYXRlIHdoZXRoZXIgdG8gbWl4ICh3aGVuIHRydWUpIHRoZSByZXN1bHQgb2YgdGhlIGRvd25taXggd2l0aCB0aGUgY29udGVudHMgb2YgcERzdCwKLSAqICAgICAgICAgICAgICAgb3Igb3ZlcndyaXRlIHBEc3QgKHdoZW4gZmFsc2UpCi0gKgotICogT3V0cHV0czoKLSAqICBwRHN0ICAgICAgIGRvd25taXhlZCBzdGVyZW8gYXVkaW8gc2FtcGxlcwotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi12b2lkIERvd25taXhfZm9sZEZyb21TdXJyb3VuZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewotICAgIGludDMyX3QgbHQsIHJ0LCBjZW50ZXJQbHVzUmVhckNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQwotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIFJDCi0gICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0Ci0gICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQotICAgIGlmIChhY2N1bXVsYXRlKSB7Ci0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IEZDKC0zZEIpICsgUkMoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgbHQgPSAocFNyY1swXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgcnQgPSAocFNyY1sxXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXAxNihwRHN0WzBdICsgKGx0ID4+IDEzKSk7Ci0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXAxNihwRHN0WzFdICsgKHJ0ID4+IDEzKSk7Ci0gICAgICAgICAgICBwU3JjICs9IDQ7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCi0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IEZDKC0zZEIpICsgUkMoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgbHQgPSAocFNyY1swXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgcnQgPSAocFNyY1sxXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBzdG9yZSBpbiBkZXN0aW5hdGlvbgotICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wMTYobHQgPj4gMTMpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcDE2KHJ0ID4+IDEzKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCi0gICAgICAgICAgICBwU3JjICs9IDQ7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZm9sZEZyb201UG9pbnQxKCkKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogUHVycG9zZToKQEAgLTEwNjgsNyArOTk4LDcgQEAKICAgICAgICAgaGFzQmFja3MgPSB0cnVlOwogICAgIH0KIAotICAgIGNvbnN0IGludCBudW1DaGFuID0gcG9wY291bnQobWFzayk7CisgICAgY29uc3QgaW50IG51bUNoYW4gPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWFzayk7CiAgICAgY29uc3QgYm9vbCBoYXNGQyA9ICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUikgPT0gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKTsKICAgICBjb25zdCBib29sIGhhc0xGRSA9CiAgICAgICAgICAgICAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSA9PSBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmggYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCmluZGV4IGNiNmI5NTcuLjIzOTlhYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaApAQCAtOTMsMTEgKzkzLDEwIEBACiBpbnQgRG93bm1peF9Jbml0KGRvd25taXhfbW9kdWxlX3QgKnBEd21Nb2R1bGUpOwogaW50IERvd25taXhfQ29uZmlndXJlKGRvd25taXhfbW9kdWxlX3QgKnBEd21Nb2R1bGUsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZywgYm9vbCBpbml0KTsKIGludCBEb3dubWl4X1Jlc2V0KGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGJvb2wgaW5pdCk7Ci1pbnQgRG93bm1peF9zZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgc2l6ZV90IHNpemUsIHZvaWQgKnBWYWx1ZSk7Ci1pbnQgRG93bm1peF9nZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgc2l6ZV90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKK2ludCBEb3dubWl4X3NldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLCB2b2lkICpwVmFsdWUpOworaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKIAogdm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Ci12b2lkIERvd25taXhfZm9sZEZyb21TdXJyb3VuZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiB2b2lkIERvd25taXhfZm9sZEZyb201UG9pbnQxKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIHZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwogYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5tawppbmRleCA2MGE2Y2U1Li5hOTMyYWY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5tawpAQCAtOSw3ICs5LDYgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmN1dGlscyBsaWJsb2cKIAotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpCiBMT0NBTF9NT0RVTEU6PSBsaWJlZmZlY3RzCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCmluZGV4IDMyYzRjZTAuLjM1ZTViYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwpAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuKExWREJFX05VTExBRERSRVNTKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoKExWTV9VSU5UMzIpcE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzICUgcE1lbW9yeVRhYmxlLT5SZWdpb25baV0uQWxpZ25tZW50KSE9MCl7CisgICAgICAgICAgICBpZiAoKCh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzICUgcE1lbW9yeVRhYmxlLT5SZWdpb25baV0uQWxpZ25tZW50KSE9MCl7CiAgICAgICAgICAgICAgICAgcmV0dXJuKExWREJFX0FMSUdOTUVOVEVSUk9SKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKaW5kZXggNzk0MjcxYi4uZjVhMDFmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCkBAIC05OSw3ICs5OSw3IEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIENoZWNrIHRoZSBidWZmZXIgYWxpZ25tZW50CiAgICAgICAgICAqLwotICAgICAgICBpZigoKChMVk1fVUlOVDMyKXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKChMVk1fVUlOVDMyKXBPdXREYXRhICUgNCkgIT0gMCkpCisgICAgICAgIGlmKCgoKHVpbnRwdHJfdClwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgodWludHB0cl90KXBPdXREYXRhICUgNCkgIT0gMCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybihMVk1fQUxJR05NRU5URVJST1IpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9JbnN0QWxsb2MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCmluZGV4IGM2OTU0ZjIuLjdmNzI1ZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCkBAIC0yOSw3ICsyOSw3IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgIFRvdGFsU2l6ZTsgICAgICAvKiAgQWNjdW11bGF0aXZlIHRvdGFsIG1lbW9yeSBzaXplICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgcE5leHRNZW1iZXI7ICAgIC8qICBQb2ludGVyIHRvIHRoZSBuZXh0IGluc3RhbmNlIG1lbWJlciB0byBiZSBhbGxvY2F0ZWQgKi8KKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICBwTmV4dE1lbWJlcjsgICAgLyogIFBvaW50ZXIgdG8gdGhlIG5leHQgaW5zdGFuY2UgbWVtYmVyIHRvIGJlIGFsbG9jYXRlZCAqLwogfSAgIElOU1RfQUxMT0M7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCA4MTY1NWRkLi4wYzZmYjI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtMjksNiArMjksNyBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAorI2luY2x1ZGUgPHN0ZGludC5oPgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODUsMTQgKzg2LDE0IEBACiAKIHR5cGVkZWYgICAgIGNoYXIgICAgICAgICAgICAgICAgTFZNX0NIQVI7ICAgICAgICAgICAvKiBBU0NJSSBjaGFyYWN0ZXIgKi8KIAotdHlwZWRlZiAgICAgY2hhciAgICAgICAgICAgICAgICBMVk1fSU5UODsgICAgICAgICAgIC8qIFNpZ25lZCA4LWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1bnNpZ25lZCBjaGFyICAgICAgIExWTV9VSU5UODsgICAgICAgICAgLyogVW5zaWduZWQgOC1iaXQgd29yZCAqLwordHlwZWRlZiAgICAgaW50OF90ICAgICAgICAgICAgICBMVk1fSU5UODsgICAgICAgICAgIC8qIFNpZ25lZCA4LWJpdCB3b3JkICovCit0eXBlZGVmICAgICB1aW50OF90ICAgICAgICAgICAgIExWTV9VSU5UODsgICAgICAgICAgLyogVW5zaWduZWQgOC1iaXQgd29yZCAqLwogCi10eXBlZGVmICAgICBzaG9ydCAgICAgICAgICAgICAgIExWTV9JTlQxNjsgICAgICAgICAgLyogU2lnbmVkIDE2LWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1bnNpZ25lZCBzaG9ydCAgICAgIExWTV9VSU5UMTY7ICAgICAgICAgLyogVW5zaWduZWQgMTYtYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIGludDE2X3QgICAgICAgICAgICAgTFZNX0lOVDE2OyAgICAgICAgICAvKiBTaWduZWQgMTYtYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIHVpbnQxNl90ICAgICAgICAgICAgTFZNX1VJTlQxNjsgICAgICAgICAvKiBVbnNpZ25lZCAxNi1iaXQgd29yZCAqLwogCi10eXBlZGVmICAgICBsb25nICAgICAgICAgICAgICAgIExWTV9JTlQzMjsgICAgICAgICAgLyogU2lnbmVkIDMyLWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1bnNpZ25lZCBsb25nICAgICAgIExWTV9VSU5UMzI7ICAgICAgICAgLyogVW5zaWduZWQgMzItYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIGludDMyX3QgICAgICAgICAgICAgTFZNX0lOVDMyOyAgICAgICAgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIHVpbnQzMl90ICAgICAgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYwppbmRleCA0ODFkZjg0Li5hODlhNWMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYwpAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpTdGFydEFkZHIgKQogewogICAgIHBtcy0+VG90YWxTaXplID0gMzsKLSAgICBwbXMtPnBOZXh0TWVtYmVyID0gKExWTV9VSU5UMzIpKCgoTFZNX1VJTlQzMilTdGFydEFkZHIgKyAzKSAmIDB4RkZGRkZGRkMpOy8qIFRoaXMgY29kZSB3aWxsIGZhaWwgaWYgdGhlIHBsYXRmb3JtIGFkZHJlc3Mgc3BhY2UgaXMgbW9yZSB0aGFuIDMyLWJpdHMqLworICAgIHBtcy0+cE5leHRNZW1iZXIgPSAoKCh1aW50cHRyX3QpU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKIH0KIAogCkBAIC01MSw3ICs1MSw3IEBACiAgICAgdm9pZCAqTmV3TWVtYmVyQWRkcmVzczsgLyogVmFyaWFibGUgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIHJldHVybiB2YWx1ZSAqLwogICAgIE5ld01lbWJlckFkZHJlc3MgPSAodm9pZCopcG1zLT5wTmV4dE1lbWJlcjsKIAotICAgIFNpemUgPSAoKFNpemUgKyAzKSAmIDB4RkZGRkZGRkMpOyAvKiBDZWlsIHRoZSBzaXplIHRvIGEgbXVsdGlwbGUgb2YgZm91ciAqLworICAgIFNpemUgPSAoKFNpemUgKyAzKSAmIChMVk1fVUlOVDMyKX4zKTsgLyogQ2VpbCB0aGUgc2l6ZSB0byBhIG11bHRpcGxlIG9mIGZvdXIgKi8KIAogICAgIHBtcy0+VG90YWxTaXplICs9IFNpemU7CiAgICAgcG1zLT5wTmV4dE1lbWJlciArPSBTaXplOwpAQCAtODQsMzAgKzg0LDMwIEBACiB2b2lkICAgIEluc3RBbGxvY19Jbml0QWxsKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgICpwbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSkKIHsKLSAgICBMVk1fVUlOVDMyIFN0YXJ0QWRkcjsKKyAgICB1aW50cHRyX3QgU3RhcnRBZGRyOwogCi0gICAgU3RhcnRBZGRyID0gKExWTV9VSU5UMzIpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3M7CisgICAgU3RhcnRBZGRyID0gKHVpbnRwdHJfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzczsKIAogICAgIHBtc1swXS5Ub3RhbFNpemUgPSAzOwotICAgIHBtc1swXS5wTmV4dE1lbWJlciA9IChMVk1fVUlOVDMyKSgoKExWTV9VSU5UMzIpU3RhcnRBZGRyICsgMykgJiAweEZGRkZGRkZDKTsKKyAgICBwbXNbMF0ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7CiAKIAotICAgIFN0YXJ0QWRkciA9IChMVk1fVUlOVDMyKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOworICAgIFN0YXJ0QWRkciA9ICh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CiAKICAgICBwbXNbMV0uVG90YWxTaXplID0gMzsKLSAgICBwbXNbMV0ucE5leHRNZW1iZXIgPSAoTFZNX1VJTlQzMikoKChMVk1fVUlOVDMyKVN0YXJ0QWRkciArIDMpICYgMHhGRkZGRkZGQyk7CisgICAgcG1zWzFdLnBOZXh0TWVtYmVyID0gKChTdGFydEFkZHIgKyAzKSAmICh1aW50cHRyX3QpfjMpOwogCiAKLSAgICBTdGFydEFkZHIgPSAoTFZNX1VJTlQzMilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBTdGFydEFkZHIgPSAodWludHB0cl90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOwogCiAgICAgcG1zWzJdLlRvdGFsU2l6ZSA9IDM7Ci0gICAgcG1zWzJdLnBOZXh0TWVtYmVyID0gKExWTV9VSU5UMzIpKCgoTFZNX1VJTlQzMilTdGFydEFkZHIgKyAzKSAmIDB4RkZGRkZGRkMpOworICAgIHBtc1syXS5wTmV4dE1lbWJlciA9ICgoU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKIAogCi0gICAgU3RhcnRBZGRyID0gKExWTV9VSU5UMzIpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CisgICAgU3RhcnRBZGRyID0gKHVpbnRwdHJfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKIAogICAgIHBtc1szXS5Ub3RhbFNpemUgPSAzOwotICAgIHBtc1szXS5wTmV4dE1lbWJlciA9IChMVk1fVUlOVDMyKSgoKExWTV9VSU5UMzIpU3RhcnRBZGRyICsgMykgJiAweEZGRkZGRkZDKTsKKyAgICBwbXNbM10ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCmluZGV4IGM0NzY3YTguLmUwMWMxYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJMVkVRTkIuaCIKICNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkluc3RBbGxvYy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPiAvKiBGb3IgbWVtc2V0ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKaW5kZXggYWMzYzc0MC4uNThmNThlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYwpAQCAtNzcsNyArNzcsNyBAQAogICAgIH0KIAogICAgIC8qIENoZWNrIGlmIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgYnVmZmVycyBhcmUgMzItYml0IGFsaWduZWQgKi8KLSAgICBpZiAoKCgoTFZNX0lOVDMyKXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKChMVk1fSU5UMzIpcE91dERhdGEgJSA0KSAhPSAwKSkKKyAgICBpZiAoKCgodWludHB0cl90KXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKCh1aW50cHRyX3QpcE91dERhdGEgJSA0KSAhPSAwKSkKICAgICB7CiAgICAgICAgIHJldHVybiBMVkVRTkJfQUxJR05NRU5URVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKaW5kZXggODlkOTczYS4uZWE3MmU2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCkBAIC0xOSwxMSArMTksMTMgQEAKICNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgKHNpemVvZiBhcnJheSAvIHNpemVvZiBhcnJheVswXSkKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG5ldz4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxuZXc+CisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CiAjaW5jbHVkZSAiRWZmZWN0QnVuZGxlLmgiCiAKIApAQCAtMTM4LDIyICsxNDAsMjIgQEAKIGludCAgQmFzc0Jvb3N0X3NldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgQmFzc0Jvb3N0X2dldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqcFZhbHVlKTsKIGludCAgVmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqcFZhbHVlKTsKIGludCAgRXF1YWxpemVyX3NldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgRXF1YWxpemVyX2dldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKIGludCAgVm9sdW1lX3NldFBhcmFtZXRlciAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgVm9sdW1lX2dldFBhcmFtZXRlciAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKIGludCBFZmZlY3Rfc2V0RW5hYmxlZChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgYm9vbCBlbmFibGVkKTsKIApAQCAtMTYxLDcgKzE2Myw3IEBACiAKIGV4dGVybiAiQyIgaW50IEVmZmVjdENyZWF0ZShjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgaW9JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqcEhhbmRsZSl7CiAgICAgaW50IHJldCA9IDA7CiAgICAgaW50IHNlc3Npb25ObzsKQEAgLTIyMSw2ICsyMjMsOCBAQAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc1RlbXBEaXNhYmxlZCAgICAgICAgPSBMVk1fRkFMU0U7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgICAgICA9IExWTV9GQUxTRTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlICAgICAgICAgICAgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkICAgICA9IDA7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgICAgICA9IDA7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lICAgICAgICAgICAgICA9IExWTV9UUlVFOwpAQCAtNTYwLDExICs1NjQsMTIgQEAKICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID0gbWFsbG9jKE1lbVRhYi5SZWdpb25baV0uU2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJWxkIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CiAgICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fVFJVRTsKICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBhbGxvY2F0ZWQgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTc2LDExICs1ODEsMTEgQEAKICAgICBpZihiTWFsbG9jRmFpbHVyZSA9PSBMVk1fVFJVRSl7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICVsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgTm90IGZyZWVpbmdcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOwogICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQ6IGJ1dCBhbGxvY2F0ZWQgJWxkIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAogICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9CkBAIC04ODksMTYgKzg5NCwxNiBAQAogICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CiAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7CiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBTVEFSVCBmcmVlaW5nICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gU1RBUlQgZnJlZWluZyAlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAKICAgICAgICAgICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKIAotICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZnJlZSAtIEVORCAgIGZyZWVpbmcgJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAlbGQgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgYXQgJXAgRVJST1JcbiIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTYzLDYgKzExNjgsMTc3IEBACiAgICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcblxuIik7CiB9ICAgIC8qIGVuZCBzZXRTdHJlbmd0aCAqLwogCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQ2hlY2sgaWYgYW4gYXVkaW8gZGV2aWNlIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKy8vCisvLyBJbnB1dHM6CisvLyAgZGV2aWNlVHlwZSAgIHRoZSB0eXBlIG9mIGRldmljZSB0aGF0IGFmZmVjdHMgdGhlIHByb2Nlc3NpbmcgKGUuZy4gZm9yIGJpbmF1cmFsIHZzIHRyYW5zYXVyYWwpCisvLyBPdXRwdXQ6CisvLyAgLUVJTlZBTCAgICAgIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb3IgaXQgaXMgdW5rbm93bgorLy8gIDAgICAgICAgICAgICBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBzdXBwb3J0ZWQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IFZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIHsKKyAgICBzd2l0Y2ggKGRldmljZVR5cGUpIHsKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDoKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOgorICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOgorICAgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0IDoKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZpcnR1YWxpemVySXNDb25maWd1cmF0aW9uU3VwcG9ydGVkKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIENoZWNrIGlmIGEgY2hhbm5lbCBtYXNrICsgYXVkaW8gZGV2aWNlIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKy8vCisvLyBJbnB1dHM6CisvLyAgY2hhbm5lbE1hc2sgIHRoZSBjaGFubmVsIG1hc2sgb2YgdGhlIGlucHV0IHRvIHZpcnR1YWxpemUKKy8vICBkZXZpY2VUeXBlICAgdGhlIHR5cGUgb2YgZGV2aWNlIHRoYXQgYWZmZWN0cyB0aGUgcHJvY2Vzc2luZyAoZS5nLiBmb3IgYmluYXVyYWwgdnMgdHJhbnNhdXJhbCkKKy8vIE91dHB1dDoKKy8vICAtRUlOVkFMICAgICAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvciBpdCBpcyB1bmtub3duCisvLyAgMCAgICAgICAgICAgIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgVmlydHVhbGl6ZXJJc0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlKSB7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICBpZiAoKGNoYW5uZWxDb3VudCA9PSAwKSB8fCAoY2hhbm5lbENvdW50ID4gMikpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIFZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoZGV2aWNlVHlwZSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBGb3JjZSB0aGUgdmlydHVhbGl6YXRpb24gbW9kZSB0byB0aGF0IG9mIHRoZSBnaXZlbiBhdWRpbyBkZXZpY2UKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQgICAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIGZvcmNlZERldmljZSB0aGUgdHlwZSBvZiBkZXZpY2Ugd2hvc2UgdmlydHVhbGl6YXRpb24gbW9kZSB3ZSdsbCBhbHdheXMgdXNlCisvLyBPdXRwdXQ6CisvLyAgLUVJTlZBTCAgICAgIGlmIHRoZSBkZXZpY2UgaXMgbm90IHN1cHBvcnRlZCBvciBpcyB1bmtub3duCisvLyAgMCAgICAgICAgICAgIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIGFuZCB0aGUgdmlydHVhbGl6YXRpb24gbW9kZSBmb3JjZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlKSB7CisgICAgQUxPR1YoIlZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGU6IGZvcmNlZERldj0weCV4IGVuYWJsZWQ9JWQgdG1wRGlzYWJsZWQ9JWQiLAorICAgICAgICAgICAgZm9yY2VkRGV2aWNlLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkLAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkKTsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBib29sIHVzZVZpcnR1YWxpemVyID0gZmFsc2U7CisKKyAgICBpZiAoVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChmb3JjZWREZXZpY2UpICE9IDApIHsKKyAgICAgICAgLy8gZm9yY2VkIGRldmljZSBpcyBub3Qgc3VwcG9ydGVkLCBtYWtlIGl0IGJlaGF2ZSBhcyBhIHJlc2V0IG9mIGZvcmNlZCBtb2RlCisgICAgICAgIGZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICAvLyBidXQgcmV0dXJuIGFuIGVycm9yCisgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGZvcmNlZERldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAvLyBkaXNhYmxpbmcgZm9yY2VkIHZpcnR1YWxpemF0aW9uIG1vZGU6CisgICAgICAgIC8vIHZlcmlmeSB3aGV0aGVyIHRoZSB2aXJ0dWFsaXphdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBvciBkaXNhYmxlZAorICAgICAgICBpZiAoVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlKSA9PSAwKSB7CisgICAgICAgICAgICB1c2VWaXJ0dWFsaXplciA9IChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBmb3JjaW5nIHZpcnR1YWxpemF0aW9uIG1vZGU6IGhlcmUgd2UgYWxyZWFkeSBrbm93IHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOworICAgICAgICAvLyBvbmx5IGVuYWJsZSBmb3IgYSBzdXBwb3J0ZWQgbW9kZSwgd2hlbiB0aGUgZWZmZWN0IGlzIGVuYWJsZWQKKyAgICAgICAgdXNlVmlydHVhbGl6ZXIgPSAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSk7CisgICAgfQorCisgICAgaWYgKHVzZVZpcnR1YWxpemVyKSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPT0gTFZNX1RSVUUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUgcmUtZW5hYmxlIExWTV9WSVJUVUFMSVpFUiIpOworICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2VuYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiXHRWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlIGxlYXZpbmcgTFZNX1ZJUlRVQUxJWkVSIGVuYWJsZWQiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPT0gTFZNX0ZBTFNFKSB7CisgICAgICAgICAgICBBTE9HVigiXHRWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlIGRpc2FibGUgTFZNX1ZJUlRVQUxJWkVSIik7CisgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUgbGVhdmluZyBMVk1fVklSVFVBTElaRVIgZGlzYWJsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJcdGFmdGVyIFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGU6IGVuYWJsZWQ9JWQgdG1wRGlzYWJsZWQ9JWQiLAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCwKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IHRoZSB2aXJ0dWFsIHNwZWFrZXIgYW5nbGVzIGZvciBhIGNoYW5uZWwgbWFzayArIGF1ZGlvIGRldmljZSB0eXBlCisvLyBjb25maWd1cmF0aW9uIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKy8vCisvLyBJbnB1dHM6CisvLyAgY2hhbm5lbE1hc2s6ICAgdGhlIGNoYW5uZWwgbWFzayBvZiB0aGUgaW5wdXQgdG8gdmlydHVhbGl6ZQorLy8gIGRldmljZVR5cGUgICAgIHRoZSB0eXBlIG9mIGRldmljZSB0aGF0IGFmZmVjdHMgdGhlIHByb2Nlc3NpbmcgKGUuZy4gZm9yIGJpbmF1cmFsIHZzIHRyYW5zYXVyYWwpCisvLyBJbnB1dC9PdXRwdXQ6CisvLyAgcFNwZWFrZXJBbmdsZXMgdGhlIGFycmF5IG9mIGludGVnZXIgd2hlcmUgZWFjaCBzcGVha2VyIGFuZ2xlIGlzIHdyaXR0ZW4gYXMgYSB0cmlwbGV0IGluIHRoZQorLy8gICAgICAgICAgICAgICAgIGZvbGxvd2luZyBmb3JtYXQ6CisvLyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhIGJpdCBtYXNrIHdpdGggYSBzaW5nbGUgdmFsdWUgc2VsZWN0ZWQgZm9yIGVhY2ggc3BlYWtlciwgZm9sbG93aW5nCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29udmVudGlvbiBvZiB0aGUgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHlwZQorLy8gICAgICAgICAgICAgICAgICAgIGludDMyX3QgYSB2YWx1ZSBpbiBkZWdyZWVzIGV4cHJlc3NpbmcgdGhlIHNwZWFrZXIgYXppbXV0aCwgd2hlcmUgMCBpcyBpbiBmcm9udAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHVzZXIsIDE4MCBiZWhpbmQsIC05MCB0byB0aGUgbGVmdCwgOTAgdG8gdGhlIHJpZ2h0IG9mIHRoZSB1c2VyCisvLyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhIHZhbHVlIGluIGRlZ3JlZXMgZXhwcmVzc2luZyB0aGUgc3BlYWtlciBlbGV2YXRpb24sIHdoZXJlIDAgaXMgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIHBsYW5lLCArOTAgaXMgZGlyZWN0bHkgYWJvdmUgdGhlIHVzZXIsIC05MCBiZWxvdworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgX191bnVzZWQsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlIF9fdW51c2VkLCBpbnQzMl90ICpwU3BlYWtlckFuZ2xlcykgeworICAgIC8vIHRoZSBjaGFubmVsIGNvdW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgMSBvciAyCisgICAgLy8gdGhlIGRldmljZSBpcyBndWFyYW50ZWVkIHRvIGJlIG9mIHR5cGUgaGVhZHBob25lCisgICAgLy8gdGhpcyB2aXJ0dWFsaXplciBpcyBhbHdheXMgMmluIHdpdGggc3BlYWtlcnMgYXQgLTkwIGFuZCA5MGRlZyBvZiBhemltdXRoLCAwZGVnIG9mIGVsZXZhdGlvbgorICAgICpwU3BlYWtlckFuZ2xlcysrID0gKGludDMyX3QpIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQ7CisgICAgKnBTcGVha2VyQW5nbGVzKysgPSAtOTA7IC8vIGF6aW11dGgKKyAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IDA7ICAgLy8gZWxldmF0aW9uCisgICAgKnBTcGVha2VyQW5nbGVzKysgPSAoaW50MzJfdCkgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQ7CisgICAgKnBTcGVha2VyQW5nbGVzKysgPSA5MDsgIC8vIGF6aW11dGgKKyAgICAqcFNwZWFrZXJBbmdsZXMgICA9IDA7ICAgLy8gZWxldmF0aW9uCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJHZXRWaXJ0dWFsaXphdGlvbk1vZGUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gUmV0cmlldmUgdGhlIGN1cnJlbnQgZGV2aWNlIHdob3NlIHByb2Nlc3NpbmcgbW9kZSBpcyB1c2VkIGJ5IHRoaXMgZWZmZWN0CisvLworLy8gT3V0cHV0OgorLy8gICBBVURJT19ERVZJQ0VfTk9ORSBpZiB0aGUgZWZmZWN0IGlzIG5vdCB2aXJ0dWFsaXppbmcKKy8vICAgb3IgdGhlIGRldmljZSB0eXBlIGlmIHRoZSBlZmZlY3QgaXMgdmlydHVhbGl6aW5nCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2F1ZGlvX2RldmljZXNfdCBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCkgeworICAgIGF1ZGlvX2RldmljZXNfdCB2aXJ0RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKQorICAgICAgICAgICAgJiYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9PSBMVk1fRkFMU0UpKSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIC8vIHZpcnR1YWxpemF0aW9uIG1vZGUgaXMgZm9yY2VkLCByZXR1cm4gdGhhdCBkZXZpY2UKKyAgICAgICAgICAgIHZpcnREZXZpY2UgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBubyBmb3JjZWQgbW9kZSwgcmV0dXJuIHRoZSBjdXJyZW50IGRldmljZQorICAgICAgICAgICAgdmlydERldmljZSA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2U7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIlZpcnR1YWxpemVyR2V0VmlydHVhbGl6YXRpb25Nb2RlKCkgcmV0dXJuaW5nIDB4JXgiLCB2aXJ0RGV2aWNlKTsKKyAgICByZXR1cm4gdmlydERldmljZTsKK30KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFcXVhbGl6ZXJMaW1pdEJhbmRMZXZlbHMoKQpAQCAtMTM1Nyw3ICsxNTMzLDcgQEAKIC8vICBwTG93OiAgICAgICBsb3dlciBiYW5kIHJhbmdlCiAvLyAgcExvdzogICAgICAgdXBwZXIgYmFuZCByYW5nZQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQzMl90IEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDMyX3QgYmFuZCwgdWludDMyX3QgKnBMb3csCitpbnQzMl90IEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UoRWZmZWN0Q29udGV4dCAqcENvbnRleHQgX191bnVzZWQsIGludDMyX3QgYmFuZCwgdWludDMyX3QgKnBMb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBIaSl7CiAgICAgKnBMb3cgPSBiYW5kRnJlcVJhbmdlW2JhbmRdWzBdOwogICAgICpwSGkgID0gYmFuZEZyZXFSYW5nZVtiYW5kXVsxXTsKQEAgLTEzODEsNyArMTU1Nyw3IEBACiAvLyAgcExvdzogICAgICAgbG93ZXIgYmFuZCByYW5nZQogLy8gIHBMb3c6ICAgICAgIHVwcGVyIGJhbmQgcmFuZ2UKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCB0YXJnZXRGcmVxKXsKK2ludDMyX3QgRXF1YWxpemVyR2V0QmFuZChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCBfX3VudXNlZCwgdWludDMyX3QgdGFyZ2V0RnJlcSl7CiAgICAgaW50IGJhbmQgPSAwOwogCiAgICAgaWYodGFyZ2V0RnJlcSA8IGJhbmRGcmVxUmFuZ2VbMF1bMF0pewpAQCAtMTc1OCw3ICsxOTM0LDcgQEAKIAogaW50IEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAgICAgKnBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgKnBWYWx1ZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFZhbHVlKXsKICAgICBpbnQgc3RhdHVzID0gMDsKICAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07CkBAIC0xODc2LDEyICsyMDUyLDExIEBACiAKIGludCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAgICAgICAgKnBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgKnBWYWx1ZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpwVmFsdWUpewogICAgIGludCBzdGF0dXMgPSAwOwogICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKICAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKLSAgICBpbnQzMl90IHBhcmFtMjsKICAgICBjaGFyICpuYW1lOwogCiAgICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgc3RhcnQiKTsKQEAgLTE5MDEsNyArMjA3NiwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICBicmVhazsKLQorICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVM6CisgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWUgc2l6ZSBjYW4gb25seSBiZSBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byBpbnB1dCB2YWx1ZSwKKyAgICAgICAgICAgIC8vIGRlZmVycmluZyB2YWxpZGl0eSBjaGVjayB0byBiZWxvdworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTElaQVRJT05fTU9ERToKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUgJWQiLCpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTkyMiwxMyArMjEwNywzNiBAQAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVM6IHsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSAqcFBhcmFtVGVtcCsrOworICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KSAqcFBhcmFtVGVtcDsKKyAgICAgICAgICAgIHVpbnQzMl90IG5iQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMyAqIG5iQ2hhbm5lbHMgKiBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZSAlZCIsKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdmVyaWZ5IHRoZSBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZAorICAgICAgICAgICAgc3RhdHVzID0gVmlydHVhbGl6ZXJJc0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY2hhbm5lbE1hc2ssIGRldmljZVR5cGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVMgc3VwcG9ydHMgbWFzaz0weCV4IGRldmljZT0weCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgICAgICAvLyBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZCwgZ2V0IHRoZSBhbmdsZXMKKyAgICAgICAgICAgICAgICBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoY2hhbm5lbE1hc2ssIGRldmljZVR5cGUsIChpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTElaQVRJT05fTU9ERToKKyAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgID0gKHVpbnQzMl90KSBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZShwQ29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX2dldFBhcmFtZXRlciBlbmQiKTsKKyAgICBBTE9HVigiXHRWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgZW5kIHJldHVybmluZyBzdGF0dXM9JWQiLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9IC8qIGVuZCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgKi8KIApAQCAtMTk2Myw2ICsyMTcxLDE1IEBACiAgICAgICAgICAgICBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKHBDb250ZXh0LCAoaW50MzJfdClzdHJlbmd0aCk7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcigpIENhbGxlZCBwVmlydHVhbGl6ZXItPnNldFN0cmVuZ3RoIik7CiAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fRk9SQ0VfVklSVFVBTElaQVRJT05fTU9ERTogeworICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSAqKGF1ZGlvX2RldmljZXNfdCAqKSBwVmFsdWU7CisgICAgICAgICAgICBzdGF0dXMgPSBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKHBDb250ZXh0LCBkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgIC8vQUxPR1YoIlZJUlRVQUxJWkVSX1BBUkFNX0ZPUkNFX1ZJUlRVQUxJWkFUSU9OX01PREUgZGV2aWNlPTB4JXggcmVzdWx0PSVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICBkZXZpY2VUeXBlLCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE5OTQsNyArMjIxMSw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgICAgICpwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSl7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50IGJNdXRlID0gMDsKQEAgLTIyNTIsNyArMjQ2OSw3IEBACiAKIGludCBWb2x1bWVfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgICAgICpwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSl7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50IGJNdXRlID0gMDsKQEAgLTI4MzAsNyArMzA0Nyw3IEBACiAgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7CiAgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6QmFzc0Jvb3N0X2dldFBhcmFtZXRlcihwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKICAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdEJhc3NCb29zdF9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIipwQ21kRGF0YSAlZCwgKnJlcGx5U2l6ZSAlZCwgKnBSZXBseURhdGEgJWQgIiwKQEAgLTI4NDEsOCArMzA1OCw4IEBACiAKICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUil7CiAgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKIAogICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAiCkBAIC0yODcwLDcgKzMwODcsNyBAQAogICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOwogICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlZvbHVtZV9nZXRQYXJhbWV0ZXIocENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKIAogICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgpAQCAtMjkxOCw2ICszMTM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHAtPnBzaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUil7CisgICAgICAgICAgICAgIC8vIFdhcm5pbmcgdGhpcyBsb2cgd2lsbCBmYWlsIHRvIHByb3Blcmx5IHJlYWQgYW4gaW50MzJfdCB2YWx1ZSwgYXNzdW1lcyBpbnQxNl90CiAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQiLAogICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKICAgICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCkBAIC0zMDIzLDYgKzMyNDEsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2UgPSAqKHVpbnQzMl90ICopcENtZERhdGE7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkgZGV2aWNlOwogCiAgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKICAgICAgICAgICAgICAgICBpZigoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgfHwKQEAgLTMwNTgsMzcgKzMyNzcsMzggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7Ci0gICAgICAgICAgICAgICAgaWYoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCl8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpKXsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRldmljZSBpcyBpbnZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKKyAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgY2FzZSB1bmxlc3MgY29uZmlndXJhdGlvbiBpcyBmb3JjZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuZHJvaWQ6OlZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoZGV2aWNlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIGludmFsaWQgZm9yIExWTV9WSVJUVUFMSVpFUiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKIAotICAgICAgICAgICAgICAgICAgICAvL0lmIGEgZGV2aWNlIGRvZXNudCBzdXBwb3J0IHZpcnR1YWxpemVyIHRoZSBlZmZlY3QgbXVzdCBiZSB0ZW1wb3JhcmlseSBkaXNhYmxlZAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWZmZWN0IG11c3Qgc3RpbGwgcmVwb3J0IGl0cyBvcmlnaW5hbCBzdGF0ZSBhcyB0aGlzIGNhbiBvbmx5IGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIEVOQUJMRS9ESVNBQkxFIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgYSBkZXZpY2UgZG9lc250IHN1cHBvcnQgdmlydHVhbGl6ZXIgdGhlIGVmZmVjdCBtdXN0IGJlIHRlbXBvcmFyaWx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZCB0aGUgZWZmZWN0IG11c3Qgc3RpbGwgcmVwb3J0IGl0cyBvcmlnaW5hbCBzdGF0ZSBhcyB0aGlzIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBiZSBjaGFuZ2VkIGJ5IHRoZSBFTkFCTEUvRElTQUJMRSBjb21tYW5kCiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2Rpc2FibGUocENvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIHZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZGV2aWNlIHN1cHBvcnRzIHZpcnR1YWxpemVyIGFuZCB0aGUgZWZmZWN0IGhhcyBiZWVuIHRlbXBvcmFyaWx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZCBwcmV2aW91c2x5IHRoZW4gcmUtZW5hYmxlIGl0CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSByZS1lbmFibGUgTFZNX1ZJUlRVQUxJWkVSICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZW5hYmxlKHBDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fVFJVRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIHZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBkZXZpY2Ugc3VwcG9ydHMgdmlydHVhbGl6ZXIgYW5kIHRoZSBlZmZlY3QgaGFzIGJlZW4gdGVtcG9yYXJpbHkgZGlzYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXNseSB0aGVuIHJlLWVuYWJsZSBpdAotCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHJlLWVuYWJsZSBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2VuYWJsZShwQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIGVsc2UgdmlydHVhbGl6YXRpb24gbW9kZSBpcyBmb3JjZWQgdG8gYSBjZXJ0YWluIGRldmljZSwgbm90aGluZyB0byBkbwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZW5kIik7CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKaW5kZXggMzMwYmIzMi4uNDIwZjk3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKQEAgLTczLDYgKzczLDggQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCYXNzVGVtcERpc2FibGVkOyAgICAgICAgLyogRmxhZyBmb3IgQmFzcyB0byBiZSByZS1lbmFibGVkICovCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlydHVhbGl6ZXJFbmFibGVkOyAgICAgIC8qIEZsYWcgZm9yIFZpcnR1YWxpemVyICovCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQ7IC8qIEZsYWcgZm9yIGVmZmVjdCB0byBiZSByZS1lbmFibGVkICovCisgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgICBuT3V0cHV0RGV2aWNlOyAgICAgICAgICAgIC8qIE91dHB1dCBkZXZpY2UgZm9yIHRoZSBlZmZlY3QgKi8KKyAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICAgICAgICAgIG5WaXJ0dWFsaXplckZvcmNlZERldmljZTsgLyogRm9yY2VkIGRldmljZSB2aXJ0dWFsaXphdGlvbiBtb2RlKi8KICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlckVmZmVjdHNFbmFibGVkOyAgICAgLyogRWZmZWN0cyBpbiB0aGlzIHNlc3Npb24gKi8KICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlckVmZmVjdHNDYWxsZWQ7ICAgICAgLyogRWZmZWN0cyBjYWxsZWQgc28gZmFyICovCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZvbHVtZTsgICAgICAgICAgICAgIC8qIE5vIHNtb290aGluZyBvbiBmaXJzdCBWb2wgY2hhbmdlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCBhNzk2ZDJmLi40ZGM4YjQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTE5LDExICsxOSwxMyBAQAogI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIGFycmF5IC8gc2l6ZW9mIGFycmF5WzBdKQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bmV3PgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG5ldz4KKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlICJFZmZlY3RSZXZlcmIuaCIKIC8vIGZyb20gUmV2ZXJiL2xpYgogI2luY2x1ZGUgIkxWUkVWLmgiCkBAIC0xODEsNyArMTgzLDcgQEAKIGludCAgUmV2ZXJiX3NldFBhcmFtZXRlciAgICAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgUmV2ZXJiX2dldFBhcmFtZXRlciAgICAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKIGludCBSZXZlcmJfTG9hZFByZXNldCAgICAgICAoUmV2ZXJiQ29udGV4dCAgICpwQ29udGV4dCk7CiAKQEAgLTI2OSw3ICsyNzEsNyBAQAogICAgIHBDb250ZXh0LT5JbkZyYW1lczMyICA9IChMVk1fSU5UMzIgKiltYWxsb2MoTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDIpOwogICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MoTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDIpOwogCi0gICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlICVwLCBzaXplICVkIiwgcENvbnRleHQsIHNpemVvZihSZXZlcmJDb250ZXh0KSk7CisgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlICVwLCBzaXplICV6dSIsIHBDb250ZXh0LCBzaXplb2YoUmV2ZXJiQ29udGV4dCkpOwogICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSBlbmRcbiIpOwogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0Q3JlYXRlICovCkBAIC01NzAsMTUgKzU3MiwxNSBAQAogICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CiAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7CiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0ZnJlZSgpIC0gU1RBUlQgZnJlZWluZyAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRmcmVlKCkgLSBTVEFSVCBmcmVlaW5nICUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKIAogICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogCi0gICAgICAgICAgICAgICAgQUxPR1YoIlx0ZnJlZSgpIC0gRU5EICAgZnJlZWluZyAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRmcmVlKCkgLSBFTkQgICBmcmVlaW5nICUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IGZyZWUoKSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICVsZCBieXRlcyAiCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogZnJlZSgpIC0gdHJ5aW5nIHRvIGZyZWUgd2l0aCBOVUxMIHBvaW50ZXIgJSIgUFJJdTMyICIgYnl0ZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgYXQgJXAgRVJST1JcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH0KQEAgLTc3MSwxMSArNzczLDEyIEBACiAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9IG1hbGxvYyhNZW1UYWIuUmVnaW9uW2ldLlNpemUpOwogCiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWUkVWX0VSUk9SIDpSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJWxkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyBmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKICAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOwogICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGUgJWxkIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGUgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzg3LDExICs3OTAsMTEgQEAKICAgICBpZihiTWFsbG9jRmFpbHVyZSA9PSBMVk1fVFJVRSl7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICVsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSAtIE5vdCBmcmVlaW5nXG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSAtIE5vdCBmcmVlaW5nXG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICVsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZDogYnV0IGFsbG9jYXRlZCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfQpAQCAtMTUzNCw3ICsxNTM3LDcgQEAKIAogaW50IFJldmVyYl9nZXRQYXJhbWV0ZXIoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSl7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOwpAQCAtMTk3NCw3ICsxOTc3LDcgQEAKIAogICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6UmV2ZXJiX2dldFBhcmFtZXRlcihwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QgICopJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CiAKICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5tawppbmRleCA5ZThjYjgzLi5lYTNjNTlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5tawpAQCAtMjQsMTIgKzI0LDcgQEAKICAgICBsaWJ1dGlscyBcCiAgICAgbGlibG9nCiAKLWlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLUxPQ0FMX0xETElCUyArPSAtbGRsCi1lbHNlCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi1lbmRpZgotCiBMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKaW5kZXggYmU0ZmE3ZS4uNmRkNDQzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcApAQCAtNzcsNyArNzcsNyBAQAogICAgIHZvaWQgKCogZW5hYmxlKShwcmVwcm9jX2VmZmVjdF90ICpmeCk7CiAgICAgdm9pZCAoKiBkaXNhYmxlKShwcmVwcm9jX2VmZmVjdF90ICpmeCk7CiAgICAgaW50ICgqIHNldF9wYXJhbWV0ZXIpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB2b2lkICpwYXJhbSwgdm9pZCAqdmFsdWUpOwotICAgIGludCAoKiBnZXRfcGFyYW1ldGVyKShwcmVwcm9jX2VmZmVjdF90ICpmeCwgdm9pZCAqcGFyYW0sIHNpemVfdCAqc2l6ZSwgdm9pZCAqdmFsdWUpOworICAgIGludCAoKiBnZXRfcGFyYW1ldGVyKShwcmVwcm9jX2VmZmVjdF90ICpmeCwgdm9pZCAqcGFyYW0sIHVpbnQzMl90ICpzaXplLCB2b2lkICp2YWx1ZSk7CiAgICAgaW50ICgqIHNldF9kZXZpY2UpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB1aW50MzJfdCBkZXZpY2UpOwogfTsKIApAQCAtMjkxLDcgKzI5MSw3IEBACiAKIGludCBBZ2NHZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LAogICAgICAgICAgICAgICAgICAgICB2b2lkICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBWYWx1ZVNpemUsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBWYWx1ZSkKIHsKICAgICBpbnQgc3RhdHVzID0gMDsKQEAgLTQ1Miw5ICs0NTIsOSBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgQWVjR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QgICAgICplZmZlY3QsCitpbnQgQWVjR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QgICplZmZlY3QsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSkKIHsKICAgICBpbnQgc3RhdHVzID0gMDsKQEAgLTg4MSw4ICs4ODEsOCBAQAogaW50IFNlc3Npb25fU2V0Q29uZmlnKHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uLCBlZmZlY3RfY29uZmlnX3QgKmNvbmZpZykKIHsKICAgICB1aW50MzJfdCBzcjsKLSAgICB1aW50MzJfdCBpbkNubCA9IHBvcGNvdW50KGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwotICAgIHVpbnQzMl90IG91dENubCA9IHBvcGNvdW50KGNvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBpbkNubCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBvdXRDbmwgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOwogCiAgICAgaWYgKGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IGNvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSB8fAogICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBjb25maWctPm91dHB1dENmZy5mb3JtYXQgfHwKQEAgLTEwMzcsNyArMTAzNyw3IEBACiAgICAgICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0gICAgdWludDMyX3QgaW5DbmwgPSBwb3Bjb3VudChjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBpbkNubCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICBpbnQgc3RhdHVzID0gc2Vzc2lvbi0+YXBtLT5zZXRfbnVtX3JldmVyc2VfY2hhbm5lbHMoaW5DbmwpOwogICAgIGlmIChzdGF0dXMgPCAwKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTIzNSw4ICsxMjM1LDggQEAKICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5mcmFtZXNJbiA8IHNlc3Npb24tPmZyYW1lQ291bnQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemVfdCBmckluID0gc2Vzc2lvbi0+ZnJhbWVzSW47Ci0gICAgICAgICAgICBzaXplX3QgZnJPdXQgPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OworICAgICAgICAgICAgc3B4X3VpbnQzMl90IGZySW4gPSBzZXNzaW9uLT5mcmFtZXNJbjsKKyAgICAgICAgICAgIHNweF91aW50MzJfdCBmck91dCA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgewogICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludChzZXNzaW9uLT5pblJlc2FtcGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKQEAgLTEyOTIsOCArMTI5Miw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNpemVfdCBmckluID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgIHNpemVfdCBmck91dCA9IHNlc3Npb24tPmZyYW1lQ291bnQ7CisgICAgICAgICAgICBzcHhfdWludDMyX3QgZnJJbiA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CisgICAgICAgICAgICBzcHhfdWludDMyX3QgZnJPdXQgPSBzZXNzaW9uLT5mcmFtZUNvdW50OwogICAgICAgICAgICAgaWYgKHNlc3Npb24tPmluQ2hhbm5lbENvdW50ID09IDEpIHsKICAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnQoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKQEAgLTE0NTYsNyArMTQ1Niw3IEBACiAKICAgICAgICAgICAgIGlmIChlZmZlY3QtPm9wcy0+Z2V0X3BhcmFtZXRlcikgewogICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGVmZmVjdC0+b3BzLT5nZXRfcGFyYW1ldGVyKGVmZmVjdCwgcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOwogICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOwogICAgICAgICAgICAgfQpAQCAtMTc1Nyw4ICsxNzU3LDggQEAKICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5mcmFtZXNSZXYgPCBzZXNzaW9uLT5mcmFtZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaXplX3QgZnJJbiA9IHNlc3Npb24tPmZyYW1lc1JldjsKLSAgICAgICAgICAgIHNpemVfdCBmck91dCA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CisgICAgICAgICAgICBzcHhfdWludDMyX3QgZnJJbiA9IHNlc3Npb24tPmZyYW1lc1JldjsKKyAgICAgICAgICAgIHNweF91aW50MzJfdCBmck91dCA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgewogICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludChzZXNzaW9uLT5yZXZSZXNhbXBsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAKaW5kZXggOGQwMDIwNi4uM2NiMTNmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcApAQCAtMTE1LDcgKzExNSw3IEBACiAKIGludCBFcXVhbGl6ZXJfaW5pdChFcXVhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCk7CiBpbnQgRXF1YWxpemVyX3NldENvbmZpZyhFcXVhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKTsKLWludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEF1ZGlvRXF1YWxpemVyICogcEVxdWFsaXplciwgaW50MzJfdCAqcFBhcmFtLCBzaXplX3QgKnBWYWx1ZVNpemUsIHZvaWQgKnBWYWx1ZSk7CitpbnQgRXF1YWxpemVyX2dldFBhcmFtZXRlcihBdWRpb0VxdWFsaXplciAqIHBFcXVhbGl6ZXIsIGludDMyX3QgKnBQYXJhbSwgdWludDMyX3QgKnBWYWx1ZVNpemUsIHZvaWQgKnBWYWx1ZSk7CiBpbnQgRXF1YWxpemVyX3NldFBhcmFtZXRlcihBdWRpb0VxdWFsaXplciAqIHBFcXVhbGl6ZXIsIGludDMyX3QgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIAogCkBAIC0zNjAsNyArMzYwLDcgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoQXVkaW9FcXVhbGl6ZXIgKiBwRXF1YWxpemVyLCBpbnQzMl90ICpwUGFyYW0sIHNpemVfdCAqcFZhbHVlU2l6ZSwgdm9pZCAqcFZhbHVlKQoraW50IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoQXVkaW9FcXVhbGl6ZXIgKiBwRXF1YWxpemVyLCBpbnQzMl90ICpwUGFyYW0sIHVpbnQzMl90ICpwVmFsdWVTaXplLCB2b2lkICpwVmFsdWUpCiB7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW0rKzsKQEAgLTY2Miw4ICs2NjIsOCBAQAogICAgICAgICBFcXVhbGl6ZXJfc2V0Q29uZmlnKHBDb250ZXh0LCAmcENvbnRleHQtPmNvbmZpZyk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06IHsKLSAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8Ci0gICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8IChpbnQpIChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSkgeworICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKQEAgLTY4Miw3ICs2ODIsNyBAQAogICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06IHsKICAgICAgICAgQUxPR1YoIkVxdWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIGNtZFNpemUgJWQgcENtZERhdGEgJXAsICpyZXBseVNpemUgJWQsIHBSZXBseURhdGEgJXAiLAogICAgICAgICAgICAgIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5jCmluZGV4IGMzN2YzOTIuLmYwNTZkMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYwpAQCAtNzUwLDcgKzc1MCw3IEBACiAgKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLWludCBSZXZlcmJfZ2V0UGFyYW1ldGVyKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgc2l6ZV90ICpwU2l6ZSwKK2ludCBSZXZlcmJfZ2V0UGFyYW1ldGVyKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgdWludDMyX3QgKnBTaXplLAogICAgICAgICB2b2lkICpwVmFsdWUpIHsKICAgICBpbnQzMl90ICpwVmFsdWUzMjsKICAgICBpbnQxNl90ICpwVmFsdWUxNjsKQEAgLTc1OCw3ICs3NTgsNyBAQAogICAgIGludDMyX3QgaTsKICAgICBpbnQzMl90IHRlbXA7CiAgICAgaW50MzJfdCB0ZW1wMjsKLSAgICBzaXplX3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBzaXplOwogCiAgICAgaWYgKHBSZXZlcmItPm1fUHJlc2V0KSB7CiAgICAgICAgIGlmIChwYXJhbSAhPSBSRVZFUkJfUEFSQU1fUFJFU0VUIHx8ICpwU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgewpAQCAtMTAzMyw3ICsxMDMzLDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotaW50IFJldmVyYl9zZXRQYXJhbWV0ZXIocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCBzaXplX3Qgc2l6ZSwKK2ludCBSZXZlcmJfc2V0UGFyYW1ldGVyKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgdWludDMyX3Qgc2l6ZSwKICAgICAgICAgdm9pZCAqcFZhbHVlKSB7CiAgICAgaW50MzJfdCB2YWx1ZTMyOwogICAgIGludDE2X3QgdmFsdWUxNjsKQEAgLTEwNDQsNyArMTA0NCw3IEBACiAgICAgcmV2ZXJiX3ByZXNldF90ICpwUHJlc2V0OwogICAgIGludCBtYXhTYW1wbGVzOwogICAgIGludDMyX3QgYXZlcmFnZURlbGF5OwotICAgIHNpemVfdCBwYXJhbVNpemU7CisgICAgdWludDMyX3QgcGFyYW1TaXplOwogCiAgICAgQUxPR1YoIlJldmVyYl9zZXRQYXJhbWV0ZXIsIGNvbnRleHQgJXAsIHBhcmFtICVkLCB2YWx1ZTE2ICVkLCB2YWx1ZTMyICVkIiwKICAgICAgICAgICAgIHBSZXZlcmIsIHBhcmFtLCAqKGludDE2X3QgKilwVmFsdWUsICooaW50MzJfdCAqKXBWYWx1ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaAppbmRleCBlNTI0OGZlLi43NTZjNWVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmgKQEAgLTMzMCw4ICszMzAsOCBAQAogdm9pZCBSZXZlcmJfZ2V0Q29uZmlnKHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKTsKIHZvaWQgUmV2ZXJiX1Jlc2V0KHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgYm9vbCBpbml0KTsKIAotaW50IFJldmVyYl9zZXRQYXJhbWV0ZXIgKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgc2l6ZV90IHNpemUsIHZvaWQgKnBWYWx1ZSk7Ci1pbnQgUmV2ZXJiX2dldFBhcmFtZXRlcihyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGludDMyX3QgcGFyYW0sIHNpemVfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSk7CitpbnQgUmV2ZXJiX3NldFBhcmFtZXRlciAocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLCB2b2lkICpwVmFsdWUpOworaW50IFJldmVyYl9nZXRQYXJhbWV0ZXIocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogUmV2ZXJiVXBkYXRlWGZhZGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKaW5kZXggZGQyZDMwNi4uYzkyYzU0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKQEAgLTE3LDcgKzE3LDYgQEAKIExPQ0FMX01PRFVMRTo9IGxpYnZpc3VhbGl6ZXIKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKQogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAppbmRleCA0YjMxOGMwLi4wYzMxMGM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCkBAIC0xNiw4ICsxNiw5IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0VmlzdWFsaXplciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8bmV3PgpAQCAtMjA2LDcgKzIwNyw4IEBACiAgICAgcENvbnRleHQtPm1TY2FsaW5nTW9kZSA9IFZJU1VBTElaRVJfU0NBTElOR19NT0RFX05PUk1BTElaRUQ7CiAKICAgICAvLyBtZWFzdXJlbWVudCBpbml0aWFsaXphdGlvbgotICAgIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50ID0gcG9wY291bnQocENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOworICAgIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50ID0KKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CiAgICAgcENvbnRleHQtPm1NZWFzdXJlbWVudE1vZGUgPSBNRUFTVVJFTUVOVF9NT0RFX05PTkU7CiAgICAgcENvbnRleHQtPm1NZWFzdXJlbWVudFdpbmRvd1NpemVJbkJ1ZmZlcnMgPSBNRUFTVVJFTUVOVF9XSU5ET1dfTUFYX1NJWkVfSU5fQlVGRkVSUzsKICAgICBwQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4ID0gMDsKQEAgLTIyNiw4ICsyMjgsOCBAQAogLy8KIAogaW50IFZpc3VhbGl6ZXJMaWJfQ3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgLypzZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qaW9JZCovLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSkgewogICAgIGludCByZXQ7CiAgICAgaW50IGk7CkBAIC00MTgsNyArNDIwLDcgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0vLyAgICBBTE9HVigiVmlzdWFsaXplcl9jb21tYW5kIGNvbW1hbmQgJWQgY21kU2l6ZSAlZCIsY21kQ29kZSwgY21kU2l6ZSk7CisvLyAgICBBTE9HVigiVmlzdWFsaXplcl9jb21tYW5kIGNvbW1hbmQgJSIgUFJJdTMyICIgY21kU2l6ZSAlIiBQUkl1MzIsIGNtZENvZGUsIGNtZFNpemUpOwogCiAgICAgc3dpdGNoIChjbWRDb2RlKSB7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CkBAIC00ODQsMTkgKzQ4NiwxOSBAQAogICAgICAgICB9CiAgICAgICAgIHN3aXRjaCAoKih1aW50MzJfdCAqKXAtPmRhdGEpIHsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX0NBUFRVUkVfU0laRToKLSAgICAgICAgICAgIEFMT0dWKCJnZXQgbUNhcHR1cmVTaXplID0gJWQiLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXQgbUNhcHR1cmVTaXplID0gJSIgUFJJdTMyLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKICAgICAgICAgICAgICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpID0gcENvbnRleHQtPm1DYXB0dXJlU2l6ZTsKICAgICAgICAgICAgIHAtPnZzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgICpyZXBseVNpemUgKz0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFZJU1VBTElaRVJfUEFSQU1fU0NBTElOR19NT0RFOgotICAgICAgICAgICAgQUxPR1YoImdldCBtU2NhbGluZ01vZGUgPSAlZCIsIHBDb250ZXh0LT5tU2NhbGluZ01vZGUpOworICAgICAgICAgICAgQUxPR1YoImdldCBtU2NhbGluZ01vZGUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tU2NhbGluZ01vZGUpOwogICAgICAgICAgICAgKigodWludDMyX3QgKilwLT5kYXRhICsgMSkgPSBwQ29udGV4dC0+bVNjYWxpbmdNb2RlOwogICAgICAgICAgICAgcC0+dnNpemUgPSBzaXplb2YodWludDMyX3QpOwogICAgICAgICAgICAgKnJlcGx5U2l6ZSArPSBzaXplb2YodWludDMyX3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVklTVUFMSVpFUl9QQVJBTV9NRUFTVVJFTUVOVF9NT0RFOgotICAgICAgICAgICAgQUxPR1YoImdldCBtTWVhc3VyZW1lbnRNb2RlID0gJWQiLCBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSk7CisgICAgICAgICAgICBBTE9HVigiZ2V0IG1NZWFzdXJlbWVudE1vZGUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlKTsKICAgICAgICAgICAgICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpID0gcENvbnRleHQtPm1NZWFzdXJlbWVudE1vZGU7CiAgICAgICAgICAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICAqcmVwbHlTaXplICs9IHNpemVvZih1aW50MzJfdCk7CkBAIC01MjAsMTkgKzUyMiwxOSBAQAogICAgICAgICBzd2l0Y2ggKCoodWludDMyX3QgKilwLT5kYXRhKSB7CiAgICAgICAgIGNhc2UgVklTVUFMSVpFUl9QQVJBTV9DQVBUVVJFX1NJWkU6CiAgICAgICAgICAgICBwQ29udGV4dC0+bUNhcHR1cmVTaXplID0gKigodWludDMyX3QgKilwLT5kYXRhICsgMSk7Ci0gICAgICAgICAgICBBTE9HVigic2V0IG1DYXB0dXJlU2l6ZSA9ICVkIiwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSk7CisgICAgICAgICAgICBBTE9HVigic2V0IG1DYXB0dXJlU2l6ZSA9ICUiIFBSSXUzMiwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX1NDQUxJTkdfTU9ERToKICAgICAgICAgICAgIHBDb250ZXh0LT5tU2NhbGluZ01vZGUgPSAqKCh1aW50MzJfdCAqKXAtPmRhdGEgKyAxKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXQgbVNjYWxpbmdNb2RlID0gJWQiLCBwQ29udGV4dC0+bVNjYWxpbmdNb2RlKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXQgbVNjYWxpbmdNb2RlID0gJSIgUFJJdTMyLCBwQ29udGV4dC0+bVNjYWxpbmdNb2RlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFZJU1VBTElaRVJfUEFSQU1fTEFURU5DWToKICAgICAgICAgICAgIHBDb250ZXh0LT5tTGF0ZW5jeSA9ICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpOwotICAgICAgICAgICAgQUxPR1YoInNldCBtTGF0ZW5jeSA9ICVkIiwgcENvbnRleHQtPm1MYXRlbmN5KTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXQgbUxhdGVuY3kgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tTGF0ZW5jeSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX01FQVNVUkVNRU5UX01PREU6CiAgICAgICAgICAgICBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSA9ICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpOwotICAgICAgICAgICAgQUxPR1YoInNldCBtTWVhc3VyZW1lbnRNb2RlID0gJWQiLCBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSk7CisgICAgICAgICAgICBBTE9HVigic2V0IG1NZWFzdXJlbWVudE1vZGUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgKihpbnQzMl90ICopcFJlcGx5RGF0YSA9IC1FSU5WQUw7CkBAIC01NTIsNDkgKzU1NCw0OSBAQAogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgPT0gVklTVUFMSVpFUl9TVEFURV9BQ1RJVkUpIHsKLSAgICAgICAgICAgIGludDMyX3QgbGF0ZW5jeU1zID0gcENvbnRleHQtPm1MYXRlbmN5OwogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZGVsdGFNcyA9IFZpc3VhbGl6ZXJfZ2V0RGVsdGFUaW1lTXNGcm9tVXBkYXRlZFRpbWUocENvbnRleHQpOwotICAgICAgICAgICAgbGF0ZW5jeU1zIC09IGRlbHRhTXM7Ci0gICAgICAgICAgICBpZiAobGF0ZW5jeU1zIDwgMCkgewotICAgICAgICAgICAgICAgIGxhdGVuY3lNcyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkZWx0YVNtcGwgPSBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgKiBsYXRlbmN5TXMgLyAxMDAwOwotCi0gICAgICAgICAgICBpbnQzMl90IGNhcHR1cmVQb2ludCA9IHBDb250ZXh0LT5tQ2FwdHVyZUlkeCAtIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUgLSBkZWx0YVNtcGw7Ci0gICAgICAgICAgICBpbnQzMl90IGNhcHR1cmVTaXplID0gcENvbnRleHQtPm1DYXB0dXJlU2l6ZTsKLSAgICAgICAgICAgIGlmIChjYXB0dXJlUG9pbnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBzaXplID0gLWNhcHR1cmVQb2ludDsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IGNhcHR1cmVTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgPSBjYXB0dXJlU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZiArIENBUFRVUkVfQlVGX1NJWkUgKyBjYXB0dXJlUG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPSAoY2hhciAqKXBSZXBseURhdGEgKyBzaXplOwotICAgICAgICAgICAgICAgIGNhcHR1cmVTaXplIC09IHNpemU7Ci0gICAgICAgICAgICAgICAgY2FwdHVyZVBvaW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLAotICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZiArIGNhcHR1cmVQb2ludCwKLSAgICAgICAgICAgICAgICAgICBjYXB0dXJlU2l6ZSk7Ci0KIAogICAgICAgICAgICAgLy8gaWYgYXVkaW8gZnJhbWV3b3JrIGhhcyBzdG9wcGVkIHBsYXlpbmcgYXVkaW8gYWx0aG91Z2ggdGhlIGVmZmVjdCBpcyBzdGlsbAogICAgICAgICAgICAgLy8gYWN0aXZlIHdlIG11c3QgY2xlYXIgdGhlIGNhcHR1cmUgYnVmZmVyIHRvIHJldHVybiBzaWxlbmNlCiAgICAgICAgICAgICBpZiAoKHBDb250ZXh0LT5tTGFzdENhcHR1cmVJZHggPT0gcENvbnRleHQtPm1DYXB0dXJlSWR4KSAmJgotICAgICAgICAgICAgICAgICAgICAocENvbnRleHQtPm1CdWZmZXJVcGRhdGVUaW1lLnR2X3NlYyAhPSAwKSkgewotICAgICAgICAgICAgICAgIGlmIChkZWx0YU1zID4gTUFYX1NUQUxMX1RJTUVfTVMpIHsKKyAgICAgICAgICAgICAgICAgICAgKHBDb250ZXh0LT5tQnVmZmVyVXBkYXRlVGltZS50dl9zZWMgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGRlbHRhTXMgPiBNQVhfU1RBTExfVElNRV9NUykpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNhcHR1cmUgZ29pbmcgdG8gaWRsZSIpOwogICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bUJ1ZmZlclVwZGF0ZVRpbWUudHZfc2VjID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBSZXBseURhdGEsIDB4ODAsIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQocFJlcGx5RGF0YSwgMHg4MCwgY2FwdHVyZVNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGxhdGVuY3lNcyA9IHBDb250ZXh0LT5tTGF0ZW5jeTsKKyAgICAgICAgICAgICAgICBsYXRlbmN5TXMgLT0gZGVsdGFNczsKKyAgICAgICAgICAgICAgICBpZiAobGF0ZW5jeU1zIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBsYXRlbmN5TXMgPSAwOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkZWx0YVNtcGwgPQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgKiBsYXRlbmN5TXMgLyAxMDAwOworICAgICAgICAgICAgICAgIGludDMyX3QgY2FwdHVyZVBvaW50ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4IC0gY2FwdHVyZVNpemUgLSBkZWx0YVNtcGw7CisKKyAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZVBvaW50IDwgMCkgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplID0gLWNhcHR1cmVQb2ludDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBjYXB0dXJlU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGNhcHR1cmVTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1DYXB0dXJlQnVmICsgQ0FQVFVSRV9CVUZfU0laRSArIGNhcHR1cmVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID0gKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVNpemUgLT0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVBvaW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZiArIGNhcHR1cmVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVNpemUpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBwQ29udGV4dC0+bUxhc3RDYXB0dXJlSWR4ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVtc2V0KHBSZXBseURhdGEsIDB4ODAsIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOworICAgICAgICAgICAgbWVtc2V0KHBSZXBseURhdGEsIDB4ODAsIGNhcHR1cmVTaXplKTsKICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworCisgICAgICAgIH0gYnJlYWs7CiAKICAgICBjYXNlIFZJU1VBTElaRVJfQ01EX01FQVNVUkU6IHsKICAgICAgICAgdWludDE2X3QgcGVha1UxNiA9IDA7CkBAIC02MDQsNyArNjA2LDcgQEAKICAgICAgICAgLy8gbWVhc3VyZW1lbnRzIGFyZW4ndCByZWxldmFudCBhbnltb3JlIGFuZCBzaG91bGRuJ3QgYmlhcyB0aGUgbmV3IG9uZSkKICAgICAgICAgY29uc3QgaW50MzJfdCBkZWxheU1zID0gVmlzdWFsaXplcl9nZXREZWx0YVRpbWVNc0Zyb21VcGRhdGVkVGltZShwQ29udGV4dCk7CiAgICAgICAgIGlmIChkZWxheU1zID4gRElTQ0FSRF9NRUFTVVJFTUVOVFNfVElNRV9NUykgewotICAgICAgICAgICAgQUxPR1YoIkRpc2NhcmRpbmcgbWVhc3VyZW1lbnRzLCBsYXN0IG1lYXN1cmVtZW50IGlzICVkbXMgb2xkIiwgZGVsYXlNcyk7CisgICAgICAgICAgICBBTE9HVigiRGlzY2FyZGluZyBtZWFzdXJlbWVudHMsIGxhc3QgbWVhc3VyZW1lbnQgaXMgJSIgUFJJZDMyICJtcyBvbGQiLCBkZWxheU1zKTsKICAgICAgICAgICAgIGZvciAodWludDMyX3QgaT0wIDsgaTxwQ29udGV4dC0+bU1lYXN1cmVtZW50V2luZG93U2l6ZUluQnVmZmVycyA7IGkrKykgewogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1tpXS5tSXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1tpXS5tUGVha1UxNiA9IDA7CkBAIC02MzgsMTQgKzY0MCwxNCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcEludFJlcGx5RGF0YVtNRUFTVVJFTUVOVF9JRFhfUEVBS10gPSAoaW50MzJfdCkgKDIwMDAgKiBsb2cxMChwZWFrVTE2IC8gMzI3NjcuMGYpKTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiVklTVUFMSVpFUl9DTURfTUVBU1VSRSBwZWFrPSVkICglZG1CKSwgcm1zPSUuMWYgKCVkbUIpIiwKKyAgICAgICAgQUxPR1YoIlZJU1VBTElaRVJfQ01EX01FQVNVUkUgcGVhaz0lIiBQUkl1MTYgIiAoJSIgUFJJZDMyICJtQiksIHJtcz0lLjFmICglIiBQUklkMzIgIm1CKSIsCiAgICAgICAgICAgICAgICAgcGVha1UxNiwgcEludFJlcGx5RGF0YVtNRUFTVVJFTUVOVF9JRFhfUEVBS10sCiAgICAgICAgICAgICAgICAgcm1zLCBwSW50UmVwbHlEYXRhW01FQVNVUkVNRU5UX0lEWF9STVNdKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJWaXN1YWxpemVyX2NvbW1hbmQgaW52YWxpZCBjb21tYW5kICVkIixjbWRDb2RlKTsKKyAgICAgICAgQUxPR1coIlZpc3VhbGl6ZXJfY29tbWFuZCBpbnZhbGlkIGNvbW1hbmQgJSIgUFJJdTMyLCBjbWRDb2RlKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tawppbmRleCA1NmU3Nzg3Li5lMDEyMTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKQEAgLTI1LDYgKzI1LDkgQEAKICAgICBBdWRpb1JlY29yZC5jcHAgXAogICAgIEF1ZGlvU3lzdGVtLmNwcCBcCiAgICAgbWVkaWFwbGF5ZXIuY3BwIFwKKyAgICBJTWVkaWFDb2RlY0xpc3QuY3BwIFwKKyAgICBJTWVkaWFIVFRQQ29ubmVjdGlvbi5jcHAgXAorICAgIElNZWRpYUhUVFBTZXJ2aWNlLmNwcCBcCiAgICAgSU1lZGlhTG9nU2VydmljZS5jcHAgXAogICAgIElNZWRpYVBsYXllclNlcnZpY2UuY3BwIFwKICAgICBJTWVkaWFQbGF5ZXJDbGllbnQuY3BwIFwKQEAgLTM0LDYgKzM3LDcgQEAKICAgICBJUmVtb3RlRGlzcGxheS5jcHAgXAogICAgIElSZW1vdGVEaXNwbGF5Q2xpZW50LmNwcCBcCiAgICAgSVN0cmVhbVNvdXJjZS5jcHAgXAorICAgIE1lZGlhQ29kZWNJbmZvLmNwcCBcCiAgICAgTWV0YWRhdGEuY3BwIFwKICAgICBtZWRpYXJlY29yZGVyLmNwcCBcCiAgICAgSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIFwKQEAgLTQyLDkgKzQ2LDEwIEBACiAgICAgSmV0UGxheWVyLmNwcCBcCiAgICAgSU9NWC5jcHAgXAogICAgIElBdWRpb1BvbGljeVNlcnZpY2UuY3BwIFwKKyAgICBJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCBcCiAgICAgTWVkaWFTY2FubmVyLmNwcCBcCiAgICAgTWVkaWFTY2FubmVyQ2xpZW50LmNwcCBcCi0gICAgYXV0b2RldGVjdC5jcHAgXAorICAgIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwIFwKICAgICBJTWVkaWFEZWF0aE5vdGlmaWVyLmNwcCBcCiAgICAgTWVkaWFQcm9maWxlcy5jcHAgXAogICAgIElFZmZlY3QuY3BwIFwKQEAgLTU4LDI2ICs2MywzNiBAQAogCiBMT0NBTF9TUkNfRklMRVMgKz0gLi4vbGlibmJhaW8vcm91bmR1cC5jCiAKLSMgZm9yIDxjdXRpbHMvYXRvbWljLWlubGluZS5oPgotTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9TTVA9JChpZiAkKGZpbmRzdHJpbmcgdHJ1ZSwkKFRBUkdFVF9DUFVfU01QKSksMSwwKQotTE9DQUxfU1JDX0ZJTEVTICs9IFNpbmdsZVN0YXRlUXVldWUuY3BwCi1MT0NBTF9DRkxBR1MgKz0gLURTSU5HTEVfU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKLSMgQ29uc2lkZXIgYSBzZXBhcmF0ZSBhIGxpYnJhcnkgZm9yIFNpbmdsZVN0YXRlUXVldWVJbnN0YW50aWF0aW9ucy4KLQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlidWkgbGlibG9nIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic29uaXZveCBsaWJpY3V1YyBsaWJleHBhdCBcCisJbGlidWkgbGlibG9nIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic29uaXZveCBsaWJpY3V1YyBsaWJpY3VpMThuIGxpYmV4cGF0IFwKICAgICAgICAgbGliY2FtZXJhX2NsaWVudCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGliZ3VpIGxpYmRsIGxpYmF1ZGlvdXRpbHMKKyAgICAgICAgbGliZ3VpIGxpYmRsIGxpYmF1ZGlvdXRpbHMgbGlibmJhaW8KIAotTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUlkgOj0gbGlibWVkaWFfaGVscGVyCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmluc3RhbnRzc3EKKworTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtZWRpYV9oZWxwZXIKIAogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWEKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgIGV4dGVybmFsL2ljdTRjL2NvbW1vbiBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYS8gXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKyAgICAkKFRPUCkvZXh0ZXJuYWwvaWN1L2ljdTRjL3NvdXJjZS9jb21tb24gXAorICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2kxOG4gXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIGZvciA8Y3V0aWxzL2F0b21pYy1pbmxpbmUuaD4KK0xPQ0FMX0NGTEFHUyArPSAtREFORFJPSURfU01QPSQoaWYgJChmaW5kc3RyaW5nIHRydWUsJChUQVJHRVRfQ1BVX1NNUCkpLDEsMCkKK0xPQ0FMX1NSQ19GSUxFUyArPSBTaW5nbGVTdGF0ZVF1ZXVlLmNwcAorTE9DQUxfQ0ZMQUdTICs9IC1EU0lOR0xFX1NUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TPSciU2luZ2xlU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcCInCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJpbnN0YW50c3NxCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKaW5kZXggOGRmZmZiMy4uMGQ1ZDdlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcApAQCAtMTQ1LDE1ICsxNDUsMTkgQEAKICAgICAgICAgcmV0dXJuIG1TdGF0dXM7CiAgICAgfQogCi0gICAgbUlFZmZlY3QgPSBpRWZmZWN0OwogICAgIG1DYmxrTWVtb3J5ID0gY2JsazsKICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGVmZmVjdF9wYXJhbV9jYmxrX3QqPihjYmxrLT5wb2ludGVyKCkpOwogICAgIGludCBidWZPZmZzZXQgPSAoKHNpemVvZihlZmZlY3RfcGFyYW1fY2Jsa190KSAtIDEpIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOwogICAgIG1DYmxrLT5idWZmZXIgPSAodWludDhfdCAqKW1DYmxrICsgYnVmT2Zmc2V0OwogCiAgICAgaUVmZmVjdC0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobUlFZmZlY3RDbGllbnQpOwotICAgIEFMT0dWKCJzZXQoKSAlcCBPSyBlZmZlY3Q6ICVzIGlkOiAlZCBzdGF0dXMgJWQgZW5hYmxlZCAlZCIsIHRoaXMsIG1EZXNjcmlwdG9yLm5hbWUsIG1JZCwKLSAgICAgICAgICAgIG1TdGF0dXMsIG1FbmFibGVkKTsKKyAgICBtQ2xpZW50UGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIEFMT0dWKCJzZXQoKSAlcCBPSyBlZmZlY3Q6ICVzIGlkOiAlZCBzdGF0dXMgJWQgZW5hYmxlZCAlZCBwaWQgJWQiLCB0aGlzLCBtRGVzY3JpcHRvci5uYW1lLCBtSWQsCisgICAgICAgICAgICBtU3RhdHVzLCBtRW5hYmxlZCwgbUNsaWVudFBpZCk7CisKKyAgICBpZiAobVNlc3Npb25JZCA+IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQpOworICAgIH0KIAogICAgIHJldHVybiBtU3RhdHVzOwogfQpAQCAtMTY0LDYgKzE2OCw5IEBACiAgICAgQUxPR1YoIkRlc3RydWN0b3IgJXAiLCB0aGlzKTsKIAogICAgIGlmIChtU3RhdHVzID09IE5PX0VSUk9SIHx8IG1TdGF0dXMgPT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgaWYgKG1TZXNzaW9uSWQgPiBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1JRWZmZWN0ICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1JRWZmZWN0LT5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICBtSUVmZmVjdC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtSUVmZmVjdENsaWVudCk7CkBAIC0zODAsOSArMzg3LDkgQEAKIH0KIAogdm9pZCBBdWRpb0VmZmVjdDo6Y29tbWFuZEV4ZWN1dGVkKHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZXBseURhdGEpCiB7CiAgICAgaWYgKGNtZERhdGEgPT0gTlVMTCB8fCByZXBseURhdGEgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCmluZGV4IGNjYmM1YTMuLjllN2JhODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKQEAgLTE4LDcgKzE4LDkgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9SZWNvcmQiCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTQxLDM3ICs0MywzMCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIC8vIGRlZmF1bHQgdG8gMCBpbiBjYXNlIG9mIGVycm9yCi0gICAgKmZyYW1lQ291bnQgPSAwOwotCi0gICAgc2l6ZV90IHNpemUgPSAwOworICAgIHNpemVfdCBzaXplOwogICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgJnNpemUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemU7IHN0YXR1cyAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW0gY291bGQgbm90IHF1ZXJ5IHRoZSBpbnB1dCBidWZmZXIgc2l6ZSBmb3Igc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgICAiY2hhbm5lbE1hc2sgJSN4OyBzdGF0dXMgJWQiLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJSN4IiwKKyAgICAvLyBXZSBkb3VibGUgdGhlIHNpemUgb2YgaW5wdXQgYnVmZmVyIGZvciBwaW5nIHBvbmcgdXNlIG9mIHJlY29yZCBidWZmZXIuCisgICAgLy8gQXNzdW1lcyBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKKyAgICBpZiAoKCpmcmFtZUNvdW50ID0gKHNpemUgKiAyKSAvIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzaykgKgorICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpKSkgPT0gMCkgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbjogc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4IiwKICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIC8vIFdlIGRvdWJsZSB0aGUgc2l6ZSBvZiBpbnB1dCBidWZmZXIgZm9yIHBpbmcgcG9uZyB1c2Ugb2YgcmVjb3JkIGJ1ZmZlci4KLSAgICBzaXplIDw8PSAxOwotCi0gICAgLy8gQXNzdW1lcyBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChjaGFubmVsTWFzayk7Ci0gICAgc2l6ZSAvPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7Ci0KLSAgICAqZnJhbWVDb3VudCA9IHNpemU7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkKCkKLSAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1TZXNzaW9uSWQoMCksCisgICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtU2Vzc2lvbklkKEFVRElPX1NFU1NJT05fQUxMT0NBVEUpLAogICAgICAgbVByZXZpb3VzUHJpb3JpdHkoQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpLCBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCkKIHsKIH0KQEAgLTgxLDIwICs3NiwyMCBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBpbnQgZnJhbWVDb3VudCwKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQotICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZCgwKSwKKyAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCiAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCiAgICAgICBtUHJveHkoTlVMTCkKIHsKICAgICBtU3RhdHVzID0gc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBjYmYsIHVzZXIsCi0gICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUpOworICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncyk7CiB9CiAKIEF1ZGlvUmVjb3JkOjp+QXVkaW9SZWNvcmQoKQpAQCAtMTEwLDEyICsxMDUsMTIgQEAKICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQuY2xlYXIoKTsKICAgICAgICAgfQotICAgICAgICBpZiAobUF1ZGlvUmVjb3JkICE9IDApIHsKLSAgICAgICAgICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7Ci0gICAgICAgICAgICBtQXVkaW9SZWNvcmQuY2xlYXIoKTsKLSAgICAgICAgfQorICAgICAgICBtQXVkaW9SZWNvcmQtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOworICAgICAgICBtQXVkaW9SZWNvcmQuY2xlYXIoKTsKKyAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgbUJ1ZmZlck1lbW9yeS5jbGVhcigpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgLTEpOwogICAgIH0KIH0KIApAQCAtMTI0LDE1ICsxMTksMjAgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgaW50IGZyYW1lQ291bnRJbnQsCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICBjYWxsYmFja190IGNiZiwKICAgICAgICAgdm9pZCogdXNlciwKLSAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhLAogICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKIHsKKyAgICBBTE9HVigic2V0KCk6IGlucHV0U291cmNlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCisgICAgICAgICAgIm5vdGlmaWNhdGlvbkZyYW1lcyAldSwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQsIGZsYWdzICUjeCIsCisgICAgICAgICAgaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgZmxhZ3MpOworCiAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKICAgICBjYXNlIFRSQU5TRkVSX0RFRkFVTFQ6CiAgICAgICAgIGlmIChjYmYgPT0gTlVMTCB8fCB0aHJlYWRDYW5DYWxsSmF2YSkgewpAQCAtMTU2LDIzICsxNTYsMTUgQEAKICAgICB9CiAgICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwogCi0gICAgLy8gRklYTUUgImludCIgaGVyZSBpcyBsZWdhY3kgYW5kIHdpbGwgYmUgcmVwbGFjZWQgYnkgc2l6ZV90IGxhdGVyCi0gICAgaWYgKGZyYW1lQ291bnRJbnQgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZyYW1lIGNvdW50ICVkIiwgZnJhbWVDb3VudEludCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZnJhbWVDb3VudEludDsKLQotICAgIEFMT0dWKCJzZXQoKTogc2FtcGxlUmF0ZSAldSwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV1Iiwgc2FtcGxlUmF0ZSwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBmcmFtZUNvdW50KTsKLQogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKIAorICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1JlY29yZCAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewogICAgICAgICBBTE9HRSgiVHJhY2sgYWxyZWFkeSBpbiB1c2UiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlcyBmaXJzdC4KICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKICAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwogICAgIH0KQEAgLTE5MSwxMiArMTgzLDEyIEBACiAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBmb3JtYXQgJWQiLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiSW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gVGVtcG9yYXJ5IHJlc3RyaWN0aW9uOiBBdWRpb0ZsaW5nZXIgY3VycmVudGx5IHN1cHBvcnRzIDE2LWJpdCBQQ00gb25seQogICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgQUxPR0UoIkZvcm1hdCAlZCBpcyBub3Qgc3VwcG9ydGVkIiwgZm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIkZvcm1hdCAlI3ggaXMgbm90IHN1cHBvcnRlZCIsIGZvcm1hdCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CkBAIC0yMDYsNjEgKzE5OCw1MCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChjaGFubmVsTWFzayk7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spOwogICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CiAKLSAgICAvLyBBc3N1bWVzIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSwgZWxzZSBzaXplb2YodWludDhfdCkKLSAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwotCi0gICAgLy8gdmFsaWRhdGUgZnJhbWVjb3VudAotICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gMDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1JlY29yZDo6Z2V0TWluRnJhbWVDb3VudCgmbWluRnJhbWVDb3VudCwKLSAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImdldE1pbkZyYW1lQ291bnQoKSBmYWlsZWQ7IHN0YXR1cyAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1GcmFtZVNpemUgPSBzaXplb2YodWludDhfdCk7CiAgICAgfQotICAgIEFMT0dWKCJBdWRpb1JlY29yZDo6c2V0KCkgbWluRnJhbWVDb3VudCA9ICVkIiwgbWluRnJhbWVDb3VudCk7CiAKLSAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OwotICAgIH0gZWxzZSBpZiAoZnJhbWVDb3VudCA8IG1pbkZyYW1lQ291bnQpIHsKLSAgICAgICAgQUxPR0UoImZyYW1lQ291bnQgJXUgPCBtaW5GcmFtZUNvdW50ICV1IiwgZnJhbWVDb3VudCwgbWluRnJhbWVDb3VudCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIG1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAvLyBtRnJhbWVDb3VudCBpcyBpbml0aWFsaXplZCBpbiBvcGVuUmVjb3JkX2wKKyAgICBtUmVxRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxID0gbm90aWZpY2F0aW9uRnJhbWVzOwotICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAwOworICAgIC8vIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgaXMgaW5pdGlhbGl6ZWQgaW4gb3BlblJlY29yZF9sCiAKLSAgICBpZiAoc2Vzc2lvbklkID09IDAgKSB7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9TZXNzaW9uSWQoKTsKKyAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fQUxMT0NBVEUpIHsKKyAgICAgICAgbVNlc3Npb25JZCA9IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKICAgICB9CiAgICAgQUxPR1YoInNldCgpOiBtU2Vzc2lvbklkICVkIiwgbVNlc3Npb25JZCk7CiAKICAgICBtRmxhZ3MgPSBmbGFnczsKLQotICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCi0gICAgc3RhdHVzID0gb3BlblJlY29yZF9sKDAgLyplcG9jaCovKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQorICAgIG1DYmYgPSBjYmY7CiAKICAgICBpZiAoY2JmICE9IE5VTEwpIHsKICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkID0gbmV3IEF1ZGlvUmVjb3JkVGhyZWFkKCp0aGlzLCB0aHJlYWRDYW5DYWxsSmF2YSk7CiAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cnVuKCJBdWRpb1JlY29yZCIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgIH0KIAorICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3BlblJlY29yZF9sKDAgLyplcG9jaCovKTsKKworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKG1BdWRpb1JlY29yZFRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0KCk7ICAgLy8gc2VlIGNvbW1lbnQgaW4gQXVkaW9SZWNvcmQuaAorICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKKyAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgLy8gVXBkYXRlIGJ1ZmZlciBzaXplIGluIGNhc2UgaXQgaGFzIGJlZW4gbGltaXRlZCBieSBBdWRpb0ZsaW5nZXIgZHVyaW5nIHRyYWNrIGNyZWF0aW9uCi0gICAgbUZyYW1lQ291bnQgPSBtQ2Jsay0+ZnJhbWVDb3VudF87Ci0KICAgICBtQWN0aXZlID0gZmFsc2U7Ci0gICAgbUNiZiA9IGNiZjsKLSAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CiAgICAgbVVzZXJEYXRhID0gdXNlcjsKICAgICAvLyBUT0RPOiBhZGQgYXVkaW8gaGFyZHdhcmUgaW5wdXQgbGF0ZW5jeSBoZXJlCiAgICAgbUxhdGVuY3kgPSAoMTAwMCptRnJhbWVDb3VudCkgLyBzYW1wbGVSYXRlOwpAQCAtMjY4LDcgKzI0OSw3IEBACiAgICAgbU1hcmtlclJlYWNoZWQgPSBmYWxzZTsKICAgICBtTmV3UG9zaXRpb24gPSAwOwogICAgIG1VcGRhdGVQZXJpb2QgPSAwOwotICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCk7CisgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCAtMSk7CiAgICAgbVNlcXVlbmNlID0gMTsKICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKICAgICBtSW5PdmVycnVuID0gZmFsc2U7CkBAIC0yODksNiArMjcwLDkgQEAKIAogICAgIC8vIHJlc2V0IGN1cnJlbnQgcG9zaXRpb24gYXMgc2VlbiBieSBjbGllbnQgdG8gMAogICAgIG1Qcm94eS0+c2V0RXBvY2gobVByb3h5LT5nZXRFcG9jaCgpIC0gbVByb3h5LT5nZXRQb3NpdGlvbigpKTsKKyAgICAvLyBmb3JjZSByZWZyZXNoIG9mIHJlbWFpbmluZyBmcmFtZXMgYnkgcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgYXMgbGFzdAorICAgIC8vIHJlYWQgYmVmb3JlIHN0b3AgY291bGQgYmUgcGFydGlhbC4KKyAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CiAKICAgICBtTmV3UG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyBtVXBkYXRlUGVyaW9kOwogICAgIGludDMyX3QgZmxhZ3MgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1DYmxrLT5tRmxhZ3MpOwpAQCAtMzUyLDYgKzMzNiw3IEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRNYXJrZXJQb3NpdGlvbih1aW50MzJfdCBtYXJrZXIpCiB7CisgICAgLy8gVGhlIG9ubHkgcHVycG9zZSBvZiBzZXR0aW5nIG1hcmtlciBwb3NpdGlvbiBpcyB0byBnZXQgYSBjYWxsYmFjawogICAgIGlmIChtQ2JmID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTM3Nyw2ICszNjIsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0UG9zaXRpb25VcGRhdGVQZXJpb2QodWludDMyX3QgdXBkYXRlUGVyaW9kKQogeworICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBwb3NpdGlvbiB1cGRhdGUgcGVyaW9kIGlzIHRvIGdldCBhIGNhbGxiYWNrCiAgICAgaWYgKG1DYmYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtNDEyLDcgKzM5OCw3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi11bnNpZ25lZCBpbnQgQXVkaW9SZWNvcmQ6OmdldElucHV0RnJhbWVzTG9zdCgpIGNvbnN0Cit1aW50MzJfdCBBdWRpb1JlY29yZDo6Z2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3QKIHsKICAgICAvLyBubyBuZWVkIHRvIGNoZWNrIG1BY3RpdmUsIGJlY2F1c2UgaWYgaW5hY3RpdmUgdGhpcyB3aWxsIHJldHVybiAwLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldElucHV0RnJhbWVzTG9zdChnZXRJbnB1dCgpKTsKQEAgLTQzMCw1NiArNDE2LDc5IEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAotICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgdHJhY2tGbGFncyA9IElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RFRkFVTFQ7Ci0gICAgcGlkX3QgdGlkID0gLTE7CisgICAgLy8gRmFzdCB0cmFja3MgbXVzdCBiZSBhdCB0aGUgcHJpbWFyeSBfb3V0cHV0XyBbc2ljXSBzYW1wbGluZyByYXRlLAorICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgY3VycmVudGx5IG5vIGNvbmNlcHQgb2YgYSBwcmltYXJ5IGlucHV0IHNhbXBsaW5nIHJhdGUKKyAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGUgPSBBdWRpb1N5c3RlbTo6Z2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSgpOworICAgIGlmIChhZlNhbXBsZVJhdGUgPT0gMCkgeworICAgICAgICBBTE9HVygiZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSBmYWlsZWQiKTsKKyAgICB9CiAKICAgICAvLyBDbGllbnQgY2FuIG9ubHkgZXhwcmVzcyBhIHByZWZlcmVuY2UgZm9yIEZBU1QuICBTZXJ2ZXIgd2lsbCBwZXJmb3JtIGFkZGl0aW9uYWwgdGVzdHMuCi0gICAgLy8gVGhlIG9ubHkgc3VwcG9ydGVkIHVzZSBjYXNlIGZvciBGQVNUIGlzIGNhbGxiYWNrIHRyYW5zZmVyIG1vZGUuCisgICAgaWYgKChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpICYmICEoCisgICAgICAgICAgICAvLyB1c2UgY2FzZTogY2FsbGJhY2sgdHJhbnNmZXIgbW9kZQorICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSykgJiYKKyAgICAgICAgICAgIC8vIG1hdGNoaW5nIHNhbXBsZSByYXRlCisgICAgICAgICAgICAobVNhbXBsZVJhdGUgPT0gYWZTYW1wbGVSYXRlKSkpIHsKKyAgICAgICAgQUxPR1coIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50Iik7CisgICAgICAgIC8vIG9uY2UgZGVuaWVkLCBkbyBub3QgcmVxdWVzdCBhZ2FpbiBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZAorICAgICAgICBtRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpOworICAgIH0KKworICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgdHJhY2tGbGFncyA9IElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RFRkFVTFQ7CisKKyAgICBwaWRfdCB0aWQgPSAtMTsKICAgICBpZiAobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSB7Ci0gICAgICAgIGlmICgobVRyYW5zZmVyICE9IFRSQU5TRkVSX0NBTExCQUNLKSB8fCAobUF1ZGlvUmVjb3JkVGhyZWFkID09IDApKSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQiKTsKLSAgICAgICAgICAgIC8vIG9uY2UgZGVuaWVkLCBkbyBub3QgcmVxdWVzdCBhZ2FpbiBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZAotICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fSU5QVVRfRkxBR19GQVNUKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyYWNrRmxhZ3MgfD0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVDsKKyAgICAgICAgdHJhY2tGbGFncyB8PSBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOworICAgICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIHRpZCA9IG1BdWRpb1JlY29yZFRocmVhZC0+Z2V0VGlkKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsKLQotICAgIGlmICghKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkpIHsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYXBwbGljYXRpb24gaXMgbm90aWZpZWQgd2l0aCBzdWZmaWNpZW50IG1hcmdpbiBiZWZvcmUgb3ZlcnJ1bgotICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9PSAwIHx8IG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPiBtRnJhbWVDb3VudC8yKSB7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbUZyYW1lQ291bnQvMjsKLSAgICAgICAgfQotICAgIH0KLQogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQXVkaW9TeXN0ZW06OmdldElucHV0KG1JbnB1dFNvdXJjZSwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsCi0gICAgICAgICAgICBtQ2hhbm5lbE1hc2ssIG1TZXNzaW9uSWQpOwotICAgIGlmIChpbnB1dCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvIGlucHV0IGZvciByZWNvcmQgc291cmNlICVkIiwgbUlucHV0U291cmNlKTsKKyAgICAgICAgICAgIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwgbUZsYWdzKTsKKyAgICBpZiAoaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gaW5wdXQgZm9yIHJlY29yZCBzb3VyY2UgJWQsIHNhbXBsZSByYXRlICV1LCBmb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAgICJjaGFubmVsIG1hc2sgJSN4LCBzZXNzaW9uICVkLCBmbGFncyAlI3giLAorICAgICAgICAgICAgICBtSW5wdXRTb3VyY2UsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1TZXNzaW9uSWQsIG1GbGFncyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIHsKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRvIGFuIEkvTyBoYW5kbGUgYW5kIGhhdmUgbm90IHlldCBoYW5kZWQgaXQgb2ZmIHRvIEF1ZGlvRmxpbmdlciwKKyAgICAvLyB3ZSBtdXN0IHJlbGVhc2UgaXQgb3Vyc2VsdmVzIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuCiAKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IG1SZXFGcmFtZUNvdW50OworICAgIHNpemVfdCB0ZW1wID0gZnJhbWVDb3VudDsgICAvLyB0ZW1wIG1heSBiZSByZXBsYWNlZCBieSBhIHJldmlzZWQgdmFsdWUgb2YgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIHdpbGwgc3RpbGwgbmVlZCB0aGUgb3JpZ2luYWwgdmFsdWUgYWxzbwogICAgIGludCBvcmlnaW5hbFNlc3Npb25JZCA9IG1TZXNzaW9uSWQ7CisKKyAgICAvLyBUaGUgbm90aWZpY2F0aW9uIGZyYW1lIGNvdW50IGlzIHRoZSBwZXJpb2QgYmV0d2VlbiBjYWxsYmFja3MsIGFzIHN1Z2dlc3RlZCBieSB0aGUgc2VydmVyLgorICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZXMgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOworCisgICAgc3A8SU1lbW9yeT4gaU1lbTsgICAgICAgICAgIC8vIGZvciBjYmxrCisgICAgc3A8SU1lbW9yeT4gYnVmZmVyTWVtOwogICAgIHNwPElBdWRpb1JlY29yZD4gcmVjb3JkID0gYXVkaW9GbGluZ2VyLT5vcGVuUmVjb3JkKGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKLSAgICBBTE9HRV9JRihvcmlnaW5hbFNlc3Npb25JZCAhPSAwICYmIG1TZXNzaW9uSWQgIT0gb3JpZ2luYWxTZXNzaW9uSWQsCisgICAgQUxPR0VfSUYob3JpZ2luYWxTZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSAmJiBtU2Vzc2lvbklkICE9IG9yaWdpbmFsU2Vzc2lvbklkLAogICAgICAgICAgICAgInNlc3Npb24gSUQgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwgb3JpZ2luYWxTZXNzaW9uSWQsIG1TZXNzaW9uSWQpOwogCi0gICAgaWYgKHJlY29yZCA9PSAwIHx8IHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIkF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHJlY29yZCB0cmFjaywgc3RhdHVzOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoaW5wdXQpOwotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQotICAgIHNwPElNZW1vcnk+IGlNZW0gPSByZWNvcmQtPmdldENibGsoKTsKKyAgICBBTE9HX0FTU0VSVChyZWNvcmQgIT0gMCk7CisKKyAgICAvLyBBdWRpb0ZsaW5nZXIgbm93IG93bnMgdGhlIHJlZmVyZW5jZSB0byB0aGUgSS9PIGhhbmRsZSwKKyAgICAvLyBzbyB3ZSBhcmUgbm8gbG9uZ2VyIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgaXQuCisKICAgICBpZiAoaU1lbSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC00ODksMzcgKzQ5OCw2NyBAQAogICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGlNZW1Qb2ludGVyKTsKKworICAgIC8vIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgYnVmZmVycyBpbiBzaGFyZWQgbWVtb3J5LgorICAgIC8vIFRoZSBidWZmZXJzIGFyZSBlaXRoZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvbnRyb2wgYmxvY2ssCisgICAgLy8gb3IgaW4gYSBzZXBhcmF0ZSBhcmVhIGF0IGRpc2NyZXRpb24gb2Ygc2VydmVyLgorICAgIHZvaWQgKmJ1ZmZlcnM7CisgICAgaWYgKGJ1ZmZlck1lbSA9PSAwKSB7CisgICAgICAgIGJ1ZmZlcnMgPSBjYmxrICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICBidWZmZXJzID0gYnVmZmVyTWVtLT5wb2ludGVyKCk7CisgICAgICAgIGlmIChidWZmZXJzID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1JlY29yZCAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewogICAgICAgICBtQXVkaW9SZWNvcmQtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogICAgICAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOwogICAgIH0KLSAgICBtSW5wdXQgPSBpbnB1dDsKICAgICBtQXVkaW9SZWNvcmQgPSByZWNvcmQ7CiAgICAgbUNibGtNZW1vcnkgPSBpTWVtOwotICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGlNZW1Qb2ludGVyKTsKKyAgICBtQnVmZmVyTWVtb3J5ID0gYnVmZmVyTWVtOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKwogICAgIG1DYmxrID0gY2JsazsKLSAgICAvLyBGSVhNRSBtaXNzaW5nIGZhc3QgdHJhY2sgZnJhbWVDb3VudCBsb2dpYworICAgIC8vIG5vdGUgdGhhdCB0ZW1wIGlzIHRoZSAocG9zc2libHkgcmV2aXNlZCkgdmFsdWUgb2YgZnJhbWVDb3VudAorICAgIGlmICh0ZW1wIDwgZnJhbWVDb3VudCB8fCAoZnJhbWVDb3VudCA9PSAwICYmIHRlbXAgPT0gMCkpIHsKKyAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBmcmFtZUNvdW50ICV6dSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAlenUiLCBmcmFtZUNvdW50LCB0ZW1wKTsKKyAgICB9CisgICAgZnJhbWVDb3VudCA9IHRlbXA7CisKICAgICBtQXdhaXRCb29zdCA9IGZhbHNlOwogICAgIGlmIChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgaWYgKHRyYWNrRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7Ci0gICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXUiLCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7Ci0gICAgICAgICAgICAvLyBkb3VibGUtYnVmZmVyaW5nIGlzIG5vdCByZXF1aXJlZCBmb3IgZmFzdCB0cmFja3MsIGR1ZSB0byB0aWdodGVyIHNjaGVkdWxpbmcKLSAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID09IDAgfHwgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA+IG1GcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IG1GcmFtZUNvdW50OwotICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV1IiwgbUZyYW1lQ291bnQpOworICAgICAgICAgICAgQUxPR1YoIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQpOwogICAgICAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkCiAgICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpOwotICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gbUZyYW1lQ291bnQvMikgewotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtRnJhbWVDb3VudC8yOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gc3RhcnRpbmcgYWRkcmVzcyBvZiBidWZmZXJzIGluIHNoYXJlZCBtZW1vcnkKLSAgICB2b2lkICpidWZmZXJzID0gKGNoYXIqKWNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCBhcHBsaWNhdGlvbiBpcyBub3RpZmllZCB3aXRoIHN1ZmZpY2llbnQgbWFyZ2luIGJlZm9yZSBvdmVycnVuCisgICAgaWYgKG5vdGlmaWNhdGlvbkZyYW1lcyA9PSAwIHx8IG5vdGlmaWNhdGlvbkZyYW1lcyA+IGZyYW1lQ291bnQpIHsKKyAgICAgICAgQUxPR1coIlJlY2VpdmVkIG5vdGlmaWNhdGlvbkZyYW1lcyAlenUgZm9yIGZyYW1lQ291bnQgJXp1Iiwgbm90aWZpY2F0aW9uRnJhbWVzLCBmcmFtZUNvdW50KTsKKyAgICB9CisgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IG5vdGlmaWNhdGlvbkZyYW1lczsKKworICAgIC8vIFdlIHJldGFpbiBhIGNvcHkgb2YgdGhlIEkvTyBoYW5kbGUsIGJ1dCBkb24ndCBvd24gdGhlIHJlZmVyZW5jZQorICAgIG1JbnB1dCA9IGlucHV0OworICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKKworICAgIG1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAvLyBJZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZCwgZG9uJ3QgbGV0IHRoZSByZXF1ZXN0ZWQgZnJhbWVDb3VudAorICAgIC8vIGRlY3JlYXNlLiAgVGhpcyBjYW4gY29uZnVzZSBjbGllbnRzIHRoYXQgY2FjaGUgZnJhbWVDb3VudCgpLgorICAgIGlmIChmcmFtZUNvdW50ID4gbVJlcUZyYW1lQ291bnQpIHsKKyAgICAgICAgbVJlcUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIH0KIAogICAgIC8vIHVwZGF0ZSBwcm94eQogICAgIG1Qcm94eSA9IG5ldyBBdWRpb1JlY29yZENsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIG1GcmFtZUNvdW50LCBtRnJhbWVTaXplKTsKQEAgLTUzMCw2ICs1NjksMTQgQEAKICAgICBtQXVkaW9SZWNvcmQtPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKK3JlbGVhc2U6CisgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChpbnB1dCwgKGF1ZGlvX3Nlc3Npb25fdCltU2Vzc2lvbklkKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlciwgaW50MzJfdCB3YWl0Q291bnQpCkBAIC01ODAsNiArNjI3LDcgQEAKICAgICAgICAgLy8ga2VlcCB0aGVtIGZyb20gZ29pbmcgYXdheSBpZiBhbm90aGVyIHRocmVhZCByZS1jcmVhdGVzIHRoZSB0cmFjayBkdXJpbmcgb2J0YWluQnVmZmVyKCkKICAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnRQcm94eT4gcHJveHk7CiAgICAgICAgIHNwPElNZW1vcnk+IGlNZW07CisgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlck1lbTsKICAgICAgICAgewogICAgICAgICAgICAgLy8gc3RhcnQgb2YgbG9jayBzY29wZQogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpAQCAtNTkxLDYgKzYzOSw5IEBACiAgICAgICAgICAgICAgICAgaWYgKG5ld1NlcXVlbmNlID09IG9sZFNlcXVlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlc3RvcmVSZWNvcmRfbCgib2J0YWluQnVmZmVyIik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tRnJhbWVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubVJhdyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubU5vbkNvbnRpZyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTYwMCw2ICs2NTEsNyBAQAogICAgICAgICAgICAgLy8gS2VlcCB0aGUgZXh0cmEgcmVmZXJlbmNlcwogICAgICAgICAgICAgcHJveHkgPSBtUHJveHk7CiAgICAgICAgICAgICBpTWVtID0gbUNibGtNZW1vcnk7CisgICAgICAgICAgICBidWZmZXJNZW0gPSBtQnVmZmVyTWVtb3J5OwogCiAgICAgICAgICAgICAvLyBOb24tYmxvY2tpbmcgaWYgdHJhY2sgaXMgc3RvcHBlZAogICAgICAgICAgICAgaWYgKCFtQWN0aXZlKSB7CkBAIC02NjAsNyArNzEyLDcgQEAKICAgICBpZiAoc3NpemVfdCh1c2VyU2l6ZSkgPCAwIHx8IChidWZmZXIgPT0gTlVMTCAmJiB1c2VyU2l6ZSAhPSAwKSkgewogICAgICAgICAvLyBzYW5pdHktY2hlY2suIHVzZXIgaXMgbW9zdC1saWtlbHkgcGFzc2luZyBhbiBlcnJvciBjb2RlLCBhbmQgaXQgd291bGQKICAgICAgICAgLy8gbWFrZSB0aGUgcmV0dXJuIHZhbHVlIGFtYmlndW91cyAoYWN0dWFsU2l6ZSB2cyBlcnJvcikuCi0gICAgICAgIEFMT0dFKCJBdWRpb1JlY29yZDo6cmVhZChidWZmZXI9JXAsIHNpemU9JXUgKCVkKSIsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKKyAgICAgICAgQUxPR0UoIkF1ZGlvUmVjb3JkOjpyZWFkKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6dSkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC02OTIsNyArNzQ0LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1uc2Vjc190IEF1ZGlvUmVjb3JkOjpwcm9jZXNzQXVkaW9CdWZmZXIoY29uc3Qgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+JiB0aHJlYWQpCituc2Vjc190IEF1ZGlvUmVjb3JkOjpwcm9jZXNzQXVkaW9CdWZmZXIoKQogewogICAgIG1Mb2NrLmxvY2soKTsKICAgICBpZiAobUF3YWl0Qm9vc3QpIHsKQEAgLTc2MCwxNyArODEyLDE3IEBACiAgICAgfQogCiAgICAgLy8gQ2FjaGUgb3RoZXIgZmllbGRzIHRoYXQgd2lsbCBiZSBuZWVkZWQgc29vbgotICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZXMgPSBtTm90aWZpY2F0aW9uRnJhbWVzQWN0OworICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7CiAgICAgaWYgKG1SZWZyZXNoUmVtYWluaW5nKSB7CiAgICAgICAgIG1SZWZyZXNoUmVtYWluaW5nID0gZmFsc2U7CiAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMgPSBub3RpZmljYXRpb25GcmFtZXM7CiAgICAgICAgIG1SZXRyeU9uUGFydGlhbEJ1ZmZlciA9IGZhbHNlOwogICAgIH0KICAgICBzaXplX3QgbWlzYWxpZ25tZW50ID0gbVByb3h5LT5nZXRNaXNhbGlnbm1lbnQoKTsKLSAgICBpbnQzMl90IHNlcXVlbmNlID0gbVNlcXVlbmNlOworICAgIHVpbnQzMl90IHNlcXVlbmNlID0gbVNlcXVlbmNlOwogCiAgICAgLy8gVGhlc2UgZmllbGRzIGRvbid0IG5lZWQgdG8gYmUgY2FjaGVkLCBiZWNhdXNlIHRoZXkgYXJlIGFzc2lnbmVkIG9ubHkgYnkgc2V0KCk6Ci0gICAgLy8gICAgICBtVHJhbnNmZXIsIG1DYmYsIG1Vc2VyRGF0YSwgbVNhbXBsZVJhdGUKKyAgICAvLyAgICAgIG1UcmFuc2ZlciwgbUNiZiwgbVVzZXJEYXRhLCBtU2FtcGxlUmF0ZSwgbUZyYW1lU2l6ZQogCiAgICAgbUxvY2sudW5sb2NrKCk7CiAKQEAgLTg0MSwxMSArODkzLDExIEBACiAgICAgICAgIHNpemVfdCBub25Db250aWc7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCwgJm5vbkNvbnRpZyk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGVyciAhPSBOT19FUlJPUikgIT0gKGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPT0gMCksCi0gICAgICAgICAgICAgICAgIm9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV1IiwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXp1IiwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gJkNsaWVudFByb3h5OjprTm9uQmxvY2tpbmc7CiAgICAgICAgIHNpemVfdCBhdmFpbCA9IGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgKyBub25Db250aWc7Ci0gICAgICAgIEFMT0dWKCJvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV1ID0gJXUgKyAldSIsCi0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZyk7CisgICAgICAgIEFMT0dWKCJvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAorICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUIHx8IGVyciA9PSBXT1VMRF9CTE9DSyB8fCBlcnIgPT0gLUVJTlRSKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC04NzIsOCArOTI0LDggQEAKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdChyZWFkU2l6ZSkgPCAwIHx8IHJlYWRTaXplID4gcmVxU2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoIkVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICVkIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxU2l6ZSwgKGludCkgcmVhZFNpemUpOworICAgICAgICAgICAgQUxPR0UoIkVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICByZXFTaXplLCBzc2l6ZV90KHJlYWRTaXplKSk7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtOTMyLDcgKzk4NCw3IEBACiAgICAgc3RhdHVzX3QgcmVzdWx0OwogCiAgICAgLy8gaWYgdGhlIG5ldyBJQXVkaW9SZWNvcmQgaXMgY3JlYXRlZCwgb3BlblJlY29yZF9sKCkgd2lsbCBtb2RpZnkgdGhlCi0gICAgLy8gZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXM6IG1BdWRpb1JlY29yZCwgbUNibGtNZW1vcnkgYW5kIG1DYmxrLgorICAgIC8vIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzOiBtQXVkaW9SZWNvcmQsIG1DYmxrTWVtb3J5LCBtQ2JsaywgbUJ1ZmZlck1lbW9yeS4KICAgICAvLyBJdCB3aWxsIGFsc28gZGVsZXRlIHRoZSBzdHJvbmcgcmVmZXJlbmNlcyBvbiBwcmV2aW91cyBJQXVkaW9SZWNvcmQgYW5kIElNZW1vcnkKICAgICBzaXplX3QgcG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCk7CiAgICAgbU5ld1Bvc2l0aW9uID0gcG9zaXRpb24gKyBtVXBkYXRlUGVyaW9kOwpAQCAtOTU0LDcgKzEwMDYsNyBAQAogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLXZvaWQgQXVkaW9SZWNvcmQ6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykKK3ZvaWQgQXVkaW9SZWNvcmQ6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKIHsKICAgICBzcDxBdWRpb1JlY29yZD4gYXVkaW9SZWNvcmQgPSBtQXVkaW9SZWNvcmQucHJvbW90ZSgpOwogICAgIGlmIChhdWRpb1JlY29yZCAhPSAwKSB7CkBAIC05NjYsNyArMTAxOCw4IEBACiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIEF1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZFRocmVhZDo6QXVkaW9SZWNvcmRUaHJlYWQoQXVkaW9SZWNvcmQmIHJlY2VpdmVyLCBib29sIGJDYW5DYWxsSmF2YSkKLSAgICA6IFRocmVhZChiQ2FuQ2FsbEphdmEpLCBtUmVjZWl2ZXIocmVjZWl2ZXIpLCBtUGF1c2VkKHRydWUpLCBtUGF1c2VkSW50KGZhbHNlKSwgbVBhdXNlZE5zKDBMTCkKKyAgICA6IFRocmVhZChiQ2FuQ2FsbEphdmEpLCBtUmVjZWl2ZXIocmVjZWl2ZXIpLCBtUGF1c2VkKHRydWUpLCBtUGF1c2VkSW50KGZhbHNlKSwgbVBhdXNlZE5zKDBMTCksCisgICAgICBtSWdub3JlTmV4dFBhdXNlZEludChmYWxzZSkKIHsKIH0KIApAQCAtOTgzLDYgKzEwMzYsMTAgQEAKICAgICAgICAgICAgIC8vIGNhbGxlciB3aWxsIGNoZWNrIGZvciBleGl0UGVuZGluZygpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICBpZiAobUlnbm9yZU5leHRQYXVzZWRJbnQpIHsKKyAgICAgICAgICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50ID0gZmFsc2U7CisgICAgICAgICAgICBtUGF1c2VkSW50ID0gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1QYXVzZWRJbnQpIHsKICAgICAgICAgICAgIGlmIChtUGF1c2VkTnMgPiAwKSB7CiAgICAgICAgICAgICAgICAgKHZvaWQpIG1NeUNvbmQud2FpdFJlbGF0aXZlKG1NeUxvY2ssIG1QYXVzZWROcyk7CkBAIC05OTMsNyArMTA1MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICBuc2Vjc190IG5zID0gIG1SZWNlaXZlci5wcm9jZXNzQXVkaW9CdWZmZXIodGhpcyk7CisgICAgbnNlY3NfdCBucyA9ICBtUmVjZWl2ZXIucHJvY2Vzc0F1ZGlvQnVmZmVyKCk7CiAgICAgc3dpdGNoIChucykgewogICAgIGNhc2UgMDoKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xMDA3LDcgKzEwNjQsNyBAQAogICAgICAgICBucyA9IDEwMDAwMDAwMDBMTDsKICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlbGxkIiwgbnMpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICUiIFBSSWQ2NCwgbnMpOwogICAgICAgICBwYXVzZUludGVybmFsKG5zKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMTAxNywxMiArMTA3NCw3IEBACiB7CiAgICAgLy8gbXVzdCBiZSBpbiB0aGlzIG9yZGVyIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24KICAgICBUaHJlYWQ6OnJlcXVlc3RFeGl0KCk7Ci0gICAgQXV0b011dGV4IF9sKG1NeUxvY2spOwotICAgIGlmIChtUGF1c2VkIHx8IG1QYXVzZWRJbnQpIHsKLSAgICAgICAgbVBhdXNlZCA9IGZhbHNlOwotICAgICAgICBtUGF1c2VkSW50ID0gZmFsc2U7Ci0gICAgICAgIG1NeUNvbmQuc2lnbmFsKCk7Ci0gICAgfQorICAgIHJlc3VtZSgpOwogfQogCiB2b2lkIEF1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZFRocmVhZDo6cGF1c2UoKQpAQCAtMTAzNCw2ICsxMDg2LDcgQEAKIHZvaWQgQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkVGhyZWFkOjpyZXN1bWUoKQogewogICAgIEF1dG9NdXRleCBfbChtTXlMb2NrKTsKKyAgICBtSWdub3JlTmV4dFBhdXNlZEludCA9IHRydWU7CiAgICAgaWYgKG1QYXVzZWQgfHwgbVBhdXNlZEludCkgewogICAgICAgICBtUGF1c2VkID0gZmFsc2U7CiAgICAgICAgIG1QYXVzZWRJbnQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAppbmRleCA4MDMzYzJjLi5kZGEzNjU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCkBAIC0zNSwxNiArMzUsMTcgQEAKIHNwPElBdWRpb0ZsaW5nZXI+IEF1ZGlvU3lzdGVtOjpnQXVkaW9GbGluZ2VyOwogc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudD4gQXVkaW9TeXN0ZW06OmdBdWRpb0ZsaW5nZXJDbGllbnQ7CiBhdWRpb19lcnJvcl9jYWxsYmFjayBBdWRpb1N5c3RlbTo6Z0F1ZGlvRXJyb3JDYWxsYmFjayA9IE5VTEw7Ci0vLyBDYWNoZWQgdmFsdWVzCiAKLURlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgKj4gQXVkaW9TeXN0ZW06OmdPdXRwdXRzKDApOworLy8gQ2FjaGVkIHZhbHVlcyBmb3Igb3V0cHV0IGhhbmRsZXMKK0RlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgKj4gQXVkaW9TeXN0ZW06OmdPdXRwdXRzKE5VTEwpOwogCiAvLyBDYWNoZWQgdmFsdWVzIGZvciByZWNvcmRpbmcgcXVlcmllcywgYWxsIHByb3RlY3RlZCBieSBnTG9jawotdWludDMyX3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5TYW1wbGluZ1JhdGUgPSAxNjAwMDsKLWF1ZGlvX2Zvcm1hdF90IEF1ZGlvU3lzdGVtOjpnUHJldkluRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci1hdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJbkNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9NT05POwotc2l6ZV90IEF1ZGlvU3lzdGVtOjpnSW5CdWZmU2l6ZSA9IDA7Cit1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJblNhbXBsaW5nUmF0ZTsKK2F1ZGlvX2Zvcm1hdF90IEF1ZGlvU3lzdGVtOjpnUHJldkluRm9ybWF0OworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5DaGFubmVsTWFzazsKK3NpemVfdCBBdWRpb1N5c3RlbTo6Z0luQnVmZlNpemUgPSAwOyAgICAvLyB6ZXJvIGluZGljYXRlcyBjYWNoZSBpcyBpbnZhbGlkCiAKK3NwPEF1ZGlvU3lzdGVtOjpBdWRpb1BvcnRDYWxsYmFjaz4gQXVkaW9TeXN0ZW06OmdBdWRpb1BvcnRDYWxsYmFjazsKIAogLy8gZXN0YWJsaXNoIGJpbmRlciBpbnRlcmZhY2UgdG8gQXVkaW9GbGluZ2VyIHNlcnZpY2UKIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKQpAQCAtODQsMTMgKzg1LDE1IEBACiAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6bXV0ZU1pY3JvcGhvbmUoYm9vbCBzdGF0ZSkgeworc3RhdHVzX3QgQXVkaW9TeXN0ZW06Om11dGVNaWNyb3Bob25lKGJvb2wgc3RhdGUpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYWYtPnNldE1pY011dGUoc3RhdGUpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6aXNNaWNyb3Bob25lTXV0ZWQoYm9vbCogc3RhdGUpIHsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjppc01pY3JvcGhvbmVNdXRlZChib29sKiBzdGF0ZSkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgICpzdGF0ZSA9IGFmLT5nZXRNaWNNdXRlKCk7CkBAIC0xNzUsMTMgKzE3OCwxNSBAQAogICAgIHJldHVybiBhZi0+c2V0TW9kZShtb2RlKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIHsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgcmV0dXJuIGFmLT5zZXRQYXJhbWV0ZXJzKGlvSGFuZGxlLCBrZXlWYWx1ZVBhaXJzKTsKIH0KIAotU3RyaW5nOCBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykgeworU3RyaW5nOCBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBTdHJpbmc4IHJlc3VsdCA9IFN0cmluZzgoIiIpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gcmVzdWx0OwpAQCAtMTkwLDYgKzE5NSwxNiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCit7CisgICAgcmV0dXJuIHNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIGtleVZhbHVlUGFpcnMpOworfQorCitTdHJpbmc4IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCit7CisgICAgcmV0dXJuIGdldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIGtleXMpOworfQorCiAvLyBjb252ZXJ0IHZvbHVtZSBzdGVwcyB0byBuYXR1cmFsIGxvZyBzY2FsZQogCiAvLyBjaGFuZ2UgdGhpcyB2YWx1ZSB0byBjaGFuZ2Ugdm9sdW1lIHNjYWxpbmcKQEAgLTIyNywxMSArMjQyLDIzIEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICByZXR1cm4gZ2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgc3RyZWFtVHlwZSwgc2FtcGxpbmdSYXRlKTsKKyAgICByZXR1cm4gZ2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgc2FtcGxpbmdSYXRlKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZUZvckF0dHIodWludDMyX3QqIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKQoreworICAgIGlmIChhdHRyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yQXR0cihhdHRyKTsKKyAgICBpZiAob3V0cHV0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gZ2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgc2FtcGxpbmdSYXRlKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHNhbXBsaW5nUmF0ZSkKIHsKICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjOwpAQCAtMjQ5LDkgKzI3NiwxMiBAQAogICAgICAgICAqc2FtcGxpbmdSYXRlID0gb3V0cHV0RGVzYy0+c2FtcGxpbmdSYXRlOwogICAgICAgICBnTG9jay51bmxvY2soKTsKICAgICB9CisgICAgaWYgKCpzYW1wbGluZ1JhdGUgPT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZSBmYWlsZWQgZm9yIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCi0gICAgQUxPR1YoImdldFNhbXBsaW5nUmF0ZSgpIHN0cmVhbVR5cGUgJWQsIG91dHB1dCAlZCwgc2FtcGxpbmcgcmF0ZSAldSIsIHN0cmVhbVR5cGUsIG91dHB1dCwKLSAgICAgICAgICAgICpzYW1wbGluZ1JhdGUpOworICAgIEFMT0dWKCJnZXRTYW1wbGluZ1JhdGUoKSBvdXRwdXQgJWQsIHNhbXBsaW5nIHJhdGUgJXUiLCBvdXRwdXQsICpzYW1wbGluZ1JhdGUpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMjY1LDE1ICsyOTUsMTQgQEAKICAgICB9CiAKICAgICBvdXRwdXQgPSBnZXRPdXRwdXQoc3RyZWFtVHlwZSk7Ci0gICAgaWYgKG91dHB1dCA9PSAwKSB7CisgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIGdldEZyYW1lQ291bnQob3V0cHV0LCBzdHJlYW1UeXBlLCBmcmFtZUNvdW50KTsKKyAgICByZXR1cm4gZ2V0RnJhbWVDb3VudChvdXRwdXQsIGZyYW1lQ291bnQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGZyYW1lQ291bnQpCiB7CiAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYzsKQEAgLTI4OSw5ICszMTgsMTIgQEAKICAgICAgICAgKmZyYW1lQ291bnQgPSBvdXRwdXREZXNjLT5mcmFtZUNvdW50OwogICAgICAgICBnTG9jay51bmxvY2soKTsKICAgICB9CisgICAgaWYgKCpmcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50IGZhaWxlZCBmb3Igb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKLSAgICBBTE9HVigiZ2V0RnJhbWVDb3VudCgpIHN0cmVhbVR5cGUgJWQsIG91dHB1dCAlZCwgZnJhbWVDb3VudCAlZCIsIHN0cmVhbVR5cGUsIG91dHB1dCwKLSAgICAgICAgICAgICpmcmFtZUNvdW50KTsKKyAgICBBTE9HVigiZ2V0RnJhbWVDb3VudCgpIG91dHB1dCAlZCwgZnJhbWVDb3VudCAlenUiLCBvdXRwdXQsICpmcmFtZUNvdW50KTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTMwNSwxNSArMzM3LDE0IEBACiAgICAgfQogCiAgICAgb3V0cHV0ID0gZ2V0T3V0cHV0KHN0cmVhbVR5cGUpOwotICAgIGlmIChvdXRwdXQgPT0gMCkgeworICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIHJldHVybiBnZXRMYXRlbmN5KG91dHB1dCwgc3RyZWFtVHlwZSwgbGF0ZW5jeSk7CisgICAgcmV0dXJuIGdldExhdGVuY3kob3V0cHV0LCBsYXRlbmN5KTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldExhdGVuY3koYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGxhdGVuY3kpCiB7CiAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYzsKQEAgLTMzMCw3ICszNjEsNyBAQAogICAgICAgICBnTG9jay51bmxvY2soKTsKICAgICB9CiAKLSAgICBBTE9HVigiZ2V0TGF0ZW5jeSgpIHN0cmVhbVR5cGUgJWQsIG91dHB1dCAlZCwgbGF0ZW5jeSAlZCIsIHN0cmVhbVR5cGUsIG91dHB1dCwgKmxhdGVuY3kpOworICAgIEFMT0dWKCJnZXRMYXRlbmN5KCkgb3V0cHV0ICVkLCBsYXRlbmN5ICVkIiwgb3V0cHV0LCAqbGF0ZW5jeSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0zNDksNiArMzgwLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgIH0KICAgICAgICAgaW5CdWZmU2l6ZSA9IGFmLT5nZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CisgICAgICAgIGlmIChpbkJ1ZmZTaXplID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0SW5wdXRCdWZmZXJTaXplIGZhaWxlZCBzYW1wbGVSYXRlICVkIGZvcm1hdCAlI3ggY2hhbm5lbE1hc2sgJXgiLAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgLy8gQSBiZW5pZ24gcmFjZSBpcyBwb3NzaWJsZSBoZXJlOiB3ZSBjb3VsZCBvdmVyd3JpdGUgYSBmcmVzaGVyIGNhY2hlIGVudHJ5CiAgICAgICAgIGdMb2NrLmxvY2soKTsKICAgICAgICAgLy8gc2F2ZSB0aGUgcmVxdWVzdCBwYXJhbXMKICAgICAgICAgZ1ByZXZJblNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7CkBAIC0zNzAsNTYgKzQwNyw2MCBAQAogICAgIHJldHVybiBhZi0+c2V0Vm9pY2VWb2x1bWUodmFsdWUpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0UmVuZGVyUG9zaXRpb24oYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBzaXplX3QgKmhhbEZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmRzcEZyYW1lcywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0UmVuZGVyUG9zaXRpb24oYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCB1aW50MzJfdCAqaGFsRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkc3BGcmFtZXMpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKLSAgICAgICAgc3RyZWFtID0gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIH0KLQotICAgIGlmIChvdXRwdXQgPT0gMCkgewotICAgICAgICBvdXRwdXQgPSBnZXRPdXRwdXQoc3RyZWFtKTsKLSAgICB9Ci0KICAgICByZXR1cm4gYWYtPmdldFJlbmRlclBvc2l0aW9uKGhhbEZyYW1lcywgZHNwRnJhbWVzLCBvdXRwdXQpOwogfQogCi1zaXplX3QgQXVkaW9TeXN0ZW06OmdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgewordWludDMyX3QgQXVkaW9TeXN0ZW06OmdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAwOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gcmVzdWx0OwotICAgIGlmIChpb0hhbmRsZSA9PSAwKSByZXR1cm4gcmVzdWx0OworICAgIGlmIChpb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgcmV0dXJuIHJlc3VsdDsKIAogICAgIHJlc3VsdCA9IGFmLT5nZXRJbnB1dEZyYW1lc0xvc3QoaW9IYW5kbGUpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWludCBBdWRpb1N5c3RlbTo6bmV3QXVkaW9TZXNzaW9uSWQoKSB7CithdWRpb191bmlxdWVfaWRfdCBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZCgpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHJldHVybiAwOwotICAgIHJldHVybiBhZi0+bmV3QXVkaW9TZXNzaW9uSWQoKTsKKyAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURTsKKyAgICByZXR1cm4gYWYtPm5ld0F1ZGlvVW5pcXVlSWQoKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pIHsKK3ZvaWQgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmICE9IDApIHsKLSAgICAgICAgYWYtPmFjcXVpcmVBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24pOworICAgICAgICBhZi0+YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbiwgcGlkKTsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKSB7Cit2b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiAhPSAwKSB7Ci0gICAgICAgIGFmLT5yZWxlYXNlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgYWYtPnJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24sIHBpZCk7CiAgICAgfQogfQogCithdWRpb19od19zeW5jX3QgQXVkaW9TeXN0ZW06OmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gQVVESU9fSFdfU1lOQ19JTlZBTElEOworICAgIHJldHVybiBhZi0+Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKHNlc3Npb25JZCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCit7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKEF1ZGlvU3lzdGVtOjpnTG9jayk7CiAKICAgICBBdWRpb1N5c3RlbTo6Z0F1ZGlvRmxpbmdlci5jbGVhcigpOwpAQCAtNDM4LDcgKzQ3OSw3IEBACiAgICAgY29uc3QgT3V0cHV0RGVzY3JpcHRvciAqZGVzYzsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTsKIAotICAgIGlmIChpb0hhbmRsZSA9PSAwKSByZXR1cm47CisgICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm47CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKIApAQCAtNDU1LDcgKzQ5Niw3IEBACiAKICAgICAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9ICBuZXcgT3V0cHV0RGVzY3JpcHRvcigqZGVzYyk7CiAgICAgICAgIGdPdXRwdXRzLmFkZChpb0hhbmRsZSwgb3V0cHV0RGVzYyk7Ci0gICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgb3V0cHV0IHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICVkIGNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAldSAiCisgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgb3V0cHV0IHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4IGZyYW1lQ291bnQgJXp1ICIKICAgICAgICAgICAgICAgICAibGF0ZW5jeSAlZCIsCiAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2FtcGxpbmdSYXRlLCBvdXRwdXREZXNjLT5mb3JtYXQsIG91dHB1dERlc2MtPmNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmZyYW1lQ291bnQsIG91dHB1dERlc2MtPmxhdGVuY3kpOwpAQCAtNDc5LDggKzUyMCw4IEBACiAgICAgICAgIGlmIChwYXJhbTIgPT0gTlVMTCkgYnJlYWs7CiAgICAgICAgIGRlc2MgPSAoY29uc3QgT3V0cHV0RGVzY3JpcHRvciAqKXBhcmFtMjsKIAotICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3IGNvbmZpZyBmb3Igb3V0cHV0ICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICVkIGNoYW5uZWwgbWFzayAlI3ggIgotICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICVkIGxhdGVuY3kgJWQiLAorICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3IGNvbmZpZyBmb3Igb3V0cHV0ICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4ICIKKyAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUgbGF0ZW5jeSAlZCIsCiAgICAgICAgICAgICAgICAgaW9IYW5kbGUsIGRlc2MtPnNhbXBsaW5nUmF0ZSwgZGVzYy0+Zm9ybWF0LAogICAgICAgICAgICAgICAgIGRlc2MtPmNoYW5uZWxNYXNrLCBkZXNjLT5mcmFtZUNvdW50LCBkZXNjLT5sYXRlbmN5KTsKICAgICAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IGdPdXRwdXRzLnZhbHVlQXQoaW5kZXgpOwpAQCAtNDk2LDEyICs1MzcsMTUgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OnNldEVycm9yQ2FsbGJhY2soYXVkaW9fZXJyb3JfY2FsbGJhY2sgY2IpIHsKK3ZvaWQgQXVkaW9TeXN0ZW06OnNldEVycm9yQ2FsbGJhY2soYXVkaW9fZXJyb3JfY2FsbGJhY2sgY2IpCit7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKICAgICBnQXVkaW9FcnJvckNhbGxiYWNrID0gY2I7CiB9CiAKLWJvb2wgQXVkaW9TeXN0ZW06OnJvdXRlZFRvQTJkcE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKKworYm9vbCBBdWRpb1N5c3RlbTo6cm91dGVkVG9BMmRwT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKICAgICBzd2l0Y2ggKHN0cmVhbVR5cGUpIHsKICAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKICAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgpAQCAtNTM5LDcgKzU4MywxMiBAQAogICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQpOwogICAgICAgICBnQXVkaW9Qb2xpY3lTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUG9saWN5U2VydmljZT4oYmluZGVyKTsKICAgICAgICAgZ0xvY2sudW5sb2NrKCk7CisgICAgICAgIC8vIFJlZ2lzdGVyaW5nIHRoZSBjbGllbnQgdGFrZXMgdGhlIEF1ZGlvUG9saWN5U2VydmljZSBsb2NrLgorICAgICAgICAvLyBEb24ndCBob2xkIHRoZSBBdWRpb1N5c3RlbSBsb2NrIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICAgIGdBdWRpb1BvbGljeVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQpOwogICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZXJlIGV4aXN0cyBhIGJlbmlnbiByYWNlIGNvbmRpdGlvbiB3aGVyZSBnQXVkaW9Qb2xpY3lTZXJ2aWNlCisgICAgICAgIC8vIGlzIHNldCwgYnV0IGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgaXMgbm90IHlldCByZWdpc3RlcmVkLgogICAgICAgICBnTG9jay51bmxvY2soKTsKICAgICB9CiAgICAgcmV0dXJuIGdBdWRpb1BvbGljeVNlcnZpY2U7CkBAIC02MDgsNiArNjU3LDE5IEBACiAgICAgcmV0dXJuIGFwcy0+Z2V0T3V0cHV0KHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOwogfQogCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGlmIChhdHRyID09IE5VTEwpIHJldHVybiAwOworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gMDsKKyAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKK30KKwogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKQEAgLTYzNywzMiArNjk5LDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGFwcy0+Z2V0SW5wdXQoaW5wdXRTb3VyY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc2Vzc2lvbklkKTsKKyAgICByZXR1cm4gYXBzLT5nZXRJbnB1dChpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzZXNzaW9uSWQsIGZsYWdzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRJbnB1dChpbnB1dCk7CisgICAgcmV0dXJuIGFwcy0+c3RhcnRJbnB1dChpbnB1dCwgc2Vzc2lvbik7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BJbnB1dChpbnB1dCk7CisgICAgcmV0dXJuIGFwcy0+c3RvcElucHV0KGlucHV0LCBzZXNzaW9uKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQordm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm47Ci0gICAgYXBzLT5yZWxlYXNlSW5wdXQoaW5wdXQpOworICAgIGFwcy0+cmVsZWFzZUlucHV0KGlucHV0LCBzZXNzaW9uKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC03MDIsMTQgKzc2OCwxNSBAQAogYXVkaW9fZGV2aWNlc190IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7Ci0gICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkwOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOwogICAgIHJldHVybiBhcHMtPmdldERldmljZXNGb3JTdHJlYW0oc3RyZWFtKTsKIH0KIAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7Ci0gICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgLy8gRklYTUUgY2hhbmdlIHJldHVybiB0eXBlIHRvIHN0YXR1c190LCBhbmQgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEIGhlcmUKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXRGb3JFZmZlY3QoZGVzYyk7CiB9CiAKQEAgLTgwMiwxMyArODY5LDExMiBAQAogICAgIHJldHVybiBhcHMtPmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+bGlzdEF1ZGlvUG9ydHMocm9sZSwgdHlwZSwgbnVtX3BvcnRzLCBwb3J0cywgZ2VuZXJhdGlvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRBdWRpb1BvcnQocG9ydCk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCBoYW5kbGUpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+bGlzdEF1ZGlvUGF0Y2hlcyhudW1fcGF0Y2hlcywgcGF0Y2hlcywgZ2VuZXJhdGlvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKK30KKwordm9pZCBBdWRpb1N5c3RlbTo6c2V0QXVkaW9Qb3J0Q2FsbGJhY2soc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+IGNhbGxCYWNrKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgZ0F1ZGlvUG9ydENhbGxiYWNrID0gY2FsbEJhY2s7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24sIGlvSGFuZGxlLCBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5yZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihzZXNzaW9uKTsKK30KKworYXVkaW9fbW9kZV90IEF1ZGlvU3lzdGVtOjpnZXRQaG9uZVN0YXRlKCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX01PREVfSU5WQUxJRDsKKyAgICByZXR1cm4gYXBzLT5nZXRQaG9uZVN0YXRlKCk7Cit9CisKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKEF1ZGlvU3lzdGVtOjpnTG9jayk7Cit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgIGlmIChnQXVkaW9Qb3J0Q2FsbGJhY2sgIT0gMCkgeworICAgICAgICBnQXVkaW9Qb3J0Q2FsbGJhY2stPm9uU2VydmljZURpZWQoKTsKKyAgICB9CiAgICAgQXVkaW9TeXN0ZW06OmdBdWRpb1BvbGljeVNlcnZpY2UuY2xlYXIoKTsKIAogICAgIEFMT0dXKCJBdWRpb1BvbGljeVNlcnZpY2Ugc2VydmVyIGRpZWQhIik7CiB9CiAKK3ZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25BdWRpb1BvcnRMaXN0VXBkYXRlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgIGlmIChnQXVkaW9Qb3J0Q2FsbGJhY2sgIT0gMCkgeworICAgICAgICBnQXVkaW9Qb3J0Q2FsbGJhY2stPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgIGlmIChnQXVkaW9Qb3J0Q2FsbGJhY2sgIT0gMCkgeworICAgICAgICBnQXVkaW9Qb3J0Q2FsbGJhY2stPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCmluZGV4IGUyOTA2MjcuLjBhODlmYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCkBAIC0xNSwxNyArMTUsMjAgQEAKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIAotCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvVHJhY2siCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKwogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAKICNkZWZpbmUgV0FJVF9QRVJJT0RfTVMgICAgICAgICAgICAgICAgICAxMAogI2RlZmluZSBXQUlUX1NUUkVBTV9FTkRfVElNRU9VVF9TRUMgICAgIDEyMApAQCAtMzQsNiArMzcsMTkgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitzdGF0aWMgaW50NjRfdCBjb252ZXJ0VGltZXNwZWNUb1VzKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAmdHYpCit7CisgICAgcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDAwMDBsbCArIHR2LnR2X25zZWMgLyAxMDAwOworfQorCisvLyBjdXJyZW50IG1vbm90b25pYyB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KK3N0YXRpYyBpbnQ2NF90IGdldE5vd1VzKCkKK3sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHY7CisgICAgKHZvaWQpIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHYpOworICAgIHJldHVybiBjb252ZXJ0VGltZXNwZWNUb1VzKHR2KTsKK30KKwogLy8gc3RhdGljCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXRNaW5GcmFtZUNvdW50KAogICAgICAgICBzaXplX3QqIGZyYW1lQ291bnQsCkBAIC00NCw5ICs2MCw2IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gZGVmYXVsdCB0byAwIGluIGNhc2Ugb2YgZXJyb3IKLSAgICAqZnJhbWVDb3VudCA9IDA7Ci0KICAgICAvLyBGSVhNRSBtZXJnZSB3aXRoIHNpbWlsYXIgY29kZSBpbiBjcmVhdGVUcmFja19sKCksIGV4Y2VwdCB3ZSdyZSBtaXNzaW5nCiAgICAgLy8gICAgICAgc29tZSBpbmZvcm1hdGlvbiBoZXJlIHRoYXQgaXMgYXZhaWxhYmxlIGluIGNyZWF0ZVRyYWNrX2woKToKICAgICAvLyAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQKQEAgLTU0LDE2ICs2NywyNiBAQAogICAgIC8vICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrCiAgICAgLy8gICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MKICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBzYW1wbGUgcmF0ZSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgc3RyZWFtVHlwZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBmcmFtZSBjb3VudCBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgdWludDMyX3QgYWZMYXRlbmN5OwotICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmYWZMYXRlbmN5LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmYWZMYXRlbmN5LCBzdHJlYW1UeXBlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGxhdGVuY3kgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgLy8gRW5zdXJlIHRoYXQgYnVmZmVyIGRlcHRoIGNvdmVycyBhdCBsZWFzdCBhdWRpbyBoYXJkd2FyZSBsYXRlbmN5CkBAIC03Myw4ICs5NiwxNSBAQAogICAgIH0KIAogICAgICpmcmFtZUNvdW50ID0gKHNhbXBsZVJhdGUgPT0gMCkgPyBhZkZyYW1lQ291bnQgKiBtaW5CdWZDb3VudCA6Ci0gICAgICAgICAgICBhZkZyYW1lQ291bnQgKiBtaW5CdWZDb3VudCAqIHNhbXBsZVJhdGUgLyBhZlNhbXBsZVJhdGU7Ci0gICAgQUxPR1YoImdldE1pbkZyYW1lQ291bnQ9JWQ6IGFmRnJhbWVDb3VudD0lZCwgbWluQnVmQ291bnQ9JWQsIGFmU2FtcGxlUmF0ZT0lZCwgYWZMYXRlbmN5PSVkIiwKKyAgICAgICAgICAgIGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50ICogdWludDY0X3Qoc2FtcGxlUmF0ZSkgLyBhZlNhbXBsZVJhdGU7CisgICAgLy8gVGhlIGZvcm11bGEgYWJvdmUgc2hvdWxkIGFsd2F5cyBwcm9kdWNlIGEgbm9uLXplcm8gdmFsdWUsIGJ1dCByZXR1cm4gYW4gZXJyb3IKKyAgICAvLyBpbiB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdCBpdCBkb2VzIG5vdCwgYXMgdGhhdCdzIHBhcnQgb2YgdGhlIEFQSSBjb250cmFjdC4KKyAgICBpZiAoKmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW9UcmFjazo6Z2V0TWluRnJhbWVDb3VudCBmYWlsZWQgZm9yIHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJWQiLAorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiZ2V0TWluRnJhbWVDb3VudD0lenU6IGFmRnJhbWVDb3VudD0lenUsIG1pbkJ1ZkNvdW50PSVkLCBhZlNhbXBsZVJhdGU9JWQsIGFmTGF0ZW5jeT0lZCIsCiAgICAgICAgICAgICAqZnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBtaW5CdWZDb3VudCwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTg4LDYgKzExOCwxMCBAQAogICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKFNQX0RFRkFVTFQpLAogICAgICAgbVBhdXNlZFBvc2l0aW9uKDApCiB7CisgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV047CisgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9VTktOT1dOOworICAgIG1BdHRyaWJ1dGVzLmZsYWdzID0gMHgwOworICAgIHN0cmNweShtQXR0cmlidXRlcy50YWdzLCAiIik7CiB9CiAKIEF1ZGlvVHJhY2s6OkF1ZGlvVHJhY2soCkBAIC05NSwxNSArMTI5LDE3IEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGludCBmcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAogICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCi0gICAgICAgIGludCB1aWQpCisgICAgICAgIGludCB1aWQsCisgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykKICAgICA6IG1TdGF0dXMoTk9fSU5JVCksCiAgICAgICBtSXNUaW1lZChmYWxzZSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCkBAIC0xMTMsNyArMTQ5LDcgQEAKICAgICBtU3RhdHVzID0gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBmcmFtZUNvdW50LCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICAwIC8qc2hhcmVkQnVmZmVyKi8sIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsCi0gICAgICAgICAgICBvZmZsb2FkSW5mbywgdWlkKTsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLCB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMpOwogfQogCiBBdWRpb1RyYWNrOjpBdWRpb1RyYWNrKApAQCAtMTI1LDExICsxNjEsMTMgQEAKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAogICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCi0gICAgICAgIGludCB1aWQpCisgICAgICAgIGludCB1aWQsCisgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykKICAgICA6IG1TdGF0dXMoTk9fSU5JVCksCiAgICAgICBtSXNUaW1lZChmYWxzZSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCkBAIC0xMzgsNyArMTc2LDggQEAKIHsKICAgICBtU3RhdHVzID0gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAwIC8qZnJhbWVDb3VudCovLCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICBzaGFyZWRCdWZmZXIsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLCB1aWQpOworICAgICAgICAgICAgc2hhcmVkQnVmZmVyLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywKKyAgICAgICAgICAgIHVpZCwgcGlkLCBwQXR0cmlidXRlcyk7CiB9CiAKIEF1ZGlvVHJhY2s6On5BdWRpb1RyYWNrKCkKQEAgLTE1Niw4ICsxOTUsMTIgQEAKICAgICAgICAgfQogICAgICAgICBtQXVkaW9UcmFjay0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7CisgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CisgICAgICAgIG1TaGFyZWRCdWZmZXIuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQpOworICAgICAgICBBTE9HVigifkF1ZGlvVHJhY2ssIHJlbGVhc2luZyBzZXNzaW9uIGlkIGZyb20gJWQgb24gYmVoYWxmIG9mICVkIiwKKyAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQpOwogICAgIH0KIH0KIApAQCAtMTY2LDE4ICsyMDksMjUgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgaW50IGZyYW1lQ291bnRJbnQsCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSwKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgaW50IHVpZCkKKyAgICAgICAgaW50IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQogeworICAgIEFMT0dWKCJzZXQoKTogc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgorICAgICAgICAgICJmbGFncyAjJXgsIG5vdGlmaWNhdGlvbkZyYW1lcyAldSwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQiLAorICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGZsYWdzLCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUpOworCiAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKICAgICBjYXNlIFRSQU5TRkVSX0RFRkFVTFQ6CiAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgewpAQCAtMjExLDE5ICsyNjEsMTMgQEAKICAgICAgICAgQUxPR0UoIkludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIHRyYW5zZmVyVHlwZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIG1TaGFyZWRCdWZmZXIgPSBzaGFyZWRCdWZmZXI7CiAgICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwogCi0gICAgLy8gRklYTUUgImludCIgaGVyZSBpcyBsZWdhY3kgYW5kIHdpbGwgYmUgcmVwbGFjZWQgYnkgc2l6ZV90IGxhdGVyCi0gICAgaWYgKGZyYW1lQ291bnRJbnQgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZyYW1lIGNvdW50ICVkIiwgZnJhbWVDb3VudEludCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZnJhbWVDb3VudEludDsKLQogICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwKICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKIAotICAgIEFMT0dWKCJzZXQoKSBzdHJlYW1UeXBlICVkIGZyYW1lQ291bnQgJXUgZmxhZ3MgJTA0eCIsIHN0cmVhbVR5cGUsIGZyYW1lQ291bnQsIGZsYWdzKTsKKyAgICBBTE9HVigic2V0KCkgc3RyZWFtVHlwZSAlZCBmcmFtZUNvdW50ICV6dSBmbGFncyAlMDR4Iiwgc3RyZWFtVHlwZSwgZnJhbWVDb3VudCwgZmxhZ3MpOwogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCkBAIC0yMzMsMTkgKzI3NywzOSBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgbU91dHB1dCA9IDA7Ci0KICAgICAvLyBoYW5kbGUgZGVmYXVsdCB2YWx1ZXMgZmlyc3QuCiAgICAgaWYgKHN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKICAgICAgICAgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKICAgICB9CiAKLSAgICBpZiAoc2FtcGxlUmF0ZSA9PSAwKSB7Ci0gICAgICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgIGlmIChwQXR0cmlidXRlcyA9PSBOVUxMKSB7CisgICAgICAgIGlmICh1aW50MzJfdChzdHJlYW1UeXBlKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbVR5cGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBzYW1wbGVSYXRlID0gYWZTYW1wbGVSYXRlOworICAgICAgICBzZXRBdHRyaWJ1dGVzRnJvbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSk7CisgICAgICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWlzVmFsaWRBdHRyaWJ1dGVzKHBBdHRyaWJ1dGVzKSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgICAgICAgICAgcEF0dHJpYnV0ZXMtPnVzYWdlLCBwQXR0cmlidXRlcy0+Y29udGVudF90eXBlLCBwQXR0cmlidXRlcy0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgcEF0dHJpYnV0ZXMtPnRhZ3MpOworICAgICAgICB9CisgICAgICAgIC8vIHN0cmVhbSB0eXBlIHNob3VsZG4ndCBiZSBsb29rZWQgYXQsIHRoaXMgdHJhY2sgaGFzIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICAgICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgc2V0U3RyZWFtVHlwZUZyb21BdHRyaWJ1dGVzKG1BdHRyaWJ1dGVzKTsKKyAgICAgICAgQUxPR1YoIkJ1aWxkaW5nIEF1ZGlvVHJhY2sgd2l0aCBhdHRyaWJ1dGVzOiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKKyAgICAgICAgICAgICAgICBtQXR0cmlidXRlcy51c2FnZSwgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZUZvckF0dHIoJnNhbXBsZVJhdGUsICZtQXR0cmlidXRlcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IG91dHB1dCBzYW1wbGUgcmF0ZSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogICAgIH0KICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAKQEAgLTI1MywxNSArMzE3LDIxIEBACiAgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgewogICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICB9Ci0gICAgaWYgKGNoYW5uZWxNYXNrID09IDApIHsKLSAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgfQogCiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwogICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZm9ybWF0ICVkIiwgZm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CiAKICAgICAvLyBBdWRpb0ZsaW5nZXIgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgOC1iaXQgZGF0YSBpbiBzaGFyZWQgbWVtb3J5CiAgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSB7CkBAIC0yODEsNTAgKzM1MSw1NiBAQAogICAgICAgICAgICAgICAgICgoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwogICAgIH0KICAgICAvLyBvbmx5IGFsbG93IGRlZXAgYnVmZmVyaW5nIGZvciBtdXNpYyBzdHJlYW0gdHlwZQotICAgIGlmIChzdHJlYW1UeXBlICE9IEFVRElPX1NUUkVBTV9NVVNJQykgeworICAgIGlmIChtU3RyZWFtVHlwZSAhPSBBVURJT19TVFJFQU1fTVVTSUMpIHsKICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzICZ+QVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpOwogICAgIH0KIAotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKLSAgICBtQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OwotCi0gICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwotICAgICAgICBtRnJhbWVTaXplQUYgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCk7CisgICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4X3QpOworICAgICAgICB9CisgICAgICAgIG1GcmFtZVNpemVBRiA9IG1GcmFtZVNpemU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OF90KTsKLSAgICAgICAgbUZyYW1lU2l6ZUFGID0gc2l6ZW9mKHVpbnQ4X3QpOworICAgICAgICBBTE9HX0FTU0VSVChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpOworICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgICAgICBtRnJhbWVTaXplQUYgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKAorICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUID8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBmb3JtYXQpOworICAgICAgICAvLyBjcmVhdGVUcmFjayB3aWxsIHJldHVybiBhbiBlcnJvciBpZiBQQ00gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgc2VydmVyLAorICAgICAgICAvLyBzbyBubyBuZWVkIHRvIGNoZWNrIGZvciBzcGVjaWZpYyBQQ00gZm9ybWF0cyBoZXJlCiAgICAgfQogCi0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mbyk7Ci0KLSAgICBpZiAob3V0cHV0ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gb3V0cHV0IGZvciBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbVR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIC8vIE1ha2UgY29weSBvZiBpbnB1dCBwYXJhbWV0ZXIgb2ZmbG9hZEluZm8gc28gdGhhdCBpbiB0aGUgZnV0dXJlOgorICAgIC8vICAoYSkgY3JlYXRlVHJhY2tfbCBkb2Vzbid0IG5lZWQgaXQgYXMgYW4gaW5wdXQgcGFyYW1ldGVyCisgICAgLy8gIChiKSB3ZSBjYW4gc3VwcG9ydCByZS1jcmVhdGlvbiBvZiBvZmZsb2FkZWQgdHJhY2tzCisgICAgaWYgKG9mZmxvYWRJbmZvICE9IE5VTEwpIHsKKyAgICAgICAgbU9mZmxvYWRJbmZvQ29weSA9ICpvZmZsb2FkSW5mbzsKKyAgICAgICAgbU9mZmxvYWRJbmZvID0gJm1PZmZsb2FkSW5mb0NvcHk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU9mZmxvYWRJbmZvID0gTlVMTDsKICAgICB9CiAKLSAgICBtVm9sdW1lW0xFRlRdID0gMS4wZjsKLSAgICBtVm9sdW1lW1JJR0hUXSA9IDEuMGY7CisgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdID0gMS4wZjsKKyAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdID0gMS4wZjsKICAgICBtU2VuZExldmVsID0gMC4wZjsKLSAgICBtRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgLy8gbUZyYW1lQ291bnQgaXMgaW5pdGlhbGl6ZWQgaW4gY3JlYXRlVHJhY2tfbAogICAgIG1SZXFGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxID0gbm90aWZpY2F0aW9uRnJhbWVzOwogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAwOwogICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgaWYgKHVpZCA9PSAtMSB8fCAoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpKSkgeworICAgIGludCBjYWxsaW5ncGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBteXBpZCA9IGdldHBpZCgpOworICAgIGlmICh1aWQgPT0gLTEgfHwgKGNhbGxpbmdwaWQgIT0gbXlwaWQpKSB7CiAgICAgICAgIG1DbGllbnRVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUNsaWVudFVpZCA9IHVpZDsKICAgICB9CisgICAgaWYgKHBpZCA9PSAtMSB8fCAoY2FsbGluZ3BpZCAhPSBteXBpZCkpIHsKKyAgICAgICAgbUNsaWVudFBpZCA9IGNhbGxpbmdwaWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNsaWVudFBpZCA9IHBpZDsKKyAgICB9CiAgICAgbUF1eEVmZmVjdElkID0gMDsKICAgICBtRmxhZ3MgPSBmbGFnczsKICAgICBtQ2JmID0gY2JmOwpAQCAtMzM1LDE0ICs0MTEsNyBAQAogICAgIH0KIAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvVHJhY2sKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVUcmFja19sKHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyplcG9jaCovKTsKKyAgICBzdGF0dXMgPSBjcmVhdGVUcmFja19sKCk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQXVkaW9UcmFja1RocmVhZCAhPSAwKSB7CkBAIC0zNTAsMTcgKzQxOSwxMCBAQAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwogICAgICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQuY2xlYXIoKTsKICAgICAgICAgfQotICAgICAgICAvL1VzZSBvZiBkaXJlY3QgYW5kIG9mZmxvYWRlZCBvdXRwdXQgc3RyZWFtcyBpcyByZWYgY291bnRlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlci4KLSAgICAgICAgLy8gQXMgZ2V0T3V0cHV0IHdhcyBjYWxsZWQgYWJvdmUgYW5kIHJlc3VsdGVkIGluIGFuIG91dHB1dCBzdHJlYW0gdG8gYmUgb3BlbmVkLAotICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbGVhc2UgaXQuCi0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOwotICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICBtRm9ybWF0ID0gZm9ybWF0OwotICAgIG1TaGFyZWRCdWZmZXIgPSBzaGFyZWRCdWZmZXI7CiAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKICAgICBtVXNlckRhdGEgPSB1c2VyOwogICAgIG1Mb29wUGVyaW9kID0gMDsKQEAgLTM2OCwxMSArNDMwLDE0IEBACiAgICAgbU1hcmtlclJlYWNoZWQgPSBmYWxzZTsKICAgICBtTmV3UG9zaXRpb24gPSAwOwogICAgIG1VcGRhdGVQZXJpb2QgPSAwOwotICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCk7CisgICAgbVNlcnZlciA9IDA7CisgICAgbVBvc2l0aW9uID0gMDsKKyAgICBtUmVsZWFzZWQgPSAwOworICAgIG1TdGFydFVzID0gMDsKKyAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQpOwogICAgIG1TZXF1ZW5jZSA9IDE7CiAgICAgbU9ic2VydmVkU2VxdWVuY2UgPSBtU2VxdWVuY2U7CiAgICAgbUluVW5kZXJydW4gPSBmYWxzZTsKLSAgICBtT3V0cHV0ID0gb3V0cHV0OwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMzk1LDE0ICs0NjAsMjEgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtU3RhdGUgPSBTVEFURV9BQ1RJVkU7CiAgICAgfQorICAgICh2b2lkKSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCk7CiAgICAgaWYgKHByZXZpb3VzU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCB8fCBwcmV2aW91c1N0YXRlID09IFNUQVRFX0ZMVVNIRUQpIHsKICAgICAgICAgLy8gcmVzZXQgY3VycmVudCBwb3NpdGlvbiBhcyBzZWVuIGJ5IGNsaWVudCB0byAwCi0gICAgICAgIG1Qcm94eS0+c2V0RXBvY2gobVByb3h5LT5nZXRFcG9jaCgpIC0gbVByb3h5LT5nZXRQb3NpdGlvbigpKTsKKyAgICAgICAgbVBvc2l0aW9uID0gMDsKKyAgICAgICAgLy8gRm9yIG9mZmxvYWRlZCB0cmFja3MsIHdlIGRvbid0IGtub3cgaWYgdGhlIGhhcmR3YXJlIGNvdW50ZXJzIGFyZSByZWFsbHkgemVybyBoZXJlLAorICAgICAgICAvLyBzaW5jZSB0aGUgZmx1c2ggaXMgYXN5bmNocm9ub3VzIGFuZCBzdG9wIG1heSBub3QgZnVsbHkgZHJhaW4uCisgICAgICAgIC8vIFdlIHNhdmUgdGhlIHRpbWUgd2hlbiB0aGUgdHJhY2sgaXMgc3RhcnRlZCB0byBsYXRlciB2ZXJpZnkgd2hldGhlcgorICAgICAgICAvLyB0aGUgY291bnRlcnMgYXJlIHJlYWxpc3RpYyAoaS5lLiBzdGFydCBmcm9tIHplcm8gYWZ0ZXIgdGhpcyB0aW1lKS4KKyAgICAgICAgbVN0YXJ0VXMgPSBnZXROb3dVcygpOworCiAgICAgICAgIC8vIGZvcmNlIHJlZnJlc2ggb2YgcmVtYWluaW5nIGZyYW1lcyBieSBwcm9jZXNzQXVkaW9CdWZmZXIoKSBhcyBsYXN0CiAgICAgICAgIC8vIHdyaXRlIGJlZm9yZSBzdG9wIGNvdWxkIGJlIHBhcnRpYWwuCiAgICAgICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKICAgICB9Ci0gICAgbU5ld1Bvc2l0aW9uID0gbVByb3h5LT5nZXRQb3NpdGlvbigpICsgbVVwZGF0ZVBlcmlvZDsKKyAgICBtTmV3UG9zaXRpb24gPSBtUG9zaXRpb24gKyBtVXBkYXRlUGVyaW9kOwogICAgIGludDMyX3QgZmxhZ3MgPSBhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRUQsICZtQ2Jsay0+bUZsYWdzKTsKIAogICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+IHQgPSBtQXVkaW9UcmFja1RocmVhZDsKQEAgLTQ0OCwxNSArNTIwLDE1IEBACiB2b2lkIEF1ZGlvVHJhY2s6OnN0b3AoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICAvLyBGSVhNRSBwYXVzZSB0aGVuIHN0b3Agc2hvdWxkIG5vdCBiZSBhIG5vcAotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQUNUSVZFKSB7CisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUgJiYgbVN0YXRlICE9IFNUQVRFX1BBVVNFRCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRfbCgpKSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQSU5HOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CisgICAgICAgIG1SZWxlYXNlZCA9IDA7CiAgICAgfQogCiAgICAgbVByb3h5LT5pbnRlcnJ1cHQoKTsKQEAgLTQ3NSw3ICs1NDcsNyBAQAogCiAgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gdCA9IG1BdWRpb1RyYWNrVGhyZWFkOwogICAgIGlmICh0ICE9IDApIHsKLSAgICAgICAgaWYgKCFpc09mZmxvYWRlZCgpKSB7CisgICAgICAgIGlmICghaXNPZmZsb2FkZWRfbCgpKSB7CiAgICAgICAgICAgICB0LT5wYXVzZSgpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTUxMyw3ICs1ODUsOCBAQAogICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKIAogICAgIG1TdGF0ZSA9IFNUQVRFX0ZMVVNIRUQ7Ci0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBtUmVsZWFzZWQgPSAwOworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKICAgICAgICAgbVByb3h5LT5pbnRlcnJ1cHQoKTsKICAgICB9CiAgICAgbVByb3h5LT5mbHVzaCgpOwpAQCAtNTMzLDExICs2MDYsMjAgQEAKICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgIG1BdWRpb1RyYWNrLT5wYXVzZSgpOwogCi0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKLSAgICAgICAgaWYgKG1PdXRwdXQgIT0gMCkgeworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKKyAgICAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIC8vIEFuIG9mZmxvYWQgb3V0cHV0IGNhbiBiZSByZS11c2VkIGJldHdlZW4gdHdvIGF1ZGlvIHRyYWNrcyBoYXZpbmcKKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24uIEEgdGltZXN0YW1wIHF1ZXJ5IGZvciBhIHBhdXNlZCB0cmFjaworICAgICAgICAgICAgLy8gd2hpbGUgdGhlIG90aGVyIGlzIHJ1bm5pbmcgd291bGQgcmV0dXJuIGFuIGluY29ycmVjdCB0aW1lLgorICAgICAgICAgICAgLy8gVG8gZml4IHRoaXMsIGNhY2hlIHRoZSBwbGF5YmFjayBwb3NpdGlvbiBvbiBhIHBhdXNlKCkgYW5kIHJldHVybgorICAgICAgICAgICAgLy8gdGhpcyB0aW1lIHdoZW4gcmVxdWVzdGVkIHVudGlsIHRoZSB0cmFjayBpcyByZXN1bWVkLgorCisgICAgICAgICAgICAvLyBPZmZsb2FkVGhyZWFkIHNlbmRzIEhBTCBwYXVzZSBpbiBpdHMgdGhyZWFkTG9vcC4gVGltZSBzYXZlZAorICAgICAgICAgICAgLy8gaGVyZSBjYW4gYmUgc2xpZ2h0bHkgb2ZmLgorCisgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayByZXR1cm4gY29kZSBmb3IgZ2V0UmVuZGVyUG9zaXRpb24uCisKICAgICAgICAgICAgIHVpbnQzMl90IGhhbEZyYW1lczsKLSAgICAgICAgICAgIC8vIE9mZmxvYWRUaHJlYWQgc2VuZHMgSEFMIHBhdXNlIGluIGl0cyB0aHJlYWRMb29wLi4gdGltZSBzYXZlZAotICAgICAgICAgICAgLy8gaGVyZSBjYW4gYmUgc2xpZ2h0bHkgb2ZmCiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0UmVuZGVyUG9zaXRpb24obU91dHB1dCwgJmhhbEZyYW1lcywgJm1QYXVzZWRQb3NpdGlvbik7CiAgICAgICAgICAgICBBTE9HVigiQXVkaW9UcmFjazo6cGF1c2UgZm9yIG9mZmxvYWQsIGNhY2hlIGN1cnJlbnQgcG9zaXRpb24gJXUiLCBtUGF1c2VkUG9zaXRpb24pOwogICAgICAgICB9CkBAIC01NDYsMTcgKzYyOCwxOSBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpCiB7Ci0gICAgaWYgKGxlZnQgPCAwLjBmIHx8IGxlZnQgPiAxLjBmIHx8IHJpZ2h0IDwgMC4wZiB8fCByaWdodCA+IDEuMGYpIHsKKyAgICAvLyBUaGlzIGR1cGxpY2F0ZXMgYSB0ZXN0IGJ5IEF1ZGlvVHJhY2sgSk5JLCBidXQgdGhhdCBpcyBub3QgdGhlIG9ubHkgY2FsbGVyCisgICAgaWYgKGlzbmFuZihsZWZ0KSB8fCBsZWZ0IDwgR0FJTl9GTE9BVF9aRVJPIHx8IGxlZnQgPiBHQUlOX0ZMT0FUX1VOSVRZIHx8CisgICAgICAgICAgICBpc25hbmYocmlnaHQpIHx8IHJpZ2h0IDwgR0FJTl9GTE9BVF9aRVJPIHx8IHJpZ2h0ID4gR0FJTl9GTE9BVF9VTklUWSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBtVm9sdW1lW0xFRlRdID0gbGVmdDsKLSAgICBtVm9sdW1lW1JJR0hUXSA9IHJpZ2h0OworICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSA9IGxlZnQ7CisgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSA9IHJpZ2h0OwogCi0gICAgbVByb3h5LT5zZXRWb2x1bWVMUigodWludDMyX3QodWludDE2X3QocmlnaHQgKiAweDEwMDApKSA8PCAxNikgfCB1aW50MTZfdChsZWZ0ICogMHgxMDAwKSk7CisgICAgbVByb3h5LT5zZXRWb2x1bWVMUihnYWluX21pbmlmbG9hdF9wYWNrKGdhaW5fZnJvbV9mbG9hdChsZWZ0KSwgZ2Fpbl9mcm9tX2Zsb2F0KHJpZ2h0KSkpOwogCi0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRfbCgpKSB7CiAgICAgICAgIG1BdWRpb1RyYWNrLT5zaWduYWwoKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNTY5LDcgKzY1Myw4IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkKIHsKLSAgICBpZiAobGV2ZWwgPCAwLjBmIHx8IGxldmVsID4gMS4wZikgeworICAgIC8vIFRoaXMgZHVwbGljYXRlcyBhIHRlc3QgYnkgQXVkaW9UcmFjayBKTkksIGJ1dCB0aGF0IGlzIG5vdCB0aGUgb25seSBjYWxsZXIKKyAgICBpZiAoaXNuYW5mKGxldmVsKSB8fCBsZXZlbCA8IEdBSU5fRkxPQVRfWkVSTyB8fCBsZXZlbCA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTU4OSwxNiArNjc0LDE1IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFNhbXBsZVJhdGUodWludDMyX3QgcmF0ZSkKIHsKLSAgICBpZiAobUlzVGltZWQgfHwgaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChtSXNUaW1lZCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAogICAgIHVpbnQzMl90IGFmU2FtcGxpbmdSYXRlOwotICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsaW5nUmF0ZSwgbVN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CisgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGVGb3JBdHRyKCZhZlNhbXBsaW5nUmF0ZSwgJm1BdHRyaWJ1dGVzKSAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgLy8gUmVzYW1wbGVyIGltcGxlbWVudGF0aW9uIGxpbWl0cyBpbnB1dCBzYW1wbGluZyByYXRlIHRvIDIgeCBvdXRwdXQgc2FtcGxpbmcgcmF0ZS4KLSAgICBpZiAocmF0ZSA9PSAwIHx8IHJhdGUgPiBhZlNhbXBsaW5nUmF0ZSoyICkgeworICAgIGlmIChyYXRlID09IDAgfHwgcmF0ZSA+IGFmU2FtcGxpbmdSYXRlICogQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC02MjAsMTAgKzcwNCwxMCBAQAogICAgIC8vIHNhbXBsZSByYXRlIGNhbiBiZSB1cGRhdGVkIGR1cmluZyBwbGF5YmFjayBieSB0aGUgb2ZmbG9hZGVkIGRlY29kZXIgc28gd2UgbmVlZCB0bwogICAgIC8vIHF1ZXJ5IHRoZSBIQUwgYW5kIHVwZGF0ZSBpZiBuZWVkZWQuCiAvLyBGSVhNRSB1c2UgUHJveHkgcmV0dXJuIGNoYW5uZWwgdG8gdXBkYXRlIHRoZSByYXRlIGZyb20gc2VydmVyIGFuZCBhdm9pZCBwb2xsaW5nIGhlcmUKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgewotICAgICAgICBpZiAobU91dHB1dCAhPSAwKSB7CisgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpKSB7CisgICAgICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gMDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRTYW1wbGluZ1JhdGUobU91dHB1dCwgbVN0cmVhbVR5cGUsICZzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRTYW1wbGluZ1JhdGUobU91dHB1dCwgJnNhbXBsZVJhdGUpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKICAgICAgICAgICAgIH0KQEAgLTYzNCw3ICs3MTgsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRMb29wKHVpbnQzMl90IGxvb3BTdGFydCwgdWludDMyX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCkKIHsKLSAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwIHx8IG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwIHx8IG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC02NjAsNyArNzQ0LDcgQEAKIHsKICAgICAvLyBGSVhNRSBJZiBzZXR0aW5nIGEgbG9vcCBhbHNvIHNldHMgcG9zaXRpb24gdG8gc3RhcnQgb2YgbG9vcCwgdGhlbgogICAgIC8vICAgICAgIHRoaXMgaXMgY29ycmVjdC4gIE90aGVyd2lzZSBpdCBzaG91bGQgYmUgcmVtb3ZlZC4KLSAgICBtTmV3UG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyBtVXBkYXRlUGVyaW9kOworICAgIG1OZXdQb3NpdGlvbiA9IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKSArIG1VcGRhdGVQZXJpb2Q7CiAgICAgbUxvb3BQZXJpb2QgPSBsb29wQ291bnQgIT0gMCA/IGxvb3BFbmQgLSBsb29wU3RhcnQgOiAwOwogICAgIG1TdGF0aWNQcm94eS0+c2V0TG9vcChsb29wU3RhcnQsIGxvb3BFbmQsIGxvb3BDb3VudCk7CiB9CkBAIC02NjgsNyArNzUyLDcgQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldE1hcmtlclBvc2l0aW9uKHVpbnQzMl90IG1hcmtlcikKIHsKICAgICAvLyBUaGUgb25seSBwdXJwb3NlIG9mIHNldHRpbmcgbWFya2VyIHBvc2l0aW9uIGlzIHRvIGdldCBhIGNhbGxiYWNrCi0gICAgaWYgKG1DYmYgPT0gTlVMTCB8fCBpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKG1DYmYgPT0gTlVMTCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtNjgxLDcgKzc2NSw3IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OmdldE1hcmtlclBvc2l0aW9uKHVpbnQzMl90ICptYXJrZXIpIGNvbnN0CiB7Ci0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgaWYgKG1hcmtlciA9PSBOVUxMKSB7CkBAIC02OTcsMTkgKzc4MSwyMCBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0UG9zaXRpb25VcGRhdGVQZXJpb2QodWludDMyX3QgdXBkYXRlUGVyaW9kKQogewogICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBwb3NpdGlvbiB1cGRhdGUgcGVyaW9kIGlzIHRvIGdldCBhIGNhbGxiYWNrCi0gICAgaWYgKG1DYmYgPT0gTlVMTCB8fCBpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKG1DYmYgPT0gTlVMTCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBtTmV3UG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyB1cGRhdGVQZXJpb2Q7CisgICAgbU5ld1Bvc2l0aW9uID0gdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpICsgdXBkYXRlUGVyaW9kOwogICAgIG1VcGRhdGVQZXJpb2QgPSB1cGRhdGVQZXJpb2Q7CisKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OmdldFBvc2l0aW9uVXBkYXRlUGVyaW9kKHVpbnQzMl90ICp1cGRhdGVQZXJpb2QpIGNvbnN0CiB7Ci0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgaWYgKHVwZGF0ZVBlcmlvZCA9PSBOVUxMKSB7CkBAIC03MjQsNyArODA5LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0UG9zaXRpb24odWludDMyX3QgcG9zaXRpb24pCiB7Ci0gICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCB8fCBtSXNUaW1lZCB8fCBpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCB8fCBtSXNUaW1lZCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAocG9zaXRpb24gPiBtRnJhbWVDb3VudCkgewpAQCAtNzQxLDcgKzgyNiw3IEBACiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBtTmV3UG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyBtVXBkYXRlUGVyaW9kOworICAgIG1OZXdQb3NpdGlvbiA9IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKSArIG1VcGRhdGVQZXJpb2Q7CiAgICAgbUxvb3BQZXJpb2QgPSAwOwogICAgIC8vIEZJWE1FIENoZWNrIHdoZXRoZXIgbG9vcHMgYW5kIHNldHRpbmcgcG9zaXRpb24gYXJlIGluY29tcGF0aWJsZSBpbiBvbGQgY29kZS4KICAgICAvLyBJZiB3ZSB1c2Ugc2V0TG9vcCBmb3IgYm90aCBwdXJwb3NlcyB3ZSBsb3NlIHRoZSBjYXBhYmlsaXR5IHRvIHNldCB0aGUgcG9zaXRpb24gd2hpbGUgbG9vcGluZy4KQEAgLTc1MCwzNiArODM1LDM4IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0CitzdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pCiB7CiAgICAgaWYgKHBvc2l0aW9uID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKICAgICAgICAgdWludDMyX3QgZHNwRnJhbWVzID0gMDsKIAotICAgICAgICBpZiAoKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQpIHx8IChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEX1NUT1BQSU5HKSkgeworICAgICAgICBpZiAoaXNPZmZsb2FkZWRfbCgpICYmICgobVN0YXRlID09IFNUQVRFX1BBVVNFRCkgfHwgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRURfU1RPUFBJTkcpKSkgewogICAgICAgICAgICAgQUxPR1YoImdldFBvc2l0aW9uIGNhbGxlZCBpbiBwYXVzZWQgc3RhdGUsIHJldHVybiBjYWNoZWQgcG9zaXRpb24gJXUiLCBtUGF1c2VkUG9zaXRpb24pOwogICAgICAgICAgICAgKnBvc2l0aW9uID0gbVBhdXNlZFBvc2l0aW9uOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1PdXRwdXQgIT0gMCkgeworICAgICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgdWludDMyX3QgaGFsRnJhbWVzOwogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldFJlbmRlclBvc2l0aW9uKG1PdXRwdXQsICZoYWxGcmFtZXMsICZkc3BGcmFtZXMpOwogICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FOiBkc3BGcmFtZXMgbWF5IG5vdCBiZSB6ZXJvIGluIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCB8fCBtU3RhdGUgPT0gU1RBVEVfRkxVU0hFRCkKKyAgICAgICAgLy8gZHVlIHRvIGhhcmR3YXJlIGxhdGVuY3kuIFdlIGxlYXZlIHRoaXMgYmVoYXZpb3IgZm9yIG5vdy4KICAgICAgICAgKnBvc2l0aW9uID0gZHNwRnJhbWVzOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIElBdWRpb1RyYWNrOjpzdG9wKCkgaXNuJ3Qgc3luY2hyb25vdXM7IHdlIGRvbid0IGtub3cgd2hlbiBwcmVzZW50YXRpb24gY29tcGxldGVzCi0gICAgICAgICpwb3NpdGlvbiA9IChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCB8fCBtU3RhdGUgPT0gU1RBVEVfRkxVU0hFRCkgPyAwIDoKLSAgICAgICAgICAgICAgICBtUHJveHktPmdldFBvc2l0aW9uKCk7CisgICAgICAgICpwb3NpdGlvbiA9IChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCB8fCBtU3RhdGUgPT0gU1RBVEVfRkxVU0hFRCkgPworICAgICAgICAgICAgICAgIDAgOiB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0QnVmZmVyUG9zaXRpb24oc2l6ZV90ICpwb3NpdGlvbikKK3N0YXR1c190IEF1ZGlvVHJhY2s6OmdldEJ1ZmZlclBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikKIHsKICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwIHx8IG1Jc1RpbWVkKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTc5NSw3ICs4ODIsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpyZWxvYWQoKQogewotICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgfHwgbUlzVGltZWQgfHwgaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgfHwgbUlzVGltZWQgfHwgaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTgxMiwyMyArODk5LDEyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1RyYWNrOjpnZXRPdXRwdXQoKQorYXVkaW9faW9faGFuZGxlX3QgQXVkaW9UcmFjazo6Z2V0T3V0cHV0KCkgY29uc3QKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1PdXRwdXQ7CiB9CiAKLS8vIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9UcmFjazo6Z2V0T3V0cHV0X2woKQotewotICAgIGlmIChtT3V0cHV0KSB7Ci0gICAgICAgIHJldHVybiBtT3V0cHV0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtRmxhZ3MpOwotICAgIH0KLX0KLQogc3RhdHVzX3QgQXVkaW9UcmFjazo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC04NDIsMTUgKzkxOCw3IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAotc3RhdHVzX3QgQXVkaW9UcmFjazo6Y3JlYXRlVHJhY2tfbCgKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICBzaXplX3QgZXBvY2gpCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpjcmVhdGVUcmFja19sKCkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwpAQCAtODU5LDQxICs5MjcsNTQgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJm1BdHRyaWJ1dGVzLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwKKyAgICAgICAgICAgIG1DaGFubmVsTWFzaywgbUZsYWdzLCBtT2ZmbG9hZEluZm8pOworICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gb3V0cHV0IGZvciBzdHJlYW0gdHlwZSAlZCwgdXNhZ2UgJWQsIHNhbXBsZSByYXRlICV1LCBmb3JtYXQgJSN4LCIKKyAgICAgICAgICAgICAgIiBjaGFubmVsIG1hc2sgJSN4LCBmbGFncyAlI3giLAorICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwgbUF0dHJpYnV0ZXMudXNhZ2UsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1GbGFncyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHsKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRvIGFuIEkvTyBoYW5kbGUgYW5kIGhhdmUgbm90IHlldCBoYW5kZWQgaXQgb2ZmIHRvIEF1ZGlvRmxpbmdlciwKKyAgICAvLyB3ZSBtdXN0IHJlbGVhc2UgaXQgb3Vyc2VsdmVzIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuCisKICAgICAvLyBOb3QgYWxsIG9mIHRoZXNlIHZhbHVlcyBhcmUgbmVlZGVkIHVuZGVyIGFsbCBjb25kaXRpb25zLCBidXQgaXQgaXMgZWFzaWVyIHRvIGdldCB0aGVtIGFsbAogCiAgICAgdWludDMyX3QgYWZMYXRlbmN5OwotICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRMYXRlbmN5KG91dHB1dCwgc3RyZWFtVHlwZSwgJmFmTGF0ZW5jeSk7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kob3V0cHV0LCAmYWZMYXRlbmN5KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJnZXRMYXRlbmN5KCVkKSBmYWlsZWQgc3RhdHVzICVkIiwgb3V0cHV0LCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgZ290byByZWxlYXNlOwogICAgIH0KIAogICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnQob3V0cHV0LCBzdHJlYW1UeXBlLCAmYWZGcmFtZUNvdW50KTsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudChvdXRwdXQsICZhZkZyYW1lQ291bnQpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImdldEZyYW1lQ291bnQob3V0cHV0PSVkLCBzdHJlYW1UeXBlPSVkKSBzdGF0dXMgJWQiLCBvdXRwdXQsIHN0cmVhbVR5cGUsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBBTE9HRSgiZ2V0RnJhbWVDb3VudChvdXRwdXQ9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RhdHVzKTsKKyAgICAgICAgZ290byByZWxlYXNlOwogICAgIH0KIAogICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgc3RyZWFtVHlwZSwgJmFmU2FtcGxlUmF0ZSk7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShvdXRwdXQsICZhZlNhbXBsZVJhdGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImdldFNhbXBsaW5nUmF0ZShvdXRwdXQ9JWQsIHN0cmVhbVR5cGU9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RyZWFtVHlwZSwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIEFMT0dFKCJnZXRTYW1wbGluZ1JhdGUob3V0cHV0PSVkKSBzdGF0dXMgJWQiLCBvdXRwdXQsIHN0YXR1cyk7CisgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICB9CiAKICAgICAvLyBDbGllbnQgZGVjaWRlcyB3aGV0aGVyIHRoZSB0cmFjayBpcyBUSU1FRCAoc2VlIGJlbG93KSwgYnV0IGNhbiBvbmx5IGV4cHJlc3MgYSBwcmVmZXJlbmNlCiAgICAgLy8gZm9yIEZBU1QuICBTZXJ2ZXIgd2lsbCBwZXJmb3JtIGFkZGl0aW9uYWwgdGVzdHMuCi0gICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpICYmICEoCisgICAgaWYgKChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSAmJiAhKCgKICAgICAgICAgICAgIC8vIGVpdGhlciBvZiB0aGVzZSB1c2UgY2FzZXM6CiAgICAgICAgICAgICAvLyB1c2UgY2FzZSAxOiBzaGFyZWQgYnVmZmVyCi0gICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApIHx8Ci0gICAgICAgICAgICAvLyB1c2UgY2FzZSAyOiBjYWxsYmFjayBoYW5kbGVyCi0gICAgICAgICAgICAobUNiZiAhPSBOVUxMKSkpIHsKKyAgICAgICAgICAgIChtU2hhcmVkQnVmZmVyICE9IDApIHx8CisgICAgICAgICAgICAvLyB1c2UgY2FzZSAyOiBjYWxsYmFjayB0cmFuc2ZlciBtb2RlCisgICAgICAgICAgICAobVRyYW5zZmVyID09IFRSQU5TRkVSX0NBTExCQUNLKSkgJiYKKyAgICAgICAgICAgIC8vIG1hdGNoaW5nIHNhbXBsZSByYXRlCisgICAgICAgICAgICAobVNhbXBsZVJhdGUgPT0gYWZTYW1wbGVSYXRlKSkpIHsKICAgICAgICAgQUxPR1coIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCIpOwogICAgICAgICAvLyBvbmNlIGRlbmllZCwgZG8gbm90IHJlcXVlc3QgYWdhaW4gaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZAotICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKGZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwotICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwogICAgIH0KICAgICBBTE9HVigiY3JlYXRlVHJhY2tfbCgpIG91dHB1dCAlZCBhZkxhdGVuY3kgJWQiLCBvdXRwdXQsIGFmTGF0ZW5jeSk7CiAKQEAgLTkwNCw2NCArOTg1LDcwIEBACiAgICAgLy8gIG4gPSAzICAgbm9ybWFsIHRyYWNrLCB3aXRoIHNhbXBsZSByYXRlIGNvbnZlcnNpb24KICAgICAvLyAgICAgICAgICAocGVzc2ltaXN0aWM7IHNvbWUgbm9uLTE6MSBjb252ZXJzaW9uIHJhdGlvcyBkb24ndCBhY3R1YWxseSBuZWVkIHRyaXBsZS1idWZmZXJpbmcpCiAgICAgLy8gIG4gPiAzICAgdmVyeSBoaWdoIGxhdGVuY3kgb3IgdmVyeSBzbWFsbCBub3RpZmljYXRpb24gaW50ZXJ2YWw7IG5CdWZmZXJpbmcgaXMgaWdub3JlZAotICAgIGNvbnN0IHVpbnQzMl90IG5CdWZmZXJpbmcgPSAoc2FtcGxlUmF0ZSA9PSBhZlNhbXBsZVJhdGUpID8gMiA6IDM7CisgICAgY29uc3QgdWludDMyX3QgbkJ1ZmZlcmluZyA9IChtU2FtcGxlUmF0ZSA9PSBhZlNhbXBsZVJhdGUpID8gMiA6IDM7CiAKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsKIAotICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBtUmVxRnJhbWVDb3VudDsKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKIAotICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKKyAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewogICAgICAgICAgICAgLy8gU2FtZSBjb21tZW50IGFzIGJlbG93IGFib3V0IGlnbm9yaW5nIGZyYW1lQ291bnQgcGFyYW1ldGVyIGZvciBzZXQoKQotICAgICAgICAgICAgZnJhbWVDb3VudCA9IHNoYXJlZEJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1TaGFyZWRCdWZmZXItPnNpemUoKTsKICAgICAgICAgfSBlbHNlIGlmIChmcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBhZkZyYW1lQ291bnQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgIT0gZnJhbWVDb3VudCkgewogICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IGZyYW1lQ291bnQ7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7CisgICAgfSBlbHNlIGlmIChtU2hhcmVkQnVmZmVyICE9IDApIHsKIAogICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgYWxpZ25tZW50IG1hdGNoZXMgY2hhbm5lbCBjb3VudAogICAgICAgICAvLyA4LWJpdCBkYXRhIGluIHNoYXJlZCBtZW1vcnkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgQXVkaW9GbGluZ2VyCi0gICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSAvKiBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCA/IDEgOiAqLyAyOworICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSgKKyAgICAgICAgICAgICAgICBtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgPyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IG1Gb3JtYXQpOworICAgICAgICBpZiAoYWxpZ25tZW50ICYgMSkgeworICAgICAgICAgICAgYWxpZ25tZW50ID0gMTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA+IDEpIHsKICAgICAgICAgICAgIC8vIE1vcmUgdGhhbiAyIGNoYW5uZWxzIGRvZXMgbm90IHJlcXVpcmUgc3Ryb25nZXIgYWxpZ25tZW50IHRoYW4gc3RlcmVvCiAgICAgICAgICAgICBhbGlnbm1lbnQgPDw9IDE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCgoc2l6ZV90KXNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpICYgKGFsaWdubWVudCAtIDEpKSAhPSAwKSB7CisgICAgICAgIGlmICgoKHVpbnRwdHJfdCltU2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgJiAoYWxpZ25tZW50IC0gMSkpICE9IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGJ1ZmZlciBhbGlnbm1lbnQ6IGFkZHJlc3MgJXAsIGNoYW5uZWwgY291bnQgJXUiLAotICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgbUNoYW5uZWxDb3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIG1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byByZWxlYXNlOwogICAgICAgICB9CiAKICAgICAgICAgLy8gV2hlbiBpbml0aWFsaXppbmcgYSBzaGFyZWQgYnVmZmVyIEF1ZGlvVHJhY2sgdmlhIGNvbnN0cnVjdG9ycywKICAgICAgICAgLy8gdGhlcmUncyBubyBmcmFtZUNvdW50IHBhcmFtZXRlci4KICAgICAgICAgLy8gQnV0IHdoZW4gaW5pdGlhbGl6aW5nIGEgc2hhcmVkIGJ1ZmZlciBBdWRpb1RyYWNrIHZpYSBzZXQoKSwKICAgICAgICAgLy8gdGhlcmUgX2lzXyBhIGZyYW1lQ291bnQgcGFyYW1ldGVyLiAgV2Ugc2lsZW50bHkgaWdub3JlIGl0LgotICAgICAgICBmcmFtZUNvdW50ID0gc2hhcmVkQnVmZmVyLT5zaXplKCkvbUNoYW5uZWxDb3VudC9zaXplb2YoaW50MTZfdCk7CisgICAgICAgIGZyYW1lQ291bnQgPSBtU2hhcmVkQnVmZmVyLT5zaXplKCkgLyBtRnJhbWVTaXplQUY7CiAKLSAgICB9IGVsc2UgaWYgKCEoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSkgeworICAgIH0gZWxzZSBpZiAoIShtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSkgewogCiAgICAgICAgIC8vIEZJWE1FIG1vdmUgdGhlc2UgY2FsY3VsYXRpb25zIGFuZCBhc3NvY2lhdGVkIGNoZWNrcyB0byBzZXJ2ZXIKIAogICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgZGVwdGggY292ZXJzIGF0IGxlYXN0IGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kKICAgICAgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBhZkxhdGVuY3kgLyAoKDEwMDAgKiBhZkZyYW1lQ291bnQpL2FmU2FtcGxlUmF0ZSk7Ci0gICAgICAgIEFMT0dWKCJhZkZyYW1lQ291bnQ9JWQsIG1pbkJ1ZkNvdW50PSVkLCBhZlNhbXBsZVJhdGU9JXUsIGFmTGF0ZW5jeT0lZCIsCisgICAgICAgIEFMT0dWKCJhZkZyYW1lQ291bnQ9JXp1LCBtaW5CdWZDb3VudD0lZCwgYWZTYW1wbGVSYXRlPSV1LCBhZkxhdGVuY3k9JWQiLAogICAgICAgICAgICAgICAgIGFmRnJhbWVDb3VudCwgbWluQnVmQ291bnQsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKICAgICAgICAgaWYgKG1pbkJ1ZkNvdW50IDw9IG5CdWZmZXJpbmcpIHsKICAgICAgICAgICAgIG1pbkJ1ZkNvdW50ID0gbkJ1ZmZlcmluZzsKICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gKGFmRnJhbWVDb3VudCpzYW1wbGVSYXRlKm1pbkJ1ZkNvdW50KS9hZlNhbXBsZVJhdGU7Ci0gICAgICAgIEFMT0dWKCJtaW5GcmFtZUNvdW50OiAldSwgYWZGcmFtZUNvdW50PSVkLCBtaW5CdWZDb3VudD0lZCwgc2FtcGxlUmF0ZT0ldSwgYWZTYW1wbGVSYXRlPSV1IgorICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9IGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50ICogdWludDY0X3QobVNhbXBsZVJhdGUpIC8gYWZTYW1wbGVSYXRlOworICAgICAgICBBTE9HVigibWluRnJhbWVDb3VudDogJXp1LCBhZkZyYW1lQ291bnQ9JXp1LCBtaW5CdWZDb3VudD0lZCwgc2FtcGxlUmF0ZT0ldSwgYWZTYW1wbGVSYXRlPSV1IgogICAgICAgICAgICAgICAgICIsIGFmTGF0ZW5jeT0lZCIsCi0gICAgICAgICAgICAgICAgbWluRnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBtaW5CdWZDb3VudCwgc2FtcGxlUmF0ZSwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOworICAgICAgICAgICAgICAgIG1pbkZyYW1lQ291bnQsIGFmRnJhbWVDb3VudCwgbWluQnVmQ291bnQsIG1TYW1wbGVSYXRlLCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CiAKICAgICAgICAgaWYgKGZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7CiAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVDb3VudCA8IG1pbkZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIC8vIG5vdCBBTE9HVyBiZWNhdXNlIGl0IGhhcHBlbnMgYWxsIHRoZSB0aW1lIHdoZW4gcGxheWluZyBrZXkgY2xpY2tzIG92ZXIgQTJEUAotICAgICAgICAgICAgQUxPR1YoIk1pbmltdW0gYnVmZmVyIHNpemUgY29ycmVjdGVkIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgQUxPR1YoIk1pbmltdW0gYnVmZmVyIHNpemUgY29ycmVjdGVkIGZyb20gJXp1IHRvICV6dSIsCiAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtaW5GcmFtZUNvdW50KTsKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OwogICAgICAgICB9CkBAIC05ODAsNDIgKzEwNjcsNTggQEAKICAgICB9CiAKICAgICBwaWRfdCB0aWQgPSAtMTsKLSAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgdHJhY2tGbGFncyB8PSBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOwogICAgICAgICBpZiAobUF1ZGlvVHJhY2tUaHJlYWQgIT0gMCkgewogICAgICAgICAgICAgdGlkID0gbUF1ZGlvVHJhY2tUaHJlYWQtPmdldFRpZCgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgeworICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7CiAgICAgICAgIHRyYWNrRmxhZ3MgfD0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfT0ZGTE9BRDsKICAgICB9CiAKLSAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2sgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZVRyYWNrKHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgdHJhY2tGbGFncyB8PSBJQXVkaW9GbGluZ2VyOjpUUkFDS19ESVJFQ1Q7CisgICAgfQorCisgICAgc2l6ZV90IHRlbXAgPSBmcmFtZUNvdW50OyAgIC8vIHRlbXAgbWF5IGJlIHJlcGxhY2VkIGJ5IGEgcmV2aXNlZCB2YWx1ZSBvZiBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2Ugd2lsbCBzdGlsbCBuZWVkIHRoZSBvcmlnaW5hbCB2YWx1ZSBhbHNvCisgICAgc3A8SUF1ZGlvVHJhY2s+IHRyYWNrID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVUcmFjayhtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyIG9ubHkgc2VlcyAxNi1iaXQgUENNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIDogZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBtRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKIAotICAgIGlmICh0cmFjayA9PSAwKSB7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQiLCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQorICAgIEFMT0dfQVNTRVJUKHRyYWNrICE9IDApOworCisgICAgLy8gQXVkaW9GbGluZ2VyIG5vdyBvd25zIHRoZSByZWZlcmVuY2UgdG8gdGhlIEkvTyBoYW5kbGUsCisgICAgLy8gc28gd2UgYXJlIG5vIGxvbmdlciByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIGl0LgorCiAgICAgc3A8SU1lbW9yeT4gaU1lbSA9IHRyYWNrLT5nZXRDYmxrKCk7CiAgICAgaWYgKGlNZW0gPT0gMCkgewogICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKyAgICB2b2lkICppTWVtUG9pbnRlciA9IGlNZW0tPnBvaW50ZXIoKTsKKyAgICBpZiAoaU1lbVBvaW50ZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1RyYWNrICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKICAgICAgICAgbUF1ZGlvVHJhY2stPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwpAQCAtMTAyMywyMiArMTEyNiwyNSBAQAogICAgIH0KICAgICBtQXVkaW9UcmFjayA9IHRyYWNrOwogICAgIG1DYmxrTWVtb3J5ID0gaU1lbTsKLSAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QqPihpTWVtLT5wb2ludGVyKCkpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKworICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGlNZW1Qb2ludGVyKTsKICAgICBtQ2JsayA9IGNibGs7Ci0gICAgc2l6ZV90IHRlbXAgPSBjYmxrLT5mcmFtZUNvdW50XzsKKyAgICAvLyBub3RlIHRoYXQgdGVtcCBpcyB0aGUgKHBvc3NpYmx5IHJldmlzZWQpIHZhbHVlIG9mIGZyYW1lQ291bnQKICAgICBpZiAodGVtcCA8IGZyYW1lQ291bnQgfHwgKGZyYW1lQ291bnQgPT0gMCAmJiB0ZW1wID09IDApKSB7CiAgICAgICAgIC8vIEluIGN1cnJlbnQgZGVzaWduLCBBdWRpb1RyYWNrIGNsaWVudCBjaGVja3MgYW5kIGVuc3VyZXMgZnJhbWUgY291bnQgdmFsaWRpdHkgYmVmb3JlCiAgICAgICAgIC8vIHBhc3NpbmcgaXQgdG8gQXVkaW9GbGluZ2VyIHNvIEF1ZGlvRmxpbmdlciBzaG91bGQgbm90IHJldHVybiBhIGRpZmZlcmVudCB2YWx1ZSBleGNlcHQKICAgICAgICAgLy8gZm9yIGZhc3QgdHJhY2sgYXMgaXQgdXNlcyBhIHNwZWNpYWwgbWV0aG9kIG9mIGFzc2lnbmluZyBmcmFtZSBjb3VudC4KLSAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBmcmFtZUNvdW50ICV1IGJ1dCByZWNlaXZlZCBmcmFtZUNvdW50ICV1IiwgZnJhbWVDb3VudCwgdGVtcCk7CisgICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgZnJhbWVDb3VudCAlenUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCwgdGVtcCk7CiAgICAgfQogICAgIGZyYW1lQ291bnQgPSB0ZW1wOworCiAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKLSAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgaWYgKHRyYWNrRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7Ci0gICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV1IiwgZnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQpOwogICAgICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwotICAgICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlb3JldGljYWxseSBkb3VibGUtYnVmZmVyaW5nIGlzIG5vdCByZXF1aXJlZCBmb3IgZmFzdCB0cmFja3MsCiAgICAgICAgICAgICAgICAgLy8gZHVlIHRvIHRpZ2h0ZXIgc2NoZWR1bGluZy4gIEJ1dCBpbiBwcmFjdGljZSwgdG8gYWNjb21tb2RhdGUga2VybmVscyB3aXRoCiAgICAgICAgICAgICAgICAgLy8gc2NoZWR1bGluZyBqaXR0ZXIsIGFuZCBhcHBzIHdpdGggY29tcHV0YXRpb24gaml0dGVyLCB3ZSB1c2UgZG91YmxlLWJ1ZmZlcmluZy4KQEAgLTEwNDcsMjggKzExNTMsMzkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV1IiwgZnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQpOwogICAgICAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgeworICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOworICAgICAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID09IDAgfHwgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA+IGZyYW1lQ291bnQvbkJ1ZmZlcmluZykgewogICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gZnJhbWVDb3VudC9uQnVmZmVyaW5nOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKICAgICAgICAgaWYgKHRyYWNrRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19PRkZMT0FEKSB7CiAgICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfT0ZGTE9BRCBzdWNjZXNzZnVsIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfT0ZGTE9BRCBkZW5pZWQgYnkgc2VydmVyIik7Ci0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKGZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOwotICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKKyAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgaXMgYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IsIHNvIGRvbid0IHJldHVybiBlcnJvciBzdGF0dXMKKyAgICAgICAgICAgIC8vcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICBpZiAodHJhY2tGbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RJUkVDVCkgeworICAgICAgICAgICAgQUxPR1YoIkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCBzdWNjZXNzZnVsIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIGRlbmllZCBieSBzZXJ2ZXIiKTsKKyAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBpcyBhIHdhcm5pbmcsIG5vdCBhbiBlcnJvciwgc28gZG9uJ3QgcmV0dXJuIGVycm9yIHN0YXR1cworICAgICAgICAgICAgLy9yZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFdlIHJldGFpbiBhIGNvcHkgb2YgdGhlIEkvTyBoYW5kbGUsIGJ1dCBkb24ndCBvd24gdGhlIHJlZmVyZW5jZQorICAgIG1PdXRwdXQgPSBvdXRwdXQ7CiAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwogCiAgICAgLy8gU3RhcnRpbmcgYWRkcmVzcyBvZiBidWZmZXJzIGluIHNoYXJlZCBtZW1vcnkuICBJZiB0aGVyZSBpcyBhIHNoYXJlZCBidWZmZXIsIGJ1ZmZlcnMKQEAgLTEwNzYsMTUgKzExOTMsMTYgQEAKICAgICAvLyBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29udHJvbCBibG9jay4gIFRoaXMgYWRkcmVzcyBpcyBmb3IgdGhlIG1hcHBpbmcgd2l0aGluIGNsaWVudAogICAgIC8vIGFkZHJlc3Mgc3BhY2UuICBBdWRpb0ZsaW5nZXI6OlRyYWNrQmFzZTo6bUJ1ZmZlciBpcyBmb3IgdGhlIHNlcnZlciBhZGRyZXNzIHNwYWNlLgogICAgIHZvaWQqIGJ1ZmZlcnM7Ci0gICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICBidWZmZXJzID0gKGNoYXIqKWNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICB9IGVsc2UgewotICAgICAgICBidWZmZXJzID0gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCk7CisgICAgICAgIGJ1ZmZlcnMgPSBtU2hhcmVkQnVmZmVyLT5wb2ludGVyKCk7CiAgICAgfQogCiAgICAgbUF1ZGlvVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQpOwogICAgIC8vIEZJWE1FIGRvbid0IGJlbGlldmUgdGhpcyBsaWUKLSAgICBtTGF0ZW5jeSA9IGFmTGF0ZW5jeSArICgxMDAwKmZyYW1lQ291bnQpIC8gc2FtcGxlUmF0ZTsKKyAgICBtTGF0ZW5jeSA9IGFmTGF0ZW5jeSArICgxMDAwKmZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CisKICAgICBtRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgLy8gSWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgZG9uJ3QgbGV0IHRoZSByZXF1ZXN0ZWQgZnJhbWVDb3VudAogICAgIC8vIGRlY3JlYXNlLiAgVGhpcyBjYW4gY29uZnVzZSBjbGllbnRzIHRoYXQgY2FjaGUgZnJhbWVDb3VudCgpLgpAQCAtMTA5MywyNCArMTIxMSwzMCBAQAogICAgIH0KIAogICAgIC8vIHVwZGF0ZSBwcm94eQotICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgeworICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDApIHsKICAgICAgICAgbVN0YXRpY1Byb3h5LmNsZWFyKCk7CiAgICAgICAgIG1Qcm94eSA9IG5ldyBBdWRpb1RyYWNrQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZUFGKTsKICAgICB9IGVsc2UgewogICAgICAgICBtU3RhdGljUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIG1GcmFtZVNpemVBRik7CiAgICAgICAgIG1Qcm94eSA9IG1TdGF0aWNQcm94eTsKICAgICB9Ci0gICAgbVByb3h5LT5zZXRWb2x1bWVMUigodWludDMyX3QodWludDE2X3QobVZvbHVtZVtSSUdIVF0gKiAweDEwMDApKSA8PCAxNikgfAotICAgICAgICAgICAgdWludDE2X3QobVZvbHVtZVtMRUZUXSAqIDB4MTAwMCkpOworICAgIG1Qcm94eS0+c2V0Vm9sdW1lTFIoR0FJTl9NSU5JRkxPQVRfUEFDS0VEX1VOSVRZKTsKICAgICBtUHJveHktPnNldFNlbmRMZXZlbChtU2VuZExldmVsKTsKICAgICBtUHJveHktPnNldFNhbXBsZVJhdGUobVNhbXBsZVJhdGUpOwotICAgIG1Qcm94eS0+c2V0RXBvY2goZXBvY2gpOwogICAgIG1Qcm94eS0+c2V0TWluaW11bShtTm90aWZpY2F0aW9uRnJhbWVzQWN0KTsKIAogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcyk7CiAgICAgbUF1ZGlvVHJhY2stPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKK3JlbGVhc2U6CisgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQob3V0cHV0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBpbnQzMl90IHdhaXRDb3VudCkKQEAgLTEyMzEsNiArMTM1NSw3IEBACiAgICAgYnVmZmVyLm1SYXcgPSBhdWRpb0J1ZmZlci0+cmF3OwogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIG1SZWxlYXNlZCArPSBzdGVwQ291bnQ7CiAgICAgbUluVW5kZXJydW4gPSBmYWxzZTsKICAgICBtUHJveHktPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CiAKQEAgLTEyMzgsOCArMTM2Myw3IEBACiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAgICAgICAgIGlmIChhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRUQsICZjYmxrLT5tRmxhZ3MpICYgQ0JMS19ESVNBQkxFRCkgewotICAgICAgICAgICAgQUxPR1coInJlbGVhc2VCdWZmZXIoKSB0cmFjayAlcCBuYW1lPSVzIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwgdGhpcyk7CiAgICAgICAgICAgICAvLyBGSVhNRSBpZ25vcmluZyBzdGF0dXMKICAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwogICAgICAgICB9CkBAIC0xMjQ4LDE2ICsxMzcyLDI2IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3NpemVfdCBBdWRpb1RyYWNrOjp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCB1c2VyU2l6ZSkKK3NzaXplX3QgQXVkaW9UcmFjazo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgdXNlclNpemUsIGJvb2wgYmxvY2tpbmcpCiB7CiAgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9TWU5DIHx8IG1Jc1RpbWVkKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICBpZiAoaXNEaXJlY3QoKSkgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGludDMyX3QgZmxhZ3MgPSBhbmRyb2lkX2F0b21pY19hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfihDQkxLX1VOREVSUlVOIHwgQ0JMS19MT09QX0NZQ0xFIHwgQ0JMS19MT09QX0ZJTkFMIHwgQ0JMS19CVUZGRVJfRU5EKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNibGstPm1GbGFncyk7CisgICAgICAgIGlmIChmbGFncyAmIENCTEtfSU5WQUxJRCkgeworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKHNzaXplX3QodXNlclNpemUpIDwgMCB8fCAoYnVmZmVyID09IE5VTEwgJiYgdXNlclNpemUgIT0gMCkpIHsKICAgICAgICAgLy8gU2FuaXR5LWNoZWNrOiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCiAgICAgICAgIC8vIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBhbWJpZ3VvdXMgKGFjdHVhbFNpemUgdnMgZXJyb3IpLgotICAgICAgICBBTE9HRSgiQXVkaW9UcmFjazo6d3JpdGUoYnVmZmVyPSVwLCBzaXplPSV1ICglZCkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CisgICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjp3cml0ZShidWZmZXI9JXAsIHNpemU9JXp1ICglemQpIiwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMTI2Nyw3ICsxNDAxLDggQEAKICAgICB3aGlsZSAodXNlclNpemUgPj0gbUZyYW1lU2l6ZSkgewogICAgICAgICBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gdXNlclNpemUgLyBtRnJhbWVTaXplOwogCi0gICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsICZDbGllbnRQcm94eTo6a0ZvcmV2ZXIpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBvYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLAorICAgICAgICAgICAgICAgIGJsb2NraW5nID8gJkNsaWVudFByb3h5OjprRm9yZXZlciA6ICZDbGllbnRQcm94eTo6a05vbkJsb2NraW5nKTsKICAgICAgICAgaWYgKGVyciA8IDApIHsKICAgICAgICAgICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTM2Myw3ICsxNDk4LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1uc2Vjc190IEF1ZGlvVHJhY2s6OnByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxBdWRpb1RyYWNrVGhyZWFkPiYgdGhyZWFkKQorbnNlY3NfdCBBdWRpb1RyYWNrOjpwcm9jZXNzQXVkaW9CdWZmZXIoKQogewogICAgIC8vIEN1cnJlbnRseSB0aGUgQXVkaW9UcmFjayB0aHJlYWQgaXMgbm90IGNyZWF0ZWQgaWYgdGhlcmUgYXJlIG5vIGNhbGxiYWNrcy4KICAgICAvLyBXb3VsZCBpdCBldmVyIG1ha2Ugc2Vuc2UgdG8gcnVuIHRoZSB0aHJlYWQsIGV2ZW4gd2l0aG91dCBjYWxsYmFja3M/CkBAIC0xNDAxLDcgKzE1MzYsNyBAQAogICAgICAgICAvLyBmb3Igb2ZmbG9hZGVkIHRyYWNrcyByZXN0b3JlVHJhY2tfbCgpIHdpbGwganVzdCB1cGRhdGUgdGhlIHNlcXVlbmNlIGFuZCBjbGVhcgogICAgICAgICAvLyBBdWRpb1N5c3RlbSBjYWNoZS4gV2Ugc2hvdWxkIG5vdCBleGl0IGhlcmUgYnV0IGFmdGVyIGNhbGxpbmcgdGhlIGNhbGxiYWNrIHNvCiAgICAgICAgIC8vIHRoYXQgdGhlIHVwcGVyIGxheWVycyBjYW4gcmVjcmVhdGUgdGhlIHRyYWNrCi0gICAgICAgIGlmICghaXNPZmZsb2FkZWQoKSB8fCAobVNlcXVlbmNlID09IG1PYnNlcnZlZFNlcXVlbmNlKSkgeworICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IChtU2VxdWVuY2UgPT0gbU9ic2VydmVkU2VxdWVuY2UpKSB7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZXN0b3JlVHJhY2tfbCgicHJvY2Vzc0F1ZGlvQnVmZmVyIik7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIC8vIFJ1biBhZ2FpbiBpbW1lZGlhdGVseSwgYnV0IHdpdGggYSBuZXcgSUF1ZGlvVHJhY2sKQEAgLTE0MzMsNyArMTU2OCw3IEBACiAgICAgfQogCiAgICAgLy8gR2V0IGN1cnJlbnQgcG9zaXRpb24gb2Ygc2VydmVyCi0gICAgc2l6ZV90IHBvc2l0aW9uID0gbVByb3h5LT5nZXRQb3NpdGlvbigpOworICAgIHNpemVfdCBwb3NpdGlvbiA9IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKIAogICAgIC8vIE1hbmFnZSBtYXJrZXIgY2FsbGJhY2sKICAgICBib29sIG1hcmtlclJlYWNoZWQgPSBmYWxzZTsKQEAgLTE0NTYsNyArMTU5MSw3IEBACiAgICAgLy8gQ2FjaGUgb3RoZXIgZmllbGRzIHRoYXQgd2lsbCBiZSBuZWVkZWQgc29vbgogICAgIHVpbnQzMl90IGxvb3BQZXJpb2QgPSBtTG9vcFBlcmlvZDsKICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7CisgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKICAgICBpZiAobVJlZnJlc2hSZW1haW5pbmcpIHsKICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSBmYWxzZTsKICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcyA9IG5vdGlmaWNhdGlvbkZyYW1lczsKQEAgLTE0OTEsNiArMTYyNiw3IEBACiAgICAgICAgICAgICAgICAgd2FpdFN0cmVhbUVuZCA9IG1TdGF0ZSA9PSBTVEFURV9TVE9QUElORzsKICAgICAgICAgICAgICAgICBpZiAod2FpdFN0cmVhbUVuZCkgewogICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOworICAgICAgICAgICAgICAgICAgICBtUmVsZWFzZWQgPSAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh3YWl0U3RyZWFtRW5kICYmIHN0YXR1cyAhPSBERUFEX09CSkVDVCkgewpAQCAtMTUyNyw3ICsxNjYzLDcgQEAKICAgICAgICAgbU9ic2VydmVkU2VxdWVuY2UgPSBzZXF1ZW5jZTsKICAgICAgICAgbUNiZihFVkVOVF9ORVdfSUFVRElPVFJBQ0ssIG1Vc2VyRGF0YSwgTlVMTCk7CiAgICAgICAgIC8vIGZvciBvZmZsb2FkZWQgdHJhY2tzLCBqdXN0IHdhaXQgZm9yIHRoZSB1cHBlciBsYXllcnMgdG8gcmVjcmVhdGUgdGhlIHRyYWNrCi0gICAgICAgIGlmIChpc09mZmxvYWRlZCgpKSB7CisgICAgICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgICAgIHJldHVybiBOU19JTkFDVElWRTsKICAgICAgICAgfQogICAgIH0KQEAgLTE1ODUsMTAgKzE3MjEsMTAgQEAKICAgICAgICAgc2l6ZV90IG5vbkNvbnRpZzsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMLCAmbm9uQ29udGlnKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoZXJyICE9IE5PX0VSUk9SKSAhPSAoYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSwKLSAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXUgPSAldSArICV1IGVyciAlZCIsCisgICAgICAgIEFMT0dWKCJvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAogICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUIHx8IGVyciA9PSBXT1VMRF9CTE9DSyB8fCBlcnIgPT0gLUVJTlRSIHx8CkBAIC0xNjIwLDEyICsxNzU2LDExIEBACiAgICAgICAgIHNpemVfdCByZXFTaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKICAgICAgICAgbUNiZihFVkVOVF9NT1JFX0RBVEEsIG1Vc2VyRGF0YSwgJmF1ZGlvQnVmZmVyKTsKICAgICAgICAgc2l6ZV90IHdyaXR0ZW5TaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKLSAgICAgICAgc2l6ZV90IHdyaXR0ZW5GcmFtZXMgPSB3cml0dGVuU2l6ZSAvIG1GcmFtZVNpemU7CiAKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHJldHVybmVkIHNpemUKICAgICAgICAgaWYgKHNzaXplX3Qod3JpdHRlblNpemUpIDwgMCB8fCB3cml0dGVuU2l6ZSA+IHJlcVNpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIChpbnQpIHdyaXR0ZW5TaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCJFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgcmVxU2l6ZSwgc3NpemVfdCh3cml0dGVuU2l6ZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKQEAgLTE2ODYsMzcgKzE4MjEsMzEgQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnJlc3RvcmVUcmFja19sKGNvbnN0IGNoYXIgKmZyb20pCiB7CiAgICAgQUxPR1coImRlYWQgSUF1ZGlvVHJhY2ssICVzLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwKLSAgICAgICAgICBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWRlZCIgOiAiUENNIiwgZnJvbSk7CisgICAgICAgICAgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAiT2ZmbG9hZGVkIG9yIERpcmVjdCIgOiAiUENNIiwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAgICAgc3RhdHVzX3QgcmVzdWx0OwogCiAgICAgLy8gcmVmcmVzaCB0aGUgYXVkaW8gY29uZmlndXJhdGlvbiBjYWNoZSBpbiB0aGlzIHByb2Nlc3MgdG8gbWFrZSBzdXJlIHdlIGdldCBuZXcKLSAgICAvLyBvdXRwdXQgcGFyYW1ldGVycyBpbiBnZXRPdXRwdXRfbCgpIGFuZCBjcmVhdGVUcmFja19sKCkKKyAgICAvLyBvdXRwdXQgcGFyYW1ldGVycyBpbiBjcmVhdGVUcmFja19sKCkKICAgICBBdWRpb1N5c3RlbTo6Y2xlYXJBdWRpb0NvbmZpZ0NhY2hlKCk7CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgeworICAgICAgICAvLyBGSVhNRSByZS1jcmVhdGlvbiBvZiBvZmZsb2FkZWQgdHJhY2tzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KIAotICAgIC8vIGZvcmNlIG5ldyBvdXRwdXQgcXVlcnkgZnJvbSBhdWRpbyBwb2xpY3kgbWFuYWdlcjsKLSAgICBtT3V0cHV0ID0gMDsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXRfbCgpOworICAgIC8vIHNhdmUgdGhlIG9sZCBzdGF0aWMgYnVmZmVyIHBvc2l0aW9uCisgICAgc2l6ZV90IGJ1ZmZlclBvc2l0aW9uID0gbVN0YXRpY1Byb3h5ICE9IE5VTEwgPyBtU3RhdGljUHJveHktPmdldEJ1ZmZlclBvc2l0aW9uKCkgOiAwOwogCi0gICAgLy8gaWYgdGhlIG5ldyBJQXVkaW9UcmFjayBpcyBjcmVhdGVkLCBjcmVhdGVUcmFja19sKCkgd2lsbCBtb2RpZnkgdGhlCisgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGNyZWF0ZVRyYWNrX2woKSB3aWxsIG1vZGlmeSB0aGUKICAgICAvLyBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlczogbUF1ZGlvVHJhY2ssIG1DYmxrTWVtb3J5IGFuZCBtQ2Jsay4KLSAgICAvLyBJdCB3aWxsIGFsc28gZGVsZXRlIHRoZSBzdHJvbmcgcmVmZXJlbmNlcyBvbiBwcmV2aW91cyBJQXVkaW9UcmFjayBhbmQgSU1lbW9yeQorICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1RyYWNrIGFuZCBJTWVtb3J5LgorICAgIC8vIElmIGEgbmV3IElBdWRpb1RyYWNrIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgcHJldmlvdXMgKGRlYWQpIGluc3RhbmNlIHdpbGwgYmUgbGVmdCBpbnRhY3QuCisgICAgcmVzdWx0ID0gY3JlYXRlVHJhY2tfbCgpOwogCiAgICAgLy8gdGFrZSB0aGUgZnJhbWVzIHRoYXQgd2lsbCBiZSBsb3N0IGJ5IHRyYWNrIHJlY3JlYXRpb24gaW50byBhY2NvdW50IGluIHNhdmVkIHBvc2l0aW9uCi0gICAgc2l6ZV90IHBvc2l0aW9uID0gbVByb3h5LT5nZXRQb3NpdGlvbigpICsgbVByb3h5LT5nZXRGcmFtZXNGaWxsZWQoKTsKLSAgICBzaXplX3QgYnVmZmVyUG9zaXRpb24gPSBtU3RhdGljUHJveHkgIT0gTlVMTCA/IG1TdGF0aWNQcm94eS0+Z2V0QnVmZmVyUG9zaXRpb24oKSA6IDA7Ci0gICAgcmVzdWx0ID0gY3JlYXRlVHJhY2tfbChtU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCAgLy8gc28gdGhhdCBmcmFtZSBjb3VudCBuZXZlciBnb2VzIGRvd24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiAvKmVwb2NoKi8pOworICAgICh2b2lkKSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCk7CisgICAgbVBvc2l0aW9uID0gbVJlbGVhc2VkOwogCiAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICAvLyBjb250aW51ZSBwbGF5YmFjayBmcm9tIGxhc3Qga25vd24gcG9zaXRpb24sIGJ1dApAQCAtMTc0NCwxNyArMTg3MywzNSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgLy9Vc2Ugb2YgZGlyZWN0IGFuZCBvZmZsb2FkZWQgb3V0cHV0IHN0cmVhbXMgaXMgcmVmIGNvdW50ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIuCi0gICAgICAgIC8vIEFzIGdldE91dHB1dCB3YXMgY2FsbGVkIGFib3ZlIGFuZCByZXN1bHRlZCBpbiBhbiBvdXRwdXQgc3RyZWFtIHRvIGJlIG9wZW5lZCwKLSAgICAgICAgLy8gd2UgbmVlZCB0byByZWxlYXNlIGl0LgotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChvdXRwdXQpOwogICAgICAgICBBTE9HVygicmVzdG9yZVRyYWNrX2woKSBmYWlsZWQgc3RhdHVzICVkIiwgcmVzdWx0KTsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgbVJlbGVhc2VkID0gMDsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCit1aW50MzJfdCBBdWRpb1RyYWNrOjp1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCkKK3sKKyAgICAvLyBUaGlzIGlzIHRoZSBzb2xlIHBsYWNlIHRvIHJlYWQgc2VydmVyIGNvbnN1bWVkIGZyYW1lcworICAgIHVpbnQzMl90IG5ld1NlcnZlciA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKTsKKyAgICBpbnQzMl90IGRlbHRhID0gbmV3U2VydmVyIC0gbVNlcnZlcjsKKyAgICBtU2VydmVyID0gbmV3U2VydmVyOworICAgIC8vIFRPRE8gVGhlcmUgaXMgY29udHJvdmVyc3kgYWJvdXQgd2hldGhlciB0aGVyZSBjYW4gYmUgIm5lZ2F0aXZlIGppdHRlciIgaW4gc2VydmVyIHBvc2l0aW9uLgorICAgIC8vICAgICAgVGhpcyBzaG91bGQgYmUgaW52ZXN0aWdhdGVkIGZ1cnRoZXIsIGFuZCBpZiBwb3NzaWJsZSwgaXQgc2hvdWxkIGJlIGFkZHJlc3NlZC4KKyAgICAvLyAgICAgIEEgbW9yZSBkZWZpbml0ZSBmYWlsdXJlIG1vZGUgaXMgaW5mcmVxdWVudCBwb2xsaW5nIGJ5IGNsaWVudC4KKyAgICAvLyAgICAgIE9uZSBjb3VsZCBjYWxsICh2b2lkKWdldFBvc2l0aW9uX2woKSBpbiByZWxlYXNlQnVmZmVyKCksCisgICAgLy8gICAgICBzbyBtUmVsZWFzZWQgYW5kIG1Qb3NpdGlvbiBhcmUgYWx3YXlzIGxvY2stc3RlcCBhcyBiZXN0IHBvc3NpYmxlLgorICAgIC8vICAgICAgVGhhdCBzaG91bGQgZW5zdXJlIGRlbHRhIG5ldmVyIGdvZXMgbmVnYXRpdmUgZm9yIGluZnJlcXVlbnQgcG9sbGluZworICAgIC8vICAgICAgdW5sZXNzIHRoZSBzZXJ2ZXIgaGFzIG1vcmUgdGhhbiAyXjMxIGZyYW1lcyBpbiBpdHMgYnVmZmVyLAorICAgIC8vICAgICAgaW4gd2hpY2ggY2FzZSB0aGUgdXNlIG9mIHVpbnQzMl90IGZvciB0aGVzZSBjb3VudGVycyBoYXMgYmlnZ2VyIGlzc3Vlcy4KKyAgICBpZiAoZGVsdGEgPCAwKSB7CisgICAgICAgIEFMT0dFKCJkZXRlY3RlZCBpbGxlZ2FsIHJldHJvZ3JhZGUgbW90aW9uIGJ5IHRoZSBzZXJ2ZXI6IG1TZXJ2ZXIgYWR2YW5jZWQgYnkgJWQiLCBkZWx0YSk7CisgICAgICAgIGRlbHRhID0gMDsKKyAgICB9CisgICAgcmV0dXJuIG1Qb3NpdGlvbiArPSAodWludDMyX3QpIGRlbHRhOworfQorCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpAQCAtMTc2OCwyNiArMTkxNSwxMjggQEAKICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQUNUSVZFICYmIG1TdGF0ZSAhPSBTVEFURV9QQVVTRUQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICBjYXNlIFNUQVRFX0FDVElWRToKKyAgICBjYXNlIFNUQVRFX1BBVVNFRDoKKyAgICAgICAgYnJlYWs7IC8vIGhhbmRsZSBiZWxvdworICAgIGNhc2UgU1RBVEVfRkxVU0hFRDoKKyAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICBjYXNlIFNUQVRFX1NUT1BQSU5HOgorICAgIGNhc2UgU1RBVEVfUEFVU0VEX1NUT1BQSU5HOgorICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkX2woKSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGJyZWFrOyAvLyBvZmZsb2FkZWQgdHJhY2tzIGhhbmRsZWQgYmVsb3cKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIG1TdGF0ZSBpbiBnZXRUaW1lc3RhbXAoKTogJWQiLCBtU3RhdGUpOworICAgICAgICBicmVhazsKICAgICB9CisKKyAgICAvLyBUaGUgcHJlc2VudGVkIGZyYW1lIGNvdW50IG11c3QgYWx3YXlzIGxhZyBiZWhpbmQgdGhlIGNvbnN1bWVkIGZyYW1lIGNvdW50LgorICAgIC8vIFRvIGF2b2lkIGEgcmFjZSwgcmVhZCB0aGUgcHJlc2VudGVkIGZyYW1lcyBmaXJzdC4gIFRoaXMgZW5zdXJlcyB0aGF0IHByZXNlbnRlZCA8PSBjb25zdW1lZC4KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uICs9IG1Qcm94eS0+Z2V0RXBvY2goKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBXT1VMRF9CTE9DSywgImdldFRpbWVzdGFtcCBlcnJvcjolI3giLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKKyAgICAgICAgaWYgKGlzT2ZmbG9hZGVkX2woKSAmJiAobVN0YXRlID09IFNUQVRFX1BBVVNFRCB8fCBtU3RhdGUgPT0gU1RBVEVfUEFVU0VEX1NUT1BQSU5HKSkgeworICAgICAgICAgICAgLy8gdXNlIGNhY2hlZCBwYXVzZWQgcG9zaXRpb24gaW4gY2FzZSBhbm90aGVyIG9mZmxvYWRlZCB0cmFjayBpcyBydW5uaW5nLgorICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9IG1QYXVzZWRQb3NpdGlvbjsKKyAgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYSBwZW5kaW5nIGZsdXNoIG9yIHN0b3AgaGFzIGNvbXBsZXRlZCwgYXMgdGhvc2UgY29tbWFuZHMgbWF5CisgICAgICAgIC8vIGJlIGFzeW5jaHJvbm91cyBvciByZXR1cm4gbmVhciBmaW5pc2guCisgICAgICAgIGlmIChtU3RhcnRVcyAhPSAwICYmIG1TYW1wbGVSYXRlICE9IDApIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga1RpbWVKaXR0ZXJVcyA9IDEwMDAwMDsgLy8gMTAwIG1zCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGsxU2VjVXMgPSAxMDAwMDAwOworCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVOb3cgPSBnZXROb3dVcygpOworCisgICAgICAgICAgICBpZiAodGltZU5vdyA8IG1TdGFydFVzICsgazFTZWNVcykgeyAvLyB3aXRoaW4gZmlyc3Qgc2Vjb25kIG9mIHN0YXJ0aW5nCisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lc3RhbXBUaW1lVXMgPSBjb252ZXJ0VGltZXNwZWNUb1VzKHRpbWVzdGFtcC5tVGltZSk7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFRpbWVVcyA8IG1TdGFydFVzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsgIC8vIHN0YWxlIHRpbWVzdGFtcCB0aW1lLCBvY2N1cnMgYmVmb3JlIHN0YXJ0LgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhVGltZVVzID0gdGltZXN0YW1wVGltZVVzIC0gbVN0YXJ0VXM7CisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVBvc2l0aW9uQnlVcyA9IHRpbWVzdGFtcC5tUG9zaXRpb24gKiAxMDAwMDAwTEwgLyBtU2FtcGxlUmF0ZTsKKworICAgICAgICAgICAgICAgIGlmIChkZWx0YVBvc2l0aW9uQnlVcyA+IGRlbHRhVGltZVVzICsga1RpbWVKaXR0ZXJVcykgeworICAgICAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY291bnRlciBjYW4ndCBjb3VudCBmYXN0ZXIgdGhhbiB0aGUgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHN0YXJ0IHRpbWUuICBJZiBncmVhdGVyLCB0aGVuIHRoYXQgbWVhbnMgd2UgaGF2ZSBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gY29tcGxldGVseSBmbHVzaCBvciBzdG9wIHRoZSBwcmV2aW91cyBwbGF5aW5nIHRyYWNrLgorICAgICAgICAgICAgICAgICAgICBBTE9HVygiaW5jb21wbGV0ZSBmbHVzaCBvciBzdG9wOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRlbHRhVGltZVVzKCVsbGQpIGRlbHRhUG9zaXRpb25VcyglbGxkKSB0c21Qb3NpdGlvbigldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsdGFUaW1lVXMsIChsb25nIGxvbmcpZGVsdGFQb3NpdGlvbkJ5VXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhcnRVcyA9IDA7IC8vIG5vIG5lZWQgdG8gY2hlY2sgYWdhaW4sIHN0YXJ0IHRpbWVzdGFtcCBoYXMgZWl0aGVyIGV4cGlyZWQgb3IgdW5uZWVkZWQuCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBVcGRhdGUgdGhlIG1hcHBpbmcgYmV0d2VlbiBsb2NhbCBjb25zdW1lZCAobVBvc2l0aW9uKSBhbmQgc2VydmVyIGNvbnN1bWVkIChtU2VydmVyKQorICAgICAgICAodm9pZCkgdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpOworICAgICAgICAvLyBTZXJ2ZXIgY29uc3VtZWQgKG1TZXJ2ZXIpIGFuZCBwcmVzZW50ZWQgYm90aCB1c2UgdGhlIHNhbWUgc2VydmVyIHRpbWUgYmFzZSwKKyAgICAgICAgLy8gYW5kIHNlcnZlciBjb25zdW1lZCBpcyBhbHdheXMgPj0gcHJlc2VudGVkLgorICAgICAgICAvLyBUaGUgZGVsdGEgYmV0d2VlbiB0aGVzZSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBidWZmZXIgcGlwZWxpbmUuCisgICAgICAgIC8vIElmIHRoaXMgZGVsdGEgYmV0d2VlbiB0aGVzZSBpcyBncmVhdGVyIHRoYW4gdGhlIGNsaWVudCBwb3NpdGlvbiwgaXQgbWVhbnMgdGhhdAorICAgICAgICAvLyBhY3R1YWxseSBwcmVzZW50ZWQgaXMgc3RpbGwgc3R1Y2sgYXQgdGhlIHN0YXJ0aW5nIGxpbmUgKGZpZ3VyYXRpdmVseSBzcGVha2luZyksCisgICAgICAgIC8vIHdhaXRpbmcgZm9yIHRoZSBmaXJzdCBmcmFtZSB0byBnbyBieS4gIFNvIHdlIGNhbid0IHJlcG9ydCBhIHZhbGlkIHRpbWVzdGFtcCB5ZXQuCisgICAgICAgIGlmICgodWludDMyX3QpIChtU2VydmVyIC0gdGltZXN0YW1wLm1Qb3NpdGlvbikgPiBtUG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICAvLyBDb252ZXJ0IHRpbWVzdGFtcCBwb3NpdGlvbiBmcm9tIHNlcnZlciB0aW1lIGJhc2UgdG8gY2xpZW50IHRpbWUgYmFzZS4KKyAgICAgICAgLy8gVE9ETyBUaGUgZm9sbG93aW5nIGNvZGUgc2hvdWxkIHdvcmsgT0sgbm93IGJlY2F1c2UgdGltZXN0YW1wLm1Qb3NpdGlvbiBpcyAzMi1iaXQuCisgICAgICAgIC8vIEJ1dCBpZiB3ZSBjaGFuZ2UgaXQgdG8gNjQtYml0IHRoZW4gdGhpcyBjb3VsZCBmYWlsLgorICAgICAgICAvLyBJZiAobVBvc2l0aW9uIC0gbVNlcnZlcikgY2FuIGJlIG5lZ2F0aXZlIHRoZW4gc2hvdWxkIHVzZToKKyAgICAgICAgLy8gICAoaW50MzJfdCkobVBvc2l0aW9uIC0gbVNlcnZlcikKKyAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiArPSBtUG9zaXRpb24gLSBtU2VydmVyOworICAgICAgICAvLyBJbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgdG8gZ2V0UG9zaXRpb25fbCgpLCBtUG9zaXRpb24gYW5kCisgICAgICAgIC8vIG1TZXJ2ZXIgYm90aCByZXByZXNlbnQgdGhlIHNhbWUgZnJhbWUgcG9zaXRpb24uICBtUG9zaXRpb24gaXMKKyAgICAgICAgLy8gaW4gY2xpZW50J3MgcG9pbnQgb2YgdmlldywgYW5kIG1TZXJ2ZXIgaXMgaW4gc2VydmVyJ3MgcG9pbnQgb2YKKyAgICAgICAgLy8gdmlldy4gIFNvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbSBpcyB0aGUgImZ1ZGdlIGZhY3RvciIKKyAgICAgICAgLy8gYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciB2aWV3cyBkdWUgdG8gc3RvcCgpIGFuZC9vciBuZXcKKyAgICAgICAgLy8gSUF1ZGlvVHJhY2suICBBbmQgdGltZXN0YW1wLm1Qb3NpdGlvbiBpcyBpbml0aWFsbHkgaW4gc2VydmVyJ3MKKyAgICAgICAgLy8gcG9pbnQgb2Ygdmlldywgc28gd2UgbmVlZCB0byBhcHBseSB0aGUgc2FtZSBmdWRnZSBmYWN0b3IgdG8gaXQuCiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIFN0cmluZzggQXVkaW9UcmFjazo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKQogewotICAgIGlmIChtT3V0cHV0KSB7Ci0gICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhtT3V0cHV0LCBrZXlzKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXQoKTsKKyAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhvdXRwdXQsIGtleXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBTdHJpbmc4OjplbXB0eSgpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9UcmFjazo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0Citib29sIEF1ZGlvVHJhY2s6OmlzT2ZmbG9hZGVkKCkgY29uc3QKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgcmV0dXJuIGlzT2ZmbG9hZGVkX2woKTsKK30KKworYm9vbCBBdWRpb1RyYWNrOjppc0RpcmVjdCgpIGNvbnN0Cit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHJldHVybiBpc0RpcmVjdF9sKCk7Cit9CisKK2Jvb2wgQXVkaW9UcmFjazo6aXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0Cit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHJldHVybiBpc09mZmxvYWRlZE9yRGlyZWN0X2woKTsKK30KKworCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgY29uc3QKIHsKIAogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwpAQCAtMTc5Niw5ICsyMDQ1LDkgQEAKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb1RyYWNrOjpkdW1wXG4iKTsKICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgbVZvbHVtZVswXSwgbVZvbHVtZVsxXSk7CisgICAgICAgICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0sIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0pOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgZm9ybWF0KCVkKSwgY2hhbm5lbCBjb3VudCglZCksIGZyYW1lIGNvdW50KCVkKVxuIiwgbUZvcm1hdCwKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgZm9ybWF0KCVkKSwgY2hhbm5lbCBjb3VudCglZCksIGZyYW1lIGNvdW50KCV6dSlcbiIsIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbENvdW50LCBtRnJhbWVDb3VudCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBzYW1wbGUgcmF0ZSgldSksIHN0YXR1cyglZClcbiIsIG1TYW1wbGVSYXRlLCBtU3RhdHVzKTsKQEAgLTE4MTUsOSArMjA2NCwxNDYgQEAKICAgICByZXR1cm4gbVByb3h5LT5nZXRVbmRlcnJ1bkZyYW1lcygpOwogfQogCit2b2lkIEF1ZGlvVHJhY2s6OnNldEF0dHJpYnV0ZXNGcm9tU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKKyAgICBtQXR0cmlidXRlcy5mbGFncyA9IDB4MDsKKworICAgIHN3aXRjaChzdHJlYW1UeXBlKSB7CisgICAgY2FzZSBBVURJT19TVFJFQU1fREVGQVVMVDoKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKKyAgICAgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX01FRElBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU6CisgICAgICAgIG1BdHRyaWJ1dGVzLmZsYWdzICB8PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQ7CisgICAgICAgIC8vIGludGVuZGVkIGZhbGwgdGhyb3VnaCwgYXR0cmlidXRlcyBpbiBjb21tb24gd2l0aCBTVFJFQU1fU1lTVEVNCisgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX0FMQVJNOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgICAgIG1BdHRyaWJ1dGVzLmZsYWdzIHw9IEFVRElPX0ZMQUdfU0NPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TVFJFQU1fVFRTOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoImludmFsaWQgc3RyZWFtIHR5cGUgJWQgd2hlbiBjb252ZXJ0aW5nIHRvIGF0dHJpYnV0ZXMiLCBzdHJlYW1UeXBlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9UcmFjazo6c2V0U3RyZWFtVHlwZUZyb21BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYWEpIHsKKyAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCisgICAgaWYgKChhYS5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKChhYS5mbGFncyAmIEFVRElPX0ZMQUdfU0NPKSA9PSBBVURJT19GTEFHX1NDTykgeworICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZworICAgIHN3aXRjaCAoYWEudXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICAgICAgLy8gVE9ETyBvbmNlIEF1ZGlvUG9saWN5TWFuYWdlciBmdWxseSBzdXBwb3J0cyBhdWRpb19hdHRyaWJ1dGVzX3QsCisgICAgICAgIC8vICAgcmVtb3ZlIHN0cmVhbSBjaGFuZ2UgYmFzZWQgb24gcGhvbmUgc3RhdGUKKyAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSkgeworICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fUklORzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vLyBGQUxMIFRIUk9VR0gKKyAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9TWVNURU07CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7CisgICAgICAgIHJldHVybjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9EVE1GOworICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgorICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9BTEFSTTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fUklORzsKKyAgICAgICAgcmV0dXJuOworCisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKKyAgICAgICAgcmV0dXJuOworCisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOworICAgIH0KK30KKworYm9vbCBBdWRpb1RyYWNrOjppc1ZhbGlkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnBhYSkgeworICAgIC8vIGhhcyBmbGFncyB0aGF0IG1hcCB0byBhIHN0cmF0ZWd5PworICAgIGlmICgocGFhLT5mbGFncyAmIChBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQgfCBBVURJT19GTEFHX1NDTykpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gaGFzIGtub3duIHVzYWdlPworICAgIHN3aXRjaCAocGFhLT51c2FnZSkgeworICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotdm9pZCBBdWRpb1RyYWNrOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pCit2b2lkIEF1ZGlvVHJhY2s6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKIHsKICAgICBzcDxBdWRpb1RyYWNrPiBhdWRpb1RyYWNrID0gbUF1ZGlvVHJhY2sucHJvbW90ZSgpOwogICAgIGlmIChhdWRpb1RyYWNrICE9IDApIHsKQEAgLTE4NjEsNyArMjI0NywxMCBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbnNlY3NfdCBucyA9IG1SZWNlaXZlci5wcm9jZXNzQXVkaW9CdWZmZXIodGhpcyk7CisgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBuc2Vjc190IG5zID0gbVJlY2VpdmVyLnByb2Nlc3NBdWRpb0J1ZmZlcigpOwogICAgIHN3aXRjaCAobnMpIHsKICAgICBjYXNlIDA6CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMTg3NSw3ICsyMjY0LDcgQEAKICAgICAgICAgbnMgPSAxMDAwMDAwMDAwTEw7CiAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAicHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJWxsZCIsIG5zKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlIiBQUklkNjQsIG5zKTsKICAgICAgICAgcGF1c2VJbnRlcm5hbChucyk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFja1NoYXJlZC5jcHAKaW5kZXggY2FhNzkwMC4uZWVjMDI1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFja1NoYXJlZC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFja1NoYXJlZC5jcHAKQEAgLTE5LDE1ICsxOSwxNSBAQAogCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci1leHRlcm4gIkMiIHsKLSNpbmNsdWRlICIuLi9wcml2YXRlL2Jpb25pY19mdXRleC5oIgotfQorCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGF1ZGlvX3RyYWNrX2NibGtfdDo6YXVkaW9fdHJhY2tfY2Jsa190KCkKLSAgICA6IG1TZXJ2ZXIoMCksIGZyYW1lQ291bnRfKDApLCBtRnV0ZXgoMCksIG1NaW5pbXVtKDApLAotICAgIG1Wb2x1bWVMUigweDEwMDAxMDAwKSwgbVNhbXBsZVJhdGUoMCksIG1TZW5kTGV2ZWwoMCksIG1GbGFncygwKQorICAgIDogbVNlcnZlcigwKSwgbUZ1dGV4KDApLCBtTWluaW11bSgwKSwKKyAgICBtVm9sdW1lTFIoR0FJTl9NSU5JRkxPQVRfUEFDS0VEX1VOSVRZKSwgbVNhbXBsZVJhdGUoMCksIG1TZW5kTGV2ZWwoMCksIG1GbGFncygwKQogewogICAgIG1lbXNldCgmdSwgMCwgc2l6ZW9mKHUpKTsKIH0KQEAgLTEzNCwxMCArMTM0LDE3IEBACiAgICAgICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OwogICAgICAgICAvLyBwaXBlIHNob3VsZCBub3QgYmUgb3ZlcmZ1bGwKICAgICAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewotICAgICAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JWQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKLSAgICAgICAgICAgIG1Jc1NodXRkb3duID0gdHJ1ZTsKLSAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7Ci0gICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIGlmIChtSXNPdXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQsIG1GcmFtZUNvdW50PSV6dSk7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaHV0dGluZyBkb3duIiwgZmlsbGVkLCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgbUlzU2h1dGRvd24gPSB0cnVlOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmb3IgaW5wdXQsIHN5bmMgdXAgb24gb3ZlcnJ1bgorICAgICAgICAgICAgZmlsbGVkID0gMDsKKyAgICAgICAgICAgIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQgPSByZWFyOworICAgICAgICAgICAgKHZvaWQpIGFuZHJvaWRfYXRvbWljX29yKENCTEtfT1ZFUlJVTiwgJmNibGstPm1GbGFncyk7CiAgICAgICAgIH0KICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgZmlsbGluZyBwaXBlIGJleW9uZCB0aGUgbm9taW5hbCBzaXplCiAgICAgICAgIHNpemVfdCBhdmFpbCA9IG1Jc091dCA/IG1GcmFtZUNvdW50IC0gZmlsbGVkIDogZmlsbGVkOwpAQCAtMjAwLDE4ICsyMDcsMTggQEAKICAgICAgICAgICAgIHRzID0gJnJlbWFpbmluZzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0ZBVEFMKCJvYnRhaW5CdWZmZXIoKSB0aW1lb3V0PSVkIiwgdGltZW91dCk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJvYnRhaW5CdWZmZXIoKSB0aW1lb3V0PSVkIiwgdGltZW91dCk7CiAgICAgICAgICAgICB0cyA9IE5VTEw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgewotICAgICAgICAgICAgaW50IHJjOwogICAgICAgICAgICAgaWYgKG1lYXN1cmUgJiYgIWJlZm9yZUlzVmFsaWQpIHsKICAgICAgICAgICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmJlZm9yZSk7CiAgICAgICAgICAgICAgICAgYmVmb3JlSXNWYWxpZCA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcmV0ID0gX19mdXRleF9zeXNjYWxsNCgmY2Jsay0+bUZ1dGV4LAorICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwKICAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FJVF9QUklWQVRFIDogRlVURVhfV0FJVCwgb2xkICYgfkNCTEtfRlVURVhfV0FLRSwgdHMpOwogICAgICAgICAgICAgLy8gdXBkYXRlIHRvdGFsIGVsYXBzZWQgdGltZSBzcGVudCB3YWl0aW5nCiAgICAgICAgICAgICBpZiAobWVhc3VyZSkgewpAQCAtMjMwLDE2ICsyMzcsMTYgQEAKICAgICAgICAgICAgICAgICBiZWZvcmUgPSBhZnRlcjsKICAgICAgICAgICAgICAgICBiZWZvcmVJc1ZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAocmV0KSB7Ci0gICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgIC8vIG5vcm1hbCB3YWtldXAgYnkgc2VydmVyLCBvciBieSBiaW5kZXJEaWVkKCkKLSAgICAgICAgICAgIGNhc2UgLUVXT1VMREJMT0NLOiAgLy8gYmVuaWduIHJhY2UgY29uZGl0aW9uIHdpdGggc2VydmVyCi0gICAgICAgICAgICBjYXNlIC1FSU5UUjogICAgICAgIC8vIHdhaXQgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbCBvciBvdGhlciBzcHVyaW91cyB3YWtldXAKLSAgICAgICAgICAgIGNhc2UgLUVUSU1FRE9VVDogICAgLy8gdGltZS1vdXQgZXhwaXJlZAorICAgICAgICAgICAgc3dpdGNoIChlcnJubykgeworICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgIC8vIG5vcm1hbCB3YWtldXAgYnkgc2VydmVyLCBvciBieSBiaW5kZXJEaWVkKCkKKyAgICAgICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6ICAvLyBiZW5pZ24gcmFjZSBjb25kaXRpb24gd2l0aCBzZXJ2ZXIKKyAgICAgICAgICAgIGNhc2UgRUlOVFI6ICAgICAgICAvLyB3YWl0IHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwgb3Igb3RoZXIgc3B1cmlvdXMgd2FrZXVwCisgICAgICAgICAgICBjYXNlIEVUSU1FRE9VVDogICAgLy8gdGltZS1vdXQgZXhwaXJlZAogICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoZXNlIGVycm9yL25vbi0wIHN0YXR1cyBhcmUgYmVpbmcgZHJvcHBlZAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXMgdW5leHBlY3RlZCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXQpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1yZXQ7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZXJybm87CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHVuZXhwZWN0ZWQgZXJyb3IgJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3Ioc3RhdHVzKSk7CiAgICAgICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI5NSw3ICszMDIsNyBAQAogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIGlmICghKGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRCwgJmNibGstPm1GbGFncykgJiBDQkxLX0lOVkFMSUQpKSB7CiAgICAgICAgIC8vIGl0IHNlZW1zIHRoYXQgYSBGVVRFWF9XQUtFX1BSSVZBVEUgd2lsbCBub3Qgd2FrZSBhIEZVVEVYX1dBSVQsIGV2ZW4gd2l0aGluIHNhbWUgcHJvY2VzcwotICAgICAgICAodm9pZCkgX19mdXRleF9zeXNjYWxsMygmY2Jsay0+bUZ1dGV4LCBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLAorICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LCBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLAogICAgICAgICAgICAgICAgIDEpOwogICAgIH0KIH0KQEAgLTMwNCw3ICszMTEsNyBAQAogewogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIGlmICghKGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5URVJSVVBULCAmY2Jsay0+bUZsYWdzKSAmIENCTEtfSU5URVJSVVBUKSkgewotICAgICAgICAodm9pZCkgX19mdXRleF9zeXNjYWxsMygmY2Jsay0+bUZ1dGV4LCBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLAorICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LCBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLAogICAgICAgICAgICAgICAgIDEpOwogICAgIH0KIH0KQEAgLTMzMSw3ICszMzgsNyBAQAogICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBiZSBvdmVyZnVsbAogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JWQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKKyAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JXpkKTsgc2h1dHRpbmcgZG93biIsIGZpbGxlZCk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICByZXR1cm4gKHNpemVfdClmaWxsZWQ7CkBAIC00MjksMjQgKzQzNiwyNCBAQAogICAgICAgICAgICAgdHMgPSAmcmVtYWluaW5nOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfRkFUQUwoIndhaXRTdHJlYW1FbmREb25lKCkgdGltZW91dD0lZCIsIHRpbWVvdXQpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgid2FpdFN0cmVhbUVuZERvbmUoKSB0aW1lb3V0PSVkIiwgdGltZW91dCk7CiAgICAgICAgICAgICB0cyA9IE5VTEw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgewotICAgICAgICAgICAgaW50IHJjOwotICAgICAgICAgICAgaW50IHJldCA9IF9fZnV0ZXhfc3lzY2FsbDQoJmNibGstPm1GdXRleCwKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsCiAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBSVRfUFJJVkFURSA6IEZVVEVYX1dBSVQsIG9sZCAmIH5DQkxLX0ZVVEVYX1dBS0UsIHRzKTsKLSAgICAgICAgICAgIHN3aXRjaCAocmV0KSB7Ci0gICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgIC8vIG5vcm1hbCB3YWtldXAgYnkgc2VydmVyLCBvciBieSBiaW5kZXJEaWVkKCkKLSAgICAgICAgICAgIGNhc2UgLUVXT1VMREJMT0NLOiAgLy8gYmVuaWduIHJhY2UgY29uZGl0aW9uIHdpdGggc2VydmVyCi0gICAgICAgICAgICBjYXNlIC1FSU5UUjogICAgICAgIC8vIHdhaXQgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbCBvciBvdGhlciBzcHVyaW91cyB3YWtldXAKLSAgICAgICAgICAgIGNhc2UgLUVUSU1FRE9VVDogICAgLy8gdGltZS1vdXQgZXhwaXJlZAorICAgICAgICAgICAgc3dpdGNoIChlcnJubykgeworICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgIC8vIG5vcm1hbCB3YWtldXAgYnkgc2VydmVyLCBvciBieSBiaW5kZXJEaWVkKCkKKyAgICAgICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6ICAvLyBiZW5pZ24gcmFjZSBjb25kaXRpb24gd2l0aCBzZXJ2ZXIKKyAgICAgICAgICAgIGNhc2UgRUlOVFI6ICAgICAgICAvLyB3YWl0IHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwgb3Igb3RoZXIgc3B1cmlvdXMgd2FrZXVwCisgICAgICAgICAgICBjYXNlIEVUSU1FRE9VVDogICAgLy8gdGltZS1vdXQgZXhwaXJlZAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXMgdW5leHBlY3RlZCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXQpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1yZXQ7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZXJybm87CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHVuZXhwZWN0ZWQgZXJyb3IgJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3Ioc3RhdHVzKSk7CiAgICAgICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ3MCwxNCArNDc3LDE5IEBACiAKIHZvaWQgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5OjpmbHVzaCgpCiB7Ci0gICAgTE9HX0ZBVEFMKCJzdGF0aWMgZmx1c2giKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzdGF0aWMgZmx1c2giKTsKIH0KIAogdm9pZCBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHk6OnNldExvb3Aoc2l6ZV90IGxvb3BTdGFydCwgc2l6ZV90IGxvb3BFbmQsIGludCBsb29wQ291bnQpCiB7CisgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gb24gYSA2NC1iaXQgY2xpZW50CisgICAgaWYgKGxvb3BTdGFydCA+IFVJTlQzMl9NQVggfHwgbG9vcEVuZCA+IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgLy8gRklYTUUgU2hvdWxkIHJldHVybiBhbiBlcnJvciBzdGF0dXMKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgbmV3U3RhdGU7Ci0gICAgbmV3U3RhdGUubUxvb3BTdGFydCA9IGxvb3BTdGFydDsKLSAgICBuZXdTdGF0ZS5tTG9vcEVuZCA9IGxvb3BFbmQ7CisgICAgbmV3U3RhdGUubUxvb3BTdGFydCA9ICh1aW50MzJfdCkgbG9vcFN0YXJ0OworICAgIG5ld1N0YXRlLm1Mb29wRW5kID0gKHVpbnQzMl90KSBsb29wRW5kOwogICAgIG5ld1N0YXRlLm1Mb29wQ291bnQgPSBsb29wQ291bnQ7CiAgICAgbUJ1ZmZlclBvc2l0aW9uID0gbG9vcFN0YXJ0OwogICAgICh2b2lkKSBtTXV0YXRvci5wdXNoKG5ld1N0YXRlKTsKQEAgLTQ4Nyw3ICs0OTksNyBAQAogewogICAgIHNpemVfdCBidWZmZXJQb3NpdGlvbjsKICAgICBpZiAobU11dGF0b3IuYWNrKCkpIHsKLSAgICAgICAgYnVmZmVyUG9zaXRpb24gPSBtQ2Jsay0+dS5tU3RhdGljLm1CdWZmZXJQb3NpdGlvbjsKKyAgICAgICAgYnVmZmVyUG9zaXRpb24gPSAoc2l6ZV90KSBtQ2Jsay0+dS5tU3RhdGljLm1CdWZmZXJQb3NpdGlvbjsKICAgICAgICAgaWYgKGJ1ZmZlclBvc2l0aW9uID4gbUZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gbUZyYW1lQ291bnQ7CiAgICAgICAgIH0KQEAgLTUzMCw3ICs1NDIsNyBAQAogICAgICAgICAgICAgaWYgKGZyb250ICE9IHJlYXIpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX29yKENCTEtfRlVURVhfV0FLRSwgJmNibGstPm1GdXRleCk7CiAgICAgICAgICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgewotICAgICAgICAgICAgICAgICAgICAodm9pZCkgX19mdXRleF9zeXNjYWxsMygmY2Jsay0+bUZ1dGV4LAorICAgICAgICAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsIDEpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU0Myw3ICs1NTUsNyBAQAogICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBhbHJlYWR5IGJlIG92ZXJmdWxsCiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewotICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lZCk7IHNodXR0aW5nIGRvd24iLCBmaWxsZWQpOworICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKICAgICAgICAgbUlzU2h1dGRvd24gPSB0cnVlOwogICAgIH0KICAgICBpZiAobUlzU2h1dGRvd24pIHsKQEAgLTYxNiwxMyArNjI4LDEzIEBACiAgICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoc3RlcENvdW50ICsgcmVhciwgJmNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CiAgICAgfQogCi0gICAgbUNibGstPm1TZXJ2ZXIgKz0gc3RlcENvdW50OworICAgIGNibGstPm1TZXJ2ZXIgKz0gc3RlcENvdW50OwogCiAgICAgc2l6ZV90IGhhbGYgPSBtRnJhbWVDb3VudCAvIDI7CiAgICAgaWYgKGhhbGYgPT0gMCkgewogICAgICAgICBoYWxmID0gMTsKICAgICB9Ci0gICAgc2l6ZV90IG1pbmltdW0gPSBjYmxrLT5tTWluaW11bTsKKyAgICBzaXplX3QgbWluaW11bSA9IChzaXplX3QpIGNibGstPm1NaW5pbXVtOwogICAgIGlmIChtaW5pbXVtID09IDApIHsKICAgICAgICAgbWluaW11bSA9IG1Jc091dCA/IGhhbGYgOiAxOwogICAgIH0gZWxzZSBpZiAobWluaW11bSA+IGhhbGYpIHsKQEAgLTYzMCwxMCArNjQyLDEwIEBACiAgICAgfQogICAgIC8vIEZJWE1FIEF1ZGlvUmVjb3JkIHdha2V1cCBuZWVkcyB0byBiZSBvcHRpbWl6ZWQ7IGl0IGN1cnJlbnRseSB3YWtlcyB1cCBjbGllbnQgZXZlcnkgdGltZQogICAgIGlmICghbUlzT3V0IHx8IChtQXZhaWxUb0NsaWVudCArIHN0ZXBDb3VudCA+PSBtaW5pbXVtKSkgewotICAgICAgICBBTE9HVigibUF2YWlsVG9DbGllbnQ9JXUgc3RlcENvdW50PSV1IG1pbmltdW09JXUiLCBtQXZhaWxUb0NsaWVudCwgc3RlcENvdW50LCBtaW5pbXVtKTsKKyAgICAgICAgQUxPR1YoIm1BdmFpbFRvQ2xpZW50PSV6dSBzdGVwQ291bnQ9JXp1IG1pbmltdW09JXp1IiwgbUF2YWlsVG9DbGllbnQsIHN0ZXBDb3VudCwgbWluaW11bSk7CiAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgewotICAgICAgICAgICAgKHZvaWQpIF9fZnV0ZXhfc3lzY2FsbDMoJmNibGstPm1GdXRleCwKKyAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsCiAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsIDEpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjYzLDcgKzY3NSw3IEBACiAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKICAgICAvLyBwaXBlIHNob3VsZCBub3QgYWxyZWFkeSBiZSBvdmVyZnVsbAogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JWQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKKyAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JXpkKTsgc2h1dHRpbmcgZG93biIsIGZpbGxlZCk7CiAgICAgICAgIG1Jc1NodXRkb3duID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtNjc0LDEwICs2ODYsMTEgQEAKIH0KIAogYm9vbCAgQXVkaW9UcmFja1NlcnZlclByb3h5OjpzZXRTdHJlYW1FbmREb25lKCkgeworICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIGJvb2wgb2xkID0KLSAgICAgICAgICAgIChhbmRyb2lkX2F0b21pY19vcihDQkxLX1NUUkVBTV9FTkRfRE9ORSwgJm1DYmxrLT5tRmxhZ3MpICYgQ0JMS19TVFJFQU1fRU5EX0RPTkUpICE9IDA7CisgICAgICAgICAgICAoYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19TVFJFQU1fRU5EX0RPTkUsICZjYmxrLT5tRmxhZ3MpICYgQ0JMS19TVFJFQU1fRU5EX0RPTkUpICE9IDA7CiAgICAgaWYgKCFvbGQpIHsKLSAgICAgICAgKHZvaWQpIF9fZnV0ZXhfc3lzY2FsbDMoJm1DYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCisgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCiAgICAgICAgICAgICAgICAgMSk7CiAgICAgfQogICAgIHJldHVybiBvbGQ7CkBAIC02ODUsMTAgKzY5OCwxMSBAQAogCiB2b2lkIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6dGFsbHlVbmRlcnJ1bkZyYW1lcyh1aW50MzJfdCBmcmFtZUNvdW50KQogewotICAgIG1DYmxrLT51Lm1TdHJlYW1pbmcubVVuZGVycnVuRnJhbWVzICs9IGZyYW1lQ291bnQ7CisgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CisgICAgY2Jsay0+dS5tU3RyZWFtaW5nLm1VbmRlcnJ1bkZyYW1lcyArPSBmcmFtZUNvdW50OwogCiAgICAgLy8gRklYTUUgYWxzbyB3YWtlIGZ1dGV4IHNvIHRoYXQgdW5kZXJydW4gaXMgbm90aWNlZCBtb3JlIHF1aWNrbHkKLSAgICAodm9pZCkgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19VTkRFUlJVTiwgJm1DYmxrLT5tRmxhZ3MpOworICAgICh2b2lkKSBhbmRyb2lkX2F0b21pY19vcihDQkxLX1VOREVSUlVOLCAmY2Jsay0+bUZsYWdzKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03NjAsMTIgKzc3NCwxMyBAQAogICAgICAgICAgICAgbUlzU2h1dGRvd24gPSB0cnVlOwogICAgICAgICAgICAgcmV0dXJuIChzc2l6ZV90KSBOT19JTklUOwogICAgICAgICB9Ci0gICAgICAgIG1DYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIC8vIFRoaXMgbWF5IG92ZXJmbG93LCBidXQgY2xpZW50IGlzIG5vdCBzdXBwb3NlZCB0byByZWx5IG9uIGl0CisgICAgICAgIG1DYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uID0gKHVpbnQzMl90KSBwb3NpdGlvbjsKICAgICB9CiAgICAgcmV0dXJuIChzc2l6ZV90KSBwb3NpdGlvbjsKIH0KIAotc3RhdHVzX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5OjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBidWZmZXIsIGJvb2wgYWNrRmx1c2gpCitzdGF0dXNfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCBfX3VudXNlZCkKIHsKICAgICBpZiAobUlzU2h1dGRvd24pIHsKICAgICAgICAgYnVmZmVyLT5tRnJhbWVDb3VudCA9IDA7CkBAIC04MTksNyArODM0LDcgQEAKICAgICBzaXplX3QgbmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIHN0ZXBDb3VudDsKICAgICBpbnQzMl90IHNldEZsYWdzID0gMDsKICAgICBpZiAoIShwb3NpdGlvbiA8PSBuZXdQb3NpdGlvbiAmJiBuZXdQb3NpdGlvbiA8PSBtRnJhbWVDb3VudCkpIHsKLSAgICAgICAgQUxPR1coIiVzIG5ld1Bvc2l0aW9uICV1IG91dHNpZGUgWyV1LCAldV0iLCBfX2Z1bmNfXywgbmV3UG9zaXRpb24sIHBvc2l0aW9uLCBtRnJhbWVDb3VudCk7CisgICAgICAgIEFMT0dXKCIlcyBuZXdQb3NpdGlvbiAlenUgb3V0c2lkZSBbJXp1LCAlenVdIiwgX19mdW5jX18sIG5ld1Bvc2l0aW9uLCBwb3NpdGlvbiwgbUZyYW1lQ291bnQpOwogICAgICAgICBuZXdQb3NpdGlvbiA9IG1GcmFtZUNvdW50OwogICAgIH0gZWxzZSBpZiAobVN0YXRlLm1Mb29wQ291bnQgIT0gMCAmJiBuZXdQb3NpdGlvbiA9PSBtU3RhdGUubUxvb3BFbmQpIHsKICAgICAgICAgaWYgKG1TdGF0ZS5tTG9vcENvdW50ID09IC0xIHx8IC0tbVN0YXRlLm1Mb29wQ291bnQgIT0gMCkgewpAQCAtODM2LDcgKzg1MSw4IEBACiAgICAgbVBvc2l0aW9uID0gbmV3UG9zaXRpb247CiAKICAgICBjYmxrLT5tU2VydmVyICs9IHN0ZXBDb3VudDsKLSAgICBjYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uID0gbmV3UG9zaXRpb247CisgICAgLy8gVGhpcyBtYXkgb3ZlcmZsb3csIGJ1dCBjbGllbnQgaXMgbm90IHN1cHBvc2VkIHRvIHJlbHkgb24gaXQKKyAgICBjYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uID0gKHVpbnQzMl90KSBuZXdQb3NpdGlvbjsKICAgICBpZiAoc2V0RmxhZ3MgIT0gMCkgewogICAgICAgICAodm9pZCkgYW5kcm9pZF9hdG9taWNfb3Ioc2V0RmxhZ3MsICZjYmxrLT5tRmxhZ3MpOwogICAgICAgICAvLyB0aGlzIHdvdWxkIGJlIGEgZ29vZCBwbGFjZSB0byB3YWtlIGEgZnV0ZXgKQEAgLTg0Nyw3ICs4NjMsNyBAQAogICAgIGJ1ZmZlci0+bU5vbkNvbnRpZyA9IDA7CiB9CiAKLXZvaWQgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5Ojp0YWxseVVuZGVycnVuRnJhbWVzKHVpbnQzMl90IGZyYW1lQ291bnQpCit2b2lkIFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6dGFsbHlVbmRlcnJ1bkZyYW1lcyh1aW50MzJfdCBmcmFtZUNvdW50IF9fdW51c2VkKQogewogICAgIC8vIFVubGlrZSBBdWRpb1RyYWNrU2VydmVyUHJveHk6OnRhbGx5VW5kZXJydW5GcmFtZXMoKSB1c2VkIGZvciBzdHJlYW1pbmcgdHJhY2tzLAogICAgIC8vIHdlIGRvbid0IGhhdmUgYSBsb2NhdGlvbiB0byBjb3VudCB1bmRlcnJ1biBmcmFtZXMuICBUaGUgdW5kZXJydW4gZnJhbWUgY291bnRlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTk5NGRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAKQEAgLTAsMCArMSw0NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNoYXJhY3RlckVuY29kaW5nRGVjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Q2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oPgorI2luY2x1ZGUgIkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3JUYWJsZXMuaCIKKworI2luY2x1ZGUgInV0aWxzL1ZlY3Rvci5oIgorI2luY2x1ZGUgIlN0cmluZ0FycmF5LmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3Vjc2RldC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKSB7CisKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBtVXRmOENvbnYgPSB1Y252X29wZW4oIlVURi04IiwgJnN0YXR1cyk7CisgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgY3JlYXRlIFVDb252ZXJ0ZXIgZm9yIFVURi04Iik7CisgICAgICAgIG1VdGY4Q29udiA9IE5VTEw7CisgICAgfQorfQorCitDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjp+Q2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvcigpIHsKKyAgICB1Y252X2Nsb3NlKG1VdGY4Q29udik7Cit9CisKK3ZvaWQgQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvcjo6YWRkVGFnKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgICAgbU5hbWVzLnB1c2hfYmFjayhuYW1lKTsKKyAgICBtVmFsdWVzLnB1c2hfYmFjayh2YWx1ZSk7Cit9CisKK3NpemVfdCBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjpzaXplKCkgeworICAgIHJldHVybiBtTmFtZXMuc2l6ZSgpOworfQorCitzdGF0dXNfdCBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjpnZXRUYWcoaW50IGluZGV4LCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhcioqdmFsdWUpIHsKKyAgICBpZiAoaW5kZXggPj0gbU5hbWVzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgICpuYW1lID0gbU5hbWVzLmdldEVudHJ5KGluZGV4KTsKKyAgICAqdmFsdWUgPSBtVmFsdWVzLmdldEVudHJ5KGluZGV4KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBib29sIGlzUHJpbnRhYmxlQXNjaWkoY29uc3QgY2hhciAqdmFsdWUsIHNpemVfdCBsZW4pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGlmICgodmFsdWVbaV0gJiAweDgwKSB8fCB2YWx1ZVtpXSA8IDB4MjAgfHwgdmFsdWVbaV0gPT0gMHg3ZikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OmRldGVjdEFuZENvbnZlcnQoKSB7CisKKyAgICBpbnQgc2l6ZSA9IG1OYW1lcy5zaXplKCk7CisgICAgQUxPR1YoIiVkIHRhZ3MgYmVmb3JlIGNvbnZlcnNpb24iLCBzaXplKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBBTE9HVigiJXM6ICVzIiwgbU5hbWVzLmdldEVudHJ5KGkpLCBtVmFsdWVzLmdldEVudHJ5KGkpKTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSAmJiBtVXRmOENvbnYpIHsKKworICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgVUNoYXJzZXREZXRlY3RvciAqY3NkID0gdWNzZGV0X29wZW4oJnN0YXR1cyk7CisgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2ggKnVjbTsKKworICAgICAgICAvLyB0cnkgY29tYmluZWQgZGV0ZWN0aW9uIG9mIGFydGlzdC9hbGJ1bS90aXRsZSBldGMuCisgICAgICAgIGNoYXIgYnVmWzEwMjRdOworICAgICAgICBidWZbMF0gPSAwOworICAgICAgICBpbnQgaWR4OworICAgICAgICBib29sIGFsbHByaW50YWJsZSA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gbU5hbWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUgPSBtVmFsdWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgaWYgKCFpc1ByaW50YWJsZUFzY2lpKHZhbHVlLCBzdHJsZW4odmFsdWUpKSAmJiAoCisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhcnRpc3QiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiYWxidW1hcnRpc3QiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiY29tcG9zZXIiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiZ2VucmUiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiYWxidW0iKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAidGl0bGUiKSkpIHsKKyAgICAgICAgICAgICAgICBzdHJsY2F0KGJ1ZiwgdmFsdWUsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAvLyBzZXBhcmF0ZSB0YWdzIGJ5IHNwYWNlIHNvIElDVSdzIG5ncmFtIGRldGVjdG9yIGNhbiBkbyBpdHMgam9iCisgICAgICAgICAgICAgICAgc3RybGNhdChidWYsICIgIiwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgIGFsbHByaW50YWJsZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29uc3QgY2hhciAqY29tYmluZWRlbmMgPSAiVVRGLTgiOworICAgICAgICBpZiAoYWxscHJpbnRhYmxlKSB7CisgICAgICAgICAgICAvLyBzaW5jZSAnYnVmJyBpcyBlbXB0eSwgSUNVIHdvdWxkIHJldHVybiBhIFVURi04IG1hdGNoZXIgd2l0aCBsb3cgY29uZmlkZW5jZSwgc28KKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gZXZlbiBjYWxsIGl0CisgICAgICAgICAgICBBTE9HVigiYWxsIHRhZ3MgYXJlIHByaW50YWJsZSwgYXNzdW1pbmcgYXNjaWkgKCV6dSkiLCBzdHJsZW4oYnVmKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1Y3NkZXRfc2V0VGV4dChjc2QsIGJ1Ziwgc3RybGVuKGJ1ZiksICZzdGF0dXMpOworICAgICAgICAgICAgaW50MzJfdCBtYXRjaGVzOworICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCoqIHVjbWEgPSB1Y3NkZXRfZGV0ZWN0QWxsKGNzZCwgJm1hdGNoZXMsICZzdGF0dXMpOworICAgICAgICAgICAgYm9vbCBnb29kbWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgaW50IGhpZ2hlc3QgPSAwOworICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCogYmVzdENvbWJpbmVkTWF0Y2ggPSBnZXRQcmVmZXJyZWQoYnVmLCBzdHJsZW4oYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgdWNtYSwgbWF0Y2hlcywgJmdvb2RtYXRjaCwgJmhpZ2hlc3QpOworCisgICAgICAgICAgICBBTE9HVigiZ29vZG1hdGNoOiAlcywgaGlnaGVzdDogJWQiLCBnb29kbWF0Y2ggPyAidHJ1ZSIgOiAiZmFsc2UiLCBoaWdoZXN0KTsKKyAgICAgICAgICAgIGlmICghZ29vZG1hdGNoICYmIChoaWdoZXN0IDwgMTUgfHwgc3RybGVuKGJ1ZikgPCAyMCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigibm90IGEgZ29vZCBtYXRjaCwgdHJ5aW5nIHdpdGggbW9yZSBkYXRhIik7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBzdHJpbmcgbWlnaHQgYmUgdG9vIHNob3J0IGZvciBJQ1UgdG8gZG8gYW55dGhpbmcgdXNlZnVsIHdpdGguCisgICAgICAgICAgICAgICAgLy8gKHJlYWwgd29ybGQgZXhhbXBsZTogIkJqw7ZyayIgaW4gSVNPLTg4NTktMSBtaWdodCBiZSBkZXRlY3RlZCBhcyBHQjE4MDMwLCBiZWNhdXNlCisgICAgICAgICAgICAgICAgLy8gIHRoZSBJU08gZGV0ZWN0b3IgcmVwb3J0cyBhIGNvbmZpZGVuY2Ugb2YgMCwgd2hpbGUgdGhlIEdCMTgwMzAgZGV0ZWN0b3IgcmVwb3J0cworICAgICAgICAgICAgICAgIC8vICBhIGNvbmZpZGVuY2Ugb2YgMTAgd2l0aCBubyBpbnZhbGlkIGNoYXJhY3RlcnMpCisgICAgICAgICAgICAgICAgLy8gQXBwZW5kIGFydGlzdCwgYWxidW0gYW5kIHRpdGxlIGlmIHRoZXkgd2VyZSBwcmV2aW91c2x5IG9taXR0ZWQgYmVjYXVzZSB0aGV5CisgICAgICAgICAgICAgICAgLy8gd2VyZSBwcmludGFibGUgYXNjaWkuCisgICAgICAgICAgICAgICAgYm9vbCBhZGRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtTmFtZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gbVZhbHVlcy5nZXRFbnRyeShpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJpbnRhYmxlQXNjaWkodmFsdWUsIHN0cmxlbih2YWx1ZSkpICYmICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiYXJ0aXN0IikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiYWxidW0iKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJ0aXRsZSIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybGNhdChidWYsIHZhbHVlLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJsY2F0KGJ1ZiwgIiAiLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFkZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHVjc2RldF9zZXRUZXh0KGNzZCwgYnVmLCBzdHJsZW4oYnVmKSwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHVjbWEgPSB1Y3NkZXRfZGV0ZWN0QWxsKGNzZCwgJm1hdGNoZXMsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBiZXN0Q29tYmluZWRNYXRjaCA9IGdldFByZWZlcnJlZChidWYsIHN0cmxlbihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbWEsIG1hdGNoZXMsICZnb29kbWF0Y2gsICZoaWdoZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnb29kbWF0Y2ggJiYgaGlnaGVzdCA8PSAxNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN0aWxsIG5vdCBhIGdvb2QgbWF0Y2ggYWZ0ZXIgYWRkaW5nIHByaW50YWJsZSB0YWdzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0Q29tYmluZWRNYXRjaCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigibm8gcHJpbnRhYmxlIHRhZ3MgdG8gYWRkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYmVzdENvbWJpbmVkTWF0Y2ggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvbWJpbmVkZW5jID0gdWNzZGV0X2dldE5hbWUoYmVzdENvbWJpbmVkTWF0Y2gsICZzdGF0dXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb21iaW5lZGVuYyA9ICJJU08tODg1OS0xIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gbU5hbWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgdWludDhfdCogc3JjID0gKHVpbnQ4X3QgKiltVmFsdWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbigoY2hhciAqKXNyYyk7CisgICAgICAgICAgICB1aW50OF90KiBkZXN0ID0gc3JjOworCisgICAgICAgICAgICBBTE9HVigiQEBAIGNoZWNraW5nICVzIiwgbmFtZSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzID0gbVZhbHVlcy5nZXRFbnRyeShpKTsKKyAgICAgICAgICAgIGludDMyX3QgaW5wdXRMZW5ndGggPSBzdHJsZW4ocyk7CisgICAgICAgICAgICBjb25zdCBjaGFyICplbmM7CisKKyAgICAgICAgICAgIGlmICghYWxscHJpbnRhYmxlICYmICghc3RyY21wKG5hbWUsICJhcnRpc3QiKSB8fAorICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bWFydGlzdCIpIHx8CisgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImNvbXBvc2VyIikgfHwKKyAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiZ2VucmUiKSB8fAorICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bSIpIHx8CisgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgInRpdGxlIikpKSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIGVuY29kaW5nIGRldGVybWluZWQgZnJvbSB0aGUgY29tYmluYXRpb24gb2YgYXJ0aXN0L2FsYnVtL3RpdGxlIGV0Yy4KKyAgICAgICAgICAgICAgICBlbmMgPSBjb21iaW5lZGVuYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUHJpbnRhYmxlQXNjaWkocywgaW5wdXRMZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgIGVuYyA9ICJVVEYtOCI7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJAQEBAICVzIGlzIGFzY2lpIiwgbU5hbWVzLmdldEVudHJ5KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1Y3NkZXRfc2V0VGV4dChjc2QsIHMsIGlucHV0TGVuZ3RoLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgdWNtID0gdWNzZGV0X2RldGVjdChjc2QsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXVjbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVZhbHVlcy5zZXRFbnRyeShpLCAiPz8/Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbmMgPSB1Y3NkZXRfZ2V0TmFtZSh1Y20sICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQEBAQCByZWNvZ25pemVkIGNoYXJzZXQ6ICVzIGZvciAlcyBjb25maWRlbmNlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMsIG1OYW1lcy5nZXRFbnRyeShpKSwgdWNzZGV0X2dldENvbmZpZGVuY2UodWNtLCAmc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RyY21wKGVuYywiVVRGLTgiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gb25seSBjb252ZXJ0IGlmIHRoZSBzb3VyY2UgZW5jb2RpbmcgaXNuJ3QgYWxyZWFkeSBVVEYtOAorICAgICAgICAgICAgICAgIEFMT0dWKCJAQEAgdXNpbmcgY29udmVydGVyICVzIGZvciAlcyIsIGVuYywgbU5hbWVzLmdldEVudHJ5KGkpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgICAgICAgICAgVUNvbnZlcnRlciAqY29udiA9IHVjbnZfb3BlbihlbmMsICZzdGF0dXMpOworICAgICAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IGNyZWF0ZSBVQ29udmVydGVyIGZvciAlcyAoJWQpLCBmYWxsaW5nIGJhY2sgdG8gSVNPLTg4NTktMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIGNvbnYgPSB1Y252X29wZW4oIklTTy04ODU5LTEiLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IGNyZWF0ZSBVQ29udmVydGVyIGZvciBJU08tODg1OS0xIGVpdGhlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IGZyb20gbmF0aXZlIGVuY29kaW5nIHRvIFVURi04CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc291cmNlID0gbVZhbHVlcy5nZXRFbnRyeShpKTsKKyAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0TGVuZ3RoID0gbGVuICogMyArIDE7CisgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyID0gbmV3IGNoYXJbdGFyZ2V0TGVuZ3RoXTsKKyAgICAgICAgICAgICAgICAvLyBkb24ndCBub3JtYWxseSBjaGVjayBmb3IgTlVMTCwgYnV0IGluIHRoaXMgY2FzZSB0YXJnZXRMZW5ndGggbWF5IGJlIGxhcmdlCisgICAgICAgICAgICAgICAgaWYgKCFidWZmZXIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNoYXIqIHRhcmdldCA9IGJ1ZmZlcjsKKworICAgICAgICAgICAgICAgIHVjbnZfY29udmVydEV4KG1VdGY4Q29udiwgY29udiwgJnRhcmdldCwgdGFyZ2V0ICsgdGFyZ2V0TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZSwgc291cmNlICsgc3RybGVuKHNvdXJjZSksCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFLCBUUlVFLCAmc3RhdHVzKTsKKworICAgICAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgidWNudl9jb252ZXJ0RXggZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIG1WYWx1ZXMuc2V0RW50cnkoaSwgIj8/PyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHplcm8gdGVybWluYXRlCisgICAgICAgICAgICAgICAgICAgICp0YXJnZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAvLyBzdHJpcCB0cmFpbGluZyBzcGFjZXMKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tdGFyZ2V0ID4gYnVmZmVyICYmICp0YXJnZXQgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqdGFyZ2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGxlYWRpbmcgc3BhY2VzCisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0YXJ0ID0gYnVmZmVyOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKnN0YXJ0ID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtVmFsdWVzLnNldEVudHJ5KGksIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7CisKKyAgICAgICAgICAgICAgICB1Y252X2Nsb3NlKGNvbnYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IHNpemUgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgaWYgKHN0cmxlbihtVmFsdWVzLmdldEVudHJ5KGkpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImVyYXNpbmcgJXMgYmVjYXVzZSBlbnRyeSBpcyBlbXB0eSIsIG1OYW1lcy5nZXRFbnRyeShpKSk7CisgICAgICAgICAgICAgICAgbU5hbWVzLmVyYXNlKGkpOworICAgICAgICAgICAgICAgIG1WYWx1ZXMuZXJhc2UoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB1Y3NkZXRfY2xvc2UoY3NkKTsKKyAgICB9Cit9CisKKy8qCisgKiBXaGVuIElDVSBkZXRlY3RzIG11bHRpcGxlIGVuY29kaW5nIG1hdGNoZXMsIGFwcGx5IGFkZGl0aW9uYWwgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUKKyAqIHdoaWNoIG9uZSBpcyB0aGUgYmVzdCBtYXRjaCwgc2luY2UgSUNVIGNhbid0IGFsd2F5cyBiZSB0cnVzdGVkIHRvIG1ha2UgdGhlIHJpZ2h0IGNob2ljZS4KKyAqCisgKiBXaGF0IHRoaXMgbWV0aG9kIGRvZXMgaXM6CisgKiAtIGRlY29kZSB0aGUgaW5wdXQgdXNpbmcgZWFjaCBvZiB0aGUgbWF0Y2hlcyBmb3VuZAorICogLSByZWNhbGN1bGF0ZSB0aGUgc3RhcnRpbmcgY29uZmlkZW5jZSBsZXZlbCBmb3IgbXVsdGlieXRlIGVuY29kaW5ncyB1c2luZyBhIGRpZmZlcmVudAorICogICBhbGdvcml0aG0gYW5kIGxhcmdlciBmcmVxdWVudCBjaGFyYWN0ZXIgbGlzdHMgdGhhbiBJQ1UKKyAqIC0gZGV2YWx1ZSBlbmNvZGluZyB3aGVyZSB0aGUgY29udmVyc2lvbiBjb250YWlucyB1bmxpa2VseSBjaGFyYWN0ZXJzIChzeW1ib2xzLCByZXNlcnZlZCwgZXRjKQorICogLSBwaWNrIHRoZSBoaWdoZXN0IG1hdGNoCisgKiAtIHNpZ25hbCB0byB0aGUgY2FsbGVyIHdoZXRoZXIgdGhpcyBtYXRjaCBpcyBjb25zaWRlcmVkIGdvb2Q6IGNvbmZpZGVuY2UgPiAxNSwgYW5kIGNvbmZpZGVuY2UKKyAqICAgZGVsdGEgd2l0aCB0aGUgbmV4dCBydW5uZXIgdXAgPiAxNQorICovCitjb25zdCBVQ2hhcnNldE1hdGNoICpDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjpnZXRQcmVmZXJyZWQoCisgICAgICAgIGNvbnN0IGNoYXIgKmlucHV0LCBzaXplX3QgbGVuLAorICAgICAgICBjb25zdCBVQ2hhcnNldE1hdGNoKiogdWNtYSwgc2l6ZV90IG51bW1hdGNoZXMsCisgICAgICAgIGJvb2wgKmdvb2RtYXRjaCwgaW50ICpoaWdoZXN0bWF0Y2gpIHsKKworICAgICpnb29kbWF0Y2ggPSBmYWxzZTsKKyAgICBWZWN0b3I8Y29uc3QgVUNoYXJzZXRNYXRjaCo+IG1hdGNoZXM7CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisKKyAgICBBTE9HVigiJXp1IG1hdGNoZXMiLCBudW1tYXRjaGVzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bW1hdGNoZXM7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyICplbmNuYW1lID0gdWNzZGV0X2dldE5hbWUodWNtYVtpXSwgJnN0YXR1cyk7CisgICAgICAgIGludCBjb25maWRlbmNlID0gdWNzZGV0X2dldENvbmZpZGVuY2UodWNtYVtpXSwgJnN0YXR1cyk7CisgICAgICAgIEFMT0dWKCIlenU6ICVzICVkIiwgaSwgZW5jbmFtZSwgY29uZmlkZW5jZSk7CisgICAgICAgIG1hdGNoZXMucHVzaF9iYWNrKHVjbWFbaV0pOworICAgIH0KKworICAgIHNpemVfdCBudW0gPSBtYXRjaGVzLnNpemUoKTsKKyAgICBpZiAobnVtID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChudW0gPT0gMSkgeworICAgICAgICBpbnQgY29uZmlkZW5jZSA9IHVjc2RldF9nZXRDb25maWRlbmNlKG1hdGNoZXNbMF0sICZzdGF0dXMpOworICAgICAgICBpZiAoY29uZmlkZW5jZSA+IDE1KSB7CisgICAgICAgICAgICAqZ29vZG1hdGNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWF0Y2hlc1swXTsKKyAgICB9CisKKyAgICBBTE9HVigiY29uc2lkZXJpbmcgJXp1IG1hdGNoZXMiLCBudW0pOworCisgICAgLy8ga2VlcCB0cmFjayBvZiBob3cgbWFueSAic3BlY2lhbCIgY2hhcmFjdGVycyByZXN1bHQgd2hlbiBjb252ZXJ0aW5nIHRoZSBpbnB1dCB1c2luZyBlYWNoCisgICAgLy8gZW5jb2RpbmcKKyAgICBWZWN0b3I8aW50PiBuZXdjb25maWRlbmNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKmZyZXFkYXRhID0gTlVMTDsKKyAgICAgICAgZmxvYXQgZnJlcWNvdmVyYWdlID0gMDsKKyAgICAgICAgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBjb25zdCBjaGFyICplbmNuYW1lID0gdWNzZGV0X2dldE5hbWUobWF0Y2hlc1tpXSwgJnN0YXR1cyk7CisgICAgICAgIGludCBjb25maWRlbmNlID0gdWNzZGV0X2dldENvbmZpZGVuY2UobWF0Y2hlc1tpXSwgJnN0YXR1cyk7CisgICAgICAgIGlmICghc3RyY21wKCJHQjE4MDMwIiwgZW5jbmFtZSkpIHsKKyAgICAgICAgICAgIGZyZXFkYXRhID0gZnJlcXVlbnRfemhDTjsKKyAgICAgICAgICAgIGZyZXFjb3ZlcmFnZSA9IGZyZXF1ZW50X3poQ05fY292ZXJhZ2U7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQmlnNSIsIGVuY25hbWUpKSB7CisgICAgICAgICAgICBmcmVxZGF0YSA9IGZyZXF1ZW50X3poVFc7CisgICAgICAgICAgICBmcmVxY292ZXJhZ2UgPSBmcmVxdWVudF96aFRXX2NvdmVyYWdlOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkVVQy1LUiIsIGVuY25hbWUpKSB7CisgICAgICAgICAgICBmcmVxZGF0YSA9IGZyZXF1ZW50X2tvOworICAgICAgICAgICAgZnJlcWNvdmVyYWdlID0gZnJlcXVlbnRfa29fY292ZXJhZ2U7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiRVVDLUpQIiwgZW5jbmFtZSkpIHsKKyAgICAgICAgICAgIGZyZXFkYXRhID0gZnJlcXVlbnRfamE7CisgICAgICAgICAgICBmcmVxY292ZXJhZ2UgPSBmcmVxdWVudF9qYV9jb3ZlcmFnZTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJTaGlmdF9KSVMiLCBlbmNuYW1lKSkgeworICAgICAgICAgICAgZnJlcWRhdGEgPSBmcmVxdWVudF9qYTsKKyAgICAgICAgICAgIGZyZXFjb3ZlcmFnZSA9IGZyZXF1ZW50X2phX2NvdmVyYWdlOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIiV6dTogJXMgJWQiLCBpLCBlbmNuYW1lLCBjb25maWRlbmNlKTsKKyAgICAgICAgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBVQ29udmVydGVyICpjb252ID0gdWNudl9vcGVuKGVuY25hbWUsICZzdGF0dXMpOworICAgICAgICBpbnQgZGVtZXJpdCA9IDA7CisgICAgICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgeworICAgICAgICAgICAgQUxPR1YoImZhaWxlZCB0byBvcGVuICVzOiAlZCIsIGVuY25hbWUsIHN0YXR1cyk7CisgICAgICAgICAgICBjb25maWRlbmNlID0gMDsKKyAgICAgICAgICAgIGRlbWVyaXQgKz0gMTAwMDsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBjaGFyICpzb3VyY2UgPSBpbnB1dDsKKyAgICAgICAgY29uc3QgY2hhciAqc291cmNlTGltaXQgPSBpbnB1dCArIGxlbjsKKyAgICAgICAgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBpbnQgZnJlcXVlbnRjaGFycyA9IDA7CisgICAgICAgIGludCB0b3RhbGNoYXJzID0gMDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIC8vIGRlbWVyaXQgdGhlIGN1cnJlbnQgZW5jb2RpbmcgZm9yIGVhY2ggInNwZWNpYWwiIGNoYXJhY3RlciBmb3VuZCBhZnRlciBjb252ZXJzaW9uLgorICAgICAgICAgICAgLy8gVGhlIGFtb3VudCBvZiBkZW1lcml0IGlzIHNvbWV3aGF0IGFyYml0cmFyaWx5IGNob3Nlbi4KKyAgICAgICAgICAgIGludCBpbmNoYXI7CisgICAgICAgICAgICBpZiAoc291cmNlICE9IHNvdXJjZUxpbWl0KSB7CisgICAgICAgICAgICAgICAgaW5jaGFyID0gKHNvdXJjZVswXSA8PCA4KSArIHNvdXJjZVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVDaGFyMzIgYyA9IHVjbnZfZ2V0TmV4dFVDaGFyKGNvbnYsICZzb3VyY2UsIHNvdXJjZUxpbWl0LCAmc3RhdHVzKTsKKyAgICAgICAgICAgIGlmICghVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjIDwgMHgyMCB8fCAoYyA+PSAweDdmICYmIGMgPD0gMHgwMDlmKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjb250cm9sIGNoYXJhY3RlciAleCIsIGMpOworICAgICAgICAgICAgICAgIGRlbWVyaXQgKz0gMTAwOworICAgICAgICAgICAgfSBlbHNlIGlmICgoYyA9PSAweGEwKSAgICAgICAgICAgICAgICAgICAgICAvLyBuby1icmVhayBzcGFjZQorICAgICAgICAgICAgICAgICAgICB8fCAoYyA+PSAweGEyICYmIGMgPD0gMHhiZSkgICAgICAgICAvLyBzeW1ib2xzLCBzdXBlcnNjcmlwdHMKKyAgICAgICAgICAgICAgICAgICAgfHwgKGMgPT0gMHhkNykgfHwgKGMgPT0gMHhmNykgICAgICAgLy8gbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIHNpZ25zCisgICAgICAgICAgICAgICAgICAgIHx8IChjID49IDB4MjAwMCAmJiBjIDw9IDB4MjA5ZikpIHsgIC8vIHB1bmN0dWF0aW9uLCBzdXBlcnNjcmlwdHMKKyAgICAgICAgICAgICAgICBBTE9HVigidW5saWtlbHkgY2hhcmFjdGVyICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSAxMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweGUwMDAgJiYgYyA8PSAweGY4ZmYpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicHJpdmF0ZSB1c2UgY2hhcmFjdGVyICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSAzMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweDIxOTAgJiYgYyA8PSAweDJiZmYpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHJhbmdlIGNvbXByaXNlcyB2YXJpb3VzIHN5bWJvbCByYW5nZXMgdGhhdCBhcmUgdW5saWtlbHkgdG8gYXBwZWFyIGluCisgICAgICAgICAgICAgICAgLy8gbXVzaWMgZmlsZSBtZXRhZGF0YS4KKyAgICAgICAgICAgICAgICBBTE9HVigic3ltYm9sICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSAxMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAweGZmZmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVwbGFjZW1lbnQgY2hhcmFjdGVyIik7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSA1MDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweGZmZjAgJiYgYyA8PSAweGZmZmMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigidW5pY29kZSBzcGVjaWFsICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSA1MDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJlcWRhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHRvdGFsY2hhcnMrKzsKKyAgICAgICAgICAgICAgICBpZiAoaXNGcmVxdWVudChmcmVxZGF0YSwgYykpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlcXVlbnRjaGFycysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZnJlcWRhdGEgIT0gTlVMTCAmJiB0b3RhbGNoYXJzICE9IDApIHsKKyAgICAgICAgICAgIGludCBteWNvbmZpZGVuY2UgPSAxMCArIGZsb2F0KCgxMDAgKiBmcmVxdWVudGNoYXJzKSAvIHRvdGFsY2hhcnMpIC8gZnJlcWNvdmVyYWdlOworICAgICAgICAgICAgQUxPR1YoIklDVSBjb25maWRlbmNlOiAlZCwgbXkgY29uZmlkZW5jZTogJWQgKCVkICVkKSIsIGNvbmZpZGVuY2UsIG15Y29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgdG90YWxjaGFycywgZnJlcXVlbnRjaGFycyk7CisgICAgICAgICAgICBpZiAobXljb25maWRlbmNlID4gMTAwKSBteWNvbmZpZGVuY2UgPSAxMDA7CisgICAgICAgICAgICBpZiAobXljb25maWRlbmNlIDwgMCkgbXljb25maWRlbmNlID0gMDsKKyAgICAgICAgICAgIGNvbmZpZGVuY2UgPSBteWNvbmZpZGVuY2U7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVkLSVkPSVkIiwgY29uZmlkZW5jZSwgZGVtZXJpdCwgY29uZmlkZW5jZSAtIGRlbWVyaXQpOworICAgICAgICBuZXdjb25maWRlbmNlLnB1c2hfYmFjayhjb25maWRlbmNlIC0gZGVtZXJpdCk7CisgICAgICAgIHVjbnZfY2xvc2UoY29udik7CisgICAgICAgIGlmIChpID09IDAgJiYgKGNvbmZpZGVuY2UgLSBkZW1lcml0KSA9PSAxMDApIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgYW55IGZ1cnRoZXIsIHdlJ2xsIGVuZCB1cCB1c2luZyB0aGlzIG1hdGNoIGFueXdheQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBmaW5kIG1hdGNoIHdpdGggaGlnaGVzdCBjb25maWRlbmNlIGFmdGVyIGFkanVzdGluZyBmb3IgdW5saWtlbHkgY2hhcmFjdGVycworICAgIGludCBoaWdoZXN0ID0gbmV3Y29uZmlkZW5jZVswXTsKKyAgICBzaXplX3QgaGlnaGVzdGlkeCA9IDA7CisgICAgaW50IHJ1bm5lcnVwID0gLTEwMDAwOworICAgIGludCBydW5uZXJ1cGlkeCA9IC0xMDAwMDsKKyAgICBudW0gPSBuZXdjb25maWRlbmNlLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bTsgaSsrKSB7CisgICAgICAgIGlmIChuZXdjb25maWRlbmNlW2ldID4gaGlnaGVzdCkgeworICAgICAgICAgICAgcnVubmVydXAgPSBoaWdoZXN0OworICAgICAgICAgICAgcnVubmVydXBpZHggPSBoaWdoZXN0aWR4OworICAgICAgICAgICAgaGlnaGVzdCA9IG5ld2NvbmZpZGVuY2VbaV07CisgICAgICAgICAgICBoaWdoZXN0aWR4ID0gaTsKKyAgICAgICAgfSBlbHNlIGlmIChuZXdjb25maWRlbmNlW2ldID4gcnVubmVydXApeworICAgICAgICAgICAgcnVubmVydXAgPSBuZXdjb25maWRlbmNlW2ldOworICAgICAgICAgICAgcnVubmVydXBpZHggPSBpOworICAgICAgICB9CisgICAgfQorICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBBTE9HVigic2VsZWN0aW5nOiAnJXMnIHcvICVkIGNvbmZpZGVuY2UiLAorICAgICAgICAgICAgdWNzZGV0X2dldE5hbWUobWF0Y2hlc1toaWdoZXN0aWR4XSwgJnN0YXR1cyksIGhpZ2hlc3QpOworICAgIGlmIChydW5uZXJ1cGlkeCA8IDApIHsKKyAgICAgICAgQUxPR1YoIm5vIHJ1bm5lciB1cCIpOworICAgICAgICBpZiAoaGlnaGVzdCA+IDE1KSB7CisgICAgICAgICAgICAqZ29vZG1hdGNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJydW5uZXIgdXA6ICclcycgdy8gJWQgY29uZmlkZW5jZSIsCisgICAgICAgICAgICAgICAgdWNzZGV0X2dldE5hbWUobWF0Y2hlc1tydW5uZXJ1cGlkeF0sICZzdGF0dXMpLCBydW5uZXJ1cCk7CisgICAgICAgIGlmIChydW5uZXJ1cCA8IDApIHsKKyAgICAgICAgICAgIHJ1bm5lcnVwID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGhpZ2hlc3QgLSBydW5uZXJ1cCkgPiAxNSkgeworICAgICAgICAgICAgKmdvb2RtYXRjaCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgKmhpZ2hlc3RtYXRjaCA9IGhpZ2hlc3Q7CisgICAgcmV0dXJuIG1hdGNoZXNbaGlnaGVzdGlkeF07Cit9CisKKworYm9vbCBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjppc0ZyZXF1ZW50KGNvbnN0IHVpbnQxNl90ICp2YWx1ZXMsIHVpbnQzMl90IGMpIHsKKworICAgIGludCBzdGFydCA9IDA7CisgICAgaW50IGVuZCA9IDUxMTsgLy8gQWxsIHRoZSB0YWJsZXMgaGF2ZSA1MTIgZW50cmllcworICAgIGludCBtaWQgPSAoc3RhcnQrZW5kKS8yOworCisgICAgd2hpbGUoc3RhcnQgPD0gZW5kKSB7CisgICAgICAgIGlmKGMgPT0gdmFsdWVzW21pZF0pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGMgPiB2YWx1ZXNbbWlkXSkgeworICAgICAgICAgICAgc3RhcnQgPSBtaWQgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW5kID0gbWlkIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIG1pZCA9IChzdGFydCArIGVuZCkgLyAyOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvclRhYmxlcy5oIGIvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvclRhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZTExMzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yVGFibGVzLmgKQEAgLTAsMCArMSwyMDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGhlIDUxMiBtb3N0IGZyZXF1ZW50bHkgb2NjdXJpbmcgY2hhcmFjdGVycyBmb3IgdGhlIHpoQ04gbGFuZ3VhZ2UgaW4gYSBzYW1wbGUgb2YgdGhlIEludGVybmV0LgorLy8gT3JkZXJlZCBieSBjb2RlcG9pbnQsIGNvbW1lbnQgc2hvd3MgY2hhcmFjdGVyIGFuZCByYW5raW5nIGJ5IGZyZXF1ZW5jeQorY29uc3QgdWludDE2X3QgZnJlcXVlbnRfemhDTltdID0geworICAgIDB4NEUwMCwgLy8g5LiALCAjMgorICAgIDB4NEUwNywgLy8g5LiHLCAjMzA2CisgICAgMHg0RTA5LCAvLyDkuIksICMxMzgKKyAgICAweDRFMEEsIC8vIOS4iiwgIzE2CisgICAgMHg0RTBCLCAvLyDkuIssICMyNQorICAgIDB4NEUwRCwgLy8g5LiNLCAjNworICAgIDB4NEUwRSwgLy8g5LiOLCAjMTMzCisgICAgMHg0RTEzLCAvLyDkuJMsICMxNTEKKyAgICAweDRFMTYsIC8vIOS4liwgIzM0NgorICAgIDB4NEUxQSwgLy8g5LiaLCAjMzkKKyAgICAweDRFMUMsIC8vIOS4nCwgIzE5NworICAgIDB4NEUyNCwgLy8g5LikLCAjMzc2CisgICAgMHg0RTJBLCAvLyDkuKosICMyMworICAgIDB4NEUyRCwgLy8g5LitLCAjNAorICAgIDB4NEUzQSwgLy8g5Li6LCAjMzEKKyAgICAweDRFM0IsIC8vIOS4uywgIzk1CisgICAgMHg0RTNFLCAvLyDkuL4sICM0MTgKKyAgICAweDRFNDgsIC8vIOS5iCwgIzkzCisgICAgMHg0RTRCLCAvLyDkuYssICMxMzEKKyAgICAweDRFNTAsIC8vIOS5kCwgIzEzMAorICAgIDB4NEU1RiwgLy8g5LmfLCAjMTQ1CisgICAgMHg0RTY2LCAvLyDkuaYsICMyODMKKyAgICAweDRFNzAsIC8vIOS5sCwgIzQ4MworICAgIDB4NEU4NiwgLy8g5LqGLCAjMTMKKyAgICAweDRFOEIsIC8vIOS6iywgIzE2OAorICAgIDB4NEU4QywgLy8g5LqMLCAjMjE4CisgICAgMHg0RThFLCAvLyDkuo4sICM2NAorICAgIDB4NEU5NCwgLy8g5LqULCAjNDMwCisgICAgMHg0RTlBLCAvLyDkuposICM0NjgKKyAgICAweDRFOUIsIC8vIOS6mywgIzM2NgorICAgIDB4NEVBNCwgLy8g5LqkLCAjMjQzCisgICAgMHg0RUE3LCAvLyDkuqcsICM4NgorICAgIDB4NEVBQiwgLy8g5LqrLCAjMzQ1CisgICAgMHg0RUFDLCAvLyDkuqwsICMyMDYKKyAgICAweDRFQkEsIC8vIOS6uiwgIzMKKyAgICAweDRFQzAsIC8vIOS7gCwgIzI4NworICAgIDB4NEVDQiwgLy8g5LuLLCAjNDc4CisgICAgMHg0RUNFLCAvLyDku44sICMzODEKKyAgICAweDRFRDYsIC8vIOS7liwgIzEyOQorICAgIDB4NEVFMywgLy8g5LujLCAjMjQxCisgICAgMHg0RUU1LCAvLyDku6UsICM1MQorICAgIDB4NEVFQywgLy8g5LusLCAjODMKKyAgICAweDRFRjYsIC8vIOS7tiwgIzE0MQorICAgIDB4NEVGNywgLy8g5Lu3LCAjMTQwCisgICAgMHg0RUZCLCAvLyDku7ssICMzODMKKyAgICAweDRGMDEsIC8vIOS8gSwgIzQzOQorICAgIDB4NEYxOCwgLy8g5LyYLCAjMzc0CisgICAgMHg0RjFBLCAvLyDkvJosICMyOQorICAgIDB4NEYyMCwgLy8g5LygLCAjMjIyCisgICAgMHg0RjQ2LCAvLyDkvYYsICM0NTEKKyAgICAweDRGNEQsIC8vIOS9jSwgIzIwOAorICAgIDB4NEY1MywgLy8g5L2TLCAjOTgKKyAgICAweDRGNTUsIC8vIOS9lSwgIzMzOQorICAgIDB4NEY1QywgLy8g5L2cLCAjNDQKKyAgICAweDRGNjAsIC8vIOS9oCwgIzc2CisgICAgMHg0RjdGLCAvLyDkvb8sICMyNzIKKyAgICAweDRGOUIsIC8vIOS+mywgIzM3NQorICAgIDB4NEZERCwgLy8g5L+dLCAjMTgwCisgICAgMHg0RkUxLCAvLyDkv6EsICM4NAorICAgIDB4NEZFRSwgLy8g5L+uLCAjNDM3CisgICAgMHg1MDNDLCAvLyDlgLwsICM0NTAKKyAgICAweDUwNUEsIC8vIOWBmiwgIzM2OAorICAgIDB4NTA2NSwgLy8g5YGlLCAjNDg0CisgICAgMHg1MENGLCAvLyDlg48sICM0ODcKKyAgICAweDUxM0YsIC8vIOWEvywgIzMyNgorICAgIDB4NTE0MywgLy8g5YWDLCAjMjAyCisgICAgMHg1MTQ4LCAvLyDlhYgsICM0ODUKKyAgICAweDUxNDksIC8vIOWFiSwgIzI1NAorICAgIDB4NTE0QiwgLy8g5YWLLCAjNTAzCisgICAgMHg1MTRELCAvLyDlhY0sICMzNDkKKyAgICAweDUxNjUsIC8vIOWFpSwgIzE1NgorICAgIDB4NTE2OCwgLy8g5YWoLCAjNDcKKyAgICAweDUxNkMsIC8vIOWFrCwgIzM1CisgICAgMHg1MTcxLCAvLyDlhbEsICM0NDgKKyAgICAweDUxNzMsIC8vIOWFsywgIzQ5CisgICAgMHg1MTc2LCAvLyDlhbYsICMxOTUKKyAgICAweDUxNzcsIC8vIOWFtywgIzMyOQorICAgIDB4NTE4NSwgLy8g5YaFLCAjMTA5CisgICAgMHg1MThDLCAvLyDlhowsICMyMjUKKyAgICAweDUxOUIsIC8vIOWGmywgIzQ2NgorICAgIDB4NTFGQSwgLy8g5Ye6LCAjNTMKKyAgICAweDUxRkIsIC8vIOWHuywgIzM1OQorICAgIDB4NTIwNiwgLy8g5YiGLCAjMjIKKyAgICAweDUyMTcsIC8vIOWIlywgIzQxMAorICAgIDB4NTIxQiwgLy8g5YibLCAjMzk5CisgICAgMHg1MjI5LCAvLyDliKksICMyOTYKKyAgICAweDUyMkIsIC8vIOWIqywgIzM3MgorICAgIDB4NTIzMCwgLy8g5YiwLCAjMzMKKyAgICAweDUyMzYsIC8vIOWItiwgIzE5MgorICAgIDB4NTI0RCwgLy8g5YmNLCAjMTE3CisgICAgMHg1MjlCLCAvLyDlipssICMxNzMKKyAgICAweDUyOUUsIC8vIOWKniwgIzQzNgorICAgIDB4NTI5RiwgLy8g5YqfLCAjNDU1CisgICAgMHg1MkEwLCAvLyDliqAsICM5NworICAgIDB4NTJBMSwgLy8g5YqhLCAjMTAwCisgICAgMHg1MkE4LCAvLyDliqgsICM0NgorICAgIDB4NTJBOSwgLy8g5YqpLCAjMzY1CisgICAgMHg1MzA1LCAvLyDljIUsICMzMzEKKyAgICAweDUzMTYsIC8vIOWMliwgIzE1NQorICAgIDB4NTMxNywgLy8g5YyXLCAjMTk0CisgICAgMHg1MzNBLCAvLyDljLosICMxMDUKKyAgICAweDUzM0IsIC8vIOWMuywgIzIzNAorICAgIDB4NTM0MSwgLy8g5Y2BLCAjMjk0CisgICAgMHg1MzRFLCAvLyDljY4sICMyMDUKKyAgICAweDUzNTUsIC8vIOWNlSwgIzI1OQorICAgIDB4NTM1NywgLy8g5Y2XLCAjMTgyCisgICAgMHg1MzVBLCAvLyDljZosICMxNTMKKyAgICAweDUzNjEsIC8vIOWNoSwgIzMzMgorICAgIDB4NTM5RiwgLy8g5Y6fLCAjMjcxCisgICAgMHg1M0JCLCAvLyDljrssICMyODIKKyAgICAweDUzQzIsIC8vIOWPgiwgIzUwMAorICAgIDB4NTNDQSwgLy8g5Y+KLCAjMjU1CisgICAgMHg1M0NCLCAvLyDlj4ssICMxODYKKyAgICAweDUzQ0QsIC8vIOWPjSwgIzQyMgorICAgIDB4NTNEMSwgLy8g5Y+RLCAjMTUKKyAgICAweDUzRDcsIC8vIOWPlywgIzUwNworICAgIDB4NTNEOCwgLy8g5Y+YLCAjMzk1CisgICAgMHg1M0UzLCAvLyDlj6MsICMyOTMKKyAgICAweDUzRUEsIC8vIOWPqiwgIzM0MAorICAgIDB4NTNFRiwgLy8g5Y+vLCAjNDUKKyAgICAweDUzRjAsIC8vIOWPsCwgIzI2NworICAgIDB4NTNGNywgLy8g5Y+3LCAjMTIxCisgICAgMHg1M0Y4LCAvLyDlj7gsICMxNTAKKyAgICAweDU0MDQsIC8vIOWQhCwgIzQ5MQorICAgIDB4NTQwOCwgLy8g5ZCILCAjMTE1CisgICAgMHg1NDBDLCAvLyDlkIwsICMxODkKKyAgICAweDU0MEQsIC8vIOWQjSwgIzEyNworICAgIDB4NTQwRSwgLy8g5ZCOLCAjNzUKKyAgICAweDU0MTEsIC8vIOWQkSwgIzQ1OQorICAgIDB4NTQyNywgLy8g5ZCnLCAjMzUzCisgICAgMHg1NDRBLCAvLyDlkYosICMzMTgKKyAgICAweDU0NTgsIC8vIOWRmCwgIzIzMgorICAgIDB4NTQ2OCwgLy8g5ZGoLCAjMzQ3CisgICAgMHg1NDhDLCAvLyDlkowsICM0MworICAgIDB4NTRDMSwgLy8g5ZOBLCAjMzYKKyAgICAweDU1NDYsIC8vIOWVhiwgIzE0OAorICAgIDB4NTY2OCwgLy8g5ZmoLCAjMjI4CisgICAgMHg1NkRCLCAvLyDlm5ssICMzNTIKKyAgICAweDU2REUsIC8vIOWbniwgIzM4CisgICAgMHg1NkUwLCAvLyDlm6AsICMzNTUKKyAgICAweDU2RTIsIC8vIOWboiwgIzQxMgorICAgIDB4NTZFRCwgLy8g5ZutLCAjNDcwCisgICAgMHg1NkZELCAvLyDlm70sICMxMgorICAgIDB4NTZGRSwgLy8g5Zu+LCAjMzIKKyAgICAweDU3MjgsIC8vIOWcqCwgIzEwCisgICAgMHg1NzMwLCAvLyDlnLAsICMzMAorICAgIDB4NTczQSwgLy8g5Zy6LCAjMTc3CisgICAgMHg1NzVCLCAvLyDlnZssICMzNjQKKyAgICAweDU3OEIsIC8vIOWeiywgIzI3NAorICAgIDB4NTdDRSwgLy8g5Z+OLCAjMTcyCisgICAgMHg1N0ZBLCAvLyDln7osICMzMTUKKyAgICAweDU4RUIsIC8vIOWjqywgIzQzNAorICAgIDB4NThGMCwgLy8g5aOwLCAjMzk3CisgICAgMHg1OTA0LCAvLyDlpIQsICM0MTYKKyAgICAweDU5MDcsIC8vIOWkhywgIzI3MAorICAgIDB4NTkwRCwgLy8g5aSNLCAjMTIyCisgICAgMHg1OTE2LCAvLyDlpJYsICMxOTAKKyAgICAweDU5MUEsIC8vIOWkmiwgIzQwCisgICAgMHg1OTI3LCAvLyDlpKcsICM4CisgICAgMHg1OTI5LCAvLyDlpKksICM1MgorICAgIDB4NTkyQSwgLy8g5aSqLCAjNDU2CisgICAgMHg1OTM0LCAvLyDlpLQsICMyNTgKKyAgICAweDU5NzMsIC8vIOWlsywgIzY1CisgICAgMHg1OTdELCAvLyDlpb0sICM2MgorICAgIDB4NTk4MiwgLy8g5aaCLCAjMTM1CisgICAgMHg1QTMxLCAvLyDlqLEsICM0NTIKKyAgICAweDVCNTAsIC8vIOWtkCwgIzM3CisgICAgMHg1QjU3LCAvLyDlrZcsICMyODUKKyAgICAweDVCNjYsIC8vIOWtpiwgIzE5CisgICAgMHg1Qjg5LCAvLyDlroksICMxNDQKKyAgICAweDVCOEMsIC8vIOWujCwgIzQ2OQorICAgIDB4NUI5QSwgLy8g5a6aLCAjMTc5CisgICAgMHg1QjlELCAvLyDlrp0sICMxODgKKyAgICAweDVCOUUsIC8vIOWuniwgIzE1NAorICAgIDB4NUJBMiwgLy8g5a6iLCAjMTc0CisgICAgMHg1QkI2LCAvLyDlrrYsICMyNgorICAgIDB4NUJCOSwgLy8g5a65LCAjMzA3CisgICAgMHg1QkM2LCAvLyDlr4YsICM0NzEKKyAgICAweDVCRjksIC8vIOWvuSwgIzkwCisgICAgMHg1QkZDLCAvLyDlr7wsICMzNDgKKyAgICAweDVDMDYsIC8vIOWwhiwgIzI2NQorICAgIDB4NUMwRiwgLy8g5bCPLCAjMjgKKyAgICAweDVDMTEsIC8vIOWwkSwgIzM3OQorICAgIDB4NUMxNCwgLy8g5bCULCAjNDkwCisgICAgMHg1QzMxLCAvLyDlsLEsICMxMDEKKyAgICAweDVDNTUsIC8vIOWxlSwgIzI5MQorICAgIDB4NUM3MSwgLy8g5bGxLCAjMjM5CisgICAgMHg1RERFLCAvLyDlt54sICMyMjcKKyAgICAweDVERTUsIC8vIOW3pSwgIzczCisgICAgMHg1REYxLCAvLyDlt7EsICM0ODAKKyAgICAweDVERjIsIC8vIOW3siwgIzMxMAorICAgIDB4NUUwMiwgLy8g5biCLCAjNzgKKyAgICAweDVFMDMsIC8vIOW4gywgIzM1MAorICAgIDB4NUUwOCwgLy8g5biILCAjMjc3CisgICAgMHg1RTE2LCAvLyDluJYsICMzOTYKKyAgICAweDVFMjYsIC8vIOW4piwgIzQ0OQorICAgIDB4NUUyRSwgLy8g5biuLCAjNDYxCisgICAgMHg1RTM4LCAvLyDluLgsICMzMTkKKyAgICAweDVFNzMsIC8vIOW5sywgIzIxNworICAgIDB4NUU3NCwgLy8g5bm0LCAjMjAKKyAgICAweDVFNzYsIC8vIOW5tiwgIzQ0MAorICAgIDB4NUU3RiwgLy8g5bm/LCAjMTY2CisgICAgMHg1RTkzLCAvLyDlupMsICM0NDYKKyAgICAweDVFOTQsIC8vIOW6lCwgIzE4NworICAgIDB4NUU5NywgLy8g5bqXLCAjMzIwCisgICAgMHg1RUE2LCAvLyDluqYsICMxMTQKKyAgICAweDVFQjcsIC8vIOW6tywgIzQ5OQorICAgIDB4NUVGQSwgLy8g5bu6LCAjMjExCisgICAgMHg1RjAwLCAvLyDlvIAsICM3MgorICAgIDB4NUYwRiwgLy8g5byPLCAjMjA3CisgICAgMHg1RjE1LCAvLyDlvJUsICM0OTUKKyAgICAweDVGMjAsIC8vIOW8oCwgIzM4NQorICAgIDB4NUYzQSwgLy8g5by6LCAjNDA0CisgICAgMHg1RjUzLCAvLyDlvZMsICMyMzMKKyAgICAweDVGNTUsIC8vIOW9lSwgIzE0NgorICAgIDB4NUY2MiwgLy8g5b2iLCAjNDk0CisgICAgMHg1RjY5LCAvLyDlvaksICMzNTYKKyAgICAweDVGNzEsIC8vIOW9sSwgIzIxNAorICAgIDB4NUY4OCwgLy8g5b6ILCAjMzAwCisgICAgMHg1Rjk3LCAvLyDlvpcsICMxOTMKKyAgICAweDVGQUUsIC8vIOW+riwgIzI0NQorICAgIDB4NUZDMywgLy8g5b+DLCAjNzAKKyAgICAweDVGRUIsIC8vIOW/qywgIzMyNAorICAgIDB4NjAwMSwgLy8g5oCBLCAjNTA4CisgICAgMHg2MDBFLCAvLyDmgI4sICMzNzAKKyAgICAweDYwMjcsIC8vIOaApywgIzk5CisgICAgMHg2MDNCLCAvLyDmgLssICMzOTgKKyAgICAweDYwNkYsIC8vIOaBrywgIzE3NgorICAgIDB4NjBBOCwgLy8g5oKoLCAjMjUxCisgICAgMHg2MEM1LCAvLyDmg4UsICM4NworICAgIDB4NjBGMywgLy8g5oOzLCAjMjkwCisgICAgMHg2MTBGLCAvLyDmhI8sICMxODQKKyAgICAweDYxMUYsIC8vIOaEnywgIzI1MworICAgIDB4NjIwRiwgLy8g5oiPLCAjMjM3CisgICAgMHg2MjEwLCAvLyDmiJAsICM3MQorICAgIDB4NjIxMSwgLy8g5oiRLCAjMTEKKyAgICAweDYyMTYsIC8vIOaIliwgIzMyMQorICAgIDB4NjIxOCwgLy8g5oiYLCAjMzY5CisgICAgMHg2MjM3LCAvLyDmiLcsICMyMTUKKyAgICAweDYyM0YsIC8vIOaIvywgIzIzNgorICAgIDB4NjI0MCwgLy8g5omALCAjMTQ3CisgICAgMHg2MjRCLCAvLyDmiYssICM1NQorICAgIDB4NjI0RCwgLy8g5omNLCAjNDA3CisgICAgMHg2MjUzLCAvLyDmiZMsICMyODEKKyAgICAweDYyODAsIC8vIOaKgCwgIzIwMworICAgIDB4NjI5NSwgLy8g5oqVLCAjNDA4CisgICAgMHg2MkE0LCAvLyDmiqQsICM1MDIKKyAgICAweDYyQTUsIC8vIOaKpSwgIzExMworICAgIDB4NjJEQiwgLy8g5oubLCAjMzYzCisgICAgMHg2MzAxLCAvLyDmjIEsICM0MDMKKyAgICAweDYzMDcsIC8vIOaMhywgIzQxNAorICAgIDB4NjM2RSwgLy8g5o2uLCAjNDA5CisgICAgMHg2MzkyLCAvLyDmjpIsICMzNzcKKyAgICAweDYzQTUsIC8vIOaOpSwgIzI2NgorICAgIDB4NjNBOCwgLy8g5o6oLCAjMjQ0CisgICAgMHg2M0QwLCAvLyDmj5AsICMxODEKKyAgICAweDY0MUMsIC8vIOaQnCwgIzMwMQorICAgIDB4NjRBRCwgLy8g5pKtLCAjNDAxCisgICAgMHg2NTJGLCAvLyDmlK8sICM0MDAKKyAgICAweDY1MzYsIC8vIOaUtiwgIzE1OAorICAgIDB4NjUzRSwgLy8g5pS+LCAjMzE3CisgICAgMHg2NTNGLCAvLyDmlL8sICMzODAKKyAgICAweDY1NDgsIC8vIOaViCwgIzQ5NgorICAgIDB4NjU1OSwgLy8g5pWZLCAjMTcwCisgICAgMHg2NTcwLCAvLyDmlbAsICMxMzYKKyAgICAweDY1ODcsIC8vIOaWhywgIzIxCisgICAgMHg2NTk5LCAvLyDmlpksICMyOTUKKyAgICAweDY1QUYsIC8vIOaWrywgIzQ3MworICAgIDB4NjVCMCwgLy8g5pawLCAjMTQKKyAgICAweDY1QjksIC8vIOaWuSwgIzY4CisgICAgMHg2NUM1LCAvLyDml4UsICM0NTcKKyAgICAweDY1RTAsIC8vIOaXoCwgIzE2NAorICAgIDB4NjVFNSwgLy8g5pelLCAjNTAKKyAgICAweDY1RjYsIC8vIOaXtiwgIzE4CisgICAgMHg2NjBFLCAvLyDmmI4sICMxMzIKKyAgICAweDY2MTMsIC8vIOaYkywgIzQyOAorICAgIDB4NjYxRiwgLy8g5pifLCAjMjQwCisgICAgMHg2NjJGLCAvLyDmmK8sICM2CisgICAgMHg2NjNFLCAvLyDmmL4sICM0ODYKKyAgICAweDY2RjQsIC8vIOabtCwgIzEwMworICAgIDB4NjcwMCwgLy8g5pyALCAjNjEKKyAgICAweDY3MDgsIC8vIOaciCwgIzgwCisgICAgMHg2NzA5LCAvLyDmnIksICM1CisgICAgMHg2NzBELCAvLyDmnI0sICM5NAorICAgIDB4NjcxRiwgLy8g5pyfLCAjMTM5CisgICAgMHg2NzJDLCAvLyDmnKwsICM1NgorICAgIDB4NjcyRiwgLy8g5pyvLCAjMjE2CisgICAgMHg2NzNBLCAvLyDmnLosICMyNworICAgIDB4Njc0MywgLy8g5p2DLCAjMjUwCisgICAgMHg2NzYxLCAvLyDmnaEsICMzMDkKKyAgICAweDY3NjUsIC8vIOadpSwgIzQyCisgICAgMHg2NzdGLCAvLyDmnb8sICM1MDUKKyAgICAweDY3OTcsIC8vIOaelywgIzQ3NQorICAgIDB4Njc5QywgLy8g5p6cLCAjMjEyCisgICAgMHg2N0U1LCAvLyDmn6UsICMxNjUKKyAgICAweDY4MDcsIC8vIOaghywgIzI2OQorICAgIDB4NjgyMSwgLy8g5qChLCAjNDYyCisgICAgMHg2ODM3LCAvLyDmoLcsICMzMTQKKyAgICAweDY4M0MsIC8vIOagvCwgIzIzOAorICAgIDB4Njg0OCwgLy8g5qGILCAjMzc4CisgICAgMHg2OTdDLCAvLyDmpbwsICMzNDIKKyAgICAweDZBMjEsIC8vIOaooSwgIzQxMworICAgIDB4NkIyMSwgLy8g5qyhLCAjMjYzCisgICAgMHg2QjIyLCAvLyDmrKIsICM0NDMKKyAgICAweDZCM0UsIC8vIOasviwgIzM1OAorICAgIDB4NkI2MywgLy8g5q2jLCAjMjE5CisgICAgMHg2QjY0LCAvLyDmraQsICMzNjIKKyAgICAweDZCRDQsIC8vIOavlCwgIzI5OAorICAgIDB4NkMxMSwgLy8g5rCRLCAjMjc5CisgICAgMHg2QzE0LCAvLyDmsJQsICMzMDMKKyAgICAweDZDMzQsIC8vIOawtCwgIzE2MworICAgIDB4NkM0MiwgLy8g5rGCLCAjMzczCisgICAgMHg2QzVGLCAvLyDmsZ8sICMzMzYKKyAgICAweDZDQTEsIC8vIOayoSwgIzIyOQorICAgIDB4NkNCQiwgLy8g5rK7LCAjNDI1CisgICAgMHg2Q0Q1LCAvLyDms5UsICM4NQorICAgIDB4NkNFOCwgLy8g5rOoLCAjMTE5CisgICAgMHg2RDNCLCAvLyDmtLssICMyMzEKKyAgICAweDZENDEsIC8vIOa1gSwgIzI4MAorICAgIDB4NkQ0QiwgLy8g5rWLLCAjNDYwCisgICAgMHg2RDc3LCAvLyDmtbcsICMxMjQKKyAgICAweDZEODgsIC8vIOa2iCwgIzQxNQorICAgIDB4NkRGMSwgLy8g5rexLCAjNDc3CisgICAgMHg2RTA1LCAvLyDmuIUsICMzMTEKKyAgICAweDZFMzgsIC8vIOa4uCwgIzgxCisgICAgMHg2RTkwLCAvLyDmupAsICMzMjUKKyAgICAweDcwNkIsIC8vIOeBqywgIzQ5OAorICAgIDB4NzBCOSwgLy8g54K5LCAjNTgKKyAgICAweDcwRUQsIC8vIOeDrSwgIzE4MworICAgIDB4NzEzNiwgLy8g54S2LCAjMzA4CisgICAgMHg3MTY3LCAvLyDnhacsICM0MzEKKyAgICAweDcyMzEsIC8vIOeIsSwgIzIyMworICAgIDB4NzI0NywgLy8g54mHLCAjMTI4CisgICAgMHg3MjQ4LCAvLyDniYgsICM5MQorICAgIDB4NzI0QywgLy8g54mMLCAjNDI5CisgICAgMHg3MjY5LCAvLyDniaksICMxNjkKKyAgICAweDcyNzksIC8vIOeJuSwgIzIyNAorICAgIDB4NzM4QiwgLy8g546LLCAjMzUxCisgICAgMHg3M0E5LCAvLyDnjqksICM0NzYKKyAgICAweDczQjAsIC8vIOeOsCwgIzEyNQorICAgIDB4NzQwMywgLy8g55CDLCAjMzY3CisgICAgMHg3NDA2LCAvLyDnkIYsICM2OQorICAgIDB4NzUxRiwgLy8g55SfLCAjMjQKKyAgICAweDc1MjgsIC8vIOeUqCwgIzE3CisgICAgMHg3NTMxLCAvLyDnlLEsICM0NDEKKyAgICAweDc1MzUsIC8vIOeUtSwgIzM0CisgICAgMHg3NTM3LCAvLyDnlLcsICMyNzUKKyAgICAweDc1NEMsIC8vIOeVjCwgIzQxOQorICAgIDB4NzVDNSwgLy8g55eFLCAjMzcxCisgICAgMHg3NjdCLCAvLyDnmbssICMyMDQKKyAgICAweDc2N0QsIC8vIOeZvSwgIzMzOAorICAgIDB4NzY3RSwgLy8g55m+LCAjMTU3CisgICAgMHg3Njg0LCAvLyDnmoQsICMxCisgICAgMHg3NkQ4LCAvLyDnm5gsICM0OTMKKyAgICAweDc2RUUsIC8vIOebriwgIzI2MQorICAgIDB4NzZGNCwgLy8g55u0LCAjMzkxCisgICAgMHg3NkY4LCAvLyDnm7gsICMxNDMKKyAgICAweDc3MDEsIC8vIOecgSwgIzQ2NAorICAgIDB4NzcwQiwgLy8g55yLLCAjNTQKKyAgICAweDc3MUYsIC8vIOecnywgIzI0OQorICAgIDB4Nzc0MCwgLy8g552ALCAjMzAyCisgICAgMHg3N0U1LCAvLyDnn6UsICMxNDIKKyAgICAweDc4MDEsIC8vIOeggSwgIzI1NworICAgIDB4NzgxNCwgLy8g56CULCAjMzg3CisgICAgMHg3OTNBLCAvLyDnpLosICMzMzQKKyAgICAweDc5M0UsIC8vIOekviwgIzM0MworICAgIDB4Nzk1RSwgLy8g56WeLCAjMzMwCisgICAgMHg3OThGLCAvLyDnpo8sICM1MDkKKyAgICAweDc5QkIsIC8vIOemuywgIzQ1NAorICAgIDB4NzlDRCwgLy8g56eNLCAjMjc4CisgICAgMHg3OUQxLCAvLyDnp5EsICMxMjYKKyAgICAweDc5RUYsIC8vIOenrywgIzM5MAorICAgIDB4N0EwQiwgLy8g56iLLCAjMjA5CisgICAgMHg3QTc2LCAvLyDnqbYsICM1MDQKKyAgICAweDdBN0EsIC8vIOepuiwgIzMxMgorICAgIDB4N0FDQiwgLy8g56uLLCAjMzkzCisgICAgMHg3QUQ5LCAvLyDnq5ksICMxMDcKKyAgICAweDdBRTAsIC8vIOeroCwgIzMwNAorICAgIDB4N0IyQywgLy8g56ysLCAjOTYKKyAgICAweDdCNDksIC8vIOetiSwgIzIxMAorICAgIDB4N0I1NCwgLy8g562ULCAjMjU2CisgICAgMHg3QjgwLCAvLyDnroAsICM0NzQKKyAgICAweDdCQTEsIC8vIOeuoSwgIzIyMQorICAgIDB4N0M3QiwgLy8g57G7LCAjMjQ2CisgICAgMHg3Q0JFLCAvLyDnsr4sICMyMjYKKyAgICAweDdDRkIsIC8vIOezuywgIzg5CisgICAgMHg3RDIyLCAvLyDntKIsICMzNTQKKyAgICAweDdFQTIsIC8vIOe6oiwgIzQxNworICAgIDB4N0VBNywgLy8g57qnLCAjMTc4CisgICAgMHg3RUJGLCAvLyDnur8sICMxMDgKKyAgICAweDdFQzQsIC8vIOe7hCwgIzM4OQorICAgIDB4N0VDNiwgLy8g57uGLCAjNDQyCisgICAgMHg3RUNGLCAvLyDnu48sICM3NAorICAgIDB4N0VEMywgLy8g57uTLCAjMzMzCisgICAgMHg3RUQ5LCAvLyDnu5ksICMzODQKKyAgICAweDdFREMsIC8vIOe7nCwgIzQ3MgorICAgIDB4N0VERiwgLy8g57ufLCAjMzQ0CisgICAgMHg3RjE2LCAvLyDnvJYsICM0MjQKKyAgICAweDdGNTEsIC8vIOe9kSwgIzkKKyAgICAweDdGNkUsIC8vIOe9riwgIzQxMQorICAgIDB4N0Y4RSwgLy8g576OLCAjNjAKKyAgICAweDgwMDEsIC8vIOiAgSwgIzI5MgorICAgIDB4ODAwMywgLy8g6ICDLCAjMjg4CisgICAgMHg4MDA1LCAvLyDogIUsICMxMDYKKyAgICAweDgwMEMsIC8vIOiAjCwgIzI5NworICAgIDB4ODA1NCwgLy8g6IGULCAjMTU5CisgICAgMHg4MEIyLCAvLyDogrIsICMzMjcKKyAgICAweDgwRkQsIC8vIOiDvSwgIzU5CisgICAgMHg4MUVBLCAvLyDoh6osICM3NworICAgIDB4ODI3MiwgLy8g6ImyLCAjMTk4CisgICAgMHg4MjgyLCAvLyDoioIsICMzNjEKKyAgICAweDgyQjEsIC8vIOiKsSwgIzI5OQorICAgIDB4ODJGMSwgLy8g6IuxLCAjMzE2CisgICAgMHg4MzUwLCAvLyDojZAsICM0MDIKKyAgICAweDgzNkYsIC8vIOiNrywgIzQ4MQorICAgIDB4ODQyNSwgLy8g6JClLCAjMzk0CisgICAgMHg4NUNGLCAvLyDol48sICMzMzcKKyAgICAweDg4NEMsIC8vIOihjCwgIzQxCisgICAgMHg4ODY4LCAvLyDooagsICMxMDQKKyAgICAweDg4QUIsIC8vIOiiqywgIzI4OQorICAgIDB4ODhDNSwgLy8g6KOFLCAjMTYxCisgICAgMHg4OTdGLCAvLyDopb8sICMxOTkKKyAgICAweDg5ODEsIC8vIOimgSwgIzQ4CisgICAgMHg4OUMxLCAvLyDop4EsICMzNjAKKyAgICAweDg5QzIsIC8vIOingiwgIzQyMworICAgIDB4ODlDNCwgLy8g6KeELCAjNDUzCisgICAgMHg4OUM2LCAvLyDop4YsICMxMjAKKyAgICAweDg5RTMsIC8vIOinoywgIzI2NAorICAgIDB4OEEwMCwgLy8g6KiALCAjNDMzCisgICAgMHg4QkExLCAvLyDorqEsICMxOTEKKyAgICAweDhCQTQsIC8vIOiupCwgIzQ4MgorICAgIDB4OEJBOSwgLy8g6K6pLCAjNDIxCisgICAgMHg4QkFFLCAvLyDorq4sICM0MjcKKyAgICAweDhCQUYsIC8vIOiurywgIzM4OAorICAgIDB4OEJCMCwgLy8g6K6wLCAjMjczCisgICAgMHg4QkJBLCAvLyDorrosICM2NgorICAgIDB4OEJCRSwgLy8g6K6+LCAjMTYyCisgICAgMHg4QkMxLCAvLyDor4EsICMyMDEKKyAgICAweDhCQzQsIC8vIOivhCwgIzExMQorICAgIDB4OEJDNiwgLy8g6K+GLCAjNDYzCisgICAgMHg4QkQ1LCAvLyDor5UsICMzMjMKKyAgICAweDhCREQsIC8vIOivnSwgIzI0NworICAgIDB4OEJFMiwgLy8g6K+iLCAjNDMyCisgICAgMHg4QkU1LCAvLyDor6UsICM0NDcKKyAgICAweDhCRTYsIC8vIOivpiwgIzQ5NworICAgIDB4OEJFRCwgLy8g6K+tLCAjMjY4CisgICAgMHg4QkY0LCAvLyDor7QsICMxMTIKKyAgICAweDhCRjcsIC8vIOivtywgIzIxMworICAgIDB4OEJGQiwgLy8g6K+7LCAjMzQxCisgICAgMHg4QzAzLCAvLyDosIMsICM0MzgKKyAgICAweDhEMjIsIC8vIOi0oiwgIzQ4OAorICAgIDB4OEQyOCwgLy8g6LSoLCAjMzg2CisgICAgMHg4RDJELCAvLyDotK0sICMyNjAKKyAgICAweDhEMzQsIC8vIOi0tCwgIzUxMAorICAgIDB4OEQzOSwgLy8g6LS5LCAjMjQyCisgICAgMHg4RDQ0LCAvLyDotYQsICMxMTYKKyAgICAweDhENzcsIC8vIOi1tywgIzIyMAorICAgIDB4OEQ4NSwgLy8g6LaFLCAjNDA2CisgICAgMHg4REVGLCAvLyDot68sICMyMzUKKyAgICAweDhFQUIsIC8vIOi6qywgIzI2MgorICAgIDB4OEY2NiwgLy8g6L2mLCAjODIKKyAgICAweDhGNkMsIC8vIOi9rCwgIzMyMgorICAgIDB4OEY3RCwgLy8g6L29LCAjMTc1CisgICAgMHg4RkJFLCAvLyDovr4sICM0MzUKKyAgICAweDhGQzcsIC8vIOi/hywgIzExOAorICAgIDB4OEZEMCwgLy8g6L+QLCAjMzU3CisgICAgMHg4RkQxLCAvLyDov5EsICM0OTIKKyAgICAweDhGRDgsIC8vIOi/mCwgIzE3MQorICAgIDB4OEZEOSwgLy8g6L+ZLCAjNTcKKyAgICAweDhGREIsIC8vIOi/mywgIzE2MAorICAgIDB4OEZERSwgLy8g6L+eLCAjNDg5CisgICAgMHg5MDA5LCAvLyDpgIksICMzMjgKKyAgICAweDkwMUEsIC8vIOmAmiwgIzEzNworICAgIDB4OTAxRiwgLy8g6YCfLCAjNDU4CisgICAgMHg5MDIwLCAvLyDpgKAsICM1MTEKKyAgICAweDkwNTMsIC8vIOmBkywgIzc5CisgICAgMHg5MEEzLCAvLyDpgqMsICMzMDUKKyAgICAweDkwRTgsIC8vIOmDqCwgIzEwMgorICAgIDB4OTBGRCwgLy8g6YO9LCAjMTY3CisgICAgMHg5MTRELCAvLyDphY0sICM0NzkKKyAgICAweDkxNTIsIC8vIOmFkiwgIzQ0NAorICAgIDB4OTFDQywgLy8g6YeMLCAjMTk2CisgICAgMHg5MUNELCAvLyDph40sICMyMzAKKyAgICAweDkxQ0YsIC8vIOmHjywgIzI0OAorICAgIDB4OTFEMSwgLy8g6YeRLCAjMTM0CisgICAgMHg5NTAwLCAvLyDplIAsICM0NjUKKyAgICAweDk1N0YsIC8vIOmVvywgIzE1MgorICAgIDB4OTVFOCwgLy8g6ZeoLCAjMTg1CisgICAgMHg5NUVFLCAvLyDpl64sICM5MgorICAgIDB4OTVGNCwgLy8g6Ze0LCAjODgKKyAgICAweDk1RkIsIC8vIOmXuywgIzMxMworICAgIDB4OTYwNSwgLy8g6ZiFLCAjNDY3CisgICAgMHg5NjMzLCAvLyDpmLMsICM0MjAKKyAgICAweDk2NDUsIC8vIOmZhSwgIzUwMQorICAgIDB4OTY1MCwgLy8g6ZmQLCAjMjg2CisgICAgMHg5NjYyLCAvLyDpmaIsICMyNzYKKyAgICAweDk2QzYsIC8vIOmbhiwgIzI4NAorICAgIDB4OTcwMCwgLy8g6ZyALCAjNDA1CisgICAgMHg5NzYyLCAvLyDpnaIsICMxMjMKKyAgICAweDk3RjMsIC8vIOmfsywgIzMzNQorICAgIDB4OTg3NSwgLy8g6aG1LCAjNjMKKyAgICAweDk4NzksIC8vIOmhuSwgIzUwNgorICAgIDB4OTg5MSwgLy8g6aKRLCAjMjAwCisgICAgMHg5ODk4LCAvLyDpopgsICMxMTAKKyAgICAweDk4Q0UsIC8vIOmjjiwgIzI1MgorICAgIDB4OThERiwgLy8g6aOfLCAjNDQ1CisgICAgMHg5OTk2LCAvLyDpppYsICMxNDkKKyAgICAweDk5OTksIC8vIOmmmSwgIzUxMgorICAgIDB4OUE2QywgLy8g6amsLCAjMzkyCisgICAgMHg5QThDLCAvLyDpqowsICMzODIKKyAgICAweDlBRDgsIC8vIOmrmCwgIzY3CisgICAgMHg5Rjk5LCAvLyDpvpksICM0MjYKK307CisvLyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgc2FtcGxlIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGNoYXJhY3RlcnMKK3N0YXRpYyBjb25zdCBmbG9hdCBmcmVxdWVudF96aENOX2NvdmVyYWdlPTAuNzE4OTUwMzY5MzM5OTczOworCisvLyBUaGUgNTEyIG1vc3QgZnJlcXVlbnRseSBvY2N1cmluZyBjaGFyYWN0ZXJzIGZvciB0aGUgemhUVyBsYW5ndWFnZSBpbiBhIHNhbXBsZSBvZiB0aGUgSW50ZXJuZXQuCisvLyBPcmRlcmVkIGJ5IGNvZGVwb2ludCwgY29tbWVudCBzaG93cyBjaGFyYWN0ZXIgYW5kIHJhbmtpbmcgYnkgZnJlcXVlbmN5Citjb25zdCB1aW50MTZfdCBmcmVxdWVudF96aFRXW10gPSB7CisgICAgMHg0RTAwLCAvLyDkuIAsICMyCisgICAgMHg0RTA5LCAvLyDkuIksICMxMzEKKyAgICAweDRFMEEsIC8vIOS4iiwgIzEyCisgICAgMHg0RTBCLCAvLyDkuIssICMzNworICAgIDB4NEUwRCwgLy8g5LiNLCAjNgorICAgIDB4NEUxNiwgLy8g5LiWLCAjMzEyCisgICAgMHg0RTI2LCAvLyDkuKYsICM0MzQKKyAgICAweDRFMkQsIC8vIOS4rSwgIzkKKyAgICAweDRFM0IsIC8vIOS4uywgIzk3CisgICAgMHg0RTRCLCAvLyDkuYssICM1NQorICAgIDB4NEU1RiwgLy8g5LmfLCAjOTUKKyAgICAweDRFODYsIC8vIOS6hiwgIzE5CisgICAgMHg0RThCLCAvLyDkuossICMxMjgKKyAgICAweDRFOEMsIC8vIOS6jCwgIzE4NworICAgIDB4NEU5NCwgLy8g5LqULCAjMzM5CisgICAgMHg0RTlCLCAvLyDkupssICM0MzUKKyAgICAweDRFOUUsIC8vIOS6niwgIzQzMgorICAgIDB4NEVBNCwgLy8g5LqkLCAjMjY0CisgICAgMHg0RUFCLCAvLyDkuqssICMxNjAKKyAgICAweDRFQkEsIC8vIOS6uiwgIzMKKyAgICAweDRFQzAsIC8vIOS7gCwgIzQ4MworICAgIDB4NEVDQSwgLy8g5LuKLCAjMzgwCisgICAgMHg0RUNCLCAvLyDku4ssICM0NjgKKyAgICAweDRFRDYsIC8vIOS7liwgIzY1CisgICAgMHg0RUUzLCAvLyDku6MsICMyODQKKyAgICAweDRFRTUsIC8vIOS7pSwgIzI2CisgICAgMHg0RUY2LCAvLyDku7YsICMyMzQKKyAgICAweDRFRkIsIC8vIOS7uywgIzM4MQorICAgIDB4NEVGRCwgLy8g5Lu9LCAjNDQ3CisgICAgMHg0RjQ2LCAvLyDkvYYsICMyODEKKyAgICAweDRGNEQsIC8vIOS9jSwgIzIwMgorICAgIDB4NEY0RiwgLy8g5L2PLCAjNDcxCisgICAgMHg0RjU1LCAvLyDkvZUsICMzMzQKKyAgICAweDRGNUMsIC8vIOS9nCwgIzU2CisgICAgMHg0RjYwLCAvLyDkvaAsICM2NAorICAgIDB4NEY3RiwgLy8g5L2/LCAjMjM2CisgICAgMHg0Rjg2LCAvLyDkvoYsICMzOAorICAgIDB4NEY5QiwgLy8g5L6bLCAjMzk3CisgICAgMHg0RkJGLCAvLyDkvr8sICM0NDAKKyAgICAweDRGQzIsIC8vIOS/giwgIzUwNgorICAgIDB4NEZERCwgLy8g5L+dLCAjMTYxCisgICAgMHg0RkUxLCAvLyDkv6EsICMyNjgKKyAgICAweDRGRUUsIC8vIOS/riwgIzQ3MworICAgIDB4NTAwQiwgLy8g5YCLLCAjMjcKKyAgICAweDUwMTEsIC8vIOWAkSwgIzEwOQorICAgIDB4NTA1QSwgLy8g5YGaLCAjMzgzCisgICAgMHg1MDY1LCAvLyDlgaUsICM0MTUKKyAgICAweDUwOTksIC8vIOWCmSwgIzQ2MQorICAgIDB4NTBCMywgLy8g5YKzLCAjMjc3CisgICAgMHg1MENGLCAvLyDlg48sICM0MDMKKyAgICAweDUwRjksIC8vIOWDuSwgIzkzCisgICAgMHg1MTJBLCAvLyDlhKosICMzOTYKKyAgICAweDUxNDMsIC8vIOWFgywgIzE1OAorICAgIDB4NTE0OCwgLy8g5YWILCAjMzgyCisgICAgMHg1MTQ5LCAvLyDlhYksICMyMTYKKyAgICAweDUxNEQsIC8vIOWFjSwgIzMyMQorICAgIDB4NTE1MiwgLy8g5YWSLCAjMzc0CisgICAgMHg1MTY1LCAvLyDlhaUsICM1OAorICAgIDB4NTE2NywgLy8g5YWnLCAjMTA2CisgICAgMHg1MTY4LCAvLyDlhagsICM2NworICAgIDB4NTE2OSwgLy8g5YWpLCAjMzIyCisgICAgMHg1MTZDLCAvLyDlhawsICM1MworICAgIDB4NTE2RCwgLy8g5YWtLCAjNDkzCisgICAgMHg1MTcxLCAvLyDlhbEsICM0NTYKKyAgICAweDUxNzYsIC8vIOWFtiwgIzE0OAorICAgIDB4NTE3NywgLy8g5YW3LCAjMzI4CisgICAgMHg1MThBLCAvLyDlhoosICMzNjAKKyAgICAweDUxOEQsIC8vIOWGjSwgIzMxMQorICAgIDB4NTFGQSwgLy8g5Ye6LCAjNDQKKyAgICAweDUyMDYsIC8vIOWIhiwgIzE1CisgICAgMHg1MjE3LCAvLyDliJcsICMyNTkKKyAgICAweDUyMjUsIC8vIOWIpSwgIzM2MQorICAgIDB4NTIyOSwgLy8g5YipLCAjMjUxCisgICAgMHg1MjMwLCAvLyDliLAsICMyOQorICAgIDB4NTI0NywgLy8g5YmHLCAjNTExCisgICAgMHg1MjRELCAvLyDliY0sICM4MgorICAgIDB4NTI3NSwgLy8g5Ym1LCAjNDA5CisgICAgMHg1MjlCLCAvLyDlipssICMxNzYKKyAgICAweDUyOUYsIC8vIOWKnywgIzQzMAorICAgIDB4NTJBMCwgLy8g5YqgLCAjODcKKyAgICAweDUyQTksIC8vIOWKqSwgIzQ2NQorICAgIDB4NTJENSwgLy8g5YuVLCAjNDgKKyAgICAweDUyRDksIC8vIOWLmSwgIzEwMgorICAgIDB4NTMwNSwgLy8g5YyFLCAjMjQ4CisgICAgMHg1MzE2LCAvLyDljJYsICMyMjMKKyAgICAweDUzMTcsIC8vIOWMlywgIzE0NQorICAgIDB4NTM0MCwgLy8g5Y2ALCAjNjAKKyAgICAweDUzNDEsIC8vIOWNgSwgIzI0MgorICAgIDB4NTM1NywgLy8g5Y2XLCAjMjYxCisgICAgMHg1MzVBLCAvLyDljZosICM0ODQKKyAgICAweDUzNjEsIC8vIOWNoSwgIzMyNworICAgIDB4NTM3MCwgLy8g5Y2wLCAjNDk4CisgICAgMHg1MzczLCAvLyDljbMsICMzNTEKKyAgICAweDUzOUYsIC8vIOWOnywgIzIzNworICAgIDB4NTNCQiwgLy8g5Y67LCAjMTkwCisgICAgMHg1M0MzLCAvLyDlj4MsICM0NDQKKyAgICAweDUzQzgsIC8vIOWPiCwgIzQyNgorICAgIDB4NTNDQSwgLy8g5Y+KLCAjMTM2CisgICAgMHg1M0NCLCAvLyDlj4ssICMxNDIKKyAgICAweDUzRDYsIC8vIOWPliwgIzQyMgorICAgIDB4NTNENywgLy8g5Y+XLCAjNDEwCisgICAgMHg1M0UzLCAvLyDlj6MsICMzNTcKKyAgICAweDUzRUEsIC8vIOWPqiwgIzI1MAorICAgIDB4NTNFRiwgLy8g5Y+vLCAjMzUKKyAgICAweDUzRjAsIC8vIOWPsCwgIzM0CisgICAgMHg1M0Y4LCAvLyDlj7gsICMyMjYKKyAgICAweDU0MDMsIC8vIOWQgywgIzM2MgorICAgIDB4NTQwNCwgLy8g5ZCELCAjNDU0CisgICAgMHg1NDA4LCAvLyDlkIgsICMxNDcKKyAgICAweDU0MEMsIC8vIOWQjCwgIzE3MworICAgIDB4NTQwRCwgLy8g5ZCNLCAjMTA4CisgICAgMHg1NDRBLCAvLyDlkYosICMxODYKKyAgICAweDU0OEMsIC8vIOWSjCwgIzEzMAorICAgIDB4NTRDMSwgLy8g5ZOBLCAjMjMKKyAgICAweDU0RTEsIC8vIOWToSwgIzE1MAorICAgIDB4NTU0NiwgLy8g5ZWGLCAjNzUKKyAgICAweDU1NEYsIC8vIOWVjywgIzEyMAorICAgIDB4NTU5QywgLy8g5ZacLCAjNTAyCisgICAgMHg1NUFFLCAvLyDllq4sICMyMTAKKyAgICAweDU1Q0UsIC8vIOWXjiwgIzQ0MworICAgIDB4NTY2OCwgLy8g5ZmoLCAjMzA1CisgICAgMHg1NkRCLCAvLyDlm5ssICMzMTgKKyAgICAweDU2REUsIC8vIOWbniwgIzU5CisgICAgMHg1NkUwLCAvLyDlm6AsICMyNTMKKyAgICAweDU3MEIsIC8vIOWciywgIzIxCisgICAgMHg1NzEyLCAvLyDlnJIsICMzNDUKKyAgICAweDU3MTYsIC8vIOWcliwgIzczCisgICAgMHg1NzE4LCAvLyDlnJgsICMzMzgKKyAgICAweDU3MjgsIC8vIOWcqCwgIzExCisgICAgMHg1NzMwLCAvLyDlnLAsICM1MAorICAgIDB4NTc4QiwgLy8g5Z6LLCAjMjcwCisgICAgMHg1N0NFLCAvLyDln44sICM0NjYKKyAgICAweDU3RkEsIC8vIOWfuiwgIzM0OQorICAgIDB4NTgzMSwgLy8g5aCxLCAjMTI3CisgICAgMHg1ODM0LCAvLyDloLQsICMxNjUKKyAgICAweDU4RUIsIC8vIOWjqywgIzM3MgorICAgIDB4NTkxNiwgLy8g5aSWLCAjMTUyCisgICAgMHg1OTFBLCAvLyDlpJosICM1NAorICAgIDB4NTkyNywgLy8g5aSnLCAjOAorICAgIDB4NTkyOSwgLy8g5aSpLCAjNDMKKyAgICAweDU5MkEsIC8vIOWkqiwgIzM0MworICAgIDB4NTk0NywgLy8g5aWHLCAjMzI1CisgICAgMHg1OTczLCAvLyDlpbMsICM4NQorICAgIDB4NTk3OSwgLy8g5aW5LCAjNDIwCisgICAgMHg1OTdELCAvLyDlpb0sICMyMgorICAgIDB4NTk4MiwgLy8g5aaCLCAjMTQ0CisgICAgMHg1QjUwLCAvLyDlrZAsICM0NgorICAgIDB4NUI1NywgLy8g5a2XLCAjMjc1CisgICAgMHg1Qjc4LCAvLyDlrbgsICM0OQorICAgIDB4NUI4OSwgLy8g5a6JLCAjMjM5CisgICAgMHg1QjhDLCAvLyDlrowsICMzMjAKKyAgICAweDVCOUEsIC8vIOWumiwgIzE1OQorICAgIDB4NUJBMiwgLy8g5a6iLCAjMTg4CisgICAgMHg1QkI2LCAvLyDlrrYsICMzMQorICAgIDB4NUJCOSwgLy8g5a65LCAjMjQ0CisgICAgMHg1QkU2LCAvLyDlr6YsICMxOTgKKyAgICAweDVCRjYsIC8vIOWvtiwgIzM2NworICAgIDB4NUMwNywgLy8g5bCHLCAjMjMyCisgICAgMHg1QzA4LCAvLyDlsIgsICMxMzMKKyAgICAweDVDMEIsIC8vIOWwiywgIzM1MgorICAgIDB4NUMwRCwgLy8g5bCNLCAjMTI2CisgICAgMHg1QzBFLCAvLyDlsI4sICM0MTgKKyAgICAweDVDMEYsIC8vIOWwjywgIzIwCisgICAgMHg1QzExLCAvLyDlsJEsICMzNjgKKyAgICAweDVDMzEsIC8vIOWwsSwgIzYzCisgICAgMHg1QzU1LCAvLyDlsZUsICMzNDEKKyAgICAweDVDNzEsIC8vIOWxsSwgIzI3MworICAgIDB4NURFNSwgLy8g5belLCAjMTIxCisgICAgMHg1REYxLCAvLyDlt7EsICM0MDIKKyAgICAweDVERjIsIC8vIOW3siwgIzI5OQorICAgIDB4NUUwMiwgLy8g5biCLCAjODEKKyAgICAweDVFMkIsIC8vIOW4qywgIzI2MgorICAgIDB4NUUzNiwgLy8g5bi2LCAjNDcwCisgICAgMHg1RTM4LCAvLyDluLgsICMzMDMKKyAgICAweDVFNzMsIC8vIOW5sywgIzI5NworICAgIDB4NUU3NCwgLy8g5bm0LCAjMzAKKyAgICAweDVFOTcsIC8vIOW6lywgIzE3MQorICAgIDB4NUVBNiwgLy8g5bqmLCAjMjIwCisgICAgMHg1RUI3LCAvLyDlurcsICM0NDEKKyAgICAweDVFRTMsIC8vIOW7oywgIzI3OQorICAgIDB4NUVGQSwgLy8g5bu6LCAjMjU0CisgICAgMHg1RjBGLCAvLyDlvI8sICMxNTUKKyAgICAweDVGMTUsIC8vIOW8lSwgIzM0NgorICAgIDB4NUYzNSwgLy8g5by1LCAjMzY2CisgICAgMHg1RjM3LCAvLyDlvLcsICM0MzcKKyAgICAweDVGNzEsIC8vIOW9sSwgIzk0CisgICAgMHg1Rjg4LCAvLyDlvogsICMxNzcKKyAgICAweDVGOEMsIC8vIOW+jCwgIzY2CisgICAgMHg1Rjk3LCAvLyDlvpcsICMxMTMKKyAgICAweDVGOUUsIC8vIOW+niwgIzQzNgorICAgIDB4NUZDMywgLy8g5b+DLCAjNTcKKyAgICAweDVGRUIsIC8vIOW/qywgIzI5MgorICAgIDB4NjAyNywgLy8g5oCnLCAjMTc1CisgICAgMHg2MDZGLCAvLyDmga8sICMzNzgKKyAgICAweDYwQTgsIC8vIOaCqCwgIzI1MgorICAgIDB4NjBDNSwgLy8g5oOFLCAjMTIzCisgICAgMHg2MEYzLCAvLyDmg7MsICMxNzgKKyAgICAweDYxMEYsIC8vIOaEjywgIzE2OAorICAgIDB4NjExQiwgLy8g5oSbLCAjMTI1CisgICAgMHg2MTFGLCAvLyDmhJ8sICMyMTEKKyAgICAweDYxQzksIC8vIOaHiSwgIzE2NAorICAgIDB4NjIxMCwgLy8g5oiQLCAjODYKKyAgICAweDYyMTEsIC8vIOaIkSwgIzcKKyAgICAweDYyMTYsIC8vIOaIliwgIzE5OQorICAgIDB4NjIzMCwgLy8g5oiwLCAjNDM4CisgICAgMHg2MjMyLCAvLyDmiLIsICMzMDkKKyAgICAweDYyMzYsIC8vIOaItiwgIzQ5NworICAgIDB4NjIzRiwgLy8g5oi/LCAjMjc0CisgICAgMHg2MjQwLCAvLyDmiYAsICM3OQorICAgIDB4NjI0QiwgLy8g5omLLCAjNjgKKyAgICAweDYyNEQsIC8vIOaJjSwgIzQwMAorICAgIDB4NjI1MywgLy8g5omTLCAjMjc4CisgICAgMHg2MjdFLCAvLyDmib4sICM0NDkKKyAgICAweDYyODAsIC8vIOaKgCwgIzMzMgorICAgIDB4NjI5NSwgLy8g5oqVLCAjNDI1CisgICAgMHg2MkM5LCAvLyDmi4ksICM1MDAKKyAgICAweDYyQ0QsIC8vIOaLjSwgIzM5OAorICAgIDB4NjMwNywgLy8g5oyHLCAjNDA3CisgICAgMHg2MzkyLCAvLyDmjpIsICM0NTgKKyAgICAweDYzQTUsIC8vIOaOpSwgIzMyNgorICAgIDB4NjNBOCwgLy8g5o6oLCAjMTUzCisgICAgMHg2M0QwLCAvLyDmj5AsICMyMzUKKyAgICAweDY0MUMsIC8vIOaQnCwgIzMxNAorICAgIDB4NjQ2OSwgLy8g5pGpLCAjNDcyCisgICAgMHg2NTM2LCAvLyDmlLYsICMyNDkKKyAgICAweDY1MzksIC8vIOaUuSwgIzUwOAorICAgIDB4NjUzRSwgLy8g5pS+LCAjMzMxCisgICAgMHg2NTNGLCAvLyDmlL8sICMyOTUKKyAgICAweDY1NTksIC8vIOaVmSwgIzE4NAorICAgIDB4NjU3NCwgLy8g5pW0LCAjMzk0CisgICAgMHg2NTc4LCAvLyDmlbgsICMxMzQKKyAgICAweDY1ODcsIC8vIOaWhywgIzE2CisgICAgMHg2NTk5LCAvLyDmlpksICMxNjcKKyAgICAweDY1QUYsIC8vIOaWrywgIzQ3NgorICAgIDB4NjVCMCwgLy8g5pawLCAjMTAKKyAgICAweDY1QjksIC8vIOaWuSwgIzk2CisgICAgMHg2NUJDLCAvLyDmlrwsICM3MAorICAgIDB4NjVDNSwgLy8g5peFLCAjMjg5CisgICAgMHg2NUU1LCAvLyDml6UsICMxOAorICAgIDB4NjYwRSwgLy8g5piOLCAjMTE4CisgICAgMHg2NjEzLCAvLyDmmJMsICM0ODIKKyAgICAweDY2MUYsIC8vIOaYnywgIzIwNQorICAgIDB4NjYyRiwgLy8g5pivLCAjNQorICAgIDB4NjY0MiwgLy8g5pmCLCAjMTMKKyAgICAweDY2RjQsIC8vIOabtCwgIzE0OQorICAgIDB4NjZGOCwgLy8g5pu4LCAjMjA5CisgICAgMHg2NzAwLCAvLyDmnIAsICM1MQorICAgIDB4NjcwMywgLy8g5pyDLCAjMTQKKyAgICAweDY3MDgsIC8vIOaciCwgIzI1CisgICAgMHg2NzA5LCAvLyDmnIksICM0CisgICAgMHg2NzBELCAvLyDmnI0sICM5OQorICAgIDB4NjcxRiwgLy8g5pyfLCAjMTM5CisgICAgMHg2NzJBLCAvLyDmnKosICM0MDQKKyAgICAweDY3MkMsIC8vIOacrCwgIzQ1CisgICAgMHg2NzcxLCAvLyDmnbEsICMyMjEKKyAgICAweDY3N0YsIC8vIOadvywgIzM2NAorICAgIDB4Njc5NywgLy8g5p6XLCAjMzMwCisgICAgMHg2NzlDLCAvLyDmnpwsICMxNzkKKyAgICAweDY3RTUsIC8vIOafpSwgIzI4MworICAgIDB4NjgzQywgLy8g5qC8LCAjMTU3CisgICAgMHg2ODQ4LCAvLyDmoYgsICMzOTIKKyAgICAweDY4OUQsIC8vIOainSwgIzQwNgorICAgIDB4Njk2RCwgLy8g5qWtLCAjMTAzCisgICAgMHg2QTAyLCAvLyDmqIIsICMxMTYKKyAgICAweDZBMTMsIC8vIOaokywgIzQxMQorICAgIDB4NkExOSwgLy8g5qiZLCAjMzg0CisgICAgMHg2QTIzLCAvLyDmqKMsICMzMDYKKyAgICAweDZBNUYsIC8vIOapnywgIzQwCisgICAgMHg2QUEyLCAvLyDmqqIsICMzNTkKKyAgICAweDZCMEEsIC8vIOasiiwgIzIyOAorICAgIDB4NkIyMSwgLy8g5qyhLCAjMjI3CisgICAgMHg2QjNFLCAvLyDmrL4sICMyNzYKKyAgICAweDZCNEMsIC8vIOatjCwgIzQ5NgorICAgIDB4NkI2MSwgLy8g5q2hLCAjNDI3CisgICAgMHg2QjYzLCAvLyDmraMsICMyMDYKKyAgICAweDZCNjQsIC8vIOatpCwgIzI0NworICAgIDB4NkJDRiwgLy8g5q+PLCAjMzkxCisgICAgMHg2QkQ0LCAvLyDmr5QsICMyNTcKKyAgICAweDZDMTEsIC8vIOawkSwgIzIzMAorICAgIDB4NkMyMywgLy8g5rCjLCAjMjAwCisgICAgMHg2QzM0LCAvLyDmsLQsICMxNDAKKyAgICAweDZDNDIsIC8vIOaxgiwgIzUwMQorICAgIDB4NkM5MiwgLy8g5rKSLCAjMTYyCisgICAgMHg2Q0Q1LCAvLyDms5UsICM4OQorICAgIDB4NkQzQiwgLy8g5rS7LCAjMTI0CisgICAgMHg2RDQxLCAvLyDmtYEsICMzMTUKKyAgICAweDZENzcsIC8vIOa1tywgIzI1OAorICAgIDB4NkQ4OCwgLy8g5raILCAjMzQyCisgICAgMHg2RTA1LCAvLyDmuIUsICMzMjkKKyAgICAweDZFMkYsIC8vIOa4rywgIzI5MworICAgIDB4NkYxNCwgLy8g5ryULCAjNDkxCisgICAgMHg3MDYzLCAvLyDngaMsICMxOTUKKyAgICAweDcwQkEsIC8vIOeCuiwgIzM5CisgICAgMHg3MTIxLCAvLyDnhKEsICMxMDcKKyAgICAweDcxMzYsIC8vIOeEtiwgIzIxNQorICAgIDB4NzE2NywgLy8g54WnLCAjMzc2CisgICAgMHg3MUIxLCAvLyDnhrEsICMyNDUKKyAgICAweDcyNDcsIC8vIOeJhywgIzkwCisgICAgMHg3MjQ4LCAvLyDniYgsICMxMTIKKyAgICAweDcyNEMsIC8vIOeJjCwgIzQ2NworICAgIDB4NzI2OSwgLy8g54mpLCAjMTEwCisgICAgMHg3Mjc5LCAvLyDnibksICMxODMKKyAgICAweDczOEIsIC8vIOeOiywgIzI4NworICAgIDB4NzNBOSwgLy8g546pLCAjMzU0CisgICAgMHg3M0ZFLCAvLyDnj74sICMxNDMKKyAgICAweDc0MDMsIC8vIOeQgywgIzM1MAorICAgIDB4NzQwNiwgLy8g55CGLCAjMTA1CisgICAgMHg3NTFGLCAvLyDnlJ8sICMyNAorICAgIDB4NzUyMiwgLy8g55SiLCAjMjAxCisgICAgMHg3NTI4LCAvLyDnlKgsICMxNworICAgIDB4NzUzMSwgLy8g55SxLCAjMjg4CisgICAgMHg3NTM3LCAvLyDnlLcsICMyOTgKKyAgICAweDc1NEMsIC8vIOeVjCwgIzM5OQorICAgIDB4NzU1OSwgLy8g55WZLCAjMjE4CisgICAgMHg3NTZCLCAvLyDnlassICM0MTIKKyAgICAweDc1NzYsIC8vIOeVtiwgIzE4NQorICAgIDB4NzY3QiwgLy8g55m7LCAjMTM4CisgICAgMHg3NjdDLCAvLyDnmbwsICMyOAorICAgIDB4NzY3RCwgLy8g55m9LCAjMzc3CisgICAgMHg3NjdFLCAvLyDnmb4sICMzOTMKKyAgICAweDc2ODQsIC8vIOeahCwgIzEKKyAgICAweDc2RUUsIC8vIOebriwgIzI3MQorICAgIDB4NzZGNCwgLy8g55u0LCAjMzc5CisgICAgMHg3NkY4LCAvLyDnm7gsICM5OAorICAgIDB4NzcwQiwgLy8g55yLLCAjNTIKKyAgICAweDc3MUYsIC8vIOecnywgIzE4MAorICAgIDB4NzczQywgLy8g55y8LCAjNDMzCisgICAgMHg3N0U1LCAvLyDnn6UsICMxNzAKKyAgICAweDc4QkMsIC8vIOeivCwgIzQ4MQorICAgIDB4NzkzQSwgLy8g56S6LCAjMzUzCisgICAgMHg3OTNFLCAvLyDnpL4sICMzMzMKKyAgICAweDc5NUUsIC8vIOelniwgIzMwNAorICAgIDB4Nzk2OCwgLy8g56WoLCAjNDc3CisgICAgMHg3OThGLCAvLyDnpo8sICM0OTQKKyAgICAweDc5QzEsIC8vIOengSwgIzUwNworICAgIDB4NzlEMSwgLy8g56eRLCAjMjgwCisgICAgMHg3QTBCLCAvLyDnqIssICMyNzIKKyAgICAweDdBMkUsIC8vIOeoriwgIzMzNworICAgIDB4N0E0RCwgLy8g56mNLCAjMzg1CisgICAgMHg3QTdBLCAvLyDnqbosICMzMjQKKyAgICAweDdBQ0IsIC8vIOeriywgIzI4NgorICAgIDB4N0FEOSwgLy8g56uZLCAjMTE3CisgICAgMHg3QUUwLCAvLyDnq6AsICMxNDEKKyAgICAweDdCMkMsIC8vIOesrCwgIzEzNQorICAgIDB4N0I0OSwgLy8g562JLCAjMjQwCisgICAgMHg3QkExLCAvLyDnrqEsICMzNDAKKyAgICAweDdCQzAsIC8vIOevgCwgIzQzMQorICAgIDB4N0JDNywgLy8g56+HLCAjNDc5CisgICAgMHg3QzIxLCAvLyDnsKEsICM0OTkKKyAgICAweDdDQkUsIC8vIOeyviwgIzIxMworICAgIDB4N0NGQiwgLy8g57O7LCAjMjEyCisgICAgMHg3RDA0LCAvLyDntIQsICM0NjIKKyAgICAweDdEMDUsIC8vIOe0hSwgIzQ1MgorICAgIDB4N0QxQSwgLy8g57SaLCAjMjY3CisgICAgMHg3RDMwLCAvLyDntLAsICM0ODYKKyAgICAweDdENDQsIC8vIOe1hCwgIzMzNQorICAgIDB4N0Q1MCwgLy8g57WQLCAjMjQzCisgICAgMHg3RDY2LCAvLyDntaYsICMzNTUKKyAgICAweDdENzEsIC8vIOe1sSwgIzM3NQorICAgIDB4N0Q5MywgLy8g57aTLCAjMTExCisgICAgMHg3REIyLCAvLyDntrIsICMzMgorICAgIDB4N0REQSwgLy8g57eaLCAjMTUxCisgICAgMHg3RTIzLCAvLyDnuKMsICM0MzkKKyAgICAweDdFM0QsIC8vIOe4vSwgIzM3MAorICAgIDB4N0Y4RSwgLy8g576OLCAjNDEKKyAgICAweDdGQTksIC8vIOe+qSwgIzUwNAorICAgIDB4ODAwMSwgLy8g6ICBLCAjMjkwCisgICAgMHg4MDAzLCAvLyDogIMsICM0MjgKKyAgICAweDgwMDUsIC8vIOiAhSwgIzkyCisgICAgMHg4MDBDLCAvLyDogIwsICMyMTcKKyAgICAweDgwNUUsIC8vIOiBniwgIzE4MQorICAgIDB4ODA2RiwgLy8g6IGvLCAjMzEwCisgICAgMHg4MDcyLCAvLyDogbIsICM0MTMKKyAgICAweDgwQTEsIC8vIOiCoSwgIzM5MAorICAgIDB4ODBCMiwgLy8g6IKyLCAjNDUzCisgICAgMHg4MEZELCAvLyDog70sICM3MQorICAgIDB4ODE2NiwgLy8g6IWmLCAjNDA4CisgICAgMHg4MUVBLCAvLyDoh6osICM2MQorICAgIDB4ODFGMywgLy8g6IezLCAjMzQ0CisgICAgMHg4MjA3LCAvLyDoiIcsICM4NAorICAgIDB4ODIwOSwgLy8g6IiJLCAjNDYzCisgICAgMHg4MjcyLCAvLyDoibIsICMxOTIKKyAgICAweDgyQjEsIC8vIOiKsSwgIzI1NQorICAgIDB4ODJGMSwgLy8g6IuxLCAjMzQ4CisgICAgMHg4M0VGLCAvLyDoj68sICMxOTYKKyAgICAweDg0MkMsIC8vIOiQrCwgIzMxNgorICAgIDB4ODQzRCwgLy8g6JC9LCAjMzA4CisgICAgMHg4NDU3LCAvLyDokZcsICMyMzMKKyAgICAweDg1QTYsIC8vIOiWpiwgIzQwMQorICAgIDB4ODVDRiwgLy8g6JePLCAjNTAzCisgICAgMHg4NURELCAvLyDol50sICM0ODgKKyAgICAweDg2NTUsIC8vIOiZlSwgIzQxOQorICAgIDB4ODY1RiwgLy8g6JmfLCAjMTkxCisgICAgMHg4ODRDLCAvLyDooYwsICM0NworICAgIDB4ODg1MywgLy8g6KGTLCAjMzk1CisgICAgMHg4ODY4LCAvLyDooagsICM3NworICAgIDB4ODhBQiwgLy8g6KKrLCAjMjkxCisgICAgMHg4OERELCAvLyDoo50sICMyNTYKKyAgICAweDg4RTEsIC8vIOijoSwgIzM2OQorICAgIDB4ODhGRCwgLy8g6KO9LCAjNTEwCisgICAgMHg4OTdGLCAvLyDopb8sICMzMDAKKyAgICAweDg5ODEsIC8vIOimgSwgIzM2CisgICAgMHg4OThCLCAvLyDopossICMzMDcKKyAgICAweDg5OTYsIC8vIOimliwgIzIwNAorICAgIDB4ODlCQSwgLy8g6Ka6LCAjNDUwCisgICAgMHg4OUJELCAvLyDopr0sICMzODcKKyAgICAweDg5QzAsIC8vIOingCwgIzM2NQorICAgIDB4ODlFMywgLy8g6KejLCAjMzIzCisgICAgMHg4QTAwLCAvLyDoqIAsICMxNjkKKyAgICAweDhBMDIsIC8vIOiogiwgIzQyMworICAgIDB4OEEwOCwgLy8g6KiILCAjMjI1CisgICAgMHg4QTBBLCAvLyDoqIosICMxNTYKKyAgICAweDhBMEUsIC8vIOiojiwgIzM3MworICAgIDB4OEExOCwgLy8g6KiYLCAjMjIyCisgICAgMHg4QTJELCAvLyDoqK0sICMxNzQKKyAgICAweDhBM0IsIC8vIOiouywgIzM1NgorICAgIDB4OEE1NSwgLy8g6KmVLCAjMjQ2CisgICAgMHg4QTY2LCAvLyDoqaYsICM0NDgKKyAgICAweDhBNzEsIC8vIOipsSwgIzIyOQorICAgIDB4OEE3MiwgLy8g6KmyLCAjNDQ2CisgICAgMHg4QThELCAvLyDoqo0sICM0NjQKKyAgICAweDhBOUUsIC8vIOiqniwgIzM3MQorICAgIDB4OEFBQSwgLy8g6KqqLCAjOTEKKyAgICAweDhBQkYsIC8vIOiqvywgIzUwOQorICAgIDB4OEFDQiwgLy8g6KuLLCAjMTE5CisgICAgMHg4QUQ2LCAvLyDoq5YsICMxMTQKKyAgICAweDhCMUQsIC8vIOisnSwgIzM4OQorICAgIDB4OEI0OSwgLy8g6K2JLCAjNDI5CisgICAgMHg4QjU4LCAvLyDorZgsICM0MTYKKyAgICAweDhCNzAsIC8vIOitsCwgIzQ4NQorICAgIDB4OEI3NywgLy8g6K23LCAjNDc1CisgICAgMHg4QjgwLCAvLyDoroAsICMzODYKKyAgICAweDhCOEEsIC8vIOiuiiwgIzM4OAorICAgIDB4OEI5MywgLy8g6K6TLCAjMzM2CisgICAgMHg4Q0E4LCAvLyDosqgsICMzMTMKKyAgICAweDhDQjcsIC8vIOiytywgIzI2MAorICAgIDB4OENCQiwgLy8g6LK7LCAjMjAzCisgICAgMHg4Q0M3LCAvLyDos4csICM2MgorICAgIDB4OENFMywgLy8g6LOjLCAjMjk0CisgICAgMHg4Q0VBLCAvLyDos6osICM0NTcKKyAgICAweDhDRkMsIC8vIOizvCwgIzE4OQorICAgIDB4OEQ3NywgLy8g6LW3LCAjMjE0CisgICAgMHg4RDg1LCAvLyDotoUsICMyOTYKKyAgICAweDhEREYsIC8vIOi3nywgIzQ4OQorICAgIDB4OERFRiwgLy8g6LevLCAjMTM3CisgICAgMHg4RUFCLCAvLyDouqssICMxOTcKKyAgICAweDhFQ0EsIC8vIOi7iiwgIzc2CisgICAgMHg4RjA5LCAvLyDovIksICMzMDEKKyAgICAweDhGNDksIC8vIOi9iSwgIzI4MgorICAgIDB4OEZEMSwgLy8g6L+RLCAjNDE0CisgICAgMHg5MDAxLCAvLyDpgIEsICMzNjMKKyAgICAweDkwMTksIC8vIOmAmSwgIzQyCisgICAgMHg5MDFBLCAvLyDpgJosICMyMDcKKyAgICAweDkwMUYsIC8vIOmAnywgIzQ5NQorICAgIDB4OTAyMCwgLy8g6YCgLCAjNDU1CisgICAgMHg5MDIzLCAvLyDpgKMsICMyODUKKyAgICAweDkwMzIsIC8vIOmAsiwgIzIzMQorICAgIDB4OTA0QSwgLy8g6YGKLCAjMTMyCisgICAgMHg5MDRCLCAvLyDpgYssICMyMTkKKyAgICAweDkwNEUsIC8vIOmBjiwgIzEwMQorICAgIDB4OTA1MywgLy8g6YGTLCAjMTQ2CisgICAgMHg5MDU0LCAvLyDpgZQsICM0MTcKKyAgICAweDkwNzgsIC8vIOmBuCwgIzE4MgorICAgIDB4OTA4NCwgLy8g6YKELCAjMTU0CisgICAgMHg5MDhBLCAvLyDpgoosICM0ODcKKyAgICAweDkwQTMsIC8vIOmCoywgIzI2OQorICAgIDB4OTBFOCwgLy8g6YOoLCAjNzgKKyAgICAweDkwRkQsIC8vIOmDvSwgIzEwNAorICAgIDB4OTE0RCwgLy8g6YWNLCAjNDIxCisgICAgMHg5MTUyLCAvLyDphZIsICM1MTIKKyAgICAweDkxQUIsIC8vIOmGqywgIzM1OAorICAgIDB4OTFDRCwgLy8g6YeNLCAjMjI0CisgICAgMHg5MUNGLCAvLyDph48sICMzMTkKKyAgICAweDkxRDEsIC8vIOmHkSwgIzExNQorICAgIDB4OTMwNCwgLy8g6YyELCAjMzAyCisgICAgMHg5NTc3LCAvLyDplbcsICMxNzIKKyAgICAweDk1ODAsIC8vIOmWgCwgIzE5MworICAgIDB4OTU4QiwgLy8g6ZaLLCAjNzIKKyAgICAweDk1OTMsIC8vIOmWkywgIzgwCisgICAgMHg5NUIxLCAvLyDplrEsICM0MDUKKyAgICAweDk1REMsIC8vIOmXnCwgIzc0CisgICAgMHg5NjNGLCAvLyDpmL8sICM0NjAKKyAgICAweDk2NTAsIC8vIOmZkCwgIzI2NQorICAgIDB4OTY2MiwgLy8g6ZmiLCAjNDc0CisgICAgMHg5NjY0LCAvLyDpmaQsICM0NzgKKyAgICAweDk2OUIsIC8vIOmamywgIzQ1OQorICAgIDB4OTZDNiwgLy8g6ZuGLCAjMzQ3CisgICAgMHg5NkUyLCAvLyDpm6IsICM0NDIKKyAgICAweDk2RkIsIC8vIOmbuywgIzMzCisgICAgMHg5NzAwLCAvLyDpnIAsICM0NDUKKyAgICAweDk3NUUsIC8vIOmdniwgIzQ1MQorICAgIDB4OTc2MiwgLy8g6Z2iLCAjMTI5CisgICAgMHg5N0YzLCAvLyDpn7MsICMxOTQKKyAgICAweDk4MDEsIC8vIOmggSwgIzgzCisgICAgMHg5ODJELCAvLyDpoK0sICMyMzgKKyAgICAweDk4NEMsIC8vIOmhjCwgIzEyMgorICAgIDB4OTg1RSwgLy8g6aGeLCAjMTYzCisgICAgMHg5OEE4LCAvLyDpoqgsICMyNjYKKyAgICAweDk4REYsIC8vIOmjnywgIzIwOAorICAgIDB4OTkxMCwgLy8g6aSQLCAjNDY5CisgICAgMHg5OTI4LCAvLyDppKgsICM0MjQKKyAgICAweDk5OTYsIC8vIOmmliwgIzE2NgorICAgIDB4OTk5OSwgLy8g6aaZLCAjMjYzCisgICAgMHg5OUFDLCAvLyDppqwsICMzMTcKKyAgICAweDlBNTcsIC8vIOmplywgIzQ5MgorICAgIDB4OUFENCwgLy8g6auULCAjMTAwCisgICAgMHg5QUQ4LCAvLyDpq5gsICM4OAorICAgIDB4OUVCQywgLy8g6bq8LCAjMjQxCisgICAgMHg5RUMzLCAvLyDpu4MsICM0ODAKKyAgICAweDlFRDEsIC8vIOm7kSwgIzQ5MAorICAgIDB4OUVERSwgLy8g6bueLCAjNjkKKyAgICAweDlGOEQsIC8vIOm+jSwgIzUwNQorfTsKKy8vIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBzYW1wbGUgY292ZXJlZCBieSB0aGUgYWJvdmUgY2hhcmFjdGVycworc3RhdGljIGNvbnN0IGZsb2F0IGZyZXF1ZW50X3poVFdfY292ZXJhZ2U9MC43MDQ4NDEyMDAwMjY4Nzc7CisKKy8vIFRoZSA1MTIgbW9zdCBmcmVxdWVudGx5IG9jY3VyaW5nIGNoYXJhY3RlcnMgZm9yIHRoZSBqYSBsYW5ndWFnZSBpbiBhIHNhbXBsZSBvZiB0aGUgSW50ZXJuZXQuCisvLyBPcmRlcmVkIGJ5IGNvZGVwb2ludCwgY29tbWVudCBzaG93cyBjaGFyYWN0ZXIgYW5kIHJhbmtpbmcgYnkgZnJlcXVlbmN5Citjb25zdCB1aW50MTZfdCBmcmVxdWVudF9qYVtdID0geworICAgIDB4MzAwNSwgLy8g44CFLCAjMzUyCisgICAgMHgzMDQxLCAvLyDjgYEsICM0ODYKKyAgICAweDMwNDIsIC8vIOOBgiwgIzUwCisgICAgMHgzMDQ0LCAvLyDjgYQsICMyCisgICAgMHgzMDQ2LCAvLyDjgYYsICMzMworICAgIDB4MzA0OCwgLy8g44GILCAjODMKKyAgICAweDMwNEEsIC8vIOOBiiwgIzM3CisgICAgMHgzMDRCLCAvLyDjgYssICMyMQorICAgIDB4MzA0QywgLy8g44GMLCAjMTcKKyAgICAweDMwNEQsIC8vIOOBjSwgIzUxCisgICAgMHgzMDRFLCAvLyDjgY4sICMzMjQKKyAgICAweDMwNEYsIC8vIOOBjywgIzM4CisgICAgMHgzMDUwLCAvLyDjgZAsICMzMzQKKyAgICAweDMwNTEsIC8vIOOBkSwgIzYwCisgICAgMHgzMDUyLCAvLyDjgZIsICMyOTYKKyAgICAweDMwNTMsIC8vIOOBkywgIzM0CisgICAgMHgzMDU0LCAvLyDjgZQsICMxMDAKKyAgICAweDMwNTUsIC8vIOOBlSwgIzMxCisgICAgMHgzMDU2LCAvLyDjgZYsICMzNzgKKyAgICAweDMwNTcsIC8vIOOBlywgIzQKKyAgICAweDMwNTgsIC8vIOOBmCwgIzEyMQorICAgIDB4MzA1OSwgLy8g44GZLCAjMTIKKyAgICAweDMwNUEsIC8vIOOBmiwgIzIxNQorICAgIDB4MzA1QiwgLy8g44GbLCAjODYKKyAgICAweDMwNUQsIC8vIOOBnSwgIzY4CisgICAgMHgzMDVGLCAvLyDjgZ8sICMxMQorICAgIDB4MzA2MCwgLy8g44GgLCAjNDIKKyAgICAweDMwNjEsIC8vIOOBoSwgIzY3CisgICAgMHgzMDYzLCAvLyDjgaMsICMyMworICAgIDB4MzA2NCwgLy8g44GkLCAjNzMKKyAgICAweDMwNjYsIC8vIOOBpiwgIzcKKyAgICAweDMwNjcsIC8vIOOBpywgIzYKKyAgICAweDMwNjgsIC8vIOOBqCwgIzE0CisgICAgMHgzMDY5LCAvLyDjgaksICM3NQorICAgIDB4MzA2QSwgLy8g44GqLCAjOAorICAgIDB4MzA2QiwgLy8g44GrLCAjNQorICAgIDB4MzA2RCwgLy8g44GtLCAjMTIzCisgICAgMHgzMDZFLCAvLyDjga4sICMxCisgICAgMHgzMDZGLCAvLyDjga8sICMxNgorICAgIDB4MzA3MCwgLy8g44GwLCAjMTUwCisgICAgMHgzMDcxLCAvLyDjgbEsICMyNTkKKyAgICAweDMwNzIsIC8vIOOBsiwgIzM2NAorICAgIDB4MzA3MywgLy8g44GzLCAjMjY2CisgICAgMHgzMDc1LCAvLyDjgbUsICM0ODQKKyAgICAweDMwNzYsIC8vIOOBtiwgIzMzMAorICAgIDB4MzA3OCwgLy8g44G4LCAjMTQ2CisgICAgMHgzMDc5LCAvLyDjgbksICMyMDcKKyAgICAweDMwN0IsIC8vIOOBuywgIzI1NAorICAgIDB4MzA3RSwgLy8g44G+LCAjMTgKKyAgICAweDMwN0YsIC8vIOOBvywgIzc0CisgICAgMHgzMDgwLCAvLyDjgoAsICMyODUKKyAgICAweDMwODEsIC8vIOOCgSwgIzc4CisgICAgMHgzMDgyLCAvLyDjgoIsICMzMgorICAgIDB4MzA4MywgLy8g44KDLCAjMTExCisgICAgMHgzMDg0LCAvLyDjgoQsICM4NQorICAgIDB4MzA4NiwgLy8g44KGLCAjMzkyCisgICAgMHgzMDg3LCAvLyDjgocsICMyMjQKKyAgICAweDMwODgsIC8vIOOCiCwgIzYzCisgICAgMHgzMDg5LCAvLyDjgoksICMyOQorICAgIDB4MzA4QSwgLy8g44KKLCAjMjgKKyAgICAweDMwOEIsIC8vIOOCiywgIzkKKyAgICAweDMwOEMsIC8vIOOCjCwgIzM1CisgICAgMHgzMDhELCAvLyDjgo0sICMxMjcKKyAgICAweDMwOEYsIC8vIOOCjywgIzg4CisgICAgMHgzMDkyLCAvLyDjgpIsICMxOQorICAgIDB4MzA5MywgLy8g44KTLCAjMjIKKyAgICAweDMwQTEsIC8vIOOCoSwgIzE5MworICAgIDB4MzBBMiwgLy8g44KiLCAjMjcKKyAgICAweDMwQTMsIC8vIOOCoywgIzcwCisgICAgMHgzMEE0LCAvLyDjgqQsICMxNQorICAgIDB4MzBBNiwgLy8g44KmLCAjODkKKyAgICAweDMwQTcsIC8vIOOCpywgIzEzNAorICAgIDB4MzBBOCwgLy8g44KoLCAjODEKKyAgICAweDMwQTksIC8vIOOCqSwgIzIyNQorICAgIDB4MzBBQSwgLy8g44KqLCAjNzYKKyAgICAweDMwQUIsIC8vIOOCqywgIzUyCisgICAgMHgzMEFDLCAvLyDjgqwsICMxNDcKKyAgICAweDMwQUQsIC8vIOOCrSwgIzY2CisgICAgMHgzMEFFLCAvLyDjgq4sICMyNDYKKyAgICAweDMwQUYsIC8vIOOCrywgIzI1CisgICAgMHgzMEIwLCAvLyDjgrAsICMzOQorICAgIDB4MzBCMSwgLy8g44KxLCAjMTM3CisgICAgMHgzMEIyLCAvLyDjgrIsICMyMDAKKyAgICAweDMwQjMsIC8vIOOCsywgIzQ2CisgICAgMHgzMEI0LCAvLyDjgrQsICMxODMKKyAgICAweDMwQjUsIC8vIOOCtSwgIzY0CisgICAgMHgzMEI2LCAvLyDjgrYsICMyMjEKKyAgICAweDMwQjcsIC8vIOOCtywgIzQ4CisgICAgMHgzMEI4LCAvLyDjgrgsICM1NQorICAgIDB4MzBCOSwgLy8g44K5LCAjMTMKKyAgICAweDMwQkEsIC8vIOOCuiwgIzEwMworICAgIDB4MzBCQiwgLy8g44K7LCAjMTA5CisgICAgMHgzMEJDLCAvLyDjgrwsICM0OTkKKyAgICAweDMwQkQsIC8vIOOCvSwgIzE3NQorICAgIDB4MzBCRiwgLy8g44K/LCAjNDUKKyAgICAweDMwQzAsIC8vIOODgCwgIzEwNAorICAgIDB4MzBDMSwgLy8g44OBLCAjNzEKKyAgICAweDMwQzMsIC8vIOODgywgIzIwCisgICAgMHgzMEM0LCAvLyDjg4QsICMxMTkKKyAgICAweDMwQzYsIC8vIOODhiwgIzU5CisgICAgMHgzMEM3LCAvLyDjg4csICM4MgorICAgIDB4MzBDOCwgLy8g44OILCAjMTAKKyAgICAweDMwQzksIC8vIOODiSwgIzQ0CisgICAgMHgzMENBLCAvLyDjg4osICMxMDIKKyAgICAweDMwQ0IsIC8vIOODiywgIzcyCisgICAgMHgzMENELCAvLyDjg40sICMxMTcKKyAgICAweDMwQ0UsIC8vIOODjiwgIzE5MgorICAgIDB4MzBDRiwgLy8g44OPLCAjMTY0CisgICAgMHgzMEQwLCAvLyDjg5AsICM2MgorICAgIDB4MzBEMSwgLy8g44ORLCAjOTAKKyAgICAweDMwRDIsIC8vIOODkiwgIzM5OAorICAgIDB4MzBEMywgLy8g44OTLCAjNzcKKyAgICAweDMwRDQsIC8vIOODlCwgIzEzNQorICAgIDB4MzBENSwgLy8g44OVLCAjNDcKKyAgICAweDMwRDYsIC8vIOODliwgIzU2CisgICAgMHgzMEQ3LCAvLyDjg5csICM0MworICAgIDB4MzBEOCwgLy8g44OYLCAjMjY4CisgICAgMHgzMEQ5LCAvLyDjg5ksICMxNTcKKyAgICAweDMwREEsIC8vIOODmiwgIzEyNQorICAgIDB4MzBEQiwgLy8g44ObLCAjMTU1CisgICAgMHgzMERDLCAvLyDjg5wsICMxNjgKKyAgICAweDMwREQsIC8vIOODnSwgIzExNAorICAgIDB4MzBERSwgLy8g44OeLCAjNTcKKyAgICAweDMwREYsIC8vIOODnywgIzk3CisgICAgMHgzMEUwLCAvLyDjg6AsICM2OQorICAgIDB4MzBFMSwgLy8g44OhLCAjNTMKKyAgICAweDMwRTIsIC8vIOODoiwgIzE0MgorICAgIDB4MzBFMywgLy8g44OjLCAjOTMKKyAgICAweDMwRTQsIC8vIOODpCwgIzI1OAorICAgIDB4MzBFNSwgLy8g44OlLCAjNzkKKyAgICAweDMwRTYsIC8vIOODpiwgIzQwNQorICAgIDB4MzBFNywgLy8g44OnLCAjOTgKKyAgICAweDMwRTksIC8vIOODqSwgIzI2CisgICAgMHgzMEVBLCAvLyDjg6osICMzMAorICAgIDB4MzBFQiwgLy8g44OrLCAjMjQKKyAgICAweDMwRUMsIC8vIOODrCwgIzQxCisgICAgMHgzMEVELCAvLyDjg60sICM0MAorICAgIDB4MzBFRiwgLy8g44OvLCAjMTQ0CisgICAgMHgzMEYzLCAvLyDjg7MsICMzCisgICAgMHgzMEY0LCAvLyDjg7QsICM0ODMKKyAgICAweDMwRkQsIC8vIOODvSwgIzUwMQorICAgIDB4NEUwMCwgLy8g5LiALCAjODQKKyAgICAweDRFMDcsIC8vIOS4hywgIzMzNworICAgIDB4NEUwOSwgLy8g5LiJLCAjMzIzCisgICAgMHg0RTBBLCAvLyDkuIosICMxMzMKKyAgICAweDRFMEIsIC8vIOS4iywgIzE4MAorICAgIDB4NEUwRCwgLy8g5LiNLCAjMjc3CisgICAgMHg0RTE2LCAvLyDkuJYsICMzODUKKyAgICAweDRFMkQsIC8vIOS4rSwgIzg3CisgICAgMHg0RTNCLCAvLyDkuLssICM0MzIKKyAgICAweDRFODgsIC8vIOS6iCwgIzMyNgorICAgIDB4NEU4QiwgLy8g5LqLLCAjOTUKKyAgICAweDRFOEMsIC8vIOS6jCwgIzM5NAorICAgIDB4NEU5NSwgLy8g5LqVLCAjNDY4CisgICAgMHg0RUE0LCAvLyDkuqQsICM0MTAKKyAgICAweDRFQUMsIC8vIOS6rCwgIzI2MAorICAgIDB4NEVCQSwgLy8g5Lq6LCAjNjEKKyAgICAweDRFQ0EsIC8vIOS7iiwgIzE4NAorICAgIDB4NEVDQiwgLy8g5LuLLCAjMzU4CisgICAgMHg0RUQ1LCAvLyDku5UsICMzOTEKKyAgICAweDRFRDYsIC8vIOS7liwgIzI1NgorICAgIDB4NEVEOCwgLy8g5LuYLCAjMjQzCisgICAgMHg0RUUzLCAvLyDku6MsICMyODAKKyAgICAweDRFRTUsIC8vIOS7pSwgIzIxNgorICAgIDB4NEVGNiwgLy8g5Lu2LCAjMTkwCisgICAgMHg0RjFBLCAvLyDkvJosICMxMDUKKyAgICAweDRGNEQsIC8vIOS9jSwgIzE3NworICAgIDB4NEY0RiwgLy8g5L2PLCAjMzc2CisgICAgMHg0RjUzLCAvLyDkvZMsICMyMjMKKyAgICAweDRGNTUsIC8vIOS9lSwgIzI5NAorICAgIDB4NEY1QywgLy8g5L2cLCAjMTU0CisgICAgMHg0RjdGLCAvLyDkvb8sICMyMzMKKyAgICAweDRGOUIsIC8vIOS+mywgIzUwMworICAgIDB4NEZBMSwgLy8g5L6hLCAjMjE3CisgICAgMHg0RkJGLCAvLyDkvr8sICM1MTEKKyAgICAweDRGREQsIC8vIOS/nSwgIzI3OQorICAgIDB4NEZFMSwgLy8g5L+hLCAjMjcxCisgICAgMHg1MDBCLCAvLyDlgIssICM0MTUKKyAgICAweDUwQ0YsIC8vIOWDjywgIzE3OAorICAgIDB4NTEyQSwgLy8g5YSqLCAjNDAzCisgICAgMHg1MTQzLCAvLyDlhYMsICMzODQKKyAgICAweDUxNDgsIC8vIOWFiCwgIzMxMQorICAgIDB4NTE0OSwgLy8g5YWJLCAjNDg4CisgICAgMHg1MTY1LCAvLyDlhaUsICMxMTUKKyAgICAweDUxNjgsIC8vIOWFqCwgIzE3MworICAgIDB4NTE2QywgLy8g5YWsLCAjMjg3CisgICAgMHg1MTc3LCAvLyDlhbcsICM0NDcKKyAgICAweDUxODUsIC8vIOWGhSwgIzE2OQorICAgIDB4NTE4NiwgLy8g5YaGLCAjMTMxCisgICAgMHg1MTk5LCAvLyDlhpksICMyNzUKKyAgICAweDUxRkEsIC8vIOWHuiwgIzExMAorICAgIDB4NTIwNiwgLy8g5YiGLCAjMTMwCisgICAgMHg1MjA3LCAvLyDliIcsICM0MDEKKyAgICAweDUyMUQsIC8vIOWInSwgIzMxOQorICAgIDB4NTIyNSwgLy8g5YilLCAjMjkwCisgICAgMHg1MjI5LCAvLyDliKksICMyMjYKKyAgICAweDUyMzYsIC8vIOWItiwgIzUwNworICAgIDB4NTI0RCwgLy8g5YmNLCAjMTI0CisgICAgMHg1MjlCLCAvLyDlipssICMyNzIKKyAgICAweDUyQTAsIC8vIOWKoCwgIzI0OQorICAgIDB4NTJENSwgLy8g5YuVLCAjMTIwCisgICAgMHg1MkQ5LCAvLyDli5ksICM0MjEKKyAgICAweDUyREYsIC8vIOWLnywgIzQ3NgorICAgIDB4NTMxNiwgLy8g5YyWLCAjMzA4CisgICAgMHg1MzE3LCAvLyDljJcsICMzNDEKKyAgICAweDUzM0EsIC8vIOWMuiwgIzM0OAorICAgIDB4NTM5RiwgLy8g5Y6fLCAjMzIxCisgICAgMHg1M0MyLCAvLyDlj4IsICM0NTIKKyAgICAweDUzQ0IsIC8vIOWPiywgIzQ1MQorICAgIDB4NTNENiwgLy8g5Y+WLCAjMjM3CisgICAgMHg1M0Q3LCAvLyDlj5csICMzNTQKKyAgICAweDUzRTMsIC8vIOWPoywgIzI4OQorICAgIDB4NTNFNCwgLy8g5Y+kLCAjMzM5CisgICAgMHg1M0VGLCAvLyDlj68sICMyOTgKKyAgICAweDUzRjAsIC8vIOWPsCwgIzQzOQorICAgIDB4NTNGNywgLy8g5Y+3LCAjMzYxCisgICAgMHg1NDA4LCAvLyDlkIgsICMxMTgKKyAgICAweDU0MEMsIC8vIOWQjCwgIzI2MworICAgIDB4NTQwRCwgLy8g5ZCNLCAjNjUKKyAgICAweDU0MTEsIC8vIOWQkSwgIzQzNAorICAgIDB4NTQ0QSwgLy8g5ZGKLCAjMzg2CisgICAgMHg1NDY4LCAvLyDlkagsICMzOTMKKyAgICAweDU0NzMsIC8vIOWRsywgIzI5OQorICAgIDB4NTQ4QywgLy8g5ZKMLCAjMzUwCisgICAgMHg1NEMxLCAvLyDlk4EsICM5NgorICAgIDB4NTRFMSwgLy8g5ZOhLCAjMjkzCisgICAgMHg1NTQ2LCAvLyDllYYsICMxOTgKKyAgICAweDU1NEYsIC8vIOWVjywgIzE1OAorICAgIDB4NTVCNiwgLy8g5Za2LCAjNDM4CisgICAgMHg1NjY4LCAvLyDlmagsICMzNjYKKyAgICAweDU2REUsIC8vIOWbniwgIzE0MworICAgIDB4NTZGMywgLy8g5ZuzLCAjNDQ0CisgICAgMHg1NkZELCAvLyDlm70sICMxNTMKKyAgICAweDU3MTIsIC8vIOWckiwgIzQzNQorICAgIDB4NTcxRiwgLy8g5ZyfLCAjMjM5CisgICAgMHg1NzI4LCAvLyDlnKgsICMzNTEKKyAgICAweDU3MzAsIC8vIOWcsCwgIzE2MworICAgIDB4NTc4QiwgLy8g5Z6LLCAjNDMwCisgICAgMHg1ODMxLCAvLyDloLEsICMxMTIKKyAgICAweDU4MzQsIC8vIOWgtCwgIzEzOQorICAgIDB4NThGMiwgLy8g5aOyLCAjMjMyCisgICAgMHg1OTA5LCAvLyDlpIksICMzMDYKKyAgICAweDU5MTYsIC8vIOWkliwgIzIyMgorICAgIDB4NTkxQSwgLy8g5aSaLCAjMzM2CisgICAgMHg1OTI3LCAvLyDlpKcsICM4MAorICAgIDB4NTkyOSwgLy8g5aSpLCAjMjc4CisgICAgMHg1OTczLCAvLyDlpbMsICMxNjEKKyAgICAweDU5N0QsIC8vIOWlvSwgIzM0OQorICAgIDB4NUE1QSwgLy8g5amaLCAjNDc5CisgICAgMHg1QjUwLCAvLyDlrZAsICMxMTMKKyAgICAweDVCNTcsIC8vIOWtlywgIzQ5MgorICAgIDB4NUI2NiwgLy8g5a2mLCAjMTMyCisgICAgMHg1Qjg5LCAvLyDlroksICMyOTUKKyAgICAweDVCOUEsIC8vIOWumiwgIzE0NQorICAgIDB4NUI5RiwgLy8g5a6fLCAjMjIwCisgICAgMHg1QkE0LCAvLyDlrqQsICM0ODIKKyAgICAweDVCQUUsIC8vIOWuriwgIzQ4NworICAgIDB4NUJCNiwgLy8g5a62LCAjMjExCisgICAgMHg1QkI5LCAvLyDlrrksICMzMzMKKyAgICAweDVCRkUsIC8vIOWvviwgIzI1MgorICAgIDB4NUMwMiwgLy8g5bCCLCAjNDc0CisgICAgMHg1QzBGLCAvLyDlsI8sICMyMTIKKyAgICAweDVDMTEsIC8vIOWwkSwgIzM3NworICAgIDB4NUM0QiwgLy8g5bGLLCAjMjg0CisgICAgMHg1QzcxLCAvLyDlsbEsICMyMDYKKyAgICAweDVDQTEsIC8vIOWyoSwgIzQyOQorICAgIDB4NUNGNiwgLy8g5bO2LCAjMjk3CisgICAgMHg1RERELCAvLyDlt50sICMyNTMKKyAgICAweDVERTUsIC8vIOW3pSwgIzM3NAorICAgIDB4NUUwMiwgLy8g5biCLCAjMTU5CisgICAgMHg1RTJGLCAvLyDluK8sICM0MTYKKyAgICAweDVFMzgsIC8vIOW4uCwgIzQzNworICAgIDB4NUU3MywgLy8g5bmzLCAjMzkwCisgICAgMHg1RTc0LCAvLyDlubQsICM1NAorICAgIDB4NUU4MywgLy8g5bqDLCAjMzY3CisgICAgMHg1RTk3LCAvLyDlupcsICMxNDkKKyAgICAweDVFQTYsIC8vIOW6piwgIzI2OQorICAgIDB4NUVBQiwgLy8g5bqrLCAjMzgwCisgICAgMHg1RjBGLCAvLyDlvI8sICMyNjUKKyAgICAweDVGMTUsIC8vIOW8lSwgIzM0NQorICAgIDB4NUYzNywgLy8g5by3LCAjNDQ2CisgICAgMHg1RjUzLCAvLyDlvZMsICMyNDAKKyAgICAweDVGNjIsIC8vIOW9oiwgIzUwMgorICAgIDB4NUY4QywgLy8g5b6MLCAjMjMwCisgICAgMHg1Rjk3LCAvLyDlvpcsICM0OTAKKyAgICAweDVGQzMsIC8vIOW/gywgIzMwNworICAgIDB4NUZDNSwgLy8g5b+FLCAjNDIyCisgICAgMHg1RkRDLCAvLyDlv5wsICMzNTYKKyAgICAweDYwMUQsIC8vIOaAnSwgIzE4OQorICAgIDB4NjAyNywgLy8g5oCnLCAjMjAxCisgICAgMHg2MDc1LCAvLyDmgbUsICM0MDAKKyAgICAweDYwQzUsIC8vIOaDhSwgIzE0MAorICAgIDB4NjBGMywgLy8g5oOzLCAjNDc3CisgICAgMHg2MTBGLCAvLyDmhI8sICMzMDUKKyAgICAweDYxMUIsIC8vIOaEmywgIzI3MworICAgIDB4NjExRiwgLy8g5oSfLCAjMjU3CisgICAgMHg2MjEwLCAvLyDmiJAsICMyNjIKKyAgICAweDYyMjYsIC8vIOaIpiwgIzM2NQorICAgIDB4NjI0MCwgLy8g5omALCAjMjM2CisgICAgMHg2MjRCLCAvLyDmiYssICMxNjAKKyAgICAweDYyOTUsIC8vIOaKlSwgIzEyOQorICAgIDB4NjMwMSwgLy8g5oyBLCAjMzU1CisgICAgMHg2MzA3LCAvLyDmjIcsICM0MjUKKyAgICAweDYzQTIsIC8vIOaOoiwgIzM2OQorICAgIDB4NjNCMiwgLy8g5o6yLCAjMzk5CisgICAgMHg2NDNBLCAvLyDmkLosICM0NTkKKyAgICAweDY1MkYsIC8vIOaUrywgIzUxMgorICAgIDB4NjUzRSwgLy8g5pS+LCAjNDY5CisgICAgMHg2NTU5LCAvLyDmlZksICMyNzAKKyAgICAweDY1NzAsIC8vIOaVsCwgIzE4MQorICAgIDB4NjU4NywgLy8g5paHLCAjMjAyCisgICAgMHg2NTk5LCAvLyDmlpksICMxMDYKKyAgICAweDY1QjAsIC8vIOaWsCwgIzk5CisgICAgMHg2NUI5LCAvLyDmlrksICMxMjYKKyAgICAweDY1QzUsIC8vIOaXhSwgIzQ0NQorICAgIDB4NjVFNSwgLy8g5pelLCAjMzYKKyAgICAweDY2MEUsIC8vIOaYjiwgIzMwMAorICAgIDB4NjYyMCwgLy8g5pigLCAjNDE4CisgICAgMHg2NjQyLCAvLyDmmYIsICMxMDcKKyAgICAweDY2RjQsIC8vIOabtCwgIzM1OQorICAgIDB4NjZGOCwgLy8g5pu4LCAjMTc0CisgICAgMHg2NzAwLCAvLyDmnIAsICMxNTIKKyAgICAweDY3MDgsIC8vIOaciCwgIzQ5CisgICAgMHg2NzA5LCAvLyDmnIksICMzMDIKKyAgICAweDY3MUYsIC8vIOacnywgIzMzMgorICAgIDB4NjcyOCwgLy8g5pyoLCAjMjAzCisgICAgMHg2NzJDLCAvLyDmnKwsICM5MgorICAgIDB4Njc1MCwgLy8g5p2QLCAjNDg5CisgICAgMHg2NzUxLCAvLyDmnZEsICM0NjYKKyAgICAweDY3NjUsIC8vIOadpSwgIzI2NworICAgIDB4Njc3MSwgLy8g5p2xLCAjMTkxCisgICAgMHg2NzdGLCAvLyDmnb8sICM0MTEKKyAgICAweDY3OUMsIC8vIOaenCwgIzQ0MQorICAgIDB4NjgyMSwgLy8g5qChLCAjMzI3CisgICAgMHg2ODJBLCAvLyDmoKosICM0MTIKKyAgICAweDY4M0MsIC8vIOagvCwgIzIyOAorICAgIDB4NjkxQywgLy8g5qScLCAjMTc5CisgICAgMHg2OTZELCAvLyDmpa0sICMxNjYKKyAgICAweDY5N0QsIC8vIOalvSwgIzE3MgorICAgIDB4NjlEOCwgLy8g5qeYLCAjMjU1CisgICAgMHg2QTVGLCAvLyDmqZ8sICMyMzUKKyAgICAweDZCMjEsIC8vIOasoSwgIzMxOAorICAgIDB4NkI2MiwgLy8g5q2iLCAjNDc1CisgICAgMHg2QjYzLCAvLyDmraMsICMzMTIKKyAgICAweDZDMTcsIC8vIOawlywgIzExNgorICAgIDB4NkMzNCwgLy8g5rC0LCAjMTY1CisgICAgMHg2QzQyLCAvLyDmsYIsICM0NjUKKyAgICAweDZDN0EsIC8vIOaxuiwgIzM3MAorICAgIDB4NkNCQiwgLy8g5rK7LCAjNTA1CisgICAgMHg2Q0MxLCAvLyDms4EsICM0NjIKKyAgICAweDZDRDUsIC8vIOazlSwgIzIyNworICAgIDB4NkNFOCwgLy8g5rOoLCAjMzcyCisgICAgMHg2RDNCLCAvLyDmtLssICMzMDMKKyAgICAweDZENDEsIC8vIOa1gSwgIzQ4MAorICAgIDB4NkQ3NywgLy8g5rW3LCAjMjc0CisgICAgMHg2RTA4LCAvLyDmuIgsICM0MTcKKyAgICAweDZGMTQsIC8vIOa8lCwgIzUwNAorICAgIDB4NzA2QiwgLy8g54GrLCAjMjY0CisgICAgMHg3MEI5LCAvLyDngrksICMzMzEKKyAgICAweDcxMjEsIC8vIOeEoSwgIzU4CisgICAgMHg3MjQ4LCAvLyDniYgsICM0MDkKKyAgICAweDcyNjksIC8vIOeJqSwgIzE3MAorICAgIDB4NzI3OSwgLy8g54m5LCAjMjQyCisgICAgMHg3MkI2LCAvLyDnirYsICM0NTgKKyAgICAweDczRkUsIC8vIOePviwgIzMyMgorICAgIDB4NzQwNiwgLy8g55CGLCAjMTYyCisgICAgMHg3NTFGLCAvLyDnlJ8sICMxMjIKKyAgICAweDc1MjMsIC8vIOeUoywgIzMyMAorICAgIDB4NzUyOCwgLy8g55SoLCAjOTQKKyAgICAweDc1MzAsIC8vIOeUsCwgIzE5NQorICAgIDB4NzUzNywgLy8g55S3LCAjMzczCisgICAgMHg3NTNBLCAvLyDnlLosICMzMTQKKyAgICAweDc1M0IsIC8vIOeUuywgIzkxCisgICAgMHg3NTRDLCAvLyDnlYwsICM0MzYKKyAgICAweDc1NkEsIC8vIOeVqiwgIzI2MQorICAgIDB4NzVDNSwgLy8g55eFLCAjNDI4CisgICAgMHg3NjdBLCAvLyDnmbosICMxOTQKKyAgICAweDc2N0IsIC8vIOeZuywgIzIzMQorICAgIDB4NzY3RCwgLy8g55m9LCAjNDE5CisgICAgMHg3Njg0LCAvLyDnmoQsICMyNTEKKyAgICAweDc2RUUsIC8vIOebriwgIzE5NworICAgIDB4NzZGNCwgLy8g55u0LCAjNDk3CisgICAgMHg3NkY4LCAvLyDnm7gsICMyODYKKyAgICAweDc3MEMsIC8vIOecjCwgIzE5OQorICAgIDB4NzcxRiwgLy8g55yfLCAjMjE5CisgICAgMHg3NzQwLCAvLyDnnYAsICMyODMKKyAgICAweDc3RTUsIC8vIOefpSwgIzE4NQorICAgIDB4NzdGMywgLy8g55+zLCAjNTAwCisgICAgMHg3OEJBLCAvLyDnorosICMzODMKKyAgICAweDc5M0EsIC8vIOekuiwgIzI0MQorICAgIDB4NzkzRSwgLy8g56S+LCAjMTY3CisgICAgMHg3OTVFLCAvLyDnpZ4sICMzMTUKKyAgICAweDc5OEYsIC8vIOemjywgIzQyMworICAgIDB4NzlDMSwgLy8g56eBLCAjMzQ3CisgICAgMHg3OUQxLCAvLyDnp5EsICM0MjAKKyAgICAweDdBMEUsIC8vIOeojiwgIzM2OAorICAgIDB4N0EyRSwgLy8g56iuLCAjNDU1CisgICAgMHg3QTNGLCAvLyDnqL8sICMxNDgKKyAgICAweDdBN0EsIC8vIOepuiwgIzQyNworICAgIDB4N0FDQiwgLy8g56uLLCAjMzA5CisgICAgMHg3QjExLCAvLyDnrJEsICM0NTQKKyAgICAweDdCMkMsIC8vIOesrCwgIzMxNworICAgIDB4N0I0OSwgLy8g562JLCAjNDU3CisgICAgMHg3QjU0LCAvLyDnrZQsICM0MjYKKyAgICAweDdCQTEsIC8vIOeuoSwgIzQ4MQorICAgIDB4N0NGQiwgLy8g57O7LCAjNDA4CisgICAgMHg3RDA0LCAvLyDntIQsICMyNzYKKyAgICAweDdEMjAsIC8vIOe0oCwgIzQwNworICAgIDB4N0QyMiwgLy8g57SiLCAjMjE0CisgICAgMHg3RDMwLCAvLyDntLAsICMzODEKKyAgICAweDdEMzksIC8vIOe0uSwgIzQ3MQorICAgIDB4N0Q0MiwgLy8g57WCLCAjNDU2CisgICAgMHg3RDQ0LCAvLyDntYQsICM0MjQKKyAgICAweDdENEMsIC8vIOe1jCwgIzM2MAorICAgIDB4N0Q1MCwgLy8g57WQLCAjMjkxCisgICAgMHg3RDlBLCAvLyDntposICMzNTcKKyAgICAweDdEQ0YsIC8vIOe3jywgIzQ2NworICAgIDB4N0REQSwgLy8g57eaLCAjMzM4CisgICAgMHg3REU4LCAvLyDnt6gsICM0NTMKKyAgICAweDdGOEUsIC8vIOe+jiwgIzIwNAorICAgIDB4ODAwMywgLy8g6ICDLCAjMzg3CisgICAgMHg4MDA1LCAvLyDogIUsICMxNTEKKyAgICAweDgwNUUsIC8vIOiBniwgIzQ2MworICAgIDB4ODA3NywgLy8g6IG3LCAjMzYzCisgICAgMHg4MEIyLCAvLyDogrIsICM0MzMKKyAgICAweDgwRkQsIC8vIOiDvSwgIzI1MAorICAgIDB4ODE3OSwgLy8g6IW5LCAjMzk2CisgICAgMHg4MUVBLCAvLyDoh6osICMxNTYKKyAgICAweDgyNkYsIC8vIOiJrywgIzMyOQorICAgIDB4ODI3MiwgLy8g6ImyLCAjNDAyCisgICAgMHg4MkIxLCAvLyDoirEsICM0NDAKKyAgICAweDgyQjgsIC8vIOiKuCwgIzQxMworICAgIDB4ODJGMSwgLy8g6IuxLCAjNDg1CisgICAgMHg4NDQ5LCAvLyDokYksICM0NzIKKyAgICAweDg4NEMsIC8vIOihjCwgIzEyOAorICAgIDB4ODg1MywgLy8g6KGTLCAjNDYwCisgICAgMHg4ODY4LCAvLyDooagsICMyMDkKKyAgICAweDg4RkQsIC8vIOijvSwgIzQzMQorICAgIDB4ODk3RiwgLy8g6KW/LCAjNDA2CisgICAgMHg4OTgxLCAvLyDopoEsICMzMTMKKyAgICAweDg5OEIsIC8vIOimiywgIzEwMQorICAgIDB4ODk4RiwgLy8g6KaPLCAjMzc1CisgICAgMHg4OUE3LCAvLyDopqcsICMxNzEKKyAgICAweDg5RTMsIC8vIOinoywgIzM4OAorICAgIDB4OEEwMCwgLy8g6KiALCAjMjEwCisgICAgMHg4QTA4LCAvLyDoqIgsICMzNDMKKyAgICAweDhBMTgsIC8vIOiomCwgIzEzNgorICAgIDB4OEEyRCwgLy8g6KitLCAjMjkyCisgICAgMHg4QTcxLCAvLyDoqbEsICMyMTMKKyAgICAweDhBNzMsIC8vIOipsywgIzM3MQorICAgIDB4OEE4RCwgLy8g6KqNLCAjNDA0CisgICAgMHg4QTlFLCAvLyDoqp4sICMyMzQKKyAgICAweDhBQUMsIC8vIOiqrCwgIzQ5NAorICAgIDB4OEFBRCwgLy8g6KqtLCAjMzAxCisgICAgMHg4QUJGLCAvLyDoqr8sICM0NDMKKyAgICAweDhBQzcsIC8vIOirhywgIzQ0OAorICAgIDB4OEI3NywgLy8g6K23LCAjNTA5CisgICAgMHg4QzM3LCAvLyDosLcsICM1MDYKKyAgICAweDhDQTksIC8vIOiyqSwgIzM2MgorICAgIDB4OENCNywgLy8g6LK3LCAjMzQ2CisgICAgMHg4Q0M3LCAvLyDos4csICM0NzMKKyAgICAweDhDRUEsIC8vIOizqiwgIzI4MQorICAgIDB4OENGQywgLy8g6LO8LCAjNDk1CisgICAgMHg4RUFCLCAvLyDouqssICM0NzAKKyAgICAweDhFQ0EsIC8vIOi7iiwgIzIwNQorICAgIDB4OEVFMiwgLy8g6LuiLCAjMzM1CisgICAgMHg4RjA5LCAvLyDovIksICMzNDIKKyAgICAweDhGQkMsIC8vIOi+vCwgIzIyOQorICAgIDB4OEZEMSwgLy8g6L+RLCAjMzA0CisgICAgMHg4RkQ0LCAvLyDov5QsICM0NjEKKyAgICAweDhGRkQsIC8vIOi/vSwgIzM3OQorICAgIDB4OTAwMSwgLy8g6YCBLCAjMTg2CisgICAgMHg5MDFBLCAvLyDpgJosICMxODIKKyAgICAweDkwMUYsIC8vIOmAnywgIzM0MAorICAgIDB4OTAyMywgLy8g6YCjLCAjMjQ0CisgICAgMHg5MDRCLCAvLyDpgYssICMzODIKKyAgICAweDkwNEUsIC8vIOmBjiwgIzQ5OAorICAgIDB4OTA1MywgLy8g6YGTLCAjMjgyCisgICAgMHg5MDU0LCAvLyDpgZQsICM0NTAKKyAgICAweDkwNTUsIC8vIOmBlSwgIzQxNAorICAgIDB4OTA3OCwgLy8g6YG4LCAjMjg4CisgICAgMHg5MEU4LCAvLyDpg6gsICMyMDgKKyAgICAweDkwRkQsIC8vIOmDvSwgIzM0NAorICAgIDB4OTE0RCwgLy8g6YWNLCAjMzg5CisgICAgMHg5MUNELCAvLyDph40sICM0NzgKKyAgICAweDkxQ0UsIC8vIOmHjiwgIzI0NQorICAgIDB4OTFEMSwgLy8g6YeRLCAjMTM4CisgICAgMHg5MzMyLCAvLyDpjLIsICMyMzgKKyAgICAweDk1NzcsIC8vIOmVtywgIzI0NworICAgIDB4OTU4MCwgLy8g6ZaALCAjNTA4CisgICAgMHg5NThCLCAvLyDplossICMyNDgKKyAgICAweDk1OTMsIC8vIOmWkywgIzE0MQorICAgIDB4OTVBMiwgLy8g6ZaiLCAjMTg4CisgICAgMHg5NjJBLCAvLyDpmKosICM0OTYKKyAgICAweDk2NTAsIC8vIOmZkCwgIzM5NQorICAgIDB4OTY2MiwgLy8g6ZmiLCAjNDQ5CisgICAgMHg5NjY0LCAvLyDpmaQsICM1MTAKKyAgICAweDk2OUIsIC8vIOmamywgIzQ5MworICAgIDB4OTZDNiwgLy8g6ZuGLCAjMTk2CisgICAgMHg5NkQxLCAvLyDpm5EsICM0NDIKKyAgICAweDk2RkIsIC8vIOmbuywgIzE4NworICAgIDB4OTc2MiwgLy8g6Z2iLCAjMzI4CisgICAgMHg5N0YzLCAvLyDpn7MsICMzMjUKKyAgICAweDk4NEMsIC8vIOmhjCwgIzMxMAorICAgIDB4OTg1RSwgLy8g6aGeLCAjNDkxCisgICAgMHg5OEE4LCAvLyDpoqgsICMzNTMKKyAgICAweDk4REYsIC8vIOmjnywgIzIxOAorICAgIDB4OTkyOCwgLy8g6aSoLCAjNDY0CisgICAgMHg5OUM1LCAvLyDpp4UsICMzMTYKKyAgICAweDlBMTMsIC8vIOmokywgIzM5NworICAgIDB4OUFEOCwgLy8g6auYLCAjMTc2CisgICAgMHhGRjU3LCAvLyDvvZcsICMxMDgKK307CisvLyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgc2FtcGxlIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGNoYXJhY3RlcnMKK3N0YXRpYyBjb25zdCBmbG9hdCBmcmVxdWVudF9qYV9jb3ZlcmFnZT0wLjg4MDU2OTU4OTEyMDE2MjsKKworLy8gVGhlIDUxMiBtb3N0IGZyZXF1ZW50bHkgb2NjdXJpbmcgY2hhcmFjdGVycyBmb3IgdGhlIGtvIGxhbmd1YWdlIGluIGEgc2FtcGxlIG9mIHRoZSBJbnRlcm5ldC4KKy8vIE9yZGVyZWQgYnkgY29kZXBvaW50LCBjb21tZW50IHNob3dzIGNoYXJhY3RlciBhbmQgcmFua2luZyBieSBmcmVxdWVuY3kKK2NvbnN0IHVpbnQxNl90IGZyZXF1ZW50X2tvW10gPSB7CisgICAgMHgzMTRCLCAvLyDjhYssICMxNDgKKyAgICAweDMxNEUsIC8vIOOFjiwgIzM5MAorICAgIDB4MzE2MCwgLy8g44WgLCAjMzU0CisgICAgMHgzMThELCAvLyDjho0sICM0MzkKKyAgICAweEFDMDAsIC8vIOqwgCwgIzYKKyAgICAweEFDMDEsIC8vIOqwgSwgIzIzMQorICAgIDB4QUMwNCwgLy8g6rCELCAjMTA2CisgICAgMHhBQzA4LCAvLyDqsIgsICMzNjIKKyAgICAweEFDMTAsIC8vIOqwkCwgIzEyMgorICAgIDB4QUMxMSwgLy8g6rCRLCAjNDkzCisgICAgMHhBQzE1LCAvLyDqsJUsICMxNTUKKyAgICAweEFDMTksIC8vIOqwmSwgIzI2NAorICAgIDB4QUMxQywgLy8g6rCcLCAjODcKKyAgICAweEFDMUQsIC8vIOqwnSwgIzE5OAorICAgIDB4QUMyNCwgLy8g6rCkLCAjNDU3CisgICAgMHhBQzcwLCAvLyDqsbAsICM5MQorICAgIDB4QUM3NCwgLy8g6rG0LCAjMTYxCisgICAgMHhBQzc4LCAvLyDqsbgsICMzMzgKKyAgICAweEFDODAsIC8vIOqygCwgIzE4NAorICAgIDB4QUM4MywgLy8g6rKDLCAjMTE2CisgICAgMHhBQzhDLCAvLyDqsowsICMzNgorICAgIDB4QUNBMCwgLy8g6rKgLCAjMjMzCisgICAgMHhBQ0E4LCAvLyDqsqgsICMzNDEKKyAgICAweEFDQTksIC8vIOqyqSwgIzI0NQorICAgIDB4QUNBQywgLy8g6rKsLCAjNDEzCisgICAgMHhBQ0IwLCAvLyDqsrAsICMyMDIKKyAgICAweEFDQkQsIC8vIOqyvSwgIzYyCisgICAgMHhBQ0M0LCAvLyDqs4QsICMxNDIKKyAgICAweEFDRTAsIC8vIOqzoCwgIzEyCisgICAgMHhBQ0UxLCAvLyDqs6EsICM0NDQKKyAgICAweEFDRTgsIC8vIOqzqCwgIzM3OQorICAgIDB4QUNGMywgLy8g6rOzLCAjMzg4CisgICAgMHhBQ0Y1LCAvLyDqs7UsICM1OQorICAgIDB4QUNGQywgLy8g6rO8LCAjNjkKKyAgICAweEFEMDAsIC8vIOq0gCwgIzk1CisgICAgMHhBRDExLCAvLyDqtJEsICMyMzUKKyAgICAweEFENTAsIC8vIOq1kCwgIzEyOAorICAgIDB4QUQ2QywgLy8g6rWsLCAjNTIKKyAgICAweEFENkQsIC8vIOq1rSwgIzg1CisgICAgMHhBRDcwLCAvLyDqtbAsICMyOTMKKyAgICAweEFENzQsIC8vIOq1tCwgIzQ4NworICAgIDB4QUQ4MSwgLy8g6raBLCAjNDQxCisgICAgMHhBRDhDLCAvLyDqtowsICMxOTIKKyAgICAweEFEQzAsIC8vIOq3gCwgIzM4NgorICAgIDB4QUREQywgLy8g6recLCAjMzY3CisgICAgMHhBREY4LCAvLyDqt7gsICMzMAorICAgIDB4QURGOSwgLy8g6re5LCAjNDI0CisgICAgMHhBREZDLCAvLyDqt7wsICMyNDEKKyAgICAweEFFMDAsIC8vIOq4gCwgIzYxCisgICAgMHhBRTA4LCAvLyDquIgsICMxMzgKKyAgICAweEFFMDksIC8vIOq4iSwgIzI2OQorICAgIDB4QUUzMCwgLy8g6riwLCAjMworICAgIDB4QUUzNCwgLy8g6ri0LCAjNDY1CisgICAgMHhBRTM4LCAvLyDquLgsICMyOTcKKyAgICAweEFFNDAsIC8vIOq5gCwgIzIwNQorICAgIDB4QUU0QywgLy8g6rmMLCAjMTcxCisgICAgMHhBRUQ4LCAvLyDqu5gsICMyNzMKKyAgICAweEFGNDMsIC8vIOq9gywgIzQ3NQorICAgIDB4QjA1RCwgLy8g64GdLCAjNTA1CisgICAgMHhCMDdDLCAvLyDrgbwsICM0OTAKKyAgICAweEIwOTgsIC8vIOuCmCwgIzM5CisgICAgMHhCMDlDLCAvLyDrgpwsICMyNzQKKyAgICAweEIwQTAsIC8vIOuCoCwgIzI5MgorICAgIDB4QjBBOCwgLy8g64KoLCAjMTM5CisgICAgMHhCMEI0LCAvLyDrgrQsICM1NgorICAgIDB4QjEwOCwgLy8g64SILCAjMjcyCisgICAgMHhCMTEwLCAvLyDrhJAsICM0NzYKKyAgICAweEIxMTgsIC8vIOuEmCwgIzQ5MgorICAgIDB4QjEyNCwgLy8g64SkLCAjMTAwCisgICAgMHhCMTM3LCAvLyDrhLcsICMzMjkKKyAgICAweEIxNDAsIC8vIOuFgCwgIzI4OAorICAgIDB4QjE0NCwgLy8g64WELCAjMTUxCisgICAgMHhCMTc4LCAvLyDrhbgsICMxNDkKKyAgICAweEIxN0MsIC8vIOuFvCwgIzQ5MQorICAgIDB4QjE4MCwgLy8g64aALCAjNDY0CisgICAgMHhCMThELCAvLyDrho0sICM0NDIKKyAgICAweEIyMDQsIC8vIOuIhCwgIzMxOQorICAgIDB4QjIwOCwgLy8g64iILCAjMzgzCisgICAgMHhCMjc0LCAvLyDribQsICMxNzMKKyAgICAweEIyOTAsIC8vIOuKkCwgIzM2OAorICAgIDB4QjI5NCwgLy8g64qULCAjNQorICAgIDB4QjI5OCwgLy8g64qYLCAjMzIyCisgICAgMHhCMkE1LCAvLyDriqUsICMxOTAKKyAgICAweEIyQzgsIC8vIOuLiCwgIzE2CisgICAgMHhCMkQ4LCAvLyDri5gsICMxNTMKKyAgICAweEIyRTQsIC8vIOuLpCwgIzIKKyAgICAweEIyRTgsIC8vIOuLqCwgIzEzNAorICAgIDB4QjJFQiwgLy8g64urLCAjMTk1CisgICAgMHhCMkVDLCAvLyDri6wsICMyNDMKKyAgICAweEIyRjQsIC8vIOuLtCwgIzI1NAorICAgIDB4QjJGNSwgLy8g64u1LCAjMjg3CisgICAgMHhCMkY5LCAvLyDri7ksICMxNTkKKyAgICAweEIzMDAsIC8vIOuMgCwgIzMzCisgICAgMHhCMzEzLCAvLyDrjJMsICMzMDMKKyAgICAweEIzNTQsIC8vIOuNlCwgIzE0MAorICAgIDB4QjM1OCwgLy8g642YLCAjMjUyCisgICAgMHhCMzY3LCAvLyDrjacsICM0NjMKKyAgICAweEIzNzAsIC8vIOuNsCwgIzEwNAorICAgIDB4QjM3OCwgLy8g6424LCAjNDI5CisgICAgMHhCM0M0LCAvLyDrj4QsICMyNQorICAgIDB4QjNDNSwgLy8g64+FLCAjMzAxCisgICAgMHhCM0NDLCAvLyDrj4wsICMzMDkKKyAgICAweEIzRDksIC8vIOuPmSwgIzU4CisgICAgMHhCNDE4LCAvLyDrkJgsICM4MgorICAgIDB4QjQxQywgLy8g65CcLCAjMTg5CisgICAgMHhCNDIwLCAvLyDrkKAsICM0MDgKKyAgICAweEI0MjksIC8vIOuQqSwgIzMzMgorICAgIDB4QjQ1MCwgLy8g65GQLCAjMTk5CisgICAgMHhCNEE0LCAvLyDrkqQsICM0OTYKKyAgICAweEI0REMsIC8vIOuTnCwgIzQwCisgICAgMHhCNEUwLCAvLyDrk6AsICMyODMKKyAgICAweEI0RTQsIC8vIOuTpCwgIzU0CisgICAgMHhCNEVGLCAvLyDrk68sICM0NzgKKyAgICAweEI0RjEsIC8vIOuTsSwgIzkwCisgICAgMHhCNTE0LCAvLyDrlJQsICMxMzMKKyAgICAweEI1MjksIC8vIOuUqSwgIzQ2MgorICAgIDB4QjUzMCwgLy8g65SwLCAjMzMzCisgICAgMHhCNTRDLCAvLyDrlYwsICMyNDAKKyAgICAweEI2MTAsIC8vIOuYkCwgIzMxMworICAgIDB4Qjc3QywgLy8g6528LCAjNDIKKyAgICAweEI3N0QsIC8vIOudvSwgIzM1NQorICAgIDB4Qjc4MCwgLy8g656ALCAjMjkwCisgICAgMHhCNzhDLCAvLyDrnowsICMyNDYKKyAgICAweEI3OEQsIC8vIOuejSwgIzQyMAorICAgIDB4Qjc5MSwgLy8g656RLCAjMjcwCisgICAgMHhCNzk4LCAvLyDrnpgsICMxNzQKKyAgICAweEI3OTksIC8vIOuemSwgIzM4MQorICAgIDB4Qjc5QywgLy8g656cLCAjMzU3CisgICAgMHhCN0E4LCAvLyDrnqgsICMzNTkKKyAgICAweEI3QTksIC8vIOueqSwgIzQwMgorICAgIDB4QjdDOSwgLy8g65+JLCAjMzQ2CisgICAgMHhCN0VDLCAvLyDrn6wsICMxMzAKKyAgICAweEI3RjAsIC8vIOufsCwgIzMxMgorICAgIDB4QjdGQywgLy8g65+8LCAjMzI3CisgICAgMHhCN0ZELCAvLyDrn70sICM0NDcKKyAgICAweEI4MDcsIC8vIOughywgIzQxMgorICAgIDB4QjgwOCwgLy8g66CILCAjMTE0CisgICAgMHhCODBDLCAvLyDroIwsICMzOTUKKyAgICAweEI4MjQsIC8vIOugpCwgIzE1OAorICAgIDB4QjgyNSwgLy8g66ClLCAjMTk0CisgICAgMHhCODI4LCAvLyDroKgsICMzMjYKKyAgICAweEI4MzksIC8vIOuguSwgIzM4OQorICAgIDB4Qjg1QywgLy8g66GcLCAjNAorICAgIDB4Qjg1RCwgLy8g66GdLCAjODQKKyAgICAweEI4NjAsIC8vIOuhoCwgIzM2NgorICAgIDB4QjhDQywgLy8g66OMLCAjMTU0CisgICAgMHhCOEU4LCAvLyDro6gsICMyMzYKKyAgICAweEI5NTgsIC8vIOulmCwgIzI2NQorICAgIDB4Qjk3NCwgLy8g66W0LCAjMjEyCisgICAgMHhCOTc4LCAvLyDrpbgsICMyNTAKKyAgICAweEI5N0MsIC8vIOulvCwgIzM1CisgICAgMHhCOTg0LCAvLyDrpoQsICMyNzYKKyAgICAweEI5QUMsIC8vIOumrCwgIzE5CisgICAgMHhCOUFELCAvLyDrpq0sICMzOTQKKyAgICAweEI5QjAsIC8vIOumsCwgIzI1OQorICAgIDB4QjlCNCwgLy8g66a0LCAjNDg1CisgICAgMHhCOUJDLCAvLyDrprwsICMzMDUKKyAgICAweEI5QkQsIC8vIOumvSwgIzIxNworICAgIDB4QjlDMSwgLy8g66eBLCAjMzUxCisgICAgMHhCOUM4LCAvLyDrp4gsICM2NworICAgIDB4QjlDOSwgLy8g66eJLCAjMzEwCisgICAgMHhCOUNDLCAvLyDrp4wsICM2NQorICAgIDB4QjlDRSwgLy8g66eOLCAjMjU3CisgICAgMHhCOUQwLCAvLyDrp5AsICMxODgKKyAgICAweEI5REIsIC8vIOunmywgIzM5NworICAgIDB4QjlERCwgLy8g66edLCAjMzcwCisgICAgMHhCOURFLCAvLyDrp54sICMzOTkKKyAgICAweEI5RTQsIC8vIOunpCwgIzEyNQorICAgIDB4QjlFOCwgLy8g66eoLCAjNDIyCisgICAgMHhCQTM4LCAvLyDrqLgsICMzMTEKKyAgICAweEJBMzksIC8vIOuouSwgIzM3NworICAgIDB4QkEzQywgLy8g66i8LCAjNDY5CisgICAgMHhCQTU0LCAvLyDrqZQsICMxNDcKKyAgICAweEJBNzAsIC8vIOupsCwgIzE5MQorICAgIDB4QkE3NCwgLy8g66m0LCAjNzIKKyAgICAweEJBODUsIC8vIOuqhSwgIzEzMQorICAgIDB4QkFBOCwgLy8g66qoLCAjNzMKKyAgICAweEJBQTksIC8vIOuqqSwgIzE1NworICAgIDB4QkFCMCwgLy8g66qwLCAjNDAxCisgICAgMHhCQUI4LCAvLyDrqrgsICM0MzcKKyAgICAweEJBQkIsIC8vIOuquywgIzMzNgorICAgIDB4QkIzNCwgLy8g66y0LCAjODAKKyAgICAweEJCMzgsIC8vIOusuCwgIzU3CisgICAgMHhCQjNDLCAvLyDrrLwsICM5NAorICAgIDB4QkJBNCwgLy8g666kLCAjNDMxCisgICAgMHhCQkY4LCAvLyDrr7gsICM3NgorICAgIDB4QkJGQywgLy8g66+8LCAjMjAwCisgICAgMHhCQzAwLCAvLyDrsIAsICMzMDgKKyAgICAweEJDMEYsIC8vIOuwjywgIzI0OQorICAgIDB4QkMxNCwgLy8g67CULCAjODkKKyAgICAweEJDMTUsIC8vIOuwlSwgIzIyNgorICAgIDB4QkMxOCwgLy8g67CYLCAjMTc1CisgICAgMHhCQzFCLCAvLyDrsJssICMyNDgKKyAgICAweEJDMUMsIC8vIOuwnCwgIzE2NAorICAgIDB4QkMyOSwgLy8g67CpLCAjOTIKKyAgICAweEJDMzAsIC8vIOuwsCwgIzE2MgorICAgIDB4QkMzMSwgLy8g67CxLCAjMjU2CisgICAgMHhCQzg0LCAvLyDrsoQsICMxMTEKKyAgICAweEJDODgsIC8vIOuyiCwgIzE2NworICAgIDB4QkM4QywgLy8g67KMLCAjNDIzCisgICAgMHhCQzk0LCAvLyDrspQsICM0MjcKKyAgICAweEJDOTUsIC8vIOuylSwgIzIwNworICAgIDB4QkNBMCwgLy8g67KgLCAjMjgxCisgICAgMHhCQ0E0LCAvLyDrsqQsICMzNzgKKyAgICAweEJDQTgsIC8vIOuyqCwgIzM4NworICAgIDB4QkNDMCwgLy8g67OALCAjMjUzCisgICAgMHhCQ0M0LCAvLyDrs4QsICMyNjIKKyAgICAweEJDRDEsIC8vIOuzkSwgIzM0MAorICAgIDB4QkNGNCwgLy8g67O0LCAjMjAKKyAgICAweEJDRjUsIC8vIOuztSwgIzIwNAorICAgIDB4QkNGOCwgLy8g67O4LCAjMTgyCisgICAgMHhCQ0ZDLCAvLyDrs7wsICMzODUKKyAgICAweEJEMDksIC8vIOu0iSwgIzQwNQorICAgIDB4QkQ4MCwgLy8g67aALCAjNDYKKyAgICAweEJEODEsIC8vIOu2gSwgIzI2MQorICAgIDB4QkQ4NCwgLy8g67aELCAjMTA1CisgICAgMHhCRDg4LCAvLyDrtogsICMyMjUKKyAgICAweEJERjAsIC8vIOu3sCwgIzM1MAorICAgIDB4QkUwQywgLy8g67iMLCAjMjE0CisgICAgMHhCRTE0LCAvLyDruJQsICM5OQorICAgIDB4QkU0NCwgLy8g67mELCAjNTUKKyAgICAweEJFNEMsIC8vIOu5jCwgIzUxMAorICAgIDB4QkU2MCwgLy8g67mgLCAjMzk4CisgICAgMHhDMEFDLCAvLyDsgqwsICMxNAorICAgIDB4QzBBRCwgLy8g7IKtLCAjMzQyCisgICAgMHhDMEIwLCAvLyDsgrAsICMxMjEKKyAgICAweEMwQjQsIC8vIOyCtCwgIzI3OQorICAgIDB4QzBCQywgLy8g7IK8LCAjMzQ4CisgICAgMHhDMEMxLCAvLyDsg4EsICM0MQorICAgIDB4QzBDOCwgLy8g7IOILCAjMjgyCisgICAgMHhDMEM5LCAvLyDsg4ksICMxODEKKyAgICAweEMwREQsIC8vIOyDnSwgIzEwOQorICAgIDB4QzExQywgLy8g7IScLCAjMjEKKyAgICAweEMxMUQsIC8vIOyEnSwgIzIzNAorICAgIDB4QzEyMCwgLy8g7ISgLCAjMTA3CisgICAgMHhDMTI0LCAvLyDshKQsICMxNzAKKyAgICAweEMxMzEsIC8vIOyEsSwgIzUwCisgICAgMHhDMTM4LCAvLyDshLgsICM2MAorICAgIDB4QzEzOSwgLy8g7IS5LCAjNDU2CisgICAgMHhDMTNDLCAvLyDshLwsICMyNjcKKyAgICAweEMxNTQsIC8vIOyFlCwgIzQ1NQorICAgIDB4QzE1OCwgLy8g7IWYLCAjMjM3CisgICAgMHhDMTVDLCAvLyDshZwsICM0NDgKKyAgICAweEMxNjgsIC8vIOyFqCwgIzQyMQorICAgIDB4QzE4QywgLy8g7IaMLCAjNTEKKyAgICAweEMxOEQsIC8vIOyGjSwgIzIxOQorICAgIDB4QzE5MCwgLy8g7IaQLCAjMzIzCisgICAgMHhDMUExLCAvLyDshqEsICMyMDMKKyAgICAweEMxQzQsIC8vIOyHhCwgIzUwMQorICAgIDB4QzFGQywgLy8g7Ie8LCAjMzY0CisgICAgMHhDMjE4LCAvLyDsiJgsICMyNworICAgIDB4QzIxOSwgLy8g7IiZLCAjNDY3CisgICAgMHhDMjFDLCAvLyDsiJwsICMyNTgKKyAgICAweEMyMjAsIC8vIOyIoCwgIzMwMgorICAgIDB4QzI2QywgLy8g7ImsLCAjNTExCisgICAgMHhDMjg4LCAvLyDsiogsICMzODQKKyAgICAweEMyQTQsIC8vIOyKpCwgIzExCisgICAgMHhDMkFDLCAvLyDsiqwsICM0MzgKKyAgICAweEMyQjQsIC8vIOyKtCwgIzUwNAorICAgIDB4QzJCNSwgLy8g7Iq1LCAjNzcKKyAgICAweEMyQjksIC8vIOyKuSwgIzI5OQorICAgIDB4QzJEQywgLy8g7IucLCAjMTMKKyAgICAweEMyREQsIC8vIOyLnSwgIzEzNworICAgIDB4QzJFMCwgLy8g7IugLCAjNDcKKyAgICAweEMyRTQsIC8vIOyLpCwgIzEzMgorICAgIDB4QzJFQywgLy8g7IusLCAjMTk2CisgICAgMHhDMkVELCAvLyDsi60sICM0ODIKKyAgICAweEMyRjYsIC8vIOyLtiwgIzM1MgorICAgIDB4QzJGOCwgLy8g7Iu4LCAjNDE5CisgICAgMHhDNEYwLCAvLyDsk7AsICMyNzgKKyAgICAweEM1MjgsIC8vIOyUqCwgIzM2MAorICAgIDB4QzU0NCwgLy8g7JWELCAjMjMKKyAgICAweEM1NDUsIC8vIOyVhSwgIzI5NgorICAgIDB4QzU0OCwgLy8g7JWILCAjNzEKKyAgICAweEM1NEEsIC8vIOyViiwgIzIwOQorICAgIDB4QzU0QywgLy8g7JWMLCAjMjIyCisgICAgMHhDNTU0LCAvLyDslZQsICM0NjAKKyAgICAweEM1NTgsIC8vIOyVmCwgIzM0OQorICAgIDB4QzU1OSwgLy8g7JWZLCAjNDczCisgICAgMHhDNTVFLCAvLyDslZ4sICM0MzQKKyAgICAweEM1NjAsIC8vIOyVoCwgIzI3MQorICAgIDB4QzU2MSwgLy8g7JWhLCAjNDE1CisgICAgMHhDNTcxLCAvLyDslbEsICM0NzcKKyAgICAweEM1N0MsIC8vIOyVvCwgIzEyNAorICAgIDB4QzU3RCwgLy8g7JW9LCAjMjI5CisgICAgMHhDNTkxLCAvLyDslpEsICMxNzcKKyAgICAweEM1QjQsIC8vIOyWtCwgIzI0CisgICAgMHhDNUI1LCAvLyDslrUsICM0MDcKKyAgICAweEM1QjgsIC8vIOyWuCwgIzI5NAorICAgIDB4QzVCQywgLy8g7Ja8LCAjMzU2CisgICAgMHhDNUM0LCAvLyDsl4QsICM0MjYKKyAgICAweEM1QzUsIC8vIOyXhSwgIzExOAorICAgIDB4QzVDNiwgLy8g7JeGLCAjMTc4CisgICAgMHhDNUM4LCAvLyDsl4gsICMxNjUKKyAgICAweEM1RDAsIC8vIOyXkCwgIzkKKyAgICAweEM1RDQsIC8vIOyXlCwgIzM3NQorICAgIDB4QzVEOCwgLy8g7JeYLCAjNTA2CisgICAgMHhDNUVDLCAvLyDsl6wsICM2NgorICAgIDB4QzVFRCwgLy8g7JetLCAjMTg2CisgICAgMHhDNUVFLCAvLyDsl64sICM0ODgKKyAgICAweEM1RjAsIC8vIOyXsCwgIzk2CisgICAgMHhDNUY0LCAvLyDsl7QsICMyNjYKKyAgICAweEM1RkMsIC8vIOyXvCwgIzQ0OQorICAgIDB4QzYwMCwgLy8g7JiALCAjMzc0CisgICAgMHhDNjAxLCAvLyDsmIEsICM4MworICAgIDB4QzYwOCwgLy8g7JiILCAjMTY4CisgICAgMHhDNjI0LCAvLyDsmKQsICM3NQorICAgIDB4QzYyOCwgLy8g7JioLCAjMzAwCisgICAgMHhDNjJDLCAvLyDsmKwsICMzMDYKKyAgICAweEM2NDAsIC8vIOyZgCwgIzExOQorICAgIDB4QzY0NCwgLy8g7JmELCAjMzYxCisgICAgMHhDNjU0LCAvLyDsmZQsICM0ODkKKyAgICAweEM2NTUsIC8vIOyZlSwgIzQxOAorICAgIDB4QzY3OCwgLy8g7Jm4LCAjMjE4CisgICAgMHhDNjk0LCAvLyDsmpQsICM0MworICAgIDB4QzY5NSwgLy8g7JqVLCAjNDc5CisgICAgMHhDNkE5LCAvLyDsmqksICM0OAorICAgIDB4QzZCMCwgLy8g7JqwLCAjNjQKKyAgICAweEM2QjEsIC8vIOyasSwgIzUwMworICAgIDB4QzZCNCwgLy8g7Jq0LCAjMTA4CisgICAgMHhDNkI4LCAvLyDsmrgsICMyMjMKKyAgICAweEM2QzAsIC8vIOybgCwgIzMxNworICAgIDB4QzZDMywgLy8g7JuDLCAjNDA0CisgICAgMHhDNkNDLCAvLyDsm4wsICMyODAKKyAgICAweEM2RDAsIC8vIOybkCwgIzQ1CisgICAgMHhDNkQ0LCAvLyDsm5QsICMxNTAKKyAgICAweEM2RTgsIC8vIOybqCwgIzQ0NgorICAgIDB4QzZGOSwgLy8g7Ju5LCAjNTAwCisgICAgMHhDNzA0LCAvLyDsnIQsICM3OAorICAgIDB4QzcyMCwgLy8g7JygLCAjODEKKyAgICAweEM3MjEsIC8vIOycoSwgIzMyMQorICAgIDB4QzcyNCwgLy8g7JykLCAjNDE2CisgICAgMHhDNzNDLCAvLyDsnLwsICM0OQorICAgIDB4Qzc0MCwgLy8g7J2ALCAjMzEKKyAgICAweEM3NDQsIC8vIOydhCwgIzE3CisgICAgMHhDNzRDLCAvLyDsnYwsICMxMTIKKyAgICAweEM3NTEsIC8vIOydkSwgIzQ2MQorICAgIDB4Qzc1OCwgLy8g7J2YLCAjOAorICAgIDB4Qzc3NCwgLy8g7J20LCAjMQorICAgIDB4Qzc3NSwgLy8g7J21LCAjNDAzCisgICAgMHhDNzc4LCAvLyDsnbgsICMxOAorICAgIDB4Qzc3QywgLy8g7J28LCAjMjgKKyAgICAweEM3ODQsIC8vIOyehCwgIzE2MAorICAgIDB4Qzc4NSwgLy8g7J6FLCAjOTMKKyAgICAweEM3ODgsIC8vIOyeiCwgIzQ0CisgICAgMHhDNzkwLCAvLyDsnpAsICMyMgorICAgIDB4Qzc5MSwgLy8g7J6RLCAjODgKKyAgICAweEM3OTgsIC8vIOyemCwgIzM0NworICAgIDB4QzdBMSwgLy8g7J6hLCAjMzcyCisgICAgMHhDN0E1LCAvLyDsnqUsICM1MworICAgIDB4QzdBQywgLy8g7J6sLCAjMTIwCisgICAgMHhDN0MxLCAvLyDsn4EsICM0ODMKKyAgICAweEM4MDAsIC8vIOyggCwgIzk4CisgICAgMHhDODAxLCAvLyDsoIEsICM5NworICAgIDB4QzgwNCwgLy8g7KCELCAjMzQKKyAgICAweEM4MDgsIC8vIOygiCwgIzMyMAorICAgIDB4QzgxMCwgLy8g7KCQLCAjMjAxCisgICAgMHhDODExLCAvLyDsoJEsICMzMzEKKyAgICAweEM4MTUsIC8vIOyglSwgIzI2CisgICAgMHhDODFDLCAvLyDsoJwsICMyOQorICAgIDB4QzgzOCwgLy8g7KC4LCAjNDE0CisgICAgMHhDODcwLCAvLyDsobAsICM4NgorICAgIDB4Qzg3MSwgLy8g7KGxLCAjMzczCisgICAgMHhDODc0LCAvLyDsobQsICM0MzIKKyAgICAweEM4ODAsIC8vIOyigCwgIzQ3MAorICAgIDB4Qzg4NSwgLy8g7KKFLCAjMjA4CisgICAgMHhDODhCLCAvLyDsoossICMyMzkKKyAgICAweEM4RTAsIC8vIOyjoCwgIzQ1MQorICAgIDB4QzhGQywgLy8g7KO8LCAjMzgKKyAgICAweEM4RkQsIC8vIOyjvSwgIzQ3MQorICAgIDB4QzkwMCwgLy8g7KSALCAjMjg2CisgICAgMHhDOTA0LCAvLyDspIQsICMzOTIKKyAgICAweEM5MTEsIC8vIOykkSwgIzEwMworICAgIDB4Qzk4OCwgLy8g7KaILCAjMjU1CisgICAgMHhDOThDLCAvLyDspowsICM1MDcKKyAgICAweEM5OTAsIC8vIOymkCwgIzM3MQorICAgIDB4Qzk5RCwgLy8g7KadLCAjMjYwCisgICAgMHhDOUMwLCAvLyDsp4AsICMxMAorICAgIDB4QzlDMSwgLy8g7KeBLCAjMjE2CisgICAgMHhDOUM0LCAvLyDsp4QsICM3OQorICAgIDB4QzlDOCwgLy8g7KeILCAjMjM4CisgICAgMHhDOUQxLCAvLyDsp5EsICMyMDYKKyAgICAweEM5REMsIC8vIOynnCwgIzQxMQorICAgIDB4QzlGOCwgLy8g7Ke4LCAjNDk0CisgICAgMHhDQUJELCAvLyDsqr0sICM0MzUKKyAgICAweENDMjgsIC8vIOywqCwgIzE0NgorICAgIDB4Q0MyOSwgLy8g7LCpLCAjNDQzCisgICAgMHhDQzJDLCAvLyDssKwsICM0ODEKKyAgICAweENDMzAsIC8vIOywsCwgIzQ0MAorICAgIDB4Q0MzOCwgLy8g7LC4LCAjMzQzCisgICAgMHhDQzNELCAvLyDssL0sICMzMDQKKyAgICAweENDM0UsIC8vIOywviwgIzMzNQorICAgIDB4Q0M0NCwgLy8g7LGELCAjMjg0CisgICAgMHhDQzQ1LCAvLyDssYUsICMyOTgKKyAgICAweENDOTgsIC8vIOyymCwgIzI0MgorICAgIDB4Q0M5QywgLy8g7LKcLCAjMTQzCisgICAgMHhDQ0EwLCAvLyDssqAsICMzODAKKyAgICAweENDQTgsIC8vIOyyqCwgIzQ1MgorICAgIDB4Q0NBQiwgLy8g7LKrLCAjNDg0CisgICAgMHhDQ0FELCAvLyDssq0sICMxOTcKKyAgICAweENDQjQsIC8vIOyytCwgIzEyNgorICAgIDB4Q0NEMCwgLy8g7LOQLCAjNDcyCisgICAgMHhDRDA4LCAvLyDstIgsICMyMjAKKyAgICAweENEMUQsIC8vIOy0nSwgIzQwNgorICAgIDB4Q0Q1QywgLy8g7LWcLCAjMTc5CisgICAgMHhDRDk0LCAvLyDstpQsICMxMzYKKyAgICAweENEOTUsIC8vIOy2lSwgIzMzNworICAgIDB4Q0Q5QywgLy8g7LacLCAjMTY2CisgICAgMHhDREE5LCAvLyDstqksICMzNjkKKyAgICAweENERTgsIC8vIOy3qCwgIzIxMAorICAgIDB4Q0UyMCwgLy8g7LigLCAjMjE1CisgICAgMHhDRTIxLCAvLyDsuKEsICM0NjgKKyAgICAweENFMzUsIC8vIOy4tSwgIzUxMgorICAgIDB4Q0U1OCwgLy8g7LmYLCAjMTAyCisgICAgMHhDRTVDLCAvLyDsuZwsICMzMjUKKyAgICAweENFNjgsIC8vIOy5qCwgIzI2MworICAgIDB4Q0U3NCwgLy8g7Lm0LCAjMTE1CisgICAgMHhDRTdDLCAvLyDsubwsICM0NjYKKyAgICAweENFOTAsIC8vIOy6kCwgIzQ1NAorICAgIDB4Q0VFNCwgLy8g7LukLCAjMjg1CisgICAgMHhDRUU4LCAvLyDsu6gsICMzMjgKKyAgICAweENFRjQsIC8vIOy7tCwgIzQxNworICAgIDB4Q0YwMCwgLy8g7LyALCAjMzM5CisgICAgMHhDRjEzLCAvLyDsvJMsICM1MDkKKyAgICAweENGMUMsIC8vIOy8nCwgIzUwOAorICAgIDB4Q0Y1NCwgLy8g7L2ULCAjMTkzCisgICAgMHhDRjU4LCAvLyDsvZgsICMzOTEKKyAgICAweENGRTAsIC8vIOy/oCwgIzM5MworICAgIDB4RDAzNSwgLy8g7YC1LCAjNDUzCisgICAgMHhEMDZDLCAvLyDtgawsICMxMDEKKyAgICAweEQwNzAsIC8vIO2BsCwgIzQ5NQorICAgIDB4RDA3NCwgLy8g7YG0LCAjMjg5CisgICAgMHhEMEE0LCAvLyDtgqQsICMyMzAKKyAgICAweEQwQzAsIC8vIO2DgCwgIzEyNworICAgIDB4RDBDMSwgLy8g7YOBLCAjMzE0CisgICAgMHhEMEM0LCAvLyDtg4QsICM0NTAKKyAgICAweEQwQzgsIC8vIO2DiCwgIzQzNgorICAgIDB4RDBEQywgLy8g7YOcLCAjMjIxCisgICAgMHhEMERELCAvLyDtg50sICMyNzUKKyAgICAweEQxMzAsIC8vIO2EsCwgIzcwCisgICAgMHhEMTRDLCAvLyDthYwsICMyMTMKKyAgICAweEQxNTAsIC8vIO2FkCwgIzMyNAorICAgIDB4RDE1NCwgLy8g7YWULCAjNDMwCisgICAgMHhEMTVDLCAvLyDthZwsICMzODIKKyAgICAweEQxQTAsIC8vIO2GoCwgIzE0NQorICAgIDB4RDFCNSwgLy8g7Ya1LCAjMTU2CisgICAgMHhEMjJDLCAvLyDtiKwsICMyMjcKKyAgICAweEQyQjgsIC8vIO2KuCwgIzM3CisgICAgMHhEMkI5LCAvLyDtirksICMyNDcKKyAgICAweEQyRjAsIC8vIO2LsCwgIzE4NworICAgIDB4RDMwNSwgLy8g7YyFLCAjNDEwCisgICAgMHhEMzBDLCAvLyDtjIwsICMxNDEKKyAgICAweEQzMTAsIC8vIO2MkCwgIzE2MworICAgIDB4RDMxNCwgLy8g7YyULCAjNDk5CisgICAgMHhEMzI4LCAvLyDtjKgsICMzMDcKKyAgICAweEQzMkMsIC8vIO2MrCwgIzQ1OQorICAgIDB4RDMzOCwgLy8g7Yy4LCAjNDMzCisgICAgMHhEMzdDLCAvLyDtjbwsICMzNDQKKyAgICAweEQzOTgsIC8vIO2OmCwgIzE3MgorICAgIDB4RDNCOCwgLy8g7Y64LCAjMjUxCisgICAgMHhEM0M5LCAvLyDtj4ksICMyOTEKKyAgICAweEQzRUMsIC8vIO2PrCwgIzY4CisgICAgMHhEM0VELCAvLyDtj60sICM0NDUKKyAgICAweEQzRjAsIC8vIO2PsCwgIzMxOAorICAgIDB4RDQ1QywgLy8g7ZGcLCAjMjMyCisgICAgMHhENDgwLCAvLyDtkoAsICM0OTcKKyAgICAweEQ0ODgsIC8vIO2SiCwgIzExMworICAgIDB4RDQ4RCwgLy8g7ZKNLCAjNDI1CisgICAgMHhENTA0LCAvLyDtlIQsICMxMTAKKyAgICAweEQ1MDgsIC8vIO2UiCwgIzQ5OAorICAgIDB4RDUwQywgLy8g7ZSMLCAjMjExCisgICAgMHhENTNDLCAvLyDtlLwsICMxNjkKKyAgICAweEQ1NDQsIC8vIO2VhCwgIzI5NQorICAgIDB4RDU1MSwgLy8g7ZWRLCAjMzc2CisgICAgMHhENTU4LCAvLyDtlZgsICM3CisgICAgMHhENTU5LCAvLyDtlZksICMxMjkKKyAgICAweEQ1NUMsIC8vIO2VnCwgIzE1CisgICAgMHhENTYwLCAvLyDtlaAsICMxNDQKKyAgICAweEQ1NjgsIC8vIO2VqCwgIzE1MgorICAgIDB4RDU2OSwgLy8g7ZWpLCAjMTIzCisgICAgMHhENTZELCAvLyDtla0sICMyNjgKKyAgICAweEQ1NzQsIC8vIO2VtCwgIzMyCisgICAgMHhENTg4LCAvLyDtlogsICMxODAKKyAgICAweEQ1ODksIC8vIO2WiSwgIzEzNQorICAgIDB4RDVBNSwgLy8g7ZalLCAjMzQ1CisgICAgMHhENUM4LCAvLyDtl4gsICMzOTYKKyAgICAweEQ1RDgsIC8vIO2XmCwgIzMxNgorICAgIDB4RDVFNCwgLy8g7ZekLCAjNDc0CisgICAgMHhENjA0LCAvLyDtmIQsICMxODUKKyAgICAweEQ2MTEsIC8vIO2YkSwgIzMxNQorICAgIDB4RDYxNSwgLy8g7ZiVLCAjMjQ0CisgICAgMHhENjFDLCAvLyDtmJwsICM0MjgKKyAgICAweEQ2MzgsIC8vIO2YuCwgIzExNworICAgIDB4RDYzQywgLy8g7Zi8LCAjMzU4CisgICAgMHhENjQ4LCAvLyDtmYgsICMzMzAKKyAgICAweEQ2NEQsIC8vIO2ZjSwgIzM2MworICAgIDB4RDY1NCwgLy8g7ZmULCAjNjMKKyAgICAweEQ2NTUsIC8vIO2ZlSwgIzE4MworICAgIDB4RDY1OCwgLy8g7ZmYLCAjMjI0CisgICAgMHhENjVDLCAvLyDtmZwsICMyNzcKKyAgICAweEQ2NjksIC8vIO2ZqSwgIzM1MworICAgIDB4RDY4QywgLy8g7ZqMLCAjNzQKKyAgICAweEQ2OEQsIC8vIO2ajSwgIzQ1OAorICAgIDB4RDY5RiwgLy8g7ZqfLCAjNDA5CisgICAgMHhENkE4LCAvLyDtmqgsICM0MDAKKyAgICAweEQ2QzQsIC8vIO2bhCwgIzE3NgorICAgIDB4RDZDOCwgLy8g7ZuILCAjNDg2CisgICAgMHhENzM0LCAvLyDtnLQsICMzNjUKKyAgICAweEQ3NTQsIC8vIO2dlCwgIzQ4MAorICAgIDB4RDc2QywgLy8g7Z2sLCAjMzM0CisgICAgMHhENzg4LCAvLyDtnogsICMyMjgKKyAgICAweEQ3OTgsIC8vIO2emCwgIzUwMgorfTsKKy8vIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBzYW1wbGUgY292ZXJlZCBieSB0aGUgYWJvdmUgY2hhcmFjdGVycworc3RhdGljIGNvbnN0IGZsb2F0IGZyZXF1ZW50X2tvX2NvdmVyYWdlPTAuOTQ4MTU3MDIxNDY0MTg0OworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDk4ZDNkZWUuLmFjMmQxYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC01OCw3ICs1OCw3IEBACiAgICAgUkVTVE9SRV9PVVRQVVQsCiAgICAgT1BFTl9JTlBVVCwKICAgICBDTE9TRV9JTlBVVCwKLSAgICBTRVRfU1RSRUFNX09VVFBVVCwKKyAgICBJTlZBTElEQVRFX1NUUkVBTSwKICAgICBTRVRfVk9JQ0VfVk9MVU1FLAogICAgIEdFVF9SRU5ERVJfUE9TSVRJT04sCiAgICAgR0VUX0lOUFVUX0ZSQU1FU19MT1NULApAQCAtNzQsOCArNzQsMTcgQEAKICAgICBHRVRfUFJJTUFSWV9PVVRQVVRfU0FNUExJTkdfUkFURSwKICAgICBHRVRfUFJJTUFSWV9PVVRQVVRfRlJBTUVfQ09VTlQsCiAgICAgU0VUX0xPV19SQU1fREVWSUNFLAorICAgIExJU1RfQVVESU9fUE9SVFMsCisgICAgR0VUX0FVRElPX1BPUlQsCisgICAgQ1JFQVRFX0FVRElPX1BBVENILAorICAgIFJFTEVBU0VfQVVESU9fUEFUQ0gsCisgICAgTElTVF9BVURJT19QQVRDSEVTLAorICAgIFNFVF9BVURJT19QT1JUX0NPTkZJRywKKyAgICBHRVRfQVVESU9fSFdfU1lOQwogfTsKIAorI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNAorCiBjbGFzcyBCcEF1ZGlvRmxpbmdlciA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9GbGluZ2VyPgogewogcHVibGljOgpAQCAtODksMTMgKzk4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4JiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogICAgIHsKQEAgLTEwNiw5ICsxMTQsMTEgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZyYW1lQ291bnQpOworICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IHBGcmFtZUNvdW50ICE9IE5VTEwgPyAqcEZyYW1lQ291bnQgOiAwOworICAgICAgICBkYXRhLndyaXRlSW50NjQoZnJhbWVDb3VudCk7CiAgICAgICAgIHRyYWNrX2ZsYWdzX3QgbEZsYWdzID0gZmxhZ3MgIT0gTlVMTCA/ICpmbGFncyA6ICh0cmFja19mbGFnc190KSBUUkFDS19ERUZBVUxUOwogICAgICAgICBkYXRhLndyaXRlSW50MzIobEZsYWdzKTsKKyAgICAgICAgLy8gaGF2ZVNoYXJlZEJ1ZmZlcgogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMih0cnVlKTsKICAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoc2hhcmVkQnVmZmVyLT5hc0JpbmRlcigpKTsKQEAgLTExNyw3ICsxMjcsNyBAQAogICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB0aWQpOwotICAgICAgICBpbnQgbFNlc3Npb25JZCA9IDA7CisgICAgICAgIGludCBsU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURTsKICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKICAgICAgICAgfQpAQCAtMTI3LDYgKzEzNywxMCBAQAogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrIGVycm9yOiAlcyIsIHN0cmVycm9yKC1sU3RhdHVzKSk7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gcmVwbHkucmVhZEludDY0KCk7CisgICAgICAgICAgICBpZiAocEZyYW1lQ291bnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBsRmxhZ3MgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGlmIChmbGFncyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmZsYWdzID0gbEZsYWdzOwpAQCAtMTM1LDExICsxNDksMjEgQEAKICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IHJlcGx5LnJlYWRTdHJpbmc4KCk7CiAgICAgICAgICAgICBsU3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICB0cmFjayA9IGludGVyZmFjZV9jYXN0PElBdWRpb1RyYWNrPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2sgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2sgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gSUF1ZGlvVHJhY2siKTsKKyAgICAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2sgcmV0dXJuZWQgYW4gSUF1ZGlvVHJhY2sgYnV0IHdpdGggc3RhdHVzICVkIiwgbFN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJhY2s7CkBAIC0xNTAsMTAgKzE3NCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgY2JsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGJ1ZmZlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0xNjMsMTkgKzE5MCwyNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxlUmF0ZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZnJhbWVDb3VudCk7CisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gcEZyYW1lQ291bnQgIT0gTlVMTCA/ICpwRnJhbWVDb3VudCA6IDA7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKICAgICAgICAgdHJhY2tfZmxhZ3NfdCBsRmxhZ3MgPSBmbGFncyAhPSBOVUxMID8gKmZsYWdzIDogKHRyYWNrX2ZsYWdzX3QpIFRSQUNLX0RFRkFVTFQ7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihsRmxhZ3MpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHRpZCk7Ci0gICAgICAgIGludCBsU2Vzc2lvbklkID0gMDsKKyAgICAgICAgaW50IGxTZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFOwogICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihsU2Vzc2lvbklkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KG5vdGlmaWNhdGlvbkZyYW1lcyAhPSBOVUxMID8gKm5vdGlmaWNhdGlvbkZyYW1lcyA6IDApOworICAgICAgICBjYmxrLmNsZWFyKCk7CisgICAgICAgIGJ1ZmZlcnMuY2xlYXIoKTsKICAgICAgICAgc3RhdHVzX3QgbFN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX1JFQ09SRCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkIGVycm9yOiAlcyIsIHN0cmVycm9yKC1sU3RhdHVzKSk7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gcmVwbHkucmVhZEludDY0KCk7CisgICAgICAgICAgICBpZiAocEZyYW1lQ291bnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBsRmxhZ3MgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGlmIChmbGFncyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmZsYWdzID0gbEZsYWdzOwpAQCAtMTg0LDIxICsyMTksNDIgQEAKICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZV90IGxOb3RpZmljYXRpb25GcmFtZXMgPSAoc2l6ZV90KSByZXBseS5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIGlmIChub3RpZmljYXRpb25GcmFtZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpub3RpZmljYXRpb25GcmFtZXMgPSBsTm90aWZpY2F0aW9uRnJhbWVzOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbFN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVjb3JkID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUmVjb3JkPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAoY2JsayAhPSAwICYmIGNibGstPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVycyA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAoYnVmZmVycyAhPSAwICYmIGJ1ZmZlcnMtPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBpZiAocmVjb3JkID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gSUF1ZGlvUmVjb3JkIik7CiAgICAgICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2JsayA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkIHNob3VsZCBoYXZlIHJldHVybmVkIGEgY2JsayIpOworICAgICAgICAgICAgICAgICAgICBsU3RhdHVzID0gTk9fTUVNT1JZOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBidWZmZXJzIGlzIHBlcm1pdHRlZCB0byBiZSAwCiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgib3BlblJlY29yZCByZXR1cm5lZCBhbiBJQXVkaW9SZWNvcmQgYnV0IHdpdGggc3RhdHVzICVkIiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5jbGVhcigpOworICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gMCB8fCBjYmxrICE9IDAgfHwgYnVmZmVycyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkIHJldHVybmVkIGFuIElBdWRpb1JlY29yZCwgY2JsaywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYnVmZmVycyBidXQgd2l0aCBzdGF0dXMgJWQiLCBsU3RhdHVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlY29yZC5jbGVhcigpOworICAgICAgICAgICAgICAgIGNibGsuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBidWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZWNvcmQ7CkBAIC0yMjgsNyArMjg0LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZSQU1FX0NPVU5ULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGxhdGVuY3koYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdApAQCAtMzc4LDUzICs0MzQsNDMgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU5QVVRCVUZGRVJTSVpFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKICAgICB7CisgICAgICAgIGlmIChvdXRwdXQgPT0gTlVMTCB8fCBjb25maWcgPT0gTlVMTCB8fCBkZXZpY2VzID09IE5VTEwgfHwgbGF0ZW5jeU1zID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IHBEZXZpY2VzICE9IE5VTEwgPyAqcERldmljZXMgOiAoYXVkaW9fZGV2aWNlc190KTA7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IHBTYW1wbGluZ1JhdGUgIT0gTlVMTCA/ICpwU2FtcGxpbmdSYXRlIDogMDsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gcEZvcm1hdCAhPSBOVUxMID8gKnBGb3JtYXQgOiBBVURJT19GT1JNQVRfREVGQVVMVDsKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBwQ2hhbm5lbE1hc2sgIT0gTlVMTCA/Ci0gICAgICAgICAgICAgICAgKnBDaGFubmVsTWFzayA6IChhdWRpb19jaGFubmVsX21hc2tfdCkwOwotICAgICAgICB1aW50MzJfdCBsYXRlbmN5ID0gcExhdGVuY3lNcyAhPSBOVUxMID8gKnBMYXRlbmN5TXMgOiAwOwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKG1vZHVsZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihkZXZpY2VzKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobGF0ZW5jeSk7CisgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCpkZXZpY2VzKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoYWRkcmVzcyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgZmxhZ3MpOwotICAgICAgICBpZiAob2ZmbG9hZEluZm8gPT0gTlVMTCkgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgZGF0YS53cml0ZShvZmZsb2FkSW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9PVVRQVVQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgcmV0dXJuZWQgb3V0cHV0LCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIGRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocERldmljZXMgIT0gTlVMTCkgKnBEZXZpY2VzID0gZGV2aWNlczsKLSAgICAgICAgc2FtcGxpbmdSYXRlID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwU2FtcGxpbmdSYXRlICE9IE5VTEwpICpwU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwotICAgICAgICBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocEZvcm1hdCAhPSBOVUxMKSAqcEZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgKnBDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgICAgICBsYXRlbmN5ID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwTGF0ZW5jeU1zICE9IE5VTEwpICpwTGF0ZW5jeU1zID0gbGF0ZW5jeTsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICpvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgcmV0dXJuZWQgb3V0cHV0LCAlZCIsICpvdXRwdXQpOworICAgICAgICByZXBseS5yZWFkKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgICpkZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgKmxhdGVuY3lNcyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCkBAIC00NjUsMzYgKzUxMSw0MCBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2spCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogICAgIHsKKyAgICAgICAgaWYgKGlucHV0ID09IE5VTEwgfHwgY29uZmlnID09IE5VTEwgfHwgZGV2aWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IHBEZXZpY2VzICE9IE5VTEwgPyAqcERldmljZXMgOiAoYXVkaW9fZGV2aWNlc190KTA7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IHBTYW1wbGluZ1JhdGUgIT0gTlVMTCA/ICpwU2FtcGxpbmdSYXRlIDogMDsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gcEZvcm1hdCAhPSBOVUxMID8gKnBGb3JtYXQgOiBBVURJT19GT1JNQVRfREVGQVVMVDsKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBwQ2hhbm5lbE1hc2sgIT0gTlVMTCA/Ci0gICAgICAgICAgICAgICAgKnBDaGFubmVsTWFzayA6IChhdWRpb19jaGFubmVsX21hc2tfdCkwOwotCiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIobW9kdWxlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGRldmljZXMpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxpbmdSYXRlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0lOUFVULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IChhdWRpb19pb19oYW5kbGVfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocERldmljZXMgIT0gTlVMTCkgKnBEZXZpY2VzID0gZGV2aWNlczsKLSAgICAgICAgc2FtcGxpbmdSYXRlID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwU2FtcGxpbmdSYXRlICE9IE5VTEwpICpwU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwotICAgICAgICBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocEZvcm1hdCAhPSBOVUxMKSAqcEZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgKnBDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigqaW5wdXQpOworICAgICAgICBkYXRhLndyaXRlKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigqZGV2aWNlKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoYWRkcmVzcyk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzb3VyY2UpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICppbnB1dCA9IChhdWRpb19pb19oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmVwbHkucmVhZChjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOworICAgICAgICAqZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChpbnQgaW5wdXQpCkBAIC01MDYsMTMgKzU1NiwxMiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1PdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9TVFJFQU1fT1VUUFVULCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSU5WQUxJREFURV9TVFJFQU0sIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKQEAgLTUyNSw3ICs1NzQsNyBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbihzaXplX3QgKmhhbEZyYW1lcywgc2l6ZV90ICpkc3BGcmFtZXMsCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzLAogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNTM1LDUxICs1ODQsNTYgQEAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHVpbnQzMl90IHRtcCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKGhhbEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGhhbEZyYW1lcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmhhbEZyYW1lcyA9IHRtcDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRtcCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKGRzcEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGRzcEZyYW1lcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmRzcEZyYW1lcyA9IHRtcDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIHZpcnR1YWwgc2l6ZV90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgaW9IYW5kbGUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0lOUFVUX0ZSQU1FU19MT1NULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU5QVVRfRlJBTUVTX0xPU1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodWludDMyX3QpIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCkKKyAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE5FV19BVURJT19TRVNTSU9OX0lELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpbnQgaWQgPSAwOworICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEU7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlkID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGlkOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikKKyAgICB2aXJ0dWFsIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIGludCBwaWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBpZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBQ1FVSVJFX0FVRElPX1NFU1NJT05fSUQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgaW50IHBpZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb1Nlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfQVVESU9fU0VTU0lPTl9JRCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKQEAgLTY1Nyw3ICs3MTEsNyBAQAogCiAgICAgICAgIGlmIChwRGVzYyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gZWZmZWN0OwotICAgICAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjc1LDcgKzcyOSw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBsU3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgdG1wID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoaWQpIHsKKyAgICAgICAgICAgIGlmIChpZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmlkID0gdG1wOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdG1wID0gcmVwbHkucmVhZEludDMyKCk7CkBAIC02ODUsNyArNzM5LDcgQEAKICAgICAgICAgICAgIGVmZmVjdCA9IGludGVyZmFjZV9jYXN0PElFZmZlY3Q+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgICAgICByZXBseS5yZWFkKHBEZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICAgICAgfQogCkBAIC03MjYsNyArNzgwLDcgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUklNQVJZX09VVFBVVF9GUkFNRV9DT1VOVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDY0KCk7CiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSkKQEAgLTczNyw3ICs3OTEsMTEyIEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTE9XX1JBTV9ERVZJQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9Ci0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzKQorICAgIHsKKyAgICAgICAgaWYgKG51bV9wb3J0cyA9PSBOVUxMIHx8ICpudW1fcG9ydHMgPT0gMCB8fCBwb3J0cyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigqbnVtX3BvcnRzKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfQVVESU9fUE9SVFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqbnVtX3BvcnRzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmVwbHkucmVhZChwb3J0cywgKm51bV9wb3J0cyAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKKyAgICB7CisgICAgICAgIGlmIChwb3J0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZShwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9BVURJT19QT1JULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmVwbHkucmVhZChwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQorICAgIHsKKyAgICAgICAgaWYgKHBhdGNoID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZShwYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICBkYXRhLndyaXRlKGhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfQVVESU9fUEFUQ0gsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXBseS5yZWFkKGhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfQVVESU9fUEFUQ0gsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKQorICAgIHsKKyAgICAgICAgaWYgKG51bV9wYXRjaGVzID09IE5VTEwgfHwgKm51bV9wYXRjaGVzID09IDAgfHwgcGF0Y2hlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigqbnVtX3BhdGNoZXMpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19QQVRDSEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKm51bV9wYXRjaGVzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmVwbHkucmVhZChwYXRjaGVzLCAqbnVtX3BhdGNoZXMgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQorICAgIHsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVESU9fUE9SVF9DT05GSUcsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB2aXJ0dWFsIGF1ZGlvX2h3X3N5bmNfdCBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uSWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0FVRElPX0hXX1NZTkMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19IV19TWU5DX0lOVkFMSUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChhdWRpb19od19zeW5jX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvRmxpbmdlciwgImFuZHJvaWQubWVkaWEuSUF1ZGlvRmxpbmdlciIpOwpAQCAtNzU0LDcgKzkxMyw3IEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgZmxhZ3MgPSAodHJhY2tfZmxhZ3NfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGJvb2wgaGF2ZVNoYXJlZEJ1ZmZlciA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlcjsKQEAgLTc2NSw3ICs5MjQsNiBAQAogICAgICAgICAgICAgcGlkX3QgdGlkID0gKHBpZF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIFN0cmluZzggbmFtZTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICAgICAgc3A8SUF1ZGlvVHJhY2s+IHRyYWNrOwogICAgICAgICAgICAgaWYgKChoYXZlU2hhcmVkQnVmZmVyICYmIChidWZmZXIgPT0gMCkpIHx8CkBAIC03NzUsMTIgKzkzMywxMyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0cmFjayA9IGNyZWF0ZVRyYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3QpIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCAmZmxhZ3MsIGJ1ZmZlciwgb3V0cHV0LCB0aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmc2Vzc2lvbklkLCBuYW1lLCBjbGllbnRVaWQsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssICZmcmFtZUNvdW50LCAmZmxhZ3MsIGJ1ZmZlciwgb3V0cHV0LCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAmc2Vzc2lvbklkLCBjbGllbnRVaWQsICZzdGF0dXMpOworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHRyYWNrICE9IDApICE9IChzdGF0dXMgPT0gTk9fRVJST1IpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGZyYW1lQ291bnQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmxhZ3MpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vzc2lvbklkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgobmFtZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKHRyYWNrLT5hc0JpbmRlcigpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTc5MSwxOCArOTUwLDI3IEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgZmxhZ3MgPSAodHJhY2tfZmxhZ3NfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHBpZF90IHRpZCA9IChwaWRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IGRhdGEucmVhZEludDY0KCk7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBjYmxrOworICAgICAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyczsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICAgICAgc3A8SUF1ZGlvUmVjb3JkPiByZWNvcmQgPSBvcGVuUmVjb3JkKGlucHV0LAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCAmZmxhZ3MsIHRpZCwgJnNlc3Npb25JZCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssICZmcmFtZUNvdW50LCAmZmxhZ3MsIHRpZCwgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgJm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgY2JsaywgYnVmZmVycywgJnN0YXR1cyk7CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChyZWNvcmQgIT0gMCkgIT0gKHN0YXR1cyA9PSBOT19FUlJPUikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoZnJhbWVDb3VudCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXNzaW9uSWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQobm90aWZpY2F0aW9uRnJhbWVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIocmVjb3JkLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihjYmxrLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihidWZmZXJzLT5hc0JpbmRlcigpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTQU1QTEVfUkFURTogewpAQCAtODE3LDcgKzk4NSw3IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgRlJBTUVfQ09VTlQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggZnJhbWVDb3VudCgoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCkpICk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NCggZnJhbWVDb3VudCgoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCkpICk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgTEFURU5DWTogewpAQCAtOTE2LDM4ICsxMDg0LDMxIEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaykgKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KCBnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaykgKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBPUEVOX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUgPSAoYXVkaW9fbW9kdWxlX2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJvb2wgaGFzT2ZmbG9hZEluZm8gPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7Ci0gICAgICAgICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBvZmZsb2FkSW5mbzsKLSAgICAgICAgICAgIGlmIChoYXNPZmZsb2FkSW5mbykgewotICAgICAgICAgICAgICAgIGRhdGEucmVhZCgmb2ZmbG9hZEluZm8sIHNpemVvZihhdWRpb19vZmZsb2FkX2luZm9fdCkpOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0ge307CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjM5MDU5NTEiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IG9wZW5PdXRwdXQobW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT2ZmbG9hZEluZm8gPyAmb2ZmbG9hZEluZm8gOiBOVUxMKTsKLSAgICAgICAgICAgIEFMT0dWKCJPUEVOX09VVFBVVCBvdXRwdXQsICVwIiwgb3V0cHV0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGV2aWNlcyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzYW1wbGluZ1JhdGUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZm9ybWF0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGxhdGVuY3kpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeU1zID0gMDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3Blbk91dHB1dChtb2R1bGUsICZvdXRwdXQsICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VzLCBhZGRyZXNzLCAmbGF0ZW5jeU1zLCBmbGFncyk7CisgICAgICAgICAgICBBTE9HVigiT1BFTl9PVVRQVVQgb3V0cHV0LCAlZCIsIG91dHB1dCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KW91dHB1dCk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRldmljZXMpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGxhdGVuY3lNcyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgT1BFTl9EVVBMSUNBVEVfT1VUUFVUOiB7CkBAIC05NzUsMjEgKzExMzYsMjQgQEAKICAgICAgICAgY2FzZSBPUEVOX0lOUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSA9IChhdWRpb19tb2R1bGVfaGFuZGxlX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IChhdWRpb19pb19oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0ge307CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjM5MDU5NTEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IChhdWRpb19zb3VyY2VfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IG9wZW5JbnB1dChtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KSBpbnB1dCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkZXZpY2VzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmb3JtYXQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY2hhbm5lbE1hc2spOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3BlbklucHV0KG1vZHVsZSwgJmlucHV0LCAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIGlucHV0KTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGV2aWNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDTE9TRV9JTlBVVDogewpAQCAtOTk3LDExICsxMTYxLDEwIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjbG9zZUlucHV0KChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9TVFJFQU1fT1VUUFVUOiB7CisgICAgICAgIGNhc2UgSU5WQUxJREFURV9TVFJFQU06IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0U3RyZWFtT3V0cHV0KChhdWRpb19zdHJlYW1fdHlwZV90KSBzdHJlYW0sIG91dHB1dCkpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGludmFsaWRhdGVTdHJlYW0oc3RyZWFtKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRTogewpAQCAtMTAxMyw4ICsxMTc2LDggQEAKICAgICAgICAgY2FzZSBHRVRfUkVOREVSX1BPU0lUSU9OOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc2l6ZV90IGhhbEZyYW1lcyA9IDA7Ci0gICAgICAgICAgICBzaXplX3QgZHNwRnJhbWVzID0gMDsKKyAgICAgICAgICAgIHVpbnQzMl90IGhhbEZyYW1lcyA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCBkc3BGcmFtZXMgPSAwOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UmVuZGVyUG9zaXRpb24oJmhhbEZyYW1lcywgJmRzcEZyYW1lcywgb3V0cHV0KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CkBAIC0xMDI2LDI0ICsxMTg5LDI2IEBACiAgICAgICAgIGNhc2UgR0VUX0lOUFVUX0ZSQU1FU19MT1NUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRJbnB1dEZyYW1lc0xvc3QoaW9IYW5kbGUpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KSBnZXRJbnB1dEZyYW1lc0xvc3QoaW9IYW5kbGUpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBORVdfQVVESU9fU0VTU0lPTl9JRDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG5ld0F1ZGlvU2Vzc2lvbklkKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobmV3QXVkaW9VbmlxdWVJZCgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBQ1FVSVJFX0FVRElPX1NFU1NJT05fSUQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24pOworICAgICAgICAgICAgaW50IHBpZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uLCBwaWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fU0VTU0lPTl9JRDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgICAgICBpbnQgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24sIHBpZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgUVVFUllfTlVNX0VGRkVDVFM6IHsKQEAgLTExMjEsNyArMTI4Niw3IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgR0VUX1BSSU1BUllfT1VUUFVUX0ZSQU1FX0NPVU5UOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0UHJpbWFyeU91dHB1dEZyYW1lQ291bnQoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudCgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfTE9XX1JBTV9ERVZJQ0U6IHsKQEAgLTExMzAsNiArMTI5NSwxMDkgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldExvd1JhbURldmljZShpc0xvd1JhbURldmljZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIExJU1RfQVVESU9fUE9SVFM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHNSZXEgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHMgPSBudW1Qb3J0c1JlcTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyA9CisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgYXVkaW9fcG9ydCAqKWNhbGxvYyhudW1Qb3J0c1JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgICAgICBpZiAocG9ydHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdEF1ZGlvUG9ydHMoJm51bVBvcnRzLCBwb3J0cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtUG9ydHMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChudW1Qb3J0c1JlcSA+IG51bVBvcnRzKSB7CisgICAgICAgICAgICAgICAgICAgIG51bVBvcnRzUmVxID0gbnVtUG9ydHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwb3J0cywgbnVtUG9ydHNSZXEgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUocG9ydHMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEdFVF9BVURJT19QT1JUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgcG9ydCA9IHt9OworICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmcG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkwNTk1MSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb3J0KCZwb3J0KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDUkVBVEVfQVVESU9fUEFUQ0g6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7CisgICAgICAgICAgICBkYXRhLnJlYWQoJnBhdGNoLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSB7fTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkwNTk1MSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIExJU1RfQVVESU9fUEFUQ0hFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXRjaGVzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChudW1QYXRjaGVzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgICAgICAgICAgbnVtUGF0Y2hlc1JlcSA9IE1BWF9JVEVNU19QRVJfTElTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXRjaGVzID0gbnVtUGF0Y2hlc1JlcTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyA9CisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgYXVkaW9fcGF0Y2ggKiljYWxsb2MobnVtUGF0Y2hlc1JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgICAgICBpZiAocGF0Y2hlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fTUVNT1JZKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9QYXRjaGVzKCZudW1QYXRjaGVzLCBwYXRjaGVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihudW1QYXRjaGVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+IG51bVBhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtUGF0Y2hlc1JlcSA9IG51bVBhdGNoZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwYXRjaGVzLCBudW1QYXRjaGVzUmVxICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShwYXRjaGVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfQVVESU9fUE9SVF9DT05GSUc6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgY29uZmlnOworICAgICAgICAgICAgZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldEF1ZGlvUG9ydENvbmZpZygmY29uZmlnKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0FVRElPX0hXX1NZTkM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5jcHAKaW5kZXggM2MwZDRjZi4uMWMyOTlmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5jcHAKQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZXNjLT5zYW1wbGluZ1JhdGUpOwogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRlc2MtPmZvcm1hdCk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVzYy0+Y2hhbm5lbE1hc2spOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRlc2MtPmZyYW1lQ291bnQpOworICAgICAgICAgICAgZGF0YS53cml0ZUludDY0KGRlc2MtPmZyYW1lQ291bnQpOwogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRlc2MtPmxhdGVuY3kpOwogICAgICAgICB9CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChJT19DT05GSUdfQ0hBTkdFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CkBAIC04NSw3ICs4NSw3IEBACiAgICAgICAgICAgICAgICAgZGVzYy5zYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgICAgIGRlc2MuZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgICAgIGRlc2MuY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAgICAgZGVzYy5mcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgICAgIGRlc2MubGF0ZW5jeSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICAgICAgcGFyYW0yID0gJmRlc2M7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IDBkYWI3ZTMuLmU4NDA5NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC01OCw5ICs1OCwyMiBAQAogICAgIFFVRVJZX0RFRkFVTFRfUFJFX1BST0NFU1NJTkcsCiAgICAgU0VUX0VGRkVDVF9FTkFCTEVELAogICAgIElTX1NUUkVBTV9BQ1RJVkVfUkVNT1RFTFksCi0gICAgSVNfT0ZGTE9BRF9TVVBQT1JURUQKKyAgICBJU19PRkZMT0FEX1NVUFBPUlRFRCwKKyAgICBMSVNUX0FVRElPX1BPUlRTLAorICAgIEdFVF9BVURJT19QT1JULAorICAgIENSRUFURV9BVURJT19QQVRDSCwKKyAgICBSRUxFQVNFX0FVRElPX1BBVENILAorICAgIExJU1RfQVVESU9fUEFUQ0hFUywKKyAgICBTRVRfQVVESU9fUE9SVF9DT05GSUcsCisgICAgUkVHSVNURVJfQ0xJRU5ULAorICAgIEdFVF9PVVRQVVRfRk9SX0FUVFIsCisgICAgQUNRVUlSRV9TT1VORFRSSUdHRVJfU0VTU0lPTiwKKyAgICBSRUxFQVNFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLAorICAgIEdFVF9QSE9ORV9TVEFURQogfTsKIAorI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNAorCiBjbGFzcyBCcEF1ZGlvUG9saWN5U2VydmljZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlPgogewogcHVibGljOgpAQCAtMTM4LDYgKzE1MSw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZvcm1hdCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihmbGFncykpOworICAgICAgICAvLyBoYXNPZmZsb2FkSW5mbwogICAgICAgICBpZiAob2ZmbG9hZEluZm8gPT0gTlVMTCkgewogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwogICAgICAgICB9IGVsc2UgewpAQCAtMTQ4LDYgKzE2MiwzNiBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAorICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgaWYgKGF0dHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJXcml0aW5nIE5VTEwgYXVkaW8gYXR0cmlidXRlcyAtIHNob3VsZG4ndCBoYXBwZW4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGF1ZGlvX2lvX2hhbmRsZV90KSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YS53cml0ZShhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZvcm1hdCkpOworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZsYWdzKSk7CisgICAgICAgICAgICAvLyBoYXNPZmZsb2FkSW5mbworICAgICAgICAgICAgaWYgKG9mZmxvYWRJbmZvID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlKG9mZmxvYWRJbmZvLCBzaXplb2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT1VUUFVUX0ZPUl9BVFRSLCBkYXRhLCAmcmVwbHkpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQpAQCAtMTg3LDcgKzIzMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0xOTYsMzMgKzI0MSw0MCBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90Pihmb3JtYXQpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5wdXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5wdXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX0lOUFVULCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIApAQCAtMzkwLDcgKzQ0MiwxODYgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUoJmluZm8sIHNpemVvZihhdWRpb19vZmZsb2FkX2luZm9fdCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSVNfT0ZGTE9BRF9TVVBQT1JURUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQorICAgIHsKKyAgICAgICAgaWYgKG51bV9wb3J0cyA9PSBOVUxMIHx8ICgqbnVtX3BvcnRzICE9IDAgJiYgcG9ydHMgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgdW5zaWduZWQgaW50IG51bVBvcnRzUmVxID0gKHBvcnRzID09IE5VTEwpID8gMCA6ICpudW1fcG9ydHM7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihyb2xlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHR5cGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtUG9ydHNSZXEpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19QT1JUUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKm51bV9wb3J0cyA9ICh1bnNpZ25lZCBpbnQpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gKm51bV9wb3J0cykgeworICAgICAgICAgICAgICAgIG51bVBvcnRzUmVxID0gKm51bV9wb3J0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1Qb3J0c1JlcSA+IDApIHsKKyAgICAgICAgICAgICAgICByZXBseS5yZWFkKHBvcnRzLCBudW1Qb3J0c1JlcSAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmdlbmVyYXRpb24gPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KQorICAgIHsKKyAgICAgICAgaWYgKHBvcnQgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0FVRElPX1BPUlQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXBseS5yZWFkKHBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICB7CisgICAgICAgIGlmIChwYXRjaCA9PSBOVUxMIHx8IGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUocGF0Y2gsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgZGF0YS53cml0ZShoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX0FVRElPX1BBVENILCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmVwbHkucmVhZChoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfQVVESU9fUEFUQ0gsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKKyAgICB7CisgICAgICAgIGlmIChudW1fcGF0Y2hlcyA9PSBOVUxMIHx8ICgqbnVtX3BhdGNoZXMgIT0gMCAmJiBwYXRjaGVzID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXRjaGVzUmVxID0gKHBhdGNoZXMgPT0gTlVMTCkgPyAwIDogKm51bV9wYXRjaGVzOworICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtUGF0Y2hlc1JlcSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1BBVENIRVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICpudW1fcGF0Y2hlcyA9ICh1bnNpZ25lZCBpbnQpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG51bVBhdGNoZXNSZXEgPiAqbnVtX3BhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICBudW1QYXRjaGVzUmVxID0gKm51bV9wYXRjaGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bVBhdGNoZXNSZXEgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChwYXRjaGVzLCBudW1QYXRjaGVzUmVxICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmdlbmVyYXRpb24gPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQorICAgIHsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVESU9fUE9SVF9DT05GSUcsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfQ0xJRU5ULCBkYXRhLCAmcmVwbHkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQorICAgIHsKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gTlVMTCB8fCBpb0hhbmRsZSA9PSBOVUxMIHx8IGRldmljZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgKnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKmlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKmRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9TT1VORFRSSUdHRVJfU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QSE9ORV9TVEFURSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfSU5WQUxJRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGF1ZGlvX21vZGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlIik7CkBAIC00NzQsMTMgKzcwNSwzOCBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCisgICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfQVRUUjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGRhdGEucmVhZChhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYm9vbCBoYXNPZmZsb2FkSW5mbyA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKKyAgICAgICAgICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG9mZmxvYWRJbmZvOworICAgICAgICAgICAgaWYgKGhhc09mZmxvYWRJbmZvKSB7CisgICAgICAgICAgICAgICAgZGF0YS5yZWFkKCZvZmZsb2FkSW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXRGb3JBdHRyKGF0dHIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGhhc09mZmxvYWRJbmZvID8gJm9mZmxvYWRJbmZvIDogTlVMTCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50PihvdXRwdXQpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBjYXNlIFNUQVJUX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0T3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC00ODgsMTAgKzc0NCwxMSBAQAogICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGludCBzZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtNTEwLDExICs3NjcsMTMgQEAKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBnZXRJbnB1dChpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQ+KGlucHV0KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC01MjIsMjEgKzc4MSwyNCBAQAogICAgICAgICBjYXNlIFNUQVJUX0lOUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGFydElucHV0KGlucHV0KSkpOworICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBzdGF0aWNfY2FzdCA8YXVkaW9fc2Vzc2lvbl90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRJbnB1dChpbnB1dCwgc2Vzc2lvbikpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFNUT1BfSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BJbnB1dChpbnB1dCkpKTsKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3Nlc3Npb25fdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BJbnB1dChpbnB1dCwgc2Vzc2lvbikpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFJFTEVBU0VfSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZWxlYXNlSW5wdXQoaW5wdXQpOworICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBzdGF0aWNfY2FzdCA8YXVkaW9fc2Vzc2lvbl90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dChpbnB1dCwgc2Vzc2lvbik7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTYzNCw3ICs4OTYsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9ICh1aW50MzJfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KSBzdHJlYW0sIGluUGFzdE1zKSApOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMpICk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTY0Miw3ICs5MDQsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9ICh1aW50MzJfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoKGF1ZGlvX3N0cmVhbV90eXBlX3QpIHN0cmVhbSwgaW5QYXN0TXMpICk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggaXNTdHJlYW1BY3RpdmVSZW1vdGVseShzdHJlYW0sIGluUGFzdE1zKSApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC02ODcsNiArOTQ5LDE1NyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BPUlRTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSA9IChhdWRpb19wb3J0X3JvbGVfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSA9IChhdWRpb19wb3J0X3R5cGVfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBvcnRzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChudW1Qb3J0c1JlcSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICAgICAgICAgIG51bVBvcnRzUmVxID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBvcnRzID0gbnVtUG9ydHNSZXE7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMgPQorICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGF1ZGlvX3BvcnQgKiljYWxsb2MobnVtUG9ydHNSZXEsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgaWYgKHBvcnRzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19NRU1PUlkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdEF1ZGlvUG9ydHMocm9sZSwgdHlwZSwgJm51bVBvcnRzLCBwb3J0cywgJmdlbmVyYXRpb24pOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bVBvcnRzKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChudW1Qb3J0c1JlcSA+IG51bVBvcnRzKSB7CisgICAgICAgICAgICAgICAgICAgIG51bVBvcnRzUmVxID0gbnVtUG9ydHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwb3J0cywgbnVtUG9ydHNSZXEgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUocG9ydHMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfQVVESU9fUE9SVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0IHBvcnQgPSB7fTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJnBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjM5MTIyMDIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9ydCgmcG9ydCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmcG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmcGF0Y2gsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IHt9OworICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIzOTEyMjAyIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BBVENIRVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUGF0Y2hlc1JlcSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICAgICAgICAgIG51bVBhdGNoZXNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUGF0Y2hlcyA9IG51bVBhdGNoZXNSZXE7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMgPQorICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGF1ZGlvX3BhdGNoICopY2FsbG9jKG51bVBhdGNoZXNSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgaWYgKHBhdGNoZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5zaWduZWQgaW50IGdlbmVyYXRpb247CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9QYXRjaGVzKCZudW1QYXRjaGVzLCBwYXRjaGVzLCAmZ2VuZXJhdGlvbik7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtUGF0Y2hlcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKG51bVBhdGNoZXNSZXEgPiBudW1QYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgICAgIG51bVBhdGNoZXNSZXEgPSBudW1QYXRjaGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUocGF0Y2hlcywgbnVtUGF0Y2hlc1JlcSAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUocGF0Y2hlcyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BVURJT19QT1JUX0NPTkZJRzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBjb25maWc7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZykpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0QXVkaW9Qb3J0Q29uZmlnKCZjb25maWcpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVHSVNURVJfQ0xJRU5UOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4oCisgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyQ2xpZW50KGNsaWVudCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4oCisgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0ge307CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSA9IHt9OworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oJnNlc3Npb24sICZpb0hhbmRsZSwgJmRldmljZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlc3Npb24pOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgUkVMRUFTRV9TT1VORFRSSUdHRVJfU0VTU0lPTjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IGNsaWVudCA9IGludGVyZmFjZV9jYXN0PElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+KAorICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24pOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9QSE9ORV9TVEFURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KWdldFBob25lU3RhdGUoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODAyMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCisjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgUE9SVF9MSVNUX1VQREFURSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgUEFUQ0hfTElTVF9VUERBVEUKK307CisKK2NsYXNzIEJwQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50IDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+Cit7CitwdWJsaWM6CisgICAgQnBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFBPUlRfTElTVF9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgIH0KKworICAgIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUEFUQ0hfTElTVF9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgIH0KK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsICJhbmRyb2lkLm1lZGlhLklBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCbkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN3aXRjaCAoY29kZSkgeworICAgIGNhc2UgUE9SVF9MSVNUX1VQREFURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgIGNhc2UgUEFUQ0hfTElTVF9VUERBVEU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9SZWNvcmQuY3BwCmluZGV4IDRhN2RlNjUuLjhhNGEzODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUmVjb3JkLmNwcApAQCAtMjksNyArMjksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIHsKLSAgICBHRVRfQ0JMSyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgVU5VU0VEX1dBU19HRVRfQ0JMSyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgU1RBUlQsCiAgICAgU1RPUAogfTsKQEAgLTQyLDE4ICs0Miw2IEBACiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0Q2JsaygpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIHNwPElNZW1vcnk+IGNibGs7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9SZWNvcmQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ0JMSywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNibGs7Ci0gICAgfQotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQsIGludCB0cmlnZ2VyU2Vzc2lvbikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTg2LDExICs3NCw2IEBACiAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKIHsKICAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBHRVRfQ0JMSzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1JlY29yZCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGdldENibGsoKS0+YXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU1RBUlQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9SZWNvcmQsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCA9IGRhdGEucmVhZEludDMyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKaW5kZXggM2NkOWNmZC4uMjY1YmIxYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcApAQCAtNjAsNiArNjAsOSBAQAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NCTEssIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGNibGsgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgaWYgKGNibGsgIT0gMCAmJiBjYmxrLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNibGsuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2JsazsKICAgICB9CkBAIC0xMTUsMTMgKzExOCwxNiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVUaW1lZEJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8SU1lbW9yeT4qIGJ1ZmZlcikgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc2l6ZSk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBTExPQ0FURV9USU1FRF9CVUZGRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAqYnVmZmVyID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlciAhPSAwICYmICgqYnVmZmVyKS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgKCpidWZmZXIpLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC0yMzIsNyArMjM4LDcgQEAKICAgICAgICAgY2FzZSBBTExPQ0FURV9USU1FRF9CVUZGRVI6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWxsb2NhdGVUaW1lZEJ1ZmZlcihkYXRhLnJlYWRJbnQzMigpLCAmYnVmZmVyKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFsbG9jYXRlVGltZWRCdWZmZXIoZGF0YS5yZWFkSW50NjQoKSwgJmJ1ZmZlcik7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihidWZmZXItPmFzQmluZGVyKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUNyeXB0by5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQ3J5cHRvLmNwcAppbmRleCA5MThkNzI1Li4xODMyNWM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQ3J5cHRvLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQ3J5cHRvLmNwcApAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgICAgIGRhdGEud3JpdGUoc3ViU2FtcGxlcywgc2l6ZW9mKENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKSAqIG51bVN1YlNhbXBsZXMpOwogCiAgICAgICAgIGlmIChzZWN1cmUpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KWRzdFB0cik7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50NjQoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihkc3RQdHIpKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoREVDUllQVCwgZGF0YSwgJnJlcGx5KTsKQEAgLTI1MCw3ICsyNTAsNyBAQAogCiAgICAgICAgICAgICB2b2lkICpzZWN1cmVCdWZmZXJJZCwgKmRzdFB0cjsKICAgICAgICAgICAgIGlmIChzZWN1cmUpIHsKLSAgICAgICAgICAgICAgICBzZWN1cmVCdWZmZXJJZCA9ICh2b2lkICopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICAgICAgc2VjdXJlQnVmZmVySWQgPSByZWludGVycHJldF9jYXN0PHZvaWQgKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihkYXRhLnJlYWRJbnQ2NCgpKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGRzdFB0ciA9IG1hbGxvYyh0b3RhbFNpemUpOwogICAgICAgICAgICAgICAgIG1lbXNldChkc3RQdHIsIDAsIHRvdGFsU2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwCmluZGV4IGYxYTZhOWYuLjE5MDQ4MzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwCkBAIC01Myw3ICs1Myw4IEBACiAgICAgU0lHTiwKICAgICBTSUdOX1JTQSwKICAgICBWRVJJRlksCi0gICAgU0VUX0xJU1RFTkVSCisgICAgU0VUX0xJU1RFTkVSLAorICAgIFVOUFJPVklTSU9OX0RFVklDRQogfTsKIAogc3RydWN0IEJwRHJtIDogcHVibGljIEJwSW50ZXJmYWNlPElEcm0+IHsKQEAgLTIyOSw2ICsyMzAsMTUgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5wcm92aXNpb25EZXZpY2UoKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVOUFJPVklTSU9OX0RFVklDRSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wcykgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtNjE5LDYgKzYyOSwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBVTlBST1ZJU0lPTl9ERVZJQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSB1bnByb3Zpc2lvbkRldmljZSgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgR0VUX1NFQ1VSRV9TVE9QUzoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAKaW5kZXggMWU1NGNhOC4uOGNkMTU4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAKQEAgLTExOSw2ICsxMTksOSBAQAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NCTEssIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGNibGsgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgaWYgKGNibGsgIT0gMCAmJiBjYmxrLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNibGsuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2JsazsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY0xpc3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhQ29kZWNMaXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjdjNWNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhQ29kZWNMaXN0LmNwcApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+ICAvLyBmb3Igc3RhdHVzX3QKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBDUkVBVEUgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIENPVU5UX0NPREVDUywKKyAgICBHRVRfQ09ERUNfSU5GTywKKyAgICBGSU5EX0NPREVDX0JZX1RZUEUsCisgICAgRklORF9DT0RFQ19CWV9OQU1FLAorfTsKKworY2xhc3MgQnBNZWRpYUNvZGVjTGlzdDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYUNvZGVjTGlzdD4KK3sKK3B1YmxpYzoKKyAgICBCcE1lZGlhQ29kZWNMaXN0KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYUNvZGVjTGlzdD4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCBzaXplX3QgY291bnRDb2RlY3MoKSBjb25zdAorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQ29kZWNMaXN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09VTlRfQ09ERUNTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxNZWRpYUNvZGVjSW5mbz4gZ2V0Q29kZWNJbmZvKHNpemVfdCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUNvZGVjTGlzdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGluZGV4KTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DT0RFQ19JTkZPLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgcmV0dXJuIE1lZGlhQ29kZWNJbmZvOjpGcm9tUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCBzc2l6ZV90IGZpbmRDb2RlY0J5VHlwZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgZW5jb2Rlciwgc2l6ZV90IHN0YXJ0SW5kZXggPSAwKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgfQorCisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUNvZGVjTGlzdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcodHlwZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihlbmNvZGVyKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXJ0SW5kZXgpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRklORF9DT0RFQ19CWV9UWVBFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCBmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUNvZGVjTGlzdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcobmFtZSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGSU5EX0NPREVDX0JZX05BTUUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhQ29kZWNMaXN0LCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFDb2RlY0xpc3QiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCbk1lZGlhQ29kZWNMaXN0OjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgQ09VTlRfQ09ERUNTOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNMaXN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSBjb3VudENvZGVjcygpOworICAgICAgICAgICAgaWYgKGNvdW50ID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgY291bnQgPSBJTlQzMl9NQVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjb3VudCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfQ09ERUNfSU5GTzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUNvZGVjTGlzdCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gZ2V0Q29kZWNJbmZvKGluZGV4KTsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihPSyk7CisgICAgICAgICAgICAgICAgaW5mby0+d3JpdGVUb1BhcmNlbChyZXBseSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKC1FUkFOR0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRklORF9DT0RFQ19CWV9UWVBFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNMaXN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgYm9vbCBpc0VuY29kZXIgPSBzdGF0aWNfY2FzdDxib29sPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHNpemVfdCBzdGFydEluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBmaW5kQ29kZWNCeVR5cGUodHlwZSwgaXNFbmNvZGVyLCBzdGFydEluZGV4KTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IElOVDMyX01BWCB8fCBpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IE5BTUVfTk9UX0ZPVU5EOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRklORF9DT0RFQ19CWV9OQU1FOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNMaXN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGZpbmRDb2RlY0J5TmFtZShuYW1lKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IElOVDMyX01BWCB8fCBpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IE5BTUVfTk9UX0ZPVU5EOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcAppbmRleCA5ZGI1YjFiLi4xMGI0OTM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcApAQCAtNzUsNyArNzUsNyBAQAogfQogCiB2b2lkCi1JTWVkaWFEZWF0aE5vdGlmaWVyOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKK0lNZWRpYURlYXRoTm90aWZpZXI6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewogICAgIEFMT0dXKCJtZWRpYSBzZXJ2ZXIgZGllZCIpOwogCiAgICAgLy8gTmVlZCB0byBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaGVsZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YTM3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIklNZWRpYUhUVFBDb25uZWN0aW9uIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgRElTQ09OTkVDVCwKKyAgICBSRUFEX0FULAorICAgIEdFVF9TSVpFLAorICAgIEdFVF9NSU1FX1RZUEUsCisgICAgR0VUX1VSSQorfTsKKworc3RydWN0IEJwTWVkaWFIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFIVFRQQ29ubmVjdGlvbj4geworICAgIEJwTWVkaWFIVFRQQ29ubmVjdGlvbihjb25zdCBzcDxJQmluZGVyPiAmaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJTWVkaWFIVFRQQ29ubmVjdGlvbj4oaW1wbCkgeworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKKyAgICAgICAgICAgICAgICBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBTdHJpbmcxNiB0bXAodXJpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KHRtcCk7CisKKyAgICAgICAgdG1wID0gU3RyaW5nMTYoIiIpOworICAgICAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlYWRlcnMtPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nMTYga2V5KGhlYWRlcnMtPmtleUF0KGkpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcxNiB2YWwoaGVhZGVycy0+dmFsdWVBdChpKS5zdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKGtleSk7CisgICAgICAgICAgICAgICAgdG1wLmFwcGVuZChTdHJpbmcxNigiOiAiKSk7CisgICAgICAgICAgICAgICAgdG1wLmFwcGVuZCh2YWwpOworICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoU3RyaW5nMTYoIlxyXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KHRtcCk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENPTk5FQ1QsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgaW50MzJfdCBleGNlcHRpb25Db2RlID0gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uQ29kZSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSByZXBseS5yZWFkU3Ryb25nQmluZGVyKCk7CisgICAgICAgIG1NZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihiaW5kZXIpOworCisgICAgICAgIHJldHVybiBtTWVtb3J5ICE9IE5VTEw7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChESVNDT05ORUNULCBkYXRhLCAmcmVwbHkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDY0KG9mZnNldCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVBRF9BVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoInJlbW90ZSByZWFkQXQgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgZXhjZXB0aW9uQ29kZSA9IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbkNvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGxlbiA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIGlmIChsZW4gPiBzaXplKSB7CisgICAgICAgICAgICBBTE9HRSgicmVxdWVzdGVkICV6dSwgZ290ICV6dSIsIHNpemUsIGxlbik7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPiBtTWVtb3J5LT5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJnb3QgJXp1LCBidXQgbWVtb3J5IGhhcyAlenUiLCBsZW4sIG1NZW1vcnktPnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KGJ1ZmZlciwgbU1lbW9yeS0+cG9pbnRlcigpLCBsZW4pOworCisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorCisgICAgdmlydHVhbCBvZmY2NF90IGdldFNpemUoKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU0laRSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpbnQzMl90IGV4Y2VwdGlvbkNvZGUgPSByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworCisgICAgICAgIGlmIChleGNlcHRpb25Db2RlKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSB7CisgICAgICAgICptaW1lVHlwZSA9IFN0cmluZzgoIiIpOworCisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUlNRV9UWVBFLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIGludDMyX3QgZXhjZXB0aW9uQ29kZSA9IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbkNvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgKm1pbWVUeXBlID0gU3RyaW5nOChyZXBseS5yZWFkU3RyaW5nMTYoKSk7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VXJpKFN0cmluZzggKnVyaSkgeworICAgICAgICAqdXJpID0gU3RyaW5nOCgiIik7CisKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9VUkksIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgaW50MzJfdCBleGNlcHRpb25Db2RlID0gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uQ29kZSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAqdXJpID0gU3RyaW5nOChyZXBseS5yZWFkU3RyaW5nMTYoKSk7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKAorICAgICAgICBNZWRpYUhUVFBDb25uZWN0aW9uLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFIVFRQQ29ubmVjdGlvbiIpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2MDU4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJJTWVkaWFIVFRQU2VydmljZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBNQUtFX0hUVFAgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorfTsKKworc3RydWN0IEJwTWVkaWFIVFRQU2VydmljZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFIVFRQU2VydmljZT4geworICAgIEJwTWVkaWFIVFRQU2VydmljZShjb25zdCBzcDxJQmluZGVyPiAmaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJTWVkaWFIVFRQU2VydmljZT4oaW1wbCkgeworICAgIH0KKworICAgIHZpcnR1YWwgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUFNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE1BS0VfSFRUUCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoCisgICAgICAgIE1lZGlhSFRUUFNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklNZWRpYUhUVFBTZXJ2aWNlIik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUxvZ1NlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTG9nU2VydmljZS5jcHAKaW5kZXggMzMyMzlhNy4uOGE2NmM3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTG9nU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTG9nU2VydmljZS5jcHAKQEAgLTQzLDcgKzQzLDcgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTG9nU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzaGFyZWQtPmFzQmluZGVyKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNpemUpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoKGludDY0X3QpIHNpemUpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhuYW1lKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFR0lTVEVSX1dSSVRFUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgLy8gRklYTUUgaWdub3JlcyBzdGF0dXMKQEAgLTcxLDcgKzcxLDcgQEAKICAgICAgICAgY2FzZSBSRUdJU1RFUl9XUklURVI6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFMb2dTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBzaGFyZWQgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpIGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOwogICAgICAgICAgICAgcmVnaXN0ZXJXcml0ZXIoc2hhcmVkLCBzaXplLCBuYW1lKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCBiYjA2NmEwLi4zOGY3MTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0xNSw5ICsxNSwxMiBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CkBAIC04NCwxNyArODcsMjMgQEAKICAgICB9CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqc3JjVXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaHR0cFNlcnZpY2UgIT0gTlVMTCk7CisgICAgICAgIGlmIChodHRwU2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGh0dHBTZXJ2aWNlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhzcmNVcmwpOwogCiAgICAgICAgIGlmIChoZWFkZXJzID09IE5VTEwpIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSB0aGUgaGVhZGVycwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGhlYWRlcnMtPnNpemUoKSk7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50NjQoaGVhZGVycy0+c2l6ZSgpKTsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVhZGVycy0+c2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChoZWFkZXJzLT5rZXlBdChpKSk7CiAgICAgICAgICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoaGVhZGVycy0+dmFsdWVBdChpKSk7CkBAIC0xMTgsNyArMTI3LDcgQEAKIAogICAgIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKQogICAgIHsKLSAgICAgICAgQUxPR1YoImdldFRpbWVBdFRpbWU6IHRpbWUoJWxsZCB1cykgYW5kIG9wdGlvbiglZCkiLCB0aW1lVXMsIG9wdGlvbik7CisgICAgICAgIEFMT0dWKCJnZXRUaW1lQXRUaW1lOiB0aW1lKCUiIFBSSWQ2NCAiIHVzKSBhbmQgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQ2NCh0aW1lVXMpOwpAQCAtMTk1LDE4ICsyMDQsMjYgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfREFUQV9TT1VSQ0VfVVJMOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkpIHsKKyAgICAgICAgICAgICAgICBodHRwU2VydmljZSA9CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNyY1VybCA9IGRhdGEucmVhZENTdHJpbmcoKTsKIAogICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKLSAgICAgICAgICAgIGludDMyX3QgbnVtSGVhZGVycyA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUhlYWRlcnM7ICsraSkgeworICAgICAgICAgICAgc2l6ZV90IG51bUhlYWRlcnMgPSAoc2l6ZV90KSBkYXRhLnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1IZWFkZXJzOyArK2kpIHsKICAgICAgICAgICAgICAgICBTdHJpbmc4IGtleSA9IGRhdGEucmVhZFN0cmluZzgoKTsKICAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlID0gZGF0YS5yZWFkU3RyaW5nOCgpOwogICAgICAgICAgICAgICAgIGhlYWRlcnMuYWRkKGtleSwgdmFsdWUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShzcmNVcmwsIG51bUhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKSk7CisgICAgICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBodHRwU2VydmljZSwgc3JjVXJsLCBudW1IZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCkpOwogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0yMjIsNyArMjM5LDcgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRhZGF0YVJldHJpZXZlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgaW50IG9wdGlvbiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0VGltZUF0VGltZTogdGltZSglbGxkIHVzKSBhbmQgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXRUaW1lQXRUaW1lOiB0aW1lKCUiIFBSSWQ2NCAiIHVzKSBhbmQgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKICNpZm5kZWYgRElTQUJMRV9HUk9VUF9TQ0hFRFVMRV9IQUNLCiAgICAgICAgICAgICBzZXRTY2hlZFBvbGljeShkYXRhKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggMmE1YzdhNy4uYTI5YTdkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KIApAQCAtNzUsMTEgKzc2LDE3IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChESVNDT05ORUNULCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIAotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3QgY2hhciogdXJsLAorICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4qIGhlYWRlcnMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihodHRwU2VydmljZSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKGh0dHBTZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoaHR0cFNlcnZpY2UtPmFzQmluZGVyKCkpOworICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKHVybCk7CiAgICAgICAgIGlmIChoZWFkZXJzID09IE5VTEwpIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKQEAgLTM1NSw2ICszNjIsMTMgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfREFUQV9TT1VSQ0VfVVJMOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpKSB7CisgICAgICAgICAgICAgICAgaHR0cFNlcnZpY2UgPQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQU2VydmljZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzOwogICAgICAgICAgICAgaW50MzJfdCBudW1IZWFkZXJzID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTM2Myw3ICszNzcsOCBAQAogICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAgICAgICAgICAgICAgICAgaGVhZGVycy5hZGQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXREYXRhU291cmNlKHVybCwgbnVtSGVhZGVycyA+IDAgPyAmaGVhZGVycyA6IE5VTEwpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBodHRwU2VydmljZSwgdXJsLCBudW1IZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9EQVRBX1NPVVJDRV9GRDogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCAzYzIyYjRjLi4yZTAyZDE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9JRHJtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUhEQ1AuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KQEAgLTQ4LDcgKzUwLDcgQEAKICAgICBBRERfQkFUVEVSWV9EQVRBLAogICAgIFBVTExfQkFUVEVSWV9EQVRBLAogICAgIExJU1RFTl9GT1JfUkVNT1RFX0RJU1BMQVksCi0gICAgVVBEQVRFX1BST1hZX0NPTkZJRywKKyAgICBHRVRfQ09ERUNfTElTVCwKIH07CiAKIGNsYXNzIEJwTWVkaWFQbGF5ZXJTZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhUGxheWVyU2VydmljZT4KQEAgLTg2LDEyICs4OCwyMSBAQAogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUmVjb3JkZXI+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNvZGUoY29uc3QgY2hhciogdXJsLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY29kZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCisgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsZVJhdGUsCisgICAgICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLAorICAgICAgICAgICAgc2l6ZV90ICpwU2l6ZSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihodHRwU2VydmljZSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKGh0dHBTZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoaHR0cFNlcnZpY2UtPmFzQmluZGVyKCkpOworICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKHVybCk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoaGVhcC0+YXNCaW5kZXIoKSk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChERUNPREVfVVJMLCBkYXRhLCAmcmVwbHkpOwpAQCAtMTgzLDIzICsxOTQsMTEgQEAKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElSZW1vdGVEaXNwbGF5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKKyAgICB2aXJ0dWFsIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0Q29kZWNMaXN0KCkgY29uc3QgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0KICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChob3N0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGhvc3QpOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnQpOwotICAgICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZXhjbHVzaW9uTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVVBEQVRFX1BST1hZX0NPTkZJRywgZGF0YSwgJnJlcGx5KTsKLQotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ09ERUNfTElTVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYUNvZGVjTGlzdD4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiB9OwogCkBAIC0yMjIsMTMgKzIyMSwyNSBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIERFQ09ERV9VUkw6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSkgeworICAgICAgICAgICAgICAgIGh0dHBTZXJ2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCA9IGRhdGEucmVhZENTdHJpbmcoKTsKICAgICAgICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeUhlYXA+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgICAgICAgICBpbnQgbnVtQ2hhbm5lbHM7CiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlY29kZSh1cmwsICZzYW1wbGVSYXRlLCAmbnVtQ2hhbm5lbHMsICZmb3JtYXQsIGhlYXAsICZzaXplKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgZGVjb2RlKGh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICB1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlYXAsCisgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2FtcGxlUmF0ZSk7CkBAIC0zMTYsMjQgKzMyNywxMiBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGRpc3BsYXktPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFVQREFURV9QUk9YWV9DT05GSUc6Ci0gICAgICAgIHsKKyAgICAgICAgY2FzZSBHRVRfQ09ERUNfTElTVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCA9IE5VTEw7Ci0gICAgICAgICAgICBpbnQzMl90IHBvcnQgPSAwOwotICAgICAgICAgICAgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpKSB7Ci0gICAgICAgICAgICAgICAgaG9zdCA9IGRhdGEucmVhZENTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBwb3J0ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBleGNsdXNpb25MaXN0ID0gZGF0YS5yZWFkQ1N0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih1cGRhdGVQcm94eUNvbmZpZyhob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQorICAgICAgICAgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBtY2wgPSBnZXRDb2RlY0xpc3QoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihtY2wtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKaW5kZXggOGU1ODE2Mi4uOTVhZjAwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcApAQCAtMTcsNiArMTcsMTAgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJJTWVkaWFSZWNvcmRlciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmEuaD4KQEAgLTI0LDggKzI4LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTE2Nyw3ICsxNjksNyBAQAogICAgIH0KIAogICAgIHN0YXR1c190IHNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKLSAgICAgICAgQUxPR1YoInNldE91dHB1dEZpbGUoJWQsICVsbGQsICVsbGQpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgQUxPR1YoInNldE91dHB1dEZpbGUoJWQsICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIikiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUZpbGVEZXNjcmlwdG9yKGZkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKaW5kZXggMTA3NDdmMy4uMGZmNDdkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKQEAgLTU0LDYgKzU0LDcgQEAKICAgICBHRVRfR1JBUEhJQ19CVUZGRVJfVVNBR0UsCiAgICAgU0VUX0lOVEVSTkFMX09QVElPTiwKICAgICBVUERBVEVfR1JBUEhJQ19CVUZGRVJfSU5fTUVUQSwKKyAgICBDT05GSUdVUkVfVklERU9fVFVOTkVMX01PREUsCiB9OwogCiBjbGFzcyBCcE9NWCA6IHB1YmxpYyBCcEludGVyZmFjZTxJT01YPiB7CkBAIC02NSw3ICs2Niw3IEBACiAgICAgdmlydHVhbCBib29sIGxpdmVzTG9jYWxseShub2RlX2lkIG5vZGUsIHBpZF90IHBpZCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KExJVkVTX0xPQ0FMTFksIGRhdGEsICZyZXBseSk7CiAKQEAgLTEwNCw3ICsxMDUsNyBAQAogCiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAqbm9kZSA9ICh2b2lkKilyZXBseS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICAqbm9kZSA9IChub2RlX2lkKXJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKm5vZGUgPSAwOwogICAgICAgICB9CkBAIC0xMTUsNyArMTE2LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZyZWVOb2RlKG5vZGVfaWQgbm9kZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRlJFRV9OT0RFLCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTEyNSw3ICsxMjYsNyBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfQ09NTUFORFRZUEUgY21kLCBPTVhfUzMyIHBhcmFtKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjbWQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGFyYW0pOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VORF9DT01NQU5ELCBkYXRhLCAmcmVwbHkpOwpAQCAtMTM4LDkgKzEzOSw5IEBACiAgICAgICAgICAgICB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHNpemUpOwogICAgICAgICBkYXRhLndyaXRlKHBhcmFtcywgc2l6ZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUEFSQU1FVEVSLCBkYXRhLCAmcmVwbHkpOwogCkBAIC0xNTksOSArMTYwLDkgQEAKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGluZGV4KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc2l6ZSk7CiAgICAgICAgIGRhdGEud3JpdGUocGFyYW1zLCBzaXplKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QQVJBTUVURVIsIGRhdGEsICZyZXBseSk7CiAKQEAgLTE3Myw5ICsxNzQsOSBAQAogICAgICAgICAgICAgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5kZXgpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzaXplKTsKICAgICAgICAgZGF0YS53cml0ZShwYXJhbXMsIHNpemUpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NPTkZJRywgZGF0YSwgJnJlcGx5KTsKIApAQCAtMTk0LDkgKzE5NSw5IEBACiAgICAgICAgICAgICBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHNpemUpOwogICAgICAgICBkYXRhLndyaXRlKHBhcmFtcywgc2l6ZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQ09ORklHLCBkYXRhLCAmcmVwbHkpOwogCkBAIC0yMDcsNyArMjA4LDcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1NUQVRFVFlQRSogc3RhdGUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TVEFURSwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICAqc3RhdGUgPSBzdGF0aWNfY2FzdDxPTVhfU1RBVEVUWVBFPihyZXBseS5yZWFkSW50MzIoKSk7CkBAIC0yMTgsNyArMjE5LDcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKHVpbnQzMl90KWVuYWJsZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChFTkFCTEVfR1JBUEhJQ19CVUZGRVJTLCBkYXRhLCAmcmVwbHkpOwpAQCAtMjMxLDcgKzIzMiw3IEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX1UzMiogdXNhZ2UpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0dSQVBISUNfQlVGRkVSX1VTQUdFLCBkYXRhLCAmcmVwbHkpOwogCkBAIC0yNDUsNyArMjQ2LDcgQEAKICAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihwYXJhbXMtPmFzQmluZGVyKCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVVNFX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKQEAgLTI1Nyw3ICsyNTgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgICpidWZmZXIgPSAodm9pZCopcmVwbHkucmVhZEludFB0cigpOworICAgICAgICAqYnVmZmVyID0gKGJ1ZmZlcl9pZClyZXBseS5yZWFkSW50MzIoKTsKIAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTI2OCw3ICsyNjksNyBAQAogICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKICAgICAgICAgZGF0YS53cml0ZSgqZ3JhcGhpY0J1ZmZlcik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChVU0VfR1JBUEhJQ19CVUZGRVIsIGRhdGEsICZyZXBseSk7CkBAIC0yODAsNyArMjgxLDcgQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAotICAgICAgICAqYnVmZmVyID0gKHZvaWQqKXJlcGx5LnJlYWRJbnRQdHIoKTsKKyAgICAgICAgKmJ1ZmZlciA9IChidWZmZXJfaWQpcmVwbHkucmVhZEludDMyKCk7CiAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC0yOTAsMTAgKzI5MSwxMCBAQAogICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBkYXRhLndyaXRlKCpncmFwaGljQnVmZmVyKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3QpYnVmZmVyKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KWJ1ZmZlcik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChVUERBVEVfR1JBUEhJQ19CVUZGRVJfSU5fTUVUQSwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKQEAgLTMwNiw3ICszMDcsNyBAQAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKICAgICAgICAgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9JTlBVVF9TVVJGQUNFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0zMjksNyArMzMwLDcgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0lHTkFMX0VORF9PRl9JTlBVVF9TVFJFQU0sIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dXKCJiaW5kZXIgdHJhbnNhY3Rpb24gZmFpbGVkOiAlZCIsIGVycik7CkBAIC0zNDMsNyArMzQ0LDcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKHVpbnQzMl90KWVuYWJsZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVE9SRV9NRVRBX0RBVEFfSU5fQlVGRkVSUywgZGF0YSwgJnJlcGx5KTsKQEAgLTM1Nyw3ICszNTgsNyBAQAogICAgICAgICAgICAgT01YX1UzMiBtYXhfd2lkdGgsIE9NWF9VMzIgbWF4X2hlaWdodCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCllbmFibGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIobWF4X3dpZHRoKTsKQEAgLTM2OCwxNCArMzY5LDMzIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwKKyAgICAgICAgICAgIE9NWF9VMzIgYXVkaW9Id1N5bmMsIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlICkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SW5kZXgpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpdHVubmVsZWQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoYXVkaW9Id1N5bmMpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09ORklHVVJFX1ZJREVPX1RVTk5FTF9NT0RFLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc2lkZWJhbmRIYW5kbGUpIHsKKyAgICAgICAgICAgICpzaWRlYmFuZEhhbmRsZSA9IChuYXRpdmVfaGFuZGxlX3QgKilyZXBseS5yZWFkTmF0aXZlSGFuZGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgdm9pZCAqKmJ1ZmZlcl9kYXRhKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc2l6ZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBTExPQ19CVUZGRVIsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CkBAIC0zODUsOCArNDA1LDggQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAotICAgICAgICAqYnVmZmVyID0gKHZvaWQgKilyZXBseS5yZWFkSW50UHRyKCk7Ci0gICAgICAgICpidWZmZXJfZGF0YSA9ICh2b2lkICopcmVwbHkucmVhZEludFB0cigpOworICAgICAgICAqYnVmZmVyID0gKGJ1ZmZlcl9pZClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgKmJ1ZmZlcl9kYXRhID0gKHZvaWQgKilyZXBseS5yZWFkSW50NjQoKTsKIAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTM5Niw3ICs0MTYsNyBAQAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHBhcmFtcy0+YXNCaW5kZXIoKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBTExPQ19CVUZGRVJfV0lUSF9CQUNLVVAsIGRhdGEsICZyZXBseSk7CkBAIC00MDgsNyArNDI4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAotICAgICAgICAqYnVmZmVyID0gKHZvaWQqKXJlcGx5LnJlYWRJbnRQdHIoKTsKKyAgICAgICAgKmJ1ZmZlciA9IChidWZmZXJfaWQpcmVwbHkucmVhZEludDMyKCk7CiAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC00MTcsOSArNDM3LDkgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBidWZmZXJfaWQgYnVmZmVyKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3QpYnVmZmVyKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KWJ1ZmZlcik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGUkVFX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC00MjgsOCArNDQ4LDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZpbGxCdWZmZXIobm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClidWZmZXIpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClidWZmZXIpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRklMTF9CVUZGRVIsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtNDQyLDggKzQ2Miw4IEBACiAgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClidWZmZXIpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClidWZmZXIpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocmFuZ2Vfb2Zmc2V0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHJhbmdlX2xlbmd0aCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CkBAIC00NTksNyArNDc5LDcgQEAKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKHBhcmFtZXRlcl9uYW1lKTsKIAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0VYVEVOU0lPTl9JTkRFWCwgZGF0YSwgJnJlcGx5KTsKQEAgLTQ4Miw5ICs1MDIsOSBAQAogICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzaXplKTsKICAgICAgICAgZGF0YS53cml0ZShvcHRpb25EYXRhLCBzaXplKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHR5cGUpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0lOVEVSTkFMX09QVElPTiwgZGF0YSwgJnJlcGx5KTsKQEAgLTUwOSw3ICs1MjksNyBAQAogICAgICAgICBjYXNlIExJVkVTX0xPQ0FMTFk6CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQgKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBwaWRfdCBwaWQgPSAocGlkX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGxpdmVzTG9jYWxseShub2RlLCBwaWQpKTsKIApAQCAtNTUzLDcgKzU3Myw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBhbGxvY2F0ZU5vZGUobmFtZSwgb2JzZXJ2ZXIsICZub2RlKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNTYzLDcgKzU4Myw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmcmVlTm9kZShub2RlKSk7CiAKQEAgLTU3NCw3ICs1OTQsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKIAogICAgICAgICAgICAgT01YX0NPTU1BTkRUWVBFIGNtZCA9CiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8T01YX0NPTU1BTkRUWVBFPihkYXRhLnJlYWRJbnQzMigpKTsKQEAgLTU5MywxMCArNjEzLDEwIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCA9IHN0YXRpY19jYXN0PE9NWF9JTkRFWFRZUEU+KGRhdGEucmVhZEludDMyKCkpOwogCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGRhdGEucmVhZEludDY0KCk7CiAKICAgICAgICAgICAgIHZvaWQgKnBhcmFtcyA9IG1hbGxvYyhzaXplKTsKICAgICAgICAgICAgIGRhdGEucmVhZChwYXJhbXMsIHNpemUpOwpAQCAtNjQ0LDcgKzY2NCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1NUQVRFVFlQRSBzdGF0ZSA9IE9NWF9TdGF0ZUludmFsaWQ7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdldFN0YXRlKG5vZGUsICZzdGF0ZSk7CkBAIC02NTgsNyArNjc4LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX0JPT0wgZW5hYmxlID0gKE9NWF9CT09MKWRhdGEucmVhZEludDMyKCk7CiAKQEAgLTY3Miw3ICs2OTIsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIE9NWF9VMzIgdXNhZ2UgPSAwOwpAQCAtNjg3LDcgKzcwNyw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IHBhcmFtcyA9CiAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwpAQCAtNjk3LDcgKzcxNyw3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwogCiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50UHRyKChpbnRwdHJfdClidWZmZXIpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KWJ1ZmZlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTcwNyw3ICs3MjcsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKICAgICAgICAgICAgIGRhdGEucmVhZCgqZ3JhcGhpY0J1ZmZlcik7CkBAIC03MTgsNyArNzM4LDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNzI4LDExICs3NDgsMTEgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7CiAgICAgICAgICAgICBkYXRhLnJlYWQoKmdyYXBoaWNCdWZmZXIpOwotICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIgPSAoYnVmZmVyX2lkKWRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGEoCiAgICAgICAgICAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIGdyYXBoaWNCdWZmZXIsIGJ1ZmZlcik7CkBAIC03NDUsNyArNzY1LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKQEAgLTc2NSw3ICs3ODUsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShub2RlKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CkBAIC03NzcsNyArNzk3LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX0JPT0wgZW5hYmxlID0gKE9NWF9CT09MKWRhdGEucmVhZEludDMyKCk7CiAKQEAgLTc5MSw3ICs4MTEsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfQk9PTCBlbmFibGUgPSAoT01YX0JPT0wpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgbWF4X3dpZHRoID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTgwNCwxMSArODI0LDI5IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIENPTkZJR1VSRV9WSURFT19UVU5ORUxfTU9ERToKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgT01YX0JPT0wgdHVubmVsZWQgPSAoT01YX0JPT0wpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIE9NWF9VMzIgYXVkaW9faHdfc3luYyA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqc2lkZWJhbmRfaGFuZGxlOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgICAgICAgICBub2RlLCBwb3J0X2luZGV4LCB0dW5uZWxlZCwgYXVkaW9faHdfc3luYywgJnNpZGViYW5kX2hhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOworICAgICAgICAgICAgcmVwbHktPndyaXRlTmF0aXZlSGFuZGxlKHNpZGViYW5kX2hhbmRsZSk7CisKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgQUxMT0NfQlVGRkVSOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpZiAoIWlzU2VjdXJlKG5vZGUpIHx8IHBvcnRfaW5kZXggIT0gMCAvKiBrUG9ydEluZGV4SW5wdXQgKi8pIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNDMxMDQyMyIpOwpAQCAtODE2LDcgKzg1NCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGRhdGEucmVhZEludDY0KCk7CiAKICAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXI7CiAgICAgICAgICAgICB2b2lkICpidWZmZXJfZGF0YTsKQEAgLTgyNSw4ICs4NjMsOCBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKIAogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludFB0cigoaW50cHRyX3QpYnVmZmVyKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcl9kYXRhKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClidWZmZXIpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KCh1aW50cHRyX3QpYnVmZmVyX2RhdGEpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC04MzYsNyArODc0LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gcGFyYW1zID0KICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CkBAIC04NDgsNyArODg2LDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtODU4LDkgKzg5Niw5IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyID0gKGJ1ZmZlcl9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZnJlZUJ1ZmZlcihub2RlLCBwb3J0X2luZGV4LCBidWZmZXIpKTsKIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtODcwLDggKzkwOCw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7Ci0gICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIgPSAoYnVmZmVyX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmaWxsQnVmZmVyKG5vZGUsIGJ1ZmZlcikpOwogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC04ODEsOCArOTE5LDggQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKLSAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciA9IChidWZmZXJfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcmFuZ2Vfb2Zmc2V0ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcmFuZ2VfbGVuZ3RoID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MgPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtOTAwLDcgKzkzOCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqcGFyYW1ldGVyX25hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXg7CkBAIC05MzMsNiArOTcxLDggQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVhPYnNlcnZlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZSgmbXNnLCBzaXplb2YobXNnKSk7CiAKKyAgICAgICAgQUxPR1YoIm9uTWVzc2FnZSB3cml0aW5nIG1lc3NhZ2UgJWQsIHNpemUgJXp1IiwgbXNnLnR5cGUsIHNpemVvZihtc2cpKTsKKwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT0JTRVJWRVJfT05fTVNHLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CiB9OwpAQCAtOTQ5LDYgKzk4OSw4IEBACiAgICAgICAgICAgICBvbXhfbWVzc2FnZSBtc2c7CiAgICAgICAgICAgICBkYXRhLnJlYWQoJm1zZywgc2l6ZW9mKG1zZykpOwogCisgICAgICAgICAgICBBTE9HVigib25UcmFuc2FjdCByZWFkaW5nIG1lc3NhZ2UgJWQsIHNpemUgJXp1IiwgbXNnLnR5cGUsIHNpemVvZihtc2cpKTsKKwogICAgICAgICAgICAgLy8gWFhYIENvdWxkIHVzZSByZWFkSW5wbGFjZSBtYXliZT8KICAgICAgICAgICAgIG9uTWVzc2FnZShtc2cpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JU3RyZWFtU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwCmluZGV4IDY4ZmZjYTguLmZlMmNjNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwCkBAIC02Miw3ICs2Miw3IEBACiAgICAgdmlydHVhbCB2b2lkIHNldEJ1ZmZlcnMoY29uc3QgVmVjdG9yPHNwPElNZW1vcnk+ID4gJmJ1ZmZlcnMpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN0cmVhbVNvdXJjZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGJ1ZmZlcnMuc2l6ZSgpKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzdGF0aWNfY2FzdDxpbnQ2NF90PihidWZmZXJzLnNpemUoKSkpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoYnVmZmVycy5pdGVtQXQoaSktPmFzQmluZGVyKCkpOwogICAgICAgICB9CkBAIC03Miw3ICs3Miw3IEBACiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyQXZhaWxhYmxlKHNpemVfdCBpbmRleCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3RyZWFtU291cmNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaW5kZXgpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHN0YXRpY19jYXN0PGludDY0X3Q+KGluZGV4KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdCgKICAgICAgICAgICAgICAgICBPTl9CVUZGRVJfQVZBSUxBQkxFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICAgICAgY2FzZSBTRVRfQlVGRkVSUzoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdHJlYW1Tb3VyY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNpemVfdCBuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHNpemVfdCBuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQ2NCgpKTsKICAgICAgICAgICAgIFZlY3RvcjxzcDxJTWVtb3J5PiA+IGJ1ZmZlcnM7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9CkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgICAgY2FzZSBPTl9CVUZGRVJfQVZBSUxBQkxFOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN0cmVhbVNvdXJjZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgb25CdWZmZXJBdmFpbGFibGUoc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgICAgICBvbkJ1ZmZlckF2YWlsYWJsZShzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDY0KCkpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE0NSw4ICsxNDUsOCBAQAogICAgIHZpcnR1YWwgdm9pZCBxdWV1ZUJ1ZmZlcihzaXplX3QgaW5kZXgsIHNpemVfdCBzaXplKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdHJlYW1MaXN0ZW5lcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGluZGV4KSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihzaXplKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzdGF0aWNfY2FzdDxpbnQ2NF90PihpbmRleCkpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc3RhdGljX2Nhc3Q8aW50NjRfdD4oc2l6ZSkpOwogCiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChRVUVVRV9CVUZGRVIsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KQEAgLTE3Nyw4ICsxNzcsOCBAQAogICAgICAgICBjYXNlIFFVRVVFX0JVRkZFUjoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdHJlYW1MaXN0ZW5lciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4oZGF0YS5yZWFkSW50NjQoKSk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oZGF0YS5yZWFkSW50NjQoKSk7CiAKICAgICAgICAgICAgIHF1ZXVlQnVmZmVyKGluZGV4LCBzaXplKTsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKaW5kZXggZTkxNGIzNC4uZjBmMTgzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgICAgICBwTGliQ29uZmlnLT5zYW1wbGVSYXRlLAogICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQocExpYkNvbmZpZy0+bnVtQ2hhbm5lbHMpLAotICAgICAgICAgICAgbVRyYWNrQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIChzaXplX3QpIG1UcmFja0J1ZmZlclNpemUsCiAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKIAogICAgIC8vIGNyZWF0ZSByZW5kZXIgYW5kIHBsYXliYWNrIHRocmVhZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNGM0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY0luZm8iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoCisgICAgICAgIFZlY3RvcjxQcm9maWxlTGV2ZWw+ICpwcm9maWxlTGV2ZWxzKSBjb25zdCB7CisgICAgcHJvZmlsZUxldmVscy0+Y2xlYXIoKTsKKyAgICBwcm9maWxlTGV2ZWxzLT5hcHBlbmRWZWN0b3IobVByb2ZpbGVMZXZlbHMpOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldFN1cHBvcnRlZENvbG9yRm9ybWF0cygKKyAgICAgICAgVmVjdG9yPHVpbnQzMl90PiAqY29sb3JGb3JtYXRzKSBjb25zdCB7CisgICAgY29sb3JGb3JtYXRzLT5jbGVhcigpOworICAgIGNvbG9yRm9ybWF0cy0+YXBwZW5kVmVjdG9yKG1Db2xvckZvcm1hdHMpOworfQorCit1aW50MzJfdCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpnZXRGbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZsYWdzOworfQorCitjb25zdCBzcDxBTWVzc2FnZT4gTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0RGV0YWlscygpIGNvbnN0IHsKKyAgICByZXR1cm4gbURldGFpbHM7Cit9CisKK01lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkNhcGFiaWxpdGllcygpCisgIDogbUZsYWdzKDApIHsKKyAgICBtRGV0YWlscyA9IG5ldyBBTWVzc2FnZTsKK30KKworLy8gc3RhdGljCitzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGcm9tUGFyY2VsKAorICAgICAgICBjb25zdCBQYXJjZWwgJnBhcmNlbCkgeworICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMgPSBuZXcgQ2FwYWJpbGl0aWVzKCk7CisgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgUHJvZmlsZUxldmVsIHByb2ZpbGVMZXZlbDsKKyAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgICAgIHByb2ZpbGVMZXZlbC5tTGV2ZWwgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKGNhcHMgIT0gTlVMTCkgeworICAgICAgICAgICAgY2Fwcy0+bVByb2ZpbGVMZXZlbHMucHVzaF9iYWNrKHByb2ZpbGVMZXZlbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICB1aW50MzJfdCBjb2xvciA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgICAgICBpZiAoY2FwcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBjYXBzLT5tQ29sb3JGb3JtYXRzLnB1c2hfYmFjayhjb2xvcik7CisgICAgICAgIH0KKyAgICB9CisgICAgdWludDMyX3QgZmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBzcDxBTWVzc2FnZT4gZGV0YWlscyA9IEFNZXNzYWdlOjpGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKGNhcHMgIT0gTlVMTCkgeworICAgICAgICBjYXBzLT5tRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgY2Fwcy0+bURldGFpbHMgPSBkZXRhaWxzOworICAgIH0KKyAgICByZXR1cm4gY2FwczsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIENIRUNLX0xFKG1Qcm9maWxlTGV2ZWxzLnNpemUoKSwgSU5UMzJfTUFYKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIobVByb2ZpbGVMZXZlbHMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Qcm9maWxlTGV2ZWxzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUHJvZmlsZUxldmVscy5pdGVtQXQoaSkubVByb2ZpbGUpOworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIobVByb2ZpbGVMZXZlbHMuaXRlbUF0KGkpLm1MZXZlbCk7CisgICAgfQorICAgIENIRUNLX0xFKG1Db2xvckZvcm1hdHMuc2l6ZSgpLCBJTlQzMl9NQVgpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQ29sb3JGb3JtYXRzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29sb3JGb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQ29sb3JGb3JtYXRzLml0ZW1BdChpKSk7CisgICAgfQorICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtRmxhZ3MpOworICAgIG1EZXRhaWxzLT53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIE1lZGlhQ29kZWNJbmZvOjppc0VuY29kZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jc0VuY29kZXI7Cit9CisKK2Jvb2wgTWVkaWFDb2RlY0luZm86Omhhc1F1aXJrKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbVF1aXJrcy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgaWYgKG1RdWlya3MuaXRlbUF0KGl4KS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OmdldFN1cHBvcnRlZE1pbWVzKFZlY3RvcjxBU3RyaW5nPiAqbWltZXMpIGNvbnN0IHsKKyAgICBtaW1lcy0+Y2xlYXIoKTsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbUNhcHMuc2l6ZSgpOyBpeCsrKSB7CisgICAgICAgIG1pbWVzLT5wdXNoX2JhY2sobUNhcHMua2V5QXQoaXgpKTsKKyAgICB9Cit9CisKK2NvbnN0IHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+CitNZWRpYUNvZGVjSW5mbzo6Z2V0Q2FwYWJpbGl0aWVzRm9yKGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGl4ID0gZ2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOworICAgIGlmIChpeCA+PSAwKSB7CisgICAgICAgIHJldHVybiBtQ2Fwcy52YWx1ZUF0KGl4KTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKk1lZGlhQ29kZWNJbmZvOjpnZXRDb2RlY05hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1OYW1lLmNfc3RyKCk7Cit9CisKKy8vIHN0YXRpYworc3A8TWVkaWFDb2RlY0luZm8+IE1lZGlhQ29kZWNJbmZvOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CisgICAgQVN0cmluZyBuYW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOworICAgIGJvb2wgaXNFbmNvZGVyID0gc3RhdGljX2Nhc3Q8Ym9vbD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbyhuYW1lLCBpc0VuY29kZXIsIE5VTEwpOworICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIEFTdHJpbmcgcXVpcmsgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGluZm8tPm1RdWlya3MucHVzaF9iYWNrKHF1aXJrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIEFTdHJpbmcgbWltZSA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgc3A8Q2FwYWJpbGl0aWVzPiBjYXBzID0gQ2FwYWJpbGl0aWVzOjpGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGluZm8tPm1DYXBzLmFkZChtaW1lLCBjYXBzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5mbzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY0luZm86OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKKyAgICBtTmFtZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1Jc0VuY29kZXIpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUXVpcmtzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUXVpcmtzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1RdWlya3MuaXRlbUF0KGkpLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICB9CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1DYXBzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2Fwcy5zaXplKCk7IGkrKykgeworICAgICAgICBtQ2Fwcy5rZXlBdChpKS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIG1DYXBzLnZhbHVlQXQoaSktPndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzc2l6ZV90IE1lZGlhQ29kZWNJbmZvOjpnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWltZSkgY29uc3QgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtQ2Fwcy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgaWYgKG1DYXBzLmtleUF0KGl4KS5lcXVhbHNJZ25vcmVDYXNlKG1pbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gaXg7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitNZWRpYUNvZGVjSW5mbzo6TWVkaWFDb2RlY0luZm8oQVN0cmluZyBuYW1lLCBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm1pbWUpCisgICAgOiBtTmFtZShuYW1lKSwKKyAgICAgIG1Jc0VuY29kZXIoZW5jb2RlciksCisgICAgICBtSGFzU29sZU1pbWUoZmFsc2UpIHsKKyAgICBpZiAobWltZSAhPSBOVUxMKSB7CisgICAgICAgIGFkZE1pbWUobWltZSk7CisgICAgICAgIG1IYXNTb2xlTWltZSA9IHRydWU7CisgICAgfQorfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6YWRkTWltZShjb25zdCBjaGFyICptaW1lKSB7CisgICAgaWYgKG1IYXNTb2xlTWltZSkgeworICAgICAgICBBTE9HRSgiQ29kZWMgJyVzJyBhbHJlYWR5IGhhZCBpdHMgdHlwZSBzcGVjaWZpZWQiLCBtTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CisgICAgaWYgKGl4ID49IDApIHsKKyAgICAgICAgbUN1cnJlbnRDYXBzID0gbUNhcHMudmFsdWVBdChpeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUN1cnJlbnRDYXBzID0gbmV3IENhcGFiaWxpdGllcygpOworICAgICAgICBtQ2Fwcy5hZGQoQVN0cmluZyhtaW1lKSwgbUN1cnJlbnRDYXBzKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpyZW1vdmVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKKyAgICBzc2l6ZV90IGl4ID0gZ2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOworICAgIGlmIChpeCA+PSAwKSB7CisgICAgICAgIG1DYXBzLnJlbW92ZUl0ZW1zQXQoaXgpOworICAgICAgICAvLyBtQ3VycmVudENhcHMgd2lsbCBiZSByZW1vdmVkIHdoZW4gY29tcGxldGVkCisgICAgfQorfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6aW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBDb2RlY0NhcGFiaWxpdGllcyAmY2FwcykgeworICAgIG1DdXJyZW50Q2Fwcy0+bVByb2ZpbGVMZXZlbHMuY2xlYXIoKTsKKyAgICBtQ3VycmVudENhcHMtPm1Db2xvckZvcm1hdHMuY2xlYXIoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2Fwcy5tUHJvZmlsZUxldmVscy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCAmc3JjID0gY2Fwcy5tUHJvZmlsZUxldmVscy5pdGVtQXQoaSk7CisKKyAgICAgICAgUHJvZmlsZUxldmVsIHByb2ZpbGVMZXZlbDsKKyAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlID0gc3JjLm1Qcm9maWxlOworICAgICAgICBwcm9maWxlTGV2ZWwubUxldmVsID0gc3JjLm1MZXZlbDsKKyAgICAgICAgbUN1cnJlbnRDYXBzLT5tUHJvZmlsZUxldmVscy5wdXNoX2JhY2socHJvZmlsZUxldmVsKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHMubUNvbG9yRm9ybWF0cy5zaXplKCk7ICsraSkgeworICAgICAgICBtQ3VycmVudENhcHMtPm1Db2xvckZvcm1hdHMucHVzaF9iYWNrKGNhcHMubUNvbG9yRm9ybWF0cy5pdGVtQXQoaSkpOworICAgIH0KKworICAgIG1DdXJyZW50Q2Fwcy0+bUZsYWdzID0gY2Fwcy5tRmxhZ3M7CisgICAgbUN1cnJlbnRDYXBzLT5tRGV0YWlscyA9IG5ldyBBTWVzc2FnZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNZWRpYUNvZGVjSW5mbzo6YWRkUXVpcmsoY29uc3QgY2hhciAqbmFtZSkgeworICAgIGlmICghaGFzUXVpcmsobmFtZSkpIHsKKyAgICAgICAgbVF1aXJrcy5wdXNoKG5hbWUpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjSW5mbzo6Y29tcGxldGUoKSB7CisgICAgbUN1cnJlbnRDYXBzID0gTlVMTDsKK30KKwordm9pZCBNZWRpYUNvZGVjSW5mbzo6YWRkRGV0YWlsKGNvbnN0IEFTdHJpbmcgJmtleSwgY29uc3QgQVN0cmluZyAmdmFsdWUpIHsKKyAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzLT5zZXRTdHJpbmcoa2V5LmNfc3RyKCksIHZhbHVlLmNfc3RyKCkpOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjphZGRGZWF0dXJlKGNvbnN0IEFTdHJpbmcgJmtleSwgaW50MzJfdCB2YWx1ZSkgeworICAgIEFTdHJpbmcgdGFnID0gImZlYXR1cmUtIjsKKyAgICB0YWcuYXBwZW5kKGtleSk7CisgICAgbUN1cnJlbnRDYXBzLT5tRGV0YWlscy0+c2V0SW50MzIodGFnLmNfc3RyKCksIHZhbHVlKTsKK30KKwordm9pZCBNZWRpYUNvZGVjSW5mbzo6YWRkRmVhdHVyZShjb25zdCBBU3RyaW5nICZrZXksIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgICAgQVN0cmluZyB0YWcgPSAiZmVhdHVyZS0iOworICAgIHRhZy5hcHBlbmQoa2V5KTsKKyAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzLT5zZXRTdHJpbmcodGFnLmNfc3RyKCksIHZhbHVlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKaW5kZXggODMxOWNkNy4uZTJlNjA0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKQEAgLTY5LDYgKzY5LDcgQEAKICAgICB7IjQ4MHAiLCBDQU1DT1JERVJfUVVBTElUWV80ODBQfSwKICAgICB7IjcyMHAiLCBDQU1DT1JERVJfUVVBTElUWV83MjBQfSwKICAgICB7IjEwODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfMTA4MFB9LAorICAgIHsiMjE2MHAiLCBDQU1DT1JERVJfUVVBTElUWV8yMTYwUH0sCiAgICAgeyJxdmdhIiwgQ0FNQ09SREVSX1FVQUxJVFlfUVZHQX0sCiAKICAgICB7InRpbWVsYXBzZWxvdyIsICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xPV30sCkBAIC03OCwxMSArNzksMjUgQEAKICAgICB7InRpbWVsYXBzZTQ4MHAiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzQ4MFB9LAogICAgIHsidGltZWxhcHNlNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNzIwUH0sCiAgICAgeyJ0aW1lbGFwc2UxMDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFB9LAorICAgIHsidGltZWxhcHNlMjE2MHAiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzIxNjBQfSwKICAgICB7InRpbWVsYXBzZXF2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FWR0F9LAorCisgICAgeyJoaWdoc3BlZWRsb3ciLCAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MT1d9LAorICAgIHsiaGlnaHNwZWVkaGlnaCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfSElHSH0sCisgICAgeyJoaWdoc3BlZWQ0ODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF80ODBQfSwKKyAgICB7ImhpZ2hzcGVlZDcyMHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzcyMFB9LAorICAgIHsiaGlnaHNwZWVkMTA4MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzEwODBQfSwKKyAgICB7ImhpZ2hzcGVlZDIxNjBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8yMTYwUH0sCiB9OwogCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRUQgX191bnVzZWQKKyNlbHNlCisjZGVmaW5lIFVOVVNFRAorI2VuZGlmCisKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nVmlkZW9Db2RlYyhjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjJiBjb2RlYykKK01lZGlhUHJvZmlsZXM6OmxvZ1ZpZGVvQ29kZWMoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyYgY29kZWMgVU5VU0VEKQogewogICAgIEFMT0dWKCJ2aWRlbyBjb2RlYzoiKTsKICAgICBBTE9HVigiY29kZWMgPSAlZCIsIGNvZGVjLm1Db2RlYyk7CkBAIC05Myw3ICsxMDgsNyBAQAogfQogCiAvKnN0YXRpYyovIHZvaWQKLU1lZGlhUHJvZmlsZXM6OmxvZ0F1ZGlvQ29kZWMoY29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9Db2RlYyYgY29kZWMpCitNZWRpYVByb2ZpbGVzOjpsb2dBdWRpb0NvZGVjKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvQ29kZWMmIGNvZGVjIFVOVVNFRCkKIHsKICAgICBBTE9HVigiYXVkaW8gY29kZWM6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjb2RlYy5tQ29kZWMpOwpAQCAtMTAzLDcgKzExOCw3IEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nVmlkZW9FbmNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRW5jb2RlckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nVmlkZW9FbmNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRW5jb2RlckNhcCYgY2FwIFVOVVNFRCkKIHsKICAgICBBTE9HVigidmlkZW8gZW5jb2RlciBjYXA6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjYXAubUNvZGVjKTsKQEAgLTExNCw3ICsxMjksNyBAQAogfQogCiAvKnN0YXRpYyovIHZvaWQKLU1lZGlhUHJvZmlsZXM6OmxvZ0F1ZGlvRW5jb2RlckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpBdWRpb0VuY29kZXJDYXAmIGNhcCkKK01lZGlhUHJvZmlsZXM6OmxvZ0F1ZGlvRW5jb2RlckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpBdWRpb0VuY29kZXJDYXAmIGNhcCBVTlVTRUQpCiB7CiAgICAgQUxPR1YoImF1ZGlvIGVuY29kZXIgY2FwOiIpOwogICAgIEFMT0dWKCJjb2RlYyA9ICVkIiwgY2FwLm1Db2RlYyk7CkBAIC0xMjQsMjEgKzEzOSwyMSBAQAogfQogCiAvKnN0YXRpYyovIHZvaWQKLU1lZGlhUHJvZmlsZXM6OmxvZ1ZpZGVvRGVjb2RlckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0RlY29kZXJDYXAmIGNhcCkKK01lZGlhUHJvZmlsZXM6OmxvZ1ZpZGVvRGVjb2RlckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0RlY29kZXJDYXAmIGNhcCBVTlVTRUQpCiB7CiAgICAgQUxPR1YoInZpZGVvIGRlY29kZXIgY2FwOiIpOwogICAgIEFMT0dWKCJjb2RlYyA9ICVkIiwgY2FwLm1Db2RlYyk7CiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nQXVkaW9EZWNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRGVjb2RlckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nQXVkaW9EZWNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRGVjb2RlckNhcCYgY2FwIFVOVVNFRCkKIHsKICAgICBBTE9HVigiYXVkaW8gY29kZWMgY2FwOiIpOwogICAgIEFMT0dWKCJjb2RlYyA9ICVkIiwgY2FwLm1Db2RlYyk7CiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nVmlkZW9FZGl0b3JDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9FZGl0b3JDYXAmIGNhcCkKK01lZGlhUHJvZmlsZXM6OmxvZ1ZpZGVvRWRpdG9yQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRWRpdG9yQ2FwJiBjYXAgVU5VU0VEKQogewogICAgIEFMT0dWKCJ2aWRlb2VkaXRvciBjYXA6Iik7CiAgICAgQUxPR1YoIm1NYXhJbnB1dEZyYW1lV2lkdGggPSAlZCIsIGNhcC5tTWF4SW5wdXRGcmFtZVdpZHRoKTsKQEAgLTQ2Niw4ICs0ODEsMTMgQEAKICAgICAgICAgICAgcXVhbGl0eSA8PSBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EOwogfQogCitzdGF0aWMgYm9vbCBpc0hpZ2hTcGVlZFByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgeworICAgIHJldHVybiBxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9TVEFSVCAmJgorICAgICAgICAgICBxdWFsaXR5IDw9IENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9FTkQ7Cit9CisKIHZvaWQgTWVkaWFQcm9maWxlczo6aW5pdFJlcXVpcmVkUHJvZmlsZVJlZnMoY29uc3QgVmVjdG9yPGludD4mIGNhbWVyYUlkcykgewotICAgIEFMT0dWKCJOdW1iZXIgb2YgY2FtZXJhIGlkczogJWQiLCBjYW1lcmFJZHMuc2l6ZSgpKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIGNhbWVyYSBpZHM6ICV6dSIsIGNhbWVyYUlkcy5zaXplKCkpOwogICAgIENIRUNLKGNhbWVyYUlkcy5zaXplKCkgPiAwKTsKICAgICBtUmVxdWlyZWRQcm9maWxlUmVmcyA9IG5ldyBSZXF1aXJlZFByb2ZpbGVzW2NhbWVyYUlkcy5zaXplKCldOwogICAgIGZvciAoc2l6ZV90IGkgPSAwLCBuID0gY2FtZXJhSWRzLnNpemUoKTsgaSA8IG47ICsraSkgewpAQCAtNTEzLDE0ICs1MzMsMTcgQEAKICAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgcmVmUXVhbGl0eTsKICAgICAgICAgVmlkZW9Db2RlYyAqY29kZWMgPSBOVUxMOwogCi0gICAgICAgIC8vIENoZWNrIGhpZ2ggYW5kIGxvdyBmcm9tIGVpdGhlciBjYW1jb3JkZXIgcHJvZmlsZSBvciB0aW1lbGFwc2UgcHJvZmlsZQotICAgICAgICAvLyBidXQgbm90IGJvdGguIERlZmF1bHQsIGNoZWNrIGNhbWNvcmRlciBwcm9maWxlCisgICAgICAgIC8vIENoZWNrIGhpZ2ggYW5kIGxvdyBmcm9tIGVpdGhlciBjYW1jb3JkZXIgcHJvZmlsZSwgdGltZWxhcHNlIHByb2ZpbGUKKyAgICAgICAgLy8gb3IgaGlnaCBzcGVlZCBwcm9maWxlLCBidXQgbm90IGFsbCBvZiB0aGVtLiBEZWZhdWx0LCBjaGVjayBjYW1jb3JkZXIgcHJvZmlsZQogICAgICAgICBzaXplX3QgaiA9IDA7CiAgICAgICAgIHNpemVfdCBvID0gMjsKICAgICAgICAgaWYgKGlzVGltZWxhcHNlUHJvZmlsZShxdWFsaXR5KSkgewogICAgICAgICAgICAgLy8gQ2hlY2sgdGltZWxhcHNlIHByb2ZpbGUgaW5zdGVhZC4KICAgICAgICAgICAgIGogPSAyOwogICAgICAgICAgICAgbyA9IGtOdW1SZXF1aXJlZFByb2ZpbGVzOworICAgICAgICB9IGVsc2UgaWYgKGlzSGlnaFNwZWVkUHJvZmlsZShxdWFsaXR5KSkgeworICAgICAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgZm9yIGhpZ2ggc3BlZWQgcHJvZmlsZS4KKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gTXVzdCBiZSBjYW1jb3JkZXIgcHJvZmlsZS4KICAgICAgICAgICAgIENIRUNLKGlzQ2FtY29yZGVyUHJvZmlsZShxdWFsaXR5KSk7CkBAIC01OTQsMTQgKzYxNywxNCBAQAogCiAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZ2V0Q2FtY29yZGVyUHJvZmlsZUluZGV4KGNhbWVyYUlkLCBwcm9maWxlLT5tUXVhbGl0eSk7CiAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJQcm9maWxlIHF1YWxpdHkgJWQgZm9yIGNhbWVyYSAlZCBhbHJlYWR5IGV4aXN0cyIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJQcm9maWxlIHF1YWxpdHkgJWQgZm9yIGNhbWVyYSAlenUgYWxyZWFkeSBleGlzdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVF1YWxpdHksIGNhbWVyYUlkKTsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaW5kZXggPT0gcmVmSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIG5ldyBwcm9maWxlCi0gICAgICAgICAgICAgICAgQUxPR1YoIkFkZCBhIHByb2ZpbGU6IHF1YWxpdHkgJWQ9PiVkIGZvciBjYW1lcmEgJWQiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJBZGQgYSBwcm9maWxlOiBxdWFsaXR5ICVkPT4lZCBmb3IgY2FtZXJhICV6dSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtY29yZGVyUHJvZmlsZXNbaW5mby0+bVJlZlByb2ZpbGVJbmRleF0tPm1RdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVF1YWxpdHksIGNhbWVyYUlkKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKaW5kZXggMjhiNWFhNy4uZGNiYjc2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCkBAIC0yMzcsNCArMjM3LDI0IEBACiAgICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX09LOwogfQogCitNZWRpYUFsYnVtQXJ0ICpNZWRpYUFsYnVtQXJ0OjpjbG9uZSgpIHsKKyAgICBzaXplX3QgYnl0ZV9zaXplID0gdGhpcy0+c2l6ZSgpICsgc2l6ZW9mKE1lZGlhQWxidW1BcnQpOworICAgIE1lZGlhQWxidW1BcnQgKnJlc3VsdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWVkaWFBbGJ1bUFydCAqPihtYWxsb2MoYnl0ZV9zaXplKSk7CisgICAgcmVzdWx0LT5tU2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICBtZW1jcHkoJnJlc3VsdC0+bURhdGFbMF0sICZ0aGlzLT5tRGF0YVswXSwgdGhpcy0+c2l6ZSgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIE1lZGlhQWxidW1BcnQ6OmluaXQoTWVkaWFBbGJ1bUFydCAqaW5zdGFuY2UsIGludDMyX3QgZGF0YVNpemUsIGNvbnN0IHZvaWQgKmRhdGEpIHsKKyAgICBpbnN0YW5jZS0+bVNpemUgPSBkYXRhU2l6ZTsKKyAgICBtZW1jcHkoJmluc3RhbmNlLT5tRGF0YVswXSwgZGF0YSwgZGF0YVNpemUpOworfQorCitNZWRpYUFsYnVtQXJ0ICpNZWRpYUFsYnVtQXJ0Ojpmcm9tRGF0YShpbnQzMl90IGRhdGFTaXplLCBjb25zdCB2b2lkKiBkYXRhKSB7CisgICAgc2l6ZV90IGJ5dGVfc2l6ZSA9IHNpemVvZihNZWRpYUFsYnVtQXJ0KSArIGRhdGFTaXplOworICAgIE1lZGlhQWxidW1BcnQgKnJlc3VsdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWVkaWFBbGJ1bUFydCAqPihtYWxsb2MoYnl0ZV9zaXplKSk7CisgICAgaW5pdChyZXN1bHQsIGRhdGFTaXplLCBkYXRhKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAKaW5kZXggOTNhNGE0Yy4uOWY4MDNjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwCkBAIC0xNCwyMTcgKzE0LDM4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhU2Nhbm5lckNsaWVudCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2luY2x1ZGUgPG1lZGlhL21lZGlhc2Nhbm5lci5oPgogCisjaW5jbHVkZSAiQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oIgogI2luY2x1ZGUgIlN0cmluZ0FycmF5LmgiCiAKLSNpbmNsdWRlICJhdXRvZGV0ZWN0LmgiCi0jaW5jbHVkZSAidW5pY29kZS91Y252LmgiCi0jaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotTWVkaWFTY2FubmVyQ2xpZW50OjpNZWRpYVNjYW5uZXJDbGllbnQoKQotICAgIDogICBtTmFtZXMoTlVMTCksCi0gICAgICAgIG1WYWx1ZXMoTlVMTCksCi0gICAgICAgIG1Mb2NhbGVFbmNvZGluZyhrRW5jb2RpbmdOb25lKQoteworTWVkaWFTY2FubmVyQ2xpZW50OjpNZWRpYVNjYW5uZXJDbGllbnQoKSB7CiB9CiAKLU1lZGlhU2Nhbm5lckNsaWVudDo6fk1lZGlhU2Nhbm5lckNsaWVudCgpCi17Ci0gICAgZGVsZXRlIG1OYW1lczsKLSAgICBkZWxldGUgbVZhbHVlczsKK01lZGlhU2Nhbm5lckNsaWVudDo6fk1lZGlhU2Nhbm5lckNsaWVudCgpIHsKIH0KIAogdm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OnNldExvY2FsZShjb25zdCBjaGFyKiBsb2NhbGUpCiB7Ci0gICAgaWYgKCFsb2NhbGUpIHJldHVybjsKLQotICAgIGlmICghc3RybmNtcChsb2NhbGUsICJqYSIsIDIpKQotICAgICAgICBtTG9jYWxlRW5jb2RpbmcgPSBrRW5jb2RpbmdTaGlmdEpJUzsKLSAgICBlbHNlIGlmICghc3RybmNtcChsb2NhbGUsICJrbyIsIDIpKQotICAgICAgICBtTG9jYWxlRW5jb2RpbmcgPSBrRW5jb2RpbmdFVUNLUjsKLSAgICBlbHNlIGlmICghc3RybmNtcChsb2NhbGUsICJ6aCIsIDIpKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGxvY2FsZSwgInpoX0NOIikpIHsKLSAgICAgICAgICAgIC8vIHNpbXBsaWZpZWQgY2hpbmVzZSBmb3IgbWFpbmxhbmQgQ2hpbmEKLSAgICAgICAgICAgIG1Mb2NhbGVFbmNvZGluZyA9IGtFbmNvZGluZ0dCSzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGFzc3VtZSB0cmFkaXRpb25hbCBmb3Igbm9uLW1haW5sYW5kIENoaW5lc2UgbG9jYWxlcyAoVGFpd2FuLCBIb25nIEtvbmcsIFNpbmdhcG9yZSkKLSAgICAgICAgICAgIG1Mb2NhbGVFbmNvZGluZyA9IGtFbmNvZGluZ0JpZzU7Ci0gICAgICAgIH0KLSAgICB9CisgICAgbUxvY2FsZSA9IGxvY2FsZTsgLy8gbm90IGN1cnJlbnRseSB1c2VkCiB9CiAKLXZvaWQgTWVkaWFTY2FubmVyQ2xpZW50OjpiZWdpbkZpbGUoKQotewotICAgIG1OYW1lcyA9IG5ldyBTdHJpbmdBcnJheTsKLSAgICBtVmFsdWVzID0gbmV3IFN0cmluZ0FycmF5Owordm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OmJlZ2luRmlsZSgpIHsKIH0KIAogc3RhdHVzX3QgTWVkaWFTY2FubmVyQ2xpZW50OjphZGRTdHJpbmdUYWcoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUpCiB7Ci0gICAgaWYgKG1Mb2NhbGVFbmNvZGluZyAhPSBrRW5jb2RpbmdOb25lKSB7Ci0gICAgICAgIC8vIGRvbid0IGJvdGhlciBjYWNoaW5nIHN0cmluZ3MgdGhhdCBhcmUgYWxsIEFTQ0lJLgotICAgICAgICAvLyBjYWxsIGhhbmRsZVN0cmluZ1RhZyBkaXJlY3RseSBpbnN0ZWFkLgotICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdmFsdWUgKHdoaWNoIHNob3VsZCBiZSB1dGY4KSBoYXMgYW55IG5vbi1BU0NJSSBjaGFyYWN0ZXJzCi0gICAgICAgIGJvb2wgbm9uQXNjaWkgPSBmYWxzZTsKLSAgICAgICAgY29uc3QgY2hhciogY2hwID0gdmFsdWU7Ci0gICAgICAgIGNoYXIgY2g7Ci0gICAgICAgIHdoaWxlICgoY2ggPSAqY2hwKyspKSB7Ci0gICAgICAgICAgICBpZiAoY2ggJiAweDgwKSB7Ci0gICAgICAgICAgICAgICAgbm9uQXNjaWkgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5vbkFzY2lpKSB7Ci0gICAgICAgICAgICAvLyBzYXZlIHRoZSBzdHJpbmdzIGZvciBsYXRlciBzbyB0aGV5IGNhbiBiZSB1c2VkIGZvciBuYXRpdmUgZW5jb2RpbmcgZGV0ZWN0aW9uCi0gICAgICAgICAgICBtTmFtZXMtPnB1c2hfYmFjayhuYW1lKTsKLSAgICAgICAgICAgIG1WYWx1ZXMtPnB1c2hfYmFjayh2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZWxzZSBmYWxsIHRocm91Z2gKLSAgICB9Ci0KLSAgICAvLyBhdXRvZGV0ZWN0aW9uIGlzIG5vdCBuZWNlc3NhcnksIHNvIG5vIG5lZWQgdG8gY2FjaGUgdGhlIHZhbHVlcwotICAgIC8vIHBhc3MgZGlyZWN0bHkgdG8gdGhlIGNsaWVudCBpbnN0ZWFkCi0gICAgcmV0dXJuIGhhbmRsZVN0cmluZ1RhZyhuYW1lLCB2YWx1ZSk7CisgICAgaGFuZGxlU3RyaW5nVGFnKG5hbWUsIHZhbHVlKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXRpYyB1aW50MzJfdCBwb3NzaWJsZUVuY29kaW5ncyhjb25zdCBjaGFyKiBzKQotewotICAgIHVpbnQzMl90IHJlc3VsdCA9IGtFbmNvZGluZ0FsbDsKLSAgICAvLyBpZiBzIGNvbnRhaW5zIGEgbmF0aXZlIGVuY29kaW5nLCB0aGVuIGl0IHdhcyBtaXN0YWtlbmx5IGVuY29kZWQgaW4gdXRmOCBhcyBpZiBpdCB3ZXJlIGxhdGluLTEKLSAgICAvLyBzbyB3ZSBuZWVkIHRvIHJldmVyc2UgdGhlIGxhdGluLTEgLT4gdXRmOCBjb252ZXJzaW9uIHRvIGdldCB0aGUgbmF0aXZlIGNoYXJzIGJhY2sKLSAgICB1aW50OF90IGNoMSwgY2gyOwotICAgIHVpbnQ4X3QqIGNocCA9ICh1aW50OF90ICopczsKLQotICAgIHdoaWxlICgoY2gxID0gKmNocCsrKSkgewotICAgICAgICBpZiAoY2gxICYgMHg4MCkgewotICAgICAgICAgICAgY2gyID0gKmNocCsrOwotICAgICAgICAgICAgY2gxID0gKChjaDEgPDwgNikgJiAweEMwKSB8IChjaDIgJiAweDNGKTsKLSAgICAgICAgICAgIC8vIGNoMSBpcyBub3cgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHBvdGVudGlhbCBuYXRpdmUgY2hhcgotCi0gICAgICAgICAgICBjaDIgPSAqY2hwKys7Ci0gICAgICAgICAgICBpZiAoY2gyICYgMHg4MCkKLSAgICAgICAgICAgICAgICBjaDIgPSAoKGNoMiA8PCA2KSAmIDB4QzApIHwgKCpjaHArKyAmIDB4M0YpOwotICAgICAgICAgICAgLy8gY2gyIGlzIG5vdyB0aGUgc2Vjb25kIGJ5dGUgb2YgdGhlIHBvdGVudGlhbCBuYXRpdmUgY2hhcgotICAgICAgICAgICAgaW50IGNoID0gKGludCljaDEgPDwgOCB8IChpbnQpY2gyOwotICAgICAgICAgICAgcmVzdWx0ICY9IGZpbmRQb3NzaWJsZUVuY29kaW5ncyhjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZWxzZSBBU0NJSSBjaGFyYWN0ZXIsIHdoaWNoIGNvdWxkIGJlIGFueXRoaW5nCi0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OmNvbnZlcnRWYWx1ZXModWludDMyX3QgZW5jb2RpbmcpCi17Ci0gICAgY29uc3QgY2hhciogZW5jID0gTlVMTDsKLSAgICBzd2l0Y2ggKGVuY29kaW5nKSB7Ci0gICAgICAgIGNhc2Uga0VuY29kaW5nU2hpZnRKSVM6Ci0gICAgICAgICAgICBlbmMgPSAic2hpZnQtamlzIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGtFbmNvZGluZ0dCSzoKLSAgICAgICAgICAgIGVuYyA9ICJnYmsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga0VuY29kaW5nQmlnNToKLSAgICAgICAgICAgIGVuYyA9ICJCaWc1IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGtFbmNvZGluZ0VVQ0tSOgotICAgICAgICAgICAgZW5jID0gIkVVQy1LUiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoZW5jKSB7Ci0gICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwotCi0gICAgICAgIFVDb252ZXJ0ZXIgKmNvbnYgPSB1Y252X29wZW4oZW5jLCAmc3RhdHVzKTsKLSAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGNyZWF0ZSBVQ29udmVydGVyIGZvciAlcyIsIGVuYyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgVUNvbnZlcnRlciAqdXRmOENvbnYgPSB1Y252X29wZW4oIlVURi04IiwgJnN0YXR1cyk7Ci0gICAgICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgewotICAgICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBjcmVhdGUgVUNvbnZlcnRlciBmb3IgVVRGLTgiKTsKLSAgICAgICAgICAgIHVjbnZfY2xvc2UoY29udik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmb3IgZWFjaCB2YWx1ZSBzdHJpbmcsIGNvbnZlcnQgZnJvbSBuYXRpdmUgZW5jb2RpbmcgdG8gVVRGLTgKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmFtZXMtPnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCB3ZSBuZWVkIHRvIHVudGFuZ2xlIHRoZSB1dGY4IGFuZCBjb252ZXJ0IGl0IGJhY2sgdG8gdGhlIG9yaWdpbmFsIGJ5dGVzCi0gICAgICAgICAgICAvLyBzaW5jZSB3ZSBhcmUgcmVkdWNpbmcgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLCB3ZSBjYW4gZG8gdGhpcyBpbiBwbGFjZQotICAgICAgICAgICAgdWludDhfdCogc3JjID0gKHVpbnQ4X3QgKiltVmFsdWVzLT5nZXRFbnRyeShpKTsKLSAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4oKGNoYXIgKilzcmMpOwotICAgICAgICAgICAgdWludDhfdCogZGVzdCA9IHNyYzsKLQotICAgICAgICAgICAgdWludDhfdCB1Y2g7Ci0gICAgICAgICAgICB3aGlsZSAoKHVjaCA9ICpzcmMrKykpIHsKLSAgICAgICAgICAgICAgICBpZiAodWNoICYgMHg4MCkKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICgodWNoIDw8IDYpICYgMHhDMCkgfCAoKnNyYysrICYgMHgzRik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gdWNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKmRlc3QgPSAwOwotCi0gICAgICAgICAgICAvLyBub3cgY29udmVydCBmcm9tIG5hdGl2ZSBlbmNvZGluZyB0byBVVEYtOAotICAgICAgICAgICAgY29uc3QgY2hhciogc291cmNlID0gbVZhbHVlcy0+Z2V0RW50cnkoaSk7Ci0gICAgICAgICAgICBpbnQgdGFyZ2V0TGVuZ3RoID0gbGVuICogMyArIDE7Ci0gICAgICAgICAgICBjaGFyKiBidWZmZXIgPSBuZXcgY2hhclt0YXJnZXRMZW5ndGhdOwotICAgICAgICAgICAgLy8gZG9uJ3Qgbm9ybWFsbHkgY2hlY2sgZm9yIE5VTEwsIGJ1dCBpbiB0aGlzIGNhc2UgdGFyZ2V0TGVuZ3RoIG1heSBiZSBsYXJnZQotICAgICAgICAgICAgaWYgKCFidWZmZXIpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjaGFyKiB0YXJnZXQgPSBidWZmZXI7Ci0KLSAgICAgICAgICAgIHVjbnZfY29udmVydEV4KHV0ZjhDb252LCBjb252LCAmdGFyZ2V0LCB0YXJnZXQgKyB0YXJnZXRMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICZzb3VyY2UsIChjb25zdCBjaGFyICopZGVzdCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgVFJVRSwgVFJVRSwgJnN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgidWNudl9jb252ZXJ0RXggZmFpbGVkOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgbVZhbHVlcy0+c2V0RW50cnkoaSwgIj8/PyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyB6ZXJvIHRlcm1pbmF0ZQotICAgICAgICAgICAgICAgICp0YXJnZXQgPSAwOwotICAgICAgICAgICAgICAgIG1WYWx1ZXMtPnNldEVudHJ5KGksIGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHVjbnZfY2xvc2UoY29udik7Ci0gICAgICAgIHVjbnZfY2xvc2UodXRmOENvbnYpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OmVuZEZpbGUoKQotewotICAgIGlmIChtTG9jYWxlRW5jb2RpbmcgIT0ga0VuY29kaW5nTm9uZSkgewotICAgICAgICBpbnQgc2l6ZSA9IG1OYW1lcy0+c2l6ZSgpOwotICAgICAgICB1aW50MzJfdCBlbmNvZGluZyA9IGtFbmNvZGluZ0FsbDsKLQotICAgICAgICAvLyBjb21wdXRlIGEgYml0IG1hc2sgY29udGFpbmluZyBhbGwgcG9zc2libGUgZW5jb2RpbmdzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU5hbWVzLT5zaXplKCk7IGkrKykKLSAgICAgICAgICAgIGVuY29kaW5nICY9IHBvc3NpYmxlRW5jb2RpbmdzKG1WYWx1ZXMtPmdldEVudHJ5KGkpKTsKLQotICAgICAgICAvLyBpZiB0aGUgbG9jYWxlIGVuY29kaW5nIG1hdGNoZXMsIHRoZW4gYXNzdW1lIHdlIGhhdmUgYSBuYXRpdmUgZW5jb2RpbmcuCi0gICAgICAgIGlmIChlbmNvZGluZyAmIG1Mb2NhbGVFbmNvZGluZykKLSAgICAgICAgICAgIGNvbnZlcnRWYWx1ZXMobUxvY2FsZUVuY29kaW5nKTsKLQotICAgICAgICAvLyBmaW5hbGx5LCBwdXNoIGFsbCBuYW1lL3ZhbHVlIHBhaXJzIHRvIHRoZSBjbGllbnQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmFtZXMtPnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYW5kbGVTdHJpbmdUYWcobU5hbWVzLT5nZXRFbnRyeShpKSwgbVZhbHVlcy0+Z2V0RW50cnkoaSkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8vIGVsc2UgYWRkU3RyaW5nVGFnKCkgaGFzIGRvbmUgYWxsIHRoZSB3b3JrIHNvIHdlIGhhdmUgbm90aGluZyB0byBkbwotCi0gICAgZGVsZXRlIG1OYW1lczsKLSAgICBkZWxldGUgbVZhbHVlczsKLSAgICBtTmFtZXMgPSBOVUxMOwotICAgIG1WYWx1ZXMgPSBOVUxMOwordm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OmVuZEZpbGUoKSB7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuY3BwCmluZGV4IGYwMDRjYTQuLjY2ZjcxNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvU291bmRQb29sLmNwcCBiL21lZGlhL2xpYm1lZGlhL1NvdW5kUG9vbC5jcHAKaW5kZXggYTJiNWUzMC4uMjlhZDdlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvU291bmRQb29sLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9Tb3VuZFBvb2wuY3BwCkBAIC0xNiwxNCArMTYsMTkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJTb3VuZFBvb2wiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNkZWZpbmUgVVNFX1NIQVJFRF9NRU1fQlVGRkVSCiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL1NvdW5kUG9vbC5oPgogI2luY2x1ZGUgIlNvdW5kUG9vbFRocmVhZC5oIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkCiB7CkBAIC0zNSwxMCArNDAsMTAgQEAKIHNpemVfdCBrRGVmYXVsdEhlYXBTaXplID0gMTAyNCAqIDEwMjQ7IC8vIDFNQgogCiAKLVNvdW5kUG9vbDo6U291bmRQb29sKGludCBtYXhDaGFubmVscywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCBpbnQgc3JjUXVhbGl0eSkKK1NvdW5kUG9vbDo6U291bmRQb29sKGludCBtYXhDaGFubmVscywgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykKIHsKLSAgICBBTE9HVigiU291bmRQb29sIGNvbnN0cnVjdG9yOiBtYXhDaGFubmVscz0lZCwgc3RyZWFtVHlwZT0lZCwgc3JjUXVhbGl0eT0lZCIsCi0gICAgICAgICAgICBtYXhDaGFubmVscywgc3RyZWFtVHlwZSwgc3JjUXVhbGl0eSk7CisgICAgQUxPR1YoIlNvdW5kUG9vbCBjb25zdHJ1Y3RvcjogbWF4Q2hhbm5lbHM9JWQsIGF0dHIudXNhZ2U9JWQsIGF0dHIuZmxhZ3M9MHgleCwgYXR0ci50YWdzPSVzIiwKKyAgICAgICAgICAgIG1heENoYW5uZWxzLCBwQXR0cmlidXRlcy0+dXNhZ2UsIHBBdHRyaWJ1dGVzLT5mbGFncywgcEF0dHJpYnV0ZXMtPnRhZ3MpOwogCiAgICAgLy8gY2hlY2sgbGltaXRzCiAgICAgbU1heENoYW5uZWxzID0gbWF4Q2hhbm5lbHM7CkBAIC01Miw4ICs1Nyw3IEBACiAKICAgICBtUXVpdCA9IGZhbHNlOwogICAgIG1EZWNvZGVUaHJlYWQgPSAwOwotICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICBtU3JjUXVhbGl0eSA9IHNyY1F1YWxpdHk7CisgICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICBtQWxsb2NhdGVkID0gMDsKICAgICBtTmV4dFNhbXBsZUlEID0gMDsKICAgICBtTmV4dENoYW5uZWxJRCA9IDA7CkBAIC0yMTAsNyArMjE0LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotaW50IFNvdW5kUG9vbDo6bG9hZChjb25zdCBjaGFyKiBwYXRoLCBpbnQgcHJpb3JpdHkpCitpbnQgU291bmRQb29sOjpsb2FkKGNvbnN0IGNoYXIqIHBhdGgsIGludCBwcmlvcml0eSBfX3VudXNlZCkKIHsKICAgICBBTE9HVigibG9hZDogcGF0aD0lcywgcHJpb3JpdHk9JWQiLCBwYXRoLCBwcmlvcml0eSk7CiAgICAgaW50IHNhbXBsZUlEOwpAQCAtMjMwLDkgKzIzNCw5IEBACiAgICAgcmV0dXJuIHNhbXBsZUlEOwogfQogCi1pbnQgU291bmRQb29sOjpsb2FkKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBpbnQgcHJpb3JpdHkpCitpbnQgU291bmRQb29sOjpsb2FkKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBpbnQgcHJpb3JpdHkgX191bnVzZWQpCiB7Ci0gICAgQUxPR1YoImxvYWQ6IGZkPSVkLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQsIHByaW9yaXR5PSVkIiwKKyAgICBBTE9HVigibG9hZDogZmQ9JWQsIG9mZnNldD0lIiBQUklkNjQgIiwgbGVuZ3RoPSUiIFBSSWQ2NCAiLCBwcmlvcml0eT0lZCIsCiAgICAgICAgICAgICBmZCwgb2Zmc2V0LCBsZW5ndGgsIHByaW9yaXR5KTsKICAgICBpbnQgc2FtcGxlSUQ7CiAgICAgewpAQCAtNDg0LDcgKzQ4OCw4IEBACiAgICAgbUZkID0gZHVwKGZkKTsKICAgICBtT2Zmc2V0ID0gb2Zmc2V0OwogICAgIG1MZW5ndGggPSBsZW5ndGg7Ci0gICAgQUxPR1YoImNyZWF0ZSBzYW1wbGVJRD0lZCwgZmQ9JWQsIG9mZnNldD0lbGxkLCBsZW5ndGg9JWxsZCIsIG1TYW1wbGVJRCwgbUZkLCBtTGVuZ3RoLCBtT2Zmc2V0KTsKKyAgICBBTE9HVigiY3JlYXRlIHNhbXBsZUlEPSVkLCBmZD0lZCwgb2Zmc2V0PSUiIFBSSWQ2NCAiIGxlbmd0aD0lIiBQUklkNjQsCisgICAgICAgIG1TYW1wbGVJRCwgbUZkLCBtTGVuZ3RoLCBtT2Zmc2V0KTsKIH0KIAogdm9pZCBTYW1wbGU6OmluaXQoKQpAQCAtNTE5LDcgKzUyNCwxNCBAQAogCiAgICAgQUxPR1YoIlN0YXJ0IGRlY29kZSIpOwogICAgIGlmIChtVXJsKSB7Ci0gICAgICAgIHN0YXR1cyA9IE1lZGlhUGxheWVyOjpkZWNvZGUobVVybCwgJnNhbXBsZVJhdGUsICZudW1DaGFubmVscywgJmZvcm1hdCwgbUhlYXAsICZtU2l6ZSk7CisgICAgICAgIHN0YXR1cyA9IE1lZGlhUGxheWVyOjpkZWNvZGUoCisgICAgICAgICAgICAgICAgTlVMTCAvKiBodHRwU2VydmljZSAqLywKKyAgICAgICAgICAgICAgICBtVXJsLAorICAgICAgICAgICAgICAgICZzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICZudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAmZm9ybWF0LAorICAgICAgICAgICAgICAgIG1IZWFwLAorICAgICAgICAgICAgICAgICZtU2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RhdHVzID0gTWVkaWFQbGF5ZXI6OmRlY29kZShtRmQsIG1PZmZzZXQsIG1MZW5ndGgsICZzYW1wbGVSYXRlLCAmbnVtQ2hhbm5lbHMsICZmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYXAsICZtU2l6ZSk7CkBAIC01MzEsNyArNTQzLDcgQEAKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBsb2FkIHNhbXBsZTogJXMiLCBtVXJsKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9Ci0gICAgQUxPR1YoInBvaW50ZXIgPSAlcCwgc2l6ZSA9ICV1LCBzYW1wbGVSYXRlID0gJXUsIG51bUNoYW5uZWxzID0gJWQiLAorICAgIEFMT0dWKCJwb2ludGVyID0gJXAsIHNpemUgPSAlenUsIHNhbXBsZVJhdGUgPSAldSwgbnVtQ2hhbm5lbHMgPSAlZCIsCiAgICAgICAgICAgbUhlYXAtPmdldEJhc2UoKSwgbVNpemUsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKIAogICAgIGlmIChzYW1wbGVSYXRlID4ga01heFNhbXBsZVJhdGUpIHsKQEAgLTU5MSw3ICs2MDMsNyBAQAogICAgICAgICAvLyBpbml0aWFsaXplIHRyYWNrCiAgICAgICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7CiAgICAgICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gbVNvdW5kUG9vbC0+c3RyZWFtVHlwZSgpOworICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKG1Tb3VuZFBvb2wtPmF0dHJpYnV0ZXMoKSk7CiAgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgYWZGcmFtZUNvdW50ID0ga0RlZmF1bHRGcmFtZUNvdW50OwogICAgICAgICB9CkBAIC02MDIsNyArNjE0LDcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IHVpbnQzMl90KGZsb2F0KHNhbXBsZS0+c2FtcGxlUmF0ZSgpKSAqIHJhdGUgKyAwLjUpOwogICAgICAgICB1aW50MzJfdCB0b3RhbEZyYW1lcyA9IChrRGVmYXVsdEJ1ZmZlckNvdW50ICogYWZGcmFtZUNvdW50ICogc2FtcGxlUmF0ZSkgLyBhZlNhbXBsZVJhdGU7CiAgICAgICAgIHVpbnQzMl90IGJ1ZmZlckZyYW1lcyA9ICh0b3RhbEZyYW1lcyArIChrRGVmYXVsdEJ1ZmZlckNvdW50IC0gMSkpIC8ga0RlZmF1bHRCdWZmZXJDb3VudDsKLSAgICAgICAgdWludDMyX3QgZnJhbWVDb3VudCA9IDA7CisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMDsKIAogICAgICAgICBpZiAobG9vcCkgewogICAgICAgICAgICAgZnJhbWVDb3VudCA9IHNhbXBsZS0+c2l6ZSgpL251bUNoYW5uZWxzLwpAQCAtNjIzLDE2ICs2MzUsMTUgQEAKICAgICAgICAgLy8gd3JvbmcgYXVkaW8gYXVkaW8gYnVmZmVyIHNpemUgIChtQXVkaW9CdWZmZXJTaXplKQogICAgICAgICB1bnNpZ25lZCBsb25nIHRvZ2dsZSA9IG1Ub2dnbGUgXiAxOwogICAgICAgICB2b2lkICp1c2VyRGF0YSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXRoaXMgfCB0b2dnbGUpOwotICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IChudW1DaGFubmVscyA9PSAyKSA/Ci0gICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIDogQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobnVtQ2hhbm5lbHMpOwogCiAgICAgICAgIC8vIGRvIG5vdCBjcmVhdGUgYSBuZXcgYXVkaW8gdHJhY2sgaWYgY3VycmVudCB0cmFjayBpcyBjb21wYXRpYmxlIHdpdGggc2FtcGxlIHBhcmFtZXRlcnMKICNpZmRlZiBVU0VfU0hBUkVEX01FTV9CVUZGRVIKICAgICAgICAgbmV3VHJhY2sgPSBuZXcgQXVkaW9UcmFjayhzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBzYW1wbGUtPmZvcm1hdCgpLAotICAgICAgICAgICAgICAgIGNoYW5uZWxzLCBzYW1wbGUtPmdldElNZW1vcnkoKSwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCwgY2FsbGJhY2ssIHVzZXJEYXRhKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgc2FtcGxlLT5nZXRJTWVtb3J5KCksIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QsIGNhbGxiYWNrLCB1c2VyRGF0YSk7CiAjZWxzZQogICAgICAgICBuZXdUcmFjayA9IG5ldyBBdWRpb1RyYWNrKHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIHNhbXBsZS0+Zm9ybWF0KCksCi0gICAgICAgICAgICAgICAgY2hhbm5lbHMsIGZyYW1lQ291bnQsIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QsIGNhbGxiYWNrLCB1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCwgY2FsbGJhY2ssIHVzZXJEYXRhLAogICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lcyk7CiAjZW5kaWYKICAgICAgICAgb2xkVHJhY2sgPSBtQXVkaW9UcmFjazsKQEAgLTc1Myw3ICs3NjQsOCBAQAogICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGItPnNpemU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1lbWNweShxLCBwLCBjb3VudCk7Ci0vLyAgICAgICAgICAgICAgQUxPR1YoImZpbGw6IHE9JXAsIHA9JXAsIG1Qb3M9JXUsIGItPnNpemU9JXUsIGNvdW50PSVkIiwgcSwgcCwgbVBvcywgYi0+c2l6ZSwgY291bnQpOworLy8gICAgICAgICAgICAgIEFMT0dWKCJmaWxsOiBxPSVwLCBwPSVwLCBtUG9zPSV1LCBiLT5zaXplPSV1LCBjb3VudD0lZCIsIHEsIHAsIG1Qb3MsIGItPnNpemUsCisvLyAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Qb3MgPCBtQXVkaW9CdWZmZXJTaXplKSB7CiAgICAgICAgICAgICAgICAgY291bnQgPSBtQXVkaW9CdWZmZXJTaXplIC0gbVBvczsKICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBiLT5zaXplKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwCmluZGV4IGFkZWYzYmUuLjYxYjZkMzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwCkBAIC0xMDU3LDcgKzEwNTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIDAsICAgIC8vIG5vdGlmaWNhdGlvbkZyYW1lcwogICAgICAgICAgICAgICAgICAgICAgIDAsICAgIC8vIHNoYXJlZEJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRDYW5DYWxsSmF2YSwKLSAgICAgICAgICAgICAgICAgICAgICAwLCAgICAvLyBzZXNzaW9uSWQKKyAgICAgICAgICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0NBTExCQUNLKTsKIAogICAgIGlmIChtcEF1ZGlvVHJhY2stPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9hdXRvZGV0ZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL2F1dG9kZXRlY3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTVjM2IyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2F1dG9kZXRlY3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiYXV0b2RldGVjdC5oIgotCi1zdHJ1Y3QgQ2hhclJhbmdlIHsKLSAgICB1aW50MTZfdCBmaXJzdDsKLSAgICB1aW50MTZfdCBsYXN0OwotfTsKLQotI2RlZmluZSBBUlJBWV9TSVpFKHgpICAgKHNpemVvZih4KSAvIHNpemVvZigqeCkpCi0KLS8vIGdlbmVyYXRlZCBmcm9tIGh0dHA6Ly91bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDkzMi5UWFQKLXN0YXRpYyBjb25zdCBDaGFyUmFuZ2Uga1NoaWZ0SklTUmFuZ2VzW10gPSB7Ci0gICAgeyAweDgxNDAsIDB4ODE3RSB9LAotICAgIHsgMHg4MTgwLCAweDgxQUMgfSwKLSAgICB7IDB4ODFCOCwgMHg4MUJGIH0sCi0gICAgeyAweDgxQzgsIDB4ODFDRSB9LAotICAgIHsgMHg4MURBLCAweDgxRTggfSwKLSAgICB7IDB4ODFGMCwgMHg4MUY3IH0sCi0gICAgeyAweDgxRkMsIDB4ODFGQyB9LAotICAgIHsgMHg4MjRGLCAweDgyNTggfSwKLSAgICB7IDB4ODI2MCwgMHg4Mjc5IH0sCi0gICAgeyAweDgyODEsIDB4ODI5QSB9LAotICAgIHsgMHg4MjlGLCAweDgyRjEgfSwKLSAgICB7IDB4ODM0MCwgMHg4MzdFIH0sCi0gICAgeyAweDgzODAsIDB4ODM5NiB9LAotICAgIHsgMHg4MzlGLCAweDgzQjYgfSwKLSAgICB7IDB4ODNCRiwgMHg4M0Q2IH0sCi0gICAgeyAweDg0NDAsIDB4ODQ2MCB9LAotICAgIHsgMHg4NDcwLCAweDg0N0UgfSwKLSAgICB7IDB4ODQ4MCwgMHg4NDkxIH0sCi0gICAgeyAweDg0OUYsIDB4ODRCRSB9LAotICAgIHsgMHg4NzQwLCAweDg3NUQgfSwKLSAgICB7IDB4ODc1RiwgMHg4Nzc1IH0sCi0gICAgeyAweDg3N0UsIDB4ODc3RSB9LAotICAgIHsgMHg4NzgwLCAweDg3OUMgfSwKLSAgICB7IDB4ODg5RiwgMHg4OEZDIH0sCi0gICAgeyAweDg5NDAsIDB4ODk3RSB9LAotICAgIHsgMHg4OTgwLCAweDg5RkMgfSwKLSAgICB7IDB4OEE0MCwgMHg4QTdFIH0sCi0gICAgeyAweDhBODAsIDB4OEFGQyB9LAotICAgIHsgMHg4QjQwLCAweDhCN0UgfSwKLSAgICB7IDB4OEI4MCwgMHg4QkZDIH0sCi0gICAgeyAweDhDNDAsIDB4OEM3RSB9LAotICAgIHsgMHg4QzgwLCAweDhDRkMgfSwKLSAgICB7IDB4OEQ0MCwgMHg4RDdFIH0sCi0gICAgeyAweDhEODAsIDB4OERGQyB9LAotICAgIHsgMHg4RTQwLCAweDhFN0UgfSwKLSAgICB7IDB4OEU4MCwgMHg4RUZDIH0sCi0gICAgeyAweDhGNDAsIDB4OEY3RSB9LAotICAgIHsgMHg4RjgwLCAweDhGRkMgfSwKLSAgICB7IDB4OTA0MCwgMHg5MDdFIH0sCi0gICAgeyAweDkwODAsIDB4OTBGQyB9LAotICAgIHsgMHg5MTQwLCAweDkxN0UgfSwKLSAgICB7IDB4OTE4MCwgMHg5MUZDIH0sCi0gICAgeyAweDkyNDAsIDB4OTI3RSB9LAotICAgIHsgMHg5MjgwLCAweDkyRkMgfSwKLSAgICB7IDB4OTM0MCwgMHg5MzdFIH0sCi0gICAgeyAweDkzODAsIDB4OTNGQyB9LAotICAgIHsgMHg5NDQwLCAweDk0N0UgfSwKLSAgICB7IDB4OTQ4MCwgMHg5NEZDIH0sCi0gICAgeyAweDk1NDAsIDB4OTU3RSB9LAotICAgIHsgMHg5NTgwLCAweDk1RkMgfSwKLSAgICB7IDB4OTY0MCwgMHg5NjdFIH0sCi0gICAgeyAweDk2ODAsIDB4OTZGQyB9LAotICAgIHsgMHg5NzQwLCAweDk3N0UgfSwKLSAgICB7IDB4OTc4MCwgMHg5N0ZDIH0sCi0gICAgeyAweDk4NDAsIDB4OTg3MiB9LAotICAgIHsgMHg5ODlGLCAweDk4RkMgfSwKLSAgICB7IDB4OTk0MCwgMHg5OTdFIH0sCi0gICAgeyAweDk5ODAsIDB4OTlGQyB9LAotICAgIHsgMHg5QTQwLCAweDlBN0UgfSwKLSAgICB7IDB4OUE4MCwgMHg5QUZDIH0sCi0gICAgeyAweDlCNDAsIDB4OUI3RSB9LAotICAgIHsgMHg5QjgwLCAweDlCRkMgfSwKLSAgICB7IDB4OUM0MCwgMHg5QzdFIH0sCi0gICAgeyAweDlDODAsIDB4OUNGQyB9LAotICAgIHsgMHg5RDQwLCAweDlEN0UgfSwKLSAgICB7IDB4OUQ4MCwgMHg5REZDIH0sCi0gICAgeyAweDlFNDAsIDB4OUU3RSB9LAotICAgIHsgMHg5RTgwLCAweDlFRkMgfSwKLSAgICB7IDB4OUY0MCwgMHg5RjdFIH0sCi0gICAgeyAweDlGODAsIDB4OUZGQyB9LAotICAgIHsgMHhFMDQwLCAweEUwN0UgfSwKLSAgICB7IDB4RTA4MCwgMHhFMEZDIH0sCi0gICAgeyAweEUxNDAsIDB4RTE3RSB9LAotICAgIHsgMHhFMTgwLCAweEUxRkMgfSwKLSAgICB7IDB4RTI0MCwgMHhFMjdFIH0sCi0gICAgeyAweEUyODAsIDB4RTJGQyB9LAotICAgIHsgMHhFMzQwLCAweEUzN0UgfSwKLSAgICB7IDB4RTM4MCwgMHhFM0ZDIH0sCi0gICAgeyAweEU0NDAsIDB4RTQ3RSB9LAotICAgIHsgMHhFNDgwLCAweEU0RkMgfSwKLSAgICB7IDB4RTU0MCwgMHhFNTdFIH0sCi0gICAgeyAweEU1ODAsIDB4RTVGQyB9LAotICAgIHsgMHhFNjQwLCAweEU2N0UgfSwKLSAgICB7IDB4RTY4MCwgMHhFNkZDIH0sCi0gICAgeyAweEU3NDAsIDB4RTc3RSB9LAotICAgIHsgMHhFNzgwLCAweEU3RkMgfSwKLSAgICB7IDB4RTg0MCwgMHhFODdFIH0sCi0gICAgeyAweEU4ODAsIDB4RThGQyB9LAotICAgIHsgMHhFOTQwLCAweEU5N0UgfSwKLSAgICB7IDB4RTk4MCwgMHhFOUZDIH0sCi0gICAgeyAweEVBNDAsIDB4RUE3RSB9LAotICAgIHsgMHhFQTgwLCAweEVBQTQgfSwKLSAgICB7IDB4RUQ0MCwgMHhFRDdFIH0sCi0gICAgeyAweEVEODAsIDB4RURGQyB9LAotICAgIHsgMHhFRTQwLCAweEVFN0UgfSwKLSAgICB7IDB4RUU4MCwgMHhFRUVDIH0sCi0gICAgeyAweEVFRUYsIDB4RUVGQyB9LAotICAgIHsgMHhGQTQwLCAweEZBN0UgfSwKLSAgICB7IDB4RkE4MCwgMHhGQUZDIH0sCi0gICAgeyAweEZCNDAsIDB4RkI3RSB9LAotICAgIHsgMHhGQjgwLCAweEZCRkMgfSwKLSAgICB7IDB4RkM0MCwgMHhGQzRCIH0sCi19OwotCi0vLyBnZW5lcmF0ZWQgZnJvbSBodHRwOi8vdW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1A5MzYuVFhUCi1zdGF0aWMgY29uc3QgQ2hhclJhbmdlIGtHQktSYW5nZXNbXSA9IHsKLSAgICB7IDB4ODE0MCwgMHg4MTdFIH0sCi0gICAgeyAweDgxODAsIDB4ODFGRSB9LAotICAgIHsgMHg4MjQwLCAweDgyN0UgfSwKLSAgICB7IDB4ODI4MCwgMHg4MkZFIH0sCi0gICAgeyAweDgzNDAsIDB4ODM3RSB9LAotICAgIHsgMHg4MzgwLCAweDgzRkUgfSwKLSAgICB7IDB4ODQ0MCwgMHg4NDdFIH0sCi0gICAgeyAweDg0ODAsIDB4ODRGRSB9LAotICAgIHsgMHg4NTQwLCAweDg1N0UgfSwKLSAgICB7IDB4ODU4MCwgMHg4NUZFIH0sCi0gICAgeyAweDg2NDAsIDB4ODY3RSB9LAotICAgIHsgMHg4NjgwLCAweDg2RkUgfSwKLSAgICB7IDB4ODc0MCwgMHg4NzdFIH0sCi0gICAgeyAweDg3ODAsIDB4ODdGRSB9LAotICAgIHsgMHg4ODQwLCAweDg4N0UgfSwKLSAgICB7IDB4ODg4MCwgMHg4OEZFIH0sCi0gICAgeyAweDg5NDAsIDB4ODk3RSB9LAotICAgIHsgMHg4OTgwLCAweDg5RkUgfSwKLSAgICB7IDB4OEE0MCwgMHg4QTdFIH0sCi0gICAgeyAweDhBODAsIDB4OEFGRSB9LAotICAgIHsgMHg4QjQwLCAweDhCN0UgfSwKLSAgICB7IDB4OEI4MCwgMHg4QkZFIH0sCi0gICAgeyAweDhDNDAsIDB4OEM3RSB9LAotICAgIHsgMHg4QzgwLCAweDhDRkUgfSwKLSAgICB7IDB4OEQ0MCwgMHg4RDdFIH0sCi0gICAgeyAweDhEODAsIDB4OERGRSB9LAotICAgIHsgMHg4RTQwLCAweDhFN0UgfSwKLSAgICB7IDB4OEU4MCwgMHg4RUZFIH0sCi0gICAgeyAweDhGNDAsIDB4OEY3RSB9LAotICAgIHsgMHg4RjgwLCAweDhGRkUgfSwKLSAgICB7IDB4OTA0MCwgMHg5MDdFIH0sCi0gICAgeyAweDkwODAsIDB4OTBGRSB9LAotICAgIHsgMHg5MTQwLCAweDkxN0UgfSwKLSAgICB7IDB4OTE4MCwgMHg5MUZFIH0sCi0gICAgeyAweDkyNDAsIDB4OTI3RSB9LAotICAgIHsgMHg5MjgwLCAweDkyRkUgfSwKLSAgICB7IDB4OTM0MCwgMHg5MzdFIH0sCi0gICAgeyAweDkzODAsIDB4OTNGRSB9LAotICAgIHsgMHg5NDQwLCAweDk0N0UgfSwKLSAgICB7IDB4OTQ4MCwgMHg5NEZFIH0sCi0gICAgeyAweDk1NDAsIDB4OTU3RSB9LAotICAgIHsgMHg5NTgwLCAweDk1RkUgfSwKLSAgICB7IDB4OTY0MCwgMHg5NjdFIH0sCi0gICAgeyAweDk2ODAsIDB4OTZGRSB9LAotICAgIHsgMHg5NzQwLCAweDk3N0UgfSwKLSAgICB7IDB4OTc4MCwgMHg5N0ZFIH0sCi0gICAgeyAweDk4NDAsIDB4OTg3RSB9LAotICAgIHsgMHg5ODgwLCAweDk4RkUgfSwKLSAgICB7IDB4OTk0MCwgMHg5OTdFIH0sCi0gICAgeyAweDk5ODAsIDB4OTlGRSB9LAotICAgIHsgMHg5QTQwLCAweDlBN0UgfSwKLSAgICB7IDB4OUE4MCwgMHg5QUZFIH0sCi0gICAgeyAweDlCNDAsIDB4OUI3RSB9LAotICAgIHsgMHg5QjgwLCAweDlCRkUgfSwKLSAgICB7IDB4OUM0MCwgMHg5QzdFIH0sCi0gICAgeyAweDlDODAsIDB4OUNGRSB9LAotICAgIHsgMHg5RDQwLCAweDlEN0UgfSwKLSAgICB7IDB4OUQ4MCwgMHg5REZFIH0sCi0gICAgeyAweDlFNDAsIDB4OUU3RSB9LAotICAgIHsgMHg5RTgwLCAweDlFRkUgfSwKLSAgICB7IDB4OUY0MCwgMHg5RjdFIH0sCi0gICAgeyAweDlGODAsIDB4OUZGRSB9LAotICAgIHsgMHhBMDQwLCAweEEwN0UgfSwKLSAgICB7IDB4QTA4MCwgMHhBMEZFIH0sCi0gICAgeyAweEExQTEsIDB4QTFGRSB9LAotICAgIHsgMHhBMkExLCAweEEyQUEgfSwKLSAgICB7IDB4QTJCMSwgMHhBMkUyIH0sCi0gICAgeyAweEEyRTUsIDB4QTJFRSB9LAotICAgIHsgMHhBMkYxLCAweEEyRkMgfSwKLSAgICB7IDB4QTNBMSwgMHhBM0ZFIH0sCi0gICAgeyAweEE0QTEsIDB4QTRGMyB9LAotICAgIHsgMHhBNUExLCAweEE1RjYgfSwKLSAgICB7IDB4QTZBMSwgMHhBNkI4IH0sCi0gICAgeyAweEE2QzEsIDB4QTZEOCB9LAotICAgIHsgMHhBNkUwLCAweEE2RUIgfSwKLSAgICB7IDB4QTZFRSwgMHhBNkYyIH0sCi0gICAgeyAweEE2RjQsIDB4QTZGNSB9LAotICAgIHsgMHhBN0ExLCAweEE3QzEgfSwKLSAgICB7IDB4QTdEMSwgMHhBN0YxIH0sCi0gICAgeyAweEE4NDAsIDB4QTg3RSB9LAotICAgIHsgMHhBODgwLCAweEE4OTUgfSwKLSAgICB7IDB4QThBMSwgMHhBOEJCIH0sCi0gICAgeyAweEE4QkQsIDB4QThCRSB9LAotICAgIHsgMHhBOEMwLCAweEE4QzAgfSwKLSAgICB7IDB4QThDNSwgMHhBOEU5IH0sCi0gICAgeyAweEE5NDAsIDB4QTk1NyB9LAotICAgIHsgMHhBOTU5LCAweEE5NUEgfSwKLSAgICB7IDB4QTk1QywgMHhBOTVDIH0sCi0gICAgeyAweEE5NjAsIDB4QTk3RSB9LAotICAgIHsgMHhBOTgwLCAweEE5ODggfSwKLSAgICB7IDB4QTk5NiwgMHhBOTk2IH0sCi0gICAgeyAweEE5QTQsIDB4QTlFRiB9LAotICAgIHsgMHhBQTQwLCAweEFBN0UgfSwKLSAgICB7IDB4QUE4MCwgMHhBQUEwIH0sCi0gICAgeyAweEFCNDAsIDB4QUI3RSB9LAotICAgIHsgMHhBQjgwLCAweEFCQTAgfSwKLSAgICB7IDB4QUM0MCwgMHhBQzdFIH0sCi0gICAgeyAweEFDODAsIDB4QUNBMCB9LAotICAgIHsgMHhBRDQwLCAweEFEN0UgfSwKLSAgICB7IDB4QUQ4MCwgMHhBREEwIH0sCi0gICAgeyAweEFFNDAsIDB4QUU3RSB9LAotICAgIHsgMHhBRTgwLCAweEFFQTAgfSwKLSAgICB7IDB4QUY0MCwgMHhBRjdFIH0sCi0gICAgeyAweEFGODAsIDB4QUZBMCB9LAotICAgIHsgMHhCMDQwLCAweEIwN0UgfSwKLSAgICB7IDB4QjA4MCwgMHhCMEZFIH0sCi0gICAgeyAweEIxNDAsIDB4QjE3RSB9LAotICAgIHsgMHhCMTgwLCAweEIxRkUgfSwKLSAgICB7IDB4QjI0MCwgMHhCMjdFIH0sCi0gICAgeyAweEIyODAsIDB4QjJGRSB9LAotICAgIHsgMHhCMzQwLCAweEIzN0UgfSwKLSAgICB7IDB4QjM4MCwgMHhCM0ZFIH0sCi0gICAgeyAweEI0NDAsIDB4QjQ3RSB9LAotICAgIHsgMHhCNDgwLCAweEI0RkUgfSwKLSAgICB7IDB4QjU0MCwgMHhCNTdFIH0sCi0gICAgeyAweEI1ODAsIDB4QjVGRSB9LAotICAgIHsgMHhCNjQwLCAweEI2N0UgfSwKLSAgICB7IDB4QjY4MCwgMHhCNkZFIH0sCi0gICAgeyAweEI3NDAsIDB4Qjc3RSB9LAotICAgIHsgMHhCNzgwLCAweEI3RkUgfSwKLSAgICB7IDB4Qjg0MCwgMHhCODdFIH0sCi0gICAgeyAweEI4ODAsIDB4QjhGRSB9LAotICAgIHsgMHhCOTQwLCAweEI5N0UgfSwKLSAgICB7IDB4Qjk4MCwgMHhCOUZFIH0sCi0gICAgeyAweEJBNDAsIDB4QkE3RSB9LAotICAgIHsgMHhCQTgwLCAweEJBRkUgfSwKLSAgICB7IDB4QkI0MCwgMHhCQjdFIH0sCi0gICAgeyAweEJCODAsIDB4QkJGRSB9LAotICAgIHsgMHhCQzQwLCAweEJDN0UgfSwKLSAgICB7IDB4QkM4MCwgMHhCQ0ZFIH0sCi0gICAgeyAweEJENDAsIDB4QkQ3RSB9LAotICAgIHsgMHhCRDgwLCAweEJERkUgfSwKLSAgICB7IDB4QkU0MCwgMHhCRTdFIH0sCi0gICAgeyAweEJFODAsIDB4QkVGRSB9LAotICAgIHsgMHhCRjQwLCAweEJGN0UgfSwKLSAgICB7IDB4QkY4MCwgMHhCRkZFIH0sCi0gICAgeyAweEMwNDAsIDB4QzA3RSB9LAotICAgIHsgMHhDMDgwLCAweEMwRkUgfSwKLSAgICB7IDB4QzE0MCwgMHhDMTdFIH0sCi0gICAgeyAweEMxODAsIDB4QzFGRSB9LAotICAgIHsgMHhDMjQwLCAweEMyN0UgfSwKLSAgICB7IDB4QzI4MCwgMHhDMkZFIH0sCi0gICAgeyAweEMzNDAsIDB4QzM3RSB9LAotICAgIHsgMHhDMzgwLCAweEMzRkUgfSwKLSAgICB7IDB4QzQ0MCwgMHhDNDdFIH0sCi0gICAgeyAweEM0ODAsIDB4QzRGRSB9LAotICAgIHsgMHhDNTQwLCAweEM1N0UgfSwKLSAgICB7IDB4QzU4MCwgMHhDNUZFIH0sCi0gICAgeyAweEM2NDAsIDB4QzY3RSB9LAotICAgIHsgMHhDNjgwLCAweEM2RkUgfSwKLSAgICB7IDB4Qzc0MCwgMHhDNzdFIH0sCi0gICAgeyAweEM3ODAsIDB4QzdGRSB9LAotICAgIHsgMHhDODQwLCAweEM4N0UgfSwKLSAgICB7IDB4Qzg4MCwgMHhDOEZFIH0sCi0gICAgeyAweEM5NDAsIDB4Qzk3RSB9LAotICAgIHsgMHhDOTgwLCAweEM5RkUgfSwKLSAgICB7IDB4Q0E0MCwgMHhDQTdFIH0sCi0gICAgeyAweENBODAsIDB4Q0FGRSB9LAotICAgIHsgMHhDQjQwLCAweENCN0UgfSwKLSAgICB7IDB4Q0I4MCwgMHhDQkZFIH0sCi0gICAgeyAweENDNDAsIDB4Q0M3RSB9LAotICAgIHsgMHhDQzgwLCAweENDRkUgfSwKLSAgICB7IDB4Q0Q0MCwgMHhDRDdFIH0sCi0gICAgeyAweENEODAsIDB4Q0RGRSB9LAotICAgIHsgMHhDRTQwLCAweENFN0UgfSwKLSAgICB7IDB4Q0U4MCwgMHhDRUZFIH0sCi0gICAgeyAweENGNDAsIDB4Q0Y3RSB9LAotICAgIHsgMHhDRjgwLCAweENGRkUgfSwKLSAgICB7IDB4RDA0MCwgMHhEMDdFIH0sCi0gICAgeyAweEQwODAsIDB4RDBGRSB9LAotICAgIHsgMHhEMTQwLCAweEQxN0UgfSwKLSAgICB7IDB4RDE4MCwgMHhEMUZFIH0sCi0gICAgeyAweEQyNDAsIDB4RDI3RSB9LAotICAgIHsgMHhEMjgwLCAweEQyRkUgfSwKLSAgICB7IDB4RDM0MCwgMHhEMzdFIH0sCi0gICAgeyAweEQzODAsIDB4RDNGRSB9LAotICAgIHsgMHhENDQwLCAweEQ0N0UgfSwKLSAgICB7IDB4RDQ4MCwgMHhENEZFIH0sCi0gICAgeyAweEQ1NDAsIDB4RDU3RSB9LAotICAgIHsgMHhENTgwLCAweEQ1RkUgfSwKLSAgICB7IDB4RDY0MCwgMHhENjdFIH0sCi0gICAgeyAweEQ2ODAsIDB4RDZGRSB9LAotICAgIHsgMHhENzQwLCAweEQ3N0UgfSwKLSAgICB7IDB4RDc4MCwgMHhEN0Y5IH0sCi0gICAgeyAweEQ4NDAsIDB4RDg3RSB9LAotICAgIHsgMHhEODgwLCAweEQ4RkUgfSwKLSAgICB7IDB4RDk0MCwgMHhEOTdFIH0sCi0gICAgeyAweEQ5ODAsIDB4RDlGRSB9LAotICAgIHsgMHhEQTQwLCAweERBN0UgfSwKLSAgICB7IDB4REE4MCwgMHhEQUZFIH0sCi0gICAgeyAweERCNDAsIDB4REI3RSB9LAotICAgIHsgMHhEQjgwLCAweERCRkUgfSwKLSAgICB7IDB4REM0MCwgMHhEQzdFIH0sCi0gICAgeyAweERDODAsIDB4RENGRSB9LAotICAgIHsgMHhERDQwLCAweEREN0UgfSwKLSAgICB7IDB4REQ4MCwgMHhEREZFIH0sCi0gICAgeyAweERFNDAsIDB4REU3RSB9LAotICAgIHsgMHhERTgwLCAweERFRkUgfSwKLSAgICB7IDB4REY0MCwgMHhERjdFIH0sCi0gICAgeyAweERGODAsIDB4REZGRSB9LAotICAgIHsgMHhFMDQwLCAweEUwN0UgfSwKLSAgICB7IDB4RTA4MCwgMHhFMEZFIH0sCi0gICAgeyAweEUxNDAsIDB4RTE3RSB9LAotICAgIHsgMHhFMTgwLCAweEUxRkUgfSwKLSAgICB7IDB4RTI0MCwgMHhFMjdFIH0sCi0gICAgeyAweEUyODAsIDB4RTJGRSB9LAotICAgIHsgMHhFMzQwLCAweEUzN0UgfSwKLSAgICB7IDB4RTM4MCwgMHhFM0ZFIH0sCi0gICAgeyAweEU0NDAsIDB4RTQ3RSB9LAotICAgIHsgMHhFNDgwLCAweEU0RkUgfSwKLSAgICB7IDB4RTU0MCwgMHhFNTdFIH0sCi0gICAgeyAweEU1ODAsIDB4RTVGRSB9LAotICAgIHsgMHhFNjQwLCAweEU2N0UgfSwKLSAgICB7IDB4RTY4MCwgMHhFNkZFIH0sCi0gICAgeyAweEU3NDAsIDB4RTc3RSB9LAotICAgIHsgMHhFNzgwLCAweEU3RkUgfSwKLSAgICB7IDB4RTg0MCwgMHhFODdFIH0sCi0gICAgeyAweEU4ODAsIDB4RThGRSB9LAotICAgIHsgMHhFOTQwLCAweEU5N0UgfSwKLSAgICB7IDB4RTk4MCwgMHhFOUZFIH0sCi0gICAgeyAweEVBNDAsIDB4RUE3RSB9LAotICAgIHsgMHhFQTgwLCAweEVBRkUgfSwKLSAgICB7IDB4RUI0MCwgMHhFQjdFIH0sCi0gICAgeyAweEVCODAsIDB4RUJGRSB9LAotICAgIHsgMHhFQzQwLCAweEVDN0UgfSwKLSAgICB7IDB4RUM4MCwgMHhFQ0ZFIH0sCi0gICAgeyAweEVENDAsIDB4RUQ3RSB9LAotICAgIHsgMHhFRDgwLCAweEVERkUgfSwKLSAgICB7IDB4RUU0MCwgMHhFRTdFIH0sCi0gICAgeyAweEVFODAsIDB4RUVGRSB9LAotICAgIHsgMHhFRjQwLCAweEVGN0UgfSwKLSAgICB7IDB4RUY4MCwgMHhFRkZFIH0sCi0gICAgeyAweEYwNDAsIDB4RjA3RSB9LAotICAgIHsgMHhGMDgwLCAweEYwRkUgfSwKLSAgICB7IDB4RjE0MCwgMHhGMTdFIH0sCi0gICAgeyAweEYxODAsIDB4RjFGRSB9LAotICAgIHsgMHhGMjQwLCAweEYyN0UgfSwKLSAgICB7IDB4RjI4MCwgMHhGMkZFIH0sCi0gICAgeyAweEYzNDAsIDB4RjM3RSB9LAotICAgIHsgMHhGMzgwLCAweEYzRkUgfSwKLSAgICB7IDB4RjQ0MCwgMHhGNDdFIH0sCi0gICAgeyAweEY0ODAsIDB4RjRGRSB9LAotICAgIHsgMHhGNTQwLCAweEY1N0UgfSwKLSAgICB7IDB4RjU4MCwgMHhGNUZFIH0sCi0gICAgeyAweEY2NDAsIDB4RjY3RSB9LAotICAgIHsgMHhGNjgwLCAweEY2RkUgfSwKLSAgICB7IDB4Rjc0MCwgMHhGNzdFIH0sCi0gICAgeyAweEY3ODAsIDB4RjdGRSB9LAotICAgIHsgMHhGODQwLCAweEY4N0UgfSwKLSAgICB7IDB4Rjg4MCwgMHhGOEEwIH0sCi0gICAgeyAweEY5NDAsIDB4Rjk3RSB9LAotICAgIHsgMHhGOTgwLCAweEY5QTAgfSwKLSAgICB7IDB4RkE0MCwgMHhGQTdFIH0sCi0gICAgeyAweEZBODAsIDB4RkFBMCB9LAotICAgIHsgMHhGQjQwLCAweEZCN0UgfSwKLSAgICB7IDB4RkI4MCwgMHhGQkEwIH0sCi0gICAgeyAweEZDNDAsIDB4RkM3RSB9LAotICAgIHsgMHhGQzgwLCAweEZDQTAgfSwKLSAgICB7IDB4RkQ0MCwgMHhGRDdFIH0sCi0gICAgeyAweEZEODAsIDB4RkRBMCB9LAotICAgIHsgMHhGRTQwLCAweEZFNEYgfSwKLX07Ci0KLS8vIGdlbmVyYXRlZCBmcm9tIGh0dHA6Ly91bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDk0OS5UWFQKLXN0YXRpYyBjb25zdCBDaGFyUmFuZ2Uga0VVQ0tSUmFuZ2VzW10gPSB7Ci0gICAgeyAweDgxNDEsIDB4ODE1QSB9LAotICAgIHsgMHg4MTYxLCAweDgxN0EgfSwKLSAgICB7IDB4ODE4MSwgMHg4MUZFIH0sCi0gICAgeyAweDgyNDEsIDB4ODI1QSB9LAotICAgIHsgMHg4MjYxLCAweDgyN0EgfSwKLSAgICB7IDB4ODI4MSwgMHg4MkZFIH0sCi0gICAgeyAweDgzNDEsIDB4ODM1QSB9LAotICAgIHsgMHg4MzYxLCAweDgzN0EgfSwKLSAgICB7IDB4ODM4MSwgMHg4M0ZFIH0sCi0gICAgeyAweDg0NDEsIDB4ODQ1QSB9LAotICAgIHsgMHg4NDYxLCAweDg0N0EgfSwKLSAgICB7IDB4ODQ4MSwgMHg4NEZFIH0sCi0gICAgeyAweDg1NDEsIDB4ODU1QSB9LAotICAgIHsgMHg4NTYxLCAweDg1N0EgfSwKLSAgICB7IDB4ODU4MSwgMHg4NUZFIH0sCi0gICAgeyAweDg2NDEsIDB4ODY1QSB9LAotICAgIHsgMHg4NjYxLCAweDg2N0EgfSwKLSAgICB7IDB4ODY4MSwgMHg4NkZFIH0sCi0gICAgeyAweDg3NDEsIDB4ODc1QSB9LAotICAgIHsgMHg4NzYxLCAweDg3N0EgfSwKLSAgICB7IDB4ODc4MSwgMHg4N0ZFIH0sCi0gICAgeyAweDg4NDEsIDB4ODg1QSB9LAotICAgIHsgMHg4ODYxLCAweDg4N0EgfSwKLSAgICB7IDB4ODg4MSwgMHg4OEZFIH0sCi0gICAgeyAweDg5NDEsIDB4ODk1QSB9LAotICAgIHsgMHg4OTYxLCAweDg5N0EgfSwKLSAgICB7IDB4ODk4MSwgMHg4OUZFIH0sCi0gICAgeyAweDhBNDEsIDB4OEE1QSB9LAotICAgIHsgMHg4QTYxLCAweDhBN0EgfSwKLSAgICB7IDB4OEE4MSwgMHg4QUZFIH0sCi0gICAgeyAweDhCNDEsIDB4OEI1QSB9LAotICAgIHsgMHg4QjYxLCAweDhCN0EgfSwKLSAgICB7IDB4OEI4MSwgMHg4QkZFIH0sCi0gICAgeyAweDhDNDEsIDB4OEM1QSB9LAotICAgIHsgMHg4QzYxLCAweDhDN0EgfSwKLSAgICB7IDB4OEM4MSwgMHg4Q0ZFIH0sCi0gICAgeyAweDhENDEsIDB4OEQ1QSB9LAotICAgIHsgMHg4RDYxLCAweDhEN0EgfSwKLSAgICB7IDB4OEQ4MSwgMHg4REZFIH0sCi0gICAgeyAweDhFNDEsIDB4OEU1QSB9LAotICAgIHsgMHg4RTYxLCAweDhFN0EgfSwKLSAgICB7IDB4OEU4MSwgMHg4RUZFIH0sCi0gICAgeyAweDhGNDEsIDB4OEY1QSB9LAotICAgIHsgMHg4RjYxLCAweDhGN0EgfSwKLSAgICB7IDB4OEY4MSwgMHg4RkZFIH0sCi0gICAgeyAweDkwNDEsIDB4OTA1QSB9LAotICAgIHsgMHg5MDYxLCAweDkwN0EgfSwKLSAgICB7IDB4OTA4MSwgMHg5MEZFIH0sCi0gICAgeyAweDkxNDEsIDB4OTE1QSB9LAotICAgIHsgMHg5MTYxLCAweDkxN0EgfSwKLSAgICB7IDB4OTE4MSwgMHg5MUZFIH0sCi0gICAgeyAweDkyNDEsIDB4OTI1QSB9LAotICAgIHsgMHg5MjYxLCAweDkyN0EgfSwKLSAgICB7IDB4OTI4MSwgMHg5MkZFIH0sCi0gICAgeyAweDkzNDEsIDB4OTM1QSB9LAotICAgIHsgMHg5MzYxLCAweDkzN0EgfSwKLSAgICB7IDB4OTM4MSwgMHg5M0ZFIH0sCi0gICAgeyAweDk0NDEsIDB4OTQ1QSB9LAotICAgIHsgMHg5NDYxLCAweDk0N0EgfSwKLSAgICB7IDB4OTQ4MSwgMHg5NEZFIH0sCi0gICAgeyAweDk1NDEsIDB4OTU1QSB9LAotICAgIHsgMHg5NTYxLCAweDk1N0EgfSwKLSAgICB7IDB4OTU4MSwgMHg5NUZFIH0sCi0gICAgeyAweDk2NDEsIDB4OTY1QSB9LAotICAgIHsgMHg5NjYxLCAweDk2N0EgfSwKLSAgICB7IDB4OTY4MSwgMHg5NkZFIH0sCi0gICAgeyAweDk3NDEsIDB4OTc1QSB9LAotICAgIHsgMHg5NzYxLCAweDk3N0EgfSwKLSAgICB7IDB4OTc4MSwgMHg5N0ZFIH0sCi0gICAgeyAweDk4NDEsIDB4OTg1QSB9LAotICAgIHsgMHg5ODYxLCAweDk4N0EgfSwKLSAgICB7IDB4OTg4MSwgMHg5OEZFIH0sCi0gICAgeyAweDk5NDEsIDB4OTk1QSB9LAotICAgIHsgMHg5OTYxLCAweDk5N0EgfSwKLSAgICB7IDB4OTk4MSwgMHg5OUZFIH0sCi0gICAgeyAweDlBNDEsIDB4OUE1QSB9LAotICAgIHsgMHg5QTYxLCAweDlBN0EgfSwKLSAgICB7IDB4OUE4MSwgMHg5QUZFIH0sCi0gICAgeyAweDlCNDEsIDB4OUI1QSB9LAotICAgIHsgMHg5QjYxLCAweDlCN0EgfSwKLSAgICB7IDB4OUI4MSwgMHg5QkZFIH0sCi0gICAgeyAweDlDNDEsIDB4OUM1QSB9LAotICAgIHsgMHg5QzYxLCAweDlDN0EgfSwKLSAgICB7IDB4OUM4MSwgMHg5Q0ZFIH0sCi0gICAgeyAweDlENDEsIDB4OUQ1QSB9LAotICAgIHsgMHg5RDYxLCAweDlEN0EgfSwKLSAgICB7IDB4OUQ4MSwgMHg5REZFIH0sCi0gICAgeyAweDlFNDEsIDB4OUU1QSB9LAotICAgIHsgMHg5RTYxLCAweDlFN0EgfSwKLSAgICB7IDB4OUU4MSwgMHg5RUZFIH0sCi0gICAgeyAweDlGNDEsIDB4OUY1QSB9LAotICAgIHsgMHg5RjYxLCAweDlGN0EgfSwKLSAgICB7IDB4OUY4MSwgMHg5RkZFIH0sCi0gICAgeyAweEEwNDEsIDB4QTA1QSB9LAotICAgIHsgMHhBMDYxLCAweEEwN0EgfSwKLSAgICB7IDB4QTA4MSwgMHhBMEZFIH0sCi0gICAgeyAweEExNDEsIDB4QTE1QSB9LAotICAgIHsgMHhBMTYxLCAweEExN0EgfSwKLSAgICB7IDB4QTE4MSwgMHhBMUZFIH0sCi0gICAgeyAweEEyNDEsIDB4QTI1QSB9LAotICAgIHsgMHhBMjYxLCAweEEyN0EgfSwKLSAgICB7IDB4QTI4MSwgMHhBMkU3IH0sCi0gICAgeyAweEEzNDEsIDB4QTM1QSB9LAotICAgIHsgMHhBMzYxLCAweEEzN0EgfSwKLSAgICB7IDB4QTM4MSwgMHhBM0ZFIH0sCi0gICAgeyAweEE0NDEsIDB4QTQ1QSB9LAotICAgIHsgMHhBNDYxLCAweEE0N0EgfSwKLSAgICB7IDB4QTQ4MSwgMHhBNEZFIH0sCi0gICAgeyAweEE1NDEsIDB4QTU1QSB9LAotICAgIHsgMHhBNTYxLCAweEE1N0EgfSwKLSAgICB7IDB4QTU4MSwgMHhBNUFBIH0sCi0gICAgeyAweEE1QjAsIDB4QTVCOSB9LAotICAgIHsgMHhBNUMxLCAweEE1RDggfSwKLSAgICB7IDB4QTVFMSwgMHhBNUY4IH0sCi0gICAgeyAweEE2NDEsIDB4QTY1QSB9LAotICAgIHsgMHhBNjYxLCAweEE2N0EgfSwKLSAgICB7IDB4QTY4MSwgMHhBNkU0IH0sCi0gICAgeyAweEE3NDEsIDB4QTc1QSB9LAotICAgIHsgMHhBNzYxLCAweEE3N0EgfSwKLSAgICB7IDB4QTc4MSwgMHhBN0VGIH0sCi0gICAgeyAweEE4NDEsIDB4QTg1QSB9LAotICAgIHsgMHhBODYxLCAweEE4N0EgfSwKLSAgICB7IDB4QTg4MSwgMHhBOEE0IH0sCi0gICAgeyAweEE4QTYsIDB4QThBNiB9LAotICAgIHsgMHhBOEE4LCAweEE4QUYgfSwKLSAgICB7IDB4QThCMSwgMHhBOEZFIH0sCi0gICAgeyAweEE5NDEsIDB4QTk1QSB9LAotICAgIHsgMHhBOTYxLCAweEE5N0EgfSwKLSAgICB7IDB4QTk4MSwgMHhBOUZFIH0sCi0gICAgeyAweEFBNDEsIDB4QUE1QSB9LAotICAgIHsgMHhBQTYxLCAweEFBN0EgfSwKLSAgICB7IDB4QUE4MSwgMHhBQUYzIH0sCi0gICAgeyAweEFCNDEsIDB4QUI1QSB9LAotICAgIHsgMHhBQjYxLCAweEFCN0EgfSwKLSAgICB7IDB4QUI4MSwgMHhBQkY2IH0sCi0gICAgeyAweEFDNDEsIDB4QUM1QSB9LAotICAgIHsgMHhBQzYxLCAweEFDN0EgfSwKLSAgICB7IDB4QUM4MSwgMHhBQ0MxIH0sCi0gICAgeyAweEFDRDEsIDB4QUNGMSB9LAotICAgIHsgMHhBRDQxLCAweEFENUEgfSwKLSAgICB7IDB4QUQ2MSwgMHhBRDdBIH0sCi0gICAgeyAweEFEODEsIDB4QURBMCB9LAotICAgIHsgMHhBRTQxLCAweEFFNUEgfSwKLSAgICB7IDB4QUU2MSwgMHhBRTdBIH0sCi0gICAgeyAweEFFODEsIDB4QUVBMCB9LAotICAgIHsgMHhBRjQxLCAweEFGNUEgfSwKLSAgICB7IDB4QUY2MSwgMHhBRjdBIH0sCi0gICAgeyAweEFGODEsIDB4QUZBMCB9LAotICAgIHsgMHhCMDQxLCAweEIwNUEgfSwKLSAgICB7IDB4QjA2MSwgMHhCMDdBIH0sCi0gICAgeyAweEIwODEsIDB4QjBGRSB9LAotICAgIHsgMHhCMTQxLCAweEIxNUEgfSwKLSAgICB7IDB4QjE2MSwgMHhCMTdBIH0sCi0gICAgeyAweEIxODEsIDB4QjFGRSB9LAotICAgIHsgMHhCMjQxLCAweEIyNUEgfSwKLSAgICB7IDB4QjI2MSwgMHhCMjdBIH0sCi0gICAgeyAweEIyODEsIDB4QjJGRSB9LAotICAgIHsgMHhCMzQxLCAweEIzNUEgfSwKLSAgICB7IDB4QjM2MSwgMHhCMzdBIH0sCi0gICAgeyAweEIzODEsIDB4QjNGRSB9LAotICAgIHsgMHhCNDQxLCAweEI0NUEgfSwKLSAgICB7IDB4QjQ2MSwgMHhCNDdBIH0sCi0gICAgeyAweEI0ODEsIDB4QjRGRSB9LAotICAgIHsgMHhCNTQxLCAweEI1NUEgfSwKLSAgICB7IDB4QjU2MSwgMHhCNTdBIH0sCi0gICAgeyAweEI1ODEsIDB4QjVGRSB9LAotICAgIHsgMHhCNjQxLCAweEI2NUEgfSwKLSAgICB7IDB4QjY2MSwgMHhCNjdBIH0sCi0gICAgeyAweEI2ODEsIDB4QjZGRSB9LAotICAgIHsgMHhCNzQxLCAweEI3NUEgfSwKLSAgICB7IDB4Qjc2MSwgMHhCNzdBIH0sCi0gICAgeyAweEI3ODEsIDB4QjdGRSB9LAotICAgIHsgMHhCODQxLCAweEI4NUEgfSwKLSAgICB7IDB4Qjg2MSwgMHhCODdBIH0sCi0gICAgeyAweEI4ODEsIDB4QjhGRSB9LAotICAgIHsgMHhCOTQxLCAweEI5NUEgfSwKLSAgICB7IDB4Qjk2MSwgMHhCOTdBIH0sCi0gICAgeyAweEI5ODEsIDB4QjlGRSB9LAotICAgIHsgMHhCQTQxLCAweEJBNUEgfSwKLSAgICB7IDB4QkE2MSwgMHhCQTdBIH0sCi0gICAgeyAweEJBODEsIDB4QkFGRSB9LAotICAgIHsgMHhCQjQxLCAweEJCNUEgfSwKLSAgICB7IDB4QkI2MSwgMHhCQjdBIH0sCi0gICAgeyAweEJCODEsIDB4QkJGRSB9LAotICAgIHsgMHhCQzQxLCAweEJDNUEgfSwKLSAgICB7IDB4QkM2MSwgMHhCQzdBIH0sCi0gICAgeyAweEJDODEsIDB4QkNGRSB9LAotICAgIHsgMHhCRDQxLCAweEJENUEgfSwKLSAgICB7IDB4QkQ2MSwgMHhCRDdBIH0sCi0gICAgeyAweEJEODEsIDB4QkRGRSB9LAotICAgIHsgMHhCRTQxLCAweEJFNUEgfSwKLSAgICB7IDB4QkU2MSwgMHhCRTdBIH0sCi0gICAgeyAweEJFODEsIDB4QkVGRSB9LAotICAgIHsgMHhCRjQxLCAweEJGNUEgfSwKLSAgICB7IDB4QkY2MSwgMHhCRjdBIH0sCi0gICAgeyAweEJGODEsIDB4QkZGRSB9LAotICAgIHsgMHhDMDQxLCAweEMwNUEgfSwKLSAgICB7IDB4QzA2MSwgMHhDMDdBIH0sCi0gICAgeyAweEMwODEsIDB4QzBGRSB9LAotICAgIHsgMHhDMTQxLCAweEMxNUEgfSwKLSAgICB7IDB4QzE2MSwgMHhDMTdBIH0sCi0gICAgeyAweEMxODEsIDB4QzFGRSB9LAotICAgIHsgMHhDMjQxLCAweEMyNUEgfSwKLSAgICB7IDB4QzI2MSwgMHhDMjdBIH0sCi0gICAgeyAweEMyODEsIDB4QzJGRSB9LAotICAgIHsgMHhDMzQxLCAweEMzNUEgfSwKLSAgICB7IDB4QzM2MSwgMHhDMzdBIH0sCi0gICAgeyAweEMzODEsIDB4QzNGRSB9LAotICAgIHsgMHhDNDQxLCAweEM0NUEgfSwKLSAgICB7IDB4QzQ2MSwgMHhDNDdBIH0sCi0gICAgeyAweEM0ODEsIDB4QzRGRSB9LAotICAgIHsgMHhDNTQxLCAweEM1NUEgfSwKLSAgICB7IDB4QzU2MSwgMHhDNTdBIH0sCi0gICAgeyAweEM1ODEsIDB4QzVGRSB9LAotICAgIHsgMHhDNjQxLCAweEM2NTIgfSwKLSAgICB7IDB4QzZBMSwgMHhDNkZFIH0sCi0gICAgeyAweEM3QTEsIDB4QzdGRSB9LAotICAgIHsgMHhDOEExLCAweEM4RkUgfSwKLSAgICB7IDB4Q0FBMSwgMHhDQUZFIH0sCi0gICAgeyAweENCQTEsIDB4Q0JGRSB9LAotICAgIHsgMHhDQ0ExLCAweENDRkUgfSwKLSAgICB7IDB4Q0RBMSwgMHhDREZFIH0sCi0gICAgeyAweENFQTEsIDB4Q0VGRSB9LAotICAgIHsgMHhDRkExLCAweENGRkUgfSwKLSAgICB7IDB4RDBBMSwgMHhEMEZFIH0sCi0gICAgeyAweEQxQTEsIDB4RDFGRSB9LAotICAgIHsgMHhEMkExLCAweEQyRkUgfSwKLSAgICB7IDB4RDNBMSwgMHhEM0ZFIH0sCi0gICAgeyAweEQ0QTEsIDB4RDRGRSB9LAotICAgIHsgMHhENUExLCAweEQ1RkUgfSwKLSAgICB7IDB4RDZBMSwgMHhENkZFIH0sCi0gICAgeyAweEQ3QTEsIDB4RDdGRSB9LAotICAgIHsgMHhEOEExLCAweEQ4RkUgfSwKLSAgICB7IDB4RDlBMSwgMHhEOUZFIH0sCi0gICAgeyAweERBQTEsIDB4REFGRSB9LAotICAgIHsgMHhEQkExLCAweERCRkUgfSwKLSAgICB7IDB4RENBMSwgMHhEQ0ZFIH0sCi0gICAgeyAweEREQTEsIDB4RERGRSB9LAotICAgIHsgMHhERUExLCAweERFRkUgfSwKLSAgICB7IDB4REZBMSwgMHhERkZFIH0sCi0gICAgeyAweEUwQTEsIDB4RTBGRSB9LAotICAgIHsgMHhFMUExLCAweEUxRkUgfSwKLSAgICB7IDB4RTJBMSwgMHhFMkZFIH0sCi0gICAgeyAweEUzQTEsIDB4RTNGRSB9LAotICAgIHsgMHhFNEExLCAweEU0RkUgfSwKLSAgICB7IDB4RTVBMSwgMHhFNUZFIH0sCi0gICAgeyAweEU2QTEsIDB4RTZGRSB9LAotICAgIHsgMHhFN0ExLCAweEU3RkUgfSwKLSAgICB7IDB4RThBMSwgMHhFOEZFIH0sCi0gICAgeyAweEU5QTEsIDB4RTlGRSB9LAotICAgIHsgMHhFQUExLCAweEVBRkUgfSwKLSAgICB7IDB4RUJBMSwgMHhFQkZFIH0sCi0gICAgeyAweEVDQTEsIDB4RUNGRSB9LAotICAgIHsgMHhFREExLCAweEVERkUgfSwKLSAgICB7IDB4RUVBMSwgMHhFRUZFIH0sCi0gICAgeyAweEVGQTEsIDB4RUZGRSB9LAotICAgIHsgMHhGMEExLCAweEYwRkUgfSwKLSAgICB7IDB4RjFBMSwgMHhGMUZFIH0sCi0gICAgeyAweEYyQTEsIDB4RjJGRSB9LAotICAgIHsgMHhGM0ExLCAweEYzRkUgfSwKLSAgICB7IDB4RjRBMSwgMHhGNEZFIH0sCi0gICAgeyAweEY1QTEsIDB4RjVGRSB9LAotICAgIHsgMHhGNkExLCAweEY2RkUgfSwKLSAgICB7IDB4RjdBMSwgMHhGN0ZFIH0sCi0gICAgeyAweEY4QTEsIDB4RjhGRSB9LAotICAgIHsgMHhGOUExLCAweEY5RkUgfSwKLSAgICB7IDB4RkFBMSwgMHhGQUZFIH0sCi0gICAgeyAweEZCQTEsIDB4RkJGRSB9LAotICAgIHsgMHhGQ0ExLCAweEZDRkUgfSwKLSAgICB7IDB4RkRBMSwgMHhGREZFIH0sCi19OwotCi0vLyBnZW5lcmF0ZWQgZnJvbSBodHRwOi8vdW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1A5NTAuVFhUCi1zdGF0aWMgY29uc3QgQ2hhclJhbmdlIGtCaWc1UmFuZ2VzW10gPSB7Ci0gICAgeyAweEExNDAsIDB4QTE3RSB9LAotICAgIHsgMHhBMUExLCAweEExRkUgfSwKLSAgICB7IDB4QTI0MCwgMHhBMjdFIH0sCi0gICAgeyAweEEyQTEsIDB4QTJGRSB9LAotICAgIHsgMHhBMzQwLCAweEEzN0UgfSwKLSAgICB7IDB4QTNBMSwgMHhBM0JGIH0sCi0gICAgeyAweEEzRTEsIDB4QTNFMSB9LAotICAgIHsgMHhBNDQwLCAweEE0N0UgfSwKLSAgICB7IDB4QTRBMSwgMHhBNEZFIH0sCi0gICAgeyAweEE1NDAsIDB4QTU3RSB9LAotICAgIHsgMHhBNUExLCAweEE1RkUgfSwKLSAgICB7IDB4QTY0MCwgMHhBNjdFIH0sCi0gICAgeyAweEE2QTEsIDB4QTZGRSB9LAotICAgIHsgMHhBNzQwLCAweEE3N0UgfSwKLSAgICB7IDB4QTdBMSwgMHhBN0ZFIH0sCi0gICAgeyAweEE4NDAsIDB4QTg3RSB9LAotICAgIHsgMHhBOEExLCAweEE4RkUgfSwKLSAgICB7IDB4QTk0MCwgMHhBOTdFIH0sCi0gICAgeyAweEE5QTEsIDB4QTlGRSB9LAotICAgIHsgMHhBQTQwLCAweEFBN0UgfSwKLSAgICB7IDB4QUFBMSwgMHhBQUZFIH0sCi0gICAgeyAweEFCNDAsIDB4QUI3RSB9LAotICAgIHsgMHhBQkExLCAweEFCRkUgfSwKLSAgICB7IDB4QUM0MCwgMHhBQzdFIH0sCi0gICAgeyAweEFDQTEsIDB4QUNGRSB9LAotICAgIHsgMHhBRDQwLCAweEFEN0UgfSwKLSAgICB7IDB4QURBMSwgMHhBREZFIH0sCi0gICAgeyAweEFFNDAsIDB4QUU3RSB9LAotICAgIHsgMHhBRUExLCAweEFFRkUgfSwKLSAgICB7IDB4QUY0MCwgMHhBRjdFIH0sCi0gICAgeyAweEFGQTEsIDB4QUZGRSB9LAotICAgIHsgMHhCMDQwLCAweEIwN0UgfSwKLSAgICB7IDB4QjBBMSwgMHhCMEZFIH0sCi0gICAgeyAweEIxNDAsIDB4QjE3RSB9LAotICAgIHsgMHhCMUExLCAweEIxRkUgfSwKLSAgICB7IDB4QjI0MCwgMHhCMjdFIH0sCi0gICAgeyAweEIyQTEsIDB4QjJGRSB9LAotICAgIHsgMHhCMzQwLCAweEIzN0UgfSwKLSAgICB7IDB4QjNBMSwgMHhCM0ZFIH0sCi0gICAgeyAweEI0NDAsIDB4QjQ3RSB9LAotICAgIHsgMHhCNEExLCAweEI0RkUgfSwKLSAgICB7IDB4QjU0MCwgMHhCNTdFIH0sCi0gICAgeyAweEI1QTEsIDB4QjVGRSB9LAotICAgIHsgMHhCNjQwLCAweEI2N0UgfSwKLSAgICB7IDB4QjZBMSwgMHhCNkZFIH0sCi0gICAgeyAweEI3NDAsIDB4Qjc3RSB9LAotICAgIHsgMHhCN0ExLCAweEI3RkUgfSwKLSAgICB7IDB4Qjg0MCwgMHhCODdFIH0sCi0gICAgeyAweEI4QTEsIDB4QjhGRSB9LAotICAgIHsgMHhCOTQwLCAweEI5N0UgfSwKLSAgICB7IDB4QjlBMSwgMHhCOUZFIH0sCi0gICAgeyAweEJBNDAsIDB4QkE3RSB9LAotICAgIHsgMHhCQUExLCAweEJBRkUgfSwKLSAgICB7IDB4QkI0MCwgMHhCQjdFIH0sCi0gICAgeyAweEJCQTEsIDB4QkJGRSB9LAotICAgIHsgMHhCQzQwLCAweEJDN0UgfSwKLSAgICB7IDB4QkNBMSwgMHhCQ0ZFIH0sCi0gICAgeyAweEJENDAsIDB4QkQ3RSB9LAotICAgIHsgMHhCREExLCAweEJERkUgfSwKLSAgICB7IDB4QkU0MCwgMHhCRTdFIH0sCi0gICAgeyAweEJFQTEsIDB4QkVGRSB9LAotICAgIHsgMHhCRjQwLCAweEJGN0UgfSwKLSAgICB7IDB4QkZBMSwgMHhCRkZFIH0sCi0gICAgeyAweEMwNDAsIDB4QzA3RSB9LAotICAgIHsgMHhDMEExLCAweEMwRkUgfSwKLSAgICB7IDB4QzE0MCwgMHhDMTdFIH0sCi0gICAgeyAweEMxQTEsIDB4QzFGRSB9LAotICAgIHsgMHhDMjQwLCAweEMyN0UgfSwKLSAgICB7IDB4QzJBMSwgMHhDMkZFIH0sCi0gICAgeyAweEMzNDAsIDB4QzM3RSB9LAotICAgIHsgMHhDM0ExLCAweEMzRkUgfSwKLSAgICB7IDB4QzQ0MCwgMHhDNDdFIH0sCi0gICAgeyAweEM0QTEsIDB4QzRGRSB9LAotICAgIHsgMHhDNTQwLCAweEM1N0UgfSwKLSAgICB7IDB4QzVBMSwgMHhDNUZFIH0sCi0gICAgeyAweEM2NDAsIDB4QzY3RSB9LAotICAgIHsgMHhDOTQwLCAweEM5N0UgfSwKLSAgICB7IDB4QzlBMSwgMHhDOUZFIH0sCi0gICAgeyAweENBNDAsIDB4Q0E3RSB9LAotICAgIHsgMHhDQUExLCAweENBRkUgfSwKLSAgICB7IDB4Q0I0MCwgMHhDQjdFIH0sCi0gICAgeyAweENCQTEsIDB4Q0JGRSB9LAotICAgIHsgMHhDQzQwLCAweENDN0UgfSwKLSAgICB7IDB4Q0NBMSwgMHhDQ0ZFIH0sCi0gICAgeyAweENENDAsIDB4Q0Q3RSB9LAotICAgIHsgMHhDREExLCAweENERkUgfSwKLSAgICB7IDB4Q0U0MCwgMHhDRTdFIH0sCi0gICAgeyAweENFQTEsIDB4Q0VGRSB9LAotICAgIHsgMHhDRjQwLCAweENGN0UgfSwKLSAgICB7IDB4Q0ZBMSwgMHhDRkZFIH0sCi0gICAgeyAweEQwNDAsIDB4RDA3RSB9LAotICAgIHsgMHhEMEExLCAweEQwRkUgfSwKLSAgICB7IDB4RDE0MCwgMHhEMTdFIH0sCi0gICAgeyAweEQxQTEsIDB4RDFGRSB9LAotICAgIHsgMHhEMjQwLCAweEQyN0UgfSwKLSAgICB7IDB4RDJBMSwgMHhEMkZFIH0sCi0gICAgeyAweEQzNDAsIDB4RDM3RSB9LAotICAgIHsgMHhEM0ExLCAweEQzRkUgfSwKLSAgICB7IDB4RDQ0MCwgMHhENDdFIH0sCi0gICAgeyAweEQ0QTEsIDB4RDRGRSB9LAotICAgIHsgMHhENTQwLCAweEQ1N0UgfSwKLSAgICB7IDB4RDVBMSwgMHhENUZFIH0sCi0gICAgeyAweEQ2NDAsIDB4RDY3RSB9LAotICAgIHsgMHhENkExLCAweEQ2RkUgfSwKLSAgICB7IDB4RDc0MCwgMHhENzdFIH0sCi0gICAgeyAweEQ3QTEsIDB4RDdGRSB9LAotICAgIHsgMHhEODQwLCAweEQ4N0UgfSwKLSAgICB7IDB4RDhBMSwgMHhEOEZFIH0sCi0gICAgeyAweEQ5NDAsIDB4RDk3RSB9LAotICAgIHsgMHhEOUExLCAweEQ5RkUgfSwKLSAgICB7IDB4REE0MCwgMHhEQTdFIH0sCi0gICAgeyAweERBQTEsIDB4REFGRSB9LAotICAgIHsgMHhEQjQwLCAweERCN0UgfSwKLSAgICB7IDB4REJBMSwgMHhEQkZFIH0sCi0gICAgeyAweERDNDAsIDB4REM3RSB9LAotICAgIHsgMHhEQ0ExLCAweERDRkUgfSwKLSAgICB7IDB4REQ0MCwgMHhERDdFIH0sCi0gICAgeyAweEREQTEsIDB4RERGRSB9LAotICAgIHsgMHhERTQwLCAweERFN0UgfSwKLSAgICB7IDB4REVBMSwgMHhERUZFIH0sCi0gICAgeyAweERGNDAsIDB4REY3RSB9LAotICAgIHsgMHhERkExLCAweERGRkUgfSwKLSAgICB7IDB4RTA0MCwgMHhFMDdFIH0sCi0gICAgeyAweEUwQTEsIDB4RTBGRSB9LAotICAgIHsgMHhFMTQwLCAweEUxN0UgfSwKLSAgICB7IDB4RTFBMSwgMHhFMUZFIH0sCi0gICAgeyAweEUyNDAsIDB4RTI3RSB9LAotICAgIHsgMHhFMkExLCAweEUyRkUgfSwKLSAgICB7IDB4RTM0MCwgMHhFMzdFIH0sCi0gICAgeyAweEUzQTEsIDB4RTNGRSB9LAotICAgIHsgMHhFNDQwLCAweEU0N0UgfSwKLSAgICB7IDB4RTRBMSwgMHhFNEZFIH0sCi0gICAgeyAweEU1NDAsIDB4RTU3RSB9LAotICAgIHsgMHhFNUExLCAweEU1RkUgfSwKLSAgICB7IDB4RTY0MCwgMHhFNjdFIH0sCi0gICAgeyAweEU2QTEsIDB4RTZGRSB9LAotICAgIHsgMHhFNzQwLCAweEU3N0UgfSwKLSAgICB7IDB4RTdBMSwgMHhFN0ZFIH0sCi0gICAgeyAweEU4NDAsIDB4RTg3RSB9LAotICAgIHsgMHhFOEExLCAweEU4RkUgfSwKLSAgICB7IDB4RTk0MCwgMHhFOTdFIH0sCi0gICAgeyAweEU5QTEsIDB4RTlGRSB9LAotICAgIHsgMHhFQTQwLCAweEVBN0UgfSwKLSAgICB7IDB4RUFBMSwgMHhFQUZFIH0sCi0gICAgeyAweEVCNDAsIDB4RUI3RSB9LAotICAgIHsgMHhFQkExLCAweEVCRkUgfSwKLSAgICB7IDB4RUM0MCwgMHhFQzdFIH0sCi0gICAgeyAweEVDQTEsIDB4RUNGRSB9LAotICAgIHsgMHhFRDQwLCAweEVEN0UgfSwKLSAgICB7IDB4RURBMSwgMHhFREZFIH0sCi0gICAgeyAweEVFNDAsIDB4RUU3RSB9LAotICAgIHsgMHhFRUExLCAweEVFRkUgfSwKLSAgICB7IDB4RUY0MCwgMHhFRjdFIH0sCi0gICAgeyAweEVGQTEsIDB4RUZGRSB9LAotICAgIHsgMHhGMDQwLCAweEYwN0UgfSwKLSAgICB7IDB4RjBBMSwgMHhGMEZFIH0sCi0gICAgeyAweEYxNDAsIDB4RjE3RSB9LAotICAgIHsgMHhGMUExLCAweEYxRkUgfSwKLSAgICB7IDB4RjI0MCwgMHhGMjdFIH0sCi0gICAgeyAweEYyQTEsIDB4RjJGRSB9LAotICAgIHsgMHhGMzQwLCAweEYzN0UgfSwKLSAgICB7IDB4RjNBMSwgMHhGM0ZFIH0sCi0gICAgeyAweEY0NDAsIDB4RjQ3RSB9LAotICAgIHsgMHhGNEExLCAweEY0RkUgfSwKLSAgICB7IDB4RjU0MCwgMHhGNTdFIH0sCi0gICAgeyAweEY1QTEsIDB4RjVGRSB9LAotICAgIHsgMHhGNjQwLCAweEY2N0UgfSwKLSAgICB7IDB4RjZBMSwgMHhGNkZFIH0sCi0gICAgeyAweEY3NDAsIDB4Rjc3RSB9LAotICAgIHsgMHhGN0ExLCAweEY3RkUgfSwKLSAgICB7IDB4Rjg0MCwgMHhGODdFIH0sCi0gICAgeyAweEY4QTEsIDB4RjhGRSB9LAotICAgIHsgMHhGOTQwLCAweEY5N0UgfSwKLSAgICB7IDB4RjlBMSwgMHhGOUZFIH0sCi19OwotCi1zdGF0aWMgYm9vbCBjaGFyTWF0Y2hlc0VuY29kaW5nKGludCBjaCwgY29uc3QgQ2hhclJhbmdlKiBlbmNvZGluZ1JhbmdlcywgaW50IHJhbmdlQ291bnQpIHsKLSAgICAvLyBVc2UgYmluYXJ5IHNlYXJjaCB0byBzZWUgaWYgdGhlIGNoYXJhY3RlciBpcyBjb250YWluZWQgaW4gdGhlIGVuY29kaW5nCi0gICAgaW50IGxvdyA9IDA7Ci0gICAgaW50IGhpZ2ggPSByYW5nZUNvdW50OwotCi0gICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHsKLSAgICAgICAgaW50IGkgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgICBjb25zdCBDaGFyUmFuZ2UqIHJhbmdlID0gJmVuY29kaW5nUmFuZ2VzW2ldOwotICAgICAgICBpZiAoY2ggPj0gcmFuZ2UtPmZpcnN0ICYmIGNoIDw9IHJhbmdlLT5sYXN0KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChjaCA+IHJhbmdlLT5sYXN0KQotICAgICAgICAgICAgbG93ID0gaSArIDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGhpZ2ggPSBpOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotZXh0ZXJuIHVpbnQzMl90IGZpbmRQb3NzaWJsZUVuY29kaW5ncyhpbnQgY2gpCi17Ci0gICAgLy8gQVNDSUkgbWF0Y2hlcyBldmVyeXRoaW5nCi0gICAgaWYgKGNoIDwgMjU2KSByZXR1cm4ga0VuY29kaW5nQWxsOwotCi0gICAgaW50IHJlc3VsdCA9IGtFbmNvZGluZ05vbmU7Ci0KLSAgICBpZiAoY2hhck1hdGNoZXNFbmNvZGluZyhjaCwga1NoaWZ0SklTUmFuZ2VzLCBBUlJBWV9TSVpFKGtTaGlmdEpJU1JhbmdlcykpKQotICAgICAgICByZXN1bHQgfD0ga0VuY29kaW5nU2hpZnRKSVM7Ci0gICAgaWYgKGNoYXJNYXRjaGVzRW5jb2RpbmcoY2gsIGtHQktSYW5nZXMsIEFSUkFZX1NJWkUoa0dCS1JhbmdlcykpKQotICAgICAgICByZXN1bHQgfD0ga0VuY29kaW5nR0JLOwotICAgIGlmIChjaGFyTWF0Y2hlc0VuY29kaW5nKGNoLCBrQmlnNVJhbmdlcywgQVJSQVlfU0laRShrQmlnNVJhbmdlcykpKQotICAgICAgICByZXN1bHQgfD0ga0VuY29kaW5nQmlnNTsKLSAgICBpZiAoY2hhck1hdGNoZXNFbmNvZGluZyhjaCwga0VVQ0tSUmFuZ2VzLCBBUlJBWV9TSVpFKGtFVUNLUlJhbmdlcykpKQotICAgICAgICByZXN1bHQgfD0ga0VuY29kaW5nRVVDS1I7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYXV0b2RldGVjdC5oIGIvbWVkaWEvbGlibWVkaWEvYXV0b2RldGVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njc1ZGIzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2F1dG9kZXRlY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFVVE9ERVRFQ1RfSAotI2RlZmluZSBBVVRPREVURUNUX0gKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLS8vIGZsYWdzIHVzZWQgZm9yIG5hdGl2ZSBlbmNvZGluZyBkZXRlY3Rpb24KLWVudW0gewotICAgIGtFbmNvZGluZ05vbmUgICAgICAgICAgICAgICA9IDAsCi0gICAga0VuY29kaW5nU2hpZnRKSVMgICAgICAgICAgID0gKDEgPDwgMCksCi0gICAga0VuY29kaW5nR0JLICAgICAgICAgICAgICAgID0gKDEgPDwgMSksCi0gICAga0VuY29kaW5nQmlnNSAgICAgICAgICAgICAgID0gKDEgPDwgMiksCi0gICAga0VuY29kaW5nRVVDS1IgICAgICAgICAgICAgID0gKDEgPDwgMyksCi0KLSAgICBrRW5jb2RpbmdBbGwgICAgICAgICAgICAgICAgPSAoa0VuY29kaW5nU2hpZnRKSVMgfCBrRW5jb2RpbmdHQksgfCBrRW5jb2RpbmdCaWc1IHwga0VuY29kaW5nRVVDS1IpLAotfTsKLQotCi0vLyByZXR1cm5zIGEgYml0ZmllbGQgY29udGFpbmluZyB0aGUgcG9zc2libGUgbmF0aXZlIGVuY29kaW5ncyBmb3IgdGhlIGdpdmVuIGNoYXJhY3RlcgotZXh0ZXJuIHVpbnQzMl90IGZpbmRQb3NzaWJsZUVuY29kaW5ncyhpbnQgY2gpOwotCi0jZW5kaWYgLy8gQVVUT0RFVEVDVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCmluZGV4IDExMGI5NGMuLjM5YTIzOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCkBAIC0xOCw5ICsxOCwxMiBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYU1ldGFkYXRhUmV0cmlldmVyIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KQEAgLTkzLDcgKzk2LDkgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqc3JjVXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqc3JjVXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xMDYsMTIgKzExMSwxMiBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAgICAgQUxPR1YoImRhdGEgc291cmNlICglcykiLCBzcmNVcmwpOwotICAgIHJldHVybiBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKHNyY1VybCwgaGVhZGVycyk7CisgICAgcmV0dXJuIG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHNyY1VybCwgaGVhZGVycyk7CiB9CiAKIHN0YXR1c190IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCiB7Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2UoJWQsICVsbGQsICVsbGQpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobVJldHJpZXZlciA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJyZXRyaWV2ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CkBAIC0xMjYsNyArMTMxLDcgQEAKIAogc3A8SU1lbW9yeT4gTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pCiB7Ci0gICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiB0aW1lKCVsbGQgdXMpIG9wdGlvbiglZCkiLCB0aW1lVXMsIG9wdGlvbik7CisgICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiB0aW1lKCUiIFBSSWQ2NCAiIHVzKSBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1SZXRyaWV2ZXIgPT0gMCkgewogICAgICAgICBBTE9HRSgicmV0cmlldmVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwpAQCAtMTU3LDcgKzE2Miw3IEBACiAgICAgcmV0dXJuIG1SZXRyaWV2ZXItPmV4dHJhY3RBbGJ1bUFydCgpOwogfQogCi12b2lkIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewordm9pZCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpzU2VydmljZUxvY2spOwogICAgIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OnNTZXJ2aWNlLmNsZWFyKCk7CiAgICAgQUxPR1coIk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIgc2VydmVyIGRpZWQhIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggMGY2ZDg5Ny4uOTYxMWFjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtMTcsMTIgKzE3LDE0IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CkBAIC00OCw2ICs1MCw3IEBACiAgICAgbUxpc3RlbmVyID0gTlVMTDsKICAgICBtQ29va2llID0gTlVMTDsKICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gTlVMTDsKICAgICBtQ3VycmVudFBvc2l0aW9uID0gLTE7CiAgICAgbVNlZWtQb3NpdGlvbiA9IC0xOwogICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVJfSURMRTsKQEAgLTU3LDggKzYwLDggQEAKICAgICBtTGVmdFZvbHVtZSA9IG1SaWdodFZvbHVtZSA9IDEuMDsKICAgICBtVmlkZW9XaWR0aCA9IG1WaWRlb0hlaWdodCA9IDA7CiAgICAgbUxvY2tUaHJlYWRJZCA9IDA7Ci0gICAgbUF1ZGlvU2Vzc2lvbklkID0gQXVkaW9TeXN0ZW06Om5ld0F1ZGlvU2Vzc2lvbklkKCk7Ci0gICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQpOworICAgIG1BdWRpb1Nlc3Npb25JZCA9IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKCk7CisgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICBtU2VuZExldmVsID0gMDsKICAgICBtUmV0cmFuc21pdEVuZHBvaW50VmFsaWQgPSBmYWxzZTsKIH0KQEAgLTY2LDcgKzY5LDExIEBACiBNZWRpYVBsYXllcjo6fk1lZGlhUGxheWVyKCkKIHsKICAgICBBTE9HVigiZGVzdHJ1Y3RvciIpOwotICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkKTsKKyAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOworICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gTlVMTDsKKyAgICB9CisgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICBkaXNjb25uZWN0KCk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogfQpAQCAtMTM2LDYgKzE0Myw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVybCk7CkBAIC0xNDUsNyArMTUzLDcgQEAKICAgICAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewogICAgICAgICAgICAgc3A8SU1lZGlhUGxheWVyPiBwbGF5ZXIoc2VydmljZS0+Y3JlYXRlKHRoaXMsIG1BdWRpb1Nlc3Npb25JZCkpOwogICAgICAgICAgICAgaWYgKChOT19FUlJPUiAhPSBkb1NldFJldHJhbnNtaXRFbmRwb2ludChwbGF5ZXIpKSB8fAotICAgICAgICAgICAgICAgIChOT19FUlJPUiAhPSBwbGF5ZXItPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKSkpIHsKKyAgICAgICAgICAgICAgICAoTk9fRVJST1IgIT0gcGxheWVyLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpKSkgewogICAgICAgICAgICAgICAgIHBsYXllci5jbGVhcigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXJyID0gYXR0YWNoTmV3UGxheWVyKHBsYXllcik7CkBAIC0xNTYsNyArMTY0LDcgQEAKIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCiB7Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2UoJWQsICVsbGQsICVsbGQpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZShnZXRNZWRpYVBsYXllclNlcnZpY2UoKSk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewpAQCAtMTkzLDcgKzIwMSw3IEBACiAgICAgICAgICAgICAobUN1cnJlbnRTdGF0ZSAhPSBNRURJQV9QTEFZRVJfU1RBVEVfRVJST1IpICYmCiAgICAgICAgICAgICAoKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVJfSURMRSkgIT0gTUVESUFfUExBWUVSX0lETEUpOwogICAgIGlmICgobVBsYXllciAhPSBOVUxMKSAmJiBoYXNCZWVuSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgQUxPR1YoImludm9rZSAlZCIsIHJlcXVlc3QuZGF0YVNpemUoKSk7CisgICAgICAgIEFMT0dWKCJpbnZva2UgJXp1IiwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKICAgICAgICAgcmV0dXJuICBtUGxheWVyLT5pbnZva2UocmVxdWVzdCwgcmVwbHkpOwogICAgIH0KICAgICBBTE9HRSgiaW52b2tlIGZhaWxlZDogd3Jvbmcgc3RhdGUgJVgiLCBtQ3VycmVudFN0YXRlKTsKQEAgLTIzNCw2ICsyNDIsOSBAQAogewogICAgIGlmICggKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVJfSU5JVElBTElaRUQgfCBNRURJQV9QTEFZRVJfU1RPUFBFRCkgKSApIHsKICAgICAgICAgbVBsYXllci0+c2V0QXVkaW9TdHJlYW1UeXBlKG1TdHJlYW1UeXBlKTsKKyAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgeworICAgICAgICAgICAgbVBsYXllci0+c2V0UGFyYW1ldGVyKEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUywgKm1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwpOworICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVJfUFJFUEFSSU5HOwogICAgICAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZUFzeW5jKCk7CiAgICAgfQpAQCAtMjgwLDE2ICsyOTEsMjEgQEAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzdGFydCgpCiB7CiAgICAgQUxPR1YoInN0YXJ0Iik7CisKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSX1NUQVJURUQpCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICBpZiAoIChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSX1BSRVBBUkVEIHwKKworICAgIG1Mb2NrVGhyZWFkSWQgPSBnZXRUaHJlYWRJZCgpOworCisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVJfU1RBUlRFRCkgeworICAgICAgICByZXQgPSBOT19FUlJPUjsKKyAgICB9IGVsc2UgaWYgKCAobVBsYXllciAhPSAwKSAmJiAoIG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUl9QUkVQQVJFRCB8CiAgICAgICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUl9QTEFZQkFDS19DT01QTEVURSB8IE1FRElBX1BMQVlFUl9QQVVTRUQgKSApICkgewogICAgICAgICBtUGxheWVyLT5zZXRMb29waW5nKG1Mb29wKTsKICAgICAgICAgbVBsYXllci0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOwogICAgICAgICBtUGxheWVyLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVJfU1RBUlRFRDsKLSAgICAgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+c3RhcnQoKTsKKyAgICAgICAgcmV0ID0gbVBsYXllci0+c3RhcnQoKTsKICAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUl9TVEFURV9FUlJPUjsKICAgICAgICAgfSBlbHNlIHsKQEAgLTI5NywxMCArMzEzLDE0IEBACiAgICAgICAgICAgICAgICAgQUxPR1YoInBsYXliYWNrIGNvbXBsZXRlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgc3RhcnQoKSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInN0YXJ0IGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXQgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgQUxPR0UoInN0YXJ0IGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIG1Mb2NrVGhyZWFkSWQgPSAwOworCisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnN0b3AoKQpAQCAtNTMwLDYgKzU1MCwxNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmdldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90ICp0eXBlKQoreworICAgIEFMT0dWKCJnZXRBdWRpb1N0cmVhbVR5cGUiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICp0eXBlID0gbVN0cmVhbVR5cGU7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0TG9vcGluZyhpbnQgbG9vcCkKIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXI6OnNldExvb3BpbmciKTsKQEAgLTU3NSw4ICs2MDMsOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAoc2Vzc2lvbklkICE9IG1BdWRpb1Nlc3Npb25JZCkgewotICAgICAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKHNlc3Npb25JZCk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChzZXNzaW9uSWQsIC0xKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC02MTMsMTUgKzY0MSw0NiBAQAogICAgIHJldHVybiBtUGxheWVyLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOwogfQogCisvLyBhbHdheXMgY2FsbCB3aXRoIGxvY2sgaGVsZAorc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmNoZWNrU3RhdGVGb3JLZXlTZXRfbChpbnQga2V5KQoreworICAgIHN3aXRjaChrZXkpIHsKKyAgICBjYXNlIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUl9TVEFSVEVEIHwKKyAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVJfUEFVU0VEIHwgTUVESUFfUExBWUVSX1BMQVlCQUNLX0NPTVBMRVRFKSApIHsKKyAgICAgICAgICAgIC8vIENhbid0IGNoYW5nZSB0aGUgYXVkaW8gYXR0cmlidXRlcyBhZnRlciBwcmVwYXJlCisgICAgICAgICAgICBBTE9HRSgidHJ5aW5nIHRvIHNldCBhdWRpbyBhdHRyaWJ1dGVzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIHBhcmFtZXRlciBkb2Vzbid0IHJlcXVpcmUgcGxheWVyIHN0YXRlIGNoZWNrCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KQogewogICAgIEFMT0dWKCJNZWRpYVBsYXllcjo6c2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoY2hlY2tTdGF0ZUZvcktleVNldF9sKGtleSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KICAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAgbVBsYXllci0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CiAgICAgfQotICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3dpdGNoIChrZXkpIHsKKyAgICBjYXNlIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICAgICAgLy8gbm8gcGxheWVyLCBzYXZlIHRoZSBtYXJzaGFsbGVkIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgeyBkZWxldGUgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsgfTsKKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IG5ldyBQYXJjZWwoKTsKKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbC0+YXBwZW5kRnJvbSgmcmVxdWVzdCwgMCwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KQpAQCAtNjU0LDcgKzcxMyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbWVtc2V0KCZtUmV0cmFuc21pdEVuZHBvaW50LCAwLCBzaXplb2YoJm1SZXRyYW5zbWl0RW5kcG9pbnQpKTsKKyAgICBtZW1zZXQoJm1SZXRyYW5zbWl0RW5kcG9pbnQsIDAsIHNpemVvZihtUmV0cmFuc21pdEVuZHBvaW50KSk7CiAgICAgbVJldHJhbnNtaXRFbmRwb2ludC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKICAgICBtUmV0cmFuc21pdEVuZHBvaW50LnNpbl9hZGRyICAgPSBzYWRkcjsKICAgICBtUmV0cmFuc21pdEVuZHBvaW50LnNpbl9wb3J0ICAgPSBodG9ucyhwb3J0KTsKQEAgLTY3Myw4ICs3MzIsOCBAQAogICAgIC8vIHJ1bm5pbmcgaW4gdGhlIHNhbWUgcHJvY2VzcyBhcyB0aGUgbWVkaWEgc2VydmVyLiBJbiB0aGF0IGNhc2UsCiAgICAgLy8gdGhpcyB3aWxsIGRlYWRsb2NrLgogICAgIC8vCi0gICAgLy8gVGhlIHRocmVhZElkIGhhY2sgYmVsb3cgd29ya3MgYXJvdW5kIHRoaXMgZm9yIHRoZSBjYXJlIG9mIHByZXBhcmUKLSAgICAvLyBhbmQgc2Vla1RvIHdpdGhpbiB0aGUgc2FtZSBwcm9jZXNzLgorICAgIC8vIFRoZSB0aHJlYWRJZCBoYWNrIGJlbG93IHdvcmtzIGFyb3VuZCB0aGlzIGZvciB0aGUgY2FyZSBvZiBwcmVwYXJlLAorICAgIC8vIHNlZWtUbyBhbmQgc3RhcnQgd2l0aGluIHRoZSBzYW1lIHByb2Nlc3MuCiAgICAgLy8gRklYTUU6IFJlbWVtYmVyLCB0aGlzIGlzIGEgaGFjaywgaXQncyBub3QgZXZlbiBhIGhhY2sgdGhhdCBpcyBhcHBsaWVkCiAgICAgLy8gY29uc2lzdGVudGx5IGZvciBhbGwgdXNlLWNhc2VzLCB0aGlzIG5lZWRzIHRvIGJlIHJldmlzaXRlZC4KICAgICBpZiAobUxvY2tUaHJlYWRJZCAhPSBnZXRUaHJlYWRJZCgpKSB7CkBAIC03NzYsMTUgKzgzNSwyMCBAQAogICAgIH0KIH0KIAotLypzdGF0aWMqLyBzdGF0dXNfdCBNZWRpYVBsYXllcjo6ZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpCisvKnN0YXRpYyovIHN0YXR1c190IE1lZGlhUGxheWVyOjpkZWNvZGUoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgc2l6ZV90ICpwU2l6ZSkKIHsKICAgICBBTE9HVigiZGVjb2RlKCVzKSIsIHVybCk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlID0gZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSBzZXJ2aWNlLT5kZWNvZGUodXJsLCBwU2FtcGxlUmF0ZSwgcE51bUNoYW5uZWxzLCBwRm9ybWF0LCBoZWFwLCBwU2l6ZSk7CisgICAgICAgIHN0YXR1cyA9IHNlcnZpY2UtPmRlY29kZShodHRwU2VydmljZSwgdXJsLCBwU2FtcGxlUmF0ZSwgcE51bUNoYW5uZWxzLCBwRm9ybWF0LCBoZWFwLCBwU2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBsb2NhdGUgbWVkaWEgc2VydmljZSIpOwogICAgICAgICBzdGF0dXMgPSBERUFEX09CSkVDVDsKQEAgLTgwNCw3ICs4NjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkKIHsKLSAgICBBTE9HVigiZGVjb2RlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgQUxPR1YoImRlY29kZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlID0gZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewpAQCAtODMyLDE1ICs4OTYsNCBAQAogICAgIHJldHVybiBtUGxheWVyLT5zZXROZXh0UGxheWVyKG5leHQgPT0gTlVMTCA/IE5VTEwgOiBuZXh0LT5tUGxheWVyKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSA9IGdldE1lZGlhUGxheWVyU2VydmljZSgpOwotCi0gICAgaWYgKHNlcnZpY2UgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gc2VydmljZS0+dXBkYXRlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAppbmRleCAzNzEwZTQ2Li4xOTUyYjg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcApAQCAtMTcsNiArMTcsOSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1lZGlhUmVjb3JkZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KQEAgLTE4Myw4ICsxODYsMTEgQEAKICAgICAgICAgQUxPR0UoInNldE91dHB1dEZvcm1hdCBjYWxsZWQgaW4gYW4gaW52YWxpZCBzdGF0ZTogJWQiLCBtQ3VycmVudFN0YXRlKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAobUlzVmlkZW9Tb3VyY2VTZXQgJiYgb2YgPj0gT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX1NUQVJUICYmIG9mICE9IE9VVFBVVF9GT1JNQVRfUlRQX0FWUCAmJiBvZiAhPSBPVVRQVVRfRk9STUFUX01QRUcyVFMpIHsgLy9maXJzdCBub24tdmlkZW8gb3V0cHV0IGZvcm1hdAotICAgICAgICBBTE9HRSgib3V0cHV0IGZvcm1hdCAoJWQpIGlzIG1lYW50IGZvciBhdWRpbyByZWNvcmRpbmcgb25seSBhbmQgaW5jb21wYXRpYmxlIHdpdGggdmlkZW8gcmVjb3JkaW5nIiwgb2YpOworICAgIGlmIChtSXNWaWRlb1NvdXJjZVNldAorICAgICAgICAgICAgJiYgb2YgPj0gT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX1NUQVJUIC8vZmlyc3Qgbm9uLXZpZGVvIG91dHB1dCBmb3JtYXQKKyAgICAgICAgICAgICYmIG9mIDwgT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX0VORCkgeworICAgICAgICBBTE9HRSgib3V0cHV0IGZvcm1hdCAoJWQpIGlzIG1lYW50IGZvciBhdWRpbyByZWNvcmRpbmcgb25seSIKKyAgICAgICAgICAgICAgIiBhbmQgaW5jb21wYXRpYmxlIHdpdGggdmlkZW8gcmVjb3JkaW5nIiwgb2YpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0yODYsNyArMjkyLDcgQEAKIAogc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKIHsKLSAgICBBTE9HVigic2V0T3V0cHV0RmlsZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlKCVkLCAlIiBQUklkNjQgIiwgJSIgUFJJZDY0ICIpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKICAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDhmMjE2MzIuLjJjZjU3MTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCkBAIC0yMiwxMSArMjIsMTQgQEAKICAgICBTdGFnZWZyaWdodFBsYXllci5jcHAgICAgICAgXAogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwICAgICBcCiAgICAgVGVzdFBsYXllclN0dWIuY3BwICAgICAgICAgIFwKKyAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCAgICAgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgIFwKICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgICAgXAogICAgIGxpYmNhbWVyYV9jbGllbnQgICAgICAgICAgICBcCisgICAgbGliY3J5cHRvICAgICAgICAgICAgICAgICAgIFwKICAgICBsaWJjdXRpbHMgICAgICAgICAgICAgICAgICAgXAorICAgIGxpYmRybWZyYW1ld29yayAgICAgICAgICAgICBcCiAgICAgbGlibG9nICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBsaWJkbCAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGxpYmd1aSAgICAgICAgICAgICAgICAgICAgICBcCkBAIC00NSwxNSArNDgsMTcgQEAKICAgICBsaWJzdGFnZWZyaWdodF9ydHNwICAgICAgICAgXAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgICAgICAgICAgICAgICBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCAgICAgICAgICAgICAgICAgIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkgICAgICAgICAgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0gICAgICAgICAgICAgICAgICBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCAgICAgICAgICAgICAgICAgIFwKICAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sby9UcmVtb2xvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCiBMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYXBsYXllcnNlcnZpY2UKIAorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKIGluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKaW5kZXggZDUwMDM3Zi4uZDIyMjMxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKQEAgLTQxNyw2ICs0MTcsMjMgQEAKICAgICByZXR1cm4gbVBsdWdpbi0+cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKHJlc3BvbnNlLCBjZXJ0aWZpY2F0ZSwgd3JhcHBlZEtleSk7CiB9CiAKK3N0YXR1c190IERybTo6dW5wcm92aXNpb25EZXZpY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtUGx1Z2luID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKCFjaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5SRU1PVkVfRFJNX0NFUlRJRklDQVRFUyIpKSB7CisgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgfQorCisgICAgcmV0dXJuIG1QbHVnaW4tPnVucHJvdmlzaW9uRGV2aWNlKCk7Cit9CiAKIHN0YXR1c190IERybTo6Z2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5oCmluZGV4IDNkNGIwZmMuLjllMjNlMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtLmgKQEAgLTc1LDYgKzc1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVucHJvdmlzaW9uRGV2aWNlKCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9IRENQLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9IRENQLmNwcAppbmRleCBjMmFjMWEzLi5hZmUzOTM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvSERDUC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0hEQ1AuY3BwCkBAIC0xMDcsMTEgKzEwNyw3IEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAotICAgIC8vIFRPLURPOgotICAgIC8vIE9ubHkgc3VwcG9ydCBIRENQX0NBUFNfRU5DUllQVCAoYnl0ZS1hcnJheSB0byBieXRlLWFycmF5KSBmb3Igbm93LgotICAgIC8vIHVzZSBtSERDUE1vZHVsZS0+Z2V0Q2FwcygpIHdoZW4gdGhlIEhEQ1AgbGlicmFyaWVzIGdldCB1cGRhdGVkLgotICAgIC8vcmV0dXJuIG1IRENQTW9kdWxlLT5nZXRDYXBzKCk7Ci0gICAgcmV0dXJuIEhEQ1BNb2R1bGU6OkhEQ1BfQ0FQU19FTkNSWVBUOworICAgIHJldHVybiBtSERDUE1vZHVsZS0+Z2V0Q2FwcygpOwogfQogCiBzdGF0dXNfdCBIRENQOjplbmNyeXB0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAppbmRleCA5MGFlZDM5Li4zZTBmYzBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcApAQCAtNjAsMTQgKzYwLDIwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1wbGF5ZXJfdHlwZSBNZWRpYVBsYXllckZhY3Rvcnk6OmdldERlZmF1bHRQbGF5ZXJUeXBlKCkgeworc3RhdGljIHBsYXllcl90eXBlIGdldERlZmF1bHRQbGF5ZXJUeXBlKCkgewogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC51c2UtbnVwbGF5ZXIiLCB2YWx1ZSwgTlVMTCkKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC51c2UtYXdlc29tZSIsIHZhbHVlLCBOVUxMKQogICAgICAgICAgICAgJiYgKCFzdHJjbXAoIjEiLCB2YWx1ZSkgfHwgIXN0cmNhc2VjbXAoInRydWUiLCB2YWx1ZSkpKSB7Ci0gICAgICAgIHJldHVybiBOVV9QTEFZRVI7CisgICAgICAgIHJldHVybiBTVEFHRUZSSUdIVF9QTEFZRVI7CiAgICAgfQogCi0gICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsKKyAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBFWFBFUklNRU5UQUwgZGV2ZWxvcGVyIHNldHRpbmdzIHByb3BlcnR5CisgICAgaWYgKHByb3BlcnR5X2dldCgicGVyc2lzdC5zeXMubWVkaWEudXNlLWF3ZXNvbWUiLCB2YWx1ZSwgTlVMTCkKKyAgICAgICAgICAgICYmICFzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpKSB7CisgICAgICAgIHJldHVybiBTVEFHRUZSSUdIVF9QTEFZRVI7CisgICAgfQorCisgICAgcmV0dXJuIE5VX1BMQVlFUjsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJGYWN0b3J5OjpyZWdpc3RlckZhY3RvcnkoSUZhY3RvcnkqIGZhY3RvcnksCkBAIC0xNzAsMjEgKzE3NiwyNCBAQAogY2xhc3MgU3RhZ2VmcmlnaHRQbGF5ZXJGYWN0b3J5IDoKICAgICBwdWJsaWMgTWVkaWFQbGF5ZXJGYWN0b3J5OjpJRmFjdG9yeSB7CiAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCisgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY3VyU2NvcmUpIHsKLSAgICAgICAgY2hhciBidWZbMjBdOwotICAgICAgICBsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgIHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICBsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKmxlbmd0aCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qY3VyU2NvcmUqLykgeworICAgICAgICBpZiAoZ2V0RGVmYXVsdFBsYXllclR5cGUoKQorICAgICAgICAgICAgICAgID09IFNUQUdFRlJJR0hUX1BMQVlFUikgeworICAgICAgICAgICAgY2hhciBidWZbMjBdOworICAgICAgICAgICAgbHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpOworICAgICAgICAgICAgcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICBsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7CiAKLSAgICAgICAgbG9uZyBpZGVudCA9ICooKGxvbmcqKWJ1Zik7CisgICAgICAgICAgICB1aW50MzJfdCBpZGVudCA9ICooKHVpbnQzMl90KilidWYpOwogCi0gICAgICAgIC8vIE9nZyB2b3JiaXM/Ci0gICAgICAgIGlmIChpZGVudCA9PSAweDUzNjc2NzRmKSAvLyAnT2dnUycKLSAgICAgICAgICAgIHJldHVybiAxLjA7CisgICAgICAgICAgICAvLyBPZ2cgdm9yYmlzPworICAgICAgICAgICAgaWYgKGlkZW50ID09IDB4NTM2NzY3NGYpIC8vICdPZ2dTJworICAgICAgICAgICAgICAgIHJldHVybiAxLjA7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gMC4wOwogICAgIH0KQEAgLTE5Nyw3ICsyMDYsNyBAQAogCiBjbGFzcyBOdVBsYXllckZhY3RvcnkgOiBwdWJsaWMgTWVkaWFQbGF5ZXJGYWN0b3J5OjpJRmFjdG9yeSB7CiAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCisgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY3VyU2NvcmUpIHsKICAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0IGtPdXJTY29yZSA9IDAuODsKQEAgLTIyOSw5ICsyMzgsOSBAQAogICAgICAgICByZXR1cm4gMC4wOwogICAgIH0KIAotICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGN1clNjb3JlKSB7CisgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiYgLypzb3VyY2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsKICAgICAgICAgcmV0dXJuIDEuMDsKICAgICB9CiAKQEAgLTI0Myw3ICsyNTIsNyBAQAogCiBjbGFzcyBTb25pdm94UGxheWVyRmFjdG9yeSA6IHB1YmxpYyBNZWRpYVBsYXllckZhY3Rvcnk6OklGYWN0b3J5IHsKICAgcHVibGljOgotICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKKyAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJTY29yZSkgewogICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQga091clNjb3JlID0gMC40OwpAQCAtMjc0LDcgKzI4Myw3IEBACiAgICAgICAgIHJldHVybiAwLjA7CiAgICAgfQogCi0gICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgY2xpZW50LAorICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoLApAQCAtMzEyLDkgKzMyMSw5IEBACiAKIGNsYXNzIFRlc3RQbGF5ZXJGYWN0b3J5IDogcHVibGljIE1lZGlhUGxheWVyRmFjdG9yeTo6SUZhY3RvcnkgewogICBwdWJsaWM6Ci0gICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgY2xpZW50LAorICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGN1clNjb3JlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypjdXJTY29yZSovKSB7CiAgICAgICAgIGlmIChUZXN0UGxheWVyU3R1Yjo6Y2FuQmVVc2VkKHVybCkpIHsKICAgICAgICAgICAgIHJldHVybiAxLjA7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuaAppbmRleCBmZTg5NzJiLi41NWZmOTE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5oCkBAIC0yOSwxOSArMjksMTkgQEAKICAgICAgIHB1YmxpYzoKICAgICAgICAgdmlydHVhbCB+SUZhY3RvcnkoKSB7IH0KIAotICAgICAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY3VyU2NvcmUpIHsgcmV0dXJuIDAuMDsgfQorICAgICAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKnVybCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsgcmV0dXJuIDAuMDsgfQogCi0gICAgICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGN1clNjb3JlKSB7IHJldHVybiAwLjA7IH0KKyAgICAgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZmQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKm9mZnNldCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IC8qbGVuZ3RoKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qY3VyU2NvcmUqLykgeyByZXR1cm4gMC4wOyB9CiAKLSAgICAgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJTY29yZSkgeyByZXR1cm4gMC4wOyB9CisgICAgICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICYvKnNvdXJjZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsgcmV0dXJuIDAuMDsgfQogCiAgICAgICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXJCYXNlPiBjcmVhdGVQbGF5ZXIoKSA9IDA7CiAgICAgfTsKQEAgLTcxLDcgKzcxLDYgQEAKIAogICAgIHN0YXRpYyBzdGF0dXNfdCByZWdpc3RlckZhY3RvcnlfbChJRmFjdG9yeSogZmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyX3R5cGUgdHlwZSk7Ci0gICAgc3RhdGljIHBsYXllcl90eXBlIGdldERlZmF1bHRQbGF5ZXJUeXBlKCk7CiAKICAgICBzdGF0aWMgTXV0ZXggICAgICAgc0xvY2s7CiAgICAgc3RhdGljIHRGYWN0b3J5TWFwIHNGYWN0b3J5TWFwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCA5YWM5MTA1Li44ZWIxMjY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMzQsNiArMzQsNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCisjaW5jbHVkZSA8YmluZGVyL0lCYXR0ZXJ5U3RhdHMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CkBAIC00Miw4ICs0MywxMCBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAgLy8gZm9yIHN0YXR1c190CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1N5c3RlbUNsb2NrLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgpAQCAtNTIsNiArNTUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMTg1LDYgKzE4OSw2MyBAQAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiAKK25hbWVzcGFjZSB7Cit1c2luZyBhbmRyb2lkOjpQYXJjZWw7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKKworLy8gbWFyc2hhbGxpbmcgdGFnIGluZGljYXRpbmcgZmxhdHRlbmVkIHV0ZjE2IHRhZ3MKKy8vIGtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmphdmEKK2NvbnN0IGludDMyX3Qga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MgPSAxOworCisvLyBBdWRpbyBhdHRyaWJ1dGVzIGZvcm1hdCBpbiBhIHBhcmNlbDoKKy8vCisvLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyAgfCAvLyBpZ25vcmUgdGFncyBpZiBub3QgZm91bmQKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQgdGFncyBpbiBVVEYxNiAgICAgICAgICAgICAgICAgfAorLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLworLy8gQHBhcmFtIHAgUGFyY2VsIHRoYXQgY29udGFpbnMgYXVkaW8gYXR0cmlidXRlcy4KKy8vIEBwYXJhbVtvdXRdIGF0dHJpYnV0ZXMgT24gZXhpdCBwb2ludHMgdG8gYW4gaW5pdGlhbGl6ZWQgYXVkaW9fYXR0cmlidXRlc190IHN0cnVjdHVyZQorLy8gQHBhcmFtW291dF0gc3RhdHVzIE9uIGV4aXQgY29udGFpbnMgdGhlIHN0YXR1cyBjb2RlIHRvIGJlIHJldHVybmVkLgordm9pZCB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IFBhcmNlbCYgcGFyY2VsLCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMpCit7CisgICAgYXR0cmlidXRlcy0+dXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPmNvbnRlbnRfdHlwZSA9IChhdWRpb19jb250ZW50X3R5cGVfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPmZsYWdzID0gKGF1ZGlvX2ZsYWdzX21hc2tfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGNvbnN0IGJvb2wgaGFzRmxhdHRlbmVkVGFnID0gKHBhcmNlbC5yZWFkSW50MzIoKSA9PSBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyk7CisgICAgaWYgKGhhc0ZsYXR0ZW5lZFRhZykgeworICAgICAgICAvLyB0aGUgdGFncyBhcmUgVVRGMTYsIGNvbnZlcnQgdG8gVVRGOAorICAgICAgICBTdHJpbmcxNiB0YWdzID0gcGFyY2VsLnJlYWRTdHJpbmcxNigpOworICAgICAgICBzc2l6ZV90IHJlYWxUYWdTaXplID0gdXRmMTZfdG9fdXRmOF9sZW5ndGgodGFncy5zdHJpbmcoKSwgdGFncy5zaXplKCkpOworICAgICAgICBpZiAocmVhbFRhZ1NpemUgPD0gMCkgeworICAgICAgICAgICAgc3RyY3B5KGF0dHJpYnV0ZXMtPnRhZ3MsICIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIGZsYXR0ZW5lZCBzdHJpbmcgaW50byB0aGUgYXR0cmlidXRlcyBhcyB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb252ZXJzaW9uOgorICAgICAgICAgICAgLy8gY29weWluZyBhcnJheSBzaXplIC0xLCBhcnJheSBmb3IgdGFncyB3YXMgY2FsbG9jJ2QsIG5vIG5lZWQgdG8gTlVMTC10ZXJtaW5hdGUgaXQKKyAgICAgICAgICAgIHNpemVfdCB0YWdTaXplID0gcmVhbFRhZ1NpemUgPiBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxID8KKyAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSA6IHJlYWxUYWdTaXplOworICAgICAgICAgICAgdXRmMTZfdG9fdXRmOCh0YWdzLnN0cmluZygpLCB0YWdTaXplLCBhdHRyaWJ1dGVzLT50YWdzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJ1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKCkgcmVjZWl2ZWQgdW5mbGF0dGVuZWQgdGFncywgaWdub3JpbmcgdGFnIHZhbHVlcyIpOworICAgICAgICBzdHJjcHkoYXR0cmlidXRlcy0+dGFncywgIiIpOworICAgIH0KK30KK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGJvb2wgY2hlY2tQZXJtaXNzaW9uKGNvbnN0IGNoYXIqIHBlcm1pc3Npb25TdHJpbmcpIHsKQEAgLTIyMCw2ICsyODEsMjAgQEAKICAgICAvLyBzcGVha2VyIGlzIG9uIGJ5IGRlZmF1bHQKICAgICBtQmF0dGVyeUF1ZGlvLmRldmljZU9uW1NQRUFLRVJdID0gMTsKIAorICAgIC8vIHJlc2V0IGJhdHRlcnkgc3RhdHMKKyAgICAvLyBpZiB0aGUgbWVkaWFzZXJ2ZXIgaGFzIGNyYXNoZWQsIGJhdHRlcnkgc3RhdHMgY291bGQgYmUgbGVmdAorICAgIC8vIGluIGJhZCBzdGF0ZSwgcmVzZXQgdGhlIHN0YXRlIHVwb24gc2VydmljZSBzdGFydC4KKyAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKKyAgICBpZiAoc20gIT0gTlVMTCkgeworICAgICAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJiYXR0ZXJ5c3RhdHMiKTsKKyAgICAgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVN0YXRzID0KKyAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJQmF0dGVyeVN0YXRzPihzbS0+Z2V0U2VydmljZShuYW1lKSk7CisgICAgICAgIGlmIChiYXR0ZXJ5U3RhdHMgIT0gTlVMTCkgeworICAgICAgICAgICAgYmF0dGVyeVN0YXRzLT5ub3RlUmVzZXRWaWRlbygpOworICAgICAgICAgICAgYmF0dGVyeVN0YXRzLT5ub3RlUmVzZXRBdWRpbygpOworICAgICAgICB9CisgICAgfQorCiAgICAgTWVkaWFQbGF5ZXJGYWN0b3J5OjpyZWdpc3RlckJ1aWx0aW5GYWN0b3JpZXMoKTsKIH0KIApAQCAtMjc1LDYgKzM1MCwxMCBAQAogICAgIHJldHVybiBjOwogfQogCitzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhUGxheWVyU2VydmljZTo6Z2V0Q29kZWNMaXN0KCkgY29uc3QgeworICAgIHJldHVybiBNZWRpYUNvZGVjTGlzdDo6Z2V0TG9jYWxJbnN0YW5jZSgpOworfQorCiBzcDxJT01YPiBNZWRpYVBsYXllclNlcnZpY2U6OmdldE9NWCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCkBAIC0zMDYsMTIgKzM4NSw3IEBACiAgICAgcmV0dXJuIG5ldyBSZW1vdGVEaXNwbGF5KGNsaWVudCwgaWZhY2Uuc3RyaW5nKCkpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OnVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICByZXR1cm4gSFRUUEJhc2U6OlVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdAorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyphcmdzKi8pIGNvbnN0CiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC0zMTksNyArMzkzLDcgQEAKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb0NhY2hlXG4iKTsKICAgICBpZiAobUhlYXAgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgaGVhcCBiYXNlKCVwKSwgc2l6ZSglZCksIGZsYWdzKCVkKVxuIiwKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIGhlYXAgYmFzZSglcCksIHNpemUoJXp1KSwgZmxhZ3MoJWQpXG4iLAogICAgICAgICAgICAgICAgIG1IZWFwLT5nZXRCYXNlKCksIG1IZWFwLT5nZXRTaXplKCksIG1IZWFwLT5nZXRGbGFncygpKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIH0KQEAgLTUxMiw2ICs1ODYsNyBAQAogICAgIG1BdWRpb1Nlc3Npb25JZCA9IGF1ZGlvU2Vzc2lvbklkOwogICAgIG1VSUQgPSB1aWQ7CiAgICAgbVJldHJhbnNtaXRFbmRwb2ludFZhbGlkID0gZmFsc2U7CisgICAgbUF1ZGlvQXR0cmlidXRlcyA9IE5VTEw7CiAKICNpZiBDQUxMQkFDS19BTlRBR09OSVpFUgogICAgIEFMT0dEKCJjcmVhdGUgQW50YWdvbml6ZXIiKTsKQEAgLTUyNiw2ICs2MDEsOSBAQAogICAgIHdwPENsaWVudD4gY2xpZW50KHRoaXMpOwogICAgIGRpc2Nvbm5lY3QoKTsKICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KGNsaWVudCk7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgeworICAgICAgICBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOworICAgIH0KIH0KIAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6ZGlzY29ubmVjdCgpCkBAIC01OTAsNyArNjY4LDggQEAKICAgICB9CiAKICAgICBpZiAoIXAtPmhhcmR3YXJlT3V0cHV0KCkpIHsKLSAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IEF1ZGlvT3V0cHV0KG1BdWRpb1Nlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IEF1ZGlvT3V0cHV0KG1BdWRpb1Nlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLAorICAgICAgICAgICAgICAgIG1QaWQsIG1BdWRpb0F0dHJpYnV0ZXMpOwogICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYVBsYXllckludGVyZmFjZSo+KHAuZ2V0KCkpLT5zZXRBdWRpb1NpbmsobUF1ZGlvT3V0cHV0KTsKICAgICB9CiAKQEAgLTYyMiw3ICs3MDEsOSBAQAogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmwpOwogICAgIGlmICh1cmwgPT0gTlVMTCkKQEAgLTY1Nyw3ICs3MzgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KIAotICAgICAgICBzZXREYXRhU291cmNlX3Bvc3QocCwgcC0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpKTsKKyAgICAgICAgc2V0RGF0YVNvdXJjZV9wb3N0KHAsIHAtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycykpOwogICAgICAgICByZXR1cm4gbVN0YXR1czsKICAgICB9CiB9CkBAIC02NzQsOCArNzU1LDggQEAKIAogICAgIEFMT0dWKCJzdF9kZXYgID0gJWxsdSIsIHNiLnN0X2Rldik7CiAgICAgQUxPR1YoInN0X21vZGUgPSAldSIsIHNiLnN0X21vZGUpOwotICAgIEFMT0dWKCJzdF91aWQgID0gJWx1Iiwgc2Iuc3RfdWlkKTsKLSAgICBBTE9HVigic3RfZ2lkICA9ICVsdSIsIHNiLnN0X2dpZCk7CisgICAgQUxPR1YoInN0X3VpZCAgPSAlbHUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihzYi5zdF91aWQpKTsKKyAgICBBTE9HVigic3RfZ2lkICA9ICVsdSIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHNiLnN0X2dpZCkpOwogICAgIEFMT0dWKCJzdF9zaXplID0gJWxsdSIsIHNiLnN0X3NpemUpOwogCiAgICAgaWYgKG9mZnNldCA+PSBzYi5zdF9zaXplKSB7CkBAIC04MDQsNyArODg1LDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmdldE1ldGFkYXRhKAotICAgICAgICBib29sIHVwZGF0ZV9vbmx5LCBib29sIGFwcGx5X2ZpbHRlciwgUGFyY2VsICpyZXBseSkKKyAgICAgICAgYm9vbCB1cGRhdGVfb25seSwgYm9vbCAvKmFwcGx5X2ZpbHRlciovLCBQYXJjZWwgKnJlcGx5KQogewogICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcGxheWVyID0gZ2V0UGxheWVyKCk7CiAgICAgaWYgKHBsYXllciA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKQEAgLTk2OSw2ICsxMDUwLDIyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3QgUGFyY2VsICZwYXJjZWwpCit7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgeyBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOyB9CisgICAgbUF1ZGlvQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKHBhcmNlbCwgbUF1ZGlvQXR0cmlidXRlcyk7CisKKyAgICBBTE9HVigic2V0QXVkaW9BdHRyaWJ1dGVzX2woKSB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz0lcyIsCisgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLT51c2FnZSwgbUF1ZGlvQXR0cmlidXRlcy0+Y29udGVudF90eXBlLCBtQXVkaW9BdHRyaWJ1dGVzLT5mbGFncywKKyAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnRhZ3MpOworCisgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXRMb29waW5nKGludCBsb29wKQogewogICAgIEFMT0dWKCJbJWRdIHNldExvb3BpbmcoJWQpIiwgbUNvbm5JZCwgbG9vcCk7CkBAIC0xMDE3LDkgKzExMTQsMTcgQEAKIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKICAgICBBTE9HVigiWyVkXSBzZXRQYXJhbWV0ZXIoJWQpIiwgbUNvbm5JZCwga2V5KTsKLSAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKLSAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICByZXR1cm4gcC0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAgc3dpdGNoIChrZXkpIHsKKyAgICBjYXNlIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIHNldEF1ZGlvQXR0cmlidXRlc19sKHJlcXVlc3QpOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICAgICAgaWYgKHAgPT0gMCkgeyByZXR1cm4gVU5LTk9XTl9FUlJPUjsgfQorICAgICAgICByZXR1cm4gcC0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAgfQogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKQEAgLTExNzYsOSArMTI4MSwxNCBAQAogfQogI2VuZGlmCiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6ZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKQorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpkZWNvZGUoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgc2l6ZV90ICpwU2l6ZSkKIHsKICAgICBBTE9HVigiZGVjb2RlKCVzKSIsIHVybCk7CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwbGF5ZXI7CkBAIC0xMjA2LDcgKzEzMTYsNyBAQAogICAgIHN0YXRpY19jYXN0PE1lZGlhUGxheWVySW50ZXJmYWNlKj4ocGxheWVyLmdldCgpKS0+c2V0QXVkaW9TaW5rKGNhY2hlKTsKIAogICAgIC8vIHNldCBkYXRhIHNvdXJjZQotICAgIGlmIChwbGF5ZXItPnNldERhdGFTb3VyY2UodXJsKSAhPSBOT19FUlJPUikgZ290byBFeGl0OworICAgIGlmIChwbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCkgIT0gTk9fRVJST1IpIGdvdG8gRXhpdDsKIAogICAgIEFMT0dWKCJwcmVwYXJlIik7CiAgICAgcGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKQEAgLTEyOTYsMTMgKzE0MDYsMTUgQEAKIAogI3VuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9TaW5rIgotTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6QXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCwgaW50IHVpZCkKK01lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkF1ZGlvT3V0cHV0KGludCBzZXNzaW9uSWQsIGludCB1aWQsIGludCBwaWQsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0cikKICAgICA6IG1DYWxsYmFjayhOVUxMKSwKICAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSwKICAgICAgIG1DYWxsYmFja0RhdGEoTlVMTCksCiAgICAgICBtQnl0ZXNXcml0dGVuKDApLAogICAgICAgbVNlc3Npb25JZChzZXNzaW9uSWQpLAogICAgICAgbVVpZCh1aWQpLAorICAgICAgbVBpZChwaWQpLAogICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKICAgICBBTE9HVigiQXVkaW9PdXRwdXQoJWQpIiwgc2Vzc2lvbklkKTsKICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKQEAgLTEzMTQsNiArMTQyNiw3IEBACiAgICAgbUF1eEVmZmVjdElkID0gMDsKICAgICBtU2VuZExldmVsID0gMC4wOwogICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7CisgICAgbUF0dHJpYnV0ZXMgPSBhdHRyOwogfQogCiBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp+QXVkaW9PdXRwdXQoKQpAQCAtMTM4NCw2ICsxNDk3LDEyIEBACiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0UG9zaXRpb24ocG9zaXRpb24pOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdAoreworICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QKIHsKICAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwpAQCAtMTQwMyw2ICsxNTIyLDEwIEBACiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKIH0KIAordm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcykgeworICAgIG1BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKK30KKwogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpkZWxldGVSZWN5Y2xlZFRyYWNrKCkKIHsKICAgICBBTE9HVigiZGVsZXRlUmVjeWNsZWRUcmFjayIpOwpAQCAtMTQ1MCw3ICsxNTczLDcgQEAKICAgICAgICAgICAgICAgICBmb3JtYXQsIGJ1ZmZlckNvdW50LCBtU2Vzc2lvbklkLCBmbGFncyk7CiAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwogICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgdWludDMyX3QgZnJhbWVDb3VudDsKKyAgICBzaXplX3QgZnJhbWVDb3VudDsKIAogICAgIC8vIG9mZmxvYWRpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gY2FsbGJhY2sgbW9kZSBmb3Igbm93LgogICAgIC8vIG9mZmxvYWRJbmZvIG11c3QgYmUgcHJlc2VudCBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0CkBAIC0xNTUxLDcgKzE2NzQsOSBAQAogICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSywKICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8sCi0gICAgICAgICAgICAgICAgICAgIG1VaWQpOworICAgICAgICAgICAgICAgICAgICBtVWlkLAorICAgICAgICAgICAgICAgICAgICBtUGlkLAorICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCiAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLApAQCAtMTU2NiwxMyArMTY5MSwxOSBAQAogICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICBOVUxMLCAvLyBvZmZsb2FkIGluZm8KLSAgICAgICAgICAgICAgICAgICAgbVVpZCk7CisgICAgICAgICAgICAgICAgICAgIG1VaWQsCisgICAgICAgICAgICAgICAgICAgIG1QaWQsCisgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7CiAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNyZWF0ZSBhdWRpbyB0cmFjayIpOwogICAgICAgICAgICAgZGVsZXRlIG5ld2NiZDsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bCBBdWRpb1RyYWNrIGluaXRpYWxpemF0aW9uIGltcGxpZXMgYSBsZWdhY3kgc3RyZWFtIHR5cGUgd2FzIGdlbmVyYXRlZAorICAgICAgICAgICAgLy8gZnJvbSB0aGUgYXVkaW8gYXR0cmlidXRlcworICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSB0LT5zdHJlYW1UeXBlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2NzIsMTIgKzE4MDMsMTQgQEAKIAogc3NpemVfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQogewotICAgIExPR19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CiAKICAgICAvL0FMT0dWKCJ3cml0ZSglcCwgJXUpIiwgYnVmZmVyLCBzaXplKTsKICAgICBpZiAobVRyYWNrICE9IDApIHsKICAgICAgICAgc3NpemVfdCByZXQgPSBtVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gcmV0OworICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gcmV0OworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwpAQCAtMTc3Nyw3ICsxOTEwLDggQEAKICAgICAgICAgICAgICAgICBtZSwgYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKICAgICAgICAgICAgICAgICBDQl9FVkVOVF9GSUxMX0JVRkZFUik7CiAKLSAgICAgICAgaWYgKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwICYmIG1lLT5tTmV4dE91dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIGlmICgobWUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDAgJiYKKyAgICAgICAgICAgIGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwICYmIG1lLT5tTmV4dE91dHB1dCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIEVPUyBidXQgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBzdG9wcGVkIHlldCwKICAgICAgICAgICAgIC8vIGtlZXAgcGxheWluZyBzaWxlbmNlLgogCkBAIC0xODIzLDcgKzE5NTcsNyBAQAogI2RlZmluZSBMT0dfVEFHICJBdWRpb0NhY2hlIgogTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpBdWRpb0NhY2hlKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCkgOgogICAgIG1IZWFwKGhlYXApLCBtQ2hhbm5lbENvdW50KDApLCBtRnJhbWVDb3VudCgxMDI0KSwgbVNhbXBsZVJhdGUoMCksIG1TaXplKDApLAotICAgIG1FcnJvcihOT19FUlJPUiksICBtQ29tbWFuZENvbXBsZXRlKGZhbHNlKQorICAgIG1GcmFtZVNpemUoMSksIG1FcnJvcihOT19FUlJPUiksICBtQ29tbWFuZENvbXBsZXRlKGZhbHNlKQogewogfQogCkBAIC0xODQwLDE0ICsxOTc0LDIzIEBACiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QKIHsKICAgICBpZiAocG9zaXRpb24gPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAqcG9zaXRpb24gPSBtU2l6ZTsKKyAgICAqcG9zaXRpb24gPSBtU2l6ZSAvIG1GcmFtZVNpemU7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0Cit7CisgICAgdHMubVBvc2l0aW9uID0gbVNpemUgLyBtRnJhbWVTaXplOworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIHRzLm1UaW1lLnR2X3NlYyA9IG5vdyAvIDEwMDAwMDAwMDBMTDsKKyAgICB0cy5tVGltZS50dl9uc2VjID0gbm93IC0gKDEwMDAwMDAwMDBMTCAqIHRzLm1UaW1lLnR2X3NlYyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKndyaXR0ZW4pIGNvbnN0CiB7CiAgICAgaWYgKHdyaXR0ZW4gPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAqd3JpdHRlbiA9IG1TaXplOworICAgICp3cml0dGVuID0gbVNpemUgLyBtRnJhbWVTaXplOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMTkwOSw2ICsyMDUyLDggQEAKIAogICAgIGlmIChhY3R1YWxTaXplID4gMCkgewogICAgICAgICBzaW5rLT53cml0ZShtQnVmZmVyLCBhY3R1YWxTaXplKTsKKyAgICAgICAgLy8gQ291bGQgcmV0dXJuIGZhbHNlIG9uIHNpbmstPndyaXRlKCkgZXJyb3Igb3Igc2hvcnQgY291bnQuCisgICAgICAgIC8vIE5vdCBuZWNlc3NhcmlseSBhcHByb3ByaWF0ZSBidXQgd291bGQgd29yayBmb3IgQXVkaW9DYWNoZSBiZWhhdmlvci4KICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE5MTksOCArMjA2NCw4IEBACiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6Om9wZW4oCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQorICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsIGF1ZGlvX291dHB1dF9mbGFnc190IC8qZmxhZ3MqLywKKyAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QqIC8qb2ZmbG9hZEluZm8qLykKIHsKICAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsICVkLCAlZCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGNoYW5uZWxNYXNrLCBmb3JtYXQsIGJ1ZmZlckNvdW50KTsKICAgICBpZiAobUhlYXAtPmdldEhlYXBJRCgpIDwgMCkgewpAQCAtMTkzMSw2ICsyMDc2LDkgQEAKICAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQxNl90KWNoYW5uZWxDb3VudDsKICAgICBtRm9ybWF0ID0gZm9ybWF0OwogICAgIG1Nc2Vjc1BlckZyYW1lID0gMS5lMyAvIChmbG9hdCkgc2FtcGxlUmF0ZTsKKyAgICBtRnJhbWVTaXplID0gIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkKKyAgICAgICAgICAgID8gbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCkgOiAxOworICAgIG1GcmFtZUNvdW50ID0gbUhlYXAtPmdldFNpemUoKSAvIG1GcmFtZVNpemU7CiAKICAgICBpZiAoY2IgIT0gTlVMTCkgewogICAgICAgICBtQ2FsbGJhY2tUaHJlYWQgPSBuZXcgQ2FsbGJhY2tUaHJlYWQodGhpcywgY2IsIGNvb2tpZSk7CkBAIC0xOTYwLDEyICsyMTA4LDI2IEBACiAgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcCArPSBtU2l6ZTsKICAgICBBTE9HVigibWVtY3B5KCVwLCAlcCwgJXUpIiwgcCwgYnVmZmVyLCBzaXplKTsKLSAgICBpZiAobVNpemUgKyBzaXplID4gbUhlYXAtPmdldFNpemUoKSkgeworCisgICAgYm9vbCBvdmVyZmxvdyA9IG1TaXplICsgc2l6ZSA+IG1IZWFwLT5nZXRTaXplKCk7CisgICAgaWYgKG92ZXJmbG93KSB7CiAgICAgICAgIEFMT0dFKCJIZWFwIHNpemUgb3ZlcmZsb3chIHJlcSBzaXplOiAlZCwgbWF4IHNpemU6ICVkIiwgKG1TaXplICsgc2l6ZSksIG1IZWFwLT5nZXRTaXplKCkpOwogICAgICAgICBzaXplID0gbUhlYXAtPmdldFNpemUoKSAtIG1TaXplOwogICAgIH0KKyAgICBzaXplIC09IHNpemUgJSBtRnJhbWVTaXplOyAvLyBjb25zdW1lIG9ubHkgaW50ZWdyYWwgYW1vdW50cyBvZiBmcmFtZSBzaXplCiAgICAgbWVtY3B5KHAsIGJ1ZmZlciwgc2l6ZSk7CiAgICAgbVNpemUgKz0gc2l6ZTsKKworICAgIGlmIChvdmVyZmxvdykgeworICAgICAgICAvLyBTaWduYWwgaGVhcCBmaWxsZWQgaGVyZSAobGFzdCBmcmFtZSBtYXkgYmUgdHJ1bmNhdGVkKS4KKyAgICAgICAgLy8gQWZ0ZXIgdGhpcyBwb2ludCwgbm8gbW9yZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuIGFzIHRoZQorICAgICAgICAvLyBoZWFwIGlzIGZpbGxlZCBhbmQgdGhlIEF1ZGlvQ2FjaGUgc2hvdWxkIGJlIGVmZmVjdGl2ZWx5CisgICAgICAgIC8vIGltbXV0YWJsZSB3aXRoIHJlc3BlY3QgdG8gZnV0dXJlIHdyaXRlcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSXQgaXMgdGh1cyBzYWZlIGZvciBhbm90aGVyIHRocmVhZCB0byByZWFkIHRoZSBBdWRpb0NhY2hlLgorICAgICAgICBtQ29tbWFuZENvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgbVNpZ25hbC5zaWduYWwoKTsKKyAgICB9CiAgICAgcmV0dXJuIHNpemU7CiB9CiAKQEAgLTE5ODcsNyArMjE0OSw3IEBACiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpub3RpZnkoCi0gICAgICAgIHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikKKyAgICAgICAgdm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCogLypvYmoqLykKIHsKICAgICBBTE9HVigibm90aWZ5KCVwLCAlZCwgJWQsICVkKSIsIGNvb2tpZSwgbXNnLCBleHQxLCBleHQyKTsKICAgICBBdWRpb0NhY2hlKiBwID0gc3RhdGljX2Nhc3Q8QXVkaW9DYWNoZSo+KGNvb2tpZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggOWMwODRlMS4uM2I5NmU4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaApAQCAtNzIsNyArNzIsOCBAQAogICAgICAgICBjbGFzcyBDYWxsYmFja0RhdGE7CiAKICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb091dHB1dChpbnQgc2Vzc2lvbklkLCBpbnQgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCwgaW50IHVpZCwgaW50IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkF1ZGlvT3V0cHV0KCk7CiAKICAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVhZHkoKSBjb25zdCB7IHJldHVybiBtVHJhY2sgIT0gMDsgfQpAQCAtODQsNiArODUsNyBAQAogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwpAQCAtMTA0LDYgKzEwNiw3IEBACiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsgfQogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGU7IH0KKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpOwogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZVBlcm1pbGxlKTsKQEAgLTEzMyw2ICsxMzYsNyBAQAogICAgICAgICBDYWxsYmFja0RhdGEgKiAgICAgICAgICBtQ2FsbGJhY2tEYXRhOwogICAgICAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuOwogICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICptQXR0cmlidXRlczsKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7CiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVBsYXliYWNrUmF0ZVBlcm1pbGxlOwpAQCAtMTQwLDYgKzE0NCw3IEBACiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtVWlkOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQXV4RWZmZWN0SWQ7CiAgICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIG1Jc09uRW11bGF0b3I7CkBAIC0xOTAsMTAgKzE5NSwxMSBAQAogICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gZnJhbWVTaXplKCkgKiBtRnJhbWVDb3VudDsgfQogICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KICAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gKHNzaXplX3QpbUNoYW5uZWxDb3VudDsgfQotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBzc2l6ZV90KG1DaGFubmVsQ291bnQgKiAoKG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpP3NpemVvZihpbnQxNl90KTpzaXplb2YodV9pbnQ4X3QpKSk7IH0KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgZnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gKHNzaXplX3QpbUZyYW1lU2l6ZTsgfQogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwpAQCAtMjExLDEyICsyMTcsMTIgQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZmx1c2goKSB7fQogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBwYXVzZSgpIHt9CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGNsb3NlKCkge30KLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkge30KKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSBfX3VudXNlZCkge30KICAgICAgICAgICAgICAgICAvLyBzdHJlYW0gdHlwZSBpcyBub3QgdXNlZCBmb3IgQXVkaW9DYWNoZQogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gQVVESU9fU1RSRUFNX0RFRkFVTFQ7IH0KIAotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHt9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZVBlcm1pbGxlKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCBfX3VudXNlZCwgZmxvYXQgcmlnaHQgX191bnVzZWQpIHt9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZVBlcm1pbGxlIF9fdW51c2VkKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGU7IH0KICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KQEAgLTI0MCw2ICsyNDYsNyBAQAogICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1TYW1wbGVSYXRlOwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1TaXplOworICAgICAgICBzaXplX3QgICAgICAgICAgICAgIG1GcmFtZVNpemU7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUVycm9yOwogICAgICAgICBib29sICAgICAgICAgICAgICAgIG1Db21tYW5kQ29tcGxldGU7CiAKQEAgLTI1NiwxMyArMjYzLDIwIEBACiAKICAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gICAgY3JlYXRlKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGF1ZGlvU2Vzc2lvbklkKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkZWNvZGUoY29uc3QgY2hhciogdXJsLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkZWNvZGUoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgICAgIHNpemVfdCAqcFNpemUpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgIGRlY29kZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSk7CisgICAgdmlydHVhbCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldENvZGVjTGlzdCgpIGNvbnN0OwogICAgIHZpcnR1YWwgc3A8SU9NWD4gICAgICAgICAgICBnZXRPTVgoKTsKICAgICB2aXJ0dWFsIHNwPElDcnlwdG8+ICAgICAgICAgbWFrZUNyeXB0bygpOwogICAgIHZpcnR1YWwgc3A8SURybT4gICAgICAgICAgICBtYWtlRHJtKCk7CkBAIC0yNzIsOSArMjg2LDYgQEAKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGlmYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgdXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHJlbW92ZUNsaWVudCh3cDxDbGllbnQ+IGNsaWVudCk7CiAKICAgICAvLyBGb3IgYmF0dGVyeSB1c2FnZSB0cmFja2luZyBwdXJwb3NlCkBAIC0zNTYsNiArMzY3LDcgQEAKICAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiAgICAgY3JlYXRlUGxheWVyKHBsYXllcl90eXBlIHBsYXllclR5cGUpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCkBAIC00MDUsNiArNDE3LDggQEAKICAgICAgICAgLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIEFOYXRpdmVXaW5kb3cuCiAgICAgICAgIHZvaWQgZGlzY29ubmVjdE5hdGl2ZVdpbmRvdygpOwogCisgICAgICAgIHN0YXR1c190IHNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CisKICAgICAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+ICAgICAgICAgbVBsYXllcjsKICAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiAgICAgIG1TZXJ2aWNlOwpAQCAtNDE1LDYgKzQyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtTG9vcDsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1Db25uSWQ7CiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVVJRDsKICAgICAgICAgICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gICAgICAgICAgIG1Db25uZWN0ZWRXaW5kb3c7CiAgICAgICAgICAgICAgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkV2luZG93QmluZGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCmluZGV4IGE5ODIwZTAuLjE5NGFiYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKQEAgLTk1LDcgKzk1LDggQEAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldFZpZGVvU291cmNlKGludCB2cykKIHsKICAgICBBTE9HVigic2V0VmlkZW9Tb3VyY2UoJWQpIiwgdnMpOwotICAgIGlmICghY2hlY2tQZXJtaXNzaW9uKGNhbWVyYVBlcm1pc3Npb24pKSB7CisgICAgLy8gQ2hlY2sgY2FtZXJhIHBlcm1pc3Npb24gZm9yIHNvdXJjZXMgb3RoZXIgdGhhbiBTVVJGQUNFCisgICAgaWYgKHZzICE9IFZJREVPX1NPVVJDRV9TVVJGQUNFICYmICFjaGVja1Blcm1pc3Npb24oY2FtZXJhUGVybWlzc2lvbikpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAppbmRleCAzNDg5NTdmLi5mYTI4NDUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KQEAgLTU2LDcgKzU3LDcgQEAKICAgICBkaXNjb25uZWN0KCk7CiB9CiAKLXN0YXR1c190IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKK3N0YXR1c190IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyphcmdzKi8pIGNvbnN0CiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC0xMDYsNyArMTA3LDkgQEAKIH0KIAogc3RhdHVzX3QgTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiB7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgdXJsKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC0xMjcsNyArMTMwLDcgQEAKICAgICBBTE9HVigicGxheWVyIHR5cGUgPSAlZCIsIHBsYXllclR5cGUpOwogICAgIHNwPE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJCYXNlPiBwID0gY3JlYXRlUmV0cmlldmVyKHBsYXllclR5cGUpOwogICAgIGlmIChwID09IE5VTEwpIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHJldCA9IHAtPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKTsKKyAgICBzdGF0dXNfdCByZXQgPSBwLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOwogICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIG1SZXRyaWV2ZXIgPSBwOwogICAgIHJldHVybiByZXQ7CiB9CkBAIC0xNDQsOCArMTQ3LDggQEAKICAgICB9CiAgICAgQUxPR1YoInN0X2RldiAgPSAlbGx1Iiwgc2Iuc3RfZGV2KTsKICAgICBBTE9HVigic3RfbW9kZSA9ICV1Iiwgc2Iuc3RfbW9kZSk7Ci0gICAgQUxPR1YoInN0X3VpZCAgPSAlbHUiLCBzYi5zdF91aWQpOwotICAgIEFMT0dWKCJzdF9naWQgID0gJWx1Iiwgc2Iuc3RfZ2lkKTsKKyAgICBBTE9HVigic3RfdWlkICA9ICVsdSIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHNiLnN0X3VpZCkpOworICAgIEFMT0dWKCJzdF9naWQgID0gJWx1Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oc2Iuc3RfZ2lkKSk7CiAgICAgQUxPR1YoInN0X3NpemUgPSAlbGx1Iiwgc2Iuc3Rfc2l6ZSk7CiAKICAgICBpZiAob2Zmc2V0ID49IHNiLnN0X3NpemUpIHsKQEAgLTIzMCw3ICsyMzMsNyBAQAogICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGV4dHJhY3QgYW4gYWxidW0gYXJ0Iik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihNZWRpYUFsYnVtQXJ0KSArIGFsYnVtQXJ0LT5tU2l6ZTsKKyAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihNZWRpYUFsYnVtQXJ0KSArIGFsYnVtQXJ0LT5zaXplKCk7CiAgICAgc3A8TWVtb3J5SGVhcEJhc2U+IGhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50Iik7CiAgICAgaWYgKGhlYXAgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBNZW1vcnlEZWFsZXIgb2JqZWN0Iik7CkBAIC0yNDMsMTEgKzI0Niw5IEBACiAgICAgICAgIGRlbGV0ZSBhbGJ1bUFydDsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIE1lZGlhQWxidW1BcnQgKmFsYnVtQXJ0Q29weSA9IHN0YXRpY19jYXN0PE1lZGlhQWxidW1BcnQgKj4obUFsYnVtQXJ0LT5wb2ludGVyKCkpOwotICAgIGFsYnVtQXJ0Q29weS0+bVNpemUgPSBhbGJ1bUFydC0+bVNpemU7Ci0gICAgYWxidW1BcnRDb3B5LT5tRGF0YSA9ICh1aW50OF90ICopYWxidW1BcnRDb3B5ICsgc2l6ZW9mKE1lZGlhQWxidW1BcnQpOwotICAgIG1lbWNweShhbGJ1bUFydENvcHktPm1EYXRhLCBhbGJ1bUFydC0+bURhdGEsIGFsYnVtQXJ0LT5tU2l6ZSk7Ci0gICAgZGVsZXRlIGFsYnVtQXJ0OyAgLy8gRml4IG1lbW9yeSBsZWFrYWdlCisgICAgTWVkaWFBbGJ1bUFydDo6aW5pdCgoTWVkaWFBbGJ1bUFydCAqKSBtQWxidW1BcnQtPnBvaW50ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsYnVtQXJ0LT5zaXplKCksIGFsYnVtQXJ0LT5kYXRhKCkpOworICAgIGRlbGV0ZSBhbGJ1bUFydDsgIC8vIFdlJ3ZlIHRha2VuIG91ciBjb3B5LgogICAgIHJldHVybiBtQWxidW1BcnQ7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKaW5kZXggZjA4ZjkzMy4uOWQzZmJlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKQEAgLTMwLDYgKzMwLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBJTWVkaWFQbGF5ZXJTZXJ2aWNlOwogY2xhc3MgTWVtb3J5RGVhbGVyOwogCkBAIC00Myw3ICs0NCw5IEBACiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAKaW5kZXggMGE2YWE5MC4uNzQ5ZWY5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwCkBAIC0xMTQsNyArMTE0LDkgQEAKIH0KIAogc3RhdHVzX3QgTWlkaUZpbGU6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICopIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICYgLypodHRwU2VydmljZSovLAorICAgICAgICBjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqKSB7CiAgICAgQUxPR1YoIk1pZGlGaWxlOjpzZXREYXRhU291cmNlIHVybD0lcyIsIHBhdGgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKaW5kZXggMjRkNTliNC4uODJlNGU4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKQEAgLTMyLDExICszMiwxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiAvKmJ1ZmZlclByb2R1Y2VyKi8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gVU5LTk9XTl9FUlJPUjsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZUFzeW5jKCk7CkBAIC01MSwxMyArNTMsMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlc2V0KCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRMb29waW5nKGludCBsb29wKTsKICAgICB2aXJ0dWFsIHBsYXllcl90eXBlIHBsYXllclR5cGUoKSB7IHJldHVybiBTT05JVk9YX1BMQVlFUjsgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgLypyZXF1ZXN0Ki8sIFBhcmNlbCogLypyZXBseSovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXIoaW50IC8qa2V5Ki8sIGNvbnN0IFBhcmNlbCAmLypyZXF1ZXN0Ki8pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQYXJhbWV0ZXIoaW50IC8qa2V5Ki8sIFBhcmNlbCogLypyZXBseSovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggNDY1MjA5Zi4uZjNjZjZlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlICJNaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaCIKICNpbmNsdWRlIDxtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBzdGF0dXNfdCBFUlJPUl9OT1RfT1BFTiA9IC0xOwpAQCAtMzYsNyArMzgsOSBAQAogfQogCiBzdGF0dXNfdCBNaWRpTWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiB7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2U6ICVzIiwgdXJsPyB1cmw6ICJOVUxMIHBvaW50ZXIiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC00NCw3ICs0OCw3IEBACiAgICAgaWYgKG1NaWRpUGxheWVyID09IDApIHsKICAgICAgICAgbU1pZGlQbGF5ZXIgPSBuZXcgTWlkaUZpbGUoKTsKICAgICB9Ci0gICAgcmV0dXJuIG1NaWRpUGxheWVyLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycyk7CisgICAgcmV0dXJuIG1NaWRpUGxheWVyLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOwogfQogCiBzdGF0dXNfdCBNaWRpTWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggNGNlZTQyZC4uYjgyMTRlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtMzIsNyArMzIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TWlkaU1ldGFkYXRhUmV0cmlldmVyKCkge30KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiAgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKaW5kZXggZGU2MWQ5Yi4uYjM3YWVlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCkBAIC01NCw4ICs1NCwxMCBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewotICAgIHJldHVybiBtUGxheWVyLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycyk7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICByZXR1cm4gbVBsYXllci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKIH0KIAogLy8gV2FybmluZzogVGhlIGZpbGVkZXNjcmlwdG9yIHBhc3NlZCBpbnRvIHRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSB2YWxpZCB1bnRpbApAQCAtMTg3LDcgKzE4OSw3IEBACiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpnZXRNZXRhZGF0YSgKLSAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKSB7CisgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiAvKiBpZHMgKi8sIFBhcmNlbCAqcmVjb3JkcykgewogICAgIHVzaW5nIG1lZGlhOjpNZXRhZGF0YTsKIAogICAgIHVpbnQzMl90IGZsYWdzID0gbVBsYXllci0+ZmxhZ3MoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKaW5kZXggNjAwOTQ1ZS4uZTZjMzBmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKQEAgLTM0LDcgKzM0LDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVJRCh1aWRfdCB1aWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IGY5ZDkwMjAuLmNhZGQ2OTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTE2LDE2ICsxNiwyMSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlN0YWdlZnJpZ2h0UmVjb3JkZXIiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgIldlYm1Xcml0ZXIuaCIKICNpbmNsdWRlICJTdGFnZWZyaWdodFJlY29yZGVyLmgiCiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oPgpAQCAtMzUsMTMgKzQwLDEyIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtNzEsOCArNzUsNyBAQAogICAgICAgbUF1ZGlvU291cmNlKEFVRElPX1NPVVJDRV9DTlQpLAogICAgICAgbVZpZGVvU291cmNlKFZJREVPX1NPVVJDRV9MSVNUX0VORCksCiAgICAgICBtQ2FwdHVyZVRpbWVMYXBzZShmYWxzZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtU3VyZmFjZU1lZGlhU291cmNlKE5VTEwpIHsKKyAgICAgIG1TdGFydGVkKGZhbHNlKSB7CiAKICAgICBBTE9HVigiQ29uc3RydWN0b3IiKTsKICAgICByZXNldCgpOwpAQCAtODEsMTAgKzg0LDE5IEBACiBTdGFnZWZyaWdodFJlY29yZGVyOjp+U3RhZ2VmcmlnaHRSZWNvcmRlcigpIHsKICAgICBBTE9HVigiRGVzdHJ1Y3RvciIpOwogICAgIHN0b3AoKTsKKworICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxvb3Blci0+c3RvcCgpOworICAgIH0KIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6aW5pdCgpIHsKICAgICBBTE9HVigiaW5pdCIpOworCisgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1Mb29wZXItPnNldE5hbWUoInJlY29yZGVyX2xvb3BlciIpOworICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTkzLDcgKzEwNSw3IEBACiAvLyB3aGlsZSBlbmNvZGluZyBHTCBGcmFtZXMKIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlKCkgY29uc3QgewogICAgIEFMT0dWKCJHZXQgU3VyZmFjZU1lZGlhU291cmNlIik7Ci0gICAgcmV0dXJuIG1TdXJmYWNlTWVkaWFTb3VyY2UtPmdldEJ1ZmZlclF1ZXVlKCk7CisgICAgcmV0dXJuIG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldEF1ZGlvU291cmNlKGF1ZGlvX3NvdXJjZV90IGFzKSB7CkBAIC0xNzIsMTEgKzE4NCw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKHZlID09IFZJREVPX0VOQ09ERVJfREVGQVVMVCkgewotICAgICAgICBtVmlkZW9FbmNvZGVyID0gVklERU9fRU5DT0RFUl9IMjYzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1WaWRlb0VuY29kZXIgPSB2ZTsKLSAgICB9CisgICAgbVZpZGVvRW5jb2RlciA9IHZlOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjMzLDcgKzI0MSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqIC8qIHBhdGggKi8pIHsKICAgICBBTE9HRSgic2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKikgbXVzdCBub3QgYmUgY2FsbGVkIik7CiAgICAgLy8gV2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCB0aGlzIGF0IGFsbCwgYXMgdGhlIG1lZGlhX3NlcnZlciBwcm9jZXNzCiAgICAgLy8gbm8gbG9uZ2VyIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgZmlsZXMuCkBAIC02ODAsMTAgKzY4OCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVGltZUxhcHNlRW5hYmxlKHRpbWVMYXBzZUVuYWJsZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGtleSA9PSAidGltZS1iZXR3ZWVuLXRpbWUtbGFwc2UtZnJhbWUtY2FwdHVyZSIpIHsKLSAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zOwotICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJnRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMpKSB7CisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZ0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKSkgewogICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoCi0gICAgICAgICAgICAgICAgICAgIDEwMDBMTCAqIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMpOworICAgICAgICAgICAgICAgICAgICB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJzZXRQYXJhbWV0ZXI6IGZhaWxlZCB0byBmaW5kIGtleSAlcyIsIGtleS5zdHJpbmcoKSk7CkBAIC03MzgsMTkgKzc0NiwxNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cHJlcGFyZSgpIHsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0KCkgewotICAgIENIRUNLX0dFKG1PdXRwdXRGZCwgMCk7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpwcmVwYXJlSW50ZXJuYWwoKSB7CisgICAgQUxPR1YoInByZXBhcmUiKTsKKyAgICBpZiAobU91dHB1dEZkIDwgMCkgeworICAgICAgICBBTE9HRSgiT3V0cHV0IGZpbGUgZGVzY3JpcHRvciBpcyBpbnZhbGlkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiAKICAgICAvLyBHZXQgVUlEIGhlcmUgZm9yIHBlcm1pc3Npb24gY2hlY2tpbmcKICAgICBtQ2xpZW50VWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZpbGUgd3JpdGVyIGlzIG5vdCBhdmFpYWxibGUiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7CiAKQEAgLTc1OCwyNSArNzYyLDI2IEBACiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9ERUZBVUxUOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfTVBFR180OgotICAgICAgICAgICAgc3RhdHVzID0gc3RhcnRNUEVHNFJlY29yZGluZygpOworICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfV0VCTToKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwTVBFRzRvcldFQk1SZWNvcmRpbmcoKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BTVJfTkI6CiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BTVJfV0I6Ci0gICAgICAgICAgICBzdGF0dXMgPSBzdGFydEFNUlJlY29yZGluZygpOworICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBBTVJSZWNvcmRpbmcoKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BQUNfQURJRjoKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRFRTOgotICAgICAgICAgICAgc3RhdHVzID0gc3RhcnRBQUNSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwQUFDUmVjb3JkaW5nKCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfUlRQX0FWUDoKLSAgICAgICAgICAgIHN0YXR1cyA9IHN0YXJ0UlRQUmVjb3JkaW5nKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cFJUUFJlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX01QRUcyVFM6Ci0gICAgICAgICAgICBzdGF0dXMgPSBzdGFydE1QRUcyVFNSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwTVBFRzJUU1JlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTc4NSw2ICs3OTAsNzcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnByZXBhcmUoKSB7CisgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfU1VSRkFDRSkgeworICAgICAgICByZXR1cm4gcHJlcGFyZUludGVybmFsKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnQoKSB7CisgICAgQUxPR1YoInN0YXJ0Iik7CisgICAgaWYgKG1PdXRwdXRGZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIk91dHB1dCBmaWxlIGRlc2NyaXB0b3IgaXMgaW52YWxpZCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7CisKKyAgICBpZiAobVZpZGVvU291cmNlICE9IFZJREVPX1NPVVJDRV9TVVJGQUNFKSB7CisgICAgICAgIHN0YXR1cyA9IHByZXBhcmVJbnRlcm5hbCgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1Xcml0ZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmlsZSB3cml0ZXIgaXMgbm90IGF2YWlhbGJsZSIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1PdXRwdXRGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0RFRkFVTFQ6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9NUEVHXzQ6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9XRUJNOgorICAgICAgICB7CisgICAgICAgICAgICBib29sIGlzTVBFRzQgPSB0cnVlOworICAgICAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CisgICAgICAgICAgICAgICAgaXNNUEVHNCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgICAgICAgICBzZXR1cE1QRUc0b3JXRUJNTWV0YURhdGEoJm1ldGEpOworICAgICAgICAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobWV0YS5nZXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BTVJfTkI6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BTVJfV0I6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BQUNfQURJRjoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRFRTOgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfUlRQX0FWUDoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX01QRUcyVFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBvdXRwdXQgZmlsZSBmb3JtYXQ6ICVkIiwgbU91dHB1dEZvcm1hdCk7CisgICAgICAgICAgICBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKKyAgICAgICAgbVdyaXRlciA9IE5VTEw7CisgICAgfQorCiAgICAgaWYgKChzdGF0dXMgPT0gT0spICYmICghbVN0YXJ0ZWQpKSB7CiAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKIApAQCAtODE2LDU4ICs4OTIsNTggQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IGVuY01ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIHN3aXRjaCAobUF1ZGlvRW5jb2RlcikgewogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQU1SX05COgogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfREVGQVVMVDoKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkI7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FNUl9XQjoKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQzoKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7Ci0gICAgICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5QUFDUHJvZmlsZSwgT01YX0FVRElPX0FBQ09iamVjdExDKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImFhYy1wcm9maWxlIiwgT01YX0FVRElPX0FBQ09iamVjdExDKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfSEVfQUFDOgotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQzsKLSAgICAgICAgICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlBQUNQcm9maWxlLCBPTVhfQVVESU9fQUFDT2JqZWN0SEUpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBPTVhfQVVESU9fQUFDT2JqZWN0SEUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9BQUNfRUxEOgotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQzsKLSAgICAgICAgICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlBQUNQcm9maWxlLCBPTVhfQVVESU9fQUFDT2JqZWN0RUxEKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImFhYy1wcm9maWxlIiwgT01YX0FVRElPX0FBQ09iamVjdEVMRCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIlVua25vd24gYXVkaW8gZW5jb2RlcjogJWQiLCBtQXVkaW9FbmNvZGVyKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBlbmNNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7CiAKICAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKICAgICBDSEVDSyhhdWRpb1NvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKICAgICAgICAgICAgICAgICBrS2V5TWF4SW5wdXRTaXplLCAmbWF4SW5wdXRTaXplKSk7CiAKLSAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhJbnB1dFNpemUpOwotICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1BdWRpb0NoYW5uZWxzKTsKLSAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOwotICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCBtQXVkaW9CaXRSYXRlKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsIG1heElucHV0U2l6ZSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIG1BdWRpb0NoYW5uZWxzKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIG1TYW1wbGVSYXRlKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJiaXRyYXRlIiwgbUF1ZGlvQml0UmF0ZSk7CiAgICAgaWYgKG1BdWRpb1RpbWVTY2FsZSA+IDApIHsKLSAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgbUF1ZGlvVGltZVNjYWxlKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigidGltZS1zY2FsZSIsIG1BdWRpb1RpbWVTY2FsZSk7CiAgICAgfQogCi0gICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCAoc3RhdHVzX3QpT0spOwogICAgIHNwPE1lZGlhU291cmNlPiBhdWRpb0VuY29kZXIgPQotICAgICAgICBPTVhDb2RlYzo6Q3JlYXRlKGNsaWVudC5pbnRlcmZhY2UoKSwgZW5jTWV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGF1ZGlvU291cmNlKTsKKyAgICAgICAgICAgIE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZShtTG9vcGVyLCBmb3JtYXQsIGF1ZGlvU291cmNlKTsKICAgICBtQXVkaW9Tb3VyY2VOb2RlID0gYXVkaW9Tb3VyY2U7CiAKKyAgICBpZiAoYXVkaW9FbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgYXVkaW8gZW5jb2RlciIpOworICAgIH0KKwogICAgIHJldHVybiBhdWRpb0VuY29kZXI7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0QUFDUmVjb3JkaW5nKCkgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBBQUNSZWNvcmRpbmcoKSB7CiAgICAgLy8gRklYTUU6CiAgICAgLy8gQWRkIHN1cHBvcnQgZm9yIE9VVFBVVF9GT1JNQVRfQUFDX0FESUYKICAgICBDSEVDS19FUShtT3V0cHV0Rm9ybWF0LCBPVVRQVVRfRk9STUFUX0FBQ19BRFRTKTsKQEAgLTg3OCwxNiArOTU0LDEwIEBACiAgICAgQ0hFQ0sobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpOwogCiAgICAgbVdyaXRlciA9IG5ldyBBQUNXcml0ZXIobU91dHB1dEZkKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBtV3JpdGVyLmNsZWFyKCk7Ci0gICAgICAgIG1Xcml0ZXIgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRBTVJSZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cEFNUlJlY29yZGluZygpIHsKICAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX05CIHx8CiAgICAgICAgICAgbU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9XQik7CiAKQEAgLTkwNywxNSArOTc3LDEwIEBACiAgICAgfQogCiAgICAgbVdyaXRlciA9IG5ldyBBTVJXcml0ZXIobU91dHB1dEZkKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBtV3JpdGVyLmNsZWFyKCk7Ci0gICAgICAgIG1Xcml0ZXIgPSBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOworICAgIHJldHVybiBzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCk7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0UmF3QXVkaW9SZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCkgewogICAgIGlmIChtQXVkaW9Tb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCkgewogICAgICAgICBBTE9HRSgiSW52YWxpZCBhdWRpbyBzb3VyY2U6ICVkIiwgbUF1ZGlvU291cmNlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTk0MSwxMiArMTAwNiwxMSBAQAogICAgICAgICBtV3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtTWF4RmlsZVNpemVCeXRlcyk7CiAgICAgfQogICAgIG1Xcml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7Ci0gICAgbVdyaXRlci0+c3RhcnQoKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRSVFBSZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFJUUFJlY29yZGluZygpIHsKICAgICBDSEVDS19FUShtT3V0cHV0Rm9ybWF0LCBPVVRQVVRfRk9STUFUX1JUUF9BVlApOwogCiAgICAgaWYgKChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVApAQCAtOTY2LDYgKzEwMzAsNyBAQAogICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkgewogICAgICAgICBzb3VyY2UgPSBjcmVhdGVBdWRpb1NvdXJjZSgpOwogICAgIH0gZWxzZSB7CisgICAgICAgIHNldERlZmF1bHRWaWRlb0VuY29kZXJJZk5lY2Vzc2FyeSgpOwogCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBtZWRpYVNvdXJjZTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBNZWRpYVNvdXJjZSgmbWVkaWFTb3VyY2UpOwpAQCAtOTczLDcgKzEwMzgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1lZGlhU291cmNlLCBtVmlkZW9CaXRSYXRlLCAmc291cmNlKTsKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsICZzb3VyY2UpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CkBAIC05ODMsMTAgKzEwNDgsMTAgQEAKICAgICBtV3JpdGVyLT5hZGRTb3VyY2Uoc291cmNlKTsKICAgICBtV3JpdGVyLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOwogCi0gICAgcmV0dXJuIG1Xcml0ZXItPnN0YXJ0KCk7CisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydE1QRUcyVFNSZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUcyVFNSZWNvcmRpbmcoKSB7CiAgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9NUEVHMlRTKTsKIAogICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzJUU1dyaXRlcihtT3V0cHV0RmQpOwpAQCAtMTAwNyw2ICsxMDcyLDcgQEAKIAogICAgIGlmIChtVmlkZW9Tb3VyY2UgPCBWSURFT19TT1VSQ0VfTElTVF9FTkQpIHsKICAgICAgICAgaWYgKG1WaWRlb0VuY29kZXIgIT0gVklERU9fRU5DT0RFUl9IMjY0KSB7CisgICAgICAgICAgICBBTE9HRSgiTVBFRzJUUyByZWNvcmRpbmcgb25seSBzdXBwb3J0cyBILjI2NCBlbmNvZGluZyEiKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgfQogCkBAIC0xMDE3LDcgKzEwODMsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXI7Ci0gICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1lZGlhU291cmNlLCBtVmlkZW9CaXRSYXRlLCAmZW5jb2Rlcik7CisgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1lZGlhU291cmNlLCAmZW5jb2Rlcik7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTEwMzYsMTEgKzExMDIsMTcgQEAKIAogICAgIG1Xcml0ZXIgPSB3cml0ZXI7CiAKLSAgICByZXR1cm4gbVdyaXRlci0+c3RhcnQoKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIHZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Y2xpcFZpZGVvRnJhbWVSYXRlKCkgewogICAgIEFMT0dWKCJjbGlwVmlkZW9GcmFtZVJhdGU6IGVuY29kZXIgJWQiLCBtVmlkZW9FbmNvZGVyKTsKKyAgICBpZiAobUZyYW1lUmF0ZSA9PSAtMSkgeworICAgICAgICBtRnJhbWVSYXRlID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICJ2aWQuZnBzIiwgbUNhbWVyYUlkLCBDQU1DT1JERVJfUVVBTElUWV9MT1cpOworICAgICAgICBBTE9HVygiVXNpbmcgZGVmYXVsdCB2aWRlbyBmcHMgJWQiLCBtRnJhbWVSYXRlKTsKKyAgICB9CisKICAgICBpbnQgbWluRnJhbWVSYXRlID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jLnZpZC5mcHMubWluIiwgbVZpZGVvRW5jb2Rlcik7CiAgICAgaW50IG1heEZyYW1lUmF0ZSA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKApAQCAtMTEwMCw2ICsxMTcyLDcgQEAKICAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwKICAgICAgICAgICAgIChtVmlkZW9FbmNvZGVyID09IFZJREVPX0VOQ09ERVJfSDI2MyA/IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMgOgogICAgICAgICAgICAgIG1WaWRlb0VuY29kZXIgPT0gVklERU9fRU5DT0RFUl9NUEVHXzRfU1AgPyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCA6CisgICAgICAgICAgICAgbVZpZGVvRW5jb2RlciA9PSBWSURFT19FTkNPREVSX1ZQOCA/IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCA6CiAgICAgICAgICAgICAgbVZpZGVvRW5jb2RlciA9PSBWSURFT19FTkNPREVSX0gyNjQgPyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMgOiAiIiksCiAgICAgICAgICAgICBmYWxzZSAvKiBkZWNvZGVyICovLCB0cnVlIC8qIGh3Q29kZWMgKi8sICZjb2RlY3MpOwogICAgICpzdXBwb3J0c0NhbWVyYVNvdXJjZU1ldGFEYXRhTW9kZSA9IGNvZGVjcy5zaXplKCkgPiAwOwpAQCAtMTE3Miw2ICsxMjQ1LDMxIEBACiAgICAgICAgIGlmICh2aWRlb0NvZGVjID09IFZJREVPX0VOQ09ERVJfSDI2NCkgewogICAgICAgICAgICAgQUxPR0koIkZvcmNlIHRvIHVzZSBBVkMgYmFzZWxpbmUgcHJvZmlsZSIpOwogICAgICAgICAgICAgc2V0UGFyYW1WaWRlb0VuY29kZXJQcm9maWxlKE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUpOworICAgICAgICAgICAgLy8gc2V0IDAgZm9yIGludmFsaWQgbGV2ZWxzIC0gdGhpcyB3aWxsIGJlIHJlamVjdGVkIGJ5IHRoZQorICAgICAgICAgICAgLy8gY29kZWMgaWYgaXQgY2Fubm90IGhhbmRsZSBpdCBkdXJpbmcgY29uZmlndXJlCisgICAgICAgICAgICBzZXRQYXJhbVZpZGVvRW5jb2RlckxldmVsKEFDb2RlYzo6Z2V0QVZDTGV2ZWxGb3IoCisgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWVXaWR0aCwgdmlkZW9GcmFtZUhlaWdodCwgdmlkZW9GcmFtZVJhdGUsIHZpZGVvQml0UmF0ZSkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldERlZmF1bHRWaWRlb0VuY29kZXJJZk5lY2Vzc2FyeSgpIHsKKyAgICBpZiAobVZpZGVvRW5jb2RlciA9PSBWSURFT19FTkNPREVSX0RFRkFVTFQpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CisgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIFZQOCBmb3IgV0VCTSByZWNvcmRpbmcKKyAgICAgICAgICAgIG1WaWRlb0VuY29kZXIgPSBWSURFT19FTkNPREVSX1ZQODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHBpY2sgdGhlIGRlZmF1bHQgZW5jb2RlciBmb3IgQ0FNQ09SREVSX1FVQUxJVFlfTE9XCisgICAgICAgICAgICBpbnQgdmlkZW9Db2RlYyA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgInZpZC5jb2RlYyIsIG1DYW1lcmFJZCwgQ0FNQ09SREVSX1FVQUxJVFlfTE9XKTsKKworICAgICAgICAgICAgaWYgKHZpZGVvQ29kZWMgPiBWSURFT19FTkNPREVSX0RFRkFVTFQgJiYKKyAgICAgICAgICAgICAgICB2aWRlb0NvZGVjIDwgVklERU9fRU5DT0RFUl9MSVNUX0VORCkgeworICAgICAgICAgICAgICAgIG1WaWRlb0VuY29kZXIgPSAodmlkZW9fZW5jb2Rlcil2aWRlb0NvZGVjOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIEguMjY0IGlmIGNhbWNvcmRlciBwcm9maWxlIG5vdCBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICBtVmlkZW9FbmNvZGVyID0gVklERU9fRU5DT0RFUl9IMjY0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTI3Nyw0OSArMTM3NSwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgICAgICAqbWVkaWFTb3VyY2UgPSBjYW1lcmFTb3VyY2U7Ci0gICAgfSBlbHNlIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0dSQUxMT0NfQlVGRkVSKSB7Ci0gICAgICAgIC8vIElmIHVzaW5nIEdSQWxsb2MgYnVmZmVycywgc2V0dXAgc3VyZmFjZW1lZGlhc291cmNlLgotICAgICAgICAvLyBMYXRlciBhIGhhbmRsZSB0byB0aGF0IHdpbGwgYmUgcGFzc2VkCi0gICAgICAgIC8vIHRvIHRoZSBjbGllbnQgc2lkZSB3aGVuIHF1ZXJpZWQKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBTdXJmYWNlTWVkaWFTb3VyY2UoKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAqbWVkaWFTb3VyY2UgPSBtU3VyZmFjZU1lZGlhU291cmNlOworICAgIH0gZWxzZSBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9TVVJGQUNFKSB7CisgICAgICAgICptZWRpYVNvdXJjZSA9IE5VTEw7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKLS8vIHNldHVwU3VyZmFjZU1lZGlhU291cmNlIGNyZWF0ZXMgYSBzb3VyY2Ugd2l0aCB0aGUgZ2l2ZW4KLS8vIHdpZHRoIGFuZCBoZWlnaHQgYW5kIGZyYW1lcmF0ZS4KLS8vIFRPRE86IFRoaXMgY291bGQgZ28gaW4gYSBzdGF0aWMgZnVuY3Rpb24gaW5zaWRlIFN1cmZhY2VNZWRpYVNvdXJjZQotLy8gc2ltaWxhciB0byB0aGF0IGluIENhbWVyYVNvdXJjZQotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBTdXJmYWNlTWVkaWFTb3VyY2UoKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgbVN1cmZhY2VNZWRpYVNvdXJjZSA9IG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7Ci0gICAgaWYgKG1TdXJmYWNlTWVkaWFTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBpZiAobUZyYW1lUmF0ZSA9PSAtMSkgewotICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSA9IDA7Ci0gICAgICAgIENIRUNLIChtU3VyZmFjZU1lZGlhU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlGcmFtZVJhdGUsICZmcmFtZVJhdGUpKTsKLSAgICAgICAgQUxPR0koIkZyYW1lIHJhdGUgaXMgbm90IGV4cGxpY2l0bHkgc2V0LiBVc2UgdGhlIGN1cnJlbnQgZnJhbWUgIgotICAgICAgICAgICAgICJyYXRlICglZCBmcHMpIiwgZnJhbWVSYXRlKTsKLSAgICAgICAgbUZyYW1lUmF0ZSA9IGZyYW1lUmF0ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBtU3VyZmFjZU1lZGlhU291cmNlLT5zZXRGcmFtZVJhdGUobUZyYW1lUmF0ZSk7Ci0gICAgfQotICAgIENIRUNLKG1GcmFtZVJhdGUgIT0gLTEpOwotCi0gICAgbUlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycyA9Ci0gICAgICAgIG1TdXJmYWNlTWVkaWFTb3VyY2UtPmlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhU291cmNlKAogICAgICAgICBzcDxDYW1lcmFTb3VyY2U+ICpjYW1lcmFTb3VyY2UpIHsKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKQEAgLTEzODMsMjUgKzE0NDYsMjYgQEAKIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBWaWRlb0VuY29kZXIoCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBjYW1lcmFTb3VyY2UsCi0gICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gKnNvdXJjZSkgewogICAgIHNvdXJjZS0+Y2xlYXIoKTsKIAotICAgIHNwPE1ldGFEYXRhPiBlbmNfbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIHZpZGVvQml0UmF0ZSk7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlGcmFtZVJhdGUsIG1GcmFtZVJhdGUpOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKIAogICAgIHN3aXRjaCAobVZpZGVvRW5jb2RlcikgewogICAgICAgICBjYXNlIFZJREVPX0VOQ09ERVJfSDI2MzoKLSAgICAgICAgICAgIGVuY19tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBWSURFT19FTkNPREVSX01QRUdfNF9TUDoKLSAgICAgICAgICAgIGVuY19tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZJREVPX0VOQ09ERVJfSDI2NDoKLSAgICAgICAgICAgIGVuY19tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9WUDg6CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtMTQwOSw1OSArMTQ3Myw4MCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBjYW1lcmFTb3VyY2UtPmdldEZvcm1hdCgpOworICAgIGlmIChjYW1lcmFTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGNhbWVyYVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CiAKLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgc2xpY2VIZWlnaHQsIGNvbG9yRm9ybWF0OwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTdHJpZGUsICZzdHJpZGUpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNsaWNlSGVpZ2h0LCAmc2xpY2VIZWlnaHQpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmY29sb3JGb3JtYXQpKTsKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHNsaWNlSGVpZ2h0LCBjb2xvckZvcm1hdDsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U3RyaWRlLCAmc3RyaWRlKSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2xpY2VIZWlnaHQsICZzbGljZUhlaWdodCkpOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmY29sb3JGb3JtYXQpKTsKIAotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUlGcmFtZXNJbnRlcnZhbCwgbUlGcmFtZXNJbnRlcnZhbFNlYyk7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlTdHJpZGUsIHN0cmlkZSk7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlTbGljZUhlaWdodCwgc2xpY2VIZWlnaHQpOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCB3aWR0aCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIGhlaWdodCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInN0cmlkZSIsIHN0cmlkZSk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNsaWNlLWhlaWdodCIsIHNsaWNlSGVpZ2h0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgY29sb3JGb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgbVZpZGVvV2lkdGgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCBtVmlkZW9IZWlnaHQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzdHJpZGUiLCBtVmlkZW9XaWR0aCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNsaWNlLWhlaWdodCIsIG1WaWRlb1dpZHRoKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUpOworCisgICAgICAgIC8vIHNldCB1cCB0aW1lIGxhcHNlL3Nsb3cgbW90aW9uIGZvciBzdXJmYWNlIHNvdXJjZQorICAgICAgICBpZiAobUNhcHR1cmVUaW1lTGFwc2UpIHsKKyAgICAgICAgICAgIGlmIChtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyA8PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgdmFsdWU6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50NjQoInRpbWUtbGFwc2UiLAorICAgICAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3JtYXQtPnNldEludDMyKCJiaXRyYXRlIiwgbVZpZGVvQml0UmF0ZSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiZnJhbWUtcmF0ZSIsIG1GcmFtZVJhdGUpOworICAgIGZvcm1hdC0+c2V0SW50MzIoImktZnJhbWUtaW50ZXJ2YWwiLCBtSUZyYW1lc0ludGVydmFsU2VjKTsKKwogICAgIGlmIChtVmlkZW9UaW1lU2NhbGUgPiAwKSB7Ci0gICAgICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCBtVmlkZW9UaW1lU2NhbGUpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ0aW1lLXNjYWxlIiwgbVZpZGVvVGltZVNjYWxlKTsKICAgICB9CiAgICAgaWYgKG1WaWRlb0VuY29kZXJQcm9maWxlICE9IC0xKSB7Ci0gICAgICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCBtVmlkZW9FbmNvZGVyUHJvZmlsZSk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb2ZpbGUiLCBtVmlkZW9FbmNvZGVyUHJvZmlsZSk7CiAgICAgfQogICAgIGlmIChtVmlkZW9FbmNvZGVyTGV2ZWwgIT0gLTEpIHsKLSAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlWaWRlb0xldmVsLCBtVmlkZW9FbmNvZGVyTGV2ZWwpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJsZXZlbCIsIG1WaWRlb0VuY29kZXJMZXZlbCk7CiAgICAgfQogCi0gICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgdWludDMyX3QgZW5jb2Rlcl9mbGFncyA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogICAgIGlmIChtSXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzKSB7Ci0gICAgICAgIGVuY29kZXJfZmxhZ3MgfD0gT01YQ29kZWM6OmtTdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnM7CisgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWNTb3VyY2U6OkZMQUdfVVNFX01FVEFEQVRBX0lOUFVUOwogICAgIH0KIAotICAgIC8vIERvIG5vdCB3YWl0IGZvciBhbGwgdGhlIGlucHV0IGJ1ZmZlcnMgdG8gYmVjb21lIGF2YWlsYWJsZS4KLSAgICAvLyBUaGlzIGdpdmUgdGltZWxhcHNlIHZpZGVvIHJlY29yZGluZyBmYXN0ZXIgcmVzcG9uc2UgaW4KLSAgICAvLyByZWNlaXZpbmcgb3V0cHV0IGZyb20gdmlkZW8gZW5jb2RlciBjb21wb25lbnQuCi0gICAgaWYgKG1DYXB0dXJlVGltZUxhcHNlKSB7Ci0gICAgICAgIGVuY29kZXJfZmxhZ3MgfD0gT01YQ29kZWM6OmtPbmx5U3VibWl0T25lSW5wdXRCdWZmZXJBdE9uZVRpbWU7CisgICAgaWYgKGNhbWVyYVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWNTb3VyY2U6OkZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQ7CiAgICAgfQogCi0gICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICAgICAgY2xpZW50LmludGVyZmFjZSgpLCBlbmNfbWV0YSwKLSAgICAgICAgICAgIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywgY2FtZXJhU291cmNlLAotICAgICAgICAgICAgTlVMTCwgZW5jb2Rlcl9mbGFncyk7CisgICAgc3A8TWVkaWFDb2RlY1NvdXJjZT4gZW5jb2RlciA9CisgICAgICAgICAgICBNZWRpYUNvZGVjU291cmNlOjpDcmVhdGUobUxvb3BlciwgZm9ybWF0LCBjYW1lcmFTb3VyY2UsIGZsYWdzKTsKICAgICBpZiAoZW5jb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gY3JlYXRlIHRoZSBlbmNvZGVyIik7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIHZpZGVvIGVuY29kZXIiKTsKICAgICAgICAgLy8gV2hlbiB0aGUgZW5jb2RlciBmYWlscyB0byBiZSBjcmVhdGVkLCB3ZSBuZWVkCiAgICAgICAgIC8vIHJlbGVhc2UgdGhlIGNhbWVyYSBzb3VyY2UgZHVlIHRvIHRoZSBjYW1lcmEncyBsb2NrCiAgICAgICAgIC8vIGFuZCB1bmxvY2sgbWVjaGFuaXNtLgotICAgICAgICBjYW1lcmFTb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgaWYgKGNhbWVyYVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjYW1lcmFTb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKKyAgICBpZiAoY2FtZXJhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgbUdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IGVuY29kZXItPmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgIH0KKwogICAgICpzb3VyY2UgPSBlbmNvZGVyOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTQ5NSwxOCArMTU4MCwyMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHNFJlY29yZGluZygKLSAgICAgICAgaW50IG91dHB1dEZkLAotICAgICAgICBpbnQzMl90IHZpZGVvV2lkdGgsIGludDMyX3QgdmlkZW9IZWlnaHQsCi0gICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAotICAgICAgICBpbnQzMl90ICp0b3RhbEJpdFJhdGUsCi0gICAgICAgIHNwPE1lZGlhV3JpdGVyPiAqbWVkaWFXcml0ZXIpIHsKLSAgICBtZWRpYVdyaXRlci0+Y2xlYXIoKTsKLSAgICAqdG90YWxCaXRSYXRlID0gMDsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTVBFRzRvcldFQk1SZWNvcmRpbmcoKSB7CisgICAgbVdyaXRlci5jbGVhcigpOworICAgIG1Ub3RhbEJpdFJhdGUgPSAwOworCiAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgc3A8TWVkaWFXcml0ZXI+IHdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihvdXRwdXRGZCk7CisgICAgc3A8TWVkaWFXcml0ZXI+IHdyaXRlcjsKKyAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKKyAgICAgICAgd3JpdGVyID0gbmV3IFdlYm1Xcml0ZXIobU91dHB1dEZkKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIobU91dHB1dEZkKTsKKyAgICB9CiAKICAgICBpZiAobVZpZGVvU291cmNlIDwgVklERU9fU09VUkNFX0xJU1RfRU5EKSB7CisgICAgICAgIHNldERlZmF1bHRWaWRlb0VuY29kZXJJZk5lY2Vzc2FyeSgpOwogCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBtZWRpYVNvdXJjZTsKICAgICAgICAgZXJyID0gc2V0dXBNZWRpYVNvdXJjZSgmbWVkaWFTb3VyY2UpOwpAQCAtMTUxNSwzMSArMTYwMiwzNCBAQAogICAgICAgICB9CiAKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXI7Ci0gICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1lZGlhU291cmNlLCB2aWRlb0JpdFJhdGUsICZlbmNvZGVyKTsKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsICZlbmNvZGVyKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCiAgICAgICAgIHdyaXRlci0+YWRkU291cmNlKGVuY29kZXIpOwotICAgICAgICAqdG90YWxCaXRSYXRlICs9IHZpZGVvQml0UmF0ZTsKKyAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtVmlkZW9CaXRSYXRlOwogICAgIH0KIAotICAgIC8vIEF1ZGlvIHNvdXJjZSBpcyBhZGRlZCBhdCB0aGUgZW5kIGlmIGl0IGV4aXN0cy4KLSAgICAvLyBUaGlzIGhlbHAgbWFrZSBzdXJlIHRoYXQgdGhlICJyZWNvZGluZyIgc291bmQgaXMgc3VwcHJlc3NlZCBmb3IKLSAgICAvLyBjYW1jb3JkZXIgYXBwbGljYXRpb25zIGluIHRoZSByZWNvcmRlZCBmaWxlcy4KLSAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlICYmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkpIHsKLSAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKLSAgICAgICAgKnRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOwotICAgIH0KKyAgICBpZiAobU91dHB1dEZvcm1hdCAhPSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKKyAgICAgICAgLy8gQXVkaW8gc291cmNlIGlzIGFkZGVkIGF0IHRoZSBlbmQgaWYgaXQgZXhpc3RzLgorICAgICAgICAvLyBUaGlzIGhlbHAgbWFrZSBzdXJlIHRoYXQgdGhlICJyZWNvZGluZyIgc291bmQgaXMgc3VwcHJlc3NlZCBmb3IKKyAgICAgICAgLy8gY2FtY29yZGVyIGFwcGxpY2F0aW9ucyBpbiB0aGUgcmVjb3JkZWQgZmlsZXMuCisgICAgICAgIC8vIFRPRE8gQXVkaW8gc291cmNlIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZCBmb3Igd2VibSBvdXRwdXQ7IHZvcmJpcyBlbmNvZGVyIG5lZWRlZC4KKyAgICAgICAgaWYgKCFtQ2FwdHVyZVRpbWVMYXBzZSAmJiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpKSB7CisgICAgICAgICAgICBlcnIgPSBzZXR1cEF1ZGlvRW5jb2Rlcih3cml0ZXIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIG1Ub3RhbEJpdFJhdGUgKz0gbUF1ZGlvQml0UmF0ZTsKKyAgICAgICAgfQogCi0gICAgaWYgKG1JbnRlcmxlYXZlRHVyYXRpb25VcyA+IDApIHsKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KLSAgICAgICAgICAgIHNldEludGVybGVhdmVEdXJhdGlvbihtSW50ZXJsZWF2ZUR1cmF0aW9uVXMpOwotICAgIH0KLSAgICBpZiAobUxvbmdpdHVkZXgxMDAwMCA+IC0zNjAwMDAwICYmIG1MYXRpdHVkZXgxMDAwMCA+IC0zNjAwMDAwKSB7Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+Ci0gICAgICAgICAgICBzZXRHZW9EYXRhKG1MYXRpdHVkZXgxMDAwMCwgbUxvbmdpdHVkZXgxMDAwMCk7CisgICAgICAgIGlmIChtSW50ZXJsZWF2ZUR1cmF0aW9uVXMgPiAwKSB7CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE1QRUc0V3JpdGVyICo+KHdyaXRlci5nZXQoKSktPgorICAgICAgICAgICAgICAgIHNldEludGVybGVhdmVEdXJhdGlvbihtSW50ZXJsZWF2ZUR1cmF0aW9uVXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtTG9uZ2l0dWRleDEwMDAwID4gLTM2MDAwMDAgJiYgbUxhdGl0dWRleDEwMDAwID4gLTM2MDAwMDApIHsKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+CisgICAgICAgICAgICAgICAgc2V0R2VvRGF0YShtTGF0aXR1ZGV4MTAwMDAsIG1Mb25naXR1ZGV4MTAwMDApOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChtTWF4RmlsZUR1cmF0aW9uVXMgIT0gMCkgewogICAgICAgICB3cml0ZXItPnNldE1heEZpbGVEdXJhdGlvbihtTWF4RmlsZUR1cmF0aW9uVXMpOwpAQCAtMTU0Nyw1NCArMTYzNywzOSBAQAogICAgIGlmIChtTWF4RmlsZVNpemVCeXRlcyAhPSAwKSB7CiAgICAgICAgIHdyaXRlci0+c2V0TWF4RmlsZVNpemUobU1heEZpbGVTaXplQnl0ZXMpOwogICAgIH0KLQotICAgIG1TdGFydFRpbWVPZmZzZXRNcyA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFN0YXJ0VGltZU9mZnNldE1zKG1DYW1lcmFJZCk7CisgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfREVGQVVMVAorICAgICAgICAgICAgfHwgbVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9DQU1FUkEpIHsKKyAgICAgICAgbVN0YXJ0VGltZU9mZnNldE1zID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0U3RhcnRUaW1lT2Zmc2V0TXMobUNhbWVyYUlkKTsKKyAgICB9IGVsc2UgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfU1VSRkFDRSkgeworICAgICAgICAvLyBzdXJmYWNlIHNvdXJjZSBkb2Vzbid0IG5lZWQgbGFyZ2UgaW5pdGlhbCBkZWxheQorICAgICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMgPSAyMDA7CisgICAgfQogICAgIGlmIChtU3RhcnRUaW1lT2Zmc2V0TXMgPiAwKSB7Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+Ci0gICAgICAgICAgICBzZXRTdGFydFRpbWVPZmZzZXRNcyhtU3RhcnRUaW1lT2Zmc2V0TXMpOworICAgICAgICB3cml0ZXItPnNldFN0YXJ0VGltZU9mZnNldE1zKG1TdGFydFRpbWVPZmZzZXRNcyk7CiAgICAgfQogCiAgICAgd3JpdGVyLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOwotICAgICptZWRpYVdyaXRlciA9IHdyaXRlcjsKKyAgICBtV3JpdGVyID0gd3JpdGVyOwogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUc0TWV0YURhdGEoaW50NjRfdCBzdGFydFRpbWVVcywgaW50MzJfdCB0b3RhbEJpdFJhdGUsCi0gICAgICAgIHNwPE1ldGFEYXRhPiAqbWV0YSkgewordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUc0b3JXRUJNTWV0YURhdGEoc3A8TWV0YURhdGE+ICptZXRhKSB7CisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7CiAgICAgKCptZXRhKS0+c2V0SW50NjQoa0tleVRpbWUsIHN0YXJ0VGltZVVzKTsKICAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG1PdXRwdXRGb3JtYXQpOwotICAgICgqbWV0YSktPnNldEludDMyKGtLZXlCaXRSYXRlLCB0b3RhbEJpdFJhdGUpOwotICAgICgqbWV0YSktPnNldEludDMyKGtLZXk2NEJpdEZpbGVPZmZzZXQsIG1Vc2U2NEJpdEZpbGVPZmZzZXQpOworICAgICgqbWV0YSktPnNldEludDMyKGtLZXlCaXRSYXRlLCBtVG90YWxCaXRSYXRlKTsKICAgICBpZiAobU1vdmllVGltZVNjYWxlID4gMCkgewogICAgICAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCBtTW92aWVUaW1lU2NhbGUpOwogICAgIH0KLSAgICBpZiAobVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA+IDApIHsKLSAgICAgICAgKCptZXRhKS0+c2V0SW50NjQoa0tleVRyYWNrVGltZVN0YXR1cywgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25Vcyk7CisgICAgaWYgKG1PdXRwdXRGb3JtYXQgIT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CisgICAgICAgICgqbWV0YSktPnNldEludDMyKGtLZXk2NEJpdEZpbGVPZmZzZXQsIG1Vc2U2NEJpdEZpbGVPZmZzZXQpOworICAgICAgICBpZiAobVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA+IDApIHsKKyAgICAgICAgICAgICgqbWV0YSktPnNldEludDY0KGtLZXlUcmFja1RpbWVTdGF0dXMsIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtUm90YXRpb25EZWdyZWVzICE9IDApIHsKKyAgICAgICAgICAgICgqbWV0YSktPnNldEludDMyKGtLZXlSb3RhdGlvbiwgbVJvdGF0aW9uRGVncmVlcyk7CisgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKG1Sb3RhdGlvbkRlZ3JlZXMgIT0gMCkgewotICAgICAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIG1Sb3RhdGlvbkRlZ3JlZXMpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRNUEVHNFJlY29yZGluZygpIHsKLSAgICBpbnQzMl90IHRvdGFsQml0UmF0ZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cE1QRUc0UmVjb3JkaW5nKAotICAgICAgICAgICAgbU91dHB1dEZkLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LAotICAgICAgICAgICAgbVZpZGVvQml0UmF0ZSwgJnRvdGFsQml0UmF0ZSwgJm1Xcml0ZXIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzZXR1cE1QRUc0TWV0YURhdGEoc3RhcnRUaW1lVXMsIHRvdGFsQml0UmF0ZSwgJm1ldGEpOwotCi0gICAgZXJyID0gbVdyaXRlci0+c3RhcnQobWV0YS5nZXQoKSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cGF1c2UoKSB7CkBAIC0xNjM2LDYgKzE3MTEsOCBAQAogICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CiAgICAgfQogCisgICAgbUdyYXBoaWNCdWZmZXJQcm9kdWNlci5jbGVhcigpOworCiAgICAgaWYgKG1PdXRwdXRGZCA+PSAwKSB7CiAgICAgICAgIDo6Y2xvc2UobU91dHB1dEZkKTsKICAgICAgICAgbU91dHB1dEZkID0gLTE7CkBAIC0xNjU1LDcgKzE3MzIsNiBAQAogICAgICAgICBhZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOwogICAgIH0KIAotCiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtMTY3Nyw3ICsxNzUzLDcgQEAKICAgICAvLyBEZWZhdWx0IHBhcmFtZXRlcnMKICAgICBtT3V0cHV0Rm9ybWF0ICA9IE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOwogICAgIG1BdWRpb0VuY29kZXIgID0gQVVESU9fRU5DT0RFUl9BTVJfTkI7Ci0gICAgbVZpZGVvRW5jb2RlciAgPSBWSURFT19FTkNPREVSX0gyNjM7CisgICAgbVZpZGVvRW5jb2RlciAgPSBWSURFT19FTkNPREVSX0RFRkFVTFQ7CiAgICAgbVZpZGVvV2lkdGggICAgPSAxNzY7CiAgICAgbVZpZGVvSGVpZ2h0ICAgPSAxNDQ7CiAgICAgbUZyYW1lUmF0ZSAgICAgPSAtMTsKQEAgLTE3MDcsNiArMTc4Myw3IEBACiAgICAgbVJvdGF0aW9uRGVncmVlcyA9IDA7CiAgICAgbUxhdGl0dWRleDEwMDAwID0gLTM2MDAwMDA7CiAgICAgbUxvbmdpdHVkZXgxMDAwMCA9IC0zNjAwMDAwOworICAgIG1Ub3RhbEJpdFJhdGUgPSAwOwogCiAgICAgbU91dHB1dEZkID0gLTE7CiAKQEAgLTE3NDcsMTUgKzE4MjQsMTUgQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBGaWxlIGZvcm1hdDogJWRcbiIsIG1PdXRwdXRGb3JtYXQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIE1heCBmaWxlIHNpemUgKGJ5dGVzKTogJWxsZFxuIiwgbU1heEZpbGVTaXplQnl0ZXMpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgTWF4IGZpbGUgc2l6ZSAoYnl0ZXMpOiAlIiBQUklkNjQgIlxuIiwgbU1heEZpbGVTaXplQnl0ZXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIE1heCBmaWxlIGR1cmF0aW9uICh1cyk6ICVsbGRcbiIsIG1NYXhGaWxlRHVyYXRpb25Vcyk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBNYXggZmlsZSBkdXJhdGlvbiAodXMpOiAlIiBQUklkNjQgIlxuIiwgbU1heEZpbGVEdXJhdGlvblVzKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBGaWxlIG9mZnNldCBsZW5ndGggKGJpdHMpOiAlZFxuIiwgbVVzZTY0Qml0RmlsZU9mZnNldD8gNjQ6IDMyKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBJbnRlcmxlYXZlIGR1cmF0aW9uICh1cyk6ICVkXG4iLCBtSW50ZXJsZWF2ZUR1cmF0aW9uVXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIFByb2dyZXNzIG5vdGlmaWNhdGlvbjogJWxsZCB1c1xuIiwgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25Vcyk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBQcm9ncmVzcyBub3RpZmljYXRpb246ICUiIFBSSWQ2NCAiIHVzXG4iLCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgQXVkaW9cbiIpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCmluZGV4IDMxZjA5ZTAuLjU0YzM4ZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaApAQCAtMzcsNiArMzcsNyBAQAogY2xhc3MgTWVkaWFQcm9maWxlczsKIGNsYXNzIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CiBjbGFzcyBTdXJmYWNlTWVkaWFTb3VyY2U7CitjbGFzcyBBTG9vcGVyOwogCiBzdHJ1Y3QgU3RhZ2VmcmlnaHRSZWNvcmRlciA6IHB1YmxpYyBNZWRpYVJlY29yZGVyQmFzZSB7CiAgICAgU3RhZ2VmcmlnaHRSZWNvcmRlcigpOwpAQCAtMTA2LDYgKzEwNyw3IEBACiAgICAgaW50MzJfdCBtTGF0aXR1ZGV4MTAwMDA7CiAgICAgaW50MzJfdCBtTG9uZ2l0dWRleDEwMDAwOwogICAgIGludDMyX3QgbVN0YXJ0VGltZU9mZnNldE1zOworICAgIGludDMyX3QgbVRvdGFsQml0UmF0ZTsKIAogICAgIGJvb2wgbUNhcHR1cmVUaW1lTGFwc2U7CiAgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKQEAgLTEyMiwyMiArMTI0LDE3IEBACiAgICAgLy8gQW4gPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHBvaW50ZXIKICAgICAvLyB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCBzaWRlIHVzaW5nIHdoaWNoIHRoZQogICAgIC8vIGZyYW1lIGJ1ZmZlcnMgd2lsbCBiZSBxdWV1ZWQgYW5kIGRlcXVldWVkCi0gICAgc3A8U3VyZmFjZU1lZGlhU291cmNlPiBtU3VyZmFjZU1lZGlhU291cmNlOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKIAotICAgIHN0YXR1c190IHNldHVwTVBFRzRSZWNvcmRpbmcoCi0gICAgICAgIGludCBvdXRwdXRGZCwKLSAgICAgICAgaW50MzJfdCB2aWRlb1dpZHRoLCBpbnQzMl90IHZpZGVvSGVpZ2h0LAotICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKLSAgICAgICAgaW50MzJfdCAqdG90YWxCaXRSYXRlLAotICAgICAgICBzcDxNZWRpYVdyaXRlcj4gKm1lZGlhV3JpdGVyKTsKLSAgICB2b2lkIHNldHVwTVBFRzRNZXRhRGF0YShpbnQ2NF90IHN0YXJ0VGltZVVzLCBpbnQzMl90IHRvdGFsQml0UmF0ZSwKLSAgICAgICAgc3A8TWV0YURhdGE+ICptZXRhKTsKLSAgICBzdGF0dXNfdCBzdGFydE1QRUc0UmVjb3JkaW5nKCk7Ci0gICAgc3RhdHVzX3Qgc3RhcnRBTVJSZWNvcmRpbmcoKTsKLSAgICBzdGF0dXNfdCBzdGFydEFBQ1JlY29yZGluZygpOwotICAgIHN0YXR1c190IHN0YXJ0UmF3QXVkaW9SZWNvcmRpbmcoKTsKLSAgICBzdGF0dXNfdCBzdGFydFJUUFJlY29yZGluZygpOwotICAgIHN0YXR1c190IHN0YXJ0TVBFRzJUU1JlY29yZGluZygpOworICAgIHN0YXR1c190IHByZXBhcmVJbnRlcm5hbCgpOworICAgIHN0YXR1c190IHNldHVwTVBFRzRvcldFQk1SZWNvcmRpbmcoKTsKKyAgICB2b2lkIHNldHVwTVBFRzRvcldFQk1NZXRhRGF0YShzcDxNZXRhRGF0YT4gKm1ldGEpOworICAgIHN0YXR1c190IHNldHVwQU1SUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBBQUNSZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBSVFBSZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBzZXR1cE1QRUcyVFNSZWNvcmRpbmcoKTsKICAgICBzcDxNZWRpYVNvdXJjZT4gY3JlYXRlQXVkaW9Tb3VyY2UoKTsKICAgICBzdGF0dXNfdCBjaGVja1ZpZGVvRW5jb2RlckNhcGFiaWxpdGllcygKICAgICAgICAgICAgIGJvb2wgKnN1cHBvcnRzQ2FtZXJhU291cmNlTWV0YURhdGFNb2RlKTsKQEAgLTE0NywxNCArMTQ0LDggQEAKICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIHZpZGVvc291cmNlIHR5cGUKICAgICBzdGF0dXNfdCBzZXR1cE1lZGlhU291cmNlKHNwPE1lZGlhU291cmNlPiAqbWVkaWFTb3VyY2UpOwogICAgIHN0YXR1c190IHNldHVwQ2FtZXJhU291cmNlKHNwPENhbWVyYVNvdXJjZT4gKmNhbWVyYVNvdXJjZSk7Ci0gICAgLy8gc2V0dXAgdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBmb3IgdGhlIGVuY29kZXIKLSAgICBzdGF0dXNfdCBzZXR1cFN1cmZhY2VNZWRpYVNvdXJjZSgpOwotCiAgICAgc3RhdHVzX3Qgc2V0dXBBdWRpb0VuY29kZXIoY29uc3Qgc3A8TWVkaWFXcml0ZXI+JiB3cml0ZXIpOwotICAgIHN0YXR1c190IHNldHVwVmlkZW9FbmNvZGVyKAotICAgICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGNhbWVyYVNvdXJjZSwKLSAgICAgICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAotICAgICAgICAgICAgc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2UpOworICAgIHN0YXR1c190IHNldHVwVmlkZW9FbmNvZGVyKHNwPE1lZGlhU291cmNlPiBjYW1lcmFTb3VyY2UsIHNwPE1lZGlhU291cmNlPiAqc291cmNlKTsKIAogICAgIC8vIEVuY29kaW5nIHBhcmFtZXRlciBoYW5kbGluZyB1dGlsaXRpZXMKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSk7CkBAIC0xODcsNiArMTc4LDcgQEAKICAgICB2b2lkIGNsaXBBdWRpb1NhbXBsZVJhdGUoKTsKICAgICB2b2lkIGNsaXBOdW1iZXJPZkF1ZGlvQ2hhbm5lbHMoKTsKICAgICB2b2lkIHNldERlZmF1bHRQcm9maWxlSWZOZWNlc3NhcnkoKTsKKyAgICB2b2lkIHNldERlZmF1bHRWaWRlb0VuY29kZXJJZk5lY2Vzc2FyeSgpOwogCiAKICAgICBTdGFnZWZyaWdodFJlY29yZGVyKGNvbnN0IFN0YWdlZnJpZ2h0UmVjb3JkZXIgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmNwcAppbmRleCA1ZDk3MjhhLi41Nzk1NzczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5jcHAKQEAgLTExMyw3ICsxMTMsOSBAQAogLy8gQ3JlYXRlIHRoZSB0ZXN0IHBsYXllci4KIC8vIENhbGwgc2V0RGF0YVNvdXJjZSBvbiB0aGUgdGVzdCBwbGF5ZXIgd2l0aCB0aGUgdXJsIGluIHBhcmFtLgogc3RhdHVzX3QgVGVzdFBsYXllclN0dWI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIGlmICghaXNUZXN0VXJsKHVybCkgfHwgTlVMTCAhPSBtSGFuZGxlKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0xNjIsNyArMTY0LDcgQEAKICAgICB9CiAKICAgICBtUGxheWVyID0gKCptTmV3UGxheWVyKSgpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXREYXRhU291cmNlKG1Db250ZW50VXJsLCBoZWFkZXJzKTsKKyAgICByZXR1cm4gbVBsYXllci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgbUNvbnRlbnRVcmwsIGhlYWRlcnMpOwogfQogCiAvLyBJbnRlcm5hbCBjbGVhbnVwLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAppbmRleCBhMzgwMmViLi41NWJmMmM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaApAQCAtNjYsNyArNjYsOSBAQAogCiAgICAgLy8gQHBhcmFtIHVybCBTaG91bGQgYmUgYSB0ZXN0IHVybC4gU2VlIGNsYXNzIGNvbW1lbnQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgLy8gVGVzdCBwbGF5ZXIgZm9yIGEgZmlsZSBkZXNjcmlwdG9yIHNvdXJjZSBpcyBub3Qgc3VwcG9ydGVkLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQsIGludDY0X3QsIGludDY0X3QpICB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1ZjVmZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcApAQCAtMCwwICsxLDQ4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmlkZW9GcmFtZVNjaGVkdWxlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KKyNpbmNsdWRlIDx1aS9EaXNwbGF5U3RhdEluZm8uaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworI2luY2x1ZGUgIlZpZGVvRnJhbWVTY2hlZHVsZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrTmFub3NJbjFzID0gMTAwMDAwMDAwMDsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBUICpsaHMsIGNvbnN0IFQgKnJocykgeworICAgIGlmICgqbGhzIDwgKnJocykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmICgqbGhzID4gKnJocykgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSA9IDM7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyOjprSGlzdG9yeVNpemU7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IDM7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmtIaXN0b3J5U2l6ZTsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrUHJlY2lzaW9uID0gMTI7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtFcnJvclRocmVzaG9sZCA9ICgxIDw8IChrUHJlY2lzaW9uICogMikpIC8gMTA7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrTXVsdGlwbGVzVGhyZXNob2xkRGl2ID0gNDsgICAgICAgICAgICAvLyAyNSUKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtSZUZpdFRocmVzaG9sZERpdiA9IDEwMDsgICAgICAgICAgICAgIC8vIDElCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4QWxsb3dlZEZyYW1lU2tpcCA9IGtOYW5vc0luMXM7ICAgICAvLyAxIHNlYworc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pblBlcmlvZCA9IGtOYW5vc0luMXMgLyAxMjA7ICAgICAgICAgLy8gMTIwSHoKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtSZWZpdFJlZnJlc2hQZXJpb2QgPSAxMCAqIGtOYW5vc0luMXM7IC8vIDEwIHNlYworCitWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OlBMTCgpCisgICAgOiBtUGVyaW9kKC0xKSwKKyAgICAgIG1QaGFzZSgwKSwKKyAgICAgIG1QcmltZWQoZmFsc2UpLAorICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZygwKSwKKyAgICAgIG1MYXN0VGltZSgtMSksCisgICAgICBtTnVtU2FtcGxlcygwKSB7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpyZXNldChmbG9hdCBmcHMpIHsKKyAgICAvL3Rlc3QoKTsKKworICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOworICAgIG1MYXN0VGltZSA9IC0xOworCisgICAgLy8gc2V0IHVwIG9yIHJlc2V0IHZpZGVvIFBMTAorICAgIGlmIChmcHMgPD0gMC5mKSB7CisgICAgICAgIG1QZXJpb2QgPSAtMTsKKyAgICAgICAgbVByaW1lZCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJyZXNldCBhdCAlLjFmIGZwcyIsIGZwcyk7CisgICAgICAgIG1QZXJpb2QgPSAobnNlY3NfdCkoMWU5IC8gZnBzICsgMC41KTsKKyAgICAgICAgbVByaW1lZCA9IHRydWU7CisgICAgfQorCisgICAgcmVzdGFydCgpOworfQorCisvLyByZXNldCBQTEwgYnV0IGtlZXAgcHJldmlvdXMgcGVyaW9kIGVzdGltYXRlCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cmVzdGFydCgpIHsKKyAgICBtTnVtU2FtcGxlcyA9IDA7CisgICAgbVBoYXNlID0gLTE7Cit9CisKKyNpZiAwCisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjp0ZXN0KCkgeworICAgIG5zZWNzX3QgcGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOworICAgIG1UaW1lc1swXSA9IDA7CisgICAgbVRpbWVzWzFdID0gcGVyaW9kOworICAgIG1UaW1lc1syXSA9IHBlcmlvZCAqIDM7CisgICAgbVRpbWVzWzNdID0gcGVyaW9kICogNDsKKyAgICBtVGltZXNbNF0gPSBwZXJpb2QgKiA3OworICAgIG1UaW1lc1s1XSA9IHBlcmlvZCAqIDg7CisgICAgbVRpbWVzWzZdID0gcGVyaW9kICogMTA7CisgICAgbVRpbWVzWzddID0gcGVyaW9kICogMTI7CisgICAgbU51bVNhbXBsZXMgPSA4OworICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgIGZpdCgwLCBwZXJpb2QgKiAxMiAvIDcsIDgsICZhLCAmYiwgJmVycik7CisgICAgLy8gYSA9IDAuOCg1KSsKKyAgICAvLyBiID0gLTAuMTQwOTcoMikrCisgICAgLy8gZXJyID0gMC4yNzUwNTc4KDcwMykrCisgICAgQUxPR0QoImE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCisgICAgICAgICAgICAobG9uZyBsb25nKWEsIChhIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpYiwgKGIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZyllcnIsIChlcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKK30KKworI2VuZGlmCisKK2Jvb2wgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpmaXQoCisgICAgICAgIG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlc1RvVXNlLAorICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpIHsKKyAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKKyAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7CisgICAgfQorCisgICAgaW50NjRfdCBzdW1YID0gMDsKKyAgICBpbnQ2NF90IHN1bVhYID0gMDsKKyAgICBpbnQ2NF90IHN1bVhZID0gMDsKKyAgICBpbnQ2NF90IHN1bVlZID0gMDsKKyAgICBpbnQ2NF90IHN1bVkgPSAwOworCisgICAgaW50NjRfdCB4ID0gMDsgLy8geCB1c3VhbGx5IGlzIGluIFswLi5udW1TYW1wbGVzVG9Vc2UpCisgICAgbnNlY3NfdCBsYXN0VGltZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNhbXBsZXNUb1VzZTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBpeCA9IChtTnVtU2FtcGxlcyAtIG51bVNhbXBsZXNUb1VzZSArIGkpICUga0hpc3RvcnlTaXplOworICAgICAgICBuc2Vjc190IHRpbWUgPSBtVGltZXNbaXhdOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIHggKz0gZGl2Um91bmQodGltZSAtIGxhc3RUaW1lLCBwZXJpb2QpOworICAgICAgICB9CisgICAgICAgIC8vIHkgaXMgdXN1YWxseSBpbiBbLW51bVNhbXBsZXNUb1VzZS4ubnVtU2FtcGxlc1RvVXNlK2tSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZCkgPDwga1ByZWNpc2lvbgorICAgICAgICAvLyAgIGlkZWFsbHkgaW4gWzAuLm51bVNhbXBsZXNUb1VzZSksIGJ1dCBzaGlmdGVkIGJ5IC1udW1TYW1wbGVzVG9Vc2UgZHVyaW5nCisgICAgICAgIC8vICAgcHJpbWluZywgYW5kIHBvc3NpYmx5IHNoaWZ0ZWQgYnkgdXAgdG8ga1JlZml0UmVmcmVzaFBlcmlvZC9rTWluUGVyaW9kCisgICAgICAgIC8vICAgd2hpbGUgd2UgYXJlIG5vdCByZWZpdHRpbmcuCisgICAgICAgIGludDY0X3QgeSA9IGRpdlJvdW5kKHRpbWUgLSBwaGFzZSwgcGVyaW9kID4+IGtQcmVjaXNpb24pOworICAgICAgICBzdW1YICs9IHg7CisgICAgICAgIHN1bVkgKz0geTsKKyAgICAgICAgc3VtWFggKz0geCAqIHg7CisgICAgICAgIHN1bVhZICs9IHggKiB5OworICAgICAgICBzdW1ZWSArPSB5ICogeTsKKyAgICAgICAgbGFzdFRpbWUgPSB0aW1lOworICAgIH0KKworICAgIGludDY0X3QgZGl2ICAgPSBudW1TYW1wbGVzVG9Vc2UgKiBzdW1YWCAtIHN1bVggKiBzdW1YOworICAgIGlmIChkaXYgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCBhX25vbSA9IG51bVNhbXBsZXNUb1VzZSAqIHN1bVhZIC0gc3VtWCAqIHN1bVk7CisgICAgaW50NjRfdCBiX25vbSA9IHN1bVhYICogc3VtWSAgICAgICAgICAgIC0gc3VtWCAqIHN1bVhZOworICAgICphID0gZGl2Um91bmQoYV9ub20sIGRpdik7CisgICAgKmIgPSBkaXZSb3VuZChiX25vbSwgZGl2KTsKKyAgICAvLyBkb24ndCB1c2UgYSBhbmQgYiBkaXJlY3RseSBhcyB0aGUgcm91bmRpbmcgZXJyb3IgaXMgc2lnbmlmaWNhbnQKKyAgICAqZXJyID0gc3VtWVkgLSBkaXZSb3VuZChhX25vbSAqIHN1bVhZICsgYl9ub20gKiBzdW1ZLCBkaXYpOworICAgIEFMT0dWKCJmaXR0aW5nWyV6dV0gYT0lbGxkICglLjZmKSwgYj0lbGxkICglLjZmKSwgZXJyPSVsbGQgKCUuNmYpIiwKKyAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmEsICAgKCphIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmIsICAgKCpiIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmVyciwgKCplcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OnByaW1lKHNpemVfdCBudW1TYW1wbGVzVG9Vc2UpIHsKKyAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKKyAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7CisgICAgfQorICAgIENIRUNLKG51bVNhbXBsZXNUb1VzZSA+PSAzKTsgIC8vIG11c3QgaGF2ZSBhdCBsZWFzdCAzIHNhbXBsZXMKKworICAgIC8vIGVzdGltYXRlIHZpZGVvIGZyYW1lcmF0ZSBmcm9tIGRlbHRhcyBiZXR3ZWVuIHRpbWVzdGFtcHMsIGFuZAorICAgIC8vIDJuZCBvcmRlciBkZWx0YXMKKyAgICBWZWN0b3I8bnNlY3NfdD4gZGVsdGFzOworICAgIG5zZWNzX3QgbGFzdFRpbWUsIGZpcnN0VGltZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNhbXBsZXNUb1VzZTsgKytpKSB7CisgICAgICAgIHNpemVfdCBpbmRleCA9IChtTnVtU2FtcGxlcyAtIG51bVNhbXBsZXNUb1VzZSArIGkpICUga0hpc3RvcnlTaXplOworICAgICAgICBuc2Vjc190IHRpbWUgPSBtVGltZXNbaW5kZXhdOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIGlmICh0aW1lIC0gbGFzdFRpbWUgPiBrTWluUGVyaW9kKSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigiZGVsdGE6ICVsbGQiLCAobG9uZyBsb25nKSh0aW1lIC0gbGFzdFRpbWUpKTsKKyAgICAgICAgICAgICAgICBkZWx0YXMucHVzaCh0aW1lIC0gbGFzdFRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlyc3RUaW1lID0gdGltZTsKKyAgICAgICAgfQorICAgICAgICBsYXN0VGltZSA9IHRpbWU7CisgICAgfQorICAgIGRlbHRhcy5zb3J0KGNvbXBhcmU8bnNlY3NfdD4pOworICAgIHNpemVfdCBudW1EZWx0YXMgPSBkZWx0YXMuc2l6ZSgpOworICAgIGlmIChudW1EZWx0YXMgPiAxKSB7CisgICAgICAgIG5zZWNzX3QgZGVsdGFNaW5MaW1pdCA9IG1heChkZWx0YXNbMF0gLyBrTXVsdGlwbGVzVGhyZXNob2xkRGl2LCBrTWluUGVyaW9kKTsKKyAgICAgICAgbnNlY3NfdCBkZWx0YU1heExpbWl0ID0gZGVsdGFzW251bURlbHRhcyAvIDJdICoga011bHRpcGxlc1RocmVzaG9sZERpdjsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG51bURlbHRhcyAvIDIgKyAxOyBpIDwgbnVtRGVsdGFzOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChkZWx0YXNbaV0gPiBkZWx0YU1heExpbWl0KSB7CisgICAgICAgICAgICAgICAgZGVsdGFzLnJlc2l6ZShpKTsKKyAgICAgICAgICAgICAgICBudW1EZWx0YXMgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnVtRGVsdGFzOyArK2kpIHsKKyAgICAgICAgICAgIG5zZWNzX3QgZGVsdGEybmQgPSBkZWx0YXNbaV0gLSBkZWx0YXNbaSAtIDFdOworICAgICAgICAgICAgaWYgKGRlbHRhMm5kID49IGRlbHRhTWluTGltaXQpIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTI6ICVsbGQiLCAobG9uZyBsb25nKShkZWx0YTJuZCkpOworICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKGRlbHRhMm5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHVzZSB0aGUgb25lIHRoYXQgeWllbGRzIHRoZSBiZXN0IG1hdGNoCisgICAgaW50NjRfdCBiZXN0U2NvcmU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZWx0YXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgbnNlY3NfdCBkZWx0YSA9IGRlbHRhc1tpXTsKKyAgICAgICAgaW50NjRfdCBzY29yZSA9IDA7CisjaWYgMQorICAgICAgICAvLyBzaW1wbGVzdCBzY29yZTogbnVtYmVyIG9mIGRlbHRhcyB0aGF0IGFyZSBuZWFyIG11bHRpcGxlcworICAgICAgICBzaXplX3QgbWF0Y2hlcyA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZGVsdGFzLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICBuc2Vjc190IGVyciA9IHBlcmlvZGljRXJyb3IoZGVsdGFzW2pdLCBkZWx0YSk7CisgICAgICAgICAgICBpZiAoZXJyIDwgZGVsdGEgLyBrTXVsdGlwbGVzVGhyZXNob2xkRGl2KSB7CisgICAgICAgICAgICAgICAgKyttYXRjaGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNjb3JlID0gbWF0Y2hlczsKKyNpZiAwCisgICAgICAgIC8vIGNvdWxkIGJlIHdlaWdoZWQgYnkgdGhlICgxIC0gbm9ybWFsaXplZCBlcnJvcikKKyAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKKyAgICAgICAgICAgIGVyciA9ICgxIDw8ICgyICoga1ByZWNpc2lvbikpIC0gZXJyOworICAgICAgICAgICAgc2NvcmUgKj0gbWF4KDAsIGVycik7CisgICAgICAgIH0KKyNlbmRpZgorI2Vsc2UKKyAgICAgICAgLy8gb3IgdXNlIHRoZSBlcnJvciBhcyBhIG5lZ2F0aXZlIHNjb3JlCisgICAgICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGZpdChmaXJzdFRpbWUsIGRlbHRhLCBudW1TYW1wbGVzVG9Vc2UsICZhLCAmYiwgJmVycik7CisgICAgICAgICAgICBzY29yZSA9IC1kZWx0YSAqIGVycjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChpID09IDAgfHwgc2NvcmUgPiBiZXN0U2NvcmUpIHsKKyAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOworICAgICAgICAgICAgbVBlcmlvZCA9IGRlbHRhOworICAgICAgICAgICAgbVBoYXNlID0gZmlyc3RUaW1lOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJwcmltaW5nWyV6dV0gcGhhc2U6JWxsZCBwZXJpb2Q6JWxsZCIsIG51bVNhbXBsZXNUb1VzZSwgbVBoYXNlLCBtUGVyaW9kKTsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OmFkZFNhbXBsZShuc2Vjc190IHRpbWUpIHsKKyAgICBpZiAobUxhc3RUaW1lID49IDAKKyAgICAgICAgICAgIC8vIGlmIHRpbWUgZ29lcyBiYWNrd2FyZCwgb3Igd2Ugc2tpcHBlZCByZW5kZXJpbmcKKyAgICAgICAgICAgICYmICh0aW1lID4gbUxhc3RUaW1lICsga01heEFsbG93ZWRGcmFtZVNraXAgfHwgdGltZSA8IG1MYXN0VGltZSkpIHsKKyAgICAgICAgcmVzdGFydCgpOworICAgIH0KKworICAgIG1MYXN0VGltZSA9IHRpbWU7CisgICAgbVRpbWVzW21OdW1TYW1wbGVzICUga0hpc3RvcnlTaXplXSA9IHRpbWU7CisgICAgKyttTnVtU2FtcGxlczsKKworICAgIGJvb2wgZG9GaXQgPSB0aW1lID4gbVJlZml0QXQ7CisgICAgaWYgKChtUGVyaW9kIDw9IDAgfHwgIW1QcmltZWQpICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lKSB7CisgICAgICAgIHByaW1lKGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpOworICAgICAgICArK21TYW1wbGVzVXNlZEZvclByaW1pbmc7CisgICAgICAgIGRvRml0ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG1QZXJpb2QgPiAwICYmIG1OdW1TYW1wbGVzID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICBpZiAobVBoYXNlIDwgMCkgeworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBwaGFzZSB0byB0aGUgY3VycmVudCByZW5kZXIgdGltZQorICAgICAgICAgICAgbVBoYXNlID0gdGltZTsKKyAgICAgICAgICAgIGRvRml0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghZG9GaXQpIHsKKyAgICAgICAgICAgIGludDY0X3QgZXJyID0gcGVyaW9kaWNFcnJvcih0aW1lIC0gbVBoYXNlLCBtUGVyaW9kKTsKKyAgICAgICAgICAgIGRvRml0ID0gZXJyID4gbVBlcmlvZCAvIGtSZUZpdFRocmVzaG9sZERpdjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkb0ZpdCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBpZiAoIWZpdChtUGhhc2UsIG1QZXJpb2QsIGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCwgJmEsICZiLCAmZXJyKSkgeworICAgICAgICAgICAgICAgIC8vIHNhbXBsZXMgYXJlIG5vdCBzdWl0YWJsZSBmb3IgZml0dGluZy4gIHRoaXMgbWVhbnMgdGhleSBhcmUKKyAgICAgICAgICAgICAgICAvLyBhbHNvIG5vdCBzdWl0YWJsZSBmb3IgcHJpbWluZy4KKyAgICAgICAgICAgICAgICBBTE9HVigiY291bGQgbm90IGZpdCAtIGtlZXBpbmcgb2xkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGVyaW9kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVBlcmlvZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVJlZml0QXQgPSB0aW1lICsga1JlZml0UmVmcmVzaFBlcmlvZDsKKworICAgICAgICAgICAgbVBoYXNlICs9IChtUGVyaW9kICogYikgPj4ga1ByZWNpc2lvbjsKKyAgICAgICAgICAgIG1QZXJpb2QgPSAobVBlcmlvZCAqIGEpID4+IGtQcmVjaXNpb247CisgICAgICAgICAgICBBTE9HVigibmV3IHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKKworICAgICAgICAgICAgaWYgKGVyciA8IGtFcnJvclRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIGlmICghbVByaW1lZCAmJiBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID49IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByaW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUHJpbWVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1QZXJpb2Q7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUgU2NoZWR1bGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlZmF1bHRWc3luY1BlcmlvZCA9IGtOYW5vc0luMXMgLyA2MDsgIC8vIDYwSHoKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtWc3luY1JlZnJlc2hQZXJpb2QgPSBrTmFub3NJbjFzOyAgICAgICAvLyAxIHNlYworCitWaWRlb0ZyYW1lU2NoZWR1bGVyOjpWaWRlb0ZyYW1lU2NoZWR1bGVyKCkKKyAgICA6IG1Wc3luY1RpbWUoMCksCisgICAgICBtVnN5bmNQZXJpb2QoMCksCisgICAgICBtVnN5bmNSZWZyZXNoQXQoMCksCisgICAgICBtTGFzdFZzeW5jVGltZSgtMSksCisgICAgICBtVGltZUNvcnJlY3Rpb24oMCkgeworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OnVwZGF0ZVZzeW5jKCkgeworICAgIG1Wc3luY1JlZnJlc2hBdCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSArIGtWc3luY1JlZnJlc2hQZXJpb2Q7CisgICAgbVZzeW5jUGVyaW9kID0gMDsKKyAgICBtVnN5bmNUaW1lID0gMDsKKworICAgIC8vIFRPRE86IHNjaGVkdWxlIGZyYW1lcyBmb3IgdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2UKKyAgICAvLyBGb3Igbm93LCBzdXJmYWNlIGZsaW5nZXIgb25seSBzY2hlZHVsZXMgZnJhbWVzIG9uIHRoZSBwcmltYXJ5IGRpc3BsYXkKKyAgICBpZiAobUNvbXBvc2VyID09IE5VTEwpIHsKKyAgICAgICAgU3RyaW5nMTYgbmFtZSgiU3VyZmFjZUZsaW5nZXIiKTsKKyAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgICAgICBtQ29tcG9zZXIgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZUNvbXBvc2VyPihzbS0+Y2hlY2tTZXJ2aWNlKG5hbWUpKTsKKyAgICB9CisgICAgaWYgKG1Db21wb3NlciAhPSBOVUxMKSB7CisgICAgICAgIERpc3BsYXlTdGF0SW5mbyBzdGF0czsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbUNvbXBvc2VyLT5nZXREaXNwbGF5U3RhdHMoTlVMTCAvKiBkaXNwbGF5ICovLCAmc3RhdHMpOworICAgICAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgICAgICBBTE9HVigidnN5bmMgdGltZTolbGxkIHBlcmlvZDolbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzdGF0cy52c3luY1RpbWUsIChsb25nIGxvbmcpc3RhdHMudnN5bmNQZXJpb2QpOworICAgICAgICAgICAgbVZzeW5jVGltZSA9IHN0YXRzLnZzeW5jVGltZTsKKyAgICAgICAgICAgIG1Wc3luY1BlcmlvZCA9IHN0YXRzLnZzeW5jUGVyaW9kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coImdldERpc3BsYXlTdGF0cyByZXR1cm5lZCAlZCIsIHJlcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiY291bGQgbm90IGdldCBzdXJmYWNlIG1Db21wb3NlciBzZXJ2aWNlIik7CisgICAgfQorfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OmluaXQoZmxvYXQgdmlkZW9GcHMpIHsKKyAgICB1cGRhdGVWc3luYygpOworCisgICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKKyAgICBtVGltZUNvcnJlY3Rpb24gPSAwOworCisgICAgbVBsbC5yZXNldCh2aWRlb0Zwcyk7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6cmVzdGFydCgpIHsKKyAgICBtTGFzdFZzeW5jVGltZSA9IC0xOworICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7CisKKyAgICBtUGxsLnJlc3RhcnQoKTsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpnZXRWc3luY1BlcmlvZCgpIHsKKyAgICBpZiAobVZzeW5jUGVyaW9kID4gMCkgeworICAgICAgICByZXR1cm4gbVZzeW5jUGVyaW9kOworICAgIH0KKyAgICByZXR1cm4ga0RlZmF1bHRWc3luY1BlcmlvZDsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpIHsKKyAgICBuc2Vjc190IG9yaWdSZW5kZXJUaW1lID0gcmVuZGVyVGltZTsKKworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIGlmIChub3cgPj0gbVZzeW5jUmVmcmVzaEF0KSB7CisgICAgICAgIHVwZGF0ZVZzeW5jKCk7CisgICAgfQorCisgICAgLy8gd2l0aG91dCBWU1lOQyBpbmZvLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCisgICAgaWYgKG1Wc3luY1BlcmlvZCA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJubyB2c3luYzogcmVuZGVyPSVsbGQiLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOworICAgICAgICByZXR1cm4gcmVuZGVyVGltZTsKKyAgICB9CisKKyAgICAvLyBlbnN1cmUgdnN5bmMgdGltZSBpcyB3ZWxsIGJlZm9yZSAoY29ycmVjdGVkKSByZW5kZXIgdGltZQorICAgIGlmIChtVnN5bmNUaW1lID4gcmVuZGVyVGltZSAtIDQgKiBtVnN5bmNQZXJpb2QpIHsKKyAgICAgICAgbVZzeW5jVGltZSAtPQorICAgICAgICAgICAgKChtVnN5bmNUaW1lIC0gcmVuZGVyVGltZSkgLyBtVnN5bmNQZXJpb2QgKyA1KSAqIG1Wc3luY1BlcmlvZDsKKyAgICB9CisKKyAgICAvLyBWaWRlbyBwcmVzZW50YXRpb24gdGFrZXMgcGxhY2UgYXQgdGhlIFZTWU5DIF9hZnRlcl8gcmVuZGVyVGltZS4gIEFkanVzdCByZW5kZXJUaW1lCisgICAgLy8gc28gdGhpcyBlZmZlY3RpdmVseSBiZWNvbWVzIGEgcm91bmRpbmcgb3BlcmF0aW9uICh0byB0aGUgX2Nsb3Nlc3RfIFZTWU5DLikKKyAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7CisKKyAgICBjb25zdCBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5hZGRTYW1wbGUob3JpZ1JlbmRlclRpbWUpOworICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKKyAgICAgICAgLy8gU21vb3RoIG91dCByZW5kZXJpbmcKKyAgICAgICAgc2l6ZV90IE4gPSAxMjsKKyAgICAgICAgbnNlY3NfdCBmaXZlU2l4dGhEZXYgPQorICAgICAgICAgICAgYWJzKCgodmlkZW9QZXJpb2QgKiA1ICsgbVZzeW5jUGVyaW9kKSAlIChtVnN5bmNQZXJpb2QgKiA2KSkgLSBtVnN5bmNQZXJpb2QpCisgICAgICAgICAgICAgICAgICAgIC8gKG1Wc3luY1BlcmlvZCAvIDEwMCk7CisgICAgICAgIC8vIHVzZSAyMCBzYW1wbGVzIGlmIHdlIGFyZSBkb2luZyA1OjYgcmF0aW8gKy0gMSUgKGUuZy4gcGxheWluZyA1MEh6IG9uIDYwSHopCisgICAgICAgIGlmIChmaXZlU2l4dGhEZXYgPCAxMikgeyAgLyogMTIlIC8gNiA9IDIlICovCisgICAgICAgICAgICBOID0gMjA7CisgICAgICAgIH0KKworICAgICAgICBuc2Vjc190IG9mZnNldCA9IDA7CisgICAgICAgIG5zZWNzX3QgZWRnZVJlbWFpbmRlciA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IE47IGkrKykgeworICAgICAgICAgICAgb2Zmc2V0ICs9CisgICAgICAgICAgICAgICAgKHJlbmRlclRpbWUgKyBtVGltZUNvcnJlY3Rpb24gKyB2aWRlb1BlcmlvZCAqIGkgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgIGVkZ2VSZW1haW5kZXIgKz0gKHZpZGVvUGVyaW9kICogaSkgJSBtVnN5bmNQZXJpb2Q7CisgICAgICAgIH0KKyAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDIgLSBvZmZzZXQgLyBOOworICAgICAgICByZW5kZXJUaW1lICs9IG1UaW1lQ29ycmVjdGlvbjsKKyAgICAgICAgbnNlY3NfdCBjb3JyZWN0aW9uTGltaXQgPSBtVnN5bmNQZXJpb2QgKiAzIC8gNTsKKyAgICAgICAgZWRnZVJlbWFpbmRlciA9IGFicyhlZGdlUmVtYWluZGVyIC8gTiAtIG1Wc3luY1BlcmlvZCAvIDIpOworICAgICAgICBpZiAoZWRnZVJlbWFpbmRlciA8PSBtVnN5bmNQZXJpb2QgLyAzKSB7CisgICAgICAgICAgICBjb3JyZWN0aW9uTGltaXQgLz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGVzdGltYXRlIGhvdyBtYW55IFZTWU5DcyBhIGZyYW1lIHdpbGwgc3BlbmQgb24gdGhlIGRpc3BsYXkKKyAgICAgICAgbnNlY3NfdCBuZXh0VnN5bmNUaW1lID0KKyAgICAgICAgICAgIHJlbmRlclRpbWUgKyBtVnN5bmNQZXJpb2QgLSAoKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZCk7CisgICAgICAgIGlmIChtTGFzdFZzeW5jVGltZSA+PSAwKSB7CisgICAgICAgICAgICBzaXplX3QgbWluVnN5bmNzUGVyRnJhbWUgPSB2aWRlb1BlcmlvZCAvIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgIHNpemVfdCB2c3luY3NGb3JMYXN0RnJhbWUgPSBkaXZSb3VuZChuZXh0VnN5bmNUaW1lIC0gbUxhc3RWc3luY1RpbWUsIG1Wc3luY1BlcmlvZCk7CisgICAgICAgICAgICBib29sIHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgPQorICAgICAgICAgICAgICAgIHBlcmlvZGljRXJyb3IodmlkZW9QZXJpb2QsIG1Wc3luY1BlcmlvZCkgLyAobVZzeW5jUGVyaW9kIC8gMjApID09IDA7CisKKyAgICAgICAgICAgIGlmIChtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID4gbWluVnN5bmNzUGVyRnJhbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGEgVlNZTkMKKyAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gLT0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSAtPSBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICAgICAgLS12c3luY3NGb3JMYXN0RnJhbWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1UaW1lQ29ycmVjdGlvbiA8IC1jb3JyZWN0aW9uTGltaXQgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID09IG1pblZzeW5jc1BlckZyYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIGFkZCBhIFZTWU5DCisgICAgICAgICAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgcmVuZGVyVGltZSArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIG5leHRWc3luY1RpbWUgKz0gbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgICAgICsrdnN5bmNzRm9yTGFzdEZyYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVRSQUNFX0lOVCgiRlJBTUVfVlNZTkNTIiwgdnN5bmNzRm9yTGFzdEZyYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtTGFzdFZzeW5jVGltZSA9IG5leHRWc3luY1RpbWU7CisgICAgfQorCisgICAgLy8gYWxpZ24gcmVuZGVydGltZSB0byB0aGUgY2VudGVyIGJldHdlZW4gVlNZTkMgZWRnZXMKKyAgICByZW5kZXJUaW1lIC09IChyZW5kZXJUaW1lIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2Q7CisgICAgcmVuZGVyVGltZSArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgIEFMT0dWKCJhZGp1c3RpbmcgcmVuZGVyOiAlbGxkID0+ICVsbGQiLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOworICAgIEFUUkFDRV9JTlQoIkZSQU1FX0ZMSVBfSU4obXMpIiwgKHJlbmRlclRpbWUgLSBub3cpIC8gMTAwMDAwMCk7CisgICAgcmV0dXJuIHJlbmRlclRpbWU7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6cmVsZWFzZSgpIHsKKyAgICBtQ29tcG9zZXIuY2xlYXIoKTsKK30KKworVmlkZW9GcmFtZVNjaGVkdWxlcjo6flZpZGVvRnJhbWVTY2hlZHVsZXIoKSB7CisgICAgcmVsZWFzZSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YjI3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCisjZGVmaW5lIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9IXworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBJU3VyZmFjZUNvbXBvc2VyOworCitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisKKyAgICAvLyAocmUpaW5pdGlhbGl6ZSBzY2hlZHVsZXIKKyAgICB2b2lkIGluaXQoZmxvYXQgdmlkZW9GcHMgPSAtMSk7CisgICAgLy8gdXNlIGluIGNhc2Ugb2YgdmlkZW8gcmVuZGVyLXRpbWUgZGlzY29udGludWl0eSwgZS5nLiBzZWVrCisgICAgdm9pZCByZXN0YXJ0KCk7CisgICAgLy8gZ2V0IGFkanVzdGVkIG5hbm90aW1lIGZvciBhIHZpZGVvIGZyYW1lIHJlbmRlciBhdCByZW5kZXJUaW1lCisgICAgbnNlY3NfdCBzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpOworCisgICAgLy8gcmV0dXJucyB0aGUgdnN5bmMgcGVyaW9kIGZvciB0aGUgbWFpbiBkaXNwbGF5CisgICAgbnNlY3NfdCBnZXRWc3luY1BlcmlvZCgpOworCisgICAgdm9pZCByZWxlYXNlKCk7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtIaXN0b3J5U2l6ZSA9IDg7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5WaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IFBMTCB7CisgICAgICAgIFBMTCgpOworCisgICAgICAgIC8vIHJlc2V0IFBMTCB0byBuZXcgUExMCisgICAgICAgIHZvaWQgcmVzZXQoZmxvYXQgZnBzID0gLTEpOworICAgICAgICAvLyBrZWVwIGN1cnJlbnQgZXN0aW1hdGUsIGJ1dCByZXN0YXJ0IHBoYXNlCisgICAgICAgIHZvaWQgcmVzdGFydCgpOworICAgICAgICAvLyByZXR1cm5zIHBlcmlvZAorICAgICAgICBuc2Vjc190IGFkZFNhbXBsZShuc2Vjc190IHRpbWUpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgbnNlY3NfdCBtUGVyaW9kOworICAgICAgICBuc2Vjc190IG1QaGFzZTsKKworICAgICAgICBib29sICAgIG1QcmltZWQ7ICAgICAgICAvLyBoYXZlIGFuIGVzdGltYXRlIGZvciB0aGUgcGVyaW9kCisgICAgICAgIHNpemVfdCAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKworICAgICAgICBuc2Vjc190IG1MYXN0VGltZTsgICAgICAvLyBsYXN0IGlucHV0IHRpbWUKKyAgICAgICAgbnNlY3NfdCBtUmVmaXRBdDsgICAgICAgLy8gbmV4dCBpbnB1dCB0aW1lIHRvIGZpdCBhdAorCisgICAgICAgIHNpemVfdCAgbU51bVNhbXBsZXM7ICAgIC8vIGNhbiBnbyBwYXN0IGtIaXN0b3J5U2l6ZQorICAgICAgICBuc2Vjc190IG1UaW1lc1trSGlzdG9yeVNpemVdOworCisgICAgICAgIHZvaWQgdGVzdCgpOworICAgICAgICAvLyByZXR1cm5zIHdoZXRoZXIgZml0IHdhcyBzdWNjZXNzZnVsCisgICAgICAgIGJvb2wgZml0KG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpOworICAgICAgICB2b2lkIHByaW1lKHNpemVfdCBudW1TYW1wbGVzKTsKKyAgICB9OworCisgICAgdm9pZCB1cGRhdGVWc3luYygpOworCisgICAgbnNlY3NfdCBtVnN5bmNUaW1lOyAgICAgICAgLy8gdnN5bmMgdGltaW5nIGZyb20gZGlzcGxheQorICAgIG5zZWNzX3QgbVZzeW5jUGVyaW9kOworICAgIG5zZWNzX3QgbVZzeW5jUmVmcmVzaEF0OyAgIC8vIG5leHQgdGltZSB0byByZWZyZXNoIHRpbWluZyBpbmZvCisKKyAgICBuc2Vjc190IG1MYXN0VnN5bmNUaW1lOyAgICAvLyBlc3RpbWF0ZWQgdnN5bmMgdGltZSBmb3IgbGFzdCBmcmFtZQorICAgIG5zZWNzX3QgbVRpbWVDb3JyZWN0aW9uOyAgIC8vIHJ1bm5pbmcgYWRqdXN0bWVudAorCisgICAgUExMIG1QbGw7ICAgICAgICAgICAgICAgICAgLy8gUExMIGZvciB2aWRlbyBmcmFtZSByYXRlIGJhc2VkIG9uIHJlbmRlciB0aW1lCisKKyAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBtQ29tcG9zZXI7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhWaWRlb0ZyYW1lU2NoZWR1bGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKaW5kZXggZjk0NmMxYy4uNjc2YzBhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsKQEAgLTYsMTggKzYsMjAgQEAKICAgICAgICAgSFRUUExpdmVTb3VyY2UuY3BwICAgICAgICAgICAgICBcCiAgICAgICAgIE51UGxheWVyLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBOdVBsYXllckRlY29kZXIuY3BwICAgICAgICAgICAgIFwKKyAgICAgICAgTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwICBcCiAgICAgICAgIE51UGxheWVyRHJpdmVyLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBOdVBsYXllclJlbmRlcmVyLmNwcCAgICAgICAgICAgIFwKICAgICAgICAgTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5jcHAgICAgICBcCiAgICAgICAgIFJUU1BTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgXAogICAgICAgICBTdHJlYW1pbmdTb3VyY2UuY3BwICAgICAgICAgICAgIFwKLSAgICAgICAgbXA0L01QNFNvdXJjZS5jcHAgICAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlICAgICAgICAgICAgXAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgICAgICAgICAgICAgXAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMgICAgICAgICAgICAgXAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AgICAgICAgICAgICAgICAgXAorCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dCAgICAgICAgICAgXAorCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSAgICAgICAgICAgICAgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAppbmRleCBiMDRlN2E2Li5iM2VmZDc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCkBAIC0xNCwxMCArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiR2VuZXJpY1NvdXJjZSIKKwogI2luY2x1ZGUgIkdlbmVyaWNTb3VyY2UuaCIKIAogI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0yOCw1NyArMzIsMTU4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0RSTUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCisjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XVk1FeHRyYWN0b3IuaCIKKyNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OkdlbmVyaWNTb3VyY2UoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBjb25zdCBjaGFyICp1cmwsCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAogICAgICAgICBib29sIHVpZFZhbGlkLAogICAgICAgICB1aWRfdCB1aWQpCiAgICAgOiBTb3VyY2Uobm90aWZ5KSwKKyAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24oMCksCisgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbigwKSwKICAgICAgIG1EdXJhdGlvblVzKDBsbCksCi0gICAgICBtQXVkaW9Jc1ZvcmJpcyhmYWxzZSkgeworICAgICAgbUF1ZGlvSXNWb3JiaXMoZmFsc2UpLAorICAgICAgbUlzV2lkZXZpbmUoZmFsc2UpLAorICAgICAgbVVJRFZhbGlkKHVpZFZhbGlkKSwKKyAgICAgIG1VSUQodWlkKSwKKyAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpLAorICAgICAgbU1ldGFEYXRhU2l6ZSgtMWxsKSwKKyAgICAgIG1CaXRyYXRlKC0xbGwpLAorICAgICAgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKDApLAorICAgICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMoMCkgeworICAgIHJlc2V0RGF0YVNvdXJjZSgpOwogICAgIERhdGFTb3VyY2U6OlJlZ2lzdGVyRGVmYXVsdFNuaWZmZXJzKCk7Ci0KLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KLSAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSh1cmwsIGhlYWRlcnMpOwotICAgIENIRUNLKGRhdGFTb3VyY2UgIT0gTlVMTCk7Ci0KLSAgICBpbml0RnJvbURhdGFTb3VyY2UoZGF0YVNvdXJjZSk7CiB9CiAKLU51UGxheWVyOjpHZW5lcmljU291cmNlOjpHZW5lcmljU291cmNlKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCi0gICAgOiBTb3VyY2Uobm90aWZ5KSwKLSAgICAgIG1EdXJhdGlvblVzKDBsbCksCi0gICAgICBtQXVkaW9Jc1ZvcmJpcyhmYWxzZSkgewotICAgIERhdGFTb3VyY2U6OlJlZ2lzdGVyRGVmYXVsdFNuaWZmZXJzKCk7Ci0KLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UoZHVwKGZkKSwgb2Zmc2V0LCBsZW5ndGgpOwotCi0gICAgaW5pdEZyb21EYXRhU291cmNlKGRhdGFTb3VyY2UpOwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cmVzZXREYXRhU291cmNlKCkgeworICAgIG1BdWRpb1RpbWVVcyA9IDA7CisgICAgbVZpZGVvVGltZVVzID0gMDsKKyAgICBtSFRUUFNlcnZpY2UuY2xlYXIoKTsKKyAgICBtSHR0cFNvdXJjZS5jbGVhcigpOworICAgIG1VcmkuY2xlYXIoKTsKKyAgICBtVXJpSGVhZGVycy5jbGVhcigpOworICAgIG1GZCA9IC0xOworICAgIG1PZmZzZXQgPSAwOworICAgIG1MZW5ndGggPSAwOworICAgIHNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoUGxheWJhY2s6OlNUT1AsIDApOworICAgIG1EZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICBtRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtU3RvcFJlYWQgPSB0cnVlOwogfQogCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjppbml0RnJvbURhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKSB7Ci0gICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSk7CitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgIHJlc2V0RGF0YVNvdXJjZSgpOwogCi0gICAgQ0hFQ0soZXh0cmFjdG9yICE9IE5VTEwpOworICAgIG1IVFRQU2VydmljZSA9IGh0dHBTZXJ2aWNlOworICAgIG1VcmkgPSB1cmw7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsgKytpKSB7CisgICAgaWYgKGhlYWRlcnMpIHsKKyAgICAgICAgbVVyaUhlYWRlcnMgPSAqaGVhZGVyczsKKyAgICB9CisKKyAgICAvLyBkZWxheSBkYXRhIHNvdXJjZSBjcmVhdGlvbiB0byBwcmVwYXJlQXN5bmMoKSB0byBhdm9pZCBibG9ja2luZworICAgIC8vIHRoZSBjYWxsaW5nIHRocmVhZCBpbiBzZXREYXRhU291cmNlIGZvciBhbnkgc2lnbmlmaWNhbnQgdGltZS4KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZXREYXRhU291cmNlKAorICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgeworICAgIHJlc2V0RGF0YVNvdXJjZSgpOworCisgICAgbUZkID0gZHVwKGZkKTsKKyAgICBtT2Zmc2V0ID0gb2Zmc2V0OworICAgIG1MZW5ndGggPSBsZW5ndGg7CisKKyAgICAvLyBkZWxheSBkYXRhIHNvdXJjZSBjcmVhdGlvbiB0byBwcmVwYXJlQXN5bmMoKSB0byBhdm9pZCBibG9ja2luZworICAgIC8vIHRoZSBjYWxsaW5nIHRocmVhZCBpbiBzZXREYXRhU291cmNlIGZvciBhbnkgc2lnbmlmaWNhbnQgdGltZS4KKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0RmlsZUZvcm1hdE1ldGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlTWV0YTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmluaXRGcm9tRGF0YVNvdXJjZSgpIHsKKyAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yOworCisgICAgQ0hFQ0sobURhdGFTb3VyY2UgIT0gTlVMTCk7CisKKyAgICBpZiAobUlzV2lkZXZpbmUpIHsKKyAgICAgICAgU3RyaW5nOCBtaW1lVHlwZTsKKyAgICAgICAgZmxvYXQgY29uZmlkZW5jZTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGR1bW15OworICAgICAgICBib29sIHN1Y2Nlc3M7CisKKyAgICAgICAgc3VjY2VzcyA9IFNuaWZmV1ZNKG1EYXRhU291cmNlLCAmbWltZVR5cGUsICZjb25maWRlbmNlLCAmZHVtbXkpOworICAgICAgICBpZiAoIXN1Y2Nlc3MKKyAgICAgICAgICAgICAgICB8fCBzdHJjYXNlY21wKAorICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZS5zdHJpbmcoKSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dWTSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCB3aWRldmluZSBtaW1lOiAlcyIsIG1pbWVUeXBlLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbVdWTUV4dHJhY3RvciA9IG5ldyBXVk1FeHRyYWN0b3IobURhdGFTb3VyY2UpOworICAgICAgICBtV1ZNRXh0cmFjdG9yLT5zZXRBZGFwdGl2ZVN0cmVhbWluZ01vZGUodHJ1ZSk7CisgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKKyAgICAgICAgICAgIG1XVk1FeHRyYWN0b3ItPnNldFVJRChtVUlEKTsKKyAgICAgICAgfQorICAgICAgICBleHRyYWN0b3IgPSBtV1ZNRXh0cmFjdG9yOworICAgIH0gZWxzZSB7CisgICAgICAgIGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobURhdGFTb3VyY2UsCisgICAgICAgICAgICAgICAgbVNuaWZmZWRNSU1FLmVtcHR5KCkgPyBOVUxMOiBtU25pZmZlZE1JTUUuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChleHRyYWN0b3ItPmdldERybUZsYWcoKSkgeworICAgICAgICBjaGVja0RybVN0YXR1cyhtRGF0YVNvdXJjZSk7CisgICAgfQorCisgICAgbUZpbGVNZXRhID0gZXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOworICAgIGlmIChtRmlsZU1ldGEgIT0gTlVMTCkgeworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgICAgICBpZiAobUZpbGVNZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pKSB7CisgICAgICAgICAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCB0b3RhbEJpdHJhdGUgPSAwOworCisgICAgc2l6ZV90IG51bXRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICBpZiAobnVtdHJhY2tzID09IDApIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3M7ICsraSkgeworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gdHJhY2sgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworCiAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOwogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAotICAgICAgICBzcDxNZWRpYVNvdXJjZT4gdHJhY2s7Ci0KKyAgICAgICAgLy8gRG8gdGhlIHN0cmluZyBjb21wYXJlIGltbWVkaWF0ZWx5IHdpdGggIm1pbWUiLAorICAgICAgICAvLyB3ZSBjYW4ndCBhc3N1bWUgIm1pbWUiIHdvdWxkIHN0YXkgdmFsaWQgYWZ0ZXIgYW5vdGhlcgorICAgICAgICAvLyBleHRyYWN0b3Igb3BlcmF0aW9uLCBzb21lIGV4dHJhY3RvcnMgbWlnaHQgbW9kaWZ5IG1ldGEKKyAgICAgICAgLy8gZHVyaW5nIGdldFRyYWNrKCkgYW5kIG1ha2UgaXQgaW52YWxpZC4KICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKICAgICAgICAgICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9UcmFjay5tU291cmNlID0gdHJhY2sgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLm1JbmRleCA9IGk7CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subVNvdXJjZSA9IHRyYWNrOworICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLm1QYWNrZXRzID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobUF1ZGlvVHJhY2subVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpIHsKICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvSXNWb3JiaXMgPSB0cnVlOwpAQCAtODgsMzcgKzE5MywxNzUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CiAgICAgICAgICAgICBpZiAobVZpZGVvVHJhY2subVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbVZpZGVvVHJhY2subVNvdXJjZSA9IHRyYWNrID0gZXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKKyAgICAgICAgICAgICAgICBtVmlkZW9UcmFjay5tSW5kZXggPSBpOworICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1Tb3VyY2UgPSB0cmFjazsKKyAgICAgICAgICAgICAgICBtVmlkZW9UcmFjay5tUGFja2V0cyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1WaWRlb1RyYWNrLm1Tb3VyY2UtPmdldEZvcm1hdCgpKTsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzb3VyY2UgcmVxdWlyZXMgc2VjdXJlIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNlY3VyZTsKKyAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlSZXF1aXJlc1NlY3VyZUJ1ZmZlcnMsICZzZWN1cmUpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzZWN1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlzV2lkZXZpbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAobVVJRFZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3ItPnNldFVJRChtVUlEKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmICh0cmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICBtU291cmNlcy5wdXNoKHRyYWNrKTsKICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKICAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA+IG1EdXJhdGlvblVzKSB7CiAgICAgICAgICAgICAgICAgICAgIG1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3QgYml0cmF0ZTsKKyAgICAgICAgICAgIGlmICh0b3RhbEJpdHJhdGUgPj0gMCAmJiBtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRyYXRlKSkgeworICAgICAgICAgICAgICAgIHRvdGFsQml0cmF0ZSArPSBiaXRyYXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0b3RhbEJpdHJhdGUgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1CaXRyYXRlID0gdG90YWxCaXRyYXRlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpjaGVja0RybVN0YXR1cyhjb25zdCBzcDxEYXRhU291cmNlPiYgZGF0YVNvdXJjZSkgeworICAgIGRhdGFTb3VyY2UtPmdldERybUluZm8obURlY3J5cHRIYW5kbGUsICZtRHJtTWFuYWdlckNsaWVudCk7CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0sobURybU1hbmFnZXJDbGllbnQpOworICAgICAgICBpZiAoUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQgIT0gbURlY3J5cHRIYW5kbGUtPnN0YXR1cykgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RHJtTm9MaWNlbnNlKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOwogICAgICAgICB9CiAgICAgfQogfQogCitpbnQ2NF90IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRMYXN0UmVhZFBvc2l0aW9uKCkgeworICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1RpbWVVczsKKyAgICB9IGVsc2UgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVZpZGVvVGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNldEJ1ZmZlcnMoCisgICAgICAgIGJvb2wgYXVkaW8sIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmYnVmZmVycykgeworICAgIGlmIChtSXNXaWRldmluZSAmJiAhYXVkaW8pIHsKKyAgICAgICAgcmV0dXJuIG1WaWRlb1RyYWNrLm1Tb3VyY2UtPnNldEJ1ZmZlcnMoYnVmZmVycyk7CisgICAgfQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwogTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6On5HZW5lcmljU291cmNlKCkgeworICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKKyAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnByZXBhcmVBc3luYygpIHsKKyAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgiZ2VuZXJpYyIpOworICAgICAgICBtTG9vcGVyLT5zdGFydCgpOworCisgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZUFzeW5jLCBpZCgpKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25QcmVwYXJlQXN5bmMoKSB7CisgICAgLy8gZGVsYXllZCBkYXRhIHNvdXJjZSBjcmVhdGlvbgorICAgIGlmIChtRGF0YVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghbVVyaS5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkgPSBtVXJpLmNfc3RyKCk7CisgICAgICAgICAgICBtSXNXaWRldmluZSA9ICFzdHJuY2FzZWNtcCh1cmksICJ3aWRldmluZTovLyIsIDExKTsKKworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykKKyAgICAgICAgICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkKKyAgICAgICAgICAgICAgICAgICAgfHwgbUlzV2lkZXZpbmUpIHsKKyAgICAgICAgICAgICAgICBtSHR0cFNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZU1lZGlhSFRUUChtSFRUUFNlcnZpY2UpOworICAgICAgICAgICAgICAgIGlmIChtSHR0cFNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGh0dHAgc291cmNlISIpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1EYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UsIHVyaSwgJm1VcmlIZWFkZXJzLCAmbUNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KG1IdHRwU291cmNlLmdldCgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzZXQgdG8gZmFsc2UgZmlyc3QsIGlmIHRoZSBleHRyYWN0b3IKKyAgICAgICAgICAgIC8vIGNvbWVzIGJhY2sgYXMgc2VjdXJlLCBzZXQgaXQgdG8gdHJ1ZSB0aGVuLgorICAgICAgICAgICAgbUlzV2lkZXZpbmUgPSBmYWxzZTsKKworICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShtRmQsIG1PZmZzZXQsIG1MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EYXRhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGRhdGEgc291cmNlISIpOworICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UgPSBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Jc1dpZGV2aW5lIHx8IG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjaGVjayBpbml0aWFsIGNhY2hpbmcgc3RhdHVzCisgICAgc3RhdHVzX3QgZXJyID0gcHJlZmlsbENhY2hlSWZOZWNlc3NhcnkoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgeworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmVBc3luYywgaWQoKSkpLT5wb3N0KDIwMDAwMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHByZWZpbGwgZGF0YSBjYWNoZSEiKTsKKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaW5pdCBleHRyYXRvciBmcm9tIGRhdGEgc291cmNlCisgICAgZXJyID0gaW5pdEZyb21EYXRhU291cmNlKCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBmcm9tIGRhdGEgc291cmNlISIpOworICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGlmIChtVmlkZW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtVmlkZW9UcmFjay5tU291cmNlLT5nZXRGb3JtYXQoKTsKLQotICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOwotCi0gICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQod2lkdGgsIGhlaWdodCk7CisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZG9HZXRGb3JtYXRNZXRhKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgZXJyID0gY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG1ldGEsICZtc2cpOworICAgICAgICBpZihlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQobXNnKTsKICAgICB9CiAKICAgICBub3RpZnlGbGFnc0NoYW5nZWQoCi0gICAgICAgICAgICBGTEFHX0NBTl9QQVVTRQorICAgICAgICAgICAgKG1Jc1dpZGV2aW5lID8gRkxBR19TRUNVUkUgOiAwKQorICAgICAgICAgICAgfCBGTEFHX0NBTl9QQVVTRQogICAgICAgICAgICAgfCBGTEFHX0NBTl9TRUVLX0JBQ0tXQVJECiAgICAgICAgICAgICB8IEZMQUdfQ0FOX1NFRUtfRk9SV0FSRAogICAgICAgICAgICAgfCBGTEFHX0NBTl9TRUVLKTsKQEAgLTEyNiwzMyArMzY5LDQ3MiBAQAogICAgIG5vdGlmeVByZXBhcmVkKCk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChzdGF0dXNfdCBlcnIpIHsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1NZXRhRGF0YVNpemUgPSAtMWxsOworICAgICAgICBtQ29udGVudFR5cGUgPSAiIjsKKyAgICAgICAgbVNuaWZmZWRNSU1FID0gIiI7CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKKyAgICAgICAgICAgIHNwPE51Q2FjaGVkU291cmNlMj4gY2FjaGVkU291cmNlID0gbUNhY2hlZFNvdXJjZTsKKyAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGh0dHBTb3VyY2UgPSBtSHR0cFNvdXJjZTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURpc2Nvbm5lY3RMb2NrKTsKKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICAgICAgICAgIG1EZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7CisgICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS5jbGVhcigpOworICAgICAgICAgICAgICAgIG1IdHRwU291cmNlLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjYW5jZWxQb2xsQnVmZmVyaW5nKCk7CisgICAgfQorICAgIG5vdGlmeVByZXBhcmVkKGVycik7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpwcmVmaWxsQ2FjaGVJZk5lY2Vzc2FyeSgpIHsKKyAgICBDSEVDSyhtRGF0YVNvdXJjZSAhPSBOVUxMKTsKKworICAgIGlmIChtQ2FjaGVkU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgLy8gbm8gcHJlZmlsbCBpZiB0aGUgZGF0YSBzb3VyY2UgaXMgbm90IGNhY2hlZAorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gV2UncmUgbm90IGRvaW5nIHRoaXMgZm9yIHN0cmVhbXMgdGhhdCBhcHBlYXIgdG8gYmUgYXVkaW8tb25seQorICAgIC8vIHN0cmVhbXMgdG8gZW5zdXJlIHRoYXQgZXZlbiBsb3cgYmFuZHdpZHRoIHN0cmVhbXMgc3RhcnQKKyAgICAvLyBwbGF5aW5nIGJhY2sgZmFpcmx5IGluc3RhbnRseS4KKyAgICBpZiAoIXN0cm5jYXNlY21wKG1Db250ZW50VHlwZS5zdHJpbmcoKSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBXZSdyZSBnb2luZyB0byBwcmVmaWxsIHRoZSBjYWNoZSBiZWZvcmUgdHJ5aW5nIHRvIGluc3RhbnRpYXRlCisgICAgLy8gdGhlIGV4dHJhY3RvciBiZWxvdywgYXMgdGhlIGxhdHRlciBpcyBhbiBvcGVyYXRpb24gdGhhdCBvdGhlcndpc2UKKyAgICAvLyBjb3VsZCBibG9jayBvbiB0aGUgZGF0YXNvdXJjZSBmb3IgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGltZS4KKyAgICAvLyBEdXJpbmcgdGhhdCB0aW1lIHdlJ2QgYmUgdW5hYmxlIHRvIGFib3J0IHRoZSBwcmVwYXJhdGlvbiBwaGFzZQorICAgIC8vIHdpdGhvdXQgdGhpcyBwcmVmaWxsLgorCisgICAgLy8gSW5pdGlhbGx5IG1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IDE5MiBLQiBmb3IgdGhlIHNuaWZmCisgICAgLy8gdG8gY29tcGxldGUgd2l0aG91dCBibG9ja2luZy4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5CeXRlc0ZvclNuaWZmaW5nID0gMTkyICogMTAyNDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtEZWZhdWx0TWV0YVNpemUgPSAyMDAwMDA7CisKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKKworICAgIHNpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0KKyAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmZpbmFsU3RhdHVzKTsKKworICAgIGlmIChmaW5hbFN0YXR1cyAhPSBPSyB8fCAobU1ldGFEYXRhU2l6ZSA+PSAwCisgICAgICAgICAgICAmJiAob2ZmNjRfdCljYWNoZWREYXRhUmVtYWluaW5nID49IG1NZXRhRGF0YVNpemUpKSB7CisgICAgICAgIEFMT0dWKCJzdG9wIGNhY2hpbmcsIHN0YXR1cyAlZCwgIgorICAgICAgICAgICAgICAgICJtZXRhRGF0YVNpemUgJWxsZCwgY2FjaGVkRGF0YVJlbWFpbmluZyAlenUiLAorICAgICAgICAgICAgICAgIGZpbmFsU3RhdHVzLCBtTWV0YURhdGFTaXplLCBjYWNoZWREYXRhUmVtYWluaW5nKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEFMT0dWKCJub3cgY2FjaGVkICV6dSBieXRlcyBvZiBkYXRhIiwgY2FjaGVkRGF0YVJlbWFpbmluZyk7CisKKyAgICBpZiAobU1ldGFEYXRhU2l6ZSA8IDAKKyAgICAgICAgICAgICYmIGNhY2hlZERhdGFSZW1haW5pbmcgPj0ga01pbkJ5dGVzRm9yU25pZmZpbmcpIHsKKyAgICAgICAgU3RyaW5nOCB0bXA7CisgICAgICAgIGZsb2F0IGNvbmZpZGVuY2U7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhOworICAgICAgICBpZiAoIW1DYWNoZWRTb3VyY2UtPnNuaWZmKCZ0bXAsICZjb25maWRlbmNlLCAmbWV0YSkpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2Ugc3VjY2Vzc2Z1bGx5IGlkZW50aWZpZWQgdGhlIGZpbGUncyBleHRyYWN0b3IgdG8KKyAgICAgICAgLy8gYmUsIHJlbWVtYmVyIHRoaXMgbWltZSB0eXBlIHNvIHdlIGRvbid0IGhhdmUgdG8KKyAgICAgICAgLy8gc25pZmYgaXQgYWdhaW4gd2hlbiB3ZSBjYWxsIE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoKQorICAgICAgICBtU25pZmZlZE1JTUUgPSB0bXAuc3RyaW5nKCk7CisKKyAgICAgICAgaWYgKG1ldGEgPT0gTlVMTAorICAgICAgICAgICAgICAgIHx8ICFtZXRhLT5maW5kSW50NjQoIm1ldGEtZGF0YS1zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KCZtTWV0YURhdGFTaXplKSkpIHsKKyAgICAgICAgICAgIG1NZXRhRGF0YVNpemUgPSBrRGVmYXVsdE1ldGFTaXplOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1NZXRhRGF0YVNpemUgPCAwbGwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIG1ldGFEYXRhU2l6ZSA9ICVsbGQgYnl0ZXMiLCBtTWV0YURhdGFTaXplKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC1FQUdBSU47Cit9CisKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnN0YXJ0KCkgewogICAgIEFMT0dJKCJzdGFydCIpOwogCisgICAgbVN0b3BSZWFkID0gZmFsc2U7CiAgICAgaWYgKG1BdWRpb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBDSEVDS19FUShtQXVkaW9UcmFjay5tU291cmNlLT5zdGFydCgpLCAoc3RhdHVzX3QpT0spOwogCi0gICAgICAgIG1BdWRpb1RyYWNrLm1QYWNrZXRzID0KLSAgICAgICAgICAgIG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1BdWRpb1RyYWNrLm1Tb3VyY2UtPmdldEZvcm1hdCgpKTsKLQotICAgICAgICByZWFkQnVmZmVyKHRydWUgLyogYXVkaW8gKi8pOworICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX0FVRElPKTsKICAgICB9CiAKICAgICBpZiAobVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIENIRUNLX0VRKG1WaWRlb1RyYWNrLm1Tb3VyY2UtPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CiAKLSAgICAgICAgbVZpZGVvVHJhY2subVBhY2tldHMgPQotICAgICAgICAgICAgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobVZpZGVvVHJhY2subVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOwotCi0gICAgICAgIHJlYWRCdWZmZXIoZmFsc2UgLyogYXVkaW8gKi8pOworICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKICAgICB9CisKKyAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpTVEFSVCwgZ2V0TGFzdFJlYWRQb3NpdGlvbigpIC8gMTAwMCk7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzdG9wKCkgeworICAgIC8vIG5vdGhpbmcgdG8gZG8sIGp1c3QgYWNjb3VudCBmb3IgRFJNIHBsYXliYWNrIHN0YXR1cworICAgIHNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoUGxheWJhY2s6OlNUT1AsIDApOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgaWYgKG1Jc1dpZGV2aW5lKSB7CisgICAgICAgIC8vIEZvciBhIHdpZGV2aW5lIHNvdXJjZSB3ZSBuZWVkIHRvIHByZXZlbnQgYW55IGZ1cnRoZXIgcmVhZHMuCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wV2lkZXZpbmUsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgICAgICh2b2lkKSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpwYXVzZSgpIHsKKyAgICAvLyBub3RoaW5nIHRvIGRvLCBqdXN0IGFjY291bnQgZm9yIERSTSBwbGF5YmFjayBzdGF0dXMKKyAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpQQVVTRSwgMCk7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cmVzdW1lKCkgeworICAgIC8vIG5vdGhpbmcgdG8gZG8sIGp1c3QgYWNjb3VudCBmb3IgRFJNIHBsYXliYWNrIHN0YXR1cworICAgIHNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoUGxheWJhY2s6OlNUQVJULCBnZXRMYXN0UmVhZFBvc2l0aW9uKCkgLyAxMDAwKTsKKyAgICBtU3RhcnRlZCA9IHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRpc2Nvbm5lY3QoKSB7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSwgaHR0cFNvdXJjZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGlzY29ubmVjdExvY2spOworICAgICAgICBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7CisgICAgICAgIGh0dHBTb3VyY2UgPSBtSHR0cFNvdXJjZTsKKyAgICB9CisKKyAgICBpZiAoZGF0YVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKKyAgICAgICAgaWYgKGRhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgeworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KGRhdGFTb3VyY2UuZ2V0KCkpLT5kaXNjb25uZWN0KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGh0dHBTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihodHRwU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMobURlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CisgICAgfQorICAgIG1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCk7CisgICAgbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCk7CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpmZWVkTW9yZVRTRGF0YSgpIHsKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbEJ1ZmZlcmluZywgaWQoKSk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbik7CisgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmNhbmNlbFBvbGxCdWZmZXJpbmcoKSB7CisgICAgKyttUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQgcGVyY2VudGFnZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBkdXBOb3RpZnkoKTsKKyAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRCdWZmZXJpbmdVcGRhdGUpOworICAgIG1zZy0+c2V0SW50MzIoInBlcmNlbnRhZ2UiLCBwZXJjZW50YWdlKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25Qb2xsQnVmZmVyaW5nKCkgeworICAgIHN0YXR1c190IGZpbmFsU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXMgPSAwbGw7CisKKyAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHNpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0KKyAgICAgICAgICAgICAgICBtQ2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7CisKKyAgICAgICAgaWYgKGZpbmFsU3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICBvZmY2NF90IHNpemU7CisgICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGUgPSAwbGw7CisgICAgICAgICAgICBpZiAobUR1cmF0aW9uVXMgPiAwICYmIG1DYWNoZWRTb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7CisgICAgICAgICAgICAgICAgYml0cmF0ZSA9IHNpemUgKiA4MDAwMDAwbGwgLyBtRHVyYXRpb25VczsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUJpdHJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgYml0cmF0ZSA9IG1CaXRyYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJpdHJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgY2FjaGVkRHVyYXRpb25VcyA9IGNhY2hlZERhdGFSZW1haW5pbmcgKiA4MDAwMDAwbGwgLyBiaXRyYXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtV1ZNRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgY2FjaGVkRHVyYXRpb25VcworICAgICAgICAgICAgPSBtV1ZNRXh0cmFjdG9yLT5nZXRDYWNoZWREdXJhdGlvblVzKCZmaW5hbFN0YXR1cyk7CisgICAgfQorCisgICAgaWYgKGZpbmFsU3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKDEwMCk7CisgICAgICAgIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoY2FjaGVkRHVyYXRpb25VcyA+IDBsbCAmJiBtRHVyYXRpb25VcyA+IDBsbCkgeworICAgICAgICBpbnQgcGVyY2VudGFnZSA9IDEwMC4wICogY2FjaGVkRHVyYXRpb25VcyAvIG1EdXJhdGlvblVzOworICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkgeworICAgICAgICAgICAgcGVyY2VudGFnZSA9IDEwMDsKKyAgICAgICAgfQorCisgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShwZXJjZW50YWdlKTsKKyAgICB9CisKKyAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKK30KKworCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgIGNhc2Uga1doYXRQcmVwYXJlQXN5bmM6CisgICAgICB7CisgICAgICAgICAgb25QcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2Uga1doYXRGZXRjaFN1YnRpdGxlRGF0YToKKyAgICAgIHsKKyAgICAgICAgICBmZXRjaFRleHREYXRhKGtXaGF0U2VuZFN1YnRpdGxlRGF0YSwgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgICAgICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24sIG1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzLCBtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0RmV0Y2hUaW1lZFRleHREYXRhOgorICAgICAgeworICAgICAgICAgIGZldGNoVGV4dERhdGEoa1doYXRTZW5kVGltZWRUZXh0RGF0YSwgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQsCisgICAgICAgICAgICAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbiwgbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzLCBtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0U2VuZFN1YnRpdGxlRGF0YToKKyAgICAgIHsKKyAgICAgICAgICBzZW5kVGV4dERhdGEoa1doYXRTdWJ0aXRsZURhdGEsIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUsCisgICAgICAgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uLCBtU3VidGl0bGVUcmFjay5tUGFja2V0cywgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFNlbmRUaW1lZFRleHREYXRhOgorICAgICAgeworICAgICAgICAgIHNlbmRUZXh0RGF0YShrV2hhdFRpbWVkVGV4dERhdGEsIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhULAorICAgICAgICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24sIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cywgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdENoYW5nZUFWU291cmNlOgorICAgICAgeworICAgICAgICAgIGludDMyX3QgdHJhY2tJbmRleDsKKyAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2VzLml0ZW1BdCh0cmFja0luZGV4KTsKKworICAgICAgICAgIFRyYWNrKiB0cmFjazsKKyAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBjb3VudGVycGFydFR5cGU7CisgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworICAgICAgICAgIG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgICAgICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgICAgICAgIHRyYWNrID0gJm1BdWRpb1RyYWNrOworICAgICAgICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX0FVRElPOworICAgICAgICAgICAgICBjb3VudGVycGFydFR5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBDSEVDSyghc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKTsKKyAgICAgICAgICAgICAgdHJhY2sgPSAmbVZpZGVvVHJhY2s7CisgICAgICAgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVklERU87CisgICAgICAgICAgICAgIGNvdW50ZXJwYXJ0VHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfQVVESU87OworICAgICAgICAgIH0KKworCisgICAgICAgICAgaWYgKHRyYWNrLT5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgdHJhY2stPm1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdHJhY2stPm1Tb3VyY2UgPSBzb3VyY2U7CisgICAgICAgICAgdHJhY2stPm1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgdHJhY2stPm1JbmRleCA9IHRyYWNrSW5kZXg7CisKKyAgICAgICAgICBzdGF0dXNfdCBhdmFpbDsKKyAgICAgICAgICBpZiAoIXRyYWNrLT5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZhdmFpbCkpIHsKKyAgICAgICAgICAgICAgLy8gc3luYyBmcm9tIG90aGVyIHNvdXJjZQorICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgYWN0dWFsVGltZVVzOworICAgICAgICAgIGNvbnN0IGJvb2wgZm9ybWF0Q2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICBzcDxBTWVzc2FnZT4gbGF0ZXN0TWV0YSA9IHRyYWNrLT5tUGFja2V0cy0+Z2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCk7CisgICAgICAgICAgQ0hFQ0sobGF0ZXN0TWV0YSAhPSBOVUxMICYmIGxhdGVzdE1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgICAgICAgIHJlYWRCdWZmZXIodHJhY2tUeXBlLCB0aW1lVXMsICZhY3R1YWxUaW1lVXMsIGZvcm1hdENoYW5nZSk7CisgICAgICAgICAgcmVhZEJ1ZmZlcihjb3VudGVycGFydFR5cGUsIC0xLCBOVUxMLCBmb3JtYXRDaGFuZ2UpOworICAgICAgICAgIEFMT0dWKCJ0aW1lVXMgJWxsZCBhY3R1YWxUaW1lVXMgJWxsZCIsIHRpbWVVcywgYWN0dWFsVGltZVVzKTsKKworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBrV2hhdFBvbGxCdWZmZXJpbmc6CisgICAgICB7CisgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgb25Qb2xsQnVmZmVyaW5nKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0R2V0Rm9ybWF0OgorICAgICAgeworICAgICAgICAgIG9uR2V0Rm9ybWF0TWV0YShtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0R2V0U2VsZWN0ZWRUcmFjazoKKyAgICAgIHsKKyAgICAgICAgICBvbkdldFNlbGVjdGVkVHJhY2sobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFNlbGVjdFRyYWNrOgorICAgICAgeworICAgICAgICAgIG9uU2VsZWN0VHJhY2sobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFNlZWs6CisgICAgICB7CisgICAgICAgICAgb25TZWVrKG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRSZWFkQnVmZmVyOgorICAgICAgeworICAgICAgICAgIG9uUmVhZEJ1ZmZlcihtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0U3RvcFdpZGV2aW5lOgorICAgICAgeworICAgICAgICAgIC8vIG1TdG9wUmVhZCBpcyBvbmx5IHVzZWQgZm9yIFdpZGV2aW5lIHRvIHByZXZlbnQgdGhlIHZpZGVvIHNvdXJjZQorICAgICAgICAgIC8vIGZyb20gYmVpbmcgcmVhZCB3aGlsZSB0aGUgYXNzb2NpYXRlZCB2aWRlbyBkZWNvZGVyIGlzIHNodXR0aW5nIGRvd24uCisgICAgICAgICAgbVN0b3BSZWFkID0gdHJ1ZTsKKyAgICAgICAgICBpZiAobVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1QYWNrZXRzLT5jbGVhcigpOworICAgICAgICAgIH0KKyAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChtc2cpOworICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZmV0Y2hUZXh0RGF0YSgKKyAgICAgICAgdWludDMyX3Qgc2VuZFdoYXQsCisgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKKyAgICAgICAgaW50MzJfdCBjdXJHZW4sCisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldHMsCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cpIHsKKyAgICBpbnQzMl90IG1zZ0dlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmbXNnR2VuZXJhdGlvbikpOworICAgIGlmIChtc2dHZW5lcmF0aW9uICE9IGN1ckdlbikgeworICAgICAgICAvLyBzdGFsZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBhdmFpbDsKKyAgICBpZiAocGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZhdmFpbCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICBpbnQ2NF90IHN1YlRpbWVVczsKKyAgICByZWFkQnVmZmVyKHR5cGUsIHRpbWVVcywgJnN1YlRpbWVVcyk7CisKKyAgICBpbnQ2NF90IGRlbGF5VXMgPSBzdWJUaW1lVXMgLSB0aW1lVXM7CisgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEpIHsKKyAgICAgICAgY29uc3QgaW50NjRfdCBvbmVTZWNVcyA9IDEwMDAwMDBsbDsKKyAgICAgICAgZGVsYXlVcyAtPSBvbmVTZWNVczsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IG1zZzIgPSBuZXcgQU1lc3NhZ2Uoc2VuZFdoYXQsIGlkKCkpOworICAgIG1zZzItPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbXNnR2VuZXJhdGlvbik7CisgICAgbXNnMi0+cG9zdChkZWxheVVzIDwgMCA/IDAgOiBkZWxheVVzKTsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2VuZFRleHREYXRhKAorICAgICAgICB1aW50MzJfdCB3aGF0LAorICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUsCisgICAgICAgIGludDMyX3QgY3VyR2VuLAorICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRzLAorICAgICAgICBzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgaW50MzJfdCBtc2dHZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJm1zZ0dlbmVyYXRpb24pKTsKKyAgICBpZiAobXNnR2VuZXJhdGlvbiAhPSBjdXJHZW4pIHsKKyAgICAgICAgLy8gc3RhbGUKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3Qgc3ViVGltZVVzOworICAgIGlmIChwYWNrZXRzLT5uZXh0QnVmZmVyVGltZSgmc3ViVGltZVVzKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBuZXh0U3ViVGltZVVzOworICAgIHJlYWRCdWZmZXIodHlwZSwgLTEsICZuZXh0U3ViVGltZVVzKTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBkZXF1ZXVlU3RhdHVzID0gcGFja2V0cy0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJmJ1ZmZlcik7CisgICAgaWYgKGRlcXVldWVTdGF0dXMgPT0gT0spIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwgd2hhdCk7CisgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKworICAgICAgICBjb25zdCBpbnQ2NF90IGRlbGF5VXMgPSBuZXh0U3ViVGltZVVzIC0gc3ViVGltZVVzOworICAgICAgICBtc2ctPnBvc3QoZGVsYXlVcyA8IDAgPyAwIDogZGVsYXlVcyk7CisgICAgfQorfQorCiBzcDxNZXRhRGF0YT4gTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRGb3JtYXQsIGlkKCkpOworICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgYXVkaW8pOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHZvaWQgKmZvcm1hdDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kUG9pbnRlcigiZm9ybWF0IiwgJmZvcm1hdCkpOworICAgICAgICByZXR1cm4gKE1ldGFEYXRhICopZm9ybWF0OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25HZXRGb3JtYXRNZXRhKHNwPEFNZXNzYWdlPiBtc2cpIGNvbnN0IHsKKyAgICBpbnQzMl90IGF1ZGlvOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBkb0dldEZvcm1hdE1ldGEoYXVkaW8pOworICAgIHJlc3BvbnNlLT5zZXRQb2ludGVyKCJmb3JtYXQiLCBmb3JtYXQuZ2V0KCkpOworCisgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKK30KKworc3A8TWV0YURhdGE+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpkb0dldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgY29uc3QgewogICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBhdWRpbyA/IG1BdWRpb1RyYWNrLm1Tb3VyY2UgOiBtVmlkZW9UcmFjay5tU291cmNlOwogCiAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CkBAIC0xNzAsMTQgKzg1Miw1MyBAQAogICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwogICAgIH0KIAorICAgIGlmIChtSXNXaWRldmluZSAmJiAhYXVkaW8pIHsKKyAgICAgICAgLy8gdHJ5IHRvIHJlYWQgYSBidWZmZXIgYXMgd2UgbWF5IG5vdCBoYXZlIGJlZW4gYWJsZSB0byB0aGUgbGFzdCB0aW1lCisgICAgICAgIHBvc3RSZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfVklERU8pOworICAgIH0KKwogICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OwogICAgIGlmICghdHJhY2stPm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgewotICAgICAgICByZXR1cm4gZmluYWxSZXN1bHQgPT0gT0sgPyAtRVdPVUxEQkxPQ0sgOiBmaW5hbFJlc3VsdDsKKyAgICAgICAgcmV0dXJuIChmaW5hbFJlc3VsdCA9PSBPSyA/IC1FV09VTERCTE9DSyA6IGZpbmFsUmVzdWx0KTsKICAgICB9CiAKICAgICBzdGF0dXNfdCByZXN1bHQgPSB0cmFjay0+bVBhY2tldHMtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogCi0gICAgcmVhZEJ1ZmZlcihhdWRpbywgLTFsbCk7CisgICAgaWYgKCF0cmFjay0+bVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIHBvc3RSZWFkQnVmZmVyKGF1ZGlvPyBNRURJQV9UUkFDS19UWVBFX0FVRElPIDogTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtU3VidGl0bGVUcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRpbWVkVGV4dFRyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzLT5jbGVhcigpOworICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzOworICAgIHN0YXR1c190IGVvc1Jlc3VsdDsgLy8gaWdub3JlZAorICAgIENIRUNLKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICBpZiAobVN1YnRpdGxlVHJhY2subVNvdXJjZSAhPSBOVUxMCisgICAgICAgICAgICAmJiAhbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsIGlkKCkpOworICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKworICAgIGlmIChtVGltZWRUZXh0VHJhY2subVNvdXJjZSAhPSBOVUxMCisgICAgICAgICAgICAmJiAhbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoVGltZWRUZXh0RGF0YSwgaWQoKSk7CisgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xODcsMjUgKzkwOCwzODcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NpemVfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNvdXJjZXMuc2l6ZSgpOworfQorCitzcDxBTWVzc2FnZT4gTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3QgeworICAgIHNpemVfdCB0cmFja0NvdW50ID0gbVNvdXJjZXMuc2l6ZSgpOworICAgIGlmICh0cmFja0luZGV4ID49IHRyYWNrQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZXMuaXRlbUF0KHRyYWNrSW5kZXgpLT5nZXRGb3JtYXQoKTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgaW50MzJfdCB0cmFja1R5cGU7CisgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTzsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkpIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOOworICAgIH0KKyAgICBmb3JtYXQtPnNldEludDMyKCJ0eXBlIiwgdHJhY2tUeXBlKTsKKworICAgIGNvbnN0IGNoYXIgKmxhbmc7CisgICAgaWYgKCFtZXRhLT5maW5kQ1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgJmxhbmcpKSB7CisgICAgICAgIGxhbmcgPSAidW5kIjsKKyAgICB9CisgICAgZm9ybWF0LT5zZXRTdHJpbmcoImxhbmd1YWdlIiwgbGFuZyk7CisKKyAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lKTsKKworICAgICAgICBpbnQzMl90IGlzQXV0b3NlbGVjdCA9IDEsIGlzRGVmYXVsdCA9IDAsIGlzRm9yY2VkID0gMDsKKyAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlUcmFja0lzQXV0b3NlbGVjdCwgJmlzQXV0b3NlbGVjdCk7CisgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5VHJhY2tJc0RlZmF1bHQsICZpc0RlZmF1bHQpOworICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSXNGb3JjZWQsICZpc0ZvcmNlZCk7CisKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYXV0byIsICEhaXNBdXRvc2VsZWN0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZGVmYXVsdCIsICEhaXNEZWZhdWx0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZm9yY2VkIiwgISFpc0ZvcmNlZCk7CisgICAgfQorCisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworc3NpemVfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgaWQoKSk7CisgICAgbXNnLT5zZXRJbnQzMigidHlwZSIsIHR5cGUpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIGludDMyX3QgaW5kZXg7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJpbmRleCIsICZpbmRleCkpOworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25HZXRTZWxlY3RlZFRyYWNrKHNwPEFNZXNzYWdlPiBtc2cpIGNvbnN0IHsKKyAgICBpbnQzMl90IHRtcFR5cGU7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAmdG1wVHlwZSkpOworICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXRtcFR5cGU7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgc3NpemVfdCBpbmRleCA9IGRvR2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKyAgICByZXNwb25zZS0+c2V0SW50MzIoImluZGV4IiwgaW5kZXgpOworCisgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKK30KKworc3NpemVfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZG9HZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgeworICAgIGNvbnN0IFRyYWNrICp0cmFjayA9IE5VTEw7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOgorICAgICAgICB0cmFjayA9ICZtVmlkZW9UcmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX0FVRElPOgorICAgICAgICB0cmFjayA9ICZtQXVkaW9UcmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVDoKKyAgICAgICAgdHJhY2sgPSAmbVRpbWVkVGV4dFRyYWNrOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEU6CisgICAgICAgIHRyYWNrID0gJm1TdWJ0aXRsZVRyYWNrOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAodHJhY2sgIT0gTlVMTCAmJiB0cmFjay0+bVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiB0cmFjay0+bUluZGV4OworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCkgeworICAgIEFMT0dWKCIlcyB0cmFjazogJXp1Iiwgc2VsZWN0ID8gInNlbGVjdCIgOiAiZGVzZWxlY3QiLCB0cmFja0luZGV4KTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VsZWN0VHJhY2ssIGlkKCkpOworICAgIG1zZy0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKKyAgICBtc2ctPnNldEludDMyKCJzZWxlY3QiLCBzZWxlY3QpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uU2VsZWN0VHJhY2soc3A8QU1lc3NhZ2U+IG1zZykgeworICAgIGludDMyX3QgdHJhY2tJbmRleCwgc2VsZWN0OworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2VsZWN0IiwgJnNlbGVjdCkpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgIHN0YXR1c190IGVyciA9IGRvU2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0KTsKKyAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisKKyAgICB1aW50MzJfdCByZXBseUlEOworICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZG9TZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpIHsKKyAgICBpZiAodHJhY2tJbmRleCA+PSBtU291cmNlcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBpZiAoIXNlbGVjdCkgeworICAgICAgICBUcmFjayogdHJhY2sgPSBOVUxMOworICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2subVNvdXJjZSAhPSBOVUxMICYmIHRyYWNrSW5kZXggPT0gbVN1YnRpdGxlVHJhY2subUluZGV4KSB7CisgICAgICAgICAgICB0cmFjayA9ICZtU3VidGl0bGVUcmFjazsKKyAgICAgICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfSBlbHNlIGlmIChtVGltZWRUZXh0VHJhY2subVNvdXJjZSAhPSBOVUxMICYmIHRyYWNrSW5kZXggPT0gbVRpbWVkVGV4dFRyYWNrLm1JbmRleCkgeworICAgICAgICAgICAgdHJhY2sgPSAmbVRpbWVkVGV4dFRyYWNrOworICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIHRyYWNrLT5tU291cmNlLT5zdG9wKCk7CisgICAgICAgIHRyYWNrLT5tU291cmNlID0gTlVMTDsKKyAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5jbGVhcigpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2VzLml0ZW1BdCh0cmFja0luZGV4KTsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidGV4dC8iLCA1KSkgeworICAgICAgICBib29sIGlzU3VidGl0bGUgPSBzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCk7CisgICAgICAgIFRyYWNrICp0cmFjayA9IGlzU3VidGl0bGUgPyAmbVN1YnRpdGxlVHJhY2sgOiAmbVRpbWVkVGV4dFRyYWNrOworICAgICAgICBpZiAodHJhY2stPm1Tb3VyY2UgIT0gTlVMTCAmJiB0cmFjay0+bUluZGV4ID09IHRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICB0cmFjay0+bUluZGV4ID0gdHJhY2tJbmRleDsKKyAgICAgICAgaWYgKHRyYWNrLT5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRyYWNrLT5tU291cmNlLT5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2stPm1Tb3VyY2UgPSBtU291cmNlcy5pdGVtQXQodHJhY2tJbmRleCk7CisgICAgICAgIHRyYWNrLT5tU291cmNlLT5zdGFydCgpOworICAgICAgICBpZiAodHJhY2stPm1QYWNrZXRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cyA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKHRyYWNrLT5tU291cmNlLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPmNsZWFyKCk7CisgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnNldEZvcm1hdCh0cmFjay0+bVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNTdWJ0aXRsZSkgeworICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikgfHwgIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICBib29sIGF1ZGlvID0gIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KTsKKyAgICAgICAgVHJhY2sgKnRyYWNrID0gYXVkaW8gPyAmbUF1ZGlvVHJhY2sgOiAmbVZpZGVvVHJhY2s7CisgICAgICAgIGlmICh0cmFjay0+bVNvdXJjZSAhPSBOVUxMICYmIHRyYWNrLT5tSW5kZXggPT0gdHJhY2tJbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUFWU291cmNlLCBpZCgpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwogc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgaWQoKSk7CisgICAgbXNnLT5zZXRJbnQ2NCgic2Vla1RpbWVVcyIsIHNlZWtUaW1lVXMpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uU2VlayhzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzZWVrVGltZVVzIiwgJnNlZWtUaW1lVXMpKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBkb1NlZWsoc2Vla1RpbWVVcyk7CisgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworCisgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRvU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKKyAgICAvLyBJZiB0aGUgV2lkZXZpbmUgc291cmNlIGlzIHN0b3BwZWQsIGRvIG5vdCBhdHRlbXB0IHRvIHJlYWQgYW55CisgICAgLy8gbW9yZSBidWZmZXJzLgorICAgIGlmIChtU3RvcFJlYWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KICAgICBpZiAobVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIGludDY0X3QgYWN0dWFsVGltZVVzOwotICAgICAgICByZWFkQnVmZmVyKGZhbHNlIC8qIGF1ZGlvICovLCBzZWVrVGltZVVzLCAmYWN0dWFsVGltZVVzKTsKKyAgICAgICAgcmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX1ZJREVPLCBzZWVrVGltZVVzLCAmYWN0dWFsVGltZVVzKTsKIAogICAgICAgICBzZWVrVGltZVVzID0gYWN0dWFsVGltZVVzOwogICAgIH0KIAogICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgcmVhZEJ1ZmZlcih0cnVlIC8qIGF1ZGlvICovLCBzZWVrVGltZVVzKTsKKyAgICAgICAgcmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX0FVRElPLCBzZWVrVGltZVVzKTsKICAgICB9CiAKKyAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpTVEFSVCwgc2Vla1RpbWVVcyAvIDEwMDApOworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChQbGF5YmFjazo6UEFVU0UsIDApOworICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKK3NwPEFCdWZmZXI+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjptZWRpYUJ1ZmZlclRvQUJ1ZmZlcigKKyAgICAgICAgTWVkaWFCdWZmZXIqIG1iLAorICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwKKyAgICAgICAgaW50NjRfdCAqYWN0dWFsVGltZVVzKSB7CisgICAgYm9vbCBhdWRpbyA9IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPOworICAgIHNpemVfdCBvdXRMZW5ndGggPSBtYi0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICBpZiAoYXVkaW8gJiYgbUF1ZGlvSXNWb3JiaXMpIHsKKyAgICAgICAgb3V0TGVuZ3RoICs9IHNpemVvZihpbnQzMl90KTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBhYjsKKyAgICBpZiAobUlzV2lkZXZpbmUgJiYgIWF1ZGlvKSB7CisgICAgICAgIC8vIGRhdGEgaXMgYWxyZWFkeSBwcm92aWRlZCBpbiB0aGUgYnVmZmVyCisgICAgICAgIGFiID0gbmV3IEFCdWZmZXIoTlVMTCwgbWItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgbWItPmFkZF9yZWYoKTsKKyAgICAgICAgYWItPnNldE1lZGlhQnVmZmVyQmFzZShtYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWIgPSBuZXcgQUJ1ZmZlcihvdXRMZW5ndGgpOworICAgICAgICBtZW1jcHkoYWItPmRhdGEoKSwKKyAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbWItPmRhdGEoKSArIG1iLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgIG1iLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgfQorCisgICAgaWYgKGF1ZGlvICYmIG1BdWRpb0lzVm9yYmlzKSB7CisgICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXM7CisgICAgICAgIGlmICghbWItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleVZhbGlkU2FtcGxlcywgJm51bVBhZ2VTYW1wbGVzKSkgeworICAgICAgICAgICAgbnVtUGFnZVNhbXBsZXMgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QqIGFiRW5kID0gYWItPmRhdGEoKSArIG1iLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgbWVtY3B5KGFiRW5kLCAmbnVtUGFnZVNhbXBsZXMsIHNpemVvZihudW1QYWdlU2FtcGxlcykpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gYWItPm1ldGEoKTsKKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1iLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgbWV0YS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIENIRUNLKG1UaW1lZFRleHRUcmFjay5tU291cmNlICE9IE5VTEwKKyAgICAgICAgICAgICAgICAmJiBtVGltZWRUZXh0VHJhY2subVNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgbWV0YS0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZSk7CisgICAgfQorCisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmIChtYi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICBtZXRhLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIGR1cmF0aW9uVXMpOworICAgIH0KKworICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMigidHJhY2tJbmRleCIsIG1TdWJ0aXRsZVRyYWNrLm1JbmRleCk7CisgICAgfQorCisgICAgaWYgKGFjdHVhbFRpbWVVcykgeworICAgICAgICAqYWN0dWFsVGltZVVzID0gdGltZVVzOworICAgIH0KKworICAgIG1iLT5yZWxlYXNlKCk7CisgICAgbWIgPSBOVUxMOworCisgICAgcmV0dXJuIGFiOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpwb3N0UmVhZEJ1ZmZlcihtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtUmVhZEJ1ZmZlckxvY2spOworCisgICAgaWYgKChtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcyAmICgxIDw8IHRyYWNrVHlwZSkpID09IDApIHsKKyAgICAgICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgfD0gKDEgPDwgdHJhY2tUeXBlKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlYWRCdWZmZXIsIGlkKCkpOworICAgICAgICBtc2ctPnNldEludDMyKCJ0cmFja1R5cGUiLCB0cmFja1R5cGUpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uUmVhZEJ1ZmZlcihzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgaW50MzJfdCB0bXBUeXBlOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0cmFja1R5cGUiLCAmdG1wVHlwZSkpOworICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlID0gKG1lZGlhX3RyYWNrX3R5cGUpdG1wVHlwZTsKKyAgICB7CisgICAgICAgIC8vIG9ubHkgcHJvdGVjdCB0aGUgdmFyaWFibGUgY2hhbmdlLCBhcyByZWFkQnVmZmVyIG1heQorICAgICAgICAvLyB0YWtlIGNvbnNpZGVyYWJsZSB0aW1lLiAgVGhpcyBtYXkgcmVzdWx0IGluIG9uZSBleHRyYQorICAgICAgICAvLyByZWFkIGJlaW5nIHByb2Nlc3NlZCwgYnV0IHRoYXQgaXMgYmVuaWduLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVJlYWRCdWZmZXJMb2NrKTsKKyAgICAgICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJj0gfigxIDw8IHRyYWNrVHlwZSk7CisgICAgfQorICAgIHJlYWRCdWZmZXIodHJhY2tUeXBlKTsKK30KKwogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cmVhZEJ1ZmZlcigKLSAgICAgICAgYm9vbCBhdWRpbywgaW50NjRfdCBzZWVrVGltZVVzLCBpbnQ2NF90ICphY3R1YWxUaW1lVXMpIHsKLSAgICBUcmFjayAqdHJhY2sgPSBhdWRpbyA/ICZtQXVkaW9UcmFjayA6ICZtVmlkZW9UcmFjazsKLSAgICBDSEVDSyh0cmFjay0+bVNvdXJjZSAhPSBOVUxMKTsKKyAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsIGludDY0X3Qgc2Vla1RpbWVVcywgaW50NjRfdCAqYWN0dWFsVGltZVVzLCBib29sIGZvcm1hdENoYW5nZSkgeworICAgIC8vIERvIG5vdCByZWFkIGRhdGEgaWYgV2lkZXZpbmUgc291cmNlIGlzIHN0b3BwZWQKKyAgICBpZiAobVN0b3BSZWFkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVHJhY2sgKnRyYWNrOworICAgIHNpemVfdCBtYXhCdWZmZXJzID0gMTsKKyAgICBzd2l0Y2ggKHRyYWNrVHlwZSkgeworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgICAgICB0cmFjayA9ICZtVmlkZW9UcmFjazsKKyAgICAgICAgICAgIGlmIChtSXNXaWRldmluZSkgeworICAgICAgICAgICAgICAgIG1heEJ1ZmZlcnMgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9BVURJTzoKKyAgICAgICAgICAgIHRyYWNrID0gJm1BdWRpb1RyYWNrOworICAgICAgICAgICAgaWYgKG1Jc1dpZGV2aW5lKSB7CisgICAgICAgICAgICAgICAgbWF4QnVmZmVycyA9IDg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1heEJ1ZmZlcnMgPSA2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEU6CisgICAgICAgICAgICB0cmFjayA9ICZtU3VidGl0bGVUcmFjazsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUOgorICAgICAgICAgICAgdHJhY2sgPSAmbVRpbWVkVGV4dFRyYWNrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworICAgIGlmICh0cmFjay0+bVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBpZiAoYWN0dWFsVGltZVVzKSB7CiAgICAgICAgICphY3R1YWxUaW1lVXMgPSBzZWVrVGltZVVzOwpAQCAtMjE2LDY0ICsxMjk5LDU2IEBACiAgICAgYm9vbCBzZWVraW5nID0gZmFsc2U7CiAKICAgICBpZiAoc2Vla1RpbWVVcyA+PSAwKSB7Ci0gICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHNlZWtUaW1lVXMpOworICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhzZWVrVGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7CiAgICAgICAgIHNlZWtpbmcgPSB0cnVlOwogICAgIH0KIAotICAgIGZvciAoOzspIHsKKyAgICBpZiAobUlzV2lkZXZpbmUgJiYgdHJhY2tUeXBlICE9IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKKyAgICAgICAgb3B0aW9ucy5zZXROb25CbG9ja2luZygpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IG51bUJ1ZmZlcnMgPSAwOyBudW1CdWZmZXJzIDwgbWF4QnVmZmVyczsgKSB7CiAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSB0cmFjay0+bVNvdXJjZS0+cmVhZCgmbWJ1ZiwgJm9wdGlvbnMpOwogCiAgICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKIAogICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICBzaXplX3Qgb3V0TGVuZ3RoID0gbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIGlmIChhdWRpbyAmJiBtQXVkaW9Jc1ZvcmJpcykgewotICAgICAgICAgICAgICAgIG91dExlbmd0aCArPSBzaXplb2YoaW50MzJfdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG91dExlbmd0aCk7Ci0KLSAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1idWYtPmRhdGEoKSArIG1idWYtPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgICAgIG1idWYtPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICAgICAgaWYgKGF1ZGlvICYmIG1BdWRpb0lzVm9yYmlzKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBudW1QYWdlU2FtcGxlczsKLSAgICAgICAgICAgICAgICBpZiAoIW1idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVZhbGlkU2FtcGxlcywgJm51bVBhZ2VTYW1wbGVzKSkgewotICAgICAgICAgICAgICAgICAgICBudW1QYWdlU2FtcGxlcyA9IC0xOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSArIG1idWYtPnJhbmdlX2xlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAmbnVtUGFnZVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihudW1QYWdlU2FtcGxlcykpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgICAgIENIRUNLKG1idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKLQotICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgICAgICAgICBpZiAoYWN0dWFsVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgKmFjdHVhbFRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTykgeworICAgICAgICAgICAgICAgIG1BdWRpb1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgICAgICBtVmlkZW9UaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1idWYgPSBOVUxMOwotCi0gICAgICAgICAgICBpZiAoc2Vla2luZykgewotICAgICAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+cXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1NFRUssIE5VTEwpOworICAgICAgICAgICAgLy8gZm9ybWF0Q2hhbmdlICYmIHNlZWtpbmc6IHRyYWNrIHdob3NlIHNvdXJjZSBpcyBjaGFuZ2VkIGR1cmluZyBzZWxlY3Rpb24KKyAgICAgICAgICAgIC8vIGZvcm1hdENoYW5nZSAmJiAhc2Vla2luZzogdHJhY2sgd2hvc2Ugc291cmNlIGlzIG5vdCBjaGFuZ2VkIGR1cmluZyBzZWxlY3Rpb24KKyAgICAgICAgICAgIC8vICFmb3JtYXRDaGFuZ2U6IG5vcm1hbCBzZWVrCisgICAgICAgICAgICBpZiAoKHNlZWtpbmcgfHwgZm9ybWF0Q2hhbmdlKQorICAgICAgICAgICAgICAgICAgICAmJiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8KKyAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfVklERU8pKSB7CisgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlID0gZm9ybWF0Q2hhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICA/IChzZWVraW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9OT05FKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSzsKKyAgICAgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnF1ZXVlRGlzY29udGludWl0eSggdHlwZSwgTlVMTCwgdHJ1ZSAvKiBkaXNjYXJkICovKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbWVkaWFCdWZmZXJUb0FCdWZmZXIobWJ1ZiwgdHJhY2tUeXBlLCBhY3R1YWxUaW1lVXMpOwogICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5xdWV1ZUFjY2Vzc1VuaXQoYnVmZmVyKTsKKyAgICAgICAgICAgIGZvcm1hdENoYW5nZSA9IGZhbHNlOworICAgICAgICAgICAgc2Vla2luZyA9IGZhbHNlOworICAgICAgICAgICAgKytudW1CdWZmZXJzOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBXT1VMRF9CTE9DSykgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKICNpZiAwCiAgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnF1ZXVlRGlzY29udGludWl0eSgKLSAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UsCisgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGRpc2NhcmQgKi8pOwogI2VuZGlmCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnNpZ25hbEVPUyhlcnIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKaW5kZXggMmRhNjgwYy4uMWI2ODI4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCkBAIC0yMyw1OCArMjMsMTc2IEBACiAKICNpbmNsdWRlICJBVFNQYXJzZXIuaCIKIAorI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgRGVjcnlwdEhhbmRsZTsKK2NsYXNzIERybU1hbmFnZXJDbGllbnQ7CiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKIHN0cnVjdCBBUlRTUENvbnRyb2xsZXI7CiBzdHJ1Y3QgRGF0YVNvdXJjZTsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKK2NsYXNzIE1lZGlhQnVmZmVyOworc3RydWN0IE51Q2FjaGVkU291cmNlMjsKK3N0cnVjdCBXVk1FeHRyYWN0b3I7CiAKIHN0cnVjdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjo6U291cmNlIHsKLSAgICBHZW5lcmljU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIGJvb2wgdWlkVmFsaWQgPSBmYWxzZSwKLSAgICAgICAgICAgIHVpZF90IHVpZCA9IDApOworICAgIEdlbmVyaWNTb3VyY2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGJvb2wgdWlkVmFsaWQsIHVpZF90IHVpZCk7CiAKLSAgICBHZW5lcmljU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisgICAgdmlydHVhbCB2b2lkIHBhdXNlKCk7CisgICAgdmlydHVhbCB2b2lkIHJlc3VtZSgpOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmVlZE1vcmVUU0RhdGEoKTsKIAorICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZpbGVGb3JtYXRNZXRhKCkgY29uc3Q7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CisgICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhib29sIGF1ZGlvLCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJmJ1ZmZlcnMpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+R2VuZXJpY1NvdXJjZSgpOwogCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKwogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbyk7CiAKIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UHJlcGFyZUFzeW5jLAorICAgICAgICBrV2hhdEZldGNoU3VidGl0bGVEYXRhLAorICAgICAgICBrV2hhdEZldGNoVGltZWRUZXh0RGF0YSwKKyAgICAgICAga1doYXRTZW5kU3VidGl0bGVEYXRhLAorICAgICAgICBrV2hhdFNlbmRUaW1lZFRleHREYXRhLAorICAgICAgICBrV2hhdENoYW5nZUFWU291cmNlLAorICAgICAgICBrV2hhdFBvbGxCdWZmZXJpbmcsCisgICAgICAgIGtXaGF0R2V0Rm9ybWF0LAorICAgICAgICBrV2hhdEdldFNlbGVjdGVkVHJhY2ssCisgICAgICAgIGtXaGF0U2VsZWN0VHJhY2ssCisgICAgICAgIGtXaGF0U2VlaywKKyAgICAgICAga1doYXRSZWFkQnVmZmVyLAorICAgICAgICBrV2hhdFN0b3BXaWRldmluZSwKKyAgICB9OworCisgICAgVmVjdG9yPHNwPE1lZGlhU291cmNlPiA+IG1Tb3VyY2VzOworCiAgICAgc3RydWN0IFRyYWNrIHsKKyAgICAgICAgc2l6ZV90IG1JbmRleDsKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1QYWNrZXRzOwogICAgIH07CiAKICAgICBUcmFjayBtQXVkaW9UcmFjazsKKyAgICBpbnQ2NF90IG1BdWRpb1RpbWVVczsKICAgICBUcmFjayBtVmlkZW9UcmFjazsKKyAgICBpbnQ2NF90IG1WaWRlb1RpbWVVczsKKyAgICBUcmFjayBtU3VidGl0bGVUcmFjazsKKyAgICBUcmFjayBtVGltZWRUZXh0VHJhY2s7CiAKKyAgICBpbnQzMl90IG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb247CisgICAgaW50MzJfdCBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbjsKICAgICBpbnQ2NF90IG1EdXJhdGlvblVzOwogICAgIGJvb2wgbUF1ZGlvSXNWb3JiaXM7CisgICAgYm9vbCBtSXNXaWRldmluZTsKKyAgICBib29sIG1VSURWYWxpZDsKKyAgICB1aWRfdCBtVUlEOworICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CisgICAgQVN0cmluZyBtVXJpOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1VcmlIZWFkZXJzOworICAgIGludCBtRmQ7CisgICAgaW50NjRfdCBtT2Zmc2V0OworICAgIGludDY0X3QgbUxlbmd0aDsKIAotICAgIHZvaWQgaW5pdEZyb21EYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKTsKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IG1DYWNoZWRTb3VyY2U7CisgICAgc3A8RGF0YVNvdXJjZT4gbUh0dHBTb3VyY2U7CisgICAgc3A8V1ZNRXh0cmFjdG9yPiBtV1ZNRXh0cmFjdG9yOworICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGE7CisgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBib29sIG1TdG9wUmVhZDsKKyAgICBTdHJpbmc4IG1Db250ZW50VHlwZTsKKyAgICBBU3RyaW5nIG1TbmlmZmVkTUlNRTsKKyAgICBvZmY2NF90IG1NZXRhRGF0YVNpemU7CisgICAgaW50NjRfdCBtQml0cmF0ZTsKKyAgICBpbnQzMl90IG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKKyAgICB1aW50MzJfdCBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlczsKKyAgICBtdXRhYmxlIE11dGV4IG1SZWFkQnVmZmVyTG9jazsKKyAgICBtdXRhYmxlIE11dGV4IG1EaXNjb25uZWN0TG9jazsKIAorICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisKKyAgICB2b2lkIHJlc2V0RGF0YVNvdXJjZSgpOworCisgICAgc3RhdHVzX3QgaW5pdEZyb21EYXRhU291cmNlKCk7CisgICAgdm9pZCBjaGVja0RybVN0YXR1cyhjb25zdCBzcDxEYXRhU291cmNlPiYgZGF0YVNvdXJjZSk7CisgICAgaW50NjRfdCBnZXRMYXN0UmVhZFBvc2l0aW9uKCk7CisgICAgdm9pZCBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisKKyAgICBzdGF0dXNfdCBwcmVmaWxsQ2FjaGVJZk5lY2Vzc2FyeSgpOworCisgICAgdm9pZCBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoc3RhdHVzX3QgZXJyKTsKKworICAgIHZvaWQgb25HZXRGb3JtYXRNZXRhKHNwPEFNZXNzYWdlPiBtc2cpIGNvbnN0OworICAgIHNwPE1ldGFEYXRhPiBkb0dldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgY29uc3Q7CisKKyAgICB2b2lkIG9uR2V0U2VsZWN0ZWRUcmFjayhzcDxBTWVzc2FnZT4gbXNnKSBjb25zdDsKKyAgICBzc2l6ZV90IGRvR2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0OworCisgICAgdm9pZCBvblNlbGVjdFRyYWNrKHNwPEFNZXNzYWdlPiBtc2cpOworICAgIHN0YXR1c190IGRvU2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KTsKKworICAgIHZvaWQgb25TZWVrKHNwPEFNZXNzYWdlPiBtc2cpOworICAgIHN0YXR1c190IGRvU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMpOworCisgICAgdm9pZCBvblByZXBhcmVBc3luYygpOworCisgICAgdm9pZCBmZXRjaFRleHREYXRhKAorICAgICAgICAgICAgdWludDMyX3Qgd2hhdCwgbWVkaWFfdHJhY2tfdHlwZSB0eXBlLAorICAgICAgICAgICAgaW50MzJfdCBjdXJHZW4sIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldHMsIHNwPEFNZXNzYWdlPiBtc2cpOworCisgICAgdm9pZCBzZW5kVGV4dERhdGEoCisgICAgICAgICAgICB1aW50MzJfdCB3aGF0LCBtZWRpYV90cmFja190eXBlIHR5cGUsCisgICAgICAgICAgICBpbnQzMl90IGN1ckdlbiwgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0cywgc3A8QU1lc3NhZ2U+IG1zZyk7CisKKyAgICBzcDxBQnVmZmVyPiBtZWRpYUJ1ZmZlclRvQUJ1ZmZlcigKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmLAorICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsCisgICAgICAgICAgICBpbnQ2NF90ICphY3R1YWxUaW1lVXMgPSBOVUxMKTsKKworICAgIHZvaWQgcG9zdFJlYWRCdWZmZXIobWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUpOworICAgIHZvaWQgb25SZWFkQnVmZmVyKHNwPEFNZXNzYWdlPiBtc2cpOwogICAgIHZvaWQgcmVhZEJ1ZmZlcigKLSAgICAgICAgICAgIGJvb2wgYXVkaW8sCi0gICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSAtMWxsLCBpbnQ2NF90ICphY3R1YWxUaW1lVXMgPSBOVUxMKTsKKyAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLAorICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gLTFsbCwgaW50NjRfdCAqYWN0dWFsVGltZVVzID0gTlVMTCwgYm9vbCBmb3JtYXRDaGFuZ2UgPSBmYWxzZSk7CisKKyAgICB2b2lkIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOworICAgIHZvaWQgY2FuY2VsUG9sbEJ1ZmZlcmluZygpOworICAgIHZvaWQgb25Qb2xsQnVmZmVyaW5nKCk7CisgICAgdm9pZCBub3RpZnlCdWZmZXJpbmdVcGRhdGUoaW50IHBlcmNlbnRhZ2UpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoR2VuZXJpY1NvdXJjZSk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKaW5kZXggZjE3ODJjYy4uYTAwM2M4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiTGl2ZURhdGFTb3VyY2UuaCIKICNpbmNsdWRlICJMaXZlU2Vzc2lvbi5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTM0LDEzICszNSwxMiBAQAogCiBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OkhUVFBMaXZlU291cmNlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqdXJsLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgYm9vbCB1aWRWYWxpZCwgdWlkX3QgdWlkKQorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKICAgICA6IFNvdXJjZShub3RpZnkpLAorICAgICAgbUhUVFBTZXJ2aWNlKGh0dHBTZXJ2aWNlKSwKICAgICAgIG1VUkwodXJsKSwKLSAgICAgIG1VSURWYWxpZCh1aWRWYWxpZCksCi0gICAgICBtVUlEKHVpZCksCiAgICAgICBtRmxhZ3MoMCksCiAgICAgICBtRmluYWxSZXN1bHQoT0spLAogICAgICAgbU9mZnNldCgwKSwKQEAgLTYyLDI1ICs2MiwzMSBAQAogTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjp+SFRUUExpdmVTb3VyY2UoKSB7CiAgICAgaWYgKG1MaXZlU2Vzc2lvbiAhPSBOVUxMKSB7CiAgICAgICAgIG1MaXZlU2Vzc2lvbi0+ZGlzY29ubmVjdCgpOwotICAgICAgICBtTGl2ZVNlc3Npb24uY2xlYXIoKTsKIAorICAgICAgICBtTGl2ZUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUxpdmVTZXNzaW9uLT5pZCgpKTsKKyAgICAgICAgbUxpdmVMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOwogICAgICAgICBtTGl2ZUxvb3Blci0+c3RvcCgpOworCisgICAgICAgIG1MaXZlU2Vzc2lvbi5jbGVhcigpOwogICAgICAgICBtTGl2ZUxvb3Blci5jbGVhcigpOwogICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OnByZXBhcmVBc3luYygpIHsKLSAgICBtTGl2ZUxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgIG1MaXZlTG9vcGVyLT5zZXROYW1lKCJodHRwIGxpdmUiKTsKLSAgICBtTGl2ZUxvb3Blci0+c3RhcnQoKTsKKyAgICBpZiAobUxpdmVMb29wZXIgPT0gTlVMTCkgeworICAgICAgICBtTGl2ZUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICBtTGl2ZUxvb3Blci0+c2V0TmFtZSgiaHR0cCBsaXZlIik7CisgICAgICAgIG1MaXZlTG9vcGVyLT5zdGFydCgpOworCisgICAgICAgIG1MaXZlTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CisgICAgfQogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25Ob3RpZnksIGlkKCkpOwogCiAgICAgbUxpdmVTZXNzaW9uID0gbmV3IExpdmVTZXNzaW9uKAogICAgICAgICAgICAgbm90aWZ5LAogICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKSA/IExpdmVTZXNzaW9uOjprRmxhZ0luY29nbml0byA6IDAsCi0gICAgICAgICAgICBtVUlEVmFsaWQsCi0gICAgICAgICAgICBtVUlEKTsKKyAgICAgICAgICAgIG1IVFRQU2VydmljZSk7CiAKICAgICBtTGl2ZUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1MaXZlU2Vzc2lvbik7CiAKQEAgLTEyMSw4ICsxMjcsMTIgQEAKICAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5nZXREdXJhdGlvbihkdXJhdGlvblVzKTsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpnZXRUcmFja0luZm8oUGFyY2VsICpyZXBseSkgY29uc3QgewotICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldFRyYWNrSW5mbyhyZXBseSk7CitzaXplX3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpnZXRUcmFja0NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldFRyYWNrQ291bnQoKTsKK30KKworc3A8QU1lc3NhZ2U+IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6Z2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OnNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCkgewpAQCAtMTQwLDcgKzE1MCw3IEBACiAgICAgLy8gTGl2ZVNlc3Npb246OnNlbGVjdFRyYWNrIHJldHVybnMgQkFEX1ZBTFVFIHdoZW4gc2VsZWN0aW5nIHRoZSBjdXJyZW50bHkKICAgICAvLyBzZWxlY3RlZCB0cmFjaywgb3IgdW5zZWxlY3RpbmcgYSBub24tc2VsZWN0ZWQgdHJhY2suIEluIHRoaXMgY2FzZSBpdCdzIGFuCiAgICAgLy8gbm8tb3Agc28gd2UgcmV0dXJuIE9LLgotICAgIHJldHVybiAoZXJyID09IE9LIHx8IGVyciA9PSBCQURfVkFMVUUpID8gT0sgOiBlcnI7CisgICAgcmV0dXJuIChlcnIgPT0gT0sgfHwgZXJyID09IEJBRF9WQUxVRSkgPyAoc3RhdHVzX3QpT0sgOiBlcnI7CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6c2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcykgewpAQCAtMjA3LDkgKzIxNyw5IEBACiAgICAgICAgICAgICBpbnQzMl90IGhlaWdodDsKICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCAmJgogICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpICYmIGZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZChmb3JtYXQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKDAsIDApOworICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBGTEFHX0NBTl9QQVVTRTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKaW5kZXggYmNjM2Y4Yi4uNmI1ZjZhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKQEAgLTI4LDEwICsyOCw5IEBACiBzdHJ1Y3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlIDogcHVibGljIE51UGxheWVyOjpTb3VyY2UgewogICAgIEhUVFBMaXZlU291cmNlKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBib29sIHVpZFZhbGlkID0gZmFsc2UsCi0gICAgICAgICAgICB1aWRfdCB1aWQgPSAwKTsKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKQEAgLTQxLDcgKzQwLDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmVlZE1vcmVUU0RhdGEoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tJbmZvKFBhcmNlbCAqcmVwbHkpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMpOwogCkBAIC02MSwxMCArNjEsOSBAQAogICAgICAgICBrV2hhdEZldGNoU3VidGl0bGVEYXRhLAogICAgIH07CiAKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogICAgIEFTdHJpbmcgbVVSTDsKICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtRXh0cmFIZWFkZXJzOwotICAgIGJvb2wgbVVJRFZhbGlkOwotICAgIHVpZF90IG1VSUQ7CiAgICAgdWludDMyX3QgbUZsYWdzOwogICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKICAgICBvZmY2NF90IG1PZmZzZXQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAppbmRleCAyNWQ1NWEzLi5hNjNhOTQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKQEAgLTIyLDI0ICsyMiwyMiBAQAogCiAjaW5jbHVkZSAiSFRUUExpdmVTb3VyY2UuaCIKICNpbmNsdWRlICJOdVBsYXllckRlY29kZXIuaCIKKyNpbmNsdWRlICJOdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oIgogI2luY2x1ZGUgIk51UGxheWVyRHJpdmVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJSZW5kZXJlci5oIgogI2luY2x1ZGUgIk51UGxheWVyU291cmNlLmgiCiAjaW5jbHVkZSAiUlRTUFNvdXJjZS5oIgogI2luY2x1ZGUgIlN0cmVhbWluZ1NvdXJjZS5oIgogI2luY2x1ZGUgIkdlbmVyaWNTb3VyY2UuaCIKLSNpbmNsdWRlICJtcDQvTVA0U291cmNlLmgiCisjaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9ucy5oIgogCiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKLSNpbmNsdWRlICJTb2Z0d2FyZVJlbmRlcmVyLmgiCi0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPiAvLyBmb3IgcHJvcGVydHlfZ2V0CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CkBAIC01Miw2ICs1MCwxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8vIFRPRE8gb3B0aW1pemUgYnVmZmVyIHNpemUgZm9yIHBvd2VyIGNvbnN1bXB0aW9uCisvLyBUaGUgb2ZmbG9hZCByZWFkIGJ1ZmZlciBzaXplIGlzIDMyIEtCIGJ1dCAyNCBLQiB1c2VzIGxlc3MgcG93ZXIuCitjb25zdCBzaXplX3QgTnVQbGF5ZXI6OmtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXMgPSAyNCAqIDEwMjQ7CisKIHN0cnVjdCBOdVBsYXllcjo6QWN0aW9uIDogcHVibGljIFJlZkJhc2UgewogICAgIEFjdGlvbigpIHt9CiAKQEAgLTYyLDE2ICs2NCwxOCBAQAogfTsKIAogc3RydWN0IE51UGxheWVyOjpTZWVrQWN0aW9uIDogcHVibGljIEFjdGlvbiB7Ci0gICAgU2Vla0FjdGlvbihpbnQ2NF90IHNlZWtUaW1lVXMpCi0gICAgICAgIDogbVNlZWtUaW1lVXMoc2Vla1RpbWVVcykgeworICAgIFNlZWtBY3Rpb24oaW50NjRfdCBzZWVrVGltZVVzLCBib29sIG5lZWROb3RpZnkpCisgICAgICAgIDogbVNlZWtUaW1lVXMoc2Vla1RpbWVVcyksCisgICAgICAgICAgbU5lZWROb3RpZnkobmVlZE5vdGlmeSkgewogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCBleGVjdXRlKE51UGxheWVyICpwbGF5ZXIpIHsKLSAgICAgICAgcGxheWVyLT5wZXJmb3JtU2VlayhtU2Vla1RpbWVVcyk7CisgICAgICAgIHBsYXllci0+cGVyZm9ybVNlZWsobVNlZWtUaW1lVXMsIG1OZWVkTm90aWZ5KTsKICAgICB9CiAKIHByaXZhdGU6CiAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKKyAgICBib29sIG1OZWVkTm90aWZ5OwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vla0FjdGlvbik7CiB9OwpAQCAtMTQ4LDIyICsxNTIsMjYgQEAKICAgICA6IG1VSURWYWxpZChmYWxzZSksCiAgICAgICBtU291cmNlRmxhZ3MoMCksCiAgICAgICBtVmlkZW9Jc0FWQyhmYWxzZSksCi0gICAgICBtTmVlZHNTd1JlbmRlcmVyKGZhbHNlKSwKKyAgICAgIG1PZmZsb2FkQXVkaW8oZmFsc2UpLAorICAgICAgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24oMCksCisgICAgICBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbigwKSwKKyAgICAgIG1SZW5kZXJlckdlbmVyYXRpb24oMCksCiAgICAgICBtQXVkaW9FT1MoZmFsc2UpLAogICAgICAgbVZpZGVvRU9TKGZhbHNlKSwKICAgICAgIG1TY2FuU291cmNlc1BlbmRpbmcoZmFsc2UpLAogICAgICAgbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbigwKSwKICAgICAgIG1Qb2xsRHVyYXRpb25HZW5lcmF0aW9uKDApLAorICAgICAgbVRpbWVkVGV4dEdlbmVyYXRpb24oMCksCiAgICAgICBtVGltZURpc2NvbnRpbnVpdHlQZW5kaW5nKGZhbHNlKSwKICAgICAgIG1GbHVzaGluZ0F1ZGlvKE5PTkUpLAogICAgICAgbUZsdXNoaW5nVmlkZW8oTk9ORSksCiAgICAgICBtU2tpcFJlbmRlcmluZ0F1ZGlvVW50aWxNZWRpYVRpbWVVcygtMWxsKSwKICAgICAgIG1Ta2lwUmVuZGVyaW5nVmlkZW9VbnRpbE1lZGlhVGltZVVzKC0xbGwpLAotICAgICAgbVZpZGVvTGF0ZUJ5VXMoMGxsKSwKICAgICAgIG1OdW1GcmFtZXNUb3RhbCgwbGwpLAogICAgICAgbU51bUZyYW1lc0Ryb3BwZWQoMGxsKSwKICAgICAgIG1WaWRlb1NjYWxpbmdNb2RlKE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyksCiAgICAgICBtU3RhcnRlZChmYWxzZSkgeworICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOwogfQogCiBOdVBsYXllcjo6fk51UGxheWVyKCkgewpAQCAtMTgzLDE0ICsxOTEsNyBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgaWQoKSk7CiAKLSAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC51c2UtbXA0c291cmNlIiwgcHJvcCwgTlVMTCkKLSAgICAgICAgICAgICYmICghc3RyY21wKHByb3AsICIxIikgfHwgIXN0cmNhc2VjbXAocHJvcCwgInRydWUiKSkpIHsKLSAgICAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBNUDRTb3VyY2Uobm90aWZ5LCBzb3VyY2UpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgbmV3IFN0cmVhbWluZ1NvdXJjZShub3RpZnksIHNvdXJjZSkpOwotICAgIH0KLQorICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBuZXcgU3RyZWFtaW5nU291cmNlKG5vdGlmeSwgc291cmNlKSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKQEAgLTIxMiw3ICsyMTMsMTAgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6c2V0RGF0YVNvdXJjZUFzeW5jKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKwogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCBpZCgpKTsKICAgICBzaXplX3QgbGVuID0gc3RybGVuKHVybCk7CiAKQEAgLTIyMCwxOCArMjI0LDMxIEBACiAKICAgICBzcDxTb3VyY2U+IHNvdXJjZTsKICAgICBpZiAoSXNIVFRQTGl2ZVVSTCh1cmwpKSB7Ci0gICAgICAgIHNvdXJjZSA9IG5ldyBIVFRQTGl2ZVNvdXJjZShub3RpZnksIHVybCwgaGVhZGVycywgbVVJRFZhbGlkLCBtVUlEKTsKKyAgICAgICAgc291cmNlID0gbmV3IEhUVFBMaXZlU291cmNlKG5vdGlmeSwgaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CiAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAodXJsLCAicnRzcDovLyIsIDcpKSB7Ci0gICAgICAgIHNvdXJjZSA9IG5ldyBSVFNQU291cmNlKG5vdGlmeSwgdXJsLCBoZWFkZXJzLCBtVUlEVmFsaWQsIG1VSUQpOworICAgICAgICBzb3VyY2UgPSBuZXcgUlRTUFNvdXJjZSgKKyAgICAgICAgICAgICAgICBub3RpZnksIGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCk7CiAgICAgfSBlbHNlIGlmICgoIXN0cm5jYXNlY21wKHVybCwgImh0dHA6Ly8iLCA3KQogICAgICAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCh1cmwsICJodHRwczovLyIsIDgpKQogICAgICAgICAgICAgICAgICAgICAmJiAoKGxlbiA+PSA0ICYmICFzdHJjYXNlY21wKCIuc2RwIiwgJnVybFtsZW4gLSA0XSkpCiAgICAgICAgICAgICAgICAgICAgIHx8IHN0cnN0cih1cmwsICIuc2RwPyIpKSkgewotICAgICAgICBzb3VyY2UgPSBuZXcgUlRTUFNvdXJjZShub3RpZnksIHVybCwgaGVhZGVycywgbVVJRFZhbGlkLCBtVUlELCB0cnVlKTsKKyAgICAgICAgc291cmNlID0gbmV3IFJUU1BTb3VyY2UoCisgICAgICAgICAgICAgICAgbm90aWZ5LCBodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzLCBtVUlEVmFsaWQsIG1VSUQsIHRydWUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNvdXJjZSA9IG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgdXJsLCBoZWFkZXJzLCBtVUlEVmFsaWQsIG1VSUQpOwotICAgIH0KKyAgICAgICAgc3A8R2VuZXJpY1NvdXJjZT4gZ2VuZXJpY1NvdXJjZSA9CisgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQpOworICAgICAgICAvLyBEb24ndCBzZXQgRkxBR19TRUNVUkUgb24gbVNvdXJjZUZsYWdzIGhlcmUgZm9yIHdpZGV2aW5lLgorICAgICAgICAvLyBUaGUgY29ycmVjdCBmbGFncyB3aWxsIGJlIHVwZGF0ZWQgaW4gU291cmNlOjprV2hhdEZsYWdzQ2hhbmdlZAorICAgICAgICAvLyBoYW5kbGVyIHdoZW4gIEdlbmVyaWNTb3VyY2UgaXMgcHJlcGFyZWQuCiAKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKKworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBzb3VyY2UgPSBnZW5lcmljU291cmNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgZGF0YSBzb3VyY2UhIik7CisgICAgICAgIH0KKyAgICB9CiAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CkBAIC0yNDEsNyArMjU4LDE2IEBACiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U291cmNlTm90aWZ5LCBpZCgpKTsKIAotICAgIHNwPFNvdXJjZT4gc291cmNlID0gbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIHNwPEdlbmVyaWNTb3VyY2U+IHNvdXJjZSA9CisgICAgICAgICAgICBuZXcgR2VuZXJpY1NvdXJjZShub3RpZnksIG1VSURWYWxpZCwgbVVJRCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgZGF0YSBzb3VyY2UhIik7CisgICAgICAgIHNvdXJjZSA9IE5VTEw7CisgICAgfQorCiAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CkBAIC0yNjAsNyArMjg2LDcgQEAKICAgICAgICAgbXNnLT5zZXRPYmplY3QoCiAgICAgICAgICAgICAgICAgIm5hdGl2ZS13aW5kb3ciLAogICAgICAgICAgICAgICAgIG5ldyBOYXRpdmVXaW5kb3dXcmFwcGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIsIHRydWUgLyogY29udHJvbGxlZEJ5QXBwICovKSkpOwogICAgIH0KIAogICAgIG1zZy0+cG9zdCgpOwpAQCAtMjg1LDMyICszMTEsNTIgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6cmVzZXRBc3luYygpIHsKKyAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIER1cmluZyBhIHJlc2V0LCB0aGUgZGF0YSBzb3VyY2UgbWlnaHQgYmUgdW5yZXNwb25zaXZlIGFscmVhZHksIHdlIG5lZWQgdG8KKyAgICAgICAgLy8gZGlzY29ubmVjdCBleHBsaWNpdGx5IHNvIHRoYXQgcmVhZHMgZXhpdCBwcm9tcHRseS4KKyAgICAgICAgLy8gV2UgY2FuJ3QgcXVldWUgdGhlIGRpc2Nvbm5lY3QgcmVxdWVzdCB0byB0aGUgbG9vcGVyLCBhcyBpdCBtaWdodCBiZQorICAgICAgICAvLyBxdWV1ZWQgYmVoaW5kIGEgc3R1Y2sgcmVhZCBhbmQgbmV2ZXIgZ2V0cyBwcm9jZXNzZWQuCisgICAgICAgIC8vIERvaW5nIGEgZGlzY29ubmVjdCBvdXRzaWRlIHRoZSBsb29wZXIgdG8gYWxsb3dzIHRoZSBwZW5kaW5nIHJlYWRzIHRvIGV4aXQKKyAgICAgICAgLy8gKGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBlcnJvcikuCisgICAgICAgIG1Tb3VyY2UtPmRpc2Nvbm5lY3QoKTsKKyAgICB9CisKICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzZXQsIGlkKCkpKS0+cG9zdCgpOwogfQogCi12b2lkIE51UGxheWVyOjpzZWVrVG9Bc3luYyhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKK3ZvaWQgTnVQbGF5ZXI6OnNlZWtUb0FzeW5jKGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBuZWVkTm90aWZ5KSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIGlkKCkpOwogICAgIG1zZy0+c2V0SW50NjQoInNlZWtUaW1lVXMiLCBzZWVrVGltZVVzKTsKKyAgICBtc2ctPnNldEludDMyKCJuZWVkTm90aWZ5IiwgbmVlZE5vdGlmeSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKLS8vIHN0YXRpYwotYm9vbCBOdVBsYXllcjo6SXNGbHVzaGluZ1N0YXRlKEZsdXNoU3RhdHVzIHN0YXRlLCBib29sICpuZWVkU2h1dGRvd24pIHsKLSAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUjoKLSAgICAgICAgICAgIGlmIChuZWVkU2h1dGRvd24gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpuZWVkU2h1dGRvd24gPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTjoKLSAgICAgICAgICAgIGlmIChuZWVkU2h1dGRvd24gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpuZWVkU2h1dGRvd24gPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Cit2b2lkIE51UGxheWVyOjp3cml0ZVRyYWNrSW5mbygKKyAgICAgICAgUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+IGZvcm1hdCkgY29uc3QgeworICAgIGludDMyX3QgdHJhY2tUeXBlOworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJ0eXBlIiwgJnRyYWNrVHlwZSkpOwogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgQVN0cmluZyBsYW5nOworICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibGFuZ3VhZ2UiLCAmbGFuZykpOworCisgICAgcmVwbHktPndyaXRlSW50MzIoMik7IC8vIHdyaXRlIHNvbWV0aGluZyBub24temVybworICAgIHJlcGx5LT53cml0ZUludDMyKHRyYWNrVHlwZSk7CisgICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobGFuZy5jX3N0cigpKSk7CisKKyAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworCisgICAgICAgIGludDMyX3QgaXNBdXRvLCBpc0RlZmF1bHQsIGlzRm9yY2VkOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiYXV0byIsICZpc0F1dG8pKTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImRlZmF1bHQiLCAmaXNEZWZhdWx0KSk7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJmb3JjZWQiLCAmaXNGb3JjZWQpKTsKKworICAgICAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihtaW1lLmNfc3RyKCkpKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNBdXRvKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNEZWZhdWx0KTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNGb3JjZWQpOwogICAgIH0KIH0KIApAQCAtMzIyLDE3ICszNjgsMTkgQEAKIAogICAgICAgICAgICAgQ0hFQ0sobVNvdXJjZSA9PSBOVUxMKTsKIAorICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNvdXJjZSIsICZvYmopKTsKLQotICAgICAgICAgICAgbVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOwotCi0gICAgICAgICAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKG1Tb3VyY2UpOworICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDSEVDSyhtRHJpdmVyICE9IE5VTEwpOwogICAgICAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKE9LKTsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQoZXJyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zNDgsMTYgKzM5Niw1OCBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAorICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKKworICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgY2NUcmFja3MgPSAwOworICAgICAgICAgICAgaWYgKG1DQ0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNjVHJhY2tzID0gbUNDRGVjb2Rlci0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0b3RhbCB0cmFjayBjb3VudAorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5iYW5kVHJhY2tzICsgY2NUcmFja3MpOworCisgICAgICAgICAgICAvLyB3cml0ZSBpbmJhbmQgdHJhY2tzCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluYmFuZFRyYWNrczsgKytpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1Tb3VyY2UtPmdldFRyYWNrSW5mbyhpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHdyaXRlIENDIHRyYWNrCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNjVHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgICAgICB3cml0ZVRyYWNrSW5mbyhyZXBseSwgbUNDRGVjb2Rlci0+Z2V0VHJhY2tJbmZvKGkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEdldFNlbGVjdGVkVHJhY2s6CisgICAgICAgIHsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IE9LOworCisgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOworICAgICAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworCiAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+Z2V0VHJhY2tJbmZvKHJlcGx5KTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RlZFRyYWNrKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogCisgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zNjcsMTMgKzQ1Nyw0MCBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAorICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CisgICAgICAgICAgICBpbnQzMl90IHNlbGVjdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbGVjdCIsICZzZWxlY3QpKTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwogICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OwotICAgICAgICAgICAgICAgIGludDMyX3Qgc2VsZWN0OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZWxlY3QiLCAmc2VsZWN0KSk7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZV90IGNjVHJhY2tzID0gMDsKKyAgICAgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjY1RyYWNrcyA9IG1DQ0RlY29kZXItPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPCBpbmJhbmRUcmFja3MpIHsKICAgICAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QpOworCisgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3QgJiYgZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGluZm8gPSBtU291cmNlLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmZvLT5maW5kSW50MzIoInR5cGUiLCAmdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK21UaW1lZFRleHRHZW5lcmF0aW9uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFja0luZGV4IC09IGluYmFuZFRyYWNrczsKKworICAgICAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgY2NUcmFja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbUNDRGVjb2Rlci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKQEAgLTQyMSw2ICs1MzgsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE5hdGl2ZVdpbmRvd1dyYXBwZXIgKj4ob2JqLmdldCgpKSkpOwogCiAgICAgICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQgJiYgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElzc3VlIGEgc2VlayB0byByZWZyZXNoIHRoZSB2aWRlbyBzY3JlZW4gb25seSBpZiBzdGFydGVkIG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXh0cmFjdG9yIG1heSBub3QgeWV0IGJlIHN0YXJ0ZWQgYW5kIHdpbGwgYXNzZXJ0LgorICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmlkZW8gZGVjb2RlciBpcyBub3Qgc2V0IChwZXJoYXBzIGF1ZGlvIG9ubHkgaW4gdGhpcyBjYXNlKQorICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgcGVyZm9ybSBhIHNlZWsgYXMgaXQgaXMgbm90IG5lZWRlZC4KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZWVrQWN0aW9uKGN1cnJlbnRQb3NpdGlvblVzLCBmYWxzZSAvKiBuZWVkTm90aWZ5ICovKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG5ldyBzdXJmYWNlIHRleHR1cmUsIGluc3RhbnRpYXRlIGRlY29kZXJzCiAgICAgICAgICAgICAgICAgLy8gYWdhaW4gaWYgcG9zc2libGUuCiAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCkBAIC00NDcsMTYgKzU3NiwyNiBAQAogICAgICAgICAgICAgQUxPR1YoImtXaGF0U3RhcnQiKTsKIAogICAgICAgICAgICAgbVZpZGVvSXNBVkMgPSBmYWxzZTsKLSAgICAgICAgICAgIG1OZWVkc1N3UmVuZGVyZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKICAgICAgICAgICAgIG1BdWRpb0VPUyA9IGZhbHNlOwogICAgICAgICAgICAgbVZpZGVvRU9TID0gZmFsc2U7CiAgICAgICAgICAgICBtU2tpcFJlbmRlcmluZ0F1ZGlvVW50aWxNZWRpYVRpbWVVcyA9IC0xOwogICAgICAgICAgICAgbVNraXBSZW5kZXJpbmdWaWRlb1VudGlsTWVkaWFUaW1lVXMgPSAtMTsKLSAgICAgICAgICAgIG1WaWRlb0xhdGVCeVVzID0gMDsKICAgICAgICAgICAgIG1OdW1GcmFtZXNUb3RhbCA9IDA7CiAgICAgICAgICAgICBtTnVtRnJhbWVzRHJvcHBlZCA9IDA7CiAgICAgICAgICAgICBtU3RhcnRlZCA9IHRydWU7CiAKKyAgICAgICAgICAgIC8qIGluc3RhbnRpYXRlIGRlY29kZXJzIG5vdyBmb3Igc2VjdXJlIHBsYXliYWNrICovCisgICAgICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgeworICAgICAgICAgICAgICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKGZhbHNlLCAmbVZpZGVvRGVjb2Rlcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSwgJm1BdWRpb0RlY29kZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbVNvdXJjZS0+c3RhcnQoKTsKIAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwpAQCAtNDY1LDEyICs2MDQsMzcgQEAKICAgICAgICAgICAgICAgICBmbGFncyB8PSBSZW5kZXJlcjo6RkxBR19SRUFMX1RJTUU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1SZW5kZXJlciA9IG5ldyBSZW5kZXJlcigKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luaywKLSAgICAgICAgICAgICAgICAgICAgbmV3IEFNZXNzYWdlKGtXaGF0UmVuZGVyZXJOb3RpZnksIGlkKCkpLAotICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gbUF1ZGlvU2luay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIobVJlbmRlcmVyKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CisKKyAgICAgICAgICAgIG1PZmZsb2FkQXVkaW8gPQorICAgICAgICAgICAgICAgIGNhbk9mZmxvYWRTdHJlYW0oYXVkaW9NZXRhLCAodmlkZW9Gb3JtYXQgIT0gTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGlzX3N0cmVhbWluZyAqLywgc3RyZWFtVHlwZSk7CisgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IFJlbmRlcmVyOjpGTEFHX09GRkxPQURfQVVESU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJlck5vdGlmeSwgaWQoKSk7CisgICAgICAgICAgICArK21SZW5kZXJlckdlbmVyYXRpb247CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVJlbmRlcmVyR2VuZXJhdGlvbik7CisgICAgICAgICAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIobUF1ZGlvU2luaywgbm90aWZ5LCBmbGFncyk7CisKKyAgICAgICAgICAgIG1SZW5kZXJlckxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICAgICAgbVJlbmRlcmVyTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllclJlbmRlcmVyIik7CisgICAgICAgICAgICBtUmVuZGVyZXJMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgICAgICAgICBtUmVuZGVyZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVuZGVyZXIpOworCisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGdldEZpbGVNZXRhKCk7CisgICAgICAgICAgICBpbnQzMl90IHJhdGU7CisgICAgICAgICAgICBpZiAobWV0YSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5RnJhbWVSYXRlLCAmcmF0ZSkgJiYgcmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnNldFZpZGVvRnJhbWVSYXRlKHJhdGUpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwb3N0U2NhblNvdXJjZXMoKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDkzLDExICs2NTcsMTggQEAKICAgICAgICAgICAgIGJvb2wgbUhhZEFueVNvdXJjZXNCZWZvcmUgPQogICAgICAgICAgICAgICAgIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHx8IChtVmlkZW9EZWNvZGVyICE9IE5VTEwpOwogCisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHZpZGVvIGJlZm9yZSBhdWRpbyBiZWNhdXNlIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24gb2YKKyAgICAgICAgICAgIC8vIHZpZGVvIG1heSBjaGFuZ2UgZGVlcCBidWZmZXIgbW9kZSBvZiBhdWRpby4KICAgICAgICAgICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIoZmFsc2UsICZtVmlkZW9EZWNvZGVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9wZW4gYXVkaW8gc2luayBlYXJseSB1bmRlciBvZmZsb2FkIG1vZGUuCisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKmF1ZGlvKi8pOworICAgICAgICAgICAgICAgICAgICBvcGVuQXVkaW9TaW5rKGZvcm1hdCwgdHJ1ZSAvKm9mZmxvYWRPbmx5Ki8pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSwgJm1BdWRpb0RlY29kZXIpOwogICAgICAgICAgICAgfQogCkBAIC01MzgsMjQgKzcwOSw0MCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBib29sIGF1ZGlvID0gbXNnLT53aGF0KCkgPT0ga1doYXRBdWRpb05vdGlmeTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGNvZGVjUmVxdWVzdDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImNvZGVjLXJlcXVlc3QiLCAmY29kZWNSZXF1ZXN0KSk7CisgICAgICAgICAgICBpbnQzMl90IGN1cnJlbnREZWNvZGVyR2VuZXJhdGlvbiA9CisgICAgICAgICAgICAgICAgKGF1ZGlvPyBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbiA6IG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdGVyR2VuZXJhdGlvbiA9IGN1cnJlbnREZWNvZGVyR2VuZXJhdGlvbiAtIDE7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZyZXF1ZXN0ZXJHZW5lcmF0aW9uKSk7CisKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ZXJHZW5lcmF0aW9uICE9IGN1cnJlbnREZWNvZGVyR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgbWVzc2FnZSBmcm9tIG9sZCAlcyBkZWNvZGVyLCBnZW5lcmF0aW9uKCVkOiVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCByZXF1ZXN0ZXJHZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlY29kZXJHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgICAgICAgICAgICAgaWYgKCEobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmcmVwbHkpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCBJTkZPX0RJU0NPTlRJTlVJVFkpOworICAgICAgICAgICAgICAgIHJlcGx5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IHdoYXQ7Ci0gICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CiAKLSAgICAgICAgICAgIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGaWxsVGhpc0J1ZmZlcikgeworICAgICAgICAgICAgaWYgKHdoYXQgPT0gRGVjb2Rlcjo6a1doYXRGaWxsVGhpc0J1ZmZlcikgewogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGZlZWREZWNvZGVySW5wdXREYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8sIGNvZGVjUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbywgbXNnKTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gLUVXT1VMREJMT0NLKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtU291cmNlLT5mZWVkTW9yZVRTRGF0YSgpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMTAwMDBsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMTAgKiAxMDAwbGwpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRFT1MpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdEVPUykgewogICAgICAgICAgICAgICAgIGludDMyX3QgZXJyOwotICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ290ICVzIGRlY29kZXIgRU9TIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CkBAIC01NjYsMTcwICs3NTMsOTEgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnF1ZXVlRU9TKGF1ZGlvLCBlcnIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCkgewotICAgICAgICAgICAgICAgIGJvb2wgbmVlZFNodXRkb3duOwotCi0gICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKElzRmx1c2hpbmdTdGF0ZShtRmx1c2hpbmdBdWRpbywgJm5lZWRTaHV0ZG93bikpOwotICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IEZMVVNIRUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soSXNGbHVzaGluZ1N0YXRlKG1GbHVzaGluZ1ZpZGVvLCAmbmVlZFNodXRkb3duKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gRkxVU0hFRDsKLQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9MYXRlQnlVcyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2Rlcjo6a1doYXRGbHVzaENvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJkZWNvZGVyICVzIGZsdXNoIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogCi0gICAgICAgICAgICAgICAgaWYgKG5lZWRTaHV0ZG93bikgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiaW5pdGlhdGluZyAlcyBkZWNvZGVyIHNodXRkb3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKLQotICAgICAgICAgICAgICAgICAgICAoYXVkaW8gPyBtQXVkaW9EZWNvZGVyIDogbVZpZGVvRGVjb2RlciktPmluaXRpYXRlU2h1dGRvd24oKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gU0hVVFRJTkdfRE9XTl9ERUNPREVSOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBTSFVUVElOR19ET1dOX0RFQ09ERVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgICAgICBoYW5kbGVGbHVzaENvbXBsZXRlKGF1ZGlvLCB0cnVlIC8qIGlzRGVjb2RlciAqLyk7CiAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKwogICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvIG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlZCBIeiwgJWQgY2hhbm5lbHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKLQotICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOwotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSB2aWRlbyBkZWNvZGVyCi0gICAgICAgICAgICAgICAgICAgIC8vIGlzIGNyZWF0ZWQgYWZ0ZXIgd2UgcmVjZWl2ZSB0aGUgZm9ybWF0IGNoYW5nZSBpbmRpY2F0aW9uLgotICAgICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGNvZGUgd2lsbCBqdXN0IG1ha2UgdGhhdCB3ZSBzZWxlY3QgZGVlcCBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB2aWRlbyB3aGljaCBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBhcyBpdCBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90IHByZXZlbnQgZnJvbSBrZWVwaW5nIEEvViBzeW5jLgotICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlciA9PSBOVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IEFVRElPX1NJTktfTUlOX0RFRVBfQlVGRkVSX0RVUkFUSU9OX1VTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigiY2hhbm5lbC1tYXNrIiwgJmNoYW5uZWxNYXNrKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtQXVkaW9TaW5rLT5vcGVuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAvKiBidWZmZXJDb3VudCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwotCi0gICAgICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsQXVkaW9TaW5rQ2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICBvcGVuQXVkaW9TaW5rKGZvcm1hdCwgZmFsc2UgLypvZmZsb2FkT25seSovKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyB2aWRlbworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CiAKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZFJlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BMZWZ0LCAmY3JvcFRvcCwgJmNyb3BSaWdodCwgJmNyb3BCb3R0b20pKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpc3BsYXlXaWR0aCA9IGNyb3BSaWdodCAtIGNyb3BMZWZ0ICsgMTsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gY3JvcEJvdHRvbSAtIGNyb3BUb3AgKyAxOwotCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlbyBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgdG8gJWQgeCAlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIihjcm9wOiAlZCB4ICVkIEAgKCVkLCAlZCkpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wKTsKLQotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdmlkZW9JbnB1dEZvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRha2UgaW50byBhY2NvdW50IHNhbXBsZSBhc3BlY3QgcmF0aW8gaWYgbmVjZXNzYXJ5OgotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb0lucHV0Rm9ybWF0LT5maW5kSW50MzIoInNhci13aWR0aCIsICZzYXJXaWR0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2aWRlb0lucHV0Rm9ybWF0LT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXItaGVpZ2h0IiwgJnNhckhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJTYW1wbGUgYXNwZWN0IHJhdGlvICVkIDogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FyV2lkdGgsIHNhckhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCA9IChkaXNwbGF5V2lkdGggKiBzYXJXaWR0aCkgLyBzYXJIZWlnaHQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJkaXNwbGF5IGRpbWVuc2lvbnMgJWQgeCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfU0VUX1ZJREVPX1NJWkUsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1OZWVkc1N3UmVuZGVyZXIgJiYgbU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbG9yRm9ybWF0OwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldFJlY3Qoa0tleUNyb3BSZWN0LCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnNldFNvZnRSZW5kZXJlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNvZnR3YXJlUmVuZGVyZXIobU5hdGl2ZVdpbmRvdy0+Z2V0TmF0aXZlV2luZG93KCksIG1ldGEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaWRlb1NpemUoaW5wdXRGb3JtYXQsIGZvcm1hdCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCkgeworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiJXMgc2h1dGRvd24gY29tcGxldGVkIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7CiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1GbHVzaGluZ0F1ZGlvLCAoaW50KVNIVVRUSU5HX0RPV05fREVDT0RFUik7CiAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gU0hVVF9ET1dOOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgKyttVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1GbHVzaGluZ1ZpZGVvLCAoaW50KVNIVVRUSU5HX0RPV05fREVDT0RFUik7CiAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gU0hVVF9ET1dOOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRFcnJvcikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJSZWNlaXZlZCBlcnJvciBmcm9tICVzIGRlY29kZXIsIGFib3J0aW5nIHBsYXliYWNrLiIsCi0gICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKLQotICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cXVldWVFT1MoYXVkaW8sIFVOS05PV05fRVJST1IpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXREcmFpblRoaXNCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICByZW5kZXJCdWZmZXIoYXVkaW8sIGNvZGVjUmVxdWVzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdENvbXBvbmVudEFsbG9jYXRlZCkgewotICAgICAgICAgICAgICAgIGlmICghYXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBuYW1lOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBtTmVlZHNTd1JlbmRlcmVyID0gbmFtZS5zdGFydHNXaXRoKCJPTVguZ29vZ2xlLiIpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0RXJyb3IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikgfHwgZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ICE9IEFDb2RlYzo6a1doYXRDb21wb25lbnRDb25maWd1cmVkCi0gICAgICAgICAgICAgICAgICAgICYmIHdoYXQgIT0gQUNvZGVjOjprV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVW5oYW5kbGVkIGNvZGVjIG5vdGlmaWNhdGlvbiAlZCAnJWMlYyVjJWMnLiIsCisKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGVyIGVycm9ycyBjYW4gYmUgZHVlIHRvIFNvdXJjZSAoZS5nLiBmcm9tIHN0cmVhbWluZyksCisgICAgICAgICAgICAgICAgLy8gb3IgZnJvbSBkZWNvZGluZyBjb3JydXB0ZWQgYml0c3RyZWFtcywgb3IgZnJvbSBvdGhlciBkZWNvZGVyCisgICAgICAgICAgICAgICAgLy8gTWVkaWFDb2RlYyBvcGVyYXRpb25zIChlLmcuIGZyb20gYW4gb25nb2luZyByZXNldCBvciBzZWVrKS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFdlIHRyeSB0byBncmFjZWZ1bGx5IHNodXQgZG93biB0aGUgYWZmZWN0ZWQgZGVjb2RlciBpZiBwb3NzaWJsZSwKKyAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZm9yY2UgdGhlIHNodXRkb3duIHdpdGggc29tZXRoaW5nCisgICAgICAgICAgICAgICAgLy8gc2ltaWxhciB0byBwZXJmb3JtUmVzZXQoKS4gVGhpcyBtZXRob2QgY2FuIGxlYWQgdG8gYSBoYW5nCisgICAgICAgICAgICAgICAgLy8gaWYgTWVkaWFDb2RlYyBmdW5jdGlvbnMgYmxvY2sgYWZ0ZXIgYW4gZXJyb3IsIGJ1dCB0aGV5IHNob3VsZAorICAgICAgICAgICAgICAgIC8vIHR5cGljYWxseSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT04gaW5zdGVhZCBvZiBibG9ja2luZy4KKworICAgICAgICAgICAgICAgIEZsdXNoU3RhdHVzICpmbHVzaGluZyA9IGF1ZGlvID8gJm1GbHVzaGluZ0F1ZGlvIDogJm1GbHVzaGluZ1ZpZGVvOworICAgICAgICAgICAgICAgIEFMT0dFKCJyZWNlaXZlZCBlcnJvciglI3gpIGZyb20gJXMgZGVjb2RlciwgZmx1c2hpbmcoJWQpLCBub3cgc2h1dHRpbmcgZG93biIsCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsICpmbHVzaGluZyk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCpmbHVzaGluZykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNodXRkb3duRGVjb2RlckFjdGlvbihhdWRpbywgIWF1ZGlvIC8qIHZpZGVvICovKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSElOR19ERUNPREVSOgorICAgICAgICAgICAgICAgICAgICAgICAgKmZsdXNoaW5nID0gRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTjsgLy8gaW5pdGlhdGUgc2h1dGRvd24gYWZ0ZXIgZmx1c2guCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gV2FpdCBmb3IgZmx1c2ggdG8gY29tcGxldGUuCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBXYWl0IGZvciBmbHVzaCB0byBjb21wbGV0ZS4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTSFVUVElOR19ET1dOX0RFQ09ERVI6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gV2FpdCBmb3Igc2h1dGRvd24gdG8gY29tcGxldGUuCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpZGV2aW5lIHNvdXJjZSByZWFkcyBtdXN0IHN0b3AgYmVmb3JlIHJlbGVhc2luZyB0aGUgdmlkZW8gZGVjb2Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXVkaW8gJiYgbVNvdXJjZSAhPSBOVUxMICYmIG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWNvZGVyKGF1ZGlvKS0+aW5pdGlhdGVTaHV0ZG93bigpOyAvLyBJbiB0aGUgbWlkZGxlIG9mIGEgc2Vlay4KKyAgICAgICAgICAgICAgICAgICAgICAgICpmbHVzaGluZyA9IFNIVVRUSU5HX0RPV05fREVDT0RFUjsgICAgIC8vIFNodXQgZG93bi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNIVVRfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOyAgLy8gU2hvdWxkIG5vdCBvY2N1ci4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLy8gRmluaXNoIGFueXdheXMuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0RHJhaW5UaGlzQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgcmVuZGVyQnVmZmVyKGF1ZGlvLCBtc2cpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiVW5oYW5kbGVkIGRlY29kZXIgbm90aWZpY2F0aW9uICVkICclYyVjJWMlYycuIiwKICAgICAgICAgICAgICAgICAgICAgICB3aGF0LAogICAgICAgICAgICAgICAgICAgICAgIHdoYXQgPj4gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgKHdoYXQgPj4gMTYpICYgMHhmZiwKQEAgLTc0Miw2ICs4NTAsMTQgQEAKIAogICAgICAgICBjYXNlIGtXaGF0UmVuZGVyZXJOb3RpZnk6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdGVyR2VuZXJhdGlvbiA9IG1SZW5kZXJlckdlbmVyYXRpb24gLSAxOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmcmVxdWVzdGVyR2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKHJlcXVlc3RlckdlbmVyYXRpb24gIT0gbVJlbmRlcmVyR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgbWVzc2FnZSBmcm9tIG9sZCByZW5kZXJlciwgZ2VuZXJhdGlvbiglZDolZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVyR2VuZXJhdGlvbiwgbVJlbmRlcmVyR2VuZXJhdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpbnQzMl90IHdoYXQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CiAKQEAgLTc3MiwzMSArODg4LDM4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobVZpZGVvRU9TIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkpIHsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb25VczsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgicG9zaXRpb25VcyIsICZwb3NpdGlvblVzKSk7Ci0KLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidmlkZW9MYXRlQnlVcyIsICZtVmlkZW9MYXRlQnlVcykpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQb3NpdGlvbihwb3NpdGlvblVzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlGcmFtZVN0YXRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzVG90YWwsIG1OdW1GcmFtZXNEcm9wcGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRGbHVzaENvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBhdWRpbzsKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKIAogICAgICAgICAgICAgICAgIEFMT0dWKCJyZW5kZXJlciAlcyBmbHVzaCBjb21wbGV0ZWQuIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICAgICAgaGFuZGxlRmx1c2hDb21wbGV0ZShhdWRpbywgZmFsc2UgLyogaXNEZWNvZGVyICovKTsKKyAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRWaWRlb1JlbmRlcmluZ1N0YXJ0KSB7CiAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfSU5GTywgTUVESUFfSU5GT19SRU5ERVJJTkdfU1RBUlQsIDApOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdE1lZGlhUmVuZGVyaW5nU3RhcnQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigibWVkaWEgcmVuZGVyaW5nIHN0YXJ0ZWQiKTsKICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TVEFSVEVELCAwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRBdWRpb09mZmxvYWRUZWFyRG93bikgeworICAgICAgICAgICAgICAgIEFMT0dWKCJUZWFyIGRvd24gYXVkaW8gb2ZmbG9hZCwgZmFsbCBiYWNrIHRvIHMvdyBwYXRoIik7CisgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvblVzOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJwb3NpdGlvblVzIiwgJnBvc2l0aW9uVXMpKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlYXNvbjsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVhc29uIiwgJnJlYXNvbikpOworICAgICAgICAgICAgICAgIGNsb3NlQXVkaW9TaW5rKCk7CisgICAgICAgICAgICAgICAgbUF1ZGlvRGVjb2Rlci5jbGVhcigpOworICAgICAgICAgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CisgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5mbHVzaCh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+Zmx1c2goZmFsc2UgLyogYXVkaW8gKi8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBwZXJmb3JtU2Vlayhwb3NpdGlvblVzLCBmYWxzZSAvKiBuZWVkTm90aWZ5ICovKTsKKyAgICAgICAgICAgICAgICBpZiAocmVhc29uID09IFJlbmRlcmVyOjprRHVlVG9FcnJvcikgeworICAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSAvKiBhdWRpbyAqLywgJm1BdWRpb0RlY29kZXIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC04MjQsMTQgKzk0NywxOCBAQAogICAgICAgICBjYXNlIGtXaGF0U2VlazoKICAgICAgICAgewogICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgICAgICAgICAgaW50MzJfdCBuZWVkTm90aWZ5OwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNlZWtUaW1lVXMiLCAmc2Vla1RpbWVVcykpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm5lZWROb3RpZnkiLCAmbmVlZE5vdGlmeSkpOwogCi0gICAgICAgICAgICBBTE9HVigia1doYXRTZWVrIHNlZWtUaW1lVXM9JWxsZCB1cyIsIHNlZWtUaW1lVXMpOworICAgICAgICAgICAgQUxPR1YoImtXaGF0U2VlayBzZWVrVGltZVVzPSVsbGQgdXMsIG5lZWROb3RpZnk9JWQiLAorICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCBuZWVkTm90aWZ5KTsKIAogICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCiAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oJk51UGxheWVyOjpwZXJmb3JtRGVjb2RlckZsdXNoKSk7CiAKLSAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKG5ldyBTZWVrQWN0aW9uKHNlZWtUaW1lVXMpKTsKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihzZWVrVGltZVVzLCBuZWVkTm90aWZ5KSk7CiAKICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtODM5LDE3ICs5NjYsMzYgQEAKIAogICAgICAgICBjYXNlIGtXaGF0UGF1c2U6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLKG1SZW5kZXJlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnBhdXNlKCk7Ci0gICAgICAgICAgICBtUmVuZGVyZXItPnBhdXNlKCk7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVNvdXJjZS0+cGF1c2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coInBhdXNlIGNhbGxlZCB3aGVuIHNvdXJjZSBpcyBnb25lIG9yIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cGF1c2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coInBhdXNlIGNhbGxlZCB3aGVuIHJlbmRlcmVyIGlzIGdvbmUgb3Igbm90IHNldCIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIGtXaGF0UmVzdW1lOgogICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDSyhtUmVuZGVyZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtU291cmNlLT5yZXN1bWUoKTsKLSAgICAgICAgICAgIG1SZW5kZXJlci0+cmVzdW1lKCk7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVNvdXJjZS0+cmVzdW1lKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJyZXN1bWUgY2FsbGVkIHdoZW4gc291cmNlIGlzIGdvbmUgb3Igbm90IHNldCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gfG1BdWRpb0RlY29kZXJ8IG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgZHVlIHRvIHRoZSBwYXVzZSB0aW1lb3V0LCBzbyByZS1jcmVhdGUgaXQgaWYKKyAgICAgICAgICAgIC8vIG5lZWRlZC4KKyAgICAgICAgICAgIGlmIChhdWRpb0RlY29kZXJTdGlsbE5lZWRlZCgpICYmIG1BdWRpb0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlRGVjb2Rlcih0cnVlIC8qIGF1ZGlvICovLCAmbUF1ZGlvRGVjb2Rlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnJlc3VtZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicmVzdW1lIGNhbGxlZCB3aGVuIHJlbmRlcmVyIGlzIGdvbmUgb3Igbm90IHNldCIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtODU5LDM5ICsxMDA1LDk2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRDbG9zZWRDYXB0aW9uTm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICBvbkNsb3NlZENhcHRpb25Ob3RpZnkobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OmZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpIHsKLSAgICBpZiAobUZsdXNoaW5nQXVkaW8gIT0gRkxVU0hFRCAmJiBtRmx1c2hpbmdBdWRpbyAhPSBTSFVUX0RPV04pIHsKK2Jvb2wgTnVQbGF5ZXI6OmF1ZGlvRGVjb2RlclN0aWxsTmVlZGVkKCkgeworICAgIC8vIEF1ZGlvIGRlY29kZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZCBpZiBpdCdzIGluIHNodXQvc2h1dHRpbmcgZG93biBzdGF0dXMuCisgICAgcmV0dXJuICgobUZsdXNoaW5nQXVkaW8gIT0gU0hVVF9ET1dOKSAmJiAobUZsdXNoaW5nQXVkaW8gIT0gU0hVVFRJTkdfRE9XTl9ERUNPREVSKSk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OmhhbmRsZUZsdXNoQ29tcGxldGUoYm9vbCBhdWRpbywgYm9vbCBpc0RlY29kZXIpIHsKKyAgICAvLyBXZSB3YWl0IGZvciBib3RoIHRoZSBkZWNvZGVyIGZsdXNoIGFuZCB0aGUgcmVuZGVyZXIgZmx1c2ggdG8gY29tcGxldGUKKyAgICAvLyBiZWZvcmUgZW50ZXJpbmcgZWl0aGVyIHRoZSBGTFVTSEVEIG9yIHRoZSBTSFVUVElOR19ET1dOX0RFQ09ERVIgc3RhdGUuCisKKyAgICBtRmx1c2hDb21wbGV0ZVthdWRpb11baXNEZWNvZGVyXSA9IHRydWU7CisgICAgaWYgKCFtRmx1c2hDb21wbGV0ZVthdWRpb11bIWlzRGVjb2Rlcl0pIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChtRmx1c2hpbmdWaWRlbyAhPSBGTFVTSEVEICYmIG1GbHVzaGluZ1ZpZGVvICE9IFNIVVRfRE9XTikgeworICAgIEZsdXNoU3RhdHVzICpzdGF0ZSA9IGF1ZGlvID8gJm1GbHVzaGluZ0F1ZGlvIDogJm1GbHVzaGluZ1ZpZGVvOworICAgIHN3aXRjaCAoKnN0YXRlKSB7CisgICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUjoKKyAgICAgICAgeworICAgICAgICAgICAgKnN0YXRlID0gRkxVU0hFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOOgorICAgICAgICB7CisgICAgICAgICAgICAqc3RhdGUgPSBTSFVUVElOR19ET1dOX0RFQ09ERVI7CisKKyAgICAgICAgICAgIEFMT0dWKCJpbml0aWF0aW5nICVzIGRlY29kZXIgc2h1dGRvd24iLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgICAgIGlmICghYXVkaW8pIHsKKyAgICAgICAgICAgICAgICAvLyBXaWRldmluZSBzb3VyY2UgcmVhZHMgbXVzdCBzdG9wIGJlZm9yZSByZWxlYXNpbmcgdGhlIHZpZGVvIGRlY29kZXIuCisgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCAmJiBtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CisgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXREZWNvZGVyKGF1ZGlvKS0+aW5pdGlhdGVTaHV0ZG93bigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gZGVjb2RlciBmbHVzaCBjb21wbGV0ZXMgb25seSBvY2N1ciBpbiBhIGZsdXNoaW5nIHN0YXRlLgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpc0RlY29kZXIsICJkZWNvZGVyIGZsdXNoIGluIGludmFsaWQgc3RhdGUgJWQiLCAqc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpmaW5pc2hGbHVzaElmUG9zc2libGUoKSB7CisgICAgaWYgKG1GbHVzaGluZ0F1ZGlvICE9IE5PTkUgJiYgbUZsdXNoaW5nQXVkaW8gIT0gRkxVU0hFRAorICAgICAgICAgICAgJiYgbUZsdXNoaW5nQXVkaW8gIT0gU0hVVF9ET1dOKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUZsdXNoaW5nVmlkZW8gIT0gTk9ORSAmJiBtRmx1c2hpbmdWaWRlbyAhPSBGTFVTSEVECisgICAgICAgICAgICAmJiBtRmx1c2hpbmdWaWRlbyAhPSBTSFVUX0RPV04pIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIEFMT0dWKCJib3RoIGF1ZGlvIGFuZCB2aWRlbyBhcmUgZmx1c2hlZCBub3cuIik7CiAKKyAgICBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdC5jbGVhcigpOworICAgIG1BZ2dyZWdhdGVCdWZmZXIuY2xlYXIoKTsKKwogICAgIGlmIChtVGltZURpc2NvbnRpbnVpdHlQZW5kaW5nKSB7CiAgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsVGltZURpc2NvbnRpbnVpdHkoKTsKICAgICAgICAgbVRpbWVEaXNjb250aW51aXR5UGVuZGluZyA9IGZhbHNlOwogICAgIH0KIAotICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICBpZiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMICYmIG1GbHVzaGluZ0F1ZGlvID09IEZMVVNIRUQpIHsKICAgICAgICAgbUF1ZGlvRGVjb2Rlci0+c2lnbmFsUmVzdW1lKCk7CiAgICAgfQogCi0gICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgeworICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwgJiYgbUZsdXNoaW5nVmlkZW8gPT0gRkxVU0hFRCkgewogICAgICAgICBtVmlkZW9EZWNvZGVyLT5zaWduYWxSZXN1bWUoKTsKICAgICB9CiAKICAgICBtRmx1c2hpbmdBdWRpbyA9IE5PTkU7CiAgICAgbUZsdXNoaW5nVmlkZW8gPSBOT05FOwogCisgICAgY2xlYXJGbHVzaENvbXBsZXRlKCk7CisKICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CiB9CiAKQEAgLTkwNyw2ICsxMTEwLDM4IEBACiAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IHRydWU7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6Om9wZW5BdWRpb1NpbmsoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGJvb2wgb2ZmbG9hZE9ubHkpIHsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgYm9vbCBoYXNWaWRlbyA9IChtVmlkZW9EZWNvZGVyICE9IE5VTEwpOworICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSB2aWRlbyBkZWNvZGVyCisgICAgLy8gaXMgY3JlYXRlZCBhZnRlciB3ZSByZWNlaXZlIHRoZSBmb3JtYXQgY2hhbmdlIGluZGljYXRpb24uCisgICAgLy8gQ3VycmVudCBjb2RlIHdpbGwganVzdCBtYWtlIHRoYXQgd2Ugc2VsZWN0IGRlZXAgYnVmZmVyCisgICAgLy8gd2l0aCB2aWRlbyB3aGljaCBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBhcyBpdCBzaG91bGQKKyAgICAvLyBub3QgcHJldmVudCBmcm9tIGtlZXBpbmcgQS9WIHN5bmMuCisgICAgaWYgKGhhc1ZpZGVvICYmCisgICAgICAgICAgICBtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0sgJiYKKyAgICAgICAgICAgIGR1cmF0aW9uVXMKKyAgICAgICAgICAgICAgICA+IEFVRElPX1NJTktfTUlOX0RFRVBfQlVGRkVSX0RVUkFUSU9OX1VTKSB7CisgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIH0KKworICAgIG1PZmZsb2FkQXVkaW8gPSBtUmVuZGVyZXItPm9wZW5BdWRpb1NpbmsoCisgICAgICAgICAgICBmb3JtYXQsIG9mZmxvYWRPbmx5LCBoYXNWaWRlbywgZmxhZ3MpOworCisgICAgaWYgKG1PZmZsb2FkQXVkaW8pIHsKKyAgICAgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9CisgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgc2VuZE1ldGFEYXRhVG9IYWwobUF1ZGlvU2luaywgYXVkaW9NZXRhKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OmNsb3NlQXVkaW9TaW5rKCkgeworICAgIG1SZW5kZXJlci0+Y2xvc2VBdWRpb1NpbmsoKTsKK30KKwogc3RhdHVzX3QgTnVQbGF5ZXI6Omluc3RhbnRpYXRlRGVjb2Rlcihib29sIGF1ZGlvLCBzcDxEZWNvZGVyPiAqZGVjb2RlcikgewogICAgIGlmICgqZGVjb2RlciAhPSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTkyMiwxOCArMTE1Nyw1NyBAQAogICAgICAgICBBU3RyaW5nIG1pbWU7CiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAgICAgICAgIG1WaWRlb0lzQVZDID0gIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lLmNfc3RyKCkpOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBjY05vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdENsb3NlZENhcHRpb25Ob3RpZnksIGlkKCkpOworICAgICAgICBtQ0NEZWNvZGVyID0gbmV3IENDRGVjb2RlcihjY05vdGlmeSk7CisKKyAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNlY3VyZSIsIHRydWUpOworICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9Ci0gICAgICAgIG5ldyBBTWVzc2FnZShhdWRpbyA/IGtXaGF0QXVkaW9Ob3RpZnkgOiBrV2hhdFZpZGVvTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAgaWQoKSk7CisgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb05vdGlmeSwgaWQoKSk7CisgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbik7CiAKLSAgICAqZGVjb2RlciA9IGF1ZGlvID8gbmV3IERlY29kZXIobm90aWZ5KSA6Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWNvZGVyKG5vdGlmeSwgbU5hdGl2ZVdpbmRvdyk7Ci0gICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcigqZGVjb2Rlcik7CisgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyUGFzc1Rocm91Z2gobm90aWZ5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIobm90aWZ5KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRWaWRlb05vdGlmeSwgaWQoKSk7CisgICAgICAgICsrbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbik7CiAKKyAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2Rlcihub3RpZnksIG1OYXRpdmVXaW5kb3cpOworICAgIH0KKyAgICAoKmRlY29kZXIpLT5pbml0KCk7CiAgICAgKCpkZWNvZGVyKS0+Y29uZmlndXJlKGZvcm1hdCk7CiAKKyAgICAvLyBhbGxvY2F0ZSBidWZmZXJzIHRvIGRlY3J5cHQgd2lkZXZpbmUgc291cmNlIGJ1ZmZlcnMKKyAgICBpZiAoIWF1ZGlvICYmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSkgeworICAgICAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBpbnB1dEJ1ZnM7CisgICAgICAgIENIRUNLX0VRKCgqZGVjb2RlciktPmdldElucHV0QnVmZmVycygmaW5wdXRCdWZzKSwgKHN0YXR1c190KU9LKTsKKworICAgICAgICBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gbWVkaWFCdWZzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0QnVmcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9IGlucHV0QnVmc1tpXTsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmID0gbmV3IE1lZGlhQnVmZmVyKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICBtZWRpYUJ1ZnMucHVzaChtYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnNldEJ1ZmZlcnMoYXVkaW8sIG1lZGlhQnVmcyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVkaWFCdWZzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgbWVkaWFCdWZzW2ldLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZWRpYUJ1ZnMuY2xlYXIoKTsKKyAgICAgICAgICAgIEFMT0dFKCJTZWN1cmUgc291cmNlIGRpZG4ndCBzdXBwb3J0IHNlY3VyZSBtZWRpYUJ1ZnMuIik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIApAQCAtOTQxLDggKzEyMTUsOSBAQAogICAgIHNwPEFNZXNzYWdlPiByZXBseTsKICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpOwogCi0gICAgaWYgKChhdWRpbyAmJiBJc0ZsdXNoaW5nU3RhdGUobUZsdXNoaW5nQXVkaW8pKQotICAgICAgICAgICAgfHwgKCFhdWRpbyAmJiBJc0ZsdXNoaW5nU3RhdGUobUZsdXNoaW5nVmlkZW8pKSkgeworICAgIGlmICgoYXVkaW8gJiYgbUZsdXNoaW5nQXVkaW8gIT0gTk9ORSkKKyAgICAgICAgICAgIHx8ICghYXVkaW8gJiYgbUZsdXNoaW5nVmlkZW8gIT0gTk9ORSkKKyAgICAgICAgICAgIHx8IG1Tb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsIElORk9fRElTQ09OVElOVUlUWSk7CiAgICAgICAgIHJlcGx5LT5wb3N0KCk7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTk1MCwxNCArMTIyNSwzNyBAQAogCiAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKIAorICAgIC8vIEFnZ3JlZ2F0ZSBzbWFsbGVyIGJ1ZmZlcnMgaW50byBhIGxhcmdlciBidWZmZXIuCisgICAgLy8gVGhlIGdvYWwgaXMgdG8gcmVkdWNlIHBvd2VyIGNvbnN1bXB0aW9uLgorICAgIC8vIE5vdGUgdGhpcyB3aWxsIG5vdCB3b3JrIGlmIHRoZSBkZWNvZGVyIHJlcXVpcmVzIG9uZSBmcmFtZSBwZXIgYnVmZmVyLgorICAgIGJvb2wgZG9CdWZmZXJBZ2dyZWdhdGlvbiA9IChhdWRpbyAmJiBtT2ZmbG9hZEF1ZGlvKTsKKyAgICBib29sIG5lZWRNb3JlRGF0YSA9IGZhbHNlOworCiAgICAgYm9vbCBkcm9wQWNjZXNzVW5pdDsKICAgICBkbyB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KGF1ZGlvLCAmYWNjZXNzVW5pdCk7CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgLy8gRGlkIHdlIHNhdmUgYW4gYWNjZXNzVW5pdCBlYXJsaWVyIGJlY2F1c2Ugb2YgYSBkaXNjb250aW51aXR5PworICAgICAgICBpZiAoYXVkaW8gJiYgKG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0ICE9IE5VTEwpKSB7CisgICAgICAgICAgICBhY2Nlc3NVbml0ID0gbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQ7CisgICAgICAgICAgICBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdC5jbGVhcigpOworICAgICAgICAgICAgZXJyID0gbVBlbmRpbmdBdWRpb0VycjsKKyAgICAgICAgICAgIEFMT0dWKCJmZWVkRGVjb2RlcklucHV0RGF0YSgpIHVzZSBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYXVkaW8sICZhY2Nlc3NVbml0KTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgPT0gLUVXT1VMREJMT0NLKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0RJU0NPTlRJTlVJVFkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZG9CdWZmZXJBZ2dyZWdhdGlvbiAmJiAobUFnZ3JlZ2F0ZUJ1ZmZlciAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgc29tZSBkYXRhIHNvIHNhdmUgdGhpcyBmb3IgbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9FcnIgPSBlcnI7CisgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0ID0gYWNjZXNzVW5pdDsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZmVlZERlY29kZXJJbnB1dERhdGEoKSBzYXZlIGRpc2NvbnRpbnVpdHkgZm9yIGxhdGVyIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGU7CiAgICAgICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmdHlwZSkpOwogCkBAIC0xMDAyLDM0ICsxMzAwLDQ0IEBACiAgICAgICAgICAgICAgICAgbVRpbWVEaXNjb250aW51aXR5UGVuZGluZyA9CiAgICAgICAgICAgICAgICAgICAgIG1UaW1lRGlzY29udGludWl0eVBlbmRpbmcgfHwgdGltZUNoYW5nZTsKIAotICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UgfHwgdGltZUNoYW5nZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8gPT0gTk9ORSAmJiBtRmx1c2hpbmdWaWRlbyA9PSBOT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmQgd2UnbGwgcmVzdW1lIHNjYW5uaW5nIHNvdXJjZXMgb25jZSB3ZSdyZSBkb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmbHVzaGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9mcm9udCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOdVBsYXllcjo6cGVyZm9ybVNjYW5Tb3VyY2VzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIHNlYW1sZXNzRm9ybWF0Q2hhbmdlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5ld0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChhdWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdENoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICBzZWFtbGVzc0Zvcm1hdENoYW5nZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWNvZGVyKGF1ZGlvKS0+c3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShuZXdGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAvLyB0cmVhdCBzZWFtbGVzcyBmb3JtYXQgY2hhbmdlIHNlcGFyYXRlbHkKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0Q2hhbmdlID0gIXNlYW1sZXNzRm9ybWF0Q2hhbmdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIHNodXRkb3duT3JGbHVzaCA9IGZvcm1hdENoYW5nZSB8fCB0aW1lQ2hhbmdlOwogCi0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBuZXdGb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoYXVkaW8pOwotICAgICAgICAgICAgICAgICAgICBzcDxEZWNvZGVyPiAmZGVjb2RlciA9IGF1ZGlvID8gbUF1ZGlvRGVjb2RlciA6IG1WaWRlb0RlY29kZXI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UgJiYgIWRlY29kZXItPnN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UobmV3Rm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hEZWNvZGVyKGF1ZGlvLCAvKiBuZWVkU2h1dGRvd24gPSAqLyB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoRGVjb2RlcihhdWRpbywgLyogbmVlZFNodXRkb3duID0gKi8gZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIHF1ZXVlIHVwIHNjYW4tc291cmNlcyBvbmx5IG9uY2UgcGVyIGRpc2NvbnRpbnVpdHkuCisgICAgICAgICAgICAgICAgLy8gV2UgY29udHJvbCB0aGlzIGJ5IGRvaW5nIGl0IG9ubHkgaWYgbmVpdGhlciBhdWRpbyBub3IgdmlkZW8gYXJlCisgICAgICAgICAgICAgICAgLy8gZmx1c2hpbmcgb3Igc2h1dHRpbmcgZG93bi4gIChBZnRlciBoYW5kbGluZyAxc3QgZGlzY29udGludWl0eSwgb25lCisgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGZsdXNoaW5nIHN0YXRlcyB3aWxsIG5vdCBiZSBOT05FLikKKyAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHNjYW4gc291cmNlcyBpZiB0aGlzIGRpc2NvbnRpbnVpdHkgZG9lcyBub3QgcmVzdWx0CisgICAgICAgICAgICAgICAgLy8gaW4gYSBmbHVzaCBvciBzaHV0ZG93biwgYXMgdGhlIGZsdXNoaW5nIHN0YXRlIHdpbGwgc3RheSBOT05FLgorICAgICAgICAgICAgICAgIGlmIChtRmx1c2hpbmdBdWRpbyA9PSBOT05FICYmIG1GbHVzaGluZ1ZpZGVvID09IE5PTkUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNodXRkb3duT3JGbHVzaCkgeworICAgICAgICAgICAgICAgICAgICAvLyBBbmQgd2UnbGwgcmVzdW1lIHNjYW5uaW5nIHNvdXJjZXMgb25jZSB3ZSdyZSBkb25lCisgICAgICAgICAgICAgICAgICAgIC8vIGZsdXNoaW5nLgorICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfZnJvbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk51UGxheWVyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q2hhbmdlIC8qIG5vdCBzZWFtbGVzcyAqLykgeworICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGNoYW5nZSBkZWNvZGVyCisgICAgICAgICAgICAgICAgICAgIGZsdXNoRGVjb2RlcihhdWRpbywgLyogbmVlZFNodXRkb3duID0gKi8gdHJ1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aW1lQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hEZWNvZGVyKGF1ZGlvLCAvKiBuZWVkU2h1dGRvd24gPSAqLyBmYWxzZSwgbmV3Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWFtbGVzc0Zvcm1hdENoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICAvLyByZXVzZSBleGlzdGluZyBkZWNvZGVyIGFuZCBkb24ndCBmbHVzaAorICAgICAgICAgICAgICAgICAgICB1cGRhdGVEZWNvZGVyRm9ybWF0V2l0aG91dEZsdXNoKGF1ZGlvLCBuZXdGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN0cmVhbSBpcyB1bmFmZmVjdGVkIGJ5IHRoZSBkaXNjb250aW51aXR5Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IEZMVVNIRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IEZMVVNIRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKLQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTEwNDUsMTMgKzEzNTMsNTggQEAKIAogICAgICAgICBkcm9wQWNjZXNzVW5pdCA9IGZhbHNlOwogICAgICAgICBpZiAoIWF1ZGlvCi0gICAgICAgICAgICAgICAgJiYgbVZpZGVvTGF0ZUJ5VXMgPiAxMDAwMDBsbAorICAgICAgICAgICAgICAgICYmICEobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkKKyAgICAgICAgICAgICAgICAmJiBtUmVuZGVyZXItPmdldFZpZGVvTGF0ZUJ5VXMoKSA+IDEwMDAwMGxsCiAgICAgICAgICAgICAgICAgJiYgbVZpZGVvSXNBVkMKICAgICAgICAgICAgICAgICAmJiAhSXNBVkNSZWZlcmVuY2VGcmFtZShhY2Nlc3NVbml0KSkgewogICAgICAgICAgICAgZHJvcEFjY2Vzc1VuaXQgPSB0cnVlOwogICAgICAgICAgICAgKyttTnVtRnJhbWVzRHJvcHBlZDsKICAgICAgICAgfQotICAgIH0gd2hpbGUgKGRyb3BBY2Nlc3NVbml0KTsKKworICAgICAgICBzaXplX3Qgc21hbGxTaXplID0gYWNjZXNzVW5pdC0+c2l6ZSgpOworICAgICAgICBuZWVkTW9yZURhdGEgPSBmYWxzZTsKKyAgICAgICAgaWYgKGRvQnVmZmVyQWdncmVnYXRpb24gJiYgKG1BZ2dyZWdhdGVCdWZmZXIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAvLyBEb24ndCBib3RoZXIgaWYgb25seSByb29tIGZvciBhIGZldyBzbWFsbCBidWZmZXJzLgorICAgICAgICAgICAgICAgICYmIChzbWFsbFNpemUgPCAoa0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlcyAvIDMpKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbGFyZ2VyIGJ1ZmZlciBmb3IgY29tYmluaW5nIHNtYWxsZXIgYnVmZmVycyBmcm9tIHRoZSBleHRyYWN0b3IuCisgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyID0gbmV3IEFCdWZmZXIoa0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlcyk7CisgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsgLy8gc3RhcnQgZW1wdHkKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkb0J1ZmZlckFnZ3JlZ2F0aW9uICYmIChtQWdncmVnYXRlQnVmZmVyICE9IE5VTEwpKSB7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgIGludDY0X3QgZHVtbXk7CisgICAgICAgICAgICBib29sIHNtYWxsVGltZXN0YW1wVmFsaWQgPSBhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcyk7CisgICAgICAgICAgICBib29sIGJpZ1RpbWVzdGFtcFZhbGlkID0gbUFnZ3JlZ2F0ZUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZkdW1teSk7CisgICAgICAgICAgICAvLyBXaWxsIHRoZSBzbWFsbGVyIGJ1ZmZlciBmaXQ/CisgICAgICAgICAgICBzaXplX3QgYmlnU2l6ZSA9IG1BZ2dyZWdhdGVCdWZmZXItPnNpemUoKTsKKyAgICAgICAgICAgIHNpemVfdCByb29tTGVmdCA9IG1BZ2dyZWdhdGVCdWZmZXItPmNhcGFjaXR5KCkgLSBiaWdTaXplOworICAgICAgICAgICAgLy8gU2hvdWxkIHdlIHNhdmUgdGhpcyBzbWFsbCBidWZmZXIgZm9yIHRoZSBuZXh0IGJpZyBidWZmZXI/CisgICAgICAgICAgICAvLyBJZiB0aGUgZmlyc3Qgc21hbGwgYnVmZmVyIGRpZCBub3QgaGF2ZSBhIHRpbWVzdGFtcCB0aGVuIHNhdmUKKyAgICAgICAgICAgIC8vIGFueSBidWZmZXIgdGhhdCBkb2VzIGhhdmUgYSB0aW1lc3RhbXAgdW50aWwgdGhlIG5leHQgYmlnIGJ1ZmZlci4KKyAgICAgICAgICAgIGlmICgoc21hbGxTaXplID4gcm9vbUxlZnQpCisgICAgICAgICAgICAgICAgfHwgKCFiaWdUaW1lc3RhbXBWYWxpZCAmJiAoYmlnU2l6ZSA+IDApICYmIHNtYWxsVGltZXN0YW1wVmFsaWQpKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdBdWRpb0VyciA9IGVycjsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdCA9IGFjY2Vzc1VuaXQ7CisgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC5jbGVhcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBHcmFiIHRpbWUgZnJvbSBmaXJzdCBzbWFsbCBidWZmZXIgaWYgYXZhaWxhYmxlLgorICAgICAgICAgICAgICAgIGlmICgoYmlnU2l6ZSA9PSAwKSAmJiBzbWFsbFRpbWVzdGFtcFZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBzbWFsbCBidWZmZXIgdG8gdGhlIGJpZ2dlciBidWZmZXIuCisgICAgICAgICAgICAgICAgbWVtY3B5KG1BZ2dyZWdhdGVCdWZmZXItPmJhc2UoKSArIGJpZ1NpemUsIGFjY2Vzc1VuaXQtPmRhdGEoKSwgc21hbGxTaXplKTsKKyAgICAgICAgICAgICAgICBiaWdTaXplICs9IHNtYWxsU2l6ZTsKKyAgICAgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyLT5zZXRSYW5nZSgwLCBiaWdTaXplKTsKKworICAgICAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyB1bnRpbCB3ZSBydW4gb3V0IG9mIHJvb20gaW4gdGhlIG1BZ2dyZWdhdGVCdWZmZXIuCisgICAgICAgICAgICAgICAgbmVlZE1vcmVEYXRhID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIEFMT0dWKCJmZWVkRGVjb2RlcklucHV0RGF0YSgpIHNtYWxsU2l6ZSA9ICV6dSwgYmlnU2l6ZSA9ICV6dSwgY2FwYWNpdHkgPSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxTaXplLCBiaWdTaXplLCBtQWdncmVnYXRlQnVmZmVyLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGRyb3BBY2Nlc3NVbml0IHx8IG5lZWRNb3JlRGF0YSk7CiAKICAgICAvLyBBTE9HVigicmV0dXJuZWQgYSB2YWxpZCBidWZmZXIgb2YgJXMgZGF0YSIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogCkBAIC0xMDYzLDcgKzE0MTYsMTkgQEAKICAgICAgICAgIG1lZGlhVGltZVVzIC8gMUU2KTsKICNlbmRpZgogCi0gICAgcmVwbHktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYWNjZXNzVW5pdCk7CisgICAgaWYgKCFhdWRpbykgeworICAgICAgICBtQ0NEZWNvZGVyLT5kZWNvZGUoYWNjZXNzVW5pdCk7CisgICAgfQorCisgICAgaWYgKGRvQnVmZmVyQWdncmVnYXRpb24gJiYgKG1BZ2dyZWdhdGVCdWZmZXIgIT0gTlVMTCkpIHsKKyAgICAgICAgQUxPR1YoImZlZWREZWNvZGVySW5wdXREYXRhKCkgcmVwbHkgd2l0aCBhZ2dyZWdhdGVkIGJ1ZmZlciwgJXp1IiwKKyAgICAgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyLT5zaXplKCkpOworICAgICAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBtQWdncmVnYXRlQnVmZmVyKTsKKyAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcGx5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGFjY2Vzc1VuaXQpOworICAgIH0KKwogICAgIHJlcGx5LT5wb3N0KCk7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMDc1LDcgKzE0NDAsOCBAQAogICAgIHNwPEFNZXNzYWdlPiByZXBseTsKICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpOwogCi0gICAgaWYgKElzRmx1c2hpbmdTdGF0ZShhdWRpbyA/IG1GbHVzaGluZ0F1ZGlvIDogbUZsdXNoaW5nVmlkZW8pKSB7CisgICAgaWYgKChhdWRpbyAmJiBtRmx1c2hpbmdBdWRpbyAhPSBOT05FKQorICAgICAgICAgICAgfHwgKCFhdWRpbyAmJiBtRmx1c2hpbmdWaWRlbyAhPSBOT05FKSkgewogICAgICAgICAvLyBXZSdyZSBjdXJyZW50bHkgYXR0ZW1wdGluZyB0byBmbHVzaCB0aGUgZGVjb2RlciwgaW4gb3JkZXIKICAgICAgICAgLy8gdG8gY29tcGxldGUgdGhpcywgdGhlIGRlY29kZXIgd2FudHMgYWxsIGl0cyBidWZmZXJzIGJhY2ssCiAgICAgICAgIC8vIHNvIHdlIGRvbid0IHdhbnQgYW55IG91dHB1dCBidWZmZXJzIGl0IHNlbnQgdXMgKGZyb20gYmVmb3JlCkBAIC0xMDkxLDE0ICsxNDU3LDE1IEBACiAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwogICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcikpOwogCisgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKKwogICAgIGludDY0X3QgJnNraXBVbnRpbE1lZGlhVGltZVVzID0KICAgICAgICAgYXVkaW8KICAgICAgICAgICAgID8gbVNraXBSZW5kZXJpbmdBdWRpb1VudGlsTWVkaWFUaW1lVXMKICAgICAgICAgICAgIDogbVNraXBSZW5kZXJpbmdWaWRlb1VudGlsTWVkaWFUaW1lVXM7CiAKICAgICBpZiAoc2tpcFVudGlsTWVkaWFUaW1lVXMgPj0gMCkgewotICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwotICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKIAogICAgICAgICBpZiAobWVkaWFUaW1lVXMgPCBza2lwVW50aWxNZWRpYVRpbWVVcykgewogICAgICAgICAgICAgQUxPR1YoImRyb3BwaW5nICVzIGJ1ZmZlciBhdCB0aW1lICVsbGQgYXMgcmVxdWVzdGVkLiIsCkBAIC0xMTEyLDkgKzE0NzksNzkgQEAKICAgICAgICAgc2tpcFVudGlsTWVkaWFUaW1lVXMgPSAtMTsKICAgICB9CiAKKyAgICBpZiAoIWF1ZGlvICYmIG1DQ0RlY29kZXItPmlzU2VsZWN0ZWQoKSkgeworICAgICAgICBtQ0NEZWNvZGVyLT5kaXNwbGF5KG1lZGlhVGltZVVzKTsKKyAgICB9CisKICAgICBtUmVuZGVyZXItPnF1ZXVlQnVmZmVyKGF1ZGlvLCBidWZmZXIsIHJlcGx5KTsKIH0KIAordm9pZCBOdVBsYXllcjo6dXBkYXRlVmlkZW9TaXplKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmlucHV0Rm9ybWF0LAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCkgeworICAgIGlmIChpbnB1dEZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJVbmtub3duIHZpZGVvIHNpemUsIHJlcG9ydGluZyAweDAhIik7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1NFVF9WSURFT19TSVpFLCAwLCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0OworICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKKworICAgIGlmIChvdXRwdXRGb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOworICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOworCisgICAgICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKKyAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgKKyAgICAgICAgICAgICAgICAgICAgImNyb3AiLAorICAgICAgICAgICAgICAgICAgICAmY3JvcExlZnQsICZjcm9wVG9wLCAmY3JvcFJpZ2h0LCAmY3JvcEJvdHRvbSkpOworCisgICAgICAgIGRpc3BsYXlXaWR0aCA9IGNyb3BSaWdodCAtIGNyb3BMZWZ0ICsgMTsKKyAgICAgICAgZGlzcGxheUhlaWdodCA9IGNyb3BCb3R0b20gLSBjcm9wVG9wICsgMTsKKworICAgICAgICBBTE9HVigiVmlkZW8gb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvICVkIHggJWQgIgorICAgICAgICAgICAgICIoY3JvcDogJWQgeCAlZCBAICglZCwgJWQpKSIsCisgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsCisgICAgICAgICAgICAgZGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgICBjcm9wTGVmdCwgY3JvcFRvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0soaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmZGlzcGxheVdpZHRoKSk7CisgICAgICAgIENIRUNLKGlucHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZkaXNwbGF5SGVpZ2h0KSk7CisKKyAgICAgICAgQUxPR1YoIlZpZGVvIGlucHV0IGZvcm1hdCAlZCB4ICVkIiwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICB9CisKKyAgICAvLyBUYWtlIGludG8gYWNjb3VudCBzYW1wbGUgYXNwZWN0IHJhdGlvIGlmIG5lY2Vzc2FyeToKKyAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7CisgICAgaWYgKGlucHV0Rm9ybWF0LT5maW5kSW50MzIoInNhci13aWR0aCIsICZzYXJXaWR0aCkKKyAgICAgICAgICAgICYmIGlucHV0Rm9ybWF0LT5maW5kSW50MzIoInNhci1oZWlnaHQiLCAmc2FySGVpZ2h0KSkgeworICAgICAgICBBTE9HVigiU2FtcGxlIGFzcGVjdCByYXRpbyAlZCA6ICVkIiwgc2FyV2lkdGgsIHNhckhlaWdodCk7CisKKyAgICAgICAgZGlzcGxheVdpZHRoID0gKGRpc3BsYXlXaWR0aCAqIHNhcldpZHRoKSAvIHNhckhlaWdodDsKKworICAgICAgICBBTE9HVigiZGlzcGxheSBkaW1lbnNpb25zICVkIHggJWQiLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOworICAgIH0KKworICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOworICAgIGlmICghaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigicm90YXRpb24tZGVncmVlcyIsICZyb3RhdGlvbkRlZ3JlZXMpKSB7CisgICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7CisgICAgfQorCisgICAgaWYgKHJvdGF0aW9uRGVncmVlcyA9PSA5MCB8fCByb3RhdGlvbkRlZ3JlZXMgPT0gMjcwKSB7CisgICAgICAgIGludDMyX3QgdG1wID0gZGlzcGxheVdpZHRoOworICAgICAgICBkaXNwbGF5V2lkdGggPSBkaXNwbGF5SGVpZ2h0OworICAgICAgICBkaXNwbGF5SGVpZ2h0ID0gdG1wOworICAgIH0KKworICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgTUVESUFfU0VUX1ZJREVPX1NJWkUsCisgICAgICAgICAgICBkaXNwbGF5V2lkdGgsCisgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0KTsKK30KKwogdm9pZCBOdVBsYXllcjo6bm90aWZ5TGlzdGVuZXIoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7CiAgICAgaWYgKG1Ecml2ZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC0xMTI5LDYzICsxNTY2LDcyIEBACiAgICAgZHJpdmVyLT5ub3RpZnlMaXN0ZW5lcihtc2csIGV4dDEsIGV4dDIsIGluKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6Zmx1c2hEZWNvZGVyKGJvb2wgYXVkaW8sIGJvb2wgbmVlZFNodXRkb3duKSB7Cit2b2lkIE51UGxheWVyOjpmbHVzaERlY29kZXIoCisgICAgICAgIGJvb2wgYXVkaW8sIGJvb2wgbmVlZFNodXRkb3duLCBjb25zdCBzcDxBTWVzc2FnZT4gJm5ld0Zvcm1hdCkgewogICAgIEFMT0dWKCJbJXNdIGZsdXNoRGVjb2RlciBuZWVkU2h1dGRvd249JWQiLAogICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIG5lZWRTaHV0ZG93bik7CiAKLSAgICBpZiAoKGF1ZGlvICYmIG1BdWRpb0RlY29kZXIgPT0gTlVMTCkgfHwgKCFhdWRpbyAmJiBtVmlkZW9EZWNvZGVyID09IE5VTEwpKSB7CisgICAgY29uc3Qgc3A8RGVjb2Rlcj4gJmRlY29kZXIgPSBnZXREZWNvZGVyKGF1ZGlvKTsKKyAgICBpZiAoZGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dJKCJmbHVzaERlY29kZXIgJXMgd2l0aG91dCBkZWNvZGVyIHByZXNlbnQiLAogICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGNvbnRpbnVlIHRvIHNjYW4gc291cmNlcyB1bnRpbCB3ZSBmaW5pc2ggZmx1c2hpbmcuCiAgICAgKyttU2NhblNvdXJjZXNHZW5lcmF0aW9uOwogICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSBmYWxzZTsKIAotICAgIChhdWRpbyA/IG1BdWRpb0RlY29kZXIgOiBtVmlkZW9EZWNvZGVyKS0+c2lnbmFsRmx1c2goKTsKKyAgICBkZWNvZGVyLT5zaWduYWxGbHVzaChuZXdGb3JtYXQpOwogICAgIG1SZW5kZXJlci0+Zmx1c2goYXVkaW8pOwogCiAgICAgRmx1c2hTdGF0dXMgbmV3U3RhdHVzID0KICAgICAgICAgbmVlZFNodXRkb3duID8gRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTiA6IEZMVVNISU5HX0RFQ09ERVI7CiAKKyAgICBtRmx1c2hDb21wbGV0ZVthdWRpb11bZmFsc2UgLyogaXNEZWNvZGVyICovXSA9IGZhbHNlOworICAgIG1GbHVzaENvbXBsZXRlW2F1ZGlvXVt0cnVlIC8qIGlzRGVjb2RlciAqL10gPSBmYWxzZTsKICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgQ0hFQ0sobUZsdXNoaW5nQXVkaW8gPT0gTk9ORQotICAgICAgICAgICAgICAgIHx8IG1GbHVzaGluZ0F1ZGlvID09IEFXQUlUSU5HX0RJU0NPTlRJTlVJVFkpOwotCisgICAgICAgIEFMT0dFX0lGKG1GbHVzaGluZ0F1ZGlvICE9IE5PTkUsCisgICAgICAgICAgICAgICAgImF1ZGlvIGZsdXNoRGVjb2RlcigpIGlzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1GbHVzaGluZ0F1ZGlvKTsKICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBuZXdTdGF0dXM7Ci0KLSAgICAgICAgaWYgKG1GbHVzaGluZ1ZpZGVvID09IE5PTkUpIHsKLSAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICA/IEFXQUlUSU5HX0RJU0NPTlRJTlVJVFkKLSAgICAgICAgICAgICAgICA6IEZMVVNIRUQ7Ci0gICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyhtRmx1c2hpbmdWaWRlbyA9PSBOT05FCi0gICAgICAgICAgICAgICAgfHwgbUZsdXNoaW5nVmlkZW8gPT0gQVdBSVRJTkdfRElTQ09OVElOVUlUWSk7Ci0KKyAgICAgICAgQUxPR0VfSUYobUZsdXNoaW5nVmlkZW8gIT0gTk9ORSwKKyAgICAgICAgICAgICAgICAidmlkZW8gZmx1c2hEZWNvZGVyKCkgaXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUZsdXNoaW5nVmlkZW8pOwogICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IG5ld1N0YXR1czsKIAotICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8gPT0gTk9ORSkgewotICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSAobUF1ZGlvRGVjb2RlciAhPSBOVUxMKQotICAgICAgICAgICAgICAgID8gQVdBSVRJTkdfRElTQ09OVElOVUlUWQotICAgICAgICAgICAgICAgIDogRkxVU0hFRDsKKyAgICAgICAgaWYgKG1DQ0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUNDRGVjb2Rlci0+Zmx1c2goKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotc3A8QU1lc3NhZ2U+IE51UGxheWVyOjpTb3VyY2U6OmdldEZvcm1hdChib29sIGF1ZGlvKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBnZXRGb3JtYXRNZXRhKGF1ZGlvKTsKK3ZvaWQgTnVQbGF5ZXI6OnVwZGF0ZURlY29kZXJGb3JtYXRXaXRob3V0Rmx1c2goCisgICAgICAgIGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgQUxPR1YoIlslc10gdXBkYXRlRGVjb2RlckZvcm1hdFdpdGhvdXRGbHVzaCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogCi0gICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjb25zdCBzcDxEZWNvZGVyPiAmZGVjb2RlciA9IGdldERlY29kZXIoYXVkaW8pOworICAgIGlmIChkZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0koInVwZGF0ZURlY29kZXJGb3JtYXRXaXRob3V0Rmx1c2ggJXMgd2l0aG91dCBkZWNvZGVyIHByZXNlbnQiLAorICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICBkZWNvZGVyLT5zaWduYWxVcGRhdGVGb3JtYXQoZm9ybWF0KTsKK30KIAotICAgIGlmKGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmbXNnKSA9PSBPSykgewotICAgICAgICByZXR1cm4gbXNnOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKK3ZvaWQgTnVQbGF5ZXI6OnF1ZXVlRGVjb2RlclNodXRkb3duKAorICAgICAgICBib29sIGF1ZGlvLCBib29sIHZpZGVvLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7CisgICAgQUxPR0koInF1ZXVlRGVjb2RlclNodXRkb3duIGF1ZGlvPSVkLCB2aWRlbz0lZCIsIGF1ZGlvLCB2aWRlbyk7CisKKyAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgIG5ldyBTaHV0ZG93bkRlY29kZXJBY3Rpb24oYXVkaW8sIHZpZGVvKSk7CisKKyAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oJk51UGxheWVyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKKworICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKG5ldyBQb3N0TWVzc2FnZUFjdGlvbihyZXBseSkpOworCisgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6c2V0VmlkZW9TY2FsaW5nTW9kZShpbnQzMl90IG1vZGUpIHsKQEAgLTEyMTEsNiArMTY1NywxOSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE51UGxheWVyOjpnZXRTZWxlY3RlZFRyYWNrKGludDMyX3QgdHlwZSwgUGFyY2VsKiByZXBseSkgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTZWxlY3RlZFRyYWNrLCBpZCgpKTsKKyAgICBtc2ctPnNldFBvaW50ZXIoInJlcGx5IiwgcmVwbHkpOworICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCB0eXBlKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgTnVQbGF5ZXI6OnNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWxlY3RUcmFjaywgaWQoKSk7CiAgICAgbXNnLT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CkBAIC0xMjE5LDkgKzE2NzgsMzUgQEAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwogCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICghcmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKKyAgICAgICAgZXJyID0gT0s7CisgICAgfQorCiAgICAgcmV0dXJuIGVycjsKIH0KIAorc3RhdHVzX3QgTnVQbGF5ZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKSB7CisgICAgc3A8UmVuZGVyZXI+IHJlbmRlcmVyID0gbVJlbmRlcmVyOworICAgIGlmIChyZW5kZXJlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiByZW5kZXJlci0+Z2V0Q3VycmVudFBvc2l0aW9uKG1lZGlhVXMpOworfQorCit2b2lkIE51UGxheWVyOjpnZXRTdGF0cyhpbnQ2NF90ICpudW1GcmFtZXNUb3RhbCwgaW50NjRfdCAqbnVtRnJhbWVzRHJvcHBlZCkgeworICAgICpudW1GcmFtZXNUb3RhbCA9IG1OdW1GcmFtZXNUb3RhbDsKKyAgICAqbnVtRnJhbWVzRHJvcHBlZCA9IG1OdW1GcmFtZXNEcm9wcGVkOworfQorCitzcDxNZXRhRGF0YT4gTnVQbGF5ZXI6OmdldEZpbGVNZXRhKCkgeworICAgIHJldHVybiBtU291cmNlLT5nZXRGaWxlRm9ybWF0TWV0YSgpOworfQorCiB2b2lkIE51UGxheWVyOjpzY2hlZHVsZVBvbGxEdXJhdGlvbigpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbER1cmF0aW9uLCBpZCgpKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxEdXJhdGlvbkdlbmVyYXRpb24pOwpAQCAtMTIzOCwxOCArMTcyMyw2IEBACiAgICAgICAgIC8vIGFuIGludGVybWVkaWF0ZSBzdGF0ZSwgaS5lLiBvbmUgbW9yZSBtb3JlIGRlY29kZXJzIGFyZSBjdXJyZW50bHkKICAgICAgICAgLy8gZmx1c2hpbmcgb3Igc2h1dHRpbmcgZG93bi4KIAotICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIFRoZXJlJ3MgYW4gZWRnZSBjYXNlIHdoZXJlIHRoZSByZW5kZXJlciBvd25zIGFsbCBvdXRwdXQKLSAgICAgICAgICAgIC8vIGJ1ZmZlcnMgYW5kIGlzIHBhdXNlZCwgdGhlcmVmb3JlIHRoZSBkZWNvZGVyIHdpbGwgbm90IHJlYWQKLSAgICAgICAgICAgIC8vIG1vcmUgaW5wdXQgZGF0YSBhbmQgd2lsbCBuZXZlciBlbmNvdW50ZXIgdGhlIG1hdGNoaW5nCi0gICAgICAgICAgICAvLyBkaXNjb250aW51aXR5LiBUbyBhdm9pZCB0aGlzLCB3ZSByZXN1bWUgdGhlIHJlbmRlcmVyLgotCi0gICAgICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8gPT0gQVdBSVRJTkdfRElTQ09OVElOVUlUWQotICAgICAgICAgICAgICAgICAgICB8fCBtRmx1c2hpbmdWaWRlbyA9PSBBV0FJVElOR19ESVNDT05USU5VSVRZKSB7Ci0gICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIGlmIChtRmx1c2hpbmdBdWRpbyAhPSBOT05FIHx8IG1GbHVzaGluZ1ZpZGVvICE9IE5PTkUpIHsKICAgICAgICAgICAgIC8vIFdlJ3JlIGN1cnJlbnRseSBmbHVzaGluZywgcG9zdHBvbmUgdGhlIHJlc2V0IHVudGlsIHRoYXQncwogICAgICAgICAgICAgLy8gY29tcGxldGVkLgpAQCAtMTI2NywxOCArMTc0MCwyOSBAQAogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6cGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzKSB7Ci0gICAgQUxPR1YoInBlcmZvcm1TZWVrIHNlZWtUaW1lVXM9JWxsZCB1cyAoJS4yZiBzZWNzKSIsCit2b2lkIE51UGxheWVyOjpwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgbmVlZE5vdGlmeSkgeworICAgIEFMT0dWKCJwZXJmb3JtU2VlayBzZWVrVGltZVVzPSVsbGQgdXMgKCUuMmYgc2VjcyksIG5lZWROb3RpZnkoJWQpIiwKICAgICAgICAgICBzZWVrVGltZVVzLAotICAgICAgICAgIHNlZWtUaW1lVXMgLyAxRTYpOworICAgICAgICAgIHNlZWtUaW1lVXMgLyAxRTYsCisgICAgICAgICAgbmVlZE5vdGlmeSk7CiAKKyAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHJlc2V0IG9jY3VycyByaWdodCBiZWZvcmUgdGhlIGxvb3AgbW9kZQorICAgICAgICAvLyBhc3luY2hyb25vdXNseSBzZWVrcyB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbS4KKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMLAorICAgICAgICAgICAgICAgICJtU291cmNlIGlzIE5VTEwgYW5kIGRlY29kZXJzIG5vdCBOVUxMIGF1ZGlvKCVwKSB2aWRlbyglcCkiLAorICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIuZ2V0KCksIG1WaWRlb0RlY29kZXIuZ2V0KCkpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIG1Tb3VyY2UtPnNlZWtUbyhzZWVrVGltZVVzKTsKKyAgICArK21UaW1lZFRleHRHZW5lcmF0aW9uOwogCiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQb3NpdGlvbihzZWVrVGltZVVzKTsKLSAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2Vla0NvbXBsZXRlKCk7CisgICAgICAgICAgICBpZiAobmVlZE5vdGlmeSkgeworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2Vla0NvbXBsZXRlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzMTMsMTQgKzE3OTcsNiBAQAogCiAgICAgbVRpbWVEaXNjb250aW51aXR5UGVuZGluZyA9IHRydWU7CiAKLSAgICBpZiAobUZsdXNoaW5nQXVkaW8gPT0gTk9ORSAmJiAoIWF1ZGlvIHx8IG1BdWRpb0RlY29kZXIgPT0gTlVMTCkpIHsKLSAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBGTFVTSEVEOwotICAgIH0KLQotICAgIGlmIChtRmx1c2hpbmdWaWRlbyA9PSBOT05FICYmICghdmlkZW8gfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSkgewotICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IEZMVVNIRUQ7Ci0gICAgfQotCiAgICAgaWYgKGF1ZGlvICYmIG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgewogICAgICAgICBmbHVzaERlY29kZXIodHJ1ZSAvKiBhdWRpbyAqLywgdHJ1ZSAvKiBuZWVkU2h1dGRvd24gKi8pOwogICAgIH0KQEAgLTEzNDEsMTMgKzE4MTcsMTkgQEAKICAgICArK21TY2FuU291cmNlc0dlbmVyYXRpb247CiAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IGZhbHNlOwogCisgICAgaWYgKG1SZW5kZXJlckxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbVJlbmRlcmVyTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtUmVuZGVyZXItPmlkKCkpOworICAgICAgICB9CisgICAgICAgIG1SZW5kZXJlckxvb3Blci0+c3RvcCgpOworICAgICAgICBtUmVuZGVyZXJMb29wZXIuY2xlYXIoKTsKKyAgICB9CiAgICAgbVJlbmRlcmVyLmNsZWFyKCk7CisgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOwogCiAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBtU291cmNlLT5zdG9wKCk7CiAKLSAgICAgICAgbG9vcGVyKCktPnVucmVnaXN0ZXJIYW5kbGVyKG1Tb3VyY2UtPmlkKCkpOwotCiAgICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKICAgICB9CiAKQEAgLTE0MDgsMTYgKzE4OTAsMTUgQEAKIAogICAgICAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gbm90aWZ5IGR1cmF0aW9uIGZpcnN0LCBzbyB0aGF0IGl0J3MgZGVmaW5pdGVseSBzZXQgd2hlbgorICAgICAgICAgICAgICAgIC8vIHRoZSBhcHAgcmVjZWl2ZWQgdGhlICJwcmVwYXJlIGNvbXBsZXRlIiBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoZXJyKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCAmJiBtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24oZHVyYXRpb25Vcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTQ0NiwxMSArMTkyNywxOSBAQAogCiAgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFZpZGVvU2l6ZUNoYW5nZWQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CiAKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1NFVF9WSURFT19TSVpFLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRCdWZmZXJpbmdVcGRhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgcGVyY2VudGFnZTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwZXJjZW50YWdlIiwgJnBlcmNlbnRhZ2UpKTsKKworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfQlVGRkVSSU5HX1VQREFURSwgcGVyY2VudGFnZSwgMCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNDcxLDIxICsxOTYwLDQwIEBACiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKIAotICAgICAgICAgICAgaW50MzJfdCB0cmFja0luZGV4OwotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKyAgICAgICAgICAgIHNlbmRTdWJ0aXRsZURhdGEoYnVmZmVyLCAwIC8qIGJhc2VJbmRleCAqLyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFRpbWVkVGV4dERhdGE6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKQorICAgICAgICAgICAgICAgICAgICAmJiBnZW5lcmF0aW9uICE9IG1UaW1lZFRleHRHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcikpOworCisgICAgICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoZHJpdmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHBvc01zOworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIHBvc1VzOworICAgICAgICAgICAgZHJpdmVyLT5nZXRDdXJyZW50UG9zaXRpb24oJnBvc01zKTsKKyAgICAgICAgICAgIHBvc1VzID0gcG9zTXMgKiAxMDAwOwogICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSk7CiAKLSAgICAgICAgICAgIFBhcmNlbCBpbjsKLSAgICAgICAgICAgIGluLndyaXRlSW50MzIodHJhY2tJbmRleCk7Ci0gICAgICAgICAgICBpbi53cml0ZUludDY0KHRpbWVVcyk7Ci0gICAgICAgICAgICBpbi53cml0ZUludDY0KGR1cmF0aW9uVXMpOwotICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgIGluLndyaXRlKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7Ci0KLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1NVQlRJVExFX0RBVEEsIDAsIDAsICZpbik7CisgICAgICAgICAgICBpZiAocG9zVXMgPCB0aW1lVXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtVGltZWRUZXh0R2VuZXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1zZy0+cG9zdCh0aW1lVXMgLSBwb3NVcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbmRUaW1lZFRleHREYXRhKGJ1ZmZlcik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNTAyLDEzICsyMDEwLDExMiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXREcm1Ob0xpY2Vuc2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBFUlJPUl9EUk1fTk9fTElDRU5TRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KIH0KIAordm9pZCBOdVBsYXllcjo6b25DbG9zZWRDYXB0aW9uTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCB3aGF0OworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKKworICAgIHN3aXRjaCAod2hhdCkgeworICAgICAgICBjYXNlIE51UGxheWVyOjpDQ0RlY29kZXI6OmtXaGF0Q2xvc2VkQ2FwdGlvbkRhdGE6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcikpOworCisgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKKyAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlbmRTdWJ0aXRsZURhdGEoYnVmZmVyLCBpbmJhbmRUcmFja3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE51UGxheWVyOjpDQ0RlY29kZXI6OmtXaGF0VHJhY2tBZGRlZDoKKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfSU5GTywgTUVESUFfSU5GT19NRVRBREFUQV9VUERBVEUsIDApOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworCit9CisKK3ZvaWQgTnVQbGF5ZXI6OnNlbmRTdWJ0aXRsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCBiYXNlSW5kZXgpIHsKKyAgICBpbnQzMl90IHRyYWNrSW5kZXg7CisgICAgaW50NjRfdCB0aW1lVXMsIGR1cmF0aW9uVXM7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOworCisgICAgUGFyY2VsIGluOworICAgIGluLndyaXRlSW50MzIodHJhY2tJbmRleCArIGJhc2VJbmRleCk7CisgICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOworICAgIGluLndyaXRlSW50NjQoZHVyYXRpb25Vcyk7CisgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7CisgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7CisgICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1NVQlRJVExFX0RBVEEsIDAsIDAsICZpbik7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OnNlbmRUaW1lZFRleHREYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHNpemVfdCBzaXplID0gMDsKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBpbnQzMl90IGZsYWcgPSBUZXh0RGVzY3JpcHRpb25zOjpMT0NBTF9ERVNDUklQVElPTlM7CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworICAgIENIRUNLKHN0cmNhc2VjbXAobWltZS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApID09IDApOworCisgICAgZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemUgPSBidWZmZXItPnNpemUoKTsKKworICAgIFBhcmNlbCBwYXJjZWw7CisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zOjpJTl9CQU5EX1RFWFRfM0dQUDsKKyAgICAgICAgVGV4dERlc2NyaXB0aW9uczo6Z2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBzaXplLCBmbGFnLCB0aW1lVXMgLyAxMDAwLCAmcGFyY2VsKTsKKyAgICB9CisKKyAgICBpZiAoKHBhcmNlbC5kYXRhU2l6ZSgpID4gMCkpIHsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfVElNRURfVEVYVCwgMCwgMCwgJnBhcmNlbCk7CisgICAgfSBlbHNlIHsgIC8vIHNlbmQgYW4gZW1wdHkgdGltZWQgdGV4dAorICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9USU1FRF9URVhULCAwLCAwKTsKKyAgICB9Cit9CiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCitzcDxBTWVzc2FnZT4gTnVQbGF5ZXI6OlNvdXJjZTo6Z2V0Rm9ybWF0KGJvb2wgYXVkaW8pIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGdldEZvcm1hdE1ldGEoYXVkaW8pOworCisgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworCisgICAgaWYoY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG1ldGEsICZtc2cpID09IE9LKSB7CisgICAgICAgIHJldHVybiBtc2c7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCiB2b2lkIE51UGxheWVyOjpTb3VyY2U6Om5vdGlmeUZsYWdzQ2hhbmdlZCh1aW50MzJfdCBmbGFncykgewogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbGFnc0NoYW5nZWQpOwpAQCAtMTUxNiwxMSArMjEyMywxMCBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCi12b2lkIE51UGxheWVyOjpTb3VyY2U6Om5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKK3ZvaWQgTnVQbGF5ZXI6OlNvdXJjZTo6bm90aWZ5VmlkZW9TaXplQ2hhbmdlZChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRWaWRlb1NpemVDaGFuZ2VkKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aWR0aCIsIHdpZHRoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJoZWlnaHQiLCBoZWlnaHQpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIApAQCAtMTUzMSwyMyArMjEzNyw4IEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKK3ZvaWQgTnVQbGF5ZXI6OlNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogbXNnICovKSB7CiAgICAgVFJFU1BBU1MoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6cXVldWVEZWNvZGVyU2h1dGRvd24oCi0gICAgICAgIGJvb2wgYXVkaW8sIGJvb2wgdmlkZW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKLSAgICBBTE9HSSgicXVldWVEZWNvZGVyU2h1dGRvd24gYXVkaW89JWQsIHZpZGVvPSVkIiwgYXVkaW8sIHZpZGVvKTsKLQotICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgbmV3IFNodXRkb3duRGVjb2RlckFjdGlvbihhdWRpbywgdmlkZW8pKTsKLQotICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXI6OnBlcmZvcm1TY2FuU291cmNlcykpOwotCi0gICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2sobmV3IFBvc3RNZXNzYWdlQWN0aW9uKHJlcGx5KSk7Ci0KLSAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCmluZGV4IDU5MGUxZjIuLmQ2MTIwZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCkBAIC0yNCw3ICsyNCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IEFDb2RlYzsKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IE1ldGFEYXRhOwogc3RydWN0IE51UGxheWVyRHJpdmVyOwogCkBAIC0zOCw3ICszOSw5IEBACiAgICAgdm9pZCBzZXREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSk7CiAKICAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZvaWQgc2V0RGF0YVNvdXJjZUFzeW5jKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIApAQCAtNTYsMTIgKzU5LDIwIEBACiAgICAgLy8gV2lsbCBub3RpZnkgdGhlIGRyaXZlciB0aHJvdWdoICJub3RpZnlSZXNldENvbXBsZXRlIiBvbmNlIGZpbmlzaGVkLgogICAgIHZvaWQgcmVzZXRBc3luYygpOwogCi0gICAgLy8gV2lsbCBub3RpZnkgdGhlIGRyaXZlciB0aHJvdWdoICJub3RpZnlTZWVrQ29tcGxldGUiIG9uY2UgZmluaXNoZWQuCi0gICAgdm9pZCBzZWVrVG9Bc3luYyhpbnQ2NF90IHNlZWtUaW1lVXMpOworICAgIC8vIFdpbGwgbm90aWZ5IHRoZSBkcml2ZXIgdGhyb3VnaCAibm90aWZ5U2Vla0NvbXBsZXRlIiBvbmNlIGZpbmlzaGVkCisgICAgLy8gYW5kIG5lZWROb3RpZnkgaXMgdHJ1ZS4KKyAgICB2b2lkIHNlZWtUb0FzeW5jKGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBuZWVkTm90aWZ5ID0gZmFsc2UpOwogCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9TY2FsaW5nTW9kZShpbnQzMl90IG1vZGUpOwogICAgIHN0YXR1c190IGdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdDsKKyAgICBzdGF0dXNfdCBnZXRTZWxlY3RlZFRyYWNrKGludDMyX3QgdHlwZSwgUGFyY2VsKiByZXBseSkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KTsKKyAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcyk7CisgICAgdm9pZCBnZXRTdGF0cyhpbnQ2NF90ICptTnVtRnJhbWVzVG90YWwsIGludDY0X3QgKm1OdW1GcmFtZXNEcm9wcGVkKTsKKworICAgIHNwPE1ldGFEYXRhPiBnZXRGaWxlTWV0YSgpOworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVQbGF5ZXIoKTsKQEAgLTc0LDYgKzg1LDggQEAKIAogcHJpdmF0ZToKICAgICBzdHJ1Y3QgRGVjb2RlcjsKKyAgICBzdHJ1Y3QgRGVjb2RlclBhc3NUaHJvdWdoOworICAgIHN0cnVjdCBDQ0RlY29kZXI7CiAgICAgc3RydWN0IEdlbmVyaWNTb3VyY2U7CiAgICAgc3RydWN0IEhUVFBMaXZlU291cmNlOwogICAgIHN0cnVjdCBSZW5kZXJlcjsKQEAgLTk2LDYgKzEwOSw3IEBACiAgICAgICAgIGtXaGF0U2NhblNvdXJjZXMgICAgICAgICAgICAgICAgPSAnc2NhbicsCiAgICAgICAgIGtXaGF0VmlkZW9Ob3RpZnkgICAgICAgICAgICAgICAgPSAndmlkTicsCiAgICAgICAgIGtXaGF0QXVkaW9Ob3RpZnkgICAgICAgICAgICAgICAgPSAnYXVkTicsCisgICAgICAgIGtXaGF0Q2xvc2VkQ2FwdGlvbk5vdGlmeSAgICAgICAgPSAnY2FwTicsCiAgICAgICAgIGtXaGF0UmVuZGVyZXJOb3RpZnkgICAgICAgICAgICAgPSAncmVuTicsCiAgICAgICAgIGtXaGF0UmVzZXQgICAgICAgICAgICAgICAgICAgICAgPSAncnNldCcsCiAgICAgICAgIGtXaGF0U2VlayAgICAgICAgICAgICAgICAgICAgICAgPSAnc2VlaycsCkBAIC0xMDQsNiArMTE4LDcgQEAKICAgICAgICAga1doYXRQb2xsRHVyYXRpb24gICAgICAgICAgICAgICA9ICdwb2xEJywKICAgICAgICAga1doYXRTb3VyY2VOb3RpZnkgICAgICAgICAgICAgICA9ICdzcmNOJywKICAgICAgICAga1doYXRHZXRUcmFja0luZm8gICAgICAgICAgICAgICA9ICdnVHJJJywKKyAgICAgICAga1doYXRHZXRTZWxlY3RlZFRyYWNrICAgICAgICAgICA9ICdnU2VsJywKICAgICAgICAga1doYXRTZWxlY3RUcmFjayAgICAgICAgICAgICAgICA9ICdzZWxUJywKICAgICB9OwogCkBAIC0xMTYsOSArMTMxLDE0IEBACiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7CiAgICAgc3A8RGVjb2Rlcj4gbVZpZGVvRGVjb2RlcjsKICAgICBib29sIG1WaWRlb0lzQVZDOwotICAgIGJvb2wgbU5lZWRzU3dSZW5kZXJlcjsKKyAgICBib29sIG1PZmZsb2FkQXVkaW87CiAgICAgc3A8RGVjb2Rlcj4gbUF1ZGlvRGVjb2RlcjsKKyAgICBzcDxDQ0RlY29kZXI+IG1DQ0RlY29kZXI7CiAgICAgc3A8UmVuZGVyZXI+IG1SZW5kZXJlcjsKKyAgICBzcDxBTG9vcGVyPiBtUmVuZGVyZXJMb29wZXI7CisgICAgaW50MzJfdCBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uOworICAgIGludDMyX3QgbVJlbmRlcmVyR2VuZXJhdGlvbjsKIAogICAgIExpc3Q8c3A8QWN0aW9uPiA+IG1EZWZlcnJlZEFjdGlvbnM7CiAKQEAgLTEyOSwxMCArMTQ5LDEwIEBACiAgICAgaW50MzJfdCBtU2NhblNvdXJjZXNHZW5lcmF0aW9uOwogCiAgICAgaW50MzJfdCBtUG9sbER1cmF0aW9uR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1UaW1lZFRleHRHZW5lcmF0aW9uOwogCiAgICAgZW51bSBGbHVzaFN0YXR1cyB7CiAgICAgICAgIE5PTkUsCi0gICAgICAgIEFXQUlUSU5HX0RJU0NPTlRJTlVJVFksCiAgICAgICAgIEZMVVNISU5HX0RFQ09ERVIsCiAgICAgICAgIEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV04sCiAgICAgICAgIFNIVVRUSU5HX0RPV05fREVDT0RFUiwKQEAgLTE0NCwzMSArMTY0LDYwIEBACiAgICAgLy8gbm90aW9uIG9mIHRpbWUgaGFzIGNoYW5nZWQuCiAgICAgYm9vbCBtVGltZURpc2NvbnRpbnVpdHlQZW5kaW5nOwogCisgICAgLy8gU3RhdHVzIG9mIGZsdXNoIHJlc3BvbnNlcyBmcm9tIHRoZSBkZWNvZGVyIGFuZCByZW5kZXJlci4KKyAgICBib29sIG1GbHVzaENvbXBsZXRlWzJdWzJdOworCisgICAgLy8gVXNlZCBieSBmZWVkRGVjb2RlcklucHV0RGF0YSB0byBhZ2dyZWdhdGUgc21hbGwgYnVmZmVycyBpbnRvCisgICAgLy8gb25lIGxhcmdlIGJ1ZmZlci4KKyAgICBzcDxBQnVmZmVyPiBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdDsKKyAgICBzdGF0dXNfdCAgICBtUGVuZGluZ0F1ZGlvRXJyOworICAgIHNwPEFCdWZmZXI+IG1BZ2dyZWdhdGVCdWZmZXI7CisKICAgICBGbHVzaFN0YXR1cyBtRmx1c2hpbmdBdWRpbzsKICAgICBGbHVzaFN0YXR1cyBtRmx1c2hpbmdWaWRlbzsKIAogICAgIGludDY0X3QgbVNraXBSZW5kZXJpbmdBdWRpb1VudGlsTWVkaWFUaW1lVXM7CiAgICAgaW50NjRfdCBtU2tpcFJlbmRlcmluZ1ZpZGVvVW50aWxNZWRpYVRpbWVVczsKIAotICAgIGludDY0X3QgbVZpZGVvTGF0ZUJ5VXM7CiAgICAgaW50NjRfdCBtTnVtRnJhbWVzVG90YWwsIG1OdW1GcmFtZXNEcm9wcGVkOwogCiAgICAgaW50MzJfdCBtVmlkZW9TY2FsaW5nTW9kZTsKIAogICAgIGJvb2wgbVN0YXJ0ZWQ7CiAKKyAgICBpbmxpbmUgY29uc3Qgc3A8RGVjb2Rlcj4gJmdldERlY29kZXIoYm9vbCBhdWRpbykgeworICAgICAgICByZXR1cm4gYXVkaW8gPyBtQXVkaW9EZWNvZGVyIDogbVZpZGVvRGVjb2RlcjsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBjbGVhckZsdXNoQ29tcGxldGUoKSB7CisgICAgICAgIG1GbHVzaENvbXBsZXRlWzBdWzBdID0gZmFsc2U7CisgICAgICAgIG1GbHVzaENvbXBsZXRlWzBdWzFdID0gZmFsc2U7CisgICAgICAgIG1GbHVzaENvbXBsZXRlWzFdWzBdID0gZmFsc2U7CisgICAgICAgIG1GbHVzaENvbXBsZXRlWzFdWzFdID0gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBvcGVuQXVkaW9TaW5rKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBib29sIG9mZmxvYWRPbmx5KTsKKyAgICB2b2lkIGNsb3NlQXVkaW9TaW5rKCk7CisKICAgICBzdGF0dXNfdCBpbnN0YW50aWF0ZURlY29kZXIoYm9vbCBhdWRpbywgc3A8RGVjb2Rlcj4gKmRlY29kZXIpOwogCisgICAgdm9pZCB1cGRhdGVWaWRlb1NpemUoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmlucHV0Rm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQgPSBOVUxMKTsKKwogICAgIHN0YXR1c190IGZlZWREZWNvZGVySW5wdXREYXRhKGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIHJlbmRlckJ1ZmZlcihib29sIGF1ZGlvLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKICAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOwogCisgICAgdm9pZCBoYW5kbGVGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8sIGJvb2wgaXNEZWNvZGVyKTsKICAgICB2b2lkIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwogCi0gICAgdm9pZCBmbHVzaERlY29kZXIoYm9vbCBhdWRpbywgYm9vbCBuZWVkU2h1dGRvd24pOworICAgIGJvb2wgYXVkaW9EZWNvZGVyU3RpbGxOZWVkZWQoKTsKIAotICAgIHN0YXRpYyBib29sIElzRmx1c2hpbmdTdGF0ZShGbHVzaFN0YXR1cyBzdGF0ZSwgYm9vbCAqbmVlZFNodXRkb3duID0gTlVMTCk7CisgICAgdm9pZCBmbHVzaERlY29kZXIoCisgICAgICAgICAgICBib29sIGF1ZGlvLCBib29sIG5lZWRTaHV0ZG93biwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZuZXdGb3JtYXQgPSBOVUxMKTsKKyAgICB2b2lkIHVwZGF0ZURlY29kZXJGb3JtYXRXaXRob3V0Rmx1c2goYm9vbCBhdWRpbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogCiAgICAgdm9pZCBwb3N0U2NhblNvdXJjZXMoKTsKIApAQCAtMTc3LDcgKzIyNiw3IEBACiAKICAgICB2b2lkIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKIAotICAgIHZvaWQgcGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzKTsKKyAgICB2b2lkIHBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBuZWVkTm90aWZ5KTsKICAgICB2b2lkIHBlcmZvcm1EZWNvZGVyRmx1c2goKTsKICAgICB2b2lkIHBlcmZvcm1EZWNvZGVyU2h1dGRvd24oYm9vbCBhdWRpbywgYm9vbCB2aWRlbyk7CiAgICAgdm9pZCBwZXJmb3JtUmVzZXQoKTsKQEAgLTE4NSwxMCArMjM0LDE2IEBACiAgICAgdm9pZCBwZXJmb3JtU2V0U3VyZmFjZShjb25zdCBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiAmd3JhcHBlcik7CiAKICAgICB2b2lkIG9uU291cmNlTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uQ2xvc2VkQ2FwdGlvbk5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKICAgICB2b2lkIHF1ZXVlRGVjb2RlclNodXRkb3duKAogICAgICAgICAgICAgYm9vbCBhdWRpbywgYm9vbCB2aWRlbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSk7CiAKKyAgICB2b2lkIHNlbmRTdWJ0aXRsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCBiYXNlSW5kZXgpOworICAgIHZvaWQgc2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICB2b2lkIHdyaXRlVHJhY2tJbmZvKFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiBmb3JtYXQpIGNvbnN0OworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVQbGF5ZXIpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAppbmRleCAyNDIzZmQ1Li4yN2Y2MTMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcApAQCAtMTcsMTQgKzE3LDE5IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk51UGxheWVyRGVjb2RlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSAiTnVQbGF5ZXJEZWNvZGVyLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMiw3MCArMzcsNjUxIEBACiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICBjb25zdCBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbmF0aXZlV2luZG93KQogICAgIDogbU5vdGlmeShub3RpZnkpLAotICAgICAgbU5hdGl2ZVdpbmRvdyhuYXRpdmVXaW5kb3cpIHsKKyAgICAgIG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KSwKKyAgICAgIG1CdWZmZXJHZW5lcmF0aW9uKDApLAorICAgICAgbVBhdXNlZCh0cnVlKSwKKyAgICAgIG1Db21wb25lbnROYW1lKCJkZWNvZGVyIikgeworICAgIC8vIEV2ZXJ5IGRlY29kZXIgaGFzIGl0cyBvd24gbG9vcGVyIGJlY2F1c2UgTWVkaWFDb2RlYyBvcGVyYXRpb25zCisgICAgLy8gYXJlIGJsb2NraW5nLCBidXQgTnVQbGF5ZXIgbmVlZHMgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCisgICAgbURlY29kZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtRGVjb2Rlckxvb3Blci0+c2V0TmFtZSgiTlBEZWNvZGVyIik7CisgICAgbURlY29kZXJMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisKKyAgICBtQ29kZWNMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ29kZWNMb29wZXItPnNldE5hbWUoIk5QRGVjb2Rlci1DTCIpOworICAgIG1Db2RlY0xvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKIH0KIAogTnVQbGF5ZXI6OkRlY29kZXI6On5EZWNvZGVyKCkgeworICAgIG1EZWNvZGVyTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKKyAgICBtRGVjb2Rlckxvb3Blci0+c3RvcCgpOworCisgICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworc3RhdGljCitzdGF0dXNfdCBQb3N0QW5kQXdhaXRSZXNwb25zZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPEFNZXNzYWdlPiAqcmVzcG9uc2UpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKHJlc3BvbnNlKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoISgqcmVzcG9uc2UpLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBtQ1NEc0ZvckN1cnJlbnRGb3JtYXQuY2xlYXIoKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IDsgKytpKSB7CisgICAgICAgIEFTdHJpbmcgdGFnID0gImNzZC0iOworICAgICAgICB0YWcuYXBwZW5kKGkpOworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgIGlmICghZm9ybWF0LT5maW5kQnVmZmVyKHRhZy5jX3N0cigpLCAmYnVmZmVyKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbUNTRHNGb3JDdXJyZW50Rm9ybWF0LnB1c2goYnVmZmVyKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CiAgICAgQ0hFQ0sobUNvZGVjID09IE5VTEwpOwogCisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKwogICAgIEFTdHJpbmcgbWltZTsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeU1zZyA9Ci0gICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdENvZGVjTm90aWZ5LCBpZCgpKTsKKyAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gTlVMTDsKKyAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgIHN1cmZhY2UgPSBtTmF0aXZlV2luZG93LT5nZXRTdXJmYWNlVGV4dHVyZUNsaWVudCgpOworICAgIH0KIAotICAgIG1DU0RJbmRleCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7OyArK2kpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkOwotICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEJ1ZmZlcihTdHJpbmdQcmludGYoImNzZC0lZCIsIGkpLmNfc3RyKCksICZjc2QpKSB7CisgICAgbUNvbXBvbmVudE5hbWUgPSBtaW1lOworICAgIG1Db21wb25lbnROYW1lLmFwcGVuZCgiIGRlY29kZXIiKTsKKyAgICBBTE9HVigiWyVzXSBvbkNvbmZpZ3VyZSAoc3VyZmFjZT0lcCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBzdXJmYWNlLmdldCgpKTsKKworICAgIG1Db2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZShtQ29kZWNMb29wZXIsIG1pbWUuY19zdHIoKSwgZmFsc2UgLyogZW5jb2RlciAqLyk7CisgICAgaW50MzJfdCBzZWN1cmUgPSAwOworICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigic2VjdXJlIiwgJnNlY3VyZSkgJiYgc2VjdXJlICE9IDApIHsKKyAgICAgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQ29kZWMtPmdldE5hbWUoJm1Db21wb25lbnROYW1lKTsKKyAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmFwcGVuZCgiLnNlY3VyZSIpOworICAgICAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBjcmVhdGluZyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgbUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgICAgICBtQ29kZWNMb29wZXIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSAlcyVzIGRlY29kZXIiLAorICAgICAgICAgICAgICAgIChzZWN1cmUgPyAic2VjdXJlICIgOiAiIiksIG1pbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNvZGVjLT5nZXROYW1lKCZtQ29tcG9uZW50TmFtZSk7CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgICAgICAvLyBkaXNjb25uZWN0IGZyb20gc3VyZmFjZSBhcyBNZWRpYUNvZGVjIHdpbGwgcmVjb25uZWN0CisgICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QoCisgICAgICAgICAgICAgICAgc3VyZmFjZS5nZXQoKSwgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICAvLyBXZSB0cmVhdCB0aGlzIGFzIGEgd2FybmluZywgYXMgdGhpcyBpcyBhIHByZXBhcmF0b3J5IHN0ZXAuCisgICAgICAgIC8vIENvZGVjIHdpbGwgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIHN1cmZhY2UsIHdoaWNoIGlzIHdoZXJlCisgICAgICAgIC8vIGFueSBlcnJvciBzaWduYWxpbmcgd2lsbCBvY2N1ci4KKyAgICAgICAgQUxPR1dfSUYoZXJyICE9IE9LLCAiZmFpbGVkIHRvIGRpc2Nvbm5lY3QgZnJvbSBzdXJmYWNlOiAlZCIsIGVycik7CisgICAgfQorICAgIGVyciA9IG1Db2RlYy0+Y29uZmlndXJlKAorICAgICAgICAgICAgZm9ybWF0LCBzdXJmYWNlLCBOVUxMIC8qIGNyeXB0byAqLywgMCAvKiBmbGFncyAqLyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSAlcyBkZWNvZGVyIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIG1Db2RlYy5jbGVhcigpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoZm9ybWF0KTsKKworICAgIC8vIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHdvcmsgaW4gY29uZmlndXJlZCBzdGF0ZQorICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoJm1PdXRwdXRGb3JtYXQpKTsKKyAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1Db2RlYy0+Z2V0SW5wdXRGb3JtYXQoJm1JbnB1dEZvcm1hdCkpOworCisgICAgZXJyID0gbUNvZGVjLT5zdGFydCgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCAlcyBkZWNvZGVyIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIG1Db2RlYy5jbGVhcigpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBhZnRlciBzdGFydAorICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNvZGVjLT5nZXRJbnB1dEJ1ZmZlcnMoJm1JbnB1dEJ1ZmZlcnMpKTsKKyAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKKyAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVycygmbU91dHB1dEJ1ZmZlcnMpKTsKKyAgICBBTE9HVigiWyVzXSBnb3QgJXp1IGlucHV0IGFuZCAlenUgb3V0cHV0IGJ1ZmZlcnMiLAorICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpLAorICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKworICAgIHJlcXVlc3RDb2RlY05vdGlmaWNhdGlvbigpOworICAgIG1QYXVzZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6cmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhQnVmZmVycy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU1lZGlhQnVmZmVyc1tpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTWVkaWFCdWZmZXJzW2ldLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoaSkgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIG1NZWRpYUJ1ZmZlcnMucmVzaXplKG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NZWRpYUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGkpID0gTlVMTDsKKyAgICB9CisgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5jbGVhcigpOworICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQucmVzaXplKG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGkpID0gZmFsc2U7CisgICAgfQorCisgICAgbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmNsZWFyKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnJlcXVlc3RDb2RlY05vdGlmaWNhdGlvbigpIHsKKyAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29kZWNOb3RpZnksIGlkKCkpOworICAgICAgICByZXBseS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQnVmZmVyR2VuZXJhdGlvbik7CisgICAgICAgIG1Db2RlYy0+cmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uKHJlcGx5KTsKKyAgICB9Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OmlzU3RhbGVSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgcmV0dXJuIGdlbmVyYXRpb24gIT0gbUJ1ZmZlckdlbmVyYXRpb247Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmluaXQoKSB7CisgICAgbURlY29kZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ3VyZSwgaWQoKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpzaWduYWxVcGRhdGVGb3JtYXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0VXBkYXRlRm9ybWF0LCBpZCgpKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpEZWNvZGVyOjpnZXRJbnB1dEJ1ZmZlcnMoVmVjdG9yPHNwPEFCdWZmZXI+ID4gKmJ1ZmZlcnMpIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0SW5wdXRCdWZmZXJzLCBpZCgpKTsKKyAgICBtc2ctPnNldFBvaW50ZXIoImJ1ZmZlcnMiLCBidWZmZXJzKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpoYW5kbGVFcnJvcihpbnQzMl90IGVycikKK3sKKyAgICAvLyBXZSBjYW5ub3QgaW1tZWRpYXRlbHkgcmVsZWFzZSB0aGUgY29kZWMgZHVlIHRvIGJ1ZmZlcnMgc3RpbGwgb3V0c3RhbmRpbmcKKyAgICAvLyBpbiB0aGUgcmVuZGVyZXIuICBXZSBzaWduYWwgdG8gdGhlIHBsYXllciB0aGUgZXJyb3Igc28gaXQgY2FuIHNodXRkb3duL3JlbGVhc2UgdGhlCisgICAgLy8gZGVjb2RlciBhZnRlciBmbHVzaGluZyBhbmQgaW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIHRvIGRpc2NhcmQgdW5uZWNlc3NhcnkgbWVzc2FnZXMuCisKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVycm9yKTsKKyAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyOjpoYW5kbGVBbklucHV0QnVmZmVyKCkgeworICAgIHNpemVfdCBidWZmZXJJeCA9IC0xOworICAgIHN0YXR1c190IHJlcyA9IG1Db2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZidWZmZXJJeCk7CisgICAgQUxPR1YoIlslc10gZGVxdWV1ZWQgaW5wdXQ6ICVkIiwKKyAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyA9PSBPSyA/IChpbnQpYnVmZmVySXggOiByZXMpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgaWYgKHJlcyAhPSAtRUFHQUlOKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlcXVldWUgaW5wdXQgYnVmZmVyIGZvciAlcyAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihyZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDS19MVChidWZmZXJJeCwgbUlucHV0QnVmZmVycy5zaXplKCkpOworCisgICAgaWYgKG1NZWRpYUJ1ZmZlcnNbYnVmZmVySXhdICE9IE5VTEwpIHsKKyAgICAgICAgbU1lZGlhQnVmZmVyc1tidWZmZXJJeF0tPnJlbGVhc2UoKTsKKyAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IE5VTEw7CisgICAgfQorICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChidWZmZXJJeCkgPSB0cnVlOworCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQsIGlkKCkpOworICAgIHJlcGx5LT5zZXRTaXplKCJidWZmZXItaXgiLCBidWZmZXJJeCk7CisgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworCisgICAgaWYgKCFtQ1NEc1RvU3VibWl0LmlzRW1wdHkoKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQ1NEc1RvU3VibWl0Lml0ZW1BdCgwKTsKKyAgICAgICAgQUxPR0koIlslc10gcmVzdWJtaXR0aW5nIENTRCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOworICAgICAgICBtQ1NEc1RvU3VibWl0LnJlbW92ZUF0KDApOworICAgICAgICBDSEVDSyhvbklucHV0QnVmZmVyRmlsbGVkKHJlcGx5KSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHdoaWxlICghbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmVtcHR5KCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9ICptUGVuZGluZ0lucHV0TWVzc2FnZXMuYmVnaW4oKTsKKyAgICAgICAgaWYgKCFvbklucHV0QnVmZmVyRmlsbGVkKG1zZykpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KLSAgICAgICAgbUNTRC5wdXNoKGNzZCk7CisgICAgICAgIG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5lcmFzZShtUGVuZGluZ0lucHV0TWVzc2FnZXMuYmVnaW4oKSk7CiAgICAgfQogCi0gICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgewotICAgICAgICBmb3JtYXQtPnNldE9iamVjdCgibmF0aXZlLXdpbmRvdyIsIG1OYXRpdmVXaW5kb3cpOworICAgIGlmICghbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGJ1ZmZlckl4KSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICAvLyBDdXJyZW50IHZpZGVvIGRlY29kZXJzIGRvIG5vdCByZXR1cm4gZnJvbSBPTVhfRmlsbFRoaXNCdWZmZXIKLSAgICAvLyBxdWlja2x5LCB2aW9sYXRpbmcgdGhlIE9wZW5NQVggc3BlY3MsIHVudGlsIHRoYXQgaXMgcmVtZWRpZWQKLSAgICAvLyB3ZSBuZWVkIHRvIGludmVzdCBpbiBhbiBleHRyYSBsb29wZXIgdG8gZnJlZSB0aGUgbWFpbiBldmVudAotICAgIC8vIHF1ZXVlLgotICAgIGJvb2wgbmVlZERlZGljYXRlZExvb3BlciA9ICFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJ2aWRlby8iLCA2KTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RmlsbFRoaXNCdWZmZXIpOworICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBtSW5wdXRCdWZmZXJzW2J1ZmZlckl4XSk7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKyAgICBub3RpZnktPnBvc3QoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KIAotICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgbUNvZGVjID0gbmV3IEFDb2RlYzsKK2Jvb2wgYW5kcm9pZDo6TnVQbGF5ZXI6OkRlY29kZXI6Om9uSW5wdXRCdWZmZXJGaWxsZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzaXplX3QgYnVmZmVySXg7CisgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiYnVmZmVyLWl4IiwgJmJ1ZmZlckl4KSk7CisgICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBzcDxBQnVmZmVyPiBjb2RlY0J1ZmZlciA9IG1JbnB1dEJ1ZmZlcnNbYnVmZmVySXhdOwogCi0gICAgaWYgKG5lZWREZWRpY2F0ZWRMb29wZXIgJiYgbUNvZGVjTG9vcGVyID09IE5VTEwpIHsKLSAgICAgICAgbUNvZGVjTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgICAgIG1Db2RlY0xvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJEZWNvZGVyIik7Ci0gICAgICAgIG1Db2RlY0xvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgYm9vbCBoYXNCdWZmZXIgPSBtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpOworCisgICAgLy8gaGFuZGxlIHdpZGV2aW5lIGNsYXNzaWMgc291cmNlIC0gdGhhdCBmaWxscyBhbiBhcmJpdHJhcnkgaW5wdXQgYnVmZmVyCisgICAgTWVkaWFCdWZmZXIgKm1lZGlhQnVmZmVyID0gTlVMTDsKKyAgICBpZiAoaGFzQnVmZmVyKSB7CisgICAgICAgIG1lZGlhQnVmZmVyID0gKE1lZGlhQnVmZmVyICopKGJ1ZmZlci0+Z2V0TWVkaWFCdWZmZXJCYXNlKCkpOworICAgICAgICBpZiAobWVkaWFCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gbGlrZWx5IGZpbGxlZCBhbm90aGVyIGJ1ZmZlciB0aGFuIHdlIHJlcXVlc3RlZDogYWRqdXN0IGJ1ZmZlciBpbmRleAorICAgICAgICAgICAgc2l6ZV90IGl4OworICAgICAgICAgICAgZm9yIChpeCA9IDA7IGl4IDwgbUlucHV0QnVmZmVycy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmID0gbUlucHV0QnVmZmVyc1tpeF07CisgICAgICAgICAgICAgICAgaWYgKGJ1Zi0+ZGF0YSgpID09IG1lZGlhQnVmZmVyLT5kYXRhKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGlucHV0IGJ1ZmZlcnMgYXJlIGRlcXVldWVkIG9uIHN0YXJ0LCBoZW5jZSB0aGUgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtSW5wdXRCdWZmZXJJc0RlcXVldWVkW2l4XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gcmVjZWl2ZWQgTWVkaWFCdWZmZXIgZm9yICMlenUgaW5zdGVhZCBvZiAjJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgaXgsIGJ1ZmZlckl4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBUUklDS1k6IG5lZWQgYnVmZmVyIGZvciB0aGUgbWV0YWRhdGEsIHNvIGluc3RlYWQsIHNldAorICAgICAgICAgICAgICAgICAgICAvLyBjb2RlY0J1ZmZlciB0byB0aGUgc2FtZSAodGhvdWdoIGluY29ycmVjdCkgYnVmZmVyIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGF2b2lkIGEgbWVtY3B5IGludG8gdGhlIGNvZGVjQnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyID0gYnVmZmVyOworICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl4ID0gaXg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLKGl4IDwgbUlucHV0QnVmZmVycy5zaXplKCkpOworICAgICAgICB9CiAgICAgfQogCi0gICAgKG5lZWREZWRpY2F0ZWRMb29wZXIgPyBtQ29kZWNMb29wZXIgOiBsb29wZXIoKSktPnJlZ2lzdGVySGFuZGxlcihtQ29kZWMpOwogCi0gICAgbUNvZGVjLT5zZXROb3RpZmljYXRpb25NZXNzYWdlKG5vdGlmeU1zZyk7Ci0gICAgbUNvZGVjLT5pbml0aWF0ZVNldHVwKGZvcm1hdCk7CisKKyAgICBpZiAoYnVmZmVyID09IE5VTEwgLyogaW5jbHVkZXMgIWhhc0J1ZmZlciAqLykgeworICAgICAgICBpbnQzMl90IHN0cmVhbUVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmc3RyZWFtRXJyKSB8fCAhaGFzQnVmZmVyKTsKKworICAgICAgICBpZiAoc3RyZWFtRXJyID09IE9LKSB7CisgICAgICAgICAgICAvKiBidWZmZXJzIGFyZSByZXR1cm5lZCB0byBob2xkIG9uIHRvICovCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGF0dGVtcHQgdG8gcXVldWUgRU9TCisgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBidWZmZXJJeCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoYnVmZmVySXgpID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtRXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIHN0cmVhbUVyciA9IGVycjsKKyAgICAgICAgICAgIC8vIGVyciB3aWxsIG5vdCBiZSBFUlJPUl9FTkRfT0ZfU1RSRUFNCisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyZWFtRXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIEFMT0dFKCJTdHJlYW0gZXJyb3IgZm9yICVzIChlcnI9JWQpLCBFT1MgJXMgcXVldWVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtRXJyLAorICAgICAgICAgICAgICAgICAgICBlcnIgPT0gT0sgPyAic3VjY2Vzc2Z1bGx5IiA6ICJ1bnN1Y2Nlc3NmdWxseSIpOworICAgICAgICAgICAgaGFuZGxlRXJyb3Ioc3RyZWFtRXJyKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgdGltZVVzID0gMDsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICAgICAgaW50MzJfdCBlb3MsIGNzZDsKKyAgICAgICAgLy8gd2UgZG8gbm90IGV4cGVjdCBTWU5DRlJBTUUgZm9yIGRlY29kZXIKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZlb3MpICYmIGVvcykgeworICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNzZCIsICZjc2QpICYmIGNzZCkgeworICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUc7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb3B5IGludG8gY29kZWMgYnVmZmVyCisgICAgICAgIGlmIChidWZmZXIgIT0gY29kZWNCdWZmZXIpIHsKKyAgICAgICAgICAgIENIRUNLX0xFKGJ1ZmZlci0+c2l6ZSgpLCBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChtZWRpYUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVldWUgaW5wdXQgYnVmZmVyIGZvciAlcyAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1lZGlhQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhtTWVkaWFCdWZmZXJzW2J1ZmZlckl4XSA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoYnVmZmVySXgpID0gbWVkaWFCdWZmZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OmhhbmRsZUFuT3V0cHV0QnVmZmVyKCkgeworICAgIHNpemVfdCBidWZmZXJJeCA9IC0xOworICAgIHNpemVfdCBvZmZzZXQ7CisgICAgc2l6ZV90IHNpemU7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgc3RhdHVzX3QgcmVzID0gbUNvZGVjLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgJmJ1ZmZlckl4LCAmb2Zmc2V0LCAmc2l6ZSwgJnRpbWVVcywgJmZsYWdzKTsKKworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR1YoIlslc10gZGVxdWV1ZWQgb3V0cHV0OiAlZCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIlslc10gZGVxdWV1ZWQgb3V0cHV0OiAlZCAodGltZT0lbGxkIGZsYWdzPSUiIFBSSXUzMiAiKSIsCisgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGludClidWZmZXJJeCwgdGltZVVzLCBmbGFncyk7CisgICAgfQorCisgICAgaWYgKHJlcyA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpIHsKKyAgICAgICAgcmVzID0gbUNvZGVjLT5nZXRPdXRwdXRCdWZmZXJzKCZtT3V0cHV0QnVmZmVycyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IG91dHB1dCBidWZmZXJzIGZvciAlcyBhZnRlciBJTkZPIGV2ZW50IChlcnI9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmVzKTsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gTnVQbGF5ZXIgaWdub3JlcyB0aGlzCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmVzID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICByZXMgPSBtQ29kZWMtPmdldE91dHB1dEZvcm1hdCgmZm9ybWF0KTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgb3V0cHV0IGZvcm1hdCBmb3IgJXMgYWZ0ZXIgSU5GTyBldmVudCAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihyZXMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKTsKKyAgICAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChyZXMgPT0gSU5GT19ESVNDT05USU5VSVRZKSB7CisgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgaWYgKHJlcyAhPSAtRUFHQUlOKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlcXVldWUgb3V0cHV0IGJ1ZmZlciBmb3IgJXMgKGVycj0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IocmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1PdXRwdXRCdWZmZXJzLnNpemUoKSk7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbU91dHB1dEJ1ZmZlcnNbYnVmZmVySXhdOworICAgIGJ1ZmZlci0+c2V0UmFuZ2Uob2Zmc2V0LCBzaXplKTsKKyAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CisgICAgfQorICAgIC8vIHdlIGRvIG5vdCBleHBlY3QgQ09ERUNDT05GSUcgb3IgU1lOQ0ZSQU1FIGZvciBkZWNvZGVyCisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJCdWZmZXIsIGlkKCkpOworICAgIHJlcGx5LT5zZXRTaXplKCJidWZmZXItaXgiLCBidWZmZXJJeCk7CisgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdERyYWluVGhpc0J1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKyAgICBub3RpZnktPnBvc3QoKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBoYW5kbGVkIGFmdGVyIHJlbmRlcmluZyBpcyBjb21wbGV0ZSwKKyAgICAvLyBidXQgUmVuZGVyZXIgbmVlZHMgaXQgbm93CisgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7CisgICAgICAgIEFMT0dWKCJxdWV1ZWluZyBlb3MgWyVzXSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVPUyk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uUmVuZGVyQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGludDMyX3QgcmVuZGVyOworICAgIHNpemVfdCBidWZmZXJJeDsKKyAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJidWZmZXItaXgiLCAmYnVmZmVySXgpKTsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoInJlbmRlciIsICZyZW5kZXIpICYmIHJlbmRlcikgeworICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wTnMiLCAmdGltZXN0YW1wTnMpKTsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5yZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKGJ1ZmZlckl4LCB0aW1lc3RhbXBOcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGJ1ZmZlckl4KTsKKyAgICB9CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlbGVhc2Ugb3V0cHV0IGJ1ZmZlciBmb3IgJXMgKGVycj0lZCkiLAorICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvbkZsdXNoKCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBtQ29kZWMtPmZsdXNoKCk7CisgICAgICAgIG1DU0RzVG9TdWJtaXQgPSBtQ1NEc0ZvckN1cnJlbnRGb3JtYXQ7IC8vIGNvcHkgb3BlcmF0b3IKKyAgICAgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmx1c2ggJXMgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICAvLyBmaW5pc2ggd2l0aCBwb3N0aW5nIGtXaGF0Rmx1c2hDb21wbGV0ZWQuCisgICAgICAgIC8vIHdlIGF0dGVtcHQgdG8gcmVsZWFzZSB0aGUgYnVmZmVycyBldmVuIGlmIGZsdXNoIGZhaWxzLgorICAgIH0KKyAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbVBhdXNlZCA9IHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uUmVzdW1lKCkgeworICAgIG1QYXVzZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25TaHV0ZG93bigpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIG1Db2RlYyA9IE5VTEw7CisgICAgICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gcmVjb25uZWN0IHRvIHN1cmZhY2UgYXMgTWVkaWFDb2RlYyBkaXNjb25uZWN0ZWQgZnJvbSBpdAorICAgICAgICAgICAgc3RhdHVzX3QgZXJyb3IgPQorICAgICAgICAgICAgICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3ctPmdldE5hdGl2ZVdpbmRvdygpLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKGVycm9yICE9IE5PX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiWyVzXSBmYWlsZWQgdG8gY29ubmVjdCB0byBuYXRpdmUgd2luZG93LCBlcnJvcj0lZCIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBtQ29tcG9uZW50TmFtZSA9ICJkZWNvZGVyIjsKKyAgICB9CisKKyAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWxlYXNlICVzIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgLy8gZmluaXNoIHdpdGggcG9zdGluZyBrV2hhdFNodXRkb3duQ29tcGxldGVkLgorICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbVBhdXNlZCA9IHRydWU7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQUxPR1YoIlslc10gb25NZXNzYWdlOiAlcyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKwogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ3VyZToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKyAgICAgICAgICAgIG9uQ29uZmlndXJlKGZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRVcGRhdGVGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisgICAgICAgICAgICByZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKGZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRJbnB1dEJ1ZmZlcnM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpkc3RCdWZmZXJzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiYnVmZmVycyIsICh2b2lkICoqKSZkc3RCdWZmZXJzKSk7CisKKyAgICAgICAgICAgIGRzdEJ1ZmZlcnMtPmNsZWFyKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkc3RCdWZmZXJzLT5wdXNoKG1JbnB1dEJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0Q29kZWNOb3RpZnk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKKyAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG51bUlucHV0LCBudW1PdXRwdXQ7CiAKLSAgICAgICAgICAgIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGaWxsVGhpc0J1ZmZlcikgewotICAgICAgICAgICAgICAgIG9uRmlsbFRoaXNCdWZmZXIobXNnKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiY29kZWMtcmVxdWVzdCIsIG1zZyk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiaW5wdXQtYnVmZmVycyIsICZudW1JbnB1dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtSW5wdXQgPSBJTlQzMl9NQVg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigib3V0cHV0LWJ1ZmZlcnMiLCAmbnVtT3V0cHV0KSkgeworICAgICAgICAgICAgICAgICAgICBudW1PdXRwdXQgPSBJTlQzMl9NQVg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChudW1JbnB1dC0tID4gMCAmJiBoYW5kbGVBbklucHV0QnVmZmVyKCkpIHt9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKG51bU91dHB1dC0tID4gMCAmJiBoYW5kbGVBbk91dHB1dEJ1ZmZlcigpKSB7fQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXF1ZXN0Q29kZWNOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdElucHV0QnVmZmVyRmlsbGVkOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtUGVuZGluZ0lucHV0TWVzc2FnZXMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW9uSW5wdXRCdWZmZXJGaWxsZWQobXNnKSkgeworICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0lucHV0TWVzc2FnZXMucHVzaF9iYWNrKG1zZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZW5kZXJCdWZmZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKKyAgICAgICAgICAgICAgICBvblJlbmRlckJ1ZmZlcihtc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Rmx1c2g6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kTWVzc2FnZSgibmV3LWZvcm1hdCIsICZmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb25GbHVzaCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVzdW1lOgorICAgICAgICB7CisgICAgICAgICAgICBvblJlc3VtZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU2h1dGRvd24oKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTEwNSw0NyArNjkxLDIwIEBACiAgICAgfQogfQogCi12b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvbkZpbGxUaGlzQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IHJlcGx5OwotICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSk7Ci0KLSNpZiAwCi0gICAgc3A8QUJ1ZmZlcj4gb3V0QnVmZmVyOwotICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJm91dEJ1ZmZlcikpOwotI2Vsc2UKLSAgICBzcDxBQnVmZmVyPiBvdXRCdWZmZXI7Ci0jZW5kaWYKLQotICAgIGlmIChtQ1NESW5kZXggPCBtQ1NELnNpemUoKSkgewotICAgICAgICBvdXRCdWZmZXIgPSBtQ1NELmVkaXRJdGVtQXQobUNTREluZGV4KyspOwotICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwotCi0gICAgICAgIHJlcGx5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIG91dEJ1ZmZlcik7Ci0gICAgICAgIHJlcGx5LT5wb3N0KCk7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnNpZ25hbEZsdXNoKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCBpZCgpKTsKKyAgICBpZiAoZm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgbXNnLT5zZXRNZXNzYWdlKCJuZXctZm9ybWF0IiwgZm9ybWF0KTsKICAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJjb2RlYy1yZXF1ZXN0IiwgbXNnKTsKLSAgICBub3RpZnktPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6c2lnbmFsRmx1c2goKSB7Ci0gICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1Db2RlYy0+c2lnbmFsRmx1c2goKTsKLSAgICB9CisgICAgbXNnLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnNpZ25hbFJlc3VtZSgpIHsKLSAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKLSAgICAgICAgbUNvZGVjLT5zaWduYWxSZXN1bWUoKTsKLSAgICB9CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgaWQoKSkpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmluaXRpYXRlU2h1dGRvd24oKSB7Ci0gICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1Db2RlYy0+aW5pdGlhdGVTaHV0ZG93bigpOwotICAgIH0KKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2h1dGRvd24sIGlkKCkpKS0+cG9zdCgpOwogfQogCiBib29sIE51UGxheWVyOjpEZWNvZGVyOjpzdXBwb3J0c1NlYW1sZXNzQXVkaW9Gb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0YXJnZXRGb3JtYXQpIGNvbnN0IHsKQEAgLTE2MywxNCArNzIyLDE2IEBACiAgICAgICAgIGNvbnN0IGNoYXIgKiBrZXlzW10gPSB7ICJjaGFubmVsLWNvdW50IiwgInNhbXBsZS1yYXRlIiwgImlzLWFkdHMiIH07CiAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgc2l6ZW9mKGtleXMpIC8gc2l6ZW9mKGtleXNbMF0pOyBpKyspIHsKICAgICAgICAgICAgIGludDMyX3Qgb2xkVmFsLCBuZXdWYWw7Ci0gICAgICAgICAgICBpZiAoIW1Gb3JtYXQtPmZpbmRJbnQzMihrZXlzW2ldLCAmb2xkVmFsKSB8fCAhdGFyZ2V0Rm9ybWF0LT5maW5kSW50MzIoa2V5c1tpXSwgJm5ld1ZhbCkKLSAgICAgICAgICAgICAgICAgICAgfHwgb2xkVmFsICE9IG5ld1ZhbCkgeworICAgICAgICAgICAgaWYgKCFtT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoa2V5c1tpXSwgJm9sZFZhbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIXRhcmdldEZvcm1hdC0+ZmluZEludDMyKGtleXNbaV0sICZuZXdWYWwpIHx8CisgICAgICAgICAgICAgICAgICAgIG9sZFZhbCAhPSBuZXdWYWwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBzcDxBQnVmZmVyPiBvbGRCdWYsIG5ld0J1ZjsKLSAgICAgICAgaWYgKG1Gb3JtYXQtPmZpbmRCdWZmZXIoImNzZC0wIiwgJm9sZEJ1ZikgJiYgdGFyZ2V0Rm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZuZXdCdWYpKSB7CisgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZvbGRCdWYpICYmCisgICAgICAgICAgICAgICAgdGFyZ2V0Rm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZuZXdCdWYpKSB7CiAgICAgICAgICAgICBpZiAob2xkQnVmLT5zaXplKCkgIT0gbmV3QnVmLT5zaXplKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC0xODEsNyArNzQyLDcgQEAKIH0KIAogYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6c3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRhcmdldEZvcm1hdCkgY29uc3QgewotICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTE5MCw3ICs3NTEsNyBAQAogICAgIH0KIAogICAgIEFTdHJpbmcgb2xkTWltZSwgbmV3TWltZTsKLSAgICBpZiAoIW1Gb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmb2xkTWltZSkKKyAgICBpZiAoIW1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmb2xkTWltZSkKICAgICAgICAgICAgIHx8ICF0YXJnZXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbmV3TWltZSkKICAgICAgICAgICAgIHx8ICEob2xkTWltZSA9PSBuZXdNaW1lKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMDEsMTIgKzc2MiwzNDMgQEAKICAgICBpZiAoYXVkaW8pIHsKICAgICAgICAgc2VhbWxlc3MgPSBzdXBwb3J0c1NlYW1sZXNzQXVkaW9Gb3JtYXRDaGFuZ2UodGFyZ2V0Rm9ybWF0KTsKICAgICB9IGVsc2UgewotICAgICAgICBzZWFtbGVzcyA9IG1Db2RlYyAhPSBOVUxMICYmIG1Db2RlYy0+aXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjaygpOworICAgICAgICBpbnQzMl90IGlzQWRhcHRpdmU7CisgICAgICAgIHNlYW1sZXNzID0gKG1Db2RlYyAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5maW5kSW50MzIoImFkYXB0aXZlLXBsYXliYWNrIiwgJmlzQWRhcHRpdmUpICYmCisgICAgICAgICAgICAgICAgaXNBZGFwdGl2ZSk7CiAgICAgfQogCiAgICAgQUxPR1YoIiVzIHNlYW1sZXNzIHN1cHBvcnQgZm9yICVzIiwgc2VhbWxlc3MgPyAieWVzIiA6ICJubyIsIG9sZE1pbWUuY19zdHIoKSk7CiAgICAgcmV0dXJuIHNlYW1sZXNzOwogfQogCitzdHJ1Y3QgQ0NEYXRhIHsKKyAgICBDQ0RhdGEodWludDhfdCB0eXBlLCB1aW50OF90IGRhdGExLCB1aW50OF90IGRhdGEyKQorICAgICAgICA6IG1UeXBlKHR5cGUpLCBtRGF0YTEoZGF0YTEpLCBtRGF0YTIoZGF0YTIpIHsKKyAgICB9CisgICAgYm9vbCBnZXRDaGFubmVsKHNpemVfdCAqY2hhbm5lbCkgY29uc3QgeworICAgICAgICBpZiAobURhdGExID49IDB4MTAgJiYgbURhdGExIDw9IDB4MWYpIHsKKyAgICAgICAgICAgICpjaGFubmVsID0gKG1EYXRhMSA+PSAweDE4ID8gMSA6IDApICsgKG1UeXBlID8gMiA6IDApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ4X3QgbVR5cGU7CisgICAgdWludDhfdCBtRGF0YTE7CisgICAgdWludDhfdCBtRGF0YTI7Cit9OworCitzdGF0aWMgYm9vbCBpc051bGxQYWQoQ0NEYXRhICpjYykgeworICAgIHJldHVybiBjYy0+bURhdGExIDwgMHgxMCAmJiBjYy0+bURhdGEyIDwgMHgxMDsKK30KKworc3RhdGljIHZvaWQgZHVtcEJ5dGVQYWlyKGNvbnN0IHNwPEFCdWZmZXI+ICZjY0J1ZikgeworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIEFTdHJpbmcgb3V0OworCisgICAgd2hpbGUgKG9mZnNldCA8IGNjQnVmLT5zaXplKCkpIHsKKyAgICAgICAgY2hhciB0bXBbMTI4XTsKKworICAgICAgICBDQ0RhdGEgKmNjID0gKENDRGF0YSAqKSAoY2NCdWYtPmRhdGEoKSArIG9mZnNldCk7CisKKyAgICAgICAgaWYgKGlzTnVsbFBhZChjYykpIHsKKyAgICAgICAgICAgIC8vIDEgbnVsbCBwYWQgb3IgWERTIG1ldGFkYXRhLCBpZ25vcmUKKyAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2YoQ0NEYXRhKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNjLT5tRGF0YTEgPj0gMHgyMCAmJiBjYy0+bURhdGExIDw9IDB4N2YpIHsKKyAgICAgICAgICAgIC8vIDIgYmFzaWMgY2hhcnMKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiWyVkXUJhc2ljOiAlYyAlYyIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMSB8fCBjYy0+bURhdGExID09IDB4MTkpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgzMCAmJiBjYy0+bURhdGEyIDw9IDB4M2YpIHsKKyAgICAgICAgICAgIC8vIDEgc3BlY2lhbCBjaGFyCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlslZF1TcGVjaWFsOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgaWYgKChjYy0+bURhdGExID09IDB4MTIgfHwgY2MtPm1EYXRhMSA9PSAweDFBKQorICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MjAgJiYgY2MtPm1EYXRhMiA8PSAweDNmKXsKKyAgICAgICAgICAgIC8vIDEgU3BhbmlzaC9GcmVuY2ggY2hhcgorICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdU3BhbmlzaDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDEzIHx8IGNjLT5tRGF0YTEgPT0gMHgxQikKKyAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgzZil7CisgICAgICAgICAgICAvLyAxIFBvcnR1Z3Vlc2UvR2VybWFuL0RhbmlzaCBjaGFyCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlslZF1HZXJtYW46ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMSB8fCBjYy0+bURhdGExID09IDB4MTkpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMCAmJiBjYy0+bURhdGEyIDw9IDB4MmYpeworICAgICAgICAgICAgLy8gTWlkLVJvdyBDb2RlcyAoVGFibGUgNjkpCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlslZF1NaWQtcm93OiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgaWYgKCgoY2MtPm1EYXRhMSA9PSAweDE0IHx8IGNjLT5tRGF0YTEgPT0gMHgxYykKKyAgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMCAmJiBjYy0+bURhdGEyIDw9IDB4MmYpCisgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAgICgoY2MtPm1EYXRhMSA9PSAweDE3IHx8IGNjLT5tRGF0YTEgPT0gMHgxZikKKyAgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMSAmJiBjYy0+bURhdGEyIDw9IDB4MjMpKXsKKyAgICAgICAgICAgIC8vIE1pc2MgQ29udHJvbCBDb2RlcyAoVGFibGUgNzApCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlslZF1DdHJsOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgaWYgKChjYy0+bURhdGExICYgMHg3MCkgPT0gMHgxMAorICAgICAgICAgICAgICAgICYmIChjYy0+bURhdGEyICYgMHg0MCkgPT0gMHg0MAorICAgICAgICAgICAgICAgICYmICgoY2MtPm1EYXRhMSAmIDB4MDcpIHx8ICEoY2MtPm1EYXRhMiAmIDB4MjApKSApIHsKKyAgICAgICAgICAgIC8vIFByZWFtYmxlIEFkZHJlc3MgQ29kZXMgKFRhYmxlIDcxKQorICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdUEFDOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdSW52YWxpZDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgb3V0LmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dC5hcHBlbmQodG1wKTsKKworICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKENDRGF0YSk7CisgICAgfQorCisgICAgQUxPR0koIiVzIiwgb3V0LmNfc3RyKCkpOworfQorCitOdVBsYXllcjo6Q0NEZWNvZGVyOjpDQ0RlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiBtTm90aWZ5KG5vdGlmeSksCisgICAgICBtQ3VycmVudENoYW5uZWwoMCksCisgICAgICBtU2VsZWN0ZWRUcmFjaygtMSkgeworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YobVRyYWNrSW5kaWNlcykvc2l6ZW9mKG1UcmFja0luZGljZXNbMF0pOyArK2kpIHsKKyAgICAgICAgICBtVHJhY2tJbmRpY2VzW2ldID0gLTE7CisgICAgICB9Cit9CisKK3NpemVfdCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpnZXRUcmFja0NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtRm91bmRDaGFubmVscy5zaXplKCk7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjo6Q0NEZWNvZGVyOjpnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgaWYgKCFpc1RyYWNrVmFsaWQoaW5kZXgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKworICAgIGZvcm1hdC0+c2V0SW50MzIoInR5cGUiLCBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKTsKKyAgICBmb3JtYXQtPnNldFN0cmluZygibGFuZ3VhZ2UiLCAidW5kIik7CisgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9URVhUX0NFQV82MDgpOworICAgIC8vQ0MxLCBmaWVsZCAwIGNoYW5uZWwgMAorICAgIGJvb2wgaXNEZWZhdWx0QXV0byA9IChtRm91bmRDaGFubmVsc1tpbmRleF0gPT0gMCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiYXV0byIsIGlzRGVmYXVsdEF1dG8pOworICAgIGZvcm1hdC0+c2V0SW50MzIoImRlZmF1bHQiLCBpc0RlZmF1bHRBdXRvKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJmb3JjZWQiLCAwKTsKKworICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpDQ0RlY29kZXI6OnNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpIHsKKyAgICBpZiAoIWlzVHJhY2tWYWxpZChpbmRleCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoc2VsZWN0KSB7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSAoc3NpemVfdClpbmRleCkgeworICAgICAgICAgICAgQUxPR0UoInRyYWNrICV6dSBhbHJlYWR5IHNlbGVjdGVkIiwgaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigic2VsZWN0ZWQgdHJhY2sgJXp1IiwgaW5kZXgpOworICAgICAgICBtU2VsZWN0ZWRUcmFjayA9IGluZGV4OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSAoc3NpemVfdClpbmRleCkgeworICAgICAgICAgICAgQUxPR0UoInRyYWNrICV6dSBpcyBub3Qgc2VsZWN0ZWQiLCBpbmRleCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJ1bnNlbGVjdGVkIHRyYWNrICV6dSIsIGluZGV4KTsKKyAgICAgICAgbVNlbGVjdGVkVHJhY2sgPSAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6aXNTZWxlY3RlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2sgPj0gMCAmJiBtU2VsZWN0ZWRUcmFjayA8IChpbnQzMl90KSBnZXRUcmFja0NvdW50KCk7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6aXNUcmFja1ZhbGlkKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBpbmRleCA8IGdldFRyYWNrQ291bnQoKTsKK30KKworaW50MzJfdCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpnZXRUcmFja0luZGV4KHNpemVfdCBjaGFubmVsKSBjb25zdCB7CisgICAgaWYgKGNoYW5uZWwgPCBzaXplb2YobVRyYWNrSW5kaWNlcykvc2l6ZW9mKG1UcmFja0luZGljZXNbMF0pKSB7CisgICAgICAgIHJldHVybiBtVHJhY2tJbmRpY2VzW2NoYW5uZWxdOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKy8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAorYm9vbCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpleHRyYWN0RnJvbVNFSShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICBzcDxBQnVmZmVyPiBzZWk7CisgICAgaWYgKCFhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRCdWZmZXIoInNlaSIsICZzZWkpIHx8IHNlaSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHRyYWNrQWRkZWQgPSBmYWxzZTsKKworICAgIE5BTEJpdFJlYWRlciBicihzZWktPmRhdGEoKSArIDEsIHNlaS0+c2l6ZSgpIC0gMSk7CisgICAgLy8gc2VpX21lc3NhZ2UoKQorICAgIHdoaWxlIChici5hdExlYXN0TnVtQml0c0xlZnQoMTYpKSB7IC8vIGF0IGxlYXN0IDE2LWJpdCBmb3Igc2VpX21lc3NhZ2UoKQorICAgICAgICB1aW50MzJfdCBwYXlsb2FkX3R5cGUgPSAwOworICAgICAgICBzaXplX3QgcGF5bG9hZF9zaXplID0gMDsKKyAgICAgICAgdWludDhfdCBsYXN0X2J5dGU7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgbGFzdF9ieXRlID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIHBheWxvYWRfdHlwZSArPSBsYXN0X2J5dGU7CisgICAgICAgIH0gd2hpbGUgKGxhc3RfYnl0ZSA9PSAweEZGKTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBsYXN0X2J5dGUgPSBici5nZXRCaXRzKDgpOworICAgICAgICAgICAgcGF5bG9hZF9zaXplICs9IGxhc3RfYnl0ZTsKKyAgICAgICAgfSB3aGlsZSAobGFzdF9ieXRlID09IDB4RkYpOworCisgICAgICAgIC8vIHNlaV9wYXlsb2FkKCkKKyAgICAgICAgaWYgKHBheWxvYWRfdHlwZSA9PSA0KSB7CisgICAgICAgICAgICAvLyB1c2VyX2RhdGFfcmVnaXN0ZXJlZF9pdHVfdF90MzUoKQorCisgICAgICAgICAgICAvLyBBVFNDIEEvNzI6IDYuNC4yCisgICAgICAgICAgICB1aW50OF90IGl0dV90X3QzNV9jb3VudHJ5X2NvZGUgPSBici5nZXRCaXRzKDgpOworICAgICAgICAgICAgdWludDE2X3QgaXR1X3RfdDM1X3Byb3ZpZGVyX2NvZGUgPSBici5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfaWRlbnRpZmllciA9IGJyLmdldEJpdHMoMzIpOworICAgICAgICAgICAgdWludDhfdCB1c2VyX2RhdGFfdHlwZV9jb2RlID0gYnIuZ2V0Qml0cyg4KTsKKworICAgICAgICAgICAgcGF5bG9hZF9zaXplIC09IDEgKyAyICsgNCArIDE7CisKKyAgICAgICAgICAgIGlmIChpdHVfdF90MzVfY291bnRyeV9jb2RlID09IDB4QjUKKyAgICAgICAgICAgICAgICAgICAgJiYgaXR1X3RfdDM1X3Byb3ZpZGVyX2NvZGUgPT0gMHgwMDMxCisgICAgICAgICAgICAgICAgICAgICYmIHVzZXJfaWRlbnRpZmllciA9PSAnR0E5NCcKKyAgICAgICAgICAgICAgICAgICAgJiYgdXNlcl9kYXRhX3R5cGVfY29kZSA9PSAweDMpIHsKKyAgICAgICAgICAgICAgICAvLyBNUEVHX2NjX2RhdGEoKQorICAgICAgICAgICAgICAgIC8vIEFUU0MgQS81MyBQYXJ0IDQ6IDYuMi4zLjEKKyAgICAgICAgICAgICAgICBici5za2lwQml0cygxKTsgLy9wcm9jZXNzX2VtX2RhdGFfZmxhZworICAgICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc19jY19kYXRhX2ZsYWcgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDEpOyAvL2FkZGl0aW9uYWxfZGF0YV9mbGFnCisgICAgICAgICAgICAgICAgc2l6ZV90IGNjX2NvdW50ID0gYnIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICBici5za2lwQml0cyg4KTsgLy8gZW1fZGF0YTsKKyAgICAgICAgICAgICAgICBwYXlsb2FkX3NpemUgLT0gMjsKKworICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzX2NjX2RhdGFfZmxhZykgeworICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG91dDsKKworICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjY0J1ZiA9IG5ldyBBQnVmZmVyKGNjX2NvdW50ICogc2l6ZW9mKENDRGF0YSkpOworICAgICAgICAgICAgICAgICAgICBjY0J1Zi0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjY19jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1hcmtlciA9IGJyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtYXJrZXIsIDB4MWYpOworCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNjX3ZhbGlkID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2NfdHlwZSA9IGJyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgb2RkIHBhcml0eSBiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2NfZGF0YV8xID0gYnIuZ2V0Qml0cyg4KSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNjX2RhdGFfMiA9IGJyLmdldEJpdHMoOCkgJiAweDdmOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2NfdmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNjX3R5cGUgPT0gMCB8fCBjY190eXBlID09IDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NEYXRhIGNjKGNjX3R5cGUsIGNjX2RhdGFfMSwgY2NfZGF0YV8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTnVsbFBhZCgmY2MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaGFubmVsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MuZ2V0Q2hhbm5lbCgmY2hhbm5lbCkgJiYgZ2V0VHJhY2tJbmRleChjaGFubmVsKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja0luZGljZXNbY2hhbm5lbF0gPSBtRm91bmRDaGFubmVscy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm91bmRDaGFubmVscy5wdXNoX2JhY2soY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0FkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY2NCdWYtPmRhdGEoKSArIGNjQnVmLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmY2MsIHNpemVvZihjYykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY0J1Zi0+c2V0UmFuZ2UoMCwgY2NCdWYtPnNpemUoKSArIHNpemVvZihDQ0RhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplIC09IGNjX2NvdW50ICogMzsKKworICAgICAgICAgICAgICAgICAgICBtQ0NNYXAuYWRkKHRpbWVVcywgY2NCdWYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJNYWxmb3JtZWQgU0VJIHBheWxvYWQgdHlwZSA0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiVW5zdXBwb3J0ZWQgU0VJIHBheWxvYWQgdHlwZSAlZCIsIHBheWxvYWRfdHlwZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBza2lwcGluZyByZW1haW5pbmcgYml0cyBvZiB0aGlzIHBheWxvYWQKKyAgICAgICAgYnIuc2tpcEJpdHMocGF5bG9hZF9zaXplICogOCk7CisgICAgfQorCisgICAgcmV0dXJuIHRyYWNrQWRkZWQ7Cit9CisKK3NwPEFCdWZmZXI+IE51UGxheWVyOjpDQ0RlY29kZXI6OmZpbHRlckNDQnVmKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmY2NCdWYsIHNpemVfdCBpbmRleCkgeworICAgIHNwPEFCdWZmZXI+IGZpbHRlcmVkQ0NCdWYgPSBuZXcgQUJ1ZmZlcihjY0J1Zi0+c2l6ZSgpKTsKKyAgICBmaWx0ZXJlZENDQnVmLT5zZXRSYW5nZSgwLCAwKTsKKworICAgIHNpemVfdCBjY19jb3VudCA9IGNjQnVmLT5zaXplKCkgLyBzaXplb2YoQ0NEYXRhKTsKKyAgICBjb25zdCBDQ0RhdGEqIGNjX2RhdGEgPSAoY29uc3QgQ0NEYXRhKiljY0J1Zi0+ZGF0YSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2NfY291bnQ7ICsraSkgeworICAgICAgICBzaXplX3QgY2hhbm5lbDsKKyAgICAgICAgaWYgKGNjX2RhdGFbaV0uZ2V0Q2hhbm5lbCgmY2hhbm5lbCkpIHsKKyAgICAgICAgICAgIG1DdXJyZW50Q2hhbm5lbCA9IGNoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DdXJyZW50Q2hhbm5lbCA9PSBtRm91bmRDaGFubmVsc1tpbmRleF0pIHsKKyAgICAgICAgICAgIG1lbWNweShmaWx0ZXJlZENDQnVmLT5kYXRhKCkgKyBmaWx0ZXJlZENDQnVmLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmNjX2RhdGFbaV0sIHNpemVvZihDQ0RhdGEpKTsKKyAgICAgICAgICAgIGZpbHRlcmVkQ0NCdWYtPnNldFJhbmdlKDAsIGZpbHRlcmVkQ0NCdWYtPnNpemUoKSArIHNpemVvZihDQ0RhdGEpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmaWx0ZXJlZENDQnVmOworfQorCit2b2lkIE51UGxheWVyOjpDQ0RlY29kZXI6OmRlY29kZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgIGlmIChleHRyYWN0RnJvbVNFSShhY2Nlc3NVbml0KSkgeworICAgICAgICBBTE9HSSgiRm91bmQgQ0VBLTYwOCB0cmFjayIpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFRyYWNrQWRkZWQpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisgICAgLy8gVE9ETzogZXh0cmFjdCBDQyBmcm9tIG90aGVyIHNvdXJjZXMKK30KKwordm9pZCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpkaXNwbGF5KGludDY0X3QgdGltZVVzKSB7CisgICAgaWYgKCFpc1RyYWNrVmFsaWQobVNlbGVjdGVkVHJhY2spKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBjdXJyZW50IHRyYWNrKGluZGV4PSVkKSIsIG1TZWxlY3RlZFRyYWNrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNzaXplX3QgaW5kZXggPSBtQ0NNYXAuaW5kZXhPZktleSh0aW1lVXMpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1YoImNjIGZvciB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgbm90IGZvdW5kIiwgdGltZVVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGNjQnVmID0gZmlsdGVyQ0NCdWYobUNDTWFwLnZhbHVlQXQoaW5kZXgpLCBtU2VsZWN0ZWRUcmFjayk7CisKKyAgICBpZiAoY2NCdWYtPnNpemUoKSA+IDApIHsKKyNpZiAwCisgICAgICAgIGR1bXBCeXRlUGFpcihjY0J1Zik7CisjZW5kaWYKKworICAgICAgICBjY0J1Zi0+bWV0YSgpLT5zZXRJbnQzMigidHJhY2tJbmRleCIsIG1TZWxlY3RlZFRyYWNrKTsKKyAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDY0KCJkdXJhdGlvblVzIiwgMGxsKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENsb3NlZENhcHRpb25EYXRhKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImJ1ZmZlciIsIGNjQnVmKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorCisgICAgLy8gcmVtb3ZlIGFsbCBlbnRyaWVzIGJlZm9yZSB0aW1lVXMKKyAgICBtQ0NNYXAucmVtb3ZlSXRlbXNBdCgwLCBpbmRleCArIDEpOworfQorCit2b2lkIE51UGxheWVyOjpDQ0RlY29kZXI6OmZsdXNoKCkgeworICAgIG1DQ01hcC5jbGVhcigpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmgKaW5kZXggNzhlYTc0YS4uZGJhM2VlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaApAQCAtMjUsMjAgKzI1LDM2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOworc3RydWN0IE1lZGlhQ29kZWM7CitzdHJ1Y3QgTWVkaWFCdWZmZXI7CiAKIHN0cnVjdCBOdVBsYXllcjo6RGVjb2RlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgRGVjb2Rlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgICAgIGNvbnN0IHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZuYXRpdmVXaW5kb3cgPSBOVUxMKTsKIAotICAgIHZvaWQgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdCgpOwogCi0gICAgdm9pZCBzaWduYWxGbHVzaCgpOwotICAgIHZvaWQgc2lnbmFsUmVzdW1lKCk7Ci0gICAgdm9pZCBpbml0aWF0ZVNodXRkb3duKCk7CisgICAgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJzKFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpkc3RCdWZmZXJzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRmx1c2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsVXBkYXRlRm9ybWF0KGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVzdW1lKCk7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oKTsKIAotICAgIGJvb2wgc3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRvKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRvKSBjb25zdDsKKworICAgIGVudW0geworICAgICAgICBrV2hhdEZpbGxUaGlzQnVmZmVyICAgICAgPSAnZmxUQicsCisgICAgICAgIGtXaGF0RHJhaW5UaGlzQnVmZmVyICAgICA9ICdkclRCJywKKyAgICAgICAga1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkID0gJ2ZtdEMnLAorICAgICAgICBrV2hhdEZsdXNoQ29tcGxldGVkICAgICAgPSAnZmxzQycsCisgICAgICAgIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQgICA9ICdzaERDJywKKyAgICAgICAga1doYXRFT1MgICAgICAgICAgICAgICAgID0gJ2VvcyAnLAorICAgICAgICBrV2hhdEVycm9yICAgICAgICAgICAgICAgPSAnZXJyICcsCisgICAgfTsKIAogcHJvdGVjdGVkOgorCiAgICAgdmlydHVhbCB+RGVjb2RlcigpOwogCiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKQEAgLTQ2LDI3ICs2Miw5MCBAQAogcHJpdmF0ZToKICAgICBlbnVtIHsKICAgICAgICAga1doYXRDb2RlY05vdGlmeSAgICAgICAgPSAnY2RjTicsCisgICAgICAgIGtXaGF0Q29uZmlndXJlICAgICAgICAgID0gJ2NvbmYnLAorICAgICAgICBrV2hhdEdldElucHV0QnVmZmVycyAgICA9ICdnSW5CJywKKyAgICAgICAga1doYXRJbnB1dEJ1ZmZlckZpbGxlZCAgPSAnaW5wRicsCisgICAgICAgIGtXaGF0UmVuZGVyQnVmZmVyICAgICAgID0gJ3JuZHInLAorICAgICAgICBrV2hhdEZsdXNoICAgICAgICAgICAgICA9ICdmbHVzJywKKyAgICAgICAga1doYXRTaHV0ZG93biAgICAgICAgICAgPSAnc2h1RCcsCisgICAgICAgIGtXaGF0VXBkYXRlRm9ybWF0ICAgICAgID0gJ3VGbXQnLAogICAgIH07CiAKICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKICAgICBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OwogCi0gICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXQ7Ci0gICAgc3A8QUNvZGVjPiBtQ29kZWM7CisgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKKyAgICBzcDxNZWRpYUNvZGVjPiBtQ29kZWM7CiAgICAgc3A8QUxvb3Blcj4gbUNvZGVjTG9vcGVyOworICAgIHNwPEFMb29wZXI+IG1EZWNvZGVyTG9vcGVyOwogCi0gICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUNTRDsKLSAgICBzaXplX3QgbUNTREluZGV4OworICAgIExpc3Q8c3A8QU1lc3NhZ2U+ID4gbVBlbmRpbmdJbnB1dE1lc3NhZ2VzOwogCi0gICAgc3A8QU1lc3NhZ2U+IG1ha2VGb3JtYXQoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKTsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtSW5wdXRCdWZmZXJzOworICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1PdXRwdXRCdWZmZXJzOworICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1DU0RzRm9yQ3VycmVudEZvcm1hdDsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQ1NEc1RvU3VibWl0OworICAgIFZlY3Rvcjxib29sPiBtSW5wdXRCdWZmZXJJc0RlcXVldWVkOworICAgIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiBtTWVkaWFCdWZmZXJzOwogCi0gICAgdm9pZCBvbkZpbGxUaGlzQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIGhhbmRsZUVycm9yKGludDMyX3QgZXJyKTsKKyAgICBib29sIGhhbmRsZUFuSW5wdXRCdWZmZXIoKTsKKyAgICBib29sIGhhbmRsZUFuT3V0cHV0QnVmZmVyKCk7CisKKyAgICB2b2lkIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOworICAgIHZvaWQgcmVxdWVzdENvZGVjTm90aWZpY2F0aW9uKCk7CisgICAgYm9vbCBpc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdm9pZCBvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdm9pZCBvbkZsdXNoKCk7CisgICAgdm9pZCBvblJlc3VtZSgpOworICAgIGJvb2wgb25JbnB1dEJ1ZmZlckZpbGxlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvblJlbmRlckJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvblNodXRkb3duKCk7CisKKyAgICBpbnQzMl90IG1CdWZmZXJHZW5lcmF0aW9uOworICAgIGJvb2wgbVBhdXNlZDsKKyAgICBBU3RyaW5nIG1Db21wb25lbnROYW1lOwogCiAgICAgYm9vbCBzdXBwb3J0c1NlYW1sZXNzQXVkaW9Gb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0YXJnZXRGb3JtYXQpIGNvbnN0OworICAgIHZvaWQgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZWNvZGVyKTsKIH07CiAKK3N0cnVjdCBOdVBsYXllcjo6Q0NEZWNvZGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIGVudW0geworICAgICAgICBrV2hhdENsb3NlZENhcHRpb25EYXRhLAorICAgICAgICBrV2hhdFRyYWNrQWRkZWQsCisgICAgfTsKKworICAgIENDRGVjb2Rlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKKyAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdDsKKyAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKKyAgICBib29sIGlzU2VsZWN0ZWQoKSBjb25zdDsKKyAgICB2b2lkIGRlY29kZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CisgICAgdm9pZCBkaXNwbGF5KGludDY0X3QgdGltZVVzKTsKKyAgICB2b2lkIGZsdXNoKCk7CisKK3ByaXZhdGU6CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgS2V5ZWRWZWN0b3I8aW50NjRfdCwgc3A8QUJ1ZmZlcj4gPiBtQ0NNYXA7CisgICAgc2l6ZV90IG1DdXJyZW50Q2hhbm5lbDsKKyAgICBpbnQzMl90IG1TZWxlY3RlZFRyYWNrOworICAgIGludDMyX3QgbVRyYWNrSW5kaWNlc1s0XTsKKyAgICBWZWN0b3I8c2l6ZV90PiBtRm91bmRDaGFubmVsczsKKworICAgIGJvb2wgaXNUcmFja1ZhbGlkKHNpemVfdCBpbmRleCkgY29uc3Q7CisgICAgaW50MzJfdCBnZXRUcmFja0luZGV4KHNpemVfdCBjaGFubmVsKSBjb25zdDsKKyAgICBib29sIGV4dHJhY3RGcm9tU0VJKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKKyAgICBzcDxBQnVmZmVyPiBmaWx0ZXJDQ0J1Zihjb25zdCBzcDxBQnVmZmVyPiAmY2NCdWYsIHNpemVfdCBpbmRleCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDQ0RlY29kZXIpOworfTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBOVVBMQVlFUl9ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2FhY2RkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcApAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2giCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgIk51UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhDYWNoZWRCeXRlcyA9IDIwMDAwMDsKKy8vIFRoZSBidWZmZXJzIHdpbGwgY29udGFpbiBhIGJpdCBsZXNzIHRoYW4ga0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlcy4KKy8vIFNvIHdlIGNhbiBzdGFydCBvZmYgd2l0aCBqdXN0IGVub3VnaCBidWZmZXJzIHRvIGtlZXAgdGhlIGNhY2hlIGZ1bGwuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhQZW5kaW5nQnVmZmVycyA9IDEgKyAoa01heENhY2hlZEJ5dGVzIC8gTnVQbGF5ZXI6OmtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXMpOworCitOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpEZWNvZGVyUGFzc1Rocm91Z2goCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQorICAgIDogRGVjb2Rlcihub3RpZnkpLAorICAgICAgbU5vdGlmeShub3RpZnkpLAorICAgICAgbUJ1ZmZlckdlbmVyYXRpb24oMCksCisgICAgICBtUmVhY2hlZEVPUyh0cnVlKSwKKyAgICAgIG1QZW5kaW5nQnVmZmVyc1RvRmlsbCgwKSwKKyAgICAgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4oMCksCisgICAgICBtQ2FjaGVkQnl0ZXMoMCksCisgICAgICBtQ29tcG9uZW50TmFtZSgicGFzcyB0aHJvdWdoIGRlY29kZXIiKSB7CisgICAgbURlY29kZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtRGVjb2Rlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2giKTsKKyAgICBtRGVjb2Rlckxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKK30KKworTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6fkRlY29kZXJQYXNzVGhyb3VnaCgpIHsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCBpZCgpKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6aW5pdCgpIHsKKyAgICBtRGVjb2Rlckxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OnNpZ25hbEZsdXNoKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6c2lnbmFsUmVzdW1lKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmluaXRpYXRlU2h1dGRvd24oKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCBpZCgpKSktPnBvc3QoKTsKK30KKworYm9vbCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpzdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJiAvKiB0YXJnZXRGb3JtYXQgKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIEFMT0dWKCJbJXNdIG9uQ29uZmlndXJlIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgbUNhY2hlZEJ5dGVzID0gMDsKKyAgICBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwgPSAwOworICAgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4gPSAwOworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgIHJlcXVlc3RNYXhCdWZmZXJzKCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCk7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmlzU3RhbGVSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgcmV0dXJuIGdlbmVyYXRpb24gIT0gbUJ1ZmZlckdlbmVyYXRpb247Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6cmVxdWVzdEFCdWZmZXIoKSB7CisgICAgaWYgKG1DYWNoZWRCeXRlcyA+PSBrTWF4Q2FjaGVkQnl0ZXMpIHsKKyAgICAgICAgQUxPR1YoIlslc10gbUNhY2hlZEJ5dGVzID0gJXp1IiwKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBtQ2FjaGVkQnl0ZXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtUmVhY2hlZEVPUykgeworICAgICAgICBBTE9HVigiWyVzXSByZWFjaGVkIEVPUyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQsIGlkKCkpOworICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGaWxsVGhpc0J1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKyAgICBub3RpZnktPnBvc3QoKTsKKyAgICBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwrKzsKKyAgICBBTE9HVigicmVxdWVzdEFCdWZmZXI6ICNUb0ZpbGwgPSAlenUsICNUb0RyYWluID0gJXp1IiwgbVBlbmRpbmdCdWZmZXJzVG9GaWxsLAorICAgICAgICAgICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBhbmRyb2lkOjpOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbklucHV0QnVmZmVyRmlsbGVkKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIC0tbVBlbmRpbmdCdWZmZXJzVG9GaWxsOworICAgIGlmIChtUmVhY2hlZEVPUykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcik7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVPUyk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DYWNoZWRCeXRlcyArPSBidWZmZXItPnNpemUoKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdEJ1ZmZlckNvbnN1bWVkLCBpZCgpKTsKKyAgICByZXBseS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQnVmZmVyR2VuZXJhdGlvbik7CisgICAgcmVwbHktPnNldEludDMyKCJzaXplIiwgYnVmZmVyLT5zaXplKCkpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdERyYWluVGhpc0J1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKyAgICBub3RpZnktPnBvc3QoKTsKKyAgICArK21QZW5kaW5nQnVmZmVyc1RvRHJhaW47CisgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJGaWxsZWQ6ICNUb0ZpbGwgPSAlenUsICNUb0RyYWluID0gJXp1LCBjYWNoZWRCeXRlcyA9ICV6dSIsCisgICAgICAgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwsIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4sIG1DYWNoZWRCeXRlcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25CdWZmZXJDb25zdW1lZChpbnQzMl90IHNpemUpIHsKKyAgICAtLW1QZW5kaW5nQnVmZmVyc1RvRHJhaW47CisgICAgbUNhY2hlZEJ5dGVzIC09IHNpemU7CisgICAgQUxPR1YoIm9uQnVmZmVyQ29uc3VtZWQ6ICNUb0ZpbGwgPSAlenUsICNUb0RyYWluID0gJXp1LCBjYWNoZWRCeXRlcyA9ICV6dSIsCisgICAgICAgICAgIG1QZW5kaW5nQnVmZmVyc1RvRmlsbCwgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiwgbUNhY2hlZEJ5dGVzKTsKKyAgICByZXF1ZXN0QUJ1ZmZlcigpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uRmx1c2goKSB7CisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbVBlbmRpbmdCdWZmZXJzVG9GaWxsID0gMDsKKyAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluID0gMDsKKyAgICBtQ2FjaGVkQnl0ZXMgPSAwOworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6cmVxdWVzdE1heEJ1ZmZlcnMoKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4UGVuZGluZ0J1ZmZlcnM7IGkrKykgeworICAgICAgICBpZiAoIXJlcXVlc3RBQnVmZmVyKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uU2h1dGRvd24oKSB7CisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQUxPR1YoIlslc10gb25NZXNzYWdlOiAlcyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRDb25maWd1cmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisgICAgICAgICAgICBvbkNvbmZpZ3VyZShmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVxdWVzdEFCdWZmZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0QUJ1ZmZlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRJbnB1dEJ1ZmZlckZpbGxlZDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIG9uSW5wdXRCdWZmZXJGaWxsZWQobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEJ1ZmZlckNvbnN1bWVkOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBzaXplOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzaXplIiwgJnNpemUpKTsKKyAgICAgICAgICAgICAgICBvbkJ1ZmZlckNvbnN1bWVkKHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Rmx1c2g6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uRmx1c2goKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKKyAgICAgICAgeworICAgICAgICAgICAgcmVxdWVzdE1heEJ1ZmZlcnMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgorICAgICAgICB7CisgICAgICAgICAgICBvblNodXRkb3duKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjIwMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTlVQTEFZRVJfREVDT0RFUl9QQVNTX1RIUk9VR0hfSF8KKworI2RlZmluZSBOVVBMQVlFUl9ERUNPREVSX1BBU1NfVEhST1VHSF9IXworCisjaW5jbHVkZSAiTnVQbGF5ZXIuaCIKKworI2luY2x1ZGUgIk51UGxheWVyRGVjb2Rlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoIDogcHVibGljIERlY29kZXIgeworICAgIERlY29kZXJQYXNzVGhyb3VnaChjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdCgpOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlc3VtZSgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKCk7CisKKyAgICBib29sIHN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0bykgY29uc3Q7CisKK3Byb3RlY3RlZDoKKworICAgIHZpcnR1YWwgfkRlY29kZXJQYXNzVGhyb3VnaCgpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRSZXF1ZXN0QUJ1ZmZlciAgICAgPSAncmVxQicsCisgICAgICAgIGtXaGF0Q29uZmlndXJlICAgICAgICAgID0gJ2NvbmYnLAorICAgICAgICBrV2hhdElucHV0QnVmZmVyRmlsbGVkICA9ICdpbnBGJywKKyAgICAgICAga1doYXRCdWZmZXJDb25zdW1lZCAgICAgPSAnYnVmQycsCisgICAgICAgIGtXaGF0Rmx1c2ggICAgICAgICAgICAgID0gJ2ZsdXMnLAorICAgICAgICBrV2hhdFNodXRkb3duICAgICAgICAgICA9ICdzaHVEJywKKyAgICB9OworCisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgc3A8QUxvb3Blcj4gbURlY29kZXJMb29wZXI7CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGEgYnVmZmVyIHdhcyByZXF1ZXN0ZWQuCisgICAgICogUmV0dXJucyBmYWxzZSBpZiBhdCBFT1Mgb3IgY2FjaGUgYWxyZWFkeSBmdWxsLgorICAgICAqLworICAgIGJvb2wgcmVxdWVzdEFCdWZmZXIoKTsKKyAgICBib29sIGlzU3RhbGVSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2b2lkIG9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2b2lkIG9uRmx1c2goKTsKKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJGaWxsZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25CdWZmZXJDb25zdW1lZChpbnQzMl90IHNpemUpOworICAgIHZvaWQgcmVxdWVzdE1heEJ1ZmZlcnMoKTsKKyAgICB2b2lkIG9uU2h1dGRvd24oKTsKKworICAgIGludDMyX3QgbUJ1ZmZlckdlbmVyYXRpb247CisgICAgYm9vbCAgICBtUmVhY2hlZEVPUzsKKyAgICAvLyBUT0RPIG1QZW5kaW5nQnVmZmVyc1RvRmlsbCBhbmQgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiBhcmUgb25seSBmb3IKKyAgICAvLyBkZWJ1Z2dpbmcuIFRoZXkgY2FuIGJlIHJlbW92ZWQgd2hlbiB0aGUgcG93ZXIgaW52ZXN0aWdhdGlvbiBpcyBkb25lLgorICAgIHNpemVfdCAgbVBlbmRpbmdCdWZmZXJzVG9GaWxsOworICAgIHNpemVfdCAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbjsKKyAgICBzaXplX3QgIG1DYWNoZWRCeXRlczsKKyAgICBBU3RyaW5nIG1Db21wb25lbnROYW1lOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVjb2RlclBhc3NUaHJvdWdoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTlVQTEFZRVJfREVDT0RFUl9QQVNTX1RIUk9VR0hfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCmluZGV4IDQ3ODM0ZmQuLmFiNDYwNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcApAQCAtMTYsNiArMTYsNyBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk51UGxheWVyRHJpdmVyIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJOdVBsYXllckRyaXZlci5oIgpAQCAtMjUsNyArMjYsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zNiwxMiArMzksMTQgQEAKICAgICAgIG1TZXRTdXJmYWNlSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtRHVyYXRpb25VcygtMSksCiAgICAgICBtUG9zaXRpb25VcygtMSksCi0gICAgICBtTnVtRnJhbWVzVG90YWwoMCksCi0gICAgICBtTnVtRnJhbWVzRHJvcHBlZCgwKSwKKyAgICAgIG1TZWVrSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1QbGF5ZXJGbGFncygwKSwKICAgICAgIG1BdEVPUyhmYWxzZSksCisgICAgICBtTG9vcGluZyhmYWxzZSksCisgICAgICBtQXV0b0xvb3AoZmFsc2UpLAogICAgICAgbVN0YXJ0dXBTZWVrVGltZVVzKC0xKSB7CisgICAgQUxPR1YoIk51UGxheWVyRHJpdmVyKCVwKSIsIHRoaXMpOwogICAgIG1Mb29wZXItPnNldE5hbWUoIk51UGxheWVyRHJpdmVyIExvb3BlciIpOwogCiAgICAgbUxvb3Blci0+c3RhcnQoCkBAIC01Niw2ICs2MSw3IEBACiB9CiAKIE51UGxheWVyRHJpdmVyOjp+TnVQbGF5ZXJEcml2ZXIoKSB7CisgICAgQUxPR1YoIn5OdVBsYXllckRyaXZlciglcCkiLCB0aGlzKTsKICAgICBtTG9vcGVyLT5zdG9wKCk7CiB9CiAKQEAgLTcwLDcgKzc2LDEwIEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcCkgdXJsKCVzKSIsIHRoaXMsIHVyaURlYnVnU3RyaW5nKHVybCwgZmFsc2UpLmNfc3RyKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0lETEUpIHsKQEAgLTc5LDcgKzg4LDcgQEAKIAogICAgIG1TdGF0ZSA9IFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc7CiAKLSAgICBtUGxheWVyLT5zZXREYXRhU291cmNlQXN5bmModXJsLCBoZWFkZXJzKTsKKyAgICBtUGxheWVyLT5zZXREYXRhU291cmNlQXN5bmMoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CiAKICAgICB3aGlsZSAobVN0YXRlID09IFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkcpIHsKICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKQEAgLTg5LDYgKzk4LDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcCkgZmlsZSglZCkiLCB0aGlzLCBmZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfSURMRSkgewpAQCAtMTA3LDYgKzExNyw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcCkgc3RyZWFtIHNvdXJjZSIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0lETEUpIHsKQEAgLTEyNiw2ICsxMzcsNyBAQAogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJ1ZmZlclByb2R1Y2VyKSB7CisgICAgQUxPR1YoInNldFZpZGVvU3VyZmFjZVRleHR1cmUoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtU2V0U3VyZmFjZUluUHJvZ3Jlc3MpIHsKQEAgLTE1Myw2ICsxNjUsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6cHJlcGFyZSgpIHsKKyAgICBBTE9HVigicHJlcGFyZSglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIHJldHVybiBwcmVwYXJlX2woKTsKIH0KQEAgLTE3MSwxMiArMTg0LDIzIEBACiAgICAgICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiAobVN0YXRlID09IFNUQVRFX1BSRVBBUkVEKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOgorICAgICAgICAgICAgLy8gdGhpcyBpcyByZWFsbHkganVzdCBwYXVzZWQuIGhhbmRsZSBhcyBzZWVrIHRvIHN0YXJ0CisgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzsKKyAgICAgICAgICAgIG1Jc0FzeW5jUHJlcGFyZSA9IGZhbHNlOworICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCwgdHJ1ZSAvKiBuZWVkTm90aWZ5ICovKTsKKyAgICAgICAgICAgIHdoaWxlIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HKSB7CisgICAgICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAobVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9OwogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6cHJlcGFyZUFzeW5jKCkgeworICAgIEFMT0dWKCJwcmVwYXJlQXN5bmMoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CkBAIC0xODUsMTIgKzIwOSwyMCBAQAogICAgICAgICAgICAgbUlzQXN5bmNQcmVwYXJlID0gdHJ1ZTsKICAgICAgICAgICAgIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwogICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CisgICAgICAgICAgICAvLyB0aGlzIGlzIHJlYWxseSBqdXN0IHBhdXNlZC4gaGFuZGxlIGFzIHNlZWsgdG8gc3RhcnQKKyAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOworICAgICAgICAgICAgbUlzQXN5bmNQcmVwYXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDAsIHRydWUgLyogbmVlZE5vdGlmeSAqLyk7CisgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnN0YXJ0KCkgeworICAgIEFMT0dEKCJzdGFydCglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgc3dpdGNoIChtU3RhdGUpIHsKQEAgLTIxMyw5ICsyNDUsNyBAQAogICAgICAgICAgICAgbVBsYXllci0+c3RhcnQoKTsKIAogICAgICAgICAgICAgaWYgKG1TdGFydHVwU2Vla1RpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGFydHVwU2Vla1RpbWVVcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeVNlZWtDb21wbGV0ZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydHVwU2Vla1RpbWVVcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMobVN0YXJ0dXBTZWVrVGltZVVzKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTIyNSwxMSArMjU1LDI2IEBACiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtQXRFT1MpIHsKKyAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtUG9zaXRpb25VcyA9IC0xOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKICAgICAgICAgewotICAgICAgICAgICAgbVBsYXllci0+cmVzdW1lKCk7CisgICAgICAgICAgICBpZiAobUF0RU9TKSB7CisgICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCk7CisgICAgICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVBsYXllci0+cmVzdW1lKCk7CisgICAgICAgICAgICAgICAgbVBvc2l0aW9uVXMgPSAtMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVBsYXllci0+cmVzdW1lKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yNDMsNyArMjg4LDMxIEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzdG9wKCkgewotICAgIHJldHVybiBwYXVzZSgpOworICAgIEFMT0dEKCJzdG9wKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CisgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisKKyAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TVE9QUEVEKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpwYXVzZSgpIHsKQEAgLTI1NSw3ICszMjQsOCBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogCiAgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1BBVVNFRCk7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BBVVNFRCk7CiAgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOwogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTI2Myw4ICszMzMsNiBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLQogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjczLDYgKzM0MSw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZWVrVG8oaW50IG1zZWMpIHsKKyAgICBBTE9HRCgic2Vla1RvKCVwKSAlZCBtcyIsIHRoaXMsIG1zZWMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSBtc2VjICogMTAwMGxsOwpAQCAtMjgxLDYgKzM1MCwxMCBAQAogICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgogICAgICAgICB7CiAgICAgICAgICAgICBtU3RhcnR1cFNlZWtUaW1lVXMgPSBzZWVrVGltZVVzOworICAgICAgICAgICAgLy8gcHJldGVuZCB0aGF0IHRoZSBzZWVrIGNvbXBsZXRlZC4gSXQgd2lsbCBhY3R1YWxseSBoYXBwZW4gd2hlbiBzdGFydGluZyBwbGF5YmFjay4KKyAgICAgICAgICAgIC8vIFRPRE86IGFjdHVhbGx5IHBlcmZvcm0gdGhlIHNlZWsgaGVyZSwgc28gdGhlIHBsYXllciBpcyByZWFkeSB0byBnbyBhdCB0aGUgbmV3CisgICAgICAgICAgICAvLyBsb2NhdGlvbgorICAgICAgICAgICAgbm90aWZ5U2Vla0NvbXBsZXRlX2woKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI4OCw5ICszNjEsMTAgQEAKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgbVNlZWtJblByb2dyZXNzID0gdHJ1ZTsKICAgICAgICAgICAgIC8vIHNlZWtzIGNhbiB0YWtlIGEgd2hpbGUsIHNvIHdlIGVzc2VudGlhbGx5IHBhdXNlZAotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfUEFVU0VEKTsKLSAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKHNlZWtUaW1lVXMpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QQVVTRUQpOworICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoc2Vla1RpbWVVcywgdHJ1ZSAvKiBuZWVkTm90aWZ5ICovKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI5OCwxOCArMzcyLDI0IEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgbVBvc2l0aW9uVXMgPSBzZWVrVGltZVVzOwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQgKm1zZWMpIHsKKyAgICBpbnQ2NF90IHRlbXBVcyA9IDA7CisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZ0ZW1wVXMpOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtUG9zaXRpb25VcyA8IDApIHsKLSAgICAgICAgKm1zZWMgPSAwOworICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgbVNlZWtJblByb2dyZXNzIGhlcmUgYmVjYXVzZSBtUGxheWVyLT5zZWVrVG9Bc3luYyBpcyBhbiBhc3luYyBjYWxsLCB3aGljaAorICAgIC8vIG1lYW5zIGdldEN1cnJlbnRQb3NpdGlvbiBjYW4gYmUgY2FsbGVkIGJlZm9yZSBzZWVrIGlzIGNvbXBsZXRlZC4gSW93LCByZW5kZXJlciBtYXkgcmV0dXJuIGEKKyAgICAvLyBwb3NpdGlvbiB2YWx1ZSB0aGF0J3MgZGlmZmVyZW50IHRoZSBzZWVrIHRvIHBvc2l0aW9uLgorICAgIGlmIChyZXQgIT0gT0sgfHwgbVNlZWtJblByb2dyZXNzKSB7CisgICAgICAgIHRlbXBVcyA9IChtUG9zaXRpb25VcyA8PSAwKSA/IDAgOiBtUG9zaXRpb25VczsKICAgICB9IGVsc2UgewotICAgICAgICAqbXNlYyA9IChtUG9zaXRpb25VcyArIDUwMGxsKSAvIDEwMDA7CisgICAgICAgIG1Qb3NpdGlvblVzID0gdGVtcFVzOwogICAgIH0KLQorICAgICptc2VjID0gKGludClkaXZSb3VuZCh0ZW1wVXMsIChpbnQ2NF90KSgxMDAwKSk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0zMjYsNiArNDA2LDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnJlc2V0KCkgeworICAgIEFMT0dEKCJyZXNldCglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgc3dpdGNoIChtU3RhdGUpIHsKQEAgLTM0MCw3ICs0MjEsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDSyhtSXNBc3luY1ByZXBhcmUpOwogCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9QUkVQQVJFRCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BSRVBBUkVEKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTM0OCw3ICs0MjksOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfU1RPUFBFRCk7CisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9TVE9QUEVEKSB7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU1RPUFBFRCk7CisgICAgfQogCiAgICAgbVN0YXRlID0gU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M7CiAgICAgbVBsYXllci0+cmVzZXRBc3luYygpOwpAQCAtMzYwLDEyICs0NDMsMTQgQEAKICAgICBtRHVyYXRpb25VcyA9IC0xOwogICAgIG1Qb3NpdGlvblVzID0gLTE7CiAgICAgbVN0YXJ0dXBTZWVrVGltZVVzID0gLTE7CisgICAgbUxvb3BpbmcgPSBmYWxzZTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldExvb3BpbmcoaW50IGxvb3ApIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgbUxvb3BpbmcgPSBsb29wICE9IDA7CisgICAgcmV0dXJuIE9LOwogfQogCiBwbGF5ZXJfdHlwZSBOdVBsYXllckRyaXZlcjo6cGxheWVyVHlwZSgpIHsKQEAgLTQwOSw2ICs0OTQsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBmYWxzZSAvKiBzZWxlY3QgKi8pOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBJTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHR5cGUgPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFNlbGVjdGVkVHJhY2sodHlwZSwgcmVwbHkpOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNDE4LDE4ICs1MDksMjAgQEAKIAogdm9pZCBOdVBsYXllckRyaXZlcjo6c2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luaykgewogICAgIG1QbGF5ZXItPnNldEF1ZGlvU2luayhhdWRpb1NpbmspOworICAgIG1BdWRpb1NpbmsgPSBhdWRpb1Npbms7CiB9CiAKLXN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7CitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0UGFyYW1ldGVyKAorICAgICAgICBpbnQgLyoga2V5ICovLCBjb25zdCBQYXJjZWwgJiAvKiByZXF1ZXN0ICovKSB7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1zdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKK3N0YXR1c190IE51UGxheWVyRHJpdmVyOjpnZXRQYXJhbWV0ZXIoaW50IC8qIGtleSAqLywgUGFyY2VsICogLyogcmVwbHkgKi8pIHsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpnZXRNZXRhZGF0YSgKLSAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKSB7CisgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiAvKiBpZHMgKi8sIFBhcmNlbCAqcmVjb3JkcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICB1c2luZyBtZWRpYTo6TWV0YWRhdGE7CkBAIC00NTYsNiArNTQ5LDcgQEAKIH0KIAogdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5UmVzZXRDb21wbGV0ZSgpIHsKKyAgICBBTE9HRCgibm90aWZ5UmVzZXRDb21wbGV0ZSglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgQ0hFQ0tfRVEobVN0YXRlLCBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUyk7CkBAIC00NjQsNiArNTU4LDcgQEAKIH0KIAogdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKCkgeworICAgIEFMT0dWKCJub3RpZnlTZXRTdXJmYWNlQ29tcGxldGUoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLKG1TZXRTdXJmYWNlSW5Qcm9ncmVzcyk7CkBAIC00NzcsMzQgKzU3Miw0NSBAQAogICAgIG1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKIH0KIAotdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5UG9zaXRpb24oaW50NjRfdCBwb3NpdGlvblVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtUG9zaXRpb25VcyA9IHBvc2l0aW9uVXM7Ci19Ci0KIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeVNlZWtDb21wbGV0ZSgpIHsKLSAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TRUVLX0NPTVBMRVRFKTsKKyAgICBBTE9HVigibm90aWZ5U2Vla0NvbXBsZXRlKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVNlZWtJblByb2dyZXNzID0gZmFsc2U7CisgICAgbm90aWZ5U2Vla0NvbXBsZXRlX2woKTsKIH0KIAotdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5RnJhbWVTdGF0cygKLSAgICAgICAgaW50NjRfdCBudW1GcmFtZXNUb3RhbCwgaW50NjRfdCBudW1GcmFtZXNEcm9wcGVkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtTnVtRnJhbWVzVG90YWwgPSBudW1GcmFtZXNUb3RhbDsKLSAgICBtTnVtRnJhbWVzRHJvcHBlZCA9IG51bUZyYW1lc0Ryb3BwZWQ7Cit2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlTZWVrQ29tcGxldGVfbCgpIHsKKyAgICBib29sIHdhc1NlZWtpbmcgPSB0cnVlOworICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HKSB7CisgICAgICAgIHdhc1NlZWtpbmcgPSBmYWxzZTsKKyAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ7CisgICAgICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7CisgICAgICAgIGlmICghbUlzQXN5bmNQcmVwYXJlKSB7CisgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgcHJlcGFyaW5nIHN5bmNocm9ub3VzbHksIG5vIG5lZWQgdG8gbm90aWZ5IGxpc3RlbmVyCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEKSB7CisgICAgICAgIC8vIG5vIG5lZWQgdG8gbm90aWZ5IGxpc3RlbmVyCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbm90aWZ5TGlzdGVuZXJfbCh3YXNTZWVraW5nID8gTUVESUFfU0VFS19DT01QTEVURSA6IE1FRElBX1BSRVBBUkVEKTsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKK3N0YXR1c190IE51UGxheWVyRHJpdmVyOjpkdW1wKAorICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJiAvKiBhcmdzICovKSBjb25zdCB7CisgICAgaW50NjRfdCBudW1GcmFtZXNUb3RhbDsKKyAgICBpbnQ2NF90IG51bUZyYW1lc0Ryb3BwZWQ7CisgICAgbVBsYXllci0+Z2V0U3RhdHMoJm51bUZyYW1lc1RvdGFsLCAmbnVtRnJhbWVzRHJvcHBlZCk7CiAKICAgICBGSUxFICpvdXQgPSBmZG9wZW4oZHVwKGZkKSwgInciKTsKIAogICAgIGZwcmludGYob3V0LCAiIE51UGxheWVyXG4iKTsKLSAgICBmcHJpbnRmKG91dCwgIiAgbnVtRnJhbWVzVG90YWwoJWxsZCksIG51bUZyYW1lc0Ryb3BwZWQoJWxsZCksICIKKyAgICBmcHJpbnRmKG91dCwgIiAgbnVtRnJhbWVzVG90YWwoJSIgUFJJZDY0ICIpLCBudW1GcmFtZXNEcm9wcGVkKCUiIFBSSWQ2NCAiKSwgIgogICAgICAgICAgICAgICAgICAicGVyY2VudGFnZURyb3BwZWQoJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNUb3RhbCwKLSAgICAgICAgICAgICAgICAgbU51bUZyYW1lc0Ryb3BwZWQsCi0gICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNUb3RhbCA9PSAwCi0gICAgICAgICAgICAgICAgICAgID8gMC4wIDogKGRvdWJsZSltTnVtRnJhbWVzRHJvcHBlZCAvIG1OdW1GcmFtZXNUb3RhbCk7CisgICAgICAgICAgICAgICAgIG51bUZyYW1lc1RvdGFsLAorICAgICAgICAgICAgICAgICBudW1GcmFtZXNEcm9wcGVkLAorICAgICAgICAgICAgICAgICBudW1GcmFtZXNUb3RhbCA9PSAwCisgICAgICAgICAgICAgICAgICAgID8gMC4wIDogKGRvdWJsZSludW1GcmFtZXNEcm9wcGVkIC8gbnVtRnJhbWVzVG90YWwpOwogCiAgICAgZmNsb3NlKG91dCk7CiAgICAgb3V0ID0gTlVMTDsKQEAgLTUxNCwxMSArNjIwLDQxIEBACiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyKAogICAgICAgICBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKLSAgICBpZiAobXNnID09IE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFIHx8IG1zZyA9PSBNRURJQV9FUlJPUikgewotICAgICAgICBtQXRFT1MgPSB0cnVlOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbm90aWZ5TGlzdGVuZXJfbChtc2csIGV4dDEsIGV4dDIsIGluKTsKK30KKwordm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5TGlzdGVuZXJfbCgKKyAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7CisgICAgc3dpdGNoIChtc2cpIHsKKyAgICAgICAgY2FzZSBNRURJQV9QTEFZQkFDS19DT01QTEVURToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUykgeworICAgICAgICAgICAgICAgIGlmIChtTG9vcGluZyB8fCAobUF1dG9Mb29wCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvU2luayA9PSBOVUxMIHx8IG1BdWRpb1NpbmstPnJlYWx0aW1lKCkpKSkgeworICAgICAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKKyAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTUVESUFfRVJST1I6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1BdEVPUyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAKKyAgICBtTG9jay51bmxvY2soKTsKICAgICBzZW5kRXZlbnQobXNnLCBleHQxLCBleHQyLCBpbik7CisgICAgbUxvY2subG9jaygpOwogfQogCiB2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKHN0YXR1c190IGVycikgewpAQCAtNTQ3LDE1ICs2ODMsMjQgQEAKICAgICBtQXN5bmNSZXN1bHQgPSBlcnI7CiAKICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIGlmIChtSXNBc3luY1ByZXBhcmUpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1BSRVBBUkVEKTsKLSAgICAgICAgfQorICAgICAgICAvLyB1cGRhdGUgc3RhdGUgYmVmb3JlIG5vdGlmeWluZyBjbGllbnQsIHNvIHRoYXQgaWYgY2xpZW50IGNhbGxzIGJhY2sgaW50byBOdVBsYXllckRyaXZlcgorICAgICAgICAvLyBpbiByZXNwb25zZSwgTnVQbGF5ZXJEcml2ZXIgaGFzIHRoZSByaWdodCBzdGF0ZQogICAgICAgICBtU3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKLSAgICB9IGVsc2UgewogICAgICAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUFJFUEFSRUQpOwogICAgICAgICB9CisgICAgfSBlbHNlIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfVU5QUkVQQVJFRDsKKyAgICAgICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVBsYXllci0+Z2V0RmlsZU1ldGEoKTsKKyAgICBpbnQzMl90IGxvb3A7CisgICAgaWYgKG1ldGEgIT0gTlVMTAorICAgICAgICAgICAgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlBdXRvTG9vcCwgJmxvb3ApICYmIGxvb3AgIT0gMCkgeworICAgICAgICBtQXV0b0xvb3AgPSB0cnVlOwogICAgIH0KIAogICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCmluZGV4IDk5ZjcyYTYuLjVjYmE3ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCkBAIC0zMSw3ICszMSw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVSUQodWlkX3QgdWlkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAKQEAgLTY2LDkgKzY4LDggQEAKICAgICB2b2lkIG5vdGlmeVJlc2V0Q29tcGxldGUoKTsKICAgICB2b2lkIG5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZSgpOwogICAgIHZvaWQgbm90aWZ5RHVyYXRpb24oaW50NjRfdCBkdXJhdGlvblVzKTsKLSAgICB2b2lkIG5vdGlmeVBvc2l0aW9uKGludDY0X3QgcG9zaXRpb25Vcyk7CiAgICAgdm9pZCBub3RpZnlTZWVrQ29tcGxldGUoKTsKLSAgICB2b2lkIG5vdGlmeUZyYW1lU3RhdHMoaW50NjRfdCBudW1GcmFtZXNUb3RhbCwgaW50NjRfdCBudW1GcmFtZXNEcm9wcGVkKTsKKyAgICB2b2lkIG5vdGlmeVNlZWtDb21wbGV0ZV9sKCk7CiAgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCwgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOwogICAgIHZvaWQgbm90aWZ5RmxhZ3NDaGFuZ2VkKHVpbnQzMl90IGZsYWdzKTsKIApAQCAtODUsNiArODYsOSBAQAogICAgICAgICBTVEFURV9SVU5OSU5HLAogICAgICAgICBTVEFURV9QQVVTRUQsCiAgICAgICAgIFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTLAorICAgICAgICBTVEFURV9TVE9QUEVELCAgICAgICAgICAgICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VECisgICAgICAgIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORywgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQsIGJ1dCBzZWVraW5nCisgICAgICAgIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVELCAgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQsIGJ1dCBzZWVrIGNvbXBsZXRlCiAgICAgfTsKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CkBAIC0xMDAsMTkgKzEwNCwyMiBAQAogICAgIGJvb2wgbVNldFN1cmZhY2VJblByb2dyZXNzOwogICAgIGludDY0X3QgbUR1cmF0aW9uVXM7CiAgICAgaW50NjRfdCBtUG9zaXRpb25VczsKLSAgICBpbnQ2NF90IG1OdW1GcmFtZXNUb3RhbDsKLSAgICBpbnQ2NF90IG1OdW1GcmFtZXNEcm9wcGVkOworICAgIGJvb2wgbVNlZWtJblByb2dyZXNzOwogICAgIC8vIDw8PAogCiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKICAgICBzcDxOdVBsYXllcj4gbVBsYXllcjsKKyAgICBzcDxBdWRpb1Npbms+IG1BdWRpb1Npbms7CiAgICAgdWludDMyX3QgbVBsYXllckZsYWdzOwogCiAgICAgYm9vbCBtQXRFT1M7CisgICAgYm9vbCBtTG9vcGluZzsKKyAgICBib29sIG1BdXRvTG9vcDsKIAogICAgIGludDY0X3QgbVN0YXJ0dXBTZWVrVGltZVVzOwogCiAgICAgc3RhdHVzX3QgcHJlcGFyZV9sKCk7CisgICAgdm9pZCBub3RpZnlMaXN0ZW5lcl9sKGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwLCBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOdVBsYXllckRyaXZlcik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCmluZGV4IGJmNTI3MWUuLjg2Y2UzODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKQEAgLTIwLDIzICsyMCw0NCBAQAogCiAjaW5jbHVkZSAiTnVQbGF5ZXJSZW5kZXJlci5oIgogCi0jaW5jbHVkZSAiU29mdHdhcmVSZW5kZXJlci5oIgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8VmlkZW9GcmFtZVNjaGVkdWxlci5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBNYXhpbXVtIHRpbWUgaW4gcGF1c2VkIHN0YXRlIHdoZW4gb2ZmbG9hZGluZyBhdWRpbyBkZWNvbXByZXNzaW9uLiBXaGVuIGVsYXBzZWQsIHRoZSBBdWRpb1NpbmsKKy8vIGlzIGNsb3NlZCB0byBhbGxvdyB0aGUgYXVkaW8gRFNQIHRvIHBvd2VyIGRvd24uCitzdGF0aWMgY29uc3QgaW50NjRfdCBrT2ZmbG9hZFBhdXNlTWF4VXMgPSA2MDAwMDAwMGxsOworCiAvLyBzdGF0aWMKIGNvbnN0IGludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjprTWluUG9zaXRpb25VcGRhdGVEZWxheVVzID0gMTAwMDAwbGw7CiAKK3N0YXRpYyBib29sIHNGcmFtZUFjY3VyYXRlQVZzeW5jID0gZmFsc2U7CisKK3N0YXRpYyB2b2lkIHJlYWRQcm9wZXJ0aWVzKCkgeworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJwZXJzaXN0LnN5cy5tZWRpYS5hdnN5bmMiLCB2YWx1ZSwgTlVMTCkpIHsKKyAgICAgICAgc0ZyYW1lQWNjdXJhdGVBVnN5bmMgPQorICAgICAgICAgICAgIXN0cmNtcCgiMSIsIHZhbHVlKSB8fCAhc3RyY2FzZWNtcCgidHJ1ZSIsIHZhbHVlKTsKKyAgICB9Cit9CisKIE51UGxheWVyOjpSZW5kZXJlcjo6UmVuZGVyZXIoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmc2luaywKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgIHVpbnQzMl90IGZsYWdzKQogICAgIDogbUF1ZGlvU2luayhzaW5rKSwKLSAgICAgIG1Tb2Z0UmVuZGVyZXIoTlVMTCksCiAgICAgICBtTm90aWZ5KG5vdGlmeSksCiAgICAgICBtRmxhZ3MoZmxhZ3MpLAogICAgICAgbU51bUZyYW1lc1dyaXR0ZW4oMCksCkBAIC00NCwyOCArNjUsMzcgQEAKICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nKGZhbHNlKSwKICAgICAgIG1BdWRpb1F1ZXVlR2VuZXJhdGlvbigwKSwKICAgICAgIG1WaWRlb1F1ZXVlR2VuZXJhdGlvbigwKSwKKyAgICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMoLTEpLAogICAgICAgbUFuY2hvclRpbWVNZWRpYVVzKC0xKSwKICAgICAgIG1BbmNob3JUaW1lUmVhbFVzKC0xKSwKLSAgICAgIG1GbHVzaGluZ0F1ZGlvKGZhbHNlKSwKLSAgICAgIG1GbHVzaGluZ1ZpZGVvKGZhbHNlKSwKKyAgICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuKC0xKSwKKyAgICAgIG1BbmNob3JNYXhNZWRpYVVzKC0xKSwKKyAgICAgIG1WaWRlb0xhdGVCeVVzKDBsbCksCiAgICAgICBtSGFzQXVkaW8oZmFsc2UpLAogICAgICAgbUhhc1ZpZGVvKGZhbHNlKSwKKyAgICAgIG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKC0xKSwKKyAgICAgIG1GbHVzaGluZ0F1ZGlvKGZhbHNlKSwKKyAgICAgIG1GbHVzaGluZ1ZpZGVvKGZhbHNlKSwKICAgICAgIG1TeW5jUXVldWVzKGZhbHNlKSwKICAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVZpZGVvU2FtcGxlUmVjZWl2ZWQoZmFsc2UpLAogICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZChmYWxzZSksCiAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24oMCksCiAgICAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24oMCksCi0gICAgICBtTGFzdFBvc2l0aW9uVXBkYXRlVXMoLTFsbCksCi0gICAgICBtVmlkZW9MYXRlQnlVcygwbGwpIHsKKyAgICAgIG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uKDApLAorICAgICAgbUF1ZGlvT2ZmbG9hZFRvcm5Eb3duKGZhbHNlKSwKKyAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8oQVVESU9fSU5GT19JTklUSUFMSVpFUiksCisgICAgICBtVG90YWxCdWZmZXJzUXVldWVkKDApLAorICAgICAgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQoMCkgeworICAgIHJlYWRQcm9wZXJ0aWVzKCk7CiB9CiAKIE51UGxheWVyOjpSZW5kZXJlcjo6flJlbmRlcmVyKCkgewotICAgIGRlbGV0ZSBtU29mdFJlbmRlcmVyOwotfQotCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0U29mdFJlbmRlcmVyKFNvZnR3YXJlUmVuZGVyZXIgKnNvZnRSZW5kZXJlcikgewotICAgIGRlbGV0ZSBtU29mdFJlbmRlcmVyOwotICAgIG1Tb2Z0UmVuZGVyZXIgPSBzb2Z0UmVuZGVyZXI7CisgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKKyAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKKyAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpxdWV1ZUJ1ZmZlcigKQEAgLTkyLDEwICsxMjIsMTQgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRmx1c2hMb2NrKTsKICAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICBDSEVDSyghbUZsdXNoaW5nQXVkaW8pOworICAgICAgICAgICAgaWYgKG1GbHVzaGluZ0F1ZGlvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSB0cnVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0hFQ0soIW1GbHVzaGluZ1ZpZGVvKTsKKyAgICAgICAgICAgIGlmIChtRmx1c2hpbmdWaWRlbykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNiwxMyArMTQwLDIzIEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzaWduYWxUaW1lRGlzY29udGludWl0eSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIC8vIENIRUNLKG1BdWRpb1F1ZXVlLmVtcHR5KCkpOwogICAgIC8vIENIRUNLKG1WaWRlb1F1ZXVlLmVtcHR5KCkpOwotICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IC0xOwotICAgIG1BbmNob3JUaW1lUmVhbFVzID0gLTE7CisgICAgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWUoLTEpOworICAgIHNldEFuY2hvclRpbWUoLTEsIC0xKTsKKyAgICBzZXRWaWRlb0xhdGVCeVVzKDApOwogICAgIG1TeW5jUXVldWVzID0gZmFsc2U7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzaWduYWxBdWRpb1NpbmtDaGFuZ2VkKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb1NpbmtDaGFuZ2VkLCBpZCgpKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdERpc2FibGVPZmZsb2FkQXVkaW8sIGlkKCkpKS0+cG9zdCgpOworfQorCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cGF1c2UoKSB7CiAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCBpZCgpKSktPnBvc3QoKTsKIH0KQEAgLTEyMSw4ICsxNjUsMTY4IEBACiAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgaWQoKSkpLT5wb3N0KCk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0VmlkZW9GcmFtZVJhdGUsIGlkKCkpOworICAgIG1zZy0+c2V0RmxvYXQoImZyYW1lLXJhdGUiLCBmcHMpOworICAgIG1zZy0+cG9zdCgpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKSB7CisgICAgcmV0dXJuIGdldEN1cnJlbnRQb3NpdGlvbihtZWRpYVVzLCBBTG9vcGVyOjpHZXROb3dVcygpKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRDdXJyZW50UG9zaXRpb24oCisgICAgICAgIGludDY0X3QgKm1lZGlhVXMsIGludDY0X3Qgbm93VXMsIGJvb2wgYWxsb3dQYXN0UXVldWVkVmlkZW8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICBpZiAoIW1IYXNBdWRpbyAmJiAhbUhhc1ZpZGVvKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChtQW5jaG9yVGltZU1lZGlhVXMgPCAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGludDY0X3QgcG9zaXRpb25VcyA9IChub3dVcyAtIG1BbmNob3JUaW1lUmVhbFVzKSArIG1BbmNob3JUaW1lTWVkaWFVczsKKworICAgIGlmIChtUGF1c2VTdGFydGVkVGltZVJlYWxVcyAhPSAtMSkgeworICAgICAgICBwb3NpdGlvblVzIC09IChub3dVcyAtIG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKTsKKyAgICB9CisKKyAgICAvLyBsaW1pdCBwb3NpdGlvbiB0byB0aGUgbGFzdCBxdWV1ZWQgbWVkaWEgdGltZSAoZm9yIHZpZGVvIG9ubHkgc3RyZWFtCisgICAgLy8gcG9zaXRpb24gd2lsbCBiZSBkaXNjcmV0ZSBhcyB3ZSBkb24ndCBrbm93IGhvdyBsb25nIGVhY2ggZnJhbWUgbGFzdHMpCisgICAgaWYgKG1BbmNob3JNYXhNZWRpYVVzID49IDAgJiYgIWFsbG93UGFzdFF1ZXVlZFZpZGVvKSB7CisgICAgICAgIGlmIChwb3NpdGlvblVzID4gbUFuY2hvck1heE1lZGlhVXMpIHsKKyAgICAgICAgICAgIHBvc2l0aW9uVXMgPSBtQW5jaG9yTWF4TWVkaWFVczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwb3NpdGlvblVzIDwgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcykgeworICAgICAgICBwb3NpdGlvblVzID0gbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVczsKKyAgICB9CisKKyAgICAqbWVkaWFVcyA9IChwb3NpdGlvblVzIDw9IDApID8gMCA6IHBvc2l0aW9uVXM7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0SGFzTWVkaWEoYm9vbCBhdWRpbykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIGlmIChhdWRpbykgeworICAgICAgICBtSGFzQXVkaW8gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1IYXNWaWRlbyA9IHRydWU7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0QXVkaW9GaXJzdEFuY2hvclRpbWUoaW50NjRfdCBtZWRpYVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVXM7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkKGludDY0X3QgbWVkaWFVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIGlmIChtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID09IC0xKSB7CisgICAgICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVVzOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldEFuY2hvclRpbWUoCisgICAgICAgIGludDY0X3QgbWVkaWFVcywgaW50NjRfdCByZWFsVXMsIGludDY0X3QgbnVtRnJhbWVzV3JpdHRlbiwgYm9vbCByZXN1bWUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVVzOworICAgIG1BbmNob3JUaW1lUmVhbFVzID0gcmVhbFVzOworICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuID0gbnVtRnJhbWVzV3JpdHRlbjsKKyAgICBpZiAocmVzdW1lKSB7CisgICAgICAgIG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzID0gLTE7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0VmlkZW9MYXRlQnlVcyhpbnQ2NF90IGxhdGVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIG1WaWRlb0xhdGVCeVVzID0gbGF0ZVVzOworfQorCitpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0VmlkZW9MYXRlQnlVcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICByZXR1cm4gbVZpZGVvTGF0ZUJ5VXM7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRQYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKGludDY0X3QgcmVhbFVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXMgPSByZWFsVXM7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvcGVuQXVkaW9TaW5rKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgYm9vbCBvZmZsb2FkT25seSwKKyAgICAgICAgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T3BlbkF1ZGlvU2luaywgaWQoKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+c2V0SW50MzIoIm9mZmxvYWQtb25seSIsIG9mZmxvYWRPbmx5KTsKKyAgICBtc2ctPnNldEludDMyKCJoYXMtdmlkZW8iLCBoYXNWaWRlbyk7CisgICAgbXNnLT5zZXRJbnQzMigiZmxhZ3MiLCBmbGFncyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworCisgICAgaW50MzJfdCBvZmZsb2FkOworICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoIm9mZmxvYWQiLCAmb2ZmbG9hZCkpOworICAgIHJldHVybiAob2ZmbG9hZCAhPSAwKTsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OmNsb3NlQXVkaW9TaW5rKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDbG9zZUF1ZGlvU2luaywgaWQoKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworfQorCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRPcGVuQXVkaW9TaW5rOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworCisgICAgICAgICAgICBpbnQzMl90IG9mZmxvYWRPbmx5OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm9mZmxvYWQtb25seSIsICZvZmZsb2FkT25seSkpOworCisgICAgICAgICAgICBpbnQzMl90IGhhc1ZpZGVvOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImhhcy12aWRlbyIsICZoYXNWaWRlbykpOworCisgICAgICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmbGFncyIsIChpbnQzMl90ICopJmZsYWdzKSk7CisKKyAgICAgICAgICAgIGJvb2wgb2ZmbG9hZCA9IG9uT3BlbkF1ZGlvU2luayhmb3JtYXQsIG9mZmxvYWRPbmx5LCBoYXNWaWRlbywgZmxhZ3MpOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoIm9mZmxvYWQiLCBvZmZsb2FkKTsKKworICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdENsb3NlQXVkaW9TaW5rOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBvbkNsb3NlQXVkaW9TaW5rKCk7CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTdG9wQXVkaW9TaW5rOgorICAgICAgICB7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXREcmFpbkF1ZGlvUXVldWU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKQEAgLTE0OSw3ICszNTMsMTAgQEAKIAogICAgICAgICAgICAgICAgIC8vIExldCdzIGdpdmUgaXQgbW9yZSBkYXRhIGFmdGVyIGFib3V0IGhhbGYgdGhhdCB0aW1lCiAgICAgICAgICAgICAgICAgLy8gaGFzIGVsYXBzZWQuCi0gICAgICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZShkZWxheVVzIC8gMik7CisgICAgICAgICAgICAgICAgLy8ga1doYXREcmFpbkF1ZGlvUXVldWUgaXMgdXNlZCBmb3Igbm9uLW9mZmxvYWRpbmcgbW9kZSwKKyAgICAgICAgICAgICAgICAvLyBhbmQgbUxvY2sgaXMgdXNlZCBvbmx5IGZvciBvZmZsb2FkaW5nIG1vZGUuIFRoZXJlZm9yZSwKKyAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGFjcXVpcmUgbUxvY2sgaGVyZS4KKyAgICAgICAgICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woZGVsYXlVcyAvIDIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE3MCw2ICszNzcsMTkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdFBvc3REcmFpblZpZGVvUXVldWU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1WaWRlb1F1ZXVlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0UXVldWVCdWZmZXI6CiAgICAgICAgIHsKICAgICAgICAgICAgIG9uUXVldWVCdWZmZXIobXNnKTsKQEAgLTE5NCw2ICs0MTQsMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdERpc2FibGVPZmZsb2FkQXVkaW86CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uRGlzYWJsZU9mZmxvYWRBdWRpbygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0UGF1c2U6CiAgICAgICAgIHsKICAgICAgICAgICAgIG9uUGF1c2UoKTsKQEAgLTIwNiwxNCArNDMyLDQxIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRTZXRWaWRlb0ZyYW1lUmF0ZToKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgZnBzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnBzKSk7CisgICAgICAgICAgICBvblNldFZpZGVvRnJhbWVSYXRlKGZwcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRBdWRpb09mZmxvYWRUZWFyRG93bjoKKyAgICAgICAgeworICAgICAgICAgICAgb25BdWRpb09mZmxvYWRUZWFyRG93bihrRHVlVG9FcnJvcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiQXVkaW8gT2ZmbG9hZCB0ZWFyIGRvd24gZHVlIHRvIHBhdXNlIHRpbWVvdXQuIik7CisgICAgICAgICAgICBvbkF1ZGlvT2ZmbG9hZFRlYXJEb3duKGtEdWVUb1RpbWVvdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnBvc3REcmFpbkF1ZGlvUXVldWUoaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgaWYgKG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nIHx8IG1TeW5jUXVldWVzIHx8IG1QYXVzZWQpIHsKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpwb3N0RHJhaW5BdWRpb1F1ZXVlX2woaW50NjRfdCBkZWxheVVzKSB7CisgICAgaWYgKG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nIHx8IG1TeW5jUXVldWVzIHx8IG1QYXVzZWQKKyAgICAgICAgICAgIHx8IG9mZmxvYWRpbmdBdWRpbygpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTIyNywxMCArNDgwLDYgQEAKICAgICBtc2ctPnBvc3QoZGVsYXlVcyk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzaWduYWxBdWRpb1NpbmtDaGFuZ2VkKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb1NpbmtDaGFuZ2VkLCBpZCgpKSktPnBvc3QoKTsKLX0KLQogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0KCkgewogICAgIG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9IG1BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSBtVmlkZW9RdWV1ZUdlbmVyYXRpb247CkBAIC0yNDgsNiArNDk3LDEwMiBAQAogICAgIH0KIH0KIAorLy8gc3RhdGljCitzaXplX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjaygKKyAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKiAvKiBhdWRpb1NpbmsgKi8sCisgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgIHZvaWQgKmNvb2tpZSwKKyAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OmNiX2V2ZW50X3QgZXZlbnQpIHsKKyAgICBOdVBsYXllcjo6UmVuZGVyZXIgKm1lID0gKE51UGxheWVyOjpSZW5kZXJlciAqKWNvb2tpZTsKKworICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfRklMTF9CVUZGRVI6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtZS0+ZmlsbEF1ZGlvQnVmZmVyKGJ1ZmZlciwgc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX1NUUkVBTV9FTkQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1lLT5ub3RpZnlFT1ModHJ1ZSAvKiBhdWRpbyAqLywgRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX1RFQVJfRE9XTjoKKyAgICAgICAgeworICAgICAgICAgICAgbWUtPm5vdGlmeUF1ZGlvT2ZmbG9hZFRlYXJEb3duKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzaXplX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpmaWxsQXVkaW9CdWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAoIW9mZmxvYWRpbmdBdWRpbygpIHx8IG1QYXVzZWQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYm9vbCBoYXNFT1MgPSBmYWxzZTsKKworICAgIHNpemVfdCBzaXplQ29waWVkID0gMDsKKyAgICBib29sIGZpcnN0RW50cnkgPSB0cnVlOworICAgIHdoaWxlIChzaXplQ29waWVkIDwgc2l6ZSAmJiAhbUF1ZGlvUXVldWUuZW1wdHkoKSkgeworICAgICAgICBRdWV1ZUVudHJ5ICplbnRyeSA9ICYqbUF1ZGlvUXVldWUuYmVnaW4oKTsKKworICAgICAgICBpZiAoZW50cnktPm1CdWZmZXIgPT0gTlVMTCkgeyAvLyBFT1MKKyAgICAgICAgICAgIGhhc0VPUyA9IHRydWU7CisgICAgICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpcnN0RW50cnkgJiYgZW50cnktPm1PZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgZmlyc3RFbnRyeSA9IGZhbHNlOworICAgICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKKyAgICAgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CisgICAgICAgICAgICBBTE9HVigicmVuZGVyaW5nIGF1ZGlvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwgbWVkaWFUaW1lVXMgLyAxRTYpOworICAgICAgICAgICAgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZChtZWRpYVRpbWVVcyk7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgY29weSA9IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkgLSBlbnRyeS0+bU9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemVSZW1haW5pbmcgPSBzaXplIC0gc2l6ZUNvcGllZDsKKyAgICAgICAgaWYgKGNvcHkgPiBzaXplUmVtYWluaW5nKSB7CisgICAgICAgICAgICBjb3B5ID0gc2l6ZVJlbWFpbmluZzsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweSgoY2hhciAqKWJ1ZmZlciArIHNpemVDb3BpZWQsCisgICAgICAgICAgICAgICBlbnRyeS0+bUJ1ZmZlci0+ZGF0YSgpICsgZW50cnktPm1PZmZzZXQsCisgICAgICAgICAgICAgICBjb3B5KTsKKworICAgICAgICBlbnRyeS0+bU9mZnNldCArPSBjb3B5OworICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gZW50cnktPm1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOworICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBlbnRyeSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZUNvcGllZCArPSBjb3B5OworICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZCgpOworICAgIH0KKworICAgIGlmIChtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID49IDApIHsKKyAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIHNldEFuY2hvclRpbWUobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcywgbm93VXMgLSBnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMobm93VXMpKTsKKyAgICB9CisKKyAgICAvLyB3ZSBkb24ndCBrbm93IGhvdyBtdWNoIGRhdGEgd2UgYXJlIHF1ZXVlaW5nIGZvciBvZmZsb2FkZWQgdHJhY2tzCisgICAgbUFuY2hvck1heE1lZGlhVXMgPSAtMTsKKworICAgIGlmIChoYXNFT1MpIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3BBdWRpb1NpbmssIGlkKCkpKS0+cG9zdCgpOworICAgIH0KKworICAgIHJldHVybiBzaXplQ29waWVkOworfQorCiBib29sIE51UGxheWVyOjpSZW5kZXJlcjo6b25EcmFpbkF1ZGlvUXVldWUoKSB7CiAgICAgdWludDMyX3QgbnVtRnJhbWVzUGxheWVkOwogICAgIGlmIChtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKSAhPSBPSykgewpAQCAtMjcyLDEwICs2MTcsMTUgQEAKICAgICB3aGlsZSAobnVtQnl0ZXNBdmFpbGFibGVUb1dyaXRlID4gMCAmJiAhbUF1ZGlvUXVldWUuZW1wdHkoKSkgewogICAgICAgICBRdWV1ZUVudHJ5ICplbnRyeSA9ICYqbUF1ZGlvUXVldWUuYmVnaW4oKTsKIAorICAgICAgICBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZCA9IGVudHJ5LT5tQnVmZmVyT3JkaW5hbDsKKwogICAgICAgICBpZiAoZW50cnktPm1CdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgLy8gRU9TCi0KLSAgICAgICAgICAgIG5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBlbnRyeS0+bUZpbmFsUmVzdWx0KTsKKyAgICAgICAgICAgIGludDY0X3QgcG9zdEVPU0RlbGF5VXMgPSAwOworICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmstPm5lZWRzVHJhaWxpbmdQYWRkaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBwb3N0RU9TRGVsYXlVcyA9IGdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKEFMb29wZXI6OkdldE5vd1VzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKIAogICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICBlbnRyeSA9IE5VTEw7CkBAIC0yODUsMjYgKzYzNSw4IEBACiAgICAgICAgIGlmIChlbnRyeS0+bU9mZnNldCA9PSAwKSB7CiAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgICAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKLQogICAgICAgICAgICAgQUxPR1YoInJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsIG1lZGlhVGltZVVzIC8gMUU2KTsKLQotICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFUaW1lVXM7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKLSAgICAgICAgICAgIENIRUNLX0VRKG1BdWRpb1NpbmstPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNQZW5kaW5nUGxheW91dCA9Ci0gICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gLSBudW1GcmFtZXNQbGF5ZWQ7Ci0KLSAgICAgICAgICAgIGludDY0X3QgcmVhbFRpbWVPZmZzZXRVcyA9Ci0gICAgICAgICAgICAgICAgKG1BdWRpb1NpbmstPmxhdGVuY3koKSAvIDIgIC8qIFhYWCAqLwotICAgICAgICAgICAgICAgICAgICArIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIG1BdWRpb1NpbmstPm1zZWNzUGVyRnJhbWUoKSkgKiAxMDAwbGw7Ci0KLSAgICAgICAgICAgIC8vIEFMT0dJKCJyZWFsVGltZU9mZnNldFVzID0gJWxsZCB1cyIsIHJlYWxUaW1lT2Zmc2V0VXMpOwotCi0gICAgICAgICAgICBtQW5jaG9yVGltZVJlYWxVcyA9Ci0gICAgICAgICAgICAgICAgQUxvb3Blcjo6R2V0Tm93VXMoKSArIHJlYWxUaW1lT2Zmc2V0VXM7CisgICAgICAgICAgICBvbk5ld0F1ZGlvTWVkaWFUaW1lKG1lZGlhVGltZVVzKTsKICAgICAgICAgfQogCiAgICAgICAgIHNpemVfdCBjb3B5ID0gZW50cnktPm1CdWZmZXItPnNpemUoKSAtIGVudHJ5LT5tT2Zmc2V0OwpAQCAtMzEyLDExICs2NDQsMTMgQEAKICAgICAgICAgICAgIGNvcHkgPSBudW1CeXRlc0F2YWlsYWJsZVRvV3JpdGU7CiAgICAgICAgIH0KIAotICAgICAgICBDSEVDS19FUShtQXVkaW9TaW5rLT53cml0ZSgKLSAgICAgICAgICAgICAgICAgICAgZW50cnktPm1CdWZmZXItPmRhdGEoKSArIGVudHJ5LT5tT2Zmc2V0LCBjb3B5KSwKLSAgICAgICAgICAgICAgICAgKHNzaXplX3QpY29weSk7CisgICAgICAgIHNzaXplX3Qgd3JpdHRlbiA9IG1BdWRpb1NpbmstPndyaXRlKGVudHJ5LT5tQnVmZmVyLT5kYXRhKCkgKyBlbnRyeS0+bU9mZnNldCwgY29weSk7CisgICAgICAgIGlmICh3cml0dGVuIDwgMCkgeworICAgICAgICAgICAgLy8gQW4gZXJyb3IgaW4gQXVkaW9TaW5rIHdyaXRlIGlzIGZhdGFsIGhlcmUuCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJBdWRpb1Npbmsgd3JpdGUgZXJyb3IoJXpkKSB3aGVuIHdyaXRpbmcgJXp1IGJ5dGVzIiwgd3JpdHRlbiwgY29weSk7CisgICAgICAgIH0KIAotICAgICAgICBlbnRyeS0+bU9mZnNldCArPSBjb3B5OworICAgICAgICBlbnRyeS0+bU9mZnNldCArPSB3cml0dGVuOwogICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gZW50cnktPm1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOwogICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CkBAIC0zMjQsMjAgKzY1OCw3MyBAQAogICAgICAgICAgICAgZW50cnkgPSBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgbnVtQnl0ZXNBdmFpbGFibGVUb1dyaXRlIC09IGNvcHk7Ci0gICAgICAgIHNpemVfdCBjb3BpZWRGcmFtZXMgPSBjb3B5IC8gbUF1ZGlvU2luay0+ZnJhbWVTaXplKCk7CisgICAgICAgIG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSAtPSB3cml0dGVuOworICAgICAgICBzaXplX3QgY29waWVkRnJhbWVzID0gd3JpdHRlbiAvIG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOwogICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSBjb3BpZWRGcmFtZXM7CiAKICAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWQoKTsKLSAgICB9CiAKLSAgICBub3RpZnlQb3NpdGlvbigpOworICAgICAgICBpZiAod3JpdHRlbiAhPSAoc3NpemVfdCljb3B5KSB7CisgICAgICAgICAgICAvLyBBIHNob3J0IGNvdW50IHdhcyByZWNlaXZlZCBmcm9tIEF1ZGlvU2luazo6d3JpdGUoKQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEF1ZGlvU2luayB3cml0ZSBzaG91bGQgYmxvY2sgdW50aWwgZXhhY3RseSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFyZSBkZWxpdmVyZWQuCisgICAgICAgICAgICAvLyBCdXQgaXQgbWF5IHJldHVybiB3aXRoIGEgc2hvcnQgY291bnQgKHdpdGhvdXQgYW4gZXJyb3IpIHdoZW46CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gMSkgU2l6ZSB0byBiZSBjb3BpZWQgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIGZyYW1lIHNpemUuIFdlIGNvbnNpZGVyIHRoaXMgZmF0YWwuCisgICAgICAgICAgICAvLyAyKSBBdWRpb1NpbmsgaXMgYW4gQXVkaW9DYWNoZSBmb3IgZGF0YSByZXRyaWV2YWwsIGFuZCB0aGUgQXVkaW9DYWNoZSBpcyBleGNlZWRlZC4KKworICAgICAgICAgICAgLy8gKENhc2UgMSkKKyAgICAgICAgICAgIC8vIE11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgZnJhbWUgc2l6ZS4gIElmIGl0IGlzIG5vdCBhIG11bHRpcGxlIG9mIGEgZnJhbWUgc2l6ZSwgaXQKKyAgICAgICAgICAgIC8vIG5lZWRzIHRvIGZhaWwsIGFzIHdlIHNob3VsZCBub3QgY2Fycnkgb3ZlciBmcmFjdGlvbmFsIGZyYW1lcyBiZXR3ZWVuIGNhbGxzLgorICAgICAgICAgICAgQ0hFQ0tfRVEoY29weSAlIG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpLCAwKTsKKworICAgICAgICAgICAgLy8gKENhc2UgMikKKyAgICAgICAgICAgIC8vIFJldHVybiBlYXJseSB0byB0aGUgY2FsbGVyLgorICAgICAgICAgICAgLy8gQmV3YXJlIG9mIGNhbGxpbmcgaW1tZWRpYXRlbHkgYWdhaW4gYXMgdGhpcyBtYXkgYnVzeS1sb29wIGlmIHlvdSBhcmUgbm90IGNhcmVmdWwuCisgICAgICAgICAgICBBTE9HVygiQXVkaW9TaW5rIHdyaXRlIHNob3J0IGZyYW1lIGNvdW50ICV6ZCA8ICV6dSIsIHdyaXR0ZW4sIGNvcHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbUFuY2hvck1heE1lZGlhVXMgPQorICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgKworICAgICAgICAgICAgICAgIChpbnQ2NF90KShtYXgoKGxvbmcgbG9uZyltTnVtRnJhbWVzV3JpdHRlbiAtIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuLCAwTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAqIDEwMDBMTCAqIG1BdWRpb1NpbmstPm1zZWNzUGVyRnJhbWUoKSk7CiAKICAgICByZXR1cm4gIW1BdWRpb1F1ZXVlLmVtcHR5KCk7CiB9CiAKK2ludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSB7CisgICAgaW50NjRfdCB3cml0dGVuQXVkaW9EdXJhdGlvblVzID0KKyAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gKiAxMDAwTEwgKiBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCk7CisgICAgcmV0dXJuIHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgLSBnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMobm93VXMpOworfQorCitpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0UmVhbFRpbWVVcyhpbnQ2NF90IG1lZGlhVGltZVVzLCBpbnQ2NF90IG5vd1VzKSB7CisgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKKyAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50UG9zaXRpb25Vcywgbm93VXMsIHRydWUgLyogYWxsb3dQYXN0UXVldWVkVmlkZW8gKi8pICE9IE9LKSB7CisgICAgICAgIC8vIElmIGZhaWxlZCB0byBnZXQgY3VycmVudCBwb3NpdGlvbiwgZS5nLiBkdWUgdG8gYXVkaW8gY2xvY2sgaXMgbm90IHJlYWR5LCB0aGVuIGp1c3QKKyAgICAgICAgLy8gcGxheSBvdXQgdmlkZW8gaW1tZWRpYXRlbHkgd2l0aG91dCBkZWxheS4KKyAgICAgICAgcmV0dXJuIG5vd1VzOworICAgIH0KKyAgICByZXR1cm4gKG1lZGlhVGltZVVzIC0gY3VycmVudFBvc2l0aW9uVXMpICsgbm93VXM7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbk5ld0F1ZGlvTWVkaWFUaW1lKGludDY0X3QgbWVkaWFUaW1lVXMpIHsKKyAgICAvLyBUUklDS1k6IHZvcmJpcyBkZWNvZGVyIGdlbmVyYXRlcyBtdWx0aXBsZSBmcmFtZXMgd2l0aCB0aGUgc2FtZQorICAgIC8vIHRpbWVzdGFtcCwgc28gb25seSB1cGRhdGUgb24gdGhlIGZpcnN0IGZyYW1lIHdpdGggYSBnaXZlbiB0aW1lc3RhbXAKKyAgICBpZiAobWVkaWFUaW1lVXMgPT0gbUFuY2hvclRpbWVNZWRpYVVzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZChtZWRpYVRpbWVVcyk7CisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgc2V0QW5jaG9yVGltZSgKKyAgICAgICAgICAgIG1lZGlhVGltZVVzLCBub3dVcyArIGdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKG5vd1VzKSwgbU51bUZyYW1lc1dyaXR0ZW4pOworfQorCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cG9zdERyYWluVmlkZW9RdWV1ZSgpIHsKLSAgICBpZiAobURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgfHwgbVN5bmNRdWV1ZXMgfHwgbVBhdXNlZCkgeworICAgIGlmIChtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZworICAgICAgICAgICAgfHwgbVN5bmNRdWV1ZXMKKyAgICAgICAgICAgIHx8IChtUGF1c2VkICYmIG1WaWRlb1NhbXBsZVJlY2VpdmVkKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0zNTAsMzYgKzczNyw2NyBAQAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREcmFpblZpZGVvUXVldWUsIGlkKCkpOwogICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtVmlkZW9RdWV1ZUdlbmVyYXRpb24pOwogCi0gICAgaW50NjRfdCBkZWxheVVzOwotCiAgICAgaWYgKGVudHJ5Lm1CdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAvLyBFT1MgZG9lc24ndCBjYXJyeSBhIHRpbWVzdGFtcC4KLSAgICAgICAgZGVsYXlVcyA9IDA7Ci0gICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSkgeworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBkZWxheVVzOworICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGludDY0X3QgcmVhbFRpbWVVczsKKyAgICBpZiAobUZsYWdzICYgRkxBR19SRUFMX1RJTUUpIHsKICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKICAgICAgICAgQ0hFQ0soZW50cnkubUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOwotCi0gICAgICAgIGRlbGF5VXMgPSBtZWRpYVRpbWVVcyAtIEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIHJlYWxUaW1lVXMgPSBtZWRpYVRpbWVVczsKICAgICB9IGVsc2UgewogICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgICAgICBDSEVDSyhlbnRyeS5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CiAKICAgICAgICAgaWYgKG1BbmNob3JUaW1lTWVkaWFVcyA8IDApIHsKLSAgICAgICAgICAgIGRlbGF5VXMgPSAwOwotCi0gICAgICAgICAgICBpZiAoIW1IYXNBdWRpbykgewotICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzOwotICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lUmVhbFVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEFuY2hvclRpbWUobWVkaWFUaW1lVXMsIG5vd1VzKTsKKyAgICAgICAgICAgIHJlYWxUaW1lVXMgPSBub3dVczsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDY0X3QgcmVhbFRpbWVVcyA9Ci0gICAgICAgICAgICAgICAgKG1lZGlhVGltZVVzIC0gbUFuY2hvclRpbWVNZWRpYVVzKSArIG1BbmNob3JUaW1lUmVhbFVzOworICAgICAgICAgICAgcmVhbFRpbWVVcyA9IGdldFJlYWxUaW1lVXMobWVkaWFUaW1lVXMsIG5vd1VzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1IYXNBdWRpbykgeworICAgICAgICAgICAgbUFuY2hvck1heE1lZGlhVXMgPSBtZWRpYVRpbWVVcyArIDEwMDAwMDsgLy8gc21vb3RoIG91dCB2aWRlb3MgPj0gMTBmcHMKKyAgICAgICAgfQogCi0gICAgICAgICAgICBkZWxheVVzID0gcmVhbFRpbWVVcyAtIEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIC8vIEhldXJpc3RpY3MgdG8gaGFuZGxlIHNpdHVhdGlvbiB3aGVuIG1lZGlhIHRpbWUgY2hhbmdlZCB3aXRob3V0IGEKKyAgICAgICAgLy8gZGlzY29udGludWl0eS4gSWYgd2UgaGF2ZSBub3QgZHJhaW5lZCBhbiBhdWRpbyBidWZmZXIgdGhhdCB3YXMKKyAgICAgICAgLy8gcmVjZWl2ZWQgYWZ0ZXIgdGhpcyBidWZmZXIsIHJlcG9zdCBpbiAxMCBtc2VjLiBPdGhlcndpc2UgcmVwb3N0CisgICAgICAgIC8vIGluIDUwMCBtc2VjLgorICAgICAgICBkZWxheVVzID0gcmVhbFRpbWVVcyAtIG5vd1VzOworICAgICAgICBpZiAoZGVsYXlVcyA+IDUwMDAwMCkgeworICAgICAgICAgICAgaW50NjRfdCBwb3N0RGVsYXlVcyA9IDUwMDAwMDsKKyAgICAgICAgICAgIGlmIChtSGFzQXVkaW8gJiYgKG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkIC0gZW50cnkubUJ1ZmZlck9yZGluYWwpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBwb3N0RGVsYXlVcyA9IDEwMDAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5zZXRXaGF0KGtXaGF0UG9zdERyYWluVmlkZW9RdWV1ZSk7CisgICAgICAgICAgICBtc2ctPnBvc3QocG9zdERlbGF5VXMpOworICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyLT5yZXN0YXJ0KCk7CisgICAgICAgICAgICBBTE9HSSgicG9zc2libGUgdmlkZW8gdGltZSBqdW1wIG9mICVkbXMsIHJldHJ5aW5nIGluICVkbXMiLAorICAgICAgICAgICAgICAgICAgICAoaW50KShkZWxheVVzIC8gMTAwMCksIChpbnQpKHBvc3REZWxheVVzIC8gMTAwMCkpOworICAgICAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQogCi0gICAgbXNnLT5wb3N0KGRlbGF5VXMpOworICAgIHJlYWxUaW1lVXMgPSBtVmlkZW9TY2hlZHVsZXItPnNjaGVkdWxlKHJlYWxUaW1lVXMgKiAxMDAwKSAvIDEwMDA7CisgICAgaW50NjRfdCB0d29Wc3luY3NVcyA9IDIgKiAobVZpZGVvU2NoZWR1bGVyLT5nZXRWc3luY1BlcmlvZCgpIC8gMTAwMCk7CisKKyAgICBkZWxheVVzID0gcmVhbFRpbWVVcyAtIG5vd1VzOworCisgICAgQUxPR1dfSUYoZGVsYXlVcyA+IDUwMDAwMCwgInVudXN1YWxseSBoaWdoIGRlbGF5VXM6ICUiIFBSSWQ2NCwgZGVsYXlVcyk7CisgICAgLy8gcG9zdCAyIGRpc3BsYXkgcmVmcmVzaGVzIGJlZm9yZSByZW5kZXJpbmcgaXMgZHVlCisgICAgLy8gRklYTUUgY3VycmVudGx5IHRoaXMgaW5jcmVhc2VzIHBvd2VyIGNvbnN1bXB0aW9uLCBzbyB1bmxlc3MgZnJhbWUtYWNjdXJhdGUKKyAgICAvLyBBViBzeW5jIGlzIHJlcXVlc3RlZCwgcG9zdCBjbG9zZXIgdG8gcmVxdWlyZWQgcmVuZGVyIHRpbWUgKGF0IDAuNjMgdnN5bmNzKQorICAgIGlmICghc0ZyYW1lQWNjdXJhdGVBVnN5bmMpIHsKKyAgICAgICAgdHdvVnN5bmNzVXMgPj49IDQ7CisgICAgfQorICAgIG1zZy0+cG9zdChkZWxheVVzID4gdHdvVnN5bmNzVXMgPyBkZWxheVVzIC0gdHdvVnN5bmNzVXMgOiAwKTsKIAogICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gdHJ1ZTsKIH0KQEAgLTM5OSwxMiArODE3LDExIEBACiAgICAgICAgIG1WaWRlb1F1ZXVlLmVyYXNlKG1WaWRlb1F1ZXVlLmJlZ2luKCkpOwogICAgICAgICBlbnRyeSA9IE5VTEw7CiAKLSAgICAgICAgbVZpZGVvTGF0ZUJ5VXMgPSAwbGw7Ci0KLSAgICAgICAgbm90aWZ5UG9zaXRpb24oKTsKKyAgICAgICAgc2V0VmlkZW9MYXRlQnlVcygwKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGludDY0X3Qgbm93VXMgPSAtMTsKICAgICBpbnQ2NF90IHJlYWxUaW1lVXM7CiAgICAgaWYgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FKSB7CiAgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnJlYWxUaW1lVXMpKTsKQEAgLTQxMiwzNyArODI5LDUxIEBACiAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CiAgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CiAKLSAgICAgICAgcmVhbFRpbWVVcyA9IG1lZGlhVGltZVVzIC0gbUFuY2hvclRpbWVNZWRpYVVzICsgbUFuY2hvclRpbWVSZWFsVXM7CisgICAgICAgIG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgcmVhbFRpbWVVcyA9IGdldFJlYWxUaW1lVXMobWVkaWFUaW1lVXMsIG5vd1VzKTsKICAgICB9CiAKLSAgICBtVmlkZW9MYXRlQnlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSByZWFsVGltZVVzOwotICAgIGJvb2wgdG9vTGF0ZSA9IChtVmlkZW9MYXRlQnlVcyA+IDQwMDAwKTsKKyAgICBib29sIHRvb0xhdGUgPSBmYWxzZTsKIAotICAgIGlmICh0b29MYXRlKSB7Ci0gICAgICAgIEFMT0dWKCJ2aWRlbyBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykiLAotICAgICAgICAgICAgIG1WaWRlb0xhdGVCeVVzLCBtVmlkZW9MYXRlQnlVcyAvIDFFNik7CisgICAgaWYgKCFtUGF1c2VkKSB7CisgICAgICAgIGlmIChub3dVcyA9PSAtMSkgeworICAgICAgICAgICAgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICB9CisgICAgICAgIHNldFZpZGVvTGF0ZUJ5VXMobm93VXMgLSByZWFsVGltZVVzKTsKKyAgICAgICAgdG9vTGF0ZSA9IChtVmlkZW9MYXRlQnlVcyA+IDQwMDAwKTsKKworICAgICAgICBpZiAodG9vTGF0ZSkgeworICAgICAgICAgICAgQUxPR1YoInZpZGVvIGxhdGUgYnkgJWxsZCB1cyAoJS4yZiBzZWNzKSIsCisgICAgICAgICAgICAgICAgIG1WaWRlb0xhdGVCeVVzLCBtVmlkZW9MYXRlQnlVcyAvIDFFNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigicmVuZGVyaW5nIHZpZGVvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwKKyAgICAgICAgICAgICAgICAgICAgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FID8gcmVhbFRpbWVVcyA6CisgICAgICAgICAgICAgICAgICAgIChyZWFsVGltZVVzICsgbUFuY2hvclRpbWVNZWRpYVVzIC0gbUFuY2hvclRpbWVSZWFsVXMpKSAvIDFFNik7CisgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigicmVuZGVyaW5nIHZpZGVvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwKLSAgICAgICAgICAgICAgICAobUZsYWdzICYgRkxBR19SRUFMX1RJTUUgPyByZWFsVGltZVVzIDoKLSAgICAgICAgICAgICAgICAocmVhbFRpbWVVcyArIG1BbmNob3JUaW1lTWVkaWFVcyAtIG1BbmNob3JUaW1lUmVhbFVzKSkgLyAxRTYpOwotICAgICAgICBpZiAobVNvZnRSZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtU29mdFJlbmRlcmVyLT5yZW5kZXIoZW50cnktPm1CdWZmZXItPmRhdGEoKSwgZW50cnktPm1CdWZmZXItPnNpemUoKSwgTlVMTCk7CisgICAgICAgIHNldFZpZGVvTGF0ZUJ5VXMoMCk7CisgICAgICAgIGlmICghbVZpZGVvU2FtcGxlUmVjZWl2ZWQgJiYgIW1IYXNBdWRpbykgeworICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBmaXJzdCBmcmFtZSBhZnRlciBhIGZsdXNoIHdvbid0IGJlIHVzZWQgYXMgYW5jaG9yCisgICAgICAgICAgICAvLyB3aGVuIHJlbmRlcmVyIGlzIGluIHBhdXNlZCBzdGF0ZSwgYmVjYXVzZSByZXN1bWUgY2FuIGhhcHBlbiBhbnkgdGltZSBhZnRlciBzZWVrLgorICAgICAgICAgICAgc2V0QW5jaG9yVGltZSgtMSwgLTEpOwogICAgICAgICB9CiAgICAgfQogCisgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+c2V0SW50NjQoInRpbWVzdGFtcE5zIiwgcmVhbFRpbWVVcyAqIDEwMDBsbCk7CiAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+c2V0SW50MzIoInJlbmRlciIsICF0b29MYXRlKTsKICAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5wb3N0KCk7CiAgICAgbVZpZGVvUXVldWUuZXJhc2UobVZpZGVvUXVldWUuYmVnaW4oKSk7CiAgICAgZW50cnkgPSBOVUxMOwogCi0gICAgaWYgKCFtVmlkZW9SZW5kZXJpbmdTdGFydGVkKSB7Ci0gICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQgPSB0cnVlOwotICAgICAgICBub3RpZnlWaWRlb1JlbmRlcmluZ1N0YXJ0KCk7CisgICAgbVZpZGVvU2FtcGxlUmVjZWl2ZWQgPSB0cnVlOworCisgICAgaWYgKCFtUGF1c2VkKSB7CisgICAgICAgIGlmICghbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCkgeworICAgICAgICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICBub3RpZnlWaWRlb1JlbmRlcmluZ1N0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWQoKTsKICAgICB9Ci0KLSAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZCgpOwotCi0gICAgbm90aWZ5UG9zaXRpb24oKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKSB7CkBAIC00NTEsMjIgKzg4MiwyOSBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5RU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0KSB7Cit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5RU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RU9TKTsKICAgICBub3RpZnktPnNldEludDMyKCJhdWRpbyIsIHN0YXRpY19jYXN0PGludDMyX3Q+KGF1ZGlvKSk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZmluYWxSZXN1bHQiLCBmaW5hbFJlc3VsdCk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbm90aWZ5LT5wb3N0KGRlbGF5VXMpOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5QXVkaW9PZmZsb2FkVGVhckRvd24oKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvT2ZmbG9hZFRlYXJEb3duLCBpZCgpKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uUXVldWVCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBpbnQzMl90IGF1ZGlvOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOwogCi0gICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgIG1IYXNBdWRpbyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUhhc1ZpZGVvID0gdHJ1ZTsKKyAgICBzZXRIYXNNZWRpYShhdWRpbyk7CisKKyAgICBpZiAobUhhc1ZpZGVvKSB7CisgICAgICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKyAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlci0+aW5pdCgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGRyb3BCdWZmZXJXaGlsZUZsdXNoaW5nKGF1ZGlvLCBtc2cpKSB7CkBAIC00ODQsMTUgKzkyMiwxOCBAQAogICAgIGVudHJ5Lm1Ob3RpZnlDb25zdW1lZCA9IG5vdGlmeUNvbnN1bWVkOwogICAgIGVudHJ5Lm1PZmZzZXQgPSAwOwogICAgIGVudHJ5Lm1GaW5hbFJlc3VsdCA9IE9LOworICAgIGVudHJ5Lm1CdWZmZXJPcmRpbmFsID0gKyttVG90YWxCdWZmZXJzUXVldWVkOwogCiAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgIG1BdWRpb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7Ci0gICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWUoKTsKKyAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVZpZGVvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKICAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwogICAgIH0KIAorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgaWYgKCFtU3luY1F1ZXVlcyB8fCBtQXVkaW9RdWV1ZS5lbXB0eSgpIHx8IG1WaWRlb1F1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTUwMiw3ICs5NDMsNyBAQAogCiAgICAgaWYgKGZpcnN0QXVkaW9CdWZmZXIgPT0gTlVMTCB8fCBmaXJzdFZpZGVvQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgLy8gRU9TIHNpZ25hbGxlZCBvbiBlaXRoZXIgcXVldWUuCi0gICAgICAgIHN5bmNRdWV1ZXNEb25lKCk7CisgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNTI2LDEwICs5NjcsMTAgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHN5bmNRdWV1ZXNEb25lKCk7CisgICAgc3luY1F1ZXVlc0RvbmVfbCgpOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c3luY1F1ZXVlc0RvbmUoKSB7Cit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c3luY1F1ZXVlc0RvbmVfbCgpIHsKICAgICBpZiAoIW1TeW5jUXVldWVzKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC01MzcsNyArOTc4LDcgQEAKICAgICBtU3luY1F1ZXVlcyA9IGZhbHNlOwogCiAgICAgaWYgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWUoKTsKKyAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CiAgICAgfQogCiAgICAgaWYgKCFtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7CkBAIC01NjEsMTQgKzEwMDIsMTYgQEAKICAgICBlbnRyeS5tRmluYWxSZXN1bHQgPSBmaW5hbFJlc3VsdDsKIAogICAgIGlmIChhdWRpbykgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICBpZiAobUF1ZGlvUXVldWUuZW1wdHkoKSAmJiBtU3luY1F1ZXVlcykgewotICAgICAgICAgICAgc3luY1F1ZXVlc0RvbmUoKTsKKyAgICAgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKICAgICAgICAgfQogICAgICAgICBtQXVkaW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOwotICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlKCk7CisgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChtVmlkZW9RdWV1ZS5lbXB0eSgpICYmIG1TeW5jUXVldWVzKSB7Ci0gICAgICAgICAgICBzeW5jUXVldWVzRG9uZSgpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKICAgICAgICAgfQogICAgICAgICBtVmlkZW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOwogICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CkBAIC01NzksNiArMTAyMiwxNSBAQAogICAgIGludDMyX3QgYXVkaW87CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CiAKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRmx1c2hMb2NrKTsKKyAgICAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBzeW5jaW5nIHRoZSBxdWV1ZXMsIGkuZS4gZHJvcHBpbmcgYXVkaW8gd2hpbGUKICAgICAvLyBhbGlnbmluZyB0aGUgZmlyc3QgYXVkaW8vdmlkZW8gYnVmZmVyIHRpbWVzIGFuZCBvbmx5IG9uZSBvZiB0aGUKICAgICAvLyB0d28gcXVldWVzIGhhcyBkYXRhLCB3ZSBtYXkgc3RhcnZlIHRoYXQgcXVldWUgYnkgbm90IHJlcXVlc3RpbmcKQEAgLTU4NywzMSArMTAzOSw0NyBAQAogICAgIC8vIGNvcnJlc3BvbmRpbmcgZGlzY29udGludWl0eSBvbiB0aGUgb3RoZXIgcXVldWUuCiAgICAgLy8gVGhlcmVmb3JlIHdlJ2xsIHN0b3Agc3luY2luZyB0aGUgcXVldWVzIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtCiAgICAgLy8gaXMgZmx1c2hlZC4KLSAgICBzeW5jUXVldWVzRG9uZSgpOworICAgIHsKKyAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CisgICAgICAgICBzZXRQYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKC0xKTsKKyAgICB9CiAKICAgICBBTE9HVigiZmx1c2hpbmcgJXMiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgZmx1c2hRdWV1ZSgmbUF1ZGlvUXVldWUpOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgZmx1c2hRdWV1ZSgmbUF1ZGlvUXVldWUpOwogCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRmx1c2hMb2NrKTsKLSAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgICAgICsrbUF1ZGlvUXVldWVHZW5lcmF0aW9uOworICAgICAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKTsKKworICAgICAgICAgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgICAgICAgICAgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWUoLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247CiAKLSAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKTsKKyAgICAgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOworICAgICAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBmbHVzaFF1ZXVlKCZtVmlkZW9RdWV1ZSk7CiAKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1GbHVzaExvY2spOwotICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IGZhbHNlOwotCiAgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7CiAgICAgICAgICsrbVZpZGVvUXVldWVHZW5lcmF0aW9uOwogCisgICAgICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyLT5yZXN0YXJ0KCk7CisgICAgICAgIH0KKwogICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydCgpOwogICAgIH0KIAorICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkID0gZmFsc2U7CiAgICAgbm90aWZ5Rmx1c2hDb21wbGV0ZShhdWRpbyk7CiB9CiAKQEAgLTY2MSw3MCArMTEyOSw3MyBAQAogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25BdWRpb1NpbmtDaGFuZ2VkKCkgeworICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICByZXR1cm47CisgICAgfQogICAgIENIRUNLKCFtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyk7CiAgICAgbU51bUZyYW1lc1dyaXR0ZW4gPSAwOworICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuID0gLTE7CiAgICAgdWludDMyX3Qgd3JpdHRlbjsKICAgICBpZiAobUF1ZGlvU2luay0+Z2V0RnJhbWVzV3JpdHRlbigmd3JpdHRlbikgPT0gT0spIHsKICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gPSB3cml0dGVuOwogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeVBvc2l0aW9uKCkgewotICAgIGlmIChtQW5jaG9yVGltZVJlYWxVcyA8IDAgfHwgbUFuY2hvclRpbWVNZWRpYVVzIDwgMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICBpZiAobUxhc3RQb3NpdGlvblVwZGF0ZVVzID49IDAKLSAgICAgICAgICAgICYmIG5vd1VzIDwgbUxhc3RQb3NpdGlvblVwZGF0ZVVzICsga01pblBvc2l0aW9uVXBkYXRlRGVsYXlVcykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1MYXN0UG9zaXRpb25VcGRhdGVVcyA9IG5vd1VzOwotCi0gICAgaW50NjRfdCBwb3NpdGlvblVzID0gKG5vd1VzIC0gbUFuY2hvclRpbWVSZWFsVXMpICsgbUFuY2hvclRpbWVNZWRpYVVzOwotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFBvc2l0aW9uKTsKLSAgICBub3RpZnktPnNldEludDY0KCJwb3NpdGlvblVzIiwgcG9zaXRpb25Vcyk7Ci0gICAgbm90aWZ5LT5zZXRJbnQ2NCgidmlkZW9MYXRlQnlVcyIsIG1WaWRlb0xhdGVCeVVzKTsKLSAgICBub3RpZnktPnBvc3QoKTsKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbkRpc2FibGVPZmZsb2FkQXVkaW8oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtRmxhZ3MgJj0gfkZMQUdfT0ZGTE9BRF9BVURJTzsKKyAgICArK21BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uUGF1c2UoKSB7Ci0gICAgQ0hFQ0soIW1QYXVzZWQpOworICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgIEFMT0dXKCJSZW5kZXJlcjo6b25QYXVzZSgpIGNhbGxlZCB3aGlsZSBhbHJlYWR5IHBhdXNlZCEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICsrbUF1ZGlvUXVldWVHZW5lcmF0aW9uOworICAgICAgICArK21WaWRlb1F1ZXVlR2VuZXJhdGlvbjsKKyAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKTsKKyAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgICAgIHNldFBhdXNlU3RhcnRlZFRpbWVSZWFsVXMoQUxvb3Blcjo6R2V0Tm93VXMoKSk7CisgICAgfQogCiAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKLSAgICArK21BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKLQogICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7Ci0gICAgKyttVmlkZW9RdWV1ZUdlbmVyYXRpb247Ci0KLSAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydCgpOwogCiAgICAgaWYgKG1IYXNBdWRpbykgewogICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOworICAgICAgICBzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOwogICAgIH0KIAogICAgIEFMT0dWKCJub3cgcGF1c2VkIGF1ZGlvIHF1ZXVlIGhhcyAlZCBlbnRyaWVzLCB2aWRlbyBoYXMgJWQgZW50cmllcyIsCiAgICAgICAgICAgbUF1ZGlvUXVldWUuc2l6ZSgpLCBtVmlkZW9RdWV1ZS5zaXplKCkpOwotCi0gICAgbVBhdXNlZCA9IHRydWU7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvblJlc3VtZSgpIHsKKyAgICByZWFkUHJvcGVydGllcygpOworCiAgICAgaWYgKCFtUGF1c2VkKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpZiAobUhhc0F1ZGlvKSB7CisgICAgICAgIGNhbmNlbEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOwogICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwogICAgIH0KIAorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgIGlmIChtUGF1c2VTdGFydGVkVGltZVJlYWxVcyAhPSAtMSkgeworICAgICAgICBpbnQ2NF90IG5ld0FuY2hvclJlYWxVcyA9CisgICAgICAgICAgICBtQW5jaG9yVGltZVJlYWxVcyArIEFMb29wZXI6OkdldE5vd1VzKCkgLSBtUGF1c2VTdGFydGVkVGltZVJlYWxVczsKKyAgICAgICAgc2V0QW5jaG9yVGltZSgKKyAgICAgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMsIG5ld0FuY2hvclJlYWxVcywgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4sIHRydWUgLyogcmVzdW1lICovKTsKKyAgICB9CiAKICAgICBpZiAoIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZSgpOworICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKICAgICB9CiAKICAgICBpZiAoIW1WaWRlb1F1ZXVlLmVtcHR5KCkpIHsKQEAgLTczMiw1ICsxMjAzLDI0MiBAQAogICAgIH0KIH0KIAordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uU2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKSB7CisgICAgaWYgKG1WaWRlb1NjaGVkdWxlciA9PSBOVUxMKSB7CisgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisgICAgfQorICAgIG1WaWRlb1NjaGVkdWxlci0+aW5pdChmcHMpOworfQorCisvLyBUT0RPOiBSZW1vdmUgdW5uZWNlc3NhcnkgY2FsbHMgdG8gZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKCkKKy8vIGFzIGl0IGFjcXVpcmVzIGxvY2tzIGFuZCBtYXkgcXVlcnkgdGhlIGF1ZGlvIGRyaXZlci4KKy8vCisvLyBTb21lIGNhbGxzIGNvdWxkIGNvbmNlaXZhYmx5IHJldHJpZXZlIGV4dHJhcG9sYXRlZCBkYXRhIGluc3RlYWQgb2YKKy8vIGFjY2Vzc2luZyBnZXRUaW1lc3RhbXAoKSBvciBnZXRQb3NpdGlvbigpIGV2ZXJ5IHRpbWUgYSBkYXRhIGJ1ZmZlciB3aXRoCisvLyBhIG1lZGlhIHRpbWUgaXMgcmVjZWl2ZWQuCisvLworaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSB7CisgICAgdWludDMyX3QgbnVtRnJhbWVzUGxheWVkOworICAgIGludDY0X3QgbnVtRnJhbWVzUGxheWVkQXQ7CisgICAgQXVkaW9UaW1lc3RhbXAgdHM7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1N0YWxlVGltZXN0YW1wMTAwbXMgPSAxMDAwMDA7CisKKyAgICBzdGF0dXNfdCByZXMgPSBtQXVkaW9TaW5rLT5nZXRUaW1lc3RhbXAodHMpOworICAgIGlmIChyZXMgPT0gT0spIHsgICAgICAgICAgICAgICAgIC8vIGNhc2UgMTogbWl4aW5nIGF1ZGlvIHRyYWNrcyBhbmQgb2ZmbG9hZGVkIHRyYWNrcy4KKyAgICAgICAgbnVtRnJhbWVzUGxheWVkID0gdHMubVBvc2l0aW9uOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCA9CisgICAgICAgICAgICB0cy5tVGltZS50dl9zZWMgKiAxMDAwMDAwTEwgKyB0cy5tVGltZS50dl9uc2VjIC8gMTAwMDsKKyAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lc3RhbXBBZ2UgPSBub3dVcyAtIG51bUZyYW1lc1BsYXllZEF0OworICAgICAgICBpZiAodGltZXN0YW1wQWdlID4ga1N0YWxlVGltZXN0YW1wMTAwbXMpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gYXVkaW8gRklYTUUuCisgICAgICAgICAgICAvLyBnZXRUaW1lc3RhbXAgcmV0dXJucyBhIHRpbWVzdGFtcCB3aGljaCBtYXkgY29tZSBmcm9tIGF1ZGlvIG1peGluZyB0aHJlYWRzLgorICAgICAgICAgICAgLy8gQWZ0ZXIgcGF1c2luZywgdGhlIE1peGVyVGhyZWFkIG1heSBnbyBpZGxlLCB0aHVzIHRoZSBtVGltZSBlc3RpbWF0ZSBtYXkKKyAgICAgICAgICAgIC8vIGJlY29tZSBzdGFsZS4gQXNzdW1pbmcgdGhhdCB0aGUgTWl4ZXJUaHJlYWQgcnVucyAyMG1zLCB3aXRoIEZhc3RNaXhlciBhdCA1bXMsCisgICAgICAgICAgICAvLyB0aGUgbWF4IGxhdGVuY3kgc2hvdWxkIGJlIGFib3V0IDI1bXMgd2l0aCBhbiBhdmVyYWdlIGFyb3VuZCAxMm1zICh0byBiZSB2ZXJpZmllZCkuCisgICAgICAgICAgICAvLyBGb3Igc2FmZXR5IHdlIHVzZSAxMDBtcy4KKyAgICAgICAgICAgIEFMT0dWKCJnZXRUaW1lc3RhbXA6IHJldHVybmVkIHN0YWxlIHRpbWVzdGFtcCBub3dVcyglbGxkKSBudW1GcmFtZXNQbGF5ZWRBdCglbGxkKSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbm93VXMsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXQpOworICAgICAgICAgICAgbnVtRnJhbWVzUGxheWVkQXQgPSBub3dVcyAtIGtTdGFsZVRpbWVzdGFtcDEwMG1zOworICAgICAgICB9CisgICAgICAgIC8vQUxPR0QoImdldFRpbWVzdGFtcDogT0sgJWQgJWxsZCIsIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdCk7CisgICAgfSBlbHNlIGlmIChyZXMgPT0gV09VTERfQkxPQ0spIHsgLy8gY2FzZSAyOiB0cmFuc2l0b3J5IHN0YXRlIG9uIHN0YXJ0IG9mIGEgbmV3IHRyYWNrCisgICAgICAgIG51bUZyYW1lc1BsYXllZCA9IDA7CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0ID0gbm93VXM7CisgICAgICAgIC8vQUxPR0QoImdldFRpbWVzdGFtcDogV09VTERfQkxPQ0sgJWQgJWxsZCIsCisgICAgICAgIC8vICAgICAgICBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXQpOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMzogdHJhbnNpdG9yeSBhdCBuZXcgdHJhY2sgb3IgYXVkaW8gZmFzdCB0cmFja3MuCisgICAgICAgIHJlcyA9IG1BdWRpb1NpbmstPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpOworICAgICAgICBDSEVDS19FUShyZXMsIChzdGF0dXNfdClPSyk7CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0ID0gbm93VXM7CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0ICs9IDEwMDBMTCAqIG1BdWRpb1NpbmstPmxhdGVuY3koKSAvIDI7IC8qIFhYWCAqLworICAgICAgICAvL0FMT0dEKCJnZXRQb3NpdGlvbjogJWQgJWxsZCIsIG51bUZyYW1lc1BsYXllZCwgbnVtRnJhbWVzUGxheWVkQXQpOworICAgIH0KKworICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgKGludDMyX3QpIGNhc3RpbmcgYmVsb3cgYXMgaXQgbWF5IG92ZXJmbG93IGF0IDEyLjQgaG91cnMuCisgICAgLy9DSEVDS19FUShudW1GcmFtZXNQbGF5ZWQgJiAoMSA8PCAzMSksIDApOyAgLy8gY2FuJ3QgYmUgbmVnYXRpdmUgdW50aWwgMTIuNCBocnMsIHRlc3QKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAoaW50NjRfdCkoKGludDMyX3QpbnVtRnJhbWVzUGxheWVkICogMTAwMExMICogbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpKQorICAgICAgICAgICAgKyBub3dVcyAtIG51bUZyYW1lc1BsYXllZEF0OworICAgIGlmIChkdXJhdGlvblVzIDwgMCkgeworICAgICAgICAvLyBPY2N1cnMgd2hlbiBudW1GcmFtZXNQbGF5ZWQgcG9zaXRpb24gaXMgdmVyeSBzbWFsbCBhbmQgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgLy8gKDEpIEluIGNhc2UgMSwgdGhlIHRpbWUgbm93VXMgaXMgY29tcHV0ZWQgYmVmb3JlIGdldFRpbWVzdGFtcCgpIGlzIGNhbGxlZCBhbmQKKyAgICAgICAgLy8gICAgIG51bUZyYW1lc1BsYXllZEF0IGlzIGdyZWF0ZXIgdGhhbiBub3dVcyBieSB0aW1lIG1vcmUgdGhhbiBudW1GcmFtZXNQbGF5ZWQuCisgICAgICAgIC8vICgyKSBJbiBjYXNlIDMsIHVzaW5nIGdldFBvc2l0aW9uIGFuZCBhZGRpbmcgbUF1ZGlvU2luay0+bGF0ZW5jeSgpIHRvCisgICAgICAgIC8vICAgICBudW1GcmFtZXNQbGF5ZWRBdCwgYnkgYSB0aW1lIGFtb3VudCBncmVhdGVyIHRoYW4gbnVtRnJhbWVzUGxheWVkLgorICAgICAgICAvLworICAgICAgICAvLyBCb3RoIG9mIHRoZXNlIGFyZSB0cmFuc2l0b3J5IGNvbmRpdGlvbnMuCisgICAgICAgIEFMT0dWKCJnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXM6IG5lZ2F0aXZlIGR1cmF0aW9uICVsbGQgc2V0IHRvIHplcm8iLCAobG9uZyBsb25nKWR1cmF0aW9uVXMpOworICAgICAgICBkdXJhdGlvblVzID0gMDsKKyAgICB9CisgICAgQUxPR1YoImdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25VcyglbGxkKSBub3dVcyglbGxkKSBmcmFtZXMoJXUpIGZyYW1lc0F0KCVsbGQpIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpZHVyYXRpb25VcywgKGxvbmcgbG9uZylub3dVcywgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0KTsKKyAgICByZXR1cm4gZHVyYXRpb25VczsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uQXVkaW9PZmZsb2FkVGVhckRvd24oQXVkaW9PZmZsb2FkVGVhckRvd25SZWFzb24gcmVhc29uKSB7CisgICAgaWYgKG1BdWRpb09mZmxvYWRUb3JuRG93bikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1BdWRpb09mZmxvYWRUb3JuRG93biA9IHRydWU7CisKKyAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzOworICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSAhPSBPSykgeworICAgICAgICBjdXJyZW50UG9zaXRpb25VcyA9IDA7CisgICAgfQorCisgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0QXVkaW9PZmZsb2FkVGVhckRvd24pOworICAgIG5vdGlmeS0+c2V0SW50NjQoInBvc2l0aW9uVXMiLCBjdXJyZW50UG9zaXRpb25Vcyk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwgcmVhc29uKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnN0YXJ0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCkgeworICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0LCBpZCgpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uKTsKKyAgICAgICAgbXNnLT5wb3N0KGtPZmZsb2FkUGF1c2VNYXhVcyk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6Y2FuY2VsQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCkgeworICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICArK21BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uOworICAgIH0KK30KKworYm9vbCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uT3BlbkF1ZGlvU2luaygKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9mZmxvYWRPbmx5KCVkKSBvZmZsb2FkaW5nQXVkaW8oJWQpIiwKKyAgICAgICAgICAgIG9mZmxvYWRPbmx5LCBvZmZsb2FkaW5nQXVkaW8oKSk7CisgICAgYm9vbCBhdWRpb1NpbmtDaGFuZ2VkID0gZmFsc2U7CisKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzOworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSk7CisKKyAgICBpbnQzMl90IGNoYW5uZWxNYXNrOworICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImNoYW5uZWwtbWFzayIsICZjaGFubmVsTWFzaykpIHsKKyAgICAgICAgLy8gc2lnbmFsIHRvIHRoZSBBdWRpb1NpbmsgdG8gZGVyaXZlIHRoZSBtYXNrIGZyb20gY291bnQuCisgICAgICAgIGNoYW5uZWxNYXNrID0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSOworICAgIH0KKworICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpOworCisgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbWFwTWltZVRvQXVkaW9Gb3JtYXQoYXVkaW9Gb3JtYXQsIG1pbWUuY19zdHIoKSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkbid0IG1hcCBtaW1lIFwiJXNcIiB0byBhIHZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2Zvcm1hdCIsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICBvbkRpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJNaW1lIFwiJXNcIiBtYXBwZWQgdG8gYXVkaW9fZm9ybWF0IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBtaW1lLmNfc3RyKCksIGF1ZGlvRm9ybWF0KTsKKworICAgICAgICAgICAgaW50IGF2Z0JpdFJhdGUgPSAtMTsKKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJiaXQtcmF0ZSIsICZhdmdCaXRSYXRlKTsKKworICAgICAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlID0gLTE7CisgICAgICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQworICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXQtPmZpbmRJbnQzMigiYWFjLXByb2ZpbGUiLCAmYWFjUHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBSZWRlZmluZSBBQUMgZm9ybWF0IGFzIHBlciBhYWMgcHJvZmlsZQorICAgICAgICAgICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBhYWNQcm9maWxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3Qgb2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPSAtMTsKKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb25VcyIsICZvZmZsb2FkSW5mby5kdXJhdGlvbl91cyk7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCA9IGF1ZGlvRm9ybWF0OworICAgICAgICAgICAgb2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5iaXRfcmF0ZSA9IGF2Z0JpdFJhdGU7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5oYXNfdmlkZW8gPSBoYXNWaWRlbzsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmlzX3N0cmVhbWluZyA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChtZW1jbXAoJm1DdXJyZW50T2ZmbG9hZEluZm8sICZvZmZsb2FkSW5mbywgc2l6ZW9mKG9mZmxvYWRJbmZvKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBubyBjaGFuZ2UgaW4gb2ZmbG9hZCBtb2RlIik7CisgICAgICAgICAgICAgICAgLy8gbm8gY2hhbmdlIGZyb20gcHJldmlvdXMgY29uZmlndXJhdGlvbiwgZXZlcnl0aGluZyBvay4KKyAgICAgICAgICAgICAgICByZXR1cm4gb2ZmbG9hZGluZ0F1ZGlvKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogdHJ5IHRvIG9wZW4gQXVkaW9TaW5rIGluIG9mZmxvYWQgbW9kZSIpOworICAgICAgICAgICAgZmxhZ3MgfD0gQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDsKKyAgICAgICAgICAgIGZsYWdzICY9IH5BVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKKyAgICAgICAgICAgIGF1ZGlvU2lua0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPm9wZW4oCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICA4IC8qIGJ1ZmZlckNvdW50ICovLAorICAgICAgICAgICAgICAgICAgICAmTnVQbGF5ZXI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KWZsYWdzLAorICAgICAgICAgICAgICAgICAgICAmb2ZmbG9hZEluZm8pOworCisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBsYXliYWNrIGlzIG9mZmxvYWRlZCB0byBoL3csIHdlIHBhc3MKKyAgICAgICAgICAgICAgICAvLyB0aGUgSEFMIHNvbWUgbWV0YWRhdGEgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIGZvciBQQ00gYmVjYXVzZSBpdAorICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgZ29pbmcgdGhyb3VnaCB0aGUgQXVkaW9GbGluZ2VyIG1peGVyCisgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHJlYWNoaW5nIHRoZSBoYXJkd2FyZS4KKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IG9mZmxvYWRJbmZvOworICAgICAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgQUxPR1ZfSUYoZXJyID09IE9LLCAib3BlbkF1ZGlvU2luazogb2ZmbG9hZCBzdWNjZWVkZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCwgZmFsbCBiYWNrIHRvIG5vbiBvZmZsb2FkIG1vZGUuCisgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICBvbkRpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogb2ZmbG9hZCBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW9mZmxvYWRPbmx5ICYmICFvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBmbGFncyAmPSB+QVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDsKKyAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9wZW4gQXVkaW9TaW5rIGluIE5PTi1vZmZsb2FkIG1vZGUiKTsKKworICAgICAgICBhdWRpb1NpbmtDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgIENIRUNLX0VRKG1BdWRpb1NpbmstPm9wZW4oCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICA4IC8qIGJ1ZmZlckNvdW50ICovLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpZmxhZ3MpLAorICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgIH0KKyAgICBpZiAoYXVkaW9TaW5rQ2hhbmdlZCkgeworICAgICAgICBvbkF1ZGlvU2lua0NoYW5nZWQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gb2ZmbG9hZGluZ0F1ZGlvKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbkNsb3NlQXVkaW9TaW5rKCkgeworICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCmluZGV4IDkxMjRlMDMuLjdiNDZhNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaApAQCAtMjMsMTYgKzIzLDIyIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwotY2xhc3MgU29mdHdhcmVSZW5kZXJlcjsKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OlJlbmRlcmVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKICAgICAgICAgRkxBR19SRUFMX1RJTUUgPSAxLAorICAgICAgICBGTEFHX09GRkxPQURfQVVESU8gPSAyLAogICAgIH07CiAgICAgUmVuZGVyZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZzaW5rLAogICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7CiAKKyAgICBzdGF0aWMgc2l6ZV90IEF1ZGlvU2lua0NhbGxiYWNrKAorICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICptZSwKKyAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KTsKKwogICAgIHZvaWQgcXVldWVCdWZmZXIoCiAgICAgICAgICAgICBib29sIGF1ZGlvLAogICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKQEAgLTQ2LDE4ICs1Miw0NyBAQAogCiAgICAgdm9pZCBzaWduYWxBdWRpb1NpbmtDaGFuZ2VkKCk7CiAKKyAgICB2b2lkIHNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKTsKKwogICAgIHZvaWQgcGF1c2UoKTsKICAgICB2b2lkIHJlc3VtZSgpOwogCisgICAgdm9pZCBzZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpOworCisgICAgLy8gRm9sbG93aW5nIHNldHRlcnMgYW5kIGdldHRlcnMgYXJlIHByb3RlY3RlZCBieSBtVGltZUxvY2suCisgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpOworICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbigKKyAgICAgICAgICAgIGludDY0X3QgKm1lZGlhVXMsIGludDY0X3Qgbm93VXMsIGJvb2wgYWxsb3dQYXN0UXVldWVkVmlkZW8gPSBmYWxzZSk7CisgICAgdm9pZCBzZXRIYXNNZWRpYShib29sIGF1ZGlvKTsKKyAgICB2b2lkIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lKGludDY0X3QgbWVkaWFVcyk7CisgICAgdm9pZCBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkKGludDY0X3QgbWVkaWFVcyk7CisgICAgdm9pZCBzZXRBbmNob3JUaW1lKAorICAgICAgICAgICAgaW50NjRfdCBtZWRpYVVzLCBpbnQ2NF90IHJlYWxVcywgaW50NjRfdCBudW1GcmFtZXNXcml0dGVuID0gLTEsIGJvb2wgcmVzdW1lID0gZmFsc2UpOworICAgIHZvaWQgc2V0VmlkZW9MYXRlQnlVcyhpbnQ2NF90IGxhdGVVcyk7CisgICAgaW50NjRfdCBnZXRWaWRlb0xhdGVCeVVzKCk7CisgICAgdm9pZCBzZXRQYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKGludDY0X3QgcmVhbFVzKTsKKworICAgIGJvb2wgb3BlbkF1ZGlvU2luaygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgYm9vbCBvZmZsb2FkT25seSwKKyAgICAgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisgICAgdm9pZCBjbG9zZUF1ZGlvU2luaygpOworCiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0RU9TICAgICAgICAgICAgICAgICA9ICdlb3MgJywKICAgICAgICAga1doYXRGbHVzaENvbXBsZXRlICAgICAgID0gJ2ZsdUMnLAogICAgICAgICBrV2hhdFBvc2l0aW9uICAgICAgICAgICAgPSAncG9zaScsCiAgICAgICAgIGtXaGF0VmlkZW9SZW5kZXJpbmdTdGFydCA9ICd2ZHJkJywKICAgICAgICAga1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0ID0gJ21kcmQnLAorICAgICAgICBrV2hhdEF1ZGlvT2ZmbG9hZFRlYXJEb3duID0gJ2FPVEQnLAorICAgICAgICBrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCA9ICdhT1BUJywKICAgICB9OwogCi0gICAgdm9pZCBzZXRTb2Z0UmVuZGVyZXIoU29mdHdhcmVSZW5kZXJlciAqc29mdFJlbmRlcmVyKTsKKyAgICBlbnVtIEF1ZGlvT2ZmbG9hZFRlYXJEb3duUmVhc29uIHsKKyAgICAgICAga0R1ZVRvRXJyb3IgPSAwLAorICAgICAgICBrRHVlVG9UaW1lb3V0LAorICAgIH07CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5SZW5kZXJlcigpOwpAQCAtNjYsMTQgKzEwMSwyMCBAQAogCiBwcml2YXRlOgogICAgIGVudW0gewotICAgICAgICBrV2hhdERyYWluQXVkaW9RdWV1ZSAgICA9ICdkcmFBJywKLSAgICAgICAga1doYXREcmFpblZpZGVvUXVldWUgICAgPSAnZHJhVicsCi0gICAgICAgIGtXaGF0UXVldWVCdWZmZXIgICAgICAgID0gJ3F1ZUInLAotICAgICAgICBrV2hhdFF1ZXVlRU9TICAgICAgICAgICA9ICdxRU9TJywKLSAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgPSAnZmx1cycsCi0gICAgICAgIGtXaGF0QXVkaW9TaW5rQ2hhbmdlZCAgID0gJ2F1U0MnLAotICAgICAgICBrV2hhdFBhdXNlICAgICAgICAgICAgICA9ICdwYXVzJywKLSAgICAgICAga1doYXRSZXN1bWUgICAgICAgICAgICAgPSAncmVzbScsCisgICAgICAgIGtXaGF0RHJhaW5BdWRpb1F1ZXVlICAgICA9ICdkcmFBJywKKyAgICAgICAga1doYXREcmFpblZpZGVvUXVldWUgICAgID0gJ2RyYVYnLAorICAgICAgICBrV2hhdFBvc3REcmFpblZpZGVvUXVldWUgPSAncERWUScsCisgICAgICAgIGtXaGF0UXVldWVCdWZmZXIgICAgICAgICA9ICdxdWVCJywKKyAgICAgICAga1doYXRRdWV1ZUVPUyAgICAgICAgICAgID0gJ3FFT1MnLAorICAgICAgICBrV2hhdEZsdXNoICAgICAgICAgICAgICAgPSAnZmx1cycsCisgICAgICAgIGtXaGF0QXVkaW9TaW5rQ2hhbmdlZCAgICA9ICdhdVNDJywKKyAgICAgICAga1doYXRQYXVzZSAgICAgICAgICAgICAgID0gJ3BhdXMnLAorICAgICAgICBrV2hhdFJlc3VtZSAgICAgICAgICAgICAgPSAncmVzbScsCisgICAgICAgIGtXaGF0T3BlbkF1ZGlvU2luayAgICAgICA9ICdvcG5BJywKKyAgICAgICAga1doYXRDbG9zZUF1ZGlvU2luayAgICAgID0gJ2Nsc0EnLAorICAgICAgICBrV2hhdFN0b3BBdWRpb1NpbmsgICAgICAgPSAnc3RwQScsCisgICAgICAgIGtXaGF0RGlzYWJsZU9mZmxvYWRBdWRpbyA9ICdub09BJywKKyAgICAgICAga1doYXRTZXRWaWRlb0ZyYW1lUmF0ZSAgID0gJ3NWRlInLAogICAgIH07CiAKICAgICBzdHJ1Y3QgUXVldWVFbnRyeSB7CkBAIC04MSw0NCArMTIyLDcyIEBACiAgICAgICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5Q29uc3VtZWQ7CiAgICAgICAgIHNpemVfdCBtT2Zmc2V0OwogICAgICAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7CisgICAgICAgIGludDMyX3QgbUJ1ZmZlck9yZGluYWw7CiAgICAgfTsKIAogICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5Qb3NpdGlvblVwZGF0ZURlbGF5VXM7CiAKICAgICBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKLSAgICBTb2Z0d2FyZVJlbmRlcmVyICptU29mdFJlbmRlcmVyOwogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIE11dGV4IG1Mb2NrOwogICAgIHVpbnQzMl90IG1GbGFnczsKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1BdWRpb1F1ZXVlOwogICAgIExpc3Q8UXVldWVFbnRyeT4gbVZpZGVvUXVldWU7CiAgICAgdWludDMyX3QgbU51bUZyYW1lc1dyaXR0ZW47CisgICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlcj4gbVZpZGVvU2NoZWR1bGVyOwogCiAgICAgYm9vbCBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZzsKICAgICBib29sIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nOwogICAgIGludDMyX3QgbUF1ZGlvUXVldWVHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbVZpZGVvUXVldWVHZW5lcmF0aW9uOwogCisgICAgTXV0ZXggbVRpbWVMb2NrOworICAgIC8vIHxtVGltZUxvY2t8IHByb3RlY3RzIHRoZSBmb2xsb3dpbmcgNyBtZW1iZXIgdmFycyB0aGF0IGFyZSByZWxhdGVkIHRvIHRpbWUuCisgICAgLy8gTm90ZTogdGhvc2UgbWVtYmVycyBhcmUgb25seSB3cml0dGVuIG9uIFJlbmRlcmVyIHRocmVhZCwgc28gcmVhZGluZyBvbiBSZW5kZXJlciB0aHJlYWQKKyAgICAvLyBkb2Vzbid0IG5lZWQgdG8gYmUgcHJvdGVjdGVkLiBPdGhlcndpc2UgYWNjZXNzaW5nIHRob3NlIG1lbWJlcnMgbXVzdCBiZSBwcm90ZWN0ZWQgYnkKKyAgICAvLyB8bVRpbWVMb2NrfC4KKyAgICAvLyBUT0RPOiBtb3ZlIHRob3NlIG1lbWJlcnMgdG8gYSBzZXBlcmF0ZWQgbWVkaWEgY2xvY2sgY2xhc3MuCisgICAgaW50NjRfdCBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzOwogICAgIGludDY0X3QgbUFuY2hvclRpbWVNZWRpYVVzOwogICAgIGludDY0X3QgbUFuY2hvclRpbWVSZWFsVXM7CisgICAgaW50NjRfdCBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbjsKKyAgICBpbnQ2NF90IG1BbmNob3JNYXhNZWRpYVVzOworICAgIGludDY0X3QgbVZpZGVvTGF0ZUJ5VXM7CisgICAgYm9vbCBtSGFzQXVkaW87CisgICAgYm9vbCBtSGFzVmlkZW87CisgICAgaW50NjRfdCBtUGF1c2VTdGFydGVkVGltZVJlYWxVczsKIAogICAgIE11dGV4IG1GbHVzaExvY2s7ICAvLyBwcm90ZWN0cyB0aGUgZm9sbG93aW5nIDIgbWVtYmVyIHZhcnMuCiAgICAgYm9vbCBtRmx1c2hpbmdBdWRpbzsKICAgICBib29sIG1GbHVzaGluZ1ZpZGVvOwogCi0gICAgYm9vbCBtSGFzQXVkaW87Ci0gICAgYm9vbCBtSGFzVmlkZW87CiAgICAgYm9vbCBtU3luY1F1ZXVlczsKIAogICAgIGJvb2wgbVBhdXNlZDsKKyAgICBib29sIG1WaWRlb1NhbXBsZVJlY2VpdmVkOwogICAgIGJvb2wgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZDsKICAgICBpbnQzMl90IG1WaWRlb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbjsKIAogICAgIGludDY0X3QgbUxhc3RQb3NpdGlvblVwZGF0ZVVzOwotICAgIGludDY0X3QgbVZpZGVvTGF0ZUJ5VXM7CisKKyAgICBpbnQzMl90IG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uOworICAgIGJvb2wgbUF1ZGlvT2ZmbG9hZFRvcm5Eb3duOworICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG1DdXJyZW50T2ZmbG9hZEluZm87CisKKyAgICBpbnQzMl90IG1Ub3RhbEJ1ZmZlcnNRdWV1ZWQ7CisgICAgaW50MzJfdCBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZDsKKworCisgICAgc2l6ZV90IGZpbGxBdWRpb0J1ZmZlcih2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKIAogICAgIGJvb2wgb25EcmFpbkF1ZGlvUXVldWUoKTsKLSAgICB2b2lkIHBvc3REcmFpbkF1ZGlvUXVldWUoaW50NjRfdCBkZWxheVVzID0gMCk7CisgICAgaW50NjRfdCBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKTsKKyAgICBpbnQ2NF90IGdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKTsKKyAgICB2b2lkIHBvc3REcmFpbkF1ZGlvUXVldWVfbChpbnQ2NF90IGRlbGF5VXMgPSAwKTsKKworICAgIHZvaWQgb25OZXdBdWRpb01lZGlhVGltZShpbnQ2NF90IG1lZGlhVGltZVVzKTsKKyAgICBpbnQ2NF90IGdldFJlYWxUaW1lVXMoaW50NjRfdCBtZWRpYVRpbWVVcywgaW50NjRfdCBub3dVcyk7CiAKICAgICB2b2lkIG9uRHJhaW5WaWRlb1F1ZXVlKCk7CiAgICAgdm9pZCBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CkBAIC0xMzAsMTggKzE5OSwzMyBAQAogICAgIHZvaWQgb25RdWV1ZUVPUyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvbkZsdXNoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uQXVkaW9TaW5rQ2hhbmdlZCgpOworICAgIHZvaWQgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CiAgICAgdm9pZCBvblBhdXNlKCk7CiAgICAgdm9pZCBvblJlc3VtZSgpOworICAgIHZvaWQgb25TZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpOworICAgIHZvaWQgb25BdWRpb09mZmxvYWRUZWFyRG93bihBdWRpb09mZmxvYWRUZWFyRG93blJlYXNvbiByZWFzb24pOworICAgIGJvb2wgb25PcGVuQXVkaW9TaW5rKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBib29sIG9mZmxvYWRPbmx5LAorICAgICAgICAgICAgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2b2lkIG9uQ2xvc2VBdWRpb1NpbmsoKTsKIAotICAgIHZvaWQgbm90aWZ5RU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0KTsKKyAgICB2b2lkIG5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzID0gMCk7CiAgICAgdm9pZCBub3RpZnlGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8pOwogICAgIHZvaWQgbm90aWZ5UG9zaXRpb24oKTsKICAgICB2b2lkIG5vdGlmeVZpZGVvTGF0ZUJ5KGludDY0X3QgbGF0ZUJ5VXMpOwogICAgIHZvaWQgbm90aWZ5VmlkZW9SZW5kZXJpbmdTdGFydCgpOworICAgIHZvaWQgbm90aWZ5QXVkaW9PZmZsb2FkVGVhckRvd24oKTsKIAogICAgIHZvaWQgZmx1c2hRdWV1ZShMaXN0PFF1ZXVlRW50cnk+ICpxdWV1ZSk7CiAgICAgYm9vbCBkcm9wQnVmZmVyV2hpbGVGbHVzaGluZyhib29sIGF1ZGlvLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBzeW5jUXVldWVzRG9uZSgpOworICAgIHZvaWQgc3luY1F1ZXVlc0RvbmVfbCgpOworCisgICAgYm9vbCBvZmZsb2FkaW5nQXVkaW8oKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgRkxBR19PRkZMT0FEX0FVRElPKSAhPSAwOyB9CisKKyAgICB2b2lkIHN0YXJ0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7CisgICAgdm9pZCBjYW5jZWxBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlbmRlcmVyKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCmluZGV4IGU1MDUzM2EuLjJmMDZjMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCkBAIC0yMSwxMSArMjEsMTUgQEAKICNpbmNsdWRlICJOdVBsYXllci5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBNZXRhRGF0YTsKK3N0cnVjdCBNZWRpYUJ1ZmZlcjsKIAogc3RydWN0IE51UGxheWVyOjpTb3VyY2UgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpAQCAtMzQsMTYgKzM4LDIwIEBACiAgICAgICAgIEZMQUdfQ0FOX1NFRUtfRk9SV0FSRCAgID0gNCwgIC8vIHRoZSAiMTAgc2VjIGZvcndhcmQgYnV0dG9uIgogICAgICAgICBGTEFHX0NBTl9TRUVLICAgICAgICAgICA9IDgsICAvLyB0aGUgInNlZWsgYmFyIgogICAgICAgICBGTEFHX0RZTkFNSUNfRFVSQVRJT04gICA9IDE2LAorICAgICAgICBGTEFHX1NFQ1VSRSAgICAgICAgICAgICA9IDMyLAogICAgIH07CiAKICAgICBlbnVtIHsKICAgICAgICAga1doYXRQcmVwYXJlZCwKICAgICAgICAga1doYXRGbGFnc0NoYW5nZWQsCiAgICAgICAgIGtXaGF0VmlkZW9TaXplQ2hhbmdlZCwKKyAgICAgICAga1doYXRCdWZmZXJpbmdVcGRhdGUsCiAgICAgICAgIGtXaGF0QnVmZmVyaW5nU3RhcnQsCiAgICAgICAgIGtXaGF0QnVmZmVyaW5nRW5kLAogICAgICAgICBrV2hhdFN1YnRpdGxlRGF0YSwKKyAgICAgICAga1doYXRUaW1lZFRleHREYXRhLAogICAgICAgICBrV2hhdFF1ZXVlRGVjb2RlclNodXRkb3duLAorICAgICAgICBrV2hhdERybU5vTGljZW5zZSwKICAgICB9OwogCiAgICAgLy8gVGhlIHByb3ZpZGVzIG1lc3NhZ2UgaXMgdXNlZCB0byBub3RpZnkgdGhlIHBsYXllciBhYm91dCB2YXJpb3VzCkBAIC01OSwyOCArNjcsNDUgQEAKICAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKSB7fQogICAgIHZpcnR1YWwgdm9pZCByZXN1bWUoKSB7fQogCisgICAgLy8gRXhwbGljaXRseSBkaXNjb25uZWN0IHRoZSB1bmRlcmxpbmcgZGF0YSBzb3VyY2UKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpIHt9CisKICAgICAvLyBSZXR1cm5zIE9LIGlmZiBtb3JlIGRhdGEgd2FzIGF2YWlsYWJsZSwKICAgICAvLyBhbiBlcnJvciBvciBFUlJPUl9FTkRfT0ZfU1RSRUFNIGlmIG5vdC4KICAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCkgPSAwOwogCiAgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0KGJvb2wgYXVkaW8pOworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGEoYm9vbCAvKiBhdWRpbyAqLykgeyByZXR1cm4gTlVMTDsgfQorICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZpbGVGb3JtYXRNZXRhKCkgY29uc3QgeyByZXR1cm4gTlVMTDsgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdCgKICAgICAgICAgICAgIGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKiAvKiBkdXJhdGlvblVzICovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdCB7CisgICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCAvKiB0cmFja0luZGV4ICovKSBjb25zdCB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgLyogdHlwZSAqLykgY29uc3QgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCAvKiB0cmFja0luZGV4ICovLCBib29sIC8qIHNlbGVjdCAqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCAvKiBzZWVrVGltZVVzICovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoYm9vbCAvKiBhdWRpbyAqLywgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICYvKiBidWZmZXJzICovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTkzLDEyICsxMTgsMTAgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIHsgcmV0dXJuIE5VTEw7IH0KLQogICAgIHNwPEFNZXNzYWdlPiBkdXBOb3RpZnkoKSBjb25zdCB7IHJldHVybiBtTm90aWZ5LT5kdXAoKTsgfQogCiAgICAgdm9pZCBub3RpZnlGbGFnc0NoYW5nZWQodWludDMyX3QgZmxhZ3MpOwotICAgIHZvaWQgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisgICAgdm9pZCBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0ID0gTlVMTCk7CiAgICAgdm9pZCBub3RpZnlQcmVwYXJlZChzdGF0dXNfdCBlcnIgPSBPSyk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKaW5kZXggMThjZjZkMS4uZmZhY2I4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgIk15SGFuZGxlci5oIgogI2luY2x1ZGUgIlNEUExvYWRlci5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCkBAIC0zMywxMiArMzQsMTQgQEAKIAogTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OlJUU1BTb3VyY2UoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAogICAgICAgICBib29sIHVpZFZhbGlkLAogICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIGJvb2wgaXNTRFApCiAgICAgOiBTb3VyY2Uobm90aWZ5KSwKKyAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCiAgICAgICBtVVJMKHVybCksCiAgICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAogICAgICAgbVVJRCh1aWQpLApAQCAtNjcsNiArNzAsNyBAQAogCiBOdVBsYXllcjo6UlRTUFNvdXJjZTo6flJUU1BTb3VyY2UoKSB7CiAgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgeworICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKICAgICAgICAgbUxvb3Blci0+c3RvcCgpOwogICAgIH0KIH0KQEAgLTc3LDE0ICs4MSwxMyBAQAogICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJydHNwIik7CiAgICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7CiAKLSAgICAgICAgbVJlZmxlY3RvciA9IG5ldyBBSGFuZGxlclJlZmxlY3RvcjxSVFNQU291cmNlPih0aGlzKTsKLSAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CiAgICAgfQogCiAgICAgQ0hFQ0sobUhhbmRsZXIgPT0gTlVMTCk7CiAgICAgQ0hFQ0sobVNEUExvYWRlciA9PSBOVUxMKTsKIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnksIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnksIGlkKCkpOwogCiAgICAgQ0hFQ0tfRVEobVN0YXRlLCAoaW50KURJU0NPTk5FQ1RFRCk7CiAgICAgbVN0YXRlID0gQ09OTkVDVElORzsKQEAgLTkyLDcgKzk1LDcgQEAKICAgICBpZiAobUlzU0RQKSB7CiAgICAgICAgIG1TRFBMb2FkZXIgPSBuZXcgU0RQTG9hZGVyKG5vdGlmeSwKICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pID8gU0RQTG9hZGVyOjprRmxhZ0luY29nbml0byA6IDAsCi0gICAgICAgICAgICAgICAgbVVJRFZhbGlkLCBtVUlEKTsKKyAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UpOwogCiAgICAgICAgIG1TRFBMb2FkZXItPmxvYWQoCiAgICAgICAgICAgICAgICAgbVVSTC5jX3N0cigpLCBtRXh0cmFIZWFkZXJzLmlzRW1wdHkoKSA/IE5VTEwgOiAmbUV4dHJhSGVhZGVycyk7CkBAIC0xMTUsNyArMTE4LDcgQEAKICAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERpc2Nvbm5lY3QsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREaXNjb25uZWN0LCBpZCgpKTsKIAogICAgIHNwPEFNZXNzYWdlPiBkdW1teTsKICAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZkdW1teSk7CkBAIC0zMDIsNyArMzA1LDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UGVyZm9ybVNlZWssIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQZXJmb3JtU2VlaywgaWQoKSk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsICsrbVNlZWtHZW5lcmF0aW9uKTsKICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCBzZWVrVGltZVVzKTsKICAgICBtc2ctPnBvc3QoMjAwMDAwbGwpOwpAQCAtMzUzLDcgKzM1Niw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIG9uQ29ubmVjdGVkKCk7CiAKLSAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoMCwgMCk7CisgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKCk7CiAKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKIApAQCAtNTAyLDcgKzUwNSwxMCBAQAogICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGluZm8tPm1Tb3VyY2U7CiAgICAgICAgICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzb3VyY2UtPnF1ZXVlRGlzY29udGludWl0eShBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSywgTlVMTCk7CisgICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGRpc2NhcmQgKi8pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKQEAgLTYwNyw3ICs2MTMsNyBAQAogICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaW5kIHVybCBpbiBTRFAiKTsKICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5LCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnksIGlkKCkpOwogCiAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIocnRzcFVyaS5jX3N0cigpLCBub3RpZnksIG1VSURWYWxpZCwgbVVJRCk7CiAgICAgICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmgKaW5kZXggOGNmMzRhMC4uZjFjYWU1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCkBAIC0yMiw4ICsyMiw2IEBACiAKICNpbmNsdWRlICJBVFNQYXJzZXIuaCIKIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUxvb3BlcjsKQEAgLTM0LDYgKzMyLDcgQEAKIHN0cnVjdCBOdVBsYXllcjo6UlRTUFNvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjo6U291cmNlIHsKICAgICBSVFNQU291cmNlKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCiAgICAgICAgICAgICBib29sIHVpZFZhbGlkID0gZmFsc2UsCkBAIC04OCw2ICs4Nyw3IEBACiAgICAgICAgIGJvb2wgbU5QVE1hcHBpbmdWYWxpZDsKICAgICB9OwogCisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKICAgICBBU3RyaW5nIG1VUkw7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKICAgICBib29sIG1VSURWYWxpZDsKQEAgLTEwMCw3ICsxMDAsNiBAQAogICAgIGJvb2wgbUJ1ZmZlcmluZzsKIAogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7Ci0gICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8UlRTUFNvdXJjZT4gPiBtUmVmbGVjdG9yOwogICAgIHNwPE15SGFuZGxlcj4gbUhhbmRsZXI7CiAgICAgc3A8U0RQTG9hZGVyPiBtU0RQTG9hZGVyOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCmluZGV4IDI4ZjBkNTAuLjJlOWEyOWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCkBAIC00NCw3ICs0NCw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlN0cmVhbWluZ1NvdXJjZTo6cHJlcGFyZUFzeW5jKCkgewotICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoMCwgMCk7CisgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgpOwogICAgIG5vdGlmeUZsYWdzQ2hhbmdlZCgwKTsKICAgICBub3RpZnlQcmVwYXJlZCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL21wNC9NUDRTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL21wNC9NUDRTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzFkOTQ3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9tcDQvTVA0U291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIk1QNFNvdXJjZS5oIgotCi0jaW5jbHVkZSAiRnJhZ21lbnRlZE1QNFBhcnNlci5oIgotI2luY2x1ZGUgIi4uL051UGxheWVyU3RyZWFtTGlzdGVuZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBTdHJlYW1Tb3VyY2UgOiBwdWJsaWMgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U291cmNlIHsKLSAgICBTdHJlYW1Tb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkKLSAgICAgICAgOiBtTGlzdGVuZXIobmV3IE51UGxheWVyOjpOdVBsYXllclN0cmVhbUxpc3RlbmVyKHNvdXJjZSwgMCkpLAotICAgICAgICAgIG1Qb3NpdGlvbigwKSB7Ci0gICAgICAgIG1MaXN0ZW5lci0+c3RhcnQoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBpZiAob2Zmc2V0IDwgbVBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVQSVBFOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKG9mZnNldCA+IG1Qb3NpdGlvbikgewotICAgICAgICAgICAgY2hhciBidWZmZXJbMTAyNF07Ci0gICAgICAgICAgICBvZmY2NF90IHNraXBCeXRlcyA9IG9mZnNldCAtIG1Qb3NpdGlvbjsKLSAgICAgICAgICAgIGlmIChza2lwQnl0ZXMgPiBzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIHNraXBCeXRlcyA9IHNpemVvZihidWZmZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gZXh0cmE7Ci0gICAgICAgICAgICBzc2l6ZV90IG47Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgbiA9IG1MaXN0ZW5lci0+cmVhZChidWZmZXIsIHNraXBCeXRlcywgJmV4dHJhKTsKLQotICAgICAgICAgICAgICAgIGlmIChuID09IC1FV09VTERCTE9DSykgewotICAgICAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMDApOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoInNraXBwZWQgJWxkIGJ5dGVzIGF0IG9mZnNldCAlbGxkIiwgbiwgbVBvc2l0aW9uKTsKLQotICAgICAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Qb3NpdGlvbiArPSBuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhOwotICAgICAgICBzaXplX3QgdG90YWwgPSAwOwotICAgICAgICB3aGlsZSAodG90YWwgPCBzaXplKSB7Ci0gICAgICAgICAgICBzc2l6ZV90IG4gPSBtTGlzdGVuZXItPnJlYWQoCi0gICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopZGF0YSArIHRvdGFsLCBzaXplIC0gdG90YWwsICZleHRyYSk7Ci0KLSAgICAgICAgICAgIGlmIChuID09IC1FV09VTERCTE9DSykgewotICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwMCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgIG1Qb3NpdGlvbiArPSB0b3RhbDsKLSAgICAgICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdG90YWwgKz0gbjsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJyZWFkICVsZCBieXRlcyBhdCBvZmZzZXQgJWxsZCIsIG4sIG1Qb3NpdGlvbik7Ci0KLSAgICAgICAgbVBvc2l0aW9uICs9IHRvdGFsOwotCi0gICAgICAgIHJldHVybiB0b3RhbDsKLSAgICB9Ci0KLSAgICBib29sIGlzU2Vla2FibGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgc3A8TnVQbGF5ZXI6Ok51UGxheWVyU3RyZWFtTGlzdGVuZXI+IG1MaXN0ZW5lcjsKLSAgICBvZmY2NF90IG1Qb3NpdGlvbjsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFN0cmVhbVNvdXJjZSk7Ci19OwotCi1NUDRTb3VyY2U6Ok1QNFNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBTb3VyY2Uobm90aWZ5KSwKLSAgICAgIG1Tb3VyY2Uoc291cmNlKSwKLSAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAotICAgICAgbVBhcnNlcihuZXcgRnJhZ21lbnRlZE1QNFBhcnNlciksCi0gICAgICBtRU9TKGZhbHNlKSB7Ci0gICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1QYXJzZXIpOwotfQotCi1NUDRTb3VyY2U6On5NUDRTb3VyY2UoKSB7Ci19Ci0KLXZvaWQgTVA0U291cmNlOjpwcmVwYXJlQXN5bmMoKSB7Ci0gICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgwLCAwKTsKLSAgICBub3RpZnlGbGFnc0NoYW5nZWQoMCk7Ci0gICAgbm90aWZ5UHJlcGFyZWQoKTsKLX0KLQotdm9pZCBNUDRTb3VyY2U6OnN0YXJ0KCkgewotICAgIG1Mb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLyk7Ci0gICAgbVBhcnNlci0+c3RhcnQobmV3IFN0cmVhbVNvdXJjZShtU291cmNlKSk7Ci19Ci0KLXN0YXR1c190IE1QNFNvdXJjZTo6ZmVlZE1vcmVUU0RhdGEoKSB7Ci0gICAgcmV0dXJuIG1FT1MgPyBFUlJPUl9FTkRfT0ZfU1RSRUFNIDogKHN0YXR1c190KU9LOwotfQotCi1zcDxBTWVzc2FnZT4gTVA0U291cmNlOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgewotICAgIHJldHVybiBtUGFyc2VyLT5nZXRGb3JtYXQoYXVkaW8pOwotfQotCi1zdGF0dXNfdCBNUDRTb3VyY2U6OmRlcXVldWVBY2Nlc3NVbml0KAotICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgewotICAgIHJldHVybiBtUGFyc2VyLT5kZXF1ZXVlQWNjZXNzVW5pdChhdWRpbywgYWNjZXNzVW5pdCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvbXA0L01QNFNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL21wNC9NUDRTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlZjYyMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvbXA0L01QNFNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTVA0X1NPVVJDRV9ICi0jZGVmaW5lIE1QNF9TT1VSQ0VfSAotCi0jaW5jbHVkZSAiTnVQbGF5ZXJTb3VyY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgRnJhZ21lbnRlZE1QNFBhcnNlcjsKLQotc3RydWN0IE1QNFNvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjo6U291cmNlIHsKLSAgICBNUDRTb3VyY2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOwotICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmZWVkTW9yZVRTRGF0YSgpOwotCi0gICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0KGJvb2wgYXVkaW8pOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdCgKLSAgICAgICAgICAgIGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk1QNFNvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIHNwPElTdHJlYW1Tb3VyY2U+IG1Tb3VyY2U7Ci0gICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKLSAgICBzcDxGcmFnbWVudGVkTVA0UGFyc2VyPiBtUGFyc2VyOwotICAgIGJvb2wgbUVPUzsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QNFNvdXJjZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gTVA0X1NPVVJDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5tawppbmRleCA2OWM3NWI4Li45NzA3YzRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQubWsKQEAgLTMxLDkgKzMxLDggQEAKICAgICBsaWJjb21tb25fdGltZV9jbGllbnQgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGlibWVkaWEKLSMgVGhpcyBkZXBlbmRlbmN5IG9uIGxpYm1lZGlhIGlzIGZvciBTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuCi0jIENvbnNpZGVyIGEgc2VwYXJhdGUgYSBsaWJyYXJ5IGZvciBTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuCisgICAgbGlibG9nCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliaW5zdGFudHNzcQogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmNwcCBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuY3BwCmluZGV4IDc0YTZmZGIuLjU1MWY1MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuY3BwCkBAIC0yNCwxMSArMjQsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZTo6QXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZShBdWRpb0J1ZmZlclByb3ZpZGVyICpwcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCkgOgogICAgIE5CQUlPX1NvdXJjZShmb3JtYXQpLCBtUHJvdmlkZXIocHJvdmlkZXIpLCBtQ29uc3VtZWQoMCkKIHsKICAgICBBTE9HX0FTU0VSVChwcm92aWRlciAhPSBOVUxMKTsKLSAgICBBTE9HX0FTU0VSVChmb3JtYXQgIT0gRm9ybWF0X0ludmFsaWQpOworICAgIEFMT0dfQVNTRVJUKEZvcm1hdF9pc1ZhbGlkKGZvcm1hdCkpOwogfQogCiBBdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlOjp+QXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZSgpCkBAIC02OCw3ICs2OCw3IEBACiAgICAgfQogICAgIC8vIGNvdW50IGNvdWxkIGJlIHplcm8sIGVpdGhlciBiZWNhdXNlIGNvdW50IHdhcyB6ZXJvIG9uIGVudHJ5IG9yCiAgICAgLy8gYXZhaWxhYmxlIGlzIHplcm8sIGJ1dCBib3RoIGFyZSB1bmxpa2VseSBzbyBkb24ndCBjaGVjayBmb3IgdGhhdAotICAgIG1lbWNweShidWZmZXIsIChjaGFyICopIG1CdWZmZXIucmF3ICsgKG1Db25zdW1lZCA8PCBtQml0U2hpZnQpLCBjb3VudCA8PCBtQml0U2hpZnQpOworICAgIG1lbWNweShidWZmZXIsIChjaGFyICopIG1CdWZmZXIucmF3ICsgKG1Db25zdW1lZCAqIG1GcmFtZVNpemUpLCBjb3VudCAqIG1GcmFtZVNpemUpOwogICAgIGlmIChDQ19VTkxJS0VMWSgobUNvbnN1bWVkICs9IGNvdW50KSA+PSBtQnVmZmVyLmZyYW1lQ291bnQpKSB7CiAgICAgICAgIG1Qcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CiAgICAgICAgIG1CdWZmZXIucmF3ID0gTlVMTDsKQEAgLTEyMCw3ICsxMjAsNyBAQAogICAgICAgICAgICAgY291bnQgPSBhdmFpbGFibGU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKENDX0xJS0VMWShjb3VudCA+IDApKSB7Ci0gICAgICAgICAgICBjaGFyKiByZWFkVGd0ID0gKGNoYXIgKikgbUJ1ZmZlci5yYXcgKyAobUNvbnN1bWVkIDw8IG1CaXRTaGlmdCk7CisgICAgICAgICAgICBjaGFyKiByZWFkVGd0ID0gKGNoYXIgKikgbUJ1ZmZlci5yYXcgKyAobUNvbnN1bWVkICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICBzc2l6ZV90IHJldCA9IHZpYSh1c2VyLCByZWFkVGd0LCBjb3VudCwgcmVhZFBUUyk7CiAgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkocmV0IDw9IDApKSB7CiAgICAgICAgICAgICAgICAgaWYgKENDX0xJS0VMWShhY2N1bXVsYXRvciA+IDApKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmNwcCBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuY3BwCmluZGV4IDA1MjczZjYuLjZhYWI0OGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuY3BwCkBAIC00MCwxNiArNDAsMTUgQEAKIHNzaXplX3QgQXVkaW9TdHJlYW1JblNvdXJjZTo6bmVnb3RpYXRlKGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbXSwgc2l6ZV90IG51bU9mZmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGNvdW50ZXJPZmZlcnNbXSwgc2l6ZV90JiBudW1Db3VudGVyT2ZmZXJzKQogewotICAgIGlmIChtRm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgaWYgKCFGb3JtYXRfaXNWYWxpZChtRm9ybWF0KSkgewogICAgICAgICBtU3RyZWFtQnVmZmVyU2l6ZUJ5dGVzID0gbVN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbVN0cmVhbS0+Y29tbW9uKTsKICAgICAgICAgYXVkaW9fZm9ybWF0X3Qgc3RyZWFtRm9ybWF0ID0gbVN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1TdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgIGlmIChzdHJlYW1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtU3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtU3RyZWFtLT5jb21tb24pOwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQotICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIG1TdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1TdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgICAgICBtRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhzYW1wbGVSYXRlLCBwb3Bjb3VudChjaGFubmVsTWFzaykpOwotICAgICAgICAgICAgbUJpdFNoaWZ0ID0gRm9ybWF0X2ZyYW1lQml0U2hpZnQobUZvcm1hdCk7Ci0gICAgICAgIH0KKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1TdHJlYW0tPmNvbW1vbik7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIG1TdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1TdHJlYW0tPmNvbW1vbik7CisgICAgICAgIG1Gb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spLCBzdHJlYW1Gb3JtYXQpOworICAgICAgICBtRnJhbWVTaXplID0gRm9ybWF0X2ZyYW1lU2l6ZShtRm9ybWF0KTsKICAgICB9CiAgICAgcmV0dXJuIE5CQUlPX1NvdXJjZTo6bmVnb3RpYXRlKG9mZmVycywgbnVtT2ZmZXJzLCBjb3VudGVyT2ZmZXJzLCBudW1Db3VudGVyT2ZmZXJzKTsKIH0KQEAgLTY1LDE0ICs2NCwxNCBAQAogICAgIHJldHVybiBtRnJhbWVzT3ZlcnJ1bjsKIH0KIAotc3NpemVfdCBBdWRpb1N0cmVhbUluU291cmNlOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQorc3NpemVfdCBBdWRpb1N0cmVhbUluU291cmNlOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBpbnQ2NF90IHJlYWRQVFMgX191bnVzZWQpCiB7Ci0gICAgaWYgKENDX1VOTElLRUxZKG1Gb3JtYXQgPT0gRm9ybWF0X0ludmFsaWQpKSB7CisgICAgaWYgKENDX1VOTElLRUxZKCFGb3JtYXRfaXNWYWxpZChtRm9ybWF0KSkpIHsKICAgICAgICAgcmV0dXJuIE5FR09USUFURTsKICAgICB9Ci0gICAgc3NpemVfdCBieXRlc1JlYWQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgY291bnQgPDwgbUJpdFNoaWZ0KTsKKyAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBjb3VudCAqIG1GcmFtZVNpemUpOwogICAgIGlmIChieXRlc1JlYWQgPiAwKSB7Ci0gICAgICAgIHNpemVfdCBmcmFtZXNSZWFkID0gYnl0ZXNSZWFkID4+IG1CaXRTaGlmdDsKKyAgICAgICAgc2l6ZV90IGZyYW1lc1JlYWQgPSBieXRlc1JlYWQgLyBtRnJhbWVTaXplOwogICAgICAgICBtRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOwogICAgICAgICByZXR1cm4gZnJhbWVzUmVhZDsKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcCBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKaW5kZXggZTQzNDFkNy4uMGQ1ZjkzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCkBAIC0zNywxNiArMzcsMTUgQEAKIHNzaXplX3QgQXVkaW9TdHJlYW1PdXRTaW5rOjpuZWdvdGlhdGUoY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1tdLCBzaXplX3QgbnVtT2ZmZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkFJT19Gb3JtYXQgY291bnRlck9mZmVyc1tdLCBzaXplX3QmIG51bUNvdW50ZXJPZmZlcnMpCiB7Ci0gICAgaWYgKG1Gb3JtYXQgPT0gRm9ybWF0X0ludmFsaWQpIHsKKyAgICBpZiAoIUZvcm1hdF9pc1ZhbGlkKG1Gb3JtYXQpKSB7CiAgICAgICAgIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgPSBtU3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtU3RyZWFtLT5jb21tb24pOwogICAgICAgICBhdWRpb19mb3JtYXRfdCBzdHJlYW1Gb3JtYXQgPSBtU3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbVN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgaWYgKHN0cmVhbUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1TdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9Ci0gICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCkgbVN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbVN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKHNhbXBsZVJhdGUsIHBvcGNvdW50KGNoYW5uZWxNYXNrKSk7Ci0gICAgICAgICAgICBtQml0U2hpZnQgPSBGb3JtYXRfZnJhbWVCaXRTaGlmdChtRm9ybWF0KTsKLSAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbVN0cmVhbS0+Y29tbW9uKTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCkgbVN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbVN0cmVhbS0+Y29tbW9uKTsKKyAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0Moc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spLCBzdHJlYW1Gb3JtYXQpOworICAgICAgICBtRnJhbWVTaXplID0gRm9ybWF0X2ZyYW1lU2l6ZShtRm9ybWF0KTsKICAgICB9CiAgICAgcmV0dXJuIE5CQUlPX1Npbms6Om5lZ290aWF0ZShvZmZlcnMsIG51bU9mZmVycywgY291bnRlck9mZmVycywgbnVtQ291bnRlck9mZmVycyk7CiB9CkBAIC01NiwxMCArNTUsMTAgQEAKICAgICBpZiAoIW1OZWdvdGlhdGVkKSB7CiAgICAgICAgIHJldHVybiBORUdPVElBVEU7CiAgICAgfQotICAgIEFMT0dfQVNTRVJUKG1Gb3JtYXQgIT0gRm9ybWF0X0ludmFsaWQpOwotICAgIHNzaXplX3QgcmV0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBjb3VudCA8PCBtQml0U2hpZnQpOworICAgIEFMT0dfQVNTRVJUKEZvcm1hdF9pc1ZhbGlkKG1Gb3JtYXQpKTsKKyAgICBzc2l6ZV90IHJldCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgY291bnQgKiBtRnJhbWVTaXplKTsKICAgICBpZiAocmV0ID4gMCkgewotICAgICAgICByZXQgPj49IG1CaXRTaGlmdDsKKyAgICAgICAgcmV0IC89IG1GcmFtZVNpemU7CiAgICAgICAgIG1GcmFtZXNXcml0dGVuICs9IHJldDsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBGSVhNRSB2ZXJpZnkgSEFMIGltcGxlbWVudGF0aW9ucyBhcmUgcmV0dXJuaW5nIHRoZSBjb3JyZWN0IGVycm9yIGNvZGVzIGUuZy4gV09VTERfQkxPQ0sKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlLmNwcCBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlLmNwcAppbmRleCAzYzYxYjYwLi4wYjY1ODYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZS5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGUuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2RlZmluZSBMT0dfVEFHICJNb25vUGlwZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIApAQCAtMzAsNyArMzIsMjQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1Nb25vUGlwZTo6TW9ub1BpcGUoc2l6ZV90IHJlcUZyYW1lcywgTkJBSU9fRm9ybWF0IGZvcm1hdCwgYm9vbCB3cml0ZUNhbkJsb2NrKSA6CitzdGF0aWMgdWludDY0X3QgY2FjaGVOOyAvLyBvdXRwdXQgb2YgQ0NIZWxwZXI6OmdldExvY2FsRnJlcSgpCitzdGF0aWMgYm9vbCBjYWNoZVZhbGlkOyAvLyB3aGV0aGVyIGNhY2hlTiBpcyB2YWxpZAorc3RhdGljIHB0aHJlYWRfb25jZV90IGNhY2hlT25jZUNvbnRyb2wgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKworc3RhdGljIHZvaWQgY2FjaGVPbmNlSW5pdCgpCit7CisgICAgQ0NIZWxwZXIgdG1wSGVscGVyOworICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoT0sgIT0gKHJlcyA9IHRtcEhlbHBlci5nZXRMb2NhbEZyZXEoJmNhY2hlTikpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmV0Y2ggbG9jYWwgdGltZSBmcmVxdWVuY3kgd2hlbiBjb25zdHJ1Y3RpbmcgYSIKKyAgICAgICAgICAgICAgIiBNb25vUGlwZSAocmVzID0gJWQpLiAgZ2V0TmV4dFdyaXRlVGltZXN0YW1wIGNhbGxzIHdpbGwgYmUiCisgICAgICAgICAgICAgICIgbm9uLWZ1bmN0aW9uYWwiLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhY2hlVmFsaWQgPSB0cnVlOworfQorCitNb25vUGlwZTo6TW9ub1BpcGUoc2l6ZV90IHJlcUZyYW1lcywgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQsIGJvb2wgd3JpdGVDYW5CbG9jaykgOgogICAgICAgICBOQkFJT19TaW5rKGZvcm1hdCksCiAgICAgICAgIG1VcGRhdGVTZXEoMCksCiAgICAgICAgIG1SZXFGcmFtZXMocmVxRnJhbWVzKSwKQEAgLTQ3LDggKzY2LDYgQEAKICAgICAgICAgbVRpbWVzdGFtcE11dGF0b3IoJm1UaW1lc3RhbXBTaGFyZWQpLAogICAgICAgICBtVGltZXN0YW1wT2JzZXJ2ZXIoJm1UaW1lc3RhbXBTaGFyZWQpCiB7Ci0gICAgQ0NIZWxwZXIgdG1wSGVscGVyOwotICAgIHN0YXR1c190IHJlczsKICAgICB1aW50NjRfdCBOLCBEOwogCiAgICAgbU5leHRSZFBUUyA9IEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTOwpAQCAtNTksMTkgKzc2LDIwIEBACiAgICAgbVNhbXBsZXNUb0xvY2FsVGltZS5hX3RvX2JfZGVub20gPSAwOwogCiAgICAgRCA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7Ci0gICAgaWYgKE9LICE9IChyZXMgPSB0bXBIZWxwZXIuZ2V0TG9jYWxGcmVxKCZOKSkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmZXRjaCBsb2NhbCB0aW1lIGZyZXF1ZW5jeSB3aGVuIGNvbnN0cnVjdGluZyBhIgotICAgICAgICAgICAgICAiIE1vbm9QaXBlIChyZXMgPSAlZCkuICBnZXROZXh0V3JpdGVUaW1lc3RhbXAgY2FsbHMgd2lsbCBiZSIKLSAgICAgICAgICAgICAgIiBub24tZnVuY3Rpb25hbCIsIHJlcyk7CisKKyAgICAodm9pZCkgcHRocmVhZF9vbmNlKCZjYWNoZU9uY2VDb250cm9sLCBjYWNoZU9uY2VJbml0KTsKKyAgICBpZiAoIWNhY2hlVmFsaWQpIHsKKyAgICAgICAgLy8gbG9nIGhhcyBhbHJlYWR5IGJlZW4gZG9uZQogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIE4gPSBjYWNoZU47CiAKICAgICBMaW5lYXJUcmFuc2Zvcm06OnJlZHVjZSgmTiwgJkQpOwogICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrU2lnbmVkSGlCaXRzTWFzayAgID0gfigweDdGRkZGRkZGdWxsKTsKICAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga1Vuc2lnbmVkSGlCaXRzTWFzayA9IH4oMHhGRkZGRkZGRnVsbCk7CiAgICAgaWYgKChOICYga1NpZ25lZEhpQml0c01hc2spIHx8IChEICYga1Vuc2lnbmVkSGlCaXRzTWFzaykpIHsKICAgICAgICAgQUxPR0UoIkNhbm5vdCByZWR1Y2Ugc2FtcGxlIHJhdGUgdG8gbG9jYWwgY2xvY2sgZnJlcXVlbmN5IHJhdGlvIHRvIGZpdCIKLSAgICAgICAgICAgICAgIiBpbiBhIDMyLzMyIGJpdCByYXRpb25hbC4gIChtYXggcmVkdWN0aW9uIGlzIDB4JTAxNmxseC8weCUwMTZsbHgiCisgICAgICAgICAgICAgICIgaW4gYSAzMi8zMiBiaXQgcmF0aW9uYWwuICAobWF4IHJlZHVjdGlvbiBpcyAweCUwMTYiIFBSSXg2NCAiLzB4JTAxNiIgUFJJeDY0CiAgICAgICAgICAgICAgICIpLiAgZ2V0TmV4dFdyaXRlVGltZXN0YW1wIGNhbGxzIHdpbGwgYmUgbm9uLWZ1bmN0aW9uYWwiLCBOLCBEKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTExNSwxMSArMTMzLDExIEBACiAgICAgICAgICAgICBwYXJ0MSA9IHdyaXR0ZW47CiAgICAgICAgIH0KICAgICAgICAgaWYgKENDX0xJS0VMWShwYXJ0MSA+IDApKSB7Ci0gICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgbUJ1ZmZlciArIChyZWFyIDw8IG1CaXRTaGlmdCksIGJ1ZmZlciwgcGFydDEgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBtQnVmZmVyICsgKHJlYXIgKiBtRnJhbWVTaXplKSwgYnVmZmVyLCBwYXJ0MSAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHJlYXIgKyBwYXJ0MSA9PSBtTWF4RnJhbWVzKSkgewogICAgICAgICAgICAgICAgIHNpemVfdCBwYXJ0MiA9IHdyaXR0ZW4gLSBwYXJ0MTsKICAgICAgICAgICAgICAgICBpZiAoQ0NfTElLRUxZKHBhcnQyID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG1CdWZmZXIsIChjaGFyICopIGJ1ZmZlciArIChwYXJ0MSA8PCBtQml0U2hpZnQpLCBwYXJ0MiA8PCBtQml0U2hpZnQpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkobUJ1ZmZlciwgKGNoYXIgKikgYnVmZmVyICsgKHBhcnQxICogbUZyYW1lU2l6ZSksIHBhcnQyICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZSh3cml0dGVuICsgbVJlYXIsICZtUmVhcik7CkBAIC0xMjksNyArMTQ3LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNvdW50IC09IHdyaXR0ZW47Ci0gICAgICAgIGJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArICh3cml0dGVuIDw8IG1CaXRTaGlmdCk7CisgICAgICAgIGJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArICh3cml0dGVuICogbUZyYW1lU2l6ZSk7CiAgICAgICAgIC8vIFNpbXVsYXRlIGJsb2NraW5nIEkvTyBieSBzbGVlcGluZyBhdCBkaWZmZXJlbnQgcmF0ZXMsIGRlcGVuZGluZyBvbiBhIHRocm90dGxlLgogICAgICAgICAvLyBUaGUgdGhyb3R0bGUgdHJpZXMgdG8ga2VlcCB0aGUgbWVhbiBwaXBlIGRlcHRoIG5lYXIgdGhlIHNldHBvaW50LCB3aXRoIGEgc2xpZ2h0IGppdHRlci4KICAgICAgICAgdWludDMyX3QgbnM7CkBAIC0yOTIsNyArMzEwLDcgQEAKICAgICAgICAgLy8gZXJyb3IsIGJ1dCB0aGVuIHplcm8gb3V0IHRoZSByYXRpbyBpbiB0aGUgbGluZWFyIHRyYW5zZm9ybSBzbwogICAgICAgICAvLyB0aGF0IHdlIGRvbid0IHRyeSB0byBkbyBhbnkgY29udmVyc2lvbnMgZnJvbSBub3cgb24uICBUaGlzCiAgICAgICAgIC8vIE1vbm9QaXBlJ3MgZ2V0TmV4dFdyaXRlVGltZXN0YW1wIGlzIG5vdyBicm9rZW4gZm9yIGdvb2QuCi0gICAgICAgIEFMT0dFKCJPdmVyZmxvdyB3aGVuIGF0dGVtcHRpbmcgdG8gY29udmVydCAlZCBhdWRpbyBmcmFtZXMgdG8iCisgICAgICAgIEFMT0dFKCJPdmVyZmxvdyB3aGVuIGF0dGVtcHRpbmcgdG8gY29udmVydCAlenUgYXVkaW8gZnJhbWVzIHRvIgogICAgICAgICAgICAgICAiIGR1cmF0aW9uIGluIGxvY2FsIHRpbWUuICBnZXROZXh0V3JpdGVUaW1lc3RhbXAgd2lsbCBmYWlsIGZyb20iCiAgICAgICAgICAgICAgICIgbm93IG9uLiIsIGF1ZEZyYW1lcyk7CiAgICAgICAgIG1TYW1wbGVzVG9Mb2NhbFRpbWUuYV90b19iX251bWVyID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlUmVhZGVyLmNwcCBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlUmVhZGVyLmNwcAppbmRleCA4NTEzNDFhLi5kZTgyMjI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGVSZWFkZXIuY3BwCkBAIC03MywxMSArNzMsMTEgQEAKICAgICAgICAgcGFydDEgPSByZWQ7CiAgICAgfQogICAgIGlmIChDQ19MSUtFTFkocGFydDEgPiAwKSkgewotICAgICAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtUGlwZS0+bUJ1ZmZlciArIChmcm9udCA8PCBtQml0U2hpZnQpLCBwYXJ0MSA8PCBtQml0U2hpZnQpOworICAgICAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtUGlwZS0+bUJ1ZmZlciArIChmcm9udCAqIG1GcmFtZVNpemUpLCBwYXJ0MSAqIG1GcmFtZVNpemUpOwogICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoZnJvbnQgKyBwYXJ0MSA9PSBtUGlwZS0+bU1heEZyYW1lcykpIHsKICAgICAgICAgICAgIHNpemVfdCBwYXJ0MiA9IHJlZCAtIHBhcnQxOwogICAgICAgICAgICAgaWYgKENDX0xJS0VMWShwYXJ0MiA+IDApKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGJ1ZmZlciArIChwYXJ0MSA8PCBtQml0U2hpZnQpLCBtUGlwZS0+bUJ1ZmZlciwgcGFydDIgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgYnVmZmVyICsgKHBhcnQxICogbUZyYW1lU2l6ZSksIG1QaXBlLT5tQnVmZmVyLCBwYXJ0MiAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1QaXBlLT51cGRhdGVGcm9udEFuZE5SUFRTKHJlZCArIG1QaXBlLT5tRnJvbnQsIG5leHRSZWFkUFRTKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL05CQUlPLmNwcCBiL21lZGlhL2xpYm5iYWlvL05CQUlPLmNwcAppbmRleCBlMGQyYzIxLi5kNjQxZTc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9OQkFJTy5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTkJBSU8uY3BwCkBAIC0yMiwxMTkgKzIyLDQyIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc2l6ZV90IEZvcm1hdF9mcmFtZVNpemUoTkJBSU9fRm9ybWF0IGZvcm1hdCkKK3NpemVfdCBGb3JtYXRfZnJhbWVTaXplKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KQogewotICAgIHJldHVybiBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCkgKiBzaXplb2Yoc2hvcnQpOworICAgIHJldHVybiBmb3JtYXQubUZyYW1lU2l6ZTsKIH0KIAotc2l6ZV90IEZvcm1hdF9mcmFtZUJpdFNoaWZ0KE5CQUlPX0Zvcm1hdCBmb3JtYXQpCitjb25zdCBOQkFJT19Gb3JtYXQgRm9ybWF0X0ludmFsaWQgPSB7IDAsIDAsIEFVRElPX0ZPUk1BVF9JTlZBTElELCAwIH07CisKK3Vuc2lnbmVkIEZvcm1hdF9zYW1wbGVSYXRlKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KQogewotICAgIC8vIHNpemVvZihzaG9ydCkgPT0gMiwgc28gZnJhbWUgc2l6ZSA9PSAxIDw8IGNoYW5uZWxzCi0gICAgcmV0dXJuIEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICBpZiAoIUZvcm1hdF9pc1ZhbGlkKGZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBmb3JtYXQubVNhbXBsZVJhdGU7CiB9CiAKLWVudW0gewotICAgIEZvcm1hdF9TUl84MDAwLAotICAgIEZvcm1hdF9TUl8xMTAyNSwKLSAgICBGb3JtYXRfU1JfMTYwMDAsCi0gICAgRm9ybWF0X1NSXzIyMDUwLAotICAgIEZvcm1hdF9TUl8yNDAwMCwKLSAgICBGb3JtYXRfU1JfMzIwMDAsCi0gICAgRm9ybWF0X1NSXzQ0MTAwLAotICAgIEZvcm1hdF9TUl80ODAwMCwKLSAgICBGb3JtYXRfU1JfTWFzayA9IDcKLX07Ci0KLWVudW0gewotICAgIEZvcm1hdF9DXzEgPSAweDA4LAotICAgIEZvcm1hdF9DXzIgPSAweDEwLAotICAgIEZvcm1hdF9DX01hc2sgPSAweDE4Ci19OwotCi11bnNpZ25lZCBGb3JtYXRfc2FtcGxlUmF0ZShOQkFJT19Gb3JtYXQgZm9ybWF0KQordW5zaWduZWQgRm9ybWF0X2NoYW5uZWxDb3VudChjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCkKIHsKLSAgICBpZiAoZm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgaWYgKCFGb3JtYXRfaXNWYWxpZChmb3JtYXQpKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBzd2l0Y2ggKGZvcm1hdCAmIEZvcm1hdF9TUl9NYXNrKSB7Ci0gICAgY2FzZSBGb3JtYXRfU1JfODAwMDoKLSAgICAgICAgcmV0dXJuIDgwMDA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfMTEwMjU6Ci0gICAgICAgIHJldHVybiAxMTAyNTsKLSAgICBjYXNlIEZvcm1hdF9TUl8xNjAwMDoKLSAgICAgICAgcmV0dXJuIDE2MDAwOwotICAgIGNhc2UgRm9ybWF0X1NSXzIyMDUwOgotICAgICAgICByZXR1cm4gMjIwNTA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfMjQwMDA6Ci0gICAgICAgIHJldHVybiAyNDAwMDsKLSAgICBjYXNlIEZvcm1hdF9TUl8zMjAwMDoKLSAgICAgICAgcmV0dXJuIDMyMDAwOwotICAgIGNhc2UgRm9ybWF0X1NSXzQ0MTAwOgotICAgICAgICByZXR1cm4gNDQxMDA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfNDgwMDA6Ci0gICAgICAgIHJldHVybiA0ODAwMDsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIGZvcm1hdC5tQ2hhbm5lbENvdW50OwogfQogCi11bnNpZ25lZCBGb3JtYXRfY2hhbm5lbENvdW50KE5CQUlPX0Zvcm1hdCBmb3JtYXQpCitOQkFJT19Gb3JtYXQgRm9ybWF0X2Zyb21fU1JfQyh1bnNpZ25lZCBzYW1wbGVSYXRlLCB1bnNpZ25lZCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKIHsKLSAgICBpZiAoZm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzd2l0Y2ggKGZvcm1hdCAmIEZvcm1hdF9DX01hc2spIHsKLSAgICBjYXNlIEZvcm1hdF9DXzE6Ci0gICAgICAgIHJldHVybiAxOwotICAgIGNhc2UgRm9ybWF0X0NfMjoKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1OQkFJT19Gb3JtYXQgRm9ybWF0X2Zyb21fU1JfQyh1bnNpZ25lZCBzYW1wbGVSYXRlLCB1bnNpZ25lZCBjaGFubmVsQ291bnQpCi17Ci0gICAgTkJBSU9fRm9ybWF0IGZvcm1hdDsKLSAgICBzd2l0Y2ggKHNhbXBsZVJhdGUpIHsKLSAgICBjYXNlIDgwMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl84MDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDExMDI1OgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfMTEwMjU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl8xNjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzIyMDUwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI0MDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfMjQwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl8zMjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzQ0MTAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ4MDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfNDgwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6CisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCB8fCBjaGFubmVsQ291bnQgPT0gMCB8fCAhYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKICAgICAgICAgcmV0dXJuIEZvcm1hdF9JbnZhbGlkOwogICAgIH0KLSAgICBzd2l0Y2ggKGNoYW5uZWxDb3VudCkgewotICAgIGNhc2UgMToKLSAgICAgICAgZm9ybWF0IHw9IEZvcm1hdF9DXzE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgZm9ybWF0IHw9IEZvcm1hdF9DXzI7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBGb3JtYXRfSW52YWxpZDsKLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1hdDsKKyAgICBOQkFJT19Gb3JtYXQgcmV0OworICAgIHJldC5tU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgcmV0Lm1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgcmV0Lm1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgcmV0Lm1GcmFtZVNpemUgPSBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgPworICAgICAgICAgICAgY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpIDogc2l6ZW9mKHVpbnQ4X3QpOworICAgIHJldHVybiByZXQ7CiB9CiAKIC8vIFRoaXMgaXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uOyBpdCBpcyBleHBlY3RlZCB0aGF0IHN1YmNsYXNzZXMgd2lsbCBvcHRpbWl6ZSB0aGlzLgpAQCAtMjE0LDExICsxMzcsMTEgQEAKIHNzaXplX3QgTkJBSU9fUG9ydDo6bmVnb3RpYXRlKGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbXSwgc2l6ZV90IG51bU9mZmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkFJT19Gb3JtYXQgY291bnRlck9mZmVyc1tdLCBzaXplX3QmIG51bUNvdW50ZXJPZmZlcnMpCiB7Ci0gICAgQUxPR1YoIm5lZ290aWF0ZSBvZmZlcnM9JXAgbnVtT2ZmZXJzPSV1IGNvdW50ZXJzT2ZmZXJzPSVwIG51bUNvdW50ZXJPZmZlcnM9JXUiLAorICAgIEFMT0dWKCJuZWdvdGlhdGUgb2ZmZXJzPSVwIG51bU9mZmVycz0lenUgY291bnRlcnNPZmZlcnM9JXAgbnVtQ291bnRlck9mZmVycz0lenUiLAogICAgICAgICAgICAgb2ZmZXJzLCBudW1PZmZlcnMsIGNvdW50ZXJPZmZlcnMsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgIGlmIChtRm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgaWYgKEZvcm1hdF9pc1ZhbGlkKG1Gb3JtYXQpKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtT2ZmZXJzOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChvZmZlcnNbaV0gPT0gbUZvcm1hdCkgeworICAgICAgICAgICAgaWYgKEZvcm1hdF9pc0VxdWFsKG9mZmVyc1tpXSwgbUZvcm1hdCkpIHsKICAgICAgICAgICAgICAgICBtTmVnb3RpYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICB9CkBAIC0yMzMsNCArMTU2LDE3IEBACiAgICAgcmV0dXJuIChzc2l6ZV90KSBORUdPVElBVEU7CiB9CiAKK2Jvb2wgRm9ybWF0X2lzVmFsaWQoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpCit7CisgICAgcmV0dXJuIGZvcm1hdC5tU2FtcGxlUmF0ZSAhPSAwICYmIGZvcm1hdC5tQ2hhbm5lbENvdW50ICE9IDAgJiYKKyAgICAgICAgICAgIGZvcm1hdC5tRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEICYmIGZvcm1hdC5tRnJhbWVTaXplICE9IDA7Cit9CisKK2Jvb2wgRm9ybWF0X2lzRXF1YWwoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQxLCBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdDIpCit7CisgICAgcmV0dXJuIGZvcm1hdDEubVNhbXBsZVJhdGUgPT0gZm9ybWF0Mi5tU2FtcGxlUmF0ZSAmJgorICAgICAgICAgICAgZm9ybWF0MS5tQ2hhbm5lbENvdW50ID09IGZvcm1hdDIubUNoYW5uZWxDb3VudCAmJiBmb3JtYXQxLm1Gb3JtYXQgPT0gZm9ybWF0Mi5tRm9ybWF0ICYmCisgICAgICAgICAgICBmb3JtYXQxLm1GcmFtZVNpemUgPT0gZm9ybWF0Mi5tRnJhbWVTaXplOworfQorCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcCBiL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcAppbmRleCAwNDViZjY0Li40ZDE0OTA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMzNywyNSArMzM4LDI1IEBACiAgICAgICAgIH0KICAgICAgICAgaSAtPSBsZW5ndGggKyAzOwogICAgIH0KLSAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgbG9zdCArPSBpOwotICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgZmRwcmludGYoZmQsICIlKnN3YXJuaW5nOiBsb3N0ICV1IGJ5dGVzIHdvcnRoIG9mIGV2ZW50c1xuIiwgaW5kZW50LCAiIiwgbG9zdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HSSgiJSpzd2FybmluZzogbG9zdCAldSBieXRlcyB3b3J0aCBvZiBldmVudHNcbiIsIGluZGVudCwgIiIsIGxvc3QpOwotICAgICAgICB9CisgICAgbUZkID0gZmQ7CisgICAgbUluZGVudCA9IGluZGVudDsKKyAgICBTdHJpbmc4IHRpbWVzdGFtcCwgYm9keTsKKyAgICBsb3N0ICs9IGk7CisgICAgaWYgKGxvc3QgPiAwKSB7CisgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiBsb3N0ICV6dSBieXRlcyB3b3J0aCBvZiBldmVudHMiLCBsb3N0KTsKKyAgICAgICAgLy8gVE9ETyB0aW1lc3RhbXAgZW1wdHkgaGVyZSwgb25seSBvdGhlciBjaG9pY2UgdG8gd2FpdCBmb3IgdGhlIGZpcnN0IHRpbWVzdGFtcCBldmVudCBpbiB0aGUKKyAgICAgICAgLy8gICAgICBsb2cgdG8gcHVzaCBpdCBvdXQuICBDb25zaWRlciBrZWVwaW5nIHRoZSB0aW1lc3RhbXAvYm9keSBiZXR3ZWVuIGNhbGxzIHRvIHJlYWRBdCgpLgorICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOwogICAgIH0KICAgICBzaXplX3Qgd2lkdGggPSAxOwogICAgIHdoaWxlIChtYXhTZWMgPj0gMTApIHsKICAgICAgICAgKyt3aWR0aDsKICAgICAgICAgbWF4U2VjIC89IDEwOwogICAgIH0KLSAgICBjaGFyIHByZWZpeFszMl07CiAgICAgaWYgKG1heFNlYyA+PSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKHByZWZpeCwgc2l6ZW9mKHByZWZpeCksICJbJSpzXSAiLCB3aWR0aCArIDQsICIiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmVmaXhbMF0gPSAnXDAnOworICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJSpzXSIsIChpbnQpIHdpZHRoICsgNCwgIiIpOwogICAgIH0KKyAgICBib29sIGRlZmVycmVkVGltZXN0YW1wID0gZmFsc2U7CiAgICAgd2hpbGUgKGkgPCBhdmFpbCkgewogICAgICAgICBldmVudCA9IChFdmVudCkgY29weVtpXTsKICAgICAgICAgbGVuZ3RoID0gY29weVtpICsgMV07CkBAIC0zNjMsMTEgKzM2NCw4IEBACiAgICAgICAgIHNpemVfdCBhZHZhbmNlID0gbGVuZ3RoICsgMzsKICAgICAgICAgc3dpdGNoIChldmVudCkgewogICAgICAgICBjYXNlIEVWRU5UX1NUUklORzoKLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmRwcmludGYoZmQsICIlKnMlcyUuKnNcbiIsIGluZGVudCwgIiIsIHByZWZpeCwgbGVuZ3RoLCAoY29uc3QgY2hhciAqKSBkYXRhKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIiUqcyVzJS4qcyIsIGluZGVudCwgIiIsIHByZWZpeCwgbGVuZ3RoLCAoY29uc3QgY2hhciAqKSBkYXRhKTsKLSAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiJS4qcyIsIChpbnQpIGxlbmd0aCwgKGNvbnN0IGNoYXIgKikgZGF0YSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBFVkVOVF9USU1FU1RBTVA6IHsKICAgICAgICAgICAgIC8vIGFscmVhZHkgY2hlY2tlZCB0aGF0IGxlbmd0aCA9PSBzaXplb2Yoc3RydWN0IHRpbWVzcGVjKTsKICAgICAgICAgICAgIG1lbWNweSgmdHMsIGRhdGEsIHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpKTsKQEAgLTQwMCw0OCArMzk4LDU2IEBACiAgICAgICAgICAgICAgICAgcHJldk5zZWMgPSB0c05leHQudHZfbnNlYzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNpemVfdCBuID0gKGogLSBpKSAvIChzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSArIDMpOworICAgICAgICAgICAgaWYgKGRlZmVycmVkVGltZXN0YW1wKSB7CisgICAgICAgICAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZFRpbWVzdGFtcCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZXN0YW1wLmNsZWFyKCk7CiAgICAgICAgICAgICBpZiAobiA+PSBrU3F1YXNoVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZmRwcmludGYoZmQsICIlKnNbJWQuJTAzZCB0byAuJS4wM2QgYnkgLiUuMDNkIHRvIC4lLjAzZF1cbiIsIGluZGVudCwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgdHMudHZfc2VjLCAoaW50KSAodHMudHZfbnNlYyAvIDEwMDAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMudHZfbnNlYyArIGRlbHRhVG90YWwpIC8gMTAwMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGRlbHRhTWluIC8gMTAwMDAwMCksIChpbnQpIChkZWx0YU1heCAvIDEwMDAwMDApKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiJSpzWyVkLiUwM2QgdG8gLiUuMDNkIGJ5IC4lLjAzZCB0byAuJS4wM2RdXG4iLCBpbmRlbnQsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHRzLnR2X3NlYywgKGludCkgKHRzLnR2X25zZWMgLyAxMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzLnR2X25zZWMgKyBkZWx0YVRvdGFsKSAvIDEwMDAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChkZWx0YU1pbiAvIDEwMDAwMDApLCAoaW50KSAoZGVsdGFNYXggLyAxMDAwMDAwKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslZC4lMDNkIHRvIC4lLjAzZCBieSAuJS4wM2QgdG8gLiUuMDNkXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSB0cy50dl9zZWMsIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzLnR2X25zZWMgKyBkZWx0YVRvdGFsKSAvIDEwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGRlbHRhTWluIC8gMTAwMDAwMCksIChpbnQpIChkZWx0YU1heCAvIDEwMDAwMDApKTsKICAgICAgICAgICAgICAgICBpID0gajsKICAgICAgICAgICAgICAgICBhZHZhbmNlID0gMDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmRwcmludGYoZmQsICIlKnNbJWQuJTAzZF1cbiIsIGluZGVudCwgIiIsIChpbnQpIHRzLnR2X3NlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiJSpzWyVkLiUwM2RdIiwgaW5kZW50LCAiIiwgKGludCkgdHMudHZfc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKHRzLnR2X25zZWMgLyAxMDAwMDAwKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSB0cy50dl9zZWMsCisgICAgICAgICAgICAgICAgICAgIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCkpOworICAgICAgICAgICAgZGVmZXJyZWRUaW1lc3RhbXAgPSB0cnVlOwogICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBFVkVOVF9SRVNFUlZFRDoKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmRwcmludGYoZmQsICIlKnMlc3dhcm5pbmc6IHVua25vd24gZXZlbnQgJWRcbiIsIGluZGVudCwgIiIsIHByZWZpeCwgZXZlbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiJSpzJXN3YXJuaW5nOiB1bmtub3duIGV2ZW50ICVkIiwgaW5kZW50LCAiIiwgcHJlZml4LCBldmVudCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGkgKz0gYWR2YW5jZTsKKworICAgICAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOworICAgICAgICAgICAgZGVmZXJyZWRUaW1lc3RhbXAgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZGVmZXJyZWRUaW1lc3RhbXApIHsKKyAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKICAgICB9CiAgICAgLy8gRklYTUUgaXQgd291bGQgYmUgbW9yZSBlZmZpY2llbnQgdG8gcHV0IGEgY2hhciBtQ29weVsyNTZdIGFzIGEgbWVtYmVyIHZhcmlhYmxlIG9mIHRoZSBkdW1wZXIKICAgICBkZWxldGVbXSBjb3B5OwogfQogCit2b2lkIE5CTG9nOjpSZWFkZXI6OmR1bXBMaW5lKGNvbnN0IFN0cmluZzgmIHRpbWVzdGFtcCwgU3RyaW5nOCYgYm9keSkKK3sKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgZHByaW50ZihtRmQsICIlLipzJXMgJXNcbiIsIG1JbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dJKCIlLipzJXMgJXMiLCBtSW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKKyAgICB9CisgICAgYm9keS5jbGVhcigpOworfQorCiBib29sIE5CTG9nOjpSZWFkZXI6OmlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3QKIHsKLSAgICByZXR1cm4gaU1lbW9yeS5nZXQoKSA9PSBtSU1lbW9yeS5nZXQoKTsKKyAgICByZXR1cm4gaU1lbW9yeSAhPSAwICYmIG1JTWVtb3J5ICE9IDAgJiYgaU1lbW9yeS0+cG9pbnRlcigpID09IG1JTWVtb3J5LT5wb2ludGVyKCk7CiB9CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vUGlwZS5jcHAgYi9tZWRpYS9saWJuYmFpby9QaXBlLmNwcAppbmRleCAxYzIxZjljLi42ZTBlYzhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9QaXBlLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9QaXBlLmNwcApAQCAtMjUsMTkgKzI1LDIyIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotUGlwZTo6UGlwZShzaXplX3QgbWF4RnJhbWVzLCBOQkFJT19Gb3JtYXQgZm9ybWF0KSA6CitQaXBlOjpQaXBlKHNpemVfdCBtYXhGcmFtZXMsIGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0LCB2b2lkICpidWZmZXIpIDoKICAgICAgICAgTkJBSU9fU2luayhmb3JtYXQpLAogICAgICAgICBtTWF4RnJhbWVzKHJvdW5kdXAobWF4RnJhbWVzKSksCi0gICAgICAgIG1CdWZmZXIobWFsbG9jKG1NYXhGcmFtZXMgKiBGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCkpKSwKKyAgICAgICAgbUJ1ZmZlcihidWZmZXIgPT0gTlVMTCA/IG1hbGxvYyhtTWF4RnJhbWVzICogRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpKSA6IGJ1ZmZlciksCiAgICAgICAgIG1SZWFyKDApLAotICAgICAgICBtUmVhZGVycygwKQorICAgICAgICBtUmVhZGVycygwKSwKKyAgICAgICAgbUZyZWVCdWZmZXJJbkRlc3RydWN0b3IoYnVmZmVyID09IE5VTEwpCiB7CiB9CiAKIFBpcGU6On5QaXBlKCkKIHsKICAgICBBTE9HX0FTU0VSVChhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1SZWFkZXJzKSA9PSAwKTsKLSAgICBmcmVlKG1CdWZmZXIpOworICAgIGlmIChtRnJlZUJ1ZmZlckluRGVzdHJ1Y3RvcikgeworICAgICAgICBmcmVlKG1CdWZmZXIpOworICAgIH0KIH0KIAogc3NpemVfdCBQaXBlOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCkKQEAgLTUyLDEzICs1NSwxMyBAQAogICAgIGlmIChDQ19MSUtFTFkod3JpdHRlbiA+IGNvdW50KSkgewogICAgICAgICB3cml0dGVuID0gY291bnQ7CiAgICAgfQotICAgIG1lbWNweSgoY2hhciAqKSBtQnVmZmVyICsgKHJlYXIgPDwgbUJpdFNoaWZ0KSwgYnVmZmVyLCB3cml0dGVuIDw8IG1CaXRTaGlmdCk7CisgICAgbWVtY3B5KChjaGFyICopIG1CdWZmZXIgKyAocmVhciAqIG1GcmFtZVNpemUpLCBidWZmZXIsIHdyaXR0ZW4gKiBtRnJhbWVTaXplKTsKICAgICBpZiAoQ0NfVU5MSUtFTFkocmVhciArIHdyaXR0ZW4gPT0gbU1heEZyYW1lcykpIHsKICAgICAgICAgaWYgKENDX1VOTElLRUxZKChjb3VudCAtPSB3cml0dGVuKSA+IHJlYXIpKSB7CiAgICAgICAgICAgICBjb3VudCA9IHJlYXI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKENDX0xJS0VMWShjb3VudCA+IDApKSB7Ci0gICAgICAgICAgICBtZW1jcHkobUJ1ZmZlciwgKGNoYXIgKikgYnVmZmVyICsgKHdyaXR0ZW4gPDwgbUJpdFNoaWZ0KSwgY291bnQgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgIG1lbWNweShtQnVmZmVyLCAoY2hhciAqKSBidWZmZXIgKyAod3JpdHRlbiAqIG1GcmFtZVNpemUpLCBjb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgd3JpdHRlbiArPSBjb3VudDsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL1BpcGVSZWFkZXIuY3BwIGIvbWVkaWEvbGlibmJhaW8vUGlwZVJlYWRlci5jcHAKaW5kZXggZDc4NmI4NC4uYzhlNDk1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vUGlwZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vUGlwZVJlYWRlci5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKICAgICByZXR1cm4gYXZhaWw7CiB9CiAKLXNzaXplX3QgUGlwZVJlYWRlcjo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCwgaW50NjRfdCByZWFkUFRTKQorc3NpemVfdCBQaXBlUmVhZGVyOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBpbnQ2NF90IHJlYWRQVFMgX191bnVzZWQpCiB7CiAgICAgc3NpemVfdCBhdmFpbCA9IGF2YWlsYWJsZVRvUmVhZCgpOwogICAgIGlmIChDQ19VTkxJS0VMWShhdmFpbCA8PSAwKSkgewpAQCAtNzYsMTQgKzc2LDE0IEBACiAgICAgICAgIHJlZCA9IGNvdW50OwogICAgIH0KICAgICAvLyBJbiBwYXJ0aWN1bGFyLCBhbiBvdmVycnVuIGR1cmluZyB0aGUgbWVtY3B5IHdpbGwgcmVzdWx0IGluIHJlYWRpbmcgY29ycnVwdCBkYXRhCi0gICAgbWVtY3B5KGJ1ZmZlciwgKGNoYXIgKikgbVBpcGUubUJ1ZmZlciArIChmcm9udCA8PCBtQml0U2hpZnQpLCByZWQgPDwgbUJpdFNoaWZ0KTsKKyAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtUGlwZS5tQnVmZmVyICsgKGZyb250ICogbUZyYW1lU2l6ZSksIHJlZCAqIG1GcmFtZVNpemUpOwogICAgIC8vIFdlIGNvdWxkIHJlLXJlYWQgdGhlIHJlYXIgcG9pbnRlciBoZXJlIHRvIGRldGVjdCB0aGUgY29ycnVwdGlvbiwgYnV0IHdoeSBib3RoZXI/CiAgICAgaWYgKENDX1VOTElLRUxZKGZyb250ICsgcmVkID09IG1QaXBlLm1NYXhGcmFtZXMpKSB7CiAgICAgICAgIGlmIChDQ19VTkxJS0VMWSgoY291bnQgLT0gcmVkKSA+IGZyb250KSkgewogICAgICAgICAgICAgY291bnQgPSBmcm9udDsKICAgICAgICAgfQogICAgICAgICBpZiAoQ0NfTElLRUxZKGNvdW50ID4gMCkpIHsKLSAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBidWZmZXIgKyAocmVkIDw8IG1CaXRTaGlmdCksIG1QaXBlLm1CdWZmZXIsIGNvdW50IDw8IG1CaXRTaGlmdCk7CisgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgYnVmZmVyICsgKHJlZCAqIG1GcmFtZVNpemUpLCBtUGlwZS5tQnVmZmVyLCBjb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgcmVkICs9IGNvdW50OwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5jcHAgYi9tZWRpYS9saWJuYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmNwcAppbmRleCAwNjJmYTBmLi5lMjFlZjQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmNwcApAQCAtMjQsNyArMjQsNyBAQAogCiBTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyOjpTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyKGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4mIHNvdXJjZSkgOgogICAgIG1Tb3VyY2Uoc291cmNlKSwKLSAgICAvLyBtRnJhbWVCaXRTaGlmdEZvcm1hdCBiZWxvdworICAgIC8vIG1GcmFtZVNpemUgYmVsb3cKICAgICBtQWxsb2NhdGVkKE5VTEwpLCBtU2l6ZSgwKSwgbU9mZnNldCgwKSwgbVJlbWFpbmluZygwKSwgbUdldENvdW50KDApLCBtRnJhbWVzUmVsZWFzZWQoMCkKIHsKICAgICBBTE9HX0FTU0VSVChzb3VyY2UgIT0gMCk7CkBAIC0zNyw3ICszNyw3IEBACiAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7CiAgICAgaW5kZXggPSBzb3VyY2UtPm5lZ290aWF0ZShjb3VudGVyT2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICBtRnJhbWVCaXRTaGlmdCA9IEZvcm1hdF9mcmFtZUJpdFNoaWZ0KHNvdXJjZS0+Zm9ybWF0KCkpOworICAgIG1GcmFtZVNpemUgPSBGb3JtYXRfZnJhbWVTaXplKHNvdXJjZS0+Zm9ybWF0KCkpOwogfQogCiBTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyOjp+U291cmNlQXVkaW9CdWZmZXJQcm92aWRlcigpCkBAIC01NCwxNCArNTQsMTQgQEAKICAgICAgICAgaWYgKG1SZW1haW5pbmcgPCBidWZmZXItPmZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1SZW1haW5pbmc7CiAgICAgICAgIH0KLSAgICAgICAgYnVmZmVyLT5yYXcgPSAoY2hhciAqKSBtQWxsb2NhdGVkICsgKG1PZmZzZXQgPDwgbUZyYW1lQml0U2hpZnQpOworICAgICAgICBidWZmZXItPnJhdyA9IChjaGFyICopIG1BbGxvY2F0ZWQgKyAobU9mZnNldCAqIG1GcmFtZVNpemUpOwogICAgICAgICBtR2V0Q291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAgICAgLy8gZG8gd2UgbmVlZCB0byByZWFsbG9jYXRlPwogICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiBtU2l6ZSkgewogICAgICAgICBmcmVlKG1BbGxvY2F0ZWQpOwotICAgICAgICBtQWxsb2NhdGVkID0gbWFsbG9jKGJ1ZmZlci0+ZnJhbWVDb3VudCA8PCBtRnJhbWVCaXRTaGlmdCk7CisgICAgICAgIG1BbGxvY2F0ZWQgPSBtYWxsb2MoYnVmZmVyLT5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgIG1TaXplID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIH0KICAgICAvLyByZWFkIGZyb20gc291cmNlCkBAIC04NCw3ICs4NCw3IEBACiB2b2lkIFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoQnVmZmVyICpidWZmZXIpCiB7CiAgICAgQUxPR19BU1NFUlQoKGJ1ZmZlciAhPSBOVUxMKSAmJgotICAgICAgICAgICAgKGJ1ZmZlci0+cmF3ID09IChjaGFyICopIG1BbGxvY2F0ZWQgKyAobU9mZnNldCA8PCBtRnJhbWVCaXRTaGlmdCkpICYmCisgICAgICAgICAgICAoYnVmZmVyLT5yYXcgPT0gKGNoYXIgKikgbUFsbG9jYXRlZCArIChtT2Zmc2V0ICogbUZyYW1lU2l6ZSkpICYmCiAgICAgICAgICAgICAoYnVmZmVyLT5mcmFtZUNvdW50IDw9IG1HZXRDb3VudCkgJiYKICAgICAgICAgICAgIChtR2V0Q291bnQgPD0gbVJlbWFpbmluZykgJiYKICAgICAgICAgICAgIChtT2Zmc2V0ICsgbVJlbWFpbmluZyA8PSBtU2l6ZSkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ0V4dHJhY3Rvci5jcHAKaW5kZXggNGQxMDcyZi4uMTk2ZjZlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNFeHRyYWN0b3IuY3BwCkBAIC0yMTksNyArMjE5LDcgQEAKICAgICByZXR1cm4gbmV3IEFBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbU1ldGEsIG1PZmZzZXRWZWN0b3IsIG1GcmFtZUR1cmF0aW9uVXMpOwogfQogCi1zcDxNZXRhRGF0YT4gQUFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKK3NwPE1ldGFEYXRhPiBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjUyLDcgKzI1Miw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IEFBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgaWYgKG1PZmZzZXRWZWN0b3IuZW1wdHkoKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKaW5kZXggYTZmN2NmYi4uMzUzOTIwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCkBAIC0xNCw2ICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkFBQ1dyaXRlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI3LDEwICszMyw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTExLDcgKzExMyw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBQUNXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IEFBQ1dyaXRlcjo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKICAgICB9CkBAIC0xNzEsNyArMTczLDcgQEAKICAgICB2b2lkICpkdW1teTsKICAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKIAotICAgIHN0YXR1c190IGVyciA9IChzdGF0dXNfdCkgZHVtbXk7CisgICAgc3RhdHVzX3QgZXJyID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdW1teSkpOwogICAgIHsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgICAgICBpZiAoZXJyID09IE9LICYmCkBAIC0yMDAsNyArMjAyLDcgQEAKIAogLy8gc3RhdGljCiB2b2lkICpBQUNXcml0ZXI6OlRocmVhZFdyYXBwZXIodm9pZCAqbWUpIHsKLSAgICByZXR1cm4gKHZvaWQgKikgc3RhdGljX2Nhc3Q8QUFDV3JpdGVyICo+KG1lKS0+dGhyZWFkRnVuYygpOworICAgIHJldHVybiAodm9pZCAqKSh1aW50cHRyX3Qpc3RhdGljX2Nhc3Q8QUFDV3JpdGVyICo+KG1lKS0+dGhyZWFkRnVuYygpOwogfQogCiAvKgpAQCAtMzQ4LDcgKzM1MCw3IEBACiAgICAgICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHRpbWVzdGFtcFVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKLSAgICAgICAgQUxPR1YoInRpbWUgc3RhbXA6ICVsbGQsIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbjogJWxsZCIsCisgICAgICAgIEFMT0dWKCJ0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiwgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uOiAlIiBQUklkNjQsCiAgICAgICAgICAgICB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKICAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbWF4VGltZXN0YW1wVXMpIHsKICAgICAgICAgICAgIG1heFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA2N2ExOWNkLi4yZTE2NTUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTE3LDYgKzE3LDEzIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkFDb2RlYyIKIAorI2lmZGVmIF9fTFA2NF9fCisjZGVmaW5lIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCisjZW5kaWYKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgpAQCAtMjUsNiArMzIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgpAQCAtMzYsNiArNDQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAKICNpbmNsdWRlIDxPTVhfQXVkaW9FeHQuaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CiAKQEAgLTQzLDYgKzUyLDQ4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gT01YIGVycm9ycyBhcmUgZGlyZWN0bHkgbWFwcGVkIGludG8gc3RhdHVzX3QgcmFuZ2UgaWYKKy8vIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgTWVkaWFFcnJvciBzdGF0dXMgY29kZS4KKy8vIFVzZSB0aGUgc3RhdHVzRnJvbU9NWEVycm9yKGludDMyX3Qgb214RXJyb3IpIGZ1bmN0aW9uLgorLy8KKy8vIEN1cnJlbnRseSB0aGlzIGlzIGEgZGlyZWN0IG1hcC4KKy8vIFNlZSBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0NvcmUuaAorLy8KKy8vIFZlbmRvciBPTVggZXJyb3JzICAgICBmcm9tIDB4OTAwMDAwMDAgLSAweDkwMDBGRkZGCisvLyBFeHRlbnNpb24gT01YIGVycm9ycyAgZnJvbSAweDhGMDAwMDAwIC0gMHg5MDAwMDAwMAorLy8gU3RhbmRhcmQgT01YIGVycm9ycyAgIGZyb20gMHg4MDAwMTAwMCAtIDB4ODAwMDEwMjQgKDB4ODAwMDEwMjQgY3VycmVudCkKKy8vCisKKy8vIHJldHVybnMgdHJ1ZSBpZiBlcnIgaXMgYSByZWNvZ25pemVkIE9NWCBlcnJvciBjb2RlLgorLy8gYXMgT01YIGVycm9yIGlzIE9NWF9TMzIsIHRoaXMgaXMgYW4gaW50MzJfdCB0eXBlCitzdGF0aWMgaW5saW5lIGJvb2wgaXNPTVhFcnJvcihpbnQzMl90IGVycikgeworICAgIHJldHVybiAoRVJST1JfQ09ERUNfTUlOIDw9IGVyciAmJiBlcnIgPD0gRVJST1JfQ09ERUNfTUFYKTsKK30KKworLy8gY29udmVydHMgYW4gT01YIGVycm9yIHRvIGEgc3RhdHVzX3QKK3N0YXRpYyBpbmxpbmUgc3RhdHVzX3Qgc3RhdHVzRnJvbU9NWEVycm9yKGludDMyX3Qgb214RXJyb3IpIHsKKyAgICBzd2l0Y2ggKG9teEVycm9yKSB7CisgICAgY2FzZSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZToKKyAgICBjYXNlIE9NWF9FcnJvckNvbXBvbmVudE5vdEZvdW5kOgorICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7IC8vIGNhbiB0cmlnZ2VyIGlsbGVnYWwgYXJndW1lbnQgZXJyb3IgZm9yIHByb3ZpZGVkIG5hbWVzLgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBpc09NWEVycm9yKG9teEVycm9yKSA/IG9teEVycm9yIDogMDsgLy8gbm8gdHJhbnNsYXRpb24gcmVxdWlyZWQKKyAgICB9Cit9CisKKy8vIGNoZWNrcyBhbmQgY29udmVydHMgc3RhdHVzX3QgdG8gYSBub24tc2lkZS1lZmZlY3Qgc3RhdHVzX3QKK3N0YXRpYyBpbmxpbmUgc3RhdHVzX3QgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhzdGF0dXNfdCBlcnIpIHsKKyAgICBzd2l0Y2ggKGVycikgeworICAgIC8vIHRoZSBmb2xsb3dpbmcgZXJyb3JzIGhhdmUgc2lkZSBlZmZlY3RzIGFuZCBtYXkgY29tZQorICAgIC8vIGZyb20gb3RoZXIgY29kZSBtb2R1bGVzLiBSZW1hcCBmb3Igc2FmZXR5IHJlYXNvbnMuCisgICAgY2FzZSBJTlZBTElEX09QRVJBVElPTjoKKyAgICBjYXNlIERFQURfT0JKRUNUOgorICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KK30KKwogdGVtcGxhdGU8Y2xhc3MgVD4KIHN0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CiAgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKQEAgLTY0LDcgKzExNSw3IEBACiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKIAogICAgICAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgb214X21zZy50eXBlKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKCJub2RlIiwgb214X21zZy5ub2RlKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigibm9kZSIsIG9teF9tc2cubm9kZSk7CiAKICAgICAgICAgc3dpdGNoIChvbXhfbXNnLnR5cGUpIHsKICAgICAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkVWRU5UOgpAQCAtNzcsMTMgKzEyOCwxMyBAQAogCiAgICAgICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpFTVBUWV9CVUZGRVJfRE9ORToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoImJ1ZmZlciIsIG9teF9tc2cudS5idWZmZXJfZGF0YS5idWZmZXIpOworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImJ1ZmZlciIsIG9teF9tc2cudS5idWZmZXJfZGF0YS5idWZmZXIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpGSUxMX0JVRkZFUl9ET05FOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcigKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciIsIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIpOwogICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAicmFuZ2Vfb2Zmc2V0IiwKQEAgLTk3LDEyICsxNDgsNiBAQAogICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoCiAgICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS50aW1lc3RhbXApOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybV9wcml2YXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5wbGF0Zm9ybV9wcml2YXRlKTsKLSAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZGF0YV9wdHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmRhdGFfcHRyKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTU3LDkgKzIwMiw3IEBACiAgICAgICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQsCiAgICAgICAgICAgICBzaXplX3QgcmFuZ2VPZmZzZXQsIHNpemVfdCByYW5nZUxlbmd0aCwKICAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsCi0gICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywKLSAgICAgICAgICAgIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSwKLSAgICAgICAgICAgIHZvaWQgKmRhdGFQdHIpOworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMpOwogCiAgICAgdm9pZCBnZXRNb3JlSW5wdXREYXRhSWZQb3NzaWJsZSgpOwogCkBAIC0zNjAsMjIgKzQwMywyNyBAQAogCiBBQ29kZWM6OkFDb2RlYygpCiAgICAgOiBtUXVpcmtzKDApLAotICAgICAgbU5vZGUoTlVMTCksCisgICAgICBtTm9kZSgwKSwKICAgICAgIG1TZW50Rm9ybWF0KGZhbHNlKSwKICAgICAgIG1Jc0VuY29kZXIoZmFsc2UpLAogICAgICAgbVVzZU1ldGFkYXRhT25FbmNvZGVyT3V0cHV0KGZhbHNlKSwKICAgICAgIG1GYXRhbEVycm9yKGZhbHNlKSwKICAgICAgIG1TaHV0ZG93bkluUHJvZ3Jlc3MoZmFsc2UpLAotICAgICAgbUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2soZmFsc2UpLAorICAgICAgbUV4cGxpY2l0U2h1dGRvd24oZmFsc2UpLAogICAgICAgbUVuY29kZXJEZWxheSgwKSwKICAgICAgIG1FbmNvZGVyUGFkZGluZygwKSwKKyAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMoMCksCiAgICAgICBtQ2hhbm5lbE1hc2tQcmVzZW50KGZhbHNlKSwKICAgICAgIG1DaGFubmVsTWFzaygwKSwKICAgICAgIG1EZXF1ZXVlQ291bnRlcigwKSwKICAgICAgIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzKGZhbHNlKSwKICAgICAgIG1NZXRhRGF0YUJ1ZmZlcnNUb1N1Ym1pdCgwKSwKICAgICAgIG1SZXBlYXRGcmFtZURlbGF5VXMoLTFsbCksCi0gICAgICBtTWF4UHRzR2FwVXMoLTFsKSB7CisgICAgICBtTWF4UHRzR2FwVXMoLTFsbCksCisgICAgICBtVGltZVBlckZyYW1lVXMoLTFsbCksCisgICAgICBtVGltZVBlckNhcHR1cmVVcygtMWxsKSwKKyAgICAgIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQoZmFsc2UpLAorICAgICAgbVR1bm5lbGVkKGZhbHNlKSB7CiAgICAgbVVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBVbmluaXRpYWxpemVkU3RhdGUodGhpcyk7CiAgICAgbUxvYWRlZFN0YXRlID0gbmV3IExvYWRlZFN0YXRlKHRoaXMpOwogICAgIG1Mb2FkZWRUb0lkbGVTdGF0ZSA9IG5ldyBMb2FkZWRUb0lkbGVTdGF0ZSh0aGlzKTsKQEAgLTQ1MSw2ICs0OTksMTAgQEAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2h1dGRvd24sIGlkKCkpOwogICAgIG1zZy0+c2V0SW50MzIoImtlZXBDb21wb25lbnRBbGxvY2F0ZWQiLCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkKTsKICAgICBtc2ctPnBvc3QoKTsKKyAgICBpZiAoIWtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKKyAgICAgICAgLy8gZW5zdXJlIHNodXRkb3duIGNvbXBsZXRlcyBpbiAzIHNlY29uZHMKKyAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VDb2RlY0luc3RhbmNlLCBpZCgpKSktPnBvc3QoMzAwMDAwMCk7CisgICAgfQogfQogCiB2b2lkIEFDb2RlYzo6c2lnbmFsUmVxdWVzdElEUkZyYW1lKCkgewpAQCAtNDkxLDcgKzU0Myw3IEBACiAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKIAogICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICBBTE9HVigiWyVzXSBBbGxvY2F0aW5nICVsdSBidWZmZXJzIG9mIHNpemUgJWx1IG9uICVzIHBvcnQiLAorICAgICAgICAgICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAldSBidWZmZXJzIG9mIHNpemUgJXUgb24gJXMgcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIGRlZi5uQnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCA/ICJpbnB1dCIgOiAib3V0cHV0Iik7CkBAIC01NDcsNyArNTk5LDcgQEAKICAgICB9CiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRCdWZmZXJzQWxsb2NhdGVkKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQpOwogCiAgICAgbm90aWZ5LT5zZXRJbnQzMigicG9ydEluZGV4IiwgcG9ydEluZGV4KTsKIApAQCAtNTkxLDYgKzY0MywyNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIGlmIChtUm90YXRpb25EZWdyZWVzICE9IDApIHsKKyAgICAgICAgdWludDMyX3QgdHJhbnNmb3JtID0gMDsKKyAgICAgICAgc3dpdGNoIChtUm90YXRpb25EZWdyZWVzKSB7CisgICAgICAgICAgICBjYXNlIDA6IHRyYW5zZm9ybSA9IDA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MDogdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfOTA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODA6IHRyYW5zZm9ybSA9IEhBTF9UUkFOU0ZPUk1fUk9UXzE4MDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3MDogdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfMjcwOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHRyYW5zZm9ybSA9IDA7IGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRyYW5zZm9ybSA+IDApIHsKKyAgICAgICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKAorICAgICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCB0cmFuc2Zvcm0pOworICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtIGZhaWxlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFNldCB1cCB0aGUgbmF0aXZlIHdpbmRvdy4KICAgICBPTVhfVTMyIHVzYWdlID0gMDsKICAgICBlcnIgPSBtT01YLT5nZXRHcmFwaGljQnVmZmVyVXNhZ2UobU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsICZ1c2FnZSk7CkBAIC02MzIsNiArNzA1LDIxIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgLy8gRXhpdHMgaGVyZSBmb3IgdHVubmVsZWQgdmlkZW8gcGxheWJhY2sgY29kZWNzIC0tIGkuZS4gc2tpcHMgbmF0aXZlIHdpbmRvdworICAgIC8vIGJ1ZmZlciBhbGxvY2F0aW9uIHN0ZXAgYXMgdGhpcyBpcyBtYW5hZ2VkIGJ5IHRoZSB0dW5uZWxlZCBPTVggb21wb25lbnQKKyAgICAvLyBpdHNlbGYgYW5kIGV4cGxpY2l0bHkgc2V0cyBkZWYubkJ1ZmZlckNvdW50QWN0dWFsIHRvIDAuCisgICAgaWYgKG1UdW5uZWxlZCkgeworICAgICAgICBBTE9HVigiVHVubmVsZWQgUGxheWJhY2s6IHNraXBwaW5nIG5hdGl2ZSB3aW5kb3cgYnVmZmVyIGFsbG9jYXRpb24uIik7CisgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSAwOworICAgICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKKworICAgICAgICAqbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgPSAwOworICAgICAgICAqYnVmZmVyQ291bnQgPSAwOworICAgICAgICAqYnVmZmVyU2l6ZSA9IDA7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgKm1pblVuZGVxdWV1ZWRCdWZmZXJzID0gMDsKICAgICBlcnIgPSBtTmF0aXZlV2luZG93LT5xdWVyeSgKICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywKQEAgLTY0MywxOCArNzMxLDM0IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgLy8gWFhYOiBJcyB0aGlzIHRoZSByaWdodCBsb2dpYyB0byB1c2U/ICBJdCdzIG5vdCBjbGVhciB0byBtZSB3aGF0IHRoZSBPTVgKLSAgICAvLyBidWZmZXIgY291bnRzIHJlZmVyIHRvIC0gaG93IGRvIHRoZXkgYWNjb3VudCBmb3IgdGhlIHJlbmRlcmVyIGhvbGRpbmcgb24KLSAgICAvLyB0byBidWZmZXJzPwotICAgIGlmIChkZWYubkJ1ZmZlckNvdW50QWN0dWFsIDwgZGVmLm5CdWZmZXJDb3VudE1pbiArICptaW5VbmRlcXVldWVkQnVmZmVycykgewotICAgICAgICBPTVhfVTMyIG5ld0J1ZmZlckNvdW50ID0gZGVmLm5CdWZmZXJDb3VudE1pbiArICptaW5VbmRlcXVldWVkQnVmZmVyczsKKyAgICAvLyBGSVhNRTogYXNzdW1lIHRoYXQgc3VyZmFjZSBpcyBjb250cm9sbGVkIGJ5IGFwcCAobmF0aXZlIHdpbmRvdworICAgIC8vIHJldHVybnMgdGhlIG51bWJlciBmb3IgdGhlIGNhc2Ugd2hlbiBzdXJmYWNlIGlzIG5vdCBjb250cm9sbGVkIGJ5IGFwcCkKKyAgICAvLyBGSVhNRTI6IFRoaXMgbWVhbnMgdGhhdCBtaW5VbmRlcWV1ZXVkQnVmcyBjYW4gYmUgMSBsYXJnZXIgdGhhbiByZXBvcnRlZAorICAgIC8vIEZvciBub3csIHRyeSB0byBhbGxvY2F0ZSAxIG1vcmUgYnVmZmVyLCBidXQgZG9uJ3QgZmFpbCBpZiB1bnN1Y2Nlc3NmdWwKKworICAgIC8vIFVzZSBjb25zZXJ2YXRpdmUgYWxsb2NhdGlvbiB3aGlsZSBhbHNvIHRyeWluZyB0byByZWR1Y2Ugc3RhcnZhdGlvbgorICAgIC8vCisgICAgLy8gMS4gYWxsb2NhdGUgYXQgbGVhc3QgbkJ1ZmZlckNvdW50TWluICsgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgLSB0aGF0IGlzIHRoZQorICAgIC8vICAgIG1pbmltdW0gbmVlZGVkIGZvciB0aGUgY29uc3VtZXIgdG8gYmUgYWJsZSB0byB3b3JrCisgICAgLy8gMi4gdHJ5IHRvIGFsbG9jYXRlIHR3byAoMikgYWRkaXRpb25hbCBidWZmZXJzIHRvIHJlZHVjZSBzdGFydmF0aW9uIGZyb20KKyAgICAvLyAgICB0aGUgY29uc3VtZXIKKyAgICAvLyAgICBwbHVzIGFuIGV4dHJhIGJ1ZmZlciB0byBhY2NvdW50IGZvciBpbmNvcnJlY3QgbWluVW5kZXF1ZXVlZEJ1ZnMKKyAgICBmb3IgKE9NWF9VMzIgZXh0cmFCdWZmZXJzID0gMiArIDE7IC8qIGNvbmRpdGlvbiBpbnNpZGUgbG9vcCAqLzsgZXh0cmFCdWZmZXJzLS0pIHsKKyAgICAgICAgT01YX1UzMiBuZXdCdWZmZXJDb3VudCA9CisgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50TWluICsgKm1pblVuZGVxdWV1ZWRCdWZmZXJzICsgZXh0cmFCdWZmZXJzOwogICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gbmV3QnVmZmVyQ291bnQ7CiAgICAgICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOwogCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJbJXNdIHNldHRpbmcgbkJ1ZmZlckNvdW50QWN0dWFsIHRvICVsdSBmYWlsZWQ6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbmV3QnVmZmVyQ291bnQsIGVycik7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICptaW5VbmRlcXVldWVkQnVmZmVycyArPSBleHRyYUJ1ZmZlcnM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dXKCJbJXNdIHNldHRpbmcgbkJ1ZmZlckNvdW50QWN0dWFsIHRvICV1IGZhaWxlZDogJWQiLAorICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG5ld0J1ZmZlckNvdW50LCBlcnIpOworICAgICAgICAvKiBleGl0IGNvbmRpdGlvbiAqLworICAgICAgICBpZiAoZXh0cmFCdWZmZXJzID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CkBAIC02NzksOCArNzgzLDkgQEAKICAgICAgICAgICAgICZidWZmZXJDb3VudCwgJmJ1ZmZlclNpemUsICZtaW5VbmRlcXVldWVkQnVmZmVycyk7CiAgICAgaWYgKGVyciAhPSAwKQogICAgICAgICByZXR1cm4gZXJyOworICAgIG1OdW1VbmRlcXVldWVkQnVmZmVycyA9IG1pblVuZGVxdWV1ZWRCdWZmZXJzOwogCi0gICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAlbHUgYnVmZmVycyBmcm9tIGEgbmF0aXZlIHdpbmRvdyBvZiBzaXplICVsdSBvbiAiCisgICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAldSBidWZmZXJzIGZyb20gYSBuYXRpdmUgd2luZG93IG9mIHNpemUgJXUgb24gIgogICAgICAgICAgIm91dHB1dCBwb3J0IiwKICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGJ1ZmZlckNvdW50LCBidWZmZXJTaXplKTsKIApAQCAtNzA0LDE0ICs4MDksMTQgQEAKICAgICAgICAgZXJyID0gbU9NWC0+dXNlR3JhcGhpY0J1ZmZlcihtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgZ3JhcGhpY0J1ZmZlciwKICAgICAgICAgICAgICAgICAmYnVmZmVySWQpOwogICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJyZWdpc3RlcmluZyBHcmFwaGljQnVmZmVyICVsdSB3aXRoIE9NWCBJTCBjb21wb25lbnQgZmFpbGVkOiAiCisgICAgICAgICAgICBBTE9HRSgicmVnaXN0ZXJpbmcgR3JhcGhpY0J1ZmZlciAldSB3aXRoIE9NWCBJTCBjb21wb25lbnQgZmFpbGVkOiAiCiAgICAgICAgICAgICAgICAgICIlZCIsIGksIGVycik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIG1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLmVkaXRJdGVtQXQoaSkubUJ1ZmZlcklEID0gYnVmZmVySWQ7CiAKLSAgICAgICAgQUxPR1YoIlslc10gUmVnaXN0ZXJlZCBncmFwaGljIGJ1ZmZlciB3aXRoIElEICVwIChwb2ludGVyID0gJXApIiwKKyAgICAgICAgQUxPR1YoIlslc10gUmVnaXN0ZXJlZCBncmFwaGljIGJ1ZmZlciB3aXRoIElEICV1IChwb2ludGVyID0gJXApIiwKICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAogICAgICAgICAgICAgIGJ1ZmZlcklkLCBncmFwaGljQnVmZmVyLmdldCgpKTsKICAgICB9CkBAIC03MzIsNyArODM3LDEwIEBACiAKICAgICBmb3IgKE9NWF9VMzIgaSA9IGNhbmNlbFN0YXJ0OyBpIDwgY2FuY2VsRW5kOyBpKyspIHsKICAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5lZGl0SXRlbUF0KGkpOwotICAgICAgICBjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyb3IgPSBjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKTsKKyAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICBlcnIgPSBlcnJvcjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBlcnI7CkBAIC03NDQsOCArODUyLDkgQEAKICAgICAgICAgICAgICZidWZmZXJDb3VudCwgJmJ1ZmZlclNpemUsICZtaW5VbmRlcXVldWVkQnVmZmVycyk7CiAgICAgaWYgKGVyciAhPSAwKQogICAgICAgICByZXR1cm4gZXJyOworICAgIG1OdW1VbmRlcXVldWVkQnVmZmVycyA9IG1pblVuZGVxdWV1ZWRCdWZmZXJzOwogCi0gICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAlbHUgbWV0YSBidWZmZXJzIG9uIG91dHB1dCBwb3J0IiwKKyAgICBBTE9HVigiWyVzXSBBbGxvY2F0aW5nICV1IG1ldGEgYnVmZmVycyBvbiBvdXRwdXQgcG9ydCIsCiAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBidWZmZXJDb3VudCk7CiAKICAgICBzaXplX3QgdG90YWxTaXplID0gYnVmZmVyQ291bnQgKiA4OwpAQCAtNzcxLDcgKzg4MCw3IEBACiAKICAgICAgICAgbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0ucHVzaChpbmZvKTsKIAotICAgICAgICBBTE9HVigiWyVzXSBhbGxvY2F0ZWQgbWV0YSBidWZmZXIgd2l0aCBJRCAlcCAocG9pbnRlciA9ICVwKSIsCisgICAgICAgIEFMT0dWKCJbJXNdIGFsbG9jYXRlZCBtZXRhIGJ1ZmZlciB3aXRoIElEICV1IChwb2ludGVyID0gJXApIiwKICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbmZvLm1CdWZmZXJJRCwgbWVtLT5wb2ludGVyKCkpOwogICAgIH0KIApAQCAtNzg4LDcgKzg5Nyw3IEBACiAgICAgaWYgKGluZm8gPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogCi0gICAgQUxPR1YoIlslc10gc3VibWl0dGluZyBvdXRwdXQgbWV0YSBidWZmZXIgSUQgJXAgZm9yIGdyYXBoaWMgYnVmZmVyICVwIiwKKyAgICBBTE9HVigiWyVzXSBzdWJtaXR0aW5nIG91dHB1dCBtZXRhIGJ1ZmZlciBJRCAldSBmb3IgZ3JhcGhpYyBidWZmZXIgJXAiLAogICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCwgaW5mby0+bUdyYXBoaWNCdWZmZXIuZ2V0KCkpOwogCiAgICAgLS1tTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQ7CkBAIC04MDIsMTcgKzkxMSwxOCBAQAogc3RhdHVzX3QgQUNvZGVjOjpjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhCdWZmZXJJbmZvICppbmZvKSB7CiAgICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLCAoaW50KUJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKTsKIAotICAgIEFMT0dWKCJbJXNdIENhbGxpbmcgY2FuY2VsQnVmZmVyIG9uIGJ1ZmZlciAlcCIsCisgICAgQUxPR1YoIlslc10gQ2FsbGluZyBjYW5jZWxCdWZmZXIgb24gYnVmZmVyICV1IiwKICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCk7CiAKICAgICBpbnQgZXJyID0gbU5hdGl2ZVdpbmRvdy0+Y2FuY2VsQnVmZmVyKAogICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBpbmZvLT5tR3JhcGhpY0J1ZmZlci5nZXQoKSwgLTEpOwogCi0gICAgQ0hFQ0tfRVEoZXJyLCAwKTsKKyAgICBBTE9HV19JRihlcnIgIT0gMCwgIlslc10gY2FuIG5vdCByZXR1cm4gYnVmZmVyICV1IHRvIG5hdGl2ZSB3aW5kb3ciLAorICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgaW5mby0+bUJ1ZmZlcklEKTsKIAogICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBlcnI7CiB9CiAKIEFDb2RlYzo6QnVmZmVySW5mbyAqQUNvZGVjOjpkZXF1ZXVlQnVmZmVyRnJvbU5hdGl2ZVdpbmRvdygpIHsKQEAgLTgyMCw2ICs5MzAsMTIgQEAKICAgICBpbnQgZmVuY2VGZCA9IC0xOwogICAgIENIRUNLKG1OYXRpdmVXaW5kb3cuZ2V0KCkgIT0gTlVMTCk7CiAKKyAgICBpZiAobVR1bm5lbGVkKSB7CisgICAgICAgIEFMT0dXKCJkZXF1ZXVlQnVmZmVyRnJvbU5hdGl2ZVdpbmRvdygpIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHR1bm5lbCIKKyAgICAgICAgICAgICAgIiB2aWRlbyBwbGF5YmFjayBtb2RlIG1vZGUhIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIGlmIChtRmF0YWxFcnJvcikgewogICAgICAgICBBTE9HVygibm90IGRlcXVldWluZyBmcm9tIG5hdGl2ZSB3aW5kb3cgZHVlIHRvIGZhdGFsIGVycm9yIik7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtOTE4LDcgKzEwMzQsNyBAQAogCiAgICAgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0ICYmIG1OYXRpdmVXaW5kb3cgIT0gTlVMTAogICAgICAgICAgICAgJiYgaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUykgewotICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGNhbmNlbEJ1ZmZlclRvTmF0aXZlV2luZG93KGluZm8pKTsKKyAgICAgICAgY2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coaW5mbyk7CiAgICAgfQogCiAgICAgQ0hFQ0tfRVEobU9NWC0+ZnJlZUJ1ZmZlcigKQEAgLTk3MiwxMiArMTA4OCwxNiBAQAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIiwgImF1ZGlvX2VuY29kZXIuYWFjIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLnZvcmJpcyIsICJhdWRpb19lbmNvZGVyLnZvcmJpcyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLAorICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIub3B1cyIsICJhdWRpb19lbmNvZGVyLm9wdXMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuZzcxMW1sYXciLCAiYXVkaW9fZW5jb2Rlci5nNzExbWxhdyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIsICJhdWRpb19lbmNvZGVyLmc3MTFhbGF3IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywKICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLmF2YyIsICJ2aWRlb19lbmNvZGVyLmF2YyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLAorICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuaGV2YyIsICJ2aWRlb19lbmNvZGVyLmhldmMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsCiAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5tcGVnNCIsICJ2aWRlb19lbmNvZGVyLm1wZWc0IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsCkBAIC0xMDQ3LDYgKzExNjcsOSBAQAogICAgICAgICBlbmNvZGVyID0gZmFsc2U7CiAgICAgfQogCisgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworCiAgICAgbUlzRW5jb2RlciA9IGVuY29kZXI7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBzZXRDb21wb25lbnRSb2xlKGVuY29kZXIgLyogaXNFbmNvZGVyICovLCBtaW1lKTsKQEAgLTExMjksNzQgKzEyNTIsMTI0IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJtYXgtcHRzLWdhcC10by1lbmNvZGVyIiwgJm1NYXhQdHNHYXBVcykpIHsKLSAgICAgICAgICAgIG1NYXhQdHNHYXBVcyA9IC0xbDsKKyAgICAgICAgICAgIG1NYXhQdHNHYXBVcyA9IC0xbGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJ0aW1lLWxhcHNlIiwgJm1UaW1lUGVyQ2FwdHVyZVVzKSkgeworICAgICAgICAgICAgbVRpbWVQZXJDYXB0dXJlVXMgPSAtMWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0ZS1pbnB1dC1idWZmZXJzLXN1c3BlbmRlZCIsCisgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCkpIHsKKyAgICAgICAgICAgIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIEFsd2F5cyB0cnkgdG8gZW5hYmxlIGR5bmFtaWMgb3V0cHV0IGJ1ZmZlcnMgb24gbmF0aXZlIHN1cmZhY2UKICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgaW50MzJfdCBoYXZlTmF0aXZlV2luZG93ID0gbXNnLT5maW5kT2JqZWN0KCJuYXRpdmUtd2luZG93IiwgJm9iaikgJiYKLSAgICAgICAgICAgIG9iaiAhPSBOVUxMOworICAgICAgICBvYmogIT0gTlVMTDsKICAgICBtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycyA9IGZhbHNlOwotICAgIG1Jc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrID0gZmFsc2U7CisgICAgaWYgKHZpZGVvICYmICFlbmNvZGVyKSB7CisgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCBmYWxzZSk7CisgICAgfQogICAgIGlmICghZW5jb2RlciAmJiB2aWRlbyAmJiBoYXZlTmF0aXZlV2luZG93KSB7Ci0gICAgICAgIGVyciA9IG1PTVgtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMobU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIlslc10gc3RvcmVNZXRhRGF0YUluQnVmZmVycyBmYWlsZWQgdy8gZXJyICVkIiwKLSAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+IHdpbmRvd1dyYXBwZXIoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93ID0gd2luZG93V3JhcHBlci0+Z2V0TmF0aXZlV2luZG93KCk7CiAKLSAgICAgICAgICAgIC8vIGlmIGFkYXB0aXZlIHBsYXliYWNrIGhhcyBiZWVuIHJlcXVlc3RlZCwgdHJ5IEpCIGZhbGxiYWNrCi0gICAgICAgICAgICAvLyBOT1RFOiBUSElTIEZBTExCQUNLIE1FQ0hBTklTTSBXSUxMIEJFIFJFTU9WRUQgRFVFIFRPIElUUwotICAgICAgICAgICAgLy8gTEFSR0UgTUVNT1JZIFJFUVVJUkVNRU5UCisgICAgICAgIGludDMyX3QgdHVubmVsZWQ7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZmVhdHVyZS10dW5uZWxlZC1wbGF5YmFjayIsICZ0dW5uZWxlZCkgJiYKKyAgICAgICAgICAgIHR1bm5lbGVkICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dJKCJDb25maWd1cmluZyBUVU5ORUxFRCB2aWRlbyBwbGF5YmFjay4iKTsKKyAgICAgICAgICAgIG1UdW5uZWxlZCA9IHRydWU7CiAKLSAgICAgICAgICAgIC8vIHdlIHdpbGwgbm90IGRvIGFkYXB0aXZlIHBsYXliYWNrIG9uIHNvZnR3YXJlIGFjY2Vzc2VkCi0gICAgICAgICAgICAvLyBzdXJmYWNlcyBhcyB0aGV5IG5ldmVyIGhhZCB0byByZXNwb25kIHRvIGNoYW5nZXMgaW4gdGhlCi0gICAgICAgICAgICAvLyBjcm9wIHdpbmRvdywgYW5kIHdlIGRvbid0IHRydXN0IHRoYXQgdGhleSB3aWxsIGJlIGFibGUgdG8uCi0gICAgICAgICAgICBpbnQgdXNhZ2VCaXRzID0gMDsKLSAgICAgICAgICAgIGJvb2wgY2FuRG9BZGFwdGl2ZVBsYXliYWNrOwotCi0gICAgICAgICAgICBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiB3aW5kb3dXcmFwcGVyKAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSkpOwotICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93ID0gd2luZG93V3JhcHBlci0+Z2V0TmF0aXZlV2luZG93KCk7Ci0KLSAgICAgICAgICAgIGlmIChuYXRpdmVXaW5kb3ctPnF1ZXJ5KAotICAgICAgICAgICAgICAgICAgICBuYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQ09OU1VNRVJfVVNBR0VfQklUUywKLSAgICAgICAgICAgICAgICAgICAgJnVzYWdlQml0cykgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBjYW5Eb0FkYXB0aXZlUGxheWJhY2sgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2FuRG9BZGFwdGl2ZVBsYXliYWNrID0KLSAgICAgICAgICAgICAgICAgICAgKHVzYWdlQml0cyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLKSkgPT0gMDsKKyAgICAgICAgICAgIGludDMyX3QgYXVkaW9Id1N5bmMgPSAwOworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYXVkaW8taHctc3luYyIsICZhdWRpb0h3U3luYykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiTm8gQXVkaW8gSFcgU3luYyBwcm92aWRlZCBmb3IgdmlkZW8gdHVubmVsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2soYXVkaW9Id1N5bmMsIG5hdGl2ZVdpbmRvdyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImNvbmZpZ3VyZVR1bm5lbGVkVmlkZW9QbGF5YmFjayglZCwlcCkgZmFpbGVkISIsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0h3U3luYywgbmF0aXZlV2luZG93LmdldCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQzMl90IG1heFdpZHRoID0gMCwgbWF4SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgIGlmIChjYW5Eb0FkYXB0aXZlUGxheWJhY2sgJiYKLSAgICAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigibWF4LXdpZHRoIiwgJm1heFdpZHRoKSAmJgotICAgICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJtYXgtaGVpZ2h0IiwgJm1heEhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBwcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjayglbGR4JWxkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbWF4V2lkdGgsIG1heEhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwgbWF4V2lkdGgsIG1heEhlaWdodCk7Ci0gICAgICAgICAgICAgICAgQUxPR1dfSUYoZXJyICE9IE9LLAotICAgICAgICAgICAgICAgICAgICAgICAgIlslc10gcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2sgZmFpbGVkIHcvIGVyciAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwotICAgICAgICAgICAgICAgIG1Jc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrID0gKGVyciA9PSBPSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhbGxvdyBmYWlsdXJlCi0gICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCB0cnVlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMgc3VjY2VlZGVkIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICBtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycyA9IHRydWU7Ci0gICAgICAgICAgICBtSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjayA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigiQ29uZmlndXJpbmcgQ1BVIGNvbnRyb2xsZWQgdmlkZW8gcGxheWJhY2suIik7CisgICAgICAgICAgICBtVHVubmVsZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gQWx3YXlzIHRyeSB0byBlbmFibGUgZHluYW1pYyBvdXRwdXQgYnVmZmVycyBvbiBuYXRpdmUgc3VyZmFjZQorICAgICAgICAgICAgZXJyID0gbU9NWC0+c3RvcmVNZXRhRGF0YUluQnVmZmVycygKKyAgICAgICAgICAgICAgICAgICAgbU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiWyVzXSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIGZhaWxlZCB3LyBlcnIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKworICAgICAgICAgICAgICAgIC8vIGlmIGFkYXB0aXZlIHBsYXliYWNrIGhhcyBiZWVuIHJlcXVlc3RlZCwgdHJ5IEpCIGZhbGxiYWNrCisgICAgICAgICAgICAgICAgLy8gTk9URTogVEhJUyBGQUxMQkFDSyBNRUNIQU5JU00gV0lMTCBCRSBSRU1PVkVEIERVRSBUTyBJVFMKKyAgICAgICAgICAgICAgICAvLyBMQVJHRSBNRU1PUlkgUkVRVUlSRU1FTlQKKworICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgbm90IGRvIGFkYXB0aXZlIHBsYXliYWNrIG9uIHNvZnR3YXJlIGFjY2Vzc2VkCisgICAgICAgICAgICAgICAgLy8gc3VyZmFjZXMgYXMgdGhleSBuZXZlciBoYWQgdG8gcmVzcG9uZCB0byBjaGFuZ2VzIGluIHRoZQorICAgICAgICAgICAgICAgIC8vIGNyb3Agd2luZG93LCBhbmQgd2UgZG9uJ3QgdHJ1c3QgdGhhdCB0aGV5IHdpbGwgYmUgYWJsZSB0by4KKyAgICAgICAgICAgICAgICBpbnQgdXNhZ2VCaXRzID0gMDsKKyAgICAgICAgICAgICAgICBib29sIGNhbkRvQWRhcHRpdmVQbGF5YmFjazsKKworICAgICAgICAgICAgICAgIGlmIChuYXRpdmVXaW5kb3ctPnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlV2luZG93LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19DT05TVU1FUl9VU0FHRV9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlQml0cykgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuRG9BZGFwdGl2ZVBsYXliYWNrID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuRG9BZGFwdGl2ZVBsYXliYWNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1c2FnZUJpdHMgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLKSkgPT0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IG1heFdpZHRoID0gMCwgbWF4SGVpZ2h0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoY2FuRG9BZGFwdGl2ZVBsYXliYWNrICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigibWF4LXdpZHRoIiwgJm1heFdpZHRoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoIm1heC1oZWlnaHQiLCAmbWF4SGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBwcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjayglZHglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1heFdpZHRoLCBtYXhIZWlnaHQpOworCisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwgbWF4V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYoZXJyICE9IE9LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbJXNdIHByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrIGZhaWxlZCB3LyBlcnIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJtYXgtd2lkdGgiLCBtYXhXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoIm1heC1oZWlnaHQiLCBtYXhIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGFsbG93IGZhaWx1cmUKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gc3RvcmVNZXRhRGF0YUluQnVmZmVycyBzdWNjZWVkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCBwdXNoOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iLCAmcHVzaCkKKyAgICAgICAgICAgICAgICAgICAgJiYgcHVzaCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnUHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93T25TaHV0ZG93bjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgcHVzaDsKLSAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iLCAmcHVzaCkKLSAgICAgICAgICAgICAgICAmJiBwdXNoICE9IDApIHsKLSAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1B1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvd09uU2h1dGRvd247CisgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICAgICAgbVJvdGF0aW9uRGVncmVlcyA9IHJvdGF0aW9uRGVncmVlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMgPSAwOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjA0LDEzICsxMzc3LDcgQEAKICAgICAgICAgaWYgKGVuY29kZXIpIHsKICAgICAgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1pbWUsIG1zZyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRGVjb2RlcihtaW1lLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IHNldHVwVmlkZW9EZWNvZGVyKG1pbWUsIG1zZyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7CkBAIC0xMjMyLDE2ICsxMzk5LDUyIEBACiAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGludDMyX3QgaXNBRFRTLCBhYWNQcm9maWxlOworICAgICAgICAgICAgaW50MzJfdCBzYnJNb2RlOworICAgICAgICAgICAgaW50MzJfdCBtYXhPdXRwdXRDaGFubmVsQ291bnQ7CisgICAgICAgICAgICBpbnQzMl90IHBjbUxpbWl0ZXJFbmFibGU7CisgICAgICAgICAgICBkcmNQYXJhbXNfdCBkcmM7CiAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJpcy1hZHRzIiwgJmlzQURUUykpIHsKICAgICAgICAgICAgICAgICBpc0FEVFMgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLXByb2ZpbGUiLCAmYWFjUHJvZmlsZSkpIHsKICAgICAgICAgICAgICAgICBhYWNQcm9maWxlID0gT01YX0FVRElPX0FBQ09iamVjdE51bGw7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtc2JyLW1vZGUiLCAmc2JyTW9kZSkpIHsKKyAgICAgICAgICAgICAgICBzYnJNb2RlID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy1tYXgtb3V0cHV0LWNoYW5uZWxfY291bnQiLCAmbWF4T3V0cHV0Q2hhbm5lbENvdW50KSkgeworICAgICAgICAgICAgICAgIG1heE91dHB1dENoYW5uZWxDb3VudCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLXBjbS1saW1pdGVyLWVuYWJsZSIsICZwY21MaW1pdGVyRW5hYmxlKSkgeworICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIHVua25vd24KKyAgICAgICAgICAgICAgICBwY21MaW1pdGVyRW5hYmxlID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtZW5jb2RlZC10YXJnZXQtbGV2ZWwiLCAmZHJjLmVuY29kZWRUYXJnZXRMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLmVuY29kZWRUYXJnZXRMZXZlbCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLWRyYy1jdXQtbGV2ZWwiLCAmZHJjLmRyY0N1dCkpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLmRyY0N1dCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLWRyYy1ib29zdC1sZXZlbCIsICZkcmMuZHJjQm9vc3QpKSB7CisgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgdW5rbm93bgorICAgICAgICAgICAgICAgIGRyYy5kcmNCb29zdCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLWRyYy1oZWF2eS1jb21wcmVzc2lvbiIsICZkcmMuaGVhdnlDb21wcmVzc2lvbikpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLmhlYXZ5Q29tcHJlc3Npb24gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy10YXJnZXQtcmVmLWxldmVsIiwgJmRyYy50YXJnZXRSZWZMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLnRhcmdldFJlZkxldmVsID0gLTE7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGVyciA9IHNldHVwQUFDQ29kZWMoCiAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlLCBiaXRSYXRlLCBhYWNQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICBpc0FEVFMgIT0gMCk7CisgICAgICAgICAgICAgICAgICAgIGlzQURUUyAhPSAwLCBzYnJNb2RlLCBtYXhPdXRwdXRDaGFubmVsQ291bnQsIGRyYywKKyAgICAgICAgICAgICAgICAgICAgcGNtTGltaXRlckVuYWJsZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikpIHsKICAgICAgICAgZXJyID0gc2V0dXBBTVJDb2RlYyhlbmNvZGVyLCBmYWxzZSAvKiBpc1dBTVIgKi8sIGJpdFJhdGUpOwpAQCAtMTI2OCw4ICsxNDcxLDEwIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoZW5jb2RlcikgewogICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXhpdHkiLCAmY29tcHJlc3Npb25MZXZlbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1zZy0+ZmluZEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbGFjLWNvbXByZXNzaW9uLWxldmVsIiwgJmNvbXByZXNzaW9uTGV2ZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uTGV2ZWwgPSA1Oy8vIGRlZmF1bHQgRkxBQyBjb21wcmVzc2lvbiBsZXZlbAorICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbkxldmVsID0gNTsgLy8gZGVmYXVsdCBGTEFDIGNvbXByZXNzaW9uIGxldmVsCiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wcmVzc2lvbkxldmVsIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29tcHJlc3Npb24gbGV2ZWwgJWQgb3V0c2lkZSBbMC4uOF0gcmFuZ2UsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIDAiLApAQCAtMTMzMCw2ICsxNTM1LDExIEBACiAgICAgICAgIGVyciA9IHNldE1pbkJ1ZmZlclNpemUoa1BvcnRJbmRleElucHV0LCA4MTkyKTsgIC8vIFhYWAogICAgIH0KIAorICAgIENIRUNLX0VRKGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleElucHV0LCBpbnB1dEZvcm1hdCksIChzdGF0dXNfdClPSyk7CisgICAgQ0hFQ0tfRVEoZ2V0UG9ydEZvcm1hdChrUG9ydEluZGV4T3V0cHV0LCBvdXRwdXRGb3JtYXQpLCAoc3RhdHVzX3QpT0spOworICAgIG1JbnB1dEZvcm1hdCA9IGlucHV0Rm9ybWF0OworICAgIG1PdXRwdXRGb3JtYXQgPSBvdXRwdXRGb3JtYXQ7CisKICAgICByZXR1cm4gZXJyOwogfQogCkBAIC0xMzk4LDcgKzE2MDgsOSBAQAogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwQUFDQ29kZWMoCiAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICBpbnQzMl90IGJpdFJhdGUsIGludDMyX3QgYWFjUHJvZmlsZSwgYm9vbCBpc0FEVFMpIHsKKyAgICAgICAgaW50MzJfdCBiaXRSYXRlLCBpbnQzMl90IGFhY1Byb2ZpbGUsIGJvb2wgaXNBRFRTLCBpbnQzMl90IHNick1vZGUsCisgICAgICAgIGludDMyX3QgbWF4T3V0cHV0Q2hhbm5lbENvdW50LCBjb25zdCBkcmNQYXJhbXNfdCYgZHJjLAorICAgICAgICBpbnQzMl90IHBjbUxpbWl0ZXJFbmFibGUpIHsKICAgICBpZiAoZW5jb2RlciAmJiBpc0FEVFMpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTQ2NSw2ICsxNjc3LDMyIEBACiAgICAgICAgIHByb2ZpbGUubkFBQ0VSdG9vbHMgPSBPTVhfQVVESU9fQUFDRVJOb25lOwogICAgICAgICBwcm9maWxlLmVBQUNQcm9maWxlID0gKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjUHJvZmlsZTsKICAgICAgICAgcHJvZmlsZS5lQUFDU3RyZWFtRm9ybWF0ID0gT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEZGOworICAgICAgICBzd2l0Y2ggKHNick1vZGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgLy8gZGlzYWJsZSBzYnIKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgLy8gZW5hYmxlIHNpbmdsZS1yYXRlIHNicgorICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIC8vIGVuYWJsZSBkdWFsLXJhdGUgc2JyCisgICAgICAgICAgICBwcm9maWxlLm5BQUN0b29scyAmPSB+T01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzIHw9IE9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIC8vIGVuYWJsZSBib3RoIG1vZGVzIC0+IHRoZSBjb2RlYyB3aWxsIGRlY2lkZSB3aGljaCBtb2RlIHNob3VsZCBiZSB1c2VkCisgICAgICAgICAgICBwcm9maWxlLm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgc2JyIG1vZGUKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKwogCiAgICAgICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FhYywgJnByb2ZpbGUsIHNpemVvZihwcm9maWxlKSk7CkBAIC0xNDk1LDggKzE3MzMsMjQgQEAKICAgICAgICAgICAgID8gT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEFEVFMKICAgICAgICAgICAgIDogT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEZGOwogCi0gICAgcmV0dXJuIG1PTVgtPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjLCAmcHJvZmlsZSwgc2l6ZW9mKHByb2ZpbGUpKTsKKyAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNQUkVTRU5UQVRJT05UWVBFIHByZXNlbnRhdGlvbjsKKyAgICBwcmVzZW50YXRpb24ubk1heE91dHB1dENoYW5uZWxzID0gbWF4T3V0cHV0Q2hhbm5lbENvdW50OworICAgIHByZXNlbnRhdGlvbi5uRHJjQ3V0ID0gZHJjLmRyY0N1dDsKKyAgICBwcmVzZW50YXRpb24ubkRyY0Jvb3N0ID0gZHJjLmRyY0Jvb3N0OworICAgIHByZXNlbnRhdGlvbi5uSGVhdnlDb21wcmVzc2lvbiA9IGRyYy5oZWF2eUNvbXByZXNzaW9uOworICAgIHByZXNlbnRhdGlvbi5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwgPSBkcmMudGFyZ2V0UmVmTGV2ZWw7CisgICAgcHJlc2VudGF0aW9uLm5FbmNvZGVkVGFyZ2V0TGV2ZWwgPSBkcmMuZW5jb2RlZFRhcmdldExldmVsOworICAgIHByZXNlbnRhdGlvbi5uUENNTGltaXRlckVuYWJsZSA9IHBjbUxpbWl0ZXJFbmFibGU7CisKKyAgICBzdGF0dXNfdCByZXMgPSBtT01YLT5zZXRQYXJhbWV0ZXIobU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsICZwcm9maWxlLCBzaXplb2YocHJvZmlsZSkpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgLy8gb3B0aW9uYWwgcGFyYW1ldGVycywgd2lsbCBub3QgY2F1c2UgY29uZmlndXJhdGlvbiBmYWlsdXJlCisgICAgICAgIG1PTVgtPnNldFBhcmFtZXRlcihtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYWNQcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgJnByZXNlbnRhdGlvbiwgc2l6ZW9mKHByZXNlbnRhdGlvbikpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJkaWQgbm90IHNldCBBdWRpb0FuZHJvaWRBYWNQcmVzZW50YXRpb24gZHVlIHRvIGVycm9yICVkIHdoZW4gc2V0dGluZyBBdWRpb0FhYyIsIHJlcyk7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBBQzNDb2RlYygKQEAgLTE2OTMsNiArMTk0NywyNyBAQAogICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9QY20sICZwY21QYXJhbXMsIHNpemVvZihwY21QYXJhbXMpKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2soCisgICAgICAgIGludDMyX3QgYXVkaW9Id1N5bmMsIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIHNpZGViYW5kSGFuZGxlOworCisgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgbU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLCBhdWRpb0h3U3luYywgJnNpZGViYW5kSGFuZGxlKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUgZmFpbGVkISAoZXJyICVkKS4iLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NpZGViYW5kX3N0cmVhbShuYXRpdmVXaW5kb3cuZ2V0KCksIHNpZGViYW5kSGFuZGxlKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0oJXApIGZhaWxlZCEgKGVyciAlZCkuIiwKKyAgICAgICAgICAgICAgICBzaWRlYmFuZEhhbmRsZSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IEFDb2RlYzo6c2V0VmlkZW9Qb3J0Rm9ybWF0VHlwZSgKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCiAgICAgICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGNvbXByZXNzaW9uRm9ybWF0LApAQCAtMTcxNCw2ICsxOTg5LDE3IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gc3Vic3RpdHV0ZSBiYWNrIGZsZXhpYmxlIGNvbG9yIGZvcm1hdCB0byBjb2RlYyBzdXBwb3J0ZWQgZm9ybWF0CisgICAgICAgIE9NWF9VMzIgZmxleGlibGVFcXVpdmFsZW50OworICAgICAgICBpZiAoY29tcHJlc3Npb25Gb3JtYXQgPT0gT01YX1ZJREVPX0NvZGluZ1VudXNlZCAmJgorICAgICAgICAgICAgICAgIGlzRmxleGlibGVDb2xvckZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PTVgsIG1Ob2RlLCBmb3JtYXQuZUNvbG9yRm9ybWF0LCAmZmxleGlibGVFcXVpdmFsZW50KSAmJgorICAgICAgICAgICAgICAgIGNvbG9yRm9ybWF0ID09IGZsZXhpYmxlRXF1aXZhbGVudCkgeworICAgICAgICAgICAgQUxPR0koIlslc10gdXNpbmcgY29sb3IgZm9ybWF0ICUjeCBpbiBwbGFjZSBvZiAlI3giLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBmb3JtYXQuZUNvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7CisgICAgICAgICAgICBjb2xvckZvcm1hdCA9IGZvcm1hdC5lQ29sb3JGb3JtYXQ7CisgICAgICAgIH0KKwogICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiBpcyB2aW9sYXRlZCBieSBUSSdzIHZpZGVvIGRlY29kZXIuCiAgICAgICAgIC8vIENIRUNLX0VRKGZvcm1hdC5uSW5kZXgsIGluZGV4KTsKIApAQCAtMTc3NCw2ICsyMDYwLDcgQEAKICAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBtVmlkZW9Db2RpbmdUeXBlOwogfSBrVmlkZW9Db2RpbmdNYXBFbnRyeVtdID0gewogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBPTVhfVklERU9fQ29kaW5nQVZDIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCBPTVhfVklERU9fQ29kaW5nSEVWQyB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIE9NWF9WSURFT19Db2RpbmdNUEVHNCB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgT01YX1ZJREVPX0NvZGluZ0gyNjMgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyLCBPTVhfVklERU9fQ29kaW5nTVBFRzIgfSwKQEAgLTE4MTQsNyArMjEwMSwxMyBAQAogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwVmlkZW9EZWNvZGVyKAotICAgICAgICBjb25zdCBjaGFyICptaW1lLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgICAgICBjb25zdCBjaGFyICptaW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGNvbXByZXNzaW9uRm9ybWF0OwogICAgIHN0YXR1c190IGVyciA9IEdldFZpZGVvQ29kaW5nVHlwZUZyb21NaW1lKG1pbWUsICZjb21wcmVzc2lvbkZvcm1hdCk7CiAKQEAgLTE4MjksNyArMjEyMiwyMCBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGVyciA9IHNldFN1cHBvcnRlZE91dHB1dEZvcm1hdCgpOworICAgIGludDMyX3QgdG1wOworICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnRtcCkpIHsKKyAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8T01YX0NPTE9SX0ZPUk1BVFRZUEU+KHRtcCk7CisgICAgICAgIGVyciA9IHNldFZpZGVvUG9ydEZvcm1hdFR5cGUoCisgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgT01YX1ZJREVPX0NvZGluZ1VudXNlZCwgY29sb3JGb3JtYXQpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiWyVzXSBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIGZvcm1hdCAlZCIsCisgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBjb2xvckZvcm1hdCk7CisgICAgICAgICAgICBlcnIgPSBzZXRTdXBwb3J0ZWRPdXRwdXRGb3JtYXQoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IHNldFN1cHBvcnRlZE91dHB1dEZvcm1hdCgpOworICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTE5MjAsNiArMjIyNiw3IEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICAgICAgZnJhbWVSYXRlID0gKGZsb2F0KXRtcDsKKyAgICAgICAgbVRpbWVQZXJGcmFtZVVzID0gKGludDY0X3QpICgxMDAwMDAwLjBmIC8gZnJhbWVSYXRlKTsKICAgICB9CiAKICAgICB2aWRlb19kZWYtPnhGcmFtZXJhdGUgPSAoT01YX1UzMikoZnJhbWVSYXRlICogNjU1MzYuMGYpOwpAQCAtMTk5NCw2ICsyMzAxLDEwIEBACiAgICAgICAgICAgICBlcnIgPSBzZXR1cEFWQ0VuY29kZXJQYXJhbWV0ZXJzKG1zZyk7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdIRVZDOgorICAgICAgICAgICAgZXJyID0gc2V0dXBIRVZDRW5jb2RlclBhcmFtZXRlcnMobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ1ZQODoKICAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nVlA5OgogICAgICAgICAgICAgZXJyID0gc2V0dXBWUFhFbmNvZGVyUGFyYW1ldGVycyhtc2cpOwpAQCAtMjA1Miw3ICsyMzYzLDYgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIE9NWF9VMzIgcmV0ID0gZnJhbWVSYXRlICogaUZyYW1lc0ludGVydmFsOwotICAgIENIRUNLKHJldCA+IDEpOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTIyMjIsNiArMjUzMiw1OCBAQAogICAgIHJldHVybiBzZXR1cEVycm9yQ29ycmVjdGlvblBhcmFtZXRlcnMoKTsKIH0KIAorLy8gc3RhdGljCitpbnQgLyogT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSAqLyBBQ29kZWM6OmdldEFWQ0xldmVsRm9yKAorICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCByYXRlLCBpbnQgYml0cmF0ZSwKKyAgICAgICAgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFIHByb2ZpbGUpIHsKKyAgICAvLyBjb252ZXJ0IGJpdHJhdGUgdG8gbWFpbi9iYXNlbGluZSBwcm9maWxlIGticHMgZXF1aXZhbGVudAorICAgIHN3aXRjaCAocHJvZmlsZSkgeworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwOgorICAgICAgICAgICAgYml0cmF0ZSA9IGRpdlVwKGJpdHJhdGUsIDMwMDApOyBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g6CisgICAgICAgICAgICBiaXRyYXRlID0gZGl2VXAoYml0cmF0ZSwgMTI1MCk7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYml0cmF0ZSA9IGRpdlVwKGJpdHJhdGUsIDEwMDApOyBicmVhazsKKyAgICB9CisKKyAgICAvLyBjb252ZXJ0IHNpemUgYW5kIHJhdGUgdG8gTUJzCisgICAgd2lkdGggPSBkaXZVcCh3aWR0aCwgMTYpOworICAgIGhlaWdodCA9IGRpdlVwKGhlaWdodCwgMTYpOworICAgIGludCBtYnMgPSB3aWR0aCAqIGhlaWdodDsKKyAgICByYXRlICo9IG1iczsKKyAgICBpbnQgbWF4RGltZW5zaW9uID0gbWF4KHdpZHRoLCBoZWlnaHQpOworCisgICAgc3RhdGljIGNvbnN0IGludCBsaW1pdHNbXVs1XSA9IHsKKyAgICAgICAgLyogICBNQnBzICAgICBNQiAgIGRpbSAgYml0cmF0ZSAgICAgICAgbGV2ZWwgKi8KKyAgICAgICAgeyAgICAxNDg1LCAgICA5OSwgIDI4LCAgICAgNjQsIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCisgICAgICAgIHsgICAgMTQ4NSwgICAgOTksICAyOCwgICAgMTI4LCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAorICAgICAgICB7ICAgIDMwMDAsICAgMzk2LCAgNTYsICAgIDE5MiwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKKyAgICAgICAgeyAgICA2MDAwLCAgIDM5NiwgIDU2LCAgICAzODQsIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCisgICAgICAgIHsgICAxMTg4MCwgICAzOTYsICA1NiwgICAgNzY4LCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAorICAgICAgICB7ICAgMTE4ODAsICAgMzk2LCAgNTYsICAgMjAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKKyAgICAgICAgeyAgIDE5ODAwLCAgIDc5MiwgIDc5LCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCisgICAgICAgIHsgICAyMDI1MCwgIDE2MjAsIDExMywgICA0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAorICAgICAgICB7ICAgNDA1MDAsICAxNjIwLCAxMTMsICAxMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKKyAgICAgICAgeyAgMTA4MDAwLCAgMzYwMCwgMTY5LCAgMTQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCisgICAgICAgIHsgIDIxNjAwMCwgIDUxMjAsIDIwMiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAorICAgICAgICB7ICAyNDU3NjAsICA4MTkyLCAyNTYsICAyMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKKyAgICAgICAgeyAgMjQ1NzYwLCAgODE5MiwgMjU2LCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCisgICAgICAgIHsgIDUyMjI0MCwgIDg3MDQsIDI2MywgIDUwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0MiB9LAorICAgICAgICB7ICA1ODk4MjQsIDIyMDgwLCA0MjAsIDEzNTAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKKyAgICAgICAgeyAgOTgzMDQwLCAzNjg2NCwgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCisgICAgICAgIHsgMjA3MzYwMCwgMzY4NjQsIDU0MywgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUobGltaXRzKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCAoJmxpbWl0KVs1XSA9IGxpbWl0c1tpXTsKKyAgICAgICAgaWYgKHJhdGUgPD0gbGltaXRbMF0gJiYgbWJzIDw9IGxpbWl0WzFdICYmIG1heERpbWVuc2lvbiA8PSBsaW1pdFsyXQorICAgICAgICAgICAgICAgICYmIGJpdHJhdGUgPD0gbGltaXRbM10pIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdFs0XTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEFWQ0VuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgaW50MzJfdCBiaXRyYXRlLCBpRnJhbWVJbnRlcnZhbDsKICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJiaXRyYXRlIiwgJmJpdHJhdGUpCkBAIC0yMzMwLDE0ICsyNjkyLDEzOSBAQAogICAgIHJldHVybiBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKIH0KIAotc3RhdHVzX3QgQUNvZGVjOjpzZXR1cFZQWEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCBiaXRyYXRlOwotICAgIGlmICghbXNnLT5maW5kSW50MzIoImJpdHJhdGUiLCAmYml0cmF0ZSkpIHsKK3N0YXR1c190IEFDb2RlYzo6c2V0dXBIRVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGJpdHJhdGUsIGlGcmFtZUludGVydmFsOworICAgIGlmICghbXNnLT5maW5kSW50MzIoImJpdHJhdGUiLCAmYml0cmF0ZSkKKyAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigiaS1mcmFtZS1pbnRlcnZhbCIsICZpRnJhbWVJbnRlcnZhbCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAogICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGUgPSBnZXRCaXRyYXRlTW9kZShtc2cpOwogCisgICAgZmxvYXQgZnJhbWVSYXRlOworICAgIGlmICghbXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnJhbWVSYXRlKSkgeworICAgICAgICBpbnQzMl90IHRtcDsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZnJhbWUtcmF0ZSIsICZ0bXApKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgZnJhbWVSYXRlID0gKGZsb2F0KXRtcDsKKyAgICB9CisKKyAgICBPTVhfVklERU9fUEFSQU1fSEVWQ1RZUEUgaGV2Y1R5cGU7CisgICAgSW5pdE9NWFBhcmFtcygmaGV2Y1R5cGUpOworICAgIGhldmNUeXBlLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9IZXZjLCAmaGV2Y1R5cGUsIHNpemVvZihoZXZjVHlwZSkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwcm9maWxlIiwgJnByb2ZpbGUpKSB7CisgICAgICAgIGludDMyX3QgbGV2ZWw7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImxldmVsIiwgJmxldmVsKSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gdmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChwcm9maWxlLCBsZXZlbCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBoZXZjVHlwZS5lUHJvZmlsZSA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19IRVZDUFJPRklMRVRZUEU+KHByb2ZpbGUpOworICAgICAgICBoZXZjVHlwZS5lTGV2ZWwgPSBzdGF0aWNfY2FzdDxPTVhfVklERU9fSEVWQ0xFVkVMVFlQRT4obGV2ZWwpOworICAgIH0KKworICAgIC8vIFRPRE86IE5lZWQgT01YIHN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciBzZXR0aW5nIGlGcmFtZUludGVydmFsCisKKyAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0hldmMsICZoZXZjVHlwZSwgc2l6ZW9mKGhldmNUeXBlKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKK30KKworc3RhdHVzX3QgQUNvZGVjOjpzZXR1cFZQWEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCBiaXRyYXRlOworICAgIGludDMyX3QgaUZyYW1lSW50ZXJ2YWwgPSAwOworICAgIHNpemVfdCB0c0xheWVycyA9IDA7CisgICAgT01YX1ZJREVPX0FORFJPSURfVlBYVEVNUE9SQUxMQVlFUlBBVFRFUk5UWVBFIHBhdHRlcm4gPQorICAgICAgICBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lOworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrVnA4TGF5ZXJSYXRlQWxsb2N0aW9uCisgICAgICAgIFtPTVhfVklERU9fQU5EUk9JRF9NQVhWUDhURU1QT1JBTExBWUVSU10KKyAgICAgICAgW09NWF9WSURFT19BTkRST0lEX01BWFZQOFRFTVBPUkFMTEFZRVJTXSA9IHsKKyAgICAgICAgezEwMCwgMTAwLCAxMDB9LCAgLy8gMSBsYXllcgorICAgICAgICB7IDYwLCAxMDAsIDEwMH0sICAvLyAyIGxheWVycyB7NjAlLCA0MCV9CisgICAgICAgIHsgNDAsICA2MCwgMTAwfSwgIC8vIDMgbGF5ZXJzIHs0MCUsIDIwJSwgNDAlfQorICAgIH07CisgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZiaXRyYXRlKSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1zZy0+ZmluZEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgJmlGcmFtZUludGVydmFsKTsKKworICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGUgPSBnZXRCaXRyYXRlTW9kZShtc2cpOworCisgICAgZmxvYXQgZnJhbWVSYXRlOworICAgIGlmICghbXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnJhbWVSYXRlKSkgeworICAgICAgICBpbnQzMl90IHRtcDsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZnJhbWUtcmF0ZSIsICZ0bXApKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgZnJhbWVSYXRlID0gKGZsb2F0KXRtcDsKKyAgICB9CisKKyAgICBBU3RyaW5nIHRzU2NoZW1hOworICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoInRzLXNjaGVtYSIsICZ0c1NjaGVtYSkpIHsKKyAgICAgICAgaWYgKHRzU2NoZW1hID09ICJ3ZWJydGMudnA4LjEtbGF5ZXIiKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOworICAgICAgICAgICAgdHNMYXllcnMgPSAxOworICAgICAgICB9IGVsc2UgaWYgKHRzU2NoZW1hID09ICJ3ZWJydGMudnA4LjItbGF5ZXIiKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOworICAgICAgICAgICAgdHNMYXllcnMgPSAyOworICAgICAgICB9IGVsc2UgaWYgKHRzU2NoZW1hID09ICJ3ZWJydGMudnA4LjMtbGF5ZXIiKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOworICAgICAgICAgICAgdHNMYXllcnMgPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIlVuc3VwcG9ydGVkIHRzLXNjaGVtYSBbJXNdIiwgdHNTY2hlbWEuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSB2cDh0eXBlOworICAgIEluaXRPTVhQYXJhbXMoJnZwOHR5cGUpOworICAgIHZwOHR5cGUublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlciwKKyAgICAgICAgICAgICZ2cDh0eXBlLCBzaXplb2YodnA4dHlwZSkpOworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBpZiAoaUZyYW1lSW50ZXJ2YWwgPiAwKSB7CisgICAgICAgICAgICB2cDh0eXBlLm5LZXlGcmFtZUludGVydmFsID0gc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lSW50ZXJ2YWwsIGZyYW1lUmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgdnA4dHlwZS5lVGVtcG9yYWxQYXR0ZXJuID0gcGF0dGVybjsKKyAgICAgICAgdnA4dHlwZS5uVGVtcG9yYWxMYXllckNvdW50ID0gdHNMYXllcnM7CisgICAgICAgIGlmICh0c0xheWVycyA+IDApIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlM7IGkrKykgeworICAgICAgICAgICAgICAgIHZwOHR5cGUublRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baV0gPQorICAgICAgICAgICAgICAgICAgICBrVnA4TGF5ZXJSYXRlQWxsb2N0aW9uW3RzTGF5ZXJzIC0gMV1baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpdHJhdGVNb2RlID09IE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50KSB7CisgICAgICAgICAgICB2cDh0eXBlLm5NaW5RdWFudGl6ZXIgPSAyOworICAgICAgICAgICAgdnA4dHlwZS5uTWF4UXVhbnRpemVyID0gNjM7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlciwKKyAgICAgICAgICAgICAgICAmdnA4dHlwZSwgc2l6ZW9mKHZwOHR5cGUpKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIkV4dGVuZGVkIFZQOCBwYXJhbWV0ZXJzIHNldCBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKIH0KIApAQCAtMjQ5MywxOSArMjk4MCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpbnQgbWluVW5kZXF1ZXVlZEJ1ZnMgPSAwOwotICAgIHN0YXR1c190IGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXJ5KAotICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLAotICAgICAgICAgICAgJm1pblVuZGVxdWV1ZWRCdWZzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIlslc10gTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTIHF1ZXJ5IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotCi0gICAgICAgIG1pblVuZGVxdWV1ZWRCdWZzID0gMDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoY291bnRCdWZmZXJzT3duZWRCeU5hdGl2ZVdpbmRvdygpID4gKHNpemVfdCltaW5VbmRlcXVldWVkQnVmcworICAgIHdoaWxlIChjb3VudEJ1ZmZlcnNPd25lZEJ5TmF0aXZlV2luZG93KCkgPiBtTnVtVW5kZXF1ZXVlZEJ1ZmZlcnMKICAgICAgICAgICAgICYmIGRlcXVldWVCdWZmZXJGcm9tTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgewogICAgICAgICAvLyB0aGVzZSBidWZmZXJzIHdpbGwgYmUgc3VibWl0dGVkIGFzIHJlZ3VsYXIgYnVmZmVyczsgYWNjb3VudCBmb3IgdGhpcwogICAgICAgICBpZiAobVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMgJiYgbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0ID4gMCkgewpAQCAtMjUyMSw3ICsyOTk2LDcgQEAKIAogICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyAhPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUwogICAgICAgICAgICAgICAgICYmIGluZm8tPm1TdGF0dXMgIT0gQnVmZmVySW5mbzo6T1dORURfQllfTkFUSVZFX1dJTkRPVykgewotICAgICAgICAgICAgQUxPR1YoIlslc10gQnVmZmVyICVwIG9uIHBvcnQgJWxkIHN0aWxsIGhhcyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgQUxPR1YoIlslc10gQnVmZmVyICV1IG9uIHBvcnQgJXUgc3RpbGwgaGFzIHN0YXR1cyAlZCIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1CdWZmZXJJRCwgcG9ydEluZGV4LCBpbmZvLT5tU3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTI1NTEsNzkgKzMwMjYsMjkxIEBACiAgICAgfQogfQogCi12b2lkIEFDb2RlYzo6c2VuZEZvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpOworLy8gc3RhdGljCitib29sIEFDb2RlYzo6ZGVzY3JpYmVEZWZhdWx0Q29sb3JGb3JtYXQoRGVzY3JpYmVDb2xvckZvcm1hdFBhcmFtcyAmcGFyYW1zKSB7CisgICAgTWVkaWFJbWFnZSAmaW1hZ2UgPSBwYXJhbXMuc01lZGlhSW1hZ2U7CisgICAgbWVtc2V0KCZpbWFnZSwgMCwgc2l6ZW9mKGltYWdlKSk7CiAKKyAgICBpbWFnZS5tVHlwZSA9IE1lZGlhSW1hZ2U6Ok1FRElBX0lNQUdFX1RZUEVfVU5LTk9XTjsKKyAgICBpbWFnZS5tTnVtUGxhbmVzID0gMDsKKworICAgIGNvbnN0IE9NWF9DT0xPUl9GT1JNQVRUWVBFIGZtdCA9IHBhcmFtcy5lQ29sb3JGb3JtYXQ7CisgICAgaW1hZ2UubVdpZHRoID0gcGFyYW1zLm5GcmFtZVdpZHRoOworICAgIGltYWdlLm1IZWlnaHQgPSBwYXJhbXMubkZyYW1lSGVpZ2h0OworCisgICAgLy8gb25seSBzdXBwb3J0aW5nIFlVVjQyMAorICAgIGlmIChmbXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciAmJgorICAgICAgICBmbXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hciAmJgorICAgICAgICBmbXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgJiYKKyAgICAgICAgZm10ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyKSB7CisgICAgICAgIEFMT0dXKCJkbyBub3Qga25vdyBjb2xvciBmb3JtYXQgMHgleCA9ICVkIiwgZm10LCBmbXQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVEVNUE9SQVJZIEZJWCBmb3Igc29tZSB2ZW5kb3JzIHRoYXQgYWR2ZXJ0aXNlIHNsaWNlSGVpZ2h0IGFzIDAKKyAgICBpZiAocGFyYW1zLm5TdHJpZGUgIT0gMCAmJiBwYXJhbXMublNsaWNlSGVpZ2h0ID09IDApIHsKKyAgICAgICAgQUxPR1coInVzaW5nIHNsaWNlSGVpZ2h0PSV1IGluc3RlYWQgb2Ygd2hhdCBjb2RlYyBhZHZlcnRpc2VkICg9MCkiLAorICAgICAgICAgICAgICAgIHBhcmFtcy5uRnJhbWVIZWlnaHQpOworICAgICAgICBwYXJhbXMublNsaWNlSGVpZ2h0ID0gcGFyYW1zLm5GcmFtZUhlaWdodDsKKyAgICB9CisKKyAgICAvLyB3ZSBuZWVkIHN0cmlkZSBhbmQgc2xpY2UtaGVpZ2h0IHRvIGJlIG5vbi16ZXJvCisgICAgaWYgKHBhcmFtcy5uU3RyaWRlID09IDAgfHwgcGFyYW1zLm5TbGljZUhlaWdodCA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJjYW5ub3QgZGVzY3JpYmUgY29sb3IgZm9ybWF0IDB4JXggPSAlZCB3aXRoIHN0cmlkZT0ldSBhbmQgc2xpY2VIZWlnaHQ9JXUiLAorICAgICAgICAgICAgICAgIGZtdCwgZm10LCBwYXJhbXMublN0cmlkZSwgcGFyYW1zLm5TbGljZUhlaWdodCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBzZXQtdXAgWVVWIGZvcm1hdAorICAgIGltYWdlLm1UeXBlID0gTWVkaWFJbWFnZTo6TUVESUFfSU1BR0VfVFlQRV9ZVVY7CisgICAgaW1hZ2UubU51bVBsYW5lcyA9IDM7CisgICAgaW1hZ2UubUJpdERlcHRoID0gODsKKyAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuWV0ubU9mZnNldCA9IDA7CisgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlldLm1Db2xJbmMgPSAxOworICAgIGltYWdlLm1QbGFuZVtpbWFnZS5ZXS5tUm93SW5jID0gcGFyYW1zLm5TdHJpZGU7CisgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlldLm1Ib3JpelN1YnNhbXBsaW5nID0gMTsKKyAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuWV0ubVZlcnRTdWJzYW1wbGluZyA9IDE7CisKKyAgICBzd2l0Y2ggKGZtdCkgeworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6IC8vIHVzZWQgZm9yIFlWMTIKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1PZmZzZXQgPSBwYXJhbXMublN0cmlkZSAqIHBhcmFtcy5uU2xpY2VIZWlnaHQ7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubVJvd0luYyA9IHBhcmFtcy5uU3RyaWRlIC8gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tT2Zmc2V0ID0gaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1PZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgKyAocGFyYW1zLm5TdHJpZGUgKiBwYXJhbXMublNsaWNlSGVpZ2h0IC8gNCk7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubVJvd0luYyA9IHBhcmFtcy5uU3RyaWRlIC8gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgLy8gRklYTUU6IE5WMjEgZm9yIHN3LWVuY29kZXIsIE5WMTIgZm9yIGRlY29kZXIgYW5kIGh3LWVuY29kZXIKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIC8vIE5WMTIKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tT2Zmc2V0ID0gcGFyYW1zLm5TdHJpZGUgKiBwYXJhbXMublNsaWNlSGVpZ2h0OworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1Db2xJbmMgPSAyOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1Sb3dJbmMgPSBwYXJhbXMublN0cmlkZTsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tT2Zmc2V0ID0gaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1PZmZzZXQgKyAxOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1Db2xJbmMgPSAyOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1Sb3dJbmMgPSBwYXJhbXMublN0cmlkZTsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworYm9vbCBBQ29kZWM6OmRlc2NyaWJlQ29sb3JGb3JtYXQoCisgICAgICAgIGNvbnN0IHNwPElPTVg+ICZvbXgsIElPTVg6Om5vZGVfaWQgbm9kZSwKKyAgICAgICAgRGVzY3JpYmVDb2xvckZvcm1hdFBhcmFtcyAmZGVzY3JpYmVQYXJhbXMpCit7CisgICAgT01YX0lOREVYVFlQRSBkZXNjcmliZUNvbG9yRm9ybWF0SW5kZXg7CisgICAgaWYgKG9teC0+Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBub2RlLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlQ29sb3JGb3JtYXQiLAorICAgICAgICAgICAgJmRlc2NyaWJlQ29sb3JGb3JtYXRJbmRleCkgIT0gT0sgfHwKKyAgICAgICAgb214LT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBub2RlLCBkZXNjcmliZUNvbG9yRm9ybWF0SW5kZXgsCisgICAgICAgICAgICAmZGVzY3JpYmVQYXJhbXMsIHNpemVvZihkZXNjcmliZVBhcmFtcykpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBkZXNjcmliZURlZmF1bHRDb2xvckZvcm1hdChkZXNjcmliZVBhcmFtcyk7CisgICAgfQorICAgIHJldHVybiBkZXNjcmliZVBhcmFtcy5zTWVkaWFJbWFnZS5tVHlwZSAhPQorICAgICAgICAgICAgTWVkaWFJbWFnZTo6TUVESUFfSU1BR0VfVFlQRV9VTktOT1dOOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQUNvZGVjOjppc0ZsZXhpYmxlQ29sb3JGb3JtYXQoCisgICAgICAgICBjb25zdCBzcDxJT01YPiAmb214LCBJT01YOjpub2RlX2lkIG5vZGUsCisgICAgICAgICB1aW50MzJfdCBjb2xvckZvcm1hdCwgT01YX1UzMiAqZmxleGlibGVFcXVpdmFsZW50KSB7CisgICAgRGVzY3JpYmVDb2xvckZvcm1hdFBhcmFtcyBkZXNjcmliZVBhcmFtczsKKyAgICBJbml0T01YUGFyYW1zKCZkZXNjcmliZVBhcmFtcyk7CisgICAgZGVzY3JpYmVQYXJhbXMuZUNvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWNvbG9yRm9ybWF0OworICAgIC8vIHJlYXNvbmFibGUgZHVtbXkgdmFsdWVzCisgICAgZGVzY3JpYmVQYXJhbXMubkZyYW1lV2lkdGggPSAxMjg7CisgICAgZGVzY3JpYmVQYXJhbXMubkZyYW1lSGVpZ2h0ID0gMTI4OworICAgIGRlc2NyaWJlUGFyYW1zLm5TdHJpZGUgPSAxMjg7CisgICAgZGVzY3JpYmVQYXJhbXMublNsaWNlSGVpZ2h0ID0gMTI4OworCisgICAgQ0hFQ0soZmxleGlibGVFcXVpdmFsZW50ICE9IE5VTEwpOworCisgICAgaWYgKCFkZXNjcmliZUNvbG9yRm9ybWF0KG9teCwgbm9kZSwgZGVzY3JpYmVQYXJhbXMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBNZWRpYUltYWdlICZpbWcgPSBkZXNjcmliZVBhcmFtcy5zTWVkaWFJbWFnZTsKKyAgICBpZiAoaW1nLm1UeXBlID09IE1lZGlhSW1hZ2U6Ok1FRElBX0lNQUdFX1RZUEVfWVVWKSB7CisgICAgICAgIGlmIChpbWcubU51bVBsYW5lcyAhPSAzIHx8CisgICAgICAgICAgICBpbWcubVBsYW5lW2ltZy5ZXS5tSG9yaXpTdWJzYW1wbGluZyAhPSAxIHx8CisgICAgICAgICAgICBpbWcubVBsYW5lW2ltZy5ZXS5tVmVydFN1YnNhbXBsaW5nICE9IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFlVViA0MjAKKyAgICAgICAgaWYgKGltZy5tUGxhbmVbaW1nLlVdLm1Ib3JpelN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICAgICAmJiBpbWcubVBsYW5lW2ltZy5VXS5tVmVydFN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICAgICAmJiBpbWcubVBsYW5lW2ltZy5WXS5tSG9yaXpTdWJzYW1wbGluZyA9PSAyCisgICAgICAgICAgICAgICAgJiYgaW1nLm1QbGFuZVtpbWcuVl0ubVZlcnRTdWJzYW1wbGluZyA9PSAyKSB7CisgICAgICAgICAgICAvLyBwb3NzaWJsZSBmbGV4aWJsZSBZVVY0MjAgZm9ybWF0CisgICAgICAgICAgICBpZiAoaW1nLm1CaXREZXB0aCA8PSA4KSB7CisgICAgICAgICAgICAgICAqZmxleGlibGVFcXVpdmFsZW50ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBBQ29kZWM6OmdldFBvcnRGb3JtYXQoT01YX1UzMiBwb3J0SW5kZXgsIHNwPEFNZXNzYWdlPiAmbm90aWZ5KSB7CisgICAgLy8gVE9ETzogY2F0Y2ggZXJyb3JzIGFuIHJldHVybiB0aGVtIGluc3RlYWQgb2YgdXNpbmcgQ0hFQ0sKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKICAgICBJbml0T01YUGFyYW1zKCZkZWYpOwotICAgIGRlZi5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICBkZWYublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAogICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpLAogICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CiAKLSAgICBDSEVDS19FUSgoaW50KWRlZi5lRGlyLCAoaW50KU9NWF9EaXJPdXRwdXQpOworICAgIENIRUNLX0VRKChpbnQpZGVmLmVEaXIsCisgICAgICAgICAgICAoaW50KShwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCA/IE9NWF9EaXJPdXRwdXQgOiBPTVhfRGlySW5wdXQpKTsKIAogICAgIHN3aXRjaCAoZGVmLmVEb21haW4pIHsKICAgICAgICAgY2FzZSBPTVhfUG9ydERvbWFpblZpZGVvOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFICp2aWRlb0RlZiA9ICZkZWYuZm9ybWF0LnZpZGVvOworICAgICAgICAgICAgc3dpdGNoICgoaW50KXZpZGVvRGVmLT5lQ29tcHJlc3Npb25Gb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdVbnVzZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtSXNFbmNvZGVyIF4gKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KSk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKTsKIAotICAgICAgICAgICAgQVN0cmluZyBtaW1lOwotICAgICAgICAgICAgaWYgKCFtSXNFbmNvZGVyKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChHZXRNaW1lVHlwZUZvclZpZGVvQ29kaW5nKAorICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzdHJpZGUiLCB2aWRlb0RlZi0+blN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNsaWNlLWhlaWdodCIsIHZpZGVvRGVmLT5uU2xpY2VIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCB2aWRlb0RlZi0+ZUNvbG9yRm9ybWF0KTsKKworICAgICAgICAgICAgICAgICAgICBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zIGRlc2NyaWJlUGFyYW1zOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZkZXNjcmliZVBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlUGFyYW1zLmVDb2xvckZvcm1hdCA9IHZpZGVvRGVmLT5lQ29sb3JGb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlUGFyYW1zLm5GcmFtZVdpZHRoID0gdmlkZW9EZWYtPm5GcmFtZVdpZHRoOworICAgICAgICAgICAgICAgICAgICBkZXNjcmliZVBhcmFtcy5uRnJhbWVIZWlnaHQgPSB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBkZXNjcmliZVBhcmFtcy5uU3RyaWRlID0gdmlkZW9EZWYtPm5TdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlUGFyYW1zLm5TbGljZUhlaWdodCA9IHZpZGVvRGVmLT5uU2xpY2VIZWlnaHQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaWJlQ29sb3JGb3JtYXQobU9NWCwgbU5vZGUsIGRlc2NyaWJlUGFyYW1zKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZS1kYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmliZVBhcmFtcy5zTWVkaWFJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGVzY3JpYmVQYXJhbXMuc01lZGlhSW1hZ2UpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocG9ydEluZGV4ICE9IGtQb3J0SW5kZXhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFsc28gZ2V0IGlucHV0IGNyb3AKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgT01YX0NPTkZJR19SRUNUVFlQRSByZWN0OworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZyZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVjdC5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgICAgICAgICAgICAgICAgIGlmIChtT01YLT5nZXRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbklucHV0Q3JvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN0LCBzaXplb2YocmVjdCkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5XaWR0aCA9IHZpZGVvRGVmLT5uRnJhbWVXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkhlaWdodCA9IHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5MZWZ0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uVG9wLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uV2lkdGgsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uSGVpZ2h0LCAwdSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0xFKHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCAtIDEsIHZpZGVvRGVmLT5uRnJhbWVXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0xFKHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEsIHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpOworCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0UmVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCArIHJlY3QubldpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AgKyByZWN0Lm5IZWlnaHQgLSAxKTsKKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdWUDg6CisgICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nVlA5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUgdnA4dHlwZTsKKyAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmdnA4dHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHZwOHR5cGUublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbVZpZGVvQW5kcm9pZFZwOEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZwOHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZwOHR5cGUpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHRzU2NoZW1hID0gIm5vbmUiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZwOHR5cGUuZVRlbXBvcmFsUGF0dGVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHZwOHR5cGUublRlbXBvcmFsTGF5ZXJDb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzU2NoZW1hID0gIndlYnJ0Yy52cDguMS1sYXllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzU2NoZW1hID0gIndlYnJ0Yy52cDguMi1sYXllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzU2NoZW1hID0gIndlYnJ0Yy52cDguMy1sYXllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJ0cy1zY2hlbWEiLCB0c1NjaGVtYSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHNldCB1cCBtaW1lLgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtSXNFbmNvZGVyIF4gKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICAgICAgICAgICAgICBpZiAoR2V0TWltZVR5cGVGb3JWaWRlb0NvZGluZygKICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRGVmLT5lQ29tcHJlc3Npb25Gb3JtYXQsICZtaW1lKSAhPSBPSykgewotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndpZHRoIiwgdmlkZW9EZWYtPm5GcmFtZVdpZHRoKTsKICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImhlaWdodCIsIHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpOwotCi0gICAgICAgICAgICBpZiAoIW1Jc0VuY29kZXIpIHsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzdHJpZGUiLCB2aWRlb0RlZi0+blN0cmlkZSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2xpY2UtaGVpZ2h0IiwgdmlkZW9EZWYtPm5TbGljZUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgdmlkZW9EZWYtPmVDb2xvckZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICBPTVhfQ09ORklHX1JFQ1RUWVBFIHJlY3Q7Ci0gICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcmVjdCk7Ci0gICAgICAgICAgICAgICAgcmVjdC5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKLQotICAgICAgICAgICAgICAgIGlmIChtT01YLT5nZXRDb25maWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QsIHNpemVvZihyZWN0KSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3QubldpZHRoID0gdmlkZW9EZWYtPm5GcmFtZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICByZWN0Lm5IZWlnaHQgPSB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QubkxlZnQsIDApOwotICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QublRvcCwgMCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uV2lkdGgsIDB1KTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5IZWlnaHQsIDB1KTsKLSAgICAgICAgICAgICAgICBDSEVDS19MRShyZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGggLSAxLCB2aWRlb0RlZi0+bkZyYW1lV2lkdGgpOwotICAgICAgICAgICAgICAgIENIRUNLX0xFKHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEsIHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRSZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgImNyb3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AgKyByZWN0Lm5IZWlnaHQgLSAxKTsKLQotICAgICAgICAgICAgICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPnNldFJlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AgKyByZWN0Lm5IZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI2MzYsNyArMzMyMyw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgcGFyYW1zOwogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9QY20sCkBAIC0yNjU2LDIwICszMzQzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGluZ1JhdGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUVuY29kZXJEZWxheSArIG1FbmNvZGVyUGFkZGluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IHBhcmFtcy5uQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwcmV2YnVmc2l6ZSA9IG1Ta2lwQ3V0QnVmZmVyLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZidWZzaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlcGxhY2luZyBTa2lwQ3V0QnVmZmVyIGhvbGRpbmcgJWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2YnVmc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVNraXBDdXRCdWZmZXIgPSBuZXcgU2tpcEN1dEJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuY29kZXJEZWxheSAqIGZyYW1lU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuY29kZXJQYWRkaW5nICogZnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbm5lbE1hc2tQcmVzZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLW1hc2siLCBtQ2hhbm5lbE1hc2spOwpAQCAtMjY4MSw3ICszMzU0LDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FhYywKQEAgLTI2OTgsNyArMzM3MSw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FtciwKQEAgLTI3MjQsNyArMzM5Nyw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fRkxBQ1RZUEUgcGFyYW1zOwogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9GbGFjLApAQCAtMjczNywxMSArMzQxMCw0NSBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdNUDM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSBwYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9NcDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nVk9SQklTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgcGFyYW1zOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nQW5kcm9pZEFDMzoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FDM1RZUEUgcGFyYW1zOwogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLApAQCAtMjc1NSw3ICszNDYyLDUyIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0FuZHJvaWRPUFVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgcGFyYW1zOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFyYW1zKSkpOworCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdHNzExOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFIHBhcmFtczsKKyAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb1BjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYXJhbXMpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuZVBDTU1vZGUgPT0gT01YX0FVRElPX1BDTU1vZGVNVUxhdykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMuZVBDTU1vZGUgPT0gT01YX0FVRElPX1BDTU1vZGVBTGF3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBwYXJhbXMuZVBDTU1vZGUgPT0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVOS05PV04gQVVESU8gQ09ESU5HOiAlZFxuIiwgYXVkaW9EZWYtPmVFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTI3NjUsNiArMzUxNyw0MyBAQAogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQUNvZGVjOjpzZW5kRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCk7CisKKyAgICBDSEVDS19FUShnZXRQb3J0Rm9ybWF0KGtQb3J0SW5kZXhPdXRwdXQsIG5vdGlmeSksIChzdGF0dXNfdClPSyk7CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQ0hFQ0sobm90aWZ5LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKworICAgIGludDMyX3QgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOworICAgIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyAmJgorICAgICAgICBtTmF0aXZlV2luZG93ICE9IE5VTEwgJiYKKyAgICAgICAgbm90aWZ5LT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CisgICAgICAgIC8vIG5vdGlmeSByZW5kZXJlciBvZiB0aGUgY3JvcCBjaGFuZ2UKKyAgICAgICAgLy8gTk9URTogbmF0aXZlIHdpbmRvdyB1c2VzIGV4dGVuZGVkIHJpZ2h0LWJvdHRvbSBjb29yZGluYXRlCisgICAgICAgIHJlcGx5LT5zZXRSZWN0KCJjcm9wIiwgbGVmdCwgdG9wLCByaWdodCArIDEsIGJvdHRvbSArIDEpOworICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcgJiYKKyAgICAgICAgICAgICAgIChtRW5jb2RlckRlbGF5IHx8IG1FbmNvZGVyUGFkZGluZykpIHsKKyAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CisgICAgICAgIENIRUNLKG5vdGlmeS0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJmNoYW5uZWxDb3VudCkpOworICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgc2l6ZV90IHByZXZidWZzaXplID0gbVNraXBDdXRCdWZmZXItPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChwcmV2YnVmc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlJlcGxhY2luZyBTa2lwQ3V0QnVmZmVyIGhvbGRpbmcgJWQgIgorICAgICAgICAgICAgICAgICAgICAgICJieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJldmJ1ZnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Ta2lwQ3V0QnVmZmVyID0gbmV3IFNraXBDdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgbUVuY29kZXJEZWxheSAqIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICBtRW5jb2RlclBhZGRpbmcgKiBmcmFtZVNpemUpOworICAgIH0KKwogICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgbVNlbnRGb3JtYXQgPSB0cnVlOwpAQCAtMjc3MiwxMiArMzU2MSwyMiBAQAogCiB2b2lkIEFDb2RlYzo6c2lnbmFsRXJyb3IoT01YX0VSUk9SVFlQRSBlcnJvciwgc3RhdHVzX3QgaW50ZXJuYWxFcnJvcikgewogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEVycm9yKTsKLSAgICBub3RpZnktPnNldEludDMyKCJvbXgtZXJyb3IiLCBlcnJvcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRFcnJvcik7CisgICAgQUxPR0UoInNpZ25hbEVycm9yKG9teEVycm9yICUjeCwgaW50ZXJuYWxFcnJvciAlZCkiLCBlcnJvciwgaW50ZXJuYWxFcnJvcik7CisKKyAgICBpZiAoaW50ZXJuYWxFcnJvciA9PSBVTktOT1dOX0VSUk9SKSB7IC8vIGZpbmQgYmV0dGVyIGVycm9yIGNvZGUKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgb214U3RhdHVzID0gc3RhdHVzRnJvbU9NWEVycm9yKGVycm9yKTsKKyAgICAgICAgaWYgKG9teFN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBpbnRlcm5hbEVycm9yID0gb214U3RhdHVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIkludmFsaWQgT01YIGVycm9yICUjeCIsIGVycm9yKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG1GYXRhbEVycm9yID0gdHJ1ZTsKIAogICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGludGVybmFsRXJyb3IpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImFjdGlvbkNvZGUiLCBBQ1RJT05fQ09ERV9GQVRBTCk7IC8vIGNvdWxkIHRyYW5zbGF0ZSBmcm9tIE9NWCBlcnJvci4KICAgICBub3RpZnktPnBvc3QoKTsKIH0KIApAQCAtMjk3NCw3ICszNzczLDggQEAKICAgICAgIG1Db2RlYyhjb2RlYykgewogfQogCi1BQ29kZWM6OkJhc2VTdGF0ZTo6UG9ydE1vZGUgQUNvZGVjOjpCYXNlU3RhdGU6OmdldFBvcnRNb2RlKE9NWF9VMzIgcG9ydEluZGV4KSB7CitBQ29kZWM6OkJhc2VTdGF0ZTo6UG9ydE1vZGUgQUNvZGVjOjpCYXNlU3RhdGU6OmdldFBvcnRNb2RlKAorICAgICAgICBPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIHJldHVybiBLRUVQX0JVRkZFUlM7CiB9CiAKQEAgLTMwMDAsNiArMzgwMCw3IEBACiAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdENyZWF0ZUlucHV0U3VyZmFjZToKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0U2lnbmFsRW5kT2ZJbnB1dFN0cmVhbToKICAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBtYXkgcmVzdWx0IGluIGFuIGFwcCBpbGxlZ2FsIHN0YXRlIGV4Y2VwdGlvbi4KICAgICAgICAgICAgIEFMT0dFKCJNZXNzYWdlIDB4JXggd2FzIG5vdCBoYW5kbGVkIiwgbXNnLT53aGF0KCkpOwogICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzAwNywxMSArMzgwOCwyNSBAQAogCiAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdE9NWERpZWQ6CiAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCByZXN1bHQgaW4ga0ZsYWdTYXdNZWRpYVNlcnZlckRpZSBoYW5kbGluZyBpbiBNZWRpYUNvZGVjLgogICAgICAgICAgICAgQUxPR0UoIk9NWC9tZWRpYXNlcnZlciBkaWVkLCBzaWduYWxsaW5nIGVycm9yISIpOwogICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JSZXNvdXJjZXNMb3N0LCBERUFEX09CSkVDVCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdFJlbGVhc2VDb2RlY0luc3RhbmNlOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBmb3JjaW5nIHRoZSByZWxlYXNlIG9mIGNvZGVjIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+bU9NWC0+ZnJlZU5vZGUobUNvZGVjLT5tTm9kZSk7CisgICAgICAgICAgICBBTE9HRV9JRigiWyVzXSBmYWlsZWQgdG8gcmVsZWFzZSBjb2RlYyBpbnN0YW5jZTogZXJyPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdFNodXRkb3duQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTMwMjMsOCArMzgzOCwxNiBAQAogICAgIGludDMyX3QgdHlwZTsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsICZ0eXBlKSk7CiAKKyAgICAvLyB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhpcyBpcyBhbiBvdXRzdGFuZGluZyBtZXNzYWdlIGZvciBhCisgICAgLy8gY29kZWMgdGhhdCB3ZSBoYXZlIGFscmVhZHkgZGVzdHJveWVkCisgICAgaWYgKG1Db2RlYy0+bU5vZGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HSSgiaWdub3JpbmcgbWVzc2FnZSBhcyBhbHJlYWR5IGZyZWVkIGNvbXBvbmVudDogJXMiLAorICAgICAgICAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgSU9NWDo6bm9kZV9pZCBub2RlSUQ7Ci0gICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigibm9kZSIsICZub2RlSUQpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibm9kZSIsIChpbnQzMl90Kikmbm9kZUlEKSk7CiAgICAgQ0hFQ0tfRVEobm9kZUlELCBtQ29kZWMtPm1Ob2RlKTsKIAogICAgIHN3aXRjaCAodHlwZSkgewpAQCAtMzA1NSw3ICszODc4LDcgQEAKICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RU1QVFlfQlVGRkVSX0RPTkU6CiAgICAgICAgIHsKICAgICAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImJ1ZmZlciIsICZidWZmZXJJRCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImJ1ZmZlciIsIChpbnQzMl90KikmYnVmZmVySUQpKTsKIAogICAgICAgICAgICAgcmV0dXJuIG9uT01YRW1wdHlCdWZmZXJEb25lKGJ1ZmZlcklEKTsKICAgICAgICAgfQpAQCAtMzA2MywyNyArMzg4NiwyMSBAQAogICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpGSUxMX0JVRkZFUl9ET05FOgogICAgICAgICB7CiAgICAgICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJidWZmZXIiLCAmYnVmZmVySUQpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXIiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CiAKICAgICAgICAgICAgIGludDMyX3QgcmFuZ2VPZmZzZXQsIHJhbmdlTGVuZ3RoLCBmbGFnczsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgdm9pZCAqcGxhdGZvcm1Qcml2YXRlOwotICAgICAgICAgICAgdm9pZCAqZGF0YVB0cjsKIAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJhbmdlX29mZnNldCIsICZyYW5nZU9mZnNldCkpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJhbmdlX2xlbmd0aCIsICZyYW5nZUxlbmd0aCkpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wIiwgJnRpbWVVcykpOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicGxhdGZvcm1fcHJpdmF0ZSIsICZwbGF0Zm9ybVByaXZhdGUpKTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImRhdGFfcHRyIiwgJmRhdGFQdHIpKTsKIAogICAgICAgICAgICAgcmV0dXJuIG9uT01YRmlsbEJ1ZmZlckRvbmUoCiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklELAogICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KXJhbmdlT2Zmc2V0LCAoc2l6ZV90KXJhbmdlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAoT01YX1UzMilmbGFncywKLSAgICAgICAgICAgICAgICAgICAgdGltZVVzLAotICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybVByaXZhdGUsCi0gICAgICAgICAgICAgICAgICAgIGRhdGFQdHIpOworICAgICAgICAgICAgICAgICAgICB0aW1lVXMpOwogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTMxMDMsNyArMzkyMCwxMyBAQAogCiAgICAgQUxPR0UoIlslc10gRVJST1IoMHglMDhseCkiLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGRhdGExKTsKIAotICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoKE9NWF9FUlJPUlRZUEUpZGF0YTEpOworICAgIC8vIHZlcmlmeSBPTVggY29tcG9uZW50IHNlbmRzIGJhY2sgYW4gZXJyb3Igd2UgZXhwZWN0LgorICAgIE9NWF9FUlJPUlRZUEUgb214RXJyb3IgPSAoT01YX0VSUk9SVFlQRSlkYXRhMTsKKyAgICBpZiAoIWlzT01YRXJyb3Iob214RXJyb3IpKSB7CisgICAgICAgIEFMT0dXKCJJbnZhbGlkIE9NWCBlcnJvciAlI3giLCBvbXhFcnJvcik7CisgICAgICAgIG9teEVycm9yID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKyAgICBtQ29kZWMtPnNpZ25hbEVycm9yKG9teEVycm9yKTsKIAogICAgIHJldHVybiB0cnVlOwogfQpAQCAtMzExOCwyMyArMzk0MSwxMiBAQAogICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQpOwogICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKIAotICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmYnVmZmVyTWV0YSA9IGluZm8tPm1EYXRhLT5tZXRhKCk7Ci0gICAgdm9pZCAqbWVkaWFCdWZmZXI7Ci0gICAgaWYgKGJ1ZmZlck1ldGEtPmZpbmRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsICZtZWRpYUJ1ZmZlcikKLSAgICAgICAgICAgICYmIG1lZGlhQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgLy8gV2UncmUgaW4gInN0b3JlLW1ldGFkYXRhLWluLWJ1ZmZlcnMiIG1vZGUsIHRoZSB1bmRlcmx5aW5nCi0gICAgICAgIC8vIE9NWCBjb21wb25lbnQgaGFkIGFjY2VzcyB0byBkYXRhIHRoYXQncyBpbXBsaWNpdGx5IHJlZmNvdW50ZWQKLSAgICAgICAgLy8gYnkgdGhpcyAibWVkaWFCdWZmZXIiIG9iamVjdC4gTm93IHRoYXQgdGhlIE9NWCBjb21wb25lbnQgaGFzCi0gICAgICAgIC8vIHRvbGQgdXMgdGhhdCBpdCdzIGRvbmUgd2l0aCB0aGUgaW5wdXQgYnVmZmVyLCB3ZSBjYW4gZGVjcmVtZW50Ci0gICAgICAgIC8vIHRoZSBtZWRpYUJ1ZmZlcidzIHJlZmVyZW5jZSBjb3VudC4KLQotICAgICAgICBBTE9HVigicmVsZWFzaW5nIG1idWYgJXAiLCBtZWRpYUJ1ZmZlcik7Ci0KLSAgICAgICAgKChNZWRpYUJ1ZmZlciAqKW1lZGlhQnVmZmVyKS0+cmVsZWFzZSgpOwotICAgICAgICBtZWRpYUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgYnVmZmVyTWV0YS0+c2V0UG9pbnRlcigibWVkaWFCdWZmZXIiLCBOVUxMKTsKLSAgICB9CisgICAgLy8gV2UncmUgaW4gInN0b3JlLW1ldGFkYXRhLWluLWJ1ZmZlcnMiIG1vZGUsIHRoZSB1bmRlcmx5aW5nCisgICAgLy8gT01YIGNvbXBvbmVudCBoYWQgYWNjZXNzIHRvIGRhdGEgdGhhdCdzIGltcGxpY2l0bHkgcmVmY291bnRlZAorICAgIC8vIGJ5IHRoaXMgIk1lZGlhQnVmZmVyIiBvYmplY3QuIE5vdyB0aGF0IHRoZSBPTVggY29tcG9uZW50IGhhcworICAgIC8vIHRvbGQgdXMgdGhhdCBpdCdzIGRvbmUgd2l0aCB0aGUgaW5wdXQgYnVmZmVyLCB3ZSBjYW4gZGVjcmVtZW50CisgICAgLy8gdGhlIG1lZGlhQnVmZmVyJ3MgcmVmZXJlbmNlIGNvdW50LgorICAgIGluZm8tPm1EYXRhLT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7CiAKICAgICBQb3J0TW9kZSBtb2RlID0gZ2V0UG9ydE1vZGUoa1BvcnRJbmRleElucHV0KTsKIApAQCAtMzE2NSwxNCArMzk3NywxNCBAQAogICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClCdWZmZXJJbmZvOjpPV05FRF9CWV9VUyk7CiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZpbGxUaGlzQnVmZmVyKTsKLSAgICBub3RpZnktPnNldFBvaW50ZXIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRGaWxsVGhpc0J1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKIAogICAgIGluZm8tPm1EYXRhLT5tZXRhKCktPmNsZWFyKCk7CiAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGluZm8tPm1EYXRhKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdElucHV0QnVmZmVyRmlsbGVkLCBtQ29kZWMtPmlkKCkpOwotICAgIHJlcGx5LT5zZXRQb2ludGVyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOworICAgIHJlcGx5LT5zZXRJbnQzMigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKIAogICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CiAKQEAgLTMxODMsOCArMzk5NSw3IEBACiAKIHZvaWQgQUNvZGVjOjpCYXNlU3RhdGU6Om9uSW5wdXRCdWZmZXJGaWxsZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQ7Ci0gICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiYnVmZmVyLWlkIiwgJmJ1ZmZlcklEKSk7Ci0KKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYnVmZmVyLWlkIiwgKGludDMyX3QqKSZidWZmZXJJRCkpOwogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKICAgICBpbnQzMl90IGVyciA9IE9LOwogICAgIGJvb2wgZW9zID0gZmFsc2U7CkBAIC0zMjg4LDggKzQwOTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRwdXRNb2RlID09IEZSRUVfQlVGRkVSUyA/ICJGUkVFIiA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dE1vZGUgPT0gS0VFUF9CVUZGRVJTID8gIktFRVAiIDogIlJFU1VCTUlUIikpOwogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0TW9kZSA9PSBSRVNVQk1JVF9CVUZGRVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTMzODIsMTAgKzQxOTIsOCBAQAogICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQsCiAgICAgICAgIHNpemVfdCByYW5nZU9mZnNldCwgc2l6ZV90IHJhbmdlTGVuZ3RoLAogICAgICAgICBPTVhfVTMyIGZsYWdzLAotICAgICAgICBpbnQ2NF90IHRpbWVVcywKLSAgICAgICAgdm9pZCAqcGxhdGZvcm1Qcml2YXRlLAotICAgICAgICB2b2lkICpkYXRhUHRyKSB7Ci0gICAgQUxPR1YoIlslc10gb25PTVhGaWxsQnVmZmVyRG9uZSAlcCB0aW1lICVsbGQgdXMsIGZsYWdzID0gMHglMDhseCIsCisgICAgICAgIGludDY0X3QgdGltZVVzKSB7CisgICAgQUxPR1YoIlslc10gb25PTVhGaWxsQnVmZmVyRG9uZSAldSB0aW1lICUiIFBSSWQ2NCAiIHVzLCBmbGFncyA9IDB4JTA4eCIsCiAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGJ1ZmZlcklELCB0aW1lVXMsIGZsYWdzKTsKIAogICAgIHNzaXplX3QgaW5kZXg7CkBAIC0zNDIyLDcgKzQyMzAsNyBAQAogICAgICAgICBjYXNlIFJFU1VCTUlUX0JVRkZFUlM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChyYW5nZUxlbmd0aCA9PSAwICYmICEoZmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBmaWxsQnVmZmVyICVwIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGZpbGxCdWZmZXIgJXUiLAogICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbmZvLT5tQnVmZmVySUQpOwogCiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5maWxsQnVmZmVyKApAQCAtMzQzNiw3ICs0MjQ0LDcgQEAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9CiAgICAgICAgICAgICAgICAgbmV3IEFNZXNzYWdlKGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZCwgbUNvZGVjLT5pZCgpKTsKIAotICAgICAgICAgICAgaWYgKCFtQ29kZWMtPm1TZW50Rm9ybWF0KSB7CisgICAgICAgICAgICBpZiAoIW1Db2RlYy0+bVNlbnRGb3JtYXQgJiYgcmFuZ2VMZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgbUNvZGVjLT5zZW5kRm9ybWF0Q2hhbmdlKHJlcGx5KTsKICAgICAgICAgICAgIH0KIApAQCAtMzQ2MywxMiArNDI3MSwxMiBAQAogICAgICAgICAgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXREcmFpblRoaXNCdWZmZXIpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRQb2ludGVyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXREcmFpblRoaXNCdWZmZXIpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKICAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBpbmZvLT5tRGF0YSk7CiAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJmbGFncyIsIGZsYWdzKTsKIAotICAgICAgICAgICAgcmVwbHktPnNldFBvaW50ZXIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CiAKICAgICAgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CiAKQEAgLTM0ODAsNyArNDI4OCw3IEBACiAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gc2F3IG91dHB1dCBFT1MiLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogCiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRFT1MpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0RU9TKTsKICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBtQ29kZWMtPm1JbnB1dEVPU1Jlc3VsdCk7CiAgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKQEAgLTM1MDQsOCArNDMxMiw3IEBACiAKIHZvaWQgQUNvZGVjOjpCYXNlU3RhdGU6Om9uT3V0cHV0QnVmZmVyRHJhaW5lZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRDsKLSAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJidWZmZXItaWQiLCAmYnVmZmVySUQpKTsKLQorICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXItaWQiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CiAgICAgc3NpemVfdCBpbmRleDsKICAgICBCdWZmZXJJbmZvICppbmZvID0KICAgICAgICAgbUNvZGVjLT5maW5kQnVmZmVyQnlJRChrUG9ydEluZGV4T3V0cHV0LCBidWZmZXJJRCwgJmluZGV4KTsKQEAgLTM1MjEsMTkgKzQzMjgsNDMgQEAKICAgICBpbnQzMl90IHJlbmRlcjsKICAgICBpZiAobUNvZGVjLT5tTmF0aXZlV2luZG93ICE9IE5VTEwKICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJyZW5kZXIiLCAmcmVuZGVyKSAmJiByZW5kZXIgIT0gMAotICAgICAgICAgICAgJiYgKGluZm8tPm1EYXRhID09IE5VTEwgfHwgaW5mby0+bURhdGEtPnNpemUoKSAhPSAwKSkgeworICAgICAgICAgICAgJiYgaW5mby0+bURhdGEgIT0gTlVMTCAmJiBpbmZvLT5tRGF0YS0+c2l6ZSgpICE9IDApIHsKKyAgICAgICAgQVRSQUNFX05BTUUoInJlbmRlciIpOwogICAgICAgICAvLyBUaGUgY2xpZW50IHdhbnRzIHRoaXMgYnVmZmVyIHRvIGJlIHJlbmRlcmVkLgogCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMgPSAwOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJ0aW1lc3RhbXBOcyIsICZ0aW1lc3RhbXBOcykpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGl0IHNlZW1zIGxpa2Ugd2Ugc2hvdWxkIHVzZSB0aGUgdGltZXN0YW1wCisgICAgICAgICAgICAvLyBpbiB0aGUgKG1lZGlhKWJ1ZmZlciBhcyBpdCBwb3RlbnRpYWxseSBjYW1lIGZyb20KKyAgICAgICAgICAgIC8vIGFuIGlucHV0IHN1cmZhY2UsIGJ1dCB3ZSBkaWQgbm90IHByb3BhZ2F0ZSBpdCBwcmlvciB0bworICAgICAgICAgICAgLy8gQVBJIDIwLiAgUGVyaGFwcyBjaGVjayBmb3IgdGFyZ2V0IFNESyB2ZXJzaW9uLgorI2lmIDAKKyAgICAgICAgICAgIGlmIChpbmZvLT5tRGF0YS0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lc3RhbXBOcykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigidXNpbmcgYnVmZmVyIFBUUyBvZiAlIiBQUklkNjQsIHRpbWVzdGFtcE5zKTsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBOcyAqPSAxMDAwOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKwogICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5nZXQoKSwgdGltZXN0YW1wTnMpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHNldCBidWZmZXIgdGltZXN0YW1wOiAlZCIsIGVycik7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoKGVyciA9IG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy0+cXVldWVCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgaW5mby0+bUdyYXBoaWNCdWZmZXIuZ2V0KCksIC0xKSkgPT0gT0spIHsKICAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIGVycik7CisgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKICAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtQ29kZWMtPm1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJgorICAgICAgICAgICAgKGluZm8tPm1EYXRhID09IE5VTEwgfHwgaW5mby0+bURhdGEtPnNpemUoKSAhPSAwKSkgeworICAgICAgICAgICAgQVRSQUNFX05BTUUoImZyYW1lLWRyb3AiKTsKKyAgICAgICAgfQogICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CiAgICAgfQogCkBAIC0zNTY0LDcgKzQzOTUsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBmaWxsQnVmZmVyICVwIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBmaWxsQnVmZmVyICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCk7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5maWxsQnVmZmVyKG1Db2RlYy0+bU5vZGUsIGluZm8tPm1CdWZmZXJJRCksCkBAIC0zNjM0LDEwICs0NDY1LDExIEBACiAgICAgICAgICAgICBpbnQzMl90IGtlZXBDb21wb25lbnRBbGxvY2F0ZWQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigKICAgICAgICAgICAgICAgICAgICAgICAgICJrZWVwQ29tcG9uZW50QWxsb2NhdGVkIiwgJmtlZXBDb21wb25lbnRBbGxvY2F0ZWQpKTsKLSAgICAgICAgICAgIENIRUNLKCFrZWVwQ29tcG9uZW50QWxsb2NhdGVkKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKGtlZXBDb21wb25lbnRBbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGtlZXAgY29tcG9uZW50IGFsbG9jYXRlZCBvbiBzaHV0ZG93biBpbiBVbmluaXRpYWxpemVkIHN0YXRlIik7CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdFNodXRkb3duQ29tcGxldGVkKTsKICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKQEAgLTM2NDcsMTMgKzQ0NzksMjAgQEAKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Rmx1c2g6CiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8sIGFzIHdlIGhhdmUgYWxyZWFkeSBzaWduYWxlZCBzaHV0ZG93bgorICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQmFzZVN0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChtc2cpOwogICAgIH0KQEAgLTM2OTQsNiArNDUzMyw3IEBACiAKICAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWU7CiAgICAgdWludDMyX3QgcXVpcmtzID0gMDsKKyAgICBpbnQzMl90IGVuY29kZXIgPSBmYWxzZTsKICAgICBpZiAobXNnLT5maW5kU3RyaW5nKCJjb21wb25lbnROYW1lIiwgJmNvbXBvbmVudE5hbWUpKSB7CiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtYXRjaGluZ0NvZGVjcy5hZGQoKTsKICAgICAgICAgT01YQ29kZWM6OkNvZGVjTmFtZUFuZFF1aXJrcyAqZW50cnkgPSAmbWF0Y2hpbmdDb2RlY3MuZWRpdEl0ZW1BdChpbmRleCk7CkBAIC0zNzA2LDcgKzQ1NDYsNiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAKLSAgICAgICAgaW50MzJfdCBlbmNvZGVyOwogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlbmNvZGVyIiwgJmVuY29kZXIpKSB7CiAgICAgICAgICAgICBlbmNvZGVyID0gZmFsc2U7CiAgICAgICAgIH0KQEAgLTM3MzUsNiArNDU3NCw4IEBACiAKICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiQWxsb2NhdGluZyBjb21wb25lbnQgJyVzJyBmYWlsZWQsIHRyeSBuZXh0IG9uZS4iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICB9CiAKICAgICAgICAgbm9kZSA9IE5VTEw7CkBAIC0zNzQyLDEwICs0NTgzLDEwIEBACiAKICAgICBpZiAobm9kZSA9PSBOVUxMKSB7CiAgICAgICAgIGlmICghbWltZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGEgZGVjb2RlciBmb3IgdHlwZSAnJXMnLiIsCi0gICAgICAgICAgICAgICAgIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGEgJXNjb2RlciBmb3IgdHlwZSAnJXMnLiIsCisgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgPyAiZW4iIDogImRlIiwgbWltZS5jX3N0cigpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgZGVjb2RlciAnJXMnLiIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGNvZGVjICclcycuIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgfQogCiAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yQ29tcG9uZW50Tm90Rm91bmQpOwpAQCAtMzc2OSw3ICs0NjEwLDcgQEAKIAogICAgIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0Q29tcG9uZW50QWxsb2NhdGVkKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRDb21wb25lbnRBbGxvY2F0ZWQpOwogICAgICAgICBub3RpZnktPnNldFN0cmluZygiY29tcG9uZW50TmFtZSIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogICAgIH0KQEAgLTM3OTYsNyArNDYzNyw4IEBACiAgICAgbUNvZGVjLT5tRGVxdWV1ZUNvdW50ZXIgPSAwOwogICAgIG1Db2RlYy0+bU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0ID0gMDsKICAgICBtQ29kZWMtPm1SZXBlYXRGcmFtZURlbGF5VXMgPSAtMWxsOwotICAgIG1Db2RlYy0+bUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2sgPSBmYWxzZTsKKyAgICBtQ29kZWMtPm1JbnB1dEZvcm1hdC5jbGVhcigpOworICAgIG1Db2RlYy0+bU91dHB1dEZvcm1hdC5jbGVhcigpOwogCiAgICAgaWYgKG1Db2RlYy0+bVNodXRkb3duSW5Qcm9ncmVzcykgewogICAgICAgICBib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBtQ29kZWMtPm1LZWVwQ29tcG9uZW50QWxsb2NhdGVkOwpAQCAtMzgwNiw2ICs0NjQ4LDkgQEAKIAogICAgICAgICBvblNodXRkb3duKGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpOwogICAgIH0KKyAgICBtQ29kZWMtPm1FeHBsaWNpdFNodXRkb3duID0gZmFsc2U7CisKKyAgICBtQ29kZWMtPnByb2Nlc3NEZWZlcnJlZE1lc3NhZ2VzKCk7CiB9CiAKIHZvaWQgQUNvZGVjOjpMb2FkZWRTdGF0ZTo6b25TaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKQEAgLTM4MTUsOSArNDY2MCwxMiBAQAogICAgICAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bVVuaW5pdGlhbGl6ZWRTdGF0ZSk7CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7CisgICAgaWYgKG1Db2RlYy0+bUV4cGxpY2l0U2h1dGRvd24pIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgbUNvZGVjLT5tRXhwbGljaXRTaHV0ZG93biA9IGZhbHNlOworICAgIH0KIH0KIAogYm9vbCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtMzg1MSw2ICs0Njk5LDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAgImtlZXBDb21wb25lbnRBbGxvY2F0ZWQiLCAma2VlcENvbXBvbmVudEFsbG9jYXRlZCkpOwogCisgICAgICAgICAgICBtQ29kZWMtPm1FeHBsaWNpdFNodXRkb3duID0gdHJ1ZTsKICAgICAgICAgICAgIG9uU2h1dGRvd24oa2VlcENvbXBvbmVudEFsbG9jYXRlZCk7CiAKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwpAQCAtMzg2MCw3ICs0NzA5LDcgQEAKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Rmx1c2g6CiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKQEAgLTM4ODksNyArNDczOCw3IEBACiAgICAgICAgIEFMT0dFKCJbJXNdIGNvbmZpZ3VyZUNvZGVjIHJldHVybmluZyBlcnJvciAlZCIsCiAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKIAotICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyKTsKKyAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTM5MDksNyArNDc1OCw5IEBACiAKICAgICB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdENvbXBvbmVudENvbmZpZ3VyZWQpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdENvbXBvbmVudENvbmZpZ3VyZWQpOworICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoImlucHV0LWZvcm1hdCIsIG1Db2RlYy0+bUlucHV0Rm9ybWF0KTsKKyAgICAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJvdXRwdXQtZm9ybWF0IiwgbUNvZGVjLT5tT3V0cHV0Rm9ybWF0KTsKICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAgICAgfQogCkBAIC0zOTE3LDExICs0NzY4LDExIEBACiB9CiAKIHZvaWQgQUNvZGVjOjpMb2FkZWRTdGF0ZTo6b25DcmVhdGVJbnB1dFN1cmZhY2UoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmIC8qIG1zZyAqLykgewogICAgIEFMT0dWKCJvbkNyZWF0ZUlucHV0U3VyZmFjZSIpOwogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRJbnB1dFN1cmZhY2VDcmVhdGVkKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQpOwogCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXI7CiAgICAgc3RhdHVzX3QgZXJyOwpAQCAtMzk0NSw3ICs0Nzk2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tTWF4UHRzR2FwVXMgPiAwbCkgeworICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tTWF4UHRzR2FwVXMgPiAwbGwpIHsKICAgICAgICAgZXJyID0gbUNvZGVjLT5tT01YLT5zZXRJbnRlcm5hbE9wdGlvbigKICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLAogICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhJbnB1dCwKQEAgLTM5NTUsNiArNDgwNiw0MSBAQAogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJbJXNdIFVuYWJsZSB0byBjb25maWd1cmUgbWF4IHRpbWVzdGFtcCBnYXAgKGVyciAlZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyID09IE9LICYmIG1Db2RlYy0+bVRpbWVQZXJDYXB0dXJlVXMgPiAwbGwKKyAgICAgICAgICAgICYmIG1Db2RlYy0+bVRpbWVQZXJGcmFtZVVzID4gMGxsKSB7CisgICAgICAgIGludDY0X3QgdGltZUxhcHNlWzJdOworICAgICAgICB0aW1lTGFwc2VbMF0gPSBtQ29kZWMtPm1UaW1lUGVyRnJhbWVVczsKKyAgICAgICAgdGltZUxhcHNlWzFdID0gbUNvZGVjLT5tVGltZVBlckNhcHR1cmVVczsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5tT01YLT5zZXRJbnRlcm5hbE9wdGlvbigKKyAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLAorICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhJbnB1dCwKKyAgICAgICAgICAgICAgICBJT01YOjpJTlRFUk5BTF9PUFRJT05fVElNRV9MQVBTRSwKKyAgICAgICAgICAgICAgICAmdGltZUxhcHNlWzBdLAorICAgICAgICAgICAgICAgIHNpemVvZih0aW1lTGFwc2UpKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiWyVzXSBVbmFibGUgdG8gY29uZmlndXJlIHRpbWUgbGFwc2UgKGVyciAlZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyID09IE9LICYmIG1Db2RlYy0+bUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCkgeworICAgICAgICBib29sIHN1c3BlbmQgPSB0cnVlOworICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAorICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCisgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LAorICAgICAgICAgICAgICAgIElPTVg6OklOVEVSTkFMX09QVElPTl9TVVNQRU5ELAorICAgICAgICAgICAgICAgICZzdXNwZW5kLAorICAgICAgICAgICAgICAgIHNpemVvZihzdXNwZW5kKSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIlslc10gVW5hYmxlIHRvIGNvbmZpZ3VyZSBvcHRpb24gdG8gc3VzcGVuZCAoZXJyICVkKSIsCiAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICBlcnIpOwogICAgICAgICB9CkBAIC0zOTk5LDcgKzQ4ODUsNyBAQAogICAgICAgICAgICAgICIoZXJyb3IgMHglMDh4KSIsCiAgICAgICAgICAgICAgZXJyKTsKIAotICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyKTsKKyAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyKSk7CiAKICAgICAgICAgbUNvZGVjLT5jaGFuZ2VTdGF0ZShtQ29kZWMtPm1Mb2FkZWRTdGF0ZSk7CiAgICAgfQpAQCAtNDAxNyw2ICs0OTAzLDcgQEAKIAogYm9vbCBBQ29kZWM6OkxvYWRlZFRvSWRsZVN0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFNldFBhcmFtZXRlcnM6CiAgICAgICAgIGNhc2Uga1doYXRTaHV0ZG93bjoKICAgICAgICAgewogICAgICAgICAgICAgbUNvZGVjLT5kZWZlck1lc3NhZ2UobXNnKTsKQEAgLTQwMzksNyArNDkyNiw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIFdlIGhhdmVuJ3QgZXZlbiBzdGFydGVkIHlldCwgc28gd2UncmUgZmx1c2hlZCBhbHJpZ2h0Li4uCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRGbHVzaENvbXBsZXRlZCk7CiAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC00MDgzLDYgKzQ5NzAsNyBAQAogCiBib29sIEFDb2RlYzo6SWRsZVRvRXhlY3V0aW5nU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKICAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgogICAgICAgICB7CiAgICAgICAgICAgICBtQ29kZWMtPmRlZmVyTWVzc2FnZShtc2cpOwpAQCAtNDA5OSw3ICs0OTg3LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBldmVuIHN0YXJ0ZWQgeWV0LCBzbyB3ZSdyZSBmbHVzaGVkIGFscmlnaHQuLi4KICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTQxNDMsNyArNTAzMSw3IEBACiB9CiAKIEFDb2RlYzo6QmFzZVN0YXRlOjpQb3J0TW9kZSBBQ29kZWM6OkV4ZWN1dGluZ1N0YXRlOjpnZXRQb3J0TW9kZSgKLSAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICAgICAgT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICByZXR1cm4gUkVTVUJNSVRfQlVGRkVSUzsKIH0KIApAQCAtNDIwNSwxMSArNTA5MywxNCBAQAogCiAgICAgc3VibWl0T3V0cHV0QnVmZmVycygpOwogCi0gICAgLy8gUG9zdCB0aGUgZmlyc3QgaW5wdXQgYnVmZmVyLgorICAgIC8vIFBvc3QgYWxsIGF2YWlsYWJsZSBpbnB1dCBidWZmZXJzCiAgICAgQ0hFQ0tfR1QobUNvZGVjLT5tQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLnNpemUoKSwgMHUpOwotICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUNvZGVjLT5tQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLmVkaXRJdGVtQXQoMCk7Ci0KLSAgICBwb3N0RmlsbFRoaXNCdWZmZXIoaW5mbyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgaWYgKGluZm8tPm1TdGF0dXMgPT0gQnVmZmVySW5mbzo6T1dORURfQllfVVMpIHsKKyAgICAgICAgICAgIHBvc3RGaWxsVGhpc0J1ZmZlcihpbmZvKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG1BY3RpdmUgPSB0cnVlOwogfQpAQCAtNDIzMSw2ICs1MTIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJrZWVwQ29tcG9uZW50QWxsb2NhdGVkIiwgJmtlZXBDb21wb25lbnRBbGxvY2F0ZWQpKTsKIAogICAgICAgICAgICAgbUNvZGVjLT5tU2h1dGRvd25JblByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db2RlYy0+bUV4cGxpY2l0U2h1dGRvd24gPSB0cnVlOwogICAgICAgICAgICAgbUNvZGVjLT5tS2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IGtlZXBDb21wb25lbnRBbGxvY2F0ZWQ7CiAKICAgICAgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKQEAgLTQzNTIsNiArNTI0NCwyMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaW50NjRfdCBza2lwRnJhbWVzQmVmb3JlVXM7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDY0KCJza2lwLWZyYW1lcy1iZWZvcmUiLCAmc2tpcEZyYW1lc0JlZm9yZVVzKSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgbU9NWC0+c2V0SW50ZXJuYWxPcHRpb24oCisgICAgICAgICAgICAgICAgICAgICBtTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgIElPTVg6OklOVEVSTkFMX09QVElPTl9TVEFSVF9USU1FLAorICAgICAgICAgICAgICAgICAgICAgJnNraXBGcmFtZXNCZWZvcmVVcywKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihza2lwRnJhbWVzQmVmb3JlVXMpKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwYXJhbWV0ZXIgJ3NraXAtZnJhbWVzLWJlZm9yZScgKGVyciAlZCkiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGludDMyX3QgZHJvcElucHV0RnJhbWVzOwogICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCAmZHJvcElucHV0RnJhbWVzKSkgewogICAgICAgICBib29sIHN1c3BlbmQgPSBkcm9wSW5wdXRGcmFtZXMgIT0gMDsKQEAgLTQzODUsNyArNTI5Myw3IEBACiAKIHZvaWQgQUNvZGVjOjpvblNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0U2lnbmFsZWRJbnB1dEVPUyk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRTaWduYWxlZElucHV0RU9TKTsKIAogICAgIHN0YXR1c190IGVyciA9IG1PTVgtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0obU5vZGUpOwogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTQ1MDUsNyArNTQxMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQgcmVjb25maWd1cmF0aW9uIChlcnJvciAweCUwOHgpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwogCi0gICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBlcnIpOworICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IG5vdCBjb3JyZWN0LCBidXQgYXBwZWFycyB0byBiZQogICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb25seSB3YXkgdG8gZnJlZSB0aGUgY29tcG9uZW50IGluc3RhbmNlLgpAQCAtNDc3NCw3ICs1NjgyLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWE1lc3NhZ2UsIG1Db2RlYy0+aWQoKSk7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgb214X21lc3NhZ2U6OkVWRU5UKTsKLSAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcigibm9kZSIsIG1Db2RlYy0+bU5vZGUpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigibm9kZSIsIG1Db2RlYy0+bU5vZGUpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZXZlbnQiLCBldmVudCk7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJkYXRhMSIsIGRhdGExKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImRhdGEyIiwgZGF0YTIpOwpAQCAtNDgxNSw3ICs1NzIzLDcgQEAKICAgICAgICAgbUNvZGVjLT53YWl0VW50aWxBbGxQb3NzaWJsZU5hdGl2ZVdpbmRvd0J1ZmZlcnNBcmVSZXR1cm5lZFRvVXMoKTsKIAogICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOwogICAgICAgICBub3RpZnktPnBvc3QoKTsKIAogICAgICAgICBtQ29kZWMtPm1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0gPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUkV4dHJhY3Rvci5jcHAKaW5kZXggMDNkY2JmOS4uYTZmYjNkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJFeHRyYWN0b3IuY3BwCkBAIC0xODksNyArMTg5LDcgQEAKICAgICAgICAgICAgIG1PZmZzZXRUYWJsZSwgbU9mZnNldFRhYmxlTGVuZ3RoKTsKIH0KIAotc3A8TWV0YURhdGE+IEFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CitzcDxNZXRhRGF0YT4gQU1SRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTIyMSw3ICsyMjEsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBBTVJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIG1PZmZzZXQgPSBtSXNXaWRlID8gOSA6IDY7CkBAIC0yNTgsMTQgKzI1OCwxNCBAQAogICAgICAgICBpbnQ2NF90IHNlZWtGcmFtZSA9IHNlZWtUaW1lVXMgLyAyMDAwMGxsOyAgLy8gMjBtcyBwZXIgZnJhbWUuCiAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla0ZyYW1lICogMjAwMDBsbDsKIAotICAgICAgICBpbnQgaW5kZXggPSBzZWVrRnJhbWUgLyA1MDsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gc2Vla0ZyYW1lIDwgMCA/IDAgOiBzZWVrRnJhbWUgLyA1MDsKICAgICAgICAgaWYgKGluZGV4ID49IG1PZmZzZXRUYWJsZUxlbmd0aCkgewogICAgICAgICAgICAgaW5kZXggPSBtT2Zmc2V0VGFibGVMZW5ndGggLSAxOwogICAgICAgICB9CiAKICAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRUYWJsZVtpbmRleF0gKyAobUlzV2lkZSA/IDkgOiA2KTsKIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaTwgc2Vla0ZyYW1lIC0gaW5kZXggKiA1MDsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpPCBzZWVrRnJhbWUgLSBpbmRleCAqIDUwOyBpKyspIHsKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgICAgIGlmICgoZXJyID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQobURhdGFTb3VyY2UsIG1PZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzV2lkZSwgJnNpemUpKSAhPSBPSykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKaW5kZXggOGQ1ZWVjOC4uOWFhN2Q5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCkBAIC0xNCw2ICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgpAQCAtMjIsMTAgKzI4LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xMDUsNyArMTA3LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEFNUldyaXRlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworc3RhdHVzX3QgQU1SV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOwogICAgIH0KQEAgLTE2Miw3ICsxNjQsNyBAQAogICAgIHZvaWQgKmR1bW15OwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwogCi0gICAgc3RhdHVzX3QgZXJyID0gKHN0YXR1c190KSBkdW1teTsKKyAgICBzdGF0dXNfdCBlcnIgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGR1bW15KSk7CiAgICAgewogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYKQEAgLTE5MSw3ICsxOTMsNyBAQAogCiAvLyBzdGF0aWMKIHZvaWQgKkFNUldyaXRlcjo6VGhyZWFkV3JhcHBlcih2b2lkICptZSkgewotICAgIHJldHVybiAodm9pZCAqKSBzdGF0aWNfY2FzdDxBTVJXcml0ZXIgKj4obWUpLT50aHJlYWRGdW5jKCk7CisgICAgcmV0dXJuICh2b2lkICopKHVpbnRwdHJfdCkgc3RhdGljX2Nhc3Q8QU1SV3JpdGVyICo+KG1lKS0+dGhyZWFkRnVuYygpOwogfQogCiBzdGF0dXNfdCBBTVJXcml0ZXI6OnRocmVhZEZ1bmMoKSB7CkBAIC0yMzUsNyArMjM3LDcgQEAKICAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwotICAgICAgICBBTE9HVigidGltZSBzdGFtcDogJWxsZCwgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uOiAlbGxkIiwKKyAgICAgICAgQUxPR1YoInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKICAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbWF4VGltZXN0YW1wVXMpIHsKICAgICAgICAgICAgIG1heFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCA2YTJhNjk2Li4xOTNmOGE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTE0LDcgKzE0LDEwIEBACiAgICAgICAgIEF3ZXNvbWVQbGF5ZXIuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgICAgIENhbWVyYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgICAgICAgICBcCisgICAgICAgIENsb2NrRXN0aW1hdG9yLmNwcCAgICAgICAgICAgICAgICBcCisgICAgICAgIENvZGVjQmFzZS5jcHAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIERhdGFVUklTb3VyY2UuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgICAgIERSTUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEVTRFMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEZpbGVTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCkBAIC0zMCw4ICszMywxMCBAQAogICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYUNvZGVjLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYUNvZGVjTGlzdC5jcHAgICAgICAgICAgICAgICAgXAorICAgICAgICBNZWRpYUNvZGVjU291cmNlLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYURlZnMuY3BwICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgXAorICAgICAgICBodHRwL01lZGlhSFRUUC5jcHAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYU11eGVyLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZXRhRGF0YS5jcHAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNTUsMjIgKzYwLDIzIEBACiAgICAgICAgIFdWTUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFhJTkdTZWVrZXIuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGF2Y191dGlscy5jcHAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG1wNC9GcmFnbWVudGVkTVA0UGFyc2VyLmNwcCAgICAgICBcCi0gICAgICAgIG1wNC9UcmFja0ZyYWdtZW50LmNwcCAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEvIFwKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQgXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvc2VydmljZXMvY29ubmVjdGl2aXR5bWFuYWdlciBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9mbGFjL2luY2x1ZGUgXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sbyBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUgXAorICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L2xpYndlYm0gXAorICAgICAgICAkKFRPUCkvc3lzdGVtL25ldGQvaW5jbHVkZSBcCisgICAgICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2NvbW1vbiBcCisgICAgICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2kxOG4gXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGliYmluZGVyIFwKICAgICAgICAgbGliY2FtZXJhX2NsaWVudCBcCi0gICAgICAgIGxpYmNvbm5lY3Rpdml0eW1hbmFnZXIgXAogICAgICAgICBsaWJjdXRpbHMgXAogICAgICAgICBsaWJkbCBcCiAgICAgICAgIGxpYmRybWZyYW1ld29yayBcCkBAIC04MCw2ICs4Niw4IEBACiAgICAgICAgIGxpYmljdXVjIFwKICAgICAgICAgbGlibG9nIFwKICAgICAgICAgbGlibWVkaWEgXAorICAgICAgICBsaWJuZXRkX2NsaWVudCBcCisgICAgICAgIGxpYm9wdXMgXAogICAgICAgICBsaWJzb25pdm94IFwKICAgICAgICAgbGlic3NsIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfb214IFwKQEAgLTk1LDYgKzEwMyw3IEBACiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hYWNlbmMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9tYXRyb3NrYSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3dlYm0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF90aW1lZHRleHQgXAogICAgICAgICBsaWJ2cHggXAogICAgICAgICBsaWJ3ZWJtIFwKQEAgLTEwMywxMyArMTEyLDYgQEAKICAgICAgICAgbGliRkxBQyBcCiAgICAgICAgIGxpYm1lZGlhX2hlbHBlcgogCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgICAgICBjaHJvbWl1bV9odHRwX3N0dWIuY3BwCi1MT0NBTF9DUFBGTEFHUyArPSAtRENIUk9NSVVNX0FWQUlMQUJMRT0xCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlic3RscG9ydAotaW5jbHVkZSBleHRlcm5hbC9zdGxwb3J0L2xpYnN0bHBvcnQubWsKLQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNfY29tbW9uIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAppbmRleCAwNWVlMzRlLi5lMjQ4MjRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1BsYXllciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTIxLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9BdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KQEAgLTEzOSw2ICsxNDIsMTIgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJNaW1lIHR5cGUgXCIlc1wiIG1hcHBlZCB0byBhdWRpb19mb3JtYXQgMHgleCIsIG1pbWUsIGF1ZGlvRm9ybWF0KTsKICAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgYWFjYW90ID0gLTE7CisgICAgICAgIGlmICgoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQykgJiYgZm9ybWF0LT5maW5kSW50MzIoa0tleUFBQ0FPVCwgJmFhY2FvdCkpIHsKKyAgICAgICAgICAgIC8vIFJlZGVmaW5lIEFBQyBmb3JtYXQgY29ycm9zcG9uZGluZyB0byBhYWMgcHJvZmlsZQorICAgICAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoYXVkaW9Gb3JtYXQsKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjYW90KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGludCBhdmdCaXRSYXRlID0gLTE7CkBAIC0yMjEsNyArMjMwLDggQEAKIAogICAgICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKAogICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgbVNhbXBsZVJhdGUsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBhdWRpb01hc2ssCi0gICAgICAgICAgICAgICAgMCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJkF1ZGlvQ2FsbGJhY2ssIHRoaXMsIDApOworICAgICAgICAgICAgICAgIDAgLypmcmFtZUNvdW50Ki8sIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZBdWRpb0NhbGxiYWNrLCB0aGlzLAorICAgICAgICAgICAgICAgIDAgLypub3RpZmljYXRpb25GcmFtZXMqLyk7CiAKICAgICAgICAgaWYgKChlcnIgPSBtQXVkaW9UcmFjay0+aW5pdENoZWNrKCkpICE9IE9LKSB7CiAgICAgICAgICAgICBtQXVkaW9UcmFjay5jbGVhcigpOwpAQCAtNDEwLDcgKzQyMCw3IEBACiAKIC8vIHN0YXRpYwogc2l6ZV90IEF1ZGlvUGxheWVyOjpBdWRpb1NpbmtDYWxsYmFjaygKLSAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKKyAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKiAvKiBhdWRpb1NpbmsgKi8sCiAgICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIHZvaWQgKmNvb2tpZSwKICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OmNiX2V2ZW50X3QgZXZlbnQpIHsKICAgICBBdWRpb1BsYXllciAqbWUgPSAoQXVkaW9QbGF5ZXIgKiljb29raWU7CkBAIC01NjUsMTIgKzU3NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVRvQ29tcGxldGlvblVzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMDAwMDBsbCAqIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0KSAvIG1TYW1wbGVSYXRlOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInRvdGFsIG51bWJlciBvZiBmcmFtZXMgcGxheWVkOiAlbGxkICglbGxkIHVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInRvdGFsIG51bWJlciBvZiBmcmFtZXMgcGxheWVkOiAlIiBQUklkNjQgIiAoJWxsZCB1cykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1OdW1GcmFtZXNQbGF5ZWQgKyBudW1BZGRpdGlvbmFsRnJhbWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAqIChtTnVtRnJhbWVzUGxheWVkICsgbnVtQWRkaXRpb25hbEZyYW1lcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIG1TYW1wbGVSYXRlKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlZCBmcmFtZXMgbGVmdCB0byBwbGF5LCAlbGxkIHVzICglLjJmIHNlY3MpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJWQgZnJhbWVzIGxlZnQgdG8gcGxheSwgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVG9Db21wbGV0aW9uVXMsIHRpbWVUb0NvbXBsZXRpb25VcyAvIDFFNik7CiAKQEAgLTYyNyw3ICs2MzcsNyBAQAogICAgICAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMgPQogICAgICAgICAgICAgICAgICAgICAoKG1OdW1GcmFtZXNQbGF5ZWQgKyBzaXplX2RvbmUgLyBtRnJhbWVTaXplKSAqIDEwMDAwMDApCiAgICAgICAgICAgICAgICAgICAgICAgICAvIG1TYW1wbGVSYXRlOwotICAgICAgICAgICAgICAgIEFMT0dWKCJidWZmZXItPnNpemUoKSA9ICVkLCAiCisgICAgICAgICAgICAgICAgQUxPR1YoImJ1ZmZlci0+c2l6ZSgpID0gJXp1LCAiCiAgICAgICAgICAgICAgICAgICAgICAibVBvc2l0aW9uVGltZU1lZGlhVXM9JS4yZiBtUG9zaXRpb25UaW1lUmVhbFVzPSUuMmYiLAogICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwKICAgICAgICAgICAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzIC8gMUU2LCBtUG9zaXRpb25UaW1lUmVhbFVzIC8gMUU2KTsKQEAgLTc0NSw3ICs3NTUsNyBAQAogCiAgICAgLy8gSEFMIHBvc2l0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBidWZmZXIgd2Ugc2VudCBhdCBtU3RhcnRQb3NVcwogICAgIGNvbnN0IGludDY0X3QgcmVuZGVyZWREdXJhdGlvbiA9IG1TdGFydFBvc1VzICsgcGxheWVkVXM7Ci0gICAgQUxPR1YoImdldE91dHB1dFBsYXlQb3NpdGlvblVzX2wgJWxsZCIsIHJlbmRlcmVkRHVyYXRpb24pOworICAgIEFMT0dWKCJnZXRPdXRwdXRQbGF5UG9zaXRpb25Vc19sICUiIFBSSWQ2NCwgcmVuZGVyZWREdXJhdGlvbik7CiAgICAgcmV0dXJuIHJlbmRlcmVkRHVyYXRpb247CiB9CiAKQEAgLTc1Niw4ICs3NjYsMTMgQEAKICAgICAgICAgaWYgKG1TZWVraW5nKSB7CiAgICAgICAgICAgICByZXR1cm4gbVNlZWtUaW1lVXM7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZWFjaGVkRU9TKSB7CisgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICBtU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpOworICAgICAgICAgICAgcmV0dXJuIGR1cmF0aW9uVXM7CisgICAgICAgIH0KICAgICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9IGdldE91dHB1dFBsYXlQb3NpdGlvblVzX2woKTsKLSAgICAgICAgQUxPR1YoImdldE1lZGlhVGltZVVzIGdldE91dHB1dFBsYXlQb3NpdGlvblVzX2woKSBtUG9zaXRpb25UaW1lUmVhbFVzICVsbGQiLAorICAgICAgICBBTE9HVigiZ2V0TWVkaWFUaW1lVXMgZ2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCgpIG1Qb3NpdGlvblRpbWVSZWFsVXMgJSIgUFJJZDY0LAogICAgICAgICAgICAgICBtUG9zaXRpb25UaW1lUmVhbFVzKTsKICAgICAgICAgcmV0dXJuIG1Qb3NpdGlvblRpbWVSZWFsVXM7CiAgICAgfQpAQCAtNzk1LDcgKzgxMCw3IEBACiBzdGF0dXNfdCBBdWRpb1BsYXllcjo6c2Vla1RvKGludDY0X3QgdGltZV91cykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBBTE9HVigic2Vla1RvKCAlbGxkICkiLCB0aW1lX3VzKTsKKyAgICBBTE9HVigic2Vla1RvKCAlIiBQUklkNjQgIiApIiwgdGltZV91cyk7CiAKICAgICBtU2Vla2luZyA9IHRydWU7CiAgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9IG1Qb3NpdGlvblRpbWVNZWRpYVVzID0gLTE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKaW5kZXggZDcyMjNkOS4uODA0ZjEzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcApAQCAtMTQsNiArMTQsOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Tb3VyY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0yNiw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTY1LDEwICs2NywxMCBAQAogICAgIGlmIChzdGF0dXMgPT0gT0spIHsKICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIEF1ZGlvUmVjb3JkIGNhbGxiYWNrIG5ldmVyIHJldHVybnMgbW9yZSB0aGFuIHRoZSBtYXhpbXVtCiAgICAgICAgIC8vIGJ1ZmZlciBzaXplCi0gICAgICAgIGludCBmcmFtZUNvdW50ID0ga01heEJ1ZmZlclNpemUgLyBzaXplb2YoaW50MTZfdCkgLyBjaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90IGZyYW1lQ291bnQgPSBrTWF4QnVmZmVyU2l6ZSAvIHNpemVvZihpbnQxNl90KSAvIGNoYW5uZWxDb3VudDsKIAogICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgQXVkaW9SZWNvcmQgdG90YWwgYnVmZmVyIHNpemUgaXMgbGFyZ2UgZW5vdWdoCi0gICAgICAgIGludCBidWZDb3VudCA9IDI7CisgICAgICAgIHNpemVfdCBidWZDb3VudCA9IDI7CiAgICAgICAgIHdoaWxlICgoYnVmQ291bnQgKiBmcmFtZUNvdW50KSA8IG1pbkZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIGJ1ZkNvdW50Kys7CiAgICAgICAgIH0KQEAgLTc2LDEwICs3OCwxMCBAQAogICAgICAgICBtUmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKAogICAgICAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCksCi0gICAgICAgICAgICAgICAgICAgIGJ1ZkNvdW50ICogZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJ1ZkNvdW50ICogZnJhbWVDb3VudCksCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkQ2FsbGJhY2tGdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgLypub3RpZmljYXRpb25GcmFtZXMqLyk7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBtUmVjb3JkLT5pbml0Q2hlY2soKTsKICAgICB9IGVsc2UgewogICAgICAgICBtSW5pdENoZWNrID0gc3RhdHVzOwpAQCAtMTM2LDcgKzEzOCw3IEBACiB9CiAKIHZvaWQgQXVkaW9Tb3VyY2U6OndhaXRPdXRzdGFuZGluZ0VuY29kaW5nRnJhbWVzX2woKSB7Ci0gICAgQUxPR1YoIndhaXRPdXRzdGFuZGluZ0VuY29kaW5nRnJhbWVzX2w6ICVsbGQiLCBtTnVtQ2xpZW50T3duZWRCdWZmZXJzKTsKKyAgICBBTE9HVigid2FpdE91dHN0YW5kaW5nRW5jb2RpbmdGcmFtZXNfbDogJSIgUFJJZDY0LCBtTnVtQ2xpZW50T3duZWRCdWZmZXJzKTsKICAgICB3aGlsZSAobU51bUNsaWVudE93bmVkQnVmZmVycyA+IDApIHsKICAgICAgICAgbUZyYW1lRW5jb2RpbmdDb21wbGV0aW9uQ29uZGl0aW9uLndhaXQobUxvY2spOwogICAgIH0KQEAgLTE1Myw2ICsxNTUsOCBAQAogICAgIH0KIAogICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOworCiAgICAgbVJlY29yZC0+c3RvcCgpOwogICAgIHdhaXRPdXRzdGFuZGluZ0VuY29kaW5nRnJhbWVzX2woKTsKICAgICByZWxlYXNlUXVldWVkRnJhbWVzX2woKTsKQEAgLTIwOCw3ICsyMTIsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqIC8qIG9wdGlvbnMgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICpvdXQgPSBOVUxMOwogCkBAIC0yNjksNyArMjczLDcgQEAKIHN0YXR1c190IEF1ZGlvU291cmNlOjpkYXRhQ2FsbGJhY2soY29uc3QgQXVkaW9SZWNvcmQ6OkJ1ZmZlciYgYXVkaW9CdWZmZXIpIHsKICAgICBpbnQ2NF90IHRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDBsbDsKIAotICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6ICVsbGQgdXMiLCB0aW1lVXMpOworICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6ICUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmICghbVN0YXJ0ZWQpIHsKICAgICAgICAgQUxPR1coIlNwdXJpb3VzIGNhbGxiYWNrIGZyb20gQXVkaW9SZWNvcmQuIERyb3AgdGhlIGF1ZGlvIGRhdGEuIik7CkBAIC0yNzgsOCArMjgyLDggQEAKIAogICAgIC8vIERyb3AgcmV0cmlldmVkIGFuZCBwcmV2aW91c2x5IGxvc3QgYXVkaW8gZGF0YS4KICAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDAgJiYgdGltZVVzIDwgbVN0YXJ0VGltZVVzKSB7Ci0gICAgICAgIG1SZWNvcmQtPmdldElucHV0RnJhbWVzTG9zdCgpOwotICAgICAgICBBTE9HVigiRHJvcCBhdWRpbyBkYXRhIGF0ICVsbGQvJWxsZCB1cyIsIHRpbWVVcywgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgKHZvaWQpIG1SZWNvcmQtPmdldElucHV0RnJhbWVzTG9zdCgpOworICAgICAgICBBTE9HVigiRHJvcCBhdWRpbyBkYXRhIGF0ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzLCBtU3RhcnRUaW1lVXMpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCkBAIC0zMDgsNyArMzEyLDcgQEAKICAgICBpZiAobnVtTG9zdEJ5dGVzID4gMCkgewogICAgICAgICAvLyBMb3NzIG9mIGF1ZGlvIGZyYW1lcyBzaG91bGQgaGFwcGVuIHJhcmVseTsgdGh1cyB0aGUgTE9HVyBzaG91bGQKICAgICAgICAgLy8gbm90IGNhdXNlIGEgbG9nZ2luZyBzcGFtCi0gICAgICAgIEFMT0dXKCJMb3N0IGF1ZGlvIHJlY29yZCBkYXRhOiAlZCBieXRlcyIsIG51bUxvc3RCeXRlcyk7CisgICAgICAgIEFMT0dXKCJMb3N0IGF1ZGlvIHJlY29yZCBkYXRhOiAlenUgYnl0ZXMiLCBudW1Mb3N0Qnl0ZXMpOwogICAgIH0KIAogICAgIHdoaWxlIChudW1Mb3N0Qnl0ZXMgPiAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCmluZGV4IDEzM2NhZTMuLjQ5M2U1OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCkBAIC0xOSw2ICsxOSw5IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkF3ZXNvbWVQbGF5ZXIiCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKQEAgLTM0LDE2ICszNywyMCBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbG9ja0VzdGltYXRvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgpAQCAtODIsNyArODksNyBAQAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF3ZXNvbWVFdmVudCgpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZmlyZShUaW1lZEV2ZW50UXVldWUgKnF1ZXVlLCBpbnQ2NF90IC8qIG5vd191cyAqLykgeworICAgIHZpcnR1YWwgdm9pZCBmaXJlKFRpbWVkRXZlbnRRdWV1ZSAqIC8qIHF1ZXVlICovLCBpbnQ2NF90IC8qIG5vd191cyAqLykgewogICAgICAgICAobVBsYXllci0+Km1NZXRob2QpKCk7CiAgICAgfQogCkBAIC05NiwxNyArMTAzLDIxIEBACiAKIHN0cnVjdCBBd2Vzb21lTG9jYWxSZW5kZXJlciA6IHB1YmxpYyBBd2Vzb21lUmVuZGVyZXIgewogICAgIEF3ZXNvbWVMb2NhbFJlbmRlcmVyKAotICAgICAgICAgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdywgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKQotICAgICAgICA6IG1UYXJnZXQobmV3IFNvZnR3YXJlUmVuZGVyZXIobmF0aXZlV2luZG93LCBtZXRhKSkgeworICAgICAgICAgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpCisgICAgICAgIDogbUZvcm1hdChmb3JtYXQpLAorICAgICAgICAgIG1UYXJnZXQobmV3IFNvZnR3YXJlUmVuZGVyZXIobmF0aXZlV2luZG93KSkgewogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCByZW5kZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisKICAgICAgICAgcmVuZGVyKChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpLCB0aW1lVXMgKiAxMDAwKTsKICAgICB9CiAKLSAgICB2b2lkIHJlbmRlcihjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBtVGFyZ2V0LT5yZW5kZXIoZGF0YSwgc2l6ZSwgTlVMTCk7CisgICAgdm9pZCByZW5kZXIoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDY0X3QgdGltZXN0YW1wTnMpIHsKKyAgICAgICAgbVRhcmdldC0+cmVuZGVyKGRhdGEsIHNpemUsIHRpbWVzdGFtcE5zLCBOVUxMLCBtRm9ybWF0KTsKICAgICB9CiAKIHByb3RlY3RlZDoKQEAgLTExNiw2ICsxMjcsNyBAQAogICAgIH0KIAogcHJpdmF0ZToKKyAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKICAgICBTb2Z0d2FyZVJlbmRlcmVyICptVGFyZ2V0OwogCiAgICAgQXdlc29tZUxvY2FsUmVuZGVyZXIoY29uc3QgQXdlc29tZUxvY2FsUmVuZGVyZXIgJik7CkBAIC0yMjcsNiArMjM5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBd2Vzb21lUGxheWVyOjpvbkF1ZGlvVGVhckRvd25FdmVudCk7CiAgICAgbUF1ZGlvVGVhckRvd25FdmVudFBlbmRpbmcgPSBmYWxzZTsKIAorICAgIG1DbG9ja0VzdGltYXRvciA9IG5ldyBXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcigpOworCiAgICAgcmVzZXQoKTsKIH0KIApAQCAtMjc2LDE1ICsyOTAsMjAgQEAKIH0KIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKHVyaSwgaGVhZGVycyk7CisgICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChodHRwU2VydmljZSwgdXJpLCBoZWFkZXJzKTsKIH0KIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0RGF0YVNvdXJjZV9sKAotICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICByZXNldF9sKCk7CiAKKyAgICBtSFRUUFNlcnZpY2UgPSBodHRwU2VydmljZTsKICAgICBtVXJpID0gdXJpOwogCiAgICAgaWYgKGhlYWRlcnMpIHsKQEAgLTMwMSw3ICszMjAsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR0koInNldERhdGFTb3VyY2VfbChVUkwgc3VwcHJlc3NlZCkiKTsKKyAgICBBTE9HSSgic2V0RGF0YVNvdXJjZV9sKCVzKSIsIHVyaURlYnVnU3RyaW5nKG1VcmksIG1GbGFncyAmIElOQ09HTklUTykuY19zdHIoKSk7CiAKICAgICAvLyBUaGUgYWN0dWFsIHdvcmsgd2lsbCBiZSBkb25lIGR1cmluZyBwcmVwYXJhdGlvbiBpbiB0aGUgY2FsbCB0bwogICAgIC8vIDo6ZmluaXNoU2V0RGF0YVNvdXJjZV9sIHRvIGF2b2lkIGJsb2NraW5nIHRoZSBjYWxsaW5nIHRocmVhZCBpbgpAQCAtMzkzLDYgKzQxMiwxMyBAQAogCiAgICAgICAgIHRvdGFsQml0UmF0ZSArPSBiaXRyYXRlOwogICAgIH0KKyAgICBzcDxNZXRhRGF0YT4gZmlsZU1ldGEgPSBtRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOworICAgIGlmIChmaWxlTWV0YSAhPSBOVUxMKSB7CisgICAgICAgIGludDY0X3QgZHVyYXRpb247CisgICAgICAgIGlmIChmaWxlTWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgeworICAgICAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvbjsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG1CaXRyYXRlID0gdG90YWxCaXRSYXRlOwogCkBAIC01ODEsNiArNjA3LDcgQEAKICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwogICAgIG1TZWVrVGltZVVzID0gMDsKIAorICAgIG1IVFRQU2VydmljZS5jbGVhcigpOwogICAgIG1Vcmkuc2V0VG8oIiIpOwogICAgIG1VcmlIZWFkZXJzLmNsZWFyKCk7CiAKQEAgLTcwOCwxMSArNzM1LDkgQEAKICAgICAgICAgICAgICAgICBmaW5pc2hBc3luY1ByZXBhcmVfbCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50NjRfdCBiaXRyYXRlOwotICAgICAgICAgICAgaWYgKGdldEJpdHJhdGUoJmJpdHJhdGUpKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGNhY2hlZFNpemUgPSBtQ2FjaGVkU291cmNlLT5jYWNoZWRTaXplKCk7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gY2FjaGVkU2l6ZSAqIDgwMDAwMDBsbCAvIGJpdHJhdGU7Ci0KKyAgICAgICAgICAgIGJvb2wgZW9zMjsKKyAgICAgICAgICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmIChnZXRDYWNoZWREdXJhdGlvbl9sKCZjYWNoZWREdXJhdGlvblVzLCAmZW9zMikgJiYgbUR1cmF0aW9uVXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW50IHBlcmNlbnRhZ2UgPSAxMDAuMCAqIChkb3VibGUpY2FjaGVkRHVyYXRpb25VcyAvIG1EdXJhdGlvblVzOwogICAgICAgICAgICAgICAgIGlmIChwZXJjZW50YWdlID4gMTAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAxMDA7CkBAIC03MjAsMTIgKzc0NSwxMiBAQAogCiAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9CVUZGRVJJTkdfVVBEQVRFLCBwZXJjZW50YWdlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgYml0cmF0ZSBvZiB0aGUgc3RyZWFtLCB1c2UgYWJzb2x1dGUgc2l6ZQorICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIGJpdHJhdGUvZHVyYXRpb24gb2YgdGhlIHN0cmVhbSwgdXNlIGFic29sdXRlIHNpemUKICAgICAgICAgICAgICAgICAvLyBsaW1pdHMgdG8gbWFpbnRhaW4gdGhlIGNhY2hlLgogCiAgICAgICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBQTEFZSU5HKSAmJiAhZW9zCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2FjaGVkRGF0YVJlbWFpbmluZyA8IGtMb3dXYXRlck1hcmtCeXRlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koImNhY2hlIGlzIHJ1bm5pbmcgbG93ICg8ICVkKSAsIHBhdXNpbmcuIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImNhY2hlIGlzIHJ1bm5pbmcgbG93ICg8ICV6dSkgLCBwYXVzaW5nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga0xvd1dhdGVyTWFya0J5dGVzKTsKICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoQ0FDSEVfVU5ERVJSVU4sIFNFVCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdXNlX2woKTsKQEAgLTczNCwxMiArNzU5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfU1RBUlQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW9zIHx8IGNhY2hlZERhdGFSZW1haW5pbmcgPiBrSGlnaFdhdGVyTWFya0J5dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTikgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koImNhY2hlIGhhcyBmaWxsZWQgdXAgKD4gJWQpLCByZXN1bWluZy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koImNhY2hlIGhhcyBmaWxsZWQgdXAgKD4gJXp1KSwgcmVzdW1pbmcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0hpZ2hXYXRlck1hcmtCeXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgQ0xFQVIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcGxheV9sKCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2FjaGUgaGFzIGZpbGxlZCB1cCAoPiAlZCksIHByZXBhcmUgaXMgZG9uZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2FjaGUgaGFzIGZpbGxlZCB1cCAoPiAlenUpLCBwcmVwYXJlIGlzIGRvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGlnaFdhdGVyTWFya0J5dGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEyMTMsNyArMTIzOCw5IEBACiAgICAgICAgIC8vIGFsbG9jYXRlIHRoZWlyIGJ1ZmZlcnMgaW4gbG9jYWwgYWRkcmVzcyBzcGFjZS4gIFRoaXMgcmVuZGVyZXIKICAgICAgICAgLy8gdGhlbiBwZXJmb3JtcyBhIGNvbG9yIGNvbnZlcnNpb24gYW5kIGNvcHkgdG8gZ2V0IHRoZSBkYXRhCiAgICAgICAgIC8vIGludG8gdGhlIEFOYXRpdmVCdWZmZXIuCi0gICAgICAgIG1WaWRlb1JlbmRlcmVyID0gbmV3IEF3ZXNvbWVMb2NhbFJlbmRlcmVyKG1OYXRpdmVXaW5kb3csIG1ldGEpOworICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJmZvcm1hdCk7CisgICAgICAgIG1WaWRlb1JlbmRlcmVyID0gbmV3IEF3ZXNvbWVMb2NhbFJlbmRlcmVyKG1OYXRpdmVXaW5kb3csIGZvcm1hdCk7CiAgICAgfQogfQogCkBAIC0xNDgyLDcgKzE1MDksNyBAQAogICAgIENIRUNLKHNvdXJjZSAhPSBOVUxMKTsKIAogICAgIGlmIChtVGV4dERyaXZlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIpOworICAgICAgICBtVGV4dERyaXZlciA9IG5ldyBUaW1lZFRleHREcml2ZXIobUxpc3RlbmVyLCBtSFRUUFNlcnZpY2UpOwogICAgIH0KIAogICAgIG1UZXh0RHJpdmVyLT5hZGRJbkJhbmRUZXh0U291cmNlKHRyYWNrSW5kZXgsIHNvdXJjZSk7CkBAIC0xNjk0LDcgKzE3MjEsNyBAQAogICAgIH0KIAogICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigic2Vla2luZyBhdWRpbyB0byAlbGxkIHVzICglLjJmIHNlY3MpLiIsIHZpZGVvVGltZVVzLCB2aWRlb1RpbWVVcyAvIDFFNik7CisgICAgICAgIEFMT0dWKCJzZWVraW5nIGF1ZGlvIHRvICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpLiIsIHZpZGVvVGltZVVzLCB2aWRlb1RpbWVVcyAvIDFFNik7CiAKICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHZpZGVvIHRpbWUsIHNlZWsgYXVkaW8gdG8gdGhlIG9yaWdpbmFsbHkKICAgICAgICAgLy8gcmVxdWVzdGVkIHNlZWsgdGltZSBpbnN0ZWFkLgpAQCAtMTc1OCw3ICsxNzg1LDcgQEAKICAgICBpZiAoIW1WaWRlb0J1ZmZlcikgewogICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKICAgICAgICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUspIHsKLSAgICAgICAgICAgIEFMT0dWKCJzZWVraW5nIHRvICVsbGQgdXMgKCUuMmYgc2VjcykiLCBtU2Vla1RpbWVVcywgbVNlZWtUaW1lVXMgLyAxRTYpOworICAgICAgICAgICAgQUxPR1YoInNlZWtpbmcgdG8gJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcykiLCBtU2Vla1RpbWVVcywgbVNlZWtUaW1lVXMgLyAxRTYpOwogCiAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbygKICAgICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lVXMsCkBAIC0xODI4LDcgKzE4NTUsNyBAQAogCiAgICAgaWYgKG1TZWVraW5nID09IFNFRUtfVklERU9fT05MWSkgewogICAgICAgICBpZiAobVNlZWtUaW1lVXMgPiB0aW1lVXMpIHsKLSAgICAgICAgICAgIEFMT0dJKCJYWFggbVNlZWtUaW1lVXMgPSAlbGxkIHVzLCB0aW1lVXMgPSAlbGxkIHVzIiwKKyAgICAgICAgICAgIEFMT0dJKCJYWFggbVNlZWtUaW1lVXMgPSAlIiBQUklkNjQgIiB1cywgdGltZVVzID0gJSIgUFJJZDY0ICIgdXMiLAogICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcywgdGltZVVzKTsKICAgICAgICAgfQogICAgIH0KQEAgLTE4NTgsMjEgKzE4ODUsMjggQEAKICAgICBUaW1lU291cmNlICp0cyA9CiAgICAgICAgICgobUZsYWdzICYgQVVESU9fQVRfRU9TKSB8fCAhKG1GbGFncyAmIEFVRElPUExBWUVSX1NUQVJURUQpKQogICAgICAgICAgICAgPyAmbVN5c3RlbVRpbWVTb3VyY2UgOiBtVGltZVNvdXJjZTsKKyAgICBpbnQ2NF90IHN5c3RlbVRpbWVVcyA9IG1TeXN0ZW1UaW1lU291cmNlLmdldFJlYWxUaW1lVXMoKTsKKyAgICBpbnQ2NF90IGxvb3BlclRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CiAKICAgICBpZiAobUZsYWdzICYgRklSU1RfRlJBTUUpIHsKICAgICAgICAgbW9kaWZ5RmxhZ3MoRklSU1RfRlJBTUUsIENMRUFSKTsKICAgICAgICAgbVNpbmNlTGFzdERyb3BwZWQgPSAwOwotICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gdGltZVVzOworICAgICAgICBtQ2xvY2tFc3RpbWF0b3ItPnJlc2V0KCk7CisgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IGVzdGltYXRlUmVhbFRpbWVVcyh0cywgc3lzdGVtVGltZVVzKSAtIHRpbWVVczsKICAgICB9CiAKICAgICBpbnQ2NF90IHJlYWxUaW1lVXMsIG1lZGlhVGltZVVzOwogICAgIGlmICghKG1GbGFncyAmIEFVRElPX0FUX0VPUykgJiYgbUF1ZGlvUGxheWVyICE9IE5VTEwKICAgICAgICAgJiYgbUF1ZGlvUGxheWVyLT5nZXRNZWRpYVRpbWVNYXBwaW5nKCZyZWFsVGltZVVzLCAmbWVkaWFUaW1lVXMpKSB7CisgICAgICAgIEFMT0dWKCJ1cGRhdGluZyBUU2RlbHRhICglIiBQUklkNjQgIiA9PiAlIiBQUklkNjQgIiBjaGFuZ2UgJSIgUFJJZDY0ICIpIiwKKyAgICAgICAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzLCByZWFsVGltZVVzIC0gbWVkaWFUaW1lVXMsCisgICAgICAgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyAtIChyZWFsVGltZVVzIC0gbWVkaWFUaW1lVXMpKTsKKyAgICAgICAgQVRSQUNFX0lOVCgiVFMgZGVsdGEgY2hhbmdlIChtcykiLCAobVRpbWVTb3VyY2VEZWx0YVVzIC0gKHJlYWxUaW1lVXMgLSBtZWRpYVRpbWVVcykpIC8gMUUzKTsKICAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gcmVhbFRpbWVVcyAtIG1lZGlhVGltZVVzOwogICAgIH0KIAogICAgIGlmICh3YXNTZWVraW5nID09IFNFRUtfVklERU9fT05MWSkgewotICAgICAgICBpbnQ2NF90IG5vd1VzID0gdHMtPmdldFJlYWxUaW1lVXMoKSAtIG1UaW1lU291cmNlRGVsdGFVczsKKyAgICAgICAgaW50NjRfdCBub3dVcyA9IGVzdGltYXRlUmVhbFRpbWVVcyh0cywgc3lzdGVtVGltZVVzKSAtIG1UaW1lU291cmNlRGVsdGFVczsKIAogICAgICAgICBpbnQ2NF90IGxhdGVuZXNzVXMgPSBub3dVcyAtIHRpbWVVczsKIApAQCAtMTg4MywxMiArMTkxNywxMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaW50NjRfdCBsYXRlbmVzc1VzID0gMDsKICAgICBpZiAod2FzU2Vla2luZyA9PSBOT19TRUVLKSB7CiAgICAgICAgIC8vIExldCdzIGRpc3BsYXkgdGhlIGZpcnN0IGZyYW1lIGFmdGVyIHNlZWtpbmcgcmlnaHQgYXdheS4KIAotICAgICAgICBpbnQ2NF90IG5vd1VzID0gdHMtPmdldFJlYWxUaW1lVXMoKSAtIG1UaW1lU291cmNlRGVsdGFVczsKKyAgICAgICAgaW50NjRfdCBub3dVcyA9IGVzdGltYXRlUmVhbFRpbWVVcyh0cywgc3lzdGVtVGltZVVzKSAtIG1UaW1lU291cmNlRGVsdGFVczsKIAotICAgICAgICBpbnQ2NF90IGxhdGVuZXNzVXMgPSBub3dVcyAtIHRpbWVVczsKKyAgICAgICAgbGF0ZW5lc3NVcyA9IG5vd1VzIC0gdGltZVVzOwogCiAgICAgICAgIEFUUkFDRV9JTlQoIlZpZGVvIExhdGVuZXNzIChtcykiLCBsYXRlbmVzc1VzIC8gMUUzKTsKIApAQCAtMTkxOCwxMyArMTk1MywxMyBAQAogCiAgICAgICAgIGlmIChsYXRlbmVzc1VzID4gNDAwMDApIHsKICAgICAgICAgICAgIC8vIFdlJ3JlIG1vcmUgdGhhbiA0MG1zIGxhdGUuCi0gICAgICAgICAgICBBTE9HVigid2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIiwKKyAgICAgICAgICAgIEFMT0dWKCJ3ZSdyZSBsYXRlIGJ5ICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpIiwKICAgICAgICAgICAgICAgICAgbGF0ZW5lc3NVcywgbGF0ZW5lc3NVcyAvIDFFNik7CiAKICAgICAgICAgICAgIGlmICghKG1GbGFncyAmIFNMT1dfREVDT0RFUl9IQUNLKQogICAgICAgICAgICAgICAgICAgICB8fCBtU2luY2VMYXN0RHJvcHBlZCA+IEZSQU1FX0RST1BfRlJFUSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBTE9HVigid2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIGRyb3BwaW5nICIKKyAgICAgICAgICAgICAgICBBTE9HVigid2UncmUgbGF0ZSBieSAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSBkcm9wcGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAib25lIGFmdGVyICVkIGZyYW1lcyIsCiAgICAgICAgICAgICAgICAgICAgICBsYXRlbmVzc1VzLCBsYXRlbmVzc1VzIC8gMUU2LCBtU2luY2VMYXN0RHJvcHBlZCk7CiAKQEAgLTE5NDIsOSArMTk3Nyw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobGF0ZW5lc3NVcyA8IC0xMDAwMCkgewotICAgICAgICAgICAgLy8gV2UncmUgbW9yZSB0aGFuIDEwbXMgZWFybHkuCi0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDEwMDAwKTsKKyAgICAgICAgaWYgKGxhdGVuZXNzVXMgPCAtMzAwMDApIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIG1vcmUgdGhhbiAzMG1zIGVhcmx5LCBzY2hlZHVsZSBhdCBtb3N0IDIwIG1zIGJlZm9yZSB0aW1lIGR1ZQorICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbChsYXRlbmVzc1VzIDwgLTYwMDAwID8gMzAwMDAgOiAtbGF0ZW5lc3NVcyAtIDIwMDAwKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KQEAgLTE5NTgsNiArMTk5Myw4IEBACiAKICAgICBpZiAobVZpZGVvUmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICBtU2luY2VMYXN0RHJvcHBlZCsrOworICAgICAgICBtVmlkZW9CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgbG9vcGVyVGltZVVzIC0gbGF0ZW5lc3NVcyk7CisKICAgICAgICAgbVZpZGVvUmVuZGVyZXItPnJlbmRlcihtVmlkZW9CdWZmZXIpOwogICAgICAgICBpZiAoIW1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQpIHsKICAgICAgICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQgPSB0cnVlOwpAQCAtMjAwNywxNCArMjA0NCwyNiBAQAogCiAgICAgICAgIGludDY0X3QgbmV4dFRpbWVVczsKICAgICAgICAgQ0hFQ0sobVZpZGVvQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmbmV4dFRpbWVVcykpOwotICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBuZXh0VGltZVVzIC0gdHMtPmdldFJlYWxUaW1lVXMoKSArIG1UaW1lU291cmNlRGVsdGFVczsKLSAgICAgICAgcG9zdFZpZGVvRXZlbnRfbChkZWxheVVzID4gMTAwMDAgPyAxMDAwMCA6IGRlbGF5VXMgPCAwID8gMCA6IGRlbGF5VXMpOworICAgICAgICBzeXN0ZW1UaW1lVXMgPSBtU3lzdGVtVGltZVNvdXJjZS5nZXRSZWFsVGltZVVzKCk7CisgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IG5leHRUaW1lVXMgLSBlc3RpbWF0ZVJlYWxUaW1lVXModHMsIHN5c3RlbVRpbWVVcykgKyBtVGltZVNvdXJjZURlbHRhVXM7CisgICAgICAgIEFUUkFDRV9JTlQoIkZyYW1lIGRlbHRhIChtcykiLCAobmV4dFRpbWVVcyAtIHRpbWVVcykgLyAxRTMpOworICAgICAgICBBTE9HVigibmV4dCBmcmFtZSBpbiAlIiBQUklkNjQsIGRlbGF5VXMpOworICAgICAgICAvLyB0cnkgdG8gc2NoZWR1bGUgMzBtcyBiZWZvcmUgdGltZSBkdWUKKyAgICAgICAgcG9zdFZpZGVvRXZlbnRfbChkZWxheVVzID4gNjAwMDAgPyAzMDAwMCA6IChkZWxheVVzIDwgMzAwMDAgPyAwIDogZGVsYXlVcyAtIDMwMDAwKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBwb3N0VmlkZW9FdmVudF9sKCk7CiB9CiAKK2ludDY0X3QgQXdlc29tZVBsYXllcjo6ZXN0aW1hdGVSZWFsVGltZVVzKFRpbWVTb3VyY2UgKnRzLCBpbnQ2NF90IHN5c3RlbVRpbWVVcykgeworICAgIGlmICh0cyA9PSAmbVN5c3RlbVRpbWVTb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIHN5c3RlbVRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKGludDY0X3QpbUNsb2NrRXN0aW1hdG9yLT5lc3RpbWF0ZShzeXN0ZW1UaW1lVXMsIHRzLT5nZXRSZWFsVGltZVVzKCkpOworICAgIH0KK30KKwogdm9pZCBBd2Vzb21lUGxheWVyOjpwb3N0VmlkZW9FdmVudF9sKGludDY0X3QgZGVsYXlVcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKQEAgLTIxOTIsMTUgKzIyNDEsMTQgQEAKICAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgbVVyaS5zdHJpbmcoKSwgNykKICAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCBtVXJpLnN0cmluZygpLCA4KQogICAgICAgICAgICAgfHwgaXNXaWRldmluZVN0cmVhbWluZykgewotICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UgPSBIVFRQQmFzZTo6Q3JlYXRlKAotICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBJTkNPR05JVE8pCi0gICAgICAgICAgICAgICAgICAgID8gSFRUUEJhc2U6OmtGbGFnSW5jb2duaXRvCi0gICAgICAgICAgICAgICAgICAgIDogMCk7Ci0KLSAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlLT5zZXRVSUQobVVJRCk7CisgICAgICAgIGlmIChtSFRUUFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkF0dGVtcHQgdG8gcGxheSBtZWRpYSBmcm9tIGh0dHAgVVJJIHdpdGhvdXQgSFRUUCBzZXJ2aWNlLiIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gY29ubiA9IG1IVFRQU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCk7CisgICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZSA9IG5ldyBNZWRpYUhUVFAoY29ubik7CisKICAgICAgICAgU3RyaW5nOCBjYWNoZUNvbmZpZzsKICAgICAgICAgYm9vbCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrOwogICAgICAgICBOdUNhY2hlZFNvdXJjZTI6OlJlbW92ZUNhY2hlU3BlY2lmaWNIZWFkZXJzKApAQCAtMjIwOCw2ICsyMjU2LDEwIEBACiAKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25uZWN0aW5nRGF0YVNvdXJjZS0+Y29ubmVjdChtVXJpLCAmbVVyaUhlYWRlcnMpOworICAgICAgICAvLyBmb3JjZSBjb25uZWN0aW9uIGF0IHRoaXMgcG9pbnQsIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBnZXRNSU1FVHlwZSBhbmQgdGhlCisgICAgICAgIC8vIGNhY2hpbmcgZGF0YXNvdXJjZSBjb25zdHJ1Y3RlZCBiZWxvdywgd2hpY2ggY291bGQgcmVzdWx0IGluIG11bHRpcGxlIHJlcXVlc3RzIHRvIHRoZQorICAgICAgICAvLyBzZXJ2ZXIsIGFuZC9vciBmYWlsZWQgY29ubmVjdGlvbnMuCisgICAgICAgIFN0cmluZzggY29udGVudFR5cGUgPSBtQ29ubmVjdGluZ0RhdGFTb3VyY2UtPmdldE1JTUVUeXBlKCk7CiAgICAgICAgIG1Mb2NrLmxvY2soKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0yMjM4LDggKzIyOTAsNiBAQAogCiAgICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZS5jbGVhcigpOwogCi0gICAgICAgIFN0cmluZzggY29udGVudFR5cGUgPSBkYXRhU291cmNlLT5nZXRNSU1FVHlwZSgpOwotCiAgICAgICAgIGlmIChzdHJuY2FzZWNtcChjb250ZW50VHlwZS5zdHJpbmcoKSwgImF1ZGlvLyIsIDYpKSB7CiAgICAgICAgICAgICAvLyBXZSdyZSBub3QgZG9pbmcgdGhpcyBmb3Igc3RyZWFtcyB0aGF0IGFwcGVhciB0byBiZSBhdWRpby1vbmx5CiAgICAgICAgICAgICAvLyBzdHJlYW1zIHRvIGVuc3VyZSB0aGF0IGV2ZW4gbG93IGJhbmR3aWR0aCBzdHJlYW1zIHN0YXJ0CkBAIC0yMjcxLDEyICsyMzIxLDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsU3RhdHVzICE9IE9LCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1ldGFEYXRhU2l6ZSA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNhY2hlZERhdGFSZW1haW5pbmcgPj0gbWV0YURhdGFTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAob2ZmNjRfdCljYWNoZWREYXRhUmVtYWluaW5nID49IG1ldGFEYXRhU2l6ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobUZsYWdzICYgUFJFUEFSRV9DQU5DRUxMRUQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJub3cgY2FjaGVkICVkIGJ5dGVzIG9mIGRhdGEiLCBjYWNoZWREYXRhUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5vdyBjYWNoZWQgJXp1IGJ5dGVzIG9mIGRhdGEiLCBjYWNoZWREYXRhUmVtYWluaW5nKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobWV0YURhdGFTaXplIDwgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNhY2hlZERhdGFSZW1haW5pbmcgPj0ga01pbkJ5dGVzRm9yU25pZmZpbmcpIHsKQEAgLTIyOTUsOCArMjM0NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzbmlmZmVkTUlNRSA9IHRtcC5zdHJpbmcoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEgPT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbWV0YS0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGEtZGF0YS1zaXplIiwgJm1ldGFEYXRhU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW1ldGEtPmZpbmRJbnQ2NCgibWV0YS1kYXRhLXNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KCZtZXRhRGF0YVNpemUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhU2l6ZSA9IGtIaWdoV2F0ZXJNYXJrQnl0ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTIzMTYsNyArMjM2Niw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShtVXJpLnN0cmluZygpLCAmbVVyaUhlYWRlcnMpOworICAgICAgICBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UsIG1Vcmkuc3RyaW5nKCksICZtVXJpSGVhZGVycyk7CiAgICAgfQogCiAgICAgaWYgKGRhdGFTb3VyY2UgPT0gTlVMTCkgewpAQCAtMjU4MywxMiArMjYzNCwxMiBAQAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2VsZWN0QXVkaW9UcmFja19sKAogICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSwgc2l6ZV90IHRyYWNrSW5kZXgpIHsKIAotICAgIEFMT0dJKCJzZWxlY3RBdWRpb1RyYWNrX2w6IHRyYWNrSW5kZXg9JWQsIG1GbGFncz0weCV4IiwgdHJhY2tJbmRleCwgbUZsYWdzKTsKKyAgICBBTE9HSSgic2VsZWN0QXVkaW9UcmFja19sOiB0cmFja0luZGV4PSV6dSwgbUZsYWdzPTB4JXgiLCB0cmFja0luZGV4LCBtRmxhZ3MpOwogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CiAgICAgICAgIGlmICgoc3NpemVfdCl0cmFja0luZGV4ID09IG1BY3RpdmVBdWRpb1RyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgIEFMT0dJKCJUcmFjayAlZCBpcyBhY3RpdmUuIERvZXMgbm90aGluZy4iLCB0cmFja0luZGV4KTsKKyAgICAgICAgICAgIEFMT0dJKCJUcmFjayAlenUgaXMgYWN0aXZlLiBEb2VzIG5vdGhpbmcuIiwgdHJhY2tJbmRleCk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KICAgICAgICAgLy9tU3RhdHMubUZsYWdzID0gbUZsYWdzOwpAQCAtMjY1NCwxNCArMjcwNSwxNCBAQAogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCJzZWxlY3RUcmFjazogdHJhY2tJbmRleCA9ICVkIGFuZCBzZWxlY3Q9JWQiLCB0cmFja0luZGV4LCBzZWxlY3QpOworICAgIEFMT0dWKCJzZWxlY3RUcmFjazogdHJhY2tJbmRleCA9ICV6dSBhbmQgc2VsZWN0PSVkIiwgdHJhY2tJbmRleCwgc2VsZWN0KTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIHNpemVfdCB0cmFja0NvdW50ID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKICAgICBpZiAobVRleHREcml2ZXIgIT0gTlVMTCkgewogICAgICAgICB0cmFja0NvdW50ICs9IG1UZXh0RHJpdmVyLT5jb3VudEV4dGVybmFsVHJhY2tzKCk7CiAgICAgfQogICAgIGlmICh0cmFja0luZGV4ID49IHRyYWNrQ291bnQpIHsKLSAgICAgICAgQUxPR0UoIlRyYWNrIGluZGV4ICglZCkgaXMgb3V0IG9mIHJhbmdlIFswLCAlZCkiLCB0cmFja0luZGV4LCB0cmFja0NvdW50KTsKKyAgICAgICAgQUxPR0UoIlRyYWNrIGluZGV4ICglenUpIGlzIG91dCBvZiByYW5nZSBbMCwgJXp1KSIsIHRyYWNrSW5kZXgsIHRyYWNrQ291bnQpOwogICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KIApAQCAtMjY3MywxNCArMjcyNCwxNCBAQAogICAgICAgICBpc0F1ZGlvVHJhY2sgPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOwogCiAgICAgICAgIGlmICghaXNBdWRpb1RyYWNrICYmIHN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhY2sgJWQgaXMgbm90IGVpdGhlciBhdWRpbyBvciB0aW1lZCB0ZXh0IiwgdHJhY2tJbmRleCk7CisgICAgICAgICAgICBBTE9HRSgiVHJhY2sgJXp1IGlzIG5vdCBlaXRoZXIgYXVkaW8gb3IgdGltZWQgdGV4dCIsIHRyYWNrSW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGlzQXVkaW9UcmFjaykgewogICAgICAgICBpZiAoIXNlbGVjdCkgewotICAgICAgICAgICAgQUxPR0UoIkRlc2VsZWN0IGFuIGF1ZGlvIHRyYWNrICglZCkgaXMgbm90IHN1cHBvcnRlZCIsIHRyYWNrSW5kZXgpOworICAgICAgICAgICAgQUxPR0UoIkRlc2VsZWN0IGFuIGF1ZGlvIHRyYWNrICglenUpIGlzIG5vdCBzdXBwb3J0ZWQiLCB0cmFja0luZGV4KTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc2VsZWN0QXVkaW9UcmFja19sKG1FeHRyYWN0b3ItPmdldFRyYWNrKHRyYWNrSW5kZXgpLCB0cmFja0luZGV4KTsKQEAgLTI3NTgsNyArMjgwOSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgICAgICBpZiAobVRleHREcml2ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIsIG1IVFRQU2VydmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBTdHJpbmcgdmFsdWVzIHdyaXR0ZW4gaW4gUGFyY2VsIGFyZSBVVEYtMTYgdmFsdWVzLgogICAgICAgICAgICAgU3RyaW5nOCB1cmkocmVxdWVzdC5yZWFkU3RyaW5nMTYoKSk7CkBAIC0yNzcwLDcgKzI4MjEsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICAgICAgaWYgKG1UZXh0RHJpdmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtVGV4dERyaXZlciA9IG5ldyBUaW1lZFRleHREcml2ZXIobUxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBtVGV4dERyaXZlciA9IG5ldyBUaW1lZFRleHREcml2ZXIobUxpc3RlbmVyLCBtSFRUUFNlcnZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50IGZkICAgICAgICAgPSByZXF1ZXN0LnJlYWRGaWxlRGVzY3JpcHRvcigpOwogICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSByZXF1ZXN0LnJlYWRJbnQ2NCgpOwpAQCAtMjgwMywxNCArMjg1NCwxNSBAQAogICAgIHJldHVybiBtQ2FjaGVkU291cmNlICE9IE5VTEwgfHwgbVdWTUV4dHJhY3RvciAhPSBOVUxMOwogfQogCi1zdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Qgeworc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6ZHVtcCgKKyAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICYgLyogYXJncyAqLykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKIAogICAgIEZJTEUgKm91dCA9IGZkb3BlbihkdXAoZmQpLCAidyIpOwogCiAgICAgZnByaW50ZihvdXQsICIgQXdlc29tZVBsYXllclxuIik7CiAgICAgaWYgKG1TdGF0cy5tRmQgPCAwKSB7Ci0gICAgICAgIGZwcmludGYob3V0LCAiICBVUkkoc3VwcHJlc3NlZCkiKTsKKyAgICAgICAgZnByaW50ZihvdXQsICIgIFVSSSglcykiLCB1cmlEZWJ1Z1N0cmluZyhtVXJpLCBtRmxhZ3MgJiBJTkNPR05JVE8pLmNfc3RyKCkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZwcmludGYob3V0LCAiICBmZCglZCkiLCBtU3RhdHMubUZkKTsKICAgICB9CkBAIC0yODE4LDcgKzI4NzAsNyBAQAogICAgIGZwcmludGYob3V0LCAiLCBmbGFncygweCUwOHgpIiwgbVN0YXRzLm1GbGFncyk7CiAKICAgICBpZiAobVN0YXRzLm1CaXRyYXRlID49IDApIHsKLSAgICAgICAgZnByaW50ZihvdXQsICIsIGJpdHJhdGUoJWxsZCBicHMpIiwgbVN0YXRzLm1CaXRyYXRlKTsKKyAgICAgICAgZnByaW50ZihvdXQsICIsIGJpdHJhdGUoJSIgUFJJZDY0ICIgYnBzKSIsIG1TdGF0cy5tQml0cmF0ZSk7CiAgICAgfQogCiAgICAgZnByaW50ZihvdXQsICJcbiIpOwpAQCAtMjgyNiw3ICsyODc4LDcgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdGF0cy5tVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGNvbnN0IFRyYWNrU3RhdCAmc3RhdCA9IG1TdGF0cy5tVHJhY2tzLml0ZW1BdChpKTsKIAotICAgICAgICBmcHJpbnRmKG91dCwgIiAgVHJhY2sgJWRcbiIsIGkgKyAxKTsKKyAgICAgICAgZnByaW50ZihvdXQsICIgIFRyYWNrICV6dVxuIiwgaSArIDEpOwogICAgICAgICBmcHJpbnRmKG91dCwgIiAgIE1JTUUoJXMpIiwgc3RhdC5tTUlNRS5zdHJpbmcoKSk7CiAKICAgICAgICAgaWYgKCFzdGF0Lm1EZWNvZGVyTmFtZS5pc0VtcHR5KCkpIHsKQEAgLTI4MzgsOCArMjg5MCw4IEBACiAgICAgICAgIGlmICgoc3NpemVfdClpID09IG1TdGF0cy5tVmlkZW9UcmFja0luZGV4KSB7CiAgICAgICAgICAgICBmcHJpbnRmKG91dCwKICAgICAgICAgICAgICAgICAgICAgIiAgIHZpZGVvRGltZW5zaW9ucyglZCB4ICVkKSwgIgotICAgICAgICAgICAgICAgICAgICAibnVtVmlkZW9GcmFtZXNEZWNvZGVkKCVsbGQpLCAiCi0gICAgICAgICAgICAgICAgICAgICJudW1WaWRlb0ZyYW1lc0Ryb3BwZWQoJWxsZClcbiIsCisgICAgICAgICAgICAgICAgICAgICJudW1WaWRlb0ZyYW1lc0RlY29kZWQoJSIgUFJJZDY0ICIpLCAiCisgICAgICAgICAgICAgICAgICAgICJudW1WaWRlb0ZyYW1lc0Ryb3BwZWQoJSIgUFJJZDY0ICIpXG4iLAogICAgICAgICAgICAgICAgICAgICBtU3RhdHMubVZpZGVvV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVmlkZW9IZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5tTnVtVmlkZW9GcmFtZXNEZWNvZGVkLApAQCAtMjg5OSw2ICsyOTUxLDkgQEAKICAgICAvLyBnZXQgY3VycmVudCBwb3NpdGlvbiBzbyB3ZSBjYW4gc3RhcnQgcmVjcmVhdGVkIHN0cmVhbSBmcm9tIGhlcmUKICAgICBnZXRQb3NpdGlvbigmbUF1ZGlvVGVhckRvd25Qb3NpdGlvbik7CiAKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gc2F2ZWRIVFRQU2VydmljZSA9IG1IVFRQU2VydmljZTsKKworICAgIGJvb2wgd2FzTG9vcGluZyA9IG1GbGFncyAmIExPT1BJTkc7CiAgICAgLy8gUmVzZXQgYW5kIHJlY3JlYXRlCiAgICAgcmVzZXRfbCgpOwogCkBAIC0yOTA4LDcgKzI5NjMsNyBAQAogICAgICAgICBtRmlsZVNvdXJjZSA9IGZpbGVTb3VyY2U7CiAgICAgICAgIGVyciA9IHNldERhdGFTb3VyY2VfbChmaWxlU291cmNlKTsKICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBzZXREYXRhU291cmNlX2wodXJpLCAmdXJpSGVhZGVycyk7CisgICAgICAgIGVyciA9IHNldERhdGFTb3VyY2VfbChzYXZlZEhUVFBTZXJ2aWNlLCB1cmksICZ1cmlIZWFkZXJzKTsKICAgICB9CiAKICAgICBtRmxhZ3MgfD0gUFJFUEFSSU5HOwpAQCAtMjkxNyw2ICsyOTcyLDkgQEAKICAgICAgICAgLy8gYSBNRURJQV9FUlJPUiB0byB0aGUgY2xpZW50IGFuZCBhYm9ydCB0aGUgcHJlcGFyZQogICAgICAgICBtRmxhZ3MgfD0gUFJFUEFSRV9DQU5DRUxMRUQ7CiAgICAgfQorICAgIGlmICh3YXNMb29waW5nKSB7CisgICAgICAgIG1GbGFncyB8PSBMT09QSU5HOworICAgIH0KIAogICAgIG1BdWRpb1RlYXJEb3duID0gdHJ1ZTsKICAgICBtSXNBc3luY1ByZXBhcmUgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKaW5kZXggMzAxN2ZlNy4uZjc2YWVkNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTb3VyY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0zMSw2ICszMywxMiBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkgKHZvaWQpKHgpCisjZWxzZQorI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkKKyNlbmRpZgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBpbnQ2NF90IENBTUVSQV9TT1VSQ0VfVElNRU9VVF9OUyA9IDMwMDAwMDAwMDBMTDsKQEAgLTYzLDEyICs3MSwxNSBAQAogfQogCiB2b2lkIENhbWVyYVNvdXJjZUxpc3RlbmVyOjpub3RpZnkoaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikgeworICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRShtc2dUeXBlKTsKKyAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoZXh0MSk7CisgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKGV4dDIpOwogICAgIEFMT0dWKCJub3RpZnkoJWQsICVkLCAlZCkiLCBtc2dUeXBlLCBleHQxLCBleHQyKTsKIH0KIAogdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6cG9zdERhdGEoaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YVB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSkgewotICAgIEFMT0dWKCJwb3N0RGF0YSglZCwgcHRyOiVwLCBzaXplOiVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqIC8qIG1ldGFkYXRhICovKSB7CisgICAgQUxPR1YoInBvc3REYXRhKCVkLCBwdHI6JXAsIHNpemU6JXp1KSIsCiAgICAgICAgICBtc2dUeXBlLCBkYXRhUHRyLT5wb2ludGVyKCksIGRhdGFQdHItPnNpemUoKSk7CiAKICAgICBzcDxDYW1lcmFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2UucHJvbW90ZSgpOwpAQCAtNTc3LDE0ICs1ODgsMTUgQEAKICAgICB9CiB9CiAKLXZvaWQgQ2FtZXJhU291cmNlOjpzdGFydENhbWVyYVJlY29yZGluZygpIHsKK3N0YXR1c190IENhbWVyYVNvdXJjZTo6c3RhcnRDYW1lcmFSZWNvcmRpbmcoKSB7CiAgICAgQUxPR1YoInN0YXJ0Q2FtZXJhUmVjb3JkaW5nIik7CiAgICAgLy8gUmVzZXQgdGhlIGlkZW50aXR5IHRvIHRoZSBjdXJyZW50IHRocmVhZCBiZWNhdXNlIG1lZGlhIHNlcnZlciBvd25zIHRoZQogICAgIC8vIGNhbWVyYSBhbmQgcmVjb3JkaW5nIGlzIHN0YXJ0ZWQgYnkgdGhlIGFwcGxpY2F0aW9ucy4gVGhlIGFwcGxpY2F0aW9ucwogICAgIC8vIHdpbGwgY29ubmVjdCB0byB0aGUgY2FtZXJhIGluIElDYW1lcmFSZWNvcmRpbmdQcm94eTo6c3RhcnRSZWNvcmRpbmcuCiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmIChtTnVtSW5wdXRCdWZmZXJzID4gMCkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ2FtZXJhLT5zZW5kQ29tbWFuZCgKKyAgICAgICAgZXJyID0gbUNhbWVyYS0+c2VuZENvbW1hbmQoCiAgICAgICAgICAgICBDQU1FUkFfQ01EX1NFVF9WSURFT19CVUZGRVJfQ09VTlQsIG1OdW1JbnB1dEJ1ZmZlcnMsIDApOwogCiAgICAgICAgIC8vIFRoaXMgY291bGQgaGFwcGVuIGZvciBDYW1lcmFIQUwxIGNsaWVudHM7IHRodXMgdGhlIGZhaWx1cmUgaXMKQEAgLTU5NSwxNyArNjA3LDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBlcnIgPSBPSzsKICAgICBpZiAobUNhbWVyYUZsYWdzICYgRkxBR1NfSE9UX0NBTUVSQSkgewogICAgICAgICBtQ2FtZXJhLT51bmxvY2soKTsKICAgICAgICAgbUNhbWVyYS5jbGVhcigpOwotICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssCi0gICAgICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHktPnN0YXJ0UmVjb3JkaW5nKG5ldyBQcm94eUxpc3RlbmVyKHRoaXMpKSk7CisgICAgICAgIGlmICgoZXJyID0gbUNhbWVyYVJlY29yZGluZ1Byb3h5LT5zdGFydFJlY29yZGluZygKKyAgICAgICAgICAgICAgICBuZXcgUHJveHlMaXN0ZW5lcih0aGlzKSkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IHJlY29yZGluZywgcmVjZWl2ZWQgZXJyb3I6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKG5ldyBDYW1lcmFTb3VyY2VMaXN0ZW5lcih0aGlzKSk7CiAgICAgICAgIG1DYW1lcmEtPnN0YXJ0UmVjb3JkaW5nKCk7Ci0gICAgICAgIENIRUNLKG1DYW1lcmEtPnJlY29yZGluZ0VuYWJsZWQoKSk7CisgICAgICAgIGlmICghbUNhbWVyYS0+cmVjb3JkaW5nRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBlcnIgPSAtRUlOVkFMOworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCByZWNvcmRpbmciKTsKKyAgICAgICAgfQogICAgIH0KICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICptZXRhKSB7CkBAIC02MzcsMTAgKzY1NywxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKChlcnIgPSBzdGFydENhbWVyYVJlY29yZGluZygpKSA9PSBPSykgeworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgfQogCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gZXJyOwogfQogCiB2b2lkIENhbWVyYVNvdXJjZTo6c3RvcENhbWVyYVJlY29yZGluZygpIHsKQEAgLTY1NSw2MyArNjc3LDgwIEBACiAKIHZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlQ2FtZXJhKCkgewogICAgIEFMT0dWKCJyZWxlYXNlQ2FtZXJhIik7Ci0gICAgaWYgKG1DYW1lcmEgIT0gMCkgewotICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgaWYgKChtQ2FtZXJhRmxhZ3MgJiBGTEFHU19IT1RfQ0FNRVJBKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiQ2FtZXJhIHdhcyBjb2xkIHdoZW4gd2Ugc3RhcnRlZCwgc3RvcHBpbmcgcHJldmlldyIpOwotICAgICAgICAgICAgbUNhbWVyYS0+c3RvcFByZXZpZXcoKTsKLSAgICAgICAgICAgIG1DYW1lcmEtPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgICAgICBtQ2FtZXJhLT51bmxvY2soKTsKKyAgICBzcDxDYW1lcmE+IGNhbWVyYTsKKyAgICBib29sIGNvbGRDYW1lcmEgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIC8vIGdldCBhIGxvY2FsIHJlZiBhbmQgY2xlYXIgcmVmIHRvIG1DYW1lcmEgbm93CisgICAgICAgIGNhbWVyYSA9IG1DYW1lcmE7CiAgICAgICAgIG1DYW1lcmEuY2xlYXIoKTsKLSAgICAgICAgbUNhbWVyYSA9IDA7CisgICAgICAgIGNvbGRDYW1lcmEgPSAobUNhbWVyYUZsYWdzICYgRkxBR1NfSE9UX0NBTUVSQSkgPT0gMDsKKyAgICB9CisKKyAgICBpZiAoY2FtZXJhICE9IDApIHsKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIGlmIChjb2xkQ2FtZXJhKSB7CisgICAgICAgICAgICBBTE9HVigiQ2FtZXJhIHdhcyBjb2xkIHdoZW4gd2Ugc3RhcnRlZCwgc3RvcHBpbmcgcHJldmlldyIpOworICAgICAgICAgICAgY2FtZXJhLT5zdG9wUHJldmlldygpOworICAgICAgICAgICAgY2FtZXJhLT5kaXNjb25uZWN0KCk7CisgICAgICAgIH0KKyAgICAgICAgY2FtZXJhLT51bmxvY2soKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgfQotICAgIGlmIChtQ2FtZXJhUmVjb3JkaW5nUHJveHkgIT0gMCkgewotICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHktPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOwotICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHkuY2xlYXIoKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1DYW1lcmFSZWNvcmRpbmdQcm94eSAhPSAwKSB7CisgICAgICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHktPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworICAgICAgICAgICAgbUNhbWVyYVJlY29yZGluZ1Byb3h5LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgbUNhbWVyYUZsYWdzID0gMDsKICAgICB9Ci0gICAgbUNhbWVyYUZsYWdzID0gMDsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpyZXNldCgpIHsKICAgICBBTE9HRCgicmVzZXQ6IEUiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogCi0gICAgaW50NjRfdCB0b2tlbjsKLSAgICBib29sIGlzVG9rZW5WYWxpZCA9IGZhbHNlOwotICAgIGlmIChtQ2FtZXJhICE9IDApIHsKLSAgICAgICAgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICBpc1Rva2VuVmFsaWQgPSB0cnVlOwotICAgIH0KLSAgICByZWxlYXNlUXVldWVkRnJhbWVzKCk7Ci0gICAgd2hpbGUgKCFtRnJhbWVzQmVpbmdFbmNvZGVkLmVtcHR5KCkpIHsKLSAgICAgICAgaWYgKE5PX0VSUk9SICE9Ci0gICAgICAgICAgICBtRnJhbWVDb21wbGV0ZUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobUxvY2ssCi0gICAgICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzICogMTAwMExMICsgQ0FNRVJBX1NPVVJDRV9USU1FT1VUX05TKSkgewotICAgICAgICAgICAgQUxPR1coIlRpbWVkIG91dCB3YWl0aW5nIGZvciBvdXRzdGFuZGluZyBmcmFtZXMgYmVpbmcgZW5jb2RlZDogJWQiLAotICAgICAgICAgICAgICAgIG1GcmFtZXNCZWluZ0VuY29kZWQuc2l6ZSgpKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKKworICAgICAgICBpbnQ2NF90IHRva2VuOworICAgICAgICBib29sIGlzVG9rZW5WYWxpZCA9IGZhbHNlOworICAgICAgICBpZiAobUNhbWVyYSAhPSAwKSB7CisgICAgICAgICAgICB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBpc1Rva2VuVmFsaWQgPSB0cnVlOwogICAgICAgICB9CisgICAgICAgIHJlbGVhc2VRdWV1ZWRGcmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKCFtRnJhbWVzQmVpbmdFbmNvZGVkLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPQorICAgICAgICAgICAgICAgIG1GcmFtZUNvbXBsZXRlQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzICogMTAwMExMICsgQ0FNRVJBX1NPVVJDRV9USU1FT1VUX05TKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJUaW1lZCBvdXQgd2FpdGluZyBmb3Igb3V0c3RhbmRpbmcgZnJhbWVzIGJlaW5nIGVuY29kZWQ6ICV6dSIsCisgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNCZWluZ0VuY29kZWQuc2l6ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdG9wQ2FtZXJhUmVjb3JkaW5nKCk7CisgICAgICAgIGlmIChpc1Rva2VuVmFsaWQpIHsKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Db2xsZWN0U3RhdHMpIHsKKyAgICAgICAgICAgIEFMT0dJKCJGcmFtZXMgcmVjZWl2ZWQvZW5jb2RlZC9kcm9wcGVkOiAlZC8lZC8lZCBpbiAlIiBQUklkNjQgIiB1cyIsCisgICAgICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNSZWNlaXZlZCwgbU51bUZyYW1lc0VuY29kZWQsIG1OdW1GcmFtZXNEcm9wcGVkLAorICAgICAgICAgICAgICAgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMgLSBtRmlyc3RGcmFtZVRpbWVVcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU51bUdsaXRjaGVzID4gMCkgeworICAgICAgICAgICAgQUxPR1coIiVkIGxvbmcgZGVsYXlzIGJldHdlZW4gbmVpZ2hib3JpbmcgdmlkZW8gZnJhbWVzIiwgbU51bUdsaXRjaGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIENIRUNLX0VRKG1OdW1GcmFtZXNSZWNlaXZlZCwgbU51bUZyYW1lc0VuY29kZWQgKyBtTnVtRnJhbWVzRHJvcHBlZCk7CiAgICAgfQotICAgIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKKwogICAgIHJlbGVhc2VDYW1lcmEoKTsKLSAgICBpZiAoaXNUb2tlblZhbGlkKSB7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotICAgIH0KIAotICAgIGlmIChtQ29sbGVjdFN0YXRzKSB7Ci0gICAgICAgIEFMT0dJKCJGcmFtZXMgcmVjZWl2ZWQvZW5jb2RlZC9kcm9wcGVkOiAlZC8lZC8lZCBpbiAlbGxkIHVzIiwKLSAgICAgICAgICAgICAgICBtTnVtRnJhbWVzUmVjZWl2ZWQsIG1OdW1GcmFtZXNFbmNvZGVkLCBtTnVtRnJhbWVzRHJvcHBlZCwKLSAgICAgICAgICAgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMgLSBtRmlyc3RGcmFtZVRpbWVVcyk7Ci0gICAgfQotCi0gICAgaWYgKG1OdW1HbGl0Y2hlcyA+IDApIHsKLSAgICAgICAgQUxPR1coIiVkIGxvbmcgZGVsYXlzIGJldHdlZW4gbmVpZ2hib3JpbmcgdmlkZW8gZnJhbWVzIiwgbU51bUdsaXRjaGVzKTsKLSAgICB9Ci0KLSAgICBDSEVDS19FUShtTnVtRnJhbWVzUmVjZWl2ZWQsIG1OdW1GcmFtZXNFbmNvZGVkICsgbU51bUZyYW1lc0Ryb3BwZWQpOwogICAgIEFMT0dEKCJyZXNldDogWCIpOwogICAgIHJldHVybiBPSzsKIH0KQEAgLTc4OSw3ICs4MjgsNyBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2FtZXJhIHJlY29yZGluZyBwcm94eSBpcyBnb25lIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVygiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGluY29taW5nIGNhbWVyYSB2aWRlbyBmcmFtZXM6ICVsbGQgdXMiLAorICAgICAgICAgICAgICAgIEFMT0dXKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgaW5jb21pbmcgY2FtZXJhIHZpZGVvIGZyYW1lczogJSIgUFJJZDY0ICIgdXMiLAogICAgICAgICAgICAgICAgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC04MTIsMTAgKzg1MSwxMCBAQAogCiB2b2lkIENhbWVyYVNvdXJjZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsCiAgICAgICAgIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpIHsKLSAgICBBTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wOiB0aW1lc3RhbXAgJWxsZCB1cyIsIHRpbWVzdGFtcFVzKTsKKyAgICBBTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wOiB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgdXMiLCB0aW1lc3RhbXBVcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAoIW1TdGFydGVkIHx8IChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCAmJiB0aW1lc3RhbXBVcyA8IG1TdGFydFRpbWVVcykpIHsKLSAgICAgICAgQUxPR1YoIkRyb3AgZnJhbWUgYXQgJWxsZC8lbGxkIHVzIiwgdGltZXN0YW1wVXMsIG1TdGFydFRpbWVVcyk7CisgICAgICAgIEFMT0dWKCJEcm9wIGZyYW1lIGF0ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCAiIHVzIiwgdGltZXN0YW1wVXMsIG1TdGFydFRpbWVVcyk7CiAgICAgICAgIHJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZShkYXRhKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTg1NCw3ICs4OTMsNyBAQAogICAgIG1GcmFtZXNSZWNlaXZlZC5wdXNoX2JhY2soZGF0YSk7CiAgICAgaW50NjRfdCB0aW1lVXMgPSBtU3RhcnRUaW1lVXMgKyAodGltZXN0YW1wVXMgLSBtRmlyc3RGcmFtZVRpbWVVcyk7CiAgICAgbUZyYW1lVGltZXMucHVzaF9iYWNrKHRpbWVVcyk7Ci0gICAgQUxPR1YoImluaXRpYWwgZGVsYXk6ICVsbGQsIGN1cnJlbnQgdGltZSBzdGFtcDogJWxsZCIsCisgICAgQUxPR1YoImluaXRpYWwgZGVsYXk6ICUiIFBSSWQ2NCAiLCBjdXJyZW50IHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwKICAgICAgICAgbVN0YXJ0VGltZVVzLCB0aW1lVXMpOwogICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCmluZGV4IDU3NzIzMTYuLjBhY2Q5ZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU291cmNlVGltZUxhcHNlIgogCkBAIC03OSwxMyArODEsMTQgQEAKICAgICAgIG1Ta2lwQ3VycmVudEZyYW1lKGZhbHNlKSB7CiAKICAgICBtVGltZUJldHdlZW5GcmFtZUNhcHR1cmVVcyA9IHRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlVXM7Ci0gICAgQUxPR0QoInN0YXJ0aW5nIHRpbWUgbGFwc2UgbW9kZTogJWxsZCB1cyIsCisgICAgQUxPR0QoInN0YXJ0aW5nIHRpbWUgbGFwc2UgbW9kZTogJSIgUFJJZDY0ICIgdXMiLAogICAgICAgICBtVGltZUJldHdlZW5GcmFtZUNhcHR1cmVVcyk7CiAKICAgICBtVmlkZW9XaWR0aCA9IHZpZGVvU2l6ZS53aWR0aDsKICAgICBtVmlkZW9IZWlnaHQgPSB2aWRlb1NpemUuaGVpZ2h0OwogCi0gICAgaWYgKCF0cnlTZXR0aW5nVmlkZW9TaXplKHZpZGVvU2l6ZS53aWR0aCwgdmlkZW9TaXplLmhlaWdodCkpIHsKKyAgICBpZiAoT0sgPT0gbUluaXRDaGVjayAmJiAhdHJ5U2V0dGluZ1ZpZGVvU2l6ZSh2aWRlb1NpemUud2lkdGgsIHZpZGVvU2l6ZS5oZWlnaHQpKSB7CisgICAgICAgIHJlbGVhc2VDYW1lcmEoKTsKICAgICAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CiAgICAgfQogCkBAIC0xMzQsNyArMTM3LDcgQEAKICAgICB9CiAKICAgICBib29sIHZpZGVvU2l6ZVN1cHBvcnRlZCA9IGZhbHNlOwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdXBwb3J0ZWRTaXplcy5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VwcG9ydGVkU2l6ZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaW50MzJfdCBwaWN0dXJlV2lkdGggPSBzdXBwb3J0ZWRTaXplc1tpXS53aWR0aDsKICAgICAgICAgaW50MzJfdCBwaWN0dXJlSGVpZ2h0ID0gc3VwcG9ydGVkU2l6ZXNbaV0uaGVpZ2h0OwogCkBAIC0yMzEsNyArMjM0LDcgQEAKICAgICByZXR1cm4gbmV3TWVtb3J5OwogfQogCi1ib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IHRpbWVzdGFtcFVzKSB7Citib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IC8qIHRpbWVzdGFtcFVzICovKSB7CiAgICAgQUxPR1YoInNraXBDdXJyZW50RnJhbWUiKTsKICAgICBpZiAobVNraXBDdXJyZW50RnJhbWUpIHsKICAgICAgICAgbVNraXBDdXJyZW50RnJhbWUgPSBmYWxzZTsKQEAgLTI2NSw3ICsyNjgsNyBAQAogCiAgICAgICAgICAgICAvLyBSZWFsbHkgbWFrZSBzdXJlIHRoYXQgdGhpcyB2aWRlbyByZWNvcmRpbmcgZnJhbWUgd2lsbCBub3QgYmUgZHJvcHBlZC4KICAgICAgICAgICAgIGlmICgqdGltZXN0YW1wVXMgPCBtU3RhcnRUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgic2V0IHRpbWVzdGFtcFVzIHRvIHN0YXJ0IHRpbWUgc3RhbXAgJWxsZCB1cyIsIG1TdGFydFRpbWVVcyk7CisgICAgICAgICAgICAgICAgQUxPR0koInNldCB0aW1lc3RhbXBVcyB0byBzdGFydCB0aW1lIHN0YW1wICUiIFBSSWQ2NCAiIHVzIiwgbVN0YXJ0VGltZVVzKTsKICAgICAgICAgICAgICAgICAqdGltZXN0YW1wVXMgPSBtU3RhcnRUaW1lVXM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DbG9ja0VzdGltYXRvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DbG9ja0VzdGltYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkMWU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmNwcApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbG9ja0VzdGltYXRvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbG9ja0VzdGltYXRvci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6V2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3IoCisgICAgICAgIHNpemVfdCBoZWFkTGVuZ3RoLCBkb3VibGUgaGVhZEZhY3Rvciwgc2l6ZV90IG1haW5MZW5ndGgsIGRvdWJsZSB0YWlsRmFjdG9yKQorICAgIDogbUhlYWRGYWN0b3JJbnYoMS4gLyBoZWFkRmFjdG9yKSwKKyAgICAgIG1UYWlsRmFjdG9yKHRhaWxGYWN0b3IpLAorICAgICAgbUhpc3RvcnlMZW5ndGgobWFpbkxlbmd0aCArIGhlYWRMZW5ndGgpLAorICAgICAgbUhlYWRMZW5ndGgoaGVhZExlbmd0aCkgeworICAgIHJlc2V0KCk7CisgICAgbVhIaXN0b3J5LnJlc2l6ZShtSGlzdG9yeUxlbmd0aCk7CisgICAgbVlIaXN0b3J5LnJlc2l6ZShtSGlzdG9yeUxlbmd0aCk7CisgICAgbUZpcnN0V2VpZ2h0ID0gcG93KGhlYWRGYWN0b3IsIG1IZWFkTGVuZ3RoKTsKK30KKworV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OkxpbmVhckZpdDo6TGluZWFyRml0KCkgeworICAgIHJlc2V0KCk7Cit9CisKK3ZvaWQgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OkxpbmVhckZpdDo6cmVzZXQoKSB7CisgICAgbVggPSBtWFggPSBtWSA9IG1ZWSA9IG1YWSA9IG1XID0gMC47Cit9CisKK2RvdWJsZSBXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6TGluZWFyRml0OjpzaXplKCkgY29uc3QgeworICAgIGRvdWJsZSBzID0gbVcgKiBtVyArIG1YICogbVggKyBtWSAqIG1ZICsgbVhYICogbVhYICsgbVhZICogbVhZICsgbVlZICogbVlZOworICAgIGlmIChzID4gMWU3MikgeworICAgICAgICAvLyAxZTcyIGNvcnJlc3BvbmRzIHRvIGNsb2NrIG1vbm90b25pYyB0aW1lIG9mIGFib3V0IDggeWVhcnMKKyAgICAgICAgQUxPR1coImVzdGltYXRvciBpcyBvdmVyZmxvd2luZzogdz0lZyB4PSVnIHk9JWcgeHg9JWcgeHk9JWcgeXk9JWciLAorICAgICAgICAgICAgICBtVywgbVgsIG1ZLCBtWFgsIG1YWSwgbVlZKTsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK3ZvaWQgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OkxpbmVhckZpdDo6YWRkKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHcpIHsKKyAgICBtVyArPSB3OworICAgIG1YICs9IHcgKiB4OworICAgIG1ZICs9IHcgKiB5OworICAgIG1YWCArPSB3ICogeCAqIHg7CisgICAgbVhZICs9IHcgKiB4ICogeTsKKyAgICBtWVkgKz0gdyAqIHkgKiB5OworfQorCit2b2lkIFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yOjpMaW5lYXJGaXQ6OmNvbWJpbmUoY29uc3QgTGluZWFyRml0ICZsZikgeworICAgIG1XICs9IGxmLm1XOworICAgIG1YICs9IGxmLm1YOworICAgIG1ZICs9IGxmLm1ZOworICAgIG1YWCArPSBsZi5tWFg7CisgICAgbVhZICs9IGxmLm1YWTsKKyAgICBtWVkgKz0gbGYubVlZOworfQorCit2b2lkIFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yOjpMaW5lYXJGaXQ6OnNjYWxlKGRvdWJsZSB3KSB7CisgICAgbVcgKj0gdzsKKyAgICBtWCAqPSB3OworICAgIG1ZICo9IHc7CisgICAgbVhYICo9IHc7CisgICAgbVhZICo9IHc7CisgICAgbVlZICo9IHc7Cit9CisKK2RvdWJsZSBXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6TGluZWFyRml0OjppbnRlcnBvbGF0ZShkb3VibGUgeCkgeworICAgIGRvdWJsZSBkaXYgPSBtVyAqIG1YWCAtIG1YICogbVg7CisgICAgaWYgKGZhYnMoZGl2KSA8IDFlLTUgKiBtVyAqIG1XKSB7CisgICAgICAgIC8vIHRoaXMgb25seSBzaG91bGQgaGFwcGVuIG9uIHRoZSBmaXJzdCB2YWx1ZQorICAgICAgICByZXR1cm4geDsKKyAgICAgICAgLy8gYXNzdW1pbmcgYSA9IDEsIHdlIGNvdWxkIGFsc28gcmV0dXJuIHggKyAobVkgLSBtWCkgLyBtVzsKKyAgICB9CisgICAgZG91YmxlIGFfZGl2ID0gKG1XICogbVhZIC0gbVggKiBtWSk7CisgICAgZG91YmxlIGJfZGl2ID0gKG1YWCAqIG1ZIC0gbVggKiBtWFkpOworICAgIEFMT0dWKCJhPSUuNGcgYj0lLjRnIGluPSVnIG91dD0lZyIsCisgICAgICAgICAgICBhX2RpdiAvIGRpdiwgYl9kaXYgLyBkaXYsIHgsIChhX2RpdiAqIHggKyBiX2RpdikgLyBkaXYpOworICAgIHJldHVybiAoYV9kaXYgKiB4ICsgYl9kaXYpIC8gZGl2OworfQorCitkb3VibGUgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OmVzdGltYXRlKGRvdWJsZSB4LCBkb3VibGUgeSkgeworICAgIC8qCisgICAgICogVE9ETzogV2UgY291bGQgdXBkYXRlIHRoZSBoZWFkIGJ5IGFkZGluZyB0aGUgbmV3IHNhbXBsZSB0byBpdAorICAgICAqIGFuZCBhbXBsaWZ5aW5nIGl0LCBidXQgdGhpcyBhcHByb2FjaCBjYW4gbGVhZCB0byB1bmJvdW5kZWQKKyAgICAgKiBlcnJvci4gSW5zdGVhZCwgd2UgcmVjYWxjdWxhdGUgdGhlIGhlYWQgYXQgZWFjaCBzdGVwLCB3aGljaAorICAgICAqIGlzIGNvbXB1dGF0aW9uYWxseSBtb3JlIGV4cGVuc2l2ZS4gV2UgY291bGQgYmFsYW5jZSB0aGUgdHdvCisgICAgICogbWV0aG9kcyBieSByZWNhbGN1bGF0aW5nIGp1c3QgYmVmb3JlIHRoZSBlcnJvciBiZWNvbWVzCisgICAgICogc2lnbmlmaWNhbnQuCisgICAgICovCisgICAgY29uc3QgYm9vbCB1cGRhdGVfaGVhZCA9IGZhbHNlOworICAgIGlmICh1cGRhdGVfaGVhZCkgeworICAgICAgICAvLyBhZGQgbmV3IHNhbXBsZSB0byB0aGUgaGVhZAorICAgICAgICBtSGVhZC5zY2FsZShtSGVhZEZhY3Rvckludik7IC8vIGFtcGxpZnkgaGVhZAorICAgICAgICBtSGVhZC5hZGQoeCwgeSwgbUZpcnN0V2VpZ2h0KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRSSUNLWTogcGxhY2UgZWxlbWVudHMgaW50byB0aGUgY2lyY3VsYXIgYnVmZmVyIGF0IGRlY3JlYXNpbmcKKyAgICAgKiBpbmRpY2VzLCBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgcGFzdCBlbGVtZW50cyBieSBhZGRpdGlvbgorICAgICAqICh0aGVyZWJ5IGF2b2lkaW5nIHBvdGVudGlhbGx5IG5lZ2F0aXZlIGluZGljZXMuKQorICAgICAqLworICAgIGlmIChtTnVtU2FtcGxlcyA+PSBtSGVhZExlbmd0aCkgeworICAgICAgICAvLyBtb3ZlIGxhc3QgaGVhZCBzYW1wbGUgZnJvbSBoZWFkIHRvIHRoZSBtYWluIHdpbmRvdworICAgICAgICBzaXplX3QgbGFzdEhlYWRJeCA9IChtU2FtcGxlSXggKyBtSGVhZExlbmd0aCkgJSBtSGlzdG9yeUxlbmd0aDsKKyAgICAgICAgaWYgKHVwZGF0ZV9oZWFkKSB7CisgICAgICAgICAgICBtSGVhZC5hZGQobVhIaXN0b3J5W2xhc3RIZWFkSXhdLCBtWUhpc3RvcnlbbGFzdEhlYWRJeF0sIC0xLik7IC8vIHJlbW92ZQorICAgICAgICB9CisgICAgICAgIG1NYWluLmFkZChtWEhpc3RvcnlbbGFzdEhlYWRJeF0sIG1ZSGlzdG9yeVtsYXN0SGVhZEl4XSwgMS4pOworICAgICAgICBpZiAobU51bVNhbXBsZXMgPj0gbUhpc3RvcnlMZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIG1vdmUgbGFzdCBtYWluIHNhbXBsZSBmcm9tIG1haW4gd2luZG93IHRvIHRhaWwKKyAgICAgICAgICAgIG1NYWluLmFkZChtWEhpc3RvcnlbbVNhbXBsZUl4XSwgbVlIaXN0b3J5W21TYW1wbGVJeF0sIC0xLik7IC8vIHJlbW92ZQorICAgICAgICAgICAgbVRhaWwuYWRkKG1YSGlzdG9yeVttU2FtcGxlSXhdLCBtWUhpc3RvcnlbbVNhbXBsZUl4XSwgMS4pOworICAgICAgICAgICAgbVRhaWwuc2NhbGUobVRhaWxGYWN0b3IpOyAvLyBhdHRlbnVhdGUgdGFpbAorICAgICAgICB9CisgICAgfQorCisgICAgbVhIaXN0b3J5LmVkaXRJdGVtQXQobVNhbXBsZUl4KSA9IHg7CisgICAgbVlIaXN0b3J5LmVkaXRJdGVtQXQobVNhbXBsZUl4KSA9IHk7CisgICAgaWYgKG1OdW1TYW1wbGVzIDwgbUhpc3RvcnlMZW5ndGgpIHsKKyAgICAgICAgKyttTnVtU2FtcGxlczsKKyAgICB9CisKKyAgICAvLyByZWNhbGN1bGF0ZSBoZWFkIHVubGVzcyB3ZSB3ZXJlIHVzaW5nIHRoZSB1cGRhdGUgbWV0aG9kCisgICAgaWYgKCF1cGRhdGVfaGVhZCkgeworICAgICAgICBtSGVhZC5yZXNldCgpOworICAgICAgICBkb3VibGUgdyA9IG1GaXJzdFdlaWdodDsKKyAgICAgICAgZm9yIChzaXplX3QgaGVhZEl4ID0gMDsgaGVhZEl4IDwgbUhlYWRMZW5ndGggJiYgaGVhZEl4IDwgbU51bVNhbXBsZXM7ICsraGVhZEl4KSB7CisgICAgICAgICAgICBzaXplX3QgaXggPSAobVNhbXBsZUl4ICsgaGVhZEl4KSAlIG1IaXN0b3J5TGVuZ3RoOworICAgICAgICAgICAgbUhlYWQuYWRkKG1YSGlzdG9yeVtpeF0sIG1ZSGlzdG9yeVtpeF0sIHcpOworICAgICAgICAgICAgdyAqPSBtSGVhZEZhY3RvckludjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU2FtcGxlSXggPiAwKSB7CisgICAgICAgIC0tbVNhbXBsZUl4OworICAgIH0gZWxzZSB7CisgICAgICAgIG1TYW1wbGVJeCA9IG1IaXN0b3J5TGVuZ3RoIC0gMTsKKyAgICB9CisKKyAgICAvLyByZXR1cm4gZXN0aW1hdGlvbiByZXN1bHQKKyAgICBMaW5lYXJGaXQgdG90YWw7CisgICAgdG90YWwuY29tYmluZShtSGVhZCk7CisgICAgdG90YWwuY29tYmluZShtTWFpbik7CisgICAgdG90YWwuY29tYmluZShtVGFpbCk7CisgICAgcmV0dXJuIHRvdGFsLmludGVycG9sYXRlKHgpOworfQorCit2b2lkIFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yOjpyZXNldCgpIHsKKyAgICBtSGVhZC5yZXNldCgpOworICAgIG1NYWluLnJlc2V0KCk7CisgICAgbVRhaWwucmVzZXQoKTsKKyAgICBtTnVtU2FtcGxlcyA9IDA7CisgICAgbVNhbXBsZUl4ID0gbUhpc3RvcnlMZW5ndGggLSAxOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Db2RlY0Jhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MjlkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Db2RlY0Jhc2UuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjQmFzZSIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDb2RlY0Jhc2U6OkNvZGVjQmFzZSgpIHsKK30KKworQ29kZWNCYXNlOjp+Q29kZWNCYXNlKCkgeworfQorCitDb2RlY0Jhc2U6OlBvcnREZXNjcmlwdGlvbjo6UG9ydERlc2NyaXB0aW9uKCkgeworfQorCitDb2RlY0Jhc2U6OlBvcnREZXNjcmlwdGlvbjo6flBvcnREZXNjcmlwdGlvbigpIHsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKaW5kZXggNTUzMWVhNzQuLjY1YWQwZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCkBAIC0xMywxMyArMTMsMTEgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRhdGFTb3VyY2UiCiAKICNpbmNsdWRlICJpbmNsdWRlL0FNUkV4dHJhY3Rvci5oIgogCi0jaWYgQ0hST01JVU1fQVZBSUxBQkxFCi0jaW5jbHVkZSAiaW5jbHVkZS9jaHJvbWl1bV9odHRwX3N0dWIuaCIKLSNlbmRpZgotCiAjaW5jbHVkZSAiaW5jbHVkZS9BQUNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL0RSTUV4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvRkxBQ0V4dHJhY3Rvci5oIgpAQCAtMzUsMTAgKzMzLDE1IEBACiAKICNpbmNsdWRlICJtYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KQEAgLTE4MCw3ICsxODMsMTUgQEAKIAogLy8gc3RhdGljCiBzcDxEYXRhU291cmNlPiBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKAotICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgIFN0cmluZzggKmNvbnRlbnRUeXBlLAorICAgICAgICBIVFRQQmFzZSAqaHR0cFNvdXJjZSkgeworICAgIGlmIChjb250ZW50VHlwZSAhPSBOVUxMKSB7CisgICAgICAgICpjb250ZW50VHlwZSA9ICIiOworICAgIH0KKwogICAgIGJvb2wgaXNXaWRldmluZSA9ICFzdHJuY2FzZWNtcCgid2lkZXZpbmU6Ly8iLCB1cmksIDExKTsKIAogICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZTsKQEAgLTE4OSw3ICsyMDAsMTkgQEAKICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykKICAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpCiAgICAgICAgICAgICB8fCBpc1dpZGV2aW5lKSB7Ci0gICAgICAgIHNwPEhUVFBCYXNlPiBodHRwU291cmNlID0gSFRUUEJhc2U6OkNyZWF0ZSgpOworICAgICAgICBpZiAoaHR0cFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgaHR0cCBzZXJ2aWNlISIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHR0cFNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gY29ubiA9IGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChjb25uID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1ha2UgaHR0cCBjb25uZWN0aW9uIGZyb20gaHR0cCBzZXJ2aWNlISIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHR0cFNvdXJjZSA9IG5ldyBNZWRpYUhUVFAoY29ubik7CisgICAgICAgIH0KIAogICAgICAgICBTdHJpbmc4IHRtcDsKICAgICAgICAgaWYgKGlzV2lkZXZpbmUpIHsKQEAgLTE5OSwzMiArMjIyLDM4IEBACiAgICAgICAgICAgICB1cmkgPSB0bXAuc3RyaW5nKCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaHR0cFNvdXJjZS0+Y29ubmVjdCh1cmksIGhlYWRlcnMpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggY2FjaGVDb25maWc7CisgICAgICAgIGJvb2wgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyazsKKyAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnM7CisgICAgICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG5vbkNhY2hlU3BlY2lmaWNIZWFkZXJzID0gKmhlYWRlcnM7CisgICAgICAgICAgICBOdUNhY2hlZFNvdXJjZTI6OlJlbW92ZUNhY2hlU3BlY2lmaWNIZWFkZXJzKAorICAgICAgICAgICAgICAgICAgICAmbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICZjYWNoZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgJmRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmspOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGh0dHBTb3VyY2UtPmNvbm5lY3QodXJpLCAmbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnMpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbm5lY3QgaHR0cCBzb3VyY2UhIik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghaXNXaWRldmluZSkgewotICAgICAgICAgICAgU3RyaW5nOCBjYWNoZUNvbmZpZzsKLSAgICAgICAgICAgIGJvb2wgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyazsKLSAgICAgICAgICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBjb3B5ID0gKmhlYWRlcnM7Ci0gICAgICAgICAgICAgICAgTnVDYWNoZWRTb3VyY2UyOjpSZW1vdmVDYWNoZVNwZWNpZmljSGVhZGVycygKLSAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5LCAmY2FjaGVDb25maWcsICZkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKTsKKyAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKmNvbnRlbnRUeXBlID0gaHR0cFNvdXJjZS0+Z2V0TUlNRVR5cGUoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc291cmNlID0gTnVDYWNoZWRTb3VyY2UyOjpDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgIGh0dHBTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgIGNhY2hlQ29uZmlnLmlzRW1wdHkoKSA/IE5VTEwgOiBjYWNoZUNvbmZpZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlQ29uZmlnLmlzRW1wdHkoKSA/IE5VTEwgOiBjYWNoZUNvbmZpZy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0aGF0IHByZWZldGNoaW5nLCBjYWNoaW5nLCBkYXRhc291cmNlIHdyYXBwZXIKICAgICAgICAgICAgIC8vIGluIHRoZSB3aWRldmluZTovLyBjYXNlLgogICAgICAgICAgICAgc291cmNlID0gaHR0cFNvdXJjZTsKICAgICAgICAgfQotCi0jIGlmIENIUk9NSVVNX0FWQUlMQUJMRQogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJkYXRhOiIsIHVyaSwgNSkpIHsKLSAgICAgICAgc291cmNlID0gY3JlYXRlRGF0YVVyaVNvdXJjZSh1cmkpOwotI2VuZGlmCisgICAgICAgIHNvdXJjZSA9IERhdGFVUklTb3VyY2U6OkNyZWF0ZSh1cmkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEFzc3VtZSBpdCdzIGEgZmlsZW5hbWUuCiAgICAgICAgIHNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVyaSk7CkBAIC0yMzcsNiArMjY2LDE5IEBACiAgICAgcmV0dXJuIHNvdXJjZTsKIH0KIAorc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZTo6Q3JlYXRlTWVkaWFIVFRQKGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpIHsKKyAgICBpZiAoaHR0cFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gY29ubiA9IGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKTsKKyAgICBpZiAoY29ubiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFIVFRQKGNvbm4pOworICAgIH0KK30KKwogU3RyaW5nOCBEYXRhU291cmNlOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMzkzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmNwcApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworc3A8RGF0YVVSSVNvdXJjZT4gRGF0YVVSSVNvdXJjZTo6Q3JlYXRlKGNvbnN0IGNoYXIgKnVyaSkgeworICAgIGlmIChzdHJuY2FzZWNtcCgiZGF0YToiLCB1cmksIDUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNoYXIgKmNvbW1hUG9zID0gc3RycmNocih1cmksICcsJyk7CisKKyAgICBpZiAoY29tbWFQb3MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisKKyAgICBBU3RyaW5nIHRtcCgmdXJpWzVdLCBjb21tYVBvcyAtICZ1cmlbNV0pOworCisgICAgaWYgKHRtcC5lbmRzV2l0aCgiO2Jhc2U2NCIpKSB7CisgICAgICAgIEFTdHJpbmcgZW5jb2RlZChjb21tYVBvcyArIDEpOworCisgICAgICAgIC8vIFN0cmlwIENSIGFuZCBMRi4uLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gZW5jb2RlZC5zaXplKCk7IGktLSA+IDA7KSB7CisgICAgICAgICAgICBpZiAoZW5jb2RlZC5jX3N0cigpW2ldID09ICdccicgfHwgZW5jb2RlZC5jX3N0cigpW2ldID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICBlbmNvZGVkLmVyYXNlKGksIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyID0gZGVjb2RlQmFzZTY0KGVuY29kZWQpOworCisgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBjb250ZW50IGZvdW5kLiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworI2lmIDAKKyAgICAgICAgc2l6ZV90IGRhdGFMZW4gPSBzdHJsZW4odXJpKSAtIHRtcC5zaXplKCkgLSA2OworICAgICAgICBidWZmZXIgPSBuZXcgQUJ1ZmZlcihkYXRhTGVuKTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBjb21tYVBvcyArIDEsIGRhdGFMZW4pOworCisgICAgICAgIC8vIHVuZXNjYXBlCisjZWxzZQorICAgICAgICAvLyBNZWRpYVBsYXllciBkb2Vzbid0IGNhcmUgZm9yIHRoaXMgcmlnaHQgbm93IGFzIHdlIGRvbid0CisgICAgICAgIC8vIHBsYXkgYW55IHRleHQtYmFzZWQgbWVkaWEuCisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgfQorCisgICAgLy8gV2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgY2hhcnNldCBvciBtaW1lIHR5cGUuCisKKyAgICByZXR1cm4gbmV3IERhdGFVUklTb3VyY2UoYnVmZmVyKTsKK30KKworRGF0YVVSSVNvdXJjZTo6RGF0YVVSSVNvdXJjZShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKQorICAgIDogbUJ1ZmZlcihidWZmZXIpIHsKK30KKworRGF0YVVSSVNvdXJjZTo6fkRhdGFVUklTb3VyY2UoKSB7Cit9CisKK3N0YXR1c190IERhdGFVUklTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NzaXplX3QgRGF0YVVSSVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmICgob2Zmc2V0IDwgMCkgfHwgKG9mZnNldCA+PSAob2ZmNjRfdCltQnVmZmVyLT5zaXplKCkpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHNpemVfdCBjb3B5ID0gbUJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0OworICAgIGlmIChjb3B5ID4gc2l6ZSkgeworICAgICAgICBjb3B5ID0gc2l6ZTsKKyAgICB9CisKKyAgICBtZW1jcHkoZGF0YSwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBjb3B5KTsKKworICAgIHJldHVybiBjb3B5OworfQorCitzdGF0dXNfdCBEYXRhVVJJU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKKworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRVNEUy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9FU0RTLmNwcAppbmRleCBjNzZiYzRhLi44ZmJiNTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9FU0RTLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9FU0RTLmNwcApAQCAtOTEsNyArOTEsNyBAQAogICAgIH0KICAgICB3aGlsZSAobW9yZSk7CiAKLSAgICBBTE9HVigidGFnPTB4JTAyeCBkYXRhX3NpemU9JWQiLCAqdGFnLCAqZGF0YV9zaXplKTsKKyAgICBBTE9HVigidGFnPTB4JTAyeCBkYXRhX3NpemU9JXp1IiwgKnRhZywgKmRhdGFfc2l6ZSk7CiAKICAgICBpZiAoKmRhdGFfc2l6ZSA+IHNpemUpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZMQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAKaW5kZXggMDk4ZmNmOS4uZmE3MjUxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAKQEAgLTIwOCw1NSArMjA4LDU1IEBACiAvLyB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlciBsaXN0LCBidXQgZGlzY2FyZCByZWR1bmRhbnQgaW5mb3JtYXRpb24uCiAKIEZMQUNfX1N0cmVhbURlY29kZXJSZWFkU3RhdHVzIEZMQUNQYXJzZXI6OnJlYWRfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsIEZMQUNfX2J5dGUgYnVmZmVyW10sCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLCBGTEFDX19ieXRlIGJ1ZmZlcltdLAogICAgICAgICBzaXplX3QgKmJ5dGVzLCB2b2lkICpjbGllbnRfZGF0YSkKIHsKICAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+cmVhZENhbGxiYWNrKGJ1ZmZlciwgYnl0ZXMpOwogfQogCiBGTEFDX19TdHJlYW1EZWNvZGVyU2Vla1N0YXR1cyBGTEFDUGFyc2VyOjpzZWVrX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywKICAgICAgICAgRkxBQ19fdWludDY0IGFic29sdXRlX2J5dGVfb2Zmc2V0LCB2b2lkICpjbGllbnRfZGF0YSkKIHsKICAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+c2Vla0NhbGxiYWNrKGFic29sdXRlX2J5dGVfb2Zmc2V0KTsKIH0KIAogRkxBQ19fU3RyZWFtRGVjb2RlclRlbGxTdGF0dXMgRkxBQ1BhcnNlcjo6dGVsbF9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCiAgICAgICAgIEZMQUNfX3VpbnQ2NCAqYWJzb2x1dGVfYnl0ZV9vZmZzZXQsIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT50ZWxsQ2FsbGJhY2soYWJzb2x1dGVfYnl0ZV9vZmZzZXQpOwogfQogCiBGTEFDX19TdHJlYW1EZWNvZGVyTGVuZ3RoU3RhdHVzIEZMQUNQYXJzZXI6Omxlbmd0aF9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCiAgICAgICAgIEZMQUNfX3VpbnQ2NCAqc3RyZWFtX2xlbmd0aCwgdm9pZCAqY2xpZW50X2RhdGEpCiB7CiAgICAgcmV0dXJuICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPmxlbmd0aENhbGxiYWNrKHN0cmVhbV9sZW5ndGgpOwogfQogCiBGTEFDX19ib29sIEZMQUNQYXJzZXI6OmVvZl9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2Rlciwgdm9pZCAqY2xpZW50X2RhdGEpCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLCB2b2lkICpjbGllbnRfZGF0YSkKIHsKICAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+ZW9mQ2FsbGJhY2soKTsKIH0KIAogRkxBQ19fU3RyZWFtRGVjb2RlcldyaXRlU3RhdHVzIEZMQUNQYXJzZXI6OndyaXRlX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLCBjb25zdCBGTEFDX19GcmFtZSAqZnJhbWUsCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLCBjb25zdCBGTEFDX19GcmFtZSAqZnJhbWUsCiAgICAgICAgIGNvbnN0IEZMQUNfX2ludDMyICogY29uc3QgYnVmZmVyW10sIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT53cml0ZUNhbGxiYWNrKGZyYW1lLCBidWZmZXIpOwogfQogCiB2b2lkIEZMQUNQYXJzZXI6Om1ldGFkYXRhX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywKICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKm1ldGFkYXRhLCB2b2lkICpjbGllbnRfZGF0YSkKIHsKICAgICAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5tZXRhZGF0YUNhbGxiYWNrKG1ldGFkYXRhKTsKIH0KIAogdm9pZCBGTEFDUGFyc2VyOjplcnJvcl9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCiAgICAgICAgIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBzdGF0dXMsIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPmVycm9yQ2FsbGJhY2soc3RhdHVzKTsKQEAgLTM4MCwxNSArMzgwLDIxIEBACiAvLyBDb3B5IHNhbXBsZXMgZnJvbSBGTEFDIG5hdGl2ZSAzMi1iaXQgbm9uLWludGVybGVhdmVkIHRvIDE2LWJpdCBpbnRlcmxlYXZlZC4KIC8vIFRoZXNlIGFyZSBjYW5kaWRhdGVzIGZvciBvcHRpbWl6YXRpb24gaWYgbmVlZGVkLgogCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzgoc2hvcnQgKmRzdCwgY29uc3QgaW50ICpjb25zdCAqc3JjLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworc3RhdGljIHZvaWQgY29weU1vbm84KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW84KHNob3J0ICpkc3QsIGNvbnN0IGludCAqY29uc3QgKnNyYywgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKLXsKK3N0YXRpYyB2b2lkIGNvcHlTdGVyZW84KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKICAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldIDw8IDg7CkBAIC00MDQsMTUgKzQxMCwyMSBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29weU1vbm8xNihzaG9ydCAqZHN0LCBjb25zdCBpbnQgKmNvbnN0ICpzcmMsIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CitzdGF0aWMgdm9pZCBjb3B5TW9ubzE2KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMTYoc2hvcnQgKmRzdCwgY29uc3QgaW50ICpjb25zdCAqc3JjLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworc3RhdGljIHZvaWQgY29weVN0ZXJlbzE2KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07CiAgICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXTsKQEAgLTQzMCwxNSArNDQyLDIxIEBACiAKIC8vIDI0LWJpdCB2ZXJzaW9ucyBzaG91bGQgZG8gZGl0aGVyaW5nIG9yIG5vaXNlLXNoYXBpbmcsIGhlcmUgb3IgaW4gQXVkaW9GbGluZ2VyCiAKLXN0YXRpYyB2b2lkIGNvcHlNb25vMjQoc2hvcnQgKmRzdCwgY29uc3QgaW50ICpjb25zdCAqc3JjLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworc3RhdGljIHZvaWQgY29weU1vbm8yNCgKKyAgICAgICAgc2hvcnQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAorICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKKyAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMjQoc2hvcnQgKmRzdCwgY29uc3QgaW50ICpjb25zdCAqc3JjLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworc3RhdGljIHZvaWQgY29weVN0ZXJlbzI0KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKICAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldID4+IDg7CkBAIC00NTQsOCArNDcyLDExIEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5VHJlc3Bhc3Moc2hvcnQgKmRzdCwgY29uc3QgaW50ICpjb25zdCAqc3JjLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworc3RhdGljIHZvaWQgY29weVRyZXNwYXNzKAorICAgICAgICBzaG9ydCAqIC8qIGRzdCAqLywKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqIC8qIHNyYyAqLywKKyAgICAgICAgdW5zaWduZWQgLyogblNhbXBsZXMgKi8sCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewogICAgIFRSRVNQQVNTKCk7CiB9CiAKQEAgLTcwMCw3ICs3MjEsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykKK3N0YXR1c190IEZMQUNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKQogewogICAgIEFMT0dWKCJGTEFDU291cmNlOjpzdGFydCIpOwogCkBAIC03OTIsOCArODEzLDcgQEAKIH0KIAogc3A8TWV0YURhdGE+IEZMQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpCi17CisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCmluZGV4IDVmYTRiNmYuLjMyMjkxYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKQEAgLTIwLDE3ICsyMCwxMyBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogCi0jaWYgQ0hST01JVU1fQVZBSUxBQkxFCi0jaW5jbHVkZSAiaW5jbHVkZS9jaHJvbWl1bV9odHRwX3N0dWIuaCIKLSNlbmRpZgotCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3F0YWd1aWQuaD4KIAotI2luY2x1ZGUgPENvbm5lY3Rpdml0eU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxOZXRkQ2xpZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDAsMzQgKzM2LDcgQEAKICAgICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMoMCksCiAgICAgICBtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMoMCksCiAgICAgICBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHMoMCksCi0gICAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyg1MDAwKSwKLSAgICAgIG1VSURWYWxpZChmYWxzZSksCi0gICAgICBtVUlEKDApIHsKLX0KLQotLy8gc3RhdGljCi1zcDxIVFRQQmFzZT4gSFRUUEJhc2U6OkNyZWF0ZSh1aW50MzJfdCBmbGFncykgewotI2lmIENIUk9NSVVNX0FWQUlMQUJMRQotICAgICAgICBIVFRQQmFzZSAqZGF0YVNvdXJjZSA9IGNyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UoZmxhZ3MpOwotICAgICAgICBpZiAoZGF0YVNvdXJjZSkgewotICAgICAgICAgICByZXR1cm4gZGF0YVNvdXJjZTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgewotICAgICAgICBUUkVTUEFTUygpOwotCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBIVFRQQmFzZTo6VXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotI2lmIENIUk9NSVVNX0FWQUlMQUJMRQotICAgIHJldHVybiBVcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci0jZWxzZQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSNlbmRpZgorICAgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMoNTAwMCkgewogfQogCiB2b2lkIEhUVFBCYXNlOjphZGRCYW5kd2lkdGhNZWFzdXJlbWVudCgKQEAgLTEzNSwyMSArMTA0LDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgSFRUUEJhc2U6OnNldFVJRCh1aWRfdCB1aWQpIHsKLSAgICBtVUlEVmFsaWQgPSB0cnVlOwotICAgIG1VSUQgPSB1aWQ7Ci19Ci0KLWJvb2wgSFRUUEJhc2U6OmdldFVJRCh1aWRfdCAqdWlkKSBjb25zdCB7Ci0gICAgaWYgKCFtVUlEVmFsaWQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICp1aWQgPSBtVUlEOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIC8vIHN0YXRpYwogdm9pZCBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZykgewogICAgIGludCByZXMgPSBxdGFndWlkX3RhZ1NvY2tldChzb2NrZmQsIGtUYWcsIHVpZCk7CkBAIC0xNjgsNyArMTIyLDcgQEAKIAogLy8gc3RhdGljCiB2b2lkIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCkgewotICAgIENvbm5lY3Rpdml0eU1hbmFnZXI6Om1hcmtTb2NrZXRBc1VzZXIoc29ja2ZkLCB1aWQpOworICAgIHNldE5ldHdvcmtGb3JVc2VyKHVpZCwgc29ja2ZkKTsKIH0KIAogLy8gc3RhdGljCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcAppbmRleCAzODBkYWI0Li40YTYzMTUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKQEAgLTM5OCw3ICszOTgsOCBAQAogICAgICAgICAgICAgbVNlZWtlcik7CiB9CiAKLXNwPE1ldGFEYXRhPiBNUDNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworc3A8TWV0YURhdGE+IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAppbmRleCBjOWVkNWJiLi45ODU2ZjkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcApAQCAtNTU1LDcgKzU1NSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW0pIHsKK3N0YXR1c190IE1QRUcyVFNXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW0gKi8pIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwpAQCAtNTk2LDcgKzU5Niw4IEBACiAgICAgcmV0dXJuICFtU3RhcnRlZCB8fCAobU51bVNvdXJjZXNEb25lID09IG1Tb3VyY2VzLnNpemUoKSA/IHRydWUgOiBmYWxzZSk7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNXcml0ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSB7CitzdGF0dXNfdCBNUEVHMlRTV3JpdGVyOjpkdW1wKAorICAgICAgICBpbnQgLyogZmQgKi8sIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJiAvKiBhcmdzICovKSB7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC02ODEsNyArNjgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQUxPR1YoIndyaXRpbmcgYWNjZXNzIHVuaXQgYXQgdGltZSAlLjJmIHNlY3MgKGluZGV4ICVkKSIsCisgICAgICAgICAgICAgICAgQUxPR1YoIndyaXRpbmcgYWNjZXNzIHVuaXQgYXQgdGltZSAlLjJmIHNlY3MgKGluZGV4ICV6dSkiLAogICAgICAgICAgICAgICAgICAgICAgbWluVGltZVVzIC8gMUU2LCBtaW5JbmRleCk7CiAKICAgICAgICAgICAgICAgICBzb3VyY2UgPSBtU291cmNlcy5lZGl0SXRlbUF0KG1pbkluZGV4KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAppbmRleCBhMWViMTZkLi40MzM5NDFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0xNiwxNyArMTYsMTkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNUEVHNEV4dHJhY3RvciIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU2FtcGxlVGFibGUuaCIKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKIAotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNTEsMTEgKzUzLDEzIEBACiBjbGFzcyBNUEVHNFNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CiBwdWJsaWM6CiAgICAgLy8gQ2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIGJvdGggImRhdGFTb3VyY2UiIGFuZCAic2FtcGxlVGFibGUiLgotICAgIE1QRUc0U291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0LAorICAgIE1QRUc0U291cmNlKGNvbnN0IHNwPE1QRUc0RXh0cmFjdG9yPiAmb3duZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCiAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKKyAgICAgICAgICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAogICAgICAgICAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0KTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwpAQCAtNzIsNiArNzYsOCBAQAogcHJpdmF0ZToKICAgICBNdXRleCBtTG9jazsKIAorICAgIC8vIGtlZXAgdGhlIE1QRUc0RXh0cmFjdG9yIGFyb3VuZCwgc2luY2Ugd2UncmUgcmVmZXJlbmNpbmcgaXRzIGRhdGEKKyAgICBzcDxNUEVHNEV4dHJhY3Rvcj4gbU93bmVyOwogICAgIHNwPE1ldGFEYXRhPiBtRm9ybWF0OwogICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwogICAgIGludDMyX3QgbVRpbWVzY2FsZTsKQEAgLTc5LDYgKzg1LDcgQEAKICAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZGV4OwogICAgIHVpbnQzMl90IG1DdXJyZW50RnJhZ21lbnRJbmRleDsKICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmbVNlZ21lbnRzOworICAgIGNvbnN0IFRyZXggKm1UcmV4OwogICAgIG9mZjY0X3QgbUZpcnN0TW9vZk9mZnNldDsKICAgICBvZmY2NF90IG1DdXJyZW50TW9vZk9mZnNldDsKICAgICBvZmY2NF90IG1OZXh0TW9vZk9mZnNldDsKQEAgLTEwMCw2ICsxMDcsNyBAQAogICAgIHVpbnQ2NF90KiBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzOwogCiAgICAgYm9vbCBtSXNBVkM7CisgICAgYm9vbCBtSXNIRVZDOwogICAgIHNpemVfdCBtTkFMTGVuZ3RoU2l6ZTsKIAogICAgIGJvb2wgbVN0YXJ0ZWQ7CkBAIC0xNDUsNiArMTUzLDcgQEAKICAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7CiAgICAgICAgIHNpemVfdCBzaXplOwogICAgICAgICB1aW50MzJfdCBkdXJhdGlvbjsKKyAgICAgICAgaW50MzJfdCBjb21wb3NpdGlvbk9mZnNldDsKICAgICAgICAgdWludDhfdCBpdlsxNl07CiAgICAgICAgIFZlY3RvcjxzaXplX3Q+IGNsZWFyc2l6ZXM7CiAgICAgICAgIFZlY3RvcjxzaXplX3Q+IGVuY3J5cHRlZHNpemVzOwpAQCAtMjY0LDcgKzI3Myw3IEBACiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopX2RhdGE7CiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CiAgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKLSAgICAgICAgcHJpbnRmKCIweCUwNHggICIsIG9mZnNldCk7CisgICAgICAgIHByaW50ZigiMHglMDR6eCAgIiwgb2Zmc2V0KTsKIAogICAgICAgICBzaXplX3QgbiA9IHNpemUgLSBvZmZzZXQ7CiAgICAgICAgIGlmIChuID4gMTYpIHsKQEAgLTMyMSw2ICszMzAsOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIAorICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpOgorICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBDSEVDSyghInNob3VsZCBub3QgYmUgaGVyZS4iKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzQzLDggKzM1NSw3IEBACiB9CiAKIE1QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgIDogbVNpZHhEdXJhdGlvbigwKSwKLSAgICAgIG1Nb29mT2Zmc2V0KDApLAorICAgIDogbU1vb2ZPZmZzZXQoMCksCiAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1IYXNWaWRlbyhmYWxzZSksCkBAIC00MDksNyArNDIwLDcgQEAKICAgICAgICAgdHJhY2sgPSB0cmFjay0+bmV4dDsKICAgICB9CiAKLSAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzOiAlZCB0cmFja3MiLCBuKTsKKyAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzOiAlenUgdHJhY2tzIiwgbik7CiAgICAgcmV0dXJuIG47CiB9CiAKQEAgLTQ4Miw4ICs0OTMsMTggQEAKICAgICBvZmY2NF90IG9mZnNldCA9IDA7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIG9mZjY0X3Qgb3JpZ19vZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgIGVyciA9IHBhcnNlQ2h1bmsoJm9mZnNldCwgMCk7Ci0gICAgICAgIGlmIChlcnIgPT0gT0spIHsKKworICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBVTktOT1dOX0VSUk9SKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPD0gb3JpZ19vZmZzZXQpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgY29udGludWUgcGFyc2luZyBpZiB0aGUgb2Zmc2V0IHdhcyBhZHZhbmNlZCwKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBtaWdodCBlbmQgdXAgaW4gYW4gaW5maW5pdGUgbG9vcAorICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgYWR2YW5jZTogMHglbGxkLT4weCVsbGQiLCBvcmlnX29mZnNldCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIApAQCAtNDkyLDEyICs1MTMsMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHVpbnQzMl90IGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOwotICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ3MnLCAnaScsICdkJywgJ3gnKSkgewotICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHNpZHggYm94IHRvbwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgeworICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgewogICAgICAgICAgICAgLy8gc3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc2VnbWVudAogICAgICAgICAgICAgbU1vb2ZPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKSkgeworICAgICAgICAgICAgLy8ga2VlcCBwYXJzaW5nIHVudGlsIHdlIGdldCB0byB0aGUgZGF0YQorICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNTA5LDggKzUzMCw2IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImF1ZGlvL21wNCIpOwogICAgICAgICB9Ci0KLSAgICAgICAgbUluaXRDaGVjayA9IE9LOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBlcnI7CiAgICAgfQpAQCAtNTc1LDcgKzU5NCw4IEBACiAgICAgcmV0dXJuIHNpemU7CiB9CiAKLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZURybVNJTkYob2ZmNjRfdCAqb2Zmc2V0LCBvZmY2NF90IGRhdGFfb2Zmc2V0KSB7CitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VEcm1TSU5GKAorICAgICAgICBvZmY2NF90ICogLyogb2Zmc2V0ICovLCBvZmY2NF90IGRhdGFfb2Zmc2V0KSB7CiAgICAgdWludDhfdCB1cGRhdGVJZFRhZzsKICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJnVwZGF0ZUlkVGFnLCAxKSA8IDEpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwpAQCAtNzY0LDggKzc4NCwyNSBAQAogICAgICAgICAgICAgLy8gVGhlIHNtYWxsZXN0IHZhbGlkIGNodW5rIGlzIDE2IGJ5dGVzIGxvbmcgaW4gdGhpcyBjYXNlLgogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA9PSAwKSB7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAvLyBhdG9tIGV4dGVuZHMgdG8gZW5kIG9mIGZpbGUKKyAgICAgICAgICAgIG9mZjY0X3Qgc291cmNlU2l6ZTsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc291cmNlU2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBjaHVua19zaXplID0gKHNvdXJjZVNpemUgLSAqb2Zmc2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gWFhYIGNvdWxkIHdlIGp1c3QgcGljayBhICJzdWZmaWNpZW50bHkgbGFyZ2UiIHZhbHVlIGhlcmU/CisgICAgICAgICAgICAgICAgQUxPR0UoImF0b20gc2l6ZSBpcyAwLCBhbmQgZGF0YSBzb3VyY2UgaGFzIG5vIHNpemUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbm90IGFsbG93ZWQgZm9yIG5vbi10b3BsZXZlbCBhdG9tcywgc2tpcCBpdAorICAgICAgICAgICAgKm9mZnNldCArPSA0OworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChjaHVua19zaXplIDwgOCkgewogICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgorICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplOiAlIiBQUkl1NjQsIGNodW5rX3NpemUpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIApAQCAtNzc2LDcgKzgxMyw3IEBACiAjaWYgMAogICAgIHN0YXRpYyBjb25zdCBjaGFyIGtXaGl0ZXNwYWNlW10gPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CiAgICAgY29uc3QgY2hhciAqaW5kZW50ID0gJmtXaGl0ZXNwYWNlW3NpemVvZihrV2hpdGVzcGFjZSkgLSAxIC0gMiAqIGRlcHRoXTsKLSAgICBwcmludGYoIiVzZm91bmQgY2h1bmsgJyVzJyBvZiBzaXplICVsbGRcbiIsIGluZGVudCwgY2h1bmssIGNodW5rX3NpemUpOworICAgIHByaW50ZigiJXNmb3VuZCBjaHVuayAnJXMnIG9mIHNpemUgJSIgUFJJdTY0ICJcbiIsIGluZGVudCwgY2h1bmssIGNodW5rX3NpemUpOwogCiAgICAgY2hhciBidWZmZXJbMjU2XTsKICAgICBzaXplX3QgbiA9IGNodW5rX3NpemU7CkBAIC04MzIsNyArODY5LDcgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnZCcsICd0JywgJ3MnKToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJykpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlVGFibGUgY2h1bmsgaXMgJWQgYnl0ZXMgbG9uZy4iLCAoc2l6ZV90KWNodW5rX3NpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJzYW1wbGVUYWJsZSBjaHVuayBpcyAlIiBQUkl1NjQgIiBieXRlcyBsb25nLiIsIGNodW5rX3NpemUpOwogCiAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpCiAgICAgICAgICAgICAgICAgICAgICAgICAmIChEYXRhU291cmNlOjprV2FudHNQcmVmZXRjaGluZwpAQCAtOTE5LDYgKzk1Niw4IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnbCcsICdzJywgJ3QnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICAvLyBTZWUgMTQ0OTYtMTIgOC42LjYKICAgICAgICAgICAgIHVpbnQ4X3QgdmVyc2lvbjsKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdmVyc2lvbiwgMSkgPCAxKSB7CkBAIC05ODEsMTIgKzEwMjAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nc2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnZicsICdyJywgJ20nLCAnYScpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHVpbnQzMl90IG9yaWdpbmFsX2ZvdXJjYzsKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmb3JpZ2luYWxfZm91cmNjLCA0KSA8IDQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CkBAIC0xMDAwLDEyICsxMDQwLDEzIEBACiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygndCcsICdlJywgJ24nLCAnYycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMzIpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQpAQCAtMTA1MCwyMyArMTA5MSwyNSBAQAogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgZGVmYXVsdElWU2l6ZSk7CiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKGtLZXlDcnlwdG9LZXksICd0ZW5jJywgZGVmYXVsdEtleUlkLCAxNik7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2snLCAnaCcsICdkJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVRyYWNrSGVhZGVyKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKSAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAncycsICdzJywgJ2gnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBQc3NoSW5mbyBwc3NoOwogCiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDQsICZwc3NoLnV1aWQsIDE2KSA8IDE2KSB7CkBAIC0xMDk1LDEyICsxMTM4LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUHNzaC5wdXNoX2JhY2socHNzaCk7CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdoJywgJ2QnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xMTMxLDYgKzExNzUsOCBAQAogCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT50aW1lc2NhbGUgPSBudG9obCh0aW1lc2NhbGUpOwogCisgICAgICAgICAgICAvLyAxNDQ5Ni0xMiBzYXlzIGFsbCBvbmVzIG1lYW5zIGluZGV0ZXJtaW5hdGUsIGJ1dCBzb21lIGZpbGVzIHNlZW0gdG8gdXNlCisgICAgICAgICAgICAvLyAwIGluc3RlYWQuIFdlIHRyZWF0IGJvdGggdGhlIHNhbWUuCiAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKQEAgLTExMzgsNyArMTE4NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihkdXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG50b2g2NChkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gbnRvaDY0KGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IGR1cmF0aW9uMzI7CiAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCkBAIC0xMTQ2LDEzICsxMTk0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihkdXJhdGlvbjMyKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGZmbXBlZyBzZXRzIGR1cmF0aW9uIHRvIC0xLCB3aGljaCBpcyBpbmNvcnJlY3QuCiAgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uMzIgIT0gMHhmZmZmZmZmZikgewogICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG50b2hsKGR1cmF0aW9uMzIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOwogICAgICAgICAgICAgb2ZmNjRfdCBsYW5nX29mZnNldDsKQEAgLTExODEsNyArMTIzMCw2IEBACiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICBrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZ19jb2RlKTsKIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTI5MSw2ICsxMzM5LDggQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ0gnLCAnMicsICc2JywgJzMnKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnMicsICc2JywgJzMnKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJzEnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJzEnKToKICAgICAgICAgewogICAgICAgICAgICAgbUhhc1ZpZGVvID0gdHJ1ZTsKIApAQCAtMTM0OCwxMSArMTM5OCwxMiBAQAogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRDaHVua09mZnNldFBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMzYyLDExICsxNDEzLDEyIEBACiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFNhbXBsZVRvQ2h1bmtQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKIAorICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTM3Nyw2ICsxNDI5LDggQEAKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0U2FtcGxlU2l6ZVBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQpAQCAtMTQyOSw3ICsxNDgzLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCiAgICAgICAgICAgICAvLyBOT1RFOiBzZXR0aW5nIGFub3RoZXIgcGllY2Ugb2YgbWV0YWRhdGEgaW52YWxpZGF0ZXMgYW55IHBvaW50ZXJzIChzdWNoIGFzIHRoZQogICAgICAgICAgICAgLy8gbWltZXR5cGUpIHByZXZpb3VzbHkgb2J0YWluZWQsIHNvIGRvbid0IGNhY2hlIHRoZW0uCkBAIC0xNDUzLDYgKzE1MDYsOCBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAndCcsICdzJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0VGltZVRvU2FtcGxlUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0xNDYxLDEyICsxNTE2LDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnYycsICd0JywgJ3QnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldENvbXBvc2l0aW9uVGltZVRvU2FtcGxlUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0xNDc1LDEyICsxNTMxLDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFN5bmNTYW1wbGVQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTE0ODksMTMgKzE1NDYsMTQgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEB4eXoKICAgICAgICAgY2FzZSBGT1VSQ0MoJ1x4QTknLCAneCcsICd5JywgJ3onKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICAvLyBCZXN0IGNhc2UgdGhlIHRvdGFsIGRhdGEgbGVuZ3RoIGluc2lkZSAiQHh5eiIgYm94CiAgICAgICAgICAgICAvLyB3b3VsZCBiZSA4LCBmb3IgaW5zdGFuY2UgIkB4eXoiICsgIlx4MDBceDA0XHgxNVx4YzciICsgIjArMC8iLAogICAgICAgICAgICAgLy8gd2hlcmUgIlx4MDBceDA0IiBpcyB0aGUgdGV4dCBzdHJpbmcgbGVuZ3RoIHdpdGggdmFsdWUgPSA0LApAQCAtMTUyNCwxMiArMTU4MiwxMyBAQAogCiAgICAgICAgICAgICBidWZmZXJbbG9jYXRpb25fbGVuZ3RoXSA9ICdcMCc7CiAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlMb2NhdGlvbiwgYnVmZmVyKTsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAncycsICdkJywgJ3MnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xNTY3LDEyICsxNjI2LDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnYycsICdDJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCkBAIC0xNTgzLDEyICsxNjQzLDI3IEBACiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKAogICAgICAgICAgICAgICAgICAgICBrS2V5QVZDQywga1R5cGVBVkNDLCBidWZmZXItPmRhdGEoKSwgY2h1bmtfZGF0YV9zaXplKTsKIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJ0MnKToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLT5kYXRhKCksIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGJ1ZmZlci0+ZGF0YSgpLCBjaHVua19kYXRhX3NpemUpOworCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJzInLCAnNicsICczJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBkMjYzIGNvbnRhaW5zIGEgZml4ZWQgNyBieXRlcyBwYXJ0OgogICAgICAgICAgICAgICogICB2ZW5kb3IgLSA0IGJ5dGVzCkBAIC0xNjE0LDcgKzE2ODksNiBAQAogCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKGtLZXlEMjYzLCBrVHlwZUQyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTYyMiwxMSArMTY5NiwxMyBAQAogICAgICAgICB7CiAgICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls0XTsKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAob2ZmNjRfdClzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgeworICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKQEAgLTE2NjAsNiArMTczNiw4IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCduJywgJ2EnLCAnbScsICdlJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA9PSA2ICYmIHVuZGVyTWV0YURhdGFQYXRoKG1QYXRoKSkgewogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlSVR1bmVzTWV0YURhdGEoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CiAKQEAgLTE2NjgsMTcgKzE3NDYsMTggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAndicsICdoJywgJ2QnKToKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDI0KSB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAzMikgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQ4X3QgaGVhZGVyWzI0XTsKKyAgICAgICAgICAgIHVpbnQ4X3QgaGVhZGVyWzMyXTsKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpCiAgICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKQEAgLTE2ODYsMTQgKzE3NjUsMjcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDY0X3QgY3JlYXRpb25UaW1lOworICAgICAgICAgICAgdWludDY0X3QgZHVyYXRpb24gPSAwOwogICAgICAgICAgICAgaWYgKGhlYWRlclswXSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgY3JlYXRpb25UaW1lID0gVTY0X0FUKCZoZWFkZXJbNF0pOwogICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUgPSBVMzJfQVQoJmhlYWRlclsyMF0pOworICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gVTY0X0FUKCZoZWFkZXJbMjRdKTsKKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gMHhmZmZmZmZmZmZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlclswXSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgY3JlYXRpb25UaW1lID0gVTMyX0FUKCZoZWFkZXJbNF0pOwogICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUgPSBVMzJfQVQoJmhlYWRlclsxMl0pOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGQzMiA9IFUzMl9BVCgmaGVhZGVyWzE2XSk7CisgICAgICAgICAgICAgICAgaWYgKGQzMiA9PSAweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGQzMiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gZDMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDApIHsKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmc4IHM7CkBAIC0xNzAxLDcgKzE3OTMsNTAgQEAKIAogICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5RGF0ZSwgcy5zdHJpbmcoKSk7CiAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICdoJywgJ2QnKToKKyAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgOCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgZmxhZ3NbNF07CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBmbGFncywgc2l6ZW9mKGZsYWdzKSkKKyAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50NjRfdCBkdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBpZiAoZmxhZ3NbMF0gPT0gMSkgeworICAgICAgICAgICAgICAgIC8vIDY0IGJpdAorICAgICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAxMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+Z2V0VUludDY0KGRhdGFfb2Zmc2V0ICsgNCwgJmR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gMHhmZmZmZmZmZmZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyAzMiBiaXQKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkMzI7CisgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDQsICZkMzIpOworICAgICAgICAgICAgICAgIGlmIChkMzIgPT0gMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICBkMzIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGQzMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDApIHsKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNzIyLDYgKzE4NTcsOCBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2QnLCAnbCcsICdyJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyOwogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArIDgsICZidWZmZXIsIDQpIDwgNCkgewpAQCAtMTczOCw3ICsxODc1LDI2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3InLCAnZScsICd4Jyk6CisgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDI0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgZHVyYXRpb247CisgICAgICAgICAgICBUcmV4IHRyZXg7CisgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyA0LCAmdHJleC50cmFja19JRCkgfHwKKyAgICAgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDgsICZ0cmV4LmRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4KSB8fAorICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgMTIsICZ0cmV4LmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uKSB8fAorICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgMTYsICZ0cmV4LmRlZmF1bHRfc2FtcGxlX3NpemUpIHx8CisgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyAyMCwgJnRyZXguZGVmYXVsdF9zYW1wbGVfZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRyZXguYWRkKHRyZXgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTc1NSw2ICsxOTExLDcgQEAKICAgICAgICAgICAgIGlmICgoY2h1bmtfc2l6ZSA+IFNJWkVfTUFYKSB8fCAoU0laRV9NQVggLSBjaHVua19zaXplIDw9IHNpemUpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZSArIGNodW5rX3NpemVdOwogICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTE3NjksNiArMTkyNiw4IEBACiAgICAgICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwogICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKKyAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHJlYWQgcG9pbnRlciBzbyB3ZSBkb24ndCBlbmQgdXAgcmVhZGluZyB0aGlzIGFnYWluCisgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIApAQCAtMTc4Myw2ICsxOTQyLDggQEAKIAogICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChtRmlsZU1ldGFEYXRhICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiY2h1bmtfZGF0YV9zaXplID0gJWxsZCBhbmQgZGF0YV9vZmZzZXQgPSAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSwgZGF0YV9vZmZzZXQpOwpAQCAtMTgwNSw3ICsxOTY2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkgKyBrU2tpcEJ5dGVzT2ZEYXRhQm94LCBjaHVua19kYXRhX3NpemUgLSBrU2tpcEJ5dGVzT2ZEYXRhQm94KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTgxNiwyNSArMTk3NiwyNyBAQAogICAgICAgICBjYXNlIEZPVVJDQygnYScsICdsJywgJ2InLCAnbScpOgogICAgICAgICBjYXNlIEZPVVJDQygneScsICdyJywgJ3InLCAnYycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlM0dQUE1ldGFEYXRhKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUsIGRlcHRoKTsKIAogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ0knLCAnRCcsICczJywgJzInKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNikgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHBhcnNlSUQzdjJNZXRhRGF0YShkYXRhX29mZnNldCArIDYpOwogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xOTI2LDcgKzIwODgsNyBAQAogICAgICAgICBvZmZzZXQgKz0gMTY7CiAgICAgICAgIHNpemUgLT0gMTY7CiAgICAgfQotICAgIEFMT0dWKCJzaWR4IHByZXMvb2ZmOiAlTGQvJUxkIiwgZWFybGllc3RQcmVzZW50YXRpb25UaW1lLCBmaXJzdE9mZnNldCk7CisgICAgQUxPR1YoInNpZHggcHJlcy9vZmY6ICUiIFBSSXU2NCAiLyUiIFBSSXU2NCwgZWFybGllc3RQcmVzZW50YXRpb25UaW1lLCBmaXJzdE9mZnNldCk7CiAKICAgICBpZiAoc2l6ZSA8IDQpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTU4LDkgKzIxMjAsMTAgQEAKICAgICAgICAgICAgIEFMT0dXKCJzdWItc2lkeCBib3hlcyBub3Qgc3VwcG9ydGVkIHlldCIpOwogICAgICAgICB9CiAgICAgICAgIGJvb2wgc2FwID0gZDMgJiAweDgwMDAwMDAwOwotICAgICAgICBib29sIHNhcHR5cGUgPSBkMyA+PiAyODsKLSAgICAgICAgaWYgKCFzYXAgfHwgc2FwdHlwZSA+IDIpIHsKLSAgICAgICAgICAgIEFMT0dXKCJub3QgYSBzdHJlYW0gYWNjZXNzIHBvaW50LCBvciB1bnN1cHBvcnRlZCB0eXBlIik7CisgICAgICAgIHVpbnQzMl90IHNhcHR5cGUgPSAoZDMgPj4gMjgpICYgNzsKKyAgICAgICAgaWYgKCFzYXAgfHwgKHNhcHR5cGUgIT0gMSAmJiBzYXB0eXBlICE9IDIpKSB7CisgICAgICAgICAgICAvLyB0eXBlIDEgYW5kIDIgYXJlIHN5bmMgc2FtcGxlcworICAgICAgICAgICAgQUxPR1coIm5vdCBhIHN0cmVhbSBhY2Nlc3MgcG9pbnQsIG9yIHVuc3VwcG9ydGVkIHR5cGU6ICUwOHgiLCBkMyk7CiAgICAgICAgIH0KICAgICAgICAgdG90YWxfZHVyYXRpb24gKz0gZDI7CiAgICAgICAgIG9mZnNldCArPSAxMjsKQEAgLTE5NzEsMTIgKzIxMzQsMTEgQEAKICAgICAgICAgbVNpZHhFbnRyaWVzLmFkZChzZSk7CiAgICAgfQogCi0gICAgbVNpZHhEdXJhdGlvbiA9IHRvdGFsX2R1cmF0aW9uICogMTAwMDAwMCAvIHRpbWVTY2FsZTsKLSAgICBBTE9HVigiZHVyYXRpb246ICVsbGQiLCBtU2lkeER1cmF0aW9uKTsKKyAgICB1aW50NjRfdCBzaWR4RHVyYXRpb24gPSB0b3RhbF9kdXJhdGlvbiAqIDEwMDAwMDAgLyB0aW1lU2NhbGU7CiAKICAgICBpbnQ2NF90IG1ldGFEdXJhdGlvbjsKICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZtZXRhRHVyYXRpb24pIHx8IG1ldGFEdXJhdGlvbiA9PSAwKSB7Ci0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgbVNpZHhEdXJhdGlvbik7CisgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgc2lkeER1cmF0aW9uKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjI2OSwxMSArMjQzMSwxNCBAQAogfQogCiBzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2UzR1BQTWV0YURhdGEob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZGVwdGgpIHsKLSAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICBpZiAoc2l6ZSA8IDQgfHwgc2l6ZSA9PSBTSVpFX01BWCkgewogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyB1aW50OF90W3NpemVdOworICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemUgKyAxXTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CiAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCiAgICAgICAgICAgICAgICAgb2Zmc2V0LCBidWZmZXIsIHNpemUpICE9IChzc2l6ZV90KXNpemUpIHsKICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwpAQCAtMjMzOSw2ICsyNTA0LDEwIEBACiAgICAgICAgIGludCBsZW4xNiA9IDA7IC8vIE51bWJlciBvZiBVVEYtMTYgY2hhcmFjdGVycwogCiAgICAgICAgIC8vIHNtYWxsZXN0IHBvc3NpYmxlIHZhbGlkIFVURi0xNiBzdHJpbmcgdyBCT006IDB4ZmUgMHhmZiAweDAwIDB4MDAKKyAgICAgICAgaWYgKHNpemUgPCA2KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKICAgICAgICAgaWYgKHNpemUgLSA2ID49IDQpIHsKICAgICAgICAgICAgIGxlbjE2ID0gKChzaXplIC0gNikgLyAyKSAtIDE7IC8vIGRvbid0IGluY2x1ZGUgMHgwMDAwIHRlcm1pbmF0b3IKICAgICAgICAgICAgIGZyYW1lZGF0YSA9IChjaGFyMTZfdCAqKShidWZmZXIgKyA2KTsKQEAgLTIzNjIsNiArMjUzMSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNVVEY4KSB7CisgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAwOwogICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA2KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIENvbnZlcnQgZnJvbSBVVEYtMTYgc3RyaW5nIHRvIFVURi04IHN0cmluZy4KQEAgLTI0NTIsMTEgKzI2MjIsMjQgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgQUxPR1YoImdldFRyYWNrIGNhbGxlZCwgcHNzaDogJWQiLCBtUHNzaC5zaXplKCkpOwogCi0gICAgcmV0dXJuIG5ldyBNUEVHNFNvdXJjZSgKKyAgICBUcmV4ICp0cmV4ID0gTlVMTDsKKyAgICBpbnQzMl90IHRyYWNrSWQ7CisgICAgaWYgKHRyYWNrLT5tZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmV4LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBUcmV4ICp0ID0gJm1UcmV4LmVkaXRJdGVtQXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKHQtPnRyYWNrX0lEID09ICh1aW50MzJfdCkgdHJhY2tJZCkgeworICAgICAgICAgICAgICAgIHRyZXggPSB0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoImdldFRyYWNrIGNhbGxlZCwgcHNzaDogJXp1IiwgbVBzc2guc2l6ZSgpKTsKKworICAgIHJldHVybiBuZXcgTVBFRzRTb3VyY2UodGhpcywKICAgICAgICAgICAgIHRyYWNrLT5tZXRhLCBtRGF0YVNvdXJjZSwgdHJhY2stPnRpbWVzY2FsZSwgdHJhY2stPnNhbXBsZVRhYmxlLAotICAgICAgICAgICAgbVNpZHhFbnRyaWVzLCBtTW9vZk9mZnNldCk7CisgICAgICAgICAgICBtU2lkeEVudHJpZXMsIHRyZXgsIG1Nb29mT2Zmc2V0KTsKIH0KIAogLy8gc3RhdGljCkBAIC0yNDcyLDYgKzI2NTUsMTEgQEAKICAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlQVZDQykgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKKyAgICAgICAgaWYgKCF0cmFjay0+bWV0YS0+ZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpCisgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVIVkNDKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKICAgICAgICAgaWYgKCF0cmFjay0+bWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpCkBAIC0yNDgwLDE0ICsyNjY4LDY3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIXRyYWNrLT5zYW1wbGVUYWJsZS0+aXNWYWxpZCgpKSB7CisgICAgaWYgKHRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMIHx8ICF0cmFjay0+c2FtcGxlVGFibGUtPmlzVmFsaWQoKSkgewogICAgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhbGwgdGhlIG1ldGFkYXRhIHdlIG5lZWQuCisgICAgICAgIEFMT0dFKCJzdGJsIGF0b20gbWlzc2luZy9pbnZhbGlkLiIpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KIAordHlwZWRlZiBlbnVtIHsKKyAgICAvL0FPVF9OT05FICAgICAgICAgICAgID0gLTEsCisgICAgLy9BT1RfTlVMTF9PQkpFQ1QgICAgICA9IDAsCisgICAgLy9BT1RfQUFDX01BSU4gICAgICAgICA9IDEsIC8qKjwgTWFpbiBwcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBBT1RfQUFDX0xDICAgICAgICAgICA9IDIsICAgLyoqPCBMb3cgQ29tcGxleGl0eSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0FBQ19TU1IgICAgICAgICAgPSAzLAorICAgIC8vQU9UX0FBQ19MVFAgICAgICAgICAgPSA0LAorICAgIEFPVF9TQlIgICAgICAgICAgICAgID0gNSwKKyAgICAvL0FPVF9BQUNfU0NBTCAgICAgICAgID0gNiwKKyAgICAvL0FPVF9UV0lOX1ZRICAgICAgICAgID0gNywKKyAgICAvL0FPVF9DRUxQICAgICAgICAgICAgID0gOCwKKyAgICAvL0FPVF9IVlhDICAgICAgICAgICAgID0gOSwKKyAgICAvL0FPVF9SU1ZEXzEwICAgICAgICAgID0gMTAsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzExICAgICAgICAgID0gMTEsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9UVFNJICAgICAgICAgICAgID0gMTIsIC8qKjwgVFRTSSBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9NQUlOX1NZTlRIICAgICAgID0gMTMsIC8qKjwgTWFpbiBTeW50aGV0aWMgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9XQVZfVEFCX1NZTlRIICAgID0gMTQsIC8qKjwgV2F2ZXRhYmxlIFN5bnRoZXNpcyBvYmplY3QgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9HRU5fTUlESSAgICAgICAgID0gMTUsIC8qKjwgR2VuZXJhbCBNSURJIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9BTEdfU1lOVEhfQVVEX0ZYID0gMTYsIC8qKjwgQWxnb3JpdGhtaWMgU3ludGhlc2lzIGFuZCBBdWRpbyBGWCBvYmplY3QgKi8KKyAgICBBT1RfRVJfQUFDX0xDICAgICAgICA9IDE3LCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTG93IENvbXBsZXhpdHkgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzE4ICAgICAgICAgID0gMTgsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9BQUNfTFRQICAgICAgID0gMTksIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTFRQIG9iamVjdCAgICAgICAgKi8KKyAgICBBT1RfRVJfQUFDX1NDQUwgICAgICA9IDIwLCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgU2NhbGFibGUgb2JqZWN0ICAgKi8KKyAgICAvL0FPVF9FUl9UV0lOX1ZRICAgICAgID0gMjEsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBUd2luVlEgb2JqZWN0ICAgICAgICAgKi8KKyAgICBBT1RfRVJfQlNBQyAgICAgICAgICA9IDIyLCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBCU0FDIG9iamVjdCAgICAgICAgICAgKi8KKyAgICBBT1RfRVJfQUFDX0xEICAgICAgICA9IDIzLCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTG93RGVsYXkgb2JqZWN0ICAgKi8KKyAgICAvL0FPVF9FUl9DRUxQICAgICAgICAgID0gMjQsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBDRUxQIG9iamVjdCAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9IVlhDICAgICAgICAgID0gMjUsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBIVlhDIG9iamVjdCAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9ISUxOICAgICAgICAgID0gMjYsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBISUxOIG9iamVjdCAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9QQVJBICAgICAgICAgID0gMjcsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBQYXJhbWV0cmljIG9iamVjdCAgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzI4ICAgICAgICAgID0gMjgsIC8qKjwgbWlnaHQgYmVjb21lIFNTQyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBBT1RfUFMgICAgICAgICAgICAgICA9IDI5LCAgIC8qKjwgUFMsIFBhcmFtZXRyaWMgU3RlcmVvIChpbmNsdWRlcyBTQlIpICAgICAgKi8KKyAgICAvL0FPVF9NUEVHUyAgICAgICAgICAgID0gMzAsIC8qKjwgTVBFRyBTdXJyb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIEFPVF9FU0NBUEUgICAgICAgICAgID0gMzEsICAgLyoqPCBTaWduYWwgQU9UIHVzZXMgbW9yZSB0aGFuIDUgYml0cyAgICAgICAgICAqLworCisgICAgLy9BT1RfTVAzT05NUDRfTDEgICAgICA9IDMyLCAvKio8IE1QRUctTGF5ZXIxIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfTVAzT05NUDRfTDIgICAgICA9IDMzLCAvKio8IE1QRUctTGF5ZXIyIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfTVAzT05NUDRfTDMgICAgICA9IDM0LCAvKio8IE1QRUctTGF5ZXIzIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfUlNWRF8zNSAgICAgICAgICA9IDM1LCAvKio8IG1pZ2h0IGJlY29tZSBEU1QgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfUlNWRF8zNiAgICAgICAgICA9IDM2LCAvKio8IG1pZ2h0IGJlY29tZSBBTFMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfQUFDX1NMUyAgICAgICAgICA9IDM3LCAvKio8IEFBQyArIFNMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfU0xTICAgICAgICAgICAgICA9IDM4LCAvKio8IFNMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfRVJfQUFDX0VMRCAgICAgICA9IDM5LCAvKio8IEFBQyBFbmhhbmNlZCBMb3cgRGVsYXkgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAvL0FPVF9VU0FDICAgICAgICAgICAgID0gNDIsIC8qKjwgVVNBQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9TQU9DICAgICAgICAgICAgID0gNDMsIC8qKjwgU0FPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9MRF9NUEVHUyAgICAgICAgID0gNDQsIC8qKjwgTG93IERlbGF5IE1QRUcgU3Vycm91bmQgICAgICAgICAgICAgICAgICAgKi8KKworICAgIC8vQU9UX1JTVkQ1MCAgICAgICAgICAgPSA1MCwgIC8qKjwgSW50ZXJpbSBBT1QgZm9yIFJzdmQ1MCAgICAgICAgICAgICAgICAgICAqLworfSBBVURJT19PQkpFQ1RfVFlQRTsKKwogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnVwZGF0ZUF1ZGlvVHJhY2tJbmZvRnJvbUVTRFNfTVBFRzRBdWRpbygKICAgICAgICAgY29uc3Qgdm9pZCAqZXNkc19kYXRhLCBzaXplX3QgZXNkc19zaXplKSB7CiAgICAgRVNEUyBlc2RzKGVzZHNfZGF0YSwgZXNkc19zaXplKTsKQEAgLTI1NzAsNyArMjgxMSw3IEBACiAgICAgICAgIHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2ZyZXFJbmRleF07CiAgICAgfQogCi0gICAgaWYgKG9iamVjdFR5cGUgPT0gNSB8fCBvYmplY3RUeXBlID09IDI5KSB7IC8vIFNCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGFibGUgMS4xMworICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsvL1NCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGFibGUgMS4xMwogICAgICAgICB1aW50MzJfdCBleHRGcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwogICAgICAgICBpbnQzMl90IGV4dFNhbXBsZVJhdGU7CiAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTUpIHsKQEAgLTI1ODgsNiArMjgyOSwxMzEgQEAKICAgICAgICAgLy8gICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RXh0U2FtcGxlUmF0ZSwgZXh0U2FtcGxlUmF0ZSk7CiAgICAgfQogCisgICAgc3dpdGNoIChudW1DaGFubmVscykgeworICAgICAgICAvLyB2YWx1ZXMgZGVmaW5lZCBpbiAxNDQ5Ni0zXzIwMDkgYW1lbmRtZW50LTQgVGFibGUgMS4xOSAtIENoYW5uZWwgQ29uZmlndXJhdGlvbgorICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMTovLyBGQworICAgICAgICBjYXNlIDI6Ly8gRkwgRlIKKyAgICAgICAgY2FzZSAzOi8vIEZDLCBGTCBGUgorICAgICAgICBjYXNlIDQ6Ly8gRkMsIEZMIEZSLCBSQworICAgICAgICBjYXNlIDU6Ly8gRkMsIEZMIEZSLCBTTCBTUgorICAgICAgICBjYXNlIDY6Ly8gRkMsIEZMIEZSLCBTTCBTUiwgTEZFCisgICAgICAgICAgICAvL251bUNoYW5uZWxzIGFscmVhZHkgY29udGFpbnMgdGhlIHJpZ2h0IHZhbHVlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMTovLyBGQywgRkwgRlIsIFNMIFNSLCBSQywgTEZFCisgICAgICAgICAgICBudW1DaGFubmVscyA9IDc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OiAvLyBGQywgRkNMIEZDUiwgRkwgRlIsIFNMIFNSLCBMRkUKKyAgICAgICAgY2FzZSAxMjovLyBGQywgRkwgIEZSLCAgU0wgU1IsIFJMIFJSLCBMRkUKKyAgICAgICAgY2FzZSAxNDovLyBGQywgRkwgIEZSLCAgU0wgU1IsIExGRSwgRkhMIEZIUgorICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgeworICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7CisgICAgICAgICAgICBvYmplY3RUeXBlID0gYnIuZ2V0Qml0cyg1KTsKKworICAgICAgICAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX0VTQ0FQRSkgeworICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPSAzMiArIGJyLmdldEJpdHMoNik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX0FBQ19MQyB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEMgfHwKKyAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEQgfHwgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX1NDQUwgfHwKKyAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9CU0FDKSB7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lTGVuZ3RoRmxhZyA9IGJyLmdldEJpdHMoMSk7CisKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVwZW5kc09uQ29yZUNvZGVyID0gYnIuZ2V0Qml0cygxKTsKKworICAgICAgICAgICAgaWYgKGRlcGVuZHNPbkNvcmVDb2RlciApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGNvcmVDb2RlckRlbGF5ID0gYnIuZ2V0Qml0cygxNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3QgZXh0ZW5zaW9uRmxhZyA9IC0xOworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmxhZyA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAob2JqZWN0VHlwZSkgeworICAgICAgICAgICAgICAgIC8vIDE0NDk2LTMgNC41LjEuMSBleHRlbnNpb25GbGFnCisgICAgICAgICAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0xDOgorICAgICAgICAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgorICAgICAgICAgICAgICAgIGNhc2UgQU9UX0VSX0JTQUM6CisgICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dXKCJjc2QgbWlzc2luZyBleHRlbnNpb24gZmxhZzsgYXNzdW1pbmcgJWQgZm9yIG9iamVjdCB0eXBlICV1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnLCBvYmplY3RUeXBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG51bUNoYW5uZWxzID09IDApIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gMDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxzTnVtID0gMDsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEVsZW1lbnRJbnN0YW5jZVRhZyA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQcm9maWxlID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtRnJvbnRDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtU2lkZUNoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1CYWNrQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUxmZUNoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Bc3NvY0RhdGFFbGVtZW50cyA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1WYWxpZENjRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOworCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93blByZXNlbnQgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgIGlmIChNb25vTWl4ZG93blByZXNlbnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1vbm9NaXhkb3duRWxlbWVudE51bWJlciA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duUHJlc2VudCA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgaWYgKFN0ZXJlb01peGRvd25QcmVzZW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duRWxlbWVudE51bWJlciA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICBpZiAoTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTWF0cml4TWl4ZG93bkluZGV4ID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQc2V1ZG9TdXJyb3VuZEVuYWJsZSA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudFRhZ1NlbGVjdCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IEZyb250RWxlbWVudElzQ3BlID8gMiA6IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudFRhZ1NlbGVjdCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IFNpZGVFbGVtZW50SXNDcGUgPyAyIDogMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEJhY2tFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEJhY2tFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gQmFja0VsZW1lbnRJc0NwZSA/IDIgOiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGFubmVsc0VmZmVjdGl2ZU51bSA9IGNoYW5uZWxzTnVtOworCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1MZmVDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IExmZUVsZW1lbnRUYWdTZWxlY3QgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gY2hhbm5lbHNOdW0gPSAlZCIsIGNoYW5uZWxzTnVtKTsKKyAgICAgICAgICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSAlZCIsIGNoYW5uZWxzRWZmZWN0aXZlTnVtKTsKKyAgICAgICAgICAgICAgICBudW1DaGFubmVscyA9IGNoYW5uZWxzTnVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKG51bUNoYW5uZWxzID09IDApIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KQEAgLTI2MTgsMTkgKzI5ODQsMjMgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUc0U291cmNlOjpNUEVHNFNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8TVBFRzRFeHRyYWN0b3I+ICZvd25lciwKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQsCiAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlLAogICAgICAgICBpbnQzMl90IHRpbWVTY2FsZSwKICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gJnNpZHgsCisgICAgICAgIGNvbnN0IFRyZXggKnRyZXgsCiAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0KQotICAgIDogbUZvcm1hdChmb3JtYXQpLAorICAgIDogbU93bmVyKG93bmVyKSwKKyAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKICAgICAgIG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbVRpbWVzY2FsZSh0aW1lU2NhbGUpLAogICAgICAgbVNhbXBsZVRhYmxlKHNhbXBsZVRhYmxlKSwKICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgoMCksCiAgICAgICBtQ3VycmVudEZyYWdtZW50SW5kZXgoMCksCiAgICAgICBtU2VnbWVudHMoc2lkeCksCisgICAgICBtVHJleCh0cmV4KSwKICAgICAgIG1GaXJzdE1vb2ZPZmZzZXQoZmlyc3RNb29mT2Zmc2V0KSwKICAgICAgIG1DdXJyZW50TW9vZk9mZnNldChmaXJzdE1vb2ZPZmZzZXQpLAogICAgICAgbUN1cnJlbnRUaW1lKDApLApAQCAtMjYzOSw2ICszMDA5LDcgQEAKICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUoMCksCiAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzKE5VTEwpLAogICAgICAgbUlzQVZDKGZhbHNlKSwKKyAgICAgIG1Jc0hFVkMoZmFsc2UpLAogICAgICAgbU5BTExlbmd0aFNpemUoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtR3JvdXAoTlVMTCksCkBAIC0yNjQ2LDYgKzMwMTcsOCBAQAogICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzKGZhbHNlKSwKICAgICAgIG1TcmNCdWZmZXIoTlVMTCkgewogCisgICAgbWVtc2V0KCZtVHJhY2tGcmFnbWVudEhlYWRlckluZm8sIDAsIHNpemVvZihtVHJhY2tGcmFnbWVudEhlYWRlckluZm8pKTsKKwogICAgIG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJm1DcnlwdG9Nb2RlKTsKICAgICBtRGVmYXVsdElWU2l6ZSA9IDA7CiAgICAgbUZvcm1hdC0+ZmluZEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCAmbURlZmF1bHRJVlNpemUpOwpAQCAtMjY2Myw2ICszMDM2LDcgQEAKICAgICBDSEVDSyhzdWNjZXNzKTsKIAogICAgIG1Jc0FWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgbUlzSEVWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOwogCiAgICAgaWYgKG1Jc0FWQykgewogICAgICAgICB1aW50MzJfdCB0eXBlOwpAQCAtMjY3Nyw2ICszMDUxLDE4IEBACiAKICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIGVuY29kZSB0aGUgbGVuZ3RoIG9mIGEgTkFMIHVuaXQuCiAgICAgICAgIG1OQUxMZW5ndGhTaXplID0gMSArIChwdHJbNF0gJiAzKTsKKyAgICB9IGVsc2UgaWYgKG1Jc0hFVkMpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKKworICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisKKyAgICAgICAgQ0hFQ0soc2l6ZSA+PSA3KTsKKyAgICAgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKXB0clswXSwgMXUpOyAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMQorCisgICAgICAgIG1OQUxMZW5ndGhTaXplID0gMSArIChwdHJbMTQgKyA3XSAmIDMpOwogICAgIH0KIAogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKGtLZXlUcmFja0lELCAmbVRyYWNrSWQpKTsKQEAgLTI4MDAsOSArMzE4NiwyMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7Ci0gICAgICAgICAgICAgICAgLy8gKm9mZnNldCBwb2ludHMgdG8gdGhlIG1kYXQgYm94IGZvbGxvd2luZyB0aGlzIG1vb2YKLSAgICAgICAgICAgICAgICBwYXJzZUNodW5rKG9mZnNldCk7IC8vIGRvZXNuJ3QgYWN0dWFsbHkgcGFyc2UgaXQsIGp1c3QgdXBkYXRlcyBvZmZzZXQKLSAgICAgICAgICAgICAgICBtTmV4dE1vb2ZPZmZzZXQgPSAqb2Zmc2V0OworICAgICAgICAgICAgICAgIC8vICpvZmZzZXQgcG9pbnRzIHRvIHRoZSBib3ggZm9sbG93aW5nIHRoaXMgbW9vZi4gRmluZCB0aGUgbmV4dCBtb29mIGZyb20gdGhlcmUuCisKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBoZHIsIDgpIDwgOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IG50b2hsKGhkclswXSk7CisgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRNb29mT2Zmc2V0ID0gKm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjg2MSw3ICszMjU4LDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSkgeworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplcygKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgLyogc2l6ZSAqLykgewogICAgIEFMT0dWKCJwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZXMiKTsKICAgICAvLyAxNDQ5Ni0xMiA4LjcuMTIKICAgICB1aW50OF90IHZlcnNpb247CkBAIC0yOTIzLDcgKzMzMjEsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpIHsKK3N0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cygKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgLyogc2l6ZSAqLykgewogICAgIEFMT0dWKCJwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cyIpOwogICAgIC8vIDE0NDk2LTEyIDguNy4xMwogICAgIHVpbnQ4X3QgdmVyc2lvbjsKQEAgLTMyMjIsOCArMzYyMSw4IEBACiAgICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCiAgICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUR1cmF0aW9uUHJlc2VudCkgewogICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRHVyYXRpb247CisgICAgfSBlbHNlIGlmIChtVHJleCkgeworICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG1UcmV4LT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbjsKICAgICB9CiAKICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlU2l6ZVByZXNlbnQpIHsKQEAgLTMyNTAsNyArMzY0OSw3IEBACiAgICAgICAgIHNhbXBsZUN0c09mZnNldCA9IDA7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPCBzYW1wbGVDb3VudCAqIGJ5dGVzUGVyU2FtcGxlKSB7CisgICAgaWYgKHNpemUgPCAob2ZmNjRfdClzYW1wbGVDb3VudCAqIGJ5dGVzUGVyU2FtcGxlKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtMzI4NCw3ICszNjgzLDcgQEAKICAgICAgICAgICAgIG9mZnNldCArPSA0OwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoImFkZGluZyBzYW1wbGUgJWQgYXQgb2Zmc2V0IDB4JTA4bGx4LCBzaXplICV1LCBkdXJhdGlvbiAldSwgIgorICAgICAgICBBTE9HVigiYWRkaW5nIHNhbXBsZSAlZCBhdCBvZmZzZXQgMHglMDgiIFBSSXg2NCAiLCBzaXplICV1LCBkdXJhdGlvbiAldSwgIgogICAgICAgICAgICAgICAiIGZsYWdzIDB4JTA4eCIsIGkgKyAxLAogICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIHNhbXBsZVNpemUsIHNhbXBsZUR1cmF0aW9uLAogICAgICAgICAgICAgICAgIChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgaSA9PSAwCkBAIC0zMjkyLDYgKzM2OTEsNyBAQAogICAgICAgICB0bXAub2Zmc2V0ID0gZGF0YU9mZnNldDsKICAgICAgICAgdG1wLnNpemUgPSBzYW1wbGVTaXplOwogICAgICAgICB0bXAuZHVyYXRpb24gPSBzYW1wbGVEdXJhdGlvbjsKKyAgICAgICAgdG1wLmNvbXBvc2l0aW9uT2Zmc2V0ID0gc2FtcGxlQ3RzT2Zmc2V0OwogICAgICAgICBtQ3VycmVudFNhbXBsZXMuYWRkKHRtcCk7CiAKICAgICAgICAgZGF0YU9mZnNldCArPSBzYW1wbGVTaXplOwpAQCAtMzM2Myw3ICszNzYzLDcgQEAKIAogICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKAotICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMgKiBtVGltZXNjYWxlIC8gMTAwMDAwMCwKKyAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAxMDAwMDAwLCBtVGltZXNjYWxlLAogICAgICAgICAgICAgICAgICZzYW1wbGVJbmRleCwgZmluZEZsYWdzKTsKIAogICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7CkBAIC0zNDI1LDcgKzM4MjUsNyBAQAogCiAgICAgb2ZmNjRfdCBvZmZzZXQ7CiAgICAgc2l6ZV90IHNpemU7Ci0gICAgdWludDMyX3QgY3RzOworICAgIHVpbnQzMl90IGN0cywgc3R0czsKICAgICBib29sIGlzU3luY1NhbXBsZTsKICAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwogICAgIGlmIChtQnVmZmVyID09IE5VTEwpIHsKQEAgLTM0MzMsNyArMzgzMyw3IEBACiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgIG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmY3RzLCAmaXNTeW5jU2FtcGxlKTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZjdHMsICZpc1N5bmNTYW1wbGUsICZzdHRzKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMzQ1MSw3ICszODUxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghbUlzQVZDIHx8IG1XYW50c05BTEZyYWdtZW50cykgeworICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQykgfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CiAgICAgICAgIGlmIChuZXdCdWZmZXIpIHsKICAgICAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPQogICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7CkBAIC0zNDY4LDYgKzM4NjgsOCBAQAogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7CiAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKQEAgLTM0ODEsNyArMzg4Myw3IEBACiAgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1Jc0FWQykgeworICAgICAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewogICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIApAQCAtMzU1NiwxMiArMzk1OCwxMiBAQAogICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CiAKICAgICAgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOworICAgICAgICAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOwogICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOwogICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKICAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwogICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgewpAQCAtMzU5Myw2ICszOTk1LDggQEAKICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7CiAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKQEAgLTM2MzUsNyArNDAzOSw3IEBACiAgICAgICAgICAgICAgICAgY29uc3QgU2lkeEVudHJ5ICpzZSA9ICZtU2VnbWVudHNbaV07CiAgICAgICAgICAgICAgICAgaWYgKHRvdGFsVGltZSArIHNlLT5tRHVyYXRpb25VcyA+IHNlZWtUaW1lVXMpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCB0aW1lIGlzIHNvbWV3aGVyZSBpbiB0aGlzIHNlZ21lbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQykgfHwKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQyAmJiBzZWVrVGltZVVzID4gdG90YWxUaW1lKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vla1RpbWVVcyAtIHRvdGFsVGltZSkgPiAodG90YWxUaW1lICsgc2UtPm1EdXJhdGlvblVzIC0gc2Vla1RpbWVVcykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0ZWQgbmV4dCBzeW5jLCBvciBjbG9zZXN0IHN5bmMgYW5kIGl0IHdhcyBjbG9zZXIgdG8gdGhlIGVuZCBvZgpAQCAtMzY0OCwxMSArNDA1MiwxOSBAQAogICAgICAgICAgICAgICAgIHRvdGFsVGltZSArPSBzZS0+bUR1cmF0aW9uVXM7CiAgICAgICAgICAgICAgICAgdG90YWxPZmZzZXQgKz0gc2UtPm1TaXplOwogICAgICAgICAgICAgfQotICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSB0b3RhbE9mZnNldDsKLSAgICAgICAgbUN1cnJlbnRTYW1wbGVzLmNsZWFyKCk7Ci0gICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwotICAgICAgICBwYXJzZUNodW5rKCZ0b3RhbE9mZnNldCk7Ci0gICAgICAgIG1DdXJyZW50VGltZSA9IHRvdGFsVGltZSAqIG1UaW1lc2NhbGUgLyAxMDAwMDAwbGw7CisgICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSB0b3RhbE9mZnNldDsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5jbGVhcigpOworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CisgICAgICAgICAgICBwYXJzZUNodW5rKCZ0b3RhbE9mZnNldCk7CisgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSB0b3RhbFRpbWUgKiBtVGltZXNjYWxlIC8gMTAwMDAwMGxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gd2l0aG91dCBzaWR4IGJveGVzLCB3ZSBjYW4gb25seSBzZWVrIHRvIDAKKyAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IG1GaXJzdE1vb2ZPZmZzZXQ7CisgICAgICAgICAgICBtQ3VycmVudFNhbXBsZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOworICAgICAgICAgICAgb2ZmNjRfdCB0bXAgPSBtQ3VycmVudE1vb2ZPZmZzZXQ7CisgICAgICAgICAgICBwYXJzZUNodW5rKCZ0bXApOworICAgICAgICAgICAgbUN1cnJlbnRUaW1lID0gMDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKQEAgLTM2NjQsNyArNDA3Niw3IEBACiAgICAgfQogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOwotICAgIHNpemVfdCBzaXplOworICAgIHNpemVfdCBzaXplID0gMDsKICAgICB1aW50MzJfdCBjdHMgPSAwOwogICAgIGJvb2wgaXNTeW5jU2FtcGxlID0gZmFsc2U7CiAgICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKQEAgLTM2NzIsMjIgKzQwODQsMjQgQEAKICAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKIAogICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgZnJhZ21lbnQKLSAgICAgICAgICAgIFNhbXBsZSBsYXN0U2FtcGxlID0gbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlcy5zaXplKCkgLSAxXTsKLSAgICAgICAgICAgIG9mZjY0X3QgbmV4dE1vb2YgPSBtTmV4dE1vb2ZPZmZzZXQ7IC8vIGxhc3RTYW1wbGUub2Zmc2V0ICsgbGFzdFNhbXBsZS5zaXplOworICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IGZyYWdtZW50IGlmIHRoZXJlIGlzIG9uZQorICAgICAgICAgICAgaWYgKG1OZXh0TW9vZk9mZnNldCA8PSBtQ3VycmVudE1vb2ZPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZjY0X3QgbmV4dE1vb2YgPSBtTmV4dE1vb2ZPZmZzZXQ7CiAgICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSBuZXh0TW9vZjsKICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5jbGVhcigpOwogICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAgICAgICAgICAgICBwYXJzZUNodW5rKCZuZXh0TW9vZik7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBTYW1wbGUgKnNtcGwgPSAmbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlSW5kZXhdOwogICAgICAgICBvZmZzZXQgPSBzbXBsLT5vZmZzZXQ7CiAgICAgICAgIHNpemUgPSBzbXBsLT5zaXplOwotICAgICAgICBjdHMgPSBtQ3VycmVudFRpbWU7CisgICAgICAgIGN0cyA9IG1DdXJyZW50VGltZSArIHNtcGwtPmNvbXBvc2l0aW9uT2Zmc2V0OwogICAgICAgICBtQ3VycmVudFRpbWUgKz0gc21wbC0+ZHVyYXRpb247CiAgICAgICAgIGlzU3luY1NhbXBsZSA9IChtQ3VycmVudFNhbXBsZUluZGV4ID09IDApOyAvLyBYWFgKIApAQCAtMzcxOSw3ICs0MTMzLDcgQEAKICAgICAgICAgYnVmbWV0YS0+c2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBtQ3J5cHRvS2V5LCAxNik7CiAgICAgfQogCi0gICAgaWYgKCFtSXNBVkMgfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CisgICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKXx8IG1XYW50c05BTEZyYWdtZW50cykgewogICAgICAgICBpZiAobmV3QnVmZmVyKSB7CiAgICAgICAgICAgICBpZiAoIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIHNpemUpKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMzc0NCw2ICs0MTU4LDggQEAKICAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKQEAgLTM3NTcsNyArNDE3Myw3IEBACiAgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1Jc0FWQykgeworICAgICAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewogICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIApAQCAtMzkwMyw2ICs0MzE5LDggQEAKIAogICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCiAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KApAQCAtMzk2NSw2ICs0MzgzLDggQEAKICAgICAgICAgRk9VUkNDKCdpJywgJ3MnLCAnbycsICdtJyksCiAgICAgICAgIEZPVVJDQygnaScsICdzJywgJ28nLCAnMicpLAogICAgICAgICBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKSwKKyAgICAgICAgRk9VUkNDKCdoJywgJ3YnLCAnYycsICcxJyksCisgICAgICAgIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpLAogICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICdwJywgJzQnKSwKICAgICAgICAgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICcxJyksCiAgICAgICAgIEZPVVJDQygnbScsICdwJywgJzQnLCAnMicpLApAQCAtNDAzNiw3ICs0NDU2LDcgQEAKIAogICAgICAgICBjaGFyIGNodW5rc3RyaW5nWzVdOwogICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rVHlwZSwgY2h1bmtzdHJpbmcpOwotICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJWxsZCBAICVsbGQiLCBjaHVua3N0cmluZywgY2h1bmtTaXplLCBvZmZzZXQpOworICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgb2Zmc2V0KTsKICAgICAgICAgc3dpdGNoIChjaHVua1R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3QnLCAneScsICdwJyk6CiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggNDI4ODVkZC4uNGI4NDQwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtMTYsMTIgKzE2LDE3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTVBFRzRXcml0ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgpAQCAtMzMsMTMgKzM4LDE1IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKIAorI2RlZmluZSBXQVJOX1VOTEVTUyhjb25kaXRpb24sIG1lc3NhZ2UsIC4uLikgXAorKCAoQ09ORElUSU9OKGNvbmRpdGlvbikpID8gZmFsc2UgOiAoeyBcCisgICAgQUxPR1coIkNvbmRpdGlvbiAlcyBmYWlsZWQgIiAgbWVzc2FnZSwgI2NvbmRpdGlvbiwgIyNfX1ZBX0FSR1NfXyk7IFwKKyAgICB0cnVlOyBcCit9KSkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluU3RyZWFtYWJsZUZpbGVTaXplSW5CeXRlcyA9IDUgKiAxMDI0ICogMTAyNDsKQEAgLTQwOCw3ICs0MTUsNyBAQAogfQogCiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OmR1bXAoCi0gICAgICAgIGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QgeworICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qIGFyZ3MgKi8pIGNvbnN0IHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKQEAgLTQxOSw3ICs0MjYsNyBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgICAgZnJhbWVzIGVuY29kZWQgOiAlZFxuIiwgbVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgICAgZHVyYXRpb24gZW5jb2RlZCA6ICVsbGQgdXNcbiIsIG1UcmFja0R1cmF0aW9uVXMpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgICBkdXJhdGlvbiBlbmNvZGVkIDogJSIgUFJJZDY0ICIgdXNcbiIsIG1UcmFja0R1cmF0aW9uVXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIHJldHVybiBPSzsKQEAgLTQzNCw3ICs0NDEsNyBAQAogCiAgICAgLy8gQXQgbW9zdCAyIHRyYWNrcyBjYW4gYmUgc3VwcG9ydGVkLgogICAgIGlmIChtVHJhY2tzLnNpemUoKSA+PSAyKSB7Ci0gICAgICAgIEFMT0dFKCJUb28gbWFueSB0cmFja3MgKCVkKSB0byBhZGQiLCBtVHJhY2tzLnNpemUoKSk7CisgICAgICAgIEFMT0dFKCJUb28gbWFueSB0cmFja3MgKCV6dSkgdG8gYWRkIiwgbVRyYWNrcy5zaXplKCkpOwogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCkBAIC01NDgsOCArNTU1LDggQEAKICAgICAgICAgc2l6ZSA9IE1BWF9NT09WX0JPWF9TSVpFOwogICAgIH0KIAotICAgIEFMT0dJKCJsaW1pdHM6ICVsbGQvJWxsZCBieXRlcy91cywgYml0IHJhdGU6ICVkIGJwcyBhbmQgdGhlIGVzdGltYXRlZCIKLSAgICAgICAgICIgbW9vdiBzaXplICVsbGQgYnl0ZXMiLAorICAgIEFMT0dJKCJsaW1pdHM6ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCAiIGJ5dGVzL3VzLCBiaXQgcmF0ZTogJWQgYnBzIGFuZCB0aGUiCisgICAgICAgICAiIGVzdGltYXRlZCBtb292IHNpemUgJSIgUFJJZDY0ICIgYnl0ZXMiLAogICAgICAgICAgbU1heEZpbGVTaXplTGltaXRCeXRlcywgbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMsIGJpdFJhdGUsIHNpemUpOwogICAgIHJldHVybiBmYWN0b3IgKiBzaXplOwogfQpAQCAtNTg1LDggKzU5Miw4IEBACiAgICAgICAgIC8vIElmIGZpbGUgc2l6ZSBpcyBzZXQgdG8gYmUgbGFyZ2VyIHRoYW4gdGhlIDMyIGJpdCBmaWxlCiAgICAgICAgIC8vIHNpemUgbGltaXQsIHRyZWF0IGl0IGFzIGFuIGVycm9yLgogICAgICAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyA+IGtNYXgzMkJpdEZpbGVTaXplKSB7Ci0gICAgICAgICAgICBBTE9HVygiMzItYml0IGZpbGUgc2l6ZSBsaW1pdCAoJWxsZCBieXRlcykgdG9vIGJpZy4gIgotICAgICAgICAgICAgICAgICAiSXQgaXMgY2hhbmdlZCB0byAlbGxkIGJ5dGVzIiwKKyAgICAgICAgICAgIEFMT0dXKCIzMi1iaXQgZmlsZSBzaXplIGxpbWl0ICglIiBQUklkNjQgIiBieXRlcykgdG9vIGJpZy4gIgorICAgICAgICAgICAgICAgICAiSXQgaXMgY2hhbmdlZCB0byAlIiBQUklkNjQgIiBieXRlcyIsCiAgICAgICAgICAgICAgICAgbU1heEZpbGVTaXplTGltaXRCeXRlcywga01heDMyQml0RmlsZVNpemUpOwogICAgICAgICAgICAgbU1heEZpbGVTaXplTGltaXRCeXRlcyA9IGtNYXgzMkJpdEZpbGVTaXplOwogICAgICAgICB9CkBAIC04NDcsNyArODU0LDcgQEAKICAgICB9CiAKICAgICBpZiAobVRyYWNrcy5zaXplKCkgPiAxKSB7Ci0gICAgICAgIEFMT0dEKCJEdXJhdGlvbiBmcm9tIHRyYWNrcyByYW5nZSBpcyBbJWxsZCwgJWxsZF0gdXMiLAorICAgICAgICBBTE9HRCgiRHVyYXRpb24gZnJvbSB0cmFja3MgcmFuZ2UgaXMgWyUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIl0gdXMiLAogICAgICAgICAgICAgbWluRHVyYXRpb25VcywgbWF4RHVyYXRpb25Vcyk7CiAgICAgfQogCkBAIC05NzQsMTMgKzk4MSwxNiBAQAogICAgIGlmIChwYXJhbSAmJiBwYXJhbS0+ZmluZEludDMyKGtLZXlGaWxlVHlwZSwgJmZpbGVUeXBlKSAmJgogICAgICAgICBmaWxlVHlwZSAhPSBPVVRQVVRfRk9STUFUX01QRUdfNCkgewogICAgICAgICB3cml0ZUZvdXJjYygiM2dwNCIpOwotICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXRlSW50MzIoMCk7CiAgICAgICAgIHdyaXRlRm91cmNjKCJpc29tIik7CisgICAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVGb3VyY2MoIm1wNDIiKTsKKyAgICAgICAgd3JpdGVJbnQzMigwKTsKKyAgICAgICAgd3JpdGVGb3VyY2MoImlzb20iKTsKKyAgICAgICAgd3JpdGVGb3VyY2MoIm1wNDIiKTsKICAgICB9CiAKLSAgICB3cml0ZUludDMyKDApOwotICAgIHdyaXRlRm91cmNjKCJpc29tIik7Ci0gICAgd3JpdGVGb3VyY2MoIjNncDQiKTsKICAgICBlbmRCb3goKTsKIH0KIApAQCAtMTMxMSwxMiArMTMyMSwxMiBAQAogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpzZXRTdGFydFRpbWVzdGFtcFVzKGludDY0X3QgdGltZVVzKSB7Ci0gICAgQUxPR0koInNldFN0YXJ0VGltZXN0YW1wVXM6ICVsbGQiLCB0aW1lVXMpOworICAgIEFMT0dJKCJzZXRTdGFydFRpbWVzdGFtcFVzOiAlIiBQUklkNjQsIHRpbWVVcyk7CiAgICAgQ0hFQ0tfR0UodGltZVVzLCAwbGwpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgaWYgKG1TdGFydFRpbWVzdGFtcFVzIDwgMCB8fCBtU3RhcnRUaW1lc3RhbXBVcyA+IHRpbWVVcykgewogICAgICAgICBtU3RhcnRUaW1lc3RhbXBVcyA9IHRpbWVVczsKLSAgICAgICAgQUxPR0koIkVhcmxpZXN0IHRyYWNrIHN0YXJ0aW5nIHRpbWU6ICVsbGQiLCBtU3RhcnRUaW1lc3RhbXBVcyk7CisgICAgICAgIEFMT0dJKCJFYXJsaWVzdCB0cmFjayBzdGFydGluZyB0aW1lOiAlIiBQUklkNjQsIG1TdGFydFRpbWVzdGFtcFVzKTsKICAgICB9CiB9CiAKQEAgLTE0MDYsNyArMTQxNiw3IEBACiAgICAgICAgIHNpemVfdCBzYW1wbGVDb3VudCwgaW50MzJfdCBkdXJhdGlvbikgewogCiAgICAgaWYgKGR1cmF0aW9uID09IDApIHsKLSAgICAgICAgQUxPR1coIjAtZHVyYXRpb24gc2FtcGxlcyBmb3VuZDogJWQiLCBzYW1wbGVDb3VudCk7CisgICAgICAgIEFMT0dXKCIwLWR1cmF0aW9uIHNhbXBsZXMgZm91bmQ6ICV6dSIsIHNhbXBsZUNvdW50KTsKICAgICB9CiAgICAgbVN0dHNUYWJsZUVudHJpZXMtPmFkZChodG9ubChzYW1wbGVDb3VudCkpOwogICAgIG1TdHRzVGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoZHVyYXRpb24pKTsKQEAgLTE1MTcsNyArMTUyNyw3IEBACiAgICAgewogICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMtPmZpbmRJbnQ2NChrS2V5VHJhY2tUaW1lU3RhdHVzLCAmdGltZVVzKSkgewotICAgICAgICAgICAgQUxPR1YoIlJlY2VpdmUgcmVxdWVzdCB0byB0cmFjayBwcm9ncmVzcyBzdGF0dXMgZm9yIGV2ZXJ5ICVsbGQgdXMiLCB0aW1lVXMpOworICAgICAgICAgICAgQUxPR1YoIlJlY2VpdmUgcmVxdWVzdCB0byB0cmFjayBwcm9ncmVzcyBzdGF0dXMgZm9yIGV2ZXJ5ICUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzKTsKICAgICAgICAgICAgIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPSB0aW1lVXM7CiAgICAgICAgICAgICBtVHJhY2tpbmdQcm9ncmVzc1N0YXR1cyA9IHRydWU7CiAgICAgICAgIH0KQEAgLTE1NTEsNyArMTU2MSw3IEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OndyaXRlQ2h1bmtUb0ZpbGUoQ2h1bmsqIGNodW5rKSB7Ci0gICAgQUxPR1YoIndyaXRlQ2h1bmtUb0ZpbGU6ICVsbGQgZnJvbSAlcyB0cmFjayIsCisgICAgQUxPR1YoIndyaXRlQ2h1bmtUb0ZpbGU6ICUiIFBSSWQ2NCAiIGZyb20gJXMgdHJhY2siLAogICAgICAgICBjaHVuay0+bVRpbWVTdGFtcFVzLCBjaHVuay0+bVRyYWNrLT5pc0F1ZGlvKCk/ICJhdWRpbyI6ICJ2aWRlbyIpOwogCiAgICAgaW50MzJfdCBpc0ZpcnN0U2FtcGxlID0gdHJ1ZTsKQEAgLTE1ODYsNyArMTU5Niw3IEBACiAgICAgc2VuZFNlc3Npb25TdW1tYXJ5KCk7CiAKICAgICBtQ2h1bmtJbmZvcy5jbGVhcigpOwotICAgIEFMT0dEKCIlZCBjaHVua3MgYXJlIHdyaXR0ZW4gaW4gdGhlIGxhc3QgYmF0Y2giLCBvdXRzdGFuZGluZ0NodW5rcyk7CisgICAgQUxPR0QoIiV6dSBjaHVua3MgYXJlIHdyaXR0ZW4gaW4gdGhlIGxhc3QgYmF0Y2giLCBvdXRzdGFuZGluZ0NodW5rcyk7CiB9CiAKIGJvb2wgTVBFRzRXcml0ZXI6OmZpbmRDaHVua1RvV3JpdGUoQ2h1bmsgKmNodW5rKSB7CkBAIC0xNzI3LDcgKzE3MzcsNyBAQAogICAgICAgICAgICAgc3RhcnRUaW1lT2Zmc2V0VXMgPSBrSW5pdGlhbERlbGF5VGltZVVzOwogICAgICAgICB9CiAgICAgICAgIHN0YXJ0VGltZVVzICs9IHN0YXJ0VGltZU9mZnNldFVzOwotICAgICAgICBBTE9HSSgiU3RhcnQgdGltZSBvZmZzZXQ6ICVsbGQgdXMiLCBzdGFydFRpbWVPZmZzZXRVcyk7CisgICAgICAgIEFMT0dJKCJTdGFydCB0aW1lIG9mZnNldDogJSIgUFJJZDY0ICIgdXMiLCBzdGFydFRpbWVPZmZzZXRVcyk7CiAgICAgfQogCiAgICAgbWV0YS0+c2V0SW50NjQoa0tleVRpbWUsIHN0YXJ0VGltZVVzKTsKQEAgLTE3NjIsNyArMTc3Miw3IEBACiB9CiAKIHN0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6c3RvcCgpIHsKLSAgICBBTE9HRCgiU3RvcHBpbmcgJXMgdHJhY2siLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CisgICAgQUxPR0QoIiVzIHRyYWNrIHN0b3BwaW5nIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOwogICAgIGlmICghbVN0YXJ0ZWQpIHsKICAgICAgICAgQUxPR0UoIlN0b3AoKSBjYWxsZWQgYnV0IHRyYWNrIGlzIG5vdCBzdGFydGVkIik7CiAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwpAQCAtMTc3MywxOCArMTc4MywxMyBAQAogICAgIH0KICAgICBtRG9uZSA9IHRydWU7CiAKKyAgICBBTE9HRCgiJXMgdHJhY2sgc291cmNlIHN0b3BwaW5nIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOworICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICBBTE9HRCgiJXMgdHJhY2sgc291cmNlIHN0b3BwZWQiLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CisKICAgICB2b2lkICpkdW1teTsKICAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKLQotICAgIHN0YXR1c190IGVyciA9IChzdGF0dXNfdCkgZHVtbXk7Ci0KLSAgICBBTE9HRCgiU3RvcHBpbmcgJXMgdHJhY2sgc291cmNlIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOwotICAgIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwotICAgICAgICBpZiAoZXJyID09IE9LICYmIHN0YXR1cyAhPSBPSyAmJiBzdGF0dXMgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgZXJyID0gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQorICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKIAogICAgIEFMT0dEKCIlcyB0cmFjayBzdG9wcGVkIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOwogICAgIHJldHVybiBlcnI7CkBAIC0xNzk5LDcgKzE4MDQsNyBAQAogICAgIFRyYWNrICp0cmFjayA9IHN0YXRpY19jYXN0PFRyYWNrICo+KG1lKTsKIAogICAgIHN0YXR1c190IGVyciA9IHRyYWNrLT50aHJlYWRFbnRyeSgpOwotICAgIHJldHVybiAodm9pZCAqKSBlcnI7CisgICAgcmV0dXJuICh2b2lkICopKHVpbnRwdHJfdCllcnI7CiB9CiAKIHN0YXRpYyB2b2lkIGdldE5hbFVuaXRUeXBlKHVpbnQ4X3QgYnl0ZSwgdWludDhfdCogdHlwZSkgewpAQCAtMTgxMiw3ICsxODE3LDcgQEAKIHN0YXRpYyBjb25zdCB1aW50OF90ICpmaW5kTmV4dFN0YXJ0Q29kZSgKICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkgewogCi0gICAgQUxPR1YoImZpbmROZXh0U3RhcnRDb2RlOiAlcCAlZCIsIGRhdGEsIGxlbmd0aCk7CisgICAgQUxPR1YoImZpbmROZXh0U3RhcnRDb2RlOiAlcCAlenUiLCBkYXRhLCBsZW5ndGgpOwogCiAgICAgc2l6ZV90IGJ5dGVzTGVmdCA9IGxlbmd0aDsKICAgICB3aGlsZSAoYnl0ZXNMZWZ0ID4gNCAgJiYKQEAgLTE4NzEsNyArMTg3Niw3IEBACiAgICAgLy8gMiBieXRlcyBmb3IgZWFjaCBvZiB0aGUgcGFyYW1ldGVyIHNldCBsZW5ndGggZmllbGQKICAgICAvLyBwbHVzIHRoZSA3IGJ5dGVzIGZvciB0aGUgaGVhZGVyCiAgICAgaWYgKHNpemUgPCA0ICsgNykgewotICAgICAgICBBTE9HRSgiQ29kZWMgc3BlY2lmaWMgZGF0YSBsZW5ndGggdG9vIHNob3J0OiAlZCIsIHNpemUpOworICAgICAgICBBTE9HRSgiQ29kZWMgc3BlY2lmaWMgZGF0YSBsZW5ndGggdG9vIHNob3J0OiAlenUiLCBzaXplKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKQEAgLTE5NDAsNyArMTk0NSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoblNlcVBhcmFtU2V0cyA+IDB4MUYpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUb28gbWFueSBzZXEgcGFyYW1ldGVyIHNldHMgKCVkKSBmb3VuZCIsIG5TZXFQYXJhbVNldHMpOworICAgICAgICAgICAgQUxPR0UoIlRvbyBtYW55IHNlcSBwYXJhbWV0ZXIgc2V0cyAoJXp1KSBmb3VuZCIsIG5TZXFQYXJhbVNldHMpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0KQEAgLTE5NTMsNyArMTk1OCw3IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIGlmIChuUGljUGFyYW1TZXRzID4gMHhGRikgewotICAgICAgICAgICAgQUxPR0UoIlRvbyBtYW55IHBpYyBwYXJhbWV0ZXIgc2V0cyAoJWQpIGZvdW5kIiwgblBpY1BhcmFtU2V0cyk7CisgICAgICAgICAgICBBTE9HRSgiVG9vIG1hbnkgcGljIHBhcmFtZXRlciBzZXRzICglemQpIGZvdW5kIiwgblBpY1BhcmFtU2V0cyk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfQpAQCAtMTk4Myw3ICsxOTg4LDcgQEAKICAgICB9CiAKICAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgQUxPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJWQiLCBzaXplKTsKKyAgICAgICAgQUxPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJXp1Iiwgc2l6ZSk7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCkBAIC0yMDk5LDYgKzIxMDQsNyBAQAogCiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICBjb25zdCBjaGFyICp0cmFja05hbWUgPSBtSXNBdWRpbyA/ICJBdWRpbyIgOiAiVmlkZW8iOwogICAgIHdoaWxlICghbURvbmUgJiYgKGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcikpID09IE9LKSB7CiAgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMjE5NCwxNSArMjIwMCwyNyBAQAogCiAgICAgICAgIGlmIChtUmVzdW1lZCkgewogICAgICAgICAgICAgaW50NjRfdCBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPSB0aW1lc3RhbXBVcyAtIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKLSAgICAgICAgICAgIENIRUNLX0dFKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcywgMGxsKTsKKyAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpbnQ2NF90IHBhdXNlZER1cmF0aW9uVXMgPSBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgLSBtVHJhY2tEdXJhdGlvblVzOwotICAgICAgICAgICAgQ0hFQ0tfR0UocGF1c2VkRHVyYXRpb25VcywgbGFzdER1cmF0aW9uVXMpOworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHBhdXNlZER1cmF0aW9uVXMgPj0gbGFzdER1cmF0aW9uVXMsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyArPSBwYXVzZWREdXJhdGlvblVzIC0gbGFzdER1cmF0aW9uVXM7CiAgICAgICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwotICAgICAgICBDSEVDS19HRSh0aW1lc3RhbXBVcywgMGxsKTsKKyAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHRpbWVzdGFtcFVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoIW1Jc0F1ZGlvKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29tcG9zaXRpb24gdGltZTogdGltZXN0YW1wVXMKQEAgLTIyMTQsMTUgKzIyMzIsMjMgQEAKICAgICAgICAgICAgIGRlY29kaW5nVGltZVVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKICAgICAgICAgICAgIGN0dHNPZmZzZXRUaW1lVXMgPQogICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyArIGtNYXhDdHRzT2Zmc2V0VGltZVVzIC0gZGVjb2RpbmdUaW1lVXM7Ci0gICAgICAgICAgICBDSEVDS19HRShjdHRzT2Zmc2V0VGltZVVzLCAwbGwpOworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGN0dHNPZmZzZXRUaW1lVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB0aW1lc3RhbXBVcyA9IGRlY29kaW5nVGltZVVzOwotICAgICAgICAgICAgQUxPR1YoImRlY29kaW5nIHRpbWU6ICVsbGQgYW5kIGN0dHMgb2Zmc2V0IHRpbWU6ICVsbGQiLAorICAgICAgICAgICAgQUxPR1YoImRlY29kaW5nIHRpbWU6ICUiIFBSSWQ2NCAiIGFuZCBjdHRzIG9mZnNldCB0aW1lOiAlIiBQUklkNjQsCiAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGN0dHNPZmZzZXRUaW1lVXMpOwogCiAgICAgICAgICAgICAvLyBVcGRhdGUgY3R0cyBib3ggdGFibGUgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICBjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyA9CiAgICAgICAgICAgICAgICAgICAgIChjdHRzT2Zmc2V0VGltZVVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTDsKLSAgICAgICAgICAgIENIRUNLX0xFKGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzLCAweDBGRkZGRkZGRkxMKTsKKyAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyA8PSAweDBGRkZGRkZGRkxMLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBmaXJzdCBjdHRzIHRhYmxlIGVudHJ5IHRvIGhhdmUgb25lIHNpbmdsZSBlbnRyeQogICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIGRvIGFkanVzdG1lbnQgZm9yIHRoZSBpbml0aWFsIHRyYWNrIHN0YXJ0CkBAIC0yMjYwLDkgKzIyODYsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIENIRUNLX0dFKHRpbWVzdGFtcFVzLCAwbGwpOwotICAgICAgICBBTE9HVigiJXMgbWVkaWEgdGltZSBzdGFtcDogJWxsZCBhbmQgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uICVsbGQiLAotICAgICAgICAgICAgICAgIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iLCB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKKyAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHRpbWVzdGFtcFVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiJXMgbWVkaWEgdGltZSBzdGFtcDogJSIgUFJJZDY0ICIgYW5kIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbiAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgdHJhY2tOYW1lLCB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKICAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbVRyYWNrRHVyYXRpb25VcykgewogICAgICAgICAgICAgbVRyYWNrRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOwogICAgICAgICB9CkBAIC0yMjc2LDExICsyMzA2LDI4IEBACiAgICAgICAgICAgICAoKHRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCAtCiAgICAgICAgICAgICAgICAgKGxhc3RUaW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwpOwogICAgICAgICBpZiAoY3VyckR1cmF0aW9uVGlja3MgPCAwbGwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJ0aW1lc3RhbXBVcyAlbGxkIDwgbGFzdFRpbWVzdGFtcFVzICVsbGQgZm9yICVzIHRyYWNrIiwKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgbGFzdFRpbWVzdGFtcFVzLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CisgICAgICAgICAgICBBTE9HRSgidGltZXN0YW1wVXMgJSIgUFJJZDY0ICIgPCBsYXN0VGltZXN0YW1wVXMgJSIgUFJJZDY0ICIgZm9yICVzIHRyYWNrIiwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgbGFzdFRpbWVzdGFtcFVzLCB0cmFja05hbWUpOworICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOwogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBpZiB0aGUgZHVyYXRpb24gaXMgZGlmZmVyZW50IGZvciB0aGlzIHNhbXBsZSwgc2VlIGlmIGl0IGlzIGNsb3NlIGVub3VnaCB0byB0aGUgcHJldmlvdXMKKyAgICAgICAgLy8gZHVyYXRpb24gdGhhdCB3ZSBjYW4gZnVkZ2UgaXQgYW5kIHVzZSB0aGUgc2FtZSB2YWx1ZSwgdG8gYXZvaWQgZmlsbGluZyB0aGUgc3R0cyB0YWJsZQorICAgICAgICAvLyB3aXRoIGxvdHMgb2YgbmVhci1pZGVudGljYWwgZW50cmllcy4KKyAgICAgICAgLy8gImNsb3NlIGVub3VnaCIgaGVyZSBtZWFucyB0aGF0IHRoZSBjdXJyZW50IGR1cmF0aW9uIG5lZWRzIHRvIGJlIGFkanVzdGVkIGJ5IGxlc3MKKyAgICAgICAgLy8gdGhhbiAwLjEgbWlsbGlzZWNvbmRzCisgICAgICAgIGlmIChsYXN0RHVyYXRpb25UaWNrcyAmJiAoY3VyckR1cmF0aW9uVGlja3MgIT0gbGFzdER1cmF0aW9uVGlja3MpKSB7CisgICAgICAgICAgICBpbnQ2NF90IGRlbHRhVXMgPSAoKGxhc3REdXJhdGlvblRpY2tzIC0gY3VyckR1cmF0aW9uVGlja3MpICogMTAwMDAwMExMCisgICAgICAgICAgICAgICAgICAgICsgKG1UaW1lU2NhbGUgLyAyKSkgLyBtVGltZVNjYWxlOworICAgICAgICAgICAgaWYgKGRlbHRhVXMgPiAtMTAwICYmIGRlbHRhVXMgPCAxMDApIHsKKyAgICAgICAgICAgICAgICAvLyB1c2UgcHJldmlvdXMgdGlja3MsIGFuZCBhZGp1c3QgdGltZXN0YW1wIGFzIGlmIGl0IHdhcyBhY3R1YWxseSB0aGF0IG51bWJlcgorICAgICAgICAgICAgICAgIC8vIG9mIHRpY2tzCisgICAgICAgICAgICAgICAgY3VyckR1cmF0aW9uVGlja3MgPSBsYXN0RHVyYXRpb25UaWNrczsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyArPSBkZWx0YVVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgbVN0c3pUYWJsZUVudHJpZXMtPmFkZChodG9ubChzYW1wbGVTaXplKSk7CiAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA+IDIpIHsKIApAQCAtMjMwMCw4ICsyMzQ3LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHByZXZpb3VzU2FtcGxlU2l6ZSA9IHNhbXBsZVNpemU7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIiVzIHRpbWVzdGFtcFVzL2xhc3RUaW1lc3RhbXBVczogJWxsZC8lbGxkIiwKLSAgICAgICAgICAgICAgICBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIiwgdGltZXN0YW1wVXMsIGxhc3RUaW1lc3RhbXBVcyk7CisgICAgICAgIEFMT0dWKCIlcyB0aW1lc3RhbXBVcy9sYXN0VGltZXN0YW1wVXM6ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICB0cmFja05hbWUsIHRpbWVzdGFtcFVzLCBsYXN0VGltZXN0YW1wVXMpOwogICAgICAgICBsYXN0RHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzIC0gbGFzdFRpbWVzdGFtcFVzOwogICAgICAgICBsYXN0RHVyYXRpb25UaWNrcyA9IGN1cnJEdXJhdGlvblRpY2tzOwogICAgICAgICBsYXN0VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKQEAgLTI0MDYsOSArMjQ1Myw5IEBACiAgICAgc2VuZFRyYWNrU3VtbWFyeShoYXNNdWx0aXBsZVRyYWNrcyk7CiAKICAgICBBTE9HSSgiUmVjZWl2ZWQgdG90YWwvMC1sZW5ndGggKCVkLyVkKSBidWZmZXJzIGFuZCBlbmNvZGVkICVkIGZyYW1lcy4gLSAlcyIsCi0gICAgICAgICAgICBjb3VudCwgblplcm9MZW5ndGhGcmFtZXMsIG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpLCBtSXNBdWRpbz8gImF1ZGlvIjogInZpZGVvIik7CisgICAgICAgICAgICBjb3VudCwgblplcm9MZW5ndGhGcmFtZXMsIG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpLCB0cmFja05hbWUpOwogICAgIGlmIChtSXNBdWRpbykgewotICAgICAgICBBTE9HSSgiQXVkaW8gdHJhY2sgZHJpZnQgdGltZTogJWxsZCB1cyIsIG1Pd25lci0+Z2V0RHJpZnRUaW1lVXMoKSk7CisgICAgICAgIEFMT0dJKCJBdWRpbyB0cmFjayBkcmlmdCB0aW1lOiAlIiBQUklkNjQgIiB1cyIsIG1Pd25lci0+Z2V0RHJpZnRUaW1lVXMoKSk7CiAgICAgfQogCiAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CkBAIC0yNDkxLDExICsyNTM4LDExIEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp0cmFja1Byb2dyZXNzU3RhdHVzKGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIpIHsKLSAgICBBTE9HVigidHJhY2tQcm9ncmVzc1N0YXR1czogJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgQUxPR1YoInRyYWNrUHJvZ3Jlc3NTdGF0dXM6ICUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzKTsKIAogICAgIGlmIChtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID4gMCAmJgogICAgICAgICB0aW1lVXMgLSBtUHJldmlvdXNUcmFja1RpbWVVcyA+PSBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKSB7Ci0gICAgICAgIEFMT0dWKCJGaXJlIHRpbWUgdHJhY2tpbmcgcHJvZ3Jlc3Mgc3RhdHVzIGF0ICVsbGQgdXMiLCB0aW1lVXMpOworICAgICAgICBBTE9HVigiRmlyZSB0aW1lIHRyYWNraW5nIHByb2dyZXNzIHN0YXR1cyBhdCAlIiBQUklkNjQgIiB1cyIsIHRpbWVVcyk7CiAgICAgICAgIG1Pd25lci0+dHJhY2tQcm9ncmVzc1N0YXR1cyhtVHJhY2tJZCwgdGltZVVzIC0gbVByZXZpb3VzVHJhY2tUaW1lVXMsIGVycik7CiAgICAgICAgIG1QcmV2aW91c1RyYWNrVGltZVVzID0gdGltZVVzOwogICAgIH0KQEAgLTI1MjksMTMgKzI1NzYsMTMgQEAKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6c2V0RHJpZnRUaW1lVXMoaW50NjRfdCBkcmlmdFRpbWVVcykgewotICAgIEFMT0dWKCJzZXREcmlmdFRpbWVVczogJWxsZCB1cyIsIGRyaWZ0VGltZVVzKTsKKyAgICBBTE9HVigic2V0RHJpZnRUaW1lVXM6ICUiIFBSSWQ2NCAiIHVzIiwgZHJpZnRUaW1lVXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CiAgICAgbURyaWZ0VGltZVVzID0gZHJpZnRUaW1lVXM7CiB9CiAKIGludDY0X3QgTVBFRzRXcml0ZXI6OmdldERyaWZ0VGltZVVzKCkgewotICAgIEFMT0dWKCJnZXREcmlmdFRpbWVVczogJWxsZCB1cyIsIG1EcmlmdFRpbWVVcyk7CisgICAgQUxPR1YoImdldERyaWZ0VGltZVVzOiAlIiBQUklkNjQgIiB1cyIsIG1EcmlmdFRpbWVVcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbURyaWZ0VGltZVVzOwogfQpAQCAtMjk5MSw3ICszMDM4LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEFMT0dWKCJjdHRzIGJveCBoYXMgJWQgZW50cmllcyB3aXRoIHJhbmdlIFslbGxkLCAlbGxkXSIsCisgICAgQUxPR1YoImN0dHMgYm94IGhhcyAlZCBlbnRyaWVzIHdpdGggcmFuZ2UgWyUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIl0iLAogICAgICAgICAgICAgbUN0dHNUYWJsZUVudHJpZXMtPmNvdW50KCksIG1NaW5DdHRzT2Zmc2V0VGltZVVzLCBtTWF4Q3R0c09mZnNldFRpbWVVcyk7CiAKICAgICBtT3duZXItPmJlZ2luQm94KCJjdHRzIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmNwcAppbmRleCAyNDg0MjEyLi5kNjgwZTBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5jcHAKQEAgLTM2LDcgKzM2LDcgQEAKICAgICBDSEVDSyhtQ3VycmVudE1lZGlhQnVmZmVyID09IE5VTEwpOwogfQogCi1zdGF0dXNfdCBNZWRpYUFkYXB0ZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IE1lZGlhQWRhcHRlcjo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUFkYXB0ZXJMb2NrKTsKICAgICBpZiAoIW1TdGFydGVkKSB7CiAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKQEAgLTc1LDcgKzc1LDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFBZGFwdGVyOjpyZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKiAvKiBvcHRpb25zICovKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1BZGFwdGVyTG9jayk7CiAgICAgaWYgKCFtU3RhcnRlZCkgewogICAgICAgICBBTE9HVigiUmVhZCBiZWZvcmUgZXZlbiBzdGFydGVkISIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuY3BwCmluZGV4IDExYjgwYmYuLjFmODBhNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPHN5cy9hdG9taWNzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtOTIsNyArOTEsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaW50IHByZXZDb3VudCA9IF9fYXRvbWljX2RlYygmbVJlZkNvdW50KTsKKyAgICBpbnQgcHJldkNvdW50ID0gX19zeW5jX2ZldGNoX2FuZF9zdWIoJm1SZWZDb3VudCwgMSk7CiAgICAgaWYgKHByZXZDb3VudCA9PSAxKSB7CiAgICAgICAgIGlmIChtT2JzZXJ2ZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlIHRoaXM7CkBAIC0xMTIsNyArMTExLDcgQEAKIH0KIAogdm9pZCBNZWRpYUJ1ZmZlcjo6YWRkX3JlZigpIHsKLSAgICAodm9pZCkgX19hdG9taWNfaW5jKCZtUmVmQ291bnQpOworICAgICh2b2lkKSBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmbVJlZkNvdW50LCAxKTsKIH0KIAogdm9pZCAqTWVkaWFCdWZmZXI6OmRhdGEoKSBjb25zdCB7CkBAIC0xMzUsNyArMTM0LDcgQEAKIAogdm9pZCBNZWRpYUJ1ZmZlcjo6c2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIHsKICAgICBpZiAoKG1HcmFwaGljQnVmZmVyID09IE5VTEwpICYmIChvZmZzZXQgKyBsZW5ndGggPiBtU2l6ZSkpIHsKLSAgICAgICAgQUxPR0UoIm9mZnNldCA9ICVkLCBsZW5ndGggPSAlZCwgbVNpemUgPSAlZCIsIG9mZnNldCwgbGVuZ3RoLCBtU2l6ZSk7CisgICAgICAgIEFMT0dFKCJvZmZzZXQgPSAlenUsIGxlbmd0aCA9ICV6dSwgbVNpemUgPSAlenUiLCBvZmZzZXQsIGxlbmd0aCwgbVNpemUpOwogICAgIH0KICAgICBDSEVDSygobUdyYXBoaWNCdWZmZXIgIT0gTlVMTCkgfHwgKG9mZnNldCArIGxlbmd0aCA8PSBtU2l6ZSkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuY3BwCmluZGV4IDgwYWFlNTEuLjZhYzZkNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuY3BwCkBAIC01NSw3ICs1NSw4IEBACiAgICAgbUxhc3RCdWZmZXIgPSBidWZmZXI7CiB9CiAKLXN0YXR1c190IE1lZGlhQnVmZmVyR3JvdXA6OmFjcXVpcmVfYnVmZmVyKE1lZGlhQnVmZmVyICoqb3V0KSB7CitzdGF0dXNfdCBNZWRpYUJ1ZmZlckdyb3VwOjphY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGJvb2wgbm9uQmxvY2tpbmcpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgZm9yICg7OykgewpAQCAtNzAsNiArNzEsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmIChub25CbG9ja2luZykgeworICAgICAgICAgICAgKm91dCA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgICAgIH0KKwogICAgICAgICAvLyBBbGwgYnVmZmVycyBhcmUgaW4gdXNlLiBCbG9jayB1bnRpbCBvbmUgb2YgdGhlbSBpcyByZXR1cm5lZCB0byB1cy4KICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IDhhZjFhYWYuLmRmNDdiZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC0xNiwxMiArMTYsMTMgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+Ci0KKyNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogI2luY2x1ZGUgImluY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIgogCisjaW5jbHVkZSA8YmluZGVyL0lCYXR0ZXJ5U3RhdHMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC0zMSw0NSArMzIsMTE5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQnVmZmVyUHJvZHVjZXJXcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L05hdGl2ZVdpbmRvd1dyYXBwZXIuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gc3RhdGljCi1zcDxNZWRpYUNvZGVjPiBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUoCi0gICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgZW5jb2RlcikgewotICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gbmV3IE1lZGlhQ29kZWMobG9vcGVyKTsKLSAgICBpZiAoY29kZWMtPmluaXQobWltZSwgdHJ1ZSAvKiBuYW1lSXNUeXBlICovLCBlbmNvZGVyKSAhPSBPSykgewotICAgICAgICByZXR1cm4gTlVMTDsKK3N0cnVjdCBNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXIgOiBwdWJsaWMgU2luZ2xldG9uPEJhdHRlcnlOb3RpZmllcj4geworICAgIEJhdHRlcnlOb3RpZmllcigpOworCisgICAgdm9pZCBub3RlU3RhcnRWaWRlbygpOworICAgIHZvaWQgbm90ZVN0b3BWaWRlbygpOworICAgIHZvaWQgbm90ZVN0YXJ0QXVkaW8oKTsKKyAgICB2b2lkIG5vdGVTdG9wQXVkaW8oKTsKKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1WaWRlb1JlZkNvdW50OworICAgIGludDMyX3QgbUF1ZGlvUmVmQ291bnQ7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gbUJhdHRlcnlTdGF0U2VydmljZTsKK307CisKK0FORFJPSURfU0lOR0xFVE9OX1NUQVRJQ19JTlNUQU5DRShNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXIpCisKK01lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcjo6QmF0dGVyeU5vdGlmaWVyKCkgOgorICAgIG1WaWRlb1JlZkNvdW50KDApLAorICAgIG1BdWRpb1JlZkNvdW50KDApIHsKKyAgICAvLyBnZXQgYmF0dGVyeSBzZXJ2aWNlCisgICAgY29uc3Qgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbShkZWZhdWx0U2VydmljZU1hbmFnZXIoKSk7CisgICAgaWYgKHNtICE9IE5VTEwpIHsKKyAgICAgICAgY29uc3QgU3RyaW5nMTYgbmFtZSgiYmF0dGVyeXN0YXRzIik7CisgICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQmF0dGVyeVN0YXRzPihzbS0+Z2V0U2VydmljZShuYW1lKSk7CisgICAgICAgIGlmIChtQmF0dGVyeVN0YXRTZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJiYXR0ZXJ5c3RhdHMgc2VydmljZSB1bmF2YWlsYWJsZSEiKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdGFydFZpZGVvKCkgeworICAgIGlmIChtVmlkZW9SZWZDb3VudCA9PSAwICYmIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLT5ub3RlU3RhcnRWaWRlbyhBSURfTUVESUEpOworICAgIH0KKyAgICBtVmlkZW9SZWZDb3VudCsrOworfQorCit2b2lkIE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0b3BWaWRlbygpIHsKKyAgICBpZiAobVZpZGVvUmVmQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygiQmF0dGVyeU5vdGlmaWVyOjpub3RlU3RvcCgpOiB2aWRlbyByZWZjb3VudCBpcyBicm9rZW4hIik7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICByZXR1cm4gY29kZWM7CisgICAgbVZpZGVvUmVmQ291bnQtLTsKKyAgICBpZiAobVZpZGVvUmVmQ291bnQgPT0gMCAmJiBtQmF0dGVyeVN0YXRTZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZS0+bm90ZVN0b3BWaWRlbyhBSURfTUVESUEpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdGFydEF1ZGlvKCkgeworICAgIGlmIChtQXVkaW9SZWZDb3VudCA9PSAwICYmIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLT5ub3RlU3RhcnRBdWRpbyhBSURfTUVESUEpOworICAgIH0KKyAgICBtQXVkaW9SZWZDb3VudCsrOworfQorCit2b2lkIE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0b3BBdWRpbygpIHsKKyAgICBpZiAobUF1ZGlvUmVmQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygiQmF0dGVyeU5vdGlmaWVyOjpub3RlU3RvcCgpOiBhdWRpbyByZWZjb3VudCBpcyBicm9rZW4hIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQXVkaW9SZWZDb3VudC0tOworICAgIGlmIChtQXVkaW9SZWZDb3VudCA9PSAwICYmIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLT5ub3RlU3RvcEF1ZGlvKEFJRF9NRURJQSk7CisgICAgfQorfQorLy8gc3RhdGljCitzcDxNZWRpYUNvZGVjPiBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUoCisgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgZW5jb2Rlciwgc3RhdHVzX3QgKmVycikgeworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gbmV3IE1lZGlhQ29kZWMobG9vcGVyKTsKKworICAgIGNvbnN0IHN0YXR1c190IHJldCA9IGNvZGVjLT5pbml0KG1pbWUsIHRydWUgLyogbmFtZUlzVHlwZSAqLywgZW5jb2Rlcik7CisgICAgaWYgKGVyciAhPSBOVUxMKSB7CisgICAgICAgICplcnIgPSByZXQ7CisgICAgfQorICAgIHJldHVybiByZXQgPT0gT0sgPyBjb2RlYyA6IE5VTEw7IC8vIE5VTEwgZGVhbGxvY2F0ZXMgY29kZWMuCiB9CiAKIC8vIHN0YXRpYwogc3A8TWVkaWFDb2RlYz4gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAotICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190ICplcnIpIHsKICAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG5ldyBNZWRpYUNvZGVjKGxvb3Blcik7Ci0gICAgaWYgKGNvZGVjLT5pbml0KG5hbWUsIGZhbHNlIC8qIG5hbWVJc1R5cGUgKi8sIGZhbHNlIC8qIGVuY29kZXIgKi8pICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAotICAgIHJldHVybiBjb2RlYzsKKyAgICBjb25zdCBzdGF0dXNfdCByZXQgPSBjb2RlYy0+aW5pdChuYW1lLCBmYWxzZSAvKiBuYW1lSXNUeXBlICovLCBmYWxzZSAvKiBlbmNvZGVyICovKTsKKyAgICBpZiAoZXJyICE9IE5VTEwpIHsKKyAgICAgICAgKmVyciA9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIHJldCA9PSBPSyA/IGNvZGVjIDogTlVMTDsgLy8gTlVMTCBkZWFsbG9jYXRlcyBjb2RlYy4KIH0KIAogTWVkaWFDb2RlYzo6TWVkaWFDb2RlYyhjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyKQogICAgIDogbVN0YXRlKFVOSU5JVElBTElaRUQpLAogICAgICAgbUxvb3Blcihsb29wZXIpLAotICAgICAgbUNvZGVjKG5ldyBBQ29kZWMpLAorICAgICAgbUNvZGVjKE5VTEwpLAogICAgICAgbVJlcGx5SUQoMCksCiAgICAgICBtRmxhZ3MoMCksCisgICAgICBtU3RpY2t5RXJyb3IoT0spLAogICAgICAgbVNvZnRSZW5kZXJlcihOVUxMKSwKKyAgICAgIG1CYXR0ZXJ5U3RhdE5vdGlmaWVkKGZhbHNlKSwKKyAgICAgIG1Jc1ZpZGVvKGZhbHNlKSwKICAgICAgIG1EZXF1ZXVlSW5wdXRUaW1lb3V0R2VuZXJhdGlvbigwKSwKICAgICAgIG1EZXF1ZXVlSW5wdXRSZXBseUlEKDApLAogICAgICAgbURlcXVldWVPdXRwdXRUaW1lb3V0R2VuZXJhdGlvbigwKSwKQEAgLTk3LDI5ICsxNzIsNDIgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjOjppbml0KGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgbmFtZUlzVHlwZSwgYm9vbCBlbmNvZGVyKSB7CisvLyBzdGF0aWMKK3ZvaWQgTWVkaWFDb2RlYzo6UG9zdFJlcGx5V2l0aEVycm9yKGludDMyX3QgcmVwbHlJRCwgaW50MzJfdCBlcnIpIHsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWM6OmluaXQoY29uc3QgQVN0cmluZyAmbmFtZSwgYm9vbCBuYW1lSXNUeXBlLCBib29sIGVuY29kZXIpIHsKKyAgICAvLyBzYXZlIGluaXQgcGFyYW1ldGVycyBmb3IgcmVzZXQKKyAgICBtSW5pdE5hbWUgPSBuYW1lOworICAgIG1Jbml0TmFtZUlzVHlwZSA9IG5hbWVJc1R5cGU7CisgICAgbUluaXRJc0VuY29kZXIgPSBlbmNvZGVyOworCiAgICAgLy8gQ3VycmVudCB2aWRlbyBkZWNvZGVycyBkbyBub3QgcmV0dXJuIGZyb20gT01YX0ZpbGxUaGlzQnVmZmVyCiAgICAgLy8gcXVpY2tseSwgdmlvbGF0aW5nIHRoZSBPcGVuTUFYIHNwZWNzLCB1bnRpbCB0aGF0IGlzIHJlbWVkaWVkCiAgICAgLy8gd2UgbmVlZCB0byBpbnZlc3QgaW4gYW4gZXh0cmEgbG9vcGVyIHRvIGZyZWUgdGhlIG1haW4gZXZlbnQKICAgICAvLyBxdWV1ZS4KKyAgICBtQ29kZWMgPSBuZXcgQUNvZGVjOwogICAgIGJvb2wgbmVlZERlZGljYXRlZExvb3BlciA9IGZhbHNlOwotICAgIGlmIChuYW1lSXNUeXBlICYmICFzdHJuY2FzZWNtcChuYW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICBpZiAobmFtZUlzVHlwZSAmJiAhc3RybmNhc2VjbXAobmFtZS5jX3N0cigpLCAidmlkZW8vIiwgNikpIHsKICAgICAgICAgbmVlZERlZGljYXRlZExvb3BlciA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQVN0cmluZyB0bXAgPSBuYW1lOwogICAgICAgICBpZiAodG1wLmVuZHNXaXRoKCIuc2VjdXJlIikpIHsKICAgICAgICAgICAgIHRtcC5lcmFzZSh0bXAuc2l6ZSgpIC0gNywgNyk7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3QgTWVkaWFDb2RlY0xpc3QgKm1jbCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOworICAgICAgICBjb25zdCBzcDxJTWVkaWFDb2RlY0xpc3Q+IG1jbCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOwogICAgICAgICBzc2l6ZV90IGNvZGVjSWR4ID0gbWNsLT5maW5kQ29kZWNCeU5hbWUodG1wLmNfc3RyKCkpOwogICAgICAgICBpZiAoY29kZWNJZHggPj0gMCkgewotICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IHR5cGVzOwotICAgICAgICAgICAgaWYgKG1jbC0+Z2V0U3VwcG9ydGVkVHlwZXMoY29kZWNJZHgsICZ0eXBlcykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmVlZERlZGljYXRlZExvb3BlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBtY2wtPmdldENvZGVjSW5mbyhjb2RlY0lkeCk7CisgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWltZXM7CisgICAgICAgICAgICBpbmZvLT5nZXRTdXBwb3J0ZWRNaW1lcygmbWltZXMpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaW1lcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtaW1lc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgICAgICBuZWVkRGVkaWNhdGVkTG9vcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNTMsNiArMjQxLDE0IEBACiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlYzo6c2V0Q2FsbGJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZjYWxsYmFjaykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRDYWxsYmFjaywgaWQoKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJjYWxsYmFjayIsIGNhbGxiYWNrKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpjb25maWd1cmUoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAogICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmbmF0aXZlV2luZG93LApAQCAtMTc0LDcgKzI3MCwyMCBAQAogICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworICAgIHN0YXR1c190IGVyciA9IFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKKworICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIC8vIE1lZGlhQ29kZWMgbm93IHNldCBzdGF0ZSB0byBVTklOSVRJQUxJWkVEIHVwb24gYW55IGZhdGFsIGVycm9yLgorICAgICAgICAvLyBUbyBtYWludGFpbiBiYWNrd2FyZC1jb21wYXRpYmlsaXR5LCBkbyBhIHJlc2V0KCkgdG8gcHV0IGNvZGVjCisgICAgICAgIC8vIGJhY2sgaW50byBJTklUSUFMSVpFRCBzdGF0ZS4KKyAgICAgICAgLy8gQnV0IGRvbid0IHJlc2V0IGlmIHRoZSBlcnIgaXMgSU5WQUxJRF9PUEVSQVRJT04sIHdoaWNoIG1lYW5zCisgICAgICAgIC8vIHRoZSBjb25maWd1cmUgZmFpbHVyZSBpcyBkdWUgdG8gd3Jvbmcgc3RhdGUuCisKKyAgICAgICAgQUxPR0UoImNvbmZpZ3VyZSBmYWlsZWQgd2l0aCBlcnIgMHglMDh4LCByZXNldHRpbmcuLi4iLCBlcnIpOworICAgICAgICByZXNldCgpOworICAgIH0KKworICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OmNyZWF0ZUlucHV0U3VyZmFjZSgKQEAgLTIxOCw2ICszMjcsNDEgQEAKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpyZXNldCgpIHsKKyAgICAvKiBXaGVuIGV4dGVybmFsLWZhY2luZyBNZWRpYUNvZGVjIG9iamVjdCBpcyBjcmVhdGVkLAorICAgICAgIGl0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuICBUaHVzLCByZXNldCBpcyBlc3NlbnRpYWxseQorICAgICAgIHJlbGVhc2UoKSBmb2xsb3dlZCBieSBpbml0KCksIHBsdXMgY2xlYXJpbmcgdGhlIHN0YXRlICovCisKKyAgICBzdGF0dXNfdCBlcnIgPSByZWxlYXNlKCk7CisKKyAgICAvLyB1bnJlZ2lzdGVyIGhhbmRsZXJzCisgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChtQ29kZWNMb29wZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUNvZGVjTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtQ29kZWMtPmlkKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUNvZGVjLT5pZCgpKTsKKyAgICAgICAgfQorICAgICAgICBtQ29kZWMgPSBOVUxMOworICAgIH0KKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKKworICAgIG1GbGFncyA9IDA7ICAgIC8vIGNsZWFyIGFsbCBmbGFncworICAgIG1TdGlja3lFcnJvciA9IE9LOworCisgICAgLy8gcmVzZXQgc3RhdGUgbm90IHJlc2V0IGJ5IHNldFN0YXRlKFVOSU5JVElBTElaRUQpCisgICAgbVJlcGx5SUQgPSAwOworICAgIG1EZXF1ZXVlSW5wdXRSZXBseUlEID0gMDsKKyAgICBtRGVxdWV1ZU91dHB1dFJlcGx5SUQgPSAwOworICAgIG1EZXF1ZXVlSW5wdXRUaW1lb3V0R2VuZXJhdGlvbiA9IDA7CisgICAgbURlcXVldWVPdXRwdXRUaW1lb3V0R2VuZXJhdGlvbiA9IDA7CisgICAgbUhhdmVJbnB1dFN1cmZhY2UgPSBmYWxzZTsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgZXJyID0gaW5pdChtSW5pdE5hbWUsIG1Jbml0TmFtZUlzVHlwZSwgbUluaXRJc0VuY29kZXIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpxdWV1ZUlucHV0QnVmZmVyKAogICAgICAgICBzaXplX3QgaW5kZXgsCiAgICAgICAgIHNpemVfdCBvZmZzZXQsCkBAIC0zMjMsNiArNDY3LDE2IEBACiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlYzo6cmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShzaXplX3QgaW5kZXgsIGludDY0X3QgdGltZXN0YW1wTnMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZU91dHB1dEJ1ZmZlciwgaWQoKSk7CisgICAgbXNnLT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKKyAgICBtc2ctPnNldEludDMyKCJyZW5kZXIiLCB0cnVlKTsKKyAgICBtc2ctPnNldEludDY0KCJ0aW1lc3RhbXBOcyIsIHRpbWVzdGFtcE5zKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpyZWxlYXNlT3V0cHV0QnVmZmVyKHNpemVfdCBpbmRleCkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlT3V0cHV0QnVmZmVyLCBpZCgpKTsKICAgICBtc2ctPnNldFNpemUoImluZGV4IiwgaW5kZXgpOwpAQCAtMzUyLDYgKzUwNiwyMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0SW5wdXRGb3JtYXQoc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0SW5wdXRGb3JtYXQsIGlkKCkpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBDSEVDSyhyZXNwb25zZS0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCkpOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXROYW1lKEFTdHJpbmcgKm5hbWUpIGNvbnN0IHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0TmFtZSwgaWQoKSk7CiAKQEAgLTM4NCw2ICs1NTIsNTUgQEAKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRPdXRwdXRCdWZmZXIoc2l6ZV90IGluZGV4LCBzcDxBQnVmZmVyPiAqYnVmZmVyKSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICByZXR1cm4gZ2V0QnVmZmVyQW5kRm9ybWF0KGtQb3J0SW5kZXhPdXRwdXQsIGluZGV4LCBidWZmZXIsICZmb3JtYXQpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRPdXRwdXRGb3JtYXQoc2l6ZV90IGluZGV4LCBzcDxBTWVzc2FnZT4gKmZvcm1hdCkgeworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICByZXR1cm4gZ2V0QnVmZmVyQW5kRm9ybWF0KGtQb3J0SW5kZXhPdXRwdXQsIGluZGV4LCAmYnVmZmVyLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRJbnB1dEJ1ZmZlcihzaXplX3QgaW5kZXgsIHNwPEFCdWZmZXI+ICpidWZmZXIpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIHJldHVybiBnZXRCdWZmZXJBbmRGb3JtYXQoa1BvcnRJbmRleElucHV0LCBpbmRleCwgYnVmZmVyLCAmZm9ybWF0KTsKK30KKworYm9vbCBNZWRpYUNvZGVjOjppc0V4ZWN1dGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVN0YXRlID09IFNUQVJURUQgfHwgbVN0YXRlID09IEZMVVNIRUQ7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWM6OmdldEJ1ZmZlckFuZEZvcm1hdCgKKyAgICAgICAgc2l6ZV90IHBvcnRJbmRleCwgc2l6ZV90IGluZGV4LAorICAgICAgICBzcDxBQnVmZmVyPiAqYnVmZmVyLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCkgeworICAgIC8vIHVzZSBtdXRleCBpbnN0ZWFkIG9mIGEgY29udGV4dCBzd2l0Y2gKKworICAgIGJ1ZmZlci0+Y2xlYXIoKTsKKyAgICBmb3JtYXQtPmNsZWFyKCk7CisgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyB3ZSBkbyBub3Qgd2FudCBtUG9ydEJ1ZmZlcnMgdG8gY2hhbmdlIGR1cmluZyB0aGlzIHNlY3Rpb24KKyAgICAvLyB3ZSBhbHNvIGRvbid0IHdhbnQgbU93bmVkQnlDbGllbnQgdG8gY2hhbmdlIGR1cmluZyB0aGlzCisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1CdWZmZXJMb2NrKTsKKyAgICBWZWN0b3I8QnVmZmVySW5mbz4gKmJ1ZmZlcnMgPSAmbVBvcnRCdWZmZXJzW3BvcnRJbmRleF07CisgICAgaWYgKGluZGV4IDwgYnVmZmVycy0+c2l6ZSgpKSB7CisgICAgICAgIGNvbnN0IEJ1ZmZlckluZm8gJmluZm8gPSBidWZmZXJzLT5pdGVtQXQoaW5kZXgpOworICAgICAgICBpZiAoaW5mby5tT3duZWRCeUNsaWVudCkgeworICAgICAgICAgICAgLy8gYnkgdGhlIHRpbWUgYnVmZmVycyBhcnJheSBpcyBpbml0aWFsaXplZCwgY3J5cHRvIGlzIHNldAorICAgICAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgJiYgbUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGluZm8ubUVuY3J5cHRlZERhdGE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBpbmZvLm1EYXRhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmZvcm1hdCA9IGluZm8ubUZvcm1hdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OmZsdXNoKCkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgaWQoKSk7CiAKQEAgLTQwNyw5ICs2MjQsNyBAQAogCiB2b2lkIE1lZGlhQ29kZWM6OmNhbmNlbFBlbmRpbmdEZXF1ZXVlT3BlcmF0aW9ucygpIHsKICAgICBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlSW5wdXRQZW5kaW5nKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobURlcXVldWVJbnB1dFJlcGx5SUQpOworICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobURlcXVldWVJbnB1dFJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKIAogICAgICAgICArK21EZXF1ZXVlSW5wdXRUaW1lb3V0R2VuZXJhdGlvbjsKICAgICAgICAgbURlcXVldWVJbnB1dFJlcGx5SUQgPSAwOwpAQCAtNDE3LDkgKzYzMiw3IEBACiAgICAgfQogCiAgICAgaWYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZU91dHB1dFBlbmRpbmcpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShtRGVxdWV1ZU91dHB1dFJlcGx5SUQpOworICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobURlcXVldWVPdXRwdXRSZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAKICAgICAgICAgKyttRGVxdWV1ZU91dHB1dFRpbWVvdXRHZW5lcmF0aW9uOwogICAgICAgICBtRGVxdWV1ZU91dHB1dFJlcGx5SUQgPSAwOwpAQCAtNDI4LDE0ICs2NDEsMTIgQEAKIH0KIAogYm9vbCBNZWRpYUNvZGVjOjpoYW5kbGVEZXF1ZXVlSW5wdXRCdWZmZXIodWludDMyX3QgcmVwbHlJRCwgYm9vbCBuZXdSZXF1ZXN0KSB7Ci0gICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVECi0gICAgICAgICAgICB8fCAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikKKyAgICBpZiAoIWlzRXhlY3V0aW5nKCkgfHwgKG1GbGFncyAmIGtGbGFnSXNBc3luYykKICAgICAgICAgICAgIHx8IChuZXdSZXF1ZXN0ICYmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmcpKSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0KKyAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC00NTYsMTAgKzY2NywxMSBAQAogYm9vbCBNZWRpYUNvZGVjOjpoYW5kbGVEZXF1ZXVlT3V0cHV0QnVmZmVyKHVpbnQzMl90IHJlcGx5SUQsIGJvb2wgbmV3UmVxdWVzdCkgewogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKIAotICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRAotICAgICAgICAgICAgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpCisgICAgaWYgKCFpc0V4ZWN1dGluZygpIHx8IChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpCiAgICAgICAgICAgICB8fCAobmV3UmVxdWVzdCAmJiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZykpKSB7CiAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgeworICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGdldFN0aWNreUVycm9yKCkpOwogICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdPdXRwdXRCdWZmZXJzQ2hhbmdlZCkgewogICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCk7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdPdXRwdXRCdWZmZXJzQ2hhbmdlZDsKQEAgLTUxNiwyMiArNzI4LDIwIEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CiAKICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdEVycm9yOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdEVycm9yOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvbXhFcnJvciwgaW50ZXJuYWxFcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm9teC1lcnJvciIsICZvbXhFcnJvcikpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmludGVybmFsRXJyb3IpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnIsIGFjdGlvbkNvZGU7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhY3Rpb25Db2RlIiwgJmFjdGlvbkNvZGUpKTsKIAotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgcmVwb3J0ZWQgYW4gZXJyb3IuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIihvbXggZXJyb3IgMHglMDh4LCBpbnRlcm5hbEVycm9yICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9teEVycm9yLCBpbnRlcm5hbEVycm9yKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAob214RXJyb3IgPT0gT01YX0Vycm9yUmVzb3VyY2VzTG9zdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGludGVybmFsRXJyb3IgPT0gREVBRF9PQkpFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHJlcG9ydGVkIGVyciAlI3gsIGFjdGlvbkNvZGUgJWQsIHdoaWxlIGluIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsIGFjdGlvbkNvZGUsIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gREVBRF9PQkpFQ1QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1Nhd01lZGlhU2VydmVyRGllOworICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0lzQ29tcG9uZW50QWxsb2NhdGVkOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBzZW5kRXJyb3JSZXBvbnNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBzZW5kRXJyb3JSZXNwb25zZSA9IHRydWU7CiAKICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5JVElBTElaSU5HOgpAQCAtNTQyLDEzICs3NTIsMTUgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05GSUdVUklORzoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShJTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklOSVRJQUxJWkVEIDogSU5JVElBTElaRUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVJUSU5HOgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKENPTkZJR1VSRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfRkFUQUwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JTklUSUFMSVpFRCA6IENPTkZJR1VSRUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC01NTgsNyArNzcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdGhlIGVycm9yLCBhc3N1bWluZyB3ZSdsbCBzdGlsbCBnZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2h1dGRvd24gY29tcGxldGUgbm90aWZpY2F0aW9uLgogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVwb25zZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlID0gZmFsc2U7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdTYXdNZWRpYVNlcnZlckRpZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZWRpYVNlcnZlciBkaWVkLCB0aGVyZSBkZWZpbml0ZWx5IHdvbid0CkBAIC01NjksNyArNzgxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU1RPUFBJTkctPlVOSU5JVElBTElaRUQsIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzdWFsIFNUT1BQSU5HLT5JTklUSUFMSVpFRCBzdGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBSRUxFQVNJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTc3LDQ0ICs3OTEsODAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSElORzoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShTVEFSVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSA/IEZMVVNIRUQgOiBTVEFSVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXBvbnNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSBmYWxzZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1N0aWNreUVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0aWNreUVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsUGVuZGluZ0RlcXVldWVPcGVyYXRpb25zKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXJyLCBhY3Rpb25Db2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb25Db2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fQ09ERV9UUkFOU0lFTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX0NPREVfUkVDT1ZFUkFCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKElOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXBvbnNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSBmYWxzZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1N0aWNreUVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0aWNreUVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0aW9uQ29kZSBpbiBhbiB1bmluaXRpYWxpemVkIHN0YXRlIGlzIGFsd2F5cyBmYXRhbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uQ29kZSA9IEFDVElPTl9DT0RFX0ZBVEFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXJyLCBhY3Rpb25Db2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb25Db2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fQ09ERV9UUkFOU0lFTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX0NPREVfUkVDT1ZFUkFCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKElOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZW5kRXJyb3JSZXBvbnNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIFVOS05PV05fRVJST1IpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlbmRFcnJvclJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobVJlcGx5SUQsIGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Q29tcG9uZW50QWxsb2NhdGVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdENvbXBvbmVudEFsbG9jYXRlZDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1TdGF0ZSwgSU5JVElBTElaSU5HKTsKICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZDsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmbUNvbXBvbmVudE5hbWUpKTsKIApAQCAtNjM0LDIxICs4ODQsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Q29tcG9uZW50Q29uZmlndXJlZDoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRDb21wb25lbnRDb25maWd1cmVkOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBDT05GSUdVUklORyk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKENPTkZJR1VSRUQpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGlucHV0IHN1cmZhY2UgZmxhZwogICAgICAgICAgICAgICAgICAgICBtSGF2ZUlucHV0U3VyZmFjZSA9IGZhbHNlOwogCisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImlucHV0LWZvcm1hdCIsICZtSW5wdXRGb3JtYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgib3V0cHV0LWZvcm1hdCIsICZtT3V0cHV0Rm9ybWF0KSk7CisKKyAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoQ09ORklHVVJFRCk7CiAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRJbnB1dFN1cmZhY2VDcmVhdGVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQ6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSB0byBBQ29kZWM6OmtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlCisgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCkKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7CiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgewpAQCAtNjY0LDkgKzkxNyw5IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdFNpZ25hbGVkSW5wdXRFT1M6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0U2lnbmFsZWRJbnB1dEVPUzoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIEFDb2RlYzo6a1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtCisgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKQogICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CkBAIC02NzcsOCArOTMwLDkgQEAKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0QnVmZmVyc0FsbG9jYXRlZDoKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtQnVmZmVyTG9jayk7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcG9ydEluZGV4OwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicG9ydEluZGV4IiwgJnBvcnRJbmRleCkpOwogCkBAIC02OTUsOCArOTQ5LDggQEAKICAgICAgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInBvcnREZXNjIiwgJm9iaikpOwogCi0gICAgICAgICAgICAgICAgICAgIHNwPEFDb2RlYzo6UG9ydERlc2NyaXB0aW9uPiBwb3J0RGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ29kZWM6OlBvcnREZXNjcmlwdGlvbiAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBzcDxDb2RlY0Jhc2U6OlBvcnREZXNjcmlwdGlvbj4gcG9ydERlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q29kZWNCYXNlOjpQb3J0RGVzY3JpcHRpb24gKj4ob2JqLmdldCgpKTsKIAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtQnVmZmVycyA9IHBvcnREZXNjLT5jb3VudEJ1ZmZlcnMoKTsKIApAQCAtNzI5LDQwICs5ODMsMTggQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZDoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNvZGVjIG91dHB1dCBmb3JtYXQgY2hhbmdlZCIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICgobUZsYWdzICYga0ZsYWdJc1NvZnR3YXJlQ29kZWMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU29mdFJlbmRlcmVyID09IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJc1NvZnR3YXJlQ29kZWMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG1pbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLmNfc3RyKCksIDYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1Tb2Z0UmVuZGVyZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvZnRSZW5kZXJlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRSZWN0KCJjcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BMZWZ0LCAmY3JvcFRvcCwgJmNyb3BSaWdodCwgJmNyb3BCb3R0b20pKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29sb3JGb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRSZWN0KGtLZXlDcm9wUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU29mdFJlbmRlcmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNvZnR3YXJlUmVuZGVyZXIobU5hdGl2ZVdpbmRvdywgbWV0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU29mdFJlbmRlcmVyID0gbmV3IFNvZnR3YXJlUmVuZGVyZXIobU5hdGl2ZVdpbmRvdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNzczLDYgKzEwMDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBjb2RlYyBzcGVjaWZpYyBkYXRhIGFuZCBhbWVuZCB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXQgYXMgbmVjZXNzYXJ5LgogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnR2F0aGVyQ29kZWNTcGVjaWZpY0RhdGE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbk91dHB1dEZvcm1hdENoYW5nZWQoKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ091dHB1dEZvcm1hdENoYW5nZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7CkBAIC03ODAsNyArMTAxNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdEZpbGxUaGlzQnVmZmVyOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdEZpbGxUaGlzQnVmZmVyOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZV90IGluZGV4ID0gKi91cGRhdGVCdWZmZXJzKGtQb3J0SW5kZXhJbnB1dCwgbXNnKTsKIApAQCAtODA3LDcgKzEwNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJxdWV1ZUNTRElucHV0QnVmZmVyIGZhaWxlZCB3LyBlcnJvciAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1N0aWNreUVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0aWNreUVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsUGVuZGluZ0RlcXVldWVPcGVyYXRpb25zKCk7CkBAIC04MTUsNyArMTA0OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlSW5wdXRQZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUhhdmVJbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbklucHV0QnVmZmVyQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlSW5wdXRQZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhoYW5kbGVEZXF1ZXVlSW5wdXRCdWZmZXIobURlcXVldWVJbnB1dFJlcGx5SUQpKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgKyttRGVxdWV1ZUlucHV0VGltZW91dEdlbmVyYXRpb247CkBAIC04MjcsNyArMTA2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdERyYWluVGhpc0J1ZmZlcjoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXREcmFpblRoaXNCdWZmZXI6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvKiBzaXplX3QgaW5kZXggPSAqL3VwZGF0ZUJ1ZmZlcnMoa1BvcnRJbmRleE91dHB1dCwgbXNnKTsKIApAQCAtODYyLDEwICsxMTAwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdHYXRoZXJDb2RlY1NwZWNpZmljRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ091dHB1dEZvcm1hdENoYW5nZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25PdXRwdXRGb3JtYXRDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ091dHB1dEZvcm1hdENoYW5nZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZykgeworICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbk91dHB1dEJ1ZmZlckF2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZU91dHB1dFBlbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGhhbmRsZURlcXVldWVPdXRwdXRCdWZmZXIobURlcXVldWVPdXRwdXRSZXBseUlEKSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICsrbURlcXVldWVPdXRwdXRUaW1lb3V0R2VuZXJhdGlvbjsKQEAgLTg3OCwzMiArMTEyMiw0MiBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRFT1M6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0RU9TOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBub3RpZnkgdGhlIGNsaWVudCBvZiB0aGlzIGJ5IHVzaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZXNwb25kaW5nIGZsYWcgaW4gIm9uT3V0cHV0QnVmZmVyUmVhZHkiLgogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZDoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RPUFBJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKElOSVRJQUxJWkVEKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1TdGF0ZSwgUkVMRUFTSU5HKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFVOSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnSXNDb21wb25lbnRBbGxvY2F0ZWQ7CiAKICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdEZsdXNoQ29tcGxldGVkOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBGTFVTSElORyk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFNUQVJURUQpOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IEZMVVNISU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVjZWl2ZWQgRmx1c2hDb21wbGV0ZWQgbWVzc2FnZSBpbiBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKEZMVVNIRUQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoU1RBUlRFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTIxLDEwICsxMTc1LDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBVTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC05NTQsMTYgKzEyMDUsNDUgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdFNldENhbGxiYWNrOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBpZiAobVN0YXRlID09IFVOSU5JVElBTElaRUQKKyAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IElOSVRJQUxJWklORworICAgICAgICAgICAgICAgICAgICB8fCBpc0V4ZWN1dGluZygpKSB7CisgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgY2FuJ3QgYmUgc2V0IGFmdGVyIGNvZGVjIGlzIGV4ZWN1dGluZywKKyAgICAgICAgICAgICAgICAvLyBvciBiZWZvcmUgaXQncyBpbml0aWFsaXplZCAoYXMgdGhlIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBjbGVhcmVkIHdoZW4gaXQgZ29lcyB0byBJTklUSUFMSVpFRCkKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gY2FsbGJhY2s7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJjYWxsYmFjayIsICZjYWxsYmFjaykpOworCisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKworICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIk1lZGlhQ29kZWMgd2lsbCBvcGVyYXRlIGluIGFzeW5jIG1vZGUiKTsKKyAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdJc0FzeW5jOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnSXNBc3luYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdENvbmZpZ3VyZToKICAgICAgICAgewogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBJTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtOTgzLDEwICsxMjYzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0U3VyZmFjZVRleHR1cmVDbGllbnQoKSk7CiAKICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBlcnIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTAyNCwxMCArMTMwMSw3IEBACiAKICAgICAgICAgICAgIC8vIE11c3QgYmUgY29uZmlndXJlZCwgYnV0IGNhbid0IGhhdmUgYmVlbiBzdGFydGVkIHlldC4KICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gQ09ORklHVVJFRCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTA0MSwxMSArMTMxNSwxMSBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBDT05GSUdVUkVEKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gRkxVU0hFRCkgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIE9LKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlICE9IENPTkZJR1VSRUQpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMDY1LDIwICsxMzM5LDIxIEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IElOSVRJQUxJWkVECi0gICAgICAgICAgICAgICAgICAgICYmIG1TdGF0ZSAhPSBDT05GSUdVUkVEICYmIG1TdGF0ZSAhPSBTVEFSVEVEKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbWF5IGJlIGluICJVTklOSVRJQUxJWkVEIiBzdGF0ZSBhbHJlYWR5IHdpdGhvdXQgdGhlCisgICAgICAgICAgICBpZiAoIShtRmxhZ3MgJiBrRmxhZ0lzQ29tcG9uZW50QWxsb2NhdGVkKSAmJiBtU3RhdGUgIT0gSU5JVElBTElaRUQKKyAgICAgICAgICAgICAgICAgICAgJiYgbVN0YXRlICE9IENPTkZJR1VSRUQgJiYgIWlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBtYXkgYmUgaW4gIlVOSU5JVElBTElaRUQiIHN0YXRlIGFscmVhZHkgYW5kCisgICAgICAgICAgICAgICAgLy8gYWxzbyBzaHV0ZG93biB0aGUgZW5jb2Rlci9kZWNvZGVyIHdpdGhvdXQgdGhlCiAgICAgICAgICAgICAgICAgLy8gY2xpZW50IGJlaW5nIGF3YXJlIG9mIHRoaXMgaWYgbWVkaWEgc2VydmVyIGRpZWQgd2hpbGUKICAgICAgICAgICAgICAgICAvLyB3ZSB3ZXJlIGJlaW5nIHN0b3BwZWQuIFRoZSBjbGllbnQgd291bGQgYXNzdW1lIHRoYXQKICAgICAgICAgICAgICAgICAvLyBhZnRlciBzdG9wKCkgcmV0dXJuZWQsIGl0IHdvdWxkIGJlIHNhZmUgdG8gY2FsbCByZWxlYXNlKCkKICAgICAgICAgICAgICAgICAvLyBhbmQgaXQgc2hvdWxkIGJlIGluIHRoaXMgY2FzZSwgbm8gaGFybSB0byBhbGxvdyBhIHJlbGVhc2UoKQogICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGFscmVhZHkgdW5pbml0aWFsaXplZC4KLSAgICAgICAgICAgICAgICAvLyBTaW1pbGFybHkgc3RvcHBpbmcgYSBzdG9wcGVkIE1lZGlhQ29kZWMgc2hvdWxkIGJlIGJlbmlnbi4KICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgImVyciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPT0gdGFyZ2V0U3RhdGUgPyBPSyA6IElOVkFMSURfT1BFUkFUSU9OKTsKLQorICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1TdGF0ZSA9PSB0YXJnZXRTdGF0ZSA/IE9LIDogSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgdGFyZ2V0U3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTA4Nyw2ICsxMzYyLDkgQEAKICAgICAgICAgICAgICAgICAvLyBJdCdzIGRlYWQsIEppbS4gRG9uJ3QgZXhwZWN0IGluaXRpYXRlU2h1dGRvd24gdG8geWllbGQKICAgICAgICAgICAgICAgICAvLyBhbnkgdXNlZnVsIHJlc3VsdHMgbm93Li4uCiAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldFN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShyZXBseUlEKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTExMDYsMTEgKzEzODQsMTUgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKKyAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZU91dHB1dEJ1ZmZlciBjYW4ndCBiZSB1c2VkIGluIGFzeW5jIG1vZGUiKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobUhhdmVJbnB1dFN1cmZhY2UpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZUlucHV0QnVmZmVyIGNhbid0IGJlIHVzZWQgd2l0aCBpbnB1dCBzdXJmYWNlIik7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTEyMiw5ICsxNDA0LDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lb3V0VXMiLCAmdGltZW91dFVzKSk7CiAKICAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPT0gMGxsKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgLUVBR0FJTik7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgLUVBR0FJTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTExNTMsOSArMTQzMyw3IEBACiAKICAgICAgICAgICAgIENIRUNLKG1GbGFncyAmIGtGbGFnRGVxdWV1ZUlucHV0UGVuZGluZyk7CiAKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgLUVBR0FJTik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1EZXF1ZXVlSW5wdXRSZXBseUlEKTsKKyAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtRGVxdWV1ZUlucHV0UmVwbHlJRCwgLUVBR0FJTik7CiAKICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdEZXF1ZXVlSW5wdXRQZW5kaW5nOwogICAgICAgICAgICAgbURlcXVldWVJbnB1dFJlcGx5SUQgPSAwOwpAQCAtMTE2NywxOSArMTQ0NSwxNyBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEIHx8IChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvblF1ZXVlSW5wdXRCdWZmZXIobXNnKTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBlcnIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTE4OCw2ICsxNDY0LDEyIEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCisgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImRlcXVldWVPdXRwdXRCdWZmZXIgY2FuJ3QgYmUgdXNlZCBpbiBhc3luYyBtb2RlIik7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGhhbmRsZURlcXVldWVPdXRwdXRCdWZmZXIocmVwbHlJRCwgdHJ1ZSAvKiBuZXcgcmVxdWVzdCAqLykpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTExOTYsOSArMTQ3OCw3IEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZW91dFVzIiwgJnRpbWVvdXRVcykpOwogCiAgICAgICAgICAgICBpZiAodGltZW91dFVzID09IDBsbCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIC1FQUdBSU4pOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIC1FQUdBSU4pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMjI3LDkgKzE1MDcsNyBAQAogCiAgICAgICAgICAgICBDSEVDSyhtRmxhZ3MgJiBrRmxhZ0RlcXVldWVPdXRwdXRQZW5kaW5nKTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCAtRUFHQUlOKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobURlcXVldWVPdXRwdXRSZXBseUlEKTsKKyAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtRGVxdWV1ZU91dHB1dFJlcGx5SUQsIC1FQUdBSU4pOwogCiAgICAgICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnRGVxdWV1ZU91dHB1dFBlbmRpbmc7CiAgICAgICAgICAgICBtRGVxdWV1ZU91dHB1dFJlcGx5SUQgPSAwOwpAQCAtMTI0MSwxOSArMTUxOSwxNyBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEIHx8IChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvblJlbGVhc2VPdXRwdXRCdWZmZXIobXNnKTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBlcnIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTI2MiwxMSArMTUzOCwxMSBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEIHx8IChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMjgwLDExICsxNTU2LDExIEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUQVJURUQgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSB8fCAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSkgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTEzMTQsMTUgKzE1OTAsMTYgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCB8fCAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOworICAgICAgICAgICAgLy8gVE9ETzogc2tpcCBmbHVzaGluZyBpZiBhbHJlYWR5IEZMVVNIRUQKICAgICAgICAgICAgIHNldFN0YXRlKEZMVVNISU5HKTsKIAogICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxGbHVzaCgpOwpAQCAtMTMzMCwyMyArMTYwNywyOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0R2V0SW5wdXRGb3JtYXQ6CiAgICAgICAgIGNhc2Uga1doYXRHZXRPdXRwdXRGb3JtYXQ6CiAgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPQorICAgICAgICAgICAgICAgIChtc2ctPndoYXQoKSA9PSBrV2hhdEdldE91dHB1dEZvcm1hdCA/IG1PdXRwdXRGb3JtYXQgOiBtSW5wdXRGb3JtYXQpOworCiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAoKG1TdGF0ZSAhPSBTVEFSVEVEICYmIG1TdGF0ZSAhPSBGTFVTSElORykKLSAgICAgICAgICAgICAgICAgICAgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpCi0gICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXRGb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBpZiAoKG1TdGF0ZSAhPSBDT05GSUdVUkVEICYmIG1TdGF0ZSAhPSBTVEFSVElORyAmJgorICAgICAgICAgICAgICAgICBtU3RhdGUgIT0gU1RBUlRFRCAmJiBtU3RhdGUgIT0gRkxVU0hJTkcgJiYKKyAgICAgICAgICAgICAgICAgbVN0YXRlICE9IEZMVVNIRUQpCisgICAgICAgICAgICAgICAgICAgIHx8IGZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldE1lc3NhZ2UoImZvcm1hdCIsIG1PdXRwdXRGb3JtYXQpOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CiAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEzNzIsMTAgKzE2NTQsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobUNvbXBvbmVudE5hbWUuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTM5NSwxMCArMTY3NCw3IEBACiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uU2V0UGFyYW1ldGVycyhwYXJhbXMpOwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZXJyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE0MjEsMTQgKzE2OTcsMTQgQEAKICAgICAgICAgKytpOwogICAgIH0KIAotICAgIEFMT0dWKCJGb3VuZCAldSBwaWVjZXMgb2YgY29kZWMgc3BlY2lmaWMgZGF0YS4iLCBtQ1NELnNpemUoKSk7CisgICAgQUxPR1YoIkZvdW5kICV6dSBwaWVjZXMgb2YgY29kZWMgc3BlY2lmaWMgZGF0YS4iLCBtQ1NELnNpemUoKSk7CiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OnF1ZXVlQ1NESW5wdXRCdWZmZXIoc2l6ZV90IGJ1ZmZlckluZGV4KSB7CiAgICAgQ0hFQ0soIW1DU0QuZW1wdHkoKSk7CiAKLSAgICBCdWZmZXJJbmZvICppbmZvID0KLSAgICAgICAgJm1Qb3J0QnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLmVkaXRJdGVtQXQoYnVmZmVySW5kZXgpOworICAgIGNvbnN0IEJ1ZmZlckluZm8gKmluZm8gPQorICAgICAgICAmbVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uaXRlbUF0KGJ1ZmZlckluZGV4KTsKIAogICAgIHNwPEFCdWZmZXI+IGNzZCA9ICptQ1NELmJlZ2luKCk7CiAgICAgbUNTRC5lcmFzZShtQ1NELmJlZ2luKCkpOwpAQCAtMTQ2MywxOCArMTczOSwyMyBAQAogICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7CiAgICAgICAgIHNldE5hdGl2ZVdpbmRvdyhOVUxMKTsKIAorICAgICAgICBtSW5wdXRGb3JtYXQuY2xlYXIoKTsKICAgICAgICAgbU91dHB1dEZvcm1hdC5jbGVhcigpOwogICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZDsKICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ091dHB1dEJ1ZmZlcnNDaGFuZ2VkOwogICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnU3RpY2t5RXJyb3I7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc0VuY29kZXI7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdHYXRoZXJDb2RlY1NwZWNpZmljRGF0YTsKKyAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0lzQXN5bmM7CisgICAgICAgIG1TdGlja3lFcnJvciA9IE9LOwogCiAgICAgICAgIG1BY3Rpdml0eU5vdGlmeS5jbGVhcigpOworICAgICAgICBtQ2FsbGJhY2suY2xlYXIoKTsKICAgICB9CiAKICAgICBpZiAobmV3U3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgewotICAgICAgICBtQ29tcG9uZW50TmFtZS5jbGVhcigpOworICAgICAgICAvLyByZXR1cm4gYW55IHN0cmFnZ2xpbmcgYnVmZmVycywgZS5nLiBpZiB3ZSBnb3QgaGVyZSBvbiBhbiBlcnJvcgorICAgICAgICByZXR1cm5CdWZmZXJzVG9Db2RlYygpOwogCiAgICAgICAgIC8vIFRoZSBjb21wb25lbnQgaXMgZ29uZSwgbWVkaWFzZXJ2ZXIncyBwcm9iYWJseSBiYWNrIHVwIGFscmVhZHkKICAgICAgICAgLy8gYnV0IHNob3VsZCBkZWZpbml0ZWx5IGJlIGJhY2sgdXAgc2hvdWxkIHdlIHRyeSB0byBpbnN0YW50aWF0ZQpAQCAtMTQ4NSw2ICsxNzY2LDggQEAKICAgICBtU3RhdGUgPSBuZXdTdGF0ZTsKIAogICAgIGNhbmNlbFBlbmRpbmdEZXF1ZXVlT3BlcmF0aW9ucygpOworCisgICAgdXBkYXRlQmF0dGVyeVN0YXQoKTsKIH0KIAogdm9pZCBNZWRpYUNvZGVjOjpyZXR1cm5CdWZmZXJzVG9Db2RlYygpIHsKQEAgLTE0OTQsNiArMTc3Nyw3IEBACiAKIHZvaWQgTWVkaWFDb2RlYzo6cmV0dXJuQnVmZmVyc1RvQ29kZWNPblBvcnQoaW50MzJfdCBwb3J0SW5kZXgpIHsKICAgICBDSEVDSyhwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0IHx8IHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOwogCiAgICAgVmVjdG9yPEJ1ZmZlckluZm8+ICpidWZmZXJzID0gJm1Qb3J0QnVmZmVyc1twb3J0SW5kZXhdOwogCkBAIC0xNTIwLDggKzE4MDQsOCBAQAogICAgICAgICBpbnQzMl90IHBvcnRJbmRleCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBDSEVDSyhwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0IHx8IHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KTsKIAotICAgIHZvaWQgKmJ1ZmZlcklEOwotICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImJ1ZmZlci1pZCIsICZidWZmZXJJRCkpOworICAgIHVpbnQzMl90IGJ1ZmZlcklEOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXItaWQiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CiAKICAgICBWZWN0b3I8QnVmZmVySW5mbz4gKmJ1ZmZlcnMgPSAmbVBvcnRCdWZmZXJzW3BvcnRJbmRleF07CiAKQEAgLTE1MzIsNiArMTgxNiw4IEBACiAgICAgICAgICAgICBDSEVDSyhpbmZvLT5tTm90aWZ5ID09IE5VTEwpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmaW5mby0+bU5vdGlmeSkpOwogCisgICAgICAgICAgICBpbmZvLT5tRm9ybWF0ID0KKyAgICAgICAgICAgICAgICAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCkgPyBtSW5wdXRGb3JtYXQgOiBtT3V0cHV0Rm9ybWF0OwogICAgICAgICAgICAgbUF2YWlsUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XS5wdXNoX2JhY2soaSk7CiAKICAgICAgICAgICAgIHJldHVybiBpOwpAQCAtMTY0OCwxMSArMTkzNCwxNSBAQAogICAgICAgICBpbmZvLT5tRGF0YS0+c2V0UmFuZ2UoMCwgcmVzdWx0KTsKICAgICB9CiAKKyAgICAvLyBzeW5jaHJvbml6YXRpb24gYm91bmRhcnkgZm9yIGdldEJ1ZmZlckFuZEZvcm1hdAorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1CdWZmZXJMb2NrKTsKKyAgICAgICAgaW5mby0+bU93bmVkQnlDbGllbnQgPSBmYWxzZTsKKyAgICB9CiAgICAgcmVwbHktPnNldEJ1ZmZlcigiYnVmZmVyIiwgaW5mby0+bURhdGEpOwogICAgIHJlcGx5LT5wb3N0KCk7CiAKICAgICBpbmZvLT5tTm90aWZ5ID0gTlVMTDsKLSAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IGZhbHNlOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTY2Niw3ICsxOTU2LDcgQEAKICAgICAgICAgcmVuZGVyID0gMDsKICAgICB9CiAKLSAgICBpZiAobVN0YXRlICE9IFNUQVJURUQpIHsKKyAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC0xNjgwLDE4ICsxOTcwLDQwIEBACiAgICAgICAgIHJldHVybiAtRUFDQ0VTOwogICAgIH0KIAotICAgIGlmIChyZW5kZXIgJiYgKGluZm8tPm1EYXRhID09IE5VTEwgfHwgaW5mby0+bURhdGEtPnNpemUoKSAhPSAwKSkgeworICAgIC8vIHN5bmNocm9uaXphdGlvbiBib3VuZGFyeSBmb3IgZ2V0QnVmZmVyQW5kRm9ybWF0CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOworICAgICAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChyZW5kZXIgJiYgaW5mby0+bURhdGEgIT0gTlVMTCAmJiBpbmZvLT5tRGF0YS0+c2l6ZSgpICE9IDApIHsKICAgICAgICAgaW5mby0+bU5vdGlmeS0+c2V0SW50MzIoInJlbmRlciIsIHRydWUpOwogCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMgPSAwOworICAgICAgICBpZiAobXNnLT5maW5kSW50NjQoInRpbWVzdGFtcE5zIiwgJnRpbWVzdGFtcE5zKSkgeworICAgICAgICAgICAgaW5mby0+bU5vdGlmeS0+c2V0SW50NjQoInRpbWVzdGFtcE5zIiwgdGltZXN0YW1wTnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogaXQgc2VlbXMgbGlrZSB3ZSBzaG91bGQgdXNlIHRoZSB0aW1lc3RhbXAKKyAgICAgICAgICAgIC8vIGluIHRoZSAobWVkaWEpYnVmZmVyIGFzIGl0IHBvdGVudGlhbGx5IGNhbWUgZnJvbQorICAgICAgICAgICAgLy8gYW4gaW5wdXQgc3VyZmFjZSwgYnV0IHdlIGRpZCBub3QgcHJvcGFnYXRlIGl0IHByaW9yIHRvCisgICAgICAgICAgICAvLyBBUEkgMjAuICBQZXJoYXBzIGNoZWNrIGZvciB0YXJnZXQgU0RLIHZlcnNpb24uCisjaWYgMAorICAgICAgICAgICAgaWYgKGluZm8tPm1EYXRhLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVzdGFtcE5zKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ1c2luZyBidWZmZXIgUFRTIG9mICUiIFBSSWQ2NCwgdGltZXN0YW1wTnMpOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcE5zICo9IDEwMDA7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChtU29mdFJlbmRlcmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXItPnJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+bURhdGEtPmRhdGEoKSwgaW5mby0+bURhdGEtPnNpemUoKSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPm1EYXRhLT5kYXRhKCksIGluZm8tPm1EYXRhLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcE5zLCBOVUxMLCBpbmZvLT5tRm9ybWF0KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGluZm8tPm1Ob3RpZnktPnBvc3QoKTsKICAgICBpbmZvLT5tTm90aWZ5ID0gTlVMTDsKLSAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IGZhbHNlOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTcxMCw3ICsyMDIyLDIyIEBACiAKICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1Qb3J0QnVmZmVyc1twb3J0SW5kZXhdLmVkaXRJdGVtQXQoaW5kZXgpOwogICAgIENIRUNLKCFpbmZvLT5tT3duZWRCeUNsaWVudCk7Ci0gICAgaW5mby0+bU93bmVkQnlDbGllbnQgPSB0cnVlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1CdWZmZXJMb2NrKTsKKyAgICAgICAgaW5mby0+bU93bmVkQnlDbGllbnQgPSB0cnVlOworCisgICAgICAgIC8vIHNldCBpbWFnZS1kYXRhCisgICAgICAgIGlmIChpbmZvLT5tRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGltYWdlRGF0YTsKKyAgICAgICAgICAgIGlmIChpbmZvLT5tRm9ybWF0LT5maW5kQnVmZmVyKCJpbWFnZS1kYXRhIiwgJmltYWdlRGF0YSkpIHsKKyAgICAgICAgICAgICAgICBpbmZvLT5tRGF0YS0+bWV0YSgpLT5zZXRCdWZmZXIoImltYWdlLWRhdGEiLCBpbWFnZURhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgICAgICBpZiAoaW5mby0+bUZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgeworICAgICAgICAgICAgICAgIGluZm8tPm1EYXRhLT5tZXRhKCktPnNldFJlY3QoImNyb3AtcmVjdCIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKICAgICByZXR1cm4gaW5kZXg7CiB9CkBAIC0xNzQ4LDE2ICsyMDc1LDEwMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBNZWRpYUNvZGVjOjpvbklucHV0QnVmZmVyQXZhaWxhYmxlKCkgeworICAgIGludDMyX3QgaW5kZXg7CisgICAgd2hpbGUgKChpbmRleCA9IGRlcXVldWVQb3J0QnVmZmVyKGtQb3J0SW5kZXhJbnB1dCkpID49IDApIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1DYWxsYmFjay0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImNhbGxiYWNrSUQiLCBDQl9JTlBVVF9BVkFJTEFCTEUpOworICAgICAgICBtc2ctPnNldEludDMyKCJpbmRleCIsIGluZGV4KTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWM6Om9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKCkgeworICAgIGludDMyX3QgaW5kZXg7CisgICAgd2hpbGUgKChpbmRleCA9IGRlcXVldWVQb3J0QnVmZmVyKGtQb3J0SW5kZXhPdXRwdXQpKSA+PSAwKSB7CisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPQorICAgICAgICAgICAgbVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLml0ZW1BdChpbmRleCkubURhdGE7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtQ2FsbGJhY2stPmR1cCgpOworICAgICAgICBtc2ctPnNldEludDMyKCJjYWxsYmFja0lEIiwgQ0JfT1VUUFVUX0FWQUlMQUJMRSk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImluZGV4IiwgaW5kZXgpOworICAgICAgICBtc2ctPnNldFNpemUoIm9mZnNldCIsIGJ1ZmZlci0+b2Zmc2V0KCkpOworICAgICAgICBtc2ctPnNldFNpemUoInNpemUiLCBidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworCisgICAgICAgIGludDMyX3Qgb214RmxhZ3M7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoIm9teEZsYWdzIiwgJm9teEZsYWdzKSk7CisKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAob214RmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19TWU5DRlJBTUUpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEJVRkZFUl9GTEFHX1NZTkNGUkFNRTsKKyAgICAgICAgfQorICAgICAgICBpZiAob214RmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICAgICAgZmxhZ3MgfD0gQlVGRkVSX0ZMQUdfQ09ERUNDT05GSUc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9teEZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBmbGFncyB8PSBCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIH0KKworICAgICAgICBtc2ctPnNldEludDMyKCJmbGFncyIsIGZsYWdzKTsKKworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6b25FcnJvcihzdGF0dXNfdCBlcnIsIGludDMyX3QgYWN0aW9uQ29kZSwgY29uc3QgY2hhciAqZGV0YWlsKSB7CisgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtQ2FsbGJhY2stPmR1cCgpOworICAgICAgICBtc2ctPnNldEludDMyKCJjYWxsYmFja0lEIiwgQ0JfRVJST1IpOworICAgICAgICBtc2ctPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICBtc2ctPnNldEludDMyKCJhY3Rpb25Db2RlIiwgYWN0aW9uQ29kZSk7CisKKyAgICAgICAgaWYgKGRldGFpbCAhPSBOVUxMKSB7CisgICAgICAgICAgICBtc2ctPnNldFN0cmluZygiZGV0YWlsIiwgZGV0YWlsKTsKKyAgICAgICAgfQorCisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjOjpvbk91dHB1dEZvcm1hdENoYW5nZWQoKSB7CisgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtQ2FsbGJhY2stPmR1cCgpOworICAgICAgICBtc2ctPnNldEludDMyKCJjYWxsYmFja0lEIiwgQ0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEKTsKKyAgICAgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBtT3V0cHV0Rm9ybWF0KTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorfQorCisKIHZvaWQgTWVkaWFDb2RlYzo6cG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpIHsKICAgICBpZiAobUFjdGl2aXR5Tm90aWZ5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmICgobUZsYWdzICYgKGtGbGFnU3RpY2t5RXJyb3IKKyAgICBib29sIGlzRXJyb3JPck91dHB1dENoYW5nZWQgPQorICAgICAgICAgICAgKG1GbGFncyAmIChrRmxhZ1N0aWNreUVycm9yCiAgICAgICAgICAgICAgICAgICAgIHwga0ZsYWdPdXRwdXRCdWZmZXJzQ2hhbmdlZAotICAgICAgICAgICAgICAgICAgICB8IGtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZCkpCisgICAgICAgICAgICAgICAgICAgIHwga0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkKSk7CisKKyAgICBpZiAoaXNFcnJvck9yT3V0cHV0Q2hhbmdlZAogICAgICAgICAgICAgfHwgIW1BdmFpbFBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uZW1wdHkoKQogICAgICAgICAgICAgfHwgIW1BdmFpbFBvcnRCdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLmVtcHR5KCkpIHsKKyAgICAgICAgbUFjdGl2aXR5Tm90aWZ5LT5zZXRJbnQzMigiaW5wdXQtYnVmZmVycyIsCisgICAgICAgICAgICAgICAgbUF2YWlsUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5zaXplKCkpOworCisgICAgICAgIGlmIChpc0Vycm9yT3JPdXRwdXRDaGFuZ2VkKSB7CisgICAgICAgICAgICAvLyB3ZSB3YW50IGNvbnN1bWVyIHRvIGRlcXVldWUgYXMgbWFueSB0aW1lcyBhcyBpdCBjYW4KKyAgICAgICAgICAgIG1BY3Rpdml0eU5vdGlmeS0+c2V0SW50MzIoIm91dHB1dC1idWZmZXJzIiwgSU5UMzJfTUFYKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BY3Rpdml0eU5vdGlmeS0+c2V0SW50MzIoIm91dHB1dC1idWZmZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpKTsKKyAgICAgICAgfQogICAgICAgICBtQWN0aXZpdHlOb3RpZnktPnBvc3QoKTsKICAgICAgICAgbUFjdGl2aXR5Tm90aWZ5LmNsZWFyKCk7CiAgICAgfQpAQCAtMTgxOCw0ICsyMjI5LDM0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE1lZGlhQ29kZWM6OnVwZGF0ZUJhdHRlcnlTdGF0KCkgeworICAgIGlmIChtU3RhdGUgPT0gQ09ORklHVVJFRCAmJiAhbUJhdHRlcnlTdGF0Tm90aWZpZWQpIHsKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKworICAgICAgICBtSXNWaWRlbyA9IG1pbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoInZpZGVvLyIpOworCisgICAgICAgIEJhdHRlcnlOb3RpZmllciYgbm90aWZpZXIoQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpKTsKKworICAgICAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgICAgIG5vdGlmaWVyLm5vdGVTdGFydFZpZGVvKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZmllci5ub3RlU3RhcnRBdWRpbygpOworICAgICAgICB9CisKKyAgICAgICAgbUJhdHRlcnlTdGF0Tm90aWZpZWQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFVOSU5JVElBTElaRUQgJiYgbUJhdHRlcnlTdGF0Tm90aWZpZWQpIHsKKyAgICAgICAgQmF0dGVyeU5vdGlmaWVyJiBub3RpZmllcihCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkpOworCisgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgbm90aWZpZXIubm90ZVN0b3BWaWRlbygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbm90aWZpZXIubm90ZVN0b3BBdWRpbygpOworICAgICAgICB9CisKKyAgICAgICAgbUJhdHRlcnlTdGF0Tm90aWZpZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKaW5kZXggYjc0YjJlMi4uNWI4YmU0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcApAQCAtMTgsMTIgKzE4LDE5IEBACiAjZGVmaW5lIExPR19UQUcgIk1lZGlhQ29kZWNMaXN0IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiAjaW5jbHVkZSA8bGliZXhwYXQvZXhwYXQuaD4KQEAgLTMyLDMwICszOSwxMjkgQEAKIAogc3RhdGljIE11dGV4IHNJbml0TXV0ZXg7CiAKLS8vIHN0YXRpYwotTWVkaWFDb2RlY0xpc3QgKk1lZGlhQ29kZWNMaXN0OjpzQ29kZWNMaXN0Oworc3RhdGljIE1lZGlhQ29kZWNMaXN0ICpnQ29kZWNMaXN0ID0gTlVMTDsKIAogLy8gc3RhdGljCi1jb25zdCBNZWRpYUNvZGVjTGlzdCAqTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCkgeworc3A8SU1lZGlhQ29kZWNMaXN0PiBNZWRpYUNvZGVjTGlzdDo6c0NvZGVjTGlzdDsKKworLy8gc3RhdGljCitzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpnZXRMb2NhbEluc3RhbmNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhzSW5pdE11dGV4KTsKIAotICAgIGlmIChzQ29kZWNMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgc0NvZGVjTGlzdCA9IG5ldyBNZWRpYUNvZGVjTGlzdDsKKyAgICBpZiAoZ0NvZGVjTGlzdCA9PSBOVUxMKSB7CisgICAgICAgIGdDb2RlY0xpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3Q7CisgICAgICAgIGlmIChnQ29kZWNMaXN0LT5pbml0Q2hlY2soKSA9PSBPSykgeworICAgICAgICAgICAgc0NvZGVjTGlzdCA9IGdDb2RlY0xpc3Q7CisgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gc0NvZGVjTGlzdC0+aW5pdENoZWNrKCkgPT0gT0sgPyBzQ29kZWNMaXN0IDogTlVMTDsKKyAgICByZXR1cm4gc0NvZGVjTGlzdDsKK30KKworc3RhdGljIE11dGV4IHNSZW1vdGVJbml0TXV0ZXg7CisKK3NwPElNZWRpYUNvZGVjTGlzdD4gTWVkaWFDb2RlY0xpc3Q6OnNSZW1vdGVMaXN0OworCisvLyBzdGF0aWMKK3NwPElNZWRpYUNvZGVjTGlzdD4gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChzUmVtb3RlSW5pdE11dGV4KTsKKyAgICBpZiAoc1JlbW90ZUxpc3QgPT0gTlVMTCkgeworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQorICAgICAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnBsYXllciIpKTsKKyAgICAgICAgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZSA9CisgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPihiaW5kZXIpOworICAgICAgICBpZiAoc2VydmljZS5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzUmVtb3RlTGlzdCA9IHNlcnZpY2UtPmdldENvZGVjTGlzdCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNSZW1vdGVMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGlmIGZhaWxlZCB0byBnZXQgcmVtb3RlIGxpc3QsIGNyZWF0ZSBsb2NhbCBsaXN0CisgICAgICAgICAgICBzUmVtb3RlTGlzdCA9IGdldExvY2FsSW5zdGFuY2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc1JlbW90ZUxpc3Q7CiB9CiAKIE1lZGlhQ29kZWNMaXN0OjpNZWRpYUNvZGVjTGlzdCgpCiAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpIHsKLSAgICBGSUxFICpmaWxlID0gZm9wZW4oIi9ldGMvbWVkaWFfY29kZWNzLnhtbCIsICJyIik7CisgICAgcGFyc2VUb3BMZXZlbFhNTEZpbGUoIi9ldGMvbWVkaWFfY29kZWNzLnhtbCIpOworfQogCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygidW5hYmxlIHRvIG9wZW4gbWVkaWEgY29kZWNzIGNvbmZpZ3VyYXRpb24geG1sIGZpbGUuIik7Cit2b2lkIE1lZGlhQ29kZWNMaXN0OjpwYXJzZVRvcExldmVsWE1MRmlsZShjb25zdCBjaGFyICpjb2RlY3NfeG1sKSB7CisgICAgLy8gZ2V0IGhyZWZfYmFzZQorICAgIGNoYXIgKmhyZWZfYmFzZV9lbmQgPSBzdHJyY2hyKGNvZGVjc194bWwsICcvJyk7CisgICAgaWYgKGhyZWZfYmFzZV9lbmQgIT0gTlVMTCkgeworICAgICAgICBtSHJlZkJhc2UgPSBBU3RyaW5nKGNvZGVjc194bWwsIGhyZWZfYmFzZV9lbmQgLSBjb2RlY3NfeG1sICsgMSk7CisgICAgfQorCisgICAgbUluaXRDaGVjayA9IE9LOyAvLyBrZWVwaW5nIHRoaXMgaGVyZSBmb3Igc2FmZXR5CisgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKKyAgICBtRGVwdGggPSAwOworCisgICAgT01YQ2xpZW50IGNsaWVudDsKKyAgICBtSW5pdENoZWNrID0gY2xpZW50LmNvbm5lY3QoKTsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1PTVggPSBjbGllbnQuaW50ZXJmYWNlKCk7CisgICAgcGFyc2VYTUxGaWxlKGNvZGVjc194bWwpOworICAgIG1PTVguY2xlYXIoKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIG1Db2RlY0luZm9zLmNsZWFyKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBwYXJzZVhNTEZpbGUoZmlsZSk7CisgICAgZm9yIChzaXplX3QgaSA9IG1Db2RlY0luZm9zLnNpemUoKTsgaS0tID4gMDspIHsKKyAgICAgICAgY29uc3QgTWVkaWFDb2RlY0luZm8gJmluZm8gPSAqbUNvZGVjSW5mb3MuaXRlbUF0KGkpLmdldCgpOworCisgICAgICAgIGlmIChpbmZvLm1DYXBzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBObyB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhpcyBjb21wb25lbnQ/Pz8KKyAgICAgICAgICAgIEFMT0dXKCJDb21wb25lbnQgJXMgZG9lcyBub3Qgc3VwcG9ydCBhbnkgdHlwZSBvZiBtZWRpYT8iLAorICAgICAgICAgICAgICAgICAgaW5mby5tTmFtZS5jX3N0cigpKTsKKworICAgICAgICAgICAgbUNvZGVjSW5mb3MucmVtb3ZlQXQoaSk7CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCB0eXBlX2l4ID0gMDsgdHlwZV9peCA8IGluZm8ubUNhcHMuc2l6ZSgpOyArK3R5cGVfaXgpIHsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIG1pbWUgPSBpbmZvLm1DYXBzLmtleUF0KHR5cGVfaXgpOworICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+ICZjYXBzID0gaW5mby5tQ2Fwcy52YWx1ZUF0KHR5cGVfaXgpOworCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIGNvZGVjIGluZm8gZm9yICVzOiAlcyIsIGluZm8ubU5hbWUuY19zdHIoKSwgbWltZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0RGV0YWlscygpLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCIgICAgZmxhZ3M9JWQiLCBjYXBzLT5nZXRGbGFncygpKTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gY29sb3JGb3JtYXRzOworICAgICAgICAgICAgICAgICAgICBjYXBzLT5nZXRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoJmNvbG9yRm9ybWF0cyk7CisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbmljZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNvbG9yRm9ybWF0cy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5pY2UuYXBwZW5kKGNvbG9yRm9ybWF0cy5pdGVtQXQoaXgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAgIGNvbG9ycz1bJXNdIiwgbmljZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWZWN0b3I8TWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbD4gcHJvZmlsZUxldmVsczsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygmcHJvZmlsZUxldmVscyk7CisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbmljZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHByb2ZpbGVMZXZlbHMuc2l6ZSgpOyBpeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsICZwbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUxldmVscy5pdGVtQXQoaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQocGwubVByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5pY2UuYXBwZW5kKHBsLm1MZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAgICBsZXZlbHM9WyVzXSIsIG5pY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICB9CiAKICNpZiAwCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgewpAQCAtNzUsOSArMTgxLDYgQEAKICAgICAgICAgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKICAgICB9CiAjZW5kaWYKLQotICAgIGZjbG9zZShmaWxlKTsKLSAgICBmaWxlID0gTlVMTDsKIH0KIAogTWVkaWFDb2RlY0xpc3Q6On5NZWRpYUNvZGVjTGlzdCgpIHsKQEAgLTg3LDEwICsxOTAsMTQgQEAKICAgICByZXR1cm4gbUluaXRDaGVjazsKIH0KIAotdm9pZCBNZWRpYUNvZGVjTGlzdDo6cGFyc2VYTUxGaWxlKEZJTEUgKmZpbGUpIHsKLSAgICBtSW5pdENoZWNrID0gT0s7Ci0gICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKLSAgICBtRGVwdGggPSAwOwordm9pZCBNZWRpYUNvZGVjTGlzdDo6cGFyc2VYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgICBGSUxFICpmaWxlID0gZm9wZW4ocGF0aCwgInIiKTsKKworICAgIGlmIChmaWxlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coInVuYWJsZSB0byBvcGVuIG1lZGlhIGNvZGVjcyBjb25maWd1cmF0aW9uIHhtbCBmaWxlOiAlcyIsIHBhdGgpOworICAgICAgICBtSW5pdENoZWNrID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBYTUxfUGFyc2VyIHBhcnNlciA9IDo6WE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKICAgICBDSEVDSyhwYXJzZXIgIT0gTlVMTCk7CkBAIC0xMDMsNyArMjEwLDcgQEAKICAgICB3aGlsZSAobUluaXRDaGVjayA9PSBPSykgewogICAgICAgICB2b2lkICpidWZmID0gOjpYTUxfR2V0QnVmZmVyKHBhcnNlciwgQlVGRl9TSVpFKTsKICAgICAgICAgaWYgKGJ1ZmYgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBpbiBjYWxsIHRvIFhNTF9HZXRCdWZmZXIoKSIpOworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCBpbiBjYWxsIHRvIFhNTF9HZXRCdWZmZXIoKSIpOwogICAgICAgICAgICAgbUluaXRDaGVjayA9IFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTE1LDggKzIyMiw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGlmICg6OlhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGJ5dGVzX3JlYWQsIGJ5dGVzX3JlYWQgPT0gMCkKLSAgICAgICAgICAgICAgICAhPSBYTUxfU1RBVFVTX09LKSB7CisgICAgICAgIFhNTF9TdGF0dXMgc3RhdHVzID0gOjpYTUxfUGFyc2VCdWZmZXIocGFyc2VyLCBieXRlc19yZWFkLCBieXRlc19yZWFkID09IDApOworICAgICAgICBpZiAoc3RhdHVzICE9IFhNTF9TVEFUVVNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJtYWxmb3JtZWQgKCVzKSIsIDo6WE1MX0Vycm9yU3RyaW5nKDo6WE1MX0dldEVycm9yQ29kZShwYXJzZXIpKSk7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEyOCwyNSArMjM2LDggQEAKIAogICAgIDo6WE1MX1BhcnNlckZyZWUocGFyc2VyKTsKIAotICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBtQ29kZWNJbmZvcy5zaXplKCk7IGktLSA+IDA7KSB7Ci0gICAgICAgICAgICBDb2RlY0luZm8gKmluZm8gPSAmbUNvZGVjSW5mb3MuZWRpdEl0ZW1BdChpKTsKLQotICAgICAgICAgICAgaWYgKGluZm8tPm1UeXBlcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gdHlwZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50Pz8/Ci0KLSAgICAgICAgICAgICAgICBBTE9HVygiQ29tcG9uZW50ICVzIGRvZXMgbm90IHN1cHBvcnQgYW55IHR5cGUgb2YgbWVkaWE/IiwKLSAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tTmFtZS5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgIG1Db2RlY0luZm9zLnJlbW92ZUF0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgbUNvZGVjSW5mb3MuY2xlYXIoKTsKLSAgICAgICAgbUNvZGVjUXVpcmtzLmNsZWFyKCk7Ci0gICAgfQorICAgIGZjbG9zZShmaWxlKTsKKyAgICBmaWxlID0gTlVMTDsKIH0KIAogLy8gc3RhdGljCkBAIC0xNjAsMTIgKzI1MSw2NSBAQAogICAgIHN0YXRpY19jYXN0PE1lZGlhQ29kZWNMaXN0ICo+KG1lKS0+ZW5kRWxlbWVudEhhbmRsZXIobmFtZSk7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWNMaXN0OjppbmNsdWRlWE1MRmlsZShjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBjb25zdCBjaGFyICpocmVmID0gTlVMTDsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJocmVmIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHJlZiA9IGF0dHJzW2kgKyAxXTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICAvLyBGb3Igc2VjdXJpdHkgcmVhc29ucyBhbmQgZm9yIHNpbXBsaWNpdHksIGZpbGUgbmFtZXMgY2FuIG9ubHkgY29udGFpbgorICAgIC8vIFthLXpBLVowLTlfLl0gYW5kIG11c3Qgc3RhcnQgd2l0aCAgbWVkaWFfY29kZWNzXyBhbmQgZW5kIHdpdGggLnhtbAorICAgIGZvciAoaSA9IDA7IGhyZWZbaV0gIT0gJ1wwJzsgaSsrKSB7CisgICAgICAgIGlmIChocmVmW2ldID09ICcuJyB8fCBocmVmW2ldID09ICdfJyB8fAorICAgICAgICAgICAgICAgIChocmVmW2ldID49ICcwJyAmJiBocmVmW2ldIDw9ICc5JykgfHwKKyAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnQScgJiYgaHJlZltpXSA8PSAnWicpIHx8CisgICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJ2EnICYmIGhyZWZbaV0gPD0gJ3onKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0UoImludmFsaWQgaW5jbHVkZSBmaWxlIG5hbWU6ICVzIiwgaHJlZik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIEFTdHJpbmcgZmlsZW5hbWUgPSBocmVmOworICAgIGlmICghZmlsZW5hbWUuc3RhcnRzV2l0aCgibWVkaWFfY29kZWNzXyIpIHx8CisgICAgICAgICFmaWxlbmFtZS5lbmRzV2l0aCgiLnhtbCIpKSB7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgZmlsZW5hbWUuaW5zZXJ0KG1IcmVmQmFzZSwgMCk7CisKKyAgICBwYXJzZVhNTEZpbGUoZmlsZW5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKIHZvaWQgTWVkaWFDb2RlY0xpc3Q6OnN0YXJ0RWxlbWVudEhhbmRsZXIoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBib29sIGluVHlwZSA9IHRydWU7CisKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiSW5jbHVkZSIpKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBpbmNsdWRlWE1MRmlsZShhdHRycyk7CisgICAgICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgICAgICBtUGFzdFNlY3Rpb25zLnB1c2gobUN1cnJlbnRTZWN0aW9uKTsKKyAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fSU5DTFVERTsKKyAgICAgICAgfQorICAgICAgICArK21EZXB0aDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIHN3aXRjaCAobUN1cnJlbnRTZWN0aW9uKSB7CiAgICAgICAgIGNhc2UgU0VDVElPTl9UT1BMRVZFTDoKICAgICAgICAgewpAQCAtMjA2LDYgKzM1MCwyNSBAQAogICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRRdWlyayhhdHRycyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlR5cGUiKSkgewogICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoYXR0cnMpOworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNlY3Rpb24gPT0gU0VDVElPTl9ERUNPREVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTRUNUSU9OX0RFQ09ERVJfVFlQRSA6IFNFQ1RJT05fRU5DT0RFUl9UWVBFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpblR5cGUgPSBmYWxzZTsKKyAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJfVFlQRToKKyAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJfVFlQRToKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaWdub3JlIGxpbWl0cyBhbmQgZmVhdHVyZXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgdHlwZQorICAgICAgICAgICAgYm9vbCBvdXRzaWRlID0gIWluVHlwZSAmJiAhbUN1cnJlbnRJbmZvLT5tSGFzU29sZU1pbWU7CisgICAgICAgICAgICBpZiAob3V0c2lkZSAmJiAoIXN0cmNtcChuYW1lLCAiTGltaXQiKSB8fCAhc3RyY21wKG5hbWUsICJGZWF0dXJlIikpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nICVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIGEgVHlwZSIsIG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJMaW1pdCIpKSB7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZExpbWl0KGF0dHJzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiRmVhdHVyZSIpKSB7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZEZlYXR1cmUoYXR0cnMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIzOSwxMCArNDAyLDI1IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSX1RZUEU6CisgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSX1RZUEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJUeXBlIikpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQorICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTZWN0aW9uID09IFNFQ1RJT05fREVDT0RFUl9UWVBFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTRUNUSU9OX0RFQ09ERVIgOiBTRUNUSU9OX0VOQ09ERVIpOworCisgICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5jb21wbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUjoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lZGlhQ29kZWMiKSkgewogICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5jb21wbGV0ZSgpOworICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mbyA9IE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjUxLDYgKzQyOSwxNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWVkaWFDb2RlYyIpKSB7CiAgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKKyAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8tPmNvbXBsZXRlKCk7OworICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mbyA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9JTkNMVURFOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiSW5jbHVkZSIpICYmIG1QYXN0U2VjdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IG1QYXN0U2VjdGlvbnMudG9wKCk7CisgICAgICAgICAgICAgICAgbVBhc3RTZWN0aW9ucy5wb3AoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yOTIsMjMgKzQ4MSwzNyBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBhZGRNZWRpYUNvZGVjKGVuY29kZXIsIG5hbWUsIHR5cGUpOwotCisgICAgbUN1cnJlbnRJbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKG5hbWUsIGVuY29kZXIsIHR5cGUpOworICAgIC8vIFRoZSBuZXh0IHN0ZXAgaW52b2x2ZXMgdHJ5aW5nIHRvIGxvYWQgdGhlIGNvZGVjLCB3aGljaCBtYXkKKyAgICAvLyBmYWlsLiAgT25seSBsaXN0IHRoZSBjb2RlYyBpZiB0aGlzIHN1Y2NlZWRzLgorICAgIC8vIEhvd2V2ZXIsIGtlZXAgbUN1cnJlbnRJbmZvIG9iamVjdCBhcm91bmQgdW50aWwgcGFyc2luZworICAgIC8vIG9mIGZ1bGwgY29kZWMgaW5mbyBpcyBjb21wbGV0ZWQuCisgICAgaWYgKGluaXRpYWxpemVDYXBhYmlsaXRpZXModHlwZSkgPT0gT0spIHsKKyAgICAgICAgbUNvZGVjSW5mb3MucHVzaF9iYWNrKG1DdXJyZW50SW5mbyk7CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBNZWRpYUNvZGVjTGlzdDo6YWRkTWVkaWFDb2RlYygKLSAgICAgICAgYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlKSB7Ci0gICAgbUNvZGVjSW5mb3MucHVzaCgpOwotICAgIENvZGVjSW5mbyAqaW5mbyA9ICZtQ29kZWNJbmZvcy5lZGl0SXRlbUF0KG1Db2RlY0luZm9zLnNpemUoKSAtIDEpOwotICAgIGluZm8tPm1OYW1lID0gbmFtZTsKLSAgICBpbmZvLT5tSXNFbmNvZGVyID0gZW5jb2RlcjsKLSAgICBpbmZvLT5tVHlwZXMgPSAwOwotICAgIGluZm8tPm1RdWlya3MgPSAwOwotCi0gICAgaWYgKHR5cGUgIT0gTlVMTCkgewotICAgICAgICBhZGRUeXBlKHR5cGUpOworc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmluaXRpYWxpemVDYXBhYmlsaXRpZXMoY29uc3QgY2hhciAqdHlwZSkgeworICAgIGlmICh0eXBlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KKworICAgIEFMT0dWKCJpbml0aWFsaXplQ2FwYWJpbGl0aWVzICVzOiVzIiwKKyAgICAgICAgICAgIG1DdXJyZW50SW5mby0+bU5hbWUuY19zdHIoKSwgdHlwZSk7CisKKyAgICBDb2RlY0NhcGFiaWxpdGllcyBjYXBzOworICAgIHN0YXR1c190IGVyciA9IFF1ZXJ5Q29kZWMoCisgICAgICAgICAgICBtT01YLAorICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5tTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgIG1DdXJyZW50SW5mby0+bUlzRW5jb2RlciwKKyAgICAgICAgICAgICZjYXBzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIG1DdXJyZW50SW5mby0+aW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjYXBzKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycykgewpAQCAtMzMzLDI0ICs1MzYsNyBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICB1aW50MzJfdCBiaXQ7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1Db2RlY1F1aXJrcy5pbmRleE9mS2V5KG5hbWUpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgYml0ID0gbUNvZGVjUXVpcmtzLnNpemUoKTsKLQotICAgICAgICBpZiAoYml0ID09IDMyKSB7Ci0gICAgICAgICAgICBBTE9HVygiVG9vIG1hbnkgZGlzdGluY3QgcXVpcmsgbmFtZXMgaW4gY29uZmlndXJhdGlvbi4iKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db2RlY1F1aXJrcy5hZGQobmFtZSwgYml0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBiaXQgPSBtQ29kZWNRdWlya3MudmFsdWVBdChpbmRleCk7Ci0gICAgfQotCi0gICAgQ29kZWNJbmZvICppbmZvID0gJm1Db2RlY0luZm9zLmVkaXRJdGVtQXQobUNvZGVjSW5mb3Muc2l6ZSgpIC0gMSk7Ci0gICAgaW5mby0+bVF1aXJrcyB8PSAxdWwgPDwgYml0OwotCisgICAgbUN1cnJlbnRJbmZvLT5hZGRRdWlyayhuYW1lKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTM3Niw1NyArNTYyLDI4MCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBhZGRUeXBlKG5hbWUpOworICAgIHN0YXR1c190IHJldCA9IG1DdXJyZW50SW5mby0+YWRkTWltZShuYW1lKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQogCisgICAgLy8gVGhlIG5leHQgc3RlcCBpbnZvbHZlcyB0cnlpbmcgdG8gbG9hZCB0aGUgY29kZWMsIHdoaWNoIG1heQorICAgIC8vIGZhaWwuICBIYW5kbGUgdGhpcyBncmFjZWZ1bGx5IChieSBub3QgcmVwb3J0aW5nIHN1Y2ggbWltZSkuCisgICAgaWYgKGluaXRpYWxpemVDYXBhYmlsaXRpZXMobmFtZSkgIT0gT0spIHsKKyAgICAgICAgbUN1cnJlbnRJbmZvLT5yZW1vdmVNaW1lKG5hbWUpOworICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY0xpc3Q6OmFkZFR5cGUoY29uc3QgY2hhciAqbmFtZSkgewotICAgIHVpbnQzMl90IGJpdDsKLSAgICBzc2l6ZV90IGluZGV4ID0gbVR5cGVzLmluZGV4T2ZLZXkobmFtZSk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBiaXQgPSBtVHlwZXMuc2l6ZSgpOwotCi0gICAgICAgIGlmIChiaXQgPT0gMzIpIHsKLSAgICAgICAgICAgIEFMT0dXKCJUb28gbWFueSBkaXN0aW5jdCB0eXBlIG5hbWVzIGluIGNvbmZpZ3VyYXRpb24uIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtVHlwZXMuYWRkKG5hbWUsIGJpdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYml0ID0gbVR5cGVzLnZhbHVlQXQoaW5kZXgpOwotICAgIH0KLQotICAgIENvZGVjSW5mbyAqaW5mbyA9ICZtQ29kZWNJbmZvcy5lZGl0SXRlbUF0KG1Db2RlY0luZm9zLnNpemUoKSAtIDEpOwotICAgIGluZm8tPm1UeXBlcyB8PSAxdWwgPDwgYml0OwotfQotCisvLyBsZWdhY3kgbWV0aG9kIGZvciBub24tYWR2YW5jZWQgY29kZWNzCiBzc2l6ZV90IE1lZGlhQ29kZWNMaXN0OjpmaW5kQ29kZWNCeVR5cGUoCiAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgZW5jb2Rlciwgc2l6ZV90IHN0YXJ0SW5kZXgpIGNvbnN0IHsKLSAgICBzc2l6ZV90IHR5cGVJbmRleCA9IG1UeXBlcy5pbmRleE9mS2V5KHR5cGUpOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphZHZhbmNlZEZlYXR1cmVzW10gPSB7CisgICAgICAgICJmZWF0dXJlLXNlY3VyZS1wbGF5YmFjayIsCisgICAgICAgICJmZWF0dXJlLXR1bm5lbGVkLXBsYXliYWNrIiwKKyAgICB9OwogCi0gICAgaWYgKHR5cGVJbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQorICAgIHNpemVfdCBudW1Db2RlY3MgPSBtQ29kZWNJbmZvcy5zaXplKCk7CisgICAgZm9yICg7IHN0YXJ0SW5kZXggPCBudW1Db2RlY3M7ICsrc3RhcnRJbmRleCkgeworICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbyAmaW5mbyA9ICptQ29kZWNJbmZvcy5pdGVtQXQoc3RhcnRJbmRleCkuZ2V0KCk7CiAKLSAgICB1aW50MzJfdCB0eXBlTWFzayA9IDF1bCA8PCBtVHlwZXMudmFsdWVBdCh0eXBlSW5kZXgpOworICAgICAgICBpZiAoaW5mby5pc0VuY29kZXIoKSAhPSBlbmNvZGVyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBhYmlsaXRpZXMgPSBpbmZvLmdldENhcGFiaWxpdGllc0Zvcih0eXBlKTsKKyAgICAgICAgaWYgKGNhcGFiaWxpdGllcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmRldGFpbHMgPSBjYXBhYmlsaXRpZXMtPmdldERldGFpbHMoKTsKIAotICAgIHdoaWxlIChzdGFydEluZGV4IDwgbUNvZGVjSW5mb3Muc2l6ZSgpKSB7Ci0gICAgICAgIGNvbnN0IENvZGVjSW5mbyAmaW5mbyA9IG1Db2RlY0luZm9zLml0ZW1BdChzdGFydEluZGV4KTsKLQotICAgICAgICBpZiAoaW5mby5tSXNFbmNvZGVyID09IGVuY29kZXIgJiYgKGluZm8ubVR5cGVzICYgdHlwZU1hc2spKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKKyAgICAgICAgaW50MzJfdCByZXF1aXJlZDsKKyAgICAgICAgYm9vbCBpc0FkdmFuY2VkID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBBUlJBWV9TSVpFKGFkdmFuY2VkRmVhdHVyZXMpOyBpeCsrKSB7CisgICAgICAgICAgICBpZiAoZGV0YWlscy0+ZmluZEludDMyKGFkdmFuY2VkRmVhdHVyZXNbaXhdLCAmcmVxdWlyZWQpICYmCisgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkICE9IDApIHsKKyAgICAgICAgICAgICAgICBpc0FkdmFuY2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgICsrc3RhcnRJbmRleDsKKyAgICAgICAgaWYgKCFpc0FkdmFuY2VkKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiAtRU5PRU5UOwogfQogCitzdGF0aWMgc3RhdHVzX3QgbGltaXRGb3VuZE1pc3NpbmdBdHRyKEFTdHJpbmcgbmFtZSwgY29uc3QgY2hhciAqYXR0ciwgYm9vbCBmb3VuZCA9IHRydWUpIHsKKyAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoICVzJyVzJyBhdHRyaWJ1dGUiLCBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAoZm91bmQgPyAiIiA6ICJubyAiKSwgYXR0cik7CisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBsaW1pdEVycm9yKEFTdHJpbmcgbmFtZSwgY29uc3QgY2hhciAqbXNnKSB7CisgICAgQUxPR0UoImxpbWl0ICclcycgJXMiLCBuYW1lLmNfc3RyKCksIG1zZyk7CisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBsaW1pdEludmFsaWRBdHRyKEFTdHJpbmcgbmFtZSwgY29uc3QgY2hhciAqYXR0ciwgQVN0cmluZyB2YWx1ZSkgeworICAgIEFMT0dFKCJsaW1pdCAnJXMnIHdpdGggaW52YWxpZCAnJXMnIGF0dHJpYnV0ZSAoJXMpIiwgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgYXR0ciwgdmFsdWUuY19zdHIoKSk7CisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNMaXN0OjphZGRMaW1pdChjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGF0dHJpYnV0ZXMgd2l0aCB2YWx1ZXMKKyAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAiZGVmYXVsdCIpCisgICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgImluIikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAibWF4IikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAibWluIikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAicmFuZ2UiKQorICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJyYW5nZXMiKQorICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJzY2FsZSIpCisgICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgInZhbHVlIikpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKGF0dHJzW2ldLCBhdHRyc1tpICsgMV0pOworICAgICAgICAgICAgKytpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIEFTdHJpbmcgbmFtZTsKKyAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygibmFtZSIsICZuYW1lKSkgeworICAgICAgICBBTE9HRSgibGltaXQgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vIHNpemUsIGJsb2NrcywgYml0cmF0ZSwgZnJhbWUtcmF0ZSwgYmxvY2tzLXBlci1zZWNvbmQsIGFzcGVjdC1yYXRpbzogcmFuZ2UKKyAgICAvLyBxdWFsaXR5OiByYW5nZSArIGRlZmF1bHQgKyBbc2NhbGVdCisgICAgLy8gY29tcGxleGl0eTogcmFuZ2UgKyBkZWZhdWx0CisgICAgYm9vbCBmb3VuZDsKKworICAgIGlmIChuYW1lID09ICJhc3BlY3QtcmF0aW8iIHx8IG5hbWUgPT0gImJpdHJhdGUiIHx8IG5hbWUgPT0gImJsb2NrLWNvdW50IgorICAgICAgICAgICAgfHwgbmFtZSA9PSAiYmxvY2tzLXBlci1zZWNvbmQiIHx8IG5hbWUgPT0gImNvbXBsZXhpdHkiCisgICAgICAgICAgICB8fCBuYW1lID09ICJmcmFtZS1yYXRlIiB8fCBuYW1lID09ICJxdWFsaXR5IiB8fCBuYW1lID09ICJzaXplIikgeworICAgICAgICBBU3RyaW5nIG1pbiwgbWF4OworICAgICAgICBpZiAobXNnLT5maW5kU3RyaW5nKCJtaW4iLCAmbWluKSAmJiBtc2ctPmZpbmRTdHJpbmcoIm1heCIsICZtYXgpKSB7CisgICAgICAgICAgICBtaW4uYXBwZW5kKCItIik7CisgICAgICAgICAgICBtaW4uYXBwZW5kKG1heCk7CisgICAgICAgICAgICBpZiAobXNnLT5jb250YWlucygicmFuZ2UiKSB8fCBtc2ctPmNvbnRhaW5zKCJ2YWx1ZSIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgImhhcyAnbWluJyBhbmQgJ21heCcgYXMgd2VsbCBhcyAncmFuZ2UnIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIndmFsdWUnIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKCJyYW5nZSIsIG1pbik7CisgICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygibWluIikgfHwgbXNnLT5jb250YWlucygibWF4IikpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKG5hbWUsICJoYXMgb25seSAnbWluJyBvciAnbWF4JyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRTdHJpbmcoInZhbHVlIiwgJm1heCkpIHsKKyAgICAgICAgICAgIG1pbiA9IG1heDsKKyAgICAgICAgICAgIG1pbi5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgIG1pbi5hcHBlbmQobWF4KTsKKyAgICAgICAgICAgIGlmIChtc2ctPmNvbnRhaW5zKCJyYW5nZSIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgImhhcyBib3RoICdyYW5nZScgYW5kICd2YWx1ZScgYXR0cmlidXRlcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoInJhbmdlIiwgbWluKTsKKyAgICAgICAgfQorCisgICAgICAgIEFTdHJpbmcgcmFuZ2UsIHNjYWxlID0gImxpbmVhciIsIGRlZiwgaW5fOworICAgICAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygicmFuZ2UiLCAmcmFuZ2UpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihuYW1lLCAid2l0aCBubyAncmFuZ2UnLCAndmFsdWUnIG9yICdtaW4nLydtYXgnIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobmFtZSA9PSAicXVhbGl0eSIgfHwgbmFtZSA9PSAiY29tcGxleGl0eSIpIF4KKyAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoImRlZmF1bHQiLCAmZGVmKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImRlZmF1bHQiLCBmb3VuZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgIT0gInF1YWxpdHkiICYmIG1zZy0+ZmluZFN0cmluZygic2NhbGUiLCAmc2NhbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJzY2FsZSIpOworICAgICAgICB9CisgICAgICAgIGlmICgobmFtZSA9PSAiYXNwZWN0LXJhdGlvIikgXiAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoImluIiwgJmluXykpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJpbiIsIGZvdW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lID09ICJhc3BlY3QtcmF0aW8iKSB7CisgICAgICAgICAgICBpZiAoIShpbl8gPT0gInBpeGVscyIpICYmICEoaW5fID09ICJibG9ja3MiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEludmFsaWRBdHRyKG5hbWUsICJpbiIsIGluXyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbl8uZXJhc2UoNSwgMSk7IC8vIChwaXhlbHxibG9jayktYXNwZWN0LXJhdGlvCisgICAgICAgICAgICBpbl8uYXBwZW5kKCItIik7CisgICAgICAgICAgICBpbl8uYXBwZW5kKG5hbWUpOworICAgICAgICAgICAgbmFtZSA9IGluXzsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZSA9PSAicXVhbGl0eSIpIHsKKyAgICAgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKCJxdWFsaXR5LXNjYWxlIiwgc2NhbGUpOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lID09ICJxdWFsaXR5IiB8fCBuYW1lID09ICJjb21wbGV4aXR5IikgeworICAgICAgICAgICAgQVN0cmluZyB0YWcgPSBuYW1lOworICAgICAgICAgICAgdGFnLmFwcGVuZCgiLWRlZmF1bHQiKTsKKyAgICAgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKHRhZywgZGVmKTsKKyAgICAgICAgfQorICAgICAgICBBU3RyaW5nIHRhZyA9IG5hbWU7CisgICAgICAgIHRhZy5hcHBlbmQoIi1yYW5nZSIpOworICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbCh0YWcsIHJhbmdlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU3RyaW5nIG1heCwgdmFsdWUsIHJhbmdlczsKKyAgICAgICAgaWYgKG1zZy0+Y29udGFpbnMoImRlZmF1bHQiKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiZGVmYXVsdCIpOworICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoImluIikpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImluIik7CisgICAgICAgIH0gZWxzZSBpZiAoKG5hbWUgPT0gImNoYW5uZWwtY291bnQiKSBeCisgICAgICAgICAgICAgICAgKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJtYXgiLCAmbWF4KSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgIm1heCIsIGZvdW5kKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJtaW4iKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAibWluIik7CisgICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygicmFuZ2UiKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAicmFuZ2UiKTsKKyAgICAgICAgfSBlbHNlIGlmICgobmFtZSA9PSAic2FtcGxlLXJhdGUiKSBeCisgICAgICAgICAgICAgICAgKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJyYW5nZXMiLCAmcmFuZ2VzKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInJhbmdlcyIsIGZvdW5kKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJzY2FsZSIpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJzY2FsZSIpOworICAgICAgICB9IGVsc2UgaWYgKChuYW1lID09ICJhbGlnbm1lbnQiIHx8IG5hbWUgPT0gImJsb2NrLXNpemUiKSBeCisgICAgICAgICAgICAgICAgKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJ2YWx1ZSIsICZ2YWx1ZSkpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJ2YWx1ZSIsIGZvdW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYXguc2l6ZSgpKSB7CisgICAgICAgICAgICBBU3RyaW5nIHRhZyA9ICJtYXgtIjsKKyAgICAgICAgICAgIHRhZy5hcHBlbmQobmFtZSk7CisgICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbCh0YWcsIG1heCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuc2l6ZSgpKSB7CisgICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbChuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAocmFuZ2VzLnNpemUoKSkgeworICAgICAgICAgICAgQVN0cmluZyB0YWcgPSBuYW1lOworICAgICAgICAgICAgdGFnLmFwcGVuZCgiLXJhbmdlcyIpOworICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGREZXRhaWwodGFnLCByYW5nZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIHVucmVjb2duaXplZCBsaW1pdCAnJXMnIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBib29sIHBhcnNlQm9vbGVhbihjb25zdCBjaGFyICpzKSB7CisgICAgaWYgKCFzdHJjYXNlY21wKHMsICJ0cnVlIikgfHwgIXN0cmNhc2VjbXAocywgInllcyIpIHx8ICFzdHJjYXNlY21wKHMsICJ5IikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNoYXIgKmVuZDsKKyAgICB1bnNpZ25lZCBsb25nIHJlcyA9IHN0cnRvdWwocywgJmVuZCwgMTApOworICAgIHJldHVybiAqcyAhPSAnXDAnICYmICplbmQgPT0gJ1wwJyAmJiByZXMgPiAwOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgICAgaW50MzJfdCBvcHRpb25hbCA9IC0xOworICAgIGludDMyX3QgcmVxdWlyZWQgPSAtMTsKKyAgICBjb25zdCBjaGFyICp2YWx1ZSA9IE5VTEw7CisKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgeworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXR0cmlidXRlcyB3aXRoIHZhbHVlcworICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAib3B0aW9uYWwiKSB8fCAhc3RyY21wKGF0dHJzW2ldLCAicmVxdWlyZWQiKSkgeworICAgICAgICAgICAgaW50IHZhbHVlID0gKGludClwYXJzZUJvb2xlYW4oYXR0cnNbaSArIDFdKTsKKyAgICAgICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAib3B0aW9uYWwiKSkgeworICAgICAgICAgICAgICAgIG9wdGlvbmFsID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInZhbHVlIikpIHsKKyAgICAgICAgICAgIHZhbHVlID0gYXR0cnNbaSArIDFdOworICAgICAgICAgICAgKytpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJmZWF0dXJlIHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAob3B0aW9uYWwgPT0gcmVxdWlyZWQgJiYgb3B0aW9uYWwgIT0gLTEpIHsKKyAgICAgICAgQUxPR0UoImZlYXR1cmUgJyVzJyBpcyBib3RoL25laXRoZXIgb3B0aW9uYWwgYW5kIHJlcXVpcmVkIiwgbmFtZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmICgob3B0aW9uYWwgIT0gLTEgfHwgcmVxdWlyZWQgIT0gLTEpICYmICh2YWx1ZSAhPSBOVUxMKSkgeworICAgICAgICBBTE9HRSgiZmVhdHVyZSAnJXMnIGhhcyBib3RoIGEgdmFsdWUgYW5kIG9wdGlvbmFsL3JlcXVpcmVkIGF0dHJpYnV0ZSIsIG5hbWUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICBtQ3VycmVudEluZm8tPmFkZEZlYXR1cmUobmFtZSwgdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRmVhdHVyZShuYW1lLCAocmVxdWlyZWQgPT0gMSkgfHwgKG9wdGlvbmFsID09IDApKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiBzc2l6ZV90IE1lZGlhQ29kZWNMaXN0OjpmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjSW5mb3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgQ29kZWNJbmZvICZpbmZvID0gbUNvZGVjSW5mb3MuaXRlbUF0KGkpOworICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbyAmaW5mbyA9ICptQ29kZWNJbmZvcy5pdGVtQXQoaSkuZ2V0KCk7CiAKICAgICAgICAgaWYgKGluZm8ubU5hbWUgPT0gbmFtZSkgewogICAgICAgICAgICAgcmV0dXJuIGk7CkBAIC00NDAsMTA4ICs4NDksNCBAQAogICAgIHJldHVybiBtQ29kZWNJbmZvcy5zaXplKCk7CiB9CiAKLWNvbnN0IGNoYXIgKk1lZGlhQ29kZWNMaXN0OjpnZXRDb2RlY05hbWUoc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgaWYgKGluZGV4ID49IG1Db2RlY0luZm9zLnNpemUoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBjb25zdCBDb2RlY0luZm8gJmluZm8gPSBtQ29kZWNJbmZvcy5pdGVtQXQoaW5kZXgpOwotICAgIHJldHVybiBpbmZvLm1OYW1lLmNfc3RyKCk7Ci19Ci0KLWJvb2wgTWVkaWFDb2RlY0xpc3Q6OmlzRW5jb2RlcihzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICBpZiAoaW5kZXggPj0gbUNvZGVjSW5mb3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGNvbnN0IENvZGVjSW5mbyAmaW5mbyA9IG1Db2RlY0luZm9zLml0ZW1BdChpbmRleCk7Ci0gICAgcmV0dXJuIGluZm8ubUlzRW5jb2RlcjsKLX0KLQotYm9vbCBNZWRpYUNvZGVjTGlzdDo6Y29kZWNIYXNRdWlyaygKLSAgICAgICAgc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICpxdWlya05hbWUpIGNvbnN0IHsKLSAgICBpZiAoaW5kZXggPj0gbUNvZGVjSW5mb3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGNvbnN0IENvZGVjSW5mbyAmaW5mbyA9IG1Db2RlY0luZm9zLml0ZW1BdChpbmRleCk7Ci0KLSAgICBpZiAoaW5mby5tUXVpcmtzICE9IDApIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Db2RlY1F1aXJrcy5pbmRleE9mS2V5KHF1aXJrTmFtZSk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZm8ubVF1aXJrcyAmICgxdWwgPDwgbUNvZGVjUXVpcmtzLnZhbHVlQXQoaW5kZXgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNMaXN0OjpnZXRTdXBwb3J0ZWRUeXBlcygKLSAgICAgICAgc2l6ZV90IGluZGV4LCBWZWN0b3I8QVN0cmluZz4gKnR5cGVzKSBjb25zdCB7Ci0gICAgdHlwZXMtPmNsZWFyKCk7Ci0KLSAgICBpZiAoaW5kZXggPj0gbUNvZGVjSW5mb3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAtRVJBTkdFOwotICAgIH0KLQotICAgIGNvbnN0IENvZGVjSW5mbyAmaW5mbyA9IG1Db2RlY0luZm9zLml0ZW1BdChpbmRleCk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UeXBlcy5zaXplKCk7ICsraSkgewotICAgICAgICB1aW50MzJfdCB0eXBlTWFzayA9IDF1bCA8PCBtVHlwZXMudmFsdWVBdChpKTsKLQotICAgICAgICBpZiAoaW5mby5tVHlwZXMgJiB0eXBlTWFzaykgewotICAgICAgICAgICAgdHlwZXMtPnB1c2gobVR5cGVzLmtleUF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmdldENvZGVjQ2FwYWJpbGl0aWVzKAotICAgICAgICBzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKnR5cGUsCi0gICAgICAgIFZlY3RvcjxQcm9maWxlTGV2ZWw+ICpwcm9maWxlTGV2ZWxzLAotICAgICAgICBWZWN0b3I8dWludDMyX3Q+ICpjb2xvckZvcm1hdHMsCi0gICAgICAgIHVpbnQzMl90ICpmbGFncykgY29uc3QgewotICAgIHByb2ZpbGVMZXZlbHMtPmNsZWFyKCk7Ci0gICAgY29sb3JGb3JtYXRzLT5jbGVhcigpOwotCi0gICAgaWYgKGluZGV4ID49IG1Db2RlY0luZm9zLnNpemUoKSkgewotICAgICAgICByZXR1cm4gLUVSQU5HRTsKLSAgICB9Ci0KLSAgICBjb25zdCBDb2RlY0luZm8gJmluZm8gPSBtQ29kZWNJbmZvcy5pdGVtQXQoaW5kZXgpOwotCi0gICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICBzdGF0dXNfdCBlcnIgPSBjbGllbnQuY29ubmVjdCgpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBDb2RlY0NhcGFiaWxpdGllcyBjYXBzOwotICAgIGVyciA9IFF1ZXJ5Q29kZWMoCi0gICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgICAgICBpbmZvLm1OYW1lLmNfc3RyKCksIHR5cGUsIGluZm8ubUlzRW5jb2RlciwgJmNhcHMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2Fwcy5tUHJvZmlsZUxldmVscy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCAmc3JjID0gY2Fwcy5tUHJvZmlsZUxldmVscy5pdGVtQXQoaSk7Ci0KLSAgICAgICAgUHJvZmlsZUxldmVsIHByb2ZpbGVMZXZlbDsKLSAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlID0gc3JjLm1Qcm9maWxlOwotICAgICAgICBwcm9maWxlTGV2ZWwubUxldmVsID0gc3JjLm1MZXZlbDsKLSAgICAgICAgcHJvZmlsZUxldmVscy0+cHVzaChwcm9maWxlTGV2ZWwpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2Fwcy5tQ29sb3JGb3JtYXRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbG9yRm9ybWF0cy0+cHVzaChjYXBzLm1Db2xvckZvcm1hdHMuaXRlbUF0KGkpKTsKLSAgICB9Ci0KLSAgICAqZmxhZ3MgPSBjYXBzLm1GbGFnczsKLQotICAgIHJldHVybiBPSzsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlY2RhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCkBAIC0wLDAgKzEsODkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhQ29kZWNTb3VyY2UiCisjZGVmaW5lIERFQlVHX0RSSUZUX1RJTUUgMAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgUHVsbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKKworICAgIHN0YXR1c190IHN0YXJ0KGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworICAgIHZvaWQgc3RvcCgpOworCisgICAgdm9pZCBwYXVzZSgpOworICAgIHZvaWQgcmVzdW1lKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgflB1bGxlcigpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdFN0YXJ0ID0gJ21zdGEnLAorICAgICAgICBrV2hhdFN0b3AsCisgICAgICAgIGtXaGF0UHVsbCwKKyAgICAgICAga1doYXRQYXVzZSwKKyAgICAgICAga1doYXRSZXN1bWUsCisgICAgfTsKKworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgaW50MzJfdCBtUHVsbEdlbmVyYXRpb247CisgICAgYm9vbCBtSXNBdWRpbzsKKyAgICBib29sIG1QYXVzZWQ7CisgICAgYm9vbCBtUmVhY2hlZEVPUzsKKworICAgIHN0YXR1c190IHBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgc2NoZWR1bGVQdWxsKCk7CisgICAgdm9pZCBoYW5kbGVFT1MoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFB1bGxlcik7Cit9OworCitNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OlB1bGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkKKyAgICA6IG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIoKSksCisgICAgICBtUHVsbEdlbmVyYXRpb24oMCksCisgICAgICBtSXNBdWRpbyhmYWxzZSksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1SZWFjaGVkRU9TKGZhbHNlKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgbUlzQXVkaW8gPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOworCisgICAgbUxvb3Blci0+c2V0TmFtZSgicHVsbF9sb29wZXIiKTsKK30KKworTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjp+UHVsbGVyKCkgeworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOworICAgIG1Mb29wZXItPnN0b3AoKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCFyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgeworICAgICAgICBlcnIgPSBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OnN0YXJ0KGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpIHsKKyAgICBBTE9HVigicHVsbGVyICglcykgc3RhcnQiLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICBtTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgIGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywKKyAgICAgICAgICAgIGZhbHNlIC8qIGNhbkNhbGxKYXZhICovLAorICAgICAgICAgICAgUFJJT1JJVFlfQVVESU8pOworICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKKyAgICBtTm90aWZ5ID0gbm90aWZ5OworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKTsKKyAgICBtc2ctPnNldE9iamVjdCgibWV0YSIsIG1ldGEpOworICAgIHJldHVybiBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG1zZyk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpzdG9wKCkgeworICAgIC8vIFN0b3Agc291cmNlIGZyb20gY2FsbGVyJ3MgdGhyZWFkIGluc3RlYWQgb2YgcHVsbGVyJ3MgbG9vcGVyLgorICAgIC8vIG1Tb3VyY2UtPnN0b3AoKSBpcyB0aHJlYWQtc2FmZSwgZG9pbmcgaXQgb3V0c2lkZSB0aGUgcHVsbGVyJ3MKKyAgICAvLyBsb29wZXIgYWxsb3dzIHVzIHRvIGF0IGxlYXN0IHN0b3AgaWYgc291cmNlIGdldHMgc3R1Y2suCisgICAgLy8gSWYgc291cmNlIGdldHMgc3R1Y2sgaW4gcmVhZCgpLCB0aGUgbG9vcGVyIHdvdWxkIG5ldmVyCisgICAgLy8gYmUgYWJsZSB0byBwcm9jZXNzIHRoZSBzdG9wKCksIHdoaWNoIGNvdWxkIGxlYWQgdG8gQU5SLgorCisgICAgQUxPR1YoInNvdXJjZSAoJXMpIHN0b3BwaW5nIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgbVNvdXJjZS0+c3RvcCgpOworICAgIEFMT0dWKCJzb3VyY2UgKCVzKSBzdG9wcGVkIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpwYXVzZSgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpKS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6cmVzdW1lKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpKS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6c2NoZWR1bGVQdWxsKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQdWxsLCBpZCgpKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVB1bGxHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OmhhbmRsZUVPUygpIHsKKyAgICBpZiAoIW1SZWFjaGVkRU9TKSB7CisgICAgICAgIEFMT0dWKCJwdWxsZXIgKCVzKSBwb3N0aW5nIEVPUyIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRQb2ludGVyKCJhY2Nlc3NVbml0IiwgTlVMTCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgibWV0YSIsICZvYmopKTsKKworICAgICAgICAgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQoc3RhdGljX2Nhc3Q8TWV0YURhdGEgKj4ob2JqLmdldCgpKSk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZVB1bGwoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworCisgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFN0b3A6CisgICAgICAgIHsKKyAgICAgICAgICAgICsrbVB1bGxHZW5lcmF0aW9uOworCisgICAgICAgICAgICBoYW5kbGVFT1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFB1bGw6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbVB1bGxHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmbWJ1Zik7CisKKyAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1idWYgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdHJlYW0gZW5kZWQsIG1idWYgJXAiLCBtYnVmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3IgJWQgcmVhZGluZyBzdHJlYW0uIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGFuZGxlRU9TKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0UG9pbnRlcigiYWNjZXNzVW5pdCIsIG1idWYpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworCisgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRQYXVzZToKKyAgICAgICAgeworICAgICAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3NwPE1lZGlhQ29kZWNTb3VyY2U+IE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICB1aW50MzJfdCBmbGFncykgeworICAgIHNwPE1lZGlhQ29kZWNTb3VyY2U+IG1lZGlhU291cmNlID0KKyAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjU291cmNlKGxvb3BlciwgZm9ybWF0LCBzb3VyY2UsIGZsYWdzKTsKKworICAgIGlmIChtZWRpYVNvdXJjZS0+aW5pdCgpID09IE9LKSB7CisgICAgICAgIHJldHVybiBtZWRpYVNvdXJjZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhKiBwYXJhbXMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIG1zZy0+c2V0T2JqZWN0KCJtZXRhIiwgcGFyYW1zKTsKKyAgICByZXR1cm4gcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihtc2cpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpzdG9wKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG1zZyk7CisKKyAgICAvLyBtUHVsbGVyLT5zdG9wKCkgbmVlZHMgdG8gYmUgZG9uZSBvdXRzaWRlIE1lZGlhQ29kZWNTb3VyY2UncyBsb29wZXIsCisgICAgLy8gYXMgaXQgY29udGFpbnMgYSBzeW5jaHJvbm91cyBjYWxsIHRvIHN0b3AgdGhlIHVuZGVybHlpbmcgTWVkaWFTb3VyY2UsCisgICAgLy8gd2hpY2ggb2Z0ZW4gd2FpdHMgZm9yIGFsbCBvdXRzdGFuZGluZyBNZWRpYUJ1ZmZlcnMgdG8gcmV0dXJuLCBidXQKKyAgICAvLyBNZWRpYUJ1ZmZlcnMgYXJlIG9ubHkgcmV0dXJuZWQgd2hlbiBNZWRpYUNvZGVjU291cmNlIGxvb3BlciBnZXRzCisgICAgLy8gdG8gcHJvY2VzcyB0aGVtLgorCisgICAgaWYgKG1QdWxsZXIgIT0gTlVMTCkgeworICAgICAgICBBTE9HSSgicHVsbGVyICglcykgc3RvcHBpbmciLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKyAgICAgICAgbVB1bGxlci0+c3RvcCgpOworICAgICAgICBBTE9HSSgicHVsbGVyICglcykgc3RvcHBlZCIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnBhdXNlKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KCk7CisgICAgcmV0dXJuIE9LOworfQorCitzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBNZWRpYUNvZGVjU291cmNlOjpnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSB7CisgICAgQ0hFQ0sobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCk7CisgICAgcmV0dXJuIG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyKiogYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyogLyogb3B0aW9ucyAqLykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtT3V0cHV0QnVmZmVyTG9jayk7CisKKyAgICAqYnVmZmVyID0gTlVMTDsKKyAgICB3aGlsZSAobU91dHB1dEJ1ZmZlclF1ZXVlLnNpemUoKSA9PSAwICYmICFtRW5jb2RlclJlYWNoZWRFT1MpIHsKKyAgICAgICAgbU91dHB1dEJ1ZmZlckNvbmQud2FpdChtT3V0cHV0QnVmZmVyTG9jayk7CisgICAgfQorICAgIGlmICghbUVuY29kZXJSZWFjaGVkRU9TKSB7CisgICAgICAgICpidWZmZXIgPSAqbU91dHB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZS5lcmFzZShtT3V0cHV0QnVmZmVyUXVldWUuYmVnaW4oKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIG1FcnJvckNvZGU7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIoMCk7CisgICAgYnVmZmVyLT5yZWxlYXNlKCk7Cit9CisKK01lZGlhQ29kZWNTb3VyY2U6Ok1lZGlhQ29kZWNTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpCisgICAgOiBtTG9vcGVyKGxvb3BlciksCisgICAgICBtT3V0cHV0Rm9ybWF0KG91dHB1dEZvcm1hdCksCisgICAgICBtTWV0YShuZXcgTWV0YURhdGEpLAorICAgICAgbUZsYWdzKGZsYWdzKSwKKyAgICAgIG1Jc1ZpZGVvKGZhbHNlKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1TdG9wcGluZyhmYWxzZSksCisgICAgICBtRG9Nb3JlV29ya1BlbmRpbmcoZmFsc2UpLAorICAgICAgbUZpcnN0U2FtcGxlVGltZVVzKC0xbGwpLAorICAgICAgbUVuY29kZXJSZWFjaGVkRU9TKGZhbHNlKSwKKyAgICAgIG1FcnJvckNvZGUoT0spIHsKKyAgICBDSEVDSyhtTG9vcGVyICE9IE5VTEwpOworCisgICAgQVN0cmluZyBtaW1lOworICAgIENIRUNLKG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworCisgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZS5jX3N0cigpLCA2KSkgeworICAgICAgICBtSXNWaWRlbyA9IHRydWU7CisgICAgfQorCisgICAgaWYgKCEobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkpIHsKKyAgICAgICAgbVB1bGxlciA9IG5ldyBQdWxsZXIoc291cmNlKTsKKyAgICB9Cit9CisKK01lZGlhQ29kZWNTb3VyY2U6On5NZWRpYUNvZGVjU291cmNlKCkgeworICAgIHJlbGVhc2VFbmNvZGVyKCk7CisKKyAgICBtQ29kZWNMb29wZXItPnN0b3AoKTsKKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yLT5pZCgpKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6aW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RW5jb2RlcigpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZWxlYXNlRW5jb2RlcigpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OmluaXRFbmNvZGVyKCkgeworICAgIG1SZWZsZWN0b3IgPSBuZXcgQUhhbmRsZXJSZWZsZWN0b3I8TWVkaWFDb2RlY1NvdXJjZT4odGhpcyk7CisgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOworCisgICAgbUNvZGVjTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNvZGVjTG9vcGVyLT5zZXROYW1lKCJjb2RlY19sb29wZXIiKTsKKyAgICBtQ29kZWNMb29wZXItPnN0YXJ0KCk7CisKKyAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfTUVUQURBVEFfSU5QVVQpIHsKKyAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoInN0b3JlLW1ldGFkYXRhLWluLWJ1ZmZlcnMiLCAxKTsKKyAgICB9CisKKyAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgeworICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIiwgMSk7CisgICAgfQorCisgICAgQVN0cmluZyBvdXRwdXRNSU1FOworICAgIENIRUNLKG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmb3V0cHV0TUlNRSkpOworCisgICAgbUVuY29kZXIgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUoCisgICAgICAgICAgICBtQ29kZWNMb29wZXIsIG91dHB1dE1JTUUuY19zdHIoKSwgdHJ1ZSAvKiBlbmNvZGVyICovKTsKKworICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIEFMT0dWKCJvdXRwdXQgZm9ybWF0IGlzICclcyciLCBtT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygwKS5jX3N0cigpKTsKKworICAgIHN0YXR1c190IGVyciA9IG1FbmNvZGVyLT5jb25maWd1cmUoCisgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICBOVUxMIC8qIG5hdGl2ZVdpbmRvdyAqLywKKyAgICAgICAgICAgICAgICBOVUxMIC8qIGNyeXB0byAqLywKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjOjpDT05GSUdVUkVfRkxBR19FTkNPREUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1FbmNvZGVyLT5nZXRPdXRwdXRGb3JtYXQoJm1PdXRwdXRGb3JtYXQpOworICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YShtT3V0cHV0Rm9ybWF0LCBtTWV0YSk7CisKKyAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgeworICAgICAgICBDSEVDSyhtSXNWaWRlbyk7CisKKyAgICAgICAgZXJyID0gbUVuY29kZXItPmNyZWF0ZUlucHV0U3VyZmFjZSgmbUdyYXBoaWNCdWZmZXJQcm9kdWNlcik7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVyciA9IG1FbmNvZGVyLT5zdGFydCgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IG1FbmNvZGVyLT5nZXRJbnB1dEJ1ZmZlcnMoJm1FbmNvZGVySW5wdXRCdWZmZXJzKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBtRW5jb2Rlci0+Z2V0T3V0cHV0QnVmZmVycygmbUVuY29kZXJPdXRwdXRCdWZmZXJzKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtRW5jb2RlclJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtRXJyb3JDb2RlID0gT0s7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6cmVsZWFzZUVuY29kZXIoKSB7CisgICAgaWYgKG1FbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1FbmNvZGVyLT5yZWxlYXNlKCk7CisgICAgbUVuY29kZXIuY2xlYXIoKTsKKworICAgIHdoaWxlICghbUlucHV0QnVmZmVyUXVldWUuZW1wdHkoKSkgeworICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9ICptSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpOworICAgICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5lcmFzZShtSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgeworICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRW5jb2RlcklucHV0QnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbUVuY29kZXJJbnB1dEJ1ZmZlcnMuaXRlbUF0KGkpOworICAgICAgICBhY2Nlc3NVbml0LT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7CisgICAgfQorCisgICAgbUVuY29kZXJJbnB1dEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBtRW5jb2Rlck91dHB1dEJ1ZmZlcnMuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6cG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICghcmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKKyAgICAgICAgZXJyID0gT0s7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpzaWduYWxFT1Moc3RhdHVzX3QgZXJyKSB7CisgICAgaWYgKCFtRW5jb2RlclJlYWNoZWRFT1MpIHsKKyAgICAgICAgQUxPR1YoImVuY29kZXIgKCVzKSByZWFjaGVkIEVPUyIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU91dHB1dEJ1ZmZlckxvY2spOworICAgICAgICAgICAgLy8gcmVsZWFzZSBhbGwgdW5yZWFkIG1lZGlhIGJ1ZmZlcnMKKyAgICAgICAgICAgIGZvciAoTGlzdDxNZWRpYUJ1ZmZlcio+OjppdGVyYXRvciBpdCA9IG1PdXRwdXRCdWZmZXJRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBtT3V0cHV0QnVmZmVyUXVldWUuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgICAgICAoKml0KS0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLmNsZWFyKCk7CisgICAgICAgICAgICBtRW5jb2RlclJlYWNoZWRFT1MgPSB0cnVlOworICAgICAgICAgICAgbUVycm9yQ29kZSA9IGVycjsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb25kLnNpZ25hbCgpOworICAgICAgICB9CisKKyAgICAgICAgcmVsZWFzZUVuY29kZXIoKTsKKyAgICB9CisgICAgaWYgKG1TdG9wcGluZyAmJiBtRW5jb2RlclJlYWNoZWRFT1MpIHsKKyAgICAgICAgQUxPR0koImVuY29kZXIgKCVzKSBzdG9wcGVkIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgICAgIC8vIHBvc3RpbmcgcmVwbHkgdG8gZXZlcnlvbmUgdGhhdCdzIHdhaXRpbmcKKyAgICAgICAgTGlzdDx1aW50MzJfdD46Oml0ZXJhdG9yIGl0OworICAgICAgICBmb3IgKGl0ID0gbVN0b3BSZXBseUlEUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBtU3RvcFJlcGx5SURRdWV1ZS5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseSgqaXQpOworICAgICAgICB9CisgICAgICAgIG1TdG9wUmVwbHlJRFF1ZXVlLmNsZWFyKCk7CisgICAgICAgIG1TdG9wcGluZyA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpzdXNwZW5kKCkgeworICAgIENIRUNLKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpOworICAgIGlmIChtRW5jb2RlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIiwgdHJ1ZSk7CisgICAgICAgIG1FbmNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OnJlc3VtZShpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVcykgeworICAgIENIRUNLKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpOworICAgIGlmIChtRW5jb2RlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIiwgZmFsc2UpOworICAgICAgICBpZiAoc2tpcEZyYW1lc0JlZm9yZVVzID4gMCkgeworICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NCgic2tpcC1mcmFtZXMtYmVmb3JlIiwgc2tpcEZyYW1lc0JlZm9yZVVzKTsKKyAgICAgICAgfQorICAgICAgICBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpzY2hlZHVsZURvTW9yZVdvcmsoKSB7CisgICAgaWYgKG1Eb01vcmVXb3JrUGVuZGluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbURvTW9yZVdvcmtQZW5kaW5nID0gdHJ1ZTsKKworICAgIGlmIChtRW5jb2RlckFjdGl2aXR5Tm90aWZ5ID09IE5VTEwpIHsKKyAgICAgICAgbUVuY29kZXJBY3Rpdml0eU5vdGlmeSA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBrV2hhdEVuY29kZXJBY3Rpdml0eSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgfQorICAgIG1FbmNvZGVyLT5yZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obUVuY29kZXJBY3Rpdml0eU5vdGlmeSk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OmZlZWRFbmNvZGVySW5wdXRCdWZmZXJzKCkgeworICAgIHdoaWxlICghbUlucHV0QnVmZmVyUXVldWUuZW1wdHkoKQorICAgICAgICAgICAgJiYgIW1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuZW1wdHkoKSkgeworICAgICAgICBNZWRpYUJ1ZmZlciogbWJ1ZiA9ICptSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpOworICAgICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5lcmFzZShtSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpKTsKKworICAgICAgICBzaXplX3QgYnVmZmVySW5kZXggPSAqbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5iZWdpbigpOworICAgICAgICBtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmVyYXNlKG1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuYmVnaW4oKSk7CisKKyAgICAgICAgaW50NjRfdCB0aW1lVXMgPSAwbGw7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAwOworCisgICAgICAgIGlmIChtYnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgIENIRUNLKG1idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKworICAgICAgICAgICAgLy8gcHVzaCBkZWNvZGluZyB0aW1lIGZvciB2aWRlbywgb3IgZHJpZnQgdGltZSBmb3IgYXVkaW8KKyAgICAgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgICAgIG1EZWNvZGluZ1RpbWVRdWV1ZS5wdXNoX2JhY2sodGltZVVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisjaWYgREVCVUdfRFJJRlRfVElNRQorICAgICAgICAgICAgICAgIGlmIChtRmlyc3RTYW1wbGVUaW1lVXMgPCAwbGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3QgZHJpZnRUaW1lVXMgPSAwOworICAgICAgICAgICAgICAgIGlmIChtYnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlEcmlmdFRpbWUsICZkcmlmdFRpbWVVcykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGRyaWZ0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaWZ0VGltZVVzID0gdGltZVVzIC0gbUZpcnN0U2FtcGxlVGltZVVzIC0gZHJpZnRUaW1lVXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1EcmlmdFRpbWVRdWV1ZS5wdXNoX2JhY2soZHJpZnRUaW1lVXMpOworI2VuZGlmIC8vIERFQlVHX0RSSUZUX1RJTUUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZSA9IG1idWYtPnNpemUoKTsKKworICAgICAgICAgICAgbWVtY3B5KG1FbmNvZGVySW5wdXRCdWZmZXJzLml0ZW1BdChidWZmZXJJbmRleCktPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICBtYnVmLT5kYXRhKCksIHNpemUpOworCisgICAgICAgICAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAvLyB2aWRlbyBlbmNvZGVyIHdpbGwgcmVsZWFzZSBNZWRpYUJ1ZmZlciB3aGVuIGRvbmUKKyAgICAgICAgICAgICAgICAvLyB3aXRoIHVuZGVybHlpbmcgZGF0YS4KKyAgICAgICAgICAgICAgICBtRW5jb2RlcklucHV0QnVmZmVycy5pdGVtQXQoYnVmZmVySW5kZXgpLT5zZXRNZWRpYUJ1ZmZlckJhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBtYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxhZ3MgPSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRW5jb2Rlci0+cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBidWZmZXJJbmRleCwgMCwgc2l6ZSwgdGltZVVzLCBmbGFncyk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6ZG9Nb3JlV29yayhpbnQzMl90IG51bUlucHV0LCBpbnQzMl90IG51bU91dHB1dCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgaWYgKCEobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkpIHsKKyAgICAgICAgd2hpbGUgKG51bUlucHV0LS0gPiAwKSB7CisgICAgICAgICAgICBzaXplX3QgYnVmZmVySW5kZXg7CisgICAgICAgICAgICBlcnIgPSBtRW5jb2Rlci0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZidWZmZXJJbmRleCk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5wdXNoX2JhY2soYnVmZmVySW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKKyAgICB9CisKKyAgICB3aGlsZSAobnVtT3V0cHV0LS0gPiAwKSB7CisgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKKyAgICAgICAgc2l6ZV90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBOVUxMOworICAgICAgICBlcnIgPSBtRW5jb2Rlci0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAmYnVmZmVySW5kZXgsICZvZmZzZXQsICZzaXplLCAmdGltZVVzLCAmZmxhZ3MpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgbUVuY29kZXItPmdldE91dHB1dEJ1ZmZlcnMoJm1FbmNvZGVyT3V0cHV0QnVmZmVycyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgeworICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBvdXRidWYgPSBtRW5jb2Rlck91dHB1dEJ1ZmZlcnMuaXRlbUF0KGJ1ZmZlckluZGV4KTsKKworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPSBuZXcgTWVkaWFCdWZmZXIob3V0YnVmLT5zaXplKCkpOworICAgICAgICAgICAgbWVtY3B5KG1idWYtPmRhdGEoKSwgb3V0YnVmLT5kYXRhKCksIG91dGJ1Zi0+c2l6ZSgpKTsKKworICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRykpIHsKKyAgICAgICAgICAgICAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWNvZGluZ1RpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdyYXBoaWNCdWZmZXJTb3VyY2UgaXMgc3VwcG9zZWQgdG8gZGlzY2FyZCBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgYmVmb3JlIHN0YXJ0LCBhbmQgb2Zmc2V0IHRpbWVVcyBieSBzdGFydCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVjb2RpbmcgdGltZSBmb3Igc3VyZmFjZSBzb3VyY2UgaXMgdW5hdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgcHJlc2VudGF0aW9uIHRpbWUgZm9yIG5vdy4gTWF5IG5lZWQgdG8gbW92ZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBsb2dpYyBpbnRvIE1lZGlhQ29kZWMuCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKCFtRGVjb2RpbmdUaW1lUXVldWUuZW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyA9ICoobURlY29kaW5nVGltZVF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbURlY29kaW5nVGltZVF1ZXVlLmVyYXNlKG1EZWNvZGluZ1RpbWVRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleURlY29kaW5nVGltZSwgZGVjb2RpbmdUaW1lVXMpOworCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbdmlkZW9dIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcyksIGR0cy9wdHMgZGlmZiAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLCB0aW1lVXMgLyAxRTYsIGRlY29kaW5nVGltZVVzIC0gdGltZVVzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRyaWZ0VGltZVVzID0gMDsKKyNpZiBERUJVR19EUklGVF9USU1FCisgICAgICAgICAgICAgICAgICAgIENIRUNLKCFtRHJpZnRUaW1lUXVldWUuZW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgIGRyaWZ0VGltZVVzID0gKihtRHJpZnRUaW1lUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgIG1EcmlmdFRpbWVRdWV1ZS5lcmFzZShtRHJpZnRUaW1lUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5RHJpZnRUaW1lLCBkcmlmdFRpbWVVcyk7CisjZW5kaWYgLy8gREVCVUdfRFJJRlRfVElNRQorICAgICAgICAgICAgICAgICAgICBBTE9HVigiW2F1ZGlvXSB0aW1lICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpLCBkcmlmdCAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLCB0aW1lVXMgLyAxRTYsIGRyaWZ0VGltZVVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzQ29kZWNDb25maWcsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FKSB7CisgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYnVmLT5zZXRPYnNlcnZlcih0aGlzKTsKKyAgICAgICAgICAgIG1idWYtPmFkZF9yZWYoKTsKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtT3V0cHV0QnVmZmVyTG9jayk7CisgICAgICAgICAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLnB1c2hfYmFjayhtYnVmKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyQ29uZC5zaWduYWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1FbmNvZGVyLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGJ1ZmZlckluZGV4KTsKKworICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6Om9uU3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIGlmIChtU3RvcHBpbmcpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCB3aGlsZSB3ZSdyZSBzdG9wcGluZyIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIEFMT0dJKCJNZWRpYUNvZGVjU291cmNlICglcykgcmVzdW1pbmciLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKyAgICAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgICAgIHJlc3VtZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0hFQ0sobVB1bGxlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIG1QdWxsZXItPnJlc3VtZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBTE9HSSgiTWVkaWFDb2RlY1NvdXJjZSAoJXMpIHN0YXJ0aW5nIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CisgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CisgICAgICAgIGlmICghcGFyYW1zIHx8ICFwYXJhbXMtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnN0YXJ0VGltZVVzKSkgeworICAgICAgICAgICAgc3RhcnRUaW1lVXMgPSAtMWxsOworICAgICAgICB9CisgICAgICAgIHJlc3VtZShzdGFydFRpbWVVcyk7CisgICAgICAgIHNjaGVkdWxlRG9Nb3JlV29yaygpOworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLKG1QdWxsZXIgIT0gTlVMTCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoCisgICAgICAgICAgICAgICAga1doYXRQdWxsZXJOb3RpZnksIG1SZWZsZWN0b3ItPmlkKCkpOworICAgICAgICBlcnIgPSBtUHVsbGVyLT5zdGFydChwYXJhbXMsIG5vdGlmeSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HSSgiTWVkaWFDb2RlY1NvdXJjZSAoJXMpIHN0YXJ0ZWQiLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgY2FzZSBrV2hhdFB1bGxlck5vdGlmeToKKyAgICB7CisgICAgICAgIE1lZGlhQnVmZmVyICptYnVmOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJhY2Nlc3NVbml0IiwgKHZvaWQqKikmbWJ1ZikpOworCisgICAgICAgIGlmIChtYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dWKCJwdWxsZXIgKCVzKSByZWFjaGVkIEVPUyIsCisgICAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgICAgICAgICAgc2lnbmFsRU9TKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1YoImdvdCBtc2cgJyVzJyBhZnRlciBlbmNvZGVyIHNodXRkb3duLiIsCisgICAgICAgICAgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICAgICAgICAgIGlmIChtYnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbUlucHV0QnVmZmVyUXVldWUucHVzaF9iYWNrKG1idWYpOworCisgICAgICAgIGZlZWRFbmNvZGVySW5wdXRCdWZmZXJzKCk7CisgICAgICAgIHNjaGVkdWxlRG9Nb3JlV29yaygpOworCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtXaGF0RW5jb2RlckFjdGl2aXR5OgorICAgIHsKKyAgICAgICAgbURvTW9yZVdvcmtQZW5kaW5nID0gZmFsc2U7CisKKyAgICAgICAgaWYgKG1FbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBudW1JbnB1dCwgbnVtT3V0cHV0OworCisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImlucHV0LWJ1ZmZlcnMiLCAmbnVtSW5wdXQpKSB7CisgICAgICAgICAgICBudW1JbnB1dCA9IElOVDMyX01BWDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJvdXRwdXQtYnVmZmVycyIsICZudW1PdXRwdXQpKSB7CisgICAgICAgICAgICBudW1PdXRwdXQgPSBJTlQzMl9NQVg7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBkb01vcmVXb3JrKG51bUlucHV0LCBudW1PdXRwdXQpOworCisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHNjaGVkdWxlRG9Nb3JlV29yaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmVhY2hlZCBFT1MsIG9yIGVycm9yCisgICAgICAgICAgICBzaWduYWxFT1MoZXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtXaGF0U3RhcnQ6CisgICAgeworICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoIm1ldGEiLCAmb2JqKSk7CisgICAgICAgIE1ldGFEYXRhICpwYXJhbXMgPSBzdGF0aWNfY2FzdDxNZXRhRGF0YSAqPihvYmouZ2V0KCkpOworCisgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBvblN0YXJ0KHBhcmFtcykpOworICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrV2hhdFN0b3A6CisgICAgeworICAgICAgICBBTE9HSSgiZW5jb2RlciAoJXMpIHN0b3BwaW5nIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisKKyAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgIGlmIChtRW5jb2RlclJlYWNoZWRFT1MpIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIGFscmVhZHkgcmVhY2hlZCBFT1MsIHJlcGx5IGFuZCByZXR1cm4gbm93CisgICAgICAgICAgICBBTE9HSSgiZW5jb2RlciAoJXMpIGFscmVhZHkgc3RvcHBlZCIsCisgICAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbVN0b3BSZXBseUlEUXVldWUucHVzaF9iYWNrKHJlcGx5SUQpOworICAgICAgICBpZiAobVN0b3BwaW5nKSB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGlmIHdlJ3JlIGFscmVhZHkgc3RvcHBpbmcsIHJlcGx5IHdpbGwgYmUgcG9zdGVkCisgICAgICAgICAgICAvLyB0byBhbGwgd2hlbiB3ZSdyZSBzdG9wcGVkLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtU3RvcHBpbmcgPSB0cnVlOworCisgICAgICAgIC8vIGlmIHVzaW5nIHN1cmZhY2UsIHNpZ25hbCBzb3VyY2UgRU9TIGFuZCB3YWl0IGZvciBFT1MgdG8gY29tZSBiYWNrLgorICAgICAgICAvLyBvdGhlcndpc2UsIHJlbGVhc2UgZW5jb2RlciBhbmQgcG9zdCBFT1MgaWYgaGF2ZW4ndCBkb25lIGFscmVhZHkKKyAgICAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgICAgIG1FbmNvZGVyLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaWduYWxFT1MoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrV2hhdFBhdXNlOgorICAgIHsKKyAgICAgICAgaWYgKG1GbGFncyAmJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CisgICAgICAgICAgICBzdXNwZW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDSyhtUHVsbGVyICE9IE5VTEwpOworICAgICAgICAgICAgbVB1bGxlci0+cGF1c2UoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwCmluZGV4IDM0MGNiYTcuLmQ0OGRkODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcApAQCAtMjMsNiArMjMsNyBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA4ID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA5ID0gInZpZGVvL3gtdm5kLm9uMi52cDkiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDID0gInZpZGVvL2F2YyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDID0gInZpZGVvL2hldmMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQgPSAidmlkZW8vbXA0di1lcyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzID0gInZpZGVvLzNncHAiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIgPSAidmlkZW8vbXBlZzIiOwpAQCAtMzYsNiArMzcsNyBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDID0gImF1ZGlvL21wNGEtbGF0bSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCA9ICJhdWRpby9xY2VscCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMgPSAiYXVkaW8vdm9yYmlzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX09QVVMgPSAiYXVkaW8vb3B1cyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcgPSAiYXVkaW8vZzcxMS1hbGF3IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyA9ICJhdWRpby9nNzExLW1sYXciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXID0gImF1ZGlvL3JhdyI7CkBAIC01Niw1ICs1OCw3IEBACiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCA9ICJ0ZXh0LzNncHAtdHQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9TVUJSSVAgPSAiYXBwbGljYXRpb24veC1zdWJyaXAiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9WVFQgPSAidGV4dC92dHQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4ID0gInRleHQvY2VhLTYwOCI7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCmluZGV4IGQ4N2U5MTAuLmM3YzZmMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCkBAIC0xNiw2ICsxNiw5IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFNdXhlciIKKworI2luY2x1ZGUgIndlYm0vV2VibVdyaXRlci5oIgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CkBAIC0zNiwxOSArMzksMzAgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTWVkaWFNdXhlcjo6TWVkaWFNdXhlcihjb25zdCBjaGFyICpwYXRoLCBPdXRwdXRGb3JtYXQgZm9ybWF0KQotICAgIDogbVN0YXRlKFVOSU5JVElBTElaRUQpIHsKKyAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgIG1TdGF0ZShVTklOSVRJQUxJWkVEKSB7CiAgICAgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX01QRUdfNCkgewogICAgICAgICBtV3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKHBhdGgpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfV0VCTSkgeworICAgICAgICBtV3JpdGVyID0gbmV3IFdlYm1Xcml0ZXIocGF0aCk7CisgICAgfQorCisgICAgaWYgKG1Xcml0ZXIgIT0gTlVMTCkgewogICAgICAgICBtRmlsZU1ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgICAgIG1TdGF0ZSA9IElOSVRJQUxJWkVEOwogICAgIH0KLQogfQogCiBNZWRpYU11eGVyOjpNZWRpYU11eGVyKGludCBmZCwgT3V0cHV0Rm9ybWF0IGZvcm1hdCkKLSAgICA6IG1TdGF0ZShVTklOSVRJQUxJWkVEKSB7CisgICAgOiBtRm9ybWF0KGZvcm1hdCksCisgICAgICBtU3RhdGUoVU5JTklUSUFMSVpFRCkgewogICAgIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9NUEVHXzQpIHsKICAgICAgICAgbVdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihmZCk7CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CisgICAgICAgIG1Xcml0ZXIgPSBuZXcgV2VibVdyaXRlcihmZCk7CisgICAgfQorCisgICAgaWYgKG1Xcml0ZXIgIT0gTlVMTCkgewogICAgICAgICBtRmlsZU1ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgICAgIG1TdGF0ZSA9IElOSVRJQUxJWkVEOwogICAgIH0KQEAgLTEwOSw4ICsxMjMsMTMgQEAKICAgICAgICAgQUxPR0UoInNldExvY2F0aW9uKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0KCkuIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CisgICAgaWYgKG1Gb3JtYXQgIT0gT1VUUFVUX0ZPUk1BVF9NUEVHXzQpIHsKKyAgICAgICAgQUxPR0UoInNldExvY2F0aW9uKCkgaXMgb25seSBzdXBwb3J0ZWQgZm9yIC5tcDQgb3V0cHV0LiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCiAgICAgQUxPR1YoIlNldHRpbmcgbG9jYXRpb246IGxhdGl0dWRlID0gJWQsIGxvbmdpdHVkZSA9ICVkIiwgbGF0aXR1ZGUsIGxvbmdpdHVkZSk7Ci0gICAgcmV0dXJuIG1Xcml0ZXItPnNldEdlb0RhdGEobGF0aXR1ZGUsIGxvbmdpdHVkZSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1QRUc0V3JpdGVyKj4obVdyaXRlci5nZXQoKSktPnNldEdlb0RhdGEobGF0aXR1ZGUsIGxvbmdpdHVkZSk7CiB9CiAKIHN0YXR1c190IE1lZGlhTXV4ZXI6OnN0YXJ0KCkgewpAQCAtMTU3LDcgKzE3Niw3IEBACiAgICAgfQogCiAgICAgaWYgKHRyYWNrSW5kZXggPj0gbVRyYWNrTGlzdC5zaXplKCkpIHsKLSAgICAgICAgQUxPR0UoIldyaXRlU2FtcGxlRGF0YSgpIGdldCBhbiBpbnZhbGlkIGluZGV4ICVkIiwgdHJhY2tJbmRleCk7CisgICAgICAgIEFMT0dFKCJXcml0ZVNhbXBsZURhdGEoKSBnZXQgYW4gaW52YWxpZCBpbmRleCAlenUiLCB0cmFja0luZGV4KTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5jcHAKaW5kZXggZmQwZTc5Yy4uNTc2NDcxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcApAQCAtMzIsNiArMzIsMTkgQEAKICAgICBtT3B0aW9ucyA9IDA7CiAgICAgbVNlZWtUaW1lVXMgPSAwOwogICAgIG1MYXRlbmVzc1VzID0gMDsKKyAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKK30KKwordm9pZCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OnNldE5vbkJsb2NraW5nKCkgeworICAgIG1Ob25CbG9ja2luZyA9IHRydWU7Cit9CisKK3ZvaWQgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpjbGVhck5vbkJsb2NraW5nKCkgeworICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOworfQorCitib29sIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6Z2V0Tm9uQmxvY2tpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Ob25CbG9ja2luZzsKIH0KIAogdm9pZCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OnNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhLmNwcAppbmRleCA3MjVmOTdlLi4xYTExYzFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGEuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWV0YURhdGEiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMzIwLDcgKzMyMSw3IEBACiAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IHN0b3JhZ2UoKTsKICAgICBzd2l0Y2gobVR5cGUpIHsKICAgICAgICAgY2FzZSBUWVBFX05PTkU6Ci0gICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIm5vIHR5cGUsIHNpemUgJWQpIiwgbVNpemUpOworICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCJubyB0eXBlLCBzaXplICV6dSkiLCBtU2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUWVBFX0NfU1RSSU5HOgogICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIoY2hhciopICVzIiwgKGNvbnN0IGNoYXIgKilkYXRhKTsKQEAgLTMyOSw3ICszMzAsNyBAQAogICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIoaW50MzJfdCkgJWQiLCAqKGludDMyX3QgKilkYXRhKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRZUEVfSU5UNjQ6Ci0gICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihpbnQ2NF90KSAlbGxkIiwgKihpbnQ2NF90ICopZGF0YSk7CisgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihpbnQ2NF90KSAlIiBQUklkNjQsICooaW50NjRfdCAqKWRhdGEpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVFlQRV9GTE9BVDoKICAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKGZsb2F0KSAlZiIsICooZmxvYXQgKilkYXRhKTsKQEAgLTM0Niw3ICszNDcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKHVua25vd24gdHlwZSAlZCwgc2l6ZSAlZCkiLCBtVHlwZSwgbVNpemUpOworICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIodW5rbm93biB0eXBlICVkLCBzaXplICV6dSkiLCBtVHlwZSwgbVNpemUpOwogICAgICAgICAgICAgaWYgKG1TaXplIDw9IDQ4KSB7IC8vIGlmIGl0J3MgbGVzcyB0aGFuIHRocmVlIGxpbmVzIG9mIGhleCBkYXRhLCBkdW1wIGl0CiAgICAgICAgICAgICAgICAgQVN0cmluZyBmb287CiAgICAgICAgICAgICAgICAgaGV4ZHVtcChkYXRhLCBtU2l6ZSwgMCwgJmZvbyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAppbmRleCAyNzBkNjRhLi5jYmMxZmUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk51Q2FjaGVkU291cmNlMiIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTEzNSw3ICsxMzcsNyBAQAogfQogCiB2b2lkIFBhZ2VDYWNoZTo6Y29weShzaXplX3QgZnJvbSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBBTE9HVigiY29weSBmcm9tICVkIHNpemUgJWQiLCBmcm9tLCBzaXplKTsKKyAgICBBTE9HVigiY29weSBmcm9tICV6dSBzaXplICV6dSIsIGZyb20sIHNpemUpOwogCiAgICAgaWYgKHNpemUgPT0gMCkgewogICAgICAgICByZXR1cm47CkBAIC0xODksNiArMTkxLDcgQEAKICAgICAgIG1GaW5hbFN0YXR1cyhPSyksCiAgICAgICBtTGFzdEFjY2Vzc1BvcygwKSwKICAgICAgIG1GZXRjaGluZyh0cnVlKSwKKyAgICAgIG1EaXNjb25uZWN0aW5nKGZhbHNlKSwKICAgICAgIG1MYXN0RmV0Y2hUaW1lVXMoLTEpLAogICAgICAgbU51bVJldHJpZXNMZWZ0KGtNYXhOdW1SZXRyaWVzKSwKICAgICAgIG1IaWdod2F0ZXJUaHJlc2hvbGRCeXRlcyhrRGVmYXVsdEhpZ2hXYXRlclRocmVzaG9sZCksCkBAIC0yMTMsNyArMjE2LDE0IEBACiAKICAgICBtTG9vcGVyLT5zZXROYW1lKCJOdUNhY2hlZFNvdXJjZTIiKTsKICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7Ci0gICAgbUxvb3Blci0+c3RhcnQoKTsKKworICAgIC8vIFNpbmNlIGl0IG1heSBub3QgYmUgb2J2aW91cyB3aHkgb3VyIGxvb3BlciB0aHJlYWQgbmVlZHMgdG8gYmUKKyAgICAvLyBhYmxlIHRvIGNhbGwgaW50byBqYXZhIHNpbmNlIGl0IGRvZXNuJ3QgYXBwZWFyIHRvIGRvIHNvIGF0IGFsbC4uLgorICAgIC8vIElNZWRpYUhUVFBDb25uZWN0aW9uIG1heSBiZSAoYW5kIG1vc3QgbGlrZWx5IGlzKSBpbXBsZW1lbnRlZCBpbiBKQVZBCisgICAgLy8gYW5kIGEgbG9jYWwgSkFWQSBJQmluZGVyIHdpbGwgY2FsbCBkaXJlY3RseSBpbnRvIEpOSSBtZXRob2RzLgorICAgIC8vIFNvIHdoZW5ldmVyIHdlIGNhbGwgRGF0YVNvdXJjZTo6cmVhZEF0IGl0IG1heSBlbmQgdXAgaW4gYSBjYWxsIHRvCisgICAgLy8gSU1lZGlhSFRUUENvbm5lY3Rpb246OnJlYWRBdCBhbmQgdGhlcmVmb3JlIGNhbGwgYmFjayBpbnRvIEpBVkEuCisgICAgbUxvb3Blci0+c3RhcnQoZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovLCB0cnVlIC8qIGNhbkNhbGxKYXZhICovKTsKIH0KIAogTnVDYWNoZWRTb3VyY2UyOjp+TnVDYWNoZWRTb3VyY2UyKCkgewpAQCAtMjQ0LDYgKzI1NCwyNyBAQAogICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKIH0KIAordm9pZCBOdUNhY2hlZFNvdXJjZTI6OmRpc2Nvbm5lY3QoKSB7CisgICAgaWYgKG1Tb3VyY2UtPmZsYWdzKCkgJiBrSXNIVFRQQmFzZWRTb3VyY2UpIHsKKyAgICAgICAgQUxPR1YoImRpc2Nvbm5lY3RpbmcgSFRUUEJhc2VkU291cmNlIik7CisKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIC8vIHNldCBtRGlzY29ubmVjdGluZyB0byB0cnVlLCBpZiBhIGZldGNoIHJldHVybnMgYWZ0ZXIKKyAgICAgICAgICAgIC8vIHRoaXMsIHRoZSBzb3VyY2Ugd2lsbCBiZSBtYXJrZWQgYXMgRU9TLgorICAgICAgICAgICAgbURpc2Nvbm5lY3RpbmcgPSB0cnVlOworCisgICAgICAgICAgICAvLyBleHBsaWNpdGx5IHNpZ25hbCBtQ29uZGl0aW9uIHNvIHRoYXQgdGhlIHBlbmRpbmcgcmVhZEF0KCkKKyAgICAgICAgICAgIC8vIHdpbGwgaW1tZWRpYXRlbHkgcmV0dXJuCisgICAgICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXhwbGljaXRseSBkaXNjb25uZWN0IGZyb20gdGhlIHNvdXJjZSwgdG8gYWxsb3cgYW55CisgICAgICAgIC8vIHBlbmRpbmcgcmVhZHMgdG8gcmV0dXJuIG1vcmUgcHJvbXB0bHkKKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKKyAgICB9Cit9CisKIHN0YXR1c190IE51Q2FjaGVkU291cmNlMjo6c2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpIHsKICAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgewogICAgICAgICBIVFRQQmFzZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obVNvdXJjZS5nZXQoKSk7CkBAIC0zMDcsNyArMzM4LDExIEBACiAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgICAgICBpZiAoZXJyID09IEVSUk9SX1VOU1VQUE9SVEVEIHx8IGVyciA9PSAtRVBJUEUpIHsKKyAgICAgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgICAgICBtTnVtUmV0cmllc0xlZnQgPSAwOworICAgICAgICAgICAgbUZpbmFsU3RhdHVzID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfVU5TVVBQT1JURUQgfHwgZXJyID09IC1FUElQRSkgewogICAgICAgICAgICAgLy8gVGhlc2UgYXJlIGVycm9ycyB0aGF0IGFyZSBub3QgbGlrZWx5IHRvIGdvIGF3YXkgZXZlbiBpZiB3ZQogICAgICAgICAgICAgLy8gcmV0cnksIGkuZS4gdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgcmFuZ2UgcmVxdWVzdHMgb3Igc2ltaWxhci4KICAgICAgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7CkBAIC0zMjcsNyArMzYyLDE0IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgaWYgKG4gPCAwKSB7CisgICAgaWYgKG4gPT0gMCB8fCBtRGlzY29ubmVjdGluZykgeworICAgICAgICBBTE9HSSgiRVJST1JfRU5EX09GX1NUUkVBTSIpOworCisgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7CisgICAgICAgIG1GaW5hbFN0YXR1cyA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisKKyAgICAgICAgbUNhY2hlLT5yZWxlYXNlUGFnZShwYWdlKTsKKyAgICB9IGVsc2UgaWYgKG4gPCAwKSB7CiAgICAgICAgIG1GaW5hbFN0YXR1cyA9IG47CiAgICAgICAgIGlmIChuID09IEVSUk9SX1VOU1VQUE9SVEVEIHx8IG4gPT0gLUVQSVBFKSB7CiAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgZXJyb3JzIHRoYXQgYXJlIG5vdCBsaWtlbHkgdG8gZ28gYXdheSBldmVuIGlmIHdlCkBAIC0zMzUsMTQgKzM3Nyw3IEBACiAgICAgICAgICAgICBtTnVtUmV0cmllc0xlZnQgPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR0UoInNvdXJjZSByZXR1cm5lZCBlcnJvciAlbGQsICVkIHJldHJpZXMgbGVmdCIsIG4sIG1OdW1SZXRyaWVzTGVmdCk7Ci0gICAgICAgIG1DYWNoZS0+cmVsZWFzZVBhZ2UocGFnZSk7Ci0gICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgQUxPR0koIkVSUk9SX0VORF9PRl9TVFJFQU0iKTsKLQotICAgICAgICBtTnVtUmV0cmllc0xlZnQgPSAwOwotICAgICAgICBtRmluYWxTdGF0dXMgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotCisgICAgICAgIEFMT0dFKCJzb3VyY2UgcmV0dXJuZWQgZXJyb3IgJXpkLCAlZCByZXRyaWVzIGxlZnQiLCBuLCBtTnVtUmV0cmllc0xlZnQpOwogICAgICAgICBtQ2FjaGUtPnJlbGVhc2VQYWdlKHBhZ2UpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChtRmluYWxTdGF0dXMgIT0gT0spIHsKQEAgLTQzMCw2ICs0NjUsMTAgQEAKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtRGlzY29ubmVjdGluZykgeworICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgQ0hFQ0sobUFzeW5jUmVzdWx0ID09IE5VTEwpOwogCkBAIC00NjYsMTYgKzUwNSwxOSBAQAogICAgIHNpemVfdCBhY3R1YWxCeXRlcyA9IG1DYWNoZS0+cmVsZWFzZUZyb21TdGFydChtYXhCeXRlcyk7CiAgICAgbUNhY2hlT2Zmc2V0ICs9IGFjdHVhbEJ5dGVzOwogCi0gICAgQUxPR0koInJlc3RhcnRpbmcgcHJlZmV0Y2hlciwgdG90YWxTaXplID0gJWQiLCBtQ2FjaGUtPnRvdGFsU2l6ZSgpKTsKKyAgICBBTE9HSSgicmVzdGFydGluZyBwcmVmZXRjaGVyLCB0b3RhbFNpemUgPSAlenUiLCBtQ2FjaGUtPnRvdGFsU2l6ZSgpKTsKICAgICBtRmV0Y2hpbmcgPSB0cnVlOwogfQogCiBzc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvU2VyaWFsaXplcihtU2VyaWFsaXplcik7CiAKLSAgICBBTE9HVigicmVhZEF0IG9mZnNldCAlbGxkLCBzaXplICVkIiwgb2Zmc2V0LCBzaXplKTsKKyAgICBBTE9HVigicmVhZEF0IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIG9mZnNldCwgc2l6ZSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtRGlzY29ubmVjdGluZykgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CiAKICAgICAvLyBJZiB0aGUgcmVxdWVzdCBjYW4gYmUgY29tcGxldGVseSBzYXRpc2ZpZWQgZnJvbSB0aGUgY2FjaGUsIGRvIHNvLgogCkBAIC00OTcsMTAgKzUzOSwxNSBAQAogICAgIENIRUNLKG1Bc3luY1Jlc3VsdCA9PSBOVUxMKTsKICAgICBtc2ctPnBvc3QoKTsKIAotICAgIHdoaWxlIChtQXN5bmNSZXN1bHQgPT0gTlVMTCkgeworICAgIHdoaWxlIChtQXN5bmNSZXN1bHQgPT0gTlVMTCAmJiAhbURpc2Nvbm5lY3RpbmcpIHsKICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKICAgICB9CiAKKyAgICBpZiAobURpc2Nvbm5lY3RpbmcpIHsKKyAgICAgICAgbUFzeW5jUmVzdWx0LmNsZWFyKCk7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKwogICAgIGludDMyX3QgcmVzdWx0OwogICAgIENIRUNLKG1Bc3luY1Jlc3VsdC0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CiAKQEAgLTU0MSw3ICs1ODgsNyBAQAogc3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OnJlYWRJbnRlcm5hbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBDSEVDS19MRShzaXplLCAoc2l6ZV90KW1IaWdod2F0ZXJUaHJlc2hvbGRCeXRlcyk7CiAKLSAgICBBTE9HVigicmVhZEludGVybmFsIG9mZnNldCAlbGxkIHNpemUgJWQiLCBvZmZzZXQsIHNpemUpOworICAgIEFMT0dWKCJyZWFkSW50ZXJuYWwgb2Zmc2V0ICVsbGQgc2l6ZSAlenUiLCBvZmZzZXQsIHNpemUpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIApAQCAtNjUwLDcgKzY5Nyw3IEBACiAgICAgc3NpemVfdCBsb3d3YXRlck1hcmtLYiwgaGlnaHdhdGVyTWFya0tiOwogICAgIGludCBrZWVwQWxpdmVTZWNzOwogCi0gICAgaWYgKHNzY2FuZihzLCAiJWxkLyVsZC8lZCIsCisgICAgaWYgKHNzY2FuZihzLCAiJXpkLyV6ZC8lZCIsCiAgICAgICAgICAgICAgICAmbG93d2F0ZXJNYXJrS2IsICZoaWdod2F0ZXJNYXJrS2IsICZrZWVwQWxpdmVTZWNzKSAhPSAzKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcGFyc2UgY2FjaGUgcGFyYW1ldGVycyBmcm9tICclcycuIiwgcyk7CiAgICAgICAgIHJldHVybjsKQEAgLTY4MSw3ICs3MjgsNyBAQAogICAgICAgICBtS2VlcEFsaXZlSW50ZXJ2YWxVcyA9IGtEZWZhdWx0S2VlcEFsaXZlSW50ZXJ2YWxVczsKICAgICB9CiAKLSAgICBBTE9HVigibG93d2F0ZXIgPSAlZCBieXRlcywgaGlnaHdhdGVyID0gJWQgYnl0ZXMsIGtlZXBhbGl2ZSA9ICVsbGQgdXMiLAorICAgIEFMT0dWKCJsb3d3YXRlciA9ICV6dSBieXRlcywgaGlnaHdhdGVyID0gJXp1IGJ5dGVzLCBrZWVwYWxpdmUgPSAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICBtTG93d2F0ZXJUaHJlc2hvbGRCeXRlcywKICAgICAgICAgIG1IaWdod2F0ZXJUaHJlc2hvbGRCeXRlcywKICAgICAgICAgIG1LZWVwQWxpdmVJbnRlcnZhbFVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggN2JjN2RhMi4uZjI0Y2YzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTU4LDcgKzU4LDkgQEAKIH0KIAogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1JbXBsICE9IE5VTEwpIHsKQEAgLTY2LDcgKzY4LDcgQEAKICAgICB9CiAKICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KLSAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShwYXRoLCBoZWFkZXJzKTsKKyAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShodHRwU2VydmljZSwgcGF0aCwgaGVhZGVycyk7CiAKICAgICBpZiAoZGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRU5PRU5UOwpAQCAtMzg3LDcgKzM4OSw3IEBACiAgICAgICAgICAgICAgICAgaW5mby0+bUZpbmFsUmVzdWx0ID0gZXJyOwogCiAgICAgICAgICAgICAgICAgaWYgKGluZm8tPm1GaW5hbFJlc3VsdCAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWFkIG9uIHRyYWNrICVkIGZhaWxlZCB3aXRoIGVycm9yICVkIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlYWQgb24gdHJhY2sgJXp1IGZhaWxlZCB3aXRoIGVycm9yICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bVRyYWNrSW5kZXgsIGVycik7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcAppbmRleCA5ZjkzNTJkLi5jYTAzMWFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKQEAgLTE2LDYgKzE2LDExIEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiT01YQ2xpZW50IgorCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CkBAIC03Myw2ICs3OCwxMCBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKICAgICAgICAgICAgIE9NWF9VMzIgbWF4RnJhbWVXaWR0aCwgT01YX1UzMiBtYXhGcmFtZUhlaWdodCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVHcmFwaGljQnVmZmVycygKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpOwogCkBAIC0xNDEsNyArMTUwLDcgQEAKICAgICBjb25zdCBzcDxJT01YPiAmZ2V0T01YKG5vZGVfaWQgbm9kZSkgY29uc3Q7CiAgICAgY29uc3Qgc3A8SU9NWD4gJmdldE9NWF9sKG5vZGVfaWQgbm9kZSkgY29uc3Q7CiAKLSAgICBzdGF0aWMgYm9vbCBJc1NvZnR3YXJlQ29tcG9uZW50KGNvbnN0IGNoYXIgKm5hbWUpOworICAgIHN0YXRpYyBib29sIENhbkxpdmVMb2NhbGx5KGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXV4T01YKTsKIH07CkBAIC0xNjQsOCArMTczLDE1IEBACiB9CiAKIC8vIHN0YXRpYwotYm9vbCBNdXhPTVg6OklzU29mdHdhcmVDb21wb25lbnQoY29uc3QgY2hhciAqbmFtZSkgeworYm9vbCBNdXhPTVg6OkNhbkxpdmVMb2NhbGx5KGNvbnN0IGNoYXIgKm5hbWUpIHsKKyNpZmRlZiBfX0xQNjRfXworICAgICh2b2lkKW5hbWU7IC8vIGRpc2FibGUgdW51c2VkIHBhcmFtZXRlciB3YXJuaW5nCisgICAgLy8gNjQgYml0IHByb2Nlc3NlcyBhbHdheXMgcnVuIE9NWCByZW1vdGUgb24gTWVkaWFTZXJ2ZXIKKyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIC8vIDMyIGJpdCBwcm9jZXNzZXMgcnVuIG9ubHkgT01YLmdvb2dsZS4qIGNvbXBvbmVudHMgbG9jYWxseQogICAgIHJldHVybiAhc3RybmNhc2VjbXAobmFtZSwgIk9NWC5nb29nbGUuIiwgMTEpOworI2VuZGlmCiB9CiAKIGNvbnN0IHNwPElPTVg+ICZNdXhPTVg6OmdldE9NWChub2RlX2lkIG5vZGUpIGNvbnN0IHsKQEAgLTE5Nyw3ICsyMTMsNyBAQAogCiAgICAgc3A8SU9NWD4gb214OwogCi0gICAgaWYgKElzU29mdHdhcmVDb21wb25lbnQobmFtZSkpIHsKKyAgICBpZiAoQ2FuTGl2ZUxvY2FsbHkobmFtZSkpIHsKICAgICAgICAgaWYgKG1Mb2NhbE9NWCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBtTG9jYWxPTVggPSBuZXcgT01YOwogICAgICAgICB9CkBAIC0yNzksNiArMjk1LDEzIEBACiAgICAgICAgICAgICBub2RlLCBwb3J0X2luZGV4LCBlbmFibGUsIG1heEZyYW1lV2lkdGgsIG1heEZyYW1lSGVpZ2h0KTsKIH0KIAorc3RhdHVzX3QgTXV4T01YOjpjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKKyAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpIHsKKyAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBub2RlLCBwb3J0SW5kZXgsIGVuYWJsZSwgYXVkaW9Id1N5bmMsIHNpZGViYW5kSGFuZGxlKTsKK30KKwogc3RhdHVzX3QgTXV4T01YOjplbmFibGVHcmFwaGljQnVmZmVycygKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgewogICAgIHJldHVybiBnZXRPTVgobm9kZSktPmVuYWJsZUdyYXBoaWNCdWZmZXJzKG5vZGUsIHBvcnRfaW5kZXgsIGVuYWJsZSk7CkBAIC0zODIsNyArNDA1LDcgQEAKICAgICBtT01YID0gc2VydmljZS0+Z2V0T01YKCk7CiAgICAgQ0hFQ0sobU9NWC5nZXQoKSAhPSBOVUxMKTsKIAotICAgIGlmICghbU9NWC0+bGl2ZXNMb2NhbGx5KE5VTEwgLyogbm9kZSAqLywgZ2V0cGlkKCkpKSB7CisgICAgaWYgKCFtT01YLT5saXZlc0xvY2FsbHkoMCAvKiBub2RlICovLCBnZXRwaWQoKSkpIHsKICAgICAgICAgQUxPR0koIlVzaW5nIGNsaWVudC1zaWRlIE9NWCBtdXguIik7CiAgICAgICAgIG1PTVggPSBuZXcgTXV4T01YKG1PTVgpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAppbmRleCBlMTdmNDgyLi4zZGEwYjdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCkBAIC0xNCw4ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiT01YQ29kZWMiCisKKyNpZmRlZiBfX0xQNjRfXworI2RlZmluZSBPTVhfQU5EUk9JRF9DT01QSUxFX0FTXzMyQklUX09OXzY0QklUX1BMQVRGT1JNUworI2VuZGlmCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvQUFDRW5jb2Rlci5oIgpAQCAtMjgsNiArMzUsNyBAQAogI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC05NCw2ICsxMDIsNyBAQAogCiAjZGVmaW5lIENPREVDX0xPR0koeCwgLi4uKSBBTE9HSSgiWyVzXSAieCwgbUNvbXBvbmVudE5hbWUsICMjX19WQV9BUkdTX18pCiAjZGVmaW5lIENPREVDX0xPR1YoeCwgLi4uKSBBTE9HVigiWyVzXSAieCwgbUNvbXBvbmVudE5hbWUsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIENPREVDX0xPR1coeCwgLi4uKSBBTE9HVygiWyVzXSAieCwgbUNvbXBvbmVudE5hbWUsICMjX19WQV9BUkdTX18pCiAjZGVmaW5lIENPREVDX0xPR0UoeCwgLi4uKSBBTE9HRSgiWyVzXSAieCwgbUNvbXBvbmVudE5hbWUsICMjX19WQV9BUkdTX18pCiAKIHN0cnVjdCBPTVhDb2RlY09ic2VydmVyIDogcHVibGljIEJuT01YT2JzZXJ2ZXIgewpAQCAtMTI3LDYgKzEzNiw3IEBACiAKIHRlbXBsYXRlPGNsYXNzIFQ+CiBzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoc2l6ZW9mKE9NWF9QVFIpID09IDQpOyAvLyBjaGVjayBPTVhfUFRSIGlzIDQgYnl0ZXMuCiAgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKICAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7CiAgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOwpAQCAtMTg4LDcgKzE5OCw3IEBACiAgICAgICAgIFZlY3RvcjxDb2RlY05hbWVBbmRRdWlya3M+ICptYXRjaGluZ0NvZGVjcykgewogICAgIG1hdGNoaW5nQ29kZWNzLT5jbGVhcigpOwogCi0gICAgY29uc3QgTWVkaWFDb2RlY0xpc3QgKmxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKKyAgICBjb25zdCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKICAgICBpZiAobGlzdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMDQsNyArMjE0LDkgQEAKIAogICAgICAgICBpbmRleCA9IG1hdGNoSW5kZXggKyAxOwogCi0gICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUgPSBsaXN0LT5nZXRDb2RlY05hbWUobWF0Y2hJbmRleCk7CisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbGlzdC0+Z2V0Q29kZWNJbmZvKG1hdGNoSW5kZXgpOworICAgICAgICBDSEVDSyhpbmZvICE9IE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lID0gaW5mby0+Z2V0Q29kZWNOYW1lKCk7CiAKICAgICAgICAgLy8gSWYgYSBzcGVjaWZpYyBjb2RlYyBpcyByZXF1ZXN0ZWQsIHNraXAgdGhlIG5vbi1tYXRjaGluZyBvbmVzLgogICAgICAgICBpZiAobWF0Y2hDb21wb25lbnROYW1lICYmIHN0cmNtcChjb21wb25lbnROYW1lLCBtYXRjaENvbXBvbmVudE5hbWUpKSB7CkBAIC0yMjIsNyArMjM0LDcgQEAKICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtYXRjaGluZ0NvZGVjcy0+YWRkKCk7CiAgICAgICAgICAgICBDb2RlY05hbWVBbmRRdWlya3MgKmVudHJ5ID0gJm1hdGNoaW5nQ29kZWNzLT5lZGl0SXRlbUF0KGluZGV4KTsKICAgICAgICAgICAgIGVudHJ5LT5tTmFtZSA9IFN0cmluZzgoY29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgICBlbnRyeS0+bVF1aXJrcyA9IGdldENvbXBvbmVudFF1aXJrcyhsaXN0LCBtYXRjaEluZGV4KTsKKyAgICAgICAgICAgIGVudHJ5LT5tUXVpcmtzID0gZ2V0Q29tcG9uZW50UXVpcmtzKGluZm8pOwogCiAgICAgICAgICAgICBBTE9HVigibWF0Y2hpbmcgJyVzJyBxdWlya3MgMHglMDh4IiwKICAgICAgICAgICAgICAgICAgIGVudHJ5LT5tTmFtZS5zdHJpbmcoKSwgZW50cnktPm1RdWlya3MpOwpAQCAtMjM2LDE4ICsyNDgsMTUgQEAKIAogLy8gc3RhdGljCiB1aW50MzJfdCBPTVhDb2RlYzo6Z2V0Q29tcG9uZW50UXVpcmtzKAotICAgICAgICBjb25zdCBNZWRpYUNvZGVjTGlzdCAqbGlzdCwgc2l6ZV90IGluZGV4KSB7CisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbykgewogICAgIHVpbnQzMl90IHF1aXJrcyA9IDA7Ci0gICAgaWYgKGxpc3QtPmNvZGVjSGFzUXVpcmsoCi0gICAgICAgICAgICAgICAgaW5kZXgsICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIpKSB7CisgICAgaWYgKGluZm8tPmhhc1F1aXJrKCJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIpKSB7CiAgICAgICAgIHF1aXJrcyB8PSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0czsKICAgICB9Ci0gICAgaWYgKGxpc3QtPmNvZGVjSGFzUXVpcmsoCi0gICAgICAgICAgICAgICAgaW5kZXgsICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSkgeworICAgIGlmIChpbmZvLT5oYXNRdWlyaygicmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIikpIHsKICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKICAgICB9Ci0gICAgaWYgKGxpc3QtPmNvZGVjSGFzUXVpcmsoCi0gICAgICAgICAgICAgICAgaW5kZXgsICJvdXRwdXQtYnVmZmVycy1hcmUtdW5yZWFkYWJsZSIpKSB7CisgICAgaWYgKGluZm8tPmhhc1F1aXJrKCJvdXRwdXQtYnVmZmVycy1hcmUtdW5yZWFkYWJsZSIpKSB7CiAgICAgICAgIHF1aXJrcyB8PSBrT3V0cHV0QnVmZmVyc0FyZVVucmVhZGFibGU7CiAgICAgfQogCkBAIC0yNTYsOCArMjY1LDcgQEAKIAogLy8gc3RhdGljCiBib29sIE9NWENvZGVjOjpmaW5kQ29kZWNRdWlya3MoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgdWludDMyX3QgKnF1aXJrcykgewotICAgIGNvbnN0IE1lZGlhQ29kZWNMaXN0ICpsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7Ci0KKyAgICBjb25zdCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKICAgICBpZiAobGlzdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0yNjgsNyArMjc2LDkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgICpxdWlya3MgPSBnZXRDb21wb25lbnRRdWlya3MobGlzdCwgaW5kZXgpOworICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbGlzdC0+Z2V0Q29kZWNJbmZvKGluZGV4KTsKKyAgICBDSEVDSyhpbmZvICE9IE5VTEwpOworICAgICpxdWlya3MgPSBnZXRDb21wb25lbnRRdWlya3MoaW5mbyk7CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTM3Miw2ICszODIsNTcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorc3RhdHVzX3QgT01YQ29kZWM6OnBhcnNlSEVWQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgdW5zaWduZWQgKnByb2ZpbGUsIHVuc2lnbmVkICpsZXZlbCkgeworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgIC8vIHZlcmlmeSBtaW5pbXVtIHNpemUgYW5kIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEuCisgICAgaWYgKHNpemUgPCA3IHx8IHB0clswXSAhPSAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgKnByb2ZpbGUgPSAocHRyWzFdICYgMzEpOworICAgICpsZXZlbCA9IHB0clsxMl07CisKKyAgICBwdHIgKz0gMjI7CisgICAgc2l6ZSAtPSAyMjsKKworICAgIHNpemVfdCBudW1vZkFycmF5cyA9IChjaGFyKXB0clswXTsKKyAgICBwdHIgKz0gMTsKKyAgICBzaXplIC09IDE7CisgICAgc2l6ZV90IGogPSAwLCBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtb2ZBcnJheXM7IGkrKykgeworICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgc2l6ZSAtPSAxOworCisgICAgICAgIC8vIE51bSBvZiBuYWxzCisgICAgICAgIHNpemVfdCBudW1vZk5hbHMgPSBVMTZfQVQocHRyKTsKKyAgICAgICAgcHRyICs9IDI7CisgICAgICAgIHNpemUgLT0gMjsKKworICAgICAgICBmb3IgKGogPSAwO2ogPCBudW1vZk5hbHM7aisrKSB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgbGVuZ3RoID0gVTE2X0FUKHB0cik7CisKKyAgICAgICAgICAgIHB0ciArPSAyOworICAgICAgICAgICAgc2l6ZSAtPSAyOworCisgICAgICAgICAgICBpZiAoc2l6ZSA8IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShwdHIsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIHB0ciArPSBsZW5ndGg7CisgICAgICAgICAgICBzaXplIC09IGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE9NWENvZGVjOjpwYXJzZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAogICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKICAgICAgICAgdW5zaWduZWQgKnByb2ZpbGUsIHVuc2lnbmVkICpsZXZlbCkgewpAQCAtNDg0LDExICs1NDUsMzIgQEAKICAgICAgICAgICAgIENPREVDX0xPR0koCiAgICAgICAgICAgICAgICAgICAgICJBVkMgcHJvZmlsZSA9ICV1ICglcyksIGxldmVsID0gJXUiLAogICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBBVkNQcm9maWxlVG9TdHJpbmcocHJvZmlsZSksIGxldmVsKTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBIRVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQKKworICAgICAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgbGV2ZWw7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlSEVWQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIHNpemUsICZwcm9maWxlLCAmbGV2ZWwpKSAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgSEVWQyBjb2RlYyBzcGVjaWZpYyBkYXRhLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPREVDX0xPR0koCisgICAgICAgICAgICAgICAgICAgICJIRVZDIHByb2ZpbGUgPSAldSAsIGxldmVsID0gJXUiLAorICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBsZXZlbCk7CiAgICAgICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleVZvcmJpc0luZm8sICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShkYXRhLCBzaXplKTsKIAogICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZERhdGEoa0tleVZvcmJpc0Jvb2tzLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CiAgICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShkYXRhLCBzaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5T3B1c0hlYWRlciwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOworCisgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kRGF0YShrS2V5T3B1c0NvZGVjRGVsYXksICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKKyAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOworICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZERhdGEoa0tleU9wdXNTZWVrUHJlUm9sbCwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoZGF0YSwgc2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY3OSw3ICs3NjEsNyBAQAogICAgICAgICAvLyBDSEVDS19FUShmb3JtYXQubkluZGV4LCBpbmRleCk7CiAKICNpZiAxCi0gICAgICAgIENPREVDX0xPR1YoInBvcnRJbmRleDogJWxkLCBpbmRleDogJWxkLCBlQ29tcHJlc3Npb25Gb3JtYXQ9JWQgZUNvbG9yRm9ybWF0PSVkIiwKKyAgICAgICAgQ09ERUNfTE9HVigicG9ydEluZGV4OiAldSwgaW5kZXg6ICV1LCBlQ29tcHJlc3Npb25Gb3JtYXQ9JWQgZUNvbG9yRm9ybWF0PSVkIiwKICAgICAgICAgICAgICBwb3J0SW5kZXgsCiAgICAgICAgICAgICAgaW5kZXgsIGZvcm1hdC5lQ29tcHJlc3Npb25Gb3JtYXQsIGZvcm1hdC5lQ29sb3JGb3JtYXQpOwogI2VuZGlmCkBAIC03ODEsNyArODYzLDcgQEAKICAgICAgICAgcG9ydEZvcm1hdC5uSW5kZXggPSBpbmRleDsKIAogICAgICAgICBpZiAoaW5kZXggPj0ga01heENvbG9yRm9ybWF0U3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICBDT0RFQ19MT0dFKCJNb3JlIHRoYW4gJWxkIGNvbG9yIGZvcm1hdHMgYXJlIHN1cHBvcnRlZD8/PyIsIGluZGV4KTsKKyAgICAgICAgICAgIENPREVDX0xPR0UoIk1vcmUgdGhhbiAldSBjb2xvciBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQ/Pz8iLCBpbmRleCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTgwNiw2ICs4ODgsOCBAQAogICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lKSkgewogICAgICAgICBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdBVkM7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCBtaW1lKSkgeworICAgICAgICBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdIRVZDOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIG1pbWUpKSB7CiAgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ01QRUc0OwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgbWltZSkpIHsKQEAgLTkxMCw3ICs5OTQsNiBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgT01YX1UzMiByZXQgPSBmcmFtZVJhdGUgKiBpRnJhbWVzSW50ZXJ2YWwgLSAxOwotICAgIENIRUNLKHJldCA+IDEpOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTEyMDEsNiArMTI4NCw4IEBACiAgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBtaW1lKSkgewogICAgICAgICBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdNUEVHNDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsIG1pbWUpKSB7CisgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0hFVkM7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBtaW1lKSkgewogICAgICAgICBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdIMjYzOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fVlA4LCBtaW1lKSkgewpAQCAtMTM4NywxMiArMTQ3MiwxNiBAQAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIiwgImF1ZGlvX2VuY29kZXIuYWFjIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLnZvcmJpcyIsICJhdWRpb19lbmNvZGVyLnZvcmJpcyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLAorICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIub3B1cyIsICJhdWRpb19lbmNvZGVyLm9wdXMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuZzcxMW1sYXciLCAiYXVkaW9fZW5jb2Rlci5nNzExbWxhdyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIsICJhdWRpb19lbmNvZGVyLmc3MTFhbGF3IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywKICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLmF2YyIsICJ2aWRlb19lbmNvZGVyLmF2YyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLAorICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuaGV2YyIsICJ2aWRlb19lbmNvZGVyLmhldmMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsCiAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5tcGVnNCIsICJ2aWRlb19lbmNvZGVyLm1wZWc0IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsCkBAIC0xNDYyLDcgKzE1NTEsNyBAQAogICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmZyZWVOb2RlKG1Ob2RlKTsKICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAKLSAgICBtTm9kZSA9IE5VTEw7CisgICAgbU5vZGUgPSAwOwogICAgIHNldFN0YXRlKERFQUQpOwogCiAgICAgY2xlYXJDb2RlY1NwZWNpZmljRGF0YSgpOwpAQCAtMTYxOCwxNSArMTcwNywxNSBAQAogICAgICAgICBpbmZvLm1NZWRpYUJ1ZmZlciA9IE5VTEw7CiAKICAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KSB7Ci0gICAgICAgICAgICBpZiAoIShtT01YTGl2ZXNMb2NhbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobVF1aXJrcyAmIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0cykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUXVpcmtzICYga0RlZmVyc091dHB1dEJ1ZmZlckFsbG9jYXRpb24pKSkgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGRvZXMgbm90IGZpbGwgaW4gdGhlIGJ1ZmZlciBwdHIgYXQgdGhpcyB0aW1lLAotICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgZGVmZXIgY3JlYXRpbmcgdGhlIE1lZGlhQnVmZmVyIHVudGlsIHJlY2VpdmluZwotICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBGSUxMX0JVRkZFUl9ET05FIG5vdGlmaWNhdGlvbiBpbnN0ZWFkLgotICAgICAgICAgICAgICAgIGluZm8ubU1lZGlhQnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGluZm8ubURhdGEsIGluZm8ubVNpemUpOwotICAgICAgICAgICAgICAgIGluZm8ubU1lZGlhQnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZhaWwgZGVmZXJyZWQgTWVkaWFCdWZmZXIgY3JlYXRpb24gdW50aWwgRklMTF9CVUZGRVJfRE9ORTsKKyAgICAgICAgICAgIC8vIHRoaXMgbGVnYWN5IG1vZGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKG1PTVhMaXZlc0xvY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1RdWlya3MgJiBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHMpCisgICAgICAgICAgICAgICAgICAgICYmIChtUXVpcmtzICYga0RlZmVyc091dHB1dEJ1ZmZlckFsbG9jYXRpb24pKSwKKyAgICAgICAgICAgICAgICAgICAgImFsbG9jYXRlQnVmZmVyc09uUG9ydCBjYW5ub3QgZGVmZXIgYnVmZmVyIGFsbG9jYXRpb24iKTsKKworICAgICAgICAgICAgaW5mby5tTWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoaW5mby5tRGF0YSwgaW5mby5tU2l6ZSk7CisgICAgICAgICAgICBpbmZvLm1NZWRpYUJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7CiAgICAgICAgIH0KIAogICAgICAgICBtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XS5wdXNoKGluZm8pOwpAQCAtMTc5NywyMSArMTg4Niw0MiBAQAogICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CisgICAgLy8gRklYTUU6IGFzc3VtZSB0aGF0IHN1cmZhY2UgaXMgY29udHJvbGxlZCBieSBhcHAgKG5hdGl2ZSB3aW5kb3cKKyAgICAvLyByZXR1cm5zIHRoZSBudW1iZXIgZm9yIHRoZSBjYXNlIHdoZW4gc3VyZmFjZSBpcyBub3QgY29udHJvbGxlZCBieSBhcHApCisgICAgLy8gRklYTUUyOiBUaGlzIG1lYW5zIHRoYXQgbWluVW5kZXFldWV1ZEJ1ZnMgY2FuIGJlIDEgbGFyZ2VyIHRoYW4gcmVwb3J0ZWQKKyAgICAvLyBGb3Igbm93LCB0cnkgdG8gYWxsb2NhdGUgMSBtb3JlIGJ1ZmZlciwgYnV0IGRvbid0IGZhaWwgaWYgdW5zdWNjZXNzZnVsCiAKLSAgICAvLyBYWFg6IElzIHRoaXMgdGhlIHJpZ2h0IGxvZ2ljIHRvIHVzZT8gIEl0J3Mgbm90IGNsZWFyIHRvIG1lIHdoYXQgdGhlIE9NWAotICAgIC8vIGJ1ZmZlciBjb3VudHMgcmVmZXIgdG8gLSBob3cgZG8gdGhleSBhY2NvdW50IGZvciB0aGUgcmVuZGVyZXIgaG9sZGluZyBvbgotICAgIC8vIHRvIGJ1ZmZlcnM/Ci0gICAgaWYgKGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPCBkZWYubkJ1ZmZlckNvdW50TWluICsgbWluVW5kZXF1ZXVlZEJ1ZnMpIHsKLSAgICAgICAgT01YX1UzMiBuZXdCdWZmZXJDb3VudCA9IGRlZi5uQnVmZmVyQ291bnRNaW4gKyBtaW5VbmRlcXVldWVkQnVmczsKKyAgICAvLyBVc2UgY29uc2VydmF0aXZlIGFsbG9jYXRpb24gd2hpbGUgYWxzbyB0cnlpbmcgdG8gcmVkdWNlIHN0YXJ2YXRpb24KKyAgICAvLworICAgIC8vIDEuIGFsbG9jYXRlIGF0IGxlYXN0IG5CdWZmZXJDb3VudE1pbiArIG1pblVuZGVxdWV1ZWRCdWZmZXJzIC0gdGhhdCBpcyB0aGUKKyAgICAvLyAgICBtaW5pbXVtIG5lZWRlZCBmb3IgdGhlIGNvbnN1bWVyIHRvIGJlIGFibGUgdG8gd29yaworICAgIC8vIDIuIHRyeSB0byBhbGxvY2F0ZSB0d28gKDIpIGFkZGl0aW9uYWwgYnVmZmVycyB0byByZWR1Y2Ugc3RhcnZhdGlvbiBmcm9tCisgICAgLy8gICAgdGhlIGNvbnN1bWVyCisgICAgLy8gICAgcGx1cyBhbiBleHRyYSBidWZmZXIgdG8gYWNjb3VudCBmb3IgaW5jb3JyZWN0IG1pblVuZGVxdWV1ZWRCdWZzCisgICAgQ09ERUNfTE9HSSgiT01YLWJ1ZmZlcnM6IG1pbj0ldSBhY3R1YWw9JXUgdW5kZXE9JWQrMSIsCisgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50TWluLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsLCBtaW5VbmRlcXVldWVkQnVmcyk7CisKKyAgICBmb3IgKE9NWF9VMzIgZXh0cmFCdWZmZXJzID0gMiArIDE7IC8qIGNvbmRpdGlvbiBpbnNpZGUgbG9vcCAqLzsgZXh0cmFCdWZmZXJzLS0pIHsKKyAgICAgICAgT01YX1UzMiBuZXdCdWZmZXJDb3VudCA9CisgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50TWluICsgbWluVW5kZXF1ZXVlZEJ1ZnMgKyBleHRyYUJ1ZmZlcnM7CiAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBuZXdCdWZmZXJDb3VudDsKICAgICAgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIENPREVDX0xPR0UoInNldHRpbmcgbkJ1ZmZlckNvdW50QWN0dWFsIHRvICVsdSBmYWlsZWQ6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3QnVmZmVyQ291bnQsIGVycik7CisKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbWluVW5kZXF1ZXVlZEJ1ZnMgKz0gZXh0cmFCdWZmZXJzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBDT0RFQ19MT0dXKCJzZXR0aW5nIG5CdWZmZXJDb3VudEFjdHVhbCB0byAldSBmYWlsZWQ6ICVkIiwKKyAgICAgICAgICAgICAgICBuZXdCdWZmZXJDb3VudCwgZXJyKTsKKyAgICAgICAgLyogZXhpdCBjb25kaXRpb24gKi8KKyAgICAgICAgaWYgKGV4dHJhQnVmZmVycyA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQorICAgIENPREVDX0xPR0koIk9NWC1idWZmZXJzOiBtaW49JXUgYWN0dWFsPSV1IHVuZGVxPSVkKzEiLAorICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgbWluVW5kZXF1ZXVlZEJ1ZnMpOwogCiAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KAogICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7CkBAIC0xODIxLDcgKzE5MzEsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIENPREVDX0xPR1YoImFsbG9jYXRpbmcgJWx1IGJ1ZmZlcnMgZnJvbSBhIG5hdGl2ZSB3aW5kb3cgb2Ygc2l6ZSAlbHUgb24gIgorICAgIENPREVDX0xPR1YoImFsbG9jYXRpbmcgJXUgYnVmZmVycyBmcm9tIGEgbmF0aXZlIHdpbmRvdyBvZiBzaXplICV1IG9uICIKICAgICAgICAgICAgICJvdXRwdXQgcG9ydCIsIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIGRlZi5uQnVmZmVyU2l6ZSk7CiAKICAgICAvLyBEZXF1ZXVlIGJ1ZmZlcnMgYW5kIHNlbmQgdGhlbSB0byBPTVgKQEAgLTE4NTQsNyArMTk2NCw3IEBACiAKICAgICAgICAgbVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLmVkaXRJdGVtQXQoaSkubUJ1ZmZlciA9IGJ1ZmZlcklkOwogCi0gICAgICAgIENPREVDX0xPR1YoInJlZ2lzdGVyZWQgZ3JhcGhpYyBidWZmZXIgd2l0aCBJRCAlcCAocG9pbnRlciA9ICVwKSIsCisgICAgICAgIENPREVDX0xPR1YoInJlZ2lzdGVyZWQgZ3JhcGhpYyBidWZmZXIgd2l0aCBJRCAldSAocG9pbnRlciA9ICVwKSIsCiAgICAgICAgICAgICAgICAgYnVmZmVySWQsIGdyYXBoaWNCdWZmZXIuZ2V0KCkpOwogICAgIH0KIApAQCAtMTg4MSw3ICsxOTkxLDcgQEAKIAogc3RhdHVzX3QgT01YQ29kZWM6OmNhbmNlbEJ1ZmZlclRvTmF0aXZlV2luZG93KEJ1ZmZlckluZm8gKmluZm8pIHsKICAgICBDSEVDS19FUSgoaW50KWluZm8tPm1TdGF0dXMsIChpbnQpT1dORURfQllfVVMpOwotICAgIENPREVDX0xPR1YoIkNhbGxpbmcgY2FuY2VsQnVmZmVyIG9uIGJ1ZmZlciAlcCIsIGluZm8tPm1CdWZmZXIpOworICAgIENPREVDX0xPR1YoIkNhbGxpbmcgY2FuY2VsQnVmZmVyIG9uIGJ1ZmZlciAldSIsIGluZm8tPm1CdWZmZXIpOwogICAgIGludCBlcnIgPSBtTmF0aXZlV2luZG93LT5jYW5jZWxCdWZmZXIoCiAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIGluZm8tPm1NZWRpYUJ1ZmZlci0+Z3JhcGhpY0J1ZmZlcigpLmdldCgpLCAtMSk7CiAgICAgaWYgKGVyciAhPSAwKSB7CkBAIC0yMTE5LDcgKzIyMjksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVyID0gbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyOwogCi0gICAgICAgICAgICBDT0RFQ19MT0dWKCJFTVBUWV9CVUZGRVJfRE9ORShidWZmZXI6ICVwKSIsIGJ1ZmZlcik7CisgICAgICAgICAgICBDT0RFQ19MT0dWKCJFTVBUWV9CVUZGRVJfRE9ORShidWZmZXI6ICV1KSIsIGJ1ZmZlcik7CiAKICAgICAgICAgICAgIFZlY3RvcjxCdWZmZXJJbmZvPiAqYnVmZmVycyA9ICZtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XTsKICAgICAgICAgICAgIHNpemVfdCBpID0gMDsKQEAgLTIxMjksNyArMjIzOSw3IEBACiAKICAgICAgICAgICAgIENIRUNLKGkgPCBidWZmZXJzLT5zaXplKCkpOwogICAgICAgICAgICAgaWYgKCgqYnVmZmVycylbaV0ubVN0YXR1cyAhPSBPV05FRF9CWV9DT01QT05FTlQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiV2UgYWxyZWFkeSBvd24gaW5wdXQgYnVmZmVyICVwLCB5ZXQgcmVjZWl2ZWQgIgorICAgICAgICAgICAgICAgIEFMT0dXKCJXZSBhbHJlYWR5IG93biBpbnB1dCBidWZmZXIgJXUsIHlldCByZWNlaXZlZCAiCiAgICAgICAgICAgICAgICAgICAgICAiYW4gRU1QVFlfQlVGRkVSX0RPTkUuIiwgYnVmZmVyKTsKICAgICAgICAgICAgIH0KIApAQCAtMjE0Myw3ICsyMjUzLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1Qb3J0U3RhdHVzW2tQb3J0SW5kZXhJbnB1dF0gPT0gRElTQUJMSU5HKSB7Ci0gICAgICAgICAgICAgICAgQ09ERUNfTE9HVigiUG9ydCBpcyBkaXNhYmxlZCwgZnJlZWluZyBidWZmZXIgJXAiLCBidWZmZXIpOworICAgICAgICAgICAgICAgIENPREVDX0xPR1YoIlBvcnQgaXMgZGlzYWJsZWQsIGZyZWVpbmcgYnVmZmVyICV1IiwgYnVmZmVyKTsKIAogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGZyZWVCdWZmZXIoa1BvcnRJbmRleElucHV0LCBpKTsKICAgICAgICAgICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CkBAIC0yMTY1LDcgKzIyNzUsNyBAQAogICAgICAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlciA9IG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlcjsKICAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MgPSBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5mbGFnczsKIAotICAgICAgICAgICAgQ09ERUNfTE9HVigiRklMTF9CVUZGRVJfRE9ORShidWZmZXI6ICVwLCBzaXplOiAlbGQsIGZsYWdzOiAweCUwOGx4LCB0aW1lc3RhbXA6ICVsbGQgdXMgKCUuMmYgc2VjcykpIiwKKyAgICAgICAgICAgIENPREVDX0xPR1YoIkZJTExfQlVGRkVSX0RPTkUoYnVmZmVyOiAldSwgc2l6ZTogJXUsIGZsYWdzOiAweCUwOHgsIHRpbWVzdGFtcDogJWxsZCB1cyAoJS4yZiBzZWNzKSkiLAogICAgICAgICAgICAgICAgICBidWZmZXIsCiAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnJhbmdlX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgZmxhZ3MsCkBAIC0yMTgyLDE0ICsyMjkyLDE0IEBACiAgICAgICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJmJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSk7CiAKICAgICAgICAgICAgIGlmIChpbmZvLT5tU3RhdHVzICE9IE9XTkVEX0JZX0NPTVBPTkVOVCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJXZSBhbHJlYWR5IG93biBvdXRwdXQgYnVmZmVyICVwLCB5ZXQgcmVjZWl2ZWQgIgorICAgICAgICAgICAgICAgIEFMT0dXKCJXZSBhbHJlYWR5IG93biBvdXRwdXQgYnVmZmVyICV1LCB5ZXQgcmVjZWl2ZWQgIgogICAgICAgICAgICAgICAgICAgICAgImEgRklMTF9CVUZGRVJfRE9ORS4iLCBidWZmZXIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbmZvLT5tU3RhdHVzID0gT1dORURfQllfVVM7CiAKICAgICAgICAgICAgIGlmIChtUG9ydFN0YXR1c1trUG9ydEluZGV4T3V0cHV0XSA9PSBESVNBQkxJTkcpIHsKLSAgICAgICAgICAgICAgICBDT0RFQ19MT0dWKCJQb3J0IGlzIGRpc2FibGVkLCBmcmVlaW5nIGJ1ZmZlciAlcCIsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgQ09ERUNfTE9HVigiUG9ydCBpcyBkaXNhYmxlZCwgZnJlZWluZyBidWZmZXIgJXUiLCBidWZmZXIpOwogCiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZnJlZUJ1ZmZlcihrUG9ydEluZGV4T3V0cHV0LCBpKTsKICAgICAgICAgICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CkBAIC0yMjA0LDIyICsyMzE0LDYgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVBvcnRTdGF0dXNba1BvcnRJbmRleE91dHB1dF0gIT0gU0hVVFRJTkdfRE9XTikgewogICAgICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbVBvcnRTdGF0dXNba1BvcnRJbmRleE91dHB1dF0sIChpbnQpRU5BQkxFRCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoaW5mby0+bU1lZGlhQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobU9NWExpdmVzTG9jYWxseSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1RdWlya3MgJiBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHMpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtUXVpcmtzICYga0RlZmVyc091dHB1dEJ1ZmZlckFsbG9jYXRpb24pOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBxY29tIHZpZGVvIGRlY29kZXJzIG9uIE5leHVzIGRvbid0IGFjdHVhbGx5IGFsbG9jYXRlCi0gICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgbWVtb3J5IG9uIGEgY2FsbCB0byBPTVhfQWxsb2NhdGVCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlICJwQnVmZmVyIiBtZW1iZXIgb2YgdGhlIE9NWF9CVUZGRVJIRUFERVJUWVBFCi0gICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyZSBpcyBvbmx5IGZpbGxlZCBpbiBsYXRlci4KLQotICAgICAgICAgICAgICAgICAgICBpbmZvLT5tTWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuZGF0YV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bVNpemUpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5tTWVkaWFCdWZmZXItPnNldE9ic2VydmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBpbmZvLT5tTWVkaWFCdWZmZXI7CiAgICAgICAgICAgICAgICAgYm9vbCBpc0dyYXBoaWNCdWZmZXIgPSBidWZmZXItPmdyYXBoaWNCdWZmZXIoKSAhPSBOVUxMOwogCkBAIC0yMjU0LDExICsyMzQ4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzVW5yZWFkYWJsZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0UG9pbnRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlQbGF0Zm9ybVByaXZhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5wbGF0Zm9ybV9wcml2YXRlKTsKLQotICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldFBvaW50ZXIoCisgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5QnVmZmVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIpOwogCkBAIC0yNDAwLDcgKzI0OTAsNyBAQAogCiAgICAgICAgIGNhc2UgT01YX0V2ZW50RXJyb3I6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENPREVDX0xPR0UoIkVSUk9SKDB4JTA4bHgsICVsZCkiLCBkYXRhMSwgZGF0YTIpOworICAgICAgICAgICAgQ09ERUNfTE9HRSgiT01YX0V2ZW50RXJyb3IoMHglMDh4LCAldSkiLCBkYXRhMSwgZGF0YTIpOwogCiAgICAgICAgICAgICBzZXRTdGF0ZShFUlJPUik7CiAgICAgICAgICAgICBicmVhazsKQEAgLTI0MDgsMTYgKzI0OTgsMTAgQEAKIAogICAgICAgICBjYXNlIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENPREVDX0xPR1YoIk9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQocG9ydD0lbGQsIGRhdGEyPTB4JTA4bHgpIiwKKyAgICAgICAgICAgIENPREVDX0xPR1YoIk9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQocG9ydD0ldSwgZGF0YTI9MHglMDh4KSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGExLCBkYXRhMik7CiAKICAgICAgICAgICAgIGlmIChkYXRhMiA9PSAwIHx8IGRhdGEyID09IE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgbUZpbGxlZEJ1ZmZlcnMgaXMgZW1wdHkgb3Igbm90Ci0gICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCBpcyBub3QgbWVhbnQgZm9yIHJlYWxsb2NhdGluZwotICAgICAgICAgICAgICAgIC8vIHRoZSBvdXRwdXQgYnVmZmVycy4KLSAgICAgICAgICAgICAgICBpZiAoZGF0YTEgPT0ga1BvcnRJbmRleE91dHB1dCkgewotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtRmlsbGVkQnVmZmVycy5lbXB0eSgpKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgb25Qb3J0U2V0dGluZ3NDaGFuZ2VkKGRhdGExKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YTEgPT0ga1BvcnRJbmRleE91dHB1dCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEyID09IE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AgfHwKQEAgLTI0NDgsNyArMjUzMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2NhbGUgaXMgaW4gMTYuMTYgZm9ybWF0LgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGUgMS4wID0gMHgwMTAwMDAuIFdoZW4gdGhlcmUgaXMgbm8KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gY2hhbmdlIHRoZSBkaXNwbGF5LCBza2lwIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkdldCBPTVhfSW5kZXhDb25maWdTY2FsZTogMHglbHgvMHglbHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkdldCBPTVhfSW5kZXhDb25maWdTY2FsZTogMHgleC8weCV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUueFdpZHRoLCBzY2FsZS54SGVpZ2h0KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxlLnhXaWR0aCAhPSAweDAxMDAwMCkgewpAQCAtMjQ4Miw3ICsyNTY2LDcgQEAKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7Ci0gICAgICAgICAgICBDT0RFQ19MT0dWKCJFVkVOVCglZCwgJWxkLCAlbGQpIiwgZXZlbnQsIGRhdGExLCBkYXRhMik7CisgICAgICAgICAgICBDT0RFQ19MT0dWKCJFVkVOVCglZCwgJXUsICV1KSIsIGV2ZW50LCBkYXRhMSwgZGF0YTIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNDk5LDcgKzI1ODMsNyBAQAogICAgICAgICBjYXNlIE9NWF9Db21tYW5kUG9ydERpc2FibGU6CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4ID0gZGF0YTsKLSAgICAgICAgICAgIENPREVDX0xPR1YoIlBPUlRfRElTQUJMRUQoJWxkKSIsIHBvcnRJbmRleCk7CisgICAgICAgICAgICBDT0RFQ19MT0dWKCJQT1JUX0RJU0FCTEVEKCV1KSIsIHBvcnRJbmRleCk7CiAKICAgICAgICAgICAgIENIRUNLKG1TdGF0ZSA9PSBFWEVDVVRJTkcgfHwgbVN0YXRlID09IFJFQ09ORklHVVJJTkcpOwogICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltUG9ydFN0YXR1c1twb3J0SW5kZXhdLCAoaW50KURJU0FCTElORyk7CkBAIC0yNTIzLDcgKzI2MDcsNyBAQAogCiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZW5hYmxlUG9ydEFzeW5jKHBvcnRJbmRleCk7CiAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBDT0RFQ19MT0dFKCJlbmFibGVQb3J0QXN5bmMoJWxkKSBmYWlsZWQgKGVyciA9ICVkKSIsIHBvcnRJbmRleCwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgQ09ERUNfTE9HRSgiZW5hYmxlUG9ydEFzeW5jKCV1KSBmYWlsZWQgKGVyciA9ICVkKSIsIHBvcnRJbmRleCwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoRVJST1IpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGVyciA9IGFsbG9jYXRlQnVmZmVyc09uUG9ydChwb3J0SW5kZXgpOwpAQCAtMjU0NCw3ICsyNjI4LDcgQEAKICAgICAgICAgY2FzZSBPTVhfQ29tbWFuZFBvcnRFbmFibGU6CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4ID0gZGF0YTsKLSAgICAgICAgICAgIENPREVDX0xPR1YoIlBPUlRfRU5BQkxFRCglbGQpIiwgcG9ydEluZGV4KTsKKyAgICAgICAgICAgIENPREVDX0xPR1YoIlBPUlRfRU5BQkxFRCgldSkiLCBwb3J0SW5kZXgpOwogCiAgICAgICAgICAgICBDSEVDSyhtU3RhdGUgPT0gRVhFQ1VUSU5HIHx8IG1TdGF0ZSA9PSBSRUNPTkZJR1VSSU5HKTsKICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbVBvcnRTdGF0dXNbcG9ydEluZGV4XSwgKGludClFTkFCTElORyk7CkBAIC0yNTY1LDcgKzI2NDksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCA9IGRhdGE7CiAKLSAgICAgICAgICAgIENPREVDX0xPR1YoIkZMVVNIX0RPTkUoJWxkKSIsIHBvcnRJbmRleCk7CisgICAgICAgICAgICBDT0RFQ19MT0dWKCJGTFVTSF9ET05FKCV1KSIsIHBvcnRJbmRleCk7CiAKICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbVBvcnRTdGF0dXNbcG9ydEluZGV4XSwgKGludClTSFVUVElOR19ET1dOKTsKICAgICAgICAgICAgIG1Qb3J0U3RhdHVzW3BvcnRJbmRleF0gPSBFTkFCTEVEOwpAQCAtMjgxMSw3ICsyODk1LDcgQEAKIHZvaWQgT01YQ29kZWM6Om9uUG9ydFNldHRpbmdzQ2hhbmdlZChPTVhfVTMyIHBvcnRJbmRleCkgewogICAgIENPREVDX0xPR1YoIlBPUlRfU0VUVElOR1NfQ0hBTkdFRCglbGQpIiwgcG9ydEluZGV4KTsKIAotICAgIENIRUNLX0VRKChpbnQpbVN0YXRlLCAoaW50KUVYRUNVVElORyk7CisgICAgQ0hFQ0sobVN0YXRlID09IEVYRUNVVElORyB8fCBtU3RhdGUgPT0gRVhFQ1VUSU5HX1RPX0lETEUpOwogICAgIENIRUNLX0VRKHBvcnRJbmRleCwgKE9NWF9VMzIpa1BvcnRJbmRleE91dHB1dCk7CiAgICAgQ0hFQ0soIW1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2VkUGVuZGluZyk7CiAKQEAgLTI5OTMsNyArMzA3Nyw4IEBACiAKICAgICAgICAgc2l6ZV90IHNpemUgPSBzcGVjaWZpYy0+bVNpemU7CiAKLSAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgbU1JTUUpCisgICAgICAgIGlmICgoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtTUlNRSkgfHwKKyAgICAgICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCBtTUlNRSkpCiAgICAgICAgICAgICAgICAgJiYgIShtUXVpcmtzICYga1dhbnRzTkFMRnJhZ21lbnRzKSkgewogICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05BTFN0YXJ0Q29kZVs0XSA9CiAgICAgICAgICAgICAgICAgICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9OwpAQCAtMzg4Myw3ICszOTY4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgQ09ERUNfTE9HVigic2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpIiwgc2Vla1RpbWVVcywgc2Vla1RpbWVVcyAvIDFFNik7CisgICAgICAgIENPREVDX0xPR1YoInNlZWtpbmcgdG8gJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcykiLCBzZWVrVGltZVVzLCBzZWVrVGltZVVzIC8gMUU2KTsKIAogICAgICAgICBtU2lnbmFsbGVkRU9TID0gZmFsc2U7CiAKQEAgLTQxMjgsNiArNDIxMyw3IEBACiAgICAgICAgICJPTVhfQVVESU9fQ29kaW5nTVAzIiwKICAgICAgICAgIk9NWF9BVURJT19Db2RpbmdTQkMiLAogICAgICAgICAiT01YX0FVRElPX0NvZGluZ1ZPUkJJUyIsCisgICAgICAgICJPTVhfQVVESU9fQ29kaW5nT1BVUyIsCiAgICAgICAgICJPTVhfQVVESU9fQ29kaW5nV01BIiwKICAgICAgICAgIk9NWF9BVURJT19Db2RpbmdSQSIsCiAgICAgICAgICJPTVhfQVVESU9fQ29kaW5nTUlESSIsCkBAIC00MjIyLDkgKzQzMDgsOSBAQAogICAgIENIRUNLKChwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ICYmIGRlZi5lRGlyID09IE9NWF9EaXJJbnB1dCkKICAgICAgICAgICB8fCAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQgJiYgZGVmLmVEaXIgPT0gT01YX0Rpck91dHB1dCkpOwogCi0gICAgcHJpbnRmKCIgIG5CdWZmZXJDb3VudEFjdHVhbCA9ICVsZFxuIiwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7Ci0gICAgcHJpbnRmKCIgIG5CdWZmZXJDb3VudE1pbiA9ICVsZFxuIiwgZGVmLm5CdWZmZXJDb3VudE1pbik7Ci0gICAgcHJpbnRmKCIgIG5CdWZmZXJTaXplID0gJWxkXG4iLCBkZWYubkJ1ZmZlclNpemUpOworICAgIHByaW50ZigiICBuQnVmZmVyQ291bnRBY3R1YWwgPSAlIiBQUkl1MzIgIlxuIiwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCk7CisgICAgcHJpbnRmKCIgIG5CdWZmZXJDb3VudE1pbiA9ICUiIFBSSXUzMiAiXG4iLCBkZWYubkJ1ZmZlckNvdW50TWluKTsKKyAgICBwcmludGYoIiAgbkJ1ZmZlclNpemUgPSAlIiBQUkl1MzIgIlxuIiwgZGVmLm5CdWZmZXJTaXplKTsKIAogICAgIHN3aXRjaCAoZGVmLmVEb21haW4pIHsKICAgICAgICAgY2FzZSBPTVhfUG9ydERvbWFpbkltYWdlOgpAQCAtNDIzMyw5ICs0MzE5LDkgQEAKIAogICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgICAgICAgcHJpbnRmKCIgIC8vIEltYWdlXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiICBuRnJhbWVXaWR0aCA9ICVsZFxuIiwgaW1hZ2VEZWYtPm5GcmFtZVdpZHRoKTsKLSAgICAgICAgICAgIHByaW50ZigiICBuRnJhbWVIZWlnaHQgPSAlbGRcbiIsIGltYWdlRGVmLT5uRnJhbWVIZWlnaHQpOwotICAgICAgICAgICAgcHJpbnRmKCIgIG5TdHJpZGUgPSAlbGRcbiIsIGltYWdlRGVmLT5uU3RyaWRlKTsKKyAgICAgICAgICAgIHByaW50ZigiICBuRnJhbWVXaWR0aCA9ICUiIFBSSXUzMiAiXG4iLCBpbWFnZURlZi0+bkZyYW1lV2lkdGgpOworICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZUhlaWdodCA9ICUiIFBSSXUzMiAiXG4iLCBpbWFnZURlZi0+bkZyYW1lSGVpZ2h0KTsKKyAgICAgICAgICAgIHByaW50ZigiICBuU3RyaWRlID0gJSIgUFJJdTMyICJcbiIsIGltYWdlRGVmLT5uU3RyaWRlKTsKIAogICAgICAgICAgICAgcHJpbnRmKCIgIGVDb21wcmVzc2lvbkZvcm1hdCA9ICVzXG4iLAogICAgICAgICAgICAgICAgICAgIGltYWdlQ29tcHJlc3Npb25Gb3JtYXRTdHJpbmcoaW1hZ2VEZWYtPmVDb21wcmVzc2lvbkZvcm1hdCkpOwpAQCAtNDI1Miw5ICs0MzM4LDkgQEAKIAogICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgICAgICAgcHJpbnRmKCIgIC8vIFZpZGVvXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiICBuRnJhbWVXaWR0aCA9ICVsZFxuIiwgdmlkZW9EZWYtPm5GcmFtZVdpZHRoKTsKLSAgICAgICAgICAgIHByaW50ZigiICBuRnJhbWVIZWlnaHQgPSAlbGRcbiIsIHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpOwotICAgICAgICAgICAgcHJpbnRmKCIgIG5TdHJpZGUgPSAlbGRcbiIsIHZpZGVvRGVmLT5uU3RyaWRlKTsKKyAgICAgICAgICAgIHByaW50ZigiICBuRnJhbWVXaWR0aCA9ICUiIFBSSXUzMiAiXG4iLCB2aWRlb0RlZi0+bkZyYW1lV2lkdGgpOworICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZUhlaWdodCA9ICUiIFBSSXUzMiAiXG4iLCB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0KTsKKyAgICAgICAgICAgIHByaW50ZigiICBuU3RyaWRlID0gJSIgUFJJdTMyICJcbiIsIHZpZGVvRGVmLT5uU3RyaWRlKTsKIAogICAgICAgICAgICAgcHJpbnRmKCIgIGVDb21wcmVzc2lvbkZvcm1hdCA9ICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHZpZGVvQ29tcHJlc3Npb25Gb3JtYXRTdHJpbmcodmlkZW9EZWYtPmVDb21wcmVzc2lvbkZvcm1hdCkpOwpAQCAtNDI4MywxMCArNDM2OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9QY20sICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKTsKICAgICAgICAgICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgblNhbXBsaW5nUmF0ZSA9ICVsZFxuIiwgcGFyYW1zLm5TYW1wbGluZ1JhdGUpOwotICAgICAgICAgICAgICAgIHByaW50ZigiICBuQ2hhbm5lbHMgPSAlbGRcbiIsIHBhcmFtcy5uQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHByaW50ZigiICBuU2FtcGxpbmdSYXRlID0gJSIgUFJJdTMyICJcbiIsIHBhcmFtcy5uU2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgbkNoYW5uZWxzID0gJSIgUFJJdTMyICJcbiIsIHBhcmFtcy5uQ2hhbm5lbHMpOwogICAgICAgICAgICAgICAgIHByaW50ZigiICBiSW50ZXJsZWF2ZWQgPSAlZFxuIiwgcGFyYW1zLmJJbnRlcmxlYXZlZCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIgIG5CaXRQZXJTYW1wbGUgPSAlbGRcbiIsIHBhcmFtcy5uQml0UGVyU2FtcGxlKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgbkJpdFBlclNhbXBsZSA9ICUiIFBSSXUzMiAiXG4iLCBwYXJhbXMubkJpdFBlclNhbXBsZSk7CiAKICAgICAgICAgICAgICAgICBwcmludGYoIiAgZU51bURhdGEgPSAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmVOdW1EYXRhID09IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkCkBAIC00MzAyLDcgKzQzODgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9BbXIsICZhbXIsIHNpemVvZihhbXIpKTsKICAgICAgICAgICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgbkNoYW5uZWxzID0gJWxkXG4iLCBhbXIubkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgbkNoYW5uZWxzID0gJSIgUFJJdTMyICJcbiIsIGFtci5uQ2hhbm5lbHMpOwogICAgICAgICAgICAgICAgIHByaW50ZigiICBlQU1SQmFuZE1vZGUgPSAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFtckJhbmRNb2RlU3RyaW5nKGFtci5lQU1SQmFuZE1vZGUpKTsKICAgICAgICAgICAgICAgICBwcmludGYoIiAgZUFNUkZyYW1lRm9ybWF0ID0gJXNcbiIsCkBAIC00NjU3LDYgKzQ3NDMsOCBAQAogICAgIH0KIAogICAgIC8vIENvbG9yIGZvcm1hdCBxdWVyeQorICAgIC8vIHJldHVybiBjb2xvcnMgaW4gdGhlIG9yZGVyIHJlcG9ydGVkIGJ5IHRoZSBPTVggY29tcG9uZW50CisgICAgLy8gcHJlZml4ICJmbGV4aWJsZSIgc3RhbmRhcmQgb25lcyB3aXRoIHRoZSBmbGV4aWJsZSBlcXVpdmFsZW50CiAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFIHBvcnRGb3JtYXQ7CiAgICAgSW5pdE9NWFBhcmFtcygmcG9ydEZvcm1hdCk7CiAgICAgcG9ydEZvcm1hdC5uUG9ydEluZGV4ID0gIWlzRW5jb2RlciA/IDEgOiAwOwpAQCAtNDY2Nyw2ICs0NzU1LDIxIEBACiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisKKyAgICAgICAgT01YX1UzMiBmbGV4aWJsZUVxdWl2YWxlbnQ7CisgICAgICAgIGlmIChBQ29kZWM6OmlzRmxleGlibGVDb2xvckZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgb214LCBub2RlLCBwb3J0Rm9ybWF0LmVDb2xvckZvcm1hdCwgJmZsZXhpYmxlRXF1aXZhbGVudCkpIHsKKyAgICAgICAgICAgIGJvb2wgbWFya2VkID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHMtPm1Db2xvckZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2Fwcy0+bUNvbG9yRm9ybWF0cy5pdGVtQXQoaSkgPT0gZmxleGlibGVFcXVpdmFsZW50KSB7CisgICAgICAgICAgICAgICAgICAgIG1hcmtlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbWFya2VkKSB7CisgICAgICAgICAgICAgICAgY2Fwcy0+bUNvbG9yRm9ybWF0cy5wdXNoKGZsZXhpYmxlRXF1aXZhbGVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgY2Fwcy0+bUNvbG9yRm9ybWF0cy5wdXNoKHBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0KTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCmluZGV4IGRhOTQ1ODcuLjkwMGUyYjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcApAQCAtMTUzLDcgKzE1Myw3IEBACiAgICAgcmV0dXJuIG1FeHRyYWN0b3ItPm1JbXBsLT5nZXRGb3JtYXQoKTsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBPZ2dTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgaWYgKG1TdGFydGVkKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0zMjIsMjUgKzMyMiwyOSBAQAogICAgIH0KIAogICAgIHNpemVfdCBsZWZ0ID0gMDsKLSAgICBzaXplX3QgcmlnaHQgPSBtVGFibGVPZkNvbnRlbnRzLnNpemUoKTsKLSAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7Ci0gICAgICAgIHNpemVfdCBjZW50ZXIgPSBsZWZ0IC8gMiArIHJpZ2h0IC8gMiArIChsZWZ0ICYgcmlnaHQgJiAxKTsKKyAgICBzaXplX3QgcmlnaHRfcGx1c19vbmUgPSBtVGFibGVPZkNvbnRlbnRzLnNpemUoKTsKKyAgICB3aGlsZSAobGVmdCA8IHJpZ2h0X3BsdXNfb25lKSB7CisgICAgICAgIHNpemVfdCBjZW50ZXIgPSBsZWZ0ICsgKHJpZ2h0X3BsdXNfb25lIC0gbGVmdCkgLyAyOwogCiAgICAgICAgIGNvbnN0IFRPQ0VudHJ5ICZlbnRyeSA9IG1UYWJsZU9mQ29udGVudHMuaXRlbUF0KGNlbnRlcik7CiAKICAgICAgICAgaWYgKHRpbWVVcyA8IGVudHJ5Lm1UaW1lVXMpIHsKLSAgICAgICAgICAgIHJpZ2h0ID0gY2VudGVyOworICAgICAgICAgICAgcmlnaHRfcGx1c19vbmUgPSBjZW50ZXI7CiAgICAgICAgIH0gZWxzZSBpZiAodGltZVVzID4gZW50cnkubVRpbWVVcykgewogICAgICAgICAgICAgbGVmdCA9IGNlbnRlciArIDE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZWZ0ID0gcmlnaHQgPSBjZW50ZXI7CisgICAgICAgICAgICBsZWZ0ID0gY2VudGVyOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAobGVmdCA9PSBtVGFibGVPZkNvbnRlbnRzLnNpemUoKSkgeworICAgICAgICAtLWxlZnQ7CisgICAgfQorCiAgICAgY29uc3QgVE9DRW50cnkgJmVudHJ5ID0gbVRhYmxlT2ZDb250ZW50cy5pdGVtQXQobGVmdCk7CiAKLSAgICBBTE9HVigic2Vla2luZyB0byBlbnRyeSAlZCAvICVkIGF0IG9mZnNldCAlbGxkIiwKKyAgICBBTE9HVigic2Vla2luZyB0byBlbnRyeSAlenUgLyAlenUgYXQgb2Zmc2V0ICVsbGQiLAogICAgICAgICAgbGVmdCwgbVRhYmxlT2ZDb250ZW50cy5zaXplKCksIGVudHJ5Lm1QYWdlT2Zmc2V0KTsKIAogICAgIHJldHVybiBzZWVrVG9PZmZzZXQoZW50cnkubVBhZ2VPZmZzZXQpOwpAQCAtMzgzLDcgKzM4Nyw3IEBACiAgICAgc3NpemVfdCBuOwogICAgIGlmICgobiA9IG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpKQogICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJWQgYnl0ZXMgYXQgb2Zmc2V0IDB4JTAxNmxseCwgZ290ICVsZCBieXRlcyIsCisgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgb2Zmc2V0IDB4JTAxNmxseCwgZ290ICV6ZCBieXRlcyIsCiAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlciksIG9mZnNldCwgbik7CiAKICAgICAgICAgaWYgKG4gPCAwKSB7CkBAIC01MDcsNyArNTExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChuIDwgKHNzaXplX3QpcGFja2V0U2l6ZSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyBhdCAweCUwMTZsbHgsIGdvdCAlbGQgYnl0ZXMiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgMHglMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNpemUsIGRhdGFPZmZzZXQsIG4pOwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KQEAgLTU0OCw3ICs1NTIsNyBAQAogICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWKCJyZWFkUGFnZSByZXR1cm5lZCAlbGQiLCBuKTsKKyAgICAgICAgICAgIEFMT0dWKCJyZWFkUGFnZSByZXR1cm5lZCAlemQiLCBuKTsKIAogICAgICAgICAgICAgcmV0dXJuIG4gPCAwID8gbiA6IChzdGF0dXNfdClFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9CkBAIC01OTIsNyArNTk2LDcgQEAKICAgICBpZiAoKGVyciA9IHJlYWROZXh0UGFja2V0KCZwYWNrZXQpKSAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlZFxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CisgICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJXp1XG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKICAgICBlcnIgPSB2ZXJpZnlIZWFkZXIocGFja2V0LCAxKTsKICAgICBwYWNrZXQtPnJlbGVhc2UoKTsKICAgICBwYWNrZXQgPSBOVUxMOwpAQCAtNjAzLDcgKzYwNyw3IEBACiAgICAgaWYgKChlcnIgPSByZWFkTmV4dFBhY2tldCgmcGFja2V0KSkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJWRcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgMyk7CiAgICAgcGFja2V0LT5yZWxlYXNlKCk7CiAgICAgcGFja2V0ID0gTlVMTDsKQEAgLTYxNCw3ICs2MTgsNyBAQAogICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQotICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICVkXG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwogICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDUpOwogICAgIHBhY2tldC0+cmVsZWFzZSgpOwogICAgIHBhY2tldCA9IE5VTEw7CkBAIC04OTUsNyArODk5LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEFMT0dWKCJnb3QgaW1hZ2UgZGF0YSwgJWQgdHJhaWxpbmcgYnl0ZXMiLAorICAgIEFMT0dWKCJnb3QgaW1hZ2UgZGF0YSwgJXp1IHRyYWlsaW5nIGJ5dGVzIiwKICAgICAgICAgIGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiAtIGRhdGFMZW4pOwogCiAgICAgZmlsZU1ldGEtPnNldERhdGEoCkBAIC05MzYsNyArOTQwLDcgQEAKIH0KIAogc3A8TWV0YURhdGE+IE9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKGluZGV4ID49IDEpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlSXRlcmF0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlSXRlcmF0b3IuY3BwCmluZGV4IGVhZTcyMWIuLjI3NDgzNDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZUl0ZXJhdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVJdGVyYXRvci5jcHAKQEAgLTEzMyw3ICsxMzMsOCBAQAogICAgIH0KIAogICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoKGVyciA9IGZpbmRTYW1wbGVUaW1lKHNhbXBsZUluZGV4LCAmbUN1cnJlbnRTYW1wbGVUaW1lKSkgIT0gT0spIHsKKyAgICBpZiAoKGVyciA9IGZpbmRTYW1wbGVUaW1lQW5kRHVyYXRpb24oCisgICAgICAgICAgICBzYW1wbGVJbmRleCwgJm1DdXJyZW50U2FtcGxlVGltZSwgJm1DdXJyZW50U2FtcGxlRHVyYXRpb24pKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiZmluZFNhbXBsZVRpbWUgcmV0dXJuIGVycm9yIik7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtMjg1LDggKzI4Niw4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTYW1wbGVJdGVyYXRvcjo6ZmluZFNhbXBsZVRpbWUoCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50MzJfdCAqdGltZSkgeworc3RhdHVzX3QgU2FtcGxlSXRlcmF0b3I6OmZpbmRTYW1wbGVUaW1lQW5kRHVyYXRpb24oCisgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50MzJfdCAqdGltZSwgdWludDMyX3QgKmR1cmF0aW9uKSB7CiAgICAgaWYgKHNhbXBsZUluZGV4ID49IG1UYWJsZS0+bU51bVNhbXBsZVNpemVzKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQpAQCAtMzA5LDYgKzMxMCw4IEBACiAKICAgICAqdGltZSArPSBtVGFibGUtPmdldENvbXBvc2l0aW9uVGltZU9mZnNldChzYW1wbGVJbmRleCk7CiAKKyAgICAqZHVyYXRpb24gPSBtVFRTRHVyYXRpb247CisKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcAppbmRleCAxMTZmMzU4Li5kNzI1MWY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCkBAIC01NDUsNyArNTQ1LDggQEAKIH0KIAogc3RhdHVzX3QgU2FtcGxlVGFibGU6OmZpbmRTYW1wbGVBdFRpbWUoCi0gICAgICAgIHVpbnQzMl90IHJlcV90aW1lLCB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgICAgICB1aW50NjRfdCByZXFfdGltZSwgdWludDY0X3Qgc2NhbGVfbnVtLCB1aW50NjRfdCBzY2FsZV9kZW4sCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgYnVpbGRTYW1wbGVFbnRyaWVzVGFibGUoKTsKIAogICAgIGlmIChtU2FtcGxlVGltZUVudHJpZXMgPT0gTlVMTCkgewpAQCAtNTUzLDc5ICs1NTQsNjcgQEAKICAgICB9CiAKICAgICB1aW50MzJfdCBsZWZ0ID0gMDsKLSAgICB1aW50MzJfdCByaWdodCA9IG1OdW1TYW1wbGVTaXplczsKLSAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7Ci0gICAgICAgIHVpbnQzMl90IGNlbnRlciA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKLSAgICAgICAgdWludDMyX3QgY2VudGVyVGltZSA9IG1TYW1wbGVUaW1lRW50cmllc1tjZW50ZXJdLm1Db21wb3NpdGlvblRpbWU7CisgICAgdWludDMyX3QgcmlnaHRfcGx1c19vbmUgPSBtTnVtU2FtcGxlU2l6ZXM7CisgICAgd2hpbGUgKGxlZnQgPCByaWdodF9wbHVzX29uZSkgeworICAgICAgICB1aW50MzJfdCBjZW50ZXIgPSBsZWZ0ICsgKHJpZ2h0X3BsdXNfb25lIC0gbGVmdCkgLyAyOworICAgICAgICB1aW50NjRfdCBjZW50ZXJUaW1lID0KKyAgICAgICAgICAgIGdldFNhbXBsZVRpbWUoY2VudGVyLCBzY2FsZV9udW0sIHNjYWxlX2Rlbik7CiAKICAgICAgICAgaWYgKHJlcV90aW1lIDwgY2VudGVyVGltZSkgewotICAgICAgICAgICAgcmlnaHQgPSBjZW50ZXI7CisgICAgICAgICAgICByaWdodF9wbHVzX29uZSA9IGNlbnRlcjsKICAgICAgICAgfSBlbHNlIGlmIChyZXFfdGltZSA+IGNlbnRlclRpbWUpIHsKICAgICAgICAgICAgIGxlZnQgPSBjZW50ZXIgKyAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVmdCA9IGNlbnRlcjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKnNhbXBsZV9pbmRleCA9IG1TYW1wbGVUaW1lRW50cmllc1tjZW50ZXJdLm1TYW1wbGVJbmRleDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChsZWZ0ID09IG1OdW1TYW1wbGVTaXplcykgewotICAgICAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdBZnRlcikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgfQotCi0gICAgICAgIC0tbGVmdDsKLSAgICB9Ci0KICAgICB1aW50MzJfdCBjbG9zZXN0SW5kZXggPSBsZWZ0OwogCisgICAgaWYgKGNsb3Nlc3RJbmRleCA9PSBtTnVtU2FtcGxlU2l6ZXMpIHsKKyAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQWZ0ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSBrRmxhZ0JlZm9yZTsKKyAgICB9IGVsc2UgaWYgKGNsb3Nlc3RJbmRleCA9PSAwKSB7CisgICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0JlZm9yZSkgeworICAgICAgICAgICAgLy8gbm9ybWFsbHkgd2Ugc2hvdWxkIHJldHVybiBvdXQgb2YgcmFuZ2UsIGJ1dCB0aGF0IGlzCisgICAgICAgICAgICAvLyB0cmVhdGVkIGFzIGVuZC1vZi1zdHJlYW0uICBpbnN0ZWFkIHJldHVybiBmaXJzdCBzYW1wbGUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0ga0ZsYWdBZnRlcjsKKyAgICB9CisKICAgICBzd2l0Y2ggKGZsYWdzKSB7CiAgICAgICAgIGNhc2Uga0ZsYWdCZWZvcmU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlIChjbG9zZXN0SW5kZXggPiAwCi0gICAgICAgICAgICAgICAgICAgICYmIG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXhdLm1Db21wb3NpdGlvblRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IHJlcV90aW1lKSB7Ci0gICAgICAgICAgICAgICAgLS1jbG9zZXN0SW5kZXg7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAtLWNsb3Nlc3RJbmRleDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBrRmxhZ0FmdGVyOgogICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoY2xvc2VzdEluZGV4ICsgMSA8IG1OdW1TYW1wbGVTaXplcwotICAgICAgICAgICAgICAgICAgICAmJiBtU2FtcGxlVGltZUVudHJpZXNbY2xvc2VzdEluZGV4XS5tQ29tcG9zaXRpb25UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCByZXFfdGltZSkgewotICAgICAgICAgICAgICAgICsrY2xvc2VzdEluZGV4OwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDSyhmbGFncyA9PSBrRmxhZ0Nsb3Nlc3QpOwotCi0gICAgICAgICAgICBpZiAoY2xvc2VzdEluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGxlZnQgbmVpZ2hib3VyIGFuZCBwaWNrIGNsb3Nlc3QuCi0gICAgICAgICAgICAgICAgdWludDMyX3QgYWJzZGlmZjEgPQotICAgICAgICAgICAgICAgICAgICBhYnNfZGlmZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlVGltZUVudHJpZXNbY2xvc2VzdEluZGV4XS5tQ29tcG9zaXRpb25UaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90aW1lKTsKLQotICAgICAgICAgICAgICAgIHVpbnQzMl90IGFic2RpZmYyID0KLSAgICAgICAgICAgICAgICAgICAgYWJzX2RpZmZlcmVuY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleCAtIDFdLm1Db21wb3NpdGlvblRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RpbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGFic2RpZmYxID4gYWJzZGlmZjIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VzdEluZGV4ID0gY2xvc2VzdEluZGV4IC0gMTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBwaWNrIGNsb3Nlc3QgYmFzZWQgb24gdGltZXN0YW1wLiB1c2UgYWJzX2RpZmZlcmVuY2UgZm9yIHNhZmV0eQorICAgICAgICAgICAgaWYgKGFic19kaWZmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVUaW1lKGNsb3Nlc3RJbmRleCwgc2NhbGVfbnVtLCBzY2FsZV9kZW4pLCByZXFfdGltZSkgPgorICAgICAgICAgICAgICAgIGFic19kaWZmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICByZXFfdGltZSwgZ2V0U2FtcGxlVGltZShjbG9zZXN0SW5kZXggLSAxLCBzY2FsZV9udW0sIHNjYWxlX2RlbikpKSB7CisgICAgICAgICAgICAgICAgLS1jbG9zZXN0SW5kZXg7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgKnNhbXBsZV9pbmRleCA9IG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXhdLm1TYW1wbGVJbmRleDsKLQogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNjQ3LDEwOSArNjM2LDg1IEBACiAgICAgfQogCiAgICAgdWludDMyX3QgbGVmdCA9IDA7Ci0gICAgdWludDMyX3QgcmlnaHQgPSBtTnVtU3luY1NhbXBsZXM7Ci0gICAgd2hpbGUgKGxlZnQgPCByaWdodCkgewotICAgICAgICB1aW50MzJfdCBjZW50ZXIgPSBsZWZ0ICsgKHJpZ2h0IC0gbGVmdCkgLyAyOworICAgIHVpbnQzMl90IHJpZ2h0X3BsdXNfb25lID0gbU51bVN5bmNTYW1wbGVzOworICAgIHdoaWxlIChsZWZ0IDwgcmlnaHRfcGx1c19vbmUpIHsKKyAgICAgICAgdWludDMyX3QgY2VudGVyID0gbGVmdCArIChyaWdodF9wbHVzX29uZSAtIGxlZnQpIC8gMjsKICAgICAgICAgdWludDMyX3QgeCA9IG1TeW5jU2FtcGxlc1tjZW50ZXJdOwogCiAgICAgICAgIGlmIChzdGFydF9zYW1wbGVfaW5kZXggPCB4KSB7Ci0gICAgICAgICAgICByaWdodCA9IGNlbnRlcjsKKyAgICAgICAgICAgIHJpZ2h0X3BsdXNfb25lID0gY2VudGVyOwogICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0X3NhbXBsZV9pbmRleCA+IHgpIHsKICAgICAgICAgICAgIGxlZnQgPSBjZW50ZXIgKyAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVmdCA9IGNlbnRlcjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKnNhbXBsZV9pbmRleCA9IHg7CisgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KICAgICB9CisKICAgICBpZiAobGVmdCA9PSBtTnVtU3luY1NhbXBsZXMpIHsKICAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQWZ0ZXIpIHsKICAgICAgICAgICAgIEFMT0dFKCJ0cmllZCB0byBmaW5kIGEgc3luYyBmcmFtZSBhZnRlciB0aGUgbGFzdCBvbmU6ICVkIiwgbGVmdCk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICB9Ci0gICAgICAgIGxlZnQgPSBsZWZ0IC0gMTsKKyAgICAgICAgZmxhZ3MgPSBrRmxhZ0JlZm9yZTsKKyAgICB9CisgICAgZWxzZSBpZiAobGVmdCA9PSAwKSB7CisgICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0JlZm9yZSkgeworICAgICAgICAgICAgQUxPR0UoInRyaWVkIHRvIGZpbmQgYSBzeW5jIGZyYW1lIGJlZm9yZSB0aGUgZmlyc3Qgb25lOiAlZCIsIGxlZnQpOworCisgICAgICAgICAgICAvLyBub3JtYWxseSB3ZSBzaG91bGQgcmV0dXJuIG91dCBvZiByYW5nZSwgYnV0IHRoYXQgaXMKKyAgICAgICAgICAgIC8vIHRyZWF0ZWQgYXMgZW5kLW9mLXN0cmVhbS4gIGluc3RlYWQgc2VlayB0byBmaXJzdCBzeW5jCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IGtGbGFnQWZ0ZXI7CiAgICAgfQogCi0gICAgLy8gTm93IHNzaVtsZWZ0XSBpcyB0aGUgc3luYyBzYW1wbGUgaW5kZXgganVzdCBiZWZvcmUgKG9yIGF0KQotICAgIC8vIHN0YXJ0X3NhbXBsZV9pbmRleC4KLSAgICAvLyBBbHNvIHN0YXJ0X3NhbXBsZV9pbmRleCA8IHNzaVtsZWZ0ICsgMV0sIGlmIGxlZnQgKyAxIDwgbU51bVN5bmNTYW1wbGVzLgotCi0gICAgdWludDMyX3QgeCA9IG1TeW5jU2FtcGxlc1tsZWZ0XTsKLQotICAgIGlmIChsZWZ0ICsgMSA8IG1OdW1TeW5jU2FtcGxlcykgewotICAgICAgICB1aW50MzJfdCB5ID0gbVN5bmNTYW1wbGVzW2xlZnQgKyAxXTsKLQotICAgICAgICAvLyBvdXIgc2FtcGxlIGxpZXMgYmV0d2VlbiBzeW5jIHNhbXBsZXMgeCBhbmQgeS4KLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhzdGFydF9zYW1wbGVfaW5kZXgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3Qgc2FtcGxlX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKLQotICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyh4KTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCB4X3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKLQotICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyh5KTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IHlfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwotCi0gICAgICAgIGlmIChhYnNfZGlmZmVyZW5jZSh4X3RpbWUsIHNhbXBsZV90aW1lKQotICAgICAgICAgICAgICAgID4gYWJzX2RpZmZlcmVuY2UoeV90aW1lLCBzYW1wbGVfdGltZSkpIHsKLSAgICAgICAgICAgIC8vIFBpY2sgdGhlIHN5bmMgc2FtcGxlIGNsb3Nlc3QgKHRpbWV3aXNlKSB0byB0aGUgc3RhcnQtc2FtcGxlLgotICAgICAgICAgICAgeCA9IHk7Ci0gICAgICAgICAgICArK2xlZnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KKyAgICAvLyBOb3cgc3NpW2xlZnQgLSAxXSA8KD0pIHN0YXJ0X3NhbXBsZV9pbmRleCA8PSBzc2lbbGVmdF0KICAgICBzd2l0Y2ggKGZsYWdzKSB7CiAgICAgICAgIGNhc2Uga0ZsYWdCZWZvcmU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh4ID4gc3RhcnRfc2FtcGxlX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobGVmdCA+IDApOwotCi0gICAgICAgICAgICAgICAgeCA9IG1TeW5jU2FtcGxlc1tsZWZ0IC0gMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAoeCA+IHN0YXJ0X3NhbXBsZV9pbmRleCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGFibGUgb2Ygc3luYyBzYW1wbGUgaW5kaWNlcyB3YXMgbm90IHNvcnRlZAotICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJseS4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAtLWxlZnQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotCiAgICAgICAgIGNhc2Uga0ZsYWdBZnRlcjoKICAgICAgICAgewotICAgICAgICAgICAgaWYgKHggPCBzdGFydF9zYW1wbGVfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAobGVmdCArIDEgPj0gbU51bVN5bmNTYW1wbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgeCA9IG1TeW5jU2FtcGxlc1tsZWZ0ICsgMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAoeCA8IHN0YXJ0X3NhbXBsZV9pbmRleCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGFibGUgb2Ygc3luYyBzYW1wbGUgaW5kaWNlcyB3YXMgbm90IHNvcnRlZAotICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJseS4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyByb3V0ZSBpcyBub3QgdXNlZCwgYnV0IGltcGxlbWVudCBpdCBub25ldGhlbGVzcworICAgICAgICAgICAgQ0hFQ0soZmxhZ3MgPT0ga0ZsYWdDbG9zZXN0KTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8oc3RhcnRfc2FtcGxlX2luZGV4KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKKworICAgICAgICAgICAgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8obVN5bmNTYW1wbGVzW2xlZnRdKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgdXBwZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworCisgICAgICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhtU3luY1NhbXBsZXNbbGVmdCAtIDFdKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgbG93ZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworCisgICAgICAgICAgICAvLyB1c2UgYWJzX2RpZmZlcmVuY2UgZm9yIHNhZmV0eQorICAgICAgICAgICAgaWYgKGFic19kaWZmZXJlbmNlKHVwcGVyX3RpbWUsIHNhbXBsZV90aW1lKSA+CisgICAgICAgICAgICAgICAgYWJzX2RpZmZlcmVuY2Uoc2FtcGxlX3RpbWUsIGxvd2VyX3RpbWUpKSB7CisgICAgICAgICAgICAgICAgLS1sZWZ0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9CiAKLSAgICAqc2FtcGxlX2luZGV4ID0geDsKLQorICAgICpzYW1wbGVfaW5kZXggPSBtU3luY1NhbXBsZXNbbGVmdF07CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC04MDcsNyArNzcyLDggQEAKICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAogICAgICAgICBzaXplX3QgKnNpemUsCiAgICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCi0gICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSkgeworICAgICAgICBib29sICppc1N5bmNTYW1wbGUsCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVEdXJhdGlvbikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBzdGF0dXNfdCBlcnI7CkBAIC04NDksNiArODE1LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAoc2FtcGxlRHVyYXRpb24pIHsKKyAgICAgICAgKnNhbXBsZUR1cmF0aW9uID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVEdXJhdGlvbigpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcAppbmRleCA0ZDE1ZDdlLi4xZGExZTVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcApAQCAtMzIsNyArMzIsNyBAQAogICAgICAgICBjdXQgPSAwOwogICAgIH0KIAotICAgIG1Gcm9udFBhZGRpbmcgPSBza2lwOworICAgIG1Gcm9udFBhZGRpbmcgPSBtU2tpcCA9IHNraXA7CiAgICAgbUJhY2tQYWRkaW5nID0gY3V0OwogICAgIG1Xcml0ZUhlYWQgPSAwOwogICAgIG1SZWFkSGVhZCA9IDA7CkBAIC0xMDEsNiArMTAxLDcgQEAKIAogdm9pZCBTa2lwQ3V0QnVmZmVyOjpjbGVhcigpIHsKICAgICBtV3JpdGVIZWFkID0gbVJlYWRIZWFkID0gMDsKKyAgICBtRnJvbnRQYWRkaW5nID0gbVNraXA7CiB9CiAKIHZvaWQgU2tpcEN1dEJ1ZmZlcjo6d3JpdGUoY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbnVtKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKaW5kZXggYWY4MTg2Yy4uNDQ0OWQ1NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcApAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oPgogCkBAIC0xMTcsNyArMTE4LDcgQEAKIH0KIAogTWVkaWFTY2FuUmVzdWx0IFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyOjpwcm9jZXNzRmlsZUludGVybmFsKAotICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptaW1lVHlwZSwKKyAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqIC8qIG1pbWVUeXBlICovLAogICAgICAgICBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCkgewogICAgIGNvbnN0IGNoYXIgKmV4dGVuc2lvbiA9IHN0cnJjaHIocGF0aCwgJy4nKTsKIApAQCAtMTQ3LDcgKzE0OCw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgLy8gY291bGRuJ3Qgb3BlbiBpdCBsb2NhbGx5LCBtYXliZSB0aGUgbWVkaWEgc2VydmVyIGNhbj8KLSAgICAgICAgc3RhdHVzID0gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShwYXRoKTsKKyAgICAgICAgc3RhdHVzID0gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBwYXRoKTsKICAgICB9IGVsc2UgewogICAgICAgICBzdGF0dXMgPSBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKGZkLCAwLCAweDdmZmZmZmZmZmZmZmZmZkwpOwogICAgICAgICBjbG9zZShmZCk7CkBAIC0yMDIsNyArMjAzLDcgQEAKICAgICByZXR1cm4gTUVESUFfU0NBTl9SRVNVTFRfT0s7CiB9CiAKLWNoYXIgKlN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyOjpleHRyYWN0QWxidW1BcnQoaW50IGZkKSB7CitNZWRpYUFsYnVtQXJ0ICpTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6ZXh0cmFjdEFsYnVtQXJ0KGludCBmZCkgewogICAgIEFMT0dWKCJleHRyYWN0QWxidW1BcnQgJWQiLCBmZCk7CiAKICAgICBvZmY2NF90IHNpemUgPSBsc2VlazY0KGZkLCAwLCBTRUVLX0VORCk7CkBAIC0yMTQsMTUgKzIxNSw5IEBACiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gbVJldHJpZXZlcihuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcik7CiAgICAgaWYgKG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UoZmQsIDAsIHNpemUpID09IE9LKSB7CiAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9IG1SZXRyaWV2ZXItPmV4dHJhY3RBbGJ1bUFydCgpOwotCiAgICAgICAgIGlmIChtZW0gIT0gTlVMTCkgewogICAgICAgICAgICAgTWVkaWFBbGJ1bUFydCAqYXJ0ID0gc3RhdGljX2Nhc3Q8TWVkaWFBbGJ1bUFydCAqPihtZW0tPnBvaW50ZXIoKSk7Ci0KLSAgICAgICAgICAgIGNoYXIgKmRhdGEgPSAoY2hhciAqKW1hbGxvYyhhcnQtPm1TaXplICsgNCk7Ci0gICAgICAgICAgICAqKGludDMyX3QgKilkYXRhID0gYXJ0LT5tU2l6ZTsKLSAgICAgICAgICAgIG1lbWNweSgmZGF0YVs0XSwgJmFydFsxXSwgYXJ0LT5tU2l6ZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgcmV0dXJuIGFydC0+Y2xvbmUoKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCAxOWFmNGZiLi4xMDFmYzhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMTYsMTAgKzE2LDE0IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgpAQCAtMjgsNiArMzIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTAsNyArNTUsOSBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmkpOwogCiAgICAgbVBhcnNlZE1ldGFEYXRhID0gZmFsc2U7CkBAIC01OCw3ICs2NSw3IEBACiAgICAgZGVsZXRlIG1BbGJ1bUFydDsKICAgICBtQWxidW1BcnQgPSBOVUxMOwogCi0gICAgbVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkodXJpLCBoZWFkZXJzKTsKKyAgICBtU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShodHRwU2VydmljZSwgdXJpLCBoZWFkZXJzKTsKIAogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UgZm9yICclcycuIiwgdXJpKTsKQEAgLTgzLDcgKzkwLDcgQEAKICAgICAgICAgaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKICAgICBmZCA9IGR1cChmZCk7CiAKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlIiBQUklkNjQgIiwgJSIgUFJJZDY0ICIpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKIAogICAgIG1QYXJzZWRNZXRhRGF0YSA9IGZhbHNlOwogICAgIG1NZXRhRGF0YS5jbGVhcigpOwpAQCAtMjM4LDcgKzI0NSw3IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOwogICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJ0aHVtYk5haWxUaW1lID0gJWxsZCB1cywgdGltZVVzID0gJWxsZCB1cywgbWltZSA9ICVzIiwKKyAgICAgICAgICAgIEFMT0dWKCJ0aHVtYk5haWxUaW1lID0gJSIgUFJJZDY0ICIgdXMsIHRpbWVVcyA9ICUiIFBSSWQ2NCAiIHVzLCBtaW1lID0gJXMiLAogICAgICAgICAgICAgICAgICB0aHVtYk5haWxUaW1lLCB0aW1lVXMsIG1pbWUpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzIxLDcgKzMyOCw3IEBACiBWaWRlb0ZyYW1lICpTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpnZXRGcmFtZUF0VGltZSgKICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pIHsKIAotICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogJWxsZCB1cyBvcHRpb246ICVkIiwgdGltZVVzLCBvcHRpb24pOworICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogJSIgUFJJZDY0ICIgdXMgb3B0aW9uOiAlZCIsIHRpbWVVcywgb3B0aW9uKTsKIAogICAgIGlmIChtRXh0cmFjdG9yLmdldCgpID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIm5vIGV4dHJhY3Rvci4iKTsKQEAgLTM3NCwxMCArMzgxLDcgQEAKICAgICBzaXplX3QgZGF0YVNpemU7CiAgICAgaWYgKGZpbGVNZXRhLT5maW5kRGF0YShrS2V5QWxidW1BcnQsICZ0eXBlLCAmZGF0YSwgJmRhdGFTaXplKQogICAgICAgICAgICAgJiYgbUFsYnVtQXJ0ID09IE5VTEwpIHsKLSAgICAgICAgbUFsYnVtQXJ0ID0gbmV3IE1lZGlhQWxidW1BcnQ7Ci0gICAgICAgIG1BbGJ1bUFydC0+bVNpemUgPSBkYXRhU2l6ZTsKLSAgICAgICAgbUFsYnVtQXJ0LT5tRGF0YSA9IG5ldyB1aW50OF90W2RhdGFTaXplXTsKLSAgICAgICAgbWVtY3B5KG1BbGJ1bUFydC0+bURhdGEsIGRhdGEsIGRhdGFTaXplKTsKKyAgICAgICAgbUFsYnVtQXJ0ID0gTWVkaWFBbGJ1bUFydDo6ZnJvbURhdGEoZGF0YVNpemUsIGRhdGEpOwogICAgIH0KIAogICAgIFZpZGVvRnJhbWUgKmZyYW1lID0KQEAgLTQxMCw3ICs0MTQsNyBAQAogICAgIH0KIAogICAgIGlmIChtQWxidW1BcnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUFsYnVtQXJ0KCptQWxidW1BcnQpOworICAgICAgICByZXR1cm4gbUFsYnVtQXJ0LT5jbG9uZSgpOwogICAgIH0KIAogICAgIHJldHVybiBOVUxMOwpAQCAtNDQ3LDQ4ICs0NTEsNzEgQEAKICAgICBzdHJ1Y3QgTWFwIHsKICAgICAgICAgaW50IGZyb207CiAgICAgICAgIGludCB0bzsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBNYXAga01hcFtdID0gewotICAgICAgICB7IGtLZXlNSU1FVHlwZSwgTUVUQURBVEFfS0VZX01JTUVUWVBFIH0sCi0gICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsIE1FVEFEQVRBX0tFWV9DRF9UUkFDS19OVU1CRVIgfSwKLSAgICAgICAgeyBrS2V5RGlzY051bWJlciwgTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSIH0sCi0gICAgICAgIHsga0tleUFsYnVtLCBNRVRBREFUQV9LRVlfQUxCVU0gfSwKLSAgICAgICAgeyBrS2V5QXJ0aXN0LCBNRVRBREFUQV9LRVlfQVJUSVNUIH0sCi0gICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCBNRVRBREFUQV9LRVlfQUxCVU1BUlRJU1QgfSwKLSAgICAgICAgeyBrS2V5QXV0aG9yLCBNRVRBREFUQV9LRVlfQVVUSE9SIH0sCi0gICAgICAgIHsga0tleUNvbXBvc2VyLCBNRVRBREFUQV9LRVlfQ09NUE9TRVIgfSwKLSAgICAgICAgeyBrS2V5RGF0ZSwgTUVUQURBVEFfS0VZX0RBVEUgfSwKLSAgICAgICAgeyBrS2V5R2VucmUsIE1FVEFEQVRBX0tFWV9HRU5SRSB9LAotICAgICAgICB7IGtLZXlUaXRsZSwgTUVUQURBVEFfS0VZX1RJVExFIH0sCi0gICAgICAgIHsga0tleVllYXIsIE1FVEFEQVRBX0tFWV9ZRUFSIH0sCi0gICAgICAgIHsga0tleVdyaXRlciwgTUVUQURBVEFfS0VZX1dSSVRFUiB9LAotICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgTUVUQURBVEFfS0VZX0NPTVBJTEFUSU9OIH0sCi0gICAgICAgIHsga0tleUxvY2F0aW9uLCBNRVRBREFUQV9LRVlfTE9DQVRJT04gfSwKKyAgICAgICAgeyBrS2V5TUlNRVR5cGUsIE1FVEFEQVRBX0tFWV9NSU1FVFlQRSwgTlVMTCB9LAorICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCBNRVRBREFUQV9LRVlfQ0RfVFJBQ0tfTlVNQkVSLCAidHJhY2tudW1iZXIiIH0sCisgICAgICAgIHsga0tleURpc2NOdW1iZXIsIE1FVEFEQVRBX0tFWV9ESVNDX05VTUJFUiwgImRpc2NudW1iZXIiIH0sCisgICAgICAgIHsga0tleUFsYnVtLCBNRVRBREFUQV9LRVlfQUxCVU0sICJhbGJ1bSIgfSwKKyAgICAgICAgeyBrS2V5QXJ0aXN0LCBNRVRBREFUQV9LRVlfQVJUSVNULCAiYXJ0aXN0IiB9LAorICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgTUVUQURBVEFfS0VZX0FMQlVNQVJUSVNULCAiYWxidW1hcnRpc3QiIH0sCisgICAgICAgIHsga0tleUF1dGhvciwgTUVUQURBVEFfS0VZX0FVVEhPUiwgTlVMTCB9LAorICAgICAgICB7IGtLZXlDb21wb3NlciwgTUVUQURBVEFfS0VZX0NPTVBPU0VSLCAiY29tcG9zZXIiIH0sCisgICAgICAgIHsga0tleURhdGUsIE1FVEFEQVRBX0tFWV9EQVRFLCBOVUxMIH0sCisgICAgICAgIHsga0tleUdlbnJlLCBNRVRBREFUQV9LRVlfR0VOUkUsICJnZW5yZSIgfSwKKyAgICAgICAgeyBrS2V5VGl0bGUsIE1FVEFEQVRBX0tFWV9USVRMRSwgInRpdGxlIiB9LAorICAgICAgICB7IGtLZXlZZWFyLCBNRVRBREFUQV9LRVlfWUVBUiwgInllYXIiIH0sCisgICAgICAgIHsga0tleVdyaXRlciwgTUVUQURBVEFfS0VZX1dSSVRFUiwgIndyaXRlciIgfSwKKyAgICAgICAgeyBrS2V5Q29tcGlsYXRpb24sIE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiwgImNvbXBpbGF0aW9uIiB9LAorICAgICAgICB7IGtLZXlMb2NhdGlvbiwgTUVUQURBVEFfS0VZX0xPQ0FUSU9OLCBOVUxMIH0sCiAgICAgfTsKKwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bU1hcEVudHJpZXMgPSBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7CiAKKyAgICBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yICpkZXRlY3RvciA9IG5ldyBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yKCk7CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1NYXBFbnRyaWVzOyArK2kpIHsKICAgICAgICAgY29uc3QgY2hhciAqdmFsdWU7CiAgICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrTWFwW2ldLmZyb20sICZ2YWx1ZSkpIHsKLSAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoa01hcFtpXS50bywgU3RyaW5nOCh2YWx1ZSkpOworICAgICAgICAgICAgaWYgKGtNYXBbaV0ubmFtZSkgeworICAgICAgICAgICAgICAgIC8vIGFkZCB0byBjaGFyc2V0IGRldGVjdG9yCisgICAgICAgICAgICAgICAgZGV0ZWN0b3ItPmFkZFRhZyhrTWFwW2ldLm5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgYWRkIHRvIG91dHB1dCBsaXN0CisgICAgICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChrTWFwW2ldLnRvLCBTdHJpbmc4KHZhbHVlKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBkZXRlY3Rvci0+ZGV0ZWN0QW5kQ29udmVydCgpOworICAgIGludCBzaXplID0gZGV0ZWN0b3ItPnNpemUoKTsKKyAgICBpZiAoc2l6ZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlOworICAgICAgICAgICAgZGV0ZWN0b3ItPmdldFRhZyhpLCAmbmFtZSwgJnZhbHVlKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga051bU1hcEVudHJpZXM7ICsraikgeworICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm5hbWUgJiYgIXN0cmNtcChrTWFwW2pdLm5hbWUsIG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoa01hcFtqXS50bywgU3RyaW5nOCh2YWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGUgZGV0ZWN0b3I7CisKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHVpbnQzMl90IHR5cGU7CiAgICAgc2l6ZV90IGRhdGFTaXplOwogICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5QWxidW1BcnQsICZ0eXBlLCAmZGF0YSwgJmRhdGFTaXplKQogICAgICAgICAgICAgJiYgbUFsYnVtQXJ0ID09IE5VTEwpIHsKLSAgICAgICAgbUFsYnVtQXJ0ID0gbmV3IE1lZGlhQWxidW1BcnQ7Ci0gICAgICAgIG1BbGJ1bUFydC0+bVNpemUgPSBkYXRhU2l6ZTsKLSAgICAgICAgbUFsYnVtQXJ0LT5tRGF0YSA9IG5ldyB1aW50OF90W2RhdGFTaXplXTsKLSAgICAgICAgbWVtY3B5KG1BbGJ1bUFydC0+bURhdGEsIGRhdGEsIGRhdGFTaXplKTsKKyAgICAgICAgbUFsYnVtQXJ0ID0gTWVkaWFBbGJ1bUFydDo6ZnJvbURhdGEoZGF0YVNpemUsIGRhdGEpOwogICAgIH0KIAogICAgIHNpemVfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwogCiAgICAgY2hhciB0bXBbMzJdOwotICAgIHNwcmludGYodG1wLCAiJWQiLCBudW1UcmFja3MpOworICAgIHNwcmludGYodG1wLCAiJXp1IiwgbnVtVHJhY2tzKTsKIAogICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX05VTV9UUkFDS1MsIFN0cmluZzgodG1wKSk7CiAKQEAgLTU0NSw3ICs1NzIsNyBAQAogICAgIH0KIAogICAgIC8vIFRoZSBkdXJhdGlvbiB2YWx1ZSBpcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGR1cmF0aW9uIGluIG1zLgotICAgIHNwcmludGYodG1wLCAiJWxsZCIsIChtYXhEdXJhdGlvblVzICsgNTAwKSAvIDEwMDApOworICAgIHNwcmludGYodG1wLCAiJSIgUFJJZDY0LCAobWF4RHVyYXRpb25VcyArIDUwMCkgLyAxMDAwKTsKICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9EVVJBVElPTiwgU3RyaW5nOCh0bXApKTsKIAogICAgIGlmIChoYXNBdWRpbykgewpAQCAtNTczLDcgKzYwMCw3IEBACiAgICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzb3VyY2VTaXplKSA9PSBPSykgewogICAgICAgICAgICAgaW50NjRfdCBhdmdCaXRSYXRlID0gKGludDY0X3QpKHNvdXJjZVNpemUgKiA4RTYgLyBtYXhEdXJhdGlvblVzKTsKIAotICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlbGxkIiwgYXZnQml0UmF0ZSk7CisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiUiIFBSSWQ2NCwgYXZnQml0UmF0ZSk7CiAgICAgICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9CSVRSQVRFLCBTdHJpbmc4KHRtcCkpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAKaW5kZXggNmI5MzRkNC4uNGUxYzY1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwCkBAIC0xNiw2ICsxNiw4IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlN1cmZhY2VNZWRpYVNvdXJjZSIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpAQCAtNTQsOSArNTYsOSBAQAogICAgICAgICBBTE9HRSgiSW52YWxpZCBkaW1lbnNpb25zICVkeCVkIiwgYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CiAgICAgfQogCi0gICAgbUJ1ZmZlclF1ZXVlID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgbUJ1ZmZlclF1ZXVlLT5zZXREZWZhdWx0QnVmZmVyU2l6ZShidWZmZXJXaWR0aCwgYnVmZmVySGVpZ2h0KTsKLSAgICBtQnVmZmVyUXVldWUtPnNldENvbnN1bWVyVXNhZ2VCaXRzKEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiB8CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZtQ29uc3VtZXIpOworICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIgfAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKTsKIAogICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IGNvbXBvc2VyKENvbXBvc2VyU2VydmljZTo6Z2V0Q29tcG9zZXJTZXJ2aWNlKCkpOwpAQCAtNjgsNyArNzAsNyBAQAogICAgIHdwPENvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8Q29uc3VtZXJMaXN0ZW5lcio+KHRoaXMpOwogICAgIHNwPEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXI+IHByb3h5ID0gbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIobGlzdGVuZXIpOwogCi0gICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmNvbnN1bWVyQ29ubmVjdChwcm94eSwgZmFsc2UpOwogICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIlN1cmZhY2VNZWRpYVNvdXJjZTogZXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CkBAIC05OSwxMyArMTAxLDE2IEBACiAgICAgZHVtcChyZXN1bHQsICIiLCBidWZmZXIsIDEwMjQpOwogfQogCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZTo6ZHVtcChTdHJpbmc4JiByZXN1bHQsIGNvbnN0IGNoYXIqIHByZWZpeCwKLSAgICAgICAgY2hhciogYnVmZmVyLCBzaXplX3QgU0laRSkgY29uc3QKK3ZvaWQgU3VyZmFjZU1lZGlhU291cmNlOjpkdW1wKAorICAgICAgICBTdHJpbmc4JiByZXN1bHQsCisgICAgICAgIGNvbnN0IGNoYXIqIC8qIHByZWZpeCAqLywKKyAgICAgICAgY2hhciogYnVmZmVyLAorICAgICAgICBzaXplX3QgLyogU0laRSAqLykgY29uc3QKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIG1CdWZmZXJRdWV1ZS0+ZHVtcChyZXN1bHQsICIiKTsKKyAgICBtQ29uc3VtZXItPmR1bXAocmVzdWx0LCAiIik7CiB9CiAKIHN0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6c2V0RnJhbWVSYXRlKGludDMyX3QgZnBzKQpAQCAtMTYzLDcgKzE2OCw3IEBACiAgICAgQ0hFQ0tfR1QobU1heEFjcXVpcmVkQnVmZmVyQ291bnQsIDEpOwogCiAgICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgbUJ1ZmZlclF1ZXVlLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KG1NYXhBY3F1aXJlZEJ1ZmZlckNvdW50KTsKKyAgICAgICAgbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KG1NYXhBY3F1aXJlZEJ1ZmZlckNvdW50KTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTE3Niw3ICsxODEsNyBAQAogfQogCiBzdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoc2l6ZV90IGNvdW50KSB7Ci0gICAgQUxPR1YoInNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoJWQpIiwgY291bnQpOworICAgIEFMT0dWKCJzZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KCV6dSkiLCBjb3VudCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIAogICAgIENIRUNLX0dUKGNvdW50LCAxKTsKQEAgLTIwMiw4ICsyMDcsMTEgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOworCiAgICAgd2hpbGUgKG1OdW1QZW5kaW5nQnVmZmVycyA+IDApIHsKLSAgICAgICAgQUxPR0koIlN0aWxsIHdhaXRpbmcgZm9yICVkIGJ1ZmZlcnMgdG8gYmUgcmV0dXJuZWQuIiwKKyAgICAgICAgQUxPR0koIlN0aWxsIHdhaXRpbmcgZm9yICV6dSBidWZmZXJzIHRvIGJlIHJldHVybmVkLiIsCiAgICAgICAgICAgICAgICAgbU51bVBlbmRpbmdCdWZmZXJzKTsKIAogI2lmIERFQlVHX1BFTkRJTkdfQlVGRkVSUwpAQCAtMjE1LDExICsyMjMsOSBAQAogICAgICAgICBtTWVkaWFCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKICAgICB9CiAKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKICAgICBtTWVkaWFCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogCi0gICAgcmV0dXJuIG1CdWZmZXJRdWV1ZS0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CisgICAgcmV0dXJuIG1Db25zdW1lci0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CiB9CiAKIHNwPE1ldGFEYXRhPiBTdXJmYWNlTWVkaWFTb3VyY2U6OmdldEZvcm1hdCgpCkBAIC0yNjUsMTMgKzI3MSwxMiBAQAogICAgIG1lbWNweShkYXRhLCAmdHlwZSwgNCk7CiAgICAgbWVtY3B5KGRhdGEgKyA0LCAmYnVmZmVySGFuZGxlLCBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7CiAKLSAgICBBTE9HVigiaGFuZGxlID0gJXAsICwgb2Zmc2V0ID0gJWQsIGxlbmd0aCA9ICVkIiwKKyAgICBBTE9HVigiaGFuZGxlID0gJXAsICwgb2Zmc2V0ID0gJXp1LCBsZW5ndGggPSAlenUiLAogICAgICAgICAgICAgYnVmZmVySGFuZGxlLCAoKmJ1ZmZlciktPnJhbmdlX2xlbmd0aCgpLCAoKmJ1ZmZlciktPnJhbmdlX29mZnNldCgpKTsKIH0KIAotc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpyZWFkKCBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKQoteworc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKiAvKiBvcHRpb25zICovKSB7CiAgICAgQUxPR1YoInJlYWQiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCkBAIC0yOTAsNyArMjk1LDcgQEAKICAgICAvLyB3YWl0IGhlcmUgdGlsbCB0aGUgZnJhbWVzIGNvbWUgaW4gZnJvbSB0aGUgY2xpZW50IHNpZGUKICAgICB3aGlsZSAobVN0YXJ0ZWQpIHsKIAotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyUXVldWUtPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOwogICAgICAgICBpZiAoZXJyID09IEJ1ZmZlclF1ZXVlOjpOT19CVUZGRVJfQVZBSUxBQkxFKSB7CiAgICAgICAgICAgICAvLyB3YWl0IGZvciBhIGJ1ZmZlciB0byBiZSBxdWV1ZWQKICAgICAgICAgICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi53YWl0KG1NdXRleCk7CkBAIC0zMTMsNyArMzE4LDcgQEAKICAgICAgICAgICAgICAgICBpZiAobVN0YXJ0VGltZU5zID4gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5tVGltZXN0YW1wIDwgbVN0YXJ0VGltZU5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZyYW1lIHByZWRhdGVzIHN0YXJ0IG9mIHJlY29yZCwgZGlzY2FyZAotICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLCBFR0xfTk9fRElTUExBWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX05PX1NZTkNfS0hSLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0zNjAsNyArMzY1LDcgQEAKICAgICAoKmJ1ZmZlciktPnNldE9ic2VydmVyKHRoaXMpOwogICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOwogICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVzdGFtcCAvIDEwMDApOwotICAgIEFMT0dWKCJGcmFtZXMgZW5jb2RlZCA9ICVkLCB0aW1lc3RhbXAgPSAlbGxkLCB0aW1lIGRpZmYgPSAlbGxkIiwKKyAgICBBTE9HVigiRnJhbWVzIGVuY29kZWQgPSAlZCwgdGltZXN0YW1wID0gJSIgUFJJZDY0ICIsIHRpbWUgZGlmZiA9ICUiIFBSSWQ2NCwKICAgICAgICAgICAgIG1OdW1GcmFtZXNFbmNvZGVkLCBtQ3VycmVudFRpbWVzdGFtcCAvIDEwMDAsCiAgICAgICAgICAgICBtQ3VycmVudFRpbWVzdGFtcCAvIDEwMDAgLSBwcmV2VGltZVN0YW1wIC8gMTAwMCk7CiAKQEAgLTQxMyw3ICs0MTgsNyBAQAogICAgICAgICAgICAgQUxPR1YoIlNsb3QgJWQgcmV0dXJuZWQsIG1hdGNoZXMgaGFuZGxlID0gJXAiLCBpZCwKICAgICAgICAgICAgICAgICAgICAgbVNsb3RzW2lkXS5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKIAotICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKGlkLCBtU2xvdHNbaWRdLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpZCwgbVNsb3RzW2lkXS5tRnJhbWVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwKICAgICAgICAgICAgICAgICAgICAgRmVuY2U6Ok5PX0ZFTkNFKTsKIApAQCAtNDc0LDQgKzQ3OSw4IEBACiAgICAgfQogfQogCit2b2lkIFN1cmZhY2VNZWRpYVNvdXJjZTo6b25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSB7CisgICAgQUxPR19BU1NFUlQoZmFsc2UsICJTdXJmYWNlTWVkaWFTb3VyY2UgY2FuJ3QgY29uc3VtZSBzaWRlYmFuZCBzdHJlYW1zIik7Cit9CisKIH0gLy8gZW5kIG9mIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcAppbmRleCAwYWZhYzY5Li4xZmRiMjQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAKQEAgLTE3LDcgKzE3LDExIEBACiAjdW5kZWYgX19TVFJJQ1RfQU5TSV9fCiAjZGVmaW5lIF9fU1RESU5UX0xJTUlUUwogI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVGltZWRFdmVudFF1ZXVlIgpAQCAtMjYsOSArMzAsNiBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9UaW1lZEV2ZW50UXVldWUuaCIKIAotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KQEAgLTI1OCw3ICsyNTksNyBAQAogICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQ2NF90IGtNYXhUaW1lb3V0VXMgPSAxMDAwMDAwMGxsOyAgLy8gMTAgc2VjcwogICAgICAgICAgICAgICAgIGJvb2wgdGltZW91dENhcHBlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGlmIChkZWxheV91cyA+IGtNYXhUaW1lb3V0VXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImRlbGF5X3VzIGV4Y2VlZHMgbWF4IHRpbWVvdXQ6ICVsbGQgdXMiLCBkZWxheV91cyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJkZWxheV91cyBleGNlZWRzIG1heCB0aW1lb3V0OiAlIiBQUklkNjQgIiB1cyIsIGRlbGF5X3VzKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBXZSdsbCBuZXZlciBibG9jayBmb3IgbW9yZSB0aGFuIDEwIHNlY3MsIGluc3RlYWQKICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBzcGxpdCB1cCB0aGUgZnVsbCB0aW1lb3V0IGludG8gY2h1bmtzIG9mCkBAIC0zMzcsNyArMzM4LDcgQEAKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPmFjcXVpcmVXYWtlTG9jayhQT1dFUk1BTkFHRVJfUEFSVElBTF9XQUtFX0xPQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJUaW1lZEV2ZW50UXVldWUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigibWVkaWEiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIm1lZGlhIikpOyAgICAvLyBub3Qgb25ld2F5CiAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBtV2FrZUxvY2tUb2tlbiA9IGJpbmRlcjsKQEAgLTM2Miw3ICszNjMsNyBAQAogICAgICAgICBDSEVDSyhtV2FrZUxvY2tUb2tlbiAhPSAwKTsKICAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gMCkgewogICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLT5yZWxlYXNlV2FrZUxvY2sobVdha2VMb2NrVG9rZW4sIDApOworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwKTsgIC8vIG5vdCBvbmV3YXkKICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogICAgICAgICB9CiAgICAgICAgIG1XYWtlTG9ja1Rva2VuLmNsZWFyKCk7CkBAIC0zNzYsOCArMzc3LDggQEAKICAgICBtUG93ZXJNYW5hZ2VyLmNsZWFyKCk7CiB9CiAKLXZvaWQgVGltZWRFdmVudFF1ZXVlOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pCi17Cit2b2lkIFRpbWVkRXZlbnRRdWV1ZTo6UE1EZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZCgKKyAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4mIC8qIHdobyAqLykgewogICAgIG1RdWV1ZS0+Y2xlYXJQb3dlck1hbmFnZXIoKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCmluZGV4IDA5MGM4OTEuLjIxNGUyZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKQEAgLTE3LDExICsxNywxMyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJVdGlscyIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0xMDAsNiArMTAyLDExIEBACiAgICAgICAgIG1zZy0+c2V0SW50NjQoImR1cmF0aW9uVXMiLCBkdXJhdGlvblVzKTsKICAgICB9CiAKKyAgICBpbnQgYXZnQml0UmF0ZTsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYXZnQml0UmF0ZSkpIHsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiYml0LXJhdGUiLCBhdmdCaXRSYXRlKTsKKyAgICB9CisKICAgICBpbnQzMl90IGlzU3luYzsKICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmlzU3luYykgJiYgaXNTeW5jICE9IDApIHsKICAgICAgICAgbXNnLT5zZXRJbnQzMigiaXMtc3luYy1mcmFtZSIsIDEpOwpAQCAtMTE5LDYgKzEyNiwyNSBAQAogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigic2FyLXdpZHRoIiwgc2FyV2lkdGgpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigic2FyLWhlaWdodCIsIHNhckhlaWdodCk7CiAgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGNvbG9yRm9ybWF0OworICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJmNvbG9yRm9ybWF0KSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgY29sb3JGb3JtYXQpOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOworICAgICAgICBpZiAobWV0YS0+ZmluZFJlY3Qoa0tleUNyb3BSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcFJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BCb3R0b20pKSB7CisgICAgICAgICAgICBtc2ctPnNldFJlY3QoImNyb3AiLCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCByb3RhdGlvbkRlZ3JlZXMpOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpKTsKQEAgLTE0NSw2ICsxNzEsMTEgQEAKICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SXNBRFRTLCAmaXNBRFRTKSkgewogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiaXMtYWR0cyIsIHRydWUpOwogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlID0gLTE7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUFBQ0FPVCwgJmFhY1Byb2ZpbGUpKSB7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJhYWMtcHJvZmlsZSIsIGFhY1Byb2ZpbGUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaW50MzJfdCBtYXhJbnB1dFNpemU7CkBAIC0xNTIsNiArMTgzLDExIEBACiAgICAgICAgIG1zZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgbWF4SW5wdXRTaXplKTsKICAgICB9CiAKKyAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigicm90YXRpb24tZGVncmVlcyIsIHJvdGF0aW9uRGVncmVlcyk7CisgICAgfQorCiAgICAgdWludDMyX3QgdHlwZTsKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplOwpAQCAtMjU0LDYgKzI5MCw3MCBAQAogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTEiLCBidWZmZXIpOworICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgICAgICBpZiAoc2l6ZSA8IDIzIHx8IHB0clswXSAhPSAxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgICAgICBBTE9HRSgiYi8yMzY4MDc4MCIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IHByb2ZpbGUgPSBwdHJbMV0gJiAzMTsKKyAgICAgICAgdWludDhfdCBsZXZlbCA9IHB0clsxMl07CisgICAgICAgIHB0ciArPSAyMjsKKyAgICAgICAgc2l6ZSAtPSAyMjsKKworCisgICAgICAgIHNpemVfdCBudW1vZkFycmF5cyA9IChjaGFyKXB0clswXTsKKyAgICAgICAgcHRyICs9IDE7CisgICAgICAgIHNpemUgLT0gMTsKKyAgICAgICAgc2l6ZV90IGogPSAwLCBpID0gMDsKKworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcigxMDI0KTsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtb2ZBcnJheXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHNpemUgPCAzKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjM2ODA3ODAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBzaXplIC09IDE7CisKKyAgICAgICAgICAgIC8vTnVtIG9mIG5hbHMKKyAgICAgICAgICAgIHNpemVfdCBudW1vZk5hbHMgPSBVMTZfQVQocHRyKTsKKworICAgICAgICAgICAgcHRyICs9IDI7CisgICAgICAgICAgICBzaXplIC09IDI7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1vZk5hbHM7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzY4MDc4MCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoID0gVTE2X0FUKHB0cik7CisKKyAgICAgICAgICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgICAgICAgICBzaXplIC09IDI7CisKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IGxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb3B5TkFMVVRvQUJ1ZmZlcigmYnVmZmVyLCBwdHIsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB0ciArPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2l6ZSAtPSBsZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKKwogICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwogICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwpAQCAtMjk4LDYgKzM5OCwxNiBAQAogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTEiLCBidWZmZXIpOworICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleU9wdXNIZWFkZXIsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworCisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CiAgICAgfQogCiAgICAgKmZvcm1hdCA9IG1zZzsKQEAgLTMyNCw3ICs0MzQsNyBAQAogICAgICAgICAgICAgICAgIC8vIHRoZXJlIGNhbid0IGJlIGFub3RoZXIgcGFyYW0gaGVyZSwgc28gdXNlIGFsbCB0aGUgcmVzdAogICAgICAgICAgICAgICAgIGkgPSBjc2QwLT5zaXplKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiYmxvY2sgYXQgJWQsIGxhc3Qgd2FzICVkIiwgaSwgbGFzdHBhcmFtb2Zmc2V0KTsKKyAgICAgICAgICAgIEFMT0dWKCJibG9jayBhdCAlenUsIGxhc3Qgd2FzICVkIiwgaSwgbGFzdHBhcmFtb2Zmc2V0KTsKICAgICAgICAgICAgIGlmIChsYXN0cGFyYW1vZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBpIC0gbGFzdHBhcmFtb2Zmc2V0OwogICAgICAgICAgICAgICAgIGF2Y2NbYXZjY2lkeCsrXSA9IHNpemUgPj4gODsKQEAgLTM1NSw3ICs0NjUsNyBAQAogICAgICAgICAgICAgICAgIC8vIHRoZXJlIGNhbid0IGJlIGFub3RoZXIgcGFyYW0gaGVyZSwgc28gdXNlIGFsbCB0aGUgcmVzdAogICAgICAgICAgICAgICAgIGkgPSBjc2QxLT5zaXplKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiYmxvY2sgYXQgJWQsIGxhc3Qgd2FzICVkIiwgaSwgbGFzdHBhcmFtb2Zmc2V0KTsKKyAgICAgICAgICAgIEFMT0dWKCJibG9jayBhdCAlenUsIGxhc3Qgd2FzICVkIiwgaSwgbGFzdHBhcmFtb2Zmc2V0KTsKICAgICAgICAgICAgIGlmIChsYXN0cGFyYW1vZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBpIC0gbGFzdHBhcmFtb2Zmc2V0OwogICAgICAgICAgICAgICAgIGF2Y2NbYXZjY2lkeCsrXSA9IHNpemUgPj4gODsKQEAgLTQ0OCw2ICs1NTgsMjUgQEAKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTQVJXaWR0aCwgc2FyV2lkdGgpOwogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNBUkhlaWdodCwgc2FySGVpZ2h0KTsKICAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgY29sb3JGb3JtYXQ7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207CisgICAgICAgIGlmIChtc2ctPmZpbmRSZWN0KCJjcm9wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcFRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BCb3R0b20pKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRSZWN0KGtLZXlDcm9wUmVjdCwgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgcm90YXRpb25EZWdyZWVzKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpKSB7CkBAIC00OTksNiArNjI4LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQzMl90IHRpbWVTY2FsZTsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoInRpbWUtc2NhbGUiLCAmdGltZVNjYWxlKSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCB0aW1lU2NhbGUpOworICAgIH0KKwogICAgIC8vIFhYWCBUT0RPIGFkZCB3aGF0ZXZlciBvdGhlciBrZXlzIHRoZXJlIGFyZQogCiAjaWYgMApAQCAtNTcwLDYgKzcwNCw3IEBACiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICAgICAgQVVESU9fRk9STUFUX0FNUl9XQiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUMgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgICAgICBBVURJT19GT1JNQVRfVk9SQklTIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAgICAgICAgQVVESU9fRk9STUFUX09QVVN9LAogICAgIHsgMCwgQVVESU9fRk9STUFUX0lOVkFMSUQgfQogfTsKIApAQCAtNTg3LDEwICs3MjIsNDYgQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCitzdHJ1Y3QgYWFjX2Zvcm1hdF9jb252X3QgeworICAgIE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSBlQWFjUHJvZmlsZVR5cGU7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhYWNfZm9ybWF0X2NvbnZfdCBwcm9maWxlTG9va3VwW10gPSB7CisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TWFpbiwgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTUFJTn0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TEMsICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTEN9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdFNTUiwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1NTUn0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TFRQLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTFRQfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RIRSwgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMX0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0U2NhbGFibGUsICAgIEFVRElPX0ZPUk1BVF9BQUNfU0NBTEFCTEV9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdEVSTEMsICAgICAgICBBVURJT19GT1JNQVRfQUFDX0VSTEN9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdExELCAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xEfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RIRV9QUywgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMn0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0RUxELCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfRUxEfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3ROdWxsLCAgICAgICAgQVVESU9fRk9STUFUX0FBQ30sCit9OworCit2b2lkIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KCBhdWRpb19mb3JtYXRfdCYgZm9ybWF0LCB1aW50NjRfdCBlQWFjUHJvZmlsZSkKK3sKK2NvbnN0IHN0cnVjdCBhYWNfZm9ybWF0X2NvbnZfdCogcCA9ICZwcm9maWxlTG9va3VwWzBdOworICAgIHdoaWxlIChwLT5lQWFjUHJvZmlsZVR5cGUgIT0gT01YX0FVRElPX0FBQ09iamVjdE51bGwpIHsKKyAgICAgICAgaWYgKGVBYWNQcm9maWxlID09IHAtPmVBYWNQcm9maWxlVHlwZSkgeworICAgICAgICAgICAgZm9ybWF0ID0gcC0+Zm9ybWF0OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICsrcDsKKyAgICB9CisgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX0FBQzsKKyAgICByZXR1cm47Cit9CisKIGJvb2wgY2FuT2ZmbG9hZFN0cmVhbShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQogewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAogICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOwpAQCAtNjA5LDE1ICs3ODAsMTEgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8vIGNoZWNrIHdoZXRoZXIgaXQgaXMgRUxEL0xEIGNvbnRlbnQgLT4gbm8gb2ZmbG9hZGluZwotICAgIC8vIEZJWE1FOiB0aGlzIHNob3VsZCBkZXBlbmQgb24gYXVkaW8gRFNQIGNhcGFiaWxpdGllcy4gbWFwTWltZVRvQXVkaW9Gb3JtYXQoKSBzaG91bGQgdXNlIHRoZQotICAgIC8vIG1ldGFkYXRhIHRvIHJlZmluZSB0aGUgQUFDIGZvcm1hdCBhbmQgdGhlIGF1ZGlvIEhBTCBzaG91bGQgb25seSBsaXN0IHN1cHBvcnRlZCBwcm9maWxlcy4KKyAgICAvLyBSZWRlZmluZSBhYWMgZm9ybWF0IGFjY29yZGluZyB0byBpdHMgcHJvZmlsZQorICAgIC8vIE9mZmxvYWRpbmcgZGVwZW5kcyBvbiBhdWRpbyBEU1AgY2FwYWJpbGl0aWVzLgogICAgIGludDMyX3QgYWFjYW90ID0gLTE7CiAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5QUFDQU9ULCAmYWFjYW90KSkgewotICAgICAgICBpZiAoYWFjYW90ID09IDIzIHx8IGFhY2FvdCA9PSAzOSApIHsKLSAgICAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgaXMgRUxEL0xEIGNvbnRlbnQiLCBtaW1lKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChpbmZvLmZvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOwogICAgIH0KIAogICAgIGludDMyX3Qgc3JhdGUgPSAtMTsKQEAgLTY2Miw1ICs4MjksNDAgQEAKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKIH0KIAorQVN0cmluZyB1cmlEZWJ1Z1N0cmluZyhjb25zdCBBU3RyaW5nICZ1cmksIGJvb2wgaW5jb2duaXRvKSB7CisgICAgaWYgKGluY29nbml0bykgeworICAgICAgICByZXR1cm4gQVN0cmluZygiPFVSSSBzdXBwcmVzc2VkPiIpOworICAgIH0KKworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LmxvZy11cmkiLCBwcm9wLCAiZmFsc2UiKSAmJgorICAgICAgICAoIXN0cmNtcChwcm9wLCAiMSIpIHx8ICFzdHJjbXAocHJvcCwgInRydWUiKSkpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisKKyAgICAvLyBmaW5kIHNjaGVtZQorICAgIEFTdHJpbmcgc2NoZW1lOworICAgIGNvbnN0IGNoYXIgKmNoYXJzID0gdXJpLmNfc3RyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB1cmkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciBjID0gY2hhcnNbaV07CisgICAgICAgIGlmICghaXNhc2NpaShjKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoaXNhbHBoYShjKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAvLyBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBhIGxldHRlcgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoaXNkaWdpdChjKSB8fCBjID09ICcrJyB8fCBjID09ICcuJyB8fCBjID09Jy0nKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjICE9ICc6JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2NoZW1lID0gQVN0cmluZyh1cmksIDAsIGkpOworICAgICAgICBzY2hlbWUuYXBwZW5kKCI6Ly88c3VwcHJlc3NlZD4iKTsKKyAgICAgICAgcmV0dXJuIHNjaGVtZTsKKyAgICB9CisgICAgcmV0dXJuIEFTdHJpbmcoIjxuby1zY2hlbWUgVVJJIHN1cHByZXNzZWQ+Iik7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKaW5kZXggYTI0NWYyYy4uZTk4OGY2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKQEAgLTE2LDYgKzE2LDkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJWQlJJU2Vla2VyIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9WQlJJU2Vla2VyLmgiCkBAIC03NSw3ICs3OCw3IEBACiAgICAgc2l6ZV90IGVudHJ5U2l6ZSA9IFUxNl9BVCgmdmJyaUhlYWRlclsyMl0pOwogICAgIHNpemVfdCBzY2FsZSA9IFUxNl9BVCgmdmJyaUhlYWRlclsyMF0pOwogCi0gICAgQUxPR1YoIiVkIGVudHJpZXMsIHNjYWxlPSVkLCBzaXplX3Blcl9lbnRyeT0lZCIsCisgICAgQUxPR1YoIiV6dSBlbnRyaWVzLCBzY2FsZT0lenUsIHNpemVfcGVyX2VudHJ5PSV6dSIsCiAgICAgICAgICBudW1FbnRyaWVzLAogICAgICAgICAgc2NhbGUsCiAgICAgICAgICBlbnRyeVNpemUpOwpAQCAtMTE5LDcgKzEyMiw3IEBACiAKICAgICAgICAgc2Vla2VyLT5tU2VnbWVudHMucHVzaChudW1CeXRlcyk7CiAKLSAgICAgICAgQUxPR1YoImVudHJ5ICMlZDogJWQgb2Zmc2V0IDB4JTA4bHgiLCBpLCBudW1CeXRlcywgb2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoImVudHJ5ICMlenU6ICV1IG9mZnNldCAweCUwMTZsbHgiLCBpLCBudW1CeXRlcywgb2Zmc2V0KTsKICAgICAgICAgb2Zmc2V0ICs9IG51bUJ5dGVzOwogICAgIH0KIApAQCAtMTYwLDcgKzE2Myw3IEBACiAgICAgICAgICpwb3MgKz0gbVNlZ21lbnRzLml0ZW1BdChzZWdtZW50SW5kZXgrKyk7CiAgICAgfQogCi0gICAgQUxPR1YoImdldE9mZnNldEZvclRpbWUgJWxsZCB1cyA9PiAweCUwOGx4IiwgKnRpbWVVcywgKnBvcyk7CisgICAgQUxPR1YoImdldE9mZnNldEZvclRpbWUgJSIgUFJJZDY0ICIgdXMgPT4gMHglMDE2bGx4IiwgKnRpbWVVcywgKnBvcyk7CiAKICAgICAqdGltZVVzID0gbm93VXM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9XQVZFeHRyYWN0b3IuY3BwCmluZGV4IDIyYWY2ZmIuLmE0YTY1MWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcApAQCAtMTI3LDcgKzEyNyw3IEBACiB9CiAKIHNwPE1ldGFEYXRhPiBXQVZFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0zNTgsNyArMzU4LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworc3RhdHVzX3QgV0FWU291cmNlOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIEFMT0dWKCJXQVZTb3VyY2U6OnN0YXJ0Iik7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwpAQCAtNDE0LDcgKzQxNCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwb3MgPSAoc2Vla1RpbWVVcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDAwMDAgKiBtTnVtQ2hhbm5lbHMgKiAobUJpdHNQZXJTYW1wbGUgPj4gMyk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBvcyA+IG1TaXplKSB7CisgICAgICAgIGlmIChwb3MgPiAob2ZmNjRfdCltU2l6ZSkgewogICAgICAgICAgICAgcG9zID0gbVNpemU7CiAgICAgICAgIH0KICAgICAgICAgbUN1cnJlbnRQb3MgPSBwb3MgKyBtT2Zmc2V0OwpAQCAtNDM5LDYgKzQzOSwxMCBAQAogICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IG1heEJ5dGVzQXZhaWxhYmxlOwogICAgIH0KIAorICAgIC8vIHJlYWQgb25seSBpbnRlZ3JhbCBhbW91bnRzIG9mIGF1ZGlvIHVuaXQgZnJhbWVzLgorICAgIGNvbnN0IHNpemVfdCBpbnB1dFVuaXRGcmFtZVNpemUgPSBtTnVtQ2hhbm5lbHMgKiBtQml0c1BlclNhbXBsZSAvIDg7CisgICAgbWF4Qnl0ZXNUb1JlYWQgLT0gbWF4Qnl0ZXNUb1JlYWQgJSBpbnB1dFVuaXRGcmFtZVNpemU7CisKICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfTVNHU00pIHsKICAgICAgICAgLy8gTWljcm9zb2Z0IHBhY2tzIDIgZnJhbWVzIGludG8gNjUgYnl0ZXMsIHJhdGhlciB0aGFuIHVzaW5nIHNlcGFyYXRlIDMzLWJ5dGUgZnJhbWVzLAogICAgICAgICAvLyBzbyByZWFkIG11bHRpcGxlcyBvZiA2NSwgYW5kIHVzZSBzbWFsbGVyIGJ1ZmZlcnMgdG8gYWNjb3VudCBmb3IgfjEwOjEgZXhwYW5zaW9uIHJhdGlvCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcAppbmRleCBiODIyODY4Li4zOGExZjZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKQEAgLTQwLDYgKzQwLDI1IEBACiAgICAgcmV0dXJuIHggKyAoMXUgPDwgbnVtWmVyb2VzKSAtIDE7CiB9CiAKK3NpZ25lZCBwYXJzZVNFKEFCaXRSZWFkZXIgKmJyKSB7CisgICAgdW5zaWduZWQgY29kZU51bSA9IHBhcnNlVUUoYnIpOworCisgICAgcmV0dXJuIChjb2RlTnVtICYgMSkgPyAoY29kZU51bSArIDEpIC8gMiA6IC0oY29kZU51bSAvIDIpOworfQorCitzdGF0aWMgdm9pZCBza2lwU2NhbGluZ0xpc3QoQUJpdFJlYWRlciAqYnIsIHNpemVfdCBzaXplT2ZTY2FsaW5nTGlzdCkgeworICAgIHNpemVfdCBsYXN0U2NhbGUgPSA4OworICAgIHNpemVfdCBuZXh0U2NhbGUgPSA4OworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZU9mU2NhbGluZ0xpc3Q7ICsraikgeworICAgICAgICBpZiAobmV4dFNjYWxlICE9IDApIHsKKyAgICAgICAgICAgIHNpZ25lZCBkZWx0YV9zY2FsZSA9IHBhcnNlU0UoYnIpOworICAgICAgICAgICAgbmV4dFNjYWxlID0gKGxhc3RTY2FsZSArIGRlbHRhX3NjYWxlICsgMjU2KSAlIDI1NjsKKyAgICAgICAgfQorCisgICAgICAgIGxhc3RTY2FsZSA9IChuZXh0U2NhbGUgPT0gMCkgPyBsYXN0U2NhbGUgOiBuZXh0U2NhbGU7CisgICAgfQorfQorCiAvLyBEZXRlcm1pbmUgdmlkZW8gZGltZW5zaW9ucyBmcm9tIHRoZSBzZXF1ZW5jZSBwYXJhbWV0ZXJzZXQuCiB2b2lkIEZpbmRBVkNEaW1lbnNpb25zKAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc2VxUGFyYW1TZXQsCkBAIC02Myw3ICs4MiwyNCBAQAogICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBiaXRfZGVwdGhfbHVtYV9taW51czgKICAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gYml0X2RlcHRoX2Nocm9tYV9taW51czgKICAgICAgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyBxcHByaW1lX3lfemVyb190cmFuc2Zvcm1fYnlwYXNzX2ZsYWcKLSAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMHUpOyAgLy8gc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZworCisgICAgICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBzZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBzZXFfc2NhbGluZ19saXN0X3ByZXNlbnRfZmxhZ1tpXQorCisgICAgICAgICAgICAgICAgICAgIC8vIFdBUk5JTkc6IHRoZSBjb2RlIGJlbG93IGhhcyBub3QgZXZlciBiZWVuIGV4ZXJjaXNlZC4uLgorICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIGEgcmVhbC13b3JsZCBleGFtcGxlLgorCisgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgNikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGluZ0xpc3Q0eDRbaV0sMTYsLi4uCisgICAgICAgICAgICAgICAgICAgICAgICBza2lwU2NhbGluZ0xpc3QoJmJyLCAxNik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTY2FsaW5nTGlzdDh4OFtpLTZdLDY0LC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFNjYWxpbmdMaXN0KCZiciwgNjQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcGFyc2VVRSgmYnIpOyAgLy8gbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNApAQCAtMjUxLDkgKzI4Nyw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0aWMgc3A8QUJ1ZmZlcj4gRmluZE5BTCgKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIG5hbFR5cGUsCi0gICAgICAgIHNpemVfdCAqc3RvcE9mZnNldCkgeworc3RhdGljIHNwPEFCdWZmZXI+IEZpbmROQUwoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIG5hbFR5cGUpIHsKICAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKICAgICBzaXplX3QgbmFsU2l6ZTsKICAgICB3aGlsZSAoZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzaXplLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSA9PSBPSykgewpAQCAtMjkzLDcgKzMyNyw3IEBACiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGFjY2Vzc1VuaXQtPmRhdGEoKTsKICAgICBzaXplX3Qgc2l6ZSA9IGFjY2Vzc1VuaXQtPnNpemUoKTsKIAotICAgIHNwPEFCdWZmZXI+IHNlcVBhcmFtU2V0ID0gRmluZE5BTChkYXRhLCBzaXplLCA3LCBOVUxMKTsKKyAgICBzcDxBQnVmZmVyPiBzZXFQYXJhbVNldCA9IEZpbmROQUwoZGF0YSwgc2l6ZSwgNyk7CiAgICAgaWYgKHNlcVBhcmFtU2V0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMzAzLDggKzMzNyw3IEBACiAgICAgRmluZEFWQ0RpbWVuc2lvbnMoCiAgICAgICAgICAgICBzZXFQYXJhbVNldCwgJndpZHRoLCAmaGVpZ2h0LCAmc2FyV2lkdGgsICZzYXJIZWlnaHQpOwogCi0gICAgc2l6ZV90IHN0b3BPZmZzZXQ7Ci0gICAgc3A8QUJ1ZmZlcj4gcGljUGFyYW1TZXQgPSBGaW5kTkFMKGRhdGEsIHNpemUsIDgsICZzdG9wT2Zmc2V0KTsKKyAgICBzcDxBQnVmZmVyPiBwaWNQYXJhbVNldCA9IEZpbmROQUwoZGF0YSwgc2l6ZSwgOCk7CiAgICAgQ0hFQ0socGljUGFyYW1TZXQgIT0gTlVMTCk7CiAKICAgICBzaXplX3QgY3NkU2l6ZSA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOWUzZmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWlmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLCB0cnVlKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgIFwKLSAgICAgICAgRGF0YVVyaVNvdXJjZS5jcHAgXAotICAgICAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcCBcCi0gICAgICAgIHN1cHBvcnQuY3BwIFwKLSAgICAgICAgY2hyb21pdW1faHR0cF9zdHViLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTOj0gXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICBleHRlcm5hbC9jaHJvbWl1bSBcCi0gICAgICAgIGV4dGVybmFsL2Nocm9taXVtL2FuZHJvaWQKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAotICAgICAgICBsaWJiaW5kZXIgXAotICAgICAgICBsaWJzdGxwb3J0IFwKLSAgICAgICAgbGliY2hyb21pdW1fbmV0IFwKLSAgICAgICAgbGlidXRpbHMgXAotICAgICAgICBsaWJiaW5kZXIgXAotICAgICAgICBsaWJjdXRpbHMgXAotICAgICAgICBsaWJsb2cgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBsaWJkcm1mcmFtZXdvcmsKLQotaW5jbHVkZSBleHRlcm5hbC9zdGxwb3J0L2xpYnN0bHBvcnQubWsKLQotTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi1lbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNWMyODAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDaHJvbWl1bUhUVFBEYXRhU291cmNlIgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0KLSNpbmNsdWRlICJzdXBwb3J0LmgiCi0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPiAvLyBmb3IgcHJvcGVydHlfZ2V0Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Q2hyb21pdW1IVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncykKLSAgICA6IG1GbGFncyhmbGFncyksCi0gICAgICBtU3RhdGUoRElTQ09OTkVDVEVEKSwKLSAgICAgIG1EZWxlZ2F0ZShuZXcgU2ZEZWxlZ2F0ZSksCi0gICAgICBtQ3VycmVudE9mZnNldCgwKSwKLSAgICAgIG1JT1Jlc3VsdChPSyksCi0gICAgICBtQ29udGVudFNpemUoLTEpLAotICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCi0gICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSB7Ci0gICAgbURlbGVnYXRlLT5zZXRPd25lcih0aGlzKTsKLX0KLQotQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6fkNocm9taXVtSFRUUERhdGFTb3VyY2UoKSB7Ci0gICAgZGlzY29ubmVjdCgpOwotCi0gICAgZGVsZXRlIG1EZWxlZ2F0ZTsKLSAgICBtRGVsZWdhdGUgPSBOVUxMOwotCi0gICAgY2xlYXJEUk1TdGF0ZV9sKCk7Ci0KLSAgICBpZiAobURybU1hbmFnZXJDbGllbnQgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnQ7Ci0gICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmNvbm5lY3QoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHVpZF90IHVpZDsKLSAgICBpZiAoZ2V0VUlEKCZ1aWQpKSB7Ci0gICAgICAgIG1EZWxlZ2F0ZS0+c2V0VUlEKHVpZCk7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChMT0dfTkRFQlVHKSAmJiAhTE9HX05ERUJVRwotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfVkVSQk9TRSwgTE9HX1RBRywgImNvbm5lY3Qgb24gYmVoYWxmIG9mIHVpZCAlZCIsIHVpZCk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBjb25uZWN0X2wodXJpLCBoZWFkZXJzLCBvZmZzZXQpOwotfQotCi1zdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpjb25uZWN0X2woCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgaWYgKG1TdGF0ZSAhPSBESVNDT05ORUNURUQpIHsKLSAgICAgICAgZGlzY29ubmVjdF9sKCk7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChMT0dfTkRFQlVHKSAmJiAhTE9HX05ERUJVRwotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfVkVSQk9TRSwgTE9HX1RBRywKLSAgICAgICAgICAgICAgICAiY29ubmVjdCB0byA8VVJMIHN1cHByZXNzZWQ+IEAlbGxkIiwgb2Zmc2V0KTsKLSNlbmRpZgotCi0gICAgbVVSSSA9IHVyaTsKLSAgICBtQ29udGVudFR5cGUgPSBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLQotICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKLSAgICAgICAgbUhlYWRlcnMgPSAqaGVhZGVyczsKLSAgICB9IGVsc2UgewotICAgICAgICBtSGVhZGVycy5jbGVhcigpOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IENPTk5FQ1RJTkc7Ci0gICAgbUNvbnRlbnRTaXplID0gLTE7Ci0gICAgbUN1cnJlbnRPZmZzZXQgPSBvZmZzZXQ7Ci0KLSAgICBtRGVsZWdhdGUtPmluaXRpYXRlQ29ubmVjdGlvbihtVVJJLmNfc3RyKCksICZtSGVhZGVycywgb2Zmc2V0KTsKLQotICAgIHdoaWxlIChtU3RhdGUgPT0gQ09OTkVDVElORyB8fCBtU3RhdGUgPT0gRElTQ09OTkVDVElORykgewotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIHJldHVybiBtU3RhdGUgPT0gQ09OTkVDVEVEID8gT0sgOiBtSU9SZXN1bHQ7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6b25SZWRpcmVjdChjb25zdCBjaGFyICp1cmwpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1VUkkgPSB1cmw7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6b25Db25uZWN0aW9uRXN0YWJsaXNoZWQoCi0gICAgICAgIGludDY0X3QgY29udGVudFNpemUsIGNvbnN0IGNoYXIgKmNvbnRlbnRUeXBlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVElORykgewotICAgICAgICAvLyBXZSBtYXkgaGF2ZSBpbml0aWF0ZWQgZGlzY29ubmVjdGlvbi4KLSAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBESVNDT05ORUNUSU5HKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLSAgICBtQ29udGVudFNpemUgPSAoY29udGVudFNpemUgPCAwKSA/IC0xIDogY29udGVudFNpemUgKyBtQ3VycmVudE9mZnNldDsKLSAgICBtQ29udGVudFR5cGUgPSBTdHJpbmc4KGNvbnRlbnRUeXBlKTsKLSAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6Om9uQ29ubmVjdGlvbkZhaWxlZChzdGF0dXNfdCBlcnIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKLSAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotCi0gICAgLy8gbVVSSS5jbGVhcigpOwotCi0gICAgbUlPUmVzdWx0ID0gZXJyOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBkaXNjb25uZWN0X2woKTsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpkaXNjb25uZWN0X2woKSB7Ci0gICAgaWYgKG1TdGF0ZSA9PSBESVNDT05ORUNURUQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RJTkc7Ci0gICAgbUlPUmVzdWx0ID0gLUVJTlRSOwotCi0gICAgbURlbGVnYXRlLT5pbml0aWF0ZURpc2Nvbm5lY3QoKTsKLQotICAgIHdoaWxlIChtU3RhdGUgPT0gRElTQ09OTkVDVElORykgewotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIENIRUNLX0VRKChpbnQpbVN0YXRlLCAoaW50KURJU0NPTk5FQ1RFRCk7Ci19Ci0KLXN0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgcmV0dXJuIG1TdGF0ZSA9PSBDT05ORUNURUQgPyBPSyA6IE5PX0lOSVQ7Ci19Ci0KLXNzaXplX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0jaWYgMAotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5kaXNhYmxlLW5ldCIsIHZhbHVlLCAwKQotICAgICAgICAgICAgJiYgKCFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpIHx8ICFzdHJjbXAodmFsdWUsICIxIikpKSB7Ci0gICAgICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgIlNpbXVsYXRpbmcgdGhhdCB0aGUgbmV0d29yayBpcyBkb3duLiIpOwotICAgICAgICBkaXNjb25uZWN0X2woKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKG9mZnNldCAhPSBtQ3VycmVudE9mZnNldCkgewotICAgICAgICBBU3RyaW5nIHRtcCA9IG1VUkk7Ci0gICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IHRtcEhlYWRlcnMgPSBtSGVhZGVyczsKLQotICAgICAgICBkaXNjb25uZWN0X2woKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25uZWN0X2wodG1wLmNfc3RyKCksICZ0bXBIZWFkZXJzLCBvZmZzZXQpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBSRUFESU5HOwotCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICBtRGVsZWdhdGUtPmluaXRpYXRlUmVhZChkYXRhLCBzaXplKTsKLQotICAgIHdoaWxlIChtU3RhdGUgPT0gUkVBRElORykgewotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGlmIChtSU9SZXN1bHQgPCBPSykgewotICAgICAgICByZXR1cm4gbUlPUmVzdWx0OwotICAgIH0KLQotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKLQotICAgICAgICAvLyBUaGUgcmVhZCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIG1JT1Jlc3VsdCBjb250YWlucwotICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCi0gICAgICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG1JT1Jlc3VsdCwgZGVsYXlVcyk7Ci0KLSAgICAgICAgbUN1cnJlbnRPZmZzZXQgKz0gbUlPUmVzdWx0OwotICAgICAgICByZXR1cm4gbUlPUmVzdWx0OwotICAgIH0KLQotICAgIHJldHVybiBFUlJPUl9JTzsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpvblJlYWRDb21wbGV0ZWQoc3NpemVfdCBzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1JT1Jlc3VsdCA9IHNpemU7Ci0KLSAgICBpZiAobVN0YXRlID09IFJFQURJTkcpIHsKLSAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOwotICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtQ29udGVudFNpemUgPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAqc2l6ZSA9IG1Db250ZW50U2l6ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdWludDMyX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6ZmxhZ3MoKSB7Ci0gICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6SW5pdGlhdGVSZWFkKAotICAgICAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBtZS0+aW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIG1EZWxlZ2F0ZS0+aW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6Om9uRGlzY29ubmVjdENvbXBsZXRlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgQ0hFQ0tfRVEoKGludCltU3RhdGUsIChpbnQpRElTQ09OTkVDVElORyk7Ci0KLSAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7Ci0gICAgLy8gbVVSSS5jbGVhcigpOwotICAgIG1JT1Jlc3VsdCA9IC1FTk9UQ09OTjsKLQotICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KLXNwPERlY3J5cHRIYW5kbGU+IENocm9taXVtSFRUUERhdGFTb3VyY2U6OkRybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBuZXcgRHJtTWFuYWdlckNsaWVudCgpOwotICAgIH0KLQotICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIE5vdGUgaWYgcmVkaXJlY3Qgb2NjdXJzLCBtVXJpIGlzIHRoZSByZWRpcmVjdCB1cmkgaW5zdGVhZCBvZiB0aGUKLSAgICAgICAgICogb3JpZ2luYWwgb25lCi0gICAgICAgICAqLwotICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IG1Ecm1NYW5hZ2VyQ2xpZW50LT5vcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICAgICAgU3RyaW5nOChtVVJJLmNfc3RyKCkpLCBtaW1lKTsKLSAgICB9Ci0KLSAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnQ7Ci0gICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0RHJtSW5mbygKLSAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKLSAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7Ci19Ci0KLVN0cmluZzggQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0VXJpKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICByZXR1cm4gU3RyaW5nOChtVVJJLmNfc3RyKCkpOwotfQotCi1TdHJpbmc4IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmdldE1JTUVUeXBlKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICByZXR1cm4gbUNvbnRlbnRUeXBlOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmNsZWFyRFJNU3RhdGVfbCgpIHsKLSAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewotICAgICAgICAvLyBUbyByZWxlYXNlIG1EZWNyeXB0SGFuZGxlCi0gICAgICAgIENIRUNLKG1Ecm1NYW5hZ2VyQ2xpZW50KTsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPmNsb3NlRGVjcnlwdFNlc3Npb24obURlY3J5cHRIYW5kbGUpOwotICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpyZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVVSSS5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBMT0dfUFJJKEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsICJSZWNvbm5lY3RpbmcuLi4iKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBjb25uZWN0X2wobVVSSS5jX3N0cigpLCAmbUhlYWRlcnMsIG9mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBMT0dfUFJJKEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsICJSZWNvbm5lY3QgZmFpbGVkIHcvIGVyciAweCUwOHgiLCBlcnIpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6VXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIHJldHVybiBTZkRlbGVnYXRlOjpVcGRhdGVQcm94eUNvbmZpZyhob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9EYXRhVXJpU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvRGF0YVVyaVNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjNmYTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9EYXRhVXJpU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW5jbHVkZS9EYXRhVXJpU291cmNlLmg+Ci0KLSNpbmNsdWRlIDxuZXQvYmFzZS9kYXRhX3VybC5oPgotI2luY2x1ZGUgPGdvb2dsZXVybC9zcmMvZ3VybC5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGF0YVVyaVNvdXJjZTo6RGF0YVVyaVNvdXJjZShjb25zdCBjaGFyICp1cmkpIDoKLSAgICBtRGF0YVVyaSh1cmkpLAotICAgIG1Jbml0ZWQoTk9fSU5JVCkgewotCi0gICAgLy8gQ29weTE6IGNvbnN0IGNoYXIgKnVyaSAtPiBTdHJpbmc4IG1EYXRhVXJpLgotICAgIHN0ZDo6c3RyaW5nIG1pbWVUeXBlU3RyLCB1bnVzZWRDaGFyc2V0U3RyLCBkYXRhU3RyOwotICAgIC8vIENvcHkyOiBTdHJpbmc4IG1EYXRhVXJpIC0+IHN0ZDo6c3RyaW5nCi0gICAgY29uc3QgYm9vbCByZXQgPSBuZXQ6OkRhdGFVUkw6OlBhcnNlKAotICAgICAgICAgICAgR1VSTChzdGQ6OnN0cmluZyhtRGF0YVVyaS5zdHJpbmcoKSkpLAotICAgICAgICAgICAgJm1pbWVUeXBlU3RyLCAmdW51c2VkQ2hhcnNldFN0ciwgJmRhdGFTdHIpOwotICAgIC8vIENvcHkzOiBzdGQ6OnN0cmluZyBkYXRhU3RyIC0+IEFTdHJpbmcgbURhdGEKLSAgICBtRGF0YS5zZXRUbyhkYXRhU3RyLmRhdGEoKSwgZGF0YVN0ci5sZW5ndGgoKSk7Ci0gICAgbUluaXRlZCA9IHJldCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLQotICAgIC8vIFRoZSBjaHJvbWl1bSBkYXRhIHVybCBpbXBsZW1lbnRhdGlvbiBkZWZhdWx0cyB0byB1c2luZyAidGV4dC9wbGFpbiIKLSAgICAvLyBpZiBubyBtaW1lIHR5cGUgaXMgc3BlY2lmaWVkLiBXZSBwcmVmZXIgdG8gbGVhdmUgdGhpcyB1bnNwZWNpZmllZAotICAgIC8vIGluc3RlYWQsIHNpbmNlIHRoZSBtaW1lIHR5cGUgaXMgc25pZmZlZCBpbiBtb3N0IGNhc2VzLgotICAgIGlmIChtaW1lVHlwZVN0ciAhPSAidGV4dC9wbGFpbiIpIHsKLSAgICAgICAgbU1pbWVUeXBlID0gbWltZVR5cGVTdHIuY19zdHIoKTsKLSAgICB9Ci19Ci0KLXNzaXplX3QgRGF0YVVyaVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpvdXQsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1Jbml0ZWQgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0ZWQ7Ci0gICAgfQotCi0gICAgY29uc3Qgb2ZmNjRfdCBsZW5ndGggPSBtRGF0YS5zaXplKCk7Ci0gICAgaWYgKG9mZnNldCA+PSBsZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciAqZGF0YUJ1ZiA9IG1EYXRhLmNfc3RyKCk7Ci0gICAgY29uc3Qgc2l6ZV90IGJ5dGVzVG9Db3B5ID0KLSAgICAgICAgICAgIG9mZnNldCArIHNpemUgPj0gbGVuZ3RoID8gKGxlbmd0aCAtIG9mZnNldCkgOiBzaXplOwotCi0gICAgaWYgKGJ5dGVzVG9Db3B5ID4gMCkgewotICAgICAgICBtZW1jcHkob3V0LCBkYXRhQnVmICsgb2Zmc2V0LCBieXRlc1RvQ29weSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ5dGVzVG9Db3B5OwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9jaHJvbWl1bV9odHRwX3N0dWIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9jaHJvbWl1bV9odHRwX3N0dWIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODlmNmRlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvY2hyb21pdW1faHR0cF9zdHViLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZGxmY24uaD4KLQotI2luY2x1ZGUgPGluY2x1ZGUvY2hyb21pdW1faHR0cF9zdHViLmg+Ci0jaW5jbHVkZSA8aW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8aW5jbHVkZS9EYXRhVXJpU291cmNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotSFRUUEJhc2UgKmNyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UodWludDMyX3QgZmxhZ3MpIHsKLSAgICByZXR1cm4gbmV3IENocm9taXVtSFRUUERhdGFTb3VyY2UoZmxhZ3MpOwotfQotCi1zdGF0dXNfdCBVcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIHJldHVybiBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpVcGRhdGVQcm94eUNvbmZpZyhob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLX0KLQotRGF0YVNvdXJjZSAqY3JlYXRlRGF0YVVyaVNvdXJjZShjb25zdCBjaGFyICp1cmkpIHsKLSAgICByZXR1cm4gbmV3IERhdGFVcmlTb3VyY2UodXJpKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZTQ4NzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDaHJvbWl1bUhUVFBEYXRhU291cmNlU3VwcG9ydCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotCi0jaW5jbHVkZSAic3VwcG9ydC5oIgotCi0jaW5jbHVkZSAiYW5kcm9pZC9uZXQvYW5kcm9pZF9uZXR3b3JrX2xpYnJhcnlfaW1wbC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL2NlcnRfdmVyaWZpZXIuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9jb29raWVfbW9uc3Rlci5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL2hvc3RfcmVzb2x2ZXIuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9zc2xfY29uZmlnX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJuZXQvaHR0cC9odHRwX2F1dGhfaGFuZGxlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAibmV0L2h0dHAvaHR0cF9jYWNoZS5oIgotI2luY2x1ZGUgIm5ldC9wcm94eS9wcm94eV9jb25maWdfc2VydmljZV9hbmRyb2lkLmgiCi0KLSNpbmNsdWRlICJpbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaCIKLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIGludGVyZmFjZSBkZWZpbmVkIGluIElBdWRpb1NlcnZpY2UuYWlkbAotY2xhc3MgSUF1ZGlvU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShBdWRpb1NlcnZpY2UpOwotCi0gICAgdmlydHVhbCBpbnQgdmVyaWZ5WDUwOUNlcnRDaGFpbigKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2VydF9jaGFpbiwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0bmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpID0gMDsKLX07Ci0KLWNsYXNzIEJwQXVkaW9TZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb1NlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gICAgQnBBdWRpb1NlcnZpY2UoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SUF1ZGlvU2VydmljZT4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBpbnQgdmVyaWZ5WDUwOUNlcnRDaGFpbigKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2VydF9jaGFpbiwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0bmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotCi0gICAgICAgIC8vIFRoZSB2ZWN0b3Igb2Ygc3RkOjpzdHJpbmcgd2UgZ2V0IGlzbid0IHJlYWxseSBhIHZlY3RvciBvZiBzdHJpbmdzLAotICAgICAgICAvLyBidXQgcmF0aGVyIGEgdmVjdG9yIG9mIGJpbmFyeSBjZXJ0aWZpY2F0ZSBkYXRhLiBJZiB3ZSB0cnkgdG8gcGFzcwotICAgICAgICAvLyBpdCB0byBKYXZhIGxhbmd1YWdlIGNvZGUgYXMgYSBzdHJpbmcsIGl0IGVuZHMgdXAgbWFuZ2xlZCBvbiB0aGUgb3RoZXIKLSAgICAgICAgLy8gc2lkZSwgc28gc2VuZCB0aGVtIGFzIGJ5dGVzIGluc3RlYWQuCi0gICAgICAgIC8vIFNpbmNlIHdlIGNhbid0IHNlbmQgYW4gYXJyYXkgb2YgYnl0ZSBhcnJheXMsIHNlbmQgYSBzaW5nbGUgYXJyYXksCi0gICAgICAgIC8vIHdoaWNoIHdpbGwgYmUgc3BsaXQgb3V0IGJ5IHRoZSByZWNpcGllbnQuCi0KLSAgICAgICAgaW50IG51bWNlcnRzID0gY2VydF9jaGFpbi5zaXplKCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1jZXJ0cyk7Ci0gICAgICAgIHNpemVfdCB0b3RhbCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtY2VydHM7IGkrKykgewotICAgICAgICAgICAgdG90YWwgKz0gY2VydF9jaGFpbltpXS5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZV90IGJ5dGVzaXplID0gdG90YWwgKyBudW1jZXJ0cyAqIDQ7Ci0gICAgICAgIHVpbnQ4X3QgKmJ5dGVzID0gKHVpbnQ4X3QqKSBtYWxsb2MoYnl0ZXNpemUpOwotICAgICAgICBpZiAoIWJ5dGVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gNTsgLy8gU1NMX0lOVkFMSUQKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiJWQgY2VydHM6ICVkIC0+ICVkIiwgbnVtY2VydHMsIHRvdGFsLCBieXRlc2l6ZSk7Ci0KLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtY2VydHM7IGkrKykgewotICAgICAgICAgICAgaW50MzJfdCBjZXJ0c2l6ZSA9IGNlcnRfY2hhaW5baV0uc2l6ZSgpOwotICAgICAgICAgICAgLy8gc3RvcmUgdGhpcyBpbiBhIGtub3duIG9yZGVyLCB3aGljaCBqdXN0IGhhcHBlbnMgdG8gbWF0Y2ggdGhlIGRlZmF1bHQKLSAgICAgICAgICAgIC8vIGJ5dGUgb3JkZXIgb2YgYSBqYXZhIEJ5dGVCdWZmZXIKLSAgICAgICAgICAgIGludDMyX3QgYmlnc2l6ZSA9IGh0b25sKGNlcnRzaXplKTsKLSAgICAgICAgICAgIEFMT0dWKCJjZXJ0ICVkLCBzaXplICVkIiwgaSwgY2VydHNpemUpOwotICAgICAgICAgICAgbWVtY3B5KGJ5dGVzICsgb2Zmc2V0LCAmYmlnc2l6ZSwgc2l6ZW9mKGJpZ3NpemUpKTsKLSAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2YoYmlnc2l6ZSk7Ci0gICAgICAgICAgICBtZW1jcHkoYnl0ZXMgKyBvZmZzZXQsIGNlcnRfY2hhaW5baV0uZGF0YSgpLCBjZXJ0c2l6ZSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gY2VydHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUJ5dGVBcnJheShieXRlc2l6ZSwgYnl0ZXMpOwotICAgICAgICBmcmVlKGJ5dGVzKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KFN0cmluZzE2KGhvc3RuYW1lLmNfc3RyKCkpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KFN0cmluZzE2KGF1dGhfdHlwZS5jX3N0cigpKSk7Ci0KLSAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgIGlmIChyZW1vdGUoKS0+dHJhbnNhY3QoSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwgZGF0YSwgJnJlcGx5KSAhPSBOT19FUlJPUgotICAgICAgICAgICAgICAgIHx8IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCkgPCAwIHx8IHJlcGx5LnJlYWRJbnQzMigmcmVzdWx0KSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIDU7IC8vIFNTTF9JTlZBTElEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9TZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9TZXJ2aWNlIik7Ci0KLQotc3RhdGljIE11dGV4IGdOZXR3b3JrVGhyZWFkTG9jazsKLXN0YXRpYyBiYXNlOjpUaHJlYWQgKmdOZXR3b3JrVGhyZWFkID0gTlVMTDsKLXN0YXRpYyBzY29wZWRfcmVmcHRyPFNmUmVxdWVzdENvbnRleHQ+IGdSZXFDb250ZXh0Owotc3RhdGljIHNjb3BlZF9wdHI8bmV0OjpOZXR3b3JrQ2hhbmdlTm90aWZpZXI+IGdOZXR3b3JrQ2hhbmdlTm90aWZpZXI7Ci0KLWJvb2wgbG9nTWVzc2FnZUhhbmRsZXIoCi0gICAgICAgIGludCBzZXZlcml0eSwKLSAgICAgICAgY29uc3QgY2hhciogZmlsZSwKLSAgICAgICAgaW50IGxpbmUsCi0gICAgICAgIHNpemVfdCBtZXNzYWdlX3N0YXJ0LAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgaW50IGFuZHJvaWRTZXZlcml0eSA9IEFORFJPSURfTE9HX1ZFUkJPU0U7Ci0gICAgc3dpdGNoKHNldmVyaXR5KSB7Ci0gICAgY2FzZSBsb2dnaW5nOjpMT0dfRkFUQUw6Ci0gICAgICAgIGFuZHJvaWRTZXZlcml0eSA9IEFORFJPSURfTE9HX0ZBVEFMOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGxvZ2dpbmc6OkxPR19FUlJPUl9SRVBPUlQ6Ci0gICAgY2FzZSBsb2dnaW5nOjpMT0dfRVJST1I6Ci0gICAgICAgIGFuZHJvaWRTZXZlcml0eSA9IEFORFJPSURfTE9HX0VSUk9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGxvZ2dpbmc6OkxPR19XQVJOSU5HOgotICAgICAgICBhbmRyb2lkU2V2ZXJpdHkgPSBBTkRST0lEX0xPR19XQVJOOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBhbmRyb2lkU2V2ZXJpdHkgPSBBTkRST0lEX0xPR19WRVJCT1NFOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgYW5kcm9pZF9wcmludExvZyhhbmRyb2lkU2V2ZXJpdHksICJjaHJvbWl1bS1saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICAgICAgICAgICAgICIlczolZDogJXMiLCBmaWxlLCBsaW5lLCBzdHIuY19zdHIoKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdHJ1Y3QgQXV0b1ByaW9yaXR5U2F2ZXIgewotICAgIEF1dG9Qcmlvcml0eVNhdmVyKCkKLSAgICAgICAgOiBtVElEKGFuZHJvaWRHZXRUaWQoKSksCi0gICAgICAgICAgbVByZXZQcmlvcml0eShhbmRyb2lkR2V0VGhyZWFkUHJpb3JpdHkobVRJRCkpIHsKLSAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KG1USUQsIEFORFJPSURfUFJJT1JJVFlfTk9STUFMKTsKLSAgICB9Ci0KLSAgICB+QXV0b1ByaW9yaXR5U2F2ZXIoKSB7Ci0gICAgICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eShtVElELCBtUHJldlByaW9yaXR5KTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgcGlkX3QgbVRJRDsKLSAgICBpbnQgbVByZXZQcmlvcml0eTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEF1dG9Qcmlvcml0eVNhdmVyKTsKLX07Ci0KLXN0YXRpYyB2b2lkIEluaXRpYWxpemVOZXR3b3JrVGhyZWFkSWZOZWNlc3NhcnkoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdOZXR3b3JrVGhyZWFkTG9jayk7Ci0KLSAgICBpZiAoZ05ldHdvcmtUaHJlYWQgPT0gTlVMTCkgewotICAgICAgICAvLyBNYWtlIHN1cmUgYW55IHRocmVhZHMgc3Bhd25lZCBieSB0aGUgY2hyb21pdW0gZnJhbWV3b3JrIGFyZQotICAgICAgICAvLyBydW5uaW5nIGF0IG5vcm1hbCBwcmlvcml0eSBpbnN0ZWFkIG9mIGluaGVyaXRpbmcgdGhpcyB0aHJlYWQncy4KLSAgICAgICAgQXV0b1ByaW9yaXR5U2F2ZXIgc2F2ZXI7Ci0KLSAgICAgICAgZ05ldHdvcmtUaHJlYWQgPSBuZXcgYmFzZTo6VGhyZWFkKCJuZXR3b3JrIik7Ci0gICAgICAgIGJhc2U6OlRocmVhZDo6T3B0aW9ucyBvcHRpb25zOwotICAgICAgICBvcHRpb25zLm1lc3NhZ2VfbG9vcF90eXBlID0gTWVzc2FnZUxvb3A6OlRZUEVfSU87Ci0gICAgICAgIENIRUNLKGdOZXR3b3JrVGhyZWFkLT5TdGFydFdpdGhPcHRpb25zKG9wdGlvbnMpKTsKLQotICAgICAgICBnUmVxQ29udGV4dCA9IG5ldyBTZlJlcXVlc3RDb250ZXh0OwotCi0gICAgICAgIGdOZXR3b3JrQ2hhbmdlTm90aWZpZXIucmVzZXQobmV0OjpOZXR3b3JrQ2hhbmdlTm90aWZpZXI6OkNyZWF0ZSgpKTsKLQotICAgICAgICBuZXQ6OkFuZHJvaWROZXR3b3JrTGlicmFyeTo6UmVnaXN0ZXJTaGFyZWRJbnN0YW5jZSgKLSAgICAgICAgICAgICAgICBuZXcgU2ZOZXR3b3JrTGlicmFyeSk7Ci0gICAgICAgIGxvZ2dpbmc6OlNldExvZ01lc3NhZ2VIYW5kbGVyKGxvZ01lc3NhZ2VIYW5kbGVyKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIE1ZX0xPR0koY29uc3QgY2hhciAqcykgewotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgIiVzIiwgcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIE1ZX0xPR1YoY29uc3QgY2hhciAqcykgewotI2lmICFkZWZpbmVkKExPR19OREVCVUcpIHx8IExPR19OREVCVUcgPT0gMAotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfVkVSQk9TRSwgTE9HX1RBRywgIiVzIiwgcyk7Ci0jZW5kaWYKLX0KLQotU2ZOZXRMb2c6OlNmTmV0TG9nKCkKLSAgICA6IG1OZXh0SUQoMSkgewotfQotCi12b2lkIFNmTmV0TG9nOjpBZGRFbnRyeSgKLSAgICAgICAgRXZlbnRUeXBlIHR5cGUsCi0gICAgICAgIGNvbnN0IGJhc2U6OlRpbWVUaWNrcyAmdGltZSwKLSAgICAgICAgY29uc3QgU291cmNlICZzb3VyY2UsCi0gICAgICAgIEV2ZW50UGhhc2UgcGhhc2UsCi0gICAgICAgIEV2ZW50UGFyYW1ldGVycyAqcGFyYW1zKSB7Ci0jaWYgMAotICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICJBZGRFbnRyeSB0aW1lPSVzIHR5cGU9JXMgc291cmNlPSVzIHBoYXNlPSVzXG4iLAotICAgICAgICAgICAgICAgIFRpY2tDb3VudFRvU3RyaW5nKHRpbWUpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgRXZlbnRUeXBlVG9TdHJpbmcodHlwZSksCi0gICAgICAgICAgICAgICAgU291cmNlVHlwZVRvU3RyaW5nKHNvdXJjZS50eXBlKSwKLSAgICAgICAgICAgICAgICBFdmVudFBoYXNlVG9TdHJpbmcocGhhc2UpKS5jX3N0cigpKTsKLSNlbmRpZgotfQotCi11aW50MzIgU2ZOZXRMb2c6Ok5leHRJRCgpIHsKLSAgICByZXR1cm4gbU5leHRJRCsrOwotfQotCi1uZXQ6Ok5ldExvZzo6TG9nTGV2ZWwgU2ZOZXRMb2c6OkdldExvZ0xldmVsKCkgY29uc3QgewotICAgIHJldHVybiBMT0dfQkFTSUM7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVNmUmVxdWVzdENvbnRleHQ6OlNmUmVxdWVzdENvbnRleHQoKSB7Ci0gICAgbVVzZXJBZ2VudCA9IE1ha2VVc2VyQWdlbnQoKS5jX3N0cigpOwotCi0gICAgc2V0X25ldF9sb2cobmV3IFNmTmV0TG9nKCkpOwotCi0gICAgc2V0X2hvc3RfcmVzb2x2ZXIoCi0gICAgICAgIG5ldDo6Q3JlYXRlU3lzdGVtSG9zdFJlc29sdmVyKAotICAgICAgICAgICAgICAgIG5ldDo6SG9zdFJlc29sdmVyOjprRGVmYXVsdFBhcmFsbGVsaXNtLAotICAgICAgICAgICAgICAgIE5VTEwgLyogcmVzb2x2ZXJfcHJvYyAqLywKLSAgICAgICAgICAgICAgICBuZXRfbG9nKCkpKTsKLQotICAgIHNldF9zc2xfY29uZmlnX3NlcnZpY2UoCi0gICAgICAgIG5ldDo6U1NMQ29uZmlnU2VydmljZTo6Q3JlYXRlU3lzdGVtU1NMQ29uZmlnU2VydmljZSgpKTsKLQotICAgIG1Qcm94eUNvbmZpZ1NlcnZpY2UgPSBuZXcgbmV0OjpQcm94eUNvbmZpZ1NlcnZpY2VBbmRyb2lkOwotCi0gICAgc2V0X3Byb3h5X3NlcnZpY2UobmV0OjpQcm94eVNlcnZpY2U6OkNyZWF0ZVdpdGhvdXRQcm94eVJlc29sdmVyKAotICAgICAgICBtUHJveHlDb25maWdTZXJ2aWNlLCBuZXRfbG9nKCkpKTsKLQotICAgIHNldF9odHRwX3RyYW5zYWN0aW9uX2ZhY3RvcnkobmV3IG5ldDo6SHR0cENhY2hlKAotICAgICAgICAgICAgaG9zdF9yZXNvbHZlcigpLAotICAgICAgICAgICAgbmV3IG5ldDo6Q2VydFZlcmlmaWVyKCksCi0gICAgICAgICAgICBkbnNycl9yZXNvbHZlcigpLAotICAgICAgICAgICAgZG5zX2NlcnRfY2hlY2tlcigpLAotICAgICAgICAgICAgcHJveHlfc2VydmljZSgpLAotICAgICAgICAgICAgc3NsX2NvbmZpZ19zZXJ2aWNlKCksCi0gICAgICAgICAgICBuZXQ6Okh0dHBBdXRoSGFuZGxlckZhY3Rvcnk6OkNyZWF0ZURlZmF1bHQoaG9zdF9yZXNvbHZlcigpKSwKLSAgICAgICAgICAgIG5ldHdvcmtfZGVsZWdhdGUoKSwKLSAgICAgICAgICAgIG5ldF9sb2coKSwKLSAgICAgICAgICAgIE5VTEwpKTsgIC8vIGJhY2tlbmRfZmFjdG9yeQotCi0gICAgc2V0X2Nvb2tpZV9zdG9yZShuZXcgbmV0OjpDb29raWVNb25zdGVyKE5VTEwsIE5VTEwpKTsKLX0KLQotY29uc3Qgc3RkOjpzdHJpbmcgJlNmUmVxdWVzdENvbnRleHQ6OkdldFVzZXJBZ2VudChjb25zdCBHVVJMICZ1cmwpIGNvbnN0IHsKLSAgICByZXR1cm4gbVVzZXJBZ2VudDsKLX0KLQotc3RhdHVzX3QgU2ZSZXF1ZXN0Q29udGV4dDo6dXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUHJveHlDb25maWdMb2NrKTsKLQotICAgIGlmIChob3N0ID09IE5VTEwgfHwgKmhvc3QgPT0gJ1wwJykgewotICAgICAgICBNWV9MT0dWKCJ1cGRhdGVQcm94eUNvbmZpZyBOVUxMIik7Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcgcHJveHk7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGV4TGlzdDsKLSAgICAgICAgbVByb3h5Q29uZmlnU2VydmljZS0+VXBkYXRlUHJveHlTZXR0aW5ncyhwcm94eSwgZXhMaXN0KTsKLSAgICB9IGVsc2UgewotI2lmICFkZWZpbmVkKExPR19OREVCVUcpIHx8IExPR19OREVCVUcgPT0gMAotICAgICAgICBMT0dfUFJJKEFORFJPSURfTE9HX1ZFUkJPU0UsIExPR19UQUcsCi0gICAgICAgICAgICAgICAgInVwZGF0ZVByb3h5Q29uZmlnICVzOiVkLCBleGNsdWRlICclcyciLAotICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotI2VuZGlmCi0KLSAgICAgICAgc3RkOjpzdHJpbmcgcHJveHkgPSBTdHJpbmdQcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkuY19zdHIoKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgZXhMaXN0ID0gZXhjbHVzaW9uTGlzdDsKLSAgICAgICAgbVByb3h5Q29uZmlnU2VydmljZS0+VXBkYXRlUHJveHlTZXR0aW5ncyhwcm94eSwgZXhMaXN0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVNmTmV0d29ya0xpYnJhcnk6OlNmTmV0d29ya0xpYnJhcnkoKSB7fQotCi1TZk5ldHdvcmtMaWJyYXJ5OjpWZXJpZnlSZXN1bHQgU2ZOZXR3b3JrTGlicmFyeTo6VmVyaWZ5WDUwOUNlcnRDaGFpbigKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjZXJ0X2NoYWluLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdG5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpIHsKLQotICAgIHNwPElCaW5kZXI+IGJpbmRlciA9Ci0gICAgICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoImF1ZGlvIikpOwotICAgIGlmIChiaW5kZXIgPT0gMCkgewotICAgICAgICBBTE9HVygiVGhyZWFkIGNhbm5vdCBjb25uZWN0IHRvIHRoZSBhdWRpbyBzZXJ2aWNlIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8SUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElBdWRpb1NlcnZpY2U+KGJpbmRlcik7Ci0gICAgICAgIGludCBjb2RlID0gc2VydmljZS0+dmVyaWZ5WDUwOUNlcnRDaGFpbihjZXJ0X2NoYWluLCBob3N0bmFtZSwgYXV0aF90eXBlKTsKLSAgICAgICAgQUxPR1YoInZlcmlmaWVkOiAlZCIsIGNvZGUpOwotICAgICAgICBpZiAoY29kZSA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIFZFUklGWV9PSzsKLSAgICAgICAgfSBlbHNlIGlmIChjb2RlID09IDIpIHsgLy8gU1NMX0lETUlTTUFUQ0gKLSAgICAgICAgICAgIHJldHVybiBWRVJJRllfQkFEX0hPU1ROQU1FOwotICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMykgeyAvLyBTU0xfVU5UUlVTVEVECi0gICAgICAgICAgICByZXR1cm4gVkVSSUZZX05PX1RSVVNURURfUk9PVDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVkVSSUZZX0lOVk9DQVRJT05fRVJST1I7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVNmRGVsZWdhdGU6OlNmRGVsZWdhdGUoKQotICAgIDogbU93bmVyKE5VTEwpLAotICAgICAgbVVSTFJlcXVlc3QoTlVMTCksCi0gICAgICBtUmVhZEJ1ZmZlcihuZXcgbmV0OjpJT0J1ZmZlcldpdGhTaXplKDgxOTIpKSwKLSAgICAgIG1OdW1CeXRlc1JlYWQoMCksCi0gICAgICBtTnVtQnl0ZXNUb3RhbCgwKSwKLSAgICAgIG1EYXRhRGVzdGluYXRpb24oTlVMTCksCi0gICAgICBtQXRFT1MoZmFsc2UpIHsKLSAgICBJbml0aWFsaXplTmV0d29ya1RocmVhZElmTmVjZXNzYXJ5KCk7Ci19Ci0KLVNmRGVsZWdhdGU6On5TZkRlbGVnYXRlKCkgewotICAgIENIRUNLKG1VUkxSZXF1ZXN0ID09IE5VTEwpOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IFNmRGVsZWdhdGU6OlVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICBJbml0aWFsaXplTmV0d29ya1RocmVhZElmTmVjZXNzYXJ5KCk7Ci0KLSAgICByZXR1cm4gZ1JlcUNvbnRleHQtPnVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6OnNldE93bmVyKENocm9taXVtSFRUUERhdGFTb3VyY2UgKm93bmVyKSB7Ci0gICAgbU93bmVyID0gb3duZXI7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6c2V0VUlEKHVpZF90IHVpZCkgewotICAgIGdSZXFDb250ZXh0LT5zZXRVSUQodWlkKTsKLX0KLQotYm9vbCBTZkRlbGVnYXRlOjpnZXRVSUQodWlkX3QgKnVpZCkgY29uc3QgewotICAgIHJldHVybiBnUmVxQ29udGV4dC0+Z2V0VUlEKHVpZCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25SZWNlaXZlZFJlZGlyZWN0KAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBjb25zdCBHVVJMICZuZXdfdXJsLCBib29sICpkZWZlcl9yZWRpcmVjdCkgewotICAgIE1ZX0xPR1YoIk9uUmVjZWl2ZWRSZWRpcmVjdCIpOwotICAgIG1Pd25lci0+b25SZWRpcmVjdChuZXdfdXJsLnNwZWMoKS5jX3N0cigpKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPbkF1dGhSZXF1aXJlZCgKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgbmV0OjpBdXRoQ2hhbGxlbmdlSW5mbyAqYXV0aF9pbmZvKSB7Ci0gICAgTVlfTE9HVigiT25BdXRoUmVxdWlyZWQiKTsKLQotICAgIGluaGVyaXRlZDo6T25BdXRoUmVxdWlyZWQocmVxdWVzdCwgYXV0aF9pbmZvKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPbkNlcnRpZmljYXRlUmVxdWVzdGVkKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBuZXQ6OlNTTENlcnRSZXF1ZXN0SW5mbyAqY2VydF9yZXF1ZXN0X2luZm8pIHsKLSAgICBNWV9MT0dWKCJPbkNlcnRpZmljYXRlUmVxdWVzdGVkIik7Ci0KLSAgICBpbmhlcml0ZWQ6Ok9uQ2VydGlmaWNhdGVSZXF1ZXN0ZWQocmVxdWVzdCwgY2VydF9yZXF1ZXN0X2luZm8pOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uU1NMQ2VydGlmaWNhdGVFcnJvcigKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgaW50IGNlcnRfZXJyb3IsIG5ldDo6WDUwOUNlcnRpZmljYXRlICpjZXJ0KSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJPblNTTENlcnRpZmljYXRlRXJyb3IgY2VydF9lcnJvcj0lZFxuIiwgY2VydF9lcnJvcik7Ci0KLSAgICBpbmhlcml0ZWQ6Ok9uU1NMQ2VydGlmaWNhdGVFcnJvcihyZXF1ZXN0LCBjZXJ0X2Vycm9yLCBjZXJ0KTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPbkdldENvb2tpZXMobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBib29sIGJsb2NrZWRfYnlfcG9saWN5KSB7Ci0gICAgTVlfTE9HVigiT25HZXRDb29raWVzIik7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25TZXRDb29raWUoCi0gICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvb2tpZV9saW5lLAotICAgICAgICBjb25zdCBuZXQ6OkNvb2tpZU9wdGlvbnMgJm9wdGlvbnMsCi0gICAgICAgIGJvb2wgYmxvY2tlZF9ieV9wb2xpY3kpIHsKLSAgICBNWV9MT0dWKCJPblNldENvb2tpZSIpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uUmVzcG9uc2VTdGFydGVkKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCkgewotICAgIGlmIChyZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSAhPSBuZXQ6OlVSTFJlcXVlc3RTdGF0dXM6OlNVQ0NFU1MpIHsKLSAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCBhbmQgb3NfZXJyb3IgJWQiLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c3RhdHVzKCkub3NfZXJyb3IoKSkuY19zdHIoKSk7Ci0KLSAgICAgICAgZGVsZXRlIG1VUkxSZXF1ZXN0OwotICAgICAgICBtVVJMUmVxdWVzdCA9IE5VTEw7Ci0KLSAgICAgICAgbU93bmVyLT5vbkNvbm5lY3Rpb25GYWlsZWQoRVJST1JfSU8pOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChtUmFuZ2VSZXF1ZXN0ZWQgJiYgcmVxdWVzdC0+R2V0UmVzcG9uc2VDb2RlKCkgIT0gMjA2KSB7Ci0gICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAiV2UgcmVxdWVzdGVkIGEgY29udGVudCByYW5nZSwgYnV0IHNlcnZlciBkaWRuJ3QgIgotICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCB0aGF0LiAocmVzcG9uZGVkIHdpdGggJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+R2V0UmVzcG9uc2VDb2RlKCkpLmNfc3RyKCkpOwotCi0gICAgICAgIGRlbGV0ZSBtVVJMUmVxdWVzdDsKLSAgICAgICAgbVVSTFJlcXVlc3QgPSBOVUxMOwotCi0gICAgICAgIG1Pd25lci0+b25Db25uZWN0aW9uRmFpbGVkKC1FUElQRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKChyZXF1ZXN0LT5HZXRSZXNwb25zZUNvZGUoKSAvIDEwMCkgIT0gMikgewotICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIlNlcnZlciByZXNwb25kZWQgd2l0aCBodHRwIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPkdldFJlc3BvbnNlQ29kZSgpKS5jX3N0cigpKTsKLQotICAgICAgICBkZWxldGUgbVVSTFJlcXVlc3Q7Ci0gICAgICAgIG1VUkxSZXF1ZXN0ID0gTlVMTDsKLQotICAgICAgICBtT3duZXItPm9uQ29ubmVjdGlvbkZhaWxlZChFUlJPUl9JTyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBNWV9MT0dWKCJPblJlc3BvbnNlU3RhcnRlZCIpOwotCi0gICAgc3RkOjpzdHJpbmcgaGVhZGVyczsKLSAgICByZXF1ZXN0LT5HZXRBbGxSZXNwb25zZUhlYWRlcnMoJmhlYWRlcnMpOwotCi0gICAgTVlfTE9HVihTdHJpbmdQcmludGYoInJlc3BvbnNlIGhlYWRlcnM6ICVzIiwgaGVhZGVycy5jX3N0cigpKS5jX3N0cigpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRUeXBlOwotICAgIHJlcXVlc3QtPkdldFJlc3BvbnNlSGVhZGVyQnlOYW1lKCJDb250ZW50LVR5cGUiLCAmY29udGVudFR5cGUpOwotCi0gICAgbU93bmVyLT5vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgKLSAgICAgICAgICAgIHJlcXVlc3QtPkdldEV4cGVjdGVkQ29udGVudFNpemUoKSwgY29udGVudFR5cGUuY19zdHIoKSk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25SZWFkQ29tcGxldGVkKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgaW50IGJ5dGVzX3JlYWQpIHsKLSAgICBpZiAoYnl0ZXNfcmVhZCA9PSAtMSkgewotICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIk9uUmVhZENvbXBsZXRlZCwgcmVhZCBmYWlsZWQsIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpKS5jX3N0cigpKTsKLQotICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChFUlJPUl9JTyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBNWV9MT0dWKFN0cmluZ1ByaW50ZigiT25SZWFkQ29tcGxldGVkLCByZWFkICVkIGJ5dGVzIiwgYnl0ZXNfcmVhZCkuY19zdHIoKSk7Ci0KLSAgICBpZiAoYnl0ZXNfcmVhZCA8IDApIHsKLSAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICJSZWFkIGZhaWxlZCB3LyBzdGF0dXMgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpKS5jX3N0cigpKTsKLQotICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChFUlJPUl9JTyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgewotICAgICAgICBtQXRFT1MgPSB0cnVlOwotICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChtTnVtQnl0ZXNSZWFkKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENIRUNLX0dUKGJ5dGVzX3JlYWQsIDApOwotICAgIENIRUNLX0xFKG1OdW1CeXRlc1JlYWQgKyBieXRlc19yZWFkLCBtTnVtQnl0ZXNUb3RhbCk7Ci0KLSAgICBtZW1jcHkoKHVpbnQ4X3QgKiltRGF0YURlc3RpbmF0aW9uICsgbU51bUJ5dGVzUmVhZCwKLSAgICAgICAgICAgbVJlYWRCdWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgYnl0ZXNfcmVhZCk7Ci0KLSAgICBtTnVtQnl0ZXNSZWFkICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgICByZWFkTW9yZShyZXF1ZXN0KTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpyZWFkTW9yZShuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QpIHsKLSAgICB3aGlsZSAobU51bUJ5dGVzUmVhZCA8IG1OdW1CeXRlc1RvdGFsKSB7Ci0gICAgICAgIHNpemVfdCBjb3B5ID0gbU51bUJ5dGVzVG90YWwgLSBtTnVtQnl0ZXNSZWFkOwotICAgICAgICBpZiAoY29weSA+IG1SZWFkQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgIGNvcHkgPSBtUmVhZEJ1ZmZlci0+c2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG47Ci0gICAgICAgIGlmIChyZXF1ZXN0LT5SZWFkKG1SZWFkQnVmZmVyLCBjb3B5LCAmbikpIHsKLSAgICAgICAgICAgIE1ZX0xPR1YoU3RyaW5nUHJpbnRmKCJSZWFkICVkIGJ5dGVzIGRpcmVjdGx5LiIsIG4pLmNfc3RyKCkpOwotCi0gICAgICAgICAgICBDSEVDS19MRSgoc2l6ZV90KW4sIGNvcHkpOwotCi0gICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKiltRGF0YURlc3RpbmF0aW9uICsgbU51bUJ5dGVzUmVhZCwKLSAgICAgICAgICAgICAgICAgICBtUmVhZEJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgICAgIG4pOwotCi0gICAgICAgICAgICBtTnVtQnl0ZXNSZWFkICs9IG47Ci0KLSAgICAgICAgICAgIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICBtQXRFT1MgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTVlfTE9HVigicmVhZE1vcmUgcGVuZGluZyByZWFkIik7Ci0KLSAgICAgICAgICAgIGlmIChyZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSAhPSBuZXQ6OlVSTFJlcXVlc3RTdGF0dXM6OklPX1BFTkRJTkcpIHsKLSAgICAgICAgICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlyZWN0IHJlYWQgZmFpbGVkIHcvIHN0YXR1cyAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSkuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChFUlJPUl9JTyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChtTnVtQnl0ZXNSZWFkKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjppbml0aWF0ZUNvbm5lY3Rpb24oCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgR1VSTCB1cmwodXJpKTsKLQotICAgIE1lc3NhZ2VMb29wICpsb29wID0gZ05ldHdvcmtUaHJlYWQtPm1lc3NhZ2VfbG9vcCgpOwotICAgIGxvb3AtPlBvc3RUYXNrKAotICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgTmV3UnVubmFibGVGdW5jdGlvbigKLSAgICAgICAgICAgICAgICAmU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZUNvbm5lY3Rpb25XcmFwcGVyLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgdXJsLAotICAgICAgICAgICAgICAgIGhlYWRlcnMsCi0gICAgICAgICAgICAgICAgb2Zmc2V0KSk7Ci0KLX0KLQotLy8gc3RhdGljCi12b2lkIFNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVDb25uZWN0aW9uV3JhcHBlcigKLSAgICAgICAgU2ZEZWxlZ2F0ZSAqbWUsIEdVUkwgdXJsLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBtZS0+b25Jbml0aWF0ZUNvbm5lY3Rpb24odXJsLCBoZWFkZXJzLCBvZmZzZXQpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Om9uSW5pdGlhdGVDb25uZWN0aW9uKAotICAgICAgICBjb25zdCBHVVJMICZ1cmwsCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpleHRyYSwKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBDSEVDSyhtVVJMUmVxdWVzdCA9PSBOVUxMKTsKLQotICAgIG1VUkxSZXF1ZXN0ID0gbmV3IG5ldDo6VVJMUmVxdWVzdCh1cmwsIHRoaXMpOwotICAgIG1BdEVPUyA9IGZhbHNlOwotCi0gICAgbVJhbmdlUmVxdWVzdGVkID0gZmFsc2U7Ci0KLSAgICBpZiAob2Zmc2V0ICE9IDAgfHwgZXh0cmEgIT0gTlVMTCkgewotICAgICAgICBuZXQ6Okh0dHBSZXF1ZXN0SGVhZGVycyBoZWFkZXJzID0KLSAgICAgICAgICAgIG1VUkxSZXF1ZXN0LT5leHRyYV9yZXF1ZXN0X2hlYWRlcnMoKTsKLQotICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKLSAgICAgICAgICAgIGhlYWRlcnMuQWRkSGVhZGVyRnJvbVN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJSYW5nZTogYnl0ZXM9JWxsZC0iLCBvZmZzZXQpLmNfc3RyKCkpOwotCi0gICAgICAgICAgICBtUmFuZ2VSZXF1ZXN0ZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4dHJhICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmEtPnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgQVN0cmluZyBzOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKGV4dHJhLT5rZXlBdChpKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIjogIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoZXh0cmEtPnZhbHVlQXQoaSkuc3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgaGVhZGVycy5BZGRIZWFkZXJGcm9tU3RyaW5nKHMuY19zdHIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtVVJMUmVxdWVzdC0+U2V0RXh0cmFSZXF1ZXN0SGVhZGVycyhoZWFkZXJzKTsKLSAgICB9Ci0KLSAgICBtVVJMUmVxdWVzdC0+c2V0X2NvbnRleHQoZ1JlcUNvbnRleHQpOwotCi0gICAgbVVSTFJlcXVlc3QtPlN0YXJ0KCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6aW5pdGlhdGVEaXNjb25uZWN0KCkgewotICAgIE1lc3NhZ2VMb29wICpsb29wID0gZ05ldHdvcmtUaHJlYWQtPm1lc3NhZ2VfbG9vcCgpOwotICAgIGxvb3AtPlBvc3RUYXNrKAotICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgTmV3UnVubmFibGVGdW5jdGlvbigKLSAgICAgICAgICAgICAgICAmU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZURpc2Nvbm5lY3RXcmFwcGVyLCB0aGlzKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBTZkRlbGVnYXRlOjpPbkluaXRpYXRlRGlzY29ubmVjdFdyYXBwZXIoU2ZEZWxlZ2F0ZSAqbWUpIHsKLSAgICBtZS0+b25Jbml0aWF0ZURpc2Nvbm5lY3QoKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpvbkluaXRpYXRlRGlzY29ubmVjdCgpIHsKLSAgICBpZiAobVVSTFJlcXVlc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVVSTFJlcXVlc3QtPkNhbmNlbCgpOwotCi0gICAgZGVsZXRlIG1VUkxSZXF1ZXN0OwotICAgIG1VUkxSZXF1ZXN0ID0gTlVMTDsKLQotICAgIG1Pd25lci0+b25EaXNjb25uZWN0Q29tcGxldGUoKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjppbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBNZXNzYWdlTG9vcCAqbG9vcCA9IGdOZXR3b3JrVGhyZWFkLT5tZXNzYWdlX2xvb3AoKTsKLSAgICBsb29wLT5Qb3N0VGFzaygKLSAgICAgICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgICAgIE5ld1J1bm5hYmxlRnVuY3Rpb24oCi0gICAgICAgICAgICAgICAgJlNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVSZWFkV3JhcHBlciwgdGhpcywgZGF0YSwgc2l6ZSkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZVJlYWRXcmFwcGVyKAotICAgICAgICBTZkRlbGVnYXRlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBtZS0+b25Jbml0aWF0ZVJlYWQoZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6b25Jbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBDSEVDSyhtVVJMUmVxdWVzdCAhPSBOVUxMKTsKLQotICAgIG1OdW1CeXRlc1JlYWQgPSAwOwotICAgIG1OdW1CeXRlc1RvdGFsID0gc2l6ZTsKLSAgICBtRGF0YURlc3RpbmF0aW9uID0gZGF0YTsKLQotICAgIGlmIChtQXRFT1MpIHsKLSAgICAgICAgbU93bmVyLT5vblJlYWRDb21wbGV0ZWQoMCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByZWFkTW9yZShtVVJMUmVxdWVzdCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NWExZDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU1VQUE9SVF9IXwotCi0jZGVmaW5lIFNVUFBPUlRfSF8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSAibmV0L2Jhc2UvbmV0X2xvZy5oIgotI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfcmVxdWVzdC5oIgotI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfcmVxdWVzdF9jb250ZXh0LmgiCi0jaW5jbHVkZSAibmV0L2Jhc2UvYW5kcm9pZF9uZXR3b3JrX2xpYnJhcnkuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9pb19idWZmZXIuaCIKLQotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBuZXQgewotICAgIHN0cnVjdCBQcm94eUNvbmZpZ1NlcnZpY2VBbmRyb2lkOwotfTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgU2ZOZXRMb2cgOiBwdWJsaWMgbmV0OjpOZXRMb2cgewotICAgIFNmTmV0TG9nKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgQWRkRW50cnkoCi0gICAgICAgICAgICBFdmVudFR5cGUgdHlwZSwKLSAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVUaWNrcyAmdGltZSwKLSAgICAgICAgICAgIGNvbnN0IFNvdXJjZSAmc291cmNlLAotICAgICAgICAgICAgRXZlbnRQaGFzZSBwaGFzZSwKLSAgICAgICAgICAgIEV2ZW50UGFyYW1ldGVycyAqcGFyYW1zKTsKLQotICAgIHZpcnR1YWwgdWludDMyIE5leHRJRCgpOwotICAgIHZpcnR1YWwgTG9nTGV2ZWwgR2V0TG9nTGV2ZWwoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB1aW50MzIgbU5leHRJRDsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNmTmV0TG9nKTsKLX07Ci0KLXN0cnVjdCBTZlJlcXVlc3RDb250ZXh0IDogcHVibGljIG5ldDo6VVJMUmVxdWVzdENvbnRleHQgewotICAgIFNmUmVxdWVzdENvbnRleHQoKTsKLQotICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgJkdldFVzZXJBZ2VudChjb25zdCBHVVJMICZ1cmwpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgdXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCi1wcml2YXRlOgotICAgIE11dGV4IG1Qcm94eUNvbmZpZ0xvY2s7Ci0KLSAgICBzdGQ6OnN0cmluZyBtVXNlckFnZW50OwotICAgIG5ldDo6UHJveHlDb25maWdTZXJ2aWNlQW5kcm9pZCAqbVByb3h5Q29uZmlnU2VydmljZTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNmUmVxdWVzdENvbnRleHQpOwotfTsKLQotLy8gVGhpcyBpcyByZXF1aXJlZCBmb3IgaHR0cHMgc3VwcG9ydCwgd2UgZG9uJ3QgcmVhbGx5IHZlcmlmeSBjZXJ0aWZpY2F0ZXMsCi0vLyB3ZSBhY2NlcHQgYW55dGhpbmcuLi4KLXN0cnVjdCBTZk5ldHdvcmtMaWJyYXJ5IDogcHVibGljIG5ldDo6QW5kcm9pZE5ldHdvcmtMaWJyYXJ5IHsKLSAgICBTZk5ldHdvcmtMaWJyYXJ5KCk7Ci0KLSAgICB2aXJ0dWFsIFZlcmlmeVJlc3VsdCBWZXJpZnlYNTA5Q2VydENoYWluKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjZXJ0X2NoYWluLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3RuYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF1dGhfdHlwZSk7Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ZOZXR3b3JrTGlicmFyeSk7Ci19OwotCi1zdHJ1Y3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTsKLQotc3RydWN0IFNmRGVsZWdhdGUgOiBwdWJsaWMgbmV0OjpVUkxSZXF1ZXN0OjpEZWxlZ2F0ZSB7Ci0gICAgU2ZEZWxlZ2F0ZSgpOwotICAgIHZpcnR1YWwgflNmRGVsZWdhdGUoKTsKLQotICAgIHZvaWQgaW5pdGlhdGVDb25uZWN0aW9uKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICB2b2lkIGluaXRpYXRlRGlzY29ubmVjdCgpOwotICAgIHZvaWQgaW5pdGlhdGVSZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZvaWQgc2V0T3duZXIoQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSAqbU93bmVyKTsKLQotICAgIC8vIEdldHMgdGhlIFVJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzCi0gICAgYm9vbCBnZXRVSUQodWlkX3QgKnVpZCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uUmVjZWl2ZWRSZWRpcmVjdCgKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgY29uc3QgR1VSTCAmbmV3X3VybCwgYm9vbCAqZGVmZXJfcmVkaXJlY3QpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uQXV0aFJlcXVpcmVkKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBuZXQ6OkF1dGhDaGFsbGVuZ2VJbmZvICphdXRoX2luZm8pOwotCi0gICAgdmlydHVhbCB2b2lkIE9uQ2VydGlmaWNhdGVSZXF1ZXN0ZWQoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIG5ldDo6U1NMQ2VydFJlcXVlc3RJbmZvICpjZXJ0X3JlcXVlc3RfaW5mbyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25TU0xDZXJ0aWZpY2F0ZUVycm9yKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgY2VydF9lcnJvciwgbmV0OjpYNTA5Q2VydGlmaWNhdGUgKmNlcnQpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uR2V0Q29va2llcyhuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGJvb2wgYmxvY2tlZF9ieV9wb2xpY3kpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uU2V0Q29va2llKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvb2tpZV9saW5lLAotICAgICAgICAgICAgY29uc3QgbmV0OjpDb29raWVPcHRpb25zICZvcHRpb25zLAotICAgICAgICAgICAgYm9vbCBibG9ja2VkX2J5X3BvbGljeSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25SZXNwb25zZVN0YXJ0ZWQobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0KTsKLQotICAgIHZpcnR1YWwgdm9pZCBPblJlYWRDb21wbGV0ZWQobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgYnl0ZXNfcmVhZCk7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgVXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCi1wcml2YXRlOgotICAgIHR5cGVkZWYgRGVsZWdhdGUgaW5oZXJpdGVkOwotCi0gICAgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSAqbU93bmVyOwotCi0gICAgbmV0OjpVUkxSZXF1ZXN0ICptVVJMUmVxdWVzdDsKLSAgICBzY29wZWRfcmVmcHRyPG5ldDo6SU9CdWZmZXJXaXRoU2l6ZT4gbVJlYWRCdWZmZXI7Ci0KLSAgICBzaXplX3QgbU51bUJ5dGVzUmVhZDsKLSAgICBzaXplX3QgbU51bUJ5dGVzVG90YWw7Ci0gICAgdm9pZCAqbURhdGFEZXN0aW5hdGlvbjsKLQotICAgIGJvb2wgbVJhbmdlUmVxdWVzdGVkOwotICAgIGJvb2wgbUF0RU9TOwotCi0gICAgdm9pZCByZWFkTW9yZShuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QpOwotCi0gICAgc3RhdGljIHZvaWQgT25Jbml0aWF0ZUNvbm5lY3Rpb25XcmFwcGVyKAotICAgICAgICAgICAgU2ZEZWxlZ2F0ZSAqbWUsCi0gICAgICAgICAgICBHVVJMIHVybCwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOwotCi0gICAgc3RhdGljIHZvaWQgT25Jbml0aWF0ZURpc2Nvbm5lY3RXcmFwcGVyKFNmRGVsZWdhdGUgKm1lKTsKLQotICAgIHN0YXRpYyB2b2lkIE9uSW5pdGlhdGVSZWFkV3JhcHBlcigKLSAgICAgICAgICAgIFNmRGVsZWdhdGUgKm1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIG9uSW5pdGlhdGVDb25uZWN0aW9uKAotICAgICAgICAgICAgY29uc3QgR1VSTCAmdXJsLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICB2b2lkIG9uSW5pdGlhdGVEaXNjb25uZWN0KCk7Ci0gICAgdm9pZCBvbkluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZkRlbGVnYXRlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gU1VQUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cF9zdHViLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHBfc3R1Yi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOGE4NzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cF9zdHViLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oIgotI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgYm9vbCBnRmlyc3QgPSB0cnVlOwotc3RhdGljIHZvaWQgKmdIYW5kbGU7Ci1zdGF0aWMgTXV0ZXggZ0xpYk11dGV4OwotCi1IVFRQQmFzZSAqKCpnTGliX2NyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UpKHVpbnQzMl90IGZsYWdzKTsKLURhdGFTb3VyY2UgKigqZ0xpYl9jcmVhdGVEYXRhVXJpU291cmNlKShjb25zdCBjaGFyICp1cmkpOwotCi1zdGF0dXNfdCAoKmdMaWJfVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnKSgKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQotc3RhdGljIGJvb2wgbG9hZF9saWJzdGFnZWZyaWdodF9jaHJvbWl1bV9odHRwKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnTGliTXV0ZXgpOwotICAgIHZvaWQgKnN5bTsKLQotICAgIGlmICghZ0ZpcnN0KSB7Ci0gICAgICAgIHJldHVybiAoZ0hhbmRsZSAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgICBnRmlyc3QgPSBmYWxzZTsKLQotICAgIGdIYW5kbGUgPSBkbG9wZW4oImxpYnN0YWdlZnJpZ2h0X2Nocm9taXVtX2h0dHAuc28iLCBSVExEX05PVyk7Ci0gICAgaWYgKGdIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3ltID0gZGxzeW0oZ0hhbmRsZSwgImNyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UiKTsKLSAgICBpZiAoc3ltID09IE5VTEwpIHsKLSAgICAgICAgZ0hhbmRsZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZ0xpYl9jcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlID0gKEhUVFBCYXNlICooKikodWludDMyX3QpKXN5bTsKLQotICAgIHN5bSA9IGRsc3ltKGdIYW5kbGUsICJjcmVhdGVEYXRhVXJpU291cmNlIik7Ci0gICAgaWYgKHN5bSA9PSBOVUxMKSB7Ci0gICAgICAgIGdIYW5kbGUgPSBOVUxMOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGdMaWJfY3JlYXRlRGF0YVVyaVNvdXJjZSA9IChEYXRhU291cmNlICooKikoY29uc3QgY2hhciAqKSlzeW07Ci0KLSAgICBzeW0gPSBkbHN5bShnSGFuZGxlLCAiVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnIik7Ci0gICAgaWYgKHN5bSA9PSBOVUxMKSB7Ci0gICAgICAgIGdIYW5kbGUgPSBOVUxMOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGdMaWJfVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnID0KLSAgICAgICAgKHN0YXR1c190ICgqKShjb25zdCBjaGFyICosIGludDMyX3QsIGNvbnN0IGNoYXIgKikpc3ltOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUhUVFBCYXNlICpjcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlKHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgaWYgKCFsb2FkX2xpYnN0YWdlZnJpZ2h0X2Nocm9taXVtX2h0dHAoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ0xpYl9jcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlKGZsYWdzKTsKLX0KLQotc3RhdHVzX3QgVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICBpZiAoIWxvYWRfbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cCgpKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ0xpYl9VcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcoCi0gICAgICAgICAgICBob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLX0KLQotRGF0YVNvdXJjZSAqY3JlYXRlRGF0YVVyaVNvdXJjZShjb25zdCBjaGFyICp1cmkpIHsKLSAgICBpZiAoIWxvYWRfbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cCgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBnTGliX2NyZWF0ZURhdGFVcmlTb3VyY2UodXJpKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rCmluZGV4IGZmYTY0ZjkuLmFmYjAwYWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsKQEAgLTMsNyArMyw4IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICAgIFNvZnRBQUMyLmNwcAorICAgICAgU29mdEFBQzIuY3BwIFwKKyAgICAgIERyY1ByZXNNb2RlV3JhcC5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXApAQCAtMTcsNiArMTgsOCBAQAogCiBMT0NBTF9DRkxBR1MgOj0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJGcmF1bmhvZmVyQUFDCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOWFkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkRyY1ByZXNNb2RlV3JhcC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiU29mdEFBQzJfRHJjV3JhcHBlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworLy8jZGVmaW5lIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworCisjZGVmaW5lIEdQTV9FTkNPREVSX1RBUkdFVF9MRVZFTCA2NAorI2RlZmluZSBNQVhfVEFSR0VUX0xFVkVMIDY0CisKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OkNEcmNQcmVzTW9kZVdyYXBwZXIoKQoreworICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKworICAgIC8qIERhdGEgZnJvbSBzdHJlYW1JbmZvLiAqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyBpbiB0aGUgYWFjIGRlY29kZXIgKi8KKyAgICBtU3RyZWFtUFJMID0gLTE7CisgICAgbVN0cmVhbURSQ1ByZXNNb2RlID0gLTE7CisgICAgbVN0cmVhbU5yQUFDQ2hhbiA9IDA7CisgICAgbVN0cmVhbU5yT3V0Q2hhbiA9IDA7CisKKyAgICAvKiBEZXNpcmVkIHZhbHVlcyAoc2V0IGJ5IHVzZXIpLiAqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyBpbiB0aGUgYWFjIGRlY29kZXIgKi8KKyAgICBtRGVzVGFyZ2V0ID0gLTE7CisgICAgbURlc0F0dEZhY3RvciA9IDA7CisgICAgbURlc0Jvb3N0RmFjdG9yID0gMDsKKyAgICBtRGVzSGVhdnkgPSAwOworCisgICAgbUVuY29kZXJUYXJnZXQgPSAtMTsKKworICAgIC8qIFZhbHVlcyBmcm9tIGxhc3QgdGltZS4gKi8KKyAgICAvKiBJbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlIGRlc2lyZWQgdmFsdWVzICovCisgICAgbUxhc3RUYXJnZXQgPSAtMTsKKyAgICBtTGFzdEF0dEZhY3RvciA9IDA7CisgICAgbUxhc3RCb29zdEZhY3RvciA9IDA7CisgICAgbUxhc3RIZWF2eSA9IDA7Cit9CisKK0NEcmNQcmVzTW9kZVdyYXBwZXI6On5DRHJjUHJlc01vZGVXcmFwcGVyKCkKK3sKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c2V0RGVjb2RlckhhbmRsZShjb25zdCBIQU5ETEVfQUFDREVDT0RFUiBoYW5kbGUpCit7CisgICAgbUhhbmRsZURlY29kZXIgPSBoYW5kbGU7Cit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnN1Ym1pdFN0cmVhbURhdGEoQ1N0cmVhbUluZm8qIHBTdHJlYW1JbmZvKQoreworICAgIGFzc2VydChwU3RyZWFtSW5mbyk7CisKKyAgICBpZiAobVN0cmVhbVBSTCAhPSBwU3RyZWFtSW5mby0+ZHJjUHJvZ1JlZkxldikgeworICAgICAgICBtU3RyZWFtUFJMID0gcFN0cmVhbUluZm8tPmRyY1Byb2dSZWZMZXY7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBkcmNQcm9nUmVmTGV2IGlzICVkXG4iLCBtU3RyZWFtUFJMKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtRFJDUHJlc01vZGUgIT0gcFN0cmVhbUluZm8tPmRyY1ByZXNNb2RlKSB7CisgICAgICAgIG1TdHJlYW1EUkNQcmVzTW9kZSA9IHBTdHJlYW1JbmZvLT5kcmNQcmVzTW9kZTsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGRyY1ByZXNNb2RlIGlzICVkXG4iLCBtU3RyZWFtRFJDUHJlc01vZGUpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1OckFBQ0NoYW4gIT0gcFN0cmVhbUluZm8tPmFhY051bUNoYW5uZWxzKSB7CisgICAgICAgIG1TdHJlYW1OckFBQ0NoYW4gPSBwU3RyZWFtSW5mby0+YWFjTnVtQ2hhbm5lbHM7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBhYWNOdW1DaGFubmVscyBpcyAlZFxuIiwgbVN0cmVhbU5yQUFDQ2hhbik7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbU5yT3V0Q2hhbiAhPSBwU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgbVN0cmVhbU5yT3V0Q2hhbiA9IHBTdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IG51bUNoYW5uZWxzIGlzICVkXG4iLCBtU3RyZWFtTnJPdXRDaGFuKTsKKyNlbmRpZgorICAgIH0KKworCisKKyAgICBpZiAobVN0cmVhbU5yT3V0Q2hhbjxtU3RyZWFtTnJBQUNDaGFuKSB7CisgICAgICAgIG1Jc0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc0Rvd25taXggPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUlzRG93bm1peCAmJiAobVN0cmVhbU5yT3V0Q2hhbiA9PSAxKSkgeworICAgICAgICBtSXNNb25vRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzTW9ub0Rvd25taXggPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUlzRG93bm1peCAmJiBtU3RyZWFtTnJPdXRDaGFuID09IDIpeworICAgICAgICBtSXNTdGVyZW9Eb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNTdGVyZW9Eb3dubWl4ID0gZmFsc2U7CisgICAgfQorCit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnNldFBhcmFtKGNvbnN0IERSQ19QUkVTX01PREVfV1JBUF9QQVJBTSBwYXJhbSwgY29uc3QgaW50IHZhbHVlKQoreworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVDoKKyAgICAgICAgbURlc1RhcmdldCA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1I6CisgICAgICAgIG1EZXNBdHRGYWN0b3IgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1I6CisgICAgICAgIG1EZXNCb29zdEZhY3RvciA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZOgorICAgICAgICBtRGVzSGVhdnkgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQ6CisgICAgICAgIG1FbmNvZGVyVGFyZ2V0ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtRGF0YVVwZGF0ZSA9IHRydWU7Cit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnVwZGF0ZSgpCit7CisgICAgLy8gR2V0IERhdGEgZnJvbSBEZWNvZGVyCisgICAgaW50IHByb2dSZWZMZXZlbCA9IG1TdHJlYW1QUkw7CisgICAgaW50IGRyY1ByZXNNb2RlID0gbVN0cmVhbURSQ1ByZXNNb2RlOworCisgICAgLy8gYnkgZGVmYXVsdCwgZG8gYXMgZGVzaXJlZAorICAgIGludCBuZXdUYXJnZXQgICAgICAgICA9IG1EZXNUYXJnZXQ7CisgICAgaW50IG5ld0F0dEZhY3RvciAgICAgID0gbURlc0F0dEZhY3RvcjsKKyAgICBpbnQgbmV3Qm9vc3RGYWN0b3IgICAgPSBtRGVzQm9vc3RGYWN0b3I7CisgICAgaW50IG5ld0hlYXZ5ICAgICAgICAgID0gbURlc0hlYXZ5OworCisgICAgaWYgKG1EYXRhVXBkYXRlKSB7CisgICAgICAgIC8vIHNhbml0eSBjaGVjaworICAgICAgICBpZiAobURlc1RhcmdldCA8IE1BWF9UQVJHRVRfTEVWRUwpeworICAgICAgICAgICAgbURlc1RhcmdldCA9IE1BWF9UQVJHRVRfTEVWRUw7ICAvLyBsaW1pdCB0YXJnZXQgbGV2ZWwgdG8gLTE2IGRCIG9yIGJlbG93CisgICAgICAgICAgICBuZXdUYXJnZXQgPSBNQVhfVEFSR0VUX0xFVkVMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FbmNvZGVyVGFyZ2V0ICE9IC0xKSB7CisgICAgICAgICAgICBpZiAobURlc1RhcmdldDwxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgaWYgKChtSXNTdGVyZW9Eb3dubWl4ID09IGZhbHNlKSAmJiAobUlzTW9ub0Rvd25taXggPT0gZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0ZXJlbyBvciBtb25vIGRvd25taXhpbmcsIGNhbGN1bGF0ZWQgc2NhbGluZyBvZiBsaWdodCBEUkMKKyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGFzIGxpdHRsZSBjb21wcmVzc2lvbiBhcyBwb3NzaWJsZSAqLworICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAwOworICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PHByb2dSZWZMZXZlbCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW5jb2RlclRhcmdldCA8IG1EZXNUYXJnZXQpIHsgLy8gaWYgbUVuY29kZXJUYXJnZXQgPiB0YXJnZXQgbGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtRW5jb2RlclRhcmdldCA+IHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWxjRmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNhbGNGYWN0b3Jfbm9ybTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwLjBmIDwgY2FsY0ZhY3Rvcl9ub3JtIDwgMS4wZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNGYWN0b3Jfbm9ybSA9IChmbG9hdCkobURlc1RhcmdldCAtIHByb2dSZWZMZXZlbCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KShtRW5jb2RlclRhcmdldCAtIHByb2dSZWZMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY0ZhY3RvciA9IChpbnQpKGNhbGNGYWN0b3Jfbm9ybSoxMjcuMGYpOyAvLyAwIDw9IGNhbGNGYWN0b3IgPCAxMjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxjRmFjdG9yIGlzIHRoZSBsb3dlciBsaW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IChjYWxjRmFjdG9yPm5ld0F0dEZhY3RvcikgPyBjYWxjRmFjdG9yIDogbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBBdHRGYWN0b3Igd2lsbCBiZSBhbHdheXMgPSBjYWxjRmFjdG9yLCBhcyBpdCBpcyBzZXQgdG8gMCBiZWZvcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhcmdldCBsZXZlbCA+IG1FbmNvZGVyVGFyZ2V0ID4gUFJMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcmVzdHJpY3Rpb25zIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRhcmdldCBsZXZlbCA+IC0yMyBkQiBvciBtb25vIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAobURlc1RhcmdldDw5MikgfHwgbUlzTW9ub0Rvd25taXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBwZXJmb3JtIGEgZG93bm1peCwgc28sIHdlIG5lZWQgYXQgbGVhc3QgZnVsbCBsaWdodCBEUkMKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayAtMzEgZEI6IGxpZ2h0IERSQyBvbmx5IG5lZWRlZCBpZiB3ZSBwZXJmb3JtIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gaGFuZGxlIG90aGVyIHVzZWQgZW5jb2RlciB0YXJnZXQgbGV2ZWxzCisKKyAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjazogRFJDIHByZXNlbnRhdGlvbiBtb2RlIGlzIG9ubHkgc3BlY2lmaWVkIGZvciBtYXguIDUuMSBjaGFubmVscworICAgICAgICAgICAgaWYgKG1TdHJlYW1OckFBQ0NoYW4gPiA2KSB7CisgICAgICAgICAgICAgICAgZHJjUHJlc01vZGUgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGRyY1ByZXNNb2RlKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBkZWZhdWx0OiAvLyBwcmVzZW50YXRpb24gbW9kZSBub3QgaW5kaWNhdGVkCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldDwxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0ZXJlbyBvciBtb25vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtSXNTdGVyZW9Eb3dubWl4ID09IGZhbHNlKSAmJiAobUlzTW9ub0Rvd25taXggPT0gZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldDxwcm9nUmVmTGV2ZWwpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OyAvLyBhdCBsZWFzdCwgdXNlIGxpZ2h0IGNvbXByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcmVzdHJpY3Rpb25zIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRhcmdldCBsZXZlbCA+IC0yMyBkQiBvciBtb25vIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKG1EZXNUYXJnZXQgPCA5MikgfHwgbUlzTW9ub0Rvd25taXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHBlcmZvcm0gYSBkb3dubWl4LCBzbywgd2UgbmVlZCBhdCBsZWFzdCBmdWxsIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIFByZXNlbnRhdGlvbiBtb2RlIDEgYW5kIDIgYWNjb3JkaW5nIHRvIEVUU0kgVFMgMTAxIDE1NDoKKyAgICAgICAgICAgIC8vIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIChEVkIpOyBTcGVjaWZpY2F0aW9uIGZvciB0aGUgdXNlIG9mIFZpZGVvIGFuZCBBdWRpbyBDb2RpbmcKKyAgICAgICAgICAgIC8vIGluIEJyb2FkY2FzdGluZyBBcHBsaWNhdGlvbnMgYmFzZWQgb24gdGhlIE1QRUctMiBUcmFuc3BvcnQgU3RyZWFtLAorICAgICAgICAgICAgLy8gc2VjdGlvbiBDLjUuNC4sICJEZWNvZGluZyIsIGFuZCBUYWJsZSBDLjMzCisgICAgICAgICAgICAvLyBJU08gRFJDICAgICAgICAgICAgLT4gbmV3SGVhdnkgPSAwICAoVXNlIGxpZ2h0IGNvbXByZXNzaW9uLCBNUEVHLXN0eWxlKQorICAgICAgICAgICAgLy8gQ29tcHJlc3Npb25fdmFsdWUgIC0+IG5ld0hlYXZ5ID0gMSAgKFVzZSBoZWF2eSBjb21wcmVzc2lvbiwgRFZCLXN0eWxlKQorICAgICAgICAgICAgLy8gc2NhbGluZyByZXN0cmljdGVkIC0+IG5ld0F0dEZhY3RvciA9IDEyNworCisgICAgICAgICAgICBjYXNlIDE6IC8vIHByZXNlbnRhdGlvbiBtb2RlIDEsIExpZ2h0Oi0zMS9IZWF2eTotMjMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldCA8IDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgdXAgdG8gLTIzIGRCCisgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIC0zMSBkQgorICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOiAvLyBwcmVzZW50YXRpb24gbW9kZSAyLCBMaWdodDotMjMvSGVhdnk6LTIzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCAxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIHVwIHRvIC0yMyBkQgorICAgICAgICAgICAgICAgICAgICBpZiAobUlzTW9ub0Rvd25taXgpIHsgLy8gaWYgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIC0zMSBkQgorICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9IC8vIHN3aXRjaCgpCisgICAgICAgIH0gLy8gaWYgKG1FbmNvZGVyVGFyZ2V0ICA9PSBHUE1fRU5DT0RFUl9UQVJHRVRfTEVWRUwpCisKKyAgICAgICAgLy8gc2FuaXR5IGFnYWluCisgICAgICAgIGlmIChuZXdIZWF2eSA9PSAxKSB7CisgICAgICAgICAgICBuZXdCb29zdEZhY3Rvcj0xMjc7IC8vIG5vdCByZWFsbHkgbmVlZGVkIGFzIHRoZSBzYW1lIHdvdWxkIGJlIGRvbmUgYnkgdGhlIGRlY29kZXIgYW55d2F5CisgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgIH0KKworICAgICAgICAvLyB1cGRhdGUgdGhlIGRlY29kZXIKKyAgICAgICAgaWYgKG5ld1RhcmdldCAhPSBtTGFzdFRhcmdldCkgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwsIG5ld1RhcmdldCk7CisgICAgICAgICAgICBtTGFzdFRhcmdldCA9IG5ld1RhcmdldDsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdUYXJnZXQgIT0gbURlc1RhcmdldCkKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCB0YXJnZXQgbGV2ZWwgdG8gJWQgKGZyb20gJWQpXG4iLCBuZXdUYXJnZXQsIG1EZXNUYXJnZXQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IHRhcmdldCBsZXZlbCB0byAlZFxuIiwgbmV3VGFyZ2V0KTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0F0dEZhY3RvciAhPSBtTGFzdEF0dEZhY3RvcikgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsIG5ld0F0dEZhY3Rvcik7CisgICAgICAgICAgICBtTGFzdEF0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdBdHRGYWN0b3IgIT0gbURlc0F0dEZhY3RvcikKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBhdHRlbnVhdGlvbiBmYWN0b3IgdG8gJWQgKGZyb20gJWQpXG4iLCBuZXdBdHRGYWN0b3IsIG1EZXNBdHRGYWN0b3IpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGF0dGVudWF0aW9uIGZhY3RvciB0byAlZFxuIiwgbmV3QXR0RmFjdG9yKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0Jvb3N0RmFjdG9yICE9IG1MYXN0Qm9vc3RGYWN0b3IpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfQk9PU1RfRkFDVE9SLCBuZXdCb29zdEZhY3Rvcik7CisgICAgICAgICAgICBtTGFzdEJvb3N0RmFjdG9yID0gbmV3Qm9vc3RGYWN0b3I7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3Qm9vc3RGYWN0b3IgIT0gbURlc0Jvb3N0RmFjdG9yKQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGJvb3N0IGZhY3RvciB0byAlZCAoZnJvbSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciwgbURlc0Jvb3N0RmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBib29zdCBmYWN0b3IgdG8gJWRcbiIsIG5ld0Jvb3N0RmFjdG9yKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0hlYXZ5ICE9IG1MYXN0SGVhdnkpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04sIG5ld0hlYXZ5KTsKKyAgICAgICAgICAgIG1MYXN0SGVhdnkgPSBuZXdIZWF2eTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdIZWF2eSAhPSBtRGVzSGVhdnkpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgaGVhdnkgY29tcHJlc3Npb24gdG8gJWQgKGZyb20gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnksIG1EZXNIZWF2eSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgaGVhdnkgY29tcHJlc3Npb24gdG8gJWRcbiIsIG5ld0hlYXZ5KTsKKyNlbmRpZgorICAgICAgICB9CisKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBjb25maWc6IHRndF9sZXY6ICUzZCwgY3V0OiAlM2QsIGJvb3N0OiAlM2QsIGhlYXZ5OiAlZFxuIiwgbmV3VGFyZ2V0LAorICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciwgbmV3Qm9vc3RGYWN0b3IsIG5ld0hlYXZ5KTsKKyNlbmRpZgorICAgICAgICBtRGF0YVVwZGF0ZSA9IGZhbHNlOworCisgICAgfSAvLyBpZiAobURhdGFVcGRhdGUpCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI2Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCisKK3R5cGVkZWYgZW51bQoreworICAgIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCAgICAgICAgID0gMHgwMDAwLAorICAgIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1IgICAgID0gMHgwMDAxLAorICAgIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUiAgID0gMHgwMDAyLAorICAgIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZICAgICAgICAgID0gMHgwMDAzLAorICAgIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVCAgICAgICAgID0gMHgwMDA0Cit9IERSQ19QUkVTX01PREVfV1JBUF9QQVJBTTsKKworCitjbGFzcyBDRHJjUHJlc01vZGVXcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBDRHJjUHJlc01vZGVXcmFwcGVyKCk7CisgICAgfkNEcmNQcmVzTW9kZVdyYXBwZXIoKTsKKyAgICB2b2lkIHNldERlY29kZXJIYW5kbGUoY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgaGFuZGxlKTsKKyAgICB2b2lkIHNldFBhcmFtKGNvbnN0IERSQ19QUkVTX01PREVfV1JBUF9QQVJBTSBwYXJhbSwgY29uc3QgaW50IHZhbHVlKTsKKyAgICB2b2lkIHN1Ym1pdFN0cmVhbURhdGEoQ1N0cmVhbUluZm8qKTsKKyAgICB2b2lkIHVwZGF0ZSgpOworCitwcm90ZWN0ZWQ6CisgICAgSEFORExFX0FBQ0RFQ09ERVIgbUhhbmRsZURlY29kZXI7CisgICAgaW50IG1EZXNUYXJnZXQ7CisgICAgaW50IG1EZXNBdHRGYWN0b3I7CisgICAgaW50IG1EZXNCb29zdEZhY3RvcjsKKyAgICBpbnQgbURlc0hlYXZ5OworCisgICAgaW50IG1FbmNvZGVyVGFyZ2V0OworCisgICAgaW50IG1MYXN0VGFyZ2V0OworICAgIGludCBtTGFzdEF0dEZhY3RvcjsKKyAgICBpbnQgbUxhc3RCb29zdEZhY3RvcjsKKyAgICBpbnQgbUxhc3RIZWF2eTsKKworICAgIFNDSEFSIG1TdHJlYW1QUkw7CisgICAgU0NIQVIgbVN0cmVhbURSQ1ByZXNNb2RlOworICAgIElOVCBtU3RyZWFtTnJBQUNDaGFuOworICAgIElOVCBtU3RyZWFtTnJPdXRDaGFuOworCisgICAgYm9vbCBtSXNEb3dubWl4OworICAgIGJvb2wgbUlzTW9ub0Rvd25taXg7CisgICAgYm9vbCBtSXNTdGVyZW9Eb3dubWl4OworCisgICAgYm9vbCBtRGF0YVVwZGF0ZTsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCmluZGV4IDFiMjBjYmIuLjQwOTI1ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCkBAIC0xNCwyNyArMTQsMzUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiU29mdEFBQzIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRBQUMyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiU29mdEFBQzIuaCIKKyNpbmNsdWRlIDxPTVhfQXVkaW9FeHQuaD4KKyNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogCisjaW5jbHVkZSA8bWF0aC5oPgorCiAjZGVmaW5lIEZJTEVSRUFEX01BWF9MQVlFUlMgMgogCiAjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgNjQgIC8qIDY0Ki0wLjI1ZEIgPSAtMTYgZEIgYmVsb3cgZnVsbCBzY2FsZSBmb3IgbW9iaWxlIGNvbmYgKi8KICNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLwogI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCi0jZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgNiAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZIDEgICAvKiBzd2l0Y2ggZm9yIGhlYXZ5IGNvbXByZXNzaW9uIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMIC0xIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA4ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCiAvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCiAjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCAgImFhY19kcmNfcmVmZXJlbmNlX2xldmVsIgogI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9DVVQgICAgICAgICJhYWNfZHJjX2N1dCIKICNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICJhYWNfZHJjX2VuY190YXJnZXRfbGV2ZWwiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTcsOSArNjUsOSBAQAogICAgICAgbVN0cmVhbUluZm8oTlVMTCksCiAgICAgICBtSXNBRFRTKGZhbHNlKSwKICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAorICAgICAgbU91dHB1dEJ1ZmZlckNvdW50KDApLAogICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKLSAgICAgIG1BbmNob3JUaW1lVXMoMCksCi0gICAgICBtTnVtU2FtcGxlc091dHB1dCgwKSwKKyAgICAgIG1MYXN0SW5IZWFkZXIoTlVMTCksCiAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKICAgICBpbml0UG9ydHMoKTsKICAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOwpAQCAtNjcsNiArNzUsNyBAQAogCiBTb2Z0QUFDMjo6flNvZnRBQUMyKCkgewogICAgIGFhY0RlY29kZXJfQ2xvc2UobUFBQ0RlY29kZXIpOworICAgIGRlbGV0ZSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyOwogfQogCiB2b2lkIFNvZnRBQUMyOjppbml0UG9ydHMoKSB7CkBAIC0xMTEsNiArMTIwLDcgQEAKIH0KIAogc3RhdHVzX3QgU29mdEFBQzI6OmluaXREZWNvZGVyKCkgeworICAgIEFMT0dWKCJpbml0RGVjb2RlcigpIik7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKICAgICBtQUFDRGVjb2RlciA9IGFhY0RlY29kZXJfT3BlbihUVF9NUDRfQURJRiwgLyogbnVtIGxheWVycyAqLyAxKTsKICAgICBpZiAobUFBQ0RlY29kZXIgIT0gTlVMTCkgewpAQCAtMTE5LDM2ICsxMjksNzMgQEAKICAgICAgICAgICAgIHN0YXR1cyA9IE9LOwogICAgICAgICB9CiAgICAgfQotICAgIG1EZWNvZGVySGFzRGF0YSA9IGZhbHNlOwogCi0gICAgLy8gZm9yIHN0cmVhbXMgdGhhdCBjb250YWluIG1ldGFkYXRhLCB1c2UgdGhlIG1vYmlsZSBwcm9maWxlIERSQyBzZXR0aW5ncyB1bmxlc3Mgb3ZlcnJpZGRlbgotICAgIC8vIGJ5IHBsYXRmb3JtIHByb3BlcnRpZXM6CisgICAgbUVuZE9mSW5wdXQgPSBmYWxzZTsKKyAgICBtRW5kT2ZPdXRwdXQgPSBmYWxzZTsKKyAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUgPSAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQgKiBrTnVtRGVsYXlCbG9ja3NNYXg7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlciA9IG5ldyBzaG9ydFttT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZV07CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCA9IDA7CisKKyAgICBpZiAobUFBQ0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQUFDIGRlY29kZXIgaXMgbnVsbC4gVE9ETzogQ2FuIG5vdCBjYWxsIGFhY0RlY29kZXJfU2V0UGFyYW0gaW4gdGhlIGZvbGxvd2luZyBjb2RlIik7CisgICAgfQorCisgICAgLy9hYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX0xJTUlURVJfRU5BQkxFLCAwKTsKKworICAgIC8vaW5pdCBEUkMgd3JhcHBlcgorICAgIG1EcmNXcmFwLnNldERlY29kZXJIYW5kbGUobUFBQ0RlY29kZXIpOworICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworCisgICAgLy8gZm9yIHN0cmVhbXMgdGhhdCBjb250YWluIG1ldGFkYXRhLCB1c2UgdGhlIG1vYmlsZSBwcm9maWxlIERSQyBzZXR0aW5ncyB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBwbGF0Zm9ybSBwcm9wZXJ0aWVzCisgICAgLy8gVE9ETzogY2hhbmdlIHRoZSBEUkMgc2V0dGluZ3MgZGVwZW5kaW5nIG9uIGF1ZGlvIG91dHB1dCBkZXZpY2UgdHlwZSAoSERNSSwgbG9hZHNwZWFrZXIsIGhlYWRwaG9uZSkKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgLy8gICogQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUCiAgICAgaWYgKHByb3BlcnR5X2dldChQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwsIHZhbHVlLCBOVUxMKSkgewogICAgICAgICB1bnNpZ25lZCByZWZMZXZlbCA9IGF0b2kodmFsdWUpOwotICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwgb2YgJWQgaW5zdGVhZCBvZiAlZCIsCi0gICAgICAgICAgICAgICAgcmVmTGV2ZWwsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpOwotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCwgcmVmTGV2ZWwpOworICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBvZiAlZCBpbnN0ZWFkIG9mICVkIiwgcmVmTGV2ZWwsCisgICAgICAgICAgICAgICAgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCk7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCwgcmVmTGV2ZWwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMLCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VULCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKTsKICAgICB9Ci0gICAgLy8gICogQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUgogICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfQ1VULCB2YWx1ZSwgTlVMTCkpIHsKICAgICAgICAgdW5zaWduZWQgY3V0ID0gYXRvaSh2YWx1ZSk7Ci0gICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiBvZiAlZCBpbnN0ZWFkIG9mICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1dCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpOwotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgY3V0KTsKKyAgICAgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGF0dGVudWF0aW9uIGZhY3RvciBvZiAlZCBpbnN0ZWFkIG9mICVkIiwgY3V0LAorICAgICAgICAgICAgICAgIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiwgY3V0KTsKICAgICB9IGVsc2UgewotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SLCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCk7CiAgICAgfQotICAgIC8vICAqIEFBQ19EUkNfQk9PU1RfRkFDVE9SIChub3RlOiBubyBkZWZhdWx0LCB1c2luZyBjdXQpCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUgogICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QsIHZhbHVlLCBOVUxMKSkgewogICAgICAgICB1bnNpZ25lZCBib29zdCA9IGF0b2kodmFsdWUpOwotICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgQUFDX0RSQ19CT09TVF9GQUNUT1Igb2YgJWQiLCBib29zdCk7Ci0gICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19EUkNfQk9PU1RfRkFDVE9SLCBib29zdCk7CisgICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBib29zdCBmYWN0b3Igb2YgJWQgaW5zdGVhZCBvZiAlZCIsIGJvb3N0LAorICAgICAgICAgICAgICAgIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IsIGJvb3N0KTsKICAgICB9IGVsc2UgewotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCk7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUiwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCk7CisgICAgfQorICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWQorICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlksIHZhbHVlLCBOVUxMKSkgeworICAgICAgICB1bnNpZ25lZCBoZWF2eSA9IGF0b2kodmFsdWUpOworICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzcmllZCBEUkMgaGVhdnkgY29tcHJlc3Npb24gc3dpdGNoIG9mICVkIGluc3RlYWQgb2YgJWQiLCBoZWF2eSwKKyAgICAgICAgICAgICAgICBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlksIGhlYXZ5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSk7CisgICAgfQorICAgIC8vIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVAorICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMLCB2YWx1ZSwgTlVMTCkpIHsKKyAgICAgICAgdW5zaWduZWQgZW5jb2RlclJlZkxldmVsID0gYXRvaSh2YWx1ZSk7CisgICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBlbmNvZGVyLXNpZGUgRFJDIHJlZmVyZW5jZSBsZXZlbCBvZiAlZCBpbnN0ZWFkIG9mICVkIiwKKyAgICAgICAgICAgICAgICBlbmNvZGVyUmVmTGV2ZWwsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQsIGVuY29kZXJSZWZMZXZlbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VULCBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMKTsKICAgICB9CiAKICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMjMxLDcgKzI3OCw3IEBACiAKIE9NWF9FUlJPUlRZUEUgU29mdEFBQzI6OmludGVybmFsU2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgewotICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KQEAgLTI2Nyw2ICszMTQsNzEgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY1ByZXNlbnRhdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDUFJFU0VOVEFUSU9OVFlQRSAqYWFjUHJlc1BhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNQUkVTRU5UQVRJT05UWVBFICopcGFyYW1zOworICAgICAgICAgICAgLy8gZm9yIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBvZiB0aGUgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFIHN0cnVjdHVyZSwKKyAgICAgICAgICAgIC8vIGEgdmFsdWUgb2YgLTEgaW1wbGllcyB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uOgorICAgICAgICAgICAgLy8gICBuTWF4T3V0cHV0Q2hhbm5lbHMgICAgIHVzZXMgZGVmYXVsdCBwbGF0Zm9ybSBwcm9wZXJ0aWVzLCBzZWUgY29uZmlndXJlRG93bm1peCgpCisgICAgICAgICAgICAvLyAgIG5EcmNDdXQgICAgICAgICAgICAgICAgdXNlcyBkZWZhdWx0IHBsYXRmb3JtIHByb3BlcnRpZXMsIHNlZSBpbml0RGVjb2RlcigpCisgICAgICAgICAgICAvLyAgIG5EcmNCb29zdCAgICAgICAgICAgICAgICBpZGVtCisgICAgICAgICAgICAvLyAgIG5IZWF2eUNvbXByZXNzaW9uICAgICAgICBpZGVtCisgICAgICAgICAgICAvLyAgIG5UYXJnZXRSZWZlcmVuY2VMZXZlbCAgICBpZGVtCisgICAgICAgICAgICAvLyAgIG5FbmNvZGVkVGFyZ2V0TGV2ZWwgICAgICBpZGVtCisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bk1heE91dHB1dENoYW5uZWxzID49IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgbWF4OworICAgICAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uTWF4T3V0cHV0Q2hhbm5lbHMgPj0gOCkgeyBtYXggPSA4OyB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWFjUHJlc1BhcmFtcy0+bk1heE91dHB1dENoYW5uZWxzID49IDYpIHsgbWF4ID0gNjsgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFhY1ByZXNQYXJhbXMtPm5NYXhPdXRwdXRDaGFubmVscyA+PSAyKSB7IG1heCA9IDI7IH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLTEgb3IgMDogZGlzYWJsZSBkb3dubWl4LCAgMTogbW9ubworICAgICAgICAgICAgICAgICAgICBtYXggPSBhYWNQcmVzUGFyYW1zLT5uTWF4T3V0cHV0Q2hhbm5lbHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbk1heE91dHB1dENoYW5uZWxzPSVkIiwgbWF4KTsKKyAgICAgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMsIG1heCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHVwZGF0ZURyY1dyYXBwZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uRHJjQm9vc3QgPj0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbkRyY0Jvb3N0PSVkIiwgYWFjUHJlc1BhcmFtcy0+bkRyY0Jvb3N0KTsKKyAgICAgICAgICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IsCisgICAgICAgICAgICAgICAgICAgICAgICBhYWNQcmVzUGFyYW1zLT5uRHJjQm9vc3QpOworICAgICAgICAgICAgICAgIHVwZGF0ZURyY1dyYXBwZXIgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5EcmNDdXQgPj0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbkRyY0N1dD0lZCIsIGFhY1ByZXNQYXJhbXMtPm5EcmNDdXQpOworICAgICAgICAgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1IsIGFhY1ByZXNQYXJhbXMtPm5EcmNDdXQpOworICAgICAgICAgICAgICAgIHVwZGF0ZURyY1dyYXBwZXIgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5IZWF2eUNvbXByZXNzaW9uID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5IZWF2eUNvbXByZXNzaW9uPSVkIiwgYWFjUHJlc1BhcmFtcy0+bkhlYXZ5Q29tcHJlc3Npb24pOworICAgICAgICAgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZLAorICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkhlYXZ5Q29tcHJlc3Npb24pOworICAgICAgICAgICAgICAgIHVwZGF0ZURyY1dyYXBwZXIgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5UYXJnZXRSZWZlcmVuY2VMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuVGFyZ2V0UmVmZXJlbmNlTGV2ZWw9JWQiLCBhYWNQcmVzUGFyYW1zLT5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwpOworICAgICAgICAgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5UYXJnZXRSZWZlcmVuY2VMZXZlbCk7CisgICAgICAgICAgICAgICAgdXBkYXRlRHJjV3JhcHBlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bkVuY29kZWRUYXJnZXRMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuRW5jb2RlZFRhcmdldExldmVsPSVkIiwgYWFjUHJlc1BhcmFtcy0+bkVuY29kZWRUYXJnZXRMZXZlbCk7CisgICAgICAgICAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VULAorICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkVuY29kZWRUYXJnZXRMZXZlbCk7CisgICAgICAgICAgICAgICAgdXBkYXRlRHJjV3JhcHBlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+blBDTUxpbWl0ZXJFbmFibGUgPj0gMCkgeworICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTElNSVRFUl9FTkFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAoYWFjUHJlc1BhcmFtcy0+blBDTUxpbWl0ZXJFbmFibGUgIT0gMCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVwZGF0ZURyY1dyYXBwZXIpIHsKKyAgICAgICAgICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KQEAgLTI4OCwxOSArNDAwLDEwMCBAQAogICAgIHJldHVybiBtSW5wdXRCdWZmZXJDb3VudCA+IDA7CiB9CiAKLXZvaWQgU29mdEFBQzI6Om1heWJlQ29uZmlndXJlRG93bm1peCgpIGNvbnN0IHsKLSAgICBpZiAobVN0cmVhbUluZm8tPm51bUNoYW5uZWxzID4gMikgewotICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgIGlmICghKHByb3BlcnR5X2dldCgibWVkaWEuYWFjXzUxX291dHB1dF9lbmFibGVkIiwgdmFsdWUsIE5VTEwpICYmCi0gICAgICAgICAgICAgICAgKCFzdHJjbXAodmFsdWUsICIxIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikpKSkgewotICAgICAgICAgICAgQUxPR0koIkRvd25taXhpbmcgbXVsdGljaGFubmVsIEFBQyB0byBzdGVyZW8iKTsKLSAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fT1VUUFVUX0NIQU5ORUxTLCAyKTsKLSAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyA9IDI7Ci0gICAgICAgIH0KK3ZvaWQgU29mdEFBQzI6OmNvbmZpZ3VyZURvd25taXgoKSBjb25zdCB7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmICghKHByb3BlcnR5X2dldCgibWVkaWEuYWFjXzUxX291dHB1dF9lbmFibGVkIiwgdmFsdWUsIE5VTEwpCisgICAgICAgICAgICAmJiAoIXN0cmNtcCh2YWx1ZSwgIjEiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSkpKSB7CisgICAgICAgIEFMT0dJKCJsaW1pdGluZyB0byBzdGVyZW8gb3V0cHV0Iik7CisgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywgMik7CisgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBkZWNvZGVyIGNyZWF0ZXMgYSA1LjEgY2hhbm5lbCBkb3dubWl4IHNpZ25hbAorICAgICAgICAvLyBmb3Igc2V2ZW4gYW5kIGVpZ2h0IGNoYW5uZWwgaW5wdXQgc3RyZWFtcy4gVG8gZW5hYmxlIDYuMSBhbmQgNy4xIGNoYW5uZWwgb3V0cHV0CisgICAgICAgIC8vIHVzZSBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMsIC0xKQogICAgIH0KIH0KIAotdm9pZCBTb2Z0QUFDMjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworYm9vbCBTb2Z0QUFDMjo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQzMl90IG51bVNhbXBsZXMpIHsKKyAgICBpZiAobnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAob3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgPCBudW1TYW1wbGVzKSB7CisgICAgICAgIEFMT0dFKCJSSU5HIEJVRkZFUiBXT1VMRCBPVkVSRkxPVyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgKyBudW1TYW1wbGVzIDw9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplCisgICAgICAgICAgICAmJiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPD0gbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zCisgICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID4gbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zICsgbnVtU2FtcGxlcykpIHsKKyAgICAgICAgLy8gZmFzdGVyIG1lbWNvcHkgbG9vcCB3aXRob3V0IGNoZWNrcywgaWYgdGhlIHByZWNvbmRpdGlvbnMgYWxsb3cgdGhpcworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zKytdID0gc2FtcGxlc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJzbG93IFNvZnRBQUMyOjpvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKCkiKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zXSA9IHNhbXBsZXNbaV07CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MrKzsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCArPSBudW1TYW1wbGVzOworICAgIHJldHVybiB0cnVlOworfQorCitpbnQzMl90IFNvZnRBQUMyOjpvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludDMyX3QgbnVtU2FtcGxlcykgeworCisgICAgaWYgKG51bVNhbXBsZXMgPiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkKSB7CisgICAgICAgIEFMT0dFKCJSSU5HIEJVRkZFUiBXT1VMRCBVTkRFUlJVTiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICsgbnVtU2FtcGxlcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZQorICAgICAgICAgICAgJiYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zCisgICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArIG51bVNhbXBsZXMpKSB7CisgICAgICAgIC8vIGZhc3RlciBtZW1jb3B5IGxvb3Agd2l0aG91dCBjaGVja3MsIGlmIHRoZSBwcmVjb25kaXRpb25zIGFsbG93IHRoaXMKKyAgICAgICAgaWYgKHNhbXBsZXMgIT0gMCkgeworICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MrK107CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArPSBudW1TYW1wbGVzOworICAgICAgICB9CisgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigic2xvdyBTb2Z0QUFDMjo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcygpIik7CisKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2FtcGxlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3NdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MrKzsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgLT0gbnVtU2FtcGxlczsKKyAgICByZXR1cm4gbnVtU2FtcGxlczsKK30KKworaW50MzJfdCBTb2Z0QUFDMjo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpIHsKKyAgICByZXR1cm4gbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZDsKK30KKworaW50MzJfdCBTb2Z0QUFDMjo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgeworICAgIHJldHVybiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSAtIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKK30KKworCit2b2lkIFNvZnRBQUMyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTMxMiwyNjYgKzUwNSw0NzMgQEAKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIAotICAgIGlmIChwb3J0SW5kZXggPT0gMCAmJiBtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7Ci0gICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gaW5mby0+bUhlYWRlcjsKKyAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgbUVuZE9mSW5wdXQpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIGlmICghaW5RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBJTlRfUENNIHRtcE91dEJ1ZmZlclsyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlRdOworICAgICAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKIAotICAgICAgICBpbkJ1ZmZlclswXSA9IGhlYWRlci0+cEJ1ZmZlciArIGhlYWRlci0+bk9mZnNldDsKLSAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBoZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgICAgICBtRW5kT2ZJbnB1dCA9IChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAhPSAwOwogCi0gICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnIgPQotICAgICAgICAgICAgYWFjRGVjb2Rlcl9Db25maWdSYXcobUFBQ0RlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICEoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmaXJzdCBidWZmZXIgc2hvdWxkIGhhdmUgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgc2V0Iik7CisgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CiAKLSAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgewotICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgaW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaGVhZGVyKTsKLQotICAgICAgICAvLyBPbmx5IHNlbmQgb3V0IHBvcnQgc2V0dGluZ3MgY2hhbmdlZCBldmVudCBpZiBib3RoIHNhbXBsZSByYXRlCi0gICAgICAgIC8vIGFuZCBudW1DaGFubmVscyBhcmUgdmFsaWQuCi0gICAgICAgIGlmIChtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSAmJiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgIG1heWJlQ29uZmlndXJlRG93bm1peCgpOwotICAgICAgICAgICAgQUxPR0koIkluaXRpYWxseSBjb25maWd1cmluZyBkZWNvZGVyOiAlZCBIeiwgJWQgY2hhbm5lbHMiLAotICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7Ci0KLSAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKLSAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewotICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7Ci0KLSAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKLQotICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewotICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotCi0gICAgICAgICAgICBpZiAobURlY29kZXJIYXNEYXRhKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmx1c2ggb3V0IHRoZSBkZWNvZGVyJ3MgZGVsYXllZCBkYXRhIGJ5IGNhbGxpbmcgRGVjb2RlRnJhbWUKLSAgICAgICAgICAgICAgICAvLyBvbmUgbW9yZSB0aW1lLCB3aXRoIHRoZSBBQUNERUNfRkxVU0ggZmxhZyBzZXQKLSAgICAgICAgICAgICAgICBJTlRfUENNICpvdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxJTlRfUENNICo+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQpOworICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwogCiAgICAgICAgICAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVyciA9Ci0gICAgICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkFsbG9jTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0RFQ19GTFVTSCk7Ci0gICAgICAgICAgICAgICAgbURlY29kZXJIYXNEYXRhID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfQ29uZmlnUmF3KG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGgpOwogCiAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiYWFjRGVjb2Rlcl9Db25maWdSYXcgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoaW50MTZfdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgbmV2ZXIgc3VibWl0dGVkIGFueSBkYXRhIHRvIHRoZSBkZWNvZGVyLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gZmx1c2ggb3V0Ci0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJDb3VudCsrOworICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudCsrOyAvLyBmYWtlIGluY3JlYXNlIG9mIG91dHB1dEJ1ZmZlckNvdW50IHRvIGtlZXAgdGhlIGNvdW50ZXJzIGFsaWduZWQKKworICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworCisgICAgICAgICAgICAgICAgY29uZmlndXJlRG93bm1peCgpOworICAgICAgICAgICAgICAgIC8vIE9ubHkgc2VuZCBvdXQgcG9ydCBzZXR0aW5ncyBjaGFuZ2VkIGV2ZW50IGlmIGJvdGggc2FtcGxlIHJhdGUKKyAgICAgICAgICAgICAgICAvLyBhbmQgbnVtQ2hhbm5lbHMgYXJlIHZhbGlkLgorICAgICAgICAgICAgICAgIGlmIChtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSAmJiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkluaXRpYWxseSBjb25maWd1cmluZyBkZWNvZGVyOiAlZCBIeiwgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgbUxhc3RJbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgICAgICAgICBpZiAobUlzQURUUykgeworICAgICAgICAgICAgICAgIHNpemVfdCBhZHRzSGVhZGVyU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgLy8gc2tpcCAzMCBiaXRzLCBhYWNfZnJhbWVfbGVuZ3RoIGZvbGxvd3MuCisgICAgICAgICAgICAgICAgLy8gc3Nzc3Nzc3Mgc3Nzc2lpaXAgcHBmZmZmUGMgY2NvaENDbGwgbGxsbGxsbGwgbGxsPz8/Pz8KIAotICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwotICAgICAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOwotICAgICAgICB9CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYWR0c0hlYWRlciA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CiAKLSAgICAgICAgc2l6ZV90IGFkdHNIZWFkZXJTaXplID0gMDsKLSAgICAgICAgaWYgKG1Jc0FEVFMpIHsKLSAgICAgICAgICAgIC8vIHNraXAgMzAgYml0cywgYWFjX2ZyYW1lX2xlbmd0aCBmb2xsb3dzLgotICAgICAgICAgICAgLy8gc3Nzc3Nzc3Mgc3Nzc2lpaXAgcHBmZmZmUGMgY2NvaENDbGwgbGxsbGxsbGwgbGxsPz8/Pz8KLQotICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYWR0c0hlYWRlciA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7Ci0KLSAgICAgICAgICAgIGJvb2wgc2lnbmFsRXJyb3IgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA8IDcpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW8gZGF0YSB0b28gc2hvcnQgdG8gY29udGFpbiBldmVuIHRoZSBBRFRTIGhlYWRlci4gIgotICAgICAgICAgICAgICAgICAgICAgICJHb3QgJWxkIGJ5dGVzLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKLSAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKLSAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJvb2wgcHJvdGVjdGlvbkFic2VudCA9IChhZHRzSGVhZGVyWzFdICYgMSk7Ci0KLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBhYWNfZnJhbWVfbGVuZ3RoID0KLSAgICAgICAgICAgICAgICAgICAgKChhZHRzSGVhZGVyWzNdICYgMykgPDwgMTEpCi0gICAgICAgICAgICAgICAgICAgIHwgKGFkdHNIZWFkZXJbNF0gPDwgMykKLSAgICAgICAgICAgICAgICAgICAgfCAoYWR0c0hlYWRlcls1XSA+PiA1KTsKLQotICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA8IGFhY19mcmFtZV9sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYXVkaW8gZGF0YSBmb3IgdGhlIGNvbXBsZXRlIGZyYW1lLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJWxkIGJ5dGVzLCBmcmFtZSBzaXplIGFjY29yZGluZyB0byB0aGUgQURUUyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFkZXIgaXMgJXUgYnl0ZXMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4sIGFhY19mcmFtZV9sZW5ndGgpOworICAgICAgICAgICAgICAgIGJvb2wgc2lnbmFsRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPCA3KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBkYXRhIHRvbyBzaG9ydCB0byBjb250YWluIGV2ZW4gdGhlIEFEVFMgaGVhZGVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlZCBieXRlcy4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAgICAgICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWR0c0hlYWRlclNpemUgPSAocHJvdGVjdGlvbkFic2VudCA/IDcgOiA5KTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm90ZWN0aW9uQWJzZW50ID0gKGFkdHNIZWFkZXJbMV0gJiAxKTsKIAotICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlclswXSA9IChVQ0hBUiAqKWFkdHNIZWFkZXIgKyBhZHRzSGVhZGVyU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBhYWNfZnJhbWVfbGVuZ3RoIC0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFhY19mcmFtZV9sZW5ndGggPQorICAgICAgICAgICAgICAgICAgICAgICAgKChhZHRzSGVhZGVyWzNdICYgMykgPDwgMTEpCisgICAgICAgICAgICAgICAgICAgICAgICB8IChhZHRzSGVhZGVyWzRdIDw8IDMpCisgICAgICAgICAgICAgICAgICAgICAgICB8IChhZHRzSGVhZGVyWzVdID4+IDUpOwogCi0gICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0ICs9IGFkdHNIZWFkZXJTaXplOwotICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuIDwgYWFjX2ZyYW1lX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYXVkaW8gZGF0YSBmb3IgdGhlIGNvbXBsZXRlIGZyYW1lLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJWQgYnl0ZXMsIGZyYW1lIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBBRFRTICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyAldSBieXRlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwgYWFjX2ZyYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdHNIZWFkZXJTaXplID0gKHByb3RlY3Rpb25BYnNlbnQgPyA3IDogOSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gKFVDSEFSICopYWR0c0hlYWRlciArIGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBhYWNfZnJhbWVfbGVuZ3RoIC0gYWR0c0hlYWRlclNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0ICs9IGFkdHNIZWFkZXJTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gLT0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc2lnbmFsRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JTdHJlYW1Db3JydXB0LCBFUlJPUl9NQUxGT1JNRUQsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGJ1ZmZlciBzaXplIGFuZCB0aW1lIHN0YW1wCisgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemVzLmFkZChpbkJ1ZmZlckxlbmd0aFswXSk7CisgICAgICAgICAgICAgICAgaWYgKG1MYXN0SW5IZWFkZXIgIT0gaW5IZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMuYWRkKGluSGVhZGVyLT5uVGltZVN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RJbkhlYWRlciA9IGluSGVhZGVyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFRpbWUgPSBtQnVmZmVyVGltZXN0YW1wcy50b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFRpbWUgKz0gbVN0cmVhbUluZm8tPmFhY1NhbXBsZXNQZXJGcmFtZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsIC8gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJUaW1lc3RhbXBzLmFkZChjdXJyZW50VGltZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlclswXSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gaW5IZWFkZXI7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMuYWRkKGluSGVhZGVyLT5uVGltZVN0YW1wKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMuYWRkKGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHNpZ25hbEVycm9yKSB7Ci0gICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIEZpbGwgYW5kIGRlY29kZQorICAgICAgICAgICAgYnl0ZXNWYWxpZFswXSA9IGluQnVmZmVyTGVuZ3RoWzBdOwogCi0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXJyb3JTdHJlYW1Db3JydXB0LAotICAgICAgICAgICAgICAgICAgICAgICBFUlJPUl9NQUxGT1JNRUQsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgSU5UIHByZXZTYW1wbGVSYXRlID0gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgICAgICBJTlQgcHJldk51bUNoYW5uZWxzID0gbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwotICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpbGwgYW5kIGRlY29kZQotICAgICAgICBJTlRfUENNICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PElOVF9QQ00gKj4oCi0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKLQotICAgICAgICBieXRlc1ZhbGlkWzBdID0gaW5CdWZmZXJMZW5ndGhbMF07Ci0KLSAgICAgICAgaW50IHByZXZTYW1wbGVSYXRlID0gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7Ci0gICAgICAgIGludCBwcmV2TnVtQ2hhbm5lbHMgPSBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7Ci0KLSAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVyciA9IEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTOwotICAgICAgICB3aGlsZSAoYnl0ZXNWYWxpZFswXSA+IDAgJiYgZGVjb2RlckVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgewogICAgICAgICAgICAgYWFjRGVjb2Rlcl9GaWxsKG1BQUNEZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzVmFsaWQpOwotICAgICAgICAgICAgbURlY29kZXJIYXNEYXRhID0gdHJ1ZTsKIAotICAgICAgICAgICAgZGVjb2RlckVyciA9IGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5BbGxvY0xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8pOworICAgICAgICAgICAgLy8gcnVuIERSQyBjaGVjaworICAgICAgICAgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisgICAgICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKIAotICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFMpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiTm90IGVub3VnaCBiaXRzLCBieXRlc1ZhbGlkICVkIiwgYnl0ZXNWYWxpZFswXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbnVtT3V0Qnl0ZXMgPQotICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKLQotICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX09LKSB7CiAgICAgICAgICAgICBVSU5UIGluQnVmZmVyVXNlZExlbmd0aCA9IGluQnVmZmVyTGVuZ3RoWzBdIC0gYnl0ZXNWYWxpZFswXTsKICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuIC09IGluQnVmZmVyVXNlZExlbmd0aDsKICAgICAgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0ICs9IGluQnVmZmVyVXNlZExlbmd0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJBQUMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAlZCwgc3Vic3RpdHV0aW5nIHNpbGVuY2UiLAotICAgICAgICAgICAgICAgICAgZGVjb2RlckVycik7CiAKLSAgICAgICAgICAgIG1lbXNldChvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQsIDAsIG51bU91dEJ5dGVzKTsKKyAgICAgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnI7CisgICAgICAgICAgICBpbnQgbnVtTG9vcHMgPSAwOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKSA8CisgICAgICAgICAgICAgICAgICAgICAgICAobVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGRlY29kZTogbm90IGVub3VnaCBzcGFjZSBsZWZ0IGluIHJpbmdidWZmZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBEaXNjYXJkIGlucHV0IGJ1ZmZlci4KLSAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbnVtQ29uc3VtZWQgPSBtU3RyZWFtSW5mby0+bnVtVG90YWxCeXRlczsKKyAgICAgICAgICAgICAgICBkZWNvZGVyRXJyID0gYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8pOwogCi0gICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfVFBERUNfQ0xFQVJfQlVGRkVSLCAxKTsKKyAgICAgICAgICAgICAgICBudW1Db25zdW1lZCA9IG1TdHJlYW1JbmZvLT5udW1Ub3RhbEJ5dGVzIC0gbnVtQ29uc3VtZWQ7CisgICAgICAgICAgICAgICAgbnVtTG9vcHMrKzsKIAotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1EZWNvZGVkU2l6ZXMuYWRkKG51bUNvbnN1bWVkKTsKKworICAgICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImFhY0RlY29kZXJfRGVjb2RlRnJhbWUgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNWYWxpZFswXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJieXRlc1ZhbGlkWzBdICE9IDAgc2hvdWxkIG5ldmVyIGhhcHBlbiIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzaXplX3QgbnVtT3V0Qnl0ZXMgPQorICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworCisgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkFBQyBkZWNvZGVyIHJldHVybmVkIGVycm9yIDB4JTQuNHgsIHN1YnN0aXR1dGluZyBzaWxlbmNlIiwgZGVjb2RlckVycik7CisKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHRtcE91dEJ1ZmZlciwgMCwgbnVtT3V0Qnl0ZXMpOyAvLyBUT0RPOiBjaGVjayBmb3Igb3ZlcmZsb3cKKworICAgICAgICAgICAgICAgICAgICBpZiAoIW91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRGlzY2FyZCBpbnB1dCBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiwgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQWZ0ZXIgYW4gZXJyb3IsIHJlcGxhY2UgdGhlIGxhc3QgZW50cnkgaW4gbUJ1ZmZlclNpemVzIHdpdGggdGhlIHN1bSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCA8bnVtTG9vcHM+IGVudHJpZXMgZnJvbSBtRGVjb2RlZFNpemVzIHRvIHJlc3luY2hyb25pemUgdGhlIGluL291dCBsaXN0cy4KKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemVzLnBvcCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTG9vcHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgbiArPSBtRGVjb2RlZFNpemVzLml0ZW1BdChtRGVjb2RlZFNpemVzLnNpemUoKSAtIG51bUxvb3BzICsgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemVzLmFkZChuKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFBQysvZUFBQysgc3RyZWFtcyBjYW4gYmUgc2lnbmFsbGVkIGluIHR3byB3YXlzOiBlaXRoZXIgZXhwbGljaXRseQorICAgICAgICAgICAgICAgICAqIG9yIGltcGxpY2l0bHksIGFjY29yZGluZyB0byBNUEVHNCBzcGVjLiBBQUMrL2VBQUMrIGlzIGEgZHVhbAorICAgICAgICAgICAgICAgICAqIHJhdGUgc3lzdGVtIGFuZCB0aGUgc2FtcGxpbmcgcmF0ZSBpbiB0aGUgZmluYWwgb3V0cHV0IGlzIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICogZG91YmxlZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JlIEFBQyBkZWNvZGVyIHNhbXBsaW5nIHJhdGUuCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBFeHBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZXhwbGljaXRseSBkZWZpbmluZyBTQlIgYXVkaW8gb2JqZWN0CisgICAgICAgICAgICAgICAgICogdHlwZSBpbiB0aGUgYml0c3RyZWFtLiBJbXBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZW1iZWRkaW5nCisgICAgICAgICAgICAgICAgICogU0JSIGNvbnRlbnQgaW4gQUFDIGV4dGVuc2lvbiBwYXlsb2FkIHNwZWNpZmljIHRvIFNCUiwgYW5kIGhlbmNlCisgICAgICAgICAgICAgICAgICogcmVxdWlyZXMgYW4gQUFDIGRlY29kZXIgdG8gcGVyZm9ybSBwcmUtY2hlY2tzIG9uIGFjdHVhbCBhdWRpbyBmcmFtZXMuCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBUaHVzLCB3ZSBjb3VsZCBub3Qgc2F5IGZvciBzdXJlIHdoZXRoZXIgYSBzdHJlYW0gaXMKKyAgICAgICAgICAgICAgICAgKiBBQUMrL2VBQUMrIHVudGlsIHRoZSBmaXJzdCBkYXRhIGZyYW1lIGlzIGRlY29kZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50IDw9IDIgfHwgbU91dHB1dEJ1ZmZlckNvdW50ID4gMSkgeyAvLyBUT0RPOiA8PSAxCisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSAhPSBwcmV2U2FtcGxlUmF0ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzICE9IHByZXZOdW1DaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koIlJlY29uZmlndXJpbmcgZGVjb2RlcjogJWQtPiVkIEh6LCAlZC0+JWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlNhbXBsZVJhdGUsIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldk51bUNoYW5uZWxzLCBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlciAmJiBpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlIHx8ICFtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkludmFsaWQgQUFDIHN0cmVhbSIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyICYmIGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RJbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiaW5IZWFkZXItPm5GaWxsZWRMZW4gPSAlZCIsIGluSGVhZGVyID8gaW5IZWFkZXItPm5GaWxsZWRMZW4gOiAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0spOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKLSAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKLSAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0gICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgIGludDMyX3Qgb3V0cHV0RGVsYXkgPSBtU3RyZWFtSW5mby0+b3V0cHV0RGVsYXkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAgICAgaWYgKCFtRW5kT2ZJbnB1dCAmJiBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA8IG91dHB1dERlbGF5KSB7CisgICAgICAgICAgICAvLyBkaXNjYXJkIG91dHB1dERlbGF5IGF0IHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgIGludDMyX3QgdG9Db21wZW5zYXRlID0gb3V0cHV0RGVsYXkgLSBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICAgICAgICAgIGludDMyX3QgZGlzY2FyZCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgIGlmIChkaXNjYXJkID4gdG9Db21wZW5zYXRlKSB7CisgICAgICAgICAgICAgICAgZGlzY2FyZCA9IHRvQ29tcGVuc2F0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgZGlzY2FyZGVkID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcygwLCBkaXNjYXJkKTsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkICs9IGRpc2NhcmRlZDsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogQUFDKy9lQUFDKyBzdHJlYW1zIGNhbiBiZSBzaWduYWxsZWQgaW4gdHdvIHdheXM6IGVpdGhlciBleHBsaWNpdGx5Ci0gICAgICAgICAqIG9yIGltcGxpY2l0bHksIGFjY29yZGluZyB0byBNUEVHNCBzcGVjLiBBQUMrL2VBQUMrIGlzIGEgZHVhbAotICAgICAgICAgKiByYXRlIHN5c3RlbSBhbmQgdGhlIHNhbXBsaW5nIHJhdGUgaW4gdGhlIGZpbmFsIG91dHB1dCBpcyBhY3R1YWxseQotICAgICAgICAgKiBkb3VibGVkIGNvbXBhcmVkIHdpdGggdGhlIGNvcmUgQUFDIGRlY29kZXIgc2FtcGxpbmcgcmF0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogRXhwbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGV4cGxpY2l0bHkgZGVmaW5pbmcgU0JSIGF1ZGlvIG9iamVjdAotICAgICAgICAgKiB0eXBlIGluIHRoZSBiaXRzdHJlYW0uIEltcGxpY2l0IHNpZ25hbGxpbmcgaXMgZG9uZSBieSBlbWJlZGRpbmcKLSAgICAgICAgICogU0JSIGNvbnRlbnQgaW4gQUFDIGV4dGVuc2lvbiBwYXlsb2FkIHNwZWNpZmljIHRvIFNCUiwgYW5kIGhlbmNlCi0gICAgICAgICAqIHJlcXVpcmVzIGFuIEFBQyBkZWNvZGVyIHRvIHBlcmZvcm0gcHJlLWNoZWNrcyBvbiBhY3R1YWwgYXVkaW8gZnJhbWVzLgotICAgICAgICAgKgotICAgICAgICAgKiBUaHVzLCB3ZSBjb3VsZCBub3Qgc2F5IGZvciBzdXJlIHdoZXRoZXIgYSBzdHJlYW0gaXMKLSAgICAgICAgICogQUFDKy9lQUFDKyB1bnRpbCB0aGUgZmlyc3QgZGF0YSBmcmFtZSBpcyBkZWNvZGVkLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50IDw9IDIpIHsKLSAgICAgICAgICAgIGlmIChtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSAhPSBwcmV2U2FtcGxlUmF0ZSB8fAotICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyAhPSBwcmV2TnVtQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgICAgICBtYXliZUNvbmZpZ3VyZURvd25taXgoKTsKLSAgICAgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCi0gICAgICAgICAgICAgICAgICAgICAgcHJldlNhbXBsZVJhdGUsIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgIHByZXZOdW1DaGFubmVscywgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKyAgICAgICAgaWYgKG1FbmRPZklucHV0KSB7CisgICAgICAgICAgICB3aGlsZSAobU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gYSBidWZmZXIgYmlnIGVub3VnaCBmb3IgTUFYX0NIQU5ORUxfQ09VTlQgY2hhbm5lbHMgb2YgZGVjb2RlZCBIRS1BQUMKKyAgICAgICAgICAgICAgICBJTlRfUENNIHRtcE91dEJ1ZmZlclsyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlRdOworIAorICAgICAgICAgICAgICAgICAvLyBydW4gRFJDIGNoZWNrCisgICAgICAgICAgICAgICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworICAgICAgICAgICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKIAotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVyciA9CisgICAgICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNERUNfRkxVU0gpOworICAgICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImFhY0RlY29kZXJfRGVjb2RlRnJhbWUgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHRtcE91dEJ1ZmZlclNhbXBsZXMgPSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICAgICAgICAgIGlmICh0bXBPdXRCdWZmZXJTYW1wbGVzID4gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wT3V0QnVmZmVyU2FtcGxlcyA9IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwgdG1wT3V0QnVmZmVyU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgLT0gdG1wT3V0QnVmZmVyU2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICghb3V0UXVldWUuZW1wdHkoKQorICAgICAgICAgICAgICAgICYmIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPj0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgICAgIGlmIChvdXRIZWFkZXItPm5PZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvdXRIZWFkZXItPm5PZmZzZXQgIT0gMCBpcyBub3QgaGFuZGxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgfHwgIW1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgewotICAgICAgICAgICAgQUxPR1coIkludmFsaWQgQUFDIHN0cmVhbSIpOwotICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQogCi0gICAgICAgIGlmIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0sgfHwgbU51bVNhbXBsZXNPdXRwdXQgPiAwKSB7Ci0gICAgICAgICAgICAvLyBXZSdsbCBvbmx5IG91dHB1dCBkYXRhIGlmIHdlIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGl0IG9yCi0gICAgICAgICAgICAvLyB3ZSd2ZSBwcmV2aW91c2x5IGRlY29kZWQgdmFsaWQgZGF0YSwgaW4gdGhlIGxhdHRlciBjYXNlCi0gICAgICAgICAgICAvLyAoZGVjb2RlIGZhaWxlZCkgd2UnbGwgb3V0cHV0IGEgc2lsZW50IGZyYW1lLgotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbnVtT3V0Qnl0ZXM7Ci0gICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgICAgICBJTlRfUENNICpvdXRCdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PElOVF9QQ00gKj4ob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKKyAgICAgICAgICAgIGludCBzYW1wbGVzaXplID0gbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgaWYgKG91dEhlYWRlci0+bk9mZnNldAorICAgICAgICAgICAgICAgICAgICArIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBzYW1wbGVzaXplCisgICAgICAgICAgICAgICAgICAgID4gb3V0SGVhZGVyLT5uQWxsb2NMZW4pIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIG92ZXJmbG93Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPQotICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKLSAgICAgICAgICAgICAgICAgICAgKyAobU51bVNhbXBsZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0ICs9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemU7CisgICAgICAgICAgICBpbnQgYXZhaWxhYmxlID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgaW50IG51bVNhbXBsZXMgPSBvdXRIZWFkZXItPm5BbGxvY0xlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIGlmIChudW1TYW1wbGVzID4gYXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyA9IGF2YWlsYWJsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDY0X3QgY3VycmVudFRpbWUgPSAwOworICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSkgewogCisgICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcyA9IG51bVNhbXBsZXMgLyAobVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIChtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKworICAgICAgICAgICAgICAgIEFMT0dWKCIlZCBzYW1wbGVzIGF2YWlsYWJsZSAoJWQpLCBvciAlZCBmcmFtZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywgYXZhaWxhYmxlLCBudW1GcmFtZXMpOworICAgICAgICAgICAgICAgIGludDY0X3QgKm5leHRUaW1lU3RhbXAgPSAmbUJ1ZmZlclRpbWVzdGFtcHMuZWRpdEl0ZW1BdCgwKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50VGltZSA9ICpuZXh0VGltZVN0YW1wOworICAgICAgICAgICAgICAgIGludDMyX3QgKmN1cnJlbnRCdWZMZWZ0ID0gJm1CdWZmZXJTaXplcy5lZGl0SXRlbUF0KDApOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWNvZGVkU2l6ZSA9IG1EZWNvZGVkU2l6ZXMuaXRlbUF0KDApOworICAgICAgICAgICAgICAgICAgICBtRGVjb2RlZFNpemVzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZGVjb2RlZCAlZCBvZiAlZCIsIGRlY29kZWRTaXplLCAqY3VycmVudEJ1ZkxlZnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmN1cnJlbnRCdWZMZWZ0ID4gZGVjb2RlZFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkanVzdC9pbnRlcnBvbGF0ZSBuZXh0IHRpbWUgc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICpjdXJyZW50QnVmTGVmdCAtPSBkZWNvZGVkU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0VGltZVN0YW1wICs9IG1TdHJlYW1JbmZvLT5hYWNTYW1wbGVzUGVyRnJhbWUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgLyBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhZGp1c3RlZCBuZXh0VGltZVN0YW1wL3NpemUgdG8gJWxsZC8lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0VGltZVN0YW1wLCAqY3VycmVudEJ1ZkxlZnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IHRpbWVzdGFtcCBpbiBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlclRpbWVzdGFtcHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJUaW1lc3RhbXBzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUaW1lU3RhbXAgPSAmbUJ1ZmZlclRpbWVzdGFtcHMuZWRpdEl0ZW1BdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMucmVtb3ZlQXQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZkxlZnQgPSAmbUJ1ZmZlclNpemVzLmVkaXRJdGVtQXQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1vdmVkIHRvIG5leHQgdGltZS9zaXplOiAlbGxkLyVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0VGltZVN0YW1wLCAqY3VycmVudEJ1ZkxlZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGxpbWl0IG91dHB1dCBidWZmZXIgc2l6ZSB0byBtYXRjaCBpbnB1dCBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZS5nIHdoZW4gYW4gaW5wdXQgYnVmZmVyIGNvbnRhaW5lZCA0ICJzdWIiIGZyYW1lcywgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCBtb3N0IDQgZGVjb2RlZCB1bml0cyBpbiB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgYnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBvcHRpb25hbC4gUmVtb3ZlIHRoZSBuZXh0IHRocmVlIGxpbmVzIHRvIGZpbGwgdGhlIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyIHdpdGggYXMgbWFueSB1bml0cyBhcyBhdmFpbGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMgPSBpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgPSBudW1GcmFtZXMgKiBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBTE9HVigiZ2V0dGluZyAlZCBmcm9tIHJpbmdidWZmZXIiLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG5zID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhvdXRCdWZmZXIsIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIGlmIChucyAhPSBudW1TYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG51bVNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgICAgIGlmIChtRW5kT2ZJbnB1dCAmJiAhb3V0UXVldWUuZW1wdHkoKSAmJiBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgIG1FbmRPZk91dHB1dCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gY3VycmVudFRpbWU7CisKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudCsrOwogICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgIEFMT0dWKCJvdXQgdGltZXN0YW1wICVsbGQgLyAlZCIsIG91dEhlYWRlci0+blRpbWVTdGFtcCwgb3V0SGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CiAgICAgICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19PSykgewotICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgaWYgKG1FbmRPZklucHV0KSB7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpID4gMAorICAgICAgICAgICAgICAgICAgICAmJiBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibm90IGEgY29tcGxldGUgZnJhbWUgb2Ygc2FtcGxlcyBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRW5kT2ZJbnB1dCAmJiAhb3V0UXVldWUuZW1wdHkoKSAmJiBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICghbUVuZE9mT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgZW1wdHkgYmxvY2sgc2lnbmFsaW5nIEVPUworICAgICAgICAgICAgICAgICAgICBtRW5kT2ZPdXRwdXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworCisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRIZWFkZXItPm5PZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm91dEhlYWRlci0+bk9mZnNldCAhPSAwIGlzIG5vdCBoYW5kbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxJTlRfUENNICo+KG91dEhlYWRlci0+cEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBucyA9IDA7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IG1CdWZmZXJUaW1lc3RhbXBzLml0ZW1BdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVkU2l6ZXMuY2xlYXIoKTsKKworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZiBvdXRRdWV1ZSBub3QgZW1wdHkgYnV0IG5vIG1vcmUgb3V0cHV0CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC01ODIsMjggKzk4Miw3NyBAQAogICAgICAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCiAgICAgICAgIC8vIGRyYWluIGFsbCBleGlzdGluZyBkYXRhCiAgICAgICAgIGRyYWluRGVjb2RlcigpOworICAgICAgICBtQnVmZmVyVGltZXN0YW1wcy5jbGVhcigpOworICAgICAgICBtQnVmZmVyU2l6ZXMuY2xlYXIoKTsKKyAgICAgICAgbURlY29kZWRTaXplcy5jbGVhcigpOworICAgICAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgYXZhaWw7CisgICAgICAgIHdoaWxlICgoYXZhaWwgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkpID4gMCkgeworICAgICAgICAgICAgaWYgKGF2YWlsID4gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgICAgIGF2YWlsID0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgbnMgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKDAsIGF2YWlsKTsKKyAgICAgICAgICAgIGlmIChucyAhPSBhdmFpbCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CiAgICAgfQogfQogCiB2b2lkIFNvZnRBQUMyOjpkcmFpbkRlY29kZXIoKSB7Ci0gICAgLy8gYSBidWZmZXIgYmlnIGVub3VnaCBmb3IgNiBjaGFubmVscyBvZiBkZWNvZGVkIEhFLUFBQwotICAgIHNob3J0IGJ1ZiBbMjA0OCo2XTsKLSAgICBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAotICAgICAgICAgICAgYnVmLCBzaXplb2YoYnVmKSwgQUFDREVDX0ZMVVNIIHwgQUFDREVDX0NMUkhJU1QgfCBBQUNERUNfSU5UUik7Ci0gICAgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKLSAgICAgICAgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZiksIEFBQ0RFQ19GTFVTSCB8IEFBQ0RFQ19DTFJISVNUIHwgQUFDREVDX0lOVFIpOwotICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19UUERFQ19DTEVBUl9CVUZGRVIsIDEpOwotICAgIG1EZWNvZGVySGFzRGF0YSA9IGZhbHNlOworICAgIGludDMyX3Qgb3V0cHV0RGVsYXkgPSBtU3RyZWFtSW5mby0+b3V0cHV0RGVsYXkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAvLyBmbHVzaCBkZWNvZGVyIHVudGlsIG91dHB1dERlbGF5IGlzIGNvbXBlbnNhdGVkCisgICAgd2hpbGUgKG1PdXRwdXREZWxheUNvbXBlbnNhdGVkID4gMCkgeworICAgICAgICAvLyBhIGJ1ZmZlciBiaWcgZW5vdWdoIGZvciBNQVhfQ0hBTk5FTF9DT1VOVCBjaGFubmVscyBvZiBkZWNvZGVkIEhFLUFBQworICAgICAgICBJTlRfUENNIHRtcE91dEJ1ZmZlclsyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlRdOworCisgICAgICAgIC8vIHJ1biBEUkMgY2hlY2sKKyAgICAgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOworCisgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnIgPQorICAgICAgICAgICAgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0RFQ19GTFVTSCk7CisgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJhYWNEZWNvZGVyX0RlY29kZUZyYW1lIGRlY29kZXJFcnIgPSAweCU0LjR4IiwgZGVjb2RlckVycik7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHRtcE91dEJ1ZmZlclNhbXBsZXMgPSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICBpZiAodG1wT3V0QnVmZmVyU2FtcGxlcyA+IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkKSB7CisgICAgICAgICAgICB0bXBPdXRCdWZmZXJTYW1wbGVzID0gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyh0bXBPdXRCdWZmZXIsIHRtcE91dEJ1ZmZlclNhbXBsZXMpOworCisgICAgICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkIC09IHRtcE91dEJ1ZmZlclNhbXBsZXM7CisgICAgfQogfQogCiB2b2lkIFNvZnRBQUMyOjpvblJlc2V0KCkgewogICAgIGRyYWluRGVjb2RlcigpOwogICAgIC8vIHJlc2V0IHRoZSAiY29uZmlndXJlZCIgc3RhdGUKICAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7Ci0gICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICAgIG1PdXRwdXRCdWZmZXJDb3VudCA9IDA7CisgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgPSAwOworICAgIG1FbmRPZklucHV0ID0gZmFsc2U7CisgICAgbUVuZE9mT3V0cHV0ID0gZmFsc2U7CisgICAgbUJ1ZmZlclRpbWVzdGFtcHMuY2xlYXIoKTsKKyAgICBtQnVmZmVyU2l6ZXMuY2xlYXIoKTsKKyAgICBtRGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgbUxhc3RJbkhlYWRlciA9IE5VTEw7CisKICAgICAvLyBUbyBtYWtlIHRoZSBjb2RlYyBiZWhhdmUgdGhlIHNhbWUgYmVmb3JlIGFuZCBhZnRlciBhIHJlc2V0LCB3ZSBuZWVkIHRvIGludmFsaWRhdGUgdGhlCiAgICAgLy8gc3RyZWFtaW5mbyBzdHJ1Y3QuIFRoaXMgZG9lcyB0aGF0OgotICAgIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlID0gMDsKKyAgICBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSA9IDA7IC8vIFRPRE86IG1TdHJlYW1JbmZvIGlzIHJlYWQgb25seQogCiAgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmgKaW5kZXggMmQ5NjBhYi4uYzNlNDQ1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKIAogI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCisjaW5jbHVkZSAiRHJjUHJlc01vZGVXcmFwLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDcsMTYgKzQ4LDIyIEBACiAgICAgZW51bSB7CiAgICAgICAgIGtOdW1JbnB1dEJ1ZmZlcnMgICAgICAgID0gNCwKICAgICAgICAga051bU91dHB1dEJ1ZmZlcnMgICAgICAgPSA0LAorICAgICAgICBrTnVtRGVsYXlCbG9ja3NNYXggICAgICA9IDgsCiAgICAgfTsKIAogICAgIEhBTkRMRV9BQUNERUNPREVSIG1BQUNEZWNvZGVyOwogICAgIENTdHJlYW1JbmZvICptU3RyZWFtSW5mbzsKICAgICBib29sIG1Jc0FEVFM7Ci0gICAgYm9vbCBtRGVjb2Rlckhhc0RhdGE7CisgICAgYm9vbCBtSXNGaXJzdDsKICAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisgICAgc2l6ZV90IG1PdXRwdXRCdWZmZXJDb3VudDsKICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKLSAgICBpbnQ2NF90IG1BbmNob3JUaW1lVXM7Ci0gICAgaW50NjRfdCBtTnVtU2FtcGxlc091dHB1dDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqbUxhc3RJbkhlYWRlcjsKKyAgICBWZWN0b3I8aW50MzJfdD4gbUJ1ZmZlclNpemVzOworICAgIFZlY3RvcjxpbnQzMl90PiBtRGVjb2RlZFNpemVzOworICAgIFZlY3RvcjxpbnQ2NF90PiBtQnVmZmVyVGltZXN0YW1wczsKKworICAgIENEcmNQcmVzTW9kZVdyYXBwZXIgbURyY1dyYXA7CiAKICAgICBlbnVtIHsKICAgICAgICAgTk9ORSwKQEAgLTY3LDkgKzc0LDIzIEBACiAgICAgdm9pZCBpbml0UG9ydHMoKTsKICAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOwogICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7Ci0gICAgdm9pZCBtYXliZUNvbmZpZ3VyZURvd25taXgoKSBjb25zdDsKKyAgICB2b2lkIGNvbmZpZ3VyZURvd25taXgoKSBjb25zdDsKICAgICB2b2lkIGRyYWluRGVjb2RlcigpOwogCisvLyAgICAgIGRlbGF5IGNvbXBlbnNhdGlvbgorICAgIGJvb2wgbUVuZE9mSW5wdXQ7CisgICAgYm9vbCBtRW5kT2ZPdXRwdXQ7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgIHNob3J0ICptT3V0cHV0RGVsYXlSaW5nQnVmZmVyOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3M7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworICAgIGJvb2wgb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQgbnVtU2FtcGxlcyk7CisgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludCBudW1TYW1wbGVzKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEFBQzIpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rCmluZGV4IDA1N2M2OWIuLjU4ZWMzYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsKQEAgLTgyLDYgKzgyLDggQEAKIExPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMvYXNtL0FSTVY3CiBlbmRpZgogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xMDYsNiArMTA4LDggQEAKIAogICBMT0NBTF9DRkxBR1MgOj0KIAorICBMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiAgIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliRnJhdW5ob2ZlckFBQwogCiAgIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApAQCAtMTI4LDYgKzEzMiw4IEBACiAKICAgTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9JTVBPUlRfUkVGPQogCisgIExPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKICAgTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZW5jCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcAppbmRleCBmZjJiNTAzLi4zNWFhODgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJTb2Z0QUFDRW5jb2RlcjIuaCIKKyNpbmNsdWRlIDxPTVhfQXVkaW9FeHQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CkBAIC00NCw2ICs0NSw4IEBACiAgICAgICBtTnVtQ2hhbm5lbHMoMSksCiAgICAgICBtU2FtcGxlUmF0ZSg0NDEwMCksCiAgICAgICBtQml0UmF0ZSgwKSwKKyAgICAgIG1TQlJNb2RlKC0xKSwKKyAgICAgIG1TQlJSYXRpbygwKSwKICAgICAgIG1BQUNQcm9maWxlKE9NWF9BVURJT19BQUNPYmplY3RMQyksCiAgICAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhKGZhbHNlKSwKICAgICAgIG1JbnB1dFNpemUoMCksCkBAIC0xNTYsNiArMTU5LDQxIEBACiAgICAgICAgICAgICBhYWNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgICAgICAgICBhYWNQYXJhbXMtPm5GcmFtZUxlbmd0aCA9IDA7CiAKKyAgICAgICAgICAgIHN3aXRjaCAobVNCUk1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMTogLy8gc2JyIG9uCisgICAgICAgICAgICAgICAgc3dpdGNoIChtU0JSUmF0aW8pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBib3RoIE9NWCBBQUMgdG9vbCBmbGFncworICAgICAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBzaW5nbGUtcmF0ZSBTQlIgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzIHw9IE9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlI7CisgICAgICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBkdWFsLXJhdGUgU0JSIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyAmPSB+T01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImludmFsaWQgU0JSIHJhdGlvICVkIiwgbVNCUlJhdGlvKTsKKyAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDA6ICAvLyBzYnIgb2ZmCisgICAgICAgICAgICBjYXNlIC0xOiAvLyBzYnIgdW5kZWZpbmVkCisgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlI7CisgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIFNCUiBtb2RlICVkIiwgbVNCUk1vZGUpOworICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICB9CisKKworCiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCkBAIC0yNDMsNiArMjgxLDIzIEBACiAgICAgICAgICAgICAgICAgbUFBQ1Byb2ZpbGUgPSBhYWNQYXJhbXMtPmVBQUNQcm9maWxlOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoIShhYWNQYXJhbXMtPm5BQUN0b29scyAmIE9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlIpCisgICAgICAgICAgICAgICAgICAgICYmICEoYWFjUGFyYW1zLT5uQUFDdG9vbHMgJiBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSKSkgeworICAgICAgICAgICAgICAgIG1TQlJNb2RlID0gMDsKKyAgICAgICAgICAgICAgICBtU0JSUmF0aW8gPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmICgoYWFjUGFyYW1zLT5uQUFDdG9vbHMgJiBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSKQorICAgICAgICAgICAgICAgICAgICAmJiAhKGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICYgT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUikpIHsKKyAgICAgICAgICAgICAgICBtU0JSTW9kZSA9IDE7CisgICAgICAgICAgICAgICAgbVNCUlJhdGlvID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShhYWNQYXJhbXMtPm5BQUN0b29scyAmIE9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlIpCisgICAgICAgICAgICAgICAgICAgICYmIChhYWNQYXJhbXMtPm5BQUN0b29scyAmIE9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlIpKSB7CisgICAgICAgICAgICAgICAgbVNCUk1vZGUgPSAxOworICAgICAgICAgICAgICAgIG1TQlJSYXRpbyA9IDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TQlJNb2RlID0gLTE7IC8vIGNvZGVjIGRlZmF1bHQgc2JyIG1vZGUKKyAgICAgICAgICAgICAgICBtU0JSUmF0aW8gPSAwOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc2V0QXVkaW9QYXJhbXMoKSAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0zMDUsMTEgKzM2MCwxMSBAQAogfQogCiBzdGF0dXNfdCBTb2Z0QUFDRW5jb2RlcjI6OnNldEF1ZGlvUGFyYW1zKCkgewotICAgIC8vIFdlIGNhbGwgdGhpcyB3aGVuZXZlciBzYW1wbGUgcmF0ZSwgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIGJpdHJhdGUgY2hhbmdlCisgICAgLy8gV2UgY2FsbCB0aGlzIHdoZW5ldmVyIHNhbXBsZSByYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMsIGJpdHJhdGUgb3IgU0JSIG1vZGUgY2hhbmdlCiAgICAgLy8gaW4gcmVwb25zZSB0byBzZXRQYXJhbWV0ZXIgY2FsbHMuCiAKLSAgICBBTE9HVigic2V0QXVkaW9QYXJhbXM6ICVsdSBIeiwgJWx1IGNoYW5uZWxzLCAlbHUgYnBzIiwKLSAgICAgICAgIG1TYW1wbGVSYXRlLCBtTnVtQ2hhbm5lbHMsIG1CaXRSYXRlKTsKKyAgICBBTE9HVigic2V0QXVkaW9QYXJhbXM6ICV1IEh6LCAldSBjaGFubmVscywgJXUgYnBzLCAlaSBzYnIgbW9kZSwgJWkgc2JyIHJhdGlvIiwKKyAgICAgICAgIG1TYW1wbGVSYXRlLCBtTnVtQ2hhbm5lbHMsIG1CaXRSYXRlLCBtU0JSTW9kZSwgbVNCUlJhdGlvKTsKIAogICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0FPVCwKICAgICAgICAgICAgIGdldEFPVEZyb21Qcm9maWxlKG1BQUNQcm9maWxlKSkpIHsKQEAgLTMzNSwxMCArMzkwLDI4IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIGlmIChtU0JSTW9kZSAhPSAtMSAmJiBtQUFDUHJvZmlsZSA9PSBPTVhfQVVESU9fQUFDT2JqZWN0RUxEKSB7CisgICAgICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1NCUl9NT0RFLCBtU0JSTW9kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU0JSIHJhdGlvIHBhcmFtZXRlciBjb25maWd1cmF0aW9uczoKKyAgICAgICAwOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2hlcmVpbiBTQlIgcmF0aW8gaXMgY29uZmlndXJlZCBkZXBlbmRpbmcgb24gYXVkaW8gb2JqZWN0IHR5cGUgYnkKKyAgICAgICAgICB0aGUgRkRLLgorICAgICAgIDE6IERvd25zYW1wbGVkIFNCUiAoZGVmYXVsdCBmb3IgRUxEKQorICAgICAgIDI6IER1YWxyYXRlIFNCUiAoZGVmYXVsdCBmb3IgSEUtQUFDKQorICAgICAqLworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1NCUl9SQVRJTywgbVNCUlJhdGlvKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBTb2Z0QUFDRW5jb2RlcjI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFBQ0VuY29kZXIyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMzY0LDcgKzQzNyw3IEBACiAKICAgICAgICAgT01YX1UzMiBhY3R1YWxCaXRSYXRlICA9IGFhY0VuY29kZXJfR2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19CSVRSQVRFKTsKICAgICAgICAgaWYgKG1CaXRSYXRlICE9IGFjdHVhbEJpdFJhdGUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgYml0cmF0ZSAlbHUgdW5zdXBwb3J0ZWQsIHVzaW5nICVsdSIsIG1CaXRSYXRlLCBhY3R1YWxCaXRSYXRlKTsKKyAgICAgICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgYml0cmF0ZSAldSB1bnN1cHBvcnRlZCwgdXNpbmcgJXUiLCBtQml0UmF0ZSwgYWN0dWFsQml0UmF0ZSk7CiAgICAgICAgIH0KIAogICAgICAgICBBQUNFTkNfSW5mb1N0cnVjdCBlbmNJbmZvOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmgKaW5kZXggMjYwM2Y0Zi4uYmNlOWMyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5oCkBAIC01Myw2ICs1Myw4IEBACiAgICAgT01YX1UzMiBtTnVtQ2hhbm5lbHM7CiAgICAgT01YX1UzMiBtU2FtcGxlUmF0ZTsKICAgICBPTVhfVTMyIG1CaXRSYXRlOworICAgIE9NWF9TMzIgbVNCUk1vZGU7CisgICAgT01YX1MzMiBtU0JSUmF0aW87CiAgICAgT01YX1UzMiBtQUFDUHJvZmlsZTsKIAogICAgIGJvb2wgbVNlbnRDb2RlY1NwZWNpZmljRGF0YTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYwppbmRleCBjYzAxOTI3Li4xZDAyOWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSAiYmFzaWNfb3AuaCIKICNpbmNsdWRlICJvcGVyXzMyYi5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqICBGdW5jdGlvbiBMX0V4dHJhY3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgpAQCAtMjQzLDYgKzI0NSw4IEBACiBXb3JkMzIgcnNxcnQoV29yZDMyIHZhbHVlLCAgICAgLyohPCBPcGVyYW5kIHRvIHNxdWFyZSByb290ICgwLjAgLi4uIDEpICovCiAgICAgICAgICAgICAgV29yZDMyIGFjY3VyYWN5KSAgLyohPCBOdW1iZXIgb2YgdmFsaWQgYml0cyB0aGF0IHdpbGwgYmUgY2FsY3VsYXRlZCAqLwogeworICAgIFVOVVNFRChhY2N1cmFjeSk7CisKICAgICBXb3JkMzIgcm9vdCA9IDA7CiAJV29yZDMyIHNjYWxlOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCmluZGV4IGQxYzg2MjEuLjQwZGI5MmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSAiY21uTWVtb3J5LmgiCiAjaW5jbHVkZSAibWVtYWxpZ24uaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qKgogKiBJbml0IHRoZSBhdWRpbyBjb2RlYyBtb2R1bGUgYW5kIHJldHVybiBjb2RlYyBoYW5kbGUKICogXHBhcmFtIHBoQ29kZWMgW09VVF0gUmV0dXJuIHRoZSB2aWRlbyBjb2RlYyBoYW5kbGUKQEAgLTQ2LDYgKzQ4LDggQEAKIAlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUDsKIAlpbnQgaW50ZXJNZW07CiAKKyAgICAgICAgVU5VU0VEKHZUeXBlKTsKKwogCWludGVyTWVtID0gMDsKIAllcnJvciA9IDA7CiAKQEAgLTQ3MSw2ICs0NzUsMTAgQEAKICovCiBWT19VMzIgVk9fQVBJIHZvQUFDRW5jR2V0UGFyYW0oVk9fSEFORExFIGhDb2RlYywgVk9fUzMyIHVQYXJhbUlELCBWT19QVFIgcERhdGEpCiB7CisgICAgICAgIFVOVVNFRChoQ29kZWMpOworICAgICAgICBVTlVTRUQodVBhcmFtSUQpOworICAgICAgICBVTlVTRUQocERhdGEpOworCiAJcmV0dXJuIFZPX0VSUl9OT05FOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hZGpfdGhyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hZGpfdGhyLmMKaW5kZXggY2NmZTg4My4uNDcxNjMxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYwpAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzKQogewogICBXb3JkMTYgY2gsIHNmYiwgc2ZiR3JwOwotICBXb3JkMzIgKnB0aHJFeHAsICpwc2ZiVGhyZTsKKyAgV29yZDMyICpwdGhyRXhwID0gTlVMTCwgKnBzZmJUaHJlOwogICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKIAkgZm9yKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCmluZGV4IGZjYzEyZGQuLmQxZmQ2NDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAicWNfZGF0YS5oIgogI2luY2x1ZGUgImludGVyZmFjZS5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKIAogc3RhdGljIGNvbnN0ICBXb3JkMTYgZ2xvYmFsR2Fpbk9mZnNldCA9IDEwMDsKIHN0YXRpYyBjb25zdCAgV29yZDE2IGljc1Jlc2VydmVkQml0ICAgPSAwOwpAQCAtNTg1LDYgKzU4Niw4IEBACiAgIFdvcmQxNiBlbGVtZW50VXNlZEJpdHM7CiAgIFdvcmQxNiBmcmFtZUJpdHM9MDsKIAorICBVTlVTRUQoYW5jQnl0ZXMpOworCiAgIC8qICAgc3RydWN0IGJpdGJ1ZmZlciBic1dyaXRlQ29weTsgKi8KICAgYml0TWFya1VwID0gR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOwogICBpZihxY091dC0+cWNFbGVtZW50LmFkdHNVc2VkKSAgLyogIHdyaXRlIGFkdHMgaGVhZGVyKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2R5bl9iaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9keW5fYml0cy5jCmluZGV4IDc3NjkxODguLjRkNzYzZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2R5bl9iaXRzLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZHluX2JpdHMuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgImJpdF9jbnQuaCIKICNpbmNsdWRlICJwc3lfY29uc3QuaCIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogZnVuY3Rpb24gbmFtZTogYnVpbGRCaXRMb29rVXAKQEAgLTIyNiw3ICsyMjUsNyBAQAogICB9CiAKICAgd2hpbGUgKFRSVUUpIHsKLSAgICBXb3JkMTYgbWF4TWVyZ2VHYWluLCBtYXhOZHgsIG1heE5keE5leHQsIG1heE5keExhc3Q7CisgICAgV29yZDE2IG1heE1lcmdlR2FpbiwgbWF4TmR4ID0gMCwgbWF4TmR4TmV4dCwgbWF4TmR4TGFzdDsKIAogICAgIG1heE1lcmdlR2FpbiA9IGZpbmRNYXhNZXJnZShtZXJnZUdhaW5Mb29rVXAsIHNlY3Rpb25JbmZvLCBtYXhTZmIsICZtYXhOZHgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X21haW4uYwppbmRleCA0ZTkyMThjLi42ZjA2NzljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMKQEAgLTM4LDYgKzM4LDggQEAKICNpbmNsdWRlICJ0bnNfZnVuYy5oIgogI2luY2x1ZGUgIm1lbWFsaWduLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgc3RhcnQgICAgICAgc2hvcnQgICAgICAgc3RvcCAqLwogc3RhdGljIFdvcmQxNiBibG9ja1R5cGUyd2luZG93U2hhcGVbXSA9IHtLQkRfV0lORE9XLFNJTkVfV0lORE9XLFNJTkVfV0lORE9XLEtCRF9XSU5ET1d9OwogCkBAIC0xNzAsNyArMTcyLDkgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogV29yZDE2IFBzeU91dERlbGV0ZShQU1lfT1VUICpoUHN5T3V0LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKIHsKLSAgaFBzeU91dD1OVUxMOworICBVTlVTRUQoaFBzeU91dCk7CisgIFVOVVNFRChwTWVtT1ApOworCiAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xY19tYWluLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xY19tYWluLmMKaW5kZXggNDhmZjMwMC4uZTVkNzhhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3FjX21haW4uYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCiAjaW5jbHVkZSAibWVtYWxpZ24uaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCiAKIHR5cGVkZWYgZW51bXsKICAgRlJBTUVfTEVOX0JZVEVTX01PRFVMTyA9ICAxLApAQCAtMjA0LDExICsyMDUsOCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgUUNEZWxldGUoUUNfU1RBVEUgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCiB7Ci0KLSAgLyoKLSAgICAgbm90aGluZyB0byBkbwotICAqLwotICBoUUM9TlVMTDsKKyAgVU5VU0VEKGhRQyk7CisgIFVOVVNFRChwTWVtT1ApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jCmluZGV4IDQ1NWE4NjQuLjUxNzI2MTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJ0bnNfZnVuYy5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogI2RlZmluZSBUTlNfTU9ESUZZX0JFR0lOICAgICAgICAgMjYwMCAgLyogSHogKi8KICNkZWZpbmUgUkFUSU9fUEFUQ0hfTE9XRVJfQk9SREVSIDM4MCAgIC8qIEh6ICovCiAjZGVmaW5lIFROU19HQUlOX1RIUkVTSAkJCSAxNDEgICAvKiAxLjQxKjEwMCAqLwpAQCAtNjQzLDYgKzY0NSw4IEBACiAgIFdvcmQzMiBpOwogICBXb3JkMzIgdG5zT3JkZXJQbHVzMSA9IHRuc09yZGVyICsgMTsKIAorICBVTlVTRUQod2luZG93KTsKKwogICBhc3NlcnQodG5zT3JkZXIgPD0gVE5TX01BWF9PUkRFUik7ICAgICAgLyogcmVtb3ZlIGFzc2VydHMgbGF0ZXI/IChidGcpICovCiAKICAgZm9yKGk9MDtpPHRuc09yZGVyO2krKykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLm1rCmluZGV4IDMwY2UyOWMuLmEyYjNjOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQubWsKQEAgLTY5LDYgKzY5LDggQEAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgICAgIC1ET1NDTF9VTlVTRURfQVJHPSAtRE9TQ0xfSU1QT1JUX1JFRj0gLURPU0NMX0VYUE9SVF9SRUY9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24KIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rCmluZGV4IDhkNmM2ZjguLmIwNjc0NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsKQEAgLTQ3LDYgKzQ3LDggQEAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgICAgIC1ET1NDTF9VTlVTRURfQVJHPSAtRE9TQ0xfSU1QT1JUX1JFRj0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKQEAgLTY4LDYgKzcwLDggQEAKIAogTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9JTVBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMgbGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKaW5kZXggMzMyMDY4OC4uZDFiMGY3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCkBAIC0yNzQsNyArMjc0LDcgQEAKICAgICByZXR1cm4gZnJhbWVTaXplOwogfQogCi12b2lkIFNvZnRBTVI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFNUjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogCkBAIC00MjgsNyArNDI4LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdEFNUjo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFNUjo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKIH0KIAogdm9pZCBTb2Z0QU1SOjpvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rCmluZGV4IGY0ZTQ2N2EuLmFmYzBiODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsKQEAgLTY5LDYgKzY5LDggQEAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgICAgIC1ET1NDTF9VTlVTRURfQVJHPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpAQCAtODgsNiArOTAsOCBAQAogICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbi9pbmNsdWRlIFwKICAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuY3BwCmluZGV4IDUwYjczOWMuLjk0ODk0NTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmNwcApAQCAtMjcwLDcgKzI3MCw3IEBACiAgICAgfQogfQogCi12b2lkIFNvZnRBTVJOQkVuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFNUk5CRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQubWsKaW5kZXggNjc3MTA3Zi4uZWZkZjk4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQubWsKQEAgLTUwLDYgKzUwLDggQEAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgICAgIC1ET1NDTF9VTlVTRURfQVJHPSAtRE9TQ0xfSU1QT1JUX1JFRj0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKaW5kZXggYzViOGUwYy4uNjRmZThkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKQEAgLTExMiw2ICsxMTIsOCBAQAogTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3NyYy9hc20vQVJNVjcKIGVuZGlmCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTEyNiw2ICsxMjgsOCBAQAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlIFwKIAlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmNwcAppbmRleCA5Y2NiNDljLi45MWE1MTJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuY3BwCkBAIC0zMTcsNyArMzE3LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdEFNUldCRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0QU1SV0JFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewogICAgICAgICByZXR1cm47CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucwppbmRleCA4NDUxMTk1Li5mMjNiNWEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucwpAQCAtMjksNiArMjksNyBAQAogICAgICAgICAgIC5nbG9iYWwgIEZpbHRfNmtfN2tfYXNtCiAgICAgICAgICAgLmV4dGVybiAgdm9BV0JfQ29weQogICAgICAgICAgIC5leHRlcm4gIGZpcl82a183aworICAgICAgICAgIC5oaWRkZW4gIGZpcl82a183awogCiBGaWx0XzZrXzdrX2FzbToKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucwppbmRleCBhYzJkZDEzLi5kZWI3ZWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucwpAQCAtMzIsNiArMzIsNyBAQAogICAgICAgICAgLnNlY3Rpb24gIC50ZXh0CiAJIC5nbG9iYWwgICBwcmVkX2x0NF9hc20KIAkgLmV4dGVybiAgIGludGVyNF8yCisJIC5oaWRkZW4gICBpbnRlcjRfMgogCiBwcmVkX2x0NF9hc206CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMKaW5kZXggZmM0MmEwMy4uOGRmMGNhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMKQEAgLTI4LDYgKzI4LDcgQEAKICAgICAgICAgICAuc2VjdGlvbiAgLnRleHQKICAgICAgICAgICAuZ2xvYmFsICAgRmlsdF82a183a19hc20KICAgICAgICAgICAuZXh0ZXJuICAgZmlyXzZrXzdrCisgICAgICAgICAgLmhpZGRlbiAgIGZpcl82a183awogCiBGaWx0XzZrXzdrX2FzbToKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucwppbmRleCA4ZDJhYWYyLi42N2JlMWVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucwpAQCAtMjksNiArMjksNyBAQAogICAgICAgICAgIC5zZWN0aW9uICAudGV4dAogICAgICAgICAgIC5nbG9iYWwgICBwcmVkX2x0NF9hc20KICAgICAgICAgICAuZXh0ZXJuICAgaW50ZXI0XzIKKyAgICAgICAgICAuaGlkZGVuICAgaW50ZXI0XzIKIAogcHJlZF9sdDRfYXNtOgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F1dG9jb3JyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F1dG9jb3JyLmMKaW5kZXggOGM0NzdjYS4uMGIyZWE4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hdXRvY29yci5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgImFjZWxwLmgiCiAjaW5jbHVkZSAiaGFtX3dpbmQudGFiIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogdm9pZCBBdXRvY29ycigKIAkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgOiBJbnB1dCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgKi8KIAkJV29yZDE2IG0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgOiBMUEMgb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQwLDYgKzQyLDggQEAKIAlXb3JkMzIgTF9zdW0sIExfc3VtMSwgTF90bXAsIEZfTEVOOwogCVdvcmQxNiAqcDEsKnAyLCpwMzsKIAljb25zdCBXb3JkMTYgKnA0OworICAgICAgICBVTlVTRUQobSk7CisKIAkvKiBXaW5kb3dpbmcgb2Ygc2lnbmFsICovCiAJcDEgPSB4OwogCXA0ID0gdm9fd2luZG93OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jCmluZGV4IGFjYmE1MzIuLjRjMWY3ZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29udm9sdmUuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMKQEAgLTI1LDYgKzI1LDggQEAKICNpbmNsdWRlICJ0eXBlZGVmLmgiCiAjaW5jbHVkZSAiYmFzaWNfb3AuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIHZvaWQgQ29udm9sdmUgKAogCQlXb3JkMTYgeFtdLCAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAJCVdvcmQxNiBoW10sICAgICAgICAvKiAoaSkgICAgIDogaW1wdWxzZSByZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM1LDYgKzM3LDggQEAKIAlXb3JkMzIgIGksIG47CiAJV29yZDE2ICp0bXBILCp0bXBYOwogCVdvcmQzMiBzOworICAgICAgICBVTlVTRUQoTCk7CisKIAlmb3IgKG4gPSAwOyBuIDwgNjQ7KQogCXsKIAkJdG1wSCA9IGgrbjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0Y2hfZjQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0Y2hfZjQuYwppbmRleCAwZDY2YzMxLi5iNjZiNTVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdGNoX2Y0LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jCkBAIC0zMSw2ICszMSw4IEBACiAjZGVmaW5lIFVQX1NBTVAgICAgICA0CiAjZGVmaW5lIExfSU5URVJQT0wxICA0CiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAvKiBMb2NhbCBmdW5jdGlvbnMgKi8KIAogI2lmZGVmIEFTTV9PUFQKQEAgLTE3MSw2ICsxNzMsNyBAQAogCVdvcmQzMiBjb3JyLCBleHBfY29yciwgbm9ybSwgZXhwLCBzY2FsZTsKIAlXb3JkMTYgZXhwX25vcm0sIGV4Y2ZbTF9TVUJGUl0sIHRtcDsKIAlXb3JkMzIgTF90bXAsIExfdG1wMSwgTF90bXAyOworICAgICAgICBVTlVTRUQoTF9zdWJmcik7CiAKIAkvKiBjb21wdXRlIHRoZSBmaWx0ZXJlZCBleGNpdGF0aW9uIGZvciB0aGUgZmlyc3QgZGVsYXkgdF9taW4gKi8KIAlrID0gLXRfbWluOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zeW5fZmlsdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zeW5fZmlsdC5jCmluZGV4IDFiZGEwNWEuLjk2MWFhZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlICJtYXRoX29wLmgiCiAjaW5jbHVkZSAiY25zdC5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogdm9pZCBTeW5fZmlsdCgKIAkJV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzICAgICAgICAgICAqLwogCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC05NSw2ICs5Nyw4IEBACiAJV29yZDMyIGksYTA7CiAJV29yZDMyIExfdG1wLCBMX3RtcDE7CiAJV29yZDE2ICpwMSwgKnAyLCAqcDM7CisgICAgICAgIFVOVVNFRChtKTsKKwogCWEwID0gYVswXSA+PiAoNCArIFFuZXcpOyAgICAgICAgICAvKiBpbnB1dCAvIDE2IGFuZCA+PlFuZXcgKi8KIAkvKiBEbyB0aGUgZmlsdGVyaW5nLiAqLwogCWZvciAoaSA9IDA7IGkgPCBsZzsgaSsrKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b0FNUldCRW5jLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvQU1SV0JFbmMuYwppbmRleCBlYTlkYTUyLi5kZjdiOWIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvQU1SV0JFbmMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvQU1SV0JFbmMuYwpAQCAtMzksNiArMzksOCBAQAogI2luY2x1ZGUgIm1lbV9hbGlnbi5oIgogI2luY2x1ZGUgImNtbk1lbW9yeS5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgpAQCAtMTYwMiw2ICsxNjA0LDggQEAKIAlWT19NRU1fT1BFUkFUT1Igdm9NZW1vcHJhdG9yOwogI2VuZGlmCiAJVk9fTUVNX09QRVJBVE9SICpwTWVtT1A7CisgICAgICAgIFVOVVNFRCh2VHlwZSk7CisKIAlpbnQgaW50ZXJNZW0gPSAwOwogCiAJaWYocFVzZXJEYXRhID09IE5VTEwgfHwgcFVzZXJEYXRhLT5tZW1mbGFnICE9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1IgfHwgcFVzZXJEYXRhLT5tZW1EYXRhID09IE5VTEwgKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9jb21tb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvY29tbW9uL0FuZHJvaWQubWsKaW5kZXggMjJkZWUxNS4uODQ0ZWYwYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9jb21tb24vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0xNiw0ICsxNiw2IEBACiAJJChMT0NBTF9QQVRIKS9zcmMgXAogIAkkKExPQ0FMX1BBVEgpL2luY2x1ZGUKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsKaW5kZXggN2QxN2MyYS4uNTM3YmE0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rCkBAIC0zMCw2ICszMCw4IEBACiBMT0NBTF9DRkxBR1MgOj0gXAogICAgIC1ET1NDTF9JTVBPUlRfUkVGPSAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0VYUE9SVF9SRUY9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTY5LDQgKzcxLDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2gyNjRlbmMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmNwcAppbmRleCBlMmI5ZTRmLi5lM2ZkYzg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuY3BwCkBAIC0zNCw4ICszNCwxMCBAQAogCiAjaW5jbHVkZSAiU29mdEFWQ0VuY29kZXIuaCIKIAotI2lmbmRlZiBJTlQzMl9NQVgKLSNkZWZpbmUgSU5UMzJfTUFYICAgMjE0NzQ4MzY0NworI2lmIExPR19OREVCVUcKKyNkZWZpbmUgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHgpICh2b2lkKSh4KQorI2Vsc2UKKyNkZWZpbmUgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHgpCiAjZW5kaWYKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTA5LDQ1ICsxMTEsMTUgQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCi1pbmxpbmUgc3RhdGljIHZvaWQgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKLSAgICAgICAgdWludDhfdCAqaW55dXYsIHVpbnQ4X3QqIG91dHl1diwKLSAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKLQotICAgIGludDMyX3Qgb3V0WXNpemUgPSB3aWR0aCAqIGhlaWdodDsKLSAgICB1aW50MzJfdCAqb3V0eSA9ICAodWludDMyX3QgKikgb3V0eXV2OwotICAgIHVpbnQxNl90ICpvdXRjYiA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUpOwotICAgIHVpbnQxNl90ICpvdXRjciA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUgKyAob3V0WXNpemUgPj4gMikpOwotCi0gICAgLyogWSBjb3B5aW5nICovCi0gICAgbWVtY3B5KG91dHksIGlueXV2LCBvdXRZc2l6ZSk7Ci0KLSAgICAvKiBVICYgViBjb3B5aW5nICovCi0gICAgdWludDMyX3QgKmlueXV2XzQgPSAodWludDMyX3QgKikgKGlueXV2ICsgb3V0WXNpemUpOwotICAgIGZvciAoaW50MzJfdCBpID0gaGVpZ2h0ID4+IDE7IGkgPiAwOyAtLWkpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGogPSB3aWR0aCA+PiAyOyBqID4gMDsgLS1qKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gKmlueXV2XzQrKzsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXBVID0gdGVtcCAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wVSA9IHRlbXBVIHwgKCh0ZW1wID4+IDgpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgdWludDMyX3QgdGVtcFYgPSAodGVtcCA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wViA9IHRlbXBWIHwgKCh0ZW1wID4+IDE2KSAmIDB4RkYwMCk7Ci0KLSAgICAgICAgICAgIC8vIEZsaXAgVSBhbmQgVgotICAgICAgICAgICAgKm91dGNiKysgPSB0ZW1wVjsKLSAgICAgICAgICAgICpvdXRjcisrID0gdGVtcFU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHN0YXRpYyB2b2lkKiBNYWxsb2NXcmFwcGVyKAotICAgICAgICB2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBzaXplLCBpbnQzMl90IGF0dHJzKSB7CisgICAgICAgIHZvaWQgKiAvKiB1c2VyRGF0YSAqLywgaW50MzJfdCBzaXplLCBpbnQzMl90IC8qIGF0dHJzICovKSB7CiAgICAgdm9pZCAqcHRyID0gbWFsbG9jKHNpemUpOwogICAgIGlmIChwdHIpCiAgICAgICAgIG1lbXNldChwdHIsIDAsIHNpemUpOwogICAgIHJldHVybiBwdHI7CiB9CiAKLXN0YXRpYyB2b2lkIEZyZWVXcmFwcGVyKHZvaWQgKnVzZXJEYXRhLCB2b2lkKiBwdHIpIHsKK3N0YXRpYyB2b2lkIEZyZWVXcmFwcGVyKHZvaWQgKiAvKiB1c2VyRGF0YSAqLywgdm9pZCogcHRyKSB7CiAgICAgZnJlZShwdHIpOwogfQogCkBAIC0xNzYsNyArMTQ4LDcgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQotICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgOiBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKICAgICAgIG1WaWRlb1dpZHRoKDE3NiksCiAgICAgICBtVmlkZW9IZWlnaHQoMTQ0KSwKICAgICAgIG1WaWRlb0ZyYW1lUmF0ZSgzMCksCkBAIC0yMjEsNyArMTkzLDcgQEAKICAgICBtSGFuZGxlLT5DQkFWQ19GcmVlID0gRnJlZVdyYXBwZXI7CiAKICAgICBDSEVDSyhtRW5jUGFyYW1zICE9IE5VTEwpOwotICAgIG1lbXNldChtRW5jUGFyYW1zLCAwLCBzaXplb2YobUVuY1BhcmFtcykpOworICAgIG1lbXNldChtRW5jUGFyYW1zLCAwLCBzaXplb2YoKm1FbmNQYXJhbXMpKTsKICAgICBtRW5jUGFyYW1zLT5yYXRlX2NvbnRyb2wgPSBBVkNfT047CiAgICAgbUVuY1BhcmFtcy0+aW5pdFFQID0gMDsKICAgICBtRW5jUGFyYW1zLT5pbml0X0NCUF9yZW1vdmFsX2RlbGF5ID0gMTYwMDsKQEAgLTI1OCw5ICsyMzAsMTAgQEAKIAogICAgIG1FbmNQYXJhbXMtPnVzZV9vdmVycnVuX2J1ZmZlciA9IEFWQ19PRkY7CiAKLSAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcgorICAgICAgICAgICAgfHwgbVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKICAgICAgICAgLy8gQ29sb3IgY29udmVyc2lvbiBpcyBuZWVkZWQuCi0gICAgICAgIENIRUNLKG1JbnB1dEZyYW1lRGF0YSA9PSBOVUxMKTsKKyAgICAgICAgZnJlZShtSW5wdXRGcmFtZURhdGEpOwogICAgICAgICBpZiAoKCh1aW50NjRfdCltVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCkgPiAoKHVpbnQ2NF90KUlOVDMyX01BWCAvIDMpKSB7CiAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIHNpemUgaXMgdG9vIGJpZy4iKTsKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CkBAIC0zNTQsMTAgKzMyNywxMCBAQAogICAgIFBWQVZDQ2xlYW5VcEVuY29kZXIobUhhbmRsZSk7CiAgICAgcmVsZWFzZU91dHB1dEJ1ZmZlcnMoKTsKIAotICAgIGRlbGV0ZSBtSW5wdXRGcmFtZURhdGE7CisgICAgZnJlZShtSW5wdXRGcmFtZURhdGEpOwogICAgIG1JbnB1dEZyYW1lRGF0YSA9IE5VTEw7CiAKLSAgICBkZWxldGUgbVNsaWNlR3JvdXA7CisgICAgZnJlZShtU2xpY2VHcm91cCk7CiAgICAgbVNsaWNlR3JvdXAgPSBOVUxMOwogCiAgICAgZGVsZXRlIG1FbmNQYXJhbXM7CkBAIC02MDUsNiArNTc4LDE3IEBACiAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwogICAgICAgICAgICAgICAgIG1WaWRlb0ZyYW1lUmF0ZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPj4gMTY7CiAgICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPSBkZWYtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQ7CisKKyAgICAgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0RGVmID0KKyAgICAgICAgICAgICAgICAgICAgJmVkaXRQb3J0SW5mbygwKS0+bURlZjsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtVmlkZW9XaWR0aDsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbVZpZGVvSGVpZ2h0OworICAgICAgICAgICAgICAgIHBvcnREZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gZGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0KKyAgICAgICAgICAgICAgICAgICAgKE9NWF9DT0xPUl9GT1JNQVRUWVBFKSBtVmlkZW9Db2xvckZvcm1hdDsKKyAgICAgICAgICAgICAgICBwb3J0RGVmID0gJmVkaXRQb3J0SW5mbygxKS0+bURlZjsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtVmlkZW9XaWR0aDsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbVZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtVmlkZW9CaXRSYXRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkJpdHJhdGU7CiAgICAgICAgICAgICB9CkBAIC03MDgsMTUgKzY5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzID8gIiB0cnVlIiA6ICJmYWxzZSIpOwogCiAgICAgICAgICAgICBpZiAobVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKLSAgICAgICAgICAgICAgICBtVmlkZW9Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjsKLSAgICAgICAgICAgICAgICBpZiAobUlucHV0RnJhbWVEYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3QpbVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQpID4gKCh1aW50NjRfdClJTlQzMl9NQVggLyAzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBzaXplIGlzIHRvbyBiaWcuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKikgbWFsbG9jKChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMgKSA+PiAxKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CkBAIC03MjcsNyArNzAzLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdEFWQ0VuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFWQ0VuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TYXdJbnB1dEVPUykgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtODAwLDggKzc3Niw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBidWZmZXJfaGFuZGxlX3Qgc3JjQnVmZmVyOyAvLyBmb3IgTWV0YURhdGFNb2RlIG9ubHkKLQogICAgICAgICAvLyBHZXQgbmV4dCBpbnB1dCB2aWRlbyBmcmFtZQogICAgICAgICBpZiAobVJlYWR5Rm9yTmV4dEZyYW1lKSB7CiAgICAgICAgICAgICAvLyBTYXZlIHRoZSBpbnB1dCBidWZmZXIgaW5mbyBzbyB0aGF0IGl0IGNhbiBiZQpAQCAtODIyLDE4ICs3OTYsMjAgQEAKICAgICAgICAgICAgICAgICB2aWRlb0lucHV0LmhlaWdodCA9ICgobVZpZGVvSGVpZ2h0ICArIDE1KSA+PiA0KSA8PCA0OwogICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQucGl0Y2ggPSAoKG1WaWRlb1dpZHRoICsgMTUpID4+IDQpIDw8IDQ7CiAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5jb2RpbmdfdGltZXN0YW1wID0gKGluSGVhZGVyLT5uVGltZVN0YW1wICsgNTAwKSAvIDEwMDA7ICAvLyBpbiBtcwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmlucHV0RGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXREYXRhID0gTlVMTDsKICAgICAgICAgICAgICAgICBpZiAobVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuICE9IDgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJNZXRhRGF0YSBidWZmZXIgaXMgd3Jvbmcgc2l6ZSEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGdvdCAlbHUgYnl0ZXMsIGV4cGVjdGVkIDgpIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGdvdCAldSBieXRlcywgZXhwZWN0ZWQgOCkiLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEdyYWxsb2NEYXRhKGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZURhdGEsIChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMpID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsIGluSGVhZGVyLT5uRmlsbGVkTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGV4dHJhY3QgZ3JhbGxvYyBidWZmZXIgaW4gbWV0YWRhdGEgbW9kZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTg0MiwxNiArODE4LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogVmVyaWZ5L2NvbnZlcnQgcGl4ZWwgZm9ybWF0IGVudW0KICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSAodWludDhfdCAqKWluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9IChjb25zdCB1aW50OF90ICopaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLCBtSW5wdXRGcmFtZURhdGEsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhID0gbUlucHV0RnJhbWVEYXRhOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSwgbUlucHV0RnJhbWVEYXRhLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhID0gbUlucHV0RnJhbWVEYXRhOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBDSEVDSyhpbnB1dERhdGEgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5ZQ2JDclswXSA9IGlucHV0RGF0YTsKKyAgICAgICAgICAgICAgICB2aWRlb0lucHV0LllDYkNyWzBdID0gKHVpbnQ4X3QgKilpbnB1dERhdGE7CiAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5ZQ2JDclsxXSA9IHZpZGVvSW5wdXQuWUNiQ3JbMF0gKyB2aWRlb0lucHV0LmhlaWdodCAqIHZpZGVvSW5wdXQucGl0Y2g7CiAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5ZQ2JDclsyXSA9IHZpZGVvSW5wdXQuWUNiQ3JbMV0gKwogICAgICAgICAgICAgICAgICAgICAoKHZpZGVvSW5wdXQuaGVpZ2h0ICogdmlkZW9JbnB1dC5waXRjaCkgPj4gMik7CkBAIC04NjgsMTQgKzg0NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RlclN0YXR1cyA8IEFWQ0VOQ19TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZW5jb2RlclN0YXR1cyA9ICVkIGF0IGxpbmUgJWQiLCBlbmNvZGVyU3RhdHVzLCBfX0xJTkVfXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUdyYWxsb2NEYXRhKHNyY0J1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZW5jb2RlclN0YXR1cyA9ICVkIGF0IGxpbmUgJWQiLCBlbmNvZGVyU3RhdHVzLCBfX0xJTkVfXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VHcmFsbG9jRGF0YShzcmNCdWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtOTE1LDcgKzg4OSw2IEBACiAgICAgICAgICAgICBpZiAoZW5jb2RlclN0YXR1cyA8IEFWQ0VOQ19TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImVuY29kZXJTdGF0dXMgPSAlZCBhdCBsaW5lICVkIiwgZW5jb2RlclN0YXR1cywgX19MSU5FX18pOwogICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZUdyYWxsb2NEYXRhKHNyY0J1ZmZlcik7CiAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTkyNSw3ICs4OTgsNiBAQAogCiAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIHJlbGVhc2VHcmFsbG9jRGF0YShzcmNCdWZmZXIpOwogICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwogCiAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwpAQCAtOTY5LDUwICs5NDEsMTAgQEAKIH0KIAogdm9pZCBTb2Z0QVZDRW5jb2Rlcjo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRShidWZmZXIpOwogICAgIEFMT0dWKCJzaWduYWxCdWZmZXJSZXR1cm5lZDogJXAiLCBidWZmZXIpOwogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRBVkNFbmNvZGVyOjpnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKLSAgICBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiKSkgewotICAgICAgICAqKGludDMyX3QqKWluZGV4ID0ga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleDsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Ci19Ci0KLXVpbnQ4X3QgKlNvZnRBVkNFbmNvZGVyOjpleHRyYWN0R3JhbGxvY0RhdGEodm9pZCAqZGF0YSwgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIpIHsKLSAgICBPTVhfVTMyIHR5cGUgPSAqKE9NWF9VMzIqKWRhdGE7Ci0gICAgc3RhdHVzX3QgcmVzOwotICAgIGlmICh0eXBlICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7Ci0gICAgICAgIEFMT0dFKCJEYXRhIHBhc3NlZCBpbiB3aXRoIG1ldGFkYXRhIG1vZGUgZG9lcyBub3QgaGF2ZSB0eXBlICIKLSAgICAgICAgICAgICAgICAia01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UgKCVkKSwgaGFzIHR5cGUgJWxkIGluc3RlYWQiLAotICAgICAgICAgICAgICAgIGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGJ1ZmZlcl9oYW5kbGVfdCBpbWdCdWZmZXIgPSAqKGJ1ZmZlcl9oYW5kbGVfdCopKCh1aW50OF90KilkYXRhICsgNCk7Ci0KLSAgICBjb25zdCBSZWN0IHJlY3QobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7Ci0gICAgdWludDhfdCAqaW1nOwotICAgIHJlcyA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpLmxvY2soaW1nQnVmZmVyLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAotICAgICAgICAgICAgcmVjdCwgKHZvaWQqKikmaW1nKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGxvY2sgaW1hZ2UgYnVmZmVyICVwIGZvciBhY2Nlc3MiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgaW1nQnVmZmVyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgKmJ1ZmZlciA9IGltZ0J1ZmZlcjsKLSAgICByZXR1cm4gaW1nOwotfQotCi12b2lkIFNvZnRBVkNFbmNvZGVyOjpyZWxlYXNlR3JhbGxvY0RhdGEoYnVmZmVyX2hhbmRsZV90IGJ1ZmZlcikgewotICAgIGlmIChtU3RvcmVNZXRhRGF0YUluQnVmZmVycykgewotICAgICAgICBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS51bmxvY2soYnVmZmVyKTsKLSAgICB9Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuaAppbmRleCAyM2Q1ZmYxLi4xMzA1OTNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmgKQEAgLTIyLDE0ICsyMiwxNCBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiAjaW5jbHVkZSAiYXZjZW5jX2FwaS5oIgotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlICJTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IE1lZGlhQnVmZmVyOwogCiBzdHJ1Y3QgU29mdEFWQ0VuY29kZXIgOiBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50IHsKICAgICBTb2Z0QVZDRW5jb2RlcigKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCkBAIC00NSwxMSArNDUsNiBAQAogCiAgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogCi0gICAgLy8gT3ZlcnJpZGUgU29mdE9NWENvbXBvbmVudCBtZXRob2RzCi0KLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0RXh0ZW5zaW9uSW5kZXgoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCk7Ci0KICAgICAvLyBJbXBsZW1lbnQgTWVkaWFCdWZmZXJPYnNlcnZlcgogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKIApAQCAtNjcsMTAgKzYyLDYgQEAKICAgICAgICAga051bUJ1ZmZlcnMgPSAyLAogICAgIH07CiAKLSAgICBlbnVtIHsKLSAgICAgICAga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleCA9IE9NWF9JbmRleFZlbmRvclN0YXJ0VW51c2VkICsgMQotICAgIH07Ci0KICAgICAvLyBPTVggaW5wdXQgYnVmZmVyJ3MgdGltZXN0YW1wIGFuZCBmbGFncwogICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgaW50NjRfdCBtVGltZVVzOwpAQCAtMTA5LDkgKzEwMCw2IEBACiAgICAgT01YX0VSUk9SVFlQRSByZWxlYXNlRW5jb2RlcigpOwogICAgIHZvaWQgcmVsZWFzZU91dHB1dEJ1ZmZlcnMoKTsKIAotICAgIHVpbnQ4X3QqIGV4dHJhY3RHcmFsbG9jRGF0YSh2b2lkICpkYXRhLCBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcik7Ci0gICAgdm9pZCByZWxlYXNlR3JhbGxvY0RhdGEoYnVmZmVyX2hhbmRsZV90IGJ1ZmZlcik7Ci0KICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0QVZDRW5jb2Rlcik7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCmluZGV4IDBlMzAzN2YuLmQ3MWMzMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCkBAIC0xMDMsNiArMTAzLDE1IEBACiAgICAgewogICAgICAgICBudW1fYml0cyAtPSA4OwogICAgICAgICBieXRlID0gKGN1cnJlbnRfd29yZCA+PiBudW1fYml0cykgJiAweEZGOworICAgICAgICBpZiAoc3RyZWFtLT5jb3VudF96ZXJvcyA9PSAyKQorICAgICAgICB7ICAgLyogZm9yIG51bV9iaXRzID0gMzIsIHRoaXMgY2FuIGFkZCAyIG1vcmUgYnl0ZXMgZXh0cmEgZm9yIEVQQlMgKi8KKyAgICAgICAgICAgIGlmIChieXRlIDw9IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKndyaXRlX3BudCsrID0gMHgzOworICAgICAgICAgICAgICAgIHN0cmVhbS0+d3JpdGVfcG9zKys7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5jb3VudF96ZXJvcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgaWYgKGJ5dGUgIT0gMCkKICAgICAgICAgewogICAgICAgICAgICAgKndyaXRlX3BudCsrID0gYnl0ZTsKQEAgLTExNCwxMiArMTIzLDYgQEAKICAgICAgICAgICAgIHN0cmVhbS0+Y291bnRfemVyb3MrKzsKICAgICAgICAgICAgICp3cml0ZV9wbnQrKyA9IGJ5dGU7CiAgICAgICAgICAgICBzdHJlYW0tPndyaXRlX3BvcysrOwotICAgICAgICAgICAgaWYgKHN0cmVhbS0+Y291bnRfemVyb3MgPT0gMikKLSAgICAgICAgICAgIHsgICAvKiBmb3IgbnVtX2JpdHMgPSAzMiwgdGhpcyBjYW4gYWRkIDIgbW9yZSBieXRlcyBleHRyYSBmb3IgRVBCUyAqLwotICAgICAgICAgICAgICAgICp3cml0ZV9wbnQrKyA9IDB4MzsKLSAgICAgICAgICAgICAgICBzdHJlYW0tPndyaXRlX3BvcysrOwotICAgICAgICAgICAgICAgIHN0cmVhbS0+Y291bnRfemVyb3MgPSAwOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQubWsKaW5kZXggYTMzY2I5Mi4uYjAwMTBmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5tawpAQCAtMTQsNiArMTQsOCBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChMT0NBTF9QQVRIKS9pbmNsdWRlCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0NvbmZpZy5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQ29uZmlnLm1rCmluZGV4IGE2ZDQyODYuLmE4NDNjZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQ29uZmlnLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQ29uZmlnLm1rCkBAIC0xNCw4ICsxNCwxMCBAQAogZW5kaWYKIAogIyBEbyB3ZSBhbHNvIG5lZWQgdG8gY2hlY2sgb24gQVJDSF9BUk1fSEFWRV9BUk1WN0E/IC0gcHJvYmFibHkgbm90Ci1pZmVxICgkKEFSQ0hfQVJNX0hBVkVfTkVPTiksdHJ1ZSkKLVZPVFQgOj0gdjcKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKKyAgaWZlcSAoJChBUkNIX0FSTV9IQVZFX05FT04pLHRydWUpCisgICAgVk9UVCA6PSB2NworICBlbmRpZgogZW5kaWYKIAogVk9URVNUIDo9IDAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vY21uTWVtb3J5LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2Ntbk1lbW9yeS5jCmluZGV4IGFhNTJiZDkuLjViYjZjYzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vY21uTWVtb3J5LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9jbW5NZW1vcnkuYwpAQCAtMjYsOCArMjYsMTIgQEAKIAogLy9WT19NRU1fT1BFUkFUT1IJCWdfbWVtT1A7CiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiBWT19VMzIgY21uTWVtQWxsb2MgKFZPX1MzMiB1SUQsICBWT19NRU1fSU5GTyAqIHBNZW1JbmZvKQogeworICAgICAgICBVTlVTRUQodUlEKTsKKwogCWlmICghcE1lbUluZm8pCiAJCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7CiAKQEAgLTM3LDM0ICs0MSw0OCBAQAogCiBWT19VMzIgY21uTWVtRnJlZSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBNZW0pCiB7CisgICAgICAgIFVOVVNFRCh1SUQpOworCiAJZnJlZSAocE1lbSk7CiAJcmV0dXJuIDA7CiB9CiAKIFZPX1UzMgljbW5NZW1TZXQgKFZPX1MzMiB1SUQsIFZPX1BUUiBwQnVmZiwgVk9fVTggdVZhbHVlLCBWT19VMzIgdVNpemUpCiB7CisgICAgICAgIFVOVVNFRCh1SUQpOworCiAJbWVtc2V0IChwQnVmZiwgdVZhbHVlLCB1U2l6ZSk7CiAJcmV0dXJuIDA7CiB9CiAKIFZPX1UzMgljbW5NZW1Db3B5IChWT19TMzIgdUlELCBWT19QVFIgcERlc3QsIFZPX1BUUiBwU291cmNlLCBWT19VMzIgdVNpemUpCiB7CisgICAgICAgIFVOVVNFRCh1SUQpOworCiAJbWVtY3B5IChwRGVzdCwgcFNvdXJjZSwgdVNpemUpOwogCXJldHVybiAwOwogfQogCiBWT19VMzIJY21uTWVtQ2hlY2sgKFZPX1MzMiB1SUQsIFZPX1BUUiBwQnVmZmVyLCBWT19VMzIgdVNpemUpCiB7CisgICAgICAgIFVOVVNFRCh1SUQpOworICAgICAgICBVTlVTRUQocEJ1ZmZlcik7CisgICAgICAgIFVOVVNFRCh1U2l6ZSk7CisKIAlyZXR1cm4gMDsKIH0KIAogVk9fUzMyIGNtbk1lbUNvbXBhcmUgKFZPX1MzMiB1SUQsIFZPX1BUUiBwQnVmZmVyMSwgVk9fUFRSIHBCdWZmZXIyLCBWT19VMzIgdVNpemUpCiB7CisgICAgICAgIFVOVVNFRCh1SUQpOworCiAJcmV0dXJuIG1lbWNtcChwQnVmZmVyMSwgcEJ1ZmZlcjIsIHVTaXplKTsKIH0KIAogVk9fVTMyCWNtbk1lbU1vdmUgKFZPX1MzMiB1SUQsIFZPX1BUUiBwRGVzdCwgVk9fUFRSIHBTb3VyY2UsIFZPX1UzMiB1U2l6ZSkKIHsKKyAgICAgICAgVU5VU0VEKHVJRCk7CisKIAltZW1tb3ZlIChwRGVzdCwgcFNvdXJjZSwgdVNpemUpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5tawppbmRleCBmMDFkNjA1Li41OWExMWRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5tawpAQCAtOSw2ICs5LDggQEAKICAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKICAgICAgICAgZXh0ZXJuYWwvZmxhYy9pbmNsdWRlCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscyBsaWJsb2cKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAppbmRleCBlNjRmZTcyLi4xMzAxMDYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcApAQCAtMjcsNiArMjcsMTIgQEAKICNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUIDUKICNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9NQVggICAgIDgKIAorI2lmIExPR19OREVCVUcKKyNkZWZpbmUgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHgpICh2b2lkKSh4KQorI2Vsc2UKKyNkZWZpbmUgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHgpCisjZW5kaWYKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB0ZW1wbGF0ZTxjbGFzcyBUPgpAQCAtMjA0LDcgKzIxMCw3IEBACiAKICAgICAgICAgICAgIG1OdW1DaGFubmVscyA9IHBjbVBhcmFtcy0+bkNoYW5uZWxzOwogICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBBTE9HVigid2lsbCBlbmNvZGUgJWxkIGNoYW5uZWxzIGF0ICVsZEh6IiwgbU51bUNoYW5uZWxzLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBBTE9HVigid2lsbCBlbmNvZGUgJWQgY2hhbm5lbHMgYXQgJWRIeiIsIG1OdW1DaGFubmVscywgbVNhbXBsZVJhdGUpOwogCiAgICAgICAgICAgICByZXR1cm4gY29uZmlndXJlRW5jb2RlcigpOwogICAgICAgICB9CkBAIC0yNDEsNyArMjQ3LDcgQEAKIAogICAgICAgICAgICAgaWYgKGRlZlBhcmFtcy0+blBvcnRJbmRleCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRlZlBhcmFtcy0+bkJ1ZmZlclNpemUgPiBrTWF4SW5wdXRCdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgc2l6ZSBtdXN0IGJlIGF0IG1vc3QgJXp1IGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBzaXplIG11c3QgYmUgYXQgbW9zdCAlZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4SW5wdXRCdWZmZXJTaXplKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKICAgICAgICAgICAgICAgICB9CkBAIC0yNTcsOCArMjYzLDggQEAKIH0KIAogdm9pZCBTb2Z0RmxhY0VuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKLQotICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6Om9uUXVldWVGaWxsZWQocG9ydEluZGV4PSVsZCkiLCBwb3J0SW5kZXgpOworICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRShwb3J0SW5kZXgpOworICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6Om9uUXVldWVGaWxsZWQocG9ydEluZGV4PSVkKSIsIHBvcnRJbmRleCk7CiAKICAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTI5MCw3ICsyOTYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID4ga01heElucHV0QnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImlucHV0IGJ1ZmZlciB0b28gbGFyZ2UgKCVsZCkuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgQUxPR0UoImlucHV0IGJ1ZmZlciB0b28gbGFyZ2UgKCVkKS4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMzQzLDE2ICszNDksMTcgQEAKICAgICB9CiB9CiAKLQogRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzIFNvZnRGbGFjRW5jb2Rlcjo6b25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKICAgICAgICAgICAgIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sCi0gICAgICAgICAgICBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIHNhbXBsZXMsIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUpIHsKLSAgICBBTE9HVigiU29mdEZsYWNFbmNvZGVyOjpvbkVuY29kZWRGbGFjQXZhaWxhYmxlKGJ5dGVzPSVkLCBzYW1wbGVzPSVkLCBjdXJyX2ZyYW1lPSVkKSIsCisgICAgICAgICAgICBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIHNhbXBsZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lKSB7CisgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKGN1cnJlbnRfZnJhbWUpOworICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6Om9uRW5jb2RlZEZsYWNBdmFpbGFibGUoYnl0ZXM9JXp1LCBzYW1wbGVzPSV1LCBjdXJyX2ZyYW1lPSV1KSIsCiAgICAgICAgICAgICBieXRlcywgc2FtcGxlcywgY3VycmVudF9mcmFtZSk7CiAKICNpZmRlZiBXUklURV9GTEFDX0hFQURFUl9JTl9GSVJTVF9CVUZGRVIKICAgICBpZiAoc2FtcGxlcyA9PSAwKSB7Ci0gICAgICAgIEFMT0dJKCIgc2F2aW5nICVkIGJ5dGVzIG9mIGhlYWRlciIsIGJ5dGVzKTsKKyAgICAgICAgQUxPR0koIiBzYXZpbmcgJXp1IGJ5dGVzIG9mIGhlYWRlciIsIGJ5dGVzKTsKICAgICAgICAgbWVtY3B5KG1IZWFkZXIgKyBtSGVhZGVyT2Zmc2V0LCBidWZmZXIsIGJ5dGVzKTsKICAgICAgICAgbUhlYWRlck9mZnNldCArPSBieXRlczsvLyB3aWxsIGNvbnRhaW4gaGVhZGVyIHNpemUgd2hlbiBmaW5pc2hlZCByZWNlaXZpbmcgaGVhZGVyCiAgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CkBAIC0zNjMsNyArMzcwLDcgQEAKICAgICBpZiAoKHNhbXBsZXMgPT0gMCkgfHwgIW1FbmNvZGVyV3JpdGVEYXRhKSB7CiAgICAgICAgIC8vIGNhbGxlZCBieSB0aGUgZW5jb2RlciBiZWNhdXNlIHRoZXJlJ3MgaGVhZGVyIGRhdGEgdG8gc2F2ZSwgYnV0IGl0J3Mgbm90IHRoZSByb2xlCiAgICAgICAgIC8vIG9mIHRoaXMgY29tcG9uZW50ICh1bmxlc3MgV1JJVEVfRkxBQ19IRUFERVJfSU5fRklSU1RfQlVGRkVSIGlzIGRlZmluZWQpCi0gICAgICAgIEFMT0dWKCJpZ25vcmluZyAlZCBieXRlcyBvZiBoZWFkZXIgZGF0YSAoc2FtcGxlcz0lZCkiLCBieXRlcywgc2FtcGxlcyk7CisgICAgICAgIEFMT0dWKCJpZ25vcmluZyAlenUgYnl0ZXMgb2YgaGVhZGVyIGRhdGEgKHNhbXBsZXM9JWQpIiwgYnl0ZXMsIHNhbXBsZXMpOwogICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOwogICAgIH0KIApAQCAtMzg0LDkgKzM5MSw5IEBACiAjZW5kaWYKIAogICAgIC8vIHdyaXRlIGVuY29kZWQgZGF0YQotICAgIEFMT0dWKCIgd3JpdGluZyAlZCBieXRlcyBvZiBlbmNvZGVkIGRhdGEgb24gb3V0cHV0IHBvcnQiLCBieXRlcyk7CisgICAgQUxPR1YoIiB3cml0aW5nICV6dSBieXRlcyBvZiBlbmNvZGVkIGRhdGEgb24gb3V0cHV0IHBvcnQiLCBieXRlcyk7CiAgICAgaWYgKGJ5dGVzID4gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLSBvdXRIZWFkZXItPm5PZmZzZXQgLSBvdXRIZWFkZXItPm5GaWxsZWRMZW4pIHsKLSAgICAgICAgQUxPR0UoIiBub3QgZW5vdWdoIHNwYWNlIGxlZnQgdG8gd3JpdGUgZW5jb2RlZCBkYXRhLCBkcm9wcGluZyAldSBieXRlcyIsIGJ5dGVzKTsKKyAgICAgICAgQUxPR0UoIiBub3QgZW5vdWdoIHNwYWNlIGxlZnQgdG8gd3JpdGUgZW5jb2RlZCBkYXRhLCBkcm9wcGluZyAlenUgYnl0ZXMiLCBieXRlcyk7CiAgICAgICAgIC8vIGEgZmF0YWwgZXJyb3Igd291bGQgc3RvcCB0aGUgZW5jb2RpbmcKICAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKICAgICB9CkBAIC00MDUsNyArNDEyLDcgQEAKIAogCiBPTVhfRVJST1JUWVBFIFNvZnRGbGFjRW5jb2Rlcjo6Y29uZmlndXJlRW5jb2RlcigpIHsKLSAgICBBTE9HVigiU29mdEZsYWNFbmNvZGVyOjpjb25maWd1cmVFbmNvZGVyKCkgbnVtQ2hhbm5lbD0lbGQsIHNhbXBsZVJhdGU9JWxkIiwKKyAgICBBTE9HVigiU29mdEZsYWNFbmNvZGVyOjpjb25maWd1cmVFbmNvZGVyKCkgbnVtQ2hhbm5lbD0lZCwgc2FtcGxlUmF0ZT0lZCIsCiAgICAgICAgICAgICBtTnVtQ2hhbm5lbHMsIG1TYW1wbGVSYXRlKTsKIAogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgKG1GbGFjU3RyZWFtRW5jb2RlciA9PSBOVUxMKSkgewpAQCAtNDQ0LDggKzQ1MSwxMiBAQAogCiAvLyBzdGF0aWMKIEZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBTb2Z0RmxhY0VuY29kZXI6OmZsYWNFbmNvZGVyV3JpdGVDYWxsYmFjaygKLSAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKmVuY29kZXIsIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sCi0gICAgICAgICAgICBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIHNhbXBsZXMsIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUsIHZvaWQgKmNsaWVudF9kYXRhKSB7CisgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1FbmNvZGVyICogLyogZW5jb2RlciAqLywKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sCisgICAgICAgICAgICBzaXplX3QgYnl0ZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudF9mcmFtZSwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKSB7CiAgICAgcmV0dXJuICgoU29mdEZsYWNFbmNvZGVyKikgY2xpZW50X2RhdGEpLT5vbkVuY29kZWRGbGFjQXZhaWxhYmxlKAogICAgICAgICAgICAgYnVmZmVyLCBieXRlcywgc2FtcGxlcywgY3VycmVudF9mcmFtZSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLm1rCmluZGV4IDRjODBkYTYuLmEwMTEyZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLm1rCkBAIC0xNCw0ICsxNCw2IEBACiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9nNzExZGVjCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAppbmRleCBiY2RkM2M3Li4zYTY5MDk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKQEAgLTExNyw3ICsxMTcsMTQgQEAKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUVuZGlhbiA9IE9NWF9FbmRpYW5CaWc7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmJJbnRlcmxlYXZlZCA9IE9NWF9UUlVFOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gMTY7Ci0gICAgICAgICAgICBwY21QYXJhbXMtPmVQQ01Nb2RlID0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXI7CisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uUG9ydEluZGV4ID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBpbnB1dCBwb3J0CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IG1Jc01MYXcgPyBPTVhfQVVESU9fUENNTW9kZU1VTGF3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBPTVhfQVVESU9fUENNTW9kZUFMYXc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIG91dHB1dCBwb3J0CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOwogCkBAIC0xODIsNyArMTg5LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdEc3MTE6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEc3MTE6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMTIsNyArMjE5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgdG9vIGxhcmdlICglbGQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgdG9vIGxhcmdlICglZCkuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogCiAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQubWsKaW5kZXggNzE2MTNkMi4uMzA4NjhkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLm1rCkBAIC05LDYgKzksOCBAQAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICBleHRlcm5hbC9saWJnc20vaW5jCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscyBsaWJsb2cKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcAppbmRleCAwMGUwYzg1Li40ZGViYzQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcApAQCAtMTcyLDcgKzE3Miw3IEBACiAgICAgfQogfQogCi12b2lkIFNvZnRHU006Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEdTTTo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIwMiwxMyArMjAyLDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiBrTWF4TnVtU2FtcGxlc1BlckZyYW1lKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5wdXQgYnVmZmVyIHRvbyBsYXJnZSAoJWxkKS4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICBBTE9HRSgiaW5wdXQgYnVmZmVyIHRvbyBsYXJnZSAoJWQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBpZigoKGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gNjUpICogNjUpICE9IGluSGVhZGVyLT5uRmlsbGVkTGVuKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5wdXQgYnVmZmVyIG5vdCBtdWx0aXBsZSBvZiA2NSAoJWxkKS4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICBBTE9HRSgiaW5wdXQgYnVmZmVyIG5vdCBtdWx0aXBsZSBvZiA2NSAoJWQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYzY5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKK2lmZXEgKCQoaWYgJCh3aWxkY2FyZCBleHRlcm5hbC9saWJoZXZjKSwxLDApLDEpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgICAgICAgICAgICA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2hldmNkZWMKK0xPQ0FMX01PRFVMRV9UQUdTICAgICAgIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgIDo9IGxpYmhldmNkZWMKK0xPQ0FMX1NSQ19GSUxFUyAgICAgICAgIDo9IFNvZnRIRVZDLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoVE9QKS9leHRlcm5hbC9saWJoZXZjL2RlY29kZXIKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2V4dGVybmFsL2xpYmhldmMvY29tbW9uCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICA6PSBsaWJzdGFnZWZyaWdodAorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgKz0gbGlic3RhZ2VmcmlnaHRfb214CitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJ1dGlscworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgKz0gbGlibG9nCisKKyMgV2UgbmVlZCB0aGlzIGJlY2F1c2UgdGhlIGN1cnJlbnQgYXNtIGdlbmVyYXRlcyB0aGUgZm9sbG93aW5nIGxpbmsgZXJyb3I6CisjIHJlcXVpcmVzIHVuc3VwcG9ydGVkIGR5bmFtaWMgcmVsb2MgUl9BUk1fUkVMMzI7IHJlY29tcGlsZSB3aXRoIC1mUElDCisjIEJ1ZzogMTY4NTMyOTEKK0xPQ0FMX0xERkxBR1MgOj0gLVdsLC1Cc3ltYm9saWMKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0Y2JhNTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKQEAgLTAsMCArMSw3NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRIRVZDIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiaWhldmNfdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJpdi5oIgorI2luY2x1ZGUgIml2ZC5oIgorI2luY2x1ZGUgIml0aHJlYWQuaCIKKyNpbmNsdWRlICJpaGV2Y2RfY3hhLmgiCisjaW5jbHVkZSAiU29mdEhFVkMuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBjb21wb25lbnROYW1lICAgICAgICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLmhldmMiCisjZGVmaW5lIGNvZGluZ1R5cGUgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0NvZGluZ0hFVkMKKyNkZWZpbmUgQ09ERUNfTUlNRV9UWVBFICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDCisKKy8qKiBGdW5jdGlvbiBhbmQgc3RydWN0dXJlIGRlZmluaXRpb25zIHRvIGtlZXAgY29kZSBzaW1pbGFyIGZvciBlYWNoIGNvZGVjICovCisjZGVmaW5lIGl2ZGVjX2FwaV9mdW5jdGlvbiAgICAgICAgICAgICAgaWhldmNkX2N4YV9hcGlfZnVuY3Rpb24KKyNkZWZpbmUgaXZkZXh0X2luaXRfaXBfdCAgICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2luaXRfaXBfdAorI2RlZmluZSBpdmRleHRfaW5pdF9vcF90ICAgICAgICAgICAgICAgIGloZXZjZF9jeGFfaW5pdF9vcF90CisjZGVmaW5lIGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCAgICAgICAgaWhldmNkX2N4YV9maWxsX21lbV9yZWNfaXBfdAorI2RlZmluZSBpdmRleHRfZmlsbF9tZW1fcmVjX29wX3QgICAgICAgIGloZXZjZF9jeGFfZmlsbF9tZW1fcmVjX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QgICBpaGV2Y2RfY3hhX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpaGV2Y2RfY3hhX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKworI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKKyAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJSEVWQ0RfQ1hBX0NNRF9DVExfU0VUX05VTV9DT1JFUworCitzdGF0aWMgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwga1Byb2ZpbGVMZXZlbHNbXSA9IHsKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDEgIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwyICB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMjEgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDMgIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwzMSB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNCAgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDQxIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1ICB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNTEgfSwKK307CisKK1NvZnRIRVZDOjpTb2Z0SEVWQygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudChuYW1lLCBjb21wb25lbnROYW1lLCBjb2RpbmdUeXBlLAorICAgICAgICAgICAga1Byb2ZpbGVMZXZlbHMsIEFSUkFZX1NJWkUoa1Byb2ZpbGVMZXZlbHMpLAorICAgICAgICAgICAgMzIwIC8qIHdpZHRoICovLCAyNDAgLyogaGVpZ2h0ICovLCBjYWxsYmFja3MsCisgICAgICAgICAgICBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbU1lbVJlY29yZHMoTlVMTCksCisgICAgICBtRmx1c2hPdXRCdWZmZXIoTlVMTCksCisgICAgICBtT214Q29sb3JGb3JtYXQoT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciksCisgICAgICBtSXZDb2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtTmV3V2lkdGgobVdpZHRoKSwKKyAgICAgIG1OZXdIZWlnaHQobUhlaWdodCksCisgICAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uKGZhbHNlKSB7CisgICAgaW5pdFBvcnRzKGtOdW1CdWZmZXJzLCBJTlBVVF9CVUZfU0laRSwga051bUJ1ZmZlcnMsCisgICAgICAgICAgICBDT0RFQ19NSU1FX1RZUEUpOworICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7Cit9CisKK1NvZnRIRVZDOjp+U29mdEhFVkMoKSB7CisgICAgQUxPR0QoIkluIFNvZnRIRVZDOjp+U29mdEhFVkMiKTsKKyAgICBDSEVDS19FUShkZUluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7Cit9CisKK3N0YXRpYyBzaXplX3QgR2V0Q1BVQ29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HRCgiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3ZvaWQgU29mdEhFVkM6OmxvZ1ZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfY3RsX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2N0bF9vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfY3RsX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIHNfY3RsX2lwLnB2X3ZlcnNpb25fYnVmZmVyID0gYXUxX2J1ZjsKKyAgICBzX2N0bF9pcC51NF92ZXJzaW9uX2J1ZmZlcl9zaXplID0gc2l6ZW9mKGF1MV9idWYpOworCisgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19jdGxfaXAsCisgICAgICAgICAgICAodm9pZCAqKSZzX2N0bF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgdmVyc2lvbiBudW1iZXI6IDB4JXgiLAorICAgICAgICAgICAgICAgIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJJdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAgIChjaGFyICopc19jdGxfaXAucHZfdmVyc2lvbl9idWZmZXIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3N0YXR1c190IFNvZnRIRVZDOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSkgeworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90IHNfY3RsX2lwOworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfY3RsX29wOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICBzX2N0bF9pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpc3RyaWRlOworICAgIHNfY3RsX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisKKyAgICBzX2N0bF9pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKKyAgICBzX2N0bF9pcC5lX3ZpZF9kZWNfbW9kZSA9IElWRF9ERUNPREVfRlJBTUU7CisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7CisgICAgc19jdGxfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfaXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfb3BfdCk7CisKKyAgICBBTE9HVigiU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyBzdHJpZGUgPSAldSIsIHN0cmlkZSk7CisgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19jdGxfaXAsCisgICAgICAgICAgICAodm9pZCAqKSZzX2N0bF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHNldHRpbmcgdGhlIHJ1bi10aW1lIHBhcmFtZXRlcnM6IDB4JXgiLAorICAgICAgICAgICAgICAgIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworCisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRIRVZDOjpyZXNldFBsdWdpbigpIHsKKyAgICBtSXNJbkZsdXNoID0gZmFsc2U7CisgICAgbVJlY2VpdmVkRU9TID0gZmFsc2U7CisgICAgbWVtc2V0KG1UaW1lU3RhbXBzLCAwLCBzaXplb2YobVRpbWVTdGFtcHMpKTsKKyAgICBtZW1zZXQobVRpbWVTdGFtcHNWYWxpZCwgMCwgc2l6ZW9mKG1UaW1lU3RhbXBzVmFsaWQpKTsKKworICAgIC8qIEluaXRpYWxpemUgYm90aCBzdGFydCBhbmQgZW5kIHRpbWVzICovCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBOVUxMKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBOVUxMKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OnJlc2V0RGVjb2RlcigpIHsKKyAgICBpdmRfY3RsX3Jlc2V0X2lwX3Qgc19jdGxfaXA7CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfY3RsX29wOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfY3RsX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfUkVTRVQ7CisgICAgc19jdGxfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X2lwX3QpOworICAgIHNfY3RsX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfY3RsX2lwLAorICAgICAgICAgICAgKHZvaWQgKikmc19jdGxfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gcmVzZXQ6IDB4JXgiLCBzX2N0bF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLyogU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyAqLworICAgIHNldFBhcmFtcyhvdXRwdXRCdWZmZXJXaWR0aCgpKTsKKworICAgIC8qIFNldCBudW1iZXIgb2YgY29yZXMvdGhyZWFkcyB0byBiZSB1c2VkIGJ5IHRoZSBjb2RlYyAqLworICAgIHNldE51bUNvcmVzKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRIRVZDOjpzZXROdW1Db3JlcygpIHsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9jb3Jlc19vcDsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisgICAgc19zZXRfY29yZXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfc2V0X2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IE1JTihtTnVtQ29yZXMsIENPREVDX01BWF9OVU1fQ09SRVMpOworICAgIHNfc2V0X2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOworICAgIHNfc2V0X2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworICAgIEFMT0dEKCJTZXQgbnVtYmVyIG9mIGNvcmVzIHRvICV1Iiwgc19zZXRfY29yZXNfaXAudTRfbnVtX2NvcmVzKTsKKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX3NldF9jb3Jlc19pcCwKKyAgICAgICAgICAgICh2b2lkICopJnNfc2V0X2NvcmVzX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHNldHRpbmcgbnVtYmVyIG9mIGNvcmVzOiAweCV4IiwKKyAgICAgICAgICAgICAgICBzX3NldF9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OnNldEZsdXNoTW9kZSgpIHsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZkX2N0bF9mbHVzaF9pcF90IHNfdmlkZW9fZmx1c2hfaXA7CisgICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfdmlkZW9fZmx1c2hfb3A7CisKKyAgICBzX3ZpZGVvX2ZsdXNoX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc192aWRlb19mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3ZpZGVvX2ZsdXNoX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9pcF90KTsKKyAgICBzX3ZpZGVvX2ZsdXNoX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9vcF90KTsKKyAgICBBTE9HRCgiU2V0IHRoZSBkZWNvZGVyIGluIGZsdXNoIG1vZGUgIik7CisKKyAgICAvKiBTZXQgdGhlIGRlY29kZXIgaW4gRmx1c2ggbW9kZSwgc3Vic2VxdWVudCBkZWNvZGUoKSBjYWxscyB3aWxsIGZsdXNoICovCisgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc192aWRlb19mbHVzaF9pcCwKKyAgICAgICAgICAgICh2b2lkICopJnNfdmlkZW9fZmx1c2hfb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBzZXR0aW5nIHRoZSBkZWNvZGVyIGluIGZsdXNoIG1vZGU6ICglZCkgMHgleCIsIHN0YXR1cywKKyAgICAgICAgICAgICAgICBzX3ZpZGVvX2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtSXNJbkZsdXNoID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRIRVZDOjppbml0RGVjb2RlcigpIHsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBVV09SRDMyIHU0X251bV9yZW9yZGVyX2ZyYW1lczsKKyAgICBVV09SRDMyIHU0X251bV9yZWZfZnJhbWVzOworICAgIFVXT1JEMzIgdTRfc2hhcmVfZGlzcF9idWY7CisgICAgV09SRDMyIGk0X2xldmVsOworCisgICAgbU51bUNvcmVzID0gR2V0Q1BVQ29yZUNvdW50KCk7CisKKyAgICAvKiBJbml0aWFsaXplIG51bWJlciBvZiByZWYgYW5kIHJlb3JkZXIgbW9kZXMgKGZvciBIRVZDKSAqLworICAgIHU0X251bV9yZW9yZGVyX2ZyYW1lcyA9IDE2OworICAgIHU0X251bV9yZWZfZnJhbWVzID0gMTY7CisgICAgdTRfc2hhcmVfZGlzcF9idWYgPSAwOworCisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG91dHB1dEJ1ZmZlcldpZHRoKCk7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOworICAgIHVpbnQzMl90IGRpc3BsYXlTaXplWSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0OworCisgICAgaWYgKGRpc3BsYXlTaXplWSA+ICgxOTIwICogMTA4OCkpIHsKKyAgICAgICAgaTRfbGV2ZWwgPSA1MDsKKyAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICgxMjgwICogNzIwKSkgeworICAgICAgICBpNF9sZXZlbCA9IDQwOworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDk2MCAqIDU0MCkpIHsKKyAgICAgICAgaTRfbGV2ZWwgPSAzMTsKKyAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICg2NDAgKiAzNjApKSB7CisgICAgICAgIGk0X2xldmVsID0gMzA7CisgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoMzUyICogMjg4KSkgeworICAgICAgICBpNF9sZXZlbCA9IDIxOworICAgIH0gZWxzZSB7CisgICAgICAgIGk0X2xldmVsID0gMjA7CisgICAgfQorICAgIHsKKyAgICAgICAgaXZfbnVtX21lbV9yZWNfaXBfdCBzX251bV9tZW1fcmVjX2lwOworICAgICAgICBpdl9udW1fbWVtX3JlY19vcF90IHNfbnVtX21lbV9yZWNfb3A7CisKKyAgICAgICAgc19udW1fbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKHNfbnVtX21lbV9yZWNfaXApOworICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X3NpemUgPSBzaXplb2Yoc19udW1fbWVtX3JlY19vcCk7CisgICAgICAgIHNfbnVtX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfR0VUX05VTV9NRU1fUkVDOworCisgICAgICAgIEFMT0dWKCJHZXQgbnVtYmVyIG9mIG1lbSByZWNvcmRzIik7CisgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkKikmc19udW1fbWVtX3JlY19pcCwKKyAgICAgICAgICAgICAgICAodm9pZCopJnNfbnVtX21lbV9yZWNfb3ApOworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBnZXR0aW5nIG1lbSByZWNvcmRzOiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgc19udW1fbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbU51bU1lbVJlY29yZHMgPSBzX251bV9tZW1fcmVjX29wLnU0X251bV9tZW1fcmVjOworICAgIH0KKworICAgIG1NZW1SZWNvcmRzID0gKGl2X21lbV9yZWNfdCopaXZkX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgMTI4LCBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBpZiAobU1lbVJlY29yZHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbWVtc2V0KG1NZW1SZWNvcmRzLCAwLCBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKworICAgIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCBzX2ZpbGxfbWVtX2lwOworICAgICAgICBpdmRleHRfZmlsbF9tZW1fcmVjX29wX3Qgc19maWxsX21lbV9vcDsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworCisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfc2l6ZSA9CisgICAgICAgICAgICBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90KTsKKyAgICAgICAgc19maWxsX21lbV9pcC5pNF9sZXZlbCA9IGk0X2xldmVsOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnU0X251bV9yZW9yZGVyX2ZyYW1lcyA9IHU0X251bV9yZW9yZGVyX2ZyYW1lczsKKyAgICAgICAgc19maWxsX21lbV9pcC51NF9udW1fcmVmX2ZyYW1lcyA9IHU0X251bV9yZWZfZnJhbWVzOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnU0X3NoYXJlX2Rpc3BfYnVmID0gdTRfc2hhcmVfZGlzcF9idWY7CisgICAgICAgIHNfZmlsbF9tZW1faXAudTRfbnVtX2V4dHJhX2Rpc3BfYnVmID0gMDsKKyAgICAgICAgc19maWxsX21lbV9pcC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvckZvcm1hdDsKKworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LmVfY21kID0gSVZfQ01EX0ZJTExfTlVNX01FTV9SRUM7CisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QucHZfbWVtX3JlY19sb2NhdGlvbiA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X21heF9mcm1fd2QgPSBkaXNwbGF5U3RyaWRlOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X21heF9mcm1faHQgPSBkaXNwbGF5SGVpZ2h0OworICAgICAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X3NpemUgPQorICAgICAgICAgICAgc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCk7CisKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykKKyAgICAgICAgICAgIHBzX21lbV9yZWNbaV0udTRfc2l6ZSA9IHNpemVvZihpdl9tZW1fcmVjX3QpOworCisgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZmlsbF9tZW1faXAsCisgICAgICAgICAgICAgICAgKHZvaWQgKikmc19maWxsX21lbV9vcCk7CisKKyAgICAgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZmlsbGluZyBtZW0gcmVjb3JkczogMHgleCIsCisgICAgICAgICAgICAgICAgICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtTnVtTWVtUmVjb3JkcyA9CisgICAgICAgICAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X251bV9tZW1fcmVjX2ZpbGxlZDsKKworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnB2X2Jhc2UgPSBpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9hbGlnbm1lbnQsIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgIGlmIChwc19tZW1fcmVjLT5wdl9iYXNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBtZW1vcnkgcmVjb3JkICMlenUgb2Ygc2l6ZSAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gSVZfRkFJTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBkZWNvZGVyICovCisgICAgeworICAgICAgICBpdmRleHRfaW5pdF9pcF90IHNfaW5pdF9pcDsKKyAgICAgICAgaXZkZXh0X2luaXRfb3BfdCBzX2luaXRfb3A7CisKKyAgICAgICAgdm9pZCAqZGVjX2Z4bnMgPSAodm9pZCAqKWl2ZGVjX2FwaV9mdW5jdGlvbjsKKworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2luaXRfaXBfdCk7CisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9jbWQgPSAoSVZEX0FQSV9DT01NQU5EX1RZUEVfVClJVl9DTURfSU5JVDsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfZnJtX21heF93ZCA9IGRpc3BsYXlTdHJpZGU7CisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfZnJtX21heF9odCA9IGRpc3BsYXlIZWlnaHQ7CisKKyAgICAgICAgc19pbml0X2lwLmk0X2xldmVsID0gaTRfbGV2ZWw7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fcmVvcmRlcl9mcmFtZXMgPSB1NF9udW1fcmVvcmRlcl9mcmFtZXM7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fcmVmX2ZyYW1lcyA9IHU0X251bV9yZWZfZnJhbWVzOworICAgICAgICBzX2luaXRfaXAudTRfc2hhcmVfZGlzcF9idWYgPSB1NF9zaGFyZV9kaXNwX2J1ZjsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9leHRyYV9kaXNwX2J1ZiA9IDA7CisKKyAgICAgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9zaXplID0gc2l6ZW9mKHNfaW5pdF9vcCk7CisKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yRm9ybWF0OworCisgICAgICAgIG1Db2RlY0N0eCA9IChpdl9vYmpfdCopbU1lbVJlY29yZHNbMF0ucHZfYmFzZTsKKyAgICAgICAgbUNvZGVjQ3R4LT5wdl9meG5zID0gZGVjX2Z4bnM7CisgICAgICAgIG1Db2RlY0N0eC0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisKKyAgICAgICAgQUxPR0QoIkluaXRpYWxpemluZyBkZWNvZGVyIik7CisgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfaW5pdF9pcCwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSZzX2luaXRfb3ApOworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBpbml0OiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyogUmVzZXQgdGhlIHBsdWdpbiBzdGF0ZSAqLworICAgIHJlc2V0UGx1Z2luKCk7CisKKyAgICAvKiBTZXQgdGhlIHJ1biB0aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzICovCisgICAgc2V0UGFyYW1zKGRpc3BsYXlTdHJpZGUpOworCisgICAgLyogU2V0IG51bWJlciBvZiBjb3Jlcy90aHJlYWRzIHRvIGJlIHVzZWQgYnkgdGhlIGNvZGVjICovCisgICAgc2V0TnVtQ29yZXMoKTsKKworICAgIC8qIEdldCBjb2RlYyB2ZXJzaW9uICovCisgICAgbG9nVmVyc2lvbigpOworCisgICAgLyogQWxsb2NhdGUgaW50ZXJuYWwgcGljdHVyZSBidWZmZXIgKi8KKyAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVNpemVZICogMyAvIDI7CisgICAgbUZsdXNoT3V0QnVmZmVyID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MoMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoTlVMTCA9PSBtRmx1c2hPdXRCdWZmZXIpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmbHVzaE91dHB1dEJ1ZmZlciBvZiBzaXplICV6dSIsIGJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1Jbml0TmVlZGVkID0gZmFsc2U7CisgICAgbUZsdXNoTmVlZGVkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0SEVWQzo6ZGVJbml0RGVjb2RlcigpIHsKKyAgICBzaXplX3QgaTsKKworICAgIGlmIChtTWVtUmVjb3JkcykgeworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBBTE9HRCgiRnJlZWluZyBjb2RlYyBtZW1vcnkiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIGlmKHBzX21lbV9yZWMtPnB2X2Jhc2UpIHsKKyAgICAgICAgICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKHBzX21lbV9yZWMtPnB2X2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobU1lbVJlY29yZHMpOworICAgICAgICBtTWVtUmVjb3JkcyA9IE5VTEw7CisgICAgfQorCisgICAgaWYobUZsdXNoT3V0QnVmZmVyKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobUZsdXNoT3V0QnVmZmVyKTsKKyAgICAgICAgbUZsdXNoT3V0QnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICBtSW5pdE5lZWRlZCA9IHRydWU7CisgICAgbUNoYW5naW5nUmVzb2x1dGlvbiA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0SEVWQzo6cmVJbml0RGVjb2RlcigpIHsKKyAgICBzdGF0dXNfdCByZXQ7CisKKyAgICBkZUluaXREZWNvZGVyKCk7CisKKyAgICByZXQgPSBpbml0RGVjb2RlcigpOworICAgIGlmIChPSyAhPSByZXQpIHsKKyAgICAgICAgQUxPR0UoIkNyZWF0ZSBmYWlsdXJlIik7CisgICAgICAgIGRlSW5pdERlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFNvZnRIRVZDOjpvblJlc2V0KCkgeworICAgIEFMT0dEKCJvblJlc2V0IGNhbGxlZCIpOworICAgIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om9uUmVzZXQoKTsKKworICAgIHJlc2V0RGVjb2RlcigpOworICAgIHJlc2V0UGx1Z2luKCk7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEhFVkM6OmludGVybmFsU2V0UGFyYW1ldGVyKE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgY29uc3QgdWludDMyX3Qgb2xkV2lkdGggPSBtV2lkdGg7CisgICAgY29uc3QgdWludDMyX3Qgb2xkSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIGlmIChtV2lkdGggIT0gb2xkV2lkdGggfHwgbUhlaWdodCAhPSBvbGRIZWlnaHQpIHsKKyAgICAgICAgcmVJbml0RGVjb2RlcigpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIFNvZnRIRVZDOjpzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjX2lwLAorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY19vcCwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyLAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyLAorICAgICAgICBzaXplX3QgdGltZVN0YW1wSXgpIHsKKyAgICBzaXplX3Qgc2l6ZVkgPSBvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCk7CisgICAgc2l6ZV90IHNpemVVVjsKKyAgICB1aW50OF90ICpwQnVmOworCisgICAgcHNfZGVjX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CisKKyAgICBwc19kZWNfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19ERUNPREU7CisKKyAgICAvKiBXaGVuIGluIGZsdXNoIGFuZCBhZnRlciBFT1Mgd2l0aCB6ZXJvIGJ5dGUgaW5wdXQsCisgICAgICogaW5IZWFkZXIgaXMgc2V0IHRvIHplcm8uIEhlbmNlIGNoZWNrIGZvciBub24tbnVsbCAqLworICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICBwc19kZWNfaXAtPnU0X3RzID0gdGltZVN0YW1wSXg7CisgICAgICAgIHBzX2RlY19pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IGluSGVhZGVyLT5wQnVmZmVyCisgICAgICAgICAgICAgICAgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgcHNfZGVjX2lwLT51NF9udW1fQnl0ZXMgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNfaXAtPnU0X3RzID0gMDsKKyAgICAgICAgcHNfZGVjX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gTlVMTDsKKyAgICAgICAgcHNfZGVjX2lwLT51NF9udW1fQnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmIChvdXRIZWFkZXIpIHsKKyAgICAgICAgcEJ1ZiA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBwQnVmID0gbUZsdXNoT3V0QnVmZmVyOworICAgIH0KKworICAgIHNpemVVViA9IHNpemVZIC8gNDsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gc2l6ZVk7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IHNpemVVVjsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gc2l6ZVVWOworCisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBwQnVmOworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gcEJ1ZiArIHNpemVZOworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gcEJ1ZiArIHNpemVZICsgc2l6ZVVWOworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKKyAgICByZXR1cm47Cit9Cit2b2lkIFNvZnRIRVZDOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIC8qIE9uY2UgdGhlIG91dHB1dCBidWZmZXJzIGFyZSBmbHVzaGVkLCBpZ25vcmUgYW55IGJ1ZmZlcnMgdGhhdCBhcmUgaGVsZCBpbiBkZWNvZGVyICovCisgICAgaWYgKGtPdXRwdXRQb3J0SW5kZXggPT0gcG9ydEluZGV4KSB7CisgICAgICAgIHNldEZsdXNoTW9kZSgpOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNfaXA7CisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNfb3A7CisgICAgICAgICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZVksIHNpemVVVjsKKworICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgTlVMTCwgTlVMTCwgMCk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZzX2RlY19vcCk7CisgICAgICAgICAgICBpZiAoMCA9PSBzX2RlY19vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU29mdEhFVkM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBVTlVTRUQocG9ydEluZGV4KTsKKworICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZShrSW5wdXRQb3J0SW5kZXgpOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoa091dHB1dFBvcnRJbmRleCk7CisKKyAgICAvKiBJZiBpbnB1dCBFT1MgaXMgc2VlbiBhbmQgZGVjb2RlciBpcyBub3QgaW4gZmx1c2ggbW9kZSwKKyAgICAgKiBzZXQgdGhlIGRlY29kZXIgaW4gZmx1c2ggbW9kZS4KKyAgICAgKiBUaGVyZSBjYW4gYmUgYSBjYXNlIHdoZXJlIEVPUyBpcyBzZW50IGFsb25nIHdpdGggbGFzdCBwaWN0dXJlIGRhdGEKKyAgICAgKiBJbiB0aGF0IGNhc2UsIG9ubHkgYWZ0ZXIgZGVjb2RpbmcgdGhhdCBpbnB1dCBkYXRhLCBkZWNvZGVyIGhhcyB0byBiZQorICAgICAqIHB1dCBpbiBmbHVzaC4gVGhpcyBjYXNlIGlzIGhhbmRsZWQgaGVyZSAgKi8KKworICAgIGlmIChtUmVjZWl2ZWRFT1MgJiYgIW1Jc0luRmx1c2gpIHsKKyAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgfQorCisgICAgd2hpbGUgKCFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbzsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyOworCisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm87CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXI7CisgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeDsKKworICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFtSXNJbkZsdXNoKSB7CisgICAgICAgICAgICBpZiAoIWluUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IDA7CisgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CisKKyAgICAgICAgaWYgKGluSGVhZGVyICE9IE5VTEwgJiYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICBBTE9HRCgiRU9TIHNlZW4gb24gaW5wdXQiKTsKKyAgICAgICAgICAgIG1SZWNlaXZlZEVPUyA9IHRydWU7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzZXRGbHVzaE1vZGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFdoZW4gdGhlcmUgaXMgYW4gaW5pdCByZXF1aXJlZCBhbmQgdGhlIGRlY29kZXIgaXMgbm90IGluIGZsdXNoIG1vZGUsCisgICAgICAgIC8vIHVwZGF0ZSBvdXRwdXQgcG9ydCdzIGRlZmluaXRpb24gYW5kIHJlaW5pdGlhbGl6ZSBkZWNvZGVyLgorICAgICAgICBpZiAobUluaXROZWVkZWQgJiYgIW1Jc0luRmx1c2gpIHsKKyAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCZwb3J0V2lsbFJlc2V0LCBtTmV3V2lkdGgsIG1OZXdIZWlnaHQpOworCisgICAgICAgICAgICBDSEVDS19FUShyZUluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgYSBmcmVlIHNsb3QgaW4gdGltZXN0YW1wIGFycmF5IHRvIGhvbGQgaW5wdXQgdGltZXN0YW1wICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCBpOworICAgICAgICAgICAgdGltZVN0YW1wSXggPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9USU1FX1NUQU1QUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtVGltZVN0YW1wc1ZhbGlkW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVTdGFtcEl4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluSGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1ZhbGlkW3RpbWVTdGFtcEl4XSA9IHRydWU7CisgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNbdGltZVN0YW1wSXhdID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNfaXA7CisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNfb3A7CisgICAgICAgICAgICBXT1JEMzIgdGltZURlbGF5LCB0aW1lVGFrZW47CisgICAgICAgICAgICBzaXplX3Qgc2l6ZVksIHNpemVVVjsKKworICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpOworCisgICAgICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsKKyAgICAgICAgICAgIC8qIENvbXB1dGUgdGltZSBlbGFwc2VkIGJldHdlZW4gZW5kIG9mIHByZXZpb3VzIGRlY29kZSgpCisgICAgICAgICAgICAgKiB0byBzdGFydCBvZiBjdXJyZW50IGRlY29kZSgpICovCisgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIHRpbWVEZWxheSk7CisKKyAgICAgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICAgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLCAodm9pZCAqKSZzX2RlY19vcCk7CisgICAgICAgICAgICAvLyBGSVhNRTogQ29tcGFyZSB8c3RhdHVzfCB0byBJSEVWQ0RfVU5TVVBQT1JURURfRElNRU5TSU9OUywgd2hpY2ggaXMgbm90IG9uZSBvZiB0aGUKKyAgICAgICAgICAgIC8vIElWX0FQSV9DQUxMX1NUQVRVU19ULCBzZWVtcyBiZSB3cm9uZy4gQnV0IHRoaXMgaXMgd2hhdCB0aGUgZGVjb2RlciByZXR1cm5zIHJpZ2h0IG5vdy4KKyAgICAgICAgICAgIC8vIFRoZSBkZWNvZGVyIHNob3VsZCBiZSBmaXhlZCBzbyB0aGF0IHx1NF9lcnJvcl9jb2RlfCBpbnN0ZWFkIG9mIHxzdGF0dXN8IHJldHVybnMKKyAgICAgICAgICAgIC8vIElIRVZDRF9VTlNVUFBPUlRFRF9ESU1FTlNJT05TLgorICAgICAgICAgICAgYm9vbCB1bnN1cHBvcnRlZERpbWVuc2lvbnMgPQorICAgICAgICAgICAgICAgICgoSUhFVkNEX1VOU1VQUE9SVEVEX0RJTUVOU0lPTlMgPT0gc3RhdHVzKQorICAgICAgICAgICAgICAgICAgICB8fCAoSUhFVkNEX1VOU1VQUE9SVEVEX0RJTUVOU0lPTlMgPT0gc19kZWNfb3AudTRfZXJyb3JfY29kZSkpOworICAgICAgICAgICAgYm9vbCByZXNDaGFuZ2VkID0gKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKTsKKworICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIE5VTEwpOworICAgICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIHRha2VuIGZvciBkZWNvZGUoKSAqLworICAgICAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCB0aW1lVGFrZW4pOworCisgICAgICAgICAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCisgICAgICAgICAgICAgICAgICAgc19kZWNfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgICAgIGlmIChzX2RlY19vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcgJiYgIW1GbHVzaE5lZWRlZCkgeworICAgICAgICAgICAgICAgIG1GbHVzaE5lZWRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoaW5IZWFkZXIgIT0gTlVMTCkgJiYgKDEgIT0gc19kZWNfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnKSkgeworICAgICAgICAgICAgICAgIC8qIElmIHRoZSBpbnB1dCBkaWQgbm90IGNvbnRhaW4gcGljdHVyZSBkYXRhLCB0aGVuIGlnbm9yZQorICAgICAgICAgICAgICAgICAqIHRoZSBhc3NvY2lhdGVkIHRpbWVzdGFtcCAqLworICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBzVmFsaWRbdGltZVN0YW1wSXhdID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIGhhbmRsZSBDVFMgRGVjb2RlclRlc3QgdGVzdENvZGVjUmVzZXRzSEVWQ1dpdGhvdXRTdXJmYWNlLAorICAgICAgICAgICAgLy8gd2hpY2ggaXMgbm90IHNlbmRpbmcgU1BTL1BQUyBhZnRlciBwb3J0IHJlY29uZmlndXJhdGlvbiBhbmQgZmx1c2ggdG8gdGhlIGNvZGVjLgorICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkRGltZW5zaW9ucyAmJiAhbUZsdXNoTmVlZGVkKSB7CisgICAgICAgICAgICAgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCZwb3J0V2lsbFJlc2V0LCBzX2RlY19vcC51NF9waWNfd2QsIHNfZGVjX29wLnU0X3BpY19odCk7CisKKyAgICAgICAgICAgICAgICBDSEVDS19FUShyZUluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7CisKKyAgICAgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCk7CisKKyAgICAgICAgICAgICAgICBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2RlY19pcCwgKHZvaWQgKikmc19kZWNfb3ApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhlIGRlY29kZXIgaXMgaW4gdGhlIGNoYW5naW5nIHJlc29sdXRpb24gbW9kZSBhbmQgdGhlcmUgaXMgbm8gb3V0cHV0IHByZXNlbnQsCisgICAgICAgICAgICAvLyB0aGF0IG1lYW5zIHRoZSBzd2l0Y2hpbmcgaXMgZG9uZSBhbmQgaXQncyByZWFkeSB0byByZXNldCB0aGUgZGVjb2RlciBhbmQgdGhlIHBsdWdpbi4KKyAgICAgICAgICAgIGlmIChtQ2hhbmdpbmdSZXNvbHV0aW9uICYmICFzX2RlY19vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWREaW1lbnNpb25zIHx8IHJlc0NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobUZsdXNoTmVlZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEZsdXNoTW9kZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZERpbWVuc2lvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5ld1dpZHRoID0gc19kZWNfb3AudTRfcGljX3dkOworICAgICAgICAgICAgICAgICAgICBtTmV3SGVpZ2h0ID0gc19kZWNfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgICAgICBtSW5pdE5lZWRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKDAgPCBzX2RlY19vcC51NF9waWNfd2QpICYmICgwIDwgc19kZWNfb3AudTRfcGljX2h0KSkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoID0gc19kZWNfb3AudTRfcGljX3dkOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IHNfZGVjX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgICAgICAgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzX2RlY19vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChtV2lkdGggKiBtSGVpZ2h0ICogMykgLyAyOworCisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gbVRpbWVTdGFtcHNbc19kZWNfb3AudTRfdHNdOworICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBzVmFsaWRbc19kZWNfb3AudTRfdHNdID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBpbiBmbHVzaCBtb2RlIGFuZCBubyBvdXRwdXQgaXMgcmV0dXJuZWQgYnkgdGhlIGNvZGVjLAorICAgICAgICAgICAgICAgICAqIHRoZW4gY29tZSBvdXQgb2YgZmx1c2ggbW9kZSAqLworICAgICAgICAgICAgICAgIG1Jc0luRmx1c2ggPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8qIElmIEVPUyB3YXMgcmVjaWV2ZWQgb24gaW5wdXQgcG9ydCBhbmQgdGhlcmUgaXMgbm8gb3V0cHV0CisgICAgICAgICAgICAgICAgICogZnJvbSB0aGUgY29kZWMsIHRoZW4gc2lnbmFsIEVPUyBvbiBvdXRwdXQgcG9ydCAqLworICAgICAgICAgICAgICAgIGlmIChtUmVjZWl2ZWRFT1MpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IEhhbmRsZSBtb3JlIHRoYW4gb25lIHBpY3R1cmUgZGF0YQorICAgICAgICBpZiAoaW5IZWFkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudChjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRIRVZDKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWY1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5oCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUX0hFVkNfSF8KKworI2RlZmluZSBTT0ZUX0hFVkNfSF8KKworI2luY2x1ZGUgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgaXZkX2FsaWduZWRfbWFsbG9jKGFsaWdubWVudCwgc2l6ZSkgbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKQorI2RlZmluZSBpdmRfYWxpZ25lZF9mcmVlKGJ1ZikgZnJlZShidWYpCisKKy8qKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdGltZS1zdGFtcCBhcnJheSAqLworI2RlZmluZSBNQVhfVElNRV9TVEFNUFMgNjQKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIGNvcmVzIHN1cHBvcnRlZCBieSB0aGUgY29kZWMgKi8KKyNkZWZpbmUgQ09ERUNfTUFYX05VTV9DT1JFUyA0CisKKyNkZWZpbmUgQ09ERUNfTUFYX1dJRFRIICAgICAxOTIwCisKKyNkZWZpbmUgQ09ERUNfTUFYX0hFSUdIVCAgICAxMDg4CisKKy8qKiBJbnB1dCBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBJTlBVVF9CVUZfU0laRSAoMTAyNCAqIDEwMjQpCisKKyNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikpID8gKGEpIDogKGIpCisKKy8qKiBVc2VkIHRvIHJlbW92ZSB3YXJuaW5ncyBhYm91dCB1bnVzZWQgcGFyYW1ldGVycyAqLworI2RlZmluZSBVTlVTRUQoeCkgKCh2b2lkKSh4KSkKKworLyoqIEdldCB0aW1lICovCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgZ2V0dGltZW9mZGF5KGEsIGIpOworCisvKiogQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gc3RhcnQgYW5kIGVuZCAqLworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgXAorICAgIGRpZmYgPSAoKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoZW5kLnR2X3VzZWMgLSBzdGFydC50dl91c2VjKTsKKworc3RydWN0IFNvZnRIRVZDOiBwdWJsaWMgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCB7CisgICAgU29mdEhFVkMoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Tb2Z0SEVWQygpOworCisgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKTsKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworcHJpdmF0ZToKKyAgICAvLyBOdW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCisgICAgZW51bSB7CisgICAgICAgIGtOdW1CdWZmZXJzID0gOAorICAgIH07CisKKyAgICBpdl9vYmpfdCAqbUNvZGVjQ3R4OyAgICAgICAgIC8vIENvZGVjIGNvbnRleHQKKyAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOyAgIC8vIE1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKyAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7ICAgICAgIC8vIE51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgdGhlIGNvZGVjCisKKyAgICBzaXplX3QgbU51bUNvcmVzOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcyB0byBiZSB1ZXNkIGJ5IHRoZSBjb2RlYworCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgICAvLyBUaW1lIGF0IHRoZSBzdGFydCBvZiBkZWNvZGUoKQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAgLy8gVGltZSBhdCB0aGUgZW5kIG9mIGRlY29kZSgpCisKKyAgICAvLyBJbnRlcm5hbCBidWZmZXIgdG8gYmUgdXNlZCB0byBmbHVzaCBvdXQgdGhlIGJ1ZmZlcnMgZnJvbSBkZWNvZGVyCisgICAgdWludDhfdCAqbUZsdXNoT3V0QnVmZmVyOworCisgICAgLy8gU3RhdHVzIG9mIGVudHJpZXMgaW4gdGhlIHRpbWVzdGFtcCBhcnJheQorICAgIGJvb2wgbVRpbWVTdGFtcHNWYWxpZFtNQVhfVElNRV9TVEFNUFNdOworCisgICAgLy8gVGltZXN0YW1wIGFycmF5IC0gU2luY2UgY29kZWMgZG9lcyBub3QgdGFrZSA2NCBiaXQgdGltZXN0YW1wcywKKyAgICAvLyB0aGV5IGFyZSBtYWludGFpbmVkIGluIHRoZSBwbHVnaW4KKyAgICBPTVhfUzY0IG1UaW1lU3RhbXBzW01BWF9USU1FX1NUQU1QU107CisKKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBtT214Q29sb3JGb3JtYXQ7ICAgIC8vIE9NWCBDb2xvciBmb3JtYXQKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvckZvcm1hdDsgICAgICAgIC8vIEl0dGlhbSBDb2xvciBmb3JtYXQKKworICAgIGJvb2wgbUlzSW5GbHVzaDsgICAgICAgIC8vIGNvZGVjIGlzIGZsdXNoIG1vZGUKKyAgICBib29sIG1SZWNlaXZlZEVPUzsgICAgICAvLyBFT1MgaXMgcmVjZWlldmVkIG9uIGlucHV0IHBvcnQKKyAgICBib29sIG1Jbml0TmVlZGVkOworICAgIHVpbnQzMl90IG1OZXdXaWR0aDsKKyAgICB1aW50MzJfdCBtTmV3SGVpZ2h0OworICAgIC8vIFRoZSBpbnB1dCBzdHJlYW0gaGFzIGNoYW5nZWQgdG8gYSBkaWZmZXJlbnQgcmVzb2x1dGlvbiwgd2hpY2ggaXMgc3RpbGwgc3VwcG9ydGVkIGJ5IHRoZQorICAgIC8vIGNvZGVjLiBTbyB0aGUgY29kZWMgaXMgc3dpdGNoaW5nIHRvIGRlY29kZSB0aGUgbmV3IHJlc29sdXRpb24uCisgICAgYm9vbCBtQ2hhbmdpbmdSZXNvbHV0aW9uOworICAgIGJvb2wgbUZsdXNoTmVlZGVkOworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBkZUluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1zKHNpemVfdCBzdHJpZGUpOworICAgIHZvaWQgbG9nVmVyc2lvbigpOworICAgIHN0YXR1c190IHNldE51bUNvcmVzKCk7CisgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgcmVzZXRQbHVnaW4oKTsKKyAgICBzdGF0dXNfdCByZUluaXREZWNvZGVyKCk7CisKKyAgICB2b2lkIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjX29wLAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIsCisgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyAoU29mdEhFVkMpOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfSEVWQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rCmluZGV4IGEzZDU3NzkuLjFkMjMyYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsKQEAgLTQ2LDYgKzQ2LDggQEAKIAogTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9FWFBPUlRfUkVGPSAtRE9TQ0xfSU1QT1JUX1JFRj0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtNzIsNCArNzQsNiBAQAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRkZWMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAppbmRleCBmYjJhNDMwLi4xZjRiNmZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCkBAIC05MSw3ICs5MSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIFNvZnRNUEVHNDo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0TVBFRzQ6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTM0LDYgKzEzNCwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgdWludDhfdCAqYml0c3RyZWFtID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgdWludDMyX3QgKnN0YXJ0X2NvZGUgPSAodWludDMyX3QgKiliaXRzdHJlYW07CisgICAgICAgIGJvb2wgdm9sSGVhZGVyID0gKnN0YXJ0X2NvZGUgPT0gMHhCMDAxMDAwMDsKKyAgICAgICAgaWYgKHZvbEhlYWRlcikgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1IYW5kbGUpOworICAgICAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewogICAgICAgICAgICAgdWludDhfdCAqdm9sX2RhdGFbMV07CkBAIC0xNDEsNyArMTQ3LDcgQEAKIAogICAgICAgICAgICAgdm9sX2RhdGFbMF0gPSBOVUxMOwogCi0gICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB7CisgICAgICAgICAgICBpZiAoKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgfHwgdm9sSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgdm9sX2RhdGFbMF0gPSBiaXRzdHJlYW07CiAgICAgICAgICAgICAgICAgdm9sX3NpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKICAgICAgICAgICAgIH0KQEAgLTE1MCw3ICsxNTYsOCBAQAogICAgICAgICAgICAgICAgIChtTW9kZSA9PSBNT0RFX01QRUc0KSA/IE1QRUc0X01PREUgOiBIMjYzX01PREU7CiAKICAgICAgICAgICAgIEJvb2wgc3VjY2VzcyA9IFBWSW5pdFZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgbVdpZHRoLCBtSGVpZ2h0LCBtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyV2lkdGgoKSwgb3V0cHV0QnVmZmVySGVpZ2h0KCksIG1vZGUpOwogCiAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZC4gVW5zdXBwb3J0ZWQgY29udGVudD8iKTsKQEAgLTE2OSwyMSArMTc2LDI2IEBACiAKICAgICAgICAgICAgIFBWU2V0UG9zdFByb2NUeXBlKChWaWRlb0RlY0NvbnRyb2xzICopIG1IYW5kbGUsIDApOwogCisgICAgICAgICAgICBib29sIGhhc0ZyYW1lRGF0YSA9IGZhbHNlOwogICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgewogICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgICAgICBpbkluZm8gPSBOVUxMOwogICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CiAgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIGlmICh2b2xIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBoYXNGcmFtZURhdGEgPSB0cnVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwogCi0gICAgICAgICAgICBpZiAobW9kZSA9PSBNUEVHNF9NT0RFICYmIHBvcnRTZXR0aW5nc0NoYW5nZWQoKSkgeworICAgICAgICAgICAgaWYgKG1vZGUgPT0gTVBFRzRfTU9ERSAmJiBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoKSkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoIWhhc0ZyYW1lRGF0YSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtRnJhbWVzQ29uZmlndXJlZCkgewpAQCAtMjIzLDcgKzIzNSw5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocG9ydFNldHRpbmdzQ2hhbmdlZCgpKSB7CisgICAgICAgIC8vIEgyNjMgZG9lc24ndCBoYXZlIFZPTCBoZWFkZXIsIHRoZSBmcmFtZSBzaXplIGluZm9ybWF0aW9uIGlzIGluIHNob3J0IGhlYWRlciwgaS5lLiB0aGUKKyAgICAgICAgLy8gZGVjb2RlciBtYXkgZGV0ZWN0IHNpemUgY2hhbmdlIGFmdGVyIFBWRGVjb2RlVmlkZW9GcmFtZS4KKyAgICAgICAgaWYgKGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMjY5LDcgKzI4Myw3IEBACiAgICAgfQogfQogCi1ib29sIFNvZnRNUEVHNDo6cG9ydFNldHRpbmdzQ2hhbmdlZCgpIHsKK2Jvb2wgU29mdE1QRUc0OjpoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoKSB7CiAgICAgdWludDMyX3QgZGlzcF93aWR0aCwgZGlzcF9oZWlnaHQ7CiAgICAgUFZHZXRWaWRlb0RpbWVuc2lvbnMobUhhbmRsZSwgKGludDMyICopJmRpc3Bfd2lkdGgsIChpbnQzMiAqKSZkaXNwX2hlaWdodCk7CiAKQEAgLTI4MiwyNSArMjk2LDI0IEBACiAgICAgQUxPR1YoImRpc3Bfd2lkdGggPSAlZCwgZGlzcF9oZWlnaHQgPSAlZCwgYnVmX3dpZHRoID0gJWQsIGJ1Zl9oZWlnaHQgPSAlZCIsCiAgICAgICAgICAgICBkaXNwX3dpZHRoLCBkaXNwX2hlaWdodCwgYnVmX3dpZHRoLCBidWZfaGVpZ2h0KTsKIAotICAgIGlmIChtQ3JvcFdpZHRoICE9IGRpc3Bfd2lkdGgKLSAgICAgICAgICAgIHx8IG1Dcm9wSGVpZ2h0ICE9IGRpc3BfaGVpZ2h0KSB7Ci0gICAgICAgIG1Dcm9wTGVmdCA9IDA7Ci0gICAgICAgIG1Dcm9wVG9wID0gMDsKLSAgICAgICAgbUNyb3BXaWR0aCA9IGRpc3Bfd2lkdGg7Ci0gICAgICAgIG1Dcm9wSGVpZ2h0ID0gZGlzcF9oZWlnaHQ7CisgICAgQ3JvcFNldHRpbmdzTW9kZSBjcm9wU2V0dGluZ3NNb2RlID0ga0Nyb3BVblNldDsKKyAgICBpZiAoZGlzcF93aWR0aCAhPSBidWZfd2lkdGggfHwgZGlzcF9oZWlnaHQgIT0gYnVmX2hlaWdodCkgeworICAgICAgICBjcm9wU2V0dGluZ3NNb2RlID0ga0Nyb3BTZXQ7CiAKLSAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsCi0gICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwKLSAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBpZiAobUNyb3BXaWR0aCAhPSBkaXNwX3dpZHRoIHx8IG1Dcm9wSGVpZ2h0ICE9IGRpc3BfaGVpZ2h0KSB7CisgICAgICAgICAgICBtQ3JvcExlZnQgPSAwOworICAgICAgICAgICAgbUNyb3BUb3AgPSAwOworICAgICAgICAgICAgbUNyb3BXaWR0aCA9IGRpc3Bfd2lkdGg7CisgICAgICAgICAgICBtQ3JvcEhlaWdodCA9IGRpc3BfaGVpZ2h0OworICAgICAgICAgICAgY3JvcFNldHRpbmdzTW9kZSA9IGtDcm9wQ2hhbmdlZDsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChidWZfd2lkdGggIT0gbVdpZHRoIHx8IGJ1Zl9oZWlnaHQgIT0gbUhlaWdodCkgewotICAgICAgICBtV2lkdGggPSBidWZfd2lkdGg7Ci0gICAgICAgIG1IZWlnaHQgPSBidWZfaGVpZ2h0OwotCi0gICAgICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOwotCisgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgY29uc3QgYm9vbCBmYWtlU3RyaWRlID0gdHJ1ZTsKKyAgICBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoCisgICAgICAgICAgICAmcG9ydFdpbGxSZXNldCwgYnVmX3dpZHRoLCBidWZfaGVpZ2h0LCBjcm9wU2V0dGluZ3NNb2RlLCBmYWtlU3RyaWRlKTsKKyAgICBpZiAocG9ydFdpbGxSZXNldCkgewogICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9IMjYzKSB7CiAgICAgICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobUhhbmRsZSk7CiAKQEAgLTMwOSw3ICszMjIsNyBAQAogCiAgICAgICAgICAgICB2b2xfZGF0YVswXSA9IE5VTEw7CiAgICAgICAgICAgICBpZiAoIVBWSW5pdFZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLCBvdXRwdXRCdWZmZXJXaWR0aCgpLCBvdXRwdXRCdWZmZXJIZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICAgSDI2M19NT0RFKSkgewogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtMzE4LDEzICszMzEsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSBmYWxzZTsKLQotICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7Ci0gICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKLSAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBwb3J0V2lsbFJlc2V0OwogfQogCiB2b2lkIFNvZnRNUEVHNDo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5oCmluZGV4IGRlMTRhYWYuLjhhMDZhMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuaApAQCAtNjcsNyArNjcsNyBAQAogICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7Ci0gICAgYm9vbCBwb3J0U2V0dGluZ3NDaGFuZ2VkKCk7CisgICAgYm9vbCBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRNUEVHNCk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZ2V0X3ByZWRfYWR2X2JfYWRkLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX2Fkdl9iX2FkZC5jcHAKaW5kZXggZTIzZjIzZC4uZmU5ZTdkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZ2V0X3ByZWRfYWR2X2JfYWRkLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9hZHZfYl9hZGQuY3BwCkBAIC05Niw3ICs5Niw3IEBACiAgICAgb2Zmc2V0ID0gd2lkdGggLSBCX1NJWkU7IC8qIG9mZnNldCBmb3IgcHJldiAqLwogICAgIG9mZnNldDIgPSAocHJlZF93aWR0aF9ybmQgPj4gMSkgLSA0OyAvKiBvZmZzZXQgZm9yIHByZWRfYmxvY2sgKi8KIAotICAgIHRtcCA9ICh1aW50MzIpcHJldiAmIDB4MzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAweDM7CiAgICAgcHJlZF9ibG9jayAtPSBvZmZzZXQyOyAvKiBwcmVzZXQgKi8KIAogICAgIGlmICh0bXAgPT0gMCkgIC8qIHdvcmQtYWxpZ25lZCAqLwpAQCAtMjAzLDcgKzIwMyw3IEBACiAgICAgLyogQnJhbmNoIGJhc2VkIG9uIHBpeGVsIGxvY2F0aW9uIChoYWxmLXBlbCBvciBmdWxsLXBlbCkgZm9yIHggYW5kIHkgKi8KICAgICBwcmVkX2Jsb2NrIC09IG9mZnNldDI7IC8qIHByZXNldCAqLwogCi0gICAgdG1wID0gKHVpbnQzMilwcmV2ICYgMzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAzOwogICAgIG1hc2sgPSAyNTQ7CiAgICAgbWFzayB8PSAobWFzayA8PCA4KTsKICAgICBtYXNrIHw9IChtYXNrIDw8IDE2KTsgLyogMHhGRUZFRkVGRSAqLwpAQCAtNTMyLDcgKzUzMiw3IEBACiAgICAgLyogQnJhbmNoIGJhc2VkIG9uIHBpeGVsIGxvY2F0aW9uIChoYWxmLXBlbCBvciBmdWxsLXBlbCkgZm9yIHggYW5kIHkgKi8KICAgICBwcmVkX2Jsb2NrIC09IG9mZnNldDI7IC8qIHByZXNldCAqLwogCi0gICAgdG1wID0gKHVpbnQzMilwcmV2ICYgMzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAzOwogICAgIG1hc2sgPSAyNTQ7CiAgICAgbWFzayB8PSAobWFzayA8PCA4KTsKICAgICBtYXNrIHw9IChtYXNrIDw8IDE2KTsgLyogMHhGRUZFRkVGRSAqLwpAQCAtODg0LDcgKzg4NCw3IEBACiAgICAgbWFzayB8PSAobWFzayA8PCA4KTsKICAgICBtYXNrIHw9IChtYXNrIDw8IDE2KTsgLyogMHgzZjNmM2YzZiAqLwogCi0gICAgdG1wID0gKHVpbnQzMilwcmV2ICYgMzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAzOwogCiAgICAgcHJlZF9ibG9jayAtPSA0OyAvKiBwcmVzZXQgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKaW5kZXggYjNjMzUwZi4uYjAzZWM4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCkBAIC0xNDI2LDcgKzE0MjYsNyBAQAogICAgICAgICB2aWRlby0+bkJpdHNGb3JNQklEID0gQ2FsY051bUJpdHMoKHVpbnQpdmlkZW8tPm5Ub3RhbE1CIC0gMSk7IC8qIG90aGVyd2lzZSBjYWxjdWxhdGUgYWJvdmUgKi8KICAgICB9CiAgICAgc2l6ZSA9IChpbnQzMil2aWRlby0+d2lkdGggKiB2aWRlby0+aGVpZ2h0OwotICAgIGlmICh2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gUF9WT1AgJiYgc2l6ZSA+IHZpZGVvLT52aWRlb0RlY0NvbnRyb2xzLT5zaXplKQorICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBQX1ZPUCAmJiBzaXplID4gdmlkZW8tPnZpZGVvRGVjQ29udHJvbHMtPnNpemUpCiAgICAgewogICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwogICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tawppbmRleCA4M2EyZGQyLi5jOTAwNmQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rCkBAIC0zMyw2ICszMyw4IEBACiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC03Miw0ICs3NCw2IEBACiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnNGVuYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKaW5kZXggOWYwMzUwMi4uZDY4YzY4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCkBAIC0zMyw2ICszMyw4IEBACiAKICNpbmNsdWRlICJTb2Z0TVBFRzRFbmNvZGVyLmgiCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaWZuZGVmIElOVDMyX01BWAogI2RlZmluZSBJTlQzMl9NQVggICAyMTQ3NDgzNjQ3CiAjZW5kaWYKQEAgLTQ4LDQyICs1MCwxMiBAQAogICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7CiB9CiAKLWlubGluZSBzdGF0aWMgdm9pZCBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAotICAgICAgICB1aW50OF90ICppbnl1diwgdWludDhfdCogb3V0eXV2LAotICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgewotCi0gICAgaW50MzJfdCBvdXRZc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotICAgIHVpbnQzMl90ICpvdXR5ID0gICh1aW50MzJfdCAqKSBvdXR5dXY7Ci0gICAgdWludDE2X3QgKm91dGNiID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSk7Ci0gICAgdWludDE2X3QgKm91dGNyID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSArIChvdXRZc2l6ZSA+PiAyKSk7Ci0KLSAgICAvKiBZIGNvcHlpbmcgKi8KLSAgICBtZW1jcHkob3V0eSwgaW55dXYsIG91dFlzaXplKTsKLQotICAgIC8qIFUgJiBWIGNvcHlpbmcgKi8KLSAgICB1aW50MzJfdCAqaW55dXZfNCA9ICh1aW50MzJfdCAqKSAoaW55dXYgKyBvdXRZc2l6ZSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBoZWlnaHQgPj4gMTsgaSA+IDA7IC0taSkgewotICAgICAgICBmb3IgKGludDMyX3QgaiA9IHdpZHRoID4+IDI7IGogPiAwOyAtLWopIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSAqaW55dXZfNCsrOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcFUgPSB0ZW1wICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBVID0gdGVtcFUgfCAoKHRlbXAgPj4gOCkgJiAweEZGMDApOwotCi0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wViA9ICh0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBWID0gdGVtcFYgfCAoKHRlbXAgPj4gMTYpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgLy8gRmxpcCBVIGFuZCBWCi0gICAgICAgICAgICAqb3V0Y2IrKyA9IHRlbXBWOwotICAgICAgICAgICAgKm91dGNyKysgPSB0ZW1wVTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogU29mdE1QRUc0RW5jb2Rlcjo6U29mdE1QRUc0RW5jb2RlcigKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCiAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKLSAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgIDogU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCiAgICAgICBtRW5jb2RlTW9kZShDT01CSU5FX01PREVfV0lUSF9FUlJfUkVTKSwKICAgICAgIG1WaWRlb1dpZHRoKDE3NiksCiAgICAgICBtVmlkZW9IZWlnaHQoMTQ0KSwKQEAgLTE1MSw3ICsxMjMsOCBAQAogICAgIG1FbmNQYXJhbXMtPnF1YW50VHlwZVswXSA9IDA7CiAgICAgbUVuY1BhcmFtcy0+bm9GcmFtZVNraXBwZWQgPSBQVl9PRkY7CiAKLSAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcgorICAgICAgICAgICAgfHwgbVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKICAgICAgICAgLy8gQ29sb3IgY29udmVyc2lvbiBpcyBuZWVkZWQuCiAgICAgICAgIGZyZWUobUlucHV0RnJhbWVEYXRhKTsKICAgICAgICAgbUlucHV0RnJhbWVEYXRhID0gTlVMTDsKQEAgLTIyMyw3ICsxOTYsNyBAQAogCiAgICAgUFZDbGVhblVwVmlkZW9FbmNvZGVyKG1IYW5kbGUpOwogCi0gICAgZGVsZXRlIG1JbnB1dEZyYW1lRGF0YTsKKyAgICBmcmVlKG1JbnB1dEZyYW1lRGF0YSk7CiAgICAgbUlucHV0RnJhbWVEYXRhID0gTlVMTDsKIAogICAgIGRlbGV0ZSBtRW5jUGFyYW1zOwpAQCAtNDkzLDYgKzQ2NiwxNyBAQAogICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKICAgICAgICAgICAgICAgICBtVmlkZW9GcmFtZVJhdGUgPSBkZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID4+IDE2OwogICAgICAgICAgICAgICAgIG1WaWRlb0NvbG9yRm9ybWF0ID0gZGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0OworCisgICAgICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcG9ydERlZiA9CisgICAgICAgICAgICAgICAgICAgICZlZGl0UG9ydEluZm8oMCktPm1EZWY7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVZpZGVvV2lkdGg7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1WaWRlb0hlaWdodDsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSkgbVZpZGVvQ29sb3JGb3JtYXQ7CisgICAgICAgICAgICAgICAgcG9ydERlZiA9ICZlZGl0UG9ydEluZm8oMSktPm1EZWY7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVZpZGVvV2lkdGg7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1WaWRlb0hlaWdodDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVZpZGVvQml0UmF0ZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5CaXRyYXRlOwogICAgICAgICAgICAgfQpAQCAtNjE0LDExICs1OTgsNyBAQAogICAgICAgICAgICAgICAgICAgICBtU3RvcmVNZXRhRGF0YUluQnVmZmVycyA/ICIgdHJ1ZSIgOiAiZmFsc2UiKTsKIAogICAgICAgICAgICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7Ci0gICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7Ci0gICAgICAgICAgICAgICAgaWYgKG1JbnB1dEZyYW1lRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKikgbWFsbG9jKChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMgKSA+PiAxKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CkBAIC02MjksNyArNjA5LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdE1QRUc0RW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0TVBFRzRFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2F3SW5wdXRFT1MpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTY4NiwzNiArNjY2LDM2IEBACiAgICAgICAgICAgICBtU2F3SW5wdXRFT1MgPSB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgYnVmZmVyX2hhbmRsZV90IHNyY0J1ZmZlcjsgLy8gZm9yIE1ldGFEYXRhTW9kZSBvbmx5CiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IDApIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmlucHV0RGF0YSA9IE5VTEw7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dERhdGEgPSBOVUxMOwogICAgICAgICAgICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7CiAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuICE9IDgpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk1ldGFEYXRhIGJ1ZmZlciBpcyB3cm9uZyBzaXplISAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIihnb3QgJWx1IGJ5dGVzLCBleHBlY3RlZCA4KSIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGdvdCAldSBieXRlcywgZXhwZWN0ZWQgOCkiLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEdyYWxsb2NEYXRhKGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBleHRyYWN0R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZURhdGEsIChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMpID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwgaW5IZWFkZXItPm5GaWxsZWRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgaWYgKGlucHV0RGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZXh0cmFjdCBncmFsbG9jIGJ1ZmZlciBpbiBtZXRhZGF0YSBtb2RlIik7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogVmVyaWZ5L2NvbnZlcnQgcGl4ZWwgZm9ybWF0IGVudW0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5wdXREYXRhID0gKHVpbnQ4X3QgKilpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9IChjb25zdCB1aW50OF90ICopaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgICAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICAgICAgICAgICAgICBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLCBtSW5wdXRGcmFtZURhdGEsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSBtSW5wdXRGcmFtZURhdGE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICAgICAgICAgIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCi0gICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSwgbUlucHV0RnJhbWVEYXRhLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSBtSW5wdXRGcmFtZURhdGE7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBDSEVDSyhpbnB1dERhdGEgIT0gTlVMTCk7CiAKICAgICAgICAgICAgIFZpZGVvRW5jRnJhbWVJTyB2aW4sIHZvdXQ7CkBAIC03MjQsMTcgKzcwNCwxNyBAQAogICAgICAgICAgICAgdmluLmhlaWdodCA9ICgobVZpZGVvSGVpZ2h0ICArIDE1KSA+PiA0KSA8PCA0OwogICAgICAgICAgICAgdmluLnBpdGNoID0gKChtVmlkZW9XaWR0aCArIDE1KSA+PiA0KSA8PCA0OwogICAgICAgICAgICAgdmluLnRpbWVzdGFtcCA9IChpbkhlYWRlci0+blRpbWVTdGFtcCArIDUwMCkgLyAxMDAwOyAgLy8gaW4gbXMKLSAgICAgICAgICAgIHZpbi55Q2hhbiA9IGlucHV0RGF0YTsKKyAgICAgICAgICAgIHZpbi55Q2hhbiA9ICh1aW50OF90ICopaW5wdXREYXRhOwogICAgICAgICAgICAgdmluLnVDaGFuID0gdmluLnlDaGFuICsgdmluLmhlaWdodCAqIHZpbi5waXRjaDsKICAgICAgICAgICAgIHZpbi52Q2hhbiA9IHZpbi51Q2hhbiArICgodmluLmhlaWdodCAqIHZpbi5waXRjaCkgPj4gMik7CiAKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbW9kVGltZU1zID0gMDsKKyAgICAgICAgICAgIFVMb25nIG1vZFRpbWVNcyA9IDA7CiAgICAgICAgICAgICBpbnQzMl90IG5MYXllciA9IDA7CiAgICAgICAgICAgICBNUDRIaW50VHJhY2sgaGludFRyYWNrOwogICAgICAgICAgICAgaWYgKCFQVkVuY29kZVZpZGVvRnJhbWUobUhhbmRsZSwgJnZpbiwgJnZvdXQsCiAgICAgICAgICAgICAgICAgICAgICZtb2RUaW1lTXMsIG91dFB0ciwgJmRhdGFMZW5ndGgsICZuTGF5ZXIpIHx8CiAgICAgICAgICAgICAgICAgIVBWR2V0SGludFRyYWNrKG1IYW5kbGUsICZoaW50VHJhY2spKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBlbmNvZGUgZnJhbWUgb3IgZ2V0IGhpbmsgdHJhY2sgYXQgZnJhbWUgJWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBlbmNvZGUgZnJhbWUgb3IgZ2V0IGhpbmsgdHJhY2sgYXQgZnJhbWUgJSIgUFJJZDY0LAogICAgICAgICAgICAgICAgICAgICBtTnVtSW5wdXRGcmFtZXMpOwogICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwpAQCAtNzUxLDcgKzczMSw2IEBACiAKICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwogICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgcmVsZWFzZUdyYWxsb2NEYXRhKHNyY0J1ZmZlcik7CiAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CiAKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CkBAIC03NjYsNDcgKzc0NSw2IEBACiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRNUEVHNEVuY29kZXI6OmdldEV4dGVuc2lvbkluZGV4KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgewotICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIpKSB7Ci0gICAgICAgICooaW50MzJfdCopaW5kZXggPSBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4OwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLX0KLQotdWludDhfdCAqU29mdE1QRUc0RW5jb2Rlcjo6ZXh0cmFjdEdyYWxsb2NEYXRhKHZvaWQgKmRhdGEsIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyKSB7Ci0gICAgT01YX1UzMiB0eXBlID0gKihPTVhfVTMyKilkYXRhOwotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAodHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgewotICAgICAgICBBTE9HRSgiRGF0YSBwYXNzZWQgaW4gd2l0aCBtZXRhZGF0YSBtb2RlIGRvZXMgbm90IGhhdmUgdHlwZSAiCi0gICAgICAgICAgICAgICAgImtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlICglZCksIGhhcyB0eXBlICVsZCBpbnN0ZWFkIiwKLSAgICAgICAgICAgICAgICBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSwgdHlwZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBidWZmZXJfaGFuZGxlX3QgaW1nQnVmZmVyID0gKihidWZmZXJfaGFuZGxlX3QqKSgodWludDhfdCopZGF0YSArIDQpOwotCi0gICAgY29uc3QgUmVjdCByZWN0KG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwotICAgIHVpbnQ4X3QgKmltZzsKLSAgICByZXMgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS5sb2NrKGltZ0J1ZmZlciwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKLSAgICAgICAgICAgIHJlY3QsICh2b2lkKiopJmltZyk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBsb2NrIGltYWdlIGJ1ZmZlciAlcCBmb3IgYWNjZXNzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIGltZ0J1ZmZlcik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgICpidWZmZXIgPSBpbWdCdWZmZXI7Ci0gICAgcmV0dXJuIGltZzsKLX0KLQotdm9pZCBTb2Z0TVBFRzRFbmNvZGVyOjpyZWxlYXNlR3JhbGxvY0RhdGEoYnVmZmVyX2hhbmRsZV90IGJ1ZmZlcikgewotICAgIGlmIChtU3RvcmVNZXRhRGF0YUluQnVmZmVycykgewotICAgICAgICBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS51bmxvY2soYnVmZmVyKTsKLSAgICB9Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCmluZGV4IGNjNGVhOGYuLmIwNjA1YjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgogI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKIAogCkBAIC0yNyw3ICsyNyw3IEBACiAKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIAotc3RydWN0IFNvZnRNUEVHNEVuY29kZXIgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CitzdHJ1Y3QgU29mdE1QRUc0RW5jb2RlciA6IHB1YmxpYyBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50IHsKICAgICBTb2Z0TVBFRzRFbmNvZGVyKAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKQEAgLTQzLDExICs0Myw2IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CiAKLSAgICAvLyBPdmVycmlkZSBTb2Z0T01YQ29tcG9uZW50IG1ldGhvZHMKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKLQogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflNvZnRNUEVHNEVuY29kZXIoKTsKIApAQCAtNTYsMTAgKzUxLDYgQEAKICAgICAgICAga051bUJ1ZmZlcnMgPSAyLAogICAgIH07CiAKLSAgICBlbnVtIHsKLSAgICAgICAga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleCA9IE9NWF9JbmRleFZlbmRvclN0YXJ0VW51c2VkICsgMQotICAgIH07Ci0KICAgICAvLyBPTVggaW5wdXQgYnVmZmVyJ3MgdGltZXN0YW1wIGFuZCBmbGFncwogICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgaW50NjRfdCBtVGltZVVzOwpAQCAtOTAsOSArODEsNiBAQAogICAgIE9NWF9FUlJPUlRZUEUgaW5pdEVuY29kZXIoKTsKICAgICBPTVhfRVJST1JUWVBFIHJlbGVhc2VFbmNvZGVyKCk7CiAKLSAgICB1aW50OF90KiBleHRyYWN0R3JhbGxvY0RhdGEodm9pZCAqZGF0YSwgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIpOwotICAgIHZvaWQgcmVsZWFzZUdyYWxsb2NEYXRhKGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXIpOwotCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE1QRUc0RW5jb2Rlcik7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL21wNGVuY19hcGkuaAppbmRleCBhNTRmZDhiLi45NDUxNDc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKQEAgLTI5LDcgKzI5LDcgQEAKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVVNob3J0OwogdHlwZWRlZiBzaG9ydCBTaG9ydDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IEJvb2w7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxvbmc7Cit0eXBlZGVmIHVpbnQzMl90IFVMb25nOwogCiAjZGVmaW5lIFBWX0NPREVDX0lOSVQgIDAKICNkZWZpbmUgUFZfQ09ERUNfU1RPUCAgMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAKaW5kZXggZmE1MGVlYi4uZmE0YWUyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuY3BwCkBAIC0yNTAsNyArMjUwLDcgQEAKICAgICAgICAgICAgIG91dFs0MF0gPSBrNCA7ICAgLyogcm93IDUgKi8KICAgICAgICAgICAgIG91dCsrOwogICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgoVUludClvdXQgPCAoVUludClkc3QpIDsKKyAgICAgICAgd2hpbGUgKCh1aW50cHRyX3Qpb3V0IDwgKHVpbnRwdHJfdClkc3QpIDsKIAogICAgICAgICByZXR1cm4gOwogICAgIH0KQEAgLTQ1NSw3ICs0NTUsNyBAQAogICAgICAgICAgICAgb3V0WzhdID0gazUgOyAgICAgICAvKiByb3cgMSAqLwogICAgICAgICAgICAgb3V0Kys7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChVSW50KW91dCA8IChVSW50KWRzdCkgOworICAgICAgICB3aGlsZSAoKHVpbnRwdHJfdClvdXQgPCAodWludHB0cl90KWRzdCkgOwogCiAgICAgICAgIHJldHVybiA7CiAgICAgfQpAQCAtNjM1LDcgKzYzNSw3IEBACiAgICAgICAgICAgICBvdXRbOF0gPSBrNSA7ICAgICAgIC8qIHJvdyAxICovCiAgICAgICAgICAgICBvdXQrKzsKICAgICAgICAgfQotICAgICAgICB3aGlsZSAoKFVJbnQpb3V0IDwgKFVJbnQpZHN0KSA7CisgICAgICAgIHdoaWxlICgodWludHB0cl90KW91dCA8ICh1aW50cHRyX3QpZHN0KSA7CiAKICAgICAgICAgcmV0dXJuIDsKICAgICB9CkBAIC04NDYsNyArODQ2LDcgQEAKICAgICAgICAgICAgIG91dFs0MF0gPSBrNCA7ICAgLyogcm93IDUgKi8KICAgICAgICAgICAgIG91dCsrOwogICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgoVUludClvdXQgPCAoVUludClkc3QpIDsKKyAgICAgICAgd2hpbGUgKCh1aW50cHRyX3Qpb3V0IDwgKHVpbnRwdHJfdClkc3QpIDsKIAogICAgICAgICByZXR1cm4gOwogICAgIH0KQEAgLTEwMzMsNyArMTAzMyw3IEBACiAgICAgICAgICAgICBvdXRbOF0gPSBrNSA7ICAgICAgIC8qIHJvdyAxICovCiAgICAgICAgICAgICBvdXQrKzsKICAgICAgICAgfQotICAgICAgICB3aGlsZSAoKFVJbnQpb3V0IDwgKFVJbnQpZHN0KSA7CisgICAgICAgIHdoaWxlICgodWludHB0cl90KW91dCA8ICh1aW50cHRyX3QpZHN0KSA7CiAKICAgICAgICAgcmV0dXJuIDsKICAgICB9CkBAIC0xMTk1LDcgKzExOTUsNyBAQAogICAgICAgICAgICAgb3V0WzhdID0gazUgOyAgICAgICAvKiByb3cgMSAqLwogICAgICAgICAgICAgb3V0Kys7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChVSW50KW91dCA8IChVSW50KWRzdCkgOworICAgICAgICB3aGlsZSAoKHVpbnRwdHJfdClvdXQgPCAodWludHB0cl90KWRzdCkgOwogCiAgICAgICAgIHJldHVybiA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmNwcAppbmRleCA2ZmQ0MWMzLi4wYWQzOWE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmNwcApAQCAtNTcyLDcgKzU3Miw3IEBACiAgICAgICAgIGN1cjIgICAgPSBjdXIyICYgKG1hc2sgPDwgOCk7ICAgLyogbWFzayBmaXJzdCBhbmQgdGhpcmQgYnl0ZXMgKi8KICAgICAgICAgc3VtMiAgICA9IHN1bTIgKyAoKFVJbnQpY3VyMiA+PiA4KTsKICAgICB9Ci0gICAgd2hpbGUgKChVSW50KWN1ckludCA8IChVSW50KWVuZCk7CisgICAgd2hpbGUgKCh1aW50cHRyX3QpY3VySW50IDwgKHVpbnRwdHJfdCllbmQpOwogCiAgICAgY3VyMSA9IHN1bTQgLSAoc3VtMiA8PCA4KTsgIC8qIGdldCBldmVuLXN1bSAqLwogICAgIGN1cjEgPSBjdXIxICsgc3VtMjsgICAgICAgICAvKiBhZGQgMTYgYml0IGV2ZW4tc3VtIGFuZCBvZGQtc3VtKi8KQEAgLTYxMSw3ICs2MTEsNyBAQAogICAgICAgICBsb2FkMiA9IGxvYWQyICYgKG1hc2sgPDwgOCk7IC8qIGV2ZW4gYnl0ZXMgKi8KICAgICAgICAgc3VtMiArPSAoKFVJbnQpbG9hZDIgPj4gOCk7IC8qIHN1bSBldmVuIGJ5dGVzLCAxNiBiaXQgKi8KICAgICB9Ci0gICAgd2hpbGUgKChVSW50KWN1ckludCA8IChVSW50KWVuZCk7CisgICAgd2hpbGUgKCh1aW50cHRyX3QpY3VySW50IDwgKHVpbnRwdHJfdCllbmQpOwogICAgIGxvYWQxID0gc3VtNCAtIChzdW0yIDw8IDgpOyAgICAgLyogZ2V0IGV2ZW4tc3VtICovCiAgICAgbG9hZDEgPSBsb2FkMSArIHN1bTI7ICAgICAgICAgICAvKiBhZGQgMTYgYml0IGV2ZW4tc3VtIGFuZCBvZGQtc3VtKi8KICAgICBsb2FkMSA9IGxvYWQxICsgKGxvYWQxIDw8IDE2KTsgIC8qIGFkZCB1cHBlciBhbmQgbG93ZXIgMTYgYml0IHN1bSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwCmluZGV4IGI4MWQyNzguLjlhOTY3YzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9jb21wLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tb3Rpb25fY29tcC5jcHAKQEAgLTM2Myw3ICszNjMsNyBAQAogICAgIC8qIGluaXRpYWxpemUgb2Zmc2V0IHRvIGFkanVzdCBwaXhlbCBjb3VudGVyICovCiAgICAgLyogICAgdGhlIG5leHQgcm93OyBmdWxsLXBlbCByZXNvbHV0aW9uICAgICAgKi8KIAotICAgIHRtcCA9IChVTG9uZylwcmV2ICYgMHgzOworICAgIHRtcCA9ICh1aW50cHRyX3QpcHJldiAmIDB4MzsKIAogICAgIGlmICh0bXAgPT0gMCkgIC8qIHdvcmQtYWxpZ25lZCAqLwogICAgIHsKQEAgLTQ2Niw3ICs0NjYsNyBAQAogICAgIC8qIEJyYW5jaCBiYXNlZCBvbiBwaXhlbCBsb2NhdGlvbiAoaGFsZi1wZWwgb3IgZnVsbC1wZWwpIGZvciB4IGFuZCB5ICovCiAgICAgcmVjIC09IDEyOyAvKiBwcmVzZXQgKi8KIAotICAgIHRtcCA9IChVTG9uZylwcmV2ICYgMzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAzOwogICAgIG1hc2sgPSAyNTQ7CiAgICAgbWFzayB8PSAobWFzayA8PCA4KTsKICAgICBtYXNrIHw9IChtYXNrIDw8IDE2KTsgLyogMHhGRUZFRkVGRSAqLwpAQCAtNzkxLDcgKzc5MSw3IEBACiAgICAgLyogQnJhbmNoIGJhc2VkIG9uIHBpeGVsIGxvY2F0aW9uIChoYWxmLXBlbCBvciBmdWxsLXBlbCkgZm9yIHggYW5kIHkgKi8KICAgICByZWMgLT0gMTI7IC8qIHByZXNldCAqLwogCi0gICAgdG1wID0gKFVMb25nKXByZXYgJiAzOworICAgIHRtcCA9ICh1aW50cHRyX3QpcHJldiAmIDM7CiAgICAgbWFzayA9IDI1NDsKICAgICBtYXNrIHw9IChtYXNrIDw8IDgpOwogICAgIG1hc2sgfD0gKG1hc2sgPDwgMTYpOyAvKiAweEZFRkVGRUZFICovCkBAIC0xMTQwLDcgKzExNDAsNyBAQAogICAgIG1hc2sgfD0gKG1hc2sgPDwgOCk7CiAgICAgbWFzayB8PSAobWFzayA8PCAxNik7IC8qIDB4M2YzZjNmM2YgKi8KIAotICAgIHRtcCA9IChVTG9uZylwcmV2ICYgMzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAzOwogCiAgICAgcmVjIC09IDQ7IC8qIHByZXNldCAqLwogCkBAIC0xOTU5LDcgKzE5NTksNyBAQAogICAgICAgICBkc3QgKz0gb2Zmc2V0OwogICAgICAgICBzcmMgKz0gb2Zmc2V0OwogICAgIH0KLSAgICB3aGlsZSAoKFVJbnQpc3JjIDwgKFVJbnQpZW5kKTsKKyAgICB3aGlsZSAoKHVpbnRwdHJfdClzcmMgPCAodWludHB0cl90KWVuZCk7CiAKICAgICByZXR1cm4gOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaAppbmRleCAwZDVhM2U4Li4yZDQ0NDgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaApAQCAtNjAsNyArNjAsNyBAQAogdHlwZWRlZiBzaG9ydCBTaG9ydDsKIHR5cGVkZWYgc2hvcnQgaW50IFNJbnQ7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBCb29sOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgVUxvbmc7Cit0eXBlZGVmIHVpbnQzMl90IFVMb25nOwogdHlwZWRlZiB2b2lkIFZvaWQ7CiAKICNkZWZpbmUgUFZfQ09ERUNfSU5JVCAgICAgICAwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaW5saW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaW5saW5lLmgKaW5kZXggYmE3N2RmZC4uYjg2NWYyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2lubGluZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9pbmxpbmUuaApAQCAtODUsNyArODUsNyBAQAogCiAgICAgICAgIHg5ID0gMHg4MDgwODA4MDsgLyogY29uc3QuICovCiAKLSAgICAgICAgeDggPSAodWludDMyKXJlZiAmIDB4MzsKKyAgICAgICAgeDggPSAodWludHB0cl90KXJlZiAmIDB4MzsKICAgICAgICAgaWYgKHg4ID09IDMpCiAgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MzsKICAgICAgICAgaWYgKHg4ID09IDIpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsKaW5kZXggMTM1YzcxNS4uODI4NDQ5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5tawpAQCAtNTAsNiArNTAsOCBAQAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9tcDNkZWMKIAogTE9DQUxfQVJNX01PREUgOj0gYXJtCkBAIC02OSw2ICs3MSw4IEBACiAgICAgICAgICQoTE9DQUxfUEFUSCkvc3JjIFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscyBsaWJsb2cKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKaW5kZXggN2MzODJmYi4uNTM5NjAyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCkBAIC00OSw2ICs0OSw4IEBACiAgICAgICBtTnVtQ2hhbm5lbHMoMiksCiAgICAgICBtU2FtcGxpbmdSYXRlKDQ0MTAwKSwKICAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtU2F3SW5wdXRFb3MoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyhmYWxzZSksCiAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKICAgICBpbml0UG9ydHMoKTsKICAgICBpbml0RGVjb2RlcigpOwpAQCAtMTQ0LDYgKzE0NiwyMyBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9NcDM6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9NUDNUWVBFICptcDNQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKG1wM1BhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtcDNQYXJhbXMtPm5DaGFubmVscyA9IG1OdW1DaGFubmVsczsKKyAgICAgICAgICAgIG1wM1BhcmFtcy0+bkJpdFJhdGUgPSAwIC8qIHVua25vd24gKi87CisgICAgICAgICAgICBtcDNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIC8vIG90aGVyIGZpZWxkcyBhcmUgZW5jb2Rlci1vbmx5CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKICAgICB9CkBAIC0xODYsNyArMjA1LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdE1QMzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0TVAzOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE5NCw0OCArMjEzLDM2IEBACiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKLSAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewotICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IChtU2F3SW5wdXRFb3MgJiYgIW1TaWduYWxsZWRPdXRwdXRFb3MpKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSBOVUxMOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBOVUxMOworICAgICAgICBpZiAoIWluUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIGluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworICAgICAgICB9CiAKICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOwogCi0gICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmICghbUlzRmlyc3QpIHsKLSAgICAgICAgICAgICAgICAvLyBwYWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGggNTI5IHNhbXBsZXMsIHNpbmNlIHRoYXQgbWFueSBzYW1wbGVzCi0gICAgICAgICAgICAgICAgLy8gd2VyZSB0cmltbWVkIG9mZiB0aGUgYmVnaW5uaW5nIHdoZW4gZGVjb2Rpbmcgc3RhcnRlZAotICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9Ci0gICAgICAgICAgICAgICAgICAgIGtQVk1QM0RlY29kZXJEZWxheSAqIG1OdW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKLQotICAgICAgICAgICAgICAgIG1lbXNldChvdXRIZWFkZXItPnBCdWZmZXIsIDAsIG91dEhlYWRlci0+bkZpbGxlZExlbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIG5ldmVyIGRpc2NhcmRlZCBmcmFtZXMgZnJvbSB0aGUgc3RhcnQsIHdlIHdvbid0IGhhdmUKLSAgICAgICAgICAgICAgICAvLyB0byBhZGQgYW55IHBhZGRpbmcgYXQgdGhlIGVuZCBlaXRoZXIuCi0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgaWYgKGluSGVhZGVyKSB7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCAmJiBpbkhlYWRlci0+bkZpbGxlZExlbikgeworICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgICAgIG1TYXdJbnB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKworICAgICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gMDsKICAgICAgICAgfQotCi0gICAgICAgIGlmIChpbkhlYWRlci0+bk9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7Ci0gICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9Ci0gICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwotCi0gICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwogICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlck1heExlbmd0aCA9IDA7CiAgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IDA7CiAKQEAgLTI2MiwxMyArMjY5LDI4IEBACiAgICAgICAgICAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0ga091dHB1dEJ1ZmZlclNpemUgLyBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAotICAgICAgICAgICAgLy8gcGxheSBzaWxlbmNlIGluc3RlYWQuCi0gICAgICAgICAgICBtZW1zZXQob3V0SGVhZGVyLT5wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyID09IE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1IgJiYgbVNhd0lucHV0RW9zKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtSXNGaXJzdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBwYWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGggNTI5IHNhbXBsZXMsIHNpbmNlIHRoYXQgbWFueSBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgIC8vIHdlcmUgdHJpbW1lZCBvZmYgdGhlIGJlZ2lubmluZyB3aGVuIGRlY29kaW5nIHN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0ga1BWTVAzRGVjb2RlckRlbGF5ICogbU51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOwogCi0gICAgICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG91dEhlYWRlci0+cEJ1ZmZlciwgMCwgb3V0SGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAorICAgICAgICAgICAgICAgIC8vIHBsYXkgc2lsZW5jZSBpbnN0ZWFkLgorICAgICAgICAgICAgICAgIG1lbXNldChvdXRIZWFkZXItPnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1Db25maWctPnNhbXBsaW5nUmF0ZSAhPSBtU2FtcGxpbmdSYXRlCiAgICAgICAgICAgICAgICAgfHwgbUNvbmZpZy0+bnVtX2NoYW5uZWxzICE9IG1OdW1DaGFubmVscykgewogICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IG1Db25maWctPnNhbXBsaW5nUmF0ZTsKQEAgLTI4OSw3ICszMTEsNyBAQAogCiAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPQogICAgICAgICAgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSAtIG91dEhlYWRlci0+bk9mZnNldDsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfSBlbHNlIGlmICghbVNpZ25hbGxlZE91dHB1dEVvcykgewogICAgICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KTsKICAgICAgICAgfQpAQCAtMjk4LDIzICszMjAsMjQgQEAKICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKICAgICAgICAgICAgICAgICArIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvIG1Db25maWctPnNhbXBsaW5nUmF0ZTsKIAotICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICAgICAgQ0hFQ0tfR0UoaW5IZWFkZXItPm5GaWxsZWRMZW4sIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCk7CiAKLSAgICAgICAgQ0hFQ0tfR0UoaW5IZWFkZXItPm5GaWxsZWRMZW4sIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCk7CisgICAgICAgICAgICBpbkhlYWRlci0+bk9mZnNldCArPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CisgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CiAKLSAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoOwotICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CisKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ICs9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAvIG1OdW1DaGFubmVsczsKIAotICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgewotICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbkluZm8gPSBOVUxMOwotICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLSAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKLSAgICAgICAgfQotCiAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CiAgICAgICAgIG91dEluZm8gPSBOVUxMOwpAQCAtMzI5LDYgKzM1Miw5IEBACiAgICAgICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KICAgICAgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOwogICAgICAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgICAgICBtU2F3SW5wdXRFb3MgPSBmYWxzZTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOwogICAgIH0KIH0KIApAQCAtMzYyLDYgKzM4OCw4IEBACiAgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOwogICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKICAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2F3SW5wdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKaW5kZXggNGFmOTFlYS4uZjllN2I1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKQEAgLTYxLDYgKzYxLDggQEAKIAogICAgIGJvb2wgbUlzRmlyc3Q7CiAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2F3SW5wdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOwogCiAgICAgZW51bSB7CiAgICAgICAgIE5PTkUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfZGN0XzlfYXJtLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfZGN0XzlfYXJtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNmRkNGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX2RjdF85X2FybS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLTsgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLTsgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsKLTsKLTsgICBGaWxlbmFtZTogcHZtcDNfZGN0XzkucwotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSRVZJU0lPTiBISVNUT1JZCi07Ci07Ci07IFdobzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGU6IE1NL0REL1lZWVkKLTsgRGVzY3JpcHRpb246IAotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEFSRUEgIHwuZHJlY3R2ZXwsIERSRUNUVkUKLQotICAgIERDQiAiLWRlZmF1bHRsaWI6Y29yZWRsbC5saWIgIgotICAgIERDQiAiLWRlZmF1bHRsaWI6Y29yZWxpYmMubGliICIKLQotICBJTVBPUlQgcHZtcDNfbWRjdF8xOCA7IHB2bXAzX21kY3RfMTguY3BwCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBBUkVBICB8LnJkYXRhfCwgREFUQSwgUkVBRE9OTFkKLSAgJSA0Ci0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEFSRUEgIHwudGV4dHwsIENPREUsIFJFQURPTkxZCi0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gRVhQT1JUIHxwdm1wM19kY3RfOXwKLQotfHB2bXAzX2RjdF85fCBQUk9DCi0gICAgICAgIHN0bWZkICAgIHNwISx7cjQtcjEwLGxyfQotICAgICAgICBsZHIgICAgICByMiwgW3IwLCAjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjMsIFtyMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyMCwgIzRdCi0gICAgICAgIGFkZCAgICAgIHIxLHIyLHIzCi0gICAgICAgIHN1YiAgICAgIGxyLHIyLHIzCi0gICAgICAgIGxkciAgICAgIHIzLFtyMCwgIzB4MWNdCi0gICAgICAgIGxkciAgICAgIHI0LFtyMCwgIzB4MThdCi0gICAgICAgIGFkZCAgICAgIHIyLHIzLHIxMgotICAgICAgICBsZHIgICAgICByNSxbcjAsIzhdCi0gICAgICAgIHN1YiAgICAgIHIzLHIzLHIxMgotICAgICAgICBhZGQgICAgICByMTIscjQscjUKLSAgICAgICAgc3ViICAgICAgcjQscjQscjUKLSAgICAgICAgbGRyICAgICAgcjUsW3IwLCAjMHgxNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IwLCAjMHhjXQotICAgICAgICBsZHIgICAgICByOSxbcjAsICMweDEwXQotICAgICAgICBhZGQgICAgICByNixyNSxyNwotICAgICAgICBzdWIgICAgICByNSxyNSxyNwotICAgICAgICBhZGQgICAgICByNyxyMSxyMTIKLSAgICAgICAgYWRkICAgICAgcjgscjkscjIKLSAgICAgICAgYWRkICAgICAgcjcscjcscjYKLSAgICAgICAgYWRkICAgICAgcjEwLHI3LHI4Ci0gICAgICAgIHJzYiAgICAgIHI3LHI4LHI3LGFzciAjMQotICAgICAgICBzdHIgICAgICByNyxbcjAsICMweDE4XQotICAgICAgICByc2IgICAgICByMixyOSxyMixhc3IgIzEKLSAgICAgICAgc3RyICAgICAgcjEwLFtyMF0KLSAgICAgICAgbGRyICAgICAgcjExLHxjb3NfMnBpXzl8Ci0gICAgICAgIHJzYiAgICAgIHI3LHIyLCMwCi0KLSAgICAgICAgbW92ICAgICAgcjkscjEsbHNsICMxCi0JCW1vdiAgICAgIHIxLHI5CQkJOzs7Ozs7ICAhISEhISEKLSAgICAgICAgbW92ICAgICAgcjgscjcKLQotOyAgICB2ZWNbNF0gID0gZnhwX21hYzMyX1EzMiggdmVjWzRdLCB0bXAwPDwxLCBjb3NfMnBpXzkpOyAKLQotICAgICAgICBzbWxhbCAgICByMSxyOCxyMTEscjkKLSAgICAgICAgbGRyICAgICAgcjEwLHxjb3NfNHBpXzl8Ci0gICAgICAgIGxkciAgICAgIHIxMSx8Y29zX3BpXzl8Ci0KLTsgICAgdmVjWzhdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1s4XSwgdG1wMDw8MSwgY29zXzRwaV85KTsKLQotICAgICAgICBzbWxhbCAgICByMSxyNyxyMTAscjkKLQotCi0KLTsgICAgdmVjWzJdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1syXSwgdG1wMDw8MSwgY29zX3BpXzkpOwotCi0gICAgICAgIHNtbGFsICAgIHI5LHIyLHIxMSxyOQotICAgICAgICBtb3YgICAgICByMSxyMTIsbHNsICMxCi0gICAgICAgIHJzYiAgICAgIHI5LHIxMCwjMAotICAgICAgICBsZHIgICAgICByMTEsfGNvc181cGlfOXwKLQotICAgICAgICBzbWxhbCAgICByMTIscjIscjkscjEKLQotCi0KLTsgICAgdmVjWzJdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1syXSwgdG1wMjw8MSwgY29zXzVwaV85KTsKLQotICAgICAgICBsZHIgICAgICByOSx8Y29zXzJwaV85fAotICAgICAgICBtb3YgICAgICByMTIscjEJCQk7Ozs7OzsgICEhISEhIQotICAgICAgICBzbWxhbCAgICByMTIscjgscjExLHIxCi0KLQotOyAgICB2ZWNbOF0gID0gZnhwX21hYzMyX1EzMiggdmVjWzhdLCB0bXAyPDwxLCBjb3NfMnBpXzkpOwotCi0gICAgICAgIHNtbGFsICAgIHIxLHI3LHI5LHIxCi0gICAgICAgIG1vdiAgICAgIHIxLHI2LGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMTIscjcscjExLHIxCi0gICAgICAgIGFuZCAgICAgIHI2LHIxMCxyMTEsYXNyICMxNAotICAgICAgICBzbWxhbCAgICByMTIscjgscjYscjEKLSAgICAgICAgbGRyICAgICAgcjEwLHxjb3NfMTFwaV8xOHwKLSAgICAgICAgYWRkICAgICAgcjEyLHIxMSxyNgotICAgICAgICBzbWxhbCAgICByMSxyMixyMTIscjEKLSAgICAgICAgbGRyICAgICAgcjksfGNvc184cGlfOXwKLSAgICAgICAgc3RyICAgICAgcjIsW3IwLCM4XQotICAgICAgICBtb3YgICAgICByMSxyNSxsc2wgIzEKLQotOyAgICB2ZWNbOF0gID0gZnhwX21hYzMyX1EzMiggdmVjWzhdLCB0bXAzPDwxLCBjb3NfOHBpXzkpOwotCi0gICAgICAgIHNtdWxsICAgIHIyLHI2LHI5LHIxCi0gICAgICAgIHN0ciAgICAgIHI3LFtyMCwjMHgyMF0KLSAgICAgICAgbW92ICAgICAgcjIscjQsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHI3LHxjb3NfMTNwaV8xOHwKLSAgICAgICAgc21sYWwgICAgcjEyLHI2LHIxMCxyMgotCi0gICAgICAgIG1vdiAgICAgIHIzLHIzLGxzbCAjMQotCi07ICAgIHZlY1s1XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbNV0sIHRtcDg8PDEsIGNvc18xM3BpXzE4KTsKLQotICAgICAgICBzbWxhbCAgICByMTIscjYscjcscjMKLSAgICAgICAgYWRkICAgICAgcjQscjUscjQKLSAgICAgICAgbW92ICAgICAgcjEyLGxyLGxzbCAjMQotICAgICAgICBzdWIgICAgICBscixyNCxscgotICAgICAgICBsZHIgICAgICByNyx8Y29zXzE3cGlfMTh8Ci0gICAgICAgIHN0ciAgICAgIHI4LFtyMCwgIzB4MTBdCi0gICAgICAgIGxkciAgICAgIHI0LHxjb3NfcGlfNnwKLQotICAgICAgICBtb3YgICAgICBscixscixsc2wgIzEKLQotOyAgICB2ZWNbMV0gID0gZnhwX21hYzMyX1EzMiggdmVjWzFdLCB0bXA4PDwxLCBjb3NfMTdwaV8xOCk7Ci0KLSAgICAgICAgc21sYWwgICAgcjgscjYscjcscjEyCi0KLTsgICAgdmVjWzNdICA9IGZ4cF9tdWwzMl9RMzIoKHRtcDUgKyB0bXA2ICAtIHRtcDgpPDwxLCBjb3NfcGlfNik7Ci0KLSAgICAgICAgc211bGwgICAgcjUsbHIscjQsbHIKLSAgICAgICAgc3RyICAgICAgcjYsW3IwLCAjNF0KLSAgICAgICAgc3RyICAgICAgbHIsW3IwLCAjMHhjXQotCi0KLTsgICAgdmVjWzVdICA9IGZ4cF9tdWwzMl9RMzIodG1wNTw8MSwgY29zXzE3cGlfMTgpOwotICAgICAgICBzbXVsbCAgICByNSxscixyNyxyMQotICAgICAgICByc2IgICAgICByNixyOSwjMAotOyAgICB2ZWNbNV0gID0gZnhwX21hYzMyX1EzMiggdmVjWzVdLCB0bXA2PDwxLCAgY29zXzdwaV8xOCk7Ci0gICAgICAgIHNtbGFsICAgIHI1LGxyLHI2LHIyCi07ICAgIHZlY1s1XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbNV0sIHRtcDc8PDEsICAgIGNvc19waV82KTsKLSAgICAgICAgc21sYWwgICAgcjUsbHIscjQscjMKLTsgICAgdmVjWzVdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1s1XSwgdG1wODw8MSwgY29zXzEzcGlfMTgpOwotICAgICAgICBzbWxhbCAgICByNSxscixyMTAscjEyCi0gICAgICAgIHN0ciAgICAgIGxyLFtyMCwgIzB4MTRdCi0gICAgICAgIHJzYiAgICAgIGxyLHIxMCwjMAotCi07ICAgIHZlY1s3XSAgPSBmeHBfbXVsMzJfUTMyKHRtcDU8PDEsIGNvc181cGlfMTgpOwotICAgICAgICBzbXVsbCAgICByNSxyMSxscixyMQotOyAgICB2ZWNbN10gID0gZnhwX21hYzMyX1EzMiggdmVjWzddLCB0bXA2PDwxLCBjb3NfMTdwaV8xOCk7Ci0gICAgICAgIHNtbGFsICAgIHIyLHIxLHI3LHIyCi07ICAgIHZlY1s3XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbN10sIHRtcDc8PDEsICAgIGNvc19waV82KTsKLSAgICAgICAgc21sYWwgICAgcjMscjEscjQscjMKLTsgICAgdmVjWzddICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1s3XSwgdG1wODw8MSwgY29zXzExcGlfMTgpOwotICAgICAgICBzbWxhbCAgICByMTIscjEscjkscjEyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyMCwgIzB4MWNdCi0gICAgICAgIGxkbWZkICAgIHNwISx7cjQtcjEwLHBjfQotfGNvc18ycGlfOXwKLSAgICAgICAgRENEICAgICAgMHg2MjBkYmU4MAotfGNvc180cGlfOXwKLSAgICAgICAgRENEICAgICAgMHgxNjNhMWE4MAotfGNvc19waV85fAotICAgICAgICBEQ0QgICAgICAweDc4NDdkOTAwCi18Y29zXzVwaV85fAotICAgICAgICBEQ0QgICAgICAweDg3YjgyNzAwCi18Y29zXzhwaV85fAotICAgICAgICBEQ0QgICAgICAweGQ0MzhhZjAwCi18Y29zXzExcGlfMTh8Ci0gICAgICAgIERDRCAgICAgIDB4YWRiOTIyODAKLXxjb3NfMTNwaV8xOHwKLSAgICAgICAgRENEICAgICAgMHg5MTI2MTQ4MAotfGNvc18xN3BpXzE4fAotICAgICAgICBEQ0QgICAgICAweDgxZjFkMjAwCi18Y29zX3BpXzZ8Ci0gICAgICAgIERDRCAgICAgIDB4NmVkOWViODAKLSAgICAgICAgRU5EUAotCi0KLQotCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfbWRjdF8xOF9hcm0ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X2FybS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDAxZDhjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X2FybS5zCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLTsgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLTsgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsKLTsKLTsgICBGaWxlbmFtZTogcHZtcDNfZGN0XzE4LnMKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUkVWSVNJT04gSElTVE9SWQotOwotOwotOyBXaG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlOiBNTS9ERC9ZWVlZCi07IERlc2NyaXB0aW9uOiAKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBFWFBPUlQgcHZtcDNfbWRjdF8xOAotCi0gICAgICAgIElNUE9SVCB8fExpYiQkUmVxdWVzdCQkYXJtbGlifHwgW1dFQUtdCi0gICAgICAgIElNUE9SVCB8fExpYiQkUmVxdWVzdCQkY3BwbGlifHwgW1dFQUtdCi0gICAgICAgIElNUE9SVCBwdm1wM19kY3RfOQotCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIEFSRUEgfC50ZXh0fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXxwdm1wM19tZGN0XzE4fCBQUk9DCi0gICAgICAgIHN0bWZkICAgIHNwISx7cjQtcjEwLGxyfQotICAgICAgICBtb3YgICAgICByNyxyMgotICAgICAgICBsZHIgICAgICByMix0YWJsZQotICAgICAgICBtb3YgICAgICByNixyMQotICAgICAgICBhZGQgICAgICByMyxyMiwjMHgyNAotICAgICAgICBhZGQgICAgICByMTIscjMsIzB4NDQKLSAgICAgICAgYWRkICAgICAgcjEscjAsIzB4NDQKLSAgICAgICAgbW92ICAgICAgcjUscjAKLQotOyAgICBmb3IgKCBpPTk7IGkhPTA7IGktLSkKLTsgICAgewotCi0gICAgICAgIG1vdiAgICAgIHI0LCM5Ci1Mb29wXzEKLQotOyAgICAgICB0bXAgID0gKihwdF92ZWMpOwotOwkJdG1wMSA9ICoocHRfdmVjX28pOwotCi0gICAgICAgIGxkciAgICAgIGxyLFtyMF0JCTs7IHRtcCAgPT0gbHIKLSAgICAgICAgbGRyICAgICAgcjgsW3IzXSwjNAkJOzsgdG1wMSA9PSByOAotCi07ICAgICAgICB0bXAgID0gZnhwX211bDMyX1EzMiggdG1wPDwxLCAgKihwdF9jb3MrKyAgKSk7Ci07ICAgICAgICB0bXAxID0gZnhwX211bDMyX1EyNyggdG1wMSwgKihwdF9jb3NfeC0tKSk7Ci0KLSAgICAgICAgbW92ICAgICAgbHIsbHIsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHIxMCxscixyOCxscgotICAgICAgICBsZHIgICAgICByOCxbcjEyXSwjLTQKLSAgICAgICAgbGRyICAgICAgcjksW3IxXQotICAgICAgICBzdWJzICAgICByNCxyNCwjMQotICAgICAgICBzbXVsbCAgICByOSxyMTAscjgscjkKLSAgICAgICAgbW92ICAgICAgcjgscjksbHNyICMyNwotICAgICAgICBhZGQgICAgICByOCxyOCxyMTAsbHNsICM1Ci0KLTsgICAgICAgICoocHRfdmVjKyspICAgPSAgIHRtcCArIHRtcDEgOwotOyAgICAgICAgKihwdF92ZWNfby0tKSA9IGZ4cF9tdWwzMl9RMjgoICh0bXAgLSB0bXAxKSwgKihwdF9jb3Nfc3BsaXQrKykpOwotCi0gICAgICAgIGFkZCAgICAgIHI5LGxyLHI4Ci0gICAgICAgIHN1YiAgICAgIHI4LGxyLHI4Ci0gICAgICAgIGxkciAgICAgIGxyLFtyMl0sIzQKLSAgICAgICAgc3RyICAgICAgcjksW3IwXSwjNAotICAgICAgICBzbXVsbCAgICByOCxyOSxscixyOAotICAgICAgICBtb3YgICAgICBscixyOCxsc3IgIzI4Ci0gICAgICAgIGFkZCAgICAgIGxyLGxyLHI5LGxzbCAjNAotICAgICAgICBzdHIgICAgICBscixbcjFdLCMtNAotICAgICAgICBibmUgICAgICBMb29wXzEKLQotOwkJfQotCi0gICAgICAgIG1vdiAgICAgIHIwLHI1CQkJOzsgcjAgPSB2ZWMKLSAgICAgICAgYmwgICAgICAgcHZtcDNfZGN0XzkKLSAgICAgICAgYWRkICAgICAgcjAscjUsIzB4MjQJOzsgcjAgPSAmdmVjWzldCi0gICAgICAgIGJsICAgICAgIHB2bXAzX2RjdF85Ci0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDIwXQotICAgICAgICBsZHIgICAgICByMixbcjUsIzB4NDBdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDFjXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MzhdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgzOF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDE4XQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MzBdCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHgxNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDI4XQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMweDEwXQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDIwXQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMweGNdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4MThdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzhdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4MTBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzRdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzhdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzB4MjRdCi0gICAgICAgIHN1YiAgICAgIHIxMixyMTIscjEKLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjNF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHgyY10KLSAgICAgICAgc3ViICAgICAgcjEscjEyLHIxCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHhjXQotICAgICAgICBzdWIgICAgICByMSxyMTIscjAKLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDE0XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MzRdCi0gICAgICAgIHN1YiAgICAgIHIwLHIxLHIwCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgxY10KLSAgICAgICAgc3ViICAgICAgcjAscjEscjMKLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDI0XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4M2NdCi0gICAgICAgIHN1YiAgICAgIHIzLHIxLHIzCi0gICAgICAgIHN1YiAgICAgIHIxLHIxLHIyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzNF0KLSAgICAgICAgc3RyICAgICAgcjMsW3I1LCMweDJjXQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4NDRdCi0gICAgICAgIHN1YiAgICAgIHIxLHIxLHIyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzY10KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMF0KLQotTG9vcF8yCi0gICAgICAgIGFkZCAgICAgIHIxLHI1LHI0LGxzbCAjMgotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNixyNCxsc2wgIzJdCi0gICAgICAgIGFkZCAgICAgIHIwLHIwLHIyCi0gICAgICAgIHN0ciAgICAgIHIwLFtyMSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LHI0LGxzbCAjMl0KLSAgICAgICAgbGRyICAgICAgcjEsW3IxLCM0XQotICAgICAgICBzbWxhbCAgICByMCxyMyxscixyMAotICAgICAgICBtb3YgICAgICByMCxyMgotICAgICAgICBhZGQgICAgICByMixyMTIscjEKLSAgICAgICAgcnNiICAgICAgcjIscjIsIzAKLSAgICAgICAgc3RyICAgICAgcjMsW3I1LHI0LGxzbCAjMl0KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LHI0LGxzbCAjMl0KLSAgICAgICAgYWRkICAgICAgcjQscjQsIzEKLSAgICAgICAgY21wICAgICAgcjQsIzYKLSAgICAgICAgbW92ICAgICAgcjEyLHIxCi0KLSAgICAgICAgYmx0ICAgICAgTG9vcF8yCi0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQwXQotICAgICAgICBsZHIgICAgICByMixbcjYsIzB4MThdCi0gICAgICAgIGFkZCAgICAgIHIzLHIwLHIxCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LHI0LGxzbCAjMl0KLSAgICAgICAgbW92ICAgICAgcjMscjMsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgxY10KLSAgICAgICAgc21sYWwgICAgcjMscjIsbHIscjMKLSAgICAgICAgYWRkICAgICAgcjMscjEyLHIwCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjIsW3I2LCMweDFjXQotICAgICAgICByc2IgICAgICByMyxyMywjMAotICAgICAgICBzdHIgICAgICByMyxbcjYsIzB4MThdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNSwjMHgyMF0KLSAgICAgICAgYWRkICAgICAgcjAscjMscjAKLSAgICAgICAgcnNiICAgICAgcjAscjAsIzAKLSAgICAgICAgc3RyICAgICAgcjAsW3I2LCMweDFjXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4NDRdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHgyMF0KLSAgICAgICAgYWRkICAgICAgcjMscjMscjEKLSAgICAgICAgbW92ICAgICAgcjEscjIKLSAgICAgICAgbGRyICAgICAgcjEwLFtyNywjMHgxY10KLSAgICAgICAgbW92ICAgICAgcjIscjMsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIxMixyMSxyMTAscjIKLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDFjXQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MjBdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNSwjMHgyNF0KLSAgICAgICAgYWRkICAgICAgcjEscjEscjMKLSAgICAgICAgcnNiICAgICAgcjEscjEsIzAKLSAgICAgICAgc3RyICAgICAgcjEsW3I2LCMweDIwXQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4NDRdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNywjMHgyMF0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIxMixyMCxyMyxyMQotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4MjRdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNiwjMHgyNF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDIwXQotICAgICAgICBzbWxhbCAgICByMSxyMyxscixyMQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzB4NDBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjYsIzB4NDRdCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHgyNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMyxbcjcsIzB4NDRdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMSxyMTIscjMscjEKLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQwXQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDQ0XQotICAgICAgICByc2IgICAgICByOCxyMSwjMAotICAgICAgICBzdHIgICAgICByOCxbcjUsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgyY10KLSAgICAgICAgbGRyICAgICAgcjMsW3I3LCMweDQwXQotICAgICAgICBtb3YgICAgICByMSxyMSxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjEscjAscjMscjEKLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDQwXQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4M2NdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNiwjMHgzOF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I2LCMweDNjXQotICAgICAgICByc2IgICAgICByOSxyMCwjMAotICAgICAgICBzdHIgICAgICByOSxbcjUsIzB4MmNdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHgzY10KLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIwLHIzLHIxMixyMAotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4M2NdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgzOF0KLSAgICAgICAgcnNiICAgICAgcjAscjAsIzAKLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDMwXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4MzhdCi0gICAgICAgIG1vdiAgICAgIHIzLHIzLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMyxyMSxyMTIscjMKLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzOF0KLSAgICAgICAgbGRyICAgICAgcjQsW3I3LCMweDM0XQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNiwjMHgzMF0KLSAgICAgICAgc21sYWwgICAgcjAscjEscjQscjAKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNiwjMHgyY10KLSAgICAgICAgbGRyICAgICAgbHIsW3I2LCMweDI4XQotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNywjMHgzMF0KLSAgICAgICAgbW92ICAgICAgcjAscjksbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIwLHIzLHIxLHIwCi0gICAgICAgIG1vdiAgICAgIHIwLHI4LGxzbCAjMQotICAgICAgICBsZHIgICAgICByMSxbcjcsIzB4MmNdCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHgzMF0KLSAgICAgICAgc21sYWwgICAgcjAscjEyLHIxLHIwCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHgyOF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHgyY10KLSAgICAgICAgc21sYWwgICAgcjIsbHIscjAscjIKLSAgICAgICAgc3RyICAgICAgbHIsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NDhdCi0gICAgICAgIG1vdiAgICAgIHIyLHIxLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzB4MjBdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNl0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHI0LGxyLHIxMixyMQotICAgICAgICBsZHIgICAgICByMyxbcjYsIzB4MWNdCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNl0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg0Y10KLSAgICAgICAgbW92ICAgICAgcjMscjMsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHI0LGxyLHIxMixyMwotICAgICAgICBtb3YgICAgICByMCxyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg2NF0KLSAgICAgICAgc3RyICAgICAgbHIsW3I2LCM0XQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg2OF0KLSAgICAgICAgc3RyICAgICAgbHIsW3I2LCMweDFjXQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjAKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg2Y10KLSAgICAgICAgc3RyICAgICAgbHIsW3I2LCMweDIwXQotICAgICAgICBzbXVsbCAgICBscixyMCxyMTIscjAKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg3MF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I2LCMweDI0XQotICAgICAgICBzbXVsbCAgICByMCxyMixyMTIscjIKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDg4XQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MjhdCi0gICAgICAgIHNtdWxsICAgIHIzLHIyLHIwLHIzCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHg4Y10KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LCMweDQwXQotICAgICAgICBzbXVsbCAgICByMixyMSxyMCxyMQotICAgICAgICBzdHIgICAgICByMSxbcjYsIzB4NDRdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDUwXQotICAgICAgICBtb3YgICAgICByMSxyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCMweDE0XQotICAgICAgICBzbXVsbCAgICByNSxyNCxscixyMQotICAgICAgICBsZHIgICAgICByMTIsW3I2LCMweDEwXQotICAgICAgICBtb3YgICAgICByMyxyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCMweGNdCi0gICAgICAgIG1vdiAgICAgIHIxMixyMTIsbHNsICMxCi0gICAgICAgIG1vdiAgICAgIHIyLHIwLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzhdCi0gICAgICAgIHN0ciAgICAgIHI0LFtyNiwjOF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDU0XQotICAgICAgICBtb3YgICAgICByMCxyMCxsc2wgIzEKLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjMKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDU4XQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzB4Y10KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjEyCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg1Y10KLSAgICAgICAgc3RyICAgICAgcjQsW3I2LCMweDEwXQotICAgICAgICBzbXVsbCAgICByNSxyNCxscixyMgotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NjBdCi0gICAgICAgIHN0ciAgICAgIHI0LFtyNiwjMHgxNF0KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjAKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDc0XQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzB4MThdCi0gICAgICAgIHNtdWxsICAgIHI0LHIwLGxyLHIwCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg3OF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I2LCMweDJjXQotICAgICAgICBzbXVsbCAgICByMCxyMixscixyMgotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4N2NdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNiwjMHgzMF0KLSAgICAgICAgc211bGwgICAgcjEyLHIyLHIwLHIxMgotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4ODBdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNiwjMHgzNF0KLSAgICAgICAgc211bGwgICAgcjMscjIscjAscjMKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDg0XQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MzhdCi0gICAgICAgIHNtdWxsICAgIHIyLHIxLHIwLHIxCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNiwjMHgzY10KLSAgICAgICAgbGRtZmQgICAgc3AhLHtyNC1yMTAscGN9Ci10YWJsZQotICAgICAgICBEQ0QgICAgICB8fC5jb25zdGRhdGEkMXx8Ci0gICAgICAgIEVORFAKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gQVJFQSB8LmNvbnN0ZGF0YXwsIERBVEEsIFJFQURPTkxZLCBBTElHTj0yCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfHwuY29uc3RkYXRhJDF8fAotY29zVGVybXNfZGN0MTgKLSAgICAgICAgRENEICAgICAgMHgwODA3ZDJiMAotICAgICAgICBEQ0QgICAgICAweDA4NDgzZWUwCi0gICAgICAgIERDRCAgICAgIDB4MDhkM2I3ZDAKLSAgICAgICAgRENEICAgICAgMHgwOWM0MjU3MAotICAgICAgICBEQ0QgICAgICAweDBiNTA0ZjMwCi0gICAgICAgIERDRCAgICAgIDB4MGRmMjk0NDAKLSAgICAgICAgRENEICAgICAgMHgxMmVkZmIyMAotICAgICAgICBEQ0QgICAgICAweDFlZThkZDQwCi0gICAgICAgIERDRCAgICAgIDB4NWJjYTJhMDAKLWNvc1Rlcm1zXzFfb3ZfY29zX3BoaQotICAgICAgICBEQ0QgICAgICAweDQwMGY5YzAwCi0gICAgICAgIERDRCAgICAgIDB4NDA4ZDYwODAKLSAgICAgICAgRENEICAgICAgMHg0MThkY2I4MAotICAgICAgICBEQ0QgICAgICAweDQzMWIxYTAwCi0gICAgICAgIERDRCAgICAgIDB4NDU0NWVhMDAKLSAgICAgICAgRENEICAgICAgMHg0ODI3MDY4MAotICAgICAgICBEQ0QgICAgICAweDRiZTI1NDgwCi0gICAgICAgIERDRCAgICAgIDB4NTBhYjk0ODAKLSAgICAgICAgRENEICAgICAgMHg1NmNlNGQ4MAotICAgICAgICBEQ0QgICAgICAweDA1ZWJiNjMwCi0gICAgICAgIERDRCAgICAgIDB4MDY5MjFhOTgKLSAgICAgICAgRENEICAgICAgMHgwNzcxZDNhOAotICAgICAgICBEQ0QgICAgICAweDA4YTlhODMwCi0gICAgICAgIERDRCAgICAgIDB4MGE3M2Q3NTAKLSAgICAgICAgRENEICAgICAgMHgwZDRkNTI2MAotICAgICAgICBEQ0QgICAgICAweDEyN2IxY2EwCi0gICAgICAgIERDRCAgICAgIDB4MWVhNTJiNDAKLSAgICAgICAgRENEICAgICAgMHg1YmIzY2M4MAotCi0KLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X3dtLmFzbSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X3dtLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJlNzVkNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfbWRjdF8xOF93bS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotOyBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotOyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOwotOwotOyAgIEZpbGVuYW1lOiBwdm1wM19kY3RfMTgucwotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSRVZJU0lPTiBISVNUT1JZCi07Ci07Ci07IFdobzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGU6IE1NL0REL1lZWVkKLTsgRGVzY3JpcHRpb246IAotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIEVYUE9SVCB8cHZtcDNfbWRjdF8xOHwKLQotICAgICAgICBJTVBPUlQgcHZtcDNfZGN0XzkKLQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBBUkVBIHwudGV4dHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi18cHZtcDNfbWRjdF8xOHwgUFJPQwotICAgICAgICBzdG1mZCAgICBzcCEse3I0LXIxMCxscn0KLSAgICAgICAgbW92ICAgICAgcjcscjIKLSAgICAgICAgbGRyICAgICAgcjIsdGFibGUKLSAgICAgICAgbW92ICAgICAgcjYscjEKLSAgICAgICAgYWRkICAgICAgcjMscjIsIzB4MjQKLSAgICAgICAgYWRkICAgICAgcjEyLHIzLCMweDQ0Ci0gICAgICAgIGFkZCAgICAgIHIxLHIwLCMweDQ0Ci0gICAgICAgIG1vdiAgICAgIHI1LHIwCi0KLTsgICAgZm9yICggaT05OyBpIT0wOyBpLS0pCi07ICAgIHsKLQotICAgICAgICBtb3YgICAgICByNCwjOQotTG9vcF8xCi0KLTsgICAgICAgdG1wICA9ICoocHRfdmVjKTsKLTsJCXRtcDEgPSAqKHB0X3ZlY19vKTsKLQotICAgICAgICBsZHIgICAgICBscixbcjBdCQk7OyB0bXAgID09IGxyCi0gICAgICAgIGxkciAgICAgIHI4LFtyM10sIzQJCTs7IHRtcDEgPT0gcjgKLQotOyAgICAgICAgdG1wICA9IGZ4cF9tdWwzMl9RMzIoIHRtcDw8MSwgICoocHRfY29zKysgICkpOwotOyAgICAgICAgdG1wMSA9IGZ4cF9tdWwzMl9RMjcoIHRtcDEsICoocHRfY29zX3gtLSkpOwotCi0gICAgICAgIG1vdiAgICAgIGxyLGxyLGxzbCAjMQotICAgICAgICBzbXVsbCAgICByMTAsbHIscjgsbHIKLSAgICAgICAgbGRyICAgICAgcjgsW3IxMl0sIy00Ci0gICAgICAgIGxkciAgICAgIHI5LFtyMV0KLSAgICAgICAgc3VicyAgICAgcjQscjQsIzEKLSAgICAgICAgc211bGwgICAgcjkscjEwLHI4LHI5Ci0gICAgICAgIG1vdiAgICAgIHI4LHI5LGxzciAjMjcKLSAgICAgICAgYWRkICAgICAgcjgscjgscjEwLGxzbCAjNQotCi07ICAgICAgICAqKHB0X3ZlYysrKSAgID0gICB0bXAgKyB0bXAxIDsKLTsgICAgICAgICoocHRfdmVjX28tLSkgPSBmeHBfbXVsMzJfUTI4KCAodG1wIC0gdG1wMSksICoocHRfY29zX3NwbGl0KyspKTsKLQotICAgICAgICBhZGQgICAgICByOSxscixyOAotICAgICAgICBzdWIgICAgICByOCxscixyOAotICAgICAgICBsZHIgICAgICBscixbcjJdLCM0Ci0gICAgICAgIHN0ciAgICAgIHI5LFtyMF0sIzQKLSAgICAgICAgc211bGwgICAgcjgscjksbHIscjgKLSAgICAgICAgbW92ICAgICAgbHIscjgsbHNyICMyOAotICAgICAgICBhZGQgICAgICBscixscixyOSxsc2wgIzQKLSAgICAgICAgc3RyICAgICAgbHIsW3IxXSwjLTQKLSAgICAgICAgYm5lICAgICAgTG9vcF8xCi0KLTsJCX0KLQotICAgICAgICBtb3YgICAgICByMCxyNQkJCTs7IHIwID0gdmVjCi0gICAgICAgIGJsICAgICAgIHB2bXAzX2RjdF85Ci0gICAgICAgIGFkZCAgICAgIHIwLHI1LCMweDI0CTs7IHIwID0gJnZlY1s5XQotICAgICAgICBibCAgICAgICBwdm1wM19kY3RfOQotCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjIsW3I1LCMweDQwXQotICAgICAgICBzdHIgICAgICByMCxbcjUsIzB4NDBdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgxY10KLSAgICAgICAgbGRyICAgICAgcjMsW3I1LCMweDM4XQotICAgICAgICBzdHIgICAgICByMCxbcjUsIzB4MzhdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDMwXQotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MzBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzB4MTRdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgyOF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHgxMF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHhjXQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDE4XQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCM4XQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDEwXQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCM0XQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCM4XQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMweDI0XQotICAgICAgICBzdWIgICAgICByMTIscjEyLHIxCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzB4MmNdCi0gICAgICAgIHN1YiAgICAgIHIxLHIxMixyMQotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4Y10KLSAgICAgICAgc3ViICAgICAgcjEscjEyLHIwCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgxNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDM0XQotICAgICAgICBzdWIgICAgICByMCxyMSxyMAotICAgICAgICBzdHIgICAgICByMCxbcjUsIzB4MWNdCi0gICAgICAgIHN1YiAgICAgIHIwLHIxLHIzCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgyNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDNjXQotICAgICAgICBzdWIgICAgICByMyxyMSxyMwotICAgICAgICBzdWIgICAgICByMSxyMSxyMgotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MzRdCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHgyY10KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQ0XQotICAgICAgICBzdWIgICAgICByMSxyMSxyMgotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4M2NdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzBdCi0KLUxvb3BfMgotICAgICAgICBhZGQgICAgICByMSxyNSxyNCxsc2wgIzIKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDI4XQotICAgICAgICBsZHIgICAgICByMyxbcjYscjQsbHNsICMyXQotICAgICAgICBhZGQgICAgICByMCxyMCxyMgotICAgICAgICBzdHIgICAgICByMCxbcjEsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNyxyNCxsc2wgIzJdCi0gICAgICAgIGxkciAgICAgIHIxLFtyMSwjNF0KLSAgICAgICAgc21sYWwgICAgcjAscjMsbHIscjAKLSAgICAgICAgbW92ICAgICAgcjAscjIKLSAgICAgICAgYWRkICAgICAgcjIscjEyLHIxCi0gICAgICAgIHJzYiAgICAgIHIyLHIyLCMwCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSxyNCxsc2wgIzJdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNixyNCxsc2wgIzJdCi0gICAgICAgIGFkZCAgICAgIHI0LHI0LCMxCi0gICAgICAgIGNtcCAgICAgIHI0LCM2Ci0gICAgICAgIG1vdiAgICAgIHIxMixyMQotCi0gICAgICAgIGJsdCAgICAgIExvb3BfMgotCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgcjIsW3I2LCMweDE4XQotICAgICAgICBhZGQgICAgICByMyxyMCxyMQotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4NDBdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNyxyNCxsc2wgIzJdCi0gICAgICAgIG1vdiAgICAgIHIzLHIzLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MWNdCi0gICAgICAgIHNtbGFsICAgIHIzLHIyLGxyLHIzCi0gICAgICAgIGFkZCAgICAgIHIzLHIxMixyMAotICAgICAgICBzdHIgICAgICByMixbcjUsIzB4MThdCi0gICAgICAgIGxkciAgICAgIHIyLFtyNiwjMHgxY10KLSAgICAgICAgcnNiICAgICAgcjMscjMsIzAKLSAgICAgICAgc3RyICAgICAgcjMsW3I2LCMweDE4XQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MjBdCi0gICAgICAgIGFkZCAgICAgIHIwLHIzLHIwCi0gICAgICAgIHJzYiAgICAgIHIwLHIwLCMwCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNiwjMHgxY10KLSAgICAgICAgbGRyICAgICAgcjMsW3I1LCMweDQ0XQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzB4MjBdCi0gICAgICAgIGFkZCAgICAgIHIzLHIzLHIxCi0gICAgICAgIG1vdiAgICAgIHIxLHIyCi0gICAgICAgIGxkciAgICAgIHIxMCxbcjcsIzB4MWNdCi0gICAgICAgIG1vdiAgICAgIHIyLHIzLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMTIscjEscjEwLHIyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgxY10KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDIwXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MjRdCi0gICAgICAgIGFkZCAgICAgIHIxLHIxLHIzCi0gICAgICAgIHJzYiAgICAgIHIxLHIxLCMwCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNiwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQ0XQotICAgICAgICBsZHIgICAgICByMyxbcjcsIzB4MjBdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMTIscjAscjMscjEKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDI0XQotICAgICAgICBsZHIgICAgICByMyxbcjYsIzB4MjRdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgyMF0KLSAgICAgICAgc21sYWwgICAgcjEscjMsbHIscjEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCMweDQwXQotICAgICAgICBsZHIgICAgICByMTIsW3I2LCMweDQ0XQotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4MjRdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I3LCMweDQ0XQotICAgICAgICBtb3YgICAgICByMSxyMSxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjEscjEyLHIzLHIxCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHg0MF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHg0NF0KLSAgICAgICAgcnNiICAgICAgcjgscjEsIzAKLSAgICAgICAgc3RyICAgICAgcjgsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MmNdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNywjMHg0MF0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIxLHIwLHIzLHIxCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDNjXQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzB4MzhdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNiwjMHgzY10KLSAgICAgICAgcnNiICAgICAgcjkscjAsIzAKLSAgICAgICAgc3RyICAgICAgcjksW3I1LCMweDJjXQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MzBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4M2NdCi0gICAgICAgIG1vdiAgICAgIHIwLHIwLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMCxyMyxyMTIscjAKLSAgICAgICAgc3RyICAgICAgcjMsW3I1LCMweDNjXQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MzhdCi0gICAgICAgIHJzYiAgICAgIHIwLHIwLCMwCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I1LCMweDM0XQotICAgICAgICBsZHIgICAgICByMTIsW3I3LCMweDM4XQotICAgICAgICBtb3YgICAgICByMyxyMyxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjMscjEscjEyLHIzCi0gICAgICAgIG1vdiAgICAgIHIwLHIwLGxzbCAjMQotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MzhdCi0gICAgICAgIGxkciAgICAgIHI0LFtyNywjMHgzNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I2LCMweDM0XQotICAgICAgICBsZHIgICAgICByMyxbcjYsIzB4MzBdCi0gICAgICAgIHNtbGFsICAgIHIwLHIxLHI0LHIwCi0gICAgICAgIGxkciAgICAgIHIxMixbcjYsIzB4MmNdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNiwjMHgyOF0KLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDM0XQotICAgICAgICBsZHIgICAgICByMSxbcjcsIzB4MzBdCi0gICAgICAgIG1vdiAgICAgIHIwLHI5LGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMCxyMyxyMSxyMAotICAgICAgICBtb3YgICAgICByMCxyOCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjEsW3I3LCMweDJjXQotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4MzBdCi0gICAgICAgIHNtbGFsICAgIHIwLHIxMixyMSxyMAotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4MjhdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4MmNdCi0gICAgICAgIHNtbGFsICAgIHIyLGxyLHIwLHIyCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I2LCM0XQotICAgICAgICBsZHIgICAgICByMTIsW3I3LCMweDQ4XQotICAgICAgICBtb3YgICAgICByMixyMSxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjEsW3I2LCMweDIwXQotICAgICAgICBsZHIgICAgICByMCxbcjZdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCAjMQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjEKLSAgICAgICAgbGRyICAgICAgcjMsW3I2LCMweDFjXQotICAgICAgICBzdHIgICAgICBscixbcjZdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NGNdCi0gICAgICAgIG1vdiAgICAgIHIzLHIzLGxzbCAjMQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjMKLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NjRdCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNiwjNF0KLSAgICAgICAgc211bGwgICAgcjQsbHIscjEyLHIyCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NjhdCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNiwjMHgxY10KLSAgICAgICAgc211bGwgICAgcjQsbHIscjEyLHIwCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NmNdCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNiwjMHgyMF0KLSAgICAgICAgc211bGwgICAgbHIscjAscjEyLHIwCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NzBdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNiwjMHgyNF0KLSAgICAgICAgc211bGwgICAgcjAscjIscjEyLHIyCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHg4OF0KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LCMweDI4XQotICAgICAgICBzbXVsbCAgICByMyxyMixyMCxyMwotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4OGNdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNiwjMHg0MF0KLSAgICAgICAgc211bGwgICAgcjIscjEscjAscjEKLSAgICAgICAgc3RyICAgICAgcjEsW3I2LCMweDQ0XQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzB4MThdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg1MF0KLSAgICAgICAgbW92ICAgICAgcjEscjAsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHgxNF0KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjEKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNiwjMHgxMF0KLSAgICAgICAgbW92ICAgICAgcjMscjAsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHhjXQotICAgICAgICBtb3YgICAgICByMTIscjEyLGxzbCAjMQotICAgICAgICBtb3YgICAgICByMixyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCM4XQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzhdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg1NF0KLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHI1LHI0LGxyLHIzCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg1OF0KLSAgICAgICAgc3RyICAgICAgcjQsW3I2LCMweGNdCi0gICAgICAgIHNtdWxsICAgIHI1LHI0LGxyLHIxMgotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NWNdCi0gICAgICAgIHN0ciAgICAgIHI0LFtyNiwjMHgxMF0KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjIKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDYwXQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzB4MTRdCi0gICAgICAgIHNtdWxsICAgIHI1LHI0LGxyLHIwCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg3NF0KLSAgICAgICAgc3RyICAgICAgcjQsW3I2LCMweDE4XQotICAgICAgICBzbXVsbCAgICByNCxyMCxscixyMAotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NzhdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNiwjMHgyY10KLSAgICAgICAgc211bGwgICAgcjAscjIsbHIscjIKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDdjXQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MzBdCi0gICAgICAgIHNtdWxsICAgIHIxMixyMixyMCxyMTIKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDgwXQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MzRdCi0gICAgICAgIHNtdWxsICAgIHIzLHIyLHIwLHIzCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHg4NF0KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LCMweDM4XQotICAgICAgICBzbXVsbCAgICByMixyMSxyMCxyMQotICAgICAgICBzdHIgICAgICByMSxbcjYsIzB4M2NdCi0gICAgICAgIGxkbWZkICAgIHNwISx7cjQtcjEwLHBjfQotdGFibGUKLSAgICAgICAgRENEICAgICAgY29zVGVybXNfZGN0MTgKLSAgICAgICAgRU5EUAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBBUkVBIHwuY29uc3RkYXRhfCwgREFUQSwgUkVBRE9OTFksIEFMSUdOPTIKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb3NUZXJtc19kY3QxOAotICAgICAgICBEQ0QgICAgICAweDA4MDdkMmIwCi0gICAgICAgIERDRCAgICAgIDB4MDg0ODNlZTAKLSAgICAgICAgRENEICAgICAgMHgwOGQzYjdkMAotICAgICAgICBEQ0QgICAgICAweDA5YzQyNTcwCi0gICAgICAgIERDRCAgICAgIDB4MGI1MDRmMzAKLSAgICAgICAgRENEICAgICAgMHgwZGYyOTQ0MAotICAgICAgICBEQ0QgICAgICAweDEyZWRmYjIwCi0gICAgICAgIERDRCAgICAgIDB4MWVlOGRkNDAKLSAgICAgICAgRENEICAgICAgMHg1YmNhMmEwMAotY29zVGVybXNfMV9vdl9jb3NfcGhpCi0gICAgICAgIERDRCAgICAgIDB4NDAwZjljMDAKLSAgICAgICAgRENEICAgICAgMHg0MDhkNjA4MAotICAgICAgICBEQ0QgICAgICAweDQxOGRjYjgwCi0gICAgICAgIERDRCAgICAgIDB4NDMxYjFhMDAKLSAgICAgICAgRENEICAgICAgMHg0NTQ1ZWEwMAotICAgICAgICBEQ0QgICAgICAweDQ4MjcwNjgwCi0gICAgICAgIERDRCAgICAgIDB4NGJlMjU0ODAKLSAgICAgICAgRENEICAgICAgMHg1MGFiOTQ4MAotICAgICAgICBEQ0QgICAgICAweDU2Y2U0ZDgwCi0gICAgICAgIERDRCAgICAgIDB4MDVlYmI2MzAKLSAgICAgICAgRENEICAgICAgMHgwNjkyMWE5OAotICAgICAgICBEQ0QgICAgICAweDA3NzFkM2E4Ci0gICAgICAgIERDRCAgICAgIDB4MDhhOWE4MzAKLSAgICAgICAgRENEICAgICAgMHgwYTczZDc1MAotICAgICAgICBEQ0QgICAgICAweDBkNGQ1MjYwCi0gICAgICAgIERDRCAgICAgIDB4MTI3YjFjYTAKLSAgICAgICAgRENEICAgICAgMHgxZWE1MmI0MAotICAgICAgICBEQ0QgICAgICAweDViYjNjYzgwCi0KLQotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2FybS5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2FybS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmVjNTk5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd19hcm0ucworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi07IGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi07IGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07Ci07Ci07ICAgRmlsZW5hbWU6IHB2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LnMKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUkVWSVNJT04gSElTVE9SWQotOwotOwotOyBXaG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlOiBNTS9ERC9ZWVlZCi07IERlc2NyaXB0aW9uOiAKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBFWFBPUlQgcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cKLQotICAgICAgICBJTVBPUlQgfHxMaWIkJFJlcXVlc3QkJGFybWxpYnx8IFtXRUFLXQotICAgICAgICBJTVBPUlQgfHxMaWIkJFJlcXVlc3QkJGNwcGxpYnx8IFtXRUFLXQotICAgICAgICBJTVBPUlQgcHFtZlN5bnRoV2luCi0KLQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBBUkVBIHwudGV4dHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi18cHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3d8IFBST0MKLQotICAgICAgICBzdG1mZCAgICBzcCEse3IwLXIyLHI0LXIxMSxscn0KLQotICAgICAgICBzdWIgICAgICBzcCxzcCwjNAotICAgICAgICBsZHIgICAgICByMixbc3AsIzB4Y10KLSAgICAgICAgbGRyICAgICAgcjEsUG9seVBoX2ZpbHRlcl9jb2VmZgotCQkKLSAgICAgICAgc3ViICAgICAgcjIscjIsIzEKLSAgICAgICAgbW92ICAgICAgcjEwLCMxCi0gICAgICAgIHN0ciAgICAgIHIyLFtzcF0KLQotOyBBY2N1bXVsYXRvcnMgcjksIHIxMTo6PiBJbml0aWFsaXphdGlvbgotCi1Mb29wX2oKLSAgICAgICAgbW92ICAgICAgcjksICAjMHgyMAotICAgICAgICBtb3YgICAgICByMTEsICMweDIwCi0gICAgICAgIG1vdiAgICAgIHI0LCAgIzB4MTAKLUxvb3BfaQotICAgICAgICBhZGQgICAgICByMixyNCxyMTAKLSAgICAgICAgYWRkICAgICAgcjMscjAscjIsbHNsICMyCi0gICAgICAgIHN1YiAgICAgIHIyLHI0LHIxMAotICAgICAgICBsZHIgICAgICByNSxbcjNdCi0gICAgICAgIGxkciAgICAgIGxyLFtyMV0KLSAgICAgICAgYWRkICAgICAgcjEyLHIwLHIyLGxzbCAjMgotICAgICAgICBsZHIgICAgICByNixbcjEyLCMweDc4MF0KLSAgICAgICAgc21sYWwgICAgcjIscjksbHIscjUKLSAgICAgICAgc21sYWwgICAgcjIscjExLGxyLHI2Ci0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IxMiwjMHg4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIHN1YiAgICAgIHI5LHI5LHI1Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMSwjOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDcwMF0KLSAgICAgICAgYWRkICAgICAgcjQscjQsIzB4MjAwCi0gICAgICAgIHNtbGFsICAgIHI2LHI5LHI1LHI3Ci0gICAgICAgIHNtdWxsICAgIHI2LHIyLHI1LHI4Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMSwjMHhjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHIyCi0gICAgICAgIHNtbGFsICAgIHI4LHI5LHI1LHI4Ci0gICAgICAgIHNtbGFsICAgIHI3LHIxMSxyNSxyNwotICAgICAgICBsZHIgICAgICByNSxbcjMsIzB4MTAwXQotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MTBdCi0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NjgwXQotICAgICAgICBzbWxhbCAgICBscixyOSxyMixyNQotICAgICAgICBzbWxhbCAgICBscixyMTEscjIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDE0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDE4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDYwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjUscjkscjYscjcKLSAgICAgICAgc211bGwgICAgcjIscjUscjYscjgKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDFjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHI1Ci0gICAgICAgIHNtbGFsICAgIHI4LHI5LHI2LHI4Ci0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjUsW3IzLCMweDIwMF0KLSAgICAgICAgc21sYWwgICAgcjcscjExLHI2LHI3Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NTgwXQotICAgICAgICBzbWxhbCAgICBscixyOSxyMixyNQotICAgICAgICBzbWxhbCAgICBscixyMTEscjIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDI0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDI4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDUwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjUscjkscjYscjcKLSAgICAgICAgc211bGwgICAgcjIscjUscjYscjgKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDJjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHI1Ci0KLSAgICAgICAgc21sYWwgICAgcjgscjkscjYscjgKLSAgICAgICAgc21sYWwgICAgcjcscjExLHI2LHI3Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMywjMHgzMDBdCi0gICAgICAgIGxkciAgICAgIHI4LFtyMSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjYsW3IxMiwjMHg0ODBdCi0gICAgICAgIHNtbGFsICAgIHI3LHI5LHI4LHI1Ci0gICAgICAgIHNtbGFsICAgIHI3LHIxMSxyOCxyNgotICAgICAgICBsZHIgICAgICByOCxbcjEsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEyLCMweDM4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHI4LHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHI4LHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgzOF0KLQotCi0gICAgICAgIGxkciAgICAgIHIzLFtyMywjMHg0MDBdCi0gICAgICAgIHN1YiAgICAgIHI5LHI5LHI1Ci0gICAgICAgIHNtbGFsICAgIHI3LHI5LHI2LHIxMgotICAgICAgICBzbXVsbCAgICByOCxyNyxyNixyMwotICAgICAgICBjbXAgICAgICByNCwjMHgyMTAKLSAgICAgICAgc3ViICAgICAgcjExLHIxMSxyNwotCi0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgzY10KLSAgICAgICAgYWRkICAgICAgcjEscjEsIzB4NDAKLSAgICAgICAgc21sYWwgICAgcjMscjkscjIscjMKLSAgICAgICAgc21sYWwgICAgcjEyLHIxMSxyMixyMTIKLQotICAgICAgICBibHQgICAgICBMb29wX2kKLQotICAgICAgICBtb3YgICAgICByMyxyOSwgYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHI0LHIzLCBhc3IgIzE1Ci0gICAgICAgIHRlcSAgICAgIHI0LHIzLCBhc3IgIzMxCi0gICAgICAgIGxkciAgICAgIHIxMixMT1dfMTZCSVRTCi0gICAgICAgIGxkciAgICAgIHIyLFtzcF0KLSAgICAgICAgZW9ybmUgICAgcjMscjEyLHIzLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjQsW3NwLCM4XQotICAgICAgICBtb3YgICAgICByMixyMTAsbHNsIHIyCi0gICAgICAgIGFkZCAgICAgIHI0LHI0LHIyLGxzbCAjMQotICAgICAgICBzdHJoICAgICByMyxbcjRdCi0KLSAgICAgICAgbW92ICAgICAgcjMscjExLGFzciAjNgotICAgICAgICBtb3YgICAgICByNCxyMyxhc3IgIzE1Ci0gICAgICAgIHRlcSAgICAgIHI0LHIzLGFzciAjMzEKLSAgICAgICAgZW9ybmUgICAgcjMscjEyLHIzLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjEyLFtzcCwjMHhjXQotICAgICAgICBsZHIgICAgICByMTEsW3NwLCM4XQotICAgICAgICByc2IgICAgICByMixyMixyMTIsbHNsICM1Ci0gICAgICAgIGFkZCAgICAgIHIyLHIxMSxyMixsc2wgIzEKLSAgICAgICAgc3RyaCAgICAgcjMsW3IyXQotCi0gICAgICAgIGFkZCAgICAgIHIxMCxyMTAsIzEKLSAgICAgICAgY21wICAgICAgcjEwLCMweDEwCi0gICAgICAgIGJsdCAgICAgIExvb3BfagotCi07IEFjY3VtdWxhdG9ycyByNCwgcjUgSW5pdGlhbGl6YXRpb24KLQotICAgICAgICBtb3YgICAgICByNCwjMHgyMAotICAgICAgICBtb3YgICAgICByNSwjMHgyMAotICAgICAgICBtb3YgICAgICByMywjMHgxMAotUG9seVBoX2ZpbHRlcl9sb29wMgotICAgICAgICBhZGQgICAgICByMixyMCxyMyxsc2wgIzIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMl0KLSAgICAgICAgbGRyICAgICAgcjgsW3IxXQotICAgICAgICBsZHIgICAgICByNixbcjIsIzB4ODBdCi0gICAgICAgIHNtbGFsICAgIHIxMixyNCxyOCxyMTIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMSwjNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IyLCMweDQwXQotICAgICAgICBzbWxhbCAgICByNixyNCxyMTIscjYKLQotICAgICAgICBsZHIgICAgICByMTIsW3IxLCM4XQotICAgICAgICBsZHIgICAgICByNixbcjIsIzB4MTgwXQotICAgICAgICBzbWxhbCAgICByNyxyNSxyMTIscjcKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMiwjMHgxMDBdCi0gICAgICAgIGxkciAgICAgIHI3LFtyMSwjMHhjXQotICAgICAgICBsZHIgICAgICByMixbcjIsIzB4MTQwXQotICAgICAgICBzbWxhbCAgICByMTIscjQscjcscjEyCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEsIzB4MTBdCi0gICAgICAgIGFkZCAgICAgIHIzLHIzLCMweDgwCi0gICAgICAgIHNtbGFsICAgIHI2LHI0LHIxMixyNgotICAgICAgICBsZHIgICAgICByNixbcjEsIzB4MTRdCi0gICAgICAgIGNtcCAgICAgIHIzLCMweDIxMAotICAgICAgICBzbWxhbCAgICByMixyNSxyNixyMgotICAgICAgICBhZGQgICAgICByMSxyMSwjMHgxOAotCi0gICAgICAgIGJsdCAgICAgIFBvbHlQaF9maWx0ZXJfbG9vcDIKLSAgICAgICAgbW92ICAgICAgcjAscjQsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHIyLHIwLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjIscjAsYXNyICMzMQotICAgICAgICBsZHJuZSAgICByMTIsTE9XXzE2QklUUwotICAgICAgICBsZHIgICAgICByMSxbc3AsIzhdCi0gICAgICAgIGVvcm5lICAgIHIwLHIxMixyMCxhc3IgIzMxCi0gICAgICAgIHN0cmggICAgIHIwLFtyMSwjMF0KLSAgICAgICAgbW92ICAgICAgcjAscjUsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHIyLHIwLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjIscjAsYXNyICMzMQotICAgICAgICBsZHJuZSAgICByMTIsTE9XXzE2QklUUwotICAgICAgICBsZHIgICAgICByMixbc3BdCi0gICAgICAgIG1vdiAgICAgIHIxLCMweDEwCi0gICAgICAgIGVvcm5lICAgIHIwLHIxMixyMCxhc3IgIzMxCi0gICAgICAgIGxkciAgICAgIHIxMixbc3AsIzhdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCByMgotICAgICAgICBhZGQgICAgICByMSxyMTIscjEsbHNsICMxCi0gICAgICAgIHN0cmggICAgIHIwLFtyMV0KLSAgICAgICAgYWRkICAgICAgc3Asc3AsIzB4MTAKLSAgICAgICAgbGRtZmQgICAgc3AhLHtyNC1yMTEscGN9Ci0KLQotUG9seVBoX2ZpbHRlcl9jb2VmZgotICAgICAgICBEQ0QgICAgICBwcW1mU3ludGhXaW4KLUxPV18xNkJJVFMKLSAgICAgICAgRENEICAgICAgMHgwMDAwN2ZmZgotCi0gICAgICAgIEVORFAKLQotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zCmluZGV4IGI3NGM4NDkuLjExNDBlZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd19nY2MucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfZ2NjLnMKQEAgLTM1LDYgKzM1LDcgQEAKIC50ZXh0CiAKIC5leHRlcm4gcHFtZlN5bnRoV2luCisuaGlkZGVuIHBxbWZTeW50aFdpbgogCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X3dtLmFzbSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd193bS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NTcyNjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X3dtLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi07IGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi07IGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07Ci07Ci07ICAgRmlsZW5hbWU6IHB2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LnMKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUkVWSVNJT04gSElTVE9SWQotOwotOwotOyBXaG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlOiBNTS9ERC9ZWVlZCi07IERlc2NyaXB0aW9uOiAKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCUNPREUzMgotCi0JQVJFQQl8LmRyZWN0dmV8LCBEUkVDVFZFCi0KLQlFWFBPUlQJfHB2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93fAotCUlNUE9SVAl8cHFtZlN5bnRoV2lufAotCi0JQVJFQQl8LnBkYXRhfCwgUERBVEEKLQotCUFSRUEJfC50ZXh0fCwgQ09ERSwgQVJNCi0KLXxwdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd3wgUFJPQwotICAgICAgICBzdG1mZCAgICBzcCEse3IwLXIyLHI0LXIxMSxscn0KLQotICAgICAgICBzdWIgICAgICBzcCxzcCwjNAotICAgICAgICBsZHIgICAgICByMixbc3AsIzB4Y10KLSAgICAgICAgbGRyICAgICAgcjEsUG9seVBoX2ZpbHRlcl9jb2VmZgotCQkKLSAgICAgICAgc3ViICAgICAgcjIscjIsIzEKLSAgICAgICAgbW92ICAgICAgcjEwLCMxCi0gICAgICAgIHN0ciAgICAgIHIyLFtzcF0KLQotOyBBY2N1bXVsYXRvcnMgcjksIHIxMTo6PiBJbml0aWFsaXphdGlvbgotCi1Mb29wX2oKLSAgICAgICAgbW92ICAgICAgcjksICAjMHgyMAotICAgICAgICBtb3YgICAgICByMTEsICMweDIwCi0gICAgICAgIG1vdiAgICAgIHI0LCAgIzB4MTAKLUxvb3BfaQotICAgICAgICBhZGQgICAgICByMixyNCxyMTAKLSAgICAgICAgYWRkICAgICAgcjMscjAscjIsbHNsICMyCi0gICAgICAgIHN1YiAgICAgIHIyLHI0LHIxMAotICAgICAgICBsZHIgICAgICByNSxbcjNdCi0gICAgICAgIGxkciAgICAgIGxyLFtyMV0KLSAgICAgICAgYWRkICAgICAgcjEyLHIwLHIyLGxzbCAjMgotICAgICAgICBsZHIgICAgICByNixbcjEyLCMweDc4MF0KLSAgICAgICAgc21sYWwgICAgcjIscjksbHIscjUKLSAgICAgICAgc21sYWwgICAgcjIscjExLGxyLHI2Ci0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IxMiwjMHg4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIHN1YiAgICAgIHI5LHI5LHI1Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMSwjOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDcwMF0KLSAgICAgICAgYWRkICAgICAgcjQscjQsIzB4MjAwCi0gICAgICAgIHNtbGFsICAgIHI2LHI5LHI1LHI3Ci0gICAgICAgIHNtdWxsICAgIHI2LHIyLHI1LHI4Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMSwjMHhjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHIyCi0gICAgICAgIHNtbGFsICAgIHI4LHI5LHI1LHI4Ci0gICAgICAgIHNtbGFsICAgIHI3LHIxMSxyNSxyNwotICAgICAgICBsZHIgICAgICByNSxbcjMsIzB4MTAwXQotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MTBdCi0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NjgwXQotICAgICAgICBzbWxhbCAgICBscixyOSxyMixyNQotICAgICAgICBzbWxhbCAgICBscixyMTEscjIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDE0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDE4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDYwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjUscjkscjYscjcKLSAgICAgICAgc211bGwgICAgcjIscjUscjYscjgKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDFjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHI1Ci0gICAgICAgIHNtbGFsICAgIHI4LHI5LHI2LHI4Ci0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjUsW3IzLCMweDIwMF0KLSAgICAgICAgc21sYWwgICAgcjcscjExLHI2LHI3Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NTgwXQotICAgICAgICBzbWxhbCAgICBscixyOSxyMixyNQotICAgICAgICBzbWxhbCAgICBscixyMTEscjIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDI0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDI4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDUwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjUscjkscjYscjcKLSAgICAgICAgc211bGwgICAgcjIscjUscjYscjgKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDJjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHI1Ci0KLSAgICAgICAgc21sYWwgICAgcjgscjkscjYscjgKLSAgICAgICAgc21sYWwgICAgcjcscjExLHI2LHI3Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMywjMHgzMDBdCi0gICAgICAgIGxkciAgICAgIHI4LFtyMSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjYsW3IxMiwjMHg0ODBdCi0gICAgICAgIHNtbGFsICAgIHI3LHI5LHI4LHI1Ci0gICAgICAgIHNtbGFsICAgIHI3LHIxMSxyOCxyNgotICAgICAgICBsZHIgICAgICByOCxbcjEsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEyLCMweDM4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHI4LHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHI4LHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgzOF0KLQotCi0gICAgICAgIGxkciAgICAgIHIzLFtyMywjMHg0MDBdCi0gICAgICAgIHN1YiAgICAgIHI5LHI5LHI1Ci0gICAgICAgIHNtbGFsICAgIHI3LHI5LHI2LHIxMgotICAgICAgICBzbXVsbCAgICByOCxyNyxyNixyMwotICAgICAgICBjbXAgICAgICByNCwjMHgyMTAKLSAgICAgICAgc3ViICAgICAgcjExLHIxMSxyNwotCi0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgzY10KLSAgICAgICAgYWRkICAgICAgcjEscjEsIzB4NDAKLSAgICAgICAgc21sYWwgICAgcjMscjkscjIscjMKLSAgICAgICAgc21sYWwgICAgcjEyLHIxMSxyMixyMTIKLQotICAgICAgICBibHQgICAgICBMb29wX2kKLQotICAgICAgICBtb3YgICAgICByMyxyOSwgYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHI0LHIzLCBhc3IgIzE1Ci0gICAgICAgIHRlcSAgICAgIHI0LHIzLCBhc3IgIzMxCi0gICAgICAgIGxkciAgICAgIHIxMixMT1dfMTZCSVRTCi0gICAgICAgIGxkciAgICAgIHIyLFtzcF0KLSAgICAgICAgZW9ybmUgICAgcjMscjEyLHIzLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjQsW3NwLCM4XQotICAgICAgICBtb3YgICAgICByMixyMTAsbHNsIHIyCi0gICAgICAgIGFkZCAgICAgIHI0LHI0LHIyLGxzbCAjMQotICAgICAgICBzdHJoICAgICByMyxbcjRdCi0KLSAgICAgICAgbW92ICAgICAgcjMscjExLGFzciAjNgotICAgICAgICBtb3YgICAgICByNCxyMyxhc3IgIzE1Ci0gICAgICAgIHRlcSAgICAgIHI0LHIzLGFzciAjMzEKLSAgICAgICAgZW9ybmUgICAgcjMscjEyLHIzLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjEyLFtzcCwjMHhjXQotICAgICAgICBsZHIgICAgICByMTEsW3NwLCM4XQotICAgICAgICByc2IgICAgICByMixyMixyMTIsbHNsICM1Ci0gICAgICAgIGFkZCAgICAgIHIyLHIxMSxyMixsc2wgIzEKLSAgICAgICAgc3RyaCAgICAgcjMsW3IyXQotCi0gICAgICAgIGFkZCAgICAgIHIxMCxyMTAsIzEKLSAgICAgICAgY21wICAgICAgcjEwLCMweDEwCi0gICAgICAgIGJsdCAgICAgIExvb3BfagotCi07IEFjY3VtdWxhdG9ycyByNCwgcjUgSW5pdGlhbGl6YXRpb24KLQotICAgICAgICBtb3YgICAgICByNCwjMHgyMAotICAgICAgICBtb3YgICAgICByNSwjMHgyMAotICAgICAgICBtb3YgICAgICByMywjMHgxMAotUG9seVBoX2ZpbHRlcl9sb29wMgotICAgICAgICBhZGQgICAgICByMixyMCxyMyxsc2wgIzIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMl0KLSAgICAgICAgbGRyICAgICAgcjgsW3IxXQotICAgICAgICBsZHIgICAgICByNixbcjIsIzB4ODBdCi0gICAgICAgIHNtbGFsICAgIHIxMixyNCxyOCxyMTIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMSwjNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IyLCMweDQwXQotICAgICAgICBzbWxhbCAgICByNixyNCxyMTIscjYKLQotICAgICAgICBsZHIgICAgICByMTIsW3IxLCM4XQotICAgICAgICBsZHIgICAgICByNixbcjIsIzB4MTgwXQotICAgICAgICBzbWxhbCAgICByNyxyNSxyMTIscjcKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMiwjMHgxMDBdCi0gICAgICAgIGxkciAgICAgIHI3LFtyMSwjMHhjXQotICAgICAgICBsZHIgICAgICByMixbcjIsIzB4MTQwXQotICAgICAgICBzbWxhbCAgICByMTIscjQscjcscjEyCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEsIzB4MTBdCi0gICAgICAgIGFkZCAgICAgIHIzLHIzLCMweDgwCi0gICAgICAgIHNtbGFsICAgIHI2LHI0LHIxMixyNgotICAgICAgICBsZHIgICAgICByNixbcjEsIzB4MTRdCi0gICAgICAgIGNtcCAgICAgIHIzLCMweDIxMAotICAgICAgICBzbWxhbCAgICByMixyNSxyNixyMgotICAgICAgICBhZGQgICAgICByMSxyMSwjMHgxOAotCi0gICAgICAgIGJsdCAgICAgIFBvbHlQaF9maWx0ZXJfbG9vcDIKLSAgICAgICAgbW92ICAgICAgcjAscjQsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHIyLHIwLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjIscjAsYXNyICMzMQotICAgICAgICBsZHJuZSAgICByMTIsTE9XXzE2QklUUwotICAgICAgICBsZHIgICAgICByMSxbc3AsIzhdCi0gICAgICAgIGVvcm5lICAgIHIwLHIxMixyMCxhc3IgIzMxCi0gICAgICAgIHN0cmggICAgIHIwLFtyMSwjMF0KLSAgICAgICAgbW92ICAgICAgcjAscjUsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHIyLHIwLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjIscjAsYXNyICMzMQotICAgICAgICBsZHJuZSAgICByMTIsTE9XXzE2QklUUwotICAgICAgICBsZHIgICAgICByMixbc3BdCi0gICAgICAgIG1vdiAgICAgIHIxLCMweDEwCi0gICAgICAgIGVvcm5lICAgIHIwLHIxMixyMCxhc3IgIzMxCi0gICAgICAgIGxkciAgICAgIHIxMixbc3AsIzhdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCByMgotICAgICAgICBhZGQgICAgICByMSxyMTIscjEsbHNsICMxCi0gICAgICAgIHN0cmggICAgIHIwLFtyMV0KLSAgICAgICAgYWRkICAgICAgc3Asc3AsIzB4MTAKLSAgICAgICAgbGRtZmQgICAgc3AhLHtyNC1yMTEscGN9Ci0KLQotUG9seVBoX2ZpbHRlcl9jb2VmZgotICAgICAgICBEQ0QgICAgICBwcW1mU3ludGhXaW4KLUxPV18xNkJJVFMKLSAgICAgICAgRENEICAgICAgMHgwMDAwN2ZmZgotCQotCQlFTkRQICA7IHxwdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd3wKLQkJRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmNwcAppbmRleCBlZTQyZGM1Li40OTk2NzJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZGF0YS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuY3BwCkBAIC0xMzksNyArMTM5LDcgQEAKICAgICBpbnQxNiBibG9ja251bWJlciA9IDA7CiAKICAgICBncmFudWxlSW5mbyAqZ3JfaW5mbyA9ICYoc2ktPmNoW2NoXS5ncmFuW2dyXSk7Ci0gICAgdWludDMyIHNjYWxlZmFjX2NvbXAsIGludF9zY2FsZWZhY19jb21wLCBuZXdfc2xlbls0XTsKKyAgICB1aW50MzIgc2NhbGVmYWNfY29tcCwgaW50X3NjYWxlZmFjX2NvbXAsIG5ld19zbGVuWzRdID0geyAwLDAsMCwwIH07CiAKICAgICBzY2FsZWZhY19jb21wID0gIGdyX2luZm8tPnNjYWxlZmFjX2NvbXByZXNzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5tawppbmRleCA3ZjJjNDZkLi45M2ZmNjRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQubWsKQEAgLTIwLDQgKzIwLDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGRlYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcAppbmRleCAyYmFlMmFkLi4wOWU4Nzg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcApAQCAtMjMsOSArMjMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAKLSNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKLSNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCi0jaW5jbHVkZSAidnB4L3ZwOGR4LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDEsNyArMzgsOCBAQAogICAgICAgICAgICAgTlVMTCAvKiBwcm9maWxlTGV2ZWxzICovLCAwIC8qIG51bVByb2ZpbGVMZXZlbHMgKi8sCiAgICAgICAgICAgICAzMjAgLyogd2lkdGggKi8sIDI0MCAvKiBoZWlnaHQgKi8sIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKICAgICAgIG1Nb2RlKGNvZGluZ1R5cGUgPT0gT01YX1ZJREVPX0NvZGluZ1ZQOCA/IE1PREVfVlA4IDogTU9ERV9WUDkpLAotICAgICAgbUN0eChOVUxMKSB7CisgICAgICBtQ3R4KE5VTEwpLAorICAgICAgbUltZyhOVUxMKSB7CiAgICAgaW5pdFBvcnRzKGtOdW1CdWZmZXJzLCA3NjggKiAxMDI0IC8qIGlucHV0QnVmZmVyU2l6ZSAqLywKICAgICAgICAgICAgIGtOdW1CdWZmZXJzLAogICAgICAgICAgICAgY29kaW5nVHlwZSA9PSBPTVhfVklERU9fQ29kaW5nVlA4ID8gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4IDogTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KTsKQEAgLTg1LDcgKzgzLDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgU29mdFZQWDo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0VlBYOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTE4LDY4ICsxMTYsNDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKAotICAgICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwKLSAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4sCi0gICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIDApKSB7Ci0gICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4iKTsKKyAgICAgICAgaWYgKG1JbWcgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHZweF9jb2RlY19kZWNvZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAwKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gZGVjb2RlIGZyYW1lLiIpOwogCi0gICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZweF9jb2RlY19pdGVyX3QgaXRlciA9IE5VTEw7CisgICAgICAgICAgICBtSW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZSgodnB4X2NvZGVjX2N0eF90ICopbUN0eCwgJml0ZXIpOwogICAgICAgICB9CiAKLSAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gTlVMTDsKLSAgICAgICAgdnB4X2ltYWdlX3QgKmltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZpdGVyKTsKKyAgICAgICAgaWYgKG1JbWcgIT0gTlVMTCkgeworICAgICAgICAgICAgQ0hFQ0tfRVEobUltZy0+Zm10LCBJTUdfRk1UX0k0MjApOwogCi0gICAgICAgIGlmIChpbWcgIT0gTlVMTCkgewotICAgICAgICAgICAgQ0hFQ0tfRVEoaW1nLT5mbXQsIElNR19GTVRfSTQyMCk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoID0gaW1nLT5kX3c7Ci0gICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBpbWctPmRfaDsKLQotICAgICAgICAgICAgaWYgKHdpZHRoICE9IG1XaWR0aCB8fCBoZWlnaHQgIT0gbUhlaWdodCkgewotICAgICAgICAgICAgICAgIG1XaWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7Ci0KLSAgICAgICAgICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCA9IG1JbWctPmRfdzsKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IG1JbWctPmRfaDsKKyAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCZwb3J0V2lsbFJlc2V0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSAvIDI7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAob3V0cHV0QnVmZmVyV2lkdGgoKSAqIG91dHB1dEJ1ZmZlckhlaWdodCgpICogMykgLyAyOwogICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBFT1NzZWVuID8gT01YX0JVRkZFUkZMQUdfRU9TIDogMDsKICAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwogCi0gICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNMaW5lID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tQTEFORV9ZXTsKICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2g7ICsraSkgewotICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyY0xpbmUsIGltZy0+ZF93KTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tQTEFORV9ZXTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tQTEFORV9VXTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tQTEFORV9WXTsKKyAgICAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbUltZy0+c3RyaWRlW1BMQU5FX1ldOworICAgICAgICAgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBtSW1nLT5zdHJpZGVbUExBTkVfVV07CisgICAgICAgICAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IG1JbWctPnN0cmlkZVtQTEFORV9WXTsKKyAgICAgICAgICAgIGNvcHlZVjEyRnJhbWVUb091dHB1dEJ1ZmZlcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUpOwogCi0gICAgICAgICAgICAgICAgc3JjTGluZSArPSBpbWctPnN0cmlkZVtQTEFORV9ZXTsKLSAgICAgICAgICAgICAgICBkc3QgKz0gaW1nLT5kX3c7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNyY0xpbmUgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1BMQU5FX1VdOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbWctPmRfaCAvIDI7ICsraSkgewotICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyY0xpbmUsIGltZy0+ZF93IC8gMik7Ci0KLSAgICAgICAgICAgICAgICBzcmNMaW5lICs9IGltZy0+c3RyaWRlW1BMQU5FX1VdOwotICAgICAgICAgICAgICAgIGRzdCArPSBpbWctPmRfdyAvIDI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNyY0xpbmUgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1BMQU5FX1ZdOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbWctPmRfaCAvIDI7ICsraSkgewotICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyY0xpbmUsIGltZy0+ZF93IC8gMik7Ci0KLSAgICAgICAgICAgICAgICBzcmNMaW5lICs9IGltZy0+c3RyaWRlW1BMQU5FX1ZdOwotICAgICAgICAgICAgICAgIGRzdCArPSBpbWctPmRfdyAvIDI7Ci0gICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIG1JbWcgPSBOVUxMOwogICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAppbmRleCBjZDVlYjI4Li44ZjY4NjkzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCkBAIC0yMCw2ICsyMCwxMCBAQAogCiAjaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgogCisjaW5jbHVkZSAidnB4L3ZweF9kZWNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgorI2luY2x1ZGUgInZweC92cDhkeC5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBTb2Z0VlBYIDogcHVibGljIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQgewpAQCAtNDcsNiArNTEsOCBAQAogCiAgICAgdm9pZCAqbUN0eDsKIAorICAgIHZweF9pbWFnZV90ICptSW1nOworCiAgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRWUFgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQubWsKaW5kZXggNDA2MGEwYS4uZTI2NTEwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLm1rCkBAIC0xMiwxMCArMTIsNiBAQAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCi1pZmVxICgkKFRBUkdFVF9ERVZJQ0UpLCBtYW50YSkKLSAgICBMT0NBTF9DRkxBR1MgKz0gLURTVVJGQUNFX0lTX0JHUjMyCi1lbmRpZgotCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlidnB4CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAppbmRleCA1MGViNmJmLi40M2Y5OWQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCkBAIC0zMSw3ICszMSw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotCiB0ZW1wbGF0ZTxjbGFzcyBUPgogc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKICAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOwpAQCAtNTUsMTA3ICs1NCwzNyBAQAogICAgIHJldHVybiBjcHVDb3JlQ291bnQ7CiB9CiAKLQotLy8gVGhpcyBjb2xvciBjb252ZXJzaW9uIHV0aWxpdHkgaXMgY29waWVkIGZyb20gU29mdE1QRUc0RW5jb2Rlci5jcHAKLWlubGluZSBzdGF0aWMgdm9pZCBDb252ZXJ0U2VtaVBsYW5hclRvUGxhbmFyKHVpbnQ4X3QgKmlueXV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0eXV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KSB7Ci0gICAgaW50MzJfdCBvdXRZc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotICAgIHVpbnQzMl90ICpvdXR5ID0gICh1aW50MzJfdCAqKSBvdXR5dXY7Ci0gICAgdWludDE2X3QgKm91dGNiID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSk7Ci0gICAgdWludDE2X3QgKm91dGNyID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSArIChvdXRZc2l6ZSA+PiAyKSk7Ci0KLSAgICAvKiBZIGNvcHlpbmcgKi8KLSAgICBtZW1jcHkob3V0eSwgaW55dXYsIG91dFlzaXplKTsKLQotICAgIC8qIFUgJiBWIGNvcHlpbmcgKi8KLSAgICB1aW50MzJfdCAqaW55dXZfNCA9ICh1aW50MzJfdCAqKSAoaW55dXYgKyBvdXRZc2l6ZSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBoZWlnaHQgPj4gMTsgaSA+IDA7IC0taSkgewotICAgICAgICBmb3IgKGludDMyX3QgaiA9IHdpZHRoID4+IDI7IGogPiAwOyAtLWopIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSAqaW55dXZfNCsrOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcFUgPSB0ZW1wICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBVID0gdGVtcFUgfCAoKHRlbXAgPj4gOCkgJiAweEZGMDApOwotCi0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wViA9ICh0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBWID0gdGVtcFYgfCAoKHRlbXAgPj4gMTYpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgLy8gRmxpcCBVIGFuZCBWCi0gICAgICAgICAgICAqb3V0Y2IrKyA9IHRlbXBWOwotICAgICAgICAgICAgKm91dGNyKysgPSB0ZW1wVTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgQ29udmVydFJHQjMyVG9QbGFuYXIoCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0WSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKLSAgICBDSEVDSygod2lkdGggJiAxKSA9PSAwKTsKLSAgICBDSEVDSygoaGVpZ2h0ICYgMSkgPT0gMCk7Ci0KLSAgICB1aW50OF90ICpkc3RVID0gZHN0WSArIHdpZHRoICogaGVpZ2h0OwotICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RVICsgKHdpZHRoIC8gMikgKiAoaGVpZ2h0IC8gMik7Ci0KLSAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0jaWZkZWYgU1VSRkFDRV9JU19CR1IzMgotICAgICAgICAgICAgdW5zaWduZWQgYmx1ZSA9IHNyY1s0ICogeF07Ci0gICAgICAgICAgICB1bnNpZ25lZCBncmVlbiA9IHNyY1s0ICogeCArIDFdOwotICAgICAgICAgICAgdW5zaWduZWQgcmVkPSBzcmNbNCAqIHggKyAyXTsKLSNlbHNlCi0gICAgICAgICAgICB1bnNpZ25lZCByZWQ9IHNyY1s0ICogeF07Ci0gICAgICAgICAgICB1bnNpZ25lZCBncmVlbiA9IHNyY1s0ICogeCArIDFdOwotICAgICAgICAgICAgdW5zaWduZWQgYmx1ZSA9IHNyY1s0ICogeCArIDJdOwotI2VuZGlmCi0KLSAgICAgICAgICAgIHVuc2lnbmVkIGx1bWEgPQotICAgICAgICAgICAgICAgICgocmVkICogNjYgKyBncmVlbiAqIDEyOSArIGJsdWUgKiAyNSkgPj4gOCkgKyAxNjsKLQotICAgICAgICAgICAgZHN0WVt4XSA9IGx1bWE7Ci0KLSAgICAgICAgICAgIGlmICgoeCAmIDEpID09IDAgJiYgKHkgJiAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgVSA9Ci0gICAgICAgICAgICAgICAgICAgICgoLXJlZCAqIDM4IC0gZ3JlZW4gKiA3NCArIGJsdWUgKiAxMTIpID4+IDgpICsgMTI4OwotCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgViA9Ci0gICAgICAgICAgICAgICAgICAgICgocmVkICogMTEyIC0gZ3JlZW4gKiA5NCAtIGJsdWUgKiAxOCkgPj4gOCkgKyAxMjg7Ci0KLSAgICAgICAgICAgICAgICBkc3RVW3ggLyAyXSA9IFU7Ci0gICAgICAgICAgICAgICAgZHN0Vlt4IC8gMl0gPSBWOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCh5ICYgMSkgPT0gMCkgewotICAgICAgICAgICAgZHN0VSArPSB3aWR0aCAvIDI7Ci0gICAgICAgICAgICBkc3RWICs9IHdpZHRoIC8gMjsKLSAgICAgICAgfQotCi0gICAgICAgIHNyYyArPSA0ICogd2lkdGg7Ci0gICAgICAgIGRzdFkgKz0gd2lkdGg7Ci0gICAgfQotfQotCiBTb2Z0VlBYRW5jb2Rlcjo6U29mdFZQWEVuY29kZXIoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQotICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgOiBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKICAgICAgIG1Db2RlY0NvbnRleHQoTlVMTCksCiAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uKE5VTEwpLAogICAgICAgbUNvZGVjSW50ZXJmYWNlKE5VTEwpLAogICAgICAgbVdpZHRoKDE3NiksCiAgICAgICBtSGVpZ2h0KDE0NCksCiAgICAgICBtQml0cmF0ZSgxOTIwMDApLCAgLy8gaW4gYnBzCisgICAgICBtRnJhbWVyYXRlKDMwIDw8IDE2KSwgLy8gaW4gUTE2IGZvcm1hdAogICAgICAgbUJpdHJhdGVVcGRhdGVkKGZhbHNlKSwKICAgICAgIG1CaXRyYXRlQ29udHJvbE1vZGUoVlBYX1ZCUiksICAvLyB2YXJpYWJsZSBiaXRyYXRlCi0gICAgICBtRnJhbWVEdXJhdGlvblVzKDMzMzMzKSwgIC8vIERlZmF1bHRzIHRvIDMwIGZwcwogICAgICAgbURDVFBhcnRpdGlvbnMoMCksCiAgICAgICBtRXJyb3JSZXNpbGllbmNlKE9NWF9GQUxTRSksCiAgICAgICBtQ29sb3JGb3JtYXQoT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciksCiAgICAgICBtTGV2ZWwoT01YX1ZJREVPX1ZQOExldmVsX1ZlcnNpb24wKSwKKyAgICAgIG1LZXlGcmFtZUludGVydmFsKDApLAorICAgICAgbU1pblF1YW50aXplcigwKSwKKyAgICAgIG1NYXhRdWFudGl6ZXIoMCksCisgICAgICBtVGVtcG9yYWxMYXllcnMoMCksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuVHlwZShPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGgoMCksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuSWR4KDApLAorICAgICAgbUxhc3RUaW1lc3RhbXAoMHg3RkZGRkZGRkZGRkZGRkZGTEwpLAogICAgICAgbUNvbnZlcnNpb25CdWZmZXIoTlVMTCksCiAgICAgICBtSW5wdXREYXRhSXNNZXRhKGZhbHNlKSwKLSAgICAgIG1HcmFsbG9jTW9kdWxlKE5VTEwpLAogICAgICAgbUtleUZyYW1lUmVxdWVzdGVkKGZhbHNlKSB7CisgICAgbWVtc2V0KG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLCAwLCBzaXplb2YobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8pKTsKKyAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1swXSA9IDEwMDsKICAgICBpbml0UG9ydHMoKTsKIH0KIApAQCAtMTg0LDkgKzExMyw4IEBACiAgICAgaW5wdXRQb3J0LmZvcm1hdC52aWRlby5uU3RyaWRlID0gaW5wdXRQb3J0LmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKICAgICBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGlucHV0UG9ydC5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwogICAgIGlucHV0UG9ydC5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSAwOwotICAgIC8vIGZyYW1lUmF0ZSBpcyByZWNpcHJvY2FsIG9mIGZyYW1lRHVyYXRpb24sIHdoaWNoIGlzCi0gICAgLy8gaW4gbWljcm9zZWNvbmRzLiBJdCBpcyBhbHNvIGluIFExNiBmb3JtYXQuCi0gICAgaW5wdXRQb3J0LmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gKDEwMDAwMDAvbUZyYW1lRHVyYXRpb25VcykgPDwgMTY7CisgICAgLy8gZnJhbWVSYXRlIGlzIGluIFExNiBmb3JtYXQuCisgICAgaW5wdXRQb3J0LmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gbUZyYW1lcmF0ZTsKICAgICBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKICAgICBpbnB1dFBvcnQublBvcnRJbmRleCA9IGtJbnB1dFBvcnRJbmRleDsKICAgICBpbnB1dFBvcnQuZURpciA9IE9NWF9EaXJJbnB1dDsKQEAgLTIyNCw3ICsxNTIsNyBAQAogICAgIG91dHB1dFBvcnQuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdWUDg7CiAgICAgb3V0cHV0UG9ydC5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKICAgICBvdXRwdXRQb3J0LmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKLSAgICBvdXRwdXRQb3J0Lm5CdWZmZXJTaXplID0gMjU2ICogMTAyNDsgIC8vIGFyYml0cmFyeQorICAgIG91dHB1dFBvcnQubkJ1ZmZlclNpemUgPSAxMDI0ICogMTAyNDsgLy8gYXJiaXRyYXJ5CiAKICAgICBhZGRQb3J0KG91dHB1dFBvcnQpOwogfQpAQCAtMjQwLDcgKzE2OCw5IEBACiAgICAgaWYgKG1Db2RlY0ludGVyZmFjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KLQorICAgIEFMT0dEKCJWUDg6IGluaXRFbmNvZGVyLiBCUk1vZGU6ICV1LiBUU0xheWVyczogJXp1LiBLRjogJXUuIFFQOiAldSAtICV1IiwKKyAgICAgICAgICAodWludDMyX3QpbUJpdHJhdGVDb250cm9sTW9kZSwgbVRlbXBvcmFsTGF5ZXJzLCBtS2V5RnJhbWVJbnRlcnZhbCwKKyAgICAgICAgICBtTWluUXVhbnRpemVyLCBtTWF4UXVhbnRpemVyKTsKICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KG1Db2RlY0ludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgIC8vIENvZGVjIHNwZWNpZmljIGZsYWdzCkBAIC0yODEsOCArMjExLDEyMCBAQAogICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGltZWJhc2UubnVtID0gMTsKICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RpbWViYXNlLmRlbiA9IDEwMDAwMDA7CiAgICAgLy8gcmNfdGFyZ2V0X2JpdHJhdGUgaXMgaW4ga2JwcywgbUJpdHJhdGUgaW4gYnBzCi0gICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdGFyZ2V0X2JpdHJhdGUgPSBtQml0cmF0ZS8xMDAwOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlID0gKG1CaXRyYXRlICsgNTAwKSAvIDEwMDA7CiAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfZW5kX3VzYWdlID0gbUJpdHJhdGVDb250cm9sTW9kZTsKKyAgICAvLyBEaXNhYmxlIGZyYW1lIGRyb3AgLSBub3QgYWxsb3dlZCBpbiBNZWRpYUNvZGVjIG5vdy4KKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19kcm9wZnJhbWVfdGhyZXNoID0gMDsKKyAgICBpZiAobUJpdHJhdGVDb250cm9sTW9kZSA9PSBWUFhfQ0JSKSB7CisgICAgICAgIC8vIERpc2FibGUgc3BhdGlhbCByZXNpemluZy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfcmVzaXplX2FsbG93ZWQgPSAwOworICAgICAgICAvLyBTaW5nbGUtcGFzcyBtb2RlLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Bhc3MgPSBWUFhfUkNfT05FX1BBU1M7CisgICAgICAgIC8vIE1heGltdW0gYW1vdW50IG9mIGJpdHMgdGhhdCBjYW4gYmUgc3VidHJhY3RlZCBmcm9tIHRoZSB0YXJnZXQKKyAgICAgICAgLy8gYml0cmF0ZSAtIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlIG9mIHRoZSB0YXJnZXQgYml0cmF0ZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdW5kZXJzaG9vdF9wY3QgPSAxMDA7CisgICAgICAgIC8vIE1heGltdW0gYW1vdW50IG9mIGJpdHMgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHRhcmdldAorICAgICAgICAvLyBiaXRyYXRlIC0gZXhwcmVzc2VkIGFzIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBiaXRyYXRlLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19vdmVyc2hvb3RfcGN0ID0gMTU7CisgICAgICAgIC8vIEluaXRpYWwgdmFsdWUgb2YgdGhlIGJ1ZmZlciBsZXZlbCBpbiBtcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX2luaXRpYWxfc3ogPSA1MDA7CisgICAgICAgIC8vIEFtb3VudCBvZiBkYXRhIHRoYXQgdGhlIGVuY29kZXIgc2hvdWxkIHRyeSB0byBtYWludGFpbiBpbiBtcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX29wdGltYWxfc3ogPSA2MDA7CisgICAgICAgIC8vIFRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSBidWZmZXJlZCBieSB0aGUgZGVjb2RpbmcKKyAgICAgICAgLy8gYXBwbGljYXRpb24gaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9zeiA9IDEwMDA7CisgICAgICAgIC8vIEVuYWJsZSBlcnJvciByZXNpbGllbmNlIC0gbmVlZGVkIGZvciBwYWNrZXQgbG9zcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19lcnJvcl9yZXNpbGllbnQgPSAxOworICAgICAgICAvLyBEaXNhYmxlIGxhZ2dlZCBlbmNvZGluZy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19sYWdfaW5fZnJhbWVzID0gMDsKKyAgICAgICAgLy8gTWF4aW11bSBrZXkgZnJhbWUgaW50ZXJ2YWwgLSBmb3IgQ0JSIGJvb3N0IHRvIDMwMDAKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWF4X2Rpc3QgPSAzMDAwOworICAgICAgICAvLyBFbmNvZGVyIGRldGVybWluZXMgb3B0aW1hbCBrZXkgZnJhbWUgcGxhY2VtZW50IGF1dG9tYXRpY2FsbHkuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21vZGUgPSBWUFhfS0ZfQVVUTzsKKyAgICB9CisKKyAgICAvLyBGcmFtZXMgdGVtcG9yYWwgcGF0dGVybiAtIGZvciBub3cgV2ViUlRDIGxpa2UgcGF0dGVybiBpcyBvbmx5IHN1cHBvcnRlZC4KKyAgICBzd2l0Y2ggKG1UZW1wb3JhbExheWVycykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAxOgorICAgICAgICB7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDI6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnMgPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcGVyaW9kaWNpdHkgPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMF0gPSAwOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMV0gPSAxOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblswXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzFdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzJdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bM10gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzRdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNV0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzZdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bN10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDM6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnMgPSAzOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSA0OworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMl0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcGVyaW9kaWNpdHkgPSA0OworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMF0gPSAwOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMV0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMl0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbM10gPSAyOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblswXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzFdID0ga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsyXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblszXSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzRdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNV0gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls2XSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bN10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HRSgiV3JvbmcgbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyAlenUiLCBtVGVtcG9yYWxMYXllcnMpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQgYml0cmF0ZSB2YWx1ZXMgZm9yIGVhY2ggbGF5ZXIKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnM7IGkrKykgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c190YXJnZXRfYml0cmF0ZVtpXSA9CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSAqCisgICAgICAgICAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpXSAvIDEwMDsKKyAgICB9CisgICAgaWYgKG1LZXlGcmFtZUludGVydmFsID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tYXhfZGlzdCA9IG1LZXlGcmFtZUludGVydmFsOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9taW5fZGlzdCA9IG1LZXlGcmFtZUludGVydmFsOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tb2RlID0gVlBYX0tGX0FVVE87CisgICAgfQorICAgIGlmIChtTWluUXVhbnRpemVyID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19taW5fcXVhbnRpemVyID0gbU1pblF1YW50aXplcjsKKyAgICB9CisgICAgaWYgKG1NYXhRdWFudGl6ZXIgPiAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX21heF9xdWFudGl6ZXIgPSBtTWF4UXVhbnRpemVyOworICAgIH0KIAogICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19lbmNfaW5pdChtQ29kZWNDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNJbnRlcmZhY2UsCkBAIC0zMDIsMTcgKzM0NCw0NCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyIHx8IG1JbnB1dERhdGFJc01ldGEpIHsKKyAgICAvLyBFeHRyYSBDQlIgc2V0dGluZ3MKKyAgICBpZiAobUJpdHJhdGVDb250cm9sTW9kZSA9PSBWUFhfQ0JSKSB7CisgICAgICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX1NUQVRJQ19USFJFU0hPTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICBpZiAoY29kZWNfcmV0dXJuID09IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgdWludDMyX3QgcmNfbWF4X2ludHJhX3RhcmdldCA9CisgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX29wdGltYWxfc3ogKiAobUZyYW1lcmF0ZSA+PiAxNykgLyAxMDsKKyAgICAgICAgICAgIC8vIERvbid0IGdvIGJlbG93IDMgdGltZXMgcGVyIGZyYW1lIGJhbmR3aWR0aC4KKyAgICAgICAgICAgIGlmIChyY19tYXhfaW50cmFfdGFyZ2V0IDwgMzAwKSB7CisgICAgICAgICAgICAgICAgcmNfbWF4X2ludHJhX3RhcmdldCA9IDMwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY19tYXhfaW50cmFfdGFyZ2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNfcmV0dXJuID09IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX0NQVVVTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIGNiciBwYXJhbWV0ZXJzIGZvciB2cHggZW5jb2Rlci4iKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1Db2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIHx8IG1JbnB1dERhdGFJc01ldGEpIHsKKyAgICAgICAgZnJlZShtQ29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gTlVMTDsKKyAgICAgICAgaWYgKCgodWludDY0X3QpbVdpZHRoICogbUhlaWdodCkgPiAoKHVpbnQ2NF90KUlOVDMyX01BWCAvIDMpKSB7CisgICAgICAgICAgICBBTE9HRSgiYi8yNTgxMjc5NCwgQnVmZmVyIHNpemUgaXMgdG9vIGJpZy4iKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MobVdpZHRoICogbUhlaWdodCAqIDMgLyAyKTsKICAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmICgoKHVpbnQ2NF90KW1XaWR0aCAqIG1IZWlnaHQpID4gKCh1aW50NjRfdClJTlQzMl9NQVggLyAzKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI1ODEyNzk0LCBCdWZmZXIgc2l6ZSBpcyB0b28gYmlnLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDIpOwotICAgICAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGluZyBjb252ZXJzaW9uIGJ1ZmZlciBmYWlsZWQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGluZyBjb252ZXJzaW9uIGJ1ZmZlciBmYWlsZWQuIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gT0s7CkBAIC0zMzIsNyArNDAxLDcgQEAKICAgICB9CiAKICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbUNvbnZlcnNpb25CdWZmZXI7CisgICAgICAgIGZyZWUobUNvbnZlcnNpb25CdWZmZXIpOwogICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciA9IE5VTEw7CiAgICAgfQogCkBAIC0zNjksOSArNDM4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7Ci0gICAgICAgICAgICAgICAgLy8gQ29udmVydGluZyBmcm9tIG1pY3Jvc2Vjb25kcwotICAgICAgICAgICAgICAgIC8vIEFsc28gY29udmVydGluZyB0byBRMTYgZm9ybWF0Ci0gICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT54RnJhbWVyYXRlID0gKDEwMDAwMDAvbUZyYW1lRHVyYXRpb25VcykgPDwgMTY7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT54RnJhbWVyYXRlID0gbUZyYW1lcmF0ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IGtPdXRwdXRQb3J0SW5kZXgpIHsKICAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdWUDg7CkBAIC00MTksNiArNDg2LDI0IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlcjogeworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUgKnZwOEFuZHJvaWRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSAqKXBhcmFtOworCisgICAgICAgICAgICAgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPm5Qb3J0SW5kZXggIT0ga091dHB1dFBvcnRJbmRleCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2cDhBbmRyb2lkUGFyYW1zLT5uS2V5RnJhbWVJbnRlcnZhbCA9IG1LZXlGcmFtZUludGVydmFsOworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPmVUZW1wb3JhbFBhdHRlcm4gPSBtVGVtcG9yYWxQYXR0ZXJuVHlwZTsKKyAgICAgICAgICAgICAgICB2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckNvdW50ID0gbVRlbXBvcmFsTGF5ZXJzOworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5NaW5RdWFudGl6ZXIgPSBtTWluUXVhbnRpemVyOworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5NYXhRdWFudGl6ZXIgPSBtTWF4UXVhbnRpemVyOworICAgICAgICAgICAgICAgIG1lbWNweSh2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIHNpemVvZihtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbykpOworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQ6IHsKICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICpwcm9maWxlQW5kTGV2ZWwgPQogICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqKXBhcmFtOwpAQCAtNTA1LDExICs1OTAsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFNldFZwOFBhcmFtcygKICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1ZJREVPX1BBUkFNX1ZQOFRZUEUgKilwYXJhbSk7CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQW5kcm9pZFZwOEVuY29kZXI6CisgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxTZXRBbmRyb2lkVnA4UGFyYW1zKAorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSAqKXBhcmFtKTsKKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50OgogICAgICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0UHJvZmlsZUxldmVsKAogICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqKXBhcmFtKTsKIAotICAgICAgICBjYXNlIE9NWF9JbmRleFZlbmRvclN0YXJ0VW51c2VkOgorICAgICAgICBjYXNlIGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXg6CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMKICAgICAgICAgICAgIGNvbnN0IFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNQYXJhbXMgKnN0b3JlUGFyYW0gPQpAQCAtNjE4LDYgKzcwNyw1MCBAQAogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogfQogCitPTVhfRVJST1JUWVBFIFNvZnRWUFhFbmNvZGVyOjppbnRlcm5hbFNldEFuZHJvaWRWcDhQYXJhbXMoCisgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFKiB2cDhBbmRyb2lkUGFyYW1zKSB7CisgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPm5Qb3J0SW5kZXggIT0ga091dHB1dFBvcnRJbmRleCkgeworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICB9CisgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPmVUZW1wb3JhbFBhdHRlcm4gIT0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuTm9uZSAmJgorICAgICAgICB2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuICE9IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybldlYlJUQykgeworICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgIH0KKyAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+blRlbXBvcmFsTGF5ZXJDb3VudCA+IE9NWF9WSURFT19BTkRST0lEX01BWFZQOFRFTVBPUkFMTEFZRVJTKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgfQorICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5uTWluUXVhbnRpemVyID4gdnA4QW5kcm9pZFBhcmFtcy0+bk1heFF1YW50aXplcikgeworICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgIH0KKworICAgIG1UZW1wb3JhbFBhdHRlcm5UeXBlID0gdnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybjsKKyAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiA9PSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEMpIHsKKyAgICAgICAgbVRlbXBvcmFsTGF5ZXJzID0gdnA4QW5kcm9pZFBhcmFtcy0+blRlbXBvcmFsTGF5ZXJDb3VudDsKKyAgICB9IGVsc2UgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPmVUZW1wb3JhbFBhdHRlcm4gPT0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuTm9uZSkgeworICAgICAgICBtVGVtcG9yYWxMYXllcnMgPSAwOworICAgIH0KKyAgICAvLyBDaGVjayB0aGUgYml0cmF0ZSBkaXN0cmlidXRpb24gYmV0d2VlbiBsYXllcnMgaXMgaW4gaW5jcmVhc2luZyBvcmRlcgorICAgIGlmIChtVGVtcG9yYWxMYXllcnMgPiAxKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRlbXBvcmFsTGF5ZXJzIC0gMTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+blRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baSArIDFdIDw9CisgICAgICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvW2ldKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIldyb25nIGJpdHJhdGUgcmF0aW8gLSBzaG91bGQgYmUgaW4gaW5jcmVhc2luZyBvcmRlci4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1LZXlGcmFtZUludGVydmFsID0gdnA4QW5kcm9pZFBhcmFtcy0+bktleUZyYW1lSW50ZXJ2YWw7CisgICAgbU1pblF1YW50aXplciA9IHZwOEFuZHJvaWRQYXJhbXMtPm5NaW5RdWFudGl6ZXI7CisgICAgbU1heFF1YW50aXplciA9IHZwOEFuZHJvaWRQYXJhbXMtPm5NYXhRdWFudGl6ZXI7CisgICAgbWVtY3B5KG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLCB2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywKKyAgICAgICAgICAgIHNpemVvZihtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbykpOworICAgIEFMT0dEKCJWUDg6IGludGVybmFsU2V0QW5kcm9pZFZwOFBhcmFtcy4gQlJNb2RlOiAldS4gVFM6ICV6dS4gS0Y6ICV1LiIKKyAgICAgICAgICAiIFFQOiAldSAtICV1IEJSMDogJXUuIEJSMTogJXUuIEJSMjogJXUiLAorICAgICAgICAgICh1aW50MzJfdCltQml0cmF0ZUNvbnRyb2xNb2RlLCBtVGVtcG9yYWxMYXllcnMsIG1LZXlGcmFtZUludGVydmFsLAorICAgICAgICAgIG1NaW5RdWFudGl6ZXIsIG1NYXhRdWFudGl6ZXIsIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzBdLAorICAgICAgICAgIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzFdLCBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1syXSk7CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CiAKIE9NWF9FUlJPUlRZUEUgU29mdFZQWEVuY29kZXI6OmludGVybmFsU2V0Rm9ybWF0UGFyYW1zKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUqIGZvcm1hdCkgewpAQCAtNjY4LDkgKzgwMSw3IEBACiAgICAgICAgIG1IZWlnaHQgPSBwb3J0LT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwogCiAgICAgICAgIC8vIHhGcmFtZXJhdGUgY29tZXMgaW4gUTE2IGZvcm1hdCwgaW4gZnJhbWVzIHBlciBzZWNvbmQgdW5pdAotICAgICAgICBjb25zdCB1aW50MzJfdCBmcmFtZXJhdGUgPSBwb3J0LT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA+PiAxNjsKLSAgICAgICAgLy8gZnJhbWUgZHVyYXRpb24gaXMgaW4gbWljcm9zZWNvbmRzCi0gICAgICAgIG1GcmFtZUR1cmF0aW9uVXMgPSAoMTAwMDAwMC9mcmFtZXJhdGUpOworICAgICAgICBtRnJhbWVyYXRlID0gcG9ydC0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CiAKICAgICAgICAgaWYgKHBvcnQtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciB8fAogICAgICAgICAgICAgcG9ydC0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciB8fApAQCAtNjgzLDEyICs4MTQsMjIgQEAKICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbyhrSW5wdXRQb3J0SW5kZXgpLT5tRGVmOwogICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKLSAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IHBvcnQtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICBkZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gbUZyYW1lcmF0ZTsKICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gbUNvbG9yRm9ybWF0OworICAgICAgICBkZWYgPSAmZWRpdFBvcnRJbmZvKGtPdXRwdXRQb3J0SW5kZXgpLT5tRGVmOworICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKIAogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9IGVsc2UgaWYgKHBvcnQtPm5Qb3J0SW5kZXggPT0ga091dHB1dFBvcnRJbmRleCkgewogICAgICAgICBtQml0cmF0ZSA9IHBvcnQtPmZvcm1hdC52aWRlby5uQml0cmF0ZTsKKyAgICAgICAgbVdpZHRoID0gcG9ydC0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gcG9ydC0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKGtPdXRwdXRQb3J0SW5kZXgpLT5tRGVmOworICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSBtQml0cmF0ZTsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKQEAgLTcxNSw2ICs4NTYsNzQgQEAKICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKIH0KIAordnB4X2VuY19mcmFtZV9mbGFnc190IFNvZnRWUFhFbmNvZGVyOjpnZXRFbmNvZGVGbGFncygpIHsKKyAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZmxhZ3MgPSAwOworICAgIGludCBwYXR0ZXJuSWR4ID0gbVRlbXBvcmFsUGF0dGVybklkeCAlIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGg7CisgICAgbVRlbXBvcmFsUGF0dGVybklkeCsrOworICAgIHN3aXRjaCAobVRlbXBvcmFsUGF0dGVybltwYXR0ZXJuSWR4XSkgeworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3Q6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeToKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgbm8gYnJlYWsgaGVyZS4KKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW46CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlQWx0cmVmV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgbm8gYnJlYWsgaGVyZS4KKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVBbHRyZWY6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmQWx0cmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgbm8gYnJlYWsgaGVyZS4KKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9FTlRST1BZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfRU5UUk9QWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBmbGFnczsKK30KIAogdm9pZCBTb2Z0VlBYRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewogICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeQpAQCAtNzU0LDUxICs5NjMsMzMgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIHVpbnQ4X3QgKnNvdXJjZSA9CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZSA9CiAgICAgICAgICAgICBpbnB1dEJ1ZmZlckhlYWRlci0+cEJ1ZmZlciArIGlucHV0QnVmZmVySGVhZGVyLT5uT2Zmc2V0OwogCiAgICAgICAgIGlmIChtSW5wdXREYXRhSXNNZXRhKSB7Ci0gICAgICAgICAgICBDSEVDS19HRShpbnB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiwKLSAgICAgICAgICAgICAgICAgICAgIDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlclR5cGUgPSAqKHVpbnQzMl90ICopc291cmNlOwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnVmZmVyVHlwZSwga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpOwotCi0gICAgICAgICAgICBpZiAobUdyYWxsb2NNb2R1bGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKDAsIGh3X2dldF9tb2R1bGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19IQVJEV0FSRV9NT0RVTEVfSUQsICZtR3JhbGxvY01vZHVsZSkpOworICAgICAgICAgICAgc291cmNlID0gZXh0cmFjdEdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyLCBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDIsCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgaW5wdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4sCisgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGV4dHJhY3QgZ3JhbGxvYyBidWZmZXIgaW4gbWV0YWRhdGEgbW9kZSIpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnN0IGdyYWxsb2NfbW9kdWxlX3QgKmdybW9kdWxlID0KLSAgICAgICAgICAgICAgICAoY29uc3QgZ3JhbGxvY19tb2R1bGVfdCAqKW1HcmFsbG9jTW9kdWxlOwotCi0gICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgaGFuZGxlID0gKihidWZmZXJfaGFuZGxlX3QgKikoc291cmNlICsgNCk7Ci0KLSAgICAgICAgICAgIHZvaWQgKmJpdHM7Ci0gICAgICAgICAgICBDSEVDS19FUSgwLAotICAgICAgICAgICAgICAgICAgICAgZ3Jtb2R1bGUtPmxvY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3Jtb2R1bGUsIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTkVWRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgbVdpZHRoLCBtSGVpZ2h0LCAmYml0cykpOwotCi0gICAgICAgICAgICBDb252ZXJ0UkdCMzJUb1BsYW5hcigKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiliaXRzLCBtQ29udmVyc2lvbkJ1ZmZlciwgbVdpZHRoLCBtSGVpZ2h0KTsKLQotICAgICAgICAgICAgc291cmNlID0gbUNvbnZlcnNpb25CdWZmZXI7Ci0KLSAgICAgICAgICAgIENIRUNLX0VRKDAsIGdybW9kdWxlLT51bmxvY2soZ3Jtb2R1bGUsIGhhbmRsZSkpOwogICAgICAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgewotICAgICAgICAgICAgQ29udmVydFNlbWlQbGFuYXJUb1BsYW5hcigKKyAgICAgICAgICAgIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCiAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgbUNvbnZlcnNpb25CdWZmZXIsIG1XaWR0aCwgbUhlaWdodCk7CiAKICAgICAgICAgICAgIHNvdXJjZSA9IG1Db252ZXJzaW9uQnVmZmVyOwogICAgICAgICB9CiAgICAgICAgIHZweF9pbWFnZV90IHJhd19mcmFtZTsKICAgICAgICAgdnB4X2ltZ193cmFwKCZyYXdfZnJhbWUsIFZQWF9JTUdfRk1UX0k0MjAsIG1XaWR0aCwgbUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgIGtJbnB1dEJ1ZmZlckFsaWdubWVudCwgc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgIGtJbnB1dEJ1ZmZlckFsaWdubWVudCwgKHVpbnQ4X3QgKilzb3VyY2UpOwogCiAgICAgICAgIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBmbGFncyA9IDA7CisgICAgICAgIGlmIChtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZmxhZ3MgPSBnZXRFbmNvZGVGbGFncygpOworICAgICAgICB9CiAgICAgICAgIGlmIChtS2V5RnJhbWVSZXF1ZXN0ZWQpIHsKICAgICAgICAgICAgIGZsYWdzIHw9IFZQWF9FRkxBR19GT1JDRV9LRjsKICAgICAgICAgICAgIG1LZXlGcmFtZVJlcXVlc3RlZCA9IGZhbHNlOwpAQCAtODE5LDExICsxMDEwLDE4IEBACiAgICAgICAgICAgICBtQml0cmF0ZVVwZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgfQogCisgICAgICAgIHVpbnQzMl90IGZyYW1lRHVyYXRpb247CisgICAgICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCA+IG1MYXN0VGltZXN0YW1wKSB7CisgICAgICAgICAgICBmcmFtZUR1cmF0aW9uID0gKHVpbnQzMl90KShpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCAtIG1MYXN0VGltZXN0YW1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lRHVyYXRpb24gPSAodWludDMyX3QpKCgodWludDY0X3QpMTAwMDAwMCA8PCAxNikgLyBtRnJhbWVyYXRlKTsKKyAgICAgICAgfQorICAgICAgICBtTGFzdFRpbWVzdGFtcCA9IGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wOwogICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jb2RlKAogICAgICAgICAgICAgICAgIG1Db2RlY0NvbnRleHQsCiAgICAgICAgICAgICAgICAgJnJhd19mcmFtZSwKICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCwgIC8vIGluIHRpbWViYXNlIHVuaXRzCi0gICAgICAgICAgICAgICAgbUZyYW1lRHVyYXRpb25VcywgIC8vIGZyYW1lIGR1cmF0aW9uIGluIHRpbWViYXNlIHVuaXRzCisgICAgICAgICAgICAgICAgZnJhbWVEdXJhdGlvbiwgIC8vIGZyYW1lIGR1cmF0aW9uIGluIHRpbWViYXNlIHVuaXRzCiAgICAgICAgICAgICAgICAgZmxhZ3MsICAvLyBmcmFtZSBmbGFncwogICAgICAgICAgICAgICAgIFZQWF9ETF9SRUFMVElNRSk7ICAvLyBlbmNvZGluZyBkZWFkbGluZQogICAgICAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgewpAQCAtODYyLDE2ICsxMDYwLDYgQEAKICAgICB9CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdFZQWEVuY29kZXI6OmdldEV4dGVuc2lvbkluZGV4KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgewotICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIpKSB7Ci0gICAgICAgICppbmRleCA9IE9NWF9JbmRleFZlbmRvclN0YXJ0VW51c2VkOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgobmFtZSwgaW5kZXgpOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCmluZGV4IDA3NjgzMGYuLmY0YzE1NjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfVlBYX0VOQ09ERVJfSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlICJTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgiCiAKICNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KICNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KQEAgLTU5LDcgKzU5LDcgQEAKIC8vICAgIC0gT01YIHRpbWVzdGFtcHMgYXJlIGluIG1pY3Jvc2Vjb25kcywgdGhlcmVmb3JlCiAvLyBlbmNvZGVyIHRpbWViYXNlIGlzIGZpeGVkIHRvIDEvMTAwMDAwMAogCi1zdHJ1Y3QgU29mdFZQWEVuY29kZXIgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CitzdHJ1Y3QgU29mdFZQWEVuY29kZXIgOiBwdWJsaWMgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCB7CiAgICAgU29mdFZQWEVuY29kZXIoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLApAQCAtODcsMTAgKzg3LDQ0IEBACiAgICAgLy8gZW5jb2Rpbmcgb2YgdGhlIGZyYW1lCiAgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldEV4dGVuc2lvbkluZGV4KAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOwotCiBwcml2YXRlOgorICAgIGVudW0gVGVtcG9yYWxSZWZlcmVuY2VzIHsKKyAgICAgICAgLy8gRm9yIDEgbGF5ZXIgY2FzZTogcmVmZXJlbmNlIGFsbCAobGFzdCwgZ29sZGVuLCBhbmQgYWx0IHJlZiksIGJ1dCBvbmx5CisgICAgICAgIC8vIHVwZGF0ZSBsYXN0LgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsID0gMTIsCisgICAgICAgIC8vIEZpcnN0IGJhc2UgbGF5ZXIgZnJhbWUgZm9yIDMgdGVtcG9yYWwgbGF5ZXJzLCB3aGljaCB1cGRhdGVzIGxhc3QgYW5kCisgICAgICAgIC8vIGdvbGRlbiB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZiA9IDExLAorICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmID0gMTAsCisgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZiA9IDksCisgICAgICAgIC8vIEJhc2UgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWYgPSA4LAorICAgICAgICAvLyBIaWdoZXN0IGVuaGFjZW1lbnQgbGF5ZXIgd2l0aG91dCBkZXBlbmRlbmN5IG9uIGdvbGRlbiB3aXRoIGFsdCByZWYKKyAgICAgICAgLy8gZGVwZW5kZW5jeS4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmID0gNywKKyAgICAgICAgLy8gU2Vjb25kIGxheWVyIGFuZCBsYXN0IGZyYW1lIGluIGN5Y2xlLCBmb3IgMiBsYXllcnMuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZiA9IDYsCisgICAgICAgIC8vIEhpZ2hlc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmUgPSA1LAorICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZiA9IDQsCisgICAgICAgIC8vIFNlY29uZCBlbmhhbmNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gcHJldmlvdXMgZnJhbWVzIGluCisgICAgICAgIC8vIHRoZSBzZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZldpdGhvdXREZXBlbmRlbmN5ID0gMywKKyAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbiA9IDIsCisgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBwcmV2aW91cyBmcmFtZXMgaW4KKyAgICAgICAgLy8gdGhlIGZpcnN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeSA9IDEsCisgICAgICAgIC8vIEJhc2UgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3QgPSAwLAorICAgIH07CisgICAgZW51bSB7CisgICAgICAgIGtNYXhUZW1wb3JhbFBhdHRlcm4gPSA4CisgICAgfTsKKwogICAgIC8vIG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZCBwZXIgcG9ydAogICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTnVtQnVmZmVycyA9IDQ7CiAKQEAgLTEzMCwxNiArMTY0LDE1IEBACiAgICAgLy8gVGFyZ2V0IGJpdHJhdGUgc2V0IGZvciB0aGUgZW5jb2RlciwgaW4gYml0cyBwZXIgc2Vjb25kLgogICAgIHVpbnQzMl90IG1CaXRyYXRlOwogCisgICAgLy8gVGFyZ2V0IGZyYW1lcmF0ZSBzZXQgZm9yIHRoZSBlbmNvZGVyLgorICAgIHVpbnQzMl90IG1GcmFtZXJhdGU7CisKICAgICAvLyBJZiBhIHJlcXVlc3QgZm9yIGEgY2hhbmdlIGl0IGJpdHJhdGUgaGFzIGJlZW4gcmVjZWl2ZWQuCiAgICAgYm9vbCBtQml0cmF0ZVVwZGF0ZWQ7CiAKICAgICAvLyBCaXRyYXRlIGNvbnRyb2wgbW9kZSwgZWl0aGVyIGNvbnN0YW50IG9yIHZhcmlhYmxlCiAgICAgdnB4X3JjX21vZGUgbUJpdHJhdGVDb250cm9sTW9kZTsKIAotICAgIC8vIEZyYW1lIGR1cmF0aW9uIGlzIHRoZSByZWNpcHJvY2FsIG9mIGZyYW1lcmF0ZSwgZGVub3RlZAotICAgIC8vIGluIG1pY3Jvc2Vjb25kcwotICAgIHVpbnQ2NF90IG1GcmFtZUR1cmF0aW9uVXM7Ci0KICAgICAvLyB2cDggc3BlY2lmaWMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKICAgICAvLyB0aGF0IGVuYWJsZXMgdG9rZW4gcGFydGl0aW9uaW5nIG9mCiAgICAgLy8gdGhlIHN0cmVhbSBpbnRvIHN1YnN0cmVhbXMKQEAgLTE2MCw2ICsxOTMsMzYgQEAKICAgICAvLyBzb21ldGhpbmcgZWxzZS4KICAgICBPTVhfVklERU9fVlA4TEVWRUxUWVBFIG1MZXZlbDsKIAorICAgIC8vIEtleSBmcmFtZSBpbnRlcnZhbCBpbiBmcmFtZXMKKyAgICB1aW50MzJfdCBtS2V5RnJhbWVJbnRlcnZhbDsKKworICAgIC8vIE1pbmltdW0gKGJlc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgdWludDMyX3QgbU1pblF1YW50aXplcjsKKworICAgIC8vIE1heGltdW0gKHdvcnN0IHF1YWxpdHkpIHF1YW50aXplcgorICAgIHVpbnQzMl90IG1NYXhRdWFudGl6ZXI7CisKKyAgICAvLyBOdW1iZXIgb2YgY29kaW5nIHRlbXBvcmFsIGxheWVycyB0byBiZSB1c2VkLgorICAgIHNpemVfdCBtVGVtcG9yYWxMYXllcnM7CisKKyAgICAvLyBUZW1wb3JhbCBsYXllciBiaXRyYXJlIHJhdGlvIGluIHBlcmNlbnRhZ2UKKyAgICB1aW50MzJfdCBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tPTVhfVklERU9fQU5EUk9JRF9NQVhWUDhURU1QT1JBTExBWUVSU107CisKKyAgICAvLyBUZW1wb3JhbCBwYXR0ZXJuIHR5cGUKKyAgICBPTVhfVklERU9fQU5EUk9JRF9WUFhURU1QT1JBTExBWUVSUEFUVEVSTlRZUEUgbVRlbXBvcmFsUGF0dGVyblR5cGU7CisKKyAgICAvLyBUZW1wb3JhbCBwYXR0ZXJuIGxlbmd0aAorICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworCisgICAgLy8gVGVtcG9yYWwgcGF0dGVybiBjdXJyZW50IGluZGV4CisgICAgc2l6ZV90IG1UZW1wb3JhbFBhdHRlcm5JZHg7CisKKyAgICAvLyBGcmFtZSB0eXBlIHRlbXBvcmFsIHBhdHRlcm4KKyAgICBUZW1wb3JhbFJlZmVyZW5jZXMgbVRlbXBvcmFsUGF0dGVybltrTWF4VGVtcG9yYWxQYXR0ZXJuXTsKKworICAgIC8vIExhc3QgaW5wdXQgYnVmZmVyIHRpbWVzdGFtcAorICAgIE9NWF9USUNLUyBtTGFzdFRpbWVzdGFtcDsKKwogICAgIC8vIENvbnZlcnNpb24gYnVmZmVyIGlzIG5lZWRlZCB0byBjb252ZXJ0IHNlbWkKICAgICAvLyBwbGFuYXIgeXV2NDIwIHRvIHBsYW5hciBmb3JtYXQKICAgICAvLyBJdCBpcyBvbmx5IGFsbG9jYXRlZCBpZiBpbnB1dCBmb3JtYXQgaXMKQEAgLTE2Nyw3ICsyMzAsNiBAQAogICAgIHVpbnQ4X3QqIG1Db252ZXJzaW9uQnVmZmVyOwogCiAgICAgYm9vbCBtSW5wdXREYXRhSXNNZXRhOwotICAgIGNvbnN0IGh3X21vZHVsZV90ICptR3JhbGxvY01vZHVsZTsKIAogICAgIGJvb2wgbUtleUZyYW1lUmVxdWVzdGVkOwogCkBAIC0xODUsNiArMjQ3LDkgQEAKICAgICAvLyBkdG9yLgogICAgIHN0YXR1c190IHJlbGVhc2VFbmNvZGVyKCk7CiAKKyAgICAvLyBHZXQgY3VycmVudCBlbmNvZGUgZmxhZ3MKKyAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZ2V0RW5jb2RlRmxhZ3MoKTsKKwogICAgIC8vIEhhbmRsZXMgcG9ydCBjaGFuZ2VzIHdpdGggcmVzcGVjdCB0byBjb2xvciBmb3JtYXRzCiAgICAgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldEZvcm1hdFBhcmFtcygKICAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFKiBmb3JtYXQpOwpAQCAtMjA2LDYgKzI3MSwxMCBAQAogICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRWcDhQYXJhbXMoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9WUDhUWVBFKiB2cDhQYXJhbXMpOwogCisgICAgLy8gSGFuZGxlcyBBbmRyb2lkIHZwOCBzcGVjaWZpYyBwYXJhbWV0ZXJzLgorICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRBbmRyb2lkVnA4UGFyYW1zKAorICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSogdnA4QW5kcm9pZFBhcmFtcyk7CisKICAgICAvLyBVcGRhdGVzIGVuY29kZXIgcHJvZmlsZQogICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQcm9maWxlTGV2ZWwoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKiBwcm9maWxlQW5kTGV2ZWwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5tawppbmRleCA2NTViMmFiLi5iZjAzYWQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5tawpAQCAtODQsOCArODQsOCBAQAogCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUyBcCiAJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TIFwKIAotCi1pZmVxICgkKEFSQ0hfQVJNX0hBVkVfTkVPTiksdHJ1ZSkKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKKyAgaWZlcSAoJChBUkNIX0FSTV9IQVZFX05FT04pLHRydWUpCiAgICAgTE9DQUxfQVJNX05FT04gICA6PSB0cnVlCiAjICAgIExPQ0FMX0NGTEFHUyAgICAgOj0gLXN0ZD1jOTkgLUQuX05FT04gLUQuX09NWERMCiAgICAgTE9DQUxfQ0ZMQUdTICAgICA6PSAtREgyNjRERUNfTkVPTiAtREgyNjRERUNfT01YREwKQEAgLTk0LDYgKzk0LDcgQEAKICAgICBMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvLi9vbXhkbC9hcm1fbmVvbi9hcGkgXAogICAgICAgICAgICAgICAgICAgICAgICAgJChMT0NBTF9QQVRIKS8uL29teGRsL2FybV9uZW9uL3ZjL2FwaSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAkKExPQ0FMX1BBVEgpLy4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpCisgIGVuZGlmCiBlbmRpZgogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcAppbmRleCA3ZGRiMTNjLi4xNjgyMDhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuY3BwCkBAIC01OCw3ICs1OCw2IEBACiAgICAgICAgICAgICAzMjAgLyogd2lkdGggKi8sIDI0MCAvKiBoZWlnaHQgKi8sIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKICAgICAgIG1IYW5kbGUoTlVMTCksCiAgICAgICBtSW5wdXRCdWZmZXJDb3VudCgwKSwKLSAgICAgIG1QaWN0dXJlU2l6ZShtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDIpLAogICAgICAgbUZpcnN0UGljdHVyZShOVUxMKSwKICAgICAgIG1GaXJzdFBpY3R1cmVJZCgtMSksCiAgICAgICBtUGljSWQoMCksCkBAIC05OCw3ICs5Nyw3IEBACiAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiB9CiAKLXZvaWQgU29mdEFWQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0QVZDOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTExOCw3ICsxMTcsNyBAQAogICAgIH0KIAogICAgIEgyNjRTd0RlY1JldCByZXQgPSBIMjY0U1dERUNfUElDX1JEWTsKLSAgICBib29sIHBvcnRTZXR0aW5nc0NoYW5nZWQgPSBmYWxzZTsKKyAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKICAgICB3aGlsZSAoKG1FT1NTdGF0dXMgIT0gSU5QVVRfREFUQV9BVkFJTEFCTEUgfHwgIWluUXVldWUuZW1wdHkoKSkKICAgICAgICAgICAgICYmIG91dFF1ZXVlLnNpemUoKSA9PSBrTnVtT3V0cHV0QnVmZmVycykgewogCkBAIC0xNjEsMTcgKzE2MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNJbmZvIGRlY29kZXJJbmZvOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhIMjY0U3dEZWNHZXRJbmZvKG1IYW5kbGUsICZkZWNvZGVySW5mbykgPT0gSDI2NFNXREVDX09LKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlUG9ydFNldHRpbmdDaGFuZ2VFdmVudCgmZGVjb2RlckluZm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0U2V0dGluZ3NDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVySW5mby5jcm9wcGluZ0ZsYWcgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNyb3BSZWN0RXZlbnQoJmRlY29kZXJJbmZvLmNyb3BQYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0U2V0dGluZ3NDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpDcm9wU2V0dGluZ3NNb2RlIGNyb3BTZXR0aW5nc01vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ3JvcFBhcmFtcyhkZWNvZGVySW5mbyk7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydFdpbGxSZXNldCwgZGVjb2RlckluZm8ucGljV2lkdGgsIGRlY29kZXJJbmZvLnBpY0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wU2V0dGluZ3NNb2RlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwb3J0U2V0dGluZ3NDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKEgyNjRTd0RlY05leHRQaWN0dXJlKG1IYW5kbGUsICZkZWNvZGVkUGljdHVyZSwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgID09IEgyNjRTV0RFQ19QSUNfUkRZKSB7CiAKQEAgLTE5OSw4ICsxOTUsNyBAQAogICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKIAotICAgICAgICBpZiAocG9ydFNldHRpbmdzQ2hhbmdlZCkgewotICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTIxNSw0NCArMjEwLDM0IEBACiAgICAgfQogfQogCi1ib29sIFNvZnRBVkM6OmhhbmRsZVBvcnRTZXR0aW5nQ2hhbmdlRXZlbnQoY29uc3QgSDI2NFN3RGVjSW5mbyAqaW5mbykgewotICAgIGlmIChtV2lkdGggIT0gaW5mby0+cGljV2lkdGggfHwgbUhlaWdodCAhPSBpbmZvLT5waWNIZWlnaHQpIHsKLSAgICAgICAgbVdpZHRoICA9IGluZm8tPnBpY1dpZHRoOwotICAgICAgICBtSGVpZ2h0ID0gaW5mby0+cGljSGVpZ2h0OwotICAgICAgICBtUGljdHVyZVNpemUgPSBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7Ci0gICAgICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOwotICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7Ci0gICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKLSAgICAgICAgcmV0dXJuIHRydWU7CitTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpDcm9wU2V0dGluZ3NNb2RlIFNvZnRBVkM6OmhhbmRsZUNyb3BQYXJhbXMoCisgICAgICAgIGNvbnN0IEgyNjRTd0RlY0luZm8mIGRlY0luZm8pIHsKKyAgICBpZiAoIWRlY0luZm8uY3JvcHBpbmdGbGFnKSB7CisgICAgICAgIHJldHVybiBrQ3JvcFVuU2V0OwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBTb2Z0QVZDOjpoYW5kbGVDcm9wUmVjdEV2ZW50KGNvbnN0IENyb3BQYXJhbXMgKmNyb3ApIHsKLSAgICBpZiAobUNyb3BMZWZ0ICE9IGNyb3AtPmNyb3BMZWZ0T2Zmc2V0IHx8Ci0gICAgICAgIG1Dcm9wVG9wICE9IGNyb3AtPmNyb3BUb3BPZmZzZXQgfHwKLSAgICAgICAgbUNyb3BXaWR0aCAhPSBjcm9wLT5jcm9wT3V0V2lkdGggfHwKLSAgICAgICAgbUNyb3BIZWlnaHQgIT0gY3JvcC0+Y3JvcE91dEhlaWdodCkgewotICAgICAgICBtQ3JvcExlZnQgPSBjcm9wLT5jcm9wTGVmdE9mZnNldDsKLSAgICAgICAgbUNyb3BUb3AgPSBjcm9wLT5jcm9wVG9wT2Zmc2V0OwotICAgICAgICBtQ3JvcFdpZHRoID0gY3JvcC0+Y3JvcE91dFdpZHRoOwotICAgICAgICBtQ3JvcEhlaWdodCA9IGNyb3AtPmNyb3BPdXRIZWlnaHQ7Ci0KLSAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsCi0gICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwgTlVMTCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgY29uc3QgQ3JvcFBhcmFtcyYgY3JvcCA9IGRlY0luZm8uY3JvcFBhcmFtczsKKyAgICBpZiAobUNyb3BMZWZ0ID09IGNyb3AuY3JvcExlZnRPZmZzZXQgJiYKKyAgICAgICAgbUNyb3BUb3AgPT0gY3JvcC5jcm9wVG9wT2Zmc2V0ICYmCisgICAgICAgIG1Dcm9wV2lkdGggPT0gY3JvcC5jcm9wT3V0V2lkdGggJiYKKyAgICAgICAgbUNyb3BIZWlnaHQgPT0gY3JvcC5jcm9wT3V0SGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBrQ3JvcFNldDsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworCisgICAgbUNyb3BMZWZ0ID0gY3JvcC5jcm9wTGVmdE9mZnNldDsKKyAgICBtQ3JvcFRvcCA9IGNyb3AuY3JvcFRvcE9mZnNldDsKKyAgICBtQ3JvcFdpZHRoID0gY3JvcC5jcm9wT3V0V2lkdGg7CisgICAgbUNyb3BIZWlnaHQgPSBjcm9wLmNyb3BPdXRIZWlnaHQ7CisgICAgcmV0dXJuIGtDcm9wQ2hhbmdlZDsKIH0KIAogdm9pZCBTb2Z0QVZDOjpzYXZlRmlyc3RPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCAqZGF0YSkgewogICAgIENIRUNLKG1GaXJzdFBpY3R1cmUgPT0gTlVMTCk7CiAgICAgbUZpcnN0UGljdHVyZUlkID0gcGljSWQ7CiAKLSAgICBtRmlyc3RQaWN0dXJlID0gbmV3IHVpbnQ4X3RbbVBpY3R1cmVTaXplXTsKLSAgICBtZW1jcHkobUZpcnN0UGljdHVyZSwgZGF0YSwgbVBpY3R1cmVTaXplKTsKKyAgICB1aW50MzJfdCBwaWN0dXJlU2l6ZSA9IG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMjsKKyAgICBtRmlyc3RQaWN0dXJlID0gbmV3IHVpbnQ4X3RbcGljdHVyZVNpemVdOworICAgIG1lbWNweShtRmlyc3RQaWN0dXJlLCBkYXRhLCBwaWN0dXJlU2l6ZSk7CiB9CiAKIHZvaWQgU29mdEFWQzo6ZHJhaW5PbmVPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCogZGF0YSkgewpAQCAtMjYzLDkgKzI0OCwxNyBAQAogICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBtUGljVG9IZWFkZXJNYXAudmFsdWVGb3IocGljSWQpOwogICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IGhlYWRlci0+blRpbWVTdGFtcDsKICAgICBvdXRIZWFkZXItPm5GbGFncyA9IGhlYWRlci0+bkZsYWdzOwotICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG1QaWN0dXJlU2l6ZTsKLSAgICBtZW1jcHkob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0LAotICAgICAgICAgICAgZGF0YSwgbVBpY3R1cmVTaXplKTsKKyAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7CisKKyAgICB1aW50OF90ICpkc3QgPSBvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQ7CisgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IHNyY1kgKyBtV2lkdGggKiBtSGVpZ2h0OworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSBzcmNVICsgbVdpZHRoICogbUhlaWdodCAvIDQ7CisgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBtV2lkdGg7CisgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBtV2lkdGggLyAyOworICAgIHNpemVfdCBzcmNWU3RyaWRlID0gc3JjVVN0cmlkZTsKKyAgICBjb3B5WVYxMkZyYW1lVG9PdXRwdXRCdWZmZXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlKTsKKwogICAgIG1QaWNUb0hlYWRlck1hcC5yZW1vdmVJdGVtKHBpY0lkKTsKICAgICBkZWxldGUgaGVhZGVyOwogICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCmluZGV4IGVlNjk5MjYuLjA2OTEwN2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaApAQCAtNTUsOCArNTUsNiBAQAogCiAgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OwogCi0gICAgdWludDMyX3QgbVBpY3R1cmVTaXplOwotCiAgICAgdWludDhfdCAqbUZpcnN0UGljdHVyZTsKICAgICBpbnQzMl90IG1GaXJzdFBpY3R1cmVJZDsKIApAQCAtNzUsOCArNzMsNyBAQAogICAgIHZvaWQgZHJhaW5BbGxPdXRwdXRCdWZmZXJzKGJvb2wgZW9zKTsKICAgICB2b2lkIGRyYWluT25lT3V0cHV0QnVmZmVyKGludDMyX3QgcGljSWQsIHVpbnQ4X3QgKmRhdGEpOwogICAgIHZvaWQgc2F2ZUZpcnN0T3V0cHV0QnVmZmVyKGludDMyX3QgcGlkSWQsIHVpbnQ4X3QgKmRhdGEpOwotICAgIGJvb2wgaGFuZGxlQ3JvcFJlY3RFdmVudChjb25zdCBDcm9wUGFyYW1zKiBjcm9wKTsKLSAgICBib29sIGhhbmRsZVBvcnRTZXR0aW5nQ2hhbmdlRXZlbnQoY29uc3QgSDI2NFN3RGVjSW5mbyAqaW5mbyk7CisgICAgQ3JvcFNldHRpbmdzTW9kZSBoYW5kbGVDcm9wUGFyYW1zKGNvbnN0IEgyNjRTd0RlY0luZm8mIGRlY0luZm8pOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEFWQyk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlcy5oCmluZGV4IDhiMjk1YTYuLjkxMmNiMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmgKQEAgLTMyLDYgKzMyLDcgQEAKICNkZWZpbmUgX09NWFRZUEVTX0hfCiAKICNpbmNsdWRlIDxsaW1pdHMuaD4gCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNkZWZpbmUgT01YX0lOCiAjZGVmaW5lIE9NWF9PVVQKQEAgLTc1LDY0ICs3NiwyMiBAQAogCiAgCiAvKiBPTVhfVTggKi8KLSNpZiBVQ0hBUl9NQVggPT0gMHhmZgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VODsKLSNlbGlmIFVTSFJUX01BWCA9PSAweGZmIAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1U4OyAKLSNlbHNlCi0jZXJyb3IgT01YX1U4IHVuZGVmaW5lZAotI2VuZGlmIAotCit0eXBlZGVmIHVpbnQ4X3QgT01YX1U4OwogIAogLyogT01YX1M4ICovCi0jaWYgU0NIQVJfTUFYID09IDB4N2YgCi10eXBlZGVmIHNpZ25lZCBjaGFyIE9NWF9TODsKLSNlbGlmIFNIUlRfTUFYID09IDB4N2YgCi10eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1M4OyAKLSNlbHNlCi0jZXJyb3IgT01YX1M4IHVuZGVmaW5lZAotI2VuZGlmCi0gCit0eXBlZGVmIGludDhfdCBPTVhfUzg7CiAgCiAvKiBPTVhfVTE2ICovCi0jaWYgVVNIUlRfTUFYID09IDB4ZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1UxNjsKLSNlbGlmIFVJTlRfTUFYID09IDB4ZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UxNjsgCi0jZWxzZQotI2Vycm9yIE9NWF9VMTYgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiB1aW50MTZfdCBPTVhfVTE2OwogCiAvKiBPTVhfUzE2ICovCi0jaWYgU0hSVF9NQVggPT0gMHg3ZmZmIAotdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TMTY7Ci0jZWxpZiBJTlRfTUFYID09IDB4N2ZmZiAKLXR5cGVkZWYgc2lnbmVkIGludCBPTVhfUzE2OyAKLSNlbHNlCi0jZXJyb3IgT01YX1MxNiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIGludDE2X3QgT01YX1MxNjsKIAogLyogT01YX1UzMiAqLwotI2lmIFVJTlRfTUFYID09IDB4ZmZmZmZmZmYKLXR5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMzI7Ci0jZWxpZiBMT05HX01BWCA9PSAweGZmZmZmZmZmCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IE9NWF9VMzI7IAotI2Vsc2UKLSNlcnJvciBPTVhfVTMyIHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgdWludDMyX3QgT01YX1UzMjsKIAogLyogT01YX1MzMiAqLwotI2lmIElOVF9NQVggPT0gMHg3ZmZmZmZmZgotdHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMzI7Ci0jZWxpZiBMT05HX01BWCA9PSAweDdmZmZmZmZmCi10eXBlZGVmIGxvbmcgc2lnbmVkIGludCBPTVhfUzMyOyAKLSNlbHNlCi0jZXJyb3IgT01YX1MzMiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIGludDMyX3QgT01YX1MzMjsKIAogLyogT01YX1U2NCAmIE9NWF9TNjQgKi8KICNpZiBkZWZpbmVkKCBfV0lOMzIgKSB8fCBkZWZpbmVkICggX1dJTjY0ICkKQEAgLTE0MywxNSArMTAyLDE0IEBACiAgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCiAgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCiAjZWxzZQotICAgIHR5cGVkZWYgbG9uZyBsb25nIE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIGludDY0X3QgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgdWludDY0X3QgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCiAgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBMTCkKICAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMExMKQogICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGTEwpCiAgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZMTCkKICNlbmRpZgogCi0KIC8qIE9NWF9TQzggKi8KIHR5cGVkZWYgc3RydWN0CiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmgKaW5kZXggOGIyOTVhNi4uOTEyY2IwZCAxMDA3NTUKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaApAQCAtMzIsNiArMzIsNyBAQAogI2RlZmluZSBfT01YVFlQRVNfSF8KIAogI2luY2x1ZGUgPGxpbWl0cy5oPiAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2RlZmluZSBPTVhfSU4KICNkZWZpbmUgT01YX09VVApAQCAtNzUsNjQgKzc2LDIyIEBACiAKICAKIC8qIE9NWF9VOCAqLwotI2lmIFVDSEFSX01BWCA9PSAweGZmCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1U4OwotI2VsaWYgVVNIUlRfTUFYID09IDB4ZmYgCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTg7IAotI2Vsc2UKLSNlcnJvciBPTVhfVTggdW5kZWZpbmVkCi0jZW5kaWYgCi0KK3R5cGVkZWYgdWludDhfdCBPTVhfVTg7CiAgCiAvKiBPTVhfUzggKi8KLSNpZiBTQ0hBUl9NQVggPT0gMHg3ZiAKLXR5cGVkZWYgc2lnbmVkIGNoYXIgT01YX1M4OwotI2VsaWYgU0hSVF9NQVggPT0gMHg3ZiAKLXR5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzg7IAotI2Vsc2UKLSNlcnJvciBPTVhfUzggdW5kZWZpbmVkCi0jZW5kaWYKLSAKK3R5cGVkZWYgaW50OF90IE9NWF9TODsKICAKIC8qIE9NWF9VMTYgKi8KLSNpZiBVU0hSVF9NQVggPT0gMHhmZmZmCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTE2OwotI2VsaWYgVUlOVF9NQVggPT0gMHhmZmZmCi10eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTE2OyAKLSNlbHNlCi0jZXJyb3IgT01YX1UxNiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIHVpbnQxNl90IE9NWF9VMTY7CiAKIC8qIE9NWF9TMTYgKi8KLSNpZiBTSFJUX01BWCA9PSAweDdmZmYgCi10eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1MxNjsKLSNlbGlmIElOVF9NQVggPT0gMHg3ZmZmIAotdHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMTY7IAotI2Vsc2UKLSNlcnJvciBPTVhfUzE2IHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgaW50MTZfdCBPTVhfUzE2OwogCiAvKiBPTVhfVTMyICovCi0jaWYgVUlOVF9NQVggPT0gMHhmZmZmZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UzMjsKLSNlbGlmIExPTkdfTUFYID09IDB4ZmZmZmZmZmYKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgT01YX1UzMjsgCi0jZWxzZQotI2Vycm9yIE9NWF9VMzIgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiB1aW50MzJfdCBPTVhfVTMyOwogCiAvKiBPTVhfUzMyICovCi0jaWYgSU5UX01BWCA9PSAweDdmZmZmZmZmCi10eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MzMjsKLSNlbGlmIExPTkdfTUFYID09IDB4N2ZmZmZmZmYKLXR5cGVkZWYgbG9uZyBzaWduZWQgaW50IE9NWF9TMzI7IAotI2Vsc2UKLSNlcnJvciBPTVhfUzMyIHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgaW50MzJfdCBPTVhfUzMyOwogCiAvKiBPTVhfVTY0ICYgT01YX1M2NCAqLwogI2lmIGRlZmluZWQoIF9XSU4zMiApIHx8IGRlZmluZWQgKCBfV0lONjQgKQpAQCAtMTQzLDE1ICsxMDIsMTQgQEAKICAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRmk2NCkKICAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRmk2NCkKICNlbHNlCi0gICAgdHlwZWRlZiBsb25nIGxvbmcgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgaW50NjRfdCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1aW50NjRfdCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KICAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQogICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCiAgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKICAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQogI2VuZGlmCiAKLQogLyogT01YX1NDOCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUwppbmRleCAwNzNkYmJhLi5iY2M2YjZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TCkBAIC0xMCw2ICsxMCwyMiBAQAogICAgIC5mcHUgbmVvbgogICAgIC50ZXh0CiAKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCisgICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCisgICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcworICAgIC5leHRlcm4gICBhcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9aaWdaYWdfNHg0CisKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCisgICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCisgICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcworICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9aaWdaYWdfNHg0CisKICAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyCiAgICAgLmZ1bmMgICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcgogYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXI6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUwppbmRleCA0NGViNDI4Li41YmM3ODc1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMKQEAgLTIwLDYgKzIwLDE0IEBACiAgICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKICAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVk1hdHJpeFUxNgogCisgICAgLmhpZGRlbiBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAuaGlkZGVuIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAuaGlkZGVuIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgLmhpZGRlbiBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgorICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9WTWF0cml4CisgICAgLmhpZGRlbiBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAuaGlkZGVuIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorCiBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NDoKICAgICAuYnl0ZSAgMCwgMiwgMCwgMgogICAgIC5ieXRlICAyLCAxLCAyLCAxCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9vbXh0eXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaAppbmRleCA4YjI5NWE2Li45MTJjYjBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9vbXh0eXBlcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmgKQEAgLTMyLDYgKzMyLDcgQEAKICNkZWZpbmUgX09NWFRZUEVTX0hfCiAKICNpbmNsdWRlIDxsaW1pdHMuaD4gCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNkZWZpbmUgT01YX0lOCiAjZGVmaW5lIE9NWF9PVVQKQEAgLTc1LDY0ICs3NiwyMiBAQAogCiAgCiAvKiBPTVhfVTggKi8KLSNpZiBVQ0hBUl9NQVggPT0gMHhmZgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VODsKLSNlbGlmIFVTSFJUX01BWCA9PSAweGZmIAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1U4OyAKLSNlbHNlCi0jZXJyb3IgT01YX1U4IHVuZGVmaW5lZAotI2VuZGlmIAotCit0eXBlZGVmIHVpbnQ4X3QgT01YX1U4OwogIAogLyogT01YX1M4ICovCi0jaWYgU0NIQVJfTUFYID09IDB4N2YgCi10eXBlZGVmIHNpZ25lZCBjaGFyIE9NWF9TODsKLSNlbGlmIFNIUlRfTUFYID09IDB4N2YgCi10eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1M4OyAKLSNlbHNlCi0jZXJyb3IgT01YX1M4IHVuZGVmaW5lZAotI2VuZGlmCi0gCit0eXBlZGVmIGludDhfdCBPTVhfUzg7CiAgCiAvKiBPTVhfVTE2ICovCi0jaWYgVVNIUlRfTUFYID09IDB4ZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1UxNjsKLSNlbGlmIFVJTlRfTUFYID09IDB4ZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UxNjsgCi0jZWxzZQotI2Vycm9yIE9NWF9VMTYgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiB1aW50MTZfdCBPTVhfVTE2OwogCiAvKiBPTVhfUzE2ICovCi0jaWYgU0hSVF9NQVggPT0gMHg3ZmZmIAotdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TMTY7Ci0jZWxpZiBJTlRfTUFYID09IDB4N2ZmZiAKLXR5cGVkZWYgc2lnbmVkIGludCBPTVhfUzE2OyAKLSNlbHNlCi0jZXJyb3IgT01YX1MxNiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIGludDE2X3QgT01YX1MxNjsKIAogLyogT01YX1UzMiAqLwotI2lmIFVJTlRfTUFYID09IDB4ZmZmZmZmZmYKLXR5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMzI7Ci0jZWxpZiBMT05HX01BWCA9PSAweGZmZmZmZmZmCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IE9NWF9VMzI7IAotI2Vsc2UKLSNlcnJvciBPTVhfVTMyIHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgdWludDMyX3QgT01YX1UzMjsKIAogLyogT01YX1MzMiAqLwotI2lmIElOVF9NQVggPT0gMHg3ZmZmZmZmZgotdHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMzI7Ci0jZWxpZiBMT05HX01BWCA9PSAweDdmZmZmZmZmCi10eXBlZGVmIGxvbmcgc2lnbmVkIGludCBPTVhfUzMyOyAKLSNlbHNlCi0jZXJyb3IgT01YX1MzMiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIGludDMyX3QgT01YX1MzMjsKIAogLyogT01YX1U2NCAmIE9NWF9TNjQgKi8KICNpZiBkZWZpbmVkKCBfV0lOMzIgKSB8fCBkZWZpbmVkICggX1dJTjY0ICkKQEAgLTE0MywxNSArMTAyLDE0IEBACiAgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCiAgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCiAjZWxzZQotICAgIHR5cGVkZWYgbG9uZyBsb25nIE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIGludDY0X3QgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgdWludDY0X3QgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCiAgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBMTCkKICAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMExMKQogICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGTEwpCiAgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZMTCkKICNlbmRpZgogCi0KIC8qIE9NWF9TQzggKi8KIHR5cGVkZWYgc3RydWN0CiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYwppbmRleCAyYmI0YzRkLi41MjRhM2YwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKQEAgLTQyLDYgKzQyLDggQEAKICNpbmNsdWRlICJoMjY0YnNkX2RlY29kZXIuaCIKICNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgVmVyc2lvbiBJbmZvcm1hdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTczLDYgKzc1LDcgQEAKICNlbmRpZgogCiB2b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKnN0cmluZykgeworICAgIFVOVVNFRChzdHJpbmcpOwogfQogCiB2b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jCmluZGV4IDQ5M2ZiOWUuLjdhMjYyZWQgMTAwNzU1Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgaTMyIGZpcnN0UGhhc2VbMTZdOwogICAgIGkzMiAqcFRtcDsKICAgICAvKiBuZWlnaGJvdXJzIGFib3ZlLCBiZWxvdywgbGVmdCBhbmQgcmlnaHQgKi8KLSAgICBpMzIgYVs0XSwgYls0XSwgbFs0XSwgcls0XTsKKyAgICBpMzIgYVs0XSA9IHsgMCwwLDAsMCB9LCBiWzRdLCBsWzRdID0geyAwLDAsMCwwIH0sIHJbNF07CiAgICAgdTMyIEEsIEIsIEwsIFI7CiAjaWZkZWYgSDI2NERFQ19PTVhETAogICAgIHU4IGZpbGxCdWZmWzMyKjIxICsgMTUgKyAzMl07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYwppbmRleCAxNWVhYmZiLi41MmM4NWU1IDEwMDc1NQotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMKQEAgLTExMTAsNyArMTExMCw3IEBACiAKIC8qIFZhcmlhYmxlcyAqLwogCi0gICAgdTMyIGksIGo7CisgICAgaTMyIGksIGo7CiAgICAgaTMyIGEsIGIsIGM7CiAgICAgaTMyIHRtcDsKIApAQCAtMTEyMywyMCArMTEyMywyMCBAQAogICAgIGEgPSAxNiAqIChhYm92ZVsxNV0gKyBsZWZ0WzE1XSk7CiAKICAgICBmb3IgKGkgPSAwLCBiID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgYiArPSAoKGkzMilpICsgMSkgKiAoYWJvdmVbOCtpXSAtIGFib3ZlWzYtaV0pOworICAgICAgICBiICs9IChpICsgMSkgKiAoYWJvdmVbOCtpXSAtIGFib3ZlWzYtaV0pOwogICAgIGIgPSAoNSAqIGIgKyAzMikgPj4gNjsKIAogICAgIGZvciAoaSA9IDAsIGMgPSAwOyBpIDwgNzsgaSsrKQotICAgICAgICBjICs9ICgoaTMyKWkgKyAxKSAqIChsZWZ0WzgraV0gLSBsZWZ0WzYtaV0pOworICAgICAgICBjICs9IChpICsgMSkgKiAobGVmdFs4K2ldIC0gbGVmdFs2LWldKTsKICAgICAvKiBwWy0xLC0xXSBoYXMgdG8gYmUgYWNjZXNzZWQgdGhyb3VnaCBhYm92ZSBwb2ludGVyICovCi0gICAgYyArPSAoKGkzMilpICsgMSkgKiAobGVmdFs4K2ldIC0gYWJvdmVbLTFdKTsKKyAgICBjICs9IChpICsgMSkgKiAobGVmdFs4K2ldIC0gYWJvdmVbLTFdKTsKICAgICBjID0gKDUgKiBjICsgMzIpID4+IDY7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKICAgICB7CiAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQogICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSAoYSArIGIgKiAoKGkzMilqIC0gNykgKyBjICogKChpMzIpaSAtIDcpICsgMTYpID4+IDU7CisgICAgICAgICAgICB0bXAgPSAoYSArIGIgKiAoaiAtIDcpICsgYyAqIChpIC0gNykgKyAxNikgPj4gNTsKICAgICAgICAgICAgIGRhdGFbaSoxNitqXSA9ICh1OClDTElQMSh0bXApOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYwppbmRleCBjOTQ4Nzc2Li5iNDA5YTA2IDEwMDc1NQotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYwpAQCAtNDIsNiArNDIsOCBAQAogI2luY2x1ZGUgImFybVZDLmgiCiAjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIxMzYsNyArMjEzOCw4IEBACiAgIGkzMiBjZW50ZXIsCiAgIGkzMiByaWdodCkKIHsKLQorICAgIFVOVVNFRChsZWZ0KTsKKyAgICBVTlVTRUQocmlnaHQpOwogICAgIEFTU0VSVChyZWYpOwogICAgIEFTU0VSVChmaWxsKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jCmluZGV4IGE3YzZmNjQuLjIzNDAxYzYgMTAwNzU1Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMKQEAgLTQ3LDYgKzQ3LDggQEAKICNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCiAjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDA3LDYgKzE0MDksNyBAQAogICAgIHUzMiB0bXAsIHZhbHVlLCBpOwogICAgIGkzMiBpdmFsdWU7CiAgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKyAgICBVTlVTRUQobmFsVW5pdFR5cGUpOwogCiAvKiBDb2RlICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jCmluZGV4IGNjODM4ZmQuLmZiOTdhMjggMTAwNzU1Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYwpAQCAtMTg2LDcgKzE4Niw3IEBACiAgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwogCiAgICAgaWYgKCAoYml0cyA+IDgpIHx8Ci0gICAgICAgICAoKGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk+PigzMi1iaXRzKSkgIT0gKDEgPDwgKGJpdHMtMSkpKSApCisgICAgICAgICAoKGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk+PigzMi1iaXRzKSkgIT0gKDF1bCA8PCAoYml0cy0xKSkpICkKICAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKICAgICBlbHNlCiAgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmgKaW5kZXggY2IzYWRkYS4uMjE2YWQwNCAxMDA3NTUKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5oCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNlbmRpZgogCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSAiYmFzZXR5cGUuaCIKICNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgogI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKQEAgLTE1MCw3ICsxNTEsNyBAQAogfQogCiAjZGVmaW5lIEFMSUdOKHB0ciwgYnl0ZVBvcykgXAotICAgICAgICAocHRyICsgKCAoKGJ5dGVQb3MgLSAoaW50KXB0cikgJiAoYnl0ZVBvcyAtIDEpKSAvIHNpemVvZigqcHRyKSApKQorICAgICAgICAocHRyICsgKCAoKGJ5dGVQb3MgLSAodWludHB0cl90KXB0cikgJiAoYnl0ZVBvcyAtIDEpKSAvIHNpemVvZigqcHRyKSApKQogCiBleHRlcm4gY29uc3QgdTMyIGgyNjRic2RRcENbNTJdOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjViMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNzljNWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE5IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBTb2Z0T3B1cy5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgICAgIGV4dGVybmFsL2xpYm9wdXMvaW5jbHVkZSBcCisgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJvcHVzIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMgbGlibG9nCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X29wdXNkZWMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDUyYTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdE9wdXMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTb2Z0T3B1cy5oIgorI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPG9wdXMuaD4KKyAgICAjaW5jbHVkZSA8b3B1c19tdWx0aXN0cmVhbS5oPgorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBpbnQga1JhdGUgPSA0ODAwMDsKKworLy8gT3B1cyB1c2VzIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcsIGFuZCBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nIHNwZWNpZmllcworLy8gbWFwcGluZ3MgZm9yIHVwIHRvIDggY2hhbm5lbHMuIFRoaXMgaW5mb3JtYXRpb24gaXMgcGFydCBvZiB0aGUgVm9yYmlzIEkKKy8vIFNwZWNpZmljYXRpb246CisvLyBodHRwOi8vd3d3LnhpcGgub3JnL3ZvcmJpcy9kb2MvVm9yYmlzX0lfc3BlYy5odG1sCitzdGF0aWMgY29uc3QgaW50IGtNYXhDaGFubmVscyA9IDg7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOworfQorCitTb2Z0T3B1czo6U29mdE9wdXMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCisgICAgICBtRGVjb2RlcihOVUxMKSwKKyAgICAgIG1IZWFkZXIoTlVMTCksCisgICAgICBtQ29kZWNEZWxheSgwKSwKKyAgICAgIG1TZWVrUHJlUm9sbCgwKSwKKyAgICAgIG1BbmNob3JUaW1lVXMoMCksCisgICAgICBtTnVtRnJhbWVzT3V0cHV0KDApLAorICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZShOT05FKSB7CisgICAgaW5pdFBvcnRzKCk7CisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdE9wdXM6On5Tb2Z0T3B1cygpIHsKKyAgICBpZiAobURlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgIG1EZWNvZGVyID0gTlVMTDsKKyAgICB9CisgICAgaWYgKG1IZWFkZXIgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUhlYWRlcjsKKyAgICAgICAgbUhlYWRlciA9IE5VTEw7CisgICAgfQorfQorCit2b2lkIFNvZnRPcHVzOjppbml0UG9ydHMoKSB7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0gMDsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0gOTYwICogNjsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDE7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9CisgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhciAqPihNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgZGVmLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPQorICAgICAgICAoT01YX0FVRElPX0NPRElOR1RZUEUpT01YX0FVRElPX0NvZGluZ0FuZHJvaWRPUFVTOworCisgICAgYWRkUG9ydChkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAxOworICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0ga01heE51bVNhbXBsZXNQZXJCdWZmZXIgKiBzaXplb2YoaW50MTZfdCkgKiBrTWF4Q2hhbm5lbHM7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL3JhdyIpOworICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgZGVmLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgYWRkUG9ydChkZWYpOworfQorCitzdGF0dXNfdCBTb2Z0T3B1czo6aW5pdERlY29kZXIoKSB7CisgICAgcmV0dXJuIE9LOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRPcHVzOjppbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXM6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFICpvcHVzUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChvcHVzUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQXVkaW9CYW5kV2lkdGggPSAwOworICAgICAgICAgICAgb3B1c1BhcmFtcy0+blNhbXBsZVJhdGUgPSBrUmF0ZTsKKyAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5CaXRSYXRlID0gMDsKKworICAgICAgICAgICAgaWYgKCFpc0NvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5DaGFubmVscyA9IG1IZWFkZXItPmNoYW5uZWxzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggIT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUVuZGlhbiA9IE9NWF9FbmRpYW5CaWc7CisgICAgICAgICAgICBwY21QYXJhbXMtPmJJbnRlcmxlYXZlZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVQQ01Nb2RlID0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXI7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1swXSA9IE9NWF9BVURJT19DaGFubmVsTEY7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1sxXSA9IE9NWF9BVURJT19DaGFubmVsUkY7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSBrUmF0ZTsKKworICAgICAgICAgICAgaWYgKCFpc0NvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSBtSGVhZGVyLT5jaGFubmVsczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T3B1czo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoICgoaW50KWluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLm9wdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgLSAxKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFICpvcHVzUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChvcHVzUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitib29sIFNvZnRPcHVzOjppc0NvbmZpZ3VyZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnB1dEJ1ZmZlckNvdW50ID49IDE7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBSZWFkTEUxNihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlYWRfb2Zmc2V0KSB7CisgICAgaWYgKHJlYWRfb2Zmc2V0ICsgMSA+IGRhdGFfc2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdWludDE2X3QgdmFsOworICAgIHZhbCA9IGRhdGFbcmVhZF9vZmZzZXRdOworICAgIHZhbCB8PSBkYXRhW3JlYWRfb2Zmc2V0ICsgMV0gPDwgODsKKyAgICByZXR1cm4gdmFsOworfQorCisvLyBNYXhpbXVtIHBhY2tldCBzaXplIHVzZWQgaW4gWGlwaCdzIG9wdXNkZWMuCitzdGF0aWMgY29uc3QgaW50IGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMgPSA5NjAgKiA2OworCisvLyBEZWZhdWx0IGF1ZGlvIG91dHB1dCBjaGFubmVsIGxheW91dC4gVXNlZCB0byBpbml0aWFsaXplIHxzdHJlYW1fbWFwfCBpbgorLy8gT3B1c0hlYWRlciwgYW5kIHBhc3NlZCB0byBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKCkgd2hlbiB0aGUgaGVhZGVyCisvLyBkb2VzIG5vdCBjb250YWluIG1hcHBpbmcgaW5mb3JtYXRpb24uIFRoZSB2YWx1ZXMgYXJlIHZhbGlkIG9ubHkgZm9yIG1vbm8gYW5kCisvLyBzdGVyZW8gb3V0cHV0OiBPcHVzIHN0cmVhbXMgd2l0aCBtb3JlIHRoYW4gMiBjaGFubmVscyByZXF1aXJlIGEgc3RyZWFtIG1hcC4KK3N0YXRpYyBjb25zdCBpbnQga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQgPSAyOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dFtrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dF0gPSB7IDAsIDEgfTsKKworLy8gUGFyc2VzIE9wdXMgSGVhZGVyLiBIZWFkZXIgc3BlYzogaHR0cDovL3dpa2kueGlwaC5vcmcvT2dnT3B1cyNJRF9IZWFkZXIKK3N0YXRpYyBib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdXNIZWFkZXIqIGhlYWRlcikgeworICAgIC8vIFNpemUgb2YgdGhlIE9wdXMgaGVhZGVyIGV4Y2x1ZGluZyBvcHRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKKworICAgIC8vIE9mZnNldCB0byB0aGUgY2hhbm5lbCBjb3VudCBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsc09mZnNldCA9IDk7CisKKyAgICAvLyBPZmZzZXQgdG8gdGhlIHByZS1za2lwIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTa2lwU2FtcGxlc09mZnNldCA9IDEwOworCisgICAgLy8gT2Zmc2V0IHRvIHRoZSBnYWluIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJHYWluT2Zmc2V0ID0gMTY7CisKKyAgICAvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgbWFwcGluZyBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCA9IDE4OworCisgICAgLy8gT3B1cyBIZWFkZXIgY29udGFpbnMgYSBzdHJlYW0gbWFwLiBUaGUgbWFwcGluZyB2YWx1ZXMgYXJlIGluIHRoZSBoZWFkZXIKKyAgICAvLyBiZXlvbmQgdGhlIGFsd2F5cyBwcmVzZW50IHxrT3B1c0hlYWRlclNpemV8IGJ5dGVzIG9mIGRhdGEuIFRoZSBtYXBwaW5nCisgICAgLy8gZGF0YSBjb250YWlucyBzdHJlYW0gY291bnQsIGNvdXBsaW5nIGluZm9ybWF0aW9uLCBhbmQgcGVyIGNoYW5uZWwgbWFwcGluZworICAgIC8vIHZhbHVlczoKKyAgICAvLyAgIC0gQnl0ZSAwOiBOdW1iZXIgb2Ygc3RyZWFtcy4KKyAgICAvLyAgIC0gQnl0ZSAxOiBOdW1iZXIgY291cGxlZC4KKyAgICAvLyAgIC0gQnl0ZSAyOiBTdGFydGluZyBhdCBieXRlIDIgYXJlIHxoZWFkZXItPmNoYW5uZWxzfCB1aW50OCBtYXBwaW5nCisgICAgLy8gICAgICAgICAgICAgdmFsdWVzLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQgPSBrT3B1c0hlYWRlclNpemU7CisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyTnVtQ291cGxlZE9mZnNldCA9IGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCArIDE7CisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ID0ga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ICsgMjsKKworICAgIGlmIChkYXRhX3NpemUgPCBrT3B1c0hlYWRlclNpemUpIHsKKyAgICAgICAgQUxPR1YoIkhlYWRlciBzaXplIGlzIHRvbyBzbWFsbC4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBoZWFkZXItPmNoYW5uZWxzID0gKihkYXRhICsga09wdXNIZWFkZXJDaGFubmVsc09mZnNldCk7CisKKyAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA8PSAwIHx8IGhlYWRlci0+Y2hhbm5lbHMgPiBrTWF4Q2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR1YoIkludmFsaWQgSGVhZGVyLCB3cm9uZyBjaGFubmVsIGNvdW50OiAlZCIsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+c2tpcF9zYW1wbGVzID0gUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQpOworICAgIGhlYWRlci0+Z2Fpbl9kYiA9IHN0YXRpY19jYXN0PGludDE2X3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09wdXNIZWFkZXJHYWluT2Zmc2V0KSk7CisgICAgaGVhZGVyLT5jaGFubmVsX21hcHBpbmcgPSAqKGRhdGEgKyBrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0KTsKKyAgICBpZiAoIWhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIGlmIChoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJbnZhbGlkIEhlYWRlciwgbWlzc2luZyBzdHJlYW0gbWFwLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAxOworICAgICAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gaGVhZGVyLT5jaGFubmVscyA+IDE7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFswXSA9IDA7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFsxXSA9IDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbnZhbGlkIHN0cmVhbSBtYXA7IGluc3VmZmljaWVudCBkYXRhIGZvciBjdXJyZW50IGNoYW5uZWwgIgorICAgICAgICAgICAgICAiY291bnQ6ICVkIiwgaGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5udW1fc3RyZWFtcyA9ICooZGF0YSArIGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCk7CisgICAgaGVhZGVyLT5udW1fY291cGxlZCA9ICooZGF0YSArIGtPcHVzSGVhZGVyTnVtQ291cGxlZE9mZnNldCk7CisgICAgaWYgKGhlYWRlci0+bnVtX3N0cmVhbXMgKyBoZWFkZXItPm51bV9jb3VwbGVkICE9IGhlYWRlci0+Y2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR1YoIkluY29uc2lzdGVudCBjaGFubmVsIG1hcHBpbmcuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXItPmNoYW5uZWxzOyArK2kpCisgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbaV0gPSAqKGRhdGEgKyBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGkpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDb252ZXJ0IG5hbm9zZWNvbmRzIHRvIG51bWJlciBvZiBzYW1wbGVzLgorc3RhdGljIHVpbnQ2NF90IG5zX3RvX3NhbXBsZXModWludDY0X3QgbnMsIGludCBrUmF0ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KG5zKSAqIGtSYXRlIC8gMTAwMDAwMDAwMDsKK30KKwordm9pZCBTb2Z0T3B1czo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOworCisgICAgaWYgKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBvcnRJbmRleCA9PSAwICYmIG1JbnB1dEJ1ZmZlckNvdW50IDwgMykgeworICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGhlYWRlci0+cEJ1ZmZlciArIGhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBoZWFkZXItPm5GaWxsZWRMZW47CisKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgIENIRUNLKG1IZWFkZXIgPT0gTlVMTCk7CisgICAgICAgICAgICBtSGVhZGVyID0gbmV3IE9wdXNIZWFkZXIoKTsKKyAgICAgICAgICAgIG1lbXNldChtSGVhZGVyLCAwLCBzaXplb2YoKm1IZWFkZXIpKTsKKyAgICAgICAgICAgIGlmICghUGFyc2VPcHVzSGVhZGVyKGRhdGEsIHNpemUsIG1IZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlBhcnNpbmcgT3B1cyBIZWFkZXIgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9tYXBwaW5nW2tNYXhDaGFubmVsc10gPSB7MH07CisgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0LAorICAgICAgICAgICAgICAgICAgIGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KTsKKworICAgICAgICAgICAgaW50IHN0YXR1cyA9IE9QVVNfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgICAgIG1EZWNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZShrUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fY291cGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoIW1EZWNvZGVyIHx8IHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUgZmFpbGVkIHN0YXR1cz0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG1EZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BVU19TRVRfR0FJTihtSGVhZGVyLT5nYWluX2RiKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiRmFpbGVkIHRvIHNldCBPUFVTIGhlYWRlciBnYWluOyBzdGF0dXM9JXMiLAorICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAxKSB7CisgICAgICAgICAgICBtQ29kZWNEZWxheSA9IG5zX3RvX3NhbXBsZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KGhlYWRlci0+cEJ1ZmZlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci0+bk9mZnNldCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhdGUpOworICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TZWVrUHJlUm9sbCA9IG5zX3RvX3NhbXBsZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGludDY0X3QqPihoZWFkZXItPnBCdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5uT2Zmc2V0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhdGUpOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICB9CisKKyAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICBpbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShoZWFkZXIpOworICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKCFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworCisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBXaGVuIHNlZWtpbmcgdG8gemVybywgfG1Db2RlY0RlbGF5fCBzYW1wbGVzIGhhcyB0byBiZSBkaXNjYXJkZWQKKyAgICAgICAgLy8gaW5zdGVhZCBvZiB8bVNlZWtQcmVSb2xsfCBzYW1wbGVzIChhcyB3ZSB3b3VsZCB3aGVuIHNlZWtpbmcgdG8gYW55CisgICAgICAgIC8vIG90aGVyIHRpbWVzdGFtcCkuCisgICAgICAgIGlmIChpbkhlYWRlci0+blRpbWVTdGFtcCA9PSAwKSB7CisgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKworICAgICAgICBpbnQgbnVtRnJhbWVzID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGUobURlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopb3V0SGVhZGVyLT5wQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBpZiAobnVtRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlIHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CisgICAgICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IDApIHsKKyAgICAgICAgICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IG51bUZyYW1lcykgeworICAgICAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkIC09IG51bUZyYW1lczsKKyAgICAgICAgICAgICAgICBudW1GcmFtZXMgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBudW1GcmFtZXMgLT0gbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gbVNhbXBsZXNUb0Rpc2NhcmQgKiBzaXplb2YoaW50MTZfdCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzOworICAgICAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG51bUZyYW1lcyAqIHNpemVvZihpbnQxNl90KSAqIG1IZWFkZXItPmNoYW5uZWxzOworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gbUFuY2hvclRpbWVVcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYXRlOworCisgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgKz0gbnVtRnJhbWVzOworCisgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKworICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgIH0KK30KKwordm9pZCBTb2Z0T3B1czo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAocG9ydEluZGV4ID09IDAgJiYgbURlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBidWZmZXIgb3V0cHV0IGRvZXMgbm90IHN0aWxsCisgICAgICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KKyAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsIE9QVVNfUkVTRVRfU1RBVEUpOworICAgICAgICBtQW5jaG9yVGltZVVzID0gMDsKKyAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtU2Vla1ByZVJvbGw7CisgICAgfQorfQorCit2b2lkIFNvZnRPcHVzOjpvblJlc2V0KCkgeworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKKyAgICBpZiAobURlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgIG1EZWNvZGVyID0gTlVMTDsKKyAgICB9CisgICAgaWYgKG1IZWFkZXIgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUhlYWRlcjsKKyAgICAgICAgbUhlYWRlciA9IE5VTEw7CisgICAgfQorCisgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7Cit9CisKK3ZvaWQgU29mdE9wdXM6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CisgICAgaWYgKHBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UpIHsKKyAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBV0FJVElOR19ESVNBQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0soIWVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0VOQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSwgKGludClBV0FJVElOR19FTkFCTEVEKTsKKyAgICAgICAgICAgIENIRUNLKGVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpTb2Z0T3B1cyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZjY1NjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoZSBPcHVzIHNwZWNpZmljYXRpb24gaXMgcGFydCBvZiBJRVRGIFJGQyA2NzE2OgorICogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjcxNgorICovCisKKyNpZm5kZWYgU09GVF9PUFVTX0hfCisKKyNkZWZpbmUgU09GVF9PUFVTX0hfCisKKyNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisKK3N0cnVjdCBPcHVzTVNEZWNvZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBPcHVzSGVhZGVyIHsKKyAgaW50IGNoYW5uZWxzOworICBpbnQgc2tpcF9zYW1wbGVzOworICBpbnQgY2hhbm5lbF9tYXBwaW5nOworICBpbnQgbnVtX3N0cmVhbXM7CisgIGludCBudW1fY291cGxlZDsKKyAgaW50MTZfdCBnYWluX2RiOworICB1aW50OF90IHN0cmVhbV9tYXBbOF07Cit9OworCitzdHJ1Y3QgU29mdE9wdXMgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CisgICAgU29mdE9wdXMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRPcHVzKCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpOworICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1CdWZmZXJzID0gNCwKKyAgICAgICAga01heE51bVNhbXBsZXNQZXJCdWZmZXIgPSA5NjAgKiA2CisgICAgfTsKKworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKworICAgIE9wdXNNU0RlY29kZXIgKm1EZWNvZGVyOworICAgIE9wdXNIZWFkZXIgKm1IZWFkZXI7CisKKyAgICBpbnQ2NF90IG1Db2RlY0RlbGF5OworICAgIGludDY0X3QgbVNlZWtQcmVSb2xsOworICAgIGludDY0X3QgbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgaW50NjRfdCBtQW5jaG9yVGltZVVzOworICAgIGludDY0X3QgbU51bUZyYW1lc091dHB1dDsKKworICAgIGVudW0geworICAgICAgICBOT05FLAorICAgICAgICBBV0FJVElOR19ESVNBQkxFRCwKKyAgICAgICAgQVdBSVRJTkdfRU5BQkxFRAorICAgIH0gbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKKworICAgIHZvaWQgaW5pdFBvcnRzKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIGlzQ29uZmlndXJlZCgpIGNvbnN0OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE9wdXMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX09QVVNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5tawppbmRleCBmZTkwYTAzLi44NzA4MGU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLm1rCkBAIC04LDYgKzgsOCBAQAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIGxpYmxvZwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcAppbmRleCAxOWQ2ZjEzLi45ZDUxNGE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKQEAgLTE2Myw3ICsxNjMsNyBAQAogICAgIH0KIH0KIAotdm9pZCBTb2Z0UmF3OjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNvZnRSYXc6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5tawppbmRleCAyMjMyMzUzLi4yMTdhNmQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsKQEAgLTE2LDQgKzE2LDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X3ZvcmJpc2RlYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcAppbmRleCBjMWM1ZTY0Li5jNTU5NjgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcApAQCAtNTQsNiArNTQsOCBAQAogICAgICAgbUFuY2hvclRpbWVVcygwKSwKICAgICAgIG1OdW1GcmFtZXNPdXRwdXQoMCksCiAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSgtMSksCisgICAgICBtU2F3SW5wdXRFb3MoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyhmYWxzZSksCiAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKICAgICBpbml0UG9ydHMoKTsKICAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOwpAQCAtMjkwLDQ4ICsyOTIsNDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgKG1TYXdJbnB1dEVvcyAmJiAhbVNpZ25hbGxlZE91dHB1dEVvcykpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9IE5VTEw7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IE5VTEw7CisgICAgICAgIGlmICghaW5RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBpbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgIH0KIAogICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwogCi0gICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXMgPSAwOwogCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgICAgICBtU2F3SW5wdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gfHwgIW1TYXdJbnB1dEVvcykgeworICAgICAgICAgICAgICAgIENIRUNLX0dFKGluSGVhZGVyLT5uRmlsbGVkTGVuLCBzaXplb2YobnVtUGFnZVNhbXBsZXMpKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJm51bVBhZ2VTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgKyBpbkhlYWRlci0+bk9mZnNldCArIGluSGVhZGVyLT5uRmlsbGVkTGVuIC0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuIC09IHNpemVvZihudW1QYWdlU2FtcGxlcyk7OworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCBudW1QYWdlU2FtcGxlczsKLSAgICAgICAgQ0hFQ0tfR0UoaW5IZWFkZXItPm5GaWxsZWRMZW4sIHNpemVvZihudW1QYWdlU2FtcGxlcykpOwotICAgICAgICBtZW1jcHkoJm51bVBhZ2VTYW1wbGVzLAotICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIKLSAgICAgICAgICAgICAgICArIGluSGVhZGVyLT5uT2Zmc2V0ICsgaW5IZWFkZXItPm5GaWxsZWRMZW4gLSA0LAotICAgICAgICAgICAgICAgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7Ci0KICAgICAgICAgaWYgKG51bVBhZ2VTYW1wbGVzID49IDApIHsKICAgICAgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gbnVtUGFnZVNhbXBsZXM7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwotICAgICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBzaXplb2YobnVtUGFnZVNhbXBsZXMpOzsKLQogICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKLSAgICAgICAgYnVmLmRhdGEgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwotICAgICAgICBidWYuc2l6ZSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICBidWYuZGF0YSA9IGluSGVhZGVyID8gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCA6IE5VTEw7CisgICAgICAgIGJ1Zi5zaXplID0gaW5IZWFkZXIgPyBpbkhlYWRlci0+bkZpbGxlZExlbiA6IDA7CiAgICAgICAgIGJ1Zi5yZWZjb3VudCA9IDE7CiAgICAgICAgIGJ1Zi5wdHIub3duZXIgPSBOVUxMOwogCkBAIC0zNTEsOSArMzUyLDE1IEBACiAKICAgICAgICAgaW50IG51bUZyYW1lcyA9IDA7CiAKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOwogICAgICAgICBpbnQgZXJyID0gdm9yYmlzX2RzcF9zeW50aGVzaXMobVN0YXRlLCAmcGFjaywgMSk7CiAgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgLy8gRklYTUUgdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGxvZyBzcGFtCisjaWYgIWRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX19hYXJjaDY0X18pCisgICAgICAgICAgICBBTE9HVigidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgJWQiLCBlcnIpOworI2Vsc2UKICAgICAgICAgICAgIEFMT0dXKCJ2b3JiaXNfZHNwX3N5bnRoZXNpcyByZXR1cm5lZCAlZCIsIGVycik7CisjZW5kaWYKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG51bUZyYW1lcyA9IHZvcmJpc19kc3BfcGNtb3V0KAogICAgICAgICAgICAgICAgICAgICBtU3RhdGUsIChpbnQxNl90ICopb3V0SGVhZGVyLT5wQnVmZmVyLApAQCAtMzcwLDEzICszNzcsMTYgQEAKICAgICAgICAgICAgICAgICBBTE9HVigiZGlzY2FyZGluZyAlZCBmcmFtZXMgYXQgZW5kIG9mIHBhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzIC0gbU51bUZyYW1lc0xlZnRPblBhZ2UpOwogICAgICAgICAgICAgICAgIG51bUZyYW1lcyA9IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgICAgICAgICAgICAgIGlmIChtU2F3SW5wdXRFb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlIC09IG51bUZyYW1lczsKICAgICAgICAgfQogCiAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG51bUZyYW1lcyAqIHNpemVvZihpbnQxNl90KSAqIG1WaS0+Y2hhbm5lbHM7CiAgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7Ci0gICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKIAogICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPQogICAgICAgICAgICAgbUFuY2hvclRpbWVVcwpAQCAtMzg0LDExICszOTQsMTMgQEAKIAogICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ICs9IG51bUZyYW1lczsKIAotICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBpbkluZm8gPSBOVUxMOwotICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgfQogCiAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CkBAIC00MjUsNiArNDM3LDggQEAKICAgICAgICAgbVZpID0gTlVMTDsKICAgICB9CiAKKyAgICBtU2F3SW5wdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuaAppbmRleCBjYjYyOGEwLi4xZDAwODE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5oCkBAIC01OSw2ICs1OSw4IEBACiAgICAgaW50NjRfdCBtQW5jaG9yVGltZVVzOwogICAgIGludDY0X3QgbU51bUZyYW1lc091dHB1dDsKICAgICBpbnQzMl90IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgIGJvb2wgbVNhd0lucHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKIAogICAgIGVudW0gewogICAgICAgICBOT05FLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCmluZGV4IDk5MGQ1NTQuLmY5MDY3NTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KQEAgLTMzLDM0ICszMyw3MSBAQAogICAgIHJldHVybiAocHJvcGVydHlfZ2V0KCJyby5rZXJuZWwucWVtdSIsIHByb3AsIE5VTEwpID4gMCk7CiB9CiAKLVNvZnR3YXJlUmVuZGVyZXI6OlNvZnR3YXJlUmVuZGVyZXIoCi0gICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3csIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkKLSAgICA6IG1Db252ZXJ0ZXIoTlVMTCksCitzdGF0aWMgaW50IEFMSUdOKGludCB4LCBpbnQgeSkgeworICAgIC8vIHkgbXVzdCBiZSBhIHBvd2VyIG9mIDIuCisgICAgcmV0dXJuICh4ICsgeSAtIDEpICYgfih5IC0gMSk7Cit9CisKK1NvZnR3YXJlUmVuZGVyZXI6OlNvZnR3YXJlUmVuZGVyZXIoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdykKKyAgICA6IG1Db2xvckZvcm1hdChPTVhfQ09MT1JfRm9ybWF0VW51c2VkKSwKKyAgICAgIG1Db252ZXJ0ZXIoTlVMTCksCiAgICAgICBtWVVWTW9kZShOb25lKSwKLSAgICAgIG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KSB7Ci0gICAgaW50MzJfdCB0bXA7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJnRtcCkpOwotICAgIG1Db2xvckZvcm1hdCA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSl0bXA7CisgICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdyksCisgICAgICBtV2lkdGgoMCksCisgICAgICBtSGVpZ2h0KDApLAorICAgICAgbUNyb3BMZWZ0KDApLAorICAgICAgbUNyb3BUb3AoMCksCisgICAgICBtQ3JvcFJpZ2h0KDApLAorICAgICAgbUNyb3BCb3R0b20oMCksCisgICAgICBtQ3JvcFdpZHRoKDApLAorICAgICAgbUNyb3BIZWlnaHQoMCkgeworfQogCi0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm1XaWR0aCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbUhlaWdodCkpOworU29mdHdhcmVSZW5kZXJlcjo6flNvZnR3YXJlUmVuZGVyZXIoKSB7CisgICAgZGVsZXRlIG1Db252ZXJ0ZXI7CisgICAgbUNvbnZlcnRlciA9IE5VTEw7Cit9CiAKLSAgICBpZiAoIW1ldGEtPmZpbmRSZWN0KAotICAgICAgICAgICAgICAgIGtLZXlDcm9wUmVjdCwKLSAgICAgICAgICAgICAgICAmbUNyb3BMZWZ0LCAmbUNyb3BUb3AsICZtQ3JvcFJpZ2h0LCAmbUNyb3BCb3R0b20pKSB7Ci0gICAgICAgIG1Dcm9wTGVmdCA9IG1Dcm9wVG9wID0gMDsKLSAgICAgICAgbUNyb3BSaWdodCA9IG1XaWR0aCAtIDE7Ci0gICAgICAgIG1Dcm9wQm90dG9tID0gbUhlaWdodCAtIDE7Cit2b2lkIFNvZnR3YXJlUmVuZGVyZXI6OnJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgQ0hFQ0soZm9ybWF0ICE9IE5VTEwpOworCisgICAgaW50MzJfdCBjb2xvckZvcm1hdE5ldzsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0TmV3KSk7CisKKyAgICBpbnQzMl90IHdpZHRoTmV3LCBoZWlnaHROZXc7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZ3aWR0aE5ldykpOworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzbGljZS1oZWlnaHQiLCAmaGVpZ2h0TmV3KSk7CisKKyAgICBpbnQzMl90IGNyb3BMZWZ0TmV3LCBjcm9wVG9wTmV3LCBjcm9wUmlnaHROZXcsIGNyb3BCb3R0b21OZXc7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRSZWN0KAorICAgICAgICAgICAgImNyb3AiLCAmY3JvcExlZnROZXcsICZjcm9wVG9wTmV3LCAmY3JvcFJpZ2h0TmV3LCAmY3JvcEJvdHRvbU5ldykpIHsKKyAgICAgICAgY3JvcExlZnROZXcgPSBjcm9wVG9wTmV3ID0gMDsKKyAgICAgICAgY3JvcFJpZ2h0TmV3ID0gd2lkdGhOZXcgLSAxOworICAgICAgICBjcm9wQm90dG9tTmV3ID0gaGVpZ2h0TmV3IC0gMTsKICAgICB9CiAKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUNvbG9yRm9ybWF0KSA9PSBjb2xvckZvcm1hdE5ldyAmJgorICAgICAgICBtV2lkdGggPT0gd2lkdGhOZXcgJiYKKyAgICAgICAgbUhlaWdodCA9PSBoZWlnaHROZXcgJiYKKyAgICAgICAgbUNyb3BMZWZ0ID09IGNyb3BMZWZ0TmV3ICYmCisgICAgICAgIG1Dcm9wVG9wID09IGNyb3BUb3BOZXcgJiYKKyAgICAgICAgbUNyb3BSaWdodCA9PSBjcm9wUmlnaHROZXcgJiYKKyAgICAgICAgbUNyb3BCb3R0b20gPT0gY3JvcEJvdHRvbU5ldykgeworICAgICAgICAvLyBOb3RoaW5nIGNoYW5nZWQsIG5vIG5lZWQgdG8gcmVzZXQgcmVuZGVyZXIuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ29sb3JGb3JtYXQgPSBzdGF0aWNfY2FzdDxPTVhfQ09MT1JfRk9STUFUVFlQRT4oY29sb3JGb3JtYXROZXcpOworICAgIG1XaWR0aCA9IHdpZHRoTmV3OworICAgIG1IZWlnaHQgPSBoZWlnaHROZXc7CisgICAgbUNyb3BMZWZ0ID0gY3JvcExlZnROZXc7CisgICAgbUNyb3BUb3AgPSBjcm9wVG9wTmV3OworICAgIG1Dcm9wUmlnaHQgPSBjcm9wUmlnaHROZXc7CisgICAgbUNyb3BCb3R0b20gPSBjcm9wQm90dG9tTmV3OworCiAgICAgbUNyb3BXaWR0aCA9IG1Dcm9wUmlnaHQgLSBtQ3JvcExlZnQgKyAxOwogICAgIG1Dcm9wSGVpZ2h0ID0gbUNyb3BCb3R0b20gLSBtQ3JvcFRvcCArIDE7CiAKLSAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKLSAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7Ci0gICAgfQotCiAgICAgaW50IGhhbEZvcm1hdDsKICAgICBzaXplX3QgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKIApAQCAtMTA2LDEyICsxNDMsMjkgQEAKICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVykpOwogCiAgICAgLy8gV2lkdGggbXVzdCBiZSBtdWx0aXBsZSBvZiAzMj8/PwotICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoCisgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKAogICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksCiAgICAgICAgICAgICAgICAgYnVmV2lkdGgsCi0gICAgICAgICAgICAgICAgYnVmSGVpZ2h0LAorICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCkpOworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KAorICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksCiAgICAgICAgICAgICAgICAgaGFsRm9ybWF0KSk7CiAKKyAgICAvLyBOT1RFOiBuYXRpdmUgd2luZG93IHVzZXMgZXh0ZW5kZWQgcmlnaHQtYm90dG9tIGNvb3JkaW5hdGUKKyAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgY3JvcDsKKyAgICBjcm9wLmxlZnQgPSBtQ3JvcExlZnQ7CisgICAgY3JvcC50b3AgPSBtQ3JvcFRvcDsKKyAgICBjcm9wLnJpZ2h0ID0gbUNyb3BSaWdodCArIDE7CisgICAgY3JvcC5ib3R0b20gPSBtQ3JvcEJvdHRvbSArIDE7CisgICAgQUxPR1YoInNldHRpbmcgY3JvcDogWyVkLCAlZCwgJWQsICVkXSBmb3Igc2l6ZSBbJXp1LCAlenVdIiwKKyAgICAgICAgICBjcm9wLmxlZnQsIGNyb3AudG9wLCBjcm9wLnJpZ2h0LCBjcm9wLmJvdHRvbSwgYnVmV2lkdGgsIGJ1ZkhlaWdodCk7CisKKyAgICBDSEVDS19FUSgwLCBuYXRpdmVfd2luZG93X3NldF9jcm9wKG1OYXRpdmVXaW5kb3cuZ2V0KCksICZjcm9wKSk7CisKKyAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKKyAgICB9CiAgICAgdWludDMyX3QgdHJhbnNmb3JtOwogICAgIHN3aXRjaCAocm90YXRpb25EZWdyZWVzKSB7CiAgICAgICAgIGNhc2UgMDogdHJhbnNmb3JtID0gMDsgYnJlYWs7CkBAIC0xMjEsMjQgKzE3NSwxNSBAQAogICAgICAgICBkZWZhdWx0OiB0cmFuc2Zvcm0gPSAwOyBicmVhazsKICAgICB9CiAKLSAgICBpZiAodHJhbnNmb3JtKSB7Ci0gICAgICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKAotICAgICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCB0cmFuc2Zvcm0pKTsKLSAgICB9Ci19Ci0KLVNvZnR3YXJlUmVuZGVyZXI6On5Tb2Z0d2FyZVJlbmRlcmVyKCkgewotICAgIGRlbGV0ZSBtQ29udmVydGVyOwotICAgIG1Db252ZXJ0ZXIgPSBOVUxMOwotfQotCi1zdGF0aWMgaW50IEFMSUdOKGludCB4LCBpbnQgeSkgewotICAgIC8vIHkgbXVzdCBiZSBhIHBvd2VyIG9mIDIuCi0gICAgcmV0dXJuICh4ICsgeSAtIDEpICYgfih5IC0gMSk7CisgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgdHJhbnNmb3JtKSk7CiB9CiAKIHZvaWQgU29mdHdhcmVSZW5kZXJlcjo6cmVuZGVyKAotICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqcGxhdGZvcm1Qcml2YXRlKSB7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQ2NF90IHRpbWVzdGFtcE5zLAorICAgICAgICB2b2lkKiAvKnBsYXRmb3JtUHJpdmF0ZSovLCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgeworICAgIHJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGZvcm1hdCk7CisKICAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWY7CiAgICAgaW50IGVycjsKICAgICBpZiAoKGVyciA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobU5hdGl2ZVdpbmRvdy5nZXQoKSwKQEAgLTIzNyw2ICsyODIsMTEgQEAKIHNraXBfY29weWluZzoKICAgICBDSEVDS19FUSgwLCBtYXBwZXIudW5sb2NrKGJ1Zi0+aGFuZGxlKSk7CiAKKyAgICBpZiAoKGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1OYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICB0aW1lc3RhbXBOcykpICE9IDApIHsKKyAgICAgICAgQUxPR1coIlN1cmZhY2U6OnNldF9idWZmZXJzX3RpbWVzdGFtcCByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CisgICAgfQorCiAgICAgaWYgKChlcnIgPSBtTmF0aXZlV2luZG93LT5xdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCBidWYsCiAgICAgICAgICAgICAtMSkpICE9IDApIHsKICAgICAgICAgQUxPR1coIlN1cmZhY2U6OnF1ZXVlQnVmZmVyIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OTkwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sCkBAIC0wLDAgKzEsOTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW5jbHVkZWQ+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm1wMy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcGVnIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC0zMjAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5hbXJuYi5kZWNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNDc1MC0xMjIwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjE2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NjAwLTIzODUwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjczNTAsODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5nNzExLmFsYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1hbGF3Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjQwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5nNzExLm1sYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1tbGF3Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjQwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIgdHlwZT0iYXVkaW8vdm9yYmlzIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCw5NjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMzIwMDAtNTAwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUub3B1cy5kZWNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjYwMDAtNTEwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUucmF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL3JhdyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtOTYwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0RlY29kZXJzPgorICAgIDxFbmNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5hYWMuZW5jb2RlciIgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtOTYwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuYW1ybmIuZW5jb2RlciIgdHlwZT0iYXVkaW8vM2dwcCI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjQ3NTAtMTIyMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuYW1yd2IuZW5jb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTYwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY2MDAtMjM4NTAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuZmxhYy5lbmNvZGVyIiB0eXBlPSJhdWRpby9mbGFjIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMS02NTUzNTAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjEwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY29tcGxleGl0eSIgcmFuZ2U9IjAtOCIgIGRlZmF1bHQ9IjUiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ1EiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0VuY29kZXJzPgorPC9JbmNsdWRlZD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV90ZWxlcGhvbnkueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3RlbGVwaG9ueS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkOTBkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV90ZWxlcGhvbnkueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW5jbHVkZWQ+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmdzbS5kZWNvZGVyIiB0eXBlPSJhdWRpby9nc20iPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxMzAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiZWYzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwKQEAgLTAsMCArMSwxMDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW5jbHVkZWQ+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm1wZWc0LmRlY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZVNpbXBsZSA6IExldmVsMyAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxMi0xMTg4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0zODQwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDMwLCBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1CisgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVJU1dWMiA6IExldmVsMzAsIFByb2ZpbGVJU1dWMiA6IExldmVsNDUgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMzg0MDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDUxIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS05ODMwNDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIgdHlwZT0idmlkZW8vaGV2YyI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IE1haW5UaWVyTGV2ZWw1MSAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSI4eDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTEzOTI2NCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUudnA4LmRlY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xMDAwMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS52cDkuZGVjb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTUwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKworICAgIDxFbmNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmVuY29kZXIiIHR5cGU9InZpZGVvLzNncHAiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0NSAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE3NngxNDQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTI4MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5lbmNvZGVyIiB0eXBlPSJ2aWRlby9hdmMiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWwyIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iODk2eDg5NiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTExODgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIwMDAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5tcGVnNC5lbmNvZGVyIiB0eXBlPSJ2aWRlby9tcDR2LWVzIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVDb3JlIDogTGV2ZWwyIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTc2eDE0NCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxMi0xNDg1IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTY0MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUudnA4LmVuY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRW5jb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5jcHAKaW5kZXggNTQ5OWMzMi4uYmViNWNjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuY3BwCkBAIC0yNyw2ICsyNyw5IEBACiAgICAgICBtTnVtQml0c0xlZnQoMCkgewogfQogCitBQml0UmVhZGVyOjp+QUJpdFJlYWRlcigpIHsKK30KKwogdm9pZCBBQml0UmVhZGVyOjpmaWxsUmVzZXJ2b2lyKCkgewogICAgIENIRUNLX0dUKG1TaXplLCAwdSk7CiAKQEAgLTk5LDQgKzEwMiw2OSBAQAogICAgIHJldHVybiBtRGF0YSAtIChtTnVtQml0c0xlZnQgKyA3KSAvIDg7CiB9CiAKK05BTEJpdFJlYWRlcjo6TkFMQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKQorICAgIDogQUJpdFJlYWRlcihkYXRhLCBzaXplKSwKKyAgICAgIG1OdW1aZXJvcygwKSB7Cit9CisKK2Jvb2wgTkFMQml0UmVhZGVyOjphdExlYXN0TnVtQml0c0xlZnQoc2l6ZV90IG4pIGNvbnN0IHsKKyAgICAvLyBjaGVjayBhZ2FpbnN0IHJhdyBzaXplIGFuZCByZXNlcnZvaXIgYml0cyBmaXJzdAorICAgIHNpemVfdCBudW1CaXRzID0gbnVtQml0c0xlZnQoKTsKKyAgICBpZiAobiA+IG51bUJpdHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNzaXplX3QgbnVtQml0c1JlbWFpbmluZyA9IG4gLSBtTnVtQml0c0xlZnQ7CisKKyAgICBzaXplX3Qgc2l6ZSA9IG1TaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBtRGF0YTsKKyAgICBpbnQzMl90IG51bVplcm9zID0gbU51bVplcm9zOworICAgIHdoaWxlIChzaXplID4gMCAmJiBudW1CaXRzUmVtYWluaW5nID4gMCkgeworICAgICAgICBib29sIGlzRW11bGF0aW9uUHJldmVudGlvbkJ5dGUgPSAobnVtWmVyb3MgPj0gMiAmJiAqZGF0YSA9PSAzKTsKKworICAgICAgICBpZiAoKmRhdGEgPT0gMCkgeworICAgICAgICAgICAgKytudW1aZXJvczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bVplcm9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNFbXVsYXRpb25QcmV2ZW50aW9uQnl0ZSkgeworICAgICAgICAgICAgbnVtQml0c1JlbWFpbmluZyAtPSA4OworICAgICAgICB9CisKKyAgICAgICAgKytkYXRhOworICAgICAgICAtLXNpemU7CisgICAgfQorCisgICAgcmV0dXJuIChudW1CaXRzUmVtYWluaW5nIDw9IDApOworfQorCit2b2lkIE5BTEJpdFJlYWRlcjo6ZmlsbFJlc2Vydm9pcigpIHsKKyAgICBDSEVDS19HVChtU2l6ZSwgMHUpOworCisgICAgbVJlc2Vydm9pciA9IDA7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChtU2l6ZSA+IDAgJiYgaSA8IDQpIHsKKyAgICAgICAgYm9vbCBpc0VtdWxhdGlvblByZXZlbnRpb25CeXRlID0gKG1OdW1aZXJvcyA+PSAyICYmICptRGF0YSA9PSAzKTsKKworICAgICAgICBpZiAoKm1EYXRhID09IDApIHsKKyAgICAgICAgICAgICsrbU51bVplcm9zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU51bVplcm9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNraXAgZW11bGF0aW9uX3ByZXZlbnRpb25fdGhyZWVfYnl0ZQorICAgICAgICBpZiAoIWlzRW11bGF0aW9uUHJldmVudGlvbkJ5dGUpIHsKKyAgICAgICAgICAgIG1SZXNlcnZvaXIgPSAobVJlc2Vydm9pciA8PCA4KSB8ICptRGF0YTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorCisgICAgICAgICsrbURhdGE7CisgICAgICAgIC0tbVNpemU7CisgICAgfQorCisgICAgbU51bUJpdHNMZWZ0ID0gOCAqIGk7CisgICAgbVJlc2Vydm9pciA8PD0gMzIgLSBtTnVtQml0c0xlZnQ7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcAppbmRleCA1ZjVjOTc3Li40OTEzZmQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAKQEAgLTE5LDExICsxOSwxMyBAQAogI2luY2x1ZGUgIkFEZWJ1Zy5oIgogI2luY2x1ZGUgIkFMb29wZXIuaCIKICNpbmNsdWRlICJBTWVzc2FnZS5oIgorI2luY2x1ZGUgIk1lZGlhQnVmZmVyQmFzZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEFCdWZmZXI6OkFCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KQotICAgIDogbVJhbmdlT2Zmc2V0KDApLAorICAgIDogbU1lZGlhQnVmZmVyQmFzZShOVUxMKSwKKyAgICAgIG1SYW5nZU9mZnNldCgwKSwKICAgICAgIG1JbnQzMkRhdGEoMCksCiAgICAgICBtT3duc0RhdGEodHJ1ZSkgewogICAgIG1EYXRhID0gbWFsbG9jKGNhcGFjaXR5KTsKQEAgLTM3LDcgKzM5LDggQEAKIH0KIAogQUJ1ZmZlcjo6QUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3QgY2FwYWNpdHkpCi0gICAgOiBtRGF0YShkYXRhKSwKKyAgICA6IG1NZWRpYUJ1ZmZlckJhc2UoTlVMTCksCisgICAgICBtRGF0YShkYXRhKSwKICAgICAgIG1DYXBhY2l0eShjYXBhY2l0eSksCiAgICAgICBtUmFuZ2VPZmZzZXQoMCksCiAgICAgICBtUmFuZ2VMZW5ndGgoY2FwYWNpdHkpLApAQCAtNDUsNiArNDgsMTQgQEAKICAgICAgIG1Pd25zRGF0YShmYWxzZSkgewogfQogCisvLyBzdGF0aWMKK3NwPEFCdWZmZXI+IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY2FwYWNpdHkpCit7CisgICAgc3A8QUJ1ZmZlcj4gcmVzID0gbmV3IEFCdWZmZXIoY2FwYWNpdHkpOworICAgIG1lbWNweShyZXMtPmRhdGEoKSwgZGF0YSwgY2FwYWNpdHkpOworICAgIHJldHVybiByZXM7Cit9CisKIEFCdWZmZXI6On5BQnVmZmVyKCkgewogICAgIGlmIChtT3duc0RhdGEpIHsKICAgICAgICAgaWYgKG1EYXRhICE9IE5VTEwpIHsKQEAgLTU2LDYgKzY3LDggQEAKICAgICBpZiAobUZhcmV3ZWxsICE9IE5VTEwpIHsKICAgICAgICAgbUZhcmV3ZWxsLT5wb3N0KCk7CiAgICAgfQorCisgICAgc2V0TWVkaWFCdWZmZXJCYXNlKE5VTEwpOwogfQogCiB2b2lkIEFCdWZmZXI6OnNldFJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CkBAIC03Nyw1ICs5MCwxOSBAQAogICAgIHJldHVybiBtTWV0YTsKIH0KIAorTWVkaWFCdWZmZXJCYXNlICpBQnVmZmVyOjpnZXRNZWRpYUJ1ZmZlckJhc2UoKSB7CisgICAgaWYgKG1NZWRpYUJ1ZmZlckJhc2UgIT0gTlVMTCkgeworICAgICAgICBtTWVkaWFCdWZmZXJCYXNlLT5hZGRfcmVmKCk7CisgICAgfQorICAgIHJldHVybiBtTWVkaWFCdWZmZXJCYXNlOworfQorCit2b2lkIEFCdWZmZXI6OnNldE1lZGlhQnVmZmVyQmFzZShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmZmVyKSB7CisgICAgaWYgKG1NZWRpYUJ1ZmZlckJhc2UgIT0gTlVMTCkgeworICAgICAgICBtTWVkaWFCdWZmZXJCYXNlLT5yZWxlYXNlKCk7CisgICAgfQorICAgIG1NZWRpYUJ1ZmZlckJhc2UgPSBtZWRpYUJ1ZmZlcjsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKaW5kZXggZjdhMDBkOC4uNWY3YzcwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCkBAIC01MSw3ICs1MSw3IEBACiBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjp+QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpIHsKIH0KIAotdm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewordm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpoYW5kbGVNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3A8QVN0YXRlPiBzYXZlID0gbVN0YXRlOwogCiAgICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAppbmRleCBlYmY5ZDhkLi44OGIxYzkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKQEAgLTY4LDE0ICs2OCwxNCBAQAogCiBBTG9vcGVyOjpBTG9vcGVyKCkKICAgICA6IG1SdW5uaW5nTG9jYWxseShmYWxzZSkgeworICAgIC8vIGNsZWFuIHVwIHN0YWxlIEFIYW5kbGVycy4gRG9pbmcgaXQgaGVyZSBpbnN0ZWFkIG9mIGluIHRoZSBkZXN0cnVjdG9yIGF2b2lkcworICAgIC8vIHRoZSBzaWRlIGVmZmVjdCBvZiBvYmplY3RzIGJlaW5nIGRlbGV0ZWQgZnJvbSB0aGUgdW5yZWdpc3RlciBmdW5jdGlvbiByZWN1cnNpdmVseS4KKyAgICBnTG9vcGVyUm9zdGVyLnVucmVnaXN0ZXJTdGFsZUhhbmRsZXJzKCk7CiB9CiAKIEFMb29wZXI6On5BTG9vcGVyKCkgewogICAgIHN0b3AoKTsKLQotICAgIC8vIFNpbmNlIHRoaXMgbG9vcGVyIGlzICJkZWFkIiAob3IgYXMgZ29vZCBhcyBkZWFkIGJ5IG5vdyksCi0gICAgLy8gaGF2ZSBBTG9vcGVyUm9zdGVyIHVucmVnaXN0ZXIgYW55IGhhbmRsZXJzIHN0aWxsIHJlZ2lzdGVyZWQgZm9yIGl0LgotICAgIGdMb29wZXJSb3N0ZXIudW5yZWdpc3RlclN0YWxlSGFuZGxlcnMoKTsKKyAgICAvLyBzdGFsZSBBSGFuZGxlcnMgYXJlIG5vdyBjbGVhbmVkIHVwIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgbmV4dCBBTG9vcGVyIHRvIGNvbWUgYWxvbmcKIH0KIAogdm9pZCBBTG9vcGVyOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCmluZGV4IDBjMTgxZmYuLmUwZGM3NjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcApAQCAtNzIsNTAgKzcyLDQwIEBACiB9CiAKIHZvaWQgQUxvb3BlclJvc3Rlcjo6dW5yZWdpc3RlclN0YWxlSGFuZGxlcnMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSBtSGFuZGxlcnMuc2l6ZSgpOyBpLS0gPiAwOykgewotICAgICAgICBjb25zdCBIYW5kbGVySW5mbyAmaW5mbyA9IG1IYW5kbGVycy52YWx1ZUF0KGkpOworICAgIFZlY3RvcjxzcDxBTG9vcGVyPiA+IGFjdGl2ZUxvb3BlcnM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGluZm8ubUxvb3Blci5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChsb29wZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1YoIlVucmVnaXN0ZXJpbmcgc3RhbGUgaGFuZGxlciAlZCIsIG1IYW5kbGVycy5rZXlBdChpKSk7Ci0gICAgICAgICAgICBtSGFuZGxlcnMucmVtb3ZlSXRlbXNBdChpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG1IYW5kbGVycy5zaXplKCk7IGktLSA+IDA7KSB7CisgICAgICAgICAgICBjb25zdCBIYW5kbGVySW5mbyAmaW5mbyA9IG1IYW5kbGVycy52YWx1ZUF0KGkpOworCisgICAgICAgICAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBpbmZvLm1Mb29wZXIucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlVucmVnaXN0ZXJpbmcgc3RhbGUgaGFuZGxlciAlZCIsIG1IYW5kbGVycy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXJzLnJlbW92ZUl0ZW1zQXQoaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgJ2xvb3BlcicgbWlnaHQgYmUgdGhlIG9ubHkgc3A8PiBrZWVwaW5nCisgICAgICAgICAgICAgICAgLy8gdGhlIG9iamVjdCBhbGl2ZS4gVG8gcHJldmVudCBpdCBmcm9tIGdvaW5nIG91dCBvZiBzY29wZQorICAgICAgICAgICAgICAgIC8vIGFuZCBoYXZpbmcgfkFMb29wZXIgY2FsbCB0aGlzIG1ldGhvZCBhZ2FpbiByZWN1cnNpdmVseQorICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRlYWRsb2NraW5nIGJlY2F1c2Ugb2YgdGhlIEF1dG9sb2NrIGFib3ZlLCBhZGQKKyAgICAgICAgICAgICAgICAvLyBpdCB0byBhIFZlY3RvciB3aGljaCB3aWxsIGdvIG91dCBvZiBzY29wZSBhZnRlciB0aGUgbG9jaworICAgICAgICAgICAgICAgIC8vIGhhcyBiZWVuIHJlbGVhc2VkLgorICAgICAgICAgICAgICAgIGFjdGl2ZUxvb3BlcnMuYWRkKGxvb3Blcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHN0YXR1c190IEFMb29wZXJSb3N0ZXI6OnBvc3RNZXNzYWdlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gcG9zdE1lc3NhZ2VfbChtc2csIGRlbGF5VXMpOwotfQogCi1zdGF0dXNfdCBBTG9vcGVyUm9zdGVyOjpwb3N0TWVzc2FnZV9sKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1IYW5kbGVycy5pbmRleE9mS2V5KG1zZy0+dGFyZ2V0KCkpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHBvc3QgbWVzc2FnZSAnJXMnLiBUYXJnZXQgaGFuZGxlciBub3QgcmVnaXN0ZXJlZC4iLAotICAgICAgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIGNvbnN0IEhhbmRsZXJJbmZvICZpbmZvID0gbUhhbmRsZXJzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gaW5mby5tTG9vcGVyLnByb21vdGUoKTsKKyAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBmaW5kTG9vcGVyKG1zZy0+dGFyZ2V0KCkpOwogCiAgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gcG9zdCBtZXNzYWdlLiAiCi0gICAgICAgICAgICAgIlRhcmdldCBoYW5kbGVyICVkIHN0aWxsIHJlZ2lzdGVyZWQsIGJ1dCBvYmplY3QgZ29uZS4iLAotICAgICAgICAgICAgIG1zZy0+dGFyZ2V0KCkpOwotCi0gICAgICAgIG1IYW5kbGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CiAgICAgfQotCiAgICAgbG9vcGVyLT5wb3N0KG1zZywgZGVsYXlVcyk7Ci0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE2OSwxOCArMTU5LDIzIEBACiAKIHN0YXR1c190IEFMb29wZXJSb3N0ZXI6OnBvc3RBbmRBd2FpdFJlc3BvbnNlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSkgeworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGZpbmRMb29wZXIobXNnLT50YXJnZXQoKSk7CisKKyAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCB0byBwb3N0IG1lc3NhZ2UuICIKKyAgICAgICAgICAgICAgICAiVGFyZ2V0IGhhbmRsZXIgJWQgc3RpbGwgcmVnaXN0ZXJlZCwgYnV0IG9iamVjdCBnb25lLiIsCisgICAgICAgICAgICAgICAgbXNnLT50YXJnZXQoKSk7CisgICAgICAgIHJlc3BvbnNlLT5jbGVhcigpOworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgdWludDMyX3QgcmVwbHlJRCA9IG1OZXh0UmVwbHlJRCsrOwogCiAgICAgbXNnLT5zZXRJbnQzMigicmVwbHlJRCIsIHJlcGx5SUQpOwogCi0gICAgc3RhdHVzX3QgZXJyID0gcG9zdE1lc3NhZ2VfbChtc2csIDAgLyogZGVsYXlVcyAqLyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJlc3BvbnNlLT5jbGVhcigpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KKyAgICBsb29wZXItPnBvc3QobXNnLCAwIC8qIGRlbGF5VXMgKi8pOwogCiAgICAgc3NpemVfdCBpbmRleDsKICAgICB3aGlsZSAoKGluZGV4ID0gbVJlcGxpZXMuaW5kZXhPZktleShyZXBseUlEKSkgPCAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCmluZGV4IDEzMDBmMTYuLjI2YmVhMmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCkBAIC0xNCw2ICsxNCwxMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJBTWVzc2FnZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBEVU1QX1NUQVRTCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCiAjaW5jbHVkZSAiQU1lc3NhZ2UuaCIKIAogI2luY2x1ZGUgPGN0eXBlLmg+CkBAIC02MCwxMiArNjUsMTQgQEAKIHZvaWQgQU1lc3NhZ2U6OmNsZWFyKCkgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUl0ZW1zOyArK2kpIHsKICAgICAgICAgSXRlbSAqaXRlbSA9ICZtSXRlbXNbaV07Ci0gICAgICAgIGZyZWVJdGVtKGl0ZW0pOworICAgICAgICBkZWxldGVbXSBpdGVtLT5tTmFtZTsKKyAgICAgICAgaXRlbS0+bU5hbWUgPSBOVUxMOworICAgICAgICBmcmVlSXRlbVZhbHVlKGl0ZW0pOwogICAgIH0KICAgICBtTnVtSXRlbXMgPSAwOwogfQogCi12b2lkIEFNZXNzYWdlOjpmcmVlSXRlbShJdGVtICppdGVtKSB7Cit2b2lkIEFNZXNzYWdlOjpmcmVlSXRlbVZhbHVlKEl0ZW0gKml0ZW0pIHsKICAgICBzd2l0Y2ggKGl0ZW0tPm1UeXBlKSB7CiAgICAgICAgIGNhc2Uga1R5cGVTdHJpbmc6CiAgICAgICAgIHsKQEAgLTg4LDI1ICs5NSw4NSBAQAogICAgIH0KIH0KIAotQU1lc3NhZ2U6Okl0ZW0gKkFNZXNzYWdlOjphbGxvY2F0ZUl0ZW0oY29uc3QgY2hhciAqbmFtZSkgewotICAgIG5hbWUgPSBBQXRvbWl6ZXI6OkF0b21pemUobmFtZSk7CisjaWZkZWYgRFVNUF9TVEFUUworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAKLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGkgPCBtTnVtSXRlbXMgJiYgbUl0ZW1zW2ldLm1OYW1lICE9IG5hbWUpIHsKLSAgICAgICAgKytpOworTXV0ZXggZ0xvY2s7CitzdGF0aWMgaW50MzJfdCBnRmluZEl0ZW1DYWxscyA9IDE7CitzdGF0aWMgaW50MzJfdCBnRHVwQ2FsbHMgPSAxOworc3RhdGljIGludDMyX3QgZ0F2ZXJhZ2VOdW1JdGVtcyA9IDA7CitzdGF0aWMgaW50MzJfdCBnQXZlcmFnZU51bUNoZWNrcyA9IDA7CitzdGF0aWMgaW50MzJfdCBnQXZlcmFnZU51bU1lbUNoZWNrcyA9IDA7CitzdGF0aWMgaW50MzJfdCBnQXZlcmFnZUR1cEl0ZW1zID0gMDsKK3N0YXRpYyBpbnQzMl90IGdMYXN0Q2hlY2tlZCA9IC0xOworCitzdGF0aWMgdm9pZCByZXBvcnRTdGF0cygpIHsKKyAgICBpbnQzMl90IHRpbWUgPSAoQUxvb3Blcjo6R2V0Tm93VXMoKSAvIDEwMDApOworICAgIGlmICh0aW1lIC8gMTAwMCAhPSBnTGFzdENoZWNrZWQgLyAxMDAwKSB7CisgICAgICAgIGdMYXN0Q2hlY2tlZCA9IHRpbWU7CisgICAgICAgIEFMT0dJKCJjYWxsZWQgZmluZEl0ZW1JeCAlenUgdGltZXMgKGZvciBsZW49JS4xZiBpPSUuMWYvJS4xZiBtZW0pIGR1cCAlenUgdGltZXMgKGZvciBsZW49JS4xZikiLAorICAgICAgICAgICAgICAgIGdGaW5kSXRlbUNhbGxzLAorICAgICAgICAgICAgICAgIGdBdmVyYWdlTnVtSXRlbXMgLyAoZmxvYXQpZ0ZpbmRJdGVtQ2FsbHMsCisgICAgICAgICAgICAgICAgZ0F2ZXJhZ2VOdW1DaGVja3MgLyAoZmxvYXQpZ0ZpbmRJdGVtQ2FsbHMsCisgICAgICAgICAgICAgICAgZ0F2ZXJhZ2VOdW1NZW1DaGVja3MgLyAoZmxvYXQpZ0ZpbmRJdGVtQ2FsbHMsCisgICAgICAgICAgICAgICAgZ0R1cENhbGxzLAorICAgICAgICAgICAgICAgIGdBdmVyYWdlRHVwSXRlbXMgLyAoZmxvYXQpZ0R1cENhbGxzKTsKKyAgICAgICAgZ0ZpbmRJdGVtQ2FsbHMgPSBnRHVwQ2FsbHMgPSAxOworICAgICAgICBnQXZlcmFnZU51bUl0ZW1zID0gZ0F2ZXJhZ2VOdW1DaGVja3MgPSBnQXZlcmFnZU51bU1lbUNoZWNrcyA9IGdBdmVyYWdlRHVwSXRlbXMgPSAwOworICAgICAgICBnTGFzdENoZWNrZWQgPSB0aW1lOwogICAgIH0KK30KKyNlbmRpZgogCitpbmxpbmUgc2l6ZV90IEFNZXNzYWdlOjpmaW5kSXRlbUluZGV4KGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pIGNvbnN0IHsKKyNpZmRlZiBEVU1QX1NUQVRTCisgICAgc2l6ZV90IG1lbWNoZWNrcyA9IDA7CisjZW5kaWYKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yICg7IGkgPCBtTnVtSXRlbXM7IGkrKykgeworICAgICAgICBpZiAobGVuICE9IG1JdGVtc1tpXS5tTmFtZUxlbmd0aCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNpZmRlZiBEVU1QX1NUQVRTCisgICAgICAgICsrbWVtY2hlY2tzOworI2VuZGlmCisgICAgICAgIGlmICghbWVtY21wKG1JdGVtc1tpXS5tTmFtZSwgbmFtZSwgbGVuKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgRFVNUF9TVEFUUworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICAgICAgKytnRmluZEl0ZW1DYWxsczsKKyAgICAgICAgZ0F2ZXJhZ2VOdW1JdGVtcyArPSBtTnVtSXRlbXM7CisgICAgICAgIGdBdmVyYWdlTnVtTWVtQ2hlY2tzICs9IG1lbWNoZWNrczsKKyAgICAgICAgZ0F2ZXJhZ2VOdW1DaGVja3MgKz0gaTsKKyAgICAgICAgcmVwb3J0U3RhdHMoKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gaTsKK30KKworLy8gYXNzdW1lcyBpdGVtJ3MgbmFtZSB3YXMgdW5pbml0aWFsaXplZCBvciBOVUxMCit2b2lkIEFNZXNzYWdlOjpJdGVtOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pIHsKKyAgICBtTmFtZUxlbmd0aCA9IGxlbjsKKyAgICBtTmFtZSA9IG5ldyBjaGFyW2xlbiArIDFdOworICAgIG1lbWNweSgodm9pZCopbU5hbWUsIG5hbWUsIGxlbiArIDEpOworfQorCitBTWVzc2FnZTo6SXRlbSAqQU1lc3NhZ2U6OmFsbG9jYXRlSXRlbShjb25zdCBjaGFyICpuYW1lKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICBzaXplX3QgaSA9IGZpbmRJdGVtSW5kZXgobmFtZSwgbGVuKTsKICAgICBJdGVtICppdGVtOwogCiAgICAgaWYgKGkgPCBtTnVtSXRlbXMpIHsKICAgICAgICAgaXRlbSA9ICZtSXRlbXNbaV07Ci0gICAgICAgIGZyZWVJdGVtKGl0ZW0pOworICAgICAgICBmcmVlSXRlbVZhbHVlKGl0ZW0pOwogICAgIH0gZWxzZSB7CiAgICAgICAgIENIRUNLKG1OdW1JdGVtcyA8IGtNYXhOdW1JdGVtcyk7CiAgICAgICAgIGkgPSBtTnVtSXRlbXMrKzsKICAgICAgICAgaXRlbSA9ICZtSXRlbXNbaV07Ci0KLSAgICAgICAgaXRlbS0+bU5hbWUgPSBuYW1lOworICAgICAgICBpdGVtLT5zZXROYW1lKG5hbWUsIGxlbik7CiAgICAgfQogCiAgICAgcmV0dXJuIGl0ZW07CkBAIC0xMTQsMTkgKzE4MSwyMCBAQAogCiBjb25zdCBBTWVzc2FnZTo6SXRlbSAqQU1lc3NhZ2U6OmZpbmRJdGVtKAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBUeXBlIHR5cGUpIGNvbnN0IHsKLSAgICBuYW1lID0gQUF0b21pemVyOjpBdG9taXplKG5hbWUpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSXRlbXM7ICsraSkgeworICAgIHNpemVfdCBpID0gZmluZEl0ZW1JbmRleChuYW1lLCBzdHJsZW4obmFtZSkpOworICAgIGlmIChpIDwgbU51bUl0ZW1zKSB7CiAgICAgICAgIGNvbnN0IEl0ZW0gKml0ZW0gPSAmbUl0ZW1zW2ldOworICAgICAgICByZXR1cm4gaXRlbS0+bVR5cGUgPT0gdHlwZSA/IGl0ZW0gOiBOVUxMOwogCi0gICAgICAgIGlmIChpdGVtLT5tTmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlbS0+bVR5cGUgPT0gdHlwZSA/IGl0ZW0gOiBOVUxMOwotICAgICAgICB9CiAgICAgfQotCiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK2Jvb2wgQU1lc3NhZ2U6OmNvbnRhaW5zKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0IHsKKyAgICBzaXplX3QgaSA9IGZpbmRJdGVtSW5kZXgobmFtZSwgc3RybGVuKG5hbWUpKTsKKyAgICByZXR1cm4gaSA8IG1OdW1JdGVtczsKK30KKwogI2RlZmluZSBCQVNJQ19UWVBFKE5BTUUsRklFTEROQU1FLFRZUEVOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogdm9pZCBBTWVzc2FnZTo6c2V0IyNOQU1FKGNvbnN0IGNoYXIgKm5hbWUsIFRZUEVOQU1FIHZhbHVlKSB7ICAgICAgICAgICAgXAogICAgIEl0ZW0gKml0ZW0gPSBhbGxvY2F0ZUl0ZW0obmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTYwLDYgKzIyOCwxMSBAQAogICAgIGl0ZW0tPnUuc3RyaW5nVmFsdWUgPSBuZXcgQVN0cmluZyhzLCBsZW4gPCAwID8gc3RybGVuKHMpIDogbGVuKTsKIH0KIAordm9pZCBBTWVzc2FnZTo6c2V0U3RyaW5nKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBBU3RyaW5nICZzKSB7CisgICAgc2V0U3RyaW5nKG5hbWUsIHMuY19zdHIoKSwgcy5zaXplKCkpOworfQorCiB2b2lkIEFNZXNzYWdlOjpzZXRPYmplY3RJbnRlcm5hbCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8UmVmQmFzZT4gJm9iaiwgVHlwZSB0eXBlKSB7CiAgICAgSXRlbSAqaXRlbSA9IGFsbG9jYXRlSXRlbShuYW1lKTsKQEAgLTI3OCwxMSArMzUxLDIwIEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShtV2hhdCwgbVRhcmdldCk7CiAgICAgbXNnLT5tTnVtSXRlbXMgPSBtTnVtSXRlbXM7CiAKKyNpZmRlZiBEVU1QX1NUQVRTCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgICAgICArK2dEdXBDYWxsczsKKyAgICAgICAgZ0F2ZXJhZ2VEdXBJdGVtcyArPSBtTnVtSXRlbXM7CisgICAgICAgIHJlcG9ydFN0YXRzKCk7CisgICAgfQorI2VuZGlmCisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JdGVtczsgKytpKSB7CiAgICAgICAgIGNvbnN0IEl0ZW0gKmZyb20gPSAmbUl0ZW1zW2ldOwogICAgICAgICBJdGVtICp0byA9ICZtc2ctPm1JdGVtc1tpXTsKIAotICAgICAgICB0by0+bU5hbWUgPSBmcm9tLT5tTmFtZTsKKyAgICAgICAgdG8tPnNldE5hbWUoZnJvbS0+bU5hbWUsIGZyb20tPm1OYW1lTGVuZ3RoKTsKICAgICAgICAgdG8tPm1UeXBlID0gZnJvbS0+bVR5cGU7CiAKICAgICAgICAgc3dpdGNoIChmcm9tLT5tVHlwZSkgewpAQCAtNDAzLDcgKzQ4NSw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gc3RhdGljX2Nhc3Q8QUJ1ZmZlciAqPihpdGVtLnUucmVmVmFsdWUpOwogCi0gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMICYmIGJ1ZmZlci0+c2l6ZSgpIDw9IDY0KSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMICYmIGJ1ZmZlci0+ZGF0YSgpICE9IE5VTEwgJiYgYnVmZmVyLT5zaXplKCkgPD0gNjQpIHsKICAgICAgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKCJCdWZmZXIgJXMgPSB7XG4iLCBpdGVtLm1OYW1lKTsKICAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcChidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIGluZGVudCArIDQsICZ0bXApOwogICAgICAgICAgICAgICAgICAgICBhcHBlbmRJbmRlbnQoJnRtcCwgaW5kZW50ICsgMik7CkBAIC00NjgsOCArNTUwLDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaXRlbS0+bU5hbWUgPSBBQXRvbWl6ZXI6OkF0b21pemUobmFtZSk7CiAgICAgICAgIGl0ZW0tPm1UeXBlID0gc3RhdGljX2Nhc3Q8VHlwZT4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICAgICAgLy8gc2V0TmFtZSgpIGhhcHBlbnMgYmVsb3cgc28gdGhhdCB3ZSBkb24ndCBsZWFrIG1lbW9yeSB3aGVuIHBhcnNpbmcKKyAgICAgICAgLy8gaXMgYWJvcnRlZCBpbiB0aGUgbWlkZGxlLgogICAgICAgICBzd2l0Y2ggKGl0ZW0tPm1UeXBlKSB7CiAgICAgICAgICAgICBjYXNlIGtUeXBlSW50MzI6CiAgICAgICAgICAgICB7CkBAIC01MzEsNiArNjE0LDggQEAKICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaXRlbS0+c2V0TmFtZShuYW1lLCBzdHJsZW4obmFtZSkpOwogICAgIH0KIAogICAgIHJldHVybiBtc2c7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKaW5kZXggZTYyOTU4OC4uNDUwNGMyYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcApAQCAtNTIxLDcgKzUyMSw3IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotdm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OmR1bXBGcmFnbWVudFN0YXRzKGNvbnN0IEZyYWdtZW50ICZmcmFnKSB7Cit2b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6ZHVtcEZyYWdtZW50U3RhdHMoY29uc3QgRnJhZ21lbnQgJiAvKiBmcmFnICovKSB7CiAjaWYgMAogICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwogICAgIGludDY0X3QgZGVsYXlNcyA9IChub3dVcyAtIGZyYWcubVRpbWVVcykgLyAxMDAwbGw7CkBAIC01NzksNyArNTc5LDcgQEAKIAogICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKICAgICAgICAgICAgIGlmICghbU91dEZyYWdtZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIiVkIGRhdGFncmFtcyByZW1haW4gcXVldWVkLiIsIG1PdXRGcmFnbWVudHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgiJXp1IGRhdGFncmFtcyByZW1haW4gcXVldWVkLiIsIG1PdXRGcmFnbWVudHMuc2l6ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVyciA9IE9LOwogICAgICAgICB9CkBAIC02MjMsNyArNjIzLDcgQEAKICAgICBDSEVDS19FUShtU3RhdGUsIENPTk5FQ1RFRCk7CiAgICAgQ0hFQ0soIW1PdXRGcmFnbWVudHMuZW1wdHkoKSk7CiAKLSAgICBzc2l6ZV90IG47CisgICAgc3NpemVfdCBuID0gLTE7CiAgICAgd2hpbGUgKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpIHsKICAgICAgICAgY29uc3QgRnJhZ21lbnQgJmZyYWcgPSAqbU91dEZyYWdtZW50cy5iZWdpbigpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAppbmRleCBkZWU3ODZkLi45ODM1Y2EzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKQEAgLTIwLDYgKzIwLDggQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSAiQURlYnVnLmgiCiAjaW5jbHVkZSAiQVN0cmluZy5oIgogCkBAIC00OCw2ICs1MCwxMyBAQAogICAgIHNldFRvKHMsIHNpemUpOwogfQogCitBU3RyaW5nOjpBU3RyaW5nKGNvbnN0IFN0cmluZzggJmZyb20pCisgICAgOiBtRGF0YShOVUxMKSwKKyAgICAgIG1TaXplKDApLAorICAgICAgbUFsbG9jU2l6ZSgxKSB7CisgICAgc2V0VG8oZnJvbS5zdHJpbmcoKSwgZnJvbS5sZW5ndGgoKSk7Cit9CisKIEFTdHJpbmc6OkFTdHJpbmcoY29uc3QgQVN0cmluZyAmZnJvbSkKICAgICA6IG1EYXRhKE5VTEwpLAogICAgICAgbVNpemUoMCksCkBAIC0xODksNjQgKzE5OCw2NCBAQAogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZChpbnQgeCkgewogICAgIGNoYXIgc1sxNl07Ci0gICAgc3ByaW50ZihzLCAiJWQiLCB4KTsKLQorICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIlZCIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZCh1bnNpZ25lZCB4KSB7CiAgICAgY2hhciBzWzE2XTsKLSAgICBzcHJpbnRmKHMsICIldSIsIHgpOwotCisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiV1IiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKGxvbmcgeCkgewotICAgIGNoYXIgc1sxNl07Ci0gICAgc3ByaW50ZihzLCAiJWxkIiwgeCk7Ci0KKyAgICBjaGFyIHNbMzJdOworICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIlbGQiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQodW5zaWduZWQgbG9uZyB4KSB7Ci0gICAgY2hhciBzWzE2XTsKLSAgICBzcHJpbnRmKHMsICIlbHUiLCB4KTsKLQorICAgIGNoYXIgc1szMl07CisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVsdSIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZChsb25nIGxvbmcgeCkgewogICAgIGNoYXIgc1szMl07Ci0gICAgc3ByaW50ZihzLCAiJWxsZCIsIHgpOwotCisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVsbGQiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQodW5zaWduZWQgbG9uZyBsb25nIHgpIHsKICAgICBjaGFyIHNbMzJdOwotICAgIHNwcmludGYocywgIiVsbHUiLCB4KTsKLQorICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIlbGx1IiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKGZsb2F0IHgpIHsKICAgICBjaGFyIHNbMTZdOwotICAgIHNwcmludGYocywgIiVmIiwgeCk7Ci0KKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJWYiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQoZG91YmxlIHgpIHsKICAgICBjaGFyIHNbMTZdOwotICAgIHNwcmludGYocywgIiVmIiwgeCk7Ci0KKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJWYiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQodm9pZCAqeCkgewotICAgIGNoYXIgc1sxNl07Ci0gICAgc3ByaW50ZihzLCAiJXAiLCB4KTsKLQorICAgIGNoYXIgc1szMl07CisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVwIiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKQEAgLTI5OCw2ICszMDcsMTQgQEAKICAgICByZXR1cm4gc3RyY21wKG1EYXRhLCBvdGhlci5tRGF0YSk7CiB9CiAKK2ludCBBU3RyaW5nOjpjb21wYXJlSWdub3JlQ2FzZShjb25zdCBBU3RyaW5nICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBzdHJjYXNlY21wKG1EYXRhLCBvdGhlci5tRGF0YSk7Cit9CisKK2Jvb2wgQVN0cmluZzo6ZXF1YWxzSWdub3JlQ2FzZShjb25zdCBBU3RyaW5nICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBjb21wYXJlSWdub3JlQ2FzZShvdGhlcikgPT0gMDsKK30KKwogdm9pZCBBU3RyaW5nOjp0b2xvd2VyKCkgewogICAgIG1ha2VNdXRhYmxlKCk7CiAKQEAgLTMyMCw2ICszMzcsMzUgQEAKICAgICByZXR1cm4gIXN0cmNtcChtRGF0YSArIG1TaXplIC0gc3VmZml4TGVuLCBzdWZmaXgpOwogfQogCitib29sIEFTdHJpbmc6OnN0YXJ0c1dpdGhJZ25vcmVDYXNlKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3QgeworICAgIHJldHVybiAhc3RybmNhc2VjbXAobURhdGEsIHByZWZpeCwgc3RybGVuKHByZWZpeCkpOworfQorCitib29sIEFTdHJpbmc6OmVuZHNXaXRoSWdub3JlQ2FzZShjb25zdCBjaGFyICpzdWZmaXgpIGNvbnN0IHsKKyAgICBzaXplX3Qgc3VmZml4TGVuID0gc3RybGVuKHN1ZmZpeCk7CisKKyAgICBpZiAobVNpemUgPCBzdWZmaXhMZW4pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiAhc3RyY2FzZWNtcChtRGF0YSArIG1TaXplIC0gc3VmZml4TGVuLCBzdWZmaXgpOworfQorCisvLyBzdGF0aWMKK0FTdHJpbmcgQVN0cmluZzo6RnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgeworICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIHJldHVybiBBU3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIgKj4ocGFyY2VsLnJlYWRJbnBsYWNlKHNpemUpKSwgc2l6ZSk7Cit9CisKK3N0YXR1c190IEFTdHJpbmc6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKKyAgICBDSEVDS19MRShtU2l6ZSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihJTlQzMl9NQVgpKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobVNpemUpOworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgZXJyID0gcGFyY2VsLT53cml0ZShtRGF0YSwgbVNpemUpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiBBU3RyaW5nIFN0cmluZ1ByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgewogICAgIHZhX2xpc3QgYXA7CiAgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsKaW5kZXggYWQyZGFiNS4uOTBhNmEyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tawpAQCAtMjQsNyArMjQsNyBAQAogICAgICAgICBsaWJ1dGlscyAgICAgICAgICBcCiAgICAgICAgIGxpYmxvZwogCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yCiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCmluZGV4IDk1ODE5ODYuLjdkYTdkYjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKQEAgLTMzLDYgKzMzLDEwIEBACiAKICAgICAgICAgaWYgKG4gPj0gMiAmJiBzLmNfc3RyKClbbiAtIDJdID09ICc9JykgewogICAgICAgICAgICAgcGFkZGluZyA9IDI7CisKKyAgICAgICAgICAgIGlmIChuID49IDMgJiYgcy5jX3N0cigpW24gLSAzXSA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICBwYWRkaW5nID0gMzsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNzYsNyArODAsNyBAQAogICAgICAgICBpZiAoKChpICsgMSkgJSA0KSA9PSAwKSB7CiAgICAgICAgICAgICBvdXRbaisrXSA9IChhY2N1bSA+PiAxNik7CiAKLSAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7IG91dFtqKytdID0gKGFjY3VtID4+IDgpICYgMHhmZjsgfSAKKyAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7IG91dFtqKytdID0gKGFjY3VtID4+IDgpICYgMHhmZjsgfQogICAgICAgICAgICAgaWYgKGogPCBvdXRMZW4pIHsgb3V0W2orK10gPSBhY2N1bSAmIDB4ZmY7IH0KIAogICAgICAgICAgICAgYWNjdW0gPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzMwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyOCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLCB0cnVlKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgXAorICAgICAgICBIVFRQSGVscGVyLmNwcCAgICAgICAgICBcCisKK0xPQ0FMX0NfSU5DTFVERVM6PSBcCisJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorICAgICAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAorICAgICAgICBsaWJtZWRpYQorCitMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9odHRwX3N1cHBvcnQKKworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCisKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvSFRUUEhlbHBlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ODQ1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkhUVFBIZWxwZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJIVFRQSGVscGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3V0aWxfQmluZGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9TY29wZWRMb2NhbFJlZi5oPgorI2luY2x1ZGUgImpuaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NwPElNZWRpYUhUVFBTZXJ2aWNlPiBDcmVhdGVIVFRQU2VydmljZUluQ3VycmVudEphdmFDb250ZXh0KCkgeworICAgIGlmIChBbmRyb2lkUnVudGltZTo6Z2V0SmF2YVZNKCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQ3JlYXRlSFRUUFNlcnZpY2VJbkN1cnJlbnRKYXZhQ29udGV4dCBjYWxsZWQgb3V0c2lkZSAiCisgICAgICAgICAgICAgICJKQVZBIGVudmlyb25tZW50LiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKworICAgIFNjb3BlZExvY2FsUmVmPGpjbGFzcz4gY2xhenooCisgICAgICAgICAgICBlbnYsIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhSFRUUFNlcnZpY2UiKSk7CisgICAgQ0hFQ0soY2xhenouZ2V0KCkgIT0gTlVMTCk7CisKKyAgICBqbWV0aG9kSUQgY29uc3RydWN0SUQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LmdldCgpLCAiPGluaXQ+IiwgIigpViIpOworICAgIENIRUNLKGNvbnN0cnVjdElEICE9IE5VTEwpOworCisgICAgU2NvcGVkTG9jYWxSZWY8am9iamVjdD4gaHR0cFNlcnZpY2VPYmooCisgICAgICAgICAgICBlbnYsIGVudi0+TmV3T2JqZWN0KGNsYXp6LmdldCgpLCBjb25zdHJ1Y3RJRCkpOworCisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOworICAgIGlmIChodHRwU2VydmljZU9iai5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIGptZXRob2RJRCBhc0JpbmRlcklEID0KKyAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoY2xhenouZ2V0KCksICJhc0JpbmRlciIsICIoKUxhbmRyb2lkL29zL0lCaW5kZXI7Iik7CisgICAgICAgIENIRUNLKGFzQmluZGVySUQgIT0gTlVMTCk7CisKKyAgICAgICAgU2NvcGVkTG9jYWxSZWY8am9iamVjdD4gaHR0cFNlcnZpY2VCaW5kZXJPYmooCisgICAgICAgICAgICAgICAgZW52LCBlbnYtPkNhbGxPYmplY3RNZXRob2QoaHR0cFNlcnZpY2VPYmouZ2V0KCksIGFzQmluZGVySUQpKTsKKyAgICAgICAgQ0hFQ0soaHR0cFNlcnZpY2VCaW5kZXJPYmouZ2V0KCkgIT0gTlVMTCk7CisKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0KKyAgICAgICAgICAgIGliaW5kZXJGb3JKYXZhT2JqZWN0KGVudiwgaHR0cFNlcnZpY2VCaW5kZXJPYmouZ2V0KCkpOworCisgICAgICAgIGh0dHBTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGJpbmRlcik7CisgICAgfQorCisgICAgcmV0dXJuIGh0dHBTZXJ2aWNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY1JQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmgKaW5kZXggMTNjYWM2ZC4uOGFlZjExNQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAorI2lmbmRlZiBIVFRQX0hFTFBFUl9IXwogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2RlZmluZSBIVFRQX0hFTFBFUl9IXwogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCituYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKKworc3A8SU1lZGlhSFRUUFNlcnZpY2U+IENyZWF0ZUhUVFBTZXJ2aWNlSW5DdXJyZW50SmF2YUNvbnRleHQoKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBIVFRQX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjk5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhSFRUUCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTWVkaWFIVFRQOjpNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQorICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgIG1IVFRQQ29ubmVjdGlvbihjb25uKSwKKyAgICAgIG1DYWNoZWRTaXplVmFsaWQoZmFsc2UpLAorICAgICAgbUNhY2hlZFNpemUoMGxsKSwKKyAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpIHsKKyAgICBtSW5pdENoZWNrID0gT0s7Cit9CisKK01lZGlhSFRUUDo6fk1lZGlhSFRUUCgpIHsKKyAgICBjbGVhckRSTVN0YXRlX2woKTsKK30KKworc3RhdHVzX3QgTWVkaWFIVFRQOjpjb25uZWN0KAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICBvZmY2NF90IC8qIG9mZnNldCAqLykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGV4dEhlYWRlcnM7CisgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgeworICAgICAgICBleHRIZWFkZXJzID0gKmhlYWRlcnM7CisgICAgfQorICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOworCisgICAgYm9vbCBzdWNjZXNzID0gbUhUVFBDb25uZWN0aW9uLT5jb25uZWN0KHVyaSwgJmV4dEhlYWRlcnMpOworCisgICAgbUxhc3RIZWFkZXJzID0gZXh0SGVhZGVyczsKKyAgICBtTGFzdFVSSSA9IHVyaTsKKworICAgIG1DYWNoZWRTaXplVmFsaWQgPSBmYWxzZTsKKworICAgIHJldHVybiBzdWNjZXNzID8gT0sgOiBVTktOT1dOX0VSUk9SOworfQorCit2b2lkIE1lZGlhSFRUUDo6ZGlzY29ubmVjdCgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUhUVFBDb25uZWN0aW9uLT5kaXNjb25uZWN0KCk7Cit9CisKK3N0YXR1c190IE1lZGlhSFRUUDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzc2l6ZV90IE1lZGlhSFRUUDo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworCisgICAgc2l6ZV90IG51bUJ5dGVzUmVhZCA9IDA7CisgICAgd2hpbGUgKG51bUJ5dGVzUmVhZCA8IHNpemUpIHsKKyAgICAgICAgc2l6ZV90IGNvcHkgPSBzaXplIC0gbnVtQnl0ZXNSZWFkOworCisgICAgICAgIGlmIChjb3B5ID4gNjQgKiAxMDI0KSB7CisgICAgICAgICAgICAvLyBsaW1pdCB0aGUgYnVmZmVyIHNpemVzIHRyYW5zZmVycmVkIGFjcm9zcyBiaW5kZXIgYm91bmRhcmllcworICAgICAgICAgICAgLy8gdG8gYXZvaWQgc3B1cmlvdXMgdHJhbnNhY3Rpb24gZmFpbHVyZXMuCisgICAgICAgICAgICBjb3B5ID0gNjQgKiAxMDI0OworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBuID0gbUhUVFBDb25uZWN0aW9uLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgb2Zmc2V0ICsgbnVtQnl0ZXNSZWFkLCAodWludDhfdCAqKWRhdGEgKyBudW1CeXRlc1JlYWQsIGNvcHkpOworCisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG51bUJ5dGVzUmVhZCArPSBuOworICAgIH0KKworICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKworICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG51bUJ5dGVzUmVhZCwgZGVsYXlVcyk7CisKKyAgICByZXR1cm4gbnVtQnl0ZXNSZWFkOworfQorCitzdGF0dXNfdCBNZWRpYUhUVFA6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIC8vIENhY2hpbmcgdGhlIHJldHVybmVkIHNpemUgc28gdGhhdCBpdCBzdGF5cyB2YWxpZCBldmVuIGFmdGVyIGEKKyAgICAvLyBkaXNjb25uZWN0LiBOdUNhY2hlZFNvdXJjZTIgcmVsaWVzIG9uIHRoaXMuCisKKyAgICBpZiAoIW1DYWNoZWRTaXplVmFsaWQpIHsKKyAgICAgICAgbUNhY2hlZFNpemUgPSBtSFRUUENvbm5lY3Rpb24tPmdldFNpemUoKTsKKyAgICAgICAgbUNhY2hlZFNpemVWYWxpZCA9IHRydWU7CisgICAgfQorCisgICAgKnNpemUgPSBtQ2FjaGVkU2l6ZTsKKworICAgIHJldHVybiAqc2l6ZSA8IDAgPyAqc2l6ZSA6IE9LOworfQorCit1aW50MzJfdCBNZWRpYUhUVFA6OmZsYWdzKCkgeworICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZyB8IGtJc0hUVFBCYXNlZFNvdXJjZTsKK30KKworc3RhdHVzX3QgTWVkaWFIVFRQOjpyZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgeworICAgIHJldHVybiBjb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZtTGFzdEhlYWRlcnMsIG9mZnNldCk7Cit9CisKKy8vIERSTS4uLgorCitzcDxEZWNyeXB0SGFuZGxlPiBNZWRpYUhUVFA6OkRybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpIHsKKyAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgeworICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IG5ldyBEcm1NYW5hZ2VyQ2xpZW50KCk7CisgICAgfQorCisgICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKG1EZWNyeXB0SGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgbURlY3J5cHRIYW5kbGUgPSBtRHJtTWFuYWdlckNsaWVudC0+b3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICAgICAgICAgIFN0cmluZzgobUxhc3RVUkkuY19zdHIoKSksIG1pbWUpOworICAgIH0KKworICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtRHJtTWFuYWdlckNsaWVudDsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKK30KKwordm9pZCBNZWRpYUhUVFA6OmdldERybUluZm8oCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpIHsKKyAgICBoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKKyAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7Cit9CisKK1N0cmluZzggTWVkaWFIVFRQOjpnZXRVcmkoKSB7CisgICAgU3RyaW5nOCB1cmk7CisgICAgaWYgKE9LID09IG1IVFRQQ29ubmVjdGlvbi0+Z2V0VXJpKCZ1cmkpKSB7CisgICAgICAgIHJldHVybiB1cmk7CisgICAgfQorICAgIHJldHVybiBTdHJpbmc4KG1MYXN0VVJJLmNfc3RyKCkpOworfQorCitTdHJpbmc4IE1lZGlhSFRUUDo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgIH0KKworICAgIFN0cmluZzggbWltZVR5cGU7CisgICAgc3RhdHVzX3QgZXJyID0gbUhUVFBDb25uZWN0aW9uLT5nZXRNSU1FVHlwZSgmbWltZVR5cGUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCisgICAgcmV0dXJuIG1pbWVUeXBlOworfQorCit2b2lkIE1lZGlhSFRUUDo6Y2xlYXJEUk1TdGF0ZV9sKCkgeworICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFRvIHJlbGVhc2UgbURlY3J5cHRIYW5kbGUKKyAgICAgICAgQ0hFQ0sobURybU1hbmFnZXJDbGllbnQpOworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+Y2xvc2VEZWNyeXB0U2Vzc2lvbihtRGVjcnlwdEhhbmRsZSk7CisgICAgICAgIG1EZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tawppbmRleCBmMzUyOWY5Li5lOGQ1NThjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKQEAgLTEzLDYgKzEzLDggQEAKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAkkKFRPUCkvZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJiaW5kZXIgXAogICAgICAgICBsaWJjcnlwdG8gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCmluZGV4IGU1M2UzNWEuLmZiYTZiMDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlICJtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCIKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zNCw1MiArMzYsNTMgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KIAogI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTGl2ZVNlc3Npb246OkxpdmVTZXNzaW9uKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgdWludDMyX3QgZmxhZ3MsIGJvb2wgdWlkVmFsaWQsIHVpZF90IHVpZCkKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIHVpbnQzMl90IGZsYWdzLAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKQogICAgIDogbU5vdGlmeShub3RpZnkpLAogICAgICAgbUZsYWdzKGZsYWdzKSwKLSAgICAgIG1VSURWYWxpZCh1aWRWYWxpZCksCi0gICAgICBtVUlEKHVpZCksCisgICAgICBtSFRUUFNlcnZpY2UoaHR0cFNlcnZpY2UpLAogICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSh0cnVlKSwKLSAgICAgIG1IVFRQRGF0YVNvdXJjZSgKLSAgICAgICAgICAgICAgSFRUUEJhc2U6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykKLSAgICAgICAgICAgICAgICAgICAgPyBIVFRQQmFzZTo6a0ZsYWdJbmNvZ25pdG8KLSAgICAgICAgICAgICAgICAgICAgOiAwKSksCi0gICAgICBtUHJldkJhbmR3aWR0aEluZGV4KC0xKSwKKyAgICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgTWVkaWFIVFRQKG1IVFRQU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSwKKyAgICAgIG1DdXJCYW5kd2lkdGhJbmRleCgtMSksCiAgICAgICBtU3RyZWFtTWFzaygwKSwKICAgICAgIG1OZXdTdHJlYW1NYXNrKDApLAogICAgICAgbVN3YXBNYXNrKDApLAogICAgICAgbUNoZWNrQmFuZHdpZHRoR2VuZXJhdGlvbigwKSwKICAgICAgIG1Td2l0Y2hHZW5lcmF0aW9uKDApLAorICAgICAgbVN1YnRpdGxlR2VuZXJhdGlvbigwKSwKICAgICAgIG1MYXN0RGVxdWV1ZWRUaW1lVXMoMGxsKSwKICAgICAgIG1SZWFsVGltZUJhc2VVcygwbGwpLAogICAgICAgbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MoZmFsc2UpLAogICAgICAgbVN3aXRjaEluUHJvZ3Jlc3MoZmFsc2UpLAogICAgICAgbURpc2Nvbm5lY3RSZXBseUlEKDApLAotICAgICAgbVNlZWtSZXBseUlEKDApIHsKLSAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgIG1IVFRQRGF0YVNvdXJjZS0+c2V0VUlEKG1VSUQpOwotICAgIH0KKyAgICAgIG1TZWVrUmVwbHlJRCgwKSwKKyAgICAgIG1GaXJzdFRpbWVVc1ZhbGlkKGZhbHNlKSwKKyAgICAgIG1GaXJzdFRpbWVVcygwKSwKKyAgICAgIG1MYXN0U2Vla1RpbWVVcygwKSB7CiAKICAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0gPSBTdHJlYW1JdGVtKCJhdWRpbyIpOwogICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XSA9IFN0cmVhbUl0ZW0oInZpZGVvIik7CiAgICAgbVN0cmVhbXNba1N1YnRpdGxlSW5kZXhdID0gU3RyZWFtSXRlbSgic3VidGl0bGVzIik7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgbURpc2NvbnRpbnVpdGllcy5hZGQoaW5kZXhUb1R5cGUoaSksIG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwgLyogbWV0YSAqLykpOwogICAgICAgICBtUGFja2V0U291cmNlcy5hZGQoaW5kZXhUb1R5cGUoaSksIG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwgLyogbWV0YSAqLykpOwogICAgICAgICBtUGFja2V0U291cmNlczIuYWRkKGluZGV4VG9UeXBlKGkpLCBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMIC8qIG1ldGEgKi8pKTsKKyAgICAgICAgbUJ1ZmZlcmluZ1tpXSA9IGZhbHNlOwogICAgIH0KIH0KIApAQCAtMTEyLDMxICsxMTUsOTAgQEAKICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBkaXNjb250aW51aXR5UXVldWUgID0gbURpc2NvbnRpbnVpdGllcy52YWx1ZUZvcihzdHJlYW0pOworICAgIGlmIChkaXNjb250aW51aXR5UXVldWUtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgIC8vIHNlZWtpbmcsIHRyYWNrIHN3aXRjaGluZworICAgICAgICBzcDxBTWVzc2FnZT4gZXh0cmE7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBpZiAoKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kTWVzc2FnZSgiZXh0cmEiLCAmZXh0cmEpCisgICAgICAgICAgICAgICAgJiYgZXh0cmEgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmIGV4dHJhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICAvLyBzZWVraW5nIG9ubHkKKyAgICAgICAgICAgIG1MYXN0U2Vla1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5jbGVhcigpOworICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSU5GT19ESVNDT05USU5VSVRZOworICAgIH0KKwogICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKHN0cmVhbSk7CiAKLSAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICBzc2l6ZV90IGlkeCA9IHR5cGVUb0luZGV4KHN0cmVhbSk7CiAgICAgaWYgKCFwYWNrZXRTb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgbUJ1ZmZlcmluZ1tpZHhdID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1CdWZmZXJpbmdbaWR4XSkgeworICAgICAgICBpZiAobVN3aXRjaEluUHJvZ3Jlc3MKKyAgICAgICAgICAgICAgICB8fCBwYWNrZXRTb3VyY2UtPmlzRmluaXNoZWQoMCkKKyAgICAgICAgICAgICAgICB8fCBwYWNrZXRTb3VyY2UtPmdldEVzdGltYXRlZER1cmF0aW9uVXMoKSA+IDEwMDAwMDAwbGwpIHsKKyAgICAgICAgICAgIG1CdWZmZXJpbmdbaWR4XSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1CdWZmZXJpbmdbaWR4XSkgeworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisKKyAgICAvLyB3YWl0IGZvciBjb3VudGVycGFydAorICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG90aGVyU291cmNlOworICAgIHVpbnQzMl90IG1hc2sgPSBtTmV3U3RyZWFtTWFzayAmIG1TdHJlYW1NYXNrOworICAgIHVpbnQzMl90IGZldGNoZXJzTWFzayAgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICB1aW50MzJfdCBmZXRjaGVyTWFzayA9IG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tRmV0Y2hlci0+Z2V0U3RyZWFtVHlwZU1hc2soKTsKKyAgICAgICAgZmV0Y2hlcnNNYXNrIHw9IGZldGNoZXJNYXNrOworICAgIH0KKyAgICBtYXNrICY9IGZldGNoZXJzTWFzazsKKyAgICBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfQVVESU8gJiYgKG1hc2sgJiBTVFJFQU1UWVBFX1ZJREVPKSkgeworICAgICAgICBvdGhlclNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfVklERU8pOworICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfVklERU8gJiYgKG1hc2sgJiBTVFJFQU1UWVBFX0FVRElPKSkgeworICAgICAgICBvdGhlclNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfQVVESU8pOworICAgIH0KKyAgICBpZiAob3RoZXJTb3VyY2UgIT0gTlVMTCAmJiAhb3RoZXJTb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CiAgICAgICAgIHJldHVybiBmaW5hbFJlc3VsdCA9PSBPSyA/IC1FQUdBSU4gOiBmaW5hbFJlc3VsdDsKICAgICB9CiAKICAgICBzdGF0dXNfdCBlcnIgPSBwYWNrZXRTb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogCisgICAgc2l6ZV90IHN0cmVhbUlkeDsKICAgICBjb25zdCBjaGFyICpzdHJlYW1TdHI7CiAgICAgc3dpdGNoIChzdHJlYW0pIHsKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FVRElPOgorICAgICAgICAgICAgc3RyZWFtSWR4ID0ga0F1ZGlvSW5kZXg7CiAgICAgICAgICAgICBzdHJlYW1TdHIgPSAiYXVkaW8iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9WSURFTzoKKyAgICAgICAgICAgIHN0cmVhbUlkeCA9IGtWaWRlb0luZGV4OwogICAgICAgICAgICAgc3RyZWFtU3RyID0gInZpZGVvIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfU1VCVElUTEVTOgorICAgICAgICAgICAgc3RyZWFtSWR4ID0ga1N1YnRpdGxlSW5kZXg7CiAgICAgICAgICAgICBzdHJlYW1TdHIgPSAic3VicyI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQogCisgICAgU3RyZWFtSXRlbSYgc3RybSA9IG1TdHJlYW1zW3N0cmVhbUlkeF07CiAgICAgaWYgKGVyciA9PSBJTkZPX0RJU0NPTlRJTlVJVFkpIHsKKyAgICAgICAgLy8gYWRhcHRpdmUgc3RyZWFtaW5nLCBkaXNjb250aW51aXRpZXMgaW4gdGhlIHBsYXlsaXN0CiAgICAgICAgIGludDMyX3QgdHlwZTsKICAgICAgICAgQ0hFQ0soKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmdHlwZSkpOwogCkBAIC0xNTEsMTAgKzIxMyw3IEBACiAgICAgICAgICAgICAgIGV4dHJhID09IE5VTEwgPyAiTlVMTCIgOiBleHRyYS0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKIAogICAgICAgICBpbnQzMl90IHN3YXA7Ci0gICAgICAgIGlmICh0eXBlID09IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UKLSAgICAgICAgICAgICAgICAmJiAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQzMigic3dhcFBhY2tldFNvdXJjZSIsICZzd2FwKQotICAgICAgICAgICAgICAgICYmIHN3YXApIHsKLQorICAgICAgICBpZiAoKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoInN3YXBQYWNrZXRTb3VyY2UiLCAmc3dhcCkgJiYgc3dhcCkgewogICAgICAgICAgICAgaW50MzJfdCBzd2l0Y2hHZW5lcmF0aW9uOwogICAgICAgICAgICAgQ0hFQ0soKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoInN3aXRjaEdlbmVyYXRpb24iLCAmc3dpdGNoR2VuZXJhdGlvbikpOwogICAgICAgICAgICAgewpAQCAtMTY3LDE2ICsyMjYsNzUgQEAKICAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IHNlcSA9IHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXE7CisgICAgICAgICAgICBpbnQ2NF90IG9mZnNldFRpbWVVczsKKyAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuaW5kZXhPZktleShzZXEpID49IDApIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgPSBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMudmFsdWVGb3Ioc2VxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VxICs9IDE7CisgICAgICAgICAgICBpZiAobURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMuaW5kZXhPZktleShzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVczsKKyAgICAgICAgICAgICAgICBmaXJzdFRpbWVVcyA9IG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLnZhbHVlRm9yKHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyArPSBzdHJtLm1MYXN0RGVxdWV1ZWRUaW1lVXMgLSBmaXJzdFRpbWVVczsKKyAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgKz0gc3RybS5tTGFzdFNhbXBsZUR1cmF0aW9uVXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyArPSBzdHJtLm1MYXN0U2FtcGxlRHVyYXRpb25VczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLmFkZChzZXEsIG9mZnNldFRpbWVVcyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGVyciA9PSBPSykgeworCiAgICAgICAgIGlmIChzdHJlYW0gPT0gU1RSRUFNVFlQRV9BVURJTyB8fCBzdHJlYW0gPT0gU1RSRUFNVFlQRV9WSURFTykgewogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXEgPSAwOwogICAgICAgICAgICAgQ0hFQ0soKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICAmdGltZVVzKSk7Ci0gICAgICAgICAgICBBTE9HVigiWyVzXSByZWFkIGJ1ZmZlciBhdCB0aW1lICVsbGQgdXMiLCBzdHJlYW1TdHIsIHRpbWVVcyk7CisgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgICAgIHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEgPSBkaXNjb250aW51aXR5U2VxOwogCisgICAgICAgICAgICBpbnQzMl90IGRpc2NhcmQgPSAwOworICAgICAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVczsKKyAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy5pbmRleE9mS2V5KHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEpID49IDApIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGR1clVzOyAvLyBhcHByb3hpbWF0ZSBzYW1wbGUgZHVyYXRpb24KKyAgICAgICAgICAgICAgICBpZiAodGltZVVzID4gc3RybS5tTGFzdERlcXVldWVkVGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgIGR1clVzID0gdGltZVVzIC0gc3RybS5tTGFzdERlcXVldWVkVGltZVVzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGR1clVzID0gc3RybS5tTGFzdERlcXVldWVkVGltZVVzIC0gdGltZVVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJtLm1MYXN0U2FtcGxlRHVyYXRpb25VcyA9IGR1clVzOworICAgICAgICAgICAgICAgIGZpcnN0VGltZVVzID0gbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMudmFsdWVGb3Ioc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjYXJkIiwgJmRpc2NhcmQpICYmIGRpc2NhcmQpIHsKKyAgICAgICAgICAgICAgICBmaXJzdFRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMuYWRkKHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgZmlyc3RUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cm0ubUxhc3REZXF1ZXVlZFRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIGlmICh0aW1lVXMgPj0gZmlyc3RUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICB0aW1lVXMgLT0gZmlyc3RUaW1lVXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRpbWVVcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aW1lVXMgKz0gbUxhc3RTZWVrVGltZVVzOworICAgICAgICAgICAgaWYgKG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5pbmRleE9mS2V5KGRpc2NvbnRpbnVpdHlTZXEpID49IDApIHsKKyAgICAgICAgICAgICAgICB0aW1lVXMgKz0gbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLnZhbHVlRm9yKGRpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigiWyVzXSByZWFkIGJ1ZmZlciBhdCB0aW1lICUiIFBSSWQ2NCAiIHVzIiwgc3RyZWFtU3RyLCB0aW1lVXMpOworICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgIHRpbWVVcyk7CiAgICAgICAgICAgICBtTGFzdERlcXVldWVkVGltZVVzID0gdGltZVVzOwogICAgICAgICAgICAgbVJlYWxUaW1lQmFzZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHRpbWVVczsKICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gU1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKKyAgICAgICAgICAgIGludDMyX3Qgc3VidGl0bGVHZW5lcmF0aW9uOworICAgICAgICAgICAgaWYgKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJzdWJ0aXRsZUdlbmVyYXRpb24iLCAmc3VidGl0bGVHZW5lcmF0aW9uKQorICAgICAgICAgICAgICAgICAgICAmJiBzdWJ0aXRsZUdlbmVyYXRpb24gIT0gbVN1YnRpdGxlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICB9OwogICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQzMigKICAgICAgICAgICAgICAgICAgICAgInRyYWNrSW5kZXgiLCBtUGxheWxpc3QtPmdldFNlbGVjdGVkSW5kZXgoKSk7CiAgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDY0KCJiYXNlVXMiLCBtUmVhbFRpbWVCYXNlVXMpOwpAQCAtMjM1LDEwICszNTMsNiBAQAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CiAKLSAgICB1aW50MzJfdCByZXBseUlEOwotICAgIENIRUNLKHJlc3BvbnNlID09IG1TZWVrUmVwbHkgJiYgMCAhPSBtU2Vla1JlcGx5SUQpOwotICAgIG1TZWVrUmVwbHkuY2xlYXIoKTsKLSAgICBtU2Vla1JlcGx5SUQgPSAwOwogICAgIHJldHVybiBlcnI7CiB9CiAKQEAgLTI2NCwxMiArMzc4LDE2IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFNlZWs6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJm1TZWVrUmVwbHlJRCkpOworICAgICAgICAgICAgdWludDMyX3Qgc2Vla1JlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZzZWVrUmVwbHlJRCkpOworICAgICAgICAgICAgbVNlZWtSZXBseUlEID0gc2Vla1JlcGx5SUQ7CisgICAgICAgICAgICBtU2Vla1JlcGx5ID0gbmV3IEFNZXNzYWdlOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvblNlZWsobXNnKTsKIAotICAgICAgICAgICAgbVNlZWtSZXBseSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIG1TZWVrUmVwbHktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIG1zZy0+cG9zdCg1MDAwMCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yOTIsNyArNDEwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3dpdGNoSW5Qcm9ncmVzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAobUNvbnRpbnVhdGlvbiAhPSBOVUxMKSB7CkBAIC0zMDIsNyArNDIyLDEwIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlZWtSZXBseUlEICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobVNlZWtSZXBseSAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtSZXBseS0+c2V0SW50MzIoImVyciIsIE9LKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtSZXBseS0+cG9zdFJlcGx5KG1TZWVrUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrUmVwbHlJRCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrUmVwbHkuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTMyOSw2ICs0NTIsMjMgQEAKIAogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiWFhYIFJlY2VpdmVkIGVycm9yICVkIGZyb20gUGxheWxpc3RGZXRjaGVyLiIsIGVycik7CiAKKyAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIEVPUyBvbiBzdWJ0aXRsZSB0cmFja3MgaW5kZXBlbmRlbnRseQorICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHVyaTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNICYmIG1zZy0+ZmluZFN0cmluZygidXJpIiwgJnVyaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaSA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleSh1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFBsYXlsaXN0RmV0Y2hlcj4gJmZldGNoZXIgPSBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubUZldGNoZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZldGNoZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0eXBlID0gZmV0Y2hlci0+Z2V0U3RyZWFtVHlwZU1hc2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gU1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVFJFQU1UWVBFX1NVQlRJVExFUyktPnNpZ25hbEVPUyhlcnIpOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgaWYgKG1JblByZXBhcmF0aW9uUGhhc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RQcmVwYXJlZChlcnIpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zNTQsNiArNDk0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgdXJpOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoInVyaSIsICZ1cmkpKTsKIAorICAgICAgICAgICAgICAgICAgICBpZiAobUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY291bGRuJ3QgZmluZCB1cmkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIEZldGNoZXJJbmZvICppbmZvID0gJm1GZXRjaGVySW5mb3MuZWRpdFZhbHVlRm9yKHVyaSk7CiAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1Jc1ByZXBhcmVkID0gdHJ1ZTsKIApAQCAtNDEwLDcgKzU1NCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG9uQ2hlY2tCYW5kd2lkdGgoKTsKKyAgICAgICAgICAgIG9uQ2hlY2tCYW5kd2lkdGgobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTQ0Myw2ICs1ODcsMTkgQEAKICAgICAgICAgICAgIG9uU3dhcHBlZChtc2cpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Q2hlY2tTd2l0Y2hEb3duOgorICAgICAgICB7CisgICAgICAgICAgICBvbkNoZWNrU3dpdGNoRG93bigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U3dpdGNoRG93bjoKKyAgICAgICAgeworICAgICAgICAgICAgb25Td2l0Y2hEb3duKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC00NjYsNiArNjIzLDIxIEBACiAgICAgcmV0dXJuIChTdHJlYW1UeXBlKSgxIDw8IGlkeCk7CiB9CiAKKy8vIHN0YXRpYworc3NpemVfdCBMaXZlU2Vzc2lvbjo6dHlwZVRvSW5kZXgoaW50MzJfdCB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BVURJTzoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfVklERU86CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1NVQlRJVExFUzoKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH07CisgICAgcmV0dXJuIC0xOworfQorCiB2b2lkIExpdmVTZXNzaW9uOjpvbkNvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBBU3RyaW5nIHVybDsKICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoInVybCIsICZ1cmwpKTsKQEAgLTQ4MCwxMSArNjUyLDggQEAKICAgICAgICAgaGVhZGVycyA9IE5VTEw7CiAgICAgfQogCi0jaWYgMQotICAgIEFMT0dJKCJvbkNvbm5lY3QgPFVSTCBzdXBwcmVzc2VkPiIpOwotI2Vsc2UKLSAgICBBTE9HSSgib25Db25uZWN0ICVzIiwgdXJsLmNfc3RyKCkpOwotI2VuZGlmCisgICAgLy8gVE9ETyBjdXJyZW50bHkgd2UgZG9uJ3Qga25vdyBpZiB3ZSBhcmUgY29taW5nIGhlcmUgZnJvbSBpbmNvZ25pdG8gbW9kZQorICAgIEFMT0dJKCJvbkNvbm5lY3QgJXMiLCB1cmlEZWJ1Z1N0cmluZyh1cmwpLmNfc3RyKCkpOwogCiAgICAgbU1hc3RlclVSTCA9IHVybDsKIApAQCAtNDkyLDcgKzY2MSw3IEBACiAgICAgbVBsYXlsaXN0ID0gZmV0Y2hQbGF5bGlzdCh1cmwuY19zdHIoKSwgTlVMTCAvKiBjdXJQbGF5bGlzdEhhc2ggKi8sICZkdW1teSk7CiAKICAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInVuYWJsZSB0byBmZXRjaCBtYXN0ZXIgcGxheWxpc3QgJyVzJy4iLCB1cmwuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCJ1bmFibGUgdG8gZmV0Y2ggbWFzdGVyIHBsYXlsaXN0ICVzLiIsIHVyaURlYnVnU3RyaW5nKHVybCkuY19zdHIoKSk7CiAKICAgICAgICAgcG9zdFByZXBhcmVkKEVSUk9SX0lPKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNTQ0LDggKzcxMyw5IEBACiAgICAgICAgIG1CYW5kd2lkdGhJdGVtcy5wdXNoKGl0ZW0pOwogICAgIH0KIAorICAgIG1QbGF5bGlzdC0+cGlja1JhbmRvbU1lZGlhSXRlbXMoKTsKICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgMGxsIC8qIHRpbWVVcyAqLywgaW5pdGlhbEJhbmR3aWR0aEluZGV4LCB0cnVlIC8qIHBpY2tUcmFjayAqLyk7CisgICAgICAgICAgICAwbGwgLyogdGltZVVzICovLCBpbml0aWFsQmFuZHdpZHRoSW5kZXgsIGZhbHNlIC8qIHBpY2tUcmFjayAqLyk7CiB9CiAKIHZvaWQgTGl2ZVNlc3Npb246OmZpbmlzaERpc2Nvbm5lY3QoKSB7CkBAIC01NTcsNiArNzI3LDkgQEAKICAgICAvLyAoZmluaXNoRGlzY29ubmVjdCwgb25GaW5pc2hEaXNjb25uZWN0MikKICAgICBjYW5jZWxCYW5kd2lkdGhTd2l0Y2goKTsKIAorICAgIC8vIGNhbmNlbCBzd2l0Y2ggZG93biBtb25pdG9yCisgICAgbVN3aXRjaERvd25Nb25pdG9yLmNsZWFyKCk7CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1GZXRjaGVyLT5zdG9wQXN5bmMoKTsKICAgICB9CkBAIC01OTksNyArNzcyLDcgQEAKICAgICBub3RpZnktPnNldEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgbVN3aXRjaEdlbmVyYXRpb24pOwogCiAgICAgRmV0Y2hlckluZm8gaW5mbzsKLSAgICBpbmZvLm1GZXRjaGVyID0gbmV3IFBsYXlsaXN0RmV0Y2hlcihub3RpZnksIHRoaXMsIHVyaSk7CisgICAgaW5mby5tRmV0Y2hlciA9IG5ldyBQbGF5bGlzdEZldGNoZXIobm90aWZ5LCB0aGlzLCB1cmksIG1TdWJ0aXRsZUdlbmVyYXRpb24pOwogICAgIGluZm8ubUR1cmF0aW9uVXMgPSAtMWxsOwogICAgIGluZm8ubUlzUHJlcGFyZWQgPSBmYWxzZTsKICAgICBpbmZvLm1Ub0JlUmVtb3ZlZCA9IGZhbHNlOwpAQCAtNjc5LDcgKzg1Miw3IEBACiAKICAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IDA7CiAgICAgLy8gYWRqdXN0IHJhbmdlX2xlbmd0aCBpZiBvbmx5IHJlYWRpbmcgcGFydGlhbCBibG9jawotICAgIGlmIChibG9ja19zaXplID4gMCAmJiAocmFuZ2VfbGVuZ3RoID09IC0xIHx8IGJ1ZmZlci0+c2l6ZSgpICsgYmxvY2tfc2l6ZSA8IHJhbmdlX2xlbmd0aCkpIHsKKyAgICBpZiAoYmxvY2tfc2l6ZSA+IDAgJiYgKHJhbmdlX2xlbmd0aCA9PSAtMSB8fCAoaW50NjRfdCkoYnVmZmVyLT5zaXplKCkgKyBibG9ja19zaXplKSA8IHJhbmdlX2xlbmd0aCkpIHsKICAgICAgICAgcmFuZ2VfbGVuZ3RoID0gYnVmZmVyLT5zaXplKCkgKyBibG9ja19zaXplOwogICAgIH0KICAgICBmb3IgKDs7KSB7CkBAIC02ODgsNyArODYxLDcgQEAKICAgICAgICAgaWYgKGJ1ZmZlclJlbWFpbmluZyA9PSAwICYmIGdldFNpemVFcnIgIT0gT0spIHsKICAgICAgICAgICAgIGJ1ZmZlclJlbWFpbmluZyA9IDMyNzY4OwogCi0gICAgICAgICAgICBBTE9HVigiaW5jcmVhc2luZyBkb3dubG9hZCBidWZmZXIgdG8gJWQgYnl0ZXMiLAorICAgICAgICAgICAgQUxPR1YoImluY3JlYXNpbmcgZG93bmxvYWQgYnVmZmVyIHRvICV6dSBieXRlcyIsCiAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSgpICsgYnVmZmVyUmVtYWluaW5nKTsKIAogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY29weSA9IG5ldyBBQnVmZmVyKGJ1ZmZlci0+c2l6ZSgpICsgYnVmZmVyUmVtYWluaW5nKTsKQEAgLTcwMSw3ICs4NzQsNyBAQAogICAgICAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQgPSBidWZmZXJSZW1haW5pbmc7CiAgICAgICAgIGlmIChyYW5nZV9sZW5ndGggPj0gMCkgewogICAgICAgICAgICAgaW50NjRfdCBieXRlc0xlZnRJblJhbmdlID0gcmFuZ2VfbGVuZ3RoIC0gYnVmZmVyLT5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0SW5SYW5nZSA8IG1heEJ5dGVzVG9SZWFkKSB7CisgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0SW5SYW5nZSA8IChpbnQ2NF90KW1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSBieXRlc0xlZnRJblJhbmdlOwogCiAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzTGVmdEluUmFuZ2UgPT0gMCkgewpAQCAtNzY5LDkgKzk0Miw2IEBACiAgICAgICAgIC8vIHBsYXlsaXN0IHVuY2hhbmdlZAogICAgICAgICAqdW5jaGFuZ2VkID0gdHJ1ZTsKIAotICAgICAgICBBTE9HVigiUGxheWxpc3QgdW5jaGFuZ2VkLCByZWZyZXNoIHN0YXRlIGlzIG5vdyAlZCIsCi0gICAgICAgICAgICAgKGludCltUmVmcmVzaFN0YXRlKTsKLQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTgzNiwxNCArMTAwNiwyMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gQ29uc2lkZXIgb25seSA4MCUgb2YgdGhlIGF2YWlsYWJsZSBiYW5kd2lkdGggdXNhYmxlLgotICAgICAgICBiYW5kd2lkdGhCcHMgPSAoYmFuZHdpZHRoQnBzICogOCkgLyAxMDsKLQogICAgICAgICAvLyBQaWNrIHRoZSBoaWdoZXN0IGJhbmR3aWR0aCBzdHJlYW0gYmVsb3cgb3IgZXF1YWwgdG8gZXN0aW1hdGVkIGJhbmR3aWR0aC4KIAogICAgICAgICBpbmRleCA9IG1CYW5kd2lkdGhJdGVtcy5zaXplKCkgLSAxOwotICAgICAgICB3aGlsZSAoaW5kZXggPiAwICYmIG1CYW5kd2lkdGhJdGVtcy5pdGVtQXQoaW5kZXgpLm1CYW5kd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAoc2l6ZV90KWJhbmR3aWR0aEJwcykgeworICAgICAgICB3aGlsZSAoaW5kZXggPiAwKSB7CisgICAgICAgICAgICAvLyBjb25zaWRlciBvbmx5IDgwJSBvZiB0aGUgYXZhaWxhYmxlIGJhbmR3aWR0aCwgYnV0IGlmIHdlIGFyZSBzd2l0Y2hpbmcgdXAsCisgICAgICAgICAgICAvLyBiZSBldmVuIG1vcmUgY29uc2VydmF0aXZlICg3MCUpIHRvIGF2b2lkIG92ZXJlc3RpbWF0aW5nIGFuZCBpbW1lZGlhdGVseQorICAgICAgICAgICAgLy8gc3dpdGNoaW5nIGJhY2suCisgICAgICAgICAgICBzaXplX3QgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBiYW5kd2lkdGhCcHM7CisgICAgICAgICAgICBpZiAoaW5kZXggPiBtQ3VyQmFuZHdpZHRoSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RlZEJhbmR3aWR0aEJwcyA9IGFkanVzdGVkQmFuZHdpZHRoQnBzICogNyAvIDEwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RlZEJhbmR3aWR0aEJwcyA9IGFkanVzdGVkQmFuZHdpZHRoQnBzICogOCAvIDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1CYW5kd2lkdGhJdGVtcy5pdGVtQXQoaW5kZXgpLm1CYW5kd2lkdGggPD0gYWRqdXN0ZWRCYW5kd2lkdGhCcHMpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC0taW5kZXg7CiAgICAgICAgIH0KICAgICB9CkBAIC04NTYsMjAgKzEwMzQsMjAgQEAKICAgICAvLyB0byBsb3dlc3QpCiAgICAgY29uc3Qgc2l6ZV90IGtNaW5JbmRleCA9IDA7CiAKLSAgICBzdGF0aWMgc3NpemVfdCBtUHJldkJhbmR3aWR0aEluZGV4ID0gLTE7CisgICAgc3RhdGljIHNzaXplX3QgbUN1ckJhbmR3aWR0aEluZGV4ID0gLTE7CiAKICAgICBzaXplX3QgaW5kZXg7Ci0gICAgaWYgKG1QcmV2QmFuZHdpZHRoSW5kZXggPCAwKSB7CisgICAgaWYgKG1DdXJCYW5kd2lkdGhJbmRleCA8IDApIHsKICAgICAgICAgaW5kZXggPSBrTWluSW5kZXg7CiAgICAgfSBlbHNlIGlmICh1bmlmb3JtUmFuZCgpIDwgMC41KSB7Ci0gICAgICAgIGluZGV4ID0gKHNpemVfdCltUHJldkJhbmR3aWR0aEluZGV4OworICAgICAgICBpbmRleCA9IChzaXplX3QpbUN1ckJhbmR3aWR0aEluZGV4OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gbVByZXZCYW5kd2lkdGhJbmRleCArIDE7CisgICAgICAgIGluZGV4ID0gbUN1ckJhbmR3aWR0aEluZGV4ICsgMTsKICAgICAgICAgaWYgKGluZGV4ID09IG1CYW5kd2lkdGhJdGVtcy5zaXplKCkpIHsKICAgICAgICAgICAgIGluZGV4ID0ga01pbkluZGV4OwogICAgICAgICB9CiAgICAgfQotICAgIG1QcmV2QmFuZHdpZHRoSW5kZXggPSBpbmRleDsKKyAgICBtQ3VyQmFuZHdpZHRoSW5kZXggPSBpbmRleDsKICNlbGlmIDAKICAgICAvLyBQaWNrIHRoZSBoaWdoZXN0IGJhbmR3aWR0aCBzdHJlYW0gYmVsb3cgb3IgZXF1YWwgdG8gMS4yIE1iaXQvc2VjCiAKQEAgLTkwMCwxNSArMTA3OCwzNCBAQAogICAgIHJldHVybiBpbmRleDsKIH0KIAoraW50NjRfdCBMaXZlU2Vzc2lvbjo6bGF0ZXN0TWVkaWFTZWdtZW50U3RhcnRUaW1lVXMoKSB7CisgICAgc3A8QU1lc3NhZ2U+IGF1ZGlvTWV0YSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfQVVESU8pLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKTsKKyAgICBpbnQ2NF90IG1pblNlZ21lbnRTdGFydFRpbWVVcyA9IC0xLCB2aWRlb1NlZ21lbnRTdGFydFRpbWVVcyA9IC0xOworICAgIGlmIChhdWRpb01ldGEgIT0gTlVMTCkgeworICAgICAgICBhdWRpb01ldGEtPmZpbmRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgJm1pblNlZ21lbnRTdGFydFRpbWVVcyk7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHZpZGVvTWV0YSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfVklERU8pLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKTsKKyAgICBpZiAodmlkZW9NZXRhICE9IE5VTEwKKyAgICAgICAgICAgICYmIHZpZGVvTWV0YS0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmdmlkZW9TZWdtZW50U3RhcnRUaW1lVXMpKSB7CisgICAgICAgIGlmIChtaW5TZWdtZW50U3RhcnRUaW1lVXMgPCAwIHx8IHZpZGVvU2VnbWVudFN0YXJ0VGltZVVzIDwgbWluU2VnbWVudFN0YXJ0VGltZVVzKSB7CisgICAgICAgICAgICBtaW5TZWdtZW50U3RhcnRUaW1lVXMgPSB2aWRlb1NlZ21lbnRTdGFydFRpbWVVczsKKyAgICAgICAgfQorCisgICAgfQorICAgIHJldHVybiBtaW5TZWdtZW50U3RhcnRUaW1lVXM7Cit9CisKIHN0YXR1c190IExpdmVTZXNzaW9uOjpvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCiAgICAgaWYgKCFtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcykgewotICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKHRpbWVVcywgZ2V0QmFuZHdpZHRoSW5kZXgoKSk7CisgICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24odGltZVVzLCBtQ3VyQmFuZHdpZHRoSW5kZXgpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKICAgICB9Ci0KLSAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IExpdmVTZXNzaW9uOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSBjb25zdCB7CkBAIC05MzUsMTQgKzExMzIsMzQgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXR1c190IExpdmVTZXNzaW9uOjpnZXRUcmFja0luZm8oUGFyY2VsICpyZXBseSkgY29uc3QgewotICAgIHJldHVybiBtUGxheWxpc3QtPmdldFRyYWNrSW5mbyhyZXBseSk7CitzaXplX3QgTGl2ZVNlc3Npb246OmdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgaWYgKG1QbGF5bGlzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtUGxheWxpc3QtPmdldFRyYWNrQ291bnQoKTsKKyAgICB9Cit9CisKK3NwPEFNZXNzYWdlPiBMaXZlU2Vzc2lvbjo6Z2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdCB7CisgICAgaWYgKG1QbGF5bGlzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtUGxheWxpc3QtPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKKyAgICB9CiB9CiAKIHN0YXR1c190IExpdmVTZXNzaW9uOjpzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KSB7CisgICAgaWYgKG1QbGF5bGlzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICArK21TdWJ0aXRsZUdlbmVyYXRpb247CiAgICAgc3RhdHVzX3QgZXJyID0gbVBsYXlsaXN0LT5zZWxlY3RUcmFjayhpbmRleCwgc2VsZWN0KTsKICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUNvbmZpZ3VyYXRpb24sIGlkKCkpOworICAgICAgICBtc2ctPnNldEludDMyKCJiYW5kd2lkdGhJbmRleCIsIG1DdXJCYW5kd2lkdGhJbmRleCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoInBpY2tUcmFjayIsIHNlbGVjdCk7CisgICAgICAgIG1zZy0+cG9zdCgpOwogICAgIH0KICAgICByZXR1cm4gZXJyOwogfQpAQCAtOTY5LDE1ICsxMTg2LDExIEBACiAgICAgQ0hFQ0soIW1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKTsKICAgICBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyA9IHRydWU7CiAKLSAgICBtUHJldkJhbmR3aWR0aEluZGV4ID0gYmFuZHdpZHRoSW5kZXg7CisgICAgbUN1ckJhbmR3aWR0aEluZGV4ID0gYmFuZHdpZHRoSW5kZXg7CiAKLSAgICBBTE9HVigiY2hhbmdlQ29uZmlndXJhdGlvbiA9PiB0aW1lVXM6JWxsZCB1cywgYndJbmRleDolZCwgcGlja1RyYWNrOiVkIiwKKyAgICBBTE9HVigiY2hhbmdlQ29uZmlndXJhdGlvbiA9PiB0aW1lVXM6JSIgUFJJZDY0ICIgdXMsIGJ3SW5kZXg6JXp1LCBwaWNrVHJhY2s6JWQiLAogICAgICAgICAgIHRpbWVVcywgYmFuZHdpZHRoSW5kZXgsIHBpY2tUcmFjayk7CiAKLSAgICBpZiAocGlja1RyYWNrKSB7Ci0gICAgICAgIG1QbGF5bGlzdC0+cGlja1JhbmRvbU1lZGlhSXRlbXMoKTsKLSAgICB9Ci0KICAgICBDSEVDS19MVChiYW5kd2lkdGhJbmRleCwgbUJhbmR3aWR0aEl0ZW1zLnNpemUoKSk7CiAgICAgY29uc3QgQmFuZHdpZHRoSXRlbSAmaXRlbSA9IG1CYW5kd2lkdGhJdGVtcy5pdGVtQXQoYmFuZHdpZHRoSW5kZXgpOwogCkBAIC0xMDAwLDE0ICsxMjEzLDE1IEBACiAKICAgICAgICAgLy8gSWYgd2UncmUgc2Vla2luZyBhbGwgY3VycmVudCBmZXRjaGVycyBhcmUgZGlzY2FyZGVkLgogICAgICAgICBpZiAodGltZVVzIDwgMGxsKSB7Ci0gICAgICAgICAgICAvLyBkZWxheSBmZXRjaGVyIHJlbW92YWwKLSAgICAgICAgICAgIGRpc2NhcmRGZXRjaGVyID0gZmFsc2U7CisgICAgICAgICAgICAvLyBkZWxheSBmZXRjaGVyIHJlbW92YWwgaWYgbm90IHBpY2tpbmcgdHJhY2tzCisgICAgICAgICAgICBkaXNjYXJkRmV0Y2hlciA9IHBpY2tUcmFjazsKIAogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBrTWF4U3RyZWFtczsgKytqKSB7CiAgICAgICAgICAgICAgICAgU3RyZWFtVHlwZSB0eXBlID0gaW5kZXhUb1R5cGUoaik7CiAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW1NYXNrICYgdHlwZSkgJiYgdXJpID09IFVSSXNbal0pIHsKICAgICAgICAgICAgICAgICAgICAgcmVzdW1lTWFzayB8PSB0eXBlOwogICAgICAgICAgICAgICAgICAgICBzdHJlYW1NYXNrICY9IH50eXBlOworICAgICAgICAgICAgICAgICAgICBkaXNjYXJkRmV0Y2hlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTAyMSwxNiArMTIzNSwxNyBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZzsKICAgICBpZiAodGltZVVzIDwgMGxsKSB7Ci0gICAgICAgIC8vIHNraXAgb25DaGFuZ2VDb25maWd1cmF0aW9uMiAoZGVjb2RlciBkZXN0cnVjdGlvbikgaWYgc3dpdGNoaW5nLgorICAgICAgICAvLyBza2lwIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIgKGRlY29kZXIgZGVzdHJ1Y3Rpb24pIGlmIG5vdCBzZWVraW5nLgogICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMywgaWQoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjIsIGlkKCkpOwogICAgIH0KICAgICBtc2ctPnNldEludDMyKCJzdHJlYW1NYXNrIiwgc3RyZWFtTWFzayk7CiAgICAgbXNnLT5zZXRJbnQzMigicmVzdW1lTWFzayIsIHJlc3VtZU1hc2spOworICAgIG1zZy0+c2V0SW50MzIoInBpY2tUcmFjayIsIHBpY2tUcmFjayk7CiAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKLSAgICAgICAgaWYgKHN0cmVhbU1hc2sgJiBpbmRleFRvVHlwZShpKSkgeworICAgICAgICBpZiAoKHN0cmVhbU1hc2sgfCByZXN1bWVNYXNrKSAmIGluZGV4VG9UeXBlKGkpKSB7CiAgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhtU3RyZWFtc1tpXS51cmlLZXkoKS5jX3N0cigpLCBVUklzW2ldLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTA0NywxNCArMTI2MiwyMCBAQAogCiAgICAgICAgIGlmIChtU2Vla1JlcGx5SUQgIT0gMCkgewogICAgICAgICAgICAgQ0hFQ0sobVNlZWtSZXBseSAhPSBOVUxMKTsKKyAgICAgICAgICAgIG1TZWVrUmVwbHktPnNldEludDMyKCJlcnIiLCBPSyk7CiAgICAgICAgICAgICBtU2Vla1JlcGx5LT5wb3N0UmVwbHkobVNlZWtSZXBseUlEKTsKKyAgICAgICAgICAgIG1TZWVrUmVwbHlJRCA9IDA7CisgICAgICAgICAgICBtU2Vla1JlcGx5LmNsZWFyKCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgTGl2ZVNlc3Npb246Om9uQ2hhbmdlQ29uZmlndXJhdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGlmICghbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpIHsKLSAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMWxsIC8qIHRpbWVVcyAqLywgZ2V0QmFuZHdpZHRoSW5kZXgoKSk7CisgICAgICAgIGludDMyX3QgcGlja1RyYWNrID0gMCwgYmFuZHdpZHRoSW5kZXggPSBtQ3VyQmFuZHdpZHRoSW5kZXg7CisgICAgICAgIG1zZy0+ZmluZEludDMyKCJwaWNrVHJhY2siLCAmcGlja1RyYWNrKTsKKyAgICAgICAgbXNnLT5maW5kSW50MzIoImJhbmR3aWR0aEluZGV4IiwgJmJhbmR3aWR0aEluZGV4KTsKKyAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMWxsIC8qIHRpbWVVcyAqLywgYmFuZHdpZHRoSW5kZXgsIHBpY2tUcmFjayk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7IC8vIHJldHJ5IGluIDEgc2VjCiAgICAgfQpAQCAtMTA2NSw4ICsxMjg2LDE0IEBACiAKICAgICAvLyBBbGwgZmV0Y2hlcnMgYXJlIGVpdGhlciBzdXNwZW5kZWQgb3IgaGF2ZSBiZWVuIHJlbW92ZWQgbm93LgogCi0gICAgdWludDMyX3Qgc3RyZWFtTWFzazsKKyAgICB1aW50MzJfdCBzdHJlYW1NYXNrLCByZXN1bWVNYXNrOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikmc3RyZWFtTWFzaykpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bWVNYXNrIiwgKGludDMyX3QgKikmcmVzdW1lTWFzaykpOworCisgICAgLy8gY3VycmVudGx5IG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIgaXMgb25seSBjYWxsZWQgZm9yIHNlZWtpbmc7CisgICAgLy8gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgQ0hFQ0sgaWYgdXNpbmcgaXQgZWxzZSB3aGVyZS4KKyAgICBDSEVDS19FUShyZXN1bWVNYXNrLCAwKTsKKyAgICBzdHJlYW1NYXNrIHw9IHJlc3VtZU1hc2s7CiAKICAgICBBU3RyaW5nIFVSSXNba01heFN0cmVhbXNdOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgewpAQCAtMTEyMywyMyArMTM1MCwzNSBAQAogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikmc3RyZWFtTWFzaykpOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bWVNYXNrIiwgKGludDMyX3QgKikmcmVzdW1lTWFzaykpOwogCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgaW50MzJfdCBwaWNrVHJhY2s7CisgICAgYm9vbCBzd2l0Y2hpbmcgPSBmYWxzZTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwaWNrVHJhY2siLCAmcGlja1RyYWNrKSk7CisKKyAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgIGlmICghcGlja1RyYWNrKSB7CisgICAgICAgICAgICBzd2l0Y2hpbmcgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1SZWFsVGltZUJhc2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBtTGFzdERlcXVldWVkVGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIG1SZWFsVGltZUJhc2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSB0aW1lVXM7CisgICAgfQorCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CiAgICAgICAgIGlmIChzdHJlYW1NYXNrICYgaW5kZXhUb1R5cGUoaSkpIHsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZyhtU3RyZWFtc1tpXS51cmlLZXkoKS5jX3N0cigpLCAmbVN0cmVhbXNbaV0ubVVyaSkpOworICAgICAgICAgICAgaWYgKHN3aXRjaGluZykgeworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZyhtU3RyZWFtc1tpXS51cmlLZXkoKS5jX3N0cigpLCAmbVN0cmVhbXNbaV0ubU5ld1VyaSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcobVN0cmVhbXNbaV0udXJpS2V5KCkuY19zdHIoKSwgJm1TdHJlYW1zW2ldLm1VcmkpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3QgdGltZVVzOwotICAgIGJvb2wgc3dpdGNoaW5nID0gZmFsc2U7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKLQotICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKLSAgICAgICAgdGltZVVzID0gbUxhc3REZXF1ZXVlZFRpbWVVczsKLSAgICAgICAgc3dpdGNoaW5nID0gdHJ1ZTsKKyAgICBtTmV3U3RyZWFtTWFzayA9IHN0cmVhbU1hc2sgfCByZXN1bWVNYXNrOworICAgIGlmIChzd2l0Y2hpbmcpIHsKKyAgICAgICAgbVN3YXBNYXNrID0gbVN0cmVhbU1hc2sgJiB+cmVzdW1lTWFzazsKICAgICB9Ci0gICAgbVJlYWxUaW1lQmFzZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHRpbWVVczsKLQotICAgIG1OZXdTdHJlYW1NYXNrID0gc3RyZWFtTWFzazsKIAogICAgIC8vIE9mIGFsbCBleGlzdGluZyBmZXRjaGVyczoKICAgICAvLyAqIFJlc3VtZSBmZXRjaGVycyB0aGF0IGFyZSBzdGlsbCBuZWVkZWQgYW5kIGFzc2lnbiB0aGVtIG9yaWdpbmFsIHBhY2tldCBzb3VyY2VzLgpAQCAtMTE1Miw2ICsxMzkxLDE2IEBACiAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga01heFN0cmVhbXM7ICsraikgewogICAgICAgICAgICAgaWYgKChyZXN1bWVNYXNrICYgaW5kZXhUb1R5cGUoaikpICYmIHVyaSA9PSBtU3RyZWFtc1tqXS5tVXJpKSB7CiAgICAgICAgICAgICAgICAgc291cmNlc1tqXSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKKworICAgICAgICAgICAgICAgIGlmIChqICE9IGtTdWJ0aXRsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJxdWV1ZWluZyBkdW1teSBkaXNjb250aW51aXR5IGZvciBzdHJlYW0gdHlwZSAlZCIsIGluZGV4VG9UeXBlKGopKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZGlzY29udGludWl0eVF1ZXVlOworICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUgPSBtRGlzY29udGludWl0aWVzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlLT5xdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTE3OSw0MyArMTQyOCw4NiBAQAogICAgICAgICB9CiAKICAgICAgICAgQVN0cmluZyB1cmk7Ci0gICAgICAgIHVyaSA9IG1TdHJlYW1zW2ldLm1Vcmk7CisgICAgICAgIHVyaSA9IHN3aXRjaGluZyA/IG1TdHJlYW1zW2ldLm1OZXdVcmkgOiBtU3RyZWFtc1tpXS5tVXJpOwogCiAgICAgICAgIHNwPFBsYXlsaXN0RmV0Y2hlcj4gZmV0Y2hlciA9IGFkZEZldGNoZXIodXJpLmNfc3RyKCkpOwogICAgICAgICBDSEVDSyhmZXRjaGVyICE9IE5VTEwpOwogCiAgICAgICAgIGludDMyX3QgbGF0ZXN0U2VxID0gLTE7Ci0gICAgICAgIGludDY0X3QgbGF0ZXN0VGltZVVzID0gMGxsOworICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gLTE7CisgICAgICAgIGludDY0X3Qgc2VnbWVudFN0YXJ0VGltZVVzID0gLTFsbDsKKyAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxID0gLTE7CiAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZXNba01heFN0cmVhbXNdOwogCisgICAgICAgIGlmIChpID09IGtTdWJ0aXRsZUluZGV4KSB7CisgICAgICAgICAgICBzZWdtZW50U3RhcnRUaW1lVXMgPSBsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWVVcygpOworICAgICAgICB9CisKICAgICAgICAgLy8gVFJJQ0tZOiBsb29waW5nIGZyb20gaSBhcyBlYXJsaWVyIHN0cmVhbXMgYXJlIGFscmVhZHkgcmVtb3ZlZCBmcm9tIHN0cmVhbU1hc2sKICAgICAgICAgZm9yIChzaXplX3QgaiA9IGk7IGogPCBrTWF4U3RyZWFtczsgKytqKSB7Ci0gICAgICAgICAgICBpZiAoKHN0cmVhbU1hc2sgJiBpbmRleFRvVHlwZShqKSkgJiYgdXJpID09IG1TdHJlYW1zW2pdLm1VcmkpIHsKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJnN0cmVhbVVyaSA9IHN3aXRjaGluZyA/IG1TdHJlYW1zW2pdLm1OZXdVcmkgOiBtU3RyZWFtc1tqXS5tVXJpOworICAgICAgICAgICAgaWYgKChzdHJlYW1NYXNrICYgaW5kZXhUb1R5cGUoaikpICYmIHVyaSA9PSBzdHJlYW1VcmkpIHsKICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoaW5kZXhUb1R5cGUoaikpOwogCi0gICAgICAgICAgICAgICAgaWYgKCFzd2l0Y2hpbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAodGltZVVzID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lVXMgPSB0aW1lVXM7CisKKyAgICAgICAgICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZGlzY29udGludWl0eVF1ZXVlOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZXh0cmEgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlID0gbURpc2NvbnRpbnVpdGllcy52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7CisgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZS0+cXVldWVEaXNjb250aW51aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9TRUVLLCBleHRyYSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlLCBzZXE7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc3JjVGltZVVzOwotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IHNvdXJjZXNbal0tPmdldExhdGVzdE1ldGEoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNyY1NlZ21lbnRTdGFydFRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGE7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaWNrVHJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdGluZworICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSA9IHNvdXJjZXNbal0tPmdldExhdGVzdERlcXVldWVkTWV0YSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRhcHRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBzb3VyY2VzW2pdLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwgJiYgIW1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZ0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJzZXEiLCAmc2VxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VxID4gbGF0ZXN0U2VxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0U2VxID0gc2VxOworICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0bXBVczsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRtcFVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lVXMgPCAwIHx8IHRtcFVzIDwgc3RhcnRUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyA9IHRtcFVzOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmc3JjVGltZVVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjVGltZVVzID4gbGF0ZXN0VGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0VGltZVVzID0gc3JjVGltZVVzOworCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsICZ0bXBVcykpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRTdGFydFRpbWVVcyA8IDAgfHwgdG1wVXMgPCBzZWdtZW50U3RhcnRUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50U3RhcnRUaW1lVXMgPSB0bXBVczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXE7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmc2VxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzY29udGludWl0eVNlcSA8IDAgfHwgc2VxIDwgZGlzY29udGludWl0eVNlcSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlTZXEgPSBzZXE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdID0gbVBhY2tldFNvdXJjZXMyLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKLSAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+Y2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXh0cmFTdHJlYW1zID0gbU5ld1N0cmVhbU1hc2sgJiAofm1TdHJlYW1NYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhU3RyZWFtcyAmIGluZGV4VG9UeXBlKGopKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5xdWV1ZUFjY2Vzc1VuaXQoY3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKC8qIHN3YXAgPSAqLyBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICBpZiAocGlja1RyYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcgdHJhY2ssIHF1ZXVlIGRpc2NvbnRpbnVpdGllcyBiZWZvcmUgY29udGVudAorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IGtTdWJ0aXRsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBkaXNjb250aW51aXR5UXVldWU7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUgPSBtRGlzY29udGludWl0aWVzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZS0+cXVldWVEaXNjb250aW51aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLCBOVUxMLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkYXB0aW5nLCBxdWV1ZSBkaXNjb250aW51aXRpZXMgYWZ0ZXIgcmVzdW1lCisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdID0gbVBhY2tldFNvdXJjZXMyLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleHRyYVN0cmVhbXMgPSBtTmV3U3RyZWFtTWFzayAmICh+bVN0cmVhbU1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhU3RyZWFtcyAmIGluZGV4VG9UeXBlKGopKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+cXVldWVBY2Nlc3NVbml0KGNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigvKnN3YXAqLyBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC0xMjI3LDE0ICsxNTE5LDE2IEBACiAgICAgICAgICAgICAgICAgc291cmNlc1trQXVkaW9JbmRleF0sCiAgICAgICAgICAgICAgICAgc291cmNlc1trVmlkZW9JbmRleF0sCiAgICAgICAgICAgICAgICAgc291cmNlc1trU3VidGl0bGVJbmRleF0sCi0gICAgICAgICAgICAgICAgdGltZVVzLAotICAgICAgICAgICAgICAgIGxhdGVzdFRpbWVVcyAvKiBtaW4gc3RhcnQgdGltZSh1cykgKi8sCi0gICAgICAgICAgICAgICAgbGF0ZXN0U2VxID49IDAgPyBsYXRlc3RTZXEgKyAxIDogLTEgLyogc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIGhpbnQgKi8gKTsKKyAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyA8IDAgPyBtTGFzdFNlZWtUaW1lVXMgOiBzdGFydFRpbWVVcywKKyAgICAgICAgICAgICAgICBzZWdtZW50U3RhcnRUaW1lVXMsCisgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVNlcSwKKyAgICAgICAgICAgICAgICBzd2l0Y2hpbmcpOwogICAgIH0KIAogICAgIC8vIEFsbCBmZXRjaGVycyBoYXZlIG5vdyBiZWVuIHN0YXJ0ZWQsIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZQogICAgIC8vIGhhcyBjb21wbGV0ZWQuCiAKKyAgICBjYW5jZWxDaGVja0JhbmR3aWR0aEV2ZW50KCk7CiAgICAgc2NoZWR1bGVDaGVja0JhbmR3aWR0aEV2ZW50KCk7CiAKICAgICBBTE9HVigiWFhYIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNvbXBsZXRlZC4iKTsKQEAgLTEyNTksOCArMTU1MywxNyBAQAogCiAgICAgaW50MzJfdCBzdHJlYW07CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0cmVhbSIsICZzdHJlYW0pKTsKLSAgICBtU3dhcE1hc2sgfD0gc3RyZWFtOwotICAgIGlmIChtU3dhcE1hc2sgIT0gbVN0cmVhbU1hc2spIHsKKworICAgIHNzaXplX3QgaWR4ID0gdHlwZVRvSW5kZXgoc3RyZWFtKTsKKyAgICBDSEVDSyhpZHggPj0gMCk7CisgICAgaWYgKChtTmV3U3RyZWFtTWFzayAmIHN0cmVhbSkgJiYgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1coInN3YXBwaW5nIHN0cmVhbSB0eXBlICVkICVzIHRvIGVtcHR5IHN0cmVhbSIsIHN0cmVhbSwgbVN0cmVhbXNbaWR4XS5tVXJpLmNfc3RyKCkpOworICAgIH0KKyAgICBtU3RyZWFtc1tpZHhdLm1VcmkgPSBtU3RyZWFtc1tpZHhdLm1OZXdVcmk7CisgICAgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmNsZWFyKCk7CisKKyAgICBtU3dhcE1hc2sgJj0gfnN0cmVhbTsKKyAgICBpZiAobVN3YXBNYXNrICE9IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTI3MCwxNSArMTU3Myw2NSBAQAogICAgICAgICBTdHJlYW1UeXBlIGV4dHJhU3RyZWFtID0gKFN0cmVhbVR5cGUpIChleHRyYVN0cmVhbXMgJiB+KGV4dHJhU3RyZWFtcyAtIDEpKTsKICAgICAgICAgc3dhcFBhY2tldFNvdXJjZShleHRyYVN0cmVhbSk7CiAgICAgICAgIGV4dHJhU3RyZWFtcyAmPSB+ZXh0cmFTdHJlYW07CisKKyAgICAgICAgaWR4ID0gdHlwZVRvSW5kZXgoZXh0cmFTdHJlYW0pOworICAgICAgICBDSEVDSyhpZHggPj0gMCk7CisgICAgICAgIGlmIChtU3RyZWFtc1tpZHhdLm1OZXdVcmkuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coInN3YXBwaW5nIGV4dHJhIHN0cmVhbSB0eXBlICVkICVzIHRvIGVtcHR5IHN0cmVhbSIsCisgICAgICAgICAgICAgICAgICAgIGV4dHJhU3RyZWFtLCBtU3RyZWFtc1tpZHhdLm1VcmkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgbVN0cmVhbXNbaWR4XS5tVXJpID0gbVN0cmVhbXNbaWR4XS5tTmV3VXJpOworICAgICAgICBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuY2xlYXIoKTsKICAgICB9CiAKICAgICB0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCgpOwogfQogCit2b2lkIExpdmVTZXNzaW9uOjpvbkNoZWNrU3dpdGNoRG93bigpIHsKKyAgICBpZiAobVN3aXRjaERvd25Nb25pdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uOworICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihpbmRleFRvVHlwZShpKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gcGFja2V0U291cmNlLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKTsKKworICAgICAgICBpZiAobWV0YSAhPSBOVUxMICYmIG1ldGEtPmZpbmRJbnQzMigidGFyZ2V0RHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb24pICkgeworICAgICAgICAgICAgaW50NjRfdCBidWZmZXJlZER1cmF0aW9uVXMgPSBwYWNrZXRTb3VyY2UtPmdldEVzdGltYXRlZER1cmF0aW9uVXMoKTsKKyAgICAgICAgICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IHRhcmdldER1cmF0aW9uICogMTAwMDAwMGxsOworCisgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwgdGFyZ2V0RHVyYXRpb25VcyAvIDMpIHsKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3dpdGNoRG93biwgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU3dpdGNoRG93bk1vbml0b3ItPnBvc3QoMTAwMDAwMGxsKTsKK30KKwordm9pZCBMaXZlU2Vzc2lvbjo6b25Td2l0Y2hEb3duKCkgeworICAgIGlmIChtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyB8fCBtU3dpdGNoSW5Qcm9ncmVzcyB8fCBtQ3VyQmFuZHdpZHRoSW5kZXggPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3NpemVfdCBiYW5kd2lkdGhJbmRleCA9IGdldEJhbmR3aWR0aEluZGV4KCk7CisgICAgaWYgKGJhbmR3aWR0aEluZGV4IDwgbUN1ckJhbmR3aWR0aEluZGV4KSB7CisgICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTEsIGJhbmR3aWR0aEluZGV4LCBmYWxzZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xLCBtQ3VyQmFuZHdpZHRoSW5kZXggLSAxLCBmYWxzZSk7Cit9CisKIC8vIE1hcmsgc3dpdGNoIGRvbmUgd2hlbjoKLS8vICAgMS4gYWxsIG9sZCBidWZmZXJzIGFyZSBzd2FwcGVkIG91dCwgQU5ECi0vLyAgIDIuIGFsbCBvbGQgZmV0Y2hlcnMgYXJlIHJlbW92ZWQuCisvLyAgIDEuIGFsbCBvbGQgYnVmZmVycyBhcmUgc3dhcHBlZCBvdXQKIHZvaWQgTGl2ZVNlc3Npb246OnRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKCkgeworICAgIGlmICghbVN3aXRjaEluUHJvZ3Jlc3MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGJvb2wgbmVlZFRvUmVtb3ZlRmV0Y2hlcnMgPSBmYWxzZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tVG9CZVJlbW92ZWQpIHsKQEAgLTEyODYsMTAgKzE2MzksMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICghbmVlZFRvUmVtb3ZlRmV0Y2hlcnMgJiYgbVN3YXBNYXNrID09IG1TdHJlYW1NYXNrKSB7CisKKyAgICBpZiAoIW5lZWRUb1JlbW92ZUZldGNoZXJzICYmIG1Td2FwTWFzayA9PSAwKSB7CisgICAgICAgIEFMT0dJKCJtU3dpdGNoSW5Qcm9ncmVzcyA9IGZhbHNlIik7CiAgICAgICAgIG1TdHJlYW1NYXNrID0gbU5ld1N0cmVhbU1hc2s7CiAgICAgICAgIG1Td2l0Y2hJblByb2dyZXNzID0gZmFsc2U7Ci0gICAgICAgIG1Td2FwTWFzayA9IDA7CiAgICAgfQogfQogCkBAIC0xMzA4LDYgKzE2NjIsMjggQEAKICAgICBtU3dpdGNoR2VuZXJhdGlvbisrOwogICAgIG1Td2l0Y2hJblByb2dyZXNzID0gZmFsc2U7CiAgICAgbVN3YXBNYXNrID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICBGZXRjaGVySW5mbyYgaW5mbyA9IG1GZXRjaGVySW5mb3MuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbmZvLm1Ub0JlUmVtb3ZlZCkgeworICAgICAgICAgICAgaW5mby5tVG9CZVJlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBpZiAoIW1TdHJlYW1zW2ldLm1OZXdVcmkuZW1wdHkoKSkgeworICAgICAgICAgICAgc3NpemVfdCBqID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KG1TdHJlYW1zW2ldLm1OZXdVcmkpOworICAgICAgICAgICAgaWYgKGogPCAwKSB7CisgICAgICAgICAgICAgICAgbVN0cmVhbXNbaV0ubU5ld1VyaS5jbGVhcigpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBGZXRjaGVySW5mbyAmaW5mbyA9IG1GZXRjaGVySW5mb3MudmFsdWVBdChqKTsKKyAgICAgICAgICAgIGluZm8ubUZldGNoZXItPnN0b3BBc3luYygpOworICAgICAgICAgICAgbUZldGNoZXJJbmZvcy5yZW1vdmVJdGVtc0F0KGopOworICAgICAgICAgICAgbVN0cmVhbXNbaV0ubU5ld1VyaS5jbGVhcigpOworICAgICAgICB9CisgICAgfQogfQogCiBib29sIExpdmVTZXNzaW9uOjpjYW5Td2l0Y2hCYW5kd2lkdGhUbyhzaXplX3QgYmFuZHdpZHRoSW5kZXgpIHsKQEAgLTEzMTUsMzMgKzE2OTEsMjkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChtUHJldkJhbmR3aWR0aEluZGV4IDwgMCkgeworICAgIGlmIChtQ3VyQmFuZHdpZHRoSW5kZXggPCAwKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIGlmIChiYW5kd2lkdGhJbmRleCA9PSAoc2l6ZV90KW1QcmV2QmFuZHdpZHRoSW5kZXgpIHsKKyAgICBpZiAoYmFuZHdpZHRoSW5kZXggPT0gKHNpemVfdCltQ3VyQmFuZHdpZHRoSW5kZXgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSBpZiAoYmFuZHdpZHRoSW5kZXggPiAoc2l6ZV90KW1QcmV2QmFuZHdpZHRoSW5kZXgpIHsKKyAgICB9IGVsc2UgaWYgKGJhbmR3aWR0aEluZGV4ID4gKHNpemVfdCltQ3VyQmFuZHdpZHRoSW5kZXgpIHsKICAgICAgICAgcmV0dXJuIGNhblN3aXRjaFVwKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQogCi12b2lkIExpdmVTZXNzaW9uOjpvbkNoZWNrQmFuZHdpZHRoKCkgewordm9pZCBMaXZlU2Vzc2lvbjo6b25DaGVja0JhbmR3aWR0aChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHNpemVfdCBiYW5kd2lkdGhJbmRleCA9IGdldEJhbmR3aWR0aEluZGV4KCk7CiAgICAgaWYgKGNhblN3aXRjaEJhbmR3aWR0aFRvKGJhbmR3aWR0aEluZGV4KSkgewogICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xbGwgLyogdGltZVVzICovLCBiYW5kd2lkdGhJbmRleCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc2NoZWR1bGVDaGVja0JhbmR3aWR0aEV2ZW50KCk7CisgICAgICAgIC8vIENvbWUgYmFjayBhbmQgY2hlY2sgYWdhaW4gMTAgc2Vjb25kcyBsYXRlciBpbiBjYXNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gbm93LgorICAgICAgICAvLyBJZiB3ZSBETyBjaGFuZ2UgY29uZmlndXJhdGlvbiwgb25jZSB0aGF0IGNvbXBsZXRlcyBpdCdsbCBzY2hlZHVsZSBhIG5ldworICAgICAgICAvLyBjaGVjayBiYW5kd2lkdGggZXZlbnQgd2l0aCBhbiBpbmNyZW1lbnRlZCBtQ2hlY2tCYW5kd2lkdGhHZW5lcmF0aW9uLgorICAgICAgICBtc2ctPnBvc3QoMTAwMDAwMDBsbCk7CiAgICAgfQotCi0gICAgLy8gSGFuZGxpbmcgdGhlIGtXaGF0Q2hlY2tCYW5kd2lkdGggZXZlbiBoZXJlIGRvZXMgX25vdF8gYXV0b21hdGljYWxseQotICAgIC8vIHNjaGVkdWxlIGFub3RoZXIgb25lIG9uIHJldHVybiwgb25seSBhbiBleHBsaWNpdCBjYWxsIHRvCi0gICAgLy8gc2NoZWR1bGVDaGVja0JhbmR3aWR0aEV2ZW50IHdpbGwgZG8gdGhhdC4KLSAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBvbmx5IG9uZSBjb25maWd1cmF0aW9uIGNoYW5nZSBpcyBvbmdvaW5nIGF0IGFueQotICAgIC8vIG9uZSB0aW1lLCBvbmNlIHRoYXQgY29tcGxldGVzIGl0J2xsIHNjaGVkdWxlIGFub3RoZXIgY2hlY2sgYmFuZHdpZHRoCi0gICAgLy8gZXZlbnQuCiB9CiAKIHZvaWQgTGl2ZVNlc3Npb246OnBvc3RQcmVwYXJlZChzdGF0dXNfdCBlcnIpIHsKQEAgLTEzNTgsNiArMTczMCw5IEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICBtSW5QcmVwYXJhdGlvblBoYXNlID0gZmFsc2U7CisKKyAgICBtU3dpdGNoRG93bk1vbml0b3IgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGVja1N3aXRjaERvd24sIGlkKCkpOworICAgIG1Td2l0Y2hEb3duTW9uaXRvci0+cG9zdCgpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKaW5kZXggM2Y4ZmVlNS4uN2FhY2NhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCkBAIC0yOCw2ICsyOCw3IEBACiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKIHN0cnVjdCBEYXRhU291cmNlOwogc3RydWN0IEhUVFBCYXNlOworc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogc3RydWN0IExpdmVEYXRhU291cmNlOwogc3RydWN0IE0zVVBhcnNlcjsKIHN0cnVjdCBQbGF5bGlzdEZldGNoZXI7CkBAIC00MCw3ICs0MSw4IEBACiAgICAgfTsKICAgICBMaXZlU2Vzc2lvbigKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwLCBib29sIHVpZFZhbGlkID0gZmFsc2UsIHVpZF90IHVpZCA9IDApOworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIGVudW0gU3RyZWFtSW5kZXggewogICAgICAgICBrQXVkaW9JbmRleCAgICA9IDAsCkBAIC02OCw3ICs3MCw4IEBACiAgICAgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3QgdGltZVVzKTsKIAogICAgIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIGNvbnN0OwotICAgIHN0YXR1c190IGdldFRyYWNrSW5mbyhQYXJjZWwgKnJlcGx5KSBjb25zdDsKKyAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0OwogICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpOwogCiAgICAgYm9vbCBpc1NlZWthYmxlKCkgY29uc3Q7CkBAIC0xMDUsNiArMTA4LDggQEAKICAgICAgICAga1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMyAgICAgICA9ICdjaEMzJywKICAgICAgICAga1doYXRGaW5pc2hEaXNjb25uZWN0MiAgICAgICAgICA9ICdmaW4yJywKICAgICAgICAga1doYXRTd2FwcGVkICAgICAgICAgICAgICAgICAgICA9ICdzd2FwJywKKyAgICAgICAga1doYXRDaGVja1N3aXRjaERvd24gICAgICAgICAgICA9ICdja1NEJywKKyAgICAgICAga1doYXRTd2l0Y2hEb3duICAgICAgICAgICAgICAgICA9ICdzRHduJywKICAgICB9OwogCiAgICAgc3RydWN0IEJhbmR3aWR0aEl0ZW0gewpAQCAtMTIxLDkgKzEyNiwyMCBAQAogCiAgICAgc3RydWN0IFN0cmVhbUl0ZW0gewogICAgICAgICBjb25zdCBjaGFyICptVHlwZTsKLSAgICAgICAgQVN0cmluZyBtVXJpOwotICAgICAgICBTdHJlYW1JdGVtKCkgOiBtVHlwZSgiIikge30KLSAgICAgICAgU3RyZWFtSXRlbShjb25zdCBjaGFyICp0eXBlKSA6IG1UeXBlKHR5cGUpIHt9CisgICAgICAgIEFTdHJpbmcgbVVyaSwgbU5ld1VyaTsKKyAgICAgICAgc2l6ZV90IG1DdXJEaXNjb250aW51aXR5U2VxOworICAgICAgICBpbnQ2NF90IG1MYXN0RGVxdWV1ZWRUaW1lVXM7CisgICAgICAgIGludDY0X3QgbUxhc3RTYW1wbGVEdXJhdGlvblVzOworICAgICAgICBTdHJlYW1JdGVtKCkKKyAgICAgICAgICAgIDogbVR5cGUoIiIpLAorICAgICAgICAgICAgICBtQ3VyRGlzY29udGludWl0eVNlcSgwKSwKKyAgICAgICAgICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcygwKSwKKyAgICAgICAgICAgICAgbUxhc3RTYW1wbGVEdXJhdGlvblVzKDApIHt9CisgICAgICAgIFN0cmVhbUl0ZW0oY29uc3QgY2hhciAqdHlwZSkKKyAgICAgICAgICAgIDogbVR5cGUodHlwZSksCisgICAgICAgICAgICAgIG1DdXJEaXNjb250aW51aXR5U2VxKDApLAorICAgICAgICAgICAgICBtTGFzdERlcXVldWVkVGltZVVzKDApLAorICAgICAgICAgICAgICBtTGFzdFNhbXBsZUR1cmF0aW9uVXMoMCkge30KICAgICAgICAgQVN0cmluZyB1cmlLZXkoKSB7CiAgICAgICAgICAgICBBU3RyaW5nIGtleShtVHlwZSk7CiAgICAgICAgICAgICBrZXkuYXBwZW5kKCJVUkkiKTsKQEAgLTEzNCwxMCArMTUwLDEwIEBACiAKICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgYm9vbCBtVUlEVmFsaWQ7Ci0gICAgdWlkX3QgbVVJRDsKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogCiAgICAgYm9vbCBtSW5QcmVwYXJhdGlvblBoYXNlOworICAgIGJvb2wgbUJ1ZmZlcmluZ1trTWF4U3RyZWFtc107CiAKICAgICBzcDxIVFRQQmFzZT4gbUhUVFBEYXRhU291cmNlOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1FeHRyYUhlYWRlcnM7CkBAIC0xNDUsNyArMTYxLDcgQEAKICAgICBBU3RyaW5nIG1NYXN0ZXJVUkw7CiAKICAgICBWZWN0b3I8QmFuZHdpZHRoSXRlbT4gbUJhbmR3aWR0aEl0ZW1zOwotICAgIHNzaXplX3QgbVByZXZCYW5kd2lkdGhJbmRleDsKKyAgICBzc2l6ZV90IG1DdXJCYW5kd2lkdGhJbmRleDsKIAogICAgIHNwPE0zVVBhcnNlcj4gbVBsYXlsaXN0OwogCkBAIC0xNjEsNiArMTc3LDcgQEAKICAgICAvLyB3ZSB1c2UgdGhpcyB0byB0cmFjayByZWNvbmZpZ3VyYXRpb24gcHJvZ3Jlc3MuCiAgICAgdWludDMyX3QgbVN3YXBNYXNrOwogCisgICAgS2V5ZWRWZWN0b3I8U3RyZWFtVHlwZSwgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gPiBtRGlzY29udGludWl0aWVzOwogICAgIEtleWVkVmVjdG9yPFN0cmVhbVR5cGUsIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ID4gbVBhY2tldFNvdXJjZXM7CiAgICAgLy8gQSBzZWNvbmQgc2V0IG9mIHBhY2tldCBzb3VyY2VzIHRoYXQgYnVmZmVyIGNvbnRlbnQgZm9yIHRoZSB2YXJpYW50IHdlJ3JlIHN3aXRjaGluZyB0by4KICAgICBLZXllZFZlY3RvcjxTdHJlYW1UeXBlLCBzcDxBbm90aGVyUGFja2V0U291cmNlPiA+IG1QYWNrZXRTb3VyY2VzMjsKQEAgLTE3Miw2ICsxODksNyBAQAogCiAgICAgaW50MzJfdCBtQ2hlY2tCYW5kd2lkdGhHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbVN3aXRjaEdlbmVyYXRpb247CisgICAgaW50MzJfdCBtU3VidGl0bGVHZW5lcmF0aW9uOwogCiAgICAgc2l6ZV90IG1Db250aW51YXRpb25Db3VudGVyOwogICAgIHNwPEFNZXNzYWdlPiBtQ29udGludWF0aW9uOwpAQCAtMTg1LDYgKzIwMywxMyBAQAogICAgIHVpbnQzMl90IG1EaXNjb25uZWN0UmVwbHlJRDsKICAgICB1aW50MzJfdCBtU2Vla1JlcGx5SUQ7CiAKKyAgICBib29sIG1GaXJzdFRpbWVVc1ZhbGlkOworICAgIGludDY0X3QgbUZpcnN0VGltZVVzOworICAgIGludDY0X3QgbUxhc3RTZWVrVGltZVVzOworICAgIHNwPEFNZXNzYWdlPiBtU3dpdGNoRG93bk1vbml0b3I7CisgICAgS2V5ZWRWZWN0b3I8c2l6ZV90LCBpbnQ2NF90PiBtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVczsKKyAgICBLZXllZFZlY3RvcjxzaXplX3QsIGludDY0X3Q+IG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVczsKKwogICAgIHNwPFBsYXlsaXN0RmV0Y2hlcj4gYWRkRmV0Y2hlcihjb25zdCBjaGFyICp1cmkpOwogCiAgICAgdm9pZCBvbkNvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwpAQCAtMjE2LDkgKzI0MSwxMSBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCB1aW50OF90ICpjdXJQbGF5bGlzdEhhc2gsIGJvb2wgKnVuY2hhbmdlZCk7CiAKICAgICBzaXplX3QgZ2V0QmFuZHdpZHRoSW5kZXgoKTsKKyAgICBpbnQ2NF90IGxhdGVzdE1lZGlhU2VnbWVudFN0YXJ0VGltZVVzKCk7CiAKICAgICBzdGF0aWMgaW50IFNvcnRCeUJhbmR3aWR0aChjb25zdCBCYW5kd2lkdGhJdGVtICosIGNvbnN0IEJhbmR3aWR0aEl0ZW0gKik7CiAgICAgc3RhdGljIFN0cmVhbVR5cGUgaW5kZXhUb1R5cGUoaW50IGlkeCk7CisgICAgc3RhdGljIHNzaXplX3QgdHlwZVRvSW5kZXgoaW50MzJfdCB0eXBlKTsKIAogICAgIHZvaWQgY2hhbmdlQ29uZmlndXJhdGlvbigKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBzaXplX3QgYmFuZHdpZHRoSW5kZXgsIGJvb2wgcGlja1RyYWNrID0gZmFsc2UpOwpAQCAtMjI2LDYgKzI1Myw4IEBACiAgICAgdm9pZCBvbkNoYW5nZUNvbmZpZ3VyYXRpb24yKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25Td2FwcGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uQ2hlY2tTd2l0Y2hEb3duKCk7CisgICAgdm9pZCBvblN3aXRjaERvd24oKTsKICAgICB2b2lkIHRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKCk7CiAKICAgICB2b2lkIHNjaGVkdWxlQ2hlY2tCYW5kd2lkdGhFdmVudCgpOwpAQCAtMjM3LDcgKzI2Niw3IEBACiAgICAgdm9pZCBjYW5jZWxCYW5kd2lkdGhTd2l0Y2goKTsKIAogICAgIGJvb2wgY2FuU3dpdGNoQmFuZHdpZHRoVG8oc2l6ZV90IGJhbmR3aWR0aEluZGV4KTsKLSAgICB2b2lkIG9uQ2hlY2tCYW5kd2lkdGgoKTsKKyAgICB2b2lkIG9uQ2hlY2tCYW5kd2lkdGgoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgdm9pZCBmaW5pc2hEaXNjb25uZWN0KCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCmluZGV4IGUzMWFkNDAuLjE2NTFkZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CkBAIC01OCw4ICs1OSw4IEBACiAKICAgICB2b2lkIHBpY2tSYW5kb21NZWRpYUl0ZW1zKCk7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7Ci0gICAgdm9pZCBnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Q7CiAgICAgc2l6ZV90IGNvdW50VHJhY2tzKCkgY29uc3Q7CisgICAgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWVkaWFHcm91cCgpOwpAQCAtMTI2LDcgKzEyNyw3IEBACiAgICAgICAgICAgICAgICAgbVNlbGVjdGVkSW5kZXggPSBzdHJ0b3VsKHZhbHVlLCAmZW5kLCAxMCk7CiAgICAgICAgICAgICAgICAgQ0hFQ0soZW5kID4gdmFsdWUgJiYgKmVuZCA9PSAnXDAnKTsKIAotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRJbmRleCA+PSBtTWVkaWFJdGVtcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkSW5kZXggPj0gKHNzaXplX3QpbU1lZGlhSXRlbXMuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZEluZGV4ID0gbU1lZGlhSXRlbXMuc2l6ZSgpIC0gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTU2LDY1ICsxNTcsNzIgQEAKIH0KIAogc3RhdHVzX3QgTTNVUGFyc2VyOjpNZWRpYUdyb3VwOjpzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KSB7Ci0gICAgaWYgKG1UeXBlICE9IFRZUEVfU1VCUykgewotICAgICAgICBBTE9HRSgib25seSBzZWxlY3Qgc3VidGl0aWxlIHRyYWNrcyBmb3Igbm93ISIpOworICAgIGlmIChtVHlwZSAhPSBUWVBFX1NVQlMgJiYgbVR5cGUgIT0gVFlQRV9BVURJTykgeworICAgICAgICBBTE9HRSgib25seSBzZWxlY3Qgc3VidGl0aWxlL2F1ZGlvIHRyYWNrcyBmb3Igbm93ISIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgaWYgKHNlbGVjdCkgewogICAgICAgICBpZiAoaW5kZXggPj0gbU1lZGlhSXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgidHJhY2sgJWQgZG9lcyBub3QgZXhpc3QiLCBpbmRleCk7CisgICAgICAgICAgICBBTE9HRSgidHJhY2sgJXp1IGRvZXMgbm90IGV4aXN0IiwgaW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRJbmRleCA9PSBpbmRleCkgewotICAgICAgICAgICAgQUxPR0UoInRyYWNrICVkIGFscmVhZHkgc2VsZWN0ZWQiLCBpbmRleCk7CisgICAgICAgIGlmIChtU2VsZWN0ZWRJbmRleCA9PSAoc3NpemVfdClpbmRleCkgeworICAgICAgICAgICAgQUxPR0UoInRyYWNrICV6dSBhbHJlYWR5IHNlbGVjdGVkIiwgaW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigic2VsZWN0ZWQgdHJhY2sgJWQiLCBpbmRleCk7CisgICAgICAgIEFMT0dWKCJzZWxlY3RlZCB0cmFjayAlenUiLCBpbmRleCk7CiAgICAgICAgIG1TZWxlY3RlZEluZGV4ID0gaW5kZXg7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1TZWxlY3RlZEluZGV4ICE9IGluZGV4KSB7Ci0gICAgICAgICAgICBBTE9HRSgidHJhY2sgJWQgaXMgbm90IHNlbGVjdGVkIiwgaW5kZXgpOworICAgICAgICBpZiAobVNlbGVjdGVkSW5kZXggIT0gKHNzaXplX3QpaW5kZXgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgaXMgbm90IHNlbGVjdGVkIiwgaW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigidW5zZWxlY3RlZCB0cmFjayAlZCIsIGluZGV4KTsKKyAgICAgICAgQUxPR1YoInVuc2VsZWN0ZWQgdHJhY2sgJXp1IiwgaW5kZXgpOwogICAgICAgICBtU2VsZWN0ZWRJbmRleCA9IC0xOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBNM1VQYXJzZXI6Ok1lZGlhR3JvdXA6OmdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdCB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFJdGVtcy5zaXplKCk7ICsraSkgewotICAgICAgICByZXBseS0+d3JpdGVJbnQzMigyKTsgLy8gMiBmaWVsZHMKLQotICAgICAgICBpZiAobVR5cGUgPT0gVFlQRV9BVURJTykgewotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTyk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gVFlQRV9WSURFTykgewotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gVFlQRV9TVUJTKSB7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTik7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBNZWRpYSAmaXRlbSA9IG1NZWRpYUl0ZW1zLml0ZW1BdChpKTsKLSAgICAgICAgY29uc3QgY2hhciAqbGFuZyA9IGl0ZW0ubUxhbmd1YWdlLmVtcHR5KCkgPyAidW5kIiA6IGl0ZW0ubUxhbmd1YWdlLmNfc3RyKCk7Ci0gICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KGxhbmcpKTsKLQotICAgICAgICBpZiAobVR5cGUgPT0gVFlQRV9TVUJTKSB7Ci0gICAgICAgICAgICAvLyBUTy1ETzogcGFzcyBpbiBhIE1lZGlhRm9ybWF0IGluc3RlYWQKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCEhKGl0ZW0ubUZsYWdzICYgTWVkaWFHcm91cDo6RkxBR19BVVRPU0VMRUNUKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMighIShpdGVtLm1GbGFncyAmIE1lZGlhR3JvdXA6OkZMQUdfREVGQVVMVCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoISEoaXRlbS5tRmxhZ3MgJiBNZWRpYUdyb3VwOjpGTEFHX0ZPUkNFRCkpOwotICAgICAgICB9Ci0gICAgfQotfQotCiBzaXplX3QgTTNVUGFyc2VyOjpNZWRpYUdyb3VwOjpjb3VudFRyYWNrcygpIGNvbnN0IHsKICAgICByZXR1cm4gbU1lZGlhSXRlbXMuc2l6ZSgpOwogfQogCitzcDxBTWVzc2FnZT4gTTNVUGFyc2VyOjpNZWRpYUdyb3VwOjpnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgaWYgKGluZGV4ID49IG1NZWRpYUl0ZW1zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisKKyAgICBpbnQzMl90IHRyYWNrVHlwZTsKKyAgICBpZiAobVR5cGUgPT0gVFlQRV9BVURJTykgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX0FVRElPOworICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gVFlQRV9WSURFTykgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOworICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gVFlQRV9TVUJTKSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOOworICAgIH0KKyAgICBmb3JtYXQtPnNldEludDMyKCJ0eXBlIiwgdHJhY2tUeXBlKTsKKworICAgIGNvbnN0IE1lZGlhICZpdGVtID0gbU1lZGlhSXRlbXMuaXRlbUF0KGluZGV4KTsKKyAgICBjb25zdCBjaGFyICpsYW5nID0gaXRlbS5tTGFuZ3VhZ2UuZW1wdHkoKSA/ICJ1bmQiIDogaXRlbS5tTGFuZ3VhZ2UuY19zdHIoKTsKKyAgICBmb3JtYXQtPnNldFN0cmluZygibGFuZ3VhZ2UiLCBsYW5nKTsKKworICAgIGlmIChtVHlwZSA9PSBUWVBFX1NVQlMpIHsKKyAgICAgICAgLy8gVE8tRE86IHBhc3MgaW4gYSBNZWRpYUZvcm1hdCBpbnN0ZWFkCisgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVEVYVF9WVFQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhdXRvIiwgISEoaXRlbS5tRmxhZ3MgJiBNZWRpYUdyb3VwOjpGTEFHX0FVVE9TRUxFQ1QpKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZGVmYXVsdCIsICEhKGl0ZW0ubUZsYWdzICYgTWVkaWFHcm91cDo6RkxBR19ERUZBVUxUKSk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImZvcmNlZCIsICEhKGl0ZW0ubUZsYWdzICYgTWVkaWFHcm91cDo6RkxBR19GT1JDRUQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZm9ybWF0OworfQorCiBib29sIE0zVVBhcnNlcjo6TWVkaWFHcm91cDo6Z2V0QWN0aXZlVVJJKEFTdHJpbmcgKnVyaSkgY29uc3QgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhSXRlbXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKG1TZWxlY3RlZEluZGV4ID49IDAgJiYgaSA9PSAoc2l6ZV90KW1TZWxlY3RlZEluZGV4KSB7CkBAIC0yMzgsNiArMjQ2LDcgQEAKICAgICAgIG1Jc1ZhcmlhbnRQbGF5bGlzdChmYWxzZSksCiAgICAgICBtSXNDb21wbGV0ZShmYWxzZSksCiAgICAgICBtSXNFdmVudChmYWxzZSksCisgICAgICBtRGlzY29udGludWl0eVNlcSgwKSwKICAgICAgIG1TZWxlY3RlZEluZGV4KC0xKSB7CiAgICAgbUluaXRDaGVjayA9IHBhcnNlKGRhdGEsIHNpemUpOwogfQpAQCAtMjY1LDYgKzI3NCwxMCBAQAogICAgIHJldHVybiBtSXNFdmVudDsKIH0KIAorc2l6ZV90IE0zVVBhcnNlcjo6Z2V0RGlzY29udGludWl0eVNlcSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbURpc2NvbnRpbnVpdHlTZXE7Cit9CisKIHNwPEFNZXNzYWdlPiBNM1VQYXJzZXI6Om1ldGEoKSB7CiAgICAgcmV0dXJuIG1NZXRhOwogfQpAQCAtMzE5LDE3ICszMzIsMjQgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IE0zVVBhcnNlcjo6Z2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0IHsKK3NpemVfdCBNM1VQYXJzZXI6OmdldFRyYWNrQ291bnQoKSBjb25zdCB7CiAgICAgc2l6ZV90IHRyYWNrQ291bnQgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhR3JvdXBzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIHRyYWNrQ291bnQgKz0gbU1lZGlhR3JvdXBzLnZhbHVlQXQoaSktPmNvdW50VHJhY2tzKCk7CiAgICAgfQotICAgIHJlcGx5LT53cml0ZUludDMyKHRyYWNrQ291bnQpOworICAgIHJldHVybiB0cmFja0NvdW50OworfQogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFHcm91cHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbU1lZGlhR3JvdXBzLnZhbHVlQXQoaSktPmdldFRyYWNrSW5mbyhyZXBseSk7CitzcDxBTWVzc2FnZT4gTTNVUGFyc2VyOjpnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgaSA9IDAsIGlpID0gaW5kZXg7IGkgPCBtTWVkaWFHcm91cHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3A8TWVkaWFHcm91cD4gZ3JvdXAgPSBtTWVkaWFHcm91cHMudmFsdWVBdChpKTsKKyAgICAgICAgc2l6ZV90IHRyYWNrcyA9IGdyb3VwLT5jb3VudFRyYWNrcygpOworICAgICAgICBpZiAoaWkgPCB0cmFja3MpIHsKKyAgICAgICAgICAgIHJldHVybiBncm91cC0+Z2V0VHJhY2tJbmZvKGlpKTsKKyAgICAgICAgfQorICAgICAgICBpaSAtPSB0cmFja3M7CiAgICAgfQotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3NpemVfdCBNM1VQYXJzZXI6OmdldFNlbGVjdGVkSW5kZXgoKSBjb25zdCB7CkBAIC0zOTgsNiArNDE4LDggQEAKICAgICAgICAgLy8gQmFzZSBVUkwgbXVzdCBiZSBhYnNvbHV0ZQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIGNvbnN0IHNpemVfdCBzY2hlbWVFbmQgPSAoc3Ryc3RyKGJhc2VVUkwsICIvLyIpIC0gYmFzZVVSTCkgKyAyOworICAgIENIRUNLKHNjaGVtZUVuZCA9PSA3IHx8IHNjaGVtZUVuZCA9PSA4KTsKIAogICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmwsIDcpIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmwsIDgpKSB7CiAgICAgICAgIC8vICJ1cmwiIGlzIGFscmVhZHkgYW4gYWJzb2x1dGUgVVJMLCBpZ25vcmUgYmFzZSBVUkwuCkBAIC00NDIsNyArNDY0LDcgQEAKIAogICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBmb3VuZCBzbGFzaCBhY3R1YWxseSBpcyBwYXJ0IG9mIHRoZSBwYXRoCiAgICAgICAgIC8vIGFuZCBub3QgcGFydCBvZiB0aGUgImh0dHA6Ly8iLgotICAgICAgICBpZiAoZW5kID4gNikgeworICAgICAgICBpZiAoZW5kID49IHNjaGVtZUVuZCkgewogICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMLCBlbmQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMKTsKQEAgLTU1MCw2ICs1NzIsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiI0VYVC1YLU1FRElBIikpIHsKICAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZU1lZGlhKGxpbmUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNFWFQtWC1ESVNDT05USU5VSVRZLVNFUVVFTkNFIikpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2VxOworICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlRGlzY29udGludWl0eVNlcXVlbmNlKGxpbmUsICZzZXEpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlTZXEgPSBzZXE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC03MTMsNiArNzQxLDkgQEAKIAogICAgICAgICAgICAga2V5LnRvbG93ZXIoKTsKICAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvZGVjcyA9IHVucXVvdGVTdHJpbmcodmFsKTsKKyAgICAgICAgICAgIGlmIChtZXRhLT5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKm1ldGEgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAoKm1ldGEpLT5zZXRTdHJpbmcoa2V5LmNfc3RyKCksIGNvZGVjcy5jX3N0cigpKTsKICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcCgiYXVkaW8iLCBrZXkuY19zdHIoKSkKICAgICAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcCgidmlkZW8iLCBrZXkuY19zdHIoKSkKQEAgLTczNiw2ICs3NjcsOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBrZXkudG9sb3dlcigpOworICAgICAgICAgICAgaWYgKG1ldGEtPmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqbWV0YSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgICgqbWV0YSktPnNldFN0cmluZyhrZXkuY19zdHIoKSwgZ3JvdXBJRC5jX3N0cigpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTc5OCw4ICs4MzIsOCBAQAogICAgICAgICAgICAgICAgIGlmIChNYWtlVVJMKGJhc2VVUkkuY19zdHIoKSwgdmFsLmNfc3RyKCksICZhYnNVUkkpKSB7CiAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGFic1VSSTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIG1ha2UgYWJzb2x1dGUgdXJsIGZvciAnJXMnLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIG1ha2UgYWJzb2x1dGUgdXJsIGZvciAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaURlYnVnU3RyaW5nKGJhc2VVUkkpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMTA4Nyw2ICsxMTIxLDMwIEBACiB9CiAKIC8vIHN0YXRpYworc3RhdHVzX3QgTTNVUGFyc2VyOjpwYXJzZURpc2NvbnRpbnVpdHlTZXF1ZW5jZShjb25zdCBBU3RyaW5nICZsaW5lLCBzaXplX3QgKnNlcSkgeworICAgIHNzaXplX3QgY29sb25Qb3MgPSBsaW5lLmZpbmQoIjoiKTsKKworICAgIGlmIChjb2xvblBvcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpbnQzMl90IHg7CisgICAgc3RhdHVzX3QgZXJyID0gUGFyc2VJbnQzMihsaW5lLmNfc3RyKCkgKyBjb2xvblBvcyArIDEsICZ4KTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHggPCAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKHNlcSkgeworICAgICAgICAqc2VxID0geDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBzdGF0aWMKIHN0YXR1c190IE0zVVBhcnNlcjo6UGFyc2VJbnQzMihjb25zdCBjaGFyICpzLCBpbnQzMl90ICp4KSB7CiAgICAgY2hhciAqZW5kOwogICAgIGxvbmcgbHZhbCA9IHN0cnRvbChzLCAmZW5kLCAxMCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5oCmluZGV4IGNjZDY1NTYuLmQ1ODhhZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5oCkBAIC0zNCw2ICszNCw3IEBACiAgICAgYm9vbCBpc1ZhcmlhbnRQbGF5bGlzdCgpIGNvbnN0OwogICAgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0OwogICAgIGJvb2wgaXNFdmVudCgpIGNvbnN0OworICAgIHNpemVfdCBnZXREaXNjb250aW51aXR5U2VxKCkgY29uc3Q7CiAKICAgICBzcDxBTWVzc2FnZT4gbWV0YSgpOwogCkBAIC00Miw3ICs0Myw4IEBACiAKICAgICB2b2lkIHBpY2tSYW5kb21NZWRpYUl0ZW1zKCk7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7Ci0gICAgc3RhdHVzX3QgZ2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0OworICAgIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CisgICAgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0OwogICAgIHNzaXplX3QgZ2V0U2VsZWN0ZWRJbmRleCgpIGNvbnN0OwogCiAgICAgYm9vbCBnZXRUeXBlVVJJKHNpemVfdCBpbmRleCwgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp1cmkpIGNvbnN0OwpAQCAtNjUsNiArNjcsNyBAQAogICAgIGJvb2wgbUlzVmFyaWFudFBsYXlsaXN0OwogICAgIGJvb2wgbUlzQ29tcGxldGU7CiAgICAgYm9vbCBtSXNFdmVudDsKKyAgICBzaXplX3QgbURpc2NvbnRpbnVpdHlTZXE7CiAKICAgICBzcDxBTWVzc2FnZT4gbU1ldGE7CiAgICAgVmVjdG9yPEl0ZW0+IG1JdGVtczsKQEAgLTkzLDYgKzk2LDggQEAKIAogICAgIHN0YXR1c190IHBhcnNlTWVkaWEoY29uc3QgQVN0cmluZyAmbGluZSk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3QgcGFyc2VEaXNjb250aW51aXR5U2VxdWVuY2UoY29uc3QgQVN0cmluZyAmbGluZSwgc2l6ZV90ICpzZXEpOworCiAgICAgc3RhdGljIHN0YXR1c190IFBhcnNlSW50MzIoY29uc3QgY2hhciAqcywgaW50MzJfdCAqeCk7CiAgICAgc3RhdGljIHN0YXR1c190IFBhcnNlRG91YmxlKGNvbnN0IGNoYXIgKnMsIGRvdWJsZSAqeCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCmluZGV4IDY2OGNiZDQuLjMwZmE4NjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcApAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKICNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KICNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgogCkBAIC00OCwzMSArNDksMzYgQEAKIC8vIHN0YXRpYwogY29uc3QgaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmtNaW5CdWZmZXJlZER1cmF0aW9uVXMgPSAxMDAwMDAwMGxsOwogY29uc3QgaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmtNYXhNb25pdG9yRGVsYXlVcyA9IDMwMDAwMDBsbDsKLWNvbnN0IGludDMyX3QgUGxheWxpc3RGZXRjaGVyOjprRG93bmxvYWRCbG9ja1NpemUgPSAxOTI7Citjb25zdCBpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6a0Rvd25sb2FkQmxvY2tTaXplID0gMjA0ODsKIGNvbnN0IGludDMyX3QgUGxheWxpc3RGZXRjaGVyOjprTnVtU2tpcEZyYW1lcyA9IDEwOwogCiBQbGF5bGlzdEZldGNoZXI6OlBsYXlsaXN0RmV0Y2hlcigKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgIGNvbnN0IHNwPExpdmVTZXNzaW9uPiAmc2Vzc2lvbiwKLSAgICAgICAgY29uc3QgY2hhciAqdXJpKQorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludDMyX3Qgc3VidGl0bGVHZW5lcmF0aW9uKQogICAgIDogbU5vdGlmeShub3RpZnkpLAogICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5KG5vdGlmeS0+ZHVwKCkpLAogICAgICAgbVNlc3Npb24oc2Vzc2lvbiksCiAgICAgICBtVVJJKHVyaSksCiAgICAgICBtU3RyZWFtVHlwZU1hc2soMCksCiAgICAgICBtU3RhcnRUaW1lVXMoLTFsbCksCi0gICAgICBtTWluU3RhcnRUaW1lVXMoMGxsKSwKLSAgICAgIG1TdG9wUGFyYW1zKE5VTEwpLAorICAgICAgbVNlZ21lbnRTdGFydFRpbWVVcygtMWxsKSwKKyAgICAgIG1EaXNjb250aW51aXR5U2VxKC0xbGwpLAorICAgICAgbVN0YXJ0VGltZVVzUmVsYXRpdmUoZmFsc2UpLAogICAgICAgbUxhc3RQbGF5bGlzdEZldGNoVGltZVVzKC0xbGwpLAogICAgICAgbVNlcU51bWJlcigtMSksCiAgICAgICBtTnVtUmV0cmllcygwKSwKICAgICAgIG1TdGFydHVwKHRydWUpLAorICAgICAgbUFkYXB0aXZlKGZhbHNlKSwKICAgICAgIG1QcmVwYXJlZChmYWxzZSksCiAgICAgICBtTmV4dFBUU1RpbWVVcygtMWxsKSwKICAgICAgIG1Nb25pdG9yUXVldWVHZW5lcmF0aW9uKDApLAorICAgICAgbVN1YnRpdGxlR2VuZXJhdGlvbihzdWJ0aXRsZUdlbmVyYXRpb24pLAogICAgICAgbVJlZnJlc2hTdGF0ZShJTklUSUFMX01JTklNVU1fUkVMT0FEX0RFTEFZKSwKICAgICAgIG1GaXJzdFBUU1ZhbGlkKGZhbHNlKSwKLSAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcygwbGwpIHsKKyAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcygwbGwpLAorICAgICAgbVZpZGVvQnVmZmVyKG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwpKSB7CiAgICAgbWVtc2V0KG1QbGF5bGlzdEhhc2gsIDAsIHNpemVvZihtUGxheWxpc3RIYXNoKSk7CiAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U3RhcnRlZEF0KTsKICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJzdHJlYW1NYXNrIiwgMCk7CkBAIC0zMTYsNyArMzIyLDcgQEAKICAgICAgICAgbWF4RGVsYXlVcyA9IG1pbkRlbGF5VXM7CiAgICAgfQogICAgIGlmIChkZWxheVVzID4gbWF4RGVsYXlVcykgewotICAgICAgICBBTE9HVigiTmVlZCB0byByZWZyZXNoIHBsYXlsaXN0IGluICVsbGQiLCBtYXhEZWxheVVzKTsKKyAgICAgICAgQUxPR1YoIk5lZWQgdG8gcmVmcmVzaCBwbGF5bGlzdCBpbiAlIiBQUklkNjQgLCBtYXhEZWxheVVzKTsKICAgICAgICAgZGVsYXlVcyA9IG1heERlbGF5VXM7CiAgICAgfQogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRNb25pdG9yUXVldWUsIGlkKCkpOwpAQCAtMzMzLDggKzMzOSw5IEBACiAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZ2aWRlb1NvdXJjZSwKICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnN1YnRpdGxlU291cmNlLAogICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzLAotICAgICAgICBpbnQ2NF90IG1pblN0YXJ0VGltZVVzLAotICAgICAgICBpbnQzMl90IHN0YXJ0U2VxTnVtYmVySGludCkgeworICAgICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcywKKyAgICAgICAgaW50MzJfdCBzdGFydERpc2NvbnRpbnVpdHlTZXEsCisgICAgICAgIGJvb2wgYWRhcHRpdmUpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpOwogCiAgICAgdWludDMyX3Qgc3RyZWFtVHlwZU1hc2sgPSAwdWw7CkBAIC0zNTYsOCArMzYzLDkgQEAKIAogICAgIG1zZy0+c2V0SW50MzIoInN0cmVhbVR5cGVNYXNrIiwgc3RyZWFtVHlwZU1hc2spOwogICAgIG1zZy0+c2V0SW50NjQoInN0YXJ0VGltZVVzIiwgc3RhcnRUaW1lVXMpOwotICAgIG1zZy0+c2V0SW50NjQoIm1pblN0YXJ0VGltZVVzIiwgbWluU3RhcnRUaW1lVXMpOwotICAgIG1zZy0+c2V0SW50MzIoInN0YXJ0U2VxTnVtYmVySGludCIsIHN0YXJ0U2VxTnVtYmVySGludCk7CisgICAgbXNnLT5zZXRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgc2VnbWVudFN0YXJ0VGltZVVzKTsKKyAgICBtc2ctPnNldEludDMyKCJzdGFydERpc2NvbnRpbnVpdHlTZXEiLCBzdGFydERpc2NvbnRpbnVpdHlTZXEpOworICAgIG1zZy0+c2V0SW50MzIoImFkYXB0aXZlIiwgYWRhcHRpdmUpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCkBAIC0zNjUsOSArMzczLDkgQEAKICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpKS0+cG9zdCgpOwogfQogCi12b2lkIFBsYXlsaXN0RmV0Y2hlcjo6c3RvcEFzeW5jKGJvb2wgc2VsZlRyaWdnZXJlZCkgewordm9pZCBQbGF5bGlzdEZldGNoZXI6OnN0b3BBc3luYyhib29sIGNsZWFyKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIGlkKCkpOwotICAgIG1zZy0+c2V0SW50MzIoInNlbGZUcmlnZ2VyZWQiLCBzZWxmVHJpZ2dlcmVkKTsKKyAgICBtc2ctPnNldEludDMyKCJjbGVhciIsIGNsZWFyKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIApAQCAtNDQ3LDEwICs0NTUsMTMgQEAKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RyZWFtVHlwZU1hc2siLCAoaW50MzJfdCAqKSZzdHJlYW1UeXBlTWFzaykpOwogCiAgICAgaW50NjRfdCBzdGFydFRpbWVVczsKLSAgICBpbnQzMl90IHN0YXJ0U2VxTnVtYmVySGludDsKKyAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVczsKKyAgICBpbnQzMl90IHN0YXJ0RGlzY29udGludWl0eVNlcTsKKyAgICBpbnQzMl90IGFkYXB0aXZlOwogICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzdGFydFRpbWVVcyIsICZzdGFydFRpbWVVcykpOwotICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJtaW5TdGFydFRpbWVVcyIsIChpbnQ2NF90ICopICZtTWluU3RhcnRUaW1lVXMpKTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RhcnRTZXFOdW1iZXJIaW50IiwgJnN0YXJ0U2VxTnVtYmVySGludCkpOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmc2VnbWVudFN0YXJ0VGltZVVzKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0YXJ0RGlzY29udGludWl0eVNlcSIsICZzdGFydERpc2NvbnRpbnVpdHlTZXEpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYWRhcHRpdmUiLCAmYWRhcHRpdmUpKTsKIAogICAgIGlmIChzdHJlYW1UeXBlTWFzayAmIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPKSB7CiAgICAgICAgIHZvaWQgKnB0cjsKQEAgLTQ4MCwxNiArNDkxLDE2IEBACiAgICAgfQogCiAgICAgbVN0cmVhbVR5cGVNYXNrID0gc3RyZWFtVHlwZU1hc2s7Ci0gICAgbVN0YXJ0VGltZVVzID0gc3RhcnRUaW1lVXM7CiAKLSAgICBpZiAobVN0YXJ0VGltZVVzID49IDBsbCkgeworICAgIG1TZWdtZW50U3RhcnRUaW1lVXMgPSBzZWdtZW50U3RhcnRUaW1lVXM7CisgICAgbURpc2NvbnRpbnVpdHlTZXEgPSBzdGFydERpc2NvbnRpbnVpdHlTZXE7CisKKyAgICBpZiAoc3RhcnRUaW1lVXMgPj0gMCkgeworICAgICAgICBtU3RhcnRUaW1lVXMgPSBzdGFydFRpbWVVczsKICAgICAgICAgbVNlcU51bWJlciA9IC0xOwogICAgICAgICBtU3RhcnR1cCA9IHRydWU7CiAgICAgICAgIG1QcmVwYXJlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIGlmIChzdGFydFNlcU51bWJlckhpbnQgPj0gMCkgewotICAgICAgICBtU2VxTnVtYmVyID0gc3RhcnRTZXFOdW1iZXJIaW50OworICAgICAgICBtQWRhcHRpdmUgPSBhZGFwdGl2ZTsKICAgICB9CiAKICAgICBwb3N0TW9uaXRvclF1ZXVlKCk7CkBAIC01MDQsMTEgKzUxNSw5IEBACiB2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6b25TdG9wKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgY2FuY2VsTW9uaXRvclF1ZXVlKCk7CiAKLSAgICBpbnQzMl90IHNlbGZUcmlnZ2VyZWQ7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbGZUcmlnZ2VyZWQiLCAmc2VsZlRyaWdnZXJlZCkpOwotICAgIGlmICghc2VsZlRyaWdnZXJlZCkgewotICAgICAgICAvLyBTZWxmIHRyaWdnZXJlZCBzdG9wcyBvbmx5IGhhcHBlbiBkdXJpbmcgc3dpdGNoaW5nLCBpbiB3aGljaCBjYXNlIHdlIGRvIG5vdCB3YW50Ci0gICAgICAgIC8vIHRvIGNsZWFyIHRoZSBkaXNjb250aW51aXRpZXMgcXVldWVkIGF0IHRoZSBlbmQgb2YgcGFja2V0IHNvdXJjZXMuCisgICAgaW50MzJfdCBjbGVhcjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiY2xlYXIiLCAmY2xlYXIpKTsKKyAgICBpZiAoY2xlYXIpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGFja2V0U291cmNlcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0U291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVBdChpKTsKICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+Y2xlYXIoKTsKQEAgLTU1MCwxNSArNTU5LDE2IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBEb24ndCByZXN1bWUgaWYgd2Ugd291bGQgc3RvcCB3aXRoaW4gYSByZXN1bWUgdGhyZXNob2xkLgorICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXE7CiAgICAgICAgIGludDY0X3QgbGF0ZXN0VGltZVVzID0gMCwgc3RvcFRpbWVVcyA9IDA7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBsYXRlc3RNZXRhID0gcGFja2V0U291cmNlLT5nZXRMYXRlc3RNZXRhKCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBsYXRlc3RNZXRhID0gcGFja2V0U291cmNlLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKTsKICAgICAgICAgaWYgKGxhdGVzdE1ldGEgIT0gTlVMTAotICAgICAgICAgICAgICAgICYmIChsYXRlc3RNZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZsYXRlc3RUaW1lVXMpCi0gICAgICAgICAgICAgICAgJiYgcGFyYW1zLT5maW5kSW50NjQoc3RvcEtleSwgJnN0b3BUaW1lVXMpKSkgewotICAgICAgICAgICAgaW50NjRfdCBkaWZmVXMgPSBzdG9wVGltZVVzIC0gbGF0ZXN0VGltZVVzOwotICAgICAgICAgICAgaWYgKGRpZmZVcyA8IHJlc3VtZVRocmVzaG9sZChsYXRlc3RNZXRhKSkgewotICAgICAgICAgICAgICAgIHN0b3AgPSB0cnVlOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICYmIGxhdGVzdE1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKQorICAgICAgICAgICAgICAgICYmIGRpc2NvbnRpbnVpdHlTZXEgPT0gbURpc2NvbnRpbnVpdHlTZXEKKyAgICAgICAgICAgICAgICAmJiBsYXRlc3RNZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZsYXRlc3RUaW1lVXMpCisgICAgICAgICAgICAgICAgJiYgcGFyYW1zLT5maW5kSW50NjQoc3RvcEtleSwgJnN0b3BUaW1lVXMpCisgICAgICAgICAgICAgICAgJiYgc3RvcFRpbWVVcyAtIGxhdGVzdFRpbWVVcyA8IHJlc3VtZVRocmVzaG9sZChsYXRlc3RNZXRhKSkgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTU2Niw3ICs1NzYsNyBAQAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpLT5xdWV1ZUFjY2Vzc1VuaXQobVNlc3Npb24tPmNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigpKTsKICAgICAgICAgfQotICAgICAgICBzdG9wQXN5bmMoLyogc2VsZlRyaWdnZXJlZCA9ICovIHRydWUpOworICAgICAgICBzdG9wQXN5bmMoLyogY2xlYXIgPSAqLyBmYWxzZSk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKQEAgLTU4Niw3ICs1OTYsMTAgQEAKIHZvaWQgUGxheWxpc3RGZXRjaGVyOjpxdWV1ZURpc2NvbnRpbnVpdHkoCiAgICAgICAgIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUgdHlwZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSkgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVBdChpKS0+cXVldWVEaXNjb250aW51aXR5KHR5cGUsIGV4dHJhKTsKKyAgICAgICAgLy8gZG8gbm90IGRpc2NhcmQgYnVmZmVyIHVwb24gI0VYVC1YLURJU0NPTlRJTlVJVFkgdGFnCisgICAgICAgIC8vIChzZWVrIHdpbGwgZGlzY2FyZCBidWZmZXIgYnkgYWJhbmRvbmluZyBvbGQgZmV0Y2hlcnMpCisgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSktPnF1ZXVlRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICB0eXBlLCBleHRyYSwgZmFsc2UgLyogZGlzY2FyZCAqLyk7CiAgICAgfQogfQogCkBAIC02MjcsNyArNjQwLDcgQEAKIAogICAgICAgICAgICAgaW50NjRfdCBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXMgPQogICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSktPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZmluYWxSZXN1bHQpOwotICAgICAgICAgICAgQUxPR1YoImJ1ZmZlcmVkICVsbGQgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICBBTE9HVigiYnVmZmVyZWQgJSIgUFJJZDY0ICIgZm9yIHN0cmVhbSAlZCIsCiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkU3RyZWFtRHVyYXRpb25VcywgbVBhY2tldFNvdXJjZXMua2V5QXQoaSkpOwogICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkU3RyZWFtRHVyYXRpb25VcyA+IGJ1ZmZlcmVkRHVyYXRpb25VcykgewogICAgICAgICAgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcyA9IGJ1ZmZlcmVkU3RyZWFtRHVyYXRpb25VczsKQEAgLTY0MCw3ICs2NTMsNyBAQAogICAgIGlmICghbVByZXBhcmVkICYmIGJ1ZmZlcmVkRHVyYXRpb25VcyA+IHRhcmdldER1cmF0aW9uVXMgJiYgZG93bmxvYWRNb3JlKSB7CiAgICAgICAgIG1QcmVwYXJlZCA9IHRydWU7CiAKLSAgICAgICAgQUxPR1YoInByZXBhcmVkLCBidWZmZXJlZD0lbGxkID4gJWxsZCIsCisgICAgICAgIEFMT0dWKCJwcmVwYXJlZCwgYnVmZmVyZWQ9JSIgUFJJZDY0ICIgPiAlIiBQUklkNjQgIiIsCiAgICAgICAgICAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzLCB0YXJnZXREdXJhdGlvblVzKTsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwogICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRUZW1wb3JhcmlseURvbmVGZXRjaGluZyk7CkBAIC02NDgsNyArNjYxLDcgQEAKICAgICB9CiAKICAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0sgJiYgZG93bmxvYWRNb3JlKSB7Ci0gICAgICAgIEFMT0dWKCJtb25pdG9yaW5nLCBidWZmZXJlZD0lbGxkIDwgJWxsZCIsCisgICAgICAgIEFMT0dWKCJtb25pdG9yaW5nLCBidWZmZXJlZD0lIiBQUklkNjQgIiA8ICUiIFBSSWQ2NCAiIiwKICAgICAgICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMsIGR1cmF0aW9uVG9CdWZmZXJVcyk7CiAgICAgICAgIC8vIGRlbGF5IHRoZSBuZXh0IGRvd25sb2FkIHNsaWdodGx5OyBob3BlZnVsbHkgdGhpcyBnaXZlcyBvdGhlciBjb25jdXJyZW50IGZldGNoZXJzCiAgICAgICAgIC8vIGEgYmV0dGVyIGNoYW5jZSB0byBydW4uCkBAIC02NjQsNyArNjc3LDcgQEAKICAgICAgICAgbXNnLT5wb3N0KCk7CiAKICAgICAgICAgaW50NjRfdCBkZWxheVVzID0gbVByZXBhcmVkID8ga01heE1vbml0b3JEZWxheVVzIDogdGFyZ2V0RHVyYXRpb25VcyAvIDI7Ci0gICAgICAgIEFMT0dWKCJwYXVzaW5nIGZvciAlbGxkLCBidWZmZXJlZD0lbGxkID4gJWxsZCIsCisgICAgICAgIEFMT0dWKCJwYXVzaW5nIGZvciAlIiBQUklkNjQgIiwgYnVmZmVyZWQ9JSIgUFJJZDY0ICIgPiAlIiBQUklkNjQgIiIsCiAgICAgICAgICAgICAgICAgZGVsYXlVcywgYnVmZmVyZWREdXJhdGlvblVzLCBkdXJhdGlvblRvQnVmZmVyVXMpOwogICAgICAgICAvLyA6VFJJQ0tZOiBuZWVkIHRvIGVuZm9yY2UgbWluaW11bSBkZWxheSBiZWNhdXNlIHRoZSBkZWxheSB0bwogICAgICAgICAvLyByZWZyZXNoIHRoZSBwbGF5bGlzdCB3aWxsIGJlY29tZSAwCkBAIC03MjEsMzggKzczNCw1NSBAQAogICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOwogICAgIH0KIAotICAgIGJvb2wgc2Vla0Rpc2NvbnRpbnVpdHkgPSBmYWxzZTsKLSAgICBib29sIGV4cGxpY2l0RGlzY29udGludWl0eSA9IGZhbHNlOworICAgIGJvb2wgZGlzY29udGludWl0eSA9IGZhbHNlOwogCiAgICAgY29uc3QgaW50MzJfdCBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9CiAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIChpbnQzMl90KW1QbGF5bGlzdC0+c2l6ZSgpIC0gMTsKIAotICAgIGlmIChtU3RhcnR1cCAmJiBtU2VxTnVtYmVyID49IDAKLSAgICAgICAgICAgICYmIChtU2VxTnVtYmVyIDwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0IHx8IG1TZXFOdW1iZXIgPiBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCkpIHsKLSAgICAgICAgLy8gaW4gY2FzZSB3ZSBndWVzc2VkIHdyb25nIGR1cmluZyByZWNvbmZpZ3VyYXRpb24sIHRyeSBmZXRjaGluZyB0aGUgbGF0ZXN0IGNvbnRlbnQuCi0gICAgICAgIG1TZXFOdW1iZXIgPSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICBpZiAobURpc2NvbnRpbnVpdHlTZXEgPCAwKSB7CisgICAgICAgIG1EaXNjb250aW51aXR5U2VxID0gbVBsYXlsaXN0LT5nZXREaXNjb250aW51aXR5U2VxKCk7CiAgICAgfQogCiAgICAgaWYgKG1TZXFOdW1iZXIgPCAwKSB7CiAgICAgICAgIENIRUNLX0dFKG1TdGFydFRpbWVVcywgMGxsKTsKIAotICAgICAgICBpZiAobVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkgfHwgbVBsYXlsaXN0LT5pc0V2ZW50KCkpIHsKLSAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJGb3JUaW1lKG1TdGFydFRpbWVVcyk7Ci0gICAgICAgICAgICBBTE9HVigiSW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgZm9yIHRpbWUgJWxsZCBpcyAlbGQgZnJvbSAoJWxkIC4uICVsZCkiLAorICAgICAgICBpZiAobVNlZ21lbnRTdGFydFRpbWVVcyA8IDApIHsKKyAgICAgICAgICAgIGlmICghbVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkgJiYgIW1QbGF5bGlzdC0+aXNFdmVudCgpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxpdmUgc2Vzc2lvbiwgc3RhcnQgMyBzZWdtZW50cyBmcm9tIHRoZSBlbmQgb24gY29ubmVjdAorICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCAtIDM7CisgICAgICAgICAgICAgICAgaWYgKG1TZXFOdW1iZXIgPCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJGb3JUaW1lKG1TdGFydFRpbWVVcyk7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzIC09IGdldFNlZ21lbnRTdGFydFRpbWVVcyhtU2VxTnVtYmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGFydFRpbWVVc1JlbGF0aXZlID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJJbml0aWFsIHNlcXVlbmNlIG51bWJlciBmb3IgdGltZSAlIiBQUklkNjQgIiBpcyAlZCBmcm9tICglZCAuLiAlZCkiLAogICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXMsIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKICAgICAgICAgICAgICAgICAgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxpdmUgc2Vzc2lvbiwgc3RhcnQgMyBzZWdtZW50cyBmcm9tIHRoZSBlbmQuCi0gICAgICAgICAgICBtU2VxTnVtYmVyID0gbGFzdFNlcU51bWJlckluUGxheWxpc3QgLSAzOworICAgICAgICAgICAgbVNlcU51bWJlciA9IGdldFNlcU51bWJlckZvclRpbWUobVNlZ21lbnRTdGFydFRpbWVVcyk7CisgICAgICAgICAgICBpZiAobUFkYXB0aXZlKSB7CisgICAgICAgICAgICAgICAgLy8gYXZvaWQgZG91YmxlIGZldGNoL2RlY29kZQorICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzaXplX3QgbWluU2VxID0gZ2V0U2VxTnVtYmVyRm9yRGlzY29udGludWl0eShtRGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICBpZiAobVNlcU51bWJlciA8IG1pblNlcSkgeworICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBtaW5TZXE7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChtU2VxTnVtYmVyIDwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CiAgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJJbml0aWFsIHNlcXVlbmNlIG51bWJlciBmb3IgbGl2ZSBldmVudCAlbGQgZnJvbSAoJWxkIC4uICVsZCkiLAorCisgICAgICAgICAgICBpZiAobVNlcU51bWJlciA+IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CisgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIkluaXRpYWwgc2VxdWVuY2UgbnVtYmVyIGZvciBsaXZlIGV2ZW50ICVkIGZyb20gKCVkIC4uICVkKSIsCiAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKICAgICAgICAgICAgICAgICAgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwogICAgICAgICB9Ci0KLSAgICAgICAgbVN0YXJ0VGltZVVzID0gLTFsbDsKICAgICB9CiAKICAgICBpZiAobVNlcU51bWJlciA8IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdApAQCAtNzcxLDcgKzgwMSw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGRlbGF5VXMgPiBrTWF4TW9uaXRvckRlbGF5VXMpIHsKICAgICAgICAgICAgICAgICAgICAgZGVsYXlVcyA9IGtNYXhNb25pdG9yRGVsYXlVczsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNlcXVlbmNlIG51bWJlciBoaWdoOiAlbGQgZnJvbSAoJWxkIC4uICVsZCksIG1vbml0b3IgaW4gJWxsZCAocmV0cnk9JWQpIiwKKyAgICAgICAgICAgICAgICBBTE9HVigic2VxdWVuY2UgbnVtYmVyIGhpZ2g6ICVkIGZyb20gKCVkIC4uICVkKSwgIgorICAgICAgICAgICAgICAgICAgICAgICJtb25pdG9yIGluICUiIFBSSWQ2NCAiIChyZXRyeT0lZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QsIGRlbGF5VXMsIG1OdW1SZXRyaWVzKTsKICAgICAgICAgICAgICAgICBwb3N0TW9uaXRvclF1ZXVlKGRlbGF5VXMpOwpAQCAtNzg5LDE0ICs4MjAsMTQgQEAKICAgICAgICAgICAgIGlmIChtU2VxTnVtYmVyIDwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CiAgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4cGxpY2l0RGlzY29udGludWl0eSA9IHRydWU7CisgICAgICAgICAgICBkaXNjb250aW51aXR5ID0gdHJ1ZTsKIAogICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGZpbmQgc2VxdWVuY2UgbnVtYmVyICVkIGluIHBsYXlsaXN0ICIKICAgICAgICAgICAgICAgICAgIihjb250YWlucyAlZCAtICVkKSIsCiAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKLSAgICAgICAgICAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgbVBsYXlsaXN0LT5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIChpbnQzMl90KW1QbGF5bGlzdC0+c2l6ZSgpIC0gMSk7CiAKICAgICAgICAgICAgIG5vdGlmeUVycm9yKEVSUk9SX0VORF9PRl9TVFJFQU0pOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtODE0LDcgKzg0NSw4IEBACiAKICAgICBpbnQzMl90IHZhbDsKICAgICBpZiAoaXRlbU1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZ2YWwpICYmIHZhbCAhPSAwKSB7Ci0gICAgICAgIGV4cGxpY2l0RGlzY29udGludWl0eSA9IHRydWU7CisgICAgICAgIG1EaXNjb250aW51aXR5U2VxKys7CisgICAgICAgIGRpc2NvbnRpbnVpdHkgPSB0cnVlOwogICAgIH0KIAogICAgIGludDY0X3QgcmFuZ2Vfb2Zmc2V0LCByYW5nZV9sZW5ndGg7CkBAIC04NDUsNiArODc3LDcgQEAKICAgICB9CiAKICAgICAvLyBibG9jay13aXNlIGRvd25sb2FkCisgICAgYm9vbCBzdGFydHVwID0gbVN0YXJ0dXA7CiAgICAgc3NpemVfdCBieXRlc1JlYWQ7CiAgICAgZG8gewogICAgICAgICBieXRlc1JlYWQgPSBtU2Vzc2lvbi0+ZmV0Y2hGaWxlKApAQCAtODc0LDcgKzkwNyw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobVN0YXJ0dXAgfHwgc2Vla0Rpc2NvbnRpbnVpdHkgfHwgZXhwbGljaXREaXNjb250aW51aXR5KSB7CisgICAgICAgIGlmIChzdGFydHVwIHx8IGRpc2NvbnRpbnVpdHkpIHsKICAgICAgICAgICAgIC8vIFNpZ25hbCBkaXNjb250aW51aXR5LgogCiAgICAgICAgICAgICBpZiAobVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkgfHwgbVBsYXlsaXN0LT5pc0V2ZW50KCkpIHsKQEAgLTg4NCwxNiArOTE3LDE3IEBACiAgICAgICAgICAgICAgICAgbU5leHRQVFNUaW1lVXMgPSBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChzZWVrRGlzY29udGludWl0eSB8fCBleHBsaWNpdERpc2NvbnRpbnVpdHkpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgicXVldWVpbmcgZGlzY29udGludWl0eSAoc2Vlaz0lZCwgZXhwbGljaXQ9JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgIHNlZWtEaXNjb250aW51aXR5LCBleHBsaWNpdERpc2NvbnRpbnVpdHkpOworICAgICAgICAgICAgaWYgKGRpc2NvbnRpbnVpdHkpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgicXVldWVpbmcgZGlzY29udGludWl0eSAoZXhwbGljaXQ9JWQpIiwgZGlzY29udGludWl0eSk7CiAKICAgICAgICAgICAgICAgICBxdWV1ZURpc2NvbnRpbnVpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdERpc2NvbnRpbnVpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9TRUVLLAorICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSwKICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogZXh0cmEgKi8pOworCisgICAgICAgICAgICAgICAgZGlzY29udGludWl0eSA9IGZhbHNlOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGFydHVwID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBlcnIgPSBPSzsKQEAgLTkxMywyMyArOTQ3LDE5IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKLSAgICAgICAgICAgIC8vIGJhZCBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgaGludAorICAgICAgICAgICAgLy8gc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIHRvbyBsb3cvaGlnaAorICAgICAgICAgICAgbVRTUGFyc2VyLmNsZWFyKCk7CiAgICAgICAgICAgICBwb3N0TW9uaXRvclF1ZXVlKCk7CiAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgeworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9PVVRfT0ZfUkFOR0UpIHsKICAgICAgICAgICAgIC8vIHJlYWNoZWQgc3RvcHBpbmcgcG9pbnQKLSAgICAgICAgICAgIHN0b3BBc3luYygvKiBzZWxmVHJpZ2dlcmVkID0gKi8gdHJ1ZSk7CisgICAgICAgICAgICBzdG9wQXN5bmMoLyogY2xlYXIgPSAqLyBmYWxzZSk7CiAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBub3RpZnlFcnJvcihlcnIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgbVN0YXJ0dXAgPSBmYWxzZTsKICAgICB9IHdoaWxlIChieXRlc1JlYWQgIT0gMCk7CiAKICAgICBpZiAoYnVmZmVyU3RhcnRzV2l0aFRzU3luY0J5dGUoYnVmZmVyKSkgewpAQCAtOTgxLDcgKzEwMTEsMTYgQEAKIAogICAgIC8vIGJ1bGsgZXh0cmFjdCBub24tdHMgZmlsZXMKICAgICBpZiAodHNCdWZmZXIgPT0gTlVMTCkgewotICAgICAgZXJyID0gZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHMoYnVmZmVyLCBpdGVtTWV0YSk7CisgICAgICAgIGVyciA9IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzKGJ1ZmZlciwgaXRlbU1ldGEpOworICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKKyAgICAgICAgICAgIC8vIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciB0b28gbG93L2hpZ2gKKyAgICAgICAgICAgIHBvc3RNb25pdG9yUXVldWUoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7CisgICAgICAgICAgICAvLyByZWFjaGVkIHN0b3BwaW5nIHBvaW50CisgICAgICAgICAgICBzdG9wQXN5bmMoLyogY2xlYXIgPSAqL2ZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTk5NCw2ICsxMDMzLDY2IEBACiAgICAgcG9zdE1vbml0b3JRdWV1ZSgpOwogfQogCitpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6Z2V0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUoaW50NjRfdCBhbmNob3JUaW1lVXMpIGNvbnN0IHsKKyAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwgbGFzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgaWYgKG1QbGF5bGlzdC0+bWV0YSgpID09IE5VTEwKKyAgICAgICAgICAgIHx8ICFtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJtZWRpYS1zZXF1ZW5jZSIsICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QpKSB7CisgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7CisgICAgfQorICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgbVBsYXlsaXN0LT5zaXplKCkgLSAxOworCisgICAgaW50MzJfdCBpbmRleCA9IG1TZXFOdW1iZXIgLSBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgLSAxOworICAgIHdoaWxlIChpbmRleCA+PSAwICYmIGFuY2hvclRpbWVVcyA+IG1TdGFydFRpbWVVcykgeworICAgICAgICBzcDxBTWVzc2FnZT4gaXRlbU1ldGE7CisgICAgICAgIENIRUNLKG1QbGF5bGlzdC0+aXRlbUF0KGluZGV4LCBOVUxMIC8qIHVyaSAqLywgJml0ZW1NZXRhKSk7CisKKyAgICAgICAgaW50NjRfdCBpdGVtRHVyYXRpb25VczsKKyAgICAgICAgQ0hFQ0soaXRlbU1ldGEtPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZpdGVtRHVyYXRpb25VcykpOworCisgICAgICAgIGFuY2hvclRpbWVVcyAtPSBpdGVtRHVyYXRpb25VczsKKyAgICAgICAgLS1pbmRleDsKKyAgICB9CisKKyAgICBpbnQzMl90IG5ld1NlcU51bWJlciA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIGluZGV4ICsgMTsKKyAgICBpZiAobmV3U2VxTnVtYmVyIDw9IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CisgICAgICAgIHJldHVybiBuZXdTZXFOdW1iZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIH0KK30KKworaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmdldFNlcU51bWJlckZvckRpc2NvbnRpbnVpdHkoc2l6ZV90IGRpc2NvbnRpbnVpdHlTZXEpIGNvbnN0IHsKKyAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTAorICAgICAgICAgICAgfHwgIW1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoIm1lZGlhLXNlcXVlbmNlIiwgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCkpIHsKKyAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gMDsKKyAgICB9CisKKyAgICBzaXplX3QgY3VyRGlzY29udGludWl0eVNlcSA9IG1QbGF5bGlzdC0+Z2V0RGlzY29udGludWl0eVNlcSgpOworICAgIGlmIChkaXNjb250aW51aXR5U2VxIDwgY3VyRGlzY29udGludWl0eVNlcSkgeworICAgICAgICByZXR1cm4gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0IDw9IDAgPyAwIDogKGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCAtIDEpOworICAgIH0KKworICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgd2hpbGUgKGluZGV4IDwgbVBsYXlsaXN0LT5zaXplKCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOworICAgICAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdCggaW5kZXgsIE5VTEwgLyogdXJpICovLCAmaXRlbU1ldGEpKTsKKworICAgICAgICBpbnQ2NF90IGRpc2NvbnRpbnVpdHk7CisgICAgICAgIGlmIChpdGVtTWV0YS0+ZmluZEludDY0KCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7CisgICAgICAgICAgICBjdXJEaXNjb250aW51aXR5U2VxKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyRGlzY29udGludWl0eVNlcSA9PSBkaXNjb250aW51aXR5U2VxKSB7CisgICAgICAgICAgICByZXR1cm4gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgaW5kZXg7CisgICAgICAgIH0KKworICAgICAgICArK2luZGV4OworICAgIH0KKworICAgIHJldHVybiBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBtUGxheWxpc3QtPnNpemUoKTsKK30KKwogaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmdldFNlcU51bWJlckZvclRpbWUoaW50NjRfdCB0aW1lVXMpIGNvbnN0IHsKICAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKICAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTCB8fCAhbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigKQEAgLTEwMjYsNiArMTEyNSwyMyBAQAogICAgIHJldHVybiBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBpbmRleDsKIH0KIAorY29uc3Qgc3A8QUJ1ZmZlcj4gJlBsYXlsaXN0RmV0Y2hlcjo6c2V0QWNjZXNzVW5pdFByb3BlcnRpZXMoCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0LCBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmc291cmNlLCBib29sIGRpc2NhcmQpIHsKKyAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gc291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICBpZiAoZm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gZm9yIHNpbXBsaWNpdHksIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSBmb3JtYXQgaW4gZWFjaCB1bml0CisgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0T2JqZWN0KCJmb3JtYXQiLCBmb3JtYXQpOworICAgIH0KKworICAgIGlmIChkaXNjYXJkKSB7CisgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImRpc2NhcmQiLCBkaXNjYXJkKTsKKyAgICB9CisKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgbURpc2NvbnRpbnVpdHlTZXEpOworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsIGdldFNlZ21lbnRTdGFydFRpbWVVcyhtU2VxTnVtYmVyKSk7CisgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7Cit9CisKIHN0YXR1c190IFBsYXlsaXN0RmV0Y2hlcjo6ZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHNGcm9tVHMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGlmIChtVFNQYXJzZXIgPT0gTlVMTCkgewogICAgICAgICAvLyBVc2UgVFNfVElNRVNUQU1QU19BUkVfQUJTT0xVVEUgc28gcHRzIGNhcnJ5IG92ZXIgYmV0d2VlbiBmZXRjaGVycy4KQEAgLTEwNDEsNyArMTE1Nyw5IEBACiAgICAgICAgIG1UU1BhcnNlci0+c2lnbmFsRGlzY29udGludWl0eSgKICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSywgZXh0cmEpOwogCisgICAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcyA9IG1OZXh0UFRTVGltZVVzOwogICAgICAgICBtTmV4dFBUU1RpbWVVcyA9IC0xbGw7CisgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gZmFsc2U7CiAgICAgfQogCiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CkBAIC0xMTAxLDQzICsxMjE5LDEwOCBAQAogICAgICAgICAgICAgICAgICYmIHNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJmFjY2Vzc1VuaXQpID09IE9LKSB7CiAKICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0gICAgICAgICAgICBpZiAobU1pblN0YXJ0VGltZVVzID4gMCkgewotICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCBtTWluU3RhcnRUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyB1bnRlc3RlZCBwYXRoCi0gICAgICAgICAgICAgICAgICAgIC8vIHRyeSBhIGxhdGVyIHRzCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoInRhcmdldC1kdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5jciA9IChtTWluU3RhcnRUaW1lVXMgLSB0aW1lVXMpIC8gMTAwMDAwMCAvIHRhcmdldER1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5jciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgbVNlcU51bWJlciBieSBhdCBsZWFzdCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAxOworCisgICAgICAgICAgICBpZiAobVN0YXJ0dXApIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1GaXJzdFBUU1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIG1GaXJzdFRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0VGltZVVzUmVsYXRpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZVVzIC09IG1GaXJzdFRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciArPSBpbmNyOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSAtRUFHQUlOOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOwotICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXJ0VGltZVVzTm90aWZ5ICE9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50NjQoa2V5LCAmc3RhcnRUaW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDY0KGtleSwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbU1hc2sgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50MzIoInN0cmVhbU1hc2siLCAoaW50MzJfdCAqKSAmc3RyZWFtTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1NYXNrIHw9IG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigic3RyZWFtTWFzayIsIHN0cmVhbU1hc2spOworICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCBtU3RhcnRUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyIHVwIHRvIHRoZSBjbG9zZXN0IHByZWNlZGluZyBJRFIgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInRpbWVVcyAlIiBQUklkNjQgIiB1cyA8IG1TdGFydFRpbWVVcyAlIiBQUklkNjQgIiB1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLCBtU3RhcnRUaW1lVXMpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ICA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNBdmMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMICYmIGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc0F2YyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXZjICYmIElzSURSKGFjY2Vzc1VuaXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXZjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTWFzayA9PSBtU3RyZWFtVHlwZU1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVVc05vdGlmeSAhPSBOVUxMICYmIHRpbWVVcyA+IG1TdGFydFRpbWVVcykgeworCisgICAgICAgICAgICAgICAgaW50MzJfdCB0YXJnZXREdXJhdGlvblNlY3M7CisgICAgICAgICAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpOworICAgICAgICAgICAgICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IHRhcmdldER1cmF0aW9uU2VjcyAqIDEwMDAwMDBsbDsKKyAgICAgICAgICAgICAgICAvLyBtU3RhcnR1cAorICAgICAgICAgICAgICAgIC8vICAgbVN0YXJ0dXAgaXMgdHJ1ZSB1bnRpbCB3ZSBoYXZlIHF1ZXVlZCBhIHBhY2tldCBmb3IgYWxsIHRoZSBzdHJlYW1zCisgICAgICAgICAgICAgICAgLy8gICB3ZSBhcmUgZmV0Y2hpbmcuIFdlIHF1ZXVlIHBhY2tldHMgd2hvc2UgdGltZXN0YW1wcyBhcmUgZ3JlYXRlciB0aGFuCisgICAgICAgICAgICAgICAgLy8gICBtU3RhcnRUaW1lVXMuCisgICAgICAgICAgICAgICAgLy8gbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCisgICAgICAgICAgICAgICAgLy8gICBtU2VnbWVudFN0YXJ0VGltZVVzIGlzIG5vbi1uZWdhdGl2ZSB3aGVuIGFkYXB0aW5nIG9yIHN3aXRjaGluZyB0cmFja3MKKyAgICAgICAgICAgICAgICAvLyB0aW1lVXMgLSBtU3RhcnRUaW1lVXMgPiB0YXJnZXREdXJhdGlvblVzOgorICAgICAgICAgICAgICAgIC8vICAgVGhpcyBhbmQgdGhlIDIgYWJvdmUgY29uZGl0aW9ucyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiBhZGFwdGluZyBpbiBhIGxpdmUKKyAgICAgICAgICAgICAgICAvLyAgIHN0cmVhbTsgdGhlIG9sZCBmZXRjaGVyIGhhcyBhbHJlYWR5IGZldGNoZWQgdG8gbVN0YXJ0VGltZVVzOyB0aGUgbmV3IGZldGNoZXIKKyAgICAgICAgICAgICAgICAvLyAgIHdvdWxkIHN0YXJ0IGZldGNoaW5nIGFmdGVyIHRpbWVVcywgd2hpY2ggc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBtU3RhcnRUaW1lVXM7CisgICAgICAgICAgICAgICAgLy8gICB0aGUgb2xkIGZldGNoZXIgd291bGQgdGhlbiBjb250aW51ZSBmZXRjaGluZyBkYXRhIHVudGlsIHRpbWVVcy4gV2UgZG9uJ3Qgd2FudAorICAgICAgICAgICAgICAgIC8vICAgdGltZVVzIHRvIGJlIHRvbyBmYXIgYWhlYWQgb2YgbVN0YXJ0VGltZVVzIGJlY2F1c2Ugd2Ugd2FudCB0aGUgb2xkIGZldGNoZXIgdG8KKyAgICAgICAgICAgICAgICAvLyAgIHN0b3AgYXMgZWFybHkgYXMgcG9zc2libGUuIFRoZSBkZWZpbml0aW9uIG9mIGJlaW5nICJ0b28gZmFyIGFoZWFkIiBpcworICAgICAgICAgICAgICAgIC8vICAgYXJiaXRyYXJ5OyBoZXJlIHdlIHVzZSB0YXJnZXREdXJhdGlvblVzIGFzIHRocmVzaG9sZC4KKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0dXAgJiYgbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lVXMgLSBtU3RhcnRUaW1lVXMgPiB0YXJnZXREdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGp1c3QgZ3Vlc3NlZCBhIHN0YXJ0aW5nIHRpbWVzdGFtcCB0aGF0IGlzIHRvbyBoaWdoIHdoZW4gYWRhcHRpbmcgaW4gYQorICAgICAgICAgICAgICAgICAgICAvLyBsaXZlIHN0cmVhbTsgcmUtYWRqdXN0IGJhc2VkIG9uIHRoZSBhY3R1YWwgdGltZXN0YW1wIGV4dHJhY3RlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBtZWRpYSBzZWdtZW50OyBpZiB3ZSBkaWRuJ3QgbW92ZSBiYWNrd2FyZCBhZnRlciB0aGUgcmUtYWRqdXN0bWVudAorICAgICAgICAgICAgICAgICAgICAvLyAobmV3U2VxTnVtYmVyKSwgc3RhcnQgYXQgbGVhc3QgMSBzZWdtZW50IHByaW9yLgorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5ld1NlcU51bWJlciA9IGdldFNlcU51bWJlcldpdGhBbmNob3JUaW1lKHRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTZXFOdW1iZXIgPj0gbVNlcU51bWJlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgLS1tU2VxTnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IG5ld1NlcU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U3RhcnRlZEF0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50MzJfdCBzZXE7CisgICAgICAgICAgICAgICAgaWYgKCFtU3RhcnRUaW1lVXNOb3RpZnktPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZzZXEpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBtRGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CisgICAgICAgICAgICAgICAgaWYgKCFtU3RhcnRUaW1lVXNOb3RpZnktPmZpbmRJbnQ2NChrZXksICZzdGFydFRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQ2NChrZXksIHRpbWVVcyk7CisKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtTWFzayA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikgJnN0cmVhbU1hc2spOworICAgICAgICAgICAgICAgICAgICBzdHJlYW1NYXNrIHw9IG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpOworICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJzdHJlYW1NYXNrIiwgc3RyZWFtTWFzayk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbU1hc2sgPT0gbVN0cmVhbVR5cGVNYXNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnR1cCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1TdG9wUGFyYW1zICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAvLyBRdWV1ZSBkaXNjb250aW51aXR5IGluIG9yaWdpbmFsIHN0cmVhbS4KKyAgICAgICAgICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXE7CiAgICAgICAgICAgICAgICAgaW50NjRfdCBzdG9wVGltZVVzOwotICAgICAgICAgICAgICAgIGlmICghbVN0b3BQYXJhbXMtPmZpbmRJbnQ2NChrZXksICZzdG9wVGltZVVzKSB8fCB0aW1lVXMgPj0gc3RvcFRpbWVVcykgeworICAgICAgICAgICAgICAgIGlmICghbVN0b3BQYXJhbXMtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGlzY29udGludWl0eVNlcSA+IG1EaXNjb250aW51aXR5U2VxCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbVN0b3BQYXJhbXMtPmZpbmRJbnQ2NChrZXksICZzdG9wVGltZVVzKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRpc2NvbnRpbnVpdHlTZXEgPT0gbURpc2NvbnRpbnVpdHlTZXEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGltZVVzID49IHN0b3BUaW1lVXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KG1TZXNzaW9uLT5jcmVhdGVGb3JtYXRDaGFuZ2VCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlTWFzayAmPSB+c3RyZWFtOwogICAgICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy5yZW1vdmVJdGVtc0F0KGkpOwpAQCAtMTE0NiwxNSArMTMyOSwxOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gTk9UIGRlcXVldWUgYW55IGRpc2NvbnRpbnVpdGllcyBleGNlcHQgZm9yIGZvcm1hdCBjaGFuZ2UuCi0KLSAgICAgICAgICAgIC8vIGZvciBzaW1wbGljaXR5LCBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgZm9ybWF0IGluIGVhY2ggdW5pdAotICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldE9iamVjdCgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfVklERU8pIHsKKyAgICAgICAgICAgICAgICBjb25zdCBib29sIGRpc2NhcmQgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgICAgICAgICB3aGlsZSAobVZpZGVvQnVmZmVyLT5oYXNCdWZmZXJBdmFpbGFibGUoJnN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gdmlkZW9CdWZmZXI7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJnZpZGVvQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0QWNjZXNzVW5pdFByb3BlcnRpZXModmlkZW9CdWZmZXIsIHNvdXJjZSwgZGlzY2FyZCk7CisgICAgICAgICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KHZpZGVvQnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFN0YXNoIHRoZSBzZXF1ZW5jZSBudW1iZXIgc28gd2UgY2FuIGhpbnQgZnV0dXJlIHBsYXlsaXN0IHdoZXJlIHRvIHN0YXJ0IGF0LgotICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigic2VxIiwgbVNlcU51bWJlcik7CisgICAgICAgICAgICBzZXRBY2Nlc3NVbml0UHJvcGVydGllcyhhY2Nlc3NVbml0LCBzb3VyY2UpOwogICAgICAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CiAgICAgICAgIH0KIApAQCAtMTE4MCw5ICsxMzY2LDM1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCisvKiBzdGF0aWMgKi8KK2Jvb2wgUGxheWxpc3RGZXRjaGVyOjpidWZmZXJTdGFydHNXaXRoV2ViVlRUTWFnaWNTZXF1ZW5jZSgKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHNpemVfdCBwb3MgPSAwOworCisgICAgLy8gc2tpcCBwb3NzaWJsZSBCT00KKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgPj0gcG9zICsgMyAmJgorICAgICAgICAgICAgIW1lbWNtcCgiXHhlZlx4YmJceGJmIiwgYnVmZmVyLT5kYXRhKCkgKyBwb3MsIDMpKSB7CisgICAgICAgIHBvcyArPSAzOworICAgIH0KKworICAgIC8vIGFjY2VwdCBXRUJWVFQgZm9sbG93ZWQgYnkgU1BBQ0UsIFRBQiBvciAoQ1IpIExGCisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpIDwgcG9zICsgNiB8fAorICAgICAgICAgICAgbWVtY21wKCJXRUJWVFQiLCBidWZmZXItPmRhdGEoKSArIHBvcywgNikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb3MgKz0gNjsKKworICAgIGlmIChidWZmZXItPnNpemUoKSA9PSBwb3MpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdWludDhfdCBzZXAgPSBidWZmZXItPmRhdGEoKVtwb3NdOworICAgIHJldHVybiBzZXAgPT0gJyAnIHx8IHNlcCA9PSAnXHQnIHx8IHNlcCA9PSAnXG4nIHx8IHNlcCA9PSAnXHInOworfQorCiBzdGF0dXNfdCBQbGF5bGlzdEZldGNoZXI6OmV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzKAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBjb25zdCBzcDxBTWVzc2FnZT4gJml0ZW1NZXRhKSB7Ci0gICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID49IDcgJiYgIW1lbWNtcCgiV0VCVlRUXG4iLCBidWZmZXItPmRhdGEoKSwgNykpIHsKKyAgICBpZiAoYnVmZmVyU3RhcnRzV2l0aFdlYlZUVE1hZ2ljU2VxdWVuY2UoYnVmZmVyKSkgewogICAgICAgICBpZiAobVN0cmVhbVR5cGVNYXNrICE9IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUykgewogICAgICAgICAgICAgQUxPR0UoIlRoaXMgc3RyZWFtIG9ubHkgY29udGFpbnMgc3VidGl0bGVzLiIpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTExOTUsNyArMTQwNyw5IEBACiAgICAgICAgIENIRUNLKGl0ZW1NZXRhLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIGdldFNlZ21lbnRTdGFydFRpbWVVcyhtU2VxTnVtYmVyKSk7CiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIGR1cmF0aW9uVXMpOwotICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoInNlcSIsIG1TZXFOdW1iZXIpOworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsIGdldFNlZ21lbnRTdGFydFRpbWVVcyhtU2VxTnVtYmVyKSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZGlzY29udGludWl0eVNlcSIsIG1EaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJzdWJ0aXRsZUdlbmVyYXRpb24iLCBtU3VidGl0bGVHZW5lcmF0aW9uKTsKIAogICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChidWZmZXIpOwogICAgICAgICByZXR1cm4gT0s7CkBAIC0xMjYxLDE0ICsxNDc1LDYgQEAKICAgICAgICAgZmlyc3RJRDNUYWcgPSBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIW1GaXJzdFBUU1ZhbGlkKSB7Ci0gICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgbUZpcnN0UFRTID0gUFRTOwotICAgIH0KLSAgICBQVFMgLT0gbUZpcnN0UFRTOwotCi0gICAgaW50NjRfdCB0aW1lVXMgPSAoUFRTICogMTAwbGwpIC8gOWxsICsgbUFic29sdXRlVGltZUFuY2hvclVzOwotCiAgICAgaWYgKG1TdHJlYW1UeXBlTWFzayAhPSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTykgewogICAgICAgICBBTE9HVygiVGhpcyBzdHJlYW0gb25seSBjb250YWlucyBhdWRpbyBkYXRhISIpOwogCkBAIC0xMzExLDYgKzE1MTcsMTIgQEAKICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgQ0hFQ0socGFja2V0U291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwogCisgICAgaW50NjRfdCB0aW1lVXMgPSAoUFRTICogMTAwbGwpIC8gOWxsOworICAgIGlmICghbUZpcnN0UFRTVmFsaWQpIHsKKyAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSB0cnVlOworICAgICAgICBtRmlyc3RUaW1lVXMgPSB0aW1lVXM7CisgICAgfQorCiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CiAgICAgd2hpbGUgKG9mZnNldCA8IGJ1ZmZlci0+c2l6ZSgpKSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFkdHNIZWFkZXIgPSBidWZmZXItPmRhdGEoKSArIG9mZnNldDsKQEAgLTEzMzUsMTkgKzE1NDcsNzAgQEAKIAogICAgICAgICBDSEVDS19MRShvZmZzZXQgKyBhYWNfZnJhbWVfbGVuZ3RoLCBidWZmZXItPnNpemUoKSk7CiAKLSAgICAgICAgc3A8QUJ1ZmZlcj4gdW5pdCA9IG5ldyBBQnVmZmVyKGFhY19mcmFtZV9sZW5ndGgpOwotICAgICAgICBtZW1jcHkodW5pdC0+ZGF0YSgpLCBhZHRzSGVhZGVyLCBhYWNfZnJhbWVfbGVuZ3RoKTsKLQogICAgICAgICBpbnQ2NF90IHVuaXRUaW1lVXMgPSB0aW1lVXMgKyBudW1TYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxlUmF0ZTsKLSAgICAgICAgdW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdW5pdFRpbWVVcyk7CisgICAgICAgIG9mZnNldCArPSBhYWNfZnJhbWVfbGVuZ3RoOwogCiAgICAgICAgIC8vIEVhY2ggQUFDIGZyYW1lIGVuY29kZXMgMTAyNCBzYW1wbGVzLgogICAgICAgICBudW1TYW1wbGVzICs9IDEwMjQ7CiAKLSAgICAgICAgdW5pdC0+bWV0YSgpLT5zZXRJbnQzMigic2VxIiwgbVNlcU51bWJlcik7Ci0gICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KHVuaXQpOworICAgICAgICBpZiAobVN0YXJ0dXApIHsKKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSB1bml0VGltZVVzOworICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVVc1JlbGF0aXZlKSB7CisgICAgICAgICAgICAgICAgc3RhcnRUaW1lVXMgLT0gbUZpcnN0VGltZVVzOworICAgICAgICAgICAgICAgIGlmIChzdGFydFRpbWVVcyAgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVzID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhcnRUaW1lVXMgPCBtU3RhcnRUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICBvZmZzZXQgKz0gYWFjX2ZyYW1lX2xlbmd0aDsKKyAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNOb3RpZnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb25TZWNzOworICAgICAgICAgICAgICAgIENIRUNLKG1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoInRhcmdldC1kdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvblNlY3MpKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSB0YXJnZXREdXJhdGlvblNlY3MgKiAxMDAwMDAwbGw7CisKKyAgICAgICAgICAgICAgICAvLyBEdXBsaWNhdGVkIGxvZ2ljIGZyb20gaG93IHdlIGhhbmRsZSAudHMgcGxheWxpc3RzLgorICAgICAgICAgICAgICAgIGlmIChtU3RhcnR1cCAmJiBtU2VnbWVudFN0YXJ0VGltZVVzID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHRpbWVVcyAtIG1TdGFydFRpbWVVcyA+IHRhcmdldER1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuZXdTZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZSh0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3U2VxTnVtYmVyID49IG1TZXFOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tbVNlcU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBuZXdTZXFOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQ2NCgidGltZVVzQXVkaW8iLCB0aW1lVXMpOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBtRGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigic3RyZWFtTWFzayIsIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPKTsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU3RvcFBhcmFtcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBRdWV1ZSBkaXNjb250aW51aXR5IGluIG9yaWdpbmFsIHN0cmVhbS4KKyAgICAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcTsKKyAgICAgICAgICAgIGludDY0X3Qgc3RvcFRpbWVVczsKKyAgICAgICAgICAgIGlmICghbVN0b3BQYXJhbXMtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKQorICAgICAgICAgICAgICAgICAgICB8fCBkaXNjb250aW51aXR5U2VxID4gbURpc2NvbnRpbnVpdHlTZXEKKyAgICAgICAgICAgICAgICAgICAgfHwgIW1TdG9wUGFyYW1zLT5maW5kSW50NjQoInRpbWVVc0F1ZGlvIiwgJnN0b3BUaW1lVXMpCisgICAgICAgICAgICAgICAgICAgIHx8IChkaXNjb250aW51aXR5U2VxID09IG1EaXNjb250aW51aXR5U2VxICYmIHVuaXRUaW1lVXMgPj0gc3RvcFRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChtU2Vzc2lvbi0+Y3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKCkpOworICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlTWFzayA9IDA7CisgICAgICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gdW5pdCA9IG5ldyBBQnVmZmVyKGFhY19mcmFtZV9sZW5ndGgpOworICAgICAgICBtZW1jcHkodW5pdC0+ZGF0YSgpLCBhZHRzSGVhZGVyLCBhYWNfZnJhbWVfbGVuZ3RoKTsKKworICAgICAgICB1bml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB1bml0VGltZVVzKTsKKyAgICAgICAgc2V0QWNjZXNzVW5pdFByb3BlcnRpZXModW5pdCwgcGFja2V0U291cmNlKTsKKyAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQodW5pdCk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAppbmRleCA3ZTIxNTIzLi43OGMzNThmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaApAQCAtNDksNyArNDksOCBAQAogICAgIFBsYXlsaXN0RmV0Y2hlcigKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICAgICAgY29uc3Qgc3A8TGl2ZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGludDMyX3Qgc3VidGl0bGVHZW5lcmF0aW9uKTsKIAogICAgIHNwPERhdGFTb3VyY2U+IGdldERhdGFTb3VyY2UoKTsKIApAQCAtNTcsMTYgKzU4LDIyIEBACiAgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmdmlkZW9Tb3VyY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmc3VidGl0bGVTb3VyY2UsCi0gICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gLTFsbCwKLSAgICAgICAgICAgIGludDY0X3QgbWluU3RhcnRUaW1lVXMgPSAwbGwgLyogc3RhcnQgYWZ0ZXIgdGhpcyB0aW1lc3RhbXAgKi8sCi0gICAgICAgICAgICBpbnQzMl90IHN0YXJ0U2VxTnVtYmVySGludCA9IC0xIC8qIHRyeSBzdGFydGluZyBhdCB0aGlzIHNlcXVlbmNlIG51bWJlciAqLyk7CisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gLTFsbCwgICAgICAgICAvLyBzdGFydGluZyB0aW1lc3RhbXBzCisgICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcyA9IC0xbGwsIC8vIHN0YXJ0aW5nIHBvc2l0aW9uIHdpdGhpbiBwbGF5bGlzdAorICAgICAgICAgICAgLy8gc3RhcnRUaW1lVXMhPXNlZ21lbnRTdGFydFRpbWVVcyBvbmx5IHdoZW4gcGxheWxpc3QgaXMgbGl2ZQorICAgICAgICAgICAgaW50MzJfdCBzdGFydERpc2NvbnRpbnVpdHlTZXEgPSAwLAorICAgICAgICAgICAgYm9vbCBhZGFwdGl2ZSA9IGZhbHNlKTsKIAogICAgIHZvaWQgcGF1c2VBc3luYygpOwogCi0gICAgdm9pZCBzdG9wQXN5bmMoYm9vbCBzZWxmVHJpZ2dlcmVkID0gZmFsc2UpOworICAgIHZvaWQgc3RvcEFzeW5jKGJvb2wgY2xlYXIgPSB0cnVlKTsKIAogICAgIHZvaWQgcmVzdW1lVW50aWxBc3luYyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CiAKKyAgICB1aW50MzJfdCBnZXRTdHJlYW1UeXBlTWFzaygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdHJlYW1UeXBlTWFzazsKKyAgICB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5QbGF5bGlzdEZldGNoZXIoKTsKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwpAQCAtOTEsNiArOTgsNyBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1Ta2lwRnJhbWVzOwogCiAgICAgc3RhdGljIGJvb2wgYnVmZmVyU3RhcnRzV2l0aFRzU3luY0J5dGUoY29uc3Qgc3A8QUJ1ZmZlcj4mIGJ1ZmZlcik7CisgICAgc3RhdGljIGJvb2wgYnVmZmVyU3RhcnRzV2l0aFdlYlZUVE1hZ2ljU2VxdWVuY2UoY29uc3Qgc3A8QUJ1ZmZlcj4mIGJ1ZmZlcik7CiAKICAgICAvLyBub3RpZmljYXRpb25zIHRvIG1TZXNzaW9uCiAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CkBAIC0xMDEsNyArMTA5LDE0IEBACiAKICAgICB1aW50MzJfdCBtU3RyZWFtVHlwZU1hc2s7CiAgICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7Ci0gICAgaW50NjRfdCBtTWluU3RhcnRUaW1lVXM7IC8vIHN0YXJ0IGZldGNoaW5nIG5vIGVhcmxpZXIgdGhhbiB0aGlzIHZhbHVlCisKKyAgICAvLyBTdGFydCB0aW1lIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IHNlZ21lbnQgaW4gdGhlIGluaXRpYWwKKyAgICAvLyBwbGF5bGlzdC4gSXQncyB2YWx1ZSBpcyBpbml0aWFsaXplZCB0byBhIG5vbi1uZWdhdGl2ZSB2YWx1ZSBvbmx5IHdoZW4gd2UgYXJlCisgICAgLy8gYWRhcHRpbmcgb3Igc3dpdGNoaW5nIHRyYWNrcy4KKyAgICBpbnQ2NF90IG1TZWdtZW50U3RhcnRUaW1lVXM7CisKKyAgICBzc2l6ZV90IG1EaXNjb250aW51aXR5U2VxOworICAgIGJvb2wgbVN0YXJ0VGltZVVzUmVsYXRpdmU7CiAgICAgc3A8QU1lc3NhZ2U+IG1TdG9wUGFyYW1zOyAvLyBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIGxhdGVzdCB0aW1lc3RhbXBzIHdlIHNob3VsZCBmZXRjaC4KIAogICAgIEtleWVkVmVjdG9yPExpdmVTZXNzaW9uOjpTdHJlYW1UeXBlLCBzcDxBbm90aGVyUGFja2V0U291cmNlPiA+CkBAIC0xMTQsMTAgKzEyOSwxMiBAQAogICAgIGludDMyX3QgbVNlcU51bWJlcjsKICAgICBpbnQzMl90IG1OdW1SZXRyaWVzOwogICAgIGJvb2wgbVN0YXJ0dXA7CisgICAgYm9vbCBtQWRhcHRpdmU7CiAgICAgYm9vbCBtUHJlcGFyZWQ7CiAgICAgaW50NjRfdCBtTmV4dFBUU1RpbWVVczsKIAogICAgIGludDMyX3QgbU1vbml0b3JRdWV1ZUdlbmVyYXRpb247CisgICAgY29uc3QgaW50MzJfdCBtU3VidGl0bGVHZW5lcmF0aW9uOwogCiAgICAgZW51bSBSZWZyZXNoU3RhdGUgewogICAgICAgICBJTklUSUFMX01JTklNVU1fUkVMT0FEX0RFTEFZLApAQCAtMTMzLDcgKzE1MCw5IEBACiAKICAgICBib29sIG1GaXJzdFBUU1ZhbGlkOwogICAgIHVpbnQ2NF90IG1GaXJzdFBUUzsKKyAgICBpbnQ2NF90IG1GaXJzdFRpbWVVczsKICAgICBpbnQ2NF90IG1BYnNvbHV0ZVRpbWVBbmNob3JVczsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtVmlkZW9CdWZmZXI7CiAKICAgICAvLyBTdG9yZXMgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciB0byBkZWNyeXB0IHRoZSBuZXh0IGJsb2NrIG9mIGNpcGhlciB0ZXh0LCB3aGljaCBjYW4KICAgICAvLyBlaXRoZXIgYmUgZGVyaXZlZCBmcm9tIHRoZSBzZXF1ZW5jZSBudW1iZXIsIHJlYWQgZnJvbSB0aGUgbWFuaWZlc3QsIG9yIGNvcGllZCBmcm9tCkBAIC0xNzIsNiArMTkxLDEwIEBACiAgICAgLy8gUmVzdW1lIGEgZmV0Y2hlciB0byBjb250aW51ZSB1bnRpbCB0aGUgc3RvcHBpbmcgcG9pbnQgc3RvcmVkIGluIG1zZy4KICAgICBzdGF0dXNfdCBvblJlc3VtZVVudGlsKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAorICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzZXRBY2Nlc3NVbml0UHJvcGVydGllcygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0LAorICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIGJvb2wgZGlzY2FyZCA9IGZhbHNlKTsKICAgICBzdGF0dXNfdCBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0c0Zyb21Ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIHN0YXR1c190IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzKApAQCAtMTgyLDYgKzIwNSw4IEBACiAgICAgdm9pZCBxdWV1ZURpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpOwogCisgICAgaW50MzJfdCBnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZShpbnQ2NF90IGFuY2hvclRpbWVVcykgY29uc3Q7CisgICAgaW50MzJfdCBnZXRTZXFOdW1iZXJGb3JEaXNjb250aW51aXR5KHNpemVfdCBkaXNjb250aW51aXR5U2VxKSBjb25zdDsKICAgICBpbnQzMl90IGdldFNlcU51bWJlckZvclRpbWUoaW50NjRfdCB0aW1lVXMpIGNvbnN0OwogCiAgICAgdm9pZCB1cGRhdGVEdXJhdGlvbigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5tawppbmRleCBiZjZmN2JiLi4yMTk0YzM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5tawpAQCAtNCw2ICs0LDggQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJSUQzLmNwcAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfaWQzCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKQEAgLTE1LDYgKzE3LDggQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJdGVzdGlkMy5jcHAKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGlic3RhZ2VmcmlnaHQgbGlidXRpbHMgbGlibG9nIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKaW5kZXggYjI1ZmM0ZC4uZWQyZDk0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKQEAgLTQxLDkgKzQxLDkgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBvZmY2NF90IGF2YWlsYWJsZSA9IChvZmZzZXQgPj0gbVNpemUpID8gMGxsIDogbVNpemUgLSBvZmZzZXQ7CisgICAgICAgIG9mZjY0X3QgYXZhaWxhYmxlID0gKG9mZnNldCA+PSAob2ZmNjRfdCltU2l6ZSkgPyAwbGwgOiBtU2l6ZSAtIG9mZnNldDsKIAotICAgICAgICBzaXplX3QgY29weSA9IChhdmFpbGFibGUgPiBzaXplKSA/IHNpemUgOiBhdmFpbGFibGU7CisgICAgICAgIHNpemVfdCBjb3B5ID0gKGF2YWlsYWJsZSA+IChvZmY2NF90KXNpemUpID8gc2l6ZSA6IGF2YWlsYWJsZTsKICAgICAgICAgbWVtY3B5KGRhdGEsIG1EYXRhICsgb2Zmc2V0LCBjb3B5KTsKIAogICAgICAgICByZXR1cm4gY29weTsKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgIH0KIAogICAgIGlmIChzaXplID4ga01heE1ldGFkYXRhU2l6ZSkgewotICAgICAgICBBTE9HRSgic2tpcHBpbmcgaHVnZSBJRDMgbWV0YWRhdGEgb2Ygc2l6ZSAlZCIsIHNpemUpOworICAgICAgICBBTE9HRSgic2tpcHBpbmcgaHVnZSBJRDMgbWV0YWRhdGEgb2Ygc2l6ZSAlenUiLCBzaXplKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtNDg4LDQ5ICs0ODgsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29udmVydElTTzg4NTlUb1N0cmluZzgoCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLAotICAgICAgICBTdHJpbmc4ICpzKSB7Ci0gICAgc2l6ZV90IHV0ZjhsZW4gPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgIGlmIChkYXRhW2ldID09ICdcMCcpIHsKLSAgICAgICAgICAgIHNpemUgPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVtpXSA8IDB4ODApIHsKLSAgICAgICAgICAgICsrdXRmOGxlbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHV0ZjhsZW4gKz0gMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh1dGY4bGVuID09IHNpemUpIHsKLSAgICAgICAgLy8gT25seSBBU0NJSSBjaGFyYWN0ZXJzIHByZXNlbnQuCi0KLSAgICAgICAgcy0+c2V0VG8oKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNoYXIgKnRtcCA9IG5ldyBjaGFyW3V0ZjhsZW5dOwotICAgIGNoYXIgKnB0ciA9IHRtcDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBpZiAoZGF0YVtpXSA9PSAnXDAnKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChkYXRhW2ldIDwgMHg4MCkgewotICAgICAgICAgICAgKnB0cisrID0gZGF0YVtpXTsKLSAgICAgICAgfSBlbHNlIGlmIChkYXRhW2ldIDwgMHhjMCkgewotICAgICAgICAgICAgKnB0cisrID0gMHhjMjsKLSAgICAgICAgICAgICpwdHIrKyA9IGRhdGFbaV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqcHRyKysgPSAweGMzOwotICAgICAgICAgICAgKnB0cisrID0gZGF0YVtpXSAtIDY0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcy0+c2V0VG8odG1wLCB1dGY4bGVuKTsKLQotICAgIGRlbGV0ZVtdIHRtcDsKLSAgICB0bXAgPSBOVUxMOwotfQogCiAvLyB0aGUgMm5kIGFyZ3VtZW50IGlzIHVzZWQgdG8gZ2V0IHRoZSBkYXRhIGZvbGxvd2luZyB0aGUgXDAgaW4gYSBjb21tZW50IGZpZWxkCiB2b2lkIElEMzo6SXRlcmF0b3I6OmdldFN0cmluZyhTdHJpbmc4ICppZCwgU3RyaW5nOCAqY29tbWVudCkgY29uc3QgewpAQCAtNTYzLDcgKzUyMCw5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBjb252ZXJ0SVNPODg1OVRvU3RyaW5nOChmcmFtZURhdGEsIG1GcmFtZVNpemUsIGlkKTsKKyAgICAgICAgLy8gdGhpcyBpcyBzdXBwb3NlZCB0byBiZSBJU08tODg1OS0xLCBidXQgcGFzcyBpdCB1cCBhcy1pcyB0byB0aGUgY2FsbGVyLCB3aG8gd2lsbCBmaWd1cmUKKyAgICAgICAgLy8gb3V0IHRoZSByZWFsIGVuY29kaW5nCisgICAgICAgIGlkLT5zZXRUbygoY29uc3QgY2hhciopZnJhbWVEYXRhLCBtRnJhbWVTaXplKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNTg0LDEzICs1NDMsMTMgQEAKICAgICB9CiAKICAgICBpZiAoZW5jb2RpbmcgPT0gMHgwMCkgewotICAgICAgICAvLyBJU08gODg1OS0xCi0gICAgICAgIGNvbnZlcnRJU084ODU5VG9TdHJpbmc4KGZyYW1lRGF0YSArIDEsIG4sIGlkKTsKKyAgICAgICAgLy8gc3VwcG9zZWRseSBJU08gODg1OS0xCisgICAgICAgIGlkLT5zZXRUbygoY29uc3QgY2hhciopZnJhbWVEYXRhICsgMSwgbik7CiAgICAgfSBlbHNlIGlmIChlbmNvZGluZyA9PSAweDAzKSB7Ci0gICAgICAgIC8vIFVURi04CisgICAgICAgIC8vIHN1cHBvc2VkbHkgVVRGLTgKICAgICAgICAgaWQtPnNldFRvKChjb25zdCBjaGFyICopKGZyYW1lRGF0YSArIDEpLCBuKTsKICAgICB9IGVsc2UgaWYgKGVuY29kaW5nID09IDB4MDIpIHsKLSAgICAgICAgLy8gVVRGLTE2IEJFLCBubyBieXRlIG9yZGVyIG1hcmsuCisgICAgICAgIC8vIHN1cHBvc2VkbHkgVVRGLTE2IEJFLCBubyBieXRlIG9yZGVyIG1hcmsuCiAgICAgICAgIC8vIEFQSSB3YW50cyBudW1iZXIgb2YgY2hhcmFjdGVycywgbm90IG51bWJlciBvZiBieXRlcy4uLgogICAgICAgICBpbnQgbGVuID0gbiAvIDI7CiAgICAgICAgIGNvbnN0IGNoYXIxNl90ICpmcmFtZWRhdGEgPSAoY29uc3QgY2hhcjE2X3QgKikgKGZyYW1lRGF0YSArIDEpOwpAQCAtNjA2LDcgKzU2NSw3IEBACiAgICAgICAgIGlmIChmcmFtZWRhdGFjb3B5ICE9IE5VTEwpIHsKICAgICAgICAgICAgIGRlbGV0ZVtdIGZyYW1lZGF0YWNvcHk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgPT0gMHgwMSkgewogICAgICAgICAvLyBVQ1MtMgogICAgICAgICAvLyBBUEkgd2FudHMgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIG5vdCBudW1iZXIgb2YgYnl0ZXMuLi4KICAgICAgICAgaW50IGxlbiA9IG4gLyAyOwpAQCAtNjI1LDcgKzU4NCwyNyBAQAogICAgICAgICAgICAgZnJhbWVkYXRhKys7CiAgICAgICAgICAgICBsZW4tLTsKICAgICAgICAgfQotICAgICAgICBpZC0+c2V0VG8oZnJhbWVkYXRhLCBsZW4pOworCisgICAgICAgIC8vIGNoZWNrIGlmIHRoZSByZXN1bHRpbmcgZGF0YSBjb25zaXN0cyBlbnRpcmVseSBvZiA4LWJpdCB2YWx1ZXMKKyAgICAgICAgYm9vbCBlaWdodEJpdCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmcmFtZWRhdGFbaV0gPiAweGZmKSB7CisgICAgICAgICAgICAgICAgZWlnaHRCaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZWlnaHRCaXQpIHsKKyAgICAgICAgICAgIC8vIGNvbGxhcHNlIHRvIDggYml0LCB0aGVuIGxldCB0aGUgbWVkaWEgc2Nhbm5lciBjbGllbnQgZmlndXJlIG91dCB0aGUgcmVhbCBlbmNvZGluZworICAgICAgICAgICAgY2hhciAqZnJhbWU4ID0gbmV3IGNoYXJbbGVuXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmcmFtZThbaV0gPSBmcmFtZWRhdGFbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZC0+c2V0VG8oZnJhbWU4LCBsZW4pOworICAgICAgICAgICAgZGVsZXRlIFtdIGZyYW1lODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlkLT5zZXRUbyhmcmFtZWRhdGEsIGxlbik7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoZnJhbWVkYXRhY29weSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBkZWxldGVbXSBmcmFtZWRhdGFjb3B5OwogICAgICAgICB9CkBAIC02ODIsOCArNjYxLDggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1PZmZzZXQgKyBtRnJhbWVTaXplID4gbVBhcmVudC5tU2l6ZSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJwYXJ0aWFsIGZyYW1lIGF0IG9mZnNldCAlZCAoc2l6ZSA9ICVkLCBieXRlcy1yZW1haW5pbmcgPSAlZCkiLAotICAgICAgICAgICAgICAgICAgICAgbU9mZnNldCwgbUZyYW1lU2l6ZSwgbVBhcmVudC5tU2l6ZSAtIG1PZmZzZXQgLSA2KTsKKyAgICAgICAgICAgICAgICBBTE9HVigicGFydGlhbCBmcmFtZSBhdCBvZmZzZXQgJXp1IChzaXplID0gJXp1LCBieXRlcy1yZW1haW5pbmcgPSAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgbU9mZnNldCwgbUZyYW1lU2l6ZSwgbVBhcmVudC5tU2l6ZSAtIG1PZmZzZXQgLSAoc2l6ZV90KTYpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApAQCAtNzM3LDggKzcxNiw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtT2Zmc2V0ICsgbUZyYW1lU2l6ZSA+IG1QYXJlbnQubVNpemUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicGFydGlhbCBmcmFtZSBhdCBvZmZzZXQgJWQgKHNpemUgPSAlZCwgYnl0ZXMtcmVtYWluaW5nID0gJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgIG1PZmZzZXQsIG1GcmFtZVNpemUsIG1QYXJlbnQubVNpemUgLSBtT2Zmc2V0IC0gMTApOworICAgICAgICAgICAgICAgIEFMT0dWKCJwYXJ0aWFsIGZyYW1lIGF0IG9mZnNldCAlenUgKHNpemUgPSAlenUsIGJ5dGVzLXJlbWFpbmluZyA9ICV6dSkiLAorICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0LCBtRnJhbWVTaXplLCBtUGFyZW50Lm1TaXplIC0gbU9mZnNldCAtIChzaXplX3QpMTApOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3RpZDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3RpZDMuY3BwCmluZGV4IGJjNDU3MmMuLmIyZjQxODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0aWQzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdGlkMy5jcHAKQEAgLTMzLDcgKzMzLDcgQEAKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilfZGF0YTsKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKICAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICBwcmludGYoIjB4JTA0eCAgIiwgb2Zmc2V0KTsKKyAgICAgICAgcHJpbnRmKCIweCUwNHp4ICAiLCBvZmZzZXQpOwogCiAgICAgICAgIHNpemVfdCBuID0gc2l6ZSAtIG9mZnNldDsKICAgICAgICAgaWYgKG4gPiAxNikgewpAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEgPSB0YWcuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CiAKICAgICAgICAgaWYgKGRhdGEpIHsKLSAgICAgICAgICAgIHByaW50ZigiZm91bmQgYWxidW0gYXJ0OiBzaXplPSVkIG1pbWU9JyVzJ1xuIiwgZGF0YVNpemUsCisgICAgICAgICAgICBwcmludGYoImZvdW5kIGFsYnVtIGFydDogc2l6ZT0lenUgbWltZT0nJXMnXG4iLCBkYXRhU2l6ZSwKICAgICAgICAgICAgICAgICAgICBtaW1lLnN0cmluZygpKTsKIAogICAgICAgICAgICAgaGV4ZHVtcChkYXRhLCBkYXRhU2l6ZSA+IDEyOCA/IDEyOCA6IGRhdGFTaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKaW5kZXggMjcxZGY4ZS4uNzdkNjVlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKQEAgLTMyLDYgKzMyLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEF1ZGlvUGxheWVyOworc3RydWN0IENsb2NrRXN0aW1hdG9yOwogc3RydWN0IERhdGFTb3VyY2U7CiBzdHJ1Y3QgTWVkaWFCdWZmZXI7CiBzdHJ1Y3QgTWVkaWFFeHRyYWN0b3I7CkBAIC02Myw2ICs2NCw3IEBACiAgICAgdm9pZCBzZXRVSUQodWlkX3QgdWlkKTsKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKIApAQCAtMTU5LDYgKzE2MSw3IEBACiAgICAgU3lzdGVtVGltZVNvdXJjZSBtU3lzdGVtVGltZVNvdXJjZTsKICAgICBUaW1lU291cmNlICptVGltZVNvdXJjZTsKIAorICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CiAgICAgU3RyaW5nOCBtVXJpOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1VcmlIZWFkZXJzOwogCkBAIC0yMzQsNiArMjM3LDcgQEAKIAogICAgIE1lZGlhQnVmZmVyICptVmlkZW9CdWZmZXI7CiAKKyAgICBzcDxDbG9ja0VzdGltYXRvcj4gbUNsb2NrRXN0aW1hdG9yOwogICAgIHNwPEhUVFBCYXNlPiBtQ29ubmVjdGluZ0RhdGFTb3VyY2U7CiAgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBtQ2FjaGVkU291cmNlOwogCkBAIC0yNDcsNiArMjUxLDcgQEAKICAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2VfbCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwogCkBAIC0yOTMsNiArMjk4LDcgQEAKIAogICAgIGJvb2wgZ2V0Qml0cmF0ZShpbnQ2NF90ICpiaXRyYXRlKTsKIAorICAgIGludDY0X3QgZXN0aW1hdGVSZWFsVGltZVVzKFRpbWVTb3VyY2UgKnRzLCBpbnQ2NF90IHN5c3RlbVRpbWVVcyk7CiAgICAgdm9pZCBmaW5pc2hTZWVrSWZOZWNlc3NhcnkoaW50NjRfdCB2aWRlb1RpbWVVcyk7CiAgICAgdm9pZCBlbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTE4OGRkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIENIUk9NRV9IVFRQX0RBVEFfU09VUkNFX0hfCi0KLSNkZWZpbmUgQ0hST01FX0hUVFBfREFUQV9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgIkhUVFBCYXNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFNmRGVsZWdhdGU7Ci0KLXN0cnVjdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlIDogcHVibGljIEhUVFBCYXNlIHsKLSAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlKHVpbnQzMl90IGZsYWdzID0gMCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IDApOwotCi0gICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKLQotICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKLQotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKLQotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCk7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgVXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+Q2hyb21pdW1IVFRQRGF0YVNvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBzdHJ1Y3QgU2ZEZWxlZ2F0ZTsKLQotICAgIGVudW0gU3RhdGUgewotICAgICAgICBESVNDT05ORUNURUQsCi0gICAgICAgIENPTk5FQ1RJTkcsCi0gICAgICAgIENPTk5FQ1RFRCwKLSAgICAgICAgUkVBRElORywKLSAgICAgICAgRElTQ09OTkVDVElORwotICAgIH07Ci0KLSAgICBjb25zdCB1aW50MzJfdCBtRmxhZ3M7Ci0KLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOwotCi0gICAgU3RhdGUgbVN0YXRlOwotCi0gICAgU2ZEZWxlZ2F0ZSAqbURlbGVnYXRlOwotCi0gICAgQVN0cmluZyBtVVJJOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1IZWFkZXJzOwotCi0gICAgb2ZmNjRfdCBtQ3VycmVudE9mZnNldDsKLQotICAgIC8vIEFueSBjb25uZWN0aW9uIGVycm9yIG9yIHRoZSByZXN1bHQgb2YgYSByZWFkIG9wZXJhdGlvbgotICAgIC8vIChmb3IgdGhlIGxhdHR0ZXIgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIGlmIHN1Y2Nlc3NmdWwpLgotICAgIHNzaXplX3QgbUlPUmVzdWx0OwotCi0gICAgaW50NjRfdCBtQ29udGVudFNpemU7Ci0KLSAgICBTdHJpbmc4IG1Db250ZW50VHlwZTsKLQotICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwotICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OwotCi0gICAgdm9pZCBkaXNjb25uZWN0X2woKTsKLQotICAgIHN0YXR1c190IGNvbm5lY3RfbCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOwotCi0gICAgc3RhdGljIHZvaWQgSW5pdGlhdGVSZWFkKAotICAgICAgICAgICAgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSAqbWUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZvaWQgaW5pdGlhdGVSZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZvaWQgb25Db25uZWN0aW9uRXN0YWJsaXNoZWQoCi0gICAgICAgICAgICBpbnQ2NF90IGNvbnRlbnRTaXplLCBjb25zdCBjaGFyICpjb250ZW50VHlwZSk7Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvbkZhaWxlZChzdGF0dXNfdCBlcnIpOwotICAgIHZvaWQgb25SZWFkQ29tcGxldGVkKHNzaXplX3Qgc2l6ZSk7Ci0gICAgdm9pZCBvbkRpc2Nvbm5lY3RDb21wbGV0ZSgpOwotICAgIHZvaWQgb25SZWRpcmVjdChjb25zdCBjaGFyICp1cmwpOwotCi0gICAgdm9pZCBjbGVhckRSTVN0YXRlX2woKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENocm9taXVtSFRUUERhdGFTb3VyY2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBDSFJPTUVfSFRUUF9EQVRBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFnbWVudGVkTVA0UGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZyYWdtZW50ZWRNUDRQYXJzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlMDJiOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZyYWdtZW50ZWRNUDRQYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBQQVJTRVJfSF8KLQotI2RlZmluZSBQQVJTRVJfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFCdWZmZXI7Ci0KLXN0cnVjdCBGcmFnbWVudGVkTVA0UGFyc2VyIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBzdHJ1Y3QgU291cmNlIDogcHVibGljIFJlZkJhc2UgewotICAgICAgICBTb3VyY2UoKSB7fQotCi0gICAgICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBpc1NlZWthYmxlKCkgPSAwOwotCi0gICAgICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB+U291cmNlKCkge30KLQotICAgICAgICBwcml2YXRlOgotICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb3VyY2UpOwotICAgIH07Ci0KLSAgICBGcmFnbWVudGVkTVA0UGFyc2VyKCk7Ci0KLSAgICB2b2lkIHN0YXJ0KGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKLSAgICB2b2lkIHN0YXJ0KGNvbnN0IHNwPFNvdXJjZT4gJnNvdXJjZSk7Ci0gICAgdm9pZCBzdGFydChzcDxEYXRhU291cmNlPiAmc291cmNlKTsKLQotICAgIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXQoYm9vbCBhdWRpbywgYm9vbCBzeW5jaHJvbm91cyA9IGZhbHNlKTsKLSAgICBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCwgYm9vbCBzeW5jaHJvbm91cyA9IGZhbHNlKTsKLSAgICBzdGF0dXNfdCBzZWVrVG8oYm9vbCBhdWRpbywgaW50NjRfdCB0aW1lVXMpOwotICAgIGJvb2wgaXNTZWVrYWJsZSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkZyYWdtZW50ZWRNUDRQYXJzZXIoKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRTdGFydCwKLSAgICAgICAga1doYXRQcm9jZWVkLAotICAgICAgICBrV2hhdFJlYWRNb3JlLAotICAgICAgICBrV2hhdEdldEZvcm1hdCwKLSAgICAgICAga1doYXREZXF1ZXVlQWNjZXNzVW5pdCwKLSAgICAgICAga1doYXRTZWVrVG8sCi0gICAgfTsKLQotICAgIHN0cnVjdCBUcmFja0ZyYWdtZW50OwotICAgIHN0cnVjdCBEeW5hbWljVHJhY2tGcmFnbWVudDsKLSAgICBzdHJ1Y3QgU3RhdGljVHJhY2tGcmFnbWVudDsKLQotICAgIHN0cnVjdCBEaXNwYXRjaEVudHJ5IHsKLSAgICAgICAgdWludDMyX3QgbVR5cGU7Ci0gICAgICAgIHVpbnQzMl90IG1QYXJlbnRUeXBlOwotICAgICAgICBzdGF0dXNfdCAoRnJhZ21lbnRlZE1QNFBhcnNlcjo6Km1IYW5kbGVyKSh1aW50MzJfdCwgc2l6ZV90LCB1aW50NjRfdCk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBDb250YWluZXIgewotICAgICAgICB1aW50NjRfdCBtT2Zmc2V0OwotICAgICAgICB1aW50NjRfdCBtQnl0ZXNSZW1haW5pbmc7Ci0gICAgICAgIHVpbnQzMl90IG1UeXBlOwotICAgICAgICBib29sIG1FeHRlbmRzVG9FT0Y7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBTYW1wbGVEZXNjcmlwdGlvbiB7Ci0gICAgICAgIHVpbnQzMl90IG1UeXBlOwotICAgICAgICB1aW50MTZfdCBtRGF0YVJlZkluZGV4OwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgU2FtcGxlSW5mbyB7Ci0gICAgICAgIG9mZjY0X3QgbU9mZnNldDsKLSAgICAgICAgc2l6ZV90IG1TaXplOwotICAgICAgICB1aW50MzJfdCBtUHJlc2VudGF0aW9uVGltZTsKLSAgICAgICAgc2l6ZV90IG1TYW1wbGVEZXNjSW5kZXg7Ci0gICAgICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICB9OwotCi0gICAgc3RydWN0IE1lZGlhRGF0YUluZm8gewotICAgICAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOwotICAgICAgICBvZmY2NF90IG1PZmZzZXQ7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBTaWR4RW50cnkgewotICAgICAgICBzaXplX3QgbVNpemU7Ci0gICAgICAgIHVpbnQzMl90IG1EdXJhdGlvblVzOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKLSAgICAgICAgZW51bSBGbGFncyB7Ci0gICAgICAgICAgICBrVHJhY2tFbmFibGVkICAgICA9IDB4MDEsCi0gICAgICAgICAgICBrVHJhY2tJbk1vdmllICAgICA9IDB4MDIsCi0gICAgICAgICAgICBrVHJhY2tJblByZXZpZXcgICA9IDB4MDQsCi0gICAgICAgIH07Ci0KLSAgICAgICAgdWludDMyX3QgbVRyYWNrSUQ7Ci0gICAgICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICAgICAgdWludDMyX3QgbUR1cmF0aW9uOyAgLy8gVGhpcyBpcyB0aGUgZHVyYXRpb24gaW4gdGVybXMgb2YgbW92aWUgdGltZXNjYWxlIQotICAgICAgICB1aW50NjRfdCBtU2lkeER1cmF0aW9uOyAvLyB1c2VjLCBmcm9tIHNpZHggYm94LCB3aGljaCBjYW4gdXNlIGEgZGlmZmVyZW50IHRpbWVzY2FsZQotCi0gICAgICAgIHVpbnQzMl90IG1NZWRpYVRpbWVTY2FsZTsKLQotICAgICAgICB1aW50MzJfdCBtTWVkaWFIYW5kbGVyVHlwZTsKLSAgICAgICAgVmVjdG9yPFNhbXBsZURlc2NyaXB0aW9uPiBtU2FtcGxlRGVzY3M7Ci0KLSAgICAgICAgLy8gZnJvbSB0cmFjayBleHRlbmRzOgotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZURlc2NyaXB0aW9uSW5kZXg7Ci0gICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlRHVyYXRpb247Ci0gICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlU2l6ZTsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVGbGFnczsKLQotICAgICAgICB1aW50MzJfdCBtRGVjb2RpbmdUaW1lOwotCi0gICAgICAgIFZlY3RvcjxTaWR4RW50cnk+IG1TaWR4OwotICAgICAgICBzcDxTdGF0aWNUcmFja0ZyYWdtZW50PiBtU3RhdGljRnJhZ21lbnQ7Ci0gICAgICAgIExpc3Q8c3A8VHJhY2tGcmFnbWVudD4gPiBtRnJhZ21lbnRzOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgVHJhY2tGcmFnbWVudEhlYWRlckluZm8gewotICAgICAgICBlbnVtIEZsYWdzIHsKLSAgICAgICAgICAgIGtCYXNlRGF0YU9mZnNldFByZXNlbnQgICAgICAgICA9IDB4MDEsCi0gICAgICAgICAgICBrU2FtcGxlRGVzY3JpcHRpb25JbmRleFByZXNlbnQgPSAweDAyLAotICAgICAgICAgICAga0RlZmF1bHRTYW1wbGVEdXJhdGlvblByZXNlbnQgID0gMHgwOCwKLSAgICAgICAgICAgIGtEZWZhdWx0U2FtcGxlU2l6ZVByZXNlbnQgICAgICA9IDB4MTAsCi0gICAgICAgICAgICBrRGVmYXVsdFNhbXBsZUZsYWdzUHJlc2VudCAgICAgPSAweDIwLAotICAgICAgICAgICAga0R1cmF0aW9uSXNFbXB0eSAgICAgICAgICAgICAgID0gMHgxMDAwMCwKLSAgICAgICAgfTsKLQotICAgICAgICB1aW50MzJfdCBtVHJhY2tJRDsKLSAgICAgICAgdWludDMyX3QgbUZsYWdzOwotICAgICAgICB1aW50NjRfdCBtQmFzZURhdGFPZmZzZXQ7Ci0gICAgICAgIHVpbnQzMl90IG1TYW1wbGVEZXNjcmlwdGlvbkluZGV4OwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZUR1cmF0aW9uOwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZVNpemU7Ci0gICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlRmxhZ3M7Ci0KLSAgICAgICAgdWludDY0X3QgbURhdGFPZmZzZXQ7Ci0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCBEaXNwYXRjaEVudHJ5IGtEaXNwYXRjaFRhYmxlW107Ci0KLSAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7Ci0gICAgb2ZmX3QgbUJ1ZmZlclBvczsKLSAgICBib29sIG1TdXNwZW5kZWQ7Ci0gICAgYm9vbCBtRG9uZVdpdGhNb292OwotICAgIG9mZl90IG1GaXJzdE1vb2ZPZmZzZXQ7IC8vIHVzZWQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBvZmZzZXRzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgc2lkeCBib3gKLSAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOwotICAgIFZlY3RvcjxDb250YWluZXI+IG1TdGFjazsKLSAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgVHJhY2tJbmZvPiBtVHJhY2tzOyAgLy8gVHJhY2tJbmZvIGJ5IHRyYWNrSUQKLSAgICBWZWN0b3I8TWVkaWFEYXRhSW5mbz4gbU1lZGlhRGF0YTsKLQotICAgIHVpbnQzMl90IG1DdXJyZW50VHJhY2tJRDsKLQotICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKLQotICAgIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mbzsKLQotICAgIHN0YXR1c190IG9uUHJvY2VlZCgpOwotICAgIHN0YXR1c190IG9uRGVxdWV1ZUFjY2Vzc1VuaXQoc2l6ZV90IHRyYWNrSW5kZXgsIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKLSAgICBzdGF0dXNfdCBvblNlZWtUbyhib29sIHdhbnRBdWRpbywgaW50NjRfdCBwb3NpdGlvbik7Ci0KLSAgICB2b2lkIGVudGVyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCB0eXBlLCB1aW50NjRfdCBzaXplKTsKLQotICAgIHVpbnQxNl90IHJlYWRVMTYoc2l6ZV90IG9mZnNldCk7Ci0gICAgdWludDMyX3QgcmVhZFUzMihzaXplX3Qgb2Zmc2V0KTsKLSAgICB1aW50NjRfdCByZWFkVTY0KHNpemVfdCBvZmZzZXQpOwotICAgIHZvaWQgc2tpcChvZmZfdCBkaXN0YW5jZSk7Ci0gICAgc3RhdHVzX3QgbmVlZChzaXplX3Qgc2l6ZSk7Ci0gICAgYm9vbCBmaXRzQ29udGFpbmVyKHVpbnQ2NF90IHNpemUpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgcGFyc2VUcmFja0hlYWRlcigKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VNZWRpYUhlYWRlcigKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VNZWRpYUhhbmRsZXIoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlVHJhY2tFeHRlbmRzKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVRyYWNrRnJhZ21lbnRIZWFkZXIoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlVHJhY2tGcmFnbWVudFJ1bigKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VWaXN1YWxTYW1wbGVFbnRyeSgKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VBdWRpb1NhbXBsZUVudHJ5KAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZVNpemVzKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUNvbXBhY3RTYW1wbGVTaXplcygKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVUb0NodW5rKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUNodW5rT2Zmc2V0cygKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDaHVua09mZnNldHM2NCgKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VFU0RTQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlTWVkaWFEYXRhKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVNlZ21lbnRJbmRleCgKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgVHJhY2tJbmZvICplZGl0VHJhY2sodWludDMyX3QgdHJhY2tJRCwgYm9vbCBjcmVhdGVJZk5lY2Vzc2FyeSA9IGZhbHNlKTsKLQotICAgIHNzaXplX3QgZmluZFRyYWNrKGJvb2wgd2FudEF1ZGlvKSBjb25zdDsKLQotICAgIHN0YXR1c190IG1ha2VBY2Nlc3NVbml0KAotICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvLAotICAgICAgICAgICAgY29uc3QgU2FtcGxlSW5mbyAmc2FtcGxlLAotICAgICAgICAgICAgY29uc3QgTWVkaWFEYXRhSW5mbyAmbWRhdEluZm8sCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7Ci0KLSAgICBzdGF0dXNfdCBnZXRTYW1wbGUoCi0gICAgICAgICAgICBUcmFja0luZm8gKmluZm8sCi0gICAgICAgICAgICBzcDxUcmFja0ZyYWdtZW50PiAqZnJhZ21lbnQsCi0gICAgICAgICAgICBTYW1wbGVJbmZvICpzYW1wbGVJbmZvKTsKLQotICAgIHN0YXRpYyBpbnQgQ29tcGFyZVNhbXBsZUxvY2F0aW9uKAotICAgICAgICBjb25zdCBTYW1wbGVJbmZvICZzYW1wbGUsIGNvbnN0IE1lZGlhRGF0YUluZm8gJm1kYXRJbmZvKTsKLQotICAgIHZvaWQgcmVzdW1lSWZOZWNlc3NhcnkoKTsKLQotICAgIHZvaWQgY29weUJ1ZmZlcigKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+ICpkc3QsCi0gICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSBjb25zdDsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZyYWdtZW50ZWRNUDRQYXJzZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBQQVJTRVJfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCmluZGV4IGQ0YjdmOWYuLjFjM2NkNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKQEAgLTQ4LDE0ICs0OCw2IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJhbmR3aWR0aFN0YXRDb2xsZWN0RnJlcShpbnQzMl90IGZyZXFNcyk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3QgVXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCi0gICAgdm9pZCBzZXRVSUQodWlkX3QgdWlkKTsKLSAgICBib29sIGdldFVJRCh1aWRfdCAqdWlkKSBjb25zdDsKLQotICAgIHN0YXRpYyBzcDxIVFRQQmFzZT4gQ3JlYXRlKHVpbnQzMl90IGZsYWdzID0gMCk7Ci0KICAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKTsKICAgICBzdGF0aWMgdm9pZCBVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkKTsKIApAQCAtODcsOSArNzksNiBAQAogICAgIGludDMyX3QgbVByZXZFc3RpbWF0ZWRCYW5kV2lkdGhLYnBzOwogICAgIGludDMyX3QgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXM7CiAKLSAgICBib29sIG1VSURWYWxpZDsKLSAgICB1aWRfdCBtVUlEOwotCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSFRUUEJhc2UpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCmluZGV4IDdiNGJjNmQuLjFmZTZmY2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKQEAgLTM5LDYgKzM5LDE0IEBACiAgICAgdWludDMyX3QgbUR1cmF0aW9uVXM7CiB9OwogCitzdHJ1Y3QgVHJleCB7CisgICAgdWludDMyX3QgdHJhY2tfSUQ7CisgICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXg7CisgICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfZHVyYXRpb247CisgICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfc2l6ZTsKKyAgICB1aW50MzJfdCBkZWZhdWx0X3NhbXBsZV9mbGFnczsKK307CisKIGNsYXNzIE1QRUc0RXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKIHB1YmxpYzoKICAgICAvLyBFeHRyYWN0b3IgYXNzdW1lcyBvd25lcnNoaXAgb2YgInNvdXJjZSIuCkBAIC03NCwxMSArODIsMTIgQEAKICAgICB9OwogCiAgICAgVmVjdG9yPFNpZHhFbnRyeT4gbVNpZHhFbnRyaWVzOwotICAgIHVpbnQ2NF90IG1TaWR4RHVyYXRpb247CiAgICAgb2ZmNjRfdCBtTW9vZk9mZnNldDsKIAogICAgIFZlY3RvcjxQc3NoSW5mbz4gbVBzc2g7CiAKKyAgICBWZWN0b3I8VHJleD4gbVRyZXg7CisKICAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIGJvb2wgbUhhc1ZpZGVvOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKaW5kZXggOTQ5YTQ5ZS4uYTI5YmRmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCkBAIC0zNyw2ICszNyw4IEBACiAKICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKIApAQCAtMTA4LDYgKzExMCw3IEBACiAgICAgb2ZmNjRfdCBtTGFzdEFjY2Vzc1BvczsKICAgICBzcDxBTWVzc2FnZT4gbUFzeW5jUmVzdWx0OwogICAgIGJvb2wgbUZldGNoaW5nOworICAgIGJvb2wgbURpc2Nvbm5lY3Rpbmc7CiAgICAgaW50NjRfdCBtTGFzdEZldGNoVGltZVVzOwogCiAgICAgaW50MzJfdCBtTnVtUmV0cmllc0xlZnQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaAppbmRleCAyYmMzNzU5Li4yZGE1YzZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKQEAgLTc1LDYgKzc1LDEwIEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUsCiAgICAgICAgICAgICBPTVhfVTMyIG1heF9mcmFtZV93aWR0aCwgT01YX1UzMiBtYXhfZnJhbWVfaGVpZ2h0KTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIpOwpAQCAtMTM2LDEwICsxNDAsMTAgQEAKICAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBFdmVudERhdGEpOwogCiAgICAgT01YX0VSUk9SVFlQRSBPbkVtcHR5QnVmZmVyRG9uZSgKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKIAogICAgIE9NWF9FUlJPUlRZUEUgT25GaWxsQnVmZmVyRG9uZSgKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKIAogICAgIHZvaWQgaW52YWxpZGF0ZU5vZGVJRChub2RlX2lkIG5vZGUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaAppbmRleCAzMGQ5NTg0Li5iY2RhYTliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKQEAgLTYyLDYgKzYyLDEwIEBACiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAogICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KTsKIAorICAgIHN0YXR1c190IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwKKyAgICAgICAgICAgIE9NWF9VMzIgYXVkaW9Id1N5bmMsIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlKTsKKwogICAgIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlcik7CkBAIC0xNDMsMTIgKzE0NywyNCBAQAogICAgICAgICBPTVg6OmJ1ZmZlcl9pZCBtSUQ7CiAgICAgfTsKICAgICBWZWN0b3I8QWN0aXZlQnVmZmVyPiBtQWN0aXZlQnVmZmVyczsKKyAgICAvLyBmb3IgYnVmZmVyIHB0ciB0byBidWZmZXIgaWQgdHJhbnNsYXRpb24KKyAgICBNdXRleCBtQnVmZmVySURMb2NrOworICAgIHVpbnQzMl90IG1CdWZmZXJJRENvdW50OworICAgIEtleWVkVmVjdG9yPE9NWDo6YnVmZmVyX2lkLCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqPiBtQnVmZmVySURUb0J1ZmZlckhlYWRlcjsKKyAgICBLZXllZFZlY3RvcjxPTVhfQlVGRkVSSEVBREVSVFlQRSAqLCBPTVg6OmJ1ZmZlcl9pZD4gbUJ1ZmZlckhlYWRlclRvQnVmZmVySUQ7CiAKICAgICB+T01YTm9kZUluc3RhbmNlKCk7CiAKICAgICB2b2lkIGFkZEFjdGl2ZUJ1ZmZlcihPTVhfVTMyIHBvcnRJbmRleCwgT01YOjpidWZmZXJfaWQgaWQpOwogICAgIHZvaWQgcmVtb3ZlQWN0aXZlQnVmZmVyKE9NWF9VMzIgcG9ydEluZGV4LCBPTVg6OmJ1ZmZlcl9pZCBpZCk7CiAgICAgdm9pZCBmcmVlQWN0aXZlQnVmZmVycygpOworCisgICAgLy8gRm9yIGJ1ZmZlciBpZCBtYW5hZ2VtZW50CisgICAgT01YOjpidWZmZXJfaWQgbWFrZUJ1ZmZlcklEKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXJIZWFkZXIpOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpmaW5kQnVmZmVySGVhZGVyKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcik7CisgICAgT01YOjpidWZmZXJfaWQgZmluZEJ1ZmZlcklEKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXJIZWFkZXIpOworICAgIHZvaWQgaW52YWxpZGF0ZUJ1ZmZlcklEKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcik7CisKICAgICBzdGF0dXNfdCB1c2VHcmFwaGljQnVmZmVyMl9sKAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLAogICAgICAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlcik7CkBAIC0xNzAsNyArMTg2LDkgQEAKICAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBEYXRhLAogICAgICAgICAgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKIAotICAgIHN0YXR1c190IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbChPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlKTsKKyAgICBzdGF0dXNfdCBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2woCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICAgICAgT01YX0JPT0wgdXNlR3JhcGhpY0J1ZmZlciwgT01YX0JPT0wgKnVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YSk7CiAKICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBnZXRHcmFwaGljQnVmZmVyU291cmNlKCk7CiAgICAgdm9pZCBzZXRHcmFwaGljQnVmZmVyU291cmNlKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBidWZmZXJTb3VyY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmgKaW5kZXggY2E1OWRjMC4uMmM0ZjU0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oCkBAIC0yNSw2ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBIVFRQQmFzZTsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIAogc3RydWN0IFNEUExvYWRlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CkBAIC0zNCw3ICszNSwxMCBAQAogICAgIGVudW0gewogICAgICAgICBrV2hhdFNEUExvYWRlZCA9ICdzZHBsJwogICAgIH07Ci0gICAgU0RQTG9hZGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCB1aW50MzJfdCBmbGFncyA9IDAsIGJvb2wgdWlkVmFsaWQgPSBmYWxzZSwgdWlkX3QgdWlkID0gMCk7CisgICAgU0RQTG9hZGVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpOwogCiAgICAgdm9pZCBsb2FkKGNvbnN0IGNoYXIqIHVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCkBAIC01NSw4ICs1OSw2IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CiAgICAgY29uc3QgY2hhciogbVVybDsKICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgYm9vbCBtVUlEVmFsaWQ7Ci0gICAgdWlkX3QgbVVJRDsKICAgICBzcDxBTG9vcGVyPiBtTmV0TG9vcGVyOwogICAgIGJvb2wgbUNhbmNlbGxlZDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVJdGVyYXRvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVJdGVyYXRvci5oCmluZGV4IGI1YTA0M2MuLjYwYzllN2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgKQEAgLTMwLDYgKzMwLDcgQEAKICAgICBvZmY2NF90IGdldFNhbXBsZU9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlT2Zmc2V0OyB9CiAgICAgc2l6ZV90IGdldFNhbXBsZVNpemUoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZVNpemU7IH0KICAgICB1aW50MzJfdCBnZXRTYW1wbGVUaW1lKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVUaW1lOyB9CisgICAgdWludDMyX3QgZ2V0U2FtcGxlRHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOyB9CiAKICAgICBzdGF0dXNfdCBnZXRTYW1wbGVTaXplRGlyZWN0KAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHNpemVfdCAqc2l6ZSk7CkBAIC02MSwxMSArNjIsMTIgQEAKICAgICBvZmY2NF90IG1DdXJyZW50U2FtcGxlT2Zmc2V0OwogICAgIHNpemVfdCBtQ3VycmVudFNhbXBsZVNpemU7CiAgICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVUaW1lOworICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlRHVyYXRpb247CiAKICAgICB2b2lkIHJlc2V0KCk7CiAgICAgc3RhdHVzX3QgZmluZENodW5rUmFuZ2UodWludDMyX3Qgc2FtcGxlSW5kZXgpOwogICAgIHN0YXR1c190IGdldENodW5rT2Zmc2V0KHVpbnQzMl90IGNodW5rLCBvZmY2NF90ICpvZmZzZXQpOwotICAgIHN0YXR1c190IGZpbmRTYW1wbGVUaW1lKHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50MzJfdCAqdGltZSk7CisgICAgc3RhdHVzX3QgZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbih1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDMyX3QgKnRpbWUsIHVpbnQzMl90ICpkdXJhdGlvbik7CiAKICAgICBTYW1wbGVJdGVyYXRvcihjb25zdCBTYW1wbGVJdGVyYXRvciAmKTsKICAgICBTYW1wbGVJdGVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IFNhbXBsZUl0ZXJhdG9yICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oCmluZGV4IDg0N2RmZjcuLjQ2MDQ5MmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZVRhYmxlLmgKQEAgLTY2LDcgKzY2LDggQEAKICAgICAgICAgICAgIG9mZjY0X3QgKm9mZnNldCwKICAgICAgICAgICAgIHNpemVfdCAqc2l6ZSwKICAgICAgICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCi0gICAgICAgICAgICBib29sICppc1N5bmNTYW1wbGUgPSBOVUxMKTsKKyAgICAgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSA9IE5VTEwsCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlRHVyYXRpb24gPSBOVUxMKTsKIAogICAgIGVudW0gewogICAgICAgICBrRmxhZ0JlZm9yZSwKQEAgLTc0LDcgKzc1LDggQEAKICAgICAgICAga0ZsYWdDbG9zZXN0CiAgICAgfTsKICAgICBzdGF0dXNfdCBmaW5kU2FtcGxlQXRUaW1lKAotICAgICAgICAgICAgdWludDMyX3QgcmVxX3RpbWUsIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IHJlcV90aW1lLCB1aW50NjRfdCBzY2FsZV9udW0sIHVpbnQ2NF90IHNjYWxlX2RlbiwKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAogICAgIHN0YXR1c190IGZpbmRTeW5jU2FtcGxlTmVhcigKICAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0X3NhbXBsZV9pbmRleCwgdWludDMyX3QgKnNhbXBsZV9pbmRleCwKQEAgLTEzNyw2ICsxMzksMTQgQEAKIAogICAgIGZyaWVuZCBzdHJ1Y3QgU2FtcGxlSXRlcmF0b3I7CiAKKyAgICAvLyBub3JtYWxseSB3ZSBkb24ndCByb3VuZAorICAgIGlubGluZSB1aW50NjRfdCBnZXRTYW1wbGVUaW1lKAorICAgICAgICAgICAgc2l6ZV90IHNhbXBsZV9pbmRleCwgdWludDY0X3Qgc2NhbGVfbnVtLCB1aW50NjRfdCBzY2FsZV9kZW4pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChzYW1wbGVfaW5kZXggPCAoc2l6ZV90KW1OdW1TYW1wbGVTaXplcyAmJiBtU2FtcGxlVGltZUVudHJpZXMgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmIHNjYWxlX2RlbiAhPSAwKQorICAgICAgICAgICAgICAgID8gKG1TYW1wbGVUaW1lRW50cmllc1tzYW1wbGVfaW5kZXhdLm1Db21wb3NpdGlvblRpbWUgKiBzY2FsZV9udW0pIC8gc2NhbGVfZGVuIDogMDsKKyAgICB9CisKICAgICBzdGF0dXNfdCBnZXRTYW1wbGVTaXplX2wodWludDMyX3Qgc2FtcGxlX2luZGV4LCBzaXplX3QgKnNhbXBsZV9zaXplKTsKICAgICB1aW50MzJfdCBnZXRDb21wb3NpdGlvblRpbWVPZmZzZXQodWludDMyX3Qgc2FtcGxlSW5kZXgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCmluZGV4IGY4YzYxZWIuLjU5MWIzOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCkBAIC01OCw2ICs1OCwxMSBAQAogICAgICAgICB9IG1UcmFuc2l0aW9uOwogICAgIH07CiAKKyAgICBlbnVtIHsKKyAgICAgICAga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleCA9IE9NWF9JbmRleFZlbmRvclN0YXJ0VW51c2VkICsgMSwKKyAgICAgICAga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXgsCisgICAgfTsKKwogICAgIHZvaWQgYWRkUG9ydChjb25zdCBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICZkZWYpOwogCiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsR2V0UGFyYW1ldGVyKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaAppbmRleCBkMDUwZmE2Li45ZTk3ZWJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaApAQCAtMjcsOCArMjcsNiBAQAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAotI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKihhKSkpCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CkBAIC01NywxMiArNTUsMzEgQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0Q29uZmlnKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOwogCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldEV4dGVuc2lvbkluZGV4KAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOworCiAgICAgdm9pZCBpbml0UG9ydHMoT01YX1UzMiBudW1JbnB1dEJ1ZmZlcnMsCiAgICAgICAgICAgICBPTVhfVTMyIGlucHV0QnVmZmVyU2l6ZSwKICAgICAgICAgICAgIE9NWF9VMzIgbnVtT3V0cHV0QnVmZmVycywKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlKTsKIAotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlUG9ydERlZmluaXRpb25zKGJvb2wgdXBkYXRlQ3JvcCA9IHRydWUpOworCisgICAgdWludDMyX3Qgb3V0cHV0QnVmZmVyV2lkdGgoKTsKKyAgICB1aW50MzJfdCBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKKworICAgIGVudW0gQ3JvcFNldHRpbmdzTW9kZSB7CisgICAgICAgIGtDcm9wVW5TZXQgPSAwLAorICAgICAgICBrQ3JvcFNldCwKKyAgICAgICAga0Nyb3BDaGFuZ2VkLAorICAgIH07CisgICAgdm9pZCBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoCisgICAgICAgICAgICBib29sICpwb3J0V2lsbFJlc2V0LCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgQ3JvcFNldHRpbmdzTW9kZSBjcm9wU2V0dGluZ3NNb2RlID0ga0Nyb3BVblNldCwgYm9vbCBmYWtlU3RyaWRlID0gZmFsc2UpOworCisgICAgdm9pZCBjb3B5WVYxMkZyYW1lVG9PdXRwdXRCdWZmZXIoCisgICAgICAgICAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlKTsKIAogICAgIGVudW0gewogICAgICAgICBrSW5wdXRQb3J0SW5kZXggID0gMCwKQEAgLTcwLDYgKzg3LDggQEAKICAgICAgICAga01heFBvcnRJbmRleCA9IDEsCiAgICAgfTsKIAorICAgIGJvb2wgbUlzQWRhcHRpdmU7CisgICAgdWludDMyX3QgbUFkYXB0aXZlTWF4V2lkdGgsIG1BZGFwdGl2ZU1heEhlaWdodDsKICAgICB1aW50MzJfdCBtV2lkdGgsIG1IZWlnaHQ7CiAgICAgdWludDMyX3QgbUNyb3BMZWZ0LCBtQ3JvcFRvcCwgbUNyb3BXaWR0aCwgbUNyb3BIZWlnaHQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiODEwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9WSURFT19FTkNPREVSX09NWF9DT01QT05FTlRfSF8KKworI2RlZmluZSBTT0ZUX1ZJREVPX0VOQ09ERVJfT01YX0NPTVBPTkVOVF9IXworCisjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KKworc3RydWN0IGh3X21vZHVsZV90OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50IDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOworCitwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgQ29udmVydEZsZXhZVVZUb1BsYW5hcigKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IGRzdFZTdHJpZGUsCisgICAgICAgICAgICBzdHJ1Y3QgYW5kcm9pZF95Y2JjciAqeWNiY3IsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKworICAgIHN0YXRpYyB2b2lkIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbllWVSwgdWludDhfdCogb3V0WVVWLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICBzdGF0aWMgdm9pZCBDb252ZXJ0UkdCMzJUb1BsYW5hcigKKyAgICAgICAgdWludDhfdCAqZHN0WSwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IGRzdFZTdHJpZGUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBzaXplX3Qgc3JjU3RyaWRlLAorICAgICAgICBib29sIGJncik7CisKKyAgICBjb25zdCB1aW50OF90ICpleHRyYWN0R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHVpbnQ4X3QgKnNyYywgc2l6ZV90IHNyY1NpemUsCisgICAgICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIGNvbnN0OworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldEV4dGVuc2lvbkluZGV4KGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKKworICAgIGVudW0geworICAgICAgICBrSW5wdXRQb3J0SW5kZXggPSAwLAorICAgICAgICBrT3V0cHV0UG9ydEluZGV4ID0gMSwKKyAgICB9OworCitwcml2YXRlOgorICAgIG11dGFibGUgY29uc3QgaHdfbW9kdWxlX3QgKm1HcmFsbG9jTW9kdWxlOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNPRlRfVklERU9fRU5DT0RFUl9PTVhfQ09NUE9ORU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IDdhYjAwNDIuLmZhM2VhODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC0yNCwxNyArMjQsMTcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgTWV0YURhdGE7CitzdHJ1Y3QgQU1lc3NhZ2U7CiAKIGNsYXNzIFNvZnR3YXJlUmVuZGVyZXIgewogcHVibGljOgotICAgIFNvZnR3YXJlUmVuZGVyZXIoCi0gICAgICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93LCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpOworICAgIGV4cGxpY2l0IFNvZnR3YXJlUmVuZGVyZXIoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdyk7CiAKICAgICB+U29mdHdhcmVSZW5kZXJlcigpOwogCiAgICAgdm9pZCByZW5kZXIoCi0gICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqcGxhdGZvcm1Qcml2YXRlKTsKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQ2NF90IHRpbWVzdGFtcE5zLAorICAgICAgICAgICAgdm9pZCAqcGxhdGZvcm1Qcml2YXRlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CiAKIHByaXZhdGU6CiAgICAgZW51bSBZVVZNb2RlIHsKQEAgLTUxLDYgKzUxLDggQEAKIAogICAgIFNvZnR3YXJlUmVuZGVyZXIoY29uc3QgU29mdHdhcmVSZW5kZXJlciAmKTsKICAgICBTb2Z0d2FyZVJlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgU29mdHdhcmVSZW5kZXJlciAmKTsKKworICAgIHZvaWQgcmVzZXRGb3JtYXRJZkNoYW5nZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggYjAyZWQwZS4uNjYzMmMyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTMzLDYgKzMzLDcgQEAKICAgICB2aXJ0dWFsIH5TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RpbWVkRXZlbnRRdWV1ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaW1lZEV2ZW50UXVldWUuaAppbmRleCAzZTg0MjU2Li4yOTYzMTUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RpbWVkRXZlbnRRdWV1ZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGltZWRFdmVudFF1ZXVlLmgKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgIH07CiAKICAgICBzdHJ1Y3QgU3RvcEV2ZW50IDogcHVibGljIFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQgewotICAgICAgICB2aXJ0dWFsIHZvaWQgZmlyZShUaW1lZEV2ZW50UXVldWUgKnF1ZXVlLCBpbnQ2NF90IG5vd191cykgeworICAgICAgICB2aXJ0dWFsIHZvaWQgZmlyZShUaW1lZEV2ZW50UXVldWUgKnF1ZXVlLCBpbnQ2NF90IC8qIG5vd191cyAqLykgewogICAgICAgICAgICAgcXVldWUtPm1TdG9wcGVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1dWTUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XVk1FeHRyYWN0b3IuaAppbmRleCA4ZTYyOTQ2Li5hYjdlOGI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1dWTUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV1ZNRXh0cmFjdG9yLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICB2aXJ0dWFsIHNwPE1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOwogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7CiAKICAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBkYXRhIGNhY2hlZCBmcm9tIHRoZSBjdXJyZW50CiAgICAgLy8gcGxheWJhY2sgcG9zaXRpaW9uIChpbiB1cykuCkBAIC03NCw4ICs3NSw2IEBACiAgICAgLy8gY29kZWMuCiAgICAgdm9pZCBzZXRDcnlwdG9QbHVnaW5Nb2RlKGJvb2wgY3J5cHRvUGx1Z2luTW9kZSk7CiAKLSAgICB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOwotCiAgICAgc3RhdGljIGJvb2wgZ2V0VmVuZG9yTGliSGFuZGxlKCk7CiAKICAgICBzdGF0dXNfdCBnZXRFcnJvcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9jaHJvbWl1bV9odHRwX3N0dWIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvY2hyb21pdW1faHR0cF9zdHViLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNjUxYTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9jaHJvbWl1bV9odHRwX3N0dWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIENIUk9NSVVNX0hUVFBfU1RVQl9IXwotI2RlZmluZSBDSFJPTUlVTV9IVFRQX1NUVUJfSF8KLQotI2luY2x1ZGUgPGluY2x1ZGUvSFRUUEJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLWV4dGVybiAiQyIgewotSFRUUEJhc2UgKmNyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UodWludDMyX3QgZmxhZ3MpOwotCi1zdGF0dXNfdCBVcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCk7Ci0KLURhdGFTb3VyY2UgKmNyZWF0ZURhdGFVcmlTb3VyY2UoY29uc3QgY2hhciAqdXJpKTsKLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5tawppbmRleCAyZDhjMWUxLi40NDZmZjhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsKQEAgLTgsNyArOCw3IEBACiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvbGlid2VibSBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yCiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X21hdHJvc2thCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcAppbmRleCAyNWQwY2YxLi40NGExZTIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCkBAIC0yMCw4ICsyMCw2IEBACiAKICNpbmNsdWRlICJNYXRyb3NrYUV4dHJhY3Rvci5oIgogCi0jaW5jbHVkZSAibWt2cGFyc2VyLmhwcCIKLQogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KQEAgLTM0LDYgKzMyLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IERhdGFTb3VyY2VSZWFkZXIgOiBwdWJsaWMgbWt2cGFyc2VyOjpJTWt2UmVhZGVyIHsKQEAgLTg4LDcgKzg4LDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIHN0cnVjdCBCbG9ja0l0ZXJhdG9yIHsKLSAgICBCbG9ja0l0ZXJhdG9yKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0pOworICAgIEJsb2NrSXRlcmF0b3IoTWF0cm9za2FFeHRyYWN0b3IgKmV4dHJhY3RvciwgdW5zaWduZWQgbG9uZyB0cmFja051bSwgdW5zaWduZWQgbG9uZyBpbmRleCk7CiAKICAgICBib29sIGVvcygpIGNvbnN0OwogCkBAIC0xMDQsNyArMTA0LDggQEAKIAogcHJpdmF0ZToKICAgICBNYXRyb3NrYUV4dHJhY3RvciAqbUV4dHJhY3RvcjsKLSAgICB1bnNpZ25lZCBsb25nIG1UcmFja051bTsKKyAgICBsb25nIGxvbmcgbVRyYWNrTnVtOworICAgIHVuc2lnbmVkIGxvbmcgbUluZGV4OwogCiAgICAgY29uc3QgbWt2cGFyc2VyOjpDbHVzdGVyICptQ2x1c3RlcjsKICAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrRW50cnkgKm1CbG9ja0VudHJ5OwpAQCAtMTU2LDYgKzE1Nyw1MyBAQAogICAgIE1hdHJvc2thU291cmNlICZvcGVyYXRvcj0oY29uc3QgTWF0cm9za2FTb3VyY2UgJik7CiB9OwogCitjb25zdCBta3ZwYXJzZXI6OlRyYWNrKiBNYXRyb3NrYUV4dHJhY3Rvcjo6VHJhY2tJbmZvOjpnZXRUcmFjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUV4dHJhY3Rvci0+bVNlZ21lbnQtPkdldFRyYWNrcygpLT5HZXRUcmFja0J5TnVtYmVyKG1UcmFja051bSk7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gZG9lcyBleGFjdGx5IHRoZSBzYW1lIGFzIG1rdnBhcnNlcjo6Q3Vlczo6RmluZCwgZXhjZXB0IHRoYXQgaXQKKy8vIHNlYXJjaGVzIGluIG91ciBvd24gdHJhY2sgYmFzZWQgdmVjdG9ycy4gV2Ugc2hvdWxkIG5vdCBuZWVkIHRoaXMgb25jZSBta3ZwYXJzZXIKKy8vIGFkZHMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eS4KK2NvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQ6OlRyYWNrUG9zaXRpb24gKk1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm86OmZpbmQoCisgICAgICAgIGxvbmcgbG9uZyB0aW1lTnMpIGNvbnN0IHsKKyAgICBBTE9HVigibUN1ZVBvaW50cy5zaXplICV6dSIsIG1DdWVQb2ludHMuc2l6ZSgpKTsKKyAgICBpZiAobUN1ZVBvaW50cy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqIGNwID0gbUN1ZVBvaW50cy5pdGVtQXQoMCk7CisgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayogdHJhY2sgPSBnZXRUcmFjaygpOworICAgIGlmICh0aW1lTnMgPD0gY3AtPkdldFRpbWUobUV4dHJhY3Rvci0+bVNlZ21lbnQpKSB7CisgICAgICAgIHJldHVybiBjcC0+RmluZCh0cmFjayk7CisgICAgfQorCisgICAgLy8gQmluYXJ5IHNlYXJjaGVzIHRocm91Z2ggcmVsZXZhbnQgY3VlczsgYXNzdW1lcyBjdWVzIGFyZSBvcmRlcmVkIGJ5IHRpbWVjb2RlLgorICAgIC8vIElmIHdlIGRvIGRldGVjdCBvdXQtb2Ytb3JkZXIgY3VlcywgcmV0dXJuIE5VTEwuCisgICAgc2l6ZV90IGxvID0gMDsKKyAgICBzaXplX3QgaGkgPSBtQ3VlUG9pbnRzLnNpemUoKTsKKyAgICB3aGlsZSAobG8gPCBoaSkgeworICAgICAgICBjb25zdCBzaXplX3QgbWlkID0gbG8gKyAoaGkgLSBsbykgLyAyOworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50KiBjb25zdCBtaWRDcCA9IG1DdWVQb2ludHMuaXRlbUF0KG1pZCk7CisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBjdWVUaW1lTnMgPSBtaWRDcC0+R2V0VGltZShtRXh0cmFjdG9yLT5tU2VnbWVudCk7CisgICAgICAgIGlmIChjdWVUaW1lTnMgPD0gdGltZU5zKSB7CisgICAgICAgICAgICBsbyA9IG1pZCArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoaSA9IG1pZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsbyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNwID0gbUN1ZVBvaW50cy5pdGVtQXQobG8gLSAxKTsKKyAgICBpZiAoY3AtPkdldFRpbWUobUV4dHJhY3Rvci0+bVNlZ21lbnQpID4gdGltZU5zKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBjcC0+RmluZCh0cmFjayk7Cit9CisKIE1hdHJvc2thU291cmNlOjpNYXRyb3NrYVNvdXJjZSgKICAgICAgICAgY29uc3Qgc3A8TWF0cm9za2FFeHRyYWN0b3I+ICZleHRyYWN0b3IsIHNpemVfdCBpbmRleCkKICAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKQEAgLTE2Myw3ICsyMTEsOCBAQAogICAgICAgbVR5cGUoT1RIRVIpLAogICAgICAgbUlzQXVkaW8oZmFsc2UpLAogICAgICAgbUJsb2NrSXRlcihtRXh0cmFjdG9yLmdldCgpLAotICAgICAgICAgICAgICAgICBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChpbmRleCkubVRyYWNrTnVtKSwKKyAgICAgICAgICAgICAgICAgbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1UcmFja051bSwKKyAgICAgICAgICAgICAgICAgaW5kZXgpLAogICAgICAgbU5BTFNpemVMZW4oMCkgewogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1NZXRhOwogCkBAIC0xODQsNyArMjMzLDcgQEAKICAgICAgICAgQ0hFQ0tfR0UoYXZjY1NpemUsIDV1KTsKIAogICAgICAgICBtTkFMU2l6ZUxlbiA9IDEgKyAoYXZjY1s0XSAmIDMpOwotICAgICAgICBBTE9HVigibU5BTFNpemVMZW4gPSAlZCIsIG1OQUxTaXplTGVuKTsKKyAgICAgICAgQUxPR1YoIm1OQUxTaXplTGVuID0gJXp1IiwgbU5BTFNpemVMZW4pOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewogICAgICAgICBtVHlwZSA9IEFBQzsKICAgICB9CkBAIC0xOTQsNyArMjQzLDcgQEAKICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IE1hdHJvc2thU291cmNlOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIG1CbG9ja0l0ZXIucmVzZXQoKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTIxMyw5ICsyNjIsMTAgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIEJsb2NrSXRlcmF0b3I6OkJsb2NrSXRlcmF0b3IoCi0gICAgICAgIE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0pCisgICAgICAgIE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgpCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCiAgICAgICBtVHJhY2tOdW0odHJhY2tOdW0pLAorICAgICAgbUluZGV4KGluZGV4KSwKICAgICAgIG1DbHVzdGVyKE5VTEwpLAogICAgICAgbUJsb2NrRW50cnkoTlVMTCksCiAgICAgICBtQmxvY2tFbnRyeUluZGV4KDApIHsKQEAgLTMxNCwxNCArMzY0LDE0IEBACiAKICAgICAqYWN0dWFsRnJhbWVUaW1lVXMgPSAtMWxsOwogCi0gICAgY29uc3QgaW50NjRfdCBzZWVrVGltZU5zID0gc2Vla1RpbWVVcyAqIDEwMDBsbDsKKyAgICBjb25zdCBpbnQ2NF90IHNlZWtUaW1lTnMgPSBzZWVrVGltZVVzICogMTAwMGxsIC0gbUV4dHJhY3Rvci0+bVNlZWtQcmVSb2xsTnM7CiAKICAgICBta3ZwYXJzZXI6OlNlZ21lbnQqIGNvbnN0IHBTZWdtZW50ID0gbUV4dHJhY3Rvci0+bVNlZ21lbnQ7CiAKICAgICAvLyBTcGVjaWFsIGNhc2UgdGhlIDAgc2VlayB0byBhdm9pZCBsb2FkaW5nIEN1ZXMgd2hlbiB0aGUgYXBwbGljYXRpb24KICAgICAvLyBleHRyYW5lb3VzbHkgc2Vla3MgdG8gMCBiZWZvcmUgcGxheWluZy4KICAgICBpZiAoc2Vla1RpbWVOcyA8PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJTZWVrIHRvIGJlZ2lubmluZzogJWxsZCIsIHNlZWtUaW1lVXMpOworICAgICAgICBBTE9HVigiU2VlayB0byBiZWdpbm5pbmc6ICUiIFBSSWQ2NCwgc2Vla1RpbWVVcyk7CiAgICAgICAgIG1DbHVzdGVyID0gcFNlZ21lbnQtPkdldEZpcnN0KCk7CiAgICAgICAgIG1CbG9ja0VudHJ5SW5kZXggPSAwOwogICAgICAgICBkbyB7CkBAIC0zMzAsNyArMzgwLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEFMT0dWKCJTZWVraW5nIHRvOiAlbGxkIiwgc2Vla1RpbWVVcyk7CisgICAgQUxPR1YoIlNlZWtpbmcgdG86ICUiIFBSSWQ2NCwgc2Vla1RpbWVVcyk7CiAKICAgICAvLyBJZiB0aGUgQ3VlcyBoYXZlIG5vdCBiZWVuIGxvY2F0ZWQgdGhlbiBmaW5kIHRoZW0uCiAgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVzKiBwQ3VlcyA9IHBTZWdtZW50LT5HZXRDdWVzKCk7CkBAIC0zNjMsOSArNDEzLDIwIEBACiAgICAgfQogCiAgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCogcENQOworICAgIG1rdnBhcnNlcjo6VHJhY2tzIGNvbnN0ICpwVHJhY2tzID0gcFNlZ21lbnQtPkdldFRyYWNrcygpOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHRyYWNrQ291bnQgPSBwVHJhY2tzLT5HZXRUcmFja3NDb3VudCgpOwogICAgIHdoaWxlICghcEN1ZXMtPkRvbmVQYXJzaW5nKCkpIHsKICAgICAgICAgcEN1ZXMtPkxvYWRDdWVQb2ludCgpOwogICAgICAgICBwQ1AgPSBwQ3Vlcy0+R2V0TGFzdCgpOworICAgICAgICBDSEVDSyhwQ1ApOworCisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCB0cmFja0NvdW50OyArK2luZGV4KSB7CisgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICpwVHJhY2sgPSBwVHJhY2tzLT5HZXRUcmFja0J5SW5kZXgoaW5kZXgpOworICAgICAgICAgICAgaWYgKHBUcmFjayAmJiBwVHJhY2stPkdldFR5cGUoKSA9PSAxICYmIHBDUC0+RmluZChwVHJhY2spKSB7IC8vIFZJREVPX1RSQUNLCisgICAgICAgICAgICAgICAgTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbyYgdHJhY2sgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIHRyYWNrLm1DdWVQb2ludHMucHVzaF9iYWNrKHBDUCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBpZiAocENQLT5HZXRUaW1lKHBTZWdtZW50KSA+PSBzZWVrVGltZU5zKSB7CiAgICAgICAgICAgICBBTE9HVigiUGFyc2VkIHBhc3QgcmVsZXZhbnQgQ3VlIik7CkBAIC0zNzMsMjIgKzQzNCwyNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gVGhlIEN1ZSBpbmRleCBpcyBidWlsdCBhcm91bmQgdmlkZW8ga2V5ZnJhbWVzCi0gICAgbWt2cGFyc2VyOjpUcmFja3MgY29uc3QgKnBUcmFja3MgPSBwU2VnbWVudC0+R2V0VHJhY2tzKCk7Ci0gICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqcFRyYWNrID0gTlVMTDsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcFRyYWNrcy0+R2V0VHJhY2tzQ291bnQoKTsgKytpbmRleCkgewotICAgICAgICBwVHJhY2sgPSBwVHJhY2tzLT5HZXRUcmFja0J5SW5kZXgoaW5kZXgpOwotICAgICAgICBpZiAocFRyYWNrICYmIHBUcmFjay0+R2V0VHlwZSgpID09IDEpIHsgLy8gVklERU9fVFJBQ0sKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlbyB0cmFjayBsb2NhdGVkIGF0ICVkIiwgaW5kZXgpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqcFRQID0gTlVMTDsKKyAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0aGlzVHJhY2sgPSBwVHJhY2tzLT5HZXRUcmFja0J5SW5kZXgobUluZGV4KTsKKyAgICBpZiAodGhpc1RyYWNrLT5HZXRUeXBlKCkgPT0gMSkgeyAvLyB2aWRlbworICAgICAgICBNYXRyb3NrYUV4dHJhY3Rvcjo6VHJhY2tJbmZvJiB0cmFjayA9IG1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChtSW5kZXgpOworICAgICAgICBwVFAgPSB0cmFjay5maW5kKHNlZWtUaW1lTnMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZSBDdWUgaW5kZXggaXMgYnVpbHQgYXJvdW5kIHZpZGVvIGtleWZyYW1lcworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2tDb3VudDsgKytpbmRleCkgeworICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqcFRyYWNrID0gcFRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChwVHJhY2sgJiYgcFRyYWNrLT5HZXRUeXBlKCkgPT0gMSAmJiBwQ3Vlcy0+RmluZChzZWVrVGltZU5zLCBwVHJhY2ssIHBDUCwgcFRQKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlbyB0cmFjayBsb2NhdGVkIGF0ICV6dSIsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorCiAgICAgLy8gQWx3YXlzICpzZWFyY2gqIGJhc2VkIG9uIHRoZSB2aWRlbyB0cmFjaywgYnV0IGZpbmFsaXplIGJhc2VkIG9uIG1UcmFja051bQotICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQ6OlRyYWNrUG9zaXRpb24qIHBUUDsKLSAgICBpZiAocFRyYWNrICYmIHBUcmFjay0+R2V0VHlwZSgpID09IDEpIHsKLSAgICAgICAgcEN1ZXMtPkZpbmQoc2Vla1RpbWVOcywgcFRyYWNrLCBwQ1AsIHBUUCk7Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoIXBUUCkgewogICAgICAgICBBTE9HRSgiRGlkIG5vdCBsb2NhdGUgdGhlIHZpZGVvIHRyYWNrIGZvciBzZWVraW5nIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC00MDksMTAgKzQ3MywxMyBAQAogCiAgICAgICAgIGlmIChpc0F1ZGlvIHx8IGJsb2NrKCktPklzS2V5KCkpIHsKICAgICAgICAgICAgIC8vIEFjY2VwdCB0aGUgZmlyc3Qga2V5IGZyYW1lCi0gICAgICAgICAgICAqYWN0dWFsRnJhbWVUaW1lVXMgPSAoYmxvY2soKS0+R2V0VGltZShtQ2x1c3RlcikgKyA1MDBMTCkgLyAxMDAwTEw7Ci0gICAgICAgICAgICBBTE9HVigiUmVxdWVzdGVkIHNlZWsgcG9pbnQ6ICVsbGQgYWN0dWFsOiAlbGxkIiwKLSAgICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMsIGFjdHVhbEZyYW1lVGltZVVzKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcyA9IChibG9jaygpLT5HZXRUaW1lKG1DbHVzdGVyKSArIDUwMExMKSAvIDEwMDBMTDsKKyAgICAgICAgICAgIGlmICh0aGlzVHJhY2stPkdldFR5cGUoKSA9PSAxIHx8IGZyYW1lVGltZVVzID49IHNlZWtUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAqYWN0dWFsRnJhbWVUaW1lVXMgPSBmcmFtZVRpbWVVczsKKyAgICAgICAgICAgICAgICBBTE9HVigiUmVxdWVzdGVkIHNlZWsgcG9pbnQ6ICUiIFBSSWQ2NCAiIGFjdHVhbDogJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMsICphY3R1YWxGcmFtZVRpbWVVcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC02MzQsNyArNzAxLDggQEAKICAgICAgIG1SZWFkZXIobmV3IERhdGFTb3VyY2VSZWFkZXIobURhdGFTb3VyY2UpKSwKICAgICAgIG1TZWdtZW50KE5VTEwpLAogICAgICAgbUV4dHJhY3RlZFRodW1ibmFpbHMoZmFsc2UpLAotICAgICAgbUlzV2VibShmYWxzZSkgeworICAgICAgbUlzV2VibShmYWxzZSksCisgICAgICBtU2Vla1ByZVJvbGxOcygwKSB7CiAgICAgb2ZmNjRfdCBzaXplOwogICAgIG1Jc0xpdmVTdHJlYW1pbmcgPQogICAgICAgICAobURhdGFTb3VyY2UtPmZsYWdzKCkKQEAgLTY2MCwxNCArNzI4LDIyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICAvLyBmcm9tIG1rdnBhcnNlcjo6U2VnbWVudDo6TG9hZCgpLCBidXQgc3RvcCBhdCBmaXJzdCBjbHVzdGVyCiAgICAgcmV0ID0gbVNlZ21lbnQtPlBhcnNlSGVhZGVycygpOwotICAgIENIRUNLX0VRKHJldCwgMCk7Ci0KLSAgICBsb25nIGxlbjsKLSAgICByZXQgPSBtU2VnbWVudC0+TG9hZENsdXN0ZXIocG9zLCBsZW4pOwotICAgIENIRUNLX0VRKHJldCwgMCk7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIGxvbmcgbGVuOworICAgICAgICByZXQgPSBtU2VnbWVudC0+TG9hZENsdXN0ZXIocG9zLCBsZW4pOworICAgICAgICBpZiAocmV0ID49IDEpIHsKKyAgICAgICAgICAgIC8vIG5vIG1vcmUgY2x1c3RlcnMKKyAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKKyAgICAgICAgcmV0ID0gbWt2cGFyc2VyOjpFX0JVRkZFUl9OT1RfRlVMTDsKKyAgICB9CiAKICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBBTE9HVygiQ29ycnVwdCAlcyBzb3VyY2U6ICVzIiwgbUlzV2VibSA/ICJ3ZWJtIiA6ICJtYXRyb3NrYSIsCisgICAgICAgICAgICAgICAgdXJpRGVidWdTdHJpbmcobURhdGFTb3VyY2UtPmdldFVyaSgpKS5jX3N0cigpKTsKICAgICAgICAgZGVsZXRlIG1TZWdtZW50OwogICAgICAgICBtU2VnbWVudCA9IE5VTEw7CiAgICAgICAgIHJldHVybjsKQEAgLTkzOCw2ICsxMDE0LDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkVm9yYmlzQ29kZWNJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX09QVVMiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlPcHVzQ29kZWNEZWxheSwgdHJhY2stPkdldENvZGVjRGVsYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlPcHVzU2Vla1ByZVJvbGwsIHRyYWNrLT5HZXRTZWVrUHJlUm9sbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsTnMgPSB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfTVBFRy9MMyIsIGNvZGVjSUQpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtOTY2LDYgKzEwNDgsNyBAQAogICAgICAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQobVRyYWNrcy5zaXplKCkgLSAxKTsKICAgICAgICAgdHJhY2tJbmZvLT5tVHJhY2tOdW0gPSB0cmFjay0+R2V0TnVtYmVyKCk7CiAgICAgICAgIHRyYWNrSW5mby0+bU1ldGEgPSBtZXRhOworICAgICAgICB0cmFja0luZm8tPm1FeHRyYWN0b3IgPSB0aGlzOwogICAgIH0KIH0KIApAQCAtOTgwLDcgKzEwNjMsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBCbG9ja0l0ZXJhdG9yIGl0ZXIodGhpcywgaW5mby0+bVRyYWNrTnVtKTsKKyAgICAgICAgQmxvY2tJdGVyYXRvciBpdGVyKHRoaXMsIGluZm8tPm1UcmFja051bSwgaSk7CiAgICAgICAgIGludDMyX3QgaiA9IDA7CiAgICAgICAgIGludDY0X3QgdGh1bWJuYWlsVGltZVVzID0gMDsKICAgICAgICAgc2l6ZV90IG1heEJsb2NrU2l6ZSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaAppbmRleCAxMjk0YjRmLi5kYjM2YmY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgKQEAgLTE4LDE0ICsxOCwxMiBAQAogCiAjZGVmaW5lIE1BVFJPU0tBX0VYVFJBQ1RPUl9IXwogCisjaW5jbHVkZSAibWt2cGFyc2VyLmhwcCIKKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCi1uYW1lc3BhY2UgbWt2cGFyc2VyIHsKLXN0cnVjdCBTZWdtZW50OwotfTsKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CkBAIC01OCw2ICs1NiwxMSBAQAogICAgIHN0cnVjdCBUcmFja0luZm8gewogICAgICAgICB1bnNpZ25lZCBsb25nIG1UcmFja051bTsKICAgICAgICAgc3A8TWV0YURhdGE+IG1NZXRhOworICAgICAgICBjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAqbUV4dHJhY3RvcjsKKyAgICAgICAgVmVjdG9yPGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqPiBtQ3VlUG9pbnRzOworCisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sqIGdldFRyYWNrKCkgY29uc3Q7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQ6OlRyYWNrUG9zaXRpb24gKmZpbmQobG9uZyBsb25nIHRpbWVOcykgY29uc3Q7CiAgICAgfTsKIAogICAgIE11dGV4IG1Mb2NrOwpAQCAtNjksNiArNzIsNyBAQAogICAgIGJvb2wgbUV4dHJhY3RlZFRodW1ibmFpbHM7CiAgICAgYm9vbCBtSXNMaXZlU3RyZWFtaW5nOwogICAgIGJvb2wgbUlzV2VibTsKKyAgICBpbnQ2NF90IG1TZWVrUHJlUm9sbE5zOwogCiAgICAgdm9pZCBhZGRUcmFja3MoKTsKICAgICB2b2lkIGZpbmRUaHVtYm5haWxzKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvRnJhZ21lbnRlZE1QNFBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvRnJhZ21lbnRlZE1QNFBhcnNlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMDI2NTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L0ZyYWdtZW50ZWRNUDRQYXJzZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTk5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJGcmFnbWVudGVkTVA0UGFyc2VyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0ZyYWdtZW50ZWRNUDRQYXJzZXIuaCIKLSNpbmNsdWRlICJUcmFja0ZyYWdtZW50LmgiCi0KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpGb3VyY2MyU3RyaW5nKHVpbnQzMl90IGZvdXJjYykgewotICAgIHN0YXRpYyBjaGFyIGJ1ZmZlcls1XTsKLSAgICBidWZmZXJbNF0gPSAnXDAnOwotICAgIGJ1ZmZlclswXSA9IGZvdXJjYyA+PiAyNDsKLSAgICBidWZmZXJbMV0gPSAoZm91cmNjID4+IDE2KSAmIDB4ZmY7Ci0gICAgYnVmZmVyWzJdID0gKGZvdXJjYyA+PiA4KSAmIDB4ZmY7Ci0gICAgYnVmZmVyWzNdID0gZm91cmNjICYgMHhmZjsKLQotICAgIHJldHVybiBidWZmZXI7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpJbmRlbnRTdHJpbmcoc2l6ZV90IG4pIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBrU3BhY2VbXSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOwotICAgIHJldHVybiBrU3BhY2UgKyBzaXplb2Yoa1NwYWNlKSAtIDIgKiBuIC0gMTsKLX0KLQotLy8gc3RhdGljCi1jb25zdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEaXNwYXRjaEVudHJ5IEZyYWdtZW50ZWRNUDRQYXJzZXI6OmtEaXNwYXRjaFRhYmxlW10gPSB7Ci0gICAgeyBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSwgMCwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJyksIEZPVVJDQygnbScsICdvJywgJ28nLCAndicpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ3UnLCAnZCcsICd0JywgJ2EnKSwgRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygndScsICdkJywgJ3QnLCAnYScpLCBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJyksIEZPVVJDQygndScsICdkJywgJ3QnLCAnYScpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ2knLCAnbCcsICdzJywgJ3QnKSwgRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJyksIE5VTEwgfSwKLQotICAgIHsgRk9VUkNDKCd0JywgJ2snLCAnaCcsICdkJyksIEZPVVJDQygndCcsICdyJywgJ2EnLCAnaycpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0hlYWRlcgotICAgIH0sCi0KLSAgICB7IEZPVVJDQygnbScsICd2JywgJ2UnLCAneCcpLCBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSwgTlVMTCB9LAotCi0gICAgeyBGT1VSQ0MoJ3QnLCAncicsICdlJywgJ3gnKSwgRk9VUkNDKCdtJywgJ3YnLCAnZScsICd4JyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrRXh0ZW5kcwotICAgIH0sCi0KLSAgICB7IEZPVVJDQygnZScsICdkJywgJ3QnLCAncycpLCBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCdtJywgJ2QnLCAnaScsICdhJyksIEZPVVJDQygndCcsICdyJywgJ2EnLCAnaycpLCBOVUxMIH0sCi0KLSAgICB7IEZPVVJDQygnbScsICdkJywgJ2gnLCAnZCcpLCBGT1VSQ0MoJ20nLCAnZCcsICdpJywgJ2EnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlTWVkaWFIZWFkZXIKLSAgICB9LAotCi0gICAgeyBGT1VSQ0MoJ2gnLCAnZCcsICdsJywgJ3InKSwgRk9VUkNDKCdtJywgJ2QnLCAnaScsICdhJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZU1lZGlhSGFuZGxlcgotICAgIH0sCi0KLSAgICB7IEZPVVJDQygnbScsICdpJywgJ24nLCAnZicpLCBGT1VSQ0MoJ20nLCAnZCcsICdpJywgJ2EnKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCdkJywgJ2knLCAnbicsICdmJyksIEZPVVJDQygnbScsICdpJywgJ24nLCAnZicpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwgRk9VUkNDKCdtJywgJ2knLCAnbicsICdmJyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygncycsICd0JywgJ3MnLCAnZCcpLCBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwgTlVMTCB9LAotCi0gICAgeyBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ3onKSwgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVNhbXBsZVNpemVzIH0sCi0KLSAgICB7IEZPVVJDQygncycsICd0JywgJ3onLCAnMicpLCBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQ29tcGFjdFNhbXBsZVNpemVzIH0sCi0KLSAgICB7IEZPVVJDQygncycsICd0JywgJ3MnLCAnYycpLCBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlU2FtcGxlVG9DaHVuayB9LAotCi0gICAgeyBGT1VSQ0MoJ3MnLCAndCcsICdjJywgJ28nKSwgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUNodW5rT2Zmc2V0cyB9LAotCi0gICAgeyBGT1VSQ0MoJ2MnLCAnbycsICc2JywgJzQnKSwgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUNodW5rT2Zmc2V0czY0IH0sCi0KLSAgICB7IEZPVVJDQygnYScsICd2JywgJ2MnLCAnQycpLCBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEgfSwKLQotICAgIHsgRk9VUkNDKCdlJywgJ3MnLCAnZCcsICdzJyksIEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VFU0RTQ29kZWNTcGVjaWZpY0RhdGEgfSwKLQotICAgIHsgRk9VUkNDKCdlJywgJ3MnLCAnZCcsICdzJyksIEZPVVJDQygnbScsICdwJywgJzQnLCAndicpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VFU0RTQ29kZWNTcGVjaWZpY0RhdGEgfSwKLQotICAgIHsgRk9VUkNDKCdtJywgJ2QnLCAnYScsICd0JyksIDAsICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZU1lZGlhRGF0YSB9LAotCi0gICAgeyBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSwgMCwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCd0JywgJ3InLCAnYScsICdmJyksIEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpLCBOVUxMIH0sCi0KLSAgICB7IEZPVVJDQygndCcsICdmJywgJ2gnLCAnZCcpLCBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcgotICAgIH0sCi0gICAgeyBGT1VSQ0MoJ3QnLCAncicsICd1JywgJ24nKSwgRk9VUkNDKCd0JywgJ3InLCAnYScsICdmJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4KLSAgICB9LAotCi0gICAgeyBGT1VSQ0MoJ20nLCAnZicsICdyJywgJ2EnKSwgMCwgTlVMTCB9LAotCi0gICAgeyBGT1VSQ0MoJ3MnLCAnaScsICdkJywgJ3gnKSwgMCwgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlU2VnbWVudEluZGV4IH0sCi19OwotCi1zdHJ1Y3QgRmlsZVNvdXJjZSA6IHB1YmxpYyBGcmFnbWVudGVkTVA0UGFyc2VyOjpTb3VyY2UgewotICAgIEZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCi0gICAgICAgIDogbUZpbGUoZm9wZW4oZmlsZW5hbWUsICJyYiIpKSB7Ci0gICAgICAgICAgICBDSEVDSyhtRmlsZSAhPSBOVUxMKTsKLSAgICAgICAgfQotCi0gICAgdmlydHVhbCB+RmlsZVNvdXJjZSgpIHsKLSAgICAgICAgZmNsb3NlKG1GaWxlKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBmc2VlayhtRmlsZSwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgIHJldHVybiBmcmVhZChkYXRhLCAxLCBzaXplLCBtRmlsZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGlzU2Vla2FibGUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgRklMRSAqbUZpbGU7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWxlU291cmNlKTsKLX07Ci0KLXN0cnVjdCBSZWFkVHJhY2tlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBSZWFkVHJhY2tlcihvZmY2NF90IHNpemUpIHsKLSAgICAgICAgYWxsb2NTaXplID0gMSArIHNpemUgLyA4MTkyOyAvLyAxIGJpdCBwZXIga2lsb2J5dGUKLSAgICAgICAgYml0bWFwID0gKGNoYXIqKSBjYWxsb2MoMSwgYWxsb2NTaXplKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+UmVhZFRyYWNrZXIoKSB7Ci0gICAgICAgIGR1bXBUb0xvZygpOwotICAgICAgICBmcmVlKGJpdG1hcCk7Ci0gICAgfQotICAgIHZvaWQgbWFyayhvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgaW50IGZpcnN0Yml0ID0gb2Zmc2V0IC8gMTAyNDsKLSAgICAgICAgaW50IGxhc3RiaXQgPSAob2Zmc2V0ICsgc2l6ZSAtIDEpIC8gMTAyNDsKLSAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0Yml0OyBpIDw9IGxhc3RiaXQ7IGkrKykgewotICAgICAgICAgICAgYml0bWFwW2kvOF0gfD0gKDB4ODAgPj4gKGkgJiA3KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSBwcml2YXRlOgotICAgIHZvaWQgZHVtcFRvTG9nKCkgewotICAgICAgICAvLyA5NiBjaGFycyBwZXIgbGluZSwgZWFjaCBjaGFyIHJlcHJlc2VudHMgb25lIGtpbG9ieXRlLCAxIGtiIHBlciBiaXQKLSAgICAgICAgaW50IG51bWxpbmVzID0gYWxsb2NTaXplIC8gMTI7Ci0gICAgICAgIGNoYXIgYnVmWzk3XTsKLSAgICAgICAgY2hhciAqY3VyID0gYml0bWFwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWxpbmVzOyBpKysgJiYgY3VyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEyOyBqKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBidWZbKGogKiA4KSArIGtdID0gKCpjdXIgJiAoMHg4MCA+PiBrKSkgPyAnWCcgOiAnLic7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1cisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmWzk2XSA9ICdcMCc7Ci0gICAgICAgICAgICBBTE9HSSgiJTVkazogJXMiLCBpICogOTYsIGJ1Zik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzaXplX3QgYWxsb2NTaXplOwotICAgIGNoYXIgKmJpdG1hcDsKLX07Ci0KLXN0cnVjdCBEYXRhU291cmNlU291cmNlIDogcHVibGljIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlNvdXJjZSB7Ci0gICAgRGF0YVNvdXJjZVNvdXJjZShzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSkgewotICAgICAgICAgICAgQ0hFQ0sobURhdGFTb3VyY2UgIT0gTlVMTCk7Ci0jaWYgMAotICAgICAgICAgICAgb2ZmNjRfdCBzaXplOwotICAgICAgICAgICAgaWYgKHNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBtUmVhZFRyYWNrZXIgPSBuZXcgUmVhZFRyYWNrZXIoc2l6ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBnZXQgZGF0YSBzb3VyY2Ugc2l6ZSIpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgIGlmIChtUmVhZFRyYWNrZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbVJlYWRUcmFja2VyLT5tYXJrKG9mZnNldCwgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTZWVrYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBzcDxSZWFkVHJhY2tlcj4gbVJlYWRUcmFja2VyOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGF0YVNvdXJjZVNvdXJjZSk7Ci19OwotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjpGcmFnbWVudGVkTVA0UGFyc2VyKCkKLSAgICA6IG1CdWZmZXJQb3MoMCksCi0gICAgICBtU3VzcGVuZGVkKGZhbHNlKSwKLSAgICAgIG1Eb25lV2l0aE1vb3YoZmFsc2UpLAotICAgICAgbUZpcnN0TW9vZk9mZnNldCgwKSwKLSAgICAgIG1GaW5hbFJlc3VsdChPSykgewotfQotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjp+RnJhZ21lbnRlZE1QNFBhcnNlcigpIHsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpzdGFydChjb25zdCBjaGFyICpmaWxlbmFtZSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7Ci0gICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBGaWxlU291cmNlKGZpbGVuYW1lKSk7Ci0gICAgbXNnLT5wb3N0KCk7Ci0gICAgQUxPR1YoIlBhcnNlcjo6c3RhcnQoJXMpIiwgZmlsZW5hbWUpOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OnN0YXJ0KGNvbnN0IHNwPFNvdXJjZT4gJnNvdXJjZSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7Ci0gICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7Ci0gICAgbXNnLT5wb3N0KCk7Ci0gICAgQUxPR1YoIlBhcnNlcjo6c3RhcnQoU291cmNlKSIpOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OnN0YXJ0KHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpOwotICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBuZXcgRGF0YVNvdXJjZVNvdXJjZShzb3VyY2UpKTsKLSAgICBtc2ctPnBvc3QoKTsKLSAgICBBTE9HVigiUGFyc2VyOjpzdGFydChEYXRhU291cmNlKSIpOwotfQotCi1zcDxBTWVzc2FnZT4gRnJhZ21lbnRlZE1QNFBhcnNlcjo6Z2V0Rm9ybWF0KGJvb2wgYXVkaW8sIGJvb2wgc3luY2hyb25vdXMpIHsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGJvb2wgbW9vdkRvbmUgPSBtRG9uZVdpdGhNb292OwotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0Rm9ybWF0LCBpZCgpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigiYXVkaW8iLCBhdWRpbyk7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1YoImdldEZvcm1hdCBwb3N0IGZhaWxlZDogJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikgJiYgZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBpZiAoc3luY2hyb25vdXMgJiYgZXJyID09IC1FV09VTERCTE9DSyAmJiAhbW9vdkRvbmUpIHsKLSAgICAgICAgICAgICAgICByZXN1bWVJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJAZ2V0Rm9ybWF0IHBhcnNlciBub3QgcmVhZHkgeWV0LCByZXRyeWluZyIpOwotICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwMCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiZ2V0Rm9ybWF0IGZhaWxlZDogJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OwotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKLQotICAgICAgICBBTE9HVigicmV0dXJuaW5nIGZvcm1hdCAlcyIsIGZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIGZvcm1hdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnNlZWtUbyhib29sIHdhbnRBdWRpbywgaW50NjRfdCB0aW1lVXMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vla1RvLCBpZCgpKTsKLSAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIHdhbnRBdWRpbyk7Ci0gICAgbXNnLT5zZXRJbnQ2NCgicG9zaXRpb24iLCB0aW1lVXMpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1ib29sIEZyYWdtZW50ZWRNUDRQYXJzZXI6OmlzU2Vla2FibGUoKSBjb25zdCB7Ci0gICAgd2hpbGUgKG1GaXJzdE1vb2ZPZmZzZXQgPT0gMCAmJiBtRmluYWxSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgdXNsZWVwKDEwMDAwKTsKLSAgICB9Ci0gICAgYm9vbCBzZWVrYWJsZSA9IG1Tb3VyY2UtPmlzU2Vla2FibGUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgc2Vla2FibGUgJiYgaSA8IG1UcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3QgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgc2Vla2FibGUgJj0gIWluZm8tPm1TaWR4LmVtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBzZWVrYWJsZTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6b25TZWVrVG8oYm9vbCB3YW50QXVkaW8sIGludDY0X3QgcG9zaXRpb24pIHsKLSAgICBzdGF0dXNfdCBlcnIgPSAtRUlOVkFMOwotICAgIHNzaXplX3QgdHJhY2tJbmRleCA9IGZpbmRUcmFjayh3YW50QXVkaW8pOwotICAgIGlmICh0cmFja0luZGV4IDwgMCkgewotICAgICAgICBlcnIgPSB0cmFja0luZGV4OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRWYWx1ZUF0KHRyYWNrSW5kZXgpOwotCi0gICAgICAgIGludCBudW1TaWR4RW50cmllcyA9IGluZm8tPm1TaWR4LnNpemUoKTsKLSAgICAgICAgaW50NjRfdCB0b3RhbFRpbWUgPSAwOwotICAgICAgICBvZmZfdCB0b3RhbE9mZnNldCA9IG1GaXJzdE1vb2ZPZmZzZXQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2lkeEVudHJpZXM7IGkrKykgewotICAgICAgICAgICAgY29uc3QgU2lkeEVudHJ5ICpzZSA9ICZpbmZvLT5tU2lkeFtpXTsKLSAgICAgICAgICAgIGlmICh0b3RhbFRpbWUgKyBzZS0+bUR1cmF0aW9uVXMgPiBwb3NpdGlvbikgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsMCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlclBvcyA9IHRvdGFsT2Zmc2V0OwotICAgICAgICAgICAgICAgIGlmIChtRmluYWxSZXN1bHQgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICBtRmluYWxSZXN1bHQgPSBPSzsKLSAgICAgICAgICAgICAgICAgICAgbVN1c3BlbmRlZCA9IHRydWU7IC8vIGZvcmNlIHJlc3VtZQotICAgICAgICAgICAgICAgICAgICByZXN1bWVJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmZvLT5tRnJhZ21lbnRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgaW5mby0+bURlY29kaW5nVGltZSA9IHRvdGFsVGltZSAqIGluZm8tPm1NZWRpYVRpbWVTY2FsZSAvIDEwMDAwMDBsbDsKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0b3RhbFRpbWUgKz0gc2UtPm1EdXJhdGlvblVzOwotICAgICAgICAgICAgdG90YWxPZmZzZXQgKz0gc2UtPm1TaXplOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCJzZWVrVG8gb3V0IG9mIHJhbmdlIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6ZGVxdWV1ZUFjY2Vzc1VuaXQoYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5bmNocm9ub3VzKSB7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGVxdWV1ZUFjY2Vzc1VuaXQsIGlkKCkpOwotICAgICAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIGF1ZGlvKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HVigiZGVxdWV1ZSBmYWlsIDE6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikgJiYgZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBpZiAoc3luY2hyb25vdXMgJiYgZXJyID09IC1FV09VTERCTE9DSykgewotICAgICAgICAgICAgICAgIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlBhcnNlciBub3QgcmVhZHkgeWV0LCByZXRyeWluZyIpOwotICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwMCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiZGVxdWV1ZSBmYWlsIDI6ICVkLCAlZCIsIGVyciwgc3luY2hyb25vdXMpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kQnVmZmVyKCJhY2Nlc3NVbml0IiwgYWNjZXNzVW5pdCkpOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci19Ci0KLXNzaXplX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6ZmluZFRyYWNrKGJvb2wgd2FudEF1ZGlvKSBjb25zdCB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgYm9vbCBpc0F1ZGlvID0KLSAgICAgICAgICAgIGluZm8tPm1NZWRpYUhhbmRsZXJUeXBlID09IEZPVVJDQygncycsICdvJywgJ3UnLCAnbicpOwotCi0gICAgICAgIGJvb2wgaXNWaWRlbyA9Ci0gICAgICAgICAgICBpbmZvLT5tTWVkaWFIYW5kbGVyVHlwZSA9PSBGT1VSQ0MoJ3YnLCAnaScsICdkJywgJ2UnKTsKLQotICAgICAgICBpZiAoKHdhbnRBdWRpbyAmJiBpc0F1ZGlvKSB8fCAoIXdhbnRBdWRpbyAmJiAhaXNBdWRpbykpIHsKLSAgICAgICAgICAgIGlmIChpbmZvLT5tU2FtcGxlRGVzY3MuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRTdGFydDoKLSAgICAgICAgewotICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzb3VyY2UiLCAmb2JqKSk7Ci0KLSAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKLQotICAgICAgICAgICAgbUJ1ZmZlciA9IG5ldyBBQnVmZmVyKDUxMiAqIDEwMjQpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7Ci0KLSAgICAgICAgICAgIGVudGVyKDBsbCwgMCwgMCk7Ci0KLSAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcm9jZWVkLCBpZCgpKSktPnBvc3QoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFByb2NlZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLKCFtU3VzcGVuZGVkKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25Qcm9jZWVkKCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1TdXNwZW5kZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gLUVBR0FJTikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJvblByb2NlZWQgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRSZWFkTW9yZToKLSAgICAgICAgewotICAgICAgICAgICAgc2l6ZV90IG5lZWRlZDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoIm5lZWRlZCIsICZuZWVkZWQpKTsKLQotICAgICAgICAgICAgbWVtbW92ZShtQnVmZmVyLT5iYXNlKCksIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgIG1CdWZmZXJQb3MgKz0gbUJ1ZmZlci0+b2Zmc2V0KCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkpOwotCi0gICAgICAgICAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQgPSBtQnVmZmVyLT5jYXBhY2l0eSgpIC0gbUJ1ZmZlci0+c2l6ZSgpOwotCi0gICAgICAgICAgICBpZiAobWF4Qnl0ZXNUb1JlYWQgPCBuZWVkZWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicmVzaXppbmcgYnVmZmVyLiIpOwotCi0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gbmV3QnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFCdWZmZXIoKG1CdWZmZXItPnNpemUoKSArIG5lZWRlZCArIDEwMjMpICYgfjEwMjMpOwotICAgICAgICAgICAgICAgIG1lbWNweShuZXdCdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgIG5ld0J1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgICAgICAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSBtQnVmZmVyLT5jYXBhY2l0eSgpIC0gbUJ1ZmZlci0+c2l6ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDS19HRShtYXhCeXRlc1RvUmVhZCwgbmVlZGVkKTsKLQotICAgICAgICAgICAgc3NpemVfdCBuID0gbVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyUG9zICsgbUJ1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5zaXplKCksIG5lZWRlZCk7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgKHNzaXplX3QpbmVlZGVkKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlJlYWNoZWQgRU9GIHdoZW4gcmVhZGluZyAlZCBAICVkICsgJWQiLCBuZWVkZWQsIG1CdWZmZXJQb3MsIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GaW5hbFJlc3VsdCA9IG47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpbmFsUmVzdWx0ID0gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtRmluYWxSZXN1bHQgPSBFUlJPUl9JTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSArIG4pOwotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcm9jZWVkLCBpZCgpKSktPnBvc3QoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0R2V0Rm9ybWF0OgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHdhbnRBdWRpbzsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZ3YW50QXVkaW8pKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gLUVXT1VMREJMT0NLOwotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotCi0gICAgICAgICAgICBzc2l6ZV90IHRyYWNrSW5kZXggPSBmaW5kVHJhY2sod2FudEF1ZGlvKTsKLQotICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gdHJhY2tJbmRleDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdFZhbHVlQXQodHJhY2tJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gaW5mby0+bVNhbXBsZURlc2NzLml0ZW1BdCgwKS5tRm9ybWF0OwotICAgICAgICAgICAgICAgIGlmIChpbmZvLT5tU2lkeER1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50NjQoImR1cmF0aW9uVXMiLCBpbmZvLT5tU2lkeER1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlIHplcm8uIE9oIHdlbGwuLi4KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsICogaW5mby0+bUR1cmF0aW9uIC8gaW5mby0+bU1lZGlhVGltZVNjYWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IiwgZm9ybWF0KTsKLQotICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXREZXF1ZXVlQWNjZXNzVW5pdDoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCB3YW50QXVkaW87Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmd2FudEF1ZGlvKSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IC1FV09VTERCTE9DSzsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLQotICAgICAgICAgICAgc3NpemVfdCB0cmFja0luZGV4ID0gZmluZFRyYWNrKHdhbnRBdWRpbyk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIGVyciA9IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gb25EZXF1ZXVlQWNjZXNzVW5pdCh0cmFja0luZGV4LCAmYWNjZXNzVW5pdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRCdWZmZXIoImFjY2Vzc1VuaXQiLCBhY2Nlc3NVbml0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLQotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLQotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFNlZWtUbzoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoImtXaGF0U2Vla1RvIik7Ci0gICAgICAgICAgICBpbnQzMl90IHdhbnRBdWRpbzsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZ3YW50QXVkaW8pKTsKLSAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb247Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgicG9zaXRpb24iLCAmcG9zaXRpb24pKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gLUVXT1VMREJMT0NLOwotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotCi0gICAgICAgICAgICBzc2l6ZV90IHRyYWNrSW5kZXggPSBmaW5kVHJhY2sod2FudEF1ZGlvKTsKLQotICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gdHJhY2tJbmRleDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gb25TZWVrVG8od2FudEF1ZGlvLCBwb3NpdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6b25Qcm9jZWVkKCkgewotICAgIHN0YXR1c190IGVycjsKLQotICAgIGlmICgoZXJyID0gbmVlZCg4KSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICB1aW50NjRfdCBzaXplID0gcmVhZFUzMigwKTsKLSAgICB1aW50MzJfdCB0eXBlID0gcmVhZFUzMig0KTsKLQotICAgIHNpemVfdCBvZmZzZXQgPSA4OwotCi0gICAgaWYgKHNpemUgPT0gMSkgewotICAgICAgICBpZiAoKGVyciA9IG5lZWQoMTYpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemUgPSByZWFkVTY0KG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA4OwotICAgIH0KLQotICAgIHVpbnQ4X3QgdXNlclR5cGVbMTZdOwotCi0gICAgaWYgKHR5cGUgPT0gRk9VUkNDKCd1JywgJ3UnLCAnaScsICdkJykpIHsKLSAgICAgICAgaWYgKChlcnIgPSBuZWVkKG9mZnNldCArIDE2KSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHkodXNlclR5cGUsIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwgMTYpOwotICAgICAgICBvZmZzZXQgKz0gMTY7Ci0gICAgfQotCi0gICAgQ0hFQ0soIW1TdGFjay5pc0VtcHR5KCkpOwotICAgIHVpbnQzMl90IHB0eXBlID0gbVN0YWNrLml0ZW1BdChtU3RhY2suc2l6ZSgpIC0gMSkubVR5cGU7Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1EaXNwYXRjaGVycyA9Ci0gICAgICAgIHNpemVvZihrRGlzcGF0Y2hUYWJsZSkgLyBzaXplb2Yoa0Rpc3BhdGNoVGFibGVbMF0pOwotCi0gICAgc2l6ZV90IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGtOdW1EaXNwYXRjaGVyczsgKytpKSB7Ci0gICAgICAgIGlmIChrRGlzcGF0Y2hUYWJsZVtpXS5tVHlwZSA9PSB0eXBlCi0gICAgICAgICAgICAgICAgJiYga0Rpc3BhdGNoVGFibGVbaV0ubVBhcmVudFR5cGUgPT0gcHR5cGUpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2FtcGxlRW50cnkgYm94ZXMgYXJlIGNvbnRhaW5lciBib3hlcyB0aGF0IHN0YXJ0IHdpdGggYSB2YXJpYWJsZQotICAgIC8vIGFtb3VudCBvZiBkYXRhIGRlcGVuZGluZyBvbiB0aGUgbWVkaWEgaGFuZGxlciB0eXBlLgotICAgIC8vIFdlIGRvbid0IGxvb2sgaW5zaWRlICdoaW50JyB0eXBlIFNhbXBsZUVudHJ5IGJveGVzLgotCi0gICAgYm9vbCBpc1NhbXBsZUVudHJ5Qm94ID0KLSAgICAgICAgKHB0eXBlID09IEZPVVJDQygncycsICd0JywgJ3MnLCAnZCcpKQotICAgICAgICAmJiBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bU1lZGlhSGFuZGxlclR5cGUKLSAgICAgICAgIT0gRk9VUkNDKCdoJywgJ2knLCAnbicsICd0Jyk7Ci0KLSAgICBpZiAoKGkgPCBrTnVtRGlzcGF0Y2hlcnMgJiYga0Rpc3BhdGNoVGFibGVbaV0ubUhhbmRsZXIgPT0gMCkKLSAgICAgICAgICAgIHx8IGlzU2FtcGxlRW50cnlCb3ggfHwgcHR5cGUgPT0gRk9VUkNDKCdpJywgJ2wnLCAncycsICd0JykpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBhIGNvbnRhaW5lciBib3guCi0gICAgICAgIGlmICh0eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7Ci0gICAgICAgICAgICBpZiAobUZpcnN0TW9vZk9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImZpcnN0IG1vb2YgQCAlMDh4IiwgbUJ1ZmZlclBvcyArIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgbUZpcnN0TW9vZk9mZnNldCA9IG1CdWZmZXJQb3MgKyBvZmZzZXQgLSA4OyAvLyBwb2ludCBhdCB0aGUgc2l6ZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlID09IEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpKSB7Ci0gICAgICAgICAgICBpZiAoKGVyciA9IG5lZWQob2Zmc2V0ICsgNCkpIDwgT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2QnKSkgewotICAgICAgICAgICAgaWYgKChlcnIgPSBuZWVkKG9mZnNldCArIDgpKSA8IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZWFkVTMyKG9mZnNldCArIDQpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIGF0IGxlYXN0IHNvbWUgZW50cmllcy4KLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2Zmc2V0ICs9IDg7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNTYW1wbGVFbnRyeUJveCkgewotICAgICAgICAgICAgc2l6ZV90IGhlYWRlclNpemU7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1NZWRpYUhhbmRsZXJUeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3YnLCAnaScsICdkJywgJ2UnKToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDggYnl0ZXMgU2FtcGxlRW50cnkgKyA3MCBieXRlcyBWaXN1YWxTYW1wbGVFbnRyeQotICAgICAgICAgICAgICAgICAgICBoZWFkZXJTaXplID0gNzg7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ28nLCAndScsICduJyk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyA4IGJ5dGVzIFNhbXBsZUVudHJ5ICsgMjAgYnl0ZXMgQXVkaW9TYW1wbGVFbnRyeQotICAgICAgICAgICAgICAgICAgICBoZWFkZXJTaXplID0gMjg7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJyk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBoZWFkZXJTaXplID0gODsgIC8vIDggYnl0ZXMgU2FtcGxlRW50cnkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9mZnNldCArIGhlYWRlclNpemUgPiBzaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgoZXJyID0gbmVlZChvZmZzZXQgKyBoZWFkZXJTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzd2l0Y2ggKGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tTWVkaWFIYW5kbGVyVHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCd2JywgJ2knLCAnZCcsICdlJyk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZVZpc3VhbFNhbXBsZUVudHJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG9mZnNldCwgb2Zmc2V0ICsgaGVhZGVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ28nLCAndScsICduJyk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZUF1ZGlvU2FtcGxlRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgb2Zmc2V0LCBvZmZzZXQgKyBoZWFkZXJTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2Zmc2V0ICs9IGhlYWRlclNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBza2lwKG9mZnNldCk7Ci0KLSAgICAgICAgQUxPR1YoIiVzZW50ZXJpbmcgYm94IG9mIHR5cGUgJyVzJyIsCi0gICAgICAgICAgICAgICAgSW5kZW50U3RyaW5nKG1TdGFjay5zaXplKCkpLCBGb3VyY2MyU3RyaW5nKHR5cGUpKTsKLQotICAgICAgICBlbnRlcihtQnVmZmVyUG9zIC0gb2Zmc2V0LCB0eXBlLCBzaXplIC0gb2Zmc2V0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIWZpdHNDb250YWluZXIoc2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGkgPCBrTnVtRGlzcGF0Y2hlcnMgJiYga0Rpc3BhdGNoVGFibGVbaV0ubUhhbmRsZXIgIT0gMCkgewotICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIGhhbmRsZXIgZm9yIHRoaXMgYm94IHR5cGUuCi0KLSAgICAgICAgICAgIGlmICgoZXJyID0gbmVlZChzaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigiJXNwYXJzaW5nIGJveCBvZiB0eXBlICclcyciLAotICAgICAgICAgICAgICAgICAgICBJbmRlbnRTdHJpbmcobVN0YWNrLnNpemUoKSksIEZvdXJjYzJTdHJpbmcodHlwZSkpOwotCi0gICAgICAgICAgICBpZiAoKGVyciA9ICh0aGlzLT4qa0Rpc3BhdGNoVGFibGVbaV0ubUhhbmRsZXIpKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG9mZnNldCwgc2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFVua25vd24gYm94IHR5cGUKLQotICAgICAgICAgICAgQUxPR1YoIiVzc2tpcHBpbmcgYm94IG9mIHR5cGUgJyVzJywgc2l6ZSAlbGx1IiwKLSAgICAgICAgICAgICAgICAgICAgSW5kZW50U3RyaW5nKG1TdGFjay5zaXplKCkpLAotICAgICAgICAgICAgICAgICAgICBGb3VyY2MyU3RyaW5nKHR5cGUpLCBzaXplKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgc2tpcChzaXplKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotaW50IEZyYWdtZW50ZWRNUDRQYXJzZXI6OkNvbXBhcmVTYW1wbGVMb2NhdGlvbigKLSAgICAgICAgY29uc3QgU2FtcGxlSW5mbyAmc2FtcGxlLCBjb25zdCBNZWRpYURhdGFJbmZvICZtZGF0SW5mbykgewotICAgIGlmIChzYW1wbGUubU9mZnNldCArIHNhbXBsZS5tU2l6ZSA8IG1kYXRJbmZvLm1PZmZzZXQpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmIChzYW1wbGUubU9mZnNldCA+PSBtZGF0SW5mby5tT2Zmc2V0ICsgbWRhdEluZm8ubUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIC8vIE90aGVyd2lzZSBtYWtlIHN1cmUgdGhlIHNhbXBsZSBpcyBjb21wbGV0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gdGhpcwotICAgIC8vIG1lZGlhIGRhdGEgYmxvY2suCi0KLSAgICBDSEVDS19HRShzYW1wbGUubU9mZnNldCwgbWRhdEluZm8ubU9mZnNldCk7Ci0KLSAgICBDSEVDS19MRShzYW1wbGUubU9mZnNldCArIHNhbXBsZS5tU2l6ZSwKLSAgICAgICAgICAgICBtZGF0SW5mby5tT2Zmc2V0ICsgbWRhdEluZm8ubUJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OnJlc3VtZUlmTmVjZXNzYXJ5KCkgewotICAgIGlmICghbVN1c3BlbmRlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR1YoInJlc3VtaW5nLiIpOwotCi0gICAgbVN1c3BlbmRlZCA9IGZhbHNlOwotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcm9jZWVkLCBpZCgpKSktPnBvc3QoKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6Z2V0U2FtcGxlKAotICAgICAgICBUcmFja0luZm8gKmluZm8sIHNwPFRyYWNrRnJhZ21lbnQ+ICpmcmFnbWVudCwgU2FtcGxlSW5mbyAqc2FtcGxlSW5mbykgewotICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKGluZm8tPm1GcmFnbWVudHMuZW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKG1GaW5hbFJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBtRmluYWxSZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwotICAgICAgICB9Ci0KLSAgICAgICAgKmZyYWdtZW50ID0gKmluZm8tPm1GcmFnbWVudHMuYmVnaW4oKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSAoKmZyYWdtZW50KS0+Z2V0U2FtcGxlKHNhbXBsZUluZm8pOwotCi0gICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlYWxseSwgZW5kIG9mIHRoaXMgZnJhZ21lbnQuLi4KLQotICAgICAgICBpbmZvLT5tRnJhZ21lbnRzLmVyYXNlKGluZm8tPm1GcmFnbWVudHMuYmVnaW4oKSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpvbkRlcXVldWVBY2Nlc3NVbml0KAotICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKLSAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0VmFsdWVBdCh0cmFja0luZGV4KTsKLQotICAgIHNwPFRyYWNrRnJhZ21lbnQ+IGZyYWdtZW50OwotICAgIFNhbXBsZUluZm8gc2FtcGxlSW5mbzsKLSAgICBzdGF0dXNfdCBlcnIgPSBnZXRTYW1wbGUoaW5mbywgJmZyYWdtZW50LCAmc2FtcGxlSW5mbyk7Ci0KLSAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgewotICAgICAgICByZXN1bWVJZk5lY2Vzc2FyeSgpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gLUVXT1VMREJMT0NLOwotCi0gICAgYm9vbCBjaGVja0Ryb3BwYWJsZSA9IGZhbHNlOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFEYXRhLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IE1lZGlhRGF0YUluZm8gJm1kYXRJbmZvID0gbU1lZGlhRGF0YS5pdGVtQXQoaSk7Ci0KLSAgICAgICAgaW50IGNtcCA9IENvbXBhcmVTYW1wbGVMb2NhdGlvbihzYW1wbGVJbmZvLCBtZGF0SW5mbyk7Ci0KLSAgICAgICAgaWYgKGNtcCA8IDAgJiYgIW1Tb3VyY2UtPmlzU2Vla2FibGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIC1FUElQRTsKLSAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMCkgewotICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tEcm9wcGFibGUgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBtYWtlQWNjZXNzVW5pdChpbmZvLCBzYW1wbGVJbmZvLCBtZGF0SW5mbywgYWNjZXNzVW5pdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBmcmFnbWVudC0+YWR2YW5jZSgpOwotCi0gICAgaWYgKCFtTWVkaWFEYXRhLmVtcHR5KCkgJiYgY2hlY2tEcm9wcGFibGUpIHsKLSAgICAgICAgc2l6ZV90IG51bURyb3BwYWJsZSA9IDA7Ci0gICAgICAgIGJvb2wgZG9uZSA9IGZhbHNlOwotCi0gICAgICAgIC8vIFhYWCBGSVhNRTogaWYgb25lIG9mIHRoZSB0cmFja3MgaXMgbm90IGFkdmFuY2VkIChlLmcuIGlmIHlvdSBwbGF5IGFuIGF1ZGlvK3ZpZGVvCi0gICAgICAgIC8vIGZpbGUgd2l0aCBzZjIpLCB0aGVuIG1NZWRpYURhdGEgd2lsbCBub3QgYmUgcHJ1bmVkIGFuZCBrZWVwcyBncm93aW5nCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyAhZG9uZSAmJiBpIDwgbU1lZGlhRGF0YS5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgY29uc3QgTWVkaWFEYXRhSW5mbyAmbWRhdEluZm8gPSBtTWVkaWFEYXRhLml0ZW1BdChpKTsKLQotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtVHJhY2tzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdFZhbHVlQXQoaik7Ci0KLSAgICAgICAgICAgICAgICBzcDxUcmFja0ZyYWdtZW50PiBmcmFnbWVudDsKLSAgICAgICAgICAgICAgICBTYW1wbGVJbmZvIHNhbXBsZUluZm87Ci0gICAgICAgICAgICAgICAgZXJyID0gZ2V0U2FtcGxlKGluZm8sICZmcmFnbWVudCwgJnNhbXBsZUluZm8pOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IGNtcCA9IENvbXBhcmVTYW1wbGVMb2NhdGlvbihzYW1wbGVJbmZvLCBtZGF0SW5mbyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY21wIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFkb25lKSB7Ci0gICAgICAgICAgICAgICAgKytudW1Ecm9wcGFibGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVtRHJvcHBhYmxlID4gMCkgewotICAgICAgICAgICAgbU1lZGlhRGF0YS5yZW1vdmVJdGVtc0F0KDAsIG51bURyb3BwYWJsZSk7Ci0KLSAgICAgICAgICAgIGlmIChtTWVkaWFEYXRhLnNpemUoKSA8IDUpIHsKLSAgICAgICAgICAgICAgICByZXN1bWVJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHNpemVfdCBwYXJzZU5BTFNpemUoc2l6ZV90IG5hbExlbmd0aFNpemUsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKLSAgICBzd2l0Y2ggKG5hbExlbmd0aFNpemUpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcmV0dXJuICpkYXRhOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByZXR1cm4gVTE2X0FUKGRhdGEpOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICByZXR1cm4gKChzaXplX3QpZGF0YVswXSA8PCAxNikgfCBVMTZfQVQoJmRhdGFbMV0pOwotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICByZXR1cm4gVTMyX0FUKGRhdGEpOwotICAgIH0KLQotICAgIC8vIFRoaXMgY2Fubm90IGhhcHBlbiwgbU5BTExlbmd0aFNpemUgc3ByaW5ncyB0byBsaWZlIGJ5IGFkZGluZyAxIHRvCi0gICAgLy8gYSAyLWJpdCBpbnRlZ2VyLgotICAgIFRSRVNQQVNTKCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6bWFrZUFjY2Vzc1VuaXQoCi0gICAgICAgIFRyYWNrSW5mbyAqaW5mbywKLSAgICAgICAgY29uc3QgU2FtcGxlSW5mbyAmc2FtcGxlLAotICAgICAgICBjb25zdCBNZWRpYURhdGFJbmZvICZtZGF0SW5mbywKLSAgICAgICAgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKLSAgICBpZiAoc2FtcGxlLm1TYW1wbGVEZXNjSW5kZXggPCAxCi0gICAgICAgICAgICB8fCBzYW1wbGUubVNhbXBsZURlc2NJbmRleCA+IGluZm8tPm1TYW1wbGVEZXNjcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHByZXNlbnRhdGlvblRpbWVVcyA9Ci0gICAgICAgIDEwMDAwMDBsbCAqIHNhbXBsZS5tUHJlc2VudGF0aW9uVGltZSAvIGluZm8tPm1NZWRpYVRpbWVTY2FsZTsKLQotICAgIGNvbnN0IFNhbXBsZURlc2NyaXB0aW9uICZzYW1wbGVEZXNjID0KLSAgICAgICAgaW5mby0+bVNhbXBsZURlc2NzLml0ZW1BdChzYW1wbGUubVNhbXBsZURlc2NJbmRleCAtIDEpOwotCi0gICAgc2l6ZV90IG5hbExlbmd0aFNpemU7Ci0gICAgaWYgKCFzYW1wbGVEZXNjLm1Gb3JtYXQtPmZpbmRTaXplKCJuYWwtbGVuZ3RoLXNpemUiLCAmbmFsTGVuZ3RoU2l6ZSkpIHsKLSAgICAgICAgKmFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihzYW1wbGUubVNpemUpOwotCi0gICAgICAgIG1lbWNweSgoKmFjY2Vzc1VuaXQpLT5kYXRhKCksCi0gICAgICAgICAgICAgICBtZGF0SW5mby5tQnVmZmVyLT5kYXRhKCkgKyAoc2FtcGxlLm1PZmZzZXQgLSBtZGF0SW5mby5tT2Zmc2V0KSwKLSAgICAgICAgICAgICAgIHNhbXBsZS5tU2l6ZSk7Ci0KLSAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgcHJlc2VudGF0aW9uVGltZVVzKTsKLSAgICAgICAgaWYgKElzSURSKCphY2Nlc3NVbml0KSkgewotICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQzMigiaXMtc3luYy1mcmFtZSIsIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1B0ciA9Ci0gICAgICAgIG1kYXRJbmZvLm1CdWZmZXItPmRhdGEoKSArIChzYW1wbGUubU9mZnNldCAtIG1kYXRJbmZvLm1PZmZzZXQpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyIDsgKytpKSB7Ci0gICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwotICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKLQotICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2FtcGxlLm1TaXplKSB7Ci0gICAgICAgICAgICBpZiAoc3JjT2Zmc2V0ICsgbmFsTGVuZ3RoU2l6ZSA+IHNhbXBsZS5tU2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNpemVfdCBuYWxTaXplID0gcGFyc2VOQUxTaXplKG5hbExlbmd0aFNpemUsICZzcmNQdHJbc3JjT2Zmc2V0XSk7Ci0gICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoU2l6ZTsKLQotICAgICAgICAgICAgaWYgKHNyY09mZnNldCArIG5hbFNpemUgPiBzYW1wbGUubVNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCgqYWNjZXNzVW5pdCktPmRhdGEoKSArIGRzdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDEiLAotICAgICAgICAgICAgICAgICAgICAgICA0KTsKLQotICAgICAgICAgICAgICAgIG1lbWNweSgoKmFjY2Vzc1VuaXQpLT5kYXRhKCkgKyBkc3RPZmZzZXQgKyA0LAotICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgKyBzcmNPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIG5hbFNpemUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsU2l6ZTsKLSAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxTaXplICsgNDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICgqYWNjZXNzVW5pdCkgPSBuZXcgQUJ1ZmZlcihkc3RPZmZzZXQpOwotICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgInRpbWVVcyIsIHByZXNlbnRhdGlvblRpbWVVcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKElzSURSKCphY2Nlc3NVbml0KSkgewotICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDMyKCJpcy1zeW5jLWZyYW1lIiwgMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpuZWVkKHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKCFmaXRzQ29udGFpbmVyKHNpemUpKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChzaXplIDw9IG1CdWZmZXItPnNpemUoKSkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlYWRNb3JlLCBpZCgpKTsKLSAgICBtc2ctPnNldFNpemUoIm5lZWRlZCIsIHNpemUgLSBtQnVmZmVyLT5zaXplKCkpOwotICAgIG1zZy0+cG9zdCgpOwotCi0gICAgLy8gQUxPR1YoIm5lZWQoJWQpIHJldHVybmluZyAtRUFHQUlOLCBvbmx5IGhhdmUgJWQiLCBzaXplLCBtQnVmZmVyLT5zaXplKCkpOwotCi0gICAgcmV0dXJuIC1FQUdBSU47Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6ZW50ZXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90IHR5cGUsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBDb250YWluZXIgY29udGFpbmVyOwotICAgIGNvbnRhaW5lci5tT2Zmc2V0ID0gb2Zmc2V0OwotICAgIGNvbnRhaW5lci5tVHlwZSA9IHR5cGU7Ci0gICAgY29udGFpbmVyLm1FeHRlbmRzVG9FT0YgPSAoc2l6ZSA9PSAwKTsKLSAgICBjb250YWluZXIubUJ5dGVzUmVtYWluaW5nID0gc2l6ZTsKLQotICAgIG1TdGFjay5wdXNoKGNvbnRhaW5lcik7Ci19Ci0KLWJvb2wgRnJhZ21lbnRlZE1QNFBhcnNlcjo6Zml0c0NvbnRhaW5lcih1aW50NjRfdCBzaXplKSBjb25zdCB7Ci0gICAgQ0hFQ0soIW1TdGFjay5pc0VtcHR5KCkpOwotICAgIGNvbnN0IENvbnRhaW5lciAmY29udGFpbmVyID0gbVN0YWNrLml0ZW1BdChtU3RhY2suc2l6ZSgpIC0gMSk7Ci0KLSAgICByZXR1cm4gY29udGFpbmVyLm1FeHRlbmRzVG9FT0YgfHwgc2l6ZSA8PSBjb250YWluZXIubUJ5dGVzUmVtYWluaW5nOwotfQotCi11aW50MTZfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpyZWFkVTE2KHNpemVfdCBvZmZzZXQpIHsKLSAgICBDSEVDS19MRShvZmZzZXQgKyAyLCBtQnVmZmVyLT5zaXplKCkpOwotCi0gICAgY29uc3QgdWludDhfdCAqcHRyID0gbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0OwotICAgIHJldHVybiAocHRyWzBdIDw8IDgpIHwgcHRyWzFdOwotfQotCi11aW50MzJfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpyZWFkVTMyKHNpemVfdCBvZmZzZXQpIHsKLSAgICBDSEVDS19MRShvZmZzZXQgKyA0LCBtQnVmZmVyLT5zaXplKCkpOwotCi0gICAgY29uc3QgdWludDhfdCAqcHRyID0gbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0OwotICAgIHJldHVybiAocHRyWzBdIDw8IDI0KSB8IChwdHJbMV0gPDwgMTYpIHwgKHB0clsyXSA8PCA4KSB8IHB0clszXTsKLX0KLQotdWludDY0X3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cmVhZFU2NChzaXplX3Qgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuICgoKHVpbnQ2NF90KXJlYWRVMzIob2Zmc2V0KSkgPDwgMzIpIHwgcmVhZFUzMihvZmZzZXQgKyA0KTsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpza2lwKG9mZl90IGRpc3RhbmNlKSB7Ci0gICAgQ0hFQ0soIW1TdGFjay5pc0VtcHR5KCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSBtU3RhY2suc2l6ZSgpOyBpLS0gPiAwOykgewotICAgICAgICBDb250YWluZXIgKmNvbnRhaW5lciA9ICZtU3RhY2suZWRpdEl0ZW1BdChpKTsKLSAgICAgICAgaWYgKCFjb250YWluZXItPm1FeHRlbmRzVG9FT0YpIHsKLSAgICAgICAgICAgIENIRUNLX0xFKGRpc3RhbmNlLCAob2ZmX3QpY29udGFpbmVyLT5tQnl0ZXNSZW1haW5pbmcpOwotCi0gICAgICAgICAgICBjb250YWluZXItPm1CeXRlc1JlbWFpbmluZyAtPSBkaXN0YW5jZTsKLQotICAgICAgICAgICAgaWYgKGNvbnRhaW5lci0+bUJ5dGVzUmVtYWluaW5nID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXNsZWF2aW5nIGJveCBvZiB0eXBlICclcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgSW5kZW50U3RyaW5nKG1TdGFjay5zaXplKCkgLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZvdXJjYzJTdHJpbmcoY29udGFpbmVyLT5tVHlwZSkpOwotCi0jaWYgMAotICAgICAgICAgICAgICAgIGlmIChjb250YWluZXItPm1UeXBlID09IEZPVVJDQygncycsICd0JywgJ3MnLCAnZCcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPCB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvcm1hdCAjJWQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5pdGVtQXQoaSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1Gb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIGlmIChjb250YWluZXItPm1UeXBlID09IEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU3RhdGljRnJhZ21lbnQtPnNpZ25hbENvbXBsZXRpb24oKTsKLQotICAgICAgICAgICAgICAgICAgICBDSEVDSyh0cmFja0luZm8tPm1GcmFnbWVudHMuZW1wdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bUZyYWdtZW50cy5wdXNoX2JhY2sodHJhY2tJbmZvLT5tU3RhdGljRnJhZ21lbnQpOwotICAgICAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TdGF0aWNGcmFnbWVudC5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyLT5tVHlwZSA9PSBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKSkgewotICAgICAgICAgICAgICAgICAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlZGl0VHJhY2sobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1UcmFja0lEKTsKLQotICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0ZyYWdtZW50PiAmZnJhZ21lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKi0tdHJhY2tJbmZvLT5tRnJhZ21lbnRzLmVuZCgpOwotCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PER5bmFtaWNUcmFja0ZyYWdtZW50ICo+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LmdldCgpKS0+c2lnbmFsQ29tcGxldGlvbigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyLT5tVHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSkgewotICAgICAgICAgICAgICAgICAgICBtRG9uZVdpdGhNb292ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjb250YWluZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIG1TdGFjay5yZW1vdmVJdGVtc0F0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGRpc3RhbmNlIDwgKG9mZl90KW1CdWZmZXItPnNpemUoKSkgewotICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZShtQnVmZmVyLT5vZmZzZXQoKSArIGRpc3RhbmNlLCBtQnVmZmVyLT5zaXplKCkgLSBkaXN0YW5jZSk7Ci0gICAgICAgIG1CdWZmZXJQb3MgKz0gZGlzdGFuY2U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKLSAgICBtQnVmZmVyUG9zICs9IGRpc3RhbmNlOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrSGVhZGVyKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotCi0gICAgdWludDMyX3QgdmVyc2lvbiA9IGZsYWdzID4+IDI0OwotICAgIGZsYWdzICY9IDB4ZmZmZmZmOwotCi0gICAgdWludDMyX3QgdHJhY2tJRDsKLSAgICB1aW50NjRfdCBkdXJhdGlvbjsKLQotICAgIGlmICh2ZXJzaW9uID09IDEpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDM2ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cmFja0lEID0gcmVhZFUzMihvZmZzZXQgKyAyMCk7Ci0gICAgICAgIGR1cmF0aW9uID0gcmVhZFU2NChvZmZzZXQgKyAyOCk7Ci0KLSAgICAgICAgb2Zmc2V0ICs9IDM2OwotICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyAyNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJhY2tJRCA9IHJlYWRVMzIob2Zmc2V0ICsgMTIpOwotICAgICAgICBkdXJhdGlvbiA9IHJlYWRVMzIob2Zmc2V0ICsgMjApOwotCi0gICAgICAgIG9mZnNldCArPSAyNDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBUcmFja0luZm8gKmluZm8gPSBlZGl0VHJhY2sodHJhY2tJRCwgdHJ1ZSAvKiBjcmVhdGVJZk5lY2Vzc2FyeSAqLyk7Ci0gICAgaW5mby0+bUZsYWdzID0gZmxhZ3M7Ci0gICAgaW5mby0+bUR1cmF0aW9uID0gZHVyYXRpb247Ci0gICAgaWYgKGluZm8tPm1EdXJhdGlvbiA9PSAweGZmZmZmZmZmKSB7Ci0gICAgICAgIC8vIGZmbXBlZyBzZXRzIHRoaXMgdG8gLTEsIHdoaWNoIGlzIGluY29ycmVjdC4KLSAgICAgICAgaW5mby0+bUR1cmF0aW9uID0gMDsKLSAgICB9Ci0KLSAgICBpbmZvLT5tU3RhdGljRnJhZ21lbnQgPSBuZXcgU3RhdGljVHJhY2tGcmFnbWVudDsKLQotICAgIG1DdXJyZW50VHJhY2tJRCA9IHRyYWNrSUQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlTWVkaWFIZWFkZXIoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgdmVyc2lvbkFuZEZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotCi0gICAgaWYgKHZlcnNpb25BbmRGbGFncyAmIDB4ZmZmZmZmKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgdmVyc2lvbiA9IHZlcnNpb25BbmRGbGFncyA+PiAyNDsKLQotICAgIFRyYWNrSW5mbyAqaW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotCi0gICAgaWYgKHZlcnNpb24gPT0gMSkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCArIDMyID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgaW5mby0+bU1lZGlhVGltZVNjYWxlID0gVTMyX0FUKG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCArIDIwKTsKLSAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCArIDIwID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgaW5mby0+bU1lZGlhVGltZVNjYWxlID0gVTMyX0FUKG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCArIDEyKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VNZWRpYUhhbmRsZXIoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgMTIgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChyZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBoYW5kbGVyVHlwZSA9IHJlYWRVMzIob2Zmc2V0ICsgOCk7Ci0KLSAgICBzd2l0Y2ggKGhhbmRsZXJUeXBlKSB7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCd2JywgJ2knLCAnZCcsICdlJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ28nLCAndScsICduJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2knLCAnbicsICd0Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJyk6Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1NZWRpYUhhbmRsZXJUeXBlID0gaGFuZGxlclR5cGU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVmlzdWFsU2FtcGxlRW50cnkoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgNzggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0KLSAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5wdXNoKCk7Ci0gICAgU2FtcGxlRGVzY3JpcHRpb24gKnNhbXBsZURlc2MgPQotICAgICAgICAmdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MuZWRpdEl0ZW1BdCgKLSAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5zaXplKCkgLSAxKTsKLQotICAgIHNhbXBsZURlc2MtPm1UeXBlID0gdHlwZTsKLSAgICBzYW1wbGVEZXNjLT5tRGF0YVJlZkluZGV4ID0gcmVhZFUxNihvZmZzZXQgKyA2KTsKLQotICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2U7Ci0KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKToKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAndicpOgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnMicsICc2JywgJzMnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnMicsICc2JywgJzMnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0gnLCAnMicsICc2JywgJzMnKToKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCByZWFkVTE2KG9mZnNldCArIDggKyAxNikpOwotICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIHJlYWRVMTYob2Zmc2V0ICsgOCArIDE4KSk7Ci0KLSAgICBzYW1wbGVEZXNjLT5tRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUF1ZGlvU2FtcGxlRW50cnkoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgMjggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0KLSAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5wdXNoKCk7Ci0gICAgU2FtcGxlRGVzY3JpcHRpb24gKnNhbXBsZURlc2MgPQotICAgICAgICAmdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MuZWRpdEl0ZW1BdCgKLSAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5zaXplKCkgLSAxKTsKLQotICAgIHNhbXBsZURlc2MtPm1UeXBlID0gdHlwZTsKLSAgICBzYW1wbGVEZXNjLT5tRGF0YVJlZkluZGV4ID0gcmVhZFUxNihvZmZzZXQgKyA2KTsKLQotICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2U7Ci0KLSAgICBmb3JtYXQtPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcmVhZFUxNihvZmZzZXQgKyA4ICsgOCkpOwotICAgIGZvcm1hdC0+c2V0SW50MzIoInNhbXBsZS1zaXplIiwgcmVhZFUxNihvZmZzZXQgKyA4ICsgMTApKTsKLSAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHJlYWRVMzIob2Zmc2V0ICsgOCArIDE2KSAvIDY1NTM2LjBmKTsKLQotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpOgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICdtJywgJ3InKToKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCAxKTsKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgODAwMCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ3cnLCAnYicpOgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpOwotICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIDEpOwotICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCAxNjAwMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc2FtcGxlRGVzYy0+bUZvcm1hdCA9IGZvcm1hdDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIHZvaWQgYWRkQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBpbnQzMl90IGluZGV4LAotICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgYm9vbCBpbnNlcnRTdGFydENvZGUgPSBmYWxzZSkgewotICAgIHNwPEFCdWZmZXI+IGNzZCA9IG5ldyBBQnVmZmVyKGluc2VydFN0YXJ0Q29kZSA/IHNpemUgKyA0IDogc2l6ZSk7Ci0KLSAgICBtZW1jcHkoY3NkLT5kYXRhKCkgKyAoaW5zZXJ0U3RhcnRDb2RlID8gNCA6IDApLCBkYXRhLCBzaXplKTsKLQotICAgIGlmIChpbnNlcnRTdGFydENvZGUpIHsKLSAgICAgICAgbWVtY3B5KGNzZC0+ZGF0YSgpLCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOwotICAgIH0KLQotICAgIGNzZC0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7Ci0gICAgY3NkLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwbGwpOwotCi0gICAgZm9ybWF0LT5zZXRCdWZmZXIoU3RyaW5nUHJpbnRmKCJjc2QtJWQiLCBpbmRleCkuY19zdHIoKSwgY3NkKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VTYW1wbGVTaXplcygKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIHJldHVybiBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bVN0YXRpY0ZyYWdtZW50LT5wYXJzZVNhbXBsZVNpemVzKAotICAgICAgICAgICAgdGhpcywgdHlwZSwgb2Zmc2V0LCBzaXplKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VDb21wYWN0U2FtcGxlU2l6ZXMoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICByZXR1cm4gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1TdGF0aWNGcmFnbWVudC0+cGFyc2VDb21wYWN0U2FtcGxlU2l6ZXMoCi0gICAgICAgICAgICB0aGlzLCB0eXBlLCBvZmZzZXQsIHNpemUpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVNhbXBsZVRvQ2h1bmsoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICByZXR1cm4gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1TdGF0aWNGcmFnbWVudC0+cGFyc2VTYW1wbGVUb0NodW5rKAotICAgICAgICAgICAgdGhpcywgdHlwZSwgb2Zmc2V0LCBzaXplKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VDaHVua09mZnNldHMoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICByZXR1cm4gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1TdGF0aWNGcmFnbWVudC0+cGFyc2VDaHVua09mZnNldHMoCi0gICAgICAgICAgICB0aGlzLCB0eXBlLCBvZmZzZXQsIHNpemUpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUNodW5rT2Zmc2V0czY0KAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgcmV0dXJuIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tU3RhdGljRnJhZ21lbnQtPnBhcnNlQ2h1bmtPZmZzZXRzNjQoCi0gICAgICAgICAgICB0aGlzLCB0eXBlLCBvZmZzZXQsIHNpemUpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLQotICAgIFNhbXBsZURlc2NyaXB0aW9uICpzYW1wbGVEZXNjID0KLSAgICAgICAgJnRyYWNrSW5mby0+bVNhbXBsZURlc2NzLmVkaXRJdGVtQXQoCi0gICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3Muc2l6ZSgpIC0gMSk7Ci0KLSAgICBpZiAoc2FtcGxlRGVzYy0+bVR5cGUgIT0gRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJykpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDhfdCAqcHRyID0gbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0OwotCi0gICAgc2l6ZSAtPSBvZmZzZXQ7Ci0gICAgb2Zmc2V0ID0gMDsKLQotICAgIGlmIChzaXplIDwgNyB8fCBwdHJbMF0gIT0gMHgwMSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQtPnNldFNpemUoIm5hbC1sZW5ndGgtc2l6ZSIsIDEgKyAocHRyWzRdICYgMykpOwotCi0gICAgc2l6ZV90IG51bVNQUyA9IHB0cls1XSAmIDMxOwotCi0gICAgcHRyICs9IDY7Ci0gICAgc2l6ZSAtPSA2OwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TUFM7ICsraSkgewotICAgICAgICBpZiAoc2l6ZSA8IDIpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbGVuZ3RoID0gVTE2X0FUKHB0cik7Ci0KLSAgICAgICAgcHRyICs9IDI7Ci0gICAgICAgIHNpemUgLT0gMjsKLQotICAgICAgICBpZiAoc2l6ZSA8IGxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICAgICAgICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQsIGksIHB0ciwgbGVuZ3RoLAotICAgICAgICAgICAgICAgIHRydWUgLyogaW5zZXJ0U3RhcnRDb2RlICovKTsKLQotICAgICAgICBwdHIgKz0gbGVuZ3RoOwotICAgICAgICBzaXplIC09IGxlbmd0aDsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtUFBTID0gKnB0cjsKLSAgICArK3B0cjsKLSAgICAtLXNpemU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVBQUzsgKytpKSB7Ci0gICAgICAgIGlmIChzaXplIDwgMikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBsZW5ndGggPSBVMTZfQVQocHRyKTsKLQotICAgICAgICBwdHIgKz0gMjsKLSAgICAgICAgc2l6ZSAtPSAyOwotCi0gICAgICAgIGlmIChzaXplIDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgICAgICAgICAgc2FtcGxlRGVzYy0+bUZvcm1hdCwgbnVtU1BTICsgaSwgcHRyLCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbnNlcnRTdGFydENvZGUgKi8pOwotCi0gICAgICAgIHB0ciArPSBsZW5ndGg7Ci0gICAgICAgIHNpemUgLT0gbGVuZ3RoOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VFU0RTQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotCi0gICAgU2FtcGxlRGVzY3JpcHRpb24gKnNhbXBsZURlc2MgPQotICAgICAgICAmdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MuZWRpdEl0ZW1BdCgKLSAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5zaXplKCkgLSAxKTsKLQotICAgIGlmIChzYW1wbGVEZXNjLT5tVHlwZSAhPSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKQotICAgICAgICAgICAgJiYgc2FtcGxlRGVzYy0+bVR5cGUgIT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2JykpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDhfdCAqcHRyID0gbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0OwotCi0gICAgc2l6ZSAtPSBvZmZzZXQ7Ci0gICAgb2Zmc2V0ID0gMDsKLQotICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoVTMyX0FUKHB0cikgIT0gMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBwdHIgKz0gNDsKLSAgICBzaXplIC09NDsKLQotICAgIEVTRFMgZXNkcyhwdHIsIHNpemUpOwotCi0gICAgdWludDhfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKLSAgICBpZiAoZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDhfdCAqY3NkOwotICAgIHNpemVfdCBjc2Rfc2l6ZTsKLSAgICBpZiAoZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygKLSAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqKikmY3NkLCAmY3NkX3NpemUpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoc2FtcGxlRGVzYy0+bUZvcm1hdCwgMCwgY3NkLCBjc2Rfc2l6ZSk7Ci0KLSAgICBpZiAoc2FtcGxlRGVzYy0+bVR5cGUgIT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJykpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChjc2Rfc2l6ZSA9PSAwKSB7Ci0gICAgICAgIC8vIFRoZXJlJ3Mgbm8gZnVydGhlciBpbmZvcm1hdGlvbiwgaS5lLiBubyBjb2RlYyBzcGVjaWZpYyBkYXRhCi0gICAgICAgIC8vIExldCdzIGFzc3VtZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBpbiB0aGUgbXBlZzQgaGVhZGVycwotICAgICAgICAvLyBpcyBhY2N1cmF0ZSBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCi0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChjc2Rfc2l6ZSA8IDIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBvYmplY3RUeXBlID0gY3NkWzBdID4+IDM7Ci0KLSAgICBpZiAob2JqZWN0VHlwZSA9PSAzMSkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZnJlcUluZGV4ID0gKGNzZFswXSAmIDcpIDw8IDEgfCAoY3NkWzFdID4+IDcpOwotICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IDA7Ci0gICAgaW50MzJfdCBudW1DaGFubmVscyA9IDA7Ci0gICAgaWYgKGZyZXFJbmRleCA9PSAxNSkgewotICAgICAgICBpZiAoY3NkX3NpemUgPCA1KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgc2FtcGxlUmF0ZSA9IChjc2RbMV0gJiAweDdmKSA8PCAxNwotICAgICAgICAgICAgICAgICAgICAgICAgfCBjc2RbMl0gPDwgOQotICAgICAgICAgICAgICAgICAgICAgICAgfCBjc2RbM10gPDwgMQotICAgICAgICAgICAgICAgICAgICAgICAgfCAoY3NkWzRdID4+IDcpOwotCi0gICAgICAgIG51bUNoYW5uZWxzID0gKGNzZFs0XSA+PiAzKSAmIDE1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXRpYyB1aW50MzJfdCBrU2FtcGxpbmdSYXRlW10gPSB7Ci0gICAgICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCi0gICAgICAgICAgICAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCA3MzUwCi0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgKGZyZXFJbmRleCA9PSAxMyB8fCBmcmVxSW5kZXggPT0gMTQpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtmcmVxSW5kZXhdOwotICAgICAgICBudW1DaGFubmVscyA9IChjc2RbMV0gPj4gMykgJiAxNTsKLSAgICB9Ci0KLSAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgc2FtcGxlRGVzYy0+bUZvcm1hdC0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgc2FtcGxlUmF0ZSk7Ci0gICAgc2FtcGxlRGVzYy0+bUZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBudW1DaGFubmVscyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlTWVkaWFEYXRhKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgQUxPR1YoInNraXBwaW5nICdtZGF0JyBjaHVuayBhdCBvZmZzZXRzIDB4JTA4bHgtMHglMDhsbHguIiwKLSAgICAgICAgICBtQnVmZmVyUG9zICsgb2Zmc2V0LCBtQnVmZmVyUG9zICsgc2l6ZSk7Ci0KLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplIC0gb2Zmc2V0KTsKLSAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwgc2l6ZSAtIG9mZnNldCk7Ci0KLSAgICBtTWVkaWFEYXRhLnB1c2goKTsKLSAgICBNZWRpYURhdGFJbmZvICppbmZvID0gJm1NZWRpYURhdGEuZWRpdEl0ZW1BdChtTWVkaWFEYXRhLnNpemUoKSAtIDEpOwotICAgIGluZm8tPm1CdWZmZXIgPSBidWZmZXI7Ci0gICAgaW5mby0+bU9mZnNldCA9IG1CdWZmZXJQb3MgKyBvZmZzZXQ7Ci0KLSAgICBpZiAobU1lZGlhRGF0YS5zaXplKCkgPiAxMCkgewotICAgICAgICBBTE9HVigic3VzcGVuZGluZyBmb3Igbm93LiIpOwotICAgICAgICBtU3VzcGVuZGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlU2VnbWVudEluZGV4KAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgQUxPR1YoInNpZHggYm94IHR5cGUgJWQsIG9mZnNldCAlZCwgc2l6ZSAlZCIsIHR5cGUsIGludChvZmZzZXQpLCBpbnQoc2l6ZSkpOwotLy8gICAgQVN0cmluZyBzaWR4c3RyOwotLy8gICAgaGV4ZHVtcChtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIHNpemUsIDAgLyogaW5kZW50ICovLCAmc2lkeHN0cik7Ci0vLyAgICBBTE9HVigicmF3IHNpZHg6Iik7Ci0vLyAgICBBTE9HVigiJXMiLCBzaWR4c3RyLmNfc3RyKCkpOwotICAgIGlmIChvZmZzZXQgKyAxMiA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uID0gZmxhZ3MgPj4gMjQ7Ci0gICAgZmxhZ3MgJj0gMHhmZmZmZmY7Ci0KLSAgICBBTE9HVigic2lkeCB2ZXJzaW9uICVkIiwgdmVyc2lvbik7Ci0KLSAgICB1aW50MzJfdCByZWZlcmVuY2VJZCA9IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0gICAgdWludDMyX3QgdGltZVNjYWxlID0gcmVhZFUzMihvZmZzZXQgKyA4KTsKLSAgICBBTE9HVigic2lkeCByZWZpZC90aW1lc2NhbGU6ICVkLyVkIiwgcmVmZXJlbmNlSWQsIHRpbWVTY2FsZSk7Ci0KLSAgICB1aW50NjRfdCBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWU7Ci0gICAgdWludDY0X3QgZmlyc3RPZmZzZXQ7Ci0KLSAgICBvZmZzZXQgKz0gMTI7Ci0KLSAgICBpZiAodmVyc2lvbiA9PSAwKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgZWFybGllc3RQcmVzZW50YXRpb25UaW1lID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICBmaXJzdE9mZnNldCA9IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0gICAgICAgIG9mZnNldCArPSA4OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyAxNiA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSA9IHJlYWRVNjQob2Zmc2V0KTsKLSAgICAgICAgZmlyc3RPZmZzZXQgPSByZWFkVTY0KG9mZnNldCArIDgpOwotICAgICAgICBvZmZzZXQgKz0gMTY7Ci0gICAgfQotICAgIEFMT0dWKCJzaWR4IHByZXMvb2ZmOiAlTGQvJUxkIiwgZWFybGllc3RQcmVzZW50YXRpb25UaW1lLCBmaXJzdE9mZnNldCk7Ci0KLSAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGlmIChyZWFkVTE2KG9mZnNldCkgIT0gMCkgeyAvLyByZXNlcnZlZAotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgaW50MzJfdCByZWZlcmVuY2VDb3VudCA9IHJlYWRVMTYob2Zmc2V0ICsgMik7Ci0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgQUxPR1YoInJlZmNvdW50OiAlZCIsIHJlZmVyZW5jZUNvdW50KTsKLQotICAgIGlmIChvZmZzZXQgKyByZWZlcmVuY2VDb3VudCAqIDEyID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBUcmFja0luZm8gKmluZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLSAgICB1aW50NjRfdCB0b3RhbF9kdXJhdGlvbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VDb3VudDsgaSsrKSB7Ci0gICAgICAgIHVpbnQzMl90IGQxID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICB1aW50MzJfdCBkMiA9IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0gICAgICAgIHVpbnQzMl90IGQzID0gcmVhZFUzMihvZmZzZXQgKyA4KTsKLQotICAgICAgICBpZiAoZDEgJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgICAgICBBTE9HVygic3ViLXNpZHggYm94ZXMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKLSAgICAgICAgfQotICAgICAgICBib29sIHNhcCA9IGQzICYgMHg4MDAwMDAwMDsKLSAgICAgICAgYm9vbCBzYXB0eXBlID0gZDMgPj4gMjg7Ci0gICAgICAgIGlmICghc2FwIHx8IHNhcHR5cGUgPiAyKSB7Ci0gICAgICAgICAgICBBTE9HVygibm90IGEgc3RyZWFtIGFjY2VzcyBwb2ludCwgb3IgdW5zdXBwb3J0ZWQgdHlwZSIpOwotICAgICAgICB9Ci0gICAgICAgIHRvdGFsX2R1cmF0aW9uICs9IGQyOwotICAgICAgICBvZmZzZXQgKz0gMTI7Ci0gICAgICAgIEFMT0dWKCIgaXRlbSAlZCwgJTA4eCAlMDh4ICUwOHgiLCBpLCBkMSwgZDIsIGQzKTsKLSAgICAgICAgU2lkeEVudHJ5IHNlOwotICAgICAgICBzZS5tU2l6ZSA9IGQxICYgMHg3ZmZmZmZmZjsKLSAgICAgICAgc2UubUR1cmF0aW9uVXMgPSAxMDAwMDAwTEwgKiBkMiAvIHRpbWVTY2FsZTsKLSAgICAgICAgaW5mby0+bVNpZHguYWRkKHNlKTsKLSAgICB9Ci0KLSAgICBpbmZvLT5tU2lkeER1cmF0aW9uID0gdG90YWxfZHVyYXRpb24gKiAxMDAwMDAwIC8gdGltZVNjYWxlOwotICAgIEFMT0dWKCJkdXJhdGlvbjogJWxsZCIsIGluZm8tPm1TaWR4RHVyYXRpb24pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0V4dGVuZHMoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgMjQgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChyZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCB0cmFja0lEID0gcmVhZFUzMihvZmZzZXQgKyA0KTsKLQotICAgIFRyYWNrSW5mbyAqaW5mbyA9IGVkaXRUcmFjayh0cmFja0lELCB0cnVlIC8qIGNyZWF0ZUlmTmVjZXNzYXJ5ICovKTsKLSAgICBpbmZvLT5tRGVmYXVsdFNhbXBsZURlc2NyaXB0aW9uSW5kZXggPSByZWFkVTMyKG9mZnNldCArIDgpOwotICAgIGluZm8tPm1EZWZhdWx0U2FtcGxlRHVyYXRpb24gPSByZWFkVTMyKG9mZnNldCArIDEyKTsKLSAgICBpbmZvLT5tRGVmYXVsdFNhbXBsZVNpemUgPSByZWFkVTMyKG9mZnNldCArIDE2KTsKLSAgICBpbmZvLT5tRGVmYXVsdFNhbXBsZUZsYWdzID0gcmVhZFUzMihvZmZzZXQgKyAyMCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6OlRyYWNrSW5mbyAqRnJhZ21lbnRlZE1QNFBhcnNlcjo6ZWRpdFRyYWNrKAotICAgICAgICB1aW50MzJfdCB0cmFja0lELCBib29sIGNyZWF0ZUlmTmVjZXNzYXJ5KSB7Ci0gICAgc3NpemVfdCBpID0gbVRyYWNrcy5pbmRleE9mS2V5KHRyYWNrSUQpOwotCi0gICAgaWYgKGkgPj0gMCkgewotICAgICAgICByZXR1cm4gJm1UcmFja3MuZWRpdFZhbHVlQXQoaSk7Ci0gICAgfQotCi0gICAgaWYgKCFjcmVhdGVJZk5lY2Vzc2FyeSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBUcmFja0luZm8gaW5mbzsKLSAgICBpbmZvLm1UcmFja0lEID0gdHJhY2tJRDsKLSAgICBpbmZvLm1GbGFncyA9IDA7Ci0gICAgaW5mby5tRHVyYXRpb24gPSAweGZmZmZmZmZmOwotICAgIGluZm8ubVNpZHhEdXJhdGlvbiA9IDA7Ci0gICAgaW5mby5tTWVkaWFUaW1lU2NhbGUgPSAwOwotICAgIGluZm8ubU1lZGlhSGFuZGxlclR5cGUgPSAwOwotICAgIGluZm8ubURlZmF1bHRTYW1wbGVEZXNjcmlwdGlvbkluZGV4ID0gMDsKLSAgICBpbmZvLm1EZWZhdWx0U2FtcGxlRHVyYXRpb24gPSAwOwotICAgIGluZm8ubURlZmF1bHRTYW1wbGVTaXplID0gMDsKLSAgICBpbmZvLm1EZWZhdWx0U2FtcGxlRmxhZ3MgPSAwOwotCi0gICAgaW5mby5tRGVjb2RpbmdUaW1lID0gMDsKLQotICAgIG1UcmFja3MuYWRkKHRyYWNrSUQsIGluZm8pOwotICAgIHJldHVybiAmbVRyYWNrcy5lZGl0VmFsdWVBdChtVHJhY2tzLmluZGV4T2ZLZXkodHJhY2tJRCkpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrRnJhZ21lbnRIZWFkZXIoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0KLSAgICBpZiAoZmxhZ3MgJiAweGZmMDAwMDAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MgPSBmbGFnczsKLQotICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tVHJhY2tJRCA9IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0gICAgb2Zmc2V0ICs9IDg7Ci0KLSAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0Jhc2VEYXRhT2Zmc2V0UHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1CYXNlRGF0YU9mZnNldCA9IHJlYWRVNjQob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDg7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtTYW1wbGVEZXNjcmlwdGlvbkluZGV4UHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1TYW1wbGVEZXNjcmlwdGlvbkluZGV4ID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVEdXJhdGlvblByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVTaXplUHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlU2l6ZSA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVGbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotCi0gICAgaWYgKCEoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0Jhc2VEYXRhT2Zmc2V0UHJlc2VudCkpIHsKLSAgICAgICAgLy8gVGhpcyBzaG91bGQgcG9pbnQgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZQotICAgICAgICAvLyBlbmNsb3NpbmcgJ21vb2YnIGNvbnRhaW5lciBmb3IgdGhlIGZpcnN0IHRyYWNrIGFuZAotICAgICAgICAvLyB0aGUgZW5kIG9mIHRoZSBkYXRhIG9mIHRoZSBwcmVjZWRpbmcgZnJhZ21lbnQgZm9yIHN1YnNlcXVlbnQKLSAgICAgICAgLy8gdHJhY2tzLgotCi0gICAgICAgIENIRUNLX0dFKG1TdGFjay5zaXplKCksIDJ1KTsKLQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUJhc2VEYXRhT2Zmc2V0ID0KLSAgICAgICAgICAgIG1TdGFjay5pdGVtQXQobVN0YWNrLnNpemUoKSAtIDIpLm1PZmZzZXQ7Ci0KLSAgICAgICAgLy8gWFhYIFRPRE86IFRoaXMgZG9lcyBub3QgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciB0aGUgMm5kIGFuZAotICAgICAgICAvLyBzdWJzZXF1ZW50IHRyYWNrcyB5ZXQuCi0gICAgfQotCi0gICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EYXRhT2Zmc2V0ID0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1CYXNlRGF0YU9mZnNldDsKLQotICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tVHJhY2tJRCk7Ci0KLSAgICBpZiAodHJhY2tJbmZvLT5tRnJhZ21lbnRzLmVtcHR5KCkKLSAgICAgICAgICAgIHx8ICgqdHJhY2tJbmZvLT5tRnJhZ21lbnRzLmJlZ2luKCkpLT5jb21wbGV0ZSgpKSB7Ci0gICAgICAgIHRyYWNrSW5mby0+bUZyYWdtZW50cy5wdXNoX2JhY2sobmV3IER5bmFtaWNUcmFja0ZyYWdtZW50KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tGcmFnbWVudFJ1bigKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBlbnVtIHsKLSAgICAgICAga0RhdGFPZmZzZXRQcmVzZW50ICAgICAgICAgICAgICAgICAgPSAweDAxLAotICAgICAgICBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQgICAgICAgICAgICA9IDB4MDQsCi0gICAgICAgIGtTYW1wbGVEdXJhdGlvblByZXNlbnQgICAgICAgICAgICAgID0gMHgxMDAsCi0gICAgICAgIGtTYW1wbGVTaXplUHJlc2VudCAgICAgICAgICAgICAgICAgID0gMHgyMDAsCi0gICAgICAgIGtTYW1wbGVGbGFnc1ByZXNlbnQgICAgICAgICAgICAgICAgID0gMHg0MDAsCi0gICAgICAgIGtTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXRQcmVzZW50ID0gMHg4MDAsCi0gICAgfTsKLQotICAgIHVpbnQzMl90IGZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotCi0gICAgaWYgKGZsYWdzICYgMHhmZjAwMDAwMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSAmJiAoZmxhZ3MgJiBrU2FtcGxlRmxhZ3NQcmVzZW50KSkgewotICAgICAgICAvLyBUaGVzZSB0d28gc2hhbGwgbm90IGJlIHVzZWQgdG9nZXRoZXIuCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsZUNvdW50ID0gcmVhZFUzMihvZmZzZXQgKyA0KTsKLSAgICBvZmZzZXQgKz0gODsKLQotICAgIHVpbnQ2NF90IGRhdGFPZmZzZXQgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURhdGFPZmZzZXQ7Ci0KLSAgICB1aW50MzJfdCBmaXJzdFNhbXBsZUZsYWdzID0gMDsKLQotICAgIGlmIChmbGFncyAmIGtEYXRhT2Zmc2V0UHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50MzJfdCBkYXRhT2Zmc2V0RGVsdGEgPSAoaW50MzJfdClyZWFkVTMyKG9mZnNldCk7Ci0KLSAgICAgICAgZGF0YU9mZnNldCA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQgKyBkYXRhT2Zmc2V0RGVsdGE7Ci0KLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBmaXJzdFNhbXBsZUZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICB9Ci0KLSAgICBUcmFja0luZm8gKmluZm8gPSBlZGl0VHJhY2sobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1UcmFja0lEKTsKLQotICAgIGlmIChpbmZvID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgc2FtcGxlRHVyYXRpb24gPSAwLCBzYW1wbGVTaXplID0gMCwgc2FtcGxlRmxhZ3MgPSAwLAotICAgICAgICAgICAgIHNhbXBsZUN0c09mZnNldCA9IDA7Ci0KLSAgICBzaXplX3QgYnl0ZXNQZXJTYW1wbGUgPSAwOwotICAgIGlmIChmbGFncyAmIGtTYW1wbGVEdXJhdGlvblByZXNlbnQpIHsKLSAgICAgICAgYnl0ZXNQZXJTYW1wbGUgKz0gNDsKLSAgICB9IGVsc2UgaWYgKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MKLSAgICAgICAgICAgICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRHVyYXRpb25QcmVzZW50KSB7Ci0gICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRHVyYXRpb247Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBpbmZvLT5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uOwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIGtTYW1wbGVTaXplUHJlc2VudCkgewotICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OwotICAgIH0gZWxzZSBpZiAobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncwotICAgICAgICAgICAgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVTaXplUHJlc2VudCkgewotICAgICAgICBzYW1wbGVTaXplID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlU2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBzYW1wbGVTaXplID0gaW5mby0+bURlZmF1bHRTYW1wbGVTaXplOwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIGtTYW1wbGVGbGFnc1ByZXNlbnQpIHsKLSAgICAgICAgYnl0ZXNQZXJTYW1wbGUgKz0gNDsKLSAgICB9IGVsc2UgaWYgKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MKLSAgICAgICAgICAgICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgIHNhbXBsZUZsYWdzID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRmxhZ3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2FtcGxlRmxhZ3MgPSBpbmZvLT5tRGVmYXVsdFNhbXBsZUZsYWdzOwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIGtTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXRQcmVzZW50KSB7Ci0gICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSAgICBpZiAob2Zmc2V0ICsgc2FtcGxlQ291bnQgKiBieXRlc1BlclNhbXBsZSA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgc2FtcGxlRGVzY0luZGV4ID0KLSAgICAgICAgKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MKLSAgICAgICAgICAgICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtTYW1wbGVEZXNjcmlwdGlvbkluZGV4UHJlc2VudCkKLSAgICAgICAgICAgID8gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1TYW1wbGVEZXNjcmlwdGlvbkluZGV4Ci0gICAgICAgICAgICA6IGluZm8tPm1EZWZhdWx0U2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLQotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzYW1wbGVDb3VudDsgKytpKSB7Ci0gICAgICAgIGlmIChmbGFncyAmIGtTYW1wbGVEdXJhdGlvblByZXNlbnQpIHsKLSAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlU2l6ZVByZXNlbnQpIHsKLSAgICAgICAgICAgIHNhbXBsZVNpemUgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbGFncyAmIGtTYW1wbGVGbGFnc1ByZXNlbnQpIHsKLSAgICAgICAgICAgIHNhbXBsZUZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0UHJlc2VudCkgewotICAgICAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigiYWRkaW5nIHNhbXBsZSBhdCBvZmZzZXQgMHglMDhsbHgsIHNpemUgJXUsIGR1cmF0aW9uICV1LCAiCi0gICAgICAgICAgICAgICJzYW1wbGVEZXNjSW5kZXg9JXUsIGZsYWdzIDB4JTA4eCIsCi0gICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgc2FtcGxlU2l6ZSwgc2FtcGxlRHVyYXRpb24sCi0gICAgICAgICAgICAgICAgc2FtcGxlRGVzY0luZGV4LAotICAgICAgICAgICAgICAgIChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgaSA9PSAwCi0gICAgICAgICAgICAgICAgICAgID8gZmlyc3RTYW1wbGVGbGFncyA6IHNhbXBsZUZsYWdzKTsKLQotICAgICAgICBjb25zdCBzcDxUcmFja0ZyYWdtZW50PiAmZnJhZ21lbnQgPSAqLS1pbmZvLT5tRnJhZ21lbnRzLmVuZCgpOwotCi0gICAgICAgIHVpbnQzMl90IGRlY29kaW5nVGltZSA9IGluZm8tPm1EZWNvZGluZ1RpbWU7Ci0gICAgICAgIGluZm8tPm1EZWNvZGluZ1RpbWUgKz0gc2FtcGxlRHVyYXRpb247Ci0gICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvblRpbWUgPSBkZWNvZGluZ1RpbWUgKyBzYW1wbGVDdHNPZmZzZXQ7Ci0KLSAgICAgICAgc3RhdGljX2Nhc3Q8RHluYW1pY1RyYWNrRnJhZ21lbnQgKj4oCi0gICAgICAgICAgICAgICAgZnJhZ21lbnQuZ2V0KCkpLT5hZGRTYW1wbGUoCi0gICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvblRpbWUsCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgKChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgaSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBmaXJzdFNhbXBsZUZsYWdzIDogc2FtcGxlRmxhZ3MpOwotCi0gICAgICAgIGRhdGFPZmZzZXQgKz0gc2FtcGxlU2l6ZTsKLSAgICB9Ci0KLSAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURhdGFPZmZzZXQgPSBkYXRhT2Zmc2V0OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OmNvcHlCdWZmZXIoCi0gICAgICAgIHNwPEFCdWZmZXI+ICpkc3QsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIGNvbnN0IHsKLSAgICBzcDxBQnVmZmVyPiBidWYgPSBuZXcgQUJ1ZmZlcihzaXplKTsKLSAgICBtZW1jcHkoYnVmLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwgc2l6ZSk7Ci0KLSAgICAqZHN0ID0gYnVmOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L1RyYWNrRnJhZ21lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L1RyYWNrRnJhZ21lbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjk5MDM4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9UcmFja0ZyYWdtZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJUcmFja0ZyYWdtZW50IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiVHJhY2tGcmFnbWVudC5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6OkR5bmFtaWNUcmFja0ZyYWdtZW50KCkKLSAgICA6IG1Db21wbGV0ZShmYWxzZSksCi0gICAgICBtU2FtcGxlSW5kZXgoMCkgewotfQotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6fkR5bmFtaWNUcmFja0ZyYWdtZW50KCkgewotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6Z2V0U2FtcGxlKFNhbXBsZUluZm8gKmluZm8pIHsKLSAgICBpZiAobVNhbXBsZUluZGV4ID49IG1TYW1wbGVzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gbUNvbXBsZXRlID8gRVJST1JfRU5EX09GX1NUUkVBTSA6IC1FV09VTERCTE9DSzsKLSAgICB9Ci0KLSAgICAqaW5mbyA9IG1TYW1wbGVzLml0ZW1BdChtU2FtcGxlSW5kZXgpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50OjphZHZhbmNlKCkgewotICAgICsrbVNhbXBsZUluZGV4OwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50OjphZGRTYW1wbGUoCi0gICAgICAgIG9mZjY0X3QgZGF0YU9mZnNldCwgc2l6ZV90IHNhbXBsZVNpemUsCi0gICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvblRpbWUsCi0gICAgICAgIHNpemVfdCBzYW1wbGVEZXNjSW5kZXgsCi0gICAgICAgIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgbVNhbXBsZXMucHVzaCgpOwotICAgIFNhbXBsZUluZm8gKnNhbXBsZUluZm8gPSAmbVNhbXBsZXMuZWRpdEl0ZW1BdChtU2FtcGxlcy5zaXplKCkgLSAxKTsKLQotICAgIHNhbXBsZUluZm8tPm1PZmZzZXQgPSBkYXRhT2Zmc2V0OwotICAgIHNhbXBsZUluZm8tPm1TaXplID0gc2FtcGxlU2l6ZTsKLSAgICBzYW1wbGVJbmZvLT5tUHJlc2VudGF0aW9uVGltZSA9IHByZXNlbnRhdGlvblRpbWU7Ci0gICAgc2FtcGxlSW5mby0+bVNhbXBsZURlc2NJbmRleCA9IHNhbXBsZURlc2NJbmRleDsKLSAgICBzYW1wbGVJbmZvLT5tRmxhZ3MgPSBmbGFnczsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6OnNpZ25hbENvbXBsZXRpb24oKSB7Ci0gICAgbUNvbXBsZXRlID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6Y29tcGxldGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Db21wbGV0ZTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6U3RhdGljVHJhY2tGcmFnbWVudCgpCi0gICAgOiBtU2FtcGxlSW5kZXgoMCksCi0gICAgICBtU2FtcGxlQ291bnQoMCksCi0gICAgICBtQ2h1bmtJbmRleCgwKSwKLSAgICAgIG1TYW1wbGVUb0NodW5rSW5kZXgoLTEpLAotICAgICAgbVNhbXBsZVRvQ2h1bmtSZW1haW5pbmcoMCksCi0gICAgICBtUHJldkNodW5rSW5kZXgoMHhmZmZmZmZmZiksCi0gICAgICBtTmV4dFNhbXBsZU9mZnNldCgwKSB7Ci19Ci0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6On5TdGF0aWNUcmFja0ZyYWdtZW50KCkgewotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpnZXRTYW1wbGUoU2FtcGxlSW5mbyAqaW5mbykgewotICAgIGlmIChtU2FtcGxlSW5kZXggPj0gbVNhbXBsZUNvdW50KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgICppbmZvID0gbVNhbXBsZUluZm87Ci0KLSAgICBBTE9HVigicmV0dXJuaW5nIHNhbXBsZSAlZCBhdCBbMHglMDhsbHgsIDB4JTA4bGx4KSIsCi0gICAgICAgICAgbVNhbXBsZUluZGV4LAotICAgICAgICAgIGluZm8tPm1PZmZzZXQsIGluZm8tPm1PZmZzZXQgKyBpbmZvLT5tU2l6ZSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6dXBkYXRlU2FtcGxlSW5mbygpIHsKLSAgICBpZiAobVNhbXBsZUluZGV4ID49IG1TYW1wbGVDb3VudCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1TYW1wbGVTaXplcyAhPSBOVUxMKSB7Ci0gICAgICAgIHVpbnQzMl90IGRlZmF1bHRTYW1wbGVTaXplID0gVTMyX0FUKG1TYW1wbGVTaXplcy0+ZGF0YSgpICsgNCk7Ci0gICAgICAgIGlmIChkZWZhdWx0U2FtcGxlU2l6ZSA+IDApIHsKLSAgICAgICAgICAgIG1TYW1wbGVJbmZvLm1TaXplID0gZGVmYXVsdFNhbXBsZVNpemU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU2FtcGxlSW5mby5tU2l6ZT0gVTMyX0FUKG1TYW1wbGVTaXplcy0+ZGF0YSgpICsgMTIgKyA0ICogbVNhbXBsZUluZGV4KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLKG1Db21wYWN0U2FtcGxlU2l6ZXMgIT0gTlVMTCk7Ci0KLSAgICAgICAgdWludDMyX3QgZmllbGRTaXplID0gVTMyX0FUKG1Db21wYWN0U2FtcGxlU2l6ZXMtPmRhdGEoKSArIDQpOwotCi0gICAgICAgIHN3aXRjaCAoZmllbGRTaXplKSB7Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgYnl0ZSA9IG1Db21wYWN0U2FtcGxlU2l6ZXMtPmRhdGEoKVsxMiArIG1TYW1wbGVJbmRleCAvIDJdOwotICAgICAgICAgICAgICAgIG1TYW1wbGVJbmZvLm1TaXplID0gKG1TYW1wbGVJbmRleCAmIDEpID8gYnl0ZSAmIDB4MGYgOiBieXRlID4+IDQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtU2FtcGxlSW5mby5tU2l6ZSA9IG1Db21wYWN0U2FtcGxlU2l6ZXMtPmRhdGEoKVsxMiArIG1TYW1wbGVJbmRleF07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZmllbGRTaXplLCAxNik7Ci0gICAgICAgICAgICAgICAgbVNhbXBsZUluZm8ubVNpemUgPQotICAgICAgICAgICAgICAgICAgICBVMTZfQVQobUNvbXBhY3RTYW1wbGVTaXplcy0+ZGF0YSgpICsgMTIgKyBtU2FtcGxlSW5kZXggKiAyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIENIRUNLX0dUKG1TYW1wbGVUb0NodW5rUmVtYWluaW5nLCAwKTsKLQotICAgIC8vIFRoZSBzYW1wbGUgZGVzYyBpbmRleCBpcyAxLWJhc2VkLi4uIFhYWAotICAgIG1TYW1wbGVJbmZvLm1TYW1wbGVEZXNjSW5kZXggPQotICAgICAgICBVMzJfQVQobVNhbXBsZVRvQ2h1bmstPmRhdGEoKSArIDggKyAxMiAqIG1TYW1wbGVUb0NodW5rSW5kZXggKyA4KTsKLQotICAgIGlmIChtQ2h1bmtJbmRleCAhPSBtUHJldkNodW5rSW5kZXgpIHsKLSAgICAgICAgbVByZXZDaHVua0luZGV4ID0gbUNodW5rSW5kZXg7Ci0KLSAgICAgICAgaWYgKG1DaHVua09mZnNldHMgIT0gTlVMTCkgewotICAgICAgICAgICAgdWludDMyX3QgZW50cnlDb3VudCA9IFUzMl9BVChtQ2h1bmtPZmZzZXRzLT5kYXRhKCkgKyA0KTsKLQotICAgICAgICAgICAgaWYgKG1DaHVua0luZGV4ID49IGVudHJ5Q291bnQpIHsKLSAgICAgICAgICAgICAgICBtU2FtcGxlSW5kZXggPSBtU2FtcGxlQ291bnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTmV4dFNhbXBsZU9mZnNldCA9Ci0gICAgICAgICAgICAgICAgVTMyX0FUKG1DaHVua09mZnNldHMtPmRhdGEoKSArIDggKyA0ICogbUNodW5rSW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0hFQ0sobUNodW5rT2Zmc2V0czY0ICE9IE5VTEwpOwotCi0gICAgICAgICAgICB1aW50MzJfdCBlbnRyeUNvdW50ID0gVTMyX0FUKG1DaHVua09mZnNldHM2NC0+ZGF0YSgpICsgNCk7Ci0KLSAgICAgICAgICAgIGlmIChtQ2h1bmtJbmRleCA+PSBlbnRyeUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbVNhbXBsZUluZGV4ID0gbVNhbXBsZUNvdW50OwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU5leHRTYW1wbGVPZmZzZXQgPQotICAgICAgICAgICAgICAgIFU2NF9BVChtQ2h1bmtPZmZzZXRzNjQtPmRhdGEoKSArIDggKyA4ICogbUNodW5rSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbVNhbXBsZUluZm8ubU9mZnNldCA9IG1OZXh0U2FtcGxlT2Zmc2V0OwotCi0gICAgbVNhbXBsZUluZm8ubVByZXNlbnRhdGlvblRpbWUgPSAwOwotICAgIG1TYW1wbGVJbmZvLm1GbGFncyA9IDA7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6YWR2YW5jZSgpIHsKLSAgICBtTmV4dFNhbXBsZU9mZnNldCArPSBtU2FtcGxlSW5mby5tU2l6ZTsKLQotICAgICsrbVNhbXBsZUluZGV4OwotICAgIGlmICgtLW1TYW1wbGVUb0NodW5rUmVtYWluaW5nID09IDApIHsKLSAgICAgICAgKyttQ2h1bmtJbmRleDsKLQotICAgICAgICB1aW50MzJfdCBlbnRyeUNvdW50ID0gVTMyX0FUKG1TYW1wbGVUb0NodW5rLT5kYXRhKCkgKyA0KTsKLQotICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBzYW1wbGUgdG8gY2h1bmsgdGFibGUsIHdlIHdpbGwKLSAgICAgICAgLy8gc3RheSBvbiB0aGlzIGVudHJ5LgotICAgICAgICBpZiAoKHVpbnQzMl90KShtU2FtcGxlVG9DaHVua0luZGV4ICsgMSkgPCBlbnRyeUNvdW50KSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBuZXh0Q2h1bmtJbmRleCA9Ci0gICAgICAgICAgICAgICAgVTMyX0FUKG1TYW1wbGVUb0NodW5rLT5kYXRhKCkgKyA4ICsgMTIgKiAobVNhbXBsZVRvQ2h1bmtJbmRleCArIDEpKTsKLQotICAgICAgICAgICAgQ0hFQ0tfR0UobmV4dENodW5rSW5kZXgsIDF1KTsKLSAgICAgICAgICAgIC0tbmV4dENodW5rSW5kZXg7Ci0KLSAgICAgICAgICAgIGlmIChtQ2h1bmtJbmRleCA+PSBuZXh0Q2h1bmtJbmRleCkgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKG1DaHVua0luZGV4LCBuZXh0Q2h1bmtJbmRleCk7Ci0gICAgICAgICAgICAgICAgKyttU2FtcGxlVG9DaHVua0luZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbVNhbXBsZVRvQ2h1bmtSZW1haW5pbmcgPQotICAgICAgICAgICAgVTMyX0FUKG1TYW1wbGVUb0NodW5rLT5kYXRhKCkgKyA4ICsgMTIgKiBtU2FtcGxlVG9DaHVua0luZGV4ICsgNCk7Ci0gICAgfQotCi0gICAgdXBkYXRlU2FtcGxlSW5mbygpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRVMzJBdCh1aW50OF90ICpwdHIsIHVpbnQzMl90IHgpIHsKLSAgICBwdHJbMF0gPSB4ID4+IDI0OwotICAgIHB0clsxXSA9ICh4ID4+IDE2KSAmIDB4ZmY7Ci0gICAgcHRyWzJdID0gKHggPj4gOCkgJiAweGZmOwotICAgIHB0clszXSA9IHggJiAweGZmOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpzaWduYWxDb21wbGV0aW9uKCkgewotICAgIG1TYW1wbGVUb0NodW5rSW5kZXggPSAwOwotCi0gICAgbVNhbXBsZVRvQ2h1bmtSZW1haW5pbmcgPQotICAgICAgICAobVNhbXBsZVRvQ2h1bmsgPT0gTlVMTCkKLSAgICAgICAgICAgID8gMAotICAgICAgICAgICAgOiBVMzJfQVQobVNhbXBsZVRvQ2h1bmstPmRhdGEoKSArIDggKyAxMiAqIG1TYW1wbGVUb0NodW5rSW5kZXggKyA0KTsKLQotICAgIHVwZGF0ZVNhbXBsZUluZm8oKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50Ojpjb21wbGV0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6cGFyc2VTYW1wbGVTaXplcygKLSAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDEyID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChwYXJzZXItPnJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgc2FtcGxlU2l6ZSA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA0KTsKLSAgICB1aW50MzJfdCBzYW1wbGVDb3VudCA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA4KTsKLQotICAgIGlmIChzYW1wbGVTaXplID09IDAgJiYgb2Zmc2V0ICsgMTIgKyBzYW1wbGVDb3VudCAqIDQgIT0gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHBhcnNlci0+Y29weUJ1ZmZlcigmbVNhbXBsZVNpemVzLCBvZmZzZXQsIHNpemUpOwotCi0gICAgbVNhbXBsZUNvdW50ID0gc2FtcGxlQ291bnQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnBhcnNlQ29tcGFjdFNhbXBsZVNpemVzKAotICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgMTIgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHBhcnNlci0+cmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmaWVsZFNpemUgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0KLSAgICBpZiAoZmllbGRTaXplICE9IDQgJiYgZmllbGRTaXplICE9IDggJiYgZmllbGRTaXplICE9IDE2KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgc2FtcGxlQ291bnQgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgOCk7Ci0KLSAgICBpZiAob2Zmc2V0ICsgMTIgKyAoc2FtcGxlQ291bnQgKiBmaWVsZFNpemUgKyA0KSAvIDggIT0gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHBhcnNlci0+Y29weUJ1ZmZlcigmbUNvbXBhY3RTYW1wbGVTaXplcywgb2Zmc2V0LCBzaXplKTsKLQotICAgIG1TYW1wbGVDb3VudCA9IHNhbXBsZUNvdW50OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpwYXJzZVNhbXBsZVRvQ2h1bmsoCi0gICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChwYXJzZXItPnJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZW50cnlDb3VudCA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA0KTsKLQotICAgIGlmIChlbnRyeUNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChvZmZzZXQgKyA4ICsgZW50cnlDb3VudCAqIDEyICE9IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwYXJzZXItPmNvcHlCdWZmZXIoJm1TYW1wbGVUb0NodW5rLCBvZmZzZXQsIHNpemUpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpwYXJzZUNodW5rT2Zmc2V0cygKLSAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHBhcnNlci0+cmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBlbnRyeUNvdW50ID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDQpOwotCi0gICAgaWYgKG9mZnNldCArIDggKyBlbnRyeUNvdW50ICogNCAhPSBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5jb3B5QnVmZmVyKCZtQ2h1bmtPZmZzZXRzLCBvZmZzZXQsIHNpemUpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpwYXJzZUNodW5rT2Zmc2V0czY0KAotICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAocGFyc2VyLT5yZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IGVudHJ5Q291bnQgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0KLSAgICBpZiAob2Zmc2V0ICsgOCArIGVudHJ5Q291bnQgKiA4ICE9IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwYXJzZXItPmNvcHlCdWZmZXIoJm1DaHVua09mZnNldHM2NCwgb2Zmc2V0LCBzaXplKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L1RyYWNrRnJhZ21lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9UcmFja0ZyYWdtZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYWQ0NmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L1RyYWNrRnJhZ21lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUUkFDS19GUkFHTUVOVF9IXwotCi0jZGVmaW5lIFRSQUNLX0ZSQUdNRU5UX0hfCi0KLSNpbmNsdWRlICJpbmNsdWRlL0ZyYWdtZW50ZWRNUDRQYXJzZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6VHJhY2tGcmFnbWVudCA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBUcmFja0ZyYWdtZW50KCkge30KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlKFNhbXBsZUluZm8gKmluZm8pID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZSgpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbmFsQ29tcGxldGlvbigpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgY29tcGxldGUoKSBjb25zdCA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5UcmFja0ZyYWdtZW50KCkge30KLQotcHJpdmF0ZToKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUcmFja0ZyYWdtZW50KTsKLX07Ci0KLXN0cnVjdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudCA6IHB1YmxpYyBGcmFnbWVudGVkTVA0UGFyc2VyOjpUcmFja0ZyYWdtZW50IHsKLSAgICBEeW5hbWljVHJhY2tGcmFnbWVudCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGUoU2FtcGxlSW5mbyAqaW5mbyk7Ci0gICAgdmlydHVhbCB2b2lkIGFkdmFuY2UoKTsKLQotICAgIHZvaWQgYWRkU2FtcGxlKAotICAgICAgICAgICAgb2ZmNjRfdCBkYXRhT2Zmc2V0LCBzaXplX3Qgc2FtcGxlU2l6ZSwKLSAgICAgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvblRpbWUsCi0gICAgICAgICAgICBzaXplX3Qgc2FtcGxlRGVzY0luZGV4LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgLy8gTm8gbW9yZSBzYW1wbGVzIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyBmcmFnbWVudC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25hbENvbXBsZXRpb24oKTsKLQotICAgIHZpcnR1YWwgYm9vbCBjb21wbGV0ZSgpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RHluYW1pY1RyYWNrRnJhZ21lbnQoKTsKLQotcHJpdmF0ZToKLSAgICBib29sIG1Db21wbGV0ZTsKLSAgICBzaXplX3QgbVNhbXBsZUluZGV4OwotICAgIFZlY3RvcjxTYW1wbGVJbmZvPiBtU2FtcGxlczsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKER5bmFtaWNUcmFja0ZyYWdtZW50KTsKLX07Ci0KLXN0cnVjdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50IDogcHVibGljIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlRyYWNrRnJhZ21lbnQgewotICAgIFN0YXRpY1RyYWNrRnJhZ21lbnQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlKFNhbXBsZUluZm8gKmluZm8pOwotICAgIHZpcnR1YWwgdm9pZCBhZHZhbmNlKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25hbENvbXBsZXRpb24oKTsKLSAgICB2aXJ0dWFsIGJvb2wgY29tcGxldGUoKSBjb25zdDsKLQotICAgIHN0YXR1c190IHBhcnNlU2FtcGxlU2l6ZXMoCi0gICAgICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDb21wYWN0U2FtcGxlU2l6ZXMoCi0gICAgICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVUb0NodW5rKAotICAgICAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQ2h1bmtPZmZzZXRzKAotICAgICAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQ2h1bmtPZmZzZXRzNjQoCi0gICAgICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+U3RhdGljVHJhY2tGcmFnbWVudCgpOwotCi1wcml2YXRlOgotICAgIHNpemVfdCBtU2FtcGxlSW5kZXg7Ci0gICAgc2l6ZV90IG1TYW1wbGVDb3VudDsKLSAgICB1aW50MzJfdCBtQ2h1bmtJbmRleDsKLQotICAgIFNhbXBsZUluZm8gbVNhbXBsZUluZm87Ci0KLSAgICBzcDxBQnVmZmVyPiBtU2FtcGxlU2l6ZXM7Ci0gICAgc3A8QUJ1ZmZlcj4gbUNvbXBhY3RTYW1wbGVTaXplczsKLQotICAgIHNwPEFCdWZmZXI+IG1TYW1wbGVUb0NodW5rOwotICAgIHNzaXplX3QgbVNhbXBsZVRvQ2h1bmtJbmRleDsKLSAgICBzaXplX3QgbVNhbXBsZVRvQ2h1bmtSZW1haW5pbmc7Ci0KLSAgICBzcDxBQnVmZmVyPiBtQ2h1bmtPZmZzZXRzOwotICAgIHNwPEFCdWZmZXI+IG1DaHVua09mZnNldHM2NDsKLSAgICB1aW50MzJfdCBtUHJldkNodW5rSW5kZXg7Ci0gICAgdWludDY0X3QgbU5leHRTYW1wbGVPZmZzZXQ7Ci0KLSAgICB2b2lkIHVwZGF0ZVNhbXBsZUluZm8oKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFN0YXRpY1RyYWNrRnJhZ21lbnQpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBUUkFDS19GUkFHTUVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCmluZGV4IGNiNTdhMmYuLjZkODg2NmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKQEAgLTM2LDYgKzM2LDggQEAKICNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gSSB3YW50IHRoZSBleHByZXNzaW9uICJ5IiBldmFsdWF0ZWQgZXZlbiBpZiB2ZXJib3NlIGxvZ2dpbmcgaXMgb2ZmLgpAQCAtNTAxLDExICs1MDMsNyBAQAogICAgICAgICAgICAgICAgICAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWU6Ok1QRUc0X1ZJREVPKTsKICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgU1RSRUFNVFlQRV9QQ01fQVVESU86Ci0gICAgICAgICAgICBtUXVldWUgPSBuZXcgRWxlbWVudGFyeVN0cmVhbVF1ZXVlKAotICAgICAgICAgICAgICAgICAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OlBDTV9BVURJTyk7Ci0gICAgICAgICAgICBicmVhazsKLQorICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTFBDTV9BQzM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BQzM6CiAgICAgICAgICAgICBtUXVldWUgPSBuZXcgRWxlbWVudGFyeVN0cmVhbVF1ZXVlKAogICAgICAgICAgICAgICAgICAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkFDMyk7CkBAIC01NTMsNyArNTUxLDkgQEAKICAgICAgICAgfQogI2VuZGlmCiAKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBpZiAoIXBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIG1FeHBlY3RlZENvbnRpbnVpdHlDb3VudGVyID0gKGNvbnRpbnVpdHlfY291bnRlciArIDEpICYgMHgwZjsKQEAgLTU4Niw3ICs1ODYsNyBAQAogICAgICAgICAvLyBJbmNyZW1lbnQgaW4gbXVsdGlwbGVzIG9mIDY0Sy4KICAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgNjU1MzUpICYgfjY1NTM1OwogCi0gICAgICAgIEFMT0dJKCJyZXNpemluZyBidWZmZXIgdG8gJWQgYnl0ZXMiLCBuZWVkZWRTaXplKTsKKyAgICAgICAgQUxPR0koInJlc2l6aW5nIGJ1ZmZlciB0byAlenUgYnl0ZXMiLCBuZWVkZWRTaXplKTsKIAogICAgICAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZWVkZWRTaXplKTsKICAgICAgICAgbWVtY3B5KG5ld0J1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CkBAIC02MTgsNyArNjE4LDcgQEAKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01QRUcxX0FVRElPOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTVBFRzJfQVVESU86CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMl9BVURJT19BRFRTOgotICAgICAgICBjYXNlIFNUUkVBTVRZUEVfUENNX0FVRElPOgorICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTFBDTV9BQzM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BQzM6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIApAQCAtNjY1LDcgKzY2NSw3IEBACiAgICAgfQogCiAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkodHlwZSwgZXh0cmEpOworICAgICAgICBtU291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkodHlwZSwgZXh0cmEsIHRydWUpOwogICAgIH0KIH0KIApAQCAtNzQ4LDcgKzc0OCw3IEBACiAgICAgICAgICAgICBQVFMgfD0gYnItPmdldEJpdHMoMTUpOwogICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKIAotICAgICAgICAgICAgQUxPR1YoIlBUUyA9IDB4JTAxNmxseCAoJS4yZikiLCBQVFMsIFBUUyAvIDkwMDAwLjApOworICAgICAgICAgICAgQUxPR1YoIlBUUyA9IDB4JTAxNiIgUFJJeDY0ICIgKCUuMmYpIiwgUFRTLCBQVFMgLyA5MDAwMC4wKTsKIAogICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDU7CiAKQEAgLTc2NCw3ICs3NjQsNyBAQAogICAgICAgICAgICAgICAgIERUUyB8PSBici0+Z2V0Qml0cygxNSk7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKIAotICAgICAgICAgICAgICAgIEFMT0dWKCJEVFMgPSAlbGx1IiwgRFRTKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiRFRTID0gJSIgUFJJdTY0LCBEVFMpOwogCiAgICAgICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDU7CiAgICAgICAgICAgICB9CkBAIC03ODIsNyArNzgyLDcgQEAKICAgICAgICAgICAgIEVTQ1IgfD0gYnItPmdldEJpdHMoMTUpOwogICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKIAotICAgICAgICAgICAgQUxPR1YoIkVTQ1IgPSAlbGx1IiwgRVNDUik7CisgICAgICAgICAgICBBTE9HVigiRVNDUiA9ICUiIFBSSXU2NCwgRVNDUik7CiAgICAgICAgICAgICBNWV9MT0dWKCJFU0NSX2V4dGVuc2lvbiA9ICV1IiwgYnItPmdldEJpdHMoOSkpOwogCiAgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOwpAQCAtODEyLDcgKzgxMiw3IEBACiAKICAgICAgICAgICAgIGlmIChici0+bnVtQml0c0xlZnQoKSA8IGRhdGFMZW5ndGggKiA4KSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIlBFUyBwYWNrZXQgZG9lcyBub3QgY2FycnkgZW5vdWdoIGRhdGEgdG8gY29udGFpbiAiCi0gICAgICAgICAgICAgICAgICAgICAicGF5bG9hZC4gKG51bUJpdHNMZWZ0ID0gJWQsIHJlcXVpcmVkID0gJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICJwYXlsb2FkLiAobnVtQml0c0xlZnQgPSAlenUsIHJlcXVpcmVkID0gJXUpIiwKICAgICAgICAgICAgICAgICAgICAgIGJyLT5udW1CaXRzTGVmdCgpLCBkYXRhTGVuZ3RoICogOCk7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtODMyLDcgKzgzMiw3IEBACiAgICAgICAgICAgICBzaXplX3QgcGF5bG9hZFNpemVCaXRzID0gYnItPm51bUJpdHNMZWZ0KCk7CiAgICAgICAgICAgICBDSEVDS19FUShwYXlsb2FkU2l6ZUJpdHMgJSA4LCAwdSk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJUaGVyZSdzICVkIGJ5dGVzIG9mIHBheWxvYWQuIiwgcGF5bG9hZFNpemVCaXRzIC8gOCk7CisgICAgICAgICAgICBBTE9HVigiVGhlcmUncyAlenUgYnl0ZXMgb2YgcGF5bG9hZC4iLCBwYXlsb2FkU2l6ZUJpdHMgLyA4KTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoc3RyZWFtX2lkID09IDB4YmUpIHsgIC8vIHBhZGRpbmdfc3RyZWFtCiAgICAgICAgIENIRUNLX05FKFBFU19wYWNrZXRfbGVuZ3RoLCAwdSk7CkBAIC04NTAsNyArODUwLDcgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIEFMT0dWKCJmbHVzaGluZyBzdHJlYW0gMHglMDR4IHNpemUgPSAlZCIsIG1FbGVtZW50YXJ5UElELCBtQnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWKCJmbHVzaGluZyBzdHJlYW0gMHglMDR4IHNpemUgPSAlenUiLCBtRWxlbWVudGFyeVBJRCwgbUJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgIEFCaXRSZWFkZXIgYnIobUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOwogCkBAIC04NjIsNyArODYyLDcgQEAKIH0KIAogdm9pZCBBVFNQYXJzZXI6OlN0cmVhbTo6b25QYXlsb2FkRGF0YSgKLSAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywgdWludDY0X3QgUFRTLCB1aW50NjRfdCBEVFMsCisgICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MsIHVpbnQ2NF90IFBUUywgdWludDY0X3QgLyogRFRTICovLAogICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogI2lmIDAKICAgICBBTE9HSSgicGF5bG9hZCBzdHJlYW1UeXBlIDB4JTAyeCwgUFRTID0gMHglMDE2bGx4LCBkUFRTID0gJWxsZCIsCkBAIC04OTQsNiArODk0LDEyIEBACiAgICAgICAgICAgICAgICAgQUxPR1YoIlN0cmVhbSBQSUQgMHglMDh4IG9mIHR5cGUgMHglMDJ4IG5vdyBoYXMgZGF0YS4iLAogICAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG1TdHJlYW1UeXBlKTsKIAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhSXNJRFIoYWNjZXNzVW5pdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1Tb3VyY2UgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKICAgICAgICAgICAgICAgICBtU291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CiAgICAgICAgICAgICB9CkBAIC0xMTcyLDcgKzExNzgsNyBAQAogCiAgICAgICAgICAgICB1aW50NjRfdCBQQ1IgPSBQQ1JfYmFzZSAqIDMwMCArIFBDUl9leHQ7CiAKLSAgICAgICAgICAgIEFMT0dWKCJQSUQgMHglMDR4OiBQQ1IgPSAweCUwMTZsbHggKCUuMmYpIiwKKyAgICAgICAgICAgIEFMT0dWKCJQSUQgMHglMDR4OiBQQ1IgPSAweCUwMTYiIFBSSXg2NCAiICglLjJmKSIsCiAgICAgICAgICAgICAgICAgICBQSUQsIFBDUiwgUENSIC8gMjdFNik7CiAKICAgICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgYnkgdGhpcyBwYXJzZXIgdXAgdG8gYW5kCkBAIC0xMjY3LDggKzEyNzMsOCBAQAogfQogCiB2b2lkIEFUU1BhcnNlcjo6dXBkYXRlUENSKAotICAgICAgICB1bnNpZ25lZCBQSUQsIHVpbnQ2NF90IFBDUiwgc2l6ZV90IGJ5dGVPZmZzZXRGcm9tU3RhcnQpIHsKLSAgICBBTE9HVigiUENSIDB4JTAxNmxseCBAICVkIiwgUENSLCBieXRlT2Zmc2V0RnJvbVN0YXJ0KTsKKyAgICAgICAgdW5zaWduZWQgLyogUElEICovLCB1aW50NjRfdCBQQ1IsIHNpemVfdCBieXRlT2Zmc2V0RnJvbVN0YXJ0KSB7CisgICAgQUxPR1YoIlBDUiAweCUwMTYiIFBSSXg2NCAiIEAgJXp1IiwgUENSLCBieXRlT2Zmc2V0RnJvbVN0YXJ0KTsKIAogICAgIGlmIChtTnVtUENScyA9PSAyKSB7CiAgICAgICAgIG1QQ1JbMF0gPSBtUENSWzFdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggODZiMDI1Zi4uODk4NmEyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC05Myw3ICs5Myw5IEBACiAgICAgICAgIC8vIEZyb20gQVRTQyBBLzUzIFBhcnQgMzoyMDA5LCA2LjcuMQogICAgICAgICBTVFJFQU1UWVBFX0FDMyAgICAgICAgICAgICAgICAgID0gMHg4MSwKIAotICAgICAgICBTVFJFQU1UWVBFX1BDTV9BVURJTyAgICAgICAgICAgID0gMHg4MywKKyAgICAgICAgLy8gU3RyZWFtIHR5cGUgMHg4MyBpcyBub24tc3RhbmRhcmQsCisgICAgICAgIC8vIGl0IGNvdWxkIGJlIExQQ00gb3IgVHJ1ZUhEIEFDMworICAgICAgICBTVFJFQU1UWVBFX0xQQ01fQUMzICAgICAgICAgICAgID0gMHg4MywKICAgICB9OwogCiBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKaW5kZXggYzFhN2E5ZC4uYzE3YTBiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tawpAQCAtMTMsNiArMTMsOCBAQAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X21wZWcydHMKIAogaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKaW5kZXggMmIwYmYzMC4uYTAzZjZmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCkBAIC0xNCw2ICsxNCw5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFub3RoZXJQYWNrZXRTb3VyY2UiCisKICNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KQEAgLTI2LDE2ICsyOSwyMSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNvbnN0IGludDY0X3Qga05lYXJFT1NNYXJrVXMgPSAyMDAwMDAwbGw7IC8vIDIgc2VjcwogCiBBbm90aGVyUGFja2V0U291cmNlOjpBbm90aGVyUGFja2V0U291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkKICAgICA6IG1Jc0F1ZGlvKGZhbHNlKSwKKyAgICAgIG1Jc1ZpZGVvKGZhbHNlKSwKICAgICAgIG1Gb3JtYXQoTlVMTCksCiAgICAgICBtTGFzdFF1ZXVlZFRpbWVVcygwKSwKICAgICAgIG1FT1NSZXN1bHQoT0spLAotICAgICAgbUxhdGVzdEVucXVldWVkTWV0YShOVUxMKSB7CisgICAgICBtTGF0ZXN0RW5xdWV1ZWRNZXRhKE5VTEwpLAorICAgICAgbUxhdGVzdERlcXVldWVkTWV0YShOVUxMKSwKKyAgICAgIG1RdWV1ZWREaXNjb250aW51aXR5Q291bnQoMCkgewogICAgIHNldEZvcm1hdChtZXRhKTsKIH0KIApAQCAtNDMsNiArNTEsNyBAQAogICAgIENIRUNLKG1Gb3JtYXQgPT0gTlVMTCk7CiAKICAgICBtSXNBdWRpbyA9IGZhbHNlOworICAgIG1Jc1ZpZGVvID0gZmFsc2U7CiAKICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTU0LDE1ICs2MywxNyBAQAogCiAgICAgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgbUlzQXVkaW8gPSB0cnVlOworICAgIH0gZWxzZSAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKKyAgICAgICAgbUlzVmlkZW8gPSB0cnVlOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpOworICAgICAgICBDSEVDSyghc3RybmNhc2VjbXAoInRleHQvIiwgbWltZSwgNSkpOwogICAgIH0KIH0KIAogQW5vdGhlclBhY2tldFNvdXJjZTo6fkFub3RoZXJQYWNrZXRTb3VyY2UoKSB7CiB9CiAKLXN0YXR1c190IEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC04Niw3ICs5Nyw3IEBACiAKICAgICAgICAgc3A8UmVmQmFzZT4gb2JqZWN0OwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoImZvcm1hdCIsICZvYmplY3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihvYmplY3QuZ2V0KCkpOworICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXQgPSBzdGF0aWNfY2FzdDxNZXRhRGF0YSo+KG9iamVjdC5nZXQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICArK2l0OwpAQCAtMTEyLDkgKzEyMywxMiBAQAogICAgICAgICAgICAgICAgIG1Gb3JtYXQuY2xlYXIoKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLS1tUXVldWVkRGlzY29udGludWl0eUNvdW50OwogICAgICAgICAgICAgcmV0dXJuIElORk9fRElTQ09OVElOVUlUWTsKICAgICAgICAgfQogCisgICAgICAgIG1MYXRlc3REZXF1ZXVlZE1ldGEgPSAoKmJ1ZmZlciktPm1ldGEoKS0+ZHVwKCk7CisKICAgICAgICAgc3A8UmVmQmFzZT4gb2JqZWN0OwogICAgICAgICBpZiAoKCpidWZmZXIpLT5tZXRhKCktPmZpbmRPYmplY3QoImZvcm1hdCIsICZvYmplY3QpKSB7CiAgICAgICAgICAgICBtRm9ybWF0ID0gc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihvYmplY3QuZ2V0KCkpOwpAQCAtMTM2LDggKzE1MCwxMCBAQAogICAgIH0KIAogICAgIGlmICghbUJ1ZmZlcnMuZW1wdHkoKSkgeworCiAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICptQnVmZmVycy5iZWdpbigpOwogICAgICAgICBtQnVmZmVycy5lcmFzZShtQnVmZmVycy5iZWdpbigpKTsKKyAgICAgICAgbUxhdGVzdERlcXVldWVkTWV0YSA9IGJ1ZmZlci0+bWV0YSgpLT5kdXAoKTsKIAogICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHk7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7CkBAIC0xNzMsNyArMTg5LDExIEBACiAgICAgICAgIHJldHVybiAoZGlzY29udGludWl0eVR5cGUgJiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfQVVESU9fRk9STUFUKSAhPSAwOwogICAgIH0KIAotICAgIHJldHVybiAoZGlzY29udGludWl0eVR5cGUgJiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVklERU9fRk9STUFUKSAhPSAwOworICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICByZXR1cm4gKGRpc2NvbnRpbnVpdHlUeXBlICYgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1ZJREVPX0ZPUk1BVCkgIT0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQW5vdGhlclBhY2tldFNvdXJjZTo6cXVldWVBY2Nlc3NVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKQEAgLTE4NiwxMyArMjA2LDE4IEBACiAgICAgaW50NjRfdCBsYXN0UXVldWVkVGltZVVzOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZsYXN0UXVldWVkVGltZVVzKSk7CiAgICAgbUxhc3RRdWV1ZWRUaW1lVXMgPSBsYXN0UXVldWVkVGltZVVzOwotICAgIEFMT0dWKCJxdWV1ZUFjY2Vzc1VuaXQgdGltZVVzPSVsbGQgdXMgKCUuMmYgc2VjcykiLCBtTGFzdFF1ZXVlZFRpbWVVcywgbUxhc3RRdWV1ZWRUaW1lVXMgLyAxRTYpOworICAgIEFMT0dWKCJxdWV1ZUFjY2Vzc1VuaXQgdGltZVVzPSUiIFBSSWk2NCAiIHVzICglLjJmIHNlY3MpIiwgbUxhc3RRdWV1ZWRUaW1lVXMsIG1MYXN0UXVldWVkVGltZVVzIC8gMUU2KTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CiAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKIAotICAgIGlmICghbUxhdGVzdEVucXVldWVkTWV0YS5nZXQoKSkgeworICAgIGludDMyX3QgZGlzY29udGludWl0eTsKKyAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgeworICAgICAgICArK21RdWV1ZWREaXNjb250aW51aXR5Q291bnQ7CisgICAgfQorCisgICAgaWYgKG1MYXRlc3RFbnF1ZXVlZE1ldGEgPT0gTlVMTCkgewogICAgICAgICBtTGF0ZXN0RW5xdWV1ZWRNZXRhID0gYnVmZmVyLT5tZXRhKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50NjRfdCBsYXRlc3RUaW1lVXMgPSAwOwpAQCAtMjA4LDYgKzIzMyw3IEBACiAKICAgICBtQnVmZmVycy5jbGVhcigpOwogICAgIG1FT1NSZXN1bHQgPSBPSzsKKyAgICBtUXVldWVkRGlzY29udGludWl0eUNvdW50ID0gMDsKIAogICAgIG1Gb3JtYXQgPSBOVUxMOwogICAgIG1MYXRlc3RFbnF1ZXVlZE1ldGEgPSBOVUxMOwpAQCAtMjE1LDI3ICsyNDEsMzEgQEAKIAogdm9pZCBBbm90aGVyUGFja2V0U291cmNlOjpxdWV1ZURpc2NvbnRpbnVpdHkoCiAgICAgICAgIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUgdHlwZSwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSkgeworICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhLAorICAgICAgICBib29sIGRpc2NhcmQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgLy8gTGVhdmUgb25seSBkaXNjb250aW51aXRpZXMgaW4gdGhlIHF1ZXVlLgotICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtQnVmZmVycy5iZWdpbigpOwotICAgIHdoaWxlIChpdCAhPSBtQnVmZmVycy5lbmQoKSkgewotICAgICAgICBzcDxBQnVmZmVyPiBvbGRCdWZmZXIgPSAqaXQ7CisgICAgaWYgKGRpc2NhcmQpIHsKKyAgICAgICAgLy8gTGVhdmUgb25seSBkaXNjb250aW51aXRpZXMgaW4gdGhlIHF1ZXVlLgorICAgICAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKGl0ICE9IG1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBvbGRCdWZmZXIgPSAqaXQ7CiAKLSAgICAgICAgaW50MzJfdCBvbGREaXNjb250aW51aXR5VHlwZTsKLSAgICAgICAgaWYgKCFvbGRCdWZmZXItPm1ldGEoKS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAiZGlzY29udGludWl0eSIsICZvbGREaXNjb250aW51aXR5VHlwZSkpIHsKLSAgICAgICAgICAgIGl0ID0gbUJ1ZmZlcnMuZXJhc2UoaXQpOwotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpbnQzMl90IG9sZERpc2NvbnRpbnVpdHlUeXBlOworICAgICAgICAgICAgaWYgKCFvbGRCdWZmZXItPm1ldGEoKS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgImRpc2NvbnRpbnVpdHkiLCAmb2xkRGlzY29udGludWl0eVR5cGUpKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsraXQ7CiAgICAgICAgIH0KLQotICAgICAgICArK2l0OwogICAgIH0KIAogICAgIG1FT1NSZXN1bHQgPSBPSzsKICAgICBtTGFzdFF1ZXVlZFRpbWVVcyA9IDA7CiAgICAgbUxhdGVzdEVucXVldWVkTWV0YSA9IE5VTEw7CisgICAgKyttUXVldWVkRGlzY29udGludWl0eUNvdW50OwogCiAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoMCk7CiAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJkaXNjb250aW51aXR5Iiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4odHlwZSkpOwpAQCAtMjY1LDcgKzI5NSwxMCBAQAogCiBpbnQ2NF90IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldEJ1ZmZlcmVkRHVyYXRpb25VcyhzdGF0dXNfdCAqZmluYWxSZXN1bHQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBnZXRCdWZmZXJlZER1cmF0aW9uVXNfbChmaW5hbFJlc3VsdCk7Cit9CiAKK2ludDY0X3QgQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0QnVmZmVyZWREdXJhdGlvblVzX2woc3RhdHVzX3QgKmZpbmFsUmVzdWx0KSB7CiAgICAgKmZpbmFsUmVzdWx0ID0gbUVPU1Jlc3VsdDsKIAogICAgIGlmIChtQnVmZmVycy5lbXB0eSgpKSB7CkBAIC0yNzQsNiArMzA3LDcgQEAKIAogICAgIGludDY0X3QgdGltZTEgPSAtMTsKICAgICBpbnQ2NF90IHRpbWUyID0gLTE7CisgICAgaW50NjRfdCBkdXJhdGlvblVzID0gMDsKIAogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtQnVmZmVycy5iZWdpbigpOwogICAgIHdoaWxlIChpdCAhPSBtQnVmZmVycy5lbmQoKSkgewpAQCAtMjgxLDIwICszMTUsNjQgQEAKIAogICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICBpZiAodGltZTEgPCAwKSB7CisgICAgICAgICAgICBpZiAodGltZTEgPCAwIHx8IHRpbWVVcyA8IHRpbWUxKSB7CiAgICAgICAgICAgICAgICAgdGltZTEgPSB0aW1lVXM7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHRpbWUyID0gdGltZVVzOworICAgICAgICAgICAgaWYgKHRpbWUyIDwgMCB8fCB0aW1lVXMgPiB0aW1lMikgeworICAgICAgICAgICAgICAgIHRpbWUyID0gdGltZVVzOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRpc2NvbnRpbnVpdHksIHJlc2V0IGV2ZXJ5dGhpbmcuCisgICAgICAgICAgICBkdXJhdGlvblVzICs9IHRpbWUyIC0gdGltZTE7CiAgICAgICAgICAgICB0aW1lMSA9IHRpbWUyID0gLTE7CiAgICAgICAgIH0KIAogICAgICAgICArK2l0OwogICAgIH0KIAotICAgIHJldHVybiB0aW1lMiAtIHRpbWUxOworICAgIHJldHVybiBkdXJhdGlvblVzICsgKHRpbWUyIC0gdGltZTEpOworfQorCisvLyBBIGNoZWFwZXIgYnV0IGxlc3MgcHJlY2lzZSB2ZXJzaW9uIG9mIGdldEJ1ZmZlcmVkRHVyYXRpb25VcyB0aGF0IHdlIHdvdWxkIGxpa2UgdG8gdXNlIGluCisvLyBMaXZlU2Vzc2lvbjo6ZGVxdWV1ZUFjY2Vzc1VuaXQgdG8gdHJpZ2dlciBkb3dud2FyZHMgYWRhcHRhdGlvbi4KK2ludDY0X3QgQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0RXN0aW1hdGVkRHVyYXRpb25VcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtQnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChtUXVldWVkRGlzY29udGludWl0eUNvdW50ID4gMCkgeworICAgICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICAgICAgcmV0dXJuIGdldEJ1ZmZlcmVkRHVyYXRpb25Vc19sKCZmaW5hbFJlc3VsdCk7CisgICAgfQorCisgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKml0OworCisgICAgaW50NjRfdCBzdGFydFRpbWVVczsKKyAgICBidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmc3RhcnRUaW1lVXMpOworICAgIGlmIChzdGFydFRpbWVVcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaXQgPSBtQnVmZmVycy5lbmQoKTsKKyAgICAtLWl0OworICAgIGJ1ZmZlciA9ICppdDsKKworICAgIGludDY0X3QgZW5kVGltZVVzOworICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZlbmRUaW1lVXMpOworICAgIGlmIChlbmRUaW1lVXMgPCAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludDY0X3QgZGlmZlVzOworICAgIGlmIChlbmRUaW1lVXMgPiBzdGFydFRpbWVVcykgeworICAgICAgICBkaWZmVXMgPSBlbmRUaW1lVXMgLSBzdGFydFRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWZmVXMgPSBzdGFydFRpbWVVcyAtIGVuZFRpbWVVczsKKyAgICB9CisgICAgcmV0dXJuIGRpZmZVczsKIH0KIAogc3RhdHVzX3QgQW5vdGhlclBhY2tldFNvdXJjZTo6bmV4dEJ1ZmZlclRpbWUoaW50NjRfdCAqdGltZVVzKSB7CkBAIC0zMjMsOSArNDAxLDE0IEBACiAgICAgcmV0dXJuIChtRU9TUmVzdWx0ICE9IE9LKTsKIH0KIAotc3A8QU1lc3NhZ2U+IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldExhdGVzdE1ldGEoKSB7CitzcDxBTWVzc2FnZT4gQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1MYXRlc3RFbnF1ZXVlZE1ldGE7CiB9CiAKK3NwPEFNZXNzYWdlPiBBbm90aGVyUGFja2V0U291cmNlOjpnZXRMYXRlc3REZXF1ZXVlZE1ldGEoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbUxhdGVzdERlcXVldWVkTWV0YTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKaW5kZXggOWIxOTNhMi4uODA5YTg1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKQEAgLTQ5LDEyICs0OSwxNiBAQAogICAgIC8vIHByZXNlbnRhdGlvbiB0aW1lc3RhbXBzIHNpbmNlIHRoZSBsYXN0IGRpc2NvbnRpbnVpdHkgKGlmIGFueSkuCiAgICAgaW50NjRfdCBnZXRCdWZmZXJlZER1cmF0aW9uVXMoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KTsKIAorICAgIGludDY0X3QgZ2V0RXN0aW1hdGVkRHVyYXRpb25VcygpOworCiAgICAgc3RhdHVzX3QgbmV4dEJ1ZmZlclRpbWUoaW50NjRfdCAqdGltZVVzKTsKIAogICAgIHZvaWQgcXVldWVBY2Nlc3NVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogCiAgICAgdm9pZCBxdWV1ZURpc2NvbnRpbnVpdHkoCi0gICAgICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpOworICAgICAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlLAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSwKKyAgICAgICAgICAgIGJvb2wgZGlzY2FyZCk7CiAKICAgICB2b2lkIHNpZ25hbEVPUyhzdGF0dXNfdCByZXN1bHQpOwogCkBAIC02Miw3ICs2Niw4IEBACiAKICAgICBib29sIGlzRmluaXNoZWQoaW50NjRfdCBkdXJhdGlvbikgY29uc3Q7CiAKLSAgICBzcDxBTWVzc2FnZT4gZ2V0TGF0ZXN0TWV0YSgpOworICAgIHNwPEFNZXNzYWdlPiBnZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5Bbm90aGVyUGFja2V0U291cmNlKCk7CkBAIC03MiwxMyArNzcsMTggQEAKICAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKIAogICAgIGJvb2wgbUlzQXVkaW87CisgICAgYm9vbCBtSXNWaWRlbzsKICAgICBzcDxNZXRhRGF0YT4gbUZvcm1hdDsKICAgICBpbnQ2NF90IG1MYXN0UXVldWVkVGltZVVzOwogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiBtQnVmZmVyczsKICAgICBzdGF0dXNfdCBtRU9TUmVzdWx0OwogICAgIHNwPEFNZXNzYWdlPiBtTGF0ZXN0RW5xdWV1ZWRNZXRhOworICAgIHNwPEFNZXNzYWdlPiBtTGF0ZXN0RGVxdWV1ZWRNZXRhOworCisgICAgc2l6ZV90ICBtUXVldWVkRGlzY29udGludWl0eUNvdW50OwogCiAgICAgYm9vbCB3YXNGb3JtYXRDaGFuZ2UoaW50MzJfdCBkaXNjb250aW51aXR5VHlwZSkgY29uc3Q7CisgICAgaW50NjRfdCBnZXRCdWZmZXJlZER1cmF0aW9uVXNfbChzdGF0dXNfdCAqZmluYWxSZXN1bHQpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQW5vdGhlclBhY2tldFNvdXJjZSk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKaW5kZXggMmIwNzExYi4uZWYxY2QzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCkBAIC0zMSw2ICszMSw3IEBACiAKICNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTI2NCw3ICsyNjUsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gSC4yNjQvTVBFRyBzeW5jd29yZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJhdCBvZmZzZXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXQgb2Zmc2V0ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTI5Nyw3ICsyOTgsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gSC4yNjQvTVBFRyBzeW5jd29yZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJhdCBvZmZzZXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXQgb2Zmc2V0ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTMzMCw3ICszMzEsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gQUFDIHN5bmN3b3JkIGF0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJXpkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMzU4LDcgKzM1OSw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBBQzMgc3luY3dvcmQgYXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCAlemQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zODUsNyArMzg2LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIE1QRUcgYXVkaW8gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAic3luY3dvcmQgYXQgb2Zmc2V0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN5bmN3b3JkIGF0IG9mZnNldCAlemQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC00MDksNyArNDEwLDcgQEAKICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8IG5lZWRlZFNpemUgPiBtQnVmZmVyLT5jYXBhY2l0eSgpKSB7CiAgICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKIAotICAgICAgICBBTE9HVigicmVzaXppbmcgYnVmZmVyIHRvIHNpemUgJWQiLCBuZWVkZWRTaXplKTsKKyAgICAgICAgQUxPR1YoInJlc2l6aW5nIGJ1ZmZlciB0byBzaXplICV6dSIsIG5lZWRlZFNpemUpOwogCiAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5lZWRlZFNpemUpOwogICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7CkBAIC00MzIsNyArNDMzLDcgQEAKIAogI2lmIDAKICAgICBpZiAobU1vZGUgPT0gQUFDKSB7Ci0gICAgICAgIEFMT0dJKCJzaXplID0gJWQsIHRpbWVVcyA9ICUuMmYgc2VjcyIsIHNpemUsIHRpbWVVcyAvIDFFNik7CisgICAgICAgIEFMT0dJKCJzaXplID0gJXp1LCB0aW1lVXMgPSAlLjJmIHNlY3MiLCBzaXplLCB0aW1lVXMgLyAxRTYpOwogICAgICAgICBoZXhkdW1wKGRhdGEsIHNpemUpOwogICAgIH0KICNlbmRpZgpAQCAtNjAzLDYgKzYwNCw4IEBACiAgICAgLy8gaGF2aW5nIHRvIGludGVycG9sYXRlLgogICAgIC8vIFRoZSBmaW5hbCBBQUMgZnJhbWUgbWF5IHdlbGwgZXh0ZW5kIGludG8gdGhlIG5leHQgUmFuZ2VJbmZvIGJ1dAogICAgIC8vIHRoYXQncyBvay4KKyAgICAvLyBUT0RPOiB0aGUgbG9naWMgY29tbWVudGVkIGFib3ZlIGlzIHNraXBwZWQgYmVjYXVzZSBjb2RlYyBjYW5ub3QgdGFrZQorICAgIC8vIGFyYml0cmFyeSBzaXplZCBpbnB1dCBidWZmZXJzOwogICAgIHNpemVfdCBvZmZzZXQgPSAwOwogICAgIHdoaWxlIChvZmZzZXQgPCBpbmZvLm1MZW5ndGgpIHsKICAgICAgICAgaWYgKG9mZnNldCArIDcgPiBtQnVmZmVyLT5zaXplKCkpIHsKQEAgLTY2Nyw5ICs2NzAsMTIgQEAKICAgICAgICAgc2l6ZV90IGhlYWRlclNpemUgPSBwcm90ZWN0aW9uX2Fic2VudCA/IDcgOiA5OwogCiAgICAgICAgIG9mZnNldCArPSBhYWNfZnJhbWVfbGVuZ3RoOworICAgICAgICAvLyBUT0RPOiBtb3ZlIGJhY2sgdG8gY29uY2F0ZW5hdGlvbiB3aGVuIGNvZGVjIGNhbiBzdXBwb3J0IGFyYml0cmFyeSBpbnB1dCBidWZmZXJzLgorICAgICAgICAvLyBGb3Igbm93IG9ubHkgcXVldWUgYSBzaW5nbGUgYnVmZmVyCisgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAob2Zmc2V0KTsKKyAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wQUFDKG9mZnNldCk7CiAKICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIob2Zmc2V0KTsKICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIG9mZnNldCk7CkBAIC03MTYsNiArNzIyLDQ1IEBACiAgICAgcmV0dXJuIHRpbWVVczsKIH0KIAorLy8gVE9ETzogYXZvaWQgaW50ZXJwb2xhdGluZyB0aW1lc3RhbXBzIG9uY2UgY29kZWMgc3VwcG9ydHMgYXJiaXRyYXJ5IHNpemVkIGlucHV0IGJ1ZmZlcnMKK2ludDY0X3QgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpmZXRjaFRpbWVzdGFtcEFBQyhzaXplX3Qgc2l6ZSkgeworICAgIGludDY0X3QgdGltZVVzID0gLTE7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgICBzaXplX3Qgc2FtcGxlc2l6ZSA9IHNpemU7CisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIENIRUNLKCFtUmFuZ2VJbmZvcy5lbXB0eSgpKTsKKworICAgICAgICBSYW5nZUluZm8gKmluZm8gPSAmKm1SYW5nZUluZm9zLmJlZ2luKCk7CisKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICB0aW1lVXMgPSBpbmZvLT5tVGltZXN0YW1wVXM7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluZm8tPm1MZW5ndGggPiBzaXplKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgICAgICBDSEVDSyhtRm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7CisgICAgICAgICAgICBpbmZvLT5tTGVuZ3RoIC09IHNpemU7CisgICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IDEwMjQgKiBzaXplIC8gc2FtcGxlc2l6ZTsKKyAgICAgICAgICAgIGluZm8tPm1UaW1lc3RhbXBVcyArPSBudW1TYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZSAtPSBpbmZvLT5tTGVuZ3RoOworCisgICAgICAgICAgICBtUmFuZ2VJbmZvcy5lcmFzZShtUmFuZ2VJbmZvcy5iZWdpbigpKTsKKyAgICAgICAgICAgIGluZm8gPSBOVUxMOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBpZiAodGltZVVzID09IDBsbCkgeworICAgICAgICBBTE9HVigiUmV0dXJuaW5nIDAgdGltZXN0YW1wIik7CisgICAgfQorCisgICAgcmV0dXJuIHRpbWVVczsKK30KKwogc3RydWN0IE5BTFBvc2l0aW9uIHsKICAgICBzaXplX3QgbmFsT2Zmc2V0OwogICAgIHNpemVfdCBuYWxTaXplOwpAQCAtNzc2LDYgKzgyMSwxMiBAQAogCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgbmFsVHlwZSA9IG1CdWZmZXItPmRhdGEoKVtwb3MubmFsT2Zmc2V0XSAmIDB4MWY7CiAKKyAgICAgICAgICAgICAgICBpZiAobmFsVHlwZSA9PSA2KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IHNlaSA9IG5ldyBBQnVmZmVyKHBvcy5uYWxTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHNlaS0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCkgKyBwb3MubmFsT2Zmc2V0LCBwb3MubmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0QnVmZmVyKCJzZWkiLCBzZWkpOworICAgICAgICAgICAgICAgIH0KKwogI2lmICFMT0dfTkRFQlVHCiAgICAgICAgICAgICAgICAgY2hhciB0bXBbMTI4XTsKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIjB4JTAyeCIsIG5hbFR5cGUpOwpAQCAtNzk0LDcgKzg0NSw5IEBACiAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IHBvcy5uYWxTaXplICsgNDsKICAgICAgICAgICAgIH0KIAorI2lmICFMT0dfTkRFQlVHCiAgICAgICAgICAgICBBTE9HVigiYWNjZXNzVW5pdCBjb250YWlucyBuYWwgdHlwZXMgJXMiLCBvdXQuY19zdHIoKSk7CisjZW5kaWYKIAogICAgICAgICAgICAgY29uc3QgTkFMUG9zaXRpb24gJnBvcyA9IG5hbHMuaXRlbUF0KG5hbHMuc2l6ZSgpIC0gMSk7CiAgICAgICAgICAgICBzaXplX3QgbmV4dFNjYW4gPSBwb3MubmFsT2Zmc2V0ICsgcG9zLm5hbFNpemU7CkBAIC0xMDI1LDcgKzEwNzgsNyBAQAogCiAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKIAotICAgICAgICAgICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgTVBFRyB2aWRlbyBhY2Nlc3MgdW5pdCBhdCB0aW1lICVsbGQgdXMiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgTVBFRyB2aWRlbyBhY2Nlc3MgdW5pdCBhdCB0aW1lICUiIFBSSWQ2NCAiIHVzIiwKICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMpOwogCiAgICAgICAgICAgICAgICAgLy8gaGV4ZHVtcChhY2Nlc3NVbml0LT5kYXRhKCksIGFjY2Vzc1VuaXQtPnNpemUoKSk7CkBAIC0xMTg0LDcgKzEyMzcsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJldHVybmluZyBNUEVHNCB2aWRlbyBhY2Nlc3MgdW5pdCBhdCB0aW1lICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVigicmV0dXJuaW5nIE1QRUc0IHZpZGVvIGFjY2VzcyB1bml0IGF0IHRpbWUgJSIgUFJJZDY0ICIgdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcyk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gaGV4ZHVtcChhY2Nlc3NVbml0LT5kYXRhKCksIGFjY2Vzc1VuaXQtPnNpemUoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCmluZGV4IGEyY2NhNzcuLjdjODFmZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCkBAIC03Nyw2ICs3Nyw3IEBACiAgICAgLy8gY29uc3VtZSBhIGxvZ2ljYWwgKGNvbXByZXNzZWQpIGFjY2VzcyB1bml0IG9mIHNpemUgInNpemUiLAogICAgIC8vIHJldHVybnMgaXRzIHRpbWVzdGFtcCBpbiB1cyAob3IgLTEgaWYgbm8gdGltZSBpbmZvcm1hdGlvbikuCiAgICAgaW50NjRfdCBmZXRjaFRpbWVzdGFtcChzaXplX3Qgc2l6ZSk7CisgICAgaW50NjRfdCBmZXRjaFRpbWVzdGFtcEFBQyhzaXplX3Qgc2l6ZSk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFbGVtZW50YXJ5U3RyZWFtUXVldWUpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJQU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyUFNFeHRyYWN0b3IuY3BwCmluZGV4IGRkNzE0Yzk5Li44NTg1OWY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyUFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJQU0V4dHJhY3Rvci5jcHAKQEAgLTM2LDYgKzM2LDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrIDogcHVibGljIE1lZGlhU291cmNlIHsKQEAgLTEzMCw3ICsxMzIsOCBAQAogICAgIHJldHVybiBuZXcgV3JhcHBlZFRyYWNrKHRoaXMsIG1UcmFja3MudmFsdWVBdChpbmRleCkpOwogfQogCi1zcDxNZXRhRGF0YT4gTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CitzcDxNZXRhRGF0YT4gTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC00MDgsNyArNDExLDcgQEAKICAgICAgICAgICAgIFBUUyB8PSBici5nZXRCaXRzKDE1KTsKICAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKIAotICAgICAgICAgICAgQUxPR1YoIlBUUyA9ICVsbHUiLCBQVFMpOworICAgICAgICAgICAgQUxPR1YoIlBUUyA9ICUiIFBSSXU2NCwgUFRTKTsKICAgICAgICAgICAgIC8vIEFMT0dJKCJQVFMgPSAlLjJmIHNlY3MiLCBQVFMgLyA5MDAwMC4wZik7CiAKICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OwpAQCAtNDI1LDcgKzQyOCw3IEBACiAgICAgICAgICAgICAgICAgRFRTIHw9IGJyLmdldEJpdHMoMTUpOwogICAgICAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKIAotICAgICAgICAgICAgICAgIEFMT0dWKCJEVFMgPSAlbGx1IiwgRFRTKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiRFRTID0gJSIgUFJJdTY0LCBEVFMpOwogCiAgICAgICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDU7CiAgICAgICAgICAgICB9CkBAIC00NDMsNyArNDQ2LDcgQEAKICAgICAgICAgICAgIEVTQ1IgfD0gYnIuZ2V0Qml0cygxNSk7CiAgICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJFU0NSID0gJWxsdSIsIEVTQ1IpOworICAgICAgICAgICAgQUxPR1YoIkVTQ1IgPSAlIiBQUkl1NjQsIEVTQ1IpOwogICAgICAgICAgICAgLyogdW5zaWduZWQgRVNDUl9leHRlbnNpb24gPSAqL2JyLmdldEJpdHMoOSk7CiAKICAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKQEAgLTQ3Miw3ICs0NzUsNyBAQAogCiAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgZGF0YUxlbmd0aCAqIDgpIHsKICAgICAgICAgICAgIEFMT0dFKCJQRVMgcGFja2V0IGRvZXMgbm90IGNhcnJ5IGVub3VnaCBkYXRhIHRvIGNvbnRhaW4gIgotICAgICAgICAgICAgICAgICAicGF5bG9hZC4gKG51bUJpdHNMZWZ0ID0gJWQsIHJlcXVpcmVkID0gJWQpIiwKKyAgICAgICAgICAgICAgICAgInBheWxvYWQuIChudW1CaXRzTGVmdCA9ICV6dSwgcmVxdWlyZWQgPSAldSkiLAogICAgICAgICAgICAgICAgICBici5udW1CaXRzTGVmdCgpLCBkYXRhTGVuZ3RoICogOCk7CiAKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC02MjUsNyArNjI4LDcgQEAKIAogc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OmFwcGVuZFBFU0RhdGEoCiAgICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MsCi0gICAgICAgIHVpbnQ2NF90IFBUUywgdWludDY0X3QgRFRTLAorICAgICAgICB1aW50NjRfdCBQVFMsIHVpbnQ2NF90IC8qIERUUyAqLywKICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBpZiAobVF1ZXVlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggZDQ0OWMzNC4uMzVjYTExOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0xNDEsNyArMTQxLDcgQEAKIH0KIAogc3A8TWV0YURhdGE+IE1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIHJldHVybiBpbmRleCA8IG1Tb3VyY2VJbXBscy5zaXplKCkKICAgICAgICAgPyBtU291cmNlSW1wbHMuZWRpdEl0ZW1BdChpbmRleCktPmdldEZvcm1hdCgpIDogTlVMTDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKaW5kZXggY2Q5MTJlNy4uYWFhODMzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsKQEAgLTEsNiArMSwxMCBAQAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAoraWZlcSAoJChUQVJHRVRfREVWSUNFKSwgbWFudGEpCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1EU1VSRkFDRV9JU19CR1IzMgorZW5kaWYKKwogTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwICAgICAgIFwKICAgICAgICAgT01YLmNwcCAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTAsNiArMTQsNyBAQAogICAgICAgICBTb2Z0T01YQ29tcG9uZW50LmNwcCAgICAgICAgICBcCiAgICAgICAgIFNvZnRPTVhQbHVnaW4uY3BwICAgICAgICAgICAgIFwKICAgICAgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAgXAorICAgICAgICBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcCBcCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCkBAIC0xOCw2ICsyMyw3IEBACiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgICAgICAgICBcCiAgICAgICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsaWJoYXJkd2FyZSAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgbGlibWVkaWEgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGxpYnV0aWxzICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBsaWJsb2cgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCA0NGYwYmU3Li4zZTcwOTU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2RlZmluZSBMT0dfVEFHICJHcmFwaGljQnVmZmVyU291cmNlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMjcsMTMgKzI5LDE2IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgYm9vbCBFWFRSQV9DSEVDSyA9IHRydWU7CiAKIAogR3JhcGhpY0J1ZmZlclNvdXJjZTo6R3JhcGhpY0J1ZmZlclNvdXJjZShPTVhOb2RlSW5zdGFuY2UqIG5vZGVJbnN0YW5jZSwKLSAgICAgICAgdWludDMyX3QgYnVmZmVyV2lkdGgsIHVpbnQzMl90IGJ1ZmZlckhlaWdodCwgdWludDMyX3QgYnVmZmVyQ291bnQpIDoKKyAgICAgICAgdWludDMyX3QgYnVmZmVyV2lkdGgsIHVpbnQzMl90IGJ1ZmZlckhlaWdodCwgdWludDMyX3QgYnVmZmVyQ291bnQsCisgICAgICAgIGJvb2wgdXNlR3JhcGhpY0J1ZmZlckluTWV0YSkgOgogICAgIG1Jbml0Q2hlY2soVU5LTk9XTl9FUlJPUiksCiAgICAgbU5vZGVJbnN0YW5jZShub2RlSW5zdGFuY2UpLAogICAgIG1FeGVjdXRpbmcoZmFsc2UpLApAQCAtNDEsMTYgKzQ2LDIyIEBACiAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSgwKSwKICAgICBtRW5kT2ZTdHJlYW0oZmFsc2UpLAogICAgIG1FbmRPZlN0cmVhbVNlbnQoZmFsc2UpLAotICAgIG1SZXBlYXRBZnRlclVzKC0xbGwpLAogICAgIG1NYXhUaW1lc3RhbXBHYXBVcygtMWxsKSwKICAgICBtUHJldk9yaWdpbmFsVGltZVVzKC0xbGwpLAogICAgIG1QcmV2TW9kaWZpZWRUaW1lVXMoLTFsbCksCisgICAgbVNraXBGcmFtZXNCZWZvcmVOcygtMWxsKSwKKyAgICBtUmVwZWF0QWZ0ZXJVcygtMWxsKSwKICAgICBtUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbigwKSwKICAgICBtUmVwZWF0TGFzdEZyYW1lVGltZXN0YW1wKC0xbGwpLAogICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCgtMSksCiAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtKDApLAogICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJVc2VDb3VudCgwKSwKLSAgICBtUmVwZWF0QnVmZmVyRGVmZXJyZWQoZmFsc2UpIHsKKyAgICBtUmVwZWF0QnVmZmVyRGVmZXJyZWQoZmFsc2UpLAorICAgIG1UaW1lUGVyQ2FwdHVyZVVzKC0xbGwpLAorICAgIG1UaW1lUGVyRnJhbWVVcygtMWxsKSwKKyAgICBtUHJldkNhcHR1cmVVcygtMWxsKSwKKyAgICBtUHJldkZyYW1lVXMoLTFsbCksCisgICAgbVVzZUdyYXBoaWNCdWZmZXJJbk1ldGEodXNlR3JhcGhpY0J1ZmZlckluTWV0YSkgewogCiAgICAgQUxPR1YoIkdyYXBoaWNCdWZmZXJTb3VyY2Ugdz0ldSBoPSV1IGM9JXUiLAogICAgICAgICAgICAgYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCwgYnVmZmVyQ291bnQpOwpAQCAtNjMsMTMgKzc0LDEyIEBACiAKICAgICBTdHJpbmc4IG5hbWUoIkdyYXBoaWNCdWZmZXJTb3VyY2UiKTsKIAotICAgIG1CdWZmZXJRdWV1ZSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgIG1CdWZmZXJRdWV1ZS0+c2V0Q29uc3VtZXJOYW1lKG5hbWUpOwotICAgIG1CdWZmZXJRdWV1ZS0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7Ci0gICAgbUJ1ZmZlclF1ZXVlLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIgfAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKTsKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJm1Qcm9kdWNlciwgJm1Db25zdW1lcik7CisgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lck5hbWUobmFtZSk7CisgICAgbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZShidWZmZXJXaWR0aCwgYnVmZmVySGVpZ2h0KTsKKyAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUik7CiAKLSAgICBtSW5pdENoZWNrID0gbUJ1ZmZlclF1ZXVlLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKKyAgICBtSW5pdENoZWNrID0gbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKICAgICBpZiAobUluaXRDaGVjayAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBCUSBtYXggYWNxdWlyZWQgYnVmZmVyIGNvdW50IHRvICV1OiAlZCIsCiAgICAgICAgICAgICAgICAgYnVmZmVyQ291bnQsIG1Jbml0Q2hlY2spOwpAQCAtODMsNyArOTMsNyBAQAogICAgIHdwPEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyKj4odGhpcyk7CiAgICAgc3A8QnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcj4gcHJveHkgPSBuZXcgQnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcihsaXN0ZW5lcik7CiAKLSAgICBtSW5pdENoZWNrID0gbUJ1ZmZlclF1ZXVlLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKKyAgICBtSW5pdENoZWNrID0gbUNvbnN1bWVyLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiRXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLW1Jbml0Q2hlY2spLCBtSW5pdENoZWNrKTsKQEAgLTk1LDggKzEwNSw4IEBACiAKIEdyYXBoaWNCdWZmZXJTb3VyY2U6On5HcmFwaGljQnVmZmVyU291cmNlKCkgewogICAgIEFMT0dWKCJ+R3JhcGhpY0J1ZmZlclNvdXJjZSIpOwotICAgIGlmIChtQnVmZmVyUXVldWUgIT0gTlVMTCkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyUXVldWUtPmNvbnN1bWVyRGlzY29ubmVjdCgpOworICAgIGlmIChtQ29uc3VtZXIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmNvbnN1bWVyRGlzY29ubmVjdCgpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HVygiY29uc3VtZXJEaXNjb25uZWN0IGZhaWxlZDogJWQiLCBlcnIpOwogICAgICAgICB9CkBAIC0xMDUsNyArMTE1LDcgQEAKIAogdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbXhFeGVjdXRpbmcoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0gICAgQUxPR1YoIi0tPiBleGVjdXRpbmc7IGF2YWlsPSVkLCBjb2RlYyB2ZWMgc2l6ZT0lemQiLAorICAgIEFMT0dWKCItLT4gZXhlY3V0aW5nOyBhdmFpbD0lenUsIGNvZGVjIHZlYyBzaXplPSV6ZCIsCiAgICAgICAgICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlLCBtQ29kZWNCdWZmZXJzLnNpemUoKSk7CiAgICAgQ0hFQ0soIW1FeGVjdXRpbmcpOwogICAgIG1FeGVjdXRpbmcgPSB0cnVlOwpAQCAtMTI3LDcgKzEzNyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HVigiZG9uZSBsb2FkaW5nIGluaXRpYWwgZnJhbWVzLCBhdmFpbD0lZCIsIG1OdW1GcmFtZXNBdmFpbGFibGUpOworICAgIEFMT0dWKCJkb25lIGxvYWRpbmcgaW5pdGlhbCBmcmFtZXMsIGF2YWlsPSV6dSIsIG1OdW1GcmFtZXNBdmFpbGFibGUpOwogCiAgICAgLy8gSWYgRU9TIGhhcyBhbHJlYWR5IGJlZW4gc2lnbmFsZWQsIGFuZCB0aGVyZSBhcmUgbm8gbW9yZSBmcmFtZXMgdG8KICAgICAvLyBzdWJtaXQsIHRyeSB0byBzZW5kIEVPUyBub3cgYXMgd2VsbC4KQEAgLTE3OSw3ICsxODksNyBAQAogICAgICAgICBtTG9vcGVyLmNsZWFyKCk7CiAgICAgfQogCi0gICAgQUxPR1YoIi0tPiBsb2FkZWQ7IGF2YWlsPSVkIGVvcz0lZCBlb3NTZW50PSVkIiwKKyAgICBBTE9HVigiLS0+IGxvYWRlZDsgYXZhaWw9JXp1IGVvcz0lZCBlb3NTZW50PSVkIiwKICAgICAgICAgICAgIG1OdW1GcmFtZXNBdmFpbGFibGUsIG1FbmRPZlN0cmVhbSwgbUVuZE9mU3RyZWFtU2VudCk7CiAKICAgICAvLyBDb2RlYyBpcyBubyBsb25nZXIgZXhlY3V0aW5nLiAgRGlzY2FyZCBhbGwgY29kZWMtcmVsYXRlZCBzdGF0ZS4KQEAgLTIwMCw3ICsyMTAsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQUxPR1YoImFkZENvZGVjQnVmZmVyIGg9JXAgc2l6ZT0lbHUgcD0lcCIsCisgICAgQUxPR1YoImFkZENvZGVjQnVmZmVyIGg9JXAgc2l6ZT0lIiBQUkl1MzIgIiBwPSVwIiwKICAgICAgICAgICAgIGhlYWRlciwgaGVhZGVyLT5uQWxsb2NMZW4sIGhlYWRlci0+cEJ1ZmZlcik7CiAgICAgQ29kZWNCdWZmZXIgY29kZWNCdWZmZXI7CiAgICAgY29kZWNCdWZmZXIubUhlYWRlciA9IGhlYWRlcjsKQEAgLTIyMSw3ICsyMzEsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQUxPR1YoImNvZGVjQnVmZmVyRW1wdGllZCBoPSVwIHNpemU9JWx1IGZpbGxlZD0lbHUgcD0lcCIsCisgICAgQUxPR1YoImNvZGVjQnVmZmVyRW1wdGllZCBoPSVwIHNpemU9JSIgUFJJdTMyICIgZmlsbGVkPSUiIFBSSXUzMiAiIHA9JXAiLAogICAgICAgICAgICAgaGVhZGVyLCBoZWFkZXItPm5BbGxvY0xlbiwgaGVhZGVyLT5uRmlsbGVkTGVuLAogICAgICAgICAgICAgaGVhZGVyLT5wQnVmZmVyKTsKICAgICBDb2RlY0J1ZmZlciYgY29kZWNCdWZmZXIobUNvZGVjQnVmZmVycy5lZGl0SXRlbUF0KGNiaSkpOwpAQCAtMjQ2LDEzICsyNTYsMjUgQEAKICAgICAgICAgLy8gUHVsbCB0aGUgZ3JhcGhpYyBidWZmZXIgaGFuZGxlIGJhY2sgb3V0IG9mIHRoZSBidWZmZXIsIGFuZCBjb25maXJtCiAgICAgICAgIC8vIHRoYXQgaXQgbWF0Y2hlcyBleHBlY3RhdGlvbnMuCiAgICAgICAgIE9NWF9VOCogZGF0YSA9IGhlYWRlci0+cEJ1ZmZlcjsKLSAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZmZlckhhbmRsZTsKLSAgICAgICAgbWVtY3B5KCZidWZmZXJIYW5kbGUsIGRhdGEgKyA0LCBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7Ci0gICAgICAgIGlmIChidWZmZXJIYW5kbGUgIT0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZSkgewotICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgotICAgICAgICAgICAgQUxPR0UoImNvZGVjQnVmZmVyRW1wdGllZDogYnVmZmVyJ3MgaGFuZGxlIGlzICVwLCBleHBlY3RlZCAlcCIsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlckhhbmRsZSwgY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZSk7Ci0gICAgICAgICAgICBDSEVDSyghImNvZGVjQnVmZmVyRW1wdGllZDogbWlzbWF0Y2hlZCBidWZmZXIiKTsKKyAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlIHR5cGUgPSAqKE1ldGFkYXRhQnVmZmVyVHlwZSAqKWRhdGE7CisgICAgICAgIGlmICh0eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7CisgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmZmVySGFuZGxlOworICAgICAgICAgICAgbWVtY3B5KCZidWZmZXJIYW5kbGUsIGRhdGEgKyA0LCBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7CisgICAgICAgICAgICBpZiAoYnVmZmVySGFuZGxlICE9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgQUxPR0UoImNvZGVjQnVmZmVyRW1wdGllZDogYnVmZmVyJ3MgaGFuZGxlIGlzICVwLCBleHBlY3RlZCAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJIYW5kbGUsIGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpOworICAgICAgICAgICAgICAgIENIRUNLKCEiY29kZWNCdWZmZXJFbXB0aWVkOiBtaXNtYXRjaGVkIGJ1ZmZlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYXBoaWNCdWZmZXIpIHsKKyAgICAgICAgICAgIEdyYXBoaWNCdWZmZXIgKmJ1ZmZlcjsKKyAgICAgICAgICAgIG1lbWNweSgmYnVmZmVyLCBkYXRhICsgNCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci5nZXQoKSkgeworICAgICAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgICAgICBBTE9HRSgiY29kZWNCdWZmZXJFbXB0aWVkOiBidWZmZXIgaXMgJXAsIGV4cGVjdGVkICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXIuZ2V0KCkpOworICAgICAgICAgICAgICAgIENIRUNLKCEiY29kZWNCdWZmZXJFbXB0aWVkOiBtaXNtYXRjaGVkIGJ1ZmZlciIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yNjgsNyArMjkwLDcgQEAKICAgICAgICAgaWYgKGlkID09IG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCkgewogICAgICAgICAgICAgQ0hFQ0tfR1QobUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlclVzZUNvdW50LS0sIDApOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKGlkLCBjb2RlY0J1ZmZlci5tRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaWQsIGNvZGVjQnVmZmVyLm1GcmFtZU51bWJlciwKICAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0yODIsNyArMzA0LDcgQEAKICAgICBpZiAobU51bUZyYW1lc0F2YWlsYWJsZSkgewogICAgICAgICAvLyBGaWxsIHRoaXMgY29kZWMgYnVmZmVyLgogICAgICAgICBDSEVDSyghbUVuZE9mU3RyZWFtU2VudCk7Ci0gICAgICAgIEFMT0dWKCJidWZmZXIgZnJlZWQsICVkIGZyYW1lcyBhdmFpbCAoZW9zPSVkKSIsCisgICAgICAgIEFMT0dWKCJidWZmZXIgZnJlZWQsICV6dSBmcmFtZXMgYXZhaWwgKGVvcz0lZCkiLAogICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNBdmFpbGFibGUsIG1FbmRPZlN0cmVhbSk7CiAgICAgICAgIGZpbGxDb2RlY0J1ZmZlcl9sKCk7CiAgICAgfSBlbHNlIGlmIChtRW5kT2ZTdHJlYW0pIHsKQEAgLTMxMSw3ICszMzMsOCBAQAogICAgICAgICBzc2l6ZV90IGluZGV4ID0gbU9yaWdpbmFsVGltZVVzLmluZGV4T2ZLZXkoaGVhZGVyLT5uVGltZVN0YW1wKTsKICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgIEFMT0dWKCJPVVQgdGltZXN0YW1wOiAlbGxkIC0+ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICBoZWFkZXItPm5UaW1lU3RhbXAsIG1PcmlnaW5hbFRpbWVVc1tpbmRleF0pOworICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KGhlYWRlci0+blRpbWVTdGFtcCksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obU9yaWdpbmFsVGltZVVzW2luZGV4XSkpOwogICAgICAgICAgICAgaGVhZGVyLT5uVGltZVN0YW1wID0gbU9yaWdpbmFsVGltZVVzW2luZGV4XTsKICAgICAgICAgICAgIG1PcmlnaW5hbFRpbWVVcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTMyMiw3ICszNDUsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChtT3JpZ2luYWxUaW1lVXMuc2l6ZSgpID4gQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFMpIHsKICAgICAgICAgICAgIC8vIHNvbWV0aGluZyB0ZXJyaWJseSB3cm9uZyBtdXN0IGhhdmUgaGFwcGVuZWQsIGdpdmluZyB1cC4uLgotICAgICAgICAgICAgQUxPR0UoIm1PcmlnaW5hbFRpbWVVcyBoYXMgdG9vIG1hbnkgZW50cmllcyAoJWQpIiwKKyAgICAgICAgICAgIEFMT0dFKCJtT3JpZ2luYWxUaW1lVXMgaGFzIHRvbyBtYW55IGVudHJpZXMgKCV6dSkiLAogICAgICAgICAgICAgICAgICAgICBtT3JpZ2luYWxUaW1lVXMuc2l6ZSgpKTsKICAgICAgICAgICAgIG1NYXhUaW1lc3RhbXBHYXBVcyA9IC0xbGw7CiAgICAgICAgIH0KQEAgLTMzNyw3ICszNjAsNyBAQAogCiAgICAgICAgIHdoaWxlIChtTnVtRnJhbWVzQXZhaWxhYmxlID4gMCkgewogICAgICAgICAgICAgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gaXRlbTsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJRdWV1ZS0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOwogCiAgICAgICAgICAgICBpZiAoZXJyID09IEJ1ZmZlclF1ZXVlOjpOT19CVUZGRVJfQVZBSUxBQkxFKSB7CiAgICAgICAgICAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbi4KQEAgLTM1MCw3ICszNzMsNyBAQAogCiAgICAgICAgICAgICAtLW1OdW1GcmFtZXNBdmFpbGFibGU7CiAKLSAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIGl0ZW0ubUZlbmNlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CkBAIC0zNzksMTUgKzQwMiwxNSBAQAogICAgIGludCBjYmkgPSBmaW5kQXZhaWxhYmxlQ29kZWNCdWZmZXJfbCgpOwogICAgIGlmIChjYmkgPCAwKSB7CiAgICAgICAgIC8vIE5vIGJ1ZmZlcnMgYXZhaWxhYmxlLCBiYWlsLgotICAgICAgICBBTE9HVigiZmlsbENvZGVjQnVmZmVyX2w6IG5vIGNvZGVjIGJ1ZmZlcnMsIGF2YWlsIG5vdyAlZCIsCisgICAgICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogbm8gY29kZWMgYnVmZmVycywgYXZhaWwgbm93ICV6dSIsCiAgICAgICAgICAgICAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBBTE9HVigiZmlsbENvZGVjQnVmZmVyX2w6IGFjcXVpcmluZyBidWZmZXIsIGF2YWlsPSVkIiwKKyAgICBBTE9HVigiZmlsbENvZGVjQnVmZmVyX2w6IGFjcXVpcmluZyBidWZmZXIsIGF2YWlsPSV6dSIsCiAgICAgICAgICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlKTsKICAgICBCdWZmZXJRdWV1ZTo6QnVmZmVySXRlbSBpdGVtOwotICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJRdWV1ZS0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CisgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKICAgICBpZiAoZXJyID09IEJ1ZmZlclF1ZXVlOjpOT19CVUZGRVJfQVZBSUxBQkxFKSB7CiAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4KICAgICAgICAgQUxPR1coImZpbGxDb2RlY0J1ZmZlcl9sOiBmcmFtZSB3YXMgbm90IGF2YWlsYWJsZSIpOwpAQCAtNDE0LDEwICs0MzcsMjEgQEAKICAgICAgICAgbUJ1ZmZlclNsb3RbaXRlbS5tQnVmXSA9IGl0ZW0ubUdyYXBoaWNCdWZmZXI7CiAgICAgfQogCi0gICAgZXJyID0gc3VibWl0QnVmZmVyX2woaXRlbSwgY2JpKTsKKyAgICBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgLy8gb25seSBzdWJtaXQgc2FtcGxlIGlmIHN0YXJ0IHRpbWUgaXMgdW5zcGVjaWZpZWQsIG9yIHNhbXBsZQorICAgIC8vIGlzIHF1ZXVlZCBhZnRlciB0aGUgc3BlY2lmaWVkIHN0YXJ0IHRpbWUKKyAgICBpZiAobVNraXBGcmFtZXNCZWZvcmVOcyA8IDBsbCB8fCBpdGVtLm1UaW1lc3RhbXAgPj0gbVNraXBGcmFtZXNCZWZvcmVOcykgeworICAgICAgICAvLyBpZiBzdGFydCB0aW1lIGlzIHNldCwgb2Zmc2V0IHRpbWUgc3RhbXAgYnkgc3RhcnQgdGltZQorICAgICAgICBpZiAobVNraXBGcmFtZXNCZWZvcmVOcyA+IDApIHsKKyAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcCAtPSBtU2tpcEZyYW1lc0JlZm9yZU5zOworICAgICAgICB9CisgICAgICAgIGVyciA9IHN1Ym1pdEJ1ZmZlcl9sKGl0ZW0sIGNiaSk7CisgICAgfQorCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HVigic3VibWl0QnVmZmVyX2wgZmFpbGVkLCByZWxlYXNpbmcgYnEgYnVmICVkIiwgaXRlbS5tQnVmKTsKLSAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCisgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoImJ1ZmZlciBzdWJtaXR0ZWQgKGJxICVkLCBjYmkgJWQpIiwgaXRlbS5tQnVmLCBjYmkpOwpAQCAtNDQwLDcgKzQ3NCw3IEBACiAgICAgICAgIC8vCiAgICAgICAgIC8vIFRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgd2UgdHJ5IHRvIHJlbGVhc2UgdGhlIGJ1ZmZlci4KICAgICAgICAgQUxPR0QoInJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sOiBzbG90IHdhcyBOVUxMIik7Ci0gICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKAogICAgICAgICAgICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCwKICAgICAgICAgICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyRnJhbWVOdW0sCiAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksCkBAIC00OTQsNyArNTI4LDcgQEAKIAogICAgIGlmIChtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQgPj0gMCkgewogICAgICAgICBpZiAobUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlclVzZUNvdW50ID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkLAogICAgICAgICAgICAgICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyRnJhbWVOdW0sCiAgICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLApAQCAtNTIwLDcgKzU1NCw3IEBACiAKIHN0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0gICAgQUxPR1YoInNpZ25hbEVuZE9mSW5wdXRTdHJlYW06IGV4ZWM9JWQgYXZhaWw9JWQgZW9zPSVkIiwKKyAgICBBTE9HVigic2lnbmFsRW5kT2ZJbnB1dFN0cmVhbTogZXhlYz0lZCBhdmFpbD0lenUgZW9zPSVkIiwKICAgICAgICAgICAgIG1FeGVjdXRpbmcsIG1OdW1GcmFtZXNBdmFpbGFibGUsIG1FbmRPZlN0cmVhbSk7CiAKICAgICBpZiAobUVuZE9mU3RyZWFtKSB7CkBAIC01NDgsNyArNTgyLDMyIEBACiBpbnQ2NF90IEdyYXBoaWNCdWZmZXJTb3VyY2U6OmdldFRpbWVzdGFtcChjb25zdCBCdWZmZXJRdWV1ZTo6QnVmZmVySXRlbSAmaXRlbSkgewogICAgIGludDY0X3QgdGltZVVzID0gaXRlbS5tVGltZXN0YW1wIC8gMTAwMDsKIAotICAgIGlmIChtTWF4VGltZXN0YW1wR2FwVXMgPiAwbGwpIHsKKyAgICBpZiAobVRpbWVQZXJDYXB0dXJlVXMgPiAwbGwpIHsKKyAgICAgICAgLy8gVGltZSBsYXBzZSBvciBzbG93IG1vdGlvbiBtb2RlCisgICAgICAgIGlmIChtUHJldkNhcHR1cmVVcyA8IDBsbCkgeworICAgICAgICAgICAgLy8gZmlyc3QgY2FwdHVyZQorICAgICAgICAgICAgbVByZXZDYXB0dXJlVXMgPSB0aW1lVXM7CisgICAgICAgICAgICBtUHJldkZyYW1lVXMgPSB0aW1lVXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzbmFwIHRvIG5lYXJlc3QgY2FwdHVyZSBwb2ludAorICAgICAgICAgICAgaW50NjRfdCBuRnJhbWVzID0gKHRpbWVVcyArIG1UaW1lUGVyQ2FwdHVyZVVzIC8gMiAtIG1QcmV2Q2FwdHVyZVVzKQorICAgICAgICAgICAgICAgICAgICAvIG1UaW1lUGVyQ2FwdHVyZVVzOworICAgICAgICAgICAgaWYgKG5GcmFtZXMgPD0gMCkgeworICAgICAgICAgICAgICAgIC8vIHNraXAgdGhpcyBmcmFtZSBhcyBpdCdzIHRvbyBjbG9zZSB0byBwcmV2aW91cyBjYXB0dXJlCisgICAgICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGZyYW1lLCB0aW1lVXMgJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByZXZDYXB0dXJlVXMgPSBtUHJldkNhcHR1cmVVcyArIG5GcmFtZXMgKiBtVGltZVBlckNhcHR1cmVVczsKKyAgICAgICAgICAgIG1QcmV2RnJhbWVVcyArPSBtVGltZVBlckZyYW1lVXMgKiBuRnJhbWVzOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoInRpbWVVcyAlbGxkLCBjYXB0dXJlVXMgJWxsZCwgZnJhbWVVcyAlbGxkIiwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVVcyksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihtUHJldkNhcHR1cmVVcyksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihtUHJldkZyYW1lVXMpKTsKKworICAgICAgICByZXR1cm4gbVByZXZGcmFtZVVzOworICAgIH0gZWxzZSBpZiAobU1heFRpbWVzdGFtcEdhcFVzID4gMGxsKSB7CiAgICAgICAgIC8qIENhcCB0aW1lc3RhbXAgZ2FwIGJldHdlZW4gYWRqYWNlbnQgZnJhbWVzIHRvIHNwZWNpZmllZCBtYXgKICAgICAgICAgICoKICAgICAgICAgICogSW4gdGhlIHNjZW5hcmlvIG9mIGNhc3QgbWlycm9yaW5nLCBlbmNvZGluZyBjb3VsZCBiZSBzdXNwZW5kZWQgZm9yCkBAIC01NzIsNyArNjMxLDkgQEAKICAgICAgICAgbVByZXZPcmlnaW5hbFRpbWVVcyA9IG9yaWdpbmFsVGltZVVzOwogICAgICAgICBtUHJldk1vZGlmaWVkVGltZVVzID0gdGltZVVzOwogICAgICAgICBtT3JpZ2luYWxUaW1lVXMuYWRkKHRpbWVVcywgb3JpZ2luYWxUaW1lVXMpOwotICAgICAgICBBTE9HVigiSU4gIHRpbWVzdGFtcDogJWxsZCAtPiAlbGxkIiwgb3JpZ2luYWxUaW1lVXMsIHRpbWVVcyk7CisgICAgICAgIEFMT0dWKCJJTiAgdGltZXN0YW1wOiAlbGxkIC0+ICVsbGQiLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvcmlnaW5hbFRpbWVVcyksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVVcykpOwogICAgIH0KIAogICAgIHJldHVybiB0aW1lVXM7CkBAIC01OTUsMTAgKzY1NiwyMiBAQAogICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBoZWFkZXIgPSBjb2RlY0J1ZmZlci5tSGVhZGVyOwogICAgIENIRUNLKGhlYWRlci0+bkFsbG9jTGVuID49IDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7CiAgICAgT01YX1U4KiBkYXRhID0gaGVhZGVyLT5wQnVmZmVyOwotICAgIGNvbnN0IE9NWF9VMzIgdHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlOwotICAgIGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUgPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlOwotICAgIG1lbWNweShkYXRhLCAmdHlwZSwgNCk7Ci0gICAgbWVtY3B5KGRhdGEgKyA0LCAmaGFuZGxlLCBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7CisgICAgYnVmZmVyX2hhbmRsZV90IGhhbmRsZTsKKyAgICBpZiAoIW1Vc2VHcmFwaGljQnVmZmVySW5NZXRhKSB7CisgICAgICAgIGNvbnN0IE9NWF9VMzIgdHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlOworICAgICAgICBoYW5kbGUgPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlOworICAgICAgICBtZW1jcHkoZGF0YSwgJnR5cGUsIDQpOworICAgICAgICBtZW1jcHkoZGF0YSArIDQsICZoYW5kbGUsIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBjb2RlY0J1ZmZlciBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgR3JhcGhpY0J1ZmZlciwgc28KKyAgICAgICAgLy8gaXQgaXMgdmFsaWQgd2hpbGUgaXQgaXMgd2l0aCB0aGUgT01YIGNvbXBvbmVudAorICAgICAgICBjb25zdCBPTVhfVTMyIHR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhcGhpY0J1ZmZlcjsKKyAgICAgICAgbWVtY3B5KGRhdGEsICZ0eXBlLCA0KTsKKyAgICAgICAgLy8gcGFzc2luZyBhIG5vbi1yZWZlcmVuY2UtY291bnRlZCBncmFwaGljQnVmZmVyCisgICAgICAgIEdyYXBoaWNCdWZmZXIgKmJ1ZmZlciA9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLmdldCgpOworICAgICAgICBoYW5kbGUgPSBidWZmZXItPmhhbmRsZTsKKyAgICAgICAgbWVtY3B5KGRhdGEgKyA0LCAmYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgfQogCiAgICAgc3RhdHVzX3QgZXJyID0gbU5vZGVJbnN0YW5jZS0+ZW1wdHlEaXJlY3RCdWZmZXIoaGVhZGVyLCAwLAogICAgICAgICAgICAgNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpLCBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FLApAQCAtNjgwLDcgKzc1Myw3IEBACiB2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uRnJhbWVBdmFpbGFibGUoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CiAKLSAgICBBTE9HVigib25GcmFtZUF2YWlsYWJsZSBleGVjPSVkIGF2YWlsPSVkIiwKKyAgICBBTE9HVigib25GcmFtZUF2YWlsYWJsZSBleGVjPSVkIGF2YWlsPSV6dSIsCiAgICAgICAgICAgICBtRXhlY3V0aW5nLCBtTnVtRnJhbWVzQXZhaWxhYmxlKTsKIAogICAgIGlmIChtRW5kT2ZTdHJlYW0gfHwgbVN1c3BlbmRlZCkgewpAQCAtNjk0LDE1ICs3NjcsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtIGl0ZW07Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJRdWV1ZS0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UncmUgc2VlaW5nIHRoaXMgYnVmZmVyLCBhZGQgaXQgdG8gb3VyCiAgICAgICAgICAgICAvLyBzbG90IHRhYmxlLgogICAgICAgICAgICAgaWYgKGl0ZW0ubUdyYXBoaWNCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogc2V0dGluZyBtQnVmZmVyU2xvdCAlZCIsIGl0ZW0ubUJ1Zik7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGU6IHNldHRpbmcgbUJ1ZmZlclNsb3QgJWQiLCBpdGVtLm1CdWYpOwogICAgICAgICAgICAgICAgIG1CdWZmZXJTbG90W2l0ZW0ubUJ1Zl0gPSBpdGVtLm1HcmFwaGljQnVmZmVyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKICAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgaXRlbS5tRmVuY2UpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybjsKQEAgLTcyMiwxMyArNzk1LDEzIEBACiB2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uQnVmZmVyc1JlbGVhc2VkKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKLSAgICB1aW50MzJfdCBzbG90TWFzazsKLSAgICBpZiAobUJ1ZmZlclF1ZXVlLT5nZXRSZWxlYXNlZEJ1ZmZlcnMoJnNsb3RNYXNrKSAhPSBOT19FUlJPUikgeworICAgIHVpbnQ2NF90IHNsb3RNYXNrOworICAgIGlmIChtQ29uc3VtZXItPmdldFJlbGVhc2VkQnVmZmVycygmc2xvdE1hc2spICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dXKCJvbkJ1ZmZlcnNSZWxlYXNlZDogdW5hYmxlIHRvIGdldCByZWxlYXNlZCBidWZmZXIgc2V0Iik7Ci0gICAgICAgIHNsb3RNYXNrID0gMHhmZmZmZmZmZjsKKyAgICAgICAgc2xvdE1hc2sgPSAweGZmZmZmZmZmZmZmZmZmZmZVTEw7CiAgICAgfQogCi0gICAgQUxPR1YoIm9uQnVmZmVyc1JlbGVhc2VkOiAweCUwOHgiLCBzbG90TWFzayk7CisgICAgQUxPR1YoIm9uQnVmZmVyc1JlbGVhc2VkOiAweCUwMTYiIFBSSXg2NCwgc2xvdE1hc2spOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUzsgaSsrKSB7CiAgICAgICAgIGlmICgoc2xvdE1hc2sgJiAweDAxKSAhPSAwKSB7CkBAIC03MzgsNiArODExLDExIEBACiAgICAgfQogfQogCisvLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBjYWxsYmFjawordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIHsKKyAgICBBTE9HX0FTU0VSVChmYWxzZSwgIkdyYXBoaWNCdWZmZXJTb3VyY2UgY2FuJ3QgY29uc3VtZSBzaWRlYmFuZCBzdHJlYW1zIik7Cit9CisKIHN0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKAogICAgICAgICBpbnQ2NF90IHJlcGVhdEFmdGVyVXMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKQEAgLTc2Miw2ICs4NDAsMjcgQEAKIAogICAgIHJldHVybiBPSzsKIH0KKwordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRTa2lwRnJhbWVzQmVmb3JlVXMoaW50NjRfdCBza2lwRnJhbWVzQmVmb3JlVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1Ta2lwRnJhbWVzQmVmb3JlTnMgPQorICAgICAgICAgICAgKHNraXBGcmFtZXNCZWZvcmVVcyA+IDApID8gKHNraXBGcmFtZXNCZWZvcmVVcyAqIDEwMDApIDogLTFsbDsKK30KKworc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0VGltZUxhcHNlVXMoaW50NjRfdCogZGF0YSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgaWYgKG1FeGVjdXRpbmcgfHwgZGF0YVswXSA8PSAwbGwgfHwgZGF0YVsxXSA8PSAwbGwpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1UaW1lUGVyRnJhbWVVcyA9IGRhdGFbMF07CisgICAgbVRpbWVQZXJDYXB0dXJlVXMgPSBkYXRhWzFdOworCisgICAgcmV0dXJuIE9LOworfQorCiB2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICBjYXNlIGtXaGF0UmVwZWF0TGFzdEZyYW1lOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKaW5kZXggM2IwZTQ1NC4uYzA4NjBhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCkBAIC00OSw3ICs0OSw4IEBACiBjbGFzcyBHcmFwaGljQnVmZmVyU291cmNlIDogcHVibGljIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIHsKIHB1YmxpYzoKICAgICBHcmFwaGljQnVmZmVyU291cmNlKE9NWE5vZGVJbnN0YW5jZSogbm9kZUluc3RhbmNlLAotICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyV2lkdGgsIHVpbnQzMl90IGJ1ZmZlckhlaWdodCwgdWludDMyX3QgYnVmZmVyQ291bnQpOworICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyV2lkdGgsIHVpbnQzMl90IGJ1ZmZlckhlaWdodCwgdWludDMyX3QgYnVmZmVyQ291bnQsCisgICAgICAgICAgICBib29sIHVzZUdyYXBoaWNCdWZmZXJJbk1ldGEgPSBmYWxzZSk7CiAgICAgdmlydHVhbCB+R3JhcGhpY0J1ZmZlclNvdXJjZSgpOwogCiAgICAgLy8gV2UgY2FuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBmYWlscywgc28gd2UganVzdCBzZXQKQEAgLTYxLDcgKzYyLDcgQEAKICAgICAvLyBSZXR1cm5zIHRoZSBoYW5kbGUgdG8gdGhlIHByb2R1Y2VyIHNpZGUgb2YgdGhlIEJ1ZmZlclF1ZXVlLiAgQnVmZmVycwogICAgIC8vIHF1ZXVlZCBvbiB0aGlzIHdpbGwgYmUgcmVjZWl2ZWQgYnkgR3JhcGhpY0J1ZmZlclNvdXJjZS4KICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUJ1ZmZlclF1ZXVlOworICAgICAgICByZXR1cm4gbVByb2R1Y2VyOwogICAgIH0KIAogICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gT01YIHRyYW5zaXRpb25zIHRvIE9NWF9TdGF0ZUV4ZWN1dGluZywgd2hpY2ggbWVhbnMKQEAgLTExOCw2ICsxMTksMTcgQEAKICAgICAvLyBvZiBzdXNwZW5zaW9uIG9uIGlucHV0LgogICAgIHN0YXR1c190IHNldE1heFRpbWVzdGFtcEdhcFVzKGludDY0X3QgbWF4R2FwVXMpOwogCisgICAgLy8gU2V0cyB0aGUgdGltZSBsYXBzZSAob3Igc2xvdyBtb3Rpb24pIHBhcmFtZXRlcnMuCisgICAgLy8gZGF0YVswXSBpcyB0aGUgdGltZSAodXMpIGJldHdlZW4gdHdvIGZyYW1lcyBmb3IgcGxheWJhY2sKKyAgICAvLyBkYXRhWzFdIGlzIHRoZSB0aW1lICh1cykgYmV0d2VlbiB0d28gZnJhbWVzIGZvciBjYXB0dXJlCisgICAgLy8gV2hlbiBzZXQsIHRoZSBzYW1wbGUncyB0aW1lc3RhbXAgd2lsbCBiZSBtb2RpZmllZCB0byBwbGF5YmFjayBmcmFtZXJhdGUsCisgICAgLy8gYW5kIGNhcHR1cmUgdGltZXN0YW1wIHdpbGwgYmUgbW9kaWZpZWQgdG8gY2FwdHVyZSByYXRlLgorICAgIHN0YXR1c190IHNldFRpbWVMYXBzZVVzKGludDY0X3QqIGRhdGEpOworCisgICAgLy8gU2V0cyB0aGUgc3RhcnQgdGltZSB1cyAoaW4gc3lzdGVtIHRpbWUpLCBzYW1wbGVzIGJlZm9yZSB3aGljaCBzaG91bGQKKyAgICAvLyBiZSBkcm9wcGVkIGFuZCBub3Qgc3VibWl0dGVkIHRvIGVuY29kZXIKKyAgICB2b2lkIHNldFNraXBGcmFtZXNCZWZvcmVVcyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKKwogcHJvdGVjdGVkOgogICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gYSBuZXcgZnJhbWUgb2YKICAgICAvLyBkYXRhIGlzIGF2YWlsYWJsZS4gIElmIHdlJ3JlIGV4ZWN1dGluZyBhbmQgYSBjb2RlYyBidWZmZXIgaXMKQEAgLTEzMiw2ICsxNDQsMTEgQEAKICAgICAvLyBzZXQgb2YgbUJ1ZmZlclNsb3QgZW50cmllcy4KICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJzUmVsZWFzZWQoKTsKIAorICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBoYXMKKyAgICAvLyBjaGFuZ2VkIHRoZSBzaWRlYmFuZCBzdHJlYW0uIEdyYXBoaWNCdWZmZXJTb3VyY2UgZG9lc24ndCBoYW5kbGUgc2lkZWJhbmQKKyAgICAvLyBzdHJlYW1zIHNvIHRoaXMgaXMgYSBuby1vcCAoYW5kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQpLgorICAgIHZpcnR1YWwgdm9pZCBvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpOworCiBwcml2YXRlOgogICAgIC8vIEtlZXAgdHJhY2sgb2YgY29kZWMgaW5wdXQgYnVmZmVycy4gIFRoZXkgbWF5IGVpdGhlciBiZSBhdmFpbGFibGUKICAgICAvLyAobUdyYXBoaWNCdWZmZXIgPT0gTlVMTCkgb3IgaW4gdXNlIGJ5IHRoZSBjb2RlYy4KQEAgLTE5NCw4ICsyMTEsMTEgQEAKIAogICAgIGJvb2wgbVN1c3BlbmRlZDsKIAotICAgIC8vIFdlIGNvbnN1bWUgZ3JhcGhpYyBidWZmZXJzIGZyb20gdGhpcy4KLSAgICBzcDxCdWZmZXJRdWV1ZT4gbUJ1ZmZlclF1ZXVlOworICAgIC8vIE91ciBCdWZmZXJRdWV1ZSBpbnRlcmZhY2VzLiBtUHJvZHVjZXIgaXMgcGFzc2VkIHRvIHRoZSBwcm9kdWNlciB0aHJvdWdoCisgICAgLy8gZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlciwgYW5kIG1Db25zdW1lciBpcyB1c2VkIGludGVybmFsbHkgdG8gcmV0cmlldmUKKyAgICAvLyB0aGUgYnVmZmVycyBxdWV1ZWQgYnkgdGhlIHByb2R1Y2VyLgorICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBtQ29uc3VtZXI7CiAKICAgICAvLyBOdW1iZXIgb2YgZnJhbWVzIHBlbmRpbmcgaW4gQnVmZmVyUXVldWUgdGhhdCBoYXZlbid0IHlldCBiZWVuCiAgICAgLy8gZm9yd2FyZGVkIHRvIHRoZSBjb2RlYy4KQEAgLTIyMywxNiArMjQzLDE3IEBACiAgICAgZW51bSB7CiAgICAgICAgIGtSZXBlYXRMYXN0RnJhbWVDb3VudCA9IDEwLAogICAgIH07Ci0gICAgaW50NjRfdCBtUmVwZWF0QWZ0ZXJVczsKLSAgICBpbnQ2NF90IG1NYXhUaW1lc3RhbXBHYXBVczsKIAogICAgIEtleWVkVmVjdG9yPGludDY0X3QsIGludDY0X3Q+IG1PcmlnaW5hbFRpbWVVczsKKyAgICBpbnQ2NF90IG1NYXhUaW1lc3RhbXBHYXBVczsKICAgICBpbnQ2NF90IG1QcmV2T3JpZ2luYWxUaW1lVXM7CiAgICAgaW50NjRfdCBtUHJldk1vZGlmaWVkVGltZVVzOworICAgIGludDY0X3QgbVNraXBGcmFtZXNCZWZvcmVOczsKIAogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8R3JhcGhpY0J1ZmZlclNvdXJjZT4gPiBtUmVmbGVjdG9yOwogCisgICAgaW50NjRfdCBtUmVwZWF0QWZ0ZXJVczsKICAgICBpbnQzMl90IG1SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uOwogICAgIGludDY0X3QgbVJlcGVhdExhc3RGcmFtZVRpbWVzdGFtcDsKICAgICBpbnQzMl90IG1SZXBlYXRMYXN0RnJhbWVDb3VudDsKQEAgLTI0NSw2ICsyNjYsMTQgQEAKICAgICAvLyBubyBjb2RlYyBidWZmZXIgd2FzIGF2YWlsYWJsZSBhdCB0aGUgdGltZS4KICAgICBib29sIG1SZXBlYXRCdWZmZXJEZWZlcnJlZDsKIAorICAgIC8vIFRpbWUgbGFwc2UgLyBzbG93IG1vdGlvbiBjb25maWd1cmF0aW9uCisgICAgaW50NjRfdCBtVGltZVBlckNhcHR1cmVVczsKKyAgICBpbnQ2NF90IG1UaW1lUGVyRnJhbWVVczsKKyAgICBpbnQ2NF90IG1QcmV2Q2FwdHVyZVVzOworICAgIGludDY0X3QgbVByZXZGcmFtZVVzOworCisgICAgYm9vbCBtVXNlR3JhcGhpY0J1ZmZlckluTWV0YTsKKwogICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoR3JhcGhpY0J1ZmZlclNvdXJjZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCmluZGV4IDQxNTkxMGEuLjExYjBkNmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJPTVgiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0xOTAsNyArMTkyLDcgQEAKICAgICByZXR1cm4gKGluc3RhbmNlID09IE5VTEwgPyBmYWxzZSA6IGluc3RhbmNlLT5pc1NlY3VyZSgpKTsKIH0KIAotYm9vbCBPTVg6OmxpdmVzTG9jYWxseShub2RlX2lkIG5vZGUsIHBpZF90IHBpZCkgeworYm9vbCBPTVg6OmxpdmVzTG9jYWxseShub2RlX2lkIC8qIG5vZGUgKi8sIHBpZF90IHBpZCkgewogICAgIHJldHVybiBwaWQgPT0gZ2V0cGlkKCk7CiB9CiAKQEAgLTIzNiw3ICsyMzgsNyBAQAogICAgICAgICAgICAgaW5zdGFuY2UsICZoYW5kbGUpOwogCiAgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIEFMT0dWKCJGQUlMRUQgdG8gYWxsb2NhdGUgb214IGNvbXBvbmVudCAnJXMnIiwgbmFtZSk7CisgICAgICAgIEFMT0dFKCJGQUlMRUQgdG8gYWxsb2NhdGUgb214IGNvbXBvbmVudCAnJXMnIiwgbmFtZSk7CiAKICAgICAgICAgaW5zdGFuY2UtPm9uR2V0SGFuZGxlRmFpbGVkKCk7CiAKQEAgLTI5MCw2ICsyOTIsNyBAQAogc3RhdHVzX3QgT01YOjpnZXRQYXJhbWV0ZXIoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOREVYVFlQRSBpbmRleCwKICAgICAgICAgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCJnZXRQYXJhbWV0ZXIoJXUgJSN4ICVwICV6ZCkiLCBub2RlLCBpbmRleCwgcGFyYW1zLCBzaXplKTsKICAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBpbmRleCwgcGFyYW1zLCBzaXplKTsKIH0KQEAgLTI5Nyw2ICszMDAsNyBAQAogc3RhdHVzX3QgT01YOjpzZXRQYXJhbWV0ZXIoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOREVYVFlQRSBpbmRleCwKICAgICAgICAgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoJXUgJSN4ICVwICV6ZCkiLCBub2RlLCBpbmRleCwgcGFyYW1zLCBzaXplKTsKICAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBpbmRleCwgcGFyYW1zLCBzaXplKTsKIH0KQEAgLTM0Myw2ICszNDcsMTMgQEAKICAgICAgICAgICAgIHBvcnRJbmRleCwgZW5hYmxlLCBtYXhGcmFtZVdpZHRoLCBtYXhGcmFtZUhlaWdodCk7CiB9CiAKK3N0YXR1c190IE9NWDo6Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwKKyAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpIHsKKyAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBwb3J0SW5kZXgsIHR1bm5lbGVkLCBhdWRpb0h3U3luYywgc2lkZWJhbmRIYW5kbGUpOworfQorCiBzdGF0dXNfdCBPTVg6OnVzZUJ1ZmZlcigKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CkBAIC00MjksOCArNDQwLDggQEAKICAgICAgICAgT01YX0lOIE9NWF9FVkVOVFRZUEUgZUV2ZW50LAogICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTEsCiAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5EYXRhMiwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgcEV2ZW50RGF0YSkgewotICAgIEFMT0dWKCJPbkV2ZW50KCVkLCAlbGQsICVsZCkiLCBlRXZlbnQsIG5EYXRhMSwgbkRhdGEyKTsKKyAgICAgICAgT01YX0lOIE9NWF9QVFIgLyogcEV2ZW50RGF0YSAqLykgeworICAgIEFMT0dWKCJPbkV2ZW50KCVkLCAlIiBQUkl1MzIiLCAlIiBQUkl1MzIgIikiLCBlRXZlbnQsIG5EYXRhMSwgbkRhdGEyKTsKIAogICAgIC8vIEZvcndhcmQgdG8gT01YTm9kZUluc3RhbmNlLgogICAgIGZpbmRJbnN0YW5jZShub2RlKS0+b25FdmVudChlRXZlbnQsIG5EYXRhMSwgbkRhdGEyKTsKQEAgLTQ0OCwxMyArNDU5LDEzIEBACiB9CiAKIE9NWF9FUlJPUlRZUEUgT01YOjpPbkVtcHR5QnVmZmVyRG9uZSgKLSAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpIHsKKyAgICAgICAgbm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpIHsKICAgICBBTE9HVigiT25FbXB0eUJ1ZmZlckRvbmUgYnVmZmVyPSVwIiwgcEJ1ZmZlcik7CiAKICAgICBvbXhfbWVzc2FnZSBtc2c7CiAgICAgbXNnLnR5cGUgPSBvbXhfbWVzc2FnZTo6RU1QVFlfQlVGRkVSX0RPTkU7CiAgICAgbXNnLm5vZGUgPSBub2RlOwotICAgIG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlciA9IHBCdWZmZXI7CisgICAgbXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyID0gYnVmZmVyOwogCiAgICAgZmluZERpc3BhdGNoZXIobm9kZSktPnBvc3QobXNnKTsKIApAQCAtNDYyLDE5ICs0NzMsMTcgQEAKIH0KIAogT01YX0VSUk9SVFlQRSBPTVg6Ok9uRmlsbEJ1ZmZlckRvbmUoCi0gICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKSB7CisgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKSB7CiAgICAgQUxPR1YoIk9uRmlsbEJ1ZmZlckRvbmUgYnVmZmVyPSVwIiwgcEJ1ZmZlcik7CiAKICAgICBvbXhfbWVzc2FnZSBtc2c7CiAgICAgbXNnLnR5cGUgPSBvbXhfbWVzc2FnZTo6RklMTF9CVUZGRVJfRE9ORTsKICAgICBtc2cubm9kZSA9IG5vZGU7Ci0gICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyID0gcEJ1ZmZlcjsKKyAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIgPSBidWZmZXI7CiAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucmFuZ2Vfb2Zmc2V0ID0gcEJ1ZmZlci0+bk9mZnNldDsKICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9sZW5ndGggPSBwQnVmZmVyLT5uRmlsbGVkTGVuOwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzID0gcEJ1ZmZlci0+bkZsYWdzOwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnRpbWVzdGFtcCA9IHBCdWZmZXItPm5UaW1lU3RhbXA7Ci0gICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucGxhdGZvcm1fcHJpdmF0ZSA9IHBCdWZmZXItPnBQbGF0Zm9ybVByaXZhdGU7Ci0gICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuZGF0YV9wdHIgPSBwQnVmZmVyLT5wQnVmZmVyOwogCiAgICAgZmluZERpc3BhdGNoZXIobm9kZSktPnBvc3QobXNnKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAppbmRleCA2YjZkMGFiLi5hZTNjYjMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcApAQCAtOTEsNyArOTEsNyBAQAogICAgIH0KIAogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9Nb3JlKSB7Ci0gICAgICAgIEFMT0dFKCJPTVggcGx1Z2luIGZhaWxlZCB3LyBlcnJvciAweCUwOHggYWZ0ZXIgcmVnaXN0ZXJpbmcgJWQgIgorICAgICAgICBBTE9HRSgiT01YIHBsdWdpbiBmYWlsZWQgdy8gZXJyb3IgMHglMDh4IGFmdGVyIHJlZ2lzdGVyaW5nICV6dSAiCiAgICAgICAgICAgICAgImNvbXBvbmVudHMiLCBlcnIsIG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuc2l6ZSgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IDU3N2U4MDQuLmNjNzBiNjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC05MiwxMCArOTIsMTIgQEAKIE9NWE5vZGVJbnN0YW5jZTo6T01YTm9kZUluc3RhbmNlKAogICAgICAgICBPTVggKm93bmVyLCBjb25zdCBzcDxJT01YT2JzZXJ2ZXI+ICZvYnNlcnZlciwgY29uc3QgY2hhciAqbmFtZSkKICAgICA6IG1Pd25lcihvd25lciksCi0gICAgICBtTm9kZUlEKE5VTEwpLAorICAgICAgbU5vZGVJRCgwKSwKICAgICAgIG1IYW5kbGUoTlVMTCksCiAgICAgICBtT2JzZXJ2ZXIob2JzZXJ2ZXIpLAotICAgICAgbUR5aW5nKGZhbHNlKSB7CisgICAgICBtRHlpbmcoZmFsc2UpLAorICAgICAgbUJ1ZmZlcklEQ291bnQoMCkKK3sKICAgICBtSXNTZWN1cmUgPSBBU3RyaW5nKG5hbWUpLmVuZHNXaXRoKCIuc2VjdXJlIik7CiB9CiAKQEAgLTE0Niw2ICsxNDgsMTEgQEAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6ZnJlZU5vZGUoT01YTWFzdGVyICptYXN0ZXIpIHsKICAgICBzdGF0aWMgaW50MzJfdCBrTWF4TnVtSXRlcmF0aW9ucyA9IDEwOwogCisgICAgLy8gZXhpdCBpZiB3ZSBoYXZlIGFscmVhZHkgZnJlZWQgdGhlIG5vZGUKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKICAgICAvLyBUcmFuc2l0aW9uIHRoZSBub2RlIGZyb20gaXRzIGN1cnJlbnQgc3RhdGUgYWxsIHRoZSB3YXkgZG93bgogICAgIC8vIHRvICJMb2FkZWQiLgogICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGFsbCBhY3RpdmUgYnVmZmVycyBhcmUgcHJvcGVybHkgZnJlZWQgZXZlbgpAQCAtMjMzLDcgKzI0MCw3IEBACiAgICAgfQogCiAgICAgbU93bmVyLT5pbnZhbGlkYXRlTm9kZUlEKG1Ob2RlSUQpOwotICAgIG1Ob2RlSUQgPSBOVUxMOworICAgIG1Ob2RlSUQgPSAwOwogCiAgICAgQUxPR1YoIk9NWE5vZGVJbnN0YW5jZSBnb2luZyBhd2F5LiIpOwogICAgIGRlbGV0ZSB0aGlzOwpAQCAtMjY3LDI2ICsyNzQsMjYgQEAKIH0KIAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpnZXRQYXJhbWV0ZXIoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3QgLyogc2l6ZSAqLykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9HZXRQYXJhbWV0ZXIobUhhbmRsZSwgaW5kZXgsIHBhcmFtcyk7Ci0KKyAgICBBTE9HRV9JRihlcnIgIT0gT01YX0Vycm9yTm9uZSwgImdldFBhcmFtZXRlciglZCkgRVJST1I6ICUjeCIsIGluZGV4LCBlcnIpOwogICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKIH0KIAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpzZXRQYXJhbWV0ZXIoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3QgLyogc2l6ZSAqLykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9TZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBtSGFuZGxlLCBpbmRleCwgY29uc3RfY2FzdDx2b2lkICo+KHBhcmFtcykpOwotCisgICAgQUxPR0VfSUYoZXJyICE9IE9NWF9FcnJvck5vbmUsICJzZXRQYXJhbWV0ZXIoJWQpIEVSUk9SOiAlI3giLCBpbmRleCwgZXJyKTsKICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CiB9CiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6Z2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IC8qIHNpemUgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfR2V0Q29uZmlnKG1IYW5kbGUsIGluZGV4LCBwYXJhbXMpOwpAQCAtMjk0LDcgKzMwMSw3IEBACiB9CiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IC8qIHNpemUgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfU2V0Q29uZmlnKApAQCAtMzkwLDIwICszOTcsMzkgQEAKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCiAgICAgICAgIE9NWF9CT09MIGVuYWJsZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbChwb3J0SW5kZXgsIGVuYWJsZSk7CisgICAgcmV0dXJuIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbCgKKyAgICAgICAgICAgIHBvcnRJbmRleCwgZW5hYmxlLAorICAgICAgICAgICAgT01YX0ZBTFNFIC8qIHVzZUdyYXBoaWNCdWZmZXIgKi8sIE5VTEwgLyogdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSAqLyk7CiB9CiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKLSAgICAgICAgT01YX0JPT0wgZW5hYmxlKSB7CisgICAgICAgIE9NWF9CT09MIGVuYWJsZSwKKyAgICAgICAgT01YX0JPT0wgdXNlR3JhcGhpY0J1ZmZlciwKKyAgICAgICAgT01YX0JPT0wgKnVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEpIHsKICAgICBPTVhfSU5ERVhUWVBFIGluZGV4OwogICAgIE9NWF9TVFJJTkcgbmFtZSA9IGNvbnN0X2Nhc3Q8T01YX1NUUklORz4oCiAgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiKTsKIAotICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0dldEV4dGVuc2lvbkluZGV4KG1IYW5kbGUsIG5hbWUsICZpbmRleCk7CisgICAgT01YX1NUUklORyBncmFwaGljQnVmZmVyTmFtZSA9IGNvbnN0X2Nhc3Q8T01YX1NUUklORz4oCisgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlR3JhcGhpY0J1ZmZlckluTWV0YURhdGEiKTsKKyAgICBpZiAodXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgPSAmdXNlR3JhcGhpY0J1ZmZlcjsKKyAgICB9CisKKyAgICBPTVhfRVJST1JUWVBFIGVyciA9CisgICAgICAgICh1c2VHcmFwaGljQnVmZmVyICYmIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQpCisgICAgICAgICAgICAgICAgPyBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgobUhhbmRsZSwgZ3JhcGhpY0J1ZmZlck5hbWUsICZpbmRleCkKKyAgICAgICAgICAgICAgICA6IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICBpZiAoZXJyID09IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgKnVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgPSBPTVhfVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgICAqdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSA9IE9NWF9GQUxTRTsKKyAgICAgICAgZXJyID0gT01YX0dldEV4dGVuc2lvbkluZGV4KG1IYW5kbGUsIG5hbWUsICZpbmRleCk7CisgICAgfQorCiAgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CiAgICAgICAgIEFMT0dFKCJPTVhfR2V0RXh0ZW5zaW9uSW5kZXggJXMgZmFpbGVkIiwgbmFtZSk7Ci0KICAgICAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwogICAgIH0KIApAQCAtNDE4LDYgKzQ0NCw3IEBACiAgICAgcGFyYW1zLmJTdG9yZU1ldGFEYXRhID0gZW5hYmxlOwogICAgIGlmICgoZXJyID0gT01YX1NldFBhcmFtZXRlcihtSGFuZGxlLCBpbmRleCwgJnBhcmFtcykpICE9IE9NWF9FcnJvck5vbmUpIHsKICAgICAgICAgQUxPR0UoIk9NWF9TZXRQYXJhbWV0ZXIoKSBmYWlsZWQgZm9yIFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnM6IDB4JTA4eCIsIGVycik7CisgICAgICAgICp1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhID0gT01YX0ZBTFNFOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAgICAgcmV0dXJuIGVycjsKQEAgLTQ1Nyw2ICs0ODQsNDkgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLCBPTVhfVTMyIGF1ZGlvSHdTeW5jLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisKKyAgICBPTVhfSU5ERVhUWVBFIGluZGV4OworICAgIE9NWF9TVFJJTkcgbmFtZSA9IGNvbnN0X2Nhc3Q8T01YX1NUUklORz4oCisgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSIpOworCisgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgobUhhbmRsZSwgbmFtZSwgJmluZGV4KTsKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgQUxPR0UoImNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSBleHRlbnNpb24gaXMgbWlzc2luZyEiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOworICAgIH0KKworICAgIENvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZVBhcmFtcyB0dW5uZWxQYXJhbXM7CisgICAgdHVubmVsUGFyYW1zLm5TaXplID0gc2l6ZW9mKHR1bm5lbFBhcmFtcyk7CisgICAgdHVubmVsUGFyYW1zLm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7CisgICAgdHVubmVsUGFyYW1zLm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgdHVubmVsUGFyYW1zLm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICB0dW5uZWxQYXJhbXMublZlcnNpb24ucy5uU3RlcCA9IDA7CisKKyAgICB0dW5uZWxQYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKyAgICB0dW5uZWxQYXJhbXMuYlR1bm5lbGVkID0gdHVubmVsZWQ7CisgICAgdHVubmVsUGFyYW1zLm5BdWRpb0h3U3luYyA9IGF1ZGlvSHdTeW5jOworICAgIGVyciA9IE9NWF9TZXRQYXJhbWV0ZXIobUhhbmRsZSwgaW5kZXgsICZ0dW5uZWxQYXJhbXMpOworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBBTE9HRSgiY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlIGZhaWxlZCEgKGVyciAlZCkuIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgZXJyID0gT01YX0dldFBhcmFtZXRlcihtSGFuZGxlLCBpbmRleCwgJnR1bm5lbFBhcmFtcyk7CisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIEFMT0dFKCJHZXRWaWRlb1R1bm5lbFdpbmRvdyBmYWlsZWQhIChlcnIgJWQpLiIsIGVycik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBpZiAoc2lkZWJhbmRIYW5kbGUpIHsKKyAgICAgICAgKnNpZGViYW5kSGFuZGxlID0gKG5hdGl2ZV9oYW5kbGVfdCopdHVubmVsUGFyYW1zLnBTaWRlYmFuZFdpbmRvdzsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnVzZUJ1ZmZlcigKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIpIHsKQEAgLTQ4Myw3ICs1NTMsNyBAQAogCiAgICAgQ0hFQ0tfRVEoaGVhZGVyLT5wQXBwUHJpdmF0ZSwgYnVmZmVyX21ldGEpOwogCi0gICAgKmJ1ZmZlciA9IGhlYWRlcjsKKyAgICAqYnVmZmVyID0gbWFrZUJ1ZmZlcklEKGhlYWRlcik7CiAKICAgICBhZGRBY3RpdmVCdWZmZXIocG9ydEluZGV4LCAqYnVmZmVyKTsKIApAQCAtNTM5LDcgKzYwOSw3IEBACiAgICAgQ0hFQ0tfRVEoaGVhZGVyLT5wQnVmZmVyLCBidWZmZXJIYW5kbGUpOwogICAgIENIRUNLX0VRKGhlYWRlci0+cEFwcFByaXZhdGUsIGJ1ZmZlck1ldGEpOwogCi0gICAgKmJ1ZmZlciA9IGhlYWRlcjsKKyAgICAqYnVmZmVyID0gbWFrZUJ1ZmZlcklEKGhlYWRlcik7CiAKICAgICBhZGRBY3RpdmVCdWZmZXIocG9ydEluZGV4LCAqYnVmZmVyKTsKIApAQCAtNjAzLDcgKzY3Myw3IEBACiAKICAgICBDSEVDS19FUShoZWFkZXItPnBBcHBQcml2YXRlLCBidWZmZXJNZXRhKTsKIAotICAgICpidWZmZXIgPSBoZWFkZXI7CisgICAgKmJ1ZmZlciA9IG1ha2VCdWZmZXJJRChoZWFkZXIpOwogCiAgICAgYWRkQWN0aXZlQnVmZmVyKHBvcnRJbmRleCwgKmJ1ZmZlcik7CiAKQEAgLTYxMSwxMSArNjgxLDExIEBACiB9CiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6dXBkYXRlR3JhcGhpY0J1ZmZlckluTWV0YSgKLSAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBncmFwaGljQnVmZmVyLAorICAgICAgICBPTVhfVTMyIC8qIHBvcnRJbmRleCAqLywgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGdyYXBoaWNCdWZmZXIsCiAgICAgICAgIE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopKGJ1ZmZlcik7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGZpbmRCdWZmZXJIZWFkZXIoYnVmZmVyKTsKICAgICBWaWRlb0RlY29kZXJPdXRwdXRNZXRhRGF0YSAqbWV0YWRhdGEgPQogICAgICAgICAoVmlkZW9EZWNvZGVyT3V0cHV0TWV0YURhdGEgKikoaGVhZGVyLT5wQnVmZmVyKTsKICAgICBCdWZmZXJNZXRhICpidWZmZXJNZXRhID0gKEJ1ZmZlck1ldGEgKikoaGVhZGVyLT5wQXBwUHJpdmF0ZSk7CkBAIC02MzcsNyArNzA3LDEwIEBACiAgICAgfQogCiAgICAgLy8gSW5wdXQgYnVmZmVycyB3aWxsIGhvbGQgbWV0YS1kYXRhIChncmFsbG9jIHJlZmVyZW5jZXMpLgotICAgIGVyciA9IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbChwb3J0SW5kZXgsIE9NWF9UUlVFKTsKKyAgICBPTVhfQk9PTCB1c2luZ0dyYXBoaWNCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgZXJyID0gc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAorICAgICAgICAgICAgcG9ydEluZGV4LCBPTVhfVFJVRSwKKyAgICAgICAgICAgIE9NWF9UUlVFIC8qIHVzZUdyYXBoaWNCdWZmZXIgKi8sICZ1c2luZ0dyYXBoaWNCdWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC02NjMsNyArNzM2LDcgQEAKIAogICAgIEdyYXBoaWNCdWZmZXJTb3VyY2UqIGJ1ZmZlclNvdXJjZSA9IG5ldyBHcmFwaGljQnVmZmVyU291cmNlKAogICAgICAgICAgICAgdGhpcywgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQsCi0gICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIHVzaW5nR3JhcGhpY0J1ZmZlcik7CiAgICAgaWYgKChlcnIgPSBidWZmZXJTb3VyY2UtPmluaXRDaGVjaygpKSAhPSBPSykgewogICAgICAgICBkZWxldGUgYnVmZmVyU291cmNlOwogICAgICAgICByZXR1cm4gZXJyOwpAQCAtNzExLDcgKzc4NCw3IEBACiAKICAgICBDSEVDS19FUShoZWFkZXItPnBBcHBQcml2YXRlLCBidWZmZXJfbWV0YSk7CiAKLSAgICAqYnVmZmVyID0gaGVhZGVyOworICAgICpidWZmZXIgPSBtYWtlQnVmZmVySUQoaGVhZGVyKTsKICAgICAqYnVmZmVyX2RhdGEgPSBoZWFkZXItPnBCdWZmZXI7CiAKICAgICBhZGRBY3RpdmVCdWZmZXIocG9ydEluZGV4LCAqYnVmZmVyKTsKQEAgLTc0OSw3ICs4MjIsNyBAQAogCiAgICAgQ0hFQ0tfRVEoaGVhZGVyLT5wQXBwUHJpdmF0ZSwgYnVmZmVyX21ldGEpOwogCi0gICAgKmJ1ZmZlciA9IGhlYWRlcjsKKyAgICAqYnVmZmVyID0gbWFrZUJ1ZmZlcklEKGhlYWRlcik7CiAKICAgICBhZGRBY3RpdmVCdWZmZXIocG9ydEluZGV4LCAqYnVmZmVyKTsKIApAQCAtNzY3LDEzICs4NDAsMTQgQEAKIAogICAgIHJlbW92ZUFjdGl2ZUJ1ZmZlcihwb3J0SW5kZXgsIGJ1ZmZlcik7CiAKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopYnVmZmVyOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBmaW5kQnVmZmVySGVhZGVyKGJ1ZmZlcik7CiAgICAgQnVmZmVyTWV0YSAqYnVmZmVyX21ldGEgPSBzdGF0aWNfY2FzdDxCdWZmZXJNZXRhICo+KGhlYWRlci0+cEFwcFByaXZhdGUpOwogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfRnJlZUJ1ZmZlcihtSGFuZGxlLCBwb3J0SW5kZXgsIGhlYWRlcik7CiAKICAgICBkZWxldGUgYnVmZmVyX21ldGE7CiAgICAgYnVmZmVyX21ldGEgPSBOVUxMOworICAgIGludmFsaWRhdGVCdWZmZXJJRChidWZmZXIpOwogCiAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwogfQpAQCAtNzgxLDcgKzg1NSw3IEBACiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmZpbGxCdWZmZXIoT01YOjpidWZmZXJfaWQgYnVmZmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilidWZmZXI7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGZpbmRCdWZmZXJIZWFkZXIoYnVmZmVyKTsKICAgICBoZWFkZXItPm5GaWxsZWRMZW4gPSAwOwogICAgIGhlYWRlci0+bk9mZnNldCA9IDA7CiAgICAgaGVhZGVyLT5uRmxhZ3MgPSAwOwpAQCAtNzk3LDcgKzg3MSw3IEBACiAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKWJ1ZmZlcjsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gZmluZEJ1ZmZlckhlYWRlcihidWZmZXIpOwogICAgIC8vIHJhbmdlTGVuZ3RoIGFuZCByYW5nZU9mZnNldCBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBhbGxvY2F0ZWQgZGF0YSBpbiB0aGUgYnVmZmVyLgogICAgIC8vIGNvcm5lciBjYXNlOiB3ZSBwZXJtaXQgcmFuZ2VPZmZzZXQgPT0gZW5kLW9mLWJ1ZmZlciB3aXRoIHJhbmdlTGVuZ3RoID09IDAuCiAgICAgaWYgKHJhbmdlT2Zmc2V0ID4gaGVhZGVyLT5uQWxsb2NMZW4KQEAgLTg1Nyw2ICs5MzEsOCBAQAogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9TVVNQRU5EOgogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9SRVBFQVRfUFJFVklPVVNfRlJBTUVfREVMQVk6CiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX01BWF9USU1FU1RBTVBfR0FQOgorICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9TVEFSVF9USU1FOgorICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiAmYnVmZmVyU291cmNlID0KICAgICAgICAgICAgICAgICBnZXRHcmFwaGljQnVmZmVyU291cmNlKCk7CkBAIC04ODEsNyArOTU3LDggQEAKICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSAqKGludDY0X3QgKilkYXRhOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclNvdXJjZS0+c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMoZGVsYXlVcyk7Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09CisgICAgICAgICAgICAgICAgICAgIElPTVg6OklOVEVSTkFMX09QVElPTl9NQVhfVElNRVNUQU1QX0dBUCl7CiAgICAgICAgICAgICAgICAgaWYgKHNpemUgIT0gc2l6ZW9mKGludDY0X3QpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICB9CkBAIC04ODksNiArOTY2LDIwIEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBtYXhHYXBVcyA9ICooaW50NjRfdCAqKWRhdGE7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyU291cmNlLT5zZXRNYXhUaW1lc3RhbXBHYXBVcyhtYXhHYXBVcyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoaW50NjRfdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3Qgc2tpcEZyYW1lc0JlZm9yZVVzID0gKihpbnQ2NF90ICopZGF0YTsKKworICAgICAgICAgICAgICAgIGJ1ZmZlclNvdXJjZS0+c2V0U2tpcEZyYW1lc0JlZm9yZVVzKHNraXBGcmFtZXNCZWZvcmVVcyk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBJT01YOjpJTlRFUk5BTF9PUFRJT05fVElNRV9MQVBTRQorICAgICAgICAgICAgICAgIGlmIChzaXplICE9IHNpemVvZihpbnQ2NF90KSAqIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ1ZmZlclNvdXJjZS0+c2V0VGltZUxhcHNlVXMoKGludDY0X3QgKilkYXRhKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE9LOwpAQCAtOTA0LDggKzk5NSw3IEBACiAKICAgICBpZiAobXNnLnR5cGUgPT0gb214X21lc3NhZ2U6OkZJTExfQlVGRkVSX0RPTkUpIHsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlciA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxPTVhfQlVGRkVSSEVBREVSVFlQRSAqPigKLSAgICAgICAgICAgICAgICAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyKTsKKyAgICAgICAgICAgIGZpbmRCdWZmZXJIZWFkZXIobXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyKTsKIAogICAgICAgICBCdWZmZXJNZXRhICpidWZmZXJfbWV0YSA9CiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxCdWZmZXJNZXRhICo+KGJ1ZmZlci0+cEFwcFByaXZhdGUpOwpAQCAtOTMwLDggKzEwMjAsNyBAQAogICAgICAgICAgICAgLy8gYmUgdmVyeSBjb25mdXNlZC4KIAogICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8T01YX0JVRkZFUkhFQURFUlRZUEUgKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5idWZmZXJfZGF0YS5idWZmZXIpOworICAgICAgICAgICAgICAgIGZpbmRCdWZmZXJIZWFkZXIobXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyKTsKIAogICAgICAgICAgICAgYnVmZmVyU291cmNlLT5jb2RlY0J1ZmZlckVtcHRpZWQoYnVmZmVyKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTk2OCw3ICsxMDU3LDcgQEAKIAogLy8gc3RhdGljCiBPTVhfRVJST1JUWVBFIE9NWE5vZGVJbnN0YW5jZTo6T25FdmVudCgKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAvKiBoQ29tcG9uZW50ICovLAogICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwRGF0YSwKICAgICAgICAgT01YX0lOIE9NWF9FVkVOVFRZUEUgZUV2ZW50LAogICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTEsCkBAIC05ODQsMjYgKzEwNzMsMjggQEAKIAogLy8gc3RhdGljCiBPTVhfRVJST1JUWVBFIE9NWE5vZGVJbnN0YW5jZTo6T25FbXB0eUJ1ZmZlckRvbmUoCi0gICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgLyogaENvbXBvbmVudCAqLywKICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCiAgICAgICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcikgewogICAgIE9NWE5vZGVJbnN0YW5jZSAqaW5zdGFuY2UgPSBzdGF0aWNfY2FzdDxPTVhOb2RlSW5zdGFuY2UgKj4ocEFwcERhdGEpOwogICAgIGlmIChpbnN0YW5jZS0+bUR5aW5nKSB7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2UtPm93bmVyKCktPk9uRW1wdHlCdWZmZXJEb25lKGluc3RhbmNlLT5ub2RlSUQoKSwgcEJ1ZmZlcik7CisgICAgcmV0dXJuIGluc3RhbmNlLT5vd25lcigpLT5PbkVtcHR5QnVmZmVyRG9uZShpbnN0YW5jZS0+bm9kZUlEKCksCisgICAgICAgICAgICBpbnN0YW5jZS0+ZmluZEJ1ZmZlcklEKHBCdWZmZXIpLCBwQnVmZmVyKTsKIH0KIAogLy8gc3RhdGljCiBPTVhfRVJST1JUWVBFIE9NWE5vZGVJbnN0YW5jZTo6T25GaWxsQnVmZmVyRG9uZSgKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAvKiBoQ29tcG9uZW50ICovLAogICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwRGF0YSwKICAgICAgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKSB7CiAgICAgT01YTm9kZUluc3RhbmNlICppbnN0YW5jZSA9IHN0YXRpY19jYXN0PE9NWE5vZGVJbnN0YW5jZSAqPihwQXBwRGF0YSk7CiAgICAgaWYgKGluc3RhbmNlLT5tRHlpbmcpIHsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQotICAgIHJldHVybiBpbnN0YW5jZS0+b3duZXIoKS0+T25GaWxsQnVmZmVyRG9uZShpbnN0YW5jZS0+bm9kZUlEKCksIHBCdWZmZXIpOworICAgIHJldHVybiBpbnN0YW5jZS0+b3duZXIoKS0+T25GaWxsQnVmZmVyRG9uZShpbnN0YW5jZS0+bm9kZUlEKCksCisgICAgICAgICAgICBpbnN0YW5jZS0+ZmluZEJ1ZmZlcklEKHBCdWZmZXIpLCBwQnVmZmVyKTsKIH0KIAogdm9pZCBPTVhOb2RlSW5zdGFuY2U6OmFkZEFjdGl2ZUJ1ZmZlcihPTVhfVTMyIHBvcnRJbmRleCwgT01YOjpidWZmZXJfaWQgaWQpIHsKQEAgLTEwMzgsNCArMTEyOSw0NiBAQAogICAgIH0KIH0KIAorT01YOjpidWZmZXJfaWQgT01YTm9kZUluc3RhbmNlOjptYWtlQnVmZmVySUQoT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlckhlYWRlcikgeworICAgIGlmIChidWZmZXJIZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1CdWZmZXJJRExvY2spOworICAgIE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcjsKKyAgICBkbyB7IC8vIGhhbmRsZSB0aGUgdmVyeSB1bmxpa2VseSBjYXNlIG9mIElEIG92ZXJmbG93CisgICAgICAgIGlmICgrK21CdWZmZXJJRENvdW50ID09IDApIHsKKyAgICAgICAgICAgKyttQnVmZmVySURDb3VudDsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIgPSAoT01YOjpidWZmZXJfaWQpbUJ1ZmZlcklEQ291bnQ7CisgICAgfSB3aGlsZSAobUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIuaW5kZXhPZktleShidWZmZXIpID49IDApOworICAgIG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLmFkZChidWZmZXIsIGJ1ZmZlckhlYWRlcik7CisgICAgbUJ1ZmZlckhlYWRlclRvQnVmZmVySUQuYWRkKGJ1ZmZlckhlYWRlciwgYnVmZmVyKTsKKyAgICByZXR1cm4gYnVmZmVyOworfQorCitPTVhfQlVGRkVSSEVBREVSVFlQRSAqT01YTm9kZUluc3RhbmNlOjpmaW5kQnVmZmVySGVhZGVyKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcikgeworICAgIGlmIChidWZmZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1CdWZmZXJJRExvY2spOworICAgIHJldHVybiBtQnVmZmVySURUb0J1ZmZlckhlYWRlci52YWx1ZUZvcihidWZmZXIpOworfQorCitPTVg6OmJ1ZmZlcl9pZCBPTVhOb2RlSW5zdGFuY2U6OmZpbmRCdWZmZXJJRChPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVySGVhZGVyKSB7CisgICAgaWYgKGJ1ZmZlckhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUJ1ZmZlcklETG9jayk7CisgICAgcmV0dXJuIG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklELnZhbHVlRm9yKGJ1ZmZlckhlYWRlcik7Cit9CisKK3ZvaWQgT01YTm9kZUluc3RhbmNlOjppbnZhbGlkYXRlQnVmZmVySUQoT01YOjpidWZmZXJfaWQgYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlciA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1CdWZmZXJJRExvY2spOworICAgIG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklELnJlbW92ZUl0ZW0obUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIudmFsdWVGb3IoYnVmZmVyKSk7CisgICAgbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIucmVtb3ZlSXRlbShidWZmZXIpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwCmluZGV4IGIxYzM0ZGMuLjY0NmNkMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5jcHAKQEAgLTI1Nyw2OSArMjU3LDY5IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OnNlbmRDb21tYW5kKAotICAgICAgICBPTVhfQ09NTUFORFRZUEUgY21kLCBPTVhfVTMyIHBhcmFtLCBPTVhfUFRSIGRhdGEpIHsKKyAgICAgICAgT01YX0NPTU1BTkRUWVBFIC8qIGNtZCAqLywgT01YX1UzMiAvKiBwYXJhbSAqLywgT01YX1BUUiAvKiBkYXRhICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpnZXRQYXJhbWV0ZXIoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgICAgIE9NWF9JTkRFWFRZUEUgLyogaW5kZXggKi8sIE9NWF9QVFIgLyogcGFyYW1zICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpzZXRQYXJhbWV0ZXIoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgICAgIE9NWF9JTkRFWFRZUEUgLyogaW5kZXggKi8sIGNvbnN0IE9NWF9QVFIgLyogcGFyYW1zICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpnZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CisgICAgICAgIE9NWF9JTkRFWFRZUEUgLyogaW5kZXggKi8sIE9NWF9QVFIgLyogcGFyYW1zICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgICAgIE9NWF9JTkRFWFRZUEUgLyogaW5kZXggKi8sIGNvbnN0IE9NWF9QVFIgLyogcGFyYW1zICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKKyAgICAgICAgY29uc3QgY2hhciAqIC8qIG5hbWUgKi8sIE9NWF9JTkRFWFRZUEUgKiAvKiBpbmRleCAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6dXNlQnVmZmVyKAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKLSAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCi0gICAgICAgIE9NWF9QVFIgYXBwUHJpdmF0ZSwKLSAgICAgICAgT01YX1UzMiBzaXplLAotICAgICAgICBPTVhfVTggKnB0cikgeworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKiAvKiBidWZmZXIgKi8sCisgICAgICAgIE9NWF9VMzIgLyogcG9ydEluZGV4ICovLAorICAgICAgICBPTVhfUFRSIC8qIGFwcFByaXZhdGUgKi8sCisgICAgICAgIE9NWF9VMzIgLyogc2l6ZSAqLywKKyAgICAgICAgT01YX1U4ICogLyogcHRyICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjphbGxvY2F0ZUJ1ZmZlcigKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXIsCi0gICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAotICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCi0gICAgICAgIE9NWF9VMzIgc2l6ZSkgeworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKiAvKiBidWZmZXIgKi8sCisgICAgICAgIE9NWF9VMzIgLyogcG9ydEluZGV4ICovLAorICAgICAgICBPTVhfUFRSIC8qIGFwcFByaXZhdGUgKi8sCisgICAgICAgIE9NWF9VMzIgLyogc2l6ZSAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6ZnJlZUJ1ZmZlcigKLSAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCi0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpIHsKKyAgICAgICAgT01YX1UzMiAvKiBwb3J0SW5kZXggKi8sCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICogLyogYnVmZmVyICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjplbXB0eVRoaXNCdWZmZXIoCi0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpIHsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKiAvKiBidWZmZXIgKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OmZpbGxUaGlzQnVmZmVyKAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICogLyogYnVmZmVyICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpnZXRTdGF0ZShPTVhfU1RBVEVUWVBFICpzdGF0ZSkgeworT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpnZXRTdGF0ZShPTVhfU1RBVEVUWVBFICogLyogc3RhdGUgKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKaW5kZXggZDZjZGU3My4uOWI2OTU4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcApAQCAtNDIsNiArNDIsNyBAQAogICAgIHsgIk9NWC5nb29nbGUuYW1yd2IuZW5jb2RlciIsICJhbXJ3YmVuYyIsICJhdWRpb19lbmNvZGVyLmFtcndiIiB9LAogICAgIHsgIk9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiwgImgyNjRkZWMiLCAidmlkZW9fZGVjb2Rlci5hdmMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5oMjY0LmVuY29kZXIiLCAiaDI2NGVuYyIsICJ2aWRlb19lbmNvZGVyLmF2YyIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIsICJoZXZjZGVjIiwgInZpZGVvX2RlY29kZXIuaGV2YyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiwgImc3MTFkZWMiLCAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmc3MTEubWxhdy5kZWNvZGVyIiwgImc3MTFkZWMiLCAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIsICJtcGVnNGRlYyIsICJ2aWRlb19kZWNvZGVyLmgyNjMiIH0sCkBAIC01MCw2ICs1MSw3IEBACiAgICAgeyAiT01YLmdvb2dsZS5tcGVnNC5lbmNvZGVyIiwgIm1wZWc0ZW5jIiwgInZpZGVvX2VuY29kZXIubXBlZzQiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5tcDMuZGVjb2RlciIsICJtcDNkZWMiLCAiYXVkaW9fZGVjb2Rlci5tcDMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIsICJ2b3JiaXNkZWMiLCAiYXVkaW9fZGVjb2Rlci52b3JiaXMiIH0sCisgICAgeyAiT01YLmdvb2dsZS5vcHVzLmRlY29kZXIiLCAib3B1c2RlYyIsICJhdWRpb19kZWNvZGVyLm9wdXMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS52cDguZGVjb2RlciIsICJ2cHhkZWMiLCAidmlkZW9fZGVjb2Rlci52cDgiIH0sCiAgICAgeyAiT01YLmdvb2dsZS52cDkuZGVjb2RlciIsICJ2cHhkZWMiLCAidmlkZW9fZGVjb2Rlci52cDkiIH0sCiAgICAgeyAiT01YLmdvb2dsZS52cDguZW5jb2RlciIsICJ2cHhlbmMiLCAidmlkZW9fZW5jb2Rlci52cDgiIH0sCkBAIC0xNTQsNyArMTU2LDcgQEAKIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YUGx1Z2luOjplbnVtZXJhdGVDb21wb25lbnRzKAogICAgICAgICBPTVhfU1RSSU5HIG5hbWUsCi0gICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICBzaXplX3QgLyogc2l6ZSAqLywKICAgICAgICAgT01YX1UzMiBpbmRleCkgewogICAgIGlmIChpbmRleCA+PSBrTnVtQ29tcG9uZW50cykgewogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCmluZGV4IDA4YTNkNDIuLjJmODM2MTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKQEAgLTE0LDEyICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgogCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTQ4LDYgKzUxLDkgQEAKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAogICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKICAgICAgICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgICAgbUlzQWRhcHRpdmUoZmFsc2UpLAorICAgICAgICBtQWRhcHRpdmVNYXhXaWR0aCgwKSwKKyAgICAgICAgbUFkYXB0aXZlTWF4SGVpZ2h0KDApLAogICAgICAgICBtV2lkdGgod2lkdGgpLAogICAgICAgICBtSGVpZ2h0KGhlaWdodCksCiAgICAgICAgIG1Dcm9wTGVmdCgwKSwKQEAgLTExNywxNiArMTIzLDE4IEBACiAgICAgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7CiB9CiAKLXZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6dXBkYXRlUG9ydERlZmluaXRpb25zKCkgewordm9pZCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Ojp1cGRhdGVQb3J0RGVmaW5pdGlvbnMoYm9vbCB1cGRhdGVDcm9wKSB7CiAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbyhrSW5wdXRQb3J0SW5kZXgpLT5tRGVmOwogICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOwogICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CiAgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOwogICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKIAorICAgIGRlZi0+bkJ1ZmZlclNpemUgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAqIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCAqIDMgLyAyOworCiAgICAgZGVmID0gJmVkaXRQb3J0SW5mbyhrT3V0cHV0UG9ydEluZGV4KS0+bURlZjsKLSAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKLSAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gb3V0cHV0QnVmZmVyV2lkdGgoKTsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKICAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CiAgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwogCkBAIC0xMzQsMTAgKzE0MiwxMDUgQEAKICAgICAgICAgICAgIChkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAqCiAgICAgICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICogMykgLyAyOwogCi0gICAgbUNyb3BMZWZ0ID0gMDsKLSAgICBtQ3JvcFRvcCA9IDA7Ci0gICAgbUNyb3BXaWR0aCA9IG1XaWR0aDsKLSAgICBtQ3JvcEhlaWdodCA9IG1IZWlnaHQ7CisgICAgaWYgKHVwZGF0ZUNyb3ApIHsKKyAgICAgICAgbUNyb3BMZWZ0ID0gMDsKKyAgICAgICAgbUNyb3BUb3AgPSAwOworICAgICAgICBtQ3JvcFdpZHRoID0gbVdpZHRoOworICAgICAgICBtQ3JvcEhlaWdodCA9IG1IZWlnaHQ7CisgICAgfQorfQorCisKK3VpbnQzMl90IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om91dHB1dEJ1ZmZlcldpZHRoKCkgeworICAgIHJldHVybiBtSXNBZGFwdGl2ZSA/IG1BZGFwdGl2ZU1heFdpZHRoIDogbVdpZHRoOworfQorCit1aW50MzJfdCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvdXRwdXRCdWZmZXJIZWlnaHQoKSB7CisgICAgcmV0dXJuIG1Jc0FkYXB0aXZlID8gbUFkYXB0aXZlTWF4SGVpZ2h0IDogbUhlaWdodDsKK30KKwordm9pZCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoCisgICAgICAgIGJvb2wgKnBvcnRXaWxsUmVzZXQsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgIENyb3BTZXR0aW5nc01vZGUgY3JvcFNldHRpbmdzTW9kZSwgYm9vbCBmYWtlU3RyaWRlKSB7CisgICAgKnBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICBib29sIHNpemVDaGFuZ2VkID0gKHdpZHRoICE9IG1XaWR0aCB8fCBoZWlnaHQgIT0gbUhlaWdodCk7CisgICAgYm9vbCB1cGRhdGVDcm9wID0gKGNyb3BTZXR0aW5nc01vZGUgPT0ga0Nyb3BVblNldCk7CisgICAgYm9vbCBjcm9wQ2hhbmdlZCA9IChjcm9wU2V0dGluZ3NNb2RlID09IGtDcm9wQ2hhbmdlZCk7CisgICAgYm9vbCBzdHJpZGVDaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGZha2VTdHJpZGUpIHsKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbyhrT3V0cHV0UG9ydEluZGV4KS0+bURlZjsKKyAgICAgICAgaWYgKGRlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgIT0gd2lkdGggfHwgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ICE9IGhlaWdodCkgeworICAgICAgICAgICAgc3RyaWRlQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2l6ZUNoYW5nZWQgfHwgY3JvcENoYW5nZWQgfHwgc3RyaWRlQ2hhbmdlZCkgeworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKworICAgICAgICBpZiAoKHNpemVDaGFuZ2VkICYmICFtSXNBZGFwdGl2ZSkKKyAgICAgICAgICAgIHx8IHdpZHRoID4gbUFkYXB0aXZlTWF4V2lkdGgKKyAgICAgICAgICAgIHx8IGhlaWdodCA+IG1BZGFwdGl2ZU1heEhlaWdodCkgeworICAgICAgICAgICAgaWYgKG1Jc0FkYXB0aXZlKSB7CisgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gbUFkYXB0aXZlTWF4V2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFkYXB0aXZlTWF4V2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGhlaWdodCA+IG1BZGFwdGl2ZU1heEhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtQWRhcHRpdmVNYXhIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlUG9ydERlZmluaXRpb25zKHVwZGF0ZUNyb3ApOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIGtPdXRwdXRQb3J0SW5kZXgsIDAsIE5VTEwpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICAgICAgKnBvcnRXaWxsUmVzZXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXBkYXRlUG9ydERlZmluaXRpb25zKHVwZGF0ZUNyb3ApOworCisgICAgICAgICAgICBpZiAoZmFrZVN0cmlkZSkgeworICAgICAgICAgICAgICAgIC8vIE1BSk9SIEhBQ0sgdGhhdCBpcyBub3QgcHJldHR5LCBpdCdzIGp1c3QgdG8gZm9vbCB0aGUgcmVuZGVyZXIgdG8gcmVhZCB0aGUgY29ycmVjdAorICAgICAgICAgICAgICAgIC8vIGRhdGEuCisgICAgICAgICAgICAgICAgLy8gU29tZSBzb2Z0d2FyZSBkZWNvZGVycyAoZS5nLiBTb2Z0TVBFRzQpIGZpbGwgZGVjb2RlZCBmcmFtZSBkaXJlY3RseSB0byBvdXRwdXQKKyAgICAgICAgICAgICAgICAvLyBidWZmZXIgd2l0aG91dCBjb25zaWRlcmluZyB0aGUgb3V0cHV0IGJ1ZmZlciBzdHJpZGUgYW5kIHNsaWNlIGhlaWdodC4gU28gdGhpcyBpcworICAgICAgICAgICAgICAgIC8vIHVzZWQgdG8gc2lnbmFsIGhvdyB0aGUgYnVmZmVyIGlzIGFycmFuZ2VkLiAgVGhlIGFsdGVybmF0aXZlIGlzIHRvIHJlLWFycmFuZ2UgdGhlCisgICAgICAgICAgICAgICAgLy8gb3V0cHV0IGJ1ZmZlciBpbiBTb2Z0TVBFRzQsIGJ1dCB0aGF0IHJlc3VsdHMgaW4gbWVtY29waWVzLgorICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8oa091dHB1dFBvcnRJbmRleCktPm1EZWY7CisgICAgICAgICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IG1XaWR0aDsKKyAgICAgICAgICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBtSGVpZ2h0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwga091dHB1dFBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Ojpjb3B5WVYxMkZyYW1lVG9PdXRwdXRCdWZmZXIoCisgICAgICAgIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSkgeworICAgIHNpemVfdCBkc3RZU3RyaWRlID0gb3V0cHV0QnVmZmVyV2lkdGgoKTsKKyAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBkc3RZU3RyaWRlIC8gMjsKKyAgICBzaXplX3QgZHN0SGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CisgICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IZWlnaHQ7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjWSwgbVdpZHRoKTsKKyAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGRzdEhlaWdodDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1UsIG1XaWR0aCAvIDIpOworICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgKDUgKiBkc3RZU3RyaWRlICogZHN0SGVpZ2h0KSAvIDQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNWLCBtV2lkdGggLyAyKTsKKyAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoCkBAIC0xNzcsMTYgKzI4MCwxNiBAQAogICAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopIHBhcmFtczsKIAogICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbC0+blBvcnRJbmRleCAhPSBrSW5wdXRQb3J0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBwb3J0IGluZGV4OiAlbGQiLCBwcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXgpOworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHBvcnQgaW5kZXg6ICUiIFBSSXUzMiwgcHJvZmlsZUxldmVsLT5uUG9ydEluZGV4KTsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGluZGV4ID49IG1OdW1Qcm9maWxlTGV2ZWxzKSB7CisgICAgICAgICAgICBpZiAocHJvZmlsZUxldmVsLT5uUHJvZmlsZUluZGV4ID49IG1OdW1Qcm9maWxlTGV2ZWxzKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcHJvZmlsZUxldmVsLT5lUHJvZmlsZSA9IG1Qcm9maWxlTGV2ZWxzW2luZGV4XS5tUHJvZmlsZTsKLSAgICAgICAgICAgIHByb2ZpbGVMZXZlbC0+ZUxldmVsICAgPSBtUHJvZmlsZUxldmVsc1tpbmRleF0ubUxldmVsOworICAgICAgICAgICAgcHJvZmlsZUxldmVsLT5lUHJvZmlsZSA9IG1Qcm9maWxlTGV2ZWxzW3Byb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleF0ubVByb2ZpbGU7CisgICAgICAgICAgICBwcm9maWxlTGV2ZWwtPmVMZXZlbCAgID0gbVByb2ZpbGVMZXZlbHNbcHJvZmlsZUxldmVsLT5uUHJvZmlsZUluZGV4XS5tTGV2ZWw7CiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCkBAIC0xOTcsNyArMzAwLDEwIEBACiAKIE9NWF9FUlJPUlRZUEUgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7Ci0gICAgc3dpdGNoIChpbmRleCkgeworICAgIC8vIEluY2x1ZGUgZXh0ZW5zaW9uIGluZGV4IE9NWF9JTkRFWEVYVFRZUEUuCisgICAgY29uc3QgaW50MzJfdCBpbmRleEZ1bGwgPSBpbmRleDsKKworICAgIHN3aXRjaCAoaW5kZXhGdWxsKSB7CiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CkBAIC0yMjgsNiArMzM0LDU4IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXg6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrUGFyYW1zKiBhZGFwdGl2ZVBsYXliYWNrUGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrUGFyYW1zICopcGFyYW1zOworICAgICAgICAgICAgbUlzQWRhcHRpdmUgPSBhZGFwdGl2ZVBsYXliYWNrUGFyYW1zLT5iRW5hYmxlOworICAgICAgICAgICAgaWYgKG1Jc0FkYXB0aXZlKSB7CisgICAgICAgICAgICAgICAgbUFkYXB0aXZlTWF4V2lkdGggPSBhZGFwdGl2ZVBsYXliYWNrUGFyYW1zLT5uTWF4RnJhbWVXaWR0aDsKKyAgICAgICAgICAgICAgICBtQWRhcHRpdmVNYXhIZWlnaHQgPSBhZGFwdGl2ZVBsYXliYWNrUGFyYW1zLT5uTWF4RnJhbWVIZWlnaHQ7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gbUFkYXB0aXZlTWF4V2lkdGg7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IG1BZGFwdGl2ZU1heEhlaWdodDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUFkYXB0aXZlTWF4V2lkdGggPSAwOworICAgICAgICAgICAgICAgIG1BZGFwdGl2ZU1heEhlaWdodCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpuZXdQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICopcGFyYW1zOworICAgICAgICAgICAgT01YX1ZJREVPX1BPUlRERUZJTklUSU9OVFlQRSAqdmlkZW9fZGVmID0gJm5ld1BhcmFtcy0+Zm9ybWF0LnZpZGVvOworICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbyhuZXdQYXJhbXMtPm5Qb3J0SW5kZXgpLT5tRGVmOworCisgICAgICAgICAgICB1aW50MzJfdCBvbGRXaWR0aCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICAgICAgdWludDMyX3Qgb2xkSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgICAgICAgICAgdWludDMyX3QgbmV3V2lkdGggPSB2aWRlb19kZWYtPm5GcmFtZVdpZHRoOworICAgICAgICAgICAgdWludDMyX3QgbmV3SGVpZ2h0ID0gdmlkZW9fZGVmLT5uRnJhbWVIZWlnaHQ7CisgICAgICAgICAgICBpZiAobmV3V2lkdGggIT0gb2xkV2lkdGggfHwgbmV3SGVpZ2h0ICE9IG9sZEhlaWdodCkgeworICAgICAgICAgICAgICAgIGJvb2wgb3V0cHV0UG9ydCA9IChuZXdQYXJhbXMtPm5Qb3J0SW5kZXggPT0ga091dHB1dFBvcnRJbmRleCk7CisgICAgICAgICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPQorICAgICAgICAgICAgICAgICAgICAobUlzQWRhcHRpdmUgJiYgb3V0cHV0UG9ydCkgPyBtQWRhcHRpdmVNYXhXaWR0aCA6IG5ld1dpZHRoOworICAgICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9CisgICAgICAgICAgICAgICAgICAgIChtSXNBZGFwdGl2ZSAmJiBvdXRwdXRQb3J0KSA/IG1BZGFwdGl2ZU1heEhlaWdodCA6IG5ld0hlaWdodDsKKyAgICAgICAgICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgICAgICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgICAgICAgICAgICAgIGRlZi0+bkJ1ZmZlclNpemUgPQorICAgICAgICAgICAgICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAqIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCAqIDMgLyAyOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRQb3J0KSB7CisgICAgICAgICAgICAgICAgICAgIG1XaWR0aCA9IG5ld1dpZHRoOworICAgICAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gbmV3SGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBtQ3JvcExlZnQgPSAwOworICAgICAgICAgICAgICAgICAgICBtQ3JvcFRvcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1Dcm9wV2lkdGggPSBuZXdXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgbUNyb3BIZWlnaHQgPSBuZXdIZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5ld1BhcmFtcy0+bkJ1ZmZlclNpemUgPSBkZWYtPm5CdWZmZXJTaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKICAgICB9CkBAIC0yNTcsNiArNDE1LDE2IEBACiAgICAgfQogfQogCitPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgeworICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXgucHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2siKSkgeworICAgICAgICAqKGludDMyX3QqKWluZGV4ID0ga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXg7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgIH0KKworICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleChuYW1lLCBpbmRleCk7Cit9CisKIHZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b25SZXNldCgpIHsKICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmZmMTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgiCisKKyNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudDo6U29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtR3JhbGxvY01vZHVsZShOVUxMKSB7Cit9CisKKy8vIHN0YXRpYwordm9pZCBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50OjpDb252ZXJ0RmxleFlVVlRvUGxhbmFyKAorICAgICAgICB1aW50OF90ICpkc3QsIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLAorICAgICAgICBzdHJ1Y3QgYW5kcm9pZF95Y2JjciAqeWNiY3IsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgY29uc3QgdWludDhfdCAqc3JjID0gKGNvbnN0IHVpbnQ4X3QgKil5Y2Jjci0+eTsKKyAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKil5Y2Jjci0+Y2I7CisgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopeWNiY3ItPmNyOworICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3QgKyBkc3RWU3RyaWRlICogZHN0U3RyaWRlOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RVICsgKGRzdFZTdHJpZGUgPj4gMSkgKiAoZHN0U3RyaWRlID4+IDEpOworCisgICAgZm9yIChzaXplX3QgeSA9IGhlaWdodDsgeSA+IDA7IC0teSkgeworICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZTsKKyAgICAgICAgc3JjICs9IHljYmNyLT55c3RyaWRlOworICAgIH0KKyAgICBpZiAoeWNiY3ItPmNzdHJpZGUgPT0geWNiY3ItPnlzdHJpZGUgPj4gMSAmJiB5Y2Jjci0+Y2hyb21hX3N0ZXAgPT0gMSkgeworICAgICAgICAvLyBwbGFuYXIKKyAgICAgICAgZm9yIChzaXplX3QgeSA9IGhlaWdodCA+PiAxOyB5ID4gMDsgLS15KSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0VSwgc3JjVSwgd2lkdGggPj4gMSk7CisgICAgICAgICAgICBkc3RVICs9IGRzdFN0cmlkZSA+PiAxOworICAgICAgICAgICAgc3JjVSArPSB5Y2Jjci0+Y3N0cmlkZTsKKyAgICAgICAgICAgIG1lbWNweShkc3RWLCBzcmNWLCB3aWR0aCA+PiAxKTsKKyAgICAgICAgICAgIGRzdFYgKz0gZHN0U3RyaWRlID4+IDE7CisgICAgICAgICAgICBzcmNWICs9IHljYmNyLT5jc3RyaWRlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gYXJiaXRyYXJ5CisgICAgICAgIGZvciAoc2l6ZV90IHkgPSBoZWlnaHQgPj4gMTsgeSA+IDA7IC0teSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgeCA9IHdpZHRoID4+IDE7IHggPiAwOyAtLXgpIHsKKyAgICAgICAgICAgICAgICAqZHN0VSsrID0gKnNyY1U7CisgICAgICAgICAgICAgICAgKmRzdFYrKyA9ICpzcmNWOworICAgICAgICAgICAgICAgIHNyY1UgKz0geWNiY3ItPmNocm9tYV9zdGVwOworICAgICAgICAgICAgICAgIHNyY1YgKz0geWNiY3ItPmNocm9tYV9zdGVwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0VSArPSAoZHN0U3RyaWRlID4+IDEpIC0gKHdpZHRoID4+IDEpOworICAgICAgICAgICAgZHN0ViArPSAoZHN0U3RyaWRlID4+IDEpIC0gKHdpZHRoID4+IDEpOworICAgICAgICAgICAgc3JjVSArPSB5Y2Jjci0+Y3N0cmlkZSAtICh3aWR0aCA+PiAxKSAqIHljYmNyLT5jaHJvbWFfc3RlcDsKKyAgICAgICAgICAgIHNyY1YgKz0geWNiY3ItPmNzdHJpZGUgLSAod2lkdGggPj4gMSkgKiB5Y2Jjci0+Y2hyb21hX3N0ZXA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50OjpDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAorICAgICAgICBjb25zdCB1aW50OF90ICppbllWVSwgdWludDhfdCogb3V0WVVWLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBzdHJpZGUKKyAgICBpbnQzMl90IG91dFlzaXplID0gd2lkdGggKiBoZWlnaHQ7CisgICAgdWludDMyX3QgKm91dFkgID0gKHVpbnQzMl90ICopIG91dFlVVjsKKyAgICB1aW50MTZfdCAqb3V0Q2IgPSAodWludDE2X3QgKikgKG91dFlVViArIG91dFlzaXplKTsKKyAgICB1aW50MTZfdCAqb3V0Q3IgPSAodWludDE2X3QgKikgKG91dFlVViArIG91dFlzaXplICsgKG91dFlzaXplID4+IDIpKTsKKworICAgIC8qIFkgY29weWluZyAqLworICAgIG1lbWNweShvdXRZLCBpbllWVSwgb3V0WXNpemUpOworCisgICAgLyogVSAmIFYgY29weWluZyAqLworICAgIC8vIEZJWE1FIHRoaXMgb25seSB3b3JrcyBpZiB3aWR0aCBpcyBtdWx0aXBsZSBvZiA0CisgICAgdWludDMyX3QgKmluWVZVXzQgPSAodWludDMyX3QgKikgKGluWVZVICsgb3V0WXNpemUpOworICAgIGZvciAoaW50MzJfdCBpID0gaGVpZ2h0ID4+IDE7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSB3aWR0aCA+PiAyOyBqID4gMDsgLS1qKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gKmluWVZVXzQrKzsKKyAgICAgICAgICAgIHVpbnQzMl90IHRlbXBVID0gdGVtcCAmIDB4RkY7CisgICAgICAgICAgICB0ZW1wVSA9IHRlbXBVIHwgKCh0ZW1wID4+IDgpICYgMHhGRjAwKTsKKworICAgICAgICAgICAgdWludDMyX3QgdGVtcFYgPSAodGVtcCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICB0ZW1wViA9IHRlbXBWIHwgKCh0ZW1wID4+IDE2KSAmIDB4RkYwMCk7CisKKyAgICAgICAgICAgICpvdXRDYisrID0gdGVtcFU7CisgICAgICAgICAgICAqb3V0Q3IrKyA9IHRlbXBWOworICAgICAgICB9CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudDo6Q29udmVydFJHQjMyVG9QbGFuYXIoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgc2l6ZV90IHNyY1N0cmlkZSwKKyAgICAgICAgYm9vbCBiZ3IpIHsKKyAgICBDSEVDSygod2lkdGggJiAxKSA9PSAwKTsKKyAgICBDSEVDSygoaGVpZ2h0ICYgMSkgPT0gMCk7CisKKyAgICB1aW50OF90ICpkc3RVID0gZHN0WSArIGRzdFN0cmlkZSAqIGRzdFZTdHJpZGU7CisgICAgdWludDhfdCAqZHN0ViA9IGRzdFUgKyAoZHN0U3RyaWRlID4+IDEpICogKGRzdFZTdHJpZGUgPj4gMSk7CisKKyNpZmRlZiBTVVJGQUNFX0lTX0JHUjMyCisgICAgYmdyID0gIWJncjsKKyNlbmRpZgorCisgICAgY29uc3Qgc2l6ZV90IHJlZE9mZnNldCAgID0gYmdyID8gMiA6IDA7CisgICAgY29uc3Qgc2l6ZV90IGdyZWVuT2Zmc2V0ID0gMTsKKyAgICBjb25zdCBzaXplX3QgYmx1ZU9mZnNldCAgPSBiZ3IgPyAwIDogMjsKKworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgICAgICB1bnNpZ25lZCByZWQgICA9IHNyY1tyZWRPZmZzZXRdOworICAgICAgICAgICAgdW5zaWduZWQgZ3JlZW4gPSBzcmNbZ3JlZW5PZmZzZXRdOworICAgICAgICAgICAgdW5zaWduZWQgYmx1ZSAgPSBzcmNbYmx1ZU9mZnNldF07CisKKyAgICAgICAgICAgIC8vIHVzaW5nIElUVS1SIEJULjYwMSBjb252ZXJzaW9uIG1hdHJpeAorICAgICAgICAgICAgdW5zaWduZWQgbHVtYSA9CisgICAgICAgICAgICAgICAgKChyZWQgKiA2NiArIGdyZWVuICogMTI5ICsgYmx1ZSAqIDI1KSA+PiA4KSArIDE2OworCisgICAgICAgICAgICBkc3RZW3hdID0gbHVtYTsKKworICAgICAgICAgICAgaWYgKCh4ICYgMSkgPT0gMCAmJiAoeSAmIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBVID0KKyAgICAgICAgICAgICAgICAgICAgKCgtcmVkICogMzggLSBncmVlbiAqIDc0ICsgYmx1ZSAqIDExMikgPj4gOCkgKyAxMjg7CisKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBWID0KKyAgICAgICAgICAgICAgICAgICAgKChyZWQgKiAxMTIgLSBncmVlbiAqIDk0IC0gYmx1ZSAqIDE4KSA+PiA4KSArIDEyODsKKworICAgICAgICAgICAgICAgIGRzdFVbeCA+PiAxXSA9IFU7CisgICAgICAgICAgICAgICAgZHN0Vlt4ID4+IDFdID0gVjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyYyArPSA0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh5ICYgMSkgPT0gMCkgeworICAgICAgICAgICAgZHN0VSArPSBkc3RTdHJpZGUgPj4gMTsKKyAgICAgICAgICAgIGRzdFYgKz0gZHN0U3RyaWRlID4+IDE7CisgICAgICAgIH0KKworICAgICAgICBzcmMgKz0gc3JjU3RyaWRlIC0gNCAqIHdpZHRoOworICAgICAgICBkc3RZICs9IGRzdFN0cmlkZTsKKyAgICB9Cit9CisKK2NvbnN0IHVpbnQ4X3QgKlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OmV4dHJhY3RHcmFwaGljQnVmZmVyKAorICAgICAgICB1aW50OF90ICpkc3QsIHNpemVfdCBkc3RTaXplLAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCBzcmNTaXplLAorICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICBzaXplX3QgZHN0U3RyaWRlID0gd2lkdGg7CisgICAgc2l6ZV90IGRzdFZTdHJpZGUgPSBoZWlnaHQ7CisKKyAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgYnVmZmVyVHlwZSA9ICooTWV0YWRhdGFCdWZmZXJUeXBlICopc3JjOworICAgIGJvb2wgdXNpbmdHcmFwaGljQnVmZmVyID0gYnVmZmVyVHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhcGhpY0J1ZmZlcjsKKyAgICBpZiAoIXVzaW5nR3JhcGhpY0J1ZmZlciAmJiBidWZmZXJUeXBlICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7CisgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBtZXRhZGF0YSB0eXBlICglZCkiLCBidWZmZXJUeXBlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKG1HcmFsbG9jTW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0tfRVEoMCwgaHdfZ2V0X21vZHVsZShHUkFMTE9DX0hBUkRXQVJFX01PRFVMRV9JRCwgJm1HcmFsbG9jTW9kdWxlKSk7CisgICAgfQorCisgICAgY29uc3QgZ3JhbGxvY19tb2R1bGVfdCAqZ3Jtb2R1bGUgPQorICAgICAgICAoY29uc3QgZ3JhbGxvY19tb2R1bGVfdCAqKW1HcmFsbG9jTW9kdWxlOworCisgICAgYnVmZmVyX2hhbmRsZV90IGhhbmRsZTsKKyAgICBpbnQgZm9ybWF0OworICAgIHNpemVfdCBzcmNTdHJpZGU7CisgICAgc2l6ZV90IHNyY1ZTdHJpZGU7CisgICAgaWYgKHVzaW5nR3JhcGhpY0J1ZmZlcikgeworICAgICAgICBpZiAoc3JjU2l6ZSA8IDQgKyBzaXplb2YoR3JhcGhpY0J1ZmZlciAqKSkgeworICAgICAgICAgICAgQUxPR0UoIk1ldGFkYXRhIGlzIHRvbyBzbWFsbCAoJXp1IHZzICV6dSkiLCBzcmNTaXplLCA0ICsgc2l6ZW9mKEdyYXBoaWNCdWZmZXIgKikpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBHcmFwaGljQnVmZmVyICpidWZmZXIgPSAqKEdyYXBoaWNCdWZmZXIgKiopKHNyYyArIDQpOworICAgICAgICBoYW5kbGUgPSBidWZmZXItPmhhbmRsZTsKKyAgICAgICAgZm9ybWF0ID0gYnVmZmVyLT5mb3JtYXQ7CisgICAgICAgIHNyY1N0cmlkZSA9IGJ1ZmZlci0+c3RyaWRlOworICAgICAgICBzcmNWU3RyaWRlID0gYnVmZmVyLT5oZWlnaHQ7CisgICAgICAgIC8vIGNvbnZlcnQgc3RyaWRlIGZyb20gcGl4ZWxzIHRvIGJ5dGVzCisgICAgICAgIGlmIChmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyICYmCisgICAgICAgICAgICBmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4KSB7CisgICAgICAgICAgICAvLyBUT0RPIGRvIHdlIG5lZWQgdG8gc3VwcG9ydCBvdGhlciBmb3JtYXRzPworICAgICAgICAgICAgc3JjU3RyaWRlICo9IDQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBwYXJ0LiAgQ2hlY2sgaWYgYW55b25lIHVzZXMgdGhpcy4KKworICAgICAgICBpZiAoc3JjU2l6ZSA8IDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSkgeworICAgICAgICAgICAgQUxPR0UoIk1ldGFkYXRhIGlzIHRvbyBzbWFsbCAoJXp1IHZzICV6dSkiLCBzcmNTaXplLCA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBoYW5kbGUgPSAqKGJ1ZmZlcl9oYW5kbGVfdCAqKShzcmMgKyA0KTsKKyAgICAgICAgLy8gYXNzdW1lIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4CisgICAgICAgIC8vIHRoZXJlIGlzIG5vIHdheSB0byBnZXQgdGhlIHNyYyBzdHJpZGUgd2l0aG91dCB0aGUgZ3JhcGhpYyBidWZmZXIKKyAgICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7CisgICAgICAgIHNyY1N0cmlkZSA9IHdpZHRoICogNDsKKyAgICAgICAgc3JjVlN0cmlkZSA9IGhlaWdodDsKKyAgICB9CisKKyAgICBzaXplX3QgbmVlZGVkU2l6ZSA9CisgICAgICAgIGRzdFN0cmlkZSAqIGRzdFZTdHJpZGUgKyAod2lkdGggPj4gMSkKKyAgICAgICAgICAgICAgICArIChkc3RTdHJpZGUgPj4gMSkgKiAoKGRzdFZTdHJpZGUgPj4gMSkgKyAoaGVpZ2h0ID4+IDEpIC0gMSk7CisgICAgaWYgKGRzdFNpemUgPCBuZWVkZWRTaXplKSB7CisgICAgICAgIEFMT0dFKCJkZXN0aW5hdGlvbiBidWZmZXIgaXMgdG9vIHNtYWxsICglenUgdnMgJXp1KSIsIGRzdFNpemUsIG5lZWRlZFNpemUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2b2lkICpiaXRzID0gTlVMTDsKKyAgICBzdHJ1Y3QgYW5kcm9pZF95Y2JjciB5Y2JjcjsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgpIHsKKyAgICAgICAgcmVzID0gZ3Jtb2R1bGUtPmxvY2tfeWNiY3IoCisgICAgICAgICAgICAgICAgIGdybW9kdWxlLCBoYW5kbGUsCisgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTkVWRVIsCisgICAgICAgICAgICAgICAgIDAsIDAsIHdpZHRoLCBoZWlnaHQsICZ5Y2Jjcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gZ3Jtb2R1bGUtPmxvY2soCisgICAgICAgICAgICAgICAgIGdybW9kdWxlLCBoYW5kbGUsCisgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTkVWRVIsCisgICAgICAgICAgICAgICAgIDAsIDAsIHdpZHRoLCBoZWlnaHQsICZiaXRzKTsKKyAgICB9CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGxvY2sgaW1hZ2UgYnVmZmVyICVwIGZvciBhY2Nlc3MiLCBoYW5kbGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjogIC8vIFlDckNiIC8gWVZVIHBsYW5hcgorICAgICAgICAgICAgLy8gY29udmVydCB0byBmbGV4IFlVVgorICAgICAgICAgICAgeWNiY3IueSA9IGJpdHM7CisgICAgICAgICAgICB5Y2Jjci5jciA9ICh1aW50OF90ICopYml0cyArIHNyY1N0cmlkZSAqIHNyY1ZTdHJpZGU7CisgICAgICAgICAgICB5Y2Jjci5jYiA9ICh1aW50OF90ICopeWNiY3IuY3IgKyAoc3JjU3RyaWRlID4+IDEpICogKHNyY1ZTdHJpZGUgPj4gMSk7CisgICAgICAgICAgICB5Y2Jjci5jaHJvbWFfc3RlcCA9IDE7CisgICAgICAgICAgICB5Y2Jjci5jc3RyaWRlID0gc3JjVlN0cmlkZSA+PiAxOworICAgICAgICAgICAgeWNiY3IueXN0cmlkZSA9IHNyY1ZTdHJpZGU7CisgICAgICAgICAgICBDb252ZXJ0RmxleFlVVlRvUGxhbmFyKGRzdCwgZHN0U3RyaWRlLCBkc3RWU3RyaWRlLCAmeWNiY3IsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1A6ICAvLyBZQ3JDYiAvIFlWVSBzZW1pcGxhbmFyLCBOVjIxCisgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGZsZXggWVVWCisgICAgICAgICAgICB5Y2Jjci55ID0gYml0czsKKyAgICAgICAgICAgIHljYmNyLmNyID0gKHVpbnQ4X3QgKiliaXRzICsgc3JjU3RyaWRlICogc3JjVlN0cmlkZTsKKyAgICAgICAgICAgIHljYmNyLmNiID0gKHVpbnQ4X3QgKil5Y2Jjci5jciArIDE7CisgICAgICAgICAgICB5Y2Jjci5jaHJvbWFfc3RlcCA9IDI7CisgICAgICAgICAgICB5Y2Jjci5jc3RyaWRlID0gc3JjVlN0cmlkZTsKKyAgICAgICAgICAgIHljYmNyLnlzdHJpZGUgPSBzcmNWU3RyaWRlOworICAgICAgICAgICAgQ29udmVydEZsZXhZVVZUb1BsYW5hcihkc3QsIGRzdFN0cmlkZSwgZHN0VlN0cmlkZSwgJnljYmNyLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4ODoKKyAgICAgICAgICAgIENvbnZlcnRGbGV4WVVWVG9QbGFuYXIoZHN0LCBkc3RTdHJpZGUsIGRzdFZTdHJpZGUsICZ5Y2Jjciwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4ODoKKyAgICAgICAgICAgIENvbnZlcnRSR0IzMlRvUGxhbmFyKAorICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdFN0cmlkZSwgZHN0VlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiliaXRzLCB3aWR0aCwgaGVpZ2h0LCBzcmNTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4OCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKKyAgICAgICAgICAgIGRzdCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoZ3Jtb2R1bGUtPnVubG9jayhncm1vZHVsZSwgaGFuZGxlKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHVubG9jayBpbWFnZSBidWZmZXIgJXAgZm9yIGFjY2VzcyIsIGhhbmRsZSk7CisgICAgfQorCisgICAgcmV0dXJuIGRzdDsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiKSB8fAorICAgICAgICAhc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVHcmFwaGljQnVmZmVySW5NZXRhRGF0YSIpKSB7CisgICAgICAgICooaW50MzJfdCopaW5kZXggPSBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4OworICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KG5hbWUsIGluZGV4KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggMTA2MWMzOS4uNDQ3YjI5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTExLDggKzExLDEyIEBACiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFIDo9IG9teF90ZXN0cwogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCisKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCmluZGV4IDRiZWU4MDguLmY0ZGZkNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKQEAgLTE2LDYgKzE2LDcgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJPTVhIYXJuZXNzIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJPTVhIYXJuZXNzLmgiCkBAIC0yNSw2ICsyNiw3IEBACiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KQEAgLTI0MSw3ICsyNDMsOCBAQAogfTsKIAogc3RhdGljIHNwPE1lZGlhRXh0cmFjdG9yPiBDcmVhdGVFeHRyYWN0b3JGcm9tVVJJKGNvbnN0IGNoYXIgKnVyaSkgewotICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkodXJpKTsKKyAgICBzcDxEYXRhU291cmNlPiBzb3VyY2UgPQorICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHVyaSk7CiAKICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00NjAsNiArNDYzLDcgQEAKICAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci5hYWMiLCAiYXVkaW8vbXA0YS1sYXRtIiB9LAogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLm1wMyIsICJhdWRpby9tcGVnIiB9LAogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLnZvcmJpcyIsICJhdWRpby92b3JiaXMiIH0sCisgICAgICAgIHsgImF1ZGlvX2RlY29kZXIub3B1cyIsICJhdWRpby9vcHVzIiB9LAogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmc3MTFhbGF3IiwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXIH0sCiAgICAgICAgIHsgImF1ZGlvX2RlY29kZXIuZzcxMW1sYXciLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcgfSwKICAgICB9OwpAQCAtNDkyLDYgKzQ5Niw3IEBACiAgICAgICAgIHsgImF1ZGlvL21wZWciLAogICAgICAgICAgICJmaWxlOi8vL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0NCUi5tcDMiIH0sCiAgICAgICAgIHsgImF1ZGlvL3ZvcmJpcyIsIE5VTEwgfSwKKyAgICAgICAgeyAiYXVkaW8vb3B1cyIsIE5VTEwgfSwKICAgICAgICAgeyAidmlkZW8veC12bmQub24yLnZwOCIsCiAgICAgICAgICAgImZpbGU6Ly8vc2RjYXJkL21lZGlhX2FwaS92aWRlby9iaWctYnVjay1idW5ueV90cmFpbGVyLndlYm0iIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLCAiZmlsZTovLy9zZGNhcmQvTTFGMS1BbGF3LUFGc3Aud2F2IiB9LApAQCAtNzExLDExICs3MTYsMTEgQEAKICAgICAgICAgICAgIGludDY0X3QgYnVmZmVyVGltZVVzOwogICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmYnVmZmVyVGltZVVzKSk7CiAgICAgICAgICAgICBpZiAoIUNsb3NlRW5vdWdoKGJ1ZmZlclRpbWVVcywgYWN0dWFsU2Vla1RpbWVVcykpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuICAqIEF0dGVtcHRlZCBzZWVraW5nIHRvICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgICAgIHByaW50ZigiXG4gICogQXR0ZW1wdGVkIHNlZWtpbmcgdG8gJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcykiLAogICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTZWVrVGltZVVzLCByZXF1ZXN0ZWRTZWVrVGltZVVzIC8gMUU2KTsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuICAqIE5lYXJlc3Qga2V5ZnJhbWUgaXMgYXQgJWxsZCB1cyAoJS4yZiBzZWNzKSIsCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgKiBOZWFyZXN0IGtleWZyYW1lIGlzIGF0ICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpIiwKICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2Vla1RpbWVVcywgYWN0dWFsU2Vla1RpbWVVcyAvIDFFNik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgKiBSZXR1cm5lZCBidWZmZXIgd2FzIGF0ICVsbGQgdXMgKCUuMmYgc2VjcylcblxuIiwKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuICAqIFJldHVybmVkIGJ1ZmZlciB3YXMgYXQgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcylcblxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyVGltZVVzLCBidWZmZXJUaW1lVXMgLyAxRTYpOwogCiAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcAppbmRleCBhNjgyNWViLi40YmM2N2U4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5jcHAKQEAgLTEyNCw3ICsxMjQsNyBAQAogfQogCiB2b2lkIEFBVkNBc3NlbWJsZXI6OmFkZFNpbmdsZU5BTFVuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewotICAgIEFMT0dWKCJhZGRTaW5nbGVOQUxVbml0IG9mIHNpemUgJWQiLCBidWZmZXItPnNpemUoKSk7CisgICAgQUxPR1YoImFkZFNpbmdsZU5BTFVuaXQgb2Ygc2l6ZSAlenUiLCBidWZmZXItPnNpemUoKSk7CiAjaWYgIUxPR19OREVCVUcKICAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CiAjZW5kaWYKQEAgLTE5MSw3ICsxOTEsNyBAQAogICAgIENIRUNLKChpbmRpY2F0b3IgJiAweDFmKSA9PSAyOCk7CiAKICAgICBpZiAoc2l6ZSA8IDIpIHsKLSAgICAgICAgQUxPR1YoIklnbm9yaW5nIG1hbGZvcm1lZCBGVSBidWZmZXIgKHNpemUgPSAlZCkiLCBzaXplKTsKKyAgICAgICAgQUxPR1YoIklnbm9yaW5nIG1hbGZvcm1lZCBGVSBidWZmZXIgKHNpemUgPSAlenUpIiwgc2l6ZSk7CiAKICAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKICAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CkBAIC0yMjUsNyArMjI1LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gKytxdWV1ZS0+YmVnaW4oKTsKICAgICAgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgewotICAgICAgICAgICAgQUxPR1YoInNlcXVlbmNlIGxlbmd0aCAlZCIsIHRvdGFsQ291bnQpOworICAgICAgICAgICAgQUxPR1YoInNlcXVlbmNlIGxlbmd0aCAlenUiLCB0b3RhbENvdW50KTsKIAogICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9ICppdDsKIApAQCAtMjk0LDcgKzI5NCw3IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0b3RhbENvdW50OyArK2kpIHsKICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9ICppdDsKIAotICAgICAgICBBTE9HVigicGllY2UgIyVkLyVkIiwgaSArIDEsIHRvdGFsQ291bnQpOworICAgICAgICBBTE9HVigicGllY2UgIyV6dS8lenUiLCBpICsgMSwgdG90YWxDb3VudCk7CiAjaWYgIUxPR19OREVCVUcKICAgICAgICAgaGV4ZHVtcChidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogI2VuZGlmCkBAIC0zMTcsNyArMzE3LDcgQEAKIHZvaWQgQUFWQ0Fzc2VtYmxlcjo6c3VibWl0QWNjZXNzVW5pdCgpIHsKICAgICBDSEVDSyghbU5BTFVuaXRzLmVtcHR5KCkpOwogCi0gICAgQUxPR1YoIkFjY2VzcyB1bml0IGNvbXBsZXRlICglZCBuYWwgdW5pdHMpIiwgbU5BTFVuaXRzLnNpemUoKSk7CisgICAgQUxPR1YoIkFjY2VzcyB1bml0IGNvbXBsZXRlICglenUgbmFsIHVuaXRzKSIsIG1OQUxVbml0cy5zaXplKCkpOwogCiAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7CiAgICAgZm9yIChMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbU5BTFVuaXRzLmJlZ2luKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuY3BwCmluZGV4IDRjOWJmNWIuLmRjYTVjODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuY3BwCkBAIC0zNCw3ICszNCw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEFNUEVHMlRTQXNzZW1ibGVyOjpBTVBFRzJUU0Fzc2VtYmxlcigKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGNvbnN0IGNoYXIgKmRlc2MsIGNvbnN0IEFTdHJpbmcgJnBhcmFtcykKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IGNoYXIgKiAvKiBkZXNjICovLAorICAgICAgICBjb25zdCBBU3RyaW5nICYgLyogcGFyYW1zICovKQogICAgIDogbU5vdGlmeU1zZyhub3RpZnkpLAogICAgICAgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQoZmFsc2UpLAogICAgICAgbU5leHRFeHBlY3RlZFNlcU5vKDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwCmluZGV4IGVlZmNlYmEuLjdlYjY1NDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcApAQCAtMjQ5LDExICsyNDksMTUgQEAKICAgICAgICAgbVBhY2tldHMucHVzaF9iYWNrKGJ1ZmZlcik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gaGV4ZHVtcChidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICBpZiAoYnVmZmVyLT5zaXplKCkgPCAyKSB7CisgICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICAgICAgfQogCi0gICAgICAgIENIRUNLX0dFKGJ1ZmZlci0+c2l6ZSgpLCAydSk7CiAgICAgICAgIHVuc2lnbmVkIEFVX2hlYWRlcnNfbGVuZ3RoID0gVTE2X0FUKGJ1ZmZlci0+ZGF0YSgpKTsgIC8vIGluIGJpdHMKIAotICAgICAgICBDSEVDS19HRShidWZmZXItPnNpemUoKSwgMiArIChBVV9oZWFkZXJzX2xlbmd0aCArIDcpIC8gOCk7CisgICAgICAgIGlmIChidWZmZXItPnNpemUoKSA8IDIgKyAoQVVfaGVhZGVyc19sZW5ndGggKyA3KSAvIDgpIHsKKyAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgICAgICB9CiAKICAgICAgICAgTGlzdDxBVUhlYWRlcj4gaGVhZGVyczsKIApAQCAtMzQyLDcgKzM0Niw5IEBACiAgICAgICAgICAgICAgaXQgIT0gaGVhZGVycy5lbmQoKTsgKytpdCkgewogICAgICAgICAgICAgY29uc3QgQVVIZWFkZXIgJmhlYWRlciA9ICppdDsKIAotICAgICAgICAgICAgQ0hFQ0tfTEUob2Zmc2V0ICsgaGVhZGVyLm1TaXplLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICBpZiAoYnVmZmVyLT5zaXplKCkgPCBvZmZzZXQgKyBoZWFkZXIubVNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKGhlYWRlci5tU2l6ZSk7CiAgICAgICAgICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBidWZmZXItPmRhdGEoKSArIG9mZnNldCwgaGVhZGVyLm1TaXplKTsKQEAgLTM1Myw3ICszNTksMTAgQEAKICAgICAgICAgICAgIG1QYWNrZXRzLnB1c2hfYmFjayhhY2Nlc3NVbml0KTsKICAgICAgICAgfQogCi0gICAgICAgIENIRUNLX0VRKG9mZnNldCwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICBpZiAob2Zmc2V0ICE9IGJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HVygicG90ZW50aWFsbHkgbWFsZm9ybWVkIHBhY2tldCAob2Zmc2V0ICVkLCBzaXplICVkKSIsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKQEAgLTM2NSw3ICszNzQsNyBAQAogdm9pZCBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyOjpzdWJtaXRBY2Nlc3NVbml0KCkgewogICAgIENIRUNLKCFtUGFja2V0cy5lbXB0eSgpKTsKIAotICAgIEFMT0dWKCJBY2Nlc3MgdW5pdCBjb21wbGV0ZSAoJWQgbmFsIHVuaXRzKSIsIG1QYWNrZXRzLnNpemUoKSk7CisgICAgQUxPR1YoIkFjY2VzcyB1bml0IGNvbXBsZXRlICglenUgbmFsIHVuaXRzKSIsIG1QYWNrZXRzLnNpemUoKSk7CiAKICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OwogCkBAIC00MDAsNiArNDA5LDcgQEAKICAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgewogICAgIEFzc2VtYmx5U3RhdHVzIHN0YXR1cyA9IGFkZFBhY2tldChzb3VyY2UpOwogICAgIGlmIChzdGF0dXMgPT0gTUFMRk9STUVEX1BBQ0tFVCkgeworICAgICAgICBBTE9HSSgiYWNjZXNzIHVuaXQgaXMgZGFtYWdlZCIpOwogICAgICAgICBtQWNjZXNzVW5pdERhbWFnZWQgPSB0cnVlOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKaW5kZXggNDYyYzM4NC4uMDlmNTJiYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAiQVJhd0F1ZGlvQXNzZW1ibGVyLmgiCiAjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgogCi0jaW5jbHVkZSAiYXZjX3V0aWxzLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKaW5kZXggYWYzNjliNS4uMzcyZmJlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAKQEAgLTU2Myw3ICs1NjMsNyBAQAogCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFMT0dXKCJVbmtub3duIFJUQ1AgcGFja2V0IHR5cGUgJXUgb2Ygc2l6ZSAlZCIsCisgICAgICAgICAgICAgICAgQUxPR1coIlVua25vd24gUlRDUCBwYWNrZXQgdHlwZSAldSBvZiBzaXplICV6dSIsCiAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpZGF0YVsxXSwgaGVhZGVyTGVuZ3RoKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCmluZGV4IDBkMDcwNDMuLjc5M2QxMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgcmV0dXJuIChtRmxhZ3MgJiBrRmxhZ0VPUykgIT0gMDsKIH0KIAotc3RhdHVzX3QgQVJUUFdyaXRlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworc3RhdHVzX3QgQVJUUFdyaXRlcjo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1N0YXJ0ZWQpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjc3LDcgKzI3Nyw3IEBACiAgICAgfQogCiAgICAgaWYgKG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgQUxPR1YoInJlYWQgYnVmZmVyIG9mIHNpemUgJWQiLCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICBBTE9HVigicmVhZCBidWZmZXIgb2Ygc2l6ZSAlenUiLCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkpOwogCiAgICAgICAgIGlmIChtTW9kZSA9PSBIMjY0KSB7CiAgICAgICAgICAgICBTdHJpcFN0YXJ0Y29kZShtZWRpYUJ1Zik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggZWZkZTdhOS4uZjI1NTM5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogCi0jaW5jbHVkZSAiSFRUUEJhc2UuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMjM5LDcgKzIzOSw3IEBACiAgICAgICAgIC8vIHJpZ2h0IGhlcmUsIHNpbmNlIHdlIGN1cnJlbnRseSBoYXZlIG5vIHdheSBvZiBhc2tpbmcgdGhlIHVzZXIKICAgICAgICAgLy8gZm9yIHRoaXMgaW5mb3JtYXRpb24uCiAKLSAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBydHNwIHVybCAlcyIsIHVybC5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBydHNwIHVybCAlcyIsIHVyaURlYnVnU3RyaW5nKHVybCkuY19zdHIoKSk7CiAKICAgICAgICAgcmVwbHktPnNldEludDMyKCJyZXN1bHQiLCBFUlJPUl9NQUxGT1JNRUQpOwogICAgICAgICByZXBseS0+cG9zdCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuY3BwCmluZGV4IDBkYTVkZDIuLjE2N2Y3YTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5jcHAKQEAgLTM0LDcgKzM0LDkgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQVJhd0F1ZGlvQXNzZW1ibGVyOjpBUmF3QXVkaW9Bc3NlbWJsZXIoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBjb25zdCBjaGFyICpkZXNjLCBjb25zdCBBU3RyaW5nICZwYXJhbXMpCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBjb25zdCBjaGFyICogLyogZGVzYyAqLywKKyAgICAgICAgY29uc3QgQVN0cmluZyAmIC8qIHBhcmFtcyAqLykKICAgICA6IG1Ob3RpZnlNc2cobm90aWZ5KSwKICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKGZhbHNlKSwKICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFObygwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAppbmRleCBhOWIzMzMwLi45ODQ5OGU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKQEAgLTMxOSw2ICszMTksMTEgQEAKIAogICAgIHMgPSBlbmQgKyAxOyAgLy8gc2tpcCB0aGUgZGFzaC4KIAorICAgIGlmICgqcyA9PSAnXDAnKSB7CisgICAgICAgICpucHQyID0gRkxUX01BWDsgIC8vIG9wZW4gZW5kZWQuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwogICAgIGlmICghc3RybmNtcCgibm93IiwgcywgMykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gbm8gYWJzb2x1dGUgZW5kIHRpbWUgYXZhaWxhYmxlCiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCmluZGV4IGU3N2M2OWMuLmQ2MGRjMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKQEAgLTIwLDcgKzIwLDcgQEAKICAgICAgICAgU0RQTG9hZGVyLmNwcCAgICAgICAgICAgICAgIFwKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAJJChUT1ApL2V4dGVybmFsL29wZW5zc2wvaW5jbHVkZQogCkBAIC0zMCw2ICszMCwxMCBAQAogICAgIExPQ0FMX0NGTEFHUyArPSAtV25vLXBzYWJpCiBlbmRpZgogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCitMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKExPQ0FMX1BBVEgpL0FuZHJvaWQubWsKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtNTUsNCArNTksNiBAQAogCiBMT0NBTF9NT0RVTEU6PSBydHBfdGVzdAogCitMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKExPQ0FMX1BBVEgpL0FuZHJvaWQubWsKKwogIyBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCmluZGV4IGNkNzdhYTAuLjQyM2E0MjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApAQCAtMTksNyArMTksMTEgQEAKICNkZWZpbmUgTVlfSEFORExFUl9IXwogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpZm5kZWYgTE9HX1RBRwogI2RlZmluZSBMT0dfVEFHICJNeUhhbmRsZXIiCisjZW5kaWYKKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiQVBhY2tldFNvdXJjZS5oIgpAQCAtNDIsNiArNDYsMTIgQEAKIAogI2luY2x1ZGUgIkhUVFBCYXNlLmgiCiAKKyNpZiBMT0dfTkRFQlVHCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KSAodm9pZCkoeCkKKyNlbHNlCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KQorI2VuZGlmCisKIC8vIElmIG5vIGFjY2VzcyB1bml0cyBhcmUgcmVjZWl2ZWQgd2l0aGluIDUgc2VjcywgYXNzdW1lIHRoYXQgdGhlIHJ0cAogLy8gc3RyZWFtIGhhcyBlbmRlZCBhbmQgc2lnbmFsIGVuZCBvZiBzdHJlYW0uCiBzdGF0aWMgaW50NjRfdCBrQWNjZXNzVW5pdFRpbWVvdXRVcyA9IDEwMDAwMDAwbGw7CkBAIC0xNDksNyArMTU5LDcgQEAKICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChTdHJpbmdQcmludGYoIiV1IiwgcG9ydCkpOwogICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKHBhdGgpOwogCi0gICAgICAgICAgICBBTE9HSSgicmV3cml0dGVuIHNlc3Npb24gdXJsOiAnJXMnIiwgbVNlc3Npb25VUkwuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HVigicmV3cml0dGVuIHNlc3Npb24gdXJsOiAnJXMnIiwgbVNlc3Npb25VUkwuY19zdHIoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBtU2Vzc2lvbkhvc3QgPSBob3N0OwpAQCAtMTc4LDcgKzE4OCw3IEBACiAgICAgICAgIG1Db25uLT5jb25uZWN0KG1PcmlnaW5hbFNlc3Npb25VUkwuY19zdHIoKSwgcmVwbHkpOwogICAgIH0KIAotICAgIEFTdHJpbmcgZ2V0Q29udHJvbFVSTChzcDxBU2Vzc2lvbkRlc2NyaXB0aW9uPiBkZXNjKSB7CisgICAgQVN0cmluZyBnZXRDb250cm9sVVJMKCkgewogICAgICAgICBBU3RyaW5nIHNlc3Npb25MZXZlbENvbnRyb2xVUkw7CiAgICAgICAgIGlmIChtU2Vzc2lvbkRlc2MtPmZpbmRBdHRyaWJ1dGUoCiAgICAgICAgICAgICAgICAgMCwKQEAgLTI0NCw3ICsyNTQsOSBAQAogICAgIHN0YXRpYyB2b2lkIGFkZFNERVMoaW50IHMsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CiAgICAgICAgIHNvY2tsZW5fdCBhZGRyU2l6ZSA9IHNpemVvZihhZGRyKTsKLSAgICAgICAgQ0hFQ0tfRVEoMCwgZ2V0c29ja25hbWUocywgKHNvY2thZGRyICopJmFkZHIsICZhZGRyU2l6ZSkpOworICAgICAgICBpZiAoZ2V0c29ja25hbWUocywgKHNvY2thZGRyICopJmFkZHIsICZhZGRyU2l6ZSkgIT0gMCkgeworICAgICAgICAgICAgaW5ldF9hdG9uKCIwLjAuMC4wIiwgJihhZGRyLnNpbl9hZGRyKSk7CisgICAgICAgIH0KIAogICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKTsKICAgICAgICAgZGF0YVswXSA9IDB4ODAgfCAxOwpAQCAtNDc4LDIxICs0OTAsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgc3A8QVJUU1BSZXNwb25zZT4gcmVzcG9uc2UgPQogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QVJUU1BSZXNwb25zZSAqPihvYmouZ2V0KCkpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS0+bVN0YXR1c0NvZGUgPT0gMzAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS0+bVN0YXR1c0NvZGUgPT0gMzAxIHx8IHJlc3BvbnNlLT5tU3RhdHVzQ29kZSA9PSAzMDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaSA9IHJlc3BvbnNlLT5tSGVhZGVycy5pbmRleE9mS2V5KCJsb2NhdGlvbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UoaSwgMCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZ2luYWxTZXNzaW9uVVJMID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTCA9IG1PcmlnaW5hbFNlc3Npb25VUkw7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSAiREVTQ1JJQkUgIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uVVJMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgUlRTUC8xLjBcclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiQWNjZXB0OiBhcHBsaWNhdGlvbi9zZHBcclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RyaXAgYW55IGF1dGhlbnRpY2F0aW9uIGluZm8gZnJvbSB0aGUgc2Vzc2lvbiB1cmwsIHdlIGRvbid0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YW50IHRvIHRyYW5zbWl0IHVzZXIvcGFzcyBpbiBjbGVhcnRleHQuCisgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIGhvc3QsIHBhdGgsIHVzZXIsIHBhc3M7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwb3J0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFSVFNQQ29ubmVjdGlvbjo6UGFyc2VVUkwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5jX3N0cigpLCAmaG9zdCwgJnBvcnQsICZwYXRoLCAmdXNlciwgJnBhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVzZXIuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKCJydHNwOi8vIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKGhvc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZCgiOiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChTdHJpbmdQcmludGYoIiV1IiwgcG9ydCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChwYXRoKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkZXNjJywgaWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uLT5jb25uZWN0KG1PcmlnaW5hbFNlc3Npb25VUkwuY19zdHIoKSwgcmVwbHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNTQ1LDcgKzU2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXNlVVJMID0gdG1wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sVVJMID0gZ2V0Q29udHJvbFVSTChtU2Vzc2lvbkRlc2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sVVJMID0gZ2V0Q29udHJvbFVSTCgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZXNzaW9uRGVzYy0+Y291bnRUcmFja3MoKSA8IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBhY3R1YWwgdHJhY2tzIGluIHRoaXMgc2Vzc2lvbi4KQEAgLTU5MSw3ICs2MTQsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla2FibGUgPSAhaXNMaXZlU3RyZWFtKG1TZXNzaW9uRGVzYyk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sVVJMID0gZ2V0Q29udHJvbFVSTChtU2Vzc2lvbkRlc2MpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xVUkwgPSBnZXRDb250cm9sVVJMKCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvbkRlc2MtPmNvdW50VHJhY2tzKCkgPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBhY3R1YWwgdHJhY2tzIGluIHRoaXMgc2Vzc2lvbi4KQEAgLTE4MDUsNiArMTgyOCw4IEBACiAgICAgYm9vbCBhZGRNZWRpYVRpbWVzdGFtcCgKICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJbmRleCwgY29uc3QgVHJhY2tJbmZvICp0cmFjaywKICAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7CisgICAgICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh0cmFja0luZGV4KTsKKwogICAgICAgICB1aW50MzJfdCBydHBUaW1lOwogICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigKICAgICAgICAgICAgICAgICAgICAgInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCmluZGV4IGVkM2ZhN2UuLjQyNGJhZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKQEAgLTE4LDM0ICsxOCwzMCBAQAogI2RlZmluZSBMT0dfVEFHICJTRFBMb2FkZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlICJTRFBMb2FkZXIuaCIKKyNpbmNsdWRlICJpbmNsdWRlL1NEUExvYWRlci5oIgogCiAjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgotI2luY2x1ZGUgIkhUVFBCYXNlLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiAjZGVmaW5lIERFRkFVTFRfU0RQX1NJWkUgMTAwMDAwCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotU0RQTG9hZGVyOjpTRFBMb2FkZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIHVpbnQzMl90IGZsYWdzLCBib29sIHVpZFZhbGlkLCB1aWRfdCB1aWQpCitTRFBMb2FkZXI6OlNEUExvYWRlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKQogICAgIDogbU5vdGlmeShub3RpZnkpLAogICAgICAgbUZsYWdzKGZsYWdzKSwKLSAgICAgIG1VSURWYWxpZCh1aWRWYWxpZCksCi0gICAgICBtVUlEKHVpZCksCiAgICAgICBtTmV0TG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1DYW5jZWxsZWQoZmFsc2UpLAotICAgICAgbUhUVFBEYXRhU291cmNlKAotICAgICAgICAgICAgICBIVFRQQmFzZTo6Q3JlYXRlKAotICAgICAgICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKQotICAgICAgICAgICAgICAgICAgICA/IEhUVFBCYXNlOjprRmxhZ0luY29nbml0bwotICAgICAgICAgICAgICAgICAgICA6IDApKSB7Ci0gICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICBtSFRUUERhdGFTb3VyY2UtPnNldFVJRChtVUlEKTsKLSAgICB9Ci0KKyAgICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpIHsKICAgICBtTmV0TG9vcGVyLT5zZXROYW1lKCJzZHAgbmV0Iik7CiAgICAgbU5ldExvb3Blci0+c3RhcnQoZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovLAogICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNhbkNhbGxKYXZhICovLApAQCAtOTQsMTEgKzkwLDcgQEAKICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEw7CiAgICAgbXNnLT5maW5kUG9pbnRlcigiaGVhZGVycyIsICh2b2lkICoqKSZoZWFkZXJzKTsKIAotICAgIGlmICghKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKSkgewotICAgICAgICBBTE9HSSgib25Mb2FkICclcyciLCB1cmwuY19zdHIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0koIm9uTG9hZCA8VVJMIHN1cHByZXNzZWQ+Iik7Ci0gICAgfQorICAgIEFMT0dWKCJvbkxvYWQgJXMiLCB1cmlEZWJ1Z1N0cmluZyh1cmwsIG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKS5jX3N0cigpKTsKIAogICAgIGlmICghbUNhbmNlbGxlZCkgewogICAgICAgICBlcnIgPSBtSFRUUERhdGFTb3VyY2UtPmNvbm5lY3QodXJsLmNfc3RyKCksIGhlYWRlcnMpOwpAQCAtMTMwLDcgKzEyMiw3IEBACiAgICAgICAgIHNzaXplX3QgcmVhZFNpemUgPSBtSFRUUERhdGFTb3VyY2UtPnJlYWRBdCgwLCBidWZmZXItPmRhdGEoKSwgc2RwU2l6ZSk7CiAKICAgICAgICAgaWYgKHJlYWRTaXplIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIFNEUCwgZXJyb3IgY29kZSA9ICVsZCIsIHJlYWRTaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBTRFAsIGVycm9yIGNvZGUgPSAlenUiLCByZWFkU2l6ZSk7CiAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZGVzYyA9IG5ldyBBU2Vzc2lvbkRlc2NyaXB0aW9uOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggMDZjZTE2Yi4uOTliNDgwYWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5tawpAQCAtOSw3ICs5LDcgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwIFwKKwlTdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAgXAogCUR1bW15UmVjb3JkZXIuY3BwIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCkBAIC0zMywxOCArMzMsNTUgQEAKIAlsaWJndGVzdF9tYWluIFwKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgYmlvbmljIFwKLSAgICBiaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAotICAgIGV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAotICAgIGV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCisJYmlvbmljIFwKKwliaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAorCWV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAorCWV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCisJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCisJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKworTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworZW5kaWYKKworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IFV0aWxzX3Rlc3QKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlVdGlsc190ZXN0LmNwcCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscyBcCisJbGlibG9nIFwKKwlsaWJtZWRpYSBcCisJbGlic3RhZ2VmcmlnaHQgXAorCWxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorCWxpYnN0YWdlZnJpZ2h0X29teCBcCisJbGlic3RscG9ydCBcCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorCWxpYmd0ZXN0IFwKKwlsaWJndGVzdF9tYWluIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJYmlvbmljIFwKKwliaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAorCWV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAorCWV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCisJZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIAotZW5kaWYKLQogIyBJbmNsdWRlIHN1YmRpcmVjdG9yeSBtYWtlZmlsZXMKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRHVtbXlSZWNvcmRlci5jcHAKaW5kZXggYWMzN2IyOC4uOGYxNzA4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRHVtbXlSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRHVtbXlSZWNvcmRlci5jcHAKQEAgLTYxLDcgKzYxLDcgQEAKICAgICBtU291cmNlLT5zdG9wKCk7CiAgICAgdm9pZCAqZHVtbXk7CiAgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7Ci0gICAgc3RhdHVzX3QgZXJyID0gKHN0YXR1c190KSBkdW1teTsKKyAgICBzdGF0dXNfdCBlcnIgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGR1bW15KSk7CiAKICAgICBBTE9HVigiRW5kaW5nIHRoZSByZWFkaW5nIHRocmVhZCIpOwogICAgIHJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKaW5kZXggNDlmZmNkNi4uZmQ4ODlmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcApAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CkBAIC0xMTAsNyArMTA5LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJObyBhY3R1YWwgZGlzcGxheS4gQ2hvb3NpbmcgRUdMU3VyZmFjZSBiYXNlZCBvbiBTdXJmYWNlTWVkaWFTb3VyY2UiKTsKICAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHNtcyA9IChuZXcgU3VyZmFjZU1lZGlhU291cmNlKAotICAgICAgICAgICAgICAgICAgICBnZXRTdXJmYWNlV2lkdGgoKSwgZ2V0U3VyZmFjZUhlaWdodCgpKSktPmdldEJ1ZmZlclF1ZXVlKCk7CisgICAgICAgICAgICAgICAgICAgIGdldFN1cmZhY2VXaWR0aCgpLCBnZXRTdXJmYWNlSGVpZ2h0KCkpKS0+Z2V0UHJvZHVjZXIoKTsKICAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN0YyA9IG5ldyBTdXJmYWNlKHNtcyk7CiAgICAgICAgICAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3cgPSBzdGM7CiAKQEAgLTM2MSw5ICszNjAsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKICAgICAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgICAgICBtU01TID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZShtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQpOwotCi0gICAgICAgIC8vIE1hbnVhbCBjYXN0IGlzIHJlcXVpcmVkIHRvIGF2b2lkIGNvbnN0cnVjdG9yIGFtYmlndWl0eQotICAgICAgICBtU1RDID0gbmV3IFN1cmZhY2Uoc3RhdGljX2Nhc3Q8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gPiggbVNNUy0+Z2V0QnVmZmVyUXVldWUoKSkpOworICAgICAgICBtU1RDID0gbmV3IFN1cmZhY2UobVNNUy0+Z2V0UHJvZHVjZXIoKSk7CiAgICAgICAgIG1BTlcgPSBtU1RDOwogICAgIH0KIApAQCAtMzk4LDcgKzM5NSw3IEBACiAgICAgICAgIEFMT0dWKCJTTVMtR0xUZXN0OjpTZXRVcCgpIik7CiAgICAgICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICAgICAgbVNNUyA9IG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLSAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlKHN0YXRpY19jYXN0PHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ID4oIG1TTVMtPmdldEJ1ZmZlclF1ZXVlKCkpKTsKKyAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlKG1TTVMtPmdldFByb2R1Y2VyKCkpOwogICAgICAgICBtQU5XID0gbVNUQzsKIAogICAgICAgICAvLyBEb2luZyB0aGUgc2V0dXAgcmVsYXRlZCB0byB0aGUgR0wgU2lkZQpAQCAtNTI3LDcgKzUyNCw4IEBACiB9CiAKIC8vIERlcXVldWluZyBhbmQgcXVldWluZyB0aGUgYnVmZmVyIHdpdGhvdXQgcmVhbGx5IGZpbGxpbmcgaXQgaW4uCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZVRlc3Q6Om9uZUJ1ZmZlclBhc3NOb0ZpbGwoaW50IHdpZHRoLCBpbnQgaGVpZ2h0ICkgewordm9pZCBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0OjpvbmVCdWZmZXJQYXNzTm9GaWxsKAorICAgICAgICBpbnQgLyogd2lkdGggKi8sIGludCAvKiBoZWlnaHQgICovKSB7CiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19kZXF1ZXVlX2J1ZmZlcl9hbmRfd2FpdChtQU5XLmdldCgpLCAmYW5iKSk7CiAgICAgQVNTRVJUX1RSVUUoYW5iICE9IE5VTEwpOwpAQCAtNzQ2LDkgKzc0NCw4IEBACiAgICAgQ0hFQ0soZmQgPj0gMCk7CiAKICAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IFN1cmZhY2VNZWRpYVNvdXJjZUdMVGVzdDo6c2V0VXBNZWRpYVJlY29yZGVyKGZkLAotICAgICAgICAgICAgVklERU9fU09VUkNFX0dSQUxMT0NfQlVGRkVSLAotICAgICAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQsIFZJREVPX0VOQ09ERVJfSDI2NCwgbVl1dlRleFdpZHRoLAotICAgICAgICAgICAgbVl1dlRleEhlaWdodCwgMzApOworICAgICAgICAgICAgVklERU9fU09VUkNFX1NVUkZBQ0UsIE9VVFBVVF9GT1JNQVRfTVBFR180LCBWSURFT19FTkNPREVSX0gyNjQsCisgICAgICAgICAgICBtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQsIDMwKTsKICAgICAvLyBnZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgc3VyZmFjZW1lZGlhc291cmNlIGxpdmluZyBpbgogICAgIC8vIG1lZGlhc2VydmVyIHRoYXQgaXMgY3JlYXRlZCBieSBzdGFnZWZyaWdodHJlY29yZGVyCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaVNUID0gbXItPnF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlRnJvbU1lZGlhU2VydmVyKCk7CkBAIC03ODMsNyArNzgwLDcgQEAKICAgICBBTE9HVigiVmVyaWZ5IGNyZWF0aW5nIGEgc3VyZmFjZSB3LyByaWdodCBjb25maWcgKyBkdW1teSB3cml0ZXIqKioqKioqKioiKTsKIAogICAgIG1TTVMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0gICAgbVNUQyA9IG5ldyBTdXJmYWNlKHN0YXRpY19jYXN0PHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ID4oIG1TTVMtPmdldEJ1ZmZlclF1ZXVlKCkpKTsKKyAgICBtU1RDID0gbmV3IFN1cmZhY2UobVNNUy0+Z2V0UHJvZHVjZXIoKSk7CiAgICAgbUFOVyA9IG1TVEM7CiAKICAgICBEdW1teVJlY29yZGVyIHdyaXRlcihtU01TKTsKQEAgLTg4MCw3ICs4NzcsNyBAQAogICAgIH0KICAgICBDSEVDSyhmZCA+PSAwKTsKIAotICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gc2V0VXBNZWRpYVJlY29yZGVyKGZkLCBWSURFT19TT1VSQ0VfR1JBTExPQ19CVUZGRVIsCisgICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBzZXRVcE1lZGlhUmVjb3JkZXIoZmQsIFZJREVPX1NPVVJDRV9TVVJGQUNFLAogICAgICAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQsIFZJREVPX0VOQ09ERVJfSDI2NCwgbVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0LCAzMCk7CiAKICAgICAvLyBnZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgc3VyZmFjZW1lZGlhc291cmNlIGxpdmluZyBpbgpAQCAtOTIzLDcgKzkyMCw3IEBACiAgICAgfQogICAgIENIRUNLKGZkID49IDApOwogCi0gICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBzZXRVcE1lZGlhUmVjb3JkZXIoZmQsIFZJREVPX1NPVVJDRV9HUkFMTE9DX0JVRkZFUiwKKyAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IHNldFVwTWVkaWFSZWNvcmRlcihmZCwgVklERU9fU09VUkNFX1NVUkZBQ0UsCiAgICAgICAgICAgICBPVVRQVVRfRk9STUFUX01QRUdfNCwgVklERU9fRU5DT0RFUl9IMjY0LCBtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQsIDMwKTsKIAogICAgIC8vIGdldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzdXJmYWNlbWVkaWFzb3VyY2UgbGl2aW5nIGluCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9VdGlsc190ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1V0aWxzX3Rlc3QuY3BwCmluZGV4IDIyYzRhNzMuLjFjMTNmMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1V0aWxzX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1V0aWxzX3Rlc3QuY3BwCkBAIC0zMiw3ICszMiw2NCBAQAogY2xhc3MgVXRpbHNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CiB9OwogCitURVNUX0YoVXRpbHNUZXN0LCBUZXN0Rm91ckNDKSB7CisgICAgQVNTRVJUX0VRKEZPVVJDQygncycsICd0JywgJ20nICwgJ3UnKSwgJ3N0bXUnKTsKK30KKwogVEVTVF9GKFV0aWxzVGVzdCwgVGVzdE1hdGhUZW1wbGF0ZXMpIHsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTEwLCAtNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTEsIC00KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMiwgLTQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTEzLCAtNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTQsIC00KSwgNCk7CisKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoMTAsIC00KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMSwgLTQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDEyLCAtNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoMTMsIC00KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxNCwgLTQpLCAtNCk7CisKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTEwLCA0KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTEsIDQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMiwgNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTEzLCA0KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTQsIDQpLCAtNCk7CisKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoMTAsIDQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoMTEsIDQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoMTIsIDQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoMTMsIDQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoMTQsIDQpLCA0KTsKKworICAgIEFTU0VSVF9FUShkaXZVcCgtMTEsIC00KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlVwKC0xMiwgLTQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoLTEzLCAtNCksIDQpOworCisgICAgQVNTRVJUX0VRKGRpdlVwKDExLCAtNCksIC0yKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoMTIsIC00KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZVcCgxMywgLTQpLCAtMyk7CisKKyAgICBBU1NFUlRfRVEoZGl2VXAoLTExLCA0KSwgLTIpOworICAgIEFTU0VSVF9FUShkaXZVcCgtMTIsIDQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlVwKC0xMywgNCksIC0zKTsKKworICAgIEFTU0VSVF9FUShkaXZVcCgxMSwgNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZVcCgxMiwgNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZVcCgxMywgNCksIDQpOworCisgICAgQVNTRVJUX0VRKGFicyg1TCksIDVMKTsKKyAgICBBU1NFUlRfRVEoYWJzKC0yNSksIDI1KTsKKworICAgIEFTU0VSVF9FUShtaW4oNS42ZiwgNi4wZiksIDUuNmYpOworICAgIEFTU0VSVF9FUShtaW4oNi4wZiwgNS42ZiksIDUuNmYpOworICAgIEFTU0VSVF9FUShtaW4oLTQuMywgOC42KSwgLTQuMyk7CisgICAgQVNTRVJUX0VRKG1pbig4LjYsIC00LjMpLCAtNC4zKTsKKworICAgIEFTU0VSVF9FUShtYXgoNS42ZiwgNi4wZiksIDYuMGYpOworICAgIEFTU0VSVF9FUShtYXgoNi4wZiwgNS42ZiksIDYuMGYpOworICAgIEFTU0VSVF9FUShtYXgoLTQuMywgOC42KSwgOC42KTsKKyAgICBBU1NFUlRfRVEobWF4KDguNiwgLTQuMyksIDguNik7CisKICAgICBBU1NFUlRfRkFMU0UoaXNJblJhbmdlKC00MywgODZ1LCAtNDQpKTsKICAgICBBU1NFUlRfVFJVRShpc0luUmFuZ2UoLTQzLCA4N3UsIC00MykpOwogICAgIEFTU0VSVF9UUlVFKGlzSW5SYW5nZSgtNDMsIDg4dSwgLTEpKTsKQEAgLTExMyw2ICsxNzAsMTMgQEAKICAgICBBU1NFUlRfRkFMU0UoaXNJblJhbmdlKDQzdSwgOTF1LCAxMzR1LCB+NnUpKTsKICAgICBBU1NFUlRfRkFMU0UoaXNJblJhbmdlKDQzdSwgOTJ1LCAxMzZ1LCAwdSkpOwogICAgIEFTU0VSVF9GQUxTRShpc0luUmFuZ2UoNDN1LCA5MnUsIDEzNnUsIDF1KSk7CisKKyAgICBBU1NFUlRfRVEocGVyaW9kaWNFcnJvcigxMjQsIDEwMCksIDI0KTsKKyAgICBBU1NFUlRfRVEocGVyaW9kaWNFcnJvcigyODgsIDEwMCksIDEyKTsKKyAgICBBU1NFUlRfRVEocGVyaW9kaWNFcnJvcigtMzQ1LCAxMDApLCA0NSk7CisgICAgQVNTRVJUX0VRKHBlcmlvZGljRXJyb3IoLTQ5MywgMTAwKSwgNyk7CisgICAgQVNTRVJUX0VRKHBlcmlvZGljRXJyb3IoLTU1MCwgMTAwKSwgNTApOworICAgIEFTU0VSVF9FUShwZXJpb2RpY0Vycm9yKC02MDAsIDEwMCksIDApOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLm1rCmluZGV4IGYwOTliYmQuLjZhOGI5ZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLm1rCkBAIC05LDcgKzksOCBAQAogICAgICAgICBUaW1lZFRleHRTUlRTb3VyY2UuY3BwICAgIFwKICAgICAgICAgVGltZWRUZXh0UGxheWVyLmNwcAogCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yCisKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0IFwKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAKaW5kZXggMTJmZDdmNC4uNzFhYTIxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgpAQCAtNDAsOSArNDEsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogVGltZWRUZXh0RHJpdmVyOjpUaW1lZFRleHREcml2ZXIoCi0gICAgICAgIGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyKQorICAgICAgICBjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lciwKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkKICAgICA6IG1Mb29wZXIobmV3IEFMb29wZXIpLAogICAgICAgbUxpc3RlbmVyKGxpc3RlbmVyKSwKKyAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCiAgICAgICBtU3RhdGUoVU5JTklUSUFMSVpFRCksCiAgICAgICBtQ3VycmVudFRyYWNrSW5kZXgoVUlOVF9NQVgpIHsKICAgICBtTG9vcGVyLT5zZXROYW1lKCJUaW1lZFRleHREcml2ZXIiKTsKQEAgLTIwNyw3ICsyMTAsNyBAQAogICAgIH0KIAogICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSh1cmkpOworICAgICAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShtSFRUUFNlcnZpY2UsIHVyaSk7CiAgICAgcmV0dXJuIGNyZWF0ZU91dE9mQmFuZFRleHRTb3VyY2UodHJhY2tJbmRleCwgbWltZVR5cGUsIGRhdGFTb3VyY2UpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwCmluZGV4IDlmYjBhZmUuLmEwNzA0ODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIlRpbWVkVGV4dFBsYXllciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0yNzEsNyArMjcyLDcgQEAKICAgICBzcDxNZWRpYVBsYXllckJhc2U+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKICAgICBpZiAobGlzdGVuZXIgPT0gTlVMTCkgewogICAgICAgICAvLyBUT0RPOiBpdCBtYXkgYmUgYmV0dGVyIHRvIHJldHVybiBrSW52YWxpZFRpbWVVcwotICAgICAgICBBTE9HRSgiJXM6IExpc3RlbmVyIGlzIE5VTEwuIChmaXJlVGltZVVzID0gJWxsZCkiLAorICAgICAgICBBTE9HRSgiJXM6IExpc3RlbmVyIGlzIE5VTEwuIChmaXJlVGltZVVzID0gJSIgUFJJZDY0IiApIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmaXJlVGltZVVzKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNvdXJjZS5oCmluZGV4IDc1NmNjMzEuLjhjMWMxY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U291cmNlLmgKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICAgICAgICBpbnQ2NF90ICplbmRUaW1lVXMsCiAgICAgICAgICAgUGFyY2VsICpwYXJjZWwsCiAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCkgPSAwOwotICB2aXJ0dWFsIHN0YXR1c190IGV4dHJhY3RHbG9iYWxEZXNjcmlwdGlvbnMoUGFyY2VsICpwYXJjZWwpIHsKKyAgdmlydHVhbCBzdGF0dXNfdCBleHRyYWN0R2xvYmFsRGVzY3JpcHRpb25zKFBhcmNlbCAqIC8qIHBhcmNlbCAqLykgewogICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICB9CiAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQubWsKaW5kZXggYTVlN2JhMi4uOWE5ZmRlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rCkBAIC0yLDcgKzIsNiBAQAogCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMgVW5pdCB0ZXN0cyBmb3IgbGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0Ci0jIFNlZSBhbHNvIC9kZXZlbG9wbWVudC90ZXN0cnVubmVyL3Rlc3RfZGVmcy54bWwKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE4LDEwICsxNywxMyBAQAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAkKFRPUCkvZXh0ZXJuYWwvZXhwYXQvbGliIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJiaW5kZXIgXAogICAgIGxpYmV4cGF0IFwKLSAgICBsaWJzdGFnZWZyaWdodAorICAgIGxpYnN0YWdlZnJpZ2h0IFwKKyAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKKyAgICBsaWJ1dGlscwogCiBpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4MTQ2MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5tawpAQCAtMCwwICsxLDIzIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9DUFBGTEFHUyArPSAtRF9fU1RESU5UX0xJTUlUUyBcCisgICAgICAgICAgICAgICAgICAtV2Vycm9yCisKK0xPQ0FMX1NSQ19GSUxFUzo9IEVibWxVdGlsLmNwcCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgV2VibUVsZW1lbnQuY3BwICAgICBcCisgICAgICAgICAgICAgICAgICBXZWJtRnJhbWUuY3BwICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFdlYm1GcmFtZVRocmVhZC5jcHAgXAorICAgICAgICAgICAgICAgICAgV2VibVdyaXRlci5jcHAKKworCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoVE9QKS9mcmFtZXdvcmtzL2F2L2luY2x1ZGUKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlic3RhZ2VmcmlnaHQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ1dGlscyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmxvZworCitMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF93ZWJtCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vRWJtbFV0aWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9FYm1sVXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5ZmVjNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vRWJtbFV0aWwuY3BwCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgeworCisvLyBUYWJsZSBmb3IgU2VhbCdzIGFsZ29yaXRobSBmb3IgTnVtYmVyIG9mIFRyYWlsaW5nIFplcm9zLiBIYWNrZXIncyBEZWxpZ2h0CisvLyBvbmxpbmUsIEZpZ3VyZSA1LTE4IChodHRwOi8vd3d3LmhhY2tlcnNkZWxpZ2h0Lm9yZy9yZXZpc2lvbnMucGRmKQorLy8gVGhlIGVudHJpZXMgd2hvc2UgdmFsdWUgaXMgLTEgYXJlIG5ldmVyIHJlZmVyZW5jZWQuCitpbnQgTlRaX1RBQkxFW10gPSB7CisgICAgMzIsICAwLCAgMSwgMTIsICAyLCAgNiwgLTEsIDEzLCAgIDMsIC0xLCAgNywgLTEsIC0xLCAtMSwgLTEsIDE0LAorICAgIDEwLCAgNCwgLTEsIC0xLCAgOCwgLTEsIC0xLCAyNSwgIC0xLCAtMSwgLTEsIC0xLCAtMSwgMjEsIDI3LCAxNSwKKyAgICAzMSwgMTEsICA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsICAgOSwgLTEsIC0xLCAyNCwgLTEsIC0xLCAyMCwgMjYsCisgICAgMzAsIC0xLCAtMSwgLTEsIC0xLCAyMywgLTEsIDE5LCAgMjksIC0xLCAyMiwgMTgsIDI4LCAxNywgMTYsIC0xCit9OworCitpbnQgbnVtYmVyT2ZUcmFpbGluZ1plcm9zMzIoaW50MzJfdCBpKSB7CisgICAgdWludDMyX3QgdSA9IChpICYgLWkpICogMHgwNDUwRkJBRjsKKyAgICByZXR1cm4gTlRaX1RBQkxFWyh1KSA+PiAyNl07Cit9CisKK3VpbnQ2NF90IGhpZ2hlc3RPbmVCaXQodWludDY0X3QgbikgeworICAgIG4gfD0gKG4gPj4gMSk7CisgICAgbiB8PSAobiA+PiAyKTsKKyAgICBuIHw9IChuID4+IDQpOworICAgIG4gfD0gKG4gPj4gOCk7CisgICAgbiB8PSAobiA+PiAxNik7CisgICAgbiB8PSAobiA+PiAzMik7CisgICAgcmV0dXJuIG4gLSAobiA+PiAxKTsKK30KKwordWludDY0X3QgX3Bvd2VyT2YyKHVpbnQ2NF90IHUpIHsKKyAgICB1aW50NjRfdCBwb3dlck9mMiA9IGhpZ2hlc3RPbmVCaXQodSk7CisgICAgcmV0dXJuIHBvd2VyT2YyID8gcG93ZXJPZjIgOiAxOworfQorCisvLyBCYXNlZCBvbiBMb25nLm51bWJlck9mVHJhaWxpbmdaZXJvcyBpbiBMb25nLmphdmEKK2ludCBudW1iZXJPZlRyYWlsaW5nWmVyb3ModWludDY0X3QgdSkgeworICAgIGludDMyX3QgbG93ID0gdTsKKyAgICByZXR1cm4gbG93ICE9MCA/IG51bWJlck9mVHJhaWxpbmdaZXJvczMyKGxvdykKKyAgICAgICAgICAgICAgICAgICA6IDMyICsgbnVtYmVyT2ZUcmFpbGluZ1plcm9zMzIoKGludDMyX3QpICh1ID4+IDMyKSk7Cit9Cit9CisKK25hbWVzcGFjZSB3ZWJtIHsKKworLy8gRW5jb2RlIHRoZSBpZCBhbmQvb3Igc2l6ZSBvZiBhbiBFQk1MIGVsZW1lbnQgYnl0ZXMgYnkgc2V0dGluZyBhIGxlYWRpbmcgbGVuZ3RoIGRlc2NyaXB0b3IgYml0OgorLy8KKy8vICAgMXh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxLWJ5dGUgdmFsdWVzCisvLyAgIDAxeHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAxeHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDAxeHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIC4uLgorLy8gICAwMDAwMXh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMDAwMXh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAwMDAwMXggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgLQorLy8gICAwMDAwMDAwMSB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAtIDgtYnl0ZSB2YWx1ZXMKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGxlYXN0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcG9zc2libGUuCit1aW50NjRfdCBlbmNvZGVVbnNpZ25lZCh1aW50NjRfdCB1KSB7CisgICAgdWludDY0X3QgcG93ZXJPZjIgPSBfcG93ZXJPZjIodSk7CisgICAgaWYgKHUgKyAxID09IHBvd2VyT2YyIDw8IDEpCisgICAgICAgIHBvd2VyT2YyIDw8PSAxOworICAgIGludCBzaGlmdFdpZHRoID0gKDcgKyBudW1iZXJPZlRyYWlsaW5nWmVyb3MocG93ZXJPZjIpKSAvIDcgKiA3OworICAgIGxvbmcgbGVuZ3RoRGVzY3JpcHRvciA9IDEgPDwgc2hpZnRXaWR0aDsKKyAgICByZXR1cm4gbGVuZ3RoRGVzY3JpcHRvciB8IHU7Cit9CisKKy8vIExpa2UgYWJvdmUgYnV0IHBhZHMgdGhlIGlucHV0IHZhbHVlIHdpdGggbGVhZGluZyB6ZXJvcyB1cCB0byB0aGUgc3BlY2lmaWVkIHdpZHRoLiBUaGUgbGVuZ3RoCisvLyBkZXNjcmlwdG9yIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gd2lkdGguCit1aW50NjRfdCBlbmNvZGVVbnNpZ25lZCh1aW50NjRfdCB1LCBpbnQgd2lkdGgpIHsKKyAgICBpbnQgc2hpZnRXaWR0aCA9IDcgKiB3aWR0aDsKKyAgICB1aW50NjRfdCBsZW5ndGhEZXNjcmlwdG9yID0gMTsKKyAgICBsZW5ndGhEZXNjcmlwdG9yIDw8PSBzaGlmdFdpZHRoOworICAgIHJldHVybiBsZW5ndGhEZXNjcmlwdG9yIHwgdTsKK30KKworLy8gQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgYW4gRUJNTCBjb2RlZCBpZCBvciBzaXplIGZyb20gaXRzIGxlbmd0aCBkZXNjcmlwdG9yLgoraW50IHNpemVPZih1aW50NjRfdCB1KSB7CisgICAgdWludDY0X3QgcG93ZXJPZjIgPSBfcG93ZXJPZjIodSk7CisgICAgaW50IHVuc2lnbmVkTGVuZ3RoID0gbnVtYmVyT2ZUcmFpbGluZ1plcm9zKHBvd2VyT2YyKSAvIDggKyAxOworICAgIHJldHVybiB1bnNpZ25lZExlbmd0aDsKK30KKworLy8gU2VyaWFsaXplIGFuIEVCTUwgY29kZWQgaWQgb3Igc2l6ZSBpbiBiaWctZW5kaWFuIG9yZGVyLgoraW50IHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQodWludDY0X3QgdSwgdWludDhfdCogYmFyeSkgeworICAgIGludCB1bnNpZ25lZExlbmd0aCA9IHNpemVPZih1KTsKKyAgICBmb3IgKGludCBpID0gdW5zaWduZWRMZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBiYXJ5W2ldID0gdSAmIDB4ZmY7CisgICAgICAgIHUgPj49IDg7CisgICAgfQorICAgIHJldHVybiB1bnNpZ25lZExlbmd0aDsKK30KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9FYm1sVXRpbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9FYm1sVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOWMzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRUJNTFVUSUxfSF8KKyNkZWZpbmUgRUJNTFVUSUxfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2Ugd2VibSB7CisKKy8vIEVuY29kZSB0aGUgaWQgYW5kL29yIHNpemUgb2YgYW4gRUJNTCBlbGVtZW50IGJ5dGVzIGJ5IHNldHRpbmcgYSBsZWFkaW5nIGxlbmd0aCBkZXNjcmlwdG9yIGJpdDoKKy8vCisvLyAgIDF4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMS1ieXRlIHZhbHVlcworLy8gICAwMXh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMXh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAwMXh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAuLi4KKy8vICAgMDAwMDF4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDAwMDF4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMDAwMDF4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgIC0KKy8vICAgMDAwMDAwMDEgeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggLSA4LWJ5dGUgdmFsdWVzCisvLworLy8gVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBsZWFzdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBvc3NpYmxlLgordWludDY0X3QgZW5jb2RlVW5zaWduZWQodWludDY0X3QgdSk7CisKKy8vIExpa2UgYWJvdmUgYnV0IHBhZHMgdGhlIGlucHV0IHZhbHVlIHdpdGggbGVhZGluZyB6ZXJvcyB1cCB0byB0aGUgc3BlY2lmaWVkIHdpZHRoLiBUaGUgbGVuZ3RoCisvLyBkZXNjcmlwdG9yIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gd2lkdGguCit1aW50NjRfdCBlbmNvZGVVbnNpZ25lZCh1aW50NjRfdCB1LCBpbnQgd2lkdGgpOworCisvLyBTZXJpYWxpemUgYW4gRUJNTCBjb2RlZCBpZCBvciBzaXplIGluIGJpZy1lbmRpYW4gb3JkZXIuCitpbnQgc2VyaWFsaXplQ29kZWRVbnNpZ25lZCh1aW50NjRfdCB1LCB1aW50OF90KiBiYXJ5KTsKKworLy8gQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgYW4gRUJNTCBjb2RlZCBpZCBvciBzaXplIGZyb20gaXRzIGxlbmd0aCBkZXNjcmlwdG9yLgoraW50IHNpemVPZih1aW50NjRfdCB1KTsKKworfQorCisjZW5kaWYgLyogRUJNTFVUSUxfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vTGlua2VkQmxvY2tpbmdRdWV1ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9MaW5rZWRCbG9ja2luZ1F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2YTlhMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vTGlua2VkQmxvY2tpbmdRdWV1ZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIExJTktFREJMT0NLSU5HUVVFVUVfSF8KKyNkZWZpbmUgTElOS0VEQkxPQ0tJTkdRVUVVRV9IXworCisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIExpbmtlZEJsb2NraW5nUXVldWUgeworICAgIExpc3Q8VD4gbUxpc3Q7CisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db250ZW50QXZhaWxhYmxlQ29uZGl0aW9uOworCisgICAgVCBmcm9udChib29sIHJlbW92ZSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgICAgICB3aGlsZSAobUxpc3QuZW1wdHkoKSkgeworICAgICAgICAgICAgbUNvbnRlbnRBdmFpbGFibGVDb25kaXRpb24ud2FpdChtTG9jayk7CisgICAgICAgIH0KKyAgICAgICAgVCBlID0gKihtTGlzdC5iZWdpbigpKTsKKyAgICAgICAgaWYgKHJlbW92ZSkgeworICAgICAgICAgICAgbUxpc3QuZXJhc2UobUxpc3QuYmVnaW4oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGU7CisgICAgfQorCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTGlua2VkQmxvY2tpbmdRdWV1ZSk7CisKK3B1YmxpYzoKKyAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlKCkgeworICAgIH0KKworICAgIH5MaW5rZWRCbG9ja2luZ1F1ZXVlKCkgeworICAgIH0KKworICAgIGJvb2wgZW1wdHkoKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgICAgIHJldHVybiBtTGlzdC5lbXB0eSgpOworICAgIH0KKworICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgICAgIG1MaXN0LmNsZWFyKCk7CisgICAgfQorCisgICAgVCBwZWVrKCkgeworICAgICAgICByZXR1cm4gZnJvbnQoZmFsc2UpOworICAgIH0KKworICAgIFQgdGFrZSgpIHsKKyAgICAgICAgcmV0dXJuIGZyb250KHRydWUpOworICAgIH0KKworICAgIHZvaWQgcHVzaChUIGUpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICAgICAgbUxpc3QucHVzaF9iYWNrKGUpOworICAgICAgICBtQ29udGVudEF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICB9Cit9OworCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisjZW5kaWYgLyogTElOS0VEQkxPQ0tJTkdRVUVVRV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtQ29uc3RhbnRzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Db25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTNmNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtQ29uc3RhbnRzLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFdFQk1DT05TVEFOVFNfSF8KKyNkZWZpbmUgV0VCTUNPTlNUQU5UU19IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB3ZWJtIHsKKworY29uc3QgaW50IGtNaW5FYm1sVm9pZFNpemUgPSAyOworY29uc3QgaW50NjRfdCBrTWF4TWV0YVNlZWtTaXplID0gNjQ7Citjb25zdCBpbnQ2NF90IGtNa3ZVbmtub3duTGVuZ3RoID0gMHgwMWZmZmZmZmZmZmZmZmZmbDsKKworLy8gRUJNTCBlbGVtZW50IGlkJ3MgZnJvbSBodHRwOi8vbWF0cm9za2Eub3JnL3RlY2huaWNhbC9zcGVjcy9pbmRleC5odG1sCitlbnVtIE1rdiB7CisgICAga01rdkVibWwgPSAweDFBNDVERkEzLAorICAgIGtNa3ZFYm1sVmVyc2lvbiA9IDB4NDI4NiwKKyAgICBrTWt2RWJtbFJlYWRWZXJzaW9uID0gMHg0MkY3LAorICAgIGtNa3ZFYm1sTWF4SWRsZW5ndGggPSAweDQyRjIsCisgICAga01rdkVibWxNYXhTaXplTGVuZ3RoID0gMHg0MkYzLAorICAgIGtNa3ZEb2NUeXBlID0gMHg0MjgyLAorICAgIGtNa3ZEb2NUeXBlVmVyc2lvbiA9IDB4NDI4NywKKyAgICBrTWt2RG9jVHlwZVJlYWRWZXJzaW9uID0gMHg0Mjg1LAorICAgIGtNa3ZWb2lkID0gMHhFQywKKyAgICBrTWt2U2lnbmF0dXJlU2xvdCA9IDB4MUI1Mzg2NjcsCisgICAga01rdlNpZ25hdHVyZUFsZ28gPSAweDdFOEEsCisgICAga01rdlNpZ25hdHVyZUhhc2ggPSAweDdFOUEsCisgICAga01rdlNpZ25hdHVyZVB1YmxpY0tleSA9IDB4N0VBNSwKKyAgICBrTWt2U2lnbmF0dXJlID0gMHg3RUI1LAorICAgIGtNa3ZTaWduYXR1cmVFbGVtZW50cyA9IDB4N0U1QiwKKyAgICBrTWt2U2lnbmF0dXJlRWxlbWVudExpc3QgPSAweDdFN0IsCisgICAga01rdlNpZ25lZEVsZW1lbnQgPSAweDY1MzIsCisgICAga01rdlNlZ21lbnQgPSAweDE4NTM4MDY3LAorICAgIGtNa3ZTZWVrSGVhZCA9IDB4MTE0RDlCNzQsCisgICAga01rdlNlZWsgPSAweDREQkIsCisgICAga01rdlNlZWtJZCA9IDB4NTNBQiwKKyAgICBrTWt2U2Vla1Bvc2l0aW9uID0gMHg1M0FDLAorICAgIGtNa3ZJbmZvID0gMHgxNTQ5QTk2NiwKKyAgICBrTWt2VGltZWNvZGVTY2FsZSA9IDB4MkFEN0IxLAorICAgIGtNa3ZTZWdtZW50RHVyYXRpb24gPSAweDQ0ODksCisgICAga01rdkRhdGVVdGMgPSAweDQ0NjEsCisgICAga01rdk11eGluZ0FwcCA9IDB4NEQ4MCwKKyAgICBrTWt2V3JpdGluZ0FwcCA9IDB4NTc0MSwKKyAgICBrTWt2Q2x1c3RlciA9IDB4MUY0M0I2NzUsCisgICAga01rdlRpbWVjb2RlID0gMHhFNywKKyAgICBrTWt2UHJldlNpemUgPSAweEFCLAorICAgIGtNa3ZCbG9ja0dyb3VwID0gMHhBMCwKKyAgICBrTWt2QmxvY2sgPSAweEExLAorICAgIGtNa3ZCbG9ja0FkZGl0aW9ucyA9IDB4NzVBMSwKKyAgICBrTWt2QmxvY2tNb3JlID0gMHhBNiwKKyAgICBrTWt2QmxvY2tBZGRJZCA9IDB4RUUsCisgICAga01rdkJsb2NrQWRkaXRpb25hbCA9IDB4QTUsCisgICAga01rdkJsb2NrRHVyYXRpb24gPSAweDlCLAorICAgIGtNa3ZSZWZlcmVuY2VCbG9jayA9IDB4RkIsCisgICAga01rdkxhY2VOdW1iZXIgPSAweENDLAorICAgIGtNa3ZTaW1wbGVCbG9jayA9IDB4QTMsCisgICAga01rdlRyYWNrcyA9IDB4MTY1NEFFNkIsCisgICAga01rdlRyYWNrRW50cnkgPSAweEFFLAorICAgIGtNa3ZUcmFja051bWJlciA9IDB4RDcsCisgICAga01rdlRyYWNrVWlkID0gMHg3M0M1LAorICAgIGtNa3ZUcmFja1R5cGUgPSAweDgzLAorICAgIGtNa3ZGbGFnRW5hYmxlZCA9IDB4QjksCisgICAga01rdkZsYWdEZWZhdWx0ID0gMHg4OCwKKyAgICBrTWt2RmxhZ0ZvcmNlZCA9IDB4NTVBQSwKKyAgICBrTWt2RmxhZ0xhY2luZyA9IDB4OUMsCisgICAga01rdkRlZmF1bHREdXJhdGlvbiA9IDB4MjNFMzgzLAorICAgIGtNa3ZNYXhCbG9ja0FkZGl0aW9uSWQgPSAweDU1RUUsCisgICAga01rdk5hbWUgPSAweDUzNkUsCisgICAga01rdkxhbmd1YWdlID0gMHgyMkI1OUMsCisgICAga01rdkNvZGVjSWQgPSAweDg2LAorICAgIGtNa3ZDb2RlY1ByaXZhdGUgPSAweDYzQTIsCisgICAga01rdkNvZGVjTmFtZSA9IDB4MjU4Njg4LAorICAgIGtNa3ZWaWRlbyA9IDB4RTAsCisgICAga01rdkZsYWdJbnRlcmxhY2VkID0gMHg5QSwKKyAgICBrTWt2U3RlcmVvTW9kZSA9IDB4NTNCOCwKKyAgICBrTWt2QWxwaGFNb2RlID0gMHg1M0MwLAorICAgIGtNa3ZQaXhlbFdpZHRoID0gMHhCMCwKKyAgICBrTWt2UGl4ZWxIZWlnaHQgPSAweEJBLAorICAgIGtNa3ZQaXhlbENyb3BCb3R0b20gPSAweDU0QUEsCisgICAga01rdlBpeGVsQ3JvcFRvcCA9IDB4NTRCQiwKKyAgICBrTWt2UGl4ZWxDcm9wTGVmdCA9IDB4NTRDQywKKyAgICBrTWt2UGl4ZWxDcm9wUmlnaHQgPSAweDU0REQsCisgICAga01rdkRpc3BsYXlXaWR0aCA9IDB4NTRCMCwKKyAgICBrTWt2RGlzcGxheUhlaWdodCA9IDB4NTRCQSwKKyAgICBrTWt2RGlzcGxheVVuaXQgPSAweDU0QjIsCisgICAga01rdkFzcGVjdFJhdGlvVHlwZSA9IDB4NTRCMywKKyAgICBrTWt2RnJhbWVSYXRlID0gMHgyMzgzRTMsCisgICAga01rdkF1ZGlvID0gMHhFMSwKKyAgICBrTWt2U2FtcGxpbmdGcmVxdWVuY3kgPSAweEI1LAorICAgIGtNa3ZPdXRwdXRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDB4NzhCNSwKKyAgICBrTWt2Q2hhbm5lbHMgPSAweDlGLAorICAgIGtNa3ZCaXREZXB0aCA9IDB4NjI2NCwKKyAgICBrTWt2Q3VlcyA9IDB4MUM1M0JCNkIsCisgICAga01rdkN1ZVBvaW50ID0gMHhCQiwKKyAgICBrTWt2Q3VlVGltZSA9IDB4QjMsCisgICAga01rdkN1ZVRyYWNrUG9zaXRpb25zID0gMHhCNywKKyAgICBrTWt2Q3VlVHJhY2sgPSAweEY3LAorICAgIGtNa3ZDdWVDbHVzdGVyUG9zaXRpb24gPSAweEYxLAorICAgIGtNa3ZDdWVCbG9ja051bWJlciA9IDB4NTM3OAorfTsKKworZW51bSBUcmFja1R5cGVzIHsKKyAgICBrSW52YWxpZFR5cGUgPSAtMSwKKyAgICBrVmlkZW9UeXBlID0gMHgxLAorICAgIGtBdWRpb1R5cGUgPSAweDIsCisgICAga0NvbXBsZXhUeXBlID0gMHgzLAorICAgIGtMb2dvVHlwZSA9IDB4MTAsCisgICAga1N1YnRpdGxlVHlwZSA9IDB4MTEsCisgICAga0J1dHRvbnNUeXBlID0gMHgxMiwKKyAgICBrQ29udHJvbFR5cGUgPSAweDIwCit9OworCitlbnVtIFRyYWNrTnVtIHsKKyAgICBrVmlkZW9UcmFja051bSA9IDB4MSwKKyAgICBrQXVkaW9UcmFja051bSA9IDB4MgorfTsKK30KKworI2VuZGlmIC8qIFdFQk1DT05TVEFOVFNfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwOGNhYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiV2VibUVsZW1lbnQiCisKKyNpbmNsdWRlICJFYm1sVXRpbC5oIgorI2luY2x1ZGUgIldlYm1FbGVtZW50LmgiCisjaW5jbHVkZSAiV2VibUNvbnN0YW50cy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSB3ZWJtOworCituYW1lc3BhY2UgeworCitpbnQ2NF90IHZvaWRTaXplKGludDY0X3QgdG90YWxTaXplKSB7CisgICAgaWYgKHRvdGFsU2l6ZSA8IDIpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodG90YWxTaXplIDwgOSkgeworICAgICAgICByZXR1cm4gdG90YWxTaXplIC0gMjsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsU2l6ZSAtIDk7Cit9CisKK3VpbnQ2NF90IGNoaWxkcmVuU3VtKGNvbnN0IExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGNoaWxkcmVuKSB7CisgICAgdWludDY0X3QgdG90YWwgPSAwOworICAgIGZvciAoTGlzdDxzcDxXZWJtRWxlbWVudD4gPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gY2hpbGRyZW4uZW5kKCk7ICsraXQpIHsKKyAgICAgICAgdG90YWwgKz0gKCppdCktPnRvdGFsU2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gdG90YWw7Cit9CisKK3ZvaWQgcG9wdWxhdGVDb21tb25UcmFja0VudHJpZXMoCisgICAgICAgIGludCBudW0sCisgICAgICAgIHVpbnQ2NF90IHVpZCwKKyAgICAgICAgYm9vbCBsYWNpbmcsCisgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcsCisgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjLAorICAgICAgICBUcmFja1R5cGVzIHR5cGUsCisgICAgICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gJmxzKSB7CisgICAgbHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlRyYWNrTnVtYmVyLCBudW0pKTsKKyAgICBscy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2VHJhY2tVaWQsIHVpZCkpOworICAgIGxzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZGbGFnTGFjaW5nLCBsYWNpbmcpKTsKKyAgICBscy5wdXNoX2JhY2sobmV3IFdlYm1TdHJpbmcoa01rdkxhbmd1YWdlLCBsYW5nKSk7CisgICAgbHMucHVzaF9iYWNrKG5ldyBXZWJtU3RyaW5nKGtNa3ZDb2RlY0lkLCBjb2RlYykpOworICAgIGxzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZUcmFja1R5cGUsIHR5cGUpKTsKK30KK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitXZWJtRWxlbWVudDo6V2VibUVsZW1lbnQodWludDY0X3QgaWQsIHVpbnQ2NF90IHNpemUpCisgICAgOiBtSWQoaWQpLCBtU2l6ZShzaXplKSB7Cit9CisKK1dlYm1FbGVtZW50Ojp+V2VibUVsZW1lbnQoKSB7Cit9CisKK2ludCBXZWJtRWxlbWVudDo6c2VyaWFsaXplUGF5bG9hZFNpemUodWludDhfdCAqYnVmKSB7CisgICAgcmV0dXJuIHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQoZW5jb2RlVW5zaWduZWQobVNpemUpLCBidWYpOworfQorCit1aW50NjRfdCBXZWJtRWxlbWVudDo6c2VyaWFsaXplSW50byh1aW50OF90ICpidWYpIHsKKyAgICB1aW50OF90ICpjdXIgPSBidWY7CisgICAgaW50IGhlYWQgPSBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKG1JZCwgY3VyKTsKKyAgICBjdXIgKz0gaGVhZDsKKyAgICBpbnQgbmVjayA9IHNlcmlhbGl6ZVBheWxvYWRTaXplKGN1cik7CisgICAgY3VyICs9IG5lY2s7CisgICAgc2VyaWFsaXplUGF5bG9hZChjdXIpOworICAgIGN1ciArPSBtU2l6ZTsKKyAgICByZXR1cm4gY3VyIC0gYnVmOworfQorCit1aW50NjRfdCBXZWJtRWxlbWVudDo6dG90YWxTaXplKCkgeworICAgIHVpbnQ4X3QgYnVmWzhdOworICAgIC8vLi4uLi4uLi4uLi4uLi4uICsgc2l6ZU9mKGVuY29kZVVuc2lnbmVkKHNpemUpKQorICAgIHJldHVybiBzaXplT2YobUlkKSArIHNlcmlhbGl6ZVBheWxvYWRTaXplKGJ1ZikgKyBtU2l6ZTsKK30KKwordWludDhfdCAqV2VibUVsZW1lbnQ6OnNlcmlhbGl6ZSh1aW50NjRfdCYgc2l6ZSkgeworICAgIHNpemUgPSB0b3RhbFNpemUoKTsKKyAgICB1aW50OF90ICpidWYgPSBuZXcgdWludDhfdFtzaXplXTsKKyAgICBzZXJpYWxpemVJbnRvKGJ1Zik7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworaW50IFdlYm1FbGVtZW50Ojp3cml0ZShpbnQgZmQsIHVpbnQ2NF90JiBzaXplKSB7CisgICAgdWludDhfdCBidWZbOF07CisgICAgc2l6ZSA9IHRvdGFsU2l6ZSgpOworICAgIG9mZjY0X3Qgb2ZmID0gOjpsc2VlazY0KGZkLCAoc2l6ZSAtIDEpLCBTRUVLX0NVUikgLSAoc2l6ZSAtIDEpOworICAgIDo6d3JpdGUoZmQsIGJ1ZiwgMSk7IC8vIGV4dGVuZCBmaWxlCisKKyAgICBvZmY2NF90IGN1ck9mZiA9IG9mZiArIHNpemU7CisgICAgb2ZmNjRfdCBhbGlnbmVkT2ZmID0gb2ZmICYgfig6OnN5c2NvbmYoX1NDX1BBR0VfU0laRSkgLSAxKTsKKyAgICBvZmY2NF90IG1hcFNpemUgPSBjdXJPZmYgLSBhbGlnbmVkT2ZmOworICAgIG9mZjY0X3QgcGFnZU9mZiA9IG9mZiAtIGFsaWduZWRPZmY7CisgICAgdm9pZCAqZHN0ID0gOjptbWFwNjQoTlVMTCwgbWFwU2l6ZSwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIGFsaWduZWRPZmYpOworICAgIGlmIChkc3QgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICBBTE9HRSgibW1hcDY0IGZhaWxlZDsgZXJybm8gPSAlZCIsIGVycm5vKTsKKyAgICAgICAgQUxPR0UoImZkICVkOyBmbGFnczogJW8iLCBmZCwgOjpmY250bChmZCwgRl9HRVRGTCwgMCkpOworICAgICAgICByZXR1cm4gZXJybm87CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2VyaWFsaXplSW50bygodWludDhfdCopIGRzdCArIHBhZ2VPZmYpOworICAgICAgICA6Om1zeW5jKGRzdCwgbWFwU2l6ZSwgTVNfU1lOQyk7CisgICAgICAgIHJldHVybiA6Om11bm1hcChkc3QsIG1hcFNpemUpOworICAgIH0KK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1VbnNpZ25lZDo6V2VibVVuc2lnbmVkKHVpbnQ2NF90IGlkLCB1aW50NjRfdCB2YWx1ZSkKKyAgICA6IFdlYm1FbGVtZW50KGlkLCBzaXplT2YodmFsdWUpKSwgbVZhbHVlKHZhbHVlKSB7Cit9CisKK3ZvaWQgV2VibVVuc2lnbmVkOjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQobVZhbHVlLCBidWYpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VibUZsb2F0OjpXZWJtRmxvYXQodWludDY0X3QgaWQsIGRvdWJsZSB2YWx1ZSkKKyAgICA6IFdlYm1FbGVtZW50KGlkLCBzaXplb2YoZG91YmxlKSksIG1WYWx1ZSh2YWx1ZSkgeworfQorCitXZWJtRmxvYXQ6OldlYm1GbG9hdCh1aW50NjRfdCBpZCwgZmxvYXQgdmFsdWUpCisgICAgOiBXZWJtRWxlbWVudChpZCwgc2l6ZW9mKGZsb2F0KSksIG1WYWx1ZSh2YWx1ZSkgeworfQorCit2b2lkIFdlYm1GbG9hdDo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICB1aW50NjRfdCBkYXRhOworICAgIGlmIChtU2l6ZSA9PSBzaXplb2YoZmxvYXQpKSB7CisgICAgICAgIGZsb2F0IGYgPSBtVmFsdWU7CisgICAgICAgIGRhdGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCZmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QqPigmbVZhbHVlKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IG1TaXplIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgYnVmW2ldID0gZGF0YSAmIDB4ZmY7CisgICAgICAgIGRhdGEgPj49IDg7CisgICAgfQorfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VibUJpbmFyeTo6V2VibUJpbmFyeSh1aW50NjRfdCBpZCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJnJlZikKKyAgICA6IFdlYm1FbGVtZW50KGlkLCByZWYtPnNpemUoKSksIG1SZWYocmVmKSB7Cit9CisKK3ZvaWQgV2VibUJpbmFyeTo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICBtZW1jcHkoYnVmLCBtUmVmLT5kYXRhKCksIG1SZWYtPnNpemUoKSk7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtU3RyaW5nOjpXZWJtU3RyaW5nKHVpbnQ2NF90IGlkLCBjb25zdCBjaGFyICpzdHIpCisgICAgOiBXZWJtRWxlbWVudChpZCwgc3RybGVuKHN0cikpLCBtU3RyKHN0cikgeworfQorCit2b2lkIFdlYm1TdHJpbmc6OnNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKSB7CisgICAgbWVtY3B5KGJ1ZiwgbVN0ciwgc3RybGVuKG1TdHIpKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1TaW1wbGVCbG9jazo6V2VibVNpbXBsZUJsb2NrKAorICAgICAgICBpbnQgdHJhY2tOdW0sCisgICAgICAgIGludDE2X3QgcmVsVGltZWNvZGUsCisgICAgICAgIGJvb2wga2V5LAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiYgb3JpZykKKyAgICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIHRyYWNrTnVtKjEgKyB0aW1lY29kZSoyICsgZmxhZ3MqMQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl4KKyAgICAvLyBPbmx5IHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIG9mIHRyYWNrTnVtIGlzIGVuY29kZWQKKyAgICA6IFdlYm1FbGVtZW50KGtNa3ZTaW1wbGVCbG9jaywgb3JpZy0+c2l6ZSgpICsgNCksCisgICAgICBtVHJhY2tOdW0odHJhY2tOdW0pLAorICAgICAgbVJlbFRpbWVjb2RlKHJlbFRpbWVjb2RlKSwKKyAgICAgIG1LZXkoa2V5KSwKKyAgICAgIG1SZWYob3JpZykgeworfQorCit2b2lkIFdlYm1TaW1wbGVCbG9jazo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKGVuY29kZVVuc2lnbmVkKG1UcmFja051bSksIGJ1Zik7CisgICAgYnVmWzFdID0gKG1SZWxUaW1lY29kZSAmIDB4ZmYwMCkgPj4gODsKKyAgICBidWZbMl0gPSBtUmVsVGltZWNvZGUgJiAweGZmOworICAgIGJ1ZlszXSA9IG1LZXkgPyAweDgwIDogMDsKKyAgICBtZW1jcHkoYnVmICsgNCwgbVJlZi0+ZGF0YSgpLCBtU2l6ZSAtIDQpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRWJtbFZvaWQ6OkVibWxWb2lkKHVpbnQ2NF90IHRvdGFsU2l6ZSkKKyAgICA6IFdlYm1FbGVtZW50KGtNa3ZWb2lkLCB2b2lkU2l6ZSh0b3RhbFNpemUpKSwKKyAgICAgIG1TaXplV2lkdGgodG90YWxTaXplIC0gc2l6ZU9mKGtNa3ZWb2lkKSAtIHZvaWRTaXplKHRvdGFsU2l6ZSkpIHsKKyAgICBDSEVDS19HRSh2b2lkU2l6ZSh0b3RhbFNpemUpLCAwKTsKK30KKworaW50IEVibWxWb2lkOjpzZXJpYWxpemVQYXlsb2FkU2l6ZSh1aW50OF90ICpidWYpIHsKKyAgICByZXR1cm4gc2VyaWFsaXplQ29kZWRVbnNpZ25lZChlbmNvZGVVbnNpZ25lZChtU2l6ZSwgbVNpemVXaWR0aCksIGJ1Zik7Cit9CisKK3ZvaWQgRWJtbFZvaWQ6OnNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKSB7CisgICAgOjptZW1zZXQoYnVmLCAwLCBtU2l6ZSk7CisgICAgcmV0dXJuOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VibU1hc3Rlcjo6V2VibU1hc3Rlcih1aW50NjRfdCBpZCwgY29uc3QgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pCisgICAgOiBXZWJtRWxlbWVudChpZCwgY2hpbGRyZW5TdW0oY2hpbGRyZW4pKSwgbUNoaWxkcmVuKGNoaWxkcmVuKSB7Cit9CisKK1dlYm1NYXN0ZXI6OldlYm1NYXN0ZXIodWludDY0X3QgaWQpCisgICAgOiBXZWJtRWxlbWVudChpZCwgMCkgeworfQorCitpbnQgV2VibU1hc3Rlcjo6c2VyaWFsaXplUGF5bG9hZFNpemUodWludDhfdCAqYnVmKSB7CisgICAgaWYgKG1TaXplID09IDApeworICAgICAgICByZXR1cm4gc2VyaWFsaXplQ29kZWRVbnNpZ25lZChrTWt2VW5rbm93bkxlbmd0aCwgYnVmKTsKKyAgICB9CisgICAgcmV0dXJuIFdlYm1FbGVtZW50OjpzZXJpYWxpemVQYXlsb2FkU2l6ZShidWYpOworfQorCit2b2lkIFdlYm1NYXN0ZXI6OnNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKSB7CisgICAgdWludDY0X3Qgb2ZmID0gMDsKKyAgICBmb3IgKExpc3Q8c3A8V2VibUVsZW1lbnQ+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbUNoaWxkcmVuLmJlZ2luKCk7IGl0ICE9IG1DaGlsZHJlbi5lbmQoKTsKKyAgICAgICAgICAgICsraXQpIHsKKyAgICAgICAgc3A8V2VibUVsZW1lbnQ+IGNoaWxkID0gKCppdCk7CisgICAgICAgIGNoaWxkLT5zZXJpYWxpemVJbnRvKGJ1ZiArIG9mZik7CisgICAgICAgIG9mZiArPSBjaGlsZC0+dG90YWxTaXplKCk7CisgICAgfQorfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpDdWVQb2ludEVudHJ5KHVpbnQ2NF90IHRpbWUsIGludCB0cmFjaywgdWludDY0X3Qgb2ZmKSB7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBjdWVQb2ludEVudHJ5RmllbGRzOworICAgIGN1ZVBvaW50RW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkN1ZVRyYWNrLCB0cmFjaykpOworICAgIGN1ZVBvaW50RW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkN1ZUNsdXN0ZXJQb3NpdGlvbiwgb2ZmKSk7CisgICAgV2VibUVsZW1lbnQgKmN1ZVRyYWNrUG9zaXRpb25zID0gbmV3IFdlYm1NYXN0ZXIoa01rdkN1ZVRyYWNrUG9zaXRpb25zLCBjdWVQb2ludEVudHJ5RmllbGRzKTsKKworICAgIGN1ZVBvaW50RW50cnlGaWVsZHMuY2xlYXIoKTsKKyAgICBjdWVQb2ludEVudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZDdWVUaW1lLCB0aW1lKSk7CisgICAgY3VlUG9pbnRFbnRyeUZpZWxkcy5wdXNoX2JhY2soY3VlVHJhY2tQb3NpdGlvbnMpOworICAgIHJldHVybiBuZXcgV2VibU1hc3RlcihrTWt2Q3VlUG9pbnQsIGN1ZVBvaW50RW50cnlGaWVsZHMpOworfQorCitzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OlNlZWtFbnRyeSh1aW50NjRfdCBpZCwgdWludDY0X3Qgb2ZmKSB7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBzZWVrRW50cnlGaWVsZHM7CisgICAgc2Vla0VudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZTZWVrSWQsIGlkKSk7CisgICAgc2Vla0VudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZTZWVrUG9zaXRpb24sIG9mZikpOworICAgIHJldHVybiBuZXcgV2VibU1hc3RlcihrTWt2U2Vlaywgc2Vla0VudHJ5RmllbGRzKTsKK30KKworc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpFYm1sSGVhZGVyKAorICAgICAgICBpbnQgdmVyLAorICAgICAgICBpbnQgcmVhZFZlciwKKyAgICAgICAgaW50IG1heElkTGVuLAorICAgICAgICBpbnQgbWF4U2l6ZUxlbiwKKyAgICAgICAgaW50IGRvY1ZlciwKKyAgICAgICAgaW50IGRvY1JlYWRWZXIpIHsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IGhlYWRlckZpZWxkczsKKyAgICBoZWFkZXJGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkVibWxWZXJzaW9uLCB2ZXIpKTsKKyAgICBoZWFkZXJGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkVibWxSZWFkVmVyc2lvbiwgcmVhZFZlcikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RWJtbE1heElkbGVuZ3RoLCBtYXhJZExlbikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RWJtbE1heFNpemVMZW5ndGgsIG1heFNpemVMZW4pKTsKKyAgICBoZWFkZXJGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtU3RyaW5nKGtNa3ZEb2NUeXBlLCAid2VibSIpKTsKKyAgICBoZWFkZXJGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkRvY1R5cGVWZXJzaW9uLCBkb2NWZXIpKTsKKyAgICBoZWFkZXJGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkRvY1R5cGVSZWFkVmVyc2lvbiwgZG9jUmVhZFZlcikpOworICAgIHJldHVybiBuZXcgV2VibU1hc3RlcihrTWt2RWJtbCwgaGVhZGVyRmllbGRzKTsKK30KKworc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpTZWdtZW50SW5mbyh1aW50NjRfdCBzY2FsZSwgZG91YmxlIGR1cikgeworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gc2VnbWVudEluZm87CisgICAgLy8gcGxhY2UgZHVyYXRpb24gZmlyc3Q7IGVhc2llciB0byBwYXRjaAorICAgIHNlZ21lbnRJbmZvLnB1c2hfYmFjayhuZXcgV2VibUZsb2F0KGtNa3ZTZWdtZW50RHVyYXRpb24sIGR1cikpOworICAgIHNlZ21lbnRJbmZvLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZUaW1lY29kZVNjYWxlLCBzY2FsZSkpOworICAgIHNlZ21lbnRJbmZvLnB1c2hfYmFjayhuZXcgV2VibVN0cmluZyhrTWt2TXV4aW5nQXBwLCAiYW5kcm9pZCIpKTsKKyAgICBzZWdtZW50SW5mby5wdXNoX2JhY2sobmV3IFdlYm1TdHJpbmcoa01rdldyaXRpbmdBcHAsICJhbmRyb2lkIikpOworICAgIHJldHVybiBuZXcgV2VibU1hc3RlcihrTWt2SW5mbywgc2VnbWVudEluZm8pOworfQorCitzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OkF1ZGlvVHJhY2tFbnRyeSgKKyAgICAgICAgaW50IGNoYW5zLAorICAgICAgICBkb3VibGUgcmF0ZSwKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZiwKKyAgICAgICAgaW50IGJwcywKKyAgICAgICAgdWludDY0X3QgdWlkLAorICAgICAgICBib29sIGxhY2luZywKKyAgICAgICAgY29uc3QgY2hhciAqbGFuZykgeworICAgIGlmICh1aWQgPT0gMCkgeworICAgICAgICB1aWQgPSBrQXVkaW9UcmFja051bTsKKyAgICB9CisKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IHRyYWNrRW50cnlGaWVsZHM7CisgICAgcG9wdWxhdGVDb21tb25UcmFja0VudHJpZXMoCisgICAgICAgICAgICBrQXVkaW9UcmFja051bSwKKyAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgIGxhY2luZywKKyAgICAgICAgICAgIGxhbmcsCisgICAgICAgICAgICAiQV9WT1JCSVMiLAorICAgICAgICAgICAga0F1ZGlvVHlwZSwKKyAgICAgICAgICAgIHRyYWNrRW50cnlGaWVsZHMpOworCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBhdWRpb0luZm87CisgICAgYXVkaW9JbmZvLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZDaGFubmVscywgY2hhbnMpKTsKKyAgICBhdWRpb0luZm8ucHVzaF9iYWNrKG5ldyBXZWJtRmxvYXQoa01rdlNhbXBsaW5nRnJlcXVlbmN5LCByYXRlKSk7CisgICAgaWYgKGJwcykgeworICAgICAgICBXZWJtRWxlbWVudCAqYml0RGVwdGggPSBuZXcgV2VibVVuc2lnbmVkKGtNa3ZCaXREZXB0aCwgYnBzKTsKKyAgICAgICAgYXVkaW9JbmZvLnB1c2hfYmFjayhiaXREZXB0aCk7CisgICAgfQorCisgICAgdHJhY2tFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1NYXN0ZXIoa01rdkF1ZGlvLCBhdWRpb0luZm8pKTsKKyAgICB0cmFja0VudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibUJpbmFyeShrTWt2Q29kZWNQcml2YXRlLCBidWYpKTsKKyAgICByZXR1cm4gbmV3IFdlYm1NYXN0ZXIoa01rdlRyYWNrRW50cnksIHRyYWNrRW50cnlGaWVsZHMpOworfQorCitzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OlZpZGVvVHJhY2tFbnRyeSgKKyAgICAgICAgdWludDY0X3Qgd2lkdGgsCisgICAgICAgIHVpbnQ2NF90IGhlaWdodCwKKyAgICAgICAgdWludDY0X3QgdWlkLAorICAgICAgICBib29sIGxhY2luZywKKyAgICAgICAgY29uc3QgY2hhciAqbGFuZykgeworICAgIGlmICh1aWQgPT0gMCkgeworICAgICAgICB1aWQgPSBrVmlkZW9UcmFja051bTsKKyAgICB9CisKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IHRyYWNrRW50cnlGaWVsZHM7CisgICAgcG9wdWxhdGVDb21tb25UcmFja0VudHJpZXMoCisgICAgICAgICAgICBrVmlkZW9UcmFja051bSwKKyAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgIGxhY2luZywKKyAgICAgICAgICAgIGxhbmcsCisgICAgICAgICAgICAiVl9WUDgiLAorICAgICAgICAgICAga1ZpZGVvVHlwZSwKKyAgICAgICAgICAgIHRyYWNrRW50cnlGaWVsZHMpOworCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiB2aWRlb0luZm87CisgICAgdmlkZW9JbmZvLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZQaXhlbFdpZHRoLCB3aWR0aCkpOworICAgIHZpZGVvSW5mby5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2UGl4ZWxIZWlnaHQsIGhlaWdodCkpOworCisgICAgdHJhY2tFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1NYXN0ZXIoa01rdlZpZGVvLCB2aWRlb0luZm8pKTsKKyAgICByZXR1cm4gbmV3IFdlYm1NYXN0ZXIoa01rdlRyYWNrRW50cnksIHRyYWNrRW50cnlGaWVsZHMpOworfQorfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTkzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFdFQk1FTEVNRU5UX0hfCisjZGVmaW5lIFdFQk1FTEVNRU5UX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFdlYm1FbGVtZW50IDogcHVibGljIExpZ2h0UmVmQmFzZTxXZWJtRWxlbWVudD4geworICAgIGNvbnN0IHVpbnQ2NF90IG1JZCwgbVNpemU7CisKKyAgICBXZWJtRWxlbWVudCh1aW50NjRfdCBpZCwgdWludDY0X3Qgc2l6ZSk7CisgICAgdmlydHVhbCB+V2VibUVsZW1lbnQoKTsKKworICAgIHZpcnR1YWwgaW50IHNlcmlhbGl6ZVBheWxvYWRTaXplKHVpbnQ4X3QgKmJ1Zik7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKT0wOworICAgIHVpbnQ2NF90IHRvdGFsU2l6ZSgpOworICAgIHVpbnQ2NF90IHNlcmlhbGl6ZUludG8odWludDhfdCAqYnVmKTsKKyAgICB1aW50OF90ICpzZXJpYWxpemUodWludDY0X3QmIHNpemUpOworICAgIGludCB3cml0ZShpbnQgZmQsIHVpbnQ2NF90JiBzaXplKTsKKworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gRWJtbEhlYWRlcigKKyAgICAgICAgICAgIGludCB2ZXIgPSAxLAorICAgICAgICAgICAgaW50IHJlYWRWZXIgPSAxLAorICAgICAgICAgICAgaW50IG1heElkTGVuID0gNCwKKyAgICAgICAgICAgIGludCBtYXhTaXplTGVuID0gOCwKKyAgICAgICAgICAgIGludCBkb2NWZXIgPSAyLAorICAgICAgICAgICAgaW50IGRvY1JlYWRWZXIgPSAyKTsKKworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gU2VnbWVudEluZm8odWludDY0X3Qgc2NhbGUgPSAxMDAwMDAwLCBkb3VibGUgZHVyID0gMCk7CisKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IEF1ZGlvVHJhY2tFbnRyeSgKKyAgICAgICAgICAgIGludCBjaGFucywKKyAgICAgICAgICAgIGRvdWJsZSByYXRlLAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZiwKKyAgICAgICAgICAgIGludCBicHMgPSAwLAorICAgICAgICAgICAgdWludDY0X3QgdWlkID0gMCwKKyAgICAgICAgICAgIGJvb2wgbGFjaW5nID0gZmFsc2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nID0gInVuZCIpOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBWaWRlb1RyYWNrRW50cnkoCisgICAgICAgICAgICB1aW50NjRfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQ2NF90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQ2NF90IHVpZCA9IDAsCisgICAgICAgICAgICBib29sIGxhY2luZyA9IGZhbHNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZyA9ICJ1bmQiKTsKKworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gU2Vla0VudHJ5KHVpbnQ2NF90IGlkLCB1aW50NjRfdCBvZmYpOworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gQ3VlUG9pbnRFbnRyeSh1aW50NjRfdCB0aW1lLCBpbnQgdHJhY2ssIHVpbnQ2NF90IG9mZik7CisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBTaW1wbGVCbG9jaygKKyAgICAgICAgICAgIGludCB0cmFja051bSwKKyAgICAgICAgICAgIGludDE2X3QgdGltZWNvZGUsCisgICAgICAgICAgICBib29sIGtleSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICB1aW50NjRfdCBkYXRhU2l6ZSk7Cit9OworCitzdHJ1Y3QgV2VibVVuc2lnbmVkIDogcHVibGljIFdlYm1FbGVtZW50IHsKKyAgICBXZWJtVW5zaWduZWQodWludDY0X3QgaWQsIHVpbnQ2NF90IHZhbHVlKTsKKyAgICBjb25zdCB1aW50NjRfdCBtVmFsdWU7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCitzdHJ1Y3QgV2VibUZsb2F0IDogcHVibGljIFdlYm1FbGVtZW50IHsKKyAgICBjb25zdCBkb3VibGUgbVZhbHVlOworICAgIFdlYm1GbG9hdCh1aW50NjRfdCBpZCwgZmxvYXQgdmFsdWUpOworICAgIFdlYm1GbG9hdCh1aW50NjRfdCBpZCwgZG91YmxlIHZhbHVlKTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK3N0cnVjdCBXZWJtQmluYXJ5IDogcHVibGljIFdlYm1FbGVtZW50IHsKKyAgICBjb25zdCBzcDxBQnVmZmVyPiBtUmVmOworICAgIFdlYm1CaW5hcnkodWludDY0X3QgaWQsIGNvbnN0IHNwPEFCdWZmZXI+ICZyZWYpOworICAgIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpOworfTsKKworc3RydWN0IFdlYm1TdHJpbmcgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIGNvbnN0IGNoYXIgKmNvbnN0IG1TdHI7CisgICAgV2VibVN0cmluZyh1aW50NjRfdCBpZCwgY29uc3QgY2hhciAqc3RyKTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK3N0cnVjdCBXZWJtU2ltcGxlQmxvY2sgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIGNvbnN0IGludCBtVHJhY2tOdW07CisgICAgY29uc3QgaW50MTZfdCBtUmVsVGltZWNvZGU7CisgICAgY29uc3QgYm9vbCBtS2V5OworICAgIGNvbnN0IHNwPEFCdWZmZXI+IG1SZWY7CisKKyAgICBXZWJtU2ltcGxlQmxvY2soaW50IHRyYWNrTnVtLCBpbnQxNl90IHRpbWVjb2RlLCBib29sIGtleSwgY29uc3Qgc3A8QUJ1ZmZlcj4mIG9yaWcpOworICAgIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpOworfTsKKworc3RydWN0IEVibWxWb2lkIDogcHVibGljIFdlYm1FbGVtZW50IHsKKyAgICBjb25zdCB1aW50NjRfdCBtU2l6ZVdpZHRoOworICAgIEVibWxWb2lkKHVpbnQ2NF90IHRvdGFsU2l6ZSk7CisgICAgaW50IHNlcmlhbGl6ZVBheWxvYWRTaXplKHVpbnQ4X3QgKmJ1Zik7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCitzdHJ1Y3QgV2VibU1hc3RlciA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgY29uc3QgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBtQ2hpbGRyZW47CisgICAgV2VibU1hc3Rlcih1aW50NjRfdCBpZCk7CisgICAgV2VibU1hc3Rlcih1aW50NjRfdCBpZCwgY29uc3QgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiAmY2hpbGRyZW4pOworICAgIGludCBzZXJpYWxpemVQYXlsb2FkU2l6ZSh1aW50OF90ICpidWYpOworICAgIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpOworfTsKKworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworI2VuZGlmIC8qIFdFQk1FTEVNRU5UX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxMzRlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmNwcApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJXZWJtRnJhbWUiCisKKyNpbmNsdWRlICJXZWJtRnJhbWUuaCIKKyNpbmNsdWRlICJXZWJtQ29uc3RhbnRzLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSB3ZWJtOworCituYW1lc3BhY2Ugeworc3A8QUJ1ZmZlcj4gdG9BQnVmZmVyKE1lZGlhQnVmZmVyICptYnVmKSB7CisgICAgc3A8QUJ1ZmZlcj4gYWJ1ZiA9IG5ldyBBQnVmZmVyKG1idWYtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICBtZW1jcHkoYWJ1Zi0+ZGF0YSgpLCAodWludDhfdCopIG1idWYtPmRhdGEoKSArIG1idWYtPnJhbmdlX29mZnNldCgpLCBtYnVmLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgcmV0dXJuIGFidWY7Cit9Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3Qgc3A8V2VibUZyYW1lPiBXZWJtRnJhbWU6OkVPUyA9IG5ldyBXZWJtRnJhbWUoKTsKKworV2VibUZyYW1lOjpXZWJtRnJhbWUoKQorICAgIDogbVR5cGUoa0ludmFsaWRUeXBlKSwKKyAgICAgIG1LZXkoZmFsc2UpLAorICAgICAgbUFic1RpbWVjb2RlKFVJTlQ2NF9NQVgpLAorICAgICAgbURhdGEobmV3IEFCdWZmZXIoMCkpLAorICAgICAgbUVvcyh0cnVlKSB7Cit9CisKK1dlYm1GcmFtZTo6V2VibUZyYW1lKGludCB0eXBlLCBib29sIGtleSwgdWludDY0X3QgYWJzVGltZWNvZGUsIE1lZGlhQnVmZmVyICptYnVmKQorICAgIDogbVR5cGUodHlwZSksCisgICAgICBtS2V5KGtleSksCisgICAgICBtQWJzVGltZWNvZGUoYWJzVGltZWNvZGUpLAorICAgICAgbURhdGEodG9BQnVmZmVyKG1idWYpKSwKKyAgICAgIG1Fb3MoZmFsc2UpIHsKK30KKworc3A8V2VibUVsZW1lbnQ+IFdlYm1GcmFtZTo6U2ltcGxlQmxvY2sodWludDY0X3QgYmFzZVRpbWVjb2RlKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBXZWJtU2ltcGxlQmxvY2soCisgICAgICAgICAgICBtVHlwZSA9PSBrVmlkZW9UeXBlID8ga1ZpZGVvVHJhY2tOdW0gOiBrQXVkaW9UcmFja051bSwKKyAgICAgICAgICAgIG1BYnNUaW1lY29kZSAtIGJhc2VUaW1lY29kZSwKKyAgICAgICAgICAgIG1LZXksCisgICAgICAgICAgICBtRGF0YSk7Cit9CisKK2Jvb2wgV2VibUZyYW1lOjpvcGVyYXRvcjwoY29uc3QgV2VibUZyYW1lICZvdGhlcikgY29uc3QgeworICAgIGlmICh0aGlzLT5tRW9zKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG90aGVyLm1Fb3MpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICh0aGlzLT5tQWJzVGltZWNvZGUgPT0gb3RoZXIubUFic1RpbWVjb2RlKSB7CisgICAgICAgIGlmICh0aGlzLT5tVHlwZSA9PSBrQXVkaW9UeXBlICYmIG90aGVyLm1UeXBlID09IGtWaWRlb1R5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLT5tVHlwZSA9PSBrVmlkZW9UeXBlICYmIG90aGVyLm1UeXBlID09IGtBdWRpb1R5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0aGlzLT5tQWJzVGltZWNvZGUgPCBvdGhlci5tQWJzVGltZWNvZGU7Cit9Cit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjBiMDU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBXRUJNRlJBTUVfSF8KKyNkZWZpbmUgV0VCTUZSQU1FX0hfCisKKyNpbmNsdWRlICJXZWJtRWxlbWVudC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBXZWJtRnJhbWUgOiBMaWdodFJlZkJhc2U8V2VibUZyYW1lPiB7CitwdWJsaWM6CisgICAgY29uc3QgaW50IG1UeXBlOworICAgIGNvbnN0IGJvb2wgbUtleTsKKyAgICBjb25zdCB1aW50NjRfdCBtQWJzVGltZWNvZGU7CisgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gbURhdGE7CisgICAgY29uc3QgYm9vbCBtRW9zOworCisgICAgV2VibUZyYW1lKCk7CisgICAgV2VibUZyYW1lKGludCB0eXBlLCBib29sIGtleSwgdWludDY0X3QgYWJzVGltZWNvZGUsIE1lZGlhQnVmZmVyICpidWYpOworICAgIH5XZWJtRnJhbWUoKSB7fQorCisgICAgc3A8V2VibUVsZW1lbnQ+IFNpbXBsZUJsb2NrKHVpbnQ2NF90IGJhc2VUaW1lY29kZSkgY29uc3Q7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBXZWJtRnJhbWUgJm90aGVyKSBjb25zdDsKKworICAgIHN0YXRpYyBjb25zdCBzcDxXZWJtRnJhbWU+IEVPUzsKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV2VibUZyYW1lKTsKK307CisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KKyNlbmRpZiAvKiBXRUJNRlJBTUVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGI4YTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJXZWJtRnJhbWVUaHJlYWQiCisKKyNpbmNsdWRlICJXZWJtQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAiV2VibUZyYW1lVGhyZWFkLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCit1c2luZyBuYW1lc3BhY2Ugd2VibTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkICpXZWJtRnJhbWVUaHJlYWQ6OndyYXAodm9pZCAqYXJnKSB7CisgICAgV2VibUZyYW1lVGhyZWFkICp3b3JrZXIgPSByZWludGVycHJldF9jYXN0PFdlYm1GcmFtZVRocmVhZCo+KGFyZyk7CisgICAgd29ya2VyLT5ydW4oKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdHVzX3QgV2VibUZyYW1lVGhyZWFkOjpzdGFydCgpIHsKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKTsKKyAgICBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZCwgJmF0dHIsIFdlYm1GcmFtZVRocmVhZDo6d3JhcCwgdGhpcyk7CisgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgV2VibUZyYW1lVGhyZWFkOjpzdG9wKCkgeworICAgIHZvaWQgKnN0YXR1czsKKyAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJnN0YXR1cyk7CisgICAgcmV0dXJuIChzdGF0dXNfdCkoaW50cHRyX3Qpc3RhdHVzOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VibUZyYW1lU291cmNlVGhyZWFkOjpXZWJtRnJhbWVTb3VyY2VUaHJlYWQoCisgICAgaW50IHR5cGUsCisgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIHNpbmspCisgICAgOiBtVHlwZSh0eXBlKSwgbVNpbmsoc2luaykgeworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VibUZyYW1lU2lua1RocmVhZDo6V2VibUZyYW1lU2lua1RocmVhZCgKKyAgICAgICAgY29uc3QgaW50JiBmZCwKKyAgICAgICAgY29uc3QgdWludDY0X3QmIG9mZiwKKyAgICAgICAgc3A8V2VibUZyYW1lU291cmNlVGhyZWFkPiB2aWRlb1RocmVhZCwKKyAgICAgICAgc3A8V2VibUZyYW1lU291cmNlVGhyZWFkPiBhdWRpb1RocmVhZCwKKyAgICAgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY3VlcykKKyAgICA6IG1GZChmZCksCisgICAgICBtU2VnbWVudERhdGFTdGFydChvZmYpLAorICAgICAgbVZpZGVvRnJhbWVzKHZpZGVvVGhyZWFkLT5tU2luayksCisgICAgICBtQXVkaW9GcmFtZXMoYXVkaW9UaHJlYWQtPm1TaW5rKSwKKyAgICAgIG1DdWVzKGN1ZXMpLAorICAgICAgbURvbmUodHJ1ZSkgeworfQorCitXZWJtRnJhbWVTaW5rVGhyZWFkOjpXZWJtRnJhbWVTaW5rVGhyZWFkKAorICAgICAgICBjb25zdCBpbnQmIGZkLAorICAgICAgICBjb25zdCB1aW50NjRfdCYgb2ZmLAorICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgdmlkZW9Tb3VyY2UsCisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBhdWRpb1NvdXJjZSwKKyAgICAgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY3VlcykKKyAgICA6IG1GZChmZCksCisgICAgICBtU2VnbWVudERhdGFTdGFydChvZmYpLAorICAgICAgbVZpZGVvRnJhbWVzKHZpZGVvU291cmNlKSwKKyAgICAgIG1BdWRpb0ZyYW1lcyhhdWRpb1NvdXJjZSksCisgICAgICBtQ3VlcyhjdWVzKSwKKyAgICAgIG1Eb25lKHRydWUpIHsKK30KKworLy8gSW5pdGlhbGl6ZXMgYSB3ZWJtIGNsdXN0ZXIgd2l0aCBpdHMgc3RhcnRpbmcgdGltZWNvZGUuCisvLworLy8gZnJhbWVzOgorLy8gICBzZXF1ZW5jZSBvZiBpbnB1dCBhdWRpby92aWRlbyBmcmFtZXMgcmVjZWl2ZWQgZnJvbSB0aGUgc291cmNlLgorLy8KKy8vIGNsdXN0ZXJUaW1lY29kZUw6CisvLyAgIHRoZSBzdGFydGluZyB0aW1lY29kZSBvZiB0aGUgY2x1c3RlcjsgdGhpcyBpcyB0aGUgdGltZWNvZGUgb2YgdGhlIGZpcnN0CisvLyAgIGZyYW1lIHNpbmNlIGZyYW1lcyBhcmUgb3JkZXJlZCBieSB0aW1lc3RhbXAuCisvLworLy8gY2hpbGRyZW46CisvLyAgIGxpc3QgdG8gaG9sZCBjaGlsZCBlbGVtZW50cyBpbiBhIHdlYm0gY2x1c3RlciAoc3RhcnQgdGltZWNvZGUgYW5kCisvLyAgIHNpbXBsZSBibG9ja3MpLgorLy8KKy8vIHN0YXRpYwordm9pZCBXZWJtRnJhbWVTaW5rVGhyZWFkOjppbml0Q2x1c3RlcigKKyAgICBMaXN0PGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgZnJhbWVzLAorICAgIHVpbnQ2NF90JiBjbHVzdGVyVGltZWNvZGVMLAorICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGNoaWxkcmVuKSB7CisgICAgQ0hFQ0soIWZyYW1lcy5lbXB0eSgpICYmIGNoaWxkcmVuLmVtcHR5KCkpOworCisgICAgY29uc3Qgc3A8V2VibUZyYW1lPiBmID0gKihmcmFtZXMuYmVnaW4oKSk7CisgICAgY2x1c3RlclRpbWVjb2RlTCA9IGYtPm1BYnNUaW1lY29kZTsKKyAgICBXZWJtVW5zaWduZWQgKmNsdXN0ZXJUaW1lY29kZSA9IG5ldyBXZWJtVW5zaWduZWQoa01rdlRpbWVjb2RlLCBjbHVzdGVyVGltZWNvZGVMKTsKKyAgICBjaGlsZHJlbi5jbGVhcigpOworICAgIGNoaWxkcmVuLnB1c2hfYmFjayhjbHVzdGVyVGltZWNvZGUpOworfQorCit2b2lkIFdlYm1GcmFtZVNpbmtUaHJlYWQ6OndyaXRlQ2x1c3RlcihMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjaGlsZHJlbikgeworICAgIC8vIGNoaWxkcmVuIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgc2ltcGxlYmxvY2sgYW5kIGl0cyB0aW1lY29kZQorICAgIENIRUNLX0dFKGNoaWxkcmVuLnNpemUoKSwgMik7CisKKyAgICB1aW50NjRfdCBzaXplOworICAgIHNwPFdlYm1FbGVtZW50PiBjbHVzdGVyID0gbmV3IFdlYm1NYXN0ZXIoa01rdkNsdXN0ZXIsIGNoaWxkcmVuKTsKKyAgICBjbHVzdGVyLT53cml0ZShtRmQsIHNpemUpOworICAgIGNoaWxkcmVuLmNsZWFyKCk7Cit9CisKKy8vIFdyaXRlIG91dCAocG9zc2libHkgbXVsdGlwbGUpIHdlYm0gY2x1c3RlcihzKSBmcm9tIGZyYW1lcyBzcGxpdCBvbiB2aWRlbyBrZXkgZnJhbWVzLgorLy8KKy8vIGxhc3Q6CisvLyAgIGN1cnJlbnQgZmx1c2ggaXMgdHJpZ2dlcmVkIGJ5IEVPUyBpbnN0ZWFkIG9mIGEgc2Vjb25kIG91dHN0YW5kaW5nIHZpZGVvIGtleSBmcmFtZS4KK3ZvaWQgV2VibUZyYW1lU2lua1RocmVhZDo6Zmx1c2hGcmFtZXMoTGlzdDxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIGZyYW1lcywgYm9vbCBsYXN0KSB7CisgICAgaWYgKGZyYW1lcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50NjRfdCBjbHVzdGVyVGltZWNvZGVMOworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gY2hpbGRyZW47CisgICAgaW5pdENsdXN0ZXIoZnJhbWVzLCBjbHVzdGVyVGltZWNvZGVMLCBjaGlsZHJlbik7CisKKyAgICB1aW50NjRfdCBjdWVUaW1lID0gY2x1c3RlclRpbWVjb2RlTDsKKyAgICBvZmZfdCBmcG9zID0gOjpsc2VlayhtRmQsIDAsIFNFRUtfQ1VSKTsKKyAgICBzaXplX3QgbiA9IGZyYW1lcy5zaXplKCk7CisgICAgaWYgKCFsYXN0KSB7CisgICAgICAgIC8vIElmIHdlIGFyZSBub3QgZmx1c2hpbmcgdGhlIGxhc3Qgc2VxdWVuY2Ugb2Ygb3V0c3RhbmRpbmcgZnJhbWVzLCBmbHVzaEZyYW1lcworICAgICAgICAvLyBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgcmlnaHQgYWZ0ZXIgd2UgaGF2ZSBwdXNoZWQgYSBzZWNvbmQgb3V0c3RhbmRpbmcgdmlkZW8ga2V5CisgICAgICAgIC8vIGZyYW1lICh0aGUgbGFzdCBmcmFtZSksIHdoaWNoIGJlbG9uZ3MgdG8gdGhlIG5leHQgY2x1c3RlcjsgYWxzbyBob2xkIGJhY2sgb24KKyAgICAgICAgLy8gZmx1c2hpbmcgdGhlIHNlY29uZCB0byBsYXN0IGZyYW1lIGJlZm9yZSB3ZSBjaGVjayBpdHMgdHlwZS4gQSBhdWRpbyBmcmFtZQorICAgICAgICAvLyBzaG91bGQgcHJlY2VkZSB0aGUgYWZvcmVtZW50aW9uZWQgdmlkZW8ga2V5IGZyYW1lIGluIHRoZSBuZXh0IHNlcXVlbmNlLCBhIHZpZGVvCisgICAgICAgIC8vIGZyYW1lIHNob3VsZCBiZSB0aGUgbGFzdCBmcmFtZSBpbiB0aGUgY3VycmVudCAodG8tYmUtZmx1c2hlZCkgc2VxdWVuY2UuCisgICAgICAgIENIRUNLX0dFKG4sIDIpOworICAgICAgICBuIC09IDI7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8V2VibUZyYW1lPiBmID0gKihmcmFtZXMuYmVnaW4oKSk7CisgICAgICAgIGlmIChmLT5tVHlwZSA9PSBrVmlkZW9UeXBlICYmIGYtPm1LZXkpIHsKKyAgICAgICAgICAgIGN1ZVRpbWUgPSBmLT5tQWJzVGltZWNvZGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZi0+bUFic1RpbWVjb2RlIC0gY2x1c3RlclRpbWVjb2RlTCA+IElOVDE2X01BWCkgeworICAgICAgICAgICAgd3JpdGVDbHVzdGVyKGNoaWxkcmVuKTsKKyAgICAgICAgICAgIGluaXRDbHVzdGVyKGZyYW1lcywgY2x1c3RlclRpbWVjb2RlTCwgY2hpbGRyZW4pOworICAgICAgICB9CisKKyAgICAgICAgZnJhbWVzLmVyYXNlKGZyYW1lcy5iZWdpbigpKTsKKyAgICAgICAgY2hpbGRyZW4ucHVzaF9iYWNrKGYtPlNpbXBsZUJsb2NrKGNsdXN0ZXJUaW1lY29kZUwpKTsKKyAgICB9CisKKyAgICAvLyBlcXVpdmFsZW50IHRvIGxhc3Q9PWZhbHNlCisgICAgaWYgKCFmcmFtZXMuZW1wdHkoKSkgeworICAgICAgICAvLyBkZWNpZGUgd2hldGhlciB0byB3cml0ZSBvdXQgdGhlIHNlY29uZCB0byBsYXN0IGZyYW1lLgorICAgICAgICBjb25zdCBzcDxXZWJtRnJhbWU+IHNlY29uZExhc3RGcmFtZSA9ICooZnJhbWVzLmJlZ2luKCkpOworICAgICAgICBpZiAoc2Vjb25kTGFzdEZyYW1lLT5tVHlwZSA9PSBrVmlkZW9UeXBlKSB7CisgICAgICAgICAgICBmcmFtZXMuZXJhc2UoZnJhbWVzLmJlZ2luKCkpOworICAgICAgICAgICAgY2hpbGRyZW4ucHVzaF9iYWNrKHNlY29uZExhc3RGcmFtZS0+U2ltcGxlQmxvY2soY2x1c3RlclRpbWVjb2RlTCkpOworICAgICAgICB9CisgICAgfQorCisgICAgd3JpdGVDbHVzdGVyKGNoaWxkcmVuKTsKKyAgICBzcDxXZWJtRWxlbWVudD4gY3VlUG9pbnQgPSBXZWJtRWxlbWVudDo6Q3VlUG9pbnRFbnRyeShjdWVUaW1lLCAxLCBmcG9zIC0gbVNlZ21lbnREYXRhU3RhcnQpOworICAgIG1DdWVzLnB1c2hfYmFjayhjdWVQb2ludCk7Cit9CisKK3N0YXR1c190IFdlYm1GcmFtZVNpbmtUaHJlYWQ6OnN0YXJ0KCkgeworICAgIG1Eb25lID0gZmFsc2U7CisgICAgcmV0dXJuIFdlYm1GcmFtZVRocmVhZDo6c3RhcnQoKTsKK30KKworc3RhdHVzX3QgV2VibUZyYW1lU2lua1RocmVhZDo6c3RvcCgpIHsKKyAgICBtRG9uZSA9IHRydWU7CisgICAgbVZpZGVvRnJhbWVzLnB1c2goV2VibUZyYW1lOjpFT1MpOworICAgIG1BdWRpb0ZyYW1lcy5wdXNoKFdlYm1GcmFtZTo6RU9TKTsKKyAgICByZXR1cm4gV2VibUZyYW1lVGhyZWFkOjpzdG9wKCk7Cit9CisKK3ZvaWQgV2VibUZyYW1lU2lua1RocmVhZDo6cnVuKCkgeworICAgIGludCBudW1WaWRlb0tleUZyYW1lcyA9IDA7CisgICAgTGlzdDxjb25zdCBzcDxXZWJtRnJhbWU+ID4gb3V0c3RhbmRpbmdGcmFtZXM7CisgICAgd2hpbGUgKCFtRG9uZSkgeworICAgICAgICBBTE9HVigid2FpdCB2IGZyYW1lIik7CisgICAgICAgIGNvbnN0IHNwPFdlYm1GcmFtZT4gdmlkZW9GcmFtZSA9IG1WaWRlb0ZyYW1lcy5wZWVrKCk7CisgICAgICAgIEFMT0dWKCJ2IGZyYW1lOiAlcCIsIHZpZGVvRnJhbWUuZ2V0KCkpOworCisgICAgICAgIEFMT0dWKCJ3YWl0IGEgZnJhbWUiKTsKKyAgICAgICAgY29uc3Qgc3A8V2VibUZyYW1lPiBhdWRpb0ZyYW1lID0gbUF1ZGlvRnJhbWVzLnBlZWsoKTsKKyAgICAgICAgQUxPR1YoImEgZnJhbWU6ICVwIiwgYXVkaW9GcmFtZS5nZXQoKSk7CisKKyAgICAgICAgaWYgKHZpZGVvRnJhbWUtPm1Fb3MgJiYgYXVkaW9GcmFtZS0+bUVvcykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmF1ZGlvRnJhbWUgPCAqdmlkZW9GcmFtZSkgeworICAgICAgICAgICAgQUxPR1YoInRha2UgYSBmcmFtZSIpOworICAgICAgICAgICAgbUF1ZGlvRnJhbWVzLnRha2UoKTsKKyAgICAgICAgICAgIG91dHN0YW5kaW5nRnJhbWVzLnB1c2hfYmFjayhhdWRpb0ZyYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJ0YWtlIHYgZnJhbWUiKTsKKyAgICAgICAgICAgIG1WaWRlb0ZyYW1lcy50YWtlKCk7CisgICAgICAgICAgICBvdXRzdGFuZGluZ0ZyYW1lcy5wdXNoX2JhY2sodmlkZW9GcmFtZSk7CisgICAgICAgICAgICBpZiAodmlkZW9GcmFtZS0+bUtleSkKKyAgICAgICAgICAgICAgICBudW1WaWRlb0tleUZyYW1lcysrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bVZpZGVvS2V5RnJhbWVzID09IDIpIHsKKyAgICAgICAgICAgIGZsdXNoRnJhbWVzKG91dHN0YW5kaW5nRnJhbWVzLCAvKiBsYXN0ID0gKi8gZmFsc2UpOworICAgICAgICAgICAgbnVtVmlkZW9LZXlGcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiZmx1c2hpbmcgbGFzdCBjbHVzdGVyIChzaXplICV6dSkiLCBvdXRzdGFuZGluZ0ZyYW1lcy5zaXplKCkpOworICAgIGZsdXNoRnJhbWVzKG91dHN0YW5kaW5nRnJhbWVzLCAvKiBsYXN0ID0gKi8gdHJ1ZSk7CisgICAgbURvbmUgPSB0cnVlOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGNvbnN0IGludDY0X3Qga0luaXRpYWxEZWxheVRpbWVVcyA9IDcwMDAwMExMOworCit2b2lkIFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOjpjbGVhckZsYWdzKCkgeworICAgIG1Eb25lID0gZmFsc2U7CisgICAgbVBhdXNlZCA9IGZhbHNlOworICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworfQorCitXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6V2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlLAorICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIHNpbmssCisgICAgICAgIHVpbnQ2NF90IHRpbWVDb2RlU2NhbGUsCisgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lUmVhbFVzLAorICAgICAgICBpbnQzMl90IHN0YXJ0VGltZU9mZnNldE1zLAorICAgICAgICBpbnQgbnVtVHJhY2tzLAorICAgICAgICBib29sIHJlYWxUaW1lUmVjb3JkaW5nKQorICAgIDogV2VibUZyYW1lU291cmNlVGhyZWFkKHR5cGUsIHNpbmspLAorICAgICAgbVNvdXJjZShzb3VyY2UpLAorICAgICAgbVRpbWVDb2RlU2NhbGUodGltZUNvZGVTY2FsZSksCisgICAgICBtVHJhY2tEdXJhdGlvblVzKDApIHsKKyAgICBjbGVhckZsYWdzKCk7CisgICAgbVN0YXJ0VGltZVVzID0gc3RhcnRUaW1lUmVhbFVzOworICAgIGlmIChyZWFsVGltZVJlY29yZGluZyAmJiBudW1UcmFja3MgPiAxKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIENvcGllZCBmcm9tIE1QRUc0V3JpdGVyCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgZXh0cmEgZGVsYXkgb2YgYWNjZXB0aW5nIGluY29taW5nIGF1ZGlvL3ZpZGVvIHNpZ25hbHMKKyAgICAgICAgICogaGVscHMgdG8gYWxpZ24gYS92IHN0YXJ0IHRpbWUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHJlY29yZGluZworICAgICAgICAgKiBzZXNzaW9uLCBhbmQgaXQgYWxzbyBoZWxwcyBlbGltaW5hdGUgdGhlICJyZWNvcmRpbmciIHNvdW5kIGZvcgorICAgICAgICAgKiBjYW1jb3JkZXIgYXBwbGljYXRpb25zLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBjbGllbnQgZG9lcyBub3Qgc2V0IHRoZSBzdGFydCB0aW1lIG9mZnNldCwgd2UgZmFsbCBiYWNrIHRvCisgICAgICAgICAqIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsIGRlbGF5IHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgaW50NjRfdCBzdGFydFRpbWVPZmZzZXRVcyA9IHN0YXJ0VGltZU9mZnNldE1zICogMTAwMExMOworICAgICAgICBpZiAoc3RhcnRUaW1lT2Zmc2V0VXMgPCAwKSB7ICAvLyBTdGFydCB0aW1lIG9mZnNldCB3YXMgbm90IHNldAorICAgICAgICAgICAgc3RhcnRUaW1lT2Zmc2V0VXMgPSBrSW5pdGlhbERlbGF5VGltZVVzOworICAgICAgICB9CisgICAgICAgIG1TdGFydFRpbWVVcyArPSBzdGFydFRpbWVPZmZzZXRVczsKKyAgICAgICAgQUxPR0koIlN0YXJ0IHRpbWUgb2Zmc2V0OiAlIiBQUklkNjQgIiB1cyIsIHN0YXJ0VGltZU9mZnNldFVzKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOjpzdGFydCgpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBtZXRhLT5zZXRJbnQ2NChrS2V5VGltZSwgbVN0YXJ0VGltZVVzKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydChtZXRhLmdldCgpKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1Eb25lID0gdHJ1ZTsKKyAgICAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFdlYm1GcmFtZVRocmVhZDo6c3RhcnQoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOjpyZXN1bWUoKSB7CisgICAgaWYgKCFtRG9uZSAmJiBtUGF1c2VkKSB7CisgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgbVJlc3VtZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOjpwYXVzZSgpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OnN0b3AoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgIG1Eb25lID0gdHJ1ZTsKKyAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICByZXR1cm4gV2VibUZyYW1lVGhyZWFkOjpzdG9wKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6cnVuKCkgeworICAgIGludDMyX3QgY291bnQgPSAwOworICAgIGludDY0X3QgdGltZXN0YW1wVXMgPSAweGRlYWRiZWVmOworICAgIGludDY0X3QgbGFzdFRpbWVzdGFtcFVzID0gMDsgLy8gUHJldmlvdXMgc2FtcGxlIHRpbWUgc3RhbXAKKyAgICBpbnQ2NF90IGxhc3REdXJhdGlvblVzID0gMDsgLy8gUHJldmlvdXMgc2FtcGxlIGR1cmF0aW9uCisgICAgaW50NjRfdCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgPSAwOworCisgICAgY29uc3QgdWludDY0X3Qga1VuaW5pdGlhbGl6ZWQgPSAweGZmZmZmZmZmZmZmZmZmZmZMOworICAgIG1TdGFydFRpbWVVcyA9IGtVbmluaXRpYWxpemVkOworCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICB3aGlsZSAoIW1Eb25lICYmIChlcnIgPSBtU291cmNlLT5yZWFkKCZidWZmZXIsIE5VTEwpKSA9PSBPSykgeworICAgICAgICBpZiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPE1ldGFEYXRhPiBtZCA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgIENIRUNLKG1kLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXBVcykpOworICAgICAgICBpZiAobVN0YXJ0VGltZVVzID09IGtVbmluaXRpYWxpemVkKSB7CisgICAgICAgICAgICBtU3RhcnRUaW1lVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgfQorICAgICAgICB0aW1lc3RhbXBVcyAtPSBtU3RhcnRUaW1lVXM7CisKKyAgICAgICAgaWYgKG1QYXVzZWQgJiYgIW1SZXN1bWVkKSB7CisgICAgICAgICAgICBsYXN0RHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzIC0gbGFzdFRpbWVzdGFtcFVzOworICAgICAgICAgICAgbGFzdFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICArK2NvdW50OworCisgICAgICAgIC8vIGFkanVzdCB0aW1lLXN0YW1wcyBhZnRlciBwYXVzZS9yZXN1bWUKKyAgICAgICAgaWYgKG1SZXN1bWVkKSB7CisgICAgICAgICAgICBpbnQ2NF90IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA9IHRpbWVzdGFtcFVzIC0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOworICAgICAgICAgICAgQ0hFQ0tfR0UoZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzLCAwbGwpOworICAgICAgICAgICAgaW50NjRfdCBwYXVzZWREdXJhdGlvblVzID0gZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzIC0gbVRyYWNrRHVyYXRpb25VczsKKyAgICAgICAgICAgIENIRUNLX0dFKHBhdXNlZER1cmF0aW9uVXMsIGxhc3REdXJhdGlvblVzKTsKKyAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyArPSBwYXVzZWREdXJhdGlvblVzIC0gbGFzdER1cmF0aW9uVXM7CisgICAgICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcFVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKKyAgICAgICAgQ0hFQ0tfR0UodGltZXN0YW1wVXMsIDBsbCk7CisKKyAgICAgICAgaW50MzJfdCBpc1N5bmMgPSBmYWxzZTsKKyAgICAgICAgbWQtPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpc1N5bmMpOworICAgICAgICBjb25zdCBzcDxXZWJtRnJhbWU+IGYgPSBuZXcgV2VibUZyYW1lKAorICAgICAgICAgICAgbVR5cGUsCisgICAgICAgICAgICBpc1N5bmMsCisgICAgICAgICAgICB0aW1lc3RhbXBVcyAqIDEwMDAgLyBtVGltZUNvZGVTY2FsZSwKKyAgICAgICAgICAgIGJ1ZmZlcik7CisgICAgICAgIG1TaW5rLnB1c2goZik7CisKKyAgICAgICAgQUxPR1YoCisgICAgICAgICAgICAiJXMgJXMgZnJhbWUgYXQgJSIgUFJJZDY0ICIgc2l6ZSAlenVcbiIsCisgICAgICAgICAgICBtVHlwZSA9PSBrVmlkZW9UeXBlID8gInZpZGVvIiA6ICJhdWRpbyIsCisgICAgICAgICAgICBpc1N5bmMgPyAiSSIgOiAiUCIsCisgICAgICAgICAgICB0aW1lc3RhbXBVcyAqIDEwMDAgLyBtVGltZUNvZGVTY2FsZSwKKyAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworCisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBidWZmZXIgPSBOVUxMOworCisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1UcmFja0R1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1UcmFja0R1cmF0aW9uVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgfQorICAgICAgICBsYXN0RHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzIC0gbGFzdFRpbWVzdGFtcFVzOworICAgICAgICBsYXN0VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICB9CisKKyAgICBtVHJhY2tEdXJhdGlvblVzICs9IGxhc3REdXJhdGlvblVzOworICAgIG1TaW5rLnB1c2goV2VibUZyYW1lOjpFT1MpOworfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1ZDliNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmgKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFdFQk1GUkFNRVRIUkVBRF9IXworI2RlZmluZSBXRUJNRlJBTUVUSFJFQURfSF8KKworI2luY2x1ZGUgIldlYm1GcmFtZS5oIgorI2luY2x1ZGUgIkxpbmtlZEJsb2NraW5nUXVldWUuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorCisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFdlYm1GcmFtZVRocmVhZCA6IHB1YmxpYyBMaWdodFJlZkJhc2U8V2VibUZyYW1lVGhyZWFkPiB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIHJ1bigpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgcnVubmluZygpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKSB7IHJldHVybiBPSzsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCkgeyByZXR1cm4gT0s7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIH5XZWJtRnJhbWVUaHJlYWQoKSB7IHN0b3AoKTsgfQorICAgIHN0YXRpYyB2b2lkICp3cmFwKHZvaWQgKmFyZyk7CisKK3Byb3RlY3RlZDoKKyAgICBXZWJtRnJhbWVUaHJlYWQoKQorICAgICAgICA6IG1UaHJlYWQoMCkgeworICAgIH0KKworcHJpdmF0ZToKKyAgICBwdGhyZWFkX3QgbVRocmVhZDsKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXZWJtRnJhbWVUaHJlYWQpOworfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFdlYm1GcmFtZVNvdXJjZVRocmVhZDsKK2NsYXNzIFdlYm1GcmFtZVNpbmtUaHJlYWQgOiBwdWJsaWMgV2VibUZyYW1lVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBXZWJtRnJhbWVTaW5rVGhyZWFkKAorICAgICAgICAgICAgY29uc3QgaW50JiBmZCwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90JiBvZmYsCisgICAgICAgICAgICBzcDxXZWJtRnJhbWVTb3VyY2VUaHJlYWQ+IHZpZGVvVGhyZWFkLAorICAgICAgICAgICAgc3A8V2VibUZyYW1lU291cmNlVGhyZWFkPiBhdWRpb1RocmVhZCwKKyAgICAgICAgICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGN1ZXMpOworCisgICAgV2VibUZyYW1lU2lua1RocmVhZCgKKyAgICAgICAgICAgIGNvbnN0IGludCYgZmQsCisgICAgICAgICAgICBjb25zdCB1aW50NjRfdCYgb2ZmLAorICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIHZpZGVvU291cmNlLAorICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIGF1ZGlvU291cmNlLAorICAgICAgICAgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY3Vlcyk7CisKKyAgICB2b2lkIHJ1bigpOworICAgIGJvb2wgcnVubmluZygpIHsKKyAgICAgICAgcmV0dXJuICFtRG9uZTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICBzdGF0dXNfdCBzdG9wKCk7CisKK3ByaXZhdGU6CisgICAgY29uc3QgaW50JiBtRmQ7CisgICAgY29uc3QgdWludDY0X3QmIG1TZWdtZW50RGF0YVN0YXJ0OworICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBtVmlkZW9GcmFtZXM7CisgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIG1BdWRpb0ZyYW1lczsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBtQ3VlczsKKworICAgIHZvbGF0aWxlIGJvb2wgbURvbmU7CisKKyAgICBzdGF0aWMgdm9pZCBpbml0Q2x1c3RlcigKKyAgICAgICAgICAgIExpc3Q8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBmcmFtZXMsCisgICAgICAgICAgICB1aW50NjRfdCYgY2x1c3RlclRpbWVjb2RlTCwKKyAgICAgICAgICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGNoaWxkcmVuKTsKKyAgICB2b2lkIHdyaXRlQ2x1c3RlcihMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjaGlsZHJlbik7CisgICAgdm9pZCBmbHVzaEZyYW1lcyhMaXN0PGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgZnJhbWVzLCBib29sIGxhc3QpOworfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFdlYm1GcmFtZVNvdXJjZVRocmVhZCA6IHB1YmxpYyBXZWJtRnJhbWVUaHJlYWQgeworcHVibGljOgorICAgIFdlYm1GcmFtZVNvdXJjZVRocmVhZChpbnQgdHlwZSwgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIHNpbmspOworICAgIHZpcnR1YWwgaW50NjRfdCBnZXREdXJhdGlvblVzKCkgPSAwOworcHJvdGVjdGVkOgorICAgIGNvbnN0IGludCBtVHlwZTsKKyAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgbVNpbms7CisKKyAgICBmcmllbmQgY2xhc3MgV2VibUZyYW1lU2lua1RocmVhZDsKK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBXZWJtRnJhbWVFbXB0eVNvdXJjZVRocmVhZCA6IHB1YmxpYyBXZWJtRnJhbWVTb3VyY2VUaHJlYWQgeworcHVibGljOgorICAgIFdlYm1GcmFtZUVtcHR5U291cmNlVGhyZWFkKGludCB0eXBlLCBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luaykKKyAgICAgICAgOiBXZWJtRnJhbWVTb3VyY2VUaHJlYWQodHlwZSwgc2luaykgeworICAgIH0KKyAgICB2b2lkIHJ1bigpIHsgbVNpbmsucHVzaChXZWJtRnJhbWU6OkVPUyk7IH0KKyAgICBpbnQ2NF90IGdldER1cmF0aW9uVXMoKSB7IHJldHVybiAwOyB9Cit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6IHB1YmxpYyBXZWJtRnJhbWVTb3VyY2VUaHJlYWQgeworcHVibGljOgorICAgIFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBzaW5rLAorICAgICAgICAgICAgdWludDY0X3QgdGltZUNvZGVTY2FsZSwKKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lUmVhbFVzLAorICAgICAgICAgICAgaW50MzJfdCBzdGFydFRpbWVPZmZzZXRNcywKKyAgICAgICAgICAgIGludCBudW1QZWVycywKKyAgICAgICAgICAgIGJvb2wgcmVhbFRpbWVSZWNvcmRpbmcpOworCisgICAgdm9pZCBydW4oKTsKKyAgICBzdGF0dXNfdCBzdGFydCgpOworICAgIHN0YXR1c190IHJlc3VtZSgpOworICAgIHN0YXR1c190IHBhdXNlKCk7CisgICAgc3RhdHVzX3Qgc3RvcCgpOworICAgIGludDY0X3QgZ2V0RHVyYXRpb25VcygpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFja0R1cmF0aW9uVXM7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIGNvbnN0IHVpbnQ2NF90IG1UaW1lQ29kZVNjYWxlOworICAgIHVpbnQ2NF90IG1TdGFydFRpbWVVczsKKworICAgIHZvbGF0aWxlIGJvb2wgbURvbmU7CisgICAgdm9sYXRpbGUgYm9vbCBtUGF1c2VkOworICAgIHZvbGF0aWxlIGJvb2wgbVJlc3VtZWQ7CisgICAgdm9sYXRpbGUgYm9vbCBtU3RhcnRlZDsKKyAgICB2b2xhdGlsZSBib29sIG1SZWFjaGVkRU9TOworICAgIGludDY0X3QgbVRyYWNrRHVyYXRpb25VczsKKworICAgIHZvaWQgY2xlYXJGbGFncygpOworfTsKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KKworI2VuZGlmIC8qIFdFQk1GUkFNRVRIUkVBRF9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNjZjkyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKQEAgLTAsMCArMSw1NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJXZWJtV3JpdGVyIgorCisjaW5jbHVkZSAiRWJtbFV0aWwuaCIKKyNpbmNsdWRlICJXZWJtV3JpdGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCit1c2luZyBuYW1lc3BhY2Ugd2VibTsKKworbmFtZXNwYWNlIHsKK3NpemVfdCBYaXBoTGFjZUNvZGVMZW4oc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gc2l6ZSAvIDB4ZmYgKyAxOworfQorCitzaXplX3QgWGlwaExhY2VFbmModWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkgeworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IHNpemUgPj0gMHhmZjsgKytpLCBzaXplIC09IDB4ZmYpIHsKKyAgICAgICAgYnVmW2ldID0gMHhmZjsKKyAgICB9CisgICAgYnVmW2krK10gPSBzaXplOworICAgIHJldHVybiBpOworfQorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5TdHJlYW1hYmxlRmlsZVNpemVJbkJ5dGVzID0gNSAqIDEwMjQgKiAxMDI0OworCitXZWJtV3JpdGVyOjpXZWJtV3JpdGVyKGludCBmZCkKKyAgICA6IG1GZChkdXAoZmQpKSwKKyAgICAgIG1Jbml0Q2hlY2sobUZkIDwgMCA/IE5PX0lOSVQgOiBPSyksCisgICAgICBtVGltZUNvZGVTY2FsZSgxMDAwMDAwKSwKKyAgICAgIG1TdGFydFRpbWVzdGFtcFVzKDApLAorICAgICAgbVN0YXJ0VGltZU9mZnNldE1zKDApLAorICAgICAgbVNlZ21lbnRPZmZzZXQoMCksCisgICAgICBtU2VnbWVudERhdGFTdGFydCgwKSwKKyAgICAgIG1JbmZvT2Zmc2V0KDApLAorICAgICAgbUluZm9TaXplKDApLAorICAgICAgbVRyYWNrc09mZnNldCgwKSwKKyAgICAgIG1DdWVzT2Zmc2V0KDApLAorICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZChmYWxzZSksCisgICAgICBtSXNSZWFsVGltZVJlY29yZGluZyhmYWxzZSksCisgICAgICBtU3RyZWFtYWJsZUZpbGUodHJ1ZSksCisgICAgICBtRXN0aW1hdGVkQ3Vlc1NpemUoMCkgeworICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XSA9IFdlYm1TdHJlYW0oa0F1ZGlvVHlwZSwgIkF1ZGlvIiwgJldlYm1Xcml0ZXI6OmF1ZGlvVHJhY2spOworICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XSA9IFdlYm1TdHJlYW0oa1ZpZGVvVHlwZSwgIlZpZGVvIiwgJldlYm1Xcml0ZXI6OnZpZGVvVHJhY2spOworICAgIG1TaW5rVGhyZWFkID0gbmV3IFdlYm1GcmFtZVNpbmtUaHJlYWQoCisgICAgICAgICAgICBtRmQsCisgICAgICAgICAgICBtU2VnbWVudERhdGFTdGFydCwKKyAgICAgICAgICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XS5tU2luaywKKyAgICAgICAgICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XS5tU2luaywKKyAgICAgICAgICAgIG1DdWVQb2ludHMpOworfQorCitXZWJtV3JpdGVyOjpXZWJtV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgIG1UaW1lQ29kZVNjYWxlKDEwMDAwMDApLAorICAgICAgbVN0YXJ0VGltZXN0YW1wVXMoMCksCisgICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMoMCksCisgICAgICBtU2VnbWVudE9mZnNldCgwKSwKKyAgICAgIG1TZWdtZW50RGF0YVN0YXJ0KDApLAorICAgICAgbUluZm9PZmZzZXQoMCksCisgICAgICBtSW5mb1NpemUoMCksCisgICAgICBtVHJhY2tzT2Zmc2V0KDApLAorICAgICAgbUN1ZXNPZmZzZXQoMCksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkKGZhbHNlKSwKKyAgICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nKGZhbHNlKSwKKyAgICAgIG1TdHJlYW1hYmxlRmlsZSh0cnVlKSwKKyAgICAgIG1Fc3RpbWF0ZWRDdWVzU2l6ZSgwKSB7CisgICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICBBTE9HVigiZmQgJWQ7IGZsYWdzOiAlbyIsIG1GZCwgZmNudGwobUZkLCBGX0dFVEZMLCAwKSk7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICB9CisgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdID0gV2VibVN0cmVhbShrQXVkaW9UeXBlLCAiQXVkaW8iLCAmV2VibVdyaXRlcjo6YXVkaW9UcmFjayk7CisgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdID0gV2VibVN0cmVhbShrVmlkZW9UeXBlLCAiVmlkZW8iLCAmV2VibVdyaXRlcjo6dmlkZW9UcmFjayk7CisgICAgbVNpbmtUaHJlYWQgPSBuZXcgV2VibUZyYW1lU2lua1RocmVhZCgKKyAgICAgICAgICAgIG1GZCwKKyAgICAgICAgICAgIG1TZWdtZW50RGF0YVN0YXJ0LAorICAgICAgICAgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdLm1TaW5rLAorICAgICAgICAgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1TaW5rLAorICAgICAgICAgICAgbUN1ZVBvaW50cyk7Cit9CisKKy8vIHN0YXRpYworc3A8V2VibUVsZW1lbnQ+IFdlYm1Xcml0ZXI6OnZpZGVvVHJhY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZCkgeworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBDSEVDSyhtZC0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgQ0hFQ0sobWQtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CisgICAgcmV0dXJuIFdlYm1FbGVtZW50OjpWaWRlb1RyYWNrRW50cnkod2lkdGgsIGhlaWdodCk7Cit9CisKKy8vIHN0YXRpYworc3A8V2VibUVsZW1lbnQ+IFdlYm1Xcml0ZXI6OmF1ZGlvVHJhY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZCkgeworICAgIGludDMyX3QgbkNoYW5uZWxzLCBzYW1wbGVyYXRlOworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTE7CisgICAgY29uc3QgY2hhciBoZWFkZXJEYXRhMltdID0geyAzLCAndicsICdvJywgJ3InLCAnYicsICdpJywgJ3MnLCA3LCAwLCAwLCAwLAorICAgICAgICAgICAgJ2EnLCAnbicsICdkJywgJ3InLCAnbycsICdpJywgJ2QnLCAwLCAwLCAwLCAwLCAxIH07CisgICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTM7CisgICAgc2l6ZV90IGhlYWRlclNpemUxLCBoZWFkZXJTaXplMiA9IHNpemVvZihoZWFkZXJEYXRhMiksIGhlYWRlclNpemUzOworCisgICAgQ0hFQ0sobWQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbkNoYW5uZWxzKSk7CisgICAgQ0hFQ0sobWQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZXJhdGUpKTsKKyAgICBDSEVDSyhtZC0+ZmluZERhdGEoa0tleVZvcmJpc0luZm8sICZ0eXBlLCAmaGVhZGVyRGF0YTEsICZoZWFkZXJTaXplMSkpOworICAgIENIRUNLKG1kLT5maW5kRGF0YShrS2V5Vm9yYmlzQm9va3MsICZ0eXBlLCAmaGVhZGVyRGF0YTMsICZoZWFkZXJTaXplMykpOworCisgICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUgPSAxOworICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUxKTsKKyAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMik7CisgICAgY29kZWNQcml2YXRlU2l6ZSArPSBoZWFkZXJTaXplMSArIGhlYWRlclNpemUyICsgaGVhZGVyU2l6ZTM7CisKKyAgICBvZmZfdCBvZmYgPSAwOworICAgIHNwPEFCdWZmZXI+IGNvZGVjUHJpdmF0ZUJ1ZiA9IG5ldyBBQnVmZmVyKGNvZGVjUHJpdmF0ZVNpemUpOworICAgIHVpbnQ4X3QgKmNvZGVjUHJpdmF0ZURhdGEgPSBjb2RlY1ByaXZhdGVCdWYtPmRhdGEoKTsKKyAgICBjb2RlY1ByaXZhdGVEYXRhW29mZisrXSA9IDI7CisKKyAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTEpOworICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMik7CisKKyAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTEsIGhlYWRlclNpemUxKTsKKyAgICBvZmYgKz0gaGVhZGVyU2l6ZTE7CisgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEyLCBoZWFkZXJTaXplMik7CisgICAgb2ZmICs9IGhlYWRlclNpemUyOworICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMywgaGVhZGVyU2l6ZTMpOworCisgICAgc3A8V2VibUVsZW1lbnQ+IGVudHJ5ID0gV2VibUVsZW1lbnQ6OkF1ZGlvVHJhY2tFbnRyeSgKKyAgICAgICAgICAgIG5DaGFubmVscywKKyAgICAgICAgICAgIHNhbXBsZXJhdGUsCisgICAgICAgICAgICBjb2RlY1ByaXZhdGVCdWYpOworICAgIHJldHVybiBlbnRyeTsKK30KKworc2l6ZV90IFdlYm1Xcml0ZXI6Om51bVRyYWNrcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworCisgICAgc2l6ZV90IG51bVRyYWNrcyA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIGlmIChtU3RyZWFtc1tpXS5tVHJhY2tFbnRyeSAhPSBOVUxMKSB7CisgICAgICAgICAgICBudW1UcmFja3MrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudW1UcmFja3M7Cit9CisKK3VpbnQ2NF90IFdlYm1Xcml0ZXI6OmVzdGltYXRlQ3Vlc1NpemUoaW50MzJfdCBiaXRSYXRlKSB7CisgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBlc3RpbWF0ZU1vb3ZCb3hTaXplIGluIE1QRUc0V3JpdGVyLgorICAgIC8vCisgICAgLy8gU3RhdGlzdGljYWwgYW5hbHlzaXMgc2hvd3MgdGhhdCBtZXRhZGF0YSB1c3VhbGx5IGFjY291bnRzCisgICAgLy8gZm9yIGEgc21hbGwgcG9ydGlvbiBvZiB0aGUgdG90YWwgZmlsZSBzaXplLCB1c3VhbGx5IDwgMC42JS4KKworICAgIC8vIFRoZSBkZWZhdWx0IE1JTl9NT09WX0JPWF9TSVpFIGlzIHNldCB0byAwLjYlIHggMU1CIC8gMiwKKyAgICAvLyB3aGVyZSAxTUIgaXMgdGhlIGNvbW1vbiBmaWxlIHNpemUgbGltaXQgZm9yIE1NUyBhcHBsaWNhdGlvbi4KKyAgICAvLyBUaGUgZGVmYXVsdCBNQVggX01PT1ZfQk9YX1NJWkUgdmFsdWUgaXMgYmFzZWQgb24gYWJvdXQgMworICAgIC8vIG1pbnV0ZSB2aWRlbyByZWNvcmRpbmcgd2l0aCBhIGJpdCByYXRlIGFib3V0IDMgTWJwcywgYmVjYXVzZQorICAgIC8vIHN0YXRpc3RpY3MgYWxzbyBzaG93IHRoYXQgbW9zdCBvZiB0aGUgdmlkZW8gY2FwdHVyZWQgYXJlIGdvaW5nCisgICAgLy8gdG8gYmUgbGVzcyB0aGFuIDMgbWludXRlcy4KKworICAgIC8vIElmIHRoZSBlc3RpbWF0aW9uIGlzIHdyb25nLCB3ZSB3aWxsIHBheSB0aGUgcHJpY2Ugb2Ygd2FzdGluZworICAgIC8vIHNvbWUgcmVzZXJ2ZWQgc3BhY2UuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gc28gb2Z0ZW4gc3RhdGlzdGljYWxseS4KKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBmYWN0b3IgPSAyOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE1JTl9DVUVTX1NJWkUgPSAzICogMTAyNDsgIC8vIDMgS0IKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBNQVhfQ1VFU19TSVpFID0gKDE4MCAqIDMwMDAwMDAgKiA2TEwgLyA4MDAwKTsKKyAgICBpbnQ2NF90IHNpemUgPSBNSU5fQ1VFU19TSVpFOworCisgICAgLy8gTWF4IGZpbGUgc2l6ZSBsaW1pdCBpcyBzZXQKKyAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyAhPSAwICYmIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkKSB7CisgICAgICAgIHNpemUgPSBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzICogNiAvIDEwMDA7CisgICAgfQorCisgICAgLy8gTWF4IGZpbGUgZHVyYXRpb24gbGltaXQgaXMgc2V0CisgICAgaWYgKG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzICE9IDApIHsKKyAgICAgICAgaWYgKGJpdFJhdGUgPiAwKSB7CisgICAgICAgICAgICBpbnQ2NF90IHNpemUyID0gKChtTWF4RmlsZUR1cmF0aW9uTGltaXRVcyAqIGJpdFJhdGUgKiA2KSAvIDEwMDAgLyA4MDAwMDAwKTsKKyAgICAgICAgICAgIGlmIChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzICE9IDAgJiYgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBXaGVuIGJvdGggZmlsZSBzaXplIGFuZCBkdXJhdGlvbiBsaW1pdHMgYXJlIHNldCwKKyAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgdGhlIHNtYWxsZXIgbGltaXQgb2YgdGhlIHR3by4KKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IHNpemUyKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzaXplMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE9ubHkgbWF4IGZpbGUgZHVyYXRpb24gbGltaXQgaXMgc2V0CisgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNpemUgPCBNSU5fQ1VFU19TSVpFKSB7CisgICAgICAgIHNpemUgPSBNSU5fQ1VFU19TSVpFOworICAgIH0KKworICAgIC8vIEFueSBsb25nIGR1cmF0aW9uIHJlY29yZGluZyB3aWxsIGJlIHByb2JhYmx5IGVuZCB1cCB3aXRoCisgICAgLy8gbm9uLXN0cmVhbWFibGUgd2VibSBmaWxlLgorICAgIGlmIChzaXplID4gTUFYX0NVRVNfU0laRSkgeworICAgICAgICBzaXplID0gTUFYX0NVRVNfU0laRTsKKyAgICB9CisKKyAgICBBTE9HVigibGltaXRzOiAlIiBQUklkNjQgIi8lIiBQUklkNjQgIiBieXRlcy91cywiCisgICAgICAgICAgICAiIGJpdCByYXRlOiAlZCBicHMgYW5kIHRoZSBlc3RpbWF0ZWQgY3VlcyBzaXplICUiIFBSSWQ2NCAiIGJ5dGVzIiwKKyAgICAgICAgICAgIG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMsIG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzLCBiaXRSYXRlLCBzaXplKTsKKyAgICByZXR1cm4gZmFjdG9yICogc2l6ZTsKK30KKwordm9pZCBXZWJtV3JpdGVyOjppbml0U3RyZWFtKHNpemVfdCBpZHgpIHsKKyAgICBpZiAobVN0cmVhbXNbaWR4XS5tVGhyZWFkICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobVN0cmVhbXNbaWR4XS5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImFkZGluZyBkdW1teSBzb3VyY2UgLi4uICIpOworICAgICAgICBtU3RyZWFtc1tpZHhdLm1UaHJlYWQgPSBuZXcgV2VibUZyYW1lRW1wdHlTb3VyY2VUaHJlYWQoCisgICAgICAgICAgICAgICAgbVN0cmVhbXNbaWR4XS5tVHlwZSwgbVN0cmVhbXNbaWR4XS5tU2luayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoImFkZGluZyBzb3VyY2UgJXAiLCBtU3RyZWFtc1tpZHhdLm1Tb3VyY2UuZ2V0KCkpOworICAgICAgICBtU3RyZWFtc1tpZHhdLm1UaHJlYWQgPSBuZXcgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQoCisgICAgICAgICAgICAgICAgbVN0cmVhbXNbaWR4XS5tU291cmNlLAorICAgICAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVR5cGUsCisgICAgICAgICAgICAgICAgbVN0cmVhbXNbaWR4XS5tU2luaywKKyAgICAgICAgICAgICAgICBtVGltZUNvZGVTY2FsZSwKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMsCisgICAgICAgICAgICAgICAgbnVtVHJhY2tzKCksCisgICAgICAgICAgICAgICAgbUlzUmVhbFRpbWVSZWNvcmRpbmcpOworICAgIH0KK30KKwordm9pZCBXZWJtV3JpdGVyOjpyZWxlYXNlKCkgeworICAgIGNsb3NlKG1GZCk7CisgICAgbUZkID0gLTE7CisgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKK30KKworc3RhdHVzX3QgV2VibVdyaXRlcjo6cmVzZXQoKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIHJlbGVhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGludDY0X3QgbWF4RHVyYXRpb25VcyA9IDA7CisgICAgaW50NjRfdCBtaW5EdXJhdGlvblVzID0gMHg3ZmZmZmZmZmZmZmZmZmZmTEw7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIGlmIChtU3RyZWFtc1tpXS5tVGhyZWFkID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbXNbaV0ubVRocmVhZC0+c3RvcCgpOworICAgICAgICBpZiAoZXJyID09IE9LICYmIHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gbVN0cmVhbXNbaV0ubVRocmVhZC0+Z2V0RHVyYXRpb25VcygpOworICAgICAgICBpZiAoZHVyYXRpb25VcyA+IG1heER1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1heER1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworICAgICAgICB9CisgICAgICAgIGlmIChkdXJhdGlvblVzIDwgbWluRHVyYXRpb25VcykgeworICAgICAgICAgICAgbWluRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobnVtVHJhY2tzKCkgPiAxKSB7CisgICAgICAgIEFMT0dEKCJEdXJhdGlvbiBmcm9tIHRyYWNrcyByYW5nZSBpcyBbJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiXSB1cyIsIG1pbkR1cmF0aW9uVXMsIG1heER1cmF0aW9uVXMpOworICAgIH0KKworICAgIG1TaW5rVGhyZWFkLT5zdG9wKCk7CisKKyAgICAvLyBEbyBub3Qgd3JpdGUgb3V0IG1vdmllIGhlYWRlciBvbiBlcnJvci4KKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzcDxXZWJtRWxlbWVudD4gY3VlcyA9IG5ldyBXZWJtTWFzdGVyKGtNa3ZDdWVzLCBtQ3VlUG9pbnRzKTsKKyAgICB1aW50NjRfdCBjdWVzU2l6ZSA9IGN1ZXMtPnRvdGFsU2l6ZSgpOworICAgIC8vIFRSSUNLWSBFdmVuIHdoZW4gdGhlIGN1ZXMgZG8gZml0IGluIHRoZSBzcGFjZSB3ZSByZXNlcnZlZCwgaWYgdGhleSBkbyBub3QgZml0CisgICAgLy8gcGVyZmVjdGx5LCB3ZSBzdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCAiZXh0cmEgc3BhY2UiIHRvIHdyaXRlIGFuCisgICAgLy8gRUJNTCB2b2lkIGVsZW1lbnQuCisgICAgaWYgKGN1ZXNTaXplICE9IG1Fc3RpbWF0ZWRDdWVzU2l6ZSAmJiBjdWVzU2l6ZSA+IG1Fc3RpbWF0ZWRDdWVzU2l6ZSAtIGtNaW5FYm1sVm9pZFNpemUpIHsKKyAgICAgICAgbUN1ZXNPZmZzZXQgPSA6OmxzZWVrKG1GZCwgMCwgU0VFS19DVVIpOworICAgICAgICBjdWVzLT53cml0ZShtRmQsIGN1ZXNTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50NjRfdCBzcGFjZVNpemU7CisgICAgICAgIDo6bHNlZWsobUZkLCBtQ3Vlc09mZnNldCwgU0VFS19TRVQpOworICAgICAgICBjdWVzLT53cml0ZShtRmQsIGN1ZXNTaXplKTsKKyAgICAgICAgc3A8V2VibUVsZW1lbnQ+IHNwYWNlID0gbmV3IEVibWxWb2lkKG1Fc3RpbWF0ZWRDdWVzU2l6ZSAtIGN1ZXNTaXplKTsKKyAgICAgICAgc3BhY2UtPndyaXRlKG1GZCwgc3BhY2VTaXplKTsKKyAgICB9CisKKyAgICBtQ3VlUG9pbnRzLmNsZWFyKCk7CisgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdLm1TaW5rLmNsZWFyKCk7CisgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1TaW5rLmNsZWFyKCk7CisKKyAgICB1aW50OF90IGJhcnlbc2l6ZW9mKHVpbnQ2NF90KV07CisgICAgdWludDY0X3QgdG90YWxTaXplID0gOjpsc2VlayhtRmQsIDAsIFNFRUtfRU5EKTsKKyAgICB1aW50NjRfdCBzZWdtZW50U2l6ZSA9IHRvdGFsU2l6ZSAtIG1TZWdtZW50RGF0YVN0YXJ0OworICAgIDo6bHNlZWsobUZkLCBtU2VnbWVudE9mZnNldCArIHNpemVPZihrTWt2U2VnbWVudCksIFNFRUtfU0VUKTsKKyAgICB1aW50NjRfdCBzZWdtZW50U2l6ZUNvZGVkID0gZW5jb2RlVW5zaWduZWQoc2VnbWVudFNpemUsIHNpemVPZihrTWt2VW5rbm93bkxlbmd0aCkpOworICAgIHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQoc2VnbWVudFNpemVDb2RlZCwgYmFyeSk7CisgICAgOjp3cml0ZShtRmQsIGJhcnksIHNpemVPZihrTWt2VW5rbm93bkxlbmd0aCkpOworCisgICAgdWludDY0X3Qgc2l6ZTsKKyAgICB1aW50NjRfdCBkdXJhdGlvbk9mZnNldCA9IG1JbmZvT2Zmc2V0ICsgc2l6ZU9mKGtNa3ZJbmZvKSArIHNpemVPZihtSW5mb1NpemUpCisgICAgICAgICsgc2l6ZU9mKGtNa3ZTZWdtZW50RHVyYXRpb24pICsgc2l6ZU9mKHNpemVvZihkb3VibGUpKTsKKyAgICBzcDxXZWJtRWxlbWVudD4gZHVyYXRpb24gPSBuZXcgV2VibUZsb2F0KAorICAgICAgICAgICAga01rdlNlZ21lbnREdXJhdGlvbiwKKyAgICAgICAgICAgIChkb3VibGUpIChtYXhEdXJhdGlvblVzICogMTAwMCAvIG1UaW1lQ29kZVNjYWxlKSk7CisgICAgZHVyYXRpb24tPnNlcmlhbGl6ZVBheWxvYWQoYmFyeSk7CisgICAgOjpsc2VlayhtRmQsIGR1cmF0aW9uT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgOjp3cml0ZShtRmQsIGJhcnksIHNpemVvZihkb3VibGUpKTsKKworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gc2Vla0VudHJpZXM7CisgICAgc2Vla0VudHJpZXMucHVzaF9iYWNrKFdlYm1FbGVtZW50OjpTZWVrRW50cnkoa01rdkluZm8sIG1JbmZvT2Zmc2V0IC0gbVNlZ21lbnREYXRhU3RhcnQpKTsKKyAgICBzZWVrRW50cmllcy5wdXNoX2JhY2soV2VibUVsZW1lbnQ6OlNlZWtFbnRyeShrTWt2VHJhY2tzLCBtVHJhY2tzT2Zmc2V0IC0gbVNlZ21lbnREYXRhU3RhcnQpKTsKKyAgICBzZWVrRW50cmllcy5wdXNoX2JhY2soV2VibUVsZW1lbnQ6OlNlZWtFbnRyeShrTWt2Q3VlcywgbUN1ZXNPZmZzZXQgLSBtU2VnbWVudERhdGFTdGFydCkpOworICAgIHNwPFdlYm1FbGVtZW50PiBzZWVrSGVhZCA9IG5ldyBXZWJtTWFzdGVyKGtNa3ZTZWVrSGVhZCwgc2Vla0VudHJpZXMpOworCisgICAgdWludDY0X3QgbWV0YVNlZWtTaXplOworICAgIDo6bHNlZWsobUZkLCBtU2VnbWVudERhdGFTdGFydCwgU0VFS19TRVQpOworICAgIHNlZWtIZWFkLT53cml0ZShtRmQsIG1ldGFTZWVrU2l6ZSk7CisKKyAgICB1aW50NjRfdCBzcGFjZVNpemU7CisgICAgc3A8V2VibUVsZW1lbnQ+IHNwYWNlID0gbmV3IEVibWxWb2lkKGtNYXhNZXRhU2Vla1NpemUgLSBtZXRhU2Vla1NpemUpOworICAgIHNwYWNlLT53cml0ZShtRmQsIHNwYWNlU2l6ZSk7CisKKyAgICByZWxlYXNlKCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgV2VibVdyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBhZGQgc291cmNlIEFGVEVSIHJlY29yZGluZyBpcyBzdGFydGVkIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIEF0IG1vc3QgMiB0cmFja3MgY2FuIGJlIHN1cHBvcnRlZC4KKyAgICBpZiAobVN0cmVhbXNba1ZpZGVvSW5kZXhdLm1UcmFja0VudHJ5ICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1TdHJlYW1zW2tBdWRpb0luZGV4XS5tVHJhY2tFbnRyeSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJUb28gbWFueSB0cmFja3MgKDIpIHRvIGFkZCIpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgQ0hFQ0soc291cmNlICE9IE5VTEwpOworCisgICAgLy8gQSB0cmFjayBvZiB0eXBlIG90aGVyIHRoYW4gdmlkZW8gb3IgYXVkaW8gaXMgbm90IHN1cHBvcnRlZC4KKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIHNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIGNvbnN0IGNoYXIgKnZwOCA9IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKKyAgICBjb25zdCBjaGFyICp2b3JiaXMgPSBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVM7CisKKyAgICBzaXplX3Qgc3RyZWFtSW5kZXg7CisgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCB2cDgsIHN0cmxlbih2cDgpKSkgeworICAgICAgICBzdHJlYW1JbmRleCA9IGtWaWRlb0luZGV4OworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZvcmJpcywgc3RybGVuKHZvcmJpcykpKSB7CisgICAgICAgIHN0cmVhbUluZGV4ID0ga0F1ZGlvSW5kZXg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIlRyYWNrICglcykgb3RoZXIgdGhhbiAlcyBvciAlcyBpcyBub3Qgc3VwcG9ydGVkIiwgbWltZSwgdnA4LCB2b3JiaXMpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLy8gTm8gbW9yZSB0aGFuIG9uZSB2aWRlbyBvciBvbmUgYXVkaW8gdHJhY2sgaXMgc3VwcG9ydGVkLgorICAgIGlmIChtU3RyZWFtc1tzdHJlYW1JbmRleF0ubVRyYWNrRW50cnkgIT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXMgdHJhY2sgYWxyZWFkeSBleGlzdHMiLCBtU3RyZWFtc1tzdHJlYW1JbmRleF0ubU5hbWUpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdHJhY2sgb2YgZWl0aGVyIGF1ZGlvIG9yIHZpZGVvLgorICAgIC8vIEdvIGFoZWFkIHRvIGFkZCB0aGUgdHJhY2suCisgICAgbVN0cmVhbXNbc3RyZWFtSW5kZXhdLm1Tb3VyY2UgPSBzb3VyY2U7CisgICAgbVN0cmVhbXNbc3RyZWFtSW5kZXhdLm1UcmFja0VudHJ5ID0gbVN0cmVhbXNbc3RyZWFtSW5kZXhdLm1NYWtlVHJhY2soc291cmNlLT5nZXRGb3JtYXQoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFdlYm1Xcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbXNba1ZpZGVvSW5kZXhdLm1UcmFja0VudHJ5ID09IE5VTEwKKyAgICAgICAgICAgICYmIG1TdHJlYW1zW2tBdWRpb0luZGV4XS5tVHJhY2tFbnRyeSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJObyBzb3VyY2UgYWRkZWQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzICE9IDApIHsKKyAgICAgICAgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQgPSB0cnVlOworICAgIH0KKworICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgaW50MzJfdCBpc1JlYWxUaW1lUmVjb3JkaW5nOworICAgICAgICBwYXJhbXMtPmZpbmRJbnQzMihrS2V5UmVhbFRpbWVSZWNvcmRpbmcsICZpc1JlYWxUaW1lUmVjb3JkaW5nKTsKKyAgICAgICAgbUlzUmVhbFRpbWVSZWNvcmRpbmcgPSBpc1JlYWxUaW1lUmVjb3JkaW5nOworICAgIH0KKworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgICAgICAgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1UaHJlYWQtPnJlc3VtZSgpOworICAgICAgICAgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdLm1UaHJlYWQtPnJlc3VtZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAocGFyYW1zKSB7CisgICAgICAgIGludDMyX3QgdGNzbDsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKGtLZXlUaW1lU2NhbGUsICZ0Y3NsKSkgeworICAgICAgICAgICAgbVRpbWVDb2RlU2NhbGUgPSB0Y3NsOworICAgICAgICB9CisgICAgfQorICAgIENIRUNLX0dUKG1UaW1lQ29kZVNjYWxlLCAwKTsKKyAgICBBTE9HVigibW92aWUgdGltZSBzY2FsZTogJSIgUFJJdTY0LCBtVGltZUNvZGVTY2FsZSk7CisKKyAgICAvKgorICAgICAqIFdoZW4gdGhlIHJlcXVlc3RlZCBmaWxlIHNpemUgbGltaXQgaXMgc21hbGwsIHRoZSBwcmlvcml0eQorICAgICAqIGlzIHRvIG1lZXQgdGhlIGZpbGUgc2l6ZSBsaW1pdCByZXF1aXJlbWVudCwgcmF0aGVyIHRoYW4KKyAgICAgKiB0byBtYWtlIHRoZSBmaWxlIHN0cmVhbWFibGUuIG1TdHJlYW1hYmxlRmlsZSBkb2VzIG5vdCB0ZWxsCisgICAgICogd2hldGhlciB0aGUgYWN0dWFsIHJlY29yZGVkIGZpbGUgaXMgc3RyZWFtYWJsZSBvciBub3QuCisgICAgICovCisgICAgbVN0cmVhbWFibGVGaWxlID0gKCFtTWF4RmlsZVNpemVMaW1pdEJ5dGVzKQorICAgICAgICB8fCAobU1heEZpbGVTaXplTGltaXRCeXRlcyA+PSBrTWluU3RyZWFtYWJsZUZpbGVTaXplSW5CeXRlcyk7CisKKyAgICAvKgorICAgICAqIFdyaXRlIHZhcmlvdXMgbWV0YWRhdGEuCisgICAgICovCisgICAgc3A8V2VibUVsZW1lbnQ+IGVibWwsIHNlZ21lbnQsIGluZm8sIHNlZWtIZWFkLCB0cmFja3MsIGN1ZXM7CisgICAgZWJtbCA9IFdlYm1FbGVtZW50OjpFYm1sSGVhZGVyKCk7CisgICAgc2VnbWVudCA9IG5ldyBXZWJtTWFzdGVyKGtNa3ZTZWdtZW50KTsKKyAgICBzZWVrSGVhZCA9IG5ldyBFYm1sVm9pZChrTWF4TWV0YVNlZWtTaXplKTsKKyAgICBpbmZvID0gV2VibUVsZW1lbnQ6OlNlZ21lbnRJbmZvKG1UaW1lQ29kZVNjYWxlLCAwKTsKKworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gY2hpbGRyZW47CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIGlmIChtU3RyZWFtc1tpXS5tVHJhY2tFbnRyeSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjaGlsZHJlbi5wdXNoX2JhY2sobVN0cmVhbXNbaV0ubVRyYWNrRW50cnkpOworICAgICAgICB9CisgICAgfQorICAgIHRyYWNrcyA9IG5ldyBXZWJtTWFzdGVyKGtNa3ZUcmFja3MsIGNoaWxkcmVuKTsKKworICAgIGlmICghbVN0cmVhbWFibGVGaWxlKSB7CisgICAgICAgIGN1ZXMgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3QgYml0UmF0ZSA9IC0xOworICAgICAgICBpZiAocGFyYW1zKSB7CisgICAgICAgICAgICBwYXJhbXMtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdFJhdGUpOworICAgICAgICB9CisgICAgICAgIG1Fc3RpbWF0ZWRDdWVzU2l6ZSA9IGVzdGltYXRlQ3Vlc1NpemUoYml0UmF0ZSk7CisgICAgICAgIENIRUNLX0dFKG1Fc3RpbWF0ZWRDdWVzU2l6ZSwgOCk7CisgICAgICAgIGN1ZXMgPSBuZXcgRWJtbFZvaWQobUVzdGltYXRlZEN1ZXNTaXplKTsKKyAgICB9CisKKyAgICBzcDxXZWJtRWxlbWVudD4gZWxlbXNbXSA9IHsgZWJtbCwgc2VnbWVudCwgc2Vla0hlYWQsIGluZm8sIHRyYWNrcywgY3VlcyB9OworICAgIHNpemVfdCBuRWxlbXMgPSBzaXplb2YoZWxlbXMpIC8gc2l6ZW9mKGVsZW1zWzBdKTsKKyAgICB1aW50NjRfdCBvZmZzZXRzW25FbGVtc107CisgICAgdWludDY0X3Qgc2l6ZXNbbkVsZW1zXTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbkVsZW1zOyBpKyspIHsKKyAgICAgICAgV2VibUVsZW1lbnQgKmUgPSBlbGVtc1tpXS5nZXQoKTsKKyAgICAgICAgaWYgKCFlKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ2NF90IHNpemU7CisgICAgICAgIG9mZnNldHNbaV0gPSA6OmxzZWVrKG1GZCwgMCwgU0VFS19DVVIpOworICAgICAgICBzaXplc1tpXSA9IGUtPm1TaXplOworICAgICAgICBlLT53cml0ZShtRmQsIHNpemUpOworICAgIH0KKworICAgIG1TZWdtZW50T2Zmc2V0ID0gb2Zmc2V0c1sxXTsKKyAgICBtU2VnbWVudERhdGFTdGFydCA9IG9mZnNldHNbMl07CisgICAgbUluZm9PZmZzZXQgPSBvZmZzZXRzWzNdOworICAgIG1JbmZvU2l6ZSA9IHNpemVzWzNdOworICAgIG1UcmFja3NPZmZzZXQgPSBvZmZzZXRzWzRdOworICAgIG1DdWVzT2Zmc2V0ID0gb2Zmc2V0c1s1XTsKKworICAgIC8vIHN0YXJ0IHRocmVhZHMKKyAgICBpZiAocGFyYW1zKSB7CisgICAgICAgIHBhcmFtcy0+ZmluZEludDY0KGtLZXlUaW1lLCAmbVN0YXJ0VGltZXN0YW1wVXMpOworICAgIH0KKworICAgIGluaXRTdHJlYW0oa0F1ZGlvSW5kZXgpOworICAgIGluaXRTdHJlYW0oa1ZpZGVvSW5kZXgpOworCisgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1UaHJlYWQtPnN0YXJ0KCk7CisgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdLm1UaHJlYWQtPnN0YXJ0KCk7CisgICAgbVNpbmtUaHJlYWQtPnN0YXJ0KCk7CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXZWJtV3JpdGVyOjpwYXVzZSgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIG1QYXVzZWQgPSB0cnVlOworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBpZiAobVN0cmVhbXNbaV0ubVRocmVhZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtc1tpXS5tVGhyZWFkLT5wYXVzZSgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgV2VibVdyaXRlcjo6c3RvcCgpIHsKKyAgICByZXR1cm4gcmVzZXQoKTsKK30KKworYm9vbCBXZWJtV3JpdGVyOjpyZWFjaGVkRU9TKCkgeworICAgIHJldHVybiAhbVNpbmtUaHJlYWQtPnJ1bm5pbmcoKTsKK30KK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZiNjk2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBXRUJNV1JJVEVSX0hfCisjZGVmaW5lIFdFQk1XUklURVJfSF8KKworI2luY2x1ZGUgIldlYm1Db25zdGFudHMuaCIKKyNpbmNsdWRlICJXZWJtRnJhbWVUaHJlYWQuaCIKKyNpbmNsdWRlICJMaW5rZWRCbG9ja2luZ1F1ZXVlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit1c2luZyBuYW1lc3BhY2Ugd2VibTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBXZWJtV3JpdGVyIDogcHVibGljIE1lZGlhV3JpdGVyIHsKK3B1YmxpYzoKKyAgICBXZWJtV3JpdGVyKGludCBmZCk7CisgICAgV2VibVdyaXRlcihjb25zdCBjaGFyICpmaWxlbmFtZSk7CisgICAgfldlYm1Xcml0ZXIoKSB7IHJlc2V0KCk7IH0KKworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworICAgIHZpcnR1YWwgYm9vbCByZWFjaGVkRU9TKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U3RhcnRUaW1lT2Zmc2V0TXMoaW50IG1zKSB7IG1TdGFydFRpbWVPZmZzZXRNcyA9IG1zOyB9CisgICAgdmlydHVhbCBpbnQzMl90IGdldFN0YXJ0VGltZU9mZnNldE1zKCkgY29uc3QgeyByZXR1cm4gbVN0YXJ0VGltZU9mZnNldE1zOyB9CisKK3ByaXZhdGU6CisgICAgaW50IG1GZDsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgdWludDY0X3QgbVRpbWVDb2RlU2NhbGU7CisgICAgaW50NjRfdCBtU3RhcnRUaW1lc3RhbXBVczsKKyAgICBpbnQzMl90IG1TdGFydFRpbWVPZmZzZXRNczsKKworICAgIHVpbnQ2NF90IG1TZWdtZW50T2Zmc2V0OworICAgIHVpbnQ2NF90IG1TZWdtZW50RGF0YVN0YXJ0OworICAgIHVpbnQ2NF90IG1JbmZvT2Zmc2V0OworICAgIHVpbnQ2NF90IG1JbmZvU2l6ZTsKKyAgICB1aW50NjRfdCBtVHJhY2tzT2Zmc2V0OworICAgIHVpbnQ2NF90IG1DdWVzT2Zmc2V0OworCisgICAgYm9vbCBtUGF1c2VkOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZDsKKyAgICBib29sIG1Jc1JlYWxUaW1lUmVjb3JkaW5nOworICAgIGJvb2wgbVN0cmVhbWFibGVGaWxlOworICAgIHVpbnQ2NF90IG1Fc3RpbWF0ZWRDdWVzU2l6ZTsKKworICAgIE11dGV4IG1Mb2NrOworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gbUN1ZVBvaW50czsKKworICAgIGVudW0geworICAgICAgICBrQXVkaW9JbmRleCAgICAgPSAgMCwKKyAgICAgICAga1ZpZGVvSW5kZXggICAgID0gIDEsCisgICAgICAgIGtNYXhTdHJlYW1zICAgICA9ICAyLAorICAgIH07CisKKyAgICBzdHJ1Y3QgV2VibVN0cmVhbSB7CisgICAgICAgIGludCBtVHlwZTsKKyAgICAgICAgY29uc3QgY2hhciAqbU5hbWU7CisgICAgICAgIHNwPFdlYm1FbGVtZW50PiAoKm1NYWtlVHJhY2spKGNvbnN0IHNwPE1ldGFEYXRhPiYpOworCisgICAgICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgICAgICBzcDxXZWJtRWxlbWVudD4gbVRyYWNrRW50cnk7CisgICAgICAgIHNwPFdlYm1GcmFtZVNvdXJjZVRocmVhZD4gbVRocmVhZDsKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4gbVNpbms7CisKKyAgICAgICAgV2VibVN0cmVhbSgpCisgICAgICAgICAgICA6IG1UeXBlKGtJbnZhbGlkVHlwZSksCisgICAgICAgICAgICAgIG1OYW1lKCJJbnZhbGlkIiksCisgICAgICAgICAgICAgIG1NYWtlVHJhY2soTlVMTCkgeworICAgICAgICB9CisKKyAgICAgICAgV2VibVN0cmVhbShpbnQgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgc3A8V2VibUVsZW1lbnQ+ICgqbWFrZVRyYWNrKShjb25zdCBzcDxNZXRhRGF0YT4mKSkKKyAgICAgICAgICAgIDogbVR5cGUodHlwZSksCisgICAgICAgICAgICAgIG1OYW1lKG5hbWUpLAorICAgICAgICAgICAgICBtTWFrZVRyYWNrKG1ha2VUcmFjaykgeworICAgICAgICB9CisKKyAgICAgICAgV2VibVN0cmVhbSAmb3BlcmF0b3I9KGNvbnN0IFdlYm1TdHJlYW0gJm90aGVyKSB7CisgICAgICAgICAgICBtVHlwZSA9IG90aGVyLm1UeXBlOworICAgICAgICAgICAgbU5hbWUgPSBvdGhlci5tTmFtZTsKKyAgICAgICAgICAgIG1NYWtlVHJhY2sgPSBvdGhlci5tTWFrZVRyYWNrOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgfTsKKyAgICBXZWJtU3RyZWFtIG1TdHJlYW1zW2tNYXhTdHJlYW1zXTsKKworICAgIHNwPFdlYm1GcmFtZVNpbmtUaHJlYWQ+IG1TaW5rVGhyZWFkOworCisgICAgc2l6ZV90IG51bVRyYWNrcygpOworICAgIHVpbnQ2NF90IGVzdGltYXRlQ3Vlc1NpemUoaW50MzJfdCBiaXRSYXRlKTsKKyAgICB2b2lkIGluaXRTdHJlYW0oc2l6ZV90IGlkeCk7CisgICAgdm9pZCByZWxlYXNlKCk7CisgICAgc3RhdHVzX3QgcmVzZXQoKTsKKworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gdmlkZW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKTsKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IGF1ZGlvVHJhY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXZWJtV3JpdGVyKTsKK307CisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KKyNlbmRpZiAvKiBXRUJNV1JJVEVSX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUFNlbmRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUFNlbmRlci5jcHAKaW5kZXggMTg4N2I4Yi4uZTg4YTNiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQU2VuZGVyLmNwcApAQCAtNjg1LDkgKzY4NSw4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBSVFBTZW5kZXI6OnBhcnNlUmVjZWl2ZXJSZXBvcnQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAvLyBoZXhkdW1wKGRhdGEsIHNpemUpOwotCitzdGF0dXNfdCBSVFBTZW5kZXI6OnBhcnNlUmVjZWl2ZXJSZXBvcnQoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCAvKiBzaXplICovKSB7CiAgICAgZmxvYXQgZnJhY3Rpb25Mb3N0ID0gZGF0YVsxMl0gLyAyNTYuMGY7CiAKICAgICBBTE9HSSgibG9zdCAlLjJmICUlIG9mIHBhY2tldHMgZHVyaW5nIHJlcG9ydCBpbnRlcnZhbC4iLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuY3BwCmluZGV4IDc1M2IzZWMuLjI4MzRhNjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL0NvbnZlcnRlci5jcHAKQEAgLTc0LDE5ICs3NCw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBSZWxlYXNlTWVkaWFCdWZmZXJSZWZlcmVuY2UoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKLSAgICB2b2lkICptYnVmOwotICAgIGlmIChhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsICZtYnVmKQotICAgICAgICAgICAgJiYgbWJ1ZiAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNpbmcgbWJ1ZiAlcCIsIG1idWYpOwotCi0gICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0UG9pbnRlcigibWVkaWFCdWZmZXIiLCBOVUxMKTsKLQotICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYUJ1ZmZlciAqPihtYnVmKS0+cmVsZWFzZSgpOwotICAgICAgICBtYnVmID0gTlVMTDsKLSAgICB9Ci19Ci0KIHZvaWQgQ29udmVydGVyOjpyZWxlYXNlRW5jb2RlcigpIHsKICAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC05NSwxOCArODIsNyBAQAogICAgIG1FbmNvZGVyLT5yZWxlYXNlKCk7CiAgICAgbUVuY29kZXIuY2xlYXIoKTsKIAotICAgIHdoaWxlICghbUlucHV0QnVmZmVyUXVldWUuZW1wdHkoKSkgewotICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gKm1JbnB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLmVyYXNlKG1JbnB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCkpOwotCi0gICAgICAgIFJlbGVhc2VNZWRpYUJ1ZmZlclJlZmVyZW5jZShhY2Nlc3NVbml0KTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FbmNvZGVySW5wdXRCdWZmZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBtRW5jb2RlcklucHV0QnVmZmVycy5pdGVtQXQoaSk7Ci0gICAgICAgIFJlbGVhc2VNZWRpYUJ1ZmZlclJlZmVyZW5jZShhY2Nlc3NVbml0KTsKLSAgICB9Ci0KKyAgICBtSW5wdXRCdWZmZXJRdWV1ZS5jbGVhcigpOwogICAgIG1FbmNvZGVySW5wdXRCdWZmZXJzLmNsZWFyKCk7CiAgICAgbUVuY29kZXJPdXRwdXRCdWZmZXJzLmNsZWFyKCk7CiB9CkBAIC0zMjgsNyArMzA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJhY2Nlc3NVbml0IiwgJmFjY2Vzc1VuaXQpKTsKIAotICAgICAgICAgICAgICAgICAgICBSZWxlYXNlTWVkaWFCdWZmZXJSZWZlcmVuY2UoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPnNldE1lZGlhQnVmZmVyQmFzZShOVUxMKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0zNTEsMTUgKzMyNywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koImRyb3BwaW5nIGZyYW1lLiIpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgUmVsZWFzZU1lZGlhQnVmZmVyUmVmZXJlbmNlKGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAogI2lmIDAKLSAgICAgICAgICAgICAgICB2b2lkICptYnVmOwotICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsICZtYnVmKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPQorICAgICAgICAgICAgICAgICAgICAoTWVkaWFCdWZmZXIgKikoYWNjZXNzVW5pdC0+Z2V0TWVkaWFCdWZmZXJCYXNlKCkpOworICAgICAgICAgICAgICAgIGlmIChtYnVmICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0koInF1ZXVlaW5nIG1idWYgJXAiLCBtYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIH0KICNlbmRpZgogCkBAIC02NDcsMTMgKzYyNCwxMyBAQAogICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLAogICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSgpKTsKIAotICAgICAgICAgICAgdm9pZCAqbWVkaWFCdWZmZXI7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsICZtZWRpYUJ1ZmZlcikKLSAgICAgICAgICAgICAgICAgICAgJiYgbWVkaWFCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1FbmNvZGVySW5wdXRCdWZmZXJzLml0ZW1BdChidWZmZXJJbmRleCktPm1ldGEoKQotICAgICAgICAgICAgICAgICAgICAtPnNldFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgbWVkaWFCdWZmZXIpOworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1lZGlhQnVmZmVyID0KKyAgICAgICAgICAgICAgICAoTWVkaWFCdWZmZXIgKikoYnVmZmVyLT5nZXRNZWRpYUJ1ZmZlckJhc2UoKSk7CisgICAgICAgICAgICBpZiAobWVkaWFCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1FbmNvZGVySW5wdXRCdWZmZXJzLml0ZW1BdChidWZmZXJJbmRleCktPnNldE1lZGlhQnVmZmVyQmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyKTsKIAotICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsIE5VTEwpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0TWVkaWFCdWZmZXJCYXNlKE5VTEwpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZmxhZ3MgPSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvTWVkaWFQdWxsZXIuY3BwCmluZGV4IDdlODg5MWQuLjg2YjkxOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvTWVkaWFQdWxsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvTWVkaWFQdWxsZXIuY3BwCkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyB2aWRlbyBlbmNvZGVyIHdpbGwgcmVsZWFzZSBNZWRpYUJ1ZmZlciB3aGVuIGRvbmUKICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB1bmRlcmx5aW5nIGRhdGEuCi0gICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0UG9pbnRlcigibWVkaWFCdWZmZXIiLCBtYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+c2V0TWVkaWFCdWZmZXJCYXNlKG1idWYpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmNwcAppbmRleCAyODZlYTEzLi4yY2I0Nzg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUhEQ1AuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC03NDksNyArNzUwLDggQEAKIAogICAgIG1FeHRyYWN0b3IgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcjsKIAotICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobU1lZGlhUGF0aC5jX3N0cigpKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKAorICAgICAgICAgICAgTlVMTCAvKiBodHRwU2VydmljZSAqLywgbU1lZGlhUGF0aC5jX3N0cigpKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTEwNTMsNyArMTA1NSw3IEBACiAgICAgZXJyID0gc291cmNlLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KG51bUlucHV0QnVmZmVycyk7CiAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwogCi0gICAgbUJ1ZmZlclF1ZXVlID0gc291cmNlLT5nZXRCdWZmZXJRdWV1ZSgpOworICAgIG1Qcm9kdWNlciA9IHNvdXJjZS0+Z2V0UHJvZHVjZXIoKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTEwNzcsNyArMTA3OSw3IEBACiB9CiAKIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OmdldFN1cmZhY2VUZXh0dXJlKCkgewotICAgIHJldHVybiBtQnVmZmVyUXVldWU7CisgICAgcmV0dXJuIG1Qcm9kdWNlcjsKIH0KIAogdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpyZXF1ZXN0SURSRnJhbWUoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaAppbmRleCA1YzhlZTk0Li4yODI0MTQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmgKQEAgLTI1LDcgKzI1LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7Ci1zdHJ1Y3QgQnVmZmVyUXVldWU7CiBzdHJ1Y3QgSUhEQ1A7CiBzdHJ1Y3QgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIHN0cnVjdCBNZWRpYVB1bGxlcjsKQEAgLTExMSw3ICsxMTAsNyBAQAogCiAgICAgaW50NjRfdCBtTGFzdExpZmVzaWduVXM7CiAKLSAgICBzcDxCdWZmZXJRdWV1ZT4gbUJ1ZmZlclF1ZXVlOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKIAogICAgIEtleWVkVmVjdG9yPHNpemVfdCwgc3A8VHJhY2s+ID4gbVRyYWNrczsKICAgICBzc2l6ZV90IG1WaWRlb1RyYWNrSW5kZXg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUmVwZWF0ZXJTb3VyY2UuY3BwCmluZGV4IGNjOGRlZTMuLjU5ZDdlNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUmVwZWF0ZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUmVwZWF0ZXJTb3VyY2UuY3BwCkBAIC03OSw2ICs3OSw4IEBACiAKICAgICBBTE9HVigic3RvcHBpbmciKTsKIAorICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0b3AoKTsKKwogICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKICAgICAgICAgbUxvb3Blci0+c3RvcCgpOwogICAgICAgICBtTG9vcGVyLmNsZWFyKCk7CkBAIC05Miw3ICs5NCw2IEBACiAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogICAgIH0KIAotICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0b3AoKTsKIAogICAgIEFMT0dWKCJzdG9wcGVkIik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvVFNQYWNrZXRpemVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvVFNQYWNrZXRpemVyLmNwcAppbmRleCBlZWIzNzAwLi41MGQzMTdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9UU1BhY2tldGl6ZXIuY3BwCkBAIC01NjUsNyArNTY1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIHNpemVfdCBudW1QYWRkaW5nQnl0ZXMgPSBzaXplQXZhaWxhYmxlRm9yUGF5bG9hZCAtIG51bUJ5dGVzT2ZQYXlsb2FkOworICAgICAgICBzaXplX3QgbnVtUGFkZGluZ0J5dGVzID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgLSBudW1CeXRlc09mUGF5bG9hZDsKICAgICAgICAgQUxPR1YoInBhY2tldCAxIGNvbnRhaW5zICV6ZCBwYWRkaW5nIGJ5dGVzIGFuZCAlemQgYnl0ZXMgb2YgcGF5bG9hZCIsCiAgICAgICAgICAgICAgIG51bVBhZGRpbmdCeXRlcywgbnVtQnl0ZXNPZlBheWxvYWQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuY3BwCmluZGV4IDA1ZTQwMTguLmRhNDA1ZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuY3BwCkBAIC03NDYsNyArNzQ2LDcgQEAKIH0KIAogc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6Om9uUmVjZWl2ZU0xUmVzcG9uc2UoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIGludDMyX3QgLyogc2Vzc2lvbklEICovLCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKSB7CiAgICAgaW50MzJfdCBzdGF0dXNDb2RlOwogICAgIGlmICghbXNnLT5nZXRTdGF0dXNDb2RlKCZzdGF0dXNDb2RlKSkgewogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtOTkxLDcgKzk5MSw3IEBACiB9CiAKIHN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpvblJlY2VpdmVNNVJlc3BvbnNlKAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJm1zZykgeworICAgICAgICBpbnQzMl90IC8qIHNlc3Npb25JRCAqLywgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJm1zZykgewogICAgIGludDMyX3Qgc3RhdHVzQ29kZTsKICAgICBpZiAoIW1zZy0+Z2V0U3RhdHVzQ29kZSgmc3RhdHVzQ29kZSkpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTEwMDUsNyArMTAwNSw3IEBACiB9CiAKIHN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpvblJlY2VpdmVNMTZSZXNwb25zZSgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICYgLyogbXNnICovKSB7CiAgICAgLy8gSWYgb25seSB0aGUgcmVzcG9uc2Ugd2FzIHJlcXVpcmVkIHRvIGluY2x1ZGUgYSAiU2Vzc2lvbjoiIGhlYWRlci4uLgogCiAgICAgQ0hFQ0tfRVEoc2Vzc2lvbklELCBtQ2xpZW50U2Vzc2lvbklEKTsKQEAgLTE2ODAsNyArMTY4MCw3IEBACiB9CiAKIHZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OkhEQ1BPYnNlcnZlcjo6bm90aWZ5KAotICAgICAgICBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSB7CisgICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICogLyogb2JqICovKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoIm1zZyIsIG1zZyk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MSIsIGV4dDEpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tawppbmRleCBiM2Y3YjFiLi5iYjg2ZGZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tawpAQCAtMTIsNSArMTIsNyBAQAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfeXV2CiAKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcAppbmRleCA3YjkwMDBiLi5iYjNlMmZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAKQEAgLTIyNiw4ICsyMjYsOCBAQAogICAgICAgICAgICAgJnlTcmNPZmZzZXRJbmNyZW1lbnQsICZ1U3JjT2Zmc2V0SW5jcmVtZW50LCAmdlNyY09mZnNldEluY3JlbWVudCk7CiAKICAgICBpbnQzMl90IHlEZXN0T2Zmc2V0SW5jcmVtZW50OwotICAgIGludDMyX3QgdURlc3RPZmZzZXRJbmNyZW1lbnQ7Ci0gICAgaW50MzJfdCB2RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHVEZXN0T2Zmc2V0SW5jcmVtZW50ID0gMDsKKyAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50ID0gMDsKICAgICBkZXN0SW1hZ2UuZ2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCiAgICAgICAgICAgICAmeURlc3RPZmZzZXRJbmNyZW1lbnQsICZ1RGVzdE9mZnNldEluY3JlbWVudCwgJnZEZXN0T2Zmc2V0SW5jcmVtZW50KTsKIApAQCAtMzA5LDcgKzMwOSw3IEBACiAKICAgICBpbnQzMl90IHlEZXN0T2Zmc2V0SW5jcmVtZW50OwogICAgIGludDMyX3QgdURlc3RPZmZzZXRJbmNyZW1lbnQ7Ci0gICAgaW50MzJfdCB2RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50ID0gMDsKICAgICBkZXN0SW1hZ2UuZ2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCiAgICAgICAgICAgICAmeURlc3RPZmZzZXRJbmNyZW1lbnQsICZ1RGVzdE9mZnNldEluY3JlbWVudCwgJnZEZXN0T2Zmc2V0SW5jcmVtZW50KTsKIApAQCAtMzkzLDkgKzM5Myw5IEBACiAgICAgZnByaW50ZihmcCwgIjI1NVxuIik7CiAgICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbUhlaWdodDsgKyt5KSB7CiAgICAgICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IG1XaWR0aDsgKyt4KSB7Ci0gICAgICAgICAgICB1aW50OF90IHlWYWx1ZTsKLSAgICAgICAgICAgIHVpbnQ4X3QgdVZhbHVlOwotICAgICAgICAgICAgdWludDhfdCB2VmFsdWU7CisgICAgICAgICAgICB1aW50OF90IHlWYWx1ZSA9IDB1OworICAgICAgICAgICAgdWludDhfdCB1VmFsdWUgPSAwdTsKKyAgICAgICAgICAgIHVpbnQ4X3QgdlZhbHVlID0gMHU7CiAgICAgICAgICAgICBnZXRQaXhlbFZhbHVlKHgsIHksICZ5VmFsdWUsICZ1VmFsdWUsICYgdlZhbHVlKTsKIAogICAgICAgICAgICAgdWludDhfdCByVmFsdWU7CmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5tawppbmRleCAxYWM2NDdhLi4zYTI4MGYwIDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsKQEAgLTE1LDYgKzE1LDggQEAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliYXVkaW9mbGluZ2VyIFwKKwlsaWJhdWRpb3BvbGljeXNlcnZpY2UgXAorCWxpYmNhbWVyYV9tZXRhZGF0YVwKIAlsaWJjYW1lcmFzZXJ2aWNlIFwKIAlsaWJtZWRpYWxvZ3NlcnZpY2UgXAogCWxpYmN1dGlscyBcCkBAIC0yMyw3ICsyNSw4IEBACiAJbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKIAlsaWJ1dGlscyBcCiAJbGlibG9nIFwKLQlsaWJiaW5kZXIKKwlsaWJiaW5kZXIgXAorCWxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAJbGlicmVnaXN0ZXJtc2V4dApAQCAtMzIsOCArMzUsMTIgQEAKICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYWxvZyBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlIFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL3NvdW5kdHJpZ2dlcgogCiBMT0NBTF9NT0RVTEU6PSBtZWRpYXNlcnZlcgorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAKaW5kZXggZDUyMDdkNS4uYWYxYzllNiAxMDA2NDQKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAKKysrIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAKQEAgLTM0LDEwICszNCwxMSBAQAogI2luY2x1ZGUgIk1lZGlhTG9nU2VydmljZS5oIgogI2luY2x1ZGUgIk1lZGlhUGxheWVyU2VydmljZS5oIgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgorI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoraW50IG1haW4oaW50IGFyZ2MgX191bnVzZWQsIGNoYXIqKiBhcmd2KQogewogICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CkBAIC0xMjgsNiArMTI5LDcgQEAKICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBDYW1lcmFTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgcmVnaXN0ZXJFeHRlbnNpb25zKCk7CiAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9BbmRyb2lkLm1rIGIvbWVkaWEvbXRwL0FuZHJvaWQubWsKaW5kZXggYWM2MDhhMS4uM2FmMDk1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbXRwL0FuZHJvaWQubWsKQEAgLTM5LDkgKzM5LDYgQEAKIAogTE9DQUxfQ0ZMQUdTIDo9IC1ETVRQX0RFVklDRSAtRE1UUF9IT1NUCiAKLSMgTmVlZGVkIGZvciA8YmlvbmljX3RpbWUuaD4KLUxPQ0FMX0NfSU5DTFVERVMgOj0gYmlvbmljL2xpYmMvcHJpdmF0ZQotCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnV0aWxzIGxpYmN1dGlscyBsaWJsb2cgbGlidXNiaG9zdCBsaWJiaW5kZXIKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCmluZGV4IGM0Zjg3YTAuLmU2ZTE5ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKQEAgLTM2Myw3ICszNjMsNyBAQAogfQogCiBpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGVEYXRhKGludCBmZCwgdm9pZCogZGF0YSwgdWludDMyX3QgbGVuZ3RoKSB7Ci0gICAgYWxsb2NhdGUobGVuZ3RoKTsKKyAgICBhbGxvY2F0ZShsZW5ndGggKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKICAgICBtZW1jcHkobUJ1ZmZlciArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsIGRhdGEsIGxlbmd0aCk7CiAgICAgbGVuZ3RoICs9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CiAgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBsZW5ndGgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZS5jcHAgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcAppbmRleCBkNjcyZGZmLi5kNmQ1ZGQ1IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcApAQCAtMTk1LDcgKzE5NSw3IEBACiAKIE10cERldmljZTo6fk10cERldmljZSgpIHsKICAgICBjbG9zZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZVByb3BlcnRpZXMuc2l6ZSgpOyBpKyspCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGV2aWNlUHJvcGVydGllcy5zaXplKCk7IGkrKykKICAgICAgICAgZGVsZXRlIG1EZXZpY2VQcm9wZXJ0aWVzW2ldOwogICAgIHVzYl9yZXF1ZXN0X2ZyZWUobVJlcXVlc3RJbjEpOwogICAgIHVzYl9yZXF1ZXN0X2ZyZWUobVJlcXVlc3RJbjIpOwpAQCAtMjUzLDcgKzI1Myw3IEBACiAgICAgICAgICAgICBBTE9HSSgiKioqIEZPUk1BVDogJXNcbiIsIE10cERlYnVnOjpnZXRGb3JtYXRDb2RlTmFtZShmb3JtYXQpKTsKICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5TGlzdCogcHJvcHMgPSBnZXRPYmplY3RQcm9wc1N1cHBvcnRlZChmb3JtYXQpOwogICAgICAgICAgICAgaWYgKHByb3BzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcm9wcy0+c2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHByb3BzLT5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wID0gKCpwcm9wcylbal07CiAgICAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IGdldE9iamVjdFByb3BEZXNjKHByb3AsIGZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcCBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAKaW5kZXggNjRkZDQ1Yi4uYzUwMDkwMSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcAorKysgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwCkBAIC0xNiw2ICsxNiw4IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiTXRwUHJvcGVydHkiCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKICNpbmNsdWRlICJNdHBEZWJ1Zy5oIgogI2luY2x1ZGUgIk10cFByb3BlcnR5LmgiCkBAIC0xODksOSArMTkxLDkgQEAKICAgICAgICAgICAgIGlmIChkZXZpY2VQcm9wKQogICAgICAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtQ3VycmVudFZhbHVlKTsKICAgICB9Ci0gICAgcGFja2V0LnB1dFVJbnQzMihtR3JvdXBDb2RlKTsKICAgICBpZiAoIWRldmljZVByb3ApCi0gICAgICAgIHBhY2tldC5wdXRVSW50OChtRm9ybUZsYWcpOworICAgICAgICBwYWNrZXQucHV0VUludDMyKG1Hcm91cENvZGUpOworICAgIHBhY2tldC5wdXRVSW50OChtRm9ybUZsYWcpOwogICAgIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1SYW5nZSkgewogICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1NaW5pbXVtVmFsdWUpOwogICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1NYXhpbXVtVmFsdWUpOwpAQCAtMzg1LDEwICszODcsMTAgQEAKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiVkIiwgdmFsdWUudS51MzIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlbGxkIiwgdmFsdWUudS5pNjQpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJSIgUFJJZDY0LCB2YWx1ZS51Lmk2NCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlbGxkIiwgdmFsdWUudS51NjQpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJSIgUFJJdTY0LCB2YWx1ZS51LnU2NCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxMjg6CiAgICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlMDhYJTA4WCUwOFglMDhYIiwgdmFsdWUudS5pMTI4WzBdLCB2YWx1ZS51LmkxMjhbMV0sCkBAIC01MTcsOCArNTE5LDE0IEBACiAKIE10cFByb3BlcnR5VmFsdWUqIE10cFByb3BlcnR5OjpyZWFkQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBpbnQmIGxlbmd0aCkgewogICAgIGxlbmd0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKLSAgICBpZiAobGVuZ3RoID09IDApCisgICAgLy8gRmFpbCBpZiByZXN1bHRpbmcgYXJyYXkgaXMgb3ZlciAyR0IuICBUaGlzIGlzIGJlY2F1c2UgdGhlIG1heGltdW0gYXJyYXkKKyAgICAvLyBzaXplIG1heSBiZSBsZXNzIHRoYW4gU0laRV9NQVggb24gc29tZSBwbGF0Zm9ybXMuCisgICAgaWYgKCBDQ19VTkxJS0VMWSgKKyAgICAgICAgICAgIGxlbmd0aCA9PSAwIHx8CisgICAgICAgICAgICBsZW5ndGggPj0gSU5UMzJfTUFYIC8gc2l6ZW9mKE10cFByb3BlcnR5VmFsdWUpKSApIHsKKyAgICAgICAgbGVuZ3RoID0gMDsKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIE10cFByb3BlcnR5VmFsdWUqIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eVZhbHVlW2xlbmd0aF07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgcmVzdWx0W2ldKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKaW5kZXggZGY4N2RiNC4uYWE0Mzk2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+CkBAIC05Myw2ICs5NCw3IEBACiAgICAgTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVELAogICAgIE1UUF9FVkVOVF9TVE9SRV9BRERFRCwKICAgICBNVFBfRVZFTlRfU1RPUkVfUkVNT1ZFRCwKKyAgICBNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCwKIH07CiAKIE10cFNlcnZlcjo6TXRwU2VydmVyKGludCBmZCwgTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBib29sIHB0cCwKQEAgLTEyNCw3ICsxMjYsNyBAQAogdm9pZCBNdHBTZXJ2ZXI6OnJlbW92ZVN0b3JhZ2UoTXRwU3RvcmFnZSogc3RvcmFnZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdG9yYWdlcy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAobVN0b3JhZ2VzW2ldID09IHN0b3JhZ2UpIHsKICAgICAgICAgICAgIG1TdG9yYWdlcy5yZW1vdmVBdChpKTsKICAgICAgICAgICAgIHNlbmRTdG9yZVJlbW92ZWQoc3RvcmFnZS0+Z2V0U3RvcmFnZUlEKCkpOwpAQCAtMTM2LDcgKzEzOCw3IEBACiBNdHBTdG9yYWdlKiBNdHBTZXJ2ZXI6OmdldFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkKSB7CiAgICAgaWYgKGlkID09IDApCiAgICAgICAgIHJldHVybiBtU3RvcmFnZXNbMF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdG9yYWdlcy5zaXplKCk7IGkrKykgewogICAgICAgICBNdHBTdG9yYWdlKiBzdG9yYWdlID0gbVN0b3JhZ2VzW2ldOwogICAgICAgICBpZiAoc3RvcmFnZS0+Z2V0U3RvcmFnZUlEKCkgPT0gaWQpCiAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZTsKQEAgLTI2MSw2ICsyNjMsMTEgQEAKICAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX1NUT1JFX1JFTU9WRUQsIGlkKTsKIH0KIAordm9pZCBNdHBTZXJ2ZXI6OnNlbmREZXZpY2VQcm9wZXJ0eUNoYW5nZWQoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICBBTE9HVigic2VuZERldmljZVByb3BlcnR5Q2hhbmdlZCAlZFxuIiwgcHJvcGVydHkpOworICAgIHNlbmRFdmVudChNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCwgcHJvcGVydHkpOworfQorCiB2b2lkIE10cFNlcnZlcjo6c2VuZEV2ZW50KE10cEV2ZW50Q29kZSBjb2RlLCB1aW50MzJfdCBwYXJhbTEpIHsKICAgICBpZiAobVNlc3Npb25PcGVuKSB7CiAgICAgICAgIG1FdmVudC5zZXRFdmVudENvZGUoY29kZSk7CkBAIC0zMTgsNiArMzI1LDE0IEBACiAgICAgICAgIG1TZW5kT2JqZWN0SGFuZGxlID0ga0ludmFsaWRPYmplY3RIYW5kbGU7CiAgICAgfQogCisgICAgaW50IGNvbnRhaW5lcnR5cGUgPSBtUmVxdWVzdC5nZXRDb250YWluZXJUeXBlKCk7CisgICAgaWYgKGNvbnRhaW5lcnR5cGUgIT0gTVRQX0NPTlRBSU5FUl9UWVBFX0NPTU1BTkQpIHsKKyAgICAgICAgQUxPR0UoIndyb25nIGNvbnRhaW5lciB0eXBlICVkIiwgY29udGFpbmVydHlwZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigiZ290IGNvbW1hbmQgJXMgKCV4KSIsIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pLCBvcGVyYXRpb24pOworCiAgICAgc3dpdGNoIChvcGVyYXRpb24pIHsKICAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTzoKICAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXREZXZpY2VJbmZvKCk7CkBAIC00MDgsNyArNDIzLDggQEAKICAgICAgICAgICAgIHJlc3BvbnNlID0gZG9FbmRFZGl0T2JqZWN0KCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJnb3QgdW5zdXBwb3J0ZWQgY29tbWFuZCAlcyIsIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pKTsKKyAgICAgICAgICAgIEFMT0dFKCJnb3QgdW5zdXBwb3J0ZWQgY29tbWFuZCAlcyAoJXgpIiwKKyAgICAgICAgICAgICAgICAgICAgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbiksIG9wZXJhdGlvbik7CiAgICAgICAgICAgICByZXNwb25zZSA9IE1UUF9SRVNQT05TRV9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRDsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTc4Niw3ICs4MDIsNyBAQAogICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKGhhbmRsZSwgcGF0aEJ1ZiwgZmlsZUxlbmd0aCwgZm9ybWF0KTsKICAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gZmlsZUxlbmd0aCkKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gKHVpbnQ2NF90KWZpbGVMZW5ndGgpCiAgICAgICAgIGxlbmd0aCA9IGZpbGVMZW5ndGggLSBvZmZzZXQ7CiAKICAgICBjb25zdCBjaGFyKiBmaWxlUGF0aCA9IChjb25zdCBjaGFyICopcGF0aEJ1ZjsKQEAgLTk0MywyMiArOTU5LDI4IEBACiAgICAgZmNobW9kKG1mci5mZCwgbUZpbGVQZXJtaXNzaW9uKTsKICAgICB1bWFzayhtYXNrKTsKIAotICAgIGlmIChpbml0aWFsRGF0YSA+IDApCisgICAgaWYgKGluaXRpYWxEYXRhID4gMCkgewogICAgICAgICByZXQgPSB3cml0ZShtZnIuZmQsIG1EYXRhLmdldERhdGEoKSwgaW5pdGlhbERhdGEpOworICAgIH0KIAotICAgIGlmIChtU2VuZE9iamVjdEZpbGVTaXplIC0gaW5pdGlhbERhdGEgPiAwKSB7Ci0gICAgICAgIG1mci5vZmZzZXQgPSBpbml0aWFsRGF0YTsKLSAgICAgICAgaWYgKG1TZW5kT2JqZWN0RmlsZVNpemUgPT0gMHhGRkZGRkZGRikgewotICAgICAgICAgICAgLy8gdGVsbCBkcml2ZXIgdG8gcmVhZCB1bnRpbCBpdCByZWNlaXZlcyBhIHNob3J0IHBhY2tldAotICAgICAgICAgICAgbWZyLmxlbmd0aCA9IDB4RkZGRkZGRkY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZnIubGVuZ3RoID0gbVNlbmRPYmplY3RGaWxlU2l6ZSAtIGluaXRpYWxEYXRhOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gd3JpdGUgaW5pdGlhbCBkYXRhIik7CisgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtU2VuZE9iamVjdEZpbGVTaXplIC0gaW5pdGlhbERhdGEgPiAwKSB7CisgICAgICAgICAgICBtZnIub2Zmc2V0ID0gaW5pdGlhbERhdGE7CisgICAgICAgICAgICBpZiAobVNlbmRPYmplY3RGaWxlU2l6ZSA9PSAweEZGRkZGRkZGKSB7CisgICAgICAgICAgICAgICAgLy8gdGVsbCBkcml2ZXIgdG8gcmVhZCB1bnRpbCBpdCByZWNlaXZlcyBhIHNob3J0IHBhY2tldAorICAgICAgICAgICAgICAgIG1mci5sZW5ndGggPSAweEZGRkZGRkZGOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZnIubGVuZ3RoID0gbVNlbmRPYmplY3RGaWxlU2l6ZSAtIGluaXRpYWxEYXRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigicmVjZWl2aW5nICVzXG4iLCAoY29uc3QgY2hhciAqKW1TZW5kT2JqZWN0RmlsZVBhdGgpOworICAgICAgICAgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICAgICAgICAgIHJldCA9IGlvY3RsKG1GRCwgTVRQX1JFQ0VJVkVfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7CisgICAgICAgICAgICBBTE9HVigiTVRQX1JFQ0VJVkVfRklMRSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKICAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJyZWNlaXZpbmcgJXNcbiIsIChjb25zdCBjaGFyICopbVNlbmRPYmplY3RGaWxlUGF0aCk7Ci0gICAgICAgIC8vIHRyYW5zZmVyIHRoZSBmaWxlCi0gICAgICAgIHJldCA9IGlvY3RsKG1GRCwgTVRQX1JFQ0VJVkVfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7Ci0gICAgICAgIEFMT0dWKCJNVFBfUkVDRUlWRV9GSUxFIHJldHVybmVkICVkXG4iLCByZXQpOwogICAgIH0KICAgICBjbG9zZShtZnIuZmQpOwogCkBAIC05ODMsNyArMTAwNSw3IEBACiAKIHN0YXRpYyB2b2lkIGRlbGV0ZVJlY3Vyc2l2ZShjb25zdCBjaGFyKiBwYXRoKSB7CiAgICAgY2hhciBwYXRoYnVmW1BBVEhfTUFYXTsKLSAgICBpbnQgcGF0aExlbmd0aCA9IHN0cmxlbihwYXRoKTsKKyAgICBzaXplX3QgcGF0aExlbmd0aCA9IHN0cmxlbihwYXRoKTsKICAgICBpZiAocGF0aExlbmd0aCA+PSBzaXplb2YocGF0aGJ1ZikgLSAxKSB7CiAgICAgICAgIEFMT0dFKCJwYXRoIHRvbyBsb25nOiAlc1xuIiwgcGF0aCk7CiAgICAgfQpAQCAtMTEwNSwxMiArMTEyNywxMyBAQAogCiAgICAgLy8gY2FuJ3Qgc3RhcnQgd3JpdGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUKICAgICBpZiAob2Zmc2V0ID4gZWRpdC0+bVNpemUpIHsKLSAgICAgICAgQUxPR0QoIndyaXRpbmcgcGFzdCBlbmQgb2Ygb2JqZWN0LCBvZmZzZXQ6ICVsbGQsIGVkaXQtPm1TaXplOiAlbGxkIiwgb2Zmc2V0LCBlZGl0LT5tU2l6ZSk7CisgICAgICAgIEFMT0dEKCJ3cml0aW5nIHBhc3QgZW5kIG9mIG9iamVjdCwgb2Zmc2V0OiAlIiBQUkl1NjQgIiwgZWRpdC0+bVNpemU6ICUiIFBSSXU2NCwKKyAgICAgICAgICAgIG9mZnNldCwgZWRpdC0+bVNpemUpOwogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CiAgICAgfQogCiAgICAgY29uc3QgY2hhciogZmlsZVBhdGggPSAoY29uc3QgY2hhciAqKWVkaXQtPm1QYXRoOwotICAgIEFMT0dWKCJyZWNlaXZpbmcgcGFydGlhbCAlcyAlbGxkICVsbGRcbiIsIGZpbGVQYXRoLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgQUxPR1YoInJlY2VpdmluZyBwYXJ0aWFsICVzICUiIFBSSXU2NCAiICUiIFBSSXUzMiwgZmlsZVBhdGgsIG9mZnNldCwgbGVuZ3RoKTsKIAogICAgIC8vIHJlYWQgdGhlIGhlYWRlciwgYW5kIHBvc3NpYmx5IHNvbWUgZGF0YQogICAgIGludCByZXQgPSBtRGF0YS5yZWFkKG1GRCk7CkBAIC0xMTI0LDE1ICsxMTQ3LDE5IEBACiAgICAgICAgIGxlbmd0aCAtPSBpbml0aWFsRGF0YTsKICAgICB9CiAKLSAgICBpZiAobGVuZ3RoID4gMCkgewotICAgICAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOwotICAgICAgICBtZnIuZmQgPSBlZGl0LT5tRkQ7Ci0gICAgICAgIG1mci5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIG1mci5sZW5ndGggPSBsZW5ndGg7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byB3cml0ZSBpbml0aWFsIGRhdGEiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgbXRwX2ZpbGVfcmFuZ2UgIG1mcjsKKyAgICAgICAgICAgIG1mci5mZCA9IGVkaXQtPm1GRDsKKyAgICAgICAgICAgIG1mci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICBtZnIubGVuZ3RoID0gbGVuZ3RoOwogCi0gICAgICAgIC8vIHRyYW5zZmVyIHRoZSBmaWxlCi0gICAgICAgIHJldCA9IGlvY3RsKG1GRCwgTVRQX1JFQ0VJVkVfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7Ci0gICAgICAgIEFMT0dWKCJNVFBfUkVDRUlWRV9GSUxFIHJldHVybmVkICVkIiwgcmV0KTsKKyAgICAgICAgICAgIC8vIHRyYW5zZmVyIHRoZSBmaWxlCisgICAgICAgICAgICByZXQgPSBpb2N0bChtRkQsIE1UUF9SRUNFSVZFX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOworICAgICAgICAgICAgQUxPR1YoIk1UUF9SRUNFSVZFX0ZJTEUgcmV0dXJuZWQgJWQiLCByZXQpOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgMCk7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmggYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKaW5kZXggZGZhODI1OC4uYjNhMTFlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5oCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaApAQCAtMTA0LDYgKzEwNCw3IEBACiAKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZERldmljZVByb3BlcnR5Q2hhbmdlZChNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSk7CiAKIHByaXZhdGU6CiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kU3RvcmVBZGRlZChNdHBTdG9yYWdlSUQgaWQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcCBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5jcHAKaW5kZXggZGNkMzdjZC4uMmIxYTlhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uY3BwCkBAIC0xNiw2ICsxNiw4IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiTXRwU3RvcmFnZUluZm8iCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSAiTXRwRGVidWcuaCIKICNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCiAjaW5jbHVkZSAiTXRwU3RvcmFnZUluZm8uaCIKQEAgLTYzLDcgKzY1LDcgQEAKIHZvaWQgTXRwU3RvcmFnZUluZm86OnByaW50KCkgewogICAgIEFMT0dEKCJTdG9yYWdlIEluZm8gJTA4WDpcblx0bVN0b3JhZ2VUeXBlOiAlZFxuXHRtRmlsZVN5c3RlbVR5cGU6ICVkXG5cdG1BY2Nlc3NDYXBhYmlsaXR5OiAlZFxuIiwKICAgICAgICAgICAgIG1TdG9yYWdlSUQsIG1TdG9yYWdlVHlwZSwgbUZpbGVTeXN0ZW1UeXBlLCBtQWNjZXNzQ2FwYWJpbGl0eSk7Ci0gICAgQUxPR0QoIlx0bU1heENhcGFjaXR5OiAlbGxkXG5cdG1GcmVlU3BhY2VCeXRlczogJWxsZFxuXHRtRnJlZVNwYWNlT2JqZWN0czogJWRcbiIsCisgICAgQUxPR0QoIlx0bU1heENhcGFjaXR5OiAlIiBQUkl1NjQgIlxuXHRtRnJlZVNwYWNlQnl0ZXM6ICUiIFBSSXU2NCAiXG5cdG1GcmVlU3BhY2VPYmplY3RzOiAlZFxuIiwKICAgICAgICAgICAgIG1NYXhDYXBhY2l0eSwgbUZyZWVTcGFjZUJ5dGVzLCBtRnJlZVNwYWNlT2JqZWN0cyk7CiAgICAgQUxPR0QoIlx0bVN0b3JhZ2VEZXNjcmlwdGlvbjogJXNcblx0bVZvbHVtZUlkZW50aWZpZXI6ICVzXG4iLAogICAgICAgICAgICAgbVN0b3JhZ2VEZXNjcmlwdGlvbiwgbVZvbHVtZUlkZW50aWZpZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFV0aWxzLmNwcCBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKaW5kZXggNmVjODg3Ni4uMDY2N2JkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFV0aWxzLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCkBAIC0xOSw3ICsxOSw4IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKLSNpbmNsdWRlIDxjdXRpbHMvdHp0aW1lLmg+CisjaW5jbHVkZSA8Li4vcHJpdmF0ZS9iaW9uaWNfdGltZS5oPiAvKiBUT0RPOiBzd2l0Y2ggdGhpcyBjb2RlIHRvIGljdTRjISAqLworCiAjaW5jbHVkZSAiTXRwVXRpbHMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL0FuZHJvaWQubWsgYi9tZWRpYS9uZGsvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc5NWNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1MiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLCB0cnVlKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOZGtNZWRpYUNvZGVjLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE5ka01lZGlhQ3J5cHRvLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTmRrTWVkaWFFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOZGtNZWRpYUZvcm1hdC5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE5ka01lZGlhTXV4ZXIuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTmRrTWVkaWFEcm0uY3BwICAgICAgICAgICAgICAgICAgICAgICBcCisKK0xPQ0FMX01PRFVMRTo9IGxpYm1lZGlhbmRrCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGJpb25pYy9saWJjL3ByaXZhdGUgXAorICAgIGZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSBcCisgICAgZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL25kaworCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtRCBFWFBPUlQ9J19fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSknCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmJpbmRlciBcCisgICAgbGlibWVkaWEgXAorICAgIGxpYnN0YWdlZnJpZ2h0IFwKKyAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAorICAgIGxpYmJpbmRlciBcCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDAwYjcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCkBAIC0wLDAgKzEsNTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFDb2RlYyIKKworI2luY2x1ZGUgIk5ka01lZGlhQ29kZWMuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFDcnlwdG9Qcml2LmgiCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworCitzdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgeworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSAtRUFHQUlOKSB7CisgICAgICAgIHJldHVybiAobWVkaWFfc3RhdHVzX3QpIEFNRURJQUNPREVDX0lORk9fVFJZX0FHQUlOX0xBVEVSOworICAgIH0KKyAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKK30KKworZW51bSB7CisgICAga1doYXRBY3Rpdml0eU5vdGlmeSwKKyAgICBrV2hhdFJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbnMsCisgICAga1doYXRTdG9wQWN0aXZpdHlOb3RpZmljYXRpb25zLAorfTsKKworCitjbGFzcyBDb2RlY0hhbmRsZXI6IHB1YmxpYyBBSGFuZGxlciB7Citwcml2YXRlOgorICAgIEFNZWRpYUNvZGVjKiBtQ29kZWM7CitwdWJsaWM6CisgICAgQ29kZWNIYW5kbGVyKEFNZWRpYUNvZGVjICpjb2RlYyk7CisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKK307CisKK3R5cGVkZWYgdm9pZCAoKk9uQ29kZWNFdmVudCkoQU1lZGlhQ29kZWMgKmNvZGVjLCB2b2lkICp1c2VyZGF0YSk7CisKK3N0cnVjdCBBTWVkaWFDb2RlYyB7CisgICAgc3A8YW5kcm9pZDo6TWVkaWFDb2RlYz4gbUNvZGVjOworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8Q29kZWNIYW5kbGVyPiBtSGFuZGxlcjsKKyAgICBzcDxBTWVzc2FnZT4gbUFjdGl2aXR5Tm90aWZpY2F0aW9uOworICAgIGludDMyX3QgbUdlbmVyYXRpb247CisgICAgYm9vbCBtUmVxdWVzdGVkQWN0aXZpdHlOb3RpZmljYXRpb247CisgICAgT25Db2RlY0V2ZW50IG1DYWxsYmFjazsKKyAgICB2b2lkICptQ2FsbGJhY2tVc2VyRGF0YTsKK307CisKK0NvZGVjSGFuZGxlcjo6Q29kZWNIYW5kbGVyKEFNZWRpYUNvZGVjICpjb2RlYykgeworICAgIG1Db2RlYyA9IGNvZGVjOworfQorCit2b2lkIENvZGVjSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbnM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtQ29kZWMtPm1SZXF1ZXN0ZWRBY3Rpdml0eU5vdGlmaWNhdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQ29kZWMtPm1Db2RlYy0+cmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uKG1Db2RlYy0+bUFjdGl2aXR5Tm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIG1Db2RlYy0+bVJlcXVlc3RlZEFjdGl2aXR5Tm90aWZpY2F0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEFjdGl2aXR5Tm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pOworCisgICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbUNvZGVjLT5tR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAvLyBzdGFsZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtQ29kZWMtPm1SZXF1ZXN0ZWRBY3Rpdml0eU5vdGlmaWNhdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUNvZGVjLT5tQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPm1DYWxsYmFjayhtQ29kZWMsIG1Db2RlYy0+bUNhbGxiYWNrVXNlckRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U3RvcEFjdGl2aXR5Tm90aWZpY2F0aW9uczoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpOworCisgICAgICAgICAgICBtQ29kZWMtPm1HZW5lcmF0aW9uKys7CisgICAgICAgICAgICBtQ29kZWMtPm1SZXF1ZXN0ZWRBY3Rpdml0eU5vdGlmaWNhdGlvbiA9IGZhbHNlOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoInNob3VsZG4ndCBiZSBoZXJlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKK30KKworCitzdGF0aWMgdm9pZCByZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24oQU1lZGlhQ29kZWMgKmNvZGVjKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbnMsIGNvZGVjLT5tSGFuZGxlci0+aWQoKSkpLT5wb3N0KCk7Cit9CisKK2V4dGVybiAiQyIgeworCitzdGF0aWMgQU1lZGlhQ29kZWMgKiBjcmVhdGVBTWVkaWFDb2RlYyhjb25zdCBjaGFyICpuYW1lLCBib29sIG5hbWVfaXNfdHlwZSwgYm9vbCBlbmNvZGVyKSB7CisgICAgQU1lZGlhQ29kZWMgKm1EYXRhID0gbmV3IEFNZWRpYUNvZGVjKCk7CisgICAgbURhdGEtPm1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtRGF0YS0+bUxvb3Blci0+c2V0TmFtZSgiTkRLIE1lZGlhQ29kZWNfbG9vcGVyIik7CisgICAgc3RhdHVzX3QgcmV0ID0gbURhdGEtPm1Mb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgZmFsc2UsICAgICAgLy8gcnVuT25DYWxsaW5nVGhyZWFkCisgICAgICAgICAgICB0cnVlLCAgICAgICAvLyBjYW5DYWxsSmF2YSBYWFgKKyAgICAgICAgICAgIFBSSU9SSVRZX0ZPUkVHUk9VTkQpOworICAgIGlmIChuYW1lX2lzX3R5cGUpIHsKKyAgICAgICAgbURhdGEtPm1Db2RlYyA9IGFuZHJvaWQ6Ok1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZShtRGF0YS0+bUxvb3BlciwgbmFtZSwgZW5jb2Rlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbURhdGEtPm1Db2RlYyA9IGFuZHJvaWQ6Ok1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShtRGF0YS0+bUxvb3BlciwgbmFtZSk7CisgICAgfQorICAgIG1EYXRhLT5tSGFuZGxlciA9IG5ldyBDb2RlY0hhbmRsZXIobURhdGEpOworICAgIG1EYXRhLT5tTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobURhdGEtPm1IYW5kbGVyKTsKKyAgICBtRGF0YS0+bUdlbmVyYXRpb24gPSAxOworICAgIG1EYXRhLT5tUmVxdWVzdGVkQWN0aXZpdHlOb3RpZmljYXRpb24gPSBmYWxzZTsKKyAgICBtRGF0YS0+bUNhbGxiYWNrID0gTlVMTDsKKworICAgIHJldHVybiBtRGF0YTsKK30KKworRVhQT1JUCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgeworICAgIHJldHVybiBjcmVhdGVBTWVkaWFDb2RlYyhuYW1lLCBmYWxzZSwgZmFsc2UpOworfQorCitFWFBPUlQKK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVEZWNvZGVyQnlUeXBlKGNvbnN0IGNoYXIgKm1pbWVfdHlwZSkgeworICAgIHJldHVybiBjcmVhdGVBTWVkaWFDb2RlYyhtaW1lX3R5cGUsIHRydWUsIGZhbHNlKTsKK30KKworRVhQT1JUCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZShjb25zdCBjaGFyICpuYW1lKSB7CisgICAgcmV0dXJuIGNyZWF0ZUFNZWRpYUNvZGVjKG5hbWUsIHRydWUsIHRydWUpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2RlbGV0ZShBTWVkaWFDb2RlYyAqbURhdGEpIHsKKyAgICBpZiAobURhdGEtPm1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgIG1EYXRhLT5tQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgbURhdGEtPm1Db2RlYy5jbGVhcigpOworICAgIH0KKworICAgIGlmIChtRGF0YS0+bUxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIG1EYXRhLT5tTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtRGF0YS0+bUhhbmRsZXItPmlkKCkpOworICAgICAgICBtRGF0YS0+bUxvb3Blci0+c3RvcCgpOworICAgICAgICBtRGF0YS0+bUxvb3Blci5jbGVhcigpOworICAgIH0KKyAgICBkZWxldGUgbURhdGE7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19jb25maWd1cmUoCisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwKKyAgICAgICAgY29uc3QgQU1lZGlhRm9ybWF0KiBmb3JtYXQsCisgICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKKyAgICAgICAgQU1lZGlhQ3J5cHRvICpjcnlwdG8sCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5hdGl2ZUZvcm1hdDsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGZvcm1hdCwgJm5hdGl2ZUZvcm1hdCk7CisgICAgQUxPR1YoImNvbmZpZ3VyZSB3aXRoIGZvcm1hdDogJXMiLCBuYXRpdmVGb3JtYXQtPmRlYnVnU3RyaW5nKDApLmNfc3RyKCkpOworICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBOVUxMOworICAgIGlmICh3aW5kb3cgIT0gTlVMTCkgeworICAgICAgICBzdXJmYWNlID0gKFN1cmZhY2UqKSB3aW5kb3c7CisgICAgfQorCisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUNvZGVjLT5jb25maWd1cmUobmF0aXZlRm9ybWF0LCBzdXJmYWNlLAorICAgICAgICAgICAgY3J5cHRvID8gY3J5cHRvLT5tQ3J5cHRvIDogTlVMTCwgZmxhZ3MpKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zdGFydChBTWVkaWFDb2RlYyAqbURhdGEpIHsKKyAgICBzdGF0dXNfdCByZXQgPSAgbURhdGEtPm1Db2RlYy0+c3RhcnQoKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IocmV0KTsKKyAgICB9CisgICAgbURhdGEtPm1BY3Rpdml0eU5vdGlmaWNhdGlvbiA9IG5ldyBBTWVzc2FnZShrV2hhdEFjdGl2aXR5Tm90aWZ5LCBtRGF0YS0+bUhhbmRsZXItPmlkKCkpOworICAgIG1EYXRhLT5tQWN0aXZpdHlOb3RpZmljYXRpb24tPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbURhdGEtPm1HZW5lcmF0aW9uKTsKKyAgICByZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obURhdGEpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RvcChBTWVkaWFDb2RlYyAqbURhdGEpIHsKKyAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1Db2RlYy0+c3RvcCgpKTsKKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wQWN0aXZpdHlOb3RpZmljYXRpb25zLCBtRGF0YS0+bUhhbmRsZXItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgbURhdGEtPm1BY3Rpdml0eU5vdGlmaWNhdGlvbi5jbGVhcigpOworCisgICAgcmV0dXJuIHJldDsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19mbHVzaChBTWVkaWFDb2RlYyAqbURhdGEpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tQ29kZWMtPmZsdXNoKCkpOworfQorCitFWFBPUlQKK3NzaXplX3QgQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjICptRGF0YSwgaW50NjRfdCB0aW1lb3V0VXMpIHsKKyAgICBzaXplX3QgaWR4OworICAgIHN0YXR1c190IHJldCA9IG1EYXRhLT5tQ29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaWR4LCB0aW1lb3V0VXMpOworICAgIHJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihtRGF0YSk7CisgICAgaWYgKHJldCA9PSBPSykgeworICAgICAgICByZXR1cm4gaWR4OworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK0VYUE9SVAordWludDhfdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMgKm1EYXRhLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKSB7CisgICAgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFCdWZmZXI+ID4gYWJ1ZnM7CisgICAgaWYgKG1EYXRhLT5tQ29kZWMtPmdldElucHV0QnVmZmVycygmYWJ1ZnMpID09IDApIHsKKyAgICAgICAgc2l6ZV90IG4gPSBhYnVmcy5zaXplKCk7CisgICAgICAgIGlmIChpZHggPj0gbikgeworICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciBpbmRleCAlenUgb3V0IG9mIHJhbmdlIiwgaWR4KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChvdXRfc2l6ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqb3V0X3NpemUgPSBhYnVmc1tpZHhdLT5jYXBhY2l0eSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhYnVmc1tpZHhdLT5kYXRhKCk7CisgICAgfQorICAgIEFMT0dFKCJjb3VsZG4ndCBnZXQgaW5wdXQgYnVmZmVycyIpOworICAgIHJldHVybiBOVUxMOworfQorCitFWFBPUlQKK3VpbnQ4X3QqIEFNZWRpYUNvZGVjX2dldE91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyAqbURhdGEsIHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpIHsKKyAgICBhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6c3A8YW5kcm9pZDo6QUJ1ZmZlcj4gPiBhYnVmczsKKyAgICBpZiAobURhdGEtPm1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVycygmYWJ1ZnMpID09IDApIHsKKyAgICAgICAgc2l6ZV90IG4gPSBhYnVmcy5zaXplKCk7CisgICAgICAgIGlmIChpZHggPj0gbikgeworICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciBpbmRleCAlenUgb3V0IG9mIHJhbmdlIiwgaWR4KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChvdXRfc2l6ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqb3V0X3NpemUgPSBhYnVmc1tpZHhdLT5jYXBhY2l0eSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhYnVmc1tpZHhdLT5kYXRhKCk7CisgICAgfQorICAgIEFMT0dFKCJjb3VsZG4ndCBnZXQgb3V0cHV0IGJ1ZmZlcnMiKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19xdWV1ZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjICptRGF0YSwKKyAgICAgICAgc2l6ZV90IGlkeCwgb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDY0X3QgdGltZSwgdWludDMyX3QgZmxhZ3MpIHsKKworICAgIEFTdHJpbmcgZXJyb3JNc2c7CisgICAgc3RhdHVzX3QgcmV0ID0gbURhdGEtPm1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcihpZHgsIG9mZnNldCwgc2l6ZSwgdGltZSwgZmxhZ3MsICZlcnJvck1zZyk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitFWFBPUlQKK3NzaXplX3QgQU1lZGlhQ29kZWNfZGVxdWV1ZU91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyAqbURhdGEsCisgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqaW5mbywgaW50NjRfdCB0aW1lb3V0VXMpIHsKKyAgICBzaXplX3QgaWR4OworICAgIHNpemVfdCBvZmZzZXQ7CisgICAgc2l6ZV90IHNpemU7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCBwcmVzZW50YXRpb25UaW1lVXM7CisgICAgc3RhdHVzX3QgcmV0ID0gbURhdGEtPm1Db2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigmaWR4LCAmb2Zmc2V0LCAmc2l6ZSwgJnByZXNlbnRhdGlvblRpbWVVcywKKyAgICAgICAgICAgICZmbGFncywgdGltZW91dFVzKTsKKyAgICByZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obURhdGEpOworICAgIHN3aXRjaCAocmV0KSB7CisgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICBpbmZvLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICBpbmZvLT5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIGluZm8tPmZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICBpbmZvLT5wcmVzZW50YXRpb25UaW1lVXMgPSBwcmVzZW50YXRpb25UaW1lVXM7CisgICAgICAgICAgICByZXR1cm4gaWR4OworICAgICAgICBjYXNlIC1FQUdBSU46CisgICAgICAgICAgICByZXR1cm4gQU1FRElBQ09ERUNfSU5GT19UUllfQUdBSU5fTEFURVI7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6SU5GT19GT1JNQVRfQ0hBTkdFRDoKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFDT0RFQ19JTkZPX09VVFBVVF9GT1JNQVRfQ0hBTkdFRDsKKyAgICAgICAgY2FzZSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQ6CisgICAgICAgICAgICByZXR1cm4gQU1FRElBQ09ERUNfSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworRVhQT1JUCitBTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldE91dHB1dEZvcm1hdChBTWVkaWFDb2RlYyAqbURhdGEpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIG1EYXRhLT5tQ29kZWMtPmdldE91dHB1dEZvcm1hdCgmZm9ybWF0KTsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJmZvcm1hdCk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyAqbURhdGEsIHNpemVfdCBpZHgsIGJvb2wgcmVuZGVyKSB7CisgICAgaWYgKHJlbmRlcikgeworICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tQ29kZWMtPnJlbmRlck91dHB1dEJ1ZmZlckFuZFJlbGVhc2UoaWR4KSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGlkeCkpOworICAgIH0KK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyQXRUaW1lKAorICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsIHNpemVfdCBpZHgsIGludDY0X3QgdGltZXN0YW1wTnMpIHsKKyAgICBBTE9HVigicmVuZGVyIEAgJSIgUFJJZDY0LCB0aW1lc3RhbXBOcyk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUNvZGVjLT5yZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKGlkeCwgdGltZXN0YW1wTnMpKTsKK30KKworLy9FWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3NldE5vdGlmaWNhdGlvbkNhbGxiYWNrKEFNZWRpYUNvZGVjICptRGF0YSwgT25Db2RlY0V2ZW50IGNhbGxiYWNrLCB2b2lkICp1c2VyZGF0YSkgeworICAgIG1EYXRhLT5tQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICBtRGF0YS0+bUNhbGxiYWNrVXNlckRhdGEgPSB1c2VyZGF0YTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDb2RlY0NyeXB0b0luZm8geworICAgICAgICBpbnQgbnVtc3Vic2FtcGxlczsKKyAgICAgICAgdWludDhfdCBrZXlbMTZdOworICAgICAgICB1aW50OF90IGl2WzE2XTsKKyAgICAgICAgY3J5cHRvaW5mb19tb2RlX3QgbW9kZTsKKyAgICAgICAgc2l6ZV90ICpjbGVhcmJ5dGVzOworICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzOworfSBBTWVkaWFDb2RlY0NyeXB0b0luZm87CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKKyAgICAgICAgQU1lZGlhQ29kZWMqIGNvZGVjLAorICAgICAgICBzaXplX3QgaWR4LAorICAgICAgICBvZmZfdCBvZmZzZXQsCisgICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyogY3J5cHRvLAorICAgICAgICB1aW50NjRfdCB0aW1lLAorICAgICAgICB1aW50MzJfdCBmbGFncykgeworCisgICAgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMgPSBuZXcgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGVbY3J5cHRvLT5udW1zdWJzYW1wbGVzXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNyeXB0by0+bnVtc3Vic2FtcGxlczsgaSsrKSB7CisgICAgICAgIHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEgPSBjcnlwdG8tPmNsZWFyYnl0ZXNbaV07CisgICAgICAgIHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gY3J5cHRvLT5lbmNyeXB0ZWRieXRlc1tpXTsKKyAgICB9CisKKyAgICBBU3RyaW5nIGVycm9ybXNnOworICAgIHN0YXR1c190IGVyciAgPSBjb2RlYy0+bUNvZGVjLT5xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKGlkeCwKKyAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgIHN1YlNhbXBsZXMsCisgICAgICAgICAgICBjcnlwdG8tPm51bXN1YnNhbXBsZXMsCisgICAgICAgICAgICBjcnlwdG8tPmtleSwKKyAgICAgICAgICAgIGNyeXB0by0+aXYsCisgICAgICAgICAgICAoQ3J5cHRvUGx1Z2luOjpNb2RlKSBjcnlwdG8tPm1vZGUsCisgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAmZXJyb3Jtc2cpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICBBTE9HRSgicXVlU2VjdXJlSW5wdXRCdWZmZXI6ICVzIiwgZXJyb3Jtc2cuY19zdHIoKSk7CisgICAgfQorICAgIGRlbGV0ZSBbXSBzdWJTYW1wbGVzOworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKK30KKworCisKK0VYUE9SVAorQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3KAorICAgICAgICBpbnQgbnVtc3Vic2FtcGxlcywKKyAgICAgICAgdWludDhfdCBrZXlbMTZdLAorICAgICAgICB1aW50OF90IGl2WzE2XSwKKyAgICAgICAgY3J5cHRvaW5mb19tb2RlX3QgbW9kZSwKKyAgICAgICAgc2l6ZV90ICpjbGVhcmJ5dGVzLAorICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzKSB7CisKKyAgICAvLyBzaXplIG5lZWRlZCB0byBzdG9yZSBhbGwgdGhlIGNyeXB0byBkYXRhCisgICAgc2l6ZV90IGNyeXB0b3NpemUgPSBzaXplb2YoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKSArIHNpemVvZihzaXplX3QpICogbnVtc3Vic2FtcGxlcyAqIDI7CisgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpyZXQgPSAoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKikgbWFsbG9jKGNyeXB0b3NpemUpOworICAgIGlmICghcmV0KSB7CisgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBhbGxvY2F0ZSAlenUgYnl0ZXMiLCBjcnlwdG9zaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldC0+bnVtc3Vic2FtcGxlcyA9IG51bXN1YnNhbXBsZXM7CisgICAgbWVtY3B5KHJldC0+a2V5LCBrZXksIDE2KTsKKyAgICBtZW1jcHkocmV0LT5pdiwgaXYsIDE2KTsKKyAgICByZXQtPm1vZGUgPSBtb2RlOworCisgICAgLy8gY2xlYXJieXRlcyBhbmQgZW5jcnlwdGVkYnl0ZXMgcG9pbnQgYXQgdGhlIGFjdHVhbCBkYXRhLCB3aGljaCBmb2xsb3dzCisgICAgcmV0LT5jbGVhcmJ5dGVzID0gKHNpemVfdCopIChyZXQgKyAxKTsgLy8gcG9pbnQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHN0cnVjdAorICAgIHJldC0+ZW5jcnlwdGVkYnl0ZXMgPSByZXQtPmNsZWFyYnl0ZXMgKyBudW1zdWJzYW1wbGVzOyAvLyBwb2ludCBhZnRlciB0aGUgY2xlYXIgc2l6ZXMKKworICAgIG1lbWNweShyZXQtPmNsZWFyYnl0ZXMsIGNsZWFyYnl0ZXMsIG51bXN1YnNhbXBsZXMgKiBzaXplb2Yoc2l6ZV90KSk7CisgICAgbWVtY3B5KHJldC0+ZW5jcnlwdGVkYnl0ZXMsIGVuY3J5cHRlZGJ5dGVzLCBudW1zdWJzYW1wbGVzICogc2l6ZW9mKHNpemVfdCkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19kZWxldGUoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiBpbmZvKSB7CisgICAgZnJlZShpbmZvKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK3NpemVfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0TnVtU3ViU2FtcGxlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qIGNpKSB7CisgICAgcmV0dXJuIGNpLT5udW1zdWJzYW1wbGVzOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRLZXkoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiBjaSwgdWludDhfdCAqZHN0KSB7CisgICAgaWYgKCFjaSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIWRzdCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBtZW1jcHkoZHN0LCBjaS0+a2V5LCAxNik7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0SVYoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiBjaSwgdWludDhfdCAqZHN0KSB7CisgICAgaWYgKCFjaSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIWRzdCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBtZW1jcHkoZHN0LCBjaS0+aXYsIDE2KTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK2NyeXB0b2luZm9fbW9kZV90IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRNb2RlKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyogY2kpIHsKKyAgICBpZiAoIWNpKSB7CisgICAgICAgIHJldHVybiAoY3J5cHRvaW5mb19tb2RlX3QpIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIGNpLT5tb2RlOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRDbGVhckJ5dGVzKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyogY2ksIHNpemVfdCAqZHN0KSB7CisgICAgaWYgKCFjaSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIWRzdCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBtZW1jcHkoZHN0LCBjaS0+Y2xlYXJieXRlcywgc2l6ZW9mKHNpemVfdCkgKiBjaS0+bnVtc3Vic2FtcGxlcyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0RW5jcnlwdGVkQnl0ZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiBjaSwgc2l6ZV90ICpkc3QpIHsKKyAgICBpZiAoIWNpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghZHN0KSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIG1lbWNweShkc3QsIGNpLT5lbmNyeXB0ZWRieXRlcywgc2l6ZW9mKHNpemVfdCkgKiBjaS0+bnVtc3Vic2FtcGxlcyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworfSAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYzJmMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYUNyeXB0byIKKworCisjaW5jbHVkZSAiTmRrTWVkaWFDcnlwdG8uaCIKKyNpbmNsdWRlICJOZGtNZWRpYUNvZGVjLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKK30KKworCitzdGF0aWMgc3A8SUNyeXB0bz4gbWFrZUNyeXB0bygpIHsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQorICAgICAgICBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEucGxheWVyIikpOworCisgICAgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZSA9CisgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllclNlcnZpY2U+KGJpbmRlcik7CisKKyAgICBpZiAoc2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPElDcnlwdG8+IGNyeXB0byA9IHNlcnZpY2UtPm1ha2VDcnlwdG8oKTsKKworICAgIGlmIChjcnlwdG8gPT0gTlVMTCB8fCAoY3J5cHRvLT5pbml0Q2hlY2soKSAhPSBPSyAmJiBjcnlwdG8tPmluaXRDaGVjaygpICE9IE5PX0lOSVQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBjcnlwdG87Cit9CisKK3N0cnVjdCBBTWVkaWFDcnlwdG8geworICAgIHNwPElDcnlwdG8+IG1DcnlwdG87Cit9OworCisKK2V4dGVybiAiQyIgeworCisKK0VYUE9SVAorYm9vbCBBTWVkaWFDcnlwdG9faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgQU1lZGlhVVVJRCB1dWlkKSB7CisgICAgc3A8SUNyeXB0bz4gY3J5cHRvID0gbWFrZUNyeXB0bygpOworICAgIGlmIChjcnlwdG8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBjcnlwdG8tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhQ3J5cHRvX3JlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyICptaW1lKSB7CisgICAgc3A8SUNyeXB0bz4gY3J5cHRvID0gbWFrZUNyeXB0bygpOworICAgIGlmIChjcnlwdG8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBjcnlwdG8tPnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChtaW1lKTsKK30KKworRVhQT1JUCitBTWVkaWFDcnlwdG8qIEFNZWRpYUNyeXB0b19uZXcoY29uc3QgQU1lZGlhVVVJRCB1dWlkLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YXNpemUpIHsKKworICAgIHNwPElDcnlwdG8+IHRtcCA9IG1ha2VDcnlwdG8oKTsKKyAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHRtcC0+Y3JlYXRlUGx1Z2luKHV1aWQsIGRhdGEsIGRhdGFzaXplKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEFNZWRpYUNyeXB0byAqY3J5cHRvID0gbmV3IEFNZWRpYUNyeXB0bygpOworICAgIGNyeXB0by0+bUNyeXB0byA9IHRtcDsKKworICAgIHJldHVybiBjcnlwdG87Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFDcnlwdG9fZGVsZXRlKEFNZWRpYUNyeXB0byogY3J5cHRvKSB7CisgICAgZGVsZXRlIGNyeXB0bzsKK30KKworCisKK30gLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG9Qcml2LmggYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG9Qcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlYTkyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUNyeXB0b1ByaXYuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9DUllQVE9fUFJJVl9ICisjZGVmaW5lIF9OREtfTUVESUFfQ1JZUFRPX1BSSVZfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0cnVjdCBBTWVkaWFDcnlwdG8geworICAgIHNwPElDcnlwdG8+IG1DcnlwdG87Cit9OworCisjZW5kaWYgLy8gX05ES19NRURJQV9DUllQVE9fUFJJVl9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTEwNDhjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcApAQCAtMCwwICsxLDcyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFEcm0iCisKKyNpbmNsdWRlICJOZGtNZWRpYURybS5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JRHJtLmg+CisjaW5jbHVkZSA8bWVkaWEvSURybUNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxuZGsvTmRrTWVkaWFDcnlwdG8uaD4KKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKwordHlwZWRlZiBWZWN0b3I8dWludDhfdD4gaWR2ZWNfdDsKKworc3RydWN0IERybUxpc3RlbmVyOiB2aXJ0dWFsIHB1YmxpYyBCbkRybUNsaWVudAoreworcHJpdmF0ZToKKyAgICBBTWVkaWFEcm0gKm1PYmo7CisgICAgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBtTGlzdGVuZXI7CisKK3B1YmxpYzoKKyAgICBEcm1MaXN0ZW5lcihBTWVkaWFEcm0gKm9iaiwgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgOiBtT2JqKG9iaiksIG1MaXN0ZW5lcihsaXN0ZW5lcikge30KKyAgICB2b2lkIG5vdGlmeShEcm1QbHVnaW46OkV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgUGFyY2VsICpvYmopOworfTsKKworc3RydWN0IEFNZWRpYURybSB7CisgICAgc3A8SURybT4gbURybTsKKyAgICBzcDxJRHJtQ2xpZW50PiBtRHJtQ2xpZW50OworICAgIExpc3Q8aWR2ZWNfdD4gbUlkczsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtUXVlcnlSZXN1bHRzOworICAgIFZlY3Rvcjx1aW50OF90PiBtS2V5UmVxdWVzdDsKKyAgICBWZWN0b3I8dWludDhfdD4gbVByb3Zpc2lvblJlcXVlc3Q7CisgICAgU3RyaW5nOCBtUHJvdmlzaW9uVXJsOworICAgIFN0cmluZzggbVByb3BlcnR5U3RyaW5nOworICAgIFZlY3Rvcjx1aW50OF90PiBtUHJvcGVydHlCeXRlQXJyYXk7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4gPiBtU2VjdXJlU3RvcHM7CisgICAgc3A8RHJtTGlzdGVuZXI+IG1MaXN0ZW5lcjsKK307CisKK3ZvaWQgRHJtTGlzdGVuZXI6Om5vdGlmeShEcm1QbHVnaW46OkV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgUGFyY2VsICpvYmopIHsKKyAgICBpZiAoIW1MaXN0ZW5lcikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQU1lZGlhRHJtU2Vzc2lvbklkIHNlc3Npb25JZCA9IHtOVUxMLCAwfTsKKyAgICBpbnQzMl90IHNlc3Npb25JZFNpemUgPSBvYmotPnJlYWRJbnQzMigpOworICAgIGlmIChzZXNzaW9uSWRTaXplKSB7CisgICAgICAgIHVpbnQ4X3QgKnNlc3Npb25JZERhdGEgPSBuZXcgdWludDhfdFtzZXNzaW9uSWRTaXplXTsKKyAgICAgICAgc2Vzc2lvbklkLnB0ciA9IHNlc3Npb25JZERhdGE7CisgICAgICAgIHNlc3Npb25JZC5sZW5ndGggPSBzZXNzaW9uSWRTaXplOworICAgICAgICBvYmotPnJlYWQoc2Vzc2lvbklkRGF0YSwgc2Vzc2lvbklkLmxlbmd0aCk7CisgICAgfQorCisgICAgaW50MzJfdCBkYXRhU2l6ZSA9IG9iai0+cmVhZEludDMyKCk7CisgICAgdWludDhfdCAqZGF0YSA9IE5VTEw7CisgICAgaWYgKGRhdGFTaXplKSB7CisgICAgICAgIGRhdGEgPSBuZXcgdWludDhfdFtkYXRhU2l6ZV07CisgICAgICAgIG9iai0+cmVhZChkYXRhLCBkYXRhU2l6ZSk7CisgICAgfQorCisgICAgLy8gdHJhbnNsYXRlIERybVBsdWdpbiBldmVudCB0eXBlcyBpbnRvIHRoZWlyIE5ESyBlcXVpdmFsZW50cworICAgIEFNZWRpYURybUV2ZW50VHlwZSBuZGtFdmVudFR5cGU7CisgICAgc3dpdGNoKGV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50UHJvdmlzaW9uUmVxdWlyZWQ6CisgICAgICAgICAgICBuZGtFdmVudFR5cGUgPSBFVkVOVF9QUk9WSVNJT05fUkVRVUlSRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudEtleU5lZWRlZDoKKyAgICAgICAgICAgIG5ka0V2ZW50VHlwZSA9IEVWRU5UX0tFWV9SRVFVSVJFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5RXhwaXJlZDoKKyAgICAgICAgICAgIG5ka0V2ZW50VHlwZSA9IEVWRU5UX0tFWV9FWFBJUkVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRWZW5kb3JEZWZpbmVkOgorICAgICAgICAgICAgbmRrRXZlbnRUeXBlID0gRVZFTlRfVkVORE9SX0RFRklORUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGV2ZW50IERybVBsdWdpbjo6RXZlbnRUeXBlICVkLCBpZ25vcmVkIiwgKGludClldmVudFR5cGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICgqbUxpc3RlbmVyKShtT2JqLCAmc2Vzc2lvbklkLCBuZGtFdmVudFR5cGUsIGV4dHJhLCBkYXRhLCBkYXRhU2l6ZSk7CisKKyAgICBkZWxldGUgW10gc2Vzc2lvbklkLnB0cjsKKyAgICBkZWxldGUgW10gZGF0YTsKK30KKworCitleHRlcm4gIkMiIHsKKworc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXNfdCBzdGF0dXMpIHsKKyAgICBtZWRpYV9zdGF0dXNfdCByZXN1bHQgPSBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIE9LOgorICAgICAgICAgICAgcmVzdWx0ID0gQU1FRElBX09LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6RVJST1JfRFJNX05PVF9QUk9WSVNJT05FRDoKKyAgICAgICAgICAgIHJlc3VsdCA9IEFNRURJQV9EUk1fTk9UX1BST1ZJU0lPTkVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6RVJST1JfRFJNX1JFU09VUkNFX0JVU1k6CisgICAgICAgICAgICByZXN1bHQgPSBBTUVESUFfRFJNX1JFU09VUkNFX0JVU1k7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQ6CisgICAgICAgICAgICByZXN1bHQgPSBBTUVESUFfRFJNX0RFVklDRV9SRVZPS0VEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU6CisgICAgICAgICAgICByZXN1bHQgPSBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpFUlJPUl9EUk1fVEFNUEVSX0RFVEVDVEVEOgorICAgICAgICAgICAgcmVzdWx0ID0gQU1FRElBX0RSTV9UQU1QRVJfREVURUNURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOgorICAgICAgICAgICAgcmVzdWx0ID0gQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpFUlJPUl9EUk1fTk9fTElDRU5TRToKKyAgICAgICAgICAgIHJlc3VsdCA9IEFNRURJQV9EUk1fTkVFRF9LRVk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpFUlJPUl9EUk1fTElDRU5TRV9FWFBJUkVEOgorICAgICAgICAgICAgcmVzdWx0ID0gQU1FRElBX0RSTV9MSUNFTlNFX0VYUElSRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3A8SURybT4gQ3JlYXRlRHJtKCkgeworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CisgICAgICAgIHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5wbGF5ZXIiKSk7CisKKyAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0KKyAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyU2VydmljZT4oYmluZGVyKTsKKworICAgIGlmIChzZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8SURybT4gZHJtID0gc2VydmljZS0+bWFrZURybSgpOworCisgICAgaWYgKGRybSA9PSBOVUxMIHx8IChkcm0tPmluaXRDaGVjaygpICE9IE9LICYmIGRybS0+aW5pdENoZWNrKCkgIT0gTk9fSU5JVCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGRybTsKK30KKworCitzdGF0aWMgc3A8SURybT4gQ3JlYXRlRHJtRnJvbVVVSUQoY29uc3QgQU1lZGlhVVVJRCB1dWlkKSB7CisgICAgc3A8SURybT4gZHJtID0gQ3JlYXRlRHJtKCk7CisKKyAgICBpZiAoZHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gZHJtLT5jcmVhdGVQbHVnaW4odXVpZCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBkcm07Cit9CisKK0VYUE9SVAorYm9vbCBBTWVkaWFEcm1faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgQU1lZGlhVVVJRCB1dWlkLCBjb25zdCBjaGFyICptaW1lVHlwZSkgeworICAgIHNwPElEcm0+IGRybSA9IENyZWF0ZURybSgpOworCisgICAgaWYgKGRybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmc4IG1pbWVTdHIgPSBtaW1lVHlwZSA/IFN0cmluZzgobWltZVR5cGUpIDogU3RyaW5nOCgiIik7CisgICAgcmV0dXJuIGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVN0cik7Cit9CisKK0VYUE9SVAorQU1lZGlhRHJtKiBBTWVkaWFEcm1fY3JlYXRlQnlVVUlEKGNvbnN0IEFNZWRpYVVVSUQgdXVpZCkgeworICAgIEFNZWRpYURybSAqbU9iaiA9IG5ldyBBTWVkaWFEcm0oKTsKKyAgICBtT2JqLT5tRHJtID0gQ3JlYXRlRHJtRnJvbVVVSUQodXVpZCk7CisgICAgcmV0dXJuIG1PYmo7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFEcm1fcmVsZWFzZShBTWVkaWFEcm0gKm1PYmopIHsKKyAgICBpZiAobU9iai0+bURybSAhPSBOVUxMKSB7CisgICAgICAgIG1PYmotPm1Ecm0tPnNldExpc3RlbmVyKE5VTEwpOworICAgICAgICBtT2JqLT5tRHJtLT5kZXN0cm95UGx1Z2luKCk7CisgICAgICAgIG1PYmotPm1Ecm0uY2xlYXIoKTsKKyAgICB9CisgICAgZGVsZXRlIG1PYmo7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldE9uRXZlbnRMaXN0ZW5lcihBTWVkaWFEcm0gKm1PYmosIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIG1PYmotPm1MaXN0ZW5lciA9IG5ldyBEcm1MaXN0ZW5lcihtT2JqLCBsaXN0ZW5lcik7CisgICAgbU9iai0+bURybS0+c2V0TGlzdGVuZXIobU9iai0+bUxpc3RlbmVyKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCisKK3N0YXRpYyBib29sIGZpbmRJZChBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybUJ5dGVBcnJheSAmaWQsIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yICZpdGVyKSB7CisgICAgaXRlciA9IG1PYmotPm1JZHMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXRlciAhPSBtT2JqLT5tSWRzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdGVyLT5hcnJheSgpID09IGlkLnB0ciAmJiBpdGVyLT5zaXplKCkgPT0gaWQubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX29wZW5TZXNzaW9uKEFNZWRpYURybSAqbU9iaiwgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghc2Vzc2lvbklkKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPm9wZW5TZXNzaW9uKHNlc3Npb24pOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbU9iai0+bUlkcy5wdXNoX2Zyb250KHNlc3Npb24pOworICAgICAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyID0gbU9iai0+bUlkcy5iZWdpbigpOworICAgICAgICBzZXNzaW9uSWQtPnB0ciA9IGl0ZXItPmFycmF5KCk7CisgICAgICAgIHNlc3Npb25JZC0+bGVuZ3RoID0gaXRlci0+c2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9jbG9zZVNlc3Npb24oQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCkgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFzZXNzaW9uSWQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyOworICAgIGlmICghZmluZElkKG1PYmosICpzZXNzaW9uSWQsIGl0ZXIpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisgICAgbU9iai0+bURybS0+Y2xvc2VTZXNzaW9uKCppdGVyKTsKKyAgICBtT2JqLT5tSWRzLmVyYXNlKGl0ZXIpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldEtleVJlcXVlc3QoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluaXQsIHNpemVfdCBpbml0U2l6ZSwgY29uc3QgY2hhciAqbWltZVR5cGUsIEFNZWRpYURybUtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtS2V5VmFsdWUgKm9wdGlvbmFsUGFyYW1ldGVycywgc2l6ZV90IG51bU9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgY29uc3QgdWludDhfdCAqKmtleVJlcXVlc3QsIHNpemVfdCAqa2V5UmVxdWVzdFNpemUpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFtaW1lVHlwZSB8fCAhc2NvcGUgfHwgIWtleVJlcXVlc3QgfHwgIWtleVJlcXVlc3RTaXplKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCAqc2NvcGUsIGl0ZXIpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDhfdD4gbWRJbml0OworICAgIG1kSW5pdC5hcHBlbmRBcnJheShpbml0LCBpbml0U2l6ZSk7CisgICAgRHJtUGx1Z2luOjpLZXlUeXBlIG1kS2V5VHlwZTsKKyAgICBzd2l0Y2ggKGtleVR5cGUpIHsKKyAgICAgICAgY2FzZSBLRVlfVFlQRV9TVFJFQU1JTkc6CisgICAgICAgICAgICBtZEtleVR5cGUgPSBEcm1QbHVnaW46OmtLZXlUeXBlX1N0cmVhbWluZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtFWV9UWVBFX09GRkxJTkU6CisgICAgICAgICAgICBtZEtleVR5cGUgPSBEcm1QbHVnaW46OmtLZXlUeXBlX09mZmxpbmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLRVlfVFlQRV9SRUxFQVNFOgorICAgICAgICAgICAgbWRLZXlUeXBlID0gRHJtUGx1Z2luOjprS2V5VHlwZV9SZWxlYXNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtZE9wdGlvbmFsUGFyYW1ldGVyczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bU9wdGlvbmFsUGFyYW1ldGVyczsgaSsrKSB7CisgICAgICAgIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLmFkZChTdHJpbmc4KG9wdGlvbmFsUGFyYW1ldGVyc1tpXS5tS2V5KSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4KG9wdGlvbmFsUGFyYW1ldGVyc1tpXS5tVmFsdWUpKTsKKyAgICB9CisgICAgU3RyaW5nOCBkZWZhdWx0VXJsOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmdldEtleVJlcXVlc3QoKml0ZXIsIG1kSW5pdCwgU3RyaW5nOChtaW1lVHlwZSksCisgICAgICAgICAgICBtZEtleVR5cGUsIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLCBtT2JqLT5tS2V5UmVxdWVzdCwgZGVmYXVsdFVybCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmtleVJlcXVlc3QgPSBtT2JqLT5tS2V5UmVxdWVzdC5hcnJheSgpOworICAgICAgICAqa2V5UmVxdWVzdFNpemUgPSBtT2JqLT5tS2V5UmVxdWVzdC5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3Byb3ZpZGVLZXlSZXNwb25zZShBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNjb3BlICpzY29wZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZVNpemUsIEFNZWRpYURybUtleVNldElkICprZXlTZXRJZCkgeworCisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXNjb3BlIHx8ICFyZXNwb25zZSB8fCAhcmVzcG9uc2VTaXplIHx8ICFrZXlTZXRJZCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yIGl0ZXI7CisgICAgaWYgKCFmaW5kSWQobU9iaiwgKnNjb3BlLCBpdGVyKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorICAgIFZlY3Rvcjx1aW50OF90PiBtZFJlc3BvbnNlOworICAgIG1kUmVzcG9uc2UuYXBwZW5kQXJyYXkocmVzcG9uc2UsIHJlc3BvbnNlU2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gbWRLZXlTZXRJZDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5wcm92aWRlS2V5UmVzcG9uc2UoKml0ZXIsIG1kUmVzcG9uc2UsIG1kS2V5U2V0SWQpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbU9iai0+bUlkcy5wdXNoX2Zyb250KG1kS2V5U2V0SWQpOworICAgICAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyID0gbU9iai0+bUlkcy5iZWdpbigpOworICAgICAgICBrZXlTZXRJZC0+cHRyID0gaXRlci0+YXJyYXkoKTsKKyAgICAgICAga2V5U2V0SWQtPmxlbmd0aCA9IGl0ZXItPnNpemUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBrZXlTZXRJZC0+cHRyID0gTlVMTDsKKyAgICAgICAga2V5U2V0SWQtPmxlbmd0aCA9IDA7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3Jlc3RvcmVLZXlzKEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IEFNZWRpYURybUtleVNldElkICprZXlTZXRJZCkgeworCisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXNlc3Npb25JZCB8fCAha2V5U2V0SWQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCAqc2Vzc2lvbklkLCBpdGVyKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorICAgIFZlY3Rvcjx1aW50OF90PiBrZXlTZXQ7CisgICAga2V5U2V0LmFwcGVuZEFycmF5KGtleVNldElkLT5wdHIsIGtleVNldElkLT5sZW5ndGgpOworICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+cmVzdG9yZUtleXMoKml0ZXIsIGtleVNldCkpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9yZW1vdmVLZXlzKEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICprZXlTZXRJZCkgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFrZXlTZXRJZCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCAqa2V5U2V0SWQsIGl0ZXIpKSB7CisgICAgICAgIFZlY3Rvcjx1aW50OF90PiBrZXlTZXQ7CisgICAgICAgIGtleVNldC5hcHBlbmRBcnJheShrZXlTZXRJZC0+cHRyLCBrZXlTZXRJZC0+bGVuZ3RoKTsKKyAgICAgICAgc3RhdHVzID0gbU9iai0+bURybS0+cmVtb3ZlS2V5cyhrZXlTZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IG1PYmotPm1Ecm0tPnJlbW92ZUtleXMoKml0ZXIpOworICAgICAgICBtT2JqLT5tSWRzLmVyYXNlKGl0ZXIpOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3F1ZXJ5S2V5U3RhdHVzKEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIEFNZWRpYURybUtleVZhbHVlICprZXlWYWx1ZVBhaXJzLCBzaXplX3QgKm51bVBhaXJzKSB7CisKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghc2Vzc2lvbklkIHx8ICFudW1QYWlycykgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyOworICAgIGlmICghZmluZElkKG1PYmosICpzZXNzaW9uSWQsIGl0ZXIpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5xdWVyeUtleVN0YXR1cygqaXRlciwgbU9iai0+bVF1ZXJ5UmVzdWx0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAqbnVtUGFpcnMgPSAwOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CisgICAgfQorCisgICAgaWYgKG1PYmotPm1RdWVyeVJlc3VsdHMuc2l6ZSgpID4gKm51bVBhaXJzKSB7CisgICAgICAgICpudW1QYWlycyA9IG1PYmotPm1RdWVyeVJlc3VsdHMuc2l6ZSgpOworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TSE9SVF9CVUZGRVI7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT2JqLT5tUXVlcnlSZXN1bHRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGtleVZhbHVlUGFpcnNbaV0ubUtleSA9IG1PYmotPm1RdWVyeVJlc3VsdHMua2V5QXQoaSkuc3RyaW5nKCk7CisgICAgICAgIGtleVZhbHVlUGFpcnNbaV0ubVZhbHVlID0gbU9iai0+bVF1ZXJ5UmVzdWx0cy5rZXlBdChpKS5zdHJpbmcoKTsKKyAgICB9CisgICAgKm51bVBhaXJzID0gbU9iai0+bVF1ZXJ5UmVzdWx0cy5zaXplKCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0UHJvdmlzaW9uUmVxdWVzdChBTWVkaWFEcm0gKm1PYmosIGNvbnN0IHVpbnQ4X3QgKipwcm92aXNpb25SZXF1ZXN0LAorICAgICAgICBzaXplX3QgKnByb3Zpc2lvblJlcXVlc3RTaXplLCBjb25zdCBjaGFyICoqc2VydmVyVXJsKSB7CisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXByb3Zpc2lvblJlcXVlc3QgfHwgIXByb3Zpc2lvblJlcXVlc3RTaXplIHx8ICEqcHJvdmlzaW9uUmVxdWVzdFNpemUgfHwgIXNlcnZlclVybCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCgiIiksIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgbU9iai0+bVByb3Zpc2lvblJlcXVlc3QsIG1PYmotPm1Qcm92aXNpb25VcmwpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICAgICpwcm92aXNpb25SZXF1ZXN0ID0gbU9iai0+bVByb3Zpc2lvblJlcXVlc3QuYXJyYXkoKTsKKyAgICAgICAgKnByb3Zpc2lvblJlcXVlc3RTaXplID0gbU9iai0+bVByb3Zpc2lvblJlcXVlc3Quc2l6ZSgpOworICAgICAgICAqc2VydmVyVXJsID0gbU9iai0+bVByb3Zpc2lvblVybC5zdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgY29uc3QgdWludDhfdCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZVNpemUpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghcmVzcG9uc2UgfHwgIXJlc3BvbnNlU2l6ZSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50OF90PiBtZFJlc3BvbnNlOworICAgIG1kUmVzcG9uc2UuYXBwZW5kQXJyYXkocmVzcG9uc2UsIHJlc3BvbnNlU2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gdW51c2VkOworICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKG1kUmVzcG9uc2UsIHVudXNlZCwgdW51c2VkKSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFNlY3VyZVN0b3BzKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgQU1lZGlhRHJtU2VjdXJlU3RvcCAqc2VjdXJlU3RvcHMsIHNpemVfdCAqbnVtU2VjdXJlU3RvcHMpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFudW1TZWN1cmVTdG9wcykgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRTZWN1cmVTdG9wcyhtT2JqLT5tU2VjdXJlU3RvcHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgKm51bVNlY3VyZVN0b3BzID0gMDsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworICAgIH0KKyAgICBpZiAoKm51bVNlY3VyZVN0b3BzIDwgbU9iai0+bVNlY3VyZVN0b3BzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TSE9SVF9CVUZGRVI7CisgICAgfQorICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID46Oml0ZXJhdG9yIGl0ZXIgPSBtT2JqLT5tU2VjdXJlU3RvcHMuYmVnaW4oKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGl0ZXIgIT0gbU9iai0+bVNlY3VyZVN0b3BzLmVuZCgpKSB7CisgICAgICAgIHNlY3VyZVN0b3BzW2ldLnB0ciA9IGl0ZXItPmFycmF5KCk7CisgICAgICAgIHNlY3VyZVN0b3BzW2ldLmxlbmd0aCA9IGl0ZXItPnNpemUoKTsKKyAgICAgICAgKytpdGVyOworICAgICAgICArK2k7CisgICAgfQorICAgICpudW1TZWN1cmVTdG9wcyA9IG1PYmotPm1TZWN1cmVTdG9wcy5zaXplKCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVsZWFzZVNlY3VyZVN0b3BzKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtU2VjdXJlU3RvcCAqc3NSZWxlYXNlKSB7CisKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghc3NSZWxlYXNlKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQ4X3Q+IHJlbGVhc2U7CisgICAgcmVsZWFzZS5hcHBlbmRBcnJheShzc1JlbGVhc2UtPnB0ciwgc3NSZWxlYXNlLT5sZW5ndGgpOworICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+cmVsZWFzZVNlY3VyZVN0b3BzKHJlbGVhc2UpKTsKK30KKworCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRQcm9wZXJ0eVN0cmluZyhBTWVkaWFEcm0gKm1PYmosIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwKKyAgICAgICAgY29uc3QgY2hhciAqKnByb3BlcnR5VmFsdWUpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFwcm9wZXJ0eU5hbWUgfHwgIXByb3BlcnR5VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4KHByb3BlcnR5TmFtZSksCisgICAgICAgICAgICBtT2JqLT5tUHJvcGVydHlTdHJpbmcpOworCisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAqcHJvcGVydHlWYWx1ZSA9IG1PYmotPm1Qcm9wZXJ0eVN0cmluZy5zdHJpbmcoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqcHJvcGVydHlWYWx1ZSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0UHJvcGVydHlCeXRlQXJyYXkoQU1lZGlhRHJtICptT2JqLAorICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsIEFNZWRpYURybUJ5dGVBcnJheSAqcHJvcGVydHlWYWx1ZSkgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFwcm9wZXJ0eU5hbWUgfHwgIXByb3BlcnR5VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4KHByb3BlcnR5TmFtZSksCisgICAgICAgICAgICBtT2JqLT5tUHJvcGVydHlCeXRlQXJyYXkpOworCisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBwcm9wZXJ0eVZhbHVlLT5wdHIgPSBtT2JqLT5tUHJvcGVydHlCeXRlQXJyYXkuYXJyYXkoKTsKKyAgICAgICAgcHJvcGVydHlWYWx1ZS0+bGVuZ3RoID0gbU9iai0+bVByb3BlcnR5Qnl0ZUFycmF5LnNpemUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcm9wZXJ0eVZhbHVlLT5wdHIgPSBOVUxMOworICAgICAgICBwcm9wZXJ0eVZhbHVlLT5sZW5ndGggPSAwOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldFByb3BlcnR5U3RyaW5nKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPnNldFByb3BlcnR5U3RyaW5nKFN0cmluZzgocHJvcGVydHlOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCh2YWx1ZSkpKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0UHJvcGVydHlCeXRlQXJyYXkoQU1lZGlhRHJtICptT2JqLAorICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsIGNvbnN0IHVpbnQ4X3QgKnZhbHVlLCBzaXplX3QgdmFsdWVTaXplKSB7CisKKyAgICBWZWN0b3I8dWludDhfdD4gYnl0ZUFycmF5OworICAgIGJ5dGVBcnJheS5hcHBlbmRBcnJheSh2YWx1ZSwgdmFsdWVTaXplKTsKKworICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+Z2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOChwcm9wZXJ0eU5hbWUpLAorICAgICAgICAgICAgICAgICAgICBieXRlQXJyYXkpKTsKK30KKworCitzdGF0aWMgbWVkaWFfc3RhdHVzX3QgZW5jcnlwdF9kZWNyeXB0X2NvbW1vbihBTWVkaWFEcm0gKm1PYmosCisgICAgICAgIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAmc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBjaGFyICpjaXBoZXJBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCB1aW50OF90ICppdiwKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXQsIHVpbnQ4X3QgKm91dHB1dCwgc2l6ZV90IGRhdGFTaXplLCBib29sIGVuY3J5cHQpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCBzZXNzaW9uSWQsIGl0ZXIpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5zZXRDaXBoZXJBbGdvcml0aG0oKml0ZXIsIFN0cmluZzgoY2lwaGVyQWxnb3JpdGhtKSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleUlkVmVjOworICAgIGNvbnN0IHNpemVfdCBrS2V5SWRTaXplID0gMTY7CisgICAga2V5SWRWZWMuYXBwZW5kQXJyYXkoa2V5SWQsIGtLZXlJZFNpemUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGlucHV0VmVjOworICAgIGlucHV0VmVjLmFwcGVuZEFycmF5KGlucHV0LCBkYXRhU2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gaXZWZWM7CisgICAgY29uc3Qgc2l6ZV90IGtJdlNpemUgPSAxNjsKKyAgICBpdlZlYy5hcHBlbmRBcnJheShpdiwga0l2U2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gb3V0cHV0VmVjOworICAgIGlmIChlbmNyeXB0KSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmVuY3J5cHQoKml0ZXIsIGtleUlkVmVjLCBpbnB1dFZlYywgaXZWZWMsIG91dHB1dFZlYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+ZGVjcnlwdCgqaXRlciwga2V5SWRWZWMsIGlucHV0VmVjLCBpdlZlYywgb3V0cHV0VmVjKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtZW1jcHkob3V0cHV0LCBvdXRwdXRWZWMuYXJyYXkoKSwgb3V0cHV0VmVjLnNpemUoKSk7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZW5jcnlwdChBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBjaGFyICpjaXBoZXJBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCB1aW50OF90ICppdiwKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXQsIHVpbnQ4X3QgKm91dHB1dCwgc2l6ZV90IGRhdGFTaXplKSB7CisgICAgaWYgKCFzZXNzaW9uSWQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgcmV0dXJuIGVuY3J5cHRfZGVjcnlwdF9jb21tb24obU9iaiwgKnNlc3Npb25JZCwgY2lwaGVyQWxnb3JpdGhtLCBrZXlJZCwgaXYsCisgICAgICAgICAgICBpbnB1dCwgb3V0cHV0LCBkYXRhU2l6ZSwgdHJ1ZSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2RlY3J5cHQoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqY2lwaGVyQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqaXYsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHNpemVfdCBkYXRhU2l6ZSkgeworICAgIGlmICghc2Vzc2lvbklkKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIHJldHVybiBlbmNyeXB0X2RlY3J5cHRfY29tbW9uKG1PYmosICpzZXNzaW9uSWQsIGNpcGhlckFsZ29yaXRobSwga2V5SWQsIGl2LAorICAgICAgICAgICAgaW5wdXQsIG91dHB1dCwgZGF0YVNpemUsIGZhbHNlKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2lnbihBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBjaGFyICptYWNBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCB1aW50OF90ICptZXNzYWdlLCBzaXplX3QgbWVzc2FnZVNpemUsCisgICAgICAgIHVpbnQ4X3QgKnNpZ25hdHVyZSwgc2l6ZV90ICpzaWduYXR1cmVTaXplKSB7CisKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghc2Vzc2lvbklkKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yIGl0ZXI7CisgICAgaWYgKCFmaW5kSWQobU9iaiwgKnNlc3Npb25JZCwgaXRlcikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPnNldE1hY0FsZ29yaXRobSgqaXRlciwgU3RyaW5nOChtYWNBbGdvcml0aG0pKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDhfdD4ga2V5SWRWZWM7CisgICAgY29uc3Qgc2l6ZV90IGtLZXlJZFNpemUgPSAxNjsKKyAgICBrZXlJZFZlYy5hcHBlbmRBcnJheShrZXlJZCwga0tleUlkU2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gbWVzc2FnZVZlYzsKKyAgICBtZXNzYWdlVmVjLmFwcGVuZEFycmF5KG1lc3NhZ2UsIG1lc3NhZ2VTaXplKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBzaWduYXR1cmVWZWM7CisgICAgc3RhdHVzID0gbU9iai0+bURybS0+c2lnbigqaXRlciwga2V5SWRWZWMsIG1lc3NhZ2VWZWMsIHNpZ25hdHVyZVZlYyk7CisgICAgaWYgKHNpZ25hdHVyZVZlYy5zaXplKCkgPiAqc2lnbmF0dXJlU2l6ZSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TSE9SVF9CVUZGRVI7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbWVtY3B5KHNpZ25hdHVyZSwgc2lnbmF0dXJlVmVjLmFycmF5KCksIHNpZ25hdHVyZVZlYy5zaXplKCkpOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3ZlcmlmeShBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBjaGFyICptYWNBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCBjb25zdCB1aW50OF90ICptZXNzYWdlLCBzaXplX3QgbWVzc2FnZVNpemUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNpZ25hdHVyZSwgc2l6ZV90IHNpZ25hdHVyZVNpemUpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFzZXNzaW9uSWQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCAqc2Vzc2lvbklkLCBpdGVyKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+c2V0TWFjQWxnb3JpdGhtKCppdGVyLCBTdHJpbmc4KG1hY0FsZ29yaXRobSkpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50OF90PiBrZXlJZFZlYzsKKyAgICBjb25zdCBzaXplX3Qga0tleUlkU2l6ZSA9IDE2OworICAgIGtleUlkVmVjLmFwcGVuZEFycmF5KGtleUlkLCBrS2V5SWRTaXplKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBtZXNzYWdlVmVjOworICAgIG1lc3NhZ2VWZWMuYXBwZW5kQXJyYXkobWVzc2FnZSwgbWVzc2FnZVNpemUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNpZ25hdHVyZVZlYzsKKyAgICBzaWduYXR1cmVWZWMuYXBwZW5kQXJyYXkoc2lnbmF0dXJlLCBzaWduYXR1cmVTaXplKTsKKworICAgIGJvb2wgbWF0Y2g7CisgICAgc3RhdHVzID0gbU9iai0+bURybS0+dmVyaWZ5KCppdGVyLCBrZXlJZFZlYywgbWVzc2FnZVZlYywgc2lnbmF0dXJlVmVjLCBtYXRjaCk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICByZXR1cm4gbWF0Y2ggPyBBTUVESUFfT0sgOiBBTUVESUFfRFJNX1ZFUklGWV9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKK30KKworfSAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTdkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYUV4dHJhY3RvciIKKworCisjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgorI2luY2x1ZGUgIk5ka01lZGlhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKK30KKworc3RydWN0IEFNZWRpYUV4dHJhY3RvciB7CisgICAgc3A8TnVNZWRpYUV4dHJhY3Rvcj4gbUltcGw7CisgICAgc3A8QUJ1ZmZlcj4gbVBzc2hCdWY7CisKK307CisKK2V4dGVybiAiQyIgeworCitFWFBPUlQKK0FNZWRpYUV4dHJhY3RvciogQU1lZGlhRXh0cmFjdG9yX25ldygpIHsKKyAgICBBTE9HVigiY3RvciIpOworICAgIEFNZWRpYUV4dHJhY3RvciAqbURhdGEgPSBuZXcgQU1lZGlhRXh0cmFjdG9yKCk7CisgICAgbURhdGEtPm1JbXBsID0gbmV3IE51TWVkaWFFeHRyYWN0b3IoKTsKKyAgICByZXR1cm4gbURhdGE7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShBTWVkaWFFeHRyYWN0b3IgKm1EYXRhKSB7CisgICAgQUxPR1YoImR0b3IiKTsKKyAgICBkZWxldGUgbURhdGE7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKSB7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJWQsICVsbGQsICVsbGQpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZShBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCBjb25zdCBjaGFyICpsb2NhdGlvbikgeworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIGxvY2F0aW9uKTsKKyAgICAvLyBUT0RPOiBhZGQgaGVhZGVyIHN1cHBvcnQKKworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGpvYmplY3Qgc2VydmljZSA9IE5VTEw7CisgICAgaWYgKGVudiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJzZXREYXRhU291cmNlKHBhdGgpIG11c3QgYmUgY2FsbGVkIGZyb20gSmF2YSB0aHJlYWQiKTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIGpjbGFzcyBtZWRpYWh0dHBjbGFzcyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhSFRUUFNlcnZpY2UiKTsKKyAgICBpZiAobWVkaWFodHRwY2xhc3MgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBNZWRpYUh0dHBTZXJ2aWNlIik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBqbWV0aG9kSUQgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChtZWRpYWh0dHBjbGFzcywKKyAgICAgICAgICAgICJjcmVhdGVIdHRwU2VydmljZUJpbmRlcklmTmVjZXNzYXJ5IiwgIihMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvb3MvSUJpbmRlcjsiKTsKKyAgICBpZiAobWVkaWFIdHRwQ3JlYXRlTWV0aG9kID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgbWV0aG9kIik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBqc3RyaW5nIGpsb2MgPSBlbnYtPk5ld1N0cmluZ1VURihsb2NhdGlvbik7CisKKyAgICBzZXJ2aWNlID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG1lZGlhaHR0cGNsYXNzLCBtZWRpYUh0dHBDcmVhdGVNZXRob2QsIGpsb2MpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoamxvYyk7CisKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7CisgICAgaWYgKHNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBpYmluZGVyRm9ySmF2YU9iamVjdChlbnYsIHNlcnZpY2UpOworICAgICAgICBodHRwU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihiaW5kZXIpOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgbG9jYXRpb24sIE5VTEwpOworICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7Cit9CisKK0VYUE9SVAorc2l6ZV90IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0NvdW50KEFNZWRpYUV4dHJhY3RvciAqbURhdGEpIHsKKyAgICByZXR1cm4gbURhdGEtPm1JbXBsLT5jb3VudFRyYWNrcygpOworfQorCitFWFBPUlQKK0FNZWRpYUZvcm1hdCogQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KEFNZWRpYUV4dHJhY3RvciAqbURhdGEsIHNpemVfdCBpZHgpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIG1EYXRhLT5tSW1wbC0+Z2V0VHJhY2tGb3JtYXQoaWR4LCAmZm9ybWF0KTsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJmZvcm1hdCk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsIHNpemVfdCBpZHgpIHsKKyAgICBBTE9HVigic2VsZWN0VHJhY2soJXp1KSIsIGlkeCk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUltcGwtPnNlbGVjdFRyYWNrKGlkeCkpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsIHNpemVfdCBpZHgpIHsKKyAgICBBTE9HVigidW5zZWxlY3RUcmFjayglenUpIiwgaWR4KTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tSW1wbC0+dW5zZWxlY3RUcmFjayhpZHgpKTsKK30KKworRVhQT1JUCitib29sIEFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKEFNZWRpYUV4dHJhY3RvciAqbURhdGEpIHsKKyAgICAvL0FMT0dWKCJhZHZhbmNlIik7CisgICAgcmV0dXJuIG1EYXRhLT5tSW1wbC0+YWR2YW5jZSgpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZWVrVG8oQU1lZGlhRXh0cmFjdG9yICpleCwgaW50NjRfdCBzZWVrUG9zVXMsIFNlZWtNb2RlIG1vZGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNmbW9kZTsKKyAgICBpZiAobW9kZSA9PSBBTUVESUFFWFRSQUNUT1JfU0VFS19QUkVWSU9VU19TWU5DKSB7CisgICAgICAgIHNmbW9kZSA9IGFuZHJvaWQ6Ok1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOworICAgIH0gZWxzZSBpZiAobW9kZSA9PSBBTUVESUFFWFRSQUNUT1JfU0VFS19DTE9TRVNUX1NZTkMpIHsKKyAgICAgICAgc2Ztb2RlID0gYW5kcm9pZDo6TWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzsKKyAgICB9IGVsc2UgeworICAgICAgICBzZm1vZGUgPSBhbmRyb2lkOjpNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOworICAgIH0KKworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXgtPm1JbXBsLT5zZWVrVG8oc2Vla1Bvc1VzLCBzZm1vZGUpKTsKK30KKworRVhQT1JUCitzc2l6ZV90IEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBjYXBhY2l0eSkgeworICAgIC8vQUxPR1YoInJlYWRTYW1wbGVEYXRhIik7CisgICAgc3A8QUJ1ZmZlcj4gdG1wID0gbmV3IEFCdWZmZXIoYnVmZmVyLCBjYXBhY2l0eSk7CisgICAgaWYgKG1EYXRhLT5tSW1wbC0+cmVhZFNhbXBsZURhdGEodG1wKSA9PSBPSykgeworICAgICAgICByZXR1cm4gdG1wLT5zaXplKCk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworRVhQT1JUCit1aW50MzJfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRmxhZ3MoQU1lZGlhRXh0cmFjdG9yICptRGF0YSkgeworICAgIGludCBzYW1wbGVGbGFncyA9IDA7CisgICAgc3A8TWV0YURhdGE+IG1ldGE7CisgICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1JbXBsLT5nZXRTYW1wbGVNZXRhKCZtZXRhKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW50MzJfdCB2YWw7CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZ2YWwpICYmIHZhbCAhPSAwKSB7CisgICAgICAgIHNhbXBsZUZsYWdzIHw9IEFNRURJQUVYVFJBQ1RPUl9TQU1QTEVfRkxBR19TWU5DOworICAgIH0KKworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBzYW1wbGVGbGFncyB8PSBBTUVESUFFWFRSQUNUT1JfU0FNUExFX0ZMQUdfRU5DUllQVEVEOworICAgIH0KKyAgICByZXR1cm4gc2FtcGxlRmxhZ3M7Cit9CisKK0VYUE9SVAoraW50IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUcmFja0luZGV4KEFNZWRpYUV4dHJhY3RvciAqbURhdGEpIHsKKyAgICBzaXplX3QgaWR4OworICAgIGlmIChtRGF0YS0+bUltcGwtPmdldFNhbXBsZVRyYWNrSW5kZXgoJmlkeCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaWR4OworfQorCitFWFBPUlQKK2ludDY0X3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUoQU1lZGlhRXh0cmFjdG9yICptRGF0YSkgeworICAgIGludDY0X3QgdGltZTsKKyAgICBpZiAobURhdGEtPm1JbXBsLT5nZXRTYW1wbGVUaW1lKCZ0aW1lKSAhPSBPSykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiB0aW1lOworfQorCitFWFBPUlQKK1Bzc2hJbmZvKiBBTWVkaWFFeHRyYWN0b3JfZ2V0UHNzaEluZm8oQU1lZGlhRXh0cmFjdG9yICpleCkgeworCisgICAgaWYgKGV4LT5tUHNzaEJ1ZiAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiAoUHNzaEluZm8qKSBleC0+bVBzc2hCdWYtPmRhdGEoKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIGV4LT5tSW1wbC0+Z2V0RmlsZUZvcm1hdCgmZm9ybWF0KTsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgaWYoIWZvcm1hdC0+ZmluZEJ1ZmZlcigicHNzaCIsICZidWZmZXIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIHRoZSBmb3JtYXQgb2YgdGhlIGJ1ZmZlciBpcyAxIG9yIG1vcmUgb2Y6CisgICAgLy8gICAgeworICAgIC8vICAgICAgICAxNiBieXRlIHV1aWQKKyAgICAvLyAgICAgICAgNCBieXRlIGRhdGEgbGVuZ3RoIE4KKyAgICAvLyAgICAgICAgTiBieXRlcyBvZiBkYXRhCisgICAgLy8gICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc291cmNlIGRhdGEuCisgICAgLy8gU2luY2Ugd2UgZ290IHRoZSBkYXRhIGZyb20gc3RhZ2VmcmlnaHQsIHdlIHRydXN0IGl0IGlzIHZhbGlkIGFuZCBwcm9wZXJseSBmb3JtYXR0ZWQuCisgICAgY29uc3QgdWludDhfdCogZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemVfdCBsZW4gPSBidWZmZXItPnNpemUoKTsKKyAgICBzaXplX3QgbnVtZW50cmllcyA9IDA7CisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgbnVtZW50cmllcysrOworCisgICAgICAgIC8vIHNraXAgdXVpZAorICAgICAgICBkYXRhICs9IDE2OworICAgICAgICBsZW4gLT0gMTY7CisKKyAgICAgICAgLy8gZ2V0IGRhdGEgbGVuZ3RoCisgICAgICAgIHVpbnQzMl90IGRhdGFsZW4gPSAqKCh1aW50MzJfdCopZGF0YSk7CisgICAgICAgIGRhdGEgKz0gNDsKKyAgICAgICAgbGVuIC09IDQ7CisKKyAgICAgICAgLy8gc2tpcCB0aGUgZGF0YQorICAgICAgICBkYXRhICs9IGRhdGFsZW47CisgICAgICAgIGxlbiAtPSBkYXRhbGVuOworICAgIH0KKworICAgIC8vIHRoZXJlIGFyZSA8bnVtZW50cmllcz4gaW4gdGhlIHNvdXJjZSBidWZmZXIsIHdlIG5lZWQKKyAgICAvLyAoc291cmNlIGJ1ZmZlciBzaXplKSAtIChzaXplb2YodWludDMyX3QpICogbnVtZW50cmllcykgKyBzaXplb2Yoc2l6ZV90KQorICAgIC8vICArICgoc2l6ZW9mKHZvaWQqKSArIHNpemVvZihzaXplX3QpKSAqIG51bWVudHJpZXMpIGJ5dGVzIGZvciB0aGUgUHNzaEluZm8gc3RydWN0dXJlCisgICAgLy8gT3IgaW4gb3RoZXIgd29yZHMsIHRoZSBkYXRhIGxlbmd0aHMgaW4gdGhlIHNvdXJjZSBzdHJ1Y3R1cmUgYXJlIHJlcGxhY2VkIGJ5IHNpemVfdAorICAgIC8vICh3aGljaCBtYXkgYmUgdGhlIHNhbWUgc2l6ZSBvciBsYXJnZXIsIGZvciA2NCBiaXQpLCBhbmQgaW4gYWRkaXRpb24gdGhlcmUgaXMgYW4KKyAgICAvLyBleHRyYSBwb2ludGVyIGZvciBlYWNoIGVudHJ5LCBhbmQgYW4gZXh0cmEgc2l6ZV90IGZvciB0aGUgZW50aXJlIFBzc2hJbmZvLgorICAgIHNpemVfdCBuZXdzaXplID0gYnVmZmVyLT5zaXplKCkgLSAoc2l6ZW9mKHVpbnQzMl90KSAqIG51bWVudHJpZXMpICsgc2l6ZW9mKHNpemVfdCkKKyAgICAgICAgICAgICsgKChzaXplb2Yodm9pZCopICsgc2l6ZW9mKHNpemVfdCkpICogbnVtZW50cmllcyk7CisgICAgZXgtPm1Qc3NoQnVmID0gbmV3IEFCdWZmZXIobmV3c2l6ZSk7CisgICAgZXgtPm1Qc3NoQnVmLT5zZXRSYW5nZSgwLCBuZXdzaXplKTsKKworICAgIC8vIGNvcHkgZGF0YQorICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHVpbnQ4X3QqIGRzdCA9IGV4LT5tUHNzaEJ1Zi0+ZGF0YSgpOworICAgIHVpbnQ4X3QqIGRzdGRhdGEgPSBkc3QgKyBzaXplb2Yoc2l6ZV90KSArIG51bWVudHJpZXMgKiBzaXplb2YoUHNzaEVudHJ5KTsKKyAgICAqKChzaXplX3QqKWRzdCkgPSBudW1lbnRyaWVzOworICAgIGRzdCArPSBzaXplb2Yoc2l6ZV90KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWVudHJpZXM7IGkrKykgeworICAgICAgICAvLyBjb3B5IHV1aWQKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCAxNik7CisgICAgICAgIHNyYyArPSAxNjsKKyAgICAgICAgZHN0ICs9IDE2OworCisgICAgICAgIC8vIGdldC9jb3B5IGRhdGEgbGVuZ3RoCisgICAgICAgIHVpbnQzMl90IGRhdGFsZW4gPSAqKCh1aW50MzJfdCopc3JjKTsKKyAgICAgICAgKigoc2l6ZV90Kilkc3QpID0gZGF0YWxlbjsKKyAgICAgICAgc3JjICs9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgIGRzdCArPSBzaXplb2Yoc2l6ZV90KTsKKworICAgICAgICAvLyB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgZGVzdGluYXRpb24gaXMgYSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgZGF0YSwgd2hpY2ggd2Ugc3RvcmUKKyAgICAgICAgLy8gYWZ0ZXIgdGhlIGFycmF5IG9mIFBzc2hFbnRyeQorICAgICAgICAqKCh2b2lkKiopZHN0KSA9IGRzdGRhdGE7CisgICAgICAgIGRzdCArPSBzaXplb2Yodm9pZCopOworCisgICAgICAgIC8vIGNvcHkgdGhlIGFjdHVhbCBkYXRhCisgICAgICAgIG1lbWNweShkc3RkYXRhLCBzcmMsIGRhdGFsZW4pOworICAgICAgICBkc3RkYXRhICs9IGRhdGFsZW47CisgICAgICAgIHNyYyArPSBkYXRhbGVuOworICAgIH0KKworICAgIHJldHVybiAoUHNzaEluZm8qKSBleC0+bVBzc2hCdWYtPmRhdGEoKTsKK30KKworRVhQT1JUCitBTWVkaWFDb2RlY0NyeXB0b0luZm8gKkFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVDcnlwdG9JbmZvKEFNZWRpYUV4dHJhY3RvciAqZXgpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YTsKKyAgICBpZihleC0+bUltcGwtPmdldFNhbXBsZU1ldGEoJm1ldGEpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdWludDMyX3QgdHlwZTsKKyAgICBjb25zdCB2b2lkICpjcnlwdGVkZGF0YTsKKyAgICBzaXplX3QgY3J5cHRlZHNpemU7CisgICAgaWYgKCFtZXRhLT5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZ0eXBlLCAmY3J5cHRlZGRhdGEsICZjcnlwdGVkc2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNpemVfdCBudW1TdWJTYW1wbGVzID0gY3J5cHRlZHNpemUgLyBzaXplb2Yoc2l6ZV90KTsKKworICAgIGNvbnN0IHZvaWQgKmNsZWFyZGF0YTsKKyAgICBzaXplX3QgY2xlYXJzaXplOworICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5UGxhaW5TaXplcywgJnR5cGUsICZjbGVhcmRhdGEsICZjbGVhcnNpemUpKSB7CisgICAgICAgIGlmIChjbGVhcnNpemUgIT0gY3J5cHRlZHNpemUpIHsKKyAgICAgICAgICAgIC8vIFRoZSB0d28gbXVzdCBiZSBvZiB0aGUgc2FtZSBsZW5ndGguCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IHZvaWQgKmtleTsKKyAgICBzaXplX3Qga2V5c2l6ZTsKKyAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUNyeXB0b0lWLCAmdHlwZSwgJmtleSwgJmtleXNpemUpKSB7CisgICAgICAgIGlmIChrZXlzaXplICE9IDE2KSB7CisgICAgICAgICAgICAvLyBJVnMgbXVzdCBiZSAxNiBieXRlcyBpbiBsZW5ndGguCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IHZvaWQgKml2OworICAgIHNpemVfdCBpdnNpemU7CisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJnR5cGUsICZpdiwgJml2c2l6ZSkpIHsKKyAgICAgICAgaWYgKGl2c2l6ZSAhPSAxNikgeworICAgICAgICAgICAgLy8gSVZzIG11c3QgYmUgMTYgYnl0ZXMgaW4gbGVuZ3RoLgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IG1vZGU7CisgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZtb2RlKSkgeworICAgICAgICBtb2RlID0gQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSOworICAgIH0KKworICAgIHJldHVybiBBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3KAorICAgICAgICAgICAgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgICh1aW50OF90Kikga2V5LAorICAgICAgICAgICAgKHVpbnQ4X3QqKSBpdiwKKyAgICAgICAgICAgIChjcnlwdG9pbmZvX21vZGVfdCkgbW9kZSwKKyAgICAgICAgICAgIChzaXplX3QqKSBjbGVhcmRhdGEsCisgICAgICAgICAgICAoc2l6ZV90KikgY3J5cHRlZGRhdGEpOworfQorCisKK30gLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzU0ZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcApAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFGb3JtYXQiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXQuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0cnVjdCBBTWVkaWFGb3JtYXQgeworICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OworICAgIFN0cmluZzggbURlYnVnOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1TdHJpbmdDYWNoZTsKK307CisKK2V4dGVybiAiQyIgeworCisvLyBwcml2YXRlIGZ1bmN0aW9ucyBmb3IgY29udmVyc2lvbiB0by9mcm9tIEFNZXNzYWdlCitBTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKGNvbnN0IHZvaWQqIGRhdGEpIHsKKyAgICBBTE9HVigicHJpdmF0ZSBjdG9yIik7CisgICAgQU1lZGlhRm9ybWF0KiBtRGF0YSA9IG5ldyBBTWVkaWFGb3JtYXQoKTsKKyAgICBtRGF0YS0+bUZvcm1hdCA9ICooKHNwPEFNZXNzYWdlPiopZGF0YSk7CisgICAgcmV0dXJuIG1EYXRhOworfQorCit2b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCkgeworICAgICooKHNwPEFNZXNzYWdlPiopZGVzdCkgPSBtRGF0YS0+bUZvcm1hdDsKK30KKworCisvKgorICogcHVibGljIGZ1bmN0aW9uIGZvbGxvdworICovCitFWFBPUlQKK0FNZWRpYUZvcm1hdCAqQU1lZGlhRm9ybWF0X25ldygpIHsKKyAgICBBTE9HVigiY3RvciIpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2RlbGV0ZShBTWVkaWFGb3JtYXQgKm1EYXRhKSB7CisgICAgQUxPR1YoImR0b3IiKTsKKyAgICBkZWxldGUgbURhdGE7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworCitFWFBPUlQKK2NvbnN0IGNoYXIqIEFNZWRpYUZvcm1hdF90b1N0cmluZyhBTWVkaWFGb3JtYXQgKm1EYXRhKSB7CisgICAgc3A8QU1lc3NhZ2U+IGYgPSBtRGF0YS0+bUZvcm1hdDsKKyAgICBTdHJpbmc4IHJldDsKKyAgICBpbnQgbnVtID0gZi0+Y291bnRFbnRyaWVzKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICByZXQuYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICAgIEFNZXNzYWdlOjpUeXBlIHQ7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBmLT5nZXRFbnRyeU5hbWVBdChpLCAmdCk7CisgICAgICAgIHJldC5hcHBlbmQobmFtZSk7CisgICAgICAgIHJldC5hcHBlbmQoIjogIik7CisgICAgICAgIHN3aXRjaCAodCkgeworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQzMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZhbDsKKyAgICAgICAgICAgICAgICBmLT5maW5kSW50MzIobmFtZSwgJnZhbCk7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgiaW50MzIoJSIgUFJJZDMyICIpIiwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50NjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50NjRfdCB2YWw7CisgICAgICAgICAgICAgICAgZi0+ZmluZEludDY0KG5hbWUsICZ2YWwpOworICAgICAgICAgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoImludDY0KCUiIFBSSWQ2NCAiKSIsIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVNpemU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHZhbDsKKyAgICAgICAgICAgICAgICBmLT5maW5kU2l6ZShuYW1lLCAmdmFsKTsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJzaXplX3QoJXp1KSIsIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUZsb2F0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0IHZhbDsKKyAgICAgICAgICAgICAgICBmLT5maW5kRmxvYXQobmFtZSwgJnZhbCk7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgiZmxvYXQoJWYpIiwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWw7CisgICAgICAgICAgICAgICAgZi0+ZmluZERvdWJsZShuYW1lLCAmdmFsKTsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJkb3VibGUoJWYpIiwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU3RyaW5nOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFTdHJpbmcgdmFsOworICAgICAgICAgICAgICAgIGYtPmZpbmRTdHJpbmcobmFtZSwgJnZhbCk7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgic3RyaW5nKCVzKSIsIHZhbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlQnVmZmVyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoImRhdGEiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgidW5rbm93biglZCkiLCB0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXQuYXBwZW5kKCJ9Iik7CisgICAgbURhdGEtPm1EZWJ1ZyA9IHJldDsKKyAgICByZXR1cm4gbURhdGEtPm1EZWJ1Zy5zdHJpbmcoKTsKK30KKworRVhQT1JUCitib29sIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqb3V0KSB7CisgICAgcmV0dXJuIGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKG5hbWUsIG91dCk7Cit9CisKK0VYUE9SVAorYm9vbCBBTWVkaWFGb3JtYXRfZ2V0SW50NjQoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKm91dCkgeworICAgIHJldHVybiBmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQ2NChuYW1lLCBvdXQpOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEZsb2F0KEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLCBmbG9hdCAqb3V0KSB7CisgICAgcmV0dXJuIGZvcm1hdC0+bUZvcm1hdC0+ZmluZEZsb2F0KG5hbWUsIG91dCk7Cit9CisKK0VYUE9SVAorYm9vbCBBTWVkaWFGb3JtYXRfZ2V0U2l6ZShBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90ICpvdXQpIHsKKyAgICByZXR1cm4gZm9ybWF0LT5tRm9ybWF0LT5maW5kU2l6ZShuYW1lLCBvdXQpOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCoqIGRhdGEsIHNpemVfdCAqb3V0c2l6ZSkgeworICAgIHNwPEFCdWZmZXI+IGJ1ZjsKKyAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKG5hbWUsICZidWYpKSB7CisgICAgICAgICpkYXRhID0gYnVmLT5kYXRhKCkgKyBidWYtPm9mZnNldCgpOworICAgICAgICAqb3V0c2l6ZSA9IGJ1Zi0+c2l6ZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhBTWVkaWFGb3JtYXQqIG1EYXRhLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqb3V0KSB7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EYXRhLT5tU3RyaW5nQ2FjaGUuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChtRGF0YS0+bVN0cmluZ0NhY2hlLmtleUF0KGkpLnN0cmluZygpLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBtRGF0YS0+bVN0cmluZ0NhY2hlLnJlbW92ZUl0ZW1zQXQoaSwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFTdHJpbmcgdG1wOworICAgIGlmIChtRGF0YS0+bUZvcm1hdC0+ZmluZFN0cmluZyhuYW1lLCAmdG1wKSkgeworICAgICAgICBTdHJpbmc4IHJldCh0bXAuY19zdHIoKSk7CisgICAgICAgIG1EYXRhLT5tU3RyaW5nQ2FjaGUuYWRkKFN0cmluZzgobmFtZSksIHJldCk7CisgICAgICAgICpvdXQgPSByZXQuc3RyaW5nKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFGb3JtYXRfc2V0SW50MzIoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgdmFsdWUpIHsKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPnNldEludDMyKG5hbWUsIHZhbHVlKTsKK30KKworRVhQT1JUCit2b2lkIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgaW50NjRfdCB2YWx1ZSkgeworICAgIGZvcm1hdC0+bUZvcm1hdC0+c2V0SW50NjQobmFtZSwgdmFsdWUpOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEZsb2F0KEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCBmbG9hdCB2YWx1ZSkgeworICAgIGZvcm1hdC0+bUZvcm1hdC0+c2V0RmxvYXQobmFtZSwgdmFsdWUpOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgICAvLyBBTWVzc2FnZTo6c2V0U3RyaW5nKCkgbWFrZXMgYSBjb3B5IG9mIHRoZSBzdHJpbmcKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPnNldFN0cmluZyhuYW1lLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIHRoZSBBQnVmZmVyKHZvaWQqLCBzaXplX3QpIGNvbnN0cnVjdG9yIGRvZXNuJ3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGRhdGEsIHNvIGNyZWF0ZQorICAgIC8vIGEgbmV3IGJ1ZmZlciBhbmQgY29weSB0aGUgZGF0YSBpbnRvIGl0CisgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgbWVtY3B5KGJ1Zi0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKyAgICBidWYtPnNldFJhbmdlKDAsIHNpemUpOworICAgIC8vIEFNZXNzYWdlOjpzZXRCdWZmZXIoKSBpbmNyZWFzZXMgdGhlIHJlZmNvdW50IG9mIHRoZSBidWZmZXIKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPnNldEJ1ZmZlcihuYW1lLCBidWYpOworfQorCisKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFID0gImFhYy1wcm9maWxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFID0gImJpdHJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCA9ICJjaGFubmVsLWNvdW50IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSyA9ICJjaGFubmVsLW1hc2siOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFUID0gImNvbG9yLWZvcm1hdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiA9ICJkdXJhdGlvblVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwgPSAiZmxhYy1jb21wcmVzc2lvbi1sZXZlbCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFID0gImZyYW1lLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUID0gImhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BRFRTID0gImlzLWFkdHMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVCA9ICJpcy1hdXRvc2VsZWN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQgPSAiaXMtZGVmYXVsdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEUgPSAiaXMtZm9yY2VkLXN1YnRpdGxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUwgPSAiaS1mcmFtZS1pbnRlcnZhbCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hUID0gIm1heC1oZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUgPSAibWF4LWlucHV0LXNpemUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NSU1FID0gIm1pbWUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1AgPSAicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUiA9ICJyZXBlYXQtcHJldmlvdXMtZnJhbWUtYWZ0ZXIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUgPSAic2FtcGxlLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfV0lEVEggPSAid2lkdGgiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU1RSSURFID0gInN0cmlkZSI7CisKKworfSAvLyBleHRlcm4gIkMiCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0UHJpdi5oIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0UHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMzQyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKKyNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisKKyNpbmNsdWRlIDxOZGtNZWRpYUZvcm1hdC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK0FNZWRpYUZvcm1hdCogQU1lZGlhRm9ybWF0X2Zyb21Nc2codm9pZCopOwordm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHZvaWQqIGRlc3QpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvLyBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYjAzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhTXV4ZXIiCisKKworI2luY2x1ZGUgIk5ka01lZGlhTXV4ZXIuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUNvZGVjLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKK30KKworc3RydWN0IEFNZWRpYU11eGVyIHsKKyAgICBzcDxNZWRpYU11eGVyPiBtSW1wbDsKKworfTsKKworZXh0ZXJuICJDIiB7CisKK0VYUE9SVAorQU1lZGlhTXV4ZXIqIEFNZWRpYU11eGVyX25ldyhpbnQgZmQsIE91dHB1dEZvcm1hdCBmb3JtYXQpIHsKKyAgICBBTE9HVigiY3RvciIpOworICAgIEFNZWRpYU11eGVyICptRGF0YSA9IG5ldyBBTWVkaWFNdXhlcigpOworICAgIG1EYXRhLT5tSW1wbCA9IG5ldyBNZWRpYU11eGVyKGZkLCAoYW5kcm9pZDo6TWVkaWFNdXhlcjo6T3V0cHV0Rm9ybWF0KWZvcm1hdCk7CisgICAgcmV0dXJuIG1EYXRhOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX2RlbGV0ZShBTWVkaWFNdXhlciAqbXV4ZXIpIHsKKyAgICBBTE9HVigiZHRvciIpOworICAgIGRlbGV0ZSBtdXhlcjsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3NldExvY2F0aW9uKEFNZWRpYU11eGVyICptdXhlciwgZmxvYXQgbGF0aXR1ZGUsIGZsb2F0IGxvbmd0aXR1ZGUpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG11eGVyLT5tSW1wbC0+c2V0TG9jYXRpb24obGF0aXR1ZGUgKiAxMDAwMCwgbG9uZ3RpdHVkZSAqIDEwMDAwKSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc2V0T3JpZW50YXRpb25IaW50KEFNZWRpYU11eGVyICptdXhlciwgaW50IGRlZ3JlZXMpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG11eGVyLT5tSW1wbC0+c2V0T3JpZW50YXRpb25IaW50KGRlZ3JlZXMpKTsKK30KKworRVhQT1JUCitzc2l6ZV90IEFNZWRpYU11eGVyX2FkZFRyYWNrKEFNZWRpYU11eGVyICptdXhlciwgY29uc3QgQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnOworICAgIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoZm9ybWF0LCAmbXNnKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG11eGVyLT5tSW1wbC0+YWRkVHJhY2sobXNnKSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc3RhcnQoQU1lZGlhTXV4ZXIgKm11eGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtdXhlci0+bUltcGwtPnN0YXJ0KCkpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3N0b3AoQU1lZGlhTXV4ZXIgKm11eGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtdXhlci0+bUltcGwtPnN0b3AoKSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfd3JpdGVTYW1wbGVEYXRhKEFNZWRpYU11eGVyICptdXhlciwKKyAgICAgICAgc2l6ZV90IHRyYWNrSWR4LCBjb25zdCB1aW50OF90ICpkYXRhLCBjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8pIHsKKyAgICBzcDxBQnVmZmVyPiBidWYgPSBuZXcgQUJ1ZmZlcigodm9pZCopKGRhdGEgKyBpbmZvLT5vZmZzZXQpLCBpbmZvLT5zaXplKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKAorICAgICAgICAgICAgbXV4ZXItPm1JbXBsLT53cml0ZVNhbXBsZURhdGEoYnVmLCB0cmFja0lkeCwgaW5mby0+cHJlc2VudGF0aW9uVGltZVVzLCBpbmZvLT5mbGFncykpOworfQorCisKK30gLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IDU0Mzc3ZjEuLjY5N2ZiMzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCkBAIC0xMywyNSArMTMsMzMgQEAKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgU2VydmljZVV0aWxpdGllcy5jcHAKKworIyBGSVhNRSBNb3ZlIHRoaXMgbGlicmFyeSB0byBmcmFtZXdvcmtzL25hdGl2ZQorTE9DQUxfTU9EVUxFIDo9IGxpYnNlcnZpY2V1dGlsaXR5CisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAogICAgIEF1ZGlvRmxpbmdlci5jcHAgICAgICAgICAgICBcCiAgICAgVGhyZWFkcy5jcHAgICAgICAgICAgICAgICAgIFwKICAgICBUcmFja3MuY3BwICAgICAgICAgICAgICAgICAgXAogICAgIEVmZmVjdHMuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgQXVkaW9NaXhlci5jcHAuYXJtICAgICAgICAgIFwKLSAgICBBdWRpb1Jlc2FtcGxlci5jcHAuYXJtICAgICAgXAotICAgIEF1ZGlvUG9saWN5U2VydmljZS5jcHAgICAgICBcCi0gICAgU2VydmljZVV0aWxpdGllcy5jcHAgICAgICAgIFwKLSAgICBBdWRpb1Jlc2FtcGxlckN1YmljLmNwcC5hcm0gXAotICAgIEF1ZGlvUmVzYW1wbGVyU2luYy5jcHAuYXJtCisgICAgUGF0Y2hQYW5lbC5jcHAKIAogTE9DQUxfU1JDX0ZJTEVTICs9IFN0YXRlUXVldWUuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3Jlc2FtcGxlciBcCiAgICAgbGliYXVkaW91dGlscyBcCiAgICAgbGliY29tbW9uX3RpbWVfY2xpZW50IFwKICAgICBsaWJjdXRpbHMgXApAQCAtNDMsMTcgKzUxLDIwIEBACiAgICAgbGliaGFyZHdhcmUgXAogICAgIGxpYmhhcmR3YXJlX2xlZ2FjeSBcCiAgICAgbGliZWZmZWN0cyBcCi0gICAgbGliZGwgXAogICAgIGxpYnBvd2VybWFuYWdlcgogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJzY2hlZHVsaW5nX3BvbGljeSBcCiAgICAgbGliY3B1c3RhdHMgXAotICAgIGxpYm1lZGlhX2hlbHBlcgorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGlic2VydmljZXV0aWxpdHkKIAogTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9mbGluZ2VyCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCiAKIExPQ0FMX1NSQ19GSUxFUyArPSBGYXN0TWl4ZXIuY3BwIEZhc3RNaXhlclN0YXRlLmNwcCBBdWRpb1dhdGNoZG9nLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9IEZhc3RUaHJlYWQuY3BwIEZhc3RUaHJlYWRTdGF0ZS5jcHAKK0xPQ0FMX1NSQ19GSUxFUyArPSBGYXN0Q2FwdHVyZS5jcHAgRmFzdENhcHR1cmVTdGF0ZS5jcHAKIAogTE9DQUxfQ0ZMQUdTICs9IC1EU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKIApAQCAtNzQsMTIgKzg1LDE3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCi0JdGVzdC1yZXNhbXBsZS5jcHAgCQkJXAotICAgIEF1ZGlvUmVzYW1wbGVyLmNwcC5hcm0gICAgICBcCi0JQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAuYXJtIFwKLSAgICBBdWRpb1Jlc2FtcGxlclNpbmMuY3BwLmFybQorICAgIHRlc3QtcmVzYW1wbGUuY3BwICAgICAgICAgICBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGlic25kZmlsZQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3Jlc2FtcGxlciBcCisgICAgbGliYXVkaW91dGlscyBcCiAgICAgbGliZGwgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlidXRpbHMgXApAQCAtOTEsNCArMTA3LDI0IEBACiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIEF1ZGlvUmVzYW1wbGVyLmNwcC5hcm0gXAorICAgIEF1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwLmFybSBcCisgICAgQXVkaW9SZXNhbXBsZXJTaW5jLmNwcC5hcm0gXAorICAgIEF1ZGlvUmVzYW1wbGVyRHluLmNwcC5hcm0KKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYmRsIFwKKyAgICBsaWJsb2cKKworTE9DQUxfTU9EVUxFIDo9IGxpYmF1ZGlvcmVzYW1wbGVyCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKwogaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCAwYWVmNTNmLi40MTNlYzNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtODIsNiArODIsNyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvRmxpbmdlciBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKIHN0YXRpYyBjb25zdCBjaGFyIGtIYXJkd2FyZUxvY2tlZFN0cmluZ1tdID0gIkhhcmR3YXJlIGxvY2sgaXMgdGFrZW5cbiI7CitzdGF0aWMgY29uc3QgY2hhciBrQ2xpZW50TG9ja2VkU3RyaW5nW10gPSAiQ2xpZW50IGxvY2sgaXMgdGFrZW5cbiI7CiAKIAogbnNlY3NfdCBBdWRpb0ZsaW5nZXI6Om1TdGFuZGJ5VGltZUluTnNlY3MgPSBrRGVmYXVsdFN0YW5kYnlUaW1lSW5Oc2VjczsKQEAgLTEwNCw2ICsxMDUsMzYgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitjb25zdCBjaGFyICpmb3JtYXRUb1N0cmluZyhhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2ggKGZvcm1hdCAmIEFVRElPX0ZPUk1BVF9NQUlOX01BU0spIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ006CisgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6IHJldHVybiAicGNtMTYiOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ6IHJldHVybiAicGNtOCI7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6IHJldHVybiAicGNtMzIiOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQ6IHJldHVybiAicGNtOC4yNCI7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDogcmV0dXJuICJwY21mbG9hdCI7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOiByZXR1cm4gInBjbTI0IjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX01QMzogcmV0dXJuICJtcDMiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0FNUl9OQjogcmV0dXJuICJhbXItbmIiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0FNUl9XQjogcmV0dXJuICJhbXItd2IiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0FBQzogcmV0dXJuICJhYWMiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0hFX0FBQ19WMTogcmV0dXJuICJoZS1hYWMtdjEiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0hFX0FBQ19WMjogcmV0dXJuICJoZS1hYWMtdjIiOworICAgIGNhc2UgQVVESU9fRk9STUFUX1ZPUkJJUzogcmV0dXJuICJ2b3JiaXMiOworICAgIGNhc2UgQVVESU9fRk9STUFUX09QVVM6IHJldHVybiAib3B1cyI7CisgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOiByZXR1cm4gImFjLTMiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzOiByZXR1cm4gImUtYWMtMyI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAidW5rbm93biI7Cit9CisKIHN0YXRpYyBpbnQgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgYXVkaW9faHdfZGV2aWNlX3QgKipkZXYpCiB7CiAgICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKQEAgLTEyMSw3ICsxNTIsNyBAQAogICAgIGlmIChyYykgewogICAgICAgICBnb3RvIG91dDsKICAgICB9Ci0gICAgaWYgKCgqZGV2KS0+Y29tbW9uLnZlcnNpb24gIT0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX0NVUlJFTlQpIHsKKyAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKICAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7CiAgICAgICAgIHJjID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIG91dDsKQEAgLTEzOCw2ICsxNjksNyBAQAogQXVkaW9GbGluZ2VyOjpBdWRpb0ZsaW5nZXIoKQogICAgIDogQm5BdWRpb0ZsaW5nZXIoKSwKICAgICAgIG1QcmltYXJ5SGFyZHdhcmVEZXYoTlVMTCksCisgICAgICBtQXVkaW9Id0RldnMoTlVMTCksCiAgICAgICBtSGFyZHdhcmVTdGF0dXMoQVVESU9fSFdfSURMRSksCiAgICAgICBtTWFzdGVyVm9sdW1lKDEuMGYpLAogICAgICAgbU1hc3Rlck11dGUoZmFsc2UpLApAQCAtMTQ2LDE0ICsxNzgsMTYgQEAKICAgICAgIG1CdE5yZWNJc09mZihmYWxzZSksCiAgICAgICBtSXNMb3dSYW1EZXZpY2UodHJ1ZSksCiAgICAgICBtSXNEZXZpY2VUeXBlS25vd24oZmFsc2UpLAotICAgICAgbUdsb2JhbEVmZmVjdEVuYWJsZVRpbWUoMCkKKyAgICAgIG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lKDApLAorICAgICAgbVByaW1hcnlPdXRwdXRTYW1wbGVSYXRlKDApCiB7CiAgICAgZ2V0cGlkX2NhY2hlZCA9IGdldHBpZCgpOwogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKICAgICBib29sIGRvTG9nID0gKHByb3BlcnR5X2dldCgicm8udGVzdF9oYXJuZXNzIiwgdmFsdWUsICIwIikgPiAwKSAmJiAoYXRvaSh2YWx1ZSkgPT0gMSk7CiAgICAgaWYgKGRvTG9nKSB7Ci0gICAgICAgIG1Mb2dNZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKGtMb2dNZW1vcnlTaXplLCAiTG9nV3JpdGVycyIpOworICAgICAgICBtTG9nTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTG9nTWVtb3J5U2l6ZSwgIkxvZ1dyaXRlcnMiLCBNZW1vcnlIZWFwQmFzZTo6UkVBRF9PTkxZKTsKICAgICB9CisKICNpZmRlZiBURUVfU0lOSwogICAgICh2b2lkKSBwcm9wZXJ0eV9nZXQoInJvLmRlYnVnZ2FibGUiLCB2YWx1ZSwgIjAiKTsKICAgICBpbnQgZGVidWdnYWJsZSA9IGF0b2kodmFsdWUpOwpAQCAtMTYyLDEyICsxOTYsMTYgQEAKICAgICAgICAgKHZvaWQpIHByb3BlcnR5X2dldCgiYWYudGVlIiwgdmFsdWUsICIwIik7CiAgICAgICAgIHRlZUVuYWJsZWQgPSBhdG9pKHZhbHVlKTsKICAgICB9Ci0gICAgaWYgKHRlZUVuYWJsZWQgJiAxKQorICAgIC8vIEZJWE1FIHN5bWJvbGljIGNvbnN0YW50cyBoZXJlCisgICAgaWYgKHRlZUVuYWJsZWQgJiAxKSB7CiAgICAgICAgIG1UZWVTaW5rSW5wdXRFbmFibGVkID0gdHJ1ZTsKLSAgICBpZiAodGVlRW5hYmxlZCAmIDIpCisgICAgfQorICAgIGlmICh0ZWVFbmFibGVkICYgMikgewogICAgICAgICBtVGVlU2lua091dHB1dEVuYWJsZWQgPSB0cnVlOwotICAgIGlmICh0ZWVFbmFibGVkICYgNCkKKyAgICB9CisgICAgaWYgKHRlZUVuYWJsZWQgJiA0KSB7CiAgICAgICAgIG1UZWVTaW5rVHJhY2tFbmFibGVkID0gdHJ1ZTsKKyAgICB9CiAjZW5kaWYKIH0KIApAQCAtMTkxLDYgKzIyOSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBtUGF0Y2hQYW5lbCA9IG5ldyBQYXRjaFBhbmVsKHRoaXMpOworCiAgICAgbU1vZGUgPSBBVURJT19NT0RFX05PUk1BTDsKIH0KIApAQCAtMjEwLDYgKzI1MCwxOCBAQAogICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UobUF1ZGlvSHdEZXZzLnZhbHVlQXQoaSktPmh3RGV2aWNlKCkpOwogICAgICAgICBkZWxldGUgbUF1ZGlvSHdEZXZzLnZhbHVlQXQoaSk7CiAgICAgfQorCisgICAgLy8gVGVsbCBtZWRpYS5sb2cgc2VydmljZSBhYm91dCBhbnkgb2xkIHdyaXRlcnMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIHVucmVnaXN0ZXJlZAorICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5sb2ciKSk7CisgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgIHNwPElNZWRpYUxvZ1NlcnZpY2U+IG1lZGlhTG9nU2VydmljZShpbnRlcmZhY2VfY2FzdDxJTWVkaWFMb2dTZXJ2aWNlPihiaW5kZXIpKTsKKyAgICAgICAgZm9yIChzaXplX3QgY291bnQgPSBtVW5yZWdpc3RlcmVkV3JpdGVycy5zaXplKCk7IGNvdW50ID4gMDsgY291bnQtLSkgeworICAgICAgICAgICAgc3A8SU1lbW9yeT4gaU1lbW9yeShtVW5yZWdpc3RlcmVkV3JpdGVycy50b3AoKS0+Z2V0SU1lbW9yeSgpKTsKKyAgICAgICAgICAgIG1VbnJlZ2lzdGVyZWRXcml0ZXJzLnBvcCgpOworICAgICAgICAgICAgbWVkaWFMb2dTZXJ2aWNlLT51bnJlZ2lzdGVyV3JpdGVyKGlNZW1vcnkpOworICAgICAgICB9CisgICAgfQorCiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXVkaW9faW50ZXJmYWNlc1tdID0gewpAQCAtMjQ5LDcgKzMwMSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wQ2xpZW50cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit2b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcENsaWVudHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwpAQCAtMjcxLDE3ICszMjMsMTcgQEAKICAgICB9CiAKICAgICByZXN1bHQuYXBwZW5kKCJHbG9iYWwgc2Vzc2lvbiByZWZzOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIHNlc3Npb24gcGlkIGNvdW50XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgIHNlc3Npb24gICBwaWQgY291bnRcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgQXVkaW9TZXNzaW9uUmVmICpyID0gbUF1ZGlvU2Vzc2lvblJlZnNbaV07Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlN2QgJTNkICUzZFxuIiwgci0+bVNlc3Npb25pZCwgci0+bVBpZCwgci0+bUNudCk7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgJTdkICU1ZCAlNWRcbiIsIHItPm1TZXNzaW9uaWQsIHItPm1QaWQsIHItPm1DbnQpOwogICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgfQogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTI5Niw3ICszNDgsNyBAQAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTM0NCw3ICszOTYsMTYgQEAKICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgICAgICB9CiAKKyAgICAgICAgYm9vbCBjbGllbnRMb2NrZWQgPSBkdW1wVHJ5TG9jayhtQ2xpZW50TG9jayk7CisgICAgICAgIGlmICghY2xpZW50TG9ja2VkKSB7CisgICAgICAgICAgICBTdHJpbmc4IHJlc3VsdChrQ2xpZW50TG9ja2VkU3RyaW5nKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICB9CiAgICAgICAgIGR1bXBDbGllbnRzKGZkLCBhcmdzKTsKKyAgICAgICAgaWYgKGNsaWVudExvY2tlZCkgeworICAgICAgICAgICAgbUNsaWVudExvY2sudW5sb2NrKCk7CisgICAgICAgIH0KKwogICAgICAgICBkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKIAogICAgICAgICAvLyBkdW1wIHBsYXliYWNrIHRocmVhZHMKQEAgLTM1Nyw2ICs0MTgsMTMgQEAKICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSktPmR1bXAoZmQsIGFyZ3MpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gZHVtcCBvcnBoYW4gZWZmZWN0IGNoYWlucworICAgICAgICBpZiAobU9ycGhhbkVmZmVjdENoYWlucy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgd3JpdGUoZmQsICIgIE9ycGhhbiBFZmZlY3QgQ2hhaW5zXG4iLCBzdHJsZW4oIiAgT3JwaGFuIEVmZmVjdCBDaGFpbnNcbiIpKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU9ycGhhbkVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIG1PcnBoYW5FZmZlY3RDaGFpbnMudmFsdWVBdChpKS0+ZHVtcChmZCwgYXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgLy8gZHVtcCBhbGwgaGFyZHdhcmUgZGV2cwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldiA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpLT5od0RldmljZSgpOwpAQCAtMzc5LDcgKzQ0Nyw3IEBACiAgICAgICAgIGlmIChtTG9nTWVtb3J5RGVhbGVyICE9IDApIHsKICAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5sb2ciKSk7CiAgICAgICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgICAgICAgICBmZHByaW50ZihmZCwgIlxubWVkaWEubG9nOlxuIik7CisgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIlxubWVkaWEubG9nOlxuIik7CiAgICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOwogICAgICAgICAgICAgICAgIGJpbmRlci0+ZHVtcChmZCwgYXJncyk7CiAgICAgICAgICAgICB9CkBAIC0zODgsOCArNDU2LDkgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiBBdWRpb0ZsaW5nZXI6OnJlZ2lzdGVyUGlkX2wocGlkX3QgcGlkKQorc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+IEF1ZGlvRmxpbmdlcjo6cmVnaXN0ZXJQaWQocGlkX3QgcGlkKQogeworICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOwogICAgIC8vIElmIHBpZCBpcyBhbHJlYWR5IGluIHRoZSBtQ2xpZW50cyB3cDw+IG1hcCwgdGhlbiB1c2UgdGhhdCBlbnRyeQogICAgIC8vIChmb3Igd2hpY2ggcHJvbW90ZSgpIGlzIGFsd2F5cyAhPSAwKSwgb3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBlbnRyeSBhbmQgQ2xpZW50LgogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbUNsaWVudHMudmFsdWVGb3IocGlkKS5wcm9tb3RlKCk7CkBAIC00MDMsMTYgKzQ3Miw0NCBAQAogCiBzcDxOQkxvZzo6V3JpdGVyPiBBdWRpb0ZsaW5nZXI6Om5ld1dyaXRlcl9sKHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKQogeworICAgIC8vIElmIHRoZXJlIGlzIG5vIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGxvZ3MsIHJldHVybiBhIGR1bW15IHdyaXRlciB0aGF0IGRvZXMgbm90aGluZwogICAgIGlmIChtTG9nTWVtb3J5RGVhbGVyID09IDApIHsKICAgICAgICAgcmV0dXJuIG5ldyBOQkxvZzo6V3JpdGVyKCk7CiAgICAgfQotICAgIHNwPElNZW1vcnk+IHNoYXJlZCA9IG1Mb2dNZW1vcnlEZWFsZXItPmFsbG9jYXRlKE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKSk7Ci0gICAgc3A8TkJMb2c6OldyaXRlcj4gd3JpdGVyID0gbmV3IE5CTG9nOjpXcml0ZXIoc2l6ZSwgc2hhcmVkKTsKICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEubG9nIikpOwotICAgIGlmIChiaW5kZXIgIT0gMCkgewotICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFMb2dTZXJ2aWNlPihiaW5kZXIpLT5yZWdpc3RlcldyaXRlcihzaGFyZWQsIHNpemUsIG5hbWUpOworICAgIC8vIFNpbWlsYXJseSBpZiB3ZSBjYW4ndCBjb250YWN0IHRoZSBtZWRpYS5sb2cgc2VydmljZSwgYWxzbyByZXR1cm4gYSBkdW1teSB3cml0ZXIKKyAgICBpZiAoYmluZGVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOQkxvZzo6V3JpdGVyKCk7CiAgICAgfQotICAgIHJldHVybiB3cml0ZXI7CisgICAgc3A8SU1lZGlhTG9nU2VydmljZT4gbWVkaWFMb2dTZXJ2aWNlKGludGVyZmFjZV9jYXN0PElNZWRpYUxvZ1NlcnZpY2U+KGJpbmRlcikpOworICAgIHNwPElNZW1vcnk+IHNoYXJlZCA9IG1Mb2dNZW1vcnlEZWFsZXItPmFsbG9jYXRlKE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKSk7CisgICAgLy8gSWYgYWxsb2NhdGlvbiBmYWlscywgY29uc3VsdCB0aGUgdmVjdG9yIG9mIHByZXZpb3VzbHkgdW5yZWdpc3RlcmVkIHdyaXRlcnMKKyAgICAvLyBhbmQgZ2FyYmFnZS1jb2xsZWN0IG9uZSBvciBtb3JlIHRoZW0gdW50aWwgYW4gYWxsb2NhdGlvbiBzdWNjZWVkcworICAgIGlmIChzaGFyZWQgPT0gMCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVucmVnaXN0ZXJlZFdyaXRlcnNMb2NrKTsKKyAgICAgICAgZm9yIChzaXplX3QgY291bnQgPSBtVW5yZWdpc3RlcmVkV3JpdGVycy5zaXplKCk7IGNvdW50ID4gMDsgY291bnQtLSkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFBpY2sgdGhlIG9sZGVzdCBzdGFsZSB3cml0ZXIgdG8gZ2FyYmFnZS1jb2xsZWN0CisgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gaU1lbW9yeShtVW5yZWdpc3RlcmVkV3JpdGVyc1swXS0+Z2V0SU1lbW9yeSgpKTsKKyAgICAgICAgICAgICAgICBtVW5yZWdpc3RlcmVkV3JpdGVycy5yZW1vdmVBdCgwKTsKKyAgICAgICAgICAgICAgICBtZWRpYUxvZ1NlcnZpY2UtPnVucmVnaXN0ZXJXcml0ZXIoaU1lbW9yeSk7CisgICAgICAgICAgICAgICAgLy8gTm93IHRoZSBtZWRpYS5sb2cgcmVtb3RlIHJlZmVyZW5jZSB0byBJTWVtb3J5IGlzIGdvbmUuICBXaGVuIG91ciBsYXN0IGxvY2FsCisgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIElNZW1vcnkgYWxzbyBkcm9wcyB0byB6ZXJvIGF0IGVuZCBvZiB0aGlzIGJsb2NrLAorICAgICAgICAgICAgICAgIC8vIHRoZSBJTWVtb3J5IGRlc3RydWN0b3Igd2lsbCBkZWFsbG9jYXRlIHRoZSByZWdpb24gZnJvbSBtTG9nTWVtb3J5RGVhbGVyLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmUtYXR0ZW1wdCB0aGUgYWxsb2NhdGlvbgorICAgICAgICAgICAgc2hhcmVkID0gbUxvZ01lbW9yeURlYWxlci0+YWxsb2NhdGUoTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpKTsKKyAgICAgICAgICAgIGlmIChzaGFyZWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGdvdG8gc3VjY2VzczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBFdmVuIGFmdGVyIGdhcmJhZ2UtY29sbGVjdGluZyBhbGwgb2xkIHdyaXRlcnMsIHRoZXJlIGlzIHN0aWxsIG5vdCBlbm91Z2ggbWVtb3J5LAorICAgICAgICAvLyBzbyByZXR1cm4gYSBkdW1teSB3cml0ZXIKKyAgICAgICAgcmV0dXJuIG5ldyBOQkxvZzo6V3JpdGVyKCk7CisgICAgfQorc3VjY2VzczoKKyAgICBtZWRpYUxvZ1NlcnZpY2UtPnJlZ2lzdGVyV3JpdGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSk7CisgICAgcmV0dXJuIG5ldyBOQkxvZzo6V3JpdGVyKHNpemUsIHNoYXJlZCk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjp1bnJlZ2lzdGVyV3JpdGVyKGNvbnN0IHNwPE5CTG9nOjpXcml0ZXI+JiB3cml0ZXIpCkBAIC00MjQsMTMgKzUyMSwxMCBAQAogICAgIGlmIChpTWVtb3J5ID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEubG9nIikpOwotICAgIGlmIChiaW5kZXIgIT0gMCkgewotICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFMb2dTZXJ2aWNlPihiaW5kZXIpLT51bnJlZ2lzdGVyV3JpdGVyKGlNZW1vcnkpOwotICAgICAgICAvLyBOb3cgdGhlIG1lZGlhLmxvZyByZW1vdGUgcmVmZXJlbmNlIHRvIElNZW1vcnkgaXMgZ29uZS4KLSAgICAgICAgLy8gV2hlbiBvdXIgbGFzdCBsb2NhbCByZWZlcmVuY2UgdG8gSU1lbW9yeSBhbHNvIGRyb3BzIHRvIHplcm8sCi0gICAgICAgIC8vIHRoZSBJTWVtb3J5IGRlc3RydWN0b3Igd2lsbCBkZWFsbG9jYXRlIHRoZSByZWdpb24gZnJvbSBtTWVtb3J5RGVhbGVyLgotICAgIH0KKyAgICAvLyBSYXRoZXIgdGhhbiByZW1vdmluZyB0aGUgd3JpdGVyIGltbWVkaWF0ZWx5LCBhcHBlbmQgaXQgdG8gYSBxdWV1ZSBvZiBvbGQgd3JpdGVycyB0bworICAgIC8vIGJlIGdhcmJhZ2UtY29sbGVjdGVkIGxhdGVyLiAgVGhpcyBhbGxvd3MgdXMgdG8gY29udGludWUgdG8gdmlldyBvbGQgbG9ncyBmb3IgYSB3aGlsZS4KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVucmVnaXN0ZXJlZFdyaXRlcnNMb2NrKTsKKyAgICBtVW5yZWdpc3RlcmVkV3JpdGVycy5wdXNoKHdyaXRlcik7CiB9CiAKIC8vIElBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCkBAIC00NDEsMTMgKzUzNSwxMiBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgc2l6ZV90ICpmcmFtZUNvdW50LAogICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgIGludCAqc2Vzc2lvbklkLAotICAgICAgICBTdHJpbmc4JiBuYW1lLAogICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogewpAQCAtNDY1LDEwICs1NTgsMjkgQEAKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAotICAgIC8vIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgY29udmVyc2lvbiBvZiA4LWJpdCBQQ00gdG8gMTYtYml0IFBDTSwKLSAgICAvLyBhbmQgd2UgZG9uJ3QgeWV0IHN1cHBvcnQgOC4yNCBvciAzMi1iaXQgUENNCi0gICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBmb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBmb3JtYXQgJWQiLCBmb3JtYXQpOworICAgIC8vIGZ1cnRoZXIgc2FtcGxlIHJhdGUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgY3JlYXRlVHJhY2tfbCgpIGRlcGVuZGluZyBvbiB0aGUgdGhyZWFkIHR5cGUKKyAgICBpZiAoc2FtcGxlUmF0ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIGludmFsaWQgc2FtcGxlIHJhdGUgJXUiLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIC8vIGZ1cnRoZXIgY2hhbm5lbCBtYXNrIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGNyZWF0ZVRyYWNrX2woKSBkZXBlbmRpbmcgb24gdGhlIHRocmVhZCB0eXBlCisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLy8gZnVydGhlciBmb3JtYXQgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgY3JlYXRlVHJhY2tfbCgpIGRlcGVuZGluZyBvbiB0aGUgdGhyZWFkIHR5cGUKKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIGludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDAgJiYgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBzaGFyZWRCdWZmZXIgaXMgbm9uLTAgYnV0IGhhcyBOVUxMIHBvaW50ZXIoKSIpOwogICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQpAQCAtNDc2LDcgKzU4OCw2IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCk7Ci0gICAgICAgIFBsYXliYWNrVGhyZWFkICplZmZlY3RUaHJlYWQgPSBOVUxMOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJubyBwbGF5YmFjayB0aHJlYWQgZm91bmQgZm9yIG91dHB1dCBoYW5kbGUgJWQiLCBvdXRwdXQpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKQEAgLTQ4NCwyNCArNTk1LDIzIEBACiAgICAgICAgIH0KIAogICAgICAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGNsaWVudCA9IHJlZ2lzdGVyUGlkKHBpZCk7CiAKLSAgICAgICAgY2xpZW50ID0gcmVnaXN0ZXJQaWRfbChwaWQpOwotCi0gICAgICAgIEFMT0dWKCJjcmVhdGVUcmFjaygpIHNlc3Npb25JZDogJWQiLCAoc2Vzc2lvbklkID09IE5VTEwpID8gLTIgOiAqc2Vzc2lvbklkKTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMICYmICpzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIFBsYXliYWNrVGhyZWFkICplZmZlY3RUaHJlYWQgPSBOVUxMOworICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwgJiYgKnNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFKSB7CisgICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFuIGVmZmVjdCBjaGFpbiB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgaXMgcHJlc2VudCBvbiBhbm90aGVyCiAgICAgICAgICAgICAvLyBvdXRwdXQgdGhyZWFkIGFuZCBtb3ZlIGl0IGhlcmUuCiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy5rZXlBdChpKSAhPSBvdXRwdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2Vzc2lvbnMgPSB0LT5oYXNBdWRpb1Nlc3Npb24oKnNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlc3Npb25zID0gdC0+aGFzQXVkaW9TZXNzaW9uKGxTZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbnMgJiBQbGF5YmFja1RocmVhZDo6RUZGRUNUX1NFU1NJT04pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdFRocmVhZCA9IHQuZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gaWYgbm8gYXVkaW8gc2Vzc2lvbiBpZCBpcyBwcm92aWRlZCwgY3JlYXRlIG9uZSBoZXJlCiAgICAgICAgICAgICBsU2Vzc2lvbklkID0gbmV4dFVuaXF1ZUlkKCk7CkBAIC01MTksMTMgKzYyOSwxNCBAQAogICAgICAgICAvLyBtb3ZlIGVmZmVjdCBjaGFpbiB0byB0aGlzIG91dHB1dCB0aHJlYWQgaWYgYW4gZWZmZWN0IG9uIHNhbWUgc2Vzc2lvbiB3YXMgd2FpdGluZwogICAgICAgICAvLyBmb3IgYSB0cmFjayB0byBiZSBjcmVhdGVkCiAgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SICYmIGVmZmVjdFRocmVhZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBubyByaXNrIG9mIGRlYWRsb2NrIGJlY2F1c2UgQXVkaW9GbGluZ2VyOjptTG9jayBpcyBoZWxkCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2RsKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChlZmZlY3RUaHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIG1vdmVFZmZlY3RDaGFpbl9sKGxTZXNzaW9uSWQsIGVmZmVjdFRocmVhZCwgdGhyZWFkLCB0cnVlKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIExvb2sgZm9yIHN5bmMgZXZlbnRzIGF3YWl0aW5nIGZvciBhIHNlc3Npb24gdG8gYmUgdXNlZC4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KW1QZW5kaW5nU3luY0V2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QZW5kaW5nU3luY0V2ZW50cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgaWYgKG1QZW5kaW5nU3luY0V2ZW50c1tpXS0+dHJpZ2dlclNlc3Npb24oKSA9PSBsU2Vzc2lvbklkKSB7CiAgICAgICAgICAgICAgICAgaWYgKHRocmVhZC0+aXNWYWxpZFN5bmNFdmVudChtUGVuZGluZ1N5bmNFdmVudHNbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7CkBAIC01MzgsMjMgKzY0OSwyNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KLSAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAvLyBzIGZvciBzZXJ2ZXIncyBwaWQsIG4gZm9yIG5vcm1hbCBtaXhlciBuYW1lLCBmIGZvciBmYXN0IGluZGV4Ci0gICAgICAgIG5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoInM6JWQ7bjolZDtmOiVkIiwgZ2V0cGlkX2NhY2hlZCwgdHJhY2stPm5hbWUoKSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCwKLSAgICAgICAgICAgICAgICB0cmFjay0+ZmFzdEluZGV4KCkpOwotICAgICAgICB0cmFja0hhbmRsZSA9IG5ldyBUcmFja0hhbmRsZSh0cmFjayk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gcmVtb3ZlIGxvY2FsIHN0cm9uZyByZWZlcmVuY2UgdG8gQ2xpZW50IGJlZm9yZSBkZWxldGluZyB0aGUgVHJhY2sgc28gdGhhdCB0aGUgQ2xpZW50Ci0gICAgICAgIC8vIGRlc3RydWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBUcmFja0Jhc2UgZGVzdHJ1Y3RvciB3aXRoIG1Mb2NrIGhlbGQKLSAgICAgICAgY2xpZW50LmNsZWFyKCk7Ci0gICAgICAgIHRyYWNrLmNsZWFyKCk7CisKICAgICB9CiAKLUV4aXQ6Ci0gICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOworICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCBiZWZvcmUgZGVsZXRpbmcgdGhlIFRyYWNrIHNvIHRoYXQgdGhlCisgICAgICAgIC8vIENsaWVudCBkZXN0cnVjdG9yIGlzIGNhbGxlZCBieSB0aGUgVHJhY2tCYXNlIGRlc3RydWN0b3Igd2l0aCBtQ2xpZW50TG9jayBoZWxkCisgICAgICAgIC8vIERvbid0IGhvbGQgbUNsaWVudExvY2sgd2hlbiByZWxlYXNpbmcgdGhlIHJlZmVyZW5jZSBvbiB0aGUgdHJhY2sgYXMgdGhlCisgICAgICAgIC8vIGRlc3RydWN0b3Igd2lsbCBhY3F1aXJlIGl0LgorICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKKyAgICAgICAgICAgIGNsaWVudC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHRyYWNrLmNsZWFyKCk7CisgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CisKKyAgICAvLyByZXR1cm4gaGFuZGxlIHRvIGNsaWVudAorICAgIHRyYWNrSGFuZGxlID0gbmV3IFRyYWNrSGFuZGxlKHRyYWNrKTsKKworRXhpdDoKKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gdHJhY2tIYW5kbGU7CiB9CiAKQEAgLTU2OSwxNyArNjg0LDYgQEAKICAgICByZXR1cm4gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CiB9CiAKLWludCBBdWRpb0ZsaW5nZXI6OmNoYW5uZWxDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCk7Ci0gICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJjaGFubmVsQ291bnQoKSB1bmtub3duIHRocmVhZCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gdGhyZWFkLT5jaGFubmVsQ291bnQoKTsKLX0KLQogYXVkaW9fZm9ybWF0X3QgQXVkaW9GbGluZ2VyOjpmb3JtYXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdAogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC03MDMsOSArODA3LDE0IEBACiAgICAgfQogCiAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldiA9IG1QcmltYXJ5SGFyZHdhcmVEZXYtPmh3RGV2aWNlKCk7CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfU0VUX01JQ19NVVRFOwotICAgIHJldCA9IGRldi0+c2V0X21pY19tdXRlKGRldiwgc3RhdGUpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvSHdEZXZzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtQXVkaW9Id0RldnMudmFsdWVBdChpKS0+aHdEZXZpY2UoKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZGV2LT5zZXRfbWljX211dGUoZGV2LCBzdGF0ZSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldCA9IHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwogICAgIHJldHVybiByZXQ7CiB9CkBAIC04MDQsNyArOTEzLDcgQEAKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gTlVMTDsKLSAgICBpZiAob3V0cHV0KSB7CisgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICB0aHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KTsKICAgICAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtODM5LDcgKzk0OCw3IEBACiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0ubXV0ZSA9IG11dGVkOwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykKICAgICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5zZXRTdHJlYW1NdXRlKHN0cmVhbSwgbXV0ZWQpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtODUzLDcgKzk2Miw3IEBACiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgZmxvYXQgdm9sdW1lOwotICAgIGlmIChvdXRwdXQpIHsKKyAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KTsKICAgICAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gMC4wZjsKQEAgLTg4Niw4ICs5OTUsOCBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgLy8gaW9IYW5kbGUgPT0gMCBtZWFucyB0aGUgcGFyYW1ldGVycyBhcmUgZ2xvYmFsIHRvIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UKLSAgICBpZiAoaW9IYW5kbGUgPT0gMCkgeworICAgIC8vIEFVRElPX0lPX0hBTkRMRV9OT05FIG1lYW5zIHRoZSBwYXJhbWV0ZXJzIGFyZSBnbG9iYWwgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZQorICAgIGlmIChpb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBzdGF0dXNfdCBmaW5hbF9yZXN1bHQgPSBOT19FUlJPUjsKICAgICAgICAgewpAQCAtOTY5LDcgKzEwNzgsNyBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIGlmIChpb0hhbmRsZSA9PSAwKSB7CisgICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIFN0cmluZzggb3V0X3M4OwogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvSHdEZXZzLnNpemUoKTsgaSsrKSB7CkBAIC0xMDA4LDcgKzExMTcsNyBAQAogCiAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfR0VUX0lOUFVUX0JVRkZFUl9TSVpFOwotICAgIHN0cnVjdCBhdWRpb19jb25maWcgY29uZmlnOworICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZzsKICAgICBtZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOwogICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOwpAQCAtMTAyMCw3ICsxMTI5LDcgQEAKICAgICByZXR1cm4gc2l6ZTsKIH0KIAotdW5zaWduZWQgaW50IEF1ZGlvRmxpbmdlcjo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdAordWludDMyX3QgQXVkaW9GbGluZ2VyOjpnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0CiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIApAQCAtMTA1Miw3ICsxMTYxLDcgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldFJlbmRlclBvc2l0aW9uKHNpemVfdCAqaGFsRnJhbWVzLCBzaXplX3QgKmRzcEZyYW1lcywKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcywKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdAogewogICAgIHN0YXR1c190IHN0YXR1czsKQEAgLTEwNjksMjEgKzExNzgsMzIgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OnJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb0ZsaW5nZXJDbGllbnQ+JiBjbGllbnQpCiB7Ci0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChjbGllbnQgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgY2xpZW50QWRkZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOwogCi0gICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHBpZCkgPCAwKSB7Ci0gICAgICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOwotICAgICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSBjbGllbnQgJXAsIHBpZCAlZCIsIG5vdGlmaWNhdGlvbkNsaWVudC5nZXQoKSwgcGlkKTsKKyAgICAgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleShwaWQpIDwgMCkgeworICAgICAgICAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBuZXcgTm90aWZpY2F0aW9uQ2xpZW50KHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkKTsKKyAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudCgpIGNsaWVudCAlcCwgcGlkICVkIiwgbm90aWZpY2F0aW9uQ2xpZW50LmdldCgpLCBwaWQpOwogCi0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmFkZChwaWQsIG5vdGlmaWNhdGlvbkNsaWVudCk7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQocGlkLCBub3RpZmljYXRpb25DbGllbnQpOwogCi0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGNsaWVudC0+YXNCaW5kZXIoKTsKLSAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOworICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gY2xpZW50LT5hc0JpbmRlcigpOworICAgICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOworICAgICAgICAgICAgY2xpZW50QWRkZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQogCisgICAgLy8gbUNsaWVudExvY2sgc2hvdWxkIG5vdCBiZSBoZWxkIGhlcmUgYmVjYXVzZSBUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudCgpIHdpbGwgbG9jayB0aGUKKyAgICAvLyBUaHJlYWRCYXNlIG11dGV4IGFuZCB0aGUgbG9ja2luZyBvcmRlciBpcyBUaHJlYWRCYXNlOjptTG9jayB0aGVuIEF1ZGlvRmxpbmdlcjo6bUNsaWVudExvY2suCisgICAgaWYgKGNsaWVudEFkZGVkKSB7CiAgICAgICAgIC8vIHRoZSBjb25maWcgY2hhbmdlIGlzIGFsd2F5cyBzZW50IGZyb20gcGxheWJhY2sgb3IgcmVjb3JkIHRocmVhZHMgdG8gYXZvaWQgZGVhZGxvY2sKICAgICAgICAgLy8gd2l0aCBBdWRpb1N5c3RlbTo6Z0xvY2sKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CkBAIC0xMDk5LDggKzEyMTksMTAgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQocGlkX3QgcGlkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHBpZCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbShwaWQpOworICAgIH0KIAogICAgIEFMT0dWKCIlZCBkaWVkLCByZWxlYXNpbmcgaXRzIHNlc3Npb25zIiwgcGlkKTsKICAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOwpAQCAtMTEyMywxNyArMTI0NSwxOCBAQAogICAgIH0KIH0KIAotLy8gYXVkaW9Db25maWdDaGFuZ2VkX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAotdm9pZCBBdWRpb0ZsaW5nZXI6OmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMikKK3ZvaWQgQXVkaW9GbGluZ2VyOjphdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKQogeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2xpZW50TG9jayk7CiAgICAgc2l6ZV90IHNpemUgPSBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+YXVkaW9GbGluZ2VyQ2xpZW50KCktPmlvQ29uZmlnQ2hhbmdlZChldmVudCwgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+YXVkaW9GbGluZ2VyQ2xpZW50KCktPmlvQ29uZmlnQ2hhbmdlZChldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yKTsKICAgICB9CiB9CiAKLS8vIHJlbW92ZUNsaWVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKKy8vIHJlbW92ZUNsaWVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1DbGllbnRMb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpyZW1vdmVDbGllbnRfbChwaWRfdCBwaWQpCiB7CiAgICAgQUxPR1YoInJlbW92ZUNsaWVudF9sKCkgcGlkICVkLCBjYWxsaW5nIHBpZCAlZCIsIHBpZCwKQEAgLTExNzEsNyArMTI5NCw3IEBACiAgICAgLy8gMSBNQiBvZiBhZGRyZXNzIHNwYWNlIGlzIGdvb2QgZm9yIDMyIHRyYWNrcywgOCBidWZmZXJzIGVhY2gsIDQgS0IvYnVmZmVyCiB9CiAKLS8vIENsaWVudCBkZXN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCisvLyBDbGllbnQgZGVzdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUNsaWVudExvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpDbGllbnQ6On5DbGllbnQoKQogewogICAgIG1BdWRpb0ZsaW5nZXItPnJlbW92ZUNsaWVudF9sKG1QaWQpOwpAQCAtMTIyMCw3ICsxMzQzLDcgQEAKIHsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok5vdGlmaWNhdGlvbkNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKQordm9pZCBBdWRpb0ZsaW5nZXI6Ok5vdGlmaWNhdGlvbkNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4ga2VlcCh0aGlzKTsKICAgICBtQXVkaW9GbGluZ2VyLT5yZW1vdmVOb3RpZmljYXRpb25DbGllbnQobVBpZCk7CkBAIC0xMjM4LDIwICsxMzYxLDI0IEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgKmZyYW1lQ291bnQsCiAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgIGludCAqc2Vzc2lvbklkLAorICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCisgICAgICAgIHNwPElNZW1vcnk+JiBidWZmZXJzLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogewogICAgIHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IHJlY29yZFRyYWNrOwogICAgIHNwPFJlY29yZEhhbmRsZT4gcmVjb3JkSGFuZGxlOwogICAgIHNwPENsaWVudD4gY2xpZW50OwogICAgIHN0YXR1c190IGxTdGF0dXM7Ci0gICAgUmVjb3JkVGhyZWFkICp0aHJlYWQ7Ci0gICAgc2l6ZV90IGluRnJhbWVDb3VudDsKICAgICBpbnQgbFNlc3Npb25JZDsKIAorICAgIGNibGsuY2xlYXIoKTsKKyAgICBidWZmZXJzLmNsZWFyKCk7CisKICAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCiAgICAgaWYgKCFyZWNvcmRpbmdBbGxvd2VkKCkpIHsKICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBwZXJtaXNzaW9uIGRlbmllZDogcmVjb3JkaW5nIG5vdCBhbGxvd2VkIik7CkBAIC0xMjU5LDE2ICsxMzg2LDMxIEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgaW52YWxpZCBmb3JtYXQgJWQiLCBmb3JtYXQpOworICAgIC8vIGZ1cnRoZXIgc2FtcGxlIHJhdGUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgY3JlYXRlUmVjb3JkVHJhY2tfbCgpCisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCkgeworICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGludmFsaWQgc2FtcGxlIHJhdGUgJXUiLCBzYW1wbGVSYXRlKTsKICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAotICAgIC8vIGFkZCBjbGllbnQgdG8gbGlzdAotICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCisgICAgLy8gd2UgZG9uJ3QgeWV0IHN1cHBvcnQgYW55dGhpbmcgb3RoZXIgdGhhbiAxNi1iaXQgUENNCisgICAgaWYgKCEoYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgJiYKKyAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpKSB7CisgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgaW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIC8vIGZ1cnRoZXIgY2hhbm5lbCBtYXNrIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGNyZWF0ZVJlY29yZFRyYWNrX2woKQorICAgIGlmICghYXVkaW9faXNfaW5wdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKKyAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBpbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIHRocmVhZCA9IGNoZWNrUmVjb3JkVGhyZWFkX2woaW5wdXQpOworICAgICAgICBSZWNvcmRUaHJlYWQgKnRocmVhZCA9IGNoZWNrUmVjb3JkVGhyZWFkX2woaW5wdXQpOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgY2hlY2tSZWNvcmRUaHJlYWRfbCBmYWlsZWQiKTsKICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CkBAIC0xMjgzLDQyICsxNDI1LDU4IEBACiAgICAgICAgIH0KIAogICAgICAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgIGNsaWVudCA9IHJlZ2lzdGVyUGlkX2wocGlkKTsKKyAgICAgICAgY2xpZW50ID0gcmVnaXN0ZXJQaWQocGlkKTsKIAotICAgICAgICAvLyBJZiBubyBhdWRpbyBzZXNzaW9uIGlkIGlzIHByb3ZpZGVkLCBjcmVhdGUgb25lIGhlcmUKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMICYmICpzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUpIHsKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaWYgbm8gYXVkaW8gc2Vzc2lvbiBpZCBpcyBwcm92aWRlZCwgY3JlYXRlIG9uZSBoZXJlCiAgICAgICAgICAgICBsU2Vzc2lvbklkID0gbmV4dFVuaXF1ZUlkKCk7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqc2Vzc2lvbklkID0gbFNlc3Npb25JZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvLyBjcmVhdGUgbmV3IHJlY29yZCB0cmFjay4KLSAgICAgICAgLy8gVGhlIHJlY29yZCB0cmFjayB1c2VzIG9uZSB0cmFjayBpbiBtSGFyZHdhcmVNaXhlclRocmVhZCBieSBjb252ZW50aW9uLgorICAgICAgICBBTE9HVigib3BlblJlY29yZCgpIGxTZXNzaW9uSWQ6ICVkIGlucHV0ICVkIiwgbFNlc3Npb25JZCwgaW5wdXQpOworCiAgICAgICAgIC8vIFRPRE86IHRoZSB1aWQgc2hvdWxkIGJlIHBhc3NlZCBpbiBhcyBhIHBhcmFtZXRlciB0byBvcGVuUmVjb3JkCiAgICAgICAgIHJlY29yZFRyYWNrID0gdGhyZWFkLT5jcmVhdGVSZWNvcmRUcmFja19sKGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbFNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbFNlc3Npb25JZCwgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCB0aWQsICZsU3RhdHVzKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigobFN0YXR1cyA9PSBOT19FUlJPUikgJiYgKHJlY29yZFRyYWNrID09IDApKTsKKworICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgb25lIGVmZmVjdCBjaGFpbiB3YXMgYXdhaXRpbmcgZm9yIGFuIEF1ZGlvUmVjb3JkIHRvIGJlIGNyZWF0ZWQgb24gdGhpcworICAgICAgICAgICAgLy8gc2Vzc2lvbiBhbmQgbW92ZSBpdCB0byB0aGlzIHRocmVhZC4KKyAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldE9ycGhhbkVmZmVjdENoYWluX2woKGF1ZGlvX3Nlc3Npb25fdClsU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgICAgIHRocmVhZC0+YWRkRWZmZWN0Q2hhaW5fbChjaGFpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisKICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAvLyByZW1vdmUgbG9jYWwgc3Ryb25nIHJlZmVyZW5jZSB0byBDbGllbnQgYmVmb3JlIGRlbGV0aW5nIHRoZSBSZWNvcmRUcmFjayBzbyB0aGF0IHRoZQotICAgICAgICAvLyBDbGllbnQgZGVzdHJ1Y3RvciBpcyBjYWxsZWQgYnkgdGhlIFRyYWNrQmFzZSBkZXN0cnVjdG9yIHdpdGggbUxvY2sgaGVsZAotICAgICAgICBjbGllbnQuY2xlYXIoKTsKKyAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBUcmFja0Jhc2UgZGVzdHJ1Y3RvciB3aXRoIG1DbGllbnRMb2NrIGhlbGQKKyAgICAgICAgLy8gRG9uJ3QgaG9sZCBtQ2xpZW50TG9jayB3aGVuIHJlbGVhc2luZyB0aGUgcmVmZXJlbmNlIG9uIHRoZSB0cmFjayBhcyB0aGUKKyAgICAgICAgLy8gZGVzdHJ1Y3RvciB3aWxsIGFjcXVpcmUgaXQuCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOworICAgICAgICAgICAgY2xpZW50LmNsZWFyKCk7CisgICAgICAgIH0KICAgICAgICAgcmVjb3JkVHJhY2suY2xlYXIoKTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAotICAgIC8vIHJldHVybiB0byBoYW5kbGUgdG8gY2xpZW50CisgICAgY2JsayA9IHJlY29yZFRyYWNrLT5nZXRDYmxrKCk7CisgICAgYnVmZmVycyA9IHJlY29yZFRyYWNrLT5nZXRCdWZmZXJzKCk7CisKKyAgICAvLyByZXR1cm4gaGFuZGxlIHRvIGNsaWVudAogICAgIHJlY29yZEhhbmRsZSA9IG5ldyBSZWNvcmRIYW5kbGUocmVjb3JkVHJhY2spOwotICAgIGxTdGF0dXMgPSBOT19FUlJPUjsKIAogRXhpdDoKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gcmVjb3JkSGFuZGxlOwogfQogCkBAIC0xMzI4LDYgKzE0ODYsOSBAQAogCiBhdWRpb19tb2R1bGVfaGFuZGxlX3QgQXVkaW9GbGluZ2VyOjpsb2FkSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKIHsKKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTE0MDYsNyArMTU2Nyw3IEBACiAgICAgfQogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSA9IG5leHRVbmlxdWVJZCgpOwotICAgIG1BdWRpb0h3RGV2cy5hZGQoaGFuZGxlLCBuZXcgQXVkaW9Id0RldmljZShuYW1lLCBkZXYsIGZsYWdzKSk7CisgICAgbUF1ZGlvSHdEZXZzLmFkZChoYW5kbGUsIG5ldyBBdWRpb0h3RGV2aWNlKGhhbmRsZSwgbmFtZSwgZGV2LCBmbGFncykpOwogCiAgICAgQUxPR0koImxvYWRId01vZHVsZSgpIExvYWRlZCAlcyBhdWRpbyBpbnRlcmZhY2UgZnJvbSAlcyAoJXMpIGhhbmRsZSAlZCIsCiAgICAgICAgICAgbmFtZSwgZGV2LT5jb21tb24ubW9kdWxlLT5uYW1lLCBkZXYtPmNvbW1vbi5tb2R1bGUtPmlkLCBoYW5kbGUpOwpAQCAtMTQ0OCwxMTcgKzE2MDksMTU1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCithdWRpb19od19zeW5jX3QgQXVkaW9GbGluZ2VyOjpnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoKHRocmVhZC0+aGFzQXVkaW9TZXNzaW9uKHNlc3Npb25JZCkgJiBUaHJlYWRCYXNlOjpUUkFDS19TRVNTSU9OKSAhPSAwKSB7CisgICAgICAgICAgICAvLyBBIHNlc3Npb24gY2FuIG9ubHkgYmUgb24gb25lIHRocmVhZCwgc28gZXhpdCBhZnRlciBmaXJzdCBtYXRjaAorICAgICAgICAgICAgU3RyaW5nOCByZXBseSA9IHRocmVhZC0+Z2V0UGFyYW1ldGVycyhTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSFdfQVZfU1lOQykpOworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihyZXBseSk7CisgICAgICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9IV19BVl9TWU5DKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEFVRElPX0hXX1NZTkNfSU5WQUxJRDsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb0ZsaW5nZXI6Om9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQorCitzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkPiBBdWRpb0ZsaW5nZXI6Om9wZW5PdXRwdXRfbChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKIHsKLSAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gTlVMTDsKLSAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnIGNvbmZpZzsKLSAgICBjb25maWcuc2FtcGxlX3JhdGUgPSAocFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSA/ICpwU2FtcGxpbmdSYXRlIDogMDsKLSAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gKHBDaGFubmVsTWFzayAhPSBOVUxMKSA/ICpwQ2hhbm5lbE1hc2sgOiAwOwotICAgIGNvbmZpZy5mb3JtYXQgPSAocEZvcm1hdCAhPSBOVUxMKSA/ICpwRm9ybWF0IDogQVVESU9fRk9STUFUX0RFRkFVTFQ7Ci0gICAgaWYgKG9mZmxvYWRJbmZvKSB7Ci0gICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8gPSAqb2ZmbG9hZEluZm87CisgICAgQXVkaW9Id0RldmljZSAqb3V0SHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgZGV2aWNlcyk7CisgICAgaWYgKG91dEh3RGV2ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgYXVkaW9fc3RyZWFtX291dF90ICpvdXRTdHJlYW0gPSBOVUxMOwotICAgIEF1ZGlvSHdEZXZpY2UgKm91dEh3RGV2OworICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldkhhbCA9IG91dEh3RGV2LT5od0RldmljZSgpOworICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICpvdXRwdXQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICB9CiAKKyAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19PVVRQVVRfT1BFTjsKKworICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqb3V0U3RyZWFtID0gTlVMTDsKKworICAgIC8vIEZPUiBURVNUSU5HIE9OTFk6CisgICAgLy8gVGhpcyBpZiBzdGF0ZW1lbnQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIGF1ZGlvIHBvbGljeSBzZXR0aW5ncworICAgIC8vIGFuZCBmb3JjaW5nIGEgc3BlY2lmaWMgZm9ybWF0IG9yIGNoYW5uZWwgbWFzayB0byB0aGUgSEFML1NpbmsgZGV2aWNlIGZvciB0ZXN0aW5nLgorICAgIGlmICghKGZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpKSkgeworICAgICAgICAvLyBDaGVjayBvbmx5IGZvciBOb3JtYWwgTWl4aW5nIG1vZGUKKyAgICAgICAgaWYgKGtFbmFibGVFeHRlbmRlZFByZWNpc2lvbikgeworICAgICAgICAgICAgLy8gU3BlY2lmeSBmb3JtYXQgKHVuY29tbWVudCBvbmUgYmVsb3cgdG8gY2hvb3NlKQorICAgICAgICAgICAgLy9jb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgICAgICAgICAvL2NvbmZpZy0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOworICAgICAgICAgICAgLy9jb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOworICAgICAgICAgICAgLy9jb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQ7CisgICAgICAgICAgICAvLyBBTE9HVigib3Blbk91dHB1dF9sKCkgdXBncmFkaW5nIGZvcm1hdCB0byAlIzA4eCIsIGNvbmZpZy0+Zm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgIC8vIFNwZWNpZnkgY2hhbm5lbCBtYXNrICh1bmNvbW1lbnQgb25lIGJlbG93IHRvIGNob29zZSkKKyAgICAgICAgICAgIC8vY29uZmlnLT5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoNCk7ICAvLyBmb3IgVVNCIDRjaAorICAgICAgICAgICAgLy9jb25maWctPmNoYW5uZWxfbWFzayA9IGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3JlcHJlc2VudGF0aW9uX2FuZF9iaXRzKAorICAgICAgICAgICAgLy8gICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVgsICgxIDw8IDQpIC0gMSk7ICAvLyBhbm90aGVyIDRjaCBleGFtcGxlCisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBod0RldkhhbC0+b3Blbl9vdXRwdXRfc3RyZWFtKGh3RGV2SGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKKworICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CisgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIG9wZW5PdXRwdXRTdHJlYW0gcmV0dXJuZWQgb3V0cHV0ICVwLCBzYW1wbGVSYXRlICVkLCBGb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAiY2hhbm5lbE1hc2sgJSN4LCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgb3V0U3RyZWFtLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBzdGF0dXMpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBvdXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICBBdWRpb1N0cmVhbU91dCAqb3V0cHV0U3RyZWFtID0gbmV3IEF1ZGlvU3RyZWFtT3V0KG91dEh3RGV2LCBvdXRTdHJlYW0sIGZsYWdzKTsKKworICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkOworICAgICAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7CisgICAgICAgICAgICB0aHJlYWQgPSBuZXcgT2ZmbG9hZFRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIGRldmljZXMpOworICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIGNyZWF0ZWQgb2ZmbG9hZCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsICpvdXRwdXQsIHRocmVhZCk7CisgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKQorICAgICAgICAgICAgICAgIHx8ICFpc1ZhbGlkUGNtU2lua0Zvcm1hdChjb25maWctPmZvcm1hdCkKKyAgICAgICAgICAgICAgICB8fCAhaXNWYWxpZFBjbVNpbmtDaGFubmVsTWFzayhjb25maWctPmNoYW5uZWxfbWFzaykpIHsKKyAgICAgICAgICAgIHRocmVhZCA9IG5ldyBEaXJlY3RPdXRwdXRUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzKTsKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBjcmVhdGVkIGRpcmVjdCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsICpvdXRwdXQsIHRocmVhZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJlYWQgPSBuZXcgTWl4ZXJUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzKTsKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBjcmVhdGVkIG1peGVyIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgKm91dHB1dCwgdGhyZWFkKTsKKyAgICAgICAgfQorICAgICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZCgqb3V0cHV0LCB0aHJlYWQpOworICAgICAgICByZXR1cm4gdGhyZWFkOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKK3sKICAgICBBTE9HVigib3Blbk91dHB1dCgpLCBtb2R1bGUgJWQgRGV2aWNlICV4LCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlIzA4eCwgQ2hhbm5lbHMgJXgsIGZsYWdzICV4IiwKICAgICAgICAgICAgICAgbW9kdWxlLAotICAgICAgICAgICAgICAocERldmljZXMgIT0gTlVMTCkgPyAqcERldmljZXMgOiAwLAotICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQsCi0gICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgIChkZXZpY2VzICE9IE5VTEwpID8gKmRldmljZXMgOiAwLAorICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCiAgICAgICAgICAgICAgIGZsYWdzKTsKLSAgICBBTE9HVigib3Blbk91dHB1dCgpLCBvZmZsb2FkSW5mbyAlcCB2ZXJzaW9uIDB4JTA0eCIsCi0gICAgICAgICAgb2ZmbG9hZEluZm8sIG9mZmxvYWRJbmZvID09IE5VTEwgPyAtMSA6IG9mZmxvYWRJbmZvLT52ZXJzaW9uICk7CiAKLSAgICBpZiAocERldmljZXMgPT0gTlVMTCB8fCAqcERldmljZXMgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoKmRldmljZXMgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgb3V0SHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgKnBEZXZpY2VzKTsKLSAgICBpZiAob3V0SHdEZXYgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZIYWwgPSBvdXRId0Rldi0+aHdEZXZpY2UoKTsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBpZCA9IG5leHRVbmlxdWVJZCgpOwotCi0gICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfT1VUUFVUX09QRU47Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBod0RldkhhbC0+b3Blbl9vdXRwdXRfc3RyZWFtKGh3RGV2SGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmVhbSk7Ci0KLSAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwotICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgb3Blbk91dHB1dFN0cmVhbSByZXR1cm5lZCBvdXRwdXQgJXAsIFNhbXBsaW5nUmF0ZSAlZCwgRm9ybWF0ICUjMDh4LCAiCi0gICAgICAgICAgICAiQ2hhbm5lbHMgJXgsIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICBvdXRTdHJlYW0sCi0gICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICBjb25maWcuZm9ybWF0LAotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIHN0YXR1cyk7Ci0KLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG91dFN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXQgPSBuZXcgQXVkaW9TdHJlYW1PdXQob3V0SHdEZXYsIG91dFN0cmVhbSwgZmxhZ3MpOwotCi0gICAgICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKLSAgICAgICAgICAgIHRocmVhZCA9IG5ldyBPZmZsb2FkVGhyZWFkKHRoaXMsIG91dHB1dCwgaWQsICpwRGV2aWNlcyk7Ci0gICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dCgpIGNyZWF0ZWQgb2ZmbG9hZCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsIGlkLCB0aHJlYWQpOwotICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgfHwKLSAgICAgICAgICAgIChjb25maWcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB8fAotICAgICAgICAgICAgKGNvbmZpZy5jaGFubmVsX21hc2sgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkgewotICAgICAgICAgICAgdGhyZWFkID0gbmV3IERpcmVjdE91dHB1dFRocmVhZCh0aGlzLCBvdXRwdXQsIGlkLCAqcERldmljZXMpOwotICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSBjcmVhdGVkIGRpcmVjdCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsIGlkLCB0aHJlYWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyZWFkID0gbmV3IE1peGVyVGhyZWFkKHRoaXMsIG91dHB1dCwgaWQsICpwRGV2aWNlcyk7Ci0gICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dCgpIGNyZWF0ZWQgbWl4ZXIgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCBpZCwgdGhyZWFkKTsKLSAgICAgICAgfQotICAgICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZChpZCwgdGhyZWFkKTsKLQotICAgICAgICBpZiAocFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcFNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEZvcm1hdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcEZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDaGFubmVsTWFzayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcENoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgfQotICAgICAgICBpZiAocExhdGVuY3lNcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcExhdGVuY3lNcyA9IHRocmVhZC0+bGF0ZW5jeSgpOwotICAgICAgICB9CisgICAgc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZCA9IG9wZW5PdXRwdXRfbChtb2R1bGUsIG91dHB1dCwgY29uZmlnLCAqZGV2aWNlcywgYWRkcmVzcywgZmxhZ3MpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICAqbGF0ZW5jeU1zID0gdGhyZWFkLT5sYXRlbmN5KCk7CiAKICAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBvdXRwdXQgY3JlYXRpb24KLSAgICAgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRCk7CisgICAgICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKIAogICAgICAgICAvLyB0aGUgZmlyc3QgcHJpbWFyeSBvdXRwdXQgb3BlbmVkIGRlc2lnbmF0ZXMgdGhlIHByaW1hcnkgaHcgZGV2aWNlCiAgICAgICAgIGlmICgobVByaW1hcnlIYXJkd2FyZURldiA9PSBOVUxMKSAmJiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSkgewogICAgICAgICAgICAgQUxPR0koIlVzaW5nIG1vZHVsZSAlZCBoYXMgdGhlIHByaW1hcnkgYXVkaW8gaW50ZXJmYWNlIiwgbW9kdWxlKTsKLSAgICAgICAgICAgIG1QcmltYXJ5SGFyZHdhcmVEZXYgPSBvdXRId0RldjsKKyAgICAgICAgICAgIG1QcmltYXJ5SGFyZHdhcmVEZXYgPSB0aHJlYWQtPmdldE91dHB1dCgpLT5hdWRpb0h3RGV2OwogCiAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKICAgICAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX1NFVF9NT0RFOwotICAgICAgICAgICAgaHdEZXZIYWwtPnNldF9tb2RlKGh3RGV2SGFsLCBtTW9kZSk7CisgICAgICAgICAgICBtUHJpbWFyeUhhcmR3YXJlRGV2LT5od0RldmljZSgpLT5zZXRfbW9kZShtUHJpbWFyeUhhcmR3YXJlRGV2LT5od0RldmljZSgpLCBtTW9kZSk7CiAgICAgICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOworCisgICAgICAgICAgICBtUHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAotICAgIHJldHVybiAwOworICAgIHJldHVybiBOT19JTklUOwogfQogCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb0ZsaW5nZXI6Om9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKQEAgLTE1NzEsNyArMTc3MCw3IEBACiAgICAgaWYgKHRocmVhZDEgPT0gTlVMTCB8fCB0aHJlYWQyID09IE5VTEwpIHsKICAgICAgICAgQUxPR1coIm9wZW5EdXBsaWNhdGVPdXRwdXQoKSB3cm9uZyBvdXRwdXQgbWl4ZXIgdHlwZSBmb3Igb3V0cHV0ICVkIG9yICVkIiwgb3V0cHV0MSwKICAgICAgICAgICAgICAgICBvdXRwdXQyKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICB9CiAKICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCA9IG5leHRVbmlxdWVJZCgpOwpAQCAtMTU3OSw3ICsxNzc4LDcgQEAKICAgICB0aHJlYWQtPmFkZE91dHB1dFRyYWNrKHRocmVhZDIpOwogICAgIG1QbGF5YmFja1RocmVhZHMuYWRkKGlkLCB0aHJlYWQpOwogICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgb3V0cHV0IGNyZWF0aW9uCi0gICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRCk7CisgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWQoQXVkaW9TeXN0ZW06Ok9VVFBVVF9PUEVORUQpOwogICAgIHJldHVybiBpZDsKIH0KIApAQCAtMTYyOCwyMiArMTgyNywzNSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX0NMT1NFRCwgb3V0cHV0LCBOVUxMKTsKKyAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ0xPU0VELCBvdXRwdXQsIE5VTEwpOwogICAgIH0KICAgICB0aHJlYWQtPmV4aXQoKTsKICAgICAvLyBUaGUgdGhyZWFkIGVudGl0eSAoYWN0aXZlIHVuaXQgb2YgZXhlY3V0aW9uKSBpcyBubyBsb25nZXIgcnVubmluZyBoZXJlLAogICAgIC8vIGJ1dCB0aGUgVGhyZWFkQmFzZSBjb250YWluZXIgc3RpbGwgZXhpc3RzLgogCiAgICAgaWYgKCF0aHJlYWQtPmlzRHVwbGljYXRpbmcoKSkgewotICAgICAgICBBdWRpb1N0cmVhbU91dCAqb3V0ID0gdGhyZWFkLT5jbGVhck91dHB1dCgpOwotICAgICAgICBBTE9HX0FTU0VSVChvdXQgIT0gTlVMTCwgIm91dCBzaG91bGRuJ3QgYmUgTlVMTCIpOwotICAgICAgICAvLyBmcm9tIG5vdyBvbiB0aHJlYWQtPm1PdXRwdXQgaXMgTlVMTAotICAgICAgICBvdXQtPmh3RGV2KCktPmNsb3NlX291dHB1dF9zdHJlYW0ob3V0LT5od0RldigpLCBvdXQtPnN0cmVhbSk7Ci0gICAgICAgIGRlbGV0ZSBvdXQ7CisgICAgICAgIGNsb3NlT3V0cHV0RmluaXNoKHRocmVhZCk7CiAgICAgfQorCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VPdXRwdXRGaW5pc2goc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZCkKK3sKKyAgICBBdWRpb1N0cmVhbU91dCAqb3V0ID0gdGhyZWFkLT5jbGVhck91dHB1dCgpOworICAgIEFMT0dfQVNTRVJUKG91dCAhPSBOVUxMLCAib3V0IHNob3VsZG4ndCBiZSBOVUxMIik7CisgICAgLy8gZnJvbSBub3cgb24gdGhyZWFkLT5tT3V0cHV0IGlzIE5VTEwKKyAgICBvdXQtPmh3RGV2KCktPmNsb3NlX291dHB1dF9zdHJlYW0ob3V0LT5od0RldigpLCBvdXQtPnN0cmVhbSk7CisgICAgZGVsZXRlIG91dDsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlT3V0cHV0SW50ZXJuYWxfbChzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkKQoreworICAgIG1QbGF5YmFja1RocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CisgICAgdGhyZWFkLT5leGl0KCk7CisgICAgY2xvc2VPdXRwdXRGaW5pc2godGhyZWFkKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTY3NSw1OCArMTg4Nyw3NiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9GbGluZ2VyOjpvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaykKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6b3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKIHsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgUmVjb3JkVGhyZWFkICp0aHJlYWQgPSBOVUxMOwotICAgIHN0cnVjdCBhdWRpb19jb25maWcgY29uZmlnOwotICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IChwU2FtcGxpbmdSYXRlICE9IE5VTEwpID8gKnBTYW1wbGluZ1JhdGUgOiAwOwotICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSAocENoYW5uZWxNYXNrICE9IE5VTEwpID8gKnBDaGFubmVsTWFzayA6IDA7Ci0gICAgY29uZmlnLmZvcm1hdCA9IChwRm9ybWF0ICE9IE5VTEwpID8gKnBGb3JtYXQgOiBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgdWludDMyX3QgcmVxU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgIGF1ZGlvX2Zvcm1hdF90IHJlcUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcmVxQ2hhbm5lbHMgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICppblN0cmVhbSA9IE5VTEw7Ci0gICAgQXVkaW9Id0RldmljZSAqaW5Id0RldjsKKyAgICBpZiAoKmRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAotICAgIGlmIChwRGV2aWNlcyA9PSBOVUxMIHx8ICpwRGV2aWNlcyA9PSAwKSB7CisgICAgc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQgPSBvcGVuSW5wdXRfbChtb2R1bGUsIGlucHV0LCBjb25maWcsICpkZXZpY2UsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOworCisgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgaW5wdXQgY3JlYXRpb24KKyAgICAgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWQoQXVkaW9TeXN0ZW06OklOUFVUX09QRU5FRCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3NwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkPiBBdWRpb0ZsaW5nZXI6Om9wZW5JbnB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQoreworICAgIEF1ZGlvSHdEZXZpY2UgKmluSHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgZGV2aWNlKTsKKyAgICBpZiAoaW5Id0RldiA9PSBOVUxMKSB7CisgICAgICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmICgqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgKmlucHV0ID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgfQogCi0gICAgaW5Id0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCAqcERldmljZXMpOwotICAgIGlmIChpbkh3RGV2ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAwOwotCisgICAgYXVkaW9fY29uZmlnX3QgaGFsY29uZmlnID0gKmNvbmZpZzsKICAgICBhdWRpb19od19kZXZpY2VfdCAqaW5Id0hhbCA9IGluSHdEZXYtPmh3RGV2aWNlKCk7Ci0gICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSBuZXh0VW5pcXVlSWQoKTsKLQotICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsIGlkLCAqcERldmljZXMsICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RyZWFtKTsKLSAgICBBTE9HVigib3BlbklucHV0KCkgb3BlbklucHV0U3RyZWFtIHJldHVybmVkIGlucHV0ICVwLCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlZCwgQ2hhbm5lbHMgJXgsICIKLSAgICAgICAgICAgICJzdGF0dXMgJWQiLAorICAgIGF1ZGlvX3N0cmVhbV9pbl90ICppblN0cmVhbSA9IE5VTEw7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5Id0hhbC0+b3Blbl9pbnB1dF9zdHJlYW0oaW5Id0hhbCwgKmlucHV0LCBkZXZpY2UsICZoYWxjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RyZWFtLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlKTsKKyAgICBBTE9HVigib3BlbklucHV0X2woKSBvcGVuSW5wdXRTdHJlYW0gcmV0dXJuZWQgaW5wdXQgJXAsIFNhbXBsaW5nUmF0ZSAlZCIKKyAgICAgICAgICAgIiwgRm9ybWF0ICUjeCwgQ2hhbm5lbHMgJXgsIGZsYWdzICUjeCwgc3RhdHVzICVkIiwKICAgICAgICAgICAgIGluU3RyZWFtLAotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgY29uZmlnLmZvcm1hdCwKLSAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBoYWxjb25maWcuc2FtcGxlX3JhdGUsCisgICAgICAgICAgICBoYWxjb25maWcuZm9ybWF0LAorICAgICAgICAgICAgaGFsY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgc3RhdHVzKTsKIAogICAgIC8vIElmIHRoZSBpbnB1dCBjb3VsZCBub3QgYmUgb3BlbmVkIHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzIGFuZCB3ZSBjYW4gaGFuZGxlIHRoZQogICAgIC8vIGNvbnZlcnNpb24gaW50ZXJuYWxseSwgdHJ5IHRvIG9wZW4gYWdhaW4gd2l0aCB0aGUgcHJvcG9zZWQgcGFyYW1ldGVycy4gVGhlIEF1ZGlvRmxpbmdlciBjYW4KICAgICAvLyByZXNhbXBsZSB0aGUgaW5wdXQgYW5kIGRvIG1vbm8gdG8gc3RlcmVvIG9yIHN0ZXJlbyB0byBtb25vIGNvbnZlcnNpb25zIG9uIDE2IGJpdCBQQ00gaW5wdXRzLgogICAgIGlmIChzdGF0dXMgPT0gQkFEX1ZBTFVFICYmCi0gICAgICAgIHJlcUZvcm1hdCA9PSBjb25maWcuZm9ybWF0ICYmIGNvbmZpZy5mb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgJiYKLSAgICAgICAgKGNvbmZpZy5zYW1wbGVfcmF0ZSA8PSAyICogcmVxU2FtcGxpbmdSYXRlKSAmJgotICAgICAgICAocG9wY291bnQoY29uZmlnLmNoYW5uZWxfbWFzaykgPD0gRkNDXzIpICYmIChwb3Bjb3VudChyZXFDaGFubmVscykgPD0gRkNDXzIpKSB7Ci0gICAgICAgIEFMT0dWKCJvcGVuSW5wdXQoKSByZW9wZW5pbmcgd2l0aCBwcm9wb3NlZCBzYW1wbGluZyByYXRlIGFuZCBjaGFubmVsIG1hc2siKTsKKyAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0ID09IGhhbGNvbmZpZy5mb3JtYXQgJiYgaGFsY29uZmlnLmZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAmJgorICAgICAgICAoaGFsY29uZmlnLnNhbXBsZV9yYXRlIDw9IDIgKiBjb25maWctPnNhbXBsZV9yYXRlKSAmJgorICAgICAgICAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soaGFsY29uZmlnLmNoYW5uZWxfbWFzaykgPD0gRkNDXzIpICYmCisgICAgICAgIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmNoYW5uZWxfbWFzaykgPD0gRkNDXzIpKSB7CisgICAgICAgIC8vIEZJWE1FIGRlc2NyaWJlIHRoZSBjaGFuZ2UgcHJvcG9zZWQgYnkgSEFMIChzYXZlIG9sZCB2YWx1ZXMgc28gd2UgY2FuIGxvZyB0aGVtIGhlcmUpCisgICAgICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIHJlb3BlbmluZyB3aXRoIHByb3Bvc2VkIHNhbXBsaW5nIHJhdGUgYW5kIGNoYW5uZWwgbWFzayIpOwogICAgICAgICBpblN0cmVhbSA9IE5VTEw7Ci0gICAgICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsIGlkLCAqcERldmljZXMsICZjb25maWcsICZpblN0cmVhbSk7CisgICAgICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsICppbnB1dCwgZGV2aWNlLCAmaGFsY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHJlYW0sIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UpOworICAgICAgICAvLyBGSVhNRSBsb2cgdGhpcyBuZXcgc3RhdHVzOyBIQUwgc2hvdWxkIG5vdCBwcm9wb3NlIGFueSBmdXJ0aGVyIGNoYW5nZXMKICAgICB9CiAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIGluU3RyZWFtICE9IE5VTEwpIHsKQEAgLTE3NDAsMTcgKzE5NzAsMTcgQEAKICAgICAgICAgICAgIFRFRV9TSU5LX05FVywgICAvLyBjb3B5IGlucHV0IHVzaW5nIGEgbmV3IHBpcGUKICAgICAgICAgICAgIFRFRV9TSU5LX09MRCwgICAvLyBjb3B5IGlucHV0IHVzaW5nIGFuIGV4aXN0aW5nIHBpcGUKICAgICAgICAgfSBraW5kOwotICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhpblN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmaW5TdHJlYW0tPmNvbW1vbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wY291bnQoaW5TdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJmluU3RyZWFtLT5jb21tb24pKSk7CisgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKGhhbGNvbmZpZy5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhoYWxjb25maWcuY2hhbm5lbF9tYXNrKSwgaGFsY29uZmlnLmZvcm1hdCk7CiAgICAgICAgIGlmICghbVRlZVNpbmtJbnB1dEVuYWJsZWQpIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gRm9ybWF0X0ludmFsaWQpIHsKKyAgICAgICAgfSBlbHNlIGlmICghRm9ybWF0X2lzVmFsaWQoZm9ybWF0KSkgewogICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwogICAgICAgICB9IGVsc2UgaWYgKG1SZWNvcmRUZWVTaW5rID09IDApIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19ORVc7CiAgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRlZVNpbmstPmdldFN0cm9uZ0NvdW50KCkgIT0gMSkgewogICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBtUmVjb3JkVGVlU2luay0+Zm9ybWF0KCkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChGb3JtYXRfaXNFcXVhbChmb3JtYXQsIG1SZWNvcmRUZWVTaW5rLT5mb3JtYXQoKSkpIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19PTEQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTkVXOwpAQCAtMTc4MCwzOSArMjAxMCwyNiBAQAogICAgICAgICB9CiAjZW5kaWYKIAotICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCA9IG5ldyBBdWRpb1N0cmVhbUluKGluSHdEZXYsIGluU3RyZWFtKTsKKyAgICAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXRTdHJlYW0gPSBuZXcgQXVkaW9TdHJlYW1Jbihpbkh3RGV2LCBpblN0cmVhbSk7CiAKICAgICAgICAgLy8gU3RhcnQgcmVjb3JkIHRocmVhZAogICAgICAgICAvLyBSZWNvcmRUaHJlYWQgcmVxdWlyZXMgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGRldmljZSBpbmRpY2F0aW9uIHRvIGZvcndhcmQgdG8gYXVkaW8KICAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmcgbW9kdWxlcwotICAgICAgICB0aHJlYWQgPSBuZXcgUmVjb3JkVGhyZWFkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+IHRocmVhZCA9IG5ldyBSZWNvcmRUaHJlYWQodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dERldmljZV9sKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEZXZpY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlCiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHRlZVNpbmsKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIG1SZWNvcmRUaHJlYWRzLmFkZChpZCwgdGhyZWFkKTsKLSAgICAgICAgQUxPR1YoIm9wZW5JbnB1dCgpIGNyZWF0ZWQgcmVjb3JkIHRocmVhZDogSUQgJWQgdGhyZWFkICVwIiwgaWQsIHRocmVhZCk7Ci0gICAgICAgIGlmIChwU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwU2FtcGxpbmdSYXRlID0gcmVxU2FtcGxpbmdSYXRlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRm9ybWF0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLSAgICAgICAgfQotICAgICAgICBpZiAocENoYW5uZWxNYXNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwQ2hhbm5lbE1hc2sgPSByZXFDaGFubmVsczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgaW5wdXQgY3JlYXRpb24KLSAgICAgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEKTsKLSAgICAgICAgcmV0dXJuIGlkOworICAgICAgICBtUmVjb3JkVGhyZWFkcy5hZGQoKmlucHV0LCB0aHJlYWQpOworICAgICAgICBBTE9HVigib3BlbklucHV0X2woKSBjcmVhdGVkIHJlY29yZCB0aHJlYWQ6IElEICVkIHRocmVhZCAlcCIsICppbnB1dCwgdGhyZWFkLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKICAgICB9CiAKKyAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTgzNCwyNiArMjA1MSw3MiBAQAogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoImNsb3NlSW5wdXQoKSAlZCIsIGlucHV0KTsKLSAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkX2woQXVkaW9TeXN0ZW06OklOUFVUX0NMT1NFRCwgaW5wdXQsIE5VTEwpOworCisgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgZWZmZWN0IGNoYWlucywgaXQgbWVhbnMgdGhhdCBhIGNsaWVudCBzdGlsbCBob2xkcyBhIGhhbmRsZQorICAgICAgICAvLyBvbiBhdCBsZWFzdCBvbmUgZWZmZWN0LiBXZSBtdXN0IGVpdGhlciBtb3ZlIHRoZSBjaGFpbiB0byBhbiBleGlzdGluZyB0aHJlYWQgd2l0aCB0aGUKKyAgICAgICAgLy8gc2FtZSBzZXNzaW9uIElEIG9yIHB1dCBpdCBhc2lkZSBpbiBjYXNlIGEgbmV3IHJlY29yZCB0aHJlYWQgaXMgb3BlbmVkIGZvciBhCisgICAgICAgIC8vIG5ldyBjYXB0dXJlIG9uIHRoZSBzYW1lIHNlc3Npb24KKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX3NsKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnMgPSB0aHJlYWQtPmdldEVmZmVjdENoYWluc19sKCk7CisgICAgICAgICAgICAvLyBOb3RlOiBtYXhpbXVtIG9uZSBjaGFpbiBwZXIgcmVjb3JkIHRocmVhZAorICAgICAgICAgICAgaWYgKGVmZmVjdENoYWlucy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGNoYWluID0gZWZmZWN0Q2hhaW5zWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiBhIHJlY29yZCB0aHJlYWQgaXMgYWxyZWFkeSBvcGVuZWQgd2l0aCBhIGNsaWVudCBvbiB0aGUgc2FtZSBzZXNzaW9uLgorICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaW4gY2FzZSBvZiBvdmVybGFwIGJldHdlZW4gb25lIHRocmVhZCB0ZWFyIGRvd24gYW5kIHRoZQorICAgICAgICAgICAgLy8gY3JlYXRpb24gb2YgaXRzIHJlcGxhY2VtZW50CisgICAgICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHNwPFJlY29yZFRocmVhZD4gdCA9IG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHQgPT0gdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodC0+aGFzQXVkaW9TZXNzaW9uKGNoYWluLT5zZXNzaW9uSWQoKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodC0+bUxvY2spOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2xvc2VJbnB1dCgpIGZvdW5kIHRocmVhZCAlZCBmb3IgZWZmZWN0IHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5pZCgpLCBjaGFpbi0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICB0LT5hZGRFZmZlY3RDaGFpbl9sKGNoYWluKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcHV0IHRoZSBjaGFpbiBhc2lkZSBpZiB3ZSBjb3VsZCBub3QgZmluZCBhIHJlY29yZCB0aHJlYWQgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIGlkLgorICAgICAgICAgICAgaWYgKGkgPT0gbVJlY29yZFRocmVhZHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcHV0T3JwaGFuRWZmZWN0Q2hhaW5fbChjaGFpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpJTlBVVF9DTE9TRUQsIGlucHV0LCBOVUxMKTsKICAgICAgICAgbVJlY29yZFRocmVhZHMucmVtb3ZlSXRlbShpbnB1dCk7CiAgICAgfQotICAgIHRocmVhZC0+ZXhpdCgpOwotICAgIC8vIFRoZSB0aHJlYWQgZW50aXR5IChhY3RpdmUgdW5pdCBvZiBleGVjdXRpb24pIGlzIG5vIGxvbmdlciBydW5uaW5nIGhlcmUsCi0gICAgLy8gYnV0IHRoZSBUaHJlYWRCYXNlIGNvbnRhaW5lciBzdGlsbCBleGlzdHMuCisgICAgLy8gRklYTUU6IGNhbGxpbmcgdGhyZWFkLT5leGl0KCkgd2l0aG91dCBtTG9jayBoZWxkIHNob3VsZCBub3QgYmUgbmVlZGVkIGFueW1vcmUgbm93IHRoYXQKKyAgICAvLyB3ZSBoYXZlIGEgZGlmZmVyZW50IGxvY2sgZm9yIG5vdGlmaWNhdGlvbiBjbGllbnQKKyAgICBjbG9zZUlucHV0RmluaXNoKHRocmVhZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VJbnB1dEZpbmlzaChzcDxSZWNvcmRUaHJlYWQ+IHRocmVhZCkKK3sKKyAgICB0aHJlYWQtPmV4aXQoKTsKICAgICBBdWRpb1N0cmVhbUluICppbiA9IHRocmVhZC0+Y2xlYXJJbnB1dCgpOwogICAgIEFMT0dfQVNTRVJUKGluICE9IE5VTEwsICJpbiBzaG91bGRuJ3QgYmUgTlVMTCIpOwogICAgIC8vIGZyb20gbm93IG9uIHRocmVhZC0+bUlucHV0IGlzIE5VTEwKICAgICBpbi0+aHdEZXYoKS0+Y2xvc2VfaW5wdXRfc3RyZWFtKGluLT5od0RldigpLCBpbi0+c3RyZWFtKTsKICAgICBkZWxldGUgaW47Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0U3RyZWFtT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VJbnB1dEludGVybmFsX2woc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQpCit7CisgICAgbVJlY29yZFRocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CisgICAgY2xvc2VJbnB1dEZpbmlzaCh0aHJlYWQpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBBTE9HVigic2V0U3RyZWFtT3V0cHV0KCkgc3RyZWFtICVkIHRvIG91dHB1dCAlZCIsIHN0cmVhbSwgb3V0cHV0KTsKKyAgICBBTE9HVigiaW52YWxpZGF0ZVN0cmVhbSgpIHN0cmVhbSAlZCIsIHN0cmVhbSk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS5nZXQoKTsKQEAgLTE4NjQsMjQgKzIxMjcsMzAgQEAKIH0KIAogCi1pbnQgQXVkaW9GbGluZ2VyOjpuZXdBdWRpb1Nlc3Npb25JZCgpCithdWRpb191bmlxdWVfaWRfdCBBdWRpb0ZsaW5nZXI6Om5ld0F1ZGlvVW5pcXVlSWQoKQogewogICAgIHJldHVybiBuZXh0VW5pcXVlSWQoKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKQordm9pZCBBdWRpb0ZsaW5nZXI6OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgQUxPR1YoImFjcXVpcmluZyAlZCBmcm9tICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIpOworICAgIEFMT0dWKCJhY3F1aXJpbmcgJWQgZnJvbSAlZCwgZm9yICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIsIHBpZCk7CisgICAgaWYgKHBpZCAhPSAtMSAmJiAoY2FsbGVyID09IGdldHBpZF9jYWNoZWQpKSB7CisgICAgICAgIGNhbGxlciA9IHBpZDsKKyAgICB9CiAKLSAgICAvLyBJZ25vcmUgcmVxdWVzdHMgcmVjZWl2ZWQgZnJvbSBwcm9jZXNzZXMgbm90IGtub3duIGFzIG5vdGlmaWNhdGlvbiBjbGllbnQuIFRoZSByZXF1ZXN0Ci0gICAgLy8gaXMgbGlrZWx5IHByb3hpZWQgYnkgbWVkaWFzZXJ2ZXIgKGUuZyBDYW1lcmFTZXJ2aWNlKSBhbmQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKCkgY2FuIGJlCi0gICAgLy8gY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgcGlkIGxlYXZpbmcgYSBzdGFsZSBzZXNzaW9uIHJlZmVyZW5jZS4gIEFsc28gd2UgZG9uJ3Qga25vdyBob3cKLSAgICAvLyB0byBjbGVhciB0aGlzIHJlZmVyZW5jZSBpZiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KLSAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleShjYWxsZXIpIDwgMCkgewotICAgICAgICBBTE9HVigiYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKCkgdW5rbm93biBjbGllbnQgJWQgZm9yIHNlc3Npb24gJWQiLCBjYWxsZXIsIGF1ZGlvU2Vzc2lvbik7Ci0gICAgICAgIHJldHVybjsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOworICAgICAgICAvLyBJZ25vcmUgcmVxdWVzdHMgcmVjZWl2ZWQgZnJvbSBwcm9jZXNzZXMgbm90IGtub3duIGFzIG5vdGlmaWNhdGlvbiBjbGllbnQuIFRoZSByZXF1ZXN0CisgICAgICAgIC8vIGlzIGxpa2VseSBwcm94aWVkIGJ5IG1lZGlhc2VydmVyIChlLmcgQ2FtZXJhU2VydmljZSkgYW5kIHJlbGVhc2VBdWRpb1Nlc3Npb25JZCgpIGNhbiBiZQorICAgICAgICAvLyBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCBwaWQgbGVhdmluZyBhIHN0YWxlIHNlc3Npb24gcmVmZXJlbmNlLiAgQWxzbyB3ZSBkb24ndCBrbm93IGhvdworICAgICAgICAvLyB0byBjbGVhciB0aGlzIHJlZmVyZW5jZSBpZiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KKyAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkoY2FsbGVyKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJhY3F1aXJlQXVkaW9TZXNzaW9uSWQoKSB1bmtub3duIGNsaWVudCAlZCBmb3Igc2Vzc2lvbiAlZCIsIGNhbGxlciwgYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHNpemVfdCBudW0gPSBtQXVkaW9TZXNzaW9uUmVmcy5zaXplKCk7CkBAIC0xODk3LDExICsyMTY2LDE0IEBACiAgICAgQUxPR1YoIiBhZGRlZCBuZXcgZW50cnkgZm9yICVkIiwgYXVkaW9TZXNzaW9uKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKQordm9pZCBBdWRpb0ZsaW5nZXI6OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgQUxPR1YoInJlbGVhc2luZyAlZCBmcm9tICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIpOworICAgIEFMT0dWKCJyZWxlYXNpbmcgJWQgZnJvbSAlZCBmb3IgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlciwgcGlkKTsKKyAgICBpZiAocGlkICE9IC0xICYmIChjYWxsZXIgPT0gZ2V0cGlkX2NhY2hlZCkpIHsKKyAgICAgICAgY2FsbGVyID0gcGlkOworICAgIH0KICAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpPCBudW07IGkrKykgewogICAgICAgICBBdWRpb1Nlc3Npb25SZWYgKnJlZiA9IG1BdWRpb1Nlc3Npb25SZWZzLml0ZW1BdChpKTsKQEAgLTE5NjMsNyArMjIzNSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sICh0LT5tTG9jayk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodC0+bUxvY2spOwogICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCBlZmZlY3RzIGZyb20gdGhlIGNoYWluCiAgICAgICAgICAgICB3aGlsZSAoZWMtPm1FZmZlY3RzLnNpemUoKSkgewogICAgICAgICAgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gZWMtPm1FZmZlY3RzWzBdOwpAQCAtMjAwMCw3ICsyMjcyLDcgQEAKIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpuZXh0VW5pcXVlSWQoKQogewotICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOworICAgIHJldHVybiAodWludDMyX3QpIGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCk7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKkF1ZGlvRmxpbmdlcjo6cHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKSBjb25zdApAQCAtMjAzMyw3ICsyMzA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaXN0ZW5lclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jX2V2ZW50X2NhbGxiYWNrX3QgY2FsbEJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cDxSZWZCYXNlPiBjb29raWUpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIApAQCAtMjE5NSw3ICsyNDY3LDcgQEAKIAogICAgICAgICAvLyByZXR1cm4gZWZmZWN0IGRlc2NyaXB0b3IKICAgICAgICAgKnBEZXNjID0gZGVzYzsKLSAgICAgICAgaWYgKGlvID09IDAgJiYgc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUgJiYgc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewogICAgICAgICAgICAgLy8gaWYgdGhlIG91dHB1dCByZXR1cm5lZCBieSBnZXRPdXRwdXRGb3JFZmZlY3QoKSBpcyByZW1vdmVkIGJlZm9yZSB3ZSBsb2NrIHRoZQogICAgICAgICAgICAgLy8gbXV0ZXggYmVsb3csIHRoZSBjYWxsIHRvIGNoZWNrUGxheWJhY2tUaHJlYWRfbChpbykgYmVsb3cgd2lsbCBkZXRlY3QgaXQKICAgICAgICAgICAgIC8vIGFuZCB3ZSB3aWxsIGV4aXQgc2FmZWx5CkBAIC0yMjEwLDcgKzI0ODIsNyBAQAogICAgICAgICAvLyBJZiBvdXRwdXQgaXMgMCBoZXJlLCBzZXNzaW9uSWQgaXMgbmVpdGhlciBTRVNTSU9OX09VVFBVVF9TVEFHRSBub3IgU0VTU0lPTl9PVVRQVVRfTUlYCiAgICAgICAgIC8vIGJlY2F1c2Ugb2YgY29kZSBjaGVja2luZyBvdXRwdXQgd2hlbiBlbnRlcmluZyB0aGUgZnVuY3Rpb24uCiAgICAgICAgIC8vIE5vdGU6IGlvIGlzIG5ldmVyIDAgd2hlbiBjcmVhdGluZyBhbiBlZmZlY3Qgb24gYW4gaW5wdXQKLSAgICAgICAgaWYgKGlvID09IDApIHsKKyAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB7CiAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IG11c3QgYmUgc3BlY2lmaWVkIGJ5IEF1ZGlvUG9saWN5TWFuYWdlciB3aGVuIHVzaW5nIHNlc3Npb24KICAgICAgICAgICAgICAgICAvLyBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRQpAQCAtMjIzNSw3ICsyNTA3LDcgQEAKICAgICAgICAgICAgIC8vIElmIG5vIG91dHB1dCB0aHJlYWQgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBzZXNzaW9uIElELCBkZWZhdWx0IHRvCiAgICAgICAgICAgICAvLyBmaXJzdCBvdXRwdXQuIFRoZSBlZmZlY3QgY2hhaW4gd2lsbCBiZSBtb3ZlZCB0byB0aGUgY29ycmVjdCBvdXRwdXQKICAgICAgICAgICAgIC8vIHRocmVhZCB3aGVuIGEgdHJhY2sgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIGlzIGNyZWF0ZWQKLSAgICAgICAgICAgIGlmIChpbyA9PSAwICYmIG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUgJiYgbVBsYXliYWNrVGhyZWFkcy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW8gPSBtUGxheWJhY2tUaHJlYWRzLmtleUF0KDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUVmZmVjdCgpIGdvdCBpbyAlZCBmb3IgZWZmZWN0ICVzIiwgaW8sIGRlc2MubmFtZSk7CkBAIC0yMjQ4LDkgKzI1MjAsMTcgQEAKICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIG9uZSBlZmZlY3QgY2hhaW4gd2FzIGF3YWl0aW5nIGZvciBhbiBlZmZlY3QgdG8gYmUgY3JlYXRlZCBvbiB0aGlzCisgICAgICAgICAgICAvLyBzZXNzaW9uIGFuZCB1c2VkIGl0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLgorICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0T3JwaGFuRWZmZWN0Q2hhaW5fbCgoYXVkaW9fc2Vzc2lvbl90KXNlc3Npb25JZCk7CisgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgICAgICB0aHJlYWQtPmFkZEVmZmVjdENoYWluX2woY2hhaW4pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSByZWdpc3RlclBpZF9sKHBpZCk7CisgICAgICAgIHNwPENsaWVudD4gY2xpZW50ID0gcmVnaXN0ZXJQaWQocGlkKTsKIAogICAgICAgICAvLyBjcmVhdGUgZWZmZWN0IG9uIHNlbGVjdGVkIG91dHB1dCB0aHJlYWQKICAgICAgICAgaGFuZGxlID0gdGhyZWFkLT5jcmVhdGVFZmZlY3RfbChjbGllbnQsIGVmZmVjdENsaWVudCwgcHJpb3JpdHksIHNlc3Npb25JZCwKQEAgLTIyNTgsMTIgKzI1MzgsMTUgQEAKICAgICAgICAgaWYgKGhhbmRsZSAhPSAwICYmIGlkICE9IE5VTEwpIHsKICAgICAgICAgICAgICppZCA9IGhhbmRsZS0+aWQoKTsKICAgICAgICAgfQorICAgICAgICBpZiAoaGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCB3aXRoIG1DbGllbnRMb2NrIGhlbGQKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOworICAgICAgICAgICAgY2xpZW50LmNsZWFyKCk7CisgICAgICAgIH0KICAgICB9CiAKIEV4aXQ6Ci0gICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gaGFuZGxlOwogfQogCkBAIC0yMzA5LDYgKzI1OTIsMTcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIHRocmVhZCBoYXMgYSBjaGFubmVsIGNvdW50IG9mIEZDQ18yLCB3aGljaCBpcworICAgIC8vIGN1cnJlbnRseSByZXF1aXJlZCBmb3IgKG1vc3QpIGVmZmVjdHMuIFByZXZlbnQgbW92aW5nIHRoZSBlZmZlY3QgY2hhaW4gaGVyZSByYXRoZXIKKyAgICAvLyB0aGFuIGRpc2FibGluZyB0aGUgYWRkRWZmZWN0X2woKSBjYWxsIGluIGRzdFRocmVhZCBiZWxvdy4KKyAgICBpZiAoKGRzdFRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok1JWEVSIHx8IGRzdFRocmVhZC0+aXNEdXBsaWNhdGluZygpKSAmJgorICAgICAgICAgICAgZHN0VGhyZWFkLT5tQ2hhbm5lbENvdW50ICE9IEZDQ18yKSB7CisgICAgICAgIEFMT0dXKCJtb3ZlRWZmZWN0Q2hhaW5fbCgpIGVmZmVjdCBjaGFpbiBmYWlsZWQgYmVjYXVzZSIKKyAgICAgICAgICAgICAgICAiIGRlc3RpbmF0aW9uIHRocmVhZCAlcCBjaGFubmVsIGNvdW50KCV1KSAhPSAldSIsCisgICAgICAgICAgICAgICAgZHN0VGhyZWFkLCBkc3RUaHJlYWQtPm1DaGFubmVsQ291bnQsIEZDQ18yKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIC8vIHJlbW92ZSBjaGFpbiBmaXJzdC4gVGhpcyBpcyB1c2VmdWwgb25seSBpZiByZWNvbmZpZ3VyaW5nIGVmZmVjdCBjaGFpbiBvbiBzYW1lIG91dHB1dCB0aHJlYWQsCiAgICAgLy8gc28gdGhhdCBhIG5ldyBjaGFpbiBpcyBjcmVhdGVkIHdpdGggY29ycmVjdCBwYXJhbWV0ZXJzIHdoZW4gZmlyc3QgZWZmZWN0IGlzIGFkZGVkLiBUaGlzIGlzCiAgICAgLy8gb3RoZXJ3aXNlIHVubmVjZXNzYXJ5IGFzIHJlbW92ZUVmZmVjdF9sKCkgd2lsbCByZW1vdmUgdGhlIGNoYWluIHdoZW4gbGFzdCBlZmZlY3QgaXMKQEAgLTI0MDcsNiArMjcwMSw0OSBAQAogCiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6cHV0T3JwaGFuRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiYgY2hhaW4pCit7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWNoYWluLT5zZXNzaW9uSWQoKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU9ycGhhbkVmZmVjdENoYWlucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgIEFMT0dWKCJwdXRPcnBoYW5FZmZlY3RDaGFpbl9sIHNlc3Npb24gJWQgaW5kZXggJWQiLCBzZXNzaW9uLCBpbmRleCk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgQUxPR1coInB1dE9ycGhhbkVmZmVjdENoYWluX2wgY2hhaW4gZm9yIHNlc3Npb24gJWQgYWxyZWFkeSBwcmVzZW50Iiwgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICB9CisgICAgbU9ycGhhbkVmZmVjdENoYWlucy5hZGQoc2Vzc2lvbiwgY2hhaW4pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbj4gQXVkaW9GbGluZ2VyOjpnZXRPcnBoYW5FZmZlY3RDaGFpbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbjsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU9ycGhhbkVmZmVjdENoYWlucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgIEFMT0dWKCJnZXRPcnBoYW5FZmZlY3RDaGFpbl9sIHNlc3Npb24gJWQgaW5kZXggJWQiLCBzZXNzaW9uLCBpbmRleCk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgY2hhaW4gPSBtT3JwaGFuRWZmZWN0Q2hhaW5zLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBtT3JwaGFuRWZmZWN0Q2hhaW5zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gY2hhaW47Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyOjp1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMoY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+JiBlZmZlY3QpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZWZmZWN0LT5zZXNzaW9uSWQoKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU9ycGhhbkVmZmVjdENoYWlucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgIEFMT0dWKCJ1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMgc2Vzc2lvbiAlZCBpbmRleCAlZCIsIHNlc3Npb24sIGluZGV4KTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBtT3JwaGFuRWZmZWN0Q2hhaW5zLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAoY2hhaW4tPnJlbW92ZUVmZmVjdF9sKGVmZmVjdCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoInVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyByZW1vdmluZyBlZmZlY3QgY2hhaW4gYXQgaW5kZXggJWQiLCBpbmRleCk7CisgICAgICAgICAgICBtT3JwaGFuRWZmZWN0Q2hhaW5zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKwogc3RydWN0IEVudHJ5IHsKICNkZWZpbmUgTUFYX05BTUUgMzIgICAgIC8vICVZJW0lZCVIJU0lU18lZC53YXYKICAgICBjaGFyIG1OYW1lW01BWF9OQU1FXTsKQEAgLTI0NzAsNyArMjgwNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAidW5hYmxlIHRvIHJvdGF0ZSB0ZWVzIGluICVzOiAlc1xuIiwgdGVlUGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidW5hYmxlIHRvIHJvdGF0ZSB0ZWVzIGluICVzOiAlc1xuIiwgdGVlUGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjaGFyIHRlZVRpbWVbMTZdOwpAQCAtMjQ4MywyNCArMjgyMCwyNiBAQAogICAgICAgICAvLyBpZiAyIGR1bXBzeXMgYXJlIGRvbmUgd2l0aGluIDEgc2Vjb25kLCBhbmQgcm90YXRpb24gZGlkbid0IHdvcmssIHRoZW4gZGlzY2FyZCAybmQKICAgICAgICAgaW50IHRlZUZkID0gb3Blbih0ZWVQYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX05PRk9MTE9XLCBTX0lSVVNSIHwgU19JV1VTUik7CiAgICAgICAgIGlmICh0ZWVGZCA+PSAwKSB7CisgICAgICAgICAgICAvLyBGSVhNRSB1c2UgbGlic25kZmlsZQogICAgICAgICAgICAgY2hhciB3YXZIZWFkZXJbNDRdOwogICAgICAgICAgICAgbWVtY3B5KHdhdkhlYWRlciwKICAgICAgICAgICAgICAgICAiUklGRlwwXDBcMFwwV0FWRWZtdCBcMjBcMFwwXDBcMVwwXDJcMFwxMDRcMjU0XDBcMFwwXDBcMFwwXDRcMFwyMFwwZGF0YVwwXDBcMFwwIiwKICAgICAgICAgICAgICAgICBzaXplb2Yod2F2SGVhZGVyKSk7CiAgICAgICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gdGVlU291cmNlLT5mb3JtYXQoKTsKICAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGNoYW5uZWxDb3VudCA8PSBGQ0NfMik7CiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKKyAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCk7CiAgICAgICAgICAgICB3YXZIZWFkZXJbMjJdID0gY2hhbm5lbENvdW50OyAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbHMKICAgICAgICAgICAgIHdhdkhlYWRlclsyNF0gPSBzYW1wbGVSYXRlOyAgICAgICAgIC8vIHNhbXBsZSByYXRlCiAgICAgICAgICAgICB3YXZIZWFkZXJbMjVdID0gc2FtcGxlUmF0ZSA+PiA4OwotICAgICAgICAgICAgd2F2SGVhZGVyWzMyXSA9IGNoYW5uZWxDb3VudCAqIDI7ICAgLy8gYmxvY2sgYWxpZ25tZW50CisgICAgICAgICAgICB3YXZIZWFkZXJbMzJdID0gZnJhbWVTaXplOyAgICAgICAgICAvLyBibG9jayBhbGlnbm1lbnQKKyAgICAgICAgICAgIHdhdkhlYWRlclszM10gPSBmcmFtZVNpemUgPj4gODsKICAgICAgICAgICAgIHdyaXRlKHRlZUZkLCB3YXZIZWFkZXIsIHNpemVvZih3YXZIZWFkZXIpKTsKICAgICAgICAgICAgIHNpemVfdCB0b3RhbCA9IDA7CiAgICAgICAgICAgICBib29sIGZpcnN0UmVhZCA9IHRydWU7CisjZGVmaW5lIFRFRV9TSU5LX1JFQUQgMTAyNCAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXMgcGVyIEkvTyBvcGVyYXRpb24KKyAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciA9IG1hbGxvYyhURUVfU0lOS19SRUFEICogZnJhbWVTaXplKTsKICAgICAgICAgICAgIGZvciAoOzspIHsKLSNkZWZpbmUgVEVFX1NJTktfUkVBRCAxMDI0Ci0gICAgICAgICAgICAgICAgc2hvcnQgYnVmZmVyW1RFRV9TSU5LX1JFQUQgKiBGQ0NfMl07CiAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gVEVFX1NJTktfUkVBRDsKICAgICAgICAgICAgICAgICBzc2l6ZV90IGFjdHVhbCA9IHRlZVNvdXJjZS0+cmVhZChidWZmZXIsIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpOwpAQCAtMjUxMywyMiArMjg1MiwyNSBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYWN0dWFsIDw9IChzc2l6ZV90KWNvdW50KTsKLSAgICAgICAgICAgICAgICB3cml0ZSh0ZWVGZCwgYnVmZmVyLCBhY3R1YWwgKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICAgICAgICAgICAgICB3cml0ZSh0ZWVGZCwgYnVmZmVyLCBhY3R1YWwgKiBmcmFtZVNpemUpOwogICAgICAgICAgICAgICAgIHRvdGFsICs9IGFjdHVhbDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUoYnVmZmVyKTsKICAgICAgICAgICAgIGxzZWVrKHRlZUZkLCAob2ZmX3QpIDQsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSA0NCArIHRvdGFsICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KSAtIDg7CisgICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gNDQgKyB0b3RhbCAqIGZyYW1lU2l6ZSAtIDg7CisgICAgICAgICAgICAvLyBGSVhNRSBub3QgYmlnLWVuZGlhbiBzYWZlCiAgICAgICAgICAgICB3cml0ZSh0ZWVGZCwgJnRlbXAsIHNpemVvZih0ZW1wKSk7CiAgICAgICAgICAgICBsc2Vlayh0ZWVGZCwgKG9mZl90KSA0MCwgU0VFS19TRVQpOwotICAgICAgICAgICAgdGVtcCA9ICB0b3RhbCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCk7CisgICAgICAgICAgICB0ZW1wID0gIHRvdGFsICogZnJhbWVTaXplOworICAgICAgICAgICAgLy8gRklYTUUgbm90IGJpZy1lbmRpYW4gc2FmZQogICAgICAgICAgICAgd3JpdGUodGVlRmQsICZ0ZW1wLCBzaXplb2YodGVtcCkpOwogICAgICAgICAgICAgY2xvc2UodGVlRmQpOwogICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICBmZHByaW50ZihmZCwgInRlZSBjb3BpZWQgdG8gJXNcbiIsIHRlZVBhdGgpOworICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ0ZWUgY29waWVkIHRvICVzXG4iLCB0ZWVQYXRoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmRwcmludGYoZmQsICJ1bmFibGUgdG8gY3JlYXRlIHRlZSAlczogJXNcbiIsIHRlZVBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInVuYWJsZSB0byBjcmVhdGUgdGVlICVzOiAlc1xuIiwgdGVlUGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCA1M2UyMzhlLi4xMDAzMDE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fRkxJTkdFUl9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkxJTkdFUl9ICiAKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CkBAIC00OSw5ICs1MCwxMiBAQAogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlci5oPgorCisjaW5jbHVkZSAiRmFzdENhcHR1cmUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogI2luY2x1ZGUgIkF1ZGlvV2F0Y2hkb2cuaCIKKyNpbmNsdWRlICJBdWRpb01peGVyLmgiCiAKICNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvSVBvd2VyTWFuYWdlci5oPgogCkBAIC02MCw4ICs2NCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgYXVkaW9fdHJhY2tfY2Jsa190OwotY2xhc3MgZWZmZWN0X3BhcmFtX2NibGtfdDsKK3N0cnVjdCBhdWRpb190cmFja19jYmxrX3Q7CitzdHJ1Y3QgZWZmZWN0X3BhcmFtX2NibGtfdDsKIGNsYXNzIEF1ZGlvTWl4ZXI7CiBjbGFzcyBBdWRpb0J1ZmZlcjsKIGNsYXNzIEF1ZGlvUmVzYW1wbGVyOwpAQCAtODEsOSArODUsNiBAQAogCiBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFN0YW5kYnlUaW1lSW5Oc2VjcyA9IHNlY29uZHMoMyk7CiAKLSNkZWZpbmUgTUFYX0dBSU4gNDA5Ni4wZgotI2RlZmluZSBNQVhfR0FJTl9JTlQgMHgxMDAwCi0KICNkZWZpbmUgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKIAogY2xhc3MgQXVkaW9GbGluZ2VyIDoKQEAgLTEwMiwyOSArMTAzLDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4JiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8pOwogCiAgICAgdmlydHVhbCBzcDxJQXVkaW9SZWNvcmQ+IG9wZW5SZWNvcmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLyk7CiAKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzYW1wbGVSYXRlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7Ci0gICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGxhdGVuY3koYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdDsKQEAgLTE1NiwxNCArMTU4LDEzIEBACiAgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0OwogCi0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKIAogICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKTsKQEAgLTE3NCwyOCArMTc1LDMwIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKIAotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHNpemVfdCAqaGFsRnJhbWVzLCBzaXplX3QgKmRzcEZyYW1lcywKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwogCi0gICAgdmlydHVhbCAgICAgdW5zaWduZWQgaW50ICBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0OworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdDsKIAotICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCk7CisgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pOworICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKIAotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbik7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpIGNvbnN0OwogCkBAIC0yMTAsNyArMjEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkKTsKIApAQCAtMjI0LDYgKzIyNywzMCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSk7CiAKKyAgICAvKiBMaXN0IGF2YWlsYWJsZSBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpOworCisgICAgLyogR2V0IGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8qIENyZWF0ZSBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKKworICAgIC8qIFJlbGVhc2UgYW4gYXVkaW8gcGF0Y2ggKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAvKiBMaXN0IGV4aXN0aW5nIGF1ZGlvIHBhdGNoZXMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKTsKKworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAvKiBHZXQgdGhlIEhXIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgdXNlZCBmb3IgYW4gYXVkaW8gc2Vzc2lvbiAqLworICAgIHZpcnR1YWwgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKKwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKQEAgLTIzNSw4ICsyNjIsMTIgQEAKICAgICBzcDxOQkxvZzo6V3JpdGVyPiAgIG5ld1dyaXRlcl9sKHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJXcml0ZXIoY29uc3Qgc3A8TkJMb2c6OldyaXRlcj4mIHdyaXRlcik7CiBwcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0xvZ01lbW9yeVNpemUgPSAxMCAqIDEwMjQ7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTG9nTWVtb3J5U2l6ZSA9IDQwICogMTAyNDsKICAgICBzcDxNZW1vcnlEZWFsZXI+ICAgIG1Mb2dNZW1vcnlEZWFsZXI7ICAgLy8gPT0gMCB3aGVuIE5CTG9nIGlzIGRpc2FibGVkCisgICAgLy8gV2hlbiBhIGxvZyB3cml0ZXIgaXMgdW5yZWdpc3RlcmVkLCBpdCBpcyBkb25lIGxhemlseSBzbyB0aGF0IG1lZGlhLmxvZyBjYW4gY29udGludWUgdG8gc2VlIGl0CisgICAgLy8gZm9yIGFzIGxvbmcgYXMgcG9zc2libGUuICBUaGUgbWVtb3J5IGlzIG9ubHkgZnJlZWQgd2hlbiBpdCBpcyBuZWVkZWQgZm9yIGFub3RoZXIgbG9nIHdyaXRlci4KKyAgICBWZWN0b3I8IHNwPE5CTG9nOjpXcml0ZXI+ID4gbVVucmVnaXN0ZXJlZFdyaXRlcnM7CisgICAgTXV0ZXggICAgICAgICAgICAgICBtVW5yZWdpc3RlcmVkV3JpdGVyc0xvY2s7CiBwdWJsaWM6CiAKICAgICBjbGFzcyBTeW5jRXZlbnQ7CkBAIC0yNDksNyArMjgwLDcgQEAKICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgIGludCBsaXN0ZW5lclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICBzeW5jX2V2ZW50X2NhbGxiYWNrX3QgY2FsbEJhY2ssCi0gICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpCisgICAgICAgICAgICAgICAgICB3cDxSZWZCYXNlPiBjb29raWUpCiAgICAgICAgIDogbVR5cGUodHlwZSksIG1UcmlnZ2VyU2Vzc2lvbih0cmlnZ2VyU2Vzc2lvbiksIG1MaXN0ZW5lclNlc3Npb24obGlzdGVuZXJTZXNzaW9uKSwKICAgICAgICAgICBtQ2FsbGJhY2soY2FsbEJhY2spLCBtQ29va2llKGNvb2tpZSkKICAgICAgICAge30KQEAgLTI2MiwxNCArMjkzLDE0IEBACiAgICAgICAgIEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CiAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1UcmlnZ2VyU2Vzc2lvbjsgfQogICAgICAgICBpbnQgbGlzdGVuZXJTZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbUxpc3RlbmVyU2Vzc2lvbjsgfQotICAgICAgICB2b2lkICpjb29raWUoKSBjb25zdCB7IHJldHVybiBtQ29va2llOyB9CisgICAgICAgIHdwPFJlZkJhc2U+IGNvb2tpZSgpIGNvbnN0IHsgcmV0dXJuIG1Db29raWU7IH0KIAogICAgIHByaXZhdGU6CiAgICAgICAgICAgY29uc3QgQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBtVHlwZTsKICAgICAgICAgICBjb25zdCBpbnQgbVRyaWdnZXJTZXNzaW9uOwogICAgICAgICAgIGNvbnN0IGludCBtTGlzdGVuZXJTZXNzaW9uOwogICAgICAgICAgIHN5bmNfZXZlbnRfY2FsbGJhY2tfdCBtQ2FsbGJhY2s7Ci0gICAgICAgICAgdm9pZCAqIGNvbnN0IG1Db29raWU7CisgICAgICAgICAgY29uc3Qgd3A8UmVmQmFzZT4gbUNvb2tpZTsKICAgICAgICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogICAgIH07CiAKQEAgLTI3Nyw3ICszMDgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdGVuZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNfZXZlbnRfY2FsbGJhY2tfdCBjYWxsQmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwPFJlZkJhc2U+IGNvb2tpZSk7CiAKIHByaXZhdGU6CiAgICAgY2xhc3MgQXVkaW9Id0RldmljZTsgICAgLy8gZndkIGRlY2xhcmF0aW9uIGZvciBmaW5kU3VpdGFibGVId0Rldl9sCkBAIC0zMDAsNiArMzMxLDQ5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgcHVyZ2VTdGFsZUVmZmVjdHNfbCgpOwogCisgICAgLy8gU2V0IGtFbmFibGVFeHRlbmRlZENoYW5uZWxzIHRvIHRydWUgdG8gZW5hYmxlIGdyZWF0ZXIgdGhhbiBzdGVyZW8gb3V0cHV0CisgICAgLy8gZm9yIHRoZSBNaXhlclRocmVhZCBhbmQgZGV2aWNlIHNpbmsuICBOdW1iZXIgb2YgY2hhbm5lbHMgYWxsb3dlZCBpcworICAgIC8vIEZDQ18yIDw9IGNoYW5uZWxzIDw9IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMuCisgICAgc3RhdGljIGNvbnN0IGJvb2wga0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMgPSB0cnVlOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGNoYW5uZWwgbWFzayBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBQQ00gc2luayBpbiB0aGUgTWl4ZXJUaHJlYWQKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZFBjbVNpbmtDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgeworICAgICAgICBzd2l0Y2ggKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oY2hhbm5lbE1hc2spKSB7CisgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTjogeworICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gRkNDXzI7IC8vIHN0ZXJlbyBpcyBkZWZhdWx0CisgICAgICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIGlmIChjaGFubmVsQ291bnQgPCBGQ0NfMiAvLyBtb25vIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsQ291bnQgPiBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGNoYW5uZWxNYXNrIGlzIHRoZSAiY2Fub25pY2FsIiBvbmUgd2UgZXhwZWN0IGZvciB0aGUgY2hhbm5lbENvdW50LgorICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxNYXNrID09IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IGtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiB0byB0cnVlIHRvIHVzZSBleHRlbmRlZCBwcmVjaXNpb24gaW4gTWl4ZXJUaHJlYWQKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBrRW5hYmxlRXh0ZW5kZWRQcmVjaXNpb24gPSB0cnVlOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGZvcm1hdCBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBQQ00gc2luayBpbiB0aGUgTWl4ZXJUaHJlYWQKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZFBjbVNpbmtGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUOgorICAgICAgICAgICAgcmV0dXJuIGtFbmFibGVFeHRlbmRlZFByZWNpc2lvbjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIHN0YW5kYnkgZGVsYXkgZm9yIE1JWEVSIGFuZCBEVVBMSUNBVElORyBwbGF5YmFjayB0aHJlYWRzIGlzIHJlYWQgZnJvbSBwcm9wZXJ0eQogICAgIC8vIHJvLmF1ZGlvLmZsaW5nZXJfc3RhbmRieXRpbWVfbXMgb3IgZGVmYXVsdHMgdG8ga0RlZmF1bHRTdGFuZGJ5VGltZUluTnNlY3MKICAgICBzdGF0aWMgbnNlY3NfdCAgICAgICAgICBtU3RhbmRieVRpbWVJbk5zZWNzOwpAQCAtMzk0LDYgKzQ2OCw4IEBACiAKICNpbmNsdWRlICJFZmZlY3RzLmgiCiAKKyNpbmNsdWRlICJQYXRjaFBhbmVsLmgiCisKICAgICAvLyBzZXJ2ZXIgc2lkZSBvZiB0aGUgY2xpZW50J3MgSUF1ZGlvVHJhY2sKICAgICBjbGFzcyBUcmFja0hhbmRsZSA6IHB1YmxpYyBhbmRyb2lkOjpCbkF1ZGlvVHJhY2sgewogICAgIHB1YmxpYzoKQEAgLTQyNyw3ICs1MDMsNiBAQAogICAgIHB1YmxpYzoKICAgICAgICAgUmVjb3JkSGFuZGxlKGNvbnN0IHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+JiByZWNvcmRUcmFjayk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgflJlY29yZEhhbmRsZSgpOwotICAgICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQsIGludCB0cmlnZ2VyU2Vzc2lvbik7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoCkBAIC00NDMsMTUgKzUxOCwzOSBAQAogICAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqY2hlY2tQbGF5YmFja1RocmVhZF9sKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7CiAgICAgICAgICAgICAgIE1peGVyVGhyZWFkICpjaGVja01peGVyVGhyZWFkX2woYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdDsKICAgICAgICAgICAgICAgUmVjb3JkVGhyZWFkICpjaGVja1JlY29yZFRocmVhZF9sKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSBjb25zdDsKKyAgICAgICAgICAgICAgc3A8UmVjb3JkVGhyZWFkPiBvcGVuSW5wdXRfbChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiBvcGVuT3V0cHV0X2woYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisKKyAgICAgICAgICAgICAgdm9pZCBjbG9zZU91dHB1dEZpbmlzaChzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkKTsKKyAgICAgICAgICAgICAgdm9pZCBjbG9zZUlucHV0RmluaXNoKHNwPFJlY29yZFRocmVhZD4gdGhyZWFkKTsKKwogICAgICAgICAgICAgICAvLyBubyByYW5nZSBjaGVjaywgQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtTXV0ZV9sKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBtU3RyZWFtVHlwZXNbc3RyZWFtXS5tdXRlOyB9CiAgICAgICAgICAgICAgIC8vIG5vIHJhbmdlIGNoZWNrLCBkb2Vzbid0IGNoZWNrIHBlci10aHJlYWQgc3RyZWFtIHZvbHVtZSwgQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiAgICAgICAgICAgICAgIGZsb2F0IHN0cmVhbVZvbHVtZV9sKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBtU3RyZWFtVHlwZXNbc3RyZWFtXS52b2x1bWU7IH0KLSAgICAgICAgICAgICAgdm9pZCBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpOworICAgICAgICAgICAgICB2b2lkIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpOwogCi0gICAgICAgICAgICAgIC8vIGFsbG9jYXRlIGFuIGF1ZGlvX2lvX2hhbmRsZV90LCBzZXNzaW9uIElELCBvciBlZmZlY3QgSUQKKyAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgYW4gYXVkaW9faW9faGFuZGxlX3QsIHNlc3Npb24gSUQsIGVmZmVjdCBJRCwgb3IgYXVkaW9fbW9kdWxlX2hhbmRsZV90LgorICAgICAgICAgICAgICAvLyBUaGV5IGFsbCBzaGFyZSB0aGUgc2FtZSBJRCBzcGFjZSwgYnV0IHRoZSBuYW1lc3BhY2VzIGFyZSBhY3R1YWxseSBpbmRlcGVuZGVudAorICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXJlIGFyZSBzZXBhcmF0ZSBLZXllZFZlY3RvcnMgZm9yIGVhY2gga2luZCBvZiBJRC4KKyAgICAgICAgICAgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyB1aW50MzJfdCwgYnV0IGlzIGNhc3QgdG8gc2lnbmVkIGZvciBzb21lIElEcy4KKyAgICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBBUEkgZG9lcyBub3QgaGFuZGxlIHJvbGxvdmVyIHRvIHplcm8gKGZvciB1bnNpZ25lZCBJRHMpLAorICAgICAgICAgICAgICAvLyAgICAgICBvciBmcm9tIHBvc2l0aXZlIHRvIG5lZ2F0aXZlIChmb3Igc2lnbmVkIElEcykuCisgICAgICAgICAgICAgIC8vICAgICAgIFRodXMgaXQgbWF5IGZhaWwgYnkgcmV0dXJuaW5nIGFuIElEIG9mIHRoZSB3cm9uZyBzaWduLAorICAgICAgICAgICAgICAvLyAgICAgICBvciBieSByZXR1cm5pbmcgYSBub24tdW5pcXVlIElELgogICAgICAgICAgICAgICB1aW50MzJfdCBuZXh0VW5pcXVlSWQoKTsKIAogICAgICAgICAgICAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0Q2hhaW5fbChpbnQgc2Vzc2lvbklkLApAQCAtNDY3LDEwICs1NjYsMjYgQEAKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbW92ZUNsaWVudF9sKHBpZF90IHBpZCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHBpZF90IHBpZCk7Ci0KICAgICAgICAgICAgICAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVHbG9iYWxFZmZlY3RFbmFibGVkX2woKTsKICAgICAgICAgICAgICAgICB2b2lkIG9uTm9uT2ZmbG9hZGFibGVHbG9iYWxFZmZlY3RFbmFibGUoKTsKIAorICAgICAgICAgICAgICAgIC8vIFN0b3JlIGFuIGVmZmVjdCBjaGFpbiB0byBtT3JwaGFuRWZmZWN0Q2hhaW5zIGtleWVkIHZlY3Rvci4KKyAgICAgICAgICAgICAgICAvLyBDYWxsZWQgd2hlbiBhIHRocmVhZCBleGl0cyBhbmQgZWZmZWN0cyBhcmUgc3RpbGwgYXR0YWNoZWQgdG8gaXQuCisgICAgICAgICAgICAgICAgLy8gSWYgZWZmZWN0cyBhcmUgbGF0ZXIgY3JlYXRlZCBvbiB0aGUgc2FtZSBzZXNzaW9uLCB0aGV5IHdpbGwgcmV1c2UgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgY2hhaW4gYW5kIHNhbWUgaW5zdGFuY2VzIGluIHRoZSBlZmZlY3QgbGlicmFyeS4KKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gQUxSRUFEWV9FWElTVFMgaWYgYSBjaGFpbiB3aXRoIHRoZSBzYW1lIHNlc3Npb24gYWxyZWFkeSBleGlzdHMgaW4KKyAgICAgICAgICAgICAgICAvLyBtT3JwaGFuRWZmZWN0Q2hhaW5zLiBOb3RlIHRoYXQgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFzIHRoZXJlIGlzIG9ubHkgb25lCisgICAgICAgICAgICAgICAgLy8gY2hhaW4gZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBhbmQgaXQgaXMgYXR0YWNoZWQgdG8gb25seSBvbmUgdGhyZWFkIGF0IGEgdGltZS4KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcHV0T3JwaGFuRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKKyAgICAgICAgICAgICAgICAvLyBHZXQgYW4gZWZmZWN0IGNoYWluIGZvciB0aGUgc3BlY2lmaWVkIHNlc3Npb24gaW4gbU9ycGhhbkVmZmVjdENoYWlucyBhbmQgcmVtb3ZlCisgICAgICAgICAgICAgICAgLy8gaXQgaWYgZm91bmQuIFJldHVybnMgMCBpZiBub3QgZm91bmQgKHRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIGNhc2UpLgorICAgICAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBnZXRPcnBoYW5FZmZlY3RDaGFpbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbGFzdCBlZmZlY3QgaGFuZGxlIG9uIGFuIGVmZmVjdCBpbnN0YW5jZSBpcyByZW1vdmVkLiBJZiB0aGlzCisgICAgICAgICAgICAgICAgLy8gZWZmZWN0IGJlbG9uZ3MgdG8gYW4gZWZmZWN0IGNoYWluIGluIG1PcnBoYW5FZmZlY3RDaGFpbnMsIHRoZSBjaGFpbiBpcyB1cGRhdGVkCisgICAgICAgICAgICAgICAgLy8gYW5kIHJlbW92ZWQgZnJvbSBtT3JwaGFuRWZmZWN0Q2hhaW5zIGlmIGl0IGRvZXMgbm90IGNvbnRhaW4gYW55IGVmZmVjdC4KKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZWZmZWN0IHdhcyBmb3VuZCBpbiBtT3JwaGFuRWZmZWN0Q2hhaW5zLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIHVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyhjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpOworCiAgICAgY2xhc3MgQXVkaW9Id0RldmljZSB7CiAgICAgcHVibGljOgogICAgICAgICBlbnVtIEZsYWdzIHsKQEAgLTQ3OCwxMCArNTkzLDExIEBACiAgICAgICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX01VVEUgICAgPSAweDIsCiAgICAgICAgIH07CiAKLSAgICAgICAgQXVkaW9Id0RldmljZShjb25zdCBjaGFyICptb2R1bGVOYW1lLAorICAgICAgICBBdWRpb0h3RGV2aWNlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MgZmxhZ3MpCi0gICAgICAgICAgICA6IG1Nb2R1bGVOYW1lKHN0cmR1cChtb2R1bGVOYW1lKSkKKyAgICAgICAgICAgIDogbUhhbmRsZShoYW5kbGUpLCBtTW9kdWxlTmFtZShzdHJkdXAobW9kdWxlTmFtZSkpCiAgICAgICAgICAgICAsIG1Id0RldmljZShod0RldmljZSkKICAgICAgICAgICAgICwgbUZsYWdzKGZsYWdzKSB7IH0KICAgICAgICAgLyp2aXJ0dWFsKi8gfkF1ZGlvSHdEZXZpY2UoKSB7IGZyZWUoKHZvaWQgKiltTW9kdWxlTmFtZSk7IH0KQEAgLTQ5NCwxMiArNjEwLDE2IEBACiAgICAgICAgICAgICByZXR1cm4gKDAgIT0gKG1GbGFncyAmIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSkpOwogICAgICAgICB9CiAKKyAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KICAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGVOYW1lOyB9CiAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZTsgfQorICAgICAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlLT5jb21tb24udmVyc2lvbjsgfQorCiAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1IYW5kbGU7CiAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCBtTW9kdWxlTmFtZTsKICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKiBjb25zdCBtSHdEZXZpY2U7Ci0gICAgICAgIEZsYWdzIG1GbGFnczsKKyAgICAgICAgY29uc3QgRmxhZ3MgbUZsYWdzOwogICAgIH07CiAKICAgICAvLyBBdWRpb1N0cmVhbU91dCBhbmQgQXVkaW9TdHJlYW1JbiBhcmUgaW1tdXRhYmxlLCBzbyB0aGVpciBmaWVsZHMgYXJlIGNvbnN0LgpAQCAtNTA5LDcgKzYyOSw3IEBACiAgICAgc3RydWN0IEF1ZGlvU3RyZWFtT3V0IHsKICAgICAgICAgQXVkaW9Id0RldmljZSogY29uc3QgYXVkaW9Id0RldjsKICAgICAgICAgYXVkaW9fc3RyZWFtX291dF90KiBjb25zdCBzdHJlYW07Ci0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOworICAgICAgICBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKIAogICAgICAgICBhdWRpb19od19kZXZpY2VfdCogaHdEZXYoKSBjb25zdCB7IHJldHVybiBhdWRpb0h3RGV2LT5od0RldmljZSgpOyB9CiAKQEAgLTUzNyw3ICs2NTcsMTEgQEAKICAgICB9OwogCiAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7Ci0KKyAgICAgICAgICAgICAgICAvLyBwcm90ZWN0cyBtQ2xpZW50cyBhbmQgbU5vdGlmaWNhdGlvbkNsaWVudHMuCisgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBsb2NrZWQgYWZ0ZXIgbUxvY2sgYW5kIFRocmVhZEJhc2U6Om1Mb2NrIGlmIGJvdGggbXVzdCBiZSBsb2NrZWQKKyAgICAgICAgICAgICAgICAvLyBhdm9pZHMgYWNxdWlyaW5nIEF1ZGlvRmxpbmdlcjo6bUxvY2sgZnJvbSBpbnNpZGUgdGhyZWFkIGxvb3AuCisgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudExvY2s7CisgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG1DbGllbnRMb2NrCiAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBwaWRfdCwgd3A8Q2xpZW50PiA+ICAgICBtQ2xpZW50czsgICAvLyBzZWUgfkNsaWVudCgpCiAKICAgICAgICAgICAgICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtSGFyZHdhcmVMb2NrOwpAQCAtNTg2LDggKzcxMCwxMyBAQAogCiAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8UmVjb3JkVGhyZWFkPiA+ICAgIG1SZWNvcmRUaHJlYWRzOwogCisgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG1DbGllbnRMb2NrCiAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBwaWRfdCwgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiA+ICAgIG1Ob3RpZmljYXRpb25DbGllbnRzOworCiAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbU5leHRVbmlxdWVJZDsgIC8vIHVwZGF0ZWQgYnkgYW5kcm9pZF9hdG9taWNfaW5jCisgICAgICAgICAgICAgICAgLy8gbmV4dFVuaXF1ZUlkKCkgcmV0dXJucyB1aW50MzJfdCwgYnV0IHRoaXMgaXMgZGVjbGFyZWQgaW50MzJfdAorICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGF0b21pYyBvcGVyYXRpb25zIHJlcXVpcmUgYW4gaW50MzJfdAorCiAgICAgICAgICAgICAgICAgYXVkaW9fbW9kZV90ICAgICAgICAgICAgICAgICAgICAgICAgbU1vZGU7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ0TnJlY0lzT2ZmOwogCkBAIC02MDEsMTIgKzczMCwxNyBAQAogICAgICAgICAgICAgICAgIFZlY3RvciA8IHNwPFN5bmNFdmVudD4gPiBtUGVuZGluZ1N5bmNFdmVudHM7IC8vIHN5bmMgZXZlbnRzIGF3YWl0aW5nIGZvciBhIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSBjcmVhdGVkCiAKKyAgICAgICAgICAgICAgICAvLyBFZmZlY3QgY2hhaW5zIHdpdGhvdXQgYSB2YWxpZCB0aHJlYWQKKyAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3Nlc3Npb25fdCAsIHNwPEVmZmVjdENoYWluPiA+IG1PcnBoYW5FZmZlY3RDaGFpbnM7CisKIHByaXZhdGU6Ci0gICAgc3A8Q2xpZW50PiAgcmVnaXN0ZXJQaWRfbChwaWRfdCBwaWQpOyAgICAvLyBhbHdheXMgcmV0dXJucyBub24tMAorICAgIHNwPENsaWVudD4gIHJlZ2lzdGVyUGlkKHBpZF90IHBpZCk7ICAgIC8vIGFsd2F5cyByZXR1cm5zIG5vbi0wCiAKICAgICAvLyBmb3IgdXNlIGZyb20gZGVzdHJ1Y3RvcgogICAgIHN0YXR1c190ICAgIGNsb3NlT3V0cHV0X25vbnZpcnR1YWwoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyAgICB2b2lkICAgICAgICBjbG9zZU91dHB1dEludGVybmFsX2woc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZCk7CiAgICAgc3RhdHVzX3QgICAgY2xvc2VJbnB1dF9ub252aXJ0dWFsKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKyAgICB2b2lkICAgICAgICBjbG9zZUlucHV0SW50ZXJuYWxfbChzcDxSZWNvcmRUaHJlYWQ+IHRocmVhZCk7CiAKICNpZmRlZiBURUVfU0lOSwogICAgIC8vIGFsbCByZWNvcmQgdGhyZWFkcyBzZXJpYWxseSBzaGFyZSBhIGNvbW1vbiB0ZWUgc2luaywgd2hpY2ggaXMgcmUtY3JlYXRlZCBvbiBmb3JtYXQgY2hhbmdlCkBAIC02MzQsNyArNzY4LDcgQEAKICAgICAvLyAweDIwMDAwMCBzdGVyZW8gMTYtYml0IFBDTSBmcmFtZXMgPSA0Ny41IHNlY29uZHMgYXQgNDQuMSBrSHosIDggbWVnYWJ5dGVzCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua0lucHV0RnJhbWVzRGVmYXVsdCA9IDB4MjAwMDAwOwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtPdXRwdXRGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua1RyYWNrRnJhbWVzRGVmYXVsdCA9IDB4MTAwMDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rVHJhY2tGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7CiAjZW5kaWYKIAogICAgIC8vIFRoaXMgbWV0aG9kIHJlYWRzIGZyb20gYSB2YXJpYWJsZSB3aXRob3V0IG1Mb2NrLCBidXQgdGhlIHZhcmlhYmxlIGlzIHVwZGF0ZWQgdW5kZXIgbUxvY2suICBTbwpAQCAtNjQ3LDEwICs3ODEsMTcgQEAKICAgICBib29sICAgIG1Jc0xvd1JhbURldmljZTsKICAgICBib29sICAgIG1Jc0RldmljZVR5cGVLbm93bjsKICAgICBuc2Vjc190IG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lOyAgLy8gd2hlbiBhIGdsb2JhbCBlZmZlY3Qgd2FzIGxhc3QgZW5hYmxlZAorCisgICAgc3A8UGF0Y2hQYW5lbD4gbVBhdGNoUGFuZWw7CisKKyAgICB1aW50MzJfdCAgICBtUHJpbWFyeU91dHB1dFNhbXBsZVJhdGU7ICAgLy8gc2FtcGxlIHJhdGUgb2YgdGhlIHByaW1hcnkgb3V0cHV0LCBvciB6ZXJvIGlmIG5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG1IYXJkd2FyZUxvY2sKIH07CiAKICN1bmRlZiBJTkNMVURJTkdfRlJPTV9BVURJT0ZMSU5HRVJfSAogCitjb25zdCBjaGFyICpmb3JtYXRUb1N0cmluZyhhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKaW5kZXggMDdkYzZkZC4uZmQyOGVhMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtMzQsNjUgKzM1LDM0NSBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgogI2luY2x1ZGUgPGNvbW1vbl90aW1lL2xvY2FsX2Nsb2NrLmg+CiAjaW5jbHVkZSA8Y29tbW9uX3RpbWUvY2NfaGVscGVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2Rvd25taXguaD4KIAorI2luY2x1ZGUgIkF1ZGlvTWl4ZXJPcHMuaCIKICNpbmNsdWRlICJBdWRpb01peGVyLmgiCiAKKy8vIFRoZSBGQ0NfMiBtYWNybyByZWZlcnMgdG8gdGhlIEZpeGVkIENoYW5uZWwgQ291bnQgb2YgMiBmb3IgdGhlIGxlZ2FjeSBpbnRlZ2VyIG1peGVyLgorI2lmbmRlZiBGQ0NfMgorI2RlZmluZSBGQ0NfMiAyCisjZW5kaWYKKworLy8gTG9vayBmb3IgTU9OT19IQUNLIGZvciBhbnkgTW9ubyBoYWNrIGludm9sdmluZyBsZWdhY3kgbW9ubyBjaGFubmVsIHRvCisvLyBzdGVyZW8gY2hhbm5lbCBjb252ZXJzaW9uLgorCisvKiBWRVJZX1ZFUllfVkVSQk9TRV9MT0dHSU5HIHdpbGwgc2hvdyBleGFjdGx5IHdoaWNoIHByb2Nlc3MgaG9vayBhbmQgdHJhY2sgaG9vayBpcworICogYmVpbmcgdXNlZC4gVGhpcyBpcyBhIGNvbnNpZGVyYWJsZSBhbW91bnQgb2YgbG9nIHNwYW0sIHNvIGRvbid0IGVuYWJsZSB1bmxlc3MgeW91CisgKiBhcmUgdmVyaWZ5aW5nIHRoZSBob29rIGJhc2VkIGNvZGUuCisgKi8KKy8vI2RlZmluZSBWRVJZX1ZFUllfVkVSQk9TRV9MT0dHSU5HCisjaWZkZWYgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKy8vZGVmaW5lIEFMT0dWViBwcmludGYgIC8vIGZvciB0ZXN0LW1peGVyLmNwcAorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZuZGVmIEFSUkFZX1NJWkUKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpL3NpemVvZigoeClbMF0pKQorI2VuZGlmCisKKy8vIFNldCBrVXNlTmV3TWl4ZXIgdG8gdHJ1ZSB0byB1c2UgdGhlIG5ldyBtaXhlciBlbmdpbmUuIE90aGVyd2lzZSB0aGUKKy8vIG9yaWdpbmFsIGNvZGUgd2lsbCBiZSB1c2VkLiAgVGhpcyBpcyBmYWxzZSBmb3Igbm93Lgorc3RhdGljIGNvbnN0IGJvb2wga1VzZU5ld01peGVyID0gZmFsc2U7CisKKy8vIFNldCBrVXNlRmxvYXQgdG8gdHJ1ZSB0byBhbGxvdyBmbG9hdGluZyBpbnB1dCBpbnRvIHRoZSBtaXhlciBlbmdpbmUuCisvLyBJZiBrVXNlTmV3TWl4ZXIgaXMgZmFsc2UsIHRoaXMgaXMgaWdub3JlZCBvciBtYXkgYmUgb3ZlcnJpZGRlbiBpbnRlcm5hbGx5CisvLyBiZWNhdXNlIG9mIGRvd25taXgvdXBtaXggc3VwcG9ydC4KK3N0YXRpYyBjb25zdCBib29sIGtVc2VGbG9hdCA9IHRydWU7CisKKy8vIFNldCB0byBkZWZhdWx0IGNvcHkgYnVmZmVyIHNpemUgaW4gZnJhbWVzIGZvciBpbnB1dCBwcm9jZXNzaW5nLgorc3RhdGljIGNvbnN0IHNpemVfdCBrQ29weUJ1ZmZlckZyYW1lQ291bnQgPSAyNTY7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgOiBBdWRpb0J1ZmZlclByb3ZpZGVyKCksCi0gICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyKE5VTEwpLCBtRG93bm1peEhhbmRsZShOVUxMKQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgbWluKGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpCiB7CisgICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Cit9CisKK0F1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6Q29weUJ1ZmZlclByb3ZpZGVyKHNpemVfdCBpbnB1dEZyYW1lU2l6ZSwKKyAgICAgICAgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKKyAgICAgICAgbUlucHV0RnJhbWVTaXplKGlucHV0RnJhbWVTaXplKSwKKyAgICAgICAgbU91dHB1dEZyYW1lU2l6ZShvdXRwdXRGcmFtZVNpemUpLAorICAgICAgICBtTG9jYWxCdWZmZXJGcmFtZUNvdW50KGJ1ZmZlckZyYW1lQ291bnQpLAorICAgICAgICBtTG9jYWxCdWZmZXJEYXRhKE5VTEwpLAorICAgICAgICBtQ29uc3VtZWQoMCkKK3sKKyAgICBBTE9HVigiQ29weUJ1ZmZlclByb3ZpZGVyKCVwKSglenUsICV6dSwgJXp1KSIsIHRoaXMsCisgICAgICAgICAgICBpbnB1dEZyYW1lU2l6ZSwgb3V0cHV0RnJhbWVTaXplLCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGlucHV0RnJhbWVTaXplIDwgb3V0cHV0RnJhbWVTaXplICYmIGJ1ZmZlckZyYW1lQ291bnQgPT0gMCwKKyAgICAgICAgICAgICJSZXF1aXJlcyBsb2NhbCBidWZmZXIgaWYgaW5wdXRGcmFtZVNpemUoJXp1KSA8IG91dHB1dEZyYW1lU2l6ZSglenUpIiwKKyAgICAgICAgICAgIGlucHV0RnJhbWVTaXplLCBvdXRwdXRGcmFtZVNpemUpOworICAgIGlmIChtTG9jYWxCdWZmZXJGcmFtZUNvdW50KSB7CisgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtTG9jYWxCdWZmZXJEYXRhLCAzMiwgbUxvY2FsQnVmZmVyRnJhbWVDb3VudCAqIG1PdXRwdXRGcmFtZVNpemUpOworICAgIH0KKyAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOworfQorCitBdWRpb01peGVyOjpDb3B5QnVmZmVyUHJvdmlkZXI6On5Db3B5QnVmZmVyUHJvdmlkZXIoKQoreworICAgIEFMT0dWKCJ+Q29weUJ1ZmZlclByb3ZpZGVyKCVwKSIsIHRoaXMpOworICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgfQorICAgIGZyZWUobUxvY2FsQnVmZmVyRGF0YSk7Cit9CisKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIsCisgICAgICAgIGludDY0X3QgcHRzKQoreworICAgIC8vQUxPR1YoIkNvcHlCdWZmZXJQcm92aWRlciglcCk6OmdldE5leHRCdWZmZXIoJXAgKCV6dSksICVsbGQpIiwKKyAgICAvLyAgICAgICAgdGhpcywgcEJ1ZmZlciwgcEJ1ZmZlci0+ZnJhbWVDb3VudCwgcHRzKTsKKyAgICBpZiAobUxvY2FsQnVmZmVyRnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1UcmFja0J1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKHBCdWZmZXIsIHB0cyk7CisgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgIGNvcHlGcmFtZXMocEJ1ZmZlci0+cmF3LCBwQnVmZmVyLT5yYXcsIHBCdWZmZXItPmZyYW1lQ291bnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBwQnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2tCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwgcHRzKTsKKyAgICAgICAgLy8gQXQgb25lIHRpbWUgYW4gdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVyIGhhZAorICAgICAgICAvLyByZXMgPT0gT0sgYW5kIG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwLCBkb2Vzbid0IHNlZW0gdG8gaGFwcGVuIG5vdyA3LzE4LzIwMTQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEJ5IEFQSSBzcGVjLCBpZiByZXMgIT0gT0ssIHRoZW4gbUJ1ZmZlci5mcmFtZUNvdW50ID09IDAuCisgICAgICAgIC8vIGJ1dCB0aGVyZSBtYXkgYmUgaW1wcm9wZXIgaW1wbGVtZW50YXRpb25zLgorICAgICAgICBBTE9HX0FTU0VSVChyZXMgPT0gT0sgfHwgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOworICAgICAgICBpZiAocmVzICE9IE9LIHx8IG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7IC8vIG5vdCBuZWVkZWQgYnkgQVBJIHNwZWMsIGJ1dCB0byBiZSBzYWZlLgorICAgICAgICAgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICAgICAgICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBtQ29uc3VtZWQgPSAwOworICAgIH0KKyAgICBBTE9HX0FTU0VSVChtQ29uc3VtZWQgPCBtQnVmZmVyLmZyYW1lQ291bnQpOworICAgIHNpemVfdCBjb3VudCA9IG1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50LCBtQnVmZmVyLmZyYW1lQ291bnQgLSBtQ29uc3VtZWQpOworICAgIGNvdW50ID0gbWluKGNvdW50LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICBwQnVmZmVyLT5yYXcgPSBtTG9jYWxCdWZmZXJEYXRhOworICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSBjb3VudDsKKyAgICBjb3B5RnJhbWVzKHBCdWZmZXItPnJhdywgKHVpbnQ4X3QqKW1CdWZmZXIucmF3ICsgbUNvbnN1bWVkICogbUlucHV0RnJhbWVTaXplLAorICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIpCit7CisgICAgLy9BTE9HVigiQ29weUJ1ZmZlclByb3ZpZGVyKCVwKTo6cmVsZWFzZUJ1ZmZlciglcCglenUpKSIsCisgICAgLy8gICAgICAgIHRoaXMsIHBCdWZmZXIsIHBCdWZmZXItPmZyYW1lQ291bnQpOworICAgIGlmIChtTG9jYWxCdWZmZXJGcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIocEJ1ZmZlcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gTE9HX0FMV0FZU19GQVRBTF9JRihwQnVmZmVyLT5mcmFtZUNvdW50ID09IDAsICJJbnZhbGlkIGZyYW1lY291bnQiKTsKKyAgICBtQ29uc3VtZWQgKz0gcEJ1ZmZlci0+ZnJhbWVDb3VudDsgLy8gVE9ETzogdXBkYXRlIGZvciBlZmZpY2llbmN5IHRvIHJldXNlIGV4aXN0aW5nIGNvbnRlbnQKKyAgICBpZiAobUNvbnN1bWVkICE9IDAgJiYgbUNvbnN1bWVkID49IG1CdWZmZXIuZnJhbWVDb3VudCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgICAgIEFMT0dfQVNTRVJUKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKTsKKyAgICB9CisgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKK30KKwordm9pZCBBdWRpb01peGVyOjpDb3B5QnVmZmVyUHJvdmlkZXI6OnJlc2V0KCkKK3sKKyAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKKyAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgIH0KKyAgICBtQ29uc3VtZWQgPSAwOworfQorCitBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3Qgc2Vzc2lvbklkLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaW5wdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgYnVmZmVyRnJhbWVDb3VudCkgIC8vIHNldCBidWZmZXJGcmFtZUNvdW50IHRvIDAgdG8gZG8gaW4tcGxhY2UKK3sKKyAgICBBTE9HVigiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJSN4LCAlI3ggJXUgJWQpIiwKKyAgICAgICAgICAgIHRoaXMsIGlucHV0Q2hhbm5lbE1hc2ssIG91dHB1dENoYW5uZWxNYXNrLCBmb3JtYXQsCisgICAgICAgICAgICBzYW1wbGVSYXRlLCBzZXNzaW9uSWQpOworICAgIGlmICghc0lzTXVsdGljaGFubmVsQ2FwYWJsZQorICAgICAgICAgICAgfHwgRWZmZWN0Q3JlYXRlKCZzRHdubUZ4RGVzYy51dWlkLAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgIFNFU1NJT05fSURfSU5WQUxJRF9BTkRfSUdOT1JFRCwKKyAgICAgICAgICAgICAgICAgICAgJm1Eb3dubWl4SGFuZGxlKSAhPSAwKSB7CisgICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciBjcmVhdGluZyBkb3dubWl4ZXIgZWZmZWN0Iik7CisgICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKyAgICAgLy8gY2hhbm5lbCBpbnB1dCBjb25maWd1cmF0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBwZXItdHJhY2sKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBpbnB1dENoYW5uZWxNYXNrOyAgIC8vIEZJWE1FOiBTaG91bGQgYmUgYml0cworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBvdXRwdXRDaGFubmVsTWFzazsgLy8gRklYTUU6IHNob3VsZCBiZSBiaXRzCisgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFOworICAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBwcm92aWRlciwgYW5kIGZyYW1lIGNvdW50IHdpbGwgbm90IGJlIHVzZWQgYXMgdGhlIGRvd25taXggZWZmZWN0CisgICAgIC8vIHByb2Nlc3MoKSBmdW5jdGlvbiBpcyBjYWxsZWQgZGlyZWN0bHkgKHNlZSBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcigpKQorICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19TTVBfUkFURSB8IEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgfAorICAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfRk9STUFUIHwgRUZGRUNUX0NPTkZJR19BQ0NfTU9ERTsKKyAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLm1hc2sgPSBtRG93bm1peENvbmZpZy5pbnB1dENmZy5tYXNrOworCisgICAgIGludCBjbWRTdGF0dXM7CisgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOworCisgICAgIC8vIENvbmZpZ3VyZSBkb3dubWl4ZXIKKyAgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCptRG93bm1peEhhbmRsZSktPmNvbW1hbmQobURvd25taXhIYW5kbGUsCisgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfQ09ORklHIC8qY21kQ29kZSovLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSAvKmNtZFNpemUqLywKKyAgICAgICAgICAgICAmbURvd25taXhDb25maWcgLypwQ21kRGF0YSovLAorICAgICAgICAgICAgICZyZXBseVNpemUsICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOworICAgICBpZiAoc3RhdHVzICE9IDAgfHwgY21kU3RhdHVzICE9IDApIHsKKyAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yICVkIGNtZFN0YXR1cyAlZCB3aGlsZSBjb25maWd1cmluZyBkb3dubWl4ZXIiLAorICAgICAgICAgICAgICAgICBzdGF0dXMsIGNtZFN0YXR1cyk7CisgICAgICAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKKyAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorCisgICAgIC8vIEVuYWJsZSBkb3dubWl4ZXIKKyAgICAgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7CisgICAgIHN0YXR1cyA9ICgqbURvd25taXhIYW5kbGUpLT5jb21tYW5kKG1Eb3dubWl4SGFuZGxlLAorICAgICAgICAgICAgIEVGRkVDVF9DTURfRU5BQkxFIC8qY21kQ29kZSovLCAwIC8qY21kU2l6ZSovLCBOVUxMIC8qcENtZERhdGEqLywKKyAgICAgICAgICAgICAmcmVwbHlTaXplLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKKyAgICAgaWYgKHN0YXR1cyAhPSAwIHx8IGNtZFN0YXR1cyAhPSAwKSB7CisgICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciAlZCBjbWRTdGF0dXMgJWQgd2hpbGUgZW5hYmxpbmcgZG93bm1peGVyIiwKKyAgICAgICAgICAgICAgICAgc3RhdHVzLCBjbWRTdGF0dXMpOworICAgICAgICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7CisgICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKworICAgICAvLyBTZXQgZG93bm1peCB0eXBlCisgICAgIC8vIHBhcmFtZXRlciBzaXplIHJvdW5kZWQgZm9yIHBhZGRpbmcgb24gMzJiaXQgYm91bmRhcnkKKyAgICAgY29uc3QgaW50IHBzaXplUGFkZGVkID0gKChzaXplb2YoZG93bm1peF9wYXJhbXNfdCkgLSAxKS9zaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CisgICAgIGNvbnN0IGludCBkb3dubWl4UGFyYW1TaXplID0KKyAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcHNpemVQYWRkZWQgKyBzaXplb2YoZG93bm1peF90eXBlX3QpOworICAgICBlZmZlY3RfcGFyYW1fdCAqIGNvbnN0IHBhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopIG1hbGxvYyhkb3dubWl4UGFyYW1TaXplKTsKKyAgICAgcGFyYW0tPnBzaXplID0gc2l6ZW9mKGRvd25taXhfcGFyYW1zX3QpOworICAgICBjb25zdCBkb3dubWl4X3BhcmFtc190IGRvd25taXhQYXJhbSA9IERPV05NSVhfUEFSQU1fVFlQRTsKKyAgICAgbWVtY3B5KHBhcmFtLT5kYXRhLCAmZG93bm1peFBhcmFtLCBwYXJhbS0+cHNpemUpOworICAgICBjb25zdCBkb3dubWl4X3R5cGVfdCBkb3dubWl4VHlwZSA9IERPV05NSVhfVFlQRV9GT0xEOworICAgICBwYXJhbS0+dnNpemUgPSBzaXplb2YoZG93bm1peF90eXBlX3QpOworICAgICBtZW1jcHkocGFyYW0tPmRhdGEgKyBwc2l6ZVBhZGRlZCwgJmRvd25taXhUeXBlLCBwYXJhbS0+dnNpemUpOworICAgICByZXBseVNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgc3RhdHVzID0gKCptRG93bm1peEhhbmRsZSktPmNvbW1hbmQobURvd25taXhIYW5kbGUsCisgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfUEFSQU0gLyogY21kQ29kZSAqLywgZG93bm1peFBhcmFtU2l6ZSAvKiBjbWRTaXplICovLAorICAgICAgICAgICAgIHBhcmFtIC8qcENtZERhdGEqLywgJnJlcGx5U2l6ZSwgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7CisgICAgIGZyZWUocGFyYW0pOworICAgICBpZiAoc3RhdHVzICE9IDAgfHwgY21kU3RhdHVzICE9IDApIHsKKyAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yICVkIGNtZFN0YXR1cyAlZCB3aGlsZSBzZXR0aW5nIGRvd25taXggdHlwZSIsCisgICAgICAgICAgICAgICAgIHN0YXR1cywgY21kU3RhdHVzKTsKKyAgICAgICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOworICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOworICAgICAgICAgcmV0dXJuOworICAgICB9CisgICAgIEFMT0dWKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGRvd25taXggdHlwZSBzZXQgdG8gJWQiLCAoaW50KSBkb3dubWl4VHlwZSk7CiB9CiAKIEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjp+RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKQogewotICAgIEFMT0dWKCJBdWRpb01peGVyIGRlbGV0aW5nIERvd25taXhlckJ1ZmZlclByb3ZpZGVyICglcCkiLCB0aGlzKTsKKyAgICBBTE9HVigifkRvd25taXhlckJ1ZmZlclByb3ZpZGVyICglcCkiLCB0aGlzKTsKICAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKKyAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7CiB9CiAKLXN0YXR1c190IEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlciwKLSAgICAgICAgaW50NjRfdCBwdHMpIHsKLSAgICAvL0FMT0dWKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcigpIik7Ci0gICAgaWYgKHRoaXMtPm1UcmFja0J1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIocEJ1ZmZlciwgcHRzKTsKLSAgICAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBwQnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyA9IHBCdWZmZXItPnJhdzsKLSAgICAgICAgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IHBCdWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdyA9IG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXc7Ci0gICAgICAgICAgICAvLyBpbi1wbGFjZSBzbyBvdmVyd3JpdGUgdGhlIGJ1ZmZlciBjb250ZW50cywgaGFzIGJlZW4gc2V0IGluIHByZXBhcmVUcmFja0ZvckRvd25taXgoKQotICAgICAgICAgICAgLy9tRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFOwordm9pZCBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lczsKKyAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3ID0gY29uc3RfY2FzdDx2b2lkICo+KHNyYyk7CisgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzOworICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3ID0gZHN0OworICAgIC8vIG1heSBiZSBpbi1wbGFjZSBpZiBzcmMgPT0gZHN0LgorICAgIHN0YXR1c190IHJlcyA9ICgqbURvd25taXhIYW5kbGUpLT5wcm9jZXNzKG1Eb3dubWl4SGFuZGxlLAorICAgICAgICAgICAgJm1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlciwgJm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIpOworICAgIEFMT0dFX0lGKHJlcyAhPSBPSywgIkRvd25taXhCdWZmZXJQcm92aWRlciBlcnJvciAlZCIsIHJlcyk7Cit9CiAKLSAgICAgICAgICAgIHJlcyA9ICgqbURvd25taXhIYW5kbGUpLT5wcm9jZXNzKG1Eb3dubWl4SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAmbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLCAmbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlcik7Ci0gICAgICAgICAgICAvL0FMT0dWKCJnZXROZXh0QnVmZmVyIGlzIGRvd25taXhpbmciKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcigpIGVycm9yOiBOVUxMIHRyYWNrIGJ1ZmZlciBwcm92aWRlciIpOworLyogY2FsbCBvbmNlIGluIGEgcHRocmVhZF9vbmNlIGhhbmRsZXIuICovCisvKnN0YXRpYyovIHN0YXR1c190IEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppbml0KCkKK3sKKyAgICAvLyBmaW5kIG11bHRpY2hhbm5lbCBkb3dubWl4IGVmZmVjdCBpZiB3ZSBoYXZlIHRvIHBsYXkgbXVsdGljaGFubmVsIGNvbnRlbnQKKyAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKKyAgICBpbnQgcmV0ID0gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXIoKSBlcnJvciAlZCBxdWVyeWluZyBudW1iZXIgb2YgZWZmZWN0cyIsIHJldCk7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLX0KKyAgICBBTE9HVigiRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkgbnVtRWZmZWN0cz0lZCIsIG51bUVmZmVjdHMpOwogCi12b2lkIEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlcikgewotICAgIC8vQUxPR1YoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKCkiKTsKLSAgICBpZiAodGhpcy0+bVRyYWNrQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgewotICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcihwQnVmZmVyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoKSBlcnJvcjogTlVMTCB0cmFjayBidWZmZXIgcHJvdmlkZXIiKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwIDsgaSA8IG51bUVmZmVjdHMgOyBpKyspIHsKKyAgICAgICAgaWYgKEVmZmVjdFF1ZXJ5RWZmZWN0KGksICZzRHdubUZ4RGVzYykgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoImVmZmVjdCAlZCBpcyBjYWxsZWQgJXMiLCBpLCBzRHdubUZ4RGVzYy5uYW1lKTsKKyAgICAgICAgICAgIGlmIChtZW1jbXAoJnNEd25tRnhEZXNjLnR5cGUsIEVGRkVDVF9VSUlEX0RPV05NSVgsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBlZmZlY3QgXCIlc1wiIGZyb20gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgc0R3bm1GeERlc2MubmFtZSwgc0R3bm1GeERlc2MuaW1wbGVtZW50b3IpOworICAgICAgICAgICAgICAgIHNJc011bHRpY2hhbm5lbENhcGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQorICAgIEFMT0dXX0lGKCFzSXNNdWx0aWNoYW5uZWxDYXBhYmxlLCAidW5hYmxlIHRvIGZpbmQgZG93bm1peCBlZmZlY3QiKTsKKyAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAorLypzdGF0aWMqLyBib29sIEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpzSXNNdWx0aWNoYW5uZWxDYXBhYmxlID0gZmFsc2U7CisvKnN0YXRpYyovIGVmZmVjdF9kZXNjcmlwdG9yX3QgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnNEd25tRnhEZXNjOworCitBdWRpb01peGVyOjpSZW1peEJ1ZmZlclByb3ZpZGVyOjpSZW1peEJ1ZmZlclByb3ZpZGVyKGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaW5wdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG91dHB1dENoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICBidWZmZXJGcmFtZUNvdW50KSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICBtU2FtcGxlU2l6ZShhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpLAorICAgICAgICBtSW5wdXRDaGFubmVscyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaW5wdXRDaGFubmVsTWFzaykpLAorICAgICAgICBtT3V0cHV0Q2hhbm5lbHMoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG91dHB1dENoYW5uZWxNYXNrKSkKK3sKKyAgICBBTE9HVigiUmVtaXhCdWZmZXJQcm92aWRlciglcCkoJSN4LCAlI3gsICUjeCkgJXp1ICV6dSIsCisgICAgICAgICAgICB0aGlzLCBmb3JtYXQsIGlucHV0Q2hhbm5lbE1hc2ssIG91dHB1dENoYW5uZWxNYXNrLAorICAgICAgICAgICAgbUlucHV0Q2hhbm5lbHMsIG1PdXRwdXRDaGFubmVscyk7CisgICAgLy8gVE9ETzogY29uc2lkZXIgY2hhbm5lbCByZXByZXNlbnRhdGlvbiBpbiBpbmRleCBhcnJheSBmb3JtdWxhdGlvbgorICAgIC8vIFdlIGlnbm9yZSBjaGFubmVsIHJlcHJlc2VudGF0aW9uLCBhbmQganVzdCB1c2UgdGhlIGJpdHMuCisgICAgbWVtY3B5X2J5X2luZGV4X2FycmF5X2luaXRpYWxpemF0aW9uKG1JZHhBcnksIEFSUkFZX1NJWkUobUlkeEFyeSksCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMob3V0cHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGlucHV0Q2hhbm5lbE1hc2spKTsKK30KKwordm9pZCBBdWRpb01peGVyOjpSZW1peEJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIG1lbWNweV9ieV9pbmRleF9hcnJheShkc3QsIG1PdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgIHNyYywgbUlucHV0Q2hhbm5lbHMsIG1JZHhBcnksIG1TYW1wbGVTaXplLCBmcmFtZXMpOworfQorCitBdWRpb01peGVyOjpSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOjpSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKGludDMyX3QgY2hhbm5lbHMsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0LCBhdWRpb19mb3JtYXRfdCBvdXRwdXRGb3JtYXQsCisgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgIGNoYW5uZWxzICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShpbnB1dEZvcm1hdCksCisgICAgICAgICAgICBjaGFubmVscyAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUob3V0cHV0Rm9ybWF0KSwKKyAgICAgICAgICAgIGJ1ZmZlckZyYW1lQ291bnQpLAorICAgICAgICBtQ2hhbm5lbHMoY2hhbm5lbHMpLAorICAgICAgICBtSW5wdXRGb3JtYXQoaW5wdXRGb3JtYXQpLAorICAgICAgICBtT3V0cHV0Rm9ybWF0KG91dHB1dEZvcm1hdCkKK3sKKyAgICBBTE9HVigiUmVmb3JtYXRCdWZmZXJQcm92aWRlciglcCkoJWQsICUjeCwgJSN4KSIsIHRoaXMsIGNoYW5uZWxzLCBpbnB1dEZvcm1hdCwgb3V0cHV0Rm9ybWF0KTsKK30KKwordm9pZCBBdWRpb01peGVyOjpSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoZHN0LCBtT3V0cHV0Rm9ybWF0LCBzcmMsIG1JbnB1dEZvcm1hdCwgZnJhbWVzICogbUNoYW5uZWxzKTsKK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotYm9vbCBBdWRpb01peGVyOjppc011bHRpY2hhbm5lbENhcGFibGUgPSBmYWxzZTsKLQotZWZmZWN0X2Rlc2NyaXB0b3JfdCBBdWRpb01peGVyOjpkd25tRnhEZXNjOwogCiAvLyBFbnN1cmUgbUNvbmZpZ3VyZWROYW1lcyBiaXRtYXNrIGlzIGluaXRpYWxpemVkIHByb3Blcmx5IG9uIGFsbCBhcmNoaXRlY3R1cmVzLgogLy8gVGhlIHZhbHVlIG9mIDEgPDwgeCBpcyB1bmRlZmluZWQgaW4gQyB3aGVuIHggPj0gMzIuCkBAIC0xMDEsMjAgKzM4MiwxMiBAQAogICAgIDogICBtVHJhY2tOYW1lcygwKSwgbUNvbmZpZ3VyZWROYW1lcygobWF4TnVtVHJhY2tzID49IDMyID8gMCA6IDEgPDwgbWF4TnVtVHJhY2tzKSAtIDEpLAogICAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKQogewotICAgIC8vIEF1ZGlvTWl4ZXIgaXMgbm90IHlldCBjYXBhYmxlIG9mIG11bHRpLWNoYW5uZWwgYmV5b25kIHN0ZXJlbwotICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoMiA9PSBNQVhfTlVNX0NIQU5ORUxTKTsKLQogICAgIEFMT0dfQVNTRVJUKG1heE51bVRyYWNrcyA8PSBNQVhfTlVNX1RSQUNLUywgIm1heE51bVRyYWNrcyAldSA+IE1BWF9OVU1fVFJBQ0tTICV1IiwKICAgICAgICAgICAgIG1heE51bVRyYWNrcywgTUFYX05VTV9UUkFDS1MpOwogCiAgICAgLy8gQXVkaW9NaXhlciBpcyBub3QgeWV0IGNhcGFibGUgb2YgbW9yZSB0aGFuIDMyIGFjdGl2ZSB0cmFjayBpbnB1dHMKICAgICBBTE9HX0FTU0VSVCgzMiA+PSBNQVhfTlVNX1RSQUNLUywgImJhZCBNQVhfTlVNX1RSQUNLUyAlZCIsIE1BWF9OVU1fVFJBQ0tTKTsKIAotICAgIC8vIEF1ZGlvTWl4ZXIgaXMgbm90IHlldCBjYXBhYmxlIG9mIG11bHRpLWNoYW5uZWwgb3V0cHV0IGJleW9uZCBzdGVyZW8KLSAgICBBTE9HX0FTU0VSVCgyID09IE1BWF9OVU1fQ0hBTk5FTFMsICJiYWQgTUFYX05VTV9DSEFOTkVMUyAlZCIsIE1BWF9OVU1fQ0hBTk5FTFMpOwotCi0gICAgTG9jYWxDbG9jayBsYzsKLQogICAgIHB0aHJlYWRfb25jZSgmc09uY2VDb250cm9sLCAmc0luaXRSb3V0aW5lKTsKIAogICAgIG1TdGF0ZS5lbmFibGVkVHJhY2tzPSAwOwpAQCAtMTMzLDMwICs0MDYsMTAgQEAKICAgICBmb3IgKHVuc2lnbmVkIGk9MCA7IGkgPCBNQVhfTlVNX1RSQUNLUyA7IGkrKykgewogICAgICAgICB0LT5yZXNhbXBsZXIgPSBOVUxMOwogICAgICAgICB0LT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIHQtPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKICAgICAgICAgdCsrOwogICAgIH0KIAotICAgIC8vIGZpbmQgbXVsdGljaGFubmVsIGRvd25taXggZWZmZWN0IGlmIHdlIGhhdmUgdG8gcGxheSBtdWx0aWNoYW5uZWwgY29udGVudAotICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOwotICAgIGludCByZXQgPSBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOwotICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcigpIGVycm9yICVkIHF1ZXJ5aW5nIG51bWJlciBvZiBlZmZlY3RzIiwgcmV0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBTE9HVigiRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkgbnVtRWZmZWN0cz0lZCIsIG51bUVmZmVjdHMpOwotCi0gICAgZm9yICh1aW50MzJfdCBpID0gMCA7IGkgPCBudW1FZmZlY3RzIDsgaSsrKSB7Ci0gICAgICAgIGlmIChFZmZlY3RRdWVyeUVmZmVjdChpLCAmZHdubUZ4RGVzYykgPT0gMCkgewotICAgICAgICAgICAgQUxPR1YoImVmZmVjdCAlZCBpcyBjYWxsZWQgJXMiLCBpLCBkd25tRnhEZXNjLm5hbWUpOwotICAgICAgICAgICAgaWYgKG1lbWNtcCgmZHdubUZ4RGVzYy50eXBlLCBFRkZFQ1RfVUlJRF9ET1dOTUlYLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgZWZmZWN0IFwiJXNcIiBmcm9tICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3bm1GeERlc2MubmFtZSwgZHdubUZ4RGVzYy5pbXBsZW1lbnRvcik7Ci0gICAgICAgICAgICAgICAgaXNNdWx0aWNoYW5uZWxDYXBhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HRV9JRighaXNNdWx0aWNoYW5uZWxDYXBhYmxlLCAidW5hYmxlIHRvIGZpbmQgZG93bm1peCBlZmZlY3QiKTsKIH0KIAogQXVkaW9NaXhlcjo6fkF1ZGlvTWl4ZXIoKQpAQCAtMTY1LDYgKzQxOCw3IEBACiAgICAgZm9yICh1bnNpZ25lZCBpPTAgOyBpIDwgTUFYX05VTV9UUkFDS1MgOyBpKyspIHsKICAgICAgICAgZGVsZXRlIHQtPnJlc2FtcGxlcjsKICAgICAgICAgZGVsZXRlIHQtPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyOworICAgICAgICBkZWxldGUgdC0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHQrKzsKICAgICB9CiAgICAgZGVsZXRlIFtdIG1TdGF0ZS5vdXRwdXRUZW1wOwpAQCAtMTc2LDMyICs0MzAsNTIgQEAKICAgICBtU3RhdGUubUxvZyA9IGxvZzsKIH0KIAotaW50IEF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZShhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgaW50IHNlc3Npb25JZCkKK2ludCBBdWRpb01peGVyOjpnZXRUcmFja05hbWUoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCkKIHsKKyAgICBpZiAoIWlzVmFsaWRQY21UcmFja0Zvcm1hdChmb3JtYXQpKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb01peGVyOjpnZXRUcmFja05hbWUgaW52YWxpZCBmb3JtYXQgKCUjeCkiLCBmb3JtYXQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogICAgIHVpbnQzMl90IG5hbWVzID0gKH5tVHJhY2tOYW1lcykgJiBtQ29uZmlndXJlZE5hbWVzOwogICAgIGlmIChuYW1lcyAhPSAwKSB7CiAgICAgICAgIGludCBuID0gX19idWlsdGluX2N0eihuYW1lcyk7CiAgICAgICAgIEFMT0dWKCJhZGQgdHJhY2sgKCVkKSIsIG4pOwotICAgICAgICBtVHJhY2tOYW1lcyB8PSAxIDw8IG47CiAgICAgICAgIC8vIGFzc3VtZSBkZWZhdWx0IHBhcmFtZXRlcnMgZm9yIHRoZSB0cmFjaywgZXhjZXB0IHdoZXJlIG5vdGVkIGJlbG93CiAgICAgICAgIHRyYWNrX3QqIHQgPSAmbVN0YXRlLnRyYWNrc1tuXTsKICAgICAgICAgdC0+bmVlZHMgPSAwOwotICAgICAgICB0LT52b2x1bWVbMF0gPSBVTklUWV9HQUlOOwotICAgICAgICB0LT52b2x1bWVbMV0gPSBVTklUWV9HQUlOOwotICAgICAgICAvLyBubyBpbml0aWFsaXphdGlvbiBuZWVkZWQKLSAgICAgICAgLy8gdC0+cHJldlZvbHVtZVswXQotICAgICAgICAvLyB0LT5wcmV2Vm9sdW1lWzFdCisKKyAgICAgICAgLy8gSW50ZWdlciB2b2x1bWUuCisgICAgICAgIC8vIEN1cnJlbnRseSBpbnRlZ2VyIHZvbHVtZSBpcyBrZXB0IGZvciB0aGUgbGVnYWN5IGludGVnZXIgbWl4ZXIuCisgICAgICAgIC8vIFdpbGwgYmUgcmVtb3ZlZCB3aGVuIHRoZSBsZWdhY3kgbWl4ZXIgcGF0aCBpcyByZW1vdmVkLgorICAgICAgICB0LT52b2x1bWVbMF0gPSBVTklUWV9HQUlOX0lOVDsKKyAgICAgICAgdC0+dm9sdW1lWzFdID0gVU5JVFlfR0FJTl9JTlQ7CisgICAgICAgIHQtPnByZXZWb2x1bWVbMF0gPSBVTklUWV9HQUlOX0lOVCA8PCAxNjsKKyAgICAgICAgdC0+cHJldlZvbHVtZVsxXSA9IFVOSVRZX0dBSU5fSU5UIDw8IDE2OwogICAgICAgICB0LT52b2x1bWVJbmNbMF0gPSAwOwogICAgICAgICB0LT52b2x1bWVJbmNbMV0gPSAwOwogICAgICAgICB0LT5hdXhMZXZlbCA9IDA7CiAgICAgICAgIHQtPmF1eEluYyA9IDA7CisgICAgICAgIHQtPnByZXZBdXhMZXZlbCA9IDA7CisKKyAgICAgICAgLy8gRmxvYXRpbmcgcG9pbnQgdm9sdW1lLgorICAgICAgICB0LT5tVm9sdW1lWzBdID0gVU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgdC0+bVZvbHVtZVsxXSA9IFVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgIHQtPm1QcmV2Vm9sdW1lWzBdID0gVU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgdC0+bVByZXZWb2x1bWVbMV0gPSBVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICB0LT5tVm9sdW1lSW5jWzBdID0gMC47CisgICAgICAgIHQtPm1Wb2x1bWVJbmNbMV0gPSAwLjsKKyAgICAgICAgdC0+bUF1eExldmVsID0gMC47CisgICAgICAgIHQtPm1BdXhJbmMgPSAwLjsKKyAgICAgICAgdC0+bVByZXZBdXhMZXZlbCA9IDAuOworCiAgICAgICAgIC8vIG5vIGluaXRpYWxpemF0aW9uIG5lZWRlZAotICAgICAgICAvLyB0LT5wcmV2QXV4TGV2ZWwKICAgICAgICAgLy8gdC0+ZnJhbWVDb3VudAotICAgICAgICB0LT5jaGFubmVsQ291bnQgPSAyOworICAgICAgICB0LT5jaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwogICAgICAgICB0LT5lbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIHQtPmZvcm1hdCA9IDE2OwotICAgICAgICB0LT5jaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgQUxPR1ZfSUYoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCisgICAgICAgICAgICAgICAgIk5vbi1zdGVyZW8gY2hhbm5lbCBtYXNrOiAlZFxuIiwgY2hhbm5lbE1hc2spOworICAgICAgICB0LT5jaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwogICAgICAgICB0LT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgICAgICAgIC8vIHNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKikgaXMgcmVxdWlyZWQgYmVmb3JlIGVuYWJsZShuYW1lKQogICAgICAgICB0LT5idWZmZXJQcm92aWRlciA9IE5VTEw7CkBAIC0yMTUsNTIgKzQ4OSwxMTYgQEAKICAgICAgICAgLy8gc2V0UGFyYW1ldGVyKG5hbWUsIFRSQUNLLCBNQUlOX0JVRkZFUiwgbWl4QnVmZmVyKSBpcyByZXF1aXJlZCBiZWZvcmUgZW5hYmxlKG5hbWUpCiAgICAgICAgIHQtPm1haW5CdWZmZXIgPSBOVUxMOwogICAgICAgICB0LT5hdXhCdWZmZXIgPSBOVUxMOworICAgICAgICB0LT5tSW5wdXRCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIHQtPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKICAgICAgICAgdC0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGluaXRUcmFja0Rvd25taXgoJm1TdGF0ZS50cmFja3Nbbl0sIG4sIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgcmV0dXJuIFRSQUNLMCArIG47CisgICAgICAgIHQtPm1NaXhlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICB0LT5tRm9ybWF0ID0gZm9ybWF0OworICAgICAgICB0LT5tTWl4ZXJJbkZvcm1hdCA9IGtVc2VGbG9hdCAmJiBrVXNlTmV3TWl4ZXIKKyAgICAgICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgdC0+bU1peGVyQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfZnJvbV9yZXByZXNlbnRhdGlvbl9hbmRfYml0cygKKyAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworICAgICAgICB0LT5tTWl4ZXJDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodC0+bU1peGVyQ2hhbm5lbE1hc2spOworICAgICAgICAvLyBDaGVjayB0aGUgZG93bm1peGluZyAob3IgdXBtaXhpbmcpIHJlcXVpcmVtZW50cy4KKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5pdFRyYWNrRG93bm1peCh0LCBuKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZSBpbnZhbGlkIGNoYW5uZWxNYXNrICglI3gpIiwgY2hhbm5lbE1hc2spOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dFKCJBdWRpb01peGVyOjpnZXRUcmFja05hbWUoMHgleCkgZmFpbGVkLCBlcnJvciBwcmVwYXJpbmcgdHJhY2sgZm9yIGRvd25taXgiLAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgLy8gaW5pdFRyYWNrRG93bm1peCgpIG1heSBjaGFuZ2UgdGhlIGlucHV0IGZvcm1hdCByZXF1aXJlbWVudC4KKyAgICAgICAgLy8gSWYgeW91IGRlc2lyZSBmbG9hdGluZyBwb2ludCBpbnB1dCB0byB0aGUgbWl4ZXIsIGl0IG1heSBjaGFuZ2UKKyAgICAgICAgLy8gdG8gaW50ZWdlciBiZWNhdXNlIHRoZSBkb3dubWl4ZXIgcmVxdWlyZXMgaW50ZWdlciB0byBwcm9jZXNzLgorICAgICAgICBBTE9HVlYoIm1NaXhlckZvcm1hdDolI3ggIG1NaXhlckluRm9ybWF0OiUjeFxuIiwgdC0+bU1peGVyRm9ybWF0LCB0LT5tTWl4ZXJJbkZvcm1hdCk7CisgICAgICAgIHByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHQsIG4pOworICAgICAgICBtVHJhY2tOYW1lcyB8PSAxIDw8IG47CisgICAgICAgIHJldHVybiBUUkFDSzAgKyBuOwogICAgIH0KKyAgICBBTE9HRSgiQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lIG91dCBvZiBhdmFpbGFibGUgdHJhY2tzIik7CiAgICAgcmV0dXJuIC0xOwogfQogCiB2b2lkIEF1ZGlvTWl4ZXI6OmludmFsaWRhdGVTdGF0ZSh1aW50MzJfdCBtYXNrKQogewotICAgIGlmIChtYXNrKSB7CisgICAgaWYgKG1hc2sgIT0gMCkgewogICAgICAgICBtU3RhdGUubmVlZHNDaGFuZ2VkIHw9IG1hc2s7CiAgICAgICAgIG1TdGF0ZS5ob29rID0gcHJvY2Vzc19fdmFsaWRhdGU7CiAgICAgfQogIH0KIAotc3RhdHVzX3QgQXVkaW9NaXhlcjo6aW5pdFRyYWNrRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja051bSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzaykKLXsKLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChtYXNrKTsKLSAgICBBTE9HX0FTU0VSVCgoY2hhbm5lbENvdW50IDw9IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCkgJiYgY2hhbm5lbENvdW50KTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKLSAgICBpZiAoY2hhbm5lbENvdW50ID4gTUFYX05VTV9DSEFOTkVMUykgewotICAgICAgICBwVHJhY2stPmNoYW5uZWxNYXNrID0gbWFzazsKLSAgICAgICAgcFRyYWNrLT5jaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7Ci0gICAgICAgIEFMT0dWKCJpbml0VHJhY2tEb3dubWl4KHRyYWNrPSVkLCBtYXNrPTB4JXgpIGNhbGxzIHByZXBhcmVUcmFja0ZvckRvd25taXgoKSIsCi0gICAgICAgICAgICAgICAgdHJhY2tOdW0sIG1hc2spOwotICAgICAgICBzdGF0dXMgPSBwcmVwYXJlVHJhY2tGb3JEb3dubWl4KHBUcmFjaywgdHJhY2tOdW0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peChwVHJhY2ssIHRyYWNrTnVtKTsKKy8vIENhbGxlZCB3aGVuIGNoYW5uZWwgbWFza3MgaGF2ZSBjaGFuZ2VkIGZvciBhIHRyYWNrIG5hbWUKKy8vIFRPRE86IEZpeCBEb3dubWl4YnVmZmVycHJvZmlkZXIgbm90IHRvIChwb3NzaWJseSkgY2hhbmdlIG1peGVyIGlucHV0IGZvcm1hdCwKKy8vIHdoaWNoIHdpbGwgc2ltcGxpZnkgdGhpcyBsb2dpYy4KK2Jvb2wgQXVkaW9NaXhlcjo6c2V0Q2hhbm5lbE1hc2tzKGludCBuYW1lLAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrLCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrKSB7CisgICAgdHJhY2tfdCAmdHJhY2sgPSBtU3RhdGUudHJhY2tzW25hbWVdOworCisgICAgaWYgKHRyYWNrQ2hhbm5lbE1hc2sgPT0gdHJhY2suY2hhbm5lbE1hc2sKKyAgICAgICAgICAgICYmIG1peGVyQ2hhbm5lbE1hc2sgPT0gdHJhY2subU1peGVyQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gbm8gbmVlZCB0byBjaGFuZ2UKICAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKKyAgICAvLyBhbHdheXMgcmVjb21wdXRlIGZvciBib3RoIGNoYW5uZWwgbWFza3MgZXZlbiBpZiBvbmx5IG9uZSBoYXMgY2hhbmdlZC4KKyAgICBjb25zdCB1aW50MzJfdCB0cmFja0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0cmFja0NoYW5uZWxNYXNrKTsKKyAgICBjb25zdCB1aW50MzJfdCBtaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtaXhlckNoYW5uZWxNYXNrKTsKKyAgICBjb25zdCBib29sIG1peGVyQ2hhbm5lbENvdW50Q2hhbmdlZCA9IHRyYWNrLm1NaXhlckNoYW5uZWxDb3VudCAhPSBtaXhlckNoYW5uZWxDb3VudDsKKworICAgIEFMT0dfQVNTRVJUKCh0cmFja0NoYW5uZWxDb3VudCA8PSBNQVhfTlVNX0NIQU5ORUxTX1RPX0RPV05NSVgpCisgICAgICAgICAgICAmJiB0cmFja0NoYW5uZWxDb3VudAorICAgICAgICAgICAgJiYgbWl4ZXJDaGFubmVsQ291bnQpOworICAgIHRyYWNrLmNoYW5uZWxNYXNrID0gdHJhY2tDaGFubmVsTWFzazsKKyAgICB0cmFjay5jaGFubmVsQ291bnQgPSB0cmFja0NoYW5uZWxDb3VudDsKKyAgICB0cmFjay5tTWl4ZXJDaGFubmVsTWFzayA9IG1peGVyQ2hhbm5lbE1hc2s7CisgICAgdHJhY2subU1peGVyQ2hhbm5lbENvdW50ID0gbWl4ZXJDaGFubmVsQ291bnQ7CisKKyAgICAvLyBjaGFubmVsIG1hc2tzIGhhdmUgY2hhbmdlZCwgZG9lcyB0aGlzIHRyYWNrIG5lZWQgYSBkb3dubWl4ZXI/CisgICAgLy8gdXBkYXRlIHRvIHRyeSB1c2luZyBvdXIgZGVzaXJlZCBmb3JtYXQgKGlmIHdlIGFyZW4ndCBhbHJlYWR5IHVzaW5nIGl0KQorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHByZXZNaXhlckluRm9ybWF0ID0gdHJhY2subU1peGVySW5Gb3JtYXQ7CisgICAgdHJhY2subU1peGVySW5Gb3JtYXQgPSBrVXNlRmxvYXQgJiYga1VzZU5ld01peGVyCisgICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBpbml0VHJhY2tEb3dubWl4KCZtU3RhdGUudHJhY2tzW25hbWVdLCBuYW1lKTsKKyAgICBBTE9HRV9JRihzdGF0dXMgIT0gT0ssCisgICAgICAgICAgICAiaW5pdFRyYWNrRG93bm1peCBlcnJvciAlZCwgdHJhY2sgY2hhbm5lbCBtYXNrICUjeCwgbWl4ZXIgY2hhbm5lbCBtYXNrICUjeCIsCisgICAgICAgICAgICBzdGF0dXMsIHRyYWNrLmNoYW5uZWxNYXNrLCB0cmFjay5tTWl4ZXJDaGFubmVsTWFzayk7CisKKyAgICBjb25zdCBib29sIG1peGVySW5Gb3JtYXRDaGFuZ2VkID0gcHJldk1peGVySW5Gb3JtYXQgIT0gdHJhY2subU1peGVySW5Gb3JtYXQ7CisgICAgaWYgKG1peGVySW5Gb3JtYXRDaGFuZ2VkKSB7CisgICAgICAgIHByZXBhcmVUcmFja0ZvclJlZm9ybWF0KCZ0cmFjaywgbmFtZSk7IC8vIGJlY2F1c2Ugb2YgZG93bm1peGVyLCB0cmFjayBmb3JtYXQgbWF5IGNoYW5nZSEKKyAgICB9CisKKyAgICBpZiAodHJhY2sucmVzYW1wbGVyICYmIChtaXhlckluRm9ybWF0Q2hhbmdlZCB8fCBtaXhlckNoYW5uZWxDb3VudENoYW5nZWQpKSB7CisgICAgICAgIC8vIHJlc2FtcGxlciBpbnB1dCBmb3JtYXQgb3IgY2hhbm5lbHMgbWF5IGhhdmUgY2hhbmdlZC4KKyAgICAgICAgY29uc3QgdWludDMyX3QgcmVzZXRUb1NhbXBsZVJhdGUgPSB0cmFjay5zYW1wbGVSYXRlOworICAgICAgICBkZWxldGUgdHJhY2sucmVzYW1wbGVyOworICAgICAgICB0cmFjay5yZXNhbXBsZXIgPSBOVUxMOworICAgICAgICB0cmFjay5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7IC8vIHdpdGhvdXQgcmVzYW1wbGVyLCB0cmFjayByYXRlIGlzIGRldmljZSBzYW1wbGUgcmF0ZS4KKyAgICAgICAgLy8gcmVjcmVhdGUgdGhlIHJlc2FtcGxlciB3aXRoIHVwZGF0ZWQgZm9ybWF0LCBjaGFubmVscywgc2F2ZWQgc2FtcGxlUmF0ZS4KKyAgICAgICAgdHJhY2suc2V0UmVzYW1wbGVyKHJlc2V0VG9TYW1wbGVSYXRlIC8qdHJhY2tTYW1wbGVSYXRlKi8sIG1TYW1wbGVSYXRlIC8qZGV2U2FtcGxlUmF0ZSovKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSkgeworc3RhdHVzX3QgQXVkaW9NaXhlcjo6aW5pdFRyYWNrRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpCit7CisgICAgLy8gT25seSByZW1peCAodXBtaXggb3IgZG93bm1peCkgaWYgdGhlIHRyYWNrIGFuZCBtaXhlci9kZXZpY2UgY2hhbm5lbCBtYXNrcworICAgIC8vIGFyZSBub3QgdGhlIHNhbWUgYW5kIG5vdCBoYW5kbGVkIGludGVybmFsbHksIGFzIG1vbm8gLT4gc3RlcmVvIGN1cnJlbnRseSBpcy4KKyAgICBpZiAocFRyYWNrLT5jaGFubmVsTWFzayAhPSBwVHJhY2stPm1NaXhlckNoYW5uZWxNYXNrCisgICAgICAgICAgICAmJiAhKHBUcmFjay0+Y2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTworICAgICAgICAgICAgICAgICAgICAmJiBwVHJhY2stPm1NaXhlckNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpIHsKKyAgICAgICAgcmV0dXJuIHByZXBhcmVUcmFja0ZvckRvd25taXgocFRyYWNrLCB0cmFja05hbWUpOworICAgIH0KKyAgICAvLyBubyByZW1peCBuZWNlc3NhcnkKKyAgICB1bnByZXBhcmVUcmFja0ZvckRvd25taXgocFRyYWNrLCB0cmFja05hbWUpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb01peGVyOjp1bnByZXBhcmVUcmFja0ZvckRvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lIF9fdW51c2VkKSB7CiAgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yRG93bm1peCglZCkiLCB0cmFja05hbWUpOwogCiAgICAgaWYgKHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgewogICAgICAgICAvLyB0aGlzIHRyYWNrIGhhZCBwcmV2aW91c2x5IGJlZW4gY29uZmlndXJlZCB3aXRoIGEgZG93bm1peGVyLCBkZWxldGUgaXQKICAgICAgICAgQUxPR1YoIiBkZWxldGluZyBvbGQgZG93bm1peGVyIik7Ci0gICAgICAgIHBUcmFjay0+YnVmZmVyUHJvdmlkZXIgPSBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5tVHJhY2tCdWZmZXJQcm92aWRlcjsKICAgICAgICAgZGVsZXRlIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCIgbm90aGluZyB0byBkbywgbm8gZG93bm1peGVyIHRvIGRlbGV0ZSIpOwogICAgIH0KQEAgLTI3MiwxMDEgKzYxMCw2NiBAQAogCiAgICAgLy8gZGlzY2FyZCB0aGUgcHJldmlvdXMgZG93bm1peGVyIGlmIHRoZXJlIHdhcyBvbmUKICAgICB1bnByZXBhcmVUcmFja0ZvckRvd25taXgocFRyYWNrLCB0cmFja05hbWUpOworICAgIGlmIChEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6aXNNdWx0aWNoYW5uZWxDYXBhYmxlKCkpIHsKKyAgICAgICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIqIHBEYnAgPSBuZXcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIocFRyYWNrLT5jaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBwVHJhY2stPm1NaXhlckNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIC8qIFRPRE86IHVzZSBwVHJhY2stPm1NaXhlckluRm9ybWF0LCBub3cgb25seSBQQ00gMTYgKi8sCisgICAgICAgICAgICAgICAgcFRyYWNrLT5zYW1wbGVSYXRlLCBwVHJhY2stPnNlc3Npb25JZCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKIAotICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKiBwRGJwID0gbmV3IERvd25taXhlckJ1ZmZlclByb3ZpZGVyKCk7Ci0gICAgaW50MzJfdCBzdGF0dXM7Ci0KLSAgICBpZiAoIWlzTXVsdGljaGFubmVsQ2FwYWJsZSkgewotICAgICAgICBBTE9HRSgicHJlcGFyZVRyYWNrRm9yRG93bm1peCglZCkgZmFpbHM6IG1peGVyIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aWNoYW5uZWwgY29udGVudCIsCi0gICAgICAgICAgICAgICAgdHJhY2tOYW1lKTsKLSAgICAgICAgZ290byBub0Rvd25taXhGb3JBY3RpdmVUcmFjazsKKyAgICAgICAgaWYgKHBEYnAtPmlzVmFsaWQoKSkgeyAvLyBpZiBjb25zdHJ1Y3RvciBjb21wbGV0ZWQgcHJvcGVybHkKKyAgICAgICAgICAgIHBUcmFjay0+bU1peGVySW5Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsgLy8gUENNIDE2IGJpdCByZXF1aXJlZCBmb3IgZG93bm1peAorICAgICAgICAgICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IHBEYnA7CisgICAgICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBwRGJwOwogICAgIH0KIAotICAgIGlmIChFZmZlY3RDcmVhdGUoJmR3bm1GeERlc2MudXVpZCwKLSAgICAgICAgICAgIHBUcmFjay0+c2Vzc2lvbklkIC8qc2Vzc2lvbklkKi8sIC0yIC8qaW9JZCBub3QgcmVsZXZhbnQgaGVyZSwgdXNpbmcgcmFuZG9tIHZhbHVlKi8sCi0gICAgICAgICAgICAmcERicC0+bURvd25taXhIYW5kbGUvKnBIYW5kbGUqLykgIT0gMCkgewotICAgICAgICBBTE9HRSgicHJlcGFyZVRyYWNrRm9yRG93bm1peCglZCkgZmFpbHM6IGVycm9yIGNyZWF0aW5nIGRvd25taXhlciBlZmZlY3QiLCB0cmFja05hbWUpOwotICAgICAgICBnb3RvIG5vRG93bm1peEZvckFjdGl2ZVRyYWNrOwotICAgIH0KLQotICAgIC8vIGNoYW5uZWwgaW5wdXQgY29uZmlndXJhdGlvbiB3aWxsIGJlIG92ZXJyaWRkZW4gcGVyLXRyYWNrCi0gICAgcERicC0+bURvd25taXhDb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBwVHJhY2stPmNoYW5uZWxNYXNrOwotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgcERicC0+bURvd25taXhDb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gcFRyYWNrLT5zYW1wbGVSYXRlOwotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBwVHJhY2stPnNhbXBsZVJhdGU7Ci0gICAgcERicC0+bURvd25taXhDb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7Ci0gICAgcERicC0+bURvd25taXhDb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURTsKLSAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBwcm92aWRlciwgYW5kIGZyYW1lIGNvdW50IHdpbGwgbm90IGJlIHVzZWQgYXMgdGhlIGRvd25taXggZWZmZWN0Ci0gICAgLy8gcHJvY2VzcygpIGZ1bmN0aW9uIGlzIGNhbGxlZCBkaXJlY3RseSAoc2VlIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKCkpCi0gICAgcERicC0+bURvd25taXhDb25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfU01QX1JBVEUgfCBFRkZFQ1RfQ09ORklHX0NIQU5ORUxTIHwKLSAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfRk9STUFUIHwgRUZGRUNUX0NPTkZJR19BQ0NfTU9ERTsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5vdXRwdXRDZmcubWFzayA9IHBEYnAtPm1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLm1hc2s7Ci0KLSAgICB7Ly8gc2NvcGUgZm9yIGxvY2FsIHZhcmlhYmxlcyB0aGF0IGFyZSBub3QgdXNlZCBpbiBnb3RvIGxhYmVsICJub0Rvd25taXhGb3JBY3RpdmVUcmFjayIKLSAgICAgICAgaW50IGNtZFN0YXR1czsKLSAgICAgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7Ci0KLSAgICAgICAgLy8gQ29uZmlndXJlIGFuZCBlbmFibGUgZG93bm1peGVyCi0gICAgICAgIHN0YXR1cyA9ICgqcERicC0+bURvd25taXhIYW5kbGUpLT5jb21tYW5kKHBEYnAtPm1Eb3dubWl4SGFuZGxlLAotICAgICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX0NPTkZJRyAvKmNtZENvZGUqLywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgLypjbWRTaXplKi8sCi0gICAgICAgICAgICAgICAgJnBEYnAtPm1Eb3dubWl4Q29uZmlnIC8qcENtZERhdGEqLywKLSAgICAgICAgICAgICAgICAmcmVwbHlTaXplIC8qcmVwbHlTaXplKi8sICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOwotICAgICAgICBpZiAoKHN0YXR1cyAhPSAwKSB8fCAoY21kU3RhdHVzICE9IDApKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgJWQgd2hpbGUgY29uZmlndXJpbmcgZG93bm1peGVyIGZvciB0cmFjayAlZCIsIHN0YXR1cywgdHJhY2tOYW1lKTsKLSAgICAgICAgICAgIGdvdG8gbm9Eb3dubWl4Rm9yQWN0aXZlVHJhY2s7Ci0gICAgICAgIH0KLSAgICAgICAgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7Ci0gICAgICAgIHN0YXR1cyA9ICgqcERicC0+bURvd25taXhIYW5kbGUpLT5jb21tYW5kKHBEYnAtPm1Eb3dubWl4SGFuZGxlLAotICAgICAgICAgICAgICAgIEVGRkVDVF9DTURfRU5BQkxFIC8qY21kQ29kZSovLCAwIC8qY21kU2l6ZSovLCBOVUxMIC8qcENtZERhdGEqLywKLSAgICAgICAgICAgICAgICAmcmVwbHlTaXplIC8qcmVwbHlTaXplKi8sICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOwotICAgICAgICBpZiAoKHN0YXR1cyAhPSAwKSB8fCAoY21kU3RhdHVzICE9IDApKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgJWQgd2hpbGUgZW5hYmxpbmcgZG93bm1peGVyIGZvciB0cmFjayAlZCIsIHN0YXR1cywgdHJhY2tOYW1lKTsKLSAgICAgICAgICAgIGdvdG8gbm9Eb3dubWl4Rm9yQWN0aXZlVHJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgZG93bm1peCB0eXBlCi0gICAgICAgIC8vIHBhcmFtZXRlciBzaXplIHJvdW5kZWQgZm9yIHBhZGRpbmcgb24gMzJiaXQgYm91bmRhcnkKLSAgICAgICAgY29uc3QgaW50IHBzaXplUGFkZGVkID0gKChzaXplb2YoZG93bm1peF9wYXJhbXNfdCkgLSAxKS9zaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7Ci0gICAgICAgIGNvbnN0IGludCBkb3dubWl4UGFyYW1TaXplID0KLSAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcHNpemVQYWRkZWQgKyBzaXplb2YoZG93bm1peF90eXBlX3QpOwotICAgICAgICBlZmZlY3RfcGFyYW1fdCAqIGNvbnN0IHBhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopIG1hbGxvYyhkb3dubWl4UGFyYW1TaXplKTsKLSAgICAgICAgcGFyYW0tPnBzaXplID0gc2l6ZW9mKGRvd25taXhfcGFyYW1zX3QpOwotICAgICAgICBjb25zdCBkb3dubWl4X3BhcmFtc190IGRvd25taXhQYXJhbSA9IERPV05NSVhfUEFSQU1fVFlQRTsKLSAgICAgICAgbWVtY3B5KHBhcmFtLT5kYXRhLCAmZG93bm1peFBhcmFtLCBwYXJhbS0+cHNpemUpOwotICAgICAgICBjb25zdCBkb3dubWl4X3R5cGVfdCBkb3dubWl4VHlwZSA9IERPV05NSVhfVFlQRV9GT0xEOwotICAgICAgICBwYXJhbS0+dnNpemUgPSBzaXplb2YoZG93bm1peF90eXBlX3QpOwotICAgICAgICBtZW1jcHkocGFyYW0tPmRhdGEgKyBwc2l6ZVBhZGRlZCwgJmRvd25taXhUeXBlLCBwYXJhbS0+dnNpemUpOwotCi0gICAgICAgIHN0YXR1cyA9ICgqcERicC0+bURvd25taXhIYW5kbGUpLT5jb21tYW5kKHBEYnAtPm1Eb3dubWl4SGFuZGxlLAotICAgICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX1BBUkFNIC8qIGNtZENvZGUgKi8sIGRvd25taXhQYXJhbVNpemUvKiBjbWRTaXplICovLAotICAgICAgICAgICAgICAgIHBhcmFtIC8qcENtbmREYXRhKi8sICZyZXBseVNpemUgLypyZXBseVNpemUqLywgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7Ci0KLSAgICAgICAgZnJlZShwYXJhbSk7Ci0KLSAgICAgICAgaWYgKChzdGF0dXMgIT0gMCkgfHwgKGNtZFN0YXR1cyAhPSAwKSkgewotICAgICAgICAgICAgQUxPR0UoImVycm9yICVkIHdoaWxlIHNldHRpbmcgZG93bm1peCB0eXBlIGZvciB0cmFjayAlZCIsIHN0YXR1cywgdHJhY2tOYW1lKTsKLSAgICAgICAgICAgIGdvdG8gbm9Eb3dubWl4Rm9yQWN0aXZlVHJhY2s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiZG93bm1peCB0eXBlIHNldCB0byAlZCBmb3IgdHJhY2sgJWQiLCAoaW50KSBkb3dubWl4VHlwZSwgdHJhY2tOYW1lKTsKLSAgICAgICAgfQotICAgIH0vLyBlbmQgb2Ygc2NvcGUgZm9yIGxvY2FsIHZhcmlhYmxlcyB0aGF0IGFyZSBub3QgdXNlZCBpbiBnb3RvIGxhYmVsICJub0Rvd25taXhGb3JBY3RpdmVUcmFjayIKLQotICAgIC8vIGluaXRpYWxpemF0aW9uIHN1Y2Nlc3NmdWw6Ci0gICAgLy8gLSBrZWVwIHRyYWNrIG9mIHRoZSByZWFsIGJ1ZmZlciBwcm92aWRlciBpbiBjYXNlIGl0IHdhcyBzZXQgYmVmb3JlCi0gICAgcERicC0+bVRyYWNrQnVmZmVyUHJvdmlkZXIgPSBwVHJhY2stPmJ1ZmZlclByb3ZpZGVyOwotICAgIC8vIC0gd2UnbGwgdXNlIHRoZSBkb3dubWl4IGVmZmVjdCBpbnRlZ3JhdGVkIGluc2lkZSB0aGlzCi0gICAgLy8gICAgdHJhY2sncyBidWZmZXIgcHJvdmlkZXIsIGFuZCB3ZSdsbCB1c2UgaXQgYXMgdGhlIHRyYWNrJ3MgYnVmZmVyIHByb3ZpZGVyCi0gICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IHBEYnA7Ci0gICAgcFRyYWNrLT5idWZmZXJQcm92aWRlciA9IHBEYnA7Ci0KKyAgICAvLyBFZmZlY3QgZG93bm1peGVyIGRvZXMgbm90IGFjY2VwdCB0aGUgY2hhbm5lbCBjb252ZXJzaW9uLiAgTGV0J3MgdXNlIG91ciByZW1peGVyLgorICAgIFJlbWl4QnVmZmVyUHJvdmlkZXIqIHBSYnAgPSBuZXcgUmVtaXhCdWZmZXJQcm92aWRlcihwVHJhY2stPmNoYW5uZWxNYXNrLAorICAgICAgICAgICAgcFRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzaywgcFRyYWNrLT5tTWl4ZXJJbkZvcm1hdCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKKyAgICAvLyBSZW1peCBhbHdheXMgZmluZHMgYSBjb252ZXJzaW9uIHdoZXJlYXMgRG93bm1peGVyIGVmZmVjdCBhYm92ZSBtYXkgZmFpbC4KKyAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gcFJicDsKKyAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOwogICAgIHJldHVybiBOT19FUlJPUjsKK30KIAotbm9Eb3dubWl4Rm9yQWN0aXZlVHJhY2s6Ci0gICAgZGVsZXRlIHBEYnA7Ci0gICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Cit2b2lkIEF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lIF9fdW51c2VkKSB7CisgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJWQpIiwgdHJhY2tOYW1lKTsKKyAgICBpZiAocFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOworICAgICAgICBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMocFRyYWNrKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSkKK3sKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJWQpIHdpdGggZm9ybWF0ICUjeCIsIHRyYWNrTmFtZSwgcFRyYWNrLT5tRm9ybWF0KTsKKyAgICAvLyBkaXNjYXJkIHRoZSBwcmV2aW91cyByZWZvcm1hdHRlciBpZiB0aGVyZSB3YXMgb25lCisgICAgdW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdChwVHJhY2ssIHRyYWNrTmFtZSk7CisgICAgLy8gb25seSBjb25maWd1cmUgcmVmb3JtYXR0ZXIgaWYgbmVlZGVkCisgICAgaWYgKHBUcmFjay0+bUZvcm1hdCAhPSBwVHJhY2stPm1NaXhlckluRm9ybWF0KSB7CisgICAgICAgIHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBuZXcgUmVmb3JtYXRCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socFRyYWNrLT5jaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgcFRyYWNrLT5tRm9ybWF0LCBwVHJhY2stPm1NaXhlckluRm9ybWF0LAorICAgICAgICAgICAgICAgIGtDb3B5QnVmZmVyRnJhbWVDb3VudCk7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb01peGVyOjpyZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyh0cmFja190KiBwVHJhY2spCit7CisgICAgcFRyYWNrLT5idWZmZXJQcm92aWRlciA9IHBUcmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXI7CisgICAgaWYgKHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIpIHsKKyAgICAgICAgcFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIocFRyYWNrLT5idWZmZXJQcm92aWRlcik7CisgICAgICAgIHBUcmFjay0+YnVmZmVyUHJvdmlkZXIgPSBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOworICAgIH0KKyAgICBpZiAocFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlcikgeworICAgICAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihwVHJhY2stPmJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgcFRyYWNrLT5idWZmZXJQcm92aWRlciA9IHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvTWl4ZXI6OmRlbGV0ZVRyYWNrTmFtZShpbnQgbmFtZSkKQEAgLTM4NSw2ICs2ODgsOCBAQAogICAgIHRyYWNrLnJlc2FtcGxlciA9IE5VTEw7CiAgICAgLy8gZGVsZXRlIHRoZSBkb3dubWl4ZXIKICAgICB1bnByZXBhcmVUcmFja0ZvckRvd25taXgoJm1TdGF0ZS50cmFja3NbbmFtZV0sIG5hbWUpOworICAgIC8vIGRlbGV0ZSB0aGUgcmVmb3JtYXR0ZXIKKyAgICB1bnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KCZtU3RhdGUudHJhY2tzW25hbWVdLCBuYW1lKTsKIAogICAgIG1UcmFja05hbWVzICY9IH4oMTw8bmFtZSk7CiB9CkBAIC00MTUsMjkgKzcyMCw5MSBAQAogICAgIH0KIH0KIAorLyogU2V0cyB0aGUgdm9sdW1lIHJhbXAgdmFyaWFibGVzIGZvciB0aGUgQXVkaW9NaXhlci4KKyAqCisgKiBUaGUgdm9sdW1lIHJhbXAgdmFyaWFibGVzIGFyZSB1c2VkIHRvIHRyYW5zaXRpb24gZnJvbSB0aGUgcHJldmlvdXMKKyAqIHZvbHVtZSB0byB0aGUgc2V0IHZvbHVtZS4gIHJhbXAgY29udHJvbHMgdGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLgorICogSXRzIHZhbHVlIGlzIHR5cGljYWxseSBvbmUgc3RhdGUgZnJhbWVjb3VudCBwZXJpb2QsIGJ1dCBtYXkgYWxzbyBiZSAwLAorICogbWVhbmluZyAiaW1tZWRpYXRlLiIKKyAqCisgKiBGSVhNRTogMSkgVm9sdW1lIHJhbXAgaXMgZW5hYmxlZCBvbmx5IGlmIHRoZXJlIGlzIGEgbm9uemVybyBpbnRlZ2VyIGluY3JlbWVudAorICogZXZlbiBpZiB0aGVyZSBpcyBhIG5vbnplcm8gZmxvYXRpbmcgcG9pbnQgaW5jcmVtZW50IChpbiB0aGF0IGNhc2UsIHRoZSB2b2x1bWUKKyAqIGNoYW5nZSBpcyBpbW1lZGlhdGUpLiAgVGhpcyByZXN0cmljdGlvbiBzaG91bGQgYmUgY2hhbmdlZCB3aGVuIHRoZSBsZWdhY3kgbWl4ZXIKKyAqIGlzIHJlbW92ZWQgKHNlZSAjMikuCisgKiBGSVhNRTogMikgSW50ZWdlciB2b2x1bWUgdmFyaWFibGVzIGFyZSB1c2VkIGZvciBMZWdhY3kgbWl4aW5nIGFuZCBzaG91bGQgYmUgcmVtb3ZlZAorICogd2hlbiBubyBsb25nZXIgbmVlZGVkLgorICoKKyAqIEBwYXJhbSBuZXdWb2x1bWUgc2V0IHZvbHVtZSB0YXJnZXQgaW4gZmxvYXRpbmcgcG9pbnQgWzAuMCwgMS4wXS4KKyAqIEBwYXJhbSByYW1wIG51bWJlciBvZiBmcmFtZXMgdG8gaW5jcmVtZW50IG92ZXIuIGlmIHJhbXAgaXMgMCwgdGhlIHZvbHVtZQorICogc2hvdWxkIGJlIHNldCBpbW1lZGlhdGVseS4gIEN1cnJlbnRseSByYW1wIHNob3VsZCBub3QgZXhjZWVkIDY1NTM1IChmcmFtZXMpLgorICogQHBhcmFtIHBJbnRTZXRWb2x1bWUgcG9pbnRlciB0byB0aGUgVTQuMTIgaW50ZWdlciB0YXJnZXQgdm9sdW1lLCBzZXQgb24gcmV0dXJuLgorICogQHBhcmFtIHBJbnRQcmV2Vm9sdW1lIHBvaW50ZXIgdG8gdGhlIFU0LjI4IGludGVnZXIgcHJldmlvdXMgdm9sdW1lLCBzZXQgb24gcmV0dXJuLgorICogQHBhcmFtIHBJbnRWb2x1bWVJbmMgcG9pbnRlciB0byB0aGUgVTQuMjggaW5jcmVtZW50IHBlciBvdXRwdXQgYXVkaW8gZnJhbWUsIHNldCBvbiByZXR1cm4uCisgKiBAcGFyYW0gcFNldFZvbHVtZSBwb2ludGVyIHRvIHRoZSBmbG9hdCB0YXJnZXQgdm9sdW1lLCBzZXQgb24gcmV0dXJuLgorICogQHBhcmFtIHBQcmV2Vm9sdW1lIHBvaW50ZXIgdG8gdGhlIGZsb2F0IHByZXZpb3VzIHZvbHVtZSwgc2V0IG9uIHJldHVybi4KKyAqIEBwYXJhbSBwVm9sdW1lSW5jIHBvaW50ZXIgdG8gdGhlIGZsb2F0IGluY3JlbWVudCBwZXIgb3V0cHV0IGF1ZGlvIGZyYW1lLCBzZXQgb24gcmV0dXJuLgorICogQHJldHVybiB0cnVlIGlmIHRoZSB2b2x1bWUgaGFzIGNoYW5nZWQsIGZhbHNlIGlmIHZvbHVtZSBpcyBzYW1lLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgc2V0Vm9sdW1lUmFtcFZhcmlhYmxlcyhmbG9hdCBuZXdWb2x1bWUsIGludDMyX3QgcmFtcCwKKyAgICAgICAgaW50MTZfdCAqcEludFNldFZvbHVtZSwgaW50MzJfdCAqcEludFByZXZWb2x1bWUsIGludDMyX3QgKnBJbnRWb2x1bWVJbmMsCisgICAgICAgIGZsb2F0ICpwU2V0Vm9sdW1lLCBmbG9hdCAqcFByZXZWb2x1bWUsIGZsb2F0ICpwVm9sdW1lSW5jKSB7CisgICAgaWYgKG5ld1ZvbHVtZSA9PSAqcFNldFZvbHVtZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8qIHNldCB0aGUgZmxvYXRpbmcgcG9pbnQgdm9sdW1lIHZhcmlhYmxlcyAqLworICAgIGlmIChyYW1wICE9IDApIHsKKyAgICAgICAgKnBWb2x1bWVJbmMgPSAobmV3Vm9sdW1lIC0gKnBTZXRWb2x1bWUpIC8gcmFtcDsKKyAgICAgICAgKnBQcmV2Vm9sdW1lID0gKnBTZXRWb2x1bWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBWb2x1bWVJbmMgPSAwOworICAgICAgICAqcFByZXZWb2x1bWUgPSBuZXdWb2x1bWU7CisgICAgfQorICAgICpwU2V0Vm9sdW1lID0gbmV3Vm9sdW1lOworCisgICAgLyogc2V0IHRoZSBsZWdhY3kgaW50ZWdlciB2b2x1bWUgdmFyaWFibGVzICovCisgICAgaW50MzJfdCBpbnRWb2x1bWUgPSBuZXdWb2x1bWUgKiBBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVDsKKyAgICBpZiAoaW50Vm9sdW1lID4gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQpIHsKKyAgICAgICAgaW50Vm9sdW1lID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQ7CisgICAgfSBlbHNlIGlmIChpbnRWb2x1bWUgPCAwKSB7CisgICAgICAgIEFMT0dFKCJuZWdhdGl2ZSB2b2x1bWUgJS43ZyIsIG5ld1ZvbHVtZSk7CisgICAgICAgIGludFZvbHVtZSA9IDA7IC8vIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBmb3Igc2FmZXR5IGNoZWNrLgorICAgIH0KKyAgICBpZiAoaW50Vm9sdW1lID09ICpwSW50U2V0Vm9sdW1lKSB7CisgICAgICAgICpwSW50Vm9sdW1lSW5jID0gMDsKKyAgICAgICAgLyogVE9ETzogaW50ZWdlci9mbG9hdCB3b3JrYXJvdW5kOiBpZ25vcmUgZmxvYXRpbmcgdm9sdW1lIHJhbXAgKi8KKyAgICAgICAgKnBWb2x1bWVJbmMgPSAwOworICAgICAgICAqcFByZXZWb2x1bWUgPSBuZXdWb2x1bWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAocmFtcCAhPSAwKSB7CisgICAgICAgICpwSW50Vm9sdW1lSW5jID0gKChpbnRWb2x1bWUgLSAqcEludFNldFZvbHVtZSkgPDwgMTYpIC8gcmFtcDsKKyAgICAgICAgKnBJbnRQcmV2Vm9sdW1lID0gKCpwSW50Vm9sdW1lSW5jID09IDAgPyBpbnRWb2x1bWUgOiAqcEludFNldFZvbHVtZSkgPDwgMTY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBJbnRWb2x1bWVJbmMgPSAwOworICAgICAgICAqcEludFByZXZWb2x1bWUgPSBpbnRWb2x1bWUgPDwgMTY7CisgICAgfQorICAgICpwSW50U2V0Vm9sdW1lID0gaW50Vm9sdW1lOworICAgIHJldHVybiB0cnVlOworfQorCiB2b2lkIEF1ZGlvTWl4ZXI6OnNldFBhcmFtZXRlcihpbnQgbmFtZSwgaW50IHRhcmdldCwgaW50IHBhcmFtLCB2b2lkICp2YWx1ZSkKIHsKICAgICBuYW1lIC09IFRSQUNLMDsKICAgICBBTE9HX0FTU0VSVCh1aW50MzJfdChuYW1lKSA8IE1BWF9OVU1fVFJBQ0tTLCAiYmFkIHRyYWNrIG5hbWUgJWQiLCBuYW1lKTsKICAgICB0cmFja190JiB0cmFjayA9IG1TdGF0ZS50cmFja3NbbmFtZV07CiAKLSAgICBpbnQgdmFsdWVJbnQgPSAoaW50KXZhbHVlOwotICAgIGludDMyX3QgKnZhbHVlQnVmID0gKGludDMyX3QgKil2YWx1ZTsKKyAgICBpbnQgdmFsdWVJbnQgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih2YWx1ZSkpOworICAgIGludDMyX3QgKnZhbHVlQnVmID0gcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4odmFsdWUpOwogCiAgICAgc3dpdGNoICh0YXJnZXQpIHsKIAogICAgIGNhc2UgVFJBQ0s6CiAgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKICAgICAgICAgY2FzZSBDSEFOTkVMX01BU0s6IHsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIHZhbHVlOwotICAgICAgICAgICAgaWYgKHRyYWNrLmNoYW5uZWxNYXNrICE9IG1hc2spIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChtYXNrKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVCgoY2hhbm5lbENvdW50IDw9IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCkgJiYgY2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgICAgICB0cmFjay5jaGFubmVsTWFzayA9IG1hc2s7Ci0gICAgICAgICAgICAgICAgdHJhY2suY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OwotICAgICAgICAgICAgICAgIC8vIHRoZSBtYXNrIGhhcyBjaGFuZ2VkLCBkb2VzIHRoaXMgdHJhY2sgbmVlZCBhIGRvd25taXhlcj8KLSAgICAgICAgICAgICAgICBpbml0VHJhY2tEb3dubWl4KCZtU3RhdGUudHJhY2tzW25hbWVdLCBuYW1lLCBtYXNrKTsKLSAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBDSEFOTkVMX01BU0ssICV4KSIsIG1hc2spOworICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2tDaGFubmVsTWFzaywgdHJhY2subU1peGVyQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9NQVNLLCAleCkiLCB0cmFja0NoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CkBAIC00NTUsMTUgKzgyMiwzNyBAQAogICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRk9STUFUOgotICAgICAgICAgICAgQUxPR19BU1NFUlQodmFsdWVJbnQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRk9STUFUOiB7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHRyYWNrLm1Gb3JtYXQgIT0gZm9ybWF0KSB7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLCAiSW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB0cmFjay5tRm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIEZPUk1BVCwgJSN4KSIsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgcHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJnRyYWNrLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIC8vIEZJWE1FIGRvIHdlIHdhbnQgdG8gc3VwcG9ydCBzZXR0aW5nIHRoZSBkb3dubWl4IHR5cGUgZnJvbSBBdWRpb0ZsaW5nZXI/CiAgICAgICAgIC8vICAgICAgICAgZm9yIGEgc3BlY2lmaWMgdHJhY2s/IG9yIHBlciBtaXhlcj8KICAgICAgICAgLyogY2FzZSBET1dOTUlYX1RZUEU6CiAgICAgICAgICAgICBicmVhayAgICAgICAgICAqLworICAgICAgICBjYXNlIE1JWEVSX0ZPUk1BVDogeworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmICh0cmFjay5tTWl4ZXJGb3JtYXQgIT0gZm9ybWF0KSB7CisgICAgICAgICAgICAgICAgdHJhY2subU1peGVyRm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1JWEVSX0ZPUk1BVCwgJSN4KSIsIGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIE1JWEVSX0NIQU5ORUxfTUFTSzogeworICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190Pih2YWx1ZUludCk7CisgICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrLmNoYW5uZWxNYXNrLCBtaXhlckNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1JWEVSX0NIQU5ORUxfTUFTSywgJSN4KSIsIG1peGVyQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19GQVRBTCgiYmFkIHBhcmFtIik7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgdHJhY2s6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIApAQCAtNDg4LDg1ICs4NzcsNzcgQEAKICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfRkFUQUwoImJhZCBwYXJhbSIpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyIHJlc2FtcGxlOiBiYWQgcGFyYW0gJWQiLCBwYXJhbSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFJBTVBfVk9MVU1FOgogICAgIGNhc2UgVk9MVU1FOgogICAgICAgICBzd2l0Y2ggKHBhcmFtKSB7Ci0gICAgICAgIGNhc2UgVk9MVU1FMDoKLSAgICAgICAgY2FzZSBWT0xVTUUxOgotICAgICAgICAgICAgaWYgKHRyYWNrLnZvbHVtZVtwYXJhbS1WT0xVTUUwXSAhPSB2YWx1ZUludCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVk9MVU1FLCBWT0xVTUUwLzE6ICUwNHgpIiwgdmFsdWVJbnQpOwotICAgICAgICAgICAgICAgIHRyYWNrLnByZXZWb2x1bWVbcGFyYW0tVk9MVU1FMF0gPSB0cmFjay52b2x1bWVbcGFyYW0tVk9MVU1FMF0gPDwgMTY7Ci0gICAgICAgICAgICAgICAgdHJhY2sudm9sdW1lW3BhcmFtLVZPTFVNRTBdID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBWT0xVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2sucHJldlZvbHVtZVtwYXJhbS1WT0xVTUUwXSA9IHZhbHVlSW50IDw8IDE2OwotICAgICAgICAgICAgICAgICAgICB0cmFjay52b2x1bWVJbmNbcGFyYW0tVk9MVU1FMF0gPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgZCA9ICh2YWx1ZUludDw8MTYpIC0gdHJhY2sucHJldlZvbHVtZVtwYXJhbS1WT0xVTUUwXTsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2b2xJbmMgPSBkIC8gaW50MzJfdChtU3RhdGUuZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLnZvbHVtZUluY1twYXJhbS1WT0xVTUUwXSA9IHZvbEluYzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZvbEluYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5wcmV2Vm9sdW1lW3BhcmFtLVZPTFVNRTBdID0gdmFsdWVJbnQgPDwgMTY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVVhMRVZFTDoKLSAgICAgICAgICAgIC8vQUxPR19BU1NFUlQoMCA8PSB2YWx1ZUludCAmJiB2YWx1ZUludCA8PSBNQVhfR0FJTl9JTlQsICJiYWQgYXV4IGxldmVsICVkIiwgdmFsdWVJbnQpOwotICAgICAgICAgICAgaWYgKHRyYWNrLmF1eExldmVsICE9IHZhbHVlSW50KSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihWT0xVTUUsIEFVWExFVkVMOiAlMDR4KSIsIHZhbHVlSW50KTsKLSAgICAgICAgICAgICAgICB0cmFjay5wcmV2QXV4TGV2ZWwgPSB0cmFjay5hdXhMZXZlbCA8PCAxNjsKLSAgICAgICAgICAgICAgICB0cmFjay5hdXhMZXZlbCA9IHZhbHVlSW50OwotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gVk9MVU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZBdXhMZXZlbCA9IHZhbHVlSW50IDw8IDE2OwotICAgICAgICAgICAgICAgICAgICB0cmFjay5hdXhJbmMgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgZCA9ICh2YWx1ZUludDw8MTYpIC0gdHJhY2sucHJldkF1eExldmVsOwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZvbEluYyA9IGQgLyBpbnQzMl90KG1TdGF0ZS5mcmFtZUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2suYXV4SW5jID0gdm9sSW5jOwotICAgICAgICAgICAgICAgICAgICBpZiAodm9sSW5jID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZBdXhMZXZlbCA9IHZhbHVlSW50IDw8IDE2OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldFZvbHVtZVJhbXBWYXJpYWJsZXMoKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPih2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBSQU1QX1ZPTFVNRSA/IG1TdGF0ZS5mcmFtZUNvdW50IDogMCwKKyAgICAgICAgICAgICAgICAgICAgJnRyYWNrLmF1eExldmVsLCAmdHJhY2sucHJldkF1eExldmVsLCAmdHJhY2suYXV4SW5jLAorICAgICAgICAgICAgICAgICAgICAmdHJhY2subUF1eExldmVsLCAmdHJhY2subVByZXZBdXhMZXZlbCwgJnRyYWNrLm1BdXhJbmMpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlciglcywgQVVYTEVWRUw6ICUwNHgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBWT0xVTUUgPyAiVk9MVU1FIiA6ICJSQU1QX1ZPTFVNRSIsIHRyYWNrLmF1eExldmVsKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0ZBVEFMKCJiYWQgcGFyYW0iKTsKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpcGFyYW0gPj0gVk9MVU1FMCAmJiAodW5zaWduZWQpcGFyYW0gPCBWT0xVTUUwICsgTUFYX05VTV9WT0xVTUVTKSB7CisgICAgICAgICAgICAgICAgaWYgKHNldFZvbHVtZVJhbXBWYXJpYWJsZXMoKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPih2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPT0gUkFNUF9WT0xVTUUgPyBtU3RhdGUuZnJhbWVDb3VudCA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2sudm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0sICZ0cmFjay5wcmV2Vm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2sudm9sdW1lSW5jW3BhcmFtIC0gVk9MVU1FMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2subVZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLCAmdHJhY2subVByZXZWb2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay5tVm9sdW1lSW5jW3BhcmFtIC0gVk9MVU1FMF0pKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoJXMsIFZPTFVNRSVkOiAlMDR4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID09IFZPTFVNRSA/ICJWT0xVTUUiIDogIlJBTVBfVk9MVU1FIiwgcGFyYW0gLSBWT0xVTUUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sudm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0pOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciB2b2x1bWU6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19GQVRBTCgiYmFkIHRhcmdldCIpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXI6IGJhZCB0YXJnZXQgJWQiLCB0YXJnZXQpOwogICAgIH0KIH0KIAotYm9vbCBBdWRpb01peGVyOjp0cmFja190OjpzZXRSZXNhbXBsZXIodWludDMyX3QgdmFsdWUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpCitib29sIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnNldFJlc2FtcGxlcih1aW50MzJfdCB0cmFja1NhbXBsZVJhdGUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpCiB7Ci0gICAgaWYgKHZhbHVlICE9IGRldlNhbXBsZVJhdGUgfHwgcmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHNhbXBsZVJhdGUgPSB2YWx1ZTsKKyAgICBpZiAodHJhY2tTYW1wbGVSYXRlICE9IGRldlNhbXBsZVJhdGUgfHwgcmVzYW1wbGVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gdHJhY2tTYW1wbGVSYXRlKSB7CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gdHJhY2tTYW1wbGVSYXRlOwogICAgICAgICAgICAgaWYgKHJlc2FtcGxlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0aW5nIHJlc2FtcGxlciBmcm9tIHRyYWNrICVkIEh6IHRvIGRldmljZSAlZCBIeiIsIHZhbHVlLCBkZXZTYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ3JlYXRpbmcgcmVzYW1wbGVyIGZyb20gdHJhY2sgJWQgSHogdG8gZGV2aWNlICVkIEh6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrU2FtcGxlUmF0ZSwgZGV2U2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAgICAgQXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdHk7CiAgICAgICAgICAgICAgICAgLy8gZm9yY2UgbG93ZXN0IHF1YWxpdHkgbGV2ZWwgcmVzYW1wbGVyIGlmIHVzZSBjYXNlIGlzbid0IG11c2ljIG9yIHZpZGVvCiAgICAgICAgICAgICAgICAgLy8gRklYTUUgdGhpcyBpcyBmbGF3ZWQgZm9yIGR5bmFtaWMgc2FtcGxlIHJhdGVzLCBhcyB3ZSBjaG9vc2UgdGhlIHJlc2FtcGxlcgogICAgICAgICAgICAgICAgIC8vIHF1YWxpdHkgbGV2ZWwgYmFzZWQgb24gdGhlIGluaXRpYWwgcmF0aW8sIGJ1dCB0aGF0IGNvdWxkIGNoYW5nZSBsYXRlci4KICAgICAgICAgICAgICAgICAvLyBTaG91bGQgaGF2ZSBhIHdheSB0byBkaXN0aW5ndWlzaCB0cmFja3Mgd2l0aCBzdGF0aWMgcmF0aW9zIHZzLiBkeW5hbWljIHJhdGlvcy4KLSAgICAgICAgICAgICAgICBpZiAoISgodmFsdWUgPT0gNDQxMDAgJiYgZGV2U2FtcGxlUmF0ZSA9PSA0ODAwMCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT0gNDgwMDAgJiYgZGV2U2FtcGxlUmF0ZSA9PSA0NDEwMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6TE9XX1FVQUxJVFk7CisgICAgICAgICAgICAgICAgaWYgKCEoKHRyYWNrU2FtcGxlUmF0ZSA9PSA0NDEwMCAmJiBkZXZTYW1wbGVSYXRlID09IDQ4MDAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICh0cmFja1NhbXBsZVJhdGUgPT0gNDgwMDAgJiYgZGV2U2FtcGxlUmF0ZSA9PSA0NDEwMCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6REVGQVVMVF9RVUFMSVRZOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBNT05PX0hBQ0suIFJlc2FtcGxlciBzZWVzICNjaGFubmVscyBhZnRlciB0aGUgZG93bm1peGVyCisgICAgICAgICAgICAgICAgLy8gYnV0IGlmIG5vbmUgZXhpc3RzLCBpdCBpcyB0aGUgY2hhbm5lbCBjb3VudCAoMSBmb3IgbW9ubykuCisgICAgICAgICAgICAgICAgY29uc3QgaW50IHJlc2FtcGxlckNoYW5uZWxDb3VudCA9IGRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbU1peGVyQ2hhbm5lbENvdW50IDogY2hhbm5lbENvdW50OworICAgICAgICAgICAgICAgIEFMT0dWVigiQ3JlYXRpbmcgcmVzYW1wbGVyOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZm9ybWF0KCUjeCkgY2hhbm5lbHMoJWQpIGRldlNhbXBsZVJhdGUoJXUpIHF1YWxpdHkoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVySW5Gb3JtYXQsIHJlc2FtcGxlckNoYW5uZWxDb3VudCwgZGV2U2FtcGxlUmF0ZSwgcXVhbGl0eSk7CiAgICAgICAgICAgICAgICAgcmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXNhbXBsZXIgc2VlcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGFmdGVyIHRoZSBkb3dubWl4ZXIsIGlmIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCA/IE1BWF9OVU1fQ0hBTk5FTFMgOiBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJJbkZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc2FtcGxlckNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgIGRldlNhbXBsZVJhdGUsIHF1YWxpdHkpOwogICAgICAgICAgICAgICAgIHJlc2FtcGxlci0+c2V0TG9jYWxUaW1lRnJlcShzTG9jYWxUaW1lRnJlcSk7CiAgICAgICAgICAgICB9CkBAIC01NzYsMjEgKzk1Nyw1NyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotaW5saW5lCi12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OmFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgpCisvKiBDaGVja3MgdG8gc2VlIGlmIHRoZSB2b2x1bWUgcmFtcCBoYXMgY29tcGxldGVkIGFuZCBjbGVhcnMgdGhlIGluY3JlbWVudAorICogdmFyaWFibGVzIGFwcHJvcHJpYXRlbHkuCisgKgorICogRklYTUU6IFRoZXJlIGlzIGNvZGUgdG8gaGFuZGxlIGludC9mbG9hdCByYW1wIHZhcmlhYmxlIHN3aXRjaG92ZXIgc2hvdWxkIGl0IG5vdAorICogY29tcGxldGUgd2l0aGluIGEgbWl4ZXIgYnVmZmVyIHByb2Nlc3NpbmcgY2FsbCwgYnV0IGl0IGlzIHByZWZlcnJlZCB0byBhdm9pZCBzd2l0Y2hvdmVyCisgKiBkdWUgdG8gcHJlY2lzaW9uIGlzc3Vlcy4gIFRoZSBzd2l0Y2hvdmVyIGNvZGUgaXMgaW5jbHVkZWQgZm9yIGxlZ2FjeSBjb2RlIHB1cnBvc2VzCisgKiBhbmQgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgaW50ZWdlciB2b2x1bWUgaXMgcmVtb3ZlZC4KKyAqCisgKiBJdCBpcyBub3Qgc3VmZmljaWVudCB0byBjbGVhciBvbmx5IHRoZSB2b2x1bWVJbmMgaW50ZWdlciB2YXJpYWJsZSBiZWNhdXNlCisgKiBpZiBvbmUgY2hhbm5lbCByZXF1aXJlcyByYW1waW5nLCBhbGwgY2hhbm5lbHMgYXJlIHJhbXBlZC4KKyAqCisgKiBUaGVyZSBpcyBhIGJpdCBvZiBkdXBsaWNhdGVkIGNvZGUgaGVyZSwgYnV0IGl0IGtlZXBzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKi8KK2lubGluZSB2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OmFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgsIGJvb2wgdXNlRmxvYXQpCiB7Ci0gICAgZm9yICh1aW50MzJfdCBpPTAgOyBpPE1BWF9OVU1fQ0hBTk5FTFMgOyBpKyspIHsKLSAgICAgICAgaWYgKCgodm9sdW1lSW5jW2ldPjApICYmICgoKHByZXZWb2x1bWVbaV0rdm9sdW1lSW5jW2ldKT4+MTYpID49IHZvbHVtZVtpXSkpIHx8Ci0gICAgICAgICAgICAoKHZvbHVtZUluY1tpXTwwKSAmJiAoKChwcmV2Vm9sdW1lW2ldK3ZvbHVtZUluY1tpXSk+PjE2KSA8PSB2b2x1bWVbaV0pKSkgewotICAgICAgICAgICAgdm9sdW1lSW5jW2ldID0gMDsKLSAgICAgICAgICAgIHByZXZWb2x1bWVbaV0gPSB2b2x1bWVbaV08PDE2OworICAgIGlmICh1c2VGbG9hdCkgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgTUFYX05VTV9WT0xVTUVTOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtVm9sdW1lSW5jW2ldICE9IDAgJiYgZmFicyhtVm9sdW1lW2ldIC0gbVByZXZWb2x1bWVbaV0pIDw9IGZhYnMobVZvbHVtZUluY1tpXSkpIHsKKyAgICAgICAgICAgICAgICB2b2x1bWVJbmNbaV0gPSAwOworICAgICAgICAgICAgICAgIHByZXZWb2x1bWVbaV0gPSB2b2x1bWVbaV0gPDwgMTY7CisgICAgICAgICAgICAgICAgbVZvbHVtZUluY1tpXSA9IDAuOworICAgICAgICAgICAgICAgIG1QcmV2Vm9sdW1lW2ldID0gbVZvbHVtZVtpXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigicmFtcDogJWYgJWYgJWYiLCBtVm9sdW1lW2ldLCBtUHJldlZvbHVtZVtpXSwgbVZvbHVtZUluY1tpXSk7CisgICAgICAgICAgICAgICAgcHJldlZvbHVtZVtpXSA9IHU0XzI4X2Zyb21fZmxvYXQobVByZXZWb2x1bWVbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IE1BWF9OVU1fVk9MVU1FUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKCh2b2x1bWVJbmNbaV0+MCkgJiYgKCgocHJldlZvbHVtZVtpXSt2b2x1bWVJbmNbaV0pPj4xNikgPj0gdm9sdW1lW2ldKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKCh2b2x1bWVJbmNbaV08MCkgJiYgKCgocHJldlZvbHVtZVtpXSt2b2x1bWVJbmNbaV0pPj4xNikgPD0gdm9sdW1lW2ldKSkpIHsKKyAgICAgICAgICAgICAgICB2b2x1bWVJbmNbaV0gPSAwOworICAgICAgICAgICAgICAgIHByZXZWb2x1bWVbaV0gPSB2b2x1bWVbaV0gPDwgMTY7CisgICAgICAgICAgICAgICAgbVZvbHVtZUluY1tpXSA9IDAuOworICAgICAgICAgICAgICAgIG1QcmV2Vm9sdW1lW2ldID0gbVZvbHVtZVtpXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigicmFtcDogJWQgJWQgJWQiLCB2b2x1bWVbaV0gPDwgMTYsIHByZXZWb2x1bWVbaV0sIHZvbHVtZUluY1tpXSk7CisgICAgICAgICAgICAgICAgbVByZXZWb2x1bWVbaV0gID0gZmxvYXRfZnJvbV91NF8yOChwcmV2Vm9sdW1lW2ldKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKyAgICAvKiBUT0RPOiBhdXggaXMgYWx3YXlzIGludGVnZXIgcmVnYXJkbGVzcyBvZiBvdXRwdXQgYnVmZmVyIHR5cGUgKi8KICAgICBpZiAoYXV4KSB7CiAgICAgICAgIGlmICgoKGF1eEluYz4wKSAmJiAoKChwcmV2QXV4TGV2ZWwrYXV4SW5jKT4+MTYpID49IGF1eExldmVsKSkgfHwKLSAgICAgICAgICAgICgoYXV4SW5jPDApICYmICgoKHByZXZBdXhMZXZlbCthdXhJbmMpPj4xNikgPD0gYXV4TGV2ZWwpKSkgeworICAgICAgICAgICAgICAgICgoYXV4SW5jPDApICYmICgoKHByZXZBdXhMZXZlbCthdXhJbmMpPj4xNikgPD0gYXV4TGV2ZWwpKSkgewogICAgICAgICAgICAgYXV4SW5jID0gMDsKLSAgICAgICAgICAgIHByZXZBdXhMZXZlbCA9IGF1eExldmVsPDwxNjsKKyAgICAgICAgICAgIHByZXZBdXhMZXZlbCA9IGF1eExldmVsIDw8IDE2OworICAgICAgICAgICAgbUF1eEluYyA9IDAuOworICAgICAgICAgICAgbVByZXZBdXhMZXZlbCA9IG1BdXhMZXZlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vQUxPR1YoImF1eCByYW1wOiAlZCAlZCAlZCIsIGF1eExldmVsIDw8IDE2LCBwcmV2QXV4TGV2ZWwsIGF1eEluYyk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC02MDksMjEgKzEwMjYsMTYgQEAKICAgICBuYW1lIC09IFRSQUNLMDsKICAgICBBTE9HX0FTU0VSVCh1aW50MzJfdChuYW1lKSA8IE1BWF9OVU1fVFJBQ0tTLCAiYmFkIHRyYWNrIG5hbWUgJWQiLCBuYW1lKTsKIAotICAgIGlmIChtU3RhdGUudHJhY2tzW25hbWVdLmRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgLy8gdXBkYXRlIHJlcXVpcmVkPwotICAgICAgICBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5kb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+bVRyYWNrQnVmZmVyUHJvdmlkZXIgIT0gYnVmZmVyUHJvdmlkZXIpIHsKLSAgICAgICAgICAgIEFMT0dWKCJBdWRpb01peGVyOjpzZXRCdWZmZXJQcm92aWRlciglcCkgZm9yIGRvd25taXgiLCBidWZmZXJQcm92aWRlcik7Ci0gICAgICAgICAgICAvLyBzZXR0aW5nIHRoZSBidWZmZXIgcHJvdmlkZXIgZm9yIGEgdHJhY2sgdGhhdCBnZXRzIGRvd25taXhlZCBjb25zaXN0cyBpbjoKLSAgICAgICAgICAgIC8vICAxLyBzZXR0aW5nIHRoZSBidWZmZXIgcHJvdmlkZXIgdG8gdGhlICJkb3dubWl4IC8gYnVmZmVyIHByb3ZpZGVyIiB3cmFwcGVyCi0gICAgICAgICAgICAvLyAgICAgc28gaXQncyB0aGUgb25lIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgYnVmZmVyIHByb3ZpZGVyIGlzIG5lZWRlZCwKLSAgICAgICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0uYnVmZmVyUHJvdmlkZXIgPSBtU3RhdGUudHJhY2tzW25hbWVdLmRvd25taXhlckJ1ZmZlclByb3ZpZGVyOwotICAgICAgICAgICAgLy8gIDIvIHNhdmluZyB0aGUgYnVmZmVyIHByb3ZpZGVyIGZvciB0aGUgdHJhY2sgc28gdGhlIHdyYXBwZXIgY2FuIHVzZSBpdAotICAgICAgICAgICAgLy8gICAgIHdoZW4gaXQgZG93bm1peGVzLgotICAgICAgICAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5kb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+bVRyYWNrQnVmZmVyUHJvdmlkZXIgPSBidWZmZXJQcm92aWRlcjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0uYnVmZmVyUHJvdmlkZXIgPSBidWZmZXJQcm92aWRlcjsKKyAgICBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5tSW5wdXRCdWZmZXJQcm92aWRlciA9PSBidWZmZXJQcm92aWRlcikgeworICAgICAgICByZXR1cm47IC8vIGRvbid0IHJlc2V0IGFueSBidWZmZXIgcHJvdmlkZXJzIGlmIGlkZW50aWNhbC4KICAgICB9CisgICAgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0ubVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgICAgICBtU3RhdGUudHJhY2tzW25hbWVdLm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CisgICAgfQorCisgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5tSW5wdXRCdWZmZXJQcm92aWRlciA9IGJ1ZmZlclByb3ZpZGVyOworICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCZtU3RhdGUudHJhY2tzW25hbWVdKTsKIH0KIAogCkBAIC02NTYsNiArMTA2OCw5IEBACiAKICAgICAvLyBjb21wdXRlIGV2ZXJ5dGhpbmcgd2UgbmVlZC4uLgogICAgIGludCBjb3VudEFjdGl2ZVRyYWNrcyA9IDA7CisgICAgLy8gVE9ETzogZml4IGFsbDE2Qml0c1N0ZXJlTm9SZXNhbXBsZSBsb2dpYyB0bworICAgIC8vIGVpdGhlciBwcm9wZXJseSBoYW5kbGUgbXV0ZWQgdHJhY2tzIChpdCBzaG91bGQgaWdub3JlIHRoZW0pCisgICAgLy8gb3IgcmVtb3ZlIGFsdG9nZXRoZXIgYXMgYW4gb2Jzb2xldGUgb3B0aW1pemF0aW9uLgogICAgIGJvb2wgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IHRydWU7CiAgICAgYm9vbCByZXNhbXBsaW5nID0gZmFsc2U7CiAgICAgYm9vbCB2b2x1bWVSYW1wID0gZmFsc2U7CkBAIC02NjcsMzkgKzEwODIsNDcgQEAKICAgICAgICAgY291bnRBY3RpdmVUcmFja3MrKzsKICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CiAgICAgICAgIHVpbnQzMl90IG4gPSAwOworICAgICAgICAvLyBGSVhNRSBjYW4gb3ZlcmZsb3cgKG1hc2sgaXMgb25seSAzIGJpdHMpCiAgICAgICAgIG4gfD0gTkVFRFNfQ0hBTk5FTF8xICsgdC5jaGFubmVsQ291bnQgLSAxOwotICAgICAgICBuIHw9IE5FRURTX0ZPUk1BVF8xNjsKLSAgICAgICAgbiB8PSB0LmRvZXNSZXNhbXBsZSgpID8gTkVFRFNfUkVTQU1QTEVfRU5BQkxFRCA6IE5FRURTX1JFU0FNUExFX0RJU0FCTEVEOworICAgICAgICBpZiAodC5kb2VzUmVzYW1wbGUoKSkgeworICAgICAgICAgICAgbiB8PSBORUVEU19SRVNBTVBMRTsKKyAgICAgICAgfQogICAgICAgICBpZiAodC5hdXhMZXZlbCAhPSAwICYmIHQuYXV4QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG4gfD0gTkVFRFNfQVVYX0VOQUJMRUQ7CisgICAgICAgICAgICBuIHw9IE5FRURTX0FVWDsKICAgICAgICAgfQogCiAgICAgICAgIGlmICh0LnZvbHVtZUluY1swXXx0LnZvbHVtZUluY1sxXSkgewogICAgICAgICAgICAgdm9sdW1lUmFtcCA9IHRydWU7CiAgICAgICAgIH0gZWxzZSBpZiAoIXQuZG9lc1Jlc2FtcGxlKCkgJiYgdC52b2x1bWVSTCA9PSAwKSB7Ci0gICAgICAgICAgICBuIHw9IE5FRURTX01VVEVfRU5BQkxFRDsKKyAgICAgICAgICAgIG4gfD0gTkVFRFNfTVVURTsKICAgICAgICAgfQogICAgICAgICB0Lm5lZWRzID0gbjsKIAotICAgICAgICBpZiAoKG4gJiBORUVEU19NVVRFX19NQVNLKSA9PSBORUVEU19NVVRFX0VOQUJMRUQpIHsKKyAgICAgICAgaWYgKG4gJiBORUVEU19NVVRFKSB7CiAgICAgICAgICAgICB0Lmhvb2sgPSB0cmFja19fbm9wOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKChuICYgTkVFRFNfQVVYX19NQVNLKSA9PSBORUVEU19BVVhfRU5BQkxFRCkgeworICAgICAgICAgICAgaWYgKG4gJiBORUVEU19BVVgpIHsKICAgICAgICAgICAgICAgICBhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlID0gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG4gJiBORUVEU19SRVNBTVBMRV9fTUFTSykgPT0gTkVFRFNfUkVTQU1QTEVfRU5BQkxFRCkgeworICAgICAgICAgICAgaWYgKG4gJiBORUVEU19SRVNBTVBMRSkgewogICAgICAgICAgICAgICAgIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICByZXNhbXBsaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0Lmhvb2sgPSB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlOworICAgICAgICAgICAgICAgIHQuaG9vayA9IGdldFRyYWNrSG9vayhUUkFDS1RZUEVfUkVTQU1QTEUsIHQubU1peGVyQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJJbkZvcm1hdCwgdC5tTWl4ZXJGb3JtYXQpOwogICAgICAgICAgICAgICAgIEFMT0dWX0lGKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPiBORUVEU19DSEFOTkVMXzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2sgJWQgbmVlZHMgZG93bm1peCArIHJlc2FtcGxlIiwgaSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICgobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID09IE5FRURTX0NIQU5ORUxfMSl7Ci0gICAgICAgICAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX18xNkJpdHNNb25vOworICAgICAgICAgICAgICAgICAgICB0Lmhvb2sgPSBnZXRUcmFja0hvb2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJDaGFubmVsQ291bnQgPT0gMiAvLyBUT0RPOiBNT05PX0hBQ0suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVFJBQ0tUWVBFX05PUkVTQU1QTEVNT05PIDogVFJBQ0tUWVBFX05PUkVTQU1QTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJJbkZvcm1hdCwgdC5tTWl4ZXJGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICBhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICgobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID49IE5FRURTX0NIQU5ORUxfMil7Ci0gICAgICAgICAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX18xNkJpdHNTdGVyZW87CisgICAgICAgICAgICAgICAgICAgIHQuaG9vayA9IGdldFRyYWNrSG9vayhUUkFDS1RZUEVfTk9SRVNBTVBMRSwgdC5tTWl4ZXJDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJJbkZvcm1hdCwgdC5tTWl4ZXJGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVl9JRigobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID4gTkVFRFNfQ0hBTk5FTF8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFjayAlZCBuZWVkcyBkb3dubWl4IiwgaSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNzA5LDcgKzExMzIsNyBAQAogCiAgICAgLy8gc2VsZWN0IHRoZSBwcm9jZXNzaW5nIGhvb2tzCiAgICAgc3RhdGUtPmhvb2sgPSBwcm9jZXNzX19ub3A7Ci0gICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzKSB7CisgICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzID4gMCkgewogICAgICAgICBpZiAocmVzYW1wbGluZykgewogICAgICAgICAgICAgaWYgKCFzdGF0ZS0+b3V0cHV0VGVtcCkgewogICAgICAgICAgICAgICAgIHN0YXRlLT5vdXRwdXRUZW1wID0gbmV3IGludDMyX3RbTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50XTsKQEAgLTczMCw3ICsxMTUzLDE3IEBACiAgICAgICAgICAgICBzdGF0ZS0+aG9vayA9IHByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmc7CiAgICAgICAgICAgICBpZiAoYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSAmJiAhdm9sdW1lUmFtcCkgewogICAgICAgICAgICAgICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHN0YXRlLT5lbmFibGVkVHJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodC5uZWVkcyAmIE5FRURTX01VVEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjaGVjayBwcmV2ZW50cyBhIG11dGVkIHRyYWNrIGZyb20gYWNxdWlyaW5nIGEgcHJvY2VzcyBob29rLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZGFuZ2Vyb3VzIGlmIHRoZSB0cmFjayBpcyBNT05PIGFzIHRoYXQgcmVxdWlyZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBoYW5kbGluZyBkdWUgdG8gaW1wbGljaXQgY2hhbm5lbCBkdXBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXJlbyBvciBNdWx0aWNoYW5uZWwgc2hvdWxkIGFjdHVhbGx5IGJlIGZpbmUgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5ob29rID0gZ2V0UHJvY2Vzc0hvb2soUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckNoYW5uZWxDb3VudCwgdC5tTWl4ZXJJbkZvcm1hdCwgdC5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03NDUsMTYgKzExNzgsMTUgQEAKIAogICAgIC8vIE5vdyB0aGF0IHRoZSB2b2x1bWUgcmFtcCBoYXMgYmVlbiBkb25lLCBzZXQgb3B0aW1hbCBzdGF0ZSBhbmQKICAgICAvLyB0cmFjayBob29rcyBmb3Igc3Vic2VxdWVudCBtaXhlciBwcm9jZXNzCi0gICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzKSB7CisgICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzID4gMCkgewogICAgICAgICBib29sIGFsbE11dGVkID0gdHJ1ZTsKICAgICAgICAgdWludDMyX3QgZW4gPSBzdGF0ZS0+ZW5hYmxlZFRyYWNrczsKICAgICAgICAgd2hpbGUgKGVuKSB7CiAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2Nseihlbik7CiAgICAgICAgICAgICBlbiAmPSB+KDE8PGkpOwogICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgICAgICAgICBpZiAoIXQuZG9lc1Jlc2FtcGxlKCkgJiYgdC52b2x1bWVSTCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHQubmVlZHMgfD0gTkVFRFNfTVVURV9FTkFCTEVEOworICAgICAgICAgICAgaWYgKCF0LmRvZXNSZXNhbXBsZSgpICYmIHQudm9sdW1lUkwgPT0gMCkgeworICAgICAgICAgICAgICAgIHQubmVlZHMgfD0gTkVFRFNfTVVURTsKICAgICAgICAgICAgICAgICB0Lmhvb2sgPSB0cmFja19fbm9wOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhbGxNdXRlZCA9IGZhbHNlOwpAQCAtNzY0LDcgKzExOTYsMTEgQEAKICAgICAgICAgICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fbm9wOwogICAgICAgICB9IGVsc2UgaWYgKGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUpIHsKICAgICAgICAgICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPmhvb2sgPSBwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZzsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihzdGF0ZS0+ZW5hYmxlZFRyYWNrcyk7CisgICAgICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CisgICAgICAgICAgICAgICAgLy8gTXV0ZWQgc2luZ2xlIHRyYWNrcyBoYW5kbGVkIGJ5IGFsbE11dGVkIGFib3ZlLgorICAgICAgICAgICAgICAgIHN0YXRlLT5ob29rID0gZ2V0UHJvY2Vzc0hvb2soUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJDaGFubmVsQ291bnQsIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTc3NCwxNSArMTIxMCwxNSBAQAogdm9pZCBBdWRpb01peGVyOjp0cmFja19fZ2VuZXJpY1Jlc2FtcGxlKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKIHsKKyAgICBBTE9HVlYoInRyYWNrX19nZW5lcmljUmVzYW1wbGVcbiIpOwogICAgIHQtPnJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSh0LT5zYW1wbGVSYXRlKTsKIAogICAgIC8vIHJhbXAgZ2FpbiAtIHJlc2FtcGxlIHRvIHRlbXAgYnVmZmVyIGFuZCBzY2FsZS9taXggaW4gMm5kIHN0ZXAKICAgICBpZiAoYXV4ICE9IE5VTEwpIHsKICAgICAgICAgLy8gYWx3YXlzIHJlc2FtcGxlIHdpdGggdW5pdHkgZ2FpbiB3aGVuIHNlbmRpbmcgdG8gYXV4aWxpYXJ5IGJ1ZmZlciB0byBiZSBhYmxlCiAgICAgICAgIC8vIHRvIGFwcGx5IHNlbmQgbGV2ZWwgYWZ0ZXIgcmVzYW1wbGluZwotICAgICAgICAvLyBUT0RPOiBtb2RpZnkgZWFjaCByZXNhbXBsZXIgdG8gc3VwcG9ydCBhdXggY2hhbm5lbD8KLSAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTiwgVU5JVFlfR0FJTik7Ci0gICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogTUFYX05VTV9DSEFOTkVMUyAqIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU5fRkxPQVQsIFVOSVRZX0dBSU5fRkxPQVQpOworICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIHQtPm1NaXhlckNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQzMl90KSk7CiAgICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUodGVtcCwgb3V0RnJhbWVDb3VudCwgdC0+YnVmZmVyUHJvdmlkZXIpOwogICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC0+dm9sdW1lSW5jWzBdfHQtPnZvbHVtZUluY1sxXXx0LT5hdXhJbmMpKSB7CiAgICAgICAgICAgICB2b2x1bWVSYW1wU3RlcmVvKHQsIG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4KTsKQEAgLTc5MSw3ICsxMjI3LDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdKSkgewotICAgICAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTiwgVU5JVFlfR0FJTik7CisgICAgICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOX0ZMT0FULCBVTklUWV9HQUlOX0ZMT0FUKTsKICAgICAgICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogTUFYX05VTV9DSEFOTkVMUyAqIHNpemVvZihpbnQzMl90KSk7CiAgICAgICAgICAgICB0LT5yZXNhbXBsZXItPnJlc2FtcGxlKHRlbXAsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgICAgIHZvbHVtZVJhbXBTdGVyZW8odCwgb3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgpOwpAQCAtNzk5LDE0ICsxMjM1LDE0IEBACiAKICAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKHQtPnZvbHVtZVswXSwgdC0+dm9sdW1lWzFdKTsKKyAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKHQtPm1Wb2x1bWVbMF0sIHQtPm1Wb2x1bWVbMV0pOwogICAgICAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZShvdXQsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBBdWRpb01peGVyOjp0cmFja19fbm9wKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsCi0gICAgICAgIGludDMyX3QqIGF1eCkKK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX25vcCh0cmFja190KiB0IF9fdW51c2VkLCBpbnQzMl90KiBvdXQgX191bnVzZWQsCisgICAgICAgIHNpemVfdCBvdXRGcmFtZUNvdW50IF9fdW51c2VkLCBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXggX191bnVzZWQpCiB7CiB9CiAKQEAgLTg4Miw5ICsxMzE4LDEwIEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX18xNkJpdHNTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwKLSAgICAgICAgaW50MzJfdCogYXV4KQordm9pZCBBdWRpb01peGVyOjp0cmFja19fMTZCaXRzU3RlcmVvKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGludDMyX3QqIHRlbXAgX191bnVzZWQsIGludDMyX3QqIGF1eCkKIHsKKyAgICBBTE9HVlYoInRyYWNrX18xNkJpdHNTdGVyZW9cbiIpOwogICAgIGNvbnN0IGludDE2X3QgKmluID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MTZfdCAqPih0LT5pbik7CiAKICAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7CkBAIC05NzMsOSArMTQxMCwxMCBAQAogICAgIHQtPmluID0gaW47CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfXzE2Qml0c01vbm8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwKLSAgICAgICAgaW50MzJfdCogYXV4KQordm9pZCBBdWRpb01peGVyOjp0cmFja19fMTZCaXRzTW9ubyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXgpCiB7CisgICAgQUxPR1ZWKCJ0cmFja19fMTZCaXRzTW9ub1xuIik7CiAgICAgY29uc3QgaW50MTZfdCAqaW4gPSBzdGF0aWNfY2FzdDxpbnQxNl90IGNvbnN0ICo+KHQtPmluKTsKIAogICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKQEAgLTEwNjMsOCArMTUwMSw4IEBACiAvLyBuby1vcCBjYXNlCiB2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX25vcChzdGF0ZV90KiBzdGF0ZSwgaW50NjRfdCBwdHMpCiB7CisgICAgQUxPR1ZWKCJwcm9jZXNzX19ub3BcbiIpOwogICAgIHVpbnQzMl90IGUwID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7Ci0gICAgc2l6ZV90IGJ1ZlNpemUgPSBzdGF0ZS0+ZnJhbWVDb3VudCAqIHNpemVvZihpbnQxNl90KSAqIE1BWF9OVU1fQ0hBTk5FTFM7CiAgICAgd2hpbGUgKGUwKSB7CiAgICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgYnVmZmVyIHRvCiAgICAgICAgIC8vIGF2b2lkIG11bHRpcGxlIG1lbXNldCgpIG9uIHNhbWUgYnVmZmVyCkBAIC0xMDgzLDcgKzE1MjEsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZTAgJj0gfihlMSk7CiAKLSAgICAgICAgICAgIG1lbXNldCh0MS5tYWluQnVmZmVyLCAwLCBidWZTaXplKTsKKyAgICAgICAgICAgIG1lbXNldCh0MS5tYWluQnVmZmVyLCAwLCBzdGF0ZS0+ZnJhbWVDb3VudCAqIHQxLm1NaXhlckNoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodDEubU1peGVyRm9ybWF0KSk7CiAgICAgICAgIH0KIAogICAgICAgICB3aGlsZSAoZTEpIHsKQEAgLTExMDksNiArMTU0OCw3IEBACiAvLyBnZW5lcmljIGNvZGUgd2l0aG91dCByZXNhbXBsaW5nCiB2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKQogeworICAgIEFMT0dWVigicHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZ1xuIik7CiAgICAgaW50MzJfdCBvdXRUZW1wW0JMT0NLU0laRSAqIE1BWF9OVU1fQ0hBTk5FTFNdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CiAKICAgICAvLyBhY3F1aXJlIGVhY2ggdHJhY2sncyBidWZmZXIKQEAgLTExNTMsNyArMTU5Myw3IEBACiAgICAgICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CiAgICAgICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IEJMT0NLU0laRTsKICAgICAgICAgICAgICAgICBpbnQzMl90ICphdXggPSBOVUxMOwotICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSgodC5uZWVkcyAmIE5FRURTX0FVWF9fTUFTSykgPT0gTkVFRFNfQVVYX0VOQUJMRUQpKSB7CisgICAgICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHQubmVlZHMgJiBORUVEU19BVVgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGF1eCA9IHQuYXV4QnVmZmVyICsgbnVtRnJhbWVzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzKSB7CkBAIC0xMTY1LDkgKzE2MDUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluRnJhbWVzID0gKHQuZnJhbWVDb3VudCA+IG91dEZyYW1lcyk/b3V0RnJhbWVzOnQuZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluRnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0Lmhvb2soJnQsIG91dFRlbXAgKyAoQkxPQ0tTSVpFLW91dEZyYW1lcykqTUFYX05VTV9DSEFOTkVMUywgaW5GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5yZXNhbXBsZVRlbXAsIGF1eCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbkZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQuaG9vaygmdCwgb3V0VGVtcCArIChCTE9DS1NJWkUgLSBvdXRGcmFtZXMpICogdC5tTWl4ZXJDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRnJhbWVzLCBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgdC5mcmFtZUNvdW50IC09IGluRnJhbWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgb3V0RnJhbWVzIC09IGluRnJhbWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgewpAQCAtMTE5MSw4ICsxNjMxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaXRoZXJBbmRDbGFtcChvdXQsIG91dFRlbXAsIEJMT0NLU0laRSk7Ci0gICAgICAgICAgICBvdXQgKz0gQkxPQ0tTSVpFOworCisgICAgICAgICAgICBjb252ZXJ0TWl4ZXJGb3JtYXQob3V0LCB0MS5tTWl4ZXJGb3JtYXQsIG91dFRlbXAsIHQxLm1NaXhlckluRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBCTE9DS1NJWkUgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQpOworICAgICAgICAgICAgLy8gVE9ETzogZml4IHVnbHkgY2FzdGluZyBkdWUgdG8gY2hvaWNlIG9mIG91dCBwb2ludGVyIHR5cGUKKyAgICAgICAgICAgIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCh1aW50OF90KilvdXQKKyAgICAgICAgICAgICAgICAgICAgKyBCTE9DS1NJWkUgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0MS5tTWl4ZXJGb3JtYXQpKTsKICAgICAgICAgICAgIG51bUZyYW1lcyArPSBCTE9DS1NJWkU7CiAgICAgICAgIH0gd2hpbGUgKG51bUZyYW1lcyA8IHN0YXRlLT5mcmFtZUNvdW50KTsKICAgICB9CkBAIC0xMjExLDEwICsxNjU2LDkgQEAKIC8vIGdlbmVyaWMgY29kZSB3aXRoIHJlc2FtcGxpbmcKIHZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKQogeworICAgIEFMT0dWVigicHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmdcbiIpOwogICAgIC8vIHRoaXMgY29uc3QganVzdCBtZWFucyB0aGF0IGxvY2FsIHZhcmlhYmxlIG91dFRlbXAgZG9lc24ndCBjaGFuZ2UKICAgICBpbnQzMl90KiBjb25zdCBvdXRUZW1wID0gc3RhdGUtPm91dHB1dFRlbXA7Ci0gICAgY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2YoaW50MzJfdCkgKiBNQVhfTlVNX0NIQU5ORUxTICogc3RhdGUtPmZyYW1lQ291bnQ7Ci0KICAgICBzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7CiAKICAgICB1aW50MzJfdCBlMCA9IHN0YXRlLT5lbmFibGVkVHJhY2tzOwpAQCAtMTIzNSwyMCArMTY3OSwyMCBAQAogICAgICAgICB9CiAgICAgICAgIGUwICY9IH4oZTEpOwogICAgICAgICBpbnQzMl90ICpvdXQgPSB0MS5tYWluQnVmZmVyOwotICAgICAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZSk7CisgICAgICAgIG1lbXNldChvdXRUZW1wLCAwLCBzaXplb2YoKm91dFRlbXApICogdDEubU1peGVyQ2hhbm5lbENvdW50ICogc3RhdGUtPmZyYW1lQ291bnQpOwogICAgICAgICB3aGlsZSAoZTEpIHsKICAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUxKTsKICAgICAgICAgICAgIGUxICY9IH4oMTw8aSk7CiAgICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKICAgICAgICAgICAgIGludDMyX3QgKmF1eCA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoKHQubmVlZHMgJiBORUVEU19BVVhfX01BU0spID09IE5FRURTX0FVWF9FTkFCTEVEKSkgeworICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHQubmVlZHMgJiBORUVEU19BVVgpKSB7CiAgICAgICAgICAgICAgICAgYXV4ID0gdC5hdXhCdWZmZXI7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBsaXR0bGUgZ29vZnksIG9uIHRoZSByZXNhbXBsaW5nIGNhc2Ugd2UgZG9uJ3QKICAgICAgICAgICAgIC8vIGFjcXVpcmUvcmVsZWFzZSB0aGUgYnVmZmVycyBiZWNhdXNlIGl0J3MgZG9uZSBieQogICAgICAgICAgICAgLy8gdGhlIHJlc2FtcGxlci4KLSAgICAgICAgICAgIGlmICgodC5uZWVkcyAmIE5FRURTX1JFU0FNUExFX19NQVNLKSA9PSBORUVEU19SRVNBTVBMRV9FTkFCTEVEKSB7CisgICAgICAgICAgICBpZiAodC5uZWVkcyAmIE5FRURTX1JFU0FNUExFKSB7CiAgICAgICAgICAgICAgICAgdC5yZXNhbXBsZXItPnNldFBUUyhwdHMpOwogICAgICAgICAgICAgICAgIHQuaG9vaygmdCwgb3V0VGVtcCwgbnVtRnJhbWVzLCBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEyNjcsMTQgKzE3MTEsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXV4ICs9IG91dEZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0Lmhvb2soJnQsIG91dFRlbXAgKyBvdXRGcmFtZXMqTUFYX05VTV9DSEFOTkVMUywgdC5idWZmZXIuZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgdC5ob29rKCZ0LCBvdXRUZW1wICsgb3V0RnJhbWVzICogdC5tTWl4ZXJDaGFubmVsQ291bnQsIHQuYnVmZmVyLmZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnJlc2FtcGxlVGVtcCwgYXV4KTsKICAgICAgICAgICAgICAgICAgICAgb3V0RnJhbWVzICs9IHQuYnVmZmVyLmZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnQuYnVmZmVyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZGl0aGVyQW5kQ2xhbXAob3V0LCBvdXRUZW1wLCBudW1GcmFtZXMpOworICAgICAgICBjb252ZXJ0TWl4ZXJGb3JtYXQob3V0LCB0MS5tTWl4ZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgb3V0VGVtcCwgdDEubU1peGVySW5Gb3JtYXQsIG51bUZyYW1lcyAqIHQxLm1NaXhlckNoYW5uZWxDb3VudCk7CiAgICAgfQogfQogCkBAIC0xMjgyLDYgKzE3MjcsNyBAQAogdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMpCiB7CisgICAgQUxPR1ZWKCJwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZ1xuIik7CiAgICAgLy8gVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgd2hlbiBzdGF0ZS0+ZW5hYmxlZFRyYWNrcyBoYXMgZXhhY3RseQogICAgIC8vIG9uZSBiaXQgc2V0LiAgVGhlIGFzc2VydHMgYmVsb3cgd291bGQgdmVyaWZ5IHRoaXMsIGJ1dCBhcmUgY29tbWVudGVkIG91dAogICAgIC8vIHNpbmNlIHRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIG1ldGhvZCBpcyB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZS4KQEAgLTEyOTMsNiArMTczOSw3IEBACiAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBiKHQuYnVmZmVyKTsKIAogICAgIGludDMyX3QqIG91dCA9IHQubWFpbkJ1ZmZlcjsKKyAgICBmbG9hdCAqZm91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihvdXQpOwogICAgIHNpemVfdCBudW1GcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKIAogICAgIGNvbnN0IGludDE2X3QgdmwgPSB0LnZvbHVtZVswXTsKQEAgLTEzMDYsMTUwICsxNzUzLDY4IEBACiAKICAgICAgICAgLy8gaW4gPT0gTlVMTCBjYW4gaGFwcGVuIGlmIHRoZSB0cmFjayB3YXMgZmx1c2hlZCBqdXN0IGFmdGVyIGhhdmluZwogICAgICAgICAvLyBiZWVuIGVuYWJsZWQgZm9yIG1peGluZy4KLSAgICAgICAgaWYgKGluID09IE5VTEwgfHwgKCh1bnNpZ25lZCBsb25nKWluICYgMykpIHsKLSAgICAgICAgICAgIG1lbXNldChvdXQsIDAsIG51bUZyYW1lcypNQVhfTlVNX0NIQU5ORUxTKnNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgICAgICBBTE9HRV9JRigoKHVuc2lnbmVkIGxvbmcpaW4gJiAzKSwgInByb2Nlc3Mgc3RlcmVvIHRyYWNrOiBpbnB1dCBidWZmZXIgYWxpZ25tZW50IHBiOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciAlcCB0cmFjayAlZCwgY2hhbm5lbHMgJWQsIG5lZWRzICUwOHgiLAotICAgICAgICAgICAgICAgICAgICBpbiwgaSwgdC5jaGFubmVsQ291bnQsIHQubmVlZHMpOworICAgICAgICBpZiAoaW4gPT0gTlVMTCB8fCAoKCh1aW50cHRyX3QpaW4pICYgMykpIHsKKyAgICAgICAgICAgIG1lbXNldChvdXQsIDAsIG51bUZyYW1lcworICAgICAgICAgICAgICAgICAgICAqIHQubU1peGVyQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0Lm1NaXhlckZvcm1hdCkpOworICAgICAgICAgICAgQUxPR0VfSUYoKCgodWludHB0cl90KWluKSAmIDMpLAorICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmc6IG1pc2FsaWduZWQgYnVmZmVyIgorICAgICAgICAgICAgICAgICAgICAiICVwIHRyYWNrICVkLCBjaGFubmVscyAlZCwgbmVlZHMgJTA4eCwgdm9sdW1lICUwOHggdmZsICVmIHZmciAlZiIsCisgICAgICAgICAgICAgICAgICAgIGluLCBpLCB0LmNoYW5uZWxDb3VudCwgdC5uZWVkcywgdnJsLCB0Lm1Wb2x1bWVbMF0sIHQubVZvbHVtZVsxXSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IGIuZnJhbWVDb3VudDsKIAotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodWludDMyX3QodmwpID4gVU5JVFlfR0FJTiB8fCB1aW50MzJfdCh2cikgPiBVTklUWV9HQUlOKSkgewotICAgICAgICAgICAgLy8gdm9sdW1lIGlzIGJvb3N0ZWQsIHNvIHdlIG1pZ2h0IG5lZWQgdG8gY2xhbXAgZXZlbiB0aG91Z2gKLSAgICAgICAgICAgIC8vIHdlIHByb2Nlc3Mgb25seSBvbmUgdHJhY2suCisgICAgICAgIHN3aXRjaCAodC5tTWl4ZXJGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOwogICAgICAgICAgICAgICAgIGluICs9IDI7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAgICAgLy8gY2xhbXBpbmcuLi4KLSAgICAgICAgICAgICAgICBsID0gY2xhbXAxNihsKTsKLSAgICAgICAgICAgICAgICByID0gY2xhbXAxNihyKTsKLSAgICAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOworICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpOworICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpOworICAgICAgICAgICAgICAgICpmb3V0KysgPSBmbG9hdF9mcm9tX3E0XzI3KGwpOworICAgICAgICAgICAgICAgICpmb3V0KysgPSBmbG9hdF9mcm9tX3E0XzI3KHIpOworICAgICAgICAgICAgICAgIC8vIE5vdGU6IEluIGNhc2Ugb2YgbGF0ZXIgaW50MTZfdCBzaW5rIG91dHB1dCwKKyAgICAgICAgICAgICAgICAvLyBjb252ZXJzaW9uIGFuZCBjbGFtcGluZyBpcyBkb25lIGJ5IG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgpLgogICAgICAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOwotICAgICAgICAgICAgICAgIGluICs9IDI7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHVpbnQzMl90KHZsKSA+IFVOSVRZX0dBSU5fSU5UIHx8IHVpbnQzMl90KHZyKSA+IFVOSVRZX0dBSU5fSU5UKSkgeworICAgICAgICAgICAgICAgIC8vIHZvbHVtZSBpcyBib29zdGVkLCBzbyB3ZSBtaWdodCBuZWVkIHRvIGNsYW1wIGV2ZW4gdGhvdWdoCisgICAgICAgICAgICAgICAgLy8gd2UgcHJvY2VzcyBvbmx5IG9uZSB0cmFjay4KKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOworICAgICAgICAgICAgICAgICAgICBpbiArPSAyOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSBtdWxSTCgxLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsYW1waW5nLi4uCisgICAgICAgICAgICAgICAgICAgIGwgPSBjbGFtcDE2KGwpOworICAgICAgICAgICAgICAgICAgICByID0gY2xhbXAxNihyKTsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihpbik7CisgICAgICAgICAgICAgICAgICAgIGluICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpID4+IDEyOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHIgPSBtdWxSTCgwLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlciBmb3JtYXQ6ICVkIiwgdC5tTWl4ZXJGb3JtYXQpOwogICAgICAgICB9CiAgICAgICAgIG51bUZyYW1lcyAtPSBiLmZyYW1lQ291bnQ7CiAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIpOwogICAgIH0KIH0KIAotI2lmIDAKLS8vIDIgdHJhY2tzIGlzIGFsc28gYSBjb21tb24gY2FzZQotLy8gTkVWRVIgdXNlZCBpbiBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3NfX3ZhbGlkYXRlKCkKLS8vIG9ubHkgdXNlIGlmIHRoZSAyIHRyYWNrcyBoYXZlIHRoZSBzYW1lIG91dHB1dCBidWZmZXIKLXZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fVHdvVHJhY2tzMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMpCi17Ci0gICAgaW50IGk7Ci0gICAgdWludDMyX3QgZW4gPSBzdGF0ZS0+ZW5hYmxlZFRyYWNrczsKLQotICAgIGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwotICAgIGNvbnN0IHRyYWNrX3QmIHQwID0gc3RhdGUtPnRyYWNrc1tpXTsKLSAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIwKHQwLmJ1ZmZlcik7Ci0KLSAgICBlbiAmPSB+KDE8PGkpOwotICAgIGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwotICAgIGNvbnN0IHRyYWNrX3QmIHQxID0gc3RhdGUtPnRyYWNrc1tpXTsKLSAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIxKHQxLmJ1ZmZlcik7Ci0KLSAgICBjb25zdCBpbnQxNl90ICppbjA7Ci0gICAgY29uc3QgaW50MTZfdCB2bDAgPSB0MC52b2x1bWVbMF07Ci0gICAgY29uc3QgaW50MTZfdCB2cjAgPSB0MC52b2x1bWVbMV07Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQwID0gMDsKLQotICAgIGNvbnN0IGludDE2X3QgKmluMTsKLSAgICBjb25zdCBpbnQxNl90IHZsMSA9IHQxLnZvbHVtZVswXTsKLSAgICBjb25zdCBpbnQxNl90IHZyMSA9IHQxLnZvbHVtZVsxXTsKLSAgICBzaXplX3QgZnJhbWVDb3VudDEgPSAwOwotCi0gICAgLy9GSVhNRTogb25seSB3b3JrcyBpZiB0d28gdHJhY2tzIHVzZSBzYW1lIGJ1ZmZlcgotICAgIGludDMyX3QqIG91dCA9IHQwLm1haW5CdWZmZXI7Ci0gICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OwotICAgIGNvbnN0IGludDE2X3QgKmJ1ZmYgPSBOVUxMOwotCi0KLSAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0KLSAgICAgICAgaWYgKGZyYW1lQ291bnQwID09IDApIHsKLSAgICAgICAgICAgIGIwLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7Ci0gICAgICAgICAgICBpbnQ2NF90IG91dHB1dFBUUyA9IGNhbGN1bGF0ZU91dHB1dFBUUyh0MCwgcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IC0gdDAubWFpbkJ1ZmZlcik7Ci0gICAgICAgICAgICB0MC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYjAsIG91dHB1dFBUUyk7Ci0gICAgICAgICAgICBpZiAoYjAuaTE2ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVmZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBuZXcgaW50MTZfdFtNQVhfTlVNX0NIQU5ORUxTICogc3RhdGUtPmZyYW1lQ291bnRdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbjAgPSBidWZmOwotICAgICAgICAgICAgICAgIGIwLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluMCA9IGIwLmkxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyYW1lQ291bnQwID0gYjAuZnJhbWVDb3VudDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZnJhbWVDb3VudDEgPT0gMCkgewotICAgICAgICAgICAgYjEuZnJhbWVDb3VudCA9IG51bUZyYW1lczsKLSAgICAgICAgICAgIGludDY0X3Qgb3V0cHV0UFRTID0gY2FsY3VsYXRlT3V0cHV0UFRTKHQxLCBwdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgLSB0MC5tYWluQnVmZmVyKTsKLSAgICAgICAgICAgIHQxLmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiMSwgb3V0cHV0UFRTKTsKLSAgICAgICAgICAgIGlmIChiMS5pMTYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChidWZmID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZiA9IG5ldyBpbnQxNl90W01BWF9OVU1fQ0hBTk5FTFMgKiBzdGF0ZS0+ZnJhbWVDb3VudF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluMSA9IGJ1ZmY7Ci0gICAgICAgICAgICAgICAgYjEuZnJhbWVDb3VudCA9IG51bUZyYW1lczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW4xID0gYjEuaTE2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJhbWVDb3VudDEgPSBiMS5mcmFtZUNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IGZyYW1lQ291bnQwIDwgZnJhbWVDb3VudDE/ZnJhbWVDb3VudDA6ZnJhbWVDb3VudDE7Ci0KLSAgICAgICAgbnVtRnJhbWVzIC09IG91dEZyYW1lczsKLSAgICAgICAgZnJhbWVDb3VudDAgLT0gb3V0RnJhbWVzOwotICAgICAgICBmcmFtZUNvdW50MSAtPSBvdXRGcmFtZXM7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgaW50MzJfdCBsMCA9ICppbjArKzsKLSAgICAgICAgICAgIGludDMyX3QgcjAgPSAqaW4wKys7Ci0gICAgICAgICAgICBsMCA9IG11bChsMCwgdmwwKTsKLSAgICAgICAgICAgIHIwID0gbXVsKHIwLCB2cjApOwotICAgICAgICAgICAgaW50MzJfdCBsID0gKmluMSsrOwotICAgICAgICAgICAgaW50MzJfdCByID0gKmluMSsrOwotICAgICAgICAgICAgbCA9IG11bEFkZChsLCB2bDEsIGwwKSA+PiAxMjsKLSAgICAgICAgICAgIHIgPSBtdWxBZGQociwgdnIxLCByMCkgPj4gMTI7Ci0gICAgICAgICAgICAvLyBjbGFtcGluZy4uLgotICAgICAgICAgICAgbCA9IGNsYW1wMTYobCk7Ci0gICAgICAgICAgICByID0gY2xhbXAxNihyKTsKLSAgICAgICAgICAgICpvdXQrKyA9IChyPDwxNikgfCAobCAmIDB4RkZGRik7Ci0gICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKLQotICAgICAgICBpZiAoZnJhbWVDb3VudDAgPT0gMCkgewotICAgICAgICAgICAgdDAuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZnJhbWVDb3VudDEgPT0gMCkgewotICAgICAgICAgICAgdDEuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRlbGV0ZSBbXSBidWZmOwotfQotI2VuZGlmCi0KIGludDY0X3QgQXVkaW9NaXhlcjo6Y2FsY3VsYXRlT3V0cHV0UFRTKGNvbnN0IHRyYWNrX3QmIHQsIGludDY0X3QgYmFzZVBUUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRGcmFtZUluZGV4KQogewotICAgIGlmIChBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyA9PSBiYXNlUFRTKQorICAgIGlmIChBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyA9PSBiYXNlUFRTKSB7CiAgICAgICAgIHJldHVybiBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUzsKKyAgICB9CiAKICAgICByZXR1cm4gYmFzZVBUUyArICgob3V0cHV0RnJhbWVJbmRleCAqIHNMb2NhbFRpbWVGcmVxKSAvIHQuc2FtcGxlUmF0ZSk7CiB9CkBAIC0xNDYwLDcgKzE4MjUsNDE0IEBACiAvKnN0YXRpYyovIHZvaWQgQXVkaW9NaXhlcjo6c0luaXRSb3V0aW5lKCkKIHsKICAgICBMb2NhbENsb2NrIGxjOwotICAgIHNMb2NhbFRpbWVGcmVxID0gbGMuZ2V0TG9jYWxGcmVxKCk7CisgICAgc0xvY2FsVGltZUZyZXEgPSBsYy5nZXRMb2NhbEZyZXEoKTsgLy8gZm9yIHRoZSByZXNhbXBsZXIKKworICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppbml0KCk7IC8vIGZvciB0aGUgZG93bm1peGVyCit9CisKKy8qIFRPRE86IGNvbnNpZGVyIHdoZXRoZXIgdGhpcyBsZXZlbCBvZiBvcHRpbWl6YXRpb24gaXMgbmVjZXNzYXJ5LgorICogUGVyaGFwcyBqdXN0IHN0aWNrIHdpdGggYSBzaW5nbGUgZm9yIGxvb3AuCisgKi8KKworLy8gTmVlZHMgdG8gZGVyaXZlIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IChjb25zdGV4cHIpLiAgQ291bGQgYmUgdGFyZ2V0ZWQgdG8gZ28KKy8vIHRvIGEgTU9OT1ZPTCBtaXh0eXBlIGJhc2VkIG9uIE1BWF9OVU1fVk9MVU1FUywgYnV0IHRoYXQncyBhbiB1bm5lY2Vzc2FyeSBjb21wbGljYXRpb24uCisjZGVmaW5lIE1JWFRZUEVfTU9OT1ZPTChtaXh0eXBlKSAobWl4dHlwZSA9PSBNSVhUWVBFX01VTFRJID8gTUlYVFlQRV9NVUxUSV9NT05PVk9MIDogXAorICAgICAgICBtaXh0eXBlID09IE1JWFRZUEVfTVVMVElfU0FWRU9OTFkgPyBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0wgOiBtaXh0eXBlKQorCisvKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KQorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsCisgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQVY+CitzdGF0aWMgdm9pZCB2b2x1bWVSYW1wTXVsdGkodWludDMyX3QgY2hhbm5lbHMsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBjb25zdCBUSSogaW4sIFRBKiBhdXgsIFRWICp2b2wsIGNvbnN0IFRWICp2b2xpbmMsIFRBViAqdm9sYSwgVEFWIHZvbGFpbmMpCit7CisgICAgc3dpdGNoIChjaGFubmVscykgeworICAgIGNhc2UgMToKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEUsIDE+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFLCAyPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCAzPihvdXQsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDQ+KG91dCwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNT4ob3V0LAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA2PihvdXQsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDc+KG91dCwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgOD4ob3V0LAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KQorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsCisgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQVY+CitzdGF0aWMgdm9pZCB2b2x1bWVNdWx0aSh1aW50MzJfdCBjaGFubmVscywgVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGNvbnN0IFRJKiBpbiwgVEEqIGF1eCwgY29uc3QgVFYgKnZvbCwgVEFWIHZvbGEpCit7CisgICAgc3dpdGNoIChjaGFubmVscykgeworICAgIGNhc2UgMToKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRSwgMT4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEUsIDI+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDM+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDQ+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDU+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDY+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDc+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDg+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBVU0VGTE9BVFZPTCAoc2V0IHRvIHRydWUgaWYgZmxvYXQgdm9sdW1lIGlzIHVzZWQpCisgKiBBREpVU1RWT0wgICAoc2V0IHRvIHRydWUgaWYgdm9sdW1lIHJhbXAgcGFyYW1ldGVycyBuZWVkcyBhZGp1c3RtZW50IGFmdGVyd2FyZHMpCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KQorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGJvb2wgVVNFRkxPQVRWT0wsIGJvb2wgQURKVVNUVk9MLAorICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Cit2b2lkIEF1ZGlvTWl4ZXI6OnZvbHVtZU1peChUTyAqb3V0LCBzaXplX3Qgb3V0RnJhbWVzLAorICAgICAgICBjb25zdCBUSSAqaW4sIFRBICphdXgsIGJvb2wgcmFtcCwgQXVkaW9NaXhlcjo6dHJhY2tfdCAqdCkKK3sKKyAgICBpZiAoVVNFRkxPQVRWT0wpIHsKKyAgICAgICAgaWYgKHJhbXApIHsKKyAgICAgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFPih0LT5tTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAorICAgICAgICAgICAgICAgICAgICB0LT5tUHJldlZvbHVtZSwgdC0+bVZvbHVtZUluYywgJnQtPnByZXZBdXhMZXZlbCwgdC0+YXV4SW5jKTsKKyAgICAgICAgICAgIGlmIChBREpVU1RWT0wpIHsKKyAgICAgICAgICAgICAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKGF1eCAhPSBOVUxMLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEU+KHQtPm1NaXhlckNoYW5uZWxDb3VudCwgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsCisgICAgICAgICAgICAgICAgICAgIHQtPm1Wb2x1bWUsIHQtPmF1eExldmVsKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyYW1wKSB7CisgICAgICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRT4odC0+bU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKKyAgICAgICAgICAgICAgICAgICAgdC0+cHJldlZvbHVtZSwgdC0+dm9sdW1lSW5jLCAmdC0+cHJldkF1eExldmVsLCB0LT5hdXhJbmMpOworICAgICAgICAgICAgaWYgKEFESlVTVFZPTCkgeworICAgICAgICAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoYXV4ICE9IE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRT4odC0+bU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKKyAgICAgICAgICAgICAgICAgICAgdC0+dm9sdW1lLCB0LT5hdXhMZXZlbCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFRoaXMgcHJvY2VzcyBob29rIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgc2luZ2xlIHRyYWNrIHdpdGhvdXQKKyAqIGF1eCBidWZmZXIsIHZvbHVtZSByYW1wLCBvciByZXNhbXBsaW5nLgorICogVE9ETzogVXBkYXRlIHRoZSBob29rIHNlbGVjdGlvbjogdGhpcyBjYW4gcHJvcGVybHkgaGFuZGxlIGF1eCBhbmQgcmFtcC4KKyAqCisgKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KQorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Cit2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cykKK3sKKyAgICBBTE9HVlYoInByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrXG4iKTsKKyAgICAvLyBDTFogaXMgZmFzdGVyIHRoYW4gQ1RaIG9uIEFSTSwgdGhvdWdoIHJlYWxseSBub3Qgc3VyZSBpZiB0cnVlIGFmdGVyIDMxIC0gY2x6LgorICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHN0YXRlLT5lbmFibGVkVHJhY2tzKTsKKyAgICBBTE9HX0FTU0VSVCgoMSA8PCBpKSA9PSBzdGF0ZS0+ZW5hYmxlZFRyYWNrcywgIm1vcmUgdGhhbiAxIHRyYWNrIGVuYWJsZWQiKTsKKyAgICB0cmFja190ICp0ID0gJnN0YXRlLT50cmFja3NbaV07CisgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbHMgPSB0LT5tTWl4ZXJDaGFubmVsQ291bnQ7CisgICAgVE8qIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VE8qPih0LT5tYWluQnVmZmVyKTsKKyAgICBUQSogYXV4ID0gcmVpbnRlcnByZXRfY2FzdDxUQSo+KHQtPmF1eEJ1ZmZlcik7CisgICAgY29uc3QgYm9vbCByYW1wID0gdC0+bmVlZHNSYW1wKCk7CisKKyAgICBmb3IgKHNpemVfdCBudW1GcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsgbnVtRnJhbWVzOyApIHsKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBiKHQtPmJ1ZmZlcik7CisgICAgICAgIC8vIGdldCBpbnB1dCBidWZmZXIKKyAgICAgICAgYi5mcmFtZUNvdW50ID0gbnVtRnJhbWVzOworICAgICAgICBjb25zdCBpbnQ2NF90IG91dHB1dFBUUyA9IGNhbGN1bGF0ZU91dHB1dFBUUygqdCwgcHRzLCBzdGF0ZS0+ZnJhbWVDb3VudCAtIG51bUZyYW1lcyk7CisgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiLCBvdXRwdXRQVFMpOworICAgICAgICBjb25zdCBUSSAqaW4gPSByZWludGVycHJldF9jYXN0PFRJKj4oYi5yYXcpOworCisgICAgICAgIC8vIGluID09IE5VTEwgY2FuIGhhcHBlbiBpZiB0aGUgdHJhY2sgd2FzIGZsdXNoZWQganVzdCBhZnRlciBoYXZpbmcKKyAgICAgICAgLy8gYmVlbiBlbmFibGVkIGZvciBtaXhpbmcuCisgICAgICAgIGlmIChpbiA9PSBOVUxMIHx8ICgoKHVpbnRwdHJfdClpbikgJiAzKSkgeworICAgICAgICAgICAgbWVtc2V0KG91dCwgMCwgbnVtRnJhbWVzCisgICAgICAgICAgICAgICAgICAgICogY2hhbm5lbHMgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQtPm1NaXhlckZvcm1hdCkpOworICAgICAgICAgICAgQUxPR0VfSUYoKCgodWludHB0cl90KWluKSAmIDMpLCAicHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s6IGJ1cyBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAiYnVmZmVyICVwIHRyYWNrICVwLCBjaGFubmVscyAlZCwgbmVlZHMgJSN4IiwKKyAgICAgICAgICAgICAgICAgICAgaW4sIHQsIHQtPmNoYW5uZWxDb3VudCwgdC0+bmVlZHMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IG91dEZyYW1lcyA9IGIuZnJhbWVDb3VudDsKKyAgICAgICAgdm9sdW1lTWl4PE1JWFRZUEUsIGlzX3NhbWU8VEksIGZsb2F0Pjo6dmFsdWUsIGZhbHNlPiAoCisgICAgICAgICAgICAgICAgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsIHJhbXAsIHQpOworCisgICAgICAgIG91dCArPSBvdXRGcmFtZXMgKiBjaGFubmVsczsKKyAgICAgICAgaWYgKGF1eCAhPSBOVUxMKSB7CisgICAgICAgICAgICBhdXggKz0gY2hhbm5lbHM7CisgICAgICAgIH0KKyAgICAgICAgbnVtRnJhbWVzIC09IGIuZnJhbWVDb3VudDsKKworICAgICAgICAvLyByZWxlYXNlIGJ1ZmZlcgorICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmYik7CisgICAgfQorICAgIGlmIChyYW1wKSB7CisgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoYXV4ICE9IE5VTEwsIGlzX3NhbWU8VEksIGZsb2F0Pjo6dmFsdWUpOworICAgIH0KK30KKworLyogVGhpcyB0cmFjayBob29rIGlzIGNhbGxlZCB0byBkbyByZXNhbXBsaW5nIHRoZW4gbWl4aW5nLAorICogcHVsbGluZyBmcm9tIHRoZSB0cmFjaydzIHVwc3RyZWFtIEF1ZGlvQnVmZmVyUHJvdmlkZXIuCisgKgorICogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqLwordGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgordm9pZCBBdWRpb01peGVyOjp0cmFja19fUmVzYW1wbGUodHJhY2tfdCogdCwgVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIFRPKiB0ZW1wLCBUQSogYXV4KQoreworICAgIEFMT0dWVigidHJhY2tfX1Jlc2FtcGxlXG4iKTsKKyAgICB0LT5yZXNhbXBsZXItPnNldFNhbXBsZVJhdGUodC0+c2FtcGxlUmF0ZSk7CisgICAgY29uc3QgYm9vbCByYW1wID0gdC0+bmVlZHNSYW1wKCk7CisgICAgaWYgKHJhbXAgfHwgYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gaWYgcmFtcDogICAgICAgIHJlc2FtcGxlIHdpdGggdW5pdHkgZ2FpbiB0byB0ZW1wIGJ1ZmZlciBhbmQgc2NhbGUvbWl4IGluIDJuZCBzdGVwLgorICAgICAgICAvLyBpZiBhdXggIT0gTlVMTDogcmVzYW1wbGUgd2l0aCB1bml0eSBnYWluIHRvIHRlbXAgYnVmZmVyIHRoZW4gYXBwbHkgc2VuZCBsZXZlbC4KKworICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOX0ZMT0FULCBVTklUWV9HQUlOX0ZMT0FUKTsKKyAgICAgICAgbWVtc2V0KHRlbXAsIDAsIG91dEZyYW1lQ291bnQgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQgKiBzaXplb2YoVE8pKTsKKyAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCopdGVtcCwgb3V0RnJhbWVDb3VudCwgdC0+YnVmZmVyUHJvdmlkZXIpOworCisgICAgICAgIHZvbHVtZU1peDxNSVhUWVBFLCBpc19zYW1lPFRJLCBmbG9hdD46OnZhbHVlLCB0cnVlPigKKyAgICAgICAgICAgICAgICBvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCwgcmFtcCwgdCk7CisKKyAgICB9IGVsc2UgeyAvLyBjb25zdGFudCB2b2x1bWUgZ2FpbgorICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZSh0LT5tVm9sdW1lWzBdLCB0LT5tVm9sdW1lWzFdKTsKKyAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCopb3V0LCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7CisgICAgfQorfQorCisvKiBUaGlzIHRyYWNrIGhvb2sgaXMgY2FsbGVkIHRvIG1peCBhIHRyYWNrLCB3aGVuIG5vIHJlc2FtcGxpbmcgaXMgcmVxdWlyZWQuCisgKiBUaGUgaW5wdXQgYnVmZmVyIHNob3VsZCBiZSBwcmVzZW50IGluIHQtPmluLgorICoKKyAqIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKKyAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAqIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiBUQTogaW50MzJfdCAoUTQuMjcpCisgKi8KK3RlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX05vUmVzYW1wbGUodHJhY2tfdCogdCwgVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIFRPKiB0ZW1wIF9fdW51c2VkLCBUQSogYXV4KQoreworICAgIEFMT0dWVigidHJhY2tfX05vUmVzYW1wbGVcbiIpOworICAgIGNvbnN0IFRJICppbiA9IHN0YXRpY19jYXN0PGNvbnN0IFRJICo+KHQtPmluKTsKKworICAgIHZvbHVtZU1peDxNSVhUWVBFLCBpc19zYW1lPFRJLCBmbG9hdD46OnZhbHVlLCB0cnVlPigKKyAgICAgICAgICAgIG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdC0+bmVlZHNSYW1wKCksIHQpOworCisgICAgLy8gTUlYVFlQRV9NT05PRVhQQU5EIHJlYWRzIGEgc2luZ2xlIGlucHV0IGNoYW5uZWwgYW5kIGV4cGFuZHMgdG8gTkNIQU4gb3V0cHV0IGNoYW5uZWxzLgorICAgIC8vIE1JWFRZUEVfTVVMVEkgcmVhZHMgTkNIQU4gaW5wdXQgY2hhbm5lbHMgYW5kIHBsYWNlcyB0byBOQ0hBTiBvdXRwdXQgY2hhbm5lbHMuCisgICAgaW4gKz0gKE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKSA/IGZyYW1lQ291bnQgOiBmcmFtZUNvdW50ICogdC0+bU1peGVyQ2hhbm5lbENvdW50OworICAgIHQtPmluID0gaW47Cit9CisKKy8qIFRoZSBNaXhlciBlbmdpbmUgZ2VuZXJhdGVzIGVpdGhlciBpbnQzMl90IChRNF8yNykgb3IgZmxvYXQgZGF0YS4KKyAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGVuZ2luZSBidWZmZXJzCisgKiB0byB0aGUgZGVzaXJlZCBtaXhlciBvdXRwdXQgZm9ybWF0LCBlaXRoZXIgaW50MTZfdCAoUS4xNSkgb3IgZmxvYXQuCisgKi8KK3ZvaWQgQXVkaW9NaXhlcjo6Y29udmVydE1peGVyRm9ybWF0KHZvaWQgKm91dCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQsCisgICAgICAgIHZvaWQgKmluLCBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBzaXplX3Qgc2FtcGxlQ291bnQpCit7CisgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICBzd2l0Y2ggKG1peGVyT3V0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIG1lbWNweShvdXQsIGluLCBzYW1wbGVDb3VudCAqIHNpemVvZihmbG9hdCkpOyAvLyBNRU1DUFkuIFRPRE8gb3B0aW1pemUgb3V0CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgoaW50MTZfdCopb3V0LCAoZmxvYXQqKWluLCBzYW1wbGVDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlck91dEZvcm1hdDogJSN4IiwgbWl4ZXJPdXRGb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgc3dpdGNoIChtaXhlck91dEZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9xNF8yNygoZmxvYXQqKW91dCwgKGludDMyX3QqKWluLCBzYW1wbGVDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIC8vIHR3byBpbnQxNl90IGFyZSBwcm9kdWNlZCBwZXIgaXRlcmF0aW9uCisgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcCgoaW50MzJfdCopb3V0LCAoaW50MzJfdCopaW4sIHNhbXBsZUNvdW50ID4+IDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJPdXRGb3JtYXQ6ICUjeCIsIG1peGVyT3V0Rm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlckluRm9ybWF0OiAlI3giLCBtaXhlckluRm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBSZXR1cm5zIHRoZSBwcm9wZXIgdHJhY2sgaG9vayB0byB1c2UgZm9yIG1peGluZyB0aGUgdHJhY2sgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqLworQXVkaW9NaXhlcjo6aG9va190IEF1ZGlvTWl4ZXI6OmdldFRyYWNrSG9vayhpbnQgdHJhY2tUeXBlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0IF9fdW51c2VkKQoreworICAgIGlmICgha1VzZU5ld01peGVyICYmIGNoYW5uZWxDb3VudCA9PSBGQ0NfMiAmJiBtaXhlckluRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgIHN3aXRjaCAodHJhY2tUeXBlKSB7CisgICAgICAgIGNhc2UgVFJBQ0tUWVBFX05PUDoKKyAgICAgICAgICAgIHJldHVybiB0cmFja19fbm9wOworICAgICAgICBjYXNlIFRSQUNLVFlQRV9SRVNBTVBMRToKKyAgICAgICAgICAgIHJldHVybiB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlOworICAgICAgICBjYXNlIFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTzoKKyAgICAgICAgICAgIHJldHVybiB0cmFja19fMTZCaXRzTW9ubzsKKyAgICAgICAgY2FzZSBUUkFDS1RZUEVfTk9SRVNBTVBMRToKKyAgICAgICAgICAgIHJldHVybiB0cmFja19fMTZCaXRzU3RlcmVvOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIHRyYWNrVHlwZTogJWQiLCB0cmFja1R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjaGFubmVsQ291bnQgPiBNQVhfTlVNX0NIQU5ORUxTKTsKKyAgICBzd2l0Y2ggKHRyYWNrVHlwZSkgeworICAgIGNhc2UgVFJBQ0tUWVBFX05PUDoKKyAgICAgICAgcmV0dXJuIHRyYWNrX19ub3A7CisgICAgY2FzZSBUUkFDS1RZUEVfUkVTQU1QTEU6CisgICAgICAgIHN3aXRjaCAobWl4ZXJJbkZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tfX1Jlc2FtcGxlPE1JWFRZUEVfTVVMVEksIGZsb2F0IC8qVE8qLywgZmxvYXQgLypUSSovLCBpbnQzMl90IC8qVEEqLz47CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdClcCisgICAgICAgICAgICAgICAgICAgIHRyYWNrX19SZXNhbXBsZTxNSVhUWVBFX01VTFRJLCBpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlckluRm9ybWF0OiAlI3giLCBtaXhlckluRm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBQ0tUWVBFX05PUkVTQU1QTEVNT05POgorICAgICAgICBzd2l0Y2ggKG1peGVySW5Gb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpCisgICAgICAgICAgICAgICAgICAgIHRyYWNrX19Ob1Jlc2FtcGxlPE1JWFRZUEVfTU9OT0VYUEFORCwgZmxvYXQsIGZsb2F0LCBpbnQzMl90PjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KQorICAgICAgICAgICAgICAgICAgICB0cmFja19fTm9SZXNhbXBsZTxNSVhUWVBFX01PTk9FWFBBTkQsIGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVySW5Gb3JtYXQ6ICUjeCIsIG1peGVySW5Gb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDS1RZUEVfTk9SRVNBTVBMRToKKyAgICAgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KQorICAgICAgICAgICAgICAgICAgICB0cmFja19fTm9SZXNhbXBsZTxNSVhUWVBFX01VTFRJLCBmbG9hdCwgZmxvYXQsIGludDMyX3Q+OworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpCisgICAgICAgICAgICAgICAgICAgIHRyYWNrX19Ob1Jlc2FtcGxlPE1JWFRZUEVfTVVMVEksIGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVySW5Gb3JtYXQ6ICUjeCIsIG1peGVySW5Gb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIHRyYWNrVHlwZTogJWQiLCB0cmFja1R5cGUpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJldHVybnMgdGhlIHByb3BlciBwcm9jZXNzIGhvb2sgZm9yIG1peGluZyB0cmFja3MuIEN1cnJlbnRseSB3b3JrcyBvbmx5IGZvcgorICogUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLCBhIG1peCBpbnZvbHZpbmcgb25lIHRyYWNrLCBubyByZXNhbXBsaW5nLgorICoKKyAqIFRPRE86IER1ZSB0byB0aGUgc3BlY2lhbCBtaXhpbmcgY29uc2lkZXJhdGlvbnMgb2YgZHVwbGljYXRpbmcgdG8KKyAqIGEgc3RlcmVvIG91dHB1dCB0cmFjaywgdGhlIGlucHV0IHRyYWNrIGNhbm5vdCBiZSBNT05PLiAgVGhpcyBzaG91bGQgYmUKKyAqIHByZXZlbnRlZCBieSB0aGUgY2FsbGVyLgorICovCitBdWRpb01peGVyOjpwcm9jZXNzX2hvb2tfdCBBdWRpb01peGVyOjpnZXRQcm9jZXNzSG9vayhpbnQgcHJvY2Vzc1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQpCit7CisgICAgaWYgKHByb2Nlc3NUeXBlICE9IFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSykgeyAvLyBPbmx5IE5PUkVTQU1QTEVPTkVUUkFDSworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgcHJvY2Vzc1R5cGU6ICVkIiwgcHJvY2Vzc1R5cGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFrVXNlTmV3TWl4ZXIgJiYgY2hhbm5lbENvdW50ID09IEZDQ18yICYmIG1peGVySW5Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNoYW5uZWxDb3VudCA+IE1BWF9OVU1fQ0hBTk5FTFMpOworICAgIHN3aXRjaCAobWl4ZXJJbkZvcm1hdCkgeworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgc3dpdGNoIChtaXhlck91dEZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s8TUlYVFlQRV9NVUxUSV9TQVZFT05MWSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypUTyovLCBmbG9hdCAvKlRJKi8sIGludDMyX3QgLypUQSovPjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJldHVybiBwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjazxNSVhUWVBFX01VTFRJX1NBVkVPTkxZLAorICAgICAgICAgICAgICAgICAgICBpbnQxNl90LCBmbG9hdCwgaW50MzJfdD47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJPdXRGb3JtYXQ6ICUjeCIsIG1peGVyT3V0Rm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIHN3aXRjaCAobWl4ZXJPdXRGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrPE1JWFRZUEVfTVVMVElfU0FWRU9OTFksCisgICAgICAgICAgICAgICAgICAgIGZsb2F0LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJldHVybiBwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjazxNSVhUWVBFX01VTFRJX1NBVkVPTkxZLAorICAgICAgICAgICAgICAgICAgICBpbnQxNl90LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlck91dEZvcm1hdDogJSN4IiwgbWl4ZXJPdXRGb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVySW5Gb3JtYXQ6ICUjeCIsIG1peGVySW5Gb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCmluZGV4IDQzYWViODYuLjNiOTcyYmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaApAQCAtMjYsMTAgKzI2LDEzIEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCiAKLSNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9kb3dubWl4Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KIAorLy8gRklYTUUgVGhpcyBpcyBhY3R1YWxseSB1bml0eSBnYWluLCB3aGljaCBtaWdodCBub3QgYmUgbWF4IGluIGZ1dHVyZSwgZXhwcmVzc2VkIGluIFUuMTIKKyNkZWZpbmUgTUFYX0dBSU5fSU5UIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDgsMTQgKzUxLDE0IEBACiAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9OVU1fVFJBQ0tTID0gMzI7CiAgICAgLy8gbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgc3VwcG9ydGVkIGJ5IHRoZSBtaXhlcgogCi0gICAgLy8gVGhpcyBtaXhlciBoYXMgYSBoYXJkLWNvZGVkIHVwcGVyIGxpbWl0IG9mIDIgY2hhbm5lbHMgZm9yIG91dHB1dC4KLSAgICAvLyBUaGVyZSBpcyBzdXBwb3J0IGZvciA+IDIgY2hhbm5lbCB0cmFja3MgZG93bi1taXhlZCB0byAyIGNoYW5uZWwgb3V0cHV0IHZpYSBhIGRvd24tbWl4IGVmZmVjdC4KLSAgICAvLyBBZGRpbmcgc3VwcG9ydCBmb3IgPiAyIGNoYW5uZWwgb3V0cHV0IHdvdWxkIHJlcXVpcmUgbW9yZSB0aGFuIHNpbXBseSBjaGFuZ2luZyB0aGlzIHZhbHVlLgotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTlVNX0NIQU5ORUxTID0gMjsKKyAgICAvLyBUaGlzIG1peGVyIGhhcyBhIGhhcmQtY29kZWQgdXBwZXIgbGltaXQgb2YgOCBjaGFubmVscyBmb3Igb3V0cHV0LgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTlVNX0NIQU5ORUxTID0gODsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9WT0xVTUVTID0gMjsgLy8gc3RlcmVvIHZvbHVtZSBvbmx5CiAgICAgLy8gbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgc3VwcG9ydGVkIGZvciB0aGUgY29udGVudAotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTlVNX0NIQU5ORUxTX1RPX0RPV05NSVggPSA4OworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTlVNX0NIQU5ORUxTX1RPX0RPV05NSVggPSBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsKIAotICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBVTklUWV9HQUlOID0gMHgxMDAwOworICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBVTklUWV9HQUlOX0lOVCA9IDB4MTAwMDsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgICAgVU5JVFlfR0FJTl9GTE9BVCA9IDEuMGY7CiAKICAgICBlbnVtIHsgLy8gbmFtZXMKIApAQCAtNzcsNiArODAsOCBAQAogICAgICAgICBNQUlOX0JVRkZFUiAgICAgPSAweDQwMDIsCiAgICAgICAgIEFVWF9CVUZGRVIgICAgICA9IDB4NDAwMywKICAgICAgICAgRE9XTk1JWF9UWVBFICAgID0gMFg0MDA0LAorICAgICAgICBNSVhFUl9GT1JNQVQgICAgPSAweDQwMDUsIC8vIEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkKKyAgICAgICAgTUlYRVJfQ0hBTk5FTF9NQVNLID0gMHg0MDA2LCAvLyBDaGFubmVsIG1hc2sgZm9yIG1peGVyIG91dHB1dAogICAgICAgICAvLyBmb3IgdGFyZ2V0IFJFU0FNUExFCiAgICAgICAgIFNBTVBMRV9SQVRFICAgICA9IDB4NDEwMCwgLy8gQ29uZmlndXJlIHNhbXBsZSByYXRlIGNvbnZlcnNpb24gb24gdGhpcyB0cmFjayBuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciAndmFsdWUnIGlzIHRoZSBuZXcgc2FtcGxlIHJhdGUgaW4gSHouCkBAIC05MCw2ICs5NSw3IEBACiAgICAgICAgIFJFTU9WRSAgICAgICAgICA9IDB4NDEwMiwgLy8gUmVtb3ZlIHRoZSBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgb24gdGhpcyB0cmFjayBuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0cmFjayBpcyByZXN0b3JlZCB0byB0aGUgbWl4IHNhbXBsZSByYXRlLgogICAgICAgICAvLyBmb3IgdGFyZ2V0IFJBTVBfVk9MVU1FIGFuZCBWT0xVTUUgKDggY2hhbm5lbHMgbWF4KQorICAgICAgICAvLyBGSVhNRSB1c2UgZmxvYXQgZm9yIHRoZXNlIDMgdG8gaW1wcm92ZSB0aGUgZHluYW1pYyByYW5nZQogICAgICAgICBWT0xVTUUwICAgICAgICAgPSAweDQyMDAsCiAgICAgICAgIFZPTFVNRTEgICAgICAgICA9IDB4NDIwMSwKICAgICAgICAgQVVYTEVWRUwgICAgICAgID0gMHg0MjEwLApAQCAtOTksNyArMTA1LDEwIEBACiAgICAgLy8gRm9yIGFsbCBBUElzIHdpdGggIm5hbWUiOiBUUkFDSzAgPD0gbmFtZSA8IFRSQUNLMCArIE1BWF9OVU1fVFJBQ0tTCiAKICAgICAvLyBBbGxvY2F0ZSBhIHRyYWNrIG5hbWUuICBSZXR1cm5zIG5ldyB0cmFjayBuYW1lIGlmIHN1Y2Nlc3NmdWwsIC0xIG9uIGZhaWx1cmUuCi0gICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBpbnQgc2Vzc2lvbklkKTsKKyAgICAvLyBUaGUgZmFpbHVyZSBjb3VsZCBiZSBiZWNhdXNlIG9mIGFuIGludmFsaWQgY2hhbm5lbE1hc2sgb3IgZm9ybWF0LCBvciB0aGF0CisgICAgLy8gdGhlIHRyYWNrIGNhcGFjaXR5IG9mIHRoZSBtaXhlciBpcyBleGNlZWRlZC4KKyAgICBpbnQgICAgICAgICBnZXRUcmFja05hbWUoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCk7CiAKICAgICAvLyBGcmVlIGFuIGFsbG9jYXRlZCB0cmFjayBieSBuYW1lCiAgICAgdm9pZCAgICAgICAgZGVsZXRlVHJhY2tOYW1lKGludCBuYW1lKTsKQEAgLTExNywzNSArMTI2LDM0IEBACiAKICAgICBzaXplX3QgICAgICBnZXRVbnJlbGVhc2VkRnJhbWVzKGludCBuYW1lKSBjb25zdDsKIAorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUGNtVHJhY2tGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIHJldHVybiBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgfHwKKyAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEIHx8CisgICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUIHx8CisgICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgfQorCiBwcml2YXRlOgogCiAgICAgZW51bSB7CisgICAgICAgIC8vIEZJWE1FIHRoaXMgcmVwcmVzZW50YXRpb24gcGVybWl0cyB1cCB0byA4IGNoYW5uZWxzCiAgICAgICAgIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0sgICA9IDB4MDAwMDAwMDcsCi0gICAgICAgIE5FRURTX0ZPUk1BVF9fTUFTSyAgICAgICAgICA9IDB4MDAwMDAwRjAsCi0gICAgICAgIE5FRURTX01VVEVfX01BU0sgICAgICAgICAgICA9IDB4MDAwMDAxMDAsCi0gICAgICAgIE5FRURTX1JFU0FNUExFX19NQVNLICAgICAgICA9IDB4MDAwMDEwMDAsCi0gICAgICAgIE5FRURTX0FVWF9fTUFTSyAgICAgICAgICAgICA9IDB4MDAwMTAwMDAsCiAgICAgfTsKIAogICAgIGVudW0gewotICAgICAgICBORUVEU19DSEFOTkVMXzEgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAotICAgICAgICBORUVEU19DSEFOTkVMXzIgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICAgICAgICBORUVEU19DSEFOTkVMXzEgICAgICAgICAgICAgPSAweDAwMDAwMDAwLCAgIC8vIG1vbm8KKyAgICAgICAgTkVFRFNfQ0hBTk5FTF8yICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwgICAvLyBzdGVyZW8KIAotICAgICAgICBORUVEU19GT1JNQVRfMTYgICAgICAgICAgICAgPSAweDAwMDAwMDEwLAorICAgICAgICAvLyBzYW1wbGUgZm9ybWF0IGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCwgYW5kIGlzIGFzc3VtZWQgdG8gYmUgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKIAotICAgICAgICBORUVEU19NVVRFX0RJU0FCTEVEICAgICAgICAgPSAweDAwMDAwMDAwLAotICAgICAgICBORUVEU19NVVRFX0VOQUJMRUQgICAgICAgICAgPSAweDAwMDAwMTAwLAotCi0gICAgICAgIE5FRURTX1JFU0FNUExFX0RJU0FCTEVEICAgICA9IDB4MDAwMDAwMDAsCi0gICAgICAgIE5FRURTX1JFU0FNUExFX0VOQUJMRUQgICAgICA9IDB4MDAwMDEwMDAsCi0KLSAgICAgICAgTkVFRFNfQVVYX0RJU0FCTEVEICAgICA9IDB4MDAwMDAwMDAsCi0gICAgICAgIE5FRURTX0FVWF9FTkFCTEVEICAgICAgPSAweDAwMDEwMDAwLAorICAgICAgICBORUVEU19NVVRFICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMTAwLAorICAgICAgICBORUVEU19SRVNBTVBMRSAgICAgICAgICAgICAgPSAweDAwMDAxMDAwLAorICAgICAgICBORUVEU19BVVggICAgICAgICAgICAgICAgICAgPSAweDAwMDEwMDAwLAogICAgIH07CiAKICAgICBzdHJ1Y3Qgc3RhdGVfdDsKICAgICBzdHJ1Y3QgdHJhY2tfdDsKLSAgICBjbGFzcyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKKyAgICBjbGFzcyBDb3B5QnVmZmVyUHJvdmlkZXI7CiAKICAgICB0eXBlZGVmIHZvaWQgKCpob29rX3QpKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dHB1dCwgc2l6ZV90IG51bU91dEZyYW1lcywgaW50MzJfdCogdGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGF1eCk7CkBAIC0xNTQsMTYgKzE2MiwxNyBAQAogICAgIHN0cnVjdCB0cmFja190IHsKICAgICAgICAgdWludDMyX3QgICAgbmVlZHM7CiAKKyAgICAgICAgLy8gVE9ETzogRXZlbnR1YWxseSByZW1vdmUgbGVnYWN5IGludGVnZXIgdm9sdW1lIHNldHRpbmdzCiAgICAgICAgIHVuaW9uIHsKLSAgICAgICAgaW50MTZfdCAgICAgdm9sdW1lW01BWF9OVU1fQ0hBTk5FTFNdOyAvLyBbMF0zLjEyIGZpeGVkIHBvaW50CisgICAgICAgIGludDE2X3QgICAgIHZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOyAvLyBVNC4xMiBmaXhlZCBwb2ludCAodG9wIGJpdCBzaG91bGQgYmUgemVybykKICAgICAgICAgaW50MzJfdCAgICAgdm9sdW1lUkw7CiAgICAgICAgIH07CiAKLSAgICAgICAgaW50MzJfdCAgICAgcHJldlZvbHVtZVtNQVhfTlVNX0NIQU5ORUxTXTsKKyAgICAgICAgaW50MzJfdCAgICAgcHJldlZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOwogCiAgICAgICAgIC8vIDE2LWJ5dGUgYm91bmRhcnkKIAotICAgICAgICBpbnQzMl90ICAgICB2b2x1bWVJbmNbTUFYX05VTV9DSEFOTkVMU107CisgICAgICAgIGludDMyX3QgICAgIHZvbHVtZUluY1tNQVhfTlVNX1ZPTFVNRVNdOwogICAgICAgICBpbnQzMl90ICAgICBhdXhJbmM7CiAgICAgICAgIGludDMyX3QgICAgIHByZXZBdXhMZXZlbDsKIApAQCAtMTczLDcgKzE4Miw3IEBACiAgICAgICAgIHVpbnQxNl90ICAgIGZyYW1lQ291bnQ7CiAKICAgICAgICAgdWludDhfdCAgICAgY2hhbm5lbENvdW50OyAgIC8vIDEgb3IgMiwgcmVkdW5kYW50IHdpdGggKG5lZWRzICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykKLSAgICAgICAgdWludDhfdCAgICAgZm9ybWF0OyAgICAgICAgIC8vIGFsd2F5cyAxNgorICAgICAgICB1aW50OF90ICAgICB1bnVzZWRfcGFkZGluZzsgLy8gZm9ybWVybHkgZm9ybWF0LCB3YXMgYWx3YXlzIDE2CiAgICAgICAgIHVpbnQxNl90ICAgIGVuYWJsZWQ7ICAgICAgICAvLyBhY3R1YWxseSBib29sCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrOwogCkBAIC0xOTYsNDggKzIwNSwxNTkgQEAKICAgICAgICAgaW50MzJfdCogICAgICAgICAgIGF1eEJ1ZmZlcjsKIAogICAgICAgICAvLyAxNi1ieXRlIGJvdW5kYXJ5Ci0KLSAgICAgICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIqIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyOyAvLyA0IGJ5dGVzCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqICAgICBtSW5wdXRCdWZmZXJQcm92aWRlcjsgICAgLy8gZXh0ZXJuYWxseSBwcm92aWRlZCBidWZmZXIgcHJvdmlkZXIuCisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlciogICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsgLy8gcHJvdmlkZXIgd3JhcHBlciBmb3IgcmVmb3JtYXR0aW5nLgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIqICAgICAgZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7IC8vIHdyYXBwZXIgZm9yIGNoYW5uZWwgY29udmVyc2lvbi4KIAogICAgICAgICBpbnQzMl90ICAgICBzZXNzaW9uSWQ7CiAKLSAgICAgICAgaW50MzJfdCAgICAgcGFkZGluZ1syXTsKKyAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQorICAgICAgICBhdWRpb19mb3JtYXRfdCBtTWl4ZXJGb3JtYXQ7ICAgICAvLyBvdXRwdXQgbWl4IGZvcm1hdDogQVVESU9fRk9STUFUX1BDTV8oRkxPQVR8MTZfQklUKQorICAgICAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OyAgICAgICAgICAvLyBpbnB1dCB0cmFjayBmb3JtYXQKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbU1peGVySW5Gb3JtYXQ7ICAgLy8gbWl4IGludGVybmFsIGZvcm1hdCBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhY2ggdHJhY2sgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gdGhpcyBmb3JtYXQuCisKKyAgICAgICAgZmxvYXQgICAgICAgICAgbVZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOyAgICAgLy8gZmxvYXRpbmcgcG9pbnQgc2V0IHZvbHVtZQorICAgICAgICBmbG9hdCAgICAgICAgICBtUHJldlZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOyAvLyBmbG9hdGluZyBwb2ludCBwcmV2aW91cyB2b2x1bWUKKyAgICAgICAgZmxvYXQgICAgICAgICAgbVZvbHVtZUluY1tNQVhfTlVNX1ZPTFVNRVNdOyAgLy8gZmxvYXRpbmcgcG9pbnQgdm9sdW1lIGluY3JlbWVudAorCisgICAgICAgIGZsb2F0ICAgICAgICAgIG1BdXhMZXZlbDsgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCBzZXQgYXV4IGxldmVsCisgICAgICAgIGZsb2F0ICAgICAgICAgIG1QcmV2QXV4TGV2ZWw7ICAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCBwcmV2IGF1eCBsZXZlbAorICAgICAgICBmbG9hdCAgICAgICAgICBtQXV4SW5jOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgYXV4IGluY3JlbWVudAogCiAgICAgICAgIC8vIDE2LWJ5dGUgYm91bmRhcnkKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbU1peGVyQ2hhbm5lbE1hc2s7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1NaXhlckNoYW5uZWxDb3VudDsKIAotICAgICAgICBib29sICAgICAgICBzZXRSZXNhbXBsZXIodWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgZGV2U2FtcGxlUmF0ZSk7CisgICAgICAgIGJvb2wgICAgICAgIG5lZWRzUmFtcCgpIHsgcmV0dXJuICh2b2x1bWVJbmNbMF0gfCB2b2x1bWVJbmNbMV0gfCBhdXhJbmMpICE9IDA7IH0KKyAgICAgICAgYm9vbCAgICAgICAgc2V0UmVzYW1wbGVyKHVpbnQzMl90IHRyYWNrU2FtcGxlUmF0ZSwgdWludDMyX3QgZGV2U2FtcGxlUmF0ZSk7CiAgICAgICAgIGJvb2wgICAgICAgIGRvZXNSZXNhbXBsZSgpIGNvbnN0IHsgcmV0dXJuIHJlc2FtcGxlciAhPSBOVUxMOyB9CiAgICAgICAgIHZvaWQgICAgICAgIHJlc2V0UmVzYW1wbGVyKCkgeyBpZiAocmVzYW1wbGVyICE9IE5VTEwpIHJlc2FtcGxlci0+cmVzZXQoKTsgfQotICAgICAgICB2b2lkICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKGJvb2wgYXV4KTsKKyAgICAgICAgdm9pZCAgICAgICAgYWRqdXN0Vm9sdW1lUmFtcChib29sIGF1eCwgYm9vbCB1c2VGbG9hdCA9IGZhbHNlKTsKICAgICAgICAgc2l6ZV90ICAgICAgZ2V0VW5yZWxlYXNlZEZyYW1lcygpIGNvbnN0IHsgcmV0dXJuIHJlc2FtcGxlciAhPSBOVUxMID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNhbXBsZXItPmdldFVucmVsZWFzZWRGcmFtZXMoKSA6IDA7IH07CiAgICAgfTsKIAorICAgIHR5cGVkZWYgdm9pZCAoKnByb2Nlc3NfaG9va190KShzdGF0ZV90KiBzdGF0ZSwgaW50NjRfdCBwdHMpOworCiAgICAgLy8gcGFkIHRvIDMyLWJ5dGVzIHRvIGZpbGwgY2FjaGUgbGluZQogICAgIHN0cnVjdCBzdGF0ZV90IHsKICAgICAgICAgdWludDMyX3QgICAgICAgIGVuYWJsZWRUcmFja3M7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICBuZWVkc0NoYW5nZWQ7CiAgICAgICAgIHNpemVfdCAgICAgICAgICBmcmFtZUNvdW50OwotICAgICAgICB2b2lkICAgICAgICAgICAgKCpob29rKShzdGF0ZV90KiBzdGF0ZSwgaW50NjRfdCBwdHMpOyAgIC8vIG9uZSBvZiBwcm9jZXNzX18qLCBuZXZlciBOVUxMCisgICAgICAgIHByb2Nlc3NfaG9va190ICBob29rOyAgIC8vIG9uZSBvZiBwcm9jZXNzX18qLCBuZXZlciBOVUxMCiAgICAgICAgIGludDMyX3QgICAgICAgICAqb3V0cHV0VGVtcDsKICAgICAgICAgaW50MzJfdCAgICAgICAgICpyZXNhbXBsZVRlbXA7CiAgICAgICAgIE5CTG9nOjpXcml0ZXIqICBtTG9nOwogICAgICAgICBpbnQzMl90ICAgICAgICAgcmVzZXJ2ZWRbMV07CiAgICAgICAgIC8vIEZJWE1FIGFsbG9jYXRlIGR5bmFtaWNhbGx5IHRvIHNhdmUgc29tZSBtZW1vcnkgd2hlbiBtYXhOdW1UcmFja3MgPCBNQVhfTlVNX1RSQUNLUwotICAgICAgICB0cmFja190ICAgICAgICAgdHJhY2tzW01BWF9OVU1fVFJBQ0tTXTsgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKKyAgICAgICAgdHJhY2tfdCAgICAgICAgIHRyYWNrc1tNQVhfTlVNX1RSQUNLU10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKICAgICB9OwogCi0gICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciB0aGF0IHdyYXBzIGEgdHJhY2sgQXVkaW9CdWZmZXJQcm92aWRlciBieSBhIGNhbGwgdG8gYSBkb3dubWl4IGVmZmVjdAotICAgIGNsYXNzIERvd25taXhlckJ1ZmZlclByb3ZpZGVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIgeworICAgIC8vIEJhc2UgQXVkaW9CdWZmZXJQcm92aWRlciBjbGFzcyB1c2VkIGZvciBEb3duTWl4ZXJCdWZmZXJQcm92aWRlciwgUmVtaXhCdWZmZXJQcm92aWRlciwKKyAgICAvLyBhbmQgUmVmb3JtYXRCdWZmZXJQcm92aWRlci4KKyAgICAvLyBJdCBoYW5kbGVzIGEgcHJpdmF0ZSBidWZmZXIgZm9yIHVzZSBpbiBjb252ZXJ0aW5nIGZvcm1hdCBvciBjaGFubmVsIG1hc2tzIGZyb20gdGhlCisgICAgLy8gaW5wdXQgZGF0YSB0byBhIGZvcm0gYWNjZXB0YWJsZSBieSB0aGUgbWl4ZXIuCisgICAgLy8gVE9ETzogTWFrZSBhIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyIHdoZW4gaW50ZWdlcnMgYXJlIGVudGlyZWx5IHJlbW92ZWQgZnJvbSB0aGUKKyAgICAvLyBwcm9jZXNzaW5nIHBpcGVsaW5lLgorICAgIGNsYXNzIENvcHlCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKICAgICBwdWJsaWM6CisgICAgICAgIC8vIFVzZSBhIHByaXZhdGUgYnVmZmVyIG9mIGJ1ZmZlckZyYW1lQ291bnQgZnJhbWVzIChlYWNoIGZyYW1lIGlzIG91dHB1dEZyYW1lU2l6ZSBieXRlcykuCisgICAgICAgIC8vIElmIGJ1ZmZlckZyYW1lQ291bnQgaXMgMCwgbm8gcHJpdmF0ZSBidWZmZXIgaXMgY3JlYXRlZCBhbmQgaW4tcGxhY2UgbW9kaWZpY2F0aW9uIG9mCisgICAgICAgIC8vIHRoZSB1cHN0cmVhbSBidWZmZXIgcHJvdmlkZXIncyBidWZmZXJzIGlzIHBlcmZvcm1lZCBieSBjb3B5RnJhbWVzKCkuCisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcihzaXplX3QgaW5wdXRGcmFtZVNpemUsIHNpemVfdCBvdXRwdXRGcmFtZVNpemUsCisgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOworICAgICAgICB2aXJ0dWFsIH5Db3B5QnVmZmVyUHJvdmlkZXIoKTsKKworICAgICAgICAvLyBPdmVycmlkZXMgQXVkaW9CdWZmZXJQcm92aWRlciBtZXRob2RzCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcik7Ci0gICAgICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKCk7Ci0gICAgICAgIHZpcnR1YWwgfkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCk7CiAKKyAgICAgICAgLy8gT3RoZXIgcHVibGljIG1ldGhvZHMKKworICAgICAgICAvLyBjYWxsIHRoaXMgdG8gcmVsZWFzZSB0aGUgYnVmZmVyIHRvIHRoZSB1cHN0cmVhbSBwcm92aWRlci4KKyAgICAgICAgLy8gdHJlYXQgaXQgYXMgYW4gYXVkaW8gZGlzY29udGludWl0eSBmb3IgZnV0dXJlIHNhbXBsZXMuCisgICAgICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworCisgICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHN1cHBsaWVkIGJ5IHRoZSBkZXJpdmVkIGNsYXNzLiAgSXQgY29udmVydHMKKyAgICAgICAgLy8gI2ZyYW1lcyBpbiB0aGUgKnNyYyBwb2ludGVyIHRvIHRoZSAqZHN0IHBvaW50ZXIuICBJdCBpcyBwdWJsaWMgYmVjYXVzZQorICAgICAgICAvLyBzb21lIHByb3ZpZGVycyB3aWxsIGFsbG93IHRoaXMgdG8gd29yayBvbiBhcmJpdHJhcnkgYnVmZmVycyBvdXRzaWRlCisgICAgICAgIC8vIG9mIHRoZSBpbnRlcm5hbCBidWZmZXJzLgorICAgICAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykgPSAwOworCisgICAgICAgIC8vIHNldCB0aGUgdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVyLiBDb25zaWRlciBjYWxsaW5nICJyZXNldCIgYmVmb3JlIHRoaXMgZnVuY3Rpb24uCisgICAgICAgIHZvaWQgc2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciAqcCkgeworICAgICAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXIgPSBwOworICAgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIG1UcmFja0J1ZmZlclByb3ZpZGVyOworICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtSW5wdXRGcmFtZVNpemU7CisgICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRwdXRGcmFtZVNpemU7CisgICAgcHJpdmF0ZToKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIG1CdWZmZXI7CisgICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQ7CisgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgIG1Mb2NhbEJ1ZmZlckRhdGE7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Db25zdW1lZDsKKyAgICB9OworCisgICAgLy8gRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgd3JhcHMgYSB0cmFjayBBdWRpb0J1ZmZlclByb3ZpZGVyIHRvIHByb3ZpZGUKKyAgICAvLyBwb3NpdGlvbiBkZXBlbmRlbnQgZG93bm1peGluZyBieSBhbiBBdWRpbyBFZmZlY3QuCisgICAgY2xhc3MgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IHNlc3Npb25JZCwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOworICAgICAgICB2aXJ0dWFsIH5Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpOworICAgICAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcyk7CisgICAgICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1Eb3dubWl4SGFuZGxlICE9IE5VTEw7IH0KKworICAgICAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdCgpOworICAgICAgICBzdGF0aWMgYm9vbCBpc011bHRpY2hhbm5lbENhcGFibGUoKSB7IHJldHVybiBzSXNNdWx0aWNoYW5uZWxDYXBhYmxlOyB9CisKKyAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgICBtRG93bm1peEhhbmRsZTsKICAgICAgICAgZWZmZWN0X2NvbmZpZ190ICAgIG1Eb3dubWl4Q29uZmlnOworCisgICAgICAgIC8vIGVmZmVjdCBkZXNjcmlwdG9yIGZvciB0aGUgZG93bm1peGVyIHVzZWQgYnkgdGhlIG1peGVyCisgICAgICAgIHN0YXRpYyBlZmZlY3RfZGVzY3JpcHRvcl90IHNEd25tRnhEZXNjOworICAgICAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciBhIGRvd25taXggZWZmZWN0IGhhcyBiZWVuIGZvdW5kIGFuZCBpcyB1c2FibGUgYnkgdGhpcyBtaXhlcgorICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICAgICBzSXNNdWx0aWNoYW5uZWxDYXBhYmxlOworICAgICAgICAvLyBGSVhNRTogc2hvdWxkIHdlIGFsbG93IGVmZmVjdHMgb3V0c2lkZSBvZiB0aGUgZnJhbWV3b3JrPworICAgICAgICAvLyBXZSBuZWVkIHRvIGhlcmUuIEEgc3BlY2lhbCBpb0lkIHRoYXQgbXVzdCBiZSA8PSAtMiBzbyBpdCBkb2VzIG5vdCBtYXAgdG8gYSBzZXNzaW9uLgorICAgICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBTRVNTSU9OX0lEX0lOVkFMSURfQU5EX0lHTk9SRUQgPSAtMjsKKyAgICB9OworCisgICAgLy8gUmVtaXhCdWZmZXJQcm92aWRlciB3cmFwcyBhIHRyYWNrIEF1ZGlvQnVmZmVyUHJvdmlkZXIgdG8gcGVyZm9ybSBhbgorICAgIC8vIHVwbWl4IG9yIGRvd25taXggdG8gdGhlIHByb3BlciBjaGFubmVsIGNvdW50IGFuZCBtYXNrLgorICAgIGNsYXNzIFJlbWl4QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJlbWl4QnVmZmVyUHJvdmlkZXIoYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OworICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtU2FtcGxlU2l6ZTsKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUlucHV0Q2hhbm5lbHM7CisgICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRwdXRDaGFubmVsczsKKyAgICAgICAgaW50OF90ICAgICAgICAgICAgICAgbUlkeEFyeVtzaXplb2YodWludDMyX3QpKjhdOyAvLyAzMiBiaXRzID0+IGNoYW5uZWwgaW5kaWNlcworICAgIH07CisKKyAgICAvLyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyIHdyYXBzIGEgdHJhY2sgQXVkaW9CdWZmZXJQcm92aWRlciB0byBjb252ZXJ0IHRoZSBpbnB1dCBkYXRhCisgICAgLy8gdG8gYW4gYWNjZXB0YWJsZSBtaXhlciBpbnB1dCBmb3JtYXQgdHlwZS4KKyAgICBjbGFzcyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7CisgICAgcHVibGljOgorICAgICAgICBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKGludDMyX3QgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgY29uc3QgaW50MzJfdCAgICAgICAgbUNoYW5uZWxzOworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtSW5wdXRGb3JtYXQ7CisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1PdXRwdXRGb3JtYXQ7CiAgICAgfTsKIAogICAgIC8vIGJpdG1hc2sgb2YgYWxsb2NhdGVkIHRyYWNrIG5hbWVzLCB3aGVyZSBiaXQgMCBjb3JyZXNwb25kcyB0byBUUkFDSzAgZXRjLgpAQCAtMjU1LDE4ICszNzUsMjAgQEAKIHByaXZhdGU6CiAgICAgc3RhdGVfdCAgICAgICAgIG1TdGF0ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwogCi0gICAgLy8gZWZmZWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBkb3dubWl4ZXIgdXNlZCBieSB0aGUgbWl4ZXIKLSAgICBzdGF0aWMgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkd25tRnhEZXNjOwotICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIGEgZG93bm1peCBlZmZlY3QgaGFzIGJlZW4gZm91bmQgYW5kIGlzIHVzYWJsZSBieSB0aGlzIG1peGVyCi0gICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgICAgaXNNdWx0aWNoYW5uZWxDYXBhYmxlOwotCiAgICAgLy8gQ2FsbCBhZnRlciBjaGFuZ2luZyBlaXRoZXIgdGhlIGVuYWJsZWQgc3RhdHVzIG9mIGEgdHJhY2ssIG9yIHBhcmFtZXRlcnMgb2YgYW4gZW5hYmxlZCB0cmFjay4KICAgICAvLyBPSyB0byBjYWxsIG1vcmUgb2Z0ZW4gdGhhbiB0aGF0LCBidXQgdW5uZWNlc3NhcnkuCiAgICAgdm9pZCBpbnZhbGlkYXRlU3RhdGUodWludDMyX3QgbWFzayk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdFRyYWNrRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja051bSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzayk7CisgICAgYm9vbCBzZXRDaGFubmVsTWFza3MoaW50IG5hbWUsCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrLCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrKTsKKworICAgIC8vIFRPRE86IHJlbW92ZSB1bnVzZWQgdHJhY2tOYW1lL3RyYWNrTnVtIGZyb20gZnVuY3Rpb25zIGJlbG93LgorICAgIHN0YXRpYyBzdGF0dXNfdCBpbml0VHJhY2tEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSk7CiAgICAgc3RhdGljIHN0YXR1c190IHByZXBhcmVUcmFja0ZvckRvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOdW0pOwogICAgIHN0YXRpYyB2b2lkIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpOworICAgIHN0YXRpYyBzdGF0dXNfdCBwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja051bSk7CisgICAgc3RhdGljIHZvaWQgdW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpOworICAgIHN0YXRpYyB2b2lkIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHRyYWNrX3QqIHBUcmFjayk7CiAKICAgICBzdGF0aWMgdm9pZCB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwKICAgICAgICAgICAgIGludDMyX3QqIGF1eCk7CkBAIC0yODYsMTAgKzQwOCw2IEBACiAgICAgc3RhdGljIHZvaWQgcHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKTsKICAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cyk7Ci0jaWYgMAotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX1R3b1RyYWNrczE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMpOwotI2VuZGlmCiAKICAgICBzdGF0aWMgaW50NjRfdCBjYWxjdWxhdGVPdXRwdXRQVFMoY29uc3QgdHJhY2tfdCYgdCwgaW50NjRfdCBiYXNlUFRTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0RnJhbWVJbmRleCk7CkBAIC0yOTcsNiArNDE1LDUzIEBACiAgICAgc3RhdGljIHVpbnQ2NF90ICAgICAgICAgc0xvY2FsVGltZUZyZXE7CiAgICAgc3RhdGljIHB0aHJlYWRfb25jZV90ICAgc09uY2VDb250cm9sOwogICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIHNJbml0Um91dGluZSgpOworCisgICAgLyogbXVsdGktZm9ybWF0IHZvbHVtZSBtaXhpbmcgZnVuY3Rpb24gKGNhbGxzIHRlbXBsYXRlIGZ1bmN0aW9ucworICAgICAqIGluIEF1ZGlvTWl4ZXJPcHMuaCkuICBUaGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgYXMgZm9sbG93czoKKyAgICAgKgorICAgICAqICAgTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICAgICAqICAgVVNFRkxPQVRWT0wgKHNldCB0byB0cnVlIGlmIGZsb2F0IHZvbHVtZSBpcyB1c2VkKQorICAgICAqICAgQURKVVNUVk9MICAgKHNldCB0byB0cnVlIGlmIHZvbHVtZSByYW1wIHBhcmFtZXRlcnMgbmVlZHMgYWRqdXN0bWVudCBhZnRlcndhcmRzKQorICAgICAqICAgVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICAgICAqICAgVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAgICAgKiAgIFRBOiBpbnQzMl90IChRNC4yNykKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGJvb2wgVVNFRkxPQVRWT0wsIGJvb2wgQURKVVNUVk9MLAorICAgICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgorICAgIHN0YXRpYyB2b2lkIHZvbHVtZU1peChUTyAqb3V0LCBzaXplX3Qgb3V0RnJhbWVzLAorICAgICAgICAgICAgY29uc3QgVEkgKmluLCBUQSAqYXV4LCBib29sIHJhbXAsIEF1ZGlvTWl4ZXI6OnRyYWNrX3QgKnQpOworCisgICAgLy8gbXVsdGktZm9ybWF0IHByb2Nlc3MgaG9va3MKKyAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+CisgICAgc3RhdGljIHZvaWQgcHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2soc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKTsKKworICAgIC8vIG11bHRpLWZvcm1hdCB0cmFjayBob29rcworICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KKyAgICBzdGF0aWMgdm9pZCB0cmFja19fUmVzYW1wbGUodHJhY2tfdCogdCwgVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICBUTyogdGVtcCBfX3VudXNlZCwgVEEqIGF1eCk7CisgICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgorICAgIHN0YXRpYyB2b2lkIHRyYWNrX19Ob1Jlc2FtcGxlKHRyYWNrX3QqIHQsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgVE8qIHRlbXAgX191bnVzZWQsIFRBKiBhdXgpOworCisgICAgc3RhdGljIHZvaWQgY29udmVydE1peGVyRm9ybWF0KHZvaWQgKm91dCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQsCisgICAgICAgICAgICB2b2lkICppbiwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgc2l6ZV90IHNhbXBsZUNvdW50KTsKKworICAgIC8vIGhvb2sgdHlwZXMKKyAgICBlbnVtIHsKKyAgICAgICAgUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLAorICAgIH07CisgICAgZW51bSB7CisgICAgICAgIFRSQUNLVFlQRV9OT1AsCisgICAgICAgIFRSQUNLVFlQRV9SRVNBTVBMRSwKKyAgICAgICAgVFJBQ0tUWVBFX05PUkVTQU1QTEUsCisgICAgICAgIFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTywKKyAgICB9OworCisgICAgLy8gZnVuY3Rpb25zIGZvciBkZXRlcm1pbmluZyB0aGUgcHJvcGVyIHByb2Nlc3MgYW5kIHRyYWNrIGhvb2tzLgorICAgIHN0YXRpYyBwcm9jZXNzX2hvb2tfdCBnZXRQcm9jZXNzSG9vayhpbnQgcHJvY2Vzc1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0KTsKKyAgICBzdGF0aWMgaG9va190IGdldFRyYWNrSG9vayhpbnQgdHJhY2tUeXBlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCk7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlck9wcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXJPcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzM3NmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXJPcHMuaApAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19NSVhFUl9PUFNfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX01JWEVSX09QU19ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogQmVoYXZpb3Igb2YgaXNfc2FtZTw+Ojp2YWx1ZSBpcyB0cnVlIGlmIHRoZSB0eXBlcyBhcmUgaWRlbnRpY2FsLAorICogZmFsc2Ugb3RoZXJ3aXNlLiBJZGVudGljYWwgdG8gdGhlIFNUTCBzdGQ6OmlzX3NhbWUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzdHJ1Y3QgaXNfc2FtZQoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGlzX3NhbWU8VCwgVD4gIC8vIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCisKKy8qIE1peE11bCBpcyBhIG11bHRpcGxpY2F0aW9uIG9wZXJhdG9yIHRvIHNjYWxlIGFuIGF1ZGlvIGlucHV0IHNpZ25hbAorICogYnkgYSB2b2x1bWUgZ2Fpbiwgd2l0aCB0aGUgZm9ybXVsYToKKyAqCisgKiBPKHV0cHV0KSA9IEkobnB1dCkgKiBWKG9sdW1lKQorICoKKyAqIFRoZSBvdXRwdXQsIGlucHV0LCBhbmQgdm9sdW1lIG1heSBoYXZlIGRpZmZlcmVudCB0eXBlcy4KKyAqIFRoZXJlIGFyZSAyNyB2YXJpYW50cywgb2Ygd2hpY2ggMTQgYXJlIGFjdHVhbGx5IGRlZmluZWQgaW4gYW4KKyAqIGV4cGxpY2l0bHkgdGVtcGxhdGVkIGNsYXNzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgdHlwZSB2YXJpYWJsZXMgYW5kIHRoZSB1bmRlcmx5aW5nIG1lYW5pbmc6CisgKgorICogT3V0cHV0IHR5cGUgICAgICAgVE86IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRLjE1KSBvciBmbG9hdCBbLTEsMV0KKyAqIElucHV0IHNpZ25hbCB0eXBlIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUS4xNSkgb3IgZmxvYXQgWy0xLDFdCisgKiBWb2x1bWUgdHlwZSAgICAgICBUVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdCBbLTEsMV0KKyAqCisgKiBGb3IgaGlnaCBwcmVjaXNpb24gYXVkaW8sIG9ubHkgdGhlIDxUTywgVEksIFRWPiA9IDxmbG9hdCwgZmxvYXQsIGZsb2F0PgorICogbmVlZHMgdG8gYmUgYWNjZWxlcmF0ZWQuIFRoaXMgaXMgcGVyaGFwcyB0aGUgZWFzaWVzdCBmb3JtIHRvIGRvIHF1aWNrbHkgYXMgd2VsbC4KKyAqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUVj4KK2lubGluZSBUTyBNaXhNdWwoVEkgdmFsdWUsIFRWIHZvbHVtZSkgeworICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoZmFsc2UpOworICAgIC8vIHNob3VsZCBub3QgYmUgaGVyZSA6LSkuCisgICAgLy8gVG8gYXZvaWQgbWlzdGFrZXMsIHRoaXMgdGVtcGxhdGUgaXMgYWx3YXlzIHNwZWNpYWxpemVkLgorICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQzMl90IE1peE11bDxpbnQzMl90LCBpbnQxNl90LCBpbnQxNl90PihpbnQxNl90IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQzMl90IE1peE11bDxpbnQzMl90LCBpbnQzMl90LCBpbnQxNl90PihpbnQzMl90IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHJldHVybiAodmFsdWUgPj4gMTIpICogdm9sdW1lOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDMyX3QgTWl4TXVsPGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+KGludDE2X3QgdmFsdWUsIGludDMyX3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuIHZhbHVlICogKHZvbHVtZSA+PiAxNik7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MzJfdCBNaXhNdWw8aW50MzJfdCwgaW50MzJfdCwgaW50MzJfdD4oaW50MzJfdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gKHZhbHVlID4+IDEyKSAqICh2b2x1bWUgPj4gMTYpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGZsb2F0IE1peE11bDxmbG9hdCwgZmxvYXQsIGludDE2X3Q+KGZsb2F0IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBub3JtID0gMS4gLyAoMSA8PCAxMik7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lICogbm9ybTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBmbG9hdCBNaXhNdWw8ZmxvYXQsIGZsb2F0LCBpbnQzMl90PihmbG9hdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbm9ybSA9IDEuIC8gKDEgPDwgMjgpOworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZSAqIG5vcm07Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MTZfdCBNaXhNdWw8aW50MTZfdCwgZmxvYXQsIGludDE2X3Q+KGZsb2F0IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHJldHVybiBjbGFtcDE2X2Zyb21fZmxvYXQoTWl4TXVsPGZsb2F0LCBmbG9hdCwgaW50MTZfdD4odmFsdWUsIHZvbHVtZSkpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGZsb2F0LCBpbnQzMl90PihmbG9hdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gY2xhbXAxNl9mcm9tX2Zsb2F0KE1peE11bDxmbG9hdCwgZmxvYXQsIGludDMyX3Q+KHZhbHVlLCB2b2x1bWUpKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBmbG9hdCBNaXhNdWw8ZmxvYXQsIGludDE2X3QsIGludDE2X3Q+KGludDE2X3QgdmFsdWUsIGludDE2X3Qgdm9sdW1lKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG5vcm0gPSAxLiAvICgxIDw8ICgxNSArIDEyKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkgKiBzdGF0aWNfY2FzdDxmbG9hdD4odm9sdW1lKSAqIG5vcm07Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgZmxvYXQgTWl4TXVsPGZsb2F0LCBpbnQxNl90LCBpbnQzMl90PihpbnQxNl90IHZhbHVlLCBpbnQzMl90IHZvbHVtZSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBub3JtID0gMS4gLyAoMVVMTCA8PCAoMTUgKyAyOCkpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZvbHVtZSkgKiBub3JtOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGludDE2X3QsIGludDE2X3Q+KGludDE2X3QgdmFsdWUsIGludDE2X3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuIGNsYW1wMTYoTWl4TXVsPGludDMyX3QsIGludDE2X3QsIGludDE2X3Q+KHZhbHVlLCB2b2x1bWUpID4+IDEyKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBpbnQzMl90LCBpbnQxNl90PihpbnQzMl90IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHJldHVybiBjbGFtcDE2KE1peE11bDxpbnQzMl90LCBpbnQzMl90LCBpbnQxNl90Pih2YWx1ZSwgdm9sdW1lKSA+PiAxMik7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MTZfdCBNaXhNdWw8aW50MTZfdCwgaW50MTZfdCwgaW50MzJfdD4oaW50MTZfdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gY2xhbXAxNihNaXhNdWw8aW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD4odmFsdWUsIHZvbHVtZSkgPj4gMTIpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGludDMyX3QsIGludDMyX3Q+KGludDMyX3QgdmFsdWUsIGludDMyX3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuIGNsYW1wMTYoTWl4TXVsPGludDMyX3QsIGludDMyX3QsIGludDMyX3Q+KHZhbHVlLCB2b2x1bWUpID4+IDEyKTsKK30KKworLyogUmVxdWlyZWQgZm9yIGZsb2F0aW5nIHBvaW50IHZvbHVtZS4gIFNvbWUgYXJlIG5lZWRlZCBmb3IgY29tcGlsYXRpb24gYnV0CisgKiBhcmUgbm90IG5lZWRlZCBpbiBleGVjdXRpb24gYW5kIHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGZpbmFsIGJ1aWxkIGJ5CisgKiBhbiBvcHRpbWl6aW5nIGNvbXBpbGVyLgorICovCit0ZW1wbGF0ZSA8PgoraW5saW5lIGZsb2F0IE1peE11bDxmbG9hdCwgZmxvYXQsIGZsb2F0PihmbG9hdCB2YWx1ZSwgZmxvYXQgdm9sdW1lKSB7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGZsb2F0IE1peE11bDxmbG9hdCwgaW50MTZfdCwgZmxvYXQ+KGludDE2X3QgdmFsdWUsIGZsb2F0IHZvbHVtZSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBmbG9hdF9mcm9tX3FfMTUgPSAxLiAvICgxIDw8IDE1KTsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWUgKiBmbG9hdF9mcm9tX3FfMTU7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MzJfdCBNaXhNdWw8aW50MzJfdCwgaW50MzJfdCwgZmxvYXQ+KGludDMyX3QgdmFsdWUsIGZsb2F0IHZvbHVtZSkgeworICAgIExPR19BTFdBWVNfRkFUQUwoIk1peE11bDxpbnQzMl90LCBpbnQzMl90LCBmbG9hdD4gUnVudGltZSBTaG91bGQgbm90IGJlIGhlcmUiKTsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWU7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MzJfdCBNaXhNdWw8aW50MzJfdCwgaW50MTZfdCwgZmxvYXQ+KGludDE2X3QgdmFsdWUsIGZsb2F0IHZvbHVtZSkgeworICAgIExPR19BTFdBWVNfRkFUQUwoIk1peE11bDxpbnQzMl90LCBpbnQxNl90LCBmbG9hdD4gUnVudGltZSBTaG91bGQgbm90IGJlIGhlcmUiKTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgdTRfMTJfZnJvbV9mbG9hdCA9ICgxIDw8IDEyKTsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWUgKiB1NF8xMl9mcm9tX2Zsb2F0OworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGludDE2X3QsIGZsb2F0PihpbnQxNl90IHZhbHVlLCBmbG9hdCB2b2x1bWUpIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJNaXhNdWw8aW50MTZfdCwgaW50MTZfdCwgZmxvYXQ+IFJ1bnRpbWUgU2hvdWxkIG5vdCBiZSBoZXJlIik7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGZsb2F0LCBmbG9hdD4oZmxvYXQgdmFsdWUsIGZsb2F0IHZvbHVtZSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBxXzE1X2Zyb21fZmxvYXQgPSAoMSA8PCAxNSk7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lICogcV8xNV9mcm9tX2Zsb2F0OworfQorCisvKgorICogTWl4QWNjdW0gaXMgdXNlZCB0byBhZGQgaW50byBhbiBhY2N1bXVsYXRvciByZWdpc3RlciBvZiBhIHBvc3NpYmx5IGRpZmZlcmVudAorICogdHlwZS4gVGhlIFRPIGFuZCBUSSB0eXBlcyBhcmUgdGhlIHNhbWUgYXMgTWl4TXVsLgorICovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEk+CitpbmxpbmUgdm9pZCBNaXhBY2N1bShUTyAqYXV4YWNjdW0sIFRJIHZhbHVlKSB7CisgICAgaWYgKCFpc19zYW1lPFRPLCBUST46OnZhbHVlKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIk1peEFjY3VtIHR5cGUgbm90IHByb3Blcmx5IHNwZWNpYWxpemVkOiAlenUgJXp1XG4iLAorICAgICAgICAgICAgICAgIHNpemVvZihUTyksIHNpemVvZihUSSkpOworICAgIH0KKyAgICAqYXV4YWNjdW0gKz0gdmFsdWU7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB2b2lkIE1peEFjY3VtPGZsb2F0LCBpbnQxNl90PihmbG9hdCAqYXV4YWNjdW0sIGludDE2X3QgdmFsdWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbm9ybSA9IDEuIC8gKDEgPDwgMTUpOworICAgICphdXhhY2N1bSArPSBub3JtICogdmFsdWU7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB2b2lkIE1peEFjY3VtPGZsb2F0LCBpbnQzMl90PihmbG9hdCAqYXV4YWNjdW0sIGludDMyX3QgdmFsdWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbm9ybSA9IDEuIC8gKDEgPDwgMjcpOworICAgICphdXhhY2N1bSArPSBub3JtICogdmFsdWU7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB2b2lkIE1peEFjY3VtPGludDMyX3QsIGludDE2X3Q+KGludDMyX3QgKmF1eGFjY3VtLCBpbnQxNl90IHZhbHVlKSB7CisgICAgKmF1eGFjY3VtICs9IHZhbHVlIDw8IDEyOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCBNaXhBY2N1bTxpbnQzMl90LCBmbG9hdD4oaW50MzJfdCAqYXV4YWNjdW0sIGZsb2F0IHZhbHVlKSB7CisgICAgKmF1eGFjY3VtICs9IGNsYW1wcTRfMjdfZnJvbV9mbG9hdCh2YWx1ZSk7Cit9CisKKy8qIE1peE11bEF1eCBpcyBqdXN0IGxpa2UgTWl4TXVsIGV4Y2VwdCBpdCBjb21iaW5lcyB3aXRoCisgKiBhbiBhY2N1bXVsYXRvciBvcGVyYXRpb24gTWl4QWNjdW0uCisgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBPgoraW5saW5lIFRPIE1peE11bEF1eChUSSB2YWx1ZSwgVFYgdm9sdW1lLCBUQSAqYXV4YWNjdW0pIHsKKyAgICBNaXhBY2N1bTxUQSwgVEk+KGF1eGFjY3VtLCB2YWx1ZSk7CisgICAgcmV0dXJuIE1peE11bDxUTywgVEksIFRWPih2YWx1ZSwgdm9sdW1lKTsKK30KKworLyogTUlYVFlQRSBpcyB1c2VkIHRvIGRldGVybWluZSBob3cgdGhlIHNhbXBsZXMgaW4gdGhlIGlucHV0IGZyYW1lCisgKiBhcmUgbWl4ZWQgd2l0aCB2b2x1bWUgZ2FpbiBpbnRvIHRoZSBvdXRwdXQgZnJhbWUuCisgKiBTZWUgdGhlIHZvbHVtZVJhbXBNdWx0aSBmdW5jdGlvbnMgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworZW51bSB7CisgICAgTUlYVFlQRV9NVUxUSSwKKyAgICBNSVhUWVBFX01PTk9FWFBBTkQsCisgICAgTUlYVFlQRV9NVUxUSV9TQVZFT05MWSwKKyAgICBNSVhUWVBFX01VTFRJX01PTk9WT0wsCisgICAgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MLAorfTsKKworLyoKKyAqIFRoZSB2b2x1bWVSYW1wTXVsdGkgYW5kIHZvbHVtZVJhbXAgZnVuY3Rpb25zIHRha2UgYSBNSVhUWVBFCisgKiB3aGljaCBpbmRpY2F0ZXMgdGhlIHBlci1mcmFtZSBtaXhpbmcgYW5kIGFjY3VtdWxhdGlvbiBzdHJhdGVneS4KKyAqCisgKiBNSVhUWVBFX01VTFRJOgorICogICBOQ0hBTiByZXByZXNlbnRzIG51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWxzLgorICogICBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiAgIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiAgIFRWOiBpbnQzMl90IChVNC4yOCkgb3IgaW50MTZfdCAoVTQuMTIpIG9yIGZsb2F0CisgKiAgIHZvbDogcmVwcmVzZW50cyBhIHZvbHVtZSBhcnJheS4KKyAqCisgKiAgIFRoaXMgYWNjdW11bGF0ZXMgaW50byB0aGUgb3V0IHBvaW50ZXIuCisgKgorICogTUlYVFlQRV9NT05PRVhQQU5EOgorICogICBTaW5nbGUgaW5wdXQgY2hhbm5lbC4gTkNIQU4gcmVwcmVzZW50cyBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLgorICogICBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiAgIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiAgIFRWOiBpbnQzMl90IChVNC4yOCkgb3IgaW50MTZfdCAoVTQuMTIpIG9yIGZsb2F0CisgKiAgIElucHV0IGNoYW5uZWwgY291bnQgaXMgMS4KKyAqICAgdm9sOiByZXByZXNlbnRzIHZvbHVtZSBhcnJheS4KKyAqCisgKiAgIFRoaXMgYWNjdW11bGF0ZXMgaW50byB0aGUgb3V0IHBvaW50ZXIuCisgKgorICogTUlYVFlQRV9NVUxUSV9TQVZFT05MWToKKyAqICAgTkNIQU4gcmVwcmVzZW50cyBudW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBjaGFubmVscy4KKyAqICAgVE86IGludDE2X3QgKFEuMTUpIG9yIGZsb2F0CisgKiAgIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiAgIFRWOiBpbnQzMl90IChVNC4yOCkgb3IgaW50MTZfdCAoVTQuMTIpIG9yIGZsb2F0CisgKiAgIHZvbDogcmVwcmVzZW50cyBhIHZvbHVtZSBhcnJheS4KKyAqCisgKiAgIE1JWFRZUEVfTVVMVElfU0FWRU9OTFkgZG9lcyBub3QgYWNjdW11bGF0ZSBpbnRvIHRoZSBvdXQgcG9pbnRlci4KKyAqCisgKiBNSVhUWVBFX01VTFRJX01PTk9WT0w6CisgKiAgIFNhbWUgYXMgTUlYVFlQRV9NVUxUSSwgYnV0IHVzZXMgb25seSB2b2x1bWVbMF0uCisgKgorICogTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MOgorICogICBTYW1lIGFzIE1JWFRZUEVfTVVMVElfU0FWRU9OTFksIGJ1dCB1c2VzIG9ubHkgdm9sdW1lWzBdLgorICoKKyAqLworCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGludCBOQ0hBTiwKKyAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUViwgdHlwZW5hbWUgVEEsIHR5cGVuYW1lIFRBVj4KK2lubGluZSB2b2lkIHZvbHVtZVJhbXBNdWx0aShUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgY29uc3QgVEkqIGluLCBUQSogYXV4LCBUViAqdm9sLCBjb25zdCBUViAqdm9saW5jLCBUQVYgKnZvbGEsIFRBViB2b2xhaW5jKQoreworI2lmZGVmIEFMT0dWVgorICAgIEFMT0dWVigidm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFOiVkXG4iLCBNSVhUWVBFKTsKKyNlbmRpZgorICAgIGlmIChhdXggIT0gTlVMTCkgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBUQSBhdXhhY2N1bSA9IDA7CisgICAgICAgICAgICBzd2l0Y2ggKE1JWFRZUEUpIHsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFtpXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICAgICAgdm9sW2ldICs9IHZvbGluY1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTU9OT0VYUEFORDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluLCB2b2xbaV0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfU0FWRU9OTFk6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFtpXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICAgICAgdm9sW2ldICs9IHZvbGluY1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfTU9OT1ZPTDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFswXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdm9sWzBdICs9IHZvbGluY1swXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbMF0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZvbFswXSArPSB2b2xpbmNbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgbWl4dHlwZSAlZCIsIE1JWFRZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV4YWNjdW0gLz0gTkNIQU47CisgICAgICAgICAgICAqYXV4KysgKz0gTWl4TXVsPFRBLCBUQSwgVEFWPihhdXhhY2N1bSwgKnZvbGEpOworICAgICAgICAgICAgdm9sYVswXSArPSB2b2xhaW5jOworICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN3aXRjaCAoTUlYVFlQRSkgeworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbaV0pOworICAgICAgICAgICAgICAgICAgICB2b2xbaV0gKz0gdm9saW5jW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NT05PRVhQQU5EOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbiwgdm9sW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgdm9sW2ldICs9IHZvbGluY1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbaV0pOworICAgICAgICAgICAgICAgICAgICB2b2xbaV0gKz0gdm9saW5jW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2b2xbMF0gKz0gdm9saW5jWzBdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bDxUTywgVEksIFRWPigqaW4rKywgdm9sWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdm9sWzBdICs9IHZvbGluY1swXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBtaXh0eXBlICVkIiwgTUlYVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGludCBOQ0hBTiwKKyAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUViwgdHlwZW5hbWUgVEEsIHR5cGVuYW1lIFRBVj4KK2lubGluZSB2b2lkIHZvbHVtZU11bHRpKFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBjb25zdCBUSSogaW4sIFRBKiBhdXgsIGNvbnN0IFRWICp2b2wsIFRBViB2b2xhKQoreworI2lmZGVmIEFMT0dWVgorICAgIEFMT0dWVigidm9sdW1lTXVsdGkgTUlYVFlQRTolZFxuIiwgTUlYVFlQRSk7CisjZW5kaWYKKyAgICBpZiAoYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgVEEgYXV4YWNjdW0gPSAwOworICAgICAgICAgICAgc3dpdGNoIChNSVhUWVBFKSB7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVEk6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbaV0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01PTk9FWFBBTkQ6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbiwgdm9sW2ldLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbaV0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbMF0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFswXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgbWl4dHlwZSAlZCIsIE1JWFRZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV4YWNjdW0gLz0gTkNIQU47CisgICAgICAgICAgICAqYXV4KysgKz0gTWl4TXVsPFRBLCBUQSwgVEFWPihhdXhhY2N1bSwgdm9sYSk7CisgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3dpdGNoIChNSVhUWVBFKSB7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVEk6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01PTk9FWFBBTkQ6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluLCB2b2xbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFswXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bDxUTywgVEksIFRWPigqaW4rKywgdm9sWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgbWl4dHlwZSAlZCIsIE1JWFRZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgIH0KK30KKworfTsKKworI2VuZGlmIC8qIEFORFJPSURfQVVESU9fTUlYRVJfT1BTX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDUyYzguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5U2VydmljZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKLSN1bmRlZiBfX1NUUklDVF9BTlNJX18KLSNkZWZpbmUgX19TVERJTlRfTElNSVRTCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgotI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9wb3dlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvUG9saWN5U2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKLXN0YXRpYyBjb25zdCBjaGFyIGtDbWREZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIGNvbW1hbmQgdGhyZWFkIG1heSBiZSBkZWFkbG9ja2VkXG4iOwotCi1zdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKLXN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXBVcyA9IDIwMDAwOwotCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrQXVkaW9Db21tYW5kVGltZW91dCA9IDMwMDAwMDAwMDBMTDsgLy8gMyBzZWNvbmRzCi0KLW5hbWVzcGFjZSB7Ci0gICAgZXh0ZXJuIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgYXBzX29wczsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeVNlcnZpY2UoKQotICAgIDogQm5BdWRpb1BvbGljeVNlcnZpY2UoKSAsIG1wQXVkaW9Qb2xpY3lEZXYoTlVMTCkgLCBtcEF1ZGlvUG9saWN5KE5VTEwpCi17Ci0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGNvbnN0IHN0cnVjdCBod19tb2R1bGVfdCAqbW9kdWxlOwotICAgIGludCBmb3JjZWRfdmFsOwotICAgIGludCByYzsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICAvLyBzdGFydCB0b25lIHBsYXliYWNrIHRocmVhZAotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbVRvbmUiKSwgdGhpcyk7Ci0gICAgLy8gc3RhcnQgYXVkaW8gY29tbWFuZHMgdGhyZWFkCi0gICAgbUF1ZGlvQ29tbWFuZFRocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtQXVkaW8iKSwgdGhpcyk7Ci0gICAgLy8gc3RhcnQgb3V0cHV0IGFjdGl2aXR5IGNvbW1hbmQgdGhyZWFkCi0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbU91dHB1dCIpLCB0aGlzKTsKLSAgICAvKiBpbnN0YW50aWF0ZSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgKi8KLSAgICByYyA9IGh3X2dldF9tb2R1bGUoQVVESU9fUE9MSUNZX0hBUkRXQVJFX01PRFVMRV9JRCwgJm1vZHVsZSk7Ci0gICAgaWYgKHJjKQotICAgICAgICByZXR1cm47Ci0KLSAgICByYyA9IGF1ZGlvX3BvbGljeV9kZXZfb3Blbihtb2R1bGUsICZtcEF1ZGlvUG9saWN5RGV2KTsKLSAgICBBTE9HRV9JRihyYywgImNvdWxkbid0IG9wZW4gYXVkaW8gcG9saWN5IGRldmljZSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgaWYgKHJjKQotICAgICAgICByZXR1cm47Ci0KLSAgICByYyA9IG1wQXVkaW9Qb2xpY3lEZXYtPmNyZWF0ZV9hdWRpb19wb2xpY3kobXBBdWRpb1BvbGljeURldiwgJmFwc19vcHMsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtcEF1ZGlvUG9saWN5KTsKLSAgICBBTE9HRV9JRihyYywgImNvdWxkbid0IGNyZWF0ZSBhdWRpbyBwb2xpY3kgKCVzKSIsIHN0cmVycm9yKC1yYykpOwotICAgIGlmIChyYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcmMgPSBtcEF1ZGlvUG9saWN5LT5pbml0X2NoZWNrKG1wQXVkaW9Qb2xpY3kpOwotICAgIEFMT0dFX0lGKHJjLCAiY291bGRuJ3QgaW5pdF9jaGVjayB0aGUgYXVkaW8gcG9saWN5ICglcykiLCBzdHJlcnJvcigtcmMpKTsKLSAgICBpZiAocmMpCi0gICAgICAgIHJldHVybjsKLQotICAgIEFMT0dJKCJMb2FkZWQgYXVkaW8gcG9saWN5IGZyb20gJXMgKCVzKSIsIG1vZHVsZS0+bmFtZSwgbW9kdWxlLT5pZCk7Ci0KLSAgICAvLyBsb2FkIGF1ZGlvIHByZSBwcm9jZXNzaW5nIG1vZHVsZXMKLSAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgbG9hZFByZVByb2Nlc3NvckNvbmZpZyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFKTsKLSAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICBsb2FkUHJlUHJvY2Vzc29yQ29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKLSAgICB9Ci19Ci0KLUF1ZGlvUG9saWN5U2VydmljZTo6fkF1ZGlvUG9saWN5U2VydmljZSgpCi17Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZXhpdCgpOwotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQuY2xlYXIoKTsKLSAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5leGl0KCk7Ci0gICAgbUF1ZGlvQ29tbWFuZFRocmVhZC5jbGVhcigpOwotCi0KLSAgICAvLyByZWxlYXNlIGF1ZGlvIHByZSBwcm9jZXNzaW5nIHJlc291cmNlcwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0U291cmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBkZWxldGUgbUlucHV0U291cmNlcy52YWx1ZUF0KGkpOwotICAgIH0KLSAgICBtSW5wdXRTb3VyY2VzLmNsZWFyKCk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUlucHV0cy52YWx1ZUF0KGkpLT5tRWZmZWN0cy5jbGVhcigpOwotICAgICAgICBkZWxldGUgbUlucHV0cy52YWx1ZUF0KGkpOwotICAgIH0KLSAgICBtSW5wdXRzLmNsZWFyKCk7Ci0KLSAgICBpZiAobXBBdWRpb1BvbGljeSAhPSBOVUxMICYmIG1wQXVkaW9Qb2xpY3lEZXYgIT0gTlVMTCkKLSAgICAgICAgbXBBdWRpb1BvbGljeURldi0+ZGVzdHJveV9hdWRpb19wb2xpY3kobXBBdWRpb1BvbGljeURldiwgbXBBdWRpb1BvbGljeSk7Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3lEZXYgIT0gTlVMTCkKLSAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9jbG9zZShtcEF1ZGlvUG9saWN5RGV2KTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmIChzdGF0ZSAhPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSAmJgotICAgICAgICAgICAgc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9kZXZpY2VfY29ubmVjdGlvbl9zdGF0ZShtcEF1ZGlvUG9saWN5LCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MpOwotfQotCi1hdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBpZiAodWludDMyX3Qoc3RhdGUpID49IEFVRElPX01PREVfQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgQUxPR1YoInNldFBob25lU3RhdGUoKSIpOwotCi0gICAgLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgbW9yZSBhcHByb3ByaWF0ZSB0byBkbyBpdCBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBwb2xpY3kgbWFuYWdlcgotICAgIEF1ZGlvU3lzdGVtOjpzZXRNb2RlKHN0YXRlKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbXBBdWRpb1BvbGljeS0+c2V0X3Bob25lX3N0YXRlKG1wQXVkaW9Qb2xpY3ksIHN0YXRlKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoY29uZmlnIDwgMCB8fCBjb25maWcgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX0NGR19DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQUxPR1YoInNldEZvcmNlVXNlKCkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wQXVkaW9Qb2xpY3ktPnNldF9mb3JjZV91c2UobXBBdWRpb1BvbGljeSwgdXNhZ2UsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1hdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9OT05FOwotICAgIH0KLSAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9mb3JjZV91c2UobXBBdWRpb1BvbGljeSwgdXNhZ2UpOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCi17Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQUxPR1YoImdldE91dHB1dCgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X291dHB1dChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCi17Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBBTE9HVigic3RhcnRPdXRwdXQoKSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0YXJ0X291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCi17Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBBTE9HVigic3RvcE91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKLXsKLSAgICBBTE9HVigiZG9TdG9wT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0b3Bfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKG91dHB1dCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIEFMT0dWKCJkb1JlbGVhc2VPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtcEF1ZGlvUG9saWN5LT5yZWxlYXNlX291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQpOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8vIGFscmVhZHkgY2hlY2tlZCBieSBjbGllbnQsIGJ1dCBkb3VibGUtY2hlY2sgaW4gY2FzZSB0aGUgY2xpZW50IHdyYXBwZXIgaXMgYnlwYXNzZWQKLSAgICBpZiAoaW5wdXRTb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCAmJiBpbnB1dFNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAvLyB0aGUgYXVkaW9faW5fYWNvdXN0aWNzX3QgcGFyYW1ldGVyIGlzIGlnbm9yZWQgYnkgZ2V0X2lucHV0KCkKLSAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IG1wQXVkaW9Qb2xpY3ktPmdldF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgKGF1ZGlvX2luX2Fjb3VzdGljc190KSAwKTsKLQotICAgIGlmIChpbnB1dCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0gICAgLy8gY3JlYXRlIGF1ZGlvIHByZSBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBpbnB1dCBzb3VyY2UKLSAgICBhdWRpb19zb3VyY2VfdCBhbGlhc1NvdXJjZSA9IChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIDogaW5wdXRTb3VyY2U7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0U291cmNlcy5pbmRleE9mS2V5KGFsaWFzU291cmNlKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0gICAgc3NpemVfdCBpZHggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIElucHV0RGVzYyAqaW5wdXREZXNjOwotICAgIGlmIChpZHggPCAwKSB7Ci0gICAgICAgIGlucHV0RGVzYyA9IG5ldyBJbnB1dERlc2MoYXVkaW9TZXNzaW9uKTsKLSAgICAgICAgbUlucHV0cy5hZGQoaW5wdXQsIGlucHV0RGVzYyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGlkeCk7Ci0gICAgfQotCi0gICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKLSAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KE5VTEwsICZlZmZlY3QtPm1VdWlkLCAtMSwgMCwgMCwgYXVkaW9TZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZ4LT5pbml0Q2hlY2soKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gY3JlYXRlIEZ4ICVzIG9uIGlucHV0ICVkIiwgZWZmZWN0LT5tTmFtZSwgaW5wdXQpOwotICAgICAgICAgICAgLy8gZnggZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIHN0cm9uZyByZWYgb24gQXVkaW9FZmZlY3QgaXMgcmVsZWFzZWQKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZWZmZWN0LT5tUGFyYW1zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBmeC0+c2V0UGFyYW1ldGVyKGVmZmVjdC0+bVBhcmFtc1tqXSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5wdXREZXNjLT5tRWZmZWN0cy5hZGQoZngpOwotICAgIH0KLSAgICBzZXRQcmVQcm9jZXNzb3JFbmFibGVkKGlucHV0RGVzYywgdHJ1ZSk7Ci0gICAgcmV0dXJuIGlucHV0OwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdGFydF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RvcF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbXBBdWRpb1BvbGljeS0+cmVsZWFzZV9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSW5wdXREZXNjICppbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIHNldFByZVByb2Nlc3NvckVuYWJsZWQoaW5wdXREZXNjLCBmYWxzZSk7Ci0gICAgZGVsZXRlIGlucHV0RGVzYzsKLSAgICBtSW5wdXRzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbXBBdWRpb1BvbGljeS0+aW5pdF9zdHJlYW1fdm9sdW1lKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKG1wQXVkaW9Qb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UpIHsKLSAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UobXBBdWRpb1BvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXgobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleCk7Ci0gICAgfQotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyYXRlZ3lfZm9yX3N0cmVhbShtcEF1ZGlvUG9saWN5LCBzdHJlYW0pOwotfQotCi0vL2F1ZGlvIHBvbGljeTogdXNlIGF1ZGlvX2RldmljZV90IGFwcHJvcHJpYXRlbHkKLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KTA7Ci0gICAgfQotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9kZXZpY2VzX2Zvcl9zdHJlYW0obXBBdWRpb1BvbGljeSwgc3RyZWFtKTsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfb3V0cHV0X2Zvcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgZGVzYyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5yZWdpc3Rlcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnVucmVnaXN0ZXJfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGlkKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfZWZmZWN0X2VuYWJsZWQobXBBdWRpb1BvbGljeSwgaWQsIGVuYWJsZWQpOwotfQotCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAotewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfc3RyZWFtX2FjdGl2ZShtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluUGFzdE1zKTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX3N0cmVhbV9hY3RpdmVfcmVtb3RlbHkobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpblBhc3RNcyk7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Ci17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChtcEF1ZGlvUG9saWN5LT5pc19zb3VyY2VfYWN0aXZlID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19zb3VyY2VfYWN0aXZlKG1wQXVkaW9Qb2xpY3ksIHNvdXJjZSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhpbnQgYXVkaW9TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKLXsKLQotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgKmNvdW50ID0gMDsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICBzaXplX3QgaW5kZXg7Ci0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbUlucHV0cy5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgaWYgKG1JbnB1dHMudmFsdWVBdChpbmRleCktPm1TZXNzaW9uSWQgPT0gYXVkaW9TZXNzaW9uKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaW5kZXggPT0gbUlucHV0cy5zaXplKCkpIHsKLSAgICAgICAgKmNvdW50ID0gMDsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgVmVjdG9yPCBzcDxBdWRpb0VmZmVjdD4gPiBlZmZlY3RzID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0gZWZmZWN0c1tpXS0+ZGVzY3JpcHRvcigpOwotICAgICAgICBpZiAoaSA8ICpjb3VudCkgewotICAgICAgICAgICAgZGVzY3JpcHRvcnNbaV0gPSBkZXNjOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChlZmZlY3RzLnNpemUoKSA+ICpjb3VudCkgewotICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7Ci0gICAgfQotICAgICpjb3VudCA9IGVmZmVjdHMuc2l6ZSgpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKLSAgICBBTE9HVygiYmluZGVyRGllZCgpICVwLCBjYWxsaW5nIHBpZCAlZCIsIHdoby51bnNhZmVfZ2V0KCksCi0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwotfQotCi1zdGF0aWMgYm9vbCB0cnlMb2NrKE11dGV4JiBtdXRleCkKLXsKLSAgICBib29sIGxvY2tlZCA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7Ci0gICAgICAgIGlmIChtdXRleC50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXBVcyk7Ci0gICAgfQotICAgIHJldHVybiBsb2NrZWQ7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcEludGVybmFscyhpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQb2xpY3lNYW5hZ2VyIEludGVyZmFjZTogJXBcbiIsIG1wQXVkaW9Qb2xpY3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDb21tYW5kIFRocmVhZDogJXBcbiIsIG1BdWRpb0NvbW1hbmRUaHJlYWQuZ2V0KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJUb25lcyBUaHJlYWQ6ICVwXG4iLCBtVG9uZVBsYXliYWNrVGhyZWFkLmdldCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgaWYgKCFkdW1wQWxsb3dlZCgpKSB7Ci0gICAgICAgIGR1bXBQZXJtaXNzaW9uRGVuaWFsKGZkKTsKLSAgICB9IGVsc2UgewotICAgICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobUxvY2spOwotICAgICAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICAgICAgU3RyaW5nOCByZXN1bHQoa0RlYWRsb2NrZWRTdHJpbmcpOwotICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkdW1wSW50ZXJuYWxzKGZkKTsKLSAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRUaHJlYWQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZHVtcChmZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Ub25lUGxheWJhY2tUaHJlYWQgIT0gMCkgewotICAgICAgICAgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZHVtcChmZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobXBBdWRpb1BvbGljeSkgewotICAgICAgICAgICAgbXBBdWRpb1BvbGljeS0+ZHVtcChtcEF1ZGlvUG9saWN5LCBmZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQZXJtaXNzaW9uIERlbmlhbDogIgotICAgICAgICAgICAgImNhbid0IGR1bXAgQXVkaW9Qb2xpY3lTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCi0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCi0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQcmVQcm9jZXNzb3JFbmFibGVkKGNvbnN0IElucHV0RGVzYyAqaW5wdXREZXNjLCBib29sIGVuYWJsZWQpCi17Ci0gICAgY29uc3QgVmVjdG9yPHNwPEF1ZGlvRWZmZWN0PiA+ICZmeFZlY3RvciA9IGlucHV0RGVzYy0+bUVmZmVjdHM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmeFZlY3Rvci5zaXplKCk7IGkrKykgewotICAgICAgICBmeFZlY3Rvci5pdGVtQXQoaSktPnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uVHJhbnNhY3QoCi0gICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgcmV0dXJuIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0gIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KLQotQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OkF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4IG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UpCi0gICAgOiBUaHJlYWQoZmFsc2UpLCBtTmFtZShuYW1lKSwgbVNlcnZpY2Uoc2VydmljZSkKLXsKLSAgICBtcFRvbmVHZW5lcmF0b3IgPSBOVUxMOwotfQotCi0KLUF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp+QXVkaW9Db21tYW5kVGhyZWFkKCkKLXsKLSAgICBpZiAoIW1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgewotICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7Ci0gICAgfQotICAgIG1BdWRpb0NvbW1hbmRzLmNsZWFyKCk7Ci0gICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6b25GaXJzdFJlZigpCi17Ci0gICAgcnVuKG1OYW1lLnN0cmluZygpLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dGhyZWFkTG9vcCgpCi17Ci0gICAgbnNlY3NfdCB3YWl0VGltZSA9IElOVDY0X01BWDsKLQotICAgIG1Mb2NrLmxvY2soKTsKLSAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCi0gICAgewotICAgICAgICB3aGlsZSAoIW1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbnNlY3NfdCBjdXJUaW1lID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgLy8gY29tbWFuZHMgYXJlIHNvcnRlZCBieSBpbmNyZWFzaW5nIHRpbWUgc3RhbXA6IGV4ZWN1dGUgdGhlbSBmcm9tIGluZGV4IDAgYW5kIHVwCi0gICAgICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZHNbMF0tPm1UaW1lIDw9IGN1clRpbWUpIHsKLSAgICAgICAgICAgICAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBtQXVkaW9Db21tYW5kc1swXTsKLSAgICAgICAgICAgICAgICBtQXVkaW9Db21tYW5kcy5yZW1vdmVBdCgwKTsKLSAgICAgICAgICAgICAgICBtTGFzdENvbW1hbmQgPSAqY29tbWFuZDsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZC0+bUNvbW1hbmQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVJUX1RPTkU6IHsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIFRvbmVEYXRhICpkYXRhID0gKFRvbmVEYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdGFydCB0b25lICVkIG9uIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVR5cGUsIGRhdGEtPm1TdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwotICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3IgPSBuZXcgVG9uZUdlbmVyYXRvcihkYXRhLT5tU3RyZWFtLCAxLjApOwotICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3ItPnN0YXJ0VG9uZShkYXRhLT5tVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhOwotICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUT1BfVE9ORTogewotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCB0b25lIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtcFRvbmVHZW5lcmF0b3IgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdG9wVG9uZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7Ci0gICAgICAgICAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvbHVtZSBzdHJlYW0gJWQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgJWYsIG91dHB1dCAlZCIsIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1Wb2x1bWUsIGRhdGEtPm1JTyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0U3RyZWFtVm9sdW1lKGRhdGEtPm1TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Wb2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC53YWl0UmVsYXRpdmUobUxvY2ssIGtBdWRpb0NvbW1hbmRUaW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEgPSAoUGFyYW1ldGVyc0RhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCBwYXJhbWV0ZXJzIHN0cmluZyAlcywgaW8gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkYXRhLT5tSU8pOwotICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoZGF0YS0+bUlPLCBkYXRhLT5tS2V5VmFsdWVQYWlycyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC53YWl0UmVsYXRpdmUobUxvY2ssIGtBdWRpb0NvbW1hbmRUaW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRTogewotICAgICAgICAgICAgICAgICAgICBWb2ljZVZvbHVtZURhdGEgKmRhdGEgPSAoVm9pY2VWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0Vm9pY2VWb2x1bWUoZGF0YS0+bVZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC53YWl0UmVsYXRpdmUobUxvY2ssIGtBdWRpb0NvbW1hbmRUaW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKLSAgICAgICAgICAgICAgICAgICAgU3RvcE91dHB1dERhdGEgKmRhdGEgPSAoU3RvcE91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3Agb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOwotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1N0b3BPdXRwdXQoZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJFTEVBU0VfT1VUUFVUOiB7Ci0gICAgICAgICAgICAgICAgICAgIFJlbGVhc2VPdXRwdXREYXRhICpkYXRhID0gKFJlbGVhc2VPdXRwdXREYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyByZWxlYXNlIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKLSAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9SZWxlYXNlT3V0cHV0KGRhdGEtPm1JTyk7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBBTE9HVygiQXVkaW9Db21tYW5kVGhyZWFkKCkgdW5rbm93biBjb21tYW5kICVkIiwgY29tbWFuZC0+bUNvbW1hbmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWxldGUgY29tbWFuZDsKLSAgICAgICAgICAgICAgICB3YWl0VGltZSA9IElOVDY0X01BWDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2FpdFRpbWUgPSBtQXVkaW9Db21tYW5kc1swXS0+bVRpbWUgLSBjdXJUaW1lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIHJlbGVhc2UgZGVsYXllZCBjb21tYW5kcyB3YWtlIGxvY2sKLSAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBnb2luZyB0byBzbGVlcCIpOwotICAgICAgICBtV2FpdFdvcmtDVi53YWl0UmVsYXRpdmUobUxvY2ssIHdhaXRUaW1lKTsKLSAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHdha2luZyB1cCIpOwotICAgIH0KLSAgICBtTG9jay51bmxvY2soKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvQ29tbWFuZFRocmVhZCAlcCBEdW1wXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobUxvY2spOwotICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgIFN0cmluZzggcmVzdWx0MihrQ21kRGVhZGxvY2tlZFN0cmluZyk7Ci0gICAgICAgIHdyaXRlKGZkLCByZXN1bHQyLnN0cmluZygpLCByZXN1bHQyLnNpemUoKSk7Ci0gICAgfQotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBDb21tYW5kczpcbiIpOwotICAgIHJlc3VsdCA9IFN0cmluZzgoYnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgICBDb21tYW5kIFRpbWUgICAgICAgIFdhaXQgcFBhcmFtXG4iKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0NvbW1hbmRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1BdWRpb0NvbW1hbmRzW2ldLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiICBMYXN0IENvbW1hbmRcbiIpOwotICAgIG1MYXN0Q29tbWFuZC5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RBUlRfVE9ORTsKLSAgICBUb25lRGF0YSAqZGF0YSA9IG5ldyBUb25lRGF0YSgpOwotICAgIGRhdGEtPm1UeXBlID0gdHlwZTsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGNvbW1hbmQtPm1QYXJhbSA9ICh2b2lkICopZGF0YTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RhcnQgdHlwZSAlZCwgc3RyZWFtICVkIiwgdHlwZSwgc3RyZWFtKTsKLSAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcFRvbmVDb21tYW5kKCkKLXsKLSAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX1RPTkU7Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gTlVMTDsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RvcCIpOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1ZPTFVNRTsKLSAgICBWb2x1bWVEYXRhICpkYXRhID0gbmV3IFZvbHVtZURhdGEoKTsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGRhdGEtPm1Wb2x1bWUgPSB2b2x1bWU7Ci0gICAgZGF0YS0+bUlPID0gb3V0cHV0OwotICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCwgZGVsYXlNcyk7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgdm9sdW1lIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBvdXRwdXQgJWQiLAotICAgICAgICAgICAgc3RyZWFtLCB2b2x1bWUsIG91dHB1dCk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci0gICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXQobUxvY2spOwotICAgICAgICBzdGF0dXMgPSAgY29tbWFuZC0+bVN0YXR1czsKLSAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpwYXJhbWV0ZXJzQ29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1BBUkFNRVRFUlM7Ci0gICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEgPSBuZXcgUGFyYW1ldGVyc0RhdGEoKTsKLSAgICBkYXRhLT5tSU8gPSBpb0hhbmRsZTsKLSAgICBkYXRhLT5tS2V5VmFsdWVQYWlycyA9IFN0cmluZzgoa2V5VmFsdWVQYWlycyk7Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kLCBkZWxheU1zKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHNldCBwYXJhbWV0ZXIgc3RyaW5nICVzLCBpbyAlZCAsZGVsYXkgJWQiLAotICAgICAgICAgICAga2V5VmFsdWVQYWlycywgaW9IYW5kbGUsIGRlbGF5TXMpOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewotICAgICAgICBjb21tYW5kLT5tQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgc3RhdHVzID0gIGNvbW1hbmQtPm1TdGF0dXM7Ci0gICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9pY2VWb2x1bWVDb21tYW5kKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTRVRfVk9JQ0VfVk9MVU1FOwotICAgIFZvaWNlVm9sdW1lRGF0YSAqZGF0YSA9IG5ldyBWb2ljZVZvbHVtZURhdGEoKTsKLSAgICBkYXRhLT5tVm9sdW1lID0gdm9sdW1lOwotICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCwgZGVsYXlNcyk7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsIHZvbHVtZSk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci0gICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXQobUxvY2spOwotICAgICAgICBzdGF0dXMgPSAgY29tbWFuZC0+bVN0YXR1czsKLSAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCi17Ci0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RPUF9PVVRQVVQ7Ci0gICAgU3RvcE91dHB1dERhdGEgKmRhdGEgPSBuZXcgU3RvcE91dHB1dERhdGEoKTsKLSAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7Ci0gICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKLSAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gKHZvaWQgKilkYXRhOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaW5zZXJ0Q29tbWFuZF9sKGNvbW1hbmQpOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc3RvcCBvdXRwdXQgJWQiLCBvdXRwdXQpOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVMRUFTRV9PVVRQVVQ7Ci0gICAgUmVsZWFzZU91dHB1dERhdGEgKmRhdGEgPSBuZXcgUmVsZWFzZU91dHB1dERhdGEoKTsKLSAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gKHZvaWQgKilkYXRhOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaW5zZXJ0Q29tbWFuZF9sKGNvbW1hbmQpOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLCBvdXRwdXQpOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotfQotCi0vLyBpbnNlcnRDb21tYW5kX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6Omluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zKQotewotICAgIHNzaXplX3QgaTsgIC8vIG5vdCBzaXplX3QgYmVjYXVzZSBpIHdpbGwgY291bnQgZG93biB0byAtMQotICAgIFZlY3RvciA8QXVkaW9Db21tYW5kICo+IHJlbW92ZWRDb21tYW5kczsKLSAgICBjb21tYW5kLT5tVGltZSA9IHN5c3RlbVRpbWUoKSArIG1pbGxpc2Vjb25kcyhkZWxheU1zKTsKLQotICAgIC8vIGFjcXVpcmUgd2FrZSBsb2NrIHRvIG1ha2Ugc3VyZSBkZWxheWVkIGNvbW1hbmRzIGFyZSBwcm9jZXNzZWQKLSAgICBpZiAobUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGFjcXVpcmVfd2FrZV9sb2NrKFBBUlRJQUxfV0FLRV9MT0NLLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgc2FtZSBwZW5kaW5nIGNvbW1hbmRzIHdpdGggbGF0ZXIgdGltZSBzdGFtcHMgYW5kIGVsaW1pbmF0ZSB0aGVtCi0gICAgZm9yIChpID0gbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIEF1ZGlvQ29tbWFuZCAqY29tbWFuZDIgPSBtQXVkaW9Db21tYW5kc1tpXTsKLSAgICAgICAgLy8gY29tbWFuZHMgYXJlIHNvcnRlZCBieSBpbmNyZWFzaW5nIHRpbWUgc3RhbXA6IG5vIG5lZWQgdG8gc2NhbiB0aGUgcmVzdCBvZiBtQXVkaW9Db21tYW5kcwotICAgICAgICBpZiAoY29tbWFuZDItPm1UaW1lIDw9IGNvbW1hbmQtPm1UaW1lKSBicmVhazsKLSAgICAgICAgaWYgKGNvbW1hbmQyLT5tQ29tbWFuZCAhPSBjb21tYW5kLT5tQ29tbWFuZCkgY29udGludWU7Ci0KLSAgICAgICAgc3dpdGNoIChjb21tYW5kLT5tQ29tbWFuZCkgewotICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVJTOiB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhMiA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW07Ci0gICAgICAgICAgICBpZiAoZGF0YS0+bUlPICE9IGRhdGEyLT5tSU8pIGJyZWFrOwotICAgICAgICAgICAgQUxPR1YoIkNvbXBhcmluZyBwYXJhbWV0ZXIgY29tbWFuZCAlcyB0byBuZXcgY29tbWFuZCAlcyIsCi0gICAgICAgICAgICAgICAgICAgIGRhdGEyLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCkpOwotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkYXRhLT5tS2V5VmFsdWVQYWlycyk7Ci0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTIgPSBBdWRpb1BhcmFtZXRlcihkYXRhMi0+bUtleVZhbHVlUGFpcnMpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXJhbS5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgIFN0cmluZzgga2V5OwotICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWU7Ci0gICAgICAgICAgICAgICAgcGFyYW0uZ2V0QXQoaiwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwYXJhbTIuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBrZXkyOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlMjsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0yLmdldEF0KGssIGtleTIsIHZhbHVlMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkyID09IGtleSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yLnJlbW92ZShrZXkyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJGaWx0ZXJpbmcgb3V0IHBhcmFtZXRlciAlcyIsIGtleTIuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiBhbGwga2V5cyBoYXZlIGJlZW4gZmlsdGVyZWQgb3V0LCByZW1vdmUgdGhlIGNvbW1hbmQuCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIHVwZGF0ZSB0aGUga2V5IHZhbHVlIHBhaXJzCi0gICAgICAgICAgICBpZiAocGFyYW0yLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlZENvbW1hbmRzLmFkZChjb21tYW5kMik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGEyLT5tS2V5VmFsdWVQYWlycyA9IHBhcmFtMi50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29tbWFuZC0+bVRpbWUgPSBjb21tYW5kMi0+bVRpbWU7Ci0gICAgICAgICAgICAvLyBmb3JjZSBkZWxheU1zIHRvIG5vbiAwIHNvIHRoYXQgY29kZSBiZWxvdyBkb2VzIG5vdCByZXF1ZXN0IHRvIHdhaXQgZm9yCi0gICAgICAgICAgICAvLyBjb21tYW5kIHN0YXR1cyBhcyB0aGUgY29tbWFuZCBpcyBub3cgZGVsYXllZAotICAgICAgICAgICAgZGVsYXlNcyA9IDE7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7Ci0gICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhID0gKFZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhMiA9IChWb2x1bWVEYXRhICopY29tbWFuZDItPm1QYXJhbTsKLSAgICAgICAgICAgIGlmIChkYXRhLT5tSU8gIT0gZGF0YTItPm1JTykgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoZGF0YS0+bVN0cmVhbSAhPSBkYXRhMi0+bVN0cmVhbSkgYnJlYWs7Ci0gICAgICAgICAgICBBTE9HVigiRmlsdGVyaW5nIG91dCB2b2x1bWUgY29tbWFuZCBvbiBvdXRwdXQgJWQgZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSk7Ci0gICAgICAgICAgICByZW1vdmVkQ29tbWFuZHMuYWRkKGNvbW1hbmQyKTsKLSAgICAgICAgICAgIGNvbW1hbmQtPm1UaW1lID0gY29tbWFuZDItPm1UaW1lOwotICAgICAgICAgICAgLy8gZm9yY2UgZGVsYXlNcyB0byBub24gMCBzbyB0aGF0IGNvZGUgYmVsb3cgZG9lcyBub3QgcmVxdWVzdCB0byB3YWl0IGZvcgotICAgICAgICAgICAgLy8gY29tbWFuZCBzdGF0dXMgYXMgdGhlIGNvbW1hbmQgaXMgbm93IGRlbGF5ZWQKLSAgICAgICAgICAgIGRlbGF5TXMgPSAxOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVJUX1RPTkU6Ci0gICAgICAgIGNhc2UgU1RPUF9UT05FOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyByZW1vdmUgZmlsdGVyZWQgY29tbWFuZHMKLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlbW92ZWRDb21tYW5kcy5zaXplKCk7IGorKykgewotICAgICAgICAvLyByZW1vdmVkIGNvbW1hbmRzIGFsd2F5cyBoYXZlIHRpbWUgc3RhbXBzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IGNvbW1hbmQKLSAgICAgICAgZm9yIChzaXplX3QgayA9IGkgKyAxOyBrIDwgbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kc1trXSA9PSByZW1vdmVkQ29tbWFuZHNbal0pIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic3VwcHJlc3NpbmcgY29tbWFuZDogJWQiLCBtQXVkaW9Db21tYW5kc1trXS0+bUNvbW1hbmQpOwotICAgICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRzLnJlbW92ZUF0KGspOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJlbW92ZWRDb21tYW5kcy5jbGVhcigpOwotCi0gICAgLy8gd2FpdCBmb3Igc3RhdHVzIG9ubHkgaWYgZGVsYXkgaXMgMAotICAgIGlmIChkZWxheU1zID09IDApIHsKLSAgICAgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gaW5zZXJ0IGNvbW1hbmQgYXQgdGhlIHJpZ2h0IHBsYWNlIGFjY29yZGluZyB0byBpdHMgdGltZSBzdGFtcAotICAgIEFMT0dWKCJpbnNlcnRpbmcgY29tbWFuZDogJWQgYXQgaW5kZXggJWQsIG51bSBjb21tYW5kcyAlZCIsCi0gICAgICAgICAgICBjb21tYW5kLT5tQ29tbWFuZCwgKGludClpKzEsIG1BdWRpb0NvbW1hbmRzLnNpemUoKSk7Ci0gICAgbUF1ZGlvQ29tbWFuZHMuaW5zZXJ0QXQoY29tbWFuZCwgaSArIDEpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpleGl0KCkKLXsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkOjpleGl0Iik7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgICAgICByZXF1ZXN0RXhpdCgpOwotICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLSAgICB9Ci0gICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OkF1ZGlvQ29tbWFuZDo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQotewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwMmQgICAgICAlMDZkLiUwM2QgICUwMXUgICAgJXBcbiIsCi0gICAgICAgICAgICBtQ29tbWFuZCwKLSAgICAgICAgICAgIChpbnQpbnMycyhtVGltZSksCi0gICAgICAgICAgICAoaW50KW5zMm1zKG1UaW1lKSUxMDAwLAotICAgICAgICAgICAgbVdhaXRTdGF0dXMsCi0gICAgICAgICAgICBtUGFyYW0pOwotfQotCi0vKioqKioqKiBoZWxwZXJzIGZvciB0aGUgc2VydmljZV9vcHMgY2FsbGJhY2tzIGRlZmluZWQgYmVsb3cgKioqKioqKioqLwotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCi17Ci0gICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+cGFyYW1ldGVyc0NvbW1hbmQoaW9IYW5kbGUsIGtleVZhbHVlUGFpcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7Ci19Ci0KLWludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQotewotICAgIHJldHVybiAoaW50KW1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvbHVtZUNvbW1hbmQoc3RyZWFtLCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGRlbGF5TXMpOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGlmICh0b25lICE9IEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OKQotICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHRvbmUgcmVxdWVzdGVkICglZCkiLCB0b25lKTsKLSAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKQotICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHN0cmVhbSAoJWQpIHJlcXVlc3RlZCBmb3IgdG9uZSAlZCIsIHN0cmVhbSwKLSAgICAgICAgICAgIHRvbmUpOwotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6VE9ORV9TVVBfQ0FMTF9XQUlUSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wVG9uZSgpCi17Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RvcFRvbmVDb21tYW5kKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCi17Ci0gICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9pY2VWb2x1bWVDb21tYW5kKHZvbHVtZSwgZGVsYXlNcyk7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigibXBBdWRpb1BvbGljeSA9PSBOVUxMIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAobXBBdWRpb1BvbGljeS0+aXNfb2ZmbG9hZF9zdXBwb3J0ZWQgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiSEFMIGRvZXMgbm90IGltcGxlbWVudCBpc19vZmZsb2FkX3N1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX29mZmxvYWRfc3VwcG9ydGVkKG1wQXVkaW9Qb2xpY3ksICZpbmZvKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQXVkaW8gcHJlLXByb2Nlc3NpbmcgY29uZmlndXJhdGlvbgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKnN0YXRpYyovIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BvbGljeVNlcnZpY2U6OmtJbnB1dFNvdXJjZU5hbWVzW0FVRElPX1NPVVJDRV9DTlQgLTFdID0gewotICAgIE1JQ19TUkNfVEFHLAotICAgIFZPSUNFX1VMX1NSQ19UQUcsCi0gICAgVk9JQ0VfRExfU1JDX1RBRywKLSAgICBWT0lDRV9DQUxMX1NSQ19UQUcsCi0gICAgQ0FNQ09SREVSX1NSQ19UQUcsCi0gICAgVk9JQ0VfUkVDX1NSQ19UQUcsCi0gICAgVk9JQ0VfQ09NTV9TUkNfVEFHCi19OwotCi0vLyByZXR1cm5zIHRoZSBhdWRpb19zb3VyY2VfdCBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IHNvdXJjZSBuYW1lIG9yCi0vLyBBVURJT19TT1VSQ0VfQ05UIGlzIG5vIG1hdGNoIGZvdW5kCi1hdWRpb19zb3VyY2VfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmlucHV0U291cmNlTmFtZVRvRW51bShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IEFVRElPX1NPVVJDRV9NSUM7IGkgPCBBVURJT19TT1VSQ0VfQ05UOyBpKyspIHsKLSAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBrSW5wdXRTb3VyY2VOYW1lc1tpIC0gQVVESU9fU09VUkNFX01JQ10pID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJpbnB1dFNvdXJjZU5hbWVUb0VudW0gZm91bmQgc291cmNlICVzICVkIiwgbmFtZSwgaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKGF1ZGlvX3NvdXJjZV90KWk7Ci19Ci0KLXNpemVfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omdyb3dQYXJhbVNpemUoY2hhciAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSkKLXsKLSAgICAvLyAqY3VyU2l6ZSBpcyBhdCBsZWFzdCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgMiAqIHNpemVvZihpbnQpCi0gICAgc2l6ZV90IHBvcyA9ICgoKmN1clNpemUgLSAxICkgLyBzaXplICsgMSkgKiBzaXplOwotCi0gICAgaWYgKHBvcyArIHNpemUgPiAqdG90U2l6ZSkgewotICAgICAgICB3aGlsZSAocG9zICsgc2l6ZSA+ICp0b3RTaXplKSB7Ci0gICAgICAgICAgICAqdG90U2l6ZSArPSAoKCp0b3RTaXplICsgNykgLyA4KSAqIDQ7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW0gPSAoY2hhciAqKXJlYWxsb2MocGFyYW0sICp0b3RTaXplKTsKLSAgICB9Ci0gICAgKmN1clNpemUgPSBwb3MgKyBzaXplOwotICAgIHJldHVybiBwb3M7Ci19Ci0KLXNpemVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlYWRQYXJhbVZhbHVlKGNub2RlICpub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnRvdFNpemUpCi17Ci0gICAgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgU0hPUlRfVEFHLCBzaXplb2YoU0hPUlRfVEFHKSArIDEpID09IDApIHsKLSAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihzaG9ydCksIGN1clNpemUsIHRvdFNpemUpOwotICAgICAgICAqKHNob3J0ICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gKHNob3J0KWF0b2kobm9kZS0+dmFsdWUpOwotICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIHNob3J0ICVkIiwgKihzaG9ydCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSk7Ci0gICAgICAgIHJldHVybiBzaXplb2Yoc2hvcnQpOwotICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBJTlRfVEFHLCBzaXplb2YoSU5UX1RBRykgKyAxKSA9PSAwKSB7Ci0gICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2YoaW50KSwgY3VyU2l6ZSwgdG90U2l6ZSk7Ci0gICAgICAgICooaW50ICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gYXRvaShub2RlLT52YWx1ZSk7Ci0gICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgaW50ICVkIiwgKihpbnQgKikoKGNoYXIgKilwYXJhbSArIHBvcykpOwotICAgICAgICByZXR1cm4gc2l6ZW9mKGludCk7Ci0gICAgfSBlbHNlIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIEZMT0FUX1RBRywgc2l6ZW9mKEZMT0FUX1RBRykgKyAxKSA9PSAwKSB7Ci0gICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2YoZmxvYXQpLCBjdXJTaXplLCB0b3RTaXplKTsKLSAgICAgICAgKihmbG9hdCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IChmbG9hdClhdG9mKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBmbG9hdCAlZiIsKihmbG9hdCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSk7Ci0gICAgICAgIHJldHVybiBzaXplb2YoZmxvYXQpOwotICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBCT09MX1RBRywgc2l6ZW9mKEJPT0xfVEFHKSArIDEpID09IDApIHsKLSAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihib29sKSwgY3VyU2l6ZSwgdG90U2l6ZSk7Ci0gICAgICAgIGlmIChzdHJuY21wKG5vZGUtPnZhbHVlLCAiZmFsc2UiLCBzdHJsZW4oImZhbHNlIikgKyAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAqKGJvb2wgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICooYm9vbCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBib29sICVzIiwqKGJvb2wgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgcmV0dXJuIHNpemVvZihib29sKTsKLSAgICB9IGVsc2UgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgU1RSSU5HX1RBRywgc2l6ZW9mKFNUUklOR19UQUcpICsgMSkgPT0gMCkgewotICAgICAgICBzaXplX3QgbGVuID0gc3Rybmxlbihub2RlLT52YWx1ZSwgRUZGRUNUX1NUUklOR19MRU5fTUFYKTsKLSAgICAgICAgaWYgKCpjdXJTaXplICsgbGVuICsgMSA+ICp0b3RTaXplKSB7Ci0gICAgICAgICAgICAqdG90U2l6ZSA9ICpjdXJTaXplICsgbGVuICsgMTsKLSAgICAgICAgICAgIHBhcmFtID0gKGNoYXIgKilyZWFsbG9jKHBhcmFtLCAqdG90U2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RybmNweShwYXJhbSArICpjdXJTaXplLCBub2RlLT52YWx1ZSwgbGVuKTsKLSAgICAgICAgKmN1clNpemUgKz0gbGVuOwotICAgICAgICBwYXJhbVsqY3VyU2l6ZV0gPSAnXDAnOwotICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIHN0cmluZyAlcyIsIHBhcmFtICsgKmN1clNpemUgLSBsZW4pOwotICAgICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgICBBTE9HVygicmVhZFBhcmFtVmFsdWUoKSB1bmtub3duIHBhcmFtIHR5cGUgJXMiLCBub2RlLT5uYW1lKTsKLSAgICByZXR1cm4gMDsKLX0KLQotZWZmZWN0X3BhcmFtX3QgKkF1ZGlvUG9saWN5U2VydmljZTo6bG9hZEVmZmVjdFBhcmFtZXRlcihjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqcGFyYW07Ci0gICAgY25vZGUgKnZhbHVlOwotICAgIHNpemVfdCBjdXJTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KTsKLSAgICBzaXplX3QgdG90U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyAyICogc2l6ZW9mKGludCk7Ci0gICAgZWZmZWN0X3BhcmFtX3QgKmZ4X3BhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopbWFsbG9jKHRvdFNpemUpOwotCi0gICAgcGFyYW0gPSBjb25maWdfZmluZChyb290LCBQQVJBTV9UQUcpOwotICAgIHZhbHVlID0gY29uZmlnX2ZpbmQocm9vdCwgVkFMVUVfVEFHKTsKLSAgICBpZiAocGFyYW0gPT0gTlVMTCAmJiB2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIHRyeSB0byBwYXJzZSBzaW1wbGUgcGFyYW1ldGVyIGZvcm0ge2ludCBpbnR9Ci0gICAgICAgIHBhcmFtID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIGlmIChwYXJhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiB0aGF0IGEgcGFpciBvZiByYW5kb20gc3RyaW5ncyBpcyByZWFkIGFzIDAgMAotICAgICAgICAgICAgaW50ICpwdHIgPSAoaW50ICopZnhfcGFyYW0tPmRhdGE7Ci0gICAgICAgICAgICBpbnQgKnB0cjIgPSAoaW50ICopKChjaGFyICopcGFyYW0gKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKTsKLSAgICAgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgcHRyICVwIHB0cjIgJXAiLCBwdHIsIHB0cjIpOwotICAgICAgICAgICAgKnB0cisrID0gYXRvaShwYXJhbS0+bmFtZSk7Ci0gICAgICAgICAgICAqcHRyID0gYXRvaShwYXJhbS0+dmFsdWUpOwotICAgICAgICAgICAgZnhfcGFyYW0tPnBzaXplID0gc2l6ZW9mKGludCk7Ci0gICAgICAgICAgICBmeF9wYXJhbS0+dnNpemUgPSBzaXplb2YoaW50KTsKLSAgICAgICAgICAgIHJldHVybiBmeF9wYXJhbTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocGFyYW0gPT0gTlVMTCB8fCB2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gJXMiLCByb290LT5uYW1lKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBmeF9wYXJhbS0+cHNpemUgPSAwOwotICAgIHBhcmFtID0gcGFyYW0tPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChwYXJhbSkgewotICAgICAgICBBTE9HVigibG9hZEVmZmVjdFBhcmFtZXRlcigpIHJlYWRpbmcgcGFyYW0gb2YgdHlwZSAlcyIsIHBhcmFtLT5uYW1lKTsKLSAgICAgICAgc2l6ZV90IHNpemUgPSByZWFkUGFyYW1WYWx1ZShwYXJhbSwgKGNoYXIgKilmeF9wYXJhbSwgJmN1clNpemUsICZ0b3RTaXplKTsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBmeF9wYXJhbS0+cHNpemUgKz0gc2l6ZTsKLSAgICAgICAgcGFyYW0gPSBwYXJhbS0+bmV4dDsKLSAgICB9Ci0KLSAgICAvLyBhbGlnbiBzdGFydCBvZiB2YWx1ZSBmaWVsZCBvbiAzMiBiaXQgYm91bmRhcnkKLSAgICBjdXJTaXplID0gKChjdXJTaXplIC0gMSApIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOwotCi0gICAgZnhfcGFyYW0tPnZzaXplID0gMDsKLSAgICB2YWx1ZSA9IHZhbHVlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAodmFsdWUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSByZWFkaW5nIHZhbHVlIG9mIHR5cGUgJXMiLCB2YWx1ZS0+bmFtZSk7Ci0gICAgICAgIHNpemVfdCBzaXplID0gcmVhZFBhcmFtVmFsdWUodmFsdWUsIChjaGFyICopZnhfcGFyYW0sICZjdXJTaXplLCAmdG90U2l6ZSk7Ci0gICAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgZnhfcGFyYW0tPnZzaXplICs9IHNpemU7Ci0gICAgICAgIHZhbHVlID0gdmFsdWUtPm5leHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZ4X3BhcmFtOwotCi1lcnJvcjoKLSAgICBkZWxldGUgZnhfcGFyYW07Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsb2FkRWZmZWN0UGFyYW1ldGVycyhjbm9kZSAqcm9vdCwgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiYgcGFyYW1zKQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RQYXJhbWV0ZXJzKCkgbG9hZGluZyBwYXJhbSAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcGFyYW0gPSBsb2FkRWZmZWN0UGFyYW1ldGVyKG5vZGUpOwotICAgICAgICBpZiAocGFyYW0gPT0gTlVMTCkgewotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBwYXJhbXMuYWRkKHBhcmFtKTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotfQotCi1BdWRpb1BvbGljeVNlcnZpY2U6OklucHV0U291cmNlRGVzYyAqQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsb2FkSW5wdXRTb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbm9kZSAqcm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImxvYWRJbnB1dFNvdXJjZSgpIGVtcHR5IGVsZW1lbnQgJXMiLCByb290LT5uYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIElucHV0U291cmNlRGVzYyAqc291cmNlID0gbmV3IElucHV0U291cmNlRGVzYygpOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIHNpemVfdCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKHN0cm5jbXAoZWZmZWN0c1tpXS0+bU5hbWUsIG5vZGUtPm5hbWUsIEVGRkVDVF9TVFJJTkdfTEVOX01BWCkgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJsb2FkSW5wdXRTb3VyY2UoKSBmb3VuZCBlZmZlY3QgJXMgaW4gbGlzdCIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpID09IGVmZmVjdHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZElucHV0U291cmNlKCkgZWZmZWN0ICVzIG5vdCBpbiBsaXN0Iiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IG5ldyBFZmZlY3REZXNjKCplZmZlY3RzW2ldKTsgICAvLyBkZWVwIGNvcHkKLSAgICAgICAgbG9hZEVmZmVjdFBhcmFtZXRlcnMobm9kZSwgZWZmZWN0LT5tUGFyYW1zKTsKLSAgICAgICAgQUxPR1YoImxvYWRJbnB1dFNvdXJjZSgpIGFkZGluZyBlZmZlY3QgJXMgdXVpZCAlMDh4IiwgZWZmZWN0LT5tTmFtZSwgZWZmZWN0LT5tVXVpZC50aW1lTG93KTsKLSAgICAgICAgc291cmNlLT5tRWZmZWN0cy5hZGQoZWZmZWN0KTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIGlmIChzb3VyY2UtPm1FZmZlY3RzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkSW5wdXRTb3VyY2UoKSBubyB2YWxpZCBlZmZlY3RzIGZvdW5kIGluIHNvdXJjZSAlcyIsIHJvb3QtPm5hbWUpOwotICAgICAgICBkZWxldGUgc291cmNlOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHNvdXJjZTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsb2FkSW5wdXRTb3VyY2VzKGNub2RlICpyb290LCBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBQUkVQUk9DRVNTSU5HX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGlucHV0U291cmNlTmFtZVRvRW51bShub2RlLT5uYW1lKTsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfQ05UKSB7Ci0gICAgICAgICAgICBBTE9HVygibG9hZElucHV0U291cmNlcygpIGludmFsaWQgaW5wdXQgc291cmNlICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJsb2FkSW5wdXRTb3VyY2VzKCkgbG9hZGluZyBpbnB1dCBzb3VyY2UgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgSW5wdXRTb3VyY2VEZXNjICpkZXNjID0gbG9hZElucHV0U291cmNlKG5vZGUsIGVmZmVjdHMpOwotICAgICAgICBpZiAoZGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIG1JbnB1dFNvdXJjZXMuYWRkKHNvdXJjZSwgZGVzYyk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLUF1ZGlvUG9saWN5U2VydmljZTo6RWZmZWN0RGVzYyAqQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsb2FkRWZmZWN0KGNub2RlICpyb290KQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKLSAgICBpZiAoQXVkaW9FZmZlY3Q6OnN0cmluZ1RvR3VpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgaW52YWxpZCB1dWlkICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBFZmZlY3REZXNjKHJvb3QtPm5hbWUsIHV1aWQpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRFZmZlY3RzKGNub2RlICpyb290LCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBFRkZFQ1RTX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0cygpIGxvYWRpbmcgZWZmZWN0ICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IGxvYWRFZmZlY3Qobm9kZSk7Ci0gICAgICAgIGlmIChlZmZlY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBlZmZlY3RzLmFkZChlZmZlY3QpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRQcmVQcm9jZXNzb3JDb25maWcoY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBjbm9kZSAqcm9vdDsKLSAgICBjaGFyICpkYXRhOwotCi0gICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOwotICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOwotCi0gICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHM7Ci0gICAgbG9hZEVmZmVjdHMocm9vdCwgZWZmZWN0cyk7Ci0gICAgbG9hZElucHV0U291cmNlcyhyb290LCBlZmZlY3RzKTsKLQotICAgIC8vIGRlbGV0ZSBlZmZlY3RzIHRvIGZpeCBtZW1vcnkgbGVhay4KLSAgICAvLyBhcyBlZmZlY3RzIGlzIGxvY2FsIHZhciBhbmQgdmFsZ3JpbmQgd291bGQgdHJlYXQgdGhpcyBhcyBtZW1vcnkgbGVhawotICAgIC8vIGFuZCBhbHRob3VnaCBpdCBvbmx5IGRpZCBpbiBtZWRpYXNlcnZlciBpbml0LCBidXQgZnJlZSBpdCBpbiBjYXNlIG1lZGlhc2VydmVyIHJlYm9vdAotICAgIHNpemVfdCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBkZWxldGUgZWZmZWN0c1tpXTsKLSAgICB9Ci0KLSAgICBjb25maWdfZnJlZShyb290KTsKLSAgICBmcmVlKHJvb3QpOwotICAgIGZyZWUoZGF0YSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHBvbGljeSBtYW5hZ2VyICovCi1leHRlcm4gIkMiIHsKLQotCi1zdGF0aWMgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGFwc19sb2FkX2h3X21vZHVsZSh2b2lkICpzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+bG9hZEh3TW9kdWxlKG5hbWUpOwotfQotCi0vLyBkZXByZWNhdGVkOiByZXBsYWNlZCBieSBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlKCkKLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXQodm9pZCAqc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPm9wZW5PdXRwdXQoKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCkwLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF0ZW5jeU1zLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gYWYtPm9wZW5PdXRwdXQobW9kdWxlLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF0ZW5jeU1zLCBmbGFncywgb2ZmbG9hZEluZm8pOwotfQotCi1zdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5fZHVwX291dHB1dCh2b2lkICpzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gYWYtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0MSwgb3V0cHV0Mik7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX2Nsb3NlX291dHB1dCh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgcmV0dXJuIGFmLT5jbG9zZU91dHB1dChvdXRwdXQpOwotfQotCi1zdGF0aWMgaW50IGFwc19zdXNwZW5kX291dHB1dCh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5zdXNwZW5kT3V0cHV0KG91dHB1dCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3Jlc3RvcmVfb3V0cHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPnJlc3RvcmVPdXRwdXQob3V0cHV0KTsKLX0KLQotLy8gZGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgYXBzX29wZW5faW5wdXRfb25fbW9kdWxlKCksIGFuZCBhY291c3RpY3MgcGFyYW1ldGVyIGlzIGlnbm9yZWQKLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dCh2b2lkICpzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPm9wZW5JbnB1dCgoYXVkaW9fbW9kdWxlX2hhbmRsZV90KTAsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2spOwotfQotCi1zdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5faW5wdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaykKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+b3BlbklucHV0KG1vZHVsZSwgcERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVsTWFzayk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX2Nsb3NlX2lucHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApCi0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIHJldHVybiBhZi0+Y2xvc2VJbnB1dChpbnB1dCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3NldF9zdHJlYW1fb3V0cHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKQotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICByZXR1cm4gYWYtPnNldFN0cmVhbU91dHB1dChzdHJlYW0sIG91dHB1dCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX21vdmVfZWZmZWN0cyh2b2lkICpzZXJ2aWNlLCBpbnQgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjX291dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0X291dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKQotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICByZXR1cm4gYWYtPm1vdmVFZmZlY3RzKHNlc3Npb24sIHNyY19vdXRwdXQsIGRzdF9vdXRwdXQpOwotfQotCi1zdGF0aWMgY2hhciAqIGFwc19nZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5cykKLXsKLSAgICBTdHJpbmc4IHJlc3VsdCA9IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGlvX2hhbmRsZSwgU3RyaW5nOChrZXlzKSk7Ci0gICAgcmV0dXJuIHN0cmR1cChyZXN1bHQuc3RyaW5nKCkpOwotfQotCi1zdGF0aWMgdm9pZCBhcHNfc2V0X3BhcmFtZXRlcnModm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprdl9wYWlycywgaW50IGRlbGF5X21zKQotewotICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7Ci0KLSAgICBhdWRpb1BvbGljeVNlcnZpY2UtPnNldFBhcmFtZXRlcnMoaW9faGFuZGxlLCBrdl9wYWlycywgZGVsYXlfbXMpOwotfQotCi1zdGF0aWMgaW50IGFwc19zZXRfc3RyZWFtX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlfbXMpCi17Ci0gICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKLQotICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9tcyk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3N0YXJ0X3RvbmUodm9pZCAqc2VydmljZSwgYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKLQotICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnN0YXJ0VG9uZSh0b25lLCBzdHJlYW0pOwotfQotCi1zdGF0aWMgaW50IGFwc19zdG9wX3RvbmUodm9pZCAqc2VydmljZSkKLXsKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOwotCi0gICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c3RvcFRvbmUoKTsKLX0KLQotc3RhdGljIGludCBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcykKLXsKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOwotCi0gICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lLCBkZWxheV9tcyk7Ci19Ci0KLX07IC8vIGV4dGVybiAiQyIKLQotbmFtZXNwYWNlIHsKLSAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X3NlcnZpY2Vfb3BzIGFwc19vcHMgPSB7Ci0gICAgICAgIG9wZW5fb3V0cHV0ICAgICAgICAgICA6IGFwc19vcGVuX291dHB1dCwKLSAgICAgICAgb3Blbl9kdXBsaWNhdGVfb3V0cHV0IDogYXBzX29wZW5fZHVwX291dHB1dCwKLSAgICAgICAgY2xvc2Vfb3V0cHV0ICAgICAgICAgIDogYXBzX2Nsb3NlX291dHB1dCwKLSAgICAgICAgc3VzcGVuZF9vdXRwdXQgICAgICAgIDogYXBzX3N1c3BlbmRfb3V0cHV0LAotICAgICAgICByZXN0b3JlX291dHB1dCAgICAgICAgOiBhcHNfcmVzdG9yZV9vdXRwdXQsCi0gICAgICAgIG9wZW5faW5wdXQgICAgICAgICAgICA6IGFwc19vcGVuX2lucHV0LAotICAgICAgICBjbG9zZV9pbnB1dCAgICAgICAgICAgOiBhcHNfY2xvc2VfaW5wdXQsCi0gICAgICAgIHNldF9zdHJlYW1fdm9sdW1lICAgICA6IGFwc19zZXRfc3RyZWFtX3ZvbHVtZSwKLSAgICAgICAgc2V0X3N0cmVhbV9vdXRwdXQgICAgIDogYXBzX3NldF9zdHJlYW1fb3V0cHV0LAotICAgICAgICBzZXRfcGFyYW1ldGVycyAgICAgICAgOiBhcHNfc2V0X3BhcmFtZXRlcnMsCi0gICAgICAgIGdldF9wYXJhbWV0ZXJzICAgICAgICA6IGFwc19nZXRfcGFyYW1ldGVycywKLSAgICAgICAgc3RhcnRfdG9uZSAgICAgICAgICAgIDogYXBzX3N0YXJ0X3RvbmUsCi0gICAgICAgIHN0b3BfdG9uZSAgICAgICAgICAgICA6IGFwc19zdG9wX3RvbmUsCi0gICAgICAgIHNldF92b2ljZV92b2x1bWUgICAgICA6IGFwc19zZXRfdm9pY2Vfdm9sdW1lLAotICAgICAgICBtb3ZlX2VmZmVjdHMgICAgICAgICAgOiBhcHNfbW92ZV9lZmZlY3RzLAotICAgICAgICBsb2FkX2h3X21vZHVsZSAgICAgICAgOiBhcHNfbG9hZF9od19tb2R1bGUsCi0gICAgICAgIG9wZW5fb3V0cHV0X29uX21vZHVsZSA6IGFwc19vcGVuX291dHB1dF9vbl9tb2R1bGUsCi0gICAgICAgIG9wZW5faW5wdXRfb25fbW9kdWxlICA6IGFwc19vcGVuX2lucHV0X29uX21vZHVsZSwKLSAgICB9OwotfTsgLy8gbmFtZXNwYWNlIDx1bm5hbWVkPgotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTA1M2E5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0FVRElPUE9MSUNZU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKLQotI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgotI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvVG9uZUdlbmVyYXRvci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBBdWRpb1BvbGljeVNlcnZpY2UgOgotICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPEF1ZGlvUG9saWN5U2VydmljZT4sCi0gICAgcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlLAotLy8gICAgcHVibGljIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlLAotICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAotewotICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPEF1ZGlvUG9saWN5U2VydmljZT47Ci0KLXB1YmxpYzoKLSAgICAvLyBmb3IgQmluZGVyU2VydmljZQotICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRTZXJ2aWNlTmFtZSgpIEFORFJPSURfQVBJIHsgcmV0dXJuICJtZWRpYS5hdWRpb19wb2xpY3kiOyB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotICAgIC8vCi0gICAgLy8gQm5BdWRpb1BvbGljeVNlcnZpY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykKLSAgICAvLwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwotICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwotICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpOwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiA9IDApOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7Ci0gICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGludCBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKLSAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKLQotICAgIC8vCi0gICAgLy8gSGVscGVycyBmb3IgdGhlIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgaW1wbGVtZW50YXRpb24uCi0gICAgLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBmb3IgY2VydGFpbiBvcGVyYXRpb25zIHRoYXQKLSAgICAvLyBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlIHBvbGljeSBzZXJ2aWNlLgotICAgIC8vCi0gICAgdmlydHVhbCB2b2lkIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwotICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgJmNvbmZpZyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKLSAgICAgICAgICAgIHZvaWQgZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2UoKSBBTkRST0lEX0FQSTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BdWRpb1BvbGljeVNlcnZpY2UoKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZHVtcEludGVybmFscyhpbnQgZmQpOwotCi0gICAgLy8gVGhyZWFkIHVzZWQgZm9yIHRvbmUgcGxheWJhY2sgYW5kIHRvIHNlbmQgYXVkaW8gY29uZmlnIGNvbW1hbmRzIHRvIGF1ZGlvIGZsaW5nZXIKLSAgICAvLyBGb3IgdG9uZSBwbGF5YmFjaywgdXNpbmcgYSBzZXBhcmF0ZSB0aHJlYWQgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGRlYWRsb2NrIHdpdGggbUxvY2sgYmVjYXVzZQotICAgIC8vIHN0YXJ0VG9uZSgpIGFuZCBzdG9wVG9uZSgpIGFyZSBub3JtYWxseSBjYWxsZWQgd2l0aCBtTG9jayBsb2NrZWQgYW5kIHJlcXVlc3RpbmcgYSB0b25lIHN0YXJ0Ci0gICAgLy8gb3Igc3RvcCB3aWxsIGNhdXNlIGNhbGxzIHRvIEF1ZGlvUG9saWN5U2VydmljZSBhbmQgYW4gYXR0ZW1wdCB0byBsb2NrIG1Mb2NrLgotICAgIC8vIEZvciBhdWRpbyBjb25maWcgY29tbWFuZHMsIGl0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGF1ZGlvIGZsaW5nZXIgcmVxdWlyZXMgdGhhdCB0aGUgY2FsbGluZwotICAgIC8vIHByb2Nlc3MgKHVzZXIpIGhhcyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhdWRpbyBzZXR0aW5ncy4KLSAgICBjbGFzcyBBdWRpb0NvbW1hbmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kOwotICAgIHB1YmxpYzoKLQotICAgICAgICAvLyBjb21tYW5kcyBmb3IgdG9uZSBBdWRpb0NvbW1hbmQKLSAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBTVEFSVF9UT05FLAotICAgICAgICAgICAgU1RPUF9UT05FLAotICAgICAgICAgICAgU0VUX1ZPTFVNRSwKLSAgICAgICAgICAgIFNFVF9QQVJBTUVURVJTLAotICAgICAgICAgICAgU0VUX1ZPSUNFX1ZPTFVNRSwKLSAgICAgICAgICAgIFNUT1BfT1VUUFVULAotICAgICAgICAgICAgUkVMRUFTRV9PVVRQVVQKLSAgICAgICAgfTsKLQotICAgICAgICBBdWRpb0NvbW1hbmRUaHJlYWQgKFN0cmluZzggbmFtZSwgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSk7Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvQ29tbWFuZFRocmVhZCgpOwotCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKLQotICAgICAgICAvLyBUaHJlYWQgdmlydHVhbHMKLSAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOwotICAgICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcFRvbmVDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvbHVtZUNvbW1hbmQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBpbnQgZGVsYXlNcyA9IDApOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBwYXJhbWV0ZXJzQ29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywgaW50IGRlbGF5TXMgPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdm9pY2VWb2x1bWVDb21tYW5kKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcE91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyBkZXNjcmlwdG9yIGZvciByZXF1ZXN0ZWQgdG9uZSBwbGF5YmFjayBldmVudAotICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmQgewotCi0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIEF1ZGlvQ29tbWFuZCgpCi0gICAgICAgICAgICA6IG1Db21tYW5kKC0xKSB7fQotCi0gICAgICAgICAgICB2b2lkIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgICAgIGludCBtQ29tbWFuZDsgICAvLyBTVEFSVF9UT05FLCBTVE9QX1RPTkUgLi4uCi0gICAgICAgICAgICBuc2Vjc190IG1UaW1lOyAgLy8gdGltZSBzdGFtcAotICAgICAgICAgICAgQ29uZGl0aW9uIG1Db25kOyAvLyBjb25kaXRpb24gZm9yIHN0YXR1cyByZXR1cm4KLSAgICAgICAgICAgIHN0YXR1c190IG1TdGF0dXM7IC8vIGNvbW1hbmQgc3RhdHVzCi0gICAgICAgICAgICBib29sIG1XYWl0U3RhdHVzOyAvLyB0cnVlIGlmIGNhbGxlciBpcyB3YWl0aW5nIGZvciBzdGF0dXMKLSAgICAgICAgICAgIHZvaWQgKm1QYXJhbTsgICAgIC8vIGNvbW1hbmQgcGFyYW1ldGVyIChUb25lRGF0YSwgVm9sdW1lRGF0YSwgUGFyYW1ldGVyc0RhdGEpCi0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgVG9uZURhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgbVR5cGU7IC8vIHRvbmUgdHlwZSAoU1RBUlRfVE9ORSBvbmx5KQotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOyAgICAvLyBzdHJlYW0gdHlwZSAoU1RBUlRfVE9ORSBvbmx5KQotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFZvbHVtZURhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07Ci0gICAgICAgICAgICBmbG9hdCBtVm9sdW1lOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFBhcmFtZXRlcnNEYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICAgICAgU3RyaW5nOCBtS2V5VmFsdWVQYWlyczsKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBWb2ljZVZvbHVtZURhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBmbG9hdCBtVm9sdW1lOwotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFN0b3BPdXRwdXREYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwotICAgICAgICAgICAgaW50IG1TZXNzaW9uOwotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFJlbGVhc2VPdXRwdXREYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICB9OwotCi0gICAgICAgIE11dGV4ICAgbUxvY2s7Ci0gICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKLSAgICAgICAgVmVjdG9yIDxBdWRpb0NvbW1hbmQgKj4gbUF1ZGlvQ29tbWFuZHM7IC8vIGxpc3Qgb2YgcGVuZGluZyBjb21tYW5kcwotICAgICAgICBUb25lR2VuZXJhdG9yICptcFRvbmVHZW5lcmF0b3I7ICAgICAvLyB0aGUgdG9uZSBnZW5lcmF0b3IKLSAgICAgICAgQXVkaW9Db21tYW5kIG1MYXN0Q29tbWFuZDsgICAgICAgICAgLy8gbGFzdCBwcm9jZXNzZWQgY29tbWFuZCAodXNlZCBieSBkdW1wKQotICAgICAgICBTdHJpbmc4IG1OYW1lOyAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpbmcgdXNlZCBieSB3YWtlIGxvY2sgZm8gZGVsYXllZCBjb21tYW5kcwotICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOwotICAgIH07Ci0KLSAgICBjbGFzcyBFZmZlY3REZXNjIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEVmZmVjdERlc2MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG5hbWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKHV1aWQpIHsgfQotICAgICAgICBFZmZlY3REZXNjKGNvbnN0IEVmZmVjdERlc2MmIG9yaWcpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKHN0cmR1cChvcmlnLm1OYW1lKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtVXVpZChvcmlnLm1VdWlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVlcCBjb3B5IG1QYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG9yaWcubVBhcmFtcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqb3JpZ1BhcmFtID0gb3JpZy5tUGFyYW1zW2tdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwc2l6ZSBhbmQgdnNpemUgYXJlIHJvdW5kZWQgdXAgdG8gYW4gaW50IGJvdW5kYXJ5IGZvciBhbGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvcmlnU2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9yaWdQYXJhbS0+cHNpemUgKyAzKSAmIH4zKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3JpZ1BhcmFtLT52c2l6ZSArIDMpICYgfjMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqZHVwUGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QgKikgbWFsbG9jKG9yaWdTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGR1cFBhcmFtLCBvcmlnUGFyYW0sIG9yaWdTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBwYXJhbSBidWZmZXIgYWxsb2NhdGlvbiBpcyBhbHNvIGRvbmUgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGVzIG9mIDQgYnl0ZXMgb3JpZ2luYWxseS4gSW4gdGhlb3J5IHdlIHNob3VsZCBtZW1jcHkgb25seQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHBhcmFtIHNpemUsIHRoYXQgaXMgd2l0aG91dCByb3VuZGluZyB2c2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy5hZGQoZHVwUGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgLyp2aXJ0dWFsKi8gfkVmZmVjdERlc2MoKSB7Ci0gICAgICAgICAgICBmcmVlKG1OYW1lKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbVBhcmFtcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgICAgIGZyZWUobVBhcmFtc1trXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2hhciAqbU5hbWU7Ci0gICAgICAgIGVmZmVjdF91dWlkX3QgbVV1aWQ7Ci0gICAgICAgIFZlY3RvciA8ZWZmZWN0X3BhcmFtX3QgKj4gbVBhcmFtczsKLSAgICB9OwotCi0gICAgY2xhc3MgSW5wdXRTb3VyY2VEZXNjIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIElucHV0U291cmNlRGVzYygpIHt9Ci0gICAgICAgIC8qdmlydHVhbCovIH5JbnB1dFNvdXJjZURlc2MoKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1FZmZlY3RzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1FZmZlY3RzW2pdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBtRWZmZWN0czsKLSAgICB9OwotCi0KLSAgICBjbGFzcyBJbnB1dERlc2MgewotICAgIHB1YmxpYzoKLSAgICAgICAgSW5wdXREZXNjKGludCBzZXNzaW9uKSA6IG1TZXNzaW9uSWQoc2Vzc2lvbikge30KLSAgICAgICAgLyp2aXJ0dWFsKi8gfklucHV0RGVzYygpIHt9Ci0gICAgICAgIGNvbnN0IGludCBtU2Vzc2lvbklkOwotICAgICAgICBWZWN0b3I8IHNwPEF1ZGlvRWZmZWN0PiA+bUVmZmVjdHM7Ci0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga0lucHV0U291cmNlTmFtZXNbQVVESU9fU09VUkNFX0NOVCAtMV07Ci0KLSAgICB2b2lkIHNldFByZVByb2Nlc3NvckVuYWJsZWQoY29uc3QgSW5wdXREZXNjICppbnB1dERlc2MsIGJvb2wgZW5hYmxlZCk7Ci0gICAgc3RhdHVzX3QgbG9hZFByZVByb2Nlc3NvckNvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKLSAgICBzdGF0dXNfdCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCwgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKLSAgICBFZmZlY3REZXNjICpsb2FkRWZmZWN0KGNub2RlICpyb290KTsKLSAgICBzdGF0dXNfdCBsb2FkSW5wdXRTb3VyY2VzKGNub2RlICpyb290LCBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpOwotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlTmFtZVRvRW51bShjb25zdCBjaGFyICpuYW1lKTsKLSAgICBJbnB1dFNvdXJjZURlc2MgKmxvYWRJbnB1dFNvdXJjZShjbm9kZSAqcm9vdCwgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKLSAgICB2b2lkIGxvYWRFZmZlY3RQYXJhbWV0ZXJzKGNub2RlICpyb290LCBWZWN0b3IgPGVmZmVjdF9wYXJhbV90ICo+JiBwYXJhbXMpOwotICAgIGVmZmVjdF9wYXJhbV90ICpsb2FkRWZmZWN0UGFyYW1ldGVyKGNub2RlICpyb290KTsKLSAgICBzaXplX3QgcmVhZFBhcmFtVmFsdWUoY25vZGUgKm5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSk7Ci0gICAgc2l6ZV90IGdyb3dQYXJhbVNpemUoY2hhciAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjdXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSk7Ci0KLSAgICAvLyBJbnRlcm5hbCBkdW1wIHV0aWxpdGllcy4KLSAgICBzdGF0dXNfdCBkdW1wUGVybWlzc2lvbkRlbmlhbChpbnQgZmQpOwotCi0KLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOyAgICAvLyBwcmV2ZW50cyBjb25jdXJyZW50IGFjY2VzcyB0byBBdWRpb1BvbGljeSBtYW5hZ2VyIGZ1bmN0aW9ucyBjaGFuZ2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBjb25uZWN0aW9uIHN0YXRlICBvciByb3V0aW5nCi0gICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtQXVkaW9Db21tYW5kVGhyZWFkOyAgICAgLy8gYXVkaW8gY29tbWFuZHMgdGhyZWFkCi0gICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtVG9uZVBsYXliYWNrVGhyZWFkOyAgICAgLy8gdG9uZSBwbGF5YmFjayB0aHJlYWQKLSAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1PdXRwdXRDb21tYW5kVGhyZWFkOyAgICAvLyBwcm9jZXNzIHN0b3AgYW5kIHJlbGVhc2Ugb3V0cHV0Ci0gICAgc3RydWN0IGF1ZGlvX3BvbGljeV9kZXZpY2UgKm1wQXVkaW9Qb2xpY3lEZXY7Ci0gICAgc3RydWN0IGF1ZGlvX3BvbGljeSAqbXBBdWRpb1BvbGljeTsKLSAgICBLZXllZFZlY3RvcjwgYXVkaW9fc291cmNlX3QsIElucHV0U291cmNlRGVzYyogPiBtSW5wdXRTb3VyY2VzOwotICAgIEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgSW5wdXREZXNjKiA+IG1JbnB1dHM7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9BVURJT1BPTElDWVNFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKaW5kZXggMmMzYzcxOS4uMWY3YTYxMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCkBAIC0yMiw5ICsyMiwxMSBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyU2luYy5oIgogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyQ3ViaWMuaCIKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckR5bi5oIgogCiAjaWZkZWYgX19hcm1fXwogI2luY2x1ZGUgPG1hY2hpbmUvY3B1LWZlYXR1cmVzLmg+CkBAIC0zOSw4ICs0MSw4IEBACiAKIGNsYXNzIEF1ZGlvUmVzYW1wbGVyT3JkZXIxIDogcHVibGljIEF1ZGlvUmVzYW1wbGVyIHsKIHB1YmxpYzoKLSAgICBBdWRpb1Jlc2FtcGxlck9yZGVyMShpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKSA6Ci0gICAgICAgIEF1ZGlvUmVzYW1wbGVyKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgTE9XX1FVQUxJVFkpLCBtWDBMKDApLCBtWDBSKDApIHsKKyAgICBBdWRpb1Jlc2FtcGxlck9yZGVyMShpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSkgOgorICAgICAgICBBdWRpb1Jlc2FtcGxlcihpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgTE9XX1FVQUxJVFkpLCBtWDBMKDApLCBtWDBSKDApIHsKICAgICB9CiAgICAgdmlydHVhbCB2b2lkIHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CkBAIC03Nyw2ICs3OSw5IEBACiAgICAgaW50IG1YMFI7CiB9OwogCisvKnN0YXRpYyovCitjb25zdCBkb3VibGUgQXVkaW9SZXNhbXBsZXI6OmtQaGFzZU11bHRpcGxpZXIgPSAxTCA8PCBBdWRpb1Jlc2FtcGxlcjo6a051bVBoYXNlQml0czsKKwogYm9vbCBBdWRpb1Jlc2FtcGxlcjo6cXVhbGl0eUlzU3VwcG9ydGVkKHNyY19xdWFsaXR5IHF1YWxpdHkpCiB7CiAgICAgc3dpdGNoIChxdWFsaXR5KSB7CkBAIC04NSw2ICs5MCw5IEBACiAgICAgY2FzZSBNRURfUVVBTElUWToKICAgICBjYXNlIEhJR0hfUVVBTElUWToKICAgICBjYXNlIFZFUllfSElHSF9RVUFMSVRZOgorICAgIGNhc2UgRFlOX0xPV19RVUFMSVRZOgorICAgIGNhc2UgRFlOX01FRF9RVUFMSVRZOgorICAgIGNhc2UgRFlOX0hJR0hfUVVBTElUWToKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTA1LDcgKzExMyw3IEBACiAgICAgICAgIGlmICgqZW5kcHRyID09ICdcMCcpIHsKICAgICAgICAgICAgIGRlZmF1bHRRdWFsaXR5ID0gKHNyY19xdWFsaXR5KSBsOwogICAgICAgICAgICAgQUxPR0QoImZvcmNpbmcgQXVkaW9SZXNhbXBsZXIgcXVhbGl0eSB0byAlZCIsIGRlZmF1bHRRdWFsaXR5KTsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0UXVhbGl0eSA8IERFRkFVTFRfUVVBTElUWSB8fCBkZWZhdWx0UXVhbGl0eSA+IFZFUllfSElHSF9RVUFMSVRZKSB7CisgICAgICAgICAgICBpZiAoZGVmYXVsdFF1YWxpdHkgPCBERUZBVUxUX1FVQUxJVFkgfHwgZGVmYXVsdFF1YWxpdHkgPiBEWU5fSElHSF9RVUFMSVRZKSB7CiAgICAgICAgICAgICAgICAgZGVmYXVsdFF1YWxpdHkgPSBERUZBVUxUX1FVQUxJVFk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEyNSw2ICsxMzMsMTIgQEAKICAgICAgICAgcmV0dXJuIDIwOwogICAgIGNhc2UgVkVSWV9ISUdIX1FVQUxJVFk6CiAgICAgICAgIHJldHVybiAzNDsKKyAgICBjYXNlIERZTl9MT1dfUVVBTElUWToKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgY2FzZSBEWU5fTUVEX1FVQUxJVFk6CisgICAgICAgIHJldHVybiA2OworICAgIGNhc2UgRFlOX0hJR0hfUVVBTElUWToKKyAgICAgICAgcmV0dXJuIDEyOwogICAgIH0KIH0KIApAQCAtMTMyLDcgKzE0Niw3IEBACiBzdGF0aWMgcHRocmVhZF9tdXRleF90IG11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKIHN0YXRpYyB1aW50MzJfdCBjdXJyZW50TUh6ID0gMDsKIAotQXVkaW9SZXNhbXBsZXIqIEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoaW50IGJpdERlcHRoLCBpbnQgaW5DaGFubmVsQ291bnQsCitBdWRpb1Jlc2FtcGxlciogQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBpbkNoYW5uZWxDb3VudCwKICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBzcmNfcXVhbGl0eSBxdWFsaXR5KSB7CiAKICAgICBib29sIGF0RmluYWxRdWFsaXR5OwpAQCAtMTQ4LDYgKzE2MiwxNiBAQAogICAgICAgICBhdEZpbmFsUXVhbGl0eSA9IHRydWU7CiAgICAgfQogCisgICAgLyogaWYgdGhlIGNhbGxlciByZXF1ZXN0cyBERUZBVUxUX1FVQUxJVFkgYW5kIGFmLnJlc2FtcGxlci5wcm9wZXJ0eQorICAgICAqIGhhcyBub3QgYmVlbiBzZXQsIHRoZSB0YXJnZXQgcmVzYW1wbGVyIHF1YWxpdHkgaXMgc2V0IHRvIERZTl9NRURfUVVBTElUWSwKKyAgICAgKiBhbmQgYWxsb3dlZCB0byAidGhyb3R0bGUiIGRvd24gdG8gRFlOX0xPV19RVUFMSVRZIGlmIG5lY2Vzc2FyeQorICAgICAqIGR1ZSB0byBlc3RpbWF0ZWQgQ1BVIGxvYWQgb2YgaGF2aW5nIHRvbyBtYW55IGFjdGl2ZSByZXNhbXBsZXJzCisgICAgICogKHRoZSBjb2RlIGJlbG93IHRoZSBpZikuCisgICAgICovCisgICAgaWYgKHF1YWxpdHkgPT0gREVGQVVMVF9RVUFMSVRZKSB7CisgICAgICAgIHF1YWxpdHkgPSBEWU5fTUVEX1FVQUxJVFk7CisgICAgfQorCiAgICAgLy8gbmFpdmUgaW1wbGVtZW50YXRpb24gb2YgQ1BVIGxvYWQgdGhyb3R0bGluZyBkb2Vzbid0IGFjY291bnQgZm9yIHdoZXRoZXIgcmVzYW1wbGVyIGlzIGFjdGl2ZQogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwogICAgIGZvciAoOzspIHsKQEAgLTE2Miw3ICsxODYsNiBAQAogICAgICAgICAvLyBub3QgZW5vdWdoIENQVSBhdmFpbGFibGUgZm9yIHByb3Bvc2VkIHF1YWxpdHkgbGV2ZWwsIHNvIHRyeSBuZXh0IGxvd2VzdCBsZXZlbAogICAgICAgICBzd2l0Y2ggKHF1YWxpdHkpIHsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2FzZSBERUZBVUxUX1FVQUxJVFk6CiAgICAgICAgIGNhc2UgTE9XX1FVQUxJVFk6CiAgICAgICAgICAgICBhdEZpbmFsUXVhbGl0eSA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE3NSw2ICsxOTgsMTUgQEAKICAgICAgICAgY2FzZSBWRVJZX0hJR0hfUVVBTElUWToKICAgICAgICAgICAgIHF1YWxpdHkgPSBISUdIX1FVQUxJVFk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEWU5fTE9XX1FVQUxJVFk6CisgICAgICAgICAgICBhdEZpbmFsUXVhbGl0eSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEWU5fTUVEX1FVQUxJVFk6CisgICAgICAgICAgICBxdWFsaXR5ID0gRFlOX0xPV19RVUFMSVRZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFlOX0hJR0hfUVVBTElUWToKKyAgICAgICAgICAgIHF1YWxpdHkgPSBEWU5fTUVEX1FVQUxJVFk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwpAQCAtMTgzLDIyICsyMTUsNDMgQEAKIAogICAgIHN3aXRjaCAocXVhbGl0eSkgewogICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBERUZBVUxUX1FVQUxJVFk6CiAgICAgY2FzZSBMT1dfUVVBTElUWToKICAgICAgICAgQUxPR1YoIkNyZWF0ZSBsaW5lYXIgUmVzYW1wbGVyIik7Ci0gICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlck9yZGVyMShiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlck9yZGVyMShpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTUVEX1FVQUxJVFk6CiAgICAgICAgIEFMT0dWKCJDcmVhdGUgY3ViaWMgUmVzYW1wbGVyIik7Ci0gICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlckN1YmljKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyQ3ViaWMoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEhJR0hfUVVBTElUWToKICAgICAgICAgQUxPR1YoIkNyZWF0ZSBISUdIX1FVQUxJVFkgc2luYyBSZXNhbXBsZXIiKTsKLSAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyU2luYyhiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlclNpbmMoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFZFUllfSElHSF9RVUFMSVRZOgogICAgICAgICBBTE9HVigiQ3JlYXRlIFZFUllfSElHSF9RVUFMSVRZIHNpbmMgUmVzYW1wbGVyID0gJWQiLCBxdWFsaXR5KTsKLSAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyU2luYyhiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIHF1YWxpdHkpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlclNpbmMoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIHF1YWxpdHkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERZTl9MT1dfUVVBTElUWToKKyAgICBjYXNlIERZTl9NRURfUVVBTElUWToKKyAgICBjYXNlIERZTl9ISUdIX1FVQUxJVFk6CisgICAgICAgIEFMT0dWKCJDcmVhdGUgZHluYW1pYyBSZXNhbXBsZXIgPSAlZCIsIHF1YWxpdHkpOworICAgICAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlckR5bjxmbG9hdCwgZmxvYXQsIGZsb2F0PihpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgcXVhbGl0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgICAgICAgICBpZiAocXVhbGl0eSA9PSBEWU5fSElHSF9RVUFMSVRZKSB7CisgICAgICAgICAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyRHluPGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+KGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgcXVhbGl0eSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlckR5bjxpbnQxNl90LCBpbnQxNl90LCBpbnQzMl90PihpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHF1YWxpdHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMjA3LDI2ICsyNjAsMjYgQEAKICAgICByZXR1cm4gcmVzYW1wbGVyOwogfQogCi1BdWRpb1Jlc2FtcGxlcjo6QXVkaW9SZXNhbXBsZXIoaW50IGJpdERlcHRoLCBpbnQgaW5DaGFubmVsQ291bnQsCitBdWRpb1Jlc2FtcGxlcjo6QXVkaW9SZXNhbXBsZXIoaW50IGluQ2hhbm5lbENvdW50LAogICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpIDoKLSAgICBtQml0RGVwdGgoYml0RGVwdGgpLCBtQ2hhbm5lbENvdW50KGluQ2hhbm5lbENvdW50KSwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLCBtSW5TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLCBtSW5wdXRJbmRleCgwKSwKLSAgICAgICAgICAgIG1QaGFzZUZyYWN0aW9uKDApLCBtTG9jYWxUaW1lRnJlcSgwKSwKLSAgICAgICAgICAgIG1QVFMoQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpLCBtUXVhbGl0eShxdWFsaXR5KSB7Ci0gICAgLy8gc2FuaXR5IGNoZWNrIG9uIGZvcm1hdAotICAgIGlmICgoYml0RGVwdGggIT0gMTYpIHx8KGluQ2hhbm5lbENvdW50IDwgMSkgfHwgKGluQ2hhbm5lbENvdW50ID4gMikpIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIHNhbXBsZSBmb3JtYXQsICVkIGJpdHMsICVkIGNoYW5uZWxzIiwgYml0RGVwdGgsCi0gICAgICAgICAgICAgICAgaW5DaGFubmVsQ291bnQpOwotICAgICAgICAvLyBBTE9HX0FTU0VSVCgwKTsKKyAgICAgICAgbUNoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCksCisgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLCBtSW5TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLCBtSW5wdXRJbmRleCgwKSwKKyAgICAgICAgbVBoYXNlRnJhY3Rpb24oMCksIG1Mb2NhbFRpbWVGcmVxKDApLAorICAgICAgICBtUFRTKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTKSwgbVF1YWxpdHkocXVhbGl0eSkgeworCisgICAgY29uc3QgaW50IG1heENoYW5uZWxzID0gcXVhbGl0eSA8IERZTl9MT1dfUVVBTElUWSA/IDIgOiA4OworICAgIGlmIChpbkNoYW5uZWxDb3VudCA8IDEKKyAgICAgICAgICAgIHx8IGluQ2hhbm5lbENvdW50ID4gbWF4Q2hhbm5lbHMpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5zdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCAlZCBxdWFsaXR5ICVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICBxdWFsaXR5LCBpbkNoYW5uZWxDb3VudCk7CiAgICAgfQogICAgIGlmIChzYW1wbGVSYXRlIDw9IDApIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICVkIEh6Iiwgc2FtcGxlUmF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICVkIEh6Iiwgc2FtcGxlUmF0ZSk7CiAgICAgfQogCiAgICAgLy8gaW5pdGlhbGl6ZSBjb21tb24gbWVtYmVycwogICAgIG1Wb2x1bWVbMF0gPSBtVm9sdW1lWzFdID0gMDsKICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOwotCiB9CiAKIEF1ZGlvUmVzYW1wbGVyOjp+QXVkaW9SZXNhbXBsZXIoKSB7CkBAIC0yNDYsMTAgKzI5OSwxMiBAQAogICAgIG1QaGFzZUluY3JlbWVudCA9ICh1aW50MzJfdCkoKGtQaGFzZU11bHRpcGxpZXIgKiBpblNhbXBsZVJhdGUpIC8gbVNhbXBsZVJhdGUpOwogfQogCi12b2lkIEF1ZGlvUmVzYW1wbGVyOjpzZXRWb2x1bWUoaW50MTZfdCBsZWZ0LCBpbnQxNl90IHJpZ2h0KSB7Cit2b2lkIEF1ZGlvUmVzYW1wbGVyOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgYW50aS16aXBwZXIgZmlsdGVyCi0gICAgbVZvbHVtZVswXSA9IGxlZnQ7Ci0gICAgbVZvbHVtZVsxXSA9IHJpZ2h0OworICAgIC8vIGNvbnZlcnQgdG8gVTQuMTIgZm9yIGludGVybmFsIGludGVnZXIgdXNlIChyb3VuZCBkb3duKQorICAgIC8vIGludGVnZXIgdm9sdW1lIHZhbHVlcyBhcmUgY2xhbXBlZCB0byAwIHRvIFVOSVRZX0dBSU4uCisgICAgbVZvbHVtZVswXSA9IHU0XzEyX2Zyb21fZmxvYXQoY2xhbXBGbG9hdFZvbChsZWZ0KSk7CisgICAgbVZvbHVtZVsxXSA9IHU0XzEyX2Zyb21fZmxvYXQoY2xhbXBGbG9hdFZvbChyaWdodCkpOwogfQogCiB2b2lkIEF1ZGlvUmVzYW1wbGVyOjpzZXRMb2NhbFRpbWVGcmVxKHVpbnQ2NF90IGZyZXEpIHsKQEAgLTMwNSw3ICszNjAsNyBAQAogICAgIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50ID0gbVBoYXNlSW5jcmVtZW50OwogICAgIHNpemVfdCBvdXRwdXRJbmRleCA9IDA7CiAgICAgc2l6ZV90IG91dHB1dFNhbXBsZUNvdW50ID0gb3V0RnJhbWVDb3VudCAqIDI7Ci0gICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChvdXRGcmFtZUNvdW50Km1JblNhbXBsZVJhdGUpL21TYW1wbGVSYXRlOworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSBnZXRJbkZyYW1lQ291bnRSZXF1aXJlZChvdXRGcmFtZUNvdW50KTsKIAogICAgIC8vIEFMT0dFKCJzdGFydGluZyByZXNhbXBsZSAlZCBmcmFtZXMsIGlucHV0SW5kZXg9JWQsIHBoYXNlRnJhY3Rpb249JWQsIHBoYXNlSW5jcmVtZW50PSVkIiwKICAgICAvLyAgICAgIG91dEZyYW1lQ291bnQsIGlucHV0SW5kZXgsIHBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKQEAgLTMzOSw4ICszOTQsOSBAQAogICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZsICogSW50ZXJwKG1YMEwsIGluWzBdLCBwaGFzZUZyYWN0aW9uKTsKICAgICAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSB2ciAqIEludGVycChtWDBSLCBpblsxXSwgcGhhc2VGcmFjdGlvbik7CiAgICAgICAgICAgICBBZHZhbmNlKCZpbnB1dEluZGV4LCAmcGhhc2VGcmFjdGlvbiwgcGhhc2VJbmNyZW1lbnQpOwotICAgICAgICAgICAgaWYgKG91dHB1dEluZGV4ID09IG91dHB1dFNhbXBsZUNvdW50KQorICAgICAgICAgICAgaWYgKG91dHB1dEluZGV4ID09IG91dHB1dFNhbXBsZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBwcm9jZXNzIGlucHV0IHNhbXBsZXMKQEAgLTQwMiw3ICs0NTgsNyBAQAogICAgIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50ID0gbVBoYXNlSW5jcmVtZW50OwogICAgIHNpemVfdCBvdXRwdXRJbmRleCA9IDA7CiAgICAgc2l6ZV90IG91dHB1dFNhbXBsZUNvdW50ID0gb3V0RnJhbWVDb3VudCAqIDI7Ci0gICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChvdXRGcmFtZUNvdW50Km1JblNhbXBsZVJhdGUpL21TYW1wbGVSYXRlOworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSBnZXRJbkZyYW1lQ291bnRSZXF1aXJlZChvdXRGcmFtZUNvdW50KTsKIAogICAgIC8vIEFMT0dFKCJzdGFydGluZyByZXNhbXBsZSAlZCBmcmFtZXMsIGlucHV0SW5kZXg9JWQsIHBoYXNlRnJhY3Rpb249JWQsIHBoYXNlSW5jcmVtZW50PSVkIiwKICAgICAvLyAgICAgIG91dEZyYW1lQ291bnQsIGlucHV0SW5kZXgsIHBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKQEAgLTQzNCw4ICs0OTAsOSBAQAogICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZsICogc2FtcGxlOwogICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZyICogc2FtcGxlOwogICAgICAgICAgICAgQWR2YW5jZSgmaW5wdXRJbmRleCwgJnBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKLSAgICAgICAgICAgIGlmIChvdXRwdXRJbmRleCA9PSBvdXRwdXRTYW1wbGVDb3VudCkKKyAgICAgICAgICAgIGlmIChvdXRwdXRJbmRleCA9PSBvdXRwdXRTYW1wbGVDb3VudCkgewogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gcHJvY2VzcyBpbnB1dCBzYW1wbGVzCkBAIC01MTQsNiArNTcxLDE2IEBACiAgICAgICAgICAgICBzaXplX3QgJm91dHB1dEluZGV4LCBpbnQzMl90KiBvdXQsIHNpemVfdCAmaW5wdXRJbmRleCwgaW50MzJfdCB2bCwgaW50MzJfdCB2ciwKICAgICAgICAgICAgIHVpbnQzMl90ICZwaGFzZUZyYWN0aW9uLCB1aW50MzJfdCBwaGFzZUluY3JlbWVudCkKIHsKKyAgICAodm9pZCltYXhPdXRQdDsgLy8gcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIgd2FybmluZ3MKKyAgICAodm9pZCltYXhJbklkeDsKKyAgICAodm9pZClvdXRwdXRJbmRleDsKKyAgICAodm9pZClvdXQ7CisgICAgKHZvaWQpaW5wdXRJbmRleDsKKyAgICAodm9pZCl2bDsKKyAgICAodm9pZCl2cjsKKyAgICAodm9pZClwaGFzZUZyYWN0aW9uOworICAgICh2b2lkKXBoYXNlSW5jcmVtZW50OworICAgICh2b2lkKWluOwogI2RlZmluZSBNT19QQVJBTTUgICAiMzYiICAgICAgICAvLyBvZmZzZXQgb2YgcGFyYW1ldGVyIDUgKG91dHB1dEluZGV4KQogCiAgICAgYXNtKApAQCAtNTI2LDcgKzU5Myw3IEBACiAgICAgICAgICIgICBsZHIgcjgsIFtzcCwgIyIgTU9fUEFSQU01ICIgKyA0XVxuIiAgICAgLy8gb3V0CiAgICAgICAgICIgICBsZHIgcjAsIFtzcCwgIyIgTU9fUEFSQU01ICIgKyAwXVxuIiAgICAgLy8gJm91dHB1dEluZGV4CiAgICAgICAgICIgICBsZHIgcjAsIFtyMF1cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0SW5kZXgKLSAgICAgICAgIiAgIGFkZCByOCwgcjAsIGFzbCAjMlxuIiAgICAgICAgICAgICAgICAgICAvLyBjdXJPdXQKKyAgICAgICAgIiAgIGFkZCByOCwgcjgsIHIwLCBhc2wgIzJcbiIgICAgICAgICAgICAgICAvLyBjdXJPdXQKICAgICAgICAgIiAgIGxkciByOSwgW3NwLCAjIiBNT19QQVJBTTUgIiArIDI0XVxuIiAgICAvLyBwaGFzZUluY3JlbWVudAogICAgICAgICAiICAgbGRyIHIxMCwgW3NwLCAjIiBNT19QQVJBTTUgIiArIDEyXVxuIiAgIC8vIHZsCiAgICAgICAgICIgICBsZHIgcjExLCBbc3AsICMiIE1PX1BBUkFNNSAiICsgMTZdXG4iICAgLy8gdnIKQEAgLTYyNSw2ICs2OTIsMTYgQEAKICAgICAgICAgICAgIHNpemVfdCAmb3V0cHV0SW5kZXgsIGludDMyX3QqIG91dCwgc2l6ZV90ICZpbnB1dEluZGV4LCBpbnQzMl90IHZsLCBpbnQzMl90IHZyLAogICAgICAgICAgICAgdWludDMyX3QgJnBoYXNlRnJhY3Rpb24sIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50KQogeworICAgICh2b2lkKW1heE91dFB0OyAvLyByZW1vdmUgdW51c2VkIHBhcmFtZXRlciB3YXJuaW5ncworICAgICh2b2lkKW1heEluSWR4OworICAgICh2b2lkKW91dHB1dEluZGV4OworICAgICh2b2lkKW91dDsKKyAgICAodm9pZClpbnB1dEluZGV4OworICAgICh2b2lkKXZsOworICAgICh2b2lkKXZyOworICAgICh2b2lkKXBoYXNlRnJhY3Rpb247CisgICAgKHZvaWQpcGhhc2VJbmNyZW1lbnQ7CisgICAgKHZvaWQpaW47CiAjZGVmaW5lIFNUX1BBUkFNNSAgICAiNDAiICAgICAvLyBvZmZzZXQgb2YgcGFyYW1ldGVyIDUgKG91dHB1dEluZGV4KQogICAgIGFzbSgKICAgICAgICAgInN0bWZkICBzcCEsIHtyNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIHIxMSwgcjEyLCBscn1cbiIKQEAgLTYzNiw3ICs3MTMsNyBAQAogICAgICAgICAiICAgbGRyIHI4LCBbc3AsICMiIFNUX1BBUkFNNSAiICsgNF1cbiIgICAgIC8vIG91dAogICAgICAgICAiICAgbGRyIHIwLCBbc3AsICMiIFNUX1BBUkFNNSAiICsgMF1cbiIgICAgIC8vICZvdXRwdXRJbmRleAogICAgICAgICAiICAgbGRyIHIwLCBbcjBdXG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dEluZGV4Ci0gICAgICAgICIgICBhZGQgcjgsIHIwLCBhc2wgIzJcbiIgICAgICAgICAgICAgICAgICAgLy8gY3VyT3V0CisgICAgICAgICIgICBhZGQgcjgsIHI4LCByMCwgYXNsICMyXG4iICAgICAgICAgICAgICAgLy8gY3VyT3V0CiAgICAgICAgICIgICBsZHIgcjksIFtzcCwgIyIgU1RfUEFSQU01ICIgKyAyNF1cbiIgICAgLy8gcGhhc2VJbmNyZW1lbnQKICAgICAgICAgIiAgIGxkciByMTAsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyAxMl1cbiIgICAvLyB2bAogICAgICAgICAiICAgbGRyIHIxMSwgW3NwLCAjIiBTVF9QQVJBTTUgIiArIDE2XVxuIiAgIC8vIHZyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCmluZGV4IDMzZTY0Y2UuLmNkYzZkOTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQxLDE2ICs0MiwyMSBAQAogICAgICAgICBNRURfUVVBTElUWT0yLAogICAgICAgICBISUdIX1FVQUxJVFk9MywKICAgICAgICAgVkVSWV9ISUdIX1FVQUxJVFk9NCwKKyAgICAgICAgRFlOX0xPV19RVUFMSVRZPTUsCisgICAgICAgIERZTl9NRURfUVVBTElUWT02LAorICAgICAgICBEWU5fSElHSF9RVUFMSVRZPTcsCiAgICAgfTsKIAotICAgIHN0YXRpYyBBdWRpb1Jlc2FtcGxlciogY3JlYXRlKGludCBiaXREZXB0aCwgaW50IGluQ2hhbm5lbENvdW50LAorICAgIHN0YXRpYyBjb25zdCBmbG9hdCBVTklUWV9HQUlOX0ZMT0FUID0gMS4wZjsKKworICAgIHN0YXRpYyBBdWRpb1Jlc2FtcGxlciogY3JlYXRlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGluQ2hhbm5lbENvdW50LAogICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBzcmNfcXVhbGl0eSBxdWFsaXR5PURFRkFVTFRfUVVBTElUWSk7CiAKICAgICB2aXJ0dWFsIH5BdWRpb1Jlc2FtcGxlcigpOwogCiAgICAgdmlydHVhbCB2b2lkIGluaXQoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHNldFNhbXBsZVJhdGUoaW50MzJfdCBpblNhbXBsZVJhdGUpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRWb2x1bWUoaW50MTZfdCBsZWZ0LCBpbnQxNl90IHJpZ2h0KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0TG9jYWxUaW1lRnJlcSh1aW50NjRfdCBmcmVxKTsKIAogICAgIC8vIHNldCB0aGUgUFRTIG9mIHRoZSBuZXh0IGJ1ZmZlciBvdXRwdXQgYnkgdGhlIHJlc2FtcGxlcgpAQCAtNjAsNyArNjYsNyBAQAogICAgIC8vIEEgbW9ubyBwcm92aWRlciBkZWxpdmVycyBhIHNlcXVlbmNlIG9mIHNhbXBsZXMuCiAgICAgLy8gQSBzdGVyZW8gcHJvdmlkZXIgZGVsaXZlcnMgYSBzZXF1ZW5jZSBvZiBpbnRlcmxlYXZlZCBwYWlycyBvZiBzYW1wbGVzLgogICAgIC8vIE11bHRpLWNoYW5uZWwgcHJvdmlkZXJzIGFyZSBub3Qgc3VwcG9ydGVkLgotICAgIC8vIEluIGVpdGhlciBjYXNlLCAnb3V0JyBob2xkcyBpbnRlcmxlYXZlZCBwYWlycyBvZiBmaXhlZC1wb2ludCBzaWduZWQgUTE5LjEyLgorICAgIC8vIEluIGVpdGhlciBjYXNlLCAnb3V0JyBob2xkcyBpbnRlcmxlYXZlZCBwYWlycyBvZiBmaXhlZC1wb2ludCBRNC4yNy4KICAgICAvLyBUaGF0IGlzLCBmb3IgYSBtb25vIHByb3ZpZGVyLCB0aGVyZSBpcyBhbiBpbXBsaWNpdCB1cC1jaGFubmVsaW5nLgogICAgIC8vIFNpbmNlIHRoaXMgbWV0aG9kIGFjY3VtdWxhdGVzLCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbGVhcmluZyAnb3V0JyBpbml0aWFsbHkuCiAgICAgLy8gRklYTUUgYXNzdW1lcyBwcm92aWRlciBpcyBhbHdheXMgc3VjY2Vzc2Z1bDsgaXQgc2hvdWxkIHJldHVybiB0aGUgYWN0dWFsIGZyYW1lIGNvdW50LgpAQCAtODEsOSArODcsOSBAQAogICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUGhhc2VNYXNrID0gKDFMVTw8a051bVBoYXNlQml0cyktMTsKIAogICAgIC8vIG11bHRpcGxpZXIgdG8gY2FsY3VsYXRlIGZpeGVkIHBvaW50IHBoYXNlIGluY3JlbWVudAotICAgIHN0YXRpYyBjb25zdCBkb3VibGUga1BoYXNlTXVsdGlwbGllciA9IDFMIDw8IGtOdW1QaGFzZUJpdHM7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBrUGhhc2VNdWx0aXBsaWVyOwogCi0gICAgQXVkaW9SZXNhbXBsZXIoaW50IGJpdERlcHRoLCBpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSwgc3JjX3F1YWxpdHkgcXVhbGl0eSk7CisgICAgQXVkaW9SZXNhbXBsZXIoaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpOwogCiAgICAgLy8gcHJldmVudCBjb3B5aW5nCiAgICAgQXVkaW9SZXNhbXBsZXIoY29uc3QgQXVkaW9SZXNhbXBsZXImKTsKQEAgLTkxLDcgKzk3LDYgQEAKIAogICAgIGludDY0X3QgY2FsY3VsYXRlT3V0cHV0UFRTKGludCBvdXRwdXRGcmFtZUluZGV4KTsKIAotICAgIGNvbnN0IGludDMyX3QgbUJpdERlcHRoOwogICAgIGNvbnN0IGludDMyX3QgbUNoYW5uZWxDb3VudDsKICAgICBjb25zdCBpbnQzMl90IG1TYW1wbGVSYXRlOwogICAgIGludDMyX3QgbUluU2FtcGxlUmF0ZTsKQEAgLTEwNyw2ICsxMTIsNDcgQEAKICAgICB1aW50NjRfdCBtTG9jYWxUaW1lRnJlcTsKICAgICBpbnQ2NF90IG1QVFM7CiAKKyAgICAvLyByZXR1cm5zIHRoZSBpbkZyYW1lQ291bnQgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgb3V0RnJhbWVDb3VudCBmcmFtZXMuCisgICAgLy8KKyAgICAvLyBQbGFjZWQgaGVyZSB0byBiZSBhIGNvbnNpc3RlbnQgZm9yIGFsbCByZXNhbXBsZXJzLgorICAgIC8vCisgICAgLy8gUmlnaHQgbm93LCB3ZSB1c2UgdGhlIHVwcGVyIGJvdW5kIHdpdGhvdXQgcmVnYXJkcyB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKKyAgICAvLyBpbnB1dCBidWZmZXIgdXNpbmcgaW50ZWdlciBhcml0aG1ldGljLCBhcyBmb2xsb3dzOgorICAgIC8vCisgICAgLy8gKHN0YXRpY19jYXN0PHVpbnQ2NF90PihvdXRGcmFtZUNvdW50KSptSW5TYW1wbGVSYXRlICsgKG1TYW1wbGVSYXRlIC0gMSkpL21TYW1wbGVSYXRlOworICAgIC8vCisgICAgLy8gVGhlIGRvdWJsZSBwcmVjaXNpb24gZXF1aXZhbGVudCAoZmxvYXQgbWF5IG5vdCBiZSBwcmVjaXNlIGVub3VnaCk6CisgICAgLy8gY2VpbChzdGF0aWNfY2FzdDxkb3VibGU+KG91dEZyYW1lQ291bnQpICogbUluU2FtcGxlUmF0ZSAvIG1TYW1wbGVSYXRlKTsKKyAgICAvLworICAgIC8vIHRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgdGhlIG1QaGFzZUluY3JlbWVudCBpcyByb3VuZGVkIGRvd24gZnJvbQorICAgIC8vICNwaGFzZXMgKiBtSW5TYW1wbGVSYXRlL21TYW1wbGVSYXRlIGFuZCB0aGUgZmFjdCB0aGF0IFN1bShGbG9vcih4KSkgPD0gRmxvb3IoU3VtKHgpKS4KKyAgICAvLyBodHRwOi8vd3d3LnByb29md2lraS5vcmcvd2lraS9TdW1fb2ZfRmxvb3JzX05vdF9HcmVhdGVyX1RoYW5fRmxvb3Jfb2ZfU3VtcworICAgIC8vCisgICAgLy8gKHNvIGxvbmcgYXMgZG91YmxlIHByZWNpc2lvbiBpcyBjb21wdXRlZCBhY2N1cmF0ZWx5IGVub3VnaCB0byBiZSBjb25zaWRlcmVkCisgICAgLy8gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBGbG9vcih4KSB2YWx1ZSBpbiBpbnQzMl90IGFyaXRobWV0aWM7IHRodXMgdGhpcworICAgIC8vIHdpbGwgbm90IG5lY2Vzc2FyaWx5IGhvbGQgZm9yIGZsb2F0cykuCisgICAgLy8KKyAgICAvLyBUT0RPOgorICAgIC8vIEdyZWF0ZXIgYWNjdXJhY3kgYW5kIGEgdGlnaHQgYm91bmQgaXMgb2J0YWluZWQgYnk6CisgICAgLy8gMSkgc3VidHJhY3QgYW5kIGFkanVzdCBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEF1ZGlvQnVmZmVyUHJvdmlkZXIgYnVmZmVyLgorICAgIC8vIDIpIHVzaW5nIHRoZSBleGFjdCBpbnRlZ2VyIGZvcm11bGEgd2hlcmUgKGlnbm9yaW5nIDY0YiBjYXN0aW5nKQorICAgIC8vICBpbkZyYW1lQ291bnQgPSAobVBoYXNlSW5jcmVtZW50ICogKG91dEZyYW1lQ291bnQgLSAxKSArIG1QaGFzZUZyYWN0aW9uKSAvIHBoYXNlV3JhcExpbWl0OworICAgIC8vICBwaGFzZVdyYXBMaW1pdCBpcyB0aGUgd3JhcGFyb3VuZCAoMSA8PCBrTnVtUGhhc2VCaXRzKSwgaWYgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LgorICAgIC8vCisgICAgaW5saW5lIHNpemVfdCBnZXRJbkZyYW1lQ291bnRSZXF1aXJlZChzaXplX3Qgb3V0RnJhbWVDb3VudCkgeworICAgICAgICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQ2NF90PihvdXRGcmFtZUNvdW50KSptSW5TYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgKyAobVNhbXBsZVJhdGUgLSAxKSkvbVNhbXBsZVJhdGU7CisgICAgfQorCisgICAgaW5saW5lIGZsb2F0IGNsYW1wRmxvYXRWb2woZmxvYXQgdm9sdW1lKSB7CisgICAgICAgIGlmICh2b2x1bWUgPiBVTklUWV9HQUlOX0ZMT0FUKSB7CisgICAgICAgICAgICByZXR1cm4gVU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgfSBlbHNlIGlmICh2b2x1bWUgPj0gMC4pIHsKKyAgICAgICAgICAgIHJldHVybiB2b2x1bWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDAuOyAgLy8gTmFOIG9yIG5lZ2F0aXZlIHZvbHVtZSBtYXBzIHRvIDAuCisgICAgfQorCiBwcml2YXRlOgogICAgIGNvbnN0IHNyY19xdWFsaXR5IG1RdWFsaXR5OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAKaW5kZXggMThlNTllOS4uOGYxNGZmOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcApAQCAtNjAsMTQgKzYwLDE1IEBACiAgICAgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CiAgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKICAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsKLSAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKG91dEZyYW1lQ291bnQqbUluU2FtcGxlUmF0ZSkvbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IGdldEluRnJhbWVDb3VudFJlcXVpcmVkKG91dEZyYW1lQ291bnQpOwogCiAgICAgLy8gZmV0Y2ggZmlyc3QgYnVmZmVyCiAgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsIG1QVFMpOwotICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkKKyAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICAvLyBBTE9HVygiTmV3IGJ1ZmZlcjogb2Zmc2V0PSVwLCBmcmFtZXM9JWRuIiwgbUJ1ZmZlci5yYXcsIG1CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgfQogICAgIGludDE2X3QgKmluID0gbUJ1ZmZlci5pMTY7CkBAIC05Nyw4ICs5OCw5IEBACiAgICAgICAgICAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OwogICAgICAgICAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU91dHB1dFBUUyhvdXRwdXRJbmRleCAvIDIpKTsKLSAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBnb3RvIHNhdmVfc3RhdGU7ICAvLyB1Z2x5LCBidXQgZWZmaWNpZW50CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGluID0gbUJ1ZmZlci5pMTY7CiAgICAgICAgICAgICAgICAgLy8gQUxPR1coIk5ldyBidWZmZXI6IG9mZnNldD0lcCwgZnJhbWVzPSVkIiwgbUJ1ZmZlci5yYXcsIG1CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgICAgICAgICB9CkBAIC0xMjYsMTQgKzEyOCwxNSBAQAogICAgIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50ID0gbVBoYXNlSW5jcmVtZW50OwogICAgIHNpemVfdCBvdXRwdXRJbmRleCA9IDA7CiAgICAgc2l6ZV90IG91dHB1dFNhbXBsZUNvdW50ID0gb3V0RnJhbWVDb3VudCAqIDI7Ci0gICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChvdXRGcmFtZUNvdW50Km1JblNhbXBsZVJhdGUpL21TYW1wbGVSYXRlOworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSBnZXRJbkZyYW1lQ291bnRSZXF1aXJlZChvdXRGcmFtZUNvdW50KTsKIAogICAgIC8vIGZldGNoIGZpcnN0IGJ1ZmZlcgogICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLCBtUFRTKTsKLSAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpCisgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgLy8gQUxPR1coIk5ldyBidWZmZXI6IG9mZnNldD0lcCwgZnJhbWVzPSVkIiwgbUJ1ZmZlci5yYXcsIG1CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgfQogICAgIGludDE2X3QgKmluID0gbUJ1ZmZlci5pMTY7CkBAIC0xNjMsOCArMTY2LDkgQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlT3V0cHV0UFRTKG91dHB1dEluZGV4IC8gMikpOwotICAgICAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2F2ZV9zdGF0ZTsgIC8vIHVnbHksIGJ1dCBlZmZpY2llbnQKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gQUxPR1coIk5ldyBidWZmZXI6IG9mZnNldD0lcCwgZnJhbWVzPSVkbiIsIG1CdWZmZXIucmF3LCBtQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICAgICAgICAgIGluID0gbUJ1ZmZlci5pMTY7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuaAppbmRleCAyMDNiOTMzLi5iMzE1ZGE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmgKQEAgLTI4LDggKzI4LDggQEAKIAogY2xhc3MgQXVkaW9SZXNhbXBsZXJDdWJpYyA6IHB1YmxpYyBBdWRpb1Jlc2FtcGxlciB7CiBwdWJsaWM6Ci0gICAgQXVkaW9SZXNhbXBsZXJDdWJpYyhpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKSA6Ci0gICAgICAgIEF1ZGlvUmVzYW1wbGVyKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgTUVEX1FVQUxJVFkpIHsKKyAgICBBdWRpb1Jlc2FtcGxlckN1YmljKGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKSA6CisgICAgICAgIEF1ZGlvUmVzYW1wbGVyKGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBNRURfUVVBTElUWSkgewogICAgIH0KICAgICB2aXJ0dWFsIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZWIyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCkBAIC0wLDAgKzEsNjIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1Jlc2FtcGxlckR5biIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyRmlyT3BzLmgiIC8vIFVTRV9ORU9OIGFuZCBVU0VfSU5MSU5FX0FTU0VNQkxZIGRlZmluZWQgaGVyZQorI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oIgorI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzc05lb24uaCIKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckZpckdlbi5oIiAvLyByZXF1aXJlcyBtYXRoLmgKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckR5bi5oIgorCisvLyNkZWZpbmUgREVCVUdfUkVTQU1QTEVSCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoKKyAqIEluQnVmZmVyIGlzIGEgdHlwZSBhZ25vc3RpYyBpbnB1dCBidWZmZXIuCisgKgorICogTGF5b3V0IG9mIHRoZSBzdGF0ZSBidWZmZXIgZm9yIGhhbGZOdW1Db2Vmcz04LgorICoKKyAqIFtycnJycnJwcHBwcHBwcG5ubm5ubm5ucnJycnJycnJycnJycnJycnJyci4uLi4gcnJycnJycl0KKyAqICBTICAgICAgICAgICAgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUgorICoKKyAqIFMgPSBtU3RhdGUKKyAqIEkgPSBtSW1wdWxzZQorICogUiA9IG1SaW5nRnVsbAorICogcCA9IHBhc3Qgc2FtcGxlcywgY29udm9sdXRlZCB3aXRoIHRoZSAocClvc2l0aXZlIHNpZGUgb2Ygc2luYygpCisgKiBuID0gZnV0dXJlIHNhbXBsZXMsIGNvbnZvbHV0ZWQgd2l0aCB0aGUgKG4pZWdhdGl2ZSBzaWRlIG9mIHNpbmMoKQorICogciA9IGV4dHJhIHNwYWNlIGZvciBpbXBsZW1lbnRpbmcgdGhlIHJpbmcgYnVmZmVyCisgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK0F1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpJbkJ1ZmZlcjo6SW5CdWZmZXIoKQorICAgIDogbVN0YXRlKE5VTEwpLCBtSW1wdWxzZShOVUxMKSwgbVJpbmdGdWxsKE5VTEwpLCBtU3RhdGVDb3VudCgwKQoreworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgorQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkluQnVmZmVyOjp+SW5CdWZmZXIoKQoreworICAgIGluaXQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkluQnVmZmVyOjppbml0KCkKK3sKKyAgICBmcmVlKG1TdGF0ZSk7CisgICAgbVN0YXRlID0gTlVMTDsKKyAgICBtSW1wdWxzZSA9IE5VTEw7CisgICAgbVJpbmdGdWxsID0gTlVMTDsKKyAgICBtU3RhdGVDb3VudCA9IDA7Cit9CisKKy8vIHJlc2l6ZXMgdGhlIHN0YXRlIGJ1ZmZlciB0byBhY2NvbW1vZGF0ZSB0aGUgYXBwcm9wcmlhdGUgZmlsdGVyIGxlbmd0aAordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkluQnVmZmVyOjpyZXNpemUoaW50IENIQU5ORUxTLCBpbnQgaGFsZk51bUNvZWZzKQoreworICAgIC8vIGNhbGN1bGF0ZSBkZXNpcmVkIHN0YXRlIHNpemUKKyAgICBzaXplX3Qgc3RhdGVDb3VudCA9IGhhbGZOdW1Db2VmcyAqIENIQU5ORUxTICogMiAqIGtTdGF0ZVNpemVNdWx0aXBsZU9mRmlsdGVyTGVuZ3RoOworCisgICAgLy8gY2hlY2sgaWYgYnVmZmVyIG5lZWRzIHJlc2l6aW5nCisgICAgaWYgKG1TdGF0ZQorICAgICAgICAgICAgJiYgc3RhdGVDb3VudCA9PSBtU3RhdGVDb3VudAorICAgICAgICAgICAgJiYgbVJpbmdGdWxsLW1TdGF0ZSA9PSAoc3NpemVfdCkgKG1TdGF0ZUNvdW50LWhhbGZOdW1Db2VmcypDSEFOTkVMUykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNyZWF0ZSBuZXcgYnVmZmVyCisgICAgVEkqIHN0YXRlID0gTlVMTDsKKyAgICAodm9pZClwb3NpeF9tZW1hbGlnbihyZWludGVycHJldF9jYXN0PHZvaWQqKj4oJnN0YXRlKSwgMzIsIHN0YXRlQ291bnQqc2l6ZW9mKCpzdGF0ZSkpOworICAgIG1lbXNldChzdGF0ZSwgMCwgc3RhdGVDb3VudCpzaXplb2YoKnN0YXRlKSk7CisKKyAgICAvLyBhdHRlbXB0IHRvIHByZXNlcnZlIHN0YXRlCisgICAgaWYgKG1TdGF0ZSkgeworICAgICAgICBUSSogc3JjTG8gPSBtSW1wdWxzZSAtIGhhbGZOdW1Db2VmcypDSEFOTkVMUzsKKyAgICAgICAgVEkqIHNyY0hpID0gbUltcHVsc2UgKyBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7CisgICAgICAgIFRJKiBkc3QgPSBzdGF0ZTsKKworICAgICAgICBpZiAoc3JjTG8gPCBtU3RhdGUpIHsKKyAgICAgICAgICAgIGRzdCArPSBtU3RhdGUtc3JjTG87CisgICAgICAgICAgICBzcmNMbyA9IG1TdGF0ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjSGkgPiBtU3RhdGUgKyBtU3RhdGVDb3VudCkgeworICAgICAgICAgICAgc3JjSGkgPSBtU3RhdGUgKyBtU3RhdGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoZHN0LCBzcmNMbywgKHNyY0hpIC0gc3JjTG8pICogc2l6ZW9mKCpzcmNMbykpOworICAgICAgICBmcmVlKG1TdGF0ZSk7CisgICAgfQorCisgICAgLy8gc2V0IGNsYXNzIG1lbWJlciB2YXJzCisgICAgbVN0YXRlID0gc3RhdGU7CisgICAgbVN0YXRlQ291bnQgPSBzdGF0ZUNvdW50OworICAgIG1JbXB1bHNlID0gc3RhdGUgKyBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7IC8vIGFjdHVhbGx5IG9uZSBzYW1wbGUgZ3JlYXRlciB0aGFuIG5lZWRlZAorICAgIG1SaW5nRnVsbCA9IHN0YXRlICsgbVN0YXRlQ291bnQgLSBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7Cit9CisKKy8vIGNvcHkgaW4gdGhlIGlucHV0IGRhdGEgaW50byB0aGUgaGVhZCAoaW1wdWxzZStoYWxmTnVtQ29lZnMpIG9mIHRoZSBidWZmZXIuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordGVtcGxhdGU8aW50IENIQU5ORUxTPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6SW5CdWZmZXI6OnJlYWRBZ2FpbihUSSomIGltcHVsc2UsIGNvbnN0IGludCBoYWxmTnVtQ29lZnMsCisgICAgICAgIGNvbnN0IFRJKiBjb25zdCBpbiwgY29uc3Qgc2l6ZV90IGlucHV0SW5kZXgpCit7CisgICAgVEkqIGhlYWQgPSBpbXB1bHNlICsgaGFsZk51bUNvZWZzKkNIQU5ORUxTOworICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Q0hBTk5FTFMgOyBpKyspIHsKKyAgICAgICAgaGVhZFtpXSA9IGluW2lucHV0SW5kZXgqQ0hBTk5FTFMgKyBpXTsKKyAgICB9Cit9CisKKy8vIGFkdmFuY2UgdGhlIGltcHVsc2UgcG9pbnRlciwgYW5kIGxvYWQgaW4gZGF0YSBpbnRvIHRoZSBoZWFkIChpbXB1bHNlK2hhbGZOdW1Db2VmcykKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpJbkJ1ZmZlcjo6cmVhZEFkdmFuY2UoVEkqJiBpbXB1bHNlLCBjb25zdCBpbnQgaGFsZk51bUNvZWZzLAorICAgICAgICBjb25zdCBUSSogY29uc3QgaW4sIGNvbnN0IHNpemVfdCBpbnB1dEluZGV4KQoreworICAgIGltcHVsc2UgKz0gQ0hBTk5FTFM7CisKKyAgICBpZiAoQ0NfVU5MSUtFTFkoaW1wdWxzZSA+PSBtUmluZ0Z1bGwpKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBzaGlmdERvd24gPSBtUmluZ0Z1bGwgLSBtU3RhdGUgLSBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7CisgICAgICAgIG1lbWNweShtU3RhdGUsIG1TdGF0ZStzaGlmdERvd24sIGhhbGZOdW1Db2VmcypDSEFOTkVMUyoyKnNpemVvZihUSSkpOworICAgICAgICBpbXB1bHNlIC09IHNoaWZ0RG93bjsKKyAgICB9CisgICAgcmVhZEFnYWluPENIQU5ORUxTPihpbXB1bHNlLCBoYWxmTnVtQ29lZnMsIGluLCBpbnB1dEluZGV4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkNvbnN0YW50czo6c2V0KAorICAgICAgICBpbnQgTCwgaW50IGhhbGZOdW1Db2VmcywgaW50IGluU2FtcGxlUmF0ZSwgaW50IG91dFNhbXBsZVJhdGUpCit7CisgICAgaW50IGJpdHMgPSAwOworICAgIGludCBsc2NhbGUgPSBpblNhbXBsZVJhdGUvb3V0U2FtcGxlUmF0ZSA8IDIgPyBMIC0gMSA6CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXRpY19jYXN0PHVpbnQ2NF90PihMKSppblNhbXBsZVJhdGUvb3V0U2FtcGxlUmF0ZSk7CisgICAgZm9yIChpbnQgaT1sc2NhbGU7IGk7ICsrYml0cywgaT4+PTEpCisgICAgICAgIDsKKyAgICBtTCA9IEw7CisgICAgbVNoaWZ0ID0ga051bVBoYXNlQml0cyAtIGJpdHM7CisgICAgbUhhbGZOdW1Db2VmcyA9IGhhbGZOdW1Db2VmczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK0F1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpBdWRpb1Jlc2FtcGxlckR5bigKKyAgICAgICAgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpCisgICAgOiBBdWRpb1Jlc2FtcGxlcihpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgcXVhbGl0eSksCisgICAgICBtUmVzYW1wbGVGdW5jKDApLCBtRmlsdGVyU2FtcGxlUmF0ZSgwKSwgbUZpbHRlclF1YWxpdHkoREVGQVVMVF9RVUFMSVRZKSwKKyAgICBtQ29lZkJ1ZmZlcihOVUxMKQoreworICAgIG1Wb2x1bWVTaW1kWzBdID0gbVZvbHVtZVNpbWRbMV0gPSAwOworICAgIC8vIFRoZSBBdWRpb1Jlc2FtcGxlciBiYXNlIGNsYXNzIGFzc3VtZXMgd2UgYXJlIGFsd2F5cyByZWFkeSBmb3IgMToxIHJlc2FtcGxpbmcuCisgICAgLy8gV2UgcmVzZXQgbUluU2FtcGxlUmF0ZSB0byAwLCBzbyBzZXRTYW1wbGVSYXRlKCkgd2lsbCBjYWxjdWxhdGUgZmlsdGVycyBmb3IKKyAgICAvLyBzZXRTYW1wbGVSYXRlKCkgZm9yIDE6MS4gKE1heSBiZSByZW1vdmVkIGlmIHByZWNhbGN1bGF0ZWQgZmlsdGVycyBhcmUgdXNlZC4pCisgICAgbUluU2FtcGxlUmF0ZSA9IDA7CisgICAgbUNvbnN0YW50cy5zZXQoMTI4LCA4LCBtU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOyAvLyBUT0RPOiBzZXQgYmV0dGVyCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CitBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6fkF1ZGlvUmVzYW1wbGVyRHluKCkKK3sKKyAgICBmcmVlKG1Db2VmQnVmZmVyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OmluaXQoKQoreworICAgIG1GaWx0ZXJTYW1wbGVSYXRlID0gMDsgLy8gYWx3YXlzIHRyaWdnZXIgbmV3IGZpbHRlciBnZW5lcmF0aW9uCisgICAgbUluQnVmZmVyLmluaXQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkKK3sKKyAgICBBdWRpb1Jlc2FtcGxlcjo6c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKKyAgICBpZiAoaXNfc2FtZTxUTywgZmxvYXQ+Ojp2YWx1ZSB8fCBpc19zYW1lPFRPLCBkb3VibGU+Ojp2YWx1ZSkgeworICAgICAgICBtVm9sdW1lU2ltZFswXSA9IHN0YXRpY19jYXN0PFRPPihsZWZ0KTsKKyAgICAgICAgbVZvbHVtZVNpbWRbMV0gPSBzdGF0aWNfY2FzdDxUTz4ocmlnaHQpOworICAgIH0gZWxzZSB7ICAvLyBpbnRlZ2VyIHJlcXVpcmVzIHNjYWxpbmcgdG8gVTRfMjggKHJvdW5kaW5nIGRvd24pCisgICAgICAgIC8vIGludGVnZXIgdm9sdW1lcyBhcmUgY2xhbXBlZCB0byAwIHRvIFVOSVRZX0dBSU4gc28gdGhlcmUKKyAgICAgICAgLy8gYXJlIG5vIGlzc3VlcyB3aXRoIHNpZ25lZCBvdmVyZmxvdy4KKyAgICAgICAgbVZvbHVtZVNpbWRbMF0gPSB1NF8yOF9mcm9tX2Zsb2F0KGNsYW1wRmxvYXRWb2wobGVmdCkpOworICAgICAgICBtVm9sdW1lU2ltZFsxXSA9IHU0XzI4X2Zyb21fZmxvYXQoY2xhbXBGbG9hdFZvbChyaWdodCkpOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBtYXgoVCBhLCBUIGIpIHtyZXR1cm4gYSA+IGIgPyBhIDogYjt9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgYWJzZGlmZihUIGEsIFQgYikge3JldHVybiBhID4gYiA/IGEgLSBiIDogYiAtIGE7fQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6Y3JlYXRlS2Fpc2VyRmlyKENvbnN0YW50cyAmYywKKyAgICAgICAgZG91YmxlIHN0b3BCYW5kQXR0ZW4sIGludCBpblNhbXBsZVJhdGUsIGludCBvdXRTYW1wbGVSYXRlLCBkb3VibGUgdGJ3Q2hlYXQpCit7CisgICAgVEMqIGJ1ZiA9IE5VTEw7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBhdHRlbiA9IDAuOTk5ODsgICAvLyB0byBhdm9pZCByaXBwbGUgb3ZlcmZsb3cKKyAgICBkb3VibGUgZmNyOworICAgIGRvdWJsZSB0YncgPSBmaXJLYWlzZXJUYncoYy5tSGFsZk51bUNvZWZzLCBzdG9wQmFuZEF0dGVuKTsKKworICAgICh2b2lkKXBvc2l4X21lbWFsaWduKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmYnVmKSwgMzIsIChjLm1MKzEpKmMubUhhbGZOdW1Db2VmcypzaXplb2YoVEMpKTsKKyAgICBpZiAoaW5TYW1wbGVSYXRlIDwgb3V0U2FtcGxlUmF0ZSkgeyAvLyB1cHNhbXBsZQorICAgICAgICBmY3IgPSBtYXgoMC41KnRid0NoZWF0IC0gdGJ3LzIsIHRidy8yKTsKKyAgICB9IGVsc2UgeyAvLyBkb3duc2FtcGxlCisgICAgICAgIGZjciA9IG1heCgwLjUqdGJ3Q2hlYXQqb3V0U2FtcGxlUmF0ZS9pblNhbXBsZVJhdGUgLSB0YncvMiwgdGJ3LzIpOworICAgIH0KKyAgICAvLyBjcmVhdGUgYW5kIHNldCBmaWx0ZXIKKyAgICBmaXJLYWlzZXJHZW4oYnVmLCBjLm1MLCBjLm1IYWxmTnVtQ29lZnMsIHN0b3BCYW5kQXR0ZW4sIGZjciwgYXR0ZW4pOworICAgIGMubUZpckNvZWZzID0gYnVmOworICAgIGlmIChtQ29lZkJ1ZmZlcikgeworICAgICAgICBmcmVlKG1Db2VmQnVmZmVyKTsKKyAgICB9CisgICAgbUNvZWZCdWZmZXIgPSBidWY7CisjaWZkZWYgREVCVUdfUkVTQU1QTEVSCisgICAgLy8gcHJpbnQgYmFzaWMgZmlsdGVyIHN0YXRzCisgICAgcHJpbnRmKCJMOiVkICBobmM6JWQgIHN0b3BCYW5kQXR0ZW46JWxmICBmY3I6JWxmICBhdHRlbjolbGYgIHRidzolbGZcbiIsCisgICAgICAgICAgICBjLm1MLCBjLm1IYWxmTnVtQ29lZnMsIHN0b3BCYW5kQXR0ZW4sIGZjciwgYXR0ZW4sIHRidyk7CisgICAgLy8gdGVzdCB0aGUgZmlsdGVyIGFuZCByZXBvcnQgcmVzdWx0cworICAgIGRvdWJsZSBmcCA9IChmY3IgLSB0YncvMikvYy5tTDsKKyAgICBkb3VibGUgZnMgPSAoZmNyICsgdGJ3LzIpL2MubUw7CisgICAgZG91YmxlIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGU7CisgICAgZG91YmxlIHN0b3BNYXgsIHN0b3BSaXBwbGU7CisgICAgdGVzdEZpcihidWYsIGMubUwsIGMubUhhbGZOdW1Db2VmcywgZnAsIGZzLCAvKnBhc3NTdGVwcyovIDEwMDAsIC8qc3RvcFN0ZXBzKi8gMTAwMDAwLAorICAgICAgICAgICAgcGFzc01pbiwgcGFzc01heCwgcGFzc1JpcHBsZSwgc3RvcE1heCwgc3RvcFJpcHBsZSk7CisgICAgcHJpbnRmKCJwYXNzYmFuZCglbGYsICVsZik6ICUuOGxmICUuOGxmICUuOGxmXG4iLCAwLiwgZnAsIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGUpOworICAgIHByaW50Zigic3RvcGJhbmQoJWxmLCAlbGYpOiAlLjhsZiAlLjNsZlxuIiwgZnMsIDAuNSwgc3RvcE1heCwgc3RvcFJpcHBsZSk7CisjZW5kaWYKK30KKworLy8gcmVjdXJzaXZlIGdjZC4gVXNpbmcgb2JqZHVtcCwgaXQgYXBwZWFycyB0aGUgdGFpbCByZWN1cnNpb24gaXMgY29udmVydGVkIHRvIGEgd2hpbGUgbG9vcC4KK3N0YXRpYyBpbnQgZ2NkKGludCBuLCBpbnQgbSkKK3sKKyAgICBpZiAobSA9PSAwKSB7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKyAgICByZXR1cm4gZ2NkKG0sIG4gJSBtKTsKK30KKworc3RhdGljIGJvb2wgaXNDbG9zZShpbnQzMl90IG5ld1NhbXBsZVJhdGUsIGludDMyX3QgcHJldlNhbXBsZVJhdGUsCisgICAgICAgIGludDMyX3QgZmlsdGVyU2FtcGxlUmF0ZSwgaW50MzJfdCBvdXRTYW1wbGVSYXRlKQoreworCisgICAgLy8gZGlmZmVyZW50IHVwc2FtcGxpbmcgcmF0aW9zIGRvIG5vdCBuZWVkIGEgZmlsdGVyIGNoYW5nZS4KKyAgICBpZiAoZmlsdGVyU2FtcGxlUmF0ZSAhPSAwCisgICAgICAgICAgICAmJiBmaWx0ZXJTYW1wbGVSYXRlIDwgb3V0U2FtcGxlUmF0ZQorICAgICAgICAgICAgJiYgbmV3U2FtcGxlUmF0ZSA8IG91dFNhbXBsZVJhdGUpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gY2hlY2sgZGVzaWduIGNyaXRlcmlhIGFnYWluIGlmIGRvd25zYW1wbGluZyBpcyBkZXRlY3RlZC4KKyAgICBpbnQgcGRpZmYgPSBhYnNkaWZmKG5ld1NhbXBsZVJhdGUsIHByZXZTYW1wbGVSYXRlKTsKKyAgICBpbnQgYWRpZmYgPSBhYnNkaWZmKG5ld1NhbXBsZVJhdGUsIGZpbHRlclNhbXBsZVJhdGUpOworCisgICAgLy8gYWxsb3cgdXAgdG8gNiUgcmVsYXRpdmUgY2hhbmdlIGluY3JlbWVudHMuCisgICAgLy8gYWxsb3cgdXAgdG8gMTIlIGFic29sdXRlIGNoYW5nZSBpbmNyZW1lbnRzIChmcm9tIGZpbHRlciBkZXNpZ24pCisgICAgcmV0dXJuIHBkaWZmIDwgcHJldlNhbXBsZVJhdGU+PjQgJiYgYWRpZmYgPCBmaWx0ZXJTYW1wbGVSYXRlPj4zOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6c2V0U2FtcGxlUmF0ZShpbnQzMl90IGluU2FtcGxlUmF0ZSkKK3sKKyAgICBpZiAobUluU2FtcGxlUmF0ZSA9PSBpblNhbXBsZVJhdGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQzMl90IG9sZFNhbXBsZVJhdGUgPSBtSW5TYW1wbGVSYXRlOworICAgIGludDMyX3Qgb2xkSGFsZk51bUNvZWZzID0gbUNvbnN0YW50cy5tSGFsZk51bUNvZWZzOworICAgIHVpbnQzMl90IG9sZFBoYXNlV3JhcExpbWl0ID0gbUNvbnN0YW50cy5tTCA8PCBtQ29uc3RhbnRzLm1TaGlmdDsKKyAgICBib29sIHVzZVMzMiA9IGZhbHNlOworCisgICAgbUluU2FtcGxlUmF0ZSA9IGluU2FtcGxlUmF0ZTsKKworICAgIC8vIFRPRE86IEFkZCBwcmVjYWxjdWxhdGVkIEVxdWlyaXBwbGUgZmlsdGVycworCisgICAgaWYgKG1GaWx0ZXJRdWFsaXR5ICE9IGdldFF1YWxpdHkoKSB8fAorICAgICAgICAgICAgIWlzQ2xvc2UoaW5TYW1wbGVSYXRlLCBvbGRTYW1wbGVSYXRlLCBtRmlsdGVyU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpKSB7CisgICAgICAgIG1GaWx0ZXJTYW1wbGVSYXRlID0gaW5TYW1wbGVSYXRlOworICAgICAgICBtRmlsdGVyUXVhbGl0eSA9IGdldFF1YWxpdHkoKTsKKworICAgICAgICAvLyBCZWdpbiBLYWlzZXIgRmlsdGVyIGNvbXB1dGF0aW9uCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBxdWFudGl6YXRpb24gZmxvb3IgZm9yIFMxNiBpcyBhYm91dCA5NmRiIC0gMTAqbG9nXzEwKCNsZW5ndGgpICsgM2RCLgorICAgICAgICAvLyBLZWVwIHRoZSBzdG9wIGJhbmQgYXR0ZW51YXRpb24gbm8gZ3JlYXRlciB0aGFuIDg0LTg1ZEIgZm9yIDMyIGxlbmd0aCBTMTYgZmlsdGVycworICAgICAgICAvLworICAgICAgICAvLyBGb3IgczMyIHdlIGtlZXAgdGhlIHN0b3AgYmFuZCBhdHRlbnVhdGlvbiBhdCB0aGUgc2FtZSBhcyAxNmIgcmVzb2x1dGlvbiwgYWJvdXQKKyAgICAgICAgLy8gOTYtOThkQgorICAgICAgICAvLworCisgICAgICAgIGRvdWJsZSBzdG9wQmFuZEF0dGVuOworICAgICAgICBkb3VibGUgdGJ3Q2hlYXQgPSAxLjsgLy8gaG93IG11Y2ggd2UgImNoZWF0IiBpbnRvIGFsaWFzaW5nCisgICAgICAgIGludCBoYWxmTGVuZ3RoOworICAgICAgICBpZiAobUZpbHRlclF1YWxpdHkgPT0gRFlOX0hJR0hfUVVBTElUWSkgeworICAgICAgICAgICAgLy8gMzJiIGNvZWZmaWNpZW50cywgNjQgbGVuZ3RoCisgICAgICAgICAgICB1c2VTMzIgPSB0cnVlOworICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IDk4LjsKKyAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiA0KSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDQ4OworICAgICAgICAgICAgfSBlbHNlIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiAyKSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDQwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobUZpbHRlclF1YWxpdHkgPT0gRFlOX0xPV19RVUFMSVRZKSB7CisgICAgICAgICAgICAvLyAxNmIgY29lZmZpY2llbnRzLCAxNi0zMiBsZW5ndGgKKyAgICAgICAgICAgIHVzZVMzMiA9IGZhbHNlOworICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IDgwLjsKKyAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiA0KSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDI0OworICAgICAgICAgICAgfSBlbHNlIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiAyKSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDE2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gRFlOX01FRF9RVUFMSVRZCisgICAgICAgICAgICAvLyAxNmIgY29lZmZpY2llbnRzLCAzMi02NCBsZW5ndGgKKyAgICAgICAgICAgIC8vIG5vdGU6ID4gNjQgbGVuZ3RoIGZpbHRlcnMgd2l0aCAxNmIgY29lZnMgY2FuIGhhdmUgcXVhbnRpemF0aW9uIG5vaXNlIHByb2JsZW1zCisgICAgICAgICAgICB1c2VTMzIgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSA4NC47CisgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogNCkgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAzMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogMikgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAyNDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDE2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wMzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcG9seXBoYXNlcyBpbiB0aGUgZmlsdGVyYmFuay4KKyAgICAgICAgLy8gZm9yIDE2YiwgaXQgaXMgZGVzaXJhYmxlIHRvIGhhdmUgMl4oMTYvMikgPSAyNTYgcGhhc2VzLgorICAgICAgICAvLyBodHRwczovL2Njcm1hLnN0YW5mb3JkLmVkdS9+am9zL3Jlc2FtcGxlL1JlbGF0aW9uX0ludGVycG9sYXRpb25fRXJyb3JfUXVhbnRpemF0aW9uLmh0bWwKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2UgYXJlIGEgYml0IG1vcmUgbGF4IG9uIHRoaXMuCisKKyAgICAgICAgaW50IHBoYXNlcyA9IG1TYW1wbGVSYXRlIC8gZ2NkKG1TYW1wbGVSYXRlLCBpblNhbXBsZVJhdGUpOworCisgICAgICAgIC8vIFRPRE86IE9uY2UgZHluYW1pYyBzYW1wbGUgcmF0ZSBjaGFuZ2UgaXMgYW4gb3B0aW9uLCB0aGUgY29kZSBiZWxvdworICAgICAgICAvLyBzaG91bGQgYmUgbW9kaWZpZWQgdG8gZXhlY3V0ZSBvbmx5IHdoZW4gZHluYW1pYyBzYW1wbGUgcmF0ZSBjaGFuZ2UgaXMgZW5hYmxlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gYXMgYWJvdmUsICNwaGFzZXMgbGVzcyB0aGFuIDYzIGlzIHRvbyBmZXcgcGhhc2VzIGZvciBhY2N1cmF0ZSBsaW5lYXIgaW50ZXJwb2xhdGlvbi4KKyAgICAgICAgLy8gd2UgaW5jcmVhc2UgdGhlIHBoYXNlcyB0byBjb21wZW5zYXRlLCBidXQgbW9yZSBwaGFzZXMgbWVhbnMgbW9yZSBtZW1vcnkgcGVyCisgICAgICAgIC8vIGZpbHRlciBhbmQgbW9yZSB0aW1lIHRvIGNvbXB1dGUgdGhlIGZpbHRlci4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gaWYgd2Uga25vdyB0aGF0IHRoZSBmaWx0ZXIgd2lsbCBiZSB1c2VkIGZvciBkeW5hbWljIHNhbXBsZSByYXRlIGNoYW5nZXMsCisgICAgICAgIC8vIHRoYXQgd291bGQgYWxsb3cgdXMgc2tpcCB0aGlzIHBhcnQgZm9yIGZpeGVkIHNhbXBsZSByYXRlIHJlc2FtcGxlcnMuCisgICAgICAgIC8vCisgICAgICAgIHdoaWxlIChwaGFzZXM8NjMpIHsKKyAgICAgICAgICAgIHBoYXNlcyAqPSAyOyAvLyB0aGlzIGNvZGUgb25seSBuZWVkZWQgdG8gc3VwcG9ydCBkeW5hbWljIHJhdGUgY2hhbmdlcworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBoYXNlcz49MjU2KSB7ICAvLyB0b28gbWFueSBwaGFzZXMsIGFsd2F5cyBpbnRlcnBvbGF0ZQorICAgICAgICAgICAgcGhhc2VzID0gMTI3OworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSBmaWx0ZXIKKyAgICAgICAgbUNvbnN0YW50cy5zZXQocGhhc2VzLCBoYWxmTGVuZ3RoLCBpblNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgY3JlYXRlS2Fpc2VyRmlyKG1Db25zdGFudHMsIHN0b3BCYW5kQXR0ZW4sCisgICAgICAgICAgICAgICAgaW5TYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwgdGJ3Q2hlYXQpOworICAgIH0gLy8gRW5kIEthaXNlciBmaWx0ZXIKKworICAgIC8vIHVwZGF0ZSBwaGFzZSBhbmQgc3RhdGUgYmFzZWQgb24gdGhlIG5ldyBmaWx0ZXIuCisgICAgY29uc3QgQ29uc3RhbnRzJiBjKG1Db25zdGFudHMpOworICAgIG1JbkJ1ZmZlci5yZXNpemUobUNoYW5uZWxDb3VudCwgYy5tSGFsZk51bUNvZWZzKTsKKyAgICBjb25zdCB1aW50MzJfdCBwaGFzZVdyYXBMaW1pdCA9IGMubUwgPDwgYy5tU2hpZnQ7CisgICAgLy8gdHJ5IHRvIHByZXNlcnZlIGFzIG11Y2ggb2YgdGhlIHBoYXNlIGZyYWN0aW9uIGFzIHBvc3NpYmxlIGZvciBvbi10aGUtZmx5IGNoYW5nZXMKKyAgICBtUGhhc2VGcmFjdGlvbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4obVBoYXNlRnJhY3Rpb24pCisgICAgICAgICAgICAqIHBoYXNlV3JhcExpbWl0IC8gb2xkUGhhc2VXcmFwTGltaXQ7CisgICAgbVBoYXNlRnJhY3Rpb24gJT0gcGhhc2VXcmFwTGltaXQ7IC8vIHNob3VsZCBub3QgZG8gYW55dGhpbmcsIGJ1dCBqdXN0IGluIGNhc2UuCisgICAgbVBoYXNlSW5jcmVtZW50ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ2NF90PihwaGFzZVdyYXBMaW1pdCkKKyAgICAgICAgICAgICogaW5TYW1wbGVSYXRlIC8gbVNhbXBsZVJhdGUpOworCisgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIHJlc2FtcGxlciB0byB1c2UKKyAgICAvLyBjaGVjayBpZiBsb2NrZWQgcGhhc2UgKHdvcmtzIG9ubHkgaWYgbVBoYXNlSW5jcmVtZW50IGhhcyBubyAiZnJhY3Rpb25hbCBwaGFzZSBiaXRzIikKKyAgICBpbnQgbG9ja2VkID0gKG1QaGFzZUluY3JlbWVudCA8PCAoc2l6ZW9mKG1QaGFzZUluY3JlbWVudCkqOCAtIGMubVNoaWZ0KSkgPT0gMDsKKyAgICBpZiAobG9ja2VkKSB7CisgICAgICAgIG1QaGFzZUZyYWN0aW9uID0gbVBoYXNlRnJhY3Rpb24gPj4gYy5tU2hpZnQgPDwgYy5tU2hpZnQ7IC8vIHJlbW92ZSBmcmFjdGlvbmFsIHBoYXNlCisgICAgfQorCisgICAgLy8gc3RyaWRlIGlzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBmaWx0ZXIgY29lZmZpY2llbnRzIHByb2Nlc3NlZCBwZXIgbG9vcCBpdGVyYXRpb24uCisgICAgLy8gV2UgY3VycmVudGx5IG9ubHkgYWxsb3cgYSBzdHJpZGUgb2YgMTYgdG8gbWF0Y2ggd2l0aCBTSU1EIHByb2Nlc3NpbmcuCisgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBmaWx0ZXIgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiwKKyAgICAvLyBvciBoYWxmIHRoZSBmaWx0ZXIgbGVuZ3RoIChtSGFsZk51bUNvZWZzKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4KKyAgICAvLworICAgIC8vIE5vdGU6IEEgc3RyaWRlIG9mIDIgaXMgYWNoaWV2ZWQgd2l0aCBub24tU0lNRCBwcm9jZXNzaW5nLgorICAgIGludCBzdHJpZGUgPSAoKGMubUhhbGZOdW1Db2VmcyAmIDcpID09IDApID8gMTYgOiAyOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyaWRlIDwgMTYsICJSZXNhbXBsZXIgc3RyaWRlIG11c3QgYmUgMTYgb3IgbW9yZSIpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNoYW5uZWxDb3VudCA8IDEgfHwgbUNoYW5uZWxDb3VudCA+IDgsCisgICAgICAgICAgICAiUmVzYW1wbGVyIGNoYW5uZWxzKCVkKSBtdXN0IGJlIGJldHdlZW4gMSB0byA4IiwgbUNoYW5uZWxDb3VudCk7CisgICAgLy8gc3RyaWRlIDE2IChmYWxscyBiYWNrIHRvIHN0cmlkZSAyIGZvciBtYWNoaW5lcyB0aGF0IGRvIG5vdCBzdXBwb3J0IE5FT04pCisgICAgaWYgKGxvY2tlZCkgeworICAgICAgICBzd2l0Y2ggKG1DaGFubmVsQ291bnQpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8MSwgdHJ1ZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDIsIHRydWUsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTwzLCB0cnVlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8NCwgdHJ1ZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDUsIHRydWUsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw2LCB0cnVlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8NywgdHJ1ZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDgsIHRydWUsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChtQ2hhbm5lbENvdW50KSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDEsIGZhbHNlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8MiwgZmFsc2UsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTwzLCBmYWxzZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDQsIGZhbHNlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8NSwgZmFsc2UsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw2LCBmYWxzZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDcsIGZhbHNlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8OCwgZmFsc2UsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2lmZGVmIERFQlVHX1JFU0FNUExFUgorICAgIHByaW50ZigiY2hhbm5lbHM6JWQgICVzICBzdHJpZGU6JWQgICVzICBjb2VmOiVkICBzaGlmdDolZFxuIiwKKyAgICAgICAgICAgIG1DaGFubmVsQ291bnQsIGxvY2tlZCA/ICJsb2NrZWQiIDogImludGVycG9sYXRlZCIsCisgICAgICAgICAgICBzdHJpZGUsIHVzZVMzMiA/ICJTMzIiIDogIlMxNiIsIDIqYy5tSGFsZk51bUNvZWZzLCBjLm1TaGlmdCk7CisjZW5kaWYKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikKK3sKKyAgICAodGhpcy0+Km1SZXNhbXBsZUZ1bmMpKHJlaW50ZXJwcmV0X2Nhc3Q8VE8qPihvdXQpLCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFMsIGJvb2wgTE9DS0VELCBpbnQgU1RSSURFPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGUoVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKQoreworICAgIC8vIFRPRE8gTW9ubyAtPiBNb25vIGlzIG5vdCBzdXBwb3J0ZWQuIE9VVFBVVF9DSEFOTkVMUyByZWZsZWN0cyBtaW5pbXVtIG9mIHN0ZXJlbyBvdXQuCisgICAgY29uc3QgaW50IE9VVFBVVF9DSEFOTkVMUyA9IChDSEFOTkVMUyA8IDIpID8gMiA6IENIQU5ORUxTOworICAgIGNvbnN0IENvbnN0YW50cyYgYyhtQ29uc3RhbnRzKTsKKyAgICBjb25zdCBUQyogY29uc3QgY29lZnMgPSBtQ29uc3RhbnRzLm1GaXJDb2VmczsKKyAgICBUSSogaW1wdWxzZSA9IG1JbkJ1ZmZlci5nZXRJbXB1bHNlKCk7CisgICAgc2l6ZV90IGlucHV0SW5kZXggPSAwOworICAgIHVpbnQzMl90IHBoYXNlRnJhY3Rpb24gPSBtUGhhc2VGcmFjdGlvbjsKKyAgICBjb25zdCB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKKyAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOworICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiBPVVRQVVRfQ0hBTk5FTFM7CisgICAgY29uc3QgdWludDMyX3QgcGhhc2VXcmFwTGltaXQgPSBjLm1MIDw8IGMubVNoaWZ0OworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAocGhhc2VJbmNyZW1lbnQgKiAodWludDY0X3Qpb3V0RnJhbWVDb3VudCArIHBoYXNlRnJhY3Rpb24pCisgICAgICAgICAgICAvIHBoYXNlV3JhcExpbWl0OworICAgIC8vIHNhbml0eSBjaGVjayB0aGF0IGluRnJhbWVDb3VudCBpcyBpbiBzaWduZWQgMzIgYml0IGludGVnZXIgcmFuZ2UuCisgICAgQUxPR19BU1NFUlQoMCA8PSBpbkZyYW1lQ291bnQgJiYgaW5GcmFtZUNvdW50IDwgKDFVIDw8IDMxKSk7CisKKyAgICAvL0FMT0dWKCJpbkZyYW1lQ291bnQ6JWQgIG91dEZyYW1lQ291bnQ6JWQiCisgICAgLy8gICAgICAgICIgIHBoYXNlSW5jcmVtZW50OiV1ICBwaGFzZUZyYWN0aW9uOiV1ICBwaGFzZVdyYXBMaW1pdDoldSIsCisgICAgLy8gICAgICAgIGluRnJhbWVDb3VudCwgb3V0RnJhbWVDb3VudCwgcGhhc2VJbmNyZW1lbnQsIHBoYXNlRnJhY3Rpb24sIHBoYXNlV3JhcExpbWl0KTsKKworICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgorICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCisgICAgLy8gdG8gZ2VuZXJhdGUgZmFyIGxlc3MgZWZmaWNpZW50IGNvZGUuCisgICAgLy8gQWx3YXlzIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgorCisgICAgLy8gdGhlIGZvbGxvd2luZyBsb2dpYyBpcyBhIGJpdCBjb252b2x1dGVkIHRvIGtlZXAgdGhlIG1haW4gcHJvY2Vzc2luZyBsb29wCisgICAgLy8gYXMgdGlnaHQgYXMgcG9zc2libGUgd2l0aCByZWdpc3RlciBhbGxvY2F0aW9uLgorICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IG91dHB1dFNhbXBsZUNvdW50KSB7CisgICAgICAgIC8vQUxPR1YoIkxPT1A6IGluRnJhbWVDb3VudDolZCAgb3V0cHV0SW5kZXg6JWQgIG91dEZyYW1lQ291bnQ6JWQiCisgICAgICAgIC8vICAgICAgICAiICBwaGFzZUZyYWN0aW9uOiV1ICBwaGFzZVdyYXBMaW1pdDoldSIsCisgICAgICAgIC8vICAgICAgICBpbkZyYW1lQ291bnQsIG91dHB1dEluZGV4LCBvdXRGcmFtZUNvdW50LCBwaGFzZUZyYWN0aW9uLCBwaGFzZVdyYXBMaW1pdCk7CisKKyAgICAgICAgLy8gY2hlY2sgaW5wdXRJbmRleCBvdmVyZmxvdworICAgICAgICBBTE9HX0FTU0VSVChpbnB1dEluZGV4IDw9IG1CdWZmZXIuZnJhbWVDb3VudCwgImlucHV0SW5kZXglZCA+IGZyYW1lQ291bnQlZCIsCisgICAgICAgICAgICAgICAgaW5wdXRJbmRleCwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgLy8gQnVmZmVyIGlzIGVtcHR5LCBmZXRjaCBhIG5ldyBvbmUgaWYgbmVjZXNzYXJ5IChpbkZyYW1lQ291bnQgPiAwKS4KKyAgICAgICAgLy8gV2UgbWF5IG5vdCBmZXRjaCBhIG5ldyBidWZmZXIgaWYgdGhlIGV4aXN0aW5nIGRhdGEgaXMgc3VmZmljaWVudC4KKyAgICAgICAgd2hpbGUgKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwICYmIGluRnJhbWVDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKKyAgICAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVPdXRwdXRQVFMob3V0cHV0SW5kZXggLyBPVVRQVVRfQ0hBTk5FTFMpKTsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZ290byByZXNhbXBsZV9leGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5GcmFtZUNvdW50IC09IG1CdWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgICAgIGlmIChwaGFzZUZyYWN0aW9uID49IHBoYXNlV3JhcExpbWl0KSB7IC8vIHJlYWQgaW4gZGF0YQorICAgICAgICAgICAgICAgIG1JbkJ1ZmZlci50ZW1wbGF0ZSByZWFkQWR2YW5jZTxDSEFOTkVMUz4oCisgICAgICAgICAgICAgICAgICAgICAgICBpbXB1bHNlLCBjLm1IYWxmTnVtQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFRJKj4obUJ1ZmZlci5yYXcpLCBpbnB1dEluZGV4KTsKKyAgICAgICAgICAgICAgICBpbnB1dEluZGV4Kys7CisgICAgICAgICAgICAgICAgcGhhc2VGcmFjdGlvbiAtPSBwaGFzZVdyYXBMaW1pdDsKKyAgICAgICAgICAgICAgICB3aGlsZSAocGhhc2VGcmFjdGlvbiA+PSBwaGFzZVdyYXBMaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBtQnVmZmVyLmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUluQnVmZmVyLnRlbXBsYXRlIHJlYWRBZHZhbmNlPENIQU5ORUxTPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXB1bHNlLCBjLm1IYWxmTnVtQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxUSSo+KG1CdWZmZXIucmF3KSwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgcGhhc2VGcmFjdGlvbiAtPSBwaGFzZVdyYXBMaW1pdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgVEkqIGNvbnN0IGluID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUSSo+KG1CdWZmZXIucmF3KTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBtQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgIGNvbnN0IGludCBjb2VmU2hpZnQgPSBjLm1TaGlmdDsKKyAgICAgICAgY29uc3QgaW50IGhhbGZOdW1Db2VmcyA9IGMubUhhbGZOdW1Db2VmczsKKyAgICAgICAgY29uc3QgVE8qIGNvbnN0IHZvbHVtZVNpbWQgPSBtVm9sdW1lU2ltZDsKKworICAgICAgICAvLyBtYWluIHByb2Nlc3NpbmcgbG9vcAorICAgICAgICB3aGlsZSAoQ0NfTElLRUxZKG91dHB1dEluZGV4IDwgb3V0cHV0U2FtcGxlQ291bnQpKSB7CisgICAgICAgICAgICAvLyBjYXV0aW9uOiBmaXIoKSBpcyBpbmxpbmVkIGFuZCBtYXkgYmUgbGFyZ2UuCisgICAgICAgICAgICAvLyBvdXRwdXQgd2lsbCBiZSBsb2FkZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gZnJvbSB0aGUgaW5wdXQgc2FtcGxlcyBpbiBpbXB1bHNlWy1oYWxmTnVtQ29lZnMrMV0uLi4gaW1wdWxzZVtoYWxmTnVtQ29lZnNdCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBwb2x5cGhhc2UgZmlsdGVyIG9mIChwaGFzZUZyYWN0aW9uIC8gcGhhc2VXcmFwTGltaXQpIGluIGNvZWZzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vQUxPR1YoIkxPT1AyOiBpbkZyYW1lQ291bnQ6JWQgIG91dHB1dEluZGV4OiVkICBvdXRGcmFtZUNvdW50OiVkIgorICAgICAgICAgICAgLy8gICAgICAgICIgIHBoYXNlRnJhY3Rpb246JXUgIHBoYXNlV3JhcExpbWl0OiV1IiwKKyAgICAgICAgICAgIC8vICAgICAgICBpbkZyYW1lQ291bnQsIG91dHB1dEluZGV4LCBvdXRGcmFtZUNvdW50LCBwaGFzZUZyYWN0aW9uLCBwaGFzZVdyYXBMaW1pdCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChwaGFzZUZyYWN0aW9uIDwgcGhhc2VXcmFwTGltaXQpOworICAgICAgICAgICAgZmlyPENIQU5ORUxTLCBMT0NLRUQsIFNUUklERT4oCisgICAgICAgICAgICAgICAgICAgICZvdXRbb3V0cHV0SW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBwaGFzZUZyYWN0aW9uLCBwaGFzZVdyYXBMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgY29lZlNoaWZ0LCBoYWxmTnVtQ29lZnMsIGNvZWZzLAorICAgICAgICAgICAgICAgICAgICBpbXB1bHNlLCB2b2x1bWVTaW1kKTsKKworICAgICAgICAgICAgb3V0cHV0SW5kZXggKz0gT1VUUFVUX0NIQU5ORUxTOworCisgICAgICAgICAgICBwaGFzZUZyYWN0aW9uICs9IHBoYXNlSW5jcmVtZW50OworICAgICAgICAgICAgd2hpbGUgKHBoYXNlRnJhY3Rpb24gPj0gcGhhc2VXcmFwTGltaXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsgIC8vIG5lZWQgYSBuZXcgYnVmZmVyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1JbkJ1ZmZlci50ZW1wbGF0ZSByZWFkQWR2YW5jZTxDSEFOTkVMUz4oaW1wdWxzZSwgaGFsZk51bUNvZWZzLCBpbiwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICAgICAgaW5wdXRJbmRleCsrOworICAgICAgICAgICAgICAgIHBoYXNlRnJhY3Rpb24gLT0gcGhhc2VXcmFwTGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK2RvbmU6CisgICAgICAgIC8vIFdlIGFycml2ZSBoZXJlIHdoZW4gd2UncmUgZmluaXNoZWQgb3Igd2hlbiB0aGUgaW5wdXQgYnVmZmVyIHJ1bnMgb3V0LgorICAgICAgICAvLyBSZWdhcmRsZXNzIHdlIG5lZWQgdG8gcmVsZWFzZSB0aGUgaW5wdXQgYnVmZmVyIGlmIHdlJ3ZlIGFjcXVpcmVkIGl0LgorICAgICAgICBpZiAoaW5wdXRJbmRleCA+IDApIHsgIC8vIHdlJ3ZlIGFjcXVpcmVkIGEgYnVmZmVyIChhbHRlcm5hdGl2ZWx5IGNvdWxkIGNoZWNrIGZyYW1lQ291bnQpCisgICAgICAgICAgICBBTE9HX0FTU0VSVChpbnB1dEluZGV4ID09IGZyYW1lQ291bnQsICJpbnB1dEluZGV4KCVkKSAhPSBmcmFtZUNvdW50KCVkKSIsCisgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgsIGZyYW1lQ291bnQpOyAgLy8gbXVzdCBoYXZlIGJlZW4gZnVsbHkgcmVhZC4KKyAgICAgICAgICAgIGlucHV0SW5kZXggPSAwOworICAgICAgICAgICAgcHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgICAgICAgICAgQUxPR19BU1NFUlQobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOworICAgICAgICB9CisgICAgfQorCityZXNhbXBsZV9leGl0OgorICAgIC8vIGlucHV0SW5kZXggbXVzdCBiZSB6ZXJvIGluIGFsbCB0aHJlZSBjYXNlczoKKyAgICAvLyAoMSkgdGhlIGJ1ZmZlciBuZXZlciB3YXMgYmVlbiBhY3F1aXJlZDsgKDIpIHRoZSBidWZmZXIgd2FzCisgICAgLy8gcmVsZWFzZWQgYXQgImRvbmU6Ijsgb3IgKDMpIGdldE5leHRCdWZmZXIoKSBmYWlsZWQuCisgICAgQUxPR19BU1NFUlQoaW5wdXRJbmRleCA9PSAwLCAiUmVsZWFzaW5nOiBpbnB1dGluZGV4OiVkIGZyYW1lQ291bnQ6JWQgIHBoYXNlRnJhY3Rpb246JXUiLAorICAgICAgICAgICAgaW5wdXRJbmRleCwgbUJ1ZmZlci5mcmFtZUNvdW50LCBwaGFzZUZyYWN0aW9uKTsKKyAgICBBTE9HX0FTU0VSVChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7IC8vIHRoZXJlIG11c3QgYmUgbm8gZnJhbWVzIGluIHRoZSBidWZmZXIKKyAgICBtSW5CdWZmZXIuc2V0SW1wdWxzZShpbXB1bHNlKTsKKyAgICBtUGhhc2VGcmFjdGlvbiA9IHBoYXNlRnJhY3Rpb247Cit9CisKKy8qIGluc3RhbnRpYXRlIHRlbXBsYXRlcyB1c2VkIGJ5IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUgKi8KK3RlbXBsYXRlIGNsYXNzIEF1ZGlvUmVzYW1wbGVyRHluPGZsb2F0LCBmbG9hdCwgZmxvYXQ+OwordGVtcGxhdGUgY2xhc3MgQXVkaW9SZXNhbXBsZXJEeW48aW50MTZfdCwgaW50MTZfdCwgaW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBBdWRpb1Jlc2FtcGxlckR5bjxpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PjsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4NmE2OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9EWU5fSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9EWU5fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBBdWRpb1Jlc2FtcGxlckR5bgorICoKKyAqIFRoaXMgY2xhc3MgdGVtcGxhdGUgaXMgdXNlZCBmb3IgZmxvYXRpbmcgcG9pbnQgYW5kIGludGVnZXIgcmVzYW1wbGVycy4KKyAqCisgKiBUeXBlIHZhcmlhYmxlczoKKyAqIFRDID0gZmlsdGVyIGNvZWZmaWNpZW50IHR5cGUgKG9uZSBvZiBpbnQxNl90LCBpbnQzMl90LCBvciBmbG9hdCkKKyAqIFRJID0gaW5wdXQgZGF0YSB0eXBlIChvbmUgb2YgaW50MTZfdCBvciBmbG9hdCkKKyAqIFRPID0gb3V0cHV0IGRhdGEgdHlwZSAob25lIG9mIGludDMyX3Qgb3IgZmxvYXQpCisgKgorICogRm9yIGludGVnZXIgaW5wdXQgZGF0YSB0eXBlcyBUSSwgdGhlIGNvZWZmaWNpZW50IHR5cGUgVEMgaXMgZWl0aGVyIGludDE2X3Qgb3IgaW50MzJfdC4KKyAqIEZvciBmbG9hdCBpbnB1dCBkYXRhIHR5cGVzIFRJLCB0aGUgY29lZmZpY2llbnQgdHlwZSBUQyBpcyBmbG9hdC4KKyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgorY2xhc3MgQXVkaW9SZXNhbXBsZXJEeW46IHB1YmxpYyBBdWRpb1Jlc2FtcGxlciB7CitwdWJsaWM6CisgICAgQXVkaW9SZXNhbXBsZXJEeW4oaW50IGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBzcmNfcXVhbGl0eSBxdWFsaXR5KTsKKworICAgIHZpcnR1YWwgfkF1ZGlvUmVzYW1wbGVyRHluKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdCgpOworCisgICAgdmlydHVhbCB2b2lkIHNldFNhbXBsZVJhdGUoaW50MzJfdCBpblNhbXBsZVJhdGUpOworCisgICAgdmlydHVhbCB2b2lkIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKKworcHJpdmF0ZToKKworICAgIGNsYXNzIENvbnN0YW50cyB7IC8vIHN0b3JlcyB0aGUgZmlsdGVyIGNvbnN0YW50cy4KKyAgICBwdWJsaWM6CisgICAgICAgIENvbnN0YW50cygpIDoKKyAgICAgICAgICAgIG1MKDApLCBtU2hpZnQoMCksIG1IYWxmTnVtQ29lZnMoMCksIG1GaXJDb2VmcyhOVUxMKQorICAgICAgICB7fQorICAgICAgICB2b2lkIHNldChpbnQgTCwgaW50IGhhbGZOdW1Db2VmcywKKyAgICAgICAgICAgICAgICBpbnQgaW5TYW1wbGVSYXRlLCBpbnQgb3V0U2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgICAgICAgaW50IG1MOyAgICAgICAgICAgIC8vIGludGVycG9sYXRpb24gcGhhc2VzIGluIHRoZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgIGludCBtU2hpZnQ7ICAgICAgICAvLyByaWdodCBzaGlmdCB0byBnZXQgcG9seXBoYXNlIGluZGV4CisgICAgICAgIHVuc2lnbmVkIGludCBtSGFsZk51bUNvZWZzOyAvLyBmaWx0ZXIgaGFsZiAjY29lZnMKKyAgICAgICAgICAgY29uc3QgVEMqIG1GaXJDb2VmczsgICAgIC8vIHBvbHlwaGFzZSBmaWx0ZXIgYmFuaworICAgIH07CisKKyAgICBjbGFzcyBJbkJ1ZmZlciB7IC8vIGJ1ZmZlciBtYW5hZ2VtZW50IGZvciBpbnB1dCB0eXBlIFRJCisgICAgcHVibGljOgorICAgICAgICBJbkJ1ZmZlcigpOworICAgICAgICB+SW5CdWZmZXIoKTsKKyAgICAgICAgdm9pZCBpbml0KCk7CisKKyAgICAgICAgdm9pZCByZXNpemUoaW50IENIQU5ORUxTLCBpbnQgaGFsZk51bUNvZWZzKTsKKworICAgICAgICAvLyB1c2VkIGZvciBkaXJlY3QgbWFuYWdlbWVudCBvZiB0aGUgbUltcHVsc2UgcG9pbnRlcgorICAgICAgICBpbmxpbmUgVEkqIGdldEltcHVsc2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbUltcHVsc2U7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgdm9pZCBzZXRJbXB1bHNlKFRJICppbXB1bHNlKSB7CisgICAgICAgICAgICBtSW1wdWxzZSA9IGltcHVsc2U7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+CisgICAgICAgIGlubGluZSB2b2lkIHJlYWRBZ2FpbihUSSomIGltcHVsc2UsIGNvbnN0IGludCBoYWxmTnVtQ29lZnMsCisgICAgICAgICAgICAgICAgY29uc3QgVEkqIGNvbnN0IGluLCBjb25zdCBzaXplX3QgaW5wdXRJbmRleCk7CisKKyAgICAgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTPgorICAgICAgICBpbmxpbmUgdm9pZCByZWFkQWR2YW5jZShUSSomIGltcHVsc2UsIGNvbnN0IGludCBoYWxmTnVtQ29lZnMsCisgICAgICAgICAgICAgICAgY29uc3QgVEkqIGNvbnN0IGluLCBjb25zdCBzaXplX3QgaW5wdXRJbmRleCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyB0dW5pbmcgcGFyYW1ldGVyIGd1aWRlbGluZXM6IDIgPD0gbXVsdGlwbGUgPD0gOAorICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtTdGF0ZVNpemVNdWx0aXBsZU9mRmlsdGVyTGVuZ3RoID0gNDsKKworICAgICAgICAvLyBpbiBnZW5lcmFsLCBtUmluZ0Z1bGwgPSBtU3RhdGUgKyBtU3RhdGVTaXplIC0gaGFsZk51bUNvZWZzKkNIQU5ORUxTLgorICAgICAgICAgICBUSSogbVN0YXRlOyAgICAgIC8vIGJhc2UgcG9pbnRlciBmb3IgdGhlIGlucHV0IGJ1ZmZlciBzdG9yYWdlCisgICAgICAgICAgIFRJKiBtSW1wdWxzZTsgICAgLy8gY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgaW1wdWxzZSByZXNwb25zZSAoY2VudGVyZWQpCisgICAgICAgICAgIFRJKiBtUmluZ0Z1bGw7ICAgLy8gbVN0YXRlIDw9IG1JbXB1bHNlIDwgbVJpbmdGdWxsCisgICAgICAgIHNpemVfdCBtU3RhdGVDb3VudDsgLy8gc2l6ZSBvZiBzdGF0ZSBpbiB1bml0cyBvZiBUSS4KKyAgICB9OworCisgICAgdm9pZCBjcmVhdGVLYWlzZXJGaXIoQ29uc3RhbnRzICZjLCBkb3VibGUgc3RvcEJhbmRBdHRlbiwKKyAgICAgICAgICAgIGludCBpblNhbXBsZVJhdGUsIGludCBvdXRTYW1wbGVSYXRlLCBkb3VibGUgdGJ3Q2hlYXQpOworCisgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTLCBib29sIExPQ0tFRCwgaW50IFNUUklERT4KKyAgICB2b2lkIHJlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CisKKyAgICAvLyBkZWZpbmUgYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlIGZvciByZXNhbXBsZQorICAgIHR5cGVkZWYgdm9pZCAoQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OipyZXNhbXBsZV9BQlBfdCkoVE8qIG91dCwKKyAgICAgICAgICAgIHNpemVfdCBvdXRGcmFtZUNvdW50LCBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CisKKyAgICAvLyBkYXRhIC0gdGhlIGNvbnRpZ3VvdXMgc3RvcmFnZSBhbmQgbGF5b3V0IG9mIHRoZXNlIGlzIGltcG9ydGFudC4KKyAgICAgICAgICAgSW5CdWZmZXIgbUluQnVmZmVyOworICAgICAgICAgIENvbnN0YW50cyBtQ29uc3RhbnRzOyAgICAgICAgLy8gY3VycmVudCBzZXQgb2YgY29lZmZpY2llbnQgcGFyYW1ldGVycworICAgIFRPIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg4KSkpIG1Wb2x1bWVTaW1kWzJdOyAvLyBtdXN0IGJlIGFsaWduZWQgb3IgTkVPTiBtYXkgY3Jhc2gKKyAgICAgcmVzYW1wbGVfQUJQX3QgbVJlc2FtcGxlRnVuYzsgICAgIC8vIGNhbGxlZCBmdW5jdGlvbiBmb3IgcmVzYW1wbGluZworICAgICAgICAgICAgaW50MzJfdCBtRmlsdGVyU2FtcGxlUmF0ZTsgLy8gZGVzaWduZWQgZmlsdGVyIHNhbXBsZSByYXRlLgorICAgICAgICBzcmNfcXVhbGl0eSBtRmlsdGVyUXVhbGl0eTsgICAgLy8gZGVzaWduZWQgZmlsdGVyIHF1YWxpdHkuCisgICAgICAgICAgICAgIHZvaWQqIG1Db2VmQnVmZmVyOyAgICAgICAvLyBpZiBhIGZpbHRlciBpcyBjcmVhdGVkLCB0aGlzIGlzIG5vdCBudWxsCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9EWU5fSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjRiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaApAQCAtMCwwICsxLDcwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX0dFTl9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9HRU5fSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCisgKiBnZW5lcmF0ZXMgYSBzaW5lIHdhdmUgYXQgZXF1YWwgc3RlcHMuCisgKgorICogQXMgbW9zdCBvZiBvdXIgZnVuY3Rpb25zIHVzZSBzaW5lIG9yIGNvc2luZSBhdCBlcXVhbCBzdGVwcywKKyAqIGl0IGlzIHZlcnkgZWZmaWNpZW50IHRvIGNvbXB1dGUgdGhlbSB0aGF0IHdheSAoc2luZ2xlIG11bHRpcGx5IGFuZCBzdWJ0cmFjdCksCisgKiByYXRoZXIgdGhhbiBpbnZva2luZyB0aGUgbWF0aCBsaWJyYXJ5IHNpbigpIG9yIGNvcygpIGVhY2ggdGltZS4KKyAqCisgKiBTaW5lR2VuIHVzZXMgR29lcnR6ZWwncyBBbGdvcml0aG0gKGFzIGEgZ2VuZXJhdG9yIG5vdCBhIGZpbHRlcikKKyAqIHRvIGNhbGN1bGF0ZSBzaW5lKHdzdGFydCArIG4gKiB3c3RlcCkgb3IgY29zaW5lKHdzdGFydCArIG4gKiB3c3RlcCkKKyAqIGJ5IHN0ZXBwaW5nIHRocm91Z2ggMCwgMSwgLi4uIG4uCisgKgorICogZV5pKHdzdGFydCt3c3RlcCkgPSAyY29zKHdzdGVwKSAqIGVeaSh3c3RhcnQpIC0gZV5pKHdzdGFydC13c3RlcCkKKyAqCisgKiBvciBsb29raW5nIGF0IGp1c3QgdGhlIGltYWdpbmFyeSBzaW5lIHRlcm0sIGFzIHRoZSBjb3NpbmUgZm9sbG93cyBpZGVudGljYWxseToKKyAqCisgKiBzaW4od3N0YXJ0K3dzdGVwKSA9IDJjb3Mod3N0ZXApICogc2luKHdzdGFydCkgLSBzaW4od3N0YXJ0LXdzdGVwKQorICoKKyAqIEdvZXJ0emVsJ3MgYWxnb3JpdGhtIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIGFuZ2xlIGFkZGl0aW9uIGZvcm11bGEsCisgKiBlXmkod3N0YXJ0K3dzdGVwKSA9IGVeaSh3c3RhcnQpICogZV5pKHdzdGVwKSwgd2hpY2ggdGFrZXMgdXAgdG8KKyAqIDQgbXVsdGlwbGllcyBhbmQgMiBhZGRzIChvciAzKiBhbmQgMyspIGFuZCByZXF1aXJlcyBib3RoIHNpbmUgYW5kCisgKiBjb3NpbmUgZ2VuZXJhdGlvbiBkdWUgdG8gdGhlIGNvbXBsZXggKiBjb21wbGV4IG11bHRpcGx5IChmdWxsIHJvdGF0aW9uKS4KKyAqCisgKiBTZWU6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR29lcnR6ZWxfYWxnb3JpdGhtCisgKgorICovCisKK2NsYXNzIFNpbmVHZW4geworcHVibGljOgorICAgIFNpbmVHZW4oZG91YmxlIHdzdGFydCwgZG91YmxlIHdzdGVwLCBib29sIGNvc2luZSA9IGZhbHNlKSB7CisgICAgICAgIGlmIChjb3NpbmUpIHsKKyAgICAgICAgICAgIG1DdXJyZW50ID0gY29zKHdzdGFydCk7CisgICAgICAgICAgICBtUHJldmlvdXMgPSBjb3Mod3N0YXJ0IC0gd3N0ZXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUN1cnJlbnQgPSBzaW4od3N0YXJ0KTsKKyAgICAgICAgICAgIG1QcmV2aW91cyA9IHNpbih3c3RhcnQgLSB3c3RlcCk7CisgICAgICAgIH0KKyAgICAgICAgbVR3b0NvcyA9IDIuKmNvcyh3c3RlcCk7CisgICAgfQorICAgIFNpbmVHZW4oZG91YmxlIGV4cE5vdywgZG91YmxlIGV4cFByZXYsIGRvdWJsZSB0d29Db3NTdGVwKSB7CisgICAgICAgIG1DdXJyZW50ID0gZXhwTm93OworICAgICAgICBtUHJldmlvdXMgPSBleHBQcmV2OworICAgICAgICBtVHdvQ29zID0gdHdvQ29zU3RlcDsKKyAgICB9CisgICAgaW5saW5lIGRvdWJsZSB2YWx1ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DdXJyZW50OworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhZHZhbmNlKCkgeworICAgICAgICBkb3VibGUgdG1wID0gbUN1cnJlbnQ7CisgICAgICAgIG1DdXJyZW50ID0gbUN1cnJlbnQqbVR3b0NvcyAtIG1QcmV2aW91czsKKyAgICAgICAgbVByZXZpb3VzID0gdG1wOworICAgIH0KKyAgICBpbmxpbmUgZG91YmxlIHZhbHVlQWR2YW5jZSgpIHsKKyAgICAgICAgZG91YmxlIHRtcCA9IG1DdXJyZW50OworICAgICAgICBtQ3VycmVudCA9IG1DdXJyZW50Km1Ud29Db3MgLSBtUHJldmlvdXM7CisgICAgICAgIG1QcmV2aW91cyA9IHRtcDsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZG91YmxlIG1DdXJyZW50OyAvLyBjdXJyZW50IHZhbHVlIG9mIHNpbmUvY29zaW5lCisgICAgZG91YmxlIG1QcmV2aW91czsgLy8gcHJldmlvdXMgdmFsdWUgb2Ygc2luZS9jb3NpbmUKKyAgICBkb3VibGUgbVR3b0NvczsgLy8gc3RlcHBpbmcgZmFjdG9yCit9OworCisvKgorICogZ2VuZXJhdGVzIGEgc2VyaWVzIG9mIHNpbmUgZ2VuZXJhdG9ycywgcGhhc2Ugb2Zmc2V0IGJ5IGZpeGVkIHN0ZXBzLgorICoKKyAqIFRoaXMgaXMgdXNlZCB0byBnZW5lcmF0ZSBwb2x5cGhhc2Ugc2luZSBnZW5lcmF0b3JzLCBvbmUgcGVyIHBvbHlwaGFzZQorICogaW4gdGhlIGZpbHRlciBjb2RlIGJlbG93LgorICoKKyAqIFRoZSBTaW5lR2VuIHJldHVybmVkIGJ5IHZhbHVlKCkgc3RhcnRzIGF0IGlubmVyU3RhcnQgPSBvdXRlclN0YXJ0ICsgbipvdXRlclN0ZXA7CisgKiBpbmNyZW1lbnRzIGJ5IGlubmVyU3RlcC4KKyAqCisgKi8KKworY2xhc3MgU2luZUdlbkdlbiB7CitwdWJsaWM6CisgICAgU2luZUdlbkdlbihkb3VibGUgb3V0ZXJTdGFydCwgZG91YmxlIG91dGVyU3RlcCwgZG91YmxlIGlubmVyU3RlcCwgYm9vbCBjb3NpbmUgPSBmYWxzZSkKKyAgICAgICAgICAgIDogbVNpbmVJbm5lckN1cihvdXRlclN0YXJ0LCBvdXRlclN0ZXAsIGNvc2luZSksCisgICAgICAgICAgICAgIG1TaW5lSW5uZXJQcmV2KG91dGVyU3RhcnQtaW5uZXJTdGVwLCBvdXRlclN0ZXAsIGNvc2luZSkKKyAgICB7CisgICAgICAgIG1Ud29Db3MgPSAyLipjb3MoaW5uZXJTdGVwKTsKKyAgICB9CisgICAgaW5saW5lIFNpbmVHZW4gdmFsdWUoKSB7CisgICAgICAgIHJldHVybiBTaW5lR2VuKG1TaW5lSW5uZXJDdXIudmFsdWUoKSwgbVNpbmVJbm5lclByZXYudmFsdWUoKSwgbVR3b0Nvcyk7CisgICAgfQorICAgIGlubGluZSB2b2lkIGFkdmFuY2UoKSB7CisgICAgICAgIG1TaW5lSW5uZXJDdXIuYWR2YW5jZSgpOworICAgICAgICBtU2luZUlubmVyUHJldi5hZHZhbmNlKCk7CisgICAgfQorICAgIGlubGluZSBTaW5lR2VuIHZhbHVlQWR2YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIFNpbmVHZW4obVNpbmVJbm5lckN1ci52YWx1ZUFkdmFuY2UoKSwgbVNpbmVJbm5lclByZXYudmFsdWVBZHZhbmNlKCksIG1Ud29Db3MpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTaW5lR2VuIG1TaW5lSW5uZXJDdXI7IC8vIGdlbmVyYXRlIHRoZSBpbm5lciBzaW5lIHZhbHVlcyAoc3RlcHBlZCBieSBvdXRlclN0ZXApLgorICAgIFNpbmVHZW4gbVNpbmVJbm5lclByZXY7IC8vIGdlbmVyYXRlIHRoZSBpbm5lciBzaW5lIHByZXZpb3VzIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChiZWhpbmQgYnkgaW5uZXJTdGVwLCBzdGVwcGVkIGJ5IG91dGVyU3RlcCkuCisgICAgZG91YmxlIG1Ud29Db3M7IC8vIHRoZSBpbm5lciBzdGVwcGluZyBmYWN0b3IgZm9yIHRoZSByZXR1cm5lZCBTaW5lR2VuLgorfTsKKworc3RhdGljIGlubGluZSBkb3VibGUgc3FyKGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIHggKiB4OworfQorCisvKgorICogcm91bmRzIGEgZG91YmxlIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgZm9yIEZJUiBjb2VmZmljaWVudHMuCisgKgorICogT25lIHZhcmlhbnQgdXNlcyBub2lzZSBzaGFwaW5nLCB3aGljaCBtdXN0IGtlZXAgZXJyb3IgaGlzdG9yeQorICogdG8gd29yayAodGhlIGVyciBwYXJhbWV0ZXIsIGluaXRpYWxpemVkIHRvIDApLgorICogVGhlIG90aGVyIHZhcmlhbnQgaXMgYSBub24tbm9pc2Ugc2hhcGVkIHZlcnNpb24gZm9yCisgKiBTMzIgY29lZmZpY2llbnRzIChub2lzZSBzaGFwaW5nIGRvZXNuJ3QgZ2FpbiBtdWNoKS4KKyAqCisgKiBDYXV0aW9uOiBObyBib3VuZHMgc2F0dXJhdGlvbiBpcyBhcHBsaWVkLCBidXQgaXNuJ3QgbmVlZGVkIGluIHRoaXMgY2FzZS4KKyAqCisgKiBAcGFyYW0geCBpcyB0aGUgdmFsdWUgdG8gcm91bmQuCisgKgorICogQHBhcmFtIG1heHZhbCBpcyB0aGUgbWF4aW11bSBpbnRlZ2VyIHNjYWxlIGZhY3RvciBleHByZXNzZWQgYXMgYW4gaW50NjQgKGZvciBoZWFkcm9vbSkuCisgKiBUeXBpY2FsbHkgdGhpcyBtYXkgYmUgdGhlIG1heGltdW0gcG9zaXRpdmUgaW50ZWdlcisxICh1c2luZyB0aGUgZmFjdCB0aGF0IGRvdWJsZSBwcmVjaXNpb24KKyAqIEZJUiBjb2VmZmljaWVudHMgZ2VuZXJhdGVkIGhlcmUgYXJlIG5ldmVyIHRoYXQgY2xvc2UgdG8gMS4wIHRvIHBvc2UgYW4gb3ZlcmZsb3cgY29uZGl0aW9uKS4KKyAqCisgKiBAcGFyYW0gZXJyIGlzIHRoZSBwcmV2aW91cyBlcnJvciAoYWN0dWFsIC0gcm91bmRlZCkgZm9yIHRoZSBwcmV2aW91cyByb3VuZGluZyBvcC4KKyAqIEZvciAxNmIgY29lZmZpY2llbnRzIHRoaXMgY2FuIGltcHJvdmUgc3RvcGJhbmQgZEIgcGVyZm9ybWFuY2UgYnkgdXAgdG8gMmRCLgorICoKKyAqIE1hbnkgdmFyaWFudHMgZXhpc3QgZm9yIHRoZSBub2lzZSBzaGFwaW5nOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL05vaXNlX3NoYXBpbmcKKyAqCisgKi8KKworc3RhdGljIGlubGluZSBpbnQ2NF90IHRvaW50KGRvdWJsZSB4LCBpbnQ2NF90IG1heHZhbCwgZG91YmxlJiBlcnIpIHsKKyAgICBkb3VibGUgdmFsID0geCAqIG1heHZhbDsKKyAgICBkb3VibGUgaXZhbCA9IGZsb29yKHZhbCArIDAuNSArIGVyciowLjIpOworICAgIGVyciA9IHZhbCAtIGl2YWw7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGl2YWwpOworfQorCitzdGF0aWMgaW5saW5lIGludDY0X3QgdG9pbnQoZG91YmxlIHgsIGludDY0X3QgbWF4dmFsKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGZsb29yKHggKiBtYXh2YWwgKyAwLjUpKTsKK30KKworLyoKKyAqIE1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZAorICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CZXNzZWxfZnVuY3Rpb24KKyAqCisgKiBUaGUgZm9ybXVsYXMgYXJlIHRha2VuIGZyb20gQWJyYW1vd2l0eiBhbmQgU3RlZ3VuLAorICogX0hhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnNfIChsaW5rcyBiZWxvdyk6CisgKgorICogaHR0cDovL3Blb3BsZS5tYXRoLnNmdS5jYS9+Y2JtL2FhbmRzL3BhZ2VfMzc1Lmh0bQorICogaHR0cDovL3Blb3BsZS5tYXRoLnNmdS5jYS9+Y2JtL2FhbmRzL3BhZ2VfMzc4Lmh0bQorICoKKyAqIGh0dHA6Ly9kbG1mLm5pc3QuZ292LzEwLjI1CisgKiBodHRwOi8vZGxtZi5uaXN0Lmdvdi8xMC40MAorICoKKyAqIE5vdGUgd2UgYXNzdW1lIHggaXMgbm9ubmVnYXRpdmUgKHRoZSBmdW5jdGlvbiBpcyBzeW1tZXRyaWMsCisgKiBwYXNzIGluIHRoZSBhYnNvbHV0ZSB2YWx1ZSBhcyBuZWVkZWQpLgorICoKKyAqIENvbnN0YW50cyBhcmUgY29tcGlsZSB0aW1lIGRlcml2ZWQgd2l0aCB0ZW1wbGF0ZXMgSTBUZXJtPD4gYW5kCisgKiBJMEFUZXJtPD4gdG8gdGhlIHByZWNpc2lvbiBvZiB0aGUgY29tcGlsZXIuICBUaGUgc2VyaWVzIGNhbiBiZSBleHBhbmRlZAorICogdG8gYW55IHByZWNpc2lvbiBuZWVkZWQsIGJ1dCBjdXJyZW50bHkgc2V0IGFyb3VuZCAyNGIgcHJlY2lzaW9uLgorICoKKyAqIFdlIHVzZSBhIGJpdCBvZiB0ZW1wbGF0ZSBtYXRoIGhlcmUsIGNvbnN0ZXhwciB3b3VsZCBwcm9iYWJseSBiZQorICogbW9yZSBhcHByb3ByaWF0ZSBmb3IgYSBDKysxMSBjb21waWxlci4KKyAqCisgKiBGb3IgdGhlIGludGVybWVkaWF0ZSByYW5nZSAzLjc1IDwgeCA8IDE1LCB3ZSB1c2UgbWluaW1heCBwb2x5bm9taWFsIGZpdC4KKyAqCisgKi8KKwordGVtcGxhdGUgPGludCBOPgorc3RydWN0IEkwVGVybSB7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IEkwVGVybTxOLTE+Ojp2YWx1ZSAvICg0LiAqIE4gKiBOKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgSTBUZXJtPDA+IHsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHZhbHVlID0gMS47Cit9OworCit0ZW1wbGF0ZSA8aW50IE4+CitzdHJ1Y3QgSTBBVGVybSB7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IEkwQVRlcm08Ti0xPjo6dmFsdWUgKiAoMi4qTi0xLikgKiAoMi4qTi0xLikgLyAoOC4gKiBOKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgSTBBVGVybTwwPiB7IC8vIDEvc3FydCgyKlBJKTsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHZhbHVlID0gMC4zOTg5NDIyODA0MDE0MzI2Nzc5Mzk5NDYwNTk5MzQzODE4Njg0NzU4NTg2MzExNjQ5MzQ2NTc2NjU5MjU7Cit9OworCisjaWYgVVNFX0hPUk5FUlNfTUVUSE9ECisvKiBQb2x5bm9taWFsIGV2YWx1YXRpb24gb2YgQSArIEJ4ICsgQ3heMiArIER4XjMgKyAuLi4KKyAqIHVzaW5nIEhvcm5lcidzIE1ldGhvZDogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ib3JuZXInc19tZXRob2QKKyAqCisgKiBUaGlzIGhhcyBmZXdlciBtdWx0aXBsaWNhdGlvbnMgdGhhbiBFc3RyaW4ncyBtZXRob2QgYmVsb3csIGJ1dCBoYXMgYmFjayB0byBiYWNrCisgKiBmbG9hdGluZyBwb2ludCBkZXBlbmRlbmNpZXMuCisgKgorICogT24gQVJNIHRoaXMgYXBwZWFycyB0byB3b3JrIHNsb3dlciwgc28gVVNFX0hPUk5FUlNfTUVUSE9EIGlzIG5vdCBkZWZhdWx0IGVuYWJsZWQuCisgKi8KKworaW5saW5lIGRvdWJsZSBQb2x5Mihkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIEEgKyB4ICogQjsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5NChkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgRCwgZG91YmxlIHgpIHsKKyAgICByZXR1cm4gQSArIHggKiAoQiArIHggKiAoQyArIHggKiAoRCkpKTsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5Nyhkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgRCwgZG91YmxlIEUsIGRvdWJsZSBGLCBkb3VibGUgRywKKyAgICAgICAgZG91YmxlIHgpIHsKKyAgICByZXR1cm4gQSArIHggKiAoQiArIHggKiAoQyArIHggKiAoRCArIHggKiAoRSArIHggKiAoRiArIHggKiAoRykpKSkpKTsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5OShkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgRCwgZG91YmxlIEUsIGRvdWJsZSBGLCBkb3VibGUgRywKKyAgICAgICAgZG91YmxlIEgsIGRvdWJsZSBJLCBkb3VibGUgeCkgeworICAgIHJldHVybiBBICsgeCAqIChCICsgeCAqIChDICsgeCAqIChEICsgeCAqIChFICsgeCAqIChGICsgeCAqIChHICsgeCAqIChIICsgeCAqIChJKSkpKSkpKSk7Cit9CisKKyNlbHNlCisvKiBQb2x5bm9taWFsIGV2YWx1YXRpb24gb2YgQSArIEJ4ICsgQ3heMiArIER4XjMgKyAuLi4KKyAqIHVzaW5nIEVzdHJpbidzIE1ldGhvZDogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Fc3RyaW4nc19zY2hlbWUKKyAqCisgKiBUaGlzIGlzIHR5cGljYWxseSBmYXN0ZXIsIHBlcmhhcHMgZ2FpbnMgYWJvdXQgNS0xMCUgb3ZlcmFsbCBvbiBBUk0gcHJvY2Vzc29ycworICogb3ZlciBIb3JuZXIncyBtZXRob2QgYWJvdmUuCisgKi8KKworaW5saW5lIGRvdWJsZSBQb2x5Mihkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIEEgKyBCICogeDsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5Myhkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgeCwgZG91YmxlIHgyKSB7CisgICAgcmV0dXJuIFBvbHkyKEEsIEIsIHgpICsgQyAqIHgyOworfQorCitpbmxpbmUgZG91YmxlIFBvbHkzKGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIEMsIGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIFBvbHkyKEEsIEIsIHgpICsgQyAqIHggKiB4OworfQorCitpbmxpbmUgZG91YmxlIFBvbHk0KGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIEMsIGRvdWJsZSBELCBkb3VibGUgeCwgZG91YmxlIHgyKSB7CisgICAgcmV0dXJuIFBvbHkyKEEsIEIsIHgpICsgUG9seTIoQywgRCwgeCkgKiB4MjsgLy8gc2FtZSBhcyBwb2x5Mihwb2x5MiwgcG9seTIsIHgyKTsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5NChkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgRCwgZG91YmxlIHgpIHsKKyAgICByZXR1cm4gUG9seTQoQSwgQiwgQywgRCwgeCwgeCAqIHgpOworfQorCitpbmxpbmUgZG91YmxlIFBvbHk3KGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIEMsIGRvdWJsZSBELCBkb3VibGUgRSwgZG91YmxlIEYsIGRvdWJsZSBHLAorICAgICAgICBkb3VibGUgeCkgeworICAgIGRvdWJsZSB4MiA9IHggKiB4OworICAgIHJldHVybiBQb2x5NChBLCBCLCBDLCBELCB4LCB4MikgKyBQb2x5MyhFLCBGLCBHLCB4LCB4MikgKiAoeDIgKiB4Mik7Cit9CisKK2lubGluZSBkb3VibGUgUG9seTgoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgQywgZG91YmxlIEQsIGRvdWJsZSBFLCBkb3VibGUgRiwgZG91YmxlIEcsCisgICAgICAgIGRvdWJsZSBILCBkb3VibGUgeCwgZG91YmxlIHgyLCBkb3VibGUgeDQpIHsKKyAgICByZXR1cm4gUG9seTQoQSwgQiwgQywgRCwgeCwgeDIpICsgUG9seTQoRSwgRiwgRywgSCwgeCwgeDIpICogeDQ7Cit9CisKK2lubGluZSBkb3VibGUgUG9seTkoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgQywgZG91YmxlIEQsIGRvdWJsZSBFLCBkb3VibGUgRiwgZG91YmxlIEcsCisgICAgICAgIGRvdWJsZSBILCBkb3VibGUgSSwgZG91YmxlIHgpIHsKKyAgICBkb3VibGUgeDIgPSB4ICogeDsKKyNpZiAxCisgICAgLy8gSXQgZG9lcyBub3Qgc2VlbSBmYXN0ZXIgdG8gZXhwbGljaXRseSBkZWNvbXBvc2UgUG9seTggaW50byBQb2x5NCwgYnV0CisgICAgLy8gY291bGQgZGVwZW5kIG9uIGNvbXBpbGVyIGZsb2F0aW5nIHBvaW50IHNjaGVkdWxpbmcuCisgICAgZG91YmxlIHg0ID0geDIgKiB4MjsKKyAgICByZXR1cm4gUG9seTgoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgeCwgeDIsIHg0KSArIEkgKiAoeDQgKiB4NCk7CisjZWxzZQorICAgIGRvdWJsZSB2YWwgPSBQb2x5NChBLCBCLCBDLCBELCB4LCB4Mik7CisgICAgZG91YmxlIHg0ID0geDIgKiB4MjsKKyAgICByZXR1cm4gdmFsICsgUG9seTQoRSwgRiwgRywgSCwgeCwgeDIpICogeDQgKyBJICogKHg0ICogeDQpOworI2VuZGlmCit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBkb3VibGUgSTAoZG91YmxlIHgpIHsKKyAgICBpZiAoeCA8IDMuNzUpIHsKKyAgICAgICAgeCAqPSB4OworICAgICAgICByZXR1cm4gUG9seTcoSTBUZXJtPDA+Ojp2YWx1ZSwgSTBUZXJtPDE+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICBJMFRlcm08Mj46OnZhbHVlLCBJMFRlcm08Mz46OnZhbHVlLAorICAgICAgICAgICAgICAgIEkwVGVybTw0Pjo6dmFsdWUsIEkwVGVybTw1Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgSTBUZXJtPDY+Ojp2YWx1ZSwgeCk7IC8vIGUgPCAxLjZlLTcKKyAgICB9CisgICAgaWYgKDEpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VyaWVzIGV4cGFuc2lvbiBjb2VmcyBhcmUgZWFzeSB0byBjYWxjdWxhdGUsIGJ1dCBhcmUgZXhwYW5kZWQgYXJvdW5kIDAsCisgICAgICAgICAqIHNvIGVycm9yIGlzIHVuZXF1YWwgb3ZlciB0aGUgaW50ZXJ2YWwgMCA8IHggPCAzLjc1LCB0aGUgZXJyb3IgYmVpbmcKKyAgICAgICAgICogc2lnbmlmaWNhbnRseSBiZXR0ZXIgbmVhciAwLgorICAgICAgICAgKgorICAgICAgICAgKiBBIGJldHRlciBzb2x1dGlvbiBpcyB0byB1c2UgcHJlY2lzZSBtaW5pbWF4IHBvbHlub21pYWwgZml0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogV2UgdXNlIGEgc2xpZ2h0bHkgbW9yZSBjb21wbGljYXRlZCBzb2x1dGlvbiBmb3IgMy43NSA8IHggPCAxNSwgYmFzZWQgb24KKyAgICAgICAgICogdGhlIHRhYmxlcyBpbiBCbGFpciBhbmQgRWR3YXJkcywgIlN0YWJsZSBSYXRpb25hbCBNaW5pbWF4IEFwcHJveGltYXRpb25zCisgICAgICAgICAqIHRvIHRoZSBNb2RpZmllZCBCZXNzZWwgRnVuY3Rpb25zIEkwKHgpIGFuZCBJMSh4KSIsIENoYWxrIEhpbGwgTnVjbGVhciBMYWJvcmF0b3J5LAorICAgICAgICAgKiBBRUNMLTQ5MjguCisgICAgICAgICAqCisgICAgICAgICAqIGh0dHA6Ly93d3cuaWFlYS5vcmcvaW5pcy9jb2xsZWN0aW9uL05DTENvbGxlY3Rpb25TdG9yZS9fUHVibGljLzA2LzE3OC82MTc4NjY3LnBkZgorICAgICAgICAgKgorICAgICAgICAgKiBTZWUgVGFibGUgMTEgZm9yIDAgPCB4IDwgMTU7IGUgPCAxMF4oLTcuMTMpLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlOiBCZXRhIGNhbm5vdCBleGNlZWQgMTUgKGhlbmNlIFN0b3BiYW5kIGNhbm5vdCBleGNlZWQgMTQ0ZEIgPSAyNGIpLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHNwZWVkcyB1cCBvdmVyYWxsIGNvbXB1dGF0aW9uIGJ5IGFib3V0IDQwJSBvdmVyIHVzaW5nIHRoZSBlbHNlIGNsYXVzZSBiZWxvdywKKyAgICAgICAgICogd2hpY2ggcmVxdWlyZXMgc3FydCBhbmQgZXhwLgorICAgICAgICAgKgorICAgICAgICAgKi8KKworICAgICAgICB4ICo9IHg7CisgICAgICAgIGRvdWJsZSBudW0gPSBQb2x5OSgtMC4xMzU0NDkzODQzMGU5LCAtMC4zMzE1Mzc1NDUxMmU4LAorICAgICAgICAgICAgICAgIC0wLjE5NDA2NjMxOTQ2ZTcsIC0wLjQ4MDU4MzE4NzgzZTUsCisgICAgICAgICAgICAgICAgLTAuNjMyNjk3ODMzNjBlMywgLTAuNDk1MjA3NzkwNzBlMSwKKyAgICAgICAgICAgICAgICAtMC4yNDk3MDkxMDM3MGUtMSwgLTAuNzQ3NDExNTk1NTBlLTQsCisgICAgICAgICAgICAgICAgLTAuMTgyNTc2MTI0NjBlLTYsIHgpOworICAgICAgICBkb3VibGUgeSA9IHggLSAyMjUuOyAvLyByZWZsZWN0aW9uIGFyb3VuZCAxNSAoc3F1YXJlZCkKKyAgICAgICAgZG91YmxlIGRlbiA9IFBvbHk0KC0wLjM0NTk4NzM3MTk2ZTgsIDAuMjM4NTI2NDMxODFlNiwKKyAgICAgICAgICAgICAgICAtMC43MDY5OTM4NzYyMGUzLCAwLjEwMDAwMDAwMDAwZTEsIHkpOworICAgICAgICByZXR1cm4gbnVtIC8gZGVuOworCisjaWYgSU9fRVhURU5ERURfQkVUQQorICAgICAgICAvKiBUYWJsZSA0MiBmb3IgeCA+IDE1OyBlIDwgMTBeKC04LjExKS4KKyAgICAgICAgICogVGhpcyBpcyB1c2VkIGZvciBCZXRhPjE1LCBidXQgaXMgZGlzYWJsZWQgaGVyZSBhcworICAgICAgICAgKiB3ZSBuZXZlciB1c2UgQmV0YSB0aGF0IGhpZ2guCisgICAgICAgICAqCisgICAgICAgICAqIE5PVEU6IFRoaXMgc2hvdWxkIGJlIGVuYWJsZWQgb25seSBmb3IgeCA+IDE1LgorICAgICAgICAgKi8KKworICAgICAgICBkb3VibGUgeSA9IDEuL3g7CisgICAgICAgIGRvdWJsZSB6ID0geSAtICgxLi8xNSk7CisgICAgICAgIGRvdWJsZSBudW0gPSBQb2x5MigwLjQxNTA3OTg2MTc0NmUxLCAtMC41MTQ5MDkyNDk2ZTEsIHopOworICAgICAgICBkb3VibGUgZGVuID0gUG9seTMoMC4xMDMxNTA3NjM4MjNlMiwgLTAuMTQxODE2ODc0MTNlMiwKKyAgICAgICAgICAgICAgICAwLjEwMDAwMDAwMDBlMSwgeik7CisgICAgICAgIHJldHVybiBleHAoeCkgKiBzcXJ0KHkpICogbnVtIC8gZGVuOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTk9UIFVTRUQsIGJ1dCByZWZlcmVuY2UgZm9yIGxhcmdlIEJldGEuCisgICAgICAgICAqCisgICAgICAgICAqIEFicmFtb3dpdHogYW5kIFN0ZWd1biBhc3ltcHRvdGljIGZvcm11bGEuCisgICAgICAgICAqIHdvcmtzIGZvciB4ID4gMy43NS4KKyAgICAgICAgICovCisgICAgICAgIGRvdWJsZSB5ID0gMS4veDsKKyAgICAgICAgcmV0dXJuIGV4cCh4KSAqIHNxcnQoeSkgKgorICAgICAgICAgICAgICAgIC8vIG5vdGU6IHJlY2lwcm9jYWwgc3F1YXJlcm9vdCBtYXkgYmUgZWFzaWVyIQorICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmFzdF9pbnZlcnNlX3NxdWFyZV9yb290CisgICAgICAgICAgICAgICAgUG9seTkoSTBBVGVybTwwPjo6dmFsdWUsIEkwQVRlcm08MT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSTBBVGVybTwyPjo6dmFsdWUsIEkwQVRlcm08Mz46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSTBBVGVybTw0Pjo6dmFsdWUsIEkwQVRlcm08NT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSTBBVGVybTw2Pjo6dmFsdWUsIEkwQVRlcm08Nz46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSTBBVGVybTw4Pjo6dmFsdWUsIHkpOyAvLyAoLi4uIGUpIDwgMS45ZS03CisgICAgfQorfQorCisvKiBBIHNwZWVkIG9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBNb2RpZmllZCBCZXNzZWwgSTAoKSB3aGljaCBpbmNvcnBvcmF0ZXMKKyAqIHRoZSBzcXJ0IGFuZCBudW1lcmF0b3IgbXVsdGlwbHkgYW5kIGRlbm9taW5hdG9yIGRpdmlkZSBpbnRvIHRoZSBjb21wdXRhdGlvbi4KKyAqIFRoaXMgc3BlZWRzIHVwIGZpbHRlciBjb21wdXRhdGlvbiBieSBhYm91dCAxMC0xNSUuCisgKi8KK3N0YXRpYyBpbmxpbmUgZG91YmxlIEkwU3FyUmF0KGRvdWJsZSB4MiwgZG91YmxlIG51bSwgZG91YmxlIGRlbikgeworICAgIGlmICh4MiA8ICgzLjc1ICogMy43NSkpIHsKKyAgICAgICAgcmV0dXJuIFBvbHk3KEkwVGVybTwwPjo6dmFsdWUsIEkwVGVybTwxPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgSTBUZXJtPDI+Ojp2YWx1ZSwgSTBUZXJtPDM+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICBJMFRlcm08ND46OnZhbHVlLCBJMFRlcm08NT46OnZhbHVlLAorICAgICAgICAgICAgICAgIEkwVGVybTw2Pjo6dmFsdWUsIHgyKSAqIG51bSAvIGRlbjsgLy8gZSA8IDEuNmUtNworICAgIH0KKyAgICBudW0gKj0gUG9seTkoLTAuMTM1NDQ5Mzg0MzBlOSwgLTAuMzMxNTM3NTQ1MTJlOCwKKyAgICAgICAgICAgIC0wLjE5NDA2NjMxOTQ2ZTcsIC0wLjQ4MDU4MzE4NzgzZTUsCisgICAgICAgICAgICAtMC42MzI2OTc4MzM2MGUzLCAtMC40OTUyMDc3OTA3MGUxLAorICAgICAgICAgICAgLTAuMjQ5NzA5MTAzNzBlLTEsIC0wLjc0NzQxMTU5NTUwZS00LAorICAgICAgICAgICAgLTAuMTgyNTc2MTI0NjBlLTYsIHgyKTsgLy8gZSA8IDEwXigtNy4xMykuCisgICAgZG91YmxlIHkgPSB4MiAtIDIyNS47IC8vIHJlZmxlY3Rpb24gYXJvdW5kIDE1IChzcXVhcmVkKQorICAgIGRlbiAqPSBQb2x5NCgtMC4zNDU5ODczNzE5NmU4LCAwLjIzODUyNjQzMTgxZTYsCisgICAgICAgICAgICAtMC43MDY5OTM4NzYyMGUzLCAwLjEwMDAwMDAwMDAwZTEsIHkpOworICAgIHJldHVybiBudW0gLyBkZW47Cit9CisKKy8qCisgKiBjYWxjdWxhdGVzIHRoZSB0cmFuc2l0aW9uIGJhbmR3aWR0aCBmb3IgYSBLYWlzZXIgZmlsdGVyCisgKgorICogRm9ybXVsYSAzLjIuOCwgVmFpZHlhbmF0aGFuLCBfTXVsdGlyYXRlIFN5c3RlbXMgYW5kIEZpbHRlciBCYW5rc18sIHAuIDQ4CisgKiBGb3JtdWxhIDcuNzYsIE9wcGVuaGVpbSBhbmQgU2NoYWZlciwgX0Rpc2NyZXRlLXRpbWUgU2lnbmFsIFByb2Nlc3NpbmcsIDNlXywgcC4gNTQyCisgKgorICogQHBhcmFtIGhhbGZOdW1Db2VmIGlzIGhhbGYgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgcGVyIGZpbHRlciBwaGFzZS4KKyAqCisgKiBAcGFyYW0gc3RvcEJhbmRBdHRlbiBpcyB0aGUgc3RvcCBiYW5kIGF0dGVudWF0aW9uIGRlc2lyZWQuCisgKgorICogQHJldHVybiB0aGUgdHJhbnNpdGlvbiBiYW5kd2lkdGggaW4gbm9ybWFsaXplZCBmcmVxdWVuY3kgKDAgPD0gZiA8PSAwLjUpCisgKi8KK3N0YXRpYyBpbmxpbmUgZG91YmxlIGZpckthaXNlclRidyhpbnQgaGFsZk51bUNvZWYsIGRvdWJsZSBzdG9wQmFuZEF0dGVuKSB7CisgICAgcmV0dXJuIChzdG9wQmFuZEF0dGVuIC0gNy45NSkvKCgyLioxNC4zNikqaGFsZk51bUNvZWYpOworfQorCisvKgorICogY2FsY3VsYXRlcyB0aGUgZmlyIHRyYW5zZmVyIHJlc3BvbnNlIG9mIHRoZSBvdmVyYWxsIHBvbHlwaGFzZSBmaWx0ZXIgYXQgdy4KKyAqCisgKiBDYWxjdWxhdGVzIHRoZSBEVEZUIHRyYW5zZmVyIGNvZWZmaWNpZW50IEgodykgZm9yIDAgPD0gdyA8PSBQSSwgdXRpbGl6aW5nIHRoZQorICogZmFjdCB0aGF0IGhbbl0gaXMgc3ltbWV0cmljIChjb3NpbmVzIG9ubHksIG5vIGNvbXBsZXggYXJpdGhtZXRpYykuCisgKgorICogV2UgdXNlIEdvZXJ0emVsJ3MgYWxnb3JpdGhtIHRvIGFjY2VsZXJhdGUgdGhlIGNvbXB1dGF0aW9uIHRvIGVzc2VudGlhbGx5CisgKiBhIHNpbmdsZSBtdWx0aXBseSBhbmQgMiBhZGRzIHBlciBmaWx0ZXIgY29lZmZpY2llbnQgaFtdLgorICoKKyAqIEJlIGNhcmVmdWwgYmUgY2FyZWZ1bCB0byBjb25zaWRlciB0aGF0IGhbbl0gaXMgdGhlIG92ZXJhbGwgcG9seXBoYXNlIGZpbHRlciwKKyAqIHdpdGggTCBwaGFzZXMsIHNvIHJlc2NhbGluZyBIKHcpL0wgaXMgcHJvYmFibHkgd2hhdCB5b3UgZXhwZWN0IGZvciAidW5pdHkgZ2FpbiIsCisgKiBhcyB5b3Ugb25seSB1c2Ugb25lIG9mIHRoZSBwb2x5cGhhc2VzIGF0IGEgdGltZS4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIGRvdWJsZSBmaXJUcmFuc2Zlcihjb25zdCBUKiBjb2VmLCBpbnQgTCwgaW50IGhhbGZOdW1Db2VmLCBkb3VibGUgdykgeworICAgIGRvdWJsZSBhY2N1bSA9IHN0YXRpY19jYXN0PGRvdWJsZT4oY29lZlswXSkqMC41OyAgLy8gImNlbnRlciBjb2VmZmljaWVudCIgZnJvbSBmaXJzdCBiYW5rCisgICAgY29lZiArPSBoYWxmTnVtQ29lZjsgICAgLy8gc2tpcCBmaXJzdCBmaWx0ZXJiYW5rIChwaWNrZWQgdXAgYnkgdGhlIGxhc3QgZmlsdGVyYmFuaykuCisjaWYgU0xPV19GSVJUUkFOU0ZFUgorICAgIC8qIE9yaWdpbmFsIGNvZGUgZm9yIHJlZmVyZW5jZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgY29kZSBiZWxvdywgYnV0IHNsb3dlci4gKi8KKyAgICBmb3IgKGludCBpPTEgOyBpPD1MIDsgKytpKSB7CisgICAgICAgIGZvciAoaW50IGo9MCwgaXg9aSA7IGo8aGFsZk51bUNvZWYgOyArK2osIGl4Kz1MKSB7CisgICAgICAgICAgICBhY2N1bSArPSBjb3MoaXgqdykqc3RhdGljX2Nhc3Q8ZG91YmxlPigqY29lZisrKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgLyoKKyAgICAgKiBPdXIgb3ZlcmFsbCBmaWx0ZXIgaXMgc3RvcmVkIHN0cmlwZWQgYnkgcG9seXBoYXNlcywgbm90IGEgY29udGlndW91cyBoW25dLgorICAgICAqIFdlIGNvdWxkIGZldGNoIGNvZWZmaWNpZW50cyBpbiBhIG5vbi1jb250aWd1b3VzIGZhc2hpb24KKyAgICAgKiBidXQgdGhhdCB3aWxsIG5vdCBzY2FsZSB0byB2ZWN0b3IgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIFdlIGFwcGx5IEdvZXJ0emVsJ3MgYWxnb3JpdGhtIGRpcmVjdGx5IHRvIGVhY2ggcG9seXBoYXNlIGZpbHRlciBiYW5rIGluc3RlYWQgb2YKKyAgICAgKiB1c2luZyBjb3NpbmUgZ2VuZXJhdGlvbi9tdWx0aXBsaWNhdGlvbiwgdGhlcmVieSBzYXZpbmcgb25lIG11bHRpcGx5IHBlciBpbm5lciBsb29wLgorICAgICAqCisgICAgICogU2VlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dvZXJ0emVsX2FsZ29yaXRobQorICAgICAqIEFsc286IE9wcGVuaGVpbSBhbmQgU2NoYWZlciwgX0Rpc2NyZXRlIFRpbWUgU2lnbmFsIFByb2Nlc3NpbmcsIDNlXywgcC4gNzIwLgorICAgICAqCisgICAgICogV2UgdXNlIHRoZSBiYXNpYyByZWN1cnNpb24gdG8gaW5jb3Jwb3JhdGUgdGhlIGNvc2luZSBzdGVwcyBpbnRvIHJlYWwgc2VxdWVuY2UgeFtuXToKKyAgICAgKiBzW25dID0geFtuXSArICgyY29zdykqc1tuLTFdICsgc1tuLTJdCisgICAgICoKKyAgICAgKiB5W25dID0gc1tuXSAtIGVeKGl3KXNbbi0xXQorICAgICAqICAgICAgPSBzdW1fe2s9LVxpbmZ0eX1ee259IHhba11lXigtaXcobi1rKSkKKyAgICAgKiAgICAgID0gZV4oLWl3bikgc3VtX3trPTB9XntufSB4W2tdZV4oaXdrKQorICAgICAqCisgICAgICogVGhlIHN1bW1hdGlvbiBjb250YWlucyB0aGUgZnJlcXVlbmN5IHN0ZXBzIHdlIHdhbnQgbXVsdGlwbGllZCBieSB0aGUgc291cmNlCisgICAgICogKHNpbWlsYXIgdG8gYSBEVEZUKS4KKyAgICAgKgorICAgICAqIFVzaW5nIHN5bW1ldHJ5LCBhbmQganVzdCB0aGUgcmVhbCBwYXJ0IChiZSBjYXJlZnVsLCB0aGlzIG11c3QgaGFwcGVuCisgICAgICogYWZ0ZXIgYW55IGludGVybmFsIGNvbXBsZXggbXVsdGlwbGljYXRpb25zKSwgdGhlIHBvbHlwaGFzZSBmaWx0ZXJiYW5rCisgICAgICogdHJhbnNmZXIgZnVuY3Rpb24gaXM6CisgICAgICoKKyAgICAgKiBIcHBbbiwgdywgd18wXSA9IHN1bV97az0wfV57bn0geFtrXSAqIGNvcyh3ayArIHdfMCkKKyAgICAgKiAgICAgICAgICAgICAgICA9IFJleyBlXihpd24gKyBpd18wKSB5W25dfQorICAgICAqICAgICAgICAgICAgICAgID0gY29zKHduK3dfMCkgKiBzW25dIC0gY29zKHcobisxKSt3XzApICogc1tuLTFdCisgICAgICoKKyAgICAgKiB1c2luZyB0aGUgZmFjdCB0aGF0IHNbbl0gb2YgcmVhbCB4W25dIGlzIHJlYWwuCisgICAgICoKKyAgICAgKi8KKyAgICBkb3VibGUgZGNvcyA9IDIuICogY29zKEwqdyk7CisgICAgaW50IHN0YXJ0ID0gKChoYWxmTnVtQ29lZikqTCArIDEpOworICAgIFNpbmVHZW4gY2MoKHN0YXJ0IC0gTCkgKiB3LCB3LCB0cnVlKTsgLy8gY29zaW5lCisgICAgU2luZUdlbiBjcChzdGFydCAqIHcsIHcsIHRydWUpOyAvLyBjb3NpbmUKKyAgICBmb3IgKGludCBpPTEgOyBpPD1MIDsgKytpKSB7CisgICAgICAgIGRvdWJsZSBzYyA9IDA7CisgICAgICAgIGRvdWJsZSBzcCA9IDA7CisgICAgICAgIGZvciAoaW50IGo9MCA7IGo8aGFsZk51bUNvZWYgOyArK2opIHsKKyAgICAgICAgICAgIGRvdWJsZSB0bXAgPSBzYzsKKyAgICAgICAgICAgIHNjICA9IHN0YXRpY19jYXN0PGRvdWJsZT4oKmNvZWYrKykgKyBkY29zKnNjIC0gc3A7CisgICAgICAgICAgICBzcCA9IHRtcDsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiB3ZSBhcmUgYXdmdWxseSBjbGV2ZXIsIHdlIGNhbiBhcHBseSBHb2VydHplbCdzIGFsZ29yaXRobQorICAgICAgICAvLyBhZ2FpbiBvbiB0aGUgc2MgYW5kIHNwIHNlcXVlbmNlcyByZXR1cm5lZCBoZXJlLgorICAgICAgICBhY2N1bSArPSBjYy52YWx1ZUFkdmFuY2UoKSAqIHNjIC0gY3AudmFsdWVBZHZhbmNlKCkgKiBzcDsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gYWNjdW0qMi47Cit9CisKKy8qCisgKiBldmFsdWF0ZXMgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gfEgoZil8IGJvdW5kIGluIGEgYmFuZCByZWdpb24uCisgKgorICogVGhpcyBpcyB1c3VhbGx5IGRvbmUgd2l0aCBlcXVhbGx5IHNwYWNlZCBpbmNyZW1lbnRzIGluIHRoZSB0YXJnZXQgYmFuZCBpbiBxdWVzdGlvbi4KKyAqIFRoZSBwYXNzYmFuZCBpcyBvZnRlbiB2ZXJ5IHNtYWxsLCBhbmQgc2FtcGxlZCB0aGF0IHdheS4gVGhlIHN0b3BiYW5kIGlzIG9mdGVuIG11Y2gKKyAqIGxhcmdlci4KKyAqCisgKiBXZSB1c2UgdGhlIGZhY3QgdGhhdCB0aGUgb3ZlcmFsbCBwb2x5cGhhc2UgZmlsdGVyIGhhcyBhbiBhZGRpdGlvbmFsIGJhbmsgYXQgdGhlIGVuZAorICogZm9yIGludGVycG9sYXRpb247IGhlbmNlIGl0IGlzIG92ZXJzcGVjaWZpZWQgZm9yIHRoZSBIKGYpIGNvbXB1dGF0aW9uLiAgVGh1cyB0aGUKKyAqIGZpcnN0IHBvbHlwaGFzZSBpcyBuZXZlciBhY3R1YWxseSBjaGVja2VkLCBleGNlcHRpbmcgaXRzIGZpcnN0IHRlcm0uCisgKgorICogSW4gdGhpcyBjb2RlIHdlIHVzZSB0aGUgZmlyVHJhbnNmZXIoKSBldmFsdWF0b3IgYWJvdmUsIHdoaWNoIHVzZXMgR29lcnR6ZWwncworICogYWxnb3JpdGhtIHRvIGNhbGN1bGF0ZSB0aGUgdHJhbnNmZXIgZnVuY3Rpb24gYXQgZWFjaCBwb2ludC4KKyAqCisgKiBUT0RPOiBBbiBhbHRlcm5hdGl2ZSB3aXRoIGVxdWFsIHNwYWNpbmcgaXMgdGhlIEZGVC9ERlQuICBBbiBhbHRlcm5hdGl2ZSB3aXRoIHVuZXF1YWwKKyAqIHNwYWNpbmcgaXMgYSBjaGlycCB0cmFuc2Zvcm0uCisgKgorICogQHBhcmFtIGNvZWYgaXMgdGhlIGRlc2lnbmVkIHBvbHlwaGFzZSBmaWx0ZXIgYmFua3MKKyAqCisgKiBAcGFyYW0gTCBpcyB0aGUgbnVtYmVyIG9mIHBoYXNlcyAoZm9yIGludGVycG9sYXRpb24pCisgKgorICogQHBhcmFtIGhhbGZOdW1Db2VmIHNob3VsZCBiZSBoYWxmIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGZvciBhIHNpbmdsZQorICogcG9seXBoYXNlLgorICoKKyAqIEBwYXJhbSBmc3RhcnQgaXMgdGhlIG5vcm1hbGl6ZWQgZnJlcXVlbmN5IHN0YXJ0LgorICoKKyAqIEBwYXJhbSBmZW5kIGlzIHRoZSBub3JtYWxpemVkIGZyZXF1ZW5jeSBlbmQuCisgKgorICogQHBhcmFtIHN0ZXBzIGlzIHRoZSBudW1iZXIgb2Ygc3RlcHMgdG8gdGFrZSAoc2FtcGxpbmcpIGJldHdlZW4gZnJlcXVlbmN5IHN0YXJ0IGFuZCBlbmQKKyAqCisgKiBAcGFyYW0gZmlyTWluIHJldHVybnMgdGhlIG1pbmltdW0gdHJhbnNmZXIgfEgoZil8IGZvdW5kCisgKgorICogQHBhcmFtIGZpck1heCByZXR1cm5zIHRoZSBtYXhpbXVtIHRyYW5zZmVyIHxIKGYpfCBmb3VuZAorICoKKyAqIDAgPD0gZiA8PSAwLjUuCisgKiBUaGlzIGlzIHVzZWQgdG8gdGVzdCBwYXNzYmFuZCBhbmQgc3RvcGJhbmQgcGVyZm9ybWFuY2UuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgdGVzdEZpcihjb25zdCBUKiBjb2VmLCBpbnQgTCwgaW50IGhhbGZOdW1Db2VmLAorICAgICAgICBkb3VibGUgZnN0YXJ0LCBkb3VibGUgZmVuZCwgaW50IHN0ZXBzLCBkb3VibGUgJmZpck1pbiwgZG91YmxlICZmaXJNYXgpIHsKKyAgICBkb3VibGUgd3N0YXJ0ID0gZnN0YXJ0KigyLipNX1BJKTsKKyAgICBkb3VibGUgd2VuZCA9IGZlbmQqKDIuKk1fUEkpOworICAgIGRvdWJsZSB3c3RlcCA9ICh3ZW5kIC0gd3N0YXJ0KS9zdGVwczsKKyAgICBkb3VibGUgZm1heCwgZm1pbjsKKyAgICBkb3VibGUgdHJmID0gZmlyVHJhbnNmZXIoY29lZiwgTCwgaGFsZk51bUNvZWYsIHdzdGFydCk7CisgICAgaWYgKHRyZjwwKSB7CisgICAgICAgIHRyZiA9IC10cmY7CisgICAgfQorICAgIGZtaW4gPSBmbWF4ID0gdHJmOworICAgIHdzdGFydCArPSB3c3RlcDsKKyAgICBmb3IgKGludCBpPTE7IGk8c3RlcHM7ICsraSkgeworICAgICAgICB0cmYgPSBmaXJUcmFuc2Zlcihjb2VmLCBMLCBoYWxmTnVtQ29lZiwgd3N0YXJ0KTsKKyAgICAgICAgaWYgKHRyZjwwKSB7CisgICAgICAgICAgICB0cmYgPSAtdHJmOworICAgICAgICB9CisgICAgICAgIGlmICh0cmY+Zm1heCkgeworICAgICAgICAgICAgZm1heCA9IHRyZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0cmY8Zm1pbikgeworICAgICAgICAgICAgZm1pbiA9IHRyZjsKKyAgICAgICAgfQorICAgICAgICB3c3RhcnQgKz0gd3N0ZXA7CisgICAgfQorICAgIC8vIHJlbm9ybWFsaXplIC0gdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgaW50ZWdlciBmaWx0ZXIgdHlwZXMKKyAgICBkb3VibGUgbm9ybSA9IDEuLygoMVVMTDw8KHNpemVvZihUKSo4LTEpKSpMKTsKKworICAgIGZpck1pbiA9IGZtaW4gKiBub3JtOworICAgIGZpck1heCA9IGZtYXggKiBub3JtOworfQorCisvKgorICogZXZhbHVhdGVzIHRoZSB8SChmKXwgbG93cGFzcyBiYW5kIGNoYXJhY3RlcmlzdGljcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRlc3RzIHRoZSBsb3dwYXNzIGNoYXJhY3RlcmlzdGljcyBmb3IgdGhlIG92ZXJhbGwgcG9seXBoYXNlIGZpbHRlciwKKyAqIGFuZCBpcyB1c2VkIHRvIHZlcmlmeSB0aGUgZGVzaWduLiAgRm9yIHRoaXMgY2FzZSwgZnAgc2hvdWxkIGJlIHNldCB0byB0aGUKKyAqIHBhc3NiYW5kIG5vcm1hbGl6ZWQgZnJlcXVlbmN5IGZyb20gMCB0byAwLjUgZm9yIHRoZSBvdmVyYWxsIGZpbHRlciAodGh1cyBpdAorICogaXMgdGhlIGRlc2lnbmVkIHBvbHlwaGFzZSBiYW5rIHZhbHVlIC8gTCkuICBMaWtld2lzZSBmb3IgZnMuCisgKgorICogQHBhcmFtIGNvZWYgaXMgdGhlIGRlc2lnbmVkIHBvbHlwaGFzZSBmaWx0ZXIgYmFua3MKKyAqCisgKiBAcGFyYW0gTCBpcyB0aGUgbnVtYmVyIG9mIHBoYXNlcyAoZm9yIGludGVycG9sYXRpb24pCisgKgorICogQHBhcmFtIGhhbGZOdW1Db2VmIHNob3VsZCBiZSBoYWxmIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGZvciBhIHNpbmdsZQorICogcG9seXBoYXNlLgorICoKKyAqIEBwYXJhbSBmcCBpcyB0aGUgcGFzc2JhbmQgbm9ybWFsaXplZCBmcmVxdWVuY3ksIDAgPCBmcCA8IGZzIDwgMC41LgorICoKKyAqIEBwYXJhbSBmcyBpcyB0aGUgc3RvcGJhbmQgbm9ybWFsaXplZCBmcmVxdWVuY3ksIDAgPCBmcCA8IGZzIDwgMC41LgorICoKKyAqIEBwYXJhbSBwYXNzU3RlcHMgaXMgdGhlIG51bWJlciBvZiBwYXNzYmFuZCBzYW1wbGluZyBzdGVwcy4KKyAqCisgKiBAcGFyYW0gc3RvcFN0ZXBzIGlzIHRoZSBudW1iZXIgb2Ygc3RvcGJhbmQgc2FtcGxpbmcgc3RlcHMuCisgKgorICogQHBhcmFtIHBhc3NNaW4gaXMgdGhlIG1pbmltdW0gdmFsdWUgaW4gdGhlIHBhc3NiYW5kCisgKgorICogQHBhcmFtIHBhc3NNYXggaXMgdGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIHBhc3NiYW5kICh1c2VmdWwgZm9yIHNjYWxpbmcpLiAgVGhpcyBzaG91bGQKKyAqIGJlIGxlc3MgdGhhbiAxLiwgdG8gYXZvaWQgc2luZSB3YXZlIHRlc3Qgb3ZlcmZsb3cuCisgKgorICogQHBhcmFtIHBhc3NSaXBwbGUgaXMgdGhlIHBhc3NiYW5kIHJpcHBsZS4gIFR5cGljYWxseSB0aGlzIHNob3VsZCBiZSBsZXNzIHRoYW4gMC4xIGZvcgorICogYW4gYXVkaW8gZmlsdGVyLiAgR2VuZXJhbGx5IHNwZWFrZXIvaGVhZHBob25lIGRldmljZSBjaGFyYWN0ZXJpc3RpY3Mgd2lsbCBkb21pbmF0ZQorICogdGhlIHBhc3NiYW5kIHRlcm0uCisgKgorICogQHBhcmFtIHN0b3BNYXggaXMgdGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIHN0b3BiYW5kLgorICoKKyAqIEBwYXJhbSBzdG9wUmlwcGxlIGlzIHRoZSBzdG9wYmFuZCByaXBwbGUsIGFsc28ga25vd24gYXMgc3RvcGJhbmQgYXR0ZW51YXRpb24uCisgKiBUeXBpY2FsbHkgdGhpcyBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIH44MGRCIGZvciBsb3cgcXVhbGl0eSwgYW5kIGdyZWF0ZXIgdGhhbgorICogfjEwMGRCIGZvciBmdWxsIDE2YiBxdWFsaXR5LCBvdGhlcndpc2UgYWxpYXNpbmcgbWF5IGJlY29tZSBub3RpY2VhYmxlLgorICoKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCB0ZXN0RmlyKGNvbnN0IFQqIGNvZWYsIGludCBMLCBpbnQgaGFsZk51bUNvZWYsCisgICAgICAgIGRvdWJsZSBmcCwgZG91YmxlIGZzLCBpbnQgcGFzc1N0ZXBzLCBpbnQgc3RvcFN0ZXBzLAorICAgICAgICBkb3VibGUgJnBhc3NNaW4sIGRvdWJsZSAmcGFzc01heCwgZG91YmxlICZwYXNzUmlwcGxlLAorICAgICAgICBkb3VibGUgJnN0b3BNYXgsIGRvdWJsZSAmc3RvcFJpcHBsZSkgeworICAgIGRvdWJsZSBmbWluLCBmbWF4OworICAgIHRlc3RGaXIoY29lZiwgTCwgaGFsZk51bUNvZWYsIDAuLCBmcCwgcGFzc1N0ZXBzLCBmbWluLCBmbWF4KTsKKyAgICBkb3VibGUgZDEgPSAoZm1heCAtIGZtaW4pLzIuOworICAgIHBhc3NNaW4gPSBmbWluOworICAgIHBhc3NNYXggPSBmbWF4OworICAgIHBhc3NSaXBwbGUgPSAtMjAuKmxvZzEwKDEuIC0gZDEpOyAvLyBwYXNzYmFuZCByaXBwbGUKKyAgICB0ZXN0RmlyKGNvZWYsIEwsIGhhbGZOdW1Db2VmLCBmcywgMC41LCBzdG9wU3RlcHMsIGZtaW4sIGZtYXgpOworICAgIC8vIGZtaW4gaXMgcmVhbGx5IG5vdCBpbXBvcnRhbnQgZm9yIHRoZSBzdG9wYmFuZC4KKyAgICBzdG9wTWF4ID0gZm1heDsKKyAgICBzdG9wUmlwcGxlID0gLTIwLipsb2cxMChmbWF4KTsgLy8gc3RvcGJhbmQgcmlwcGxlL2F0dGVudWF0aW9uCit9CisKKy8qCisgKiBDYWxjdWxhdGVzIHRoZSBvdmVyYWxsIHBvbHlwaGFzZSBmaWx0ZXIgYmFzZWQgb24gYSB3aW5kb3dlZCBzaW5jIGZ1bmN0aW9uLgorICoKKyAqIFRoZSB3aW5kb3dlZCBzaW5jIGlzIGFuIG9kZCBsZW5ndGggc3ltbWV0cmljIGZpbHRlciBvZiBleGFjdGx5IEwqaGFsZk51bUNvZWYqMisxCisgKiB0YXBzIGZvciB0aGUgZW50aXJlIGtlcm5lbC4gIFRoaXMgaXMgdGhlbiBkZWNvbXBvc2VkIGludG8gTCsxIHBvbHlwaGFzZSBmaWx0ZXJiYW5rcy4KKyAqIFRoZSBsYXN0IGZpbHRlcmJhbmsgaXMgdXNlZCBmb3IgaW50ZXJwb2xhdGlvbiBwdXJwb3NlcyAoYW5kIGlzIG1vc3RseSBjb21wb3NlZAorICogb2YgdGhlIGZpcnN0IGJhbmsgc2hpZnRlZCBieSBvbmUgc2FtcGxlKSwgYW5kIGlzIHVubmVjZXNzYXJ5IGlmIG9uZSBkb2VzCisgKiBub3QgZG8gaW50ZXJwb2xhdGlvbi4KKyAqCisgKiBXZSB1c2UgdGhlIGxhc3QgZmlsdGVyYmFuayBmb3Igc29tZSB0cmFuc2ZlciBmdW5jdGlvbiBjYWxjdWxhdGlvbiBwdXJwb3NlcywKKyAqIHNvIGl0IG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBhbnl3YXlzLgorICoKKyAqIEBwYXJhbSBjb2VmIGlzIHRoZSBjYWxsZXIgYWxsb2NhdGVkIHNwYWNlIGZvciBjb2VmZmljaWVudHMuICBUaGlzIHNob3VsZCBiZQorICogZXhhY3RseSAoTCsxKSpoYWxmTnVtQ29lZiBpbiBzaXplLgorICoKKyAqIEBwYXJhbSBMIGlzIHRoZSBudW1iZXIgb2YgcGhhc2VzIChmb3IgaW50ZXJwb2xhdGlvbikKKyAqCisgKiBAcGFyYW0gaGFsZk51bUNvZWYgc2hvdWxkIGJlIGhhbGYgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgZm9yIGEgc2luZ2xlCisgKiBwb2x5cGhhc2UuCisgKgorICogQHBhcmFtIHN0b3BCYW5kQXR0ZW4gaXMgdGhlIHN0b3BiYW5kIHZhbHVlLCBzaG91bGQgYmUgPjUwZEIuCisgKgorICogQHBhcmFtIGZjciBpcyBjdXRvZmYgZnJlcXVlbmN5L3NhbXBsaW5nIHJhdGUgKDwwLjUpLiAgQXQgdGhpcyBwb2ludCwgdGhlIGVuZXJneQorICogc2hvdWxkIGJlIDZkQiBsZXNzLiAoZmNyIGlzIHdoZXJlIHRoZSBhbXBsaXR1ZGUgZHJvcHMgYnkgaGFsZikuICBVc2UgdGhlCisgKiBmaXJLYWlzZXJUYncoKSB0byBjYWxjdWxhdGUgdGhlIHRyYW5zaXRpb24gYmFuZHdpZHRoLiAgZmNyIGlzIHRoZSBtaWRwb2ludAorICogYmV0d2VlbiB0aGUgc3RvcCBiYW5kIGFuZCB0aGUgcGFzcyBiYW5kIChmc3RvcCtmcGFzcykvMi4KKyAqCisgKiBAcGFyYW0gYXR0ZW4gaXMgdGhlIGF0dGVudWF0aW9uIChnZW5lcmFsbHkgc2xpZ2h0bHkgbGVzcyB0aGFuIDEpLgorICovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZSB2b2lkIGZpckthaXNlckdlbihUKiBjb2VmLCBpbnQgTCwgaW50IGhhbGZOdW1Db2VmLAorICAgICAgICBkb3VibGUgc3RvcEJhbmRBdHRlbiwgZG91YmxlIGZjciwgZG91YmxlIGF0dGVuKSB7CisgICAgLy8KKyAgICAvLyBGb3JtdWxhIDMuMi41LCAzLjIuNywgVmFpZHlhbmF0aGFuLCBfTXVsdGlyYXRlIFN5c3RlbXMgYW5kIEZpbHRlciBCYW5rc18sIHAuIDQ4CisgICAgLy8gRm9ybXVsYSA3Ljc1LCBPcHBlbmhlaW0gYW5kIFNjaGFmZXIsIF9EaXNjcmV0ZS10aW1lIFNpZ25hbCBQcm9jZXNzaW5nLCAzZV8sIHAuIDU0MgorICAgIC8vCisgICAgLy8gU2VlIGFsc286IGh0dHA6Ly9tZWxvZGkuZWUud2FzaGluZ3Rvbi5lZHUvY291cnNlcy9lZTUxOC9ub3Rlcy9sZWMxNy5wZGYKKyAgICAvLworICAgIC8vIEthaXNlciB3aW5kb3cgYW5kIGJldGEgcGFyYW1ldGVyCisgICAgLy8KKyAgICAvLyAgICAgICAgIHwgMC4xMTAyKihBIC0gOC43KSAgICAgICAgICAgICAgICAgICAgICAgICBBID4gNTAKKyAgICAvLyAgYmV0YSA9IHwgMC41ODQyKihBIC0gMjEpXjAuNCArIDAuMDc4ODYqKEEgLSAyMSkgICAyMSA8PSBBIDw9IDUwCisgICAgLy8gICAgICAgICB8IDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSA8IDIxCisgICAgLy8KKyAgICAvLyB3aXRoIEEgaXMgdGhlIGRlc2lyZWQgc3RvcC1iYW5kIGF0dGVudWF0aW9uIGluIGRCRlMKKyAgICAvLworICAgIC8vICAgIDMwIGRCICAgIDIuMjEwCisgICAgLy8gICAgNDAgZEIgICAgMy4zODQKKyAgICAvLyAgICA1MCBkQiAgICA0LjUzOAorICAgIC8vICAgIDYwIGRCICAgIDUuNjU4CisgICAgLy8gICAgNzAgZEIgICAgNi43NjQKKyAgICAvLyAgICA4MCBkQiAgICA3Ljg2NQorICAgIC8vICAgIDkwIGRCICAgIDguOTYwCisgICAgLy8gICAxMDAgZEIgICAxMC4wNTYKKworICAgIGNvbnN0IGludCBOID0gTCAqIGhhbGZOdW1Db2VmOyAvLyBub24tbmVnYXRpdmUgaGFsZgorICAgIGNvbnN0IGRvdWJsZSBiZXRhID0gMC4xMTAyICogKHN0b3BCYW5kQXR0ZW4gLSA4LjcpOyAvLyA+PSA1MGRCIGFsd2F5cworICAgIGNvbnN0IGRvdWJsZSB4c3RlcCA9ICgyLiAqIE1fUEkpICogZmNyIC8gTDsKKyAgICBjb25zdCBkb3VibGUgeGZyYWMgPSAxLiAvIE47CisgICAgY29uc3QgZG91YmxlIHlzY2FsZSA9IGF0dGVuICogTCAvIChJMChiZXRhKSAqIE1fUEkpOworICAgIGNvbnN0IGRvdWJsZSBzcXJiZXRhID0gc3FyKGJldGEpOworCisgICAgLy8gV2UgdXNlIHNpbmUgZ2VuZXJhdG9ycywgd2hpY2ggY29tcHV0ZXMgc2luZXMgb24gcmVndWxhciBzdGVwIGludGVydmFscy4KKyAgICAvLyBUaGlzIHNwZWVkcyB1cCBvdmVyYWxsIGNvbXB1dGF0aW9uIGFib3V0IDQwJSBmcm9tIGNvbXB1dGluZyB0aGUgc2luZSBkaXJlY3RseS4KKworICAgIFNpbmVHZW5HZW4gc2dnKDAuLCB4c3RlcCwgTCp4c3RlcCk7IC8vIGdlbmVyYXRlcyBzaW5lIGdlbmVyYXRvcnMgKG9uZSBwZXIgcG9seXBoYXNlKQorCisgICAgZm9yIChpbnQgaT0wIDsgaTw9TCA7ICsraSkgeyAvLyBnZW5lcmF0ZSBhbiBleHRyYSBzZXQgb2YgY29lZnMgZm9yIGludGVycG9sYXRpb24KKworICAgICAgICAvLyBjb21wdXRhdGlvbiBmb3IgYSBzaW5nbGUgcG9seXBoYXNlIG9mIHRoZSBvdmVyYWxsIGZpbHRlci4KKyAgICAgICAgU2luZUdlbiBzZyA9IHNnZy52YWx1ZUFkdmFuY2UoKTsgLy8gY3VycmVudCBzaW5lIGdlbmVyYXRvciBmb3IgImoiIGlubmVyIGxvb3AuCisgICAgICAgIGRvdWJsZSBlcnIgPSAwOyAvLyBmb3Igbm9pc2Ugc2hhcGluZyBvbiBpbnQxNl90IGNvZWZmaWNpZW50cyAob3ZlciBlYWNoIHBvbHlwaGFzZSkKKworICAgICAgICBmb3IgKGludCBqPTAsIGl4PWkgOyBqPGhhbGZOdW1Db2VmIDsgKytqLCBpeCs9TCkgeworICAgICAgICAgICAgZG91YmxlIHk7CisgICAgICAgICAgICBpZiAoQ0NfTElLRUxZKGl4KSkgeworICAgICAgICAgICAgICAgIGRvdWJsZSB4ID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpeCk7CisKKyAgICAgICAgICAgICAgICAvLyBzaW5lIGdlbmVyYXRvcjogc2cudmFsdWVBZHZhbmNlKCkgcmV0dXJucyBzaW4oaXgqeHN0ZXApOworICAgICAgICAgICAgICAgIC8vIHkgPSBJMChiZXRhICogc3FydCgxLjAgLSBzcXIoeCAqIHhmcmFjKSkpICogeXNjYWxlICogc2cudmFsdWVBZHZhbmNlKCkgLyB4OworICAgICAgICAgICAgICAgIHkgPSBJMFNxclJhdChzcXJiZXRhICogKDEuMCAtIHNxcih4ICogeGZyYWMpKSwgeXNjYWxlICogc2cudmFsdWVBZHZhbmNlKCksIHgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB5ID0gMi4gKiBhdHRlbiAqIGZjcjsgLy8gY2VudGVyIG9mIGZpbHRlciwgc2luYygwKSA9IDEuCisgICAgICAgICAgICAgICAgc2cuYWR2YW5jZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNfc2FtZTxULCBpbnQxNl90Pjo6dmFsdWUpIHsgLy8gaW50MTZfdCBuZWVkcyBub2lzZSBzaGFwaW5nCisgICAgICAgICAgICAgICAgKmNvZWYrKyA9IHN0YXRpY19jYXN0PFQ+KHRvaW50KHksIDFVTEw8PChzaXplb2YoVCkqOC0xKSwgZXJyKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzX3NhbWU8VCwgaW50MzJfdD46OnZhbHVlKSB7CisgICAgICAgICAgICAgICAgKmNvZWYrKyA9IHN0YXRpY19jYXN0PFQ+KHRvaW50KHksIDFVTEw8PChzaXplb2YoVCkqOC0xKSkpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gYXNzdW1lZCBmbG9hdCBvciBkb3VibGUKKyAgICAgICAgICAgICAgICAqY29lZisrID0gc3RhdGljX2Nhc3Q8VD4oeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9HRU5fSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJPcHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpck9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMjE2M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJPcHMuaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX09QU19ICisjZGVmaW5lIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9PUFNfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKKyNkZWZpbmUgVVNFX0lOTElORV9BU1NFTUJMWSAodHJ1ZSkKKyNlbHNlCisjZGVmaW5lIFVTRV9JTkxJTkVfQVNTRU1CTFkgKGZhbHNlKQorI2VuZGlmCisKKyNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZICYmIGRlZmluZWQoX19BUk1fTkVPTl9fKQorI2RlZmluZSBVU0VfTkVPTiAodHJ1ZSkKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorI2Vsc2UKKyNkZWZpbmUgVVNFX05FT04gKGZhbHNlKQorI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzdHJ1Y3QgaXNfc2FtZQoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGlzX3NhbWU8VCwgVD4gIC8vIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCitzdGF0aWMgaW5saW5lCitpbnQzMl90IG11bFJMKGludCBsZWZ0LCBpbnQzMl90IGluLCB1aW50MzJfdCB2UkwpCit7CisjaWYgVVNFX0lOTElORV9BU1NFTUJMWQorICAgIGludDMyX3Qgb3V0OworICAgIGlmIChsZWZ0KSB7CisgICAgICAgIGFzbSggInNtdWx0YiAlW291dF0sICVbaW5dLCAlW3ZSTF0gXG4iCisgICAgICAgICAgICAgOiBbb3V0XSI9ciIob3V0KQorICAgICAgICAgICAgIDogW2luXSIlciIoaW4pLCBbdlJMXSJyIih2UkwpCisgICAgICAgICAgICAgOiApOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzbSggInNtdWx0dCAlW291dF0sICVbaW5dLCAlW3ZSTF0gXG4iCisgICAgICAgICAgICAgOiBbb3V0XSI9ciIob3V0KQorICAgICAgICAgICAgIDogW2luXSIlciIoaW4pLCBbdlJMXSJyIih2UkwpCisgICAgICAgICAgICAgOiApOworICAgIH0KKyAgICByZXR1cm4gb3V0OworI2Vsc2UKKyAgICBpbnQxNl90IHYgPSBsZWZ0ID8gc3RhdGljX2Nhc3Q8aW50MTZfdD4odlJMKSA6IHN0YXRpY19jYXN0PGludDE2X3Q+KHZSTD4+MTYpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90Pigoc3RhdGljX2Nhc3Q8aW50NjRfdD4oaW4pICogdikgPj4gMTYpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUKK2ludDMyX3QgbXVsQWRkKGludDE2X3QgaW4sIGludDE2X3QgdiwgaW50MzJfdCBhKQoreworI2lmIFVTRV9JTkxJTkVfQVNTRU1CTFkKKyAgICBpbnQzMl90IG91dDsKKyAgICBhc20oICJzbWxhYmIgJVtvdXRdLCAlW3ZdLCAlW2luXSwgJVthXSBcbiIKKyAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgIDogW2luXSIlciIoaW4pLCBbdl0iciIodiksIFthXSJyIihhKQorICAgICAgICAgOiApOworICAgIHJldHVybiBvdXQ7CisjZWxzZQorICAgIHJldHVybiBhICsgdiAqIGluOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUKK2ludDMyX3QgbXVsQWRkKGludDE2X3QgaW4sIGludDMyX3QgdiwgaW50MzJfdCBhKQoreworI2lmIFVTRV9JTkxJTkVfQVNTRU1CTFkKKyAgICBpbnQzMl90IG91dDsKKyAgICBhc20oICJzbWxhd2IgJVtvdXRdLCAlW3ZdLCAlW2luXSwgJVthXSBcbiIKKyAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgIDogW2luXSIlciIoaW4pLCBbdl0iciIodiksIFthXSJyIihhKQorICAgICAgICAgOiApOworICAgIHJldHVybiBvdXQ7CisjZWxzZQorICAgIHJldHVybiBhICsgc3RhdGljX2Nhc3Q8aW50MzJfdD4oKHN0YXRpY19jYXN0PGludDY0X3Q+KHYpICogaW4pID4+IDE2KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lCitpbnQzMl90IG11bEFkZChpbnQzMl90IGluLCBpbnQzMl90IHYsIGludDMyX3QgYSkKK3sKKyNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZCisgICAgaW50MzJfdCBvdXQ7CisgICAgYXNtKCAic21tbGEgJVtvdXRdLCAlW3ZdLCAlW2luXSwgJVthXSBcbiIKKyAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgIDogW2luXSIlciIoaW4pLCBbdl0iciIodiksIFthXSJyIihhKQorICAgICAgICAgOiApOworICAgIHJldHVybiBvdXQ7CisjZWxzZQorICAgIHJldHVybiBhICsgc3RhdGljX2Nhc3Q8aW50MzJfdD4oKHN0YXRpY19jYXN0PGludDY0X3Q+KHYpICogaW4pID4+IDMyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lCitpbnQzMl90IG11bEFkZFJMKGludCBsZWZ0LCB1aW50MzJfdCBpblJMLCBpbnQxNl90IHYsIGludDMyX3QgYSkKK3sKKyNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZCisgICAgaW50MzJfdCBvdXQ7CisgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgYXNtKCAic21sYWJiICVbb3V0XSwgJVt2XSwgJVtpblJMXSwgJVthXSBcbiIKKyAgICAgICAgICAgICA6IFtvdXRdIj1yIihvdXQpCisgICAgICAgICAgICAgOiBbaW5STF0iJXIiKGluUkwpLCBbdl0iciIodiksIFthXSJyIihhKQorICAgICAgICAgICAgIDogKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhc20oICJzbWxhYnQgJVtvdXRdLCAlW3ZdLCAlW2luUkxdLCAlW2FdIFxuIgorICAgICAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgICAgICA6IFtpblJMXSIlciIoaW5STCksIFt2XSJyIih2KSwgW2FdInIiKGEpCisgICAgICAgICAgICAgOiApOworICAgIH0KKyAgICByZXR1cm4gb3V0OworI2Vsc2UKKyAgICBpbnQxNl90IHMgPSBsZWZ0ID8gc3RhdGljX2Nhc3Q8aW50MTZfdD4oaW5STCkgOiBzdGF0aWNfY2FzdDxpbnQxNl90PihpblJMPj4xNik7CisgICAgcmV0dXJuIGEgKyB2ICogczsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lCitpbnQzMl90IG11bEFkZFJMKGludCBsZWZ0LCB1aW50MzJfdCBpblJMLCBpbnQzMl90IHYsIGludDMyX3QgYSkKK3sKKyNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZCisgICAgaW50MzJfdCBvdXQ7CisgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgYXNtKCAic21sYXdiICVbb3V0XSwgJVt2XSwgJVtpblJMXSwgJVthXSBcbiIKKyAgICAgICAgICAgICA6IFtvdXRdIj1yIihvdXQpCisgICAgICAgICAgICAgOiBbaW5STF0iJXIiKGluUkwpLCBbdl0iciIodiksIFthXSJyIihhKQorICAgICAgICAgICAgIDogKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhc20oICJzbWxhd3QgJVtvdXRdLCAlW3ZdLCAlW2luUkxdLCAlW2FdIFxuIgorICAgICAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgICAgICA6IFtpblJMXSIlciIoaW5STCksIFt2XSJyIih2KSwgW2FdInIiKGEpCisgICAgICAgICAgICAgOiApOworICAgIH0KKyAgICByZXR1cm4gb3V0OworI2Vsc2UKKyAgICBpbnQxNl90IHMgPSBsZWZ0ID8gc3RhdGljX2Nhc3Q8aW50MTZfdD4oaW5STCkgOiBzdGF0aWNfY2FzdDxpbnQxNl90PihpblJMPj4xNik7CisgICAgcmV0dXJuIGEgKyBzdGF0aWNfY2FzdDxpbnQzMl90Pigoc3RhdGljX2Nhc3Q8aW50NjRfdD4odikgKiBzKSA+PiAxNik7CisjZW5kaWYKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX09QU19IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmM4MDU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfUFJPQ0VTU19ICisjZGVmaW5lIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9QUk9DRVNTX0gKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBkZXBlbmRzIG9uIEF1ZGlvUmVzYW1wbGVyRmlyT3BzLmgKKworLyogdmFyaWFudCBmb3IgaW5wdXQgdHlwZSBUSSA9IGludDE2X3QgaW5wdXQgc2FtcGxlcyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVEM+CitzdGF0aWMgaW5saW5lCit2b2lkIG1hYyhpbnQzMl90JiBsLCBpbnQzMl90JiByLCBUQyBjb2VmLCBjb25zdCBpbnQxNl90KiBzYW1wbGVzKQoreworICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihzYW1wbGVzKTsKKyAgICBsID0gbXVsQWRkUkwoMSwgcmwsIGNvZWYsIGwpOworICAgIHIgPSBtdWxBZGRSTCgwLCBybCwgY29lZiwgcik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDPgorc3RhdGljIGlubGluZQordm9pZCBtYWMoaW50MzJfdCYgbCwgVEMgY29lZiwgY29uc3QgaW50MTZfdCogc2FtcGxlcykKK3sKKyAgICBsID0gbXVsQWRkKHNhbXBsZXNbMF0sIGNvZWYsIGwpOworfQorCisvKiB2YXJpYW50IGZvciBpbnB1dCB0eXBlIFRJID0gZmxvYXQgaW5wdXQgc2FtcGxlcyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVEM+CitzdGF0aWMgaW5saW5lCit2b2lkIG1hYyhmbG9hdCYgbCwgZmxvYXQmIHIsIFRDIGNvZWYsICBjb25zdCBmbG9hdCogc2FtcGxlcykKK3sKKyAgICBsICs9ICpzYW1wbGVzKysgKiBjb2VmOworICAgIHIgKz0gKnNhbXBsZXMgKiBjb2VmOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQz4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgbWFjKGZsb2F0JiBsLCBUQyBjb2VmLCAgY29uc3QgZmxvYXQqIHNhbXBsZXMpCit7CisgICAgbCArPSAqc2FtcGxlcyAqIGNvZWY7Cit9CisKKy8qIHZhcmlhbnQgZm9yIG91dHB1dCB0eXBlIFRPID0gaW50MzJfdCBvdXRwdXQgc2FtcGxlcyAqLworc3RhdGljIGlubGluZQoraW50MzJfdCB2b2x1bWVBZGp1c3QoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpCit7CisgICAgcmV0dXJuIDIgKiBtdWxSTCgwLCB2YWx1ZSwgdm9sdW1lKTsgIC8vIE5vdGU6IG9ubHkgdXNlIHRvcCAxNmIKK30KKworLyogdmFyaWFudCBmb3Igb3V0cHV0IHR5cGUgVE8gPSBmbG9hdCBvdXRwdXQgc2FtcGxlcyAqLworc3RhdGljIGlubGluZQorZmxvYXQgdm9sdW1lQWRqdXN0KGZsb2F0IHZhbHVlLCBmbG9hdCB2b2x1bWUpCit7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lOworfQorCisvKgorICogSGVscGVyIHRlbXBsYXRlIGZ1bmN0aW9ucyBmb3IgbG9vcCB1bnJvbGxpbmcgYWNjdW11bGF0b3Igb3BlcmF0aW9ucy4KKyAqCisgKiBVbnJvbGxpbmcgdGhlIGxvb3BzIGFjaGlldmVzIGFib3V0IDJ4IGdhaW4uCisgKiBVc2luZyBhIHJlY3Vyc2l2ZSB0ZW1wbGF0ZSByYXRoZXIgdGhhbiBhbiBhcnJheSBvZiBUT1tdIGZvciB0aGUgYWNjdW11bGF0b3IKKyAqIHZhbHVlcyBpcyBhbiBhZGRpdGlvbmFsIDEwLTIwJSBnYWluLgorICovCisKK3RlbXBsYXRlPGludCBDSEFOTkVMUywgdHlwZW5hbWUgVE8+CitjbGFzcyBBY2N1bXVsYXRvciA6IHB1YmxpYyBBY2N1bXVsYXRvcjxDSEFOTkVMUy0xLCBUTz4gLy8gcmVjdXJzaXZlCit7CitwdWJsaWM6CisgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgQWNjdW11bGF0b3I8Q0hBTk5FTFMtMSwgVE8+OjpjbGVhcigpOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEk+CisgICAgaW5saW5lIHZvaWQgYWNjKFRDIGNvZWYsIGNvbnN0IFRJKiYgZGF0YSkgeworICAgICAgICBtYWModmFsdWUsIGNvZWYsIGRhdGErKyk7CisgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLTEsIFRPPjo6YWNjKGNvZWYsIGRhdGEpOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCB2b2x1bWUoVE8qJiBvdXQsIFRPIGdhaW4pIHsKKyAgICAgICAgKm91dCsrID0gdm9sdW1lQWRqdXN0KHZhbHVlLCBnYWluKTsKKyAgICAgICAgQWNjdW11bGF0b3I8Q0hBTk5FTFMtMSwgVE8+Ojp2b2x1bWUob3V0LCBnYWluKTsKKyAgICB9CisKKyAgICBUTyB2YWx1ZTsgLy8gb25lIHBlciByZWN1cnNpdmUgaW5oZXJpdGVkIGJhc2UgY2xhc3MKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRPPgorY2xhc3MgQWNjdW11bGF0b3I8MCwgVE8+IHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJPgorICAgIGlubGluZSB2b2lkIGFjYyhUQyBjb2VmIF9fdW51c2VkLCBjb25zdCBUSSomIGRhdGEgX191bnVzZWQpIHsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgdm9sdW1lKFRPKiYgb3V0IF9fdW51c2VkLCBUTyBnYWluIF9fdW51c2VkKSB7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJTlRFUlA+CitpbmxpbmUKK1RDIGludGVycG9sYXRlKFRDIGNvZWZfMCwgVEMgY29lZl8xLCBUSU5URVJQIGxlcnApCit7CisgICAgcmV0dXJuIGxlcnAgKiAoY29lZl8xIC0gY29lZl8wKSArIGNvZWZfMDsKK30KKwordGVtcGxhdGU8PgoraW5saW5lCitpbnQxNl90IGludGVycG9sYXRlPGludDE2X3QsIHVpbnQzMl90PihpbnQxNl90IGNvZWZfMCwgaW50MTZfdCBjb2VmXzEsIHVpbnQzMl90IGxlcnApCit7ICAgLy8gaW4gc29tZSBDUFUgYXJjaGl0ZWN0dXJlcyAxNmIgeCAxNmIgbXVsdGlwbGllcyBhcmUgZmFzdGVyLgorICAgIHJldHVybiAoc3RhdGljX2Nhc3Q8aW50MTZfdD4obGVycCkgKiBzdGF0aWNfY2FzdDxpbnQxNl90Pihjb2VmXzEgLSBjb2VmXzApID4+IDE1KSArIGNvZWZfMDsKK30KKwordGVtcGxhdGU8PgoraW5saW5lCitpbnQzMl90IGludGVycG9sYXRlPGludDMyX3QsIHVpbnQzMl90PihpbnQzMl90IGNvZWZfMCwgaW50MzJfdCBjb2VmXzEsIHVpbnQzMl90IGxlcnApCit7CisgICAgcmV0dXJuIChsZXJwICogc3RhdGljX2Nhc3Q8aW50NjRfdD4oY29lZl8xIC0gY29lZl8wKSA+PiAzMSkgKyBjb2VmXzA7Cit9CisKKy8qIGNsYXNzIHNjb3BlIGZvciBwYXNzaW5nIGluIGZ1bmN0aW9ucyBpbnRvIHRlbXBsYXRlcyAqLworc3RydWN0IEludGVycENvbXB1dGUgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSU5URVJQPgorICAgIHN0YXRpYyBpbmxpbmUKKyAgICBUQyBpbnRlcnBvbGF0ZXAoVEMgY29lZl8wLCBUQyBjb2VmXzEsIFRJTlRFUlAgbGVycCkgeworICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUoY29lZl8wLCBjb2VmXzEsIGxlcnApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSU5URVJQPgorICAgIHN0YXRpYyBpbmxpbmUKKyAgICBUQyBpbnRlcnBvbGF0ZW4oVEMgY29lZl8wLCBUQyBjb2VmXzEsIFRJTlRFUlAgbGVycCkgeworICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUoY29lZl8wLCBjb2VmXzEsIGxlcnApOworICAgIH0KK307CisKK3N0cnVjdCBJbnRlcnBOdWxsIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVElOVEVSUD4KKyAgICBzdGF0aWMgaW5saW5lCisgICAgVEMgaW50ZXJwb2xhdGVwKFRDIGNvZWZfMCwgVEMgY29lZl8xIF9fdW51c2VkLCBUSU5URVJQIGxlcnAgX191bnVzZWQpIHsKKyAgICAgICAgcmV0dXJuIGNvZWZfMDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVElOVEVSUD4KKyAgICBzdGF0aWMgaW5saW5lCisgICAgVEMgaW50ZXJwb2xhdGVuKFRDIGNvZWZfMCBfX3VudXNlZCwgVEMgY29lZl8xLCBUSU5URVJQIGxlcnAgX191bnVzZWQpIHsKKyAgICAgICAgcmV0dXJuIGNvZWZfMTsKKyAgICB9Cit9OworCisvKgorICogQ2FsY3VsYXRlcyBhIHNpbmdsZSBvdXRwdXQgZnJhbWUgKHR3byBzYW1wbGVzKS4KKyAqCisgKiBUaGUgUHJvY2VzcyooKSBmdW5jdGlvbnMgY29tcHV0ZSBib3RoIHRoZSBwb3NpdGl2ZSBoYWxmIEZJUiBkb3QgcHJvZHVjdCBhbmQKKyAqIHRoZSBuZWdhdGl2ZSBoYWxmIEZJUiBkb3QgcHJvZHVjdCwgYWNjdW11bGF0ZXMsIGFuZCB0aGVuIGFwcGxpZXMgdGhlIHZvbHVtZS4KKyAqCisgKiBVc2UgZmlyKCkgdG8gY29tcHV0ZSB0aGUgcHJvcGVyIGNvZWZmaWNpZW50IHBvaW50ZXJzIGZvciBhIHBvbHlwaGFzZQorICogZmlsdGVyIGJhbmsuCisgKgorICogUHJvY2Vzc0Jhc2UoKSBpcyB0aGUgZnVuZGFtZW50YWwgcHJvY2Vzc2luZyB0ZW1wbGF0ZSBmdW5jdGlvbi4KKyAqCisgKiBQcm9jZXNzTCgpIGNhbGxzIFByb2Nlc3NCYXNlKCkgd2l0aCBURlVOQyA9IEludGVycE51bGwsIGZvciBmaXhlZC9sb2NrZWQgcGhhc2UuCisgKiBQcm9jZXNzKCkgY2FsbHMgUHJvY2Vzc0Jhc2UoKSB3aXRoIFRGVU5DID0gSW50ZXJwQ29tcHV0ZSwgZm9yIGludGVycG9sYXRlZCBwaGFzZS4KKyAqLworCit0ZW1wbGF0ZSA8aW50IENIQU5ORUxTLCBpbnQgU1RSSURFLCB0eXBlbmFtZSBURlVOQywgdHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVElOVEVSUD4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgUHJvY2Vzc0Jhc2UoVE8qIGNvbnN0IG91dCwKKyAgICAgICAgc2l6ZV90IGNvdW50LAorICAgICAgICBjb25zdCBUQyogY29lZnNQLAorICAgICAgICBjb25zdCBUQyogY29lZnNOLAorICAgICAgICBjb25zdCBUSSogc1AsCisgICAgICAgIGNvbnN0IFRJKiBzTiwKKyAgICAgICAgVElOVEVSUCBsZXJwUCwKKyAgICAgICAgY29uc3QgVE8qIGNvbnN0IHZvbHVtZUxSKQoreworICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoQ0hBTk5FTFMgPiAwKQorCisgICAgaWYgKENIQU5ORUxTID4gMikgeworICAgICAgICAvLyBUTyBhY2N1bVtDSEFOTkVMU107CisgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLCBUTz4gYWNjdW07CisKKyAgICAgICAgLy8gZm9yIChpbnQgaiA9IDA7IGogPCBDSEFOTkVMUzsgKytqKSBhY2N1bVtqXSA9IDA7CisgICAgICAgIGFjY3VtLmNsZWFyKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgVEMgYyA9IFRGVU5DOjppbnRlcnBvbGF0ZXAoY29lZnNQWzBdLCBjb2Vmc1BbY291bnRdLCBsZXJwUCk7CisKKyAgICAgICAgICAgIC8vIGZvciAoaW50IGogPSAwOyBqIDwgQ0hBTk5FTFM7ICsraikgbWFjKGFjY3VtW2pdLCBjLCBzUCArIGopOworICAgICAgICAgICAgY29uc3QgVEkgKnRtcF9kYXRhID0gc1A7IC8vIHRtcF9wdHIgc2VlbXMgdG8gd29yayBiZXR0ZXIKKyAgICAgICAgICAgIGFjY3VtLmFjYyhjLCB0bXBfZGF0YSk7CisKKyAgICAgICAgICAgIGNvZWZzUCsrOworICAgICAgICAgICAgc1AgLT0gQ0hBTk5FTFM7CisgICAgICAgICAgICBjID0gVEZVTkM6OmludGVycG9sYXRlbihjb2Vmc05bY291bnRdLCBjb2Vmc05bMF0sIGxlcnBQKTsKKworICAgICAgICAgICAgLy8gZm9yIChpbnQgaiA9IDA7IGogPCBDSEFOTkVMUzsgKytqKSBtYWMoYWNjdW1bal0sIGMsIHNOICsgaik7CisgICAgICAgICAgICB0bXBfZGF0YSA9IHNOOyAvLyB0bXBfcHRyIHNlZW1zIGZhc3RlciB0aGFuIGRpcmVjdGx5IHVzaW5nIHNOCisgICAgICAgICAgICBhY2N1bS5hY2MoYywgdG1wX2RhdGEpOworCisgICAgICAgICAgICBjb2Vmc04rKzsKKyAgICAgICAgICAgIHNOICs9IENIQU5ORUxTOworICAgICAgICB9CisgICAgICAgIC8vIGZvciAoaW50IGogPSAwOyBqIDwgQ0hBTk5FTFM7ICsraikgb3V0W2pdICs9IHZvbHVtZUFkanVzdChhY2N1bVtqXSwgdm9sdW1lTFJbMF0pOworICAgICAgICBUTyAqdG1wX291dCA9IG91dDsgLy8gbWF5IHJlbW92ZSBpZiBjb25zdCBvdXQgZGVmaW5pdGlvbiBjaGFuZ2VzLgorICAgICAgICBhY2N1bS52b2x1bWUodG1wX291dCwgdm9sdW1lTFJbMF0pOworICAgIH0gZWxzZSBpZiAoQ0hBTk5FTFMgPT0gMikgeworICAgICAgICBUTyBsID0gMDsKKyAgICAgICAgVE8gciA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgbWFjKGwsIHIsIFRGVU5DOjppbnRlcnBvbGF0ZXAoY29lZnNQWzBdLCBjb2Vmc1BbY291bnRdLCBsZXJwUCksIHNQKTsKKyAgICAgICAgICAgIGNvZWZzUCsrOworICAgICAgICAgICAgc1AgLT0gQ0hBTk5FTFM7CisgICAgICAgICAgICBtYWMobCwgciwgVEZVTkM6OmludGVycG9sYXRlbihjb2Vmc05bY291bnRdLCBjb2Vmc05bMF0sIGxlcnBQKSwgc04pOworICAgICAgICAgICAgY29lZnNOKys7CisgICAgICAgICAgICBzTiArPSBDSEFOTkVMUzsKKyAgICAgICAgfQorICAgICAgICBvdXRbMF0gKz0gdm9sdW1lQWRqdXN0KGwsIHZvbHVtZUxSWzBdKTsKKyAgICAgICAgb3V0WzFdICs9IHZvbHVtZUFkanVzdChyLCB2b2x1bWVMUlsxXSk7CisgICAgfSBlbHNlIHsgLyogQ0hBTk5FTFMgPT0gMSAqLworICAgICAgICBUTyBsID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBtYWMobCwgVEZVTkM6OmludGVycG9sYXRlcChjb2Vmc1BbMF0sIGNvZWZzUFtjb3VudF0sIGxlcnBQKSwgc1ApOworICAgICAgICAgICAgY29lZnNQKys7CisgICAgICAgICAgICBzUCAtPSBDSEFOTkVMUzsKKyAgICAgICAgICAgIG1hYyhsLCBURlVOQzo6aW50ZXJwb2xhdGVuKGNvZWZzTltjb3VudF0sIGNvZWZzTlswXSwgbGVycFApLCBzTik7CisgICAgICAgICAgICBjb2Vmc04rKzsKKyAgICAgICAgICAgIHNOICs9IENIQU5ORUxTOworICAgICAgICB9CisgICAgICAgIG91dFswXSArPSB2b2x1bWVBZGp1c3QobCwgdm9sdW1lTFJbMF0pOworICAgICAgICBvdXRbMV0gKz0gdm9sdW1lQWRqdXN0KGwsIHZvbHVtZUxSWzFdKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxpbnQgQ0hBTk5FTFMsIGludCBTVFJJREUsIHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CitzdGF0aWMgaW5saW5lCit2b2lkIFByb2Nlc3NMKFRPKiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgVEkqIHNQLAorICAgICAgICBjb25zdCBUSSogc04sCisgICAgICAgIGNvbnN0IFRPKiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBQcm9jZXNzQmFzZTxDSEFOTkVMUywgU1RSSURFLCBJbnRlcnBOdWxsPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCAwLCB2b2x1bWVMUik7Cit9CisKK3RlbXBsYXRlIDxpbnQgQ0hBTk5FTFMsIGludCBTVFJJREUsIHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJTlRFUlA+CitzdGF0aWMgaW5saW5lCit2b2lkIFByb2Nlc3MoVE8qIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBUQyogY29lZnNQLAorICAgICAgICBjb25zdCBUQyogY29lZnNOLAorICAgICAgICBjb25zdCBUQyogY29lZnNQMSBfX3VudXNlZCwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzTjEgX191bnVzZWQsCisgICAgICAgIGNvbnN0IFRJKiBzUCwKKyAgICAgICAgY29uc3QgVEkqIHNOLAorICAgICAgICBUSU5URVJQIGxlcnBQLAorICAgICAgICBjb25zdCBUTyogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgUHJvY2Vzc0Jhc2U8Q0hBTk5FTFMsIFNUUklERSwgSW50ZXJwQ29tcHV0ZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgbGVycFAsIHZvbHVtZUxSKTsKK30KKworLyoKKyAqIENhbGN1bGF0ZXMgYSBzaW5nbGUgb3V0cHV0IGZyYW1lICh0d28gc2FtcGxlcykgZnJvbSBpbnB1dCBzYW1wbGUgcG9pbnRlci4KKyAqCisgKiBUaGlzIHNldHMgdXAgdGhlIHBhcmFtcyBmb3IgdGhlIGFjY2VsZXJhdGVkIFByb2Nlc3MoKSBhbmQgUHJvY2Vzc0woKQorICogZnVuY3Rpb25zIHRvIGRvIHRoZSBhcHByb3ByaWF0ZSBkb3QgcHJvZHVjdHMuCisgKgorICogQHBhcmFtIG91dCBzaG91bGQgcG9pbnQgdG8gdGhlIG91dHB1dCBidWZmZXIgd2l0aCBzcGFjZSBmb3IgYXQgbGVhc3Qgb25lIG91dHB1dCBmcmFtZS4KKyAqCisgKiBAcGFyYW0gcGhhc2UgaXMgdGhlIGZyYWN0aW9uYWwgZGlzdGFuY2UgYmV0d2VlbiBpbnB1dCBmcmFtZXMgZm9yIGludGVycG9sYXRpb246CisgKiBwaGFzZSA+PSAwICAmJiBwaGFzZSA8IHBoYXNlV3JhcExpbWl0LiAgSXQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSByYXRpb25hbCBmcmFjdGlvbgorICogb2YgcGhhc2UvcGhhc2VXcmFwTGltaXQuCisgKgorICogQHBhcmFtIHBoYXNlV3JhcExpbWl0IGlzICNwb2x5cGhhc2VzPDxjb2VmU2hpZnQsIHdoZXJlICNwb2x5cGhhc2VzIGlzIHRoZSBudW1iZXIgb2YgcG9seXBoYXNlcworICogaW4gdGhlIHBvbHlwaGFzZSBmaWx0ZXIuIExpa2V3aXNlLCAjcG9seXBoYXNlcyBjYW4gYmUgb2J0YWluZWQgYXMgKHBoYXNlV3JhcExpbWl0Pj5jb2VmU2hpZnQpLgorICoKKyAqIEBwYXJhbSBjb2VmU2hpZnQgZ2l2ZXMgdGhlIGJpdCBhbGlnbm1lbnQgb2YgdGhlIHBvbHlwaGFzZSBpbmRleCBpbiB0aGUgcGhhc2UgcGFyYW1ldGVyLgorICoKKyAqIEBwYXJhbSBoYWxmTnVtQ29lZnMgaXMgdGhlIGhhbGYgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgcGVyIHBvbHlwaGFzZSBmaWx0ZXIuIFNpbmNlIHRoZQorICogb3ZlcmFsbCBmaWx0ZXJiYW5rIGlzIG9kZC1sZW5ndGggc3ltbWV0cmljLCBvbmx5IGhhbGZOdW1Db2VmcyBuZWVkIGJlIHN0b3JlZC4KKyAqCisgKiBAcGFyYW0gY29lZnMgaXMgdGhlIHBvbHlwaGFzZSBmaWx0ZXIgYmFuaywgc3RhcnRpbmcgYXQgZnJvbSBwb2x5cGhhc2UgaW5kZXggMCwgYW5kIHJhbmdpbmcgdG8KKyAqIGFuZCBpbmNsdWRpbmcgdGhlICNwb2x5cGhhc2VzLiAgRWFjaCBwb2x5cGhhc2Ugb2YgdGhlIGZpbHRlciBoYXMgaGFsZi1sZW5ndGggaGFsZk51bUNvZWZzCisgKiAoZHVlIHRvIHN5bW1ldHJ5KS4gIFRoZSB0b3RhbCBzaXplIG9mIHRoZSBmaWx0ZXIgYmFuayBpbiBjb2VmZmljaWVudHMgaXMKKyAqICgjcG9seXBoYXNlcysxKSpoYWxmTnVtQ29lZnMuCisgKgorICogVGhlIGZpbHRlciBiYW5rIGNvZWZzIHNob3VsZCBiZSBhbGlnbmVkIHRvIGEgbWluaW11bSBvZiAxNiBieXRlcyAocHJlZmVycmFibHkgdG8gY2FjaGUgbGluZSkuCisgKgorICogVGhlIGNvZWZzIHNob3VsZCBiZSBhdHRlbnVhdGVkICh0byBjb21wZW5zYXRlIGZvciBwYXNzYmFuZCByaXBwbGUpCisgKiBpZiBzdG9yaW5nIGJhY2sgaW50byB0aGUgbmF0aXZlIGZvcm1hdC4KKyAqCisgKiBAcGFyYW0gc2FtcGxlcyBhcmUgdW5hbGlnbmVkIGlucHV0IHNhbXBsZXMuICBUaGUgcG9zaXRpb24gaXMgaW4gdGhlICJtaWRkbGUiIG9mIHRoZQorICogc2FtcGxlIGFycmF5IHdpdGggcmVzcGVjdCB0byB0aGUgRklSIGZpbHRlcjoKKyAqIHRoZSBuZWdhdGl2ZSBoYWxmIG9mIHRoZSBmaWx0ZXIgaXMgZG90IHByb2R1Y3QgZnJvbSBzYW1wbGVzKzEgdG8gc2FtcGxlcytoYWxmTnVtQ29lZnM7CisgKiB0aGUgcG9zaXRpdmUgaGFsZiBvZiB0aGUgZmlsdGVyIGlzIGRvdCBwcm9kdWN0IGZyb20gc2FtcGxlcyB0byBzYW1wbGVzLWhhbGZOdW1Db2VmcysxLgorICoKKyAqIEBwYXJhbSB2b2x1bWVMUiBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdHdvIDMyIGJpdCB2b2x1bWUgdmFsdWVzLCBvbmUgcGVyIHN0ZXJlbyBjaGFubmVsLAorICogZXhwcmVzc2VkIGFzIGEgUzMyIGludGVnZXIuICBBIG5lZ2F0aXZlIHZhbHVlIGludmVydHMgdGhlIGNoYW5uZWwgMTgwIGRlZ3JlZXMuCisgKiBUaGUgcG9pbnRlciB2b2x1bWVMUiBzaG91bGQgYmUgYWxpZ25lZCB0byBhIG1pbmltdW0gb2YgOCBieXRlcy4KKyAqIEEgdHlwaWNhbCB2YWx1ZSBmb3Igdm9sdW1lIGlzIDB4MTAwMCB0byBhbGlnbiB0byBhIHVuaXR5IGdhaW4gb3V0cHV0IG9mIDIwLjEyLgorICoKKyAqIEluIGJldHdlZW4gY2FsbHMgdG8gZmlsdGVyQ29lZmZpY2llbnQsIHRoZSBwaGFzZSBpcyBpbmNyZW1lbnRlZCBieSBwaGFzZUluY3JlbWVudCwgd2hlcmUKKyAqIHBoYXNlSW5jcmVtZW50IGlzIGNhbGN1bGF0ZWQgYXMgaW5wdXRTYW1wbGluZyAqIHBoYXNlV3JhcExpbWl0IC8gb3V0cHV0U2FtcGxpbmcuCisgKgorICogVGhlIGZpbHRlciBwb2x5cGhhc2UgaW5kZXggaXMgZ2l2ZW4gYnkgaW5kZXhQID0gcGhhc2UgPj4gY29lZlNoaWZ0LiBEdWUgdG8KKyAqIG9kZCBsZW5ndGggc3ltbWV0cmljIGZpbHRlciwgdGhlIHBvbHlwaGFzZSBpbmRleCBvZiB0aGUgbmVnYXRpdmUgaGFsZiBkZXBlbmRzIG9uCisgKiB3aGV0aGVyIGludGVycG9sYXRpb24gaXMgdXNlZC4KKyAqCisgKiBUaGUgZnJhY3Rpb25hbCBzaXRpbmcgYmV0d2VlbiB0aGUgcG9seXBoYXNlIGluZGljZXMgaXMgZ2l2ZW4gYnkgdGhlIGJpdHMgYmVsb3cgY29lZlNoaWZ0OgorICoKKyAqIGxlcnBQID0gcGhhc2UgPDwgMzIgLSBjb2VmU2hpZnQgPj4gMTsgIC8vIGZvciAzMiBiaXQgdW5zaWduZWQgcGhhc2UgbXVsdGlwbHkKKyAqIGxlcnBQID0gcGhhc2UgPDwgMzIgLSBjb2VmU2hpZnQgPj4gMTc7IC8vIGZvciAxNiBiaXQgdW5zaWduZWQgcGhhc2UgbXVsdGlwbHkKKyAqCisgKiBGb3IgaW50ZWdlciB0eXBlcywgdGhpcyBpcyBleHByZXNzZWQgYXM6CisgKgorICogbGVycFAgPSBwaGFzZSA8PCBzaXplb2YocGhhc2UpKjggLSBjb2VmU2hpZnQKKyAqICAgICAgICAgICAgICA+PiAoc2l6ZW9mKHBoYXNlKS1zaXplb2YoKmNvZWZzKSkqOCArIDE7CisgKgorICogRm9yIGZsb2F0aW5nIHBvaW50LCBsZXJwUCBpcyB0aGUgZnJhY3Rpb25hbCBwaGFzZSBzY2FsZWQgdG8gWzAuMCwgMS4wKToKKyAqCisgKiBsZXJwUCA9IChwaGFzZSA8PCAzMiAtIGNvZWZTaGlmdCkgLyAoMSA8PCAzMik7IC8vIGZsb2F0aW5nIHBvaW50IGVxdWl2YWxlbnQKKyAqLworCit0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFMsIGJvb2wgTE9DS0VELCBpbnQgU1RSSURFLCB0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgorc3RhdGljIGlubGluZQordm9pZCBmaXIoVE8qIGNvbnN0IG91dCwKKyAgICAgICAgY29uc3QgdWludDMyX3QgcGhhc2UsIGNvbnN0IHVpbnQzMl90IHBoYXNlV3JhcExpbWl0LAorICAgICAgICBjb25zdCBpbnQgY29lZlNoaWZ0LCBjb25zdCBpbnQgaGFsZk51bUNvZWZzLCBjb25zdCBUQyogY29uc3QgY29lZnMsCisgICAgICAgIGNvbnN0IFRJKiBjb25zdCBzYW1wbGVzLCBjb25zdCBUTyogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgLy8gTk9URTogYmUgdmVyeSBjYXJlZnVsIHdoZW4gbW9kaWZ5aW5nIHRoZSBjb2RlIGhlcmUuIHJlZ2lzdGVyCisgICAgLy8gcHJlc3N1cmUgaXMgdmVyeSBoaWdoIGFuZCBhIHNtYWxsIGNoYW5nZSBtaWdodCBjYXVzZSB0aGUgY29tcGlsZXIKKyAgICAvLyB0byBnZW5lcmF0ZSBmYXIgbGVzcyBlZmZpY2llbnQgY29kZS4KKyAgICAvLyBBbHdheXMgc2FuaXR5IGNoZWNrIHRoZSByZXN1bHQgd2l0aCBvYmpkdW1wIG9yIHRlc3QtcmVzYW1wbGUuCisKKyAgICBpZiAoTE9DS0VEKSB7CisgICAgICAgIC8vIGxvY2tlZCBwb2x5cGhhc2UgKG5vIGludGVycG9sYXRpb24pCisgICAgICAgIC8vIENvbXB1dGUgdGhlIHBvbHlwaGFzZSBmaWx0ZXIgaW5kZXggb24gdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBzaWRlLgorICAgICAgICB1aW50MzJfdCBpbmRleFAgPSBwaGFzZSA+PiBjb2VmU2hpZnQ7CisgICAgICAgIHVpbnQzMl90IGluZGV4TiA9IChwaGFzZVdyYXBMaW1pdCAtIHBoYXNlKSA+PiBjb2VmU2hpZnQ7CisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc1AgPSBjb2VmcyArIGluZGV4UCpoYWxmTnVtQ29lZnM7CisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc04gPSBjb2VmcyArIGluZGV4TipoYWxmTnVtQ29lZnM7CisgICAgICAgIGNvbnN0IFRJKiBzUCA9IHNhbXBsZXM7CisgICAgICAgIGNvbnN0IFRJKiBzTiA9IHNhbXBsZXMgKyBDSEFOTkVMUzsKKworICAgICAgICAvLyBkb3QgcHJvZHVjdCBmaWx0ZXIuCisgICAgICAgIFByb2Nlc3NMPENIQU5ORUxTLCBTVFJJREU+KG91dCwKKyAgICAgICAgICAgICAgICBoYWxmTnVtQ29lZnMsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBpbnRlcnBvbGF0ZWQgcG9seXBoYXNlCisgICAgICAgIC8vIENvbXB1dGUgdGhlIHBvbHlwaGFzZSBmaWx0ZXIgaW5kZXggb24gdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBzaWRlLgorICAgICAgICB1aW50MzJfdCBpbmRleFAgPSBwaGFzZSA+PiBjb2VmU2hpZnQ7CisgICAgICAgIHVpbnQzMl90IGluZGV4TiA9IChwaGFzZVdyYXBMaW1pdCAtIHBoYXNlIC0gMSkgPj4gY29lZlNoaWZ0OyAvLyBvbmUncyBjb21wbGVtZW50LgorICAgICAgICBjb25zdCBUQyogY29lZnNQID0gY29lZnMgKyBpbmRleFAqaGFsZk51bUNvZWZzOworICAgICAgICBjb25zdCBUQyogY29lZnNOID0gY29lZnMgKyBpbmRleE4qaGFsZk51bUNvZWZzOworICAgICAgICBjb25zdCBUQyogY29lZnNQMSA9IGNvZWZzUCArIGhhbGZOdW1Db2VmczsKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzTjEgPSBjb2Vmc04gKyBoYWxmTnVtQ29lZnM7CisgICAgICAgIGNvbnN0IFRJKiBzUCA9IHNhbXBsZXM7CisgICAgICAgIGNvbnN0IFRJKiBzTiA9IHNhbXBsZXMgKyBDSEFOTkVMUzsKKworICAgICAgICAvLyBJbnRlcnBvbGF0aW9uIGZyYWN0aW9uIGxlcnBQIGRlcml2ZWQgYnkgc2hpZnRpbmcgYWxsIHRoZSB3YXkgdXAgYW5kIGRvd24KKyAgICAgICAgLy8gdG8gY2xlYXIgdGhlIGFwcHJvcHJpYXRlIGJpdHMgYW5kIGFsaWduIHRvIHRoZSBhcHByb3ByaWF0ZSBsZXZlbAorICAgICAgICAvLyBmb3IgdGhlIGludGVnZXIgbXVsdGlwbHkuICBUaGUgY29uc3RhbnRzIHNob3VsZCByZXNvbHZlIGluIGNvbXBpbGUgdGltZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGludGVycG9sYXRlZCBmaWx0ZXIgY29lZmZpY2llbnQgaXMgZGVyaXZlZCBhcyBmb2xsb3dzIGZvciB0aGUgcG9zL25lZyBoYWxmOgorICAgICAgICAvLworICAgICAgICAvLyBpbnRlcnBvbGF0ZWRbUF0gPSBpbmRleFtQXSpsZXJwUCArIGluZGV4W1ArMV0qKDEtbGVycFApCisgICAgICAgIC8vIGludGVycG9sYXRlZFtOXSA9IGluZGV4W04rMV0qbGVycFAgKyBpbmRleFtOXSooMS1sZXJwUCkKKworICAgICAgICAvLyBvbi10aGUtZmx5IGludGVycG9sYXRlZCBkb3QgcHJvZHVjdCBmaWx0ZXIKKyAgICAgICAgaWYgKGlzX3NhbWU8VEMsIGZsb2F0Pjo6dmFsdWUgfHwgaXNfc2FtZTxUQywgZG91YmxlPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBUQyBzY2FsZSA9IDEuIC8gKDY1NTM2LiAqIDY1NTM2Lik7IC8vIHNjYWxlIHBoYXNlIGJpdHMgdG8gWzAuMCwgMS4wKQorICAgICAgICAgICAgVEMgbGVycFAgPSBUQyhwaGFzZSA8PCAoc2l6ZW9mKHBoYXNlKSo4IC0gY29lZlNoaWZ0KSkgKiBzY2FsZTsKKworICAgICAgICAgICAgUHJvY2VzczxDSEFOTkVMUywgU1RSSURFPihvdXQsCisgICAgICAgICAgICAgICAgICAgIGhhbGZOdW1Db2VmcywgY29lZnNQLCBjb2Vmc04sIGNvZWZzUDEsIGNvZWZzTjEsIHNQLCBzTiwgbGVycFAsIHZvbHVtZUxSKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGxlcnBQID0gcGhhc2UgPDwgKHNpemVvZihwaGFzZSkqOCAtIGNvZWZTaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgPj4gKChzaXplb2YocGhhc2UpLXNpemVvZigqY29lZnMpKSo4ICsgMSk7CisKKyAgICAgICAgICAgIFByb2Nlc3M8Q0hBTk5FTFMsIFNUUklERT4ob3V0LAorICAgICAgICAgICAgICAgICAgICBoYWxmTnVtQ29lZnMsIGNvZWZzUCwgY29lZnNOLCBjb2Vmc1AxLCBjb2Vmc04xLCBzUCwgc04sIGxlcnBQLCB2b2x1bWVMUik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9QUk9DRVNTX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzc05lb24uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3NOZW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxMWNlZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3NOZW9uLmgKQEAgLTAsMCArMSwxMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfUFJPQ0VTU19ORU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX1BST0NFU1NfTkVPTl9ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gZGVwZW5kcyBvbiBBdWRpb1Jlc2FtcGxlckZpck9wcy5oLCBBdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAorCisjaWYgVVNFX05FT04KKy8vCisvLyBORU9OIHNwZWNpYWxpemF0aW9ucyBhcmUgZW5hYmxlZCBmb3IgUHJvY2VzcygpIGFuZCBQcm9jZXNzTCgpCisvLworLy8gVE9ETzogU3RyaWRlIDE2IGFuZCBTdHJpZGUgOCBjYW4gYmUgY29tYmluZWQgd2l0aCBvbmUgcGFzcyBzdHJpZGUgOCAoaWYgbmVjZXNzYXJ5KQorLy8gYW5kIGxvb3Bpbmcgc3RyaWRlIDE2IChvciB2aWNlIHZlcnNhKS4gVGhpcyBoYXMgc29tZSBwb2x5cGhhc2UgY29lZiBkYXRhIGFsaWdubWVudAorLy8gaXNzdWVzIHdpdGggUzE2IGNvZWZzLiBDb25zaWRlciB0aGlzIGxhdGVyLgorCisvLyBNYWNyb3MgdG8gc2F2ZSBhIG1vbm8vc3RlcmVvIGFjY3VtdWxhdG9yIHNhbXBsZSBpbiBxMCAoYW5kIHE0KSBhcyBzdGVyZW8gb3V0LgorI2RlZmluZSBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8gXAorICAgICAgICAidmxkMS5zMzIgICAgICAge2QyfSwgWyVbdkxSXTo2NF0gICAgICAgIFxuIi8qICgxKSBsb2FkIHZvbHVtZXMgKi9cCisgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iLyogKDIpIHVuYWxpZ25lZCBsb2FkIHRoZSBvdXRwdXQgKi9cCisgICAgICAgICJ2cGFkZC5zMzIgICAgICBkMCwgZDAsIGQxICAgICAgICAgICAgICAgXG4iLyogKDEpIGFkZCBhbGwgNCBwYXJ0aWFsIHN1bXMgKi9cCisgICAgICAgICJ2cGFkZC5zMzIgICAgICBkMCwgZDAsIGQwICAgICAgICAgICAgICAgXG4iLyogKDErNGQpIGFuZCByZXBsaWNhdGUgTC9SICovXAorICAgICAgICAidnFyZG11bGguczMyICAgZDAsIGQwLCBkMiAgICAgICAgICAgICAgIFxuIi8qICgyKzNkKSBhcHBseSB2b2x1bWUgKi9cCisgICAgICAgICJ2cWFkZC5zMzIgICAgICBkMywgZDMsIGQwICAgICAgICAgICAgICAgXG4iLyogKDErNGQpIGFjY3VtdWxhdGUgcmVzdWx0IChzYXR1cmF0aW5nKSAqL1wKKyAgICAgICAgInZzdDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIvKiAoMisyZCkgc3RvcmUgcmVzdWx0ICovCisKKyNkZWZpbmUgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8gXAorICAgICAgICAidmxkMS5zMzIgICAgICAge2QyfSwgWyVbdkxSXTo2NF0gICAgICAgIFxuIi8qICgxKSBsb2FkIHZvbHVtZXMqL1wKKyAgICAgICAgInZsZDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIvKiAoMikgdW5hbGlnbmVkIGxvYWQgdGhlIG91dHB1dCovXAorICAgICAgICAidnBhZGQuczMyICAgICAgZDAsIGQwLCBkMSAgICAgICAgICAgICAgIFxuIi8qICgxKSBhZGQgYWxsIDQgcGFydGlhbCBzdW1zIGZyb20gcTAqL1wKKyAgICAgICAgInZwYWRkLnMzMiAgICAgIGQ4LCBkOCwgZDkgICAgICAgICAgICAgICBcbiIvKiAoMSkgYWRkIGFsbCA0IHBhcnRpYWwgc3VtcyBmcm9tIHE0Ki9cCisgICAgICAgICJ2cGFkZC5zMzIgICAgICBkMCwgZDAsIGQ4ICAgICAgICAgICAgICAgXG4iLyogKDErNGQpIGNvbWJpbmUgaW50byBML1IqL1wKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIGQwLCBkMCwgZDIgICAgICAgICAgICAgICBcbiIvKiAoMiszZCkgYXBwbHkgdm9sdW1lKi9cCisgICAgICAgICJ2cWFkZC5zMzIgICAgICBkMywgZDMsIGQwICAgICAgICAgICAgICAgXG4iLyogKDErNGQpIGFjY3VtdWxhdGUgcmVzdWx0IChzYXR1cmF0aW5nKSovXAorICAgICAgICAidnN0MS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIi8qICgyKzJkKXN0b3JlIHJlc3VsdCovCisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzTDwxLCAxNj4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMCAtIGNvbWJpbmVzKykgYWNjdW11bGF0b3IgPSAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMS4xNiAgICAgICAge3EyfSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vICgyKzBkKSBsb2FkIDggMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxM30sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyAoMikgbG9hZCA4IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTEwfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSBzMywgczIsIHMxLCBzMCwgczcsIHM2LCBzNSwgczQKKworICAgICAgICAvLyByZW9yZGVyaW5nIHRoZSB2bWFsIHRvIGRvIGQ2LCBkNyBiZWZvcmUgZDQsIGQ1IGlzIHNsb3dlcig/KQorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTcgICAgICAgICAgICAgIFxuIi8vICgxKzBkKSBtdWx0aXBseSAocmV2ZXJzZWQpc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDUsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZClzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNiwgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgbmVnIHNhbXBsZXMKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNywgZDIxICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgbmVnIHNhbXBsZXMKKworICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGluc3RydWN0aW9ucyBiZWZvcmUgbmVvbiBhYm92ZSBzZWVtcyB0byBiZSBzbG93ZXIKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzggICBcbiIvLyAoMSkgdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIi8vICgwKSBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgIC8vIHNQIHVzZWQgYWZ0ZXIgYnJhbmNoICh3YXJuaW5nKQorICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKKyAgICAgICAgOiBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxOCIsICJxMTAiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3NMPDIsIDE2PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDE2OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgxKSBhY2NfTCA9IDAKKyAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyAoMCBjb21iaW5lcyspIGFjY19SID0gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICBcbiIvLyAoMyswZCkgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICBcbiIvLyAoMykgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBsZWZ0IHBvc2l0aXZlCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKDAgY29tYmluZXMrKSByZXZlcnNlIHJpZ2h0IHBvc2l0aXZlCisKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE3ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNSwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkNiwgZDE3ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIHJpZ2h0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDcsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyByaWdodAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQxMCwgZDIwICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkMTEsIGQyMSAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDEyLCBkMjAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgcmlnaHQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkMTMsIGQyMSAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyByaWdodAorCisgICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gYmVmb3JlIG5lb24gc2VlbXMgdG8gYmUgc2xvd2VyCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzMyICAgICAgICBcbiIvLyAoMCkgbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KKworICAgICAgICA6IFtvdXRdICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtzUF0gIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gIityIiAoc04pCisgICAgICAgIDogW3ZMUl0gInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxNCIsICJxNSIsICJxNiIsCisgICAgICAgICAgInE4IiwgInExMCIKKyAgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3M8MSwgMTY+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICB1aW50MzJfdCBsZXJwUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDE2OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlIFMzMiBRMTUKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMCAtIGNvbWJpbmVzKykgYWNjdW11bGF0b3IgPSAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMS4xNiAgICAgICAge3EyfSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vICgyKzBkKSBsb2FkIDggMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxM30sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyAoMikgbG9hZCA4IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTl9LCBbJVtjb2Vmc1AxXToxMjhdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTEwfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTExfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisKKyAgICAgICAgInZzdWIuczE2ICAgICAgIHE5LCBxOSwgcTggICAgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2c3ViLnMxNiAgICAgICBxMTEsIHExMSwgcTEwICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cworCisgICAgICAgICJ2cXJkbXVsaC5zMTYgICBxOSwgcTksIGQyWzBdICAgICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnFyZG11bGguczE2ICAgcTExLCBxMTEsIGQyWzBdICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDJuZCBzZXQgb2YgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIHMzLCBzMiwgczEsIHMwLCBzNywgczYsIHM1LCBzNAorCisgICAgICAgICJ2YWRkLnMxNiAgICAgICBxOCwgcTgsIHE5ICAgICAgICAgICAgICAgXG4iLy8gKDErMmQpIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAorICAgICAgICAidmFkZC5zMTYgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQKKworICAgICAgICAvLyByZW9yZGVyaW5nIHRoZSB2bWFsIHRvIGRvIGQ2LCBkNyBiZWZvcmUgZDQsIGQ1IGlzIHNsb3dlcig/KQorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTcgICAgICAgICAgICAgIFxuIi8vICgxKzBkKSBtdWx0aXBseSByZXZlcnNlZCBzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNSwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgcmV2ZXJzZWQgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDYsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IG5lZyBzYW1wbGVzCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDcsIGQyMSAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IG5lZyBzYW1wbGVzCisKKyAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBpbnN0cnVjdGlvbnMgYmVmb3JlIG5lb24gYWJvdmUgc2VlbXMgdG8gYmUgc2xvd2VyCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIvLyAoMCkgbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCisgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKKyAgICAgICAgICBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzPDIsIDE2PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgxKSBhY2NfTCA9IDAKKyAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyAoMCBjb21iaW5lcyspIGFjY19SID0gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICBcbiIvLyAoMyswZCkgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICBcbiIvLyAoMykgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxOX0sIFslW2NvZWZzUDFdOjEyOF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMTF9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKworICAgICAgICAidnN1Yi5zMTYgICAgICAgcTksIHE5LCBxOCAgICAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzdWIuczE2ICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMxNiAgIHE5LCBxOSwgZDJbMF0gICAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2cXJkbXVsaC5zMTYgICBxMTEsIHExMSwgZDJbMF0gICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMm5kIHNldCBvZiBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIGxlZnQgcG9zaXRpdmUKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcmlnaHQgcG9zaXRpdmUKKworICAgICAgICAidmFkZC5zMTYgICAgICAgcTgsIHE4LCBxOSAgICAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKKyAgICAgICAgInZhZGQuczE2ICAgICAgIHExMCwgcTEwLCBxMTEgICAgICAgICAgICBcbiIvLyAoMSsxZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0CisKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE3ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgcmV2ZXJzZWQgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDUsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHJldmVyc2VkIHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ2LCBkMTcgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSByZXZlcnNlZCBzYW1wbGVzIHJpZ2h0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDcsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHJldmVyc2VkIHNhbXBsZXMgcmlnaHQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkMTAsIGQyMCAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDExLCBkMjEgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQxMiwgZDIwICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIHJpZ2h0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDEzLCBkMjEgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgcmlnaHQKKworICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGJlZm9yZSBuZW9uIHNlZW1zIHRvIGJlIHNsb3dlcgorICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjOCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMzMiAgICAgICAgXG4iLy8gKDApIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCisKKyAgICAgICAgOiBbb3V0XSAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCisgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAorICAgICAgICAgIFtzUF0gIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gIityIiAoc04pCisgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAorICAgICAgICAgIFt2TFJdICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTQiLCAicTUiLCAicTYiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzTDwxLCAxNj4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTJ9LCBbJVtzUF1dICAgICAgICAgICAgICAgICBcbiIvLyBsb2FkIDggMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxM30sIFslW3NOXV0hICAgICAgICAgICAgICAgIFxuIi8vIGxvYWQgOCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4LCBxOX0sIFslW2NvZWZzUDBdOjEyOF0hICAgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTAsIHExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCBkNCwgIzE1ICAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCBkNSwgIzE1ICAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsIGQ2LCAjMTUgICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsIGQ3LCAjMTUgICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMywgcTEzLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzggICAgICAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKworICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCisgICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2Vzc0w8MiwgMTY+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTUsIHE2fSwgWyVbc05dXSEgICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4LCBxOX0sIFslW2NvZWZzUDBdOjEyOF0hICAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTAsIHExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDQsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCAgZDUsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsICBkMTAsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsICBkMTEsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMywgcTEzLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ2LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ3LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCAgZDEyLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCAgZDEzLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgICAgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMzMiAgICAgICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE0IiwgInE1IiwgInE2IiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCisgICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2VzczwxLCAxNj4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04xLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIHVpbnQzMl90IGxlcnBQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMn0sIFslW3NQXV0gICAgICAgICAgICAgICAgIFxuIi8vIGxvYWQgOCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge3EzfSwgWyVbc05dXSEgICAgICAgICAgICAgICAgXG4iLy8gbG9hZCA4IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTgsIHE5fSwgWyVbY29lZnNQMF06MTI4XSEgICBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMiwgcTEzfSwgWyVbY29lZnNQMV06MTI4XSEgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTAsIHExMX0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTE0LCBxMTV9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTMsIHExMywgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTgsIHE4LCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAidmFkZC5zMzIgICAgICAgcTksIHE5LCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAidmFkZC5zMzIgICAgICAgcTExLCBxMTEsIHExNSAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ0LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ1LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCAgZDYsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCAgZDcsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgICAgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKKyAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAorICAgICAgICAgIFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAorICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3M8MiwgMTY+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICB1aW50MzJfdCBsZXJwUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDE2OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMi4xNiAgICAgICAge3EyLCBxM30sIFslW3NQXV0gICAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTgsIHE5fSwgWyVbY29lZnNQMF06MTI4XSEgICBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMiwgcTEzfSwgWyVbY29lZnNQMV06MTI4XSEgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTAsIHExMX0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTE0LCBxMTV9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTMsIHExMywgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTgsIHE4LCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAidmFkZC5zMzIgICAgICAgcTksIHE5LCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAidmFkZC5zMzIgICAgICAgcTExLCBxMTEsIHExNSAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ0LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ1LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCAgZDEwLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCAgZDExLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNiwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsICBkNywgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgIGQxMiwgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgIGQxMywgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEzLCBxMTMsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjOCAgICAgICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMzIgICAgICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCisgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKKyAgICAgICAgICBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxNCIsICJxNSIsICJxNiIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAorICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3NMPDEsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gODsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMCAtIGNvbWJpbmVzKykgYWNjdW11bGF0b3IgPSAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMS4xNiAgICAgICAge2Q0fSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vICgyKzBkKSBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNn0sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyAoMikgbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDE2fSwgWyVbY29lZnNQMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDIwfSwgWyVbY29lZnNOMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZWQgczMsIHMyLCBzMSwgczAsIHM3LCBzNiwgczUsIHM0CisKKyAgICAgICAgLy8gcmVvcmRlcmluZyB0aGUgdm1hbCB0byBkbyBkNiwgZDcgYmVmb3JlIGQ0LCBkNSBpcyBzbG93ZXIoPykKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKXNhbXBsZXMgYnkgY29lZgorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ2LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBuZWcgc2FtcGxlcworCisgICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBuZW9uIGFib3ZlIHNlZW1zIHRvIGJlIHNsb3dlcgorICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICM4ICAgICAgICAgXG4iLy8gKDApIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTgiLCAicTEwIgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzTDwyLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDg7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDEpIGFjY19MID0gMAorICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIi8vICgwIGNvbWJpbmVzKykgYWNjX1IgPSAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMi4xNiAgICAgICAge2Q0LCBkNX0sIFslW3NQXV0gICAgICAgIFxuIi8vICgyKzBkKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge2Q2LCBkN30sIFslW3NOXV0hICAgICAgIFxuIi8vICgyKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QxNn0sIFslW2NvZWZzUDBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMH0sIFslW2NvZWZzTjBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIGxlZnQgcG9zaXRpdmUKKworICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ1LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgcmlnaHQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNiwgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDcsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgcmlnaHQKKworICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGJlZm9yZSBuZW9uIHNlZW1zIHRvIGJlIHNsb3dlcgorICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iLy8gKDApIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCisKKyAgICAgICAgOiBbb3V0XSAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbc1BdICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICIrciIgKHNOKQorICAgICAgICA6IFt2TFJdICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTQiLCAicTUiLCAicTYiLAorICAgICAgICAgICJxOCIsICJxMTAiCisgICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzPDEsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICB1aW50MzJfdCBsZXJwUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDg7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UgUzMyIFExNQorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgwIC0gY29tYmluZXMrKSBhY2N1bXVsYXRvciA9IDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDR9LCBbJVtzUF1dICAgICAgICAgICAgXG4iLy8gKDIrMGQpIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge2Q2fSwgWyVbc05dXSEgICAgICAgICAgIFxuIi8vICgyKSBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTZ9LCBbJVtjb2Vmc1AwXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTd9LCBbJVtjb2Vmc1AxXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjB9LCBbJVtjb2Vmc04xXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjF9LCBbJVtjb2Vmc04wXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKworICAgICAgICAidnN1Yi5zMTYgICAgICAgZDE3LCBkMTcsIGQxNiAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzdWIuczE2ICAgICAgIGQyMSwgZDIxLCBkMjAgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMxNiAgIGQxNywgZDE3LCBkMlswXSAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2cXJkbXVsaC5zMTYgICBkMjEsIGQyMSwgZDJbMF0gICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMm5kIHNldCBvZiBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgczMsIHMyLCBzMSwgczAsIHM3LCBzNiwgczUsIHM0CisKKyAgICAgICAgInZhZGQuczE2ICAgICAgIGQxNiwgZDE2LCBkMTcgICAgICAgICAgICBcbiIvLyAoMSsyZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0CisgICAgICAgICJ2YWRkLnMxNiAgICAgICBkMjAsIGQyMCwgZDIxICAgICAgICAgICAgXG4iLy8gKDErMWQpIGludGVycG9sYXRlIChzdGVwMykgMm5kIHNldAorCisgICAgICAgIC8vIHJlb3JkZXJpbmcgdGhlIHZtYWwgdG8gZG8gZDYsIGQ3IGJlZm9yZSBkNCwgZDUgaXMgc2xvd2VyKD8pCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDErMGQpIG11bHRpcGx5IChyZXZlcnNlZClieSBjb2VmCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDYsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IG5lZyBzYW1wbGVzCisKKyAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBpbnN0cnVjdGlvbnMgYmVmb3JlIG5lb24gYWJvdmUgc2VlbXMgdG8gYmUgc2xvd2VyCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzggICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAorICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKKyAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKKyAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCisgICAgICAgICAgW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2VzczwyLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSA4OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDEpIGFjY19MID0gMAorICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIi8vICgwIGNvbWJpbmVzKykgYWNjX1IgPSAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMi4xNiAgICAgICAge2Q0LCBkNX0sIFslW3NQXV0gICAgICAgIFxuIi8vICgzKzBkKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge2Q2LCBkN30sIFslW3NOXV0hICAgICAgIFxuIi8vICgzKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QxNn0sIFslW2NvZWZzUDBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QxN30sIFslW2NvZWZzUDFdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMH0sIFslW2NvZWZzTjFdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMX0sIFslW2NvZWZzTjBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorCisgICAgICAgICJ2c3ViLnMxNiAgICAgICBkMTcsIGQxNywgZDE2ICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnN1Yi5zMTYgICAgICAgZDIxLCBkMjEsIGQyMCAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKKworICAgICAgICAidnFyZG11bGguczE2ICAgZDE3LCBkMTcsIGQyWzBdICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZxcmRtdWxoLnMxNiAgIGQyMSwgZDIxLCBkMlswXSAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAybmQgc2V0IG9mIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgbGVmdCBwb3NpdGl2ZQorCisgICAgICAgICJ2YWRkLnMxNiAgICAgICBkMTYsIGQxNiwgZDE3ICAgICAgICAgICAgXG4iLy8gKDErMWQpIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAorICAgICAgICAidmFkZC5zMTYgICAgICAgZDIwLCBkMjAsIGQyMSAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQKKworICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ1LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgcmlnaHQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNiwgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDcsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgcmlnaHQKKworICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGJlZm9yZSBuZW9uIHNlZW1zIHRvIGJlIHNsb3dlcgorICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KKworICAgICAgICA6IFtvdXRdICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKKyAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCisgICAgICAgICAgW3NQXSAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAiK3IiIChzTikKKyAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCisgICAgICAgICAgW3ZMUl0gInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxNCIsICJxNSIsICJxNiIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3NMPDEsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gODsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNH0sIFslW3NQXV0gICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNn0sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICBcbiIvLyAoc3RhbGwpIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE0ICAgICAgICAgICAgICBcbiIvLyAoc3RhbGwpIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICM4ICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KKworICAgICAgICA6IFtvdXRdICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtzUF0gIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gIityIiAoc04pCisgICAgICAgIDogW3ZMUl0gInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKKyAgICAgICAgICAicTEyIiwgInExNCIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2Vzc0w8MiwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSA4OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDQsIGQ1fSwgWyVbc1BdXSAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNiwgZDd9LCBbJVtzTl1dISAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCBkNCwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgZDUsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsIGQ3LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNCAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJxNCIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAorICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3M8MSwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04xLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIHVpbnQzMl90IGxlcnBQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gODsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMS4xNiAgICAgICAge2Q0fSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge2Q2fSwgWyVbc05dXSEgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTl9LCBbJVtjb2Vmc1AxXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzdWIuczMyICAgICAgIHE5LCBxOSwgcTggICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzdWIuczMyICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHE5LCBxOSwgZDJbMF0gICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMSwgcTExLCBkMlswXSAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpIDJuZCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE4LCBxOCwgcTkgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMCwgcTEwLCBxMTEgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDQpIDJuZCBzZXQKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICM4ICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAorICAgICAgICAgIFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAorICAgICAgICAgICJxMTIiLCAicTE0IgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUKK3ZvaWQgUHJvY2VzczwyLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSA4OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKyAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDQsIGQ1fSwgWyVbc1BdXSAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNiwgZDd9LCBbJVtzTl1dISAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTl9LCBbJVtjb2Vmc1AxXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAocmV2ZXJzZWQpIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzdWIuczMyICAgICAgIHE5LCBxOSwgcTggICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzdWIuczMyICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsIGQ1LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxOSwgcTksIGQyWzBdICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTEsIHExMSwgZDJbMV0gICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsIGQ2LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCBkNywgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTgsIHE4LCBxOSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwNCkgMm5kIHNldAorCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExNSAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKKyAgICAgICAgICBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKKyAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgorICAgICk7Cit9CisKKyNlbmRpZiAvL1VTRV9ORU9OCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9QUk9DRVNTX05FT05fSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCmluZGV4IDIwN2YyNmIuLmQwM2U1NzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvUmVzYW1wbGVyU2luYyIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2RlZmluZSBfX1NURENfQ09OU1RBTlRfTUFDUk9TCiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0yNiw2ICsyNyw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KIAogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyU2luYy5oIgogCkBAIC0zNywxMiArMzksMTQgQEAKICNkZWZpbmUgVVNFX0lOTElORV9BU1NFTUJMWSAoZmFsc2UpCiAjZW5kaWYKIAotI2lmIFVTRV9JTkxJTkVfQVNTRU1CTFkgJiYgZGVmaW5lZChfX0FSTV9ORU9OX18pCi0jZGVmaW5lIFVTRV9ORU9OICh0cnVlKQorI2lmIGRlZmluZWQoX19hYXJjaDY0X18pIHx8IGRlZmluZWQoX19BUk1fTkVPTl9fKQorI2luY2x1ZGUgPGFybV9uZW9uLmg+CisjZGVmaW5lIFVTRV9ORU9OCiAjZWxzZQotI2RlZmluZSBVU0VfTkVPTiAoZmFsc2UpCisjdW5kZWYgVVNFX05FT04KICNlbmRpZgogCisjZGVmaW5lIFVOVVNFRCh4KSAoKHZvaWQpKHgpKQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NDksOSArNDUzLDkgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1BdWRpb1Jlc2FtcGxlclNpbmM6OkF1ZGlvUmVzYW1wbGVyU2luYyhpbnQgYml0RGVwdGgsCitBdWRpb1Jlc2FtcGxlclNpbmM6OkF1ZGlvUmVzYW1wbGVyU2luYygKICAgICAgICAgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpCi0gICAgOiBBdWRpb1Jlc2FtcGxlcihiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIHF1YWxpdHkpLAorICAgIDogQXVkaW9SZXNhbXBsZXIoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIHF1YWxpdHkpLAogICAgIG1TdGF0ZSgwKSwgbUltcHVsc2UoMCksIG1SaW5nRnVsbCgwKSwgbUZpckNvZWZzKDApCiB7CiAgICAgLyoKQEAgLTQ5NywxMCArNTAxLDEyIEBACiAgICAgbVJpbmdGdWxsID0gbUltcHVsc2UgKyAobnVtQ29lZnMrMSkqbUNoYW5uZWxDb3VudDsKIH0KIAotdm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OnNldFZvbHVtZShpbnQxNl90IGxlZnQsIGludDE2X3QgcmlnaHQpIHsKK3ZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKICAgICBBdWRpb1Jlc2FtcGxlcjo6c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKLSAgICBtVm9sdW1lU0lNRFswXSA9IGludDMyX3QobGVmdCk8PDE2OwotICAgIG1Wb2x1bWVTSU1EWzFdID0gaW50MzJfdChyaWdodCk8PDE2OworICAgIC8vIGNvbnZlcnQgdG8gVTRfMjggKHJvdW5kaW5nIGRvd24pLgorICAgIC8vIGludGVnZXIgdm9sdW1lIHZhbHVlcyBhcmUgY2xhbXBlZCB0byAwIHRvIFVOSVRZX0dBSU4uCisgICAgbVZvbHVtZVNJTURbMF0gPSB1NF8yOF9mcm9tX2Zsb2F0KGNsYW1wRmxvYXRWb2wobGVmdCkpOworICAgIG1Wb2x1bWVTSU1EWzFdID0gdTRfMjhfZnJvbV9mbG9hdChjbGFtcEZsb2F0Vm9sKHJpZ2h0KSk7CiB9CiAKIHZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LApAQCAtNTQwLDcgKzU0Niw3IEBACiAgICAgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CiAgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKICAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsKLSAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKG91dEZyYW1lQ291bnQqbUluU2FtcGxlUmF0ZSkvbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IGdldEluRnJhbWVDb3VudFJlcXVpcmVkKG91dEZyYW1lQ291bnQpOwogCiAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgb3V0cHV0U2FtcGxlQ291bnQpIHsKICAgICAgICAgLy8gYnVmZmVyIGlzIGVtcHR5LCBmZXRjaCBhIG5ldyBvbmUKQEAgLTYzNCw4ICs2NDAsOCBAQAogfQogCiB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+Ci12b2lkIEF1ZGlvUmVzYW1wbGVyU2luYzo6ZmlsdGVyQ29lZmZpY2llbnQoCi0gICAgICAgIGludDMyX3QqIG91dCwgdWludDMyX3QgcGhhc2UsIGNvbnN0IGludDE2X3QgKnNhbXBsZXMsIHVpbnQzMl90IHZSTCkKK3ZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpmaWx0ZXJDb2VmZmljaWVudChpbnQzMl90KiBvdXQsIHVpbnQzMl90IHBoYXNlLAorICAgICAgICAgY29uc3QgaW50MTZfdCAqc2FtcGxlcywgdWludDMyX3QgdlJMKQogewogICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgogICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCkBAIC02NjIsMTYwICs2NjgsMTcxIEBACiAKICAgICBzaXplX3QgY291bnQgPSBvZmZzZXQ7CiAKLSAgICBpZiAoIVVTRV9ORU9OKSB7Ci0gICAgICAgIGludDMyX3QgbCA9IDA7Ci0gICAgICAgIGludDMyX3QgciA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgIGludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2Vmc1ArKywgb2Zmc2V0LCBsZXJwUCwgc1ApOwotICAgICAgICAgICAgc1AgLT0gQ0hBTk5FTFM7Ci0gICAgICAgICAgICBpbnRlcnBvbGF0ZTxDSEFOTkVMUz4obCwgciwgY29lZnNOKyssIG9mZnNldCwgbGVycE4sIHNOKTsKLSAgICAgICAgICAgIHNOICs9IENIQU5ORUxTOwotICAgICAgICB9Ci0gICAgICAgIG91dFswXSArPSAyICogbXVsUkwoMSwgbCwgdlJMKTsKLSAgICAgICAgb3V0WzFdICs9IDIgKiBtdWxSTCgwLCByLCB2UkwpOwotICAgIH0gZWxzZSBpZiAoQ0hBTk5FTFMgPT0gMSkgeworI2lmbmRlZiBVU0VfTkVPTgorICAgIGludDMyX3QgbCA9IDA7CisgICAgaW50MzJfdCByID0gMDsKKyAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CisgICAgICAgIGludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2Vmc1ArKywgb2Zmc2V0LCBsZXJwUCwgc1ApOworICAgICAgICBzUCAtPSBDSEFOTkVMUzsKKyAgICAgICAgaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzTisrLCBvZmZzZXQsIGxlcnBOLCBzTik7CisgICAgICAgIHNOICs9IENIQU5ORUxTOworICAgIH0KKyAgICBvdXRbMF0gKz0gMiAqIG11bFJMKDEsIGwsIHZSTCk7CisgICAgb3V0WzFdICs9IDIgKiBtdWxSTCgwLCByLCB2UkwpOworI2Vsc2UKKyAgICBVTlVTRUQodlJMKTsKKyAgICBpZiAoQ0hBTk5FTFMgPT0gMSkgewogICAgICAgICBpbnQzMl90IGNvbnN0KiBjb2Vmc1AxID0gY29lZnNQICsgb2Zmc2V0OwogICAgICAgICBpbnQzMl90IGNvbnN0KiBjb2Vmc04xID0gY29lZnNOICsgb2Zmc2V0OwogICAgICAgICBzUCAtPSBDSEFOTkVMUyozOwotICAgICAgICBhc20gKAotICAgICAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIgICAgLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKLSAgICAgICAgICAgICJ2bW92LjMyICAgICAgICBkMlsxXSwgJVtsZXJwTl0gICAgICAgICAgXG4iICAgIC8vIGxvYWQgdGhlIG5lZ2F0aXZlIHBoYXNlCi0gICAgICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIiAgICAvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAotICAgICAgICAgICAgInZzaGwuczMyICAgICAgIGQyLCBkMiwgIzE2ICAgICAgICAgICAgICBcbiIgICAgLy8gY29udmVydCB0byAzMiBiaXRzCiAKLSAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgICAgICAgICAidmxkMS4xNiAgICAgICAgeyBkNH0sIFslW3NQXV0gICAgICAgICAgIFxuIiAgICAvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHsgcTh9LCBbJVtjb2Vmc1AwXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLSAgICAgICAgICAgICJ2bGQxLjMyICAgICAgICB7IHE5fSwgWyVbY29lZnNQMV06MTI4XSEgXG4iICAgIC8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCi0gICAgICAgICAgICAidmxkMS4xNiAgICAgICAgeyBkNn0sIFslW3NOXV0hICAgICAgICAgIFxuIiAgICAvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLSAgICAgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTExfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iICAgIC8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisgICAgICAgIGludDMyeDRfdCBzdW07CisgICAgICAgIGludDMyeDJfdCBsZXJwUE47CisgICAgICAgIGxlcnBQTiA9IHZkdXBfbl9zMzIoMCk7CisgICAgICAgIGxlcnBQTiA9IHZsZDFfbGFuZV9zMzIoKGludDMyX3QgKikmbGVycFAsIGxlcnBQTiwgMCk7CisgICAgICAgIGxlcnBQTiA9IHZsZDFfbGFuZV9zMzIoKGludDMyX3QgKikmbGVycE4sIGxlcnBQTiwgMSk7CisgICAgICAgIGxlcnBQTiA9IHZzaGxfbl9zMzIobGVycFBOLCAxNik7CisgICAgICAgIHN1bSA9IHZkdXBxX25fczMyKDApOwogCi0gICAgICAgICAgICAidnJldjY0LjE2ICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIiAgICAvLyByZXZlcnNlIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisgICAgICAgIGludDE2eDRfdCBzYW1wbGVQLCBzYW1wbGVOOworICAgICAgICBpbnQzMng0X3Qgc2FtcGxlUEV4dCwgc2FtcGxlTkV4dDsKKyAgICAgICAgaW50MzJ4NF90IGNvZWZzUFYwLCBjb2Vmc1BWMSwgY29lZnNOVjAsIGNvZWZzTlYxOwogCi0gICAgICAgICAgICAidnN1Yi5zMzIgICAgICAgIHE5LCAgcTksICBxOCAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTEsIHExMSwgcTEwICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cwotICAgICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ0LCAjMTUgICAgICAgICAgICBcbiIgICAgLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICBjb2Vmc1AgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzUCwgMTYpOworICAgICAgICBjb2Vmc04gPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTiwgMTYpOworICAgICAgICBjb2Vmc1AxID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc1AxLCAxNik7CisgICAgICAgIGNvZWZzTjEgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTjEsIDE2KTsKKyAgICAgICAgZm9yICg7IGNvdW50ID4gMDsgY291bnQgLT0gNCkgeworICAgICAgICAgICAgc2FtcGxlUCA9IHZsZDFfczE2KHNQKTsKKyAgICAgICAgICAgIHNhbXBsZU4gPSB2bGQxX3MxNihzTik7CisgICAgICAgICAgICBjb2Vmc1BWMCA9IHZsZDFxX3MzMihjb2Vmc1ApOworICAgICAgICAgICAgY29lZnNOVjAgPSB2bGQxcV9zMzIoY29lZnNOKTsKKyAgICAgICAgICAgIGNvZWZzUFYxID0gdmxkMXFfczMyKGNvZWZzUDEpOworICAgICAgICAgICAgY29lZnNOVjEgPSB2bGQxcV9zMzIoY29lZnNOMSk7CisgICAgICAgICAgICBzUCAtPSA0OworICAgICAgICAgICAgc04gKz0gNDsKKyAgICAgICAgICAgIGNvZWZzUCArPSA0OworICAgICAgICAgICAgY29lZnNOICs9IDQ7CisgICAgICAgICAgICBjb2Vmc1AxICs9IDQ7CisgICAgICAgICAgICBjb2Vmc04xICs9IDQ7CiAKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICAgcTksICBxOSwgZDJbMF0gICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMSwgcTExLCBkMlsxXSAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0IG9mIGNvZWZzCi0gICAgICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCAgZDYsICMxNSAgICAgICAgICAgIFxuIiAgICAvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICAgICBzYW1wbGVQID0gdnJldjY0X3MxNihzYW1wbGVQKTsKIAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgICBxOCwgIHE4LCAgcTkgICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0Ci0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDQpIDJuZCBzZXQKLSAgICAgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iICAgIC8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgICAgIC8vIGludGVycG9sYXRlIChzdGVwMSkKKyAgICAgICAgICAgIGNvZWZzUFYxID0gdnN1YnFfczMyKGNvZWZzUFYxLCBjb2Vmc1BWMCk7CisgICAgICAgICAgICBjb2Vmc05WMSA9IHZzdWJxX3MzMihjb2Vmc05WMSwgY29lZnNOVjApOworICAgICAgICAgICAgc2FtcGxlUEV4dCA9IHZzaGxsX25fczE2KHNhbXBsZVAsIDE1KTsKKyAgICAgICAgICAgIC8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgICAgIGNvZWZzUFYxID0gdnFyZG11bGhxX2xhbmVfczMyKGNvZWZzUFYxLCBsZXJwUE4sIDApOworICAgICAgICAgICAgY29lZnNOVjEgPSB2cXJkbXVsaHFfbGFuZV9zMzIoY29lZnNOVjEsIGxlcnBQTiwgMSk7CisgICAgICAgICAgICBzYW1wbGVORXh0ID0gdnNobGxfbl9zMTYoc2FtcGxlTiwgMTUpOworICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAgICAgY29lZnNQVjAgPSB2YWRkcV9zMzIoY29lZnNQVjAsIGNvZWZzUFYxKTsKKyAgICAgICAgICAgIGNvZWZzTlYwID0gdmFkZHFfczMyKGNvZWZzTlYwLCBjb2Vmc05WMSk7CiAKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iICAgIC8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iICAgIC8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICM4ICAgICAgICAgXG4iICAgIC8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisgICAgICAgICAgICBzYW1wbGVQRXh0ID0gdnFyZG11bGhxX3MzMihzYW1wbGVQRXh0LCBjb2Vmc1BWMCk7CisgICAgICAgICAgICBzYW1wbGVORXh0ID0gdnFyZG11bGhxX3MzMihzYW1wbGVORXh0LCBjb2Vmc05WMCk7CisgICAgICAgICAgICBzdW0gPSB2YWRkcV9zMzIoc3VtLCBzYW1wbGVQRXh0KTsKKyAgICAgICAgICAgIHN1bSA9IHZhZGRxX3MzMihzdW0sIHNhbXBsZU5FeHQpOworICAgICAgICB9CisgICAgICAgIGludDMyeDJfdCB2b2x1bWVzViwgb3V0VjsKKyAgICAgICAgdm9sdW1lc1YgPSB2bGQxX3MzMihtVm9sdW1lU0lNRCk7CisgICAgICAgIG91dFYgPSB2bGQxX3MzMihvdXQpOwogCi0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgIFxuIiAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE0ICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgLy9hZGQgYWxsIDQgcGFydGlhbCBzdW1zCisgICAgICAgIGludDMyeDJfdCBzdW1Mb3csIHN1bUhpZ2g7CisgICAgICAgIHN1bUxvdyA9IHZnZXRfbG93X3MzMihzdW0pOworICAgICAgICBzdW1IaWdoID0gdmdldF9oaWdoX3MzMihzdW0pOworICAgICAgICBzdW1Mb3cgPSB2cGFkZF9zMzIoc3VtTG93LCBzdW1IaWdoKTsKKyAgICAgICAgc3VtTG93ID0gdnBhZGRfczMyKHN1bUxvdywgc3VtTG93KTsKIAotICAgICAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIgICAgLy8gbG9vcAotCi0gICAgICAgICAgICAidmxkMS5zMzIgICAgICAge2QyfSwgWyVbdkxSXV0gICAgICAgICAgIFxuIiAgICAvLyBsb2FkIHZvbHVtZXMKLSAgICAgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iICAgIC8vIGxvYWQgdGhlIG91dHB1dAotICAgICAgICAgICAgInZwYWRkLnMzMiAgICAgIGQwLCBkMCwgZDEgICAgICAgICAgICAgICBcbiIgICAgLy8gYWRkIGFsbCA0IHBhcnRpYWwgc3VtcwotICAgICAgICAgICAgInZwYWRkLnMzMiAgICAgIGQwLCBkMCwgZDAgICAgICAgICAgICAgICBcbiIgICAgLy8gdG9nZXRoZXIKLSAgICAgICAgICAgICJ2ZHVwLmkzMiAgICAgICBkMCwgZDBbMF0gICAgICAgICAgICAgICAgXG4iICAgIC8vIGludGVybGVhdmUgTCxSIGNoYW5uZWxzCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgZDAsIGQwLCBkMiAgICAgICAgICAgICAgIFxuIiAgICAvLyBhcHBseSB2b2x1bWUKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBkMywgZDMsIGQwICAgICAgICAgICAgICAgXG4iICAgIC8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICAgICAidnN0MS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIiAgICAvLyBzdG9yZSByZXN1bHQKLQotICAgICAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCi0gICAgICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCi0gICAgICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAotICAgICAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCi0gICAgICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAotICAgICAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCi0gICAgICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCi0gICAgICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKLSAgICAgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAotICAgICAgICAgICAgICBbbGVycE5dICAgInIiIChsZXJwTiksCi0gICAgICAgICAgICAgIFt2TFJdICAgICAiciIgKG1Wb2x1bWVTSU1EKQotICAgICAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKLSAgICAgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKLSAgICAgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAotICAgICAgICAgICAgICAicTEyIiwgInExNCIKLSAgICAgICAgKTsKKyAgICAgICAgc3VtTG93ID0gdnFyZG11bGhfczMyKHN1bUxvdywgdm9sdW1lc1YpOworICAgICAgICBvdXRWID0gdmFkZF9zMzIob3V0Viwgc3VtTG93KTsKKyAgICAgICAgdnN0MV9zMzIob3V0LCBvdXRWKTsKICAgICB9IGVsc2UgaWYgKENIQU5ORUxTID09IDIpIHsKICAgICAgICAgaW50MzJfdCBjb25zdCogY29lZnNQMSA9IGNvZWZzUCArIG9mZnNldDsKICAgICAgICAgaW50MzJfdCBjb25zdCogY29lZnNOMSA9IGNvZWZzTiArIG9mZnNldDsKICAgICAgICAgc1AgLT0gQ0hBTk5FTFMqMzsKLSAgICAgICAgYXNtICgKLSAgICAgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iICAgIC8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCi0gICAgICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMV0sICVbbGVycE5dICAgICAgICAgIFxuIiAgICAvLyBsb2FkIHRoZSBuZWdhdGl2ZSBwaGFzZQotICAgICAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIgICAgLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKLSAgICAgICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgXG4iICAgIC8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCi0gICAgICAgICAgICAidnNobC5zMzIgICAgICAgZDIsIGQyLCAjMTYgICAgICAgICAgICAgIFxuIiAgICAvLyBjb252ZXJ0IHRvIDMyIGJpdHMKIAotICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDQsZDV9LCBbJVtzUF1dICAgICAgICAgXG4iICAgIC8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAgeyBxOH0sIFslW2NvZWZzUDBdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHsgcTl9LCBbJVtjb2Vmc1AxXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDYsZDd9LCBbJVtzTl1dISAgICAgICAgXG4iICAgIC8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTF9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgaW50MzJ4NF90IHN1bTAsIHN1bTE7CisgICAgICAgIGludDMyeDJfdCBsZXJwUE47CiAKLSAgICAgICAgICAgICJ2cmV2NjQuMTYgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iICAgIC8vIHJldmVyc2UgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKLSAgICAgICAgICAgICJ2cmV2NjQuMTYgICAgICBkNSwgZDUgICAgICAgICAgICAgICAgICAgXG4iICAgIC8vIHJldmVyc2UgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKyAgICAgICAgbGVycFBOID0gdmR1cF9uX3MzMigwKTsKKyAgICAgICAgbGVycFBOID0gdmxkMV9sYW5lX3MzMigoaW50MzJfdCAqKSZsZXJwUCwgbGVycFBOLCAwKTsKKyAgICAgICAgbGVycFBOID0gdmxkMV9sYW5lX3MzMigoaW50MzJfdCAqKSZsZXJwTiwgbGVycFBOLCAxKTsKKyAgICAgICAgbGVycFBOID0gdnNobF9uX3MzMihsZXJwUE4sIDE2KTsKKyAgICAgICAgc3VtMCA9IHZkdXBxX25fczMyKDApOworICAgICAgICBzdW0xID0gdmR1cHFfbl9zMzIoMCk7CiAKLSAgICAgICAgICAgICJ2c3ViLnMzMiAgICAgICAgcTksICBxOSwgIHE4ICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAgICAgInZzdWIuczMyICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCi0gICAgICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDQsICMxNSAgICAgICAgICAgIFxuIiAgICAvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0gICAgICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCAgZDUsICMxNSAgICAgICAgICAgIFxuIiAgICAvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgIGludDE2eDR4Ml90IHNhbXBsZVAsIHNhbXBsZU47CisgICAgICAgIGludDMyeDR4Ml90IHNhbXBsZVBFeHQsIHNhbXBsZU5FeHQ7CisgICAgICAgIGludDMyeDRfdCBjb2Vmc1BWMCwgY29lZnNQVjEsIGNvZWZzTlYwLCBjb2Vmc05WMTsKIAotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgICBxOSwgIHE5LCBkMlswXSAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgcTExLCBxMTEsIGQyWzFdICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQgb2YgY29lZnMKLSAgICAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsICBkNiwgIzE1ICAgICAgICAgICAgXG4iICAgIC8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLSAgICAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsICBkNywgIzE1ICAgICAgICAgICAgXG4iICAgIC8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgY29lZnNQID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc1AsIDE2KTsKKyAgICAgICAgY29lZnNOID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc04sIDE2KTsKKyAgICAgICAgY29lZnNQMSA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNQMSwgMTYpOworICAgICAgICBjb2Vmc04xID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc04xLCAxNik7CisgICAgICAgIGZvciAoOyBjb3VudCA+IDA7IGNvdW50IC09IDQpIHsKKyAgICAgICAgICAgIHNhbXBsZVAgPSB2bGQyX3MxNihzUCk7CisgICAgICAgICAgICBzYW1wbGVOID0gdmxkMl9zMTYoc04pOworICAgICAgICAgICAgY29lZnNQVjAgPSB2bGQxcV9zMzIoY29lZnNQKTsKKyAgICAgICAgICAgIGNvZWZzTlYwID0gdmxkMXFfczMyKGNvZWZzTik7CisgICAgICAgICAgICBjb2Vmc1BWMSA9IHZsZDFxX3MzMihjb2Vmc1AxKTsKKyAgICAgICAgICAgIGNvZWZzTlYxID0gdmxkMXFfczMyKGNvZWZzTjEpOworICAgICAgICAgICAgc1AgLT0gODsKKyAgICAgICAgICAgIHNOICs9IDg7CisgICAgICAgICAgICBjb2Vmc1AgKz0gNDsKKyAgICAgICAgICAgIGNvZWZzTiArPSA0OworICAgICAgICAgICAgY29lZnNQMSArPSA0OworICAgICAgICAgICAgY29lZnNOMSArPSA0OwogCi0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgIHE4LCAgcTgsICBxOSAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTAsIHExMCwgcTExICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwNCkgMm5kIHNldAotICAgICAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIgICAgLy8gdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAgICAgc2FtcGxlUC52YWxbMF0gPSB2cmV2NjRfczE2KHNhbXBsZVAudmFsWzBdKTsKKyAgICAgICAgICAgIHNhbXBsZVAudmFsWzFdID0gdnJldjY0X3MxNihzYW1wbGVQLnZhbFsxXSk7CiAKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iICAgIC8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgXG4iICAgIC8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iICAgIC8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTEwICAgICAgICAgICAgXG4iICAgIC8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iICAgIC8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisgICAgICAgICAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICAgICBjb2Vmc1BWMSA9IHZzdWJxX3MzMihjb2Vmc1BWMSwgY29lZnNQVjApOworICAgICAgICAgICAgY29lZnNOVjEgPSB2c3VicV9zMzIoY29lZnNOVjEsIGNvZWZzTlYwKTsKKyAgICAgICAgICAgIHNhbXBsZVBFeHQudmFsWzBdID0gdnNobGxfbl9zMTYoc2FtcGxlUC52YWxbMF0sIDE1KTsKKyAgICAgICAgICAgIHNhbXBsZVBFeHQudmFsWzFdID0gdnNobGxfbl9zMTYoc2FtcGxlUC52YWxbMV0sIDE1KTsKKyAgICAgICAgICAgIC8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgICAgIGNvZWZzUFYxID0gdnFyZG11bGhxX2xhbmVfczMyKGNvZWZzUFYxLCBsZXJwUE4sIDApOworICAgICAgICAgICAgY29lZnNOVjEgPSB2cXJkbXVsaHFfbGFuZV9zMzIoY29lZnNOVjEsIGxlcnBQTiwgMSk7CisgICAgICAgICAgICBzYW1wbGVORXh0LnZhbFswXSA9IHZzaGxsX25fczE2KHNhbXBsZU4udmFsWzBdLCAxNSk7CisgICAgICAgICAgICBzYW1wbGVORXh0LnZhbFsxXSA9IHZzaGxsX25fczE2KHNhbXBsZU4udmFsWzFdLCAxNSk7CisgICAgICAgICAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCisgICAgICAgICAgICBjb2Vmc1BWMCA9IHZhZGRxX3MzMihjb2Vmc1BWMCwgY29lZnNQVjEpOworICAgICAgICAgICAgY29lZnNOVjAgPSB2YWRkcV9zMzIoY29lZnNOVjAsIGNvZWZzTlYxKTsKIAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMyAgICAgICAgICAgICAgXG4iICAgIC8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIiAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgICAgIHNhbXBsZVBFeHQudmFsWzBdID0gdnFyZG11bGhxX3MzMihzYW1wbGVQRXh0LnZhbFswXSwgY29lZnNQVjApOworICAgICAgICAgICAgc2FtcGxlUEV4dC52YWxbMV0gPSB2cXJkbXVsaHFfczMyKHNhbXBsZVBFeHQudmFsWzFdLCBjb2Vmc1BWMCk7CisgICAgICAgICAgICBzYW1wbGVORXh0LnZhbFswXSA9IHZxcmRtdWxocV9zMzIoc2FtcGxlTkV4dC52YWxbMF0sIGNvZWZzTlYwKTsKKyAgICAgICAgICAgIHNhbXBsZU5FeHQudmFsWzFdID0gdnFyZG11bGhxX3MzMihzYW1wbGVORXh0LnZhbFsxXSwgY29lZnNOVjApOworICAgICAgICAgICAgc3VtMCA9IHZhZGRxX3MzMihzdW0wLCBzYW1wbGVQRXh0LnZhbFswXSk7CisgICAgICAgICAgICBzdW0xID0gdmFkZHFfczMyKHN1bTEsIHNhbXBsZVBFeHQudmFsWzFdKTsKKyAgICAgICAgICAgIHN1bTAgPSB2YWRkcV9zMzIoc3VtMCwgc2FtcGxlTkV4dC52YWxbMF0pOworICAgICAgICAgICAgc3VtMSA9IHZhZGRxX3MzMihzdW0xLCBzYW1wbGVORXh0LnZhbFsxXSk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJ4Ml90IHZvbHVtZXNWLCBvdXRWOworICAgICAgICB2b2x1bWVzViA9IHZsZDFfczMyKG1Wb2x1bWVTSU1EKTsKKyAgICAgICAgb3V0ViA9IHZsZDFfczMyKG91dCk7CiAKLSAgICAgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iICAgIC8vIGxvb3AKKyAgICAgICAgLy9hZGQgYWxsIDQgcGFydGlhbCBzdW1zCisgICAgICAgIGludDMyeDJfdCBzdW1Mb3cwLCBzdW1IaWdoMCwgc3VtTG93MSwgc3VtSGlnaDE7CisgICAgICAgIHN1bUxvdzAgPSB2Z2V0X2xvd19zMzIoc3VtMCk7CisgICAgICAgIHN1bUhpZ2gwID0gdmdldF9oaWdoX3MzMihzdW0wKTsKKyAgICAgICAgc3VtTG93MSA9IHZnZXRfbG93X3MzMihzdW0xKTsKKyAgICAgICAgc3VtSGlnaDEgPSB2Z2V0X2hpZ2hfczMyKHN1bTEpOworICAgICAgICBzdW1Mb3cwID0gdnBhZGRfczMyKHN1bUxvdzAsIHN1bUhpZ2gwKTsKKyAgICAgICAgc3VtTG93MCA9IHZwYWRkX3MzMihzdW1Mb3cwLCBzdW1Mb3cwKTsKKyAgICAgICAgc3VtTG93MSA9IHZwYWRkX3MzMihzdW1Mb3cxLCBzdW1IaWdoMSk7CisgICAgICAgIHN1bUxvdzEgPSB2cGFkZF9zMzIoc3VtTG93MSwgc3VtTG93MSk7CiAKLSAgICAgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDJ9LCBbJVt2TFJdXSAgICAgICAgICAgXG4iICAgIC8vIGxvYWQgdm9sdW1lcwotICAgICAgICAgICAgInZsZDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIgICAgLy8gbG9hZCB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAidnBhZGQuczMyICAgICAgZDAsIGQwLCBkMSAgICAgICAgICAgICAgIFxuIiAgICAvLyBhZGQgYWxsIDQgcGFydGlhbCBzdW1zIGZyb20gcTAKLSAgICAgICAgICAgICJ2cGFkZC5zMzIgICAgICBkOCwgZDgsIGQ5ICAgICAgICAgICAgICAgXG4iICAgIC8vIGFkZCBhbGwgNCBwYXJ0aWFsIHN1bXMgZnJvbSBxNAotICAgICAgICAgICAgInZwYWRkLnMzMiAgICAgIGQwLCBkMCwgZDAgICAgICAgICAgICAgICBcbiIgICAgLy8gdG9nZXRoZXIKLSAgICAgICAgICAgICJ2cGFkZC5zMzIgICAgICBkOCwgZDgsIGQ4ICAgICAgICAgICAgICAgXG4iICAgIC8vIHRvZ2V0aGVyCi0gICAgICAgICAgICAidnRybi5zMzIgICAgICAgZDAsIGQ4ICAgICAgICAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcmxhY2UgTCxSIGNoYW5uZWxzCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgZDAsIGQwLCBkMiAgICAgICAgICAgICAgIFxuIiAgICAvLyBhcHBseSB2b2x1bWUKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBkMywgZDMsIGQwICAgICAgICAgICAgICAgXG4iICAgIC8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICAgICAidnN0MS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIiAgICAvLyBzdG9yZSByZXN1bHQKLQotICAgICAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCi0gICAgICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCi0gICAgICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAotICAgICAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCi0gICAgICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAotICAgICAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCi0gICAgICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCi0gICAgICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKLSAgICAgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAotICAgICAgICAgICAgICBbbGVycE5dICAgInIiIChsZXJwTiksCi0gICAgICAgICAgICAgIFt2TFJdICAgICAiciIgKG1Wb2x1bWVTSU1EKQotICAgICAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKLSAgICAgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwKLSAgICAgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAotICAgICAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgotICAgICAgICApOworICAgICAgICBzdW1Mb3cwID0gdnRybl9zMzIoc3VtTG93MCwgc3VtTG93MSkudmFsWzBdOworICAgICAgICBzdW1Mb3cwID0gdnFyZG11bGhfczMyKHN1bUxvdzAsIHZvbHVtZXNWKTsKKyAgICAgICAgb3V0ViA9IHZhZGRfczMyKG91dFYsIHN1bUxvdzApOworICAgICAgICB2c3QxX3MzMihvdXQsIG91dFYpOwogICAgIH0KKyNlbmRpZgogfQogCiB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmgKaW5kZXggMWVhNDQ3NC4uNDY5MWQwYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuaApAQCAtMzQsNyArMzQsNyBAQAogCiBjbGFzcyBBdWRpb1Jlc2FtcGxlclNpbmMgOiBwdWJsaWMgQXVkaW9SZXNhbXBsZXIgewogcHVibGljOgotICAgIEF1ZGlvUmVzYW1wbGVyU2luYyhpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlLAorICAgIEF1ZGlvUmVzYW1wbGVyU2luYyhpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgIHNyY19xdWFsaXR5IHF1YWxpdHkgPSBISUdIX1FVQUxJVFkpOwogCiAgICAgdmlydHVhbCB+QXVkaW9SZXNhbXBsZXJTaW5jKCk7CkBAIC00NCw3ICs0NCw3IEBACiBwcml2YXRlOgogICAgIHZvaWQgaW5pdCgpOwogCi0gICAgdmlydHVhbCB2b2lkIHNldFZvbHVtZShpbnQxNl90IGxlZnQsIGludDE2X3QgcmlnaHQpOworICAgIHZpcnR1YWwgdm9pZCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwogCiAgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTPgogICAgIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1dhdGNoZG9nLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1dhdGNoZG9nLmNwcAppbmRleCA5M2QxODVlLi44NzdlNzc2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9XYXRjaGRvZy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvV2F0Y2hkb2cuY3BwCkBAIC0zNCw3ICszNCw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RyY3B5KGJ1ZiwgIk4vQVxuIik7CiAgICAgfQotICAgIGZkcHJpbnRmKGZkLCAiV2F0Y2hkb2c6IHVuZGVycnVucz0ldSwgbG9ncz0ldSwgbW9zdCByZWNlbnQgdW5kZXJydW4gbG9nIGF0ICVzIiwKKyAgICBkcHJpbnRmKGZkLCAiV2F0Y2hkb2c6IHVuZGVycnVucz0ldSwgbG9ncz0ldSwgbW9zdCByZWNlbnQgdW5kZXJydW4gbG9nIGF0ICVzIiwKICAgICAgICAgICAgIG1VbmRlcnJ1bnMsIG1Mb2dzLCBidWYpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaAppbmRleCBiYzIwMzhhLi42YThhZWIxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmgKQEAgLTMxLDkgKzMxLDcgQEAKIAogLy8gdW5jb21tZW50IHRvIGVuYWJsZSBmYXN0IG1peGVyIHRvIHRha2UgcGVyZm9ybWFuY2Ugc2FtcGxlcyBmb3IgbGF0ZXIgc3RhdGlzdGljYWwgYW5hbHlzaXMKICNkZWZpbmUgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0KLS8vIHVuY29tbWVudCB0byBhbGxvdyBmYXN0IHRyYWNrcyBhdCBub24tbmF0aXZlIHNhbXBsZSByYXRlCi0vLyNkZWZpbmUgRkFTVF9UUkFDS1NfQVRfTk9OX05BVElWRV9TQU1QTEVfUkFURQorLy8gRklYTUUgcmVuYW1lIHRvIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKIAogLy8gdW5jb21tZW50IGZvciBkZWJ1Z2dpbmcgdGltaW5nIHByb2JsZW1zIHJlbGF0ZWQgdG8gU3RhdGVRdWV1ZTo6cHVzaCgpCiAvLyNkZWZpbmUgU1RBVEVfUVVFVUVfRFVNUApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IGE4YTUxNjkuLmJjYWY4YWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTQ0LDYgKzQ0LDggQEAKICNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKKyNkZWZpbmUgbWluKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjYsNyArNjgsOCBAQAogICAgICAgbVN0YXR1cyhOT19JTklUKSwgbVN0YXRlKElETEUpLAogICAgICAgLy8gbU1heERpc2FibGVXYWl0Q250IGlzIHNldCBieSBjb25maWd1cmUoKSBhbmQgbm90IHVzZWQgYmVmb3JlIHRoZW4KICAgICAgIC8vIG1EaXNhYmxlV2FpdENudCBpcyBzZXQgYnkgcHJvY2VzcygpIGFuZCB1cGRhdGVTdGF0ZSgpIGFuZCBub3QgdXNlZCBiZWZvcmUgdGhlbgotICAgICAgbVN1c3BlbmRlZChmYWxzZSkKKyAgICAgIG1TdXNwZW5kZWQoZmFsc2UpLAorICAgICAgbUF1ZGlvRmxpbmdlcih0aHJlYWQtPm1BdWRpb0ZsaW5nZXIpCiB7CiAgICAgQUxPR1YoIkNvbnN0cnVjdG9yICVwIiwgdGhpcyk7CiAgICAgaW50IGxTdGF0dXM7CkBAIC0xMTYsOCArMTE5LDkgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIC8vIGZpcnN0IG5vbiBkZXN0cm95ZWQgaGFuZGxlIGlzIGNvbnNpZGVyZWQgaW4gY29udHJvbAotICAgICAgICBpZiAoY29udHJvbEhhbmRsZSA9PSBOVUxMKQorICAgICAgICBpZiAoY29udHJvbEhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBjb250cm9sSGFuZGxlID0gaDsKKyAgICAgICAgfQogICAgICAgICBpZiAoaC0+cHJpb3JpdHkoKSA8PSBwcmlvcml0eSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE5NCw5ICsxOTgsMTkgQEAKICAgICAvLyBkZXN0cnVjdG9yIGJlZm9yZSB3ZSBleGl0CiAgICAgc3A8RWZmZWN0TW9kdWxlPiBrZWVwKHRoaXMpOwogICAgIHsKLSAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7Ci0gICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICAgICAgdGhyZWFkLT5kaXNjb25uZWN0RWZmZWN0KGtlZXAsIGhhbmRsZSwgdW5waW5JZkxhc3QpOworICAgICAgICBpZiAocmVtb3ZlSGFuZGxlKGhhbmRsZSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFpc1Bpbm5lZCgpIHx8IHVucGluSWZMYXN0KSB7CisgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkLT5yZW1vdmVFZmZlY3RfbCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyPiBhZiA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChhZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFmLT51cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnModGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KG1JZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG1IYW5kbGVzLnNpemUoKTsKQEAgLTQyNiw2ICs0NDAsMjAgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjphZGRFZmZlY3RUb0hhbF9sKCkKK3sKKyAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHx8CisgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DKSB7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0gPSB0aHJlYWQtPnN0cmVhbSgpOworICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5hZGRfYXVkaW9fZWZmZWN0KHN0cmVhbSwgbUVmZmVjdEludGVyZmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzdGFydCgpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTQ1MSwxNSArNDc5LDExIEBACiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CiAgICAgICAgIHN0YXR1cyA9IGNtZFN0YXR1czsKICAgICB9Ci0gICAgaWYgKHN0YXR1cyA9PSAwICYmCi0gICAgICAgICAgICAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHx8Ci0gICAgICAgICAgICAgKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykpIHsKLSAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7Ci0gICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSA9IHRocmVhZC0+c3RyZWFtKCk7Ci0gICAgICAgICAgICBpZiAoc3RyZWFtICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0tPmFkZF9hdWRpb19lZmZlY3Qoc3RyZWFtLCBtRWZmZWN0SW50ZXJmYWNlKTsKLSAgICAgICAgICAgIH0KKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgYWRkRWZmZWN0VG9IYWxfbCgpOworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBtQ2hhaW4ucHJvbW90ZSgpOworICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgY2hhaW4tPmZvcmNlVm9sdW1lKCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTgwNCw3ICs4MjgsMTEyIEBACiAgICAgcmV0dXJuIG1PZmZsb2FkZWQ7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQorU3RyaW5nOCBlZmZlY3RGbGFnc1RvU3RyaW5nKHVpbnQzMl90IGZsYWdzKSB7CisgICAgU3RyaW5nOCBzOworCisgICAgcy5hcHBlbmQoImNvbm4uIG1vZGU6ICIpOworICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spIHsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUOiBzLmFwcGVuZCgiaW5zZXJ0Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlk6IHMuYXBwZW5kKCJhdXhpbGlhcnkiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19UWVBFX1JFUExBQ0U6IHMuYXBwZW5kKCJyZXBsYWNlIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQzogcy5hcHBlbmQoInByZXByb2MiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQzogcy5hcHBlbmQoInBvc3Rwcm9jIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHMuYXBwZW5kKCJpbnNlcnQgcHJlZjogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlNFUlRfQU5ZOiBzLmFwcGVuZCgiYW55Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUOiBzLmFwcGVuZCgiZmlyc3QiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVDogcy5hcHBlbmQoImxhc3QiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFOiBzLmFwcGVuZCgiZXhjbHVzaXZlIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHMuYXBwZW5kKCJ2b2x1bWUgbWdtdDogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfTk9ORTogcy5hcHBlbmQoIm5vbmUiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTDogcy5hcHBlbmQoImltcGxlbWVudHMgY29udHJvbCIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlcyBpbmRpY2F0aW9uIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHVpbnQzMl90IGRldmluZCA9IGZsYWdzICYgRUZGRUNUX0ZMQUdfREVWSUNFX01BU0s7CisgICAgaWYgKGRldmluZCkgeworICAgICAgICBzLmFwcGVuZCgiZGV2aWNlIGluZGljYXRpb246ICIpOworICAgICAgICBzd2l0Y2ggKGRldmluZCkgeworICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0RFVklDRV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlcyB1cGRhdGVzIik7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzLmFwcGVuZCgiLCAiKTsKKyAgICB9CisKKyAgICBzLmFwcGVuZCgiaW5wdXQgbW9kZTogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX0lOUFVUX01BU0spIHsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX0lOUFVUX0RJUkVDVDogcy5hcHBlbmQoImRpcmVjdCIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX0lOUFVUX1BST1ZJREVSOiBzLmFwcGVuZCgicHJvdmlkZXIiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlBVVF9CT1RIOiBzLmFwcGVuZCgiZGlyZWN0K3Byb3ZpZGVyIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJub3Qgc2V0Iik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHMuYXBwZW5kKCJvdXRwdXQgbW9kZTogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX09VVFBVVF9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19PVVRQVVRfRElSRUNUOiBzLmFwcGVuZCgiZGlyZWN0Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfT1VUUFVUX1BST1ZJREVSOiBzLmFwcGVuZCgicHJvdmlkZXIiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19PVVRQVVRfQk9USDogcy5hcHBlbmQoImRpcmVjdCtwcm92aWRlciIpOyBicmVhazsKKyAgICBkZWZhdWx0OiBzLmFwcGVuZCgibm90IHNldCIpOyBicmVhazsKKyAgICB9CisgICAgcy5hcHBlbmQoIiwgIik7CisKKyAgICB1aW50MzJfdCBhY2NlbCA9IGZsYWdzICYgRUZGRUNUX0ZMQUdfSFdfQUNDX01BU0s7CisgICAgaWYgKGFjY2VsKSB7CisgICAgICAgIHMuYXBwZW5kKCJoYXJkd2FyZSBhY2NlbGVyYXRpb246ICIpOworICAgICAgICBzd2l0Y2ggKGFjY2VsKSB7CisgICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfSFdfQUNDX1NJTVBMRTogcy5hcHBlbmQoIm5vbi10dW5uZWxlZCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFRkZFQ1RfRkxBR19IV19BQ0NfVFVOTkVMOiBzLmFwcGVuZCgidHVubmVsZWQiKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHMuYXBwZW5kKCIsICIpOworICAgIH0KKworICAgIHVpbnQzMl90IG1vZGVpbmQgPSBmbGFncyAmIEVGRkVDVF9GTEFHX0FVRElPX01PREVfTUFTSzsKKyAgICBpZiAobW9kZWluZCkgeworICAgICAgICBzLmFwcGVuZCgibW9kZSBpbmRpY2F0aW9uOiAiKTsKKyAgICAgICAgc3dpdGNoIChtb2RlaW5kKSB7CisgICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlZCIpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy5hcHBlbmQoIiwgIik7CisgICAgfQorCisgICAgdWludDMyX3Qgc3JjaW5kID0gZmxhZ3MgJiBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfTUFTSzsKKyAgICBpZiAoc3JjaW5kKSB7CisgICAgICAgIHMuYXBwZW5kKCJzb3VyY2UgaW5kaWNhdGlvbjogIik7CisgICAgICAgIHN3aXRjaCAoc3JjaW5kKSB7CisgICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX0lORDogcy5hcHBlbmQoInJlcXVpcmVkIik7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzLmFwcGVuZCgiLCAiKTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19PRkZMT0FEX01BU0spIHsKKyAgICAgICAgcy5hcHBlbmQoIm9mZmxvYWRhYmxlLCAiKTsKKyAgICB9CisKKyAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICBpZiAocy5sZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgY2hhciAqc3RyID0gcy5sb2NrQnVmZmVyKGxlbik7CisgICAgICAgIHMudW5sb2NrQnVmZmVyKGxlbiAtIDIpOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTgyMCw4ICs5NDksOCBAQAogICAgIH0KIAogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRTZXNzaW9uIFN0YXR1cyBTdGF0ZSBFbmdpbmU6XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0JTA1ZCAgICUwM2QgICAgJTAzZCAgIDB4JTA4eFxuIiwKLSAgICAgICAgICAgIG1TZXNzaW9uSWQsIG1TdGF0dXMsIG1TdGF0ZSwgKHVpbnQzMl90KW1FZmZlY3RJbnRlcmZhY2UpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQlMDVkICAgJTAzZCAgICAlMDNkICAgJXBcbiIsCisgICAgICAgICAgICBtU2Vzc2lvbklkLCBtU3RhdHVzLCBtU3RhdGUsIG1FZmZlY3RJbnRlcmZhY2UpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHREZXNjcmlwdG9yOlxuIik7CkBAIC04MzgsOSArOTY3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUubm9kZVsyXSwKICAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci50eXBlLm5vZGVbM10sbURlc2NyaXB0b3IudHlwZS5ub2RlWzRdLG1EZXNjcmlwdG9yLnR5cGUubm9kZVs1XSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIGFwaVZlcnNpb246ICUwOFhcblx0XHQtIGZsYWdzOiAlMDhYXG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIGFwaVZlcnNpb246ICUwOFhcblx0XHQtIGZsYWdzOiAlMDhYICglcylcbiIsCiAgICAgICAgICAgICBtRGVzY3JpcHRvci5hcGlWZXJzaW9uLAotICAgICAgICAgICAgbURlc2NyaXB0b3IuZmxhZ3MpOworICAgICAgICAgICAgbURlc2NyaXB0b3IuZmxhZ3MsCisgICAgICAgICAgICBlZmZlY3RGbGFnc1RvU3RyaW5nKG1EZXNjcmlwdG9yLmZsYWdzKS5zdHJpbmcoKSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIG5hbWU6ICVzXG4iLAogICAgICAgICAgICAgbURlc2NyaXB0b3IubmFtZSk7CkBAIC04NTAsMzggKzk4MCwzOCBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHQtIElucHV0IGNvbmZpZ3VyYXRpb246XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHRCdWZmZXIgICAgIEZyYW1lcyAgU21wIHJhdGUgQ2hhbm5lbHMgRm9ybWF0XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0XHQweCUwOHggJTA1ZCAgICUwNWQgICAgJTA4eCAlZFxuIiwKLSAgICAgICAgICAgICh1aW50MzJfdCltQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcsCisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdFx0RnJhbWVzICBTbXAgcmF0ZSBDaGFubmVscyBGb3JtYXQgQnVmZmVyXG4iKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0XHQlMDV6dSAgICUwNWQgICAgJTA4eCAlNmQgKCVzKSAlcFxuIiwKICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQsCiAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMsCi0gICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCk7CisgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCwKKyAgICAgICAgICAgIGZvcm1hdFRvU3RyaW5nKChhdWRpb19mb3JtYXRfdCltQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCksCisgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHQtIE91dHB1dCBjb25maWd1cmF0aW9uOlxuIik7CiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdFx0QnVmZmVyICAgICBGcmFtZXMgIFNtcCByYXRlIENoYW5uZWxzIEZvcm1hdFxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdFx0MHglMDh4ICUwNWQgICAlMDVkICAgICUwOHggJWRcbiIsCi0gICAgICAgICAgICAodWludDMyX3QpbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdywKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0XHQlcCAlMDV6dSAgICUwNWQgICAgJTA4eCAlZCAoJXMpXG4iLAorICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdywKICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50LAogICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMsCi0gICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5mb3JtYXQpOworICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0LAorICAgICAgICAgICAgZm9ybWF0VG9TdHJpbmcoKGF1ZGlvX2Zvcm1hdF90KW1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQlZCBDbGllbnRzOlxuIiwgbUhhbmRsZXMuc2l6ZSgpKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0JXp1IENsaWVudHM6XG4iLCBtSGFuZGxlcy5zaXplKCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHRQaWQgICBQcmlvcml0eSBDdHJsIExvY2tlZCBjbGllbnQgc2VydmVyXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHQgIFBpZCBQcmlvcml0eSBDdHJsIExvY2tlZCBjbGllbnQgc2VydmVyXG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IYW5kbGVzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIEVmZmVjdEhhbmRsZSAqaGFuZGxlID0gbUhhbmRsZXNbaV07CiAgICAgICAgIGlmIChoYW5kbGUgIT0gTlVMTCAmJiAhaGFuZGxlLT5kZXN0cm95ZWRfbCgpKSB7Ci0gICAgICAgICAgICBoYW5kbGUtPmR1bXAoYnVmZmVyLCBTSVpFKTsKKyAgICAgICAgICAgIGhhbmRsZS0+ZHVtcFRvQnVmZmVyKGJ1ZmZlciwgU0laRSk7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotCiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0Lmxlbmd0aCgpKTsKIAogICAgIGlmIChsb2NrZWQpIHsKQEAgLTkxMSwxOCArMTA0MSwxNSBAQAogICAgIH0KICAgICBpbnQgYnVmT2Zmc2V0ID0gKChzaXplb2YoZWZmZWN0X3BhcmFtX2NibGtfdCkgLSAxKSAvIHNpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KTsKICAgICBtQ2Jsa01lbW9yeSA9IGNsaWVudC0+aGVhcCgpLT5hbGxvY2F0ZShFRkZFQ1RfUEFSQU1fQlVGRkVSX1NJWkUgKyBidWZPZmZzZXQpOwotICAgIGlmIChtQ2Jsa01lbW9yeSAhPSAwKSB7Ci0gICAgICAgIG1DYmxrID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X3BhcmFtX2NibGtfdCAqPihtQ2Jsa01lbW9yeS0+cG9pbnRlcigpKTsKLQotICAgICAgICBpZiAobUNibGsgIT0gTlVMTCkgewotICAgICAgICAgICAgbmV3KG1DYmxrKSBlZmZlY3RfcGFyYW1fY2Jsa190KCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gKHVpbnQ4X3QgKiltQ2JsayArIGJ1Zk9mZnNldDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7CisgICAgaWYgKG1DYmxrTWVtb3J5ID09IDAgfHwKKyAgICAgICAgICAgIChtQ2JsayA9IHN0YXRpY19jYXN0PGVmZmVjdF9wYXJhbV9jYmxrX3QgKj4obUNibGtNZW1vcnktPnBvaW50ZXIoKSkpID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBFZmZlY3Qgc2l6ZT0ldSIsIEVGRkVDVF9QQVJBTV9CVUZGRVJfU0laRSArCiAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV9jYmxrX3QpKTsKKyAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBuZXcobUNibGspIGVmZmVjdF9wYXJhbV9jYmxrX3QoKTsKKyAgICBtQnVmZmVyID0gKHVpbnQ4X3QgKiltQ2JsayArIGJ1Zk9mZnNldDsKIH0KIAogQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6On5FZmZlY3RIYW5kbGUoKQpAQCAtOTM5LDYgKzEwNjYsMTEgQEAKICAgICBkaXNjb25uZWN0KGZhbHNlKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmluaXRDaGVjaygpCit7CisgICAgcmV0dXJuIG1DbGllbnQgPT0gMCB8fCBtQ2Jsa01lbW9yeSAhPSAwID8gT0sgOiBOT19NRU1PUlk7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjplbmFibGUoKQogewogICAgIEFMT0dWKCJlbmFibGUgJXAiLCB0aGlzKTsKQEAgLTEwNTMsOCArMTE4NSw4IEBACiAgICAgICAgICAgICBtQ2Jsay0+fmVmZmVjdF9wYXJhbV9jYmxrX3QoKTsgICAvLyBkZXN0cm95IG91ciBzaGFyZWQtc3RydWN0dXJlLgogICAgICAgICB9CiAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7ICAgIC8vIGZyZWUgdGhlIHNoYXJlZCBtZW1vcnkgYmVmb3JlIHJlbGVhc2luZyB0aGUgaGVhcCBpdCBiZWxvbmdzIHRvCi0gICAgICAgIC8vIENsaWVudCBkZXN0cnVjdG9yIG11c3QgcnVuIHdpdGggQXVkaW9GbGluZ2VyIG11dGV4IGxvY2tlZAotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNsaWVudC0+YXVkaW9GbGluZ2VyKCktPm1Mb2NrKTsKKyAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgbXVzdCBydW4gd2l0aCBBdWRpb0ZsaW5nZXIgY2xpZW50IG11dGV4IGxvY2tlZAorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNsaWVudC0+YXVkaW9GbGluZ2VyKCktPm1DbGllbnRMb2NrKTsKICAgICAgICAgbUNsaWVudC5jbGVhcigpOwogICAgIH0KIH0KQEAgLTExNzksMTUgKzEzMTEsMTUgQEAKIH0KIAogCi12b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkdW1wVG9CdWZmZXIoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICAgICBib29sIGxvY2tlZCA9IG1DYmxrICE9IE5VTEwgJiYgQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtQ2Jsay0+bG9jayk7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJcdFx0XHQlMDVkICUwNWQgICAgJTAxdSAgICAlMDF1ICAgICAgJTA1dSAgJTA1dVxuIiwKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJcdFx0XHQlNWQgICAgJTVkICAlM3MgICAgJTNzICAlNXUgICU1dVxuIiwKICAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbVByaW9yaXR5LAotICAgICAgICAgICAgbUhhc0NvbnRyb2wsCi0gICAgICAgICAgICAhbG9ja2VkLAorICAgICAgICAgICAgbUhhc0NvbnRyb2wgPyAieWVzIiA6ICJubyIsCisgICAgICAgICAgICBsb2NrZWQgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICBtQ2JsayA/IG1DYmxrLT5jbGllbnRJbmRleCA6IDAsCiAgICAgICAgICAgICBtQ2JsayA/IG1DYmxrLT5zZXJ2ZXJJbmRleCA6IDAKICAgICAgICAgICAgICk7CkBAIC0xMjA0LDcgKzEzMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtVGhyZWFkKHRocmVhZCksIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbUFjdGl2ZVRyYWNrQ250KDApLCBtVHJhY2tDbnQoMCksIG1UYWlsQnVmZmVyQ291bnQoMCksCiAgICAgICBtT3duSW5CdWZmZXIoZmFsc2UpLCBtVm9sdW1lQ3RybElkeCgtMSksIG1MZWZ0Vm9sdW1lKFVJTlRfTUFYKSwgbVJpZ2h0Vm9sdW1lKFVJTlRfTUFYKSwKLSAgICAgIG1OZXdMZWZ0Vm9sdW1lKFVJTlRfTUFYKSwgbU5ld1JpZ2h0Vm9sdW1lKFVJTlRfTUFYKQorICAgICAgbU5ld0xlZnRWb2x1bWUoVUlOVF9NQVgpLCBtTmV3UmlnaHRWb2x1bWUoVUlOVF9NQVgpLCBtRm9yY2VWb2x1bWUoZmFsc2UpCiB7CiAgICAgbVN0cmF0ZWd5ID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9NVVNJQyk7CiAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7CkBAIC0xMjc4LDcgKzE0MTAsMTMgQEAKIC8vIE11c3QgYmUgY2FsbGVkIHdpdGggRWZmZWN0Q2hhaW46Om1Mb2NrIGxvY2tlZAogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpjbGVhcklucHV0QnVmZmVyX2woc3A8VGhyZWFkQmFzZT4gdGhyZWFkKQogewotICAgIG1lbXNldChtSW5CdWZmZXIsIDAsIHRocmVhZC0+ZnJhbWVDb3VudCgpICogdGhyZWFkLT5mcmFtZVNpemUoKSk7CisgICAgLy8gVE9ETzogVGhpcyB3aWxsIGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBkZXBlbmRpbmcgb24gbXVsdGljaGFubmVsCisgICAgLy8gYW5kIHNhbXBsZSBmb3JtYXQgY2hhbmdlcyBmb3IgZWZmZWN0cy4KKyAgICAvLyBDdXJyZW50bHkgZWZmZWN0cyBwcm9jZXNzaW5nIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBzdGVyZW8sIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgLy8gKDQgYnl0ZXMgZnJhbWUgc2l6ZSkKKyAgICBjb25zdCBzaXplX3QgZnJhbWVTaXplID0KKyAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpICogbWluKEZDQ18yLCB0aHJlYWQtPmNoYW5uZWxDb3VudCgpKTsKKyAgICBtZW1zZXQobUluQnVmZmVyLCAwLCB0aHJlYWQtPmZyYW1lQ291bnQoKSAqIGZyYW1lU2l6ZSk7CiB9CiAKIC8vIE11c3QgYmUgY2FsbGVkIHdpdGggRWZmZWN0Q2hhaW46Om1Mb2NrIGxvY2tlZApAQCAtMTUyMSw3ICsxNjU5LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChjdHJsSWR4ID09IG1Wb2x1bWVDdHJsSWR4ICYmICpsZWZ0ID09IG1MZWZ0Vm9sdW1lICYmICpyaWdodCA9PSBtUmlnaHRWb2x1bWUpIHsKKyAgICBpZiAoIWlzVm9sdW1lRm9yY2VkKCkgJiYgY3RybElkeCA9PSBtVm9sdW1lQ3RybElkeCAmJgorICAgICAgICAgICAgKmxlZnQgPT0gbUxlZnRWb2x1bWUgJiYgKnJpZ2h0ID09IG1SaWdodFZvbHVtZSkgewogICAgICAgICBpZiAoaGFzQ29udHJvbCkgewogICAgICAgICAgICAgKmxlZnQgPSBtTmV3TGVmdFZvbHVtZTsKICAgICAgICAgICAgICpyaWdodCA9IG1OZXdSaWdodFZvbHVtZTsKQEAgLTE1NjIsMzkgKzE3MDEsNTIgQEAKICAgICByZXR1cm4gaGFzQ29udHJvbDsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpzeW5jSGFsRWZmZWN0c1N0YXRlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1FZmZlY3RzW2ldLT5zdGF0ZSgpID09IEVmZmVjdE1vZHVsZTo6QUNUSVZFIHx8CisgICAgICAgICAgICAgICAgbUVmZmVjdHNbaV0tPnN0YXRlKCkgPT0gRWZmZWN0TW9kdWxlOjpTVE9QUElORykgeworICAgICAgICAgICAgbUVmZmVjdHNbaV0tPmFkZEVmZmVjdFRvSGFsX2woKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkVmZmVjdHMgZm9yIHNlc3Npb24gJWQ6XG4iLCBtU2Vzc2lvbklkKTsKKyAgICBzaXplX3QgbnVtRWZmZWN0cyA9IG1FZmZlY3RzLnNpemUoKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgJWQgZWZmZWN0cyBmb3Igc2Vzc2lvbiAlZFxuIiwgbnVtRWZmZWN0cywgbVNlc3Npb25JZCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCi0gICAgYm9vbCBsb2NrZWQgPSBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1Mb2NrKTsKLSAgICAvLyBmYWlsZWQgdG8gbG9jayAtIEF1ZGlvRmxpbmdlciBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCi0gICAgaWYgKCFsb2NrZWQpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXHRDb3VsZCBub3QgbG9jayBtdXRleDpcbiIpOwotICAgIH0KLQotICAgIHJlc3VsdC5hcHBlbmQoIlx0TnVtIGZ4IEluIGJ1ZmZlciAgIE91dCBidWZmZXIgICBBY3RpdmUgdHJhY2tzOlxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHQlMDJkICAgICAweCUwOHggIDB4JTA4eCAgICVkXG4iLAotICAgICAgICAgICAgbUVmZmVjdHMuc2l6ZSgpLAotICAgICAgICAgICAgKHVpbnQzMl90KW1JbkJ1ZmZlciwKLSAgICAgICAgICAgICh1aW50MzJfdCltT3V0QnVmZmVyLAotICAgICAgICAgICAgbUFjdGl2ZVRyYWNrQ250KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gbUVmZmVjdHNbaV07Ci0gICAgICAgIGlmIChlZmZlY3QgIT0gMCkgewotICAgICAgICAgICAgZWZmZWN0LT5kdW1wKGZkLCBhcmdzKTsKKyAgICBpZiAobnVtRWZmZWN0cykgeworICAgICAgICBib29sIGxvY2tlZCA9IEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUxvY2spOworICAgICAgICAvLyBmYWlsZWQgdG8gbG9jayAtIEF1ZGlvRmxpbmdlciBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCisgICAgICAgIGlmICghbG9ja2VkKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcdENvdWxkIG5vdCBsb2NrIG11dGV4OlxuIik7CiAgICAgICAgIH0KLSAgICB9CiAKLSAgICBpZiAobG9ja2VkKSB7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJcdEluIGJ1ZmZlciAgIE91dCBidWZmZXIgICBBY3RpdmUgdHJhY2tzOlxuIik7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0JXAgICVwICAgJWRcbiIsCisgICAgICAgICAgICAgICAgbUluQnVmZmVyLAorICAgICAgICAgICAgICAgIG1PdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrQ250KTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7ICsraSkgeworICAgICAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBtRWZmZWN0c1tpXTsKKyAgICAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgeworICAgICAgICAgICAgICAgIGVmZmVjdC0+ZHVtcChmZCwgYXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9ja2VkKSB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMTc5Miw0ICsxOTQ0LDEzIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OnNldFRocmVhZChjb25zdCBzcDxUaHJlYWRCYXNlPiYgdGhyZWFkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVRocmVhZCA9IHRocmVhZDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1FZmZlY3RzW2ldLT5zZXRUaHJlYWQodGhyZWFkKTsKKyAgICB9Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAppbmRleCBiNzE3ODU3Li42ZjkzZjgxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKQEAgLTExOSw2ICsxMTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQpICE9IDA7IH0KICAgICBzdGF0dXNfdCAgICAgICAgIHNldE9mZmxvYWRlZChib29sIG9mZmxvYWRlZCwgYXVkaW9faW9faGFuZGxlX3QgaW8pOwogICAgIGJvb2wgICAgICAgICAgICAgaXNPZmZsb2FkZWQoKSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgIGFkZEVmZmVjdFRvSGFsX2woKTsKIAogICAgIHZvaWQgICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC0xNTMsNiArMTU0LDcgQEAKICAgICB1aW50MzJfdCBtRGlzYWJsZVdhaXRDbnQ7ICAgICAgIC8vIGN1cnJlbnQgcHJvY2VzcygpIGNhbGxzIGNvdW50IGR1cmluZyBkaXNhYmxlIHBlcmlvZC4KICAgICBib29sICAgICBtU3VzcGVuZGVkOyAgICAgICAgICAgIC8vIGVmZmVjdCBpcyBzdXNwZW5kZWQ6IHRlbXBvcmFyaWx5IGRpc2FibGVkIGJ5IGZyYW1ld29yawogICAgIGJvb2wgICAgIG1PZmZsb2FkZWQ7ICAgICAgICAgICAgLy8gZWZmZWN0IGlzIGN1cnJlbnRseSBvZmZsb2FkZWQgdG8gdGhlIGF1ZGlvIERTUAorICAgIHdwPEF1ZGlvRmxpbmdlcj4gICAgbUF1ZGlvRmxpbmdlcjsKIH07CiAKIC8vIFRoZSBFZmZlY3RIYW5kbGUgY2xhc3MgaW1wbGVtZW50cyB0aGUgSUVmZmVjdCBpbnRlcmZhY2UuIEl0IHByb3ZpZGVzIHJlc291cmNlcwpAQCAtMTY5LDYgKzE3MSw3IEBACiAgICAgICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAogICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSk7CiAgICAgdmlydHVhbCB+RWZmZWN0SGFuZGxlKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKIAogICAgIC8vIElFZmZlY3QKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZSgpOwpAQCAtMjA4LDcgKzIxMSw3IEBACiAgICAgLy8gZGVzdHJveWVkX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBhc3NvY2lhdGVkIEVmZmVjdE1vZHVsZSBtTG9jayBoZWxkCiAgICAgYm9vbCBkZXN0cm95ZWRfbCgpIGNvbnN0IHsgcmV0dXJuIG1EZXN0cm95ZWQ7IH0KIAotICAgIHZvaWQgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGR1bXBUb0J1ZmZlcihjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKIAogcHJvdGVjdGVkOgogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAgICAgICAgIC8vIGZvciBtRWZmZWN0LCBtSGFzQ29udHJvbCwgbUVuYWJsZWQKQEAgLTI2OSw2ICsyNzIsNyBAQAogICAgIHNwPEVmZmVjdE1vZHVsZT4gZ2V0RWZmZWN0RnJvbURlc2NfbChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKICAgICBzcDxFZmZlY3RNb2R1bGU+IGdldEVmZmVjdEZyb21JZF9sKGludCBpZCk7CiAgICAgc3A8RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RGcm9tVHlwZV9sKGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUpOworICAgIC8vIEZJWE1FIHVzZSBmbG9hdCB0byBpbXByb3ZlIHRoZSBkeW5hbWljIHJhbmdlCiAgICAgYm9vbCBzZXRWb2x1bWVfbCh1aW50MzJfdCAqbGVmdCwgdWludDMyX3QgKnJpZ2h0KTsKICAgICB2b2lkIHNldERldmljZV9sKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogICAgIHZvaWQgc2V0TW9kZV9sKGF1ZGlvX21vZGVfdCBtb2RlKTsKQEAgLTMxNSw2ICszMTksMTQgQEAKICAgICAvLyBBdCBsZWFzdCBvbmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCBpbiB0aGUgY2hhaW4gaXMgZW5hYmxlZAogICAgIGJvb2wgaXNOb25PZmZsb2FkYWJsZUVuYWJsZWQoKTsKIAorICAgIC8vIHVzZSByZWxlYXNlX2NhcyBiZWNhdXNlIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIG9ic2VydmVkIHZhbHVlLCBqdXN0IHdhbnQgdG8gbWFrZSBzdXJlIHRoZQorICAgIC8vIG5ldyB2YWx1ZSBpcyBvYnNlcnZhYmxlLgorICAgIHZvaWQgZm9yY2VWb2x1bWUoKSB7IGFuZHJvaWRfYXRvbWljX3JlbGVhc2VfY2FzKGZhbHNlLCB0cnVlLCAmbUZvcmNlVm9sdW1lKTsgfQorICAgIC8vIHVzZSBhY3F1aXJlX2NhcyBiZWNhdXNlIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBvYnNlcnZlZCB2YWx1ZSBhbmQKKyAgICAvLyB3ZSBhcmUgdGhlIG9ubHkgb2JzZXJ2ZXJzLgorICAgIGJvb2wgaXNWb2x1bWVGb3JjZWQoKSB7IHJldHVybiAoYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9jYXModHJ1ZSwgZmFsc2UsICZtRm9yY2VWb2x1bWUpID09IDApOyB9CisKKyAgICB2b2lkIHN5bmNIYWxFZmZlY3RzU3RhdGUoKTsKIAogICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC0zNDUsNiArMzU3LDggQEAKIAogICAgIHZvaWQgY2xlYXJJbnB1dEJ1ZmZlcl9sKHNwPFRocmVhZEJhc2U+IHRocmVhZCk7CiAKKyAgICB2b2lkIHNldFRocmVhZChjb25zdCBzcDxUaHJlYWRCYXNlPiYgdGhyZWFkKTsKKwogICAgIHdwPFRocmVhZEJhc2U+IG1UaHJlYWQ7ICAgICAvLyBwYXJlbnQgbWl4ZXIgdGhyZWFkCiAgICAgTXV0ZXggbUxvY2s7ICAgICAgICAgICAgICAgIC8vIG11dGV4IHByb3RlY3RpbmcgZWZmZWN0IGxpc3QKICAgICBWZWN0b3I8IHNwPEVmZmVjdE1vZHVsZT4gPiBtRWZmZWN0czsgLy8gbGlzdCBvZiBlZmZlY3QgbW9kdWxlcwpAQCAtMzcwLDQgKzM4NCw1IEBACiAgICAgLy8gdGltZUxvdyBmaWVsZHMgYW1vbmcgZWZmZWN0IHR5cGUgVVVJRHMuCiAgICAgLy8gVXBkYXRlZCBieSB1cGRhdGVTdXNwZW5kZWRTZXNzaW9uc19sKCkgb25seS4KICAgICBLZXllZFZlY3RvcjwgaW50LCBzcDxTdXNwZW5kZWRFZmZlY3REZXNjPiA+IG1TdXNwZW5kZWRFZmZlY3RzOworICAgIHZvbGF0aWxlIGludDMyX3QgbUZvcmNlVm9sdW1lOyAvLyBmb3JjZSBuZXh0IHZvbHVtZSBjb21tYW5kIGJlY2F1c2UgYSBuZXcgZWZmZWN0IHdhcyBlbmFibGVkCiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxM2UyNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkZhc3RDYXB0dXJlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19BVURJTworCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlICJGYXN0Q2FwdHVyZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qc3RhdGljKi8gY29uc3QgRmFzdENhcHR1cmVTdGF0ZSBGYXN0Q2FwdHVyZTo6aW5pdGlhbDsKKworRmFzdENhcHR1cmU6OkZhc3RDYXB0dXJlKCkgOiBGYXN0VGhyZWFkKCksCisgICAgaW5wdXRTb3VyY2UoTlVMTCksIGlucHV0U291cmNlR2VuKDApLCBwaXBlU2luayhOVUxMKSwgcGlwZVNpbmtHZW4oMCksCisgICAgcmVhZEJ1ZmZlcihOVUxMKSwgcmVhZEJ1ZmZlclN0YXRlKC0xKSwgZm9ybWF0KEZvcm1hdF9JbnZhbGlkKSwgc2FtcGxlUmF0ZSgwKSwKKyAgICAvLyBkdW1teUR1bXBTdGF0ZQorICAgIHRvdGFsTmF0aXZlRnJhbWVzUmVhZCgwKQoreworICAgIHByZXZpb3VzID0gJmluaXRpYWw7CisgICAgY3VycmVudCA9ICZpbml0aWFsOworCisgICAgbUR1bW15RHVtcFN0YXRlID0gJmR1bW15RHVtcFN0YXRlOworfQorCitGYXN0Q2FwdHVyZTo6fkZhc3RDYXB0dXJlKCkKK3sKK30KKworRmFzdENhcHR1cmVTdGF0ZVF1ZXVlKiBGYXN0Q2FwdHVyZTo6c3EoKQoreworICAgIHJldHVybiAmbVNROworfQorCitjb25zdCBGYXN0VGhyZWFkU3RhdGUgKkZhc3RDYXB0dXJlOjpwb2xsKCkKK3sKKyAgICByZXR1cm4gbVNRLnBvbGwoKTsKK30KKwordm9pZCBGYXN0Q2FwdHVyZTo6c2V0TG9nKE5CTG9nOjpXcml0ZXIgKmxvZ1dyaXRlciBfX3VudXNlZCkKK3sKK30KKwordm9pZCBGYXN0Q2FwdHVyZTo6b25JZGxlKCkKK3sKKyAgICBwcmVJZGxlID0gKihjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopY3VycmVudDsKKyAgICBjdXJyZW50ID0gJnByZUlkbGU7Cit9CisKK3ZvaWQgRmFzdENhcHR1cmU6Om9uRXhpdCgpCit7CisgICAgZGVsZXRlW10gcmVhZEJ1ZmZlcjsKK30KKworYm9vbCBGYXN0Q2FwdHVyZTo6aXNTdWJDbGFzc0NvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIGNvbW1hbmQpCit7CisgICAgc3dpdGNoICgoRmFzdENhcHR1cmVTdGF0ZTo6Q29tbWFuZCkgY29tbWFuZCkgeworICAgIGNhc2UgRmFzdENhcHR1cmVTdGF0ZTo6UkVBRDoKKyAgICBjYXNlIEZhc3RDYXB0dXJlU3RhdGU6OldSSVRFOgorICAgIGNhc2UgRmFzdENhcHR1cmVTdGF0ZTo6UkVBRF9XUklURToKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordm9pZCBGYXN0Q2FwdHVyZTo6b25TdGF0ZUNoYW5nZSgpCit7CisgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKSB0aGlzLT5jdXJyZW50OworICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBwcmV2aW91cyA9IChjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopIHRoaXMtPnByZXZpb3VzOworICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RDYXB0dXJlRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworCisgICAgYm9vbCBlaXRoZXJDaGFuZ2VkID0gZmFsc2U7CisKKyAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIGlucHV0IEhBTCBjb25maWd1cmF0aW9uCisgICAgTkJBSU9fRm9ybWF0IHByZXZpb3VzRm9ybWF0ID0gZm9ybWF0OworICAgIGlmIChjdXJyZW50LT5tSW5wdXRTb3VyY2VHZW4gIT0gaW5wdXRTb3VyY2VHZW4pIHsKKyAgICAgICAgaW5wdXRTb3VyY2UgPSBjdXJyZW50LT5tSW5wdXRTb3VyY2U7CisgICAgICAgIGlucHV0U291cmNlR2VuID0gY3VycmVudC0+bUlucHV0U291cmNlR2VuOworICAgICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IGlucHV0U291cmNlLT5mb3JtYXQoKTsKKyAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpOworICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOworICAgICAgICAgICAgQUxPR19BU1NFUlQoY2hhbm5lbENvdW50ID09IDEgfHwgY2hhbm5lbENvdW50ID09IDIpOworICAgICAgICB9CisgICAgICAgIGR1bXBTdGF0ZS0+bVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICBlaXRoZXJDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIHBpcGUKKyAgICBpZiAoY3VycmVudC0+bVBpcGVTaW5rR2VuICE9IHBpcGVTaW5rR2VuKSB7CisgICAgICAgIHBpcGVTaW5rID0gY3VycmVudC0+bVBpcGVTaW5rOworICAgICAgICBwaXBlU2lua0dlbiA9IGN1cnJlbnQtPm1QaXBlU2lua0dlbjsKKyAgICAgICAgZWl0aGVyQ2hhbmdlZCA9IHRydWU7CisgICAgfQorCisgICAgLy8gaW5wdXQgc291cmNlIGFuZCBwaXBlIHNpbmsgbXVzdCBiZSBjb21wYXRpYmxlCisgICAgaWYgKGVpdGhlckNoYW5nZWQgJiYgaW5wdXRTb3VyY2UgIT0gTlVMTCAmJiBwaXBlU2luayAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKEZvcm1hdF9pc0VxdWFsKGZvcm1hdCwgcGlwZVNpbmstPmZvcm1hdCgpKSk7CisgICAgfQorCisgICAgaWYgKCghRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBwcmV2aW91c0Zvcm1hdCkpIHx8IChmcmFtZUNvdW50ICE9IHByZXZpb3VzLT5tRnJhbWVDb3VudCkpIHsKKyAgICAgICAgLy8gRklYTUUgdG8gYXZvaWQgcHJpb3JpdHkgaW52ZXJzaW9uLCBkb24ndCBkZWxldGUgaGVyZQorICAgICAgICBkZWxldGVbXSByZWFkQnVmZmVyOworICAgICAgICByZWFkQnVmZmVyID0gTlVMTDsKKyAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIHNhbXBsZVJhdGUgPiAwKSB7CisgICAgICAgICAgICAvLyBGSVhNRSBuZXcgbWF5IGJsb2NrIGZvciB1bmJvdW5kZWQgdGltZSBhdCBpbnRlcm5hbCBtdXRleCBvZiB0aGUgaGVhcAorICAgICAgICAgICAgLy8gICAgICAgaW1wbGVtZW50YXRpb247IGl0IHdvdWxkIGJlIGJldHRlciB0byBoYXZlIG5vcm1hbCBjYXB0dXJlIHRocmVhZCBhbGxvY2F0ZSBmb3IKKyAgICAgICAgICAgIC8vICAgICAgIHVzIHRvIGF2b2lkIGJsb2NraW5nIGhlcmUgYW5kIHRvIHByZXZlbnQgcG9zc2libGUgcHJpb3JpdHkgaW52ZXJzaW9uCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCk7CisgICAgICAgICAgICAvLyBGSVhNRSBmcmFtZVNpemUKKyAgICAgICAgICAgIHJlYWRCdWZmZXIgPSBuZXcgc2hvcnRbZnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudF07CisgICAgICAgICAgICBtZW1zZXQocmVhZEJ1ZmZlciwgMCwgZnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihyZWFkQnVmZmVyWzBdKSk7CisgICAgICAgICAgICBwZXJpb2ROcyA9IChmcmFtZUNvdW50ICogMTAwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDEuMDAKKyAgICAgICAgICAgIHVuZGVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDE3NTAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgLy8gMS43NQorICAgICAgICAgICAgb3ZlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiA1MDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAvLyAwLjUwCisgICAgICAgICAgICBmb3JjZU5zID0gKGZyYW1lQ291bnQgKiA5NTAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAgIC8vIDAuOTUKKyAgICAgICAgICAgIHdhcm11cE5zID0gKGZyYW1lQ291bnQgKiA1MDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAgLy8gMC41MAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGVyaW9kTnMgPSAwOworICAgICAgICAgICAgdW5kZXJydW5OcyA9IDA7CisgICAgICAgICAgICBvdmVycnVuTnMgPSAwOworICAgICAgICAgICAgZm9yY2VOcyA9IDA7CisgICAgICAgICAgICB3YXJtdXBOcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmVhZEJ1ZmZlclN0YXRlID0gLTE7CisgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIH0KKworfQorCit2b2lkIEZhc3RDYXB0dXJlOjpvbldvcmsoKQoreworICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgdGhpcy0+Y3VycmVudDsKKyAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqKSB0aGlzLT5kdW1wU3RhdGU7CisgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gdGhpcy0+Y29tbWFuZDsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworCisgICAgaWYgKChjb21tYW5kICYgRmFzdENhcHR1cmVTdGF0ZTo6UkVBRCkgLyomJiBpc1dhcm0qLykgeworICAgICAgICBBTE9HX0FTU0VSVChpbnB1dFNvdXJjZSAhPSBOVUxMKTsKKyAgICAgICAgQUxPR19BU1NFUlQocmVhZEJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgZHVtcFN0YXRlLT5tUmVhZFNlcXVlbmNlKys7CisgICAgICAgIEFUUkFDRV9CRUdJTigicmVhZCIpOworICAgICAgICBzc2l6ZV90IGZyYW1lc1JlYWQgPSBpbnB1dFNvdXJjZS0+cmVhZChyZWFkQnVmZmVyLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTKTsKKyAgICAgICAgQVRSQUNFX0VORCgpOworICAgICAgICBkdW1wU3RhdGUtPm1SZWFkU2VxdWVuY2UrKzsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPj0gMCkgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoc2l6ZV90KSBmcmFtZXNSZWFkID4gZnJhbWVDb3VudCk7CisgICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1JlYWQgKz0gZnJhbWVzUmVhZDsKKyAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lc1JlYWQgPSB0b3RhbE5hdGl2ZUZyYW1lc1JlYWQ7CisgICAgICAgICAgICByZWFkQnVmZmVyU3RhdGUgPSBmcmFtZXNSZWFkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHVtcFN0YXRlLT5tUmVhZEVycm9ycysrOworICAgICAgICAgICAgcmVhZEJ1ZmZlclN0YXRlID0gMDsKKyAgICAgICAgfQorICAgICAgICAvLyBGSVhNRSByZW5hbWUgdG8gYXR0ZW1wdGVkSU8KKyAgICAgICAgYXR0ZW1wdGVkV3JpdGUgPSB0cnVlOworICAgIH0KKworICAgIGlmIChjb21tYW5kICYgRmFzdENhcHR1cmVTdGF0ZTo6V1JJVEUpIHsKKyAgICAgICAgQUxPR19BU1NFUlQocGlwZVNpbmsgIT0gTlVMTCk7CisgICAgICAgIEFMT0dfQVNTRVJUKHJlYWRCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIGlmIChyZWFkQnVmZmVyU3RhdGUgPCAwKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCk7CisgICAgICAgICAgICAvLyBGSVhNRSBmcmFtZVNpemUKKyAgICAgICAgICAgIG1lbXNldChyZWFkQnVmZmVyLCAwLCBmcmFtZUNvdW50ICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KSk7CisgICAgICAgICAgICByZWFkQnVmZmVyU3RhdGUgPSBmcmFtZUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmIChyZWFkQnVmZmVyU3RhdGUgPiAwKSB7CisgICAgICAgICAgICBzc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPSBwaXBlU2luay0+d3JpdGUocmVhZEJ1ZmZlciwgcmVhZEJ1ZmZlclN0YXRlKTsKKyAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgc3VwcG9ydHMgYXQgbW9zdCBvbmUgZmFzdCBjYXB0dXJlIGNsaWVudC4KKyAgICAgICAgICAgIC8vICAgICAgIFRvIGhhbmRsZSBtdWx0aXBsZSBjbGllbnRzIHRoaXMgY291bGQgYmUgY29udmVydGVkIHRvIGFuIGFycmF5LAorICAgICAgICAgICAgLy8gICAgICAgb3Igd2l0aCBhIGxvdCBtb3JlIHdvcmsgdGhlIGNvbnRyb2wgYmxvY2sgY291bGQgYmUgc2hhcmVkIGJ5IGFsbCBjbGllbnRzLgorICAgICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gY3VycmVudC0+bUNibGs7CisgICAgICAgICAgICBpZiAoY2JsayAhPSBOVUxMICYmIGZyYW1lc1dyaXR0ZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZWFyID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyOworICAgICAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoZnJhbWVzV3JpdHRlbiArIHJlYXIsICZjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXIpOworICAgICAgICAgICAgICAgIGNibGstPm1TZXJ2ZXIgKz0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX29yKENCTEtfRlVURVhfV0FLRSwgJmNibGstPm1GdXRleCk7CisgICAgICAgICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgaXMgbmV2ZXIgaW4gc2VydmVyIHByb2Nlc3MsIHNvIGRvbid0IHVzZSBGVVRFWF9XQUtFX1BSSVZBVEUKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwgRlVURVhfV0FLRSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitGYXN0Q2FwdHVyZUR1bXBTdGF0ZTo6RmFzdENhcHR1cmVEdW1wU3RhdGUoKSA6IEZhc3RUaHJlYWREdW1wU3RhdGUoKSwKKyAgICBtUmVhZFNlcXVlbmNlKDApLCBtRnJhbWVzUmVhZCgwKSwgbVJlYWRFcnJvcnMoMCksIG1TYW1wbGVSYXRlKDApLCBtRnJhbWVDb3VudCgwKQoreworfQorCitGYXN0Q2FwdHVyZUR1bXBTdGF0ZTo6fkZhc3RDYXB0dXJlRHVtcFN0YXRlKCkKK3sKK30KKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzViOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfQ0FQVFVSRV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX0gKKworI2luY2x1ZGUgIkZhc3RUaHJlYWQuaCIKKyNpbmNsdWRlICJTdGF0ZVF1ZXVlLmgiCisjaW5jbHVkZSAiRmFzdENhcHR1cmVTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3R5cGVkZWYgU3RhdGVRdWV1ZTxGYXN0Q2FwdHVyZVN0YXRlPiBGYXN0Q2FwdHVyZVN0YXRlUXVldWU7CisKK3N0cnVjdCBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSA6IEZhc3RUaHJlYWREdW1wU3RhdGUgeworICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlKCk7CisgICAgLyp2aXJ0dWFsKi8gfkZhc3RDYXB0dXJlRHVtcFN0YXRlKCk7CisKKyAgICAvLyBGSVhNRSBieSByZW5hbWluZywgY291bGQgcHVsbCB1cCBtYW55IG9mIHRoZXNlIHRvIEZhc3RUaHJlYWREdW1wU3RhdGUKKyAgICB1aW50MzJfdCBtUmVhZFNlcXVlbmNlOyAgICAgLy8gaW5jcmVtZW50ZWQgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHJlYWQoKQorICAgIHVpbnQzMl90IG1GcmFtZXNSZWFkOyAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHJlYWQgc3VjY2Vzc2Z1bGx5CisgICAgdWludDMyX3QgbVJlYWRFcnJvcnM7ICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiByZWFkKCkgZXJyb3JzCisgICAgdWludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90ICAgbUZyYW1lQ291bnQ7Cit9OworCitjbGFzcyBGYXN0Q2FwdHVyZSA6IHB1YmxpYyBGYXN0VGhyZWFkIHsKKworcHVibGljOgorICAgICAgICAgICAgRmFzdENhcHR1cmUoKTsKKyAgICB2aXJ0dWFsIH5GYXN0Q2FwdHVyZSgpOworCisgICAgICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlUXVldWUqICBzcSgpOworCitwcml2YXRlOgorICAgICAgICAgICAgRmFzdENhcHR1cmVTdGF0ZVF1ZXVlICAgbVNROworCisgICAgLy8gY2FsbG91dHMKKyAgICB2aXJ0dWFsIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqcG9sbCgpOworICAgIHZpcnR1YWwgdm9pZCBzZXRMb2coTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25JZGxlKCk7CisgICAgdmlydHVhbCB2b2lkIG9uRXhpdCgpOworICAgIHZpcnR1YWwgYm9vbCBpc1N1YkNsYXNzQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCk7CisgICAgdmlydHVhbCB2b2lkIG9uU3RhdGVDaGFuZ2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrKCk7CisKKyAgICBzdGF0aWMgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSBpbml0aWFsOworICAgIEZhc3RDYXB0dXJlU3RhdGUgcHJlSWRsZTsgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKKyAgICAvLyBGSVhNRSBieSByZW5hbWluZywgY291bGQgcHVsbCB1cCBtYW55IG9mIHRoZXNlIHRvIEZhc3RUaHJlYWQKKyAgICBOQkFJT19Tb3VyY2UgKmlucHV0U291cmNlOworICAgIGludCBpbnB1dFNvdXJjZUdlbjsKKyAgICBOQkFJT19TaW5rICpwaXBlU2luazsKKyAgICBpbnQgcGlwZVNpbmtHZW47CisgICAgc2hvcnQgKnJlYWRCdWZmZXI7CisgICAgc3NpemVfdCByZWFkQnVmZmVyU3RhdGU7ICAgIC8vIG51bWJlciBvZiBpbml0aWFsaXplZCBmcmFtZXMgaW4gcmVhZEJ1ZmZlciwgb3IgLTEgdG8gY2xlYXIKKyAgICBOQkFJT19Gb3JtYXQgZm9ybWF0OworICAgIHVuc2lnbmVkIHNhbXBsZVJhdGU7CisgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgZHVtbXlEdW1wU3RhdGU7CisgICAgdWludDMyX3QgdG90YWxOYXRpdmVGcmFtZXNSZWFkOyAvLyBjb3BpZWQgdG8gZHVtcFN0YXRlLT5tRnJhbWVzUmVhZAorCit9OyAgLy8gY2xhc3MgRmFzdENhcHR1cmUKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApjb3B5IHRvIHNlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmNwcAppbmRleCAxM2NhYzZkLi4xZDAyOWI3Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAorI2luY2x1ZGUgIkZhc3RDYXB0dXJlU3RhdGUuaCIKIAotLyogLS0tLS0gTWFpbiBmZWF0dXJlcyAtLS0tLSAqLwotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgiIC8qIFRyYW5zY29kZXIgKi8KK25hbWVzcGFjZSBhbmRyb2lkIHsKIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworRmFzdENhcHR1cmVTdGF0ZTo6RmFzdENhcHR1cmVTdGF0ZSgpIDogRmFzdFRocmVhZFN0YXRlKCksCisgICAgbUlucHV0U291cmNlKE5VTEwpLCBtSW5wdXRTb3VyY2VHZW4oMCksIG1QaXBlU2luayhOVUxMKSwgbVBpcGVTaW5rR2VuKDApLCBtRnJhbWVDb3VudCgwKQoreworfQogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCitGYXN0Q2FwdHVyZVN0YXRlOjp+RmFzdENhcHR1cmVTdGF0ZSgpCit7Cit9CiAKK30gICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWM4NjVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfQ0FQVFVSRV9TVEFURV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX1NUQVRFX0gKKworI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CisjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCisjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gUmVwcmVzZW50IGEgc2luZ2xlIHN0YXRlIG9mIHRoZSBmYXN0IGNhcHR1cmUKK3N0cnVjdCBGYXN0Q2FwdHVyZVN0YXRlIDogRmFzdFRocmVhZFN0YXRlIHsKKyAgICAgICAgICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlKCk7CisgICAgLyp2aXJ0dWFsKi8gfkZhc3RDYXB0dXJlU3RhdGUoKTsKKworICAgIC8vIGFsbCBwb2ludGVyIGZpZWxkcyB1c2UgcmF3IHBvaW50ZXJzOyBvYmplY3RzIGFyZSBvd25lZCBhbmQgcmVmLWNvdW50ZWQgYnkgUmVjb3JkVGhyZWFkCisgICAgTkJBSU9fU291cmNlICAgICptSW5wdXRTb3VyY2U7ICAgICAgLy8gSEFMIGlucHV0IGRldmljZSwgbXVzdCBhbHJlYWR5IGJlIG5lZ290aWF0ZWQKKyAgICAvLyBGSVhNRSBieSByZW5hbWluZywgY291bGQgcHVsbCB1cCB0aGVzZSBmaWVsZHMgdG8gRmFzdFRocmVhZFN0YXRlCisgICAgaW50ICAgICAgICAgICAgIG1JbnB1dFNvdXJjZUdlbjsgICAgLy8gaW5jcmVtZW50IHdoZW4gbUlucHV0U291cmNlIGlzIGFzc2lnbmVkCisgICAgTkJBSU9fU2luayAgICAgICptUGlwZVNpbms7ICAgICAgICAgLy8gYWZ0ZXIgcmVhZGluZyBmcm9tIGlucHV0IHNvdXJjZSwgd3JpdGUgdG8gdGhpcyBwaXBlIHNpbmsKKyAgICBpbnQgICAgICAgICAgICAgbVBpcGVTaW5rR2VuOyAgICAgICAvLyBpbmNyZW1lbnQgd2hlbiBtUGlwZVNpbmsgaXMgYXNzaWduZWQKKyAgICBzaXplX3QgICAgICAgICAgbUZyYW1lQ291bnQ7ICAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHBlciBmYXN0IGNhcHR1cmUgYnVmZmVyCisgICAgYXVkaW9fdHJhY2tfY2Jsa190ICAqbUNibGs7ICAgICAgICAgLy8gY29udHJvbCBibG9jayBmb3IgdGhlIHNpbmdsZSBmYXN0IGNsaWVudCwgb3IgTlVMTAorCisgICAgLy8gRXh0ZW5kcyBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQKKyAgICBzdGF0aWMgY29uc3QgQ29tbWFuZAorICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFsc28gcHJvY2VzcyBjb25maWd1cmF0aW9uIGNoYW5nZXMsIGFuZCBjYW4gYmUgIm9yImVkOgorICAgICAgICBSRUFEID0gMHg4LCAgICAgICAgICAgICAvLyByZWFkIGZyb20gaW5wdXQgc291cmNlCisgICAgICAgIFdSSVRFID0gMHgxMCwgICAgICAgICAgIC8vIHdyaXRlIHRvIHBpcGUgc2luaworICAgICAgICBSRUFEX1dSSVRFID0gMHgxODsgICAgICAvLyByZWFkIGZyb20gaW5wdXQgc291cmNlIGFuZCB3cml0ZSB0byBwaXBlIHNpbmsKKworfTsgIC8vIHN0cnVjdCBGYXN0Q2FwdHVyZVN0YXRlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX1NUQVRFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKaW5kZXggZjI3ZWExNy4uMjY3OGNiZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKQEAgLTI2LDcgKzI2LDYgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0FVRElPCiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCi0jaW5jbHVkZSA8c3lzL2F0b21pY3MuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KQEAgLTM3LDYzOSArMzYsNDM2IEBACiAjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KICNlbmRpZgogI2VuZGlmCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CiAjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgogCi0jZGVmaW5lIEZBU1RfSE9UX0lETEVfTlMgICAgIDEwMDAwMDBMICAgLy8gMSBtczogdGltZSB0byBzbGVlcCB3aGlsZSBob3QgaWRsaW5nCi0jZGVmaW5lIEZBU1RfREVGQVVMVF9OUyAgICA5OTk5OTk5OTlMICAgLy8gfjEgc2VjOiBkZWZhdWx0IHRpbWUgdG8gc2xlZXAKLSNkZWZpbmUgTUlOX1dBUk1VUF9DWUNMRVMgICAgICAgICAgMiAgICAvLyBtaW5pbXVtIG51bWJlciBvZiBsb29wIGN5Y2xlcyB0byB3YWl0IGZvciB3YXJtdXAKLSNkZWZpbmUgTUFYX1dBUk1VUF9DWUNMRVMgICAgICAgICAxMCAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBsb29wIGN5Y2xlcyB0byB3YWl0IGZvciB3YXJtdXAKLQogI2RlZmluZSBGQ0NfMiAgICAgICAgICAgICAgICAgICAgICAgMiAgIC8vIGZpeGVkIGNoYW5uZWwgY291bnQgYXNzdW1wdGlvbgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIEZhc3QgbWl4ZXIgdGhyZWFkCi1ib29sIEZhc3RNaXhlcjo6dGhyZWFkTG9vcCgpCisvKnN0YXRpYyovIGNvbnN0IEZhc3RNaXhlclN0YXRlIEZhc3RNaXhlcjo6aW5pdGlhbDsKKworRmFzdE1peGVyOjpGYXN0TWl4ZXIoKSA6IEZhc3RUaHJlYWQoKSwKKyAgICBzbG9wTnMoMCksCisgICAgLy8gZmFzdFRyYWNrTmFtZXMKKyAgICAvLyBnZW5lcmF0aW9ucworICAgIG91dHB1dFNpbmsoTlVMTCksCisgICAgb3V0cHV0U2lua0dlbigwKSwKKyAgICBtaXhlcihOVUxMKSwKKyAgICBtU2lua0J1ZmZlcihOVUxMKSwKKyAgICBtU2lua0J1ZmZlclNpemUoMCksCisgICAgbVNpbmtDaGFubmVsQ291bnQoRkNDXzIpLAorICAgIG1NaXhlckJ1ZmZlcihOVUxMKSwKKyAgICBtTWl4ZXJCdWZmZXJTaXplKDApLAorICAgIG1NaXhlckJ1ZmZlckZvcm1hdChBVURJT19GT1JNQVRfUENNXzE2X0JJVCksCisgICAgbU1peGVyQnVmZmVyU3RhdGUoVU5ERUZJTkVEKSwKKyAgICBmb3JtYXQoRm9ybWF0X0ludmFsaWQpLAorICAgIHNhbXBsZVJhdGUoMCksCisgICAgZmFzdFRyYWNrc0dlbigwKSwKKyAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4oMCksCisgICAgLy8gdGltZXN0YW1wCisgICAgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCgwKSAgIC8vIHRoZSA9IDAgaXMgdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIKIHsKLSAgICBzdGF0aWMgY29uc3QgRmFzdE1peGVyU3RhdGUgaW5pdGlhbDsKLSAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqcHJldmlvdXMgPSAmaW5pdGlhbCwgKmN1cnJlbnQgPSAmaW5pdGlhbDsKLSAgICBGYXN0TWl4ZXJTdGF0ZSBwcmVJZGxlOyAvLyBjb3B5IG9mIHN0YXRlIGJlZm9yZSB3ZSB3ZW50IGludG8gaWRsZQotICAgIHN0cnVjdCB0aW1lc3BlYyBvbGRUcyA9IHswLCAwfTsKLSAgICBib29sIG9sZFRzVmFsaWQgPSBmYWxzZTsKLSAgICBsb25nIHNsb3BOcyA9IDA7ICAgIC8vIGFjY3VtdWxhdGVkIHRpbWUgd2UndmUgd29rZW4gdXAgdG9vIGVhcmx5ICg+IDApIG9yIHRvbyBsYXRlICg8IDApCi0gICAgbG9uZyBzbGVlcE5zID0gLTE7ICAvLyAtMTogYnVzeSB3YWl0LCAwOiBzY2hlZF95aWVsZCwgPiAwOiBuYW5vc2xlZXAKLSAgICBpbnQgZmFzdFRyYWNrTmFtZXNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsgLy8gaGFuZGxlcyB1c2VkIGJ5IG1peGVyIHRvIGlkZW50aWZ5IHRyYWNrcwotICAgIGludCBnZW5lcmF0aW9uc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOyAgICAvLyBsYXN0IG9ic2VydmVkIG1GYXN0VHJhY2tzW2ldLm1HZW5lcmF0aW9uCisgICAgLy8gRklYTUUgcGFzcyBpbml0aWFsIGFzIHBhcmFtZXRlciB0byBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yLCBhbmQgbWFrZSBpdCBzdGF0aWMgbG9jYWwKKyAgICBwcmV2aW91cyA9ICZpbml0aWFsOworICAgIGN1cnJlbnQgPSAmaW5pdGlhbDsKKworICAgIG1EdW1teUR1bXBTdGF0ZSA9ICZkdW1teUR1bXBTdGF0ZTsKKyAgICAvLyBUT0RPOiBBZGQgY2hhbm5lbCBtYXNrIHRvIE5CQUlPX0Zvcm1hdC4KKyAgICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgY2hhbm5lbCBtYXNrIG11c3QgYmUgYSB2YWxpZCBwb3NpdGlvbmFsIGNoYW5uZWwgbWFzay4KKyAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKKwogICAgIHVuc2lnbmVkIGk7CiAgICAgZm9yIChpID0gMDsgaSA8IEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrczsgKytpKSB7CiAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7CiAgICAgICAgIGdlbmVyYXRpb25zW2ldID0gMDsKICAgICB9Ci0gICAgTkJBSU9fU2luayAqb3V0cHV0U2luayA9IE5VTEw7Ci0gICAgaW50IG91dHB1dFNpbmtHZW4gPSAwOwotICAgIEF1ZGlvTWl4ZXIqIG1peGVyID0gTlVMTDsKLSAgICBzaG9ydCAqbWl4QnVmZmVyID0gTlVMTDsKLSAgICBlbnVtIHtVTkRFRklORUQsIE1JWEVELCBaRVJPRUR9IG1peEJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOwotICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsKLSAgICB1bnNpZ25lZCBzYW1wbGVSYXRlID0gMDsKLSAgICBpbnQgZmFzdFRyYWNrc0dlbiA9IDA7Ci0gICAgbG9uZyBwZXJpb2ROcyA9IDA7ICAgICAgLy8gZXhwZWN0ZWQgcGVyaW9kOyB0aGUgdGltZSByZXF1aXJlZCB0byByZW5kZXIgb25lIG1peCBidWZmZXIKLSAgICBsb25nIHVuZGVycnVuTnMgPSAwOyAgICAvLyB1bmRlcnJ1biBsaWtlbHkgd2hlbiB3cml0ZSBjeWNsZSBpcyBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZQotICAgIGxvbmcgb3ZlcnJ1bk5zID0gMDsgICAgIC8vIG92ZXJydW4gbGlrZWx5IHdoZW4gd3JpdGUgY3ljbGUgaXMgbGVzcyB0aGFuIHRoaXMgdmFsdWUKLSAgICBsb25nIGZvcmNlTnMgPSAwOyAgICAgICAvLyBpZiBvdmVycnVuIGRldGVjdGVkLCBmb3JjZSB0aGUgd3JpdGUgY3ljbGUgdG8gdGFrZSB0aGlzIG11Y2ggdGltZQotICAgIGxvbmcgd2FybXVwTnMgPSAwOyAgICAgIC8vIHdhcm11cCBjb21wbGV0ZSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGdyZWF0ZXIgdGhhbiB0byB0aGlzIHZhbHVlCi0gICAgRmFzdE1peGVyRHVtcFN0YXRlIGR1bW15RHVtcFN0YXRlLCAqZHVtcFN0YXRlID0gJmR1bW15RHVtcFN0YXRlOwotICAgIGJvb2wgaWdub3JlTmV4dE92ZXJydW4gPSB0cnVlOyAgLy8gdXNlZCB0byBpZ25vcmUgaW5pdGlhbCBvdmVycnVuIGFuZCBmaXJzdCBhZnRlciBhbiB1bmRlcnJ1bgogI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgIHN0cnVjdCB0aW1lc3BlYyBvbGRMb2FkID0gezAsIDB9OyAgICAvLyBwcmV2aW91cyB2YWx1ZSBvZiBjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEKQotICAgIGJvb2wgb2xkTG9hZFZhbGlkID0gZmFsc2U7ICAvLyB3aGV0aGVyIG9sZExvYWQgaXMgdmFsaWQKLSAgICB1aW50MzJfdCBib3VuZHMgPSAwOwotICAgIGJvb2wgZnVsbCA9IGZhbHNlOyAgICAgIC8vIHdoZXRoZXIgd2UgaGF2ZSBjb2xsZWN0ZWQgYXQgbGVhc3QgbVNhbXBsaW5nTiBzYW1wbGVzCi0jaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgVGhyZWFkQ3B1VXNhZ2UgdGN1OyAgICAgLy8gZm9yIHJlYWRpbmcgdGhlIGN1cnJlbnQgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoKKyAgICBvbGRMb2FkLnR2X3NlYyA9IDA7CisgICAgb2xkTG9hZC50dl9uc2VjID0gMDsKICNlbmRpZgotI2VuZGlmCi0gICAgdW5zaWduZWQgY29sZEdlbiA9IDA7ICAgLy8gbGFzdCBvYnNlcnZlZCBtQ29sZEdlbgotICAgIGJvb2wgaXNXYXJtID0gZmFsc2U7ICAgIC8vIHRydWUgbWVhbnMgcmVhZHkgdG8gbWl4LCBmYWxzZSBtZWFucyB3YWl0IGZvciB3YXJtdXAgYmVmb3JlIG1peGluZwotICAgIHN0cnVjdCB0aW1lc3BlYyBtZWFzdXJlZFdhcm11cFRzID0gezAsIDB9OyAgLy8gaG93IGxvbmcgZGlkIGl0IHRha2UgZm9yIHdhcm11cCB0byBjb21wbGV0ZQotICAgIHVpbnQzMl90IHdhcm11cEN5Y2xlcyA9IDA7ICAvLyBjb3VudGVyIG9mIG51bWJlciBvZiBsb29wIGN5Y2xlcyByZXF1aXJlZCB0byB3YXJtdXAKLSAgICBOQkFJT19TaW5rKiB0ZWVTaW5rID0gTlVMTDsgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKCkgdG8gdGhpcyBub24tYmxvY2tpbmcgc2luawotICAgIE5CTG9nOjpXcml0ZXIgZHVtbXlMb2dXcml0ZXIsICpsb2dXcml0ZXIgPSAmZHVtbXlMb2dXcml0ZXI7Ci0gICAgdWludDMyX3QgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuID0gMDsgIC8vIGNvcGllZCB0byBkdW1wU3RhdGUtPm1GcmFtZXNXcml0dGVuCit9CiAKLSAgICAvLyBuZXh0IDIgZmllbGRzIGFyZSB2YWxpZCBvbmx5IHdoZW4gdGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SCi0gICAgQXVkaW9UaW1lc3RhbXAgdGltZXN0YW1wOwotICAgIHVpbnQzMl90IG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPSAwOyAgICAvLyB0aGUgPSAwIGlzIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCi0gICAgc3RhdHVzX3QgdGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CitGYXN0TWl4ZXI6On5GYXN0TWl4ZXIoKQoreworfQogCi0gICAgZm9yICg7OykgeworRmFzdE1peGVyU3RhdGVRdWV1ZSogRmFzdE1peGVyOjpzcSgpCit7CisgICAgcmV0dXJuICZtU1E7Cit9CiAKLSAgICAgICAgLy8gZWl0aGVyIG5hbm9zbGVlcCwgc2NoZWRfeWllbGQsIG9yIGJ1c3kgd2FpdAotICAgICAgICBpZiAoc2xlZXBOcyA+PSAwKSB7Ci0gICAgICAgICAgICBpZiAoc2xlZXBOcyA+IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChzbGVlcE5zIDwgMTAwMDAwMDAwMCk7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjIHJlcSA9IHswLCBzbGVlcE5zfTsKLSAgICAgICAgICAgICAgICBuYW5vc2xlZXAoJnJlcSwgTlVMTCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNjaGVkX3lpZWxkKCk7Citjb25zdCBGYXN0VGhyZWFkU3RhdGUgKkZhc3RNaXhlcjo6cG9sbCgpCit7CisgICAgcmV0dXJuIG1TUS5wb2xsKCk7Cit9CisKK3ZvaWQgRmFzdE1peGVyOjpzZXRMb2coTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyKQoreworICAgIGlmIChtaXhlciAhPSBOVUxMKSB7CisgICAgICAgIG1peGVyLT5zZXRMb2cobG9nV3JpdGVyKTsKKyAgICB9Cit9CisKK3ZvaWQgRmFzdE1peGVyOjpvbklkbGUoKQoreworICAgIHByZUlkbGUgPSAqKGNvbnN0IEZhc3RNaXhlclN0YXRlICopY3VycmVudDsKKyAgICBjdXJyZW50ID0gJnByZUlkbGU7Cit9CisKK3ZvaWQgRmFzdE1peGVyOjpvbkV4aXQoKQoreworICAgIGRlbGV0ZSBtaXhlcjsKKyAgICBmcmVlKG1NaXhlckJ1ZmZlcik7CisgICAgZnJlZShtU2lua0J1ZmZlcik7Cit9CisKK2Jvb2wgRmFzdE1peGVyOjppc1N1YkNsYXNzQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCkKK3sKKyAgICBzd2l0Y2ggKChGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCkgY29tbWFuZCkgeworICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6Ok1JWDoKKyAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpXUklURToKKyAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpNSVhfV1JJVEU6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlKCkKK3sKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgdGhpcy0+Y3VycmVudDsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIHRoaXMtPnByZXZpb3VzOworICAgIEZhc3RNaXhlckR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0TWl4ZXJEdW1wU3RhdGUgKikgdGhpcy0+ZHVtcFN0YXRlOworICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CisKKyAgICAvLyBoYW5kbGUgc3RhdGUgY2hhbmdlIGhlcmUsIGJ1dCBzaW5jZSB3ZSB3YW50IHRvIGRpZmYgdGhlIHN0YXRlLAorICAgIC8vIHdlJ3JlIHByZXBhcmVkIGZvciBwcmV2aW91cyA9PSAmaW5pdGlhbCB0aGUgZmlyc3QgdGltZSB0aHJvdWdoCisgICAgdW5zaWduZWQgcHJldmlvdXNUcmFja01hc2s7CisKKyAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIG91dHB1dCBIQUwgY29uZmlndXJhdGlvbgorICAgIE5CQUlPX0Zvcm1hdCBwcmV2aW91c0Zvcm1hdCA9IGZvcm1hdDsKKyAgICBpZiAoY3VycmVudC0+bU91dHB1dFNpbmtHZW4gIT0gb3V0cHV0U2lua0dlbikgeworICAgICAgICBvdXRwdXRTaW5rID0gY3VycmVudC0+bU91dHB1dFNpbms7CisgICAgICAgIG91dHB1dFNpbmtHZW4gPSBjdXJyZW50LT5tT3V0cHV0U2lua0dlbjsKKyAgICAgICAgaWYgKG91dHB1dFNpbmsgPT0gTlVMTCkgeworICAgICAgICAgICAgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gMDsKKyAgICAgICAgICAgIG1TaW5rQ2hhbm5lbENvdW50ID0gMDsKKyAgICAgICAgICAgIG1TaW5rQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3JtYXQgPSBvdXRwdXRTaW5rLT5mb3JtYXQoKTsKKyAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpOworICAgICAgICAgICAgbVNpbmtDaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1TaW5rQ2hhbm5lbENvdW50ID4gQXVkaW9NaXhlcjo6TUFYX05VTV9DSEFOTkVMUyk7CisKKyAgICAgICAgICAgIC8vIFRPRE86IEFkZCBjaGFubmVsIG1hc2sgdG8gTkJBSU9fRm9ybWF0CisgICAgICAgICAgICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgY2hhbm5lbCBtYXNrIG11c3QgYmUgYSB2YWxpZCBwb3NpdGlvbmFsIGNoYW5uZWwgbWFzay4KKyAgICAgICAgICAgIG1TaW5rQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobVNpbmtDaGFubmVsQ291bnQpOworICAgICAgICB9CisgICAgICAgIGR1bXBTdGF0ZS0+bVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIH0KKworICAgIGlmICgoIUZvcm1hdF9pc0VxdWFsKGZvcm1hdCwgcHJldmlvdXNGb3JtYXQpKSB8fCAoZnJhbWVDb3VudCAhPSBwcmV2aW91cy0+bUZyYW1lQ291bnQpKSB7CisgICAgICAgIC8vIEZJWE1FIHRvIGF2b2lkIHByaW9yaXR5IGludmVyc2lvbiwgZG9uJ3QgZGVsZXRlIGhlcmUKKyAgICAgICAgZGVsZXRlIG1peGVyOworICAgICAgICBtaXhlciA9IE5VTEw7CisgICAgICAgIGZyZWUobU1peGVyQnVmZmVyKTsKKyAgICAgICAgbU1peGVyQnVmZmVyID0gTlVMTDsKKyAgICAgICAgZnJlZShtU2lua0J1ZmZlcik7CisgICAgICAgIG1TaW5rQnVmZmVyID0gTlVMTDsKKyAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIHNhbXBsZVJhdGUgPiAwKSB7CisgICAgICAgICAgICAvLyBGSVhNRSBuZXcgbWF5IGJsb2NrIGZvciB1bmJvdW5kZWQgdGltZSBhdCBpbnRlcm5hbCBtdXRleCBvZiB0aGUgaGVhcAorICAgICAgICAgICAgLy8gICAgICAgaW1wbGVtZW50YXRpb247IGl0IHdvdWxkIGJlIGJldHRlciB0byBoYXZlIG5vcm1hbCBtaXhlciBhbGxvY2F0ZSBmb3IgdXMKKyAgICAgICAgICAgIC8vICAgICAgIHRvIGF2b2lkIGJsb2NraW5nIGhlcmUgYW5kIHRvIHByZXZlbnQgcG9zc2libGUgcHJpb3JpdHkgaW52ZXJzaW9uCisgICAgICAgICAgICBtaXhlciA9IG5ldyBBdWRpb01peGVyKGZyYW1lQ291bnQsIHNhbXBsZVJhdGUsIEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcyk7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgbWl4ZXJGcmFtZVNpemUgPSBtU2lua0NoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobU1peGVyQnVmZmVyRm9ybWF0KTsKKyAgICAgICAgICAgIG1NaXhlckJ1ZmZlclNpemUgPSBtaXhlckZyYW1lU2l6ZSAqIGZyYW1lQ291bnQ7CisgICAgICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbU1peGVyQnVmZmVyLCAzMiwgbU1peGVyQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2lua0ZyYW1lU2l6ZSA9IG1TaW5rQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQubUZvcm1hdCk7CisgICAgICAgICAgICBpZiAoc2lua0ZyYW1lU2l6ZSA+IG1peGVyRnJhbWVTaXplKSB7IC8vIG5lZWQgYSBzaW5rIGJ1ZmZlcgorICAgICAgICAgICAgICAgIG1TaW5rQnVmZmVyU2l6ZSA9IHNpbmtGcmFtZVNpemUgKiBmcmFtZUNvdW50OworICAgICAgICAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtU2lua0J1ZmZlciwgMzIsIG1TaW5rQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBwZXJpb2ROcyA9IChmcmFtZUNvdW50ICogMTAwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDEuMDAKKyAgICAgICAgICAgIHVuZGVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDE3NTAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgLy8gMS43NQorICAgICAgICAgICAgb3ZlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiA1MDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAvLyAwLjUwCisgICAgICAgICAgICBmb3JjZU5zID0gKGZyYW1lQ291bnQgKiA5NTAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAgIC8vIDAuOTUKKyAgICAgICAgICAgIHdhcm11cE5zID0gKGZyYW1lQ291bnQgKiA1MDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAgLy8gMC41MAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGVyaW9kTnMgPSAwOworICAgICAgICAgICAgdW5kZXJydW5OcyA9IDA7CisgICAgICAgICAgICBvdmVycnVuTnMgPSAwOworICAgICAgICAgICAgZm9yY2VOcyA9IDA7CisgICAgICAgICAgICB3YXJtdXBOcyA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgLy8gZGVmYXVsdCB0byBsb25nIHNsZWVwIGZvciBuZXh0IGN5Y2xlCi0gICAgICAgIHNsZWVwTnMgPSBGQVNUX0RFRkFVTFRfTlM7Ci0KLSAgICAgICAgLy8gcG9sbCBmb3Igc3RhdGUgY2hhbmdlCi0gICAgICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICpuZXh0ID0gbVNRLnBvbGwoKTsKLSAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkgewotICAgICAgICAgICAgLy8gY29udGludWUgdG8gdXNlIHRoZSBkZWZhdWx0IGluaXRpYWwgc3RhdGUgdW50aWwgYSByZWFsIHN0YXRlIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgQUxPR19BU1NFUlQoY3VycmVudCA9PSAmaW5pdGlhbCAmJiBwcmV2aW91cyA9PSAmaW5pdGlhbCk7Ci0gICAgICAgICAgICBuZXh0ID0gY3VycmVudDsKKyAgICAgICAgbU1peGVyQnVmZmVyU3RhdGUgPSBVTkRFRklORUQ7CisjaWYgIUxPR19OREVCVUcKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrczsgKytpKSB7CisgICAgICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwogICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLy8gd2UgbmVlZCB0byByZWNvbmZpZ3VyZSBhbGwgYWN0aXZlIHRyYWNrcworICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IDA7CisgICAgICAgIGZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAtIDE7CisgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gcHJldmlvdXMtPm1UcmFja01hc2s7CisgICAgfQogCi0gICAgICAgIEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBuZXh0LT5tQ29tbWFuZDsKLSAgICAgICAgaWYgKG5leHQgIT0gY3VycmVudCkgeworICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gYWN0aXZlIHRyYWNrIHNldAorICAgIGNvbnN0IHVuc2lnbmVkIGN1cnJlbnRUcmFja01hc2sgPSBjdXJyZW50LT5tVHJhY2tNYXNrOworICAgIGR1bXBTdGF0ZS0+bVRyYWNrTWFzayA9IGN1cnJlbnRUcmFja01hc2s7CisgICAgaWYgKGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuICE9IGZhc3RUcmFja3NHZW4pIHsKKyAgICAgICAgQUxPR19BU1NFUlQobU1peGVyQnVmZmVyICE9IE5VTEwpOworICAgICAgICBpbnQgbmFtZTsKIAotICAgICAgICAgICAgLy8gQXMgc29vbiBhcyBwb3NzaWJsZSBvZiBsZWFybmluZyBvZiBhIG5ldyBkdW1wIGFyZWEsIHN0YXJ0IHVzaW5nIGl0Ci0gICAgICAgICAgICBkdW1wU3RhdGUgPSBuZXh0LT5tRHVtcFN0YXRlICE9IE5VTEwgPyBuZXh0LT5tRHVtcFN0YXRlIDogJmR1bW15RHVtcFN0YXRlOwotICAgICAgICAgICAgdGVlU2luayA9IG5leHQtPm1UZWVTaW5rOwotICAgICAgICAgICAgbG9nV3JpdGVyID0gbmV4dC0+bU5CTG9nV3JpdGVyICE9IE5VTEwgPyBuZXh0LT5tTkJMb2dXcml0ZXIgOiAmZHVtbXlMb2dXcml0ZXI7CisgICAgICAgIC8vIHByb2Nlc3MgcmVtb3ZlZCB0cmFja3MgZmlyc3QgdG8gYXZvaWQgcnVubmluZyBvdXQgb2YgdHJhY2sgbmFtZXMKKyAgICAgICAgdW5zaWduZWQgcmVtb3ZlZFRyYWNrcyA9IHByZXZpb3VzVHJhY2tNYXNrICYgfmN1cnJlbnRUcmFja01hc2s7CisgICAgICAgIHdoaWxlIChyZW1vdmVkVHJhY2tzICE9IDApIHsKKyAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihyZW1vdmVkVHJhY2tzKTsKKyAgICAgICAgICAgIHJlbW92ZWRUcmFja3MgJj0gfigxIDw8IGkpOworICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CisgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlciA9PSBOVUxMKTsKICAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPnNldExvZyhsb2dXcml0ZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIGFsd2F5cyBoYXZlIGEgdmFsaWQgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyAobm9uLWlkbGUpIHN0YXRlLgotICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIHN0YXRlIHF1ZXVlIG9ubHkgZ3VhcmFudGVlcyBhY2Nlc3MgdG8gY3VycmVudCBhbmQgcHJldmlvdXMgc3RhdGVzLgotICAgICAgICAgICAgLy8gU28gd2hlbiB0aGVyZSBpcyBhIHRyYW5zaXRpb24gZnJvbSBhIG5vbi1pZGxlIHN0YXRlIGludG8gYW4gaWRsZSBzdGF0ZSwgd2UgbWFrZSBhCi0gICAgICAgICAgICAvLyBjb3B5IG9mIHRoZSBsYXN0IGtub3duIG5vbi1pZGxlIHN0YXRlIHNvIGl0IGlzIHN0aWxsIGF2YWlsYWJsZSBvbiByZXR1cm4gZnJvbSBpZGxlLgotICAgICAgICAgICAgLy8gVGhlIHBvc3NpYmxlIHRyYW5zaXRpb25zIGFyZToKLSAgICAgICAgICAgIC8vICBub24taWRsZSAtPiBub24taWRsZSAgICB1cGRhdGUgcHJldmlvdXMgZnJvbSBjdXJyZW50IGluLXBsYWNlCi0gICAgICAgICAgICAvLyAgbm9uLWlkbGUgLT4gaWRsZSAgICAgICAgdXBkYXRlIHByZXZpb3VzIGZyb20gY29weSBvZiBjdXJyZW50Ci0gICAgICAgICAgICAvLyAgaWRsZSAgICAgLT4gaWRsZSAgICAgICAgZG9uJ3QgdXBkYXRlIHByZXZpb3VzCi0gICAgICAgICAgICAvLyAgaWRsZSAgICAgLT4gbm9uLWlkbGUgICAgZG9uJ3QgdXBkYXRlIHByZXZpb3VzCi0gICAgICAgICAgICBpZiAoIShjdXJyZW50LT5tQ29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSkgewotICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlSWRsZSA9ICpjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gJnByZUlkbGU7Ci0gICAgICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSBmYWxzZTsKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICAgICAgb2xkTG9hZFZhbGlkID0gZmFsc2U7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdXJyZW50ID0gbmV4dDsKLSAgICAgICAgfQotI2lmICFMT0dfTkRFQlVHCi0gICAgICAgIG5leHQgPSBOVUxMOyAgICAvLyBub3QgcmVmZXJlbmNlZCBhZ2FpbgotI2VuZGlmCi0KLSAgICAgICAgZHVtcFN0YXRlLT5tQ29tbWFuZCA9IGNvbW1hbmQ7Ci0KLSAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7Ci0gICAgICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OklOSVRJQUw6Ci0gICAgICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOgotICAgICAgICAgICAgc2xlZXBOcyA9IEZBU1RfSE9UX0lETEVfTlM7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6Q09MRF9JRExFOgotICAgICAgICAgICAgLy8gb25seSBwZXJmb3JtIGEgY29sZCBpZGxlIGNvbW1hbmQgb25jZQotICAgICAgICAgICAgLy8gRklYTUUgY29uc2lkZXIgY2hlY2tpbmcgcHJldmlvdXMgc3RhdGUgYW5kIG9ubHkgcGVyZm9ybSBpZiBwcmV2aW91cyAhPSBDT0xEX0lETEUKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5tQ29sZEdlbiAhPSBjb2xkR2VuKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCAqY29sZEZ1dGV4QWRkciA9IGN1cnJlbnQtPm1Db2xkRnV0ZXhBZGRyOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGNvbGRGdXRleEFkZHIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19kZWMoY29sZEZ1dGV4QWRkcik7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9fZnV0ZXhfc3lzY2FsbDQoY29sZEZ1dGV4QWRkciwgRlVURVhfV0FJVF9QUklWQVRFLCBvbGQgLSAxLCBOVUxMKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IHBvbGljeSA9IHNjaGVkX2dldHNjaGVkdWxlcigwKTsKLSAgICAgICAgICAgICAgICBpZiAoIShwb2xpY3kgPT0gU0NIRURfRklGTyB8fCBwb2xpY3kgPT0gU0NIRURfUlIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3QiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBtYXkgYmUgb3Zlcmx5IGNvbnNlcnZhdGl2ZTsgdGhlcmUgY291bGQgYmUgdGltZXMgdGhhdCB0aGUgbm9ybWFsIG1peGVyCi0gICAgICAgICAgICAgICAgLy8gcmVxdWVzdHMgc3VjaCBhIGJyaWVmIGNvbGQgaWRsZSB0aGF0IGl0IGRvZXNuJ3QgcmVxdWlyZSByZXNldHRpbmcgdGhpcyBmbGFnLgotICAgICAgICAgICAgICAgIGlzV2FybSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOwotICAgICAgICAgICAgICAgIHdhcm11cEN5Y2xlcyA9IDA7Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IC0xOwotICAgICAgICAgICAgICAgIGNvbGRHZW4gPSBjdXJyZW50LT5tQ29sZEdlbjsKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICBib3VuZHMgPSAwOwotICAgICAgICAgICAgICAgIGZ1bGwgPSBmYWxzZTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSAhY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZvbGRUcyk7Ci0gICAgICAgICAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNsZWVwTnMgPSBGQVNUX0hPVF9JRExFX05TOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OkVYSVQ6Ci0gICAgICAgICAgICBkZWxldGUgbWl4ZXI7Ci0gICAgICAgICAgICBkZWxldGVbXSBtaXhCdWZmZXI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6Ok1JWDoKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6V1JJVEU6Ci0gICAgICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6Ok1JWF9XUklURToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0ZBVEFMKCJiYWQgY29tbWFuZCAlZCIsIGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlcmUgaXMgYSBub24taWRsZSBzdGF0ZSBhdmFpbGFibGUgdG8gdXM7IGRpZCB0aGUgc3RhdGUgY2hhbmdlPwotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OwotICAgICAgICBpZiAoY3VycmVudCAhPSBwcmV2aW91cykgewotCi0gICAgICAgICAgICAvLyBoYW5kbGUgc3RhdGUgY2hhbmdlIGhlcmUsIGJ1dCBzaW5jZSB3ZSB3YW50IHRvIGRpZmYgdGhlIHN0YXRlLAotICAgICAgICAgICAgLy8gd2UncmUgcHJlcGFyZWQgZm9yIHByZXZpb3VzID09ICZpbml0aWFsIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gKLSAgICAgICAgICAgIHVuc2lnbmVkIHByZXZpb3VzVHJhY2tNYXNrOwotCi0gICAgICAgICAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIG91dHB1dCBIQUwgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IHByZXZpb3VzRm9ybWF0ID0gZm9ybWF0OwotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuICE9IG91dHB1dFNpbmtHZW4pIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRTaW5rID0gY3VycmVudC0+bU91dHB1dFNpbms7Ci0gICAgICAgICAgICAgICAgb3V0cHV0U2lua0dlbiA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuOwotICAgICAgICAgICAgICAgIGlmIChvdXRwdXRTaW5rID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7Ci0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IG91dHB1dFNpbmstPmZvcm1hdCgpOwotICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpID09IEZDQ18yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgoZm9ybWF0ICE9IHByZXZpb3VzRm9ybWF0KSB8fCAoZnJhbWVDb3VudCAhPSBwcmV2aW91cy0+bUZyYW1lQ291bnQpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUUgdG8gYXZvaWQgcHJpb3JpdHkgaW52ZXJzaW9uLCBkb24ndCBkZWxldGUgaGVyZQotICAgICAgICAgICAgICAgIGRlbGV0ZSBtaXhlcjsKLSAgICAgICAgICAgICAgICBtaXhlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgZGVsZXRlW10gbWl4QnVmZmVyOwotICAgICAgICAgICAgICAgIG1peEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIHNhbXBsZVJhdGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG5ldyBtYXkgYmxvY2sgZm9yIHVuYm91bmRlZCB0aW1lIGF0IGludGVybmFsIG11dGV4IG9mIHRoZSBoZWFwCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGltcGxlbWVudGF0aW9uOyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBub3JtYWwgbWl4ZXIgYWxsb2NhdGUgZm9yIHVzCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHRvIGF2b2lkIGJsb2NraW5nIGhlcmUgYW5kIHRvIHByZXZlbnQgcG9zc2libGUgcHJpb3JpdHkgaW52ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgIG1peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZnJhbWVDb3VudCwgc2FtcGxlUmF0ZSwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzKTsKLSAgICAgICAgICAgICAgICAgICAgbWl4QnVmZmVyID0gbmV3IHNob3J0W2ZyYW1lQ291bnQgKiBGQ0NfMl07Ci0gICAgICAgICAgICAgICAgICAgIHBlcmlvZE5zID0gKGZyYW1lQ291bnQgKiAxMDAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMS4wMAotICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiAxNzUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgIC8vIDEuNzUKLSAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiA1MDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAvLyAwLjUwCi0gICAgICAgICAgICAgICAgICAgIGZvcmNlTnMgPSAoZnJhbWVDb3VudCAqIDk1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAgLy8gMC45NQotICAgICAgICAgICAgICAgICAgICB3YXJtdXBOcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgIC8vIDAuNTAKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwZXJpb2ROcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHVuZGVycnVuTnMgPSAwOwotICAgICAgICAgICAgICAgICAgICBvdmVycnVuTnMgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3JjZU5zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgd2FybXVwTnMgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtaXhCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKLSNpZiAhTE9HX05ERUJVRwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVjb25maWd1cmUgYWxsIGFjdGl2ZSB0cmFja3MKLSAgICAgICAgICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IDA7Ci0gICAgICAgICAgICAgICAgZmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuIC0gMTsKLSAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSBwcmV2aW91cy0+bVRyYWNrTWFzazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBhY3RpdmUgdHJhY2sgc2V0Ci0gICAgICAgICAgICB1bnNpZ25lZCBjdXJyZW50VHJhY2tNYXNrID0gY3VycmVudC0+bVRyYWNrTWFzazsKLSAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVRyYWNrTWFzayA9IGN1cnJlbnRUcmFja01hc2s7Ci0gICAgICAgICAgICBpZiAoY3VycmVudC0+bUZhc3RUcmFja3NHZW4gIT0gZmFzdFRyYWNrc0dlbikgewotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG1peEJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBpbnQgbmFtZTsKLQotICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgcmVtb3ZlZCB0cmFja3MgZmlyc3QgdG8gYXZvaWQgcnVubmluZyBvdXQgb2YgdHJhY2sgbmFtZXMKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCByZW1vdmVkVHJhY2tzID0gcHJldmlvdXNUcmFja01hc2sgJiB+Y3VycmVudFRyYWNrTWFzazsKLSAgICAgICAgICAgICAgICB3aGlsZSAocmVtb3ZlZFRyYWNrcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBfX2J1aWx0aW5fY3R6KHJlbW92ZWRUcmFja3MpOwotICAgICAgICAgICAgICAgICAgICByZW1vdmVkVHJhY2tzICY9IH4oMSA8PCBpKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID09IE5VTEwpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5kZWxldGVUcmFja05hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZiAhTE9HX05ERUJVRwotICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHJlc2V0IHRyYWNrIGR1bXAgc3RhdGUsIHNpbmNlIG90aGVyIHNpZGUgaXMgaWdub3JpbmcgaXQKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG5vdyBwcm9jZXNzIGFkZGVkIHRyYWNrcwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFkZGVkVHJhY2tzID0gY3VycmVudFRyYWNrTWFzayAmIH5wcmV2aW91c1RyYWNrTWFzazsKLSAgICAgICAgICAgICAgICB3aGlsZSAoYWRkZWRUcmFja3MgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpID0gX19idWlsdGluX2N0eihhZGRlZFRyYWNrcyk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGVkVHJhY2tzICY9IH4oMSA8PCBpKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGJ1ZmZlclByb3ZpZGVyICE9IE5VTEwgJiYgZmFzdFRyYWNrTmFtZXNbaV0gPT0gLTEpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGluZyBnZXRUcmFja05hbWUgd2l0aCBkZWZhdWx0IGNoYW5uZWwgbWFzayBhbmQgYSByYW5kb20gaW52YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBzZXNzaW9uSWQgKG5vIGVmZmVjdHMgaGVyZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBtaXhlci0+Z2V0VHJhY2tOYW1lKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgLTU1NSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSBuYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBtaXhCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3bHkgYWxsb2NhdGVkIHRyYWNrIG5hbWVzIGRlZmF1bHQgdG8gZnVsbCBzY2FsZSB2b2x1bWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1TYW1wbGVSYXRlICE9IDAgJiYgZmFzdFRyYWNrLT5tU2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlNBTVBMRV9SQVRFLCAodm9pZCopIGZhc3RUcmFjay0+bVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZW5hYmxlKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBmaW5hbGx5IHByb2Nlc3MgKHBvdGVudGlhbGx5KSBtb2RpZmllZCB0cmFja3M7IHRoZXNlIHVzZSB0aGUgc2FtZSBzbG90Ci0gICAgICAgICAgICAgICAgLy8gYnV0IG1heSBoYXZlIGEgZGlmZmVyZW50IGJ1ZmZlciBwcm92aWRlciBvciB2b2x1bWUgcHJvdmlkZXIKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBtb2RpZmllZFRyYWNrcyA9IGN1cnJlbnRUcmFja01hc2sgJiBwcmV2aW91c1RyYWNrTWFzazsKLSAgICAgICAgICAgICAgICB3aGlsZSAobW9kaWZpZWRUcmFja3MgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpID0gX19idWlsdGluX2N0eihtb2RpZmllZFRyYWNrcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkVHJhY2tzICY9IH4oMSA8PCBpKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1HZW5lcmF0aW9uICE9IGdlbmVyYXRpb25zW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRyYWNrIHdhcyBhY3R1YWxseSBtb2RpZmllZAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqYnVmZmVyUHJvdmlkZXIgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gZmFzdFRyYWNrTmFtZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopMHgxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikweDEwMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tU2FtcGxlUmF0ZSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1TYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpTQU1QTEVfUkFURSwgKHZvaWQqKSBmYXN0VHJhY2stPm1TYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFTU9WRSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbjsKLQotICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU51bVRyYWNrcyA9IHBvcGNvdW50KGN1cnJlbnRUcmFja01hc2spOwotICAgICAgICAgICAgfQotCi0jaWYgMSAgIC8vIEZJWE1FIHNob3VsZG4ndCBuZWVkIHRoaXMKLSAgICAgICAgICAgIC8vIG9ubHkgcHJvY2VzcyBzdGF0ZSBjaGFuZ2Ugb25jZQotICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50OwotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICAvLyBkbyB3b3JrIHVzaW5nIGN1cnJlbnQgc3RhdGUgaGVyZQotICAgICAgICBpZiAoKGNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6TUlYKSAmJiAobWl4ZXIgIT0gTlVMTCkgJiYgaXNXYXJtKSB7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChtaXhCdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAvLyBmb3IgZWFjaCB0cmFjaywgdXBkYXRlIHZvbHVtZSBhbmQgY2hlY2sgZm9yIHVuZGVycnVuCi0gICAgICAgICAgICB1bnNpZ25lZCBjdXJyZW50VHJhY2tNYXNrID0gY3VycmVudC0+bVRyYWNrTWFzazsKLSAgICAgICAgICAgIHdoaWxlIChjdXJyZW50VHJhY2tNYXNrICE9IDApIHsKLSAgICAgICAgICAgICAgICBpID0gX19idWlsdGluX2N0eihjdXJyZW50VHJhY2tNYXNrKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2tNYXNrICY9IH4oMSA8PCBpKTsKLSAgICAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLQotICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIHBlci10cmFjayB0aW1lc3RhbXAKLSAgICAgICAgICAgICAgICBpZiAodGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tTYW1wbGVSYXRlID0gZmFzdFRyYWNrLT5tU2FtcGxlUmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgY3VycmVudGx5IG5vIHNhbXBsZSByYXRlIGNvbnZlcnNpb24gZm9yIGZhc3QgdHJhY2tzIGN1cnJlbnRseQotICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2tTYW1wbGVSYXRlICE9IDAgJiYgdHJhY2tTYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdCkgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCAqIHRyYWNrU2FtcGxlUmF0ZSkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0gbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFja0ZyYW1lc1dyaXR0ZW4gPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlci0+ZnJhbWVzUmVsZWFzZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgcHJvdmlkZSBhbiBBdWRpb1RpbWVzdGFtcCBiZWZvcmUgZmlyc3QgZnJhbWUgcHJlc2VudGVkLAotICAgICAgICAgICAgICAgICAgICAvLyBvciBkdXJpbmcgdGhlIGJyaWVmIDMyLWJpdCB3cmFwYXJvdW5kIHdpbmRvdwotICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2tGcmFtZXNXcml0dGVuID49IHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lc3RhbXAgcGVyVHJhY2tUaW1lc3RhbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZXJUcmFja1RpbWVzdGFtcC5tUG9zaXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0ZyYW1lc1dyaXR0ZW4gLSB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZXJUcmFja1RpbWVzdGFtcC5tVGltZSA9IHRpbWVzdGFtcC5tVGltZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5vblRpbWVzdGFtcChwZXJUcmFja1RpbWVzdGFtcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOworICAgICAgICAgICAgICAgIG5hbWUgPSBmYXN0VHJhY2tOYW1lc1tpXTsKICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZsciA9IGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyLT5nZXRWb2x1bWVMUigpOwotICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh2bHIgJiAweEZGRkYpKTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodmxyID4+IDE2KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEZJWE1FIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGZyYW1lc1JlYWR5KCkgZm9yIGZhc3QgdHJhY2tzCi0gICAgICAgICAgICAgICAgLy8gdGFrZXMgYSB0cnlMb2NrLCB3aGljaCBjYW4gYmxvY2sKLSAgICAgICAgICAgICAgICAvLyB1cCB0byAxIG1zLiAgSWYgZW5vdWdoIGFjdGl2ZSB0cmFja3MgYWxsIGJsb2NrZWQgaW4gc2VxdWVuY2UsIHRoaXMgd291bGQgcmVzdWx0Ci0gICAgICAgICAgICAgICAgLy8gaW4gdGhlIG92ZXJhbGwgZmFzdCBtaXggY3ljbGUgYmVpbmcgZGVsYXllZC4gIFNob3VsZCB1c2UgYSBub24tYmxvY2tpbmcgRklGTy4KLSAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzUmVhZHkgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlci0+ZnJhbWVzUmVhZHkoKTsKLSAgICAgICAgICAgICAgICBpZiAoQVRSQUNFX0VOQUJMRUQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJIHdpc2ggd2UgaGFkIGZvcm1hdHRlZCB0cmFjZSBuYW1lcwotICAgICAgICAgICAgICAgICAgICBjaGFyIHRyYWNlTmFtZVsxNl07Ci0gICAgICAgICAgICAgICAgICAgIHN0cmNweSh0cmFjZU5hbWUsICJmUmR5Iik7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs0XSA9IGkgKyAoaSA8IDEwID8gJzAnIDogJ0EnIC0gMTApOwotICAgICAgICAgICAgICAgICAgICB0cmFjZU5hbWVbNV0gPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZSwgZnJhbWVzUmVhZHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGYXN0VHJhY2tEdW1wICpmdER1bXAgPSAmZHVtcFN0YXRlLT5tVHJhY2tzW2ldOwotICAgICAgICAgICAgICAgIEZhc3RUcmFja1VuZGVycnVucyB1bmRlcnJ1bnMgPSBmdER1bXAtPm1VbmRlcnJ1bnM7Ci0gICAgICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWR5IDwgZnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubUVtcHR5Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX0VNUFRZOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmRpc2FibGUobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBtaXhpbmcgcGFydGlhbCBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX1BBUlRJQUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZW5hYmxlKG5hbWUpOworICAgICAgICAgICAgICAgIG1peGVyLT5kZWxldGVUcmFja05hbWUobmFtZSk7CisgICAgICAgICAgICB9CisjaWYgIUxPR19OREVCVUcKKyAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIGRvbid0IHJlc2V0IHRyYWNrIGR1bXAgc3RhdGUsIHNpbmNlIG90aGVyIHNpZGUgaXMgaWdub3JpbmcgaXQKKyAgICAgICAgICAgIGdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBwcm9jZXNzIGFkZGVkIHRyYWNrcworICAgICAgICB1bnNpZ25lZCBhZGRlZFRyYWNrcyA9IGN1cnJlbnRUcmFja01hc2sgJiB+cHJldmlvdXNUcmFja01hc2s7CisgICAgICAgIHdoaWxlIChhZGRlZFRyYWNrcyAhPSAwKSB7CisgICAgICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHooYWRkZWRUcmFja3MpOworICAgICAgICAgICAgYWRkZWRUcmFja3MgJj0gfigxIDw8IGkpOworICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CisgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpidWZmZXJQcm92aWRlciA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOworICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCAmJiBmYXN0VHJhY2tOYW1lc1tpXSA9PSAtMSk7CisgICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG5hbWUgPSBtaXhlci0+Z2V0VHJhY2tOYW1lKGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0LCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7CisgICAgICAgICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSBuYW1lOworICAgICAgICAgICAgICAgIG1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7CisgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NaXhlckJ1ZmZlcik7CisgICAgICAgICAgICAgICAgLy8gbmV3bHkgYWxsb2NhdGVkIHRyYWNrIG5hbWVzIGRlZmF1bHQgdG8gZnVsbCBzY2FsZSB2b2x1bWUKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Rk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUZvcm1hdCk7CisgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZpbmFsbHkgcHJvY2VzcyAocG90ZW50aWFsbHkpIG1vZGlmaWVkIHRyYWNrczsgdGhlc2UgdXNlIHRoZSBzYW1lIHNsb3QKKyAgICAgICAgLy8gYnV0IG1heSBoYXZlIGEgZGlmZmVyZW50IGJ1ZmZlciBwcm92aWRlciBvciB2b2x1bWUgcHJvdmlkZXIKKyAgICAgICAgdW5zaWduZWQgbW9kaWZpZWRUcmFja3MgPSBjdXJyZW50VHJhY2tNYXNrICYgcHJldmlvdXNUcmFja01hc2s7CisgICAgICAgIHdoaWxlIChtb2RpZmllZFRyYWNrcyAhPSAwKSB7CisgICAgICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHoobW9kaWZpZWRUcmFja3MpOworICAgICAgICAgICAgbW9kaWZpZWRUcmFja3MgJj0gfigxIDw8IGkpOworICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CisgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tR2VuZXJhdGlvbiAhPSBnZW5lcmF0aW9uc1tpXSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgdHJhY2sgd2FzIGFjdHVhbGx5IG1vZGlmaWVkCisgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqYnVmZmVyUHJvdmlkZXIgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKKyAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChidWZmZXJQcm92aWRlciAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gZmFzdFRyYWNrTmFtZXNbaV07CisgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJmYpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVNT1ZFLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpGT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1TaW5rQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGVuYWJsZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuOworCisgICAgICAgIGR1bXBTdGF0ZS0+bU51bVRyYWNrcyA9IHBvcGNvdW50KGN1cnJlbnRUcmFja01hc2spOworICAgIH0KK30KKwordm9pZCBGYXN0TWl4ZXI6Om9uV29yaygpCit7CisgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIHRoaXMtPmN1cnJlbnQ7CisgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSB0aGlzLT5kdW1wU3RhdGU7CisgICAgY29uc3QgRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQgY29tbWFuZCA9IHRoaXMtPmNvbW1hbmQ7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKKworICAgIGlmICgoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpNSVgpICYmIChtaXhlciAhPSBOVUxMKSAmJiBpc1dhcm0pIHsKKyAgICAgICAgQUxPR19BU1NFUlQobU1peGVyQnVmZmVyICE9IE5VTEwpOworICAgICAgICAvLyBmb3IgZWFjaCB0cmFjaywgdXBkYXRlIHZvbHVtZSBhbmQgY2hlY2sgZm9yIHVuZGVycnVuCisgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRUcmFja01hc2sgPSBjdXJyZW50LT5tVHJhY2tNYXNrOworICAgICAgICB3aGlsZSAoY3VycmVudFRyYWNrTWFzayAhPSAwKSB7CisgICAgICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHooY3VycmVudFRyYWNrTWFzayk7CisgICAgICAgICAgICBjdXJyZW50VHJhY2tNYXNrICY9IH4oMSA8PCBpKTsKKyAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOworCisgICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBwZXItdHJhY2sgdGltZXN0YW1wCisgICAgICAgICAgICBpZiAodGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFja0ZyYW1lc1dyaXR0ZW4gPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlci0+ZnJhbWVzUmVsZWFzZWQoKTsKKyAgICAgICAgICAgICAgICAvLyBDYW4ndCBwcm92aWRlIGFuIEF1ZGlvVGltZXN0YW1wIGJlZm9yZSBmaXJzdCBmcmFtZSBwcmVzZW50ZWQsCisgICAgICAgICAgICAgICAgLy8gb3IgZHVyaW5nIHRoZSBicmllZiAzMi1iaXQgd3JhcGFyb3VuZCB3aW5kb3cKKyAgICAgICAgICAgICAgICBpZiAodHJhY2tGcmFtZXNXcml0dGVuID49IHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCkgeworICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWVzdGFtcCBwZXJUcmFja1RpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgcGVyVHJhY2tUaW1lc3RhbXAubVBvc2l0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0ZyYW1lc1dyaXR0ZW4gLSB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7CisgICAgICAgICAgICAgICAgICAgIHBlclRyYWNrVGltZXN0YW1wLm1UaW1lID0gdGltZXN0YW1wLm1UaW1lOworICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlci0+b25UaW1lc3RhbXAocGVyVHJhY2tUaW1lc3RhbXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG5hbWUgPSBmYXN0VHJhY2tOYW1lc1tpXTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7CisgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyLT5nZXRWb2x1bWVMUigpOworICAgICAgICAgICAgICAgIGZsb2F0IHZsZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKTsKKyAgICAgICAgICAgICAgICBmbG9hdCB2cmYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpOworCisgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZ2bGYpOworICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZJWE1FIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGZyYW1lc1JlYWR5KCkgZm9yIGZhc3QgdHJhY2tzCisgICAgICAgICAgICAvLyB0YWtlcyBhIHRyeUxvY2ssIHdoaWNoIGNhbiBibG9jaworICAgICAgICAgICAgLy8gdXAgdG8gMSBtcy4gIElmIGVub3VnaCBhY3RpdmUgdHJhY2tzIGFsbCBibG9ja2VkIGluIHNlcXVlbmNlLCB0aGlzIHdvdWxkIHJlc3VsdAorICAgICAgICAgICAgLy8gaW4gdGhlIG92ZXJhbGwgZmFzdCBtaXggY3ljbGUgYmVpbmcgZGVsYXllZC4gIFNob3VsZCB1c2UgYSBub24tYmxvY2tpbmcgRklGTy4KKyAgICAgICAgICAgIHNpemVfdCBmcmFtZXNSZWFkeSA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWFkeSgpOworICAgICAgICAgICAgaWYgKEFUUkFDRV9FTkFCTEVEKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJIHdpc2ggd2UgaGFkIGZvcm1hdHRlZCB0cmFjZSBuYW1lcworICAgICAgICAgICAgICAgIGNoYXIgdHJhY2VOYW1lWzE2XTsKKyAgICAgICAgICAgICAgICBzdHJjcHkodHJhY2VOYW1lLCAiZlJkeSIpOworICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs0XSA9IGkgKyAoaSA8IDEwID8gJzAnIDogJ0EnIC0gMTApOworICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs1XSA9ICdcMCc7CisgICAgICAgICAgICAgICAgQVRSQUNFX0lOVCh0cmFjZU5hbWUsIGZyYW1lc1JlYWR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZhc3RUcmFja0R1bXAgKmZ0RHVtcCA9ICZkdW1wU3RhdGUtPm1UcmFja3NbaV07CisgICAgICAgICAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgdW5kZXJydW5zID0gZnREdW1wLT5tVW5kZXJydW5zOworICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWR5IDwgZnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1FbXB0eSsrOworICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX0VNUFRZOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZGlzYWJsZShuYW1lKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRnVsbCsrOwotICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX0ZVTEw7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IG1peGluZyBwYXJ0aWFsIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tUGFydGlhbCsrOworICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX1BBUlRJQUw7CiAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZ0RHVtcC0+bVVuZGVycnVucyA9IHVuZGVycnVuczsKLSAgICAgICAgICAgICAgICBmdER1bXAtPm1GcmFtZXNSZWFkeSA9IGZyYW1lc1JlYWR5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IHB0czsKLSAgICAgICAgICAgIGlmIChvdXRwdXRTaW5rID09IE5VTEwgfHwgKE9LICE9IG91dHB1dFNpbmstPmdldE5leHRXcml0ZVRpbWVzdGFtcCgmcHRzKSkpCi0gICAgICAgICAgICAgICAgcHRzID0gQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFM7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MoKSBpcyBDUFUtYm91bmQKLSAgICAgICAgICAgIG1peGVyLT5wcm9jZXNzKHB0cyk7Ci0gICAgICAgICAgICBtaXhCdWZmZXJTdGF0ZSA9IE1JWEVEOwotICAgICAgICB9IGVsc2UgaWYgKG1peEJ1ZmZlclN0YXRlID09IE1JWEVEKSB7Ci0gICAgICAgICAgICBtaXhCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKLSAgICAgICAgfQotICAgICAgICBib29sIGF0dGVtcHRlZFdyaXRlID0gZmFsc2U7Ci0gICAgICAgIC8vYm9vbCBkaWRGdWxsV3JpdGUgPSBmYWxzZTsgICAgLy8gZHVtcHN5cyBjb3VsZCBkaXNwbGF5IGEgY291bnQgb2YgcGFydGlhbCB3cml0ZXMKLSAgICAgICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6OldSSVRFKSAmJiAob3V0cHV0U2luayAhPSBOVUxMKSAmJiAobWl4QnVmZmVyICE9IE5VTEwpKSB7Ci0gICAgICAgICAgICBpZiAobWl4QnVmZmVyU3RhdGUgPT0gVU5ERUZJTkVEKSB7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KG1peEJ1ZmZlciwgMCwgZnJhbWVDb3VudCAqIEZDQ18yICogc2l6ZW9mKHNob3J0KSk7Ci0gICAgICAgICAgICAgICAgbWl4QnVmZmVyU3RhdGUgPSBaRVJPRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGVlU2luayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHRlZVNpbmstPndyaXRlKG1peEJ1ZmZlciwgZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBGSVhNRSB3cml0ZSgpIGlzIG5vbi1ibG9ja2luZyBhbmQgbG9jay1mcmVlIGZvciBhIHByb3Blcmx5IGltcGxlbWVudGVkIE5CQUlPIHNpbmssCi0gICAgICAgICAgICAvLyAgICAgICBidXQgdGhpcyBjb2RlIHNob3VsZCBiZSBtb2RpZmllZCB0byBoYW5kbGUgYm90aCBub24tYmxvY2tpbmcgYW5kIGJsb2NraW5nIHNpbmtzCi0gICAgICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7Ci0gICAgICAgICAgICBBVFJBQ0VfQkVHSU4oIndyaXRlIik7Ci0gICAgICAgICAgICBzc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPSBvdXRwdXRTaW5rLT53cml0ZShtaXhCdWZmZXIsIGZyYW1lQ291bnQpOwotICAgICAgICAgICAgQVRSQUNFX0VORCgpOwotICAgICAgICAgICAgZHVtcFN0YXRlLT5tV3JpdGVTZXF1ZW5jZSsrOwotICAgICAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPj0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKChzaXplX3QpIGZyYW1lc1dyaXR0ZW4gPD0gZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICAgICAgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuICs9IGZyYW1lc1dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzV3JpdHRlbiA9IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICAvL2lmICgoc2l6ZV90KSBmcmFtZXNXcml0dGVuID09IGZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgICAgICAvLyAgICBkaWRGdWxsV3JpdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZUVycm9ycysrOworICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1GdWxsKys7CisgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9GVUxMOworICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdHRlbXB0ZWRXcml0ZSA9IHRydWU7Ci0gICAgICAgICAgICAvLyBGSVhNRSBjb3VudCAjIG9mIHdyaXRlcyBibG9ja2VkIGV4Y2Vzc2l2ZWx5LCBDUFUgdXNhZ2UsIGV0Yy4gZm9yIGR1bXAKLQotICAgICAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gb3V0cHV0U2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgICAgICAgICBpZiAodGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPSB0aW1lc3RhbXAubVBvc2l0aW9uOwotICAgICAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gLSB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBIQUwgcmVwb3J0ZWQgdGhhdCBtb3JlIGZyYW1lcyB3ZXJlIHByZXNlbnRlZCB0aGFuIHdlcmUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBmdER1bXAtPm1VbmRlcnJ1bnMgPSB1bmRlcnJ1bnM7CisgICAgICAgICAgICBmdER1bXAtPm1GcmFtZXNSZWFkeSA9IGZyYW1lc1JlYWR5OwogICAgICAgICB9CiAKLSAgICAgICAgLy8gVG8gYmUgZXhhY3RseSBwZXJpb2RpYywgY29tcHV0ZSB0aGUgbmV4dCBzbGVlcCB0aW1lIGJhc2VkIG9uIGN1cnJlbnQgdGltZS4KLSAgICAgICAgLy8gVGhpcyBjb2RlIGRvZXNuJ3QgaGF2ZSBsb25nLXRlcm0gc3RhYmlsaXR5IHdoZW4gdGhlIHNpbmsgaXMgbm9uLWJsb2NraW5nLgotICAgICAgICAvLyBGSVhNRSBUbyBhdm9pZCBkcmlmdCwgdXNlIHRoZSBsb2NhbCBhdWRpbyBjbG9jayBvciB3YXRjaCB0aGUgc2luaydzIGZpbGwgc3RhdHVzLgotICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgbmV3VHM7Ci0gICAgICAgIGludCByYyA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmbmV3VHMpOwotICAgICAgICBpZiAocmMgPT0gMCkgewotICAgICAgICAgICAgLy9sb2dXcml0ZXItPmxvZ1RpbWVzdGFtcChuZXdUcyk7Ci0gICAgICAgICAgICBpZiAob2xkVHNWYWxpZCkgewotICAgICAgICAgICAgICAgIHRpbWVfdCBzZWMgPSBuZXdUcy50dl9zZWMgLSBvbGRUcy50dl9zZWM7Ci0gICAgICAgICAgICAgICAgbG9uZyBuc2VjID0gbmV3VHMudHZfbnNlYyAtIG9sZFRzLnR2X25zZWM7Ci0gICAgICAgICAgICAgICAgQUxPR0VfSUYoc2VjIDwgMCB8fCAoc2VjID09IDAgJiYgbnNlYyA8IDApLAotICAgICAgICAgICAgICAgICAgICAgICAgImNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKSBmYWlsZWQ6IHdhcyAlbGQuJTA5bGQgYnV0IG5vdyAlbGQuJTA5bGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgb2xkVHMudHZfc2VjLCBvbGRUcy50dl9uc2VjLCBuZXdUcy50dl9zZWMsIG5ld1RzLnR2X25zZWMpOwotICAgICAgICAgICAgICAgIGlmIChuc2VjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAtLXNlYzsKLSAgICAgICAgICAgICAgICAgICAgbnNlYyArPSAxMDAwMDAwMDAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCBhbiBpbml0aWFsIHVuZGVycnVuIG9uIGZhc3QgdHJhY2tzIGFmdGVyIGV4aXRpbmcgc3RhbmRieSwKLSAgICAgICAgICAgICAgICAvLyBkbyBub3Qgc3RhcnQgcHVsbGluZyBkYXRhIGZyb20gdHJhY2tzIGFuZCBtaXhpbmcgdW50aWwgd2FybXVwIGlzIGNvbXBsZXRlLgotICAgICAgICAgICAgICAgIC8vIFdhcm11cCBpcyBjb25zaWRlcmVkIGNvbXBsZXRlIGFmdGVyIHRoZSBlYXJsaWVyIG9mOgotICAgICAgICAgICAgICAgIC8vICAgICAgTUlOX1dBUk1VUF9DWUNMRVMgd3JpdGUoKSBhdHRlbXB0cyBhbmQgbGFzdCBvbmUgYmxvY2tzIGZvciBhdCBsZWFzdCB3YXJtdXBOcwotICAgICAgICAgICAgICAgIC8vICAgICAgTUFYX1dBUk1VUF9DWUNMRVMgd3JpdGUoKSBhdHRlbXB0cy4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG92ZXJseSBjb25zZXJ2YXRpdmUsIGJ1dCB0byBnZXQgYmV0dGVyIGFjY3VyYWN5IHJlcXVpcmVzIGEgbmV3IEhBTCBBUEkuCi0gICAgICAgICAgICAgICAgaWYgKCFpc1dhcm0gJiYgYXR0ZW1wdGVkV3JpdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgKz0gc2VjOwotICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgKz0gbnNlYzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA+PSAxMDAwMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYysrOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjIC09IDEwMDAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKyt3YXJtdXBDeWNsZXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobnNlYyA+IHdhcm11cE5zICYmIHdhcm11cEN5Y2xlcyA+PSBNSU5fV0FSTVVQX0NZQ0xFUykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FybXVwQ3ljbGVzID49IE1BWF9XQVJNVVBfQ1lDTEVTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXJtID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1lYXN1cmVkV2FybXVwVHMgPSBtZWFzdXJlZFdhcm11cFRzOwotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gd2FybXVwQ3ljbGVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNsZWVwTnMgPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAoaXNXYXJtKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwIHx8IG5zZWMgPiB1bmRlcnJ1bk5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG9ubHkgbG9nIG9jY2FzaW9uYWxseQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInVuZGVycnVuOiB0aW1lIHNpbmNlIGxhc3QgY3ljbGUgJWQuJTAzbGQgc2VjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tVW5kZXJydW5zKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnNlYyA8IG92ZXJydW5OcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZU5leHRPdmVycnVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSBsb2cgb2NjYXNpb25hbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm92ZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU92ZXJydW5zKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIG1pbmltdW0gY3ljbGUgdGltZS4gSXQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBjb21wZW5zYXRlcyBmb3IgYW4gYXVkaW8gSEFMIHdpdGggaml0dGVyIGR1ZSB0byBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSB3b3JrcyB3aXRoIGEgdmFyaWFibGUgYnVmZmVyIGRlcHRoIGF1ZGlvIEhBTCB0aGF0IG5ldmVyIHB1bGxzIGF0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJhdGUgPCB0aGFuIG92ZXJydW5OcyBwZXIgYnVmZmVyLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gcmVjb3ZlcnMgZnJvbSBvdmVycnVuIGltbWVkaWF0ZWx5IGFmdGVyIHVuZGVycnVuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBkb2Vzbid0IHdvcmsgd2l0aCBhIG5vbi1ibG9ja2luZyBhdWRpbyBIQUwuCi0gICAgICAgICAgICAgICAgICAgICAgICBzbGVlcE5zID0gZm9yY2VOcyAtIG5zZWM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICAgICAgICAgICAgIGlmIChpc1dhcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZSB0aGUgRklGTyBxdWV1ZSBib3VuZHMKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBib3VuZHMgJiAoZHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIGJvdW5kcyA9IChib3VuZHMgJiAweEZGRkYwMDAwKSB8ICgoYm91bmRzICsgMSkgJiAweEZGRkYpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzICs9IDB4MTAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShib3VuZHMgJiAoZHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdWxsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBkZWx0YSB2YWx1ZSBvZiBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbW9ub3RvbmljTnMgPSBuc2VjOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCAmJiBzZWMgPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb25vdG9uaWNOcyArPSBzZWMgKiAxMDAwMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgcmF3IENQVSBsb2FkID0gZGVsdGEgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCkKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbG9hZE5zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIG5ld0xvYWQ7Ci0gICAgICAgICAgICAgICAgICAgIHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCwgJm5ld0xvYWQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZExvYWRWYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYyA9IG5ld0xvYWQudHZfc2VjIC0gb2xkTG9hZC50dl9zZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlYyA9IG5ld0xvYWQudHZfbnNlYyAtIG9sZExvYWQudHZfbnNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnNlYyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1zZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWMgKz0gMTAwMDAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE5zID0gbnNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCAmJiBzZWMgPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWROcyArPSBzZWMgKiAxMDAwMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9hZFZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9sZExvYWQgPSBuZXdMb2FkOwotICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoKLSAgICAgICAgICAgICAgICAgICAgaW50IGNwdU51bSA9IHNjaGVkX2dldGNwdSgpOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBrSHogPSB0Y3UuZ2V0Q3B1a0h6KGNwdU51bSk7Ci0gICAgICAgICAgICAgICAgICAgIGtIeiA9IChrSHogPDwgNCkgfCAoY3B1TnVtICYgMHhGKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHZhbHVlcyBpbiBGSUZPIHF1ZXVlcyBmb3IgZHVtcHN5cwotICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzdG9yZXMgIzEsICMyLCAjMyBhcmUgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlciwKLSAgICAgICAgICAgICAgICAgICAgLy8gb3Igd2l0aCByZXNwZWN0IHRvIHN0b3JlICM0IGJlbG93Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1vbm90b25pY05zW2ldID0gbW9ub3RvbmljTnM7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUxvYWROc1tpXSA9IGxvYWROczsKLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tQ3B1a0h6W2ldID0ga0h6OwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc3RvcmUgIzQgaXMgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gc3RvcmVzICMxLCAjMiwgIzMgYWJvdmUsIGJ1dAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV3ZXN0IG9wZW4gJiBvbGRlc3QgY2xvc2VkIGhhbHZlcyBhcmUgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyCi0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUJvdW5kcyA9IGJvdW5kczsKLSAgICAgICAgICAgICAgICAgICAgQVRSQUNFX0lOVCgiY3ljbGVfbXMiLCBtb25vdG9uaWNOcyAvIDEwMDAwMDApOwotICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKCJsb2FkX3VzIiwgbG9hZE5zIC8gMTAwMCk7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcAotICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHNsZWVwTnMgPSBwZXJpb2ROczsKLSAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbGRUcyA9IG5ld1RzOworICAgICAgICBpbnQ2NF90IHB0czsKKyAgICAgICAgaWYgKG91dHB1dFNpbmsgPT0gTlVMTCB8fCAoT0sgIT0gb3V0cHV0U2luay0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKCZwdHMpKSkgeworICAgICAgICAgICAgcHRzID0gQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFM7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzKCkgaXMgQ1BVLWJvdW5kCisgICAgICAgIG1peGVyLT5wcm9jZXNzKHB0cyk7CisgICAgICAgIG1NaXhlckJ1ZmZlclN0YXRlID0gTUlYRUQ7CisgICAgfSBlbHNlIGlmIChtTWl4ZXJCdWZmZXJTdGF0ZSA9PSBNSVhFRCkgeworICAgICAgICBtTWl4ZXJCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKKyAgICB9CisgICAgLy9ib29sIGRpZEZ1bGxXcml0ZSA9IGZhbHNlOyAgICAvLyBkdW1wc3lzIGNvdWxkIGRpc3BsYXkgYSBjb3VudCBvZiBwYXJ0aWFsIHdyaXRlcworICAgIGlmICgoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpXUklURSkgJiYgKG91dHB1dFNpbmsgIT0gTlVMTCkgJiYgKG1NaXhlckJ1ZmZlciAhPSBOVUxMKSkgeworICAgICAgICBpZiAobU1peGVyQnVmZmVyU3RhdGUgPT0gVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBtZW1zZXQobU1peGVyQnVmZmVyLCAwLCBtTWl4ZXJCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIG1NaXhlckJ1ZmZlclN0YXRlID0gWkVST0VEOworICAgICAgICB9CisgICAgICAgIHZvaWQgKmJ1ZmZlciA9IG1TaW5rQnVmZmVyICE9IE5VTEwgPyBtU2lua0J1ZmZlciA6IG1NaXhlckJ1ZmZlcjsKKyAgICAgICAgaWYgKGZvcm1hdC5tRm9ybWF0ICE9IG1NaXhlckJ1ZmZlckZvcm1hdCkgeyAvLyBzaW5rIGZvcm1hdCBub3QgdGhlIHNhbWUgYXMgbWl4ZXIgZm9ybWF0CisgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgZm9ybWF0Lm1Gb3JtYXQsIG1NaXhlckJ1ZmZlciwgbU1peGVyQnVmZmVyRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBpZiBub24tTlVMTCwgdGhlbiBkdXBsaWNhdGUgd3JpdGUoKSB0byB0aGlzIG5vbi1ibG9ja2luZyBzaW5rCisgICAgICAgIE5CQUlPX1NpbmsqIHRlZVNpbms7CisgICAgICAgIGlmICgodGVlU2luayA9IGN1cnJlbnQtPm1UZWVTaW5rKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAodm9pZCkgdGVlU2luay0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICAgICAgfQorICAgICAgICAvLyBGSVhNRSB3cml0ZSgpIGlzIG5vbi1ibG9ja2luZyBhbmQgbG9jay1mcmVlIGZvciBhIHByb3Blcmx5IGltcGxlbWVudGVkIE5CQUlPIHNpbmssCisgICAgICAgIC8vICAgICAgIGJ1dCB0aGlzIGNvZGUgc2hvdWxkIGJlIG1vZGlmaWVkIHRvIGhhbmRsZSBib3RoIG5vbi1ibG9ja2luZyBhbmQgYmxvY2tpbmcgc2lua3MKKyAgICAgICAgZHVtcFN0YXRlLT5tV3JpdGVTZXF1ZW5jZSsrOworICAgICAgICBBVFJBQ0VfQkVHSU4oIndyaXRlIik7CisgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG91dHB1dFNpbmstPndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisgICAgICAgIEFUUkFDRV9FTkQoKTsKKyAgICAgICAgZHVtcFN0YXRlLT5tV3JpdGVTZXF1ZW5jZSsrOworICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+PSAwKSB7CisgICAgICAgICAgICBBTE9HX0FTU0VSVCgoc2l6ZV90KSBmcmFtZXNXcml0dGVuIDw9IGZyYW1lQ291bnQpOworICAgICAgICAgICAgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuICs9IGZyYW1lc1dyaXR0ZW47CisgICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZXNXcml0dGVuID0gdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuOworICAgICAgICAgICAgLy9pZiAoKHNpemVfdCkgZnJhbWVzV3JpdHRlbiA9PSBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICAvLyAgICBkaWRGdWxsV3JpdGUgPSB0cnVlOworICAgICAgICAgICAgLy99CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBtb25vdG9uaWMgY2xvY2sgaXMgYnJva2VuCi0gICAgICAgICAgICBvbGRUc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBzbGVlcE5zID0gcGVyaW9kTnM7CisgICAgICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZUVycm9ycysrOwogICAgICAgICB9CisgICAgICAgIGF0dGVtcHRlZFdyaXRlID0gdHJ1ZTsKKyAgICAgICAgLy8gRklYTUUgY291bnQgIyBvZiB3cml0ZXMgYmxvY2tlZCBleGNlc3NpdmVseSwgQ1BVIHVzYWdlLCBldGMuIGZvciBkdW1wCiAKLQotICAgIH0gICAvLyBmb3IgKDs7KQotCi0gICAgLy8gbmV2ZXIgcmV0dXJuICd0cnVlJzsgVGhyZWFkOjpfdGhyZWFkTG9vcCgpIGxvY2tzIG11dGV4IHdoaWNoIGNhbiByZXN1bHQgaW4gcHJpb3JpdHkgaW52ZXJzaW9uCisgICAgICAgIHRpbWVzdGFtcFN0YXR1cyA9IG91dHB1dFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOworICAgICAgICBpZiAodGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA9IHRpbWVzdGFtcC5tUG9zaXRpb247CisgICAgICAgICAgICBpZiAodG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPD0gdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9CisgICAgICAgICAgICAgICAgICAgIHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiAtIHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBIQUwgcmVwb3J0ZWQgdGhhdCBtb3JlIGZyYW1lcyB3ZXJlIHByZXNlbnRlZCB0aGFuIHdlcmUgd3JpdHRlbgorICAgICAgICAgICAgICAgIHRpbWVzdGFtcFN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiBGYXN0TWl4ZXJEdW1wU3RhdGU6OkZhc3RNaXhlckR1bXBTdGF0ZSgKICNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdOCiAjZW5kaWYKLSAgICAgICAgKSA6Ci0gICAgbUNvbW1hbmQoRmFzdE1peGVyU3RhdGU6OklOSVRJQUwpLCBtV3JpdGVTZXF1ZW5jZSgwKSwgbUZyYW1lc1dyaXR0ZW4oMCksCi0gICAgbU51bVRyYWNrcygwKSwgbVdyaXRlRXJyb3JzKDApLCBtVW5kZXJydW5zKDApLCBtT3ZlcnJ1bnMoMCksCi0gICAgbVNhbXBsZVJhdGUoMCksIG1GcmFtZUNvdW50KDApLCAvKiBtTWVhc3VyZWRXYXJtdXBUcyh7MCwgMH0pLCAqLyBtV2FybXVwQ3ljbGVzKDApLAorICAgICAgICApIDogRmFzdFRocmVhZER1bXBTdGF0ZSgpLAorICAgIG1Xcml0ZVNlcXVlbmNlKDApLCBtRnJhbWVzV3JpdHRlbigwKSwKKyAgICBtTnVtVHJhY2tzKDApLCBtV3JpdGVFcnJvcnMoMCksCisgICAgbVNhbXBsZVJhdGUoMCksIG1GcmFtZUNvdW50KDApLAogICAgIG1UcmFja01hc2soMCkKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAsIG1TYW1wbGluZ04oMCksIG1Cb3VuZHMoMCkKLSNlbmRpZgogewotICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyA9IDA7Ci0gICAgbU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA9IDA7CiAjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCiAgICAgaW5jcmVhc2VTYW1wbGluZ04oc2FtcGxpbmdOKTsKICNlbmRpZgpAQCAtNzE0LDcgKzUxMCw3IEBACiB2b2lkIEZhc3RNaXhlckR1bXBTdGF0ZTo6ZHVtcChpbnQgZmQpIGNvbnN0CiB7CiAgICAgaWYgKG1Db21tYW5kID09IEZhc3RNaXhlclN0YXRlOjpJTklUSUFMKSB7Ci0gICAgICAgIGZkcHJpbnRmKGZkLCAiRmFzdE1peGVyIG5vdCBpbml0aWFsaXplZFxuIik7CisgICAgICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBub3QgaW5pdGlhbGl6ZWRcbiIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogI2RlZmluZSBDT01NQU5EX01BWCAzMgpAQCAtNzQ4LDEwICs1NDQsMTAgQEAKICAgICBkb3VibGUgbWVhc3VyZWRXYXJtdXBNcyA9IChtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgKiAxMDAwLjApICsKICAgICAgICAgICAgIChtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjIC8gMTAwMDAwMC4wKTsKICAgICBkb3VibGUgbWl4UGVyaW9kU2VjID0gKGRvdWJsZSkgbUZyYW1lQ291bnQgLyAoZG91YmxlKSBtU2FtcGxlUmF0ZTsKLSAgICBmZHByaW50ZihmZCwgIkZhc3RNaXhlciBjb21tYW5kPSVzIHdyaXRlU2VxdWVuY2U9JXUgZnJhbWVzV3JpdHRlbj0ldVxuIgotICAgICAgICAgICAgICAgICAiICAgICAgICAgIG51bVRyYWNrcz0ldSB3cml0ZUVycm9ycz0ldSB1bmRlcnJ1bnM9JXUgb3ZlcnJ1bnM9JXVcbiIKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICBzYW1wbGVSYXRlPSV1IGZyYW1lQ291bnQ9JXUgbWVhc3VyZWRXYXJtdXA9JS4zZyBtcywgd2FybXVwQ3ljbGVzPSV1XG4iCi0gICAgICAgICAgICAgICAgICIgICAgICAgICAgbWl4UGVyaW9kPSUuMmYgbXNcbiIsCisgICAgZHByaW50ZihmZCwgIiAgRmFzdE1peGVyIGNvbW1hbmQ9JXMgd3JpdGVTZXF1ZW5jZT0ldSBmcmFtZXNXcml0dGVuPSV1XG4iCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG51bVRyYWNrcz0ldSB3cml0ZUVycm9ycz0ldSB1bmRlcnJ1bnM9JXUgb3ZlcnJ1bnM9JXVcbiIKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgc2FtcGxlUmF0ZT0ldSBmcmFtZUNvdW50PSV6dSBtZWFzdXJlZFdhcm11cD0lLjNnIG1zLCB3YXJtdXBDeWNsZXM9JXVcbiIKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbWl4UGVyaW9kPSUuMmYgbXNcbiIsCiAgICAgICAgICAgICAgICAgIHN0cmluZywgbVdyaXRlU2VxdWVuY2UsIG1GcmFtZXNXcml0dGVuLAogICAgICAgICAgICAgICAgICBtTnVtVHJhY2tzLCBtV3JpdGVFcnJvcnMsIG1VbmRlcnJ1bnMsIG1PdmVycnVucywKICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtZWFzdXJlZFdhcm11cE1zLCBtV2FybXVwQ3ljbGVzLApAQCAtODAyLDIxICs1OTgsMjcgQEAKICAgICAgICAgcHJldmlvdXNDcHVrSHogPSBzYW1wbGVDcHVrSHo7CiAjZW5kaWYKICAgICB9Ci0gICAgZmRwcmludGYoZmQsICJTaW1wbGUgbW92aW5nIHN0YXRpc3RpY3Mgb3ZlciBsYXN0ICUuMWYgc2Vjb25kczpcbiIsIHdhbGwubigpICogbWl4UGVyaW9kU2VjKTsKLSAgICBmZHByaW50ZihmZCwgIiAgd2FsbCBjbG9jayB0aW1lIGluIG1zIHBlciBtaXggY3ljbGU6XG4iCi0gICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAotICAgICAgICAgICAgICAgICB3YWxsLm1lYW4oKSoxZS02LCB3YWxsLm1pbmltdW0oKSoxZS02LCB3YWxsLm1heGltdW0oKSoxZS02LCB3YWxsLnN0ZGRldigpKjFlLTYpOwotICAgIGZkcHJpbnRmKGZkLCAiICByYXcgQ1BVIGxvYWQgaW4gdXMgcGVyIG1peCBjeWNsZTpcbiIKLSAgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMGYgbWluPSUuMGYgbWF4PSUuMGYgc3RkZGV2PSUuMGZcbiIsCi0gICAgICAgICAgICAgICAgIGxvYWROcy5tZWFuKCkqMWUtMywgbG9hZE5zLm1pbmltdW0oKSoxZS0zLCBsb2FkTnMubWF4aW11bSgpKjFlLTMsCi0gICAgICAgICAgICAgICAgIGxvYWROcy5zdGRkZXYoKSoxZS0zKTsKKyAgICBpZiAobikgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBTaW1wbGUgbW92aW5nIHN0YXRpc3RpY3Mgb3ZlciBsYXN0ICUuMWYgc2Vjb25kczpcbiIsCisgICAgICAgICAgICAgICAgICAgIHdhbGwubigpICogbWl4UGVyaW9kU2VjKTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgICB3YWxsIGNsb2NrIHRpbWUgaW4gbXMgcGVyIG1peCBjeWNsZTpcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5tZWFuKCkqMWUtNiwgd2FsbC5taW5pbXVtKCkqMWUtNiwgd2FsbC5tYXhpbXVtKCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5zdGRkZXYoKSoxZS02KTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgICByYXcgQ1BVIGxvYWQgaW4gdXMgcGVyIG1peCBjeWNsZTpcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgbG9hZE5zLm1lYW4oKSoxZS0zLCBsb2FkTnMubWluaW11bSgpKjFlLTMsIGxvYWROcy5tYXhpbXVtKCkqMWUtMywKKyAgICAgICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlciBzdGF0aXN0aWNzIGF2YWlsYWJsZSBjdXJyZW50bHlcbiIpOworICAgIH0KICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBmZHByaW50ZihmZCwgIiAgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBNSHo6XG4iCi0gICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLAotICAgICAgICAgICAgICAgICBrSHoubWVhbigpKjFlLTMsIGtIei5taW5pbXVtKCkqMWUtMywga0h6Lm1heGltdW0oKSoxZS0zLCBrSHouc3RkZGV2KCkqMWUtMyk7Ci0gICAgZmRwcmludGYoZmQsICIgIGFkanVzdGVkIENQVSBsb2FkIGluIE1IeiAoaS5lLiBub3JtYWxpemVkIGZvciBDUFUgY2xvY2sgZnJlcXVlbmN5KTpcbiIKLSAgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMWYgbWluPSUuMWYgbWF4PSUuMWYgc3RkZGV2PSUuMWZcbiIsCi0gICAgICAgICAgICAgICAgIGxvYWRNSHoubWVhbigpLCBsb2FkTUh6Lm1pbmltdW0oKSwgbG9hZE1Iei5tYXhpbXVtKCksIGxvYWRNSHouc3RkZGV2KCkpOworICAgIGRwcmludGYoZmQsICIgIENQVSBjbG9jayBmcmVxdWVuY3kgaW4gTUh6OlxuIgorICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLAorICAgICAgICAgICAgICAgIGtIei5tZWFuKCkqMWUtMywga0h6Lm1pbmltdW0oKSoxZS0zLCBrSHoubWF4aW11bSgpKjFlLTMsIGtIei5zdGRkZXYoKSoxZS0zKTsKKyAgICBkcHJpbnRmKGZkLCAiICBhZGp1c3RlZCBDUFUgbG9hZCBpbiBNSHogKGkuZS4gbm9ybWFsaXplZCBmb3IgQ1BVIGNsb2NrIGZyZXF1ZW5jeSk6XG4iCisgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMWYgbWluPSUuMWYgbWF4PSUuMWYgc3RkZGV2PSUuMWZcbiIsCisgICAgICAgICAgICAgICAgbG9hZE1Iei5tZWFuKCksIGxvYWRNSHoubWluaW11bSgpLCBsb2FkTUh6Lm1heGltdW0oKSwgbG9hZE1Iei5zdGRkZXYoKSk7CiAjZW5kaWYKICAgICBpZiAodGFpbCAhPSBOVUxMKSB7CiAgICAgICAgIHFzb3J0KHRhaWwsIG4sIHNpemVvZih1aW50MzJfdCksIGNvbXBhcmVfdWludDMyX3QpOwpAQCAtODI3LDEyICs2MjksMTIgQEAKICAgICAgICAgICAgIGxlZnQuc2FtcGxlKHRhaWxbaV0pOwogICAgICAgICAgICAgcmlnaHQuc2FtcGxlKHRhaWxbbiAtIChpICsgMSldKTsKICAgICAgICAgfQotICAgICAgICBmZHByaW50ZihmZCwgIkRpc3RyaWJ1dGlvbiBvZiBtaXggY3ljbGUgdGltZXMgaW4gbXMgZm9yIHRoZSB0YWlscyAoPiB+MyBzdGRkZXYgb3V0bGllcnMpOlxuIgotICAgICAgICAgICAgICAgICAgICAgIiAgbGVmdCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIKLSAgICAgICAgICAgICAgICAgICAgICIgIHJpZ2h0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgIGxlZnQubWVhbigpKjFlLTYsIGxlZnQubWluaW11bSgpKjFlLTYsIGxlZnQubWF4aW11bSgpKjFlLTYsIGxlZnQuc3RkZGV2KCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgIHJpZ2h0Lm1lYW4oKSoxZS02LCByaWdodC5taW5pbXVtKCkqMWUtNiwgcmlnaHQubWF4aW11bSgpKjFlLTYsCi0gICAgICAgICAgICAgICAgICAgICByaWdodC5zdGRkZXYoKSoxZS02KTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgRGlzdHJpYnV0aW9uIG9mIG1peCBjeWNsZSB0aW1lcyBpbiBtcyBmb3IgdGhlIHRhaWxzICg+IH4zIHN0ZGRldiBvdXRsaWVycyk6XG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgbGVmdCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICByaWdodCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCisgICAgICAgICAgICAgICAgICAgIGxlZnQubWVhbigpKjFlLTYsIGxlZnQubWluaW11bSgpKjFlLTYsIGxlZnQubWF4aW11bSgpKjFlLTYsIGxlZnQuc3RkZGV2KCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgcmlnaHQubWVhbigpKjFlLTYsIHJpZ2h0Lm1pbmltdW0oKSoxZS02LCByaWdodC5tYXhpbXVtKCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgcmlnaHQuc3RkZGV2KCkqMWUtNik7CiAgICAgICAgIGRlbGV0ZVtdIHRhaWw7CiAgICAgfQogI2VuZGlmCkBAIC04NDIsOSArNjQ0LDkgQEAKICAgICAvLyBJbnN0ZWFkIHdlIGFsd2F5cyBkaXNwbGF5IGFsbCB0cmFja3MsIHdpdGggYW4gaW5kaWNhdGlvbgogICAgIC8vIG9mIHdoZXRoZXIgd2UgdGhpbmsgdGhlIHRyYWNrIGlzIGFjdGl2ZS4KICAgICB1aW50MzJfdCB0cmFja01hc2sgPSBtVHJhY2tNYXNrOwotICAgIGZkcHJpbnRmKGZkLCAiRmFzdCB0cmFja3M6IGtNYXhGYXN0VHJhY2tzPSV1IGFjdGl2ZU1hc2s9JSN4XG4iLAorICAgIGRwcmludGYoZmQsICIgIEZhc3QgdHJhY2tzOiBrTWF4RmFzdFRyYWNrcz0ldSBhY3RpdmVNYXNrPSUjeFxuIiwKICAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcywgdHJhY2tNYXNrKTsKLSAgICBmZHByaW50ZihmZCwgIkluZGV4IEFjdGl2ZSBGdWxsIFBhcnRpYWwgRW1wdHkgIFJlY2VudCBSZWFkeVxuIik7CisgICAgZHByaW50ZihmZCwgIiAgSW5kZXggQWN0aXZlIEZ1bGwgUGFydGlhbCBFbXB0eSAgUmVjZW50IFJlYWR5XG4iKTsKICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzOyArK2ksIHRyYWNrTWFzayA+Pj0gMSkgewogICAgICAgICBib29sIGlzQWN0aXZlID0gdHJhY2tNYXNrICYgMTsKICAgICAgICAgY29uc3QgRmFzdFRyYWNrRHVtcCAqZnREdW1wID0gJm1UcmFja3NbaV07CkBAIC04NjQsNyArNjY2LDcgQEAKICAgICAgICAgICAgIG1vc3RSZWNlbnQgPSAiPyI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBmZHByaW50ZihmZCwgIiU1dSAlNnMgJTR1ICU3dSAlNXUgJTdzICU1dVxuIiwgaSwgaXNBY3RpdmUgPyAieWVzIiA6ICJubyIsCisgICAgICAgIGRwcmludGYoZmQsICIgICU1dSAlNnMgJTR1ICU3dSAlNXUgJTdzICU1enVcbiIsIGksIGlzQWN0aXZlID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgICAgICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRnVsbCkgJiBVTkRFUlJVTl9NQVNLLAogICAgICAgICAgICAgICAgICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tUGFydGlhbCkgJiBVTkRFUlJVTl9NQVNLLAogICAgICAgICAgICAgICAgICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRW1wdHkpICYgVU5ERVJSVU5fTUFTSywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAppbmRleCA2MTU4OTI1Li5mZGU4YzJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCkBAIC0xNywxMjQgKzE3LDc0IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9ICiAKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KKyNpbmNsdWRlICJGYXN0VGhyZWFkLmgiCiAjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+Ci1leHRlcm4gIkMiIHsKLSNpbmNsdWRlICIuLi9wcml2YXRlL2Jpb25pY19mdXRleC5oIgotfQogI2luY2x1ZGUgIlN0YXRlUXVldWUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJTdGF0ZS5oIgorI2luY2x1ZGUgIkZhc3RNaXhlckR1bXBTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIEF1ZGlvTWl4ZXI7CisKIHR5cGVkZWYgU3RhdGVRdWV1ZTxGYXN0TWl4ZXJTdGF0ZT4gRmFzdE1peGVyU3RhdGVRdWV1ZTsKIAotY2xhc3MgRmFzdE1peGVyIDogcHVibGljIFRocmVhZCB7CitjbGFzcyBGYXN0TWl4ZXIgOiBwdWJsaWMgRmFzdFRocmVhZCB7CiAKIHB1YmxpYzoKLSAgICAgICAgICAgIEZhc3RNaXhlcigpIDogVGhyZWFkKGZhbHNlIC8qY2FuQ2FsbEphdmEqLykgeyB9Ci0gICAgdmlydHVhbCB+RmFzdE1peGVyKCkgeyB9CisgICAgICAgICAgICBGYXN0TWl4ZXIoKTsKKyAgICB2aXJ0dWFsIH5GYXN0TWl4ZXIoKTsKIAotICAgICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSogc3EoKSB7IHJldHVybiAmbVNROyB9CisgICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlKiBzcSgpOwogCiBwcml2YXRlOgotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICAgICB0aHJlYWRMb29wKCk7CiAgICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlIG1TUTsKIAorICAgIC8vIGNhbGxvdXRzCisgICAgdmlydHVhbCBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKnBvbGwoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TG9nKE5CTG9nOjpXcml0ZXIgKmxvZ1dyaXRlcik7CisgICAgdmlydHVhbCB2b2lkIG9uSWRsZSgpOworICAgIHZpcnR1YWwgdm9pZCBvbkV4aXQoKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdWJDbGFzc0NvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIGNvbW1hbmQpOworICAgIHZpcnR1YWwgdm9pZCBvblN0YXRlQ2hhbmdlKCk7CisgICAgdmlydHVhbCB2b2lkIG9uV29yaygpOworCisgICAgLy8gRklYTUUgdGhlc2UgZm9ybWVyIGxvY2FsIHZhcmlhYmxlcyBuZWVkIGNvbW1lbnRzIGFuZCB0byBiZSByZW5hbWVkIHRvIGhhdmUgIm0iIHByZWZpeAorICAgIHN0YXRpYyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBpbml0aWFsOworICAgIEZhc3RNaXhlclN0YXRlIHByZUlkbGU7IC8vIGNvcHkgb2Ygc3RhdGUgYmVmb3JlIHdlIHdlbnQgaW50byBpZGxlCisgICAgbG9uZyBzbG9wTnM7ICAgICAgICAvLyBhY2N1bXVsYXRlZCB0aW1lIHdlJ3ZlIHdva2VuIHVwIHRvbyBlYXJseSAoPiAwKSBvciB0b28gbGF0ZSAoPCAwKQorICAgIGludCBmYXN0VHJhY2tOYW1lc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOyAvLyBoYW5kbGVzIHVzZWQgYnkgbWl4ZXIgdG8gaWRlbnRpZnkgdHJhY2tzCisgICAgaW50IGdlbmVyYXRpb25zW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107ICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUZhc3RUcmFja3NbaV0ubUdlbmVyYXRpb24KKyAgICBOQkFJT19TaW5rICpvdXRwdXRTaW5rOworICAgIGludCBvdXRwdXRTaW5rR2VuOworICAgIEF1ZGlvTWl4ZXIqIG1peGVyOworCisgICAgLy8gbVNpbmtCdWZmZXIgYXVkaW8gZm9ybWF0IGlzIHN0b3JlZCBpbiBmb3JtYXQubUZvcm1hdC4KKyAgICB2b2lkKiBtU2lua0J1ZmZlcjsgICAgICAgICAgICAgICAgICAvLyB1c2VkIGZvciBtaXhlciBvdXRwdXQgZm9ybWF0IHRyYW5zbGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2luayBmb3JtYXQgaXMgZGlmZmVyZW50IHRoYW4gbWl4ZXIgb3V0cHV0LgorICAgIHNpemVfdCBtU2lua0J1ZmZlclNpemU7CisgICAgdWludDMyX3QgbVNpbmtDaGFubmVsQ291bnQ7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbVNpbmtDaGFubmVsTWFzazsKKyAgICB2b2lkKiBtTWl4ZXJCdWZmZXI7ICAgICAgICAgICAgICAgICAvLyBtaXhlciBvdXRwdXQgYnVmZmVyLgorICAgIHNpemVfdCBtTWl4ZXJCdWZmZXJTaXplOworICAgIGF1ZGlvX2Zvcm1hdF90IG1NaXhlckJ1ZmZlckZvcm1hdDsgIC8vIG1peGVyIG91dHB1dCBmb3JtYXQ6IEFVRElPX0ZPUk1BVF9QQ01fKDE2X0JJVHxGTE9BVCkuCisKKyAgICBlbnVtIHtVTkRFRklORUQsIE1JWEVELCBaRVJPRUR9IG1NaXhlckJ1ZmZlclN0YXRlOworICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQ7CisgICAgdW5zaWduZWQgc2FtcGxlUmF0ZTsKKyAgICBpbnQgZmFzdFRyYWNrc0dlbjsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgZHVtbXlEdW1wU3RhdGU7CisgICAgdWludDMyX3QgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuOyAgLy8gY29waWVkIHRvIGR1bXBTdGF0ZS0+bUZyYW1lc1dyaXR0ZW4KKworICAgIC8vIG5leHQgMiBmaWVsZHMgYXJlIHZhbGlkIG9ubHkgd2hlbiB0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IKKyAgICBBdWRpb1RpbWVzdGFtcCB0aW1lc3RhbXA7CisgICAgdWludDMyX3QgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKKwogfTsgIC8vIGNsYXNzIEZhc3RNaXhlcgogCi0vLyBEZXNjcmliZXMgdGhlIHVuZGVycnVuIHN0YXR1cyBmb3IgYSBzaW5nbGUgInB1bGwiIGF0dGVtcHQKLWVudW0gRmFzdFRyYWNrVW5kZXJydW5TdGF0dXMgewotICAgIFVOREVSUlVOX0ZVTEwsICAgICAgLy8gZnJhbWVzUmVhZHkoKSBpcyBmdWxsIGZyYW1lIGNvdW50LCBubyB1bmRlcnJ1bgotICAgIFVOREVSUlVOX1BBUlRJQUwsICAgLy8gZnJhbWVzUmVhZHkoKSBpcyBub24temVybyBidXQgPCBmdWxsIGZyYW1lIGNvdW50LCBwYXJ0aWFsIHVuZGVycnVuCi0gICAgVU5ERVJSVU5fRU1QVFksICAgICAvLyBmcmFtZXNSZWFkeSgpIGlzIHplcm8sIHRvdGFsIHVuZGVycnVuCi19OwotCi0vLyBVbmRlcnJ1biBjb3VudGVycyBhcmUgbm90IHJlc2V0IHRvIHplcm8gZm9yIG5ldyB0cmFja3Mgb3IgaWYgdHJhY2sgZ2VuZXJhdGlvbiBjaGFuZ2VzLgotLy8gVGhpcyBwYWNrZWQgcmVwcmVzZW50YXRpb24gaXMgdXNlZCB0byBrZWVwIHRoZSBpbmZvcm1hdGlvbiBhdG9taWMuCi11bmlvbiBGYXN0VHJhY2tVbmRlcnJ1bnMgewotICAgIEZhc3RUcmFja1VuZGVycnVucygpIHsgbUF0b21pYyA9IDA7Ci0gICAgICAgICAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKHNpemVvZihGYXN0VHJhY2tVbmRlcnJ1bnMpID09IHNpemVvZih1aW50MzJfdCkpOyB9Ci0gICAgRmFzdFRyYWNrVW5kZXJydW5zKGNvbnN0IEZhc3RUcmFja1VuZGVycnVucyYgY29weUZyb20pIDogbUF0b21pYyhjb3B5RnJvbS5tQXRvbWljKSB7IH0KLSAgICBGYXN0VHJhY2tVbmRlcnJ1bnMmIG9wZXJhdG9yPShjb25zdCBGYXN0VHJhY2tVbmRlcnJ1bnMmIHJocykKLSAgICAgICAgICAgIHsgaWYgKHRoaXMgIT0gJnJocykgbUF0b21pYyA9IHJocy5tQXRvbWljOyByZXR1cm4gKnRoaXM7IH0KLSAgICBzdHJ1Y3QgewotI2RlZmluZSBVTkRFUlJVTl9CSVRTIDEwCi0jZGVmaW5lIFVOREVSUlVOX01BU0sgKCgxIDw8IFVOREVSUlVOX0JJVFMpIC0gMSkKLSAgICAgICAgdWludDMyX3QgbUZ1bGwgICAgOiBVTkRFUlJVTl9CSVRTOyAvLyBmcmFtZXNSZWFkeSgpIGlzIGZ1bGwgZnJhbWUgY291bnQKLSAgICAgICAgdWludDMyX3QgbVBhcnRpYWwgOiBVTkRFUlJVTl9CSVRTOyAvLyBmcmFtZXNSZWFkeSgpIGlzIG5vbi16ZXJvIGJ1dCA8IGZ1bGwgZnJhbWUgY291bnQKLSAgICAgICAgdWludDMyX3QgbUVtcHR5ICAgOiBVTkRFUlJVTl9CSVRTOyAvLyBmcmFtZXNSZWFkeSgpIGlzIHplcm8KLSAgICAgICAgRmFzdFRyYWNrVW5kZXJydW5TdGF0dXMgbU1vc3RSZWNlbnQgOiAyOyAgICAvLyBzdGF0dXMgb2YgbW9zdCByZWNlbnQgZnJhbWVzUmVhZHkoKQotICAgIH0gICAgICAgIG1CaXRGaWVsZHM7Ci1wcml2YXRlOgotICAgIHVpbnQzMl90IG1BdG9taWM7Ci19OwotCi0vLyBSZXByZXNlbnRzIHRoZSBkdW1wIHN0YXRlIG9mIGEgZmFzdCB0cmFjawotc3RydWN0IEZhc3RUcmFja0R1bXAgewotICAgIEZhc3RUcmFja0R1bXAoKSA6IG1GcmFtZXNSZWFkeSgwKSB7IH0KLSAgICAvKnZpcnR1YWwqLyB+RmFzdFRyYWNrRHVtcCgpIHsgfQotICAgIEZhc3RUcmFja1VuZGVycnVucyBtVW5kZXJydW5zOwotICAgIHNpemVfdCBtRnJhbWVzUmVhZHk7ICAgICAgICAvLyBtb3N0IHJlY2VudCB2YWx1ZSBvbmx5OyBubyBsb25nLXRlcm0gc3RhdGlzdGljcyBrZXB0Ci19OwotCi0vLyBUaGUgRmFzdE1peGVyRHVtcFN0YXRlIGtlZXBzIGEgY2FjaGUgb2YgRmFzdE1peGVyIHN0YXRpc3RpY3MgdGhhdCBjYW4gYmUgbG9nZ2VkIGJ5IGR1bXBzeXMuCi0vLyBFYWNoIGluZGl2aWR1YWwgbmF0aXZlIHdvcmQtc2l6ZWQgZmllbGQgaXMgYWNjZXNzZWQgYXRvbWljYWxseS4gIEJ1dCB0aGUKLS8vIG92ZXJhbGwgc3RydWN0dXJlIGlzIG5vbi1hdG9taWMsIHRoYXQgaXMgdGhlcmUgbWF5IGJlIGFuIGluY29uc2lzdGVuY3kgYmV0d2VlbiBmaWVsZHMuCi0vLyBObyBiYXJyaWVycyBvciBsb2NrcyBhcmUgdXNlZCBmb3IgZWl0aGVyIHdyaXRpbmcgb3IgcmVhZGluZy4KLS8vIE9ubHkgUE9EIHR5cGVzIGFyZSBwZXJtaXR0ZWQsIGFuZCB0aGUgY29udGVudHMgc2hvdWxkbid0IGJlIHRydXN0ZWQgKGkuZS4gZG8gcmFuZ2UgY2hlY2tzKS4KLS8vIEl0IGhhcyBhIGRpZmZlcmVudCBsaWZldGltZSB0aGFuIHRoZSBGYXN0TWl4ZXIsIGFuZCBzbyBpdCBjYW4ndCBiZSBhIG1lbWJlciBvZiBGYXN0TWl4ZXIuCi1zdHJ1Y3QgRmFzdE1peGVyRHVtcFN0YXRlIHsKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUoCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ04gPSBrU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlCi0jZW5kaWYKLSAgICAgICAgICAgICk7Ci0gICAgLyp2aXJ0dWFsKi8gfkZhc3RNaXhlckR1bXBTdGF0ZSgpOwotCi0gICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCi0KLSAgICBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBtQ29tbWFuZDsgICAvLyBjdXJyZW50IGNvbW1hbmQKLSAgICB1aW50MzJfdCBtV3JpdGVTZXF1ZW5jZTsgICAgLy8gaW5jcmVtZW50ZWQgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHdyaXRlKCkKLSAgICB1aW50MzJfdCBtRnJhbWVzV3JpdHRlbjsgICAgLy8gdG90YWwgbnVtYmVyIG9mIGZyYW1lcyB3cml0dGVuIHN1Y2Nlc3NmdWxseQotICAgIHVpbnQzMl90IG1OdW1UcmFja3M7ICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgYWN0aXZlIGZhc3QgdHJhY2tzCi0gICAgdWludDMyX3QgbVdyaXRlRXJyb3JzOyAgICAgIC8vIHRvdGFsIG51bWJlciBvZiB3cml0ZSgpIGVycm9ycwotICAgIHVpbnQzMl90IG1VbmRlcnJ1bnM7ICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgdW5kZXJydW5zCi0gICAgdWludDMyX3QgbU92ZXJydW5zOyAgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBvdmVycnVucwotICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOwotICAgIHNpemVfdCAgIG1GcmFtZUNvdW50OwotICAgIHN0cnVjdCB0aW1lc3BlYyBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIG1lYXN1cmVkIHdhcm11cCB0aW1lCi0gICAgdWludDMyX3QgbVdhcm11cEN5Y2xlczsgICAgIC8vIG51bWJlciBvZiBsb29wIGN5Y2xlcyByZXF1aXJlZCB0byB3YXJtdXAKLSAgICB1aW50MzJfdCBtVHJhY2tNYXNrOyAgICAgICAgLy8gbWFzayBvZiBhY3RpdmUgdHJhY2tzCi0gICAgRmFzdFRyYWNrRHVtcCAgIG1UcmFja3NbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsKLQotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgIC8vIFJlY2VudGx5IGNvbGxlY3RlZCBzYW1wbGVzIG9mIHBlci1jeWNsZSBtb25vdG9uaWMgdGltZSwgdGhyZWFkIENQVSB0aW1lLCBhbmQgQ1BVIGZyZXF1ZW5jeS4KLSAgICAvLyBrU2FtcGxpbmdOIGlzIG1heCBzaXplIG9mIHNhbXBsaW5nIGZyYW1lIChzdGF0aXN0aWNzKSwgYW5kIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IDB4ODAwMC4KLSAgICAvLyBUaGUgc2FtcGxlIGFycmF5cyBhcmUgdmlydHVhbGx5IGFsbG9jYXRlZCBiYXNlZCBvbiB0aGlzIGNvbXBpbGUtdGltZSBjb25zdGFudCwKLSAgICAvLyBidXQgYXJlIG9ubHkgaW5pdGlhbGl6ZWQgYW5kIHVzZWQgYmFzZWQgb24gdGhlIHJ1bnRpbWUgcGFyYW1ldGVyIG1TYW1wbGluZ04uCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ04gPSAweDgwMDA7Ci0gICAgLy8gQ29tcGlsZS10aW1lIGNvbnN0YW50IGZvciBhICJsb3cgUkFNIGRldmljZSIsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCi0gICAgLy8gVGhpcyB2YWx1ZSB3YXMgY2hvc2VuIHN1Y2ggdGhhdCBlYWNoIGFycmF5IHVzZXMgMSBzbWFsbCBwYWdlICg0IEtieXRlcykuCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UgPSAweDQwMDsKLSAgICAvLyBDb3JyZXNwb25kaW5nIHJ1bnRpbWUgbWF4aW11bSBzaXplIG9mIHNhbXBsZSBhcnJheXMsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCi0gICAgdWludDMyX3QgbVNhbXBsaW5nTjsKLSAgICAvLyBUaGUgYm91bmRzIGRlZmluZSB0aGUgaW50ZXJ2YWwgb2YgdmFsaWQgc2FtcGxlcywgYW5kIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOgotICAgIC8vICAgICAgbmV3ZXN0IG9wZW4gKGV4Y2x1ZGVkKSBlbmRwb2ludCAgID0gbG93ZXIgMTYgYml0cyBvZiBib3VuZHMsIG1vZHVsbyBOCi0gICAgLy8gICAgICBvbGRlc3QgY2xvc2VkIChpbmNsdWRlZCkgZW5kcG9pbnQgPSB1cHBlciAxNiBiaXRzIG9mIGJvdW5kcywgbW9kdWxvIE4KLSAgICAvLyBOdW1iZXIgb2YgdmFsaWQgc2FtcGxlcyBpcyBuZXdlc3QgLSBvbGRlc3QuCi0gICAgdWludDMyX3QgbUJvdW5kczsgICAgICAgICAgICAgICAgICAgLy8gYm91bmRzIGZvciBtTW9ub3RvbmljTnMsIG1UaHJlYWRDcHVOcywgYW5kIG1DcHVrSHoKLSAgICAvLyBUaGUgZWxlbWVudHMgaW4gdGhlICpOcyBhcnJheXMgYXJlIGluIHVuaXRzIG9mIG5hbm9zZWNvbmRzIDw9IDM5OTk5OTk5OTkuCi0gICAgdWludDMyX3QgbU1vbm90b25pY05zW2tTYW1wbGluZ05dOyAgLy8gZGVsdGEgbW9ub3RvbmljICh3YWxsIGNsb2NrKSB0aW1lCi0gICAgdWludDMyX3QgbUxvYWROc1trU2FtcGxpbmdOXTsgICAgICAgLy8gZGVsdGEgQ1BVIGxvYWQgaW4gdGltZQotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgIHVpbnQzMl90IG1DcHVrSHpba1NhbXBsaW5nTl07ICAgICAgIC8vIGFic29sdXRlIENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6LCBiaXRzIDAtMyBhcmUgQ1BVIwotI2VuZGlmCi0gICAgLy8gSW5jcmVhc2Ugc2FtcGxpbmcgd2luZG93IGFmdGVyIGNvbnN0cnVjdGlvbiwgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTgotICAgIHZvaWQgICAgaW5jcmVhc2VTYW1wbGluZ04odWludDMyX3Qgc2FtcGxpbmdOKTsKLSNlbmRpZgotfTsKLQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTFlNDY0OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfRFVNUF9TVEFURV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBEZXNjcmliZXMgdGhlIHVuZGVycnVuIHN0YXR1cyBmb3IgYSBzaW5nbGUgInB1bGwiIGF0dGVtcHQKK2VudW0gRmFzdFRyYWNrVW5kZXJydW5TdGF0dXMgeworICAgIFVOREVSUlVOX0ZVTEwsICAgICAgLy8gZnJhbWVzUmVhZHkoKSBpcyBmdWxsIGZyYW1lIGNvdW50LCBubyB1bmRlcnJ1bgorICAgIFVOREVSUlVOX1BBUlRJQUwsICAgLy8gZnJhbWVzUmVhZHkoKSBpcyBub24temVybyBidXQgPCBmdWxsIGZyYW1lIGNvdW50LCBwYXJ0aWFsIHVuZGVycnVuCisgICAgVU5ERVJSVU5fRU1QVFksICAgICAvLyBmcmFtZXNSZWFkeSgpIGlzIHplcm8sIHRvdGFsIHVuZGVycnVuCit9OworCisvLyBVbmRlcnJ1biBjb3VudGVycyBhcmUgbm90IHJlc2V0IHRvIHplcm8gZm9yIG5ldyB0cmFja3Mgb3IgaWYgdHJhY2sgZ2VuZXJhdGlvbiBjaGFuZ2VzLgorLy8gVGhpcyBwYWNrZWQgcmVwcmVzZW50YXRpb24gaXMgdXNlZCB0byBrZWVwIHRoZSBpbmZvcm1hdGlvbiBhdG9taWMuCit1bmlvbiBGYXN0VHJhY2tVbmRlcnJ1bnMgeworICAgIEZhc3RUcmFja1VuZGVycnVucygpIHsgbUF0b21pYyA9IDA7CisgICAgICAgICAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKHNpemVvZihGYXN0VHJhY2tVbmRlcnJ1bnMpID09IHNpemVvZih1aW50MzJfdCkpOyB9CisgICAgRmFzdFRyYWNrVW5kZXJydW5zKGNvbnN0IEZhc3RUcmFja1VuZGVycnVucyYgY29weUZyb20pIDogbUF0b21pYyhjb3B5RnJvbS5tQXRvbWljKSB7IH0KKyAgICBGYXN0VHJhY2tVbmRlcnJ1bnMmIG9wZXJhdG9yPShjb25zdCBGYXN0VHJhY2tVbmRlcnJ1bnMmIHJocykKKyAgICAgICAgICAgIHsgaWYgKHRoaXMgIT0gJnJocykgbUF0b21pYyA9IHJocy5tQXRvbWljOyByZXR1cm4gKnRoaXM7IH0KKyAgICBzdHJ1Y3QgeworI2RlZmluZSBVTkRFUlJVTl9CSVRTIDEwCisjZGVmaW5lIFVOREVSUlVOX01BU0sgKCgxIDw8IFVOREVSUlVOX0JJVFMpIC0gMSkKKyAgICAgICAgdWludDMyX3QgbUZ1bGwgICAgOiBVTkRFUlJVTl9CSVRTOyAvLyBmcmFtZXNSZWFkeSgpIGlzIGZ1bGwgZnJhbWUgY291bnQKKyAgICAgICAgdWludDMyX3QgbVBhcnRpYWwgOiBVTkRFUlJVTl9CSVRTOyAvLyBmcmFtZXNSZWFkeSgpIGlzIG5vbi16ZXJvIGJ1dCA8IGZ1bGwgZnJhbWUgY291bnQKKyAgICAgICAgdWludDMyX3QgbUVtcHR5ICAgOiBVTkRFUlJVTl9CSVRTOyAvLyBmcmFtZXNSZWFkeSgpIGlzIHplcm8KKyAgICAgICAgRmFzdFRyYWNrVW5kZXJydW5TdGF0dXMgbU1vc3RSZWNlbnQgOiAyOyAgICAvLyBzdGF0dXMgb2YgbW9zdCByZWNlbnQgZnJhbWVzUmVhZHkoKQorICAgIH0gICAgICAgIG1CaXRGaWVsZHM7Citwcml2YXRlOgorICAgIHVpbnQzMl90IG1BdG9taWM7Cit9OworCisvLyBSZXByZXNlbnRzIHRoZSBkdW1wIHN0YXRlIG9mIGEgZmFzdCB0cmFjaworc3RydWN0IEZhc3RUcmFja0R1bXAgeworICAgIEZhc3RUcmFja0R1bXAoKSA6IG1GcmFtZXNSZWFkeSgwKSB7IH0KKyAgICAvKnZpcnR1YWwqLyB+RmFzdFRyYWNrRHVtcCgpIHsgfQorICAgIEZhc3RUcmFja1VuZGVycnVucyBtVW5kZXJydW5zOworICAgIHNpemVfdCBtRnJhbWVzUmVhZHk7ICAgICAgICAvLyBtb3N0IHJlY2VudCB2YWx1ZSBvbmx5OyBubyBsb25nLXRlcm0gc3RhdGlzdGljcyBrZXB0Cit9OworCisvLyBUaGUgRmFzdE1peGVyRHVtcFN0YXRlIGtlZXBzIGEgY2FjaGUgb2YgRmFzdE1peGVyIHN0YXRpc3RpY3MgdGhhdCBjYW4gYmUgbG9nZ2VkIGJ5IGR1bXBzeXMuCisvLyBFYWNoIGluZGl2aWR1YWwgbmF0aXZlIHdvcmQtc2l6ZWQgZmllbGQgaXMgYWNjZXNzZWQgYXRvbWljYWxseS4gIEJ1dCB0aGUKKy8vIG92ZXJhbGwgc3RydWN0dXJlIGlzIG5vbi1hdG9taWMsIHRoYXQgaXMgdGhlcmUgbWF5IGJlIGFuIGluY29uc2lzdGVuY3kgYmV0d2VlbiBmaWVsZHMuCisvLyBObyBiYXJyaWVycyBvciBsb2NrcyBhcmUgdXNlZCBmb3IgZWl0aGVyIHdyaXRpbmcgb3IgcmVhZGluZy4KKy8vIE9ubHkgUE9EIHR5cGVzIGFyZSBwZXJtaXR0ZWQsIGFuZCB0aGUgY29udGVudHMgc2hvdWxkbid0IGJlIHRydXN0ZWQgKGkuZS4gZG8gcmFuZ2UgY2hlY2tzKS4KKy8vIEl0IGhhcyBhIGRpZmZlcmVudCBsaWZldGltZSB0aGFuIHRoZSBGYXN0TWl4ZXIsIGFuZCBzbyBpdCBjYW4ndCBiZSBhIG1lbWJlciBvZiBGYXN0TWl4ZXIuCitzdHJ1Y3QgRmFzdE1peGVyRHVtcFN0YXRlIDogRmFzdFRocmVhZER1bXBTdGF0ZSB7CisgICAgRmFzdE1peGVyRHVtcFN0YXRlKAorI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdOID0ga1NhbXBsaW5nTmZvckxvd1JhbURldmljZQorI2VuZGlmCisgICAgICAgICAgICApOworICAgIC8qdmlydHVhbCovIH5GYXN0TWl4ZXJEdW1wU3RhdGUoKTsKKworICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OyAgICAvLyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzdGFibGUgY29weSwgbm90IHRoZSBvcmlnaW5hbAorCisgICAgdWludDMyX3QgbVdyaXRlU2VxdWVuY2U7ICAgIC8vIGluY3JlbWVudGVkIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCB3cml0ZSgpCisgICAgdWludDMyX3QgbUZyYW1lc1dyaXR0ZW47ICAgIC8vIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkKKyAgICB1aW50MzJfdCBtTnVtVHJhY2tzOyAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBmYXN0IHRyYWNrcworICAgIHVpbnQzMl90IG1Xcml0ZUVycm9yczsgICAgICAvLyB0b3RhbCBudW1iZXIgb2Ygd3JpdGUoKSBlcnJvcnMKKyAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICBzaXplX3QgICBtRnJhbWVDb3VudDsKKyAgICB1aW50MzJfdCBtVHJhY2tNYXNrOyAgICAgICAgLy8gbWFzayBvZiBhY3RpdmUgdHJhY2tzCisgICAgRmFzdFRyYWNrRHVtcCAgIG1UcmFja3NbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsKKworI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgIC8vIENvbXBpbGUtdGltZSBjb25zdGFudCBmb3IgYSAibG93IFJBTSBkZXZpY2UiLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOLgorICAgIC8vIFRoaXMgdmFsdWUgd2FzIGNob3NlbiBzdWNoIHRoYXQgZWFjaCBhcnJheSB1c2VzIDEgc21hbGwgcGFnZSAoNCBLYnl0ZXMpLgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlID0gMHg0MDA7CisgICAgLy8gSW5jcmVhc2Ugc2FtcGxpbmcgd2luZG93IGFmdGVyIGNvbnN0cnVjdGlvbiwgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTgorICAgIHZvaWQgICAgaW5jcmVhc2VTYW1wbGluZ04odWludDMyX3Qgc2FtcGxpbmdOKTsKKyNlbmRpZgorfTsKKworfSAgIC8vIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfRFVNUF9TVEFURV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcAppbmRleCA3MzdkZTk3Li4zYWE4ZGFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKQEAgLTE0LDE0ICsxNCwxMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEZhc3RUcmFjazo6RmFzdFRyYWNrKCkgOgotICAgIG1CdWZmZXJQcm92aWRlcihOVUxMKSwgbVZvbHVtZVByb3ZpZGVyKE5VTEwpLCBtU2FtcGxlUmF0ZSgwKSwKLSAgICBtQ2hhbm5lbE1hc2soQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSwgbUdlbmVyYXRpb24oMCkKKyAgICBtQnVmZmVyUHJvdmlkZXIoTlVMTCksIG1Wb2x1bWVQcm92aWRlcihOVUxMKSwKKyAgICBtQ2hhbm5lbE1hc2soQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSwgbUZvcm1hdChBVURJT19GT1JNQVRfSU5WQUxJRCksIG1HZW5lcmF0aW9uKDApCiB7CiB9CiAKQEAgLTI5LDEwICsyOCwxMCBAQAogewogfQogCi1GYXN0TWl4ZXJTdGF0ZTo6RmFzdE1peGVyU3RhdGUoKSA6CitGYXN0TWl4ZXJTdGF0ZTo6RmFzdE1peGVyU3RhdGUoKSA6IEZhc3RUaHJlYWRTdGF0ZSgpLAorICAgIC8vIG1GYXN0VHJhY2tzCiAgICAgbUZhc3RUcmFja3NHZW4oMCksIG1UcmFja01hc2soMCksIG1PdXRwdXRTaW5rKE5VTEwpLCBtT3V0cHV0U2lua0dlbigwKSwKLSAgICBtRnJhbWVDb3VudCgwKSwgbUNvbW1hbmQoSU5JVElBTCksIG1Db2xkRnV0ZXhBZGRyKE5VTEwpLCBtQ29sZEdlbigwKSwKLSAgICBtRHVtcFN0YXRlKE5VTEwpLCBtVGVlU2luayhOVUxMKSwgbU5CTG9nV3JpdGVyKE5VTEwpCisgICAgbUZyYW1lQ291bnQoMCksIG1UZWVTaW5rKE5VTEwpCiB7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKaW5kZXggZjZlNzkwMy4uNjYxYzljYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKQEAgLTE3LDEwICsxNywxMiBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfU1RBVEVfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfU1RBVEVfSAogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgorI2luY2x1ZGUgIkZhc3RUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTI4LDkgKzMwLDggQEAKIAogY2xhc3MgVm9sdW1lUHJvdmlkZXIgewogcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgdHJhY2sgdm9sdW1lIGluIFU0XzEyIGZvcm1hdDogbGVmdCBpbiBsb3dlciBoYWxmLCByaWdodCBpbiB1cHBlciBoYWxmLiBUaGUKLSAgICAvLyBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdmFsaWRhdGluZyB0aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgaW4gcmFuZ2UuCi0gICAgdmlydHVhbCB1aW50MzJfdCBnZXRWb2x1bWVMUigpID0gMDsKKyAgICAvLyBUaGUgcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gaXMgcmVzcG9uc2libGUgZm9yIHZhbGlkYXRpbmcgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIGluIHJhbmdlLgorICAgIHZpcnR1YWwgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgZ2V0Vm9sdW1lTFIoKSA9IDA7CiBwcm90ZWN0ZWQ6CiAgICAgVm9sdW1lUHJvdmlkZXIoKSB7IH0KICAgICB2aXJ0dWFsIH5Wb2x1bWVQcm92aWRlcigpIHsgfQpAQCAtNDMsMTMgKzQ0LDEzIEBACiAKICAgICBFeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIqIG1CdWZmZXJQcm92aWRlcjsgLy8gbXVzdCBiZSBOVUxMIGlmIGluYWN0aXZlLCBvciBub24tTlVMTCBpZiBhY3RpdmUKICAgICBWb2x1bWVQcm92aWRlciogICAgICAgICBtVm9sdW1lUHJvdmlkZXI7IC8vIG9wdGlvbmFsOyBpZiBOVUxMIHRoZW4gZnVsbC1zY2FsZQotICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlOyAgICAgLy8gb3B0aW9uYWw7IGlmIHplcm8gdGhlbiB1c2UgbWl4ZXIgc2FtcGxlIHJhdGUKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAgICBtQ2hhbm5lbE1hc2s7ICAgIC8vIEFVRElPX0NIQU5ORUxfT1VUX01PTk8gb3IgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsgICAgICAgICAvLyB0cmFjayBmb3JtYXQKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtR2VuZXJhdGlvbjsgICAgIC8vIGluY3JlbWVudCB3aGVuIGFueSBmaWVsZCBpcyBhc3NpZ25lZAogfTsKIAogLy8gUmVwcmVzZW50cyBhIHNpbmdsZSBzdGF0ZSBvZiB0aGUgZmFzdCBtaXhlcgotc3RydWN0IEZhc3RNaXhlclN0YXRlIHsKK3N0cnVjdCBGYXN0TWl4ZXJTdGF0ZSA6IEZhc3RUaHJlYWRTdGF0ZSB7CiAgICAgICAgICAgICAgICAgRmFzdE1peGVyU3RhdGUoKTsKICAgICAvKnZpcnR1YWwqLyB+RmFzdE1peGVyU3RhdGUoKTsKIApAQCAtNjIsMjMgKzYzLDE2IEBACiAgICAgTkJBSU9fU2luayogbU91dHB1dFNpbms7ICAgIC8vIEhBTCBvdXRwdXQgZGV2aWNlLCBtdXN0IGFscmVhZHkgYmUgbmVnb3RpYXRlZAogICAgIGludCAgICAgICAgIG1PdXRwdXRTaW5rR2VuOyAvLyBpbmNyZW1lbnQgd2hlbiBtT3V0cHV0U2luayBpcyBhc3NpZ25lZAogICAgIHNpemVfdCAgICAgIG1GcmFtZUNvdW50OyAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHBlciBmYXN0IG1peCBidWZmZXIKLSAgICBlbnVtIENvbW1hbmQgewotICAgICAgICBJTklUSUFMID0gMCwgICAgICAgICAgICAvLyB1c2VkIG9ubHkgZm9yIHRoZSBpbml0aWFsIHN0YXRlCi0gICAgICAgIEhPVF9JRExFID0gMSwgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgQ09MRF9JRExFID0gMiwgICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGZ1dGV4Ci0gICAgICAgIElETEUgPSAzLCAgICAgICAgICAgICAgIC8vIGVpdGhlciBIT1RfSURMRSBvciBDT0xEX0lETEUKLSAgICAgICAgRVhJVCA9IDQsICAgICAgICAgICAgICAgLy8gZXhpdCBmcm9tIHRocmVhZAorCisgICAgLy8gRXh0ZW5kcyBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQKKyAgICBzdGF0aWMgY29uc3QgQ29tbWFuZAogICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFsc28gcHJvY2VzcyBjb25maWd1cmF0aW9uIGNoYW5nZXMsIGFuZCBjYW4gYmUgIm9yImVkOgogICAgICAgICBNSVggPSAweDgsICAgICAgICAgICAgICAvLyBtaXggdHJhY2tzCiAgICAgICAgIFdSSVRFID0gMHgxMCwgICAgICAgICAgIC8vIHdyaXRlIHRvIG91dHB1dCBzaW5rCi0gICAgICAgIE1JWF9XUklURSA9IDB4MTgsICAgICAgIC8vIG1peCB0cmFja3MgYW5kIHdyaXRlIHRvIG91dHB1dCBzaW5rCi0gICAgfSBtQ29tbWFuZDsKLSAgICBpbnQzMl90KiAgICBtQ29sZEZ1dGV4QWRkcjsgLy8gZm9yIENPTERfSURMRSBvbmx5LCBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIGZ1dGV4Ci0gICAgdW5zaWduZWQgICAgbUNvbGRHZW47ICAgICAgIC8vIGluY3JlbWVudCB3aGVuIENPTERfSURMRSBpcyByZXF1ZXN0ZWQgc28gaXQncyBvbmx5IHBlcmZvcm1lZCBvbmNlCisgICAgICAgIE1JWF9XUklURSA9IDB4MTg7ICAgICAgIC8vIG1peCB0cmFja3MgYW5kIHdyaXRlIHRvIG91dHB1dCBzaW5rCisKICAgICAvLyBUaGlzIG1pZ2h0IGJlIGEgb25lLXRpbWUgY29uZmlndXJhdGlvbiByYXRoZXIgdGhhbiBwZXItc3RhdGUKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUqIG1EdW1wU3RhdGU7IC8vIGlmIG5vbi1OVUxMLCB0aGVuIHVwZGF0ZSBkdW1wIHN0YXRlIHBlcmlvZGljYWxseQogICAgIE5CQUlPX1NpbmsqIG1UZWVTaW5rOyAgICAgICAvLyBpZiBub24tTlVMTCwgdGhlbiBkdXBsaWNhdGUgd3JpdGUoKXMgdG8gdGhpcyBub24tYmxvY2tpbmcgc2luawotICAgIE5CTG9nOjpXcml0ZXIqIG1OQkxvZ1dyaXRlcjsgLy8gbm9uLWJsb2NraW5nIGxvZ2dlcgogfTsgIC8vIHN0cnVjdCBGYXN0TWl4ZXJTdGF0ZQogCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTZkYWNlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJGYXN0VGhyZWFkIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19BVURJTworCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgIkZhc3RUaHJlYWQuaCIKKworI2RlZmluZSBGQVNUX0RFRkFVTFRfTlMgICAgOTk5OTk5OTk5TCAgIC8vIH4xIHNlYzogZGVmYXVsdCB0aW1lIHRvIHNsZWVwCisjZGVmaW5lIEZBU1RfSE9UX0lETEVfTlMgICAgIDEwMDAwMDBMICAgLy8gMSBtczogdGltZSB0byBzbGVlcCB3aGlsZSBob3QgaWRsaW5nCisjZGVmaW5lIE1JTl9XQVJNVVBfQ1lDTEVTICAgICAgICAgIDIgICAgLy8gbWluaW11bSBudW1iZXIgb2YgbG9vcCBjeWNsZXMgdG8gd2FpdCBmb3Igd2FybXVwCisjZGVmaW5lIE1BWF9XQVJNVVBfQ1lDTEVTICAgICAgICAgMTAgICAgLy8gbWF4aW11bSBudW1iZXIgb2YgbG9vcCBjeWNsZXMgdG8gd2FpdCBmb3Igd2FybXVwCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRmFzdFRocmVhZDo6RmFzdFRocmVhZCgpIDogVGhyZWFkKGZhbHNlIC8qY2FuQ2FsbEphdmEqLyksCisgICAgLy8gcmUtaW5pdGlhbGl6ZWQgdG8gJmluaXRpYWwgYnkgc3ViY2xhc3MgY29uc3RydWN0b3IKKyAgICAgcHJldmlvdXMoTlVMTCksIGN1cnJlbnQoTlVMTCksCisgICAgLyogb2xkVHMoezAsIDB9KSwgKi8KKyAgICBvbGRUc1ZhbGlkKGZhbHNlKSwKKyAgICBzbGVlcE5zKC0xKSwKKyAgICBwZXJpb2ROcygwKSwKKyAgICB1bmRlcnJ1bk5zKDApLAorICAgIG92ZXJydW5OcygwKSwKKyAgICBmb3JjZU5zKDApLAorICAgIHdhcm11cE5zKDApLAorICAgIC8vIHJlLWluaXRpYWxpemVkIHRvICZkdW1teUR1bXBTdGF0ZSBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcgorICAgIG1EdW1teUR1bXBTdGF0ZShOVUxMKSwKKyAgICBkdW1wU3RhdGUoTlVMTCksCisgICAgaWdub3JlTmV4dE92ZXJydW4odHJ1ZSksCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgLy8gb2xkTG9hZAorICAgIG9sZExvYWRWYWxpZChmYWxzZSksCisgICAgYm91bmRzKDApLAorICAgIGZ1bGwoZmFsc2UpLAorICAgIC8vIHRjdQorI2VuZGlmCisgICAgY29sZEdlbigwKSwKKyAgICBpc1dhcm0oZmFsc2UpLAorICAgIC8qIG1lYXN1cmVkV2FybXVwVHMoezAsIDB9KSwgKi8KKyAgICB3YXJtdXBDeWNsZXMoMCksCisgICAgLy8gZHVtbXlMb2dXcml0ZXIKKyAgICBsb2dXcml0ZXIoJmR1bW15TG9nV3JpdGVyKSwKKyAgICB0aW1lc3RhbXBTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pLAorCisgICAgY29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUwpLAorI2lmIDAKKyAgICBmcmFtZUNvdW50KDApLAorI2VuZGlmCisgICAgYXR0ZW1wdGVkV3JpdGUoZmFsc2UpCit7CisgICAgb2xkVHMudHZfc2VjID0gMDsKKyAgICBvbGRUcy50dl9uc2VjID0gMDsKKyAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYyA9IDA7CisgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKK30KKworRmFzdFRocmVhZDo6fkZhc3RUaHJlYWQoKQoreworfQorCitib29sIEZhc3RUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIGZvciAoOzspIHsKKworICAgICAgICAvLyBlaXRoZXIgbmFub3NsZWVwLCBzY2hlZF95aWVsZCwgb3IgYnVzeSB3YWl0CisgICAgICAgIGlmIChzbGVlcE5zID49IDApIHsKKyAgICAgICAgICAgIGlmIChzbGVlcE5zID4gMCkgeworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKHNsZWVwTnMgPCAxMDAwMDAwMDAwKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgcmVxID0gezAsIHNsZWVwTnN9OworICAgICAgICAgICAgICAgIG5hbm9zbGVlcCgmcmVxLCBOVUxMKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2NoZWRfeWllbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBkZWZhdWx0IHRvIGxvbmcgc2xlZXAgZm9yIG5leHQgY3ljbGUKKyAgICAgICAgc2xlZXBOcyA9IEZBU1RfREVGQVVMVF9OUzsKKworICAgICAgICAvLyBwb2xsIGZvciBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgY29uc3QgRmFzdFRocmVhZFN0YXRlICpuZXh0ID0gcG9sbCgpOworICAgICAgICBpZiAobmV4dCA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBjb250aW51ZSB0byB1c2UgdGhlIGRlZmF1bHQgaW5pdGlhbCBzdGF0ZSB1bnRpbCBhIHJlYWwgc3RhdGUgaXMgYXZhaWxhYmxlCisgICAgICAgICAgICAvLyBGSVhNRSAmaW5pdGlhbCBub3QgYXZhaWxhYmxlLCBzaG91bGQgc2F2ZSBhZGRyZXNzIGVhcmxpZXIKKyAgICAgICAgICAgIC8vQUxPR19BU1NFUlQoY3VycmVudCA9PSAmaW5pdGlhbCAmJiBwcmV2aW91cyA9PSAmaW5pdGlhbCk7CisgICAgICAgICAgICBuZXh0ID0gY3VycmVudDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbW1hbmQgPSBuZXh0LT5tQ29tbWFuZDsKKyAgICAgICAgaWYgKG5leHQgIT0gY3VycmVudCkgeworCisgICAgICAgICAgICAvLyBBcyBzb29uIGFzIHBvc3NpYmxlIG9mIGxlYXJuaW5nIG9mIGEgbmV3IGR1bXAgYXJlYSwgc3RhcnQgdXNpbmcgaXQKKyAgICAgICAgICAgIGR1bXBTdGF0ZSA9IG5leHQtPm1EdW1wU3RhdGUgIT0gTlVMTCA/IG5leHQtPm1EdW1wU3RhdGUgOiBtRHVtbXlEdW1wU3RhdGU7CisgICAgICAgICAgICBsb2dXcml0ZXIgPSBuZXh0LT5tTkJMb2dXcml0ZXIgIT0gTlVMTCA/IG5leHQtPm1OQkxvZ1dyaXRlciA6ICZkdW1teUxvZ1dyaXRlcjsKKyAgICAgICAgICAgIHNldExvZyhsb2dXcml0ZXIpOworCisgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGFsd2F5cyBoYXZlIGEgdmFsaWQgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyAobm9uLWlkbGUpIHN0YXRlLgorICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIHN0YXRlIHF1ZXVlIG9ubHkgZ3VhcmFudGVlcyBhY2Nlc3MgdG8gY3VycmVudCBhbmQgcHJldmlvdXMgc3RhdGVzLgorICAgICAgICAgICAgLy8gU28gd2hlbiB0aGVyZSBpcyBhIHRyYW5zaXRpb24gZnJvbSBhIG5vbi1pZGxlIHN0YXRlIGludG8gYW4gaWRsZSBzdGF0ZSwgd2UgbWFrZSBhCisgICAgICAgICAgICAvLyBjb3B5IG9mIHRoZSBsYXN0IGtub3duIG5vbi1pZGxlIHN0YXRlIHNvIGl0IGlzIHN0aWxsIGF2YWlsYWJsZSBvbiByZXR1cm4gZnJvbSBpZGxlLgorICAgICAgICAgICAgLy8gVGhlIHBvc3NpYmxlIHRyYW5zaXRpb25zIGFyZToKKyAgICAgICAgICAgIC8vICBub24taWRsZSAtPiBub24taWRsZSAgICB1cGRhdGUgcHJldmlvdXMgZnJvbSBjdXJyZW50IGluLXBsYWNlCisgICAgICAgICAgICAvLyAgbm9uLWlkbGUgLT4gaWRsZSAgICAgICAgdXBkYXRlIHByZXZpb3VzIGZyb20gY29weSBvZiBjdXJyZW50CisgICAgICAgICAgICAvLyAgaWRsZSAgICAgLT4gaWRsZSAgICAgICAgZG9uJ3QgdXBkYXRlIHByZXZpb3VzCisgICAgICAgICAgICAvLyAgaWRsZSAgICAgLT4gbm9uLWlkbGUgICAgZG9uJ3QgdXBkYXRlIHByZXZpb3VzCisgICAgICAgICAgICBpZiAoIShjdXJyZW50LT5tQ29tbWFuZCAmIEZhc3RUaHJlYWRTdGF0ZTo6SURMRSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29tbWFuZCAmIEZhc3RUaHJlYWRTdGF0ZTo6SURMRSkgeworICAgICAgICAgICAgICAgICAgICBvbklkbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9IGZhbHNlOworI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgICAgICAgICAgICAgICAgICBvbGRMb2FkVmFsaWQgPSBmYWxzZTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OworICAgICAgICB9CisjaWYgIUxPR19OREVCVUcKKyAgICAgICAgbmV4dCA9IE5VTEw7ICAgIC8vIG5vdCByZWZlcmVuY2VkIGFnYWluCisjZW5kaWYKKworICAgICAgICBkdW1wU3RhdGUtPm1Db21tYW5kID0gY29tbWFuZDsKKworICAgICAgICAvLyA8PCBjdXJyZW50LCBwcmV2aW91cywgY29tbWFuZCwgZHVtcFN0YXRlID4+CisKKyAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpJTklUSUFMOgorICAgICAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6SE9UX0lETEU6CisgICAgICAgICAgICBzbGVlcE5zID0gRkFTVF9IT1RfSURMRV9OUzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6Q09MRF9JRExFOgorICAgICAgICAgICAgLy8gb25seSBwZXJmb3JtIGEgY29sZCBpZGxlIGNvbW1hbmQgb25jZQorICAgICAgICAgICAgLy8gRklYTUUgY29uc2lkZXIgY2hlY2tpbmcgcHJldmlvdXMgc3RhdGUgYW5kIG9ubHkgcGVyZm9ybSBpZiBwcmV2aW91cyAhPSBDT0xEX0lETEUKKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5tQ29sZEdlbiAhPSBjb2xkR2VuKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCAqY29sZEZ1dGV4QWRkciA9IGN1cnJlbnQtPm1Db2xkRnV0ZXhBZGRyOworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGNvbGRGdXRleEFkZHIgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19kZWMoY29sZEZ1dGV4QWRkcik7CisgICAgICAgICAgICAgICAgaWYgKG9sZCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN5c2NhbGwoX19OUl9mdXRleCwgY29sZEZ1dGV4QWRkciwgRlVURVhfV0FJVF9QUklWQVRFLCBvbGQgLSAxLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHBvbGljeSA9IHNjaGVkX2dldHNjaGVkdWxlcigwKTsKKyAgICAgICAgICAgICAgICBpZiAoIShwb2xpY3kgPT0gU0NIRURfRklGTyB8fCBwb2xpY3kgPT0gU0NIRURfUlIpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3QiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVGhpcyBtYXkgYmUgb3Zlcmx5IGNvbnNlcnZhdGl2ZTsgdGhlcmUgY291bGQgYmUgdGltZXMgdGhhdCB0aGUgbm9ybWFsIG1peGVyCisgICAgICAgICAgICAgICAgLy8gcmVxdWVzdHMgc3VjaCBhIGJyaWVmIGNvbGQgaWRsZSB0aGF0IGl0IGRvZXNuJ3QgcmVxdWlyZSByZXNldHRpbmcgdGhpcyBmbGFnLgorICAgICAgICAgICAgICAgIGlzV2FybSA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKKyAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOworICAgICAgICAgICAgICAgIHdhcm11cEN5Y2xlcyA9IDA7CisgICAgICAgICAgICAgICAgc2xlZXBOcyA9IC0xOworICAgICAgICAgICAgICAgIGNvbGRHZW4gPSBjdXJyZW50LT5tQ29sZEdlbjsKKyNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgICAgICBib3VuZHMgPSAwOworICAgICAgICAgICAgICAgIGZ1bGwgPSBmYWxzZTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSAhY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZvbGRUcyk7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNsZWVwTnMgPSBGQVNUX0hPVF9JRExFX05TOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpFWElUOgorICAgICAgICAgICAgb25FeGl0KCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFpc1N1YkNsYXNzQ29tbWFuZChjb21tYW5kKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZXJlIGlzIGEgbm9uLWlkbGUgc3RhdGUgYXZhaWxhYmxlIHRvIHVzOyBkaWQgdGhlIHN0YXRlIGNoYW5nZT8KKyAgICAgICAgaWYgKGN1cnJlbnQgIT0gcHJldmlvdXMpIHsKKyAgICAgICAgICAgIG9uU3RhdGVDaGFuZ2UoKTsKKyNpZiAxICAgLy8gRklYTUUgc2hvdWxkbid0IG5lZWQgdGhpcworICAgICAgICAgICAgLy8gb25seSBwcm9jZXNzIHN0YXRlIGNoYW5nZSBvbmNlCisgICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvIHdvcmsgdXNpbmcgY3VycmVudCBzdGF0ZSBoZXJlCisgICAgICAgIGF0dGVtcHRlZFdyaXRlID0gZmFsc2U7CisgICAgICAgIG9uV29yaygpOworCisgICAgICAgIC8vIFRvIGJlIGV4YWN0bHkgcGVyaW9kaWMsIGNvbXB1dGUgdGhlIG5leHQgc2xlZXAgdGltZSBiYXNlZCBvbiBjdXJyZW50IHRpbWUuCisgICAgICAgIC8vIFRoaXMgY29kZSBkb2Vzbid0IGhhdmUgbG9uZy10ZXJtIHN0YWJpbGl0eSB3aGVuIHRoZSBzaW5rIGlzIG5vbi1ibG9ja2luZy4KKyAgICAgICAgLy8gRklYTUUgVG8gYXZvaWQgZHJpZnQsIHVzZSB0aGUgbG9jYWwgYXVkaW8gY2xvY2sgb3Igd2F0Y2ggdGhlIHNpbmsncyBmaWxsIHN0YXR1cy4KKyAgICAgICAgc3RydWN0IHRpbWVzcGVjIG5ld1RzOworICAgICAgICBpbnQgcmMgPSBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJm5ld1RzKTsKKyAgICAgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgICAgIC8vbG9nV3JpdGVyLT5sb2dUaW1lc3RhbXAobmV3VHMpOworICAgICAgICAgICAgaWYgKG9sZFRzVmFsaWQpIHsKKyAgICAgICAgICAgICAgICB0aW1lX3Qgc2VjID0gbmV3VHMudHZfc2VjIC0gb2xkVHMudHZfc2VjOworICAgICAgICAgICAgICAgIGxvbmcgbnNlYyA9IG5ld1RzLnR2X25zZWMgLSBvbGRUcy50dl9uc2VjOworICAgICAgICAgICAgICAgIEFMT0dFX0lGKHNlYyA8IDAgfHwgKHNlYyA9PSAwICYmIG5zZWMgPCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykgZmFpbGVkOiB3YXMgJWxkLiUwOWxkIGJ1dCBub3cgJWxkLiUwOWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZFRzLnR2X3NlYywgb2xkVHMudHZfbnNlYywgbmV3VHMudHZfc2VjLCBuZXdUcy50dl9uc2VjKTsKKyAgICAgICAgICAgICAgICBpZiAobnNlYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLS1zZWM7CisgICAgICAgICAgICAgICAgICAgIG5zZWMgKz0gMTAwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVG8gYXZvaWQgYW4gaW5pdGlhbCB1bmRlcnJ1biBvbiBmYXN0IHRyYWNrcyBhZnRlciBleGl0aW5nIHN0YW5kYnksCisgICAgICAgICAgICAgICAgLy8gZG8gbm90IHN0YXJ0IHB1bGxpbmcgZGF0YSBmcm9tIHRyYWNrcyBhbmQgbWl4aW5nIHVudGlsIHdhcm11cCBpcyBjb21wbGV0ZS4KKyAgICAgICAgICAgICAgICAvLyBXYXJtdXAgaXMgY29uc2lkZXJlZCBjb21wbGV0ZSBhZnRlciB0aGUgZWFybGllciBvZjoKKyAgICAgICAgICAgICAgICAvLyAgICAgIE1JTl9XQVJNVVBfQ1lDTEVTIHdyaXRlKCkgYXR0ZW1wdHMgYW5kIGxhc3Qgb25lIGJsb2NrcyBmb3IgYXQgbGVhc3Qgd2FybXVwTnMKKyAgICAgICAgICAgICAgICAvLyAgICAgIE1BWF9XQVJNVVBfQ1lDTEVTIHdyaXRlKCkgYXR0ZW1wdHMuCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBvdmVybHkgY29uc2VydmF0aXZlLCBidXQgdG8gZ2V0IGJldHRlciBhY2N1cmFjeSByZXF1aXJlcyBhIG5ldyBIQUwgQVBJLgorICAgICAgICAgICAgICAgIGlmICghaXNXYXJtICYmIGF0dGVtcHRlZFdyaXRlKSB7CisgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjICs9IHNlYzsKKyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjICs9IG5zZWM7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPj0gMTAwMDAwMDAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyAtPSAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrd2FybXVwQ3ljbGVzOworICAgICAgICAgICAgICAgICAgICBpZiAoKG5zZWMgPiB3YXJtdXBOcyAmJiB3YXJtdXBDeWNsZXMgPj0gTUlOX1dBUk1VUF9DWUNMRVMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhcm11cEN5Y2xlcyA+PSBNQVhfV0FSTVVQX0NZQ0xFUykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzV2FybSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1NZWFzdXJlZFdhcm11cFRzID0gbWVhc3VyZWRXYXJtdXBUczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdhcm11cEN5Y2xlcyA9IHdhcm11cEN5Y2xlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzbGVlcE5zID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKGlzV2FybSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCB8fCBuc2VjID4gdW5kZXJydW5OcykgeworICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBvbmx5IGxvZyBvY2Nhc2lvbmFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ1bmRlcnJ1bjogdGltZSBzaW5jZSBsYXN0IGN5Y2xlICVkLiUwM2xkIHNlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNlYywgbnNlYyAvIDEwMDAwMDBMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVVuZGVycnVucysrOworICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5zZWMgPCBvdmVycnVuTnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVOZXh0T3ZlcnJ1bikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG9ubHkgbG9nIG9jY2FzaW9uYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJvdmVycnVuOiB0aW1lIHNpbmNlIGxhc3QgY3ljbGUgJWQuJTAzbGQgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNlYywgbnNlYyAvIDEwMDAwMDBMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1PdmVycnVucysrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBtaW5pbXVtIGN5Y2xlIHRpbWUuIEl0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gY29tcGVuc2F0ZXMgZm9yIGFuIGF1ZGlvIEhBTCB3aXRoIGppdHRlciBkdWUgdG8gc2FtcGxlIHJhdGUgY29udmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gd29ya3Mgd2l0aCBhIHZhcmlhYmxlIGJ1ZmZlciBkZXB0aCBhdWRpbyBIQUwgdGhhdCBuZXZlciBwdWxscyBhdCBhCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByYXRlIDwgdGhhbiBvdmVycnVuTnMgcGVyIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIHJlY292ZXJzIGZyb20gb3ZlcnJ1biBpbW1lZGlhdGVseSBhZnRlciB1bmRlcnJ1bgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQgZG9lc24ndCB3b3JrIHdpdGggYSBub24tYmxvY2tpbmcgYXVkaW8gSEFMLgorICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBOcyA9IGZvcmNlTnMgLSBuc2VjOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgICAgICBpZiAoaXNXYXJtKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgdGhlIEZJRk8gcXVldWUgYm91bmRzCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gYm91bmRzICYgKGR1bXBTdGF0ZS0+bVNhbXBsaW5nTiAtIDEpOworICAgICAgICAgICAgICAgICAgICBib3VuZHMgPSAoYm91bmRzICYgMHhGRkZGMDAwMCkgfCAoKGJvdW5kcyArIDEpICYgMHhGRkZGKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcyArPSAweDEwMDAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEoYm91bmRzICYgKGR1bXBTdGF0ZS0+bVNhbXBsaW5nTiAtIDEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnVsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgZGVsdGEgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1vbm90b25pY05zID0gbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlYyA+IDAgJiYgc2VjIDwgNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbW9ub3RvbmljTnMgKz0gc2VjICogMTAwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHJhdyBDUFUgbG9hZCA9IGRlbHRhIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQpCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxvYWROcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyBuZXdMb2FkOworICAgICAgICAgICAgICAgICAgICByYyA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQsICZuZXdMb2FkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRMb2FkVmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWMgPSBuZXdMb2FkLnR2X3NlYyAtIG9sZExvYWQudHZfc2VjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWMgPSBuZXdMb2FkLnR2X25zZWMgLSBvbGRMb2FkLnR2X25zZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5zZWMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tc2VjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2VjICs9IDEwMDAwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWROcyA9IG5zZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYyA+IDAgJiYgc2VjIDwgNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkTnMgKz0gc2VjICogMTAwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZExvYWRWYWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2FkID0gbmV3TG9hZDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGFic29sdXRlIHZhbHVlIG9mIENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6CisgICAgICAgICAgICAgICAgICAgIGludCBjcHVOdW0gPSBzY2hlZF9nZXRjcHUoKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga0h6ID0gdGN1LmdldENwdWtIeihjcHVOdW0pOworICAgICAgICAgICAgICAgICAgICBrSHogPSAoa0h6IDw8IDQpIHwgKGNwdU51bSAmIDB4Rik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB2YWx1ZXMgaW4gRklGTyBxdWV1ZXMgZm9yIGR1bXBzeXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3RvcmVzICMxLCAjMiwgIzMgYXJlIG5vdCBhdG9taWMgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIsCisgICAgICAgICAgICAgICAgICAgIC8vIG9yIHdpdGggcmVzcGVjdCB0byBzdG9yZSAjNCBiZWxvdworICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1Nb25vdG9uaWNOc1tpXSA9IG1vbm90b25pY05zOworICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1Mb2FkTnNbaV0gPSBsb2FkTnM7CisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUNwdWtIeltpXSA9IGtIejsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHN0b3JlICM0IGlzIG5vdCBhdG9taWMgd2l0aCByZXNwZWN0IHRvIHN0b3JlcyAjMSwgIzIsICMzIGFib3ZlLCBidXQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5ld2VzdCBvcGVuICYgb2xkZXN0IGNsb3NlZCBoYWx2ZXMgYXJlIGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlcgorICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1Cb3VuZHMgPSBib3VuZHM7CisgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQoImN5Y2xlX21zIiwgbW9ub3RvbmljTnMgLyAxMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgQVRSQUNFX0lOVCgibG9hZF91cyIsIGxvYWROcyAvIDEwMDApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBmaXJzdCB0aW1lIHRocm91Z2ggdGhlIGxvb3AKKyAgICAgICAgICAgICAgICBvbGRUc1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzbGVlcE5zID0gcGVyaW9kTnM7CisgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2xkVHMgPSBuZXdUczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG1vbm90b25pYyBjbG9jayBpcyBicm9rZW4KKyAgICAgICAgICAgIG9sZFRzVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHNsZWVwTnMgPSBwZXJpb2ROczsKKyAgICAgICAgfQorCisgICAgfSAgIC8vIGZvciAoOzspCisKKyAgICAvLyBuZXZlciByZXR1cm4gJ3RydWUnOyBUaHJlYWQ6Ol90aHJlYWRMb29wKCkgbG9ja3MgbXV0ZXggd2hpY2ggY2FuIHJlc3VsdCBpbiBwcmlvcml0eSBpbnZlcnNpb24KK30KKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzMwMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX1RIUkVBRF9ICisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2luY2x1ZGUgIkZhc3RUaHJlYWRTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEZhc3RUaHJlYWQgaXMgdGhlIGNvbW1vbiBhYnN0cmFjdCBiYXNlIGNsYXNzIG9mIEZhc3RNaXhlciBhbmQgRmFzdENhcHR1cmUKK2NsYXNzIEZhc3RUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKKworcHVibGljOgorICAgICAgICAgICAgRmFzdFRocmVhZCgpOworICAgIHZpcnR1YWwgfkZhc3RUaHJlYWQoKTsKKworcHJpdmF0ZToKKyAgICAvLyBpbXBsZW1lbnQgVGhyZWFkOjp0aHJlYWRMb29wKCkKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOworCitwcm90ZWN0ZWQ6CisgICAgLy8gY2FsbG91dHMgdG8gc3ViY2xhc3MgaW4gc2FtZSBsZXhpY2FsIG9yZGVyIGFzIHRoZXkgd2VyZSBpbiBvcmlnaW5hbCBGYXN0TWl4ZXIuY3BwCisgICAgLy8gRklYTUUgbmVlZCBjb21tZW50cworICAgIHZpcnR1YWwgY29uc3QgRmFzdFRocmVhZFN0YXRlICpwb2xsKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZXRMb2coTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyIF9fdW51c2VkKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgb25JZGxlKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbkV4aXQoKSA9IDA7CisgICAgdmlydHVhbCBib29sIGlzU3ViQ2xhc3NDb21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBjb21tYW5kKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uU3RhdGVDaGFuZ2UoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uV29yaygpID0gMDsKKworICAgIC8vIEZJWE1FIHRoZXNlIGZvcm1lciBsb2NhbCB2YXJpYWJsZXMgbmVlZCBjb21tZW50cyBhbmQgdG8gYmUgcmVuYW1lZCB0byBoYXZlIGFuICJtIiBwcmVmaXgKKyAgICBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKnByZXZpb3VzOworICAgIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqY3VycmVudDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgb2xkVHM7CisgICAgYm9vbCBvbGRUc1ZhbGlkOworICAgIGxvbmcgc2xlZXBOczsgICAvLyAtMTogYnVzeSB3YWl0LCAwOiBzY2hlZF95aWVsZCwgPiAwOiBuYW5vc2xlZXAKKyAgICBsb25nIHBlcmlvZE5zOyAgICAgIC8vIGV4cGVjdGVkIHBlcmlvZDsgdGhlIHRpbWUgcmVxdWlyZWQgdG8gcmVuZGVyIG9uZSBtaXggYnVmZmVyCisgICAgbG9uZyB1bmRlcnJ1bk5zOyAgICAvLyB1bmRlcnJ1biBsaWtlbHkgd2hlbiB3cml0ZSBjeWNsZSBpcyBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZQorICAgIGxvbmcgb3ZlcnJ1bk5zOyAgICAgLy8gb3ZlcnJ1biBsaWtlbHkgd2hlbiB3cml0ZSBjeWNsZSBpcyBsZXNzIHRoYW4gdGhpcyB2YWx1ZQorICAgIGxvbmcgZm9yY2VOczsgICAgICAgLy8gaWYgb3ZlcnJ1biBkZXRlY3RlZCwgZm9yY2UgdGhlIHdyaXRlIGN5Y2xlIHRvIHRha2UgdGhpcyBtdWNoIHRpbWUKKyAgICBsb25nIHdhcm11cE5zOyAgICAgIC8vIHdhcm11cCBjb21wbGV0ZSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGdyZWF0ZXIgdGhhbiB0byB0aGlzIHZhbHVlCisgICAgRmFzdFRocmVhZER1bXBTdGF0ZSAqbUR1bW15RHVtcFN0YXRlOworICAgIEZhc3RUaHJlYWREdW1wU3RhdGUgKmR1bXBTdGF0ZTsKKyAgICBib29sIGlnbm9yZU5leHRPdmVycnVuOyAgLy8gdXNlZCB0byBpZ25vcmUgaW5pdGlhbCBvdmVycnVuIGFuZCBmaXJzdCBhZnRlciBhbiB1bmRlcnJ1bgorI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgIHN0cnVjdCB0aW1lc3BlYyBvbGRMb2FkOyAgICAvLyBwcmV2aW91cyB2YWx1ZSBvZiBjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEKQorICAgIGJvb2wgb2xkTG9hZFZhbGlkOyAgLy8gd2hldGhlciBvbGRMb2FkIGlzIHZhbGlkCisgICAgdWludDMyX3QgYm91bmRzOworICAgIGJvb2wgZnVsbDsgICAgICAgICAgLy8gd2hldGhlciB3ZSBoYXZlIGNvbGxlY3RlZCBhdCBsZWFzdCBtU2FtcGxpbmdOIHNhbXBsZXMKKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyAgICBUaHJlYWRDcHVVc2FnZSB0Y3U7ICAgICAvLyBmb3IgcmVhZGluZyB0aGUgY3VycmVudCBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIegorI2VuZGlmCisjZW5kaWYKKyAgICB1bnNpZ25lZCBjb2xkR2VuOyAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUNvbGRHZW4KKyAgICBib29sIGlzV2FybTsgICAgICAgIC8vIHRydWUgbWVhbnMgcmVhZHkgdG8gbWl4LCBmYWxzZSBtZWFucyB3YWl0IGZvciB3YXJtdXAgYmVmb3JlIG1peGluZworICAgIHN0cnVjdCB0aW1lc3BlYyBtZWFzdXJlZFdhcm11cFRzOyAgLy8gaG93IGxvbmcgZGlkIGl0IHRha2UgZm9yIHdhcm11cCB0byBjb21wbGV0ZQorICAgIHVpbnQzMl90IHdhcm11cEN5Y2xlczsgIC8vIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHJlcXVpcmVkIHRvIHdhcm11cAorICAgIE5CTG9nOjpXcml0ZXIgZHVtbXlMb2dXcml0ZXI7CisgICAgTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyOworICAgIHN0YXR1c190IHRpbWVzdGFtcFN0YXR1czsKKworICAgIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBjb21tYW5kOworI2lmIDAKKyAgICBzaXplX3QgZnJhbWVDb3VudDsKKyNlbmRpZgorICAgIGJvb2wgYXR0ZW1wdGVkV3JpdGU7CisKK307ICAvLyBjbGFzcyBGYXN0VGhyZWFkCisKK30gICAvLyBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19GQVNUX1RIUkVBRF9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OTQ4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmNwcApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJGYXN0VGhyZWFkU3RhdGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitGYXN0VGhyZWFkU3RhdGU6OkZhc3RUaHJlYWRTdGF0ZSgpIDoKKyAgICBtQ29tbWFuZChJTklUSUFMKSwgbUNvbGRGdXRleEFkZHIoTlVMTCksIG1Db2xkR2VuKDApLCBtRHVtcFN0YXRlKE5VTEwpLCBtTkJMb2dXcml0ZXIoTlVMTCkKKworeworfQorCitGYXN0VGhyZWFkU3RhdGU6On5GYXN0VGhyZWFkU3RhdGUoKQoreworfQorCisKK0Zhc3RUaHJlYWREdW1wU3RhdGU6OkZhc3RUaHJlYWREdW1wU3RhdGUoKSA6CisgICAgbUNvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpJTklUSUFMKSwgbVVuZGVycnVucygwKSwgbU92ZXJydW5zKDApLAorICAgIC8qIG1NZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovCisgICAgbVdhcm11cEN5Y2xlcygwKQorI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgICwgbVNhbXBsaW5nTigxKSwgbUJvdW5kcygwKQorI2VuZGlmCit7CisgICAgbU1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKKyAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKK30KKworRmFzdFRocmVhZER1bXBTdGF0ZTo6fkZhc3RUaHJlYWREdW1wU3RhdGUoKQoreworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWI4YTBhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfU1RBVEVfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX1NUQVRFX0gKKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBGYXN0VGhyZWFkRHVtcFN0YXRlOworCisvLyBSZXByZXNlbnRzIGEgc2luZ2xlIHN0YXRlIG9mIGEgRmFzdFRocmVhZAorc3RydWN0IEZhc3RUaHJlYWRTdGF0ZSB7CisgICAgICAgICAgICAgICAgRmFzdFRocmVhZFN0YXRlKCk7CisgICAgLyp2aXJ0dWFsKi8gfkZhc3RUaHJlYWRTdGF0ZSgpOworCisgICAgdHlwZWRlZiB1aW50MzJfdCBDb21tYW5kOworICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCisgICAgICAgIElOSVRJQUwgPSAwLCAgICAgICAgICAgIC8vIHVzZWQgb25seSBmb3IgdGhlIGluaXRpYWwgc3RhdGUKKyAgICAgICAgSE9UX0lETEUgPSAxLCAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICBDT0xEX0lETEUgPSAyLCAgICAgICAgICAvLyB3YWl0IGZvciB0aGUgZnV0ZXgKKyAgICAgICAgSURMRSA9IDMsICAgICAgICAgICAgICAgLy8gZWl0aGVyIEhPVF9JRExFIG9yIENPTERfSURMRQorICAgICAgICBFWElUID0gNDsgICAgICAgICAgICAgICAvLyBleGl0IGZyb20gdGhyZWFkCisgICAgICAgIC8vIGFkZGl0aW9uYWwgdmFsdWVzIGRlZmluZWQgcGVyIHN1YmNsYXNzCisgICAgQ29tbWFuZCAgICAgbUNvbW1hbmQ7ICAgICAgIC8vIGN1cnJlbnQgY29tbWFuZAorICAgIGludDMyX3QqICAgIG1Db2xkRnV0ZXhBZGRyOyAvLyBmb3IgQ09MRF9JRExFIG9ubHksIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0ZWQgZnV0ZXgKKyAgICB1bnNpZ25lZCAgICBtQ29sZEdlbjsgICAgICAgLy8gaW5jcmVtZW50IHdoZW4gQ09MRF9JRExFIGlzIHJlcXVlc3RlZCBzbyBpdCdzIG9ubHkgcGVyZm9ybWVkIG9uY2UKKworICAgIC8vIFRoaXMgbWlnaHQgYmUgYSBvbmUtdGltZSBjb25maWd1cmF0aW9uIHJhdGhlciB0aGFuIHBlci1zdGF0ZQorICAgIEZhc3RUaHJlYWREdW1wU3RhdGUqIG1EdW1wU3RhdGU7IC8vIGlmIG5vbi1OVUxMLCB0aGVuIHVwZGF0ZSBkdW1wIHN0YXRlIHBlcmlvZGljYWxseQorICAgIE5CTG9nOjpXcml0ZXIqIG1OQkxvZ1dyaXRlcjsgLy8gbm9uLWJsb2NraW5nIGxvZ2dlcgorCit9OyAgLy8gc3RydWN0IEZhc3RUaHJlYWRTdGF0ZQorCisKKy8vIEZJWE1FIGV4dHJhY3QgY29tbW9uIHBhcnQgb2YgY29tbWVudCBhdCBGYXN0TWl4ZXJEdW1wU3RhdGUKK3N0cnVjdCBGYXN0VGhyZWFkRHVtcFN0YXRlIHsKKyAgICBGYXN0VGhyZWFkRHVtcFN0YXRlKCk7CisgICAgLyp2aXJ0dWFsKi8gfkZhc3RUaHJlYWREdW1wU3RhdGUoKTsKKworICAgIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBtQ29tbWFuZDsgICAvLyBjdXJyZW50IGNvbW1hbmQKKyAgICB1aW50MzJfdCBtVW5kZXJydW5zOyAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHVuZGVycnVucworICAgIHVpbnQzMl90IG1PdmVycnVuczsgICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2Ygb3ZlcnJ1bnMKKyAgICBzdHJ1Y3QgdGltZXNwZWMgbU1lYXN1cmVkV2FybXVwVHM7ICAvLyBtZWFzdXJlZCB3YXJtdXAgdGltZQorICAgIHVpbnQzMl90IG1XYXJtdXBDeWNsZXM7ICAgICAvLyBudW1iZXIgb2YgbG9vcCBjeWNsZXMgcmVxdWlyZWQgdG8gd2FybXVwCisKKyNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKKyAgICAvLyBSZWNlbnRseSBjb2xsZWN0ZWQgc2FtcGxlcyBvZiBwZXItY3ljbGUgbW9ub3RvbmljIHRpbWUsIHRocmVhZCBDUFUgdGltZSwgYW5kIENQVSBmcmVxdWVuY3kuCisgICAgLy8ga1NhbXBsaW5nTiBpcyBtYXggc2l6ZSBvZiBzYW1wbGluZyBmcmFtZSAoc3RhdGlzdGljcyksIGFuZCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSAweDgwMDAuCisgICAgLy8gVGhlIHNhbXBsZSBhcnJheXMgYXJlIHZpcnR1YWxseSBhbGxvY2F0ZWQgYmFzZWQgb24gdGhpcyBjb21waWxlLXRpbWUgY29uc3RhbnQsCisgICAgLy8gYnV0IGFyZSBvbmx5IGluaXRpYWxpemVkIGFuZCB1c2VkIGJhc2VkIG9uIHRoZSBydW50aW1lIHBhcmFtZXRlciBtU2FtcGxpbmdOLgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrU2FtcGxpbmdOID0gMHg4MDAwOworICAgIC8vIENvcnJlc3BvbmRpbmcgcnVudGltZSBtYXhpbXVtIHNpemUgb2Ygc2FtcGxlIGFycmF5cywgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTi4KKyAgICB1aW50MzJfdCBtU2FtcGxpbmdOOworICAgIC8vIFRoZSBib3VuZHMgZGVmaW5lIHRoZSBpbnRlcnZhbCBvZiB2YWxpZCBzYW1wbGVzLCBhbmQgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6CisgICAgLy8gICAgICBuZXdlc3Qgb3BlbiAoZXhjbHVkZWQpIGVuZHBvaW50ICAgPSBsb3dlciAxNiBiaXRzIG9mIGJvdW5kcywgbW9kdWxvIE4KKyAgICAvLyAgICAgIG9sZGVzdCBjbG9zZWQgKGluY2x1ZGVkKSBlbmRwb2ludCA9IHVwcGVyIDE2IGJpdHMgb2YgYm91bmRzLCBtb2R1bG8gTgorICAgIC8vIE51bWJlciBvZiB2YWxpZCBzYW1wbGVzIGlzIG5ld2VzdCAtIG9sZGVzdC4KKyAgICB1aW50MzJfdCBtQm91bmRzOyAgICAgICAgICAgICAgICAgICAvLyBib3VuZHMgZm9yIG1Nb25vdG9uaWNOcywgbVRocmVhZENwdU5zLCBhbmQgbUNwdWtIegorICAgIC8vIFRoZSBlbGVtZW50cyBpbiB0aGUgKk5zIGFycmF5cyBhcmUgaW4gdW5pdHMgb2YgbmFub3NlY29uZHMgPD0gMzk5OTk5OTk5OS4KKyAgICB1aW50MzJfdCBtTW9ub3RvbmljTnNba1NhbXBsaW5nTl07ICAvLyBkZWx0YSBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUKKyAgICB1aW50MzJfdCBtTG9hZE5zW2tTYW1wbGluZ05dOyAgICAgICAvLyBkZWx0YSBDUFUgbG9hZCBpbiB0aW1lCisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisgICAgdWludDMyX3QgbUNwdWtIeltrU2FtcGxpbmdOXTsgICAgICAgLy8gYWJzb2x1dGUgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHosIGJpdHMgMC0zIGFyZSBDUFUjCisjZW5kaWYKKyNlbmRpZgorCit9OyAgLy8gc3RydWN0IEZhc3RUaHJlYWREdW1wU3RhdGUKKworfSAgIC8vIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX1NUQVRFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTQ0MDUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCkBAIC0wLDAgKzEsNjk1IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgorI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE5vdGU6IHRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgdXNlZCBmb3IgZXh0cmVtZWx5IHZlcmJvc2UgbG9nZ2luZyBtZXNzYWdlLiAgSW4KKy8vIG9yZGVyIHRvIHJ1biB3aXRoIEFMT0dfQVNTRVJUIHR1cm5lZCBvbiwgd2UgbmVlZCB0byBoYXZlIExPR19OREVCVUcgc2V0IHRvCisvLyAwOyBidXQgb25lIHNpZGUgZWZmZWN0IG9mIHRoaXMgaXMgdG8gdHVybiBhbGwgTE9HVidzIGFzIHdlbGwuICBTb21lIG1lc3NhZ2VzCisvLyBhcmUgc28gdmVyYm9zZSB0aGF0IHdlIHdhbnQgdG8gc3VwcHJlc3MgdGhlbSBldmVuIHdoZW4gd2UgaGF2ZSBBTE9HX0FTU0VSVAorLy8gdHVybmVkIG9uLiAgRG8gbm90IHVuY29tbWVudCB0aGUgI2RlZiBiZWxvdyB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91CisvLyBhcmUgZG9pbmcgYW5kIHdhbnQgdG8gc2VlIGFsbCBvZiB0aGUgZXh0cmVtZWx5IHZlcmJvc2UgbWVzc2FnZXMuCisvLyNkZWZpbmUgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2lmZGVmIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5saXN0QXVkaW9Qb3J0cyhudW1fcG9ydHMsIHBvcnRzKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKKy8qIEdldCBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+Z2V0QXVkaW9Qb3J0KHBvcnQpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworCisvKiBDb25uZWN0IGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgeworICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCisvKiBEaXNjb25uZWN0IGEgcGF0Y2ggKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworCisvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhleSBhdHRyaWJ1dGVzICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgeworICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmxpc3RBdWRpb1BhdGNoZXMobnVtX3BhdGNoZXMsIHBhdGNoZXMpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgeworICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworCitBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoUGFuZWwoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1BdWRpb0ZsaW5nZXIoYXVkaW9GbGluZ2VyKQoreworfQorCitBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6On5QYXRjaFBhbmVsKCkKK3sKK30KKworLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyBfX3VudXNlZCkKK3sKKyAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMiKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qIEdldCBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCBfX3VudXNlZCkKK3sKKyAgICBBTE9HVigiZ2V0QXVkaW9Qb3J0Iik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKKy8qIENvbm5lY3QgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCBoYW5kbGUgJWQiLAorICAgICAgICAgIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcywgKmhhbmRsZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFsSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKKyAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKGhhbmRsZSA9PSBOVUxMIHx8IHBhdGNoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAwIHx8IHBhdGNoLT5udW1fc291cmNlcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCB8fAorICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA9PSAwIHx8IHBhdGNoLT5udW1fc2lua3MgPiBBVURJT19QQVRDSF9QT1JUU19NQVgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gbGltaXQgbnVtYmVyIG9mIHNvdXJjZXMgdG8gMSBmb3Igbm93IG9yIDIgc291cmNlcyBmb3Igc3BlY2lhbCBjcm9zcyBodyBtb2R1bGUgY2FzZS4KKyAgICAvLyBvbmx5IHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBjYW4gcmVxdWVzdCBhIHBhdGNoIGNyZWF0aW9uIHdpdGggMiBzb3VyY2VzLgorICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPiAyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoKmhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7ICpoYW5kbGUgIT0gMCAmJiBpbmRleCA8IG1QYXRjaGVzLnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICAgICAgaWYgKCpoYW5kbGUgPT0gbVBhdGNoZXNbaW5kZXhdLT5tSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSByZW1vdmluZyBwYXRjaCBoYW5kbGUgJWQiLCAqaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSBtUGF0Y2hlc1tpbmRleF0tPm1IYWxIYW5kbGU7CisgICAgICAgICAgICAgICAgbVBhdGNoZXMucmVtb3ZlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgUGF0Y2ggKm5ld1BhdGNoID0gbmV3IFBhdGNoKHBhdGNoKTsKKworICAgIHN3aXRjaCAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSkgeworICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6IHsKKyAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBvbmx5IG9uZSBzaW5rIGlmIGNvbm5lY3Rpb24gdG8gYSBtaXggb3IgYWNyb3NzIEhXIG1vZHVsZXMKKyAgICAgICAgICAgICAgICBpZiAoKHBhdGNoLT5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5leHQubWl4Lmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID4gMSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyByZWplY3QgY29ubmVjdGlvbiB0byBkaWZmZXJlbnQgc2luayB0eXBlcworICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBwYXRjaC0+c2lua3NbMF0udHlwZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGRpZmZlcmVudCBzaW5rIHR5cGVzIGluIHNhbWUgcGF0Y2ggbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gbGltaXQgdG8gY29ubmVjdGlvbnMgYmV0d2VlbiBkZXZpY2VzIGFuZCBpbnB1dCBzdHJlYW1zIGZvciBIQUwgYmVmb3JlIDMuMAorICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0uZXh0Lm1peC5od19tb2R1bGUgPT0gc3JjTW9kdWxlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc2luayB0eXBlICVkIGZvciBkZXZpY2Ugc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnR5cGUpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSB7CisgICAgICAgICAgICAgICAgLy8gbGltaXQgdG8gZGV2aWNlIHRvIGRldmljZSBjb25uZWN0aW9uIGlmIG5vdCBvbiBzYW1lIGh3IG1vZHVsZQorICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgaW52YWxpZCBzaW5rIHR5cGUgZm9yIGNyb3NzIGh3IG1vZHVsZSIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgbnVtIHNvdXJjZXMgPT0gMiAtPT4gcmV1c2UgYW4gZXhpdGluZyBvdXRwdXQgbWl4IHRvIGNvbm5lY3QgdG8gdGhlCisgICAgICAgICAgICAgICAgLy8gc2luaworICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1sxXS5leHQubWl4Lmh3X21vZHVsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNvdXJjZSBjb21iaW5hdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZCA9IChNaXhlclRocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGNhbm5vdCBnZXQgcGxheWJhY2sgdGhyZWFkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGU7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkID0gYXVkaW9mbGluZ2VyLT5vcGVuT3V0cHV0X2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImF1ZGlvZmxpbmdlci0+b3Blbk91dHB1dF9sKCkgcmV0dXJuZWQgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5jaGFubmVsQ291bnQoKTsKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlOworICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgocGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5DaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBpbkNoYW5uZWxNYXNrOworICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5mb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUmVjb3JkVGhyZWFkID0gYXVkaW9mbGluZ2VyLT5vcGVuSW5wdXRfbChzcmNNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJhdWRpb2ZsaW5nZXItPm9wZW5JbnB1dF9sKCkgcmV0dXJuZWQgJXAgaW5DaGFubmVsTWFzayAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVJlY29yZFRocmVhZC5nZXQoKSwgaW5DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgaWYgKG5ld1BhdGNoLT5tUmVjb3JkVGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMobmV3UGF0Y2gsIHBhdGNoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQocGF0Y2gsICZoYWxIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5jcmVhdGVfYXVkaW9fcGF0Y2goaHdEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmFkZHJlc3M7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAocGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzLCAiIikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gKGNoYXIgKiljYWxsb2MoMSwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihTdHJpbmc4KGFkZHJlc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9ST1VUSU5HKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9JTlBVVF9TT1VSQ0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBBVURJT19QT1JUX1RZUEVfREVWSUNFIHNldFBhcmFtZXRlcnMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6IHsKKyAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5od19tb2R1bGU7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBsaW1pdCB0byBjb25uZWN0aW9ucyBiZXR3ZWVuIGRldmljZXMgYW5kIG91dHB1dCBzdHJlYW1zCisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgaW52YWxpZCBzaW5rIHR5cGUgJWQgZm9yIG1peCBzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0udHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBsaW1pdCB0byBjb25uZWN0aW9ucyBiZXR3ZWVuIHNpbmtzIGFuZCBzb3VyY2VzIG9uIHNhbWUgSFcgbW9kdWxlCisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBwbGF5YmFjayBJL08gaGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQocGF0Y2gsICZoYWxIYW5kbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hhciAqYWRkcmVzczsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsICIiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vRklYTUU6IHdlIG9ubHkgc3VwcG9ydCBhZGRyZXNzIG9uIGZpcnN0IHNpbmsgd2l0aCBIQUwgdmVyc2lvbiA8IDMuMAorICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IChjaGFyICopY2FsbG9jKDEsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKFN0cmluZzgoYWRkcmVzcykpOworICAgICAgICAgICAgICAgIGZyZWUoYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9ST1VUSU5HKSwgKGludCl0eXBlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CitleGl0OgorICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICpoYW5kbGUgPSBhdWRpb2ZsaW5nZXItPm5leHRVbmlxdWVJZCgpOworICAgICAgICBuZXdQYXRjaC0+bUhhbmRsZSA9ICpoYW5kbGU7CisgICAgICAgIG5ld1BhdGNoLT5tSGFsSGFuZGxlID0gaGFsSGFuZGxlOworICAgICAgICBtUGF0Y2hlcy5hZGQobmV3UGF0Y2gpOworICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIGFkZGVkIG5ldyBwYXRjaCBoYW5kbGUgJWQgaGFsSGFuZGxlICVkIiwgKmhhbmRsZSwgaGFsSGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjbGVhclBhdGNoQ29ubmVjdGlvbnMobmV3UGF0Y2gpOworICAgICAgICBkZWxldGUgbmV3UGF0Y2g7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y3JlYXRlUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICphdWRpb1BhdGNoKQoreworICAgIC8vIGNyZWF0ZSBwYXRjaCBmcm9tIHNvdXJjZSBkZXZpY2UgdG8gcmVjb3JkIHRocmVhZCBpbnB1dAorICAgIHN0cnVjdCBhdWRpb19wYXRjaCBzdWJQYXRjaDsKKyAgICBzdWJQYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgc3ViUGF0Y2guc291cmNlc1swXSA9IGF1ZGlvUGF0Y2gtPnNvdXJjZXNbMF07CisgICAgc3ViUGF0Y2gubnVtX3NpbmtzID0gMTsKKworICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5nZXRBdWRpb1BvcnRDb25maWcoJnN1YlBhdGNoLnNpbmtzWzBdKTsKKyAgICBzdWJQYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gQVVESU9fU09VUkNFX01JQzsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnN1YlBhdGNoLCAmcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLy8gY3JlYXRlIHBhdGNoIGZyb20gcGxheWJhY2sgdGhyZWFkIG91dHB1dCB0byBzaW5rIGRldmljZQorICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmdldEF1ZGlvUG9ydENvbmZpZygmc3ViUGF0Y2guc291cmNlc1swXSk7CisgICAgc3ViUGF0Y2guc2lua3NbMF0gPSBhdWRpb1BhdGNoLT5zaW5rc1swXTsKKyAgICBzdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoKCZzdWJQYXRjaCwgJnBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvLyB1c2UgYSBwc2V1ZG8gTENNIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBmcmFtZWNvdW50CisgICAgc2l6ZV90IHBsYXliYWNrRnJhbWVDb3VudCA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKTsKKyAgICBpbnQgcGxheWJhY2tTaGlmdCA9IF9fYnVpbHRpbl9jdHoocGxheWJhY2tGcmFtZUNvdW50KTsKKyAgICBzaXplX3QgcmVjb3JkRnJhbWVjb3VudCA9IHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5mcmFtZUNvdW50KCk7CisgICAgaW50IHNoaWZ0ID0gX19idWlsdGluX2N0eihyZWNvcmRGcmFtZWNvdW50KTsKKyAgICBpZiAocGxheWJhY2tTaGlmdCA8IHNoaWZ0KSB7CisgICAgICAgIHNoaWZ0ID0gcGxheWJhY2tTaGlmdDsKKyAgICB9CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAocGxheWJhY2tGcmFtZUNvdW50ICogcmVjb3JkRnJhbWVjb3VudCkgPj4gc2hpZnQ7CisgICAgQUxPR1YoImNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBwbGF5ZnJhbWVDb3VudCAlZCByZWNvcmRGcmFtZWNvdW50ICVkIGZyYW1lQ291bnQgJWQgIiwKKyAgICAgICAgICBwbGF5YmFja0ZyYW1lQ291bnQsIHJlY29yZEZyYW1lY291bnQsIGZyYW1lQ291bnQpOworCisgICAgLy8gY3JlYXRlIGEgc3BlY2lhbCByZWNvcmQgdHJhY2sgdG8gY2FwdHVyZSBmcm9tIHJlY29yZCB0aHJlYWQKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5jaGFubmVsQ291bnQoKTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbkNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRDaGFubmVsTWFzayA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxNYXNrKCk7CisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5mb3JtYXQoKTsKKworICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQgPSBuZXcgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RFRkFVTFQpOworICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgc3RhdHVzID0gcGF0Y2gtPm1QYXRjaFJlY29yZC0+aW5pdENoZWNrKCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBwYXRjaC0+bVJlY29yZFRocmVhZC0+YWRkUGF0Y2hSZWNvcmQocGF0Y2gtPm1QYXRjaFJlY29yZCk7CisKKyAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHBsYXliYWNrIHRyYWNrIHRvIHJlbmRlciB0byBwbGF5YmFjayB0aHJlYWQuCisgICAgLy8gdGhpcyB0cmFjayBpcyBnaXZlbiB0aGUgc2FtZSBidWZmZXIgYXMgdGhlIFBhdGNoUmVjb3JkIGJ1ZmZlcgorICAgIHBhdGNoLT5tUGF0Y2hUcmFjayA9IG5ldyBQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVCk7CisgICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIHN0YXR1cyA9IHBhdGNoLT5tUGF0Y2hUcmFjay0+aW5pdENoZWNrKCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5hZGRQYXRjaFRyYWNrKHBhdGNoLT5tUGF0Y2hUcmFjayk7CisKKyAgICAvLyB0aWUgcGxheWJhY2sgYW5kIHJlY29yZCB0cmFja3MgdG9nZXRoZXIKKyAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zZXRQZWVyUHJveHkocGF0Y2gtPm1QYXRjaFRyYWNrLmdldCgpKTsKKyAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnNldFBlZXJQcm94eShwYXRjaC0+bVBhdGNoUmVjb3JkLmdldCgpKTsKKworICAgIC8vIHN0YXJ0IGNhcHR1cmUgYW5kIHBsYXliYWNrCisgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c3RhcnQoQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwgMCk7CisgICAgcGF0Y2gtPm1QYXRjaFRyYWNrLT5zdGFydCgpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNsZWFyUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gpCit7CisgICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKKyAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJjbGVhclBhdGNoQ29ubmVjdGlvbnMoKSBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlICVkIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAlZCIsCisgICAgICAgICAgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSwgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKKworICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkICE9IDApIHsKKyAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c3RvcCgpOworICAgIH0KKyAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKKyAgICAgICAgcGF0Y2gtPm1QYXRjaFRyYWNrLT5zdG9wKCk7CisgICAgfQorICAgIGlmIChwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUpOworICAgICAgICBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgfQorICAgIGlmIChwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKKyAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgfQorICAgIGlmIChwYXRjaC0+bVJlY29yZFRocmVhZCAhPSAwKSB7CisgICAgICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkICE9IDApIHsKKyAgICAgICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5kZWxldGVQYXRjaFJlY29yZChwYXRjaC0+bVBhdGNoUmVjb3JkKTsKKyAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBhdWRpb2ZsaW5nZXItPmNsb3NlSW5wdXRJbnRlcm5hbF9sKHBhdGNoLT5tUmVjb3JkVGhyZWFkKTsKKyAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQgIT0gMCkgeworICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKKyAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmRlbGV0ZVBhdGNoVHJhY2socGF0Y2gtPm1QYXRjaFRyYWNrKTsKKyAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hUcmFjay5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIC8vIGlmIG51bSBzb3VyY2VzID09IDIgd2UgYXJlIHJldXNpbmcgYW4gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIHNvIHdlIGRvIG5vdCBjbG9zZSBpdAorICAgICAgICBpZiAocGF0Y2gtPm1BdWRpb1BhdGNoLm51bV9zb3VyY2VzICE9IDIpIHsKKyAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2xvc2VPdXRwdXRJbnRlcm5hbF9sKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQpOworICAgICAgICB9CisgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQuY2xlYXIoKTsKKyAgICB9Cit9CisKKy8qIERpc2Nvbm5lY3QgYSBwYXRjaCAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgc2l6ZV90IGluZGV4OworCisgICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKKyAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbVBhdGNoZXMuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGlmIChoYW5kbGUgPT0gbVBhdGNoZXNbaW5kZXhdLT5tSGFuZGxlKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5kZXggPT0gbVBhdGNoZXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIFBhdGNoICpyZW1vdmVkUGF0Y2ggPSBtUGF0Y2hlc1tpbmRleF07CisgICAgbVBhdGNoZXMucmVtb3ZlQXQoaW5kZXgpOworCisgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoOworCisgICAgc3dpdGNoIChwYXRjaC0+c291cmNlc1swXS50eXBlKSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRTogeworICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSB7CisgICAgICAgICAgICAgICAgY2xlYXJQYXRjaENvbm5lY3Rpb25zKHJlbW92ZWRQYXRjaCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VfYXVkaW9fcGF0Y2goaHdEZXZpY2UsIHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrUmVjb3JkVGhyZWFkX2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9ST1VUSU5HKSwgMCk7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgQVVESU9fUE9SVF9UWVBFX0RFVklDRSBzZXRQYXJhbWV0ZXJzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDogeworICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9ICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4Lmh3X21vZHVsZTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkcpLCAwKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBkZWxldGUgcmVtb3ZlZFBhdGNoOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZXkgYXR0cmlidXRlcyAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzIF9fdW51c2VkKQoreworICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzIik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnIik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOworICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlOworICAgIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGU7CisgICAgfQorCisgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkobW9kdWxlKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzZXRBdWRpb1BvcnRDb25maWcoKSBiYWQgaHcgbW9kdWxlICVkIiwgbW9kdWxlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CisgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7CisgICAgICAgIHJldHVybiBod0RldmljZS0+c2V0X2F1ZGlvX3BvcnRfY29uZmlnKGh3RGV2aWNlLCBjb25maWcpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzExNzljCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaApAQCAtMCwwICsxLDc4IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIElOQ0xVRElOR19GUk9NX0FVRElPRkxJTkdFUl9ICisgICAgI2Vycm9yIFRoaXMgaGVhZGVyIGZpbGUgc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgZnJvbSBBdWRpb0ZsaW5nZXIuaAorI2VuZGlmCisKK2NsYXNzIFBhdGNoUGFuZWwgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisKKyAgICBjbGFzcyBQYXRjaDsKKworICAgIFBhdGNoUGFuZWwoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyKTsKKyAgICB2aXJ0dWFsIH5QYXRjaFBhbmVsKCk7CisKKyAgICAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLworICAgIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzKTsKKworICAgIC8qIEdldCBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCisgICAgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8qIENyZWF0ZSBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KKyAgICBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKKworICAgIC8qIFJlbGVhc2UgYSBwYXRjaCAqLworICAgIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBkZXZpY2VzIGFuZCB0aGV5IGF0dHJpYnV0ZXMgKi8KKyAgICBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyk7CisKKyAgICAvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCisgICAgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworICAgIHN0YXR1c190IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICphdWRpb1BhdGNoKTsKKyAgICB2b2lkIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gpOworCisgICAgY2xhc3MgUGF0Y2ggeworICAgIHB1YmxpYzoKKyAgICAgICAgUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCkgOgorICAgICAgICAgICAgbUF1ZGlvUGF0Y2goKnBhdGNoKSwgbUhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksCisgICAgICAgICAgICBtSGFsSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwgbVJlY29yZFBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwKKyAgICAgICAgICAgIG1QbGF5YmFja1BhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7fQorICAgICAgICB+UGF0Y2goKSB7fQorCisgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAgICAgICAgICAgICAgbUF1ZGlvUGF0Y2g7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbUhhbmRsZTsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtSGFsSGFuZGxlOworICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gICAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZDsKKyAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s+ICBtUGF0Y2hUcmFjazsKKyAgICAgICAgc3A8UmVjb3JkVGhyZWFkPiAgICAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkOworICAgICAgICBzcDxSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkPiAgIG1QYXRjaFJlY29yZDsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtUmVjb3JkUGF0Y2hIYW5kbGU7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbVBsYXliYWNrUGF0Y2hIYW5kbGU7CisKKyAgICB9OworCitwcml2YXRlOgorICAgIGNvbnN0IHdwPEF1ZGlvRmxpbmdlcj4gICAgICBtQXVkaW9GbGluZ2VyOworICAgIFNvcnRlZFZlY3RvciA8UGF0Y2ggKj4gICAgICBtUGF0Y2hlczsKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCmluZGV4IDQzYjc3ZjMuLmVlNDgyNzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCkBAIC0yOSwxNCArMjksMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VHJhY2soKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCiAgICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiA9IDApOwpAQCAtNTMsNiArNTYsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBtU3RyZWFtVHlwZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX09GRkxPQUQpICE9IDA7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RJUkVDVCkgIT0gMDsgfQogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgRWZmZWN0SWQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0QXV4QnVmZmVyKGludCBFZmZlY3RJZCwgaW50MzJfdCAqYnVmZmVyKTsKQEAgLTY0LDcgKzY4LDcgQEAKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNpZ25hbCgpOwogCiAvLyBpbXBsZW1lbnQgRmFzdE1peGVyU3RhdGU6OlZvbHVtZVByb3ZpZGVyIGludGVyZmFjZQotICAgIHZpcnR1YWwgdWludDMyX3QgICAgZ2V0Vm9sdW1lTFIoKTsKKyAgICB2aXJ0dWFsIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IGdldFZvbHVtZUxSKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCk7CiAKQEAgLTkzLDEwICs5NywxMCBAQAogICAgIGJvb2wgaXNSZWFkeSgpIGNvbnN0OwogICAgIHZvaWQgc2V0UGF1c2VkKCkgeyBtU3RhdGUgPSBQQVVTRUQ7IH0KICAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICBib29sIGlzT3V0cHV0VHJhY2soKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0NOVCk7Ci0gICAgfQorICAgIGJvb2wgaXNGbHVzaFBlbmRpbmcoKSBjb25zdCB7IHJldHVybiBtRmx1c2hId1BlbmRpbmc7IH0KKyAgICB2b2lkIGZsdXNoQWNrKCk7CisgICAgYm9vbCBpc1Jlc3VtZVBlbmRpbmcoKTsKKyAgICB2b2lkIHJlc3VtZUFjaygpOwogCiAgICAgc3A8SU1lbW9yeT4gc2hhcmVkQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbVNoYXJlZEJ1ZmZlcjsgfQogCkBAIC0xMDksOCArMTEzLDYgQEAKICAgICB2b2lkIHRyaWdnZXJFdmVudHMoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCB0eXBlKTsKICAgICB2b2lkIGludmFsaWRhdGUoKTsKICAgICBib29sIGlzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1Jc0ludmFsaWQ7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNUaW1lZFRyYWNrKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICBib29sIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpICE9IDA7IH0KICAgICBpbnQgZmFzdEluZGV4KCkgY29uc3QgeyByZXR1cm4gbUZhc3RJbmRleDsgfQogCiBwcm90ZWN0ZWQ6CkBAIC0xMzcsOCArMTM5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIEhBTCB3aGVuIHRoaXMgdHJhY2sgd2lsbCBiZSBmdWxseSByZW5kZXJlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gemVybyBtZWFucyBub3QgbW9uaXRvcmluZwogcHJpdmF0ZToKLSAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IG1GbGFnczsKLQogICAgIC8vIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBvbmx5IGZvciBmYXN0IHRyYWNrcywgYW5kIHNob3VsZCBiZSBpbiBhIHN1YmNsYXNzCiAgICAgaW50ICAgICAgICAgICAgICAgICBtRmFzdEluZGV4OyAvLyBpbmRleCB3aXRoaW4gRmFzdE1peGVyU3RhdGU6Om1GYXN0VHJhY2tzW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlaXRoZXIgbUZhc3RJbmRleCA9PSAtMSBpZiBub3QgaXNGYXN0VHJhY2soKQpAQCAtMTU0LDYgKzE1NCwxMiBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgbUlzSW52YWxpZDsgLy8gbm9uLXJlc2V0dGFibGUgbGF0Y2gsIHNldCBieSBpbnZhbGlkYXRlKCkKICAgICBBdWRpb1RyYWNrU2VydmVyUHJveHkqICBtQXVkaW9UcmFja1NlcnZlclByb3h5OwogICAgIGJvb2wgICAgICAgICAgICAgICAgbVJlc3VtZVRvU3RvcHBpbmc7IC8vIHRyYWNrIHdhcyBwYXVzZWQgaW4gc3RvcHBpbmcgc3RhdGUuCisgICAgYm9vbCAgICAgICAgICAgICAgICBtRmx1c2hId1BlbmRpbmc7IC8vIHRyYWNrIHJlcXVlc3RzIGZvciB0aHJlYWQgZmx1c2gKKworICAgIC8vIGZvciBsYXN0IGNhbGwgdG8gZ2V0VGltZXN0YW1wCisgICAgYm9vbCAgICAgICAgICAgICAgICBtUHJldmlvdXNWYWxpZDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1QcmV2aW91c0ZyYW1lc1dyaXR0ZW47CisgICAgQXVkaW9UaW1lc3RhbXAgICAgICBtUHJldmlvdXNUaW1lc3RhbXA7CiB9OyAgLy8gZW5kIG9mIFRyYWNrCiAKIGNsYXNzIFRpbWVkVHJhY2sgOiBwdWJsaWMgVHJhY2sgewpAQCAtMTg1LDcgKzE5MSw2IEBACiAgICAgfTsKIAogICAgIC8vIE1peGVyIGZhY2luZyBtZXRob2RzLgotICAgIHZpcnR1YWwgYm9vbCBpc1RpbWVkVHJhY2soKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CiAgICAgdmlydHVhbCBzaXplX3QgZnJhbWVzUmVhZHkoKSBjb25zdDsKIAogICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCkBAIC0yODYsMyArMjkxLDM0IEBACiAgICAgRHVwbGljYXRpbmdUaHJlYWQqIGNvbnN0IG1Tb3VyY2VUaHJlYWQ7IC8vIGZvciB3YWl0VGltZU1zKCkgaW4gd3JpdGUoKQogICAgIEF1ZGlvVHJhY2tDbGllbnRQcm94eSogICAgICBtQ2xpZW50UHJveHk7CiB9OyAgLy8gZW5kIG9mIE91dHB1dFRyYWNrCisKKy8vIHBsYXliYWNrIHRyYWNrLCB1c2VkIGJ5IFBhdGNoUGFuZWwKK2NsYXNzIFBhdGNoVHJhY2sgOiBwdWJsaWMgVHJhY2ssIHB1YmxpYyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorCisgICAgICAgICAgICAgICAgICAgICAgICBQYXRjaFRyYWNrKFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncyk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+UGF0Y2hUcmFjaygpOworCisgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7CisKKyAgICAvLyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvYnRhaW5CdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZU91dCA9IE5VTEwpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIpOworCisgICAgICAgICAgICB2b2lkIHNldFBlZXJQcm94eShQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgKnByb3h5KSB7IG1QZWVyUHJveHkgPSBwcm94eTsgfQorCitwcml2YXRlOgorICAgIHNwPENsaWVudFByb3h5PiAgICAgICAgICAgICBtUHJveHk7CisgICAgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyKiAgIG1QZWVyUHJveHk7CisgICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgICAgIG1QZWVyVGltZW91dDsKK307ICAvLyBlbmQgb2YgUGF0Y2hUcmFjawpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCmluZGV4IDU3ZGU1NjguLjIwNGE5ZDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKQEAgLTI4LDggKzI4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflJlY29yZFRyYWNrKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsIGludCB0cmlnZ2VyU2Vzc2lvbik7CkBAIC00NSw3ICs0OCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRtcDsgfQogCiAgICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSk7CisKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgLy8gZm9yIG1TdGF0ZQpAQCAtNTksNSArNjUsNjQgQEAKICAgICAvLyByZWxlYXNlQnVmZmVyKCkgbm90IG92ZXJyaWRkZW4KIAogICAgIGJvb2wgICAgICAgICAgICAgICAgbU92ZXJmbG93OyAgLy8gb3ZlcmZsb3cgb24gbW9zdCByZWNlbnQgYXR0ZW1wdCB0byBmaWxsIGNsaWVudCBidWZmZXIKLSAgICBBdWRpb1JlY29yZFNlcnZlclByb3h5KiBtQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eTsKKworICAgICAgICAgICAvLyB1cGRhdGVkIGJ5IFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKKyAgICAgICAgICAgIEF1ZGlvUmVzYW1wbGVyICAgICAgICAgICAgICAgICAgICAgICptUmVzYW1wbGVyOworCisgICAgICAgICAgICAvLyBpbnRlcmxlYXZlZCBzdGVyZW8gcGFpcnMgb2YgZml4ZWQtcG9pbnQgUTQuMjcKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptUnNtcE91dEJ1ZmZlcjsKKyAgICAgICAgICAgIC8vIGN1cnJlbnQgYWxsb2NhdGVkIGZyYW1lIGNvdW50IGZvciB0aGUgYWJvdmUsIHdoaWNoIG1heSBiZSBsYXJnZXIgdGhhbiBuZWVkZWQKKyAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wT3V0RnJhbWVDb3VudDsKKworICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJblVucmVsOyAgIC8vIHVucmVsZWFzZWQgZnJhbWVzIHJlbWFpbmluZyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9zdCByZWNlbnQgZ2V0TmV4dEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBkZWJ1ZyBvbmx5CisKKyAgICAgICAgICAgIC8vIHJvbGxpbmcgY291bnRlciB0aGF0IGlzIG5ldmVyIGNsZWFyZWQKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5Gcm9udDsgICAvLyBuZXh0IGF2YWlsYWJsZSBmcmFtZQorCisgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgbVNpbms7ICAvLyByZWZlcmVuY2VzIGNsaWVudCdzIGJ1ZmZlciBzaW5rIGluIHNoYXJlZCBtZW1vcnkKKworICAgICAgICAgICAgLy8gc3luYyBldmVudCB0cmlnZ2VyaW5nIGFjdHVhbCBhdWRpbyBjYXB0dXJlLiBGcmFtZXMgcmVhZCBiZWZvcmUgdGhpcyBldmVudCB3aWxsCisgICAgICAgICAgICAvLyBiZSBkcm9wcGVkIGFuZCB0aGVyZWZvcmUgbm90IHJlYWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgc3A8U3luY0V2ZW50PiAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNTdGFydEV2ZW50OworCisgICAgICAgICAgICAvLyBudW1iZXIgb2YgY2FwdHVyZWQgZnJhbWVzIHRvIGRyb3AgYWZ0ZXIgdGhlIHN0YXJ0IHN5bmMgZXZlbnQgaGFzIGJlZW4gcmVjZWl2ZWQuCisgICAgICAgICAgICAvLyB3aGVuIDwgMCwgbWF4aW11bSBmcmFtZXMgdG8gZHJvcCBiZWZvcmUgc3RhcnRpbmcgY2FwdHVyZSBldmVuIGlmIHN5bmMgZXZlbnQgaXMKKyAgICAgICAgICAgIC8vIG5vdCByZWNlaXZlZAorICAgICAgICAgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1RvRHJvcDsKKworICAgICAgICAgICAgLy8gdXNlZCBieSByZXNhbXBsZXIgdG8gZmluZCBzb3VyY2UgZnJhbWVzCisgICAgICAgICAgICBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciAqbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOwogfTsKKworLy8gcGxheWJhY2sgdHJhY2ssIHVzZWQgYnkgUGF0Y2hQYW5lbAorY2xhc3MgUGF0Y2hSZWNvcmQgOiB2aXJ0dWFsIHB1YmxpYyBSZWNvcmRUcmFjaywgcHVibGljIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciB7CitwdWJsaWM6CisKKyAgICBQYXRjaFJlY29yZChSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncyk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+UGF0Y2hSZWNvcmQoKTsKKworICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cyk7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpOworCisgICAgLy8gUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIGludGVyZmFjZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb2J0YWluQnVmZmVyKFByb3h5OjpCdWZmZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVPdXQgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoUHJveHk6OkJ1ZmZlciAqYnVmZmVyKTsKKworICAgIHZvaWQgc2V0UGVlclByb3h5KFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciAqcHJveHkpIHsgbVBlZXJQcm94eSA9IHByb3h5OyB9CisKK3ByaXZhdGU6CisgICAgc3A8Q2xpZW50UHJveHk+ICAgICAgICAgICAgIG1Qcm94eTsKKyAgICBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIqICAgbVBlZXJQcm94eTsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICAgICAgbVBlZXJUaW1lb3V0OworfTsgIC8vIGVuZCBvZiBQYXRjaFJlY29yZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCmluZGV4IDE1MjQ1NWQuLjgyNDZmZWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKQEAgLTU5LDYgKzU5LDEzIEBACiAgICAgcmV0dXJuIG9rOwogfQogCitib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSB7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKKyAgICBib29sIG9rID0gY2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCk7CisgICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOworICAgIHJldHVybiBvazsKK30KKwogYm9vbCBkdW1wQWxsb3dlZCgpIHsKICAgICAvLyBkb24ndCBvcHRpbWl6ZSBmb3Igc2FtZSBwaWQsIHNpbmNlIG1lZGlhc2VydmVyIG5ldmVyIGR1bXBzIGl0c2VsZgogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCmluZGV4IDUzMWJjNTYuLmRmNmY2ZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaApAQCAtMjQsNiArMjQsNyBAQAogYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKCk7CiBib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpOwogYm9vbCBzZXR0aW5nc0FsbG93ZWQoKTsKK2Jvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOwogYm9vbCBkdW1wQWxsb3dlZCgpOwogCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5jcHAKaW5kZXggYzJkM2JiZC4uNDBkN2JjZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmNwcApAQCAtMjgsMTIgKzI4LDEyIEBACiAjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUAogdm9pZCBTdGF0ZVF1ZXVlT2JzZXJ2ZXJEdW1wOjpkdW1wKGludCBmZCkKIHsKLSAgICBmZHByaW50ZihmZCwgIlN0YXRlIHF1ZXVlIG9ic2VydmVyOiBzdGF0ZUNoYW5nZXM9JXVcbiIsIG1TdGF0ZUNoYW5nZXMpOworICAgIGRwcmludGYoZmQsICJTdGF0ZSBxdWV1ZSBvYnNlcnZlcjogc3RhdGVDaGFuZ2VzPSV1XG4iLCBtU3RhdGVDaGFuZ2VzKTsKIH0KIAogdm9pZCBTdGF0ZVF1ZXVlTXV0YXRvckR1bXA6OmR1bXAoaW50IGZkKQogewotICAgIGZkcHJpbnRmKGZkLCAiU3RhdGUgcXVldWUgbXV0YXRvcjogcHVzaERpcnR5PSV1IHB1c2hBY2s9JXUgYmxvY2tlZFNlcXVlbmNlPSV1XG4iLAorICAgIGRwcmludGYoZmQsICJTdGF0ZSBxdWV1ZSBtdXRhdG9yOiBwdXNoRGlydHk9JXUgcHVzaEFjaz0ldSBibG9ja2VkU2VxdWVuY2U9JXVcbiIsCiAgICAgICAgICAgICBtUHVzaERpcnR5LCBtUHVzaEFjaywgbUJsb2NrZWRTZXF1ZW5jZSk7CiB9CiAjZW5kaWYKQEAgLTQxLDEzICs0MSwxNCBAQAogLy8gQ29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gU3RhdGVRdWV1ZTxUPjo6U3RhdGVRdWV1ZSgpIDoKLSAgICBtTmV4dChOVUxMKSwgbUFjayhOVUxMKSwgbUN1cnJlbnQoTlVMTCksCisgICAgbUFjayhOVUxMKSwgbUN1cnJlbnQoTlVMTCksCiAgICAgbU11dGF0aW5nKCZtU3RhdGVzWzBdKSwgbUV4cGVjdGluZyhOVUxMKSwKICAgICBtSW5NdXRhdGlvbihmYWxzZSksIG1Jc0RpcnR5KGZhbHNlKSwgbUlzSW5pdGlhbGl6ZWQoZmFsc2UpCiAjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUAogICAgICwgbU9ic2VydmVyRHVtcCgmbU9ic2VydmVyRHVtbXlEdW1wKSwgbU11dGF0b3JEdW1wKCZtTXV0YXRvckR1bW15RHVtcCkKICNlbmRpZgogeworICAgIGF0b21pY19pbml0KCZtTmV4dCwgMCk7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFN0YXRlUXVldWU8VD46On5TdGF0ZVF1ZXVlKCkKQEAgLTU4LDcgKzU5LDggQEAKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgVCogU3RhdGVRdWV1ZTxUPjo6cG9sbCgpCiB7Ci0gICAgY29uc3QgVCAqbmV4dCA9IChjb25zdCBUICopIGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgodm9sYXRpbGUgaW50MzJfdCAqKSAmbU5leHQpOworICAgIGNvbnN0IFQgKm5leHQgPSAoY29uc3QgVCAqKSBhdG9taWNfbG9hZF9leHBsaWNpdCgmbU5leHQsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKwogICAgIGlmIChuZXh0ICE9IG1DdXJyZW50KSB7CiAgICAgICAgIG1BY2sgPSBuZXh0OyAgICAvLyBubyBhZGRpdGlvbmFsIGJhcnJpZXIgbmVlZGVkCiAgICAgICAgIG1DdXJyZW50ID0gbmV4dDsKQEAgLTE0MCw3ICsxNDIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gcHVibGlzaAotICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKChpbnQzMl90KSBtTXV0YXRpbmcsICh2b2xhdGlsZSBpbnQzMl90ICopICZtTmV4dCk7CisgICAgICAgIGF0b21pY19zdG9yZV9leHBsaWNpdCgmbU5leHQsICh1aW50cHRyX3QpbU11dGF0aW5nLCBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CiAgICAgICAgIG1FeHBlY3RpbmcgPSBtTXV0YXRpbmc7CiAKICAgICAgICAgLy8gY29weSB3aXRoIGNpcmN1bGFyIHdyYXBhcm91bmQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5oCmluZGV4IDljZGU2NDIuLjI3ZjZhMjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX1NUQVRFX1FVRVVFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19TVEFURV9RVUVVRV9ICiAKKyNpbmNsdWRlIDxzdGRhdG9taWMuaD4KKwogLy8gVGhlIHN0YXRlIHF1ZXVlIHRlbXBsYXRlIGNsYXNzIHdhcyBvcmlnaW5hbGx5IGRyaXZlbiBieSB0aGlzIHVzZSBjYXNlIC8gcmVxdWlyZW1lbnRzOgogLy8gIFRoZXJlIGFyZSB0d28gdGhyZWFkczogYSBmYXN0IG1peGVyLCBhbmQgYSBub3JtYWwgbWl4ZXIsIGFuZCB0aGV5IHNoYXJlIHN0YXRlLgogLy8gIFRoZSBpbnRlcmVzdGluZyBwYXJ0IG9mIHRoZSBzaGFyZWQgc3RhdGUgaXMgYSBzZXQgb2YgYWN0aXZlIGZhc3QgdHJhY2tzLApAQCAtODksNiArOTEsOCBAQAogLy8gIGFyaXRobWV0aWMgb24gdGhlIHN0YXRlIHBvaW50ZXJzLiAgSG93ZXZlciB0byB0aGUgbXV0YXRvciwgdGhlIHN0YXRlIHBvaW50ZXJzCiAvLyAgYXJlIGluIGEgZGVmaW5pdGUgY2lyY3VsYXIgb3JkZXIuCiAKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogI2lmZGVmIFNUQVRFX1FVRVVFX0RVTVAKQEAgLTE4NCw3ICsxODgsNyBAQAogICAgIFQgICAgICAgICAgICAgICAgIG1TdGF0ZXNba05dOyAgICAgIC8vIHdyaXR0ZW4gYnkgbXV0YXRvciwgcmVhZCBieSBvYnNlcnZlcgogCiAgICAgLy8gInZvbGF0aWxlIiBpcyBtZWFuaW5nbGVzcyB3aXRoIFNNUCwgYnV0IGhlcmUgaXQgaW5kaWNhdGVzIHRoYXQgd2UncmUgdXNpbmcgYXRvbWljIG9wcwotICAgIHZvbGF0aWxlIGNvbnN0IFQqIG1OZXh0OyAvLyB3cml0dGVuIGJ5IG11dGF0b3IgdG8gYWR2YW5jZSBuZXh0LCByZWFkIGJ5IG9ic2VydmVyCisgICAgYXRvbWljX3VpbnRwdHJfdCAgbU5leHQ7IC8vIHdyaXR0ZW4gYnkgbXV0YXRvciB0byBhZHZhbmNlIG5leHQsIHJlYWQgYnkgb2JzZXJ2ZXIKICAgICB2b2xhdGlsZSBjb25zdCBUKiBtQWNrOyAgLy8gd3JpdHRlbiBieSBvYnNlcnZlciB0byBhY2tub3dsZWRnZSBhZHZhbmNlIG9mIG5leHQsIHJlYWQgYnkgbXV0YXRvcgogCiAgICAgLy8gb25seSB1c2VkIGJ5IG9ic2VydmVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwCmluZGV4IDBkNWNkMGMuLjZmNDUwNWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwCkBAIC0xNiwxMiArMTYsMTQgQEAKIAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJTdGF0ZS5oIgorI2luY2x1ZGUgIkZhc3RDYXB0dXJlU3RhdGUuaCIKICNpbmNsdWRlICJTdGF0ZVF1ZXVlLmgiCiAKIC8vIEZJWE1FIGhhY2sgZm9yIGdjYwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXRlbXBsYXRlIGNsYXNzIFN0YXRlUXVldWU8RmFzdE1peGVyU3RhdGU+OyAgLy8gdHlwZWRlZiBGYXN0TWl4ZXJTdGF0ZVF1ZXVlCit0ZW1wbGF0ZSBjbGFzcyBTdGF0ZVF1ZXVlPEZhc3RNaXhlclN0YXRlPjsgICAgICAvLyB0eXBlZGVmIEZhc3RNaXhlclN0YXRlUXVldWUKK3RlbXBsYXRlIGNsYXNzIFN0YXRlUXVldWU8RmFzdENhcHR1cmVTdGF0ZT47ICAgIC8vIHR5cGVkZWYgRmFzdENhcHR1cmVTdGF0ZVF1ZXVlCiAKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAppbmRleCA5OTRjN2RiLi42M2ZlZWFhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCkBAIC0zNCw4ICszNSwxMSBAQAogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X25zLmg+CiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21pbmlmbG9hdC5oPgogCiAvLyBOQkFJTyBpbXBsZW1lbnRhdGlvbnMKKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTW9ub1BpcGUuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oPgpAQCAtNTEsNiArNTUsNyBAQAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKKyNpbmNsdWRlICJGYXN0Q2FwdHVyZS5oIgogI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKICNpbmNsdWRlICJTY2hlZHVsaW5nUG9saWN5U2VydmljZS5oIgogCkBAIC03OSw2ICs4NCw4IEBACiAjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCisjZGVmaW5lIG1heChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHJldHJ5IGNvdW50cyBmb3IgYnVmZmVyIGZpbGwgdGltZW91dApAQCAtOTYsMTggKzEwMywxOCBAQAogLy8gUmVjb3JkVGhyZWFkIGxvb3Agc2xlZXAgdGltZSB1cG9uIGFwcGxpY2F0aW9uIG92ZXJydW4gb3IgYXVkaW8gSEFMIHJlYWQgZXJyb3IKIHN0YXRpYyBjb25zdCBpbnQga1JlY29yZFRocmVhZFNsZWVwVXMgPSA1MDAwOwogCi0vLyBtYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3Igc2V0UGFyYW1ldGVycyB0byBjb21wbGV0ZQotc3RhdGljIGNvbnN0IG5zZWNzX3Qga1NldFBhcmFtZXRlcnNUaW1lb3V0TnMgPSBzZWNvbmRzKDIpOworLy8gbWF4aW11bSB0aW1lIHRvIHdhaXQgaW4gc2VuZENvbmZpZ0V2ZW50X2woKSBmb3IgYSBzdGF0dXMgdG8gYmUgcmVjZWl2ZWQKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtDb25maWdFdmVudFRpbWVvdXROcyA9IHNlY29uZHMoMik7CiAKIC8vIG1pbmltdW0gc2xlZXAgdGltZSBmb3IgdGhlIG1peGVyIHRocmVhZCBsb29wIHdoZW4gdHJhY2tzIGFyZSBhY3RpdmUgYnV0IGluIHVuZGVycnVuCiBzdGF0aWMgY29uc3QgdWludDMyX3Qga01pblRocmVhZFNsZWVwVGltZVVzID0gNTAwMDsKIC8vIG1heGltdW0gZGl2aWRlciBhcHBsaWVkIHRvIHRoZSBhY3RpdmUgc2xlZXAgdGltZSBpbiB0aGUgbWl4ZXIgdGhyZWFkIGxvb3AKIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4VGhyZWFkU2xlZXBUaW1lU2hpZnQgPSAyOwogCi0vLyBtaW5pbXVtIG5vcm1hbCBtaXggYnVmZmVyIHNpemUsIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMgcmF0aGVyIHRoYW4gZnJhbWVzCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga01pbk5vcm1hbE1peEJ1ZmZlclNpemVNcyA9IDIwOwotLy8gbWF4aW11bSBub3JtYWwgbWl4IGJ1ZmZlciBzaXplCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga01heE5vcm1hbE1peEJ1ZmZlclNpemVNcyA9IDI0OworLy8gbWluaW11bSBub3JtYWwgc2luayBidWZmZXIgc2l6ZSwgZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcyByYXRoZXIgdGhhbiBmcmFtZXMKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrTWluTm9ybWFsU2lua0J1ZmZlclNpemVNcyA9IDIwOworLy8gbWF4aW11bSBub3JtYWwgc2luayBidWZmZXIgc2l6ZQorc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhOb3JtYWxTaW5rQnVmZmVyU2l6ZU1zID0gMjQ7CiAKIC8vIE9mZmxvYWRlZCBvdXRwdXQgdGhyZWFkIHN0YW5kYnkgZGVsYXk6IGFsbG93cyB0cmFjayB0cmFuc2l0aW9uIHdpdGhvdXQgZ29pbmcgdG8gc3RhbmRieQogc3RhdGljIGNvbnN0IG5zZWNzX3Qga09mZmxvYWRTdGFuZGJ5RGVsYXlOcyA9IHNlY29uZHMoMSk7CkBAIC0xMjksOSArMTM2LDE3IEBACiAgICAgLy8gIHVwIGxhcmdlIHdyaXRlcyBpbnRvIHNtYWxsZXIgb25lcywgYW5kIHRoZSB3cmFwcGVyIHdvdWxkIG5lZWQgdG8gZGVhbCB3aXRoIHNjaGVkdWxlci4KIH0ga1VzZUZhc3RNaXhlciA9IEZhc3RNaXhlcl9TdGF0aWM7CiAKKy8vIFdoZXRoZXIgdG8gdXNlIGZhc3QgY2FwdHVyZQorc3RhdGljIGNvbnN0IGVudW0geworICAgIEZhc3RDYXB0dXJlX05ldmVyLCAgLy8gbmV2ZXIgaW5pdGlhbGl6ZSBvciB1c2U6IGZvciBkZWJ1Z2dpbmcgb25seQorICAgIEZhc3RDYXB0dXJlX0Fsd2F5cywgLy8gYWx3YXlzIGluaXRpYWxpemUgYW5kIHVzZSwgZXZlbiBpZiBub3QgbmVlZGVkOiBmb3IgZGVidWdnaW5nIG9ubHkKKyAgICBGYXN0Q2FwdHVyZV9TdGF0aWMsIC8vIGluaXRpYWxpemUgaWYgbmVlZGVkLCB0aGVuIHVzZSBhbGwgdGhlIHRpbWUgaWYgaW5pdGlhbGl6ZWQKK30ga1VzZUZhc3RDYXB0dXJlID0gRmFzdENhcHR1cmVfU3RhdGljOworCiAvLyBQcmlvcml0aWVzIGZvciByZXF1ZXN0UHJpb3JpdHkKIHN0YXRpYyBjb25zdCBpbnQga1ByaW9yaXR5QXVkaW9BcHAgPSAyOwogc3RhdGljIGNvbnN0IGludCBrUHJpb3JpdHlGYXN0TWl4ZXIgPSAzOworc3RhdGljIGNvbnN0IGludCBrUHJpb3JpdHlGYXN0Q2FwdHVyZSA9IDM7CiAKIC8vIElBdWRpb0ZsaW5nZXI6OmNyZWF0ZVRyYWNrKCkgcmVwb3J0cyBiYWNrIHRvIGNsaWVudCB0aGUgdG90YWwgc2l6ZSBvZiBzaGFyZWQgbWVtb3J5IGFyZWEKIC8vIGZvciB0aGUgdHJhY2suICBUaGUgY2xpZW50IHRoZW4gc3ViLWRpdmlkZXMgdGhpcyBpbnRvIHNtYWxsZXIgYnVmZmVycyBmb3IgaXRzIHVzZS4KQEAgLTE0MCw4ICsxNTUsMzkgQEAKIC8vIEZJWE1FIEl0IHdvdWxkIGJlIGJldHRlciBmb3IgY2xpZW50IHRvIHRlbGwgQXVkaW9GbGluZ2VyIHRoZSB2YWx1ZSBvZiBOLAogLy8gc28gQXVkaW9GbGluZ2VyIGNvdWxkIGFsbG9jYXRlIHRoZSByaWdodCBhbW91bnQgb2YgbWVtb3J5LgogLy8gU2VlIHRoZSBjbGllbnQncyBtaW5CdWZDb3VudCBhbmQgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCBjYWxjdWxhdGlvbnMgZm9yIGRldGFpbHMuCisKKy8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUsIGlmIG5vdCBzcGVjaWZpZWQgYnkgcHJvcGVydHkuCiBzdGF0aWMgY29uc3QgaW50IGtGYXN0VHJhY2tNdWx0aXBsaWVyID0gMjsKIAorLy8gVGhlIG1pbmltdW0gYW5kIG1heGltdW0gYWxsb3dlZCB2YWx1ZXMKK3N0YXRpYyBjb25zdCBpbnQga0Zhc3RUcmFja011bHRpcGxpZXJNaW4gPSAxOworc3RhdGljIGNvbnN0IGludCBrRmFzdFRyYWNrTXVsdGlwbGllck1heCA9IDI7CisKKy8vIFRoZSBhY3R1YWwgdmFsdWUgdG8gdXNlLCB3aGljaCBjYW4gYmUgc3BlY2lmaWVkIHBlci1kZXZpY2UgdmlhIHByb3BlcnR5IGFmLmZhc3RfdHJhY2tfbXVsdGlwbGllci4KK3N0YXRpYyBpbnQgc0Zhc3RUcmFja011bHRpcGxpZXIgPSBrRmFzdFRyYWNrTXVsdGlwbGllcjsKKworLy8gU2VlIFRocmVhZDo6cmVhZE9ubHlIZWFwKCkuCisvLyBJbml0aWFsbHkgdGhpcyBoZWFwIGlzIHVzZWQgdG8gYWxsb2NhdGUgY2xpZW50IGJ1ZmZlcnMgZm9yICJmYXN0IiBBdWRpb1JlY29yZC4KKy8vIEV2ZW50dWFsbHkgaXQgd2lsbCBiZSB0aGUgc2luZ2xlIGJ1ZmZlciB0aGF0IEZhc3RDYXB0dXJlIHdyaXRlcyBpbnRvIHZpYSBIQUwgcmVhZCgpLAorLy8gYW5kIHRoYXQgYWxsICJmYXN0IiBBdWRpb1JlY29yZCBjbGllbnRzIHJlYWQgZnJvbS4gIEluIGVpdGhlciBjYXNlLCB0aGUgc2l6ZSBjYW4gYmUgc21hbGwuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplID0gMHgyMDAwOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBwdGhyZWFkX29uY2VfdCBzRmFzdFRyYWNrTXVsdGlwbGllck9uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKworc3RhdGljIHZvaWQgc0Zhc3RUcmFja011bHRpcGxpZXJJbml0KCkKK3sKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgiYWYuZmFzdF90cmFja19tdWx0aXBsaWVyIiwgdmFsdWUsIE5VTEwpID4gMCkgeworICAgICAgICBjaGFyICplbmRwdHI7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdWwgPSBzdHJ0b3VsKHZhbHVlLCAmZW5kcHRyLCAwKTsKKyAgICAgICAgaWYgKCplbmRwdHIgPT0gJ1wwJyAmJiBrRmFzdFRyYWNrTXVsdGlwbGllck1pbiA8PSB1bCAmJiB1bCA8PSBrRmFzdFRyYWNrTXVsdGlwbGllck1heCkgeworICAgICAgICAgICAgc0Zhc3RUcmFja011bHRpcGxpZXIgPSAoaW50KSB1bDsKKyAgICAgICAgfQorICAgIH0KK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQpAQCAtMTg1LDcgKzIzMSwxMSBAQAogewogfQogCi12b2lkIENwdVN0YXRzOjpzYW1wbGUoY29uc3QgU3RyaW5nOCAmdGl0bGUpIHsKK3ZvaWQgQ3B1U3RhdHM6OnNhbXBsZShjb25zdCBTdHJpbmc4ICZ0aXRsZQorI2lmbmRlZiBERUJVR19DUFVfVVNBR0UKKyAgICAgICAgICAgICAgICBfX3VudXNlZAorI2VuZGlmCisgICAgICAgICkgewogI2lmZGVmIERFQlVHX0NQVV9VU0FHRQogICAgIC8vIGdldCBjdXJyZW50IHRocmVhZCdzIGRlbHRhIENQVSB0aW1lIGluIHdhbGwgY2xvY2sgbnMKICAgICBkb3VibGUgd2NOczsKQEAgLTI2OSw5ICszMTksOSBAQAogICAgIDogICBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSwKICAgICAgICAgbVR5cGUodHlwZSksCiAgICAgICAgIG1BdWRpb0ZsaW5nZXIoYXVkaW9GbGluZ2VyKSwKLSAgICAgICAgLy8gbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtQ2hhbm5lbE1hc2ssIG1DaGFubmVsQ291bnQsIG1GcmFtZVNpemUsIGFuZCBtRm9ybWF0IGFyZQotICAgICAgICAvLyBzZXQgYnkgUGxheWJhY2tUaHJlYWQ6OnJlYWRPdXRwdXRQYXJhbWV0ZXJzKCkgb3IgUmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzKCkKLSAgICAgICAgbVBhcmFtU3RhdHVzKE5PX0VSUk9SKSwKKyAgICAgICAgLy8gbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtQ2hhbm5lbE1hc2ssIG1DaGFubmVsQ291bnQsIG1GcmFtZVNpemUsIG1Gb3JtYXQsIG1CdWZmZXJTaXplCisgICAgICAgIC8vIGFyZSBzZXQgYnkgUGxheWJhY2tUaHJlYWQ6OnJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKSBvcgorICAgICAgICAvLyBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCiAgICAgICAgIC8vRklYTUU6IG1TdGFuZGJ5IHNob3VsZCBiZSB0cnVlIGhlcmUuIElzIHRoaXMgc29tZSBraW5kIG9mIGhhY2s/CiAgICAgICAgIG1TdGFuZGJ5KGZhbHNlKSwgbU91dERldmljZShvdXREZXZpY2UpLCBtSW5EZXZpY2UoaW5EZXZpY2UpLAogICAgICAgICBtQXVkaW9Tb3VyY2UoQVVESU9fU09VUkNFX0RFRkFVTFQpLCBtSWQoaWQpLApAQCAtMjgzLDEyICszMzMsOCBAQAogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjp+VGhyZWFkQmFzZSgpCiB7CiAgICAgLy8gbUNvbmZpZ0V2ZW50cyBzaG91bGQgYmUgZW1wdHksIGJ1dCBqdXN0IGluIGNhc2UgaXQgaXNuJ3QsIGZyZWUgdGhlIG1lbW9yeSBpdCBvd25zCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29uZmlnRXZlbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGRlbGV0ZSBtQ29uZmlnRXZlbnRzW2ldOwotICAgIH0KICAgICBtQ29uZmlnRXZlbnRzLmNsZWFyKCk7CiAKLSAgICBtUGFyYW1Db25kLmJyb2FkY2FzdCgpOwogICAgIC8vIGRvIG5vdCBsb2NrIHRoZSBtdXRleCBpbiBkZXN0cnVjdG9yCiAgICAgcmVsZWFzZVdha2VMb2NrX2woKTsKICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSAwKSB7CkBAIC0yOTcsNiArMzQzLDE3IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnJlYWR5VG9SdW4oKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IGluaXRDaGVjaygpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0koIkF1ZGlvRmxpbmdlcidzIHRocmVhZCAlcCByZWFkeSB0byBydW4iLCB0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiTm8gd29ya2luZyBhdWRpbyBkcml2ZXIgZm91bmQuIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpleGl0KCkKIHsKICAgICBBTE9HVigiVGhyZWFkQmFzZTo6ZXhpdCIpOwpAQCAtMzI4LDE2ICszODUsMzAgQEAKICAgICBBTE9HVigiVGhyZWFkQmFzZTo6c2V0UGFyYW1ldGVycygpICVzIiwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIG1OZXdQYXJhbWV0ZXJzLmFkZChrZXlWYWx1ZVBhaXJzKTsKKyAgICByZXR1cm4gc2VuZFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50X2woa2V5VmFsdWVQYWlycyk7Cit9CisKKy8vIHNlbmRDb25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCisvLyBDYW4gdGVtcG9yYXJpbHkgcmVsZWFzZSB0aGUgbG9jayBpZiB3YWl0aW5nIGZvciBhIHJlcGx5IGZyb20gcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkuCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRDb25maWdFdmVudF9sKHNwPENvbmZpZ0V2ZW50PiYgZXZlbnQpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBtQ29uZmlnRXZlbnRzLmFkZChldmVudCk7CisgICAgQUxPR1YoInNlbmRDb25maWdFdmVudF9sKCkgbnVtIGV2ZW50cyAlZCBldmVudCAlZCIsIG1Db25maWdFdmVudHMuc2l6ZSgpLCBldmVudC0+bVR5cGUpOwogICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotICAgIC8vIHdhaXQgY29uZGl0aW9uIHdpdGggdGltZW91dCBpbiBjYXNlIHRoZSB0aHJlYWQgbG9vcCBoYXMgZXhpdGVkCi0gICAgLy8gYmVmb3JlIHRoZSByZXF1ZXN0IGNvdWxkIGJlIHByb2Nlc3NlZAotICAgIGlmIChtUGFyYW1Db25kLndhaXRSZWxhdGl2ZShtTG9jaywga1NldFBhcmFtZXRlcnNUaW1lb3V0TnMpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHN0YXR1cyA9IG1QYXJhbVN0YXR1czsKLSAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gVElNRURfT1VUOworICAgIG1Mb2NrLnVubG9jaygpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGV2ZW50LT5tTG9jayk7CisgICAgICAgIHdoaWxlIChldmVudC0+bVdhaXRTdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChldmVudC0+bUNvbmQud2FpdFJlbGF0aXZlKGV2ZW50LT5tTG9jaywga0NvbmZpZ0V2ZW50VGltZW91dE5zKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGV2ZW50LT5tU3RhdHVzID0gVElNRURfT1VUOworICAgICAgICAgICAgICAgIGV2ZW50LT5tV2FpdFN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IGV2ZW50LT5tU3RhdHVzOwogICAgIH0KKyAgICBtTG9jay5sb2NrKCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzUwLDYyICs0MjEsMTU1IEBACiAvLyBzZW5kSW9Db25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZElvQ29uZmlnRXZlbnRfbChpbnQgZXZlbnQsIGludCBwYXJhbSkKIHsKLSAgICBJb0NvbmZpZ0V2ZW50ICppb0V2ZW50ID0gbmV3IElvQ29uZmlnRXZlbnQoZXZlbnQsIHBhcmFtKTsKLSAgICBtQ29uZmlnRXZlbnRzLmFkZChzdGF0aWNfY2FzdDxDb25maWdFdmVudCAqPihpb0V2ZW50KSk7Ci0gICAgQUxPR1YoInNlbmRJb0NvbmZpZ0V2ZW50KCkgbnVtIGV2ZW50cyAlZCBldmVudCAlZCwgcGFyYW0gJWQiLCBtQ29uZmlnRXZlbnRzLnNpemUoKSwgZXZlbnQsCi0gICAgICAgICAgICBwYXJhbSk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CisgICAgc3A8Q29uZmlnRXZlbnQ+IGNvbmZpZ0V2ZW50ID0gKENvbmZpZ0V2ZW50ICopbmV3IElvQ29uZmlnRXZlbnQoZXZlbnQsIHBhcmFtKTsKKyAgICBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7CiB9CiAKIC8vIHNlbmRQcmlvQ29uZmlnRXZlbnRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRQcmlvQ29uZmlnRXZlbnRfbChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvKQogewotICAgIFByaW9Db25maWdFdmVudCAqcHJpb0V2ZW50ID0gbmV3IFByaW9Db25maWdFdmVudChwaWQsIHRpZCwgcHJpbyk7Ci0gICAgbUNvbmZpZ0V2ZW50cy5hZGQoc3RhdGljX2Nhc3Q8Q29uZmlnRXZlbnQgKj4ocHJpb0V2ZW50KSk7Ci0gICAgQUxPR1YoInNlbmRQcmlvQ29uZmlnRXZlbnRfbCgpIG51bSBldmVudHMgJWQgcGlkICVkLCB0aWQgJWQgcHJpbyAlZCIsCi0gICAgICAgICAgbUNvbmZpZ0V2ZW50cy5zaXplKCksIHBpZCwgdGlkLCBwcmlvKTsKLSAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKKyAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgUHJpb0NvbmZpZ0V2ZW50KHBpZCwgdGlkLCBwcmlvKTsKKyAgICBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpwcm9jZXNzQ29uZmlnRXZlbnRzKCkKKy8vIHNlbmRTZXRQYXJhbWV0ZXJDb25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRTZXRQYXJhbWV0ZXJDb25maWdFdmVudF9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcikKIHsKLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgd2hpbGUgKCFtQ29uZmlnRXZlbnRzLmlzRW1wdHkoKSkgewotICAgICAgICBBTE9HVigicHJvY2Vzc0NvbmZpZ0V2ZW50cygpIHJlbWFpbmluZyBldmVudHMgJWQiLCBtQ29uZmlnRXZlbnRzLnNpemUoKSk7Ci0gICAgICAgIENvbmZpZ0V2ZW50ICpldmVudCA9IG1Db25maWdFdmVudHNbMF07Ci0gICAgICAgIG1Db25maWdFdmVudHMucmVtb3ZlQXQoMCk7Ci0gICAgICAgIC8vIHJlbGVhc2UgbUxvY2sgYmVmb3JlIGxvY2tpbmcgQXVkaW9GbGluZ2VyIG1Mb2NrOiBsb2NrIG9yZGVyIGlzIGFsd2F5cwotICAgICAgICAvLyBBdWRpb0ZsaW5nZXIgdGhlbiBUaHJlYWRCYXNlIHRvIGF2b2lkIGNyb3NzIGRlYWRsb2NrCi0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICBzd2l0Y2goZXZlbnQtPnR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBDRkdfRVZFTlRfUFJJTzogewotICAgICAgICAgICAgICAgIFByaW9Db25maWdFdmVudCAqcHJpb0V2ZW50ID0gc3RhdGljX2Nhc3Q8UHJpb0NvbmZpZ0V2ZW50ICo+KGV2ZW50KTsKLSAgICAgICAgICAgICAgICAvLyBGSVhNRSBOZWVkIHRvIHVuZGVyc3RhbmQgd2h5IHRoaXMgaGFzIGJlIGRvbmUgYXN5bmNocm9ub3VzbHkKLSAgICAgICAgICAgICAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KHByaW9FdmVudC0+cGlkKCksIHByaW9FdmVudC0+dGlkKCksIHByaW9FdmVudC0+cHJpbygpLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIlBvbGljeSBTQ0hFRF9GSUZPIHByaW9yaXR5ICVkIGlzIHVuYXZhaWxhYmxlIGZvciBwaWQgJWQgdGlkICVkOyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9FdmVudC0+cHJpbygpLCBwcmlvRXZlbnQtPnBpZCgpLCBwcmlvRXZlbnQtPnRpZCgpLCBlcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENGR19FVkVOVF9JTzogewotICAgICAgICAgICAgICAgIElvQ29uZmlnRXZlbnQgKmlvRXZlbnQgPSBzdGF0aWNfY2FzdDxJb0NvbmZpZ0V2ZW50ICo+KGV2ZW50KTsKLSAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5tTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkX2woaW9FdmVudC0+ZXZlbnQoKSwgaW9FdmVudC0+cGFyYW0oKSk7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+bUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBTE9HRSgicHJvY2Vzc0NvbmZpZ0V2ZW50cygpIHVua25vd24gZXZlbnQgdHlwZSAlZCIsIGV2ZW50LT50eXBlKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBldmVudDsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgIH0KLSAgICBtTG9jay51bmxvY2soKTsKKyAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnQoa2V5VmFsdWVQYWlyKTsKKyAgICByZXR1cm4gc2VuZENvbmZpZ0V2ZW50X2woY29uZmlnRXZlbnQpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZHVtcEJhc2UoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8Q29uZmlnRXZlbnQ+IGNvbmZpZ0V2ZW50ID0gKENvbmZpZ0V2ZW50ICopbmV3IENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudCgqcGF0Y2gsICpoYW5kbGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudERhdGEgKmRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhICopY29uZmlnRXZlbnQtPm1EYXRhLmdldCgpOworICAgICAgICAqaGFuZGxlID0gZGF0YS0+bUhhbmRsZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChoYW5kbGUpOworICAgIHJldHVybiBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7Cit9CisKKworLy8gcG9zdCBjb25kaXRpb246IG1Db25maWdFdmVudHMuaXNFbXB0eSgpCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6cHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkKK3sKKyAgICBib29sIGNvbmZpZ0NoYW5nZWQgPSBmYWxzZTsKKworICAgIHdoaWxlICghbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR1YoInByb2Nlc3NDb25maWdFdmVudHNfbCgpIHJlbWFpbmluZyBldmVudHMgJWQiLCBtQ29uZmlnRXZlbnRzLnNpemUoKSk7CisgICAgICAgIHNwPENvbmZpZ0V2ZW50PiBldmVudCA9IG1Db25maWdFdmVudHNbMF07CisgICAgICAgIG1Db25maWdFdmVudHMucmVtb3ZlQXQoMCk7CisgICAgICAgIHN3aXRjaCAoZXZlbnQtPm1UeXBlKSB7CisgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX1BSSU86IHsKKyAgICAgICAgICAgIFByaW9Db25maWdFdmVudERhdGEgKmRhdGEgPSAoUHJpb0NvbmZpZ0V2ZW50RGF0YSAqKWV2ZW50LT5tRGF0YS5nZXQoKTsKKyAgICAgICAgICAgIC8vIEZJWE1FIE5lZWQgdG8gdW5kZXJzdGFuZCB3aHkgdGhpcyBoYXMgdG8gYmUgZG9uZSBhc3luY2hyb25vdXNseQorICAgICAgICAgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eShkYXRhLT5tUGlkLCBkYXRhLT5tVGlkLCBkYXRhLT5tUHJpbywKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJQb2xpY3kgU0NIRURfRklGTyBwcmlvcml0eSAlZCBpcyB1bmF2YWlsYWJsZSBmb3IgcGlkICVkIHRpZCAlZDsgZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1QcmlvLCBkYXRhLT5tUGlkLCBkYXRhLT5tVGlkLCBlcnIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENGR19FVkVOVF9JTzogeworICAgICAgICAgICAgSW9Db25maWdFdmVudERhdGEgKmRhdGEgPSAoSW9Db25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7CisgICAgICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoZGF0YS0+bUV2ZW50LCBkYXRhLT5tUGFyYW0pOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENGR19FVkVOVF9TRVRfUEFSQU1FVEVSOiB7CisgICAgICAgICAgICBTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEgKmRhdGEgPSAoU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOworICAgICAgICAgICAgaWYgKGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woZGF0YS0+bUtleVZhbHVlUGFpcnMsIGV2ZW50LT5tU3RhdHVzKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZ0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENGR19FVkVOVF9DUkVBVEVfQVVESU9fUEFUQ0g6IHsKKyAgICAgICAgICAgIENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudERhdGEgKmRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSAqKWV2ZW50LT5tRGF0YS5nZXQoKTsKKyAgICAgICAgICAgIGV2ZW50LT5tU3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaF9sKCZkYXRhLT5tUGF0Y2gsICZkYXRhLT5tSGFuZGxlKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDRkdfRVZFTlRfUkVMRUFTRV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudERhdGEgKmRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7CisgICAgICAgICAgICBldmVudC0+bVN0YXR1cyA9IHJlbGVhc2VBdWRpb1BhdGNoX2woZGF0YS0+bUhhbmRsZSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgInByb2Nlc3NDb25maWdFdmVudHNfbCgpIHVua25vd24gZXZlbnQgdHlwZSAlZCIsIGV2ZW50LT5tVHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZXZlbnQtPm1Mb2NrKTsKKyAgICAgICAgICAgIGlmIChldmVudC0+bVdhaXRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBldmVudC0+bVdhaXRTdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBldmVudC0+bUNvbmQuc2lnbmFsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1ZfSUYobUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCksICJwcm9jZXNzQ29uZmlnRXZlbnRzX2woKSBET05FIHRocmVhZCAlcCIsIHRoaXMpOworICAgIH0KKworICAgIGlmIChjb25maWdDaGFuZ2VkKSB7CisgICAgICAgIGNhY2hlUGFyYW1ldGVyc19sKCk7CisgICAgfQorfQorCitTdHJpbmc4IGNoYW5uZWxNYXNrVG9TdHJpbmcoYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzaywgYm9vbCBvdXRwdXQpIHsKKyAgICBTdHJpbmc4IHM7CisgICAgaWYgKG91dHB1dCkgeworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQpIHMuYXBwZW5kKCJmcm9udC1sZWZ0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCkgcy5hcHBlbmQoImZyb250LXJpZ2h0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpIHMuYXBwZW5kKCJmcm9udC1jZW50ZXIsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpIHMuYXBwZW5kKCJsb3cgZnJlcSwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19MRUZUKSBzLmFwcGVuZCgiYmFjay1sZWZ0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9CQUNLX1JJR0hUKSBzLmFwcGVuZCgiYmFjay1yaWdodCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVF9PRl9DRU5URVIpIHMuYXBwZW5kKCJmcm9udC1sZWZ0LW9mLWNlbnRlciwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSKSBzLmFwcGVuZCgiZnJvbnQtcmlnaHQtb2YtY2VudGVyLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUikgcy5hcHBlbmQoImJhY2stY2VudGVyLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQpIHMuYXBwZW5kKCJzaWRlLWxlZnQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQpIHMuYXBwZW5kKCJzaWRlLXJpZ2h0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQ0VOVEVSKSBzLmFwcGVuZCgidG9wLWNlbnRlciAsIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0xFRlQpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtbGVmdCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0NFTlRFUikgcy5hcHBlbmQoInRvcC1mcm9udC1jZW50ZXIsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9SSUdIVCkgcy5hcHBlbmQoInRvcC1mcm9udC1yaWdodCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCkgcy5hcHBlbmQoInRvcC1iYWNrLWxlZnQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0NFTlRFUikgcy5hcHBlbmQoInRvcC1iYWNrLWNlbnRlciwgIiApOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX1JJR0hUKSBzLmFwcGVuZCgidG9wLWJhY2stcmlnaHQsICIgKTsKKyAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9PVVRfQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MRUZUKSBzLmFwcGVuZCgibGVmdCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVCkgcy5hcHBlbmQoInJpZ2h0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0ZST05UKSBzLmFwcGVuZCgiZnJvbnQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQkFDSykgcy5hcHBlbmQoImJhY2ssICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTEVGVF9QUk9DRVNTRUQpIHMuYXBwZW5kKCJsZWZ0LXByb2Nlc3NlZCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVF9QUk9DRVNTRUQpIHMuYXBwZW5kKCJyaWdodC1wcm9jZXNzZWQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfUFJPQ0VTU0VEKSBzLmFwcGVuZCgiZnJvbnQtcHJvY2Vzc2VkLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0tfUFJPQ0VTU0VEKSBzLmFwcGVuZCgiYmFjay1wcm9jZXNzZWQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fUFJFU1NVUkUpIHMuYXBwZW5kKCJwcmVzc3VyZSwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9YX0FYSVMpIHMuYXBwZW5kKCJYLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1lfQVhJUykgcy5hcHBlbmQoIlksICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWl9BWElTKSBzLmFwcGVuZCgiWiwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTkspIHMuYXBwZW5kKCJ2b2ljZS11cGxpbmssICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LKSBzLmFwcGVuZCgidm9pY2UtZG5saW5rLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9JTl9BTEwpIHMuYXBwZW5kKCJ1bmtub3duLCAgIik7CisgICAgfQorICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOworICAgIGlmIChzLmxlbmd0aCgpID4gMikgeworICAgICAgICBjaGFyICpzdHIgPSBzLmxvY2tCdWZmZXIobGVuKTsKKyAgICAgICAgcy51bmxvY2tCdWZmZXIobGVuIC0gMik7CisgICAgfQorICAgIHJldHVybiBzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZHVtcEJhc2UoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwpAQCAtNDEzLDQ4ICs1NzcsMzIgQEAKIAogICAgIGJvb2wgbG9ja2VkID0gQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtTG9jayk7CiAgICAgaWYgKCFsb2NrZWQpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAidGhyZWFkICVwIG1heWJlIGRlYWQgbG9ja2VkXG4iLCB0aGlzKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICBkcHJpbnRmKGZkLCAidGhyZWFkICVwIG1heWJlIGRlYWQgbG9ja2VkXG4iLCB0aGlzKTsKICAgICB9CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJpbyBoYW5kbGU6ICVkXG4iLCBtSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJUSUQ6ICVkXG4iLCBnZXRUaWQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgInN0YW5kYnk6ICVkXG4iLCBtU3RhbmRieSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlNhbXBsZSByYXRlOiAldVxuIiwgbVNhbXBsZVJhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJIQUwgZnJhbWUgY291bnQ6ICVkXG4iLCBtRnJhbWVDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNoYW5uZWwgQ291bnQ6ICV1XG4iLCBtQ2hhbm5lbENvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ2hhbm5lbCBNYXNrOiAweCUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJGcmFtZSBzaXplOiAldVxuIiwgbUZyYW1lU2l6ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5QZW5kaW5nIHNldFBhcmFtZXRlcnMgY29tbWFuZHM6IFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQoIiBJbmRleCBDb21tYW5kIik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTmV3UGFyYW1ldGVycy5zaXplKCk7ICsraSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbiAlMDJkICAgICIsIGkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQobU5ld1BhcmFtZXRlcnNbaV0pOworICAgIGRwcmludGYoZmQsICIgIEkvTyBoYW5kbGU6ICVkXG4iLCBtSWQpOworICAgIGRwcmludGYoZmQsICIgIFRJRDogJWRcbiIsIGdldFRpZCgpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBTdGFuZGJ5OiAlc1xuIiwgbVN0YW5kYnkgPyAieWVzIiA6ICJubyIpOworICAgIGRwcmludGYoZmQsICIgIFNhbXBsZSByYXRlOiAldVxuIiwgbVNhbXBsZVJhdGUpOworICAgIGRwcmludGYoZmQsICIgIEhBTCBmcmFtZSBjb3VudDogJXp1XG4iLCBtRnJhbWVDb3VudCk7CisgICAgZHByaW50ZihmZCwgIiAgSEFMIGJ1ZmZlciBzaXplOiAldSBieXRlc1xuIiwgbUJ1ZmZlclNpemUpOworICAgIGRwcmludGYoZmQsICIgIENoYW5uZWwgQ291bnQ6ICV1XG4iLCBtQ2hhbm5lbENvdW50KTsKKyAgICBkcHJpbnRmKGZkLCAiICBDaGFubmVsIE1hc2s6IDB4JTA4eCAoJXMpXG4iLCBtQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICBjaGFubmVsTWFza1RvU3RyaW5nKG1DaGFubmVsTWFzaywgbVR5cGUgIT0gUkVDT1JEKS5zdHJpbmcoKSk7CisgICAgZHByaW50ZihmZCwgIiAgRm9ybWF0OiAweCV4ICglcylcbiIsIG1IQUxGb3JtYXQsIGZvcm1hdFRvU3RyaW5nKG1IQUxGb3JtYXQpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGcmFtZSBzaXplOiAlenVcbiIsIG1GcmFtZVNpemUpOworICAgIGRwcmludGYoZmQsICIgIFBlbmRpbmcgY29uZmlnIGV2ZW50czoiKTsKKyAgICBzaXplX3QgbnVtQ29uZmlnID0gbUNvbmZpZ0V2ZW50cy5zaXplKCk7CisgICAgaWYgKG51bUNvbmZpZykgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNvbmZpZzsgaSsrKSB7CisgICAgICAgICAgICBtQ29uZmlnRXZlbnRzW2ldLT5kdW1wKGJ1ZmZlciwgU0laRSk7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4gICAgJXMiLCBidWZmZXIpOworICAgICAgICB9CisgICAgICAgIGRwcmludGYoZmQsICJcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRwcmludGYoZmQsICIgbm9uZVxuIik7CiAgICAgfQogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5cblBlbmRpbmcgY29uZmlnIGV2ZW50czogXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29uZmlnRXZlbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1Db25maWdFdmVudHNbaV0tPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KICAgICBpZiAobG9ja2VkKSB7CiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgIH0KQEAgLTQ2NiwxMCArNjE0LDExIEBACiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbi0gJWQgRWZmZWN0IENoYWluczpcbiIsIG1FZmZlY3RDaGFpbnMuc2l6ZSgpKTsKKyAgICBzaXplX3QgbnVtRWZmZWN0Q2hhaW5zID0gbUVmZmVjdENoYWlucy5zaXplKCk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAlenUgRWZmZWN0IENoYWluc1xuIiwgbnVtRWZmZWN0Q2hhaW5zKTsKICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyArK2kpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUVmZmVjdENoYWluczsgKytpKSB7CiAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IG1FZmZlY3RDaGFpbnNbaV07CiAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CiAgICAgICAgICAgICBjaGFpbi0+ZHVtcChmZCwgYXJncyk7CkBAIC01MTMsMTIgKzY2MiwxNCBAQAogICAgICAgICAgICAgICAgICAgICBiaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgIGdldFdha2VMb2NrVGFnKCksCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJtZWRpYSIpLAotICAgICAgICAgICAgICAgICAgICB1aWQpOworICAgICAgICAgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgIHRydWUgLyogRklYTUUgZm9yY2Ugb25ld2F5IGNvbnRyYXJ5IHRvIC5haWRsICovKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPmFjcXVpcmVXYWtlTG9jayhQT1dFUk1BTkFHRVJfUEFSVElBTF9XQUtFX0xPQ0ssCiAgICAgICAgICAgICAgICAgICAgIGJpbmRlciwKICAgICAgICAgICAgICAgICAgICAgZ2V0V2FrZUxvY2tUYWcoKSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIm1lZGlhIikpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigibWVkaWEiKSwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBGSVhNRSBmb3JjZSBvbmV3YXkgY29udHJhcnkgdG8gLmFpZGwgKi8pOwogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuID0gYmluZGVyOwpAQCAtNTM4LDcgKzY4OSw4IEBACiAgICAgaWYgKG1XYWtlTG9ja1Rva2VuICE9IDApIHsKICAgICAgICAgQUxPR1YoInJlbGVhc2VXYWtlTG9ja19sKCkgJXMiLCBtTmFtZSk7CiAgICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IDApIHsKLSAgICAgICAgICAgIG1Qb3dlck1hbmFnZXItPnJlbGVhc2VXYWtlTG9jayhtV2FrZUxvY2tUb2tlbiwgMCk7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLT5yZWxlYXNlV2FrZUxvY2sobVdha2VMb2NrVG9rZW4sIDAsCisgICAgICAgICAgICAgICAgICAgIHRydWUgLyogRklYTUUgZm9yY2Ugb25ld2F5IGNvbnRyYXJ5IHRvIC5haWRsICovKTsKICAgICAgICAgfQogICAgICAgICBtV2FrZUxvY2tUb2tlbi5jbGVhcigpOwogICAgIH0KQEAgLTU3NCw3ICs3MjYsOCBAQAogICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IDApIHsKICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gbmV3IEJCaW5kZXIoKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT51cGRhdGVXYWtlTG9ja1VpZHMobVdha2VMb2NrVG9rZW4sIHVpZHMuc2l6ZSgpLCB1aWRzLmFycmF5KCkpOworICAgICAgICBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT51cGRhdGVXYWtlTG9ja1VpZHMobVdha2VMb2NrVG9rZW4sIHVpZHMuc2l6ZSgpLCB1aWRzLmFycmF5KCksCisgICAgICAgICAgICAgICAgICAgIHRydWUgLyogRklYTUUgZm9yY2Ugb25ld2F5IGNvbnRyYXJ5IHRvIC5haWRsICovKTsKICAgICAgICAgQUxPR1YoImFjcXVpcmVXYWtlTG9ja19sKCkgJXMgc3RhdHVzICVkIiwgbU5hbWUsIHN0YXR1cyk7CiAgICAgfQogfQpAQCAtNTg2LDcgKzczOSw3IEBACiAgICAgbVBvd2VyTWFuYWdlci5jbGVhcigpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6UE1EZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlBNRGVhdGhSZWNpcGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKIHsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKQEAgLTczOSw4ICs4OTIsNyBAQAogICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAogICAgICAgICBpbnQgKmVuYWJsZWQsCi0gICAgICAgIHN0YXR1c190ICpzdGF0dXMKLSAgICAgICAgKQorICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogewogICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0OwogICAgIHNwPEVmZmVjdEhhbmRsZT4gaGFuZGxlOwpAQCAtNzU2LDYgKzkwOCwyNCBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCisgICAgLy8gUmVqZWN0IGFueSBlZmZlY3Qgb24gRGlyZWN0IG91dHB1dCB0aHJlYWRzIGZvciBub3csIHNpbmNlIHRoZSBmb3JtYXQgb2YKKyAgICAvLyBtU2lua0J1ZmZlciBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggZWZmZWN0IHByb2Nlc3NpbmcgKFBDTSAxNiBzdGVyZW8pLgorICAgIGlmIChtVHlwZSA9PSBESVJFQ1QpIHsKKyAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdF9sKCkgQ2Fubm90IGFkZCBlZmZlY3QgJXMgb24gRGlyZWN0IG91dHB1dCB0eXBlIHRocmVhZCAlcyIsCisgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgbU5hbWUpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLy8gUmVqZWN0IGFueSBlZmZlY3Qgb24gbWl4ZXIgb3IgZHVwbGljYXRpbmcgbXVsdGljaGFubmVsIHNpbmtzLgorICAgIC8vIFRPRE86IGZpeCBib3RoIGZvcm1hdCBhbmQgbXVsdGljaGFubmVsIGlzc3VlcyB3aXRoIGVmZmVjdHMuCisgICAgaWYgKChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBEVVBMSUNBVElORykgJiYgbUNoYW5uZWxDb3VudCAhPSBGQ0NfMikgeworICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0X2woKSBDYW5ub3QgYWRkIGVmZmVjdCAlcyBmb3IgbXVsdGljaGFubmVsKCVkKSAlcyB0aHJlYWRzIiwKKyAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBtQ2hhbm5lbENvdW50LCBtVHlwZSA9PSBNSVhFUiA/ICJNSVhFUiIgOiAiRFVQTElDQVRJTkciKTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKwogICAgIC8vIEFsbG93IGdsb2JhbCBlZmZlY3RzIG9ubHkgb24gb2ZmbG9hZGVkIGFuZCBtaXhlciB0aHJlYWRzCiAgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKICAgICAgICAgc3dpdGNoIChtVHlwZSkgewpAQCAtODI5LDcgKzk5OSwxMCBAQAogICAgICAgICB9CiAgICAgICAgIC8vIGNyZWF0ZSBlZmZlY3QgaGFuZGxlIGFuZCBjb25uZWN0IGl0IHRvIGVmZmVjdCBtb2R1bGUKICAgICAgICAgaGFuZGxlID0gbmV3IEVmZmVjdEhhbmRsZShlZmZlY3QsIGNsaWVudCwgZWZmZWN0Q2xpZW50LCBwcmlvcml0eSk7Ci0gICAgICAgIGxTdGF0dXMgPSBlZmZlY3QtPmFkZEhhbmRsZShoYW5kbGUuZ2V0KCkpOworICAgICAgICBsU3RhdHVzID0gaGFuZGxlLT5pbml0Q2hlY2soKTsKKyAgICAgICAgaWYgKGxTdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBlZmZlY3QtPmFkZEhhbmRsZShoYW5kbGUuZ2V0KCkpOworICAgICAgICB9CiAgICAgICAgIGlmIChlbmFibGVkICE9IE5VTEwpIHsKICAgICAgICAgICAgICplbmFibGVkID0gKGludCllZmZlY3QtPmlzRW5hYmxlZCgpOwogICAgICAgICB9CkBAIC04NTAsOSArMTAyMyw3IEBACiAgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgIH0KIAotICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewotICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKLSAgICB9CisgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIApAQCAtOTc2LDIxICsxMTQ3LDE4IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZGlzY29ubmVjdEVmZmVjdChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0SGFuZGxlICpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1bnBpbklmTGFzdCkgewotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBBTE9HVigiZGlzY29ubmVjdEVmZmVjdCgpICVwIGVmZmVjdCAlcCIsIHRoaXMsIGVmZmVjdC5nZXQoKSk7Ci0gICAgLy8gZGVsZXRlIHRoZSBlZmZlY3QgbW9kdWxlIGlmIHJlbW92aW5nIGxhc3QgaGFuZGxlIG9uIGl0Ci0gICAgaWYgKGVmZmVjdC0+cmVtb3ZlSGFuZGxlKGhhbmRsZSkgPT0gMCkgewotICAgICAgICBpZiAoIWVmZmVjdC0+aXNQaW5uZWQoKSB8fCB1bnBpbklmTGFzdCkgewotICAgICAgICAgICAgcmVtb3ZlRWZmZWN0X2woZWZmZWN0KTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KGVmZmVjdC0+aWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Cit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIGNvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7CisgICAgY29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1JZDsKKyAgICBjb25maWctPnNhbXBsZV9yYXRlID0gbVNhbXBsZVJhdGU7CisgICAgY29uZmlnLT5mb3JtYXQgPSBtRm9ybWF0OworICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrOworICAgIGNvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURXxBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUOwogfQogCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUGxheWJhY2sKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEwMDEsOCArMTE2OSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfdCB0eXBlKQogICAgIDogICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIGRldmljZSwgQVVESU9fREVWSUNFX05PTkUsIHR5cGUpLAotICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCgwKSwgbU1peEJ1ZmZlcihOVUxMKSwKLSAgICAgICAgbUFsbG9jTWl4QnVmZmVyKE5VTEwpLCBtU3VzcGVuZGVkKDApLCBtQnl0ZXNXcml0dGVuKDApLAorICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCgwKSwgbVNpbmtCdWZmZXIoTlVMTCksCisgICAgICAgIG1NaXhlckJ1ZmZlckVuYWJsZWQoQXVkaW9GbGluZ2VyOjprRW5hYmxlRXh0ZW5kZWRQcmVjaXNpb24pLAorICAgICAgICBtTWl4ZXJCdWZmZXIoTlVMTCksCisgICAgICAgIG1NaXhlckJ1ZmZlclNpemUoMCksCisgICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdChBVURJT19GT1JNQVRfSU5WQUxJRCksCisgICAgICAgIG1NaXhlckJ1ZmZlclZhbGlkKGZhbHNlKSwKKyAgICAgICAgbUVmZmVjdEJ1ZmZlckVuYWJsZWQoQXVkaW9GbGluZ2VyOjprRW5hYmxlRXh0ZW5kZWRQcmVjaXNpb24pLAorICAgICAgICBtRWZmZWN0QnVmZmVyKE5VTEwpLAorICAgICAgICBtRWZmZWN0QnVmZmVyU2l6ZSgwKSwKKyAgICAgICAgbUVmZmVjdEJ1ZmZlckZvcm1hdChBVURJT19GT1JNQVRfSU5WQUxJRCksCisgICAgICAgIG1FZmZlY3RCdWZmZXJWYWxpZChmYWxzZSksCisgICAgICAgIG1TdXNwZW5kZWQoMCksIG1CeXRlc1dyaXR0ZW4oMCksCiAgICAgICAgIG1BY3RpdmVUcmFja3NHZW5lcmF0aW9uKDApLAogICAgICAgICAvLyBtU3RyZWFtVHlwZXNbXSBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBib2R5CiAgICAgICAgIG1PdXRwdXQob3V0cHV0KSwKQEAgLTEwNDQsMTEgKzEyMjIsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzKCk7CisgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOwogCiAgICAgLy8gbVN0cmVhbVR5cGVzW0FVRElPX1NUUkVBTV9DTlRdIGlzIGluaXRpYWxpemVkIGJ5IHN0cmVhbV90eXBlX3QgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgIC8vIFRoZXJlIGlzIG5vIEFVRElPX1NUUkVBTV9NSU4sIGFuZCArKyBvcGVyYXRvciBkb2VzIG5vdCBjb21waWxlCi0gICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOworICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fTUlOOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOwogICAgICAgICAgICAgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIChzdHJlYW0gKyAxKSkgewogICAgICAgICBtU3RyZWFtVHlwZXNbc3RyZWFtXS52b2x1bWUgPSBtQXVkaW9GbGluZ2VyLT5zdHJlYW1Wb2x1bWVfbChzdHJlYW0pOwogICAgICAgICBtU3RyZWFtVHlwZXNbc3RyZWFtXS5tdXRlID0gbUF1ZGlvRmxpbmdlci0+c3RyZWFtTXV0ZV9sKHN0cmVhbSk7CkBAIC0xMDYwLDcgKzEyMzgsOSBAQAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6flBsYXliYWNrVGhyZWFkKCkKIHsKICAgICBtQXVkaW9GbGluZ2VyLT51bnJlZ2lzdGVyV3JpdGVyKG1OQkxvZ1dyaXRlcik7Ci0gICAgZGVsZXRlIFtdIG1BbGxvY01peEJ1ZmZlcjsKKyAgICBmcmVlKG1TaW5rQnVmZmVyKTsKKyAgICBmcmVlKG1NaXhlckJ1ZmZlcik7CisgICAgZnJlZShtRWZmZWN0QnVmZmVyKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTEwNzAsMTMgKzEyNTAsMTMgQEAKICAgICBkdW1wRWZmZWN0Q2hhaW5zKGZkLCBhcmdzKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJPdXRwdXQgdGhyZWFkICVwIHN0cmVhbSB2b2x1bWVzIGluIGRCOlxuICAgICIsIHRoaXMpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgU3RyZWFtIHZvbHVtZXMgaW4gZEI6ICIpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgKytpKSB7CiAgICAgICAgIGNvbnN0IHN0cmVhbV90eXBlX3QgKnN0ID0gJm1TdHJlYW1UeXBlc1tpXTsKICAgICAgICAgaWYgKGkgPiAwKSB7CkBAIC0xMDkxLDc1ICsxMjcxLDY4IEBACiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0Lmxlbmd0aCgpKTsKICAgICByZXN1bHQuY2xlYXIoKTsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dHB1dCB0aHJlYWQgJXAgdHJhY2tzXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKLSAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJPdXRwdXQgdGhyZWFkICVwIGFjdGl2ZSB0cmFja3NcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUFjdGl2ZVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KICAgICAvLyBUaGVzZSB2YWx1ZXMgYXJlICJyYXciOyB0aGV5IHdpbGwgd3JhcCBhcm91bmQuICBTZWUgcHJlcGFyZVRyYWNrc19sKCkgZm9yIGEgYmV0dGVyIHdheS4KICAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgdW5kZXJydW5zID0gZ2V0RmFzdFRyYWNrVW5kZXJydW5zKDApOwotICAgIGZkcHJpbnRmKGZkLCAiTm9ybWFsIG1peGVyIHJhdyB1bmRlcnJ1biBjb3VudGVyczogcGFydGlhbD0ldSBlbXB0eT0ldVxuIiwKKyAgICBkcHJpbnRmKGZkLCAiICBOb3JtYWwgbWl4ZXIgcmF3IHVuZGVycnVuIGNvdW50ZXJzOiBwYXJ0aWFsPSV1IGVtcHR5PSV1XG4iLAogICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubVBhcnRpYWwsIHVuZGVycnVucy5tQml0RmllbGRzLm1FbXB0eSk7CisKKyAgICBzaXplX3QgbnVtdHJhY2tzID0gbVRyYWNrcy5zaXplKCk7CisgICAgc2l6ZV90IG51bWFjdGl2ZSA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOworICAgIGRwcmludGYoZmQsICIgICVkIFRyYWNrcyIsIG51bXRyYWNrcyk7CisgICAgc2l6ZV90IG51bWFjdGl2ZXNlZW4gPSAwOworICAgIGlmIChudW10cmFja3MpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlZCBhcmUgYWN0aXZlXG4iLCBudW1hY3RpdmUpOworICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrczsgKytpKSB7CisgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICBib29sIGFjdGl2ZSA9IG1BY3RpdmVUcmFja3MuaW5kZXhPZih0cmFjaykgPj0gMDsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIG51bWFjdGl2ZXNlZW4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCBhY3RpdmUpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQorICAgIGlmIChudW1hY3RpdmVzZWVuICE9IG51bWFjdGl2ZSkgeworICAgICAgICAvLyBzb21lIHRyYWNrcyBpbiB0aGUgYWN0aXZlIGxpc3Qgd2VyZSBub3QgaW4gdGhlIHRyYWNrcyBsaXN0CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCisgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYWN0aXZlOyArK2kpIHsKKyAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV0ucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHRyYWNrICE9IDAgJiYgbVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUsIHRydWUpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5PdXRwdXQgdGhyZWFkICVwIGludGVybmFsc1xuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk5vcm1hbCBmcmFtZSBjb3VudDogJWRcbiIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAibGFzdCB3cml0ZSBvY2N1cnJlZCAobXNlY3MpOiAlbGx1XG4iLAotICAgICAgICAgICAgbnMybXMoc3lzdGVtVGltZSgpIC0gbUxhc3RXcml0ZVRpbWUpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAidG90YWwgd3JpdGVzOiAlZFxuIiwgbU51bVdyaXRlcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgImRlbGF5ZWQgd3JpdGVzOiAlZFxuIiwgbU51bURlbGF5ZWRXcml0ZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJibG9ja2VkIGluIHdyaXRlOiAlZFxuIiwgbUluV3JpdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJzdXNwZW5kIGNvdW50OiAlZFxuIiwgbVN1c3BlbmRlZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIm1peCBidWZmZXIgOiAlcFxuIiwgbU1peEJ1ZmZlcik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIGZkcHJpbnRmKGZkLCAiRmFzdCB0cmFjayBhdmFpbE1hc2s9JSN4XG4iLCBtRmFzdFRyYWNrQXZhaWxNYXNrKTsKKyAgICBkcHJpbnRmKGZkLCAiXG5PdXRwdXQgdGhyZWFkICVwOlxuIiwgdGhpcyk7CisgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsIGZyYW1lIGNvdW50OiAlenVcbiIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKKyAgICBkcHJpbnRmKGZkLCAiICBMYXN0IHdyaXRlIG9jY3VycmVkIChtc2Vjcyk6ICVsbHVcbiIsIG5zMm1zKHN5c3RlbVRpbWUoKSAtIG1MYXN0V3JpdGVUaW1lKSk7CisgICAgZHByaW50ZihmZCwgIiAgVG90YWwgd3JpdGVzOiAlZFxuIiwgbU51bVdyaXRlcyk7CisgICAgZHByaW50ZihmZCwgIiAgRGVsYXllZCB3cml0ZXM6ICVkXG4iLCBtTnVtRGVsYXllZFdyaXRlcyk7CisgICAgZHByaW50ZihmZCwgIiAgQmxvY2tlZCBpbiB3cml0ZTogJXNcbiIsIG1JbldyaXRlID8gInllcyIgOiAibm8iKTsKKyAgICBkcHJpbnRmKGZkLCAiICBTdXNwZW5kIGNvdW50OiAlZFxuIiwgbVN1c3BlbmRlZCk7CisgICAgZHByaW50ZihmZCwgIiAgU2luayBidWZmZXIgOiAlcFxuIiwgbVNpbmtCdWZmZXIpOworICAgIGRwcmludGYoZmQsICIgIE1peGVyIGJ1ZmZlcjogJXBcbiIsIG1NaXhlckJ1ZmZlcik7CisgICAgZHByaW50ZihmZCwgIiAgRWZmZWN0IGJ1ZmZlcjogJXBcbiIsIG1FZmZlY3RCdWZmZXIpOworICAgIGRwcmludGYoZmQsICIgIEZhc3QgdHJhY2sgYXZhaWxNYXNrPSUjeFxuIiwgbUZhc3RUcmFja0F2YWlsTWFzayk7CiAKICAgICBkdW1wQmFzZShmZCwgYXJncyk7CiB9CiAKIC8vIFRocmVhZCB2aXJ0dWFscwotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVhZHlUb1J1bigpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5pdENoZWNrKCk7Ci0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBBTE9HSSgiQXVkaW9GbGluZ2VyJ3MgdGhyZWFkICVwIHJlYWR5IHRvIHJ1biIsIHRoaXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJObyB3b3JraW5nIGF1ZGlvIGRyaXZlciBmb3VuZC4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpvbkZpcnN0UmVmKCkKIHsKQEAgLTExODIsNyArMTM1NSw3IEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKQEAgLTExOTAsNiArMTM2Myw3IEBACiAgICAgICAgIGludCB1aWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiB7CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAqcEZyYW1lQ291bnQ7CiAgICAgc3A8VHJhY2s+IHRyYWNrOwogICAgIHN0YXR1c190IGxTdGF0dXM7CiAKQEAgLTEyMTUsMTMgKzEzODksMTIgQEAKICAgICAgICAgICAgICkgJiYKICAgICAgICAgICAgIC8vIFBDTSBkYXRhCiAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYKLSAgICAgICAgICAgIC8vIG1vbm8gb3Igc3RlcmVvCi0gICAgICAgICAgICAoIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKSB8fAotICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSApICYmCi0jaWZuZGVmIEZBU1RfVFJBQ0tTX0FUX05PTl9OQVRJVkVfU0FNUExFX1JBVEUKKyAgICAgICAgICAgIC8vIGlkZW50aWNhbCBjaGFubmVsIG1hc2sgdG8gc2luaywgb3IgbW9ubyBpbiBhbmQgc3RlcmVvIHNpbmsKKyAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBtQ2hhbm5lbE1hc2sgfHwKKyAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkgJiYKICAgICAgICAgICAgIC8vIGhhcmR3YXJlIHNhbXBsZSByYXRlCiAgICAgICAgICAgICAoc2FtcGxlUmF0ZSA9PSBtU2FtcGxlUmF0ZSkgJiYKLSNlbmRpZgogICAgICAgICAgICAgLy8gbm9ybWFsIG1peGVyIGhhcyBhbiBhc3NvY2lhdGVkIGZhc3QgbWl4ZXIKICAgICAgICAgICAgIGhhc0Zhc3RNaXhlcigpICYmCiAgICAgICAgICAgICAvLyB0aGVyZSBhcmUgc3VmZmljaWVudCBmYXN0IHRyYWNrIHNsb3RzIGF2YWlsYWJsZQpAQCAtMTIzMSwxNSArMTQwNCwyMSBAQAogICAgICAgICApIHsKICAgICAgICAgLy8gaWYgZnJhbWVDb3VudCBub3Qgc3BlY2lmaWVkLCB0aGVuIGl0IGRlZmF1bHRzIHRvIGZhc3QgbWl4ZXIgKEhBTCkgZnJhbWUgY291bnQKICAgICAgICAgaWYgKGZyYW1lQ291bnQgPT0gMCkgewotICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50ICoga0Zhc3RUcmFja011bHRpcGxpZXI7CisgICAgICAgICAgICAvLyByZWFkIHRoZSBmYXN0IHRyYWNrIG11bHRpcGxpZXIgcHJvcGVydHkgdGhlIGZpcnN0IHRpbWUgaXQgaXMgbmVlZGVkCisgICAgICAgICAgICBpbnQgb2sgPSBwdGhyZWFkX29uY2UoJnNGYXN0VHJhY2tNdWx0aXBsaWVyT25jZSwgc0Zhc3RUcmFja011bHRpcGxpZXJJbml0KTsKKyAgICAgICAgICAgIGlmIChvayAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHB0aHJlYWRfb25jZSBmYWlsZWQ6ICVkIiwgX19mdW5jX18sIG9rKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCAqIHNGYXN0VHJhY2tNdWx0aXBsaWVyOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGFjY2VwdGVkOiBmcmFtZUNvdW50PSVkIG1GcmFtZUNvdW50PSVkIiwKICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQ6IGlzVGltZWQ9JWQgc2hhcmVkQnVmZmVyPSVwIGZyYW1lQ291bnQ9JWQgIgotICAgICAgICAgICAgICAgICJtRnJhbWVDb3VudD0lZCBmb3JtYXQ9JWQgaXNMaW5lYXI9JWQgY2hhbm5lbE1hc2s9JSN4IHNhbXBsZVJhdGU9JXUgbVNhbXBsZVJhdGU9JXUgIgorICAgICAgICAgICAgICAgICJtRnJhbWVDb3VudD0lZCBmb3JtYXQ9JSN4IG1Gb3JtYXQ9JSN4IGlzTGluZWFyPSVkIGNoYW5uZWxNYXNrPSUjeCAiCisgICAgICAgICAgICAgICAgInNhbXBsZVJhdGU9JXUgbVNhbXBsZVJhdGU9JXUgIgogICAgICAgICAgICAgICAgICJoYXNGYXN0TWl4ZXI9JWQgdGlkPSVkIGZhc3RUcmFja0F2YWlsTWFzaz0lI3giLAotICAgICAgICAgICAgICAgIGlzVGltZWQsIHNoYXJlZEJ1ZmZlci5nZXQoKSwgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICBpc1RpbWVkLCBzaGFyZWRCdWZmZXIuZ2V0KCksIGZyYW1lQ291bnQsIG1GcmFtZUNvdW50LCBmb3JtYXQsIG1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLAogICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBzYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwgaGFzRmFzdE1peGVyKCksIHRpZCwgbUZhc3RUcmFja0F2YWlsTWFzayk7CiAgICAgICAgICpmbGFncyAmPSB+SUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVDsKQEAgLTEyNTgsNDQgKzE0MzcsNTIgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0KKyAgICAqcEZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogCi0gICAgaWYgKG1UeXBlID09IERJUkVDVCkgewotICAgICAgICBpZiAoKGZvcm1hdCAmIEFVRElPX0ZPUk1BVF9NQUlOX01BU0spID09IEFVRElPX0ZPUk1BVF9QQ00pIHsKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisKKyAgICBjYXNlIERJUkVDVDoKKyAgICAgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewogICAgICAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUgfHwgZm9ybWF0ICE9IG1Gb3JtYXQgfHwgY2hhbm5lbE1hc2sgIT0gbUNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBzYW1wbGVSYXRlICV1IGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgMHglMDh4ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICVkIiwKKyAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6IHNhbXBsZVJhdGUgJXUgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgMHglMDh4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICUjeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBtT3V0cHV0LCBtRm9ybWF0KTsKICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gT0ZGTE9BRCkgeworICAgICAgICBicmVhazsKKworICAgIGNhc2UgT0ZGTE9BRDoKICAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUgfHwgZm9ybWF0ICE9IG1Gb3JtYXQgfHwgY2hhbm5lbE1hc2sgIT0gbUNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6IHNhbXBsZVJhdGUgJWQgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAweCUwOHggXCIiCi0gICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICVkIiwKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgQmFkIHBhcmFtZXRlcjogc2FtcGxlUmF0ZSAlZCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAweCUwOHggXCIiCisgICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICUjeCIsCiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIG1PdXRwdXQsIG1Gb3JtYXQpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgoZm9ybWF0ICYgQVVESU9fRk9STUFUX01BSU5fTUFTSykgIT0gQVVESU9fRk9STUFUX1BDTSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgQmFkIHBhcmFtZXRlcjogZm9ybWF0ICVkIFwiIgotICAgICAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJWQiLAorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBmb3JtYXQgJSN4IFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJSN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgbU91dHB1dCwgbUZvcm1hdCk7CiAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KLSAgICAgICAgLy8gUmVzYW1wbGVyIGltcGxlbWVudGF0aW9uIGxpbWl0cyBpbnB1dCBzYW1wbGluZyByYXRlIHRvIDIgeCBvdXRwdXQgc2FtcGxpbmcgcmF0ZS4KLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgPiBtU2FtcGxlUmF0ZSoyKSB7CisgICAgICAgIGlmIChzYW1wbGVSYXRlID4gbVNhbXBsZVJhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVgpIHsKICAgICAgICAgICAgIEFMT0dFKCJTYW1wbGUgcmF0ZSBvdXQgb2YgcmFuZ2U6ICV1IG1TYW1wbGVSYXRlICV1Iiwgc2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQorICAgICAgICBicmVhazsKKwogICAgIH0KIAogICAgIGxTdGF0dXMgPSBpbml0Q2hlY2soKTsKICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiQXVkaW8gZHJpdmVyIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBhdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkIik7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKQEAgLTEzMDgsNyArMTQ5NSw3IEBACiAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5ID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbVR5cGUpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIHNwPFRyYWNrPiB0ID0gbVRyYWNrc1tpXTsKLSAgICAgICAgICAgIGlmICh0ICE9IDAgJiYgIXQtPmlzT3V0cHV0VHJhY2soKSkgeworICAgICAgICAgICAgaWYgKHQgIT0gMCAmJiB0LT5pc0V4dGVybmFsVHJhY2soKSkgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdHVhbCA9IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbSh0LT5zdHJlYW1UeXBlKCkpOwogICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdC0+c2Vzc2lvbklkKCkgJiYgc3RyYXRlZ3kgIT0gYWN0dWFsKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgbWlzbWF0Y2hlZCBzdHJhdGVneTsgZXhwZWN0ZWQgJXUgYnV0IGZvdW5kICV1IiwKQEAgLTEzMjEsMTggKzE1MDgsMjEgQEAKIAogICAgICAgICBpZiAoIWlzVGltZWQpIHsKICAgICAgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQsIHVpZCwgKmZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBOVUxMLCBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cmFjayA9IFRpbWVkVHJhY2s6OmNyZWF0ZSh0aGlzLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlciwgc2Vzc2lvbklkLCB1aWQpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHRyYWNrID09IDAgfHwgdHJhY2stPmdldENibGsoKSA9PSBOVUxMIHx8IHRyYWNrLT5uYW1lKCkgPCAwKSB7Ci0gICAgICAgICAgICBsU3RhdHVzID0gTk9fTUVNT1JZOworICAgICAgICAvLyBuZXcgVHJhY2sgYWx3YXlzIHJldHVybnMgbm9uLU5VTEwsCisgICAgICAgIC8vIGJ1dCBUaW1lZFRyYWNrOjpjcmVhdGUoKSBpcyBhIGZhY3RvcnkgdGhhdCBjb3VsZCBmYWlsIGJ5IHJldHVybmluZyBOVUxMCisgICAgICAgIGxTdGF0dXMgPSB0cmFjayAhPSAwID8gdHJhY2stPmluaXRDaGVjaygpIDogKHN0YXR1c190KSBOT19NRU1PUlk7CisgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIGluaXRDaGVjayBmYWlsZWQgJWQ7IG5vIGNvbnRyb2wgYmxvY2s/IiwgbFN0YXR1cyk7CiAgICAgICAgICAgICAvLyB0cmFjayBtdXN0IGJlIGNsZWFyZWQgZnJvbSB0aGUgY2FsbGVyIGFzIHRoZSBjYWxsZXIgaGFzIHRoZSBBRiBsb2NrCiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KLQogICAgICAgICBtVHJhY2tzLmFkZCh0cmFjayk7CiAKICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpOwpAQCAtMTM1NCw5ICsxNTQ0LDcgQEAKICAgICBsU3RhdHVzID0gTk9fRVJST1I7CiAKIEV4aXQ6Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKLSAgICB9CisgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHRyYWNrOwogfQogCkBAIC0xNDM0LDcgKzE2MjIsNyBAQAogICAgICAgICAvLyB0aGUgdHJhY2sgaXMgbmV3bHkgYWRkZWQsIG1ha2Ugc3VyZSBpdCBmaWxscyB1cCBhbGwgaXRzCiAgICAgICAgIC8vIGJ1ZmZlcnMgYmVmb3JlIHBsYXlpbmcuIFRoaXMgaXMgdG8gZW5zdXJlIHRoZSBjbGllbnQgd2lsbAogICAgICAgICAvLyBlZmZlY3RpdmVseSBnZXQgdGhlIGxhdGVuY3kgaXQgcmVxdWVzdGVkLgotICAgICAgICBpZiAoIXRyYWNrLT5pc091dHB1dFRyYWNrKCkpIHsKKyAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewogICAgICAgICAgICAgVHJhY2tCYXNlOjp0cmFja19zdGF0ZSBzdGF0ZSA9IHRyYWNrLT5tU3RhdGU7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CkBAIC0xNDc1LDkgKzE2NjMsNyBAQAogICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgICB9CiAKLSAgICBBTE9HVigic2lnbmFsIHBsYXliYWNrIHRocmVhZCIpOwotICAgIGJyb2FkY2FzdF9sKCk7Ci0KKyAgICBvbkFkZE5ld1RyYWNrX2woKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNDg5LDcgKzE2NzUsNyBAQAogICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQRUQ7CiAgICAgaWYgKCF0cmFja0FjdGl2ZSkgewogICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpIHx8IHRyYWNrLT5pc09mZmxvYWRlZCgpKSB7CisgICAgfSBlbHNlIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSB8fCB0cmFjay0+aXNPZmZsb2FkZWQoKSB8fCB0cmFjay0+aXNEaXJlY3QoKSkgewogICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUElOR18xOwogICAgIH0KIApAQCAtMTU0MCwxMiArMTcyNiwxMSBAQAogICAgIHJldHVybiBvdXRfczg7CiB9CiAKLS8vIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgcGFyYW0pIHsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtKSB7CiAgICAgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgZGVzYzsKICAgICB2b2lkICpwYXJhbTIgPSBOVUxMOwogCi0gICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWRfbCwgdGhyZWFkICVwLCBldmVudCAlZCwgcGFyYW0gJWQiLCB0aGlzLCBldmVudCwKKyAgICBBTE9HVigiUGxheWJhY2tUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZCwgdGhyZWFkICVwLCBldmVudCAlZCwgcGFyYW0gJWQiLCB0aGlzLCBldmVudCwKICAgICAgICAgICAgIHBhcmFtKTsKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKQEAgLTE1NTYsNyArMTc0MSw3IEBACiAgICAgICAgIGRlc2MuZm9ybWF0ID0gbUZvcm1hdDsKICAgICAgICAgZGVzYy5mcmFtZUNvdW50ID0gbU5vcm1hbEZyYW1lQ291bnQ7IC8vIEZJWE1FIHNlZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyOjpmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90KQotICAgICAgICBkZXNjLmxhdGVuY3kgPSBsYXRlbmN5KCk7CisgICAgICAgIGRlc2MubGF0ZW5jeSA9IGxhdGVuY3lfbCgpOwogICAgICAgICBwYXJhbTIgPSAmZGVzYzsKICAgICAgICAgYnJlYWs7CiAKQEAgLTE1NjYsNyArMTc1MSw3IEBACiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIG1BdWRpb0ZsaW5nZXItPmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGV2ZW50LCBtSWQsIHBhcmFtMik7CisgICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkKGV2ZW50LCBtSWQsIHBhcmFtMik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6d3JpdGVDYWxsYmFjaygpCkBAIC0xNjAzLDcgKzE3ODgsNyBAQAogCiAvLyBzdGF0aWMKIGludCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJhbSBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSkKIHsKICAgICBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICptZSA9IChBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICopY29va2llOwpAQCAtMTYyMiwyOSArMTgwNywzMyBAQAogICAgIHJldHVybiAwOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlYWRPdXRwdXRQYXJhbWV0ZXJzKCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpCiB7Ci0gICAgLy8gdW5mb3J0dW5hdGVseSB3ZSBoYXZlIG5vIHdheSBvZiByZWNvdmVyaW5nIGZyb20gZXJyb3JzIGhlcmUsIGhlbmNlIHRoZSBMT0dfRkFUQUwKKyAgICAvLyB1bmZvcnR1bmF0ZWx5IHdlIGhhdmUgbm8gd2F5IG9mIHJlY292ZXJpbmcgZnJvbSBlcnJvcnMgaGVyZSwgaGVuY2UgdGhlIExPR19BTFdBWVNfRkFUQUwKICAgICBtU2FtcGxlUmF0ZSA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1DaGFubmVsTWFzayA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwobUNoYW5uZWxNYXNrKSkgewotICAgICAgICBMT0dfRkFUQUwoIkhBTCBjaGFubmVsIG1hc2sgJSN4IG5vdCB2YWxpZCBmb3Igb3V0cHV0IiwgbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGNoYW5uZWwgbWFzayAlI3ggbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtQ2hhbm5lbE1hc2spOwogICAgIH0KLSAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKSAmJiBtQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSB7Ci0gICAgICAgIExPR19GQVRBTCgiSEFMIGNoYW5uZWwgbWFzayAlI3ggbm90IHN1cHBvcnRlZCBmb3IgbWl4ZWQgb3V0cHV0OyAiCi0gICAgICAgICAgICAgICAgIm11c3QgYmUgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIiwgbUNoYW5uZWxNYXNrKTsKKyAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKQorICAgICAgICAgICAgJiYgIWlzVmFsaWRQY21TaW5rQ2hhbm5lbE1hc2sobUNoYW5uZWxNYXNrKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIQUwgY2hhbm5lbCBtYXNrICUjeCBub3Qgc3VwcG9ydGVkIGZvciBtaXhlZCBvdXRwdXQiLAorICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayk7CiAgICAgfQotICAgIG1DaGFubmVsQ291bnQgPSBwb3Bjb3VudChtQ2hhbm5lbE1hc2spOwotICAgIG1Gb3JtYXQgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2spOworICAgIG1IQUxGb3JtYXQgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUZvcm1hdCA9IG1IQUxGb3JtYXQ7CiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQobUZvcm1hdCkpIHsKLSAgICAgICAgTE9HX0ZBVEFMKCJIQUwgZm9ybWF0ICVkIG5vdCB2YWxpZCBmb3Igb3V0cHV0IiwgbUZvcm1hdCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkhBTCBmb3JtYXQgJSN4IG5vdCB2YWxpZCBmb3Igb3V0cHV0IiwgbUZvcm1hdCk7CiAgICAgfQotICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpICYmIG1Gb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgTE9HX0ZBVEFMKCJIQUwgZm9ybWF0ICVkIG5vdCBzdXBwb3J0ZWQgZm9yIG1peGVkIG91dHB1dDsgbXVzdCBiZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCIsCisgICAgaWYgKChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBEVVBMSUNBVElORykKKyAgICAgICAgICAgICYmICFpc1ZhbGlkUGNtU2lua0Zvcm1hdChtRm9ybWF0KSkgeworICAgICAgICBMT0dfRkFUQUwoIkhBTCBmb3JtYXQgJSN4IG5vdCBzdXBwb3J0ZWQgZm9yIG1peGVkIG91dHB1dCIsCiAgICAgICAgICAgICAgICAgbUZvcm1hdCk7CiAgICAgfQotICAgIG1GcmFtZVNpemUgPSBhdWRpb19zdHJlYW1fZnJhbWVfc2l6ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgIG1GcmFtZUNvdW50ID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbikgLyBtRnJhbWVTaXplOworICAgIG1GcmFtZVNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobU91dHB1dC0+c3RyZWFtKTsKKyAgICBtQnVmZmVyU2l6ZSA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1GcmFtZUNvdW50ID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOwogICAgIGlmIChtRnJhbWVDb3VudCAmIDE1KSB7CiAgICAgICAgIEFMT0dXKCJIQUwgb3V0cHV0IGJ1ZmZlciBzaXplIGlzICV1IGZyYW1lcyBidXQgQXVkaW9NaXhlciByZXF1aXJlcyBtdWx0aXBsZXMgb2YgMTYgZnJhbWVzIiwKICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCk7CkBAIC0xNjU5LDEyICsxODQ4LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBDYWxjdWxhdGUgc2l6ZSBvZiBub3JtYWwgbWl4IGJ1ZmZlciByZWxhdGl2ZSB0byB0aGUgSEFMIG91dHB1dCBidWZmZXIgc2l6ZQorICAgIC8vIENhbGN1bGF0ZSBzaXplIG9mIG5vcm1hbCBzaW5rIGJ1ZmZlciByZWxhdGl2ZSB0byB0aGUgSEFMIG91dHB1dCBidWZmZXIgc2l6ZQogICAgIGRvdWJsZSBtdWx0aXBsaWVyID0gMS4wOwogICAgIGlmIChtVHlwZSA9PSBNSVhFUiAmJiAoa1VzZUZhc3RNaXhlciA9PSBGYXN0TWl4ZXJfU3RhdGljIHx8CiAgICAgICAgICAgICBrVXNlRmFzdE1peGVyID09IEZhc3RNaXhlcl9EeW5hbWljKSkgewotICAgICAgICBzaXplX3QgbWluTm9ybWFsRnJhbWVDb3VudCA9IChrTWluTm9ybWFsTWl4QnVmZmVyU2l6ZU1zICogbVNhbXBsZVJhdGUpIC8gMTAwMDsKLSAgICAgICAgc2l6ZV90IG1heE5vcm1hbEZyYW1lQ291bnQgPSAoa01heE5vcm1hbE1peEJ1ZmZlclNpemVNcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7CisgICAgICAgIHNpemVfdCBtaW5Ob3JtYWxGcmFtZUNvdW50ID0gKGtNaW5Ob3JtYWxTaW5rQnVmZmVyU2l6ZU1zICogbVNhbXBsZVJhdGUpIC8gMTAwMDsKKyAgICAgICAgc2l6ZV90IG1heE5vcm1hbEZyYW1lQ291bnQgPSAoa01heE5vcm1hbFNpbmtCdWZmZXJTaXplTXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwOwogICAgICAgICAvLyByb3VuZCB1cCBtaW5pbXVtIGFuZCByb3VuZCBkb3duIG1heGltdW0gdG8gbmVhcmVzdCAxNiBmcmFtZXMgdG8gc2F0aXNmeSBBdWRpb01peGVyCiAgICAgICAgIG1pbk5vcm1hbEZyYW1lQ291bnQgPSAobWluTm9ybWFsRnJhbWVDb3VudCArIDE1KSAmIH4xNTsKICAgICAgICAgbWF4Tm9ybWFsRnJhbWVDb3VudCA9IG1heE5vcm1hbEZyYW1lQ291bnQgJiB+MTU7CkBAIC0xNjgyLDcgKzE4NzEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gcHJlZmVyIGFuIGV2ZW4gbXVsdGlwbGllciwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBkb3VibGluZyBvZiBmYXN0IHRyYWNrcyBkdWUgdG8gSEFMCi0gICAgICAgICAgICAvLyBTUkMgKGl0IHdvdWxkIGJlIHVudXN1YWwgZm9yIHRoZSBub3JtYWwgbWl4IGJ1ZmZlciBzaXplIHRvIG5vdCBiZSBhIG11bHRpcGxlIG9mIGZhc3QKKyAgICAgICAgICAgIC8vIFNSQyAoaXQgd291bGQgYmUgdW51c3VhbCBmb3IgdGhlIG5vcm1hbCBzaW5rIGJ1ZmZlciBzaXplIHRvIG5vdCBiZSBhIG11bHRpcGxlIG9mIGZhc3QKICAgICAgICAgICAgIC8vIHRyYWNrLCBidXQgd2Ugc29tZXRpbWVzIGhhdmUgdG8gZG8gdGhpcyB0byBzYXRpc2Z5IHRoZSBtYXhpbXVtIGZyYW1lIGNvdW50CiAgICAgICAgICAgICAvLyBjb25zdHJhaW50KQogICAgICAgICAgICAgLy8gRklYTUUgdGhpcyByb3VuZGluZyB1cCBzaG91bGQgbm90IGJlIGRvbmUgaWYgbm8gSEFMIFNSQwpAQCAtMTY5NywxOSArMTg4Niw0MyBAQAogICAgIH0KICAgICBtTm9ybWFsRnJhbWVDb3VudCA9IG11bHRpcGxpZXIgKiBtRnJhbWVDb3VudDsKICAgICAvLyByb3VuZCB1cCB0byBuZWFyZXN0IDE2IGZyYW1lcyB0byBzYXRpc2Z5IEF1ZGlvTWl4ZXIKLSAgICBtTm9ybWFsRnJhbWVDb3VudCA9IChtTm9ybWFsRnJhbWVDb3VudCArIDE1KSAmIH4xNTsKLSAgICBBTE9HSSgiSEFMIG91dHB1dCBidWZmZXIgc2l6ZSAldSBmcmFtZXMsIG5vcm1hbCBtaXggYnVmZmVyIHNpemUgJXUgZnJhbWVzIiwgbUZyYW1lQ291bnQsCisgICAgaWYgKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKSB7CisgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ID0gKG1Ob3JtYWxGcmFtZUNvdW50ICsgMTUpICYgfjE1OworICAgIH0KKyAgICBBTE9HSSgiSEFMIG91dHB1dCBidWZmZXIgc2l6ZSAldSBmcmFtZXMsIG5vcm1hbCBzaW5rIGJ1ZmZlciBzaXplICV1IGZyYW1lcyIsIG1GcmFtZUNvdW50LAogICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQpOwogCi0gICAgZGVsZXRlW10gbUFsbG9jTWl4QnVmZmVyOwotICAgIHNpemVfdCBhbGlnbiA9IChtRnJhbWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSA/IHNpemVvZihpbnQxNl90KSA6IG1GcmFtZVNpemU7Ci0gICAgbUFsbG9jTWl4QnVmZmVyID0gbmV3IGludDhfdFttTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemUgKyBhbGlnbiAtIDFdOwotICAgIG1NaXhCdWZmZXIgPSAoaW50MTZfdCAqKSAoKCgoc2l6ZV90KW1BbGxvY01peEJ1ZmZlciArIGFsaWduIC0gMSkgLyBhbGlnbikgKiBhbGlnbik7Ci0gICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CisgICAgLy8gbVNpbmtCdWZmZXIgaXMgdGhlIHNpbmsgYnVmZmVyLiAgU2l6ZSBpcyBhbHdheXMgbXVsdGlwbGUtb2YtMTYgZnJhbWVzLgorICAgIC8vIE9yaWdpbmFsbHkgdGhpcyB3YXMgaW50MTZfdFtdIGFycmF5LCBuZWVkIHRvIHJlbW92ZSBsZWdhY3kgaW1wbGljYXRpb25zLgorICAgIGZyZWUobVNpbmtCdWZmZXIpOworICAgIG1TaW5rQnVmZmVyID0gTlVMTDsKKyAgICAvLyBGb3Igc2luayBidWZmZXIgc2l6ZSwgd2UgdXNlIHRoZSBmcmFtZSBzaXplIGZyb20gdGhlIGRvd25zdHJlYW0gc2luayB0byBhdm9pZCBwcm9ibGVtcworICAgIC8vIHdpdGggbm9uIFBDTSBmb3JtYXRzIGZvciBjb21wcmVzc2VkIG11c2ljLCBlLmcuIEFBQywgYW5kIE9mZmxvYWQgdGhyZWFkcy4KKyAgICBjb25zdCBzaXplX3Qgc2lua0J1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CisgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1TaW5rQnVmZmVyLCAzMiwgc2lua0J1ZmZlclNpemUpOworCisgICAgLy8gV2UgcmVzaXplIHRoZSBtTWl4ZXJCdWZmZXIgYWNjb3JkaW5nIHRvIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHNpbmsgYnVmZmVyIHdoaWNoCisgICAgLy8gZHJpdmVzIHRoZSBvdXRwdXQuCisgICAgZnJlZShtTWl4ZXJCdWZmZXIpOworICAgIG1NaXhlckJ1ZmZlciA9IE5VTEw7CisgICAgaWYgKG1NaXhlckJ1ZmZlckVuYWJsZWQpIHsKKyAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsgLy8gYWxzbyB2YWxpZDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgICAgIG1NaXhlckJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobU1peGVyQnVmZmVyRm9ybWF0KTsKKyAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1NaXhlckJ1ZmZlciwgMzIsIG1NaXhlckJ1ZmZlclNpemUpOworICAgIH0KKyAgICBmcmVlKG1FZmZlY3RCdWZmZXIpOworICAgIG1FZmZlY3RCdWZmZXIgPSBOVUxMOworICAgIGlmIChtRWZmZWN0QnVmZmVyRW5hYmxlZCkgeworICAgICAgICBtRWZmZWN0QnVmZmVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7IC8vIE5vdGU6IEVmZmVjdHMgc3VwcG9ydCAxNmIgb25seQorICAgICAgICBtRWZmZWN0QnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRWZmZWN0QnVmZmVyRm9ybWF0KTsKKyAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1FZmZlY3RCdWZmZXIsIDMyLCBtRWZmZWN0QnVmZmVyU2l6ZSk7CisgICAgfQogCiAgICAgLy8gZm9yY2UgcmVjb25maWd1cmF0aW9uIG9mIGVmZmVjdCBjaGFpbnMgYW5kIGVuZ2luZXMgdG8gdGFrZSBuZXcgYnVmZmVyIHNpemUgYW5kIGF1ZGlvCiAgICAgLy8gcGFyYW1ldGVycyBpbnRvIGFjY291bnQKLSAgICAvLyBOb3RlIHRoYXQgbUxvY2sgaXMgbm90IGhlbGQgd2hlbiByZWFkT3V0cHV0UGFyYW1ldGVycygpIGlzIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvcgorICAgIC8vIE5vdGUgdGhhdCBtTG9jayBpcyBub3QgaGVsZCB3aGVuIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKSBpcyBjYWxsZWQgZnJvbSB0aGUgY29uc3RydWN0b3IKICAgICAvLyBidXQgaW4gdGhpcyBjYXNlIG5vdGhpbmcgaXMgZG9uZSBiZWxvdyBhcyBubyBhdWRpbyBzZXNzaW9ucyBoYXZlIGVmZmVjdCB5ZXQgc28gaXQgZG9lc24ndAogICAgIC8vIG1hdHRlci4KICAgICAvLyBjcmVhdGUgYSBjb3B5IG9mIG1FZmZlY3RDaGFpbnMgYXMgY2FsbGluZyBtb3ZlRWZmZWN0Q2hhaW5fbCgpIGNhbiByZW9yZGVyIHNvbWUgZWZmZWN0IGNoYWlucwpAQCAtMTcyMCw3ICsxOTMzLDcgQEAKIH0KIAogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRSZW5kZXJQb3NpdGlvbihzaXplX3QgKmhhbEZyYW1lcywgc2l6ZV90ICpkc3BGcmFtZXMpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzKQogewogICAgIGlmIChoYWxGcmFtZXMgPT0gTlVMTCB8fCBkc3BGcmFtZXMgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMTczOCw3ICsxOTUxLDExIEBACiAgICAgICAgICpkc3BGcmFtZXMgPSBmcmFtZXNXcml0dGVuID49IGxhdGVuY3lGcmFtZXMgPyBmcmFtZXNXcml0dGVuIC0gbGF0ZW5jeUZyYW1lcyA6IDA7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbU91dHB1dC0+c3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1PdXRwdXQtPnN0cmVhbSwgZHNwRnJhbWVzKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICB1aW50MzJfdCBmcmFtZXM7CisgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtT3V0cHV0LT5zdHJlYW0sICZmcmFtZXMpOworICAgICAgICAqZHNwRnJhbWVzID0gKHNpemVfdClmcmFtZXM7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogfQogCkBAIC0xODM5LDEwICsyMDU2LDEwIEBACiAgICAgICAgIGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQogewogICAgIHNpemVfdCBjb3VudCA9IHRyYWNrc1RvUmVtb3ZlLnNpemUoKTsKLSAgICBpZiAoY291bnQpIHsKKyAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrKSB7CiAgICAgICAgICAgICBjb25zdCBzcDxUcmFjaz4mIHRyYWNrID0gdHJhY2tzVG9SZW1vdmUuaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKCF0cmFjay0+aXNPdXRwdXRUcmFjaygpKSB7CisgICAgICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOwogI2lmZGVmIEFERF9CQVRURVJZX0RBVEEKICAgICAgICAgICAgICAgICAvLyB0byB0cmFjayB0aGUgc3BlYWtlciB1c2FnZQpAQCAtMTg4MCwxMiArMjA5NywxMyBAQAogICAgIG1MYXN0V3JpdGVUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIG1JbldyaXRlID0gdHJ1ZTsKICAgICBzc2l6ZV90IGJ5dGVzV3JpdHRlbjsKKyAgICBjb25zdCBzaXplX3Qgb2Zmc2V0ID0gbUN1cnJlbnRXcml0ZUxlbmd0aCAtIG1CeXRlc1JlbWFpbmluZzsKIAogICAgIC8vIElmIGFuIE5CQUlPIHNpbmsgaXMgcHJlc2VudCwgdXNlIGl0IHRvIHdyaXRlIHRoZSBub3JtYWwgbWl4ZXIncyBzdWJtaXgKICAgICBpZiAobU5vcm1hbFNpbmsgIT0gMCkgewotI2RlZmluZSBtQml0U2hpZnQgMiAvLyBGSVhNRQotICAgICAgICBzaXplX3QgY291bnQgPSBtQnl0ZXNSZW1haW5pbmcgPj4gbUJpdFNoaWZ0OwotICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gKG1DdXJyZW50V3JpdGVMZW5ndGggLSBtQnl0ZXNSZW1haW5pbmcpID4+IDE7CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gbUJ5dGVzUmVtYWluaW5nIC8gbUZyYW1lU2l6ZTsKKwogICAgICAgICBBVFJBQ0VfQkVHSU4oIndyaXRlIik7CiAgICAgICAgIC8vIHVwZGF0ZSB0aGUgc2V0cG9pbnQgd2hlbiBBdWRpb0ZsaW5nZXI6Om1TY3JlZW5TdGF0ZSBjaGFuZ2VzCiAgICAgICAgIHVpbnQzMl90IHNjcmVlblN0YXRlID0gQXVkaW9GbGluZ2VyOjptU2NyZWVuU3RhdGU7CkBAIC0xODk3LDEwICsyMTE1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAocGlwZS0+bWF4RnJhbWVzKCkgKiA3KSAvIDggOiBtTm9ybWFsRnJhbWVDb3VudCAqIDIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG1Ob3JtYWxTaW5rLT53cml0ZShtTWl4QnVmZmVyICsgb2Zmc2V0LCBjb3VudCk7CisgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG1Ob3JtYWxTaW5rLT53cml0ZSgoY2hhciAqKW1TaW5rQnVmZmVyICsgb2Zmc2V0LCBjb3VudCk7CiAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPiAwKSB7Ci0gICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBmcmFtZXNXcml0dGVuIDw8IG1CaXRTaGlmdDsKKyAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW4gKiBtRnJhbWVTaXplOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbjsKICAgICAgICAgfQpAQCAtMTkwOSwxMyArMjEyNywxNCBAQAogICAgICAgICAgICAgc2l6ZV90IHRvdGFsRnJhbWVzV3JpdHRlbiA9IG1Ob3JtYWxTaW5rLT5mcmFtZXNXcml0dGVuKCk7CiAgICAgICAgICAgICBpZiAodG90YWxGcmFtZXNXcml0dGVuID49IG1MYXRjaEQubVRpbWVzdGFtcC5tUG9zaXRpb24pIHsKICAgICAgICAgICAgICAgICBtTGF0Y2hELm1VbnByZXNlbnRlZEZyYW1lcyA9IHRvdGFsRnJhbWVzV3JpdHRlbiAtIG1MYXRjaEQubVRpbWVzdGFtcC5tUG9zaXRpb247CisgICAgICAgICAgICAgICAgLy8gbUxhdGNoRC5tRnJhbWVzUmVsZWFzZWQgaXMgc2V0IGltbWVkaWF0ZWx5IGJlZm9yZSBEIGlzIGNsb2NrZWQgaW50byBRCiAgICAgICAgICAgICAgICAgbUxhdGNoRFZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIEhBTCAvIEF1ZGlvU3RyZWFtT3V0IGRpcmVjdGx5CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRGlyZWN0IG91dHB1dCBhbmQgb2ZmbG9hZCB0aHJlYWRzCi0gICAgICAgIHNpemVfdCBvZmZzZXQgPSAobUN1cnJlbnRXcml0ZUxlbmd0aCAtIG1CeXRlc1JlbWFpbmluZyk7CisKICAgICAgICAgaWYgKG1Vc2VBc3luY1dyaXRlKSB7CiAgICAgICAgICAgICBBTE9HV19JRihtV3JpdGVBY2tTZXF1ZW5jZSAmIDEsICJ0aHJlYWRMb29wX3dyaXRlKCk6IG91dCBvZiBzZXF1ZW5jZSB3cml0ZSByZXF1ZXN0Iik7CiAgICAgICAgICAgICBtV3JpdGVBY2tTZXF1ZW5jZSArPSAyOwpAQCAtMTkyNiw3ICsyMTQ1LDcgQEAKICAgICAgICAgLy8gRklYTUUgV2Ugc2hvdWxkIGhhdmUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGltZXN0YW1wcyBmb3IgZGlyZWN0IG91dHB1dCB0aHJlYWRzLgogICAgICAgICAvLyBUaGV5IGFyZSB1c2VkIGUuZyBmb3IgbXVsdGljaGFubmVsIFBDTSBwbGF5YmFjayBvdmVyIEhETUkuCiAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IG1PdXRwdXQtPnN0cmVhbS0+d3JpdGUobU91dHB1dC0+c3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiltTWl4QnVmZmVyICsgb2Zmc2V0LCBtQnl0ZXNSZW1haW5pbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiltU2lua0J1ZmZlciArIG9mZnNldCwgbUJ5dGVzUmVtYWluaW5nKTsKICAgICAgICAgaWYgKG1Vc2VBc3luY1dyaXRlICYmCiAgICAgICAgICAgICAgICAgKChieXRlc1dyaXR0ZW4gPCAwKSB8fCAoYnl0ZXNXcml0dGVuID09IChzc2l6ZV90KW1CeXRlc1JlbWFpbmluZykpKSB7CiAgICAgICAgICAgICAvLyBkbyBub3Qgd2FpdCBmb3IgYXN5bmMgY2FsbGJhY2sgaW4gY2FzZSBvZiBlcnJvciBvZiBmdWxsIHdyaXRlCkBAIC0xOTY1LDcgKzIxODQsNyBAQAogCiAvKgogVGhlIGRlcml2ZWQgdmFsdWVzIHRoYXQgYXJlIGNhY2hlZDoKLSAtIG1peEJ1ZmZlclNpemUgZnJvbSBmcmFtZSBjb3VudCAqIGZyYW1lIHNpemUKKyAtIG1TaW5rQnVmZmVyU2l6ZSBmcm9tIGZyYW1lIGNvdW50ICogZnJhbWUgc2l6ZQogIC0gYWN0aXZlU2xlZXBUaW1lIGZyb20gYWN0aXZlU2xlZXBUaW1lVXMoKQogIC0gaWRsZVNsZWVwVGltZSBmcm9tIGlkbGVTbGVlcFRpbWVVcygpCiAgLSBzdGFuZGJ5RGVsYXkgZnJvbSBtQWN0aXZlU2xlZXBUaW1lVXMgKERJUkVDVCBvbmx5KQpAQCAtMTk4NCw3ICsyMjAzLDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjYWNoZVBhcmFtZXRlcnNfbCgpCiB7Ci0gICAgbWl4QnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKKyAgICBtU2lua0J1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CiAgICAgYWN0aXZlU2xlZXBUaW1lID0gYWN0aXZlU2xlZXBUaW1lVXMoKTsKICAgICBpZGxlU2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZVVzKCk7CiB9CkBAIC0yMDA3LDEzICsyMjI2LDE0IEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pCiB7CiAgICAgaW50IHNlc3Npb24gPSBjaGFpbi0+c2Vzc2lvbklkKCk7Ci0gICAgaW50MTZfdCAqYnVmZmVyID0gbU1peEJ1ZmZlcjsKKyAgICBpbnQxNl90KiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QqPihtRWZmZWN0QnVmZmVyRW5hYmxlZAorICAgICAgICAgICAgPyBtRWZmZWN0QnVmZmVyIDogbVNpbmtCdWZmZXIpOwogICAgIGJvb2wgb3duc0J1ZmZlciA9IGZhbHNlOwogCiAgICAgQUxPR1YoImFkZEVmZmVjdENoYWluX2woKSAlcCBvbiB0aHJlYWQgJXAgZm9yIHNlc3Npb24gJWQiLCBjaGFpbi5nZXQoKSwgdGhpcywgc2Vzc2lvbik7CiAgICAgaWYgKHNlc3Npb24gPiAwKSB7CiAgICAgICAgIC8vIE9ubHkgb25lIGVmZmVjdCBjaGFpbiBjYW4gYmUgcHJlc2VudCBpbiBkaXJlY3Qgb3V0cHV0IHRocmVhZCBhbmQgaXQgdXNlcwotICAgICAgICAvLyB0aGUgbWl4IGJ1ZmZlciBhcyBpbnB1dAorICAgICAgICAvLyB0aGUgc2luayBidWZmZXIgYXMgaW5wdXQKICAgICAgICAgaWYgKG1UeXBlICE9IERJUkVDVCkgewogICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CiAgICAgICAgICAgICBidWZmZXIgPSBuZXcgaW50MTZfdFtudW1TYW1wbGVzXTsKQEAgLTIwNDUsOSArMjI2NSwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCisgICAgY2hhaW4tPnNldFRocmVhZCh0aGlzKTsKICAgICBjaGFpbi0+c2V0SW5CdWZmZXIoYnVmZmVyLCBvd25zQnVmZmVyKTsKLSAgICBjaGFpbi0+c2V0T3V0QnVmZmVyKG1NaXhCdWZmZXIpOworICAgIGNoYWluLT5zZXRPdXRCdWZmZXIocmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obUVmZmVjdEJ1ZmZlckVuYWJsZWQKKyAgICAgICAgICAgID8gbUVmZmVjdEJ1ZmZlciA6IG1TaW5rQnVmZmVyKSk7CiAgICAgLy8gRWZmZWN0IGNoYWluIGZvciBzZXNzaW9uIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFIGlzIGluc2VydGVkIGF0IGVuZCBvZiBlZmZlY3QKICAgICAvLyBjaGFpbnMgbGlzdCBpbiBvcmRlciB0byBiZSBwcm9jZXNzZWQgbGFzdCBhcyBpdCBjb250YWlucyBvdXRwdXQgc3RhZ2UgZWZmZWN0cwogICAgIC8vIEVmZmVjdCBjaGFpbiBmb3Igc2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggaXMgaW5zZXJ0ZWQgYmVmb3JlCkBAIC0yMDk3LDcgKzIzMTgsNyBAQAogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSB0cmFjay0+c2Vzc2lvbklkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNldE1haW5CdWZmZXIobU1peEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRNYWluQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KG1TaW5rQnVmZmVyKSk7CiAgICAgICAgICAgICAgICAgICAgIGNoYWluLT5kZWNUcmFja0NudCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIxODcsMjggKzI0MDgsMzYgQEAKIAogICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKIAotICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzKCk7Ci0KICAgICAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKIAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAorICAgICAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCk7CisKICAgICAgICAgICAgIGlmIChsb2dTdHJpbmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG1OQkxvZ1dyaXRlci0+bG9nVGltZXN0YW1wKCk7CiAgICAgICAgICAgICAgICAgbU5CTG9nV3JpdGVyLT5sb2cobG9nU3RyaW5nKTsKICAgICAgICAgICAgICAgICBsb2dTdHJpbmcgPSBOVUxMOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBHYXRoZXIgdGhlIGZyYW1lc1JlbGVhc2VkIGNvdW50ZXJzIGZvciBhbGwgYWN0aXZlIHRyYWNrcywKKyAgICAgICAgICAgIC8vIGFuZCBsYXRjaCB0aGVtIGF0b21pY2FsbHkgd2l0aCB0aGUgdGltZXN0YW1wLgorICAgICAgICAgICAgLy8gRklYTUUgV2UncmUgdXNpbmcgcmF3IHBvaW50ZXJzIGFzIGluZGljZXMuIEEgdW5pcXVlIHRyYWNrIElEIHdvdWxkIGJlIGEgYmV0dGVyIGluZGV4LgorICAgICAgICAgICAgbUxhdGNoRC5tRnJhbWVzUmVsZWFzZWQuY2xlYXIoKTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHNwPFRyYWNrPiB0ID0gbUFjdGl2ZVRyYWNrc1tpXS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtTGF0Y2hELm1GcmFtZXNSZWxlYXNlZC5hZGQodC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUxhdGNoRFZhbGlkKSB7CiAgICAgICAgICAgICAgICAgbUxhdGNoUSA9IG1MYXRjaEQ7CiAgICAgICAgICAgICAgICAgbUxhdGNoRFZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbUxhdGNoUVZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCkpIHsKLSAgICAgICAgICAgICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBzYXZlT3V0cHV0VHJhY2tzKCk7CiAgICAgICAgICAgICBpZiAobVNpZ25hbFBlbmRpbmcpIHsKICAgICAgICAgICAgICAgICAvLyBBIHNpZ25hbCB3YXMgcmFpc2VkIHdoaWxlIHdlIHdlcmUgdW5sb2NrZWQKQEAgLTIzMDAsMTQgKzI1MjksMzIgQEAKICAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIHdyaXR0ZW4gdG8gSEFMCiAgICAgICAgICAgICAgICAgdGhyZWFkTG9vcF9zbGVlcFRpbWUoKTsKICAgICAgICAgICAgICAgICBpZiAoc2xlZXBUaW1lID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1peEJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtU2lua0J1ZmZlclNpemU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRWl0aGVyIHRocmVhZExvb3BfbWl4KCkgb3IgdGhyZWFkTG9vcF9zbGVlcFRpbWUoKSBzaG91bGQgaGF2ZSBzZXQKKyAgICAgICAgICAgIC8vIG1NaXhlckJ1ZmZlciB3aXRoIGRhdGEgaWYgbU1peGVyQnVmZmVyVmFsaWQgaXMgdHJ1ZSBhbmQgc2xlZXBUaW1lID09IDAuCisgICAgICAgICAgICAvLyBNZXJnZSBtTWl4ZXJCdWZmZXIgZGF0YSBpbnRvIG1FZmZlY3RCdWZmZXIgKGlmIGFueSBlZmZlY3RzIGFyZSB2YWxpZCkKKyAgICAgICAgICAgIC8vIG9yIG1TaW5rQnVmZmVyIChpZiB0aGVyZSBhcmUgbm8gZWZmZWN0cykuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIHByZS1lZmZlY3RzIGNvbXB1dGF0aW9uOyBpZiBlZmZlY3RzIGNoYW5nZSB0bworICAgICAgICAgICAgLy8gc3VwcG9ydCBoaWdoZXIgcHJlY2lzaW9uLCB0aGlzIG5lZWRzIHRvIG1vdmUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gbU1peGVyQnVmZmVyVmFsaWQgaXMgb25seSBzZXQgdHJ1ZSBieSBNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKCkuCisgICAgICAgICAgICAvLyBUT0RPIHVzZSBzbGVlcFRpbWUgPT0gMCBhcyBhbiBhZGRpdGlvbmFsIGNvbmRpdGlvbi4KKyAgICAgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJWYWxpZCkgeworICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciA9IG1FZmZlY3RCdWZmZXJWYWxpZCA/IG1FZmZlY3RCdWZmZXIgOiBtU2lua0J1ZmZlcjsKKyAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBtRWZmZWN0QnVmZmVyVmFsaWQgPyBtRWZmZWN0QnVmZmVyRm9ybWF0IDogbUZvcm1hdDsKKworICAgICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoYnVmZmVyLCBmb3JtYXQsIG1NaXhlckJ1ZmZlciwgbU1peGVyQnVmZmVyRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gbUN1cnJlbnRXcml0ZUxlbmd0aDsKICAgICAgICAgICAgIGlmIChpc1N1c3BlbmRlZCgpKSB7CiAgICAgICAgICAgICAgICAgc2xlZXBUaW1lID0gc3VzcGVuZFNsZWVwVGltZVVzKCk7CiAgICAgICAgICAgICAgICAgLy8gc2ltdWxhdGUgd3JpdGUgdG8gSEFMIHdoZW4gc3VzcGVuZGVkCi0gICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiArPSBtaXhCdWZmZXJTaXplOworICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gbVNpbmtCdWZmZXJTaXplOwogICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IDA7CiAgICAgICAgICAgICB9CiAKQEAgLTIzMjgsNiArMjU3NSwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgLy8gT25seSBpZiB0aGUgRWZmZWN0cyBidWZmZXIgaXMgZW5hYmxlZCBhbmQgdGhlcmUgaXMgZGF0YSBpbiB0aGUKKyAgICAgICAgLy8gRWZmZWN0cyBidWZmZXIgKGJ1ZmZlciB2YWxpZCksIHdlIG5lZWQgdG8KKyAgICAgICAgLy8gY29weSBpbnRvIHRoZSBzaW5rIGJ1ZmZlci4KKyAgICAgICAgLy8gVE9ETyB1c2Ugc2xlZXBUaW1lID09IDAgYXMgYW4gYWRkaXRpb25hbCBjb25kaXRpb24uCisgICAgICAgIGlmIChtRWZmZWN0QnVmZmVyVmFsaWQpIHsKKyAgICAgICAgICAgIC8vQUxPR1YoIndyaXRpbmcgZWZmZWN0IGJ1ZmZlciB0byBzaW5rIGJ1ZmZlciBmb3JtYXQgJSN4IiwgbUZvcm1hdCk7CisgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KG1TaW5rQnVmZmVyLCBtRm9ybWF0LCBtRWZmZWN0QnVmZmVyLCBtRWZmZWN0QnVmZmVyRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQpOworICAgICAgICB9CisKICAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCiAgICAgICAgIHVubG9ja0VmZmVjdENoYWlucyhlZmZlY3RDaGFpbnMpOwogCkBAIC0yMzQ2LDIwICsyNjAzLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAobU1peGVyU3RhdHVzID09IE1JWEVSX0RSQUlOX0FMTCkpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTG9vcF9kcmFpbigpOwogICAgICAgICAgICAgICAgIH0KLWlmIChtVHlwZSA9PSBNSVhFUikgewotICAgICAgICAgICAgICAgIC8vIHdyaXRlIGJsb2NrZWQgZGV0ZWN0aW9uCi0gICAgICAgICAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICAgICAgICAgbnNlY3NfdCBkZWx0YSA9IG5vdyAtIG1MYXN0V3JpdGVUaW1lOwotICAgICAgICAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgZGVsdGEgPiBtYXhQZXJpb2QpIHsKLSAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChub3cgLSBsYXN0V2FybmluZykgPiBrV2FybmluZ1Rocm90dGxlTnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIndyaXRlIGJsb2NrZWQgZm9yICVsbHUgbXNlY3MsICVkIGRlbGF5ZWQgd3JpdGVzLCB0aHJlYWQgJXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuczJtcyhkZWx0YSksIG1OdW1EZWxheWVkV3JpdGVzLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXJuaW5nID0gbm93OworICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUikgeworICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBibG9ja2VkIGRldGVjdGlvbgorICAgICAgICAgICAgICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBkZWx0YSA9IG5vdyAtIG1MYXN0V3JpdGVUaW1lOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIGRlbHRhID4gbWF4UGVyaW9kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcysrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChub3cgLSBsYXN0V2FybmluZykgPiBrV2FybmluZ1Rocm90dGxlTnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygid3JpdGUgYmxvY2tlZCBmb3IgJWxsdSBtc2VjcywgJWQgZGVsYXllZCB3cml0ZXMsIHRocmVhZCAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuczJtcyhkZWx0YSksIG1OdW1EZWxheWVkV3JpdGVzLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FybmluZyA9IG5vdzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLX0KIAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB1c2xlZXAoc2xlZXBUaW1lKTsKQEAgLTIzODcsMTIgKzI2NDQsOSBAQAogCiAgICAgdGhyZWFkTG9vcF9leGl0KCk7CiAKLSAgICAvLyBmb3IgRHVwbGljYXRpbmdUaHJlYWQsIHN0YW5kYnkgbW9kZSBpcyBoYW5kbGVkIGJ5IHRoZSBvdXRwdXRUcmFja3MsIG90aGVyd2lzZSAuLi4KLSAgICBpZiAobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRElSRUNUIHx8IG1UeXBlID09IE9GRkxPQUQpIHsKLSAgICAgICAgLy8gcHV0IG91dHB1dCBzdHJlYW0gaW50byBzdGFuZGJ5IG1vZGUKLSAgICAgICAgaWYgKCFtU3RhbmRieSkgewotICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgICAgICB9CisgICAgaWYgKCFtU3RhbmRieSkgeworICAgICAgICB0aHJlYWRMb29wX3N0YW5kYnkoKTsKKyAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwogICAgIH0KIAogICAgIHJlbGVhc2VXYWtlTG9jaygpOwpAQCAtMjQwNyw3ICsyNjYxLDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVtb3ZlVHJhY2tzX2woY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpCiB7CiAgICAgc2l6ZV90IGNvdW50ID0gdHJhY2tzVG9SZW1vdmUuc2l6ZSgpOwotICAgIGlmIChjb3VudCkgeworICAgIGlmIChjb3VudCA+IDApIHsKICAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2s+JiB0cmFjayA9IHRyYWNrc1RvUmVtb3ZlLml0ZW1BdChpKTsKICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHRyYWNrKTsKQEAgLTI0MzMsNyArMjY4Nyw3IEBACiAgICAgaWYgKG1Ob3JtYWxTaW5rICE9IDApIHsKICAgICAgICAgcmV0dXJuIG1Ob3JtYWxTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKICAgICB9Ci0gICAgaWYgKG1UeXBlID09IE9GRkxPQUQgJiYgbU91dHB1dC0+c3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKSB7CisgICAgaWYgKChtVHlwZSA9PSBPRkZMT0FEIHx8IG1UeXBlID09IERJUkVDVCkgJiYgbU91dHB1dC0+c3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKSB7CiAgICAgICAgIHVpbnQ2NF90IHBvc2l0aW9uNjQ7CiAgICAgICAgIGludCByZXQgPSBtT3V0cHV0LT5zdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0sICZwb3NpdGlvbjY0LCAmdGltZXN0YW1wLm1UaW1lKTsKQEAgLTI0NDQsNiArMjY5OCw2NyBAQAogICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKG1PdXRwdXQtPmF1ZGlvSHdEZXYtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgIC8vIHN0b3JlIG5ldyBkZXZpY2UgYW5kIHNlbmQgdG8gZWZmZWN0cworICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgeworICAgICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOworICAgICAgICB9CisgICAgICAgIG1PdXREZXZpY2UgPSB0eXBlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKG1PdXREZXZpY2UpOworICAgICAgICB9CisKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKKyAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPmNyZWF0ZV9hdWRpb19wYXRjaChod0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAiY3JlYXRlQXVkaW9QYXRjaF9sKCkgY2FsbGVkIG9uIGEgcHJlIDMuMCBIQUwiKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKG1PdXRwdXQtPmF1ZGlvSHdEZXYtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmh3RGV2aWNlKCk7CisgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLCBoYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAicmVsZWFzZUF1ZGlvUGF0Y2hfbCgpIGNhbGxlZCBvbiBhIHByZSAzLjAgSEFMIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YWRkUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFRyYWNrPiYgdHJhY2spCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVHJhY2tzLmFkZCh0cmFjayk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFRyYWNrPiYgdHJhY2spCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBkZXN0cm95VHJhY2tfbCh0cmFjayk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIFRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOworICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6Ok1peGVyVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKQEAgLTI0NjMsMTUgKzI3NzgsMTAgQEAKICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KTsKICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CiAKLSAgICAvLyBGSVhNRSAtIEN1cnJlbnQgbWl4ZXIgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBzdGVyZW8gb3V0cHV0Ci0gICAgaWYgKG1DaGFubmVsQ291bnQgIT0gRkNDXzIpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgYXVkaW8gaGFyZHdhcmUgY2hhbm5lbCBjb3VudCAlZCIsIG1DaGFubmVsQ291bnQpOwotICAgIH0KLQogICAgIC8vIGNyZWF0ZSBhbiBOQkFJTyBzaW5rIGZvciB0aGUgSEFMIG91dHB1dCBzdHJlYW0sIGFuZCBuZWdvdGlhdGUKICAgICBtT3V0cHV0U2luayA9IG5ldyBBdWRpb1N0cmVhbU91dFNpbmsob3V0cHV0LT5zdHJlYW0pOwogICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQpfTsKKyAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKICAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dFNpbmstPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwogICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwogCkBAIC0yNDkwLDkgKzI4MDAsMjggQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlmIChpbml0RmFzdE1peGVyKSB7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZhc3RNaXhlckZvcm1hdDsKKyAgICAgICAgaWYgKG1NaXhlckJ1ZmZlckVuYWJsZWQgJiYgbUVmZmVjdEJ1ZmZlckVuYWJsZWQpIHsKKyAgICAgICAgICAgIGZhc3RNaXhlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYXN0TWl4ZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUZvcm1hdCAhPSBmYXN0TWl4ZXJGb3JtYXQpIHsKKyAgICAgICAgICAgIC8vIGNoYW5nZSBvdXIgU2luayBmb3JtYXQgdG8gYWNjZXB0IG91ciBpbnRlcm1lZGlhdGUgcHJlY2lzaW9uCisgICAgICAgICAgICBtRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OworICAgICAgICAgICAgZnJlZShtU2lua0J1ZmZlcik7CisgICAgICAgICAgICBtRnJhbWVTaXplID0gbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CisgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2lua0J1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CisgICAgICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbVNpbmtCdWZmZXIsIDMyLCBzaW5rQnVmZmVyU2l6ZSk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBjcmVhdGUgYSBNb25vUGlwZSB0byBjb25uZWN0IG91ciBzdWJtaXggdG8gRmFzdE1peGVyCiAgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBtT3V0cHV0U2luay0+Zm9ybWF0KCk7CisgICAgICAgIE5CQUlPX0Zvcm1hdCBvcmlnZm9ybWF0ID0gZm9ybWF0OworICAgICAgICAvLyBhZGp1c3QgZm9ybWF0IHRvIG1hdGNoIHRoYXQgb2YgdGhlIEZhc3QgTWl4ZXIKKyAgICAgICAgZm9ybWF0Lm1Gb3JtYXQgPSBmYXN0TWl4ZXJGb3JtYXQ7CisgICAgICAgIGZvcm1hdC5tRnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQubUZvcm1hdCkgKiBmb3JtYXQubUNoYW5uZWxDb3VudDsKKwogICAgICAgICAvLyBUaGlzIHBpcGUgZGVwdGggY29tcGVuc2F0ZXMgZm9yIHNjaGVkdWxpbmcgbGF0ZW5jeSBvZiB0aGUgbm9ybWFsIG1peGVyIHRocmVhZC4KICAgICAgICAgLy8gV2hlbiBpdCB3YWtlcyB1cCBhZnRlciBhIG1heGltdW0gbGF0ZW5jeSwgaXQgcnVucyBhIGZldyBjeWNsZXMgcXVpY2tseSBiZWZvcmUKICAgICAgICAgLy8gZmluYWxseSBibG9ja2luZy4gIE5vdGUgdGhlIHBpcGUgaW1wbGVtZW50YXRpb24gcm91bmRzIHVwIHRoZSByZXF1ZXN0IHRvIGEgcG93ZXIgb2YgMi4KQEAgLTI1MDgsMTQgKzI4MzcsMTUgQEAKICNpZmRlZiBURUVfU0lOSwogICAgICAgICBpZiAobVRlZVNpbmtPdXRwdXRFbmFibGVkKSB7CiAgICAgICAgICAgICAvLyBjcmVhdGUgYSBQaXBlIHRvIGFyY2hpdmUgYSBjb3B5IG9mIEZhc3RNaXhlcidzIG91dHB1dCBmb3IgZHVtcHN5cwotICAgICAgICAgICAgUGlwZSAqdGVlU2luayA9IG5ldyBQaXBlKG1UZWVTaW5rT3V0cHV0RnJhbWVzLCBmb3JtYXQpOworICAgICAgICAgICAgUGlwZSAqdGVlU2luayA9IG5ldyBQaXBlKG1UZWVTaW5rT3V0cHV0RnJhbWVzLCBvcmlnZm9ybWF0KTsKKyAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnMyWzFdID0ge29yaWdmb3JtYXR9OwogICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICBpbmRleCA9IHRlZVNpbmstPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOworICAgICAgICAgICAgaW5kZXggPSB0ZWVTaW5rLT5uZWdvdGlhdGUob2ZmZXJzMiwgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CiAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKICAgICAgICAgICAgIG1UZWVTaW5rID0gdGVlU2luazsKICAgICAgICAgICAgIFBpcGVSZWFkZXIgKnRlZVNvdXJjZSA9IG5ldyBQaXBlUmVhZGVyKCp0ZWVTaW5rKTsKICAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgaW5kZXggPSB0ZWVTb3VyY2UtPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOworICAgICAgICAgICAgaW5kZXggPSB0ZWVTb3VyY2UtPm5lZ290aWF0ZShvZmZlcnMyLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwogICAgICAgICAgICAgbVRlZVNvdXJjZSA9IHRlZVNvdXJjZTsKICAgICAgICAgfQpAQCAtMjUzMyw2ICsyODYzLDggQEAKICAgICAgICAgLy8gd3JhcCB0aGUgc291cmNlIHNpZGUgb2YgdGhlIE1vbm9QaXBlIHRvIG1ha2UgaXQgYW4gQXVkaW9CdWZmZXJQcm92aWRlcgogICAgICAgICBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlciA9IG5ldyBTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyKG5ldyBNb25vUGlwZVJlYWRlcihtb25vUGlwZSkpOwogICAgICAgICBmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciA9IE5VTEw7CisgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOyAvLyBtUGlwZVNpbmsgY2hhbm5lbCBtYXNrIGZvciBhdWRpbyB0byBGYXN0TWl4ZXIKKyAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0ID0gbUZvcm1hdDsgLy8gbVBpcGVTaW5rIGZvcm1hdCBmb3IgYXVkaW8gdG8gRmFzdE1peGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUdlbmVyYXRpb24rKzsKICAgICAgICAgc3RhdGUtPm1GYXN0VHJhY2tzR2VuKys7CiAgICAgICAgIHN0YXRlLT5tVHJhY2tNYXNrID0gMTsKQEAgLTI1NzYsOCArMjkwOCw2IEBACiAgICAgICAgIH0KICNlbmRpZgogCi0gICAgfSBlbHNlIHsKLSAgICAgICAgbUZhc3RNaXhlciA9IE5VTEw7CiAgICAgfQogCiAgICAgc3dpdGNoIChrVXNlRmFzdE1peGVyKSB7CkBAIC0yNTk2LDEzICsyOTI2LDEzIEBACiAKIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6On5NaXhlclRocmVhZCgpCiB7Ci0gICAgaWYgKG1GYXN0TWl4ZXIgIT0gTlVMTCkgeworICAgIGlmIChtRmFzdE1peGVyICE9IDApIHsKICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOwogICAgICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKICAgICAgICAgaWYgKHN0YXRlLT5tQ29tbWFuZCA9PSBGYXN0TWl4ZXJTdGF0ZTo6Q09MRF9JRExFKSB7CiAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2luYygmbUZhc3RNaXhlckZ1dGV4KTsKICAgICAgICAgICAgIGlmIChvbGQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBfX2Z1dGV4X3N5c2NhbGwzKCZtRmFzdE1peGVyRnV0ZXgsIEZVVEVYX1dBS0VfUFJJVkFURSwgMSk7CisgICAgICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJm1GYXN0TWl4ZXJGdXRleCwgRlVURVhfV0FLRV9QUklWQVRFLCAxKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6RVhJVDsKQEAgLTI2MTgsNyArMjk0OCw3IEBACiAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpOwogICAgICAgICBkZWxldGUgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHNxLT5lbmQoZmFsc2UgLypkaWRNb2RpZnkqLyk7Ci0gICAgICAgIGRlbGV0ZSBtRmFzdE1peGVyOworICAgICAgICBtRmFzdE1peGVyLmNsZWFyKCk7CiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKICAgICAgICAgaWYgKG1BdWRpb1dhdGNoZG9nICE9IDApIHsKICAgICAgICAgICAgIG1BdWRpb1dhdGNoZG9nLT5yZXF1ZXN0RXhpdCgpOwpAQCAtMjYzNCw3ICsyOTY0LDcgQEAKIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Y29ycmVjdExhdGVuY3lfbCh1aW50MzJfdCBsYXRlbmN5KSBjb25zdAogewotICAgIGlmIChtRmFzdE1peGVyICE9IE5VTEwpIHsKKyAgICBpZiAobUZhc3RNaXhlciAhPSAwKSB7CiAgICAgICAgIE1vbm9QaXBlICpwaXBlID0gKE1vbm9QaXBlICopbVBpcGVTaW5rLmdldCgpOwogICAgICAgICBsYXRlbmN5ICs9IChwaXBlLT5nZXRBdmdGcmFtZXMoKSAqIDEwMDApIC8gbVNhbXBsZVJhdGU7CiAgICAgfQpAQCAtMjY1MSw3ICsyOTgxLDcgQEAKIHsKICAgICAvLyBGSVhNRSB3ZSBzaG91bGQgb25seSBkbyBvbmUgcHVzaCBwZXIgY3ljbGU7IGNvbmZpcm0gdGhpcyBpcyB0cnVlCiAgICAgLy8gU3RhcnQgdGhlIGZhc3QgbWl4ZXIgaWYgaXQncyBub3QgYWxyZWFkeSBydW5uaW5nCi0gICAgaWYgKG1GYXN0TWl4ZXIgIT0gTlVMTCkgeworICAgIGlmIChtRmFzdE1peGVyICE9IDApIHsKICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOwogICAgICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKICAgICAgICAgaWYgKHN0YXRlLT5tQ29tbWFuZCAhPSBGYXN0TWl4ZXJTdGF0ZTo6TUlYX1dSSVRFICYmCkBAIC0yNjU5LDcgKzI5ODksNyBAQAogICAgICAgICAgICAgaWYgKHN0YXRlLT5tQ29tbWFuZCA9PSBGYXN0TWl4ZXJTdGF0ZTo6Q09MRF9JRExFKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19pbmMoJm1GYXN0TWl4ZXJGdXRleCk7CiAgICAgICAgICAgICAgICAgaWYgKG9sZCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBfX2Z1dGV4X3N5c2NhbGwzKCZtRmFzdE1peGVyRnV0ZXgsIEZVVEVYX1dBS0VfUFJJVkFURSwgMSk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZtRmFzdE1peGVyRnV0ZXgsIEZVVEVYX1dBS0VfUFJJVkFURSwgMSk7CiAgICAgICAgICAgICAgICAgfQogI2lmZGVmIEFVRElPX1dBVENIRE9HCiAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1dhdGNoZG9nICE9IDApIHsKQEAgLTI2ODUsNyArMzAxNSw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnRocmVhZExvb3Bfc3RhbmRieSgpCiB7CiAgICAgLy8gSWRsZSB0aGUgZmFzdCBtaXhlciBpZiBpdCdzIGN1cnJlbnRseSBydW5uaW5nCi0gICAgaWYgKG1GYXN0TWl4ZXIgIT0gTlVMTCkgeworICAgIGlmIChtRmFzdE1peGVyICE9IDApIHsKICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOwogICAgICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKICAgICAgICAgaWYgKCEoc3RhdGUtPm1Db21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7CkBAIC0yNzExLDEyICszMDQxLDYgQEAKICAgICBQbGF5YmFja1RocmVhZDo6dGhyZWFkTG9vcF9zdGFuZGJ5KCk7CiB9CiAKLS8vIEVtcHR5IGltcGxlbWVudGF0aW9uIGZvciBzdGFuZGFyZCBtaXhlcgotLy8gT3ZlcnJpZGRlbiBmb3Igb2ZmbG9hZGVkIHBsYXliYWNrCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmZsdXNoT3V0cHV0X2woKQotewotfQotCiBib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OndhaXRpbmdBc3luY0NhbGxiYWNrX2woKQogewogICAgIHJldHVybiBmYWxzZTsKQEAgLTI3NDgsNiArMzA3MiwxMiBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpvbkFkZE5ld1RyYWNrX2woKQoreworICAgIEFMT0dWKCJzaWduYWwgcGxheWJhY2sgdGhyZWFkIik7CisgICAgYnJvYWRjYXN0X2woKTsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjp0aHJlYWRMb29wX21peCgpCiB7CiAgICAgLy8gb2J0YWluIHRoZSBwcmVzZW50YXRpb24gdGltZXN0YW1wIG9mIHRoZSBuZXh0IG91dHB1dCBidWZmZXIKQEAgLTI3NjYsNyArMzA5Niw3IEBACiAKICAgICAvLyBtaXggYnVmZmVycy4uLgogICAgIG1BdWRpb01peGVyLT5wcm9jZXNzKHB0cyk7Ci0gICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1peEJ1ZmZlclNpemU7CisgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1TaW5rQnVmZmVyU2l6ZTsKICAgICAvLyBpbmNyZWFzZSBzbGVlcCB0aW1lIHByb2dyZXNzaXZlbHkgd2hlbiBhcHBsaWNhdGlvbiB1bmRlcnJ1biBjb25kaXRpb24gY2xlYXJzLgogICAgIC8vIE9ubHkgaW5jcmVhc2Ugc2xlZXAgdGltZSBpZiB0aGUgbWl4ZXIgaXMgcmVhZHkgZm9yIHR3byBjb25zZWN1dGl2ZSB0aW1lcyB0byBhdm9pZAogICAgIC8vIHRoYXQgYSBzdGVhZHkgc3RhdGUgb2YgYWx0ZXJuYXRpbmcgcmVhZHkvbm90IHJlYWR5IGNvbmRpdGlvbnMga2VlcHMgdGhlIHNsZWVwIHRpbWUKQEAgLTI3NzcsNiArMzEwNyw3IEBACiAgICAgc2xlZXBUaW1lID0gMDsKICAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKSArIHN0YW5kYnlEZWxheTsKICAgICAvL1RPRE86IGRlbGF5IHN0YW5kYnkgd2hlbiBlZmZlY3RzIGhhdmUgYSB0YWlsCisKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjp0aHJlYWRMb29wX3NsZWVwVGltZSgpCkBAIC0yODAwLDcgKzMxMzEsMTMgQEAKICAgICAgICAgICAgIHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1CeXRlc1dyaXR0ZW4gIT0gMCB8fCAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSkgewotICAgICAgICBtZW1zZXQgKG1NaXhCdWZmZXIsIDAsIG1peEJ1ZmZlclNpemUpOworICAgICAgICAvLyBjbGVhciBvdXQgbU1peGVyQnVmZmVyIG9yIG1TaW5rQnVmZmVyLCB0byBlbnN1cmUgYnVmZmVycyBhcmUgY2xlYXJlZAorICAgICAgICAvLyBiZWZvcmUgZWZmZWN0cyBwcm9jZXNzaW5nIG9yIG91dHB1dC4KKyAgICAgICAgaWYgKG1NaXhlckJ1ZmZlclZhbGlkKSB7CisgICAgICAgICAgICBtZW1zZXQobU1peGVyQnVmZmVyLCAwLCBtTWl4ZXJCdWZmZXJTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbXNldChtU2lua0J1ZmZlciwgMCwgbVNpbmtCdWZmZXJTaXplKTsKKyAgICAgICAgfQogICAgICAgICBzbGVlcFRpbWUgPSAwOwogICAgICAgICBBTE9HVl9JRihtQnl0ZXNXcml0dGVuID09IDAgJiYgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCksCiAgICAgICAgICAgICAgICAgImFudGljaXBhdGVkIHN0YXJ0Iik7CkBAIC0yODQyLDExICszMTc5LDE0IEBACiAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gTlVMTDsKICAgICBib29sIGRpZE1vZGlmeSA9IGZhbHNlOwogICAgIEZhc3RNaXhlclN0YXRlUXVldWU6OmJsb2NrX3QgYmxvY2sgPSBGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9QVVNIRUQ7Ci0gICAgaWYgKG1GYXN0TWl4ZXIgIT0gTlVMTCkgeworICAgIGlmIChtRmFzdE1peGVyICE9IDApIHsKICAgICAgICAgc3EgPSBtRmFzdE1peGVyLT5zcSgpOwogICAgICAgICBzdGF0ZSA9IHNxLT5iZWdpbigpOwogICAgIH0KIAorICAgIG1NaXhlckJ1ZmZlclZhbGlkID0gZmFsc2U7ICAvLyBtTWl4ZXJCdWZmZXIgaGFzIG5vIHZhbGlkIGRhdGEgdW50aWwgYXBwcm9wcmlhdGUgdHJhY2tzIGZvdW5kLgorICAgIG1FZmZlY3RCdWZmZXJWYWxpZCA9IGZhbHNlOyAvLyBtRWZmZWN0QnVmZmVyIGhhcyBubyB2YWxpZCBkYXRhIHVudGlsIHRyYWNrcyBmb3VuZC4KKwogICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8VHJhY2s+IHQgPSBtQWN0aXZlVHJhY2tzW2ldLnByb21vdGUoKTsKICAgICAgICAgaWYgKHQgPT0gMCkgewpAQCAtMjk2NSw3ICszMzA1LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpJRExFOgogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBMT0dfRkFUQUwoInVuZXhwZWN0ZWQgdHJhY2sgc3RhdGUgJWQiLCB0cmFjay0+bVN0YXRlKTsKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJ1bmV4cGVjdGVkIHRyYWNrIHN0YXRlICVkIiwgdHJhY2stPm1TdGF0ZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChpc0FjdGl2ZSkgewpAQCAtMjk3NSw4ICszMzE1LDggQEAKICAgICAgICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIgKnZwID0gdHJhY2s7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID0gZWFicDsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPSB2cDsKLSAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tU2FtcGxlUmF0ZSA9IHRyYWNrLT5tU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSB0cmFjay0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSB0cmFjay0+bUZvcm1hdDsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tR2VuZXJhdGlvbisrOwogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bVRyYWNrTWFzayB8PSAxIDw8IGo7CiAgICAgICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CkBAIC0yOTk3LDcgKzMzMzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHdlJ3JlIGFib3V0IHRvIGRlY3JlbWVudCB0aGUgbGFzdCBzcDw+IG9uIHRob3NlIHRyYWNrcy4KICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9BQ0tFRDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0dfRkFUQUwoImZhc3QgdHJhY2sgJWQgc2hvdWxkIGhhdmUgYmVlbiBhY3RpdmUiLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiZmFzdCB0cmFjayAlZCBzaG91bGQgaGF2ZSBiZWVuIGFjdGl2ZSIsIGopOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAvLyBBdm9pZHMgYSBtaXNsZWFkaW5nIGRpc3BsYXkgaW4gZHVtcHN5cwpAQCAtMzAyNiwxMiArMzM2NiwxNCBAQAogICAgICAgICAgICAgLy8gKzEgZm9yIHJvdW5kaW5nIGFuZCArMSBmb3IgYWRkaXRpb25hbCBzYW1wbGUgbmVlZGVkIGZvciBpbnRlcnBvbGF0aW9uCiAgICAgICAgICAgICBkZXNpcmVkRnJhbWVzID0gKG1Ob3JtYWxGcmFtZUNvdW50ICogc3IpIC8gbVNhbXBsZVJhdGUgKyAxICsgMTsKICAgICAgICAgICAgIC8vIGFkZCBmcmFtZXMgYWxyZWFkeSBjb25zdW1lZCBidXQgbm90IHlldCByZWxlYXNlZCBieSB0aGUgcmVzYW1wbGVyCi0gICAgICAgICAgICAvLyBiZWNhdXNlIGNibGstPmZyYW1lc1JlYWR5KCkgd2lsbCBpbmNsdWRlIHRoZXNlIGZyYW1lcworICAgICAgICAgICAgLy8gYmVjYXVzZSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWFkeSgpIHdpbGwgaW5jbHVkZSB0aGVzZSBmcmFtZXMKICAgICAgICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2stPm5hbWUoKSk7CisjaWYgMAogICAgICAgICAgICAgLy8gdGhlIG1pbmltdW0gdHJhY2sgYnVmZmVyIHNpemUgaXMgbm9ybWFsbHkgdHdpY2UgdGhlIG51bWJlciBvZiBmcmFtZXMgbmVjZXNzYXJ5CiAgICAgICAgICAgICAvLyB0byBmaWxsIG9uZSBidWZmZXIgYW5kIHRoZSByZXNhbXBsZXIgc2hvdWxkIG5vdCBsZWF2ZSBtb3JlIHRoYW4gb25lIGJ1ZmZlciB3b3J0aAogICAgICAgICAgICAgLy8gb2YgdW5yZWxlYXNlZCBmcmFtZXMgYWZ0ZXIgZWFjaCBwYXNzLCBidXQganVzdCBpbiBjYXNlLi4uCiAgICAgICAgICAgICBBTE9HX0FTU0VSVChkZXNpcmVkRnJhbWVzIDw9IGNibGstPmZyYW1lQ291bnRfKTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgICAgIHVpbnQzMl90IG1pbkZyYW1lcyA9IDE7CiAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpID09IDApICYmICF0cmFjay0+aXNTdG9wcGVkKCkgJiYgIXRyYWNrLT5pc1BhdXNpbmcoKSAmJgpAQCAtMzA0NywxMCArMzM4OSwxNCBAQAogCiAgICAgICAgICAgICBtaXhlZFRyYWNrcysrOwogCi0gICAgICAgICAgICAvLyB0cmFjay0+bWFpbkJ1ZmZlcigpICE9IG1NaXhCdWZmZXIgbWVhbnMgdGhlcmUgaXMgYW4gZWZmZWN0IGNoYWluCi0gICAgICAgICAgICAvLyBjb25uZWN0ZWQgdG8gdGhlIHRyYWNrCisgICAgICAgICAgICAvLyB0cmFjay0+bWFpbkJ1ZmZlcigpICE9IG1TaW5rQnVmZmVyIG9yIG1NaXhlckJ1ZmZlciBtZWFucworICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gZWZmZWN0IGNoYWluIGNvbm5lY3RlZCB0byB0aGUgdHJhY2sKICAgICAgICAgICAgIGNoYWluLmNsZWFyKCk7Ci0gICAgICAgICAgICBpZiAodHJhY2stPm1haW5CdWZmZXIoKSAhPSBtTWl4QnVmZmVyKSB7CisgICAgICAgICAgICBpZiAodHJhY2stPm1haW5CdWZmZXIoKSAhPSBtU2lua0J1ZmZlciAmJgorICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWFpbkJ1ZmZlcigpICE9IG1NaXhlckJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGlmIChtRWZmZWN0QnVmZmVyRW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyVmFsaWQgPSB0cnVlOyAvLyBMYXRlciBjYW4gc2V0IGRpcmVjdGx5LgorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wodHJhY2stPnNlc3Npb25JZCgpKTsKICAgICAgICAgICAgICAgICAvLyBEZWxlZ2F0ZSB2b2x1bWUgY29udHJvbCB0byBlZmZlY3QgaW4gdHJhY2sgZWZmZWN0IGNoYWluIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CkBAIC0zMDgwLDkgKzM0MjYsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gY29tcHV0ZSB2b2x1bWUgZm9yIHRoaXMgdHJhY2sKLSAgICAgICAgICAgIHVpbnQzMl90IHZsLCB2ciwgdmE7CisgICAgICAgICAgICB1aW50MzJfdCB2bCwgdnI7ICAgICAgIC8vIGluIFU4LjI0IGludGVnZXIgZm9ybWF0CisgICAgICAgICAgICBmbG9hdCB2bGYsIHZyZiwgdmFmOyAgIC8vIGluIFswLjAsIDEuMF0gZmxvYXQgZm9ybWF0CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpIHx8IG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS5tdXRlKSB7Ci0gICAgICAgICAgICAgICAgdmwgPSB2ciA9IHZhID0gMDsKKyAgICAgICAgICAgICAgICB2bCA9IHZyID0gMDsKKyAgICAgICAgICAgICAgICB2bGYgPSB2cmYgPSB2YWYgPSAwLjsKICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKICAgICAgICAgICAgICAgICB9CkBAIC0zMDkyLDM3ICszNDQwLDQ0IEBACiAgICAgICAgICAgICAgICAgZmxvYXQgdHlwZVZvbHVtZSA9IG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS52b2x1bWU7CiAgICAgICAgICAgICAgICAgZmxvYXQgdiA9IG1hc3RlclZvbHVtZSAqIHR5cGVWb2x1bWU7CiAgICAgICAgICAgICAgICAgQXVkaW9UcmFja1NlcnZlclByb3h5ICpwcm94eSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5OwotICAgICAgICAgICAgICAgIHVpbnQzMl90IHZsciA9IHByb3h5LT5nZXRWb2x1bWVMUigpOwotICAgICAgICAgICAgICAgIHZsID0gdmxyICYgMHhGRkZGOwotICAgICAgICAgICAgICAgIHZyID0gdmxyID4+IDE2OworICAgICAgICAgICAgICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IHByb3h5LT5nZXRWb2x1bWVMUigpOworICAgICAgICAgICAgICAgIHZsZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKTsKKyAgICAgICAgICAgICAgICB2cmYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpOwogICAgICAgICAgICAgICAgIC8vIHRyYWNrIHZvbHVtZXMgY29tZSBmcm9tIHNoYXJlZCBtZW1vcnksIHNvIGNhbid0IGJlIHRydXN0ZWQgYW5kIG11c3QgYmUgY2xhbXBlZAotICAgICAgICAgICAgICAgIGlmICh2bCA+IE1BWF9HQUlOX0lOVCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVHJhY2sgbGVmdCB2b2x1bWUgb3V0IG9mIHJhbmdlOiAlMDRYIiwgdmwpOwotICAgICAgICAgICAgICAgICAgICB2bCA9IE1BWF9HQUlOX0lOVDsKKyAgICAgICAgICAgICAgICBpZiAodmxmID4gR0FJTl9GTE9BVF9VTklUWSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVHJhY2sgbGVmdCB2b2x1bWUgb3V0IG9mIHJhbmdlOiAlLjNnIiwgdmxmKTsKKyAgICAgICAgICAgICAgICAgICAgdmxmID0gR0FJTl9GTE9BVF9VTklUWTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHZyID4gTUFYX0dBSU5fSU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUcmFjayByaWdodCB2b2x1bWUgb3V0IG9mIHJhbmdlOiAlMDRYIiwgdnIpOwotICAgICAgICAgICAgICAgICAgICB2ciA9IE1BWF9HQUlOX0lOVDsKKyAgICAgICAgICAgICAgICBpZiAodnJmID4gR0FJTl9GTE9BVF9VTklUWSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVHJhY2sgcmlnaHQgdm9sdW1lIG91dCBvZiByYW5nZTogJS4zZyIsIHZyZik7CisgICAgICAgICAgICAgICAgICAgIHZyZiA9IEdBSU5fRkxPQVRfVU5JVFk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIG5vdyBhcHBseSB0aGUgbWFzdGVyIHZvbHVtZSBhbmQgc3RyZWFtIHR5cGUgdm9sdW1lCi0gICAgICAgICAgICAgICAgdmwgPSAodWludDMyX3QpKHYgKiB2bCkgPDwgMTI7Ci0gICAgICAgICAgICAgICAgdnIgPSAodWludDMyX3QpKHYgKiB2cikgPDwgMTI7CisgICAgICAgICAgICAgICAgdmxmICo9IHY7CisgICAgICAgICAgICAgICAgdnJmICo9IHY7CiAgICAgICAgICAgICAgICAgLy8gYXNzdW1pbmcgbWFzdGVyIHZvbHVtZSBhbmQgc3RyZWFtIHR5cGUgdm9sdW1lIGVhY2ggZ28gdXAgdG8gMS4wLAotICAgICAgICAgICAgICAgIC8vIHZsIGFuZCB2ciBhcmUgbm93IGluIDguMjQgZm9ybWF0Ci0KKyAgICAgICAgICAgICAgICAvLyB0aGVuIGRlcml2ZSB2bCBhbmQgdnIgYXMgVTguMjQgdmVyc2lvbnMgZm9yIHRoZSBlZmZlY3QgY2hhaW4KKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBzY2FsZXRvOF8yNCA9IE1BWF9HQUlOX0lOVCAqIE1BWF9HQUlOX0lOVDsKKyAgICAgICAgICAgICAgICB2bCA9ICh1aW50MzJfdCkgKHNjYWxldG84XzI0ICogdmxmKTsKKyAgICAgICAgICAgICAgICB2ciA9ICh1aW50MzJfdCkgKHNjYWxldG84XzI0ICogdnJmKTsKKyAgICAgICAgICAgICAgICAvLyB2bCBhbmQgdnIgYXJlIG5vdyBpbiBVOC4yNCBmb3JtYXQKICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZW5kTGV2ZWwgPSBwcm94eS0+Z2V0U2VuZExldmVsX1U0XzEyKCk7CiAgICAgICAgICAgICAgICAgLy8gc2VuZCBsZXZlbCBjb21lcyBmcm9tIHNoYXJlZCBtZW1vcnkgYW5kIHNvIG1heSBiZSBjb3JydXB0CiAgICAgICAgICAgICAgICAgaWYgKHNlbmRMZXZlbCA+IE1BWF9HQUlOX0lOVCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiVHJhY2sgc2VuZCBsZXZlbCBvdXQgb2YgcmFuZ2U6ICUwNFgiLCBzZW5kTGV2ZWwpOwogICAgICAgICAgICAgICAgICAgICBzZW5kTGV2ZWwgPSBNQVhfR0FJTl9JTlQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhID0gKHVpbnQzMl90KSh2ICogc2VuZExldmVsKTsKKyAgICAgICAgICAgICAgICAvLyB2YWYgaXMgcmVwcmVzZW50ZWQgYXMgWzAuMCwgMS4wXSBmbG9hdCBieSByZXNjYWxpbmcgc2VuZExldmVsCisgICAgICAgICAgICAgICAgdmFmID0gdiAqIHNlbmRMZXZlbCAqICgxLiAvIE1BWF9HQUlOX0lOVCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIERlbGVnYXRlIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBpbiB0cmFjayBlZmZlY3QgY2hhaW4gaWYgbmVlZGVkCiAgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCAmJiBjaGFpbi0+c2V0Vm9sdW1lX2woJnZsLCAmdnIpKSB7CiAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHJhbXAgdm9sdW1lIGlmIHZvbHVtZSBpcyBjb250cm9sbGVkIGJ5IGVmZmVjdAogICAgICAgICAgICAgICAgIHBhcmFtID0gQXVkaW9NaXhlcjo6Vk9MVU1FOworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSByZW1haW5pbmcgZmxvYXRpbmcgcG9pbnQgdm9sdW1lIGxldmVscworICAgICAgICAgICAgICAgIHZsZiA9IChmbG9hdCl2bCAvICgxIDw8IDI0KTsKKyAgICAgICAgICAgICAgICB2cmYgPSAoZmxvYXQpdnIgLyAoMSA8PCAyNCk7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1IYXNWb2x1bWVDb250cm9sbGVyID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gZm9yY2Ugbm8gdm9sdW1lIHJhbXAgd2hlbiB2b2x1bWUgY29udHJvbGxlciB3YXMganVzdCBkaXNhYmxlZCBvciByZW1vdmVkCkBAIC0zMTMzLDI4ICszNDg4LDEzIEBACiAgICAgICAgICAgICAgICAgdHJhY2stPm1IYXNWb2x1bWVDb250cm9sbGVyID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIENvbnZlcnQgdm9sdW1lcyBmcm9tIDguMjQgdG8gNC4xMiBmb3JtYXQKLSAgICAgICAgICAgIC8vIFRoaXMgYWRkaXRpb25hbCBjbGFtcGluZyBpcyBuZWVkZWQgaW4gY2FzZSBjaGFpbi0+c2V0Vm9sdW1lX2woKSBvdmVyc2hvdAotICAgICAgICAgICAgdmwgPSAodmwgKyAoMSA8PCAxMSkpID4+IDEyOwotICAgICAgICAgICAgaWYgKHZsID4gTUFYX0dBSU5fSU5UKSB7Ci0gICAgICAgICAgICAgICAgdmwgPSBNQVhfR0FJTl9JTlQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2ciA9ICh2ciArICgxIDw8IDExKSkgPj4gMTI7Ci0gICAgICAgICAgICBpZiAodnIgPiBNQVhfR0FJTl9JTlQpIHsKLSAgICAgICAgICAgICAgICB2ciA9IE1BWF9HQUlOX0lOVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHZhID4gTUFYX0dBSU5fSU5UKSB7Ci0gICAgICAgICAgICAgICAgdmEgPSBNQVhfR0FJTl9JTlQ7ICAgLy8gdmEgaXMgdWludDMyX3QsIHNvIG5vIG5lZWQgdG8gY2hlY2sgZm9yIC0KLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgLy8gWFhYOiB0aGVzZSB0aGluZ3MgRE9OJ1QgbmVlZCB0byBiZSBkb25lIGVhY2ggdGltZQogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIHRyYWNrKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5lbmFibGUobmFtZSk7CiAKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICh2b2lkICopdmwpOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgKHZvaWQgKil2cik7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpBVVhMRVZFTCwgKHZvaWQgKil2YSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICZ2YWYpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLApAQCAtMzE2Miw5ICszNTAyLDEzIEBACiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLCAodm9pZCAqKXRyYWNrLT5jaGFubmVsTWFzaygpKTsKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Y2hhbm5lbE1hc2soKSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLCAodm9pZCAqKSh1aW50cHRyX3QpbUNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIC8vIGxpbWl0IHRyYWNrIHNhbXBsZSByYXRlIHRvIDIgeCBvdXRwdXQgc2FtcGxlIHJhdGUsIHdoaWNoIGNoYW5nZXMgYXQgcmUtY29uZmlndXJhdGlvbgotICAgICAgICAgICAgdWludDMyX3QgbWF4U2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlICogMjsKKyAgICAgICAgICAgIHVpbnQzMl90IG1heFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZSAqIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWDsKICAgICAgICAgICAgIHVpbnQzMl90IHJlcVNhbXBsZVJhdGUgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0U2FtcGxlUmF0ZSgpOwogICAgICAgICAgICAgaWYgKHJlcVNhbXBsZVJhdGUgPT0gMCkgewogICAgICAgICAgICAgICAgIHJlcVNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKQEAgLTMxNzUsMTEgKzM1MTksNDIgQEAKICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlNBTVBMRV9SQVRFLAotICAgICAgICAgICAgICAgICh2b2lkICopcmVxU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopdHJhY2stPm1haW5CdWZmZXIoKSk7CisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KXJlcVNhbXBsZVJhdGUpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIHRyYWNrLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRyYWNrcyB3aXRoIGVmZmVjdHMgZ28gaW50byB0aGVpciBvd24gZWZmZWN0cyBjaGFpbiBidWZmZXIKKyAgICAgICAgICAgICAqIGFuZCBmcm9tIHRoZXJlIGludG8gZWl0aGVyIG1FZmZlY3RCdWZmZXIgb3IgbVNpbmtCdWZmZXIuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogT3RoZXIgdHJhY2tzIGNhbiB1c2UgbU1peGVyQnVmZmVyIGZvciBoaWdoZXIgcHJlY2lzaW9uCisgICAgICAgICAgICAgKiBjaGFubmVsIGFjY3VtdWxhdGlvbi4gIElmIHRoaXMgYnVmZmVyIGlzIGVuYWJsZWQKKyAgICAgICAgICAgICAqIChtTWl4ZXJCdWZmZXJFbmFibGVkIHRydWUpLCB0aGVuIHNlbGVjdGVkIHRyYWNrcyB3aWxsIGFjY3VtdWxhdGUKKyAgICAgICAgICAgICAqIGludG8gaXQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAobU1peGVyQnVmZmVyRW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAmJiAodHJhY2stPm1haW5CdWZmZXIoKSA9PSBtU2lua0J1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRyYWNrLT5tYWluQnVmZmVyKCkgPT0gbU1peGVyQnVmZmVyKSkgeworICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbU1peGVyQnVmZmVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopbU1peGVyQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdmVycmlkZSB0cmFjay0+bWFpbkJ1ZmZlcigpPworICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKilBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLCAodm9pZCAqKXRyYWNrLT5tYWluQnVmZmVyKCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLApAQCAtMzI5MywxMyArMzY2OCwzNSBAQAogICAgIC8vIHJlbW92ZSBhbGwgdGhlIHRyYWNrcyB0aGF0IG5lZWQgdG8gYmUuLi4KICAgICByZW1vdmVUcmFja3NfbCgqdHJhY2tzVG9SZW1vdmUpOwogCi0gICAgLy8gbWl4IGJ1ZmZlciBtdXN0IGJlIGNsZWFyZWQgaWYgYWxsIHRyYWNrcyBhcmUgY29ubmVjdGVkIHRvIGFuCi0gICAgLy8gZWZmZWN0IGNoYWluIGFzIGluIHRoaXMgY2FzZSB0aGUgbWl4ZXIgd2lsbCBub3Qgd3JpdGUgdG8KLSAgICAvLyBtaXggYnVmZmVyIGFuZCB0cmFjayBlZmZlY3RzIHdpbGwgYWNjdW11bGF0ZSBpbnRvIGl0CisgICAgaWYgKGdldEVmZmVjdENoYWluX2woQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSAhPSAwKSB7CisgICAgICAgIG1FZmZlY3RCdWZmZXJWYWxpZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKG1FZmZlY3RCdWZmZXJWYWxpZCkgeworICAgICAgICAvLyBhcyBsb25nIGFzIHRoZXJlIGFyZSBlZmZlY3RzIHdlIHNob3VsZCBjbGVhciB0aGUgZWZmZWN0cyBidWZmZXIsIHRvIGF2b2lkCisgICAgICAgIC8vIHBhc3NpbmcgYSBub24tY2xlYW4gYnVmZmVyIHRvIHRoZSBlZmZlY3QgY2hhaW4KKyAgICAgICAgbWVtc2V0KG1FZmZlY3RCdWZmZXIsIDAsIG1FZmZlY3RCdWZmZXJTaXplKTsKKyAgICB9CisgICAgLy8gc2luayBvciBtaXggYnVmZmVyIG11c3QgYmUgY2xlYXJlZCBpZiBhbGwgdHJhY2tzIGFyZSBjb25uZWN0ZWQgdG8gYW4KKyAgICAvLyBlZmZlY3QgY2hhaW4gYXMgaW4gdGhpcyBjYXNlIHRoZSBtaXhlciB3aWxsIG5vdCB3cml0ZSB0byB0aGUgc2luayBvciBtaXggYnVmZmVyCisgICAgLy8gYW5kIHRyYWNrIGVmZmVjdHMgd2lsbCBhY2N1bXVsYXRlIGludG8gaXQKICAgICBpZiAoKG1CeXRlc1JlbWFpbmluZyA9PSAwKSAmJiAoKG1peGVkVHJhY2tzICE9IDAgJiYgbWl4ZWRUcmFja3MgPT0gdHJhY2tzV2l0aEVmZmVjdCkgfHwKICAgICAgICAgICAgIChtaXhlZFRyYWNrcyA9PSAwICYmIGZhc3RUcmFja3MgPiAwKSkpIHsKICAgICAgICAgLy8gRklYTUUgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIHNob3VsZCByZW1lbWJlciBwcmV2aW91cyB6ZXJvIHN0YXR1cwotICAgICAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgaWYgKG1NaXhlckJ1ZmZlclZhbGlkKSB7CisgICAgICAgICAgICBtZW1zZXQobU1peGVyQnVmZmVyLCAwLCBtTWl4ZXJCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIC8vIFRPRE86IEluIHRlc3RpbmcsIG1TaW5rQnVmZmVyIGJlbG93IG5lZWQgbm90IGJlIGNsZWFyZWQgYmVjYXVzZQorICAgICAgICAgICAgLy8gdGhlIFBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkgY29waWVzIG1NaXhlckJ1ZmZlciBpbnRvIG1TaW5rQnVmZmVyCisgICAgICAgICAgICAvLyBhZnRlciBtaXhpbmcuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVG8gZW5mb3JjZSB0aGlzIGd1YXJhbnRlZToKKyAgICAgICAgICAgIC8vICgobWl4ZWRUcmFja3MgIT0gMCAmJiBtaXhlZFRyYWNrcyA9PSB0cmFja3NXaXRoRWZmZWN0KSB8fAorICAgICAgICAgICAgLy8gKG1peGVkVHJhY2tzID09IDAgJiYgZmFzdFRyYWNrcyA+IDApKQorICAgICAgICAgICAgLy8gbXVzdCBpbXBseSBNSVhFUl9UUkFDS1NfUkVBRFkuCisgICAgICAgICAgICAvLyBMYXRlciwgd2UgbWF5IGNsZWFyIGJ1ZmZlcnMgcmVnYXJkbGVzcywgYW5kIHNraXAgbXVjaCBvZiB0aGlzIGxvZ2ljLgorICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FIGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCBzaG91bGQgcmVtZW1iZXIgcHJldmlvdXMgemVybyBzdGF0dXMKKyAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOwogICAgIH0KIAogICAgIC8vIGlmIGFueSBmYXN0IHRyYWNrcywgdGhlbiBzdGF0dXMgaXMgcmVhZHkKQEAgLTMzMTEsOSArMzcwOCwxMCBAQAogfQogCiAvLyBnZXRUcmFja05hbWVfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotaW50IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBpbnQgc2Vzc2lvbklkKQoraW50IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpCiB7Ci0gICAgcmV0dXJuIG1BdWRpb01peGVyLT5nZXRUcmFja05hbWUoY2hhbm5lbE1hc2ssIHNlc3Npb25JZCk7CisgICAgcmV0dXJuIG1BdWRpb01peGVyLT5nZXRUcmFja05hbWUoY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2Vzc2lvbklkKTsKIH0KIAogLy8gZGVsZXRlVHJhY2tOYW1lX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKQEAgLTMzMjMsMTMwICszNzIxLDEyMiBAQAogICAgIG1BdWRpb01peGVyLT5kZWxldGVUcmFja05hbWUobmFtZSk7CiB9CiAKLS8vIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi1ib29sIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCkKKy8vIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKK2Jvb2wgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cykKIHsKLSAgICAvLyBpZiAhJklETEUsIGhvbGRzIHRoZSBGYXN0TWl4ZXIgc3RhdGUgdG8gcmVzdG9yZSBhZnRlciBuZXcgcGFyYW1ldGVycyBwcm9jZXNzZWQKLSAgICBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBwcmV2aW91c0NvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEU7CiAgICAgYm9vbCByZWNvbmZpZyA9IGZhbHNlOwogCi0gICAgd2hpbGUgKCFtTmV3UGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKKyAgICBzdGF0dXMgPSBOT19FUlJPUjsKIAotICAgICAgICBpZiAobUZhc3RNaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7Ci0gICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKLSAgICAgICAgICAgIGlmICghKHN0YXRlLT5tQ29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSkgewotICAgICAgICAgICAgICAgIHByZXZpb3VzQ29tbWFuZCA9IHN0YXRlLT5tQ29tbWFuZDsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEU7Ci0gICAgICAgICAgICAgICAgc3EtPmVuZCgpOwotICAgICAgICAgICAgICAgIHNxLT5wdXNoKEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX0FDS0VEKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3EtPmVuZChmYWxzZSAvKmRpZE1vZGlmeSovKTsKLSAgICAgICAgICAgIH0KKyAgICAvLyBpZiAhJklETEUsIGhvbGRzIHRoZSBGYXN0TWl4ZXIgc3RhdGUgdG8gcmVzdG9yZSBhZnRlciBuZXcgcGFyYW1ldGVycyBwcm9jZXNzZWQKKyAgICBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBwcmV2aW91c0NvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEU7CisgICAgaWYgKG1GYXN0TWl4ZXIgIT0gMCkgeworICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CisgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOworICAgICAgICBpZiAoIShzdGF0ZS0+bUNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6SURMRSkpIHsKKyAgICAgICAgICAgIHByZXZpb3VzQ29tbWFuZCA9IHN0YXRlLT5tQ29tbWFuZDsKKyAgICAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRTsKKyAgICAgICAgICAgIHNxLT5lbmQoKTsKKyAgICAgICAgICAgIHNxLT5wdXNoKEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX0FDS0VEKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNxLT5lbmQoZmFsc2UgLypkaWRNb2RpZnkqLyk7CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlyID0gbU5ld1BhcmFtZXRlcnNbMF07Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKLSAgICAgICAgaW50IHZhbHVlOwotCi0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U2FtcGxpbmdSYXRlKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOworICAgIGludCB2YWx1ZTsKKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVNhbXBsaW5nUmF0ZSksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICByZWNvbmZpZyA9IHRydWU7CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlmICghaXNWYWxpZFBjbVNpbmtGb3JtYXQoKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2F2ZSB2YWx1ZSwgc2luY2UgaXQncyBjb25zdGFudAogICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAoKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwotICAgICAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlmICghaXNWYWxpZFBjbVNpbmtDaGFubmVsTWFzaygoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIHZhbHVlKSkgeworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzYXZlIHZhbHVlLCBzaW5jZSBpdCdzIGNvbnN0YW50CisgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaWYgKChhdWRpb19jaGFubmVsX21hc2tfdCkgdmFsdWUgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBkbyBub3QgYWNjZXB0IGZyYW1lIGNvdW50IGNoYW5nZXMgaWYgdHJhY2tzIGFyZSBvcGVuIGFzIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgLy8gc2l6ZSBkZXBlbmRzIG9uIGZyYW1lIGNvdW50IGFuZCBjb3JyZWN0IGJlaGF2aW9yIHdvdWxkIG5vdCBiZSBndWFyYW50ZWVkCisgICAgICAgIC8vIGlmIGZyYW1lIGNvdW50IGlzIGNoYW5nZWQgYWZ0ZXIgdHJhY2sgY3JlYXRpb24KKyAgICAgICAgaWYgKCFtVHJhY2tzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3QgYWNjZXB0IGZyYW1lIGNvdW50IGNoYW5nZXMgaWYgdHJhY2tzIGFyZSBvcGVuIGFzIHRoZSB0cmFjayBidWZmZXIKLSAgICAgICAgICAgIC8vIHNpemUgZGVwZW5kcyBvbiBmcmFtZSBjb3VudCBhbmQgY29ycmVjdCBiZWhhdmlvciB3b3VsZCBub3QgYmUgZ3VhcmFudGVlZAotICAgICAgICAgICAgLy8gaWYgZnJhbWUgY291bnQgaXMgY2hhbmdlZCBhZnRlciB0cmFjayBjcmVhdGlvbgotICAgICAgICAgICAgaWYgKCFtVHJhY2tzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIHZhbHVlKSA9PSBOT19FUlJPUikgewogI2lmZGVmIEFERF9CQVRURVJZX0RBVEEKLSAgICAgICAgICAgIC8vIHdoZW4gY2hhbmdpbmcgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2UsIGNhbGwgYWRkQmF0dGVyeURhdGEgdG8gbm90aWZ5Ci0gICAgICAgICAgICAvLyB0aGUgY2hhbmdlCi0gICAgICAgICAgICBpZiAobU91dERldmljZSAhPSB2YWx1ZSkgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtcyA9IDA7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBzcGVha2VyIGlzIG9uCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFTcGVha2VyT247Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVdpdGhvdXRTcGVha2VyCi0gICAgICAgICAgICAgICAgICAgID0gQVVESU9fREVWSUNFX09VVF9BTEwgJiB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFueSBvdGhlciBkZXZpY2UgKGV4Y2VwdCBzcGVha2VyKSBpcyBvbgotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmIGRldmljZVdpdGhvdXRTcGVha2VyICkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhT3RoZXJBdWRpb0RldmljZU9uOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLy8gd2hlbiBjaGFuZ2luZyB0aGUgYXVkaW8gb3V0cHV0IGRldmljZSwgY2FsbCBhZGRCYXR0ZXJ5RGF0YSB0byBub3RpZnkKKyAgICAgICAgLy8gdGhlIGNoYW5nZQorICAgICAgICBpZiAobU91dERldmljZSAhPSB2YWx1ZSkgeworICAgICAgICAgICAgdWludDMyX3QgcGFyYW1zID0gMDsKKyAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgc3BlYWtlciBpcyBvbgorICAgICAgICAgICAgaWYgKHZhbHVlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVNwZWFrZXJPbjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVdpdGhvdXRTcGVha2VyCisgICAgICAgICAgICAgICAgPSBBVURJT19ERVZJQ0VfT1VUX0FMTCAmIH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICAvLyBjaGVjayBpZiBhbnkgb3RoZXIgZGV2aWNlIChleGNlcHQgc3BlYWtlcikgaXMgb24KKyAgICAgICAgICAgIGlmICh2YWx1ZSAmIGRldmljZVdpdGhvdXRTcGVha2VyICkgeworICAgICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFPdGhlckF1ZGlvRGV2aWNlT247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXJhbXMgIT0gMCkgeworICAgICAgICAgICAgICAgIGFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbmRpZgogCi0gICAgICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCi0gICAgICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCi0gICAgICAgICAgICBpZiAodmFsdWUgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtT3V0RGV2aWNlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKG1PdXREZXZpY2UpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQorICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCisgICAgICAgIGlmICh2YWx1ZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgbU91dERldmljZSA9IHZhbHVlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobU91dERldmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKKyAgICAgICAgaWYgKCFtU3RhbmRieSAmJiBzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gPSAwOwogICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJlY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgbUF1ZGlvTWl4ZXI7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihtTm9ybWFsRnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCkgOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5hbWUgPSBnZXRUcmFja05hbWVfbChtVHJhY2tzW2ldLT5tQ2hhbm5lbE1hc2ssIG1UcmFja3NbaV0tPm1TZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFja3NbaV0tPm1OYW1lID0gbmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CiAgICAgICAgIH0KLQotICAgICAgICBtTmV3UGFyYW1ldGVycy5yZW1vdmVBdCgwKTsKLQotICAgICAgICBtUGFyYW1TdGF0dXMgPSBzdGF0dXM7Ci0gICAgICAgIG1QYXJhbUNvbmQuc2lnbmFsKCk7Ci0gICAgICAgIC8vIHdhaXQgZm9yIGNvbmRpdGlvbiB3aXRoIHRpbWUgb3V0IGluIGNhc2UgdGhlIHRocmVhZCBjYWxsaW5nIFRocmVhZEJhc2U6OnNldFBhcmFtZXRlcnMoKQotICAgICAgICAvLyBhbHJlYWR5IHRpbWVkIG91dCB3YWl0aW5nIGZvciB0aGUgc3RhdHVzIGFuZCB3aWxsIG5ldmVyIHNpZ25hbCB0aGUgY29uZGl0aW9uLgotICAgICAgICBtV2FpdFdvcmtDVi53YWl0UmVsYXRpdmUobUxvY2ssIGtTZXRQYXJhbWV0ZXJzVGltZW91dE5zKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvbmZpZykgeworICAgICAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOworICAgICAgICAgICAgZGVsZXRlIG1BdWRpb01peGVyOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihtTm9ybWFsRnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKSA7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBuYW1lID0gZ2V0VHJhY2tOYW1lX2wobVRyYWNrc1tpXS0+bUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrc1tpXS0+bUZvcm1hdCwgbVRyYWNrc1tpXS0+bVNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVHJhY2tzW2ldLT5tTmFtZSA9IG5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ09ORklHX0NIQU5HRUQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCEocHJldmlvdXNDb21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKG1GYXN0TWl4ZXIgIT0gTlVMTCk7CisgICAgICAgIEFMT0dfQVNTRVJUKG1GYXN0TWl4ZXIgIT0gMCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKICAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CiAgICAgICAgIEFMT0dfQVNTRVJUKHN0YXRlLT5tQ29tbWFuZCA9PSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEUpOwpAQCAtMzQ2Nyw5ICszODU3LDcgQEAKIAogICAgIFBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvTWl4ZXIgdHJhY2tzOiAlMDh4XG4iLCBtQXVkaW9NaXhlci0+dHJhY2tOYW1lcygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgZHByaW50ZihmZCwgIiAgQXVkaW9NaXhlciB0cmFja3M6IDB4JTA4eFxuIiwgbUF1ZGlvTWl4ZXItPnRyYWNrTmFtZXMoKSk7CiAKICAgICAvLyBNYWtlIGEgbm9uLWF0b21pYyBjb3B5IG9mIGZhc3QgbWl4ZXIgZHVtcCBzdGF0ZSBzbyBpdCB3b24ndCBjaGFuZ2UgdW5kZXJuZWF0aCB1cwogICAgIGNvbnN0IEZhc3RNaXhlckR1bXBTdGF0ZSBjb3B5KG1GYXN0TWl4ZXJEdW1wU3RhdGUpOwpAQCAtMzU1MCwxMyArMzkzOCwxNyBAQAogICAgICAgICBmbG9hdCB0eXBlVm9sdW1lID0gbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLnZvbHVtZTsKICAgICAgICAgZmxvYXQgdiA9IG1NYXN0ZXJWb2x1bWUgKiB0eXBlVm9sdW1lOwogICAgICAgICBBdWRpb1RyYWNrU2VydmVyUHJveHkgKnByb3h5ID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHk7Ci0gICAgICAgIHVpbnQzMl90IHZsciA9IHByb3h5LT5nZXRWb2x1bWVMUigpOwotICAgICAgICBmbG9hdCB2X2NsYW1wZWQgPSB2ICogKHZsciAmIDB4RkZGRik7Ci0gICAgICAgIGlmICh2X2NsYW1wZWQgPiBNQVhfR0FJTikgdl9jbGFtcGVkID0gTUFYX0dBSU47Ci0gICAgICAgIGxlZnQgPSB2X2NsYW1wZWQvTUFYX0dBSU47Ci0gICAgICAgIHZfY2xhbXBlZCA9IHYgKiAodmxyID4+IDE2KTsKLSAgICAgICAgaWYgKHZfY2xhbXBlZCA+IE1BWF9HQUlOKSB2X2NsYW1wZWQgPSBNQVhfR0FJTjsKLSAgICAgICAgcmlnaHQgPSB2X2NsYW1wZWQvTUFYX0dBSU47CisgICAgICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IHByb3h5LT5nZXRWb2x1bWVMUigpOworICAgICAgICBsZWZ0ID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOworICAgICAgICBpZiAobGVmdCA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKKyAgICAgICAgICAgIGxlZnQgPSBHQUlOX0ZMT0FUX1VOSVRZOworICAgICAgICB9CisgICAgICAgIGxlZnQgKj0gdjsKKyAgICAgICAgcmlnaHQgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpOworICAgICAgICBpZiAocmlnaHQgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CisgICAgICAgICAgICByaWdodCA9IEdBSU5fRkxPQVRfVU5JVFk7CisgICAgICAgIH0KKyAgICAgICAgcmlnaHQgKj0gdjsKICAgICB9CiAKICAgICBpZiAobGFzdFRyYWNrKSB7CkBAIC0zNjExLDE0ICs0MDAzLDE0IEBACiAgICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIGEgdHJhY2sgaXMgYWRkZWQgd2Ugd2FpdAogICAgICAgICAvLyBmb3IgYWxsIGl0cyBidWZmZXJzIHRvIGJlIGZpbGxlZCBiZWZvcmUgcHJvY2Vzc2luZyBpdAogICAgICAgICB1aW50MzJfdCBtaW5GcmFtZXM7Ci0gICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpID09IDApICYmICF0cmFjay0+aXNTdG9wcGVkKCkgJiYgIXRyYWNrLT5pc1BhdXNpbmcoKSkgeworICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSA9PSAwKSAmJiAhdHJhY2stPmlzU3RvcHBpbmdfMSgpICYmICF0cmFjay0+aXNQYXVzaW5nKCkpIHsKICAgICAgICAgICAgIG1pbkZyYW1lcyA9IG1Ob3JtYWxGcmFtZUNvdW50OwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWluRnJhbWVzID0gMTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgodHJhY2stPmZyYW1lc1JlYWR5KCkgPj0gbWluRnJhbWVzKSAmJiB0cmFjay0+aXNSZWFkeSgpICYmCi0gICAgICAgICAgICAgICAgIXRyYWNrLT5pc1BhdXNlZCgpICYmICF0cmFjay0+aXNUZXJtaW5hdGVkKCkpCisgICAgICAgIGlmICgodHJhY2stPmZyYW1lc1JlYWR5KCkgPj0gbWluRnJhbWVzKSAmJiB0cmFjay0+aXNSZWFkeSgpICYmICF0cmFjay0+aXNQYXVzZWQoKSAmJgorICAgICAgICAgICAgICAgICF0cmFjay0+aXNTdG9wcGluZ18yKCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSkKICAgICAgICAgewogICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW09LXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPm1TZXJ2ZXIpOwogCkBAIC0zNjQ1LDE4ICs0MDM3LDMwIEBACiAgICAgICAgICAgICBpZiAoIW1FZmZlY3RDaGFpbnMuaXNFbXB0eSgpICYmIGxhc3QpIHsKICAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zWzBdLT5jbGVhcklucHV0QnVmZmVyKCk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWVigidHJhY2sgJWQgcz0lMDh4IFtOT1QgUkVBRFldIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7Ci0gICAgICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwKSB8fCB0cmFjay0+aXNUZXJtaW5hdGVkKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPmlzU3RvcHBlZCgpIHx8IHRyYWNrLT5pc1BhdXNlZCgpKSB7CisgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBpbmdfMSgpKSB7CisgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBJTkdfMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDApIHx8IHRyYWNrLT5pc1N0b3BwZWQoKSB8fAorICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNTdG9wcGluZ18yKCkgfHwgdHJhY2stPmlzUGF1c2VkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbnN1bWVkIGFsbCB0aGUgYnVmZmVycyBvZiB0aGlzIHRyYWNrLgogICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSB0cmFja3MuCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGJlaGF2aW9yIGZvciBjb21wcmVzc2VkIGF1ZGlvCi0gICAgICAgICAgICAgICAgc2l6ZV90IGF1ZGlvSEFMRnJhbWVzID0gKGxhdGVuY3lfbCgpICogbVNhbXBsZVJhdGUpIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBzaXplX3QgYXVkaW9IQUxGcmFtZXM7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9IQUxGcmFtZXMgPSAobGF0ZW5jeV9sKCkgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvSEFMRnJhbWVzID0gMDsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG1CeXRlc1dyaXR0ZW4gLyBtRnJhbWVTaXplOwogICAgICAgICAgICAgICAgIGlmIChtU3RhbmRieSB8fCAhbGFzdCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXNlbnRhdGlvbkNvbXBsZXRlKGZyYW1lc1dyaXR0ZW4sIGF1ZGlvSEFMRnJhbWVzKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBpbmdfMigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUEVEOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNTdG9wcGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6RkxVU0hFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoSHdfbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CkBAIC0zNjg3LDcgKzQwOTEsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6dGhyZWFkTG9vcF9taXgoKQogewogICAgIHNpemVfdCBmcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7Ci0gICAgaW50OF90ICpjdXJCdWYgPSAoaW50OF90ICopbU1peEJ1ZmZlcjsKKyAgICBpbnQ4X3QgKmN1ckJ1ZiA9IChpbnQ4X3QgKiltU2lua0J1ZmZlcjsKICAgICAvLyBvdXRwdXQgYXVkaW8gdG8gaGFyZHdhcmUKICAgICB3aGlsZSAoZnJhbWVDb3VudCkgewogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOwpAQCAtMzcwMiw3ICs0MTA2LDcgQEAKICAgICAgICAgY3VyQnVmICs9IGJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKICAgICAgICAgbUFjdGl2ZVRyYWNrLT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOwogICAgIH0KLSAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gY3VyQnVmIC0gKGludDhfdCAqKW1NaXhCdWZmZXI7CisgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IGN1ckJ1ZiAtIChpbnQ4X3QgKiltU2lua0J1ZmZlcjsKICAgICBzbGVlcFRpbWUgPSAwOwogICAgIHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpICsgc3RhbmRieURlbGF5OwogICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwpAQCAtMzcxNyw2OCArNDEyMSw2OSBAQAogICAgICAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUJ5dGVzV3JpdHRlbiAhPSAwICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKLSAgICAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1GcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CisgICAgICAgIG1lbXNldChtU2lua0J1ZmZlciwgMCwgbUZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgc2xlZXBUaW1lID0gMDsKICAgICB9CiB9CiAKIC8vIGdldFRyYWNrTmFtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi1pbnQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBpbnQgc2Vzc2lvbklkKQoraW50IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayBfX3VudXNlZCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0IF9fdW51c2VkLCBpbnQgc2Vzc2lvbklkIF9fdW51c2VkKQogewogICAgIHJldHVybiAwOwogfQogCiAvLyBkZWxldGVUcmFja05hbWVfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotdm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6ZGVsZXRlVHJhY2tOYW1lX2woaW50IG5hbWUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSBfX3VudXNlZCkKIHsKIH0KIAotLy8gY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLWJvb2wgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCkKKy8vIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKK2Jvb2wgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKQogewogICAgIGJvb2wgcmVjb25maWcgPSBmYWxzZTsKIAotICAgIHdoaWxlICghbU5ld1BhcmFtZXRlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgICAgICBTdHJpbmc4IGtleVZhbHVlUGFpciA9IG1OZXdQYXJhbWV0ZXJzWzBdOwotICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcik7Ci0gICAgICAgIGludCB2YWx1ZTsKKyAgICBzdGF0dXMgPSBOT19FUlJPUjsKIAotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZyYW1lQ291bnQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdCBhY2NlcHQgZnJhbWUgY291bnQgY2hhbmdlcyBpZiB0cmFja3MgYXJlIG9wZW4gYXMgdGhlIHRyYWNrIGJ1ZmZlcgotICAgICAgICAgICAgLy8gc2l6ZSBkZXBlbmRzIG9uIGZyYW1lIGNvdW50IGFuZCBjb3JyZWN0IGJlaGF2aW9yIHdvdWxkIG5vdCBiZSBnYXJhbnRpZWQKLSAgICAgICAgICAgIC8vIGlmIGZyYW1lIGNvdW50IGlzIGNoYW5nZWQgYWZ0ZXIgdHJhY2sgY3JlYXRpb24KLSAgICAgICAgICAgIGlmICghbVRyYWNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKKyAgICBpbnQgdmFsdWU7CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKKyAgICAgICAgLy8gYXdhcmUgb2YgYXR0YWNoZWQgYXVkaW8gZGV2aWNlLgorICAgICAgICBpZiAodmFsdWUgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIG1PdXREZXZpY2UgPSB2YWx1ZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKG1PdXREZXZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwotICAgICAgICAgICAgaWYgKCFtU3RhbmRieSAmJiBzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gPSAwOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvbmZpZykgewotICAgICAgICAgICAgICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1OZXdQYXJhbWV0ZXJzLnJlbW92ZUF0KDApOwotCi0gICAgICAgIG1QYXJhbVN0YXR1cyA9IHN0YXR1czsKLSAgICAgICAgbVBhcmFtQ29uZC5zaWduYWwoKTsKLSAgICAgICAgLy8gd2FpdCBmb3IgY29uZGl0aW9uIHdpdGggdGltZSBvdXQgaW4gY2FzZSB0aGUgdGhyZWFkIGNhbGxpbmcgVGhyZWFkQmFzZTo6c2V0UGFyYW1ldGVycygpCi0gICAgICAgIC8vIGFscmVhZHkgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHRoZSBzdGF0dXMgYW5kIHdpbGwgbmV2ZXIgc2lnbmFsIHRoZSBjb25kaXRpb24uCi0gICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywga1NldFBhcmFtZXRlcnNUaW1lb3V0TnMpOwogICAgIH0KKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZyYW1lQ291bnQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gZG8gbm90IGFjY2VwdCBmcmFtZSBjb3VudCBjaGFuZ2VzIGlmIHRyYWNrcyBhcmUgb3BlbiBhcyB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgIC8vIHNpemUgZGVwZW5kcyBvbiBmcmFtZSBjb3VudCBhbmQgY29ycmVjdCBiZWhhdmlvciB3b3VsZCBub3QgYmUgZ2FyYW50aWVkCisgICAgICAgIC8vIGlmIGZyYW1lIGNvdW50IGlzIGNoYW5nZWQgYWZ0ZXIgdHJhY2sgY3JlYXRpb24KKyAgICAgICAgaWYgKCFtVHJhY2tzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOworICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOworICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CisgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb25maWcpIHsKKyAgICAgICAgICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKTsKKyAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gcmVjb25maWc7CiB9CiAKQEAgLTM4MjgsNiArNDIzMywxMiBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Zmx1c2hId19sKCkKK3sKKyAgICBpZiAobU91dHB1dC0+c3RyZWFtLT5mbHVzaCAhPSBOVUxMKQorICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmZsdXNoKG1PdXRwdXQtPnN0cmVhbSk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9GbGluZ2VyOjpBc3luY0NhbGxiYWNrVGhyZWFkOjpBc3luY0NhbGxiYWNrVGhyZWFkKApAQCAtMzk1MSw3ICs0MzYyLDEwIEBACiAgICAgICAgIG1NaXhlclN0YXR1cyA9IE1JWEVSX0RSQUlOX0FMTDsKICAgICAgICAgdGhyZWFkTG9vcF9kcmFpbigpOwogICAgIH0KLSAgICBtQ2FsbGJhY2tUaHJlYWQtPmV4aXQoKTsKKyAgICBpZiAobVVzZUFzeW5jV3JpdGUpIHsKKyAgICAgICAgQUxPR19BU1NFUlQobUNhbGxiYWNrVGhyZWFkICE9IDApOworICAgICAgICBtQ2FsbGJhY2tUaHJlYWQtPmV4aXQoKTsKKyAgICB9CiAgICAgUGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3BfZXhpdCgpOwogfQogCkBAIC0zOTgzLDYgKzQzOTcsMTcgQEAKICAgICAgICAgc3A8VHJhY2s+IGwgPSBtTGF0ZXN0QWN0aXZlVHJhY2sucHJvbW90ZSgpOwogICAgICAgICBib29sIGxhc3QgPSBsLmdldCgpID09IHRyYWNrOwogCisgICAgICAgIGlmICh0cmFjay0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJBbiBpbnZhbGlkYXRlZCB0cmFjayBzaG91bGRuJ3QgYmUgaW4gYWN0aXZlIGxpc3QiKTsKKyAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OklETEUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJBbiBpZGxlIHRyYWNrIHNob3VsZG4ndCBiZSBpbiBhY3RpdmUgbGlzdCIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpKSB7CiAgICAgICAgICAgICB0cmFjay0+c2V0UGF1c2VkKCk7CiAgICAgICAgICAgICBpZiAobGFzdCkgewpAQCAtNDAwMSwzMiArNDQyNiwzOSBAQAogICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IDA7ICAgIC8vIHN0b3Agd3JpdGluZwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmZyYW1lc1JlYWR5KCkgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgorICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc0ZsdXNoUGVuZGluZygpKSB7CisgICAgICAgICAgICB0cmFjay0+Zmx1c2hBY2soKTsKKyAgICAgICAgICAgIGlmIChsYXN0KSB7CisgICAgICAgICAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmlzUmVzdW1lUGVuZGluZygpKXsKKyAgICAgICAgICAgIHRyYWNrLT5yZXN1bWVBY2soKTsKKyAgICAgICAgICAgIGlmIChsYXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKG1QYXVzZWRCeXRlc1JlbWFpbmluZykgeworICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNvbnRpbnVlIHdyaXRlIHRoYXQgd2FzIGludGVycnVwdGVkCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtUGF1c2VkV3JpdGVMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IG1QYXVzZWRCeXRlc1JlbWFpbmluZzsKKyAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5dGVzUmVtYWluaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Id1BhdXNlZCkgeworICAgICAgICAgICAgICAgICAgICBkb0h3UmVzdW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZExvb3BfbWl4KCkgd2lsbCBoYW5kbGUgdGhlIGNhc2UgdGhhdCB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSBhbiBpbnRlcnJ1cHRlZCB3cml0ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBlbmFibGUgd3JpdGUgdG8gYXVkaW8gSEFMCisgICAgICAgICAgICAgICAgc2xlZXBUaW1lID0gMDsKKworICAgICAgICAgICAgICAgIC8vIERvIG5vdCBoYW5kbGUgbmV3IGRhdGEgaW4gdGhpcyBpdGVyYXRpb24gZXZlbiBpZiB0cmFjay0+ZnJhbWVzUmVhZHkoKQorICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gIGVsc2UgaWYgKHRyYWNrLT5mcmFtZXNSZWFkeSgpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSAmJiAhdHJhY2stPmlzU3RvcHBpbmdfMigpKSB7CiAgICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrICVkIHM9JTA4eCBbT0tdIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CiAgICAgICAgICAgICBpZiAodHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPT0gVHJhY2s6OkZTX0ZJTExFRCkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgcHJvY2Vzc1ZvbHVtZV9sKCkgd2lsbCBhcHBseSBuZXcgdm9sdW1lIGV2ZW4gaWYgMAogICAgICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSBtUmlnaHRWb2xGbG9hdCA9IC0xLjA7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpSRVNVTUlORykgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBhdXNlZEJ5dGVzUmVtYWluaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjb250aW51ZSB3cml0ZSB0aGF0IHdhcyBpbnRlcnJ1cHRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtUGF1c2VkV3JpdGVMZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gbVBhdXNlZEJ5dGVzUmVtYWluaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXVzZWRCeXRlc1JlbWFpbmluZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUh3UGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Id1Jlc3VtZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkTG9vcF9taXgoKSB3aWxsIGhhbmRsZSB0aGUgY2FzZSB0aGF0IHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWUgYW4gaW50ZXJydXB0ZWQgd3JpdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZSB3cml0ZSB0byBhdWRpbyBIQUwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChsYXN0KSB7CkBAIC00MDUwLDcgKzQ0ODIsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlayB3aGVuIHJlc3VtaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzVHJhY2stPnNlc3Npb25JZCgpICE9IHRyYWNrLT5zZXNzaW9uSWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVHJhY2stPmludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTQwOTYsNyArNDUyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhdWRpb0hBTEZyYW1lcyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1PdXRwdXQtPnN0cmVhbS0+Z2V0X2xhdGVuY3kobU91dHB1dC0+c3RyZWFtKSptU2FtcGxlUmF0ZSkgLyAxMDAwOwogICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzV3JpdHRlbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiAvIGF1ZGlvX3N0cmVhbV9mcmFtZV9zaXplKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiAvIGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtT3V0cHV0LT5zdHJlYW0pOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CkBAIC00MTI2LDkgKzQ1NTcsNiBAQAogICAgIC8vIGlmIHJlc3VtZSBpcyByZWNlaXZlZCBiZWZvcmUgcGF1c2UgaXMgZXhlY3V0ZWQuCiAgICAgaWYgKCFtU3RhbmRieSAmJiAoZG9Id1BhdXNlIHx8IChtRmx1c2hQZW5kaW5nICYmICFtSHdQYXVzZWQgJiYgKGNvdW50ICE9IDApKSkpIHsKICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5wYXVzZShtT3V0cHV0LT5zdHJlYW0pOwotICAgICAgICBpZiAoIWRvSHdQYXVzZSkgewotICAgICAgICAgICAgZG9Id1Jlc3VtZSA9IHRydWU7Ci0gICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1GbHVzaFBlbmRpbmcpIHsKICAgICAgICAgZmx1c2hId19sKCk7CkBAIC00MTQ0LDExICs0NTcyLDYgQEAKICAgICByZXR1cm4gbWl4ZXJTdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpPZmZsb2FkVGhyZWFkOjpmbHVzaE91dHB1dF9sKCkKLXsKLSAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKLX0KLQogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbXV0ZXggbG9ja2VkCiBib29sIEF1ZGlvRmxpbmdlcjo6T2ZmbG9hZFRocmVhZDo6d2FpdGluZ0FzeW5jQ2FsbGJhY2tfbCgpCiB7CkBAIC00MTYzLDE1ICs0NTg2LDE1IEBACiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRocmVhZCBtdXRleCBsb2NrZWQKIGJvb2wgQXVkaW9GbGluZ2VyOjpPZmZsb2FkVGhyZWFkOjpzaG91bGRTdGFuZGJ5X2woKQogewotICAgIGJvb2wgVHJhY2tQYXVzZWQgPSBmYWxzZTsKKyAgICBib29sIHRyYWNrUGF1c2VkID0gZmFsc2U7CiAKICAgICAvLyBkbyBub3QgcHV0IHRoZSBIQUwgaW4gc3RhbmRieSB3aGVuIHBhdXNlZC4gQXdlc29tZVBsYXllciBjbGVhciB0aGUgb2ZmbG9hZGVkIEF1ZGlvVHJhY2sKICAgICAvLyBhZnRlciBhIHRpbWVvdXQgYW5kIHdlIHdpbGwgZW50ZXIgc3RhbmRieSB0aGVuLgogICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDApIHsKLSAgICAgICAgVHJhY2tQYXVzZWQgPSBtVHJhY2tzW21UcmFja3Muc2l6ZSgpIC0gMV0tPmlzUGF1c2VkKCk7CisgICAgICAgIHRyYWNrUGF1c2VkID0gbVRyYWNrc1ttVHJhY2tzLnNpemUoKSAtIDFdLT5pc1BhdXNlZCgpOwogICAgIH0KIAotICAgIHJldHVybiAhbVN0YW5kYnkgJiYgIVRyYWNrUGF1c2VkOworICAgIHJldHVybiAhbVN0YW5kYnkgJiYgIXRyYWNrUGF1c2VkOwogfQogCiAKQEAgLTQxODMsMTIgKzQ2MDYsMTQgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6OmZsdXNoSHdfbCgpCiB7Ci0gICAgbU91dHB1dC0+c3RyZWFtLT5mbHVzaChtT3V0cHV0LT5zdHJlYW0pOworICAgIERpcmVjdE91dHB1dFRocmVhZDo6Zmx1c2hId19sKCk7CiAgICAgLy8gRmx1c2ggYW55dGhpbmcgc3RpbGwgd2FpdGluZyBpbiB0aGUgbWl4YnVmZmVyCiAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IDA7CiAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsKICAgICBtUGF1c2VkV3JpdGVMZW5ndGggPSAwOwogICAgIG1QYXVzZWRCeXRlc1JlbWFpbmluZyA9IDA7CisgICAgbUh3UGF1c2VkID0gZmFsc2U7CisKICAgICBpZiAobVVzZUFzeW5jV3JpdGUpIHsKICAgICAgICAgLy8gZGlzY2FyZCBhbnkgcGVuZGluZyBkcmFpbiBvciB3cml0ZSBhY2sgYnkgaW5jcmVtZW50aW5nIHNlcXVlbmNlCiAgICAgICAgIG1Xcml0ZUFja1NlcXVlbmNlID0gKG1Xcml0ZUFja1NlcXVlbmNlICsgMikgJiB+MTsKQEAgLTQxOTksNiArNDYyNCwxOCBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpCit7CisgICAgc3A8VHJhY2s+IHByZXZpb3VzVHJhY2sgPSBtUHJldmlvdXNUcmFjay5wcm9tb3RlKCk7CisgICAgc3A8VHJhY2s+IGxhdGVzdFRyYWNrID0gbUxhdGVzdEFjdGl2ZVRyYWNrLnByb21vdGUoKTsKKworICAgIGlmIChwcmV2aW91c1RyYWNrICE9IDAgJiYgbGF0ZXN0VHJhY2sgIT0gMCAmJgorICAgICAgICAocHJldmlvdXNUcmFjay0+c2Vzc2lvbklkKCkgIT0gbGF0ZXN0VHJhY2stPnNlc3Npb25JZCgpKSkgeworICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKKyAgICB9CisgICAgUGxheWJhY2tUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OkR1cGxpY2F0aW5nVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKQEAgLTQyMjMsMTEgKzQ2NjAsMTUgQEAKICAgICBpZiAob3V0cHV0c1JlYWR5KG91dHB1dFRyYWNrcykpIHsKICAgICAgICAgbUF1ZGlvTWl4ZXItPnByb2Nlc3MoQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1lbXNldChtTWl4QnVmZmVyLCAwLCBtaXhCdWZmZXJTaXplKTsKKyAgICAgICAgaWYgKG1NaXhlckJ1ZmZlclZhbGlkKSB7CisgICAgICAgICAgICBtZW1zZXQobU1peGVyQnVmZmVyLCAwLCBtTWl4ZXJCdWZmZXJTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbXNldChtU2lua0J1ZmZlciwgMCwgbVNpbmtCdWZmZXJTaXplKTsKKyAgICAgICAgfQogICAgIH0KICAgICBzbGVlcFRpbWUgPSAwOwogICAgIHdyaXRlRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7Ci0gICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1peEJ1ZmZlclNpemU7CisgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1TaW5rQnVmZmVyU2l6ZTsKICAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKSArIHN0YW5kYnlEZWxheTsKIH0KIApAQCAtNDI0Miw3ICs0NjgzLDcgQEAKICAgICB9IGVsc2UgaWYgKG1CeXRlc1dyaXR0ZW4gIT0gMCkgewogICAgICAgICBpZiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7CiAgICAgICAgICAgICB3cml0ZUZyYW1lcyA9IG1Ob3JtYWxGcmFtZUNvdW50OwotICAgICAgICAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1peEJ1ZmZlclNpemUpOworICAgICAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtU2lua0J1ZmZlclNpemUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gZmx1c2ggcmVtYWluaW5nIG92ZXJmbG93IGJ1ZmZlcnMgaW4gb3V0cHV0IHRyYWNrcwogICAgICAgICAgICAgd3JpdGVGcmFtZXMgPSAwOwpAQCAtNDI1NCwxMCArNDY5NSwxOCBAQAogc3NpemVfdCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjp0aHJlYWRMb29wX3dyaXRlKCkKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dFRyYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICBvdXRwdXRUcmFja3NbaV0tPndyaXRlKG1NaXhCdWZmZXIsIHdyaXRlRnJhbWVzKTsKKyAgICAgICAgLy8gV2UgY29udmVydCB0aGUgZHVwbGljYXRpbmcgdGhyZWFkIGZvcm1hdCB0byBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICAvLyBmb3IgZGVsaXZlcnkgZG93bnN0cmVhbSBhcyBuZWVkZWQuIFRoaXMgaW4tcGxhY2UgY29udmVyc2lvbiBpcyBzYWZlIGFzCisgICAgICAgIC8vIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIGlzIHNtYWxsZXIgdGhhbiBhbnkgb3RoZXIgc3VwcG9ydGVkIGZvcm1hdAorICAgICAgICAvLyAoQVVESU9fRk9STUFUX1BDTV84X0JJVCBpcyBub3QgYWxsb3dlZCBoZXJlKS4KKyAgICAgICAgaWYgKG1Gb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQobVNpbmtCdWZmZXIsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICBtU2lua0J1ZmZlciwgbUZvcm1hdCwgd3JpdGVGcmFtZXMgKiBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXRUcmFja3NbaV0tPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KG1TaW5rQnVmZmVyKSwgd3JpdGVGcmFtZXMpOwogICAgIH0KICAgICBtU3RhbmRieSA9IGZhbHNlOwotICAgIHJldHVybiAoc3NpemVfdCltaXhCdWZmZXJTaXplOworICAgIHJldHVybiAoc3NpemVfdCltU2lua0J1ZmZlclNpemU7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6dGhyZWFkTG9vcF9zdGFuZGJ5KCkKQEAgLTQyODMsMTAgKzQ3MzIsMTYgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIEZJWE1FIGV4cGxhaW4gdGhpcyBmb3JtdWxhCiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAoMyAqIG1Ob3JtYWxGcmFtZUNvdW50ICogbVNhbXBsZVJhdGUpIC8gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgLy8gT3V0cHV0VHJhY2sgaXMgZm9yY2VkIHRvIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIHJlZ2FyZGxlc3Mgb2YgbUZvcm1hdAorICAgIC8vIGR1ZSB0byBjdXJyZW50IHVzYWdlIGNhc2UgYW5kIHJlc3RyaWN0aW9ucyBvbiB0aGUgQXVkaW9CdWZmZXJQcm92aWRlci4KKyAgICAvLyBBY3R1YWwgYnVmZmVyIGNvbnZlcnNpb24gaXMgZG9uZSBpbiB0aHJlYWRMb29wX3dyaXRlKCkuCisgICAgLy8KKyAgICAvLyBUT0RPOiBUaGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwgZGVwZW5kaW5nIG9uIG11bHRpY2hhbm5lbAorICAgIC8vIChhbmQgbm9uIGludDE2X3QqKSBzdXBwb3J0IG9uIEFGOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2sKICAgICBPdXRwdXRUcmFjayAqb3V0cHV0VHJhY2sgPSBuZXcgT3V0cHV0VHJhY2sodGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTQzNzEsOCArNDgyNiw2IEBACiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UKQEAgLTQzODEsMjcgKzQ4MzQsMTYyIEBACiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6CiAgICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBSRUNPUkQpLAotICAgIG1JbnB1dChpbnB1dCksIG1SZXNhbXBsZXIoTlVMTCksIG1Sc21wT3V0QnVmZmVyKE5VTEwpLCBtUnNtcEluQnVmZmVyKE5VTEwpLAotICAgIC8vIG1Sc21wSW5JbmRleCBhbmQgbUJ1ZmZlclNpemUgc2V0IGJ5IHJlYWRJbnB1dFBhcmFtZXRlcnMoKQotICAgIG1SZXFDaGFubmVsQ291bnQocG9wY291bnQoY2hhbm5lbE1hc2spKSwKLSAgICBtUmVxU2FtcGxlUmF0ZShzYW1wbGVSYXRlKQotICAgIC8vIG1CeXRlc1JlYWQgaXMgb25seSBtZWFuaW5nZnVsIHdoaWxlIGFjdGl2ZSwgYW5kIHNvIGlzIGNsZWFyZWQgaW4gc3RhcnQoKQotICAgIC8vIChidXQgbWlnaHQgYmUgYmV0dGVyIHRvIGFsc28gY2xlYXIgaGVyZSBmb3IgZHVtcD8pCisgICAgbUlucHV0KGlucHV0KSwgbUFjdGl2ZVRyYWNrc0dlbigwKSwgbVJzbXBJbkJ1ZmZlcihOVUxMKSwKKyAgICAvLyBtUnNtcEluRnJhbWVzIGFuZCBtUnNtcEluRnJhbWVzUDIgYXJlIHNldCBieSByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQorICAgIG1Sc21wSW5SZWFyKDApCiAjaWZkZWYgVEVFX1NJTksKICAgICAsIG1UZWVTaW5rKHRlZVNpbmspCiAjZW5kaWYKKyAgICAsIG1SZWFkT25seUhlYXAobmV3IE1lbW9yeURlYWxlcihrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSwKKyAgICAgICAgICAgICJSZWNvcmRUaHJlYWRSTyIsIE1lbW9yeUhlYXBCYXNlOjpSRUFEX09OTFkpKQorICAgIC8vIG1GYXN0Q2FwdHVyZSBiZWxvdworICAgICwgbUZhc3RDYXB0dXJlRnV0ZXgoMCkKKyAgICAvLyBtSW5wdXRTb3VyY2UKKyAgICAvLyBtUGlwZVNpbmsKKyAgICAvLyBtUGlwZVNvdXJjZQorICAgICwgbVBpcGVGcmFtZXNQMigwKQorICAgIC8vIG1QaXBlTWVtb3J5CisgICAgLy8gbUZhc3RDYXB0dXJlTkJMb2dXcml0ZXIKKyAgICAsIG1GYXN0VHJhY2tBdmFpbChmYWxzZSkKIHsKICAgICBzbnByaW50ZihtTmFtZSwga05hbWVMZW5ndGgsICJBdWRpb0luXyVYIiwgaWQpOworICAgIG1OQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0xvZ1NpemUsIG1OYW1lKTsKIAotICAgIHJlYWRJbnB1dFBhcmFtZXRlcnMoKTsKKyAgICByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKTsKKworICAgIC8vIGNyZWF0ZSBhbiBOQkFJTyBzb3VyY2UgZm9yIHRoZSBIQUwgaW5wdXQgc3RyZWFtLCBhbmQgbmVnb3RpYXRlCisgICAgbUlucHV0U291cmNlID0gbmV3IEF1ZGlvU3RyZWFtSW5Tb3VyY2UoaW5wdXQtPnN0cmVhbSk7CisgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOworICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCl9OworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRTb3VyY2UtPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOworICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOworCisgICAgLy8gaW5pdGlhbGl6ZSBmYXN0IGNhcHR1cmUgZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24KKyAgICBib29sIGluaXRGYXN0Q2FwdHVyZTsKKyAgICBzd2l0Y2ggKGtVc2VGYXN0Q2FwdHVyZSkgeworICAgIGNhc2UgRmFzdENhcHR1cmVfTmV2ZXI6CisgICAgICAgIGluaXRGYXN0Q2FwdHVyZSA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZhc3RDYXB0dXJlX0Fsd2F5czoKKyAgICAgICAgaW5pdEZhc3RDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGYXN0Q2FwdHVyZV9TdGF0aWM6CisgICAgICAgIHVpbnQzMl90IHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlOworICAgICAgICB7CisgICAgICAgICAgICBBdXRvTXV0ZXggX2woYXVkaW9GbGluZ2VyLT5tSGFyZHdhcmVMb2NrKTsKKyAgICAgICAgICAgIHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlID0gYXVkaW9GbGluZ2VyLT5tUHJpbWFyeU91dHB1dFNhbXBsZVJhdGU7CisgICAgICAgIH0KKyAgICAgICAgaW5pdEZhc3RDYXB0dXJlID0KKyAgICAgICAgICAgICAgICAvLyBlaXRoZXIgY2FwdHVyZSBzYW1wbGUgcmF0ZSBpcyBzYW1lIGFzIChhIHJlYXNvbmFibGUpIHByaW1hcnkgb3V0cHV0IHNhbXBsZSByYXRlCisgICAgICAgICAgICAgICAgKCgocHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPT0gNDQxMDAgfHwgcHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPT0gNDgwMDApICYmCisgICAgICAgICAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA9PSBwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSkpIHx8CisgICAgICAgICAgICAgICAgLy8gb3IgcHJpbWFyeSBvdXRwdXQgc2FtcGxlIHJhdGUgaXMgdW5rbm93biwgYW5kIGNhcHR1cmUgc2FtcGxlIHJhdGUgaXMgcmVhc29uYWJsZQorICAgICAgICAgICAgICAgICgocHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKChtU2FtcGxlUmF0ZSA9PSA0NDEwMCB8fCBtU2FtcGxlUmF0ZSA9PSA0ODAwMCkpKSkgJiYKKyAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGJ1ZmZlciBzaXplIGlzIDwgMTIgbXMKKyAgICAgICAgICAgICAgICAobUZyYW1lQ291bnQgKiAxMDAwKSAvIG1TYW1wbGVSYXRlIDwgMTI7CisgICAgICAgIGJyZWFrOworICAgIC8vIGNhc2UgRmFzdENhcHR1cmVfRHluYW1pYzoKKyAgICB9CisKKyAgICBpZiAoaW5pdEZhc3RDYXB0dXJlKSB7CisgICAgICAgIC8vIGNyZWF0ZSBhIFBpcGUgZm9yIEZhc3RNaXhlciB0byB3cml0ZSB0bywgYW5kIGZvciB1cyBhbmQgZmFzdCB0cmFja3MgdG8gcmVhZCBmcm9tCisgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBtSW5wdXRTb3VyY2UtPmZvcm1hdCgpOworICAgICAgICBzaXplX3QgcGlwZUZyYW1lc1AyID0gcm91bmR1cChtU2FtcGxlUmF0ZSAvIDI1KTsgICAgLy8gZG91YmxlLWJ1ZmZlcmluZyBvZiAyMCBtcyBlYWNoCisgICAgICAgIHNpemVfdCBwaXBlU2l6ZSA9IHBpcGVGcmFtZXNQMiAqIEZvcm1hdF9mcmFtZVNpemUoZm9ybWF0KTsKKyAgICAgICAgdm9pZCAqcGlwZUJ1ZmZlcjsKKyAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiByb0hlYXAocmVhZE9ubHlIZWFwKCkpOworICAgICAgICBzcDxJTWVtb3J5PiBwaXBlTWVtb3J5OworICAgICAgICBpZiAoKHJvSGVhcCA9PSAwKSB8fAorICAgICAgICAgICAgICAgIChwaXBlTWVtb3J5ID0gcm9IZWFwLT5hbGxvY2F0ZShwaXBlU2l6ZSkpID09IDAgfHwKKyAgICAgICAgICAgICAgICAocGlwZUJ1ZmZlciA9IHBpcGVNZW1vcnktPnBvaW50ZXIoKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBwaXBlIGJ1ZmZlciBzaXplPSV6dSIsIHBpcGVTaXplKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAgIC8vIHBpcGUgd2lsbCBiZSBzaGFyZWQgZGlyZWN0bHkgd2l0aCBmYXN0IGNsaWVudHMsIHNvIGNsZWFyIHRvIGF2b2lkIGxlYWtpbmcgb2xkIGluZm9ybWF0aW9uCisgICAgICAgIG1lbXNldChwaXBlQnVmZmVyLCAwLCBwaXBlU2l6ZSk7CisgICAgICAgIFBpcGUgKnBpcGUgPSBuZXcgUGlwZShwaXBlRnJhbWVzUDIsIGZvcm1hdCwgcGlwZUJ1ZmZlcik7CisgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Zm9ybWF0fTsKKyAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOworICAgICAgICBzc2l6ZV90IGluZGV4ID0gcGlwZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOworICAgICAgICBtUGlwZVNpbmsgPSBwaXBlOworICAgICAgICBQaXBlUmVhZGVyICpwaXBlUmVhZGVyID0gbmV3IFBpcGVSZWFkZXIoKnBpcGUpOworICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKKyAgICAgICAgaW5kZXggPSBwaXBlUmVhZGVyLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7CisgICAgICAgIG1QaXBlU291cmNlID0gcGlwZVJlYWRlcjsKKyAgICAgICAgbVBpcGVGcmFtZXNQMiA9IHBpcGVGcmFtZXNQMjsKKyAgICAgICAgbVBpcGVNZW1vcnkgPSBwaXBlTWVtb3J5OworCisgICAgICAgIC8vIGNyZWF0ZSBmYXN0IGNhcHR1cmUKKyAgICAgICAgbUZhc3RDYXB0dXJlID0gbmV3IEZhc3RDYXB0dXJlKCk7CisgICAgICAgIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdENhcHR1cmUtPnNxKCk7CisjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUAorICAgICAgICAvLyBGSVhNRQorI2VuZGlmCisgICAgICAgIEZhc3RDYXB0dXJlU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgIHN0YXRlLT5tQ2JsayA9IE5VTEw7CisgICAgICAgIHN0YXRlLT5tSW5wdXRTb3VyY2UgPSBtSW5wdXRTb3VyY2UuZ2V0KCk7CisgICAgICAgIHN0YXRlLT5tSW5wdXRTb3VyY2VHZW4rKzsKKyAgICAgICAgc3RhdGUtPm1QaXBlU2luayA9IHBpcGU7CisgICAgICAgIHN0YXRlLT5tUGlwZVNpbmtHZW4rKzsKKyAgICAgICAgc3RhdGUtPm1GcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CisgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RDYXB0dXJlU3RhdGU6OkNPTERfSURMRTsKKyAgICAgICAgLy8gYWxyZWFkeSBkb25lIGluIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uIGxpc3QKKyAgICAgICAgLy9tRmFzdENhcHR1cmVGdXRleCA9IDA7CisgICAgICAgIHN0YXRlLT5tQ29sZEZ1dGV4QWRkciA9ICZtRmFzdENhcHR1cmVGdXRleDsKKyAgICAgICAgc3RhdGUtPm1Db2xkR2VuKys7CisgICAgICAgIHN0YXRlLT5tRHVtcFN0YXRlID0gJm1GYXN0Q2FwdHVyZUR1bXBTdGF0ZTsKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAvLyBGSVhNRQorI2VuZGlmCisgICAgICAgIG1GYXN0Q2FwdHVyZU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrRmFzdENhcHR1cmVMb2dTaXplLCAiRmFzdENhcHR1cmUiKTsKKyAgICAgICAgc3RhdGUtPm1OQkxvZ1dyaXRlciA9IG1GYXN0Q2FwdHVyZU5CTG9nV3JpdGVyLmdldCgpOworICAgICAgICBzcS0+ZW5kKCk7CisgICAgICAgIHNxLT5wdXNoKEZhc3RDYXB0dXJlU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfUFVTSEVEKTsKKworICAgICAgICAvLyBzdGFydCB0aGUgZmFzdCBjYXB0dXJlCisgICAgICAgIG1GYXN0Q2FwdHVyZS0+cnVuKCJGYXN0Q2FwdHVyZSIsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKKyAgICAgICAgcGlkX3QgdGlkID0gbUZhc3RDYXB0dXJlLT5nZXRUaWQoKTsKKyAgICAgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eShnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlcik7CisgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgQUxPR1coIlBvbGljeSBTQ0hFRF9GSUZPIHByaW9yaXR5ICVkIGlzIHVuYXZhaWxhYmxlIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgICAgIGtQcmlvcml0eUZhc3RDYXB0dXJlLCBnZXRwaWRfY2FjaGVkLCB0aWQsIGVycik7CisgICAgICAgIH0KKworI2lmZGVmIEFVRElPX1dBVENIRE9HCisgICAgICAgIC8vIEZJWE1FCisjZW5kaWYKKworICAgICAgICBtRmFzdFRyYWNrQXZhaWwgPSB0cnVlOworICAgIH0KK2ZhaWxlZDogOworCisgICAgLy8gRklYTUUgbU5vcm1hbFNvdXJjZQogfQogCiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp+UmVjb3JkVGhyZWFkKCkKIHsKKyAgICBpZiAobUZhc3RDYXB0dXJlICE9IDApIHsKKyAgICAgICAgRmFzdENhcHR1cmVTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0Q2FwdHVyZS0+c3EoKTsKKyAgICAgICAgRmFzdENhcHR1cmVTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tQ29tbWFuZCA9PSBGYXN0Q2FwdHVyZVN0YXRlOjpDT0xEX0lETEUpIHsKKyAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfaW5jKCZtRmFzdENhcHR1cmVGdXRleCk7CisgICAgICAgICAgICBpZiAob2xkID09IC0xKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJm1GYXN0Q2FwdHVyZUZ1dGV4LCBGVVRFWF9XQUtFX1BSSVZBVEUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RDYXB0dXJlU3RhdGU6OkVYSVQ7CisgICAgICAgIHNxLT5lbmQoKTsKKyAgICAgICAgc3EtPnB1c2goRmFzdENhcHR1cmVTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9QVVNIRUQpOworICAgICAgICBtRmFzdENhcHR1cmUtPmpvaW4oKTsKKyAgICAgICAgbUZhc3RDYXB0dXJlLmNsZWFyKCk7CisgICAgfQorICAgIG1BdWRpb0ZsaW5nZXItPnVucmVnaXN0ZXJXcml0ZXIobUZhc3RDYXB0dXJlTkJMb2dXcml0ZXIpOworICAgIG1BdWRpb0ZsaW5nZXItPnVucmVnaXN0ZXJXcml0ZXIobU5CTG9nV3JpdGVyKTsKICAgICBkZWxldGVbXSBtUnNtcEluQnVmZmVyOwotICAgIGRlbGV0ZSBtUmVzYW1wbGVyOwotICAgIGRlbGV0ZVtdIG1Sc21wT3V0QnVmZmVyOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpvbkZpcnN0UmVmKCkKQEAgLTQ0MDksMjMwICs0OTk3LDQ4MiBAQAogICAgIHJ1bihtTmFtZSwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlYWR5VG9SdW4oKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IGluaXRDaGVjaygpOwotICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwiUmVjb3JkVGhyZWFkICVwIGNvdWxkIG5vdCBpbml0aWFsaXplIiwgdGhpcyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQogYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6dGhyZWFkTG9vcCgpCiB7Ci0gICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIGJ1ZmZlcjsKLSAgICBzcDxSZWNvcmRUcmFjaz4gYWN0aXZlVHJhY2s7Ci0gICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7Ci0KICAgICBuc2Vjc190IGxhc3RXYXJuaW5nID0gMDsKIAogICAgIGlucHV0U3RhbmRCeSgpOworCityZWFjcXVpcmVfd2FrZWxvY2s6CisgICAgc3A8UmVjb3JkVHJhY2s+IGFjdGl2ZVRyYWNrOworICAgIGludCBhY3RpdmVUcmFja3NHZW47CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBhY3RpdmVUcmFjayA9IG1BY3RpdmVUcmFjazsKLSAgICAgICAgYWNxdWlyZVdha2VMb2NrX2woYWN0aXZlVHJhY2sgIT0gMCA/IGFjdGl2ZVRyYWNrLT51aWQoKSA6IC0xKTsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKKyAgICAgICAgYWN0aXZlVHJhY2tzR2VuID0gbUFjdGl2ZVRyYWNrc0dlbjsKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICAvLyBGSVhNRSBhbiBhcmJpdHJhcnkgY2hvaWNlCisgICAgICAgICAgICBhY3RpdmVUcmFjayA9IG1BY3RpdmVUcmFja3NbMF07CisgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbChhY3RpdmVUcmFjay0+dWlkKCkpOworICAgICAgICAgICAgaWYgKHNpemUgPiAxKSB7CisgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGludD4gdG1wOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcC5hZGQobUFjdGl2ZVRyYWNrc1tpXS0+dWlkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1cGRhdGVXYWtlTG9ja1VpZHNfbCh0bXApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWNxdWlyZVdha2VMb2NrX2woLTEpOworICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gdXNlZCB0byB2ZXJpZnkgd2UndmUgcmVhZCBhdCBsZWFzdCBvbmNlIGJlZm9yZSBldmFsdWF0aW5nIGhvdyBtYW55IGJ5dGVzIHdlcmUgcmVhZAotICAgIGJvb2wgcmVhZE9uY2UgPSBmYWxzZTsKKyAgICAvLyB1c2VkIHRvIHJlcXVlc3QgYSBkZWZlcnJlZCBzbGVlcCwgdG8gYmUgZXhlY3V0ZWQgbGF0ZXIgd2hpbGUgbXV0ZXggaXMgdW5sb2NrZWQKKyAgICB1aW50MzJfdCBzbGVlcFVzID0gMDsKIAotICAgIC8vIHN0YXJ0IHJlY29yZGluZwotICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkgeworICAgIC8vIGxvb3Agd2hpbGUgdGhlcmUgaXMgd29yayB0byBkbworICAgIGZvciAoOzspIHsKKyAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7CiAKLSAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50cygpOworICAgICAgICAvLyBzbGVlcCB3aXRoIG11dGV4IHVubG9ja2VkCisgICAgICAgIGlmIChzbGVlcFVzID4gMCkgeworICAgICAgICAgICAgdXNsZWVwKHNsZWVwVXMpOworICAgICAgICAgICAgc2xlZXBVcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBhY3RpdmVUcmFja3MgYWNjdW11bGF0ZXMgYSBjb3B5IG9mIGEgc3Vic2V0IG9mIG1BY3RpdmVUcmFja3MKKyAgICAgICAgVmVjdG9yPCBzcDxSZWNvcmRUcmFjaz4gPiBhY3RpdmVUcmFja3M7CisKKyAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSAoZmlyc3QgYW5kIG9ubHkpIGFjdGl2ZSBmYXN0IHRyYWNrCisgICAgICAgIHNwPFJlY29yZFRyYWNrPiBmYXN0VHJhY2s7CisKKyAgICAgICAgLy8gcmVmZXJlbmNlIHRvIGEgZmFzdCB0cmFjayB3aGljaCBpcyBhYm91dCB0byBiZSByZW1vdmVkCisgICAgICAgIHNwPFJlY29yZFRyYWNrPiBmYXN0VHJhY2tUb1JlbW92ZTsKIAogICAgICAgICB7IC8vIHNjb3BlIGZvciBtTG9jawogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCk7Ci0gICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDAgJiYgYWN0aXZlVHJhY2sgIT0gbUFjdGl2ZVRyYWNrKSB7Ci0gICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGludD4gdG1wOwotICAgICAgICAgICAgICAgIHRtcC5hZGQobUFjdGl2ZVRyYWNrLT51aWQoKSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlV2FrZUxvY2tVaWRzX2wodG1wKTsKKworICAgICAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCk7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGV4aXRQZW5kaW5nIGhlcmUgYmVjYXVzZSBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpIGFuZAorICAgICAgICAgICAgLy8gY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSBjYW4gdGVtcG9yYXJpbHkgcmVsZWFzZSBtTG9jaworICAgICAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFjdGl2ZVRyYWNrID0gbUFjdGl2ZVRyYWNrOwotICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjayA9PSAwICYmIG1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgc3RhbmRieSgpOwogCi0gICAgICAgICAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAvLyBpZiBubyBhY3RpdmUgdHJhY2socyksIHRoZW4gc3RhbmRieSBhbmQgcmVsZWFzZSB3YWtlbG9jaworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCk7CisgICAgICAgICAgICAgICAgLy8gZXhpdFBlbmRpbmcoKSBjYW4ndCBiZWNvbWUgdHJ1ZSBoZXJlCiAgICAgICAgICAgICAgICAgcmVsZWFzZVdha2VMb2NrX2woKTsKICAgICAgICAgICAgICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOiBsb29wIHN0b3BwaW5nIik7CiAgICAgICAgICAgICAgICAgLy8gZ28gdG8gc2xlZXAKICAgICAgICAgICAgICAgICBtV2FpdFdvcmtDVi53YWl0KG1Mb2NrKTsKICAgICAgICAgICAgICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOiBsb29wIHN0YXJ0aW5nIik7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZVdha2VMb2NrX2wobUFjdGl2ZVRyYWNrICE9IDAgPyBtQWN0aXZlVHJhY2stPnVpZCgpIDogLTEpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGdvdG8gcmVhY3F1aXJlX3dha2Vsb2NrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbChtQWN0aXZlVHJhY2spOwotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgewotICAgICAgICAgICAgICAgICAgICBzdGFuZGJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZC5icm9hZGNhc3QoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXFDaGFubmVsQ291bnQgIT0gbUFjdGl2ZVRyYWNrLT5jaGFubmVsQ291bnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZC5icm9hZGNhc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWFkT25jZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkIHN0YXJ0IHN1Y2NlZWRzIG9ubHkgaWYgZmlyc3QgcmVhZCBmcm9tIGF1ZGlvIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWNjZWVkcwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CeXRlc1JlYWQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0U3RvcENvbmQuYnJvYWRjYXN0KCk7CisKKyAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzR2VuICE9IGFjdGl2ZVRyYWNrc0dlbikgeworICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrc0dlbiA9IG1BY3RpdmVUcmFja3NHZW47CisgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGludD4gdG1wOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcC5hZGQobUFjdGl2ZVRyYWNrc1tpXS0+dWlkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1cGRhdGVXYWtlTG9ja1VpZHNfbCh0bXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIGRvQnJvYWRjYXN0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICkgeworCisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2tUb1JlbW92ZSA9PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFja1RvUmVtb3ZlID0gYWN0aXZlVHJhY2s7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbChhY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbisrOworICAgICAgICAgICAgICAgICAgICBzaXplLS07CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRyYWNrQmFzZTo6dHJhY2tfc3RhdGUgYWN0aXZlVHJhY2tTdGF0ZSA9IGFjdGl2ZVRyYWNrLT5tU3RhdGU7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhY3RpdmVUcmFja1N0YXRlKSB7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6UEFVU0lORzoKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUoYWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuKys7CisgICAgICAgICAgICAgICAgICAgIGRvQnJvYWRjYXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZS0tOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpTVEFSVElOR18xOgorICAgICAgICAgICAgICAgICAgICBzbGVlcFVzID0gMTAwMDA7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6U1RBUlRJTkdfMjoKKyAgICAgICAgICAgICAgICAgICAgZG9Ccm9hZGNhc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OkFDVElWRToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6SURMRToKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuZXhwZWN0ZWQgYWN0aXZlVHJhY2tTdGF0ZSAlZCIsIGFjdGl2ZVRyYWNrU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrcy5hZGQoYWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgIGkrKzsKKworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVCghbUZhc3RUcmFja0F2YWlsKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFzdFRyYWNrID09IDApOworICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2sgPSBhY3RpdmVUcmFjazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZG9Ccm9hZGNhc3QpIHsKKyAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZC5icm9hZGNhc3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2xlZXAgaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSB0cmFja3MgdG8gcHJvY2VzcworICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChzbGVlcFVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2xlZXBVcyA9IGtSZWNvcmRUaHJlYWRTbGVlcFVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZWVwVXMgPSAwOwogCiAgICAgICAgICAgICBsb2NrRWZmZWN0Q2hhaW5zX2woZWZmZWN0Q2hhaW5zKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlICE9IFRyYWNrQmFzZTo6QUNUSVZFICYmCi0gICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5tU3RhdGUgIT0gVHJhY2tCYXNlOjpSRVNVTUlORykgewotICAgICAgICAgICAgICAgIHVubG9ja0VmZmVjdENoYWlucyhlZmZlY3RDaGFpbnMpOwotICAgICAgICAgICAgICAgIHVzbGVlcChrUmVjb3JkVGhyZWFkU2xlZXBVcyk7CisgICAgICAgIC8vIHRocmVhZCBtdXRleCBpcyBub3cgdW5sb2NrZWQsIG1BY3RpdmVUcmFja3MgdW5rbm93biwgYWN0aXZlVHJhY2tzLnNpemUoKSA+IDAKKworICAgICAgICBzaXplX3Qgc2l6ZSA9IGVmZmVjdENoYWlucy5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAvLyB0aHJlYWQgbXV0ZXggaXMgbm90IGxvY2tlZCwgYnV0IGVmZmVjdCBjaGFpbiBpcyBsb2NrZWQKKyAgICAgICAgICAgIGVmZmVjdENoYWluc1tpXS0+cHJvY2Vzc19sKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQdXNoIGEgbmV3IGZhc3QgY2FwdHVyZSBzdGF0ZSBpZiBmYXN0IGNhcHR1cmUgaXMgbm90IGFscmVhZHkgcnVubmluZywgb3IgY2JsayBjaGFuZ2UKKyAgICAgICAgaWYgKG1GYXN0Q2FwdHVyZSAhPSAwKSB7CisgICAgICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlUXVldWUgKnNxID0gbUZhc3RDYXB0dXJlLT5zcSgpOworICAgICAgICAgICAgRmFzdENhcHR1cmVTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKKyAgICAgICAgICAgIGJvb2wgZGlkTW9kaWZ5ID0gZmFsc2U7CisgICAgICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlUXVldWU6OmJsb2NrX3QgYmxvY2sgPSBGYXN0Q2FwdHVyZVN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRDsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bUNvbW1hbmQgIT0gRmFzdENhcHR1cmVTdGF0ZTo6UkVBRF9XUklURSAvKiBGSVhNRSAmJgorICAgICAgICAgICAgICAgICAgICAoa1VzZUZhc3RNaXhlciAhPSBGYXN0TWl4ZXJfRHluYW1pYyB8fCBzdGF0ZS0+bVRyYWNrTWFzayA+IDEpKi8pIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPm1Db21tYW5kID09IEZhc3RDYXB0dXJlU3RhdGU6OkNPTERfSURMRSkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2luYygmbUZhc3RDYXB0dXJlRnV0ZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmbUZhc3RDYXB0dXJlRnV0ZXgsIEZVVEVYX1dBS0VfUFJJVkFURSwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdENhcHR1cmVTdGF0ZTo6UkVBRF9XUklURTsKKyNpZiAwICAgLy8gRklYTUUKKyAgICAgICAgICAgICAgICBtRmFzdENhcHR1cmVEdW1wU3RhdGUuaW5jcmVhc2VTYW1wbGluZ04obUF1ZGlvRmxpbmdlci0+aXNMb3dSYW1EZXZpY2UoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZTo6a1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA6IEZhc3RNaXhlckR1bXBTdGF0ZTo6a1NhbXBsaW5nTik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190ICpjYmxrT2xkID0gc3RhdGUtPm1DYmxrOworICAgICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190ICpjYmxrTmV3ID0gZmFzdFRyYWNrICE9IDAgPyBmYXN0VHJhY2stPmNibGsoKSA6IE5VTEw7CisgICAgICAgICAgICBpZiAoY2Jsa05ldyAhPSBjYmxrT2xkKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1DYmxrID0gY2Jsa05ldzsKKyAgICAgICAgICAgICAgICAvLyBibG9jayB1bnRpbCBhY2tlZCBpZiByZW1vdmluZyBhIGZhc3QgdHJhY2sKKyAgICAgICAgICAgICAgICBpZiAoY2Jsa09sZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gRmFzdENhcHR1cmVTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9BQ0tFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNxLT5lbmQoZGlkTW9kaWZ5KTsKKyAgICAgICAgICAgIGlmIChkaWRNb2RpZnkpIHsKKyAgICAgICAgICAgICAgICBzcS0+cHVzaChibG9jayk7CisjaWYgMAorICAgICAgICAgICAgICAgIGlmIChrVXNlRmFzdENhcHR1cmUgPT0gRmFzdENhcHR1cmVfRHluYW1pYykgeworICAgICAgICAgICAgICAgICAgICBtTm9ybWFsU291cmNlID0gbVBpcGVTb3VyY2U7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgcnVuIHRoZSBmYXN0IHRyYWNrIGRlc3RydWN0b3Igd2l0aCB0aHJlYWQgbXV0ZXggdW5sb2NrZWQKKyAgICAgICAgZmFzdFRyYWNrVG9SZW1vdmUuY2xlYXIoKTsKKworICAgICAgICAvLyBSZWFkIGZyb20gSEFMIHRvIGtlZXAgdXAgd2l0aCBmYXN0ZXN0IGNsaWVudCBpZiBtdWx0aXBsZSBhY3RpdmUgdHJhY2tzLCBub3Qgc2xvd2VzdCBvbmUuCisgICAgICAgIC8vIE9ubHkgdGhlIGNsaWVudChzKSB0aGF0IGFyZSB0b28gc2xvdyB3aWxsIG92ZXJydW4uIEJ1dCBpZiBldmVuIHRoZSBmYXN0ZXN0IGNsaWVudCBpcyB0b28KKyAgICAgICAgLy8gc2xvdywgdGhlbiB0aGlzIFJlY29yZFRocmVhZCB3aWxsIG92ZXJydW4gYnkgbm90IGNhbGxpbmcgSEFMIHJlYWQgb2Z0ZW4gZW5vdWdoLgorICAgICAgICAvLyBJZiBkZXN0aW5hdGlvbiBpcyBub24tY29udGlndW91cywgZmlyc3QgcmVhZCBwYXN0IHRoZSBub21pbmFsIGVuZCBvZiBidWZmZXIsIHRoZW4KKyAgICAgICAgLy8gY29weSB0byB0aGUgcmlnaHQgcGxhY2UuICBQZXJtaXR0ZWQgYmVjYXVzZSBtUnNtcEluQnVmZmVyIHdhcyBvdmVyLWFsbG9jYXRlZC4KKworICAgICAgICBpbnQzMl90IHJlYXIgPSBtUnNtcEluUmVhciAmIChtUnNtcEluRnJhbWVzUDIgLSAxKTsKKyAgICAgICAgc3NpemVfdCBmcmFtZXNSZWFkOworCisgICAgICAgIC8vIElmIGFuIE5CQUlPIHNvdXJjZSBpcyBwcmVzZW50LCB1c2UgaXQgdG8gcmVhZCB0aGUgbm9ybWFsIGNhcHR1cmUncyBkYXRhCisgICAgICAgIGlmIChtUGlwZVNvdXJjZSAhPSAwKSB7CisgICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9SZWFkID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOworICAgICAgICAgICAgZnJhbWVzUmVhZCA9IG1QaXBlU291cmNlLT5yZWFkKCZtUnNtcEluQnVmZmVyW3JlYXIgKiBtQ2hhbm5lbENvdW50XSwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzVG9SZWFkLCBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyk7CisgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gc2luY2UgcGlwZSBpcyBub24tYmxvY2tpbmcsIHNpbXVsYXRlIGJsb2NraW5nIGlucHV0CisgICAgICAgICAgICAgICAgc2xlZXBVcyA9IChmcmFtZXNUb1JlYWQgKiAxMDAwMDAwTEwpIC8gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIEhBTCAvIEF1ZGlvU3RyZWFtSW4gZGlyZWN0bHkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gbUlucHV0LT5zdHJlYW0tPnJlYWQobUlucHV0LT5zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICZtUnNtcEluQnVmZmVyW3JlYXIgKiBtQ2hhbm5lbENvdW50XSwgbUJ1ZmZlclNpemUpOworICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKKyAgICAgICAgICAgICAgICBmcmFtZXNSZWFkID0gYnl0ZXNSZWFkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcmFtZXNSZWFkID0gYnl0ZXNSZWFkIC8gbUZyYW1lU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmcmFtZXNSZWFkIDwgMCB8fCAoZnJhbWVzUmVhZCA9PSAwICYmIG1QaXBlU291cmNlID09IDApKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCBmYWlsZWQ6IGZyYW1lc1JlYWQ9JWQiLCBmcmFtZXNSZWFkKTsKKyAgICAgICAgICAgIC8vIEZvcmNlIGlucHV0IGludG8gc3RhbmRieSBzbyB0aGF0IGl0IHRyaWVzIHRvIHJlY292ZXIgYXQgbmV4dCByZWFkIGF0dGVtcHQKKyAgICAgICAgICAgIGlucHV0U3RhbmRCeSgpOworICAgICAgICAgICAgc2xlZXBVcyA9IGtSZWNvcmRUaHJlYWRTbGVlcFVzOworICAgICAgICB9CisgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgIGdvdG8gdW5sb2NrOworICAgICAgICB9CisgICAgICAgIEFMT0dfQVNTRVJUKGZyYW1lc1JlYWQgPiAwKTsKKworICAgICAgICBpZiAobVRlZVNpbmsgIT0gMCkgeworICAgICAgICAgICAgKHZvaWQpIG1UZWVTaW5rLT53cml0ZSgmbVJzbXBJbkJ1ZmZlcltyZWFyICogbUNoYW5uZWxDb3VudF0sIGZyYW1lc1JlYWQpOworICAgICAgICB9CisgICAgICAgIC8vIElmIGRlc3RpbmF0aW9uIGlzIG5vbi1jb250aWd1b3VzLCB3ZSBub3cgY29ycmVjdCBmb3IgcmVhZGluZyBwYXN0IGVuZCBvZiBidWZmZXIuCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCBwYXJ0MSA9IG1Sc21wSW5GcmFtZXNQMiAtIHJlYXI7CisgICAgICAgICAgICBpZiAoKHNpemVfdCkgZnJhbWVzUmVhZCA+IHBhcnQxKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1Sc21wSW5CdWZmZXIsICZtUnNtcEluQnVmZmVyW21Sc21wSW5GcmFtZXNQMiAqIG1DaGFubmVsQ291bnRdLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lc1JlYWQgLSBwYXJ0MSkgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZWFyID0gbVJzbXBJblJlYXIgKz0gZnJhbWVzUmVhZDsKKworICAgICAgICBzaXplID0gYWN0aXZlVHJhY2tzLnNpemUoKTsKKyAgICAgICAgLy8gbG9vcCBvdmVyIGVhY2ggYWN0aXZlIHRyYWNrCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBhY3RpdmVUcmFjayA9IGFjdGl2ZVRyYWNrc1tpXTsKKworICAgICAgICAgICAgLy8gc2tpcCBmYXN0IHRyYWNrcywgYXMgdGhvc2UgYXJlIGhhbmRsZWQgZGlyZWN0bHkgYnkgRmFzdENhcHR1cmUKKyAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+aXNGYXN0VHJhY2soKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RDaGFpbnMuc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q2hhaW5zW2ldLT5wcm9jZXNzX2woKTsKLSAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYnVmZmVyLmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZWFkT25jZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc091dCA9IGJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgIGlmIChtUmVzYW1wbGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGVudW0geworICAgICAgICAgICAgICAgIE9WRVJSVU5fVU5LTk9XTiwKKyAgICAgICAgICAgICAgICBPVkVSUlVOX1RSVUUsCisgICAgICAgICAgICAgICAgT1ZFUlJVTl9GQUxTRQorICAgICAgICAgICAgfSBvdmVycnVuID0gT1ZFUlJVTl9VTktOT1dOOworCisgICAgICAgICAgICAvLyBsb29wIG92ZXIgZ2V0TmV4dEJ1ZmZlciB0byBoYW5kbGUgY2lyY3VsYXIgc2luaworICAgICAgICAgICAgZm9yICg7OykgeworCisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TaW5rLmZyYW1lQ291bnQgPSB+MDsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigmYWN0aXZlVHJhY2stPm1TaW5rKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1TaW5rLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoc3RhdHVzID09IE9LKSAhPSAoZnJhbWVzT3V0ID4gMCkpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBmcm9udCA9IGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQ7CisgICAgICAgICAgICAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc0luOworCisgICAgICAgICAgICAgICAgaWYgKGZpbGxlZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCB0cmVhdCBsaWtlIGEgbWFzc2l2ZSBvdmVycnVuIGFuZCByZS1zeW5jCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udCA9IHJlYXI7CisgICAgICAgICAgICAgICAgICAgIG92ZXJydW4gPSBPVkVSUlVOX1RSVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoc2l6ZV90KSBmaWxsZWQgPD0gbVJzbXBJbkZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IChzaXplX3QpIGZpbGxlZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgaXMgbm90IGtlZXBpbmcgdXAgd2l0aCBzZXJ2ZXIsIGJ1dCBnaXZlIGl0IGxhdGVzdCBkYXRhCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gbVJzbXBJbkZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udCA9IGZyb250ID0gcmVhciAtIGZyYW1lc0luOworICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPT0gMCB8fCBmcmFtZXNJbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bVJlc2FtcGxlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc2FtcGxpbmcKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZyYW1lc091dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc0luID0gbUZyYW1lQ291bnQgLSBtUnNtcEluSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzSW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnNyYyA9IChpbnQ4X3QgKiltUnNtcEluQnVmZmVyICsgbVJzbXBJbkluZGV4ICogbUZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKmRzdCA9IGJ1ZmZlci5pOCArIChidWZmZXIuZnJhbWVDb3VudCAtIGZyYW1lc091dCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5tRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNJbiA+IGZyYW1lc091dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSBmcmFtZXNPdXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkluZGV4ICs9IGZyYW1lc0luOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCAtPSBmcmFtZXNJbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSBtUmVxQ2hhbm5lbENvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgZnJhbWVzSW4gKiBtRnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cG1peF90b19zdGVyZW9faTE2X2Zyb21fbW9ub19pMTYoKGludDE2X3QgKilkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopc3JjLCBmcmFtZXNJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4X3RvX21vbm9faTE2X2Zyb21fc3RlcmVvX2kxNigoaW50MTZfdCAqKWRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKilzcmMsIGZyYW1lc0luKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgJiYgbUZyYW1lQ291bnQgPT0gbVJzbXBJbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVhZEludG87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA9PSBtRnJhbWVDb3VudCAmJiBtQ2hhbm5lbENvdW50ID09IG1SZXFDaGFubmVsQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEludG8gPSBidWZmZXIucmF3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRJbnRvID0gbVJzbXBJbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVhZCA9IG1JbnB1dC0+c3RyZWFtLT5yZWFkKG1JbnB1dC0+c3RyZWFtLCByZWFkSW50bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ5dGVzUmVhZCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobUJ5dGVzUmVhZCA8IDApICYmIChtQWN0aXZlVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OkFDVElWRSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciByZWFkaW5nIGF1ZGlvIGlucHV0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSBpbnB1dCBpbnRvIHN0YW5kYnkgc28gdGhhdCBpdCB0cmllcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlciBhdCBuZXh0IHJlYWQgYXR0ZW1wdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2xlZXAoa1JlY29yZFRocmVhZFNsZWVwVXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5JbmRleCA9IG1GcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobVRlZVNpbmsgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgbVRlZVNpbmstPndyaXRlKHJlYWRJbnRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlYWQgPj4gRm9ybWF0X2ZyYW1lQml0U2hpZnQobVRlZVNpbmstPmZvcm1hdCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNJbiA+IGZyYW1lc091dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBmcmFtZXNJbjsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKmRzdCA9IGFjdGl2ZVRyYWNrLT5tU2luay5pODsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZyYW1lc0luID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnQgJj0gbVJzbXBJbkZyYW1lc1AyIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYXJ0MSA9IG1Sc21wSW5GcmFtZXNQMiAtIGZyb250OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQxID4gZnJhbWVzSW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0MSA9IGZyYW1lc0luOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICpzcmMgPSAoaW50OF90ICopbVJzbXBJbkJ1ZmZlciArIChmcm9udCAqIG1GcmFtZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gYWN0aXZlVHJhY2stPm1DaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHBhcnQxICogbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1DaGFubmVsQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbWl4X3RvX3N0ZXJlb19pMTZfZnJvbV9tb25vX2kxNigoaW50MTZfdCAqKWRzdCwgKGNvbnN0IGludDE2X3QgKilzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0MSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhfdG9fbW9ub19pMTZfZnJvbV9zdGVyZW9faTE2KChpbnQxNl90ICopZHN0LCAoY29uc3QgaW50MTZfdCAqKXNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArPSBwYXJ0MSAqIGFjdGl2ZVRyYWNrLT5tRnJhbWVTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnQgKz0gcGFydDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiAtPSBwYXJ0MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ICs9IGZyYW1lc091dDsKKwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgZnJhbWVzSW5OZWVkZWQgc2hvdWxkIHJlYWxseSBiZSBwYXJ0IG9mIHJlc2FtcGxlciBBUEksIGFuZCBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgZGVwZW5kIG9uIHRoZSBTUkMgcmF0aW8KKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgdG8ga2VlcCBtUnNtcEluQnVmZmVyIGZ1bGwgc28gcmVzYW1wbGVyIGFsd2F5cyBoYXMgc3VmZmljaWVudCBpbnB1dAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzSW5OZWVkZWQ7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG9ubHkgcmUtY2FsY3VsYXRlIHdoZW4gaXQgY2hhbmdlcywgYW5kIG9wdGltaXplIGZvciBjb21tb24gcmF0aW9zCisgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBwcmVjb21wdXRlIGluL291dCBiZWNhdXNlIGZsb2F0aW5nIHBvaW50IGlzIG5vdCBhc3NvY2lhdGl2ZQorICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIGEqYi9jICE9IGEqKGIvYykuCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBpbihtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBvdXQoYWN0aXZlVHJhY2stPm1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW5OZWVkZWQgPSBjZWlsKGZyYW1lc091dCAqIGluIC8gb3V0KSArIDE7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJuZWVkICV1IGZyYW1lcyBpbiB0byBwcm9kdWNlICV1IG91dCBnaXZlbiBpbi9vdXQgcmF0aW8gb2YgJS40ZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luTmVlZGVkLCBmcmFtZXNPdXQsIGluIC8gb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWx0aG91Z2ggd2UgdGhlb3JldGljYWxseSBoYXZlIGZyYW1lc0luIGluIGNpcmN1bGFyIGJ1ZmZlciwgc29tZSBvZiB0aG9zZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gdW5yZWxlYXNlZCBmcmFtZXMsIGFuZCB0aHVzIG11c3QgYmUgZGlzY291bnRlZCBmb3IgcHVycG9zZSBvZiBidWRnZXRpbmcuCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1bnJlbGVhc2VkID0gYWN0aXZlVHJhY2stPm1Sc21wSW5VbnJlbDsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSBmcmFtZXNJbiA+IHVucmVsZWFzZWQgPyBmcmFtZXNJbiAtIHVucmVsZWFzZWQgOiAwOworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzSW4gPCBmcmFtZXNJbk5lZWRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5vdCBlbm91Z2ggdG8gcmVzYW1wbGU6IGhhdmUgJXUgZnJhbWVzIGluIGJ1dCBuZWVkICV1IGluIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2R1Y2UgJXUgb3V0IGdpdmVuIGluL291dCByYXRpbyBvZiAlLjRnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIGZyYW1lc0luTmVlZGVkLCBmcmFtZXNPdXQsIGluIC8gb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuZXdGcmFtZXNPdXQgPSBmcmFtZXNJbiA+IDAgPyBmbG9vcigoZnJhbWVzSW4gLSAxKSAqIG91dCAvIGluKSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5ld0ZyYW1lc091dCA+PSBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0ZyYW1lc091dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbk5lZWRlZCA9IGNlaWwobmV3RnJhbWVzT3V0ICogaW4gLyBvdXQpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJub3cgbmVlZCAldSBmcmFtZXMgaW4gdG8gcHJvZHVjZSAldSBvdXQgZ2l2ZW4gb3V0L2luIHJhdGlvIG9mICUuNGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbk5lZWRlZCwgbmV3RnJhbWVzT3V0LCBvdXQgLyBpbik7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGZyYW1lc0luIDwgZnJhbWVzSW5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN1Y2Nlc3MgMjogaGF2ZSAldSBmcmFtZXMgaW4gYW5kIG5lZWQgJXUgaW4gdG8gcHJvZHVjZSAldSBvdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdpdmVuIGluL291dCByYXRpbyBvZiAlLjRnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBmcmFtZXNJbk5lZWRlZCwgbmV3RnJhbWVzT3V0LCBpbiAvIG91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBuZXdGcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigic3VjY2VzcyAxOiBoYXZlICV1IGluIGFuZCBuZWVkICV1IGluIHRvIHByb2R1Y2UgJXUgb3V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBmcmFtZXNJbk5lZWRlZCwgZnJhbWVzT3V0LCBpbiAvIG91dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyByZWFsbG9jYXRlIG1Sc21wT3V0QnVmZmVyIGFzIG5lZWRlZDsgd2Ugd2lsbCBncm93IGJ1dCBuZXZlciBzaHJpbmsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tUnNtcE91dEZyYW1lQ291bnQgPCBmcmFtZXNPdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHdoeSBkb2VzIGVhY2ggdHJhY2sgbmVlZCBpdCdzIG93biBtUnNtcE91dEJ1ZmZlcj8gY2FuJ3QgdGhleSBzaGFyZT8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2FtcGxlciBhbHdheXMgb3V0cHV0cyBzdGVyZW8KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciA9IG5ldyBpbnQzMl90W2ZyYW1lc091dCAqIEZDQ18yXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcE91dEZyYW1lQ291bnQgPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyByZXNhbXBsZXIgYWNjdW11bGF0ZXMsIGJ1dCB3ZSBvbmx5IGhhdmUgb25lIHNvdXJjZSB0cmFjawotICAgICAgICAgICAgICAgICAgICBtZW1zZXQobVJzbXBPdXRCdWZmZXIsIDAsIGZyYW1lc091dCAqIEZDQ18yICogc2l6ZW9mKGludDMyX3QpKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYWx0ZXIgb3V0cHV0IGZyYW1lIGNvdW50IGFzIGlmIHdlIHdlcmUgZXhwZWN0aW5nIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEgJiYgbVJlcUNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPj49IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVJlc2FtcGxlci0+cmVzYW1wbGUobVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIC8qIEF1ZGlvQnVmZmVyUHJvdmlkZXIqICovKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgMCwgZnJhbWVzT3V0ICogRkNDXzIgKiBzaXplb2YoaW50MzJfdCkpOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlci0+cmVzYW1wbGUoYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgaG93IGFib3V0IGhhdmluZyBhY3RpdmVUcmFjayBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaXRzZWxmPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoaXMqLyAvKiBBdWRpb0J1ZmZlclByb3ZpZGVyKiAqLyk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGRpdGhlckFuZENsYW1wKCkgd29ya3MgYXMgbG9uZyBhcyBhbGwgYnVmZmVycyByZXR1cm5lZCBieQotICAgICAgICAgICAgICAgICAgICAvLyBtQWN0aXZlVHJhY2stPmdldE5leHRCdWZmZXIoKSBhcmUgMzIgYml0IGFsaWduZWQgd2hpY2ggc2hvdWxkIGJlIGFsd2F5cyB0cnVlLgotICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAyICYmIG1SZXFDaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcG9yYXJpbHkgdHlwZSBwdW4gbVJzbXBPdXRCdWZmZXIgZnJvbSBRMTkuMTIgdG8gaW50MTZfdAotICAgICAgICAgICAgICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAobVJzbXBPdXRCdWZmZXIsIG1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgICAgICAvLyBhY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigpIGFyZSAzMiBiaXQgYWxpZ25lZCB3aGljaCBzaG91bGQgYmUgYWx3YXlzIHRydWUuCisgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUNoYW5uZWxDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wb3JhcmlseSB0eXBlIHB1biBtUnNtcE91dEJ1ZmZlciBmcm9tIFE0LjI3IHRvIGludDE2X3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc2FtcGxlciBhbHdheXMgb3V0cHV0cyBzdGVyZW8gc2FtcGxlczoKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHBvc3Qgc3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peF90b19tb25vX2kxNl9mcm9tX3N0ZXJlb19pMTYoYnVmZmVyLmkxNiwgKGludDE2X3QgKiltUnNtcE91dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhfdG9fbW9ub19pMTZfZnJvbV9zdGVyZW9faTE2KGFjdGl2ZVRyYWNrLT5tU2luay5pMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAoKGludDMyX3QgKilidWZmZXIucmF3LCBtUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKChpbnQzMl90ICopYWN0aXZlVHJhY2stPm1TaW5rLnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBkb25lIHdpdGggbVJzbXBPdXRCdWZmZXIKIAogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUZyYW1lc3RvRHJvcCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+cmVsZWFzZUJ1ZmZlcigmYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPiAwICYmIChvdmVycnVuID09IE9WRVJSVU5fVU5LTk9XTikpIHsKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1biA9IE9WRVJSVU5fRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU2luay5mcmFtZUNvdW50ID0gZnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPnJlbGVhc2VCdWZmZXIoJmFjdGl2ZVRyYWNrLT5tU2luayk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobUZyYW1lc3RvRHJvcCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXN0b0Ryb3AgLT0gYnVmZmVyLmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZyYW1lc3RvRHJvcCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBjb3VsZCBkbyBhIHBhcnRpYWwgZHJvcCBvZiBmcmFtZXNPdXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgLT0gZnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc3RvRHJvcCArPSBidWZmZXIuZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRnJhbWVzdG9Ecm9wID49IDAgfHwgbVN5bmNTdGFydEV2ZW50ID09IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNTdGFydEV2ZW50LT5pc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCArPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgPj0gMCB8fCBhY3RpdmVUcmFjay0+bVN5bmNTdGFydEV2ZW50ID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TeW5jU3RhcnRFdmVudC0+aXNDYW5jZWxsZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJTeW5jZWQgcmVjb3JkICVzLCBzZXNzaW9uICVkLCB0cmlnZ2VyIHNlc3Npb24gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtRnJhbWVzdG9Ecm9wID49IDApID8gInRpbWVkIG91dCIgOiAiY2FuY2VsbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPnNlc3Npb25JZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU3luY1N0YXJ0RXZlbnQgIT0gMCkgPyBtU3luY1N0YXJ0RXZlbnQtPnRyaWdnZXJTZXNzaW9uKCkgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wID49IDApID8gInRpbWVkIG91dCIgOiAiY2FuY2VsbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+c2Vzc2lvbklkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGl2ZVRyYWNrLT5tU3luY1N0YXJ0RXZlbnQgIT0gMCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TeW5jU3RhcnRFdmVudC0+dHJpZ2dlclNlc3Npb24oKSA6IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5jbGVhck92ZXJmbG93KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2xpZW50IGlzbid0IHJldHJpZXZpbmcgYnVmZmVycyBmYXN0IGVub3VnaAotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQWN0aXZlVHJhY2stPnNldE92ZXJmbG93KCkpIHsKKworICAgICAgICAgICAgc3dpdGNoIChvdmVycnVuKSB7CisgICAgICAgICAgICBjYXNlIE9WRVJSVU5fVFJVRToKKyAgICAgICAgICAgICAgICAvLyBjbGllbnQgaXNuJ3QgcmV0cmlldmluZyBidWZmZXJzIGZhc3QgZW5vdWdoCisgICAgICAgICAgICAgICAgaWYgKCFhY3RpdmVUcmFjay0+c2V0T3ZlcmZsb3coKSkgewogICAgICAgICAgICAgICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIGxhc3RXYXJuaW5nIHBlciB0cmFjaz8KICAgICAgICAgICAgICAgICAgICAgaWYgKChub3cgLSBsYXN0V2FybmluZykgPiBrV2FybmluZ1Rocm90dGxlTnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJSZWNvcmRUaHJlYWQ6IGJ1ZmZlciBvdmVyZmxvdyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhcm5pbmcgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgcHJvY2Vzc29yIGZvciBhIHdoaWxlIGJlZm9yZSBhc2tpbmcgZm9yIGEgbmV3IGJ1ZmZlci4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZ2l2ZSB0aGUgYXBwbGljYXRpb24gbW9yZSBjaGFuY2UgdG8gcmVhZCBmcm9tIHRoZSBidWZmZXIgYW5kCi0gICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIG92ZXJmbG93LgotICAgICAgICAgICAgICAgIHVzbGVlcChrUmVjb3JkVGhyZWFkU2xlZXBVcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9WRVJSVU5fRkFMU0U6CisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPmNsZWFyT3ZlcmZsb3coKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1ZFUlJVTl9VTktOT1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorCiAgICAgICAgIH0KKwordW5sb2NrOgogICAgICAgICAvLyBlbmFibGUgY2hhbmdlcyBpbiBlZmZlY3QgY2hhaW4KICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7Ci0gICAgICAgIGVmZmVjdENoYWlucy5jbGVhcigpOworICAgICAgICAvLyBlZmZlY3RDaGFpbnMgZG9lc24ndCBuZWVkIHRvIGJlIGNsZWFyZWQsIHNpbmNlIGl0IGlzIGNsZWFyZWQgYnkgZGVzdHJ1Y3RvciBhdCBzY29wZSBlbmQKICAgICB9CiAKLSAgICBzdGFuZGJ5KCk7CisgICAgc3RhbmRieUlmTm90QWxyZWFkeUluU3RhbmRieSgpOwogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtNDY0MCw3ICs1NDgwLDggQEAKICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICB0cmFjay0+aW52YWxpZGF0ZSgpOwogICAgICAgICB9Ci0gICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOworICAgICAgICBtQWN0aXZlVHJhY2tzLmNsZWFyKCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NHZW4rKzsKICAgICAgICAgbVN0YXJ0U3RvcENvbmQuYnJvYWRjYXN0KCk7CiAgICAgfQogCkBAIC00NjUwLDcgKzU0OTEsNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3RhbmRieSgpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCkKIHsKICAgICBpZiAoIW1TdGFuZGJ5KSB7CiAgICAgICAgIGlucHV0U3RhbmRCeSgpOwpAQCAtNDY2MCw5MSArNTUwMSwxMzAgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aW5wdXRTdGFuZEJ5KCkKIHsKKyAgICAvLyBJZGxlIHRoZSBmYXN0IGNhcHR1cmUgaWYgaXQncyBjdXJyZW50bHkgcnVubmluZworICAgIGlmIChtRmFzdENhcHR1cmUgIT0gMCkgeworICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlUXVldWUgKnNxID0gbUZhc3RDYXB0dXJlLT5zcSgpOworICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOworICAgICAgICBpZiAoIShzdGF0ZS0+bUNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpJRExFKSkgeworICAgICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdENhcHR1cmVTdGF0ZTo6Q09MRF9JRExFOworICAgICAgICAgICAgc3RhdGUtPm1Db2xkRnV0ZXhBZGRyID0gJm1GYXN0Q2FwdHVyZUZ1dGV4OworICAgICAgICAgICAgc3RhdGUtPm1Db2xkR2VuKys7CisgICAgICAgICAgICBtRmFzdENhcHR1cmVGdXRleCA9IDA7CisgICAgICAgICAgICBzcS0+ZW5kKCk7CisgICAgICAgICAgICAvLyBCTE9DS19VTlRJTF9QVVNIRUQgd291bGQgYmUgaW5zdWZmaWNpZW50LCBhcyB3ZSBuZWVkIGl0IHRvIHN0b3AgZG9pbmcgSS9PIG5vdworICAgICAgICAgICAgc3EtPnB1c2goRmFzdENhcHR1cmVTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9BQ0tFRCk7CisjaWYgMAorICAgICAgICAgICAgaWYgKGtVc2VGYXN0Q2FwdHVyZSA9PSBGYXN0Q2FwdHVyZV9EeW5hbWljKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUUKKyAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmZGVmIEFVRElPX1dBVENIRE9HCisgICAgICAgICAgICAvLyBGSVhNRQorI2VuZGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcS0+ZW5kKGZhbHNlIC8qZGlkTW9kaWZ5Ki8pOworICAgICAgICB9CisgICAgfQogICAgIG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CiB9CiAKLXNwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpjcmVhdGVSZWNvcmRUcmFja19sKAorLy8gUmVjb3JkVGhyZWFkOjpjcmVhdGVSZWNvcmRUcmFja19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKK3NwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNyZWF0ZVJlY29yZFRyYWNrX2woCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGludCB1aWQsCiAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiB7CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAqcEZyYW1lQ291bnQ7CiAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrOwogICAgIHN0YXR1c190IGxTdGF0dXM7CiAKKyAgICAvLyBjbGllbnQgZXhwcmVzc2VzIGEgcHJlZmVyZW5jZSBmb3IgRkFTVCwgYnV0IHdlIGdldCB0aGUgZmluYWwgc2F5CisgICAgaWYgKCpmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKKyAgICAgIGlmICgKKyAgICAgICAgICAgIC8vIHVzZSBjYXNlOiBjYWxsYmFjayBoYW5kbGVyCisgICAgICAgICAgICAodGlkICE9IC0xKSAmJgorICAgICAgICAgICAgLy8gZnJhbWUgY291bnQgaXMgbm90IHNwZWNpZmllZCwgb3IgaXMgZXhhY3RseSB0aGUgcGlwZSBkZXB0aAorICAgICAgICAgICAgKChmcmFtZUNvdW50ID09IDApIHx8IChmcmFtZUNvdW50ID09IG1QaXBlRnJhbWVzUDIpKSAmJgorICAgICAgICAgICAgLy8gUENNIGRhdGEKKyAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJgorICAgICAgICAgICAgLy8gbmF0aXZlIGZvcm1hdAorICAgICAgICAgICAgKGZvcm1hdCA9PSBtRm9ybWF0KSAmJgorICAgICAgICAgICAgLy8gbmF0aXZlIGNoYW5uZWwgbWFzaworICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IG1DaGFubmVsTWFzaykgJiYKKyAgICAgICAgICAgIC8vIG5hdGl2ZSBoYXJkd2FyZSBzYW1wbGUgcmF0ZQorICAgICAgICAgICAgKHNhbXBsZVJhdGUgPT0gbVNhbXBsZVJhdGUpICYmCisgICAgICAgICAgICAvLyByZWNvcmQgdGhyZWFkIGhhcyBhbiBhc3NvY2lhdGVkIGZhc3QgY2FwdHVyZQorICAgICAgICAgICAgaGFzRmFzdENhcHR1cmUoKSAmJgorICAgICAgICAgICAgLy8gdGhlcmUgYXJlIHN1ZmZpY2llbnQgZmFzdCB0cmFjayBzbG90cyBhdmFpbGFibGUKKyAgICAgICAgICAgIG1GYXN0VHJhY2tBdmFpbAorICAgICAgICApIHsKKyAgICAgICAgQUxPR1YoIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBhY2NlcHRlZDogZnJhbWVDb3VudD0ldSBtRnJhbWVDb3VudD0ldSIsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQ6IGZyYW1lQ291bnQ9JXUgbUZyYW1lQ291bnQ9JXUgbVBpcGVGcmFtZXNQMj0ldSAiCisgICAgICAgICAgICAgICAgImZvcm1hdD0lI3ggaXNMaW5lYXI9JWQgY2hhbm5lbE1hc2s9JSN4IHNhbXBsZVJhdGU9JXUgbVNhbXBsZVJhdGU9JXUgIgorICAgICAgICAgICAgICAgICJoYXNGYXN0Q2FwdHVyZT0lZCB0aWQ9JWQgbUZhc3RUcmFja0F2YWlsPSVkIiwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtRnJhbWVDb3VudCwgbVBpcGVGcmFtZXNQMiwKKyAgICAgICAgICAgICAgICBmb3JtYXQsIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSwgY2hhbm5lbE1hc2ssIHNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIGhhc0Zhc3RDYXB0dXJlKCksIHRpZCwgbUZhc3RUcmFja0F2YWlsKTsKKyAgICAgICAgKmZsYWdzICY9IH5JQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOworICAgICAgfQorICAgIH0KKworICAgIC8vIGNvbXB1dGUgdHJhY2sgYnVmZmVyIHNpemUgaW4gZnJhbWVzLCBhbmQgc3VnZ2VzdCB0aGUgbm90aWZpY2F0aW9uIGZyYW1lIGNvdW50CisgICAgaWYgKCpmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKKyAgICAgICAgLy8gZmFzdCB0cmFjazogZnJhbWUgY291bnQgaXMgZXhhY3RseSB0aGUgcGlwZSBkZXB0aAorICAgICAgICBmcmFtZUNvdW50ID0gbVBpcGVGcmFtZXNQMjsKKyAgICAgICAgLy8gaWdub3JlIHJlcXVlc3RlZCBub3RpZmljYXRpb25GcmFtZXMsIGFuZCBhbHdheXMgbm90aWZ5IGV4YWN0bHkgb25jZSBldmVyeSBIQUwgYnVmZmVyCisgICAgICAgICpub3RpZmljYXRpb25GcmFtZXMgPSBtRnJhbWVDb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBub3QgZmFzdCB0cmFjazogbWF4IG5vdGlmaWNhdGlvbiBwZXJpb2QgaXMgcmVzYW1wbGVkIGVxdWl2YWxlbnQgb2Ygb25lIEhBTCBidWZmZXIgdGltZQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgb3IgMjAgbXMgaWYgdGhlcmUgaXMgYSBmYXN0IGNhcHR1cmUKKyAgICAgICAgLy8gVE9ETyBUaGlzIGNvdWxkIGJlIGEgcm91bmR1cFJhdGlvIGlubGluZSwgYW5kIGNvbnN0CisgICAgICAgIHNpemVfdCBtYXhOb3RpZmljYXRpb25GcmFtZXMgPSAoKGludDY0X3QpIChoYXNGYXN0Q2FwdHVyZSgpID8gbVNhbXBsZVJhdGUvNTAgOiBtRnJhbWVDb3VudCkKKyAgICAgICAgICAgICAgICAqIHNhbXBsZVJhdGUgKyBtU2FtcGxlUmF0ZSAtIDEpIC8gbVNhbXBsZVJhdGU7CisgICAgICAgIC8vIG1pbmltdW0gbnVtYmVyIG9mIG5vdGlmaWNhdGlvbiBwZXJpb2RzIGlzIGF0IGxlYXN0IGtNaW5Ob3RpZmljYXRpb25zLAorICAgICAgICAvLyBhbmQgYXQgbGVhc3Qga01pbk1zIHJvdW5kZWQgdXAgdG8gYSB3aG9sZSBub3RpZmljYXRpb24gcGVyaW9kIChtaW5Ob3RpZmljYXRpb25zQnlNcykKKyAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWluTm90aWZpY2F0aW9ucyA9IDM7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWluTXMgPSAzMDsKKyAgICAgICAgLy8gVE9ETyBUaGlzIGNvdWxkIGJlIGEgcm91bmR1cFJhdGlvIGlubGluZQorICAgICAgICBjb25zdCBzaXplX3QgbWluRnJhbWVzQnlNcyA9IChzYW1wbGVSYXRlICoga01pbk1zICsgMTAwMCAtIDEpIC8gMTAwMDsKKyAgICAgICAgLy8gVE9ETyBUaGlzIGNvdWxkIGJlIGEgcm91bmR1cFJhdGlvIGlubGluZQorICAgICAgICBjb25zdCBzaXplX3QgbWluTm90aWZpY2F0aW9uc0J5TXMgPSAobWluRnJhbWVzQnlNcyArIG1heE5vdGlmaWNhdGlvbkZyYW1lcyAtIDEpIC8KKyAgICAgICAgICAgICAgICBtYXhOb3RpZmljYXRpb25GcmFtZXM7CisgICAgICAgIGNvbnN0IHNpemVfdCBtaW5GcmFtZUNvdW50ID0gbWF4Tm90aWZpY2F0aW9uRnJhbWVzICoKKyAgICAgICAgICAgICAgICBtYXgoa01pbk5vdGlmaWNhdGlvbnMsIG1pbk5vdGlmaWNhdGlvbnNCeU1zKTsKKyAgICAgICAgZnJhbWVDb3VudCA9IG1heChmcmFtZUNvdW50LCBtaW5GcmFtZUNvdW50KTsKKyAgICAgICAgaWYgKCpub3RpZmljYXRpb25GcmFtZXMgPT0gMCB8fCAqbm90aWZpY2F0aW9uRnJhbWVzID4gbWF4Tm90aWZpY2F0aW9uRnJhbWVzKSB7CisgICAgICAgICAgICAqbm90aWZpY2F0aW9uRnJhbWVzID0gbWF4Tm90aWZpY2F0aW9uRnJhbWVzOworICAgICAgICB9CisgICAgfQorICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisKICAgICBsU3RhdHVzID0gaW5pdENoZWNrKCk7CiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZFRyYWNrX2woKSBhdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkIik7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9Ci0gICAgLy8gY2xpZW50IGV4cHJlc3NlcyBhIHByZWZlcmVuY2UgZm9yIEZBU1QsIGJ1dCB3ZSBnZXQgdGhlIGZpbmFsIHNheQotICAgIGlmICgqZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7Ci0gICAgICBpZiAoCi0gICAgICAgICAgICAvLyB1c2UgY2FzZTogY2FsbGJhY2sgaGFuZGxlciBhbmQgZnJhbWUgY291bnQgaXMgZGVmYXVsdCBvciBhdCBsZWFzdCBhcyBsYXJnZSBhcyBIQUwKLSAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAodGlkICE9IC0xKSAmJgotICAgICAgICAgICAgICAgICgoZnJhbWVDb3VudCA9PSAwKSB8fAotICAgICAgICAgICAgICAgIChmcmFtZUNvdW50ID49IG1GcmFtZUNvdW50KSkKLSAgICAgICAgICAgICkgJiYKLSAgICAgICAgICAgIC8vIEZJWE1FIHdoZW4gcmVjb3JkIHN1cHBvcnRzIG5vbi1QQ00gZGF0YSwgYWxzbyBjaGVjayBmb3IgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCi0gICAgICAgICAgICAvLyBtb25vIG9yIHN0ZXJlbwotICAgICAgICAgICAgKCAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgfHwKLSAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgKSAmJgotICAgICAgICAgICAgLy8gaGFyZHdhcmUgc2FtcGxlIHJhdGUKLSAgICAgICAgICAgIChzYW1wbGVSYXRlID09IG1TYW1wbGVSYXRlKSAmJgotICAgICAgICAgICAgLy8gcmVjb3JkIHRocmVhZCBoYXMgYW4gYXNzb2NpYXRlZCBmYXN0IHJlY29yZGVyCi0gICAgICAgICAgICBoYXNGYXN0UmVjb3JkZXIoKQotICAgICAgICAgICAgLy8gRklYTUUgdGVzdCB0aGF0IFJlY29yZFRocmVhZCBmb3IgdGhpcyBmYXN0IHRyYWNrIGhhcyBhIGNhcGFibGUgb3V0cHV0IEhBTAotICAgICAgICAgICAgLy8gRklYTUUgYWRkIGEgcGVybWlzc2lvbiB0ZXN0IGFsc28/Ci0gICAgICAgICkgewotICAgICAgICAvLyBpZiBmcmFtZUNvdW50IG5vdCBzcGVjaWZpZWQsIHRoZW4gaXQgZGVmYXVsdHMgdG8gZmFzdCByZWNvcmRlciAoSEFMKSBmcmFtZSBjb3VudAotICAgICAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gbUZyYW1lQ291bnQgKiBrRmFzdFRyYWNrTXVsdGlwbGllcjsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGFjY2VwdGVkOiBmcmFtZUNvdW50PSVkIG1GcmFtZUNvdW50PSVkIiwKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZDogZnJhbWVDb3VudD0lZCAiCi0gICAgICAgICAgICAgICAgIm1GcmFtZUNvdW50PSVkIGZvcm1hdD0lZCBpc0xpbmVhcj0lZCBjaGFubmVsTWFzaz0lI3ggc2FtcGxlUmF0ZT0ldSBtU2FtcGxlUmF0ZT0ldSAiCi0gICAgICAgICAgICAgICAgImhhc0Zhc3RSZWNvcmRlcj0lZCB0aWQ9JWQiLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1GcmFtZUNvdW50LCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBzYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwgaGFzRmFzdFJlY29yZGVyKCksIHRpZCk7Ci0gICAgICAgICpmbGFncyAmPSB+SUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVDsKLSAgICAgICAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBBdWRpb1JlY29yZCBjYWxjdWxhdGlvbiwgYnVmZmVyIGRlcHRoIGlzIGZvcmNlZAotICAgICAgICAvLyB0byBiZSBhdCBsZWFzdCAyIHggdGhlIHJlY29yZCB0aHJlYWQgZnJhbWUgY291bnQgYW5kIGNvdmVyIGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kuCi0gICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgdG9vIGNvbnNlcnZhdGl2ZSwgYnV0IGxlZ2FjeSBhcHBsaWNhdGlvbiBjb2RlIG1heSBkZXBlbmQgb24gaXQuCi0gICAgICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjYWxjdWxhdGlvbiwgYWxzbyByZXZpZXcgdGhlIHN0YXJ0IHRocmVzaG9sZCB3aGljaCBpcyByZWxhdGVkLgotICAgICAgICB1aW50MzJfdCBsYXRlbmN5TXMgPSA1MDsgLy8gRklYTUUgbUlucHV0LT5zdHJlYW0tPmdldF9sYXRlbmN5KG1JbnB1dC0+c3RyZWFtKTsKLSAgICAgICAgc2l6ZV90IG1Ob3JtYWxGcmFtZUNvdW50ID0gMjA0ODsgLy8gRklYTUUKLSAgICAgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBsYXRlbmN5TXMgLyAoKDEwMDAgKiBtTm9ybWFsRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgIGlmIChtaW5CdWZDb3VudCA8IDIpIHsKLSAgICAgICAgICAgIG1pbkJ1ZkNvdW50ID0gMjsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbWluQnVmQ291bnQ7Ci0gICAgICAgIGlmIChmcmFtZUNvdW50IDwgbWluRnJhbWVDb3VudCkgewotICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBGSVhNRSB1c2UgZmxhZ3MgYW5kIHRpZCBzaW1pbGFyIHRvIGNyZWF0ZVRyYWNrX2woKQogCiAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgICAgICB0cmFjayA9IG5ldyBSZWNvcmRUcmFjayh0aGlzLCBjbGllbnQsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgc2Vzc2lvbklkLCB1aWQpOworICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIE5VTEwsIHNlc3Npb25JZCwgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICpmbGFncywgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQpOwogCi0gICAgICAgIGlmICh0cmFjay0+Z2V0Q2JsaygpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmRUcmFja19sKCkgbm8gY29udHJvbCBibG9jayIpOwotICAgICAgICAgICAgbFN0YXR1cyA9IE5PX01FTU9SWTsKKyAgICAgICAgbFN0YXR1cyA9IHRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmRUcmFja19sKCkgaW5pdENoZWNrIGZhaWxlZCAlZDsgbm8gY29udHJvbCBibG9jaz8iLCBsU3RhdHVzKTsKICAgICAgICAgICAgIC8vIHRyYWNrIG11c3QgYmUgY2xlYXJlZCBmcm9tIHRoZSBjYWxsZXIgYXMgdGhlIGNhbGxlciBoYXMgdGhlIEFGIGxvY2sKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQpAQCAtNDc2MywxMiArNTY0MywxMSBAQAogICAgICAgICAgICAgc2VuZFByaW9Db25maWdFdmVudF9sKGNhbGxpbmdQaWQsIHRpZCwga1ByaW9yaXR5QXVkaW9BcHApOwogICAgICAgICB9CiAgICAgfQorCiAgICAgbFN0YXR1cyA9IE5PX0VSUk9SOwogCiBFeGl0OgotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgfQorICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiB0cmFjazsKIH0KIApAQCAtNDc4MSw4MiArNTY2MCw4NiBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogCiAgICAgaWYgKGV2ZW50ID09IEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUpIHsKLSAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwogICAgIH0gZWxzZSBpZiAoZXZlbnQgIT0gQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfU0FNRSkgewotICAgICAgICBtU3luY1N0YXJ0RXZlbnQgPSBtQXVkaW9GbGluZ2VyLT5jcmVhdGVTeW5jRXZlbnQoZXZlbnQsCisgICAgICAgIHJlY29yZFRyYWNrLT5tU3luY1N0YXJ0RXZlbnQgPSBtQXVkaW9GbGluZ2VyLT5jcmVhdGVTeW5jRXZlbnQoZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5zZXNzaW9uSWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNTdGFydEV2ZW50Q2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrKTsKICAgICAgICAgLy8gU3luYyBldmVudCBjYW4gYmUgY2FuY2VsbGVkIGJ5IHRoZSB0cmlnZ2VyIHNlc3Npb24gaWYgdGhlIHRyYWNrIGlzIG5vdCBpbiBhCiAgICAgICAgIC8vIGNvbXBhdGlibGUgc3RhdGUgaW4gd2hpY2ggY2FzZSB3ZSBzdGFydCByZWNvcmQgaW1tZWRpYXRlbHkKLSAgICAgICAgaWYgKG1TeW5jU3RhcnRFdmVudC0+aXNDYW5jZWxsZWQoKSkgewotICAgICAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TeW5jU3RhcnRFdmVudC0+aXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRvIG5vdCB3YWl0IGZvciB0aGUgZXZlbnQgZm9yIG1vcmUgdGhhbiBBdWRpb1N5c3RlbTo6a1N5bmNSZWNvcmRTdGFydFRpbWVPdXRNcwotICAgICAgICAgICAgbUZyYW1lc3RvRHJvcCA9IC0gKChBdWRpb1N5c3RlbTo6a1N5bmNSZWNvcmRTdGFydFRpbWVPdXRNcyAqIG1SZXFTYW1wbGVSYXRlKSAvIDEwMDApOworICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1GcmFtZXNUb0Ryb3AgPSAtCisgICAgICAgICAgICAgICAgICAgICgoQXVkaW9TeXN0ZW06OmtTeW5jUmVjb3JkU3RhcnRUaW1lT3V0TXMgKiByZWNvcmRUcmFjay0+bVNhbXBsZVJhdGUpIC8gMTAwMCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICB7CisgICAgICAgIC8vIFRoaXMgc2VjdGlvbiBpcyBhIHJlbmRlenZvdXMgYmV0d2VlbiBiaW5kZXIgdGhyZWFkIGV4ZWN1dGluZyBzdGFydCgpIGFuZCBSZWNvcmRUaHJlYWQKICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjayAhPSBtQWN0aXZlVHJhY2suZ2V0KCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUJVU1k7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgewotICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7CisgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spID49IDApIHsKKyAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJhY3RpdmUgcmVjb3JkIHRyYWNrIFBBVVNJTkcgLT4gQUNUSVZFIik7CisgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWN0aXZlIHJlY29yZCB0cmFjayBzdGF0ZSAlZCIsIHJlY29yZFRyYWNrLT5tU3RhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCi0gICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OklETEU7Ci0gICAgICAgIG1BY3RpdmVUcmFjayA9IHJlY29yZFRyYWNrOwotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQobUlkKTsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIC8vIFRPRE8gY29uc2lkZXIgb3RoZXIgd2F5cyBvZiBoYW5kbGluZyB0aGlzLCBzdWNoIGFzIGNoYW5naW5nIHRoZSBzdGF0ZSB0byA6U1RBUlRJTkcgYW5kCisgICAgICAgIC8vICAgICAgYWRkaW5nIHRoZSB0cmFjayB0byBtQWN0aXZlVHJhY2tzIGFmdGVyIHJldHVybmluZyBmcm9tIEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KCksCisgICAgICAgIC8vICAgICAgb3IgdXNpbmcgYSBzZXBhcmF0ZSBjb21tYW5kIHRocmVhZAorICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVEFSVElOR18xOworICAgICAgICBtQWN0aXZlVHJhY2tzLmFkZChyZWNvcmRUcmFjayk7CisgICAgICAgIG1BY3RpdmVUcmFja3NHZW4rKzsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQobUlkLCAoYXVkaW9fc2Vzc2lvbl90KXJlY29yZFRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAvLyBGSVhNRSBzaG91bGQgdmVyaWZ5IHRoYXQgcmVjb3JkVHJhY2sgaXMgc3RpbGwgaW4gbUFjdGl2ZVRyYWNrcworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHJlY29yZFRyYWNrKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuKys7CisgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOjpzdGFydCBlcnJvciAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtUnNtcEluSW5kZXggPSBtRnJhbWVDb3VudDsKLSAgICAgICAgbUJ5dGVzUmVhZCA9IDA7Ci0gICAgICAgIGlmIChtUmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1SZXNhbXBsZXItPnJlc2V0KCk7CisgICAgICAgIC8vIENhdGNoIHVwIHdpdGggY3VycmVudCBidWZmZXIgaW5kaWNlcyBpZiB0aHJlYWQgaXMgYWxyZWFkeSBydW5uaW5nLgorICAgICAgICAvLyBUaGlzIGlzIHdoYXQgbWFrZXMgYSBuZXcgY2xpZW50IGRpc2NhcmQgYWxsIGJ1ZmZlcmVkIGRhdGEuICBJZiB0aGUgdHJhY2sncyBtUnNtcEluRnJvbnQKKyAgICAgICAgLy8gd2FzIGluaXRpYWxpemVkIHRvIHNvbWUgdmFsdWUgY2xvc2VyIHRvIHRoZSB0aHJlYWQncyBtUnNtcEluRnJvbnQsIHRoZW4gdGhlIHRyYWNrIGNvdWxkCisgICAgICAgIC8vIHNlZSBwcmV2aW91c2x5IGJ1ZmZlcmVkIGRhdGEgYmVmb3JlIGl0IGNhbGxlZCBzdGFydCgpLCBidXQgd2l0aCBncmVhdGVyIHJpc2sgb2Ygb3ZlcnJ1bi4KKworICAgICAgICByZWNvcmRUcmFjay0+bVJzbXBJbkZyb250ID0gbVJzbXBJblJlYXI7CisgICAgICAgIHJlY29yZFRyYWNrLT5tUnNtcEluVW5yZWwgPSAwOworICAgICAgICAvLyBGSVhNRSB3aHkgcmVzZXQ/CisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVJlc2FtcGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICByZWNvcmRUcmFjay0+bVJlc2FtcGxlci0+cmVzZXQoKTsKICAgICAgICAgfQotICAgICAgICBtQWN0aXZlVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6UkVTVU1JTkc7CisgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzI7CiAgICAgICAgIC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RhcnQKLSAgICAgICAgQUxPR1YoIlNpZ25hbCByZWNvcmQgdGhyZWFkIik7CiAgICAgICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwotICAgICAgICAvLyBkbyBub3Qgd2FpdCBmb3IgbVN0YXJ0U3RvcENvbmQgaWYgZXhpdGluZwotICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewotICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIGdvdG8gc3RhcnRFcnJvcjsKLSAgICAgICAgfQotICAgICAgICBtU3RhcnRTdG9wQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgaWYgKG1BY3RpdmVUcmFjayA9PSAwKSB7CisgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spIDwgMCkgewogICAgICAgICAgICAgQUxPR1YoIlJlY29yZCBmYWlsZWQgdG8gc3RhcnQiKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gc3RhcnRFcnJvcjsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiUmVjb3JkIHN0YXJ0ZWQgT0siKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKIHN0YXJ0RXJyb3I6Ci0gICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtSWQpOwotICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpjbGVhclN5bmNTdGFydEV2ZW50KCkKLXsKLSAgICBpZiAobVN5bmNTdGFydEV2ZW50ICE9IDApIHsKLSAgICAgICAgbVN5bmNTdGFydEV2ZW50LT5jYW5jZWwoKTsKKyAgICBpZiAocmVjb3JkVHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobUlkLCAoYXVkaW9fc2Vzc2lvbl90KXJlY29yZFRyYWNrLT5zZXNzaW9uSWQoKSk7CiAgICAgfQotICAgIG1TeW5jU3RhcnRFdmVudC5jbGVhcigpOwotICAgIG1GcmFtZXN0b0Ryb3AgPSAwOworICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgLy8gRklYTUUgSSB3b25kZXIgd2h5IHdlIGRvIG5vdCByZXNldCB0aGUgc3RhdGUgaGVyZT8KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzeW5jU3RhcnRFdmVudENhbGxiYWNrKGNvbnN0IHdwPFN5bmNFdmVudD4mIGV2ZW50KQpAQCAtNDg2NCw0NiArNTc0Nyw0MiBAQAogICAgIHNwPFN5bmNFdmVudD4gc3Ryb25nRXZlbnQgPSBldmVudC5wcm9tb3RlKCk7CiAKICAgICBpZiAoc3Ryb25nRXZlbnQgIT0gMCkgewotICAgICAgICBSZWNvcmRUaHJlYWQgKm1lID0gKFJlY29yZFRocmVhZCAqKXN0cm9uZ0V2ZW50LT5jb29raWUoKTsKLSAgICAgICAgbWUtPmhhbmRsZVN5bmNTdGFydEV2ZW50KHN0cm9uZ0V2ZW50KTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KQotewotICAgIGlmIChldmVudCA9PSBtU3luY1N0YXJ0RXZlbnQpIHsKLSAgICAgICAgLy8gVE9ETzogdXNlIGFjdHVhbCBidWZmZXIgZmlsbGluZyBzdGF0dXMgaW5zdGVhZCBvZiAyIGJ1ZmZlcnMgd2hlbiBpbmZvIGlzIGF2YWlsYWJsZQotICAgICAgICAvLyBmcm9tIGF1ZGlvIEhBTAotICAgICAgICBtRnJhbWVzdG9Ecm9wID0gbUZyYW1lQ291bnQgKiAyOworICAgICAgICBzcDxSZWZCYXNlPiBwdHIgPSBzdHJvbmdFdmVudC0+Y29va2llKCkucHJvbW90ZSgpOworICAgICAgICBpZiAocHRyICE9IDApIHsKKyAgICAgICAgICAgIFJlY29yZFRyYWNrICpyZWNvcmRUcmFjayA9IChSZWNvcmRUcmFjayAqKXB0ci5nZXQoKTsKKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5oYW5kbGVTeW5jU3RhcnRFdmVudChzdHJvbmdFdmVudCk7CisgICAgICAgIH0KICAgICB9CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN0b3AoUmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spIHsKICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOjpzdG9wIik7CiAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLSAgICBpZiAocmVjb3JkVHJhY2sgIT0gbUFjdGl2ZVRyYWNrLmdldCgpIHx8IHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CisgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgIT0gMCB8fCByZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIC8vIG5vdGUgdGhhdCB0aHJlYWRMb29wIG1heSBzdGlsbCBiZSBwcm9jZXNzaW5nIHRoZSB0cmFjayBhdCB0aGlzIHBvaW50IFt3aXRob3V0IGxvY2tdCiAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6UEFVU0lORzsKICAgICAvLyBkbyBub3Qgd2FpdCBmb3IgbVN0YXJ0U3RvcENvbmQgaWYgZXhpdGluZwogICAgIGlmIChleGl0UGVuZGluZygpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKyAgICAvLyBGSVhNRSBpbmNvcnJlY3QgdXNhZ2Ugb2Ygd2FpdDogbm8gZXhwbGljaXQgcHJlZGljYXRlIG9yIGxvb3AKICAgICBtU3RhcnRTdG9wQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAvLyBpZiB3ZSBoYXZlIGJlZW4gcmVzdGFydGVkLCByZWNvcmRUcmFjayA9PSBtQWN0aXZlVHJhY2suZ2V0KCkgaGVyZQotICAgIGlmIChleGl0UGVuZGluZygpIHx8IHJlY29yZFRyYWNrICE9IG1BY3RpdmVUcmFjay5nZXQoKSkgeworICAgIC8vIGlmIHdlIGhhdmUgYmVlbiByZXN0YXJ0ZWQsIHJlY29yZFRyYWNrIGlzIGluIG1BY3RpdmVUcmFja3MgaGVyZQorICAgIGlmIChleGl0UGVuZGluZygpIHx8IG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgIT0gMCkgewogICAgICAgICBBTE9HVigiUmVjb3JkIHN0b3BwZWQgT0siKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aXNWYWxpZFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkgY29uc3QKK2Jvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmlzVmFsaWRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQgX191bnVzZWQpIGNvbnN0CiB7CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnNldFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCBfX3VudXNlZCkKIHsKICNpZiAwICAgLy8gVGhpcyBicmFuY2ggaXMgY3VycmVudGx5IGRlYWQgY29kZSwgYnV0IGlzIHByZXNlcnZlZCBpbiBjYXNlIGl0IHdpbGwgYmUgbmVlZGVkIGluIGZ1dHVyZQogICAgIGlmICghaXNWYWxpZFN5bmNFdmVudChldmVudCkpIHsKQEAgLTQ5MzQsNyArNTgxMyw3IEBACiAgICAgdHJhY2stPnRlcm1pbmF0ZSgpOwogICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQRUQ7CiAgICAgLy8gYWN0aXZlIHRyYWNrcyBhcmUgcmVtb3ZlZCBieSB0aHJlYWRMb29wKCkKLSAgICBpZiAobUFjdGl2ZVRyYWNrICE9IHRyYWNrKSB7CisgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7CiAgICAgICAgIHJlbW92ZVRyYWNrX2wodHJhY2spOwogICAgIH0KIH0KQEAgLTQ5NDMsNiArNTgyMiwxMCBAQAogewogICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICAvLyBuZWVkIGFueXRoaW5nIHJlbGF0ZWQgdG8gZWZmZWN0cyBoZXJlPworICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICBBTE9HX0FTU0VSVCghbUZhc3RUcmFja0F2YWlsKTsKKyAgICAgICAgbUZhc3RUcmFja0F2YWlsID0gdHJ1ZTsKKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQpAQCAtNDk1NCwyMTcgKzU4MzcsMjM2IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OworICAgIGRwcmludGYoZmQsICJcbklucHV0IHRocmVhZCAlcDpcbiIsIHRoaXMpOwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5JbnB1dCB0aHJlYWQgJXAgaW50ZXJuYWxzXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiSW4gaW5kZXg6ICVkXG4iLCBtUnNtcEluSW5kZXgpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkJ1ZmZlciBzaXplOiAldSBieXRlc1xuIiwgbUJ1ZmZlclNpemUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlJlc2FtcGxpbmc6ICVkXG4iLCAobVJlc2FtcGxlciAhPSBOVUxMKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiT3V0IGNoYW5uZWwgY291bnQ6ICV1XG4iLCBtUmVxQ2hhbm5lbENvdW50KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJPdXQgc2FtcGxlIHJhdGU6ICV1XG4iLCBtUmVxU2FtcGxlUmF0ZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPiAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIEJ1ZmZlciBzaXplOiAlenUgYnl0ZXNcbiIsIG1CdWZmZXJTaXplKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQuYXBwZW5kKCJObyBhY3RpdmUgcmVjb3JkIGNsaWVudFxuIik7CisgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGFjdGl2ZSByZWNvcmQgY2xpZW50c1xuIik7CiAgICAgfQotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgZHByaW50ZihmZCwgIiAgRmFzdCBjYXB0dXJlIHRocmVhZDogJXNcbiIsIGhhc0Zhc3RDYXB0dXJlKCkgPyAieWVzIiA6ICJubyIpOworICAgIGRwcmludGYoZmQsICIgIEZhc3QgdHJhY2sgYXZhaWxhYmxlOiAlc1xuIiwgbUZhc3RUcmFja0F2YWlsID8gInllcyIgOiAibm8iKTsKIAogICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIklucHV0IHRocmVhZCAlcCB0cmFja3NcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwotICAgICAgICBpZiAodHJhY2sgIT0gMCkgewotICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzaXplX3QgbnVtdHJhY2tzID0gbVRyYWNrcy5zaXplKCk7CisgICAgc2l6ZV90IG51bWFjdGl2ZSA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOworICAgIHNpemVfdCBudW1hY3RpdmVzZWVuID0gMDsKKyAgICBkcHJpbnRmKGZkLCAiICAlZCBUcmFja3MiLCBudW10cmFja3MpOworICAgIGlmIChudW10cmFja3MpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlZCBhcmUgYWN0aXZlXG4iLCBudW1hY3RpdmUpOworICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrcyA7ICsraSkgeworICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmICh0cmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgYm9vbCBhY3RpdmUgPSBtQWN0aXZlVHJhY2tzLmluZGV4T2YodHJhY2spID49IDA7CisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICBudW1hY3RpdmVzZWVuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgYWN0aXZlKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkcHJpbnRmKGZkLCAiXG4iKTsKICAgICB9CiAKLSAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5JbnB1dCB0aHJlYWQgJXAgYWN0aXZlIHRyYWNrc1xuIiwgdGhpcyk7CisgICAgaWYgKG51bWFjdGl2ZXNlZW4gIT0gbnVtYWN0aXZlKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCisgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwogICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7Ci0gICAgICAgIG1BY3RpdmVUcmFjay0+ZHVtcChidWZmZXIsIFNJWkUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYWN0aXZlOyArK2kpIHsKKyAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV07CisgICAgICAgICAgICBpZiAobVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUsIHRydWUpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgfQogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKAorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMgX191bnVzZWQpCiB7Ci0gICAgc2l6ZV90IGZyYW1lc1JlcSA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICBzaXplX3QgZnJhbWVzUmVhZHkgPSBtRnJhbWVDb3VudCAtIG1Sc21wSW5JbmRleDsKLSAgICBpbnQgY2hhbm5lbENvdW50OwotCi0gICAgaWYgKGZyYW1lc1JlYWR5ID09IDApIHsKLSAgICAgICAgbUJ5dGVzUmVhZCA9IG1JbnB1dC0+c3RyZWFtLT5yZWFkKG1JbnB1dC0+c3RyZWFtLCBtUnNtcEluQnVmZmVyLCBtQnVmZmVyU2l6ZSk7Ci0gICAgICAgIGlmIChtQnl0ZXNSZWFkIDw9IDApIHsKLSAgICAgICAgICAgIGlmICgobUJ5dGVzUmVhZCA8IDApICYmIChtQWN0aXZlVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OkFDVElWRSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiUmVjb3JkVGhyZWFkOjpnZXROZXh0QnVmZmVyKCkgRXJyb3IgcmVhZGluZyBhdWRpbyBpbnB1dCIpOwotICAgICAgICAgICAgICAgIC8vIEZvcmNlIGlucHV0IGludG8gc3RhbmRieSBzbyB0aGF0IGl0IHRyaWVzIHRvCi0gICAgICAgICAgICAgICAgLy8gcmVjb3ZlciBhdCBuZXh0IHJlYWQgYXR0ZW1wdAotICAgICAgICAgICAgICAgIGlucHV0U3RhbmRCeSgpOwotICAgICAgICAgICAgICAgIHVzbGVlcChrUmVjb3JkVGhyZWFkU2xlZXBVcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7Ci0gICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOwotICAgICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgfQotICAgICAgICBtUnNtcEluSW5kZXggPSAwOwotICAgICAgICBmcmFtZXNSZWFkeSA9IG1GcmFtZUNvdW50OworICAgIFJlY29yZFRyYWNrICphY3RpdmVUcmFjayA9IG1SZWNvcmRUcmFjazsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWRCYXNlID0gYWN0aXZlVHJhY2stPm1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWRCYXNlID09IDApIHsKKyAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKKyAgICAgICAgYnVmZmVyLT5yYXcgPSBOVUxMOworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKyAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkQmFzZS5nZXQoKTsKKyAgICBpbnQzMl90IHJlYXIgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5SZWFyOworICAgIGludDMyX3QgZnJvbnQgPSBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250OworICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OworICAgIC8vIEZJWE1FIHNob3VsZCBub3QgYmUgUDIgKGRvbid0IHdhbnQgdG8gaW5jcmVhc2UgbGF0ZW5jeSkKKyAgICAvLyBGSVhNRSBpZiBjbGllbnQgbm90IGtlZXBpbmcgdXAsIGRpc2NhcmQKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IHJlY29yZFRocmVhZC0+bVJzbXBJbkZyYW1lcykpOworICAgIC8vICdmaWxsZWQnIG1heSBiZSBub24tY29udGlndW91cywgc28gcmV0dXJuIG9ubHkgdGhlIGZpcnN0IGNvbnRpZ3VvdXMgY2h1bmsKKyAgICBmcm9udCAmPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5GcmFtZXNQMiAtIDE7CisgICAgc2l6ZV90IHBhcnQxID0gcmVjb3JkVGhyZWFkLT5tUnNtcEluRnJhbWVzUDIgLSBmcm9udDsKKyAgICBpZiAocGFydDEgPiAoc2l6ZV90KSBmaWxsZWQpIHsKKyAgICAgICAgcGFydDEgPSBmaWxsZWQ7CisgICAgfQorICAgIHNpemVfdCBhc2sgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgQUxPR19BU1NFUlQoYXNrID4gMCk7CisgICAgaWYgKHBhcnQxID4gYXNrKSB7CisgICAgICAgIHBhcnQxID0gYXNrOworICAgIH0KKyAgICBpZiAocGFydDEgPT0gMCkgeworICAgICAgICAvLyBIaWdoZXItbGV2ZWwgc2hvdWxkIGtlZXAgbVJzbXBJbkJ1ZmZlciBmdWxsLCBhbmQgbm90IGNhbGwgcmVzYW1wbGVyIGlmIGVtcHR5CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlJlY29yZFRocmVhZDo6Z2V0TmV4dEJ1ZmZlcigpIHN0YXJ2ZWQiKTsKKyAgICAgICAgYnVmZmVyLT5yYXcgPSBOVUxMOworICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsID0gMDsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKICAgICB9CiAKLSAgICBpZiAoZnJhbWVzUmVxID4gZnJhbWVzUmVhZHkpIHsKLSAgICAgICAgZnJhbWVzUmVxID0gZnJhbWVzUmVhZHk7Ci0gICAgfQotCi0gICAgaWYgKG1DaGFubmVsQ291bnQgPT0gMSAmJiBtUmVxQ2hhbm5lbENvdW50ID09IDIpIHsKLSAgICAgICAgY2hhbm5lbENvdW50ID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICBjaGFubmVsQ291bnQgPSAyOwotICAgIH0KLSAgICBidWZmZXItPnJhdyA9IG1Sc21wSW5CdWZmZXIgKyBtUnNtcEluSW5kZXggKiBjaGFubmVsQ291bnQ7Ci0gICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gZnJhbWVzUmVxOworICAgIGJ1ZmZlci0+cmF3ID0gcmVjb3JkVGhyZWFkLT5tUnNtcEluQnVmZmVyICsgZnJvbnQgKiByZWNvcmRUaHJlYWQtPm1DaGFubmVsQ291bnQ7CisgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gcGFydDE7CisgICAgYWN0aXZlVHJhY2stPm1Sc21wSW5VbnJlbCA9IHBhcnQxOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZXNhbXBsZXJCdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgbVJzbXBJbkluZGV4ICs9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBSZWNvcmRUcmFjayAqYWN0aXZlVHJhY2sgPSBtUmVjb3JkVHJhY2s7CisgICAgc2l6ZV90IHN0ZXBDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBpZiAoc3RlcENvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HX0FTU0VSVChzdGVwQ291bnQgPD0gYWN0aXZlVHJhY2stPm1Sc21wSW5VbnJlbCk7CisgICAgYWN0aXZlVHJhY2stPm1Sc21wSW5VbnJlbCAtPSBzdGVwQ291bnQ7CisgICAgYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udCArPSBzdGVwQ291bnQ7CisgICAgYnVmZmVyLT5yYXcgPSBOVUxMOwogICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CiB9CiAKLWJvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCkKK2Jvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKQogewogICAgIGJvb2wgcmVjb25maWcgPSBmYWxzZTsKIAotICAgIHdoaWxlICghbU5ld1BhcmFtZXRlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgICAgICBTdHJpbmc4IGtleVZhbHVlUGFpciA9IG1OZXdQYXJhbWV0ZXJzWzBdOwotICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcik7Ci0gICAgICAgIGludCB2YWx1ZTsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgcmVxRm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgdWludDMyX3QgcmVxU2FtcGxpbmdSYXRlID0gbVJlcVNhbXBsZVJhdGU7Ci0gICAgICAgIHVpbnQzMl90IHJlcUNoYW5uZWxDb3VudCA9IG1SZXFDaGFubmVsQ291bnQ7CisgICAgc3RhdHVzID0gTk9fRVJST1I7CiAKLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTYW1wbGluZ1JhdGUpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJlcVNhbXBsaW5nUmF0ZSA9IHZhbHVlOworICAgIGF1ZGlvX2Zvcm1hdF90IHJlcUZvcm1hdCA9IG1Gb3JtYXQ7CisgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChtQ2hhbm5lbENvdW50KTsKKworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKKyAgICBpbnQgdmFsdWU7CisgICAgLy8gVE9ETyBJbnZlc3RpZ2F0ZSB3aGVuIHRoaXMgY29kZSBydW5zLiBDaGVjayB3aXRoIGF1ZGlvIHBvbGljeSB3aGVuIGEgc2FtcGxlIHJhdGUgYW5kCisgICAgLy8gICAgICBjaGFubmVsIGNvdW50IGNoYW5nZSBjYW4gYmUgcmVxdWVzdGVkLiBEbyB3ZSBtYW5kYXRlIHRoZSBmaXJzdCBjbGllbnQgZGVmaW5lcyB0aGUKKyAgICAvLyAgICAgIEhBTCBzYW1wbGluZyByYXRlIGFuZCBjaGFubmVsIGNvdW50IG9yIGRvIHdlIGFsbG93IGNoYW5nZXMgb24gdGhlIGZseT8KKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVNhbXBsaW5nUmF0ZSksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICBzYW1wbGluZ1JhdGUgPSB2YWx1ZTsKKyAgICAgICAgcmVjb25maWcgPSB0cnVlOworICAgIH0KKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICBpZiAoKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVxRm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZTsKICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaWYgKChhdWRpb19mb3JtYXRfdCkgdmFsdWUgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlcUZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Q2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJlcUNoYW5uZWxDb3VudCA9IHBvcGNvdW50KHZhbHVlKTsKKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSB2YWx1ZTsKKyAgICAgICAgaWYgKG1hc2sgIT0gQVVESU9fQ0hBTk5FTF9JTl9NT05PICYmIG1hc2sgIT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gbWFzazsKICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZyYW1lQ291bnQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdCBhY2NlcHQgZnJhbWUgY291bnQgY2hhbmdlcyBpZiB0cmFja3MgYXJlIG9wZW4gYXMgdGhlIHRyYWNrIGJ1ZmZlcgotICAgICAgICAgICAgLy8gc2l6ZSBkZXBlbmRzIG9uIGZyYW1lIGNvdW50IGFuZCBjb3JyZWN0IGJlaGF2aW9yIHdvdWxkIG5vdCBiZSBndWFyYW50ZWVkCi0gICAgICAgICAgICAvLyBpZiBmcmFtZSBjb3VudCBpcyBjaGFuZ2VkIGFmdGVyIHRyYWNrIGNyZWF0aW9uCi0gICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwotICAgICAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZyYW1lQ291bnQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gZG8gbm90IGFjY2VwdCBmcmFtZSBjb3VudCBjaGFuZ2VzIGlmIHRyYWNrcyBhcmUgb3BlbiBhcyB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgIC8vIHNpemUgZGVwZW5kcyBvbiBmcmFtZSBjb3VudCBhbmQgY29ycmVjdCBiZWhhdmlvciB3b3VsZCBub3QgYmUgZ3VhcmFudGVlZAorICAgICAgICAvLyBpZiBmcmFtZSBjb3VudCBpcyBjaGFuZ2VkIGFmdGVyIHRyYWNrIGNyZWF0aW9uCisgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQotICAgICAgICAgICAgLy8gYXdhcmUgb2YgYXR0YWNoZWQgYXVkaW8gZGV2aWNlLgotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wodmFsdWUpOwotICAgICAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQorICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wodmFsdWUpOworICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIHN0b3JlIGlucHV0IGRldmljZSBhbmQgb3V0cHV0IGRldmljZSBidXQgZG8gbm90IGZvcndhcmQgb3V0cHV0IGRldmljZSB0byBhdWRpbyBIQUwuCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgc3RhdHVzIGlzIGlnbm9yZWQgYnkgdGhlIGNhbGxlciBmb3Igb3V0cHV0IGRldmljZQotICAgICAgICAgICAgLy8gKHNlZSBBdWRpb0ZsaW5nZXI6OnNldFBhcmFtZXRlcnMoKQotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKHZhbHVlKSkgewotICAgICAgICAgICAgICAgIG1PdXREZXZpY2UgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1JbkRldmljZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgQUVDIGFuZCBOUyBpZiB0aGUgZGV2aWNlIGlzIGEgQlQgU0NPIGhlYWRzZXQgc3VwcG9ydGluZyB0aG9zZQotICAgICAgICAgICAgICAgIC8vIHByZSBwcm9jZXNzaW5ncwotICAgICAgICAgICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kID0gYXVkaW9faXNfYmx1ZXRvb3RoX3Njb19kZXZpY2UobUluRGV2aWNlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXItPmJ0TnJlY0lzT2ZmKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9BRUMsIHN1c3BlbmQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfTlMsIHN1c3BlbmQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLy8gc3RvcmUgaW5wdXQgZGV2aWNlIGFuZCBvdXRwdXQgZGV2aWNlIGJ1dCBkbyBub3QgZm9yd2FyZCBvdXRwdXQgZGV2aWNlIHRvIGF1ZGlvIEhBTC4KKyAgICAgICAgLy8gTm90ZSB0aGF0IHN0YXR1cyBpcyBpZ25vcmVkIGJ5IHRoZSBjYWxsZXIgZm9yIG91dHB1dCBkZXZpY2UKKyAgICAgICAgLy8gKHNlZSBBdWRpb0ZsaW5nZXI6OnNldFBhcmFtZXRlcnMoKQorICAgICAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZXModmFsdWUpKSB7CisgICAgICAgICAgICBtT3V0RGV2aWNlID0gdmFsdWU7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5EZXZpY2UgPSB2YWx1ZTsKKyAgICAgICAgICAgIC8vIGRpc2FibGUgQUVDIGFuZCBOUyBpZiB0aGUgZGV2aWNlIGlzIGEgQlQgU0NPIGhlYWRzZXQgc3VwcG9ydGluZyB0aG9zZQorICAgICAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmdzCisgICAgICAgICAgICBpZiAobVRyYWNrcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kID0gYXVkaW9faXNfYmx1ZXRvb3RoX3Njb19kZXZpY2UobUluRGV2aWNlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+YnROcmVjSXNPZmYoKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX0FFQywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX05TLCBzdXNwZW5kLCB0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUlucHV0U291cmNlKSwgdmFsdWUpID09IE5PX0VSUk9SICYmCi0gICAgICAgICAgICAgICAgbUF1ZGlvU291cmNlICE9IChhdWRpb19zb3VyY2VfdCl2YWx1ZSkgewotICAgICAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQotICAgICAgICAgICAgLy8gYXdhcmUgb2YgYXR0YWNoZWQgYXVkaW8gZGV2aWNlLgotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0QXVkaW9Tb3VyY2VfbCgoYXVkaW9fc291cmNlX3QpdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUF1ZGlvU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KXZhbHVlOworICAgIH0KKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUlucHV0U291cmNlKSwgdmFsdWUpID09IE5PX0VSUk9SICYmCisgICAgICAgICAgICBtQXVkaW9Tb3VyY2UgIT0gKGF1ZGlvX3NvdXJjZV90KXZhbHVlKSB7CisgICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKKyAgICAgICAgLy8gYXdhcmUgb2YgYXR0YWNoZWQgYXVkaW8gZGV2aWNlLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldEF1ZGlvU291cmNlX2woKGF1ZGlvX3NvdXJjZV90KXZhbHVlKTsKICAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1BdWRpb1NvdXJjZSA9IChhdWRpb19zb3VyY2VfdCl2YWx1ZTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLAogICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAgICAgICAgIGlucHV0U3RhbmRCeSgpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChyZWNvbmZpZykgeworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBCQURfVkFMVUUgJiYKKyAgICAgICAgICAgICAgICByZXFGb3JtYXQgPT0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKSAmJgorICAgICAgICAgICAgICAgIHJlcUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAmJgorICAgICAgICAgICAgICAgIChtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikKKyAgICAgICAgICAgICAgICAgICAgICAgIDw9ICgyICogc2FtcGxpbmdSYXRlKSkgJiYKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzaygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKSkgPD0gRkNDXzIgJiYKKyAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9NT05PIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX1NURVJFTykpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWNvbmZpZykgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQkFEX1ZBTFVFICYmCi0gICAgICAgICAgICAgICAgICAgIHJlcUZvcm1hdCA9PSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pICYmCi0gICAgICAgICAgICAgICAgICAgIHJlcUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAmJgotICAgICAgICAgICAgICAgICAgICAobUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gKDIgKiByZXFTYW1wbGluZ1JhdGUpKSAmJgotICAgICAgICAgICAgICAgICAgICBwb3Bjb3VudChtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gRkNDXzIgJiYKLSAgICAgICAgICAgICAgICAgICAgKHJlcUNoYW5uZWxDb3VudCA8PSBGQ0NfMikpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZElucHV0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpJTlBVVF9DT05GSUdfQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOworICAgICAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQXVkaW9TeXN0ZW06OklOUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIG1OZXdQYXJhbWV0ZXJzLnJlbW92ZUF0KDApOwotCi0gICAgICAgIG1QYXJhbVN0YXR1cyA9IHN0YXR1czsKLSAgICAgICAgbVBhcmFtQ29uZC5zaWduYWwoKTsKLSAgICAgICAgLy8gd2FpdCBmb3IgY29uZGl0aW9uIHdpdGggdGltZSBvdXQgaW4gY2FzZSB0aGUgdGhyZWFkIGNhbGxpbmcgVGhyZWFkQmFzZTo6c2V0UGFyYW1ldGVycygpCi0gICAgICAgIC8vIGFscmVhZHkgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHRoZSBzdGF0dXMgYW5kIHdpbGwgbmV2ZXIgc2lnbmFsIHRoZSBjb25kaXRpb24uCi0gICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywga1NldFBhcmFtZXRlcnNUaW1lb3V0TnMpOwogICAgIH0KKwogICAgIHJldHVybiByZWNvbmZpZzsKIH0KIApAQCAtNTE4MSw5ICs2MDgzLDkgQEAKICAgICByZXR1cm4gb3V0X3M4OwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSkgewordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtIF9fdW51c2VkKSB7CiAgICAgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgZGVzYzsKLSAgICB2b2lkICpwYXJhbTIgPSBOVUxMOworICAgIGNvbnN0IHZvaWQgKnBhcmFtMiA9IE5VTEw7CiAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEOgpAQCAtNTIwMCw1NyArNjEwMiw0OSBAQAogICAgIGRlZmF1bHQ6CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBtQXVkaW9GbGluZ2VyLT5hdWRpb0NvbmZpZ0NoYW5nZWRfbChldmVudCwgbUlkLCBwYXJhbTIpOworICAgIG1BdWRpb0ZsaW5nZXItPmF1ZGlvQ29uZmlnQ2hhbmdlZChldmVudCwgbUlkLCBwYXJhbTIpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzKCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCiB7Ci0gICAgZGVsZXRlW10gbVJzbXBJbkJ1ZmZlcjsKLSAgICAvLyBtUnNtcEluQnVmZmVyIGlzIGFsd2F5cyBhc3NpZ25lZCBhIG5ld1tdIGJlbG93Ci0gICAgZGVsZXRlW10gbVJzbXBPdXRCdWZmZXI7Ci0gICAgbVJzbXBPdXRCdWZmZXIgPSBOVUxMOwotICAgIGRlbGV0ZSBtUmVzYW1wbGVyOwotICAgIG1SZXNhbXBsZXIgPSBOVUxMOwotCiAgICAgbVNhbXBsZVJhdGUgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUNoYW5uZWxNYXNrID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgIG1DaGFubmVsQ291bnQgPSBwb3Bjb3VudChtQ2hhbm5lbE1hc2spOwotICAgIG1Gb3JtYXQgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2spOworICAgIG1IQUxGb3JtYXQgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1Gb3JtYXQgPSBtSEFMRm9ybWF0OwogICAgIGlmIChtRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgIEFMT0dFKCJIQUwgZm9ybWF0ICVkIG5vdCBzdXBwb3J0ZWQ7IG11c3QgYmUgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiLCBtRm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIkhBTCBmb3JtYXQgJSN4IG5vdCBzdXBwb3J0ZWQ7IG11c3QgYmUgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiLCBtRm9ybWF0KTsKICAgICB9Ci0gICAgbUZyYW1lU2l6ZSA9IGF1ZGlvX3N0cmVhbV9mcmFtZV9zaXplKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtRnJhbWVTaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobUlucHV0LT5zdHJlYW0pOwogICAgIG1CdWZmZXJTaXplID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1GcmFtZUNvdW50ID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOwotICAgIG1Sc21wSW5CdWZmZXIgPSBuZXcgaW50MTZfdFttRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnRdOwotICAgIG1lbXNldChtUnNtcEluQnVmZmVyLCAwLCBtRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQgKiBzaXplb2YobVJzbXBJbkJ1ZmZlclswXSkpOworICAgIC8vIFRoaXMgaXMgdGhlIGZvcm11bGEgZm9yIGNhbGN1bGF0aW5nIHRoZSB0ZW1wb3JhcnkgYnVmZmVyIHNpemUuCisgICAgLy8gV2l0aCA3IEhBTCBidWZmZXJzLCB3ZSBjYW4gZ3VhcmFudGVlIGFiaWxpdHkgdG8gZG93bi1zYW1wbGUgdGhlIGlucHV0IGJ5IHJhdGlvIG9mIDY6MSB0bworICAgIC8vIDEgZnVsbCBvdXRwdXQgYnVmZmVyLCByZWdhcmRsZXNzIG9mIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGF2YWlsYWJsZSBpbnB1dC4KKyAgICAvLyBUaGUgdmFsdWUgaXMgc29tZXdoYXQgYXJiaXRyYXJ5LCBhbmQgY291bGQgcHJvYmFibHkgYmUgZXZlbiBsYXJnZXIuCisgICAgLy8gQSBsYXJnZXIgdmFsdWUgc2hvdWxkIGFsbG93IG1vcmUgb2xkIGRhdGEgdG8gYmUgcmVhZCBhZnRlciBhIHRyYWNrIGNhbGxzIHN0YXJ0KCksCisgICAgLy8gd2l0aG91dCBpbmNyZWFzaW5nIGxhdGVuY3kuCisgICAgbVJzbXBJbkZyYW1lcyA9IG1GcmFtZUNvdW50ICogNzsKKyAgICBtUnNtcEluRnJhbWVzUDIgPSByb3VuZHVwKG1Sc21wSW5GcmFtZXMpOworICAgIGRlbGV0ZVtdIG1Sc21wSW5CdWZmZXI7CiAKLSAgICBpZiAobVNhbXBsZVJhdGUgIT0gbVJlcVNhbXBsZVJhdGUgJiYgbUNoYW5uZWxDb3VudCA8PSBGQ0NfMiAmJiBtUmVxQ2hhbm5lbENvdW50IDw9IEZDQ18yKQotICAgIHsKLSAgICAgICAgaW50IGNoYW5uZWxDb3VudDsKLSAgICAgICAgLy8gb3B0aW1pemF0aW9uOiBpZiBtb25vIHRvIG1vbm8sIHVzZSB0aGUgcmVzYW1wbGVyIGluIHN0ZXJlbyB0byBzdGVyZW8gbW9kZSB0byBhdm9pZAotICAgICAgICAvLyBzdGVyZW8gdG8gbW9ubyBwb3N0IHByb2Nlc3MgYXMgdGhlIHJlc2FtcGxlciBhbHdheXMgb3V0cHV0cyBzdGVyZW8uCi0gICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEgJiYgbVJlcUNoYW5uZWxDb3VudCA9PSAyKSB7Ci0gICAgICAgICAgICBjaGFubmVsQ291bnQgPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gMjsKLSAgICAgICAgfQotICAgICAgICBtUmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgxNiwgY2hhbm5lbENvdW50LCBtUmVxU2FtcGxlUmF0ZSk7Ci0gICAgICAgIG1SZXNhbXBsZXItPnNldFNhbXBsZVJhdGUobVNhbXBsZVJhdGUpOwotICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUoQXVkaW9NaXhlcjo6VU5JVFlfR0FJTiwgQXVkaW9NaXhlcjo6VU5JVFlfR0FJTik7Ci0gICAgICAgIG1Sc21wT3V0QnVmZmVyID0gbmV3IGludDMyX3RbbUZyYW1lQ291bnQgKiBGQ0NfMl07CisgICAgLy8gVE9ETyBvcHRpbWl6ZSBhdWRpbyBjYXB0dXJlIGJ1ZmZlciBzaXplcyAuLi4KKyAgICAvLyBIZXJlIHdlIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc2xpZGluZyBidWZmZXIgdXNlZCBhcyBhIHNvdXJjZQorICAgIC8vIGZvciByZXNhbXBsaW5nLiAgbVJzbXBJbkZyYW1lc1AyIGlzIGN1cnJlbnRseSByb3VuZHVwKG1GcmFtZUNvdW50ICogNykuCisgICAgLy8gRm9yIGN1cnJlbnQgSEFMIGZyYW1lIGNvdW50cywgdGhpcyBpcyB1c3VhbGx5IDIwNDggPSA0MCBtcy4gIEl0IHdvdWxkCisgICAgLy8gYmUgYmV0dGVyIHRvIGhhdmUgaXQgZGVyaXZlZCBmcm9tIHRoZSBwaXBlIGRlcHRoIGluIHRoZSBsb25nIHRlcm0uCisgICAgLy8gVGhlIGN1cnJlbnQgdmFsdWUgaXMgaGlnaGVyIHRoYW4gbmVjZXNzYXJ5LiAgSG93ZXZlciBpdCBzaG91bGQgbm90IGFkZCB0byBsYXRlbmN5LgogCi0gICAgICAgIC8vIG9wdG1pemF0aW9uOiBpZiBtb25vIHRvIG1vbm8sIGFsdGVyIGlucHV0IGZyYW1lIGNvdW50IGFzIGlmIHdlIHdlcmUgaW5wdXRpbmcKLSAgICAgICAgLy8gc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gMSAmJiBtUmVxQ2hhbm5lbENvdW50ID09IDEpIHsKLSAgICAgICAgICAgIG1GcmFtZUNvdW50ID4+PSAxOwotICAgICAgICB9CisgICAgLy8gT3Zlci1hbGxvY2F0ZSBiZXlvbmQgbVJzbXBJbkZyYW1lc1AyIHRvIHBlcm1pdCBhIEhBTCByZWFkIHBhc3QgZW5kIG9mIGJ1ZmZlcgorICAgIHNpemVfdCBidWZmZXJTaXplSW5TaG9ydHMgPSAobVJzbXBJbkZyYW1lc1AyICsgbUZyYW1lQ291bnQgLSAxKSAqIG1DaGFubmVsQ291bnQ7CisgICAgbVJzbXBJbkJ1ZmZlciA9IG5ldyBpbnQxNl90W2J1ZmZlclNpemVJblNob3J0c107CisgICAgbWVtc2V0KG1Sc21wSW5CdWZmZXIsIDAsIGJ1ZmZlclNpemVJblNob3J0cyAqIHNpemVvZihtUnNtcEluQnVmZmVyWzBdKSk7CiAKLSAgICB9Ci0gICAgbVJzbXBJbkluZGV4ID0gbUZyYW1lQ291bnQ7CisgICAgLy8gQXVkaW9SZWNvcmQgbVNhbXBsZVJhdGUgYW5kIG1DaGFubmVsQ291bnQgYXJlIGNvbnN0YW50IGR1ZSB0byBBdWRpb1JlY29yZCBBUEkgY29uc3RyYWludHMuCisgICAgLy8gQnV0IGlmIHRocmVhZCdzIG1TYW1wbGVSYXRlIG9yIG1DaGFubmVsQ291bnQgY2hhbmdlcywgaG93IHdpbGwgdGhhdCBhZmZlY3QgYWN0aXZlIHRyYWNrcz8KIH0KIAotdW5zaWduZWQgaW50IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpnZXRJbnB1dEZyYW1lc0xvc3QoKQordWludDMyX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmdldElucHV0RnJhbWVzTG9zdCgpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAoaW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKQEAgLTUzMTMsMTUgKzYyMDcsMjAgQEAKIHsKICAgICAvLyBvbmx5IG9uZSBjaGFpbiBwZXIgaW5wdXQgdGhyZWFkCiAgICAgaWYgKG1FZmZlY3RDaGFpbnMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgQUxPR1coImFkZEVmZmVjdENoYWluX2woKSBhbHJlYWR5IG9uZSBjaGFpbiAlcCBvbiB0aHJlYWQgJXAiLCBjaGFpbi5nZXQoKSwgdGhpcyk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgQUxPR1YoImFkZEVmZmVjdENoYWluX2woKSAlcCBvbiB0aHJlYWQgJXAiLCBjaGFpbi5nZXQoKSwgdGhpcyk7Ci0KKyAgICBjaGFpbi0+c2V0VGhyZWFkKHRoaXMpOwogICAgIGNoYWluLT5zZXRJbkJ1ZmZlcihOVUxMKTsKICAgICBjaGFpbi0+c2V0T3V0QnVmZmVyKE5VTEwpOwogCiAgICAgY2hlY2tTdXNwZW5kT25BZGRFZmZlY3RDaGFpbl9sKGNoYWluKTsKIAorICAgIC8vIG1ha2Ugc3VyZSBlbmFibGVkIHByZSBwcm9jZXNzaW5nIGVmZmVjdHMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIHRoZSBIQUwgYXMgd2UKKyAgICAvLyBqdXN0IG1vdmVkIHRoZW0gdG8gYSBuZXcgaW5wdXQgc3RyZWFtLgorICAgIGNoYWluLT5zeW5jSGFsRWZmZWN0c1N0YXRlKCk7CisKICAgICBtRWZmZWN0Q2hhaW5zLmFkZChjaGFpbik7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC01MzM5LDQgKzYyMzgsODAgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKG1JbnB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgLy8gc3RvcmUgbmV3IGRldmljZSBhbmQgc2VuZCB0byBlZmZlY3RzCisgICAgICAgIG1JbkRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtSW5EZXZpY2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlCisgICAgICAgIC8vIHByZSBwcm9jZXNzaW5ncworICAgICAgICBpZiAobVRyYWNrcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBib29sIHN1c3BlbmQgPSBhdWRpb19pc19ibHVldG9vdGhfc2NvX2RldmljZShtSW5EZXZpY2UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXItPmJ0TnJlY0lzT2ZmKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9BRUMsIHN1c3BlbmQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX05TLCBzdXNwZW5kLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc3RvcmUgbmV3IHNvdXJjZSBhbmQgc2VuZCB0byBlZmZlY3RzCisgICAgICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UpIHsKKyAgICAgICAgICAgIG1BdWRpb1NvdXJjZSA9IHBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0QXVkaW9Tb3VyY2VfbChtQXVkaW9Tb3VyY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOworICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+Y3JlYXRlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJjcmVhdGVBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKG1JbnB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOworICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZV9hdWRpb19wYXRjaChod0RldmljZSwgaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgInJlbGVhc2VBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1UcmFja3MuYWRkKHJlY29yZCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmRlbGV0ZVBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZGVzdHJveVRyYWNrX2wocmVjb3JkKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIFRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtSW5wdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOworICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IG1BdWRpb1NvdXJjZTsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCmluZGV4IGJiOTJkZjEuLmVjYjhlNGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaApAQCAtMzYsNiArMzYsOCBAQAogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgdHlwZV90IHR5cGUpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflRocmVhZEJhc2UoKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVhZHlUb1J1bigpOworCiAgICAgdm9pZCBkdW1wQmFzZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZvaWQgZHVtcEVmZmVjdENoYWlucyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC00NCw2MCArNDYsMTY5IEBACiAgICAgLy8gYmFzZSBmb3IgcmVjb3JkIGFuZCBwbGF5YmFjawogICAgIGVudW0gewogICAgICAgICBDRkdfRVZFTlRfSU8sCi0gICAgICAgIENGR19FVkVOVF9QUklPCisgICAgICAgIENGR19FVkVOVF9QUklPLAorICAgICAgICBDRkdfRVZFTlRfU0VUX1BBUkFNRVRFUiwKKyAgICAgICAgQ0ZHX0VWRU5UX0NSRUFURV9BVURJT19QQVRDSCwKKyAgICAgICAgQ0ZHX0VWRU5UX1JFTEVBU0VfQVVESU9fUEFUQ0gsCiAgICAgfTsKIAotICAgIGNsYXNzIENvbmZpZ0V2ZW50IHsKKyAgICBjbGFzcyBDb25maWdFdmVudERhdGE6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIENvbmZpZ0V2ZW50KGludCB0eXBlKSA6IG1UeXBlKHR5cGUpIHt9Ci0gICAgICAgIHZpcnR1YWwgfkNvbmZpZ0V2ZW50KCkge30KLQotICAgICAgICAgICAgICAgICBpbnQgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CisgICAgICAgIHZpcnR1YWwgfkNvbmZpZ0V2ZW50RGF0YSgpIHt9CiAKICAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpID0gMDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IGludCBtVHlwZTsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIENvbmZpZ0V2ZW50RGF0YSgpIHt9CiAgICAgfTsKIAotICAgIGNsYXNzIElvQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgewotICAgIHB1YmxpYzoKLSAgICAgICAgSW9Db25maWdFdmVudChpbnQgZXZlbnQsIGludCBwYXJhbSkgOgotICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX0lPKSwgbUV2ZW50KGV2ZW50KSwgbVBhcmFtKGV2ZW50KSB7fQotICAgICAgICB2aXJ0dWFsIH5Jb0NvbmZpZ0V2ZW50KCkge30KKyAgICAvLyBDb25maWcgZXZlbnQgc2VxdWVuY2UgYnkgY2xpZW50IGlmIHN0YXR1cyBuZWVkZWQgKGUuZyBiaW5kZXIgdGhyZWFkIGNhbGxpbmcgc2V0UGFyYW1ldGVycygpKToKKyAgICAvLyAgMS4gY3JlYXRlIFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50LiBUaGlzIHNldHMgbVdhaXRTdGF0dXMgaW4gY29uZmlnIGV2ZW50CisgICAgLy8gIDIuIExvY2sgbUxvY2sKKyAgICAvLyAgMy4gQ2FsbCBzZW5kQ29uZmlnRXZlbnRfbCgpOiBBcHBlbmQgdG8gbUNvbmZpZ0V2ZW50cyBhbmQgbVdhaXRXb3JrQ1Yuc2lnbmFsCisgICAgLy8gIDQuIHNlbmRDb25maWdFdmVudF9sKCkgcmVhZHMgc3RhdHVzIGZyb20gZXZlbnQtPm1TdGF0dXM7CisgICAgLy8gIDUuIHNlbmRDb25maWdFdmVudF9sKCkgcmV0dXJucyBzdGF0dXMKKyAgICAvLyAgNi4gVW5sb2NrCisgICAgLy8KKyAgICAvLyBQYXJhbWV0ZXIgc2VxdWVuY2UgYnkgc2VydmVyOiB0aHJlYWRMb29wIGNhbGxpbmcgcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCk6CisgICAgLy8gMS4gTG9jayBtTG9jaworICAgIC8vIDIuIElmIHRoZXJlIGlzIGFuIGVudHJ5IGluIG1Db25maWdFdmVudHMgcHJvY2VlZCAuLi4KKyAgICAvLyAzLiBSZWFkIGZpcnN0IGVudHJ5IGluIG1Db25maWdFdmVudHMKKyAgICAvLyA0LiBSZW1vdmUgZmlyc3QgZW50cnkgZnJvbSBtQ29uZmlnRXZlbnRzCisgICAgLy8gNS4gUHJvY2VzcworICAgIC8vIDYuIFNldCBldmVudC0+bVN0YXR1cworICAgIC8vIDcuIGV2ZW50LT5tQ29uZC5zaWduYWwKKyAgICAvLyA4LiBVbmxvY2sKIAotICAgICAgICAgICAgICAgIGludCBldmVudCgpIGNvbnN0IHsgcmV0dXJuIG1FdmVudDsgfQotICAgICAgICAgICAgICAgIGludCBwYXJhbSgpIGNvbnN0IHsgcmV0dXJuIG1QYXJhbTsgfQorICAgIGNsYXNzIENvbmZpZ0V2ZW50OiBwdWJsaWMgUmVmQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5Db25maWdFdmVudCgpIHt9CisKKyAgICAgICAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsgbURhdGEtPmR1bXAoYnVmZmVyLCBzaXplKTsgfQorCisgICAgICAgIGNvbnN0IGludCBtVHlwZTsgLy8gZXZlbnQgdHlwZSBlLmcuIENGR19FVkVOVF9JTworICAgICAgICBNdXRleCBtTG9jazsgICAgIC8vIG11dGV4IGFzc29jaWF0ZWQgd2l0aCBtQ29uZAorICAgICAgICBDb25kaXRpb24gbUNvbmQ7IC8vIGNvbmRpdGlvbiBmb3Igc3RhdHVzIHJldHVybgorICAgICAgICBzdGF0dXNfdCBtU3RhdHVzOyAvLyBzdGF0dXMgY29tbXVuaWNhdGVkIHRvIHNlbmRlcgorICAgICAgICBib29sIG1XYWl0U3RhdHVzOyAvLyB0cnVlIGlmIHNlbmRlciBpcyB3YWl0aW5nIGZvciBzdGF0dXMKKyAgICAgICAgc3A8Q29uZmlnRXZlbnREYXRhPiBtRGF0YTsgICAgIC8vIGV2ZW50IHNwZWNpZmljIHBhcmFtZXRlciBkYXRhCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIENvbmZpZ0V2ZW50KGludCB0eXBlKSA6IG1UeXBlKHR5cGUpLCBtU3RhdHVzKE5PX0VSUk9SKSwgbVdhaXRTdGF0dXMoZmFsc2UpLCBtRGF0YShOVUxMKSB7fQorICAgIH07CisKKyAgICBjbGFzcyBJb0NvbmZpZ0V2ZW50RGF0YSA6IHB1YmxpYyBDb25maWdFdmVudERhdGEgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW9Db25maWdFdmVudERhdGEoaW50IGV2ZW50LCBpbnQgcGFyYW0pIDoKKyAgICAgICAgICAgIG1FdmVudChldmVudCksIG1QYXJhbShwYXJhbSkge30KIAogICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewogICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiSU8gZXZlbnQ6IGV2ZW50ICVkLCBwYXJhbSAlZFxuIiwgbUV2ZW50LCBtUGFyYW0pOwogICAgICAgICB9CiAKLSAgICBwcml2YXRlOgogICAgICAgICBjb25zdCBpbnQgbUV2ZW50OwogICAgICAgICBjb25zdCBpbnQgbVBhcmFtOwogICAgIH07CiAKLSAgICBjbGFzcyBQcmlvQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgeworICAgIGNsYXNzIElvQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgewogICAgIHB1YmxpYzoKLSAgICAgICAgUHJpb0NvbmZpZ0V2ZW50KHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pIDoKLSAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9QUklPKSwgbVBpZChwaWQpLCBtVGlkKHRpZCksIG1QcmlvKHByaW8pIHt9Ci0gICAgICAgIHZpcnR1YWwgflByaW9Db25maWdFdmVudCgpIHt9CisgICAgICAgIElvQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0pIDoKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9JTykgeworICAgICAgICAgICAgbURhdGEgPSBuZXcgSW9Db25maWdFdmVudERhdGEoZXZlbnQsIHBhcmFtKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5Jb0NvbmZpZ0V2ZW50KCkge30KKyAgICB9OwogCi0gICAgICAgICAgICAgICAgcGlkX3QgcGlkKCkgY29uc3QgeyByZXR1cm4gbVBpZDsgfQotICAgICAgICAgICAgICAgIHBpZF90IHRpZCgpIGNvbnN0IHsgcmV0dXJuIG1UaWQ7IH0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHByaW8oKSBjb25zdCB7IHJldHVybiBtUHJpbzsgfQorICAgIGNsYXNzIFByaW9Db25maWdFdmVudERhdGEgOiBwdWJsaWMgQ29uZmlnRXZlbnREYXRhIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFByaW9Db25maWdFdmVudERhdGEocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbykgOgorICAgICAgICAgICAgbVBpZChwaWQpLCBtVGlkKHRpZCksIG1QcmlvKHByaW8pIHt9CiAKICAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlByaW8gZXZlbnQ6IHBpZCAlZCwgdGlkICVkLCBwcmlvICVkXG4iLCBtUGlkLCBtVGlkLCBtUHJpbyk7CiAgICAgICAgIH0KIAotICAgIHByaXZhdGU6CiAgICAgICAgIGNvbnN0IHBpZF90IG1QaWQ7CiAgICAgICAgIGNvbnN0IHBpZF90IG1UaWQ7CiAgICAgICAgIGNvbnN0IGludDMyX3QgbVByaW87CiAgICAgfTsKIAorICAgIGNsYXNzIFByaW9Db25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CisgICAgcHVibGljOgorICAgICAgICBQcmlvQ29uZmlnRXZlbnQocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbykgOgorICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX1BSSU8pIHsKKyAgICAgICAgICAgIG1EYXRhID0gbmV3IFByaW9Db25maWdFdmVudERhdGEocGlkLCB0aWQsIHByaW8pOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgflByaW9Db25maWdFdmVudCgpIHt9CisgICAgfTsKKworICAgIGNsYXNzIFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50RGF0YSA6IHB1YmxpYyBDb25maWdFdmVudERhdGEgeworICAgIHB1YmxpYzoKKyAgICAgICAgU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnREYXRhKFN0cmluZzgga2V5VmFsdWVQYWlycykgOgorICAgICAgICAgICAgbUtleVZhbHVlUGFpcnMoa2V5VmFsdWVQYWlycykge30KKworICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiS2V5VmFsdWU6ICVzXG4iLCBtS2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBTdHJpbmc4IG1LZXlWYWx1ZVBhaXJzOworICAgIH07CisKKyAgICBjbGFzcyBTZXRQYXJhbWV0ZXJDb25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CisgICAgcHVibGljOgorICAgICAgICBTZXRQYXJhbWV0ZXJDb25maWdFdmVudChTdHJpbmc4IGtleVZhbHVlUGFpcnMpIDoKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9TRVRfUEFSQU1FVEVSKSB7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyBTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEoa2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBtV2FpdFN0YXR1cyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+U2V0UGFyYW1ldGVyQ29uZmlnRXZlbnQoKSB7fQorICAgIH07CisKKyAgICBjbGFzcyBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhIDogcHVibGljIENvbmZpZ0V2ZW50RGF0YSB7CisgICAgcHVibGljOgorICAgICAgICBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIDoKKyAgICAgICAgICAgIG1QYXRjaChwYXRjaCksIG1IYW5kbGUoaGFuZGxlKSB7fQorCisgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJQYXRjaCBoYW5kbGU6ICV1XG4iLCBtSGFuZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2g7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgfTsKKworICAgIGNsYXNzIENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CisgICAgcHVibGljOgorICAgICAgICBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA6CisgICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfQ1JFQVRFX0FVRElPX1BBVENIKSB7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhKHBhdGNoLCBoYW5kbGUpOworICAgICAgICAgICAgbVdhaXRTdGF0dXMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfkNyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudCgpIHt9CisgICAgfTsKKworICAgIGNsYXNzIFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhIDogcHVibGljIENvbmZpZ0V2ZW50RGF0YSB7CisgICAgcHVibGljOgorICAgICAgICBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YShjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIDoKKyAgICAgICAgICAgIG1IYW5kbGUoaGFuZGxlKSB7fQorCisgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJQYXRjaCBoYW5kbGU6ICV1XG4iLCBtSGFuZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgfTsKKworICAgIGNsYXNzIFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIDoKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9SRUxFQVNFX0FVRElPX1BBVENIKSB7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YShoYW5kbGUpOworICAgICAgICAgICAgbVdhaXRTdGF0dXMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgflJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQoKSB7fQorICAgIH07CiAKICAgICBjbGFzcyBQTURlYXRoUmVjaXBpZW50IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKICAgICBwdWJsaWM6CkBAIC0xMjQsOSArMjM1LDkgQEAKIAogICAgICAgICAgICAgICAgIC8vIGR5bmFtaWMgZXh0ZXJuYWxseS12aXNpYmxlCiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlOyB9Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgICAgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudDsgfQogICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrOyB9Ci0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1IQUxGb3JtYXQ7IH0KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50OyB9CiAgICAgICAgICAgICAgICAgLy8gQ2FsbGVkIGJ5IEF1ZGlvRmxpbmdlcjo6ZnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGFuZCBlZmZlY3RzLAogICAgICAgICAgICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSBbbm9ybWFsIG1peF0gYnVmZmVyJ3MgZnJhbWUgY291bnQuCiAgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudCgpIGNvbnN0ID0gMDsKQEAgLTEzNSwxNCArMjQ2LDI5IEBACiAgICAgLy8gU2hvdWxkIGJlICJ2aXJ0dWFsIHN0YXR1c190IHJlcXVlc3RFeGl0QW5kV2FpdCgpIiBhbmQgb3ZlcnJpZGUgc2FtZQogICAgIC8vIG1ldGhvZCBpbiBUaHJlYWQsIGJ1dCBUaHJlYWQ6OnJlcXVlc3RFeGl0QW5kV2FpdCgpIGlzIG5vdCB5ZXQgdmlydHVhbC4KICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7Ci0gICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSA9IDA7CisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cykgPSAwOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKSA9IDA7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKSA9IDA7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtID0gMCkgPSAwOworICAgICAgICAgICAgICAgIC8vIHNlbmRDb25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCisgICAgICAgICAgICAgICAgLy8gQ2FuIHRlbXBvcmFyaWx5IHJlbGVhc2UgdGhlIGxvY2sgaWYgd2FpdGluZyBmb3IgYSByZXBseSBmcm9tCisgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkuCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbmZpZ0V2ZW50X2woc3A8Q29uZmlnRXZlbnQ+JiBldmVudCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFByaW9Db25maWdFdmVudF9sKHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pOwotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHMoKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnRfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIpOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKSA9IDA7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOworCiAKICAgICAgICAgICAgICAgICAvLyBzZWUgbm90ZSBhdCBkZWNsYXJhdGlvbiBvZiBtU3RhbmRieSwgbU91dERldmljZSBhbmQgbUluRGV2aWNlCiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgc3RhbmRieSgpIGNvbnN0IHsgcmV0dXJuIG1TdGFuZGJ5OyB9CkBAIC0xNTgsMTAgKzI4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOwotICAgICAgICAgICAgICAgIHZvaWQgZGlzY29ubmVjdEVmZmVjdChjb25zdCBzcDwgRWZmZWN0TW9kdWxlPiYgZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1bnBpbklmTGFzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLyk7CiAKICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWVzIGZvciBoYXNBdWRpb1Nlc3Npb24gKGJpdCBmaWVsZCkKICAgICAgICAgICAgICAgICBlbnVtIGVmZmVjdF9zdGF0ZSB7CkBAIC0yMDAsMTMgKzMyMywxMyBAQAogICAgICAgICAgICAgICAgIC8vIGVmZmVjdAogICAgICAgICAgICAgICAgIHZvaWQgcmVtb3ZlRWZmZWN0X2woY29uc3Qgc3A8IEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CiAgICAgICAgICAgICAgICAgLy8gZGV0YWNoIGFsbCB0cmFja3MgY29ubmVjdGVkIHRvIGFuIGF1eGlsaWFyeSBlZmZlY3QKLSAgICB2aXJ0dWFsICAgICB2b2lkIGRldGFjaEF1eEVmZmVjdF9sKGludCBlZmZlY3RJZCkge30KKyAgICB2aXJ0dWFsICAgICB2b2lkIGRldGFjaEF1eEVmZmVjdF9sKGludCBlZmZlY3RJZCBfX3VudXNlZCkge30KICAgICAgICAgICAgICAgICAvLyByZXR1cm5zIGVpdGhlciBFRkZFQ1RfU0VTU0lPTiBpZiBlZmZlY3RzIG9uIHRoaXMgYXVkaW8gc2Vzc2lvbiBleGlzdCBpbiBvbmUKICAgICAgICAgICAgICAgICAvLyBjaGFpbiwgb3IgVFJBQ0tfU0VTU0lPTiBpZiB0cmFja3Mgb24gdGhpcyBhdWRpbyBzZXNzaW9uIGV4aXN0LCBvciBib3RoCiAgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb24oaW50IHNlc3Npb25JZCkgY29uc3QgPSAwOwogICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIG5vdCBpbXBvcnRhbnQgYXMgdGhlCiAgICAgICAgICAgICAgICAgLy8gc3RyYXRlZ3kgaXMgb25seSBtZWFuaW5nZnVsIGZvciBQbGF5YmFja1RocmVhZCB3aGljaCBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kCi0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclNlc3Npb25fbChpbnQgc2Vzc2lvbklkKSB7IHJldHVybiAwOyB9CisgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclNlc3Npb25fbChpbnQgc2Vzc2lvbklkIF9fdW51c2VkKSB7IHJldHVybiAwOyB9CiAKICAgICAgICAgICAgICAgICAvLyBzdXNwZW5kIG9yIHJlc3RvcmUgZWZmZWN0IGFjY29yZGluZyB0byB0aGUgdHlwZSBvZiBlZmZlY3QgcGFzc2VkLiBhIE5VTEwKICAgICAgICAgICAgICAgICAvLyB0eXBlIHBvaW50ZXIgbWVhbnMgc3VzcGVuZCBhbGwgZWZmZWN0cyBpbiB0aGUgc2Vzc2lvbgpAQCAtMjI1LDYgKzM0OCwxNSBAQAogICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KSA9IDA7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBib29sICAgICAgICBpc1ZhbGlkU3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KSBjb25zdCA9IDA7CiAKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSByZWZlcmVuY2UgdG8gYSBwZXItdGhyZWFkIGhlYXAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWxsb2NhdGUgSU1lbW9yeQorICAgICAgICAgICAgICAgIC8vIG9iamVjdHMgdGhhdCB3aWxsIGJlIHJlYWQtb25seSB0byBjbGllbnQgcHJvY2Vzc2VzLCByZWFkL3dyaXRlIHRvIG1lZGlhc2VydmVyLAorICAgICAgICAgICAgICAgIC8vIGFuZCBzaGFyZWQgYnkgYWxsIGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIHRocmVhZC4KKyAgICAgICAgICAgICAgICAvLyBUaGUgaGVhcCBpcyBwZXItdGhyZWFkIHJhdGhlciB0aGFuIGNvbW1vbiBhY3Jvc3MgYWxsIHRocmVhZHMsIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAvLyBjbGllbnRzIGNhbid0IGJlIHRydXN0ZWQgbm90IHRvIG1vZGlmeSB0aGUgb2Zmc2V0IG9mIHRoZSBJTWVtb3J5IHRoZXkgcmVjZWl2ZS4KKyAgICAgICAgICAgICAgICAvLyBJZiBhIHRocmVhZCBkb2VzIG5vdCBoYXZlIHN1Y2ggYSBoZWFwLCB0aGlzIG1ldGhvZCByZXR1cm5zIDAuCisgICAgICAgICAgICAgICAgdmlydHVhbCBzcDxNZW1vcnlEZWFsZXI+ICAgIHJlYWRPbmx5SGVhcCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gcGlwZU1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KIAogICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogCkBAIC0yNjksNDggKzQwMSwyOSBAQAogCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiAgbUF1ZGlvRmxpbmdlcjsKIAotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgYnkgUGxheWJhY2tUaHJlYWQ6OnJlYWRPdXRwdXRQYXJhbWV0ZXJzKCkgb3IKLSAgICAgICAgICAgICAgICAvLyBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnMoKQorICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgYnkgUGxheWJhY2tUaHJlYWQ6OnJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKSBvcgorICAgICAgICAgICAgICAgIC8vIFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsgICAgICAgLy8gb3V0cHV0IEhBTCwgZGlyZWN0IG91dHB1dCwgcmVjb3JkCiAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgbUNoYW5uZWxNYXNrOwogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CiAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICBtRm9ybWF0OworICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7ICAgICAgICAgICAvLyBTb3VyY2UgZm9ybWF0IGZvciBSZWNvcmRpbmcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmsgZm9ybWF0IGZvciBQbGF5YmFjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luayBmb3JtYXQgbWF5IGJlIGRpZmZlcmVudCB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhBTCBmb3JtYXQgaWYgRmFzdG1peGVyIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUhBTEZvcm1hdDsKKyAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsgICAgICAgLy8gSEFMIGJ1ZmZlciBzaXplIGZvciByZWFkKCkgb3Igd3JpdGUoKQogCi0gICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIHNlcXVlbmNlIGJ5IGNsaWVudDogYmluZGVyIHRocmVhZCBjYWxsaW5nIHNldFBhcmFtZXRlcnMoKToKLSAgICAgICAgICAgICAgICAvLyAgMS4gTG9jayBtTG9jawotICAgICAgICAgICAgICAgIC8vICAyLiBBcHBlbmQgdG8gbU5ld1BhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAvLyAgMy4gbVdhaXRXb3JrQ1Yuc2lnbmFsCi0gICAgICAgICAgICAgICAgLy8gIDQuIG1QYXJhbUNvbmQud2FpdFJlbGF0aXZlIHdpdGggdGltZW91dAotICAgICAgICAgICAgICAgIC8vICA1LiByZWFkIG1QYXJhbVN0YXR1cwotICAgICAgICAgICAgICAgIC8vICA2LiBtV2FpdFdvcmtDVi5zaWduYWwKLSAgICAgICAgICAgICAgICAvLyAgNy4gVW5sb2NrCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgc2VxdWVuY2UgYnkgc2VydmVyOiB0aHJlYWRMb29wIGNhbGxpbmcgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKToKLSAgICAgICAgICAgICAgICAvLyAxLiBMb2NrIG1Mb2NrCi0gICAgICAgICAgICAgICAgLy8gMi4gSWYgdGhlcmUgaXMgYW4gZW50cnkgaW4gbU5ld1BhcmFtZXRlcnMgcHJvY2VlZCAuLi4KLSAgICAgICAgICAgICAgICAvLyAyLiBSZWFkIGZpcnN0IGVudHJ5IGluIG1OZXdQYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgLy8gMy4gUHJvY2VzcwotICAgICAgICAgICAgICAgIC8vIDQuIFJlbW92ZSBmaXJzdCBlbnRyeSBmcm9tIG1OZXdQYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgLy8gNS4gU2V0IG1QYXJhbVN0YXR1cwotICAgICAgICAgICAgICAgIC8vIDYuIG1QYXJhbUNvbmQuc2lnbmFsCi0gICAgICAgICAgICAgICAgLy8gNy4gbVdhaXRXb3JrQ1Yud2FpdCB3aXRoIHRpbWVvdXQgKHRoaXMgaXMgdG8gYXZvaWQgb3ZlcndyaXRpbmcgbVBhcmFtU3RhdHVzKQotICAgICAgICAgICAgICAgIC8vIDguIFVubG9jawotICAgICAgICAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgIG1QYXJhbUNvbmQ7Ci0gICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZzg+ICAgICAgICAgbU5ld1BhcmFtZXRlcnM7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVBhcmFtU3RhdHVzOwotCi0gICAgICAgICAgICAgICAgLy8gdmVjdG9yIG93bnMgZWFjaCBDb25maWdFdmVudCAqLCBzbyBtdXN0IGRlbGV0ZSBhZnRlciByZW1vdmluZwotICAgICAgICAgICAgICAgIFZlY3RvcjxDb25maWdFdmVudCAqPiAgICAgbUNvbmZpZ0V2ZW50czsKKyAgICAgICAgICAgICAgICBWZWN0b3I8IHNwPENvbmZpZ0V2ZW50PiA+ICAgICBtQ29uZmlnRXZlbnRzOwogCiAgICAgICAgICAgICAgICAgLy8gVGhlc2UgZmllbGRzIGFyZSB3cml0dGVuIGFuZCByZWFkIGJ5IHRocmVhZCBpdHNlbGYgd2l0aG91dCBsb2NrIG9yIGJhcnJpZXIsCi0gICAgICAgICAgICAgICAgLy8gYW5kIHJlYWQgYnkgb3RoZXIgdGhyZWFkcyB3aXRob3V0IGxvY2sgb3IgYmFycmllciB2aWEgc3RhbmRieSgpICwgb3V0RGV2aWNlKCkKKyAgICAgICAgICAgICAgICAvLyBhbmQgcmVhZCBieSBvdGhlciB0aHJlYWRzIHdpdGhvdXQgbG9jayBvciBiYXJyaWVyIHZpYSBzdGFuZGJ5KCksIG91dERldmljZSgpCiAgICAgICAgICAgICAgICAgLy8gYW5kIGluRGV2aWNlKCkuCiAgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSBvZiB0aGUgYWJzZW5jZSBvZiBhIGxvY2sgb3IgYmFycmllciwgYW55IG90aGVyIHRocmVhZCB0aGF0IHJlYWRzCiAgICAgICAgICAgICAgICAgLy8gdGhlc2UgZmllbGRzIG11c3QgdXNlIHRoZSBpbmZvcm1hdGlvbiBpbiBpc29sYXRpb24sIG9yIGJlIHByZXBhcmVkIHRvIGRlYWwKICAgICAgICAgICAgICAgICAvLyB3aXRoIHBvc3NpYmlsaXR5IHRoYXQgaXQgbWlnaHQgYmUgaW5jb25zaXN0ZW50IHdpdGggb3RoZXIgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnk7ICAgLy8gV2hldGhlciB0aHJlYWQgaXMgY3VycmVudGx5IGluIHN0YW5kYnkuCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnk7ICAgICAvLyBXaGV0aGVyIHRocmVhZCBpcyBjdXJyZW50bHkgaW4gc3RhbmRieS4KICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtT3V0RGV2aWNlOyAgIC8vIG91dHB1dCBkZXZpY2UKICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtSW5EZXZpY2U7ICAgIC8vIGlucHV0IGRldmljZQogICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90ICAgICAgICAgIG1BdWRpb1NvdXJjZTsgLy8gKHNlZSBhdWRpby5oLCBhdWRpb19zb3VyY2VfdCkKQEAgLTM2MCw3ICs0NzMsNiBAQAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHJlYWR5VG9SdW4oKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7CiAKICAgICAvLyBSZWZCYXNlCkBAIC0zOTMsNyArNTA1LDcgQEAKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB3YWl0aW5nQXN5bmNDYWxsYmFjaygpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHdhaXRpbmdBc3luY0NhbGxiYWNrX2woKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBzaG91bGRTdGFuZGJ5X2woKTsKLQorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uQWRkTmV3VHJhY2tfbCgpOwogCiAgICAgLy8gVGhyZWFkQmFzZSB2aXJ0dWFscwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHByZUV4aXQoKTsKQEAgLTQyMSwxMyArNTMzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8pOwogCiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIGdldE91dHB1dCgpIGNvbnN0OwogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBjbGVhck91dHB1dCgpOwpAQCAtNDQ3LDkgKzU1OSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1TdXNwZW5kZWQpID4gMDsgfQogCiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFJlbmRlclBvc2l0aW9uKHNpemVfdCAqaGFsRnJhbWVzLCBzaXplX3QgKmRzcEZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgaW50MTZfdCAgICAgKm1peEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1NaXhCdWZmZXI7IH07CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcyk7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgcmVuYW1lIG1peEJ1ZmZlcigpIHRvIHNpbmtCdWZmZXIoKSBhbmQgcmVtb3ZlIGludDE2X3QqIGRlcGVuZGVuY3kuCisgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgYWxzbyByZW1vdmluZyBhbmQgcGFzc2luZyBhbiBleHBsaWNpdCBtTWFpbkJ1ZmZlciBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciB0byBBRjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpUcmFjaygpLgorICAgICAgICAgICAgICAgIGludDE2X3QgICAgICptaXhCdWZmZXIoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4obVNpbmtCdWZmZXIpOyB9OwogCiAgICAgdmlydHVhbCAgICAgdm9pZCBkZXRhY2hBdXhFZmZlY3RfbChpbnQgZWZmZWN0SWQpOwogICAgICAgICAgICAgICAgIHN0YXR1c190IGF0dGFjaEF1eEVmZmVjdChjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjaz4gdHJhY2ssCkBAIC00NzQsMTQgKzU5MCw3NiBAQAogICAgICAgICAgICAgICAgIC8vIFJldHVybidzIHRoZSBIQUwncyBmcmFtZSBjb3VudCBpLmUuIGZhc3QgbWl4ZXIgYnVmZmVyIHNpemUuCiAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudEhBTCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CiAKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgIGdldFRpbWVzdGFtcF9sKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFRpbWVzdGFtcF9sKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOworCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFRyYWNrPiYgdHJhY2spOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKTsKKworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKIHByb3RlY3RlZDoKLSAgICAvLyB1cGRhdGVkIGJ5IHJlYWRPdXRwdXRQYXJhbWV0ZXJzKCkKKyAgICAvLyB1cGRhdGVkIGJ5IHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKQogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQ7ICAvLyBub3JtYWwgbWl4ZXIgYW5kIGVmZmVjdHMKIAotICAgIGludDE2X3QqICAgICAgICAgICAgICAgICAgICAgICAgbU1peEJ1ZmZlcjsgICAgICAgICAvLyBmcmFtZSBzaXplIGFsaWduZWQgbWl4IGJ1ZmZlcgotICAgIGludDhfdCogICAgICAgICAgICAgICAgICAgICAgICAgbUFsbG9jTWl4QnVmZmVyOyAgICAvLyBtaXhlciBidWZmZXIgYWxsb2NhdGlvbiBhZGRyZXNzCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBtU2lua0J1ZmZlcjsgICAgICAgICAvLyBmcmFtZSBzaXplIGFsaWduZWQgc2luayBidWZmZXIKKworICAgIC8vIFRPRE86CisgICAgLy8gUmVhcnJhbmdlIHRoZSBidWZmZXIgaW5mbyBpbnRvIGEgc3RydWN0L2NsYXNzIHdpdGgKKyAgICAvLyBjbGVhciwgY29weSwgY29uc3RydWN0aW9uLCBkZXN0cnVjdGlvbiBtZXRob2RzLgorICAgIC8vCisgICAgLy8gbVNpbmtCdWZmZXIgYWxzbyBoYXMgYXNzb2NpYXRlZCB3aXRoIGl0OgorICAgIC8vCisgICAgLy8gbVNpbmtCdWZmZXJTaXplOiBTaW5rIEJ1ZmZlciBTaXplCisgICAgLy8gbUZvcm1hdDogU2luayBCdWZmZXIgRm9ybWF0CisKKyAgICAvLyBNaXhlciBCdWZmZXIgKG1NaXhlckJ1ZmZlciopCisgICAgLy8KKyAgICAvLyBJbiB0aGUgY2FzZSBvZiBmbG9hdGluZyBwb2ludCBvciBtdWx0aWNoYW5uZWwgZGF0YSwgd2hpY2ggaXMgbm90IGluIHRoZQorICAgIC8vIHNpbmsgZm9ybWF0LCBpdCBpcyByZXF1aXJlZCB0byBhY2N1bXVsYXRlIGluIGEgaGlnaGVyIHByZWNpc2lvbiBvciBncmVhdGVyIGNoYW5uZWwgY291bnQKKyAgICAvLyBidWZmZXIgYmVmb3JlIGRvd25taXhpbmcgb3IgZGF0YSBjb252ZXJzaW9uIHRvIHRoZSBzaW5rIGJ1ZmZlci4KKworICAgIC8vIFNldCB0byAidHJ1ZSIgdG8gZW5hYmxlIHRoZSBNaXhlciBCdWZmZXIgb3RoZXJ3aXNlIG1peGVyIG91dHB1dCBnb2VzIHRvIHNpbmsgYnVmZmVyLgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyRW5hYmxlZDsKKworICAgIC8vIFN0b3JhZ2UsIDMyIGJ5dGUgYWxpZ25lZCAobWF5IG1ha2UgdGhpcyBhbGlnbm1lbnQgYSByZXF1aXJlbWVudCBsYXRlcikuCisgICAgLy8gRHVlIHRvIGNvbnN0cmFpbnRzIG9uIG1Ob3JtYWxGcmFtZUNvdW50LCB0aGUgYnVmZmVyIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNiBmcmFtZXMuCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXI7CisKKyAgICAvLyBTaXplIG9mIG1NaXhlckJ1ZmZlciBpbiBieXRlczogbU5vcm1hbEZyYW1lQ291bnQgKiAjY2hhbm5lbHMgKiBzYW1wc2l6ZS4KKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclNpemU7CisKKyAgICAvLyBUaGUgYXVkaW8gZm9ybWF0IG9mIG1NaXhlckJ1ZmZlci4gU2V0IHRvIEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkgb25seS4KKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdDsKKworICAgIC8vIEFuIGludGVybmFsIGZsYWcgc2V0IHRvIHRydWUgYnkgTWl4ZXJUaHJlYWQ6OnByZXBhcmVUcmFja3NfbCgpCisgICAgLy8gd2hlbiBtTWl4ZXJCdWZmZXIgY29udGFpbnMgdmFsaWQgZGF0YSBhZnRlciBtaXhpbmcuCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJWYWxpZDsKKworICAgIC8vIEVmZmVjdHMgQnVmZmVyIChtRWZmZWN0c0J1ZmZlciopCisgICAgLy8KKyAgICAvLyBJbiB0aGUgY2FzZSBvZiBlZmZlY3RzIGRhdGEsIHdoaWNoIGlzIG5vdCBpbiB0aGUgc2luayBmb3JtYXQsCisgICAgLy8gaXQgaXMgcmVxdWlyZWQgdG8gYWNjdW11bGF0ZSBpbiBhIGRpZmZlcmVudCBidWZmZXIgYmVmb3JlIGRhdGEgY29udmVyc2lvbgorICAgIC8vIHRvIHRoZSBzaW5rIGJ1ZmZlci4KKworICAgIC8vIFNldCB0byAidHJ1ZSIgdG8gZW5hYmxlIHRoZSBFZmZlY3RzIEJ1ZmZlciBvdGhlcndpc2UgZWZmZWN0cyBvdXRwdXQgZ29lcyB0byBzaW5rIGJ1ZmZlci4KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJFbmFibGVkOworCisgICAgLy8gU3RvcmFnZSwgMzIgYnl0ZSBhbGlnbmVkIChtYXkgbWFrZSB0aGlzIGFsaWdubWVudCBhIHJlcXVpcmVtZW50IGxhdGVyKS4KKyAgICAvLyBEdWUgdG8gY29uc3RyYWludHMgb24gbU5vcm1hbEZyYW1lQ291bnQsIHRoZSBidWZmZXIgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDE2IGZyYW1lcy4KKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXI7CisKKyAgICAvLyBTaXplIG9mIG1FZmZlY3RzQnVmZmVyIGluIGJ5dGVzOiBtTm9ybWFsRnJhbWVDb3VudCAqICNjaGFubmVscyAqIHNhbXBzaXplLgorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlclNpemU7CisKKyAgICAvLyBUaGUgYXVkaW8gZm9ybWF0IG9mIG1FZmZlY3RzQnVmZmVyLiBTZXQgdG8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgb25seS4KKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJGb3JtYXQ7CisKKyAgICAvLyBBbiBpbnRlcm5hbCBmbGFnIHNldCB0byB0cnVlIGJ5IE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKQorICAgIC8vIHdoZW4gbUVmZmVjdHNCdWZmZXIgY29udGFpbnMgdmFsaWQgZGF0YSBhZnRlciBtaXhpbmcuCisgICAgLy8KKyAgICAvLyBXaGVuIHRoaXMgaXMgc2V0LCBhbGwgbWl4ZXIgZGF0YSBpcyByb3V0ZWQgaW50byB0aGUgZWZmZWN0cyBidWZmZXIKKyAgICAvLyBmb3IgYW55IHByb2Nlc3NpbmcgKGluY2x1ZGluZyBvdXRwdXQgcHJvY2Vzc2luZykuCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyVmFsaWQ7CiAKICAgICAvLyBzdXNwZW5kIGNvdW50LCA+IDAgbWVhbnMgc3VzcGVuZGVkLiAgV2hpbGUgc3VzcGVuZGVkLCB0aGUgdGhyZWFkIGNvbnRpbnVlcyB0byBwdWxsIGZyb20KICAgICAvLyB0cmFja3MgYW5kIG1peCwgYnV0IGRvZXNuJ3Qgd3JpdGUgdG8gSEFMLiAgQTJEUCBhbmQgU0NPIEhBTCBpbXBsZW1lbnRhdGlvbnMgY2FuJ3QgaGFuZGxlCkBAIC01MDcsNyArNjg1LDggQEAKIAogICAgIC8vIEFsbG9jYXRlIGEgdHJhY2sgbmFtZSBmb3IgYSBnaXZlbiBjaGFubmVsIG1hc2suCiAgICAgLy8gICBSZXR1cm5zIG5hbWUgPj0gMCBpZiBzdWNjZXNzZnVsLCAtMSBvbiBmYWlsdXJlLgotICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIGdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBpbnQgc2Vzc2lvbklkKSA9IDA7CisgICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgc2Vzc2lvbklkKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGVsZXRlVHJhY2tOYW1lX2woaW50IG5hbWUpID0gMDsKIAogICAgIC8vIFRpbWUgdG8gc2xlZXAgYmV0d2VlbiBjeWNsZXMgd2hlbjoKQEAgLTUyOSwxMSArNzA4LDE0IEBACiAKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBjb3JyZWN0TGF0ZW5jeV9sKHVpbnQzMl90IGxhdGVuY3kpIGNvbnN0OwogCisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKwogcHJpdmF0ZToKIAogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAgICAgLy8gZm9yIG51bWVyb3VzCiAKLSAgICBQbGF5YmFja1RocmVhZChjb25zdCBDbGllbnQmKTsKICAgICBQbGF5YmFja1RocmVhZCYgb3BlcmF0b3IgPSAoY29uc3QgUGxheWJhY2tUaHJlYWQmKTsKIAogICAgIHN0YXR1c190ICAgIGFkZFRyYWNrX2woY29uc3Qgc3A8VHJhY2s+JiB0cmFjayk7CkBAIC01NDEsNyArNzIzLDcgQEAKICAgICB2b2lkICAgICAgICByZW1vdmVUcmFja19sKGNvbnN0IHNwPFRyYWNrPiYgdHJhY2spOwogICAgIHZvaWQgICAgICAgIGJyb2FkY2FzdF9sKCk7CiAKLSAgICB2b2lkICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVycygpOworICAgIHZvaWQgICAgICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKTsKIAogICAgIHZpcnR1YWwgdm9pZCBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwpAQCAtNTYwLDcgKzc0Miw3IEBACiAKICAgICAvLyBGSVhNRSByZW5hbWUgdGhlc2UgZm9ybWVyIGxvY2FsIHZhcmlhYmxlcyBvZiB0aHJlYWRMb29wIHRvIHN0YW5kYXJkICJtIiBuYW1lcwogICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRieVRpbWU7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhCdWZmZXJTaXplOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXJTaXplOwogCiAgICAgLy8gY2FjaGVkIGNvcGllcyBvZiBhY3RpdmVTbGVlcFRpbWVVcygpIGFuZCBpZGxlU2xlZXBUaW1lVXMoKSBtYWRlIGJ5IGNhY2hlUGFyYW1ldGVyc19sKCkKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNsZWVwVGltZTsKQEAgLTYyNSwxMyArODA3LDEyIEBACiAgICAgc3A8TkJMb2c6OldyaXRlcj4gICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyOwogcHVibGljOgogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsICAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgZ2V0RmFzdFRyYWNrVW5kZXJydW5zKHNpemVfdCBmYXN0SW5kZXgpIGNvbnN0CisgICAgdmlydHVhbCAgICAgRmFzdFRyYWNrVW5kZXJydW5zIGdldEZhc3RUcmFja1VuZGVycnVucyhzaXplX3QgZmFzdEluZGV4IF9fdW51c2VkKSBjb25zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEZhc3RUcmFja1VuZGVycnVucyBkdW1teTsgcmV0dXJuIGR1bW15OyB9CiAKIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAvLyBhY2Nlc3NlZCBieSBib3RoIGJpbmRlciB0aHJlYWRzIGFuZCB3aXRoaW4gdGhyZWFkTG9vcCgpLCBsb2NrIG9uIG11dGV4IG5lZWRlZAogICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgIG1GYXN0VHJhY2tBdmFpbE1hc2s7ICAgIC8vIGJpdCBpIHNldCBpZiBmYXN0IHRyYWNrIFtpXSBpcyBhdmFpbGFibGUKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBmbHVzaE91dHB1dF9sKCk7CiAKIHByaXZhdGU6CiAgICAgLy8gdGltZXN0YW1wIGxhdGNoOgpAQCAtNjQwLDggKzgyMSwxMSBAQAogICAgIHN0cnVjdCB7CiAgICAgICAgIEF1ZGlvVGltZXN0YW1wICBtVGltZXN0YW1wOwogICAgICAgICB1aW50MzJfdCAgICAgICAgbVVucHJlc2VudGVkRnJhbWVzOworICAgICAgICBLZXllZFZlY3RvcjxUcmFjayAqLCB1aW50MzJfdD4gbUZyYW1lc1JlbGVhc2VkOwogICAgIH0gbUxhdGNoRCwgbUxhdGNoUTsKLSAgICBib29sIG1MYXRjaERWYWxpZDsgIC8vIHRydWUgbWVhbnMgbUxhdGNoRCBpcyB2YWxpZCwgYW5kIGNsb2NrIGl0IGludG8gbGF0Y2ggYXQgbmV4dCBvcHBvcnR1bml0eQorICAgIGJvb2wgbUxhdGNoRFZhbGlkOyAgLy8gdHJ1ZSBtZWFucyBtTGF0Y2hEIGlzIHZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKGV4Y2VwdCBmb3IgbUZyYW1lc1JlbGVhc2VkIHdoaWNoIGlzIGZpbGxlZCBpbiBsYXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYW5kIGNsb2NrIGl0IGludG8gbGF0Y2ggYXQgbmV4dCBvcHBvcnR1bml0eQogICAgIGJvb2wgbUxhdGNoUVZhbGlkOyAgLy8gdHJ1ZSBtZWFucyBtTGF0Y2hRIGlzIHZhbGlkCiB9OwogCkBAIC02NTYsMTIgKzg0MCwxNCBAQAogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAKLSAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpOworICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCAgICAgbWl4ZXJfc3RhdGUgcHJlcGFyZVRyYWNrc19sKFZlY3Rvcjwgc3A8VHJhY2s+ID4gKnRyYWNrc1RvUmVtb3ZlKTsKLSAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgaW50IHNlc3Npb25JZCk7CisgICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgc2Vzc2lvbklkKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSk7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgaWRsZVNsZWVwVGltZVVzKCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc3VzcGVuZFNsZWVwVGltZVVzKCkgY29uc3Q7CkBAIC02NzgsNyArODY0LDcgQEAKICAgICAgICAgICAgICAgICBBdWRpb01peGVyKiBtQXVkaW9NaXhlcjsgICAgLy8gbm9ybWFsIG1peGVyCiBwcml2YXRlOgogICAgICAgICAgICAgICAgIC8vIG9uZS10aW1lIGluaXRpYWxpemF0aW9uLCBubyBsb2NrcyByZXF1aXJlZAotICAgICAgICAgICAgICAgIEZhc3RNaXhlciogIG1GYXN0TWl4ZXI7ICAgICAgICAgLy8gbm9uLU5VTEwgaWYgdGhlcmUgaXMgYWxzbyBhIGZhc3QgbWl4ZXIKKyAgICAgICAgICAgICAgICBzcDxGYXN0TWl4ZXI+ICAgICBtRmFzdE1peGVyOyAgICAgLy8gbm9uLTAgaWYgdGhlcmUgaXMgYWxzbyBhIGZhc3QgbWl4ZXIKICAgICAgICAgICAgICAgICBzcDxBdWRpb1dhdGNoZG9nPiBtQXVkaW9XYXRjaGRvZzsgLy8gbm9uLTAgaWYgdGhlcmUgaXMgYW4gYXVkaW8gd2F0Y2hkb2cgdGhyZWFkCiAKICAgICAgICAgICAgICAgICAvLyBjb250ZW50cyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29uc2lzdGVudCwgbm8gbG9ja3MgcmVxdWlyZWQKQEAgLTY5NCwxMSArODgwLDEyIEBACiAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgbUZhc3RNaXhlckZ1dGV4OyAgICAvLyBmb3IgY29sZCBpZGxlCiAKIHB1YmxpYzoKLSAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCB7IHJldHVybiBtRmFzdE1peGVyICE9IE5VTEw7IH0KKyAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCB7IHJldHVybiBtRmFzdE1peGVyICE9IDA7IH0KICAgICB2aXJ0dWFsICAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgZ2V0RmFzdFRyYWNrVW5kZXJydW5zKHNpemVfdCBmYXN0SW5kZXgpIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RJbmRleCA8IEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUZhc3RNaXhlckR1bXBTdGF0ZS5tVHJhY2tzW2Zhc3RJbmRleF0ubVVuZGVycnVuczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKIH07CiAKIGNsYXNzIERpcmVjdE91dHB1dFRocmVhZCA6IHB1YmxpYyBQbGF5YmFja1RocmVhZCB7CkBAIC03MTAsMTAgKzg5NywxMyBAQAogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAKLSAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpOworICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZmx1c2hId19sKCk7CiAKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgaW50IHNlc3Npb25JZCk7CisgICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgc2Vzc2lvbklkKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSk7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgYWN0aXZlU2xlZXBUaW1lVXMoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBpZGxlU2xlZXBUaW1lVXMoKSBjb25zdDsKQEAgLTc0NSwxOSArOTM1LDE3IEBACiAgICAgT2ZmbG9hZFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+T2ZmbG9hZFRocmVhZCgpIHt9OworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOwogCiBwcm90ZWN0ZWQ6CiAgICAgLy8gdGhyZWFkTG9vcCBzbmlwcGV0cwogICAgIHZpcnR1YWwgICAgIG1peGVyX3N0YXRlIHByZXBhcmVUcmFja3NfbChWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZSk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9leGl0KCk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZmx1c2hPdXRwdXRfbCgpOwogCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgd2FpdGluZ0FzeW5jQ2FsbGJhY2soKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB3YWl0aW5nQXN5bmNDYWxsYmFja19sKCk7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgc2hvdWxkU3RhbmRieV9sKCk7Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZmx1c2hId19sKCk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25BZGROZXdUcmFja19sKCk7CiAKIHByaXZhdGU6CiAgICAgYm9vbCAgICAgICAgbUh3UGF1c2VkOwpAQCAtODQwLDE3ICsxMDI4LDI4IEBACiAKIAogLy8gcmVjb3JkIHRocmVhZAotY2xhc3MgUmVjb3JkVGhyZWFkIDogcHVibGljIFRocmVhZEJhc2UsIHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVzIGZyb20gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgZm9yIHVzZSBieSByZXNhbXBsZXIKK2NsYXNzIFJlY29yZFRocmVhZCA6IHB1YmxpYyBUaHJlYWRCYXNlCiB7CiBwdWJsaWM6CiAKKyAgICBjbGFzcyBSZWNvcmRUcmFjazsKKyAgICBjbGFzcyBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVzIGZyb20gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgZm9yIHVzZSBieSByZXNhbXBsZXIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBSZXNhbXBsZXJCdWZmZXJQcm92aWRlcihSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spIDogbVJlY29yZFRyYWNrKHJlY29yZFRyYWNrKSB7IH0KKyAgICAgICAgdmlydHVhbCB+UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIoKSB7IH0KKyAgICAgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7CisgICAgcHJpdmF0ZToKKyAgICAgICAgUmVjb3JkVHJhY2sgKiBjb25zdCBtUmVjb3JkVHJhY2s7CisgICAgfTsKKwogI2luY2x1ZGUgIlJlY29yZFRyYWNrcy5oIgogCiAgICAgICAgICAgICBSZWNvcmRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAogICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UKQEAgLTg2OSwyMyArMTA2OCwyOCBAQAogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAgICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWFkeVRvUnVuKCk7CiAKICAgICAvLyBSZWZCYXNlCiAgICAgdmlydHVhbCB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIChtSW5wdXQgPT0gTlVMTCkgPyBOT19JTklUIDogTk9fRVJST1I7IH0KKworICAgIHZpcnR1YWwgc3A8TWVtb3J5RGVhbGVyPiAgICByZWFkT25seUhlYXAoKSBjb25zdCB7IHJldHVybiBtUmVhZE9ubHlIZWFwOyB9CisKKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IHBpcGVNZW1vcnkoKSBjb25zdCB7IHJldHVybiBtUGlwZU1lbW9yeTsgfQorCiAgICAgICAgICAgICBzcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+ICBjcmVhdGVSZWNvcmRUcmFja19sKAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLAogICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8pOwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzdGFydChSZWNvcmRUcmFjayogcmVjb3JkVHJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LApAQCAtODk5LDE1ICsxMTAzLDIxIEBACiAgICAgICAgICAgICBBdWRpb1N0cmVhbUluKiBjbGVhcklucHV0KCk7CiAgICAgICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90KiBzdHJlYW0oKSBjb25zdDsKIAotICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKIAotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKTsKKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGNhY2hlUGFyYW1ldGVyc19sKCkge30KICAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOwotICAgICAgICAgICAgdm9pZCAgICAgICAgcmVhZElucHV0UGFyYW1ldGVycygpOwotICAgIHZpcnR1YWwgdW5zaWduZWQgaW50ICBnZXRJbnB1dEZyYW1lc0xvc3QoKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKKworICAgICAgICAgICAgdm9pZCAgICAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CisgICAgdmlydHVhbCB1aW50MzJfdCAgICBnZXRJbnB1dEZyYW1lc0xvc3QoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKICAgICB2aXJ0dWFsIHNpemVfdCByZW1vdmVFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwpAQCAtOTIyLDQ1ICsxMTMyLDczIEBACiAgICAgdmlydHVhbCBib29sICAgICBpc1ZhbGlkU3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KSBjb25zdDsKIAogICAgIHN0YXRpYyB2b2lkIHN5bmNTdGFydEV2ZW50Q2FsbGJhY2soY29uc3Qgd3A8U3luY0V2ZW50PiYgZXZlbnQpOwotICAgICAgICAgICB2b2lkIGhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKIAogICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9Ci0gICAgICAgICAgICBib29sICAgICAgICBoYXNGYXN0UmVjb3JkZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaGFzRmFzdENhcHR1cmUoKSBjb25zdCB7IHJldHVybiBtRmFzdENhcHR1cmUgIT0gMDsgfQorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKIAogcHJpdmF0ZToKLSAgICAgICAgICAgIHZvaWQgY2xlYXJTeW5jU3RhcnRFdmVudCgpOwotCiAgICAgICAgICAgICAvLyBFbnRlciBzdGFuZGJ5IGlmIG5vdCBhbHJlYWR5IGluIHN0YW5kYnksIGFuZCBzZXQgbVN0YW5kYnkgZmxhZwotICAgICAgICAgICAgdm9pZCBzdGFuZGJ5KCk7CisgICAgICAgICAgICB2b2lkICAgIHN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKTsKIAogICAgICAgICAgICAgLy8gQ2FsbCB0aGUgSEFMIHN0YW5kYnkgbWV0aG9kIHVuY29uZGl0aW9uYWxseSwgYW5kIGRvbid0IGNoYW5nZSBtU3RhbmRieSBmbGFnCi0gICAgICAgICAgICB2b2lkIGlucHV0U3RhbmRCeSgpOworICAgICAgICAgICAgdm9pZCAgICBpbnB1dFN0YW5kQnkoKTsKIAogICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiAgICAgICAgICAgICAgICAgICAgICAgKm1JbnB1dDsKICAgICAgICAgICAgIFNvcnRlZFZlY3RvciA8IHNwPFJlY29yZFRyYWNrPiA+ICAgIG1UcmFja3M7Ci0gICAgICAgICAgICAvLyBtQWN0aXZlVHJhY2sgaGFzIGR1YWwgcm9sZXM6ICBpdCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgYWN0aXZlIHRyYWNrLCBhbmQKKyAgICAgICAgICAgIC8vIG1BY3RpdmVUcmFja3MgaGFzIGR1YWwgcm9sZXM6ICBpdCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgYWN0aXZlIHRyYWNrKHMpLCBhbmQKICAgICAgICAgICAgIC8vIGlzIHVzZWQgdG9nZXRoZXIgd2l0aCBtU3RhcnRTdG9wQ29uZCB0byBpbmRpY2F0ZSBzdGFydCgpL3N0b3AoKSBwcm9ncmVzcwotICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+ICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrOworICAgICAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxSZWNvcmRUcmFjaz4gPiAgICAgbUFjdGl2ZVRyYWNrczsKKyAgICAgICAgICAgIC8vIGdlbmVyYXRpb24gY291bnRlciBmb3IgbUFjdGl2ZVRyYWNrcworICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbjsKICAgICAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFN0b3BDb25kOwogCi0gICAgICAgICAgICAvLyB1cGRhdGVkIGJ5IFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVycygpCi0gICAgICAgICAgICBBdWRpb1Jlc2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAqbVJlc2FtcGxlcjsKLSAgICAgICAgICAgIC8vIGludGVybGVhdmVkIHN0ZXJlbyBwYWlycyBvZiBmaXhlZC1wb2ludCBzaWduZWQgUTE5LjEyCi0gICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbVJzbXBPdXRCdWZmZXI7Ci0gICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbVJzbXBJbkJ1ZmZlcjsgLy8gW21GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudF0KLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5JbmRleDsKLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplOyAgICAvLyBzdHJlYW0gYnVmZmVyIHNpemUgZm9yIHJlYWQoKQotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgbVJlcUNoYW5uZWxDb3VudDsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIG1SZXFTYW1wbGVSYXRlOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVhZDsKLSAgICAgICAgICAgIC8vIHN5bmMgZXZlbnQgdHJpZ2dlcmluZyBhY3R1YWwgYXVkaW8gY2FwdHVyZS4gRnJhbWVzIHJlYWQgYmVmb3JlIHRoaXMgZXZlbnQgd2lsbAotICAgICAgICAgICAgLy8gYmUgZHJvcHBlZCBhbmQgdGhlcmVmb3JlIG5vdCByZWFkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAgIHNwPFN5bmNFdmVudD4gICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RhcnRFdmVudDsKLSAgICAgICAgICAgIC8vIG51bWJlciBvZiBjYXB0dXJlZCBmcmFtZXMgdG8gZHJvcCBhZnRlciB0aGUgc3RhcnQgc3luYyBldmVudCBoYXMgYmVlbiByZWNlaXZlZC4KLSAgICAgICAgICAgIC8vIHdoZW4gPCAwLCBtYXhpbXVtIGZyYW1lcyB0byBkcm9wIGJlZm9yZSBzdGFydGluZyBjYXB0dXJlIGV2ZW4gaWYgc3luYyBldmVudCBpcwotICAgICAgICAgICAgLy8gbm90IHJlY2VpdmVkCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzdG9Ecm9wOworICAgICAgICAgICAgLy8gcmVzYW1wbGVyIGNvbnZlcnRzIGlucHV0IGF0IEhBTCBIeiB0byBvdXRwdXQgYXQgQXVkaW9SZWNvcmQgY2xpZW50IEh6CisgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbVJzbXBJbkJ1ZmZlcjsgLy8gc2VlIG5ld1tdIGZvciBkZXRhaWxzIG9uIHRoZSBzaXplCisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluRnJhbWVzOyAgLy8gc2l6ZSBvZiByZXNhbXBsZXIgaW5wdXQgaW4gZnJhbWVzCisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluRnJhbWVzUDI7Ly8gc2l6ZSByb3VuZGVkIHVwIHRvIGEgcG93ZXItb2YtMgorCisgICAgICAgICAgICAvLyByb2xsaW5nIGluZGV4IHRoYXQgaXMgbmV2ZXIgY2xlYXJlZAorICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJblJlYXI7ICAgIC8vIGxhc3QgZmlsbGVkIGZyYW1lICsgMQogCiAgICAgICAgICAgICAvLyBGb3IgZHVtcHN5cwogICAgICAgICAgICAgY29uc3Qgc3A8TkJBSU9fU2luaz4gICAgICAgICAgICAgICAgbVRlZVNpbms7CisKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gICAgICAgICAgICAgIG1SZWFkT25seUhlYXA7CisKKyAgICAgICAgICAgIC8vIG9uZS10aW1lIGluaXRpYWxpemF0aW9uLCBubyBsb2NrcyByZXF1aXJlZAorICAgICAgICAgICAgc3A8RmFzdENhcHR1cmU+ICAgICAgICAgICAgICAgICAgICAgbUZhc3RDYXB0dXJlOyAgIC8vIG5vbi0wIGlmIHRoZXJlIGlzIGFsc28gYSBmYXN0IGNhcHR1cmUKKyAgICAgICAgICAgIC8vIEZJWE1FIGF1ZGlvIHdhdGNoZG9nIHRocmVhZAorCisgICAgICAgICAgICAvLyBjb250ZW50cyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29uc2lzdGVudCwgbm8gbG9ja3MgcmVxdWlyZWQKKyAgICAgICAgICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlICAgICAgICAgICAgICAgIG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZTsKKyNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCisgICAgICAgICAgICAvLyBGSVhNRSBTdGF0ZVF1ZXVlIG9ic2VydmVyIGFuZCBtdXRhdG9yIGR1bXAgZmllbGRzCisjZW5kaWYKKyAgICAgICAgICAgIC8vIEZJWE1FIGF1ZGlvIHdhdGNoZG9nIGR1bXAKKworICAgICAgICAgICAgLy8gYWNjZXNzaWJsZSBvbmx5IHdpdGhpbiB0aGUgdGhyZWFkTG9vcCgpLCBubyBsb2NrcyByZXF1aXJlZAorICAgICAgICAgICAgLy8gICAgICAgICAgbUZhc3RDYXB0dXJlLT5zcSgpICAgICAgLy8gZm9yIG11dGF0aW5nIGFuZCBwdXNoaW5nIHN0YXRlCisgICAgICAgICAgICBpbnQzMl90ICAgICBtRmFzdENhcHR1cmVGdXRleDsgICAgICAvLyBmb3IgY29sZCBpZGxlCisKKyAgICAgICAgICAgIC8vIFRoZSBIQUwgaW5wdXQgc291cmNlIGlzIHRyZWF0ZWQgYXMgbm9uLWJsb2NraW5nLAorICAgICAgICAgICAgLy8gYnV0IGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgYmxvY2tpbmcKKyAgICAgICAgICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgICAgICAgICAgICAgICAgIG1JbnB1dFNvdXJjZTsKKyAgICAgICAgICAgIC8vIFRoZSBzb3VyY2UgZm9yIHRoZSBub3JtYWwgY2FwdHVyZSB0aHJlYWQgdG8gcmVhZCBmcm9tOiBtSW5wdXRTb3VyY2Ugb3IgbVBpcGVTb3VyY2UKKyAgICAgICAgICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxTb3VyY2U7CisgICAgICAgICAgICAvLyBJZiBhIGZhc3QgY2FwdHVyZSBpcyBwcmVzZW50LCB0aGUgbm9uLWJsb2NraW5nIHBpcGUgc2luayB3cml0dGVuIHRvIGJ5IGZhc3QgY2FwdHVyZSwKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSBjbGVhcgorICAgICAgICAgICAgc3A8TkJBSU9fU2luaz4gICAgICAgICAgICAgICAgICAgICAgbVBpcGVTaW5rOworICAgICAgICAgICAgLy8gSWYgYSBmYXN0IGNhcHR1cmUgaXMgcHJlc2VudCwgdGhlIG5vbi1ibG9ja2luZyBwaXBlIHNvdXJjZSByZWFkIGJ5IG5vcm1hbCB0aHJlYWQsCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgY2xlYXIKKyAgICAgICAgICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgICAgICAgICAgICAgICAgIG1QaXBlU291cmNlOworICAgICAgICAgICAgLy8gRGVwdGggb2YgcGlwZSBmcm9tIGZhc3QgY2FwdHVyZSB0byBub3JtYWwgdGhyZWFkIGFuZCBmYXN0IGNsaWVudHMsIGFsd2F5cyBwb3dlciBvZiAyCisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGlwZUZyYW1lc1AyOworICAgICAgICAgICAgLy8gSWYgYSBmYXN0IGNhcHR1cmUgaXMgcHJlc2VudCwgdGhlIFBpcGUgYXMgSU1lbW9yeSwgb3RoZXJ3aXNlIGNsZWFyCisgICAgICAgICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICAgICAgICAgICAgICBtUGlwZU1lbW9yeTsKKworICAgICAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAgICAgICAgICAga0Zhc3RDYXB0dXJlTG9nU2l6ZSA9IDQgKiAxMDI0OworICAgICAgICAgICAgc3A8TkJMb2c6OldyaXRlcj4gICAgICAgICAgICAgICAgICAgbUZhc3RDYXB0dXJlTkJMb2dXcml0ZXI7CisKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GYXN0VHJhY2tBdmFpbDsgICAgLy8gdHJ1ZSBpZiBmYXN0IHRyYWNrIGF2YWlsYWJsZQogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAppbmRleCBjZDIwMWQ5Li45OGJmOTZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCkBAIC0zNCw3ICszNCwyNSBAQAogICAgICAgICBSRVNVTUlORywKICAgICAgICAgQUNUSVZFLAogICAgICAgICBQQVVTSU5HLAotICAgICAgICBQQVVTRUQKKyAgICAgICAgUEFVU0VELAorICAgICAgICBTVEFSVElOR18xLCAgICAgLy8gZm9yIFJlY29yZFRyYWNrIG9ubHkKKyAgICAgICAgU1RBUlRJTkdfMiwgICAgIC8vIGZvciBSZWNvcmRUcmFjayBvbmx5CisgICAgfTsKKworICAgIC8vIHdoZXJlIHRvIGFsbG9jYXRlIHRoZSBkYXRhIGJ1ZmZlcgorICAgIGVudW0gYWxsb2NfdHlwZSB7CisgICAgICAgIEFMTE9DX0NCTEssICAgICAvLyBhbGxvY2F0ZSBpbW1lZGlhdGVseSBhZnRlciBjb250cm9sIGJsb2NrCisgICAgICAgIEFMTE9DX1JFQURPTkxZLCAvLyBhbGxvY2F0ZSBmcm9tIGEgc2VwYXJhdGUgcmVhZC1vbmx5IGhlYXAgcGVyIHRocmVhZAorICAgICAgICBBTExPQ19QSVBFLCAgICAgLy8gZG8gbm90IGFsbG9jYXRlOyB1c2UgdGhlIHBpcGUgYnVmZmVyCisgICAgICAgIEFMTE9DX0xPQ0FMLCAgICAvLyBhbGxvY2F0ZSBhIGxvY2FsIGJ1ZmZlcgorICAgICAgICBBTExPQ19OT05FLCAgICAgLy8gZG8gbm90IGFsbG9jYXRlOnVzZSB0aGUgYnVmZmVyIHBhc3NlZCB0byBUcmFja0Jhc2UgY29uc3RydWN0b3IKKyAgICB9OworCisgICAgZW51bSB0cmFja190eXBlIHsKKyAgICAgICAgVFlQRV9ERUZBVUxULAorICAgICAgICBUWVBFX1RJTUVELAorICAgICAgICBUWVBFX09VVFBVVCwKKyAgICAgICAgVFlQRV9QQVRDSCwKICAgICB9OwogCiAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2UoVGhyZWFkQmFzZSAqdGhyZWFkLApAQCAtNDMsMTEgKzYxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY190eXBlIGFsbG9jID0gQUxMT0NfQ0JMSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlID0gVFlQRV9ERUZBVUxUKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UcmFja0Jhc2UoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24pID0gMDsKQEAgLTU4LDYgKzgwLDE0IEBACiAgICAgICAgICAgICBpbnQgICAgICAgICB1aWQoKSBjb25zdCB7IHJldHVybiBtVWlkOyB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwogCisgICAgICAgICAgICBzcDxJTWVtb3J5PiBnZXRCdWZmZXJzKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlck1lbW9yeTsgfQorICAgICAgICAgICAgdm9pZCogICAgICAgYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlcjsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNUaW1lZFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfVElNRUQpOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc091dHB1dFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfT1VUUFVUKTsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNQYXRjaFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IFRZUEVfUEFUQ0gpOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc0V4dGVybmFsVHJhY2soKSBjb25zdCB7IHJldHVybiAhaXNPdXRwdXRUcmFjaygpICYmICFpc1BhdGNoVHJhY2soKTsgfQorCiBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2UoY29uc3QgVHJhY2tCYXNlJik7CiAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2UmIG9wZXJhdG9yID0gKGNvbnN0IFRyYWNrQmFzZSYpOwpAQCAtNzgsMTUgKzEwOCw2IEBACiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQogCi0gICAgLy8gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBjb250aWd1b3VzIHNsaWNlIG9mIHRoZSB0cmFjayBidWZmZXIuCi0gICAgLy8gUGFyYW1ldGVyICdvZmZzZXQnIGlzIHRoZSByZXF1ZXN0ZWQgc3RhcnQgcG9zaXRpb24sIGV4cHJlc3NlZCBpbgotICAgIC8vIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBmcmFtZSB1bml0cyByZWxhdGl2ZSB0byB0aGUgdHJhY2sgZXBvY2guCi0gICAgLy8gUGFyYW1ldGVyICdmcmFtZXMnIGlzIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoLCBhbHNvIGluIGZyYW1lIHVuaXRzLgotICAgIC8vIEFsd2F5cyByZXR1cm5zIG5vbi1OVUxMLiAgSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvCi0gICAgLy8gdmVyaWZ5IHRoYXQgdGhpcyB3aWxsIGJlIHN1Y2Nlc3NmdWw7IHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzCi0gICAgLy8gZnVuY3Rpb24gd2l0aCBpbnZhbGlkICdvZmZzZXQnIG9yICdmcmFtZXMnIGlzIHVuZGVmaW5lZC4KLSAgICB2b2lkKiBnZXRCdWZmZXIodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBmcmFtZXMpIGNvbnN0OwotCiAgICAgYm9vbCBpc1N0b3BwZWQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAobVN0YXRlID09IFNUT1BQRUQgfHwgbVN0YXRlID09IEZMVVNIRUQpOwogICAgIH0KQEAgLTExOCw2ICsxMzksNyBAQAogICAgIC8qY29uc3QqLyBzcDxDbGllbnQ+IG1DbGllbnQ7ICAgLy8gc2VlIGV4cGxhbmF0aW9uIGF0IH5UcmFja0Jhc2UoKSB3aHkgbm90IGNvbnN0CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqIG1DYmxrOworICAgIHNwPElNZW1vcnk+ICAgICAgICAgbUJ1ZmZlck1lbW9yeTsgIC8vIGN1cnJlbnRseSBub24tMCBmb3IgZmFzdCBSZWNvcmRUcmFjayBvbmx5CiAgICAgdm9pZCogICAgICAgICAgICAgICBtQnVmZmVyOyAgICAvLyBzdGFydCBvZiB0cmFjayBidWZmZXIsIHR5cGljYWxseSBpbiBzaGFyZWQgbWVtb3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHQgZm9yIE91dHB1dFRyYWNrIHdoZW4gaXQgaXMgaW4gbG9jYWwgbWVtb3J5CiAgICAgLy8gd2UgZG9uJ3QgcmVhbGx5IG5lZWQgYSBsb2NrIGZvciB0aGVzZQpAQCAtMTM2LDEwICsxNTgsMjYgQEAKICAgICBjb25zdCBpbnQgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICBtVWlkOwogICAgIFZlY3RvciA8IHNwPFN5bmNFdmVudD4gPm1TeW5jRXZlbnRzOworICAgIGNvbnN0IElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgbUZsYWdzOwogICAgIGNvbnN0IGJvb2wgICAgICAgICAgbUlzT3V0OwogICAgIFNlcnZlclByb3h5KiAgICAgICAgbVNlcnZlclByb3h5OwogICAgIGNvbnN0IGludCAgICAgICAgICAgbUlkOwogICAgIHNwPE5CQUlPX1Npbms+ICAgICAgbVRlZVNpbms7CiAgICAgc3A8TkJBSU9fU291cmNlPiAgICBtVGVlU291cmNlOwogICAgIGJvb2wgICAgICAgICAgICAgICAgbVRlcm1pbmF0ZWQ7CisgICAgdHJhY2tfdHlwZSAgICAgICAgICBtVHlwZTsgICAgICAvLyBtdXN0IGJlIG9uZSBvZiBUWVBFX0RFRkFVTFQsIFRZUEVfT1VUUFVULCBUWVBFX1BBVENIIC4uLgorICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgbVRocmVhZElvSGFuZGxlOyAvLyBJL08gaGFuZGxlIG9mIHRoZSB0aHJlYWQgdGhlIHRyYWNrIGlzIGF0dGFjaGVkIHRvCit9OworCisvLyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IFBhdGNoVHJhY2sgYW5kIFBhdGNoUmVjb3JkLgorLy8gaXQgcHJvdmlkZXMgYnVmZmVyIGFjY2VzcyBtZXRob2RzIHRoYXQgbWFwIHRob3NlIG9mIGEgQ2xpZW50UHJveHkgKHNlZSBBdWRpb1RyYWNrU2hhcmVkLmgpCitjbGFzcyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIKK3sKK3B1YmxpYzoKKworICAgIHZpcnR1YWwgflBhdGNoUHJveHlCdWZmZXJQcm92aWRlcigpIHt9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICpyZXF1ZXN0ZWQgPSBOVUxMKSA9IDA7CisgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcikgPSAwOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKaW5kZXggZDZiOTkwOC4uYjkzMDhmYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgpAQCAtMzQsNiArMzUsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC02NiwxMCArNjgsMTMgQEAKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICBib29sIGlzT3V0KQorICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGJvb2wgaXNPdXQsCisgICAgICAgICAgICBhbGxvY190eXBlIGFsbG9jLAorICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlKQogICAgIDogICBSZWZCYXNlKCksCiAgICAgICAgIG1UaHJlYWQodGhyZWFkKSwKICAgICAgICAgbUNsaWVudChjbGllbnQpLApAQCAtNzksMTUgKzg0LDIwIEBACiAgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLAogICAgICAgICBtRm9ybWF0KGZvcm1hdCksCiAgICAgICAgIG1DaGFubmVsTWFzayhjaGFubmVsTWFzayksCi0gICAgICAgIG1DaGFubmVsQ291bnQocG9wY291bnQoY2hhbm5lbE1hc2spKSwKKyAgICAgICAgbUNoYW5uZWxDb3VudChpc091dCA/CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSA6CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spKSwKICAgICAgICAgbUZyYW1lU2l6ZShhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgPwogICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkgOiBzaXplb2YoaW50OF90KSksCiAgICAgICAgIG1GcmFtZUNvdW50KGZyYW1lQ291bnQpLAogICAgICAgICBtU2Vzc2lvbklkKHNlc3Npb25JZCksCisgICAgICAgIG1GbGFncyhmbGFncyksCiAgICAgICAgIG1Jc091dChpc091dCksCiAgICAgICAgIG1TZXJ2ZXJQcm94eShOVUxMKSwKICAgICAgICAgbUlkKGFuZHJvaWRfYXRvbWljX2luYygmbmV4dFRyYWNrSWQpKSwKLSAgICAgICAgbVRlcm1pbmF0ZWQoZmFsc2UpCisgICAgICAgIG1UZXJtaW5hdGVkKGZhbHNlKSwKKyAgICAgICAgbVR5cGUodHlwZSksCisgICAgICAgIG1UaHJlYWRJb0hhbmRsZSh0aHJlYWQtPmlkKCkpCiB7CiAgICAgLy8gaWYgdGhlIGNhbGxlciBpcyB1cywgdHJ1c3QgdGhlIHNwZWNpZmllZCB1aWQKICAgICBpZiAoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZF9jYWNoZWQgfHwgY2xpZW50VWlkID09IC0xKSB7CkBAIC0xMDEsMjcgKzExMSwyMCBAQAogICAgIC8vIGJhdHRlcnkgdXNhZ2Ugb24gaXQuCiAgICAgbVVpZCA9IGNsaWVudFVpZDsKIAotICAgIC8vIGNsaWVudCA9PSAwIGltcGxpZXMgc2hhcmVkQnVmZmVyID09IDAKLSAgICBBTE9HX0FTU0VSVCghKGNsaWVudCA9PSAwICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSk7Ci0KLSAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICVkIiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksCi0gICAgICAgICAgICBzaGFyZWRCdWZmZXItPnNpemUoKSk7Ci0KICAgICAvLyBBTE9HRCgiQ3JlYXRpbmcgdHJhY2sgd2l0aCAlZCBidWZmZXJzIEAgJWQgYnl0ZXMiLCBidWZmZXJDb3VudCwgYnVmZmVyU2l6ZSk7CiAgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKLSAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IChzaGFyZWRCdWZmZXIgPT0gMCA/IHJvdW5kdXAoZnJhbWVDb3VudCkgOiBmcmFtZUNvdW50KSAqIG1GcmFtZVNpemU7Ci0gICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSAoYnVmZmVyID09IE5VTEwgPyByb3VuZHVwKGZyYW1lQ291bnQpIDogZnJhbWVDb3VudCkgKiBtRnJhbWVTaXplOworICAgIGlmIChidWZmZXIgPT0gTlVMTCAmJiBhbGxvYyA9PSBBTExPQ19DQkxLKSB7CiAgICAgICAgIHNpemUgKz0gYnVmZmVyU2l6ZTsKICAgICB9CiAKICAgICBpZiAoY2xpZW50ICE9IDApIHsKICAgICAgICAgbUNibGtNZW1vcnkgPSBjbGllbnQtPmhlYXAoKS0+YWxsb2NhdGUoc2l6ZSk7Ci0gICAgICAgIGlmIChtQ2Jsa01lbW9yeSAhPSAwKSB7Ci0gICAgICAgICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCAqPihtQ2Jsa01lbW9yeS0+cG9pbnRlcigpKTsKLSAgICAgICAgICAgIC8vIGNhbid0IGFzc3VtZSBtQ2JsayAhPSBOVUxMCi0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtQ2Jsa01lbW9yeSA9PSAwIHx8CisgICAgICAgICAgICAgICAgKG1DYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0ldSIsIHNpemUpOwogICAgICAgICAgICAgY2xpZW50LT5oZWFwKCktPmR1bXAoIkF1ZGlvVHJhY2siKTsKKyAgICAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMTMzLDIyICsxMzYsNTUgQEAKICAgICAvLyBjb25zdHJ1Y3QgdGhlIHNoYXJlZCBzdHJ1Y3R1cmUgaW4tcGxhY2UuCiAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKICAgICAgICAgbmV3KG1DYmxrKSBhdWRpb190cmFja19jYmxrX3QoKTsKLSAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKLSAgICAgICAgbUNibGstPmZyYW1lQ291bnRfID0gZnJhbWVDb3VudDsKLSAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CisgICAgICAgIHN3aXRjaCAoYWxsb2MpIHsKKyAgICAgICAgY2FzZSBBTExPQ19SRUFET05MWTogeworICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiByb0hlYXAodGhyZWFkLT5yZWFkT25seUhlYXAoKSk7CisgICAgICAgICAgICBpZiAocm9IZWFwID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgKG1CdWZmZXJNZW1vcnkgPSByb0hlYXAtPmFsbG9jYXRlKGJ1ZmZlclNpemUpKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIChtQnVmZmVyID0gbUJ1ZmZlck1lbW9yeS0+cG9pbnRlcigpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciByZWFkLW9ubHkgYnVmZmVyIHNpemU9JXp1IiwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJvSGVhcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJvSGVhcC0+ZHVtcCgiYnVmZmVyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlck1lbW9yeS5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1lbXNldChtQnVmZmVyLCAwLCBidWZmZXJTaXplKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQUxMT0NfUElQRToKKyAgICAgICAgICAgIG1CdWZmZXJNZW1vcnkgPSB0aHJlYWQtPnBpcGVNZW1vcnkoKTsKKyAgICAgICAgICAgIC8vIG1CdWZmZXIgaXMgdGhlIHZpcnR1YWwgYWRkcmVzcyBhcyBzZWVuIGZyb20gY3VycmVudCBwcm9jZXNzIChtZWRpYXNlcnZlciksCisgICAgICAgICAgICAvLyBhbmQgc2hvdWxkIG5vcm1hbGx5IGJlIGNvbWluZyBmcm9tIG1CdWZmZXJNZW1vcnktPnBvaW50ZXIoKS4KKyAgICAgICAgICAgIC8vIEhvd2V2ZXIgaW4gdGhpcyBjYXNlIHRoZSBUcmFja0Jhc2UgZG9lcyBub3QgcmVmZXJlbmNlIHRoZSBidWZmZXIgZGlyZWN0bHkuCisgICAgICAgICAgICAvLyBJdCBzaG91bGQgcmVmZXJlbmNlcyB0aGUgYnVmZmVyIHZpYSB0aGUgcGlwZS4KKyAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgdG8gZGV0ZWN0IGluY29ycmVjdCB1c2FnZSBvZiB0aGUgYnVmZmVyLCB3ZSBzZXQgbUJ1ZmZlciB0byBOVUxMLgorICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTExPQ19DQkxLOgorICAgICAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKKyAgICAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobUJ1ZmZlciwgMCwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CiAjaWYgMAotICAgICAgICAgICAgbUNibGstPm1GbGFncyA9IENCTEtfRk9SQ0VSRUFEWTsgICAgLy8gRklYTUUgaGFjaywgbmVlZCB0byBmaXggdGhlIHRyYWNrIHJlYWR5IGxvZ2ljCisgICAgICAgICAgICAgICAgbUNibGstPm1GbGFncyA9IENCTEtfRk9SQ0VSRUFEWTsgICAgLy8gRklYTUUgaGFjaywgbmVlZCB0byBmaXggdGhlIHRyYWNrIHJlYWR5IGxvZ2ljCiAjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMTE9DX0xPQ0FMOgorICAgICAgICAgICAgbUJ1ZmZlciA9IGNhbGxvYygxLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMTE9DX05PTkU6CisgICAgICAgICAgICBtQnVmZmVyID0gYnVmZmVyOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogI2lmZGVmIFRFRV9TSU5LCiAgICAgICAgIGlmIChtVGVlU2lua1RyYWNrRW5hYmxlZCkgewotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IHBpcGVGb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgIGlmIChwaXBlRm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgICAgICAgICBOQkFJT19Gb3JtYXQgcGlwZUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpOworICAgICAgICAgICAgaWYgKEZvcm1hdF9pc1ZhbGlkKHBpcGVGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgUGlwZSAqcGlwZSA9IG5ldyBQaXBlKG1UZWVTaW5rVHJhY2tGcmFtZXMsIHBpcGVGb3JtYXQpOwogICAgICAgICAgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKICAgICAgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge3BpcGVGb3JtYXR9OwpAQCAtMTY3LDYgKzIwMywxNyBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6OmluaXRDaGVjaygpIGNvbnN0Cit7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChtVHlwZSA9PSBUWVBFX09VVFBVVCB8fCBtVHlwZSA9PSBUWVBFX1BBVENIKSB7CisgICAgICAgIHN0YXR1cyA9IGNibGsoKSAhPSBOVUxMID8gTk9fRVJST1IgOiBOT19NRU1PUlk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gZ2V0Q2JsaygpICE9IDAgPyBOT19FUlJPUiA6IE5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6On5UcmFja0Jhc2UoKQogewogI2lmZGVmIFRFRV9TSU5LCkBAIC0xODMsMTMgKzIzMCwxNSBAQAogICAgIH0KICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOyAgICAvLyBmcmVlIHRoZSBzaGFyZWQgbWVtb3J5IGJlZm9yZSByZWxlYXNpbmcgdGhlIGhlYXAgaXQgYmVsb25ncyB0bwogICAgIGlmIChtQ2xpZW50ICE9IDApIHsKLSAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgbXVzdCBydW4gd2l0aCBBdWRpb0ZsaW5nZXIgbXV0ZXggbG9ja2VkCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2xpZW50LT5hdWRpb0ZsaW5nZXIoKS0+bUxvY2spOworICAgICAgICAvLyBDbGllbnQgZGVzdHJ1Y3RvciBtdXN0IHJ1biB3aXRoIEF1ZGlvRmxpbmdlciBjbGllbnQgbXV0ZXggbG9ja2VkCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2xpZW50LT5hdWRpb0ZsaW5nZXIoKS0+bUNsaWVudExvY2spOwogICAgICAgICAvLyBJZiB0aGUgY2xpZW50J3MgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIHplcm8sIHRoZSBhc3NvY2lhdGVkIGRlc3RydWN0b3IKICAgICAgICAgLy8gbXVzdCBydW4gd2l0aCBBdWRpb0ZsaW5nZXIgbG9jayBoZWxkLiBUaHVzIHRoZSBleHBsaWNpdCBjbGVhcigpIHJhdGhlciB0aGFuCiAgICAgICAgIC8vIHJlbHlpbmcgb24gdGhlIGF1dG9tYXRpYyBjbGVhcigpIGF0IGVuZCBvZiBzY29wZS4KICAgICAgICAgbUNsaWVudC5jbGVhcigpOwogICAgIH0KKyAgICAvLyBmbHVzaCB0aGUgYmluZGVyIGNvbW1hbmQgYnVmZmVyCisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogfQogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQpAQCAtMjc1LDYgKzMyNCwxMSBAQAogICAgIGlmICghbVRyYWNrLT5pc1RpbWVkVHJhY2soKSkKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogCisgICAgaWYgKGJ1ZmZlciA9PSAwIHx8IGJ1ZmZlci0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInF1ZXVlVGltZWRCdWZmZXIoKSBidWZmZXIgaXMgMCBvciBoYXMgTlVMTCBwb2ludGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBQbGF5YmFja1RocmVhZDo6VGltZWRUcmFjayogdHQgPQogICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQbGF5YmFja1RocmVhZDo6VGltZWRUcmFjayo+KG1UcmFjay5nZXQoKSk7CiAgICAgcmV0dXJuIHR0LT5xdWV1ZVRpbWVkQnVmZmVyKGJ1ZmZlciwgcHRzKTsKQEAgLTMyNCwxMiArMzc4LDE3IEBACiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICBpbnQgdWlkLAotICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncykKLSAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgdHJ1ZSAvKmlzT3V0Ki8pLAorICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSkKKyAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgKHNoYXJlZEJ1ZmZlciAhPSAwKSA/IHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpIDogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIGZsYWdzLCB0cnVlIC8qaXNPdXQqLywKKyAgICAgICAgICAgICAgICAgICh0eXBlID09IFRZUEVfUEFUQ0gpID8gKCBidWZmZXIgPT0gTlVMTCA/IEFMTE9DX0xPQ0FMIDogQUxMT0NfTk9ORSkgOiBBTExPQ19DQkxLLAorICAgICAgICAgICAgICAgICAgdHlwZSksCiAgICAgbUZpbGxpbmdVcFN0YXR1cyhGU19JTlZBTElEKSwKICAgICAvLyBtUmV0cnlDb3VudCBpbml0aWFsaXplZCBsYXRlciB3aGVuIG5lZWRlZAogICAgIG1TaGFyZWRCdWZmZXIoc2hhcmVkQnVmZmVyKSwKQEAgLTMzOSw0NiArMzk4LDU1IEBACiAgICAgbUF1eEJ1ZmZlcihOVUxMKSwKICAgICBtQXV4RWZmZWN0SWQoMCksIG1IYXNWb2x1bWVDb250cm9sbGVyKGZhbHNlKSwKICAgICBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMoMCksCi0gICAgbUZsYWdzKGZsYWdzKSwKICAgICBtRmFzdEluZGV4KC0xKSwKICAgICBtQ2FjaGVkVm9sdW1lKDEuMCksCiAgICAgbUlzSW52YWxpZChmYWxzZSksCiAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eShOVUxMKSwKLSAgICBtUmVzdW1lVG9TdG9wcGluZyhmYWxzZSkKKyAgICBtUmVzdW1lVG9TdG9wcGluZyhmYWxzZSksCisgICAgbUZsdXNoSHdQZW5kaW5nKGZhbHNlKSwKKyAgICBtUHJldmlvdXNWYWxpZChmYWxzZSksCisgICAgbVByZXZpb3VzRnJhbWVzV3JpdHRlbigwKQorICAgIC8vIG1QcmV2aW91c1RpbWVzdGFtcAogewotICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXJ2ZXJQcm94eSA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHk7Ci0gICAgICAgIC8vIHRvIGF2b2lkIGxlYWtpbmcgYSB0cmFjayBuYW1lLCBkbyBub3QgYWxsb2NhdGUgb25lIHVubGVzcyB0aGVyZSBpcyBhbiBtQ2JsawotICAgICAgICBtTmFtZSA9IHRocmVhZC0+Z2V0VHJhY2tOYW1lX2woY2hhbm5lbE1hc2ssIHNlc3Npb25JZCk7Ci0gICAgICAgIGlmIChtTmFtZSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJubyBtb3JlIHRyYWNrIG5hbWVzIGF2YWlsYWJsZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vIG9ubHkgYWxsb2NhdGUgYSBmYXN0IHRyYWNrIGluZGV4IGlmIHdlIHdlcmUgYWJsZSB0byBhbGxvY2F0ZSBhIG5vcm1hbCB0cmFjayBuYW1lCi0gICAgICAgIGlmIChmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlYWR5SXNDYWxsZWRCeU11bHRpcGxlVGhyZWFkcygpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQodGhyZWFkLT5tRmFzdFRyYWNrQXZhaWxNYXNrICE9IDApOwotICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVCgwIDwgaSAmJiBpIDwgKGludClGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOwotICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBpcyB0b28gZWFnZXIuICBXZSBhbGxvY2F0ZSBhIGZhc3QgdHJhY2sgaW5kZXggYmVmb3JlIHRoZQotICAgICAgICAgICAgLy8gICAgICAgZmFzdCB0cmFjayBiZWNvbWVzIGFjdGl2ZS4gIFNpbmNlIGZhc3QgdHJhY2tzIGFyZSBhIHNjYXJjZSByZXNvdXJjZSwKLSAgICAgICAgICAgIC8vICAgICAgIHRoaXMgbWVhbnMgd2UgYXJlIHBvdGVudGlhbGx5IGRlbnlpbmcgb3RoZXIgbW9yZSBpbXBvcnRhbnQgZmFzdCB0cmFja3MgZnJvbQotICAgICAgICAgICAgLy8gICAgICAgYmVpbmcgY3JlYXRlZC4gIEl0IHdvdWxkIGJlIGJldHRlciB0byBhbGxvY2F0ZSB0aGUgaW5kZXggZHluYW1pY2FsbHkuCi0gICAgICAgICAgICBtRmFzdEluZGV4ID0gaTsKLSAgICAgICAgICAgIC8vIFJlYWQgdGhlIGluaXRpYWwgdW5kZXJydW5zIGJlY2F1c2UgdGhpcyBmaWVsZCBpcyBuZXZlciBjbGVhcmVkIGJ5IHRoZSBmYXN0IG1peGVyCi0gICAgICAgICAgICBtT2JzZXJ2ZWRVbmRlcnJ1bnMgPSB0aHJlYWQtPmdldEZhc3RUcmFja1VuZGVycnVucyhpKTsKLSAgICAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAmPSB+KDEgPDwgaSk7Ci0gICAgICAgIH0KKyAgICAvLyBjbGllbnQgPT0gMCBpbXBsaWVzIHNoYXJlZEJ1ZmZlciA9PSAwCisgICAgQUxPR19BU1NFUlQoIShjbGllbnQgPT0gMCAmJiBzaGFyZWRCdWZmZXIgIT0gMCkpOworCisgICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICJzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlZCIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAorICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOworCisgICAgaWYgKG1DYmxrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBTE9HVigiVHJhY2sgY29uc3RydWN0b3IgbmFtZSAlZCwgY2FsbGluZyBwaWQgJWQiLCBtTmFtZSwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisKKyAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSwgIWlzRXh0ZXJuYWxUcmFjaygpLCBzYW1wbGVSYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5ID0gbmV3IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICBtRnJhbWVTaXplKTsKKyAgICB9CisgICAgbVNlcnZlclByb3h5ID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKKworICAgIG1OYW1lID0gdGhyZWFkLT5nZXRUcmFja05hbWVfbChjaGFubmVsTWFzaywgZm9ybWF0LCBzZXNzaW9uSWQpOworICAgIGlmIChtTmFtZSA8IDApIHsKKyAgICAgICAgQUxPR0UoIm5vIG1vcmUgdHJhY2sgbmFtZXMgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gb25seSBhbGxvY2F0ZSBhIGZhc3QgdHJhY2sgaW5kZXggaWYgd2Ugd2VyZSBhYmxlIHRvIGFsbG9jYXRlIGEgbm9ybWFsIHRyYWNrIG5hbWUKKyAgICBpZiAoZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7CisgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlYWR5SXNDYWxsZWRCeU11bHRpcGxlVGhyZWFkcygpOworICAgICAgICBBTE9HX0FTU0VSVCh0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgIT0gMCk7CisgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eih0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2spOworICAgICAgICBBTE9HX0FTU0VSVCgwIDwgaSAmJiBpIDwgKGludClGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOworICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIHRvbyBlYWdlci4gIFdlIGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBiZWZvcmUgdGhlCisgICAgICAgIC8vICAgICAgIGZhc3QgdHJhY2sgYmVjb21lcyBhY3RpdmUuICBTaW5jZSBmYXN0IHRyYWNrcyBhcmUgYSBzY2FyY2UgcmVzb3VyY2UsCisgICAgICAgIC8vICAgICAgIHRoaXMgbWVhbnMgd2UgYXJlIHBvdGVudGlhbGx5IGRlbnlpbmcgb3RoZXIgbW9yZSBpbXBvcnRhbnQgZmFzdCB0cmFja3MgZnJvbQorICAgICAgICAvLyAgICAgICBiZWluZyBjcmVhdGVkLiAgSXQgd291bGQgYmUgYmV0dGVyIHRvIGFsbG9jYXRlIHRoZSBpbmRleCBkeW5hbWljYWxseS4KKyAgICAgICAgbUZhc3RJbmRleCA9IGk7CisgICAgICAgIC8vIFJlYWQgdGhlIGluaXRpYWwgdW5kZXJydW5zIGJlY2F1c2UgdGhpcyBmaWVsZCBpcyBuZXZlciBjbGVhcmVkIGJ5IHRoZSBmYXN0IG1peGVyCisgICAgICAgIG1PYnNlcnZlZFVuZGVycnVucyA9IHRocmVhZC0+Z2V0RmFzdFRyYWNrVW5kZXJydW5zKGkpOworICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgJj0gfigxIDw8IGkpOworICAgIH0KIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6On5UcmFjaygpCkBAIC0zOTEsMTEgKzQ1OSwxOCBAQAogICAgIC8vIFRoaXMgcHJldmVudHMgdGhhdCBsZWFrLgogICAgIGlmIChtU2hhcmVkQnVmZmVyICE9IDApIHsKICAgICAgICAgbVNoYXJlZEJ1ZmZlci5jbGVhcigpOwotICAgICAgICAvLyBmbHVzaCB0aGUgYmluZGVyIGNvbW1hbmQgYnVmZmVyCi0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppbml0Q2hlY2soKSBjb25zdAoreworICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWNrQmFzZTo6aW5pdENoZWNrKCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBtTmFtZSA8IDApIHsKKyAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkZXN0cm95KCkKIHsKICAgICAvLyBOT1RFOiBkZXN0cm95VHJhY2tfbCgpIGNhbiByZW1vdmUgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoaXMgVHJhY2sKQEAgLTQwOCwzMSArNDgzLDM0IEBACiAgICAgLy8gdGhpcyBUcmFjayB3aXRoIGl0cyBtZW1iZXIgbVRyYWNrLgogICAgIHNwPFRyYWNrPiBrZWVwKHRoaXMpOwogICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCisgICAgICAgIGJvb2wgd2FzQWN0aXZlID0gZmFsc2U7CiAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICAgICAgIGJvb2wgd2FzQWN0aXZlID0gcGxheWJhY2tUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOwotICAgICAgICAgICAgaWYgKCFpc091dHB1dFRyYWNrKCkgJiYgIXdhc0FjdGl2ZSkgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHRocmVhZC0+aWQoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB3YXNBY3RpdmUgPSBwbGF5YmFja1RocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpICYmICF3YXNBY3RpdmUpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1UaHJlYWRJb0hhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgTmFtZSBDbGllbnQgVHlwZSAgICAgIEZtdCBDaG4gbWFzayBTZXNzaW9uIGZDb3VudCBTIEYgU1JhdGUgICIKKyAgICByZXN1bHQuYXBwZW5kKCIgICAgTmFtZSBBY3RpdmUgQ2xpZW50IFR5cGUgICAgICBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBmQ291bnQgUyBGIFNSYXRlICAiCiAgICAgICAgICAgICAgICAgICAiTCBkQiAgUiBkQiAgICBTZXJ2ZXIgTWFpbiBidWYgIEF1eCBCdWYgRmxhZ3MgVW5kRnJtQ250XG4iKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSkKIHsKLSAgICB1aW50MzJfdCB2bHIgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRWb2x1bWVMUigpOworICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFZvbHVtZUxSKCk7CiAgICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKLSAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICBGICUyZCIsIG1GYXN0SW5kZXgpOworICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICBGICUyZCIsIG1GYXN0SW5kZXgpOworICAgIH0gZWxzZSBpZiAobU5hbWUgPj0gQXVkaW9NaXhlcjo6VFJBQ0swKSB7CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgICU0ZCIsIG1OYW1lIC0gQXVkaW9NaXhlcjo6VFJBQ0swKTsKICAgICB9IGVsc2UgewotICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICU0ZCIsIG1OYW1lIC0gQXVkaW9NaXhlcjo6VFJBQ0swKTsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAgbm9uZSIpOwogICAgIH0KICAgICB0cmFja19zdGF0ZSBzdGF0ZSA9IG1TdGF0ZTsKICAgICBjaGFyIHN0YXRlQ2hhcjsKQEAgLTQ4Nyw4ICs1NjUsOSBAQAogICAgICAgICBub3dJblVuZGVycnVuID0gJz8nOwogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgc25wcmludGYoJmJ1ZmZlcls3XSwgc2l6ZS03LCAiICU2dSAlNHUgJTA4WCAlMDhYICU3dSAlNnUgJTFjICUxZCAlNXUgJTUuMmcgJTUuMmcgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOFggJTA4WCAweCUwM1ggJTl1JWNcbiIsCisgICAgc25wcmludGYoJmJ1ZmZlcls4XSwgc2l6ZS04LCAiICU2cyAlNnUgJTR1ICUwOFggJTA4WCAlN3UgJTZ6dSAlMWMgJTFkICU1dSAlNS4yZyAlNS4yZyAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJXAgJXAgMHglMDNYICU5dSVjXG4iLAorICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgIG1Gb3JtYXQsCkBAIC00OTgsMTEgKzU3NywxMSBAQAogICAgICAgICAgICAgc3RhdGVDaGFyLAogICAgICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cywKICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKSwKLSAgICAgICAgICAgIDIwLjAgKiBsb2cxMCgodmxyICYgMHhGRkZGKSAvIDQwOTYuMCksCi0gICAgICAgICAgICAyMC4wICogbG9nMTAoKHZsciA+PiAxNikgLyA0MDk2LjApLAorICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKSksCisgICAgICAgICAgICAyMC4wICogbG9nMTAoZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKSksCiAgICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKLSAgICAgICAgICAgIChpbnQpbU1haW5CdWZmZXIsCi0gICAgICAgICAgICAoaW50KW1BdXhCdWZmZXIsCisgICAgICAgICAgICBtTWFpbkJ1ZmZlciwKKyAgICAgICAgICAgIG1BdXhCdWZmZXIsCiAgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0VW5kZXJydW5GcmFtZXMoKSwKICAgICAgICAgICAgIG5vd0luVW5kZXJydW4pOwpAQCAtNTE0LDcgKzU5Myw3IEBACiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Z2V0TmV4dEJ1ZmZlcigKLSAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKQorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMgX191bnVzZWQpCiB7CiAgICAgU2VydmVyUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgc2l6ZV90IGRlc2lyZWRGcmFtZXMgPSBidWZmZXItPmZyYW1lQ291bnQ7CkBAIC01NTEsNyArNjMwLDE0IEBACiAKIC8vIERvbid0IGNhbGwgZm9yIGZhc3QgdHJhY2tzOyB0aGUgZnJhbWVzUmVhZHkoKSBjb3VsZCByZXN1bHQgaW4gcHJpb3JpdHkgaW52ZXJzaW9uCiBib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppc1JlYWR5KCkgY29uc3QgewotICAgIGlmIChtRmlsbGluZ1VwU3RhdHVzICE9IEZTX0ZJTExJTkcgfHwgaXNTdG9wcGVkKCkgfHwgaXNQYXVzaW5nKCkgfHwgaXNTdG9wcGluZygpKSB7CisgICAgaWYgKG1GaWxsaW5nVXBTdGF0dXMgIT0gRlNfRklMTElORyB8fCBpc1N0b3BwZWQoKSB8fCBpc1BhdXNpbmcoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoaXNTdG9wcGluZygpKSB7CisgICAgICAgIGlmIChmcmFtZXNSZWFkeSgpID4gMCkgeworICAgICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cyA9IEZTX0ZJTExFRDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTU2NCw4ICs2NTAsOCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIEFMT0dWKCJzdGFydCglZCksIGNhbGxpbmcgcGlkICVkIHNlc3Npb24gJWQiLApAQCAtNTg4LDcgKzY3NCwxMCBAQAogICAgICAgICAvLyBoZXJlIHRoZSB0cmFjayBjb3VsZCBiZSBlaXRoZXIgbmV3LCBvciByZXN0YXJ0ZWQKICAgICAgICAgLy8gaW4gYm90aCBjYXNlcyAidW5zdG9wIiB0aGUgdHJhY2sKIAotICAgICAgICBpZiAoc3RhdGUgPT0gUEFVU0VEKSB7CisgICAgICAgIC8vIGluaXRpYWwgc3RhdGUtc3RvcHBpbmcuIG5leHQgc3RhdGUtcGF1c2luZy4KKyAgICAgICAgLy8gV2hhdCBpZiByZXN1bWUgaXMgY2FsbGVkID8KKworICAgICAgICBpZiAoc3RhdGUgPT0gUEFVU0VEIHx8IHN0YXRlID09IFBBVVNJTkcpIHsKICAgICAgICAgICAgIGlmIChtUmVzdW1lVG9TdG9wcGluZykgewogICAgICAgICAgICAgICAgIC8vIGhhcHBlbmVkIHdlIG5lZWQgdG8gcmVzdW1lIHRvIFNUT1BQSU5HXzEKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQSU5HXzE7CkBAIC02NDMsNyArNzMyLDcgQEAKICAgICAgICAgICAgIGlmIChwbGF5YmFja1RocmVhZC0+bUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRoaXMpIDwgMCkgewogICAgICAgICAgICAgICAgIHJlc2V0KCk7CiAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRmFzdFRyYWNrKCkgJiYgIWlzT2ZmbG9hZGVkKCkpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRmFzdFRyYWNrKCkgJiYgIWlzT2ZmbG9hZGVkKCkgJiYgIWlzRGlyZWN0KCkpIHsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVE9QUEVEOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBGb3IgZmFzdCB0cmFja3MgcHJlcGFyZVRyYWNrc19sKCkgd2lsbCBzZXQgc3RhdGUgdG8gU1RPUFBJTkdfMgpAQCAtNzE5LDYgKzgwOCw3IEBACiAgICAgICAgICAgICAgICAgbVJldHJ5Q291bnQgPSBQbGF5YmFja1RocmVhZDo6a01heFRyYWNrUmV0cmllc09mZmxvYWQ7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIG1GbHVzaEh3UGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICBtUmVzdW1lVG9TdG9wcGluZyA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVE9QUElOR18xICYmIG1TdGF0ZSAhPSBTVE9QUElOR18yICYmIG1TdGF0ZSAhPSBTVE9QUEVEICYmCkBAIC03MzQsMTYgKzgyNCwyOCBAQAogICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gYWN0aXZlIHRyYWNrIGxpc3QsIHJlc2V0KCksIGFuZCB0cmlnZ2VyIHByZXNlbnRhdGlvbiBjb21wbGV0ZQogICAgICAgICAgICAgaWYgKHBsYXliYWNrVGhyZWFkLT5tQWN0aXZlVHJhY2tzLmluZGV4T2YodGhpcykgPCAwKSB7CiAgICAgICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RElSRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIERpcmVjdE91dHB1dFRocmVhZCAqdCA9IChEaXJlY3RPdXRwdXRUaHJlYWQgKilwbGF5YmFja1RocmVhZDsKKyAgICAgICAgICAgICAgICAgICAgdC0+Zmx1c2hId19sKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIFByZXZlbnQgZmx1c2ggYmVpbmcgbG9zdCBpZiB0aGUgdHJhY2sgaXMgZmx1c2hlZCBhbmQgdGhlbiByZXN1bWVkCiAgICAgICAgIC8vIGJlZm9yZSBtaXhlciB0aHJlYWQgY2FuIHJ1bi4gVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiBvZmZsb2FkaW5nCiAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGJ1ZmZlciBjb3VsZCBob2xkIGEgbGFyZ2UgYW1vdW50IG9mIGF1ZGlvCi0gICAgICAgIHBsYXliYWNrVGhyZWFkLT5mbHVzaE91dHB1dF9sKCk7CiAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5icm9hZGNhc3RfbCgpOwogICAgIH0KIH0KIAorLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbG9jayBoZWxkCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpmbHVzaEFjaygpCit7CisgICAgaWYgKCFpc09mZmxvYWRlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtRmx1c2hId1BlbmRpbmcgPSBmYWxzZTsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cmVzZXQoKQogewogICAgIC8vIERvIG5vdCByZXNldCB0d2ljZSB0byBhdm9pZCBkaXNjYXJkaW5nIGRhdGEgd3JpdHRlbiBqdXN0IGFmdGVyIGEgZmx1c2ggYW5kIGJlZm9yZQpAQCAtNzc4LDI3ICs4ODAsNjAgQEAKIHsKICAgICAvLyBDbGllbnQgc2hvdWxkIGltcGxlbWVudCB0aGlzIHVzaW5nIFNTUTsgdGhlIHVucHJlc2VudGVkIGZyYW1lIGNvdW50IGluIGxhdGNoIGlzIGlycmVsZXZhbnQKICAgICBpZiAoaXNGYXN0VHJhY2soKSkgeworICAgICAgICAvLyBGSVhNRSBubyBsb2NrIGhlbGQgdG8gc2V0IG1QcmV2aW91c1ZhbGlkID0gZmFsc2UKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgLy8gRklYTUUgbm8gbG9jayBoZWxkIHRvIHNldCBtUHJldmlvdXNWYWxpZCA9IGZhbHNlCiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICBpZiAoIWlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoIWlzT2ZmbG9hZGVkKCkgJiYgIWlzRGlyZWN0KCkpIHsKICAgICAgICAgaWYgKCFwbGF5YmFja1RocmVhZC0+bUxhdGNoUVZhbGlkKSB7CisgICAgICAgICAgICBtUHJldmlvdXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgICAgIHVpbnQzMl90IHVucHJlc2VudGVkRnJhbWVzID0KICAgICAgICAgICAgICAgICAoKGludDY0X3QpIHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1VbnByZXNlbnRlZEZyYW1lcyAqIG1TYW1wbGVSYXRlKSAvCiAgICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPm1TYW1wbGVSYXRlOwotICAgICAgICB1aW50MzJfdCBmcmFtZXNXcml0dGVuID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKTsKKyAgICAgICAgLy8gRklYTUUgU2luY2Ugd2UncmUgdXNpbmcgYSByYXcgcG9pbnRlciBhcyB0aGUga2V5LCBpdCBpcyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlCisgICAgICAgIC8vICAgICAgIGZvciBhIGJyYW5kIG5ldyB0cmFjayB0byBzaGFyZSB0aGUgc2FtZSBhZGRyZXNzIGFzIGEgcmVjZW50bHkgZGVzdHJveWVkCisgICAgICAgIC8vICAgICAgIHRyYWNrLCBhbmQgdGh1cyBmb3IgdXMgdG8gZ2V0IHRoZSBmcmFtZXMgcmVsZWFzZWQgb2YgdGhlIHdyb25nIHRyYWNrLgorICAgICAgICAvLyAgICAgICBJdCBpcyB1bmxpa2VseSB0aGF0IHdlIHdvdWxkIGJlIGFibGUgdG8gY2FsbCBnZXRUaW1lc3RhbXAoKSBzbyBxdWlja2x5CisgICAgICAgIC8vICAgICAgIHJpZ2h0IGFmdGVyIGNyZWF0aW5nIGEgbmV3IHRyYWNrLiAgTmV2ZXJ0aGVsZXNzLCB0aGUgaW5kZXggaGVyZSBzaG91bGQKKyAgICAgICAgLy8gICAgICAgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgdGhhdCBpcyB1bmlxdWUuICBPciB1c2UgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzdHJhdGVneS4KKyAgICAgICAgc3NpemVfdCBpID0gcGxheWJhY2tUaHJlYWQtPm1MYXRjaFEubUZyYW1lc1JlbGVhc2VkLmluZGV4T2ZLZXkodGhpcyk7CisgICAgICAgIHVpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSBpID49IDAgPworICAgICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1GcmFtZXNSZWxlYXNlZFtpXSA6CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKTsKKyAgICAgICAgYm9vbCBjaGVja1ByZXZpb3VzVGltZXN0YW1wID0gbVByZXZpb3VzVmFsaWQgJiYgZnJhbWVzV3JpdHRlbiA+PSBtUHJldmlvdXNGcmFtZXNXcml0dGVuOwogICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA8IHVucHJlc2VudGVkRnJhbWVzKSB7CisgICAgICAgICAgICBtUHJldmlvdXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9Ci0gICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSBmcmFtZXNXcml0dGVuIC0gdW5wcmVzZW50ZWRGcmFtZXM7Ci0gICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1UaW1lc3RhbXAubVRpbWU7CisgICAgICAgIG1QcmV2aW91c0ZyYW1lc1dyaXR0ZW4gPSBmcmFtZXNXcml0dGVuOworICAgICAgICB1aW50MzJfdCBwb3NpdGlvbiA9IGZyYW1lc1dyaXR0ZW4gLSB1bnByZXNlbnRlZEZyYW1lczsKKyAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWUgPSBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tVGltZXN0YW1wLm1UaW1lOworICAgICAgICBpZiAoY2hlY2tQcmV2aW91c1RpbWVzdGFtcCkgeworICAgICAgICAgICAgaWYgKHRpbWUudHZfc2VjIDwgbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lLnR2X3NlYyB8fAorICAgICAgICAgICAgICAgICAgICAodGltZS50dl9zZWMgPT0gbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lLnR2X3NlYyAmJgorICAgICAgICAgICAgICAgICAgICB0aW1lLnR2X25zZWMgPCBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUudHZfbnNlYykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiVGltZSBpcyBnb2luZyBiYWNrd2FyZHMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHBvc2l0aW9uIGNhbiBib2JibGUgc2xpZ2h0bHkgYXMgYW4gYXJ0aWZhY3Q7IHRoaXMgaGlkZXMgdGhlIGJvYmJsZQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1JTklNVU1fUE9TSVRJT05fREVMVEEgPSA4dTsKKyAgICAgICAgICAgIGlmICgocG9zaXRpb24gPD0gbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbikgfHwKKyAgICAgICAgICAgICAgICAgICAgKHBvc2l0aW9uIC0gbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbikgPCBNSU5JTVVNX1BPU0lUSU9OX0RFTFRBKSB7CisgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBtUHJldmlvdXNUaW1lc3RhbXAubVBvc2l0aW9uOworICAgICAgICAgICAgICAgIHRpbWUgPSBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSB0aW1lOworICAgICAgICBtUHJldmlvdXNUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIG1QcmV2aW91c1ZhbGlkID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIApAQCAtODg0LDggKzEwMTksNiBAQAogICAgIH0KIAogICAgIGlmIChmcmFtZXNXcml0dGVuID49IG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyB8fCBpc09mZmxvYWRlZCgpKSB7Ci0gICAgICAgIEFMT0dWKCJwcmVzZW50YXRpb25Db21wbGV0ZSgpIHNlc3Npb24gJWQgY29tcGxldGU6IGZyYW1lc1dyaXR0ZW4gJWQiLAotICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwgZnJhbWVzV3JpdHRlbik7CiAgICAgICAgIHRyaWdnZXJFdmVudHMoQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfUFJFU0VOVEFUSU9OX0NPTVBMRVRFKTsKICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c2V0U3RyZWFtRW5kRG9uZSgpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTg5NSw3ICsxMDI4LDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6dHJpZ2dlckV2ZW50cyhBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IHR5cGUpCiB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KW1TeW5jRXZlbnRzLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3luY0V2ZW50cy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAobVN5bmNFdmVudHNbaV0tPnR5cGUoKSA9PSB0eXBlKSB7CiAgICAgICAgICAgICBtU3luY0V2ZW50c1tpXS0+dHJpZ2dlcigpOwogICAgICAgICAgICAgbVN5bmNFdmVudHMucmVtb3ZlQXQoaSk7CkBAIC05MDYsMjcgKzEwMzksMjcgQEAKIAogLy8gaW1wbGVtZW50IFZvbHVtZUJ1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogCi11aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Z2V0Vm9sdW1lTFIoKQorZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldFZvbHVtZUxSKCkKIHsKICAgICAvLyBjYWxsZWQgYnkgRmFzdE1peGVyLCBzbyBub3QgYWxsb3dlZCB0byB0YWtlIGFueSBsb2NrcywgYmxvY2ssIG9yIGRvIEkvTyBpbmNsdWRpbmcgbG9ncwogICAgIEFMT0dfQVNTRVJUKGlzRmFzdFRyYWNrKCkgJiYgKG1DYmxrICE9IE5VTEwpKTsKLSAgICB1aW50MzJfdCB2bHIgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRWb2x1bWVMUigpOwotICAgIHVpbnQzMl90IHZsID0gdmxyICYgMHhGRkZGOwotICAgIHVpbnQzMl90IHZyID0gdmxyID4+IDE2OworICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFZvbHVtZUxSKCk7CisgICAgZmxvYXQgdmwgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CisgICAgZmxvYXQgdnIgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpOwogICAgIC8vIHRyYWNrIHZvbHVtZXMgY29tZSBmcm9tIHNoYXJlZCBtZW1vcnksIHNvIGNhbid0IGJlIHRydXN0ZWQgYW5kIG11c3QgYmUgY2xhbXBlZAotICAgIGlmICh2bCA+IE1BWF9HQUlOX0lOVCkgewotICAgICAgICB2bCA9IE1BWF9HQUlOX0lOVDsKKyAgICBpZiAodmwgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CisgICAgICAgIHZsID0gR0FJTl9GTE9BVF9VTklUWTsKICAgICB9Ci0gICAgaWYgKHZyID4gTUFYX0dBSU5fSU5UKSB7Ci0gICAgICAgIHZyID0gTUFYX0dBSU5fSU5UOworICAgIGlmICh2ciA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKKyAgICAgICAgdnIgPSBHQUlOX0ZMT0FUX1VOSVRZOwogICAgIH0KICAgICAvLyBub3cgYXBwbHkgdGhlIGNhY2hlZCBtYXN0ZXIgdm9sdW1lIGFuZCBzdHJlYW0gdHlwZSB2b2x1bWU7CiAgICAgLy8gdGhpcyBpcyB0cnVzdGVkIGJ1dCBsYWNrcyBhbnkgc3luY2hyb25pemF0aW9uIG9yIGJhcnJpZXIgc28gbWF5IGJlIHN0YWxlCiAgICAgZmxvYXQgdiA9IG1DYWNoZWRWb2x1bWU7CiAgICAgdmwgKj0gdjsKICAgICB2ciAqPSB2OwotICAgIC8vIHJlLWNvbWJpbmUgaW50byBVNC4xNgotICAgIHZsciA9ICh2ciA8PCAxNikgfCAodmwgJiAweEZGRkYpOworICAgIC8vIHJlLWNvbWJpbmUgaW50byBwYWNrZWQgbWluaWZsb2F0CisgICAgdmxyID0gZ2Fpbl9taW5pZmxvYXRfcGFjayhnYWluX2Zyb21fZmxvYXQodmwpLCBnYWluX2Zyb21fZmxvYXQodnIpKTsKICAgICAvLyBGSVhNRSBsb29rIGF0IG11dGUsIHBhdXNlLCBhbmQgc3RvcCBmbGFncwogICAgIHJldHVybiB2bHI7CiB9CkBAIC05NTIsNyArMTA4NSw3IEBACiAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElELCAmY2Jsay0+bUZsYWdzKTsKICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKDB4NDAwMDAwMDAsICZjYmxrLT5tRnV0ZXgpOwogICAgIC8vIGNsaWVudCBpcyBub3QgaW4gc2VydmVyLCBzbyBGVVRFWF9XQUtFIGlzIG5lZWRlZCBpbnN0ZWFkIG9mIEZVVEVYX1dBS0VfUFJJVkFURQotICAgICh2b2lkKSBfX2Z1dGV4X3N5c2NhbGwzKCZjYmxrLT5tRnV0ZXgsIEZVVEVYX1dBS0UsIElOVF9NQVgpOworICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsIEZVVEVYX1dBS0UsIElOVF9NQVgpOwogICAgIG1Jc0ludmFsaWQgPSB0cnVlOwogfQogCkBAIC05NjYsNiArMTA5OSwzMyBAQAogICAgIH0KIH0KIAorLy9UbyBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbG9jayBoZWxkCitib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppc1Jlc3VtZVBlbmRpbmcoKSB7CisKKyAgICBpZiAobVN0YXRlID09IFJFU1VNSU5HKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvKiBSZXN1bWUgaXMgcGVuZGluZyBpZiB0cmFjayB3YXMgc3RvcHBpbmcgYmVmb3JlIHBhdXNlIHdhcyBjYWxsZWQgKi8KKyAgICBpZiAobVN0YXRlID09IFNUT1BQSU5HXzEgJiYKKyAgICAgICAgbVJlc3VtZVRvU3RvcHBpbmcpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvL1RvIGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnJlc3VtZUFjaygpIHsKKworCisgICAgaWYgKG1TdGF0ZSA9PSBSRVNVTUlORykKKyAgICAgICAgbVN0YXRlID0gQUNUSVZFOworCisgICAgLy8gT3RoZXIgcG9zc2liaWxpdHkgb2YgIHBlbmRpbmcgcmVzdW1lIGlzIHN0b3BwaW5nXzEgc3RhdGUKKyAgICAvLyBEbyBub3QgdXBkYXRlIHRoZSBzdGF0ZSBmcm9tIHN0b3BwaW5nIGFzIHRoaXMgcHJldmVudHMKKyAgICAvLyBkcmFpbiBiZWluZyBjYWxsZWQuCisgICAgaWYgKG1TdGF0ZSA9PSBTVE9QUElOR18xKSB7CisgICAgICAgIG1SZXN1bWVUb1N0b3BwaW5nID0gZmFsc2U7CisgICAgfQorfQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUaW1lZFRyYWNrPgpAQCAtOTc5LDcgKzExMzksOCBAQAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKLSAgICAgICAgICAgIGludCB1aWQpIHsKKyAgICAgICAgICAgIGludCB1aWQpCit7CiAgICAgaWYgKCFjbGllbnQtPnJlc2VydmVUaW1lZFRyYWNrKCkpCiAgICAgICAgIHJldHVybiAwOwogCkBAIC0xMDAwLDcgKzExNjEsOCBAQAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgICAgIGludCB1aWQpCiAgICAgOiBUcmFjayh0aHJlYWQsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlciwgc2Vzc2lvbklkLCB1aWQsIElBdWRpb0ZsaW5nZXI6OlRSQUNLX1RJTUVEKSwKKyAgICAgICAgICAgIGZyYW1lQ291bnQsIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSA6IE5VTEwsIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIElBdWRpb0ZsaW5nZXI6OlRSQUNLX1RJTUVELCBUWVBFX1RJTUVEKSwKICAgICAgIG1RdWV1ZUhlYWRJbkZsaWdodChmYWxzZSksCiAgICAgICBtVHJpbVF1ZXVlSGVhZE9uUmVsZWFzZShmYWxzZSksCiAgICAgICBtRnJhbWVzUGVuZGluZ0luUXVldWUoMCksCkBAIC0xMDQ1LDE1ICsxMjA3LDE0IEBACiAKICAgICAgICAgbVRpbWVkTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrVGltZWRCdWZmZXJIZWFwU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVkaW9GbGluZ2VyVGltZWQiKTsKLSAgICAgICAgaWYgKG1UaW1lZE1lbW9yeURlYWxlciA9PSBOVUxMKQorICAgICAgICBpZiAobVRpbWVkTWVtb3J5RGVhbGVyID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBzcDxJTWVtb3J5PiBuZXdCdWZmZXIgPSBtVGltZWRNZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUpOwotICAgIGlmIChuZXdCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBuZXdCdWZmZXIgPSBtVGltZWRNZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUpOwotICAgICAgICBpZiAobmV3QnVmZmVyID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIGlmIChuZXdCdWZmZXIgPT0gMCB8fCBuZXdCdWZmZXItPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgfQogCiAgICAgKmJ1ZmZlciA9IG5ld0J1ZmZlcjsKQEAgLTExNTIsNyArMTMxMyw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VGltZWRUcmFjazo6dXBkYXRlRnJhbWVzUGVuZGluZ0FmdGVyVHJpbV9sKAogICAgICAgICBjb25zdCBUaW1lZEJ1ZmZlciYgYnVmLAotICAgICAgICBjb25zdCBjaGFyKiBsb2dUYWcpIHsKKyAgICAgICAgY29uc3QgY2hhciogbG9nVGFnIF9fdW51c2VkKSB7CiAgICAgdWludDMyX3QgYnVmQnl0ZXMgICAgICAgID0gYnVmLmJ1ZmZlcigpLT5zaXplKCk7CiAgICAgdWludDMyX3QgY29uc3VtZWRBbHJlYWR5ID0gYnVmLnBvc2l0aW9uKCk7CiAKQEAgLTE0NjMsNyArMTYyNCw3IEBACiAgICAgICAgICAgICBtVHJpbVF1ZXVlSGVhZE9uUmVsZWFzZSA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0ZBVEFMKCJUaW1lZFRyYWNrOjpyZWxlYXNlQnVmZmVyIG9mIG5vbi1zaWxlbmNlIGJ1ZmZlciB3aXRoIG5vIgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJUaW1lZFRyYWNrOjpyZWxlYXNlQnVmZmVyIG9mIG5vbi1zaWxlbmNlIGJ1ZmZlciB3aXRoIG5vIgogICAgICAgICAgICAgICAgICAgIiBidWZmZXJzIGluIHRoZSB0aW1lZCBidWZmZXIgcXVldWUiKTsKICAgICB9CiAKQEAgLTE0OTYsNyArMTY1Nyw3IEBACiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgIGludCB1aWQpCiAgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fQ05ULCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIE5VTEwsIDAsIHVpZCwgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVCksCisgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgdWlkLCBJQXVkaW9GbGluZ2VyOjpUUkFDS19ERUZBVUxULCBUWVBFX09VVFBVVCksCiAgICAgbUFjdGl2ZShmYWxzZSksIG1Tb3VyY2VUaHJlYWQoc291cmNlVGhyZWFkKSwgbUNsaWVudFByb3h5KE5VTEwpCiB7CiAKQEAgLTE1MDQsMTcgKzE2NjUsMTYgQEAKICAgICAgICAgbU91dEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKICAgICAgICAgcGxheWJhY2tUaHJlYWQtPm1UcmFja3MuYWRkKHRoaXMpOwogICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2sgY29uc3RydWN0b3IgbUNibGsgJXAsIG1CdWZmZXIgJXAsICIKLSAgICAgICAgICAgICAgICAibUNibGstPmZyYW1lQ291bnRfICV1LCBtQ2hhbm5lbE1hc2sgMHglMDh4IiwKKyAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAldSwgbUNoYW5uZWxNYXNrIDB4JTA4eCIsCiAgICAgICAgICAgICAgICAgbUNibGssIG1CdWZmZXIsCi0gICAgICAgICAgICAgICAgbUNibGstPmZyYW1lQ291bnRfLCBtQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1DaGFubmVsTWFzayk7CiAgICAgICAgIC8vIHNpbmNlIGNsaWVudCBhbmQgc2VydmVyIGFyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLAogICAgICAgICAvLyB0aGUgYnVmZmVyIGhhcyB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3Mgb24gYm90aCBzaWRlcwotICAgICAgICBtQ2xpZW50UHJveHkgPSBuZXcgQXVkaW9UcmFja0NsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBtRnJhbWVDb3VudCwgbUZyYW1lU2l6ZSk7Ci0gICAgICAgIG1DbGllbnRQcm94eS0+c2V0Vm9sdW1lTFIoKHVpbnQzMl90KHVpbnQxNl90KDB4MTAwMCkpIDw8IDE2KSB8IHVpbnQxNl90KDB4MTAwMCkpOwotICAgICAgICBtQ2xpZW50UHJveHktPnNldFNlbmRMZXZlbCgwLjApOwotICAgICAgICBtQ2xpZW50UHJveHktPnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7CiAgICAgICAgIG1DbGllbnRQcm94eSA9IG5ldyBBdWRpb1RyYWNrQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIG1GcmFtZUNvdW50LCBtRnJhbWVTaXplLAogICAgICAgICAgICAgICAgIHRydWUgLypjbGllbnRJblNlcnZlciovKTsKKyAgICAgICAgbUNsaWVudFByb3h5LT5zZXRWb2x1bWVMUihHQUlOX01JTklGTE9BVF9QQUNLRURfVU5JVFkpOworICAgICAgICBtQ2xpZW50UHJveHktPnNldFNlbmRMZXZlbCgwLjApOworICAgICAgICBtQ2xpZW50UHJveHktPnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coIkVycm9yIGNyZWF0aW5nIG91dHB1dCB0cmFjayBvbiB0aHJlYWQgJXAiLCBwbGF5YmFja1RocmVhZCk7CiAgICAgfQpAQCAtMTcwNSw2ICsxODY1LDc1IEBACiB9CiAKIAorQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6UGF0Y2hUcmFjayhQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MpCisgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fQ05ULCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICBidWZmZXIsIDAsIDAsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIHRydWUsIHRydWUpKQoreworICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogcGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gbWl4QnVmZmVyTnMgLyAxMDAwMDAwMDAwOworICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gKGludCkgKG1peEJ1ZmZlck5zICUgMTAwMDAwMDAwMCk7CisKKyAgICBBTE9HVigiUGF0Y2hUcmFjayAlcCBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVBlZXJUaW1lb3V0LnR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkobVBlZXJUaW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKSk7Cit9CisKK0F1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6On5QYXRjaFRyYWNrKCkKK3sKK30KKworLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OmdldE5leHRCdWZmZXIoCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cykKK3sKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFRyYWNrOjpnZXROZXh0QnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIFByb3h5OjpCdWZmZXIgYnVmOworICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIoJmJ1ZiwgJm1QZWVyVGltZW91dCk7CisgICAgQUxPR1ZfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiUGF0Y2hUcmFjaygpICVwIGdldE5leHRCdWZmZXIgc3RhdHVzICVkIiwgdGhpcywgc3RhdHVzKTsKKyAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CisgICAgaWYgKGJ1Zi5tRnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICB9CisgICAgc3RhdHVzID0gVHJhY2s6OmdldE5leHRCdWZmZXIoYnVmZmVyLCBwdHMpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIFByb3h5OjpCdWZmZXIgYnVmOworICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBidWYubVJhdyA9IGJ1ZmZlci0+cmF3OworICAgIG1QZWVyUHJveHktPnJlbGVhc2VCdWZmZXIoJmJ1Zik7CisgICAgVHJhY2tCYXNlOjpyZWxlYXNlQnVmZmVyKGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6Om9idGFpbkJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0KQoreworICAgIHJldHVybiBtUHJveHktPm9idGFpbkJ1ZmZlcihidWZmZXIsIHRpbWVPdXQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyKQoreworICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIpOworICAgIGlmIChhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRUQsICZtQ2Jsay0+bUZsYWdzKSAmIENCTEtfRElTQUJMRUQpIHsKKyAgICAgICAgQUxPR1coIlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoKSBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciKTsKKyAgICAgICAgc3RhcnQoKTsKKyAgICB9CisgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GT1JDRVJFQURZLCAmbUNibGstPm1GbGFncyk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUmVjb3JkCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNzIxLDEwICsxOTUwLDYgQEAKICAgICBtUmVjb3JkVHJhY2stPmRlc3Ryb3koKTsKIH0KIAotc3A8SU1lbW9yeT4gQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OmdldENibGsoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SZWNvcmRUcmFjay0+Z2V0Q2JsaygpOwotfQotCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c3RhcnQoaW50IC8qQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCovIGV2ZW50LAogICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24pIHsKICAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpzdGFydCgpIik7CkBAIC0xNzQ4LDcgKzE5NzMsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIFJlY29yZFRyYWNrIGNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCisvLyBSZWNvcmRUcmFjayBjb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgYW5kIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6UmVjb3JkVHJhY2soCiAgICAgICAgICAgICBSZWNvcmRUaHJlYWQgKnRocmVhZCwKICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKQEAgLTE3NTYsMjggKzE5ODEsNTkgQEAKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAotICAgICAgICAgICAgaW50IHVpZCkKKyAgICAgICAgICAgIGludCB1aWQsCisgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCAwIC8qc2hhcmVkQnVmZmVyKi8sIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKmlzT3V0Ki8pLAotICAgICAgICBtT3ZlcmZsb3coZmFsc2UpCisgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgYnVmZmVyLCBzZXNzaW9uSWQsIHVpZCwKKyAgICAgICAgICAgICAgICAgIGZsYWdzLCBmYWxzZSAvKmlzT3V0Ki8sCisgICAgICAgICAgICAgICAgICAodHlwZSA9PSBUWVBFX0RFRkFVTFQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpID8gQUxMT0NfUElQRSA6IEFMTE9DX0NCTEspIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChidWZmZXIgPT0gTlVMTCkgPyBBTExPQ19MT0NBTCA6IEFMTE9DX05PTkUpLAorICAgICAgICAgICAgICAgICAgdHlwZSksCisgICAgICAgIG1PdmVyZmxvdyhmYWxzZSksIG1SZXNhbXBsZXIoTlVMTCksIG1Sc21wT3V0QnVmZmVyKE5VTEwpLCBtUnNtcE91dEZyYW1lQ291bnQoMCksCisgICAgICAgIC8vIFNlZSByZWFsIGluaXRpYWxpemF0aW9uIG9mIG1Sc21wSW5Gcm9udCBhdCBSZWNvcmRUaHJlYWQ6OnN0YXJ0KCkKKyAgICAgICAgbVJzbXBJblVucmVsKDApLCBtUnNtcEluRnJvbnQoMCksIG1GcmFtZXNUb0Ryb3AoMCksIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcihOVUxMKQogewotICAgIEFMT0dWKCJSZWNvcmRUcmFjayBjb25zdHJ1Y3RvciIpOwotICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1JlY29yZFNlcnZlclByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSk7Ci0gICAgICAgIG1TZXJ2ZXJQcm94eSA9IG1BdWRpb1JlY29yZFNlcnZlclByb3h5OworICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU2VydmVyUHJveHkgPSBuZXcgQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplLCAhaXNFeHRlcm5hbFRyYWNrKCkpOworCisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spOworICAgIC8vIEZJWE1FIEkgZG9uJ3QgdW5kZXJzdGFuZCBlaXRoZXIgb2YgdGhlIGNoYW5uZWwgY291bnQgY2hlY2tzCisgICAgaWYgKHRocmVhZC0+bVNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSAmJiB0aHJlYWQtPm1DaGFubmVsQ291bnQgPD0gRkNDXzIgJiYKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCA8PSBGQ0NfMikgeworICAgICAgICAvLyBzaW5rIFNSCisgICAgICAgIG1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgIHRocmVhZC0+bUNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CisgICAgICAgIC8vIHNvdXJjZSBTUgorICAgICAgICBtUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKHRocmVhZC0+bVNhbXBsZVJhdGUpOworICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUoQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCwgQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCk7CisgICAgICAgIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlciA9IG5ldyBSZXNhbXBsZXJCdWZmZXJQcm92aWRlcih0aGlzKTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZC0+bUZhc3RUcmFja0F2YWlsKTsKKyAgICAgICAgdGhyZWFkLT5tRmFzdFRyYWNrQXZhaWwgPSBmYWxzZTsKICAgICB9CiB9CiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6flJlY29yZFRyYWNrKCkKIHsKICAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIG1SZXNhbXBsZXI7CisgICAgZGVsZXRlW10gbVJzbXBPdXRCdWZmZXI7CisgICAgZGVsZXRlIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcjsKIH0KIAogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwKLSAgICAgICAgaW50NjRfdCBwdHMpCisgICAgICAgIGludDY0X3QgcHRzIF9fdW51c2VkKQogewogICAgIFNlcnZlclByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKQEAgLTE4MDgsOCArMjA2NCw4IEBACiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICAgaWYgKHJlY29yZFRocmVhZC0+c3RvcCh0aGlzKSkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChyZWNvcmRUaHJlYWQtPmlkKCkpOworICAgICAgICBpZiAocmVjb3JkVGhyZWFkLT5zdG9wKHRoaXMpICYmIGlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1UaHJlYWRJb0hhbmRsZSwgKGF1ZGlvX3Nlc3Npb25fdCltU2Vzc2lvbklkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE4MTksMTIgKzIwNzUsMTQgQEAKICAgICAvLyBzZWUgY29tbWVudHMgYXQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmRlc3Ryb3koKQogICAgIHNwPFJlY29yZFRyYWNrPiBrZWVwKHRoaXMpOwogICAgIHsKKyAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlID09IEFDVElWRSB8fCBtU3RhdGUgPT0gUkVTVU1JTkcpIHsKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1UaHJlYWRJb0hhbmRsZSwgKGF1ZGlvX3Nlc3Npb25fdCltU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVRocmVhZElvSGFuZGxlLCAoYXVkaW9fc2Vzc2lvbl90KW1TZXNzaW9uSWQpOworICAgICAgICB9CiAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQUNUSVZFIHx8IG1TdGF0ZSA9PSBSRVNVTUlORykgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQodGhyZWFkLT5pZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQodGhyZWFkLT5pZCgpKTsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWQuZ2V0KCk7CiAgICAgICAgICAgICByZWNvcmRUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOwpAQCAtMTgzOSwyNSArMjA5NywxMTcgQEAKICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSUQsICZjYmxrLT5tRmxhZ3MpOwogICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoMHg0MDAwMDAwMCwgJmNibGstPm1GdXRleCk7CiAgICAgLy8gY2xpZW50IGlzIG5vdCBpbiBzZXJ2ZXIsIHNvIEZVVEVYX1dBS0UgaXMgbmVlZGVkIGluc3RlYWQgb2YgRlVURVhfV0FLRV9QUklWQVRFCi0gICAgKHZvaWQpIF9fZnV0ZXhfc3lzY2FsbDMoJmNibGstPm1GdXRleCwgRlVURVhfV0FLRSwgSU5UX01BWCk7CisgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwgRlVURVhfV0FLRSwgSU5UX01BWCk7CiB9CiAKIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiQ2xpZW50IEZtdCBDaG4gbWFzayBTZXNzaW9uIFMgICBTZXJ2ZXIgZkNvdW50XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgICAgQWN0aXZlIENsaWVudCBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBTICAgU2VydmVyIGZDb3VudCBTUmF0ZVxuIik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlNnUgJTN1ICUwOFggJTd1ICUxZCAlMDhYICU2dVxuIiwKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAgJTZzICU2dSAlM3UgJTA4WCAlN3UgJTFkICUwOFggJTZ6dSAlNXVcbiIsCisgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgbVN0YXRlLAogICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCi0gICAgICAgICAgICBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBtRnJhbWVDb3VudCwKKyAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6aGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCit7CisgICAgaWYgKGV2ZW50ID09IG1TeW5jU3RhcnRFdmVudCkgeworICAgICAgICBzc2l6ZV90IGZyYW1lc1RvRHJvcCA9IDA7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZEJhc2UgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHRocmVhZEJhc2UgIT0gMCkgeworICAgICAgICAgICAgLy8gVE9ETzogdXNlIGFjdHVhbCBidWZmZXIgZmlsbGluZyBzdGF0dXMgaW5zdGVhZCBvZiAyIGJ1ZmZlcnMgd2hlbiBpbmZvIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgLy8gZnJvbSBhdWRpbyBIQUwKKyAgICAgICAgICAgIGZyYW1lc1RvRHJvcCA9IHRocmVhZEJhc2UtPm1GcmFtZUNvdW50ICogMjsKKyAgICAgICAgfQorICAgICAgICBtRnJhbWVzVG9Ecm9wID0gZnJhbWVzVG9Ecm9wOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmNsZWFyU3luY1N0YXJ0RXZlbnQoKQoreworICAgIGlmIChtU3luY1N0YXJ0RXZlbnQgIT0gMCkgeworICAgICAgICBtU3luY1N0YXJ0RXZlbnQtPmNhbmNlbCgpOworICAgICAgICBtU3luY1N0YXJ0RXZlbnQuY2xlYXIoKTsKKyAgICB9CisgICAgbUZyYW1lc1RvRHJvcCA9IDA7Cit9CisKKworQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpQYXRjaFJlY29yZChSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncykKKyAgICA6ICAgUmVjb3JkVHJhY2socmVjb3JkVGhyZWFkLCBOVUxMLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIGJ1ZmZlciwgMCwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKKyAgICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCBmYWxzZSwgdHJ1ZSkpCit7CisgICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiByZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRUaHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gbWl4QnVmZmVyTnMgLyAxMDAwMDAwMDAwOworICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gKGludCkgKG1peEJ1ZmZlck5zICUgMTAwMDAwMDAwMCk7CisKKyAgICBBTE9HVigiUGF0Y2hSZWNvcmQgJXAgc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1QZWVyVGltZW91dC50dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKG1QZWVyVGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCkpOworfQorCitBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6On5QYXRjaFJlY29yZCgpCit7Cit9CisKKy8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OmdldE5leHRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cykKK3sKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFJlY29yZDo6Z2V0TmV4dEJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKKyAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyKCZidWYsICZtUGVlclRpbWVvdXQpOworICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICAiUGF0Y2hSZWNvcmQoKSAlcCBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIgc3RhdHVzICVkIiwgdGhpcywgc3RhdHVzKTsKKyAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CisgICAgaWYgKGJ1Zi5tRnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICB9CisgICAgc3RhdHVzID0gUmVjb3JkVHJhY2s6OmdldE5leHRCdWZmZXIoYnVmZmVyLCBwdHMpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQoreworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoUmVjb3JkOjpyZWxlYXNlQnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIFByb3h5OjpCdWZmZXIgYnVmOworICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBidWYubVJhdyA9IGJ1ZmZlci0+cmF3OworICAgIG1QZWVyUHJveHktPnJlbGVhc2VCdWZmZXIoJmJ1Zik7CisgICAgVHJhY2tCYXNlOjpyZWxlYXNlQnVmZmVyKGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6b2J0YWluQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZU91dCkKK3sKKyAgICByZXR1cm4gbVByb3h5LT5vYnRhaW5CdWZmZXIoYnVmZmVyLCB0aW1lT3V0KTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OnJlbGVhc2VCdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyKQoreworICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIpOwogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3QtcmVzYW1wbGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3QtcmVzYW1wbGUuY3BwCmluZGV4IDdhMzE0Y2YuLjg0YTY1NWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0LXJlc2FtcGxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdC1yZXNhbXBsZS5jcHAKQEAgLTE0LDggKzE0LDYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMjQsODEgKzIyLDExNCBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotc3RydWN0IEhlYWRlcldhdiB7Ci0gICAgSGVhZGVyV2F2KHNpemVfdCBzaXplLCBpbnQgbmMsIGludCBzciwgaW50IGJpdHMpIHsKLSAgICAgICAgc3RybmNweShSSUZGLCAiUklGRiIsIDQpOwotICAgICAgICBjaHVua1NpemUgPSBzaXplICsgc2l6ZW9mKEhlYWRlcldhdik7Ci0gICAgICAgIHN0cm5jcHkoV0FWRSwgIldBVkUiLCA0KTsKLSAgICAgICAgc3RybmNweShmbXQsICAiZm10ICIsIDQpOwotICAgICAgICBmbXRTaXplID0gMTY7Ci0gICAgICAgIGF1ZGlvRm9ybWF0ID0gMTsKLSAgICAgICAgbnVtQ2hhbm5lbHMgPSBuYzsKLSAgICAgICAgc2FtcGxlc1JhdGUgPSBzcjsKLSAgICAgICAgYnl0ZVJhdGUgPSBzciAqIG51bUNoYW5uZWxzICogKGJpdHMvOCk7Ci0gICAgICAgIGFsaWduID0gbmMqKGJpdHMvOCk7Ci0gICAgICAgIGJpdHNQZXJTYW1wbGUgPSBiaXRzOwotICAgICAgICBzdHJuY3B5KGRhdGEsICJkYXRhIiwgNCk7Ci0gICAgICAgIGRhdGFTaXplID0gc2l6ZTsKLSAgICB9Ci0KLSAgICBjaGFyIFJJRkZbNF07ICAgICAgICAgICAvLyBSSUZGCi0gICAgdWludDMyX3QgY2h1bmtTaXplOyAgICAgLy8gRmlsZSBzaXplCi0gICAgY2hhciBXQVZFWzRdOyAgICAgICAgLy8gV0FWRQotICAgIGNoYXIgZm10WzRdOyAgICAgICAgICAgIC8vIGZtdFwwCi0gICAgdWludDMyX3QgZm10U2l6ZTsgICAgICAgLy8gZm10IHNpemUKLSAgICB1aW50MTZfdCBhdWRpb0Zvcm1hdDsgICAvLyAxPVBDTQotICAgIHVpbnQxNl90IG51bUNoYW5uZWxzOyAgIC8vIG51bSBjaGFubmVscwotICAgIHVpbnQzMl90IHNhbXBsZXNSYXRlOyAgIC8vIHNhbXBsZSByYXRlIGluIGh6Ci0gICAgdWludDMyX3QgYnl0ZVJhdGU7ICAgICAgLy8gQnBzCi0gICAgdWludDE2X3QgYWxpZ247ICAgICAgICAgLy8gMj0xNi1iaXQgbW9ubywgND0xNi1iaXQgc3RlcmVvCi0gICAgdWludDE2X3QgYml0c1BlclNhbXBsZTsgLy8gYml0cyBwZXIgc2FtcGxlCi0gICAgY2hhciBkYXRhWzRdOyAgICAgICAgICAgLy8gImRhdGEiCi0gICAgdWludDMyX3QgZGF0YVNpemU7ICAgICAgLy8gc2l6ZQotfTsKK3N0YXRpYyBib29sIGdWZXJib3NlID0gZmFsc2U7CiAKIHN0YXRpYyBpbnQgdXNhZ2UoY29uc3QgY2hhciogbmFtZSkgewotICAgIGZwcmludGYoc3RkZXJyLCJVc2FnZTogJXMgWy1wXSBbLWhdIFstc10gWy1xIHtkcXxscXxtcXxocXx2aHF9XSBbLWkgaW5wdXQtc2FtcGxlLXJhdGVdICIKLSAgICAgICAgICAgICAgICAgICAiWy1vIG91dHB1dC1zYW1wbGUtcmF0ZV0gWzxpbnB1dC1maWxlPl0gPG91dHB1dC1maWxlPlxuIiwgbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsIlVzYWdlOiAlcyBbLXBdIFstZl0gWy1GXSBbLXZdIFstYyBjaGFubmVsc10iCisgICAgICAgICAgICAgICAgICAgIiBbLXEge2RxfGxxfG1xfGhxfHZocXxkbHF8ZG1xfGRocX1dIgorICAgICAgICAgICAgICAgICAgICIgWy1pIGlucHV0LXNhbXBsZS1yYXRlXSBbLW8gb3V0cHV0LXNhbXBsZS1yYXRlXSIKKyAgICAgICAgICAgICAgICAgICAiIFstTyBjc3ZdIFstUCBjc3ZdIFs8aW5wdXQtZmlsZT5dIgorICAgICAgICAgICAgICAgICAgICIgPG91dHB1dC1maWxlPlxuIiwgbmFtZSk7CiAgICAgZnByaW50ZihzdGRlcnIsIiAgICAtcCAgICBlbmFibGUgcHJvZmlsaW5nXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1oICAgIGNyZWF0ZSB3YXYgZmlsZVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsIiAgICAtcyAgICBzdGVyZW9cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLWYgICAgZW5hYmxlIGZpbHRlciBwcm9maWxpbmdcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLUYgICAgZW5hYmxlIGZsb2F0aW5nIHBvaW50IC1xIHtkbHF8ZG1xfGRocX0gb25seSIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLXYgICAgdmVyYm9zZSA6IGxvZyBidWZmZXIgcHJvdmlkZXIgY2FsbHNcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLWMgICAgIyBjaGFubmVscyAoMS0yIGZvciBscXxtcXxocTsgMS04IGZvciBkbHF8ZG1xfGRocSlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgLXEgICAgcmVzYW1wbGVyIHF1YWxpdHlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGRxICA6IGRlZmF1bHQgcXVhbGl0eVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgbHEgIDogbG93IHF1YWxpdHlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIG1xICA6IG1lZGl1bSBxdWFsaXR5XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICBocSAgOiBoaWdoIHF1YWxpdHlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIHZocSA6IHZlcnkgaGlnaCBxdWFsaXR5XG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1pICAgIGlucHV0IGZpbGUgc2FtcGxlIHJhdGVcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGRscSA6IGR5bmFtaWMgbG93IHF1YWxpdHlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGRtcSA6IGR5bmFtaWMgbWVkaXVtIHF1YWxpdHlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGRocSA6IGR5bmFtaWMgaGlnaCBxdWFsaXR5XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1pICAgIGlucHV0IGZpbGUgc2FtcGxlIHJhdGUgKGlnbm9yZWQgaWYgaW5wdXQgZmlsZSBpcyBzcGVjaWZpZWQpXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1vICAgIG91dHB1dCBmaWxlIHNhbXBsZSByYXRlXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1PICAgICMgZnJhbWVzIG91dHB1dCBwZXIgY2FsbCB0byByZXNhbXBsZSgpIGluIENTViBmb3JtYXRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLVAgICAgIyBmcmFtZXMgcHJvdmlkZWQgcGVyIGNhbGwgdG8gcmVzYW1wbGUoKSBpbiBDU1YgZm9ybWF0XG4iKTsKICAgICByZXR1cm4gLTE7CiB9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKy8vIENvbnZlcnQgYSBsaXN0IG9mIGludGVnZXJzIGluIENTViBmb3JtYXQgdG8gYSBWZWN0b3Igb2YgdGhvc2UgdmFsdWVzLgorLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LCBvciAtMSBvbiBlcnJvci4KK2ludCBwYXJzZUNTVihjb25zdCBjaGFyICpzdHJpbmcsIFZlY3RvcjxpbnQ+JiB2YWx1ZXMpCit7CisgICAgLy8gcGFzcyAxOiBjb3VudCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBhbmQgZG8gc3ludGF4IGNoZWNrCisgICAgc2l6ZV90IG51bVZhbHVlcyA9IDA7CisgICAgYm9vbCBoYWREaWdpdCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgY2hhciAqcCA9IHN0cmluZzsgOyApIHsKKyAgICAgICAgc3dpdGNoICgqcCsrKSB7CisgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKyAgICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorICAgICAgICAgICAgaGFkRGlnaXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIGlmIChoYWREaWdpdCkgeworICAgICAgICAgICAgICAgIC8vIHBhc3MgMjogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdmVjdG9yIG9mIHZhbHVlcworICAgICAgICAgICAgICAgIHZhbHVlcy5yZXNpemUoKytudW1WYWx1ZXMpOworICAgICAgICAgICAgICAgIHZhbHVlcy5lZGl0SXRlbUF0KDApID0gYXRvaShwID0gb3B0YXJnKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bVZhbHVlczsgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcCsrID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmVkaXRJdGVtQXQoaSsrKSA9IGF0b2kocCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bVZhbHVlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgIGlmIChoYWREaWdpdCkgeworICAgICAgICAgICAgICAgIGhhZERpZ2l0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbnVtVmFsdWVzKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KK30KIAoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewogICAgIGNvbnN0IGNoYXIqIGNvbnN0IHByb2duYW1lID0gYXJndlswXTsKLSAgICBib29sIHByb2ZpbGluZyA9IGZhbHNlOwotICAgIGJvb2wgd3JpdGVIZWFkZXIgPSBmYWxzZTsKKyAgICBib29sIHByb2ZpbGVSZXNhbXBsZSA9IGZhbHNlOworICAgIGJvb2wgcHJvZmlsZUZpbHRlciA9IGZhbHNlOworICAgIGJvb2wgdXNlRmxvYXQgPSBmYWxzZTsKICAgICBpbnQgY2hhbm5lbHMgPSAxOwogICAgIGludCBpbnB1dF9mcmVxID0gMDsKICAgICBpbnQgb3V0cHV0X2ZyZXEgPSAwOwogICAgIEF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRFRkFVTFRfUVVBTElUWTsKKyAgICBWZWN0b3I8aW50PiBPdmFsdWVzOworICAgIFZlY3RvcjxpbnQ+IFB2YWx1ZXM7CiAKICAgICBpbnQgY2g7Ci0gICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAicGhzcTppOm86IikpICE9IC0xKSB7CisgICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAicGZGdmM6cTppOm86TzpQOiIpKSAhPSAtMSkgewogICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgcHJvZmlsaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHByb2ZpbGVSZXNhbXBsZSA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnaCc6Ci0gICAgICAgICAgICB3cml0ZUhlYWRlciA9IHRydWU7CisgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgcHJvZmlsZUZpbHRlciA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICBjaGFubmVscyA9IDI7CisgICAgICAgIGNhc2UgJ0YnOgorICAgICAgICAgICAgdXNlRmxvYXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgICAgZ1ZlcmJvc2UgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgY2hhbm5lbHMgPSBhdG9pKG9wdGFyZyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAncSc6CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChvcHRhcmcsICJkcSIpKQpAQCAtMTExLDYgKzE0MiwxMiBAQAogICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6SElHSF9RVUFMSVRZOwogICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJ2aHEiKSkKICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZOworICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJkbHEiKSkKKyAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiZG1xIikpCisgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFk7CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgImRocSIpKQorICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWTsKICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIHVzYWdlKHByb2duYW1lKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0xMjIsMTIgKzE1OSwzNSBAQAogICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgIG91dHB1dF9mcmVxID0gYXRvaShvcHRhcmcpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ08nOgorICAgICAgICAgICAgaWYgKHBhcnNlQ1NWKG9wdGFyZywgT3ZhbHVlcykgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmNvcnJlY3Qgc3ludGF4IGZvciAtTyBvcHRpb25cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgIGlmIChwYXJzZUNTVihvcHRhcmcsIFB2YWx1ZXMpIDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5jb3JyZWN0IHN5bnRheCBmb3IgLVAgb3B0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB1c2FnZShwcm9nbmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBpZiAoY2hhbm5lbHMgPCAxCisgICAgICAgICAgICB8fCBjaGFubmVscyA+IChxdWFsaXR5IDwgQXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSA/IDIgOiA4KSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzICVkXG4iLCBjaGFubmVscyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHVzZUZsb2F0ICYmIHF1YWxpdHkgPCBBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmxvYXQgcHJvY2Vzc2luZyBpcyBvbmx5IHBvc3NpYmxlIGZvciBkeW5hbWljIHJlc2FtcGxlcnNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCiAgICAgYXJnYyAtPSBvcHRpbmQ7CiAgICAgYXJndiArPSBvcHRpbmQ7CiAKQEAgLTE0OCwyNSArMjA4LDIyIEBACiAgICAgc2l6ZV90IGlucHV0X3NpemU7CiAgICAgdm9pZCogaW5wdXRfdmFkZHI7CiAgICAgaWYgKGFyZ2MgPT0gMikgewotICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICAgICAgaWYgKHN0YXQoZmlsZV9pbiwgJnN0KSA8IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic3RhdDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFNGX0lORk8gaW5mbzsKKyAgICAgICAgaW5mby5mb3JtYXQgPSAwOworICAgICAgICBTTkRGSUxFICpzZiA9IHNmX29wZW4oZmlsZV9pbiwgU0ZNX1JFQUQsICZpbmZvKTsKKyAgICAgICAgaWYgKHNmID09IE5VTEwpIHsKKyAgICAgICAgICAgIHBlcnJvcihmaWxlX2luKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CiAgICAgICAgIH0KLQotICAgICAgICBpbnQgaW5wdXRfZmQgPSBvcGVuKGZpbGVfaW4sIE9fUkRPTkxZKTsKLSAgICAgICAgaWYgKGlucHV0X2ZkIDwgMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJvcGVuOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlucHV0X3NpemUgPSBzdC5zdF9zaXplOwotICAgICAgICBpbnB1dF92YWRkciA9IG1tYXAoMCwgaW5wdXRfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgaW5wdXRfZmQsIDApOwotICAgICAgICBpZiAoaW5wdXRfdmFkZHIgPT0gTUFQX0ZBSUxFRCApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibW1hcDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KKyAgICAgICAgaW5wdXRfc2l6ZSA9IGluZm8uZnJhbWVzICogaW5mby5jaGFubmVscyAqIHNpemVvZihzaG9ydCk7CisgICAgICAgIGlucHV0X3ZhZGRyID0gbWFsbG9jKGlucHV0X3NpemUpOworICAgICAgICAodm9pZCkgc2ZfcmVhZGZfc2hvcnQoc2YsIChzaG9ydCAqKSBpbnB1dF92YWRkciwgaW5mby5mcmFtZXMpOworICAgICAgICBzZl9jbG9zZShzZik7CisgICAgICAgIGNoYW5uZWxzID0gaW5mby5jaGFubmVsczsKKyAgICAgICAgaW5wdXRfZnJlcSA9IGluZm8uc2FtcGxlcmF0ZTsKICAgICB9IGVsc2UgeworICAgICAgICAvLyBkYXRhIGZvciB0ZXN0aW5nIGlzIGV4YWN0bHkgKGlucHV0IHNhbXBsaW5nIHJhdGUvMTAwMCkvMiBzZWNvbmRzCisgICAgICAgIC8vIHNvIDQ0LjFraHogaW5wdXQgaXMgMjIuMDUgc2Vjb25kcwogICAgICAgICBkb3VibGUgayA9IDEwMDA7IC8vIEh6IC8gcwogICAgICAgICBkb3VibGUgdGltZSA9IChpbnB1dF9mcmVxIC8gMikgLyBrOwogICAgICAgICBzaXplX3QgaW5wdXRfZnJhbWVzID0gc2l6ZV90KGlucHV0X2ZyZXEgKiB0aW1lKTsKQEAgLTE3Nyw5OCArMjM0LDI3NiBAQAogICAgICAgICAgICAgZG91YmxlIHQgPSBkb3VibGUoaSkgLyBpbnB1dF9mcmVxOwogICAgICAgICAgICAgZG91YmxlIHkgPSBzaW4oTV9QSSAqIGsgKiB0ICogdCk7CiAgICAgICAgICAgICBpbnQxNl90IHlpID0gZmxvb3IoeSAqIDMyNzY3LjAgKyAwLjUpOwotICAgICAgICAgICAgZm9yIChzaXplX3Qgaj0wIDsgajwoc2l6ZV90KWNoYW5uZWxzIDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaW5baSpjaGFubmVscyArIGpdID0geWkgLyAoMStqKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgICAgIGluW2kqY2hhbm5lbHMgKyBqXSA9IHlpIC8gKDEgKyBqKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKyAgICBzaXplX3QgaW5wdXRfZnJhbWVzaXplID0gY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgc2l6ZV90IGlucHV0X2ZyYW1lcyA9IGlucHV0X3NpemUgLyBpbnB1dF9mcmFtZXNpemU7CisKKyAgICAvLyBGb3IgZmxvYXQgcHJvY2Vzc2luZywgY29udmVydCBpbnB1dCBpbnQxNl90IHRvIGZsb2F0IGFycmF5CisgICAgaWYgKHVzZUZsb2F0KSB7CisgICAgICAgIHZvaWQgKm5ld192YWRkcjsKKworICAgICAgICBpbnB1dF9mcmFtZXNpemUgPSBjaGFubmVscyAqIHNpemVvZihmbG9hdCk7CisgICAgICAgIGlucHV0X3NpemUgPSBpbnB1dF9mcmFtZXMgKiBpbnB1dF9mcmFtZXNpemU7CisgICAgICAgIG5ld192YWRkciA9IG1hbGxvYyhpbnB1dF9zaXplKTsKKyAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihuZXdfdmFkZHIpLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KGlucHV0X3ZhZGRyKSwgaW5wdXRfZnJhbWVzICogY2hhbm5lbHMpOworICAgICAgICBmcmVlKGlucHV0X3ZhZGRyKTsKKyAgICAgICAgaW5wdXRfdmFkZHIgPSBuZXdfdmFkZHI7CisgICAgfQogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgY2xhc3MgUHJvdmlkZXI6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKLSAgICAgICAgaW50MTZfdCogbUFkZHI7Ci0gICAgICAgIHNpemVfdCBtTnVtRnJhbWVzOworICAgICAgICBjb25zdCB2b2lkKiAgICAgbUFkZHI7ICAgICAgLy8gYmFzZSBhZGRyZXNzCisgICAgICAgIGNvbnN0IHNpemVfdCAgICBtTnVtRnJhbWVzOyAvLyB0b3RhbCBmcmFtZXMKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgIG1GcmFtZVNpemU7IC8vIHNpemUgb2YgZWFjaCBmcmFtZSBpbiBieXRlcworICAgICAgICBzaXplX3QgICAgICAgICAgbU5leHRGcmFtZTsgLy8gaW5kZXggb2YgbmV4dCBmcmFtZSB0byBwcm92aWRlCisgICAgICAgIHNpemVfdCAgICAgICAgICBtVW5yZWw7ICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIG5vdCB5ZXQgcmVsZWFzZWQKKyAgICAgICAgY29uc3QgVmVjdG9yPGludD4gbVB2YWx1ZXM7IC8vIG51bWJlciBvZiBmcmFtZXMgcHJvdmlkZWQgcGVyIGNhbGwKKyAgICAgICAgc2l6ZV90ICAgICAgICAgIG1OZXh0UGlkeDsgIC8vIGluZGV4IG9mIG5leHQgZW50cnkgaW4gbVB2YWx1ZXMgdG8gdXNlCiAgICAgcHVibGljOgotICAgICAgICBQcm92aWRlcihjb25zdCB2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGNoYW5uZWxzKSB7Ci0gICAgICAgICAgICBtQWRkciA9IChpbnQxNl90KikgYWRkcjsKLSAgICAgICAgICAgIG1OdW1GcmFtZXMgPSBzaXplIC8gKGNoYW5uZWxzKnNpemVvZihpbnQxNl90KSk7CisgICAgICAgIFByb3ZpZGVyKGNvbnN0IHZvaWQqIGFkZHIsIHNpemVfdCBmcmFtZXMsIHNpemVfdCBmcmFtZVNpemUsIGNvbnN0IFZlY3RvcjxpbnQ+JiBQdmFsdWVzKQorICAgICAgICAgIDogbUFkZHIoYWRkciksCisgICAgICAgICAgICBtTnVtRnJhbWVzKGZyYW1lcyksCisgICAgICAgICAgICBtRnJhbWVTaXplKGZyYW1lU2l6ZSksCisgICAgICAgICAgICBtTmV4dEZyYW1lKDApLCBtVW5yZWwoMCksIG1QdmFsdWVzKFB2YWx1ZXMpLCBtTmV4dFBpZHgoMCkgewogICAgICAgICB9CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cyA9IGtJbnZhbGlkUFRTKSB7Ci0gICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBtTnVtRnJhbWVzOwotICAgICAgICAgICAgYnVmZmVyLT5pMTYgPSBtQWRkcjsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgICh2b2lkKXB0czsgLy8gc3VwcHJlc3Mgd2FybmluZworICAgICAgICAgICAgc2l6ZV90IHJlcXVlc3RlZEZyYW1lcyA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRGcmFtZXMgPiBtTnVtRnJhbWVzIC0gbU5leHRGcmFtZSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtUHZhbHVlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgcHJvdmlkZWQgPSBtUHZhbHVlc1ttTmV4dFBpZHgrK107CisgICAgICAgICAgICAgICAgcHJpbnRmKCJtUHZhbHVlWyV6dV09JXp1IG5vdCAlenVcbiIsIG1OZXh0UGlkeC0xLCBwcm92aWRlZCwgYnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAocHJvdmlkZWQgPCBidWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gcHJvdmlkZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtTmV4dFBpZHggPj0gbVB2YWx1ZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0UGlkeCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJnZXROZXh0QnVmZmVyKCkgcmVxdWVzdGVkICV6dSBmcmFtZXMgb3V0IG9mICV6dSBmcmFtZXMgYXZhaWxhYmxlLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIHJldHVybmVkICV6dSBmcmFtZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRGcmFtZXMsIChzaXplX3QpIChtTnVtRnJhbWVzIC0gbU5leHRGcmFtZSksIGJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVW5yZWwgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgICAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmF3ID0gKGNoYXIgKiltQWRkciArIG1GcmFtZVNpemUgKiBtTmV4dEZyYW1lOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5yYXcgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiBtVW5yZWwpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIHJlbGVhc2VCdWZmZXIoKSByZWxlYXNlZCAlenUgZnJhbWVzIGJ1dCBvbmx5ICV6dSBhdmFpbGFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInRvIHJlbGVhc2VcbiIsIGJ1ZmZlci0+ZnJhbWVDb3VudCwgbVVucmVsKTsKKyAgICAgICAgICAgICAgICBtTmV4dEZyYW1lICs9IG1VbnJlbDsKKyAgICAgICAgICAgICAgICBtVW5yZWwgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJyZWxlYXNlQnVmZmVyKCkgcmVsZWFzZWQgJXp1IGZyYW1lcyBvdXQgb2YgJXp1IGZyYW1lcyBhdmFpbGFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byByZWxlYXNlXG4iLCBidWZmZXItPmZyYW1lQ291bnQsIG1VbnJlbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1OZXh0RnJhbWUgKz0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgIG1VbnJlbCAtPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICAgICAgYnVmZmVyLT5yYXcgPSBOVUxMOwogICAgICAgICB9Ci0gICAgfSBwcm92aWRlcihpbnB1dF92YWRkciwgaW5wdXRfc2l6ZSwgY2hhbm5lbHMpOworICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgbU5leHRGcmFtZSA9IDA7CisgICAgICAgIH0KKyAgICB9IHByb3ZpZGVyKGlucHV0X3ZhZGRyLCBpbnB1dF9mcmFtZXMsIGlucHV0X2ZyYW1lc2l6ZSwgUHZhbHVlcyk7CiAKLSAgICBzaXplX3QgaW5wdXRfZnJhbWVzID0gaW5wdXRfc2l6ZSAvIChjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgc2l6ZV90IG91dHB1dF9zaXplID0gMiAqIDQgKiAoKGludDY0X3QpIGlucHV0X2ZyYW1lcyAqIG91dHB1dF9mcmVxKSAvIGlucHV0X2ZyZXE7Ci0gICAgb3V0cHV0X3NpemUgJj0gfjc7IC8vIGFsd2F5cyBzdGVyZW8sIDMyLWJpdHMKKyAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgcHJpbnRmKCIlenUgaW5wdXQgZnJhbWVzXG4iLCBpbnB1dF9mcmFtZXMpOworICAgIH0KIAotICAgIHZvaWQqIG91dHB1dF92YWRkciA9IG1hbGxvYyhvdXRwdXRfc2l6ZSk7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gdXNlRmxvYXQgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgaW50IG91dHB1dF9jaGFubmVscyA9IGNoYW5uZWxzID4gMiA/IGNoYW5uZWxzIDogMjsgLy8gb3V0cHV0IGlzIGF0IGxlYXN0IHN0ZXJlbyBzYW1wbGVzCisgICAgc2l6ZV90IG91dHB1dF9mcmFtZXNpemUgPSBvdXRwdXRfY2hhbm5lbHMgKiAodXNlRmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDMyX3QpKTsKKyAgICBzaXplX3Qgb3V0cHV0X2ZyYW1lcyA9ICgoaW50NjRfdCkgaW5wdXRfZnJhbWVzICogb3V0cHV0X2ZyZXEpIC8gaW5wdXRfZnJlcTsKKyAgICBzaXplX3Qgb3V0cHV0X3NpemUgPSBvdXRwdXRfZnJhbWVzICogb3V0cHV0X2ZyYW1lc2l6ZTsKIAotICAgIGlmIChwcm9maWxpbmcpIHsKLSAgICAgICAgQXVkaW9SZXNhbXBsZXIqIHJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoMTYsIGNoYW5uZWxzLAotICAgICAgICAgICAgICAgIG91dHB1dF9mcmVxLCBxdWFsaXR5KTsKLQotICAgICAgICBzaXplX3Qgb3V0X2ZyYW1lcyA9IG91dHB1dF9zaXplLzg7Ci0gICAgICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShpbnB1dF9mcmVxKTsKLSAgICAgICAgcmVzYW1wbGVyLT5zZXRWb2x1bWUoMHgxMDAwLCAweDEwMDApOwotCi0gICAgICAgIG1lbXNldChvdXRwdXRfdmFkZHIsIDAsIG91dHB1dF9zaXplKTsKKyAgICBpZiAocHJvZmlsZUZpbHRlcikgeworICAgICAgICAvLyBDaGVjayBob3cgZmFzdCBzYW1wbGUgcmF0ZSBjaGFuZ2VzIGFyZSB0aGF0IHJlcXVpcmUgZmlsdGVyIGNoYW5nZXMuCisgICAgICAgIC8vIFRoZSBkZWx0YSBzYW1wbGUgcmF0ZSBjaGFuZ2VzIG11c3QgaW5kaWNhdGUgYSBkb3duc2FtcGxpbmcgcmF0aW8sCisgICAgICAgIC8vIGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIDEwJSBjaGFuZ2VzLgorICAgICAgICAvLworICAgICAgICAvLyBPbiBmYXN0IGRldmljZXMsIGZpbHRlcnMgc2hvdWxkIGJlIGdlbmVyYXRlZCBiZXR3ZWVuIDAuMW1zIC0gMW1zLgorICAgICAgICAvLyAoc2luZ2xlIHRocmVhZGVkKS4KKyAgICAgICAgQXVkaW9SZXNhbXBsZXIqIHJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoZm9ybWF0LCBjaGFubmVscywKKyAgICAgICAgICAgICAgICA4MDAwLCBxdWFsaXR5KTsKKyAgICAgICAgaW50IGxvb3BsaW1pdCA9IDEwMDsKICAgICAgICAgdGltZXNwZWMgc3RhcnQsIGVuZDsKICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZzdGFydCk7Ci0gICAgICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludCopIG91dHB1dF92YWRkciwgb3V0X2ZyYW1lcywgJnByb3ZpZGVyKTsKLSAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyLCBvdXRfZnJhbWVzLCAmcHJvdmlkZXIpOwotICAgICAgICByZXNhbXBsZXItPnJlc2FtcGxlKChpbnQqKSBvdXRwdXRfdmFkZHIsIG91dF9mcmFtZXMsICZwcm92aWRlcik7Ci0gICAgICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludCopIG91dHB1dF92YWRkciwgb3V0X2ZyYW1lcywgJnByb3ZpZGVyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29wbGltaXQ7ICsraSkgeworICAgICAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKDkwMDApOworICAgICAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKDEyMDAwKTsKKyAgICAgICAgICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSgyMDAwMCk7CisgICAgICAgICAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoMzAwMDApOworICAgICAgICB9CiAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmZW5kKTsKICAgICAgICAgaW50NjRfdCBzdGFydF9ucyA9IHN0YXJ0LnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIHN0YXJ0LnR2X25zZWM7CiAgICAgICAgIGludDY0X3QgZW5kX25zID0gZW5kLnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIGVuZC50dl9uc2VjOwotICAgICAgICBpbnQ2NF90IHRpbWUgPSAoZW5kX25zIC0gc3RhcnRfbnMpLzQ7Ci0gICAgICAgIHByaW50ZigiJWYgTXNwbC9zXG4iLCBvdXRfZnJhbWVzLyh0aW1lLzFlOSkvMWU2KTsKKyAgICAgICAgaW50NjRfdCB0aW1lID0gZW5kX25zIC0gc3RhcnRfbnM7CisgICAgICAgIHByaW50ZigiJS4yZiBzYW1wbGUgcmF0ZSBjaGFuZ2VzIHdpdGggZmlsdGVyIGNhbGN1bGF0aW9uL3NlY1xuIiwKKyAgICAgICAgICAgICAgICBsb29wbGltaXQgKiA0IC8gKHRpbWUgLyAxZTkpKTsKIAorICAgICAgICAvLyBDaGVjayBob3cgZmFzdCBzYW1wbGUgcmF0ZSBjaGFuZ2VzIGFyZSB3aXRob3V0IGZpbHRlciBjaGFuZ2VzLgorICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSB2ZXJ5IGZhc3QsIHByb2JhYmx5IDAuMXVzIC0gMXVzIHBlciBzYW1wbGUgcmF0ZQorICAgICAgICAvLyBjaGFuZ2UuCisgICAgICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSgxMDAwKTsKKyAgICAgICAgbG9vcGxpbWl0ID0gMTAwMDsKKyAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZzdGFydCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9vcGxpbWl0OyArK2kpIHsKKyAgICAgICAgICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSgxMDAwK2kpOworICAgICAgICB9CisgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmZW5kKTsKKyAgICAgICAgc3RhcnRfbnMgPSBzdGFydC50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyBzdGFydC50dl9uc2VjOworICAgICAgICBlbmRfbnMgPSBlbmQudHZfc2VjICogMTAwMDAwMDAwMExMICsgZW5kLnR2X25zZWM7CisgICAgICAgIHRpbWUgPSBlbmRfbnMgLSBzdGFydF9uczsKKyAgICAgICAgcHJpbnRmKCIlLjJmIHNhbXBsZSByYXRlIGNoYW5nZXMgd2l0aG91dCBmaWx0ZXIgY2FsY3VsYXRpb24vc2VjXG4iLAorICAgICAgICAgICAgICAgIGxvb3BsaW1pdCAvICh0aW1lIC8gMWU5KSk7CisgICAgICAgIHJlc2FtcGxlci0+cmVzZXQoKTsKICAgICAgICAgZGVsZXRlIHJlc2FtcGxlcjsKICAgICB9CiAKLSAgICBBdWRpb1Jlc2FtcGxlciogcmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgxNiwgY2hhbm5lbHMsCisgICAgdm9pZCogb3V0cHV0X3ZhZGRyID0gbWFsbG9jKG91dHB1dF9zaXplKTsKKyAgICBBdWRpb1Jlc2FtcGxlciogcmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShmb3JtYXQsIGNoYW5uZWxzLAogICAgICAgICAgICAgb3V0cHV0X2ZyZXEsIHF1YWxpdHkpOwotICAgIHNpemVfdCBvdXRfZnJhbWVzID0gb3V0cHV0X3NpemUvODsKKwogICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShpbnB1dF9mcmVxKTsKLSAgICByZXNhbXBsZXItPnNldFZvbHVtZSgweDEwMDAsIDB4MTAwMCk7CisgICAgcmVzYW1wbGVyLT5zZXRWb2x1bWUoQXVkaW9SZXNhbXBsZXI6OlVOSVRZX0dBSU5fRkxPQVQsIEF1ZGlvUmVzYW1wbGVyOjpVTklUWV9HQUlOX0ZMT0FUKTsKKworICAgIGlmIChwcm9maWxlUmVzYW1wbGUpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIHByb2ZpbGluZyBvbiBtb2JpbGUgZGV2aWNlcywgdXBvbiBleHBlcmltZW50YXRpb24KKyAgICAgICAgICogaXQgaXMgYmV0dGVyIHRvIHJ1biBhIGZldyB0cmlhbHMgd2l0aCBhIHNob3J0ZXIgbG9vcCBsaW1pdCwKKyAgICAgICAgICogYW5kIHRha2UgdGhlIG1pbmltdW0gdGltZS4KKyAgICAgICAgICoKKyAgICAgICAgICogTG9uZyB0ZXN0cyBjYW4gY2F1c2UgQ1BVIHRlbXBlcmF0dXJlIHRvIGJ1aWxkIHVwIGFuZCB0aGVybWFsIHRocm90dGxpbmcKKyAgICAgICAgICogdG8gcmVkdWNlIENQVSBmcmVxdWVuY3kuCisgICAgICAgICAqCisgICAgICAgICAqIEZvciBmcmVxdWVuY3kgY2hlY2tzIChpbmRleD0wLCBvciAxLCBldGMuKToKKyAgICAgICAgICogImNhdCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUke2luZGV4fS9jcHVmcmVxL3NjYWxpbmdfKl9mcmVxIgorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgdGVtcGVyYXR1cmUgY2hlY2tzIChpbmRleD0wLCBvciAxLCBldGMuKToKKyAgICAgICAgICogImNhdCAvc3lzL2NsYXNzL3RoZXJtYWwvdGhlcm1hbF96b25lJHtpbmRleH0vdGVtcCIKKyAgICAgICAgICoKKyAgICAgICAgICogQW5vdGhlciB3YXkgdG8gYXZvaWQgdGhlcm1hbCB0aHJvdHRsaW5nIGlzIHRvIGZpeCB0aGUgQ1BVIGZyZXF1ZW5jeQorICAgICAgICAgKiBhdCBhIGxvd2VyIGxldmVsIHdoaWNoIHByZXZlbnRzIGV4Y2Vzc2l2ZSB0ZW1wZXJhdHVyZXMuCisgICAgICAgICAqLworICAgICAgICBjb25zdCBpbnQgdHJpYWxzID0gNDsKKyAgICAgICAgY29uc3QgaW50IGxvb3BsaW1pdCA9IDQ7CisgICAgICAgIHRpbWVzcGVjIHN0YXJ0LCBlbmQ7CisgICAgICAgIGludDY0X3QgdGltZSA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCB0cmlhbHM7ICsrbikgeworICAgICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZzdGFydCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb3BsaW1pdDsgKytpKSB7CisgICAgICAgICAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyLCBvdXRwdXRfZnJhbWVzLCAmcHJvdmlkZXIpOworICAgICAgICAgICAgICAgIHByb3ZpZGVyLnJlc2V0KCk7IC8vICBkdXJpbmcgYmVuY2htYXJraW5nIHJlc2V0IG9ubHkgdGhlIHByb3ZpZGVyCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmVuZCk7CisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0X25zID0gc3RhcnQudHZfc2VjICogMTAwMDAwMDAwMExMICsgc3RhcnQudHZfbnNlYzsKKyAgICAgICAgICAgIGludDY0X3QgZW5kX25zID0gZW5kLnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIGVuZC50dl9uc2VjOworICAgICAgICAgICAgaW50NjRfdCBkaWZmX25zID0gZW5kX25zIC0gc3RhcnRfbnM7CisgICAgICAgICAgICBpZiAobiA9PSAwIHx8IGRpZmZfbnMgPCB0aW1lKSB7CisgICAgICAgICAgICAgICAgdGltZSA9IGRpZmZfbnM7ICAgLy8gc2F2ZSB0aGUgYmVzdCBvdXQgb2Ygb3VyIHRyaWFscy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBNZnJtcy9zIGlzICJNaWxsaW9ucyBvZiBvdXRwdXQgZnJhbWVzIHBlciBzZWNvbmQiLgorICAgICAgICBwcmludGYoInF1YWxpdHk6ICVkICBjaGFubmVsczogJWQgIG1zZWM6ICUiIFBSSWQ2NCAiICBNZnJtcy9zOiAlLjJsZlxuIiwKKyAgICAgICAgICAgICAgICBxdWFsaXR5LCBjaGFubmVscywgdGltZS8xMDAwMDAwLCBvdXRwdXRfZnJhbWVzICogbG9vcGxpbWl0IC8gKHRpbWUgLyAxZTkpIC8gMWU2KTsKKyAgICAgICAgcmVzYW1wbGVyLT5yZXNldCgpOworICAgIH0KIAogICAgIG1lbXNldChvdXRwdXRfdmFkZHIsIDAsIG91dHB1dF9zaXplKTsKLSAgICByZXNhbXBsZXItPnJlc2FtcGxlKChpbnQqKSBvdXRwdXRfdmFkZHIsIG91dF9mcmFtZXMsICZwcm92aWRlcik7CisgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigicmVzYW1wbGUoKSAlenUgb3V0cHV0IGZyYW1lc1xuIiwgb3V0cHV0X2ZyYW1lcyk7CisgICAgfQorICAgIGlmIChPdmFsdWVzLmlzRW1wdHkoKSkgeworICAgICAgICBPdmFsdWVzLnB1c2gob3V0cHV0X2ZyYW1lcyk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwLCBqID0gMDsgaSA8IG91dHB1dF9mcmFtZXM7ICkgeworICAgICAgICBzaXplX3QgdGhpc0ZyYW1lcyA9IE92YWx1ZXNbaisrXTsKKyAgICAgICAgaWYgKGogPj0gT3ZhbHVlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzRnJhbWVzID09IDAgfHwgdGhpc0ZyYW1lcyA+IG91dHB1dF9mcmFtZXMgLSBpKSB7CisgICAgICAgICAgICB0aGlzRnJhbWVzID0gb3V0cHV0X2ZyYW1lcyAtIGk7CisgICAgICAgIH0KKyAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyICsgb3V0cHV0X2NoYW5uZWxzKmksIHRoaXNGcmFtZXMsICZwcm92aWRlcik7CisgICAgICAgIGkgKz0gdGhpc0ZyYW1lczsKKyAgICB9CisgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigicmVzYW1wbGUoKSBjb21wbGV0ZVxuIik7CisgICAgfQorICAgIHJlc2FtcGxlci0+cmVzZXQoKTsKKyAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgcHJpbnRmKCJyZXNldCgpIGNvbXBsZXRlXG4iKTsKKyAgICB9CisgICAgZGVsZXRlIHJlc2FtcGxlcjsKKyAgICByZXNhbXBsZXIgPSBOVUxMOwogCi0gICAgLy8gZG93bi1taXggKHdlIGp1c3QgdHJ1bmNhdGUgYW5kIGtlZXAgdGhlIGxlZnQgY2hhbm5lbCkKKyAgICAvLyBGb3IgZmxvYXQgcHJvY2Vzc2luZywgY29udmVydCBvdXRwdXQgZm9ybWF0IGZyb20gZmxvYXQgdG8gUTQuMjcsCisgICAgLy8gd2hpY2ggaXMgdGhlbiBjb252ZXJ0ZWQgdG8gaW50MTZfdCBmb3IgZmluYWwgc3RvcmFnZS4KKyAgICBpZiAodXNlRmxvYXQpIHsKKyAgICAgICAgbWVtY3B5X3RvX3E0XzI3X2Zyb21fZmxvYXQocmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4ob3V0cHV0X3ZhZGRyKSwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGZsb2F0Kj4ob3V0cHV0X3ZhZGRyKSwgb3V0cHV0X2ZyYW1lcyAqIG91dHB1dF9jaGFubmVscyk7CisgICAgfQorCisgICAgLy8gbW9ubyB0YWtlcyBsZWZ0IGNoYW5uZWwgb25seSAob3V0IG9mIHN0ZXJlbyBvdXRwdXQgcGFpcikKKyAgICAvLyBzdGVyZW8gYW5kIG11bHRpY2hhbm5lbCBwcmVzZXJ2ZSBhbGwgY2hhbm5lbHMuCiAgICAgaW50MzJfdCogb3V0ID0gKGludDMyX3QqKSBvdXRwdXRfdmFkZHI7Ci0gICAgaW50MTZfdCogY29udmVydCA9IChpbnQxNl90KikgbWFsbG9jKG91dF9mcmFtZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRfZnJhbWVzOyBpKyspIHsKLSAgICAgICAgZm9yIChpbnQgaj0wIDsgajxjaGFubmVscyA7IGorKykgewotICAgICAgICAgICAgaW50MzJfdCBzID0gb3V0W2kgKiAyICsgal0gPj4gMTI7Ci0gICAgICAgICAgICBpZiAocyA+IDMyNzY3KSAgICAgICBzID0gIDMyNzY3OwotICAgICAgICAgICAgZWxzZSBpZiAocyA8IC0zMjc2OCkgcyA9IC0zMjc2ODsKKyAgICBpbnQxNl90KiBjb252ZXJ0ID0gKGludDE2X3QqKSBtYWxsb2Mob3V0cHV0X2ZyYW1lcyAqIGNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKKworICAgIGNvbnN0IGludCB2b2x1bWVTaGlmdCA9IDEyOyAvLyBzaGlmdCByZXF1aXJlbWVudCBmb3IgUTQuMjcgdG8gUS4xNQorICAgIC8vIHJvdW5kIHRvIGhhbGYgdG93YXJkcyB6ZXJvIGFuZCBzYXR1cmF0ZSBhdCBpbnQxNiAobm9uLWRpdGhlcmVkKQorICAgIGNvbnN0IGludCByb3VuZFZhbCA9ICgxPDwodm9sdW1lU2hpZnQtMSkpIC0gMTsgLy8gdm9sdW1lUHJlY2lzaW9uID4gMAorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICBpbnQzMl90IHMgPSBvdXRbaSAqIG91dHB1dF9jaGFubmVscyArIGpdICsgcm91bmRWYWw7IC8vIGFkZCBvZmZzZXQgaGVyZQorICAgICAgICAgICAgaWYgKHMgPCAwKSB7CisgICAgICAgICAgICAgICAgcyA9IChzICsgMSkgPj4gdm9sdW1lU2hpZnQ7IC8vIHJvdW5kIHRvIDAKKyAgICAgICAgICAgICAgICBpZiAocyA8IC0zMjc2OCkgeworICAgICAgICAgICAgICAgICAgICBzID0gLTMyNzY4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcyA9IHMgPj4gdm9sdW1lU2hpZnQ7CisgICAgICAgICAgICAgICAgaWYgKHMgPiAzMjc2NykgeworICAgICAgICAgICAgICAgICAgICBzID0gMzI3Njc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgY29udmVydFtpICogY2hhbm5lbHMgKyBqXSA9IGludDE2X3Qocyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyB3cml0ZSBvdXRwdXQgdG8gZGlzawotICAgIGludCBvdXRwdXRfZmQgPSBvcGVuKGZpbGVfb3V0LCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLAotICAgICAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7Ci0gICAgaWYgKG91dHB1dF9mZCA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJvcGVuOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgIFNGX0lORk8gaW5mbzsKKyAgICBpbmZvLmZyYW1lcyA9IDA7CisgICAgaW5mby5zYW1wbGVyYXRlID0gb3V0cHV0X2ZyZXE7CisgICAgaW5mby5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIGluZm8uZm9ybWF0ID0gU0ZfRk9STUFUX1dBViB8IFNGX0ZPUk1BVF9QQ01fMTY7CisgICAgU05ERklMRSAqc2YgPSBzZl9vcGVuKGZpbGVfb3V0LCBTRk1fV1JJVEUsICZpbmZvKTsKKyAgICBpZiAoc2YgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZV9vdXQpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgIH0KKyAgICAodm9pZCkgc2Zfd3JpdGVmX3Nob3J0KHNmLCBjb252ZXJ0LCBvdXRwdXRfZnJhbWVzKTsKKyAgICBzZl9jbG9zZShzZik7CiAKLSAgICBpZiAod3JpdGVIZWFkZXIpIHsKLSAgICAgICAgSGVhZGVyV2F2IHdhdihvdXRfZnJhbWVzICogY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCksIGNoYW5uZWxzLCBvdXRwdXRfZnJlcSwgMTYpOwotICAgICAgICB3cml0ZShvdXRwdXRfZmQsICZ3YXYsIHNpemVvZih3YXYpKTsKLSAgICB9Ci0KLSAgICB3cml0ZShvdXRwdXRfZmQsIGNvbnZlcnQsIG91dF9mcmFtZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgY2xvc2Uob3V0cHV0X2ZkKTsKLQotICAgIHJldHVybiAwOworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYmEwNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDczIEBACisjIEJ1aWxkIHRoZSB1bml0IHRlc3RzIGZvciBhdWRpb2ZsaW5nZXIKKworIworIyByZXNhbXBsZXIgdW5pdCB0ZXN0CisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJsb2cgXAorCWxpYnV0aWxzIFwKKwlsaWJjdXRpbHMgXAorCWxpYnN0bHBvcnQgXAorCWxpYmF1ZGlvdXRpbHMgXAorCWxpYmF1ZGlvcmVzYW1wbGVyCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorCWxpYmd0ZXN0IFwKKwlsaWJndGVzdF9tYWluCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCWJpb25pYyBcCisJYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKKwlleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKKwlleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAorCWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJcmVzYW1wbGVyX3Rlc3RzLmNwcAorCitMT0NBTF9NT0RVTEUgOj0gcmVzYW1wbGVyX3Rlc3RzCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworIworIyBhdWRpbyBtaXhlciB0ZXN0IHRvb2wKKyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJdGVzdC1taXhlci5jcHAgXAorCS4uL0F1ZGlvTWl4ZXIuY3BwLmFybSBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCWJpb25pYyBcCisJYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKKwlleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCisJZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisJbGlic25kZmlsZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJzdGxwb3J0IFwKKwlsaWJlZmZlY3RzIFwKKwlsaWJuYmFpbyBcCisJbGliY29tbW9uX3RpbWVfY2xpZW50IFwKKwlsaWJhdWRpb3Jlc2FtcGxlciBcCisJbGliYXVkaW91dGlscyBcCisJbGliZGwgXAorCWxpYmN1dGlscyBcCisJbGlidXRpbHMgXAorCWxpYmxvZworCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW1peGVyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYzQ1M2IwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSwyMiBAQAorIyEvYmluL2Jhc2gKKworaWYgWyAteiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCisgICAgZWNobyAiQW5kcm9pZCBidWlsZCBlbnZpcm9ubWVudCBub3Qgc2V0IgorICAgIGV4aXQgLTEKK2ZpCisKKyMgZW5zdXJlIHdlIGhhdmUgbW0KKy4gJEFORFJPSURfQlVJTERfVE9QL2J1aWxkL2VudnNldHVwLnNoCisKK3B1c2hkICRBTkRST0lEX0JVSUxEX1RPUC9mcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlci8KK3B3ZAorbW0KKworZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgorYWRiIHJvb3QgJiYgYWRiIHdhaXQtZm9yLWRldmljZSByZW1vdW50CithZGIgcHVzaCAkT1VUL3N5c3RlbS9saWIvbGliYXVkaW9yZXNhbXBsZXIuc28gL3N5c3RlbS9saWIKK2FkYiBwdXNoICRPVVQvc3lzdGVtL2Jpbi9yZXNhbXBsZXJfdGVzdHMgL3N5c3RlbS9iaW4KKworc2ggJEFORFJPSURfQlVJTERfVE9QL2ZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3J1bl9hbGxfdW5pdF90ZXN0cy5zaAorCitwb3BkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvbWl4ZXJfdG9fd2F2X3Rlc3RzLnNoIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL21peGVyX3RvX3dhdl90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YjM5ZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL21peGVyX3RvX3dhdl90ZXN0cy5zaApAQCAtMCwwICsxLDEzNCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVGhpcyBzY3JpcHQgdXNlcyB0ZXN0LW1peGVyIHRvIGdlbmVyYXRlIFdBViBmaWxlcworIyBmb3IgZXZhbHVhdGlvbiBvZiB0aGUgQXVkaW9NaXhlciBjb21wb25lbnQuCisjCisjIFNpbmUgYW5kIGNoaXJwIHNpZ25hbHMgYXJlIHVzZWQgZm9yIGlucHV0IGJlY2F1c2UgdGhleQorIyBzaG93IHVwIGFzIGNsZWFyIGxpbmVzLCBlaXRoZXIgaG9yaXpvbnRhbCBvciBkaWFnb25hbCwKKyMgb24gYSBzcGVjdHJvZ3JhbS4gVGhpcyBtZWFucyBlYXN5IHZlcmlmaWNhdGlvbiBvZiBtdWx0aXBsZQorIyB0cmFjayBtaXhpbmcuCisjCisjIEFmdGVyIGV4ZWN1dGlvbiwgbG9vayBmb3IgY3JlYXRlZCBzdWJkaXJlY3RvcmllcyBsaWtlCisjIG1peGVyX2lfaQorIyBtaXhlcl9pX2YKKyMgbWl4ZXJfZl9mCisjCisjIFJlY29tbWVuZCB1c2luZyBhIHByb2dyYW0gc3VjaCBhcyBhdWRhY2l0eSB0byBldmFsdWF0ZQorIyB0aGUgb3V0cHV0IFdBViBmaWxlcywgZS5nLgorIworIyBjZCB0ZXN0ZGlyCisjIGF1ZGFjaXR5ICoud2F2CisjCisjIFVzaW5nIEF1ZGFjaXR5OgorIworIyBVbmRlciAiV2F2ZWZvcm0iIHZpZXcgbW9kZSB5b3UgY2FuIHpvb20gaW50byB0aGUKKyMgc3RhcnQgb2YgdGhlIFdBViBmaWxlIHRvIHZlcmlmeSBwcm9wZXIgcmFtcGluZy4KKyMKKyMgU2VsZWN0ICJTcGVjdHJvZ3JhbSIgdG8gc2VlIHZlcmlmeSB0aGUgbGluZXMKKyMgKHNpbmUgPSBob3Jpem9udGFsLCBjaGlycCA9IGRpYWdvbmFsKSB3aGljaCBzaG91bGQKKyMgYmUgY2xlYXIgKGV4Y2VwdCBmb3IgYXJvdW5kIHRoZSBzdGFydCBhcyB0aGUgdm9sdW1lCisjIHJhbXBpbmcgY2F1c2VzIHNwZWN0cmFsIGRpc3RvcnRpb24pLgorCitpZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KKyAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCisgICAgZXhpdCAtMQorZmkKKworIyBlbnN1cmUgd2UgaGF2ZSBtbQorLiAkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvZW52c2V0dXAuc2gKKworcHVzaGQgJEFORFJPSURfQlVJTERfVE9QL2ZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyLworCisjIGJ1aWxkCitwd2QKK21tCisKKyMgc2VuZCB0byBkZXZpY2UKK2VjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorYWRiIHB1c2ggJE9VVC9zeXN0ZW0vbGliL2xpYmF1ZGlvcmVzYW1wbGVyLnNvIC9zeXN0ZW0vbGliCithZGIgcHVzaCAkT1VUL3N5c3RlbS9iaW4vdGVzdC1taXhlciAvc3lzdGVtL2JpbgorCisjIGNyZWF0ZXdhdiBjcmVhdGVzIGEgc2VyaWVzIG9mIFdBViBmaWxlcyB0ZXN0aW5nIHZhcmlvdXMKKyMgbWl4ZXIgc2V0dGluZ3MKKyMgJDEgPSBmbGFncworIyAkMiA9IGRpcmVjdG9yeQorZnVuY3Rpb24gY3JlYXRld2F2KCkgeworIyBjcmVhdGUgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAgICBpZiBbICEgLWQgJDIgXTsgdGhlbgorICAgICAgICBta2RpciAkMgorICAgIGZpCisKKyMgVGVzdDoKKyMgcHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcKKyMgdHJhY2tfX1Jlc2FtcGxlIC8gdHJhY2tfX2dlbmVyaWNSZXNhbXBsZQorICAgIGFkYiBzaGVsbCB0ZXN0LW1peGVyICQxIC1zIDQ4MDAwIFwKKyAgICAgICAgLW8gL3NkY2FyZC90bTQ4MDAwZ3Iud2F2IFwKKyAgICAgICAgc2luZToyLDQwMDAsNzUyMCBjaGlycDoyLDkyMDAgc2luZToxLDMwMDAsMTgwMDAKKyAgICBhZGIgcHVsbCAvc2RjYXJkL3RtNDgwMDBnci53YXYgJDIKKworIyBUZXN0OgorIyBwcm9jZXNzX19nZW5lcmljUmVzYW1wbGUKKyMgdHJhY2tfX1Jlc2FtcGxlIC8gdHJhY2tfX2dlbmVyaWNSZXNhbXBsZQorIyB0cmFja19fTm9SZXNhbXBsZSAvIHRyYWNrX18xNkJpdHNTdGVyZW8gLyB0cmFja19fMTZCaXRzTW9ubworIyBBdXggYnVmZmVyCisgICAgYWRiIHNoZWxsIHRlc3QtbWl4ZXIgJDEgLWMgNSAtcyA5MzA3IFwKKyAgICAgICAgLWEgL3NkY2FyZC9hdXg5MzA3Z3JhLndhdiAtbyAvc2RjYXJkL3RtOTMwN2dyYS53YXYgXAorICAgICAgICBzaW5lOjQsMTAwMCwzMDAwIHNpbmU6MSwyMDAwLDkzMDcgY2hpcnA6Myw5MzA3CisgICAgYWRiIHB1bGwgL3NkY2FyZC90bTkzMDdncmEud2F2ICQyCisgICAgYWRiIHB1bGwgL3NkY2FyZC9hdXg5MzA3Z3JhLndhdiAkMgorCisjIFRlc3Q6CisjIHByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmcKKyMgdHJhY2tfX05vUmVzYW1wbGUgLyB0cmFja19fMTZCaXRzU3RlcmVvIC8gdHJhY2tfXzE2Qml0c01vbm8KKyAgICBhZGIgc2hlbGwgdGVzdC1taXhlciAkMSAtcyAzMjAwMCBcCisgICAgICAgIC1vIC9zZGNhcmQvdG0zMjAwMGduci53YXYgXAorICAgICAgICBzaW5lOjIsMTAwMCwzMjAwMCBjaGlycDoyLDMyMDAwICBzaW5lOjEsMzAwMCwzMjAwMAorICAgIGFkYiBwdWxsIC9zZGNhcmQvdG0zMjAwMGduci53YXYgJDIKKworIyBUZXN0OgorIyBwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nCisjIHRyYWNrX19Ob1Jlc2FtcGxlIC8gdHJhY2tfXzE2Qml0c1N0ZXJlbyAvIHRyYWNrX18xNkJpdHNNb25vCisjIEF1eCBidWZmZXIKKyAgICBhZGIgc2hlbGwgdGVzdC1taXhlciAkMSAtcyAzMjAwMCBcCisgICAgICAgIC1hIC9zZGNhcmQvYXV4MzIwMDBnbnJhLndhdiAtbyAvc2RjYXJkL3RtMzIwMDBnbnJhLndhdiBcCisgICAgICAgIHNpbmU6MiwxMDAwLDMyMDAwIGNoaXJwOjIsMzIwMDAgIHNpbmU6MSwzMDAwLDMyMDAwCisgICAgYWRiIHB1bGwgL3NkY2FyZC90bTMyMDAwZ25yYS53YXYgJDIKKyAgICBhZGIgcHVsbCAvc2RjYXJkL2F1eDMyMDAwZ25yYS53YXYgJDIKKworIyBUZXN0OgorIyBwcm9jZXNzX19Ob1Jlc2FtcGxlT25lVHJhY2sgLyBwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZworIyBEb3dubWl4ZXIKKyAgICBhZGIgc2hlbGwgdGVzdC1taXhlciAkMSAtcyAzMjAwMCBcCisgICAgICAgIC1vIC9zZGNhcmQvdG0zMjAwMG5yb3Qud2F2IFwKKyAgICAgICAgc2luZTo2LDEwMDAsMzIwMDAKKyAgICBhZGIgcHVsbCAvc2RjYXJkL3RtMzIwMDBucm90LndhdiAkMgorCisjIFRlc3Q6CisjIHByb2Nlc3NfX05vUmVzYW1wbGVPbmVUcmFjayAvIE9uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nCisjIEF1eCBidWZmZXIKKyAgICBhZGIgc2hlbGwgdGVzdC1taXhlciAkMSAtcyA0NDEwMCBcCisgICAgICAgIC1hIC9zZGNhcmQvYXV4NDQxMDBucm90YS53YXYgLW8gL3NkY2FyZC90bTQ0MTAwbnJvdGEud2F2IFwKKyAgICAgICAgc2luZToyLDIwMDAsNDQxMDAKKyAgICBhZGIgcHVsbCAvc2RjYXJkL3RtNDQxMDBucm90YS53YXYgJDIKKyAgICBhZGIgcHVsbCAvc2RjYXJkL2F1eDQ0MTAwbnJvdGEud2F2ICQyCit9CisKKyMKKyMgQ2FsbCBjcmVhdGV3YXYgdG8gZ2VuZXJhdGUgV0FWIGZpbGVzIGluIHZhcmlvdXMgY29tYmluYXRpb25zCisjCisjIGlfaSA9IGludGVnZXIgaW5wdXQgdHJhY2ssIGludGVnZXIgbWl4ZXIgb3V0cHV0CisjIGZfZiA9IGZsb2F0IGlucHV0IHRyYWNrLCAgIGZsb2F0IG1peGVyIG91dHB1dAorIyBpX2YgPSBpbnRlZ2VyIGlucHV0IHRyYWNrLCBmbG9hdF9taXhlciBvdXRwdXQKKyMKKyMgSWYgdGhlIG1peGVyIG91dHB1dCBpcyBmbG9hdCwgdGhlbiB0aGUgb3V0cHV0IFdBViBmaWxlIGlzIHBjbSBmbG9hdC4KKyMKKyMgVE9ETzogY3JlYXRlIGEgInNuciIgbGlrZSAiZGlmZiIgdG8gYXV0b21hdGljYWxseQorIyBjb21wYXJlIGZpbGVzIGluIHRoZXNlIGRpcmVjdG9yaWVzIHRvZ2V0aGVyLgorIworCitjcmVhdGV3YXYgIiIgInRlc3RzL21peGVyX2lfaSIKK2NyZWF0ZXdhdiAiLWYgLW0iICJ0ZXN0cy9taXhlcl9mX2YiCitjcmVhdGV3YXYgIi1tIiAidGVzdHMvbWl4ZXJfaV9mIgorCitwb3BkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9yZXNhbXBsZXJfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MjE3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcApAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiYXVkaW9mbGluZ2VyX3Jlc2FtcGxlcl90ZXN0cyIKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgorI2luY2x1ZGUgInRlc3RfdXRpbHMuaCIKKwordm9pZCByZXNhbXBsZShpbnQgY2hhbm5lbHMsIHZvaWQgKm91dHB1dCwKKyAgICAgICAgc2l6ZV90IG91dHB1dEZyYW1lcywgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmb3V0cHV0SW5jciwKKyAgICAgICAgYW5kcm9pZDo6QXVkaW9CdWZmZXJQcm92aWRlciAqcHJvdmlkZXIsIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyICpyZXNhbXBsZXIpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDAsIGogPSAwOyBpIDwgb3V0cHV0RnJhbWVzOyApIHsKKyAgICAgICAgc2l6ZV90IHRoaXNGcmFtZXMgPSBvdXRwdXRJbmNyW2orK107CisgICAgICAgIGlmIChqID49IG91dHB1dEluY3Iuc2l6ZSgpKSB7CisgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpc0ZyYW1lcyA9PSAwIHx8IHRoaXNGcmFtZXMgPiBvdXRwdXRGcmFtZXMgLSBpKSB7CisgICAgICAgICAgICB0aGlzRnJhbWVzID0gb3V0cHV0RnJhbWVzIC0gaTsKKyAgICAgICAgfQorICAgICAgICByZXNhbXBsZXItPnJlc2FtcGxlKChpbnQzMl90Kikgb3V0cHV0ICsgY2hhbm5lbHMqaSwgdGhpc0ZyYW1lcywgcHJvdmlkZXIpOworICAgICAgICBpICs9IHRoaXNGcmFtZXM7CisgICAgfQorfQorCit2b2lkIGJ1ZmZlcmNtcChjb25zdCB2b2lkICpyZWZlcmVuY2UsIGNvbnN0IHZvaWQgKnRlc3QsCisgICAgICAgIHNpemVfdCBvdXRwdXRGcmFtZVNpemUsIHNpemVfdCBvdXRwdXRGcmFtZXMpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRGcmFtZXM7ICsraSkgeworICAgICAgICBpbnQgY2hlY2sgPSBtZW1jbXAoKGNvbnN0IGNoYXIqKXJlZmVyZW5jZSArIGkgKiBvdXRwdXRGcmFtZVNpemUsCisgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKXRlc3QgKyBpICogb3V0cHV0RnJhbWVTaXplLCBvdXRwdXRGcmFtZVNpemUpOworICAgICAgICBpZiAoY2hlY2spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsdXJlIGF0IGZyYW1lICV6dSIsIGkpOworICAgICAgICAgICAgQVNTRVJUX0VRKGNoZWNrLCAwKTsgLyogZmFpbHMgKi8KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB0ZXN0QnVmZmVySW5jcmVtZW50KHNpemVfdCBjaGFubmVscywgYm9vbCB1c2VGbG9hdCwKKyAgICAgICAgdW5zaWduZWQgaW5wdXRGcmVxLCB1bnNpZ25lZCBvdXRwdXRGcmVxLAorICAgICAgICBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBxdWFsaXR5KQoreworICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHVzZUZsb2F0ID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIC8vIGNyZWF0ZSB0aGUgcHJvdmlkZXIKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGlucHV0SW5jcjsKKyAgICBTaWduYWxQcm92aWRlciBwcm92aWRlcjsKKyAgICBpZiAodXNlRmxvYXQpIHsKKyAgICAgICAgcHJvdmlkZXIuc2V0Q2hpcnA8ZmxvYXQ+KGNoYW5uZWxzLAorICAgICAgICAgICAgICAgIDAuLCBvdXRwdXRGcmVxLzIuLCBvdXRwdXRGcmVxLCBvdXRwdXRGcmVxLzIwMDAuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcm92aWRlci5zZXRDaGlycDxpbnQxNl90PihjaGFubmVscywKKyAgICAgICAgICAgICAgICAwLiwgb3V0cHV0RnJlcS8yLiwgb3V0cHV0RnJlcSwgb3V0cHV0RnJlcS8yMDAwLik7CisgICAgfQorICAgIHByb3ZpZGVyLnNldEluY3IoaW5wdXRJbmNyKTsKKworICAgIC8vIGNhbGN1bGF0ZSB0aGUgb3V0cHV0IHNpemUKKyAgICBzaXplX3Qgb3V0cHV0RnJhbWVzID0gKChpbnQ2NF90KSBwcm92aWRlci5nZXROdW1GcmFtZXMoKSAqIG91dHB1dEZyZXEpIC8gaW5wdXRGcmVxOworICAgIHNpemVfdCBvdXRwdXRGcmFtZVNpemUgPSBjaGFubmVscyAqICh1c2VGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MzJfdCkpOworICAgIHNpemVfdCBvdXRwdXRTaXplID0gb3V0cHV0RnJhbWVTaXplICogb3V0cHV0RnJhbWVzOworICAgIG91dHB1dFNpemUgJj0gfjc7CisKKyAgICAvLyBjcmVhdGUgdGhlIHJlc2FtcGxlcgorICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyKiByZXNhbXBsZXI7CisKKyAgICByZXNhbXBsZXIgPSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKGZvcm1hdCwgY2hhbm5lbHMsIG91dHB1dEZyZXEsIHF1YWxpdHkpOworICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShpbnB1dEZyZXEpOworICAgIHJlc2FtcGxlci0+c2V0Vm9sdW1lKGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpVTklUWV9HQUlOX0ZMT0FULAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlVOSVRZX0dBSU5fRkxPQVQpOworCisgICAgLy8gc2V0IHVwIHRoZSByZWZlcmVuY2UgcnVuCisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiByZWZJbmNyOworICAgIHJlZkluY3IucHVzaF9iYWNrKG91dHB1dEZyYW1lcyk7CisgICAgdm9pZCogcmVmZXJlbmNlID0gbWFsbG9jKG91dHB1dFNpemUpOworICAgIHJlc2FtcGxlKGNoYW5uZWxzLCByZWZlcmVuY2UsIG91dHB1dEZyYW1lcywgcmVmSW5jciwgJnByb3ZpZGVyLCByZXNhbXBsZXIpOworCisgICAgcHJvdmlkZXIucmVzZXQoKTsKKworI2lmIDAKKyAgICAvKiB0aGlzIHRlc3Qgd2lsbCBmYWlsIC0gQVBJIGludGVyZmFjZSBpc3N1ZTogcmVzZXQoKSBkb2VzIG5vdCBjbGVhciBpbnRlcm5hbCBidWZmZXJzICovCisgICAgcmVzYW1wbGVyLT5yZXNldCgpOworI2Vsc2UKKyAgICBkZWxldGUgcmVzYW1wbGVyOworICAgIHJlc2FtcGxlciA9IGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoZm9ybWF0LCBjaGFubmVscywgb3V0cHV0RnJlcSwgcXVhbGl0eSk7CisgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKGlucHV0RnJlcSk7CisgICAgcmVzYW1wbGVyLT5zZXRWb2x1bWUoYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlVOSVRZX0dBSU5fRkxPQVQsCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VU5JVFlfR0FJTl9GTE9BVCk7CisjZW5kaWYKKworICAgIC8vIHNldCB1cCB0aGUgdGVzdCBydW4KKyAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IG91dEluY3I7CisgICAgb3V0SW5jci5wdXNoX2JhY2soMSk7CisgICAgb3V0SW5jci5wdXNoX2JhY2soMik7CisgICAgb3V0SW5jci5wdXNoX2JhY2soMyk7CisgICAgdm9pZCogdGVzdCA9IG1hbGxvYyhvdXRwdXRTaXplKTsKKyAgICBpbnB1dEluY3IucHVzaF9iYWNrKDEpOworICAgIGlucHV0SW5jci5wdXNoX2JhY2soMyk7CisgICAgcHJvdmlkZXIuc2V0SW5jcihpbnB1dEluY3IpOworICAgIHJlc2FtcGxlKGNoYW5uZWxzLCB0ZXN0LCBvdXRwdXRGcmFtZXMsIG91dEluY3IsICZwcm92aWRlciwgcmVzYW1wbGVyKTsKKworICAgIC8vIGNoZWNrCisgICAgYnVmZmVyY21wKHJlZmVyZW5jZSwgdGVzdCwgb3V0cHV0RnJhbWVTaXplLCBvdXRwdXRGcmFtZXMpOworCisgICAgZnJlZShyZWZlcmVuY2UpOworICAgIGZyZWUodGVzdCk7CisgICAgZGVsZXRlIHJlc2FtcGxlcjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgZG91YmxlIHNxcihUIHYpCit7CisgICAgZG91YmxlIGR2ID0gc3RhdGljX2Nhc3Q8ZG91YmxlPih2KTsKKyAgICByZXR1cm4gZHYgKiBkdjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citkb3VibGUgc2lnbmFsRW5lcmd5KFQgKnN0YXJ0LCBUICplbmQsIHVuc2lnbmVkIHN0cmlkZSkKK3sKKyAgICBkb3VibGUgYWNjdW0gPSAwOworCisgICAgZm9yIChUICpwID0gc3RhcnQ7IHAgPCBlbmQ7IHAgKz0gc3RyaWRlKSB7CisgICAgICAgIGFjY3VtICs9IHNxcigqcCk7CisgICAgfQorICAgIHVuc2lnbmVkIGNvdW50ID0gKGVuZCAtIHN0YXJ0ICsgc3RyaWRlIC0gMSkgLyBzdHJpZGU7CisgICAgcmV0dXJuIGFjY3VtIC8gY291bnQ7Cit9CisKKy8vIFRJID0gcmVzYW1wbGVyIGlucHV0IHR5cGUsIGludDE2X3Qgb3IgZmxvYXQKKy8vIFRPID0gcmVzYW1wbGVyIG91dHB1dCB0eXBlLCBpbnQzMl90IG9yIGZsb2F0Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCB0ZXN0U3RvcGJhbmREb3duY29udmVyc2lvbihzaXplX3QgY2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGlucHV0RnJlcSwgdW5zaWduZWQgb3V0cHV0RnJlcSwKKyAgICAgICAgdW5zaWduZWQgcGFzc2JhbmQsIHVuc2lnbmVkIHN0b3BiYW5kLAorICAgICAgICBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBxdWFsaXR5KQoreworICAgIC8vIGNyZWF0ZSB0aGUgcHJvdmlkZXIKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGlucHV0SW5jcjsKKyAgICBTaWduYWxQcm92aWRlciBwcm92aWRlcjsKKyAgICBwcm92aWRlci5zZXRDaGlycDxUST4oY2hhbm5lbHMsCisgICAgICAgICAgICAwLiwgaW5wdXRGcmVxLzIuLCBpbnB1dEZyZXEsIGlucHV0RnJlcS8yMDAwLik7CisgICAgcHJvdmlkZXIuc2V0SW5jcihpbnB1dEluY3IpOworCisgICAgLy8gY2FsY3VsYXRlIHRoZSBvdXRwdXQgc2l6ZQorICAgIHNpemVfdCBvdXRwdXRGcmFtZXMgPSAoKGludDY0X3QpIHByb3ZpZGVyLmdldE51bUZyYW1lcygpICogb3V0cHV0RnJlcSkgLyBpbnB1dEZyZXE7CisgICAgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSA9IGNoYW5uZWxzICogc2l6ZW9mKFRPKTsKKyAgICBzaXplX3Qgb3V0cHV0U2l6ZSA9IG91dHB1dEZyYW1lU2l6ZSAqIG91dHB1dEZyYW1lczsKKyAgICBvdXRwdXRTaXplICY9IH43OworCisgICAgLy8gY3JlYXRlIHRoZSByZXNhbXBsZXIKKyAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlciogcmVzYW1wbGVyOworCisgICAgcmVzYW1wbGVyID0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgKKyAgICAgICAgICAgIGlzX3NhbWU8VEksIGludDE2X3Q+Ojp2YWx1ZSA/IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIDogQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKKyAgICAgICAgICAgIGNoYW5uZWxzLCBvdXRwdXRGcmVxLCBxdWFsaXR5KTsKKyAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoaW5wdXRGcmVxKTsKKyAgICByZXNhbXBsZXItPnNldFZvbHVtZShhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VU5JVFlfR0FJTl9GTE9BVCwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpVTklUWV9HQUlOX0ZMT0FUKTsKKworICAgIC8vIHNldCB1cCB0aGUgcmVmZXJlbmNlIHJ1bgorICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gcmVmSW5jcjsKKyAgICByZWZJbmNyLnB1c2hfYmFjayhvdXRwdXRGcmFtZXMpOworICAgIHZvaWQqIHJlZmVyZW5jZSA9IG1hbGxvYyhvdXRwdXRTaXplKTsKKyAgICByZXNhbXBsZShjaGFubmVscywgcmVmZXJlbmNlLCBvdXRwdXRGcmFtZXMsIHJlZkluY3IsICZwcm92aWRlciwgcmVzYW1wbGVyKTsKKworICAgIFRPICpvdXQgPSByZWludGVycHJldF9jYXN0PFRPICo+KHJlZmVyZW5jZSk7CisKKyAgICAvLyBjaGVjayBzaWduYWwgZW5lcmd5IGluIHBhc3NiYW5kCisgICAgY29uc3QgdW5zaWduZWQgcGFzc2JhbmRGcmFtZSA9IHBhc3NiYW5kICogb3V0cHV0RnJlcSAvIDEwMDAuOworICAgIGNvbnN0IHVuc2lnbmVkIHN0b3BiYW5kRnJhbWUgPSBzdG9wYmFuZCAqIG91dHB1dEZyZXEgLyAxMDAwLjsKKworICAgIC8vIGNoZWNrIGVhY2ggY2hhbm5lbCBzZXBhcmF0ZWx5CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGFubmVsczsgKytpKSB7CisgICAgICAgIGRvdWJsZSBwYXNzYmFuZEVuZXJneSA9IHNpZ25hbEVuZXJneShvdXQsIG91dCArIHBhc3NiYW5kRnJhbWUgKiBjaGFubmVscywgY2hhbm5lbHMpOworICAgICAgICBkb3VibGUgc3RvcGJhbmRFbmVyZ3kgPSBzaWduYWxFbmVyZ3kob3V0ICsgc3RvcGJhbmRGcmFtZSAqIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgIG91dCArIG91dHB1dEZyYW1lcyAqIGNoYW5uZWxzLCBjaGFubmVscyk7CisgICAgICAgIGRvdWJsZSBkYkF0dGVuID0gLTEwLiAqIGxvZzEwKHN0b3BiYW5kRW5lcmd5IC8gcGFzc2JhbmRFbmVyZ3kpOworICAgICAgICBBU1NFUlRfR1QoZGJBdHRlbiwgNjAuKTsKKworI2lmIDAKKyAgICAgICAgLy8gaW50ZXJuYWwgdmVyaWZpY2F0aW9uCisgICAgICAgIHByaW50ZigiaWY6JWQgIG9mOiVkICBwYmY6JWQgIHNiZjolZCAgc2JlOiAlZiAgcGJlOiAlZiAgZGI6ICUuMmZcbiIsCisgICAgICAgICAgICAgICAgcHJvdmlkZXIuZ2V0TnVtRnJhbWVzKCksIG91dHB1dEZyYW1lcywKKyAgICAgICAgICAgICAgICBwYXNzYmFuZEZyYW1lLCBzdG9wYmFuZEZyYW1lLCBzdG9wYmFuZEVuZXJneSwgcGFzc2JhbmRFbmVyZ3ksIGRiQXR0ZW4pOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBvdXRbaStwYXNzYmFuZEZyYW1lKmNoYW5uZWxzXSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgb3V0W2krc3RvcGJhbmRGcmFtZSpjaGFubmVsc10gPDwgc3RkOjplbmRsOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBmcmVlKHJlZmVyZW5jZSk7CisgICAgZGVsZXRlIHJlc2FtcGxlcjsKK30KKworLyogQnVmZmVyIGluY3JlbWVudCB0ZXN0CisgKgorICogV2UgY29tcGFyZSBhIHJlZmVyZW5jZSBvdXRwdXQsIHdoZXJlIHdlIGNvbnN1bWUgYW5kIHByb2Nlc3MgdGhlIGVudGlyZQorICogYnVmZmVyIGF0IGEgdGltZSwgYW5kIGEgdGVzdCBvdXRwdXQsIHdoZXJlIHdlIHByb3ZpZGUgc21hbGwgY2h1bmtzIG9mIGlucHV0CisgKiBkYXRhIGFuZCBwcm9jZXNzIHNtYWxsIGNodW5rcyBvZiBvdXRwdXQgKHdoaWNoIG1heSBub3QgYmUgZXF1aXZhbGVudCBpbiBzaXplKS4KKyAqCisgKiBUd28gc3VidGVzdHMgLSBmaXhlZCBwaGFzZSAoMzoyIGRvd24pIGFuZCBpbnRlcnBvbGF0ZWQgcGhhc2UgKDE0NzozMjAgdXApCisgKi8KK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgYnVmZmVyaW5jcmVtZW50X2ZpeGVkcGhhc2UpIHsKKyAgICAvLyBhbGwgb2YgdGhlc2Ugd29yaworICAgIHN0YXRpYyBjb25zdCBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBrUXVhbGl0eUFycmF5W10gPSB7CisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TE9XX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6SElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdEJ1ZmZlckluY3JlbWVudCgyLCBmYWxzZSwgNDgwMDAsIDMyMDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9Cit9CisKK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgYnVmZmVyaW5jcmVtZW50X2ludGVycG9sYXRlZHBoYXNlKSB7CisgICAgLy8gYWxsIG9mIHRoZXNlIHdvcmsgZXhjZXB0IGxvdyBxdWFsaXR5CisgICAgc3RhdGljIGNvbnN0IGVudW0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IGtRdWFsaXR5QXJyYXlbXSA9IHsKKy8vICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TE9XX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6SElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdEJ1ZmZlckluY3JlbWVudCgyLCBmYWxzZSwgMjIwNTAsIDQ4MDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9Cit9CisKK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgYnVmZmVyaW5jcmVtZW50X2ZpeGVkcGhhc2VfbXVsdGkpIHsKKyAgICAvLyBvbmx5IGR5bmFtaWMgcXVhbGl0eQorICAgIHN0YXRpYyBjb25zdCBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBrUXVhbGl0eUFycmF5W10gPSB7CisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZLAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0QnVmZmVySW5jcmVtZW50KDQsIGZhbHNlLCA0ODAwMCwgMzIwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KK30KKworVEVTVChhdWRpb2ZsaW5nZXJfcmVzYW1wbGVyLCBidWZmZXJpbmNyZW1lbnRfaW50ZXJwb2xhdGVkcGhhc2VfbXVsdGlfZmxvYXQpIHsKKyAgICAvLyBvbmx5IGR5bmFtaWMgcXVhbGl0eQorICAgIHN0YXRpYyBjb25zdCBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBrUXVhbGl0eUFycmF5W10gPSB7CisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZLAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0QnVmZmVySW5jcmVtZW50KDgsIHRydWUsIDIyMDUwLCA0ODAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorfQorCisvKiBTaW1wbGUgYWxpYXNpbmcgdGVzdAorICoKKyAqIFRoaXMgY2hlY2tzIHN0b3BiYW5kIHJlc3BvbnNlIG9mIHRoZSBjaGlycCBzaWduYWwgdG8gbWFrZSBzdXJlIGZyZXF1ZW5jaWVzCisgKiBhcmUgcHJvcGVybHkgc3VwcHJlc3NlZC4gIEl0IHVzZXMgZG93bnNhbXBsaW5nIGJlY2F1c2UgdGhlIHN0b3BiYW5kIGNhbiBiZQorICogY2xlYXJseSBpc29sYXRlZCBieSBpbnB1dCBmcmVxdWVuY2llcyBleGNlZWRpbmcgdGhlIG91dHB1dCBzYW1wbGUgcmF0ZSAobnlxdWlzdCkuCisgKi8KK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgc3RvcGJhbmRyZXNwb25zZV9pbnRlZ2VyKSB7CisgICAgLy8gbm90IGFsbCBvZiB0aGVzZSBtYXkgd29yayAob2xkIHJlc2FtcGxlcnMgZmFpbCBvbiBkb3duc2FtcGxpbmcpCisgICAgc3RhdGljIGNvbnN0IGVudW0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IGtRdWFsaXR5QXJyYXlbXSA9IHsKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkxPV19RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TUVEX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpISUdIX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpWRVJZX0hJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX01FRF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFksCisgICAgfTsKKworICAgIC8vIGluIHRoaXMgdGVzdCB3ZSBhc3N1bWUgYSBtYXhpbXVtIHRyYW5zaXRpb24gYmFuZCBiZXR3ZWVuIDEya0h6IGFuZCAyMGtIei4KKyAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDYwZEIgcmVsYXRpdmUgYXR0ZW51YXRpb24gYmV0d2VlbiBzdG9wYmFuZCBhbmQgcGFzc2JhbmQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdFN0b3BiYW5kRG93bmNvbnZlcnNpb248aW50MTZfdCwgaW50MzJfdD4oCisgICAgICAgICAgICAgICAgMiwgNDgwMDAsIDMyMDAwLCAxMjAwMCwgMjAwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KKworICAgIC8vIGluIHRoaXMgdGVzdCB3ZSBhc3N1bWUgYSBtYXhpbXVtIHRyYW5zaXRpb24gYmFuZCBiZXR3ZWVuIDdrSHogYW5kIDE1a0h6LgorICAgIC8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgNjBkQiByZWxhdGl2ZSBhdHRlbnVhdGlvbiBiZXR3ZWVuIHN0b3BiYW5kIGFuZCBwYXNzYmFuZC4KKyAgICAvLyAodGhlIHdlaXJkIHJhdGlvIHRyaWdnZXJzIGludGVycG9sYXRpdmUgcmVzYW1wbGluZykKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0U3RvcGJhbmREb3duY29udmVyc2lvbjxpbnQxNl90LCBpbnQzMl90PigKKyAgICAgICAgICAgICAgICAyLCA0ODAwMCwgMjIxMDEsIDcwMDAsIDE1MDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9Cit9CisKK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgc3RvcGJhbmRyZXNwb25zZV9pbnRlZ2VyX211bHRpY2hhbm5lbCkgeworICAgIC8vIG5vdCBhbGwgb2YgdGhlc2UgbWF5IHdvcmsgKG9sZCByZXNhbXBsZXJzIGZhaWwgb24gZG93bnNhbXBsaW5nKQorICAgIHN0YXRpYyBjb25zdCBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBrUXVhbGl0eUFycmF5W10gPSB7CisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpMT1dfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6Ok1FRF9RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6SElHSF9RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VkVSWV9ISUdIX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZLAorICAgIH07CisKKyAgICAvLyBpbiB0aGlzIHRlc3Qgd2UgYXNzdW1lIGEgbWF4aW11bSB0cmFuc2l0aW9uIGJhbmQgYmV0d2VlbiAxMmtIeiBhbmQgMjBrSHouCisgICAgLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCA2MGRCIHJlbGF0aXZlIGF0dGVudWF0aW9uIGJldHdlZW4gc3RvcGJhbmQgYW5kIHBhc3NiYW5kLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUXVhbGl0eUFycmF5KTsgKytpKSB7CisgICAgICAgIHRlc3RTdG9wYmFuZERvd25jb252ZXJzaW9uPGludDE2X3QsIGludDMyX3Q+KAorICAgICAgICAgICAgICAgIDgsIDQ4MDAwLCAzMjAwMCwgMTIwMDAsIDIwMDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9CisKKyAgICAvLyBpbiB0aGlzIHRlc3Qgd2UgYXNzdW1lIGEgbWF4aW11bSB0cmFuc2l0aW9uIGJhbmQgYmV0d2VlbiA3a0h6IGFuZCAxNWtIei4KKyAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDYwZEIgcmVsYXRpdmUgYXR0ZW51YXRpb24gYmV0d2VlbiBzdG9wYmFuZCBhbmQgcGFzc2JhbmQuCisgICAgLy8gKHRoZSB3ZWlyZCByYXRpbyB0cmlnZ2VycyBpbnRlcnBvbGF0aXZlIHJlc2FtcGxpbmcpCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdFN0b3BiYW5kRG93bmNvbnZlcnNpb248aW50MTZfdCwgaW50MzJfdD4oCisgICAgICAgICAgICAgICAgOCwgNDgwMDAsIDIyMTAxLCA3MDAwLCAxNTAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorfQorCitURVNUKGF1ZGlvZmxpbmdlcl9yZXNhbXBsZXIsIHN0b3BiYW5kcmVzcG9uc2VfZmxvYXQpIHsKKyAgICAvLyBub3QgYWxsIG9mIHRoZXNlIG1heSB3b3JrIChvbGQgcmVzYW1wbGVycyBmYWlsIG9uIGRvd25zYW1wbGluZykKKyAgICBzdGF0aWMgY29uc3QgZW51bSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkga1F1YWxpdHlBcnJheVtdID0geworICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TE9XX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpNRURfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkhJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKKyAgICB9OworCisgICAgLy8gaW4gdGhpcyB0ZXN0IHdlIGFzc3VtZSBhIG1heGltdW0gdHJhbnNpdGlvbiBiYW5kIGJldHdlZW4gMTJrSHogYW5kIDIwa0h6LgorICAgIC8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgNjBkQiByZWxhdGl2ZSBhdHRlbnVhdGlvbiBiZXR3ZWVuIHN0b3BiYW5kIGFuZCBwYXNzYmFuZC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0U3RvcGJhbmREb3duY29udmVyc2lvbjxmbG9hdCwgZmxvYXQ+KAorICAgICAgICAgICAgICAgIDIsIDQ4MDAwLCAzMjAwMCwgMTIwMDAsIDIwMDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9CisKKyAgICAvLyBpbiB0aGlzIHRlc3Qgd2UgYXNzdW1lIGEgbWF4aW11bSB0cmFuc2l0aW9uIGJhbmQgYmV0d2VlbiA3a0h6IGFuZCAxNWtIei4KKyAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDYwZEIgcmVsYXRpdmUgYXR0ZW51YXRpb24gYmV0d2VlbiBzdG9wYmFuZCBhbmQgcGFzc2JhbmQuCisgICAgLy8gKHRoZSB3ZWlyZCByYXRpbyB0cmlnZ2VycyBpbnRlcnBvbGF0aXZlIHJlc2FtcGxpbmcpCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdFN0b3BiYW5kRG93bmNvbnZlcnNpb248ZmxvYXQsIGZsb2F0PigKKyAgICAgICAgICAgICAgICAyLCA0ODAwMCwgMjIxMDEsIDcwMDAsIDE1MDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9Cit9CisKK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgc3RvcGJhbmRyZXNwb25zZV9mbG9hdF9tdWx0aWNoYW5uZWwpIHsKKyAgICAvLyBub3QgYWxsIG9mIHRoZXNlIG1heSB3b3JrIChvbGQgcmVzYW1wbGVycyBmYWlsIG9uIGRvd25zYW1wbGluZykKKyAgICBzdGF0aWMgY29uc3QgZW51bSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkga1F1YWxpdHlBcnJheVtdID0geworICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TE9XX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpNRURfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkhJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKKyAgICB9OworCisgICAgLy8gaW4gdGhpcyB0ZXN0IHdlIGFzc3VtZSBhIG1heGltdW0gdHJhbnNpdGlvbiBiYW5kIGJldHdlZW4gMTJrSHogYW5kIDIwa0h6LgorICAgIC8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgNjBkQiByZWxhdGl2ZSBhdHRlbnVhdGlvbiBiZXR3ZWVuIHN0b3BiYW5kIGFuZCBwYXNzYmFuZC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0U3RvcGJhbmREb3duY29udmVyc2lvbjxmbG9hdCwgZmxvYXQ+KAorICAgICAgICAgICAgICAgIDgsIDQ4MDAwLCAzMjAwMCwgMTIwMDAsIDIwMDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9CisKKyAgICAvLyBpbiB0aGlzIHRlc3Qgd2UgYXNzdW1lIGEgbWF4aW11bSB0cmFuc2l0aW9uIGJhbmQgYmV0d2VlbiA3a0h6IGFuZCAxNWtIei4KKyAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDYwZEIgcmVsYXRpdmUgYXR0ZW51YXRpb24gYmV0d2VlbiBzdG9wYmFuZCBhbmQgcGFzc2JhbmQuCisgICAgLy8gKHRoZSB3ZWlyZCByYXRpbyB0cmlnZ2VycyBpbnRlcnBvbGF0aXZlIHJlc2FtcGxpbmcpCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdFN0b3BiYW5kRG93bmNvbnZlcnNpb248ZmxvYXQsIGZsb2F0PigKKyAgICAgICAgICAgICAgICA4LCA0ODAwMCwgMjIxMDEsIDcwMDAsIDE1MDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcnVuX2FsbF91bml0X3Rlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZmYWU2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcnVuX2FsbF91bml0X3Rlc3RzLnNoCkBAIC0wLDAgKzEsMTEgQEAKKyMhL2Jpbi9iYXNoCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCithZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQKKworYWRiIHNoZWxsIC9zeXN0ZW0vYmluL3Jlc2FtcGxlcl90ZXN0cwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNGZhZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvdGVzdC1taXhlci5jcHAKQEAgLTAsMCArMSwzMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NuZGZpbGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgorI2luY2x1ZGUgInRlc3RfdXRpbHMuaCIKKworLyogVGVzdGluZyBpcyB0eXBpY2FsbHkgdGhyb3VnaCBjcmVhdGlvbiBvZiBhbiBvdXRwdXQgV0FWIGZpbGUgZnJvbSBzZXZlcmFsCisgKiBzb3VyY2UgaW5wdXRzLCB0byBiZSBsYXRlciBhbmFseXplZCBieSBhbiBhdWRpbyBwcm9ncmFtIHN1Y2ggYXMgQXVkYWNpdHkuCisgKgorICogU2luZSBvciBjaGlycCBmdW5jdGlvbnMgYXJlIHR5cGljYWxseSBtb3JlIHVzZWZ1bCBhcyBpbnB1dCB0byB0aGUgbWl4ZXIKKyAqIGFzIHRoZXkgc2hvdyB1cCBhcyBzdHJhaWdodCBsaW5lcyBvbiBhIHNwZWN0cm9ncmFtIGlmIHN1Y2Nlc3NmdWxseSBtaXhlZC4KKyAqCisgKiBBIHNhbXBsZSBzaGVsbCBzY3JpcHQgaXMgcHJvdmlkZWQ6IG1peGVyX3RvX3dhdmVfdGVzdHMuc2gKKyAqLworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciogbmFtZSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZl0gWy1tXSBbLWMgY2hhbm5lbHNdIgorICAgICAgICAgICAgICAgICAgICAiIFstcyBzYW1wbGUtcmF0ZV0gWy1vIDxvdXRwdXQtZmlsZT5dIFstYSA8YXV4LWJ1ZmZlci1maWxlPl0gWy1QIGNzdl0iCisgICAgICAgICAgICAgICAgICAgICIgKDxpbnB1dC1maWxlPiB8IDxjb21tYW5kPikrXG4iLCBuYW1lKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtZiAgICBlbmFibGUgZmxvYXRpbmcgcG9pbnQgaW5wdXQgdHJhY2tcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1tICAgIGVuYWJsZSBmbG9hdGluZyBwb2ludCBtaXhlciBvdXRwdXRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1jICAgIG51bWJlciBvZiBtaXhlciBvdXRwdXQgY2hhbm5lbHNcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1zICAgIG1peGVyIHNhbXBsZS1yYXRlXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtbyAgICA8b3V0cHV0LWZpbGU+IFdBViBmaWxlLCBwY20xNiAob3IgZmxvYXQgaWYgLW0gc3BlY2lmaWVkKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgLWEgICAgPGF1eC1idWZmZXItZmlsZT5cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1QICAgICMgZnJhbWVzIHByb3ZpZGVkIHBlciBjYWxsIHRvIHJlc2FtcGxlKCkgaW4gQ1NWIGZvcm1hdFxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgPGlucHV0LWZpbGU+IGlzIGEgV0FWIGZpbGVcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIDxjb21tYW5kPiBjYW4gYmUgJ3NpbmU6PGNoYW5uZWxzPiw8ZnJlcXVlbmN5Piw8c2FtcGxlcmF0ZT4nXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICAgICAgICdjaGlycDo8Y2hhbm5lbHM+LDxzYW1wbGVyYXRlPidcbiIpOworfQorCitzdGF0aWMgaW50IHdyaXRlRmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCB1aW50MzJfdCBjaGFubmVscywgc2l6ZV90IGZyYW1lcywgYm9vbCBpc0J1ZmZlckZsb2F0KSB7CisgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7IC8vIG9rIHRvIHBhc3MgaW4gTlVMTCBmaWxlbmFtZQorICAgIH0KKyAgICAvLyB3cml0ZSBvdXRwdXQgdG8gZmlsZS4KKyAgICBTRl9JTkZPIGluZm87CisgICAgaW5mby5mcmFtZXMgPSAwOworICAgIGluZm8uc2FtcGxlcmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgaW5mby5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIGluZm8uZm9ybWF0ID0gU0ZfRk9STUFUX1dBViB8IChpc0J1ZmZlckZsb2F0ID8gU0ZfRk9STUFUX0ZMT0FUIDogU0ZfRk9STUFUX1BDTV8xNik7CisgICAgcHJpbnRmKCJzYXZpbmcgZmlsZTolcyAgY2hhbm5lbHM6JXUgIHNhbXBsZXJhdGU6JXUgIGZyYW1lczolenVcbiIsCisgICAgICAgICAgICBmaWxlbmFtZSwgaW5mby5jaGFubmVscywgaW5mby5zYW1wbGVyYXRlLCBmcmFtZXMpOworICAgIFNOREZJTEUgKnNmID0gc2Zfb3BlbihmaWxlbmFtZSwgU0ZNX1dSSVRFLCAmaW5mbyk7CisgICAgaWYgKHNmID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgaWYgKGlzQnVmZmVyRmxvYXQpIHsKKyAgICAgICAgKHZvaWQpIHNmX3dyaXRlZl9mbG9hdChzZiwgKGZsb2F0KilidWZmZXIsIGZyYW1lcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKHZvaWQpIHNmX3dyaXRlZl9zaG9ydChzZiwgKHNob3J0KilidWZmZXIsIGZyYW1lcyk7CisgICAgfQorICAgIHNmX2Nsb3NlKHNmKTsKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgY29uc3QgY2hhciogY29uc3QgcHJvZ25hbWUgPSBhcmd2WzBdOworICAgIGJvb2wgdXNlSW5wdXRGbG9hdCA9IGZhbHNlOworICAgIGJvb2wgdXNlTWl4ZXJGbG9hdCA9IGZhbHNlOworICAgIGJvb2wgdXNlUmFtcCA9IHRydWU7CisgICAgdWludDMyX3Qgb3V0cHV0U2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgIHVpbnQzMl90IG91dHB1dENoYW5uZWxzID0gMjsgLy8gc3RlcmVvIGZvciBub3cKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IFB2YWx1ZXM7CisgICAgY29uc3QgY2hhciogb3V0cHV0RmlsZW5hbWUgPSBOVUxMOworICAgIGNvbnN0IGNoYXIqIGF1eEZpbGVuYW1lID0gTlVMTDsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBOYW1lczsKKyAgICBzdGQ6OnZlY3RvcjxTaWduYWxQcm92aWRlcj4gUHJvdmlkZXJzOworCisgICAgZm9yIChpbnQgY2g7IChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZm1jOnM6bzphOlA6IikpICE9IC0xOykgeworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgdXNlSW5wdXRGbG9hdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICB1c2VNaXhlckZsb2F0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgIG91dHB1dENoYW5uZWxzID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgb3V0cHV0U2FtcGxlUmF0ZSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgIG91dHB1dEZpbGVuYW1lID0gb3B0YXJnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2EnOgorICAgICAgICAgICAgYXV4RmlsZW5hbWUgPSBvcHRhcmc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICBpZiAocGFyc2VDU1Yob3B0YXJnLCBQdmFsdWVzKSA8IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImluY29ycmVjdCBzeW50YXggZm9yIC1QIG9wdGlvblxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHVzYWdlKHByb2duYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisgICAgYXJnYyAtPSBvcHRpbmQ7CisgICAgYXJndiArPSBvcHRpbmQ7CisKKyAgICBpZiAoYXJnYyA9PSAwKSB7CisgICAgICAgIHVzYWdlKHByb2duYW1lKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgaWYgKCh1bnNpZ25lZClhcmdjID4gQXVkaW9NaXhlcjo6TUFYX05VTV9UUkFDS1MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSB0cmFja3M6ICVkID4gJXUiLCBhcmdjLCBBdWRpb01peGVyOjpNQVhfTlVNX1RSQUNLUyk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgc2l6ZV90IG91dHB1dEZyYW1lcyA9IDA7CisKKyAgICAvLyBjcmVhdGUgcHJvdmlkZXJzIGZvciBlYWNoIHRyYWNrCisgICAgUHJvdmlkZXJzLnJlc2l6ZShhcmdjKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBjaGlycFtdID0gImNoaXJwOiI7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNpbmVbXSA9ICJzaW5lOiI7CisgICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUga1NlY29uZHMgPSAxOworCisgICAgICAgIGlmICghc3RybmNtcChhcmd2W2ldLCBjaGlycCwgc3RybGVuKGNoaXJwKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gdjsKKworICAgICAgICAgICAgcGFyc2VDU1YoYXJndltpXSArIHN0cmxlbihjaGlycCksIHYpOworICAgICAgICAgICAgaWYgKHYuc2l6ZSgpID09IDIpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImNyZWF0aW5nIGNoaXJwKCVkICVkKVxuIiwgdlswXSwgdlsxXSk7CisgICAgICAgICAgICAgICAgaWYgKHVzZUlucHV0RmxvYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldENoaXJwPGZsb2F0Pih2WzBdLCAwLCB2WzFdLzIsIHZbMV0sIGtTZWNvbmRzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0Q2hpcnA8aW50MTZfdD4odlswXSwgMCwgdlsxXS8yLCB2WzFdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGZvcm1lZCBpbnB1dCAnJXMnXG4iLCBhcmd2W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCBzaW5lLCBzdHJsZW4oc2luZSkpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisKKyAgICAgICAgICAgIHBhcnNlQ1NWKGFyZ3ZbaV0gKyBzdHJsZW4oc2luZSksIHYpOworICAgICAgICAgICAgaWYgKHYuc2l6ZSgpID09IDMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImNyZWF0aW5nIHNpbmUoJWQgJWQgJWQpXG4iLCB2WzBdLCB2WzFdLCB2WzJdKTsKKyAgICAgICAgICAgICAgICBpZiAodXNlSW5wdXRGbG9hdCkgeworICAgICAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0U2luZTxmbG9hdD4odlswXSwgdlsxXSwgdlsyXSwga1NlY29uZHMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRTaW5lPGludDE2X3Q+KHZbMF0sIHZbMV0sIHZbMl0sIGtTZWNvbmRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldEluY3IoUHZhbHVlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFsZm9ybWVkIGlucHV0ICclcydcbiIsIGFyZ3ZbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJjcmVhdGluZyBmaWxlbmFtZSglcylcbiIsIGFyZ3ZbaV0pOworICAgICAgICAgICAgaWYgKHVzZUlucHV0RmxvYXQpIHsKKyAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0RmlsZTxmbG9hdD4oYXJndltpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRGaWxlPHNob3J0Pihhcmd2W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOworICAgICAgICB9CisgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBmcmFtZXMKKyAgICAgICAgc2l6ZV90IG5mcmFtZXMgPSAoaW50NjRfdCkgUHJvdmlkZXJzW2ldLmdldE51bUZyYW1lcygpICogb3V0cHV0U2FtcGxlUmF0ZQorICAgICAgICAgICAgICAgIC8gUHJvdmlkZXJzW2ldLmdldFNhbXBsZVJhdGUoKTsKKyAgICAgICAgaWYgKGkgPT0gMCB8fCBvdXRwdXRGcmFtZXMgPiBuZnJhbWVzKSB7IC8vIGNob29zZSBtaW5pbXVtIGZvciBvdXRwdXRGcmFtZXMKKyAgICAgICAgICAgIG91dHB1dEZyYW1lcyA9IG5mcmFtZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjcmVhdGUgdGhlIG91dHB1dCBidWZmZXIuCisgICAgY29uc3Qgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSA9IG91dHB1dENoYW5uZWxzCisgICAgICAgICAgICAqICh1c2VNaXhlckZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KSk7CisgICAgY29uc3Qgc2l6ZV90IG91dHB1dFNpemUgPSBvdXRwdXRGcmFtZXMgKiBvdXRwdXRGcmFtZVNpemU7CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG91dHB1dENoYW5uZWxzKTsKKyAgICB2b2lkICpvdXRwdXRBZGRyID0gTlVMTDsKKyAgICAodm9pZCkgcG9zaXhfbWVtYWxpZ24oJm91dHB1dEFkZHIsIDMyLCBvdXRwdXRTaXplKTsKKyAgICBtZW1zZXQob3V0cHV0QWRkciwgMCwgb3V0cHV0U2l6ZSk7CisKKyAgICAvLyBjcmVhdGUgdGhlIGF1eCBidWZmZXIsIGlmIG5lZWRlZC4KKyAgICBjb25zdCBzaXplX3QgYXV4RnJhbWVTaXplID0gc2l6ZW9mKGludDMyX3QpOyAvLyBRNC4yNyBhbHdheXMKKyAgICBjb25zdCBzaXplX3QgYXV4U2l6ZSA9IG91dHB1dEZyYW1lcyAqIGF1eEZyYW1lU2l6ZTsKKyAgICB2b2lkICphdXhBZGRyID0gTlVMTDsKKyAgICBpZiAoYXV4RmlsZW5hbWUpIHsKKyAgICAgICAgKHZvaWQpIHBvc2l4X21lbWFsaWduKCZhdXhBZGRyLCAzMiwgYXV4U2l6ZSk7CisgICAgICAgIG1lbXNldChhdXhBZGRyLCAwLCBhdXhTaXplKTsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgdGhlIG1peGVyLgorICAgIGNvbnN0IHNpemVfdCBtaXhlckZyYW1lQ291bnQgPSAzMjA7IC8vIHR5cGljYWwgbnVtYmVycyBtYXkgcmFuZ2UgZnJvbSAyNDAgb3IgOTYwCisgICAgQXVkaW9NaXhlciAqbWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihtaXhlckZyYW1lQ291bnQsIG91dHB1dFNhbXBsZVJhdGUpOworICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0ID0gdXNlSW5wdXRGbG9hdAorICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJGb3JtYXQgPSB1c2VNaXhlckZsb2F0CisgICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBmbG9hdCBmID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCAvIFByb3ZpZGVycy5zaXplKCk7IC8vIG5vcm1hbGl6ZSB2b2x1bWUgYnkgIyB0cmFja3MKKyAgICBzdGF0aWMgZmxvYXQgZjA7IC8vIHplcm8KKworICAgIC8vIHNldCB1cCB0aGUgdHJhY2tzLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgUHJvdmlkZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIC8vcHJpbnRmKCJ0cmFjayAlZCBvdXQgb2YgJWRcbiIsIGksIFByb3ZpZGVycy5zaXplKCkpOworICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChQcm92aWRlcnNbaV0uZ2V0TnVtQ2hhbm5lbHMoKSk7CisgICAgICAgIGludDMyX3QgbmFtZSA9IG1peGVyLT5nZXRUcmFja05hbWUoY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQsIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CisgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7CisgICAgICAgIE5hbWVzLnB1c2hfYmFjayhuYW1lKTsKKyAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsICZQcm92aWRlcnNbaV0pOworICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAodm9pZCAqKW91dHB1dEFkZHIpOworICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltaXhlckZvcm1hdCk7CisgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpGT1JNQVQsCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWlucHV0Rm9ybWF0KTsKKyAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3Qpb3V0cHV0Q2hhbm5lbE1hc2spOworICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCljaGFubmVsTWFzayk7CisgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRVNBTVBMRSwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpTQU1QTEVfUkFURSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpUHJvdmlkZXJzW2ldLmdldFNhbXBsZVJhdGUoKSk7CisgICAgICAgIGlmICh1c2VSYW1wKSB7CisgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJmYwKTsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZjApOworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJmYpOworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJmYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZmKTsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF1eEZpbGVuYW1lKSB7CisgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpBVVhfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBhdXhBZGRyKTsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpBVVhMRVZFTCwgJmYwKTsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkFNUF9WT0xVTUUsIEF1ZGlvTWl4ZXI6OkFVWExFVkVMLCAmZik7CisgICAgICAgIH0KKyAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKKyAgICB9CisKKyAgICAvLyBwdW1wIHRoZSBtaXhlciB0byBwcm9jZXNzIGRhdGEuCisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG91dHB1dEZyYW1lcyAtIG1peGVyRnJhbWVDb3VudDsgaSArPSBtaXhlckZyYW1lQ291bnQpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBOYW1lcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihOYW1lc1tqXSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBvdXRwdXRBZGRyICsgaSAqIG91dHB1dEZyYW1lU2l6ZSk7CisgICAgICAgICAgICBpZiAoYXV4RmlsZW5hbWUpIHsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKE5hbWVzW2pdLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6QVVYX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIGF1eEFkZHIgKyBpICogYXV4RnJhbWVTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtaXhlci0+cHJvY2VzcyhBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyk7CisgICAgfQorICAgIG91dHB1dEZyYW1lcyA9IGk7IC8vIHJlc2V0IG91dHB1dCBmcmFtZXMgdG8gdGhlIGRhdGEgYWN0dWFsbHkgcHJvZHVjZWQuCisKKyAgICAvLyB3cml0ZSB0byBmaWxlcworICAgIHdyaXRlRmlsZShvdXRwdXRGaWxlbmFtZSwgb3V0cHV0QWRkciwKKyAgICAgICAgICAgIG91dHB1dFNhbXBsZVJhdGUsIG91dHB1dENoYW5uZWxzLCBvdXRwdXRGcmFtZXMsIHVzZU1peGVyRmxvYXQpOworICAgIGlmIChhdXhGaWxlbmFtZSkgeworICAgICAgICAvLyBBdXggYnVmZmVyIGlzIGFsd2F5cyBpbiBxNF8yNyBmb3JtYXQgZm9yIG5vdy4KKyAgICAgICAgLy8gbWVtY3B5X3RvX2kxNl9mcm9tX3E0XzI3KCksIGJ1dCB3aXRoIHN0ZXJlbyBmcmFtZSBjb3VudCAobm90IHNhbXBsZSBjb3VudCkKKyAgICAgICAgZGl0aGVyQW5kQ2xhbXAoKGludDMyX3QqKWF1eEFkZHIsIChpbnQzMl90KilhdXhBZGRyLCBvdXRwdXRGcmFtZXMgPj4gMSk7CisgICAgICAgIHdyaXRlRmlsZShhdXhGaWxlbmFtZSwgYXV4QWRkciwgb3V0cHV0U2FtcGxlUmF0ZSwgMSwgb3V0cHV0RnJhbWVzLCBmYWxzZSk7CisgICAgfQorCisgICAgZGVsZXRlIG1peGVyOworICAgIGZyZWUob3V0cHV0QWRkcik7CisgICAgZnJlZShhdXhBZGRyKTsKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Rlc3RfdXRpbHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy90ZXN0X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1MWNkYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy90ZXN0X3V0aWxzLmgKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fVEVTVF9VVElMU19ICisjZGVmaW5lIEFORFJPSURfQVVESU9fVEVTVF9VVElMU19ICisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9zbmRmaWxlLmg+CisKKyNpZm5kZWYgQVJSQVlfU0laRQorI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKyNlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IGlzX3NhbWUKK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBpc19zYW1lPFQsIFQ+ICAvLyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uCit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgVCBjb252ZXJ0VmFsdWUoZG91YmxlIHZhbCkKK3sKKyAgICBpZiAoaXNfc2FtZTxULCBpbnQxNl90Pjo6dmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGZsb29yKHZhbCAqIDMyNzY3LjAgKyAwLjUpOworICAgIH0gZWxzZSBpZiAoaXNfc2FtZTxULCBpbnQzMl90Pjo6dmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGZsb29yKHZhbCAqICgxVUw8PDMxKSArIDAuNSk7CisgICAgfQorICAgIHJldHVybiB2YWw7IC8vIGFzc3VtZSBmbG9hdCBvciBkb3VibGUKK30KKworLy8gQ29udmVydCBhIGxpc3Qgb2YgaW50ZWdlcnMgaW4gQ1NWIGZvcm1hdCB0byBhIFZlY3RvciBvZiB0aG9zZSB2YWx1ZXMuCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QsIG9yIC0xIG9uIGVycm9yLgorc3RhdGljIGlubGluZSBpbnQgcGFyc2VDU1YoY29uc3QgY2hhciAqc3RyaW5nLCBzdGQ6OnZlY3RvcjxpbnQ+JiB2YWx1ZXMpCit7CisgICAgLy8gcGFzcyAxOiBjb3VudCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBhbmQgZG8gc3ludGF4IGNoZWNrCisgICAgc2l6ZV90IG51bVZhbHVlcyA9IDA7CisgICAgYm9vbCBoYWREaWdpdCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgY2hhciAqcCA9IHN0cmluZzsgOyApIHsKKyAgICAgICAgc3dpdGNoICgqcCsrKSB7CisgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKyAgICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorICAgICAgICAgICAgaGFkRGlnaXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIGlmIChoYWREaWdpdCkgeworICAgICAgICAgICAgICAgIC8vIHBhc3MgMjogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdmVjdG9yIG9mIHZhbHVlcworICAgICAgICAgICAgICAgIHZhbHVlcy5yZXNpemUoKytudW1WYWx1ZXMpOworICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IGF0b2kocCA9IHN0cmluZyk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1WYWx1ZXM7ICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKnArKyA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpKytdID0gYXRvaShwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtVmFsdWVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgaWYgKGhhZERpZ2l0KSB7CisgICAgICAgICAgICAgICAgaGFkRGlnaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBudW1WYWx1ZXMrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorfQorCisvKiBDcmVhdGVzIGEgdHlwZS1pbmRlcGVuZGVudCBhdWRpbyBidWZmZXIgcHJvdmlkZXIgZnJvbQorICogYSBidWZmZXIgYmFzZSBhZGRyZXNzLCBzaXplLCBmcmFtZXNpemUsIGFuZCBpbnB1dCBpbmNyZW1lbnQgYXJyYXkuCisgKgorICogTm8gYWxsb2NhdGlvbiBvciBkZWFsbG9jYXRpb24gb2YgdGhlIHByb3ZpZGVkIGJ1ZmZlciBpcyBkb25lLgorICovCitjbGFzcyBUZXN0UHJvdmlkZXIgOiBwdWJsaWMgYW5kcm9pZDo6QXVkaW9CdWZmZXJQcm92aWRlciB7CitwdWJsaWM6CisgICAgVGVzdFByb3ZpZGVyKHZvaWQqIGFkZHIsIHNpemVfdCBmcmFtZXMsIHNpemVfdCBmcmFtZVNpemUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpbnB1dEluY3IpCisgICAgOiBtQWRkcihhZGRyKSwKKyAgICAgIG1OdW1GcmFtZXMoZnJhbWVzKSwKKyAgICAgIG1GcmFtZVNpemUoZnJhbWVTaXplKSwKKyAgICAgIG1OZXh0RnJhbWUoMCksIG1VbnJlbCgwKSwgbUlucHV0SW5jcihpbnB1dEluY3IpLCBtTmV4dElkeCgwKQorICAgIHsKKyAgICB9CisKKyAgICBUZXN0UHJvdmlkZXIoKQorICAgIDogbUFkZHIoTlVMTCksIG1OdW1GcmFtZXMoMCksIG1GcmFtZVNpemUoMCksCisgICAgICBtTmV4dEZyYW1lKDApLCBtVW5yZWwoMCksIG1OZXh0SWR4KDApCisgICAgeworICAgIH0KKworICAgIHZvaWQgc2V0SW5jcihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpbnB1dEluY3IpIHsKKyAgICAgICAgbUlucHV0SW5jciA9IGlucHV0SW5jcjsKKyAgICAgICAgbU5leHRJZHggPSAwOworICAgIH0KKworICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMgX191bnVzZWQgPSBrSW52YWxpZFBUUykKKyAgICB7CisgICAgICAgIHNpemVfdCByZXF1ZXN0ZWRGcmFtZXMgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgIGlmIChyZXF1ZXN0ZWRGcmFtZXMgPiBtTnVtRnJhbWVzIC0gbU5leHRGcmFtZSkgeworICAgICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gbU51bUZyYW1lcyAtIG1OZXh0RnJhbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtSW5wdXRJbmNyLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBwcm92aWRlZCA9IG1JbnB1dEluY3JbbU5leHRJZHgrK107CisgICAgICAgICAgICBBTE9HVigiZ2V0TmV4dEJ1ZmZlcigpIG1WYWx1ZVslenVdPSV6dSBub3QgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgbU5leHRJZHgtMSwgcHJvdmlkZWQsIGJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgICAgICAgICBpZiAocHJvdmlkZWQgPCBidWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBwcm92aWRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTmV4dElkeCA+PSBtSW5wdXRJbmNyLnNpemUoKSkgeworICAgICAgICAgICAgICAgIG1OZXh0SWR4ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZ2V0TmV4dEJ1ZmZlcigpIHJlcXVlc3RlZCAlenUgZnJhbWVzIG91dCBvZiAlenUgZnJhbWVzIGF2YWlsYWJsZSIKKyAgICAgICAgICAgICAgICAiIGFuZCByZXR1cm5lZCAlenUgZnJhbWVzIiwKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRGcmFtZXMsIG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lLCBidWZmZXItPmZyYW1lQ291bnQpOworICAgICAgICBtVW5yZWwgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiAwKSB7CisgICAgICAgICAgICBidWZmZXItPnJhdyA9IChjaGFyICopbUFkZHIgKyBtRnJhbWVTaXplICogbU5leHRGcmFtZTsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcikKKyAgICB7CisgICAgICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiBtVW5yZWwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWxlYXNlQnVmZmVyKCkgcmVsZWFzZWQgJXp1IGZyYW1lcyBidXQgb25seSAlenUgYXZhaWxhYmxlICIKKyAgICAgICAgICAgICAgICAgICAgInRvIHJlbGVhc2UiLCBidWZmZXItPmZyYW1lQ291bnQsIG1VbnJlbCk7CisgICAgICAgICAgICBtTmV4dEZyYW1lICs9IG1VbnJlbDsKKyAgICAgICAgICAgIG1VbnJlbCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQnVmZmVyKCkgcmVsZWFzZWQgJXp1IGZyYW1lcyBvdXQgb2YgJXp1IGZyYW1lcyBhdmFpbGFibGUgIgorICAgICAgICAgICAgICAgICAgICAidG8gcmVsZWFzZSIsIGJ1ZmZlci0+ZnJhbWVDb3VudCwgbVVucmVsKTsKKyAgICAgICAgICAgIG1OZXh0RnJhbWUgKz0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICAgICAgbVVucmVsIC09IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CisgICAgfQorCisgICAgdm9pZCByZXNldCgpCisgICAgeworICAgICAgICBtTmV4dEZyYW1lID0gMDsKKyAgICB9CisKKyAgICBzaXplX3QgZ2V0TnVtRnJhbWVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtTnVtRnJhbWVzOworICAgIH0KKworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCogbUFkZHI7ICAgLy8gYmFzZSBhZGRyZXNzCisgICAgc2l6ZV90IG1OdW1GcmFtZXM7ICAgLy8gdG90YWwgZnJhbWVzCisgICAgaW50IG1GcmFtZVNpemU7ICAgICAgLy8gZnJhbWUgc2l6ZSAoIyBjaGFubmVscyAqIGJ5dGVzIHBlciBzYW1wbGUpCisgICAgc2l6ZV90IG1OZXh0RnJhbWU7ICAgLy8gaW5kZXggb2YgbmV4dCBmcmFtZSB0byBwcm92aWRlCisgICAgc2l6ZV90IG1VbnJlbDsgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBub3QgeWV0IHJlbGVhc2VkCisgICAgc3RkOjp2ZWN0b3I8aW50PiBtSW5wdXRJbmNyOyAvLyBudW1iZXIgb2YgZnJhbWVzIHByb3ZpZGVkIHBlciBjYWxsCisgICAgc2l6ZV90IG1OZXh0SWR4OyAgICAgLy8gaW5kZXggb2YgbmV4dCBlbnRyeSBpbiBtSW5wdXRJbmNyIHRvIHVzZQorfTsKKworLyogQ3JlYXRlcyBhIGJ1ZmZlciBmaWxsZWQgd2l0aCBhIHNpbmUgd2F2ZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIGNyZWF0ZVNpbmUodm9pZCAqdmJ1ZmZlciwgc2l6ZV90IGZyYW1lcywKKyAgICAgICAgc2l6ZV90IGNoYW5uZWxzLCBkb3VibGUgc2FtcGxlUmF0ZSwgZG91YmxlIGZyZXEpCit7CisgICAgZG91YmxlIHRzY2FsZSA9IDEuIC8gc2FtcGxlUmF0ZTsKKyAgICBUKiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PFQqPih2YnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7CisgICAgICAgIGRvdWJsZSB0ID0gaSAqIHRzY2FsZTsKKyAgICAgICAgZG91YmxlIHkgPSBzaW4oMi4gKiBNX1BJICogZnJlcSAqIHQpOworICAgICAgICBUIHl0ID0gY29udmVydFZhbHVlPFQ+KHkpOworCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY2hhbm5lbHM7ICsraikgeworICAgICAgICAgICAgYnVmZmVyW2kqY2hhbm5lbHMgKyBqXSA9IHl0IC8gVChqICsgMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENyZWF0ZXMgYSBidWZmZXIgZmlsbGVkIHdpdGggYSBjaGlycCBzaWduYWwgKGEgc2luZSB3YXZlIHN3ZWVwKS4KKyAqCisgKiBXaGVuIGNyZWF0aW5nIHRoZSBDaGlycCwgbm90ZSB0aGF0IHRoZSBmcmVxdWVuY3kgaXMgdGhlIHRydWUgc2ludXNvaWRhbAorICogZnJlcXVlbmN5IG5vdCB0aGUgc2FtcGxpbmcgcmF0ZS4KKyAqCisgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NoaXJwCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCBjcmVhdGVDaGlycCh2b2lkICp2YnVmZmVyLCBzaXplX3QgZnJhbWVzLAorICAgICAgICBzaXplX3QgY2hhbm5lbHMsIGRvdWJsZSBzYW1wbGVSYXRlLCAgZG91YmxlIG1pbmZyZXEsIGRvdWJsZSBtYXhmcmVxKQoreworICAgIGRvdWJsZSB0c2NhbGUgPSAxLiAvIHNhbXBsZVJhdGU7CisgICAgVCAqYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxUKj4odmJ1ZmZlcik7CisgICAgLy8gbm90ZSB0aGUgY2hpcnAgY29uc3RhbnQgayBoYXMgYSBkaXZpZGUtYnktdHdvLgorICAgIGRvdWJsZSBrID0gKG1heGZyZXEgLSBtaW5mcmVxKSAvICgyLiAqIHRzY2FsZSAqIGZyYW1lcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgICAgICBkb3VibGUgdCA9IGkgKiB0c2NhbGU7CisgICAgICAgIGRvdWJsZSB5ID0gc2luKDIuICogTV9QSSAqIChrICogdCArIG1pbmZyZXEpICogdCk7CisgICAgICAgIFQgeXQgPSBjb252ZXJ0VmFsdWU8VD4oeSk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBjaGFubmVsczsgKytqKSB7CisgICAgICAgICAgICBidWZmZXJbaSpjaGFubmVscyArIGpdID0geXQgLyBUKGogKyAxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogVGhpcyBkZXJpdmVkIGNsYXNzIGNyZWF0ZXMgYSBidWZmZXIgcHJvdmlkZXIgb2YgZGF0YXR5cGUgVCwKKyAqIGNvbnNpc3Rpbmcgb2YgYW4gaW5wdXQgc2lnbmFsLCBlLmcuIGZyb20gY3JlYXRlQ2hpcnAoKS4KKyAqIFRoZSBudW1iZXIgb2YgZnJhbWVzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSBiYXNlIGNsYXNzCisgKiBUZXN0UHJvdmlkZXI6OmdldE51bUZyYW1lcygpLgorICovCisKK2NsYXNzIFNpZ25hbFByb3ZpZGVyIDogcHVibGljIFRlc3RQcm92aWRlciB7CitwdWJsaWM6CisgICAgU2lnbmFsUHJvdmlkZXIoKQorICAgIDogbVNhbXBsZVJhdGUoMCksCisgICAgICBtQ2hhbm5lbHMoMCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB+U2lnbmFsUHJvdmlkZXIoKQorICAgIHsKKyAgICAgICAgZnJlZShtQWRkcik7CisgICAgICAgIG1BZGRyID0gTlVMTDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIHNldENoaXJwKHNpemVfdCBjaGFubmVscywgZG91YmxlIG1pbmZyZXEsIGRvdWJsZSBtYXhmcmVxLCBkb3VibGUgc2FtcGxlUmF0ZSwgZG91YmxlIHRpbWUpCisgICAgeworICAgICAgICBjcmVhdGVCdWZmZXJCeUZyYW1lczxUPihjaGFubmVscywgc2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSp0aW1lKTsKKyAgICAgICAgY3JlYXRlQ2hpcnA8VD4obUFkZHIsIG1OdW1GcmFtZXMsIG1DaGFubmVscywgbVNhbXBsZVJhdGUsIG1pbmZyZXEsIG1heGZyZXEpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgc2V0U2luZShzaXplX3QgY2hhbm5lbHMsCisgICAgICAgICAgICBkb3VibGUgZnJlcSwgZG91YmxlIHNhbXBsZVJhdGUsIGRvdWJsZSB0aW1lKQorICAgIHsKKyAgICAgICAgY3JlYXRlQnVmZmVyQnlGcmFtZXM8VD4oY2hhbm5lbHMsIHNhbXBsZVJhdGUsIHNhbXBsZVJhdGUqdGltZSk7CisgICAgICAgIGNyZWF0ZVNpbmU8VD4obUFkZHIsIG1OdW1GcmFtZXMsICBtQ2hhbm5lbHMsIG1TYW1wbGVSYXRlLCBmcmVxKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIHNldEZpbGUoY29uc3QgY2hhciAqZmlsZV9pbikKKyAgICB7CisgICAgICAgIFNGX0lORk8gaW5mbzsKKyAgICAgICAgaW5mby5mb3JtYXQgPSAwOworICAgICAgICBTTkRGSUxFICpzZiA9IHNmX29wZW4oZmlsZV9pbiwgU0ZNX1JFQUQsICZpbmZvKTsKKyAgICAgICAgaWYgKHNmID09IE5VTEwpIHsKKyAgICAgICAgICAgIHBlcnJvcihmaWxlX2luKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjcmVhdGVCdWZmZXJCeUZyYW1lczxUPihpbmZvLmNoYW5uZWxzLCBpbmZvLnNhbXBsZXJhdGUsIGluZm8uZnJhbWVzKTsKKyAgICAgICAgaWYgKGlzX3NhbWU8VCwgZmxvYXQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgKHZvaWQpIHNmX3JlYWRmX2Zsb2F0KHNmLCAoZmxvYXQgKikgbUFkZHIsIG1OdW1GcmFtZXMpOworICAgICAgICB9IGVsc2UgaWYgKGlzX3NhbWU8VCwgc2hvcnQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgKHZvaWQpIHNmX3JlYWRmX3Nob3J0KHNmLCAoc2hvcnQgKikgbUFkZHIsIG1OdW1GcmFtZXMpOworICAgICAgICB9CisgICAgICAgIHNmX2Nsb3NlKHNmKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGNyZWF0ZUJ1ZmZlckJ5RnJhbWVzKHNpemVfdCBjaGFubmVscywgdWludDMyX3Qgc2FtcGxlUmF0ZSwgc2l6ZV90IGZyYW1lcykKKyAgICB7CisgICAgICAgIG1OdW1GcmFtZXMgPSBmcmFtZXM7CisgICAgICAgIG1DaGFubmVscyA9IGNoYW5uZWxzOworICAgICAgICBtRnJhbWVTaXplID0gbUNoYW5uZWxzICogc2l6ZW9mKFQpOworICAgICAgICBmcmVlKG1BZGRyKTsKKyAgICAgICAgbUFkZHIgPSBtYWxsb2MobUZyYW1lU2l6ZSAqIG1OdW1GcmFtZXMpOworICAgICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TYW1wbGVSYXRlOworICAgIH0KKworICAgIHVpbnQzMl90IGdldE51bUNoYW5uZWxzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNoYW5uZWxzOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIHVpbnQzMl90IG1DaGFubmVsczsKK307CisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPX1RFU1RfVVRJTFNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxMmMzOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKQEAgLTAsMCArMSw4NiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBcCisgICAgQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAorCitpZmVxICgkKFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZKSwgMSkKK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcCBcCisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbXBsTGVnYWN5LmNwcAorCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKK2Vsc2UKK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBcCisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorZW5kaWYKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYmJpbmRlciBcCisgICAgbGlibWVkaWEgXAorICAgIGxpYmhhcmR3YXJlIFwKKyAgICBsaWJoYXJkd2FyZV9sZWdhY3kKKworaWZuZXEgKCQoVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kpLCAxKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCisgICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyCitlbmRpZgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYnNlcnZpY2V1dGlsaXR5CisKK0xPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5c2VydmljZQorCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKworaWZuZXEgKCQoVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kpLCAxKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIEF1ZGlvUG9saWN5TWFuYWdlci5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGlibG9nIFwKKyAgICBsaWJzb3VuZHRyaWdnZXIKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGlibWVkaWFfaGVscGVyCisKK0xPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCitpZm5lcSAoJChVU0VfQ1VTVE9NX0FVRElPX1BPTElDWSksIDEpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0CisKK0xPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5bWFuYWdlcgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2VuZGlmCitlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwOTBlOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5Q2xpZW50SW1wbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xpZW50IGludGVyZmFjZSBmcm9tIHRoZSBwb2xpY3kgbWFuYWdlciAqLworCithdWRpb19tb2R1bGVfaGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6bG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmxvYWRId01vZHVsZShuYW1lKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYWYtPm9wZW5PdXRwdXQobW9kdWxlLCBvdXRwdXQsIGNvbmZpZywgZGV2aWNlcywgYWRkcmVzcywgbGF0ZW5jeU1zLCBmbGFncyk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9wZW5EdXBsaWNhdGVPdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBhZi0+b3BlbkR1cGxpY2F0ZU91dHB1dChvdXRwdXQxLCBvdXRwdXQyKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6Y2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5zdXNwZW5kT3V0cHV0KG91dHB1dCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+cmVzdG9yZU91dHB1dChvdXRwdXQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+b3BlbklucHV0KG1vZHVsZSwgaW5wdXQsIGNvbmZpZywgZGV2aWNlLCBhZGRyZXNzLCBzb3VyY2UsIGZsYWdzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6Y2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmNsb3NlSW5wdXQoaW5wdXQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcykKK3sKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6aW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcykKK3sKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRQYXJhbWV0ZXJzKGlvX2hhbmRsZSwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGVsYXlfbXMpOworfQorCitTdHJpbmc4IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OmdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleXMpCit7CisgICAgU3RyaW5nOCByZXN1bHQgPSBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhpb19oYW5kbGUsIGtleXMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCisgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdGFydFRvbmUodG9uZSwgc3RyZWFtKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c3RvcFRvbmUoKQoreworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdG9wVG9uZSgpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcykKK3sKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lLCBkZWxheV9tcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om1vdmVFZmZlY3RzKGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdF9vdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5tb3ZlRWZmZWN0cyhzZXNzaW9uLCBzcmNfb3V0cHV0LCBkc3Rfb3V0cHV0KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5jbGllbnRDcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCBoYW5kbGUsIGRlbGF5TXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+Y2xpZW50UmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlLCBkZWxheU1zKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c2V0QXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPmNsaWVudFNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcsIGRlbGF5TXMpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpCit7CisgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpCit7CisgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworfQorCithdWRpb191bmlxdWVfaWRfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpuZXdBdWRpb1VuaXF1ZUlkKCkKK3sKKyAgICByZXR1cm4gQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzE5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeVNlcnZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjdW5kZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIF9fU1RESU5UX0xJTUlUUworI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgorI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKKyNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisvLyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlIHRvIHRoZSBwb2xpY3kgbWFuYWdlciAqLworZXh0ZXJuICJDIiB7CisKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBhcHNfbG9hZF9od19tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmxvYWRId01vZHVsZShuYW1lKTsKK30KKworc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5fb3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKworICAgIGlmIChwU2FtcGxpbmdSYXRlID09IE5VTEwgfHwgcEZvcm1hdCA9PSBOVUxMIHx8IHBDaGFubmVsTWFzayA9PSBOVUxMIHx8CisgICAgICAgICAgICBwRGV2aWNlcyA9PSBOVUxMIHx8IHBMYXRlbmN5TXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICBjb25maWcuc2FtcGxlX3JhdGUgPSAqcFNhbXBsaW5nUmF0ZTsKKyAgICBjb25maWcuZm9ybWF0ID0gKnBGb3JtYXQ7CisgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9ICpwQ2hhbm5lbE1hc2s7CisgICAgaWYgKG9mZmxvYWRJbmZvICE9IE5VTEwpIHsKKyAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKKyAgICB9CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWYtPm9wZW5PdXRwdXQobW9kdWxlLCAmb3V0cHV0LCAmY29uZmlnLCBwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwgcExhdGVuY3lNcywgZmxhZ3MpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgKnBTYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICpwRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgKnBDaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICAqKChhdWRpb19vZmZsb2FkX2luZm9fdCAqKW9mZmxvYWRJbmZvKSA9IGNvbmZpZy5vZmZsb2FkX2luZm87CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dHB1dDsKK30KKworLy8gZGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgYXBzX29wZW5fb3V0cHV0X29uX21vZHVsZSgpCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgcmV0dXJuIG9wZW5fb3V0cHV0KChhdWRpb19tb2R1bGVfaGFuZGxlX3QpMCwgcERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcExhdGVuY3lNcywgZmxhZ3MsIE5VTEwpOworfQorCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICByZXR1cm4gb3Blbl9vdXRwdXQobW9kdWxlLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF0ZW5jeU1zLCBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9kdXBfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBhZi0+b3BlbkR1cGxpY2F0ZU91dHB1dChvdXRwdXQxLCBvdXRwdXQyKTsKK30KKworaW50IGFwc19jbG9zZV9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKK30KKworaW50IGFwc19zdXNwZW5kX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5zdXNwZW5kT3V0cHV0KG91dHB1dCk7Cit9CisKK2ludCBhcHNfcmVzdG9yZV9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+cmVzdG9yZU91dHB1dChvdXRwdXQpOworfQorCitzdGF0aWMgYXVkaW9faW9faGFuZGxlX3Qgb3Blbl9pbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKworICAgIGlmIChwU2FtcGxpbmdSYXRlID09IE5VTEwgfHwgcEZvcm1hdCA9PSBOVUxMIHx8IHBDaGFubmVsTWFzayA9PSBOVUxMIHx8IHBEZXZpY2VzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKyAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7OworICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9ICpwU2FtcGxpbmdSYXRlOworICAgIGNvbmZpZy5mb3JtYXQgPSAqcEZvcm1hdDsKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gKnBDaGFubmVsTWFzazsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIHN0YXR1c190IHN0YXR1cyA9IGFmLT5vcGVuSW5wdXQobW9kdWxlLCAmaW5wdXQsICZjb25maWcsIHBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksIEFVRElPX1NPVVJDRV9NSUMsIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCAvKkZJWE1FKi8pOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgKnBTYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICpwRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgKnBDaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgfQorICAgIHJldHVybiBpbnB1dDsKK30KKworCisvLyBkZXByZWNhdGVkOiByZXBsYWNlZCBieSBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUoKSwgYW5kIGFjb3VzdGljcyBwYXJhbWV0ZXIgaXMgaWdub3JlZAorYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5faW5wdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5fYWNvdXN0aWNzX3QgYWNvdXN0aWNzIF9fdW51c2VkKQoreworICAgIHJldHVybiAgb3Blbl9pbnB1dCgoYXVkaW9fbW9kdWxlX2hhbmRsZV90KTAsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2spOworfQorCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKQoreworICAgIHJldHVybiAgb3Blbl9pbnB1dChtb2R1bGUsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2spOworfQorCitpbnQgYXBzX2Nsb3NlX2lucHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+Y2xvc2VJbnB1dChpbnB1dCk7Cit9CisKK2ludCBhcHNfaW52YWxpZGF0ZV9zdHJlYW0odm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbSk7Cit9CisKK2ludCBhcHNfbW92ZV9lZmZlY3RzKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3Rfb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+bW92ZUVmZmVjdHMoc2Vzc2lvbiwgc3JjX291dHB1dCwgZHN0X291dHB1dCk7Cit9CisKK2NoYXIgKiBhcHNfZ2V0X3BhcmFtZXRlcnModm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleXMpCit7CisgICAgU3RyaW5nOCByZXN1bHQgPSBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhpb19oYW5kbGUsIFN0cmluZzgoa2V5cykpOworICAgIHJldHVybiBzdHJkdXAocmVzdWx0LnN0cmluZygpKTsKK30KKwordm9pZCBhcHNfc2V0X3BhcmFtZXRlcnModm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprdl9wYWlycywgaW50IGRlbGF5X21zKQoreworICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7CisKKyAgICBhdWRpb1BvbGljeVNlcnZpY2UtPnNldFBhcmFtZXRlcnMoaW9faGFuZGxlLCBrdl9wYWlycywgZGVsYXlfbXMpOworfQorCitpbnQgYXBzX3NldF9zdHJlYW1fdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcykKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zKTsKK30KKworaW50IGFwc19zdGFydF90b25lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7CisKKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdGFydFRvbmUodG9uZSwgc3RyZWFtKTsKK30KKworaW50IGFwc19zdG9wX3RvbmUodm9pZCAqc2VydmljZSkKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c3RvcFRvbmUoKTsKK30KKworaW50IGFwc19zZXRfdm9pY2Vfdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKQoreworICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7CisKKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUsIGRlbGF5X21zKTsKK30KKworfTsgLy8gZXh0ZXJuICJDIgorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlMWIzNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKQEAgLTAsMCArMSw2NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5RWZmZWN0cyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5RWZmZWN0cy5oIgorI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpb1BvbGljeUVmZmVjdHMgSW1wbGVtZW50YXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXVkaW9Qb2xpY3lFZmZlY3RzOjpBdWRpb1BvbGljeUVmZmVjdHMoKQoreworICAgIC8vIGxvYWQgYXV0b21hdGljIGF1ZGlvIGVmZmVjdCBtb2R1bGVzCisgICAgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgIGxvYWRBdWRpb0VmZmVjdENvbmZpZyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFKTsKKyAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICBsb2FkQXVkaW9FZmZlY3RDb25maWcoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUpOworICAgIH0KK30KKworCitBdWRpb1BvbGljeUVmZmVjdHM6On5BdWRpb1BvbGljeUVmZmVjdHMoKQoreworICAgIHNpemVfdCBpID0gMDsKKyAgICAvLyByZWxlYXNlIGF1ZGlvIGlucHV0IHByb2Nlc3NpbmcgcmVzb3VyY2VzCisgICAgZm9yIChpID0gMDsgaSA8IG1JbnB1dFNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIG1JbnB1dFNvdXJjZXMudmFsdWVBdChpKTsKKyAgICB9CisgICAgbUlucHV0U291cmNlcy5jbGVhcigpOworCisgICAgZm9yIChpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUlucHV0cy52YWx1ZUF0KGkpLT5tRWZmZWN0cy5jbGVhcigpOworICAgICAgICBkZWxldGUgbUlucHV0cy52YWx1ZUF0KGkpOworICAgIH0KKyAgICBtSW5wdXRzLmNsZWFyKCk7CisKKyAgICAvLyByZWxlYXNlIGF1ZGlvIG91dHB1dCBwcm9jZXNzaW5nIHJlc291cmNlcworICAgIGZvciAoaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBkZWxldGUgbU91dHB1dFN0cmVhbXMudmFsdWVBdChpKTsKKyAgICB9CisgICAgbU91dHB1dFN0cmVhbXMuY2xlYXIoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtT3V0cHV0U2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU91dHB1dFNlc3Npb25zLnZhbHVlQXQoaSktPm1FZmZlY3RzLmNsZWFyKCk7CisgICAgICAgIGRlbGV0ZSBtT3V0cHV0U2Vzc2lvbnMudmFsdWVBdChpKTsKKyAgICB9CisgICAgbU91dHB1dFNlc3Npb25zLmNsZWFyKCk7Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjphZGRJbnB1dEVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgLy8gY3JlYXRlIGF1ZGlvIHByZSBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBpbnB1dCBzb3VyY2UKKyAgICBhdWRpb19zb3VyY2VfdCBhbGlhc1NvdXJjZSA9IChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIDogaW5wdXRTb3VyY2U7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRTb3VyY2VzLmluZGV4T2ZLZXkoYWxpYXNTb3VyY2UpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1YoImFkZElucHV0RWZmZWN0cygpOiBubyBwcm9jZXNzaW5nIG5lZWRzIHRvIGJlIGF0dGFjaGVkIHRvIHRoaXMgc291cmNlIik7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHNzaXplX3QgaWR4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKKyAgICBFZmZlY3RWZWN0b3IgKmlucHV0RGVzYzsKKyAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICBpbnB1dERlc2MgPSBuZXcgRWZmZWN0VmVjdG9yKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIG1JbnB1dHMuYWRkKGlucHV0LCBpbnB1dERlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVmZmVjdFZlY3RvciBpcyBleGlzdGluZyBhbmQgd2UganVzdCBuZWVkIHRvIGluY3JlYXNlIHJlZiBjb3VudAorICAgICAgICBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaWR4KTsKKyAgICB9CisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQrKzsKKworICAgIEFMT0dWKCJhZGRJbnB1dEVmZmVjdHMoKTogaW5wdXQ6ICVkLCByZWZDb3VudDogJWQiLCBpbnB1dCwgaW5wdXREZXNjLT5tUmVmQ291bnQpOworICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAxKSB7CisgICAgICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBlZmZlY3RzID0gbUlucHV0U291cmNlcy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCAmZWZmZWN0LT5tVXVpZCwgLTEsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLCBpbnB1dCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmeC0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJhZGRJbnB1dEVmZmVjdHMoKTogZmFpbGVkIHRvIGNyZWF0ZSBGeCAlcyBvbiBzb3VyY2UgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+bU5hbWUsIChpbnQzMl90KWFsaWFzU291cmNlKTsKKyAgICAgICAgICAgICAgICAvLyBmeCBnb2VzIG91dCBvZiBzY29wZSBhbmQgc3Ryb25nIHJlZiBvbiBBdWRpb0VmZmVjdCBpcyByZWxlYXNlZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBlZmZlY3QtPm1QYXJhbXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmeC0+c2V0UGFyYW1ldGVyKGVmZmVjdC0+bVBhcmFtc1tqXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiYWRkSW5wdXRFZmZlY3RzKCk6IGFkZGVkIEZ4ICVzIG9uIHNvdXJjZTogJWQiLAorICAgICAgICAgICAgICAgICAgZWZmZWN0LT5tTmFtZSwgKGludDMyX3QpYWxpYXNTb3VyY2UpOworICAgICAgICAgICAgaW5wdXREZXNjLT5tRWZmZWN0cy5hZGQoZngpOworICAgICAgICB9CisgICAgICAgIGlucHV0RGVzYy0+c2V0UHJvY2Vzc29yRW5hYmxlZCh0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnJlbGVhc2VJbnB1dEVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgRWZmZWN0VmVjdG9yICppbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIGlucHV0RGVzYy0+bVJlZkNvdW50LS07CisgICAgQUxPR1YoInJlbGVhc2VJbnB1dEVmZmVjdHMoKTogaW5wdXQ6ICVkLCByZWZDb3VudDogJWQiLCBpbnB1dCwgaW5wdXREZXNjLT5tUmVmQ291bnQpOworICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIGlucHV0RGVzYy0+c2V0UHJvY2Vzc29yRW5hYmxlZChmYWxzZSk7CisgICAgICAgIGRlbGV0ZSBpbnB1dERlc2M7CisgICAgICAgIG1JbnB1dHMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlSW5wdXRFZmZlY3RzKCk6IGFsbCBlZmZlY3RzIHJlbGVhc2VkIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cXVlcnlEZWZhdWx0SW5wdXRFZmZlY3RzKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc2l6ZV90IGluZGV4OworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGlmIChtSW5wdXRzLnZhbHVlQXQoaW5kZXgpLT5tU2Vzc2lvbklkID09IGF1ZGlvU2Vzc2lvbikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluZGV4ID09IG1JbnB1dHMuc2l6ZSgpKSB7CisgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIFZlY3Rvcjwgc3A8QXVkaW9FZmZlY3Q+ID4gZWZmZWN0cyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IGVmZmVjdHNbaV0tPmRlc2NyaXB0b3IoKTsKKyAgICAgICAgaWYgKGkgPCAqY291bnQpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0b3JzW2ldID0gZGVzYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZWZmZWN0cy5zaXplKCkgPiAqY291bnQpIHsKKyAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOworICAgIH0KKyAgICAqY291bnQgPSBlZmZlY3RzLnNpemUoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cXVlcnlEZWZhdWx0T3V0cHV0U2Vzc2lvbkVmZmVjdHMoaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNpemVfdCBpbmRleDsKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtT3V0cHV0U2Vzc2lvbnMuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGlmIChtT3V0cHV0U2Vzc2lvbnMudmFsdWVBdChpbmRleCktPm1TZXNzaW9uSWQgPT0gYXVkaW9TZXNzaW9uKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5kZXggPT0gbU91dHB1dFNlc3Npb25zLnNpemUoKSkgeworICAgICAgICAqY291bnQgPSAwOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBWZWN0b3I8IHNwPEF1ZGlvRWZmZWN0PiA+IGVmZmVjdHMgPSBtT3V0cHV0U2Vzc2lvbnMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IGVmZmVjdHNbaV0tPmRlc2NyaXB0b3IoKTsKKyAgICAgICAgaWYgKGkgPCAqY291bnQpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0b3JzW2ldID0gZGVzYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZWZmZWN0cy5zaXplKCkgPiAqY291bnQpIHsKKyAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOworICAgIH0KKyAgICAqY291bnQgPSBlZmZlY3RzLnNpemUoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6YWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIGNyZWF0ZSBhdWRpbyBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBzdHJlYW0KKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW0pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1YoImFkZE91dHB1dFNlc3Npb25FZmZlY3RzKCk6IG5vIG91dHB1dCBwcm9jZXNzaW5nIG5lZWRlZCBmb3IgdGhpcyBzdHJlYW0iKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFNlc3Npb25zLmluZGV4T2ZLZXkoYXVkaW9TZXNzaW9uKTsKKyAgICBFZmZlY3RWZWN0b3IgKnByb2NEZXNjOworICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIHByb2NEZXNjID0gbmV3IEVmZmVjdFZlY3RvcihhdWRpb1Nlc3Npb24pOworICAgICAgICBtT3V0cHV0U2Vzc2lvbnMuYWRkKGF1ZGlvU2Vzc2lvbiwgcHJvY0Rlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVmZmVjdFZlY3RvciBpcyBleGlzdGluZyBhbmQgd2UganVzdCBuZWVkIHRvIGluY3JlYXNlIHJlZiBjb3VudAorICAgICAgICBwcm9jRGVzYyA9IG1PdXRwdXRTZXNzaW9ucy52YWx1ZUF0KGlkeCk7CisgICAgfQorICAgIHByb2NEZXNjLT5tUmVmQ291bnQrKzsKKworICAgIEFMT0dWKCJhZGRPdXRwdXRTZXNzaW9uRWZmZWN0cygpOiBzZXNzaW9uOiAlZCwgcmVmQ291bnQ6ICVkIiwKKyAgICAgICAgICBhdWRpb1Nlc3Npb24sIHByb2NEZXNjLT5tUmVmQ291bnQpOworICAgIGlmIChwcm9jRGVzYy0+bVJlZkNvdW50ID09IDEpIHsKKyAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCAmZWZmZWN0LT5tVXVpZCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24sIG91dHB1dCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmeC0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRPdXRwdXRTZXNzaW9uRWZmZWN0cygpOiBmYWlsZWQgdG8gY3JlYXRlIEZ4ICAlcyBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm1OYW1lLCBhdWRpb1Nlc3Npb24pOworICAgICAgICAgICAgICAgIC8vIGZ4IGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBzdHJvbmcgcmVmIG9uIEF1ZGlvRWZmZWN0IGlzIHJlbGVhc2VkCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiYWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoKTogYWRkZWQgRnggJXMgb24gc2Vzc2lvbjogJWQgZm9yIHN0cmVhbTogJWQiLAorICAgICAgICAgICAgICAgICAgZWZmZWN0LT5tTmFtZSwgYXVkaW9TZXNzaW9uLCAoaW50MzJfdClzdHJlYW0pOworICAgICAgICAgICAgcHJvY0Rlc2MtPm1FZmZlY3RzLmFkZChmeCk7CisgICAgICAgIH0KKworICAgICAgICBwcm9jRGVzYy0+c2V0UHJvY2Vzc29yRW5hYmxlZCh0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpyZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgKHZvaWQpIG91dHB1dDsgLy8gYXJndW1lbnQgbm90IHVzZWQgZm9yIG5vdworICAgICh2b2lkKSBzdHJlYW07IC8vIGFyZ3VtZW50IG5vdCB1c2VkIGZvciBub3cKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRTZXNzaW9ucy5pbmRleE9mS2V5KGF1ZGlvU2Vzc2lvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVigicmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzOiBubyBvdXRwdXQgcHJvY2Vzc2luZyB3YXMgYXR0YWNoZWQgdG8gdGhpcyBzdHJlYW0iKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIEVmZmVjdFZlY3RvciAqcHJvY0Rlc2MgPSBtT3V0cHV0U2Vzc2lvbnMudmFsdWVBdChpbmRleCk7CisgICAgcHJvY0Rlc2MtPm1SZWZDb3VudC0tOworICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMoKTogc2Vzc2lvbjogJWQsIHJlZkNvdW50OiAlZCIsCisgICAgICAgICAgYXVkaW9TZXNzaW9uLCBwcm9jRGVzYy0+bVJlZkNvdW50KTsKKyAgICBpZiAocHJvY0Rlc2MtPm1SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIHByb2NEZXNjLT5zZXRQcm9jZXNzb3JFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgcHJvY0Rlc2MtPm1FZmZlY3RzLmNsZWFyKCk7CisgICAgICAgIGRlbGV0ZSBwcm9jRGVzYzsKKyAgICAgICAgbU91dHB1dFNlc3Npb25zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICBBTE9HVigicmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKCk6IG91dHB1dCBwcm9jZXNzaW5nIHJlbGVhc2VkIGZyb20gc2Vzc2lvbjogJWQiLAorICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3ZvaWQgQXVkaW9Qb2xpY3lFZmZlY3RzOjpFZmZlY3RWZWN0b3I6OnNldFByb2Nlc3NvckVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdHMuaXRlbUF0KGkpLT5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgIH0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpbyBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLypzdGF0aWMqLyBjb25zdCBjaGFyICogY29uc3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjprSW5wdXRTb3VyY2VOYW1lc1tBVURJT19TT1VSQ0VfQ05UIC0xXSA9IHsKKyAgICBNSUNfU1JDX1RBRywKKyAgICBWT0lDRV9VTF9TUkNfVEFHLAorICAgIFZPSUNFX0RMX1NSQ19UQUcsCisgICAgVk9JQ0VfQ0FMTF9TUkNfVEFHLAorICAgIENBTUNPUkRFUl9TUkNfVEFHLAorICAgIFZPSUNFX1JFQ19TUkNfVEFHLAorICAgIFZPSUNFX0NPTU1fU1JDX1RBRworfTsKKworLy8gcmV0dXJucyB0aGUgYXVkaW9fc291cmNlX3QgZW51bSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBzb3VyY2UgbmFtZSBvcgorLy8gQVVESU9fU09VUkNFX0NOVCBpcyBubyBtYXRjaCBmb3VuZAorLypzdGF0aWMqLyBhdWRpb19zb3VyY2VfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmlucHV0U291cmNlTmFtZVRvRW51bShjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IEFVRElPX1NPVVJDRV9NSUM7IGkgPCBBVURJT19TT1VSQ0VfQ05UOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBrSW5wdXRTb3VyY2VOYW1lc1tpIC0gQVVESU9fU09VUkNFX01JQ10pID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJpbnB1dFNvdXJjZU5hbWVUb0VudW0gZm91bmQgc291cmNlICVzICVkIiwgbmFtZSwgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKGF1ZGlvX3NvdXJjZV90KWk7Cit9CisKK2NvbnN0IGNoYXIgKkF1ZGlvUG9saWN5RWZmZWN0czo6a1N0cmVhbU5hbWVzW0FVRElPX1NUUkVBTV9DTlQrMV0gPSB7CisgICAgQVVESU9fU1RSRUFNX0RFRkFVTFRfVEFHLAorICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMX1RBRywKKyAgICBBVURJT19TVFJFQU1fU1lTVEVNX1RBRywKKyAgICBBVURJT19TVFJFQU1fUklOR19UQUcsCisgICAgQVVESU9fU1RSRUFNX01VU0lDX1RBRywKKyAgICBBVURJT19TVFJFQU1fQUxBUk1fVEFHLAorICAgIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT05fVEFHLAorICAgIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPX1RBRywKKyAgICBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRV9UQUcsCisgICAgQVVESU9fU1RSRUFNX0RUTUZfVEFHLAorICAgIEFVRElPX1NUUkVBTV9UVFNfVEFHCit9OworCisvLyByZXR1cm5zIHRoZSBhdWRpb19zdHJlYW1fdCBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dCBzdHJlYW0gbmFtZSBvcgorLy8gQVVESU9fU1RSRUFNX0NOVCBpcyBubyBtYXRjaCBmb3VuZAorYXVkaW9fc3RyZWFtX3R5cGVfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnN0cmVhbU5hbWVUb0VudW0oY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSBBVURJT19TVFJFQU1fREVGQVVMVDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKG5hbWUsIGtTdHJlYW1OYW1lc1tpIC0gQVVESU9fU1RSRUFNX0RFRkFVTFRdKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigic3RyZWFtTmFtZVRvRW51bSBmb3VuZCBzdHJlYW0gJXMgJWQiLCBuYW1lLCBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoYXVkaW9fc3RyZWFtX3R5cGVfdClpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpbyBFZmZlY3QgQ29uZmlnIHBhcnNlcgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzaXplX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpncm93UGFyYW1TaXplKGNoYXIgKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjdXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnRvdFNpemUpCit7CisgICAgLy8gKmN1clNpemUgaXMgYXQgbGVhc3Qgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIDIgKiBzaXplb2YoaW50KQorICAgIHNpemVfdCBwb3MgPSAoKCpjdXJTaXplIC0gMSApIC8gc2l6ZSArIDEpICogc2l6ZTsKKworICAgIGlmIChwb3MgKyBzaXplID4gKnRvdFNpemUpIHsKKyAgICAgICAgd2hpbGUgKHBvcyArIHNpemUgPiAqdG90U2l6ZSkgeworICAgICAgICAgICAgKnRvdFNpemUgKz0gKCgqdG90U2l6ZSArIDcpIC8gOCkgKiA0OworICAgICAgICB9CisgICAgICAgIHBhcmFtID0gKGNoYXIgKilyZWFsbG9jKHBhcmFtLCAqdG90U2l6ZSk7CisgICAgfQorICAgICpjdXJTaXplID0gcG9zICsgc2l6ZTsKKyAgICByZXR1cm4gcG9zOworfQorCitzaXplX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpyZWFkUGFyYW1WYWx1ZShjbm9kZSAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjdXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKQoreworICAgIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIFNIT1JUX1RBRywgc2l6ZW9mKFNIT1JUX1RBRykgKyAxKSA9PSAwKSB7CisgICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2Yoc2hvcnQpLCBjdXJTaXplLCB0b3RTaXplKTsKKyAgICAgICAgKihzaG9ydCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IChzaG9ydClhdG9pKG5vZGUtPnZhbHVlKTsKKyAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBzaG9ydCAlZCIsICooc2hvcnQgKikoKGNoYXIgKilwYXJhbSArIHBvcykpOworICAgICAgICByZXR1cm4gc2l6ZW9mKHNob3J0KTsKKyAgICB9IGVsc2UgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgSU5UX1RBRywgc2l6ZW9mKElOVF9UQUcpICsgMSkgPT0gMCkgeworICAgICAgICBzaXplX3QgcG9zID0gZ3Jvd1BhcmFtU2l6ZShwYXJhbSwgc2l6ZW9mKGludCksIGN1clNpemUsIHRvdFNpemUpOworICAgICAgICAqKGludCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IGF0b2kobm9kZS0+dmFsdWUpOworICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIGludCAlZCIsICooaW50ICopKChjaGFyICopcGFyYW0gKyBwb3MpKTsKKyAgICAgICAgcmV0dXJuIHNpemVvZihpbnQpOworICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBGTE9BVF9UQUcsIHNpemVvZihGTE9BVF9UQUcpICsgMSkgPT0gMCkgeworICAgICAgICBzaXplX3QgcG9zID0gZ3Jvd1BhcmFtU2l6ZShwYXJhbSwgc2l6ZW9mKGZsb2F0KSwgY3VyU2l6ZSwgdG90U2l6ZSk7CisgICAgICAgICooZmxvYXQgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSAoZmxvYXQpYXRvZihub2RlLT52YWx1ZSk7CisgICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgZmxvYXQgJWYiLCooZmxvYXQgKikoKGNoYXIgKilwYXJhbSArIHBvcykpOworICAgICAgICByZXR1cm4gc2l6ZW9mKGZsb2F0KTsKKyAgICB9IGVsc2UgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgQk9PTF9UQUcsIHNpemVvZihCT09MX1RBRykgKyAxKSA9PSAwKSB7CisgICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2YoYm9vbCksIGN1clNpemUsIHRvdFNpemUpOworICAgICAgICBpZiAoc3RybmNtcChub2RlLT52YWx1ZSwgImZhbHNlIiwgc3RybGVuKCJmYWxzZSIpICsgMSkgPT0gMCkgeworICAgICAgICAgICAgKihib29sICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqKGJvb2wgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgYm9vbCAlcyIsKihib29sICopKChjaGFyICopcGFyYW0gKyBwb3MpID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIHJldHVybiBzaXplb2YoYm9vbCk7CisgICAgfSBlbHNlIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIFNUUklOR19UQUcsIHNpemVvZihTVFJJTkdfVEFHKSArIDEpID09IDApIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0cm5sZW4obm9kZS0+dmFsdWUsIEVGRkVDVF9TVFJJTkdfTEVOX01BWCk7CisgICAgICAgIGlmICgqY3VyU2l6ZSArIGxlbiArIDEgPiAqdG90U2l6ZSkgeworICAgICAgICAgICAgKnRvdFNpemUgPSAqY3VyU2l6ZSArIGxlbiArIDE7CisgICAgICAgICAgICBwYXJhbSA9IChjaGFyICopcmVhbGxvYyhwYXJhbSwgKnRvdFNpemUpOworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkocGFyYW0gKyAqY3VyU2l6ZSwgbm9kZS0+dmFsdWUsIGxlbik7CisgICAgICAgICpjdXJTaXplICs9IGxlbjsKKyAgICAgICAgcGFyYW1bKmN1clNpemVdID0gJ1wwJzsKKyAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBzdHJpbmcgJXMiLCBwYXJhbSArICpjdXJTaXplIC0gbGVuKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisgICAgQUxPR1coInJlYWRQYXJhbVZhbHVlKCkgdW5rbm93biBwYXJhbSB0eXBlICVzIiwgbm9kZS0+bmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2VmZmVjdF9wYXJhbV90ICpBdWRpb1BvbGljeUVmZmVjdHM6OmxvYWRFZmZlY3RQYXJhbWV0ZXIoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKnBhcmFtOworICAgIGNub2RlICp2YWx1ZTsKKyAgICBzaXplX3QgY3VyU2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCk7CisgICAgc2l6ZV90IHRvdFNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgMiAqIHNpemVvZihpbnQpOworICAgIGVmZmVjdF9wYXJhbV90ICpmeF9wYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKW1hbGxvYyh0b3RTaXplKTsKKworICAgIHBhcmFtID0gY29uZmlnX2ZpbmQocm9vdCwgUEFSQU1fVEFHKTsKKyAgICB2YWx1ZSA9IGNvbmZpZ19maW5kKHJvb3QsIFZBTFVFX1RBRyk7CisgICAgaWYgKHBhcmFtID09IE5VTEwgJiYgdmFsdWUgPT0gTlVMTCkgeworICAgICAgICAvLyB0cnkgdG8gcGFyc2Ugc2ltcGxlIHBhcmFtZXRlciBmb3JtIHtpbnQgaW50fQorICAgICAgICBwYXJhbSA9IHJvb3QtPmZpcnN0X2NoaWxkOworICAgICAgICBpZiAocGFyYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gTm90ZTogdGhhdCBhIHBhaXIgb2YgcmFuZG9tIHN0cmluZ3MgaXMgcmVhZCBhcyAwIDAKKyAgICAgICAgICAgIGludCAqcHRyID0gKGludCAqKWZ4X3BhcmFtLT5kYXRhOworICAgICAgICAgICAgaW50ICpwdHIyID0gKGludCAqKSgoY2hhciAqKXBhcmFtICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSk7CisgICAgICAgICAgICBBTE9HVygibG9hZEVmZmVjdFBhcmFtZXRlcigpIHB0ciAlcCBwdHIyICVwIiwgcHRyLCBwdHIyKTsKKyAgICAgICAgICAgICpwdHIrKyA9IGF0b2kocGFyYW0tPm5hbWUpOworICAgICAgICAgICAgKnB0ciA9IGF0b2kocGFyYW0tPnZhbHVlKTsKKyAgICAgICAgICAgIGZ4X3BhcmFtLT5wc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICAgICAgZnhfcGFyYW0tPnZzaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgICAgICByZXR1cm4gZnhfcGFyYW07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhcmFtID09IE5VTEwgfHwgdmFsdWUgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZEVmZmVjdFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW1ldGVyIGRlc2NyaXB0aW9uICVzIiwgcm9vdC0+bmFtZSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgZnhfcGFyYW0tPnBzaXplID0gMDsKKyAgICBwYXJhbSA9IHBhcmFtLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAocGFyYW0pIHsKKyAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSByZWFkaW5nIHBhcmFtIG9mIHR5cGUgJXMiLCBwYXJhbS0+bmFtZSk7CisgICAgICAgIHNpemVfdCBzaXplID0gcmVhZFBhcmFtVmFsdWUocGFyYW0sIChjaGFyICopZnhfcGFyYW0sICZjdXJTaXplLCAmdG90U2l6ZSk7CisgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZnhfcGFyYW0tPnBzaXplICs9IHNpemU7CisgICAgICAgIHBhcmFtID0gcGFyYW0tPm5leHQ7CisgICAgfQorCisgICAgLy8gYWxpZ24gc3RhcnQgb2YgdmFsdWUgZmllbGQgb24gMzIgYml0IGJvdW5kYXJ5CisgICAgY3VyU2l6ZSA9ICgoY3VyU2l6ZSAtIDEgKSAvIHNpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KTsKKworICAgIGZ4X3BhcmFtLT52c2l6ZSA9IDA7CisgICAgdmFsdWUgPSB2YWx1ZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKHZhbHVlKSB7CisgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgcmVhZGluZyB2YWx1ZSBvZiB0eXBlICVzIiwgdmFsdWUtPm5hbWUpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IHJlYWRQYXJhbVZhbHVlKHZhbHVlLCAoY2hhciAqKWZ4X3BhcmFtLCAmY3VyU2l6ZSwgJnRvdFNpemUpOworICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGZ4X3BhcmFtLT52c2l6ZSArPSBzaXplOworICAgICAgICB2YWx1ZSA9IHZhbHVlLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiBmeF9wYXJhbTsKKworZXJyb3I6CisgICAgZGVsZXRlIGZ4X3BhcmFtOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEVmZmVjdFBhcmFtZXRlcnMoY25vZGUgKnJvb3QsIFZlY3RvciA8ZWZmZWN0X3BhcmFtX3QgKj4mIHBhcmFtcykKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0UGFyYW1ldGVycygpIGxvYWRpbmcgcGFyYW0gJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnBhcmFtID0gbG9hZEVmZmVjdFBhcmFtZXRlcihub2RlKTsKKyAgICAgICAgaWYgKHBhcmFtID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1zLmFkZChwYXJhbSk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KK30KKworCitBdWRpb1BvbGljeUVmZmVjdHM6OkVmZmVjdERlc2NWZWN0b3IgKkF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEVmZmVjdENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNub2RlICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygibG9hZElucHV0U291cmNlKCkgZW1wdHkgZWxlbWVudCAlcyIsIHJvb3QtPm5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgRWZmZWN0RGVzY1ZlY3RvciAqZGVzYyA9IG5ldyBFZmZlY3REZXNjVmVjdG9yKCk7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3RybmNtcChlZmZlY3RzW2ldLT5tTmFtZSwgbm9kZS0+bmFtZSwgRUZGRUNUX1NUUklOR19MRU5fTUFYKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RDb25maWcoKSBmb3VuZCBlZmZlY3QgJXMgaW4gbGlzdCIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpID09IGVmZmVjdHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEVmZmVjdENvbmZpZygpIGVmZmVjdCAlcyBub3QgaW4gbGlzdCIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBuZXcgRWZmZWN0RGVzYygqZWZmZWN0c1tpXSk7ICAgLy8gZGVlcCBjb3B5CisgICAgICAgIGxvYWRFZmZlY3RQYXJhbWV0ZXJzKG5vZGUsIGVmZmVjdC0+bVBhcmFtcyk7CisgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0Q29uZmlnKCkgYWRkaW5nIGVmZmVjdCAlcyB1dWlkICUwOHgiLAorICAgICAgICAgICAgICBlZmZlY3QtPm1OYW1lLCBlZmZlY3QtPm1VdWlkLnRpbWVMb3cpOworICAgICAgICBkZXNjLT5tRWZmZWN0cy5hZGQoZWZmZWN0KTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIGlmIChkZXNjLT5tRWZmZWN0cy5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HVygibG9hZEVmZmVjdENvbmZpZygpIG5vIHZhbGlkIGVmZmVjdHMgZm91bmQgaW4gY29uZmlnICVzIiwgcm9vdC0+bmFtZSk7CisgICAgICAgIGRlbGV0ZSBkZXNjOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGRlc2M7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZElucHV0RWZmZWN0Q29uZmlndXJhdGlvbnMoY25vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cykKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFBSRVBST0NFU1NJTkdfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gaW5wdXRTb3VyY2VOYW1lVG9FbnVtKG5vZGUtPm5hbWUpOworICAgICAgICBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9DTlQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJsb2FkSW5wdXRTb3VyY2VzKCkgaW52YWxpZCBpbnB1dCBzb3VyY2UgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImxvYWRJbnB1dFNvdXJjZXMoKSBsb2FkaW5nIGlucHV0IHNvdXJjZSAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICBFZmZlY3REZXNjVmVjdG9yICpkZXNjID0gbG9hZEVmZmVjdENvbmZpZyhub2RlLCBlZmZlY3RzKTsKKyAgICAgICAgaWYgKGRlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXRTb3VyY2VzLmFkZChzb3VyY2UsIGRlc2MpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmxvYWRTdHJlYW1FZmZlY3RDb25maWd1cmF0aW9ucyhjbm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cykKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIE9VVFBVVF9TRVNTSU9OX1BST0NFU1NJTkdfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1OYW1lVG9FbnVtKG5vZGUtPm5hbWUpOworICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJsb2FkU3RyZWFtRWZmZWN0Q29uZmlndXJhdGlvbnMoKSBpbnZhbGlkIG91dHB1dCBzdHJlYW0gJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImxvYWRTdHJlYW1FZmZlY3RDb25maWd1cmF0aW9ucygpIGxvYWRpbmcgb3V0cHV0IHN0cmVhbSAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICBFZmZlY3REZXNjVmVjdG9yICpkZXNjID0gbG9hZEVmZmVjdENvbmZpZyhub2RlLCBlZmZlY3RzKTsKKyAgICAgICAgaWYgKGRlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtT3V0cHV0U3RyZWFtcy5hZGQoc3RyZWFtLCBkZXNjKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworQXVkaW9Qb2xpY3lFZmZlY3RzOjpFZmZlY3REZXNjICpBdWRpb1BvbGljeUVmZmVjdHM6OmxvYWRFZmZlY3QoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGlmIChBdWRpb0VmZmVjdDo6c3RyaW5nVG9HdWlkKG5vZGUtPnZhbHVlLCAmdXVpZCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV3IEVmZmVjdERlc2Mocm9vdC0+bmFtZSwgdXVpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEVmZmVjdHMoY25vZGUgKnJvb3QsIFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cykKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEVGRkVDVFNfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RzKCkgbG9hZGluZyBlZmZlY3QgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbG9hZEVmZmVjdChub2RlKTsKKyAgICAgICAgaWYgKGVmZmVjdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVmZmVjdHMuYWRkKGVmZmVjdCk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEF1ZGlvRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgY25vZGUgKnJvb3Q7CisgICAgY2hhciAqZGF0YTsKKworICAgIGRhdGEgPSAoY2hhciAqKWxvYWRfZmlsZShwYXRoLCBOVUxMKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKKyAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKKworICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBlZmZlY3RzOworICAgIGxvYWRFZmZlY3RzKHJvb3QsIGVmZmVjdHMpOworICAgIGxvYWRJbnB1dEVmZmVjdENvbmZpZ3VyYXRpb25zKHJvb3QsIGVmZmVjdHMpOworICAgIGxvYWRTdHJlYW1FZmZlY3RDb25maWd1cmF0aW9ucyhyb290LCBlZmZlY3RzKTsKKworICAgIGNvbmZpZ19mcmVlKHJvb3QpOworICAgIGZyZWUocm9vdCk7CisgICAgZnJlZShkYXRhKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUVmZmVjdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjBkNTM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9QT0xJQ1lFRkZFQ1RTX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT1BPTElDWUVGRkVDVFNfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBdWRpb1BvbGljeUVmZmVjdHMgY2xhc3MKKy8vIFRoaXMgY2xhc3Mgd2lsbCBtYW5hZ2UgYWxsIGVmZmVjdHMgYXR0YWNoZWQgdG8gaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zIGluCisvLyBBdWRpb1BvbGljeVNlcnZpY2UgYXMgY29uZmlndXJlZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYuCitjbGFzcyBBdWRpb1BvbGljeUVmZmVjdHMgOiBwdWJsaWMgUmVmQmFzZQoreworCitwdWJsaWM6CisKKyAgICAvLyBUaGUgY29uc3RydWN0b3Igd2lsbCBwYXJzZSBhdWRpb19lZmZlY3RzLmNvbmYKKyAgICAvLyBGaXJzdCBpdCB3aWxsIGxvb2sgd2hldGhlciB2ZW5kb3Igc3BlY2lmaWMgZmlsZSBleGlzdHMsCisgICAgLy8gb3RoZXJ3aXNlIGl0IHdpbGwgcGFyc2UgdGhlIHN5c3RlbSBkZWZhdWx0IGZpbGUuCisJICAgICAgICAgQXVkaW9Qb2xpY3lFZmZlY3RzKCk7CisgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lFZmZlY3RzKCk7CisKKyAgICAvLyBOT1RFOiBtZXRob2RzIG9uIEF1ZGlvUG9saWN5RWZmZWN0cyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHdpdGggdGhlIEF1ZGlvUG9saWN5U2VydmljZQorICAgIC8vIG1haW4gbXV0ZXggKG1Mb2NrKSBoZWxkIGFzIHRoZXkgd2lsbCBpbmRpcmVjdGx5IGNhbGwgYmFjayBpbnRvIEF1ZGlvUG9saWN5U2VydmljZSB3aGVuCisgICAgLy8gbWFuYWdpbmcgYXVkaW8gZWZmZWN0cy4KKworICAgIC8vIFJldHVybiBhIGxpc3Qgb2YgZWZmZWN0IGRlc2NyaXB0b3JzIGZvciBkZWZhdWx0IGlucHV0IGVmZmVjdHMKKyAgICAvLyBhc3NvY2lhdGVkIHdpdGggYXVkaW9TZXNzaW9uCisgICAgc3RhdHVzX3QgcXVlcnlEZWZhdWx0SW5wdXRFZmZlY3RzKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOworCisgICAgLy8gQWRkIGFsbCBpbnB1dCBlZmZlY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlucHV0CisgICAgLy8gRWZmZWN0cyBhcmUgYXR0YWNoZWQgZGVwZW5kaW5nIG9uIHRoZSBhdWRpb19zb3VyY2VfdAorICAgIHN0YXR1c190IGFkZElucHV0RWZmZWN0cyhhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pOworCisgICAgLy8gQWRkIGFsbCBpbnB1dCBlZmZlY3RzIGFzc29jaWF0ZWQgdG8gdGhpcyBpbnB1dAorICAgIHN0YXR1c190IHJlbGVhc2VJbnB1dEVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOworCisKKyAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIGVmZmVjdCBkZXNjcmlwdG9ycyBmb3IgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cworICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBhdWRpb1Nlc3Npb24KKyAgICBzdGF0dXNfdCBxdWVyeURlZmF1bHRPdXRwdXRTZXNzaW9uRWZmZWN0cyhpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKKworICAgIC8vIEFkZCBhbGwgb3V0cHV0IGVmZmVjdHMgYXNzb2NpYXRlZCB0byB0aGlzIG91dHB1dAorICAgIC8vIEVmZmVjdHMgYXJlIGF0dGFjaGVkIGRlcGVuZGluZyBvbiB0aGUgYXVkaW9fc3RyZWFtX3R5cGVfdAorICAgIHN0YXR1c190IGFkZE91dHB1dFNlc3Npb25FZmZlY3RzKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pOworCisgICAgLy8gcmVsZWFzZSBhbGwgb3V0cHV0IGVmZmVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3V0cHV0IHN0cmVhbSBhbmQgYXVkaW9zZXNzaW9uCisgICAgc3RhdHVzX3QgcmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pOworCitwcml2YXRlOgorCisgICAgLy8gY2xhc3MgdG8gc3RvcmUgdGhlIGRlc2NyaXB0aW9uIG9mIGFuIGVmZmVjdHMgYW5kIGl0cyBwYXJhbWV0ZXJzCisgICAgLy8gYXMgZGVmaW5lZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKKyAgICBjbGFzcyBFZmZlY3REZXNjIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVmZmVjdERlc2MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKHV1aWQpIHsgfQorICAgICAgICBFZmZlY3REZXNjKGNvbnN0IEVmZmVjdERlc2MmIG9yaWcpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKHN0cmR1cChvcmlnLm1OYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtVXVpZChvcmlnLm1VdWlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVlcCBjb3B5IG1QYXJhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG9yaWcubVBhcmFtcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqb3JpZ1BhcmFtID0gb3JpZy5tUGFyYW1zW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwc2l6ZSBhbmQgdnNpemUgYXJlIHJvdW5kZWQgdXAgdG8gYW4gaW50IGJvdW5kYXJ5IGZvciBhbGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvcmlnU2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9yaWdQYXJhbS0+cHNpemUgKyAzKSAmIH4zKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3JpZ1BhcmFtLT52c2l6ZSArIDMpICYgfjMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqZHVwUGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QgKikgbWFsbG9jKG9yaWdTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGR1cFBhcmFtLCBvcmlnUGFyYW0sIG9yaWdTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBwYXJhbSBidWZmZXIgYWxsb2NhdGlvbiBpcyBhbHNvIGRvbmUgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGVzIG9mIDQgYnl0ZXMgb3JpZ2luYWxseS4gSW4gdGhlb3J5IHdlIHNob3VsZCBtZW1jcHkgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHBhcmFtIHNpemUsIHRoYXQgaXMgd2l0aG91dCByb3VuZGluZyB2c2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy5hZGQoZHVwUGFyYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLyp2aXJ0dWFsKi8gfkVmZmVjdERlc2MoKSB7CisgICAgICAgICAgICBmcmVlKG1OYW1lKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbVBhcmFtcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgIGZyZWUobVBhcmFtc1trXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2hhciAqbU5hbWU7CisgICAgICAgIGVmZmVjdF91dWlkX3QgbVV1aWQ7CisgICAgICAgIFZlY3RvciA8ZWZmZWN0X3BhcmFtX3QgKj4gbVBhcmFtczsKKyAgICB9OworCisgICAgLy8gY2xhc3MgdG8gc3RvcmUgdm9jdG9yIG9mIEVmZmVjdERlc2MKKyAgICBjbGFzcyBFZmZlY3REZXNjVmVjdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVmZmVjdERlc2NWZWN0b3IoKSB7fQorICAgICAgICAvKnZpcnR1YWwqLyB+RWZmZWN0RGVzY1ZlY3RvcigpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUVmZmVjdHMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgbUVmZmVjdHNbal07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IG1FZmZlY3RzOworICAgIH07CisKKyAgICAvLyBjbGFzcyB0byBzdG9yZSB2b2N0b3Igb2YgQXVkaW9FZmZlY3RzCisgICAgY2xhc3MgRWZmZWN0VmVjdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVmZmVjdFZlY3RvcihpbnQgc2Vzc2lvbikgOiBtU2Vzc2lvbklkKHNlc3Npb24pLCBtUmVmQ291bnQoMCkge30KKyAgICAgICAgLyp2aXJ0dWFsKi8gfkVmZmVjdFZlY3RvcigpIHt9CisKKyAgICAgICAgLy8gRW5hYmxlIG9yIGRpc2FibGUgYWxsIGVmZmVjdHMgaW4gZWZmZWN0IHZlY3RvcgorICAgICAgICB2b2lkIHNldFByb2Nlc3NvckVuYWJsZWQoYm9vbCBlbmFibGVkKTsKKworICAgICAgICBjb25zdCBpbnQgbVNlc3Npb25JZDsKKyAgICAgICAgLy8gQXVkaW9Qb2xpY3lNYW5hZ2VyIGtlZXBzIG1Mb2NrLCBubyBuZWVkIGZvciBsb2NrIG9uIHJlZmVyZW5jZSBjb3VudCBoZXJlCisgICAgICAgIGludCBtUmVmQ291bnQ7CisgICAgICAgIFZlY3Rvcjwgc3A8QXVkaW9FZmZlY3Q+ID5tRWZmZWN0czsKKyAgICB9OworCisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtJbnB1dFNvdXJjZU5hbWVzW0FVRElPX1NPVVJDRV9DTlQgLTFdOworICAgIHN0YXRpYyBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZU5hbWVUb0VudW0oY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqa1N0cmVhbU5hbWVzW0FVRElPX1NUUkVBTV9DTlQrMV07IC8vKzEgcmVxdWlyZWQgYXMgc3RyZWFtcyBzdGFydCBmcm9tIC0xCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1OYW1lVG9FbnVtKGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgLy8gUGFyc2UgYXVkaW9fZWZmZWN0cy5jb25mCisgICAgc3RhdHVzX3QgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOworCisgICAgLy8gTG9hZCBhbGwgZWZmZWN0cyBkZXNjcmlwdG9ycyBpbiBjb25maWd1cmF0aW9uIGZpbGUKKyAgICBzdGF0dXNfdCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCwgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKKyAgICBFZmZlY3REZXNjICpsb2FkRWZmZWN0KGNub2RlICpyb290KTsKKworICAgIC8vIExvYWQgYWxsIGF1dG9tYXRpYyBlZmZlY3QgY29uZmlndXJhdGlvbnMKKyAgICBzdGF0dXNfdCBsb2FkSW5wdXRFZmZlY3RDb25maWd1cmF0aW9ucyhjbm9kZSAqcm9vdCwgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKKyAgICBzdGF0dXNfdCBsb2FkU3RyZWFtRWZmZWN0Q29uZmlndXJhdGlvbnMoY25vZGUgKnJvb3QsIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7CisgICAgRWZmZWN0RGVzY1ZlY3RvciAqbG9hZEVmZmVjdENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKKworICAgIC8vIExvYWQgYWxsIGF1dG9tYXRpYyBlZmZlY3QgcGFyYW1ldGVycworICAgIHZvaWQgbG9hZEVmZmVjdFBhcmFtZXRlcnMoY25vZGUgKnJvb3QsIFZlY3RvciA8ZWZmZWN0X3BhcmFtX3QgKj4mIHBhcmFtcyk7CisgICAgZWZmZWN0X3BhcmFtX3QgKmxvYWRFZmZlY3RQYXJhbWV0ZXIoY25vZGUgKnJvb3QpOworICAgIHNpemVfdCByZWFkUGFyYW1WYWx1ZShjbm9kZSAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqY3VyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKTsKKyAgICBzaXplX3QgZ3Jvd1BhcmFtU2l6ZShjaGFyICpwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKTsKKworICAgIC8vIHByb3RlY3RzIGFjY2VzcyB0byBtSW5wdXRTb3VyY2VzLCBtSW5wdXRzLCBtT3V0cHV0U3RyZWFtcywgbU91dHB1dFNlc3Npb25zCisgICAgTXV0ZXggbUxvY2s7CisgICAgLy8gQXV0b21hdGljIGlucHV0IGVmZmVjdHMgYXJlIGNvbmZpZ3VyZWQgcGVyIGF1ZGlvX3NvdXJjZV90CisgICAgS2V5ZWRWZWN0b3I8IGF1ZGlvX3NvdXJjZV90LCBFZmZlY3REZXNjVmVjdG9yKiA+IG1JbnB1dFNvdXJjZXM7CisgICAgLy8gQXV0b21hdGljIGlucHV0IGVmZmVjdHMgYXJlIHVuaXF1ZSBmb3IgYXVkaW9faW9faGFuZGxlX3QKKyAgICBLZXllZFZlY3RvcjwgYXVkaW9faW9faGFuZGxlX3QsIEVmZmVjdFZlY3RvciogPiBtSW5wdXRzOworCisgICAgLy8gQXV0b21hdGljIG91dHB1dCBlZmZlY3RzIGFyZSBvcmdhbml6ZWQgcGVyIGF1ZGlvX3N0cmVhbV90eXBlX3QKKyAgICBLZXllZFZlY3RvcjwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgRWZmZWN0RGVzY1ZlY3RvciogPiBtT3V0cHV0U3RyZWFtczsKKyAgICAvLyBBdXRvbWF0aWMgb3V0cHV0IGVmZmVjdHMgYXJlIHVuaXF1ZSBmb3IgYXVkaW9zZXNzaW9uIElECisgICAgS2V5ZWRWZWN0b3I8IGludDMyX3QsIEVmZmVjdFZlY3RvciogPiBtT3V0cHV0U2Vzc2lvbnM7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9BVURJT1BPTElDWUVGRkVDVFNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlN2JjMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitleHRlcm4gIkMiIEF1ZGlvUG9saWN5SW50ZXJmYWNlKiBjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIoCisgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCit7CisgICAgcmV0dXJuIG5ldyBBdWRpb1BvbGljeU1hbmFnZXIoY2xpZW50SW50ZXJmYWNlKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lJbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKyAgICBkZWxldGUgaW50ZXJmYWNlOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyNDQ2MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9QT0xJQ1lfSU5URVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT1BPTElDWV9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoZSBBdWRpb1BvbGljeUludGVyZmFjZSBhbmQgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgY2xhc3NlcyBkZWZpbmUgdGhlIGNvbW11bmljYXRpb24gaW50ZXJmYWNlcworLy8gYmV0d2VlbiB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgYW5kIEFuZHJvaWQgZ2VuZXJpYyBhdWRpbyBwb2xpY3kgbWFuYWdlci4KKy8vIFRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBtdXN0IGltcGxlbWVudCBtZXRob2RzIG9mIHRoZSBBdWRpb1BvbGljeUludGVyZmFjZSBjbGFzcy4KKy8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdXNlIG9mIHRoZSBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSB0byBjb250cm9sIHRoZSBhY3Rpdml0eSBhbmQKKy8vIGNvbmZpZ3VyYXRpb24gb2YgYXVkaW8gaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgorLy8KKy8vIFRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcyBpbiBjaGFyZ2Ugb2YgdGhlIGF1ZGlvIHJvdXRpbmcgYW5kIHZvbHVtZSBjb250cm9sCisvLyBwb2xpY2llcyBmb3IgYSBnaXZlbiBwbGF0Zm9ybS4KKy8vIFRoZSBtYWluIHJvbGVzIG9mIHRoaXMgbW9kdWxlIGFyZToKKy8vICAgLSBrZWVwIHRyYWNrIG9mIGN1cnJlbnQgc3lzdGVtIHN0YXRlIChyZW1vdmFibGUgZGV2aWNlIGNvbm5lY3Rpb25zLCBwaG9uZSBzdGF0ZSwgdXNlciByZXF1ZXN0cy4uLikuCisvLyAgIFN5c3RlbSBzdGF0ZSBjaGFuZ2VzIGFuZCB1c2VyIGFjdGlvbnMgYXJlIG5vdGlmaWVkIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHdpdGggbWV0aG9kcyBvZiB0aGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UuCisvLyAgIC0gcHJvY2VzcyBnZXRPdXRwdXQoKSBxdWVyaWVzIHJlY2VpdmVkIHdoZW4gQXVkaW9UcmFjayBvYmplY3RzIGFyZSBjcmVhdGVkOiBUaG9zZSBxdWVyaWVzCisvLyAgIHJldHVybiBhIGhhbmRsZXIgb24gYW4gb3V0cHV0IHRoYXQgaGFzIGJlZW4gc2VsZWN0ZWQsIGNvbmZpZ3VyZWQgYW5kIG9wZW5lZCBieSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgYW5kIHRoYXQKKy8vICAgbXVzdCBiZSB1c2VkIGJ5IHRoZSBBdWRpb1RyYWNrIHdoZW4gcmVnaXN0ZXJpbmcgdG8gdGhlIEF1ZGlvRmxpbmdlciB3aXRoIHRoZSBjcmVhdGVUcmFjaygpIG1ldGhvZC4KKy8vICAgV2hlbiB0aGUgQXVkaW9UcmFjayBvYmplY3QgaXMgcmVsZWFzZWQsIGEgcHV0T3V0cHV0KCkgcXVlcnkgaXMgcmVjZWl2ZWQgYW5kIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBjYW4gZGVjaWRlCisvLyAgIHRvIGNsb3NlIG9yIHJlY29uZmlndXJlIHRoZSBvdXRwdXQgZGVwZW5kaW5nIG9uIG90aGVyIHN0cmVhbXMgdXNpbmcgdGhpcyBvdXRwdXQgYW5kIGN1cnJlbnQgc3lzdGVtIHN0YXRlLgorLy8gICAtIHNpbWlsYXJseSBwcm9jZXNzIGdldElucHV0KCkgYW5kIHB1dElucHV0KCkgcXVlcmllcyByZWNlaXZlZCBmcm9tIEF1ZGlvUmVjb3JkIG9iamVjdHMgYW5kIGNvbmZpZ3VyZSBhdWRpbyBpbnB1dHMuCisvLyAgIC0gcHJvY2VzcyB2b2x1bWUgY29udHJvbCByZXF1ZXN0czogdGhlIHN0cmVhbSB2b2x1bWUgaXMgY29udmVydGVkIGZyb20gYW4gaW5kZXggdmFsdWUgKHJlY2VpdmVkIGZyb20gVUkpIHRvIGEgZmxvYXQgdmFsdWUKKy8vICAgYXBwbGljYWJsZSB0byBlYWNoIG91dHB1dCBhcyBhIGZ1bmN0aW9uIG9mIHBsYXRmb3JtIHNwZWNpZmljIHNldHRpbmdzIGFuZCBjdXJyZW50IG91dHB1dCByb3V0ZSAoZGVzdGluYXRpb24gZGV2aWNlKS4gSXQKKy8vICAgYWxzbyBtYWtlIHN1cmUgdGhhdCBzdHJlYW1zIGFyZSBub3QgbXV0ZWQgaWYgbm90IGFsbG93ZWQgKGUuZy4gY2FtZXJhIHNodXR0ZXIgc291bmQgaW4gc29tZSBjb3VudHJpZXMpLgorLy8KKy8vIFRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcyBwcm92aWRlZCBhcyBhIHNoYXJlZCBsaWJyYXJ5IGJ5IHBsYXRmb3JtIHZlbmRvcnMgKGFzIGZvciBsaWJhdWRpby5zbykKKy8vIGFuZCBpcyBsaW5rZWQgd2l0aCBsaWJhdWRpb2ZsaW5nZXIuc28KKworCisvLyAgICBBdWRpbyBQb2xpY3kgTWFuYWdlciBJbnRlcmZhY2UKK2NsYXNzIEF1ZGlvUG9saWN5SW50ZXJmYWNlCit7CisKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeUludGVyZmFjZSgpIHt9CisgICAgLy8KKyAgICAvLyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKSA9IDA7CisgICAgLy8gcmV0cmlldmUgYSBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKKyAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBwaG9uZSBzdGF0ZS4gVmFsaWQgcGhvbmVzIHN0YXRlcyBhcmUgZGVmaW5lZCBieSBhdWRpb19tb2RlX3QKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpID0gMDsKKyAgICAvLyBmb3JjZSB1c2luZyBhIHNwZWNpZmljIGRldmljZSBjYXRlZ29yeSBmb3IgdGhlIHNwZWNpZmllZCB1c2FnZQorICAgIHZpcnR1YWwgdm9pZCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSA9IDA7CisgICAgLy8gcmV0cmlldmUgY3VycmVudCBkZXZpY2UgY2F0ZWdvcnkgZm9yY2VkIGZvciBhIGdpdmVuIHVzYWdlCisgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgPSAwOworICAgIC8vIHNldCBhIHN5c3RlbSBwcm9wZXJ0eSAoZS5nLiBjYW1lcmEgc291bmQgYWx3YXlzIGF1ZGlibGUpCisgICAgdmlydHVhbCB2b2lkIHNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSkgPSAwOworICAgIC8vIGNoZWNrIHByb3BlciBpbml0aWFsaXphdGlvbgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgPSAwOworCisgICAgLy8KKyAgICAvLyBBdWRpbyByb3V0aW5nIHF1ZXJ5IGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyByZXF1ZXN0IGFuIG91dHB1dCBhcHByb3ByaWF0ZSBmb3IgcGxheWJhY2sgb2YgdGhlIHN1cHBsaWVkIHN0cmVhbSB0eXBlIGFuZCBwYXJhbWV0ZXJzCisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pID0gMDsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykgPSAwOworICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0YXJ0cyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKKyAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdG9wcyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKKyAgICAvLyByZWxlYXNlcyB0aGUgb3V0cHV0LgorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOworCisgICAgLy8gcmVxdWVzdCBhbiBpbnB1dCBhcHByb3ByaWF0ZSBmb3IgcmVjb3JkIGZyb20gdGhlIHN1cHBsaWVkIGRldmljZSB3aXRoIHN1cHBsaWVkIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKSA9IDA7CisgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgLy8gcmVsZWFzZXMgdGhlIGlucHV0LgorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworCisgICAgLy8KKyAgICAvLyB2b2x1bWUgY29udHJvbCBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gaW5pdGlhbGlzZXMgc3RyZWFtIHZvbHVtZSBjb252ZXJzaW9uIHBhcmFtZXRlcnMgYnkgc3BlY2lmeWluZyB2b2x1bWUgaW5kZXggcmFuZ2UuCisgICAgdmlydHVhbCB2b2lkIGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KSA9IDA7CisKKyAgICAvLyBzZXRzIHRoZSBuZXcgc3RyZWFtIHZvbHVtZSBhdCBhIGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1cHBsaWVkIGluZGV4IGZvciB0aGUKKyAgICAvLyBzdXBwbGllZCBkZXZpY2UuIEJ5IGNvbnZlbnRpb24sIHNwZWNpZnlpbmcgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUIG1lYW5zCisgICAgLy8gc2V0dGluZyB2b2x1bWUgZm9yIGFsbCBkZXZpY2VzCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKworICAgIC8vIHJldHJpZXZlIGN1cnJlbnQgdm9sdW1lIGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIHN0cmVhbSBhbmQgdGhlCisgICAgLy8gc3BlY2lmaWVkIGRldmljZS4gQnkgY29udmVudGlvbiwgc3BlY2lmeWluZyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQgbWVhbnMKKyAgICAvLyBxdWVyeWluZyB0aGUgdm9sdW1lIG9mIHRoZSBhY3RpdmUgZGV2aWNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworCisgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CisKKyAgICAvLyByZXR1cm4gdGhlIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZQorICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKKworICAgIC8vIEF1ZGlvIGVmZmVjdCBtYW5hZ2VtZW50CisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QgPSAwOworCisgICAgLy9kdW1wIHN0YXRlCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworfTsKKworCisvLyBBdWRpbyBQb2xpY3kgY2xpZW50IEludGVyZmFjZQorY2xhc3MgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSgpIHt9CisKKyAgICAvLworICAgIC8vIEF1ZGlvIEhXIG1vZHVsZSBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gbG9hZHMgYSBIVyBtb2R1bGUuCisgICAgdmlydHVhbCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpID0gMDsKKworICAgIC8vCisgICAgLy8gQXVkaW8gb3V0cHV0IENvbnRyb2wgZnVuY3Rpb25zCisgICAgLy8KKworICAgIC8vIG9wZW5zIGFuIGF1ZGlvIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycy4gVGhlIHBhcmFtZXRlciB2YWx1ZXMgY2FuIGluZGljYXRlIHRvIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMKKyAgICAvLyBpbiBjYXNlIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBoYXMgbm8gc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGZvciB0aGUgb3V0cHV0IGJlaW5nIG9wZW5lZC4KKyAgICAvLyBXaGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLCB0aGUgcGFyYW1ldGVyIHZhbHVlcyByZWZsZWN0IHRoZSBhY3R1YWwgdmFsdWVzIHVzZWQgYnkgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uCisgICAgLy8gVGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGNhbiBjaGVjayBpZiB0aGUgcHJvcG9zZWQgcGFyYW1ldGVycyBhcmUgc3VpdGFibGUgb3Igbm90IGFuZCBhY3QgYWNjb3JkaW5nbHkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpID0gMDsKKyAgICAvLyBjcmVhdGVzIGEgc3BlY2lhbCBvdXRwdXQgdGhhdCBpcyBkdXBsaWNhdGVkIHRvIHRoZSB0d28gb3V0cHV0cyBwYXNzZWQgYXMgYXJndW1lbnRzLiBUaGUgZHVwbGljYXRpb24gaXMgcGVyZm9ybWVkIGJ5CisgICAgLy8gYSBzcGVjaWFsIG1peGVyIHRocmVhZCBpbiB0aGUgQXVkaW9GbGluZ2VyLgorICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKSA9IDA7CisgICAgLy8gY2xvc2VzIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKKyAgICAvLyBzdXNwZW5kcyB0aGUgb3V0cHV0LiBXaGVuIGFuIG91dHB1dCBpcyBzdXNwZW5kZWQsIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0gaXMgcGxhY2VkIGluCisgICAgLy8gc3RhbmRieSBhbmQgdGhlIEF1ZGlvVHJhY2tzIGF0dGFjaGVkIHRvIHRoZSBtaXhlciB0aHJlYWQgYXJlIHN0aWxsIHByb2Nlc3NlZCBidXQgdGhlIG91dHB1dCBtaXggaXMgZGlzY2FyZGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKKyAgICAvLyByZXN0b3JlcyBhIHN1c3BlbmRlZCBvdXRwdXQuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN0b3JlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOworCisgICAgLy8KKyAgICAvLyBBdWRpbyBpbnB1dCBDb250cm9sIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyBvcGVucyBhbiBhdWRpbyBpbnB1dAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykgPSAwOworICAgIC8vIGNsb3NlcyBhbiBhdWRpbyBpbnB1dAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOworICAgIC8vCisgICAgLy8gbWlzYyBjb250cm9sIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyBzZXQgYSBzdHJlYW0gdm9sdW1lIGZvciBhIHBhcnRpY3VsYXIgb3V0cHV0LiBGb3IgdGhlIHNhbWUgdXNlciBzZXR0aW5nLCBhIGdpdmVuIHN0cmVhbSB0eXBlIGNhbiBoYXZlIGRpZmZlcmVudCB2b2x1bWVzCisgICAgLy8gZm9yIGVhY2ggb3V0cHV0IChkZXN0aW5hdGlvbiBkZXZpY2UpIGl0IGlzIGF0dGFjaGVkIHRvLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKSA9IDA7CisKKyAgICAvLyBpbnZhbGlkYXRlIGEgc3RyZWFtIHR5cGUsIGNhdXNpbmcgYSByZXJvdXRlIHRvIGFuIHVuc3BlY2lmaWVkIG5ldyBvdXRwdXQKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKKworICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHNlbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gcG9saWN5IG1hbmFnZXIgdG8gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlLgorICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApID0gMDsKKyAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byByZWNlaXZlIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSB0byBhdWRpbyBwb2xpY3kgbWFuYWdlci4KKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOworCisgICAgLy8gcmVxdWVzdCB0aGUgcGxheWJhY2sgb2YgYSB0b25lIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtOiB1c2VkIGZvciBpbnN0YW5jZSB0byByZXBsYWNlIG5vdGlmaWNhdGlvbiBzb3VuZHMgd2hlbiBwbGF5aW5nCisgICAgLy8gb3ZlciBhIHRlbGVwaG9ueSBkZXZpY2UgZHVyaW5nIGEgcGhvbmUgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpID0gMDsKKworICAgIC8vIHNldCBkb3duIGxpbmsgYXVkaW8gdm9sdW1lLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApID0gMDsKKworICAgIC8vIG1vdmUgZWZmZWN0IHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0CisgICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KSA9IDA7CisKKyAgICAvKiBDcmVhdGUgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpID0gMDsKKworICAgIC8qIFJlbGVhc2UgYSBwYXRjaCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpID0gMDsKKworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywgaW50IGRlbGF5TXMpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpID0gMDsKKworICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZCgpID0gMDsKK307CisKK2V4dGVybiAiQyIgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKK2V4dGVybiAiQyIgdm9pZCBkZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5SW50ZXJmYWNlICppbnRlcmZhY2UpOworCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPUE9MSUNZX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjM5YzZkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApAQCAtMCwwICsxLDYwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lJbnRlZmFjZUltcGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYKKyAgICAgICAgICAgIHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKK30KKworYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0YXRlKSA+PSBBVURJT19NT0RFX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkiKTsKKworICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8gZG8gaXQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgcG9saWN5IG1hbmFnZXIKKyAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShzdGF0ZSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFBob25lU3RhdGUoc3RhdGUpOworICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19tb2RlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRQaG9uZVN0YXRlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtUGhvbmVTdGF0ZTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChjb25maWcgPCAwIHx8IGNvbmZpZyA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfQ0ZHX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigic2V0Rm9yY2VVc2UoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9OT05FOworICAgIH0KKyAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldEZvcmNlVXNlKHVzYWdlKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgQUxPR1YoImdldE91dHB1dCgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0KHN0cmVhbSwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQUxPR1YoImdldE91dHB1dCgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkiKTsKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBzdHJlYW0KKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBTE9HVigic3RvcE91dHB1dCgpIik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigiZG9TdG9wT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKKyAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIHN0cmVhbQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSIpOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWxlYXNlT3V0cHV0Q29tbWFuZChvdXRwdXQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBBTE9HVigiZG9SZWxlYXNlT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZU91dHB1dChvdXRwdXQpOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBhbHJlYWR5IGNoZWNrZWQgYnkgY2xpZW50LCBidXQgZG91YmxlLWNoZWNrIGluIGNhc2UgdGhlIGNsaWVudCB3cmFwcGVyIGlzIGJ5cGFzc2VkCisgICAgaWYgKGlucHV0U291cmNlID49IEFVRElPX1NPVVJDRV9DTlQgJiYgaW5wdXRTb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dDsKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgLy8gdGhlIGF1ZGlvX2luX2Fjb3VzdGljc190IHBhcmFtZXRlciBpcyBpZ25vcmVkIGJ5IGdldF9pbnB1dCgpCisgICAgICAgIGlucHV0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0SW5wdXQoaW5wdXRTb3VyY2UsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zZXNzaW9uX3QpYXVkaW9TZXNzaW9uLCBmbGFncyk7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChpbnB1dCA9PSAwKSB7CisgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBwcmUgcHJvY2Vzc29ycyBhY2NvcmRpbmcgdG8gaW5wdXQgc291cmNlCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkSW5wdXRFZmZlY3RzKGlucHV0LCBpbnB1dFNvdXJjZSwgYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGlucHV0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydElucHV0KGlucHV0LCBzZXNzaW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BJbnB1dChpbnB1dCwgc2Vzc2lvbik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KGlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBpbnB1dAorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VJbnB1dEVmZmVjdHMoaW5wdXQpOworICAgICAgICBpZihzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+aW5pdFN0cmVhbVZvbHVtZShzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKK30KKworLy9hdWRpbyBwb2xpY3k6IHVzZSBhdWRpb19kZXZpY2VfdCBhcHByb3ByaWF0ZWx5CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0pOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQoreworICAgIC8vIEZJWE1FIGNoYW5nZSByZXR1cm4gdHlwZSB0byBzdGF0dXNfdCwgYW5kIHJldHVybiBOT19JTklUIGhlcmUKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JFZmZlY3QoZGVzYyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWdpc3RlckVmZmVjdChkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+dW5yZWdpc3RlckVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTdHJlYW1BY3RpdmVSZW1vdGVseShzdHJlYW0sIGluUGFzdE1zKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTb3VyY2VBY3RpdmUoc291cmNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzID09IDApIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPnF1ZXJ5RGVmYXVsdElucHV0RWZmZWN0cyhhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigibUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cyhyb2xlLCB0eXBlLCBudW1fcG9ydHMsIHBvcnRzLCBnZW5lcmF0aW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0QXVkaW9Qb3J0KHBvcnQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzLCBnZW5lcmF0aW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oc2Vzc2lvbiwgaW9IYW5kbGUsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oc2Vzc2lvbik7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I2YTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcApAQCAtMCwwICsxLDU3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lTZXJ2aWNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYKKyAgICAgICAgICAgIHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKK30KKworYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIH0KKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X2RldmljZV9jb25uZWN0aW9uX3N0YXRlKG1wQXVkaW9Qb2xpY3ksIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0YXRlKSA+PSBBVURJT19NT0RFX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkiKTsKKworICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8gZG8gaXQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgcG9saWN5IG1hbmFnZXIKKyAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShzdGF0ZSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1wQXVkaW9Qb2xpY3ktPnNldF9waG9uZV9zdGF0ZShtcEF1ZGlvUG9saWN5LCBzdGF0ZSk7CisgICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX21vZGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFBob25lU3RhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1QaG9uZVN0YXRlOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICh1c2FnZSA8IDAgfHwgdXNhZ2UgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKGNvbmZpZyA8IDAgfHwgY29uZmlnID49IEFVRElPX1BPTElDWV9GT1JDRV9DRkdfQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtcEF1ZGlvUG9saWN5LT5zZXRfZm9yY2VfdXNlKG1wQXVkaW9Qb2xpY3ksIHVzYWdlLCBjb25maWcpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICB9CisgICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZm9yY2VfdXNlKG1wQXVkaW9Qb2xpY3ksIHVzYWdlKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgQUxPR1YoImdldE91dHB1dCgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X291dHB1dChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBTE9HVigic3RhcnRPdXRwdXQoKSIpOworICAgIC8vIGNyZWF0ZSBhdWRpbyBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBzdHJlYW0KKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhZGQgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdGFydF9vdXRwdXQobXBBdWRpb1BvbGljeSwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUxPR1YoInN0b3BPdXRwdXQoKSIpOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5zdG9wT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgQUxPR1YoImRvU3RvcE91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICAvLyByZWxlYXNlIGF1ZGlvIHByb2Nlc3NvcnMgZnJvbSB0aGUgc3RyZWFtCisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RvcF9vdXRwdXQobXBBdWRpb1BvbGljeSwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkiKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVsZWFzZU91dHB1dENvbW1hbmQob3V0cHV0KTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgQUxPR1YoImRvUmVsZWFzZU91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1wQXVkaW9Qb2xpY3ktPnJlbGVhc2Vfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzIF9fdW51c2VkKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIGFscmVhZHkgY2hlY2tlZCBieSBjbGllbnQsIGJ1dCBkb3VibGUtY2hlY2sgaW4gY2FzZSB0aGUgY2xpZW50IHdyYXBwZXIgaXMgYnlwYXNzZWQKKyAgICBpZiAoaW5wdXRTb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCAmJiBpbnB1dFNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQ7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQorICAgICAgICBpbnB1dCA9IG1wQXVkaW9Qb2xpY3ktPmdldF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgKGF1ZGlvX2luX2Fjb3VzdGljc190KSAwKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGlucHV0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIGlucHV0OworICAgIH0KKworICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgeworICAgICAgICAvLyBjcmVhdGUgYXVkaW8gcHJlIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIGlucHV0IHNvdXJjZQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZElucHV0RWZmZWN0cyhpbnB1dCwgaW5wdXRTb3VyY2UsIGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnB1dDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uIF9fdW51c2VkKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RhcnRfaW5wdXQobXBBdWRpb1BvbGljeSwgaW5wdXQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uIF9fdW51c2VkKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RvcF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uIF9fdW51c2VkKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtcEF1ZGlvUG9saWN5LT5yZWxlYXNlX2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBpbnB1dAorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VJbnB1dEVmZmVjdHMoaW5wdXQpOworICAgICAgICBpZihzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbXBBdWRpb1BvbGljeS0+aW5pdF9zdHJlYW1fdm9sdW1lKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKSB7CisgICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKG1wQXVkaW9Qb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXgpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UpIHsKKyAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UobXBBdWRpb1BvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXgobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleCk7CisgICAgfQorfQorCit1aW50MzJfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyYXRlZ3lfZm9yX3N0cmVhbShtcEF1ZGlvUG9saWN5LCBzdHJlYW0pOworfQorCisvL2F1ZGlvIHBvbGljeTogdXNlIGF1ZGlvX2RldmljZV90IGFwcHJvcHJpYXRlbHkKKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB9CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZGV2aWNlc19mb3Jfc3RyZWFtKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisgICAgLy8gRklYTUUgY2hhbmdlIHJldHVybiB0eXBlIHRvIHN0YXR1c190LCBhbmQgcmV0dXJuIE5PX0lOSVQgaGVyZQorICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9vdXRwdXRfZm9yX2VmZmVjdChtcEF1ZGlvUG9saWN5LCBkZXNjKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnJlZ2lzdGVyX2VmZmVjdChtcEF1ZGlvUG9saWN5LCBkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+dW5yZWdpc3Rlcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9lZmZlY3RfZW5hYmxlZChtcEF1ZGlvUG9saWN5LCBpZCwgZW5hYmxlZCk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19zdHJlYW1fYWN0aXZlKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5QYXN0TXMpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19zdHJlYW1fYWN0aXZlX3JlbW90ZWx5KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5QYXN0TXMpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobXBBdWRpb1BvbGljeS0+aXNfc291cmNlX2FjdGl2ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfc291cmNlX2FjdGl2ZShtcEF1ZGlvUG9saWN5LCBzb3VyY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICAqY291bnQgPSAwOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgPT0gMCkgeworICAgICAgICAqY291bnQgPSAwOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cXVlcnlEZWZhdWx0SW5wdXRFZmZlY3RzKGF1ZGlvU2Vzc2lvbiwgZGVzY3JpcHRvcnMsIGNvdW50KTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJtcEF1ZGlvUG9saWN5ID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtcEF1ZGlvUG9saWN5LT5pc19vZmZsb2FkX3N1cHBvcnRlZCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJIQUwgZG9lcyBub3QgaW1wbGVtZW50IGlzX29mZmxvYWRfc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfb2ZmbG9hZF9zdXBwb3J0ZWQobXBBdWRpb1BvbGljeSwgJmluZm8pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbiBfX3VudXNlZCkKK3sKKyAgICAqbnVtX3BvcnRzID0gMDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0IF9fdW51c2VkKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2ggX191bnVzZWQsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUgX191bnVzZWQpCit7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMgX191bnVzZWQsCisgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbiBfX3VudXNlZCkKK3sKKyAgICAqbnVtX3BhdGNoZXMgPSAwOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcgX191bnVzZWQpCit7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoYXR0cik7CisKKyAgICByZXR1cm4gZ2V0T3V0cHV0KHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzY5ODdhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDcyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5TWFuYWdlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworLy8jZGVmaW5lIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjaWZkZWYgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworLy8gQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGRldmljZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAidmlydHVhbCIgd2hlbiBldmFsdWF0aW5nCisvLyBhY3RpdmUgaW5wdXRzIGluIGdldEFjdGl2ZUlucHV0KCkKKyNkZWZpbmUgQVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCAgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgKKy8vIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBvdXRwdXQgZGV2aWNlcyB0aGF0IGFyZSBjb25zaWRlcmVkICJyZW1vdGUiIHdoZW4gZXZhbHVhdGluZworLy8gYWN0aXZlIG91dHB1dCBkZXZpY2VzIGluIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoKQorI2RlZmluZSBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKKy8vIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBpbnB1dCBhbmQgb3V0cHV0IGRldmljZXMgd2hlcmUgbWF0Y2hpbmcgaW5wdXRzL291dHB1dHMgb24gZGV2aWNlCisvLyB0eXBlIGFsb25lIGlzIG5vdCBlbm91Z2g6IHRoZSBhZGRyZXNzIG11c3QgbWF0Y2ggdG9vCisjZGVmaW5lIEFQTV9BVURJT19ERVZJQ0VfTUFUQ0hfQUREUkVTU19BTEwgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKKyNpbmNsdWRlICJhdWRpb19wb2xpY3lfY29uZi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmluaXRpb25zIGZvciBhdWRpb19wb2xpY3kuY29uZiBmaWxlIHBhcnNpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IFN0cmluZ1RvRW51bSB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICB1aW50MzJfdCB2YWx1ZTsKK307CisKKyNkZWZpbmUgU1RSSU5HX1RPX0VOVU0oc3RyaW5nKSB7ICNzdHJpbmcsIHN0cmluZyB9CisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZigoYSlbMF0pKQorCitjb25zdCBTdHJpbmdUb0VudW0gc0RldmljZU5hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQUxMX1NDTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUwpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfSERNSSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0UpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9MSU5FKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRElGKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0ZNKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQU1CSUVOVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQUxMX1NDTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BVVhfRElHSVRBTCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0hETUkpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQU5MR19ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9ER1RMX0RPQ0tfSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9BQ0NFU1NPUlkpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9UVl9UVU5FUiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0xJTkUpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9TUERJRiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fTE9PUEJBQ0spLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNPdXRwdXRGbGFnTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19GQVNUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzSW5wdXRGbGFnTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fSU5QVVRfRkxBR19GQVNUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19JTlBVVF9GTEFHX0hXX0hPVFdPUkQpLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNGb3JtYXROYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzE2X0JJVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV84X0JJVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV8zMl9CSVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX01QMyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19NQUlOKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0xDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX1NTUiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MVFApLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfSEVfVjEpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfU0NBTEFCTEUpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfRVJMQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MRCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19IRV9WMiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19FTEQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9WT1JCSVMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9IRV9BQUNfVjEpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9IRV9BQUNfVjIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9PUFVTKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUMzKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfRV9BQzMpLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUX01PTk8pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOX01PTk8pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0spLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNHYWluTW9kZU5hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0dBSU5fTU9ERV9KT0lOVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19HQUlOX01PREVfUkFNUCksCit9OworCisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RyaW5nVG9FbnVtKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcCh0YWJsZVtpXS5uYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigic3RyaW5nVG9FbnVtKCkgZm91bmQgJXMiLCB0YWJsZVtpXS5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiB0YWJsZVtpXS52YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworY29uc3QgY2hhciAqQXVkaW9Qb2xpY3lNYW5hZ2VyOjplbnVtVG9TdHJpbmcoY29uc3Qgc3RydWN0IFN0cmluZ1RvRW51bSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKHRhYmxlW2ldLnZhbHVlID09IHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdGFibGVbaV0ubmFtZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gIiI7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJpbmdUb0Jvb2woY29uc3QgY2hhciAqdmFsdWUpCit7CisgICAgcmV0dXJuICgoc3RyY2FzZWNtcCgidHJ1ZSIsIHZhbHVlKSA9PSAwKSB8fCAoc3RyY21wKCIxIiwgdmFsdWUpID09IDApKTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpb1BvbGljeUludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3sKKyAgICBTdHJpbmc4IGFkZHJlc3MgPSAoZGV2aWNlX2FkZHJlc3MgPT0gTlVMTCkgPyBTdHJpbmc4KCIiKSA6IFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpOworCisgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZTogJXgsIHN0YXRlICVkLCBhZGRyZXNzICVzIiwKKyAgICAgICAgICAgIGRldmljZSwgc3RhdGUsIGFkZHJlc3Muc3RyaW5nKCkpOworCisgICAgLy8gY29ubmVjdC9kaXNjb25uZWN0IG9ubHkgMSBkZXZpY2UgYXQgYSB0aW1lCisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2VzCisgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICBTb3J0ZWRWZWN0b3IgPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOworCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgZGV2aWNlKTsKKyAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKKworICAgICAgICAvLyBzYXZlIGEgY29weSBvZiB0aGUgb3BlbmVkIG91dHB1dCBkZXNjcmlwdG9ycyBiZWZvcmUgYW55IG91dHB1dCBpcyBvcGVuZWQgb3IgY2xvc2VkCisgICAgICAgIC8vIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpLiBUaGlzIHdpbGwgYmUgbmVlZGVkIGJ5IGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCisgICAgICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU6CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY29ubmVjdGluZyBkZXZpY2UgJXgiLCBkZXZpY2UpOworCisgICAgICAgICAgICAvLyByZWdpc3RlciBuZXcgZGV2aWNlIGFzIGF2YWlsYWJsZQorICAgICAgICAgICAgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBnZXRNb2R1bGVGb3JEZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBpZiAobW9kdWxlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1Nb2R1bGUgPSBtb2R1bGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG91dHB1dHMgc2hvdWxkIG5ldmVyIGJlIGVtcHR5IGhlcmUKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKG91dHB1dHMuc2l6ZSgpICE9IDAsICJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKToiCisgICAgICAgICAgICAgICAgICAgICJjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCBubyBvdXRwdXRzIGJ1dCBzdGF0dXMgT0siKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCAlenUgb3V0cHV0cyIsCisgICAgICAgICAgICAgICAgICBvdXRwdXRzLnNpemUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2UgZGlzY29ubmVjdGlvbgorICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU6IHsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkaXNjb25uZWN0aW5nIG91dHB1dCBkZXZpY2UgJXgiLCBkZXZpY2UpOworCisgICAgICAgICAgICAvLyBTZXQgRGlzY29ubmVjdCB0byBIQUxzCisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGFkZHJlc3MpOworICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX0RFVklDRV9ESVNDT05ORUNUKSwgZGV2aWNlKTsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBwYXJhbS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgLy8gcmVtb3ZlIGRldmljZSBmcm9tIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworCisgICAgICAgICAgICBjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGFkZHJlc3MpOworICAgICAgICAgICAgfSBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgc3RhdGU6ICV4Iiwgc3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrQTJkcFN1c3BlbmQgbXVzdCBydW4gYmVmb3JlIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyBzbyB0aGF0IEEyRFAKKyAgICAgICAgLy8gb3V0cHV0IGlzIHN1c3BlbmRlZCBiZWZvcmUgYW55IHRyYWNrcyBhcmUgbW92ZWQgdG8gaXQKKyAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgICAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKyAgICAgICAgLy8gb3V0cHV0cyBtdXN0IGJlIGNsb3NlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKSBpcyBleGVjdXRlZAorICAgICAgICBpZiAoIW91dHB1dHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKKyAgICAgICAgICAgICAgICAvLyBjbG9zZSB1bnVzZWQgb3V0cHV0cyBhZnRlciBkZXZpY2UgZGlzY29ubmVjdGlvbiBvciBkaXJlY3Qgb3V0cHV0cyB0aGF0IGhhdmUgYmVlbgorICAgICAgICAgICAgICAgIC8vIG9wZW5lZCBieSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSB0byBxdWVyeSBkeW5hbWljIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICBpZiAoKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dHNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluIGFmdGVyIGNsb3NpbmcgQTJEUCBvdXRwdXQgdG8gcmVzZXQgbUEyZHBTdXNwZW5kZWQgaWYgbmVlZGVkCisgICAgICAgICAgICBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgICAgIH0KKworICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgICAgICBpZiAobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgICAgICBpZiAoKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKG91dHB1dCAhPSBtUHJpbWFyeU91dHB1dCkpIHsKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1PdXRwdXRzLmtleUF0KGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgICAgICAvLyBkbyBub3QgZm9yY2UgZGV2aWNlIGNoYW5nZSBvbiBkdXBsaWNhdGVkIG91dHB1dCBiZWNhdXNlIGlmIGRldmljZSBpcyAwLCBpdCB3aWxsCisgICAgICAgICAgICAgICAgLy8gYWxzbyBmb3JjZSBhIGRldmljZSAwIGZvciB0aGUgdHdvIG91dHB1dHMgaXQgaXMgZHVwbGljYXRlZCB0byB3aGljaCBtYXkgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAvLyBhIHZhbGlkIGRldmljZSBzZWxlY3Rpb24gb24gdGhvc2Ugb3V0cHV0cy4KKyAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gIW1PdXRwdXRzLnZhbHVlQXQoaSktPmlzRHVwbGljYXRlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgZm9yY2Ugd2hlbiBkaXNjb25uZWN0aW5nIChhIG5vbi1kdXBsaWNhdGVkIGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpKTsKKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBuZXdEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gIC8vIGVuZCBpZiBpcyBvdXRwdXQgZGV2aWNlCisKKyAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlcworICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICBTb3J0ZWRWZWN0b3IgPGF1ZGlvX2lvX2hhbmRsZV90PiBpbnB1dHM7CisKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBkZXZpY2UpOworICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU6IHsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBnZXRNb2R1bGVGb3JEZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKTogY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hlY2tJbnB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgaW5wdXRzLCBhZGRyZXNzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZXZEZXNjKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tTW9kdWxlID0gbW9kdWxlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2UgZGlzY29ubmVjdGlvbgorICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU6IHsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICVkIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkaXNjb25uZWN0aW5nIGlucHV0IGRldmljZSAleCIsIGRldmljZSk7CisKKyAgICAgICAgICAgIC8vIFNldCBEaXNjb25uZWN0IHRvIEhBTHMKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoYWRkcmVzcyk7CisgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0RJU0NPTk5FQ1QpLCBkZXZpY2UpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBjaGVja0lucHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBpbnB1dHMsIGFkZHJlc3MpOworICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgc3RhdGU6ICV4Iiwgc3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGNsb3NlQWxsSW5wdXRzKCk7CisKKyAgICAgICAgaWYgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOworICAgICAgICB9CisKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSAvLyBlbmQgaWYgaXMgaW5wdXQgZGV2aWNlCisKKyAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2U6ICV4IiwgZGV2aWNlKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCithdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlID0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIGRldmljZSk7CisgICAgZGV2RGVzYy0+bUFkZHJlc3MgPSAoZGV2aWNlX2FkZHJlc3MgPT0gTlVMTCkgPyBTdHJpbmc4KCIiKSA6IFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpOworICAgIHNzaXplX3QgaW5kZXg7CisgICAgRGV2aWNlVmVjdG9yICpkZXZpY2VWZWN0b3I7CisKKyAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIGRldmljZVZlY3RvciA9ICZtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsKKyAgICB9IGVsc2UgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIGRldmljZVZlY3RvciA9ICZtQXZhaWxhYmxlSW5wdXREZXZpY2VzOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIGRldmljZSB0eXBlICUwOHgiLCBkZXZpY2UpOworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICB9CisKKyAgICBpbmRleCA9IGRldmljZVZlY3Rvci0+aW5kZXhPZihkZXZEZXNjKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQ2FsbFJvdXRpbmcoYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlLCBpbnQgZGVsYXlNcykKK3sKKyAgICBib29sIGNyZWF0ZVR4UGF0Y2ggPSBmYWxzZTsKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGU7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3Q7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgdHhEZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7CisgICAgQUxPR1YoInVwZGF0ZUNhbGxSb3V0aW5nIGRldmljZSByeERldmljZSAlMDh4IHR4RGV2aWNlICUwOHgiLCByeERldmljZSwgdHhEZXZpY2UpOworCisgICAgLy8gcmVsZWFzZSBleGlzdGluZyBSWCBwYXRjaCBpZiBhbnkKKyAgICBpZiAobUNhbGxSeFBhdGNoICE9IDApIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBtQ2FsbFJ4UGF0Y2guY2xlYXIoKTsKKyAgICB9CisgICAgLy8gcmVsZWFzZSBUWCBwYXRjaCBpZiBhbnkKKyAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsVHhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgUlggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgdGhlbiB1c2UgbGVnYWN5IHJvdXRpbmcgbWV0aG9kIGZvciB2b2ljZSBjYWxscworICAgIC8vIHZpYSBzZXRPdXRwdXREZXZpY2UoKSBvbiBwcmltYXJ5IG91dHB1dC4KKyAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSB0d28gYXVkaW8gcGF0Y2hlcyBmb3IgVFggYW5kIFJYIHBhdGguCisgICAgaWYgKGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkgJiByeERldmljZSkgeworICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCB0cnVlLCBkZWxheU1zKTsKKyAgICAgICAgLy8gSWYgdGhlIFRYIGRldmljZSBpcyBhbHNvIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgc2V0T3V0cHV0RGV2aWNlKCkgd2lsbCB0YWtlIGNhcmUKKyAgICAgICAgLy8gb2YgaXQgZHVlIHRvIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbi4gSWYgbm90LCBjcmVhdGUgYSBwYXRjaC4KKyAgICAgICAgaWYgKChhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB0eERldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKQorICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBjcmVhdGVUeFBhdGNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGNyZWF0ZSBSWCBwYXRoIGF1ZGlvIHBhdGNoCisgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocnhEZXZpY2UpOworICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIHNlbGVjdGVkIGRldmljZSBub3QgaW4gb3V0cHV0IGRldmljZSBsaXN0Iik7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJ4U2lua0RldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpOworICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHRlbGVwaG9ueSBSWCBkZXZpY2UiKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcnhTb3VyY2VEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisKKyAgICAgICAgcnhTb3VyY2VEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7CisgICAgICAgIHJ4U2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7CisKKyAgICAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgUlggZGV2aWNlCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2UocnhEZXZpY2UsIG1PdXRwdXRzKTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgUlggZGV2aWNlIG91dHB1dCBpcyBkdXBsaWNhdGVkIik7CisgICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1sxXSk7CisgICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDI7CisgICAgICAgIH0KKworICAgICAgICBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsICJ1cGRhdGVDYWxsUm91dGluZygpIGVycm9yICVkIGNyZWF0aW5nIFJYIGF1ZGlvIHBhdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbUNhbGxSeFBhdGNoID0gbmV3IEF1ZGlvUGF0Y2goKGF1ZGlvX3BhdGNoX2hhbmRsZV90KW5leHRVbmlxdWVJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgIG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgbUNhbGxSeFBhdGNoLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICAgICAgfQorICAgICAgICBjcmVhdGVUeFBhdGNoID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGNyZWF0ZVR4UGF0Y2gpIHsKKworICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7CisgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHR4RGV2aWNlKTsKKyAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBzZWxlY3RlZCBkZXZpY2Ugbm90IGluIGlucHV0IGRldmljZSBsaXN0Iik7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U291cmNlRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOworICAgICAgICB0eFNvdXJjZURldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCk7CisgICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgbm8gdGVsZXBob255IFRYIGRldmljZSIpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiB0eFNpbmtEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgICAgIHR4U2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7CisKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgbU91dHB1dHMpOworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgICAgIC8vIHJlcXVlc3QgdG8gcmV1c2UgZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbSBpZiBvbmUgaXMgYWxyZWFkeSBvcGVuZWQgdG8gcmVhY2ggdGhlIFRYCisgICAgICAgIC8vIHBhdGggb3V0cHV0IGRldmljZQorICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgUlggZGV2aWNlIG91dHB1dCBpcyBkdXBsaWNhdGVkIik7CisgICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1sxXSk7CisgICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDI7CisgICAgICAgIH0KKworICAgICAgICBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsICJzZXRQaG9uZVN0YXRlKCkgZXJyb3IgJWQgY3JlYXRpbmcgVFggYXVkaW8gcGF0Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtQ2FsbFR4UGF0Y2ggPSBuZXcgQXVkaW9QYXRjaCgoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpbmV4dFVuaXF1ZUlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgbUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICBtQ2FsbFR4UGF0Y2gtPm1VaWQgPSBtVWlkQ2FjaGVkOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCit7CisgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBzdGF0ZSAlZCIsIHN0YXRlKTsKKyAgICBpZiAoc3RhdGUgPCAwIHx8IHN0YXRlID49IEFVRElPX01PREVfQ05UKSB7CisgICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgaW52YWxpZCBzdGF0ZSAlZCIsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBtUGhvbmVTdGF0ZSApIHsKKyAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBzZXR0aW5nIHNhbWUgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBpZiBsZWF2aW5nIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKKyAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKKyAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOworICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgZmFsc2UsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gc3RvcmUgcHJldmlvdXMgcGhvbmUgc3RhdGUgZm9yIG1hbmFnZW1lbnQgb2Ygc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGJlbG93CisgICAgaW50IG9sZFN0YXRlID0gbVBob25lU3RhdGU7CisgICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKKyAgICBib29sIGZvcmNlID0gZmFsc2U7CisKKyAgICAvLyBhcmUgd2UgZW50ZXJpbmcgb3Igc3RhcnRpbmcgYSBjYWxsCisgICAgaWYgKCFpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiBpc1N0YXRlSW5DYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBFbnRlcmluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBzdGFydGluZyBhIGNhbGwKKyAgICAgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAorICAgICAgICBmb3JjZSA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgREVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7CisgICAgICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fRFRNRl0ubVZvbHVtZUN1cnZlW2pdID0KKyAgICAgICAgICAgICAgICAgICAgc1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9WT0lDRV9DQUxMXVtqXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgIWlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCIgIEV4aXRpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKKyAgICAgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gZXhpdGluZyBhIGNhbGwKKyAgICAgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAorICAgICAgICBmb3JjZSA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgREVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7CisgICAgICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fRFRNRl0ubVZvbHVtZUN1cnZlW2pdID0KKyAgICAgICAgICAgICAgICAgICAgc1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9EVE1GXVtqXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkgJiYgKHN0YXRlICE9IG9sZFN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBTd2l0Y2hpbmcgYmV0d2VlbiB0ZWxlcGhvbnkgYW5kIFZvSVAgaW4gc2V0UGhvbmVTdGF0ZSgpIik7CisgICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIHRlbGVwaG9ueSBhbmQgVm9JUAorICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCisgICAgICAgIGZvcmNlID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCisgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKKworICAgIGludCBkZWxheU1zID0gMDsKKyAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKKyAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgLy8gbXV0ZSBtZWRpYSBhbmQgc29uaWZpY2F0aW9uIHN0cmF0ZWdpZXMgYW5kIGRlbGF5IGRldmljZSBzd2l0Y2ggYnkgdGhlIGxhcmdlc3QKKyAgICAgICAgICAgIC8vIGxhdGVuY3kgb2YgYW55IG91dHB1dCB3aGVyZSBlaXRoZXIgc3RyYXRlZ3kgaXMgYWN0aXZlLgorICAgICAgICAgICAgLy8gVGhpcyBhdm9pZCBzZW5kaW5nIHRoZSByaW5nIHRvbmUgb3IgbXVzaWMgdGFpbCBpbnRvIHRoZSBlYXJwaWVjZSBvciBoZWFkc2V0LgorICAgICAgICAgICAgaWYgKChkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX01FRElBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpIHx8CisgICAgICAgICAgICAgICAgICAgIGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkpICYmCisgICAgICAgICAgICAgICAgICAgIChkZWxheU1zIDwgKGludClkZXNjLT5tTGF0ZW5jeSoyKSkgeworICAgICAgICAgICAgICAgIGRlbGF5TXMgPSBkZXNjLT5tTGF0ZW5jeSoyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCB0cnVlLCBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfTUVESUEsIGZhbHNlLCBtT3V0cHV0cy5rZXlBdChpKSwgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCB0cnVlIC8qZnJvbUNhY2hlKi8pKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUsIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlLCBtT3V0cHV0cy5rZXlBdChpKSwgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOb3RlIHRoYXQgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IGdldE5ld091dHB1dERldmljZSgpIGlzIGNhbGxlZCBvbiB0aGUgcHJpbWFyeSBvdXRwdXQsCisgICAgLy8gdGhlIGRldmljZSByZXR1cm5lZCBpcyBub3QgbmVjZXNzYXJpbHkgcmVhY2hhYmxlIHZpYSB0aGlzIG91dHB1dAorICAgIGF1ZGlvX2RldmljZXNfdCByeERldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gZW5kaW5nIGNhbGwKKyAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCisgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIHJ4RGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIHJ4RGV2aWNlID0gaHdPdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKHJ4RGV2aWNlLCBkZWxheU1zKTsKKyAgICB9IGVsc2UgaWYgKG9sZFN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICBpZiAobUNhbGxSeFBhdGNoICE9IDApIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFJ4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIG1DYWxsUnhQYXRjaC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsVHhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCByeERldmljZSwgZm9yY2UsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICB9CisgICAgLy8gaWYgZW50ZXJpbmcgaW4gY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcworICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQorICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOworICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGbGFnIHRoYXQgcmluZ3RvbmUgdm9sdW1lIG11c3QgYmUgbGltaXRlZCB0byBtdXNpYyB2b2x1bWUgdW50aWwgd2UgZXhpdCBNT0RFX1JJTkdUT05FCisgICAgaWYgKHN0YXRlID09IEFVRElPX01PREVfUklOR1RPTkUgJiYKKyAgICAgICAgaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKK3sKKyAgICBBTE9HVigic2V0Rm9yY2VVc2UoKSB1c2FnZSAlZCwgY29uZmlnICVkLCBtUGhvbmVTdGF0ZSAlZCIsIHVzYWdlLCBjb25maWcsIG1QaG9uZVN0YXRlKTsKKworICAgIGJvb2wgZm9yY2VWb2x1bWVSZWV2YWwgPSBmYWxzZTsKKyAgICBzd2l0Y2godXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUiAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX0NPTU1VTklDQVRJT04iLCBjb25maWcpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZTsKKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRUFEUEhPTkVTICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQTJEUCAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0sgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRElHSVRBTF9ET0NLICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX01FRElBIiwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9SRUNPUkQiLCBjb25maWcpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQ0FSX0RPQ0sgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfREVTS19ET0NLICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1dJUkVEX0FDQ0VTU09SWSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSyAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9ESUdJVEFMX0RPQ0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfRE9DSyIsIGNvbmZpZyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yY2VWb2x1bWVSZWV2YWwgPSB0cnVlOworICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9TWVNURU0iLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZTsKKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0hETUlfU1lTVEVNX0FVRElPX0VORk9SQ0VEKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3JIRE1JX1NZU1RFTV9BVURJTyIsIGNvbmZpZyk7CisgICAgICAgIH0KKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCB1c2FnZSAlZCIsIHVzYWdlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBmb3JjZSB1c2FnZQorICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKyAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgIGlmIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGlmICgobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fCAob3V0cHV0ICE9IG1QcmltYXJ5T3V0cHV0KSkgeworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgbmV3RGV2aWNlLCAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcmNlVm9sdW1lUmVldmFsICYmIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpKSB7CisgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0LCBuZXdEZXZpY2UsIDAsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBnZXRBY3RpdmVJbnB1dCgpOworICAgIGlmIChhY3RpdmVJbnB1dCAhPSAwKSB7CisgICAgICAgIHNldElucHV0RGV2aWNlKGFjdGl2ZUlucHV0LCBnZXROZXdJbnB1dERldmljZShhY3RpdmVJbnB1dCkpOworICAgIH0KKworfQorCithdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQoreworICAgIHJldHVybiBtRm9yY2VVc2VbdXNhZ2VdOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKQoreworICAgIEFMT0dWKCJzZXRTeXN0ZW1Qcm9wZXJ0eSgpIHByb3BlcnR5ICVzLCB2YWx1ZSAlcyIsIHByb3BlcnR5LCB2YWx1ZSk7Cit9CisKKy8vIEZpbmQgYSBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgY29tcGF0aWJsZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCwgZXZlbiBpZiB0aGUgaW5wdXQgZmxhZ3MgZG8KKy8vIG5vdCBleHBsaWNpdGx5IHJlcXVlc3QgYSBkaXJlY3Qgb3V0cHV0CitzcDxBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07CisgICAgICAgICAgICBib29sIGZvdW5kID0gcHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywgZm9ybWF0LCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgOiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgICAgICAgICAgaWYgKGZvdW5kICYmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworCisgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBBTE9HVigiZ2V0T3V0cHV0KCkgZGV2aWNlICVkLCBzdHJlYW0gJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICV4LCBjaGFubmVsTWFzayAleCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGRldmljZSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKKworICAgIHJldHVybiBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSxmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgaWYgKGF0dHIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpIGNhbGxlZCB3aXRoIE5VTEwgYXVkaW8gYXR0cmlidXRlcyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSB1c2FnZT0lZCwgY29udGVudD0lZCwgdGFnPSVzIGZsYWdzPSUwOHgiLAorICAgICAgICAgICAgYXR0ci0+dXNhZ2UsIGF0dHItPmNvbnRlbnRfdHlwZSwgYXR0ci0+dGFncywgYXR0ci0+ZmxhZ3MpOworCisgICAgLy8gVE9ETyB0aGlzIGlzIHdoZXJlIGZpbHRlcmluZyBmb3IgY3VzdG9tIHBvbGljaWVzIChyZXJvdXRpbmcsIGR5bmFtaWMgc291cmNlcykgd2lsbCBnbworICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSkgZ2V0U3RyYXRlZ3lGb3JBdHRyKGF0dHIpOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisKKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7CisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOworICAgIH0KKworICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgZGV2aWNlICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAleCwgY2hhbm5lbE1hc2sgJXgsIGZsYWdzICV4IiwKKyAgICAgICAgICBkZXZpY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOworCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoYXR0cik7CisgICAgcmV0dXJuIGdldE91dHB1dEZvckRldmljZShkZXZpY2UsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywKKyAgICAgICAgICAgICAgICBvZmZsb2FkSW5mbyk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yRGV2aWNlKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIHVpbnQzMl90IGxhdGVuY3kgPSAwOworICAgIHN0YXR1c190IHN0YXR1czsKKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgaWYgKG1DdXJPdXRwdXQgIT0gMCkgeworICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgdGVzdCBvdXRwdXQgbUN1ck91dHB1dCAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrICV4LCBtRGlyZWN0T3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICBtQ3VyT3V0cHV0LCBtVGVzdFNhbXBsaW5nUmF0ZSwgbVRlc3RGb3JtYXQsIG1UZXN0Q2hhbm5lbHMsIG1EaXJlY3RPdXRwdXQpOworCisgICAgICAgIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIG9wZW5pbmcgdGVzdCBvdXRwdXQiKTsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IoTlVMTCk7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gbVRlc3REZXZpY2U7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tTGF0ZW5jeSA9IG1UZXN0TGF0ZW5jeU1zOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzID0KKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KShtRGlyZWN0T3V0cHV0ID8gQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIDogMCk7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9IDA7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBtVGVzdFNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBtVGVzdENoYW5uZWxzOworICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG1UZXN0Rm9ybWF0OworICAgICAgICAgICAgaWYgKG9mZmxvYWRJbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvID0gKm9mZmxvYWRJbmZvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0Q21kLmFkZEludChTdHJpbmc4KCJzZXRfaWQiKSxtQ3VyT3V0cHV0KTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sb3V0cHV0Q21kLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGFkZE91dHB1dChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dERlc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtVGVzdE91dHB1dHNbbUN1ck91dHB1dF07CisgICAgfQorI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKworICAgIC8vIG9wZW4gYSBkaXJlY3Qgb3V0cHV0IGlmIHJlcXVpcmVkIGJ5IHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICAgLy9mb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQorICAgIC8vIGFuZCBhbGwgY29tbW9uIGJlaGF2aW9ycyBhcmUgZHJpdmVuIGJ5IGNoZWNraW5nIG9ubHkgdGhlIGRpcmVjdCBmbGFnCisgICAgLy8gdGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgc2V0IGFwcHJvcHJpYXRlbHkgaW4gdGhlIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIH0KKyAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgeworICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIH0KKworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKKworICAgIC8vIHNraXAgZGlyZWN0IG91dHB1dCBzZWxlY3Rpb24gaWYgdGhlIHJlcXVlc3QgY2FuIG9idmlvdXNseSBiZSBhdHRhY2hlZCB0byBhIG1peGVkIG91dHB1dAorICAgIC8vIGFuZCBub3QgZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICBpZiAoKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgJiYKKyAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBzYW1wbGluZ1JhdGUgPD0gTUFYX01JWEVSX1NBTVBMSU5HX1JBVEUgJiYKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzaykgPD0gMikgeworICAgICAgICBnb3RvIG5vbl9kaXJlY3Rfb3V0cHV0OworICAgIH0KKworICAgIC8vIERvIG5vdCBhbGxvdyBvZmZsb2FkaW5nIGlmIG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGlzIGVuYWJsZWQuIFRoaXMgcHJldmVudHMgZnJvbQorICAgIC8vIGNyZWF0aW5nIGFuIG9mZmxvYWRlZCB0cmFjayBhbmQgdGVhcmluZyBpdCBkb3duIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0IHdoZW4gYXVkaW9mbGluZ2VyCisgICAgLy8gZGV0ZWN0cyB0aGVyZSBpcyBhbiBhY3RpdmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdC4KKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIHRoZSBhdWRpbyBzZXNzaW9uIGhlcmUgYnV0IHdlIGRvIG5vdCBoYXZlIGl0IGluIHRoaXMgY29udGV4dC4KKyAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKKyAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KKworICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkgfHwKKyAgICAgICAgICAgICFpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpKSB7CisgICAgICAgIHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClmbGFncyk7CisgICAgfQorCisgICAgaWYgKHByb2ZpbGUgIT0gMCkgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBOVUxMOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChwcm9maWxlID09IGRlc2MtPm1Qcm9maWxlKSkgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MgPSBkZXNjOworICAgICAgICAgICAgICAgIC8vIHJldXNlIGRpcmVjdCBvdXRwdXQgaWYgY3VycmVudGx5IG9wZW4gYW5kIGNvbmZpZ3VyZWQgd2l0aCBzYW1lIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICBpZiAoKHNhbXBsaW5nUmF0ZSA9PSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCA9PSBvdXRwdXREZXNjLT5tRm9ybWF0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IG91dHB1dERlc2MtPm1DaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCsrOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV1c2luZyBkaXJlY3Qgb3V0cHV0ICVkIiwgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGNsb3NlIGRpcmVjdCBvdXRwdXQgaWYgY3VycmVudGx5IG9wZW4gYW5kIGNvbmZpZ3VyZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycworICAgICAgICBpZiAob3V0cHV0RGVzYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB9CisgICAgICAgIG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUpOworICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgICAgICBvdXRwdXREZXNjLT5tTGF0ZW5jeSA9IDA7CisgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9KGF1ZGlvX291dHB1dF9mbGFnc190KSAob3V0cHV0RGVzYy0+bUZsYWdzIHwgZmxhZ3MpOworICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICBjb25maWcuZm9ybWF0ID0gZm9ybWF0OworICAgICAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKKworICAgICAgICAvLyBvbmx5IGFjY2VwdCBhbiBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAorICAgICAgICAgICAgKHNhbXBsaW5nUmF0ZSAhPSAwICYmIHNhbXBsaW5nUmF0ZSAhPSBjb25maWcuc2FtcGxlX3JhdGUpIHx8CisgICAgICAgICAgICAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUICYmIGZvcm1hdCAhPSBjb25maWcuZm9ybWF0KSB8fAorICAgICAgICAgICAgKGNoYW5uZWxNYXNrICE9IDAgJiYgY2hhbm5lbE1hc2sgIT0gY29uZmlnLmNoYW5uZWxfbWFzaykpIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBmYWlsZWQgb3BlbmluZyBkaXJlY3Qgb3V0cHV0OiBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICVkICVkLCIKKyAgICAgICAgICAgICAgICAgICAgImZvcm1hdCAlZCAlZCwgY2hhbm5lbE1hc2sgJTA0eCAlMDR4Iiwgb3V0cHV0LCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUsIGZvcm1hdCwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayk7CisgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSAwOworICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50ID0gMTsKKworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQgPSBnZXRPdXRwdXRGb3JFZmZlY3QoKTsKKyAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgpOworICAgICAgICBpZiAoZHN0T3V0cHV0ID09IG91dHB1dCkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgc3JjT3V0cHV0LCBkc3RPdXRwdXQpOworICAgICAgICB9CisgICAgICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKKyAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIHJldHVybnMgbmV3IGRpcmVjdCBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfQorCitub25fZGlyZWN0X291dHB1dDoKKworICAgIC8vIGlnbm9yaW5nIGNoYW5uZWwgbWFzayBkdWUgdG8gZG93bm1peCBjYXBhYmlsaXR5IGluIG1peGVyCisKKyAgICAvLyBvcGVuIGEgbm9uIGRpcmVjdCBvdXRwdXQKKworICAgIC8vIGZvciBub24gZGlyZWN0IG91dHB1dHMsIG9ubHkgUENNIGlzIHN1cHBvcnRlZAorICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgLy8gZ2V0IHdoaWNoIG91dHB1dCBpcyBzdWl0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBzdHJlYW0uIFRoZSBhY3R1YWwKKyAgICAgICAgLy8gcm91dGluZyBjaGFuZ2Ugd2lsbCBoYXBwZW4gd2hlbiBzdGFydE91dHB1dCgpIHdpbGwgYmUgY2FsbGVkCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7CisKKyAgICAgICAgLy8gYXQgdGhpcyBzdGFnZSB3ZSBzaG91bGQgaWdub3JlIHRoZSBESVJFQ1QgZmxhZyBhcyBubyBkaXJlY3Qgb3V0cHV0IGNvdWxkIGJlIGZvdW5kIGVhcmxpZXIKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgICAgIG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCBmbGFncywgZm9ybWF0KTsKKyAgICB9CisgICAgQUxPR1dfSUYoKG91dHB1dCA9PSAwKSwgImdldE91dHB1dCgpIGNvdWxkIG5vdCBmaW5kIG91dHB1dCBmb3Igc3RyZWFtICVkLCBzYW1wbGluZ1JhdGUgJWQsIgorICAgICAgICAgICAgImZvcm1hdCAlZCwgY2hhbm5lbHMgJXgsIGZsYWdzICV4Iiwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKKworICAgIEFMT0dWKCJnZXRPdXRwdXQoKSByZXR1cm5zIG91dHB1dCAlZCIsIG91dHB1dCk7CisKKyAgICByZXR1cm4gb3V0cHV0OworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKK3sKKyAgICAvLyBzZWxlY3Qgb25lIG91dHB1dCBhbW9uZyBzZXZlcmFsIHRoYXQgcHJvdmlkZSBhIHBhdGggdG8gYSBwYXJ0aWN1bGFyIGRldmljZSBvciBzZXQgb2YKKyAgICAvLyBkZXZpY2VzICh0aGUgbGlzdCB3YXMgcHJldmlvdXNseSBidWlsZCBieSBnZXRPdXRwdXRzRm9yRGV2aWNlKCkpLgorICAgIC8vIFRoZSBwcmlvcml0eSBpcyBhcyBmb2xsb3dzOgorICAgIC8vIDE6IHRoZSBvdXRwdXQgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgcmVxdWVzdGVkIHBvbGljeSBmbGFncworICAgIC8vIDI6IHRoZSBwcmltYXJ5IG91dHB1dAorICAgIC8vIDM6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKKworICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMSkgeworICAgICAgICByZXR1cm4gb3V0cHV0c1swXTsKKyAgICB9CisKKyAgICBpbnQgbWF4Q29tbW9uRmxhZ3MgPSAwOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZsYWdzID0gMDsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRQcmltYXJ5ID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICAgICAgLy8gaWYgYSB2YWxpZCBmb3JtYXQgaXMgc3BlY2lmaWVkLCBza2lwIG91dHB1dCBpZiBub3QgY29tcGF0aWJsZQorICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgeworICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBvdXRwdXREZXNjLT5tRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBjb21tb25GbGFncyA9IHBvcGNvdW50KG91dHB1dERlc2MtPm1Qcm9maWxlLT5tRmxhZ3MgJiBmbGFncyk7CisgICAgICAgICAgICBpZiAoY29tbW9uRmxhZ3MgPiBtYXhDb21tb25GbGFncykgeworICAgICAgICAgICAgICAgIG91dHB1dEZsYWdzID0gb3V0cHV0c1tpXTsKKyAgICAgICAgICAgICAgICBtYXhDb21tb25GbGFncyA9IGNvbW1vbkZsYWdzOworICAgICAgICAgICAgICAgIEFMT0dWKCJzZWxlY3RPdXRwdXQoKSBjb21tb25GbGFncyBmb3Igb3V0cHV0ICVkLCAlMDR4Iiwgb3V0cHV0c1tpXSwgY29tbW9uRmxhZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1Qcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0UHJpbWFyeSA9IG91dHB1dHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0cHV0RmxhZ3MgIT0gMCkgeworICAgICAgICByZXR1cm4gb3V0cHV0RmxhZ3M7CisgICAgfQorICAgIGlmIChvdXRwdXRQcmltYXJ5ICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dFByaW1hcnk7CisgICAgfQorCisgICAgcmV0dXJuIG91dHB1dHNbMF07Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigic3RhcnRPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0YXJ0T3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgLy8gaW5jcmVtZW50IHVzYWdlIGNvdW50IGZvciB0aGlzIHN0cmVhbSBvbiB0aGUgcmVxdWVzdGVkIG91dHB1dDoKKyAgICAvLyBOT1RFIHRoYXQgdGhlIHVzYWdlIGNvdW50IGlzIHRoZSBzYW1lIGZvciBkdXBsaWNhdGVkIG91dHB1dCBhbmQgaGFyZHdhcmUgb3V0cHV0IHdoaWNoIGlzCisgICAgLy8gbmVjZXNzYXJ5IGZvciBhIGNvcnJlY3QgY29udHJvbCBvZiBoYXJkd2FyZSBvdXRwdXQgcm91dGluZyBieSBzdGFydE91dHB1dCgpIGFuZCBzdG9wT3V0cHV0KCkKKyAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIDEpOworCisgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDEpIHsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKKyAgICAgICAgYm9vbCBzaG91bGRXYWl0ID0gKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpOworICAgICAgICB1aW50MzJfdCB3YWl0TXMgPSAwOworICAgICAgICBib29sIGZvcmNlID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoZGVzYyAhPSBvdXRwdXREZXNjKSB7CisgICAgICAgICAgICAgICAgLy8gZm9yY2UgYSBkZXZpY2UgY2hhbmdlIGlmIGFueSBvdGhlciBvdXRwdXQgaXMgbWFuYWdlZCBieSB0aGUgc2FtZSBodworICAgICAgICAgICAgICAgIC8vIG1vZHVsZSBhbmQgaGFzIGEgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIHRoYXQgZGlmZmVycyBmcm9tIHNlbGVjdGVkIGRldmljZS4KKyAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSBhdWRpbyBIQUwgbXVzdCByZWNlaXZlIHRoZSBuZXcgZGV2aWNlIHNlbGVjdGlvbiBzbyB0aGF0IGl0IGNhbgorICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgZGV2aWNlIGN1cnJlbnRseSBzZWxlY3RlZCBieSB0aGUgb3RoZXIgYWN0aXZlIG91dHB1dC4KKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+c2hhcmVzSHdNb2R1bGVXaXRoKGRlc2MpICYmCisgICAgICAgICAgICAgICAgICAgIGRlc2MtPmRldmljZSgpICE9IG5ld0RldmljZSkgeworICAgICAgICAgICAgICAgICAgICBmb3JjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIGF1ZGlvIG9uIG90aGVyIGFjdGl2ZSBvdXRwdXRzIHRvIGJlIHByZXNlbnRlZCB3aGVuIHN0YXJ0aW5nCisgICAgICAgICAgICAgICAgLy8gYSBub3RpZmljYXRpb24gc28gdGhhdCBhdWRpbyBmb2N1cyBlZmZlY3QgY2FuIHByb3BhZ2F0ZS4KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5ID0gZGVzYy0+bGF0ZW5jeSgpOworICAgICAgICAgICAgICAgIGlmIChzaG91bGRXYWl0ICYmIGRlc2MtPmlzQWN0aXZlKGxhdGVuY3kgKiAyKSAmJiAod2FpdE1zIDwgbGF0ZW5jeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd2FpdE1zID0gbGF0ZW5jeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZShvdXRwdXQsIG5ld0RldmljZSwgZm9yY2UpOworCisgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCisgICAgICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhcHBseSB2b2x1bWUgcnVsZXMgZm9yIGN1cnJlbnQgc3RyZWFtIGFuZCBkZXZpY2UgaWYgbmVjZXNzYXJ5CisgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbc3RyZWFtXS5nZXRWb2x1bWVJbmRleChuZXdEZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RldmljZSk7CisKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIGlmIHN0YXJ0aW5nIGFuIG91dHB1dCB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24KKyAgICAgICAgLy8gcm91dGluZworICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKHN0cmVhbSk7CisgICAgICAgIGlmICh3YWl0TXMgPiBtdXRlV2FpdE1zKSB7CisgICAgICAgICAgICB1c2xlZXAoKHdhaXRNcyAtIG11dGVXYWl0TXMpICogMiAqIDEwMDApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisKKyAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBzb25pZmljYXRpb24gd2hpbGUgaW4gY2FsbAorICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID4gMCkgeworICAgICAgICAvLyBkZWNyZW1lbnQgdXNhZ2UgY291bnQgb2YgdGhpcyBzdHJlYW0gb24gdGhlIG91dHB1dAorICAgICAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIC0xKTsKKyAgICAgICAgLy8gc3RvcmUgdGltZSBhdCB3aGljaCB0aGUgc3RyZWFtIHdhcyBzdG9wcGVkIC0gc2VlIGlzU3RyZWFtQWN0aXZlKCkKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdG9wVGltZVtzdHJlYW1dID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgLy8gZGVsYXkgdGhlIGRldmljZSBzd2l0Y2ggYnkgdHdpY2UgdGhlIGxhdGVuY3kgYmVjYXVzZSBzdG9wT3V0cHV0KCkgaXMgZXhlY3V0ZWQgd2hlbgorICAgICAgICAgICAgLy8gdGhlIHRyYWNrIHN0b3AoKSBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCBhdCB0aGF0IHRpbWUgdGhlIGF1ZGlvIHRyYWNrIGJ1ZmZlciBjYW4KKyAgICAgICAgICAgIC8vIHN0aWxsIGNvbnRhaW4gZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGRyYWluZWQuIFRoZSBsYXRlbmN5IG9ubHkgY292ZXJzIHRoZSBhdWRpbyBIQUwKKyAgICAgICAgICAgIC8vIGFuZCBrZXJuZWwgYnVmZmVycy4gQWxzbyB0aGUgbGF0ZW5jeSBkb2VzIG5vdCBhbHdheXMgaW5jbHVkZSBhZGRpdGlvbmFsIGRlbGF5IGluIHRoZQorICAgICAgICAgICAgLy8gYXVkaW8gcGF0aCAoYXVkaW8gRFNQLCBDT0RFQyAuLi4pCisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBuZXdEZXZpY2UsIGZhbHNlLCBvdXRwdXREZXNjLT5tTGF0ZW5jeSoyKTsKKworICAgICAgICAgICAgLy8gZm9yY2UgcmVzdG9yaW5nIHRoZSBkZXZpY2Ugc2VsZWN0aW9uIG9uIG90aGVyIGFjdGl2ZSBvdXRwdXRzIGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUKKyAgICAgICAgICAgIC8vIG9uZSBiZWluZyBzZWxlY3RlZCBmb3IgdGhpcyBvdXRwdXQKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBjdXJPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChjdXJPdXRwdXQgIT0gb3V0cHV0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5pc0FjdGl2ZSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChuZXdEZXZpY2UgIT0gZGVzYy0+ZGV2aWNlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShjdXJPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdPdXRwdXREZXZpY2UoY3VyT3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tTGF0ZW5jeSoyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG91dHB1dHMgaWYgc3RvcHBpbmcgb25lIHdpdGggYSBzdHJlYW0gdGhhdCBjYW4gYWZmZWN0IG5vdGlmaWNhdGlvbiByb3V0aW5nCisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgcmVmY291bnQgaXMgYWxyZWFkeSAwIGZvciBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSAlZCIsIG91dHB1dCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgcmVsZWFzaW5nIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgaW50IHRlc3RJbmRleCA9IHRlc3RPdXRwdXRJbmRleChvdXRwdXQpOworICAgIGlmICh0ZXN0SW5kZXggIT0gMCkgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOworICAgICAgICAgICAgbVRlc3RPdXRwdXRzW3Rlc3RJbmRleF0gPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisgICAgaWYgKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICBpZiAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA8PSAwKSB7CisgICAgICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIGludmFsaWQgb3BlbiBjb3VudCAlZCBmb3Igb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bURpcmVjdE9wZW5Db3VudCwgb3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoLS1kZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAvLyBJZiBlZmZlY3RzIHdoZXJlIHByZXNlbnQgb24gdGhlIG91dHB1dCwgYXVkaW9mbGluZ2VyIG1vdmVkIHRoZW0gdG8gdGhlIHByaW1hcnkKKyAgICAgICAgICAgIC8vIG91dHB1dCBieSBkZWZhdWx0OiBtb3ZlIHRoZW0gYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0LgorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7CisgICAgICAgICAgICBpZiAoZHN0T3V0cHV0ICE9IG1QcmltYXJ5T3V0cHV0KSB7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgbVByaW1hcnlPdXRwdXQsIGRzdE91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQoreworICAgIEFMT0dWKCJnZXRJbnB1dCgpIGlucHV0U291cmNlICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJXgsIHNlc3Npb24gJWQsICIKKyAgICAgICAgICAiZmxhZ3MgJSN4IiwKKyAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzZXNzaW9uLCBmbGFncyk7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOworCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBBTE9HVygiZ2V0SW5wdXQoKSBjb3VsZCBub3QgZmluZCBkZXZpY2UgZm9yIGlucHV0U291cmNlICVkIiwgaW5wdXRTb3VyY2UpOworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorCisgICAgLy8gYWRhcHQgY2hhbm5lbCBzZWxlY3Rpb24gdG8gaW5wdXQgc291cmNlCisgICAgc3dpdGNoIChpbnB1dFNvdXJjZSkgeworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKKyAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6CisgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTks7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEw6CisgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTksgfCBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICBib29sIGlzU291bmRUcmlnZ2VyID0gZmFsc2U7CisgICAgYXVkaW9fc291cmNlX3QgaGFsSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKKyAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgaW5wdXQgPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMudmFsdWVGb3Ioc2Vzc2lvbik7CisgICAgICAgICAgICBpc1NvdW5kVHJpZ2dlciA9IHRydWU7CisgICAgICAgICAgICBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRCk7CisgICAgICAgICAgICBBTE9HVigiU291bmRUcmlnZ2VyIGNhcHR1cmUgb24gc2Vzc2lvbiAlZCBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhhbElucHV0U291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0SW5wdXRQcm9maWxlKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKHByb2ZpbGUgPT0gMCkgeworICAgICAgICAvL3JldHJ5IHdpdGhvdXQgZmxhZ3MKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBsb2dfZmxhZ3MgPSBmbGFnczsKKyAgICAgICAgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7CisgICAgICAgIHByb2ZpbGUgPSBnZXRJbnB1dFByb2ZpbGUoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgIGlmIChwcm9maWxlID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dCgpIGNvdWxkIG5vdCBmaW5kIHByb2ZpbGUgZm9yIGRldmljZSAweCVYLCBzYW1wbGluZ1JhdGUgJXUsIGZvcm1hdCAlI3gsICIKKyAgICAgICAgICAgICAgICAgICAgImNoYW5uZWxNYXNrIDB4JVgsIGZsYWdzICUjeCIsCisgICAgICAgICAgICAgICAgICAgIGRldmljZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBsb2dfZmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUgPT0gMCkgeworICAgICAgICBBTE9HRSgiZ2V0SW5wdXQoKTogSFcgbW9kdWxlICVzIG5vdCBvcGVuZWQiLCBwcm9maWxlLT5tTW9kdWxlLT5tTmFtZSk7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisKKyAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxpbmdSYXRlOworICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKKyAgICBjb25maWcuZm9ybWF0ID0gZm9ybWF0OworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5JbnB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbElucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCisgICAgLy8gb25seSBhY2NlcHQgaW5wdXQgd2l0aCB0aGUgZXhhY3QgcmVxdWVzdGVkIHNldCBvZiBwYXJhbWV0ZXJzCisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAorICAgICAgICAoc2FtcGxpbmdSYXRlICE9IGNvbmZpZy5zYW1wbGVfcmF0ZSkgfHwKKyAgICAgICAgKGZvcm1hdCAhPSBjb25maWcuZm9ybWF0KSB8fAorICAgICAgICAoY2hhbm5lbE1hc2sgIT0gY29uZmlnLmNoYW5uZWxfbWFzaykpIHsKKyAgICAgICAgQUxPR1coImdldElucHV0KCkgZmFpbGVkIG9wZW5pbmcgaW5wdXQ6IHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCIsCisgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgaWYgKGlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSk7CisgICAgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKKyAgICBpbnB1dERlc2MtPm1SZWZDb3VudCA9IDA7CisgICAgaW5wdXREZXNjLT5tT3BlblJlZkNvdW50ID0gMTsKKyAgICBpbnB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgaW5wdXREZXNjLT5tRm9ybWF0ID0gZm9ybWF0OworICAgIGlucHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CisgICAgaW5wdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgIGlucHV0RGVzYy0+bVNlc3Npb25zLmFkZChzZXNzaW9uKTsKKyAgICBpbnB1dERlc2MtPm1Jc1NvdW5kVHJpZ2dlciA9IGlzU291bmRUcmlnZ2VyOworCisgICAgYWRkSW5wdXQoaW5wdXQsIGlucHV0RGVzYyk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgIHJldHVybiBpbnB1dDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJzdGFydElucHV0KCkgaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgaW5kZXggPSBpbnB1dERlc2MtPm1TZXNzaW9ucy5pbmRleE9mKHNlc3Npb24pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gdmlydHVhbCBpbnB1dCBkZXZpY2VzIGFyZSBjb21wYXRpYmxlIHdpdGggb3RoZXIgaW5wdXQgZGV2aWNlcworICAgIGlmICghaXNWaXJ0dWFsSW5wdXREZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgeworCisgICAgICAgIC8vIGZvciBhIG5vbi12aXJ0dWFsIGlucHV0IGRldmljZSwgY2hlY2sgaWYgdGhlcmUgaXMgYW5vdGhlciAobm9uLXZpcnR1YWwpIGFjdGl2ZSBpbnB1dAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IGdldEFjdGl2ZUlucHV0KCk7CisgICAgICAgIGlmIChhY3RpdmVJbnB1dCAhPSAwICYmIGFjdGl2ZUlucHV0ICE9IGlucHV0KSB7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBhbHJlYWR5IGFjdGl2ZSBpbnB1dCB1c2VzIEFVRElPX1NPVVJDRV9IT1RXT1JEIHRoZW4gaXQgaXMgY2xvc2VkLAorICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBhY3RpdmUgaW5wdXQgY29udGludWVzIGFuZCB0aGUgbmV3IGlucHV0IGNhbm5vdCBiZSBzdGFydGVkLgorICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGFjdGl2ZURlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5tSW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgcHJlZW1wdGluZyBsb3ctcHJpb3JpdHkgaW5wdXQgJWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOworICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlRGVzYy0+bVNlc3Npb25zLml0ZW1BdCgwKSk7CisgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVEZXNjLT5tU2Vzc2lvbnMuaXRlbUF0KDApKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogb3RoZXIgaW5wdXQgJWQgYWxyZWFkeSBzdGFydGVkIiwgaW5wdXQsIGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgeworICAgICAgICBpZiAoYWN0aXZlSW5wdXRzQ291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZSh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXQpLCB0cnVlIC8qIGZvcmNlICovKTsKKworICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdGFydGVkLgorICAgICAgICAvLyBGb3IgcmVtb3RlIHN1Ym1peCAoYSB2aXJ0dWFsIGRldmljZSksIHdlIG9wZW4gb25seSBvbmUgaW5wdXQgcGVyIGNhcHR1cmUgcmVxdWVzdC4KKyAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKKyAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLCBBVURJT19SRU1PVEVfU1VCTUlYX0RFVklDRV9BRERSRVNTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoKSBpbnB1dCBzb3VyY2UgPSAlZCIsIGlucHV0RGVzYy0+bUlucHV0U291cmNlKTsKKworICAgIGlucHV0RGVzYy0+bVJlZkNvdW50Kys7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIGluZGV4ID0gaW5wdXREZXNjLT5tU2Vzc2lvbnMuaW5kZXhPZihzZXNzaW9uKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKGlucHV0RGVzYy0+bVJlZkNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIGlucHV0ICVkIGFscmVhZHkgc3RvcHBlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlucHV0RGVzYy0+bVJlZkNvdW50LS07CisgICAgaWYgKGlucHV0RGVzYy0+bVJlZkNvdW50ID09IDApIHsKKworICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGRpc2FibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RvcHBlZAorICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgeworICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwgQVVESU9fUkVNT1RFX1NVQk1JWF9ERVZJQ0VfQUREUkVTUyk7CisgICAgICAgIH0KKworICAgICAgICByZXNldElucHV0RGV2aWNlKGlucHV0KTsKKworICAgICAgICBpZiAoYWN0aXZlSW5wdXRzQ291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigicmVsZWFzZUlucHV0KCkgJWQiLCBpbnB1dCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgcmVsZWFzaW5nIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7CisgICAgQUxPR19BU1NFUlQoaW5wdXREZXNjICE9IDApOworCisgICAgaW5kZXggPSBpbnB1dERlc2MtPm1TZXNzaW9ucy5pbmRleE9mKHNlc3Npb24pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnB1dERlc2MtPm1TZXNzaW9ucy5yZW1vdmUoc2Vzc2lvbik7CisgICAgaWYgKGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSBpbnZhbGlkIG9wZW4gcmVmIGNvdW50ICVkIiwgaW5wdXREZXNjLT5tT3BlblJlZkNvdW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQtLTsKKyAgICBpZiAoaW5wdXREZXNjLT5tT3BlblJlZkNvdW50ID4gMCkgeworICAgICAgICBBTE9HVigicmVsZWFzZUlucHV0KCkgZXhpdCA+IDAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNsb3NlSW5wdXQoaW5wdXQpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICBBTE9HVigicmVsZWFzZUlucHV0KCkgZXhpdCIpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VBbGxJbnB1dHMoKSB7CisgICAgYm9vbCBwYXRjaFJlbW92ZWQgPSBmYWxzZTsKKworICAgIGZvcihzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOworICAgICAgICBzc2l6ZV90IHBhdGNoX2luZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgaWYgKHBhdGNoX2luZGV4ID49IDApIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChwYXRjaF9pbmRleCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQocGF0Y2hfaW5kZXgpOworICAgICAgICAgICAgcGF0Y2hSZW1vdmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CisgICAgfQorICAgIG1JbnB1dHMuY2xlYXIoKTsKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworCisgICAgaWYgKHBhdGNoUmVtb3ZlZCkgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQoreworICAgIEFMT0dWKCJpbml0U3RyZWFtVm9sdW1lKCkgc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgaWYgKGluZGV4TWluIDwgMCB8fCBpbmRleE1pbiA+PSBpbmRleE1heCkgeworICAgICAgICBBTE9HVygiaW5pdFN0cmVhbVZvbHVtZSgpIGludmFsaWQgaW5kZXggbGltaXRzIGZvciBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1pbiA9IGluZGV4TWluOworICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4ID0gaW5kZXhNYXg7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworCisgICAgaWYgKChpbmRleCA8IG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWluKSB8fCAoaW5kZXggPiBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBGb3JjZSBtYXggdm9sdW1lIGlmIHN0cmVhbSBjYW5ub3QgYmUgbXV0ZWQKKyAgICBpZiAoIW1TdHJlYW1zW3N0cmVhbV0ubUNhbkJlTXV0ZWQpIGluZGV4ID0gbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXg7CisKKyAgICBBTE9HVigic2V0U3RyZWFtVm9sdW1lSW5kZXgoKSBzdHJlYW0gJWQsIGRldmljZSAlMDR4LCBpbmRleCAlZCIsCisgICAgICAgICAgc3RyZWFtLCBkZXZpY2UsIGluZGV4KTsKKworICAgIC8vIGlmIGRldmljZSBpcyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQgc2V0IGRlZmF1bHQgdmFsdWUgYW5kCisgICAgLy8gY2xlYXIgYWxsIGRldmljZSBzcGVjaWZpYyB2YWx1ZXMKKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgeworICAgICAgICBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleEN1ci5jbGVhcigpOworICAgIH0KKyAgICBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleEN1ci5hZGQoZGV2aWNlLCBpbmRleCk7CisKKyAgICAvLyBjb21wdXRlIGFuZCBhcHBseSBzdHJlYW0gdm9sdW1lIG9uIGFsbCBvdXRwdXRzIGFjY29yZGluZyB0byBjb25uZWN0ZWQgZGV2aWNlCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlID0KKyAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JWb2x1bWUobU91dHB1dHMudmFsdWVBdChpKS0+ZGV2aWNlKCkpOworICAgICAgICBpZiAoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpIHx8IChkZXZpY2UgPT0gY3VyRGV2aWNlKSkgeworICAgICAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0gY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCBpbmRleCwgbU91dHB1dHMua2V5QXQoaSksIGN1ckRldmljZSk7CisgICAgICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdm9sU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAoaW5kZXggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxULCByZXR1cm4gdm9sdW1lIGZvciBkZXZpY2UgY29ycmVzcG9uZGluZyB0bworICAgIC8vIHRoZSBzdHJhdGVneSB0aGUgc3RyZWFtIGJlbG9uZ3MgdG8uCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koZ2V0U3RyYXRlZ3koc3RyZWFtKSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICB9CisgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CisKKyAgICAqaW5kZXggPSAgbVN0cmVhbXNbc3RyZWFtXS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOworICAgIEFMT0dWKCJnZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCBkZXZpY2UgJTA4eCBpbmRleCAlZCIsIHN0cmVhbSwgZGV2aWNlLCAqaW5kZXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzKQoreworICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgc3VpdGFibGUgZm9yIGdsb2JhbCBlZmZlY3RzLgorICAgIC8vIFRoZSBwcmlvcml0eSBpcyBhcyBmb2xsb3dzOgorICAgIC8vIDE6IEFuIG9mZmxvYWRlZCBvdXRwdXQuIElmIHRoZSBlZmZlY3QgZW5kcyB1cCBub3QgYmVpbmcgb2ZmbG9hZGFibGUsCisgICAgLy8gICAgQXVkaW9GbGluZ2VyIHdpbGwgaW52YWxpZGF0ZSB0aGUgdHJhY2sgYW5kIHRoZSBvZmZsb2FkZWQgb3V0cHV0CisgICAgLy8gICAgd2lsbCBiZSBjbG9zZWQgY2F1c2luZyB0aGUgZWZmZWN0IHRvIGJlIG1vdmVkIHRvIGEgUENNIG91dHB1dC4KKyAgICAvLyAyOiBBIGRlZXAgYnVmZmVyIG91dHB1dAorICAgIC8vIDM6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKKworICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dE9mZmxvYWRlZCA9IDA7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0RGVlcEJ1ZmZlciA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgIEFMT0dWKCJzZWxlY3RPdXRwdXRGb3JFZmZlY3RzIG91dHB1dHNbJXp1XSBmbGFncyAleCIsIGksIGRlc2MtPm1GbGFncyk7CisgICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICAgICAgb3V0cHV0T2ZmbG9hZGVkID0gb3V0cHV0c1tpXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSAhPSAwKSB7CisgICAgICAgICAgICBvdXRwdXREZWVwQnVmZmVyID0gb3V0cHV0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJzZWxlY3RPdXRwdXRGb3JFZmZlY3RzIG91dHB1dE9mZmxvYWRlZCAlZCBvdXRwdXREZWVwQnVmZmVyICVkIiwKKyAgICAgICAgICBvdXRwdXRPZmZsb2FkZWQsIG91dHB1dERlZXBCdWZmZXIpOworICAgIGlmIChvdXRwdXRPZmZsb2FkZWQgIT0gMCkgeworICAgICAgICByZXR1cm4gb3V0cHV0T2ZmbG9hZGVkOworICAgIH0KKyAgICBpZiAob3V0cHV0RGVlcEJ1ZmZlciAhPSAwKSB7CisgICAgICAgIHJldHVybiBvdXRwdXREZWVwQnVmZmVyOworICAgIH0KKworICAgIHJldHVybiBvdXRwdXRzWzBdOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQoreworICAgIC8vIGFwcGx5IHNpbXBsZSBydWxlIHdoZXJlIGdsb2JhbCBlZmZlY3RzIGFyZSBhdHRhY2hlZCB0byB0aGUgc2FtZSBvdXRwdXQgYXMgTVVTSUMgc3RyZWFtcworCisgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGRzdE91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworCisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyhkc3RPdXRwdXRzKTsKKyAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yRWZmZWN0KCkgZ290IG91dHB1dCAlZCBmb3IgZnggJXMgZmxhZ3MgJXgiLAorICAgICAgICAgIG91dHB1dCwgKGRlc2MgPT0gTlVMTCkgPyAidW5zcGVjaWZpZWQiIDogZGVzYy0+bmFtZSwgIChkZXNjID09IE5VTEwpID8gMCA6IGRlc2MtPmZsYWdzKTsKKworICAgIHJldHVybiBvdXRwdXQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KGlvKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlvKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR1coInJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBpbyAlZCIsIGlvKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5ICsgZGVzYy0+bWVtb3J5VXNhZ2UgPiBnZXRNYXhFZmZlY3RzTWVtb3J5KCkpIHsKKyAgICAgICAgQUxPR1coInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5IGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgTWVtb3J5ICVkIEtCIiwKKyAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBkZXNjLT5tZW1vcnlVc2FnZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgbVRvdGFsRWZmZWN0c01lbW9yeSArPSBkZXNjLT5tZW1vcnlVc2FnZTsKKyAgICBBTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIGlvICVkLCBzdHJhdGVneSAlZCBzZXNzaW9uICVkIGlkICVkIiwKKyAgICAgICAgICAgIGRlc2MtPm5hbWUsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCwgdG90YWwgbWVtb3J5ICVkIiwgZGVzYy0+bWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOworCisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG5ldyBFZmZlY3REZXNjcmlwdG9yKCk7CisgICAgbWVtY3B5ICgmZWZmZWN0RGVzYy0+bURlc2MsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgZWZmZWN0RGVzYy0+bUlvID0gaW87CisgICAgZWZmZWN0RGVzYy0+bVN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpc3RyYXRlZ3k7CisgICAgZWZmZWN0RGVzYy0+bVNlc3Npb24gPSBzZXNzaW9uOworICAgIGVmZmVjdERlc2MtPm1FbmFibGVkID0gZmFsc2U7CisKKyAgICBtRWZmZWN0cy5hZGQoaWQsIGVmZmVjdERlc2MpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtRWZmZWN0cy5pbmRleE9mS2V5KGlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBpZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbUVmZmVjdHMudmFsdWVBdChpbmRleCk7CisKKyAgICBzZXRFZmZlY3RFbmFibGVkKGVmZmVjdERlc2MsIGZhbHNlKTsKKworICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5IDwgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UpIHsKKyAgICAgICAgQUxPR1coInVucmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgJWQgdG9vIGJpZyBmb3IgdG90YWwgJWQiLAorICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKyAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UgPSBtVG90YWxFZmZlY3RzTWVtb3J5OworICAgIH0KKyAgICBtVG90YWxFZmZlY3RzTWVtb3J5IC09IGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlOworICAgIEFMT0dWKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgZWZmZWN0ICVzLCBJRCAlZCwgbWVtb3J5ICVkIHRvdGFsIG1lbW9yeSAlZCIsCisgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5uYW1lLCBpZCwgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOworCisgICAgbUVmZmVjdHMucmVtb3ZlSXRlbShpZCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbUVmZmVjdHMuaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIHNldEVmZmVjdEVuYWJsZWQobUVmZmVjdHMudmFsdWVBdChpbmRleCksIGVuYWJsZWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4mIGVmZmVjdERlc2MsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCA9PSBlZmZlY3REZXNjLT5tRW5hYmxlZCkgeworICAgICAgICBBTE9HVigic2V0RWZmZWN0RW5hYmxlZCglcykgZWZmZWN0IGFscmVhZHkgJXMiLAorICAgICAgICAgICAgIGVuYWJsZWQ/InRydWUiOiJmYWxzZSIsIGVuYWJsZWQ/ImVuYWJsZWQiOiJkaXNhYmxlZCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgaWYgKG1Ub3RhbEVmZmVjdHNDcHVMb2FkICsgZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZCA+IGdldE1heEVmZmVjdHNDcHVMb2FkKCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRFZmZlY3RFbmFibGVkKHRydWUpIENQVSBMb2FkIGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgQ1BVICVmIE1JUFMiLAorICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5uYW1lLCAoZmxvYXQpZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZC8xMCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgKz0gZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZDsKKyAgICAgICAgQUxPR1YoInNldEVmZmVjdEVuYWJsZWQodHJ1ZSkgdG90YWwgQ1BVICVkIiwgbVRvdGFsRWZmZWN0c0NwdUxvYWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtVG90YWxFZmZlY3RzQ3B1TG9hZCA8IGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRFZmZlY3RFbmFibGVkKGZhbHNlKSBDUFUgbG9hZCAlZCB0b28gaGlnaCBmb3IgdG90YWwgJWQiLAorICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCk7CisgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkID0gbVRvdGFsRWZmZWN0c0NwdUxvYWQ7CisgICAgICAgIH0KKyAgICAgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgLT0gZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZDsKKyAgICAgICAgQUxPR1YoInNldEVmZmVjdEVuYWJsZWQoZmFsc2UpIHRvdGFsIENQVSAlZCIsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKKyAgICB9CisgICAgZWZmZWN0RGVzYy0+bUVuYWJsZWQgPSBlbmFibGVkOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBtRWZmZWN0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZWZmZWN0RGVzYy0+bUVuYWJsZWQgJiYgKGVmZmVjdERlc2MtPm1TdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKKyAgICAgICAgICAgICAgICAoKGVmZmVjdERlc2MtPm1EZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQpID09IDApKSB7CisgICAgICAgICAgICBBTE9HVigiaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSBub24gb2ZmbG9hZGFibGUgZWZmZWN0ICVzIGVuYWJsZWQgb24gc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5uYW1lLCBlZmZlY3REZXNjLT5tU2Vzc2lvbik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmICgoKG91dHB1dERlc2MtPmRldmljZSgpICYgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKChpbnB1dERlc2NyaXB0b3ItPm1JbnB1dFNvdXJjZSA9PSAoaW50KXNvdXJjZSB8fAorICAgICAgICAgICAgICAgIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OICYmCisgICAgICAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci0+bUlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSkKKyAgICAgICAgICAgICAmJiAoaW5wdXREZXNjcmlwdG9yLT5tUmVmQ291bnQgPiAwKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwgbVByaW1hcnlPdXRwdXQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUGhvbmUgc3RhdGU6ICVkXG4iLCBtUGhvbmVTdGF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGNvbW11bmljYXRpb25zICVkXG4iLAorICAgICAgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgbWVkaWEgJWRcbiIsIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHJlY29yZCAlZFxuIiwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGRvY2sgJWRcbiIsIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3Igc3lzdGVtICVkXG4iLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgaGRtaSBzeXN0ZW0gYXVkaW8gJWRcbiIsCisgICAgICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBBdmFpbGFibGUgb3V0cHV0IGRldmljZXM6XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+ZHVtcChmZCwgMiwgaSk7CisgICAgfQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuIEF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5kdW1wKGZkLCAyLCBpKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkhXIE1vZHVsZXMgZHVtcDpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBIVyBNb2R1bGUgJXp1OlxuIiwgaSArIDEpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIG1Id01vZHVsZXNbaV0tPmR1bXAoZmQpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuT3V0cHV0cyBkdW1wOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICBtT3V0cHV0cy52YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0cyBkdW1wOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIElucHV0ICVkIGR1bXA6XG4iLCBtSW5wdXRzLmtleUF0KGkpKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICBtSW5wdXRzLnZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuU3RyZWFtcyBkdW1wOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKKyAgICAgICAgICAgICAiIFN0cmVhbSAgQ2FuIGJlIG11dGVkICBJbmRleCBNaW4gIEluZGV4IE1heCAgSW5kZXggQ3VyIFtkZXZpY2UgOiBpbmRleF0uLi5cbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyenUgICAgICAiLCBpKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICBtU3RyZWFtc1tpXS5kdW1wKGZkKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblRvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCBUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0JcbiIsCisgICAgICAgICAgICAoZmxvYXQpbVRvdGFsRWZmZWN0c0NwdUxvYWQvMTAsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlJlZ2lzdGVyZWQgZWZmZWN0czpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gRWZmZWN0ICVkIGR1bXA6XG4iLCBtRWZmZWN0cy5rZXlBdChpKSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgbUVmZmVjdHMudmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5BdWRpbyBQYXRjaGVzOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUGF0Y2hlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtQXVkaW9QYXRjaGVzW2ldLT5kdW1wKGZkLCAyLCBpKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciB0aGUgcGFyYW1ldGVycyB3aGljaCBjYW4gYmUgb2ZmbG9hZGVkLgorLy8gVGhpcyBjYW4gYmUgZW5oYW5jZWQgZGVwZW5kaW5nIG9uIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSBEU1AgYW5kIHBvbGljeQorLy8gb2YgdGhlIHN5c3RlbS4KK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKQoreworICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQ6IFNSPSV1LCBDTT0weCV4LCBGb3JtYXQ9MHgleCwgU3RyZWFtVHlwZT0lZCwiCisgICAgICIgQml0UmF0ZT0ldSwgZHVyYXRpb249JSIgUFJJZDY0ICIgdXMsIGhhc192aWRlbz0lZCIsCisgICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlLCBvZmZsb2FkSW5mby5jaGFubmVsX21hc2ssCisgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKKyAgICAgb2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUsIG9mZmxvYWRJbmZvLmJpdF9yYXRlLCBvZmZsb2FkSW5mby5kdXJhdGlvbl91cywKKyAgICAgb2ZmbG9hZEluZm8uaGFzX3ZpZGVvKTsKKworICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaGFzIGJlZW4gZGlzYWJsZWQKKyAgICBjaGFyIHByb3BWYWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIHByb3BWYWx1ZSwgIjAiKSkgeworICAgICAgICBpZiAoYXRvaShwcm9wVmFsdWUpICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZT0lcyIsIHByb3BWYWx1ZSApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHR5cGUgaXMgbXVzaWMsIHRoZW4gb25seSBhbGxvdyBvZmZsb2FkIGFzIG9mIG5vdy4KKyAgICBpZiAob2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKQorICAgIHsKKyAgICAgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogc3RyZWFtX3R5cGUgIT0gTVVTSUMsIHJldHVybmluZyBmYWxzZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy9UT0RPOiBlbmFibGUgYXVkaW8gb2ZmbG9hZGluZyB3aXRoIHZpZGVvIHdoZW4gcmVhZHkKKyAgICBpZiAob2ZmbG9hZEluZm8uaGFzX3ZpZGVvKQorICAgIHsKKyAgICAgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogaGFzX3ZpZGVvID09IHRydWUsIHJldHVybmluZyBmYWxzZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy9JZiBkdXJhdGlvbiBpcyBsZXNzIHRoYW4gbWluaW11bSB2YWx1ZSBkZWZpbmVkIGluIHByb3BlcnR5LCByZXR1cm4gZmFsc2UKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIiwgcHJvcFZhbHVlLCBOVUxMKSkgeworICAgICAgICBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCAoYXRvaShwcm9wVmFsdWUpICogMTAwMDAwMCApKSB7CisgICAgICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzKD0lcykiLCBwcm9wVmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyAqIDEwMDAwMDApIHsKKyAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgZGVmYXVsdCBtaW4oPSV1KSIsIE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBEbyBub3QgYWxsb3cgb2ZmbG9hZGluZyBpZiBvbmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCBpcyBlbmFibGVkLiBUaGlzIHByZXZlbnRzIGZyb20KKyAgICAvLyBjcmVhdGluZyBhbiBvZmZsb2FkZWQgdHJhY2sgYW5kIHRlYXJpbmcgaXQgZG93biBpbW1lZGlhdGVseSBhZnRlciBzdGFydCB3aGVuIGF1ZGlvZmxpbmdlcgorICAgIC8vIGRldGVjdHMgdGhlcmUgaXMgYW4gYWN0aXZlIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QuCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBjaGVjayB0aGUgYXVkaW8gc2Vzc2lvbiBoZXJlIGJ1dCB3ZSBkbyBub3QgaGF2ZSBpdCBpbiB0aGlzIGNvbnRleHQuCisgICAgLy8gVGhpcyBtYXkgcHJldmVudCBvZmZsb2FkaW5nIGluIHJhcmUgc2l0dWF0aW9ucyB3aGVyZSBlZmZlY3RzIGFyZSBsZWZ0IGFjdGl2ZSBieSBhcHBzCisgICAgLy8gaW4gdGhlIGJhY2tncm91bmQuCisgICAgaWYgKGlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIHByb2ZpbGUgdG8gc3VwcG9ydCB0aGlzLgorICAgIC8vIEFVRElPX0RFVklDRV9OT05FCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChBVURJT19ERVZJQ0VfTk9ORSAvKmlnbm9yZSBkZXZpY2UgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCk7CisgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZCgpIHByb2ZpbGUgJXNmb3VuZCIsIHByb2ZpbGUgIT0gMCA/ICIiIDogIk5PVCAiKTsKKyAgICByZXR1cm4gKHByb2ZpbGUgIT0gMCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQoreworICAgIGlmIChudW1fcG9ydHMgPT0gTlVMTCB8fCAoKm51bV9wb3J0cyAhPSAwICYmIHBvcnRzID09IE5VTEwpIHx8CisgICAgICAgICAgICBnZW5lcmF0aW9uID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoImxpc3RBdWRpb1BvcnRzKCkgcm9sZSAlZCB0eXBlICVkIG51bV9wb3J0cyAlZCBwb3J0cyAlcCIsIHJvbGUsIHR5cGUsICpudW1fcG9ydHMsIHBvcnRzKTsKKyAgICBpZiAocG9ydHMgPT0gTlVMTCkgeworICAgICAgICAqbnVtX3BvcnRzID0gMDsKKyAgICB9CisKKyAgICBzaXplX3QgcG9ydHNXcml0dGVuID0gMDsKKyAgICBzaXplX3QgcG9ydHNNYXggPSAqbnVtX3BvcnRzOworICAgICpudW1fcG9ydHMgPSAwOworICAgIGlmICh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9OT05FIHx8IHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaSAgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCkgJiYgcG9ydHNXcml0dGVuIDwgcG9ydHNNYXg7IGkrKykgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCkgJiYgcG9ydHNXcml0dGVuIDwgcG9ydHNNYXg7IGkrKykgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm51bV9wb3J0cyArPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTk9ORSB8fCB0eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKSAmJiBwb3J0c1dyaXR0ZW4gPCBwb3J0c01heDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUlucHV0c1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbnVtX3BvcnRzICs9IG1JbnB1dHMuc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgeworICAgICAgICAgICAgc2l6ZV90IG51bU91dHB1dHMgPSAwOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghbU91dHB1dHNbaV0tPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG51bU91dHB1dHMrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0c1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbnVtX3BvcnRzICs9IG51bU91dHB1dHM7CisgICAgICAgIH0KKyAgICB9CisgICAgKmdlbmVyYXRpb24gPSBjdXJBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgQUxPR1YoImxpc3RBdWRpb1BvcnRzKCkgZ290ICV6dSBwb3J0cyBuZWVkZWQgJWQiLCBwb3J0c1dyaXR0ZW4sICpudW1fcG9ydHMpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQgX191bnVzZWQpCit7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzcDxBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGcm9tSWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0Cit7CisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gTlVMTDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+bUlkID09IGlkKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0cHV0RGVzYzsKK30KKworc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZyb21JZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKK3sKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gTlVMTDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjLT5tSWQgPT0gaWQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnB1dERlc2M7Cit9CisKK3NwIDxBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1vZHVsZUZvckRldmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKK3sKKyAgICBzcCA8SHdNb2R1bGU+IG1vZHVsZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtSHdNb2R1bGVzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXNbal0tPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Id01vZHVsZXNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtb2R1bGU7Cit9CisKK3NwIDxBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0Cit7CisgICAgc3AgPEh3TW9kdWxlPiBtb2R1bGU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCisgICAgeworICAgICAgICBpZiAoc3RyY21wKG1Id01vZHVsZXNbaV0tPm1OYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbUh3TW9kdWxlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbW9kdWxlOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpCit7CisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gb3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7CisgICAgcmV0dXJuIGRldmljZXMgJiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkKK3sKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgcHJpbWFyeUhhbmRsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KS0+bVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1Nb2R1bGUtPm1IYW5kbGUgPT0gcHJpbWFyeUhhbmRsZSkgeworICAgICAgICAgICAgZGV2aWNlcyB8PSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlczsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKK3sKKyAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIik7CisKKyAgICBpZiAoaGFuZGxlID09IE5VTEwgfHwgcGF0Y2ggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG51bSBzb3VyY2VzICVkIG51bSBzaW5rcyAlZCIsIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcyk7CisKKyAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDAgfHwgcGF0Y2gtPm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYIHx8CisgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID09IDAgfHwgcGF0Y2gtPm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBvbmx5IG9uZSBzb3VyY2UgcGVyIGF1ZGlvIHBhdGNoIHN1cHBvcnRlZCBmb3Igbm93CisgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA+IDEpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChwYXRjaC0+c291cmNlc1swXS5yb2xlICE9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgeworICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnJvbGUgIT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOworCisgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2ggc291cmNlIGlkICVkIHJvbGUgJWQgdHlwZSAlZCIsIHBhdGNoLT5zb3VyY2VzWzBdLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS50eXBlKTsKKyNpZiBMT0dfTkRFQlVHID09IDAKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgeworICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCBzaW5rICVkOiBpZCAlZCByb2xlICVkIHR5cGUgJWQiLCBpLCBwYXRjaC0+c2lua3NbaV0uaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnR5cGUpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBtVWlkQ2FjaGVkICVkIHBhdGNoRGVzYy0+bVVpZCAlZCB1aWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVpZENhY2hlZCwgcGF0Y2hEZXNjLT5tVWlkLCB1aWQpOworICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQgJiYgdWlkICE9IHBhdGNoRGVzYy0+bVVpZCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmhhbmRsZSA9IDA7CisgICAgfQorCisgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBnZXRPdXRwdXRGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG91dHB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksImR1cGxpY2F0ZWQgb3V0cHV0ICVkIGluIHNvdXJjZSBpbiBwb3J0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDApIHsKKyAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkICE9IHBhdGNoLT5zb3VyY2VzWzBdLmlkKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzb3VyY2UgaWQgZGlmZmVycyBmb3IgcGF0Y2ggY3VycmVudCBpZCAlZCBuZXcgaWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2guc291cmNlc1swXS5pZCwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgbWl4IHRvIGRldmljZXMgY29ubmVjdGlvbgorICAgICAgICAgICAgLy8gVE9ETyBhZGQgc3VwcG9ydCBmb3IgbWl4IHRvIG1peCBjb25uZWN0aW9uCisgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc291cmNlIG1peCBidXQgc2luayBpcyBub3QgYSBkZXZpY2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1tpXS5pZCk7CisgICAgICAgICAgICBpZiAoZGV2RGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBvdXQgZGV2aWNlIG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c2lua3NbaV0uaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+bURldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIHVwZGF0ZWRTYW1wbGluZ1JhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUgLypGSVhNRSovKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcHJvZmlsZSBub3Qgc3VwcG9ydGVkIGZvciBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bURldmljZVR5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZXMuYWRkKGRldkRlc2MpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2VzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWNvbmZpZ3VyZSBvdXRwdXQgZm9ybWF0IGFuZCBjaGFubmVscyBoZXJlCisgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICBkZXZpY2VzLnR5cGVzKCksIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5tSW9IYW5kbGUsIGRldmljZXMudHlwZXMoKSwgdHJ1ZSwgMCwgaGFuZGxlKTsKKyAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDAgJiYgcGF0Y2hEZXNjICE9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHNldE91dHB1dERldmljZSgpIGRpZCBub3QgcmV1c2UgdGhlIHBhdGNoIHByb3ZpZGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gdWlkOworICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzdWNjZXNzIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHNldE91dHB1dERldmljZSgpIGZhaWxlZCB0byBjcmVhdGUgYSBwYXRjaCIpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgIC8vIGlucHV0IGRldmljZSB0byBpbnB1dCBtaXggY29ubmVjdGlvbgorICAgICAgICAgICAgLy8gb25seSBvbmUgc2luayBzdXBwb3J0ZWQgd2hlbiBjb25uZWN0aW5nIGFuIGlucHV0IGRldmljZSB0byBhIG1peAorICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc2lua3MgPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IGdldElucHV0RnJvbUlkKHBhdGNoLT5zaW5rc1swXS5pZCk7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVBhdGNoLnNpbmtzWzBdLmlkICE9IHBhdGNoLT5zaW5rc1swXS5pZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQorICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICBpZiAoZGV2RGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFpbnB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldkRlc2MtPm1EZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLyp1cGRhdGVkU2FtcGxlUmF0ZSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGZvciB0aGUgcGFyYW1ldGVyIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIE5PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPOiByZWNvbmZpZ3VyZSBvdXRwdXQgZm9ybWF0IGFuZCBjaGFubmVscyBoZXJlCisgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNldHRpbmcgZGV2aWNlICUwOHggb24gb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bURldmljZVR5cGUsIGlucHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlLCBkZXZEZXNjLT5tRGV2aWNlVHlwZSwgdHJ1ZSwgaGFuZGxlKTsKKyAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDAgJiYgcGF0Y2hEZXNjICE9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRJbnB1dERldmljZSgpIGRpZCBub3QgcmV1c2UgdGhlIHBhdGNoIHByb3ZpZGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gdWlkOworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc3VjY2VzcyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHNldElucHV0RGV2aWNlKCkgZmFpbGVkIHRvIGNyZWF0ZSBhIHBhdGNoIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIC8vIGRldmljZSB0byBkZXZpY2UgY29ubmVjdGlvbgorICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVBhdGNoLnNvdXJjZXNbMF0uaWQgIT0gcGF0Y2gtPnNvdXJjZXNbMF0uaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgaWYgKHNyY0RldmljZURlc2MgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vdXBkYXRlIHNvdXJjZSBhbmQgc2luayB3aXRoIG91ciBvd24gZGF0YSBhcyB0aGUgZGF0YSBwYXNzZWQgaW4gdGhlIHBhdGNoIG1heQorICAgICAgICAgICAgLy8gYmUgaW5jb21wbGV0ZS4KKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBuZXdQYXRjaCA9ICpwYXRjaDsKKyAgICAgICAgICAgIHNyY0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zb3VyY2VzWzBdLCAmcGF0Y2gtPnNvdXJjZXNbMF0pOworCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc291cmNlIGRldmljZSBidXQgb25lIHNpbmsgaXMgbm90IGEgZGV2aWNlIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlRGVzYyA9CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNpbmtzW2ldLmlkKTsKKyAgICAgICAgICAgICAgICBpZiAoc2lua0RldmljZURlc2MgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaW5rRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNpbmtzW2ldLCAmcGF0Y2gtPnNpbmtzW2ldKTsKKworICAgICAgICAgICAgICAgIGlmIChzcmNEZXZpY2VEZXNjLT5tTW9kdWxlICE9IHNpbmtEZXZpY2VEZXNjLT5tTW9kdWxlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgb25lIHNpbmsgc3VwcG9ydGVkIHdoZW4gY29ubmVjdGVkIGRldmljZXMgYWNyb3NzIEhXIG1vZHVsZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc2lua3MgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZShzaW5rRGV2aWNlRGVzYy0+bURldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc2luayBkZXZpY2UgaXMgcmVhY2hhYmxlIHZpYSBhbiBvcGVuZWQgb3V0cHV0IHN0cmVhbSwgcmVxdWVzdCB0byBnbyB2aWEKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBvdXRwdXQgc3RyZWFtIGJ5IGFkZGluZyBhIHNlY29uZCBzb3VyY2UgdG8gdGhlIHBhdGNoIGRlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zb3VyY2VzWzFdLCAmcGF0Y2gtPnNvdXJjZXNbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgZnJvbSByb3V0aW5nIGNhcGFiaWxpdGllcyBpbiBjb25maWcgZmlsZSBhbmQgb3RoZXIgY29uZmxpY3RpbmcgcGF0Y2hlcworCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmbmV3UGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goKGF1ZGlvX3BhdGNoX2hhbmRsZV90KW5leHRVbmlxdWVJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3UGF0Y2gsIHVpZCk7CisgICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gbmV3UGF0Y2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgICAgICpoYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKK3sKKyAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBwYXRjaCAlZCIsIGhhbmRsZSk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgbVVpZENhY2hlZCAlZCBwYXRjaERlc2MtPm1VaWQgJWQgdWlkICVkIiwKKyAgICAgICAgICBtVWlkQ2FjaGVkLCBwYXRjaERlc2MtPm1VaWQsIHVpZCk7CisgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkICYmIHVpZCAhPSBwYXRjaERlc2MtPm1VaWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2ggPSAmcGF0Y2hEZXNjLT5tUGF0Y2g7CisgICAgcGF0Y2hEZXNjLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IGdldE91dHB1dEZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIG91dHB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5tSW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bUlvSGFuZGxlLCB0cnVlIC8qZnJvbUNhY2hlKi8pLAorICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9IGVsc2UgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IGdldElucHV0RnJvbUlkKHBhdGNoLT5zaW5rc1swXS5pZCk7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBpbnB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNpbmtzWzBdLmlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSk7CisgICAgICAgICAgICByZW1vdmVBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgaWYgKG51bV9wYXRjaGVzID09IE5VTEwgfHwgKCpudW1fcGF0Y2hlcyAhPSAwICYmIHBhdGNoZXMgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgIGdlbmVyYXRpb24gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigibGlzdEF1ZGlvUGF0Y2hlcygpIG51bV9wYXRjaGVzICVkIHBhdGNoZXMgJXAgYXZhaWxhYmxlIHBhdGNoZXMgJXp1IiwKKyAgICAgICAgICAqbnVtX3BhdGNoZXMsIHBhdGNoZXMsIG1BdWRpb1BhdGNoZXMuc2l6ZSgpKTsKKyAgICBpZiAocGF0Y2hlcyA9PSBOVUxMKSB7CisgICAgICAgICpudW1fcGF0Y2hlcyA9IDA7CisgICAgfQorCisgICAgc2l6ZV90IHBhdGNoZXNXcml0dGVuID0gMDsKKyAgICBzaXplX3QgcGF0Y2hlc01heCA9ICpudW1fcGF0Y2hlczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgIGkgIDwgbUF1ZGlvUGF0Y2hlcy5zaXplKCkgJiYgcGF0Y2hlc1dyaXR0ZW4gPCBwYXRjaGVzTWF4OyBpKyspIHsKKyAgICAgICAgcGF0Y2hlc1twYXRjaGVzV3JpdHRlbl0gPSBtQXVkaW9QYXRjaGVzW2ldLT5tUGF0Y2g7CisgICAgICAgIHBhdGNoZXNbcGF0Y2hlc1dyaXR0ZW4rK10uaWQgPSBtQXVkaW9QYXRjaGVzW2ldLT5tSGFuZGxlOworICAgICAgICBBTE9HVigibGlzdEF1ZGlvUGF0Y2hlcygpIHBhdGNoICV6dSBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAorICAgICAgICAgICAgICBpLCBtQXVkaW9QYXRjaGVzW2ldLT5tUGF0Y2gubnVtX3NvdXJjZXMsIG1BdWRpb1BhdGNoZXNbaV0tPm1QYXRjaC5udW1fc2lua3MpOworICAgIH0KKyAgICAqbnVtX3BhdGNoZXMgPSBtQXVkaW9QYXRjaGVzLnNpemUoKTsKKworICAgICpnZW5lcmF0aW9uID0gY3VyQXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzKCkgZ290ICV6dSBwYXRjaGVzIG5lZWRlZCAlZCIsIHBhdGNoZXNXcml0dGVuLCAqbnVtX3BhdGNoZXMpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgQUxPR1YoInNldEF1ZGlvUG9ydENvbmZpZygpIik7CisKKyAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoInNldEF1ZGlvUG9ydENvbmZpZygpIG9uIHBvcnQgaGFuZGxlICVkIiwgY29uZmlnLT5pZCk7CisgICAgLy8gT25seSBzdXBwb3J0IGdhaW4gY29uZmlndXJhdGlvbiBmb3Igbm93CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgIT0gQVVESU9fUE9SVF9DT05GSUdfR0FJTikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8QXVkaW9Qb3J0Q29uZmlnPiBhdWRpb1BvcnRDb25maWc7CisgICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gZ2V0T3V0cHV0RnJvbUlkKGNvbmZpZy0+aWQpOworICAgICAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAic2V0QXVkaW9Qb3J0Q29uZmlnKCkgY2FsbGVkIG9uIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBhdWRpb1BvcnRDb25maWcgPSBvdXRwdXREZXNjOworICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+cm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgeworICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IGdldElucHV0RnJvbUlkKGNvbmZpZy0+aWQpOworICAgICAgICAgICAgaWYgKGlucHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvUG9ydENvbmZpZyA9IGlucHV0RGVzYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7CisgICAgICAgIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgeworICAgICAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKGNvbmZpZy0+aWQpOworICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+cm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgeworICAgICAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChjb25maWctPmlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZURlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBhdWRpb1BvcnRDb25maWcgPSBkZXZpY2VEZXNjOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGJhY2t1cENvbmZpZzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvcnRDb25maWctPmFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZywgJmJhY2t1cENvbmZpZyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbmV3Q29uZmlnOworICAgICAgICBhdWRpb1BvcnRDb25maWctPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIGNvbmZpZyk7CisgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRBdWRpb1BvcnRDb25maWcoJm5ld0NvbmZpZywgMCk7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgYXVkaW9Qb3J0Q29uZmlnLT5hcHBseUF1ZGlvUG9ydENvbmZpZygmYmFja3VwQ29uZmlnKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYXJBdWRpb1BhdGNoZXModWlkX3QgdWlkKQoreworICAgIGZvciAoc3NpemVfdCBpID0gMDsgaSA8IChzc2l6ZV90KW1BdWRpb1BhdGNoZXMuc2l6ZSgpOyBpKyspICB7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCA9PSB1aWQpIHsKKyAgICAgICAgICAgIC8vIHJlbGVhc2VBdWRpb1BhdGNoKCkgcmVtb3ZlcyB0aGUgcGF0Y2ggZnJvbSBtQXVkaW9QYXRjaGVzCisgICAgICAgICAgICBpZiAocmVsZWFzZUF1ZGlvUGF0Y2gobUF1ZGlvUGF0Y2hlcy5rZXlBdChpKSwgdWlkKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkKK3sKKyAgICAqc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpbXBDbGllbnRJbnRlcmZhY2UtPm5ld0F1ZGlvVW5pcXVlSWQoKTsKKyAgICAqaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpbXBDbGllbnRJbnRlcmZhY2UtPm5ld0F1ZGlvVW5pcXVlSWQoKTsKKyAgICAqZGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX0hPVFdPUkQpOworCisgICAgbVNvdW5kVHJpZ2dlclNlc3Npb25zLmFkZCgqc2Vzc2lvbiwgKmlvSGFuZGxlKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygiYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oKSBzZXNzaW9uICVkIG5vdCByZWdpc3RlcmVkIiwgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbVNvdW5kVHJpZ2dlclNlc3Npb25zLnJlbW92ZUl0ZW0oc2Vzc2lvbik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmFkZEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaCkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSk7CisKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBBTE9HVygiYWRkQXVkaW9QYXRjaCgpIHBhdGNoICVkIGFscmVhZHkgaW4iLCBoYW5kbGUpOworICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgfQorICAgIG1BdWRpb1BhdGNoZXMuYWRkKGhhbmRsZSwgcGF0Y2gpOworICAgIEFMT0dWKCJhZGRBdWRpb1BhdGNoKCkgaGFuZGxlICVkIGFmIGhhbmRsZSAlZCBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQgc291cmNlIGhhbmRsZSAlZCIKKyAgICAgICAgICAgICJzaW5rIGhhbmRsZSAlZCIsCisgICAgICAgICAgaGFuZGxlLCBwYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIHBhdGNoLT5tUGF0Y2gubnVtX3NvdXJjZXMsIHBhdGNoLT5tUGF0Y2gubnVtX3NpbmtzLAorICAgICAgICAgIHBhdGNoLT5tUGF0Y2guc291cmNlc1swXS5pZCwgcGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5pZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbW92ZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInJlbW92ZUF1ZGlvUGF0Y2goKSBwYXRjaCAlZCBub3QgaW4iLCBoYW5kbGUpOworICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgfQorICAgIEFMT0dWKCJyZW1vdmVBdWRpb1BhdGNoKCkgaGFuZGxlICVkIGFmIGhhbmRsZSAlZCIsIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpLT5tQWZQYXRjaEhhbmRsZSk7CisgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1ZGlvUG9saWN5TWFuYWdlcgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6Om5leHRVbmlxdWVJZCgpCit7CisgICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCk7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6bmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKQoreworICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19pbmMoJm1BdWRpb1BvcnRHZW5lcmF0aW9uKTsKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKKyAgICA6CisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBUaHJlYWQoZmFsc2UpLAorI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKyAgICBtUHJpbWFyeU91dHB1dCgoYXVkaW9faW9faGFuZGxlX3QpMCksCisgICAgbVBob25lU3RhdGUoQVVESU9fTU9ERV9OT1JNQUwpLAorICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZiksCisgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQoMCksIG1Ub3RhbEVmZmVjdHNNZW1vcnkoMCksCisgICAgbUEyZHBTdXNwZW5kZWQoZmFsc2UpLAorICAgIG1TcGVha2VyRHJjRW5hYmxlZChmYWxzZSksIG1OZXh0VW5pcXVlSWQoMSksCisgICAgbUF1ZGlvUG9ydEdlbmVyYXRpb24oMSkKK3sKKyAgICBtVWlkQ2FjaGVkID0gZ2V0dWlkKCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UgPSBjbGllbnRJbnRlcmZhY2U7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UOyBpKyspIHsKKyAgICAgICAgbUZvcmNlVXNlW2ldID0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgfQorCisgICAgbURlZmF1bHRPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKKyAgICBpZiAobG9hZEF1ZGlvUG9saWN5Q29uZmlnKEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChsb2FkQXVkaW9Qb2xpY3lDb25maWcoQVVESU9fUE9MSUNZX0NPTkZJR19GSUxFKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBsb2FkIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUsIHNldHRpbmcgZGVmYXVsdHMiKTsKKyAgICAgICAgICAgIGRlZmF1bHRBdWRpb1BvbGljeUNvbmZpZygpOworICAgICAgICB9CisgICAgfQorICAgIC8vIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIGFuZCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzIG5vdyBjb250YWluIGFsbCBhdHRhY2hlZCBkZXZpY2VzCisKKyAgICAvLyBtdXN0IGJlIGRvbmUgYWZ0ZXIgcmVhZGluZyB0aGUgcG9saWN5CisgICAgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpOworCisgICAgLy8gb3BlbiBhbGwgb3V0cHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzCisgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgaW5wdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID0gbXBDbGllbnRJbnRlcmZhY2UtPmxvYWRId01vZHVsZShtSHdNb2R1bGVzW2ldLT5tTmFtZSk7CisgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3Qgb3BlbiBIVyBtb2R1bGUgJXMiLCBtSHdNb2R1bGVzW2ldLT5tTmFtZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKKyAgICAgICAgLy8gZXhjZXB0IGZvciBkaXJlY3Qgb3V0cHV0IHN0cmVhbXMgdGhhdCBhcmUgb25seSBvcGVuZWQgd2hlbiB0aGV5IGFyZSBhY3R1YWxseQorICAgICAgICAvLyByZXF1aXJlZCBieSBhbiBhcHAuCisgICAgICAgIC8vIFRoaXMgYWxzbyB2YWxpZGF0ZXMgbUF2YWlsYWJsZU91dHB1dERldmljZXMgbGlzdAorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBvdXRQcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworCisgICAgICAgICAgICBpZiAob3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk91dHB1dCBwcm9maWxlIGNvbnRhaW5zIG5vIGRldmljZSBvbiBtb2R1bGUgJXMiLCBtSHdNb2R1bGVzW2ldLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgob3V0UHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpOworICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZSkgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gbVN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCisgICAgICAgICAgICAgICAgLy8gb3V0cHV0RGV2aWNlVHlwZXMKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG91dHB1dERldmljZVR5cGVzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBvdXRwdXREZXZpY2VUeXBlcykgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihvdXRQcm9maWxlKTsKKworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IHByb2ZpbGVUeXBlOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gb3V0cHV0RGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQob3V0UHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworCisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXS0+bURldmljZVR5cGU7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2Yob3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10pOworICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQorICAgICAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID49IDApICYmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bU1vZHVsZSA9IG1Id01vZHVsZXNbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQgPSBvdXRwdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIG91dHB1dERlc2MpOworICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG9wZW4gaW5wdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMgdG8gdmFsaWRhdGUKKyAgICAgICAgLy8gbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBsaXN0CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gaW5Qcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXNbal07CisKKyAgICAgICAgICAgIGlmIChpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBwcm9maWxlIGNvbnRhaW5zIG5vIGRldmljZSBvbiBtb2R1bGUgJXMiLCBtSHdNb2R1bGVzW2ldLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaG9zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBtU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKKyAgICAgICAgICAgIC8vIGlucHV0RGV2aWNlVHlwZXMKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlID0gaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXS0+bURldmljZVR5cGU7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVUeXBlICYgaW5wdXREZXZpY2VUeXBlcykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgaW5wdXREZXZpY2VUeXBlcykgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihpblByb2ZpbGUpOworCisgICAgICAgICAgICBpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CisgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBwcm9maWxlVHlwZTsKKworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGlucHV0RGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IGlucHV0RGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KGluUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5pbmRleE9mKGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10pOworICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQorICAgICAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID49IDApICYmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XS0+bUlkID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XS0+bUlkID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XS0+bU1vZHVsZSA9IG1Id01vZHVsZXNbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gaW5wdXQgc3RyZWFtIGZvciBkZXZpY2UgJTA4eCBvbiBodyBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBtSHdNb2R1bGVzW2ldLT5tTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gbWFrZSBzdXJlIGFsbCBhdHRhY2hlZCBkZXZpY2VzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYSB1bmlxdWUgSUQKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7KSB7CisgICAgICAgIGlmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+bUlkID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBkZXZpY2UgJTA4eCB1bnJlYWNoYWJsZSIsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5tRGV2aWNlVHlwZSk7CisgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTspIHsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1JZCA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiSW5wdXQgZGV2aWNlICUwOHggdW5yZWFjaGFibGUiLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tRGV2aWNlVHlwZSk7CisgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgLy8gbWFrZSBzdXJlIGRlZmF1bHQgZGV2aWNlIGlzIHJlYWNoYWJsZQorICAgIGlmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKG1EZWZhdWx0T3V0cHV0RGV2aWNlKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIkRlZmF1bHQgZGV2aWNlICUwOHggaXMgdW5yZWFjaGFibGUiLCBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGUpOworICAgIH0KKworICAgIEFMT0dFX0lGKChtUHJpbWFyeU91dHB1dCA9PSAwKSwgIkZhaWxlZCB0byBvcGVuIHByaW1hcnkgb3V0cHV0Iik7CisKKyAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBpZiAobVByaW1hcnlPdXRwdXQgIT0gMCkgeworICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLCAwKTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVByaW1hcnlPdXRwdXQsIG91dHB1dENtZC50b1N0cmluZygpKTsKKworICAgICAgICBtVGVzdERldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgbVRlc3RTYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICAgICAgbVRlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgbVRlc3RDaGFubmVscyA9ICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgICAgIG1UZXN0TGF0ZW5jeU1zID0gMDsKKyAgICAgICAgbUN1ck91dHB1dCA9IDA7CisgICAgICAgIG1EaXJlY3RPdXRwdXQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVEVTVF9PVVRQVVRTOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0T3V0cHV0c1tpXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICAgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvUG9saWN5TWFuYWdlclRlc3QiKTsKKyAgICAgICAgcnVuKGJ1ZmZlciwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgfQorI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjp+QXVkaW9Qb2xpY3lNYW5hZ2VyKCkKK3sKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIGV4aXQoKTsKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtT3V0cHV0cy5rZXlBdChpKSk7CisgICB9CisgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlucHV0cy5rZXlBdChpKSk7CisgICB9CisgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jbGVhcigpOworICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5jbGVhcigpOworICAgbU91dHB1dHMuY2xlYXIoKTsKKyAgIG1JbnB1dHMuY2xlYXIoKTsKKyAgIG1Id01vZHVsZXMuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0Q2hlY2soKQoreworICAgIHJldHVybiAobVByaW1hcnlPdXRwdXQgPT0gMCkgPyBOT19JTklUIDogTk9fRVJST1I7Cit9CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnRocmVhZExvb3AoKQoreworICAgIEFMT0dWKCJlbnRlcmluZyB0aHJlYWRMb29wKCkiKTsKKyAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCisgICAgeworICAgICAgICBTdHJpbmc4IGNvbW1hbmQ7CisgICAgICAgIGludCB2YWx1ZUludDsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtV2FpdFdvcmtDVi53YWl0UmVsYXRpdmUobUxvY2ssIG1pbGxpc2Vjb25kcyg1MCkpOworCisgICAgICAgIGNvbW1hbmQgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygwLCBTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSk7CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoY29tbWFuZCk7CisKKyAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SICYmCisgICAgICAgICAgICB2YWx1ZUludCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigiVGVzdCBjb21tYW5kICVzIHJlY2VpdmVkIiwgY29tbWFuZC5zdHJpbmcoKSk7CisgICAgICAgICAgICBTdHJpbmc4IHRhcmdldDsKKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGFyZ2V0IiksIHRhcmdldCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSAiTWFuYWdlciI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9vdXRwdXQiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9vdXRwdXQiKSk7CisgICAgICAgICAgICAgICAgbUN1ck91dHB1dCA9IHZhbHVlSW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfZGlyZWN0IiksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfZGlyZWN0IikpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiZmFsc2UiKSB7CisgICAgICAgICAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJ0cnVlIikgeworICAgICAgICAgICAgICAgICAgICBtRGlyZWN0T3V0cHV0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9pbnB1dCIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2lucHV0IikpOworICAgICAgICAgICAgICAgIG1UZXN0SW5wdXQgPSB2YWx1ZUludDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfZm9ybWF0IiksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfZm9ybWF0IikpOworICAgICAgICAgICAgICAgIGludCBmb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gIlBDTSAxNiBiaXRzIikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJQQ00gOCBiaXRzIikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzhfQklUOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIkNvbXByZXNzZWQgTVAzIikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfTVAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdEZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0UGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyYW0uYWRkSW50KFN0cmluZzgoImZvcm1hdCIpLCBmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2NoYW5uZWxzIiksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfY2hhbm5lbHMiKSk7CisgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzID0gMDsKKworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiQ2hhbm5lbHMgU3RlcmVvIikgeworICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9ICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiQ2hhbm5lbHMgTW9ubyIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0Q2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0UGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyYW0uYWRkSW50KFN0cmluZzgoImNoYW5uZWxzIiksIGNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9zYW1wbGVSYXRlIiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfc2FtcGxlUmF0ZSIpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWVJbnQgPj0gMCAmJiB2YWx1ZUludCA8PSA5NjAwMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxpbmdSYXRlID0gdmFsdWVJbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0UGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyYW0uYWRkSW50KFN0cmluZzgoInNhbXBsaW5nX3JhdGUiKSwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3Jlb3BlbiIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3Jlb3BlbiIpKTsKKworICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobVByaW1hcnlPdXRwdXQpOworCisgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSA9IG91dHB1dERlc2MtPm1Nb2R1bGUtPm1IYW5kbGU7CisKKyAgICAgICAgICAgICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKG1QcmltYXJ5T3V0cHV0KTsKKworICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IoTlVMTCk7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBvdXRwdXREZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KG1vZHVsZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVByaW1hcnlPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVvcGVuIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzYW1wbGluZ1JhdGU6ICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUsIG91dHB1dERlc2MtPm1Gb3JtYXQsIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksIDApOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtUHJpbWFyeU91dHB1dCwgb3V0cHV0Q21kLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQobVByaW1hcnlPdXRwdXQsIG91dHB1dERlc2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycygwLCBTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3k9IikpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmV4aXQoKQoreworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICAgICAgcmVxdWVzdEV4aXQoKTsKKyAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CisgICAgfQorICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOworfQorCitpbnQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp0ZXN0T3V0cHV0SW5kZXgoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RFU1RfT1VUUFVUUzsgaSsrKSB7CisgICAgICAgIGlmIChvdXRwdXQgPT0gbVRlc3RPdXRwdXRzW2ldKSByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisvLyAtLS0KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmFkZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYykKK3sKKyAgICBvdXRwdXREZXNjLT5tSW9IYW5kbGUgPSBvdXRwdXQ7CisgICAgb3V0cHV0RGVzYy0+bUlkID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgbU91dHB1dHMuYWRkKG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmFkZElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjKQoreworICAgIGlucHV0RGVzYy0+bUlvSGFuZGxlID0gaW5wdXQ7CisgICAgaW5wdXREZXNjLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICBtSW5wdXRzLmFkZChpbnB1dCwgaW5wdXREZXNjKTsKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmluZElvSGFuZGxlc0J5QWRkcmVzcyhzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgLyppbiovLAorICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MgLyppbiovLAorICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzIC8qb3V0Ki8pIHsKKyAgICAvLyBsb29rIGZvciBhIG1hdGNoIG9uIHRoZSBnaXZlbiBhZGRyZXNzIG9uIHRoZSBhZGRyZXNzZXMgb2YgdGhlIG91dHB1dHM6CisgICAgLy8gZmluZCB0aGUgYWRkcmVzcyBieSBmaW5kaW5nIHRoZSBwYXRjaCB0aGF0IG1hcHMgdG8gdGhpcyBvdXRwdXQKKyAgICBzc2l6ZV90IHBhdGNoSWR4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGRlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgLy9BTE9HVigiICAgIGluc3BlY3Rpbmcgb3V0cHV0ICVkIChwYXRjaCAlZCkgZm9yIHN1cHBvcnRlZCBkZXZpY2U9MHgleCIsCisgICAgLy8gICAgICAgIG91dHB1dElkeCwgcGF0Y2hJZHgsICBkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSk7CisgICAgaWYgKHBhdGNoSWR4ID49IDApIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KHBhdGNoSWR4KTsKKyAgICAgICAgY29uc3QgaW50IG51bVNpbmtzID0gcGF0Y2hEZXNjLT5tUGF0Y2gubnVtX3NpbmtzOworICAgICAgICBmb3IgKHNzaXplX3Qgaj0wOyBqIDwgbnVtU2lua3M7IGorKykgeworICAgICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVBhdGNoLnNpbmtzW2pdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhdGNoQWRkciA9CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaC5zaW5rc1tqXS5leHQuZGV2aWNlLmFkZHJlc3M7CisgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAocGF0Y2hBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmluZElvSGFuZGxlc0J5QWRkcmVzcygpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCBvbiBzYW1lIGFkZHJlc3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Jb0hhbmRsZSwgIHBhdGNoRGVzYy0+bVBhdGNoLnNpbmtzW2pdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKGRlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpCit7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldkRlc2MtPm1EZXZpY2VUeXBlOworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKKyAgICAvLyBlcmFzZSBhbGwgY3VycmVudCBzYW1wbGUgcmF0ZXMsIGZvcm1hdHMgYW5kIGNoYW5uZWwgbWFza3MKKyAgICBkZXZEZXNjLT5jbGVhckNhcGFiaWxpdGllcygpOworCisgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSB7CisgICAgICAgIC8vIGZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIG91dHB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCIsIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgIGNoZWNraW5nIGFkZHJlc3MgbWF0Y2ggZHVlIHRvIGRldmljZSAweCV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhkZXNjLCBhZGRyZXNzLCBvdXRwdXRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gdGhlbiBsb29rIGZvciBvdXRwdXQgcHJvZmlsZXMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCisgICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8SU9Qcm9maWxlPiA+IHByb2ZpbGVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal0tPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXp1IiwgaiwgaSk7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCIgIGZvdW5kICVkIHByb2ZpbGVzLCAlZCBvdXRwdXRzIiwgcHJvZmlsZXMuc2l6ZSgpLCBvdXRwdXRzLnNpemUoKSk7CisKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3BlbiBvdXRwdXRzIGZvciBtYXRjaGluZyBwcm9maWxlcyBpZiBuZWVkZWQuIERpcmVjdCBvdXRwdXRzIGFyZSBhbHNvIG9wZW5lZCB0bworICAgICAgICAvLyBxdWVyeSBmb3IgZHluYW1pYyBwYXJhbWV0ZXJzIGFuZCB3aWxsIGJlIGNsb3NlZCBsYXRlciBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKQorICAgICAgICBmb3IgKHNzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7IHByb2ZpbGVfaW5kZXggPCAoc3NpemVfdClwcm9maWxlcy5zaXplKCk7IHByb2ZpbGVfaW5kZXgrKykgeworICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gcHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgb25lIG91dHB1dCBpcyBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlCisgICAgICAgICAgICBzaXplX3QgajsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHMuaXRlbUF0KGopKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcHJvZmlsZTogc2F2ZSB0aGUgc2FtcGxlIHJhdGVzLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFza3Mgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBwcm9maWxlIGluIG91ciBkZXZpY2UgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqICE9IG91dHB1dHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCkpOworICAgICAgICAgICAgZGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSk7CisgICAgICAgICAgICBkZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1GbGFncyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworCisgICAgICAgICAgICAgICAgLy8gSGVyZSBpcyB3aGVyZSB0aGUgb3V0X3NldF9wYXJhbWV0ZXJzKCkgZm9yIGNhcmQgJiBkZXZpY2UgZ2V0cyBjYWxsZWQKKyAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZSwgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgU3RyaW5nOChwYXJhbSkpOworICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHdlIHN0ZXAgdGhyb3VnaCBhbmQgcmVzb2x2ZSBhbnkgImR5bmFtaWMiIGZpZWxkcworICAgICAgICAgICAgICAgIFN0cmluZzggcmVwbHk7CisgICAgICAgICAgICAgICAgY2hhciAqdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfU0FNUExJTkdfUkFURVMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0ZPUk1BVFMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHN1cHBvcnRlZCBmb3JtYXRzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfQ0hBTk5FTFMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkT3V0Q2hhbm5lbHModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPCAyKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA8IDIpKSB8fAorICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpIDwgMikpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBtaXNzaW5nIHBhcmFtIik7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDAgfHwgcHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gcHJvZmlsZS0+cGlja1NhbXBsaW5nUmF0ZSgpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gcHJvZmlsZS0+cGlja0NoYW5uZWxNYXNrKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBwcm9maWxlLT5waWNrRm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBjb25maWcuZm9ybWF0OworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIGRlc2MpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHVwbGljYXRlZE91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaW5pdGlhbCBzdHJlYW0gdm9sdW1lIGZvciBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXQsIGRldmljZSwgMCwgdHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogY29uZmlndXJlIGF1ZGlvIGVmZmVjdCBvdXRwdXQgc3RhZ2UgaGVyZQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcGVuIGEgZHVwbGljYXRpbmcgb3V0cHV0IHRocmVhZCBmb3IgdGhlIG5ldyBvdXRwdXQgYW5kIHRoZSBwcmltYXJ5IG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlZE91dHB1dCA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVwbGljYXRlZE91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBkdXBsaWNhdGVkIG91dHB1dCBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXREZXNjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IoTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bU91dHB1dDIgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1Gb3JtYXQgPSBkZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tTGF0ZW5jeSA9IGRlc2MtPm1MYXRlbmN5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChkdXBsaWNhdGVkT3V0cHV0LCBkdXBPdXRwdXREZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMoZHVwbGljYXRlZE91dHB1dCwgZGV2aWNlLCAwLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNvdWxkIG5vdCBvcGVuIGR1cCBvdXRwdXQgZm9yICVkIGFuZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNvdWxkIG5vdCBvcGVuIG91dHB1dCBmb3IgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmVBdChwcm9maWxlX2luZGV4KTsKKyAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LS07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG91dHB1dCk7CisgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworCisgICAgICAgICAgICAgICAgaWYgKGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IHNldE91dHB1dERldmljZShkZXY9MHgleCwgYWRkcj0lcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXQsIGRldmljZSwgdHJ1ZS8qZm9yY2UqLywgMC8qZGVsYXkqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLypwYXRjaCBoYW5kbGUqLywgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBEaXNjb25uZWN0CisgICAgICAgIC8vIGNoZWNrIGlmIG9uZSBvcGVuZWQgb3V0cHV0IGlzIG5vdCBuZWVkZWQgYW55IG1vcmUgYWZ0ZXIgZGlzY29ubmVjdGluZyBvbmUgZGV2aWNlCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICAgICAgICAgIGlmICAoIShkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGRldmljZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YWN0IG1hdGNoIG9uIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpID09IGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhkZXNjLCBhZGRyZXNzLCBvdXRwdXRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2xlYXIgYW55IHByb2ZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlzY29ubmVjdGVkIGRldmljZS4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsZWFyaW5nIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICV6dSIsIGosIGkpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmFkZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0lucHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKQoreworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBkZXNjOworICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgeworICAgICAgICAvLyBmaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBpbnB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCisgICAgICAgIGZvciAoc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgeworICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CisgICAgICAgICAgICBpZiAoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiAoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvcGVuZWQgaW5wdXQgJWQiLCBtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CisgICAgICAgICAgICAgICBpbnB1dHMuYWRkKG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZW4gbG9vayBmb3IgaW5wdXQgcHJvZmlsZXMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCisgICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8SU9Qcm9maWxlPiA+IHByb2ZpbGVzOworICAgICAgICBmb3IgKHNpemVfdCBtb2R1bGVfaWR4ID0gMDsgbW9kdWxlX2lkeCA8IG1Id01vZHVsZXMuc2l6ZSgpOyBtb2R1bGVfaWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW21vZHVsZV9pZHhdLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgbUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1JbnB1dFByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAmIChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBtb2R1bGVfaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1JbnB1dFByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIGlucHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcGVuIGlucHV0cyBmb3IgbWF0Y2hpbmcgcHJvZmlsZXMgaWYgbmVlZGVkLiBEaXJlY3QgaW5wdXRzIGFyZSBhbHNvIG9wZW5lZCB0bworICAgICAgICAvLyBxdWVyeSBmb3IgZHluYW1pYyBwYXJhbWV0ZXJzIGFuZCB3aWxsIGJlIGNsb3NlZCBsYXRlciBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKQorICAgICAgICBmb3IgKHNzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7IHByb2ZpbGVfaW5kZXggPCAoc3NpemVfdClwcm9maWxlcy5zaXplKCk7IHByb2ZpbGVfaW5kZXgrKykgeworCisgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBwcm9maWxlc1twcm9maWxlX2luZGV4XTsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgb25lIGlucHV0IGlzIGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUKKyAgICAgICAgICAgIHNpemVfdCBpbnB1dF9pbmRleDsKKyAgICAgICAgICAgIGZvciAoaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlucHV0X2luZGV4ICE9IG1JbnB1dHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIGlucHV0IGZvciBkZXZpY2UgMHglWCB3aXRoIHBhcmFtcyAlcyIsIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICBkZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKHByb2ZpbGUpOworICAgICAgICAgICAgZGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5JbnB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUgLypGSVhNRSovKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICBkZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKworICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIFN0cmluZzgocGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwYXJhbSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSGVyZSBpcyB3aGVyZSB3ZSBzdGVwIHRocm91Z2ggYW5kIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMKKyAgICAgICAgICAgICAgICBTdHJpbmc4IHJlcGx5OworICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfU0FNUExJTkdfUkFURVMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IHN1cCBzYW1wbGluZyByYXRlcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfRk9STUFUUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgc3VwIGZvcm1hdHMgJXMiLCByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfQ0hBTk5FTFMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IHN1cCBjaGFubmVsIG1hc2tzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkSW5DaGFubmVscyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApICYmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPCAyKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gMCkgJiYgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA8IDIpKSB8fAorICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApICYmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA8IDIpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgbWlzc2luZyBwYXJhbSIpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlucHV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkSW5wdXQoaW5wdXQsIGRlc2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy8gZW5kaWYgaW5wdXQgIT0gMAorCisgICAgICAgICAgICBpZiAoaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBpbnB1dCBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOworICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5wdXRzLmFkZChpbnB1dCk7CisgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBlbmQgc2NhbiBwcm9maWxlcworCisgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBEaXNjb25uZWN0CisgICAgICAgIC8vIGNoZWNrIGlmIG9uZSBvcGVuZWQgaW5wdXQgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBhZnRlciBkaXNjb25uZWN0aW5nIG9uZSBkZXZpY2UKKyAgICAgICAgZm9yIChzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CisgICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKKyAgICAgICAgICAgIGlmICghKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBkaXNjb25uZWN0aW5nIGFkZGluZyBpbnB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgICAgICAgICAgICAgIGlucHV0cy5hZGQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENsZWFyIGFueSBwcm9maWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCisgICAgICAgIGZvciAoc2l6ZV90IG1vZHVsZV9pbmRleCA9IDA7IG1vZHVsZV9pbmRleCA8IG1Id01vZHVsZXMuc2l6ZSgpOyBtb2R1bGVfaW5kZXgrKykgeworICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlX2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspIHsKKyAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW21vZHVsZV9pbmRleF0tPm1JbnB1dFByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBjbGVhcmluZyBkaXJlY3QgaW5wdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIG1vZHVsZV9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8vIGVuZCBkaXNjb25uZWN0CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBBTE9HVigiY2xvc2VPdXRwdXQoJWQpIiwgb3V0cHV0KTsKKworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiY2xvc2VPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBsb29rIGZvciBkdXBsaWNhdGVkIG91dHB1dHMgY29ubmVjdGVkIHRvIHRoZSBvdXRwdXQgYmVpbmcgcmVtb3ZlZC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZHVwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkdXBPdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJgorICAgICAgICAgICAgICAgIChkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9PSBvdXRwdXREZXNjIHx8CisgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bU91dHB1dDIgPT0gb3V0cHV0RGVzYykpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYzI7CisgICAgICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYykgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBcyBhbGwgYWN0aXZlIHRyYWNrcyBvbiBkdXBsaWNhdGVkIG91dHB1dCB3aWxsIGJlIGRlbGV0ZWQsCisgICAgICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiB0aGUgb3RoZXIgb3V0cHV0LCB0aGUgcmVmZXJlbmNlCisgICAgICAgICAgICAvLyBjb3VudCBmb3IgdGhlaXIgc3RyZWFtIHR5cGUgbXVzdCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSBvbgorICAgICAgICAgICAgLy8gdGhlIG90aGVyIG91dHB1dC4KKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgQVVESU9fU1RSRUFNX0NOVDsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IHJlZkNvdW50ID0gZHVwT3V0cHV0RGVzYy0+bVJlZkNvdW50W2pdOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MyLT5jaGFuZ2VSZWZDb3VudCgoYXVkaW9fc3RyZWFtX3R5cGVfdClqLC1yZWZDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgICAgICBBTE9HVigiY2xvc2VPdXRwdXQoKSBjbG9zaW5nIGFsc28gZHVwbGljYXRlZCBvdXRwdXQgJWQiLCBkdXBsaWNhdGVkT3V0cHV0KTsKKworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KGR1cGxpY2F0ZWRPdXRwdXQpOworICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShkdXBsaWNhdGVkT3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KKworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgIHBhcmFtLmFkZChTdHJpbmc4KCJjbG9zaW5nIiksIFN0cmluZzgoInRydWUiKSk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBwYXJhbS50b1N0cmluZygpKTsKKworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKKyAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQoreworICAgIEFMT0dWKCJjbG9zZUlucHV0KCVkKSIsIGlucHV0KTsKKworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKKyAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImNsb3NlSW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9CisKKyAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7CisgICAgbUlucHV0cy5yZW1vdmVJdGVtKGlucHV0KTsKK30KKworU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+IG9wZW5PdXRwdXRzKQoreworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKKworICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZW5PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWVigib3V0cHV0ICVkIGlzRHVwbGljYXRlZD0lZCBkZXZpY2U9JTA0eCIsCisgICAgICAgICAgICAgICAgaSwgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGVkKCksIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgICAgIGlmICgoZGV2aWNlICYgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKSA9PSBkZXZpY2UpIHsKKyAgICAgICAgICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGZvdW5kIG91dHB1dCAlZCIsIG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgIG91dHB1dHMuYWRkKG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0cHV0czsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czIpCit7CisgICAgaWYgKG91dHB1dHMxLnNpemUoKSAhPSBvdXRwdXRzMi5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMxLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChvdXRwdXRzMVtpXSAhPSBvdXRwdXRzMltpXSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQoreworICAgIGF1ZGlvX2RldmljZXNfdCBvbGREZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc3JjT3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2Uob2xkRGV2aWNlLCBtUHJldmlvdXNPdXRwdXRzKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGRzdE91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG5ld0RldmljZSwgbU91dHB1dHMpOworCisgICAgaWYgKCF2ZWN0b3JzRXF1YWwoc3JjT3V0cHV0cyxkc3RPdXRwdXRzKSkgeworICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIHN0cmF0ZWd5ICVkLCBtb3ZpbmcgZnJvbSBvdXRwdXQgJWQgdG8gb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgc3RyYXRlZ3ksIHNyY091dHB1dHNbMF0sIGRzdE91dHB1dHNbMF0pOworICAgICAgICAvLyBtdXRlIHN0cmF0ZWd5IHdoaWxlIG1vdmluZyB0cmFja3MgZnJvbSBvbmUgb3V0cHV0IHRvIGFub3RoZXIKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzcmNPdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihzcmNPdXRwdXRzW2ldKTsKKyAgICAgICAgICAgIGlmIChkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHN0cmF0ZWd5KSkgeworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgdHJ1ZSwgc3JjT3V0cHV0c1tpXSk7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCBmYWxzZSwgc3JjT3V0cHV0c1tpXSwgTVVURV9USU1FX01TLCBuZXdEZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTW92ZSBlZmZlY3RzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0CisgICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgeworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZnhPdXRwdXQgPSBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGRzdE91dHB1dHMpOworICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBtb3ZlZDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbUVmZmVjdHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZWZmZWN0RGVzYy0+bVNlc3Npb24gPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmCisgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tSW8gIT0gZnhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVkLmluZGV4T2YoZWZmZWN0RGVzYy0+bUlvKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgbW92aW5nIGVmZmVjdCAlZCB0byBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHMua2V5QXQoaSksIGZ4T3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5tb3ZlRWZmZWN0cyhBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIGVmZmVjdERlc2MtPm1JbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeE91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlZC5hZGQoZWZmZWN0RGVzYy0+bUlvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tSW8gPSBmeE91dHB1dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gTW92ZSB0cmFja3MgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5IGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKSA9PSBzdHJhdGVneSkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KWkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKK3sKKyAgICBpZiAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQorICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUpOworICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCisgICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04pOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRik7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QTJkcE91dHB1dCgpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmIG91dHB1dERlc2MtPmRldmljZSgpICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgeworICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0EyZHBTdXNwZW5kKCkKK3sKKyAgICBhdWRpb19pb19oYW5kbGVfdCBhMmRwT3V0cHV0ID0gZ2V0QTJkcE91dHB1dCgpOworICAgIGlmIChhMmRwT3V0cHV0ID09IDApIHsKKyAgICAgICAgbUEyZHBTdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgaXNTY29Db25uZWN0ZWQgPQorICAgICAgICAgICAgKG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpICE9IDA7CisgICAgLy8gc3VzcGVuZCBBMkRQIG91dHB1dCBpZjoKKyAgICAvLyAgICAgIChOT1QgYWxyZWFkeSBzdXNwZW5kZWQpICYmCisgICAgLy8gICAgICAoKFNDTyBkZXZpY2UgaXMgY29ubmVjdGVkICYmCisgICAgLy8gICAgICAgKGZvcmNlZCB1c2FnZSBmb3IgY29tbXVuaWNhdGlvbiB8fCBmb3IgcmVjb3JkIGlzIFNDTykpKSB8fAorICAgIC8vICAgICAgKHBob25lIHN0YXRlIGlzIHJpbmdpbmcgfHwgaW4gY2FsbCkKKyAgICAvLworICAgIC8vIHJlc3RvcmUgQTJEUCBvdXRwdXQgaWY6CisgICAgLy8gICAgICAoQWxyZWFkeSBzdXNwZW5kZWQpICYmCisgICAgLy8gICAgICAoKFNDTyBkZXZpY2UgaXMgTk9UIGNvbm5lY3RlZCB8fAorICAgIC8vICAgICAgIChmb3JjZWQgdXNhZ2UgTk9UIGZvciBjb21tdW5pY2F0aW9uICYmIE5PVCBmb3IgcmVjb3JkIGlzIFNDTykpKSAmJgorICAgIC8vICAgICAgKHBob25lIHN0YXRlIGlzIE5PVCByaW5naW5nICYmIE5PVCBpbiBjYWxsKQorICAgIC8vCisgICAgaWYgKG1BMmRwU3VzcGVuZGVkKSB7CisgICAgICAgIGlmICgoIWlzU2NvQ29ubmVjdGVkIHx8CisgICAgICAgICAgICAgKChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSAmJgorICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkpICYmCisgICAgICAgICAgICAgKChtUGhvbmVTdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwpICYmCisgICAgICAgICAgICAgIChtUGhvbmVTdGF0ZSAhPSBBVURJT19NT0RFX1JJTkdUT05FKSkpIHsKKworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlc3RvcmVPdXRwdXQoYTJkcE91dHB1dCk7CisgICAgICAgICAgICBtQTJkcFN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChpc1Njb0Nvbm5lY3RlZCAmJgorICAgICAgICAgICAgICgobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgfHwKKyAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpKSB8fAorICAgICAgICAgICAgICgobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fAorICAgICAgICAgICAgICAobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSkpKSB7CisKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdXNwZW5kT3V0cHV0KGEyZHBPdXRwdXQpOworICAgICAgICAgICAgbUEyZHBTdXNwZW5kZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBib29sIGZyb21DYWNoZSkKK3sKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworCisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCkgeworICAgICAgICAgICAgQUxPR1YoImdldE5ld091dHB1dERldmljZSgpIGRldmljZSAlMDh4IGZvcmNlZCBieSBwYXRjaCAlZCIsCisgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2UoKSwgb3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNoZWNrIHRoZSBmb2xsb3dpbmcgYnkgb3JkZXIgb2YgcHJpb3JpdHkgdG8gcmVxdWVzdCBhIHJvdXRpbmcgY2hhbmdlIGlmIG5lY2Vzc2FyeToKKyAgICAvLyAxOiB0aGUgc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZSBpcyBhY3RpdmUgYW5kIGVuZm9yY2VkIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlCisgICAgLy8gMjogd2UgYXJlIGluIGNhbGwgb3IgdGhlIHN0cmF0ZWd5IHBob25lIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgcGhvbmUKKyAgICAvLyAzOiB0aGUgc3RyYXRlZ3kgZm9yIGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIGJ1dCBub3QgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSB0aGUgZGV2aWNlIGZvciBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlCisgICAgLy8gNDogdGhlIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbgorICAgIC8vIDU6IHRoZSBzdHJhdGVneSAicmVzcGVjdGZ1bCIgc29uaWZpY2F0aW9uIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgInJlc3BlY3RmdWwiIHNvbmlmaWNhdGlvbgorICAgIC8vIDY6IHRoZSBzdHJhdGVneSBtZWRpYSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IG1lZGlhCisgICAgLy8gNzogdGhlIHN0cmF0ZWd5IERUTUYgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBEVE1GCisgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkgJiYKKyAgICAgICAgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChpc0luQ2FsbCgpIHx8CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfUEhPTkUpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9NRURJQSkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX0RUTUYpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0RUTUYsIGZyb21DYWNoZSk7CisgICAgfQorCisgICAgQUxPR1YoImdldE5ld091dHB1dERldmljZSgpIHNlbGVjdGVkIGRldmljZSAleCIsIGRldmljZSk7CisgICAgcmV0dXJuIGRldmljZTsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOworCisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0TmV3SW5wdXREZXZpY2UoKSBkZXZpY2UgJTA4eCBmb3JjZWQgYnkgcGF0Y2ggJWQiLAorICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLCBpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjLT5tRGV2aWNlOworICAgICAgICB9CisgICAgfQorCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKGlucHV0RGVzYy0+bUlucHV0U291cmNlKTsKKworICAgIEFMT0dWKCJnZXROZXdJbnB1dERldmljZSgpIHNlbGVjdGVkIGRldmljZSAleCIsIGRldmljZSk7CisgICAgcmV0dXJuIGRldmljZTsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeworICAgIHJldHVybiAodWludDMyX3QpZ2V0U3RyYXRlZ3koc3RyZWFtKTsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeworICAgIC8vIEJ5IGNoZWNraW5nIHRoZSByYW5nZSBvZiBzdHJlYW0gYmVmb3JlIGNhbGxpbmcgZ2V0U3RyYXRlZ3ksIHdlIGF2b2lkCisgICAgLy8gZ2V0U3RyYXRlZ3kncyBiZWhhdmlvciBmb3IgaW52YWxpZCBzdHJlYW1zLiAgZ2V0U3RyYXRlZ3kgd291bGQgZG8gYSBBTE9HRQorICAgIC8vIGFuZCB0aGVuIHJldHVybiBTVFJBVEVHWV9NRURJQSwgYnV0IHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBlbXB0eSBzZXQuCisgICAgaWYgKHN0cmVhbSA8IChhdWRpb19zdHJlYW1fdHlwZV90KSAwIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB9CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXM7CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKKyAgICBkZXZpY2VzID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2VzLCBtT3V0cHV0cyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShzdHJhdGVneSkpIHsKKyAgICAgICAgICAgIGRldmljZXMgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLypGaWx0ZXIgU1BFQUtFUl9TQUZFIG91dCBvZiByZXN1bHRzLCBhcyBBdWRpb1NlcnZpY2UgZG9lc24ndCBrbm93IGFib3V0IGl0CisgICAgICBhbmQgZG9lc24ndCByZWFsbHkgbmVlZCB0by4qLworICAgIGlmIChkZXZpY2VzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpIHsKKyAgICAgICAgZGV2aWNlcyB8PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIGRldmljZXMgJj0gfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgIH0KKworICAgIHJldHVybiBkZXZpY2VzOworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6OnJvdXRpbmdfc3RyYXRlZ3kgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneSgKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKKyAgICAvLyBzdHJlYW0gdG8gc3RyYXRlZ3kgbWFwcGluZworICAgIHN3aXRjaCAoc3RyZWFtKSB7CisgICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfUEhPTkU7CisgICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTjsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfRFRNRjsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgidW5rbm93biBzdHJlYW0gdHlwZSIpOworICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKKyAgICAgICAgLy8gTk9URTogU1lTVEVNIHN0cmVhbSB1c2VzIE1FRElBIHN0cmF0ZWd5IGJlY2F1c2UgbXV0aW5nIG11c2ljIGFuZCBzd2l0Y2hpbmcgb3V0cHV0cworICAgICAgICAvLyB3aGlsZSBrZXkgY2xpY2tzIGFyZSBwbGF5ZWQgcHJvZHVjZXMgYSBwb29yIHJlc3VsdAorICAgIGNhc2UgQVVESU9fU1RSRUFNX1RUUzoKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX01FRElBOworICAgIGNhc2UgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFOworICAgIH0KK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKSB7CisgICAgLy8gZmxhZ3MgdG8gc3RyYXRlZ3kgbWFwcGluZworICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgeworICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFOworICAgIH0KKworICAgIC8vIHVzYWdlIHRvIHN0cmF0ZWd5IG1hcHBpbmcKKyAgICBzd2l0Y2ggKGF0dHItPnVzYWdlKSB7CisgICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfTUVESUE7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1BIT05FOworCisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX0RUTUY7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfU09OSUZJQ0FUSU9OOworCisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOworCisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX01FRElBOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKKyAgICBzd2l0Y2goc3RyZWFtKSB7CisgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpOworICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCit7CisgICAgdWludDMyX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisKKyAgICBpZiAoZnJvbUNhY2hlKSB7CisgICAgICAgIEFMT0dWVigiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBmcm9tIGNhY2hlIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXgiLAorICAgICAgICAgICAgICBzdHJhdGVneSwgbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XSk7CisgICAgICAgIHJldHVybiBtRGV2aWNlRm9yU3RyYXRlZ3lbc3RyYXRlZ3ldOworICAgIH0KKyAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOworICAgIHN3aXRjaCAoc3RyYXRlZ3kpIHsKKworICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw6CisgICAgICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICB9IGVsc2UgaWYgKGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoQVVESU9fU1RSRUFNX01VU0lDLAorICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgeworICAgICAgICAgICAgLy8gd2hpbGUgbWVkaWEgaXMgcGxheWluZyBvbiBhIHJlbW90ZSBkZXZpY2UsIHVzZSB0aGUgdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvci4KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSB0ZXN0IHRoaXMgdXNlY2FzZSBiZWZvcmUgdGVzdGluZyBpZiBtZWRpYSBpcyBwbGF5aW5nIGJlY2F1c2UKKyAgICAgICAgICAgIC8vICAgdGhlIGlzU3RyZWFtQWN0aXZlKCkgbWV0aG9kIG9ubHkgaW5mb3JtcyBhYm91dCB0aGUgYWN0aXZpdHkgb2YgYSBzdHJlYW0sIG5vdAorICAgICAgICAgICAgLy8gICBpZiBpdCdzIGZvciBsb2NhbCBwbGF5YmFjay4gTm90ZSBhbHNvIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGRlbGF5IGJldHdlZW4gYm90aCB0ZXN0cworICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIC8vdXNlciAic2FmZSIgc3BlYWtlciBpZiBhdmFpbGFibGUgaW5zdGVhZCBvZiBub3JtYWwgc3BlYWtlciB0byBhdm9pZCB0cmlnZ2VyaW5nCisgICAgICAgICAgICAvL290aGVyIGFjb3VzdGljIHNhZmV0eSBtZWNoYW5pc21zIGZvciBub3RpZmljYXRpb24KKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSICYmIChhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSkKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKKyAgICAgICAgfSBlbHNlIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgeworICAgICAgICAgICAgLy8gd2hpbGUgbWVkaWEgaXMgcGxheWluZyAob3IgaGFzIHJlY2VudGx5IHBsYXllZCksIHVzZSB0aGUgc2FtZSBkZXZpY2UKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHdoZW4gbWVkaWEgaXMgbm90IHBsYXlpbmcgYW55bW9yZSwgZmFsbCBiYWNrIG9uIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICAvL3VzZXIgInNhZmUiIHNwZWFrZXIgaWYgYXZhaWxhYmxlIGluc3RlYWQgb2Ygbm9ybWFsIHNwZWFrZXIgdG8gYXZvaWQgdHJpZ2dlcmluZworICAgICAgICAgICAgLy9vdGhlciBhY291c3RpYyBzYWZldHkgbWVjaGFuaXNtcyBmb3Igbm90aWZpY2F0aW9uCisgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiAmJiAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkpCisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU1RSQVRFR1lfRFRNRjoKKyAgICAgICAgaWYgKCFpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICAvLyB3aGVuIG9mZiBjYWxsLCBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgTUVESUEgc3RyYXRlZ3kKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIHdoZW4gaW4gY2FsbCwgRFRNRiBhbmQgUEhPTkUgc3RyYXRlZ2llcyBmb2xsb3cgdGhlIHNhbWUgcnVsZXMKKyAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICBjYXNlIFNUUkFURUdZX1BIT05FOgorICAgICAgICAvLyBGb3JjZSB1c2Ugb2Ygb25seSBkZXZpY2VzIG9uIHByaW1hcnkgb3V0cHV0IGlmOgorICAgICAgICAvLyAtIGluIGNhbGwgQU5ECisgICAgICAgIC8vICAgLSBjYW5ub3Qgcm91dGUgZnJvbSB2b2ljZSBjYWxsIFJYIE9SCisgICAgICAgIC8vICAgLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMCBhbmQgVFggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZQorICAgICAgICBpZiAobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHhEZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgIGlmICgoKG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlggJiB+QVVESU9fREVWSUNFX0JJVF9JTikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKCgodHhEZXZpY2UgJiBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaHdPdXRwdXREZXNjLT5nZXRBdWRpb1BvcnQoKS0+bU1vZHVsZS0+bUhhbFZlcnNpb24gPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSkpIHsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyA9IGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZm9yIHBob25lIHN0cmF0ZWd5LCB3ZSBmaXJzdCBjb25zaWRlciB0aGUgZm9yY2VkIHVzZSBhbmQgdGhlbiB0aGUgYXZhaWxhYmxlIGRldmljZXMgYnkgb3JkZXIKKyAgICAgICAgLy8gb2YgcHJpb3JpdHkKKyAgICAgICAgc3dpdGNoIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSkgeworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ086CisgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgfHwgc3RyYXRlZ3kgIT0gU1RSQVRFR1lfRFRNRikgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAvLyBpZiBTQ08gZGV2aWNlIGlzIHJlcXVlc3RlZCBidXQgbm8gU0NPIGRldmljZSBpcyBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBkZWZhdWx0IGNhc2UKKyAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKKyAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvIEEyRFAKKyAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgorICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAoZ2V0QTJkcE91dHB1dCgpICE9IDApICYmICFtQTJkcFN1c3BlbmRlZCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgaWYgKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGU7CisgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgbm8gZGV2aWNlIGZvdW5kIGZvciBTVFJBVEVHWV9QSE9ORSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUjoKKyAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvCisgICAgICAgICAgICAvLyBBMkRQIHNwZWFrZXIgd2hlbiBmb3JjaW5nIHRvIHNwZWFrZXIgb3V0cHV0CisgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGdldEEyZHBPdXRwdXQoKSAhPSAwKSAmJiAhbUEyZHBTdXNwZW5kZWQpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGhvbmVTdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9MSU5FOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgU1RSQVRFR1lfUEhPTkUsIEZPUkNFX1NQRUFLRVIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTjoKKworICAgICAgICAvLyBJZiBpbmNhbGwsIGp1c3Qgc2VsZWN0IHRoZSBTVFJBVEVHWV9QSE9ORSBkZXZpY2U6IFRoZSByZXN0IG9mIHRoZSBiZWhhdmlvciBpcyBoYW5kbGVkIGJ5CisgICAgICAgIC8vIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpLgorICAgICAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICBjYXNlIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU6CisgICAgICAgIC8vIHN0cmF0ZWd5IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgdXNlcyBzYW1lIHJvdXRpbmcgcG9saWN5IGFzIFNUUkFURUdZX1NPTklGSUNBVElPTgorICAgICAgICAvLyBleGNlcHQ6CisgICAgICAgIC8vICAgLSB3aGVuIGluIGNhbGwgd2hlcmUgaXQgZG9lc24ndCBkZWZhdWx0IHRvIFNUUkFURUdZX1BIT05FIGJlaGF2aW9yCisgICAgICAgIC8vICAgLSBpbiBjb3VudHJpZXMgd2hlcmUgbm90IGVuZm9yY2VkIGluIHdoaWNoIGNhc2UgaXQgZm9sbG93cyBTVFJBVEVHWV9NRURJQQorCisgICAgICAgIGlmICgoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAorICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBzcGVha2VyIGRldmljZSBub3QgZm91bmQgZm9yIFNUUkFURUdZX1NPTklGSUNBVElPTiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRoZSBzZWNvbmQgZGV2aWNlIHVzZWQgZm9yIHNvbmlmaWNhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgZGV2aWNlIHVzZWQgYnkgbWVkaWEgc3RyYXRlZ3kKKyAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICBjYXNlIFNUUkFURUdZX01FRElBOiB7CisgICAgICAgIHVpbnQzMl90IGRldmljZTIgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgaWYgKHN0cmF0ZWd5ICE9IFNUUkFURUdZX1NPTklGSUNBVElPTikgeworICAgICAgICAgICAgLy8gbm8gc29uaWZpY2F0aW9uIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQorICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOworICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKKyAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgIChnZXRBMmRwT3V0cHV0KCkgIT0gMCkgJiYgIW1BMmRwU3VzcGVuZGVkKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOworICAgICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9MSU5FOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOworICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYgKHN0cmF0ZWd5ICE9IFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKKyAgICAgICAgICAgIC8vIG5vIHNvbmlmaWNhdGlvbiBvbiBhdXggZGlnaXRhbCAoZS5nLiBIRE1JKQorICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdID09IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSykpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgfQorICAgICAgICBpbnQgZGV2aWNlMyA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpIHsKKyAgICAgICAgICAgIC8vIEFSQywgU1BESUYgYW5kIEFVWF9MSU5FIGNhbiBjby1leGlzdCB3aXRoIG90aGVycy4KKyAgICAgICAgICAgIGRldmljZTMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkM7CisgICAgICAgICAgICBkZXZpY2UzIHw9IChhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BESUYpOworICAgICAgICAgICAgZGV2aWNlMyB8PSAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKTsKKyAgICAgICAgfQorCisgICAgICAgIGRldmljZTIgfD0gZGV2aWNlMzsKKyAgICAgICAgLy8gZGV2aWNlIGlzIERFVklDRV9PVVRfU1BFQUtFUiBpZiB3ZSBjb21lIGZyb20gY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT04gb3IKKyAgICAgICAgLy8gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgQVVESU9fREVWSUNFX05PTkUgb3RoZXJ3aXNlCisgICAgICAgIGRldmljZSB8PSBkZXZpY2UyOworCisgICAgICAgIC8vIElmIGhkbWkgc3lzdGVtIGF1ZGlvIG1vZGUgaXMgb24sIHJlbW92ZSBzcGVha2VyIG91dCBvZiBvdXRwdXQgbGlzdC4KKyAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKKyAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10gPT0KKyAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfSERNSV9TWVNURU1fQVVESU9fRU5GT1JDRUQpKSB7CisgICAgICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICBkZXZpY2UgPSBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGU7CisgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgU1RSQVRFR1lfTUVESUEiKTsKKyAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coImdldERldmljZUZvclN0cmF0ZWd5KCkgdW5rbm93biBzdHJhdGVneTogJWQiLCBzdHJhdGVneSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEFMT0dWVigiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBzdHJhdGVneSAlZCwgZGV2aWNlICV4Iiwgc3RyYXRlZ3ksIGRldmljZSk7CisgICAgcmV0dXJuIGRldmljZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKKyAgICAgICAgbURldmljZUZvclN0cmF0ZWd5W2ldID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgfQorICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKQoreworICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgorICAgIC8vIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZworICAgIC8vIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CisgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSAwOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICBib29sIHNob3VsZE11dGUgPSBvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChwb3Bjb3VudChkZXZpY2UpID49IDIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgYm9vbCBtdXRlID0gc2hvdWxkTXV0ZSAmJiAoY3VyRGV2aWNlICYgZGV2aWNlKSAmJiAoY3VyRGV2aWNlICE9IGRldmljZSk7CisgICAgICAgIGJvb2wgZG9NdXRlID0gZmFsc2U7CisKKyAgICAgICAgaWYgKG11dGUgJiYgIW91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0pIHsKKyAgICAgICAgICAgIGRvTXV0ZSA9IHRydWU7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghbXV0ZSAmJiBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldKXsKKyAgICAgICAgICAgIGRvTXV0ZSA9IHRydWU7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvTXV0ZSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtT3V0cHV0cy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaik7CisgICAgICAgICAgICAgICAgLy8gc2tpcCBvdXRwdXQgaWYgaXQgZG9lcyBub3Qgc2hhcmUgYW55IGRldmljZSB3aXRoIGN1cnJlbnQgb3V0cHV0CisgICAgICAgICAgICAgICAgaWYgKChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgY3VyT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaik7CisgICAgICAgICAgICAgICAgQUxPR1ZWKCJjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKCkgJXMgc3RyYXRlZ3kgJWQgKGN1ckRldmljZSAlMDR4KSBvbiBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIG11dGUgPyAibXV0aW5nIiA6ICJ1bm11dGluZyIsIGksIGN1ckRldmljZSwgY3VyT3V0cHV0KTsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgbXV0ZSwgY3VyT3V0cHV0LCBtdXRlID8gMCA6IGRlbGF5TXMpOworICAgICAgICAgICAgICAgIGlmIChkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKChyb3V0aW5nX3N0cmF0ZWd5KWkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtdXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogc2hvdWxkIG5vdCBuZWVkIHRvIGRvdWJsZSBsYXRlbmN5IGlmIHZvbHVtZSBjb3VsZCBiZSBhcHBsaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSBieSB0aGUgYXVkaW9mbGluZ2VyIG1peGVyLiBXZSBtdXN0IGFjY291bnQgZm9yIHRoZSBkZWxheQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmV0d2VlbiBub3cgYW5kIHRoZSBuZXh0IHRpbWUgdGhlIGF1ZGlvZmxpbmdlciB0aHJlYWQgZm9yIHRoaXMgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHByb2Nlc3MgYSBidWZmZXIgKHdoaWNoIGNvcnJlc3BvbmRzIHRvIG9uZSBidWZmZXIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzdWFsbHkgMS8yIG9yIDEvNCBvZiB0aGUgbGF0ZW5jeSkuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXV0ZVdhaXRNcyA8IGRlc2MtPmxhdGVuY3koKSAqIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlV2FpdE1zID0gZGVzYy0+bGF0ZW5jeSgpICogMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRlbXBvcmFyeSBtdXRlIG91dHB1dCBpZiBkZXZpY2Ugc2VsZWN0aW9uIGNoYW5nZXMgdG8gYXZvaWQgdm9sdW1lIGJ1cnN0cyBkdWUgdG8KKyAgICAvLyBkaWZmZXJlbnQgcGVyIGRldmljZSB2b2x1bWVzCisgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKGRldmljZSAhPSBwcmV2RGV2aWNlKSkgeworICAgICAgICBpZiAobXV0ZVdhaXRNcyA8IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDIpIHsKKyAgICAgICAgICAgIG11dGVXYWl0TXMgPSBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiAyOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgeworICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoKHJvdXRpbmdfc3RyYXRlZ3kpaSkpIHsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgdHJ1ZSwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAvLyBkbyB0ZW1wTXV0ZSB1bm11dGUgYWZ0ZXIgdHdpY2UgdGhlIG11dGUgd2FpdCB0aW1lCisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGVXYWl0TXMgKjIsIGRldmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB3YWl0IGZvciB0aGUgUENNIG91dHB1dCBidWZmZXJzIHRvIGVtcHR5IGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQKKyAgICBpZiAobXV0ZVdhaXRNcyA+IGRlbGF5TXMpIHsKKyAgICAgICAgbXV0ZVdhaXRNcyAtPSBkZWxheU1zOworICAgICAgICB1c2xlZXAobXV0ZVdhaXRNcyAqIDEwMDApOworICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzKQoreworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBvdXRwdXQgJWQgZGV2aWNlICUwNHggZGVsYXlNcyAlZCIsIG91dHB1dCwgZGV2aWNlLCBkZWxheU1zKTsKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgIHVpbnQzMl90IG11dGVXYWl0TXM7CisKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5tT3V0cHV0MS0+bUlvSGFuZGxlLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zKTsKKyAgICAgICAgbXV0ZVdhaXRNcyArPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bU91dHB1dDItPm1Jb0hhbmRsZSwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcyk7CisgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOworICAgIH0KKyAgICAvLyBubyBuZWVkIHRvIHByb2NlZWQgaWYgbmV3IGRldmljZSBpcyBub3QgQVVESU9fREVWSUNFX05PTkUgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudAorICAgIC8vIG91dHB1dCBwcm9maWxlCisgICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAoKGRldmljZSAmIG91dHB1dERlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKSA9PSAwKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBmaWx0ZXIgZGV2aWNlcyBhY2NvcmRpbmcgdG8gb3V0cHV0IHNlbGVjdGVkCisgICAgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkoZGV2aWNlICYgb3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpOworCisgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UgPSBvdXRwdXREZXNjLT5tRGV2aWNlOworCisgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIHByZXZEZXZpY2UgJTA0eCIsIHByZXZEZXZpY2UpOworCisgICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgIH0KKyAgICBtdXRlV2FpdE1zID0gY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhvdXRwdXREZXNjLCBwcmV2RGV2aWNlLCBkZWxheU1zKTsKKworICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlIHJvdXRpbmcgaWY6CisgICAgLy8gIC0gdGhlIHJlcXVlc3RlZCBkZXZpY2UgaXMgQVVESU9fREVWSUNFX05PTkUKKyAgICAvLyAgLSB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50IGRldmljZSBhbmQgZm9yY2UgaXMgbm90IHNwZWNpZmllZC4KKyAgICAvLyBEb2luZyB0aGlzIGNoZWNrIGhlcmUgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY2FsbCBzZXRPdXRwdXREZXZpY2UoKSB3aXRob3V0IGNvbmRpdGlvbnMKKyAgICBpZiAoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fCBkZXZpY2UgPT0gcHJldkRldmljZSkgJiYgIWZvcmNlKSB7CisgICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBzZXR0aW5nIHNhbWUgZGV2aWNlICUwNHggb3IgbnVsbCBkZXZpY2UgZm9yIG91dHB1dCAlZCIsIGRldmljZSwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgfQorCisgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNoYW5naW5nIGRldmljZSIpOworCisgICAgLy8gZG8gdGhlIHJvdXRpbmcKKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIHJlc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgZGVsYXlNcywgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSAoYWRkcmVzcyA9PSBOVUxMKSA/CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSkKKyAgICAgICAgICAgICAgICA6IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBTdHJpbmc4KGFkZHJlc3MpKTsKKyAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlTGlzdC5zaXplKCkgJiYgaSA8IEFVRElPX1BBVENIX1BPUlRTX01BWDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoaSktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1tpXSk7CisgICAgICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4OworICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7CisgICAgICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgY3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIKKyAgICAgICAgICAgICAgICAgICAgIm51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUsIHBhdGNoLm51bV9zb3VyY2VzLCBwYXRjaC5udW1fc2lua3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goKGF1ZGlvX3BhdGNoX2hhbmRsZV90KW5leHRVbmlxdWVJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSBtVWlkQ2FjaGVkOworICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpbmZvcm0gYWxsIGlucHV0IGFzIHdlbGwKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmICghaXNWaXJ0dWFsSW5wdXREZXZpY2UoaW5wdXREZXNjcmlwdG9yLT5tRGV2aWNlKSkgeworICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGlucHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGluZm9ybSBpbnB1dCAlZCBvZiBkZXZpY2U6JWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICBpbnB1dERlc2NyaXB0b3ItPm1Jb0hhbmRsZSwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBpbnB1dENtZC5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhpbnB1dERlc2NyaXB0b3ItPm1Jb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dENtZC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXBkYXRlIHN0cmVhbSB2b2x1bWVzIGFjY29yZGluZyB0byBuZXcgZGV2aWNlCisgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dCwgZGV2aWNlLCBkZWxheU1zKTsKKworICAgIHJldHVybiBtdXRlV2FpdE1zOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKK3sKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgIHNzaXplX3QgaW5kZXg7CisgICAgaWYgKHBhdGNoSGFuZGxlKSB7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKKyAgICBBTE9HVigicmVzZXRPdXRwdXREZXZpY2UoKSByZWxlYXNlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCIsIHN0YXR1cyk7CisgICAgb3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlID0gMDsKKyAgICByZW1vdmVBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKKyAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYgKChkZXZpY2UgIT0gaW5wdXREZXNjLT5tRGV2aWNlKSB8fCBmb3JjZSkpIHsKKyAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworCisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKKyAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgICAgICAgICAgaW5wdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOworICAgICAgICAgICAgLy8gQVVESU9fU09VUkNFX0hPVFdPUkQgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OgorICAgICAgICAgICAgLy8gaGFuZGxlZCBhcyBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gYnkgdGhlIGF1ZGlvIEhBTAorICAgICAgICAgICAgaWYgKHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKKyAgICAgICAgICAgICAgICAgICAgIWlucHV0RGVzYy0+bUlzU291bmRUcmlnZ2VyKSB7CisgICAgICAgICAgICAgICAgcGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgICAgICAgICAvL29ubHkgb25lIGlucHV0IGRldmljZSBmb3Igbm93CisgICAgICAgICAgICBkZXZpY2VMaXN0Lml0ZW1BdCgwKS0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKKyAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgQUxPR1YoInNldElucHV0RGV2aWNlKCkgY3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpbmV4dFVuaXF1ZUlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRjaCwgbVVpZENhY2hlZCk7CisgICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gcGF0Y2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICpwYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVzZXRJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCit7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXg7CisgICAgaWYgKHBhdGNoSGFuZGxlKSB7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgIH0KKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgIEFMT0dWKCJyZXNldElucHV0RGV2aWNlKCkgcmVsZWFzZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQiLCBzdGF0dXMpOworICAgIGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlID0gMDsKKyAgICByZW1vdmVBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3NwPEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICAvLyBDaG9vc2UgYW4gaW5wdXQgcHJvZmlsZSBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIGNhcHR1cmUgcGFyYW1ldGVyczogc2VsZWN0IHRoZSBmaXJzdCBhdmFpbGFibGUKKyAgICAvLyBwcm9maWxlIHN1cHBvcnRpbmcgYWxsIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXNbal07CisgICAgICAgICAgICAvLyBwcm9maWxlLT5sb2coKTsKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsaW5nUmF0ZSAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKQoreworICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6CisgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCkgeworICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9ERUZBVUxUOgorICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKKyAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApIHsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQOworICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKKyAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7CisgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgLy8gQWxsb3cgb25seSB1c2Ugb2YgZGV2aWNlcyBvbiBwcmltYXJ5IGlucHV0IGlmIGluIGNhbGwgYW5kIEhBTCBkb2VzIG5vdCBzdXBwb3J0IHJvdXRpbmcKKyAgICAgICAgLy8gdG8gdm9pY2UgY2FsbCBwYXRoLgorICAgICAgICBpZiAoKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgJiYKKyAgICAgICAgICAgICAgICAobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSA9PSAwKSB7CisgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSkgeworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ086CisgICAgICAgICAgICAvLyBpZiBTQ08gZGV2aWNlIGlzIHJlcXVlc3RlZCBidXQgbm8gU0NPIGRldmljZSBpcyBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBkZWZhdWx0IGNhc2UKKyAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICAgICAgZGVmYXVsdDogICAgLy8gRk9SQ0VfTk9ORQorICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVI6CisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjoKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgorICAgICAgICBpZiAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmCisgICAgICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOgorICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CQUNLX01JQzsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgorICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEw6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOgorICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coImdldERldmljZUZvcklucHV0U291cmNlKCkgaW52YWxpZCBpbnB1dCBzb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBBTE9HVigiZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKWlucHV0IHNvdXJjZSAlZCwgZGV2aWNlICUwOHgiLCBpbnB1dFNvdXJjZSwgZGV2aWNlKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNWaXJ0dWFsSW5wdXREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHsKKyAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgICAgICBpZiAoKHBvcGNvdW50KGRldmljZSkgPT0gMSkgJiYgKChkZXZpY2UgJiB+QVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCkgPT0gMCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSB7CisgICAgcmV0dXJuICgoZGV2aWNlICYgQVBNX0FVRElPX0RFVklDRV9NQVRDSF9BRERSRVNTX0FMTCkgIT0gMCk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QWN0aXZlSW5wdXQoYm9vbCBpZ25vcmVWaXJ0dWFsSW5wdXRzKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0X2Rlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmICgoaW5wdXRfZGVzY3JpcHRvci0+bVJlZkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAmJiAoIWlnbm9yZVZpcnR1YWxJbnB1dHMgfHwgIWlzVmlydHVhbElucHV0RGV2aWNlKGlucHV0X2Rlc2NyaXB0b3ItPm1EZXZpY2UpKSkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnB1dHMua2V5QXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6YWN0aXZlSW5wdXRzQ291bnQoKSBjb25zdAoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZGVzYy0+bVJlZkNvdW50ID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIGNvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvclZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgLy8gdGhpcyBoYXBwZW5zIHdoZW4gZm9yY2luZyBhIHJvdXRlIHVwZGF0ZSBhbmQgbm8gdHJhY2sgaXMgYWN0aXZlIG9uIGFuIG91dHB1dC4KKyAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHRoZSByZXR1cm5lZCBjYXRlZ29yeSBpcyBub3QgaW1wb3J0YW50LgorICAgICAgICBkZXZpY2UgPSAgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgIH0gZWxzZSBpZiAocG9wY291bnQoZGV2aWNlKSA+IDEpIHsKKyAgICAgICAgLy8gTXVsdGlwbGUgZGV2aWNlIHNlbGVjdGlvbiBpcyBlaXRoZXI6CisgICAgICAgIC8vICAtIHNwZWFrZXIgKyBvbmUgb3RoZXIgZGV2aWNlOiBnaXZlIHByaW9yaXR5IHRvIHNwZWFrZXIgaW4gdGhpcyBjYXNlLgorICAgICAgICAvLyAgLSBvbmUgQTJEUCBkZXZpY2UgKyBhbm90aGVyIGRldmljZTogaGFwcGVucyB3aXRoIGR1cGxpY2F0ZWQgb3V0cHV0LiBJbiB0aGlzIGNhc2UKKyAgICAgICAgLy8gcmV0YWluIHRoZSBkZXZpY2Ugb24gdGhlIEEyRFAgb3V0cHV0IGFzIHRoZSBvdGhlciBtdXN0IG5vdCBjb3JyZXNwb25kIHRvIGFuIGFjdGl2ZQorICAgICAgICAvLyBzZWxlY3Rpb24gaWYgbm90IHRoZSBzcGVha2VyLgorICAgICAgICAvLyAgLSBIRE1JLUNFQyBzeXN0ZW0gYXVkaW8gbW9kZSBvbmx5IG91dHB1dDogZ2l2ZSBwcmlvcml0eSB0byBhdmFpbGFibGUgaXRlbSBpbiBvcmRlci4KKyAgICAgICAgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkM7CisgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BVVhfTElORSkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9BVVhfTElORTsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRElGKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRElGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKlNQRUFLRVJfU0FGRSBpcyBhbiBhbGlhcyBvZiBTUEVBS0VSIGZvciBwdXJwb3NlcyBvZiB2b2x1bWUgY29udHJvbCovCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworCisgICAgQUxPR1dfSUYocG9wY291bnQoZGV2aWNlKSAhPSAxLAorICAgICAgICAgICAgImdldERldmljZUZvclZvbHVtZSgpIGludmFsaWQgZGV2aWNlIGNvbWJpbmF0aW9uOiAlMDh4IiwKKyAgICAgICAgICAgIGRldmljZSk7CisKKyAgICByZXR1cm4gZGV2aWNlOworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6OmRldmljZV9jYXRlZ29yeSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUNhdGVnb3J5KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgc3dpdGNoKGdldERldmljZUZvclZvbHVtZShkZXZpY2UpKSB7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRToKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0U7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVDsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0xJTkU6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDoKKyAgICAgICAgLypVU0I/ICBSZW1vdGUgc3VibWl4PyovCisgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQTsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRToKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVI7CisgICAgfQorfQorCitmbG9hdCBBdWRpb1BvbGljeU1hbmFnZXI6OnZvbEluZGV4VG9BbXBsKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IFN0cmVhbURlc2NyaXB0b3ImIHN0cmVhbURlc2MsCisgICAgICAgIGludCBpbmRleEluVWkpCit7CisgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5ID0gZ2V0RGV2aWNlQ2F0ZWdvcnkoZGV2aWNlKTsKKyAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpjdXJ2ZSA9IHN0cmVhbURlc2MubVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XTsKKworICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0gdHlwZQorICAgIGludCBuYlN0ZXBzID0gMSArIGN1cnZlW1ZPTE1BWF0ubUluZGV4IC0KKyAgICAgICAgICAgIGN1cnZlW1ZPTE1JTl0ubUluZGV4OworICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSBzdHJlYW1EZXNjLm1JbmRleE1pbikpIC8KKyAgICAgICAgICAgIChzdHJlYW1EZXNjLm1JbmRleE1heCAtIHN0cmVhbURlc2MubUluZGV4TWluKTsKKworICAgIC8vIGZpbmQgd2hhdCBwYXJ0IG9mIHRoZSBjdXJ2ZSB0aGlzIGluZGV4IHZvbHVtZSBiZWxvbmdzIHRvLCBvciBpZiBpdCdzIG91dCBvZiBib3VuZHMKKyAgICBpbnQgc2VnbWVudCA9IDA7CisgICAgaWYgKHZvbElkeCA8IGN1cnZlW1ZPTE1JTl0ubUluZGV4KSB7ICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcworICAgICAgICByZXR1cm4gMC4wZjsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZPTEtORUUxXS5tSW5kZXgpIHsKKyAgICAgICAgc2VnbWVudCA9IDA7CisgICAgfSBlbHNlIGlmICh2b2xJZHggPCBjdXJ2ZVtWT0xLTkVFMl0ubUluZGV4KSB7CisgICAgICAgIHNlZ21lbnQgPSAxOworICAgIH0gZWxzZSBpZiAodm9sSWR4IDw9IGN1cnZlW1ZPTE1BWF0ubUluZGV4KSB7CisgICAgICAgIHNlZ21lbnQgPSAyOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcworICAgICAgICByZXR1cm4gMS4wZjsKKyAgICB9CisKKyAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKKyAgICBmbG9hdCBkZWNpYmVscyA9IGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uICsKKyAgICAgICAgICAgICgoZmxvYXQpKHZvbElkeCAtIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICoKKyAgICAgICAgICAgICAgICAoIChjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uKSAvCisgICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSApOworCisgICAgZmxvYXQgYW1wbGlmaWNhdGlvbiA9IGV4cCggZGVjaWJlbHMgKiAwLjExNTEyOWYpOyAvLyBleHAoIGRCICogbG4oMTApIC8gMjAgKQorCisgICAgQUxPR1ZWKCJWT0xVTUUgdm9sIGluZGV4PVslZCAlZCAlZF0sIGRCPVslLjFmICUuMWYgJS4xZl0gYW1wbD0lLjVmIiwKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCwgdm9sSWR4LAorICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tSW5kZXgsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiwKKyAgICAgICAgICAgIGRlY2liZWxzLAorICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbiwKKyAgICAgICAgICAgIGFtcGxpZmljYXRpb24pOworCisgICAgcmV0dXJuIGFtcGxpZmljYXRpb247Cit9CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0RlZmF1bHRWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC00OS41Zn0sIHszMywgLTMzLjVmfSwgezY2LCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtNTguMGZ9LCB7MjAsIC00MC4wZn0sIHs2MCwgLTE3LjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtNTguMGZ9LCB7MjAsIC00MC4wZn0sIHs2MCwgLTIxLjBmfSwgezEwMCwgLTEwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtNTYuMGZ9LCB7MjAsIC0zNC4wZn0sIHs2MCwgLTExLjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTU1LjBmfSwgezIwLCAtNDMuMGZ9LCB7ODYsIC0xMi4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtMjkuN2Z9LCB7MzMsIC0yMC4xZn0sIHs2NiwgLTEwLjJmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC0zNS43Zn0sIHszMywgLTI2LjFmfSwgezY2LCAtMTMuMmZ9LCB7MTAwLCAwLjBmfQorfTsKKworLy8gQVVESU9fU1RSRUFNX1NZU1RFTSwgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgYW5kIEFVRElPX1NUUkVBTV9EVE1GIHZvbHVtZSB0cmFja3MKKy8vIEFVRElPX1NUUkVBTV9SSU5HIG9uIHBob25lcyBhbmQgQVVESU9fU1RSRUFNX01VU0lDIG9uIHRhYmxldHMuCisvLyBBVURJT19TVFJFQU1fRFRNRiB0cmFja3MgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgd2hpbGUgaW4gY2FsbCAoU2VlIEF1ZGlvU2VydmljZS5qYXZhKS4KKy8vIFRoZSByYW5nZSBpcyBjb25zdHJhaW5lZCBiZXR3ZWVuIC0yNGRCIGFuZCAtNmRCIG92ZXIgc3BlYWtlciBhbmQgLTMwZEIgYW5kIC0xOGRCIG92ZXIgaGVhZHNldC4KKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTI0LjBmfSwgezMzLCAtMTguMGZ9LCB7NjYsIC0xMi4wZn0sIHsxMDAsIC02LjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTM0LjBmfSwgezMzLCAtMjQuMGZ9LCB7NjYsIC0xNS4wZn0sIHsxMDAsIC02LjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTMwLjBmfSwgezMzLCAtMjYuMGZ9LCB7NjYsIC0yMi4wZn0sIHsxMDAsIC0xOC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MCwgLTQyLjBmfSwgezMzLCAtMjguMGZ9LCB7NjYsIC0xNC4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezAsIC0yNC4wZn0sIHszMywgLTE2LjBmfSwgezY2LCAtOC4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICAgICAgICAgICpBdWRpb1BvbGljeU1hbmFnZXI6OnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0F1ZGlvUG9saWN5TWFuYWdlcjo6REVWSUNFX0NBVEVHT1JZX0NOVF0gPSB7CisgICAgeyAvLyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTAorICAgICAgICBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9TWVNURU0KKyAgICAgICAgc0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fUklORworICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9NVVNJQworICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9BTEFSTQorICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04KKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTworICAgICAgICBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFCisgICAgICAgIHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAgLy8gQVVESU9fU1RSRUFNX0RUTUYKKyAgICAgICAgc0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9UVFMKKyAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCit9OworCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKKyAgICAgICAgICAgIG1TdHJlYW1zW2ldLm1Wb2x1bWVDdXJ2ZVtqXSA9CisgICAgICAgICAgICAgICAgICAgIHNWb2x1bWVQcm9maWxlc1tpXVtqXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGF2YWlsYWJpbGl0eSBvZiBEUkMgb24gc3BlYWtlciBwYXRoOiBpZiBhdmFpbGFibGUsIG92ZXJyaWRlIHNvbWUgb2YgdGhlIHNwZWFrZXIgY3VydmVzCisgICAgaWYgKG1TcGVha2VyRHJjRW5hYmxlZCkgeworICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fU1lTVEVNXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KKyAgICAgICAgICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjOworICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fUklOR10ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9CisgICAgICAgICAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYzsKKyAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0FMQVJNXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KKyAgICAgICAgICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjOworICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KKyAgICAgICAgICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjOworICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fTVVTSUNdLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQorICAgICAgICAgICAgICAgIHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYzsKKyAgICB9Cit9CisKK2Zsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29tcHV0ZVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgZmxvYXQgdm9sdW1lID0gMS4wOworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgU3RyZWFtRGVzY3JpcHRvciAmc3RyZWFtRGVzYyA9IG1TdHJlYW1zW3N0cmVhbV07CisKKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgIH0KKworICAgIHZvbHVtZSA9IHZvbEluZGV4VG9BbXBsKGRldmljZSwgc3RyZWFtRGVzYywgaW5kZXgpOworCisgICAgLy8gaWYgYSBoZWFkc2V0IGlzIGNvbm5lY3RlZCwgYXBwbHkgdGhlIGZvbGxvd2luZyBydWxlcyB0byByaW5nIHRvbmVzIGFuZCBub3RpZmljYXRpb25zCisgICAgLy8gdG8gYXZvaWQgc291bmQgbGV2ZWwgYnVyc3RzIGluIHVzZXIncyBlYXJzOgorICAgIC8vIC0gYWx3YXlzIGF0dGVudWF0ZSByaW5nIHRvbmVzIGFuZCBub3RpZmljYXRpb25zIHZvbHVtZSBieSA2ZEIKKyAgICAvLyAtIGlmIG11c2ljIGlzIHBsYXlpbmcsIGFsd2F5cyBsaW1pdCB0aGUgdm9sdW1lIHRvIGN1cnJlbnQgbXVzaWMgdm9sdW1lLAorICAgIC8vIHdpdGggYSBtaW5pbXVtIHRocmVzaG9sZCBhdCAtMzZkQiBzbyB0aGF0IG5vdGlmaWNhdGlvbiBpcyBhbHdheXMgcGVyY2VpdmVkLgorICAgIGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgc3RyZWFtX3N0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKKyAgICBpZiAoKGRldmljZSAmIChBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIHwKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyB8CisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQgfAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUpKSAmJgorICAgICAgICAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pCisgICAgICAgICAgICAgICAgfHwgKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkKKyAgICAgICAgICAgICAgICB8fCAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9TWVNURU0pCisgICAgICAgICAgICAgICAgfHwgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgJiYKKyAgICAgICAgc3RyZWFtRGVzYy5tQ2FuQmVNdXRlZCkgeworICAgICAgICB2b2x1bWUgKj0gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUjsKKyAgICAgICAgLy8gd2hlbiB0aGUgcGhvbmUgaXMgcmluZ2luZyB3ZSBtdXN0IGNvbnNpZGVyIHRoYXQgbXVzaWMgY291bGQgaGF2ZSBiZWVuIHBhdXNlZCBqdXN0IGJlZm9yZQorICAgICAgICAvLyBieSB0aGUgbXVzaWMgYXBwbGljYXRpb24gYW5kIGJlaGF2ZSBhcyBpZiBtdXNpYyB3YXMgYWN0aXZlIGlmIHRoZSBsYXN0IG11c2ljIHRyYWNrIHdhcworICAgICAgICAvLyBqdXN0IHN0b3BwZWQKKyAgICAgICAgaWYgKGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpIHx8CisgICAgICAgICAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUpIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtdXNpY0RldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgZmxvYXQgbXVzaWNWb2wgPSBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9NVVNJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fTVVTSUNdLmdldFZvbHVtZUluZGV4KG11c2ljRGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNEZXZpY2UpOworICAgICAgICAgICAgZmxvYXQgbWluVm9sID0gKG11c2ljVm9sID4gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTikgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY1ZvbCA6IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU47CisgICAgICAgICAgICBpZiAodm9sdW1lID4gbWluVm9sKSB7CisgICAgICAgICAgICAgICAgdm9sdW1lID0gbWluVm9sOworICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGxpbWl0aW5nIHZvbHVtZSB0byAlZiBtdXNpY1ZvbCAlZiIsIG1pblZvbCwgbXVzaWNWb2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHZvbHVtZTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCit7CisKKyAgICAvLyBkbyBub3QgY2hhbmdlIGFjdHVhbCBzdHJlYW0gdm9sdW1lIGlmIHRoZSBzdHJlYW0gaXMgbXV0ZWQKKyAgICBpZiAobU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bU11dGVDb3VudFtzdHJlYW1dICE9IDApIHsKKyAgICAgICAgQUxPR1ZWKCJjaGVja0FuZFNldFZvbHVtZSgpIHN0cmVhbSAlZCBtdXRlZCBjb3VudCAlZCIsCisgICAgICAgICAgICAgIHN0cmVhbSwgbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bU11dGVDb3VudFtzdHJlYW1dKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIC8vIGRvIG5vdCBjaGFuZ2UgaW4gY2FsbCB2b2x1bWUgaWYgYmx1ZXRvb3RoIGlzIGNvbm5lY3RlZCBhbmQgdmljZSB2ZXJzYQorICAgIGlmICgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMICYmCisgICAgICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAorICAgICAgICAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPICYmCisgICAgICAgICAgICAgICAgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpIHsKKyAgICAgICAgQUxPR1YoImNoZWNrQW5kU2V0Vm9sdW1lKCkgY2Fubm90IHNldCBzdHJlYW0gJWQgdm9sdW1lIHdpdGggZm9yY2UgdXNlID0gJWQgZm9yIGNvbW0iLAorICAgICAgICAgICAgIHN0cmVhbSwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgZmxvYXQgdm9sdW1lID0gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBvdXRwdXQsIGRldmljZSk7CisgICAgLy8gV2UgYWN0dWFsbHkgY2hhbmdlIHRoZSB2b2x1bWUgaWY6CisgICAgLy8gLSB0aGUgZmxvYXQgdmFsdWUgcmV0dXJuZWQgYnkgY29tcHV0ZVZvbHVtZSgpIGNoYW5nZWQKKyAgICAvLyAtIHRoZSBmb3JjZSBmbGFnIGlzIHNldAorICAgIGlmICh2b2x1bWUgIT0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dIHx8CisgICAgICAgICAgICBmb3JjZSkgeworICAgICAgICBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gPSB2b2x1bWU7CisgICAgICAgIEFMT0dWVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBmb3Igb3V0cHV0ICVkIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBkZWxheSAlZCIsIG91dHB1dCwgc3RyZWFtLCB2b2x1bWUsIGRlbGF5TXMpOworICAgICAgICAvLyBGb3JjZSBWT0lDRV9DQUxMIHRvIHRyYWNrIEJMVUVUT09USF9TQ08gc3RyZWFtIHZvbHVtZSB3aGVuIGJsdWV0b290aCBhdWRpbyBpcworICAgICAgICAvLyBlbmFibGVkCisgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIHZvbHVtZSwgb3V0cHV0LCBkZWxheU1zKTsKKyAgICAgICAgfQorICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQsIGRlbGF5TXMpOworICAgIH0KKworICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgfHwKKyAgICAgICAgc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSB7CisgICAgICAgIGZsb2F0IHZvaWNlVm9sdW1lOworICAgICAgICAvLyBGb3JjZSB2b2ljZSB2b2x1bWUgdG8gbWF4IGZvciBibHVldG9vdGggU0NPIGFzIHZvbHVtZSBpcyBtYW5hZ2VkIGJ5IHRoZSBoZWFkc2V0CisgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gKGZsb2F0KWluZGV4LyhmbG9hdCltU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gMS4wOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZvaWNlVm9sdW1lICE9IG1MYXN0Vm9pY2VWb2x1bWUgJiYgb3V0cHV0ID09IG1QcmltYXJ5T3V0cHV0KSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0Vm9pY2VWb2x1bWUodm9pY2VWb2x1bWUsIGRlbGF5TXMpOworICAgICAgICAgICAgbUxhc3RWb2ljZVZvbHVtZSA9IHZvaWNlVm9sdW1lOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YXBwbHlTdHJlYW1Wb2x1bWVzKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCit7CisgICAgQUxPR1ZWKCJhcHBseVN0cmVhbVZvbHVtZXMoKSBmb3Igb3V0cHV0ICVkIGFuZCBkZXZpY2UgJXgiLCBvdXRwdXQsIGRldmljZSk7CisKKyAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICBjaGVja0FuZFNldFZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW3N0cmVhbV0uZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJhdGVneU11dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgQUxPR1ZWKCJzZXRTdHJhdGVneU11dGUoKSBzdHJhdGVneSAlZCwgbXV0ZSAlZCwgb3V0cHV0ICVkIiwgc3RyYXRlZ3ksIG9uLCBvdXRwdXQpOworICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7CisgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgb24sIG91dHB1dCwgZGVsYXlNcywgZGV2aWNlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBTdHJlYW1EZXNjcmlwdG9yICZzdHJlYW1EZXNjID0gbVN0cmVhbXNbc3RyZWFtXTsKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgfQorCisgICAgQUxPR1ZWKCJzZXRTdHJlYW1NdXRlKCkgc3RyZWFtICVkLCBtdXRlICVkLCBvdXRwdXQgJWQsIG1NdXRlQ291bnQgJWQgZGV2aWNlICUwNHgiLAorICAgICAgICAgIHN0cmVhbSwgb24sIG91dHB1dCwgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dLCBkZXZpY2UpOworCisgICAgaWYgKG9uKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgeworICAgICAgICAgICAgaWYgKHN0cmVhbURlc2MubUNhbkJlTXV0ZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgKChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCAwLCBvdXRwdXQsIGRldmljZSwgZGVsYXlNcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gaW5jcmVtZW50IG1NdXRlQ291bnQgYWZ0ZXIgY2FsbGluZyBjaGVja0FuZFNldFZvbHVtZSgpIHNvIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBub3QgaWdub3JlZAorICAgICAgICBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0rKzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJzZXRTdHJlYW1NdXRlKCkgdW5tdXRpbmcgbm9uIG11dGVkIHN0cmVhbSEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoLS1vdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgeworICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzYy5nZXRWb2x1bWVJbmRleChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0YXJ0aW5nLCBib29sIHN0YXRlQ2hhbmdlKQoreworICAgIC8vIGlmIHRoZSBzdHJlYW0gcGVydGFpbnMgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGFuZCB3ZSBhcmUgaW4gY2FsbCB3ZSBtdXN0CisgICAgLy8gbXV0ZSB0aGUgc3RyZWFtIGlmIGl0IGlzIGxvdyB2aXNpYmlsaXR5LiBJZiBpdCBpcyBoaWdoIHZpc2liaWxpdHksIHdlIG11c3QgcGxheSBhIHRvbmUKKyAgICAvLyBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5IGFuZCBwbGF5IHRoZSB0b25lIGlmIHRoZSBzZWxlY3RlZCBkZXZpY2UgZG9lcyBub3QKKyAgICAvLyBpbnRlcmZlcmUgd2l0aCB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5CisgICAgLy8gaWYgc3RhdGVDaGFuZ2UgaXMgdHJ1ZSwgd2UgYXJlIGNhbGxlZCBmcm9tIHNldFBob25lU3RhdGUoKSBhbmQgd2UgbXVzdCBtdXRlIG9yIHVubXV0ZSBhcworICAgIC8vIG1hbnkgdGltZXMgYXMgdGhlcmUgYXJlIGFjdGl2ZSB0cmFja3Mgb24gdGhlIG91dHB1dAorICAgIGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgc3RyZWFtX3N0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKKyAgICBpZiAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8CisgICAgICAgICAgICAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKKyAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIHN0cmVhbSAlZCBzdGFydGluZyAlZCBkZXZpY2UgJXggc3RhdGVDaGFuZ2UgJWQiLAorICAgICAgICAgICAgICAgIHN0cmVhbSwgc3RhcnRpbmcsIG91dHB1dERlc2MtPm1EZXZpY2UsIHN0YXRlQ2hhbmdlKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dKSB7CisgICAgICAgICAgICBpbnQgbXV0ZUNvdW50ID0gMTsKKyAgICAgICAgICAgIGlmIChzdGF0ZUNoYW5nZSkgeworICAgICAgICAgICAgICAgIG11dGVDb3VudCA9IG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2xvd192aXNpYmlsaXR5KHN0cmVhbSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgbG93IHZpc2liaWxpdHksIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdXRlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKHN0cmVhbSwgc3RhcnRpbmcsIG1QcmltYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkiKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIHRydWUgLypmcm9tQ2FjaGUqLykpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSBtdXRlZCwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdXRlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdGFydFRvbmUoQVVESU9fUE9MSUNZX1RPTkVfSU5fQ0FMTF9OT1RJRklDQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdG9wVG9uZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzSW5DYWxsKCkKK3sKKyAgICByZXR1cm4gaXNTdGF0ZUluQ2FsbChtUGhvbmVTdGF0ZSk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0YXRlSW5DYWxsKGludCBzdGF0ZSkgeworICAgIHJldHVybiAoKHN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgfHwKKyAgICAgICAgICAgIChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NPTU1VTklDQVRJT04pKTsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpCit7CisgICAgcmV0dXJuIE1BWF9FRkZFQ1RTX0NQVV9MT0FEOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1heEVmZmVjdHNNZW1vcnkoKQoreworICAgIHJldHVybiBNQVhfRUZGRUNUU19NRU1PUlk7Cit9CisKKworLy8gLS0tIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yKAorICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlKQorICAgIDogbUlkKDApLCBtSW9IYW5kbGUoMCksIG1MYXRlbmN5KDApLAorICAgIG1GbGFncygoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpMCksIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLCBtUGF0Y2hIYW5kbGUoMCksCisgICAgbU91dHB1dDEoMCksIG1PdXRwdXQyKDApLCBtUHJvZmlsZShwcm9maWxlKSwgbURpcmVjdE9wZW5Db3VudCgwKQoreworICAgIC8vIGNsZWFyIHVzYWdlIGNvdW50IGZvciBhbGwgc3RyZWFtIHR5cGVzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgbVJlZkNvdW50W2ldID0gMDsKKyAgICAgICAgbUN1clZvbHVtZVtpXSA9IC0xLjA7CisgICAgICAgIG1NdXRlQ291bnRbaV0gPSAwOworICAgICAgICBtU3RvcFRpbWVbaV0gPSAwOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKKyAgICAgICAgbVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IGZhbHNlOworICAgIH0KKyAgICBpZiAocHJvZmlsZSAhPSBOVUxMKSB7CisgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClwcm9maWxlLT5tRmxhZ3M7CisgICAgICAgIG1TYW1wbGluZ1JhdGUgPSBwcm9maWxlLT5waWNrU2FtcGxpbmdSYXRlKCk7CisgICAgICAgIG1Gb3JtYXQgPSBwcm9maWxlLT5waWNrRm9ybWF0KCk7CisgICAgICAgIG1DaGFubmVsTWFzayA9IHByb2ZpbGUtPnBpY2tDaGFubmVsTWFzaygpOworICAgICAgICBpZiAocHJvZmlsZS0+bUdhaW5zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOworICAgICAgICB9CisgICAgfQorfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmRldmljZSgpIGNvbnN0Cit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KShtT3V0cHV0MS0+bURldmljZSB8IG1PdXRwdXQyLT5tRGV2aWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbURldmljZTsKKyAgICB9Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpsYXRlbmN5KCkKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIChtT3V0cHV0MS0+bUxhdGVuY3kgPiBtT3V0cHV0Mi0+bUxhdGVuY3kpID8gbU91dHB1dDEtPm1MYXRlbmN5IDogbU91dHB1dDItPm1MYXRlbmN5OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtTGF0ZW5jeTsKKyAgICB9Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnNoYXJlc0h3TW9kdWxlV2l0aCgKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKQoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gbU91dHB1dDEtPnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKSB8fCBtT3V0cHV0Mi0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpOworICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpeworICAgICAgICByZXR1cm4gc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPm1PdXRwdXQxKSB8fCBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+bU91dHB1dDIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAobVByb2ZpbGUtPm1Nb2R1bGUgPT0gb3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1Nb2R1bGUpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhKQoreworICAgIC8vIGZvcndhcmQgdXNhZ2UgY291bnQgY2hhbmdlIHRvIGF0dGFjaGVkIG91dHB1dHMKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgbU91dHB1dDEtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOworICAgICAgICBtT3V0cHV0Mi0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7CisgICAgfQorICAgIGlmICgoZGVsdGEgKyAoaW50KW1SZWZDb3VudFtzdHJlYW1dKSA8IDApIHsKKyAgICAgICAgQUxPR1coImNoYW5nZVJlZkNvdW50KCkgaW52YWxpZCBkZWx0YSAlZCBmb3Igc3RyZWFtICVkLCByZWZDb3VudCAlZCIsCisgICAgICAgICAgICAgIGRlbHRhLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKKyAgICAgICAgbVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1SZWZDb3VudFtzdHJlYW1dICs9IGRlbHRhOworICAgIEFMT0dWKCJjaGFuZ2VSZWZDb3VudCgpIHN0cmVhbSAlZCwgY291bnQgJWQiLCBzdHJlYW0sIG1SZWZDb3VudFtzdHJlYW1dKTsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5zdXBwb3J0ZWREZXZpY2VzKCkgfCBtT3V0cHV0Mi0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgOworICAgIH0KK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgcmV0dXJuIGlzU3RyYXRlZ3lBY3RpdmUoTlVNX1NUUkFURUdJRVMsIGluUGFzdE1zKTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNTdHJhdGVneUFjdGl2ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAoreworICAgIGlmICgoc3lzVGltZSA9PSAwKSAmJiAoaW5QYXN0TXMgIT0gMCkpIHsKKyAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBpZiAoKChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKSA9PSBzdHJhdGVneSkgfHwKKyAgICAgICAgICAgICAgICAoTlVNX1NUUkFURUdJRVMgPT0gc3RyYXRlZ3kpKSAmJgorICAgICAgICAgICAgICAgIGlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWksIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKK3sKKyAgICBpZiAobVJlZkNvdW50W3N0cmVhbV0gIT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGluUGFzdE1zID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc3lzVGltZSA9PSAwKSB7CisgICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgfQorICAgIGlmIChuczJtcyhzeXNUaW1lIC0gbVN0b3BUaW1lW3N0cmVhbV0pIDwgaW5QYXN0TXMpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQoIWlzRHVwbGljYXRlZCgpLCAidG9BdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gZHVwbGljYXRlZCBvdXRwdXQgJWQiLCBtSW9IYW5kbGUpOworCisgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFfEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19GT1JNQVR8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOworICAgIH0KKyAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKworICAgIGRzdENvbmZpZy0+aWQgPSBtSWQ7CisgICAgZHN0Q29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKKyAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKKyAgICBkc3RDb25maWctPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKK3sKKyAgICBBTE9HX0FTU0VSVCghaXNEdXBsaWNhdGVkKCksICJ0b0F1ZGlvUG9ydCgpIGNhbGxlZCBvbiBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIG1Jb0hhbmRsZSk7CisgICAgbVByb2ZpbGUtPnRvQXVkaW9Qb3J0KHBvcnQpOworICAgIHBvcnQtPmlkID0gbUlkOworICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZwb3J0LT5hY3RpdmVfY29uZmlnKTsKKyAgICBwb3J0LT5leHQubWl4Lmh3X21vZHVsZSA9IG1Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlOworICAgIHBvcnQtPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOworICAgIHBvcnQtPmV4dC5taXgubGF0ZW5jeV9jbGFzcyA9CisgICAgICAgICAgICBtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUID8gQVVESU9fTEFURU5DWV9MT1cgOiBBVURJT19MQVRFTkNZX05PUk1BTDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIElEOiAlZFxuIiwgbUlkKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcm1hdDogJTA4eFxuIiwgbUZvcm1hdCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIExhdGVuY3k6ICVkXG4iLCBtTGF0ZW5jeSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGbGFncyAlMDh4XG4iLCBtRmxhZ3MpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBkZXZpY2UoKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJlYW0gdm9sdW1lIHJlZkNvdW50IG11dGVDb3VudFxuIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMmQgICAgICUuMDNmICAgICAlMDJkICAgICAgICUwMmRcbiIsCisgICAgICAgICAgICAgICAgIGksIG1DdXJWb2x1bWVbaV0sIG1SZWZDb3VudFtpXSwgbU11dGVDb3VudFtpXSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIC0tLSBBdWRpb0lucHV0RGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yOjpBdWRpb0lucHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlKQorICAgIDogbUlkKDApLCBtSW9IYW5kbGUoMCksCisgICAgICBtRGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwgbVBhdGNoSGFuZGxlKDApLCBtUmVmQ291bnQoMCksCisgICAgICBtSW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX0RFRkFVTFQpLCBtUHJvZmlsZShwcm9maWxlKSwgbUlzU291bmRUcmlnZ2VyKGZhbHNlKQoreworICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IHByb2ZpbGUtPnBpY2tTYW1wbGluZ1JhdGUoKTsKKyAgICAgICAgbUZvcm1hdCA9IHByb2ZpbGUtPnBpY2tGb3JtYXQoKTsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gcHJvZmlsZS0+cGlja0NoYW5uZWxNYXNrKCk7CisgICAgICAgIGlmIChwcm9maWxlLT5tR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKG1Qcm9maWxlICE9IDAsCisgICAgICAgICAgICAgICAgInRvQXVkaW9Qb3J0Q29uZmlnKCkgY2FsbGVkIG9uIGlucHV0IHdpdGggbnVsbCBwcm9maWxlICVkIiwgbUlvSGFuZGxlKTsKKyAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEV8QVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVHxBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIGlmIChzcmNDb25maWcgIT0gTlVMTCkgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IHNyY0NvbmZpZy0+Y29uZmlnX21hc2s7CisgICAgfQorCisgICAgQXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CisKKyAgICBkc3RDb25maWctPmlkID0gbUlkOworICAgIGRzdENvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgIGRzdENvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7CisgICAgZHN0Q29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7CisgICAgZHN0Q29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gbUlucHV0U291cmNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKG1Qcm9maWxlICE9IDAsICJ0b0F1ZGlvUG9ydCgpIGNhbGxlZCBvbiBpbnB1dCB3aXRoIG51bGwgcHJvZmlsZSAlZCIsIG1Jb0hhbmRsZSk7CisKKyAgICBtUHJvZmlsZS0+dG9BdWRpb1BvcnQocG9ydCk7CisgICAgcG9ydC0+aWQgPSBtSWQ7CisgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOworICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gbVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7CisgICAgcG9ydC0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7CisgICAgcG9ydC0+ZXh0Lm1peC5sYXRlbmN5X2NsYXNzID0gQVVESU9fTEFURU5DWV9OT1JNQUw7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIElEOiAlZFxuIiwgbUlkKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBEZXZpY2VzICUwOHhcbiIsIG1EZXZpY2UpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUmVmIENvdW50ICVkXG4iLCBtUmVmQ291bnQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgT3BlbiBSZWYgQ291bnQgJWRcbiIsIG1PcGVuUmVmQ291bnQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyAtLS0gU3RyZWFtRGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvbGljeU1hbmFnZXI6OlN0cmVhbURlc2NyaXB0b3I6OlN0cmVhbURlc2NyaXB0b3IoKQorICAgIDogICBtSW5kZXhNaW4oMCksIG1JbmRleE1heCgxKSwgbUNhbkJlTXV0ZWQodHJ1ZSkKK3sKKyAgICBtSW5kZXhDdXIuYWRkKEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCwgMCk7Cit9CisKK2ludCBBdWRpb1BvbGljeU1hbmFnZXI6OlN0cmVhbURlc2NyaXB0b3I6OmdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgZGV2aWNlID0gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKKyAgICAvLyB0aGVyZSBpcyBhbHdheXMgYSB2YWxpZCBlbnRyeSBmb3IgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUCisgICAgaWYgKG1JbmRleEN1ci5pbmRleE9mS2V5KGRldmljZSkgPCAwKSB7CisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVDsKKyAgICB9CisgICAgcmV0dXJuIG1JbmRleEN1ci52YWx1ZUZvcihkZXZpY2UpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6U3RyZWFtRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyAgICAgICAgICUwMmQgICAgICAgICAlMDJkICAgICAgICAgIiwKKyAgICAgICAgICAgICBtQ2FuQmVNdXRlZCA/ICJ0cnVlICIgOiAiZmFsc2UiLCBtSW5kZXhNaW4sIG1JbmRleE1heCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUluZGV4Q3VyLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUwNHggOiAlMDJkLCAiLAorICAgICAgICAgICAgICAgICBtSW5kZXhDdXIua2V5QXQoaSksCisgICAgICAgICAgICAgICAgIG1JbmRleEN1ci52YWx1ZUF0KGkpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKKy8vIC0tLSBFZmZlY3REZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6RWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSS9POiAlZFxuIiwgbUlvKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmF0ZWd5OiAlZFxuIiwgbVN0cmF0ZWd5KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNlc3Npb246ICVkXG4iLCBtU2Vzc2lvbik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBOYW1lOiAlc1xuIiwgIG1EZXNjLm5hbWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJXNcbiIsICBtRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gLS0tIEh3TW9kdWxlIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6Okh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCisgICAgOiBtTmFtZShzdHJuZHVwKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NQVhfTEVOKSksCisgICAgICBtSGFsVmVyc2lvbihBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fTUlOKSwgbUhhbmRsZSgwKQoreworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjp+SHdNb2R1bGUoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+bVN1cHBvcnRlZERldmljZXMuY2xlYXIoKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+bVN1cHBvcnRlZERldmljZXMuY2xlYXIoKTsKKyAgICB9CisgICAgZnJlZSgodm9pZCAqKW1OYW1lKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6bG9hZElucHV0KGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgocm9vdC0+bmFtZSksIEFVRElPX1BPUlRfUk9MRV9TSU5LLCB0aGlzKTsKKworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgU0FNUExJTkdfUkFURVNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkU2FtcGxpbmdSYXRlcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRk9STUFUU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRGb3JtYXRzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRJbkNoYW5uZWxzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMubG9hZERldmljZXNGcm9tTmFtZSgoY2hhciAqKW5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVjbGFyZWREZXZpY2VzKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRkxBR1NfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tRmxhZ3MgPSBwYXJzZUlucHV0RmxhZ05hbWVzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRHYWlucyhub2RlKTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpLAorICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGRldmljZXMiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGZvcm1hdHMiKTsKKyAgICBpZiAoIXByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpICE9IDApICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICE9IDApICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpICE9IDApKSB7CisKKyAgICAgICAgQUxPR1YoImxvYWRJbnB1dCgpIGFkZGluZyBpbnB1dCBTdXBwb3J0ZWQgRGV2aWNlcyAlMDR4IiwKKyAgICAgICAgICAgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSk7CisKKyAgICAgICAgbUlucHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OmxvYWRPdXRwdXQoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOChyb290LT5uYW1lKSwgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgdGhpcyk7CisKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIFNBTVBMSU5HX1JBVEVTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZPUk1BVFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkT3V0Q2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRVNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21OYW1lKChjaGFyICopbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXMpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGTEFHU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1GbGFncyA9IHBhcnNlT3V0cHV0RmxhZ05hbWVzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRHYWlucyhub2RlKTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpLAorICAgICAgICAgICAgImxvYWRPdXRwdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBkZXZpY2VzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRPdXRwdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRPdXRwdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBmb3JtYXRzIik7CisgICAgaWYgKCFwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSAhPSAwKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSAhPSAwKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSAhPSAwKSkgeworCisgICAgICAgIEFMT0dWKCJsb2FkT3V0cHV0KCkgYWRkaW5nIG91dHB1dCBTdXBwb3J0ZWQgRGV2aWNlcyAlMDR4LCBtRmxhZ3MgJTA0eCIsCisgICAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCksIHByb2ZpbGUtPm1GbGFncyk7CisKKyAgICAgICAgbU91dHB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpsb2FkRGV2aWNlKGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFX1RZUEUpID09IDApIHsKKyAgICAgICAgICAgIHR5cGUgPSBwYXJzZURldmljZU5hbWVzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIGlmICh0eXBlID09IEFVRElPX0RFVklDRV9OT05FIHx8CisgICAgICAgICAgICAoIWF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSAmJiAhYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSkpIHsKKyAgICAgICAgQUxPR1coImxvYWREZXZpY2UoKSBiYWQgdHlwZSAlMDh4IiwgdHlwZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KHJvb3QtPm5hbWUpLCB0eXBlKTsKKyAgICBkZXZpY2VEZXNjLT5tTW9kdWxlID0gdGhpczsKKworICAgIG5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRV9BRERSRVNTKSA9PSAwKSB7CisgICAgICAgICAgICBkZXZpY2VEZXNjLT5tQWRkcmVzcyA9IFN0cmluZzgoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSkgeworICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmxvYWRJbkNoYW5uZWxzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VEZXNjLT5sb2FkT3V0Q2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgeworICAgICAgICAgICAgZGV2aWNlRGVzYy0+bG9hZEdhaW5zKG5vZGUpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKworICAgIEFMT0dWKCJsb2FkRGV2aWNlKCkgYWRkaW5nIGRldmljZSBuYW1lICVzIHR5cGUgJTA4eCBhZGRyZXNzICVzIiwKKyAgICAgICAgICBkZXZpY2VEZXNjLT5tTmFtZS5zdHJpbmcoKSwgdHlwZSwgZGV2aWNlRGVzYy0+bUFkZHJlc3Muc3RyaW5nKCkpOworCisgICAgbURlY2xhcmVkRGV2aWNlcy5hZGQoZGV2aWNlRGVzYyk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gbmFtZTogJXNcbiIsIG1OYW1lKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIGhhbmRsZTogJWRcbiIsIG1IYW5kbGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gdmVyc2lvbjogJXUuJXVcbiIsIG1IYWxWZXJzaW9uID4+IDgsIG1IYWxWZXJzaW9uICYgMHhGRik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGlmIChtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpKSB7CisgICAgICAgIHdyaXRlKGZkLCAiICAtIG91dHB1dHM6XG4iLCBzdHJsZW4oIiAgLSBvdXRwdXRzOlxuIikpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIG91dHB1dCAlenU6XG4iLCBpKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1JbnB1dFByb2ZpbGVzLnNpemUoKSkgeworICAgICAgICB3cml0ZShmZCwgIiAgLSBpbnB1dHM6XG4iLCBzdHJsZW4oIiAgLSBpbnB1dHM6XG4iKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBpbnB1dCAlenU6XG4iLCBpKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5kdW1wKGZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobURlY2xhcmVkRGV2aWNlcy5zaXplKCkpIHsKKyAgICAgICAgd3JpdGUoZmQsICIgIC0gZGV2aWNlczpcbiIsIHN0cmxlbigiICAtIGRldmljZXM6XG4iKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURlY2xhcmVkRGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlc1tpXS0+ZHVtcChmZCwgNCwgaSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLSBBdWRpb1BvcnQgY2xhc3MgaW1wbGVtZW50YXRpb24KKworCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6QXVkaW9Qb3J0KGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpIDoKKyAgICBtTmFtZShuYW1lKSwgbVR5cGUodHlwZSksIG1Sb2xlKHJvbGUpLCBtTW9kdWxlKG1vZHVsZSksIG1GbGFncygwKQoreworICAgIG1Vc2VJbkNoYW5uZWxNYXNrID0gKCh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpICYmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpKSB8fAorICAgICAgICAgICAgICAgICAgICAoKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Cit7CisgICAgcG9ydC0+cm9sZSA9IG1Sb2xlOworICAgIHBvcnQtPnR5cGUgPSBtVHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9TQU1QTElOR19SQVRFUzsgaSsrKSB7CisgICAgICAgIGlmIChtU2FtcGxpbmdSYXRlc1tpXSAhPSAwKSB7CisgICAgICAgICAgICBwb3J0LT5zYW1wbGVfcmF0ZXNbaV0gPSBtU2FtcGxpbmdSYXRlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwb3J0LT5udW1fc2FtcGxlX3JhdGVzID0gaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX0NIQU5ORUxfTUFTS1M7IGkrKykgeworICAgICAgICBpZiAobUNoYW5uZWxNYXNrc1tpXSAhPSAwKSB7CisgICAgICAgICAgICBwb3J0LT5jaGFubmVsX21hc2tzW2ldID0gbUNoYW5uZWxNYXNrc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwb3J0LT5udW1fY2hhbm5lbF9tYXNrcyA9IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfRk9STUFUUzsgaSsrKSB7CisgICAgICAgIGlmIChtRm9ybWF0c1tpXSAhPSAwKSB7CisgICAgICAgICAgICBwb3J0LT5mb3JtYXRzW2ldID0gbUZvcm1hdHNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcG9ydC0+bnVtX2Zvcm1hdHMgPSBpOworCisgICAgQUxPR1YoIkF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQoKSBudW0gZ2FpbnMgJXp1IiwgbUdhaW5zLnNpemUoKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbUdhaW5zLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfR0FJTlM7IGkrKykgeworICAgICAgICBwb3J0LT5nYWluc1tpXSA9IG1HYWluc1tpXS0+bUdhaW47CisgICAgfQorICAgIHBvcnQtPm51bV9nYWlucyA9IGk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+IHBvcnQpIHsKKyAgICBmb3IgKHNpemVfdCBrID0gMCA7IGsgPCBwb3J0LT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgOyBrKyspIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgcmF0ZSA9IHBvcnQtPm1TYW1wbGluZ1JhdGVzLml0ZW1BdChrKTsKKyAgICAgICAgaWYgKHJhdGUgIT0gMCkgeyAvLyBza2lwICJkeW5hbWljIiByYXRlcworICAgICAgICAgICAgYm9vbCBoYXNSYXRlID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBsID0gMCA7IGwgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCkgOyBsKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocmF0ZSA9PSBtU2FtcGxpbmdSYXRlcy5pdGVtQXQobCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzUmF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaGFzUmF0ZSkgeyAvLyBuZXZlciBpbXBvcnQgYSBzYW1wbGluZyByYXRlIHR3aWNlCisgICAgICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKHJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGsgPSAwIDsgayA8IHBvcnQtPm1DaGFubmVsTWFza3Muc2l6ZSgpIDsgaysrKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2sgPSBwb3J0LT5tQ2hhbm5lbE1hc2tzLml0ZW1BdChrKTsKKyAgICAgICAgaWYgKG1hc2sgIT0gMCkgeyAvLyBza2lwICJkeW5hbWljIiBtYXNrcworICAgICAgICAgICAgYm9vbCBoYXNNYXNrID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBsID0gMCA7IGwgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKSA7IGwrKykgeworICAgICAgICAgICAgICAgIGlmIChtYXNrID09IG1DaGFubmVsTWFza3MuaXRlbUF0KGwpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc01hc2sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWhhc01hc2spIHsgLy8gbmV2ZXIgaW1wb3J0IGEgY2hhbm5lbCBtYXNrIHR3aWNlCisgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQobWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChzaXplX3QgayA9IDAgOyBrIDwgcG9ydC0+bUZvcm1hdHMuc2l6ZSgpIDsgaysrKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHBvcnQtPm1Gb3JtYXRzLml0ZW1BdChrKTsKKyAgICAgICAgaWYgKGZvcm1hdCAhPSAwKSB7IC8vIHNraXAgImR5bmFtaWMiIGZvcm1hdHMKKyAgICAgICAgICAgIGJvb2wgaGFzRm9ybWF0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBsID0gMCA7IGwgPCBtRm9ybWF0cy5zaXplKCkgOyBsKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IG1Gb3JtYXRzLml0ZW1BdChsKSkgeworICAgICAgICAgICAgICAgICAgICBoYXNGb3JtYXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWhhc0Zvcm1hdCkgeyAvLyBuZXZlciBpbXBvcnQgYSBjaGFubmVsIG1hc2sgdHdpY2UKKyAgICAgICAgICAgICAgICBtRm9ybWF0cy5hZGQoZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2xlYXJDYXBhYmlsaXRpZXMoKSB7CisgICAgbUNoYW5uZWxNYXNrcy5jbGVhcigpOworICAgIG1Gb3JtYXRzLmNsZWFyKCk7CisgICAgbVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZFNhbXBsaW5nUmF0ZXMoY2hhciAqbmFtZSkKK3sKKyAgICBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbVNhbXBsaW5nUmF0ZXMgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgc2FtcGxpbmcKKyAgICAvLyByYXRlcyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtIGFmdGVyIGl0IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIHVpbnQzMl90IHJhdGUgPSBhdG9pKHN0cik7CisgICAgICAgIGlmIChyYXRlICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkU2FtcGxpbmdSYXRlcygpIGFkZGluZyByYXRlICVkIiwgcmF0ZSk7CisgICAgICAgICAgICBtU2FtcGxpbmdSYXRlcy5hZGQocmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkRm9ybWF0cyhjaGFyICpuYW1lKQoreworICAgIGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgLy8gYnkgY29udmVudGlvbiwgIjAnIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBtRm9ybWF0cyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBmb3JtYXRzCisgICAgLy8gc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCisgICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7CisgICAgICAgIG1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KXN0cmluZ1RvRW51bShzRm9ybWF0TmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgbUZvcm1hdHMuYWRkKGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkSW5DaGFubmVscyhjaGFyICpuYW1lKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgQUxPR1YoImxvYWRJbkNoYW5uZWxzKCkgJXMiLCBuYW1lKTsKKworICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgeworICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KXN0cmluZ1RvRW51bShzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkSW5DaGFubmVscygpIGFkZGluZyBjaGFubmVsTWFzayAlMDR4IiwgY2hhbm5lbE1hc2spOworICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2spOworICAgICAgICB9CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZE91dENoYW5uZWxzKGNoYXIgKm5hbWUpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICBBTE9HVigibG9hZE91dENoYW5uZWxzKCkgJXMiLCBuYW1lKTsKKworICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbUNoYW5uZWxNYXNrcyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBjaGFubmVsCisgICAgLy8gbWFza3Mgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCisgICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7CisgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3Qpc3RyaW5nVG9FbnVtKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgIGlmIChjaGFubmVsTWFzayAhPSAwKSB7CisgICAgICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZChjaGFubmVsTWFzayk7CisgICAgICAgIH0KKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorICAgIHJldHVybjsKK30KKworYXVkaW9fZ2Fpbl9tb2RlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRHYWluTW9kZShjaGFyICpuYW1lKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgQUxPR1YoImxvYWRHYWluTW9kZSgpICVzIiwgbmFtZSk7CisgICAgYXVkaW9fZ2Fpbl9tb2RlX3QgbW9kZSA9IDA7CisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIG1vZGUgfD0gKGF1ZGlvX2dhaW5fbW9kZV90KXN0cmluZ1RvRW51bShzR2Fpbk1vZGVOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNHYWluTW9kZU5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9CisgICAgcmV0dXJuIG1vZGU7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRHYWluKGNub2RlICpyb290LCBpbnQgaW5kZXgpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIHNwPEF1ZGlvR2Fpbj4gZ2FpbiA9IG5ldyBBdWRpb0dhaW4oaW5kZXgsIG1Vc2VJbkNoYW5uZWxNYXNrKTsKKworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NT0RFKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5tb2RlID0gbG9hZEdhaW5Nb2RlKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX0NIQU5ORUxTKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgICAgICBnYWluLT5tR2Fpbi5jaGFubmVsX21hc2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KXN0cmluZ1RvRW51bShzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnYWluLT5tR2Fpbi5jaGFubmVsX21hc2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KXN0cmluZ1RvRW51bShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUlOX1ZBTFVFKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5taW5fdmFsdWUgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01BWF9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWF4X3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9ERUZBVUxUX1ZBTFVFKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5kZWZhdWx0X3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9TVEVQX1ZBTFVFKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5zdGVwX3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NSU5fUkFNUF9NUykgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWluX3JhbXBfbXMgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01BWF9SQU1QX01TKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5tYXhfcmFtcF9tcyA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorCisgICAgQUxPR1YoImxvYWRHYWluKCkgYWRkaW5nIG5ldyBnYWluIG1vZGUgJTA4eCBjaGFubmVsIG1hc2sgJTA4eCBtaW4gbUIgJWQgbWF4IG1CICVkIiwKKyAgICAgICAgICBnYWluLT5tR2Fpbi5tb2RlLCBnYWluLT5tR2Fpbi5jaGFubmVsX21hc2ssIGdhaW4tPm1HYWluLm1pbl92YWx1ZSwgZ2Fpbi0+bUdhaW4ubWF4X3ZhbHVlKTsKKworICAgIGlmIChnYWluLT5tR2Fpbi5tb2RlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtR2FpbnMuYWRkKGdhaW4pOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkR2FpbnMoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIEFMT0dWKCJsb2FkR2FpbnMoKSBsb2FkaW5nIGdhaW4gJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgbG9hZEdhaW4obm9kZSwgaW5kZXgrKyk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrRXhhY3RTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGlmIChtU2FtcGxpbmdSYXRlc1tpXSA9PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUpIGNvbnN0Cit7CisgICAgLy8gU2VhcmNoIGZvciB0aGUgY2xvc2VzdCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZSB0aGF0IGlzIGFib3ZlIChwcmVmZXJyZWQpCisgICAgLy8gb3IgYmVsb3cgKGFjY2VwdGFibGUpIHRoZSBkZXNpcmVkIHNhbXBsaW5nIHJhdGUsIHdpdGhpbiBhIHBlcm1pdHRlZCByYXRpby4KKyAgICAvLyBUaGUgc2FtcGxpbmcgcmF0ZXMgZG8gbm90IG5lZWQgdG8gYmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4KKyAgICBzc2l6ZV90IG1heEJlbG93ID0gLTE7CisgICAgc3NpemVfdCBtaW5BYm92ZSA9IC0xOworICAgIHVpbnQzMl90IGNhbmRpZGF0ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNhbmRpZGF0ZSA9IG1TYW1wbGluZ1JhdGVzW2ldOworICAgICAgICBpZiAoY2FuZGlkYXRlID09IHNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIC8vIGNhbmRpZGF0ZSA8IGRlc2lyZWQKKyAgICAgICAgaWYgKGNhbmRpZGF0ZSA8IHNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgaWYgKG1heEJlbG93IDwgMCB8fCBjYW5kaWRhdGUgPiBtU2FtcGxpbmdSYXRlc1ttYXhCZWxvd10pIHsKKyAgICAgICAgICAgICAgICBtYXhCZWxvdyA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIC8vIGNhbmRpZGF0ZSA+IGRlc2lyZWQKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtaW5BYm92ZSA8IDAgfHwgY2FuZGlkYXRlIDwgbVNhbXBsaW5nUmF0ZXNbbWluQWJvdmVdKSB7CisgICAgICAgICAgICAgICAgbWluQWJvdmUgPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFRoaXMgdXNlcyBoYXJkLWNvZGVkIGtub3dsZWRnZSBhYm91dCBBdWRpb0ZsaW5nZXIgcmVzYW1wbGluZyByYXRpb3MuCisgICAgLy8gVE9ETyBNb3ZlIHRoZXNlIGFzc3VtcHRpb25zIG91dC4KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heERvd25TYW1wbGVSYXRpbyA9IDY7ICAvLyBiZXlvbmQgdGhpcyBhbGlhc2luZyBvY2N1cnMKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heFVwU2FtcGxlUmF0aW8gPSAyNTY7ICAvLyBiZXlvbmQgdGhpcyBzYW1wbGUgcmF0ZSBpbmFjY3VyYWNpZXMgb2NjdXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdWUgdG8gYXBwcm94aW1hdGlvbiBieSBhbiBpbnQzMl90IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBoYXNlIGluY3JlbWVudHMKKyAgICAvLyBQcmVmZXIgdG8gZG93bi1zYW1wbGUgZnJvbSBhIGhpZ2hlciBzYW1wbGluZyByYXRlLCBhcyB3ZSBnZXQgdGhlIGRlc2lyZWQgZnJlcXVlbmN5IHNwZWN0cnVtLgorICAgIGlmIChtaW5BYm92ZSA+PSAwKSB7CisgICAgICAgIGNhbmRpZGF0ZSA9IG1TYW1wbGluZ1JhdGVzW21pbkFib3ZlXTsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZSAvIGtNYXhEb3duU2FtcGxlUmF0aW8gPD0gc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBjYW5kaWRhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gQnV0IGlmIHdlIGhhdmUgdG8gdXAtc2FtcGxlIGZyb20gYSBsb3dlciBzYW1wbGluZyByYXRlLCB0aGF0J3MgT0suCisgICAgaWYgKG1heEJlbG93ID49IDApIHsKKyAgICAgICAgY2FuZGlkYXRlID0gbVNhbXBsaW5nUmF0ZXNbbWF4QmVsb3ddOworICAgICAgICBpZiAoY2FuZGlkYXRlICoga01heFVwU2FtcGxlUmF0aW8gPj0gc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBjYW5kaWRhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gbGVhdmUgdXBkYXRlZFNhbXBsaW5nUmF0ZSB1bm1vZGlmaWVkCisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrRXhhY3RDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1DaGFubmVsTWFza3NbaV0gPT0gY2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tDb21wYXRpYmxlQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spCisgICAgICAgIGNvbnN0Cit7CisgICAgY29uc3QgYm9vbCBpc1JlY29yZFRocmVhZCA9IG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgbVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSArKykgeworICAgICAgICAvLyBGSVhNRSBEb2VzIG5vdCBoYW5kbGUgbXVsdGktY2hhbm5lbCBhdXRvbWF0aWMgY29udmVyc2lvbnMgeWV0CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHN1cHBvcnRlZCA9IG1DaGFubmVsTWFza3NbaV07CisgICAgICAgIGlmIChzdXBwb3J0ZWQgPT0gY2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNSZWNvcmRUaHJlYWQpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgdXNlcyBoYXJkLWNvZGVkIGtub3dsZWRnZSB0aGF0IEF1ZGlvRmxpbmdlciBjYW4gc2lsZW50bHkgZG93bi1taXggYW5kIHVwLW1peC4KKyAgICAgICAgICAgIC8vIEZJWE1FIEFic3RyYWN0IHRoaXMgb3V0IHRvIGEgdGFibGUuCisgICAgICAgICAgICBpZiAoKChzdXBwb3J0ZWQgPT0gQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLIHx8IHN1cHBvcnRlZCA9PSBBVURJT19DSEFOTkVMX0lOX1NURVJFTykKKyAgICAgICAgICAgICAgICAgICAgJiYgY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9NT05PKSB8fAorICAgICAgICAgICAgICAgIChzdXBwb3J0ZWQgPT0gQVVESU9fQ0hBTk5FTF9JTl9NT05PICYmIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0sKKyAgICAgICAgICAgICAgICAgICAgfHwgY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGlmIChtRm9ybWF0c1tpXSA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpwaWNrU2FtcGxpbmdSYXRlKCkgY29uc3QKK3sKKyAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVuaW5pdGlhbGl6ZWQgZHluYW1pYyBwcm9maWxlCisgICAgaWYgKG1TYW1wbGluZ1JhdGVzLnNpemUoKSA9PSAxICYmIG1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gRm9yIGRpcmVjdCBvdXRwdXRzLCBwaWNrIG1pbmltdW0gc2FtcGxpbmcgcmF0ZTogdGhpcyBoZWxwcyBlbnN1cmluZyB0aGF0IHRoZQorICAgIC8vIGNoYW5uZWwgY291bnQgLyBzYW1wbGluZyByYXRlIGNvbWJpbmF0aW9uIGNob3NlbiB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdGVkCisgICAgLy8gc2luaworICAgIGlmICgobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCisgICAgICAgICAgICAobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSkgeworICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBVSU5UX01BWDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgIGlmICgobVNhbXBsaW5nUmF0ZXNbaV0gPCBzYW1wbGluZ1JhdGUpICYmIChtU2FtcGxpbmdSYXRlc1tpXSA+IDApKSB7CisgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlID0gbVNhbXBsaW5nUmF0ZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChzYW1wbGluZ1JhdGUgPT0gVUlOVF9NQVgpID8gMCA6IHNhbXBsaW5nUmF0ZTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwOworICAgIHVpbnQzMl90IG1heFJhdGUgPSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURTsKKworICAgIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdXNlIG1heCBtaXhlciBzYW1wbGluZyByYXRlcy4gRG8gbm90CisgICAgLy8gbGltaXQgc2FtcGxpbmcgcmF0ZSBvdGhlcndpc2UKKyAgICBpZiAobVR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBtYXhSYXRlID0gVUlOVF9NQVg7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGlmICgobVNhbXBsaW5nUmF0ZXNbaV0gPiBzYW1wbGluZ1JhdGUpICYmIChtU2FtcGxpbmdSYXRlc1tpXSA8PSBtYXhSYXRlKSkgeworICAgICAgICAgICAgc2FtcGxpbmdSYXRlID0gbVNhbXBsaW5nUmF0ZXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNhbXBsaW5nUmF0ZTsKK30KKworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnBpY2tDaGFubmVsTWFzaygpIGNvbnN0Cit7CisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB1bmluaXRpYWxpemVkIGR5bmFtaWMgcHJvZmlsZQorICAgIGlmIChtQ2hhbm5lbE1hc2tzLnNpemUoKSA9PSAxICYmIG1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIH0KKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKworICAgIC8vIEZvciBkaXJlY3Qgb3V0cHV0cywgcGljayBtaW5pbXVtIGNoYW5uZWwgY291bnQ6IHRoaXMgaGVscHMgZW5zdXJpbmcgdGhhdCB0aGUKKyAgICAvLyBjaGFubmVsIGNvdW50IC8gc2FtcGxpbmcgcmF0ZSBjb21iaW5hdGlvbiBjaG9zZW4gd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbm5lY3RlZAorICAgIC8vIHNpbmsKKyAgICBpZiAoKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgorICAgICAgICAgICAgKG1GbGFncyAmIChBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSkpIHsKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gVUlOVF9NQVg7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNubENvdW50OworICAgICAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNubENvdW50IDwgY2hhbm5lbENvdW50KSAmJiAoY25sQ291bnQgPiAwKSkgeworICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrc1tpXTsKKyAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjbmxDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hhbm5lbE1hc2s7CisgICAgfQorCisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gMDsKKyAgICB1aW50MzJfdCBtYXhDb3VudCA9IE1BWF9NSVhFUl9DSEFOTkVMX0NPVU5UOworCisgICAgLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB1c2UgbWF4IG1peGVyIGNoYW5uZWwgY291bnQuIERvIG5vdAorICAgIC8vIGxpbWl0IGNoYW5uZWwgY291bnQgb3RoZXJ3aXNlCisgICAgaWYgKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgbWF4Q291bnQgPSBVSU5UX01BWDsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSArKykgeworICAgICAgICB1aW50MzJfdCBjbmxDb3VudDsKKyAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjbmxDb3VudCA+IGNoYW5uZWxDb3VudCkgJiYgKGNubENvdW50IDw9IG1heENvdW50KSkgeworICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2tzW2ldOworICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gY25sQ291bnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNoYW5uZWxNYXNrOworfQorCisvKiBmb3JtYXQgaW4gb3JkZXIgb2YgaW5jcmVhc2luZyBwcmVmZXJlbmNlICovCitjb25zdCBhdWRpb19mb3JtYXRfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZVtdID0geworICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCwKKyAgICAgICAgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCit9OworCitpbnQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNvbXBhcmVGb3JtYXRzKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDIpCit7CisgICAgLy8gTk9URTogQVVESU9fRk9STUFUX0lOVkFMSUQgaXMgYWxzbyBjb25zaWRlcmVkIG5vdCBQQ00gYW5kIHdpbGwgYmUgY29tcGFyZWQgZXF1YWwgdG8gYW55CisgICAgLy8gY29tcHJlc3NlZCBmb3JtYXQgYW5kIGJldHRlciB0aGFuIGFueSBQQ00gZm9ybWF0LiBUaGlzIGlzIGJ5IGRlc2lnbiBvZiBwaWNrRm9ybWF0KCkKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0MSkpIHsKKyAgICAgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdDIpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdDIpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnQgaW5kZXgxID0gLTEsIGluZGV4MiA9IC0xOworICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgKGkgPCBBUlJBWV9TSVpFKHNQY21Gb3JtYXRDb21wYXJlVGFibGUpKSAmJiAoKGluZGV4MSA9PSAtMSkgfHwgKGluZGV4MiA9PSAtMSkpOworICAgICAgICAgICAgaSArKykgeworICAgICAgICBpZiAoc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtpXSA9PSBmb3JtYXQxKSB7CisgICAgICAgICAgICBpbmRleDEgPSBpOworICAgICAgICB9CisgICAgICAgIGlmIChzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW2ldID09IGZvcm1hdDIpIHsKKyAgICAgICAgICAgIGluZGV4MiA9IGk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gZm9ybWF0MSBub3QgZm91bmQgPT4gaW5kZXgxIDwgMCA9PiBmb3JtYXQyID4gZm9ybWF0MQorICAgIC8vIGZvcm1hdDIgbm90IGZvdW5kID0+IGluZGV4MiA8IDAgPT4gZm9ybWF0MiA8IGZvcm1hdDEKKyAgICByZXR1cm4gaW5kZXgxIC0gaW5kZXgyOworfQorCithdWRpb19mb3JtYXRfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6cGlja0Zvcm1hdCgpIGNvbnN0Cit7CisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB1bmluaXRpYWxpemVkIGR5bmFtaWMgcHJvZmlsZQorICAgIGlmIChtRm9ybWF0cy5zaXplKCkgPT0gMSAmJiBtRm9ybWF0c1swXSA9PSAwKSB7CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICB9CisKKyAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICBhdWRpb19mb3JtYXRfdCBiZXN0Rm9ybWF0ID0KKyAgICAgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpzUGNtRm9ybWF0Q29tcGFyZVRhYmxlWworICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnNQY21Gb3JtYXRDb21wYXJlVGFibGUpIC0gMV07CisgICAgLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB1c2UgYmVzdCBtaXhlciBvdXRwdXQgZm9ybWF0LiBEbyBub3QKKyAgICAvLyBsaW1pdCBmb3JtYXQgb3RoZXJ3aXNlCisgICAgaWYgKChtVHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSB8fAorICAgICAgICAgICAgKChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgorICAgICAgICAgICAgICgoKG1GbGFncyAmIChBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSkgIT0gMCkpKSkgeworICAgICAgICBiZXN0Rm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgaWYgKChjb21wYXJlRm9ybWF0cyhtRm9ybWF0c1tpXSwgZm9ybWF0KSA+IDApICYmCisgICAgICAgICAgICAgICAgKGNvbXBhcmVGb3JtYXRzKG1Gb3JtYXRzW2ldLCBiZXN0Rm9ybWF0KSA8PSAwKSkgeworICAgICAgICAgICAgZm9ybWF0ID0gbUZvcm1hdHNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrR2Fpbihjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmdhaW5Db25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBpZiAoaW5kZXggPCAwIHx8IChzaXplX3QpaW5kZXggPj0gbUdhaW5zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gbUdhaW5zW2luZGV4XS0+Y2hlY2tDb25maWcoZ2FpbkNvbmZpZyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgaWYgKG1OYW1lLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKworICAgIGlmIChtU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNhbXBsaW5nIHJhdGVzOiAiLCBzcGFjZXMsICIiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA9PSAwICYmIG1TYW1wbGluZ1JhdGVzW2ldID09IDApIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJEeW5hbWljIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVkIiwgbVNhbXBsaW5nUmF0ZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtU2FtcGxpbmdSYXRlcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CisKKyAgICBpZiAobUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWwgbWFza3M6ICIsIHNwYWNlcywgIiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvUG9ydDo6ZHVtcCBtQ2hhbm5lbE1hc2tzICV6dSAlMDh4IiwgaSwgbUNoYW5uZWxNYXNrc1tpXSk7CisKKyAgICAgICAgICAgIGlmIChpID09IDAgJiYgbUNoYW5uZWxNYXNrc1tpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRHluYW1pYyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIweCUwNHgiLCBtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobUNoYW5uZWxNYXNrcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CisKKyAgICBpZiAobUZvcm1hdHMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBmb3JtYXRzOiAiLCBzcGFjZXMsICIiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXRTdHIgPSBlbnVtVG9TdHJpbmcoc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNGb3JtYXROYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXRzW2ldKTsKKyAgICAgICAgICAgIGlmIChpID09IDAgJiYgc3RyY21wKGZvcm1hdFN0ciwgIiIpID09IDApIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJEeW5hbWljIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzIiwgZm9ybWF0U3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobUZvcm1hdHMuc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGlmIChtR2FpbnMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBnYWluczpcbiIsIHNwYWNlcywgIiIpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSArIDEpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUdhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtR2FpbnNbaV0tPmR1bXAoZmQsIHNwYWNlcyArIDIsIGkpOworICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0gQXVkaW9HYWluIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9HYWluOjpBdWRpb0dhaW4oaW50IGluZGV4LCBib29sIHVzZUluQ2hhbm5lbE1hc2spCit7CisgICAgbUluZGV4ID0gaW5kZXg7CisgICAgbVVzZUluQ2hhbm5lbE1hc2sgPSB1c2VJbkNoYW5uZWxNYXNrOworICAgIG1lbXNldCgmbUdhaW4sIDAsIHNpemVvZihzdHJ1Y3QgYXVkaW9fZ2FpbikpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9HYWluOjpnZXREZWZhdWx0Q29uZmlnKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKQoreworICAgIGNvbmZpZy0+aW5kZXggPSBtSW5kZXg7CisgICAgY29uZmlnLT5tb2RlID0gbUdhaW4ubW9kZTsKKyAgICBjb25maWctPmNoYW5uZWxfbWFzayA9IG1HYWluLmNoYW5uZWxfbWFzazsKKyAgICBpZiAoKG1HYWluLm1vZGUgJiBBVURJT19HQUlOX01PREVfSk9JTlQpID09IEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgeworICAgICAgICBjb25maWctPnZhbHVlc1swXSA9IG1HYWluLmRlZmF1bHRfdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDMyX3QgbnVtVmFsdWVzOworICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1HYWluLmNoYW5uZWxfbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7CisgICAgICAgICAgICBjb25maWctPnZhbHVlc1tpXSA9IG1HYWluLmRlZmF1bHRfdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChtR2Fpbi5tb2RlICYgQVVESU9fR0FJTl9NT0RFX1JBTVApID09IEFVRElPX0dBSU5fTU9ERV9SQU1QKSB7CisgICAgICAgIGNvbmZpZy0+cmFtcF9kdXJhdGlvbl9tcyA9IG1HYWluLm1pbl9yYW1wX21zOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0dhaW46OmNoZWNrQ29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKQoreworICAgIGlmICgoY29uZmlnLT5tb2RlICYgfm1HYWluLm1vZGUpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKChjb25maWctPm1vZGUgJiBBVURJT19HQUlOX01PREVfSk9JTlQpID09IEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgeworICAgICAgICBpZiAoKGNvbmZpZy0+dmFsdWVzWzBdIDwgbUdhaW4ubWluX3ZhbHVlKSB8fAorICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT52YWx1ZXNbMF0gPiBtR2Fpbi5tYXhfdmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChjb25maWctPmNoYW5uZWxfbWFzayAmIH5tR2Fpbi5jaGFubmVsX21hc2spICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgbnVtVmFsdWVzOworICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKChjb25maWctPnZhbHVlc1tpXSA8IG1HYWluLm1pbl92YWx1ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+dmFsdWVzW2ldID4gbUdhaW4ubWF4X3ZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChjb25maWctPm1vZGUgJiBBVURJT19HQUlOX01PREVfUkFNUCkgPT0gQVVESU9fR0FJTl9NT0RFX1JBTVApIHsKKyAgICAgICAgaWYgKChjb25maWctPnJhbXBfZHVyYXRpb25fbXMgPCBtR2Fpbi5taW5fcmFtcF9tcykgfHwKKyAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+cmFtcF9kdXJhdGlvbl9tcyA+IG1HYWluLm1heF9yYW1wX21zKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0dhaW46OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNHYWluICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbW9kZTogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubW9kZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gY2hhbm5lbF9tYXNrOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5jaGFubmVsX21hc2spOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1pbl92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl92YWx1ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWF4X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3ZhbHVlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBkZWZhdWx0X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uZGVmYXVsdF92YWx1ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc3RlcF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLnN0ZXBfdmFsdWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1pbl9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3JhbXBfbXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1heF9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3JhbXBfbXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworfQorCisvLyAtLS0gQXVkaW9Qb3J0Q29uZmlnIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Q29uZmlnOjpBdWRpb1BvcnRDb25maWcoKQoreworICAgIG1TYW1wbGluZ1JhdGUgPSAwOworICAgIG1DaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgbUdhaW4uaW5kZXggPSAtMTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnRDb25maWc6OmFwcGx5QXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcpCit7CisgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGxvY2FsQmFja3VwQ29uZmlnOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgbG9jYWxCYWNrdXBDb25maWcuY29uZmlnX21hc2sgPSBjb25maWctPmNvbmZpZ19tYXNrOworICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7CisKKyAgICBzcDxBdWRpb1BvcnQ+IGF1ZGlvcG9ydCA9IGdldEF1ZGlvUG9ydCgpOworICAgIGlmIChhdWRpb3BvcnQgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKKyAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0V4YWN0U2FtcGxpbmdSYXRlKGNvbmZpZy0+c2FtcGxlX3JhdGUpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGU7CisgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7CisgICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tFeGFjdENoYW5uZWxNYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIG1DaGFubmVsTWFzayA9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOworICAgIH0KKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkgeworICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrRm9ybWF0KGNvbmZpZy0+Zm9ybWF0KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIG1Gb3JtYXQgPSBjb25maWctPmZvcm1hdDsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CisgICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tHYWluKCZjb25maWctPmdhaW4sIGNvbmZpZy0+Z2Fpbi5pbmRleCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtR2FpbiA9IGNvbmZpZy0+Z2FpbjsKKyAgICB9CisKK2V4aXQ6CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBhcHBseUF1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOworICAgIH0KKyAgICBpZiAoYmFja3VwQ29uZmlnICE9IE5VTEwpIHsKKyAgICAgICAgKmJhY2t1cENvbmZpZyA9IGxvY2FsQmFja3VwQ29uZmlnOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKK3sKKyAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7CisgICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSBtU2FtcGxpbmdSYXRlOworICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSkgeworICAgICAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IHNyY0NvbmZpZy0+c2FtcGxlX3JhdGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gMDsKKyAgICB9CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2s7CisgICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSkgeworICAgICAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBzcmNDb25maWctPmNoYW5uZWxfbWFzazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIH0KKyAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkgeworICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IG1Gb3JtYXQ7CisgICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSkgeworICAgICAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBzcmNDb25maWctPmZvcm1hdDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgfQorICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgeworICAgICAgICBkc3RDb25maWctPmdhaW4gPSBtR2FpbjsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSkgeworICAgICAgICAgICAgZHN0Q29uZmlnLT5nYWluID0gc3JjQ29uZmlnLT5nYWluOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5nYWluLmluZGV4ID0gLTE7CisgICAgfQorICAgIGlmIChkc3RDb25maWctPmdhaW4uaW5kZXggIT0gLTEpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJj0gfkFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgfQorfQorCisvLyAtLS0gSU9Qcm9maWxlIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjpJT1Byb2ZpbGUoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpCisgICAgOiBBdWRpb1BvcnQobmFtZSwgQVVESU9fUE9SVF9UWVBFX01JWCwgcm9sZSwgbW9kdWxlKQoreworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZTo6fklPUHJvZmlsZSgpCit7Cit9CisKKy8vIGNoZWNrcyBpZiB0aGUgSU8gcHJvZmlsZSBpcyBjb21wYXRpYmxlIHdpdGggc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisvLyBTYW1wbGluZyByYXRlLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFzayBtdXN0IGJlIHNwZWNpZmllZCBpbiBvcmRlciB0bworLy8gZ2V0IGEgdmFsaWQgYSBtYXRjaAorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZTo6aXNDb21wYXRpYmxlUHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSBjb25zdAoreworICAgIGNvbnN0IGJvb2wgaXNQbGF5YmFja1RocmVhZCA9IG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgbVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKKyAgICBjb25zdCBib29sIGlzUmVjb3JkVGhyZWFkID0gbVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBBTE9HX0FTU0VSVChpc1BsYXliYWNrVGhyZWFkICE9IGlzUmVjb3JkVGhyZWFkKTsKKworICAgIGlmICgobVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgIT0gZGV2aWNlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc2FtcGxpbmdSYXRlID09IDApIHsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdWludDMyX3QgbXlVcGRhdGVkU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOworICAgIGlmIChpc1BsYXliYWNrVGhyZWFkICYmIGNoZWNrRXhhY3RTYW1wbGluZ1JhdGUoc2FtcGxpbmdSYXRlKSAhPSBOT19FUlJPUikgeworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgY2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHNhbXBsaW5nUmF0ZSwgJm15VXBkYXRlZFNhbXBsaW5nUmF0ZSkgIT0KKyAgICAgICAgICAgIE5PX0VSUk9SKSB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSB8fCBjaGVja0Zvcm1hdChmb3JtYXQpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSB8fAorICAgICAgICAgICAgY2hlY2tFeGFjdENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSB8fAorICAgICAgICAgICAgY2hlY2tDb21wYXRpYmxlQ2hhbm5lbE1hc2soY2hhbm5lbE1hc2spICE9IE5PX0VSUk9SKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGlzUGxheWJhY2tUaHJlYWQgJiYgKG1GbGFncyAmIGZsYWdzKSAhPSBmbGFncykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIFRoZSBvbmx5IGlucHV0IGZsYWcgdGhhdCBpcyBhbGxvd2VkIHRvIGJlIGRpZmZlcmVudCBpcyB0aGUgZmFzdCBmbGFnLgorICAgIC8vIEFuIGV4aXN0aW5nIGZhc3Qgc3RyZWFtIGlzIGNvbXBhdGlibGUgd2l0aCBhIG5vcm1hbCB0cmFjayByZXF1ZXN0LgorICAgIC8vIEFuIGV4aXN0aW5nIG5vcm1hbCBzdHJlYW0gaXMgY29tcGF0aWJsZSB3aXRoIGEgZmFzdCB0cmFjayByZXF1ZXN0LAorICAgIC8vIGJ1dCB0aGUgZmFzdCByZXF1ZXN0IHdpbGwgYmUgZGVuaWVkIGJ5IEF1ZGlvRmxpbmdlciBhbmQgY29udmVydGVkIHRvIG5vcm1hbCB0cmFjay4KKyAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgKChtRmxhZ3MgXiBmbGFncykgJgorICAgICAgICAgICAgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKKyAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBteVVwZGF0ZWRTYW1wbGluZ1JhdGU7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIEF1ZGlvUG9ydDo6ZHVtcChmZCwgNCk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBmbGFnczogMHglMDR4XG4iLCBtRmxhZ3MpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBkZXZpY2VzOlxuIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbVN1cHBvcnRlZERldmljZXNbaV0tPmR1bXAoZmQsIDYsIGkpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZTo6bG9nKCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIEFMT0dWKCIgICAgLSBzYW1wbGluZyByYXRlczogIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICBBTE9HVigiICAlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKKyAgICB9CisKKyAgICBBTE9HVigiICAgIC0gY2hhbm5lbCBtYXNrczogIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIgIDB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOworICAgIH0KKworICAgIEFMT0dWKCIgICAgLSBmb3JtYXRzOiAiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIgIDB4JTA4eCIsIG1Gb3JtYXRzW2ldKTsKKyAgICB9CisKKyAgICBBTE9HVigiICAgIC0gZGV2aWNlczogMHglMDR4XG4iLCBtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKKyAgICBBTE9HVigiICAgIC0gZmxhZ3M6IDB4JTA0eFxuIiwgbUZsYWdzKTsKK30KKworCisvLyAtLS0gRGV2aWNlRGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbgorCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19kZXZpY2VzX3QgdHlwZSkgOgorICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/IEFVRElPX1BPUlRfUk9MRV9TSU5LIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCksCisgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVHlwZSh0eXBlKSwgbUFkZHJlc3MoIiIpLCBtSWQoMCkKK3sKKyAgICBpZiAobUdhaW5zLnNpemUoKSA+IDApIHsKKyAgICAgICAgbUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7CisgICAgfQorfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcjo6ZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBvdGhlcikgY29uc3QKK3sKKyAgICAvLyBEZXZpY2VzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXk6CisgICAgLy8gLSBhcmUgb2YgdGhlIHNhbWUgdHlwZSAoYSBkZXZpY2UgdHlwZSBjYW5ub3QgYmUgQVVESU9fREVWSUNFX05PTkUpCisgICAgLy8gLSBoYXZlIHRoZSBzYW1lIGFkZHJlc3Mgb3Igb25lIGRldmljZSBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBhZGRyZXNzCisgICAgLy8gLSBoYXZlIHRoZSBzYW1lIGNoYW5uZWwgbWFzayBvciBvbmUgZGV2aWNlIGRvZXMgbm90IHNwZWNpZnkgdGhlIGNoYW5uZWwgbWFzaworICAgIHJldHVybiAobURldmljZVR5cGUgPT0gb3RoZXItPm1EZXZpY2VUeXBlKSAmJgorICAgICAgICAgICAobUFkZHJlc3MgPT0gIiIgfHwgb3RoZXItPm1BZGRyZXNzID09ICIiIHx8IG1BZGRyZXNzID09IG90aGVyLT5tQWRkcmVzcykgJiYKKyAgICAgICAgICAgKG1DaGFubmVsTWFzayA9PSAwIHx8IG90aGVyLT5tQ2hhbm5lbE1hc2sgPT0gMCB8fAorICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayA9PSBvdGhlci0+bUNoYW5uZWxNYXNrKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6cmVmcmVzaFR5cGVzKCkKK3sKKyAgICBtRGV2aWNlVHlwZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbURldmljZVR5cGVzIHw9IGl0ZW1BdChpKS0+bURldmljZVR5cGU7CisgICAgfQorICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpIG1EZXZpY2VUeXBlcyAlMDh4IiwgbURldmljZVR5cGVzKTsKK30KKworc3NpemVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6aW5kZXhPZihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3QKK3sKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW0tPmVxdWFscyhpdGVtQXQoaSkpKSB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3NzaXplX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmFkZChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkKK3sKKyAgICBzc2l6ZV90IHJldCA9IGluZGV4T2YoaXRlbSk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXQgPSBTb3J0ZWRWZWN0b3I6OmFkZChpdGVtKTsKKyAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICByZWZyZXNoVHlwZXMoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJEZXZpY2VWZWN0b3I6OmFkZCBkZXZpY2UgJTA4eCBhbHJlYWR5IGluIiwgaXRlbS0+bURldmljZVR5cGUpOworICAgICAgICByZXQgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3NpemVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6cmVtb3ZlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKQoreworICAgIHNpemVfdCBpOworICAgIHNzaXplX3QgcmV0ID0gaW5kZXhPZihpdGVtKTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIEFMT0dXKCJEZXZpY2VWZWN0b3I6OnJlbW92ZSBkZXZpY2UgJTA4eCBub3QgaW4iLCBpdGVtLT5tRGV2aWNlVHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gU29ydGVkVmVjdG9yOjpyZW1vdmVBdChyZXQpOworICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIHJlZnJlc2hUeXBlcygpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmxvYWREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKQoreworICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OworCisgICAgdWludDMyX3Qgcm9sZV9iaXQgPSBBVURJT19ERVZJQ0VfQklUX0lOICYgdHlwZXM7CisgICAgdHlwZXMgJj0gfnJvbGVfYml0OworCisgICAgd2hpbGUgKHR5cGVzKSB7CisgICAgICAgIHVpbnQzMl90IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHoodHlwZXMpOworICAgICAgICB1aW50MzJfdCB0eXBlID0gMSA8PCBpOworICAgICAgICB0eXBlcyAmPSB+dHlwZTsKKyAgICAgICAgYWRkKG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCB0eXBlIHwgcm9sZV9iaXQpKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmxvYWREZXZpY2VzRnJvbU5hbWUoY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZWNsYXJlZERldmljZXMpCit7CisgICAgY2hhciAqZGV2TmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOworICAgIHdoaWxlIChkZXZOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihkZXZOYW1lKSAhPSAwKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IHN0cmluZ1RvRW51bShzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldk5hbWUpOworICAgICAgICAgICAgaWYgKHR5cGUgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBhZGQobmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIHR5cGUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlRnJvbU5hbWUoU3RyaW5nOChkZXZOYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZURlc2MgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGQoZGV2aWNlRGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICBkZXZOYW1lID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgIH0KK30KKworc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdAoreworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPm1EZXZpY2VUeXBlID09IHR5cGUpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1BZGRyZXNzID0gYWRkcmVzcykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZSgpIGZvciB0eXBlICVkIGFkZHJlc3MgJXMgZm91bmQgJXAiLAorICAgICAgICAgIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIGRldmljZS5nZXQoKSk7CisgICAgcmV0dXJuIGRldmljZTsKK30KKworc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAoreworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21JZCglZCkgaXRlbUF0KCV6dSktPm1JZCAlZCIsIGlkLCBpLCBpdGVtQXQoaSktPm1JZCk7CisgICAgICAgIGlmIChpdGVtQXQoaSktPm1JZCA9PSBpZCkgeworICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZTsKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3IgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyAoaSA8IHNpemUoKSkgJiYgKHR5cGUgIT0gQVVESU9fREVWSUNFX05PTkUpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+bURldmljZVR5cGUgJiB0eXBlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pIHsKKyAgICAgICAgICAgIGRldmljZXMuYWRkKGl0ZW1BdChpKSk7CisgICAgICAgICAgICB0eXBlICY9IH5pdGVtQXQoaSktPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKCkgZm9yIHR5cGUgJXggZm91bmQgJXAiLAorICAgICAgICAgICAgICAgICAgaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSwgaXRlbUF0KGkpLmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlczsKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3IgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZUFkZHIoCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpIGNvbnN0Cit7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgLy9BTE9HVigiICAgbG9va2luZyBmb3IgZGV2aWNlPSV4LCBhZGRyPSVzIiwgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICAvL0FMT0dWKCIgICAgIGF0IGk9JWQ6IGRldmljZT0leCwgYWRkcj0lcyIsCisgICAgICAgIC8vICAgICAgICBpLCBpdGVtQXQoaSktPm1EZXZpY2VUeXBlLCBpdGVtQXQoaSktPm1BZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+bURldmljZVR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoIiAgICAgIGZvdW5kIG1hdGNoaW5nIGFkZHJlc3MgJXMiLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChpdGVtQXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2VzOworfQorCitzcDxBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tTmFtZSgKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSkgY29uc3QKK3sKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5tTmFtZSA9PSBuYW1lKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3xBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIGlmIChzcmNDb25maWcgIT0gTlVMTCkgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IHNyY0NvbmZpZy0+Y29uZmlnX21hc2s7CisgICAgfQorCisgICAgQXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CisKKyAgICBkc3RDb25maWctPmlkID0gbUlkOworICAgIGRzdENvbmZpZy0+cm9sZSA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UobURldmljZVR5cGUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TSU5LIDogQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKKyAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFOworICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7CisgICAgZHN0Q29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IG1Nb2R1bGUtPm1IYW5kbGU7CisgICAgc3RybmNweShkc3RDb25maWctPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCksIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Cit7CisgICAgQUxPR1YoIkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KCkgaGFuZGxlICVkIHR5cGUgJXgiLCBtSWQsIG1EZXZpY2VUeXBlKTsKKyAgICBBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHBvcnQpOworICAgIHBvcnQtPmlkID0gbUlkOworICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZwb3J0LT5hY3RpdmVfY29uZmlnKTsKKyAgICBwb3J0LT5leHQuZGV2aWNlLnR5cGUgPSBtRGV2aWNlVHlwZTsKKyAgICBwb3J0LT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IG1Nb2R1bGUtPm1IYW5kbGU7CisgICAgc3RybmNweShwb3J0LT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzRGV2aWNlICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGlmIChtSWQgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1JZCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSB0eXBlOiAlLTQ4c1xuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtVG9TdHJpbmcoc0RldmljZU5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZVR5cGUpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgaWYgKG1BZGRyZXNzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYWRkcmVzczogJS0zMnNcbiIsIHNwYWNlcywgIiIsIG1BZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBBdWRpb1BvcnQ6OmR1bXAoZmQsIHNwYWNlcyk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9QYXRjaDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gcGF0Y2ggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUhhbmRsZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYXVkaW8gZmxpbmdlciBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUFmUGF0Y2hIYW5kbGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG93bmVyIHVpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtVWlkKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlZCBzb3VyY2VzOlxuIiwgc3BhY2VzLCAiIiwgbVBhdGNoLm51bV9zb3VyY2VzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NvdXJjZXM7IGkrKykgeworICAgICAgICBpZiAobVBhdGNoLnNvdXJjZXNbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwgZW51bVRvU3RyaW5nKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5kZXZpY2UudHlwZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwgbVBhdGNoLnNvdXJjZXNbaV0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlZCBzaW5rczpcbiIsIHNwYWNlcywgIiIsIG1QYXRjaC5udW1fc2lua3MpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYXRjaC5udW1fc2lua3M7IGkrKykgeworICAgICAgICBpZiAobVBhdGNoLnNpbmtzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmlkLCBlbnVtVG9TdHJpbmcoc0RldmljZU5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsIG1QYXRjaC5zaW5rc1tpXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gLS0tIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgcGFyc2luZworCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnBhcnNlT3V0cHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpCit7CisgICAgdWludDMyX3QgZmxhZyA9IDA7CisKKyAgICAvLyBpdCBpcyBPSyB0byBjYXN0IG5hbWUgdG8gbm9uIGNvbnN0IGhlcmUgYXMgd2UgYXJlIG5vdCBnb2luZyB0byB1c2UgaXQgYWZ0ZXIKKyAgICAvLyBzdHJ0b2soKSBtb2RpZmllcyBpdAorICAgIGNoYXIgKmZsYWdOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7CisgICAgd2hpbGUgKGZsYWdOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihmbGFnTmFtZSkgIT0gMCkgeworICAgICAgICAgICAgZmxhZyB8PSBzdHJpbmdUb0VudW0oc091dHB1dEZsYWdOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzT3V0cHV0RmxhZ05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ05hbWUpOworICAgICAgICB9CisgICAgICAgIGZsYWdOYW1lID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorICAgIC8vZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KKyAgICAvLyBhbmQgYWxsIGNvbW1vbiBiZWhhdmlvcnMgYXJlIGRyaXZlbiBieSBjaGVja2luZyBvbmx5IHRoZSBkaXJlY3QgZmxhZworICAgIC8vIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCBhcHByb3ByaWF0ZWx5IGluIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisgICAgaWYgKChmbGFnICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICBmbGFnIHw9IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gZmxhZzsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpwYXJzZUlucHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpCit7CisgICAgdWludDMyX3QgZmxhZyA9IDA7CisKKyAgICAvLyBpdCBpcyBPSyB0byBjYXN0IG5hbWUgdG8gbm9uIGNvbnN0IGhlcmUgYXMgd2UgYXJlIG5vdCBnb2luZyB0byB1c2UgaXQgYWZ0ZXIKKyAgICAvLyBzdHJ0b2soKSBtb2RpZmllcyBpdAorICAgIGNoYXIgKmZsYWdOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7CisgICAgd2hpbGUgKGZsYWdOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihmbGFnTmFtZSkgIT0gMCkgeworICAgICAgICAgICAgZmxhZyB8PSBzdHJpbmdUb0VudW0oc0lucHV0RmxhZ05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBmbGFnTmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICByZXR1cm4gZmxhZzsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cGFyc2VEZXZpY2VOYW1lcyhjaGFyICpuYW1lKQoreworICAgIHVpbnQzMl90IGRldmljZSA9IDA7CisKKyAgICBjaGFyICpkZXZOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7CisgICAgd2hpbGUgKGRldk5hbWUgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybGVuKGRldk5hbWUpICE9IDApIHsKKyAgICAgICAgICAgIGRldmljZSB8PSBzdHJpbmdUb0VudW0oc0RldmljZU5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZOYW1lKTsKKyAgICAgICAgIH0KKyAgICAgICAgZGV2TmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOworICAgICB9CisgICAgcmV0dXJuIGRldmljZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRId01vZHVsZShjbm9kZSAqcm9vdCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKKyAgICBjbm9kZSAqbm9kZTsKKyAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbmV3IEh3TW9kdWxlKHJvb3QtPm5hbWUpOworCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIERFVklDRVNfVEFHKTsKKyAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICAgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIGRldmljZSAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkRGV2aWNlKG5vZGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgT1VUUFVUU19UQUcpOworICAgIGlmIChub2RlICE9IE5VTEwpIHsKKyAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgICAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgb3V0cHV0ICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBtb2R1bGUtPmxvYWRPdXRwdXQobm9kZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICB9CisgICAgfQorICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBJTlBVVFNfVEFHKTsKKyAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICAgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIGlucHV0ICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBtb2R1bGUtPmxvYWRJbnB1dChub2RlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbG9hZEdsb2JhbENvbmZpZyhyb290LCBtb2R1bGUpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtSHdNb2R1bGVzLmFkZChtb2R1bGUpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRId01vZHVsZXMoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBBVURJT19IV19NT0RVTEVfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZXMoKSBsb2FkaW5nIG1vZHVsZSAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICBsb2FkSHdNb2R1bGUobm9kZSk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKQoreworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgR0xPQkFMX0NPTkZJR19UQUcpOworCisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXM7CisgICAgaWYgKG1vZHVsZSAhPSBOVUxMKSB7CisgICAgICAgIGRlY2xhcmVkRGV2aWNlcyA9IG1vZHVsZS0+bURlY2xhcmVkRGV2aWNlczsKKyAgICB9CisKKyAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChBVFRBQ0hFRF9PVVRQVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmxvYWREZXZpY2VzRnJvbU5hbWUoKGNoYXIgKilub2RlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzKTsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXR0YWNoZWQgT3V0cHV0IERldmljZXMgJTA4eCIsCisgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoREVGQVVMVF9PVVRQVVRfREVWSUNFX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3Qpc3RyaW5nVG9FbnVtKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBkZXZpY2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygibG9hZEdsb2JhbENvbmZpZygpIGRlZmF1bHQgZGV2aWNlIG5vdCBzcGVjaWZpZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbURlZmF1bHRPdXRwdXREZXZpY2UgJTA4eCIsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKEFUVEFDSEVEX0lOUFVUX0RFVklDRVNfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmxvYWREZXZpY2VzRnJvbU5hbWUoKGNoYXIgKilub2RlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZERldmljZXMpOworICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBBdmFpbGFibGUgSW5wdXREZXZpY2VzICUwOHgiLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChTUEVBS0VSX0RSQ19FTkFCTEVEX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgbVNwZWFrZXJEcmNFbmFibGVkID0gc3RyaW5nVG9Cb29sKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtU3BlYWtlckRyY0VuYWJsZWQgPSAlZCIsIG1TcGVha2VyRHJjRW5hYmxlZCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKEFVRElPX0hBTF9WRVJTSU9OX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgdWludDMyX3QgbWFqb3IsIG1pbm9yOworICAgICAgICAgICAgc3NjYW5mKChjaGFyICopbm9kZS0+dmFsdWUsICIldS4ldSIsICZtYWpvciwgJm1pbm9yKTsKKyAgICAgICAgICAgIG1vZHVsZS0+bUhhbFZlcnNpb24gPSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04obWFqb3IsIG1pbm9yKTsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbUhhbFZlcnNpb24gPSAlMDR4IG1ham9yICV1IG1pbm9yICV1IiwKKyAgICAgICAgICAgICAgICAgIG1vZHVsZS0+bUhhbFZlcnNpb24sIG1ham9yLCBtaW5vcik7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRBdWRpb1BvbGljeUNvbmZpZyhjb25zdCBjaGFyICpwYXRoKQoreworICAgIGNub2RlICpyb290OworICAgIGNoYXIgKmRhdGE7CisKKyAgICBkYXRhID0gKGNoYXIgKilsb2FkX2ZpbGUocGF0aCwgTlVMTCk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7CisgICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7CisKKyAgICBsb2FkSHdNb2R1bGVzKHJvb3QpOworICAgIC8vIGxlZ2FjeSBhdWRpb19wb2xpY3kuY29uZiBmaWxlcyBoYXZlIG9uZSBnbG9iYWxfY29uZmlndXJhdGlvbiBzZWN0aW9uCisgICAgbG9hZEdsb2JhbENvbmZpZyhyb290LCBnZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSkpOworICAgIGNvbmZpZ19mcmVlKHJvb3QpOworICAgIGZyZWUocm9vdCk7CisgICAgZnJlZShkYXRhKTsKKworICAgIEFMT0dJKCJsb2FkQXVkaW9Qb2xpY3lDb25maWcoKSBsb2FkZWQgJXNcbiIsIHBhdGgpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGVmYXVsdEF1ZGlvUG9saWN5Q29uZmlnKHZvaWQpCit7CisgICAgc3A8SHdNb2R1bGU+IG1vZHVsZTsKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGVmYXVsdElucHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKTsKKyAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2UpOworICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuYWRkKGRlZmF1bHRJbnB1dERldmljZSk7CisKKyAgICBtb2R1bGUgPSBuZXcgSHdNb2R1bGUoInByaW1hcnkiKTsKKworICAgIHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSwgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgbW9kdWxlKTsKKyAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoNDQxMDApOworICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKKyAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2UpOworICAgIHByb2ZpbGUtPm1GbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlk7CisgICAgbW9kdWxlLT5tT3V0cHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworCisgICAgcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpLCBBVURJT19QT1JUX1JPTEVfU0lOSywgbW9kdWxlKTsKKyAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoODAwMCk7CisgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZChBVURJT19DSEFOTkVMX0lOX01PTk8pOworICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOworICAgIG1vZHVsZS0+bUlucHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworCisgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKK30KKworYXVkaW9fc3RyZWFtX3R5cGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCit7CisgICAgLy8gZmxhZ3MgdG8gc3RyZWFtIHR5cGUgbWFwcGluZworICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7CisgICAgfQorICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX1NDTykgPT0gQVVESU9fRkxBR19TQ08pIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOworICAgIH0KKworICAgIC8vIHVzYWdlIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKKyAgICBzd2l0Y2ggKGF0dHItPnVzYWdlKSB7CisgICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07CisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOworCisgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOworICAgIH0KK30KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeU1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYTdiOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeU1hbmFnZXIuaApAQCAtMCwwICsxLDg1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCIKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQXR0ZW51YXRpb24gYXBwbGllZCB0byBTVFJBVEVHWV9TT05JRklDQVRJT04gc3RyZWFtcyB3aGVuIGEgaGVhZHNldCBpcyBjb25uZWN0ZWQ6IDZkQgorI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SIDAuNQorLy8gTWluIHZvbHVtZSBmb3IgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIHN0cmVhbXMgd2hlbiBsaW1pdGVkIGJ5IG11c2ljIHZvbHVtZTogLTM2ZEIKKyNkZWZpbmUgU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTiAgMC4wMTYKKy8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGR1cmluZyB3aGljaCB3ZSBjb25zaWRlciB0aGF0IG11c2ljIGlzIHN0aWxsIGFjdGl2ZSBhZnRlciBhIG11c2ljCisvLyB0cmFjayB3YXMgc3RvcHBlZCAtIHNlZSBjb21wdXRlVm9sdW1lKCkKKyNkZWZpbmUgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkgIDUwMDAKKy8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIG1lZGlhIHN0b3BwZWQgcGxheWluZyBkdXJpbmcgd2hpY2ggd2UgY29uc2lkZXIgdGhhdCB0aGUKKy8vIHNvbmlmaWNhdGlvbiBzaG91bGQgYmUgYXMgdW5vYnRydXNpdmUgYXMgZHVyaW5nIHRoZSB0aW1lIG1lZGlhIHdhcyBwbGF5aW5nLgorI2RlZmluZSBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSA1MDAwCisvLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBkdXJpbmcgd2l0Y2ggc29tZSBzdHJlYW1zIGFyZSBtdXRlZCB3aGlsZSB0aGUgYXVkaW8gcGF0aAorLy8gaXMgc3dpdGNoZWQKKyNkZWZpbmUgTVVURV9USU1FX01TIDIwMDAKKworI2RlZmluZSBOVU1fVEVTVF9PVVRQVVRTIDUKKworI2RlZmluZSBOVU1fVk9MX0NVUlZFX0tORUVTIDIKKworLy8gRGVmYXVsdCBtaW5pbXVtIGxlbmd0aCBhbGxvd2VkIGZvciBvZmZsb2FkaW5nIGEgY29tcHJlc3NlZCB0cmFjaworLy8gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MgcHJvcGVydHkKKyNkZWZpbmUgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTIDYwCisKKyNkZWZpbmUgTUFYX01JWEVSX1NBTVBMSU5HX1JBVEUgNDgwMDAKKyNkZWZpbmUgTUFYX01JWEVSX0NIQU5ORUxfQ09VTlQgOAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpb1BvbGljeU1hbmFnZXIgaW1wbGVtZW50cyBhdWRpbyBwb2xpY3kgbWFuYWdlciBiZWhhdmlvciBjb21tb24gdG8gYWxsIHBsYXRmb3Jtcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyOiBwdWJsaWMgQXVkaW9Qb2xpY3lJbnRlcmZhY2UKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgICwgcHVibGljIFRocmVhZAorI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKK3sKKworcHVibGljOgorICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKKyAgICAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lNYW5hZ2VyKCk7CisKKyAgICAgICAgLy8gQXVkaW9Qb2xpY3lJbnRlcmZhY2UKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogdmFsdWUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisKKyAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworCisgICAgICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZUFsbElucHV0cygpOworICAgICAgICB2aXJ0dWFsIHZvaWQgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQorICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7CisKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBlbmFibGVkIG91dHB1dCBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUKKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IE5VTEwpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgICAgICAvLyByZXR1cm4gd2hldGhlciBhIHN0cmVhbSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKKyAgICAgICAgLy8gICBsb2NhbC9yZW1vdGUgcGxheWJhY2ssIHVzZWQgZm9yIGluc3RhbmNlIGJ5IG5vdGlmaWNhdGlvbiBtYW5hZ2VyIHRvIG5vdCBtYWtlCisgICAgICAgIC8vICAgbWVkaWEgcGxheWVycyBsb3NlIGF1ZGlvIGZvY3VzIHdoZW4gbm90IHBsYXlpbmcgbG9jYWxseQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKworcHJvdGVjdGVkOgorCisgICAgICAgIGVudW0gcm91dGluZ19zdHJhdGVneSB7CisgICAgICAgICAgICBTVFJBVEVHWV9NRURJQSwKKyAgICAgICAgICAgIFNUUkFURUdZX1BIT05FLAorICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAorICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsCisgICAgICAgICAgICBTVFJBVEVHWV9EVE1GLAorICAgICAgICAgICAgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwKKyAgICAgICAgICAgIE5VTV9TVFJBVEVHSUVTCisgICAgICAgIH07CisKKyAgICAgICAgLy8gNCBwb2ludHMgdG8gZGVmaW5lIHRoZSB2b2x1bWUgYXR0ZW51YXRpb24gY3VydmUsIGVhY2ggY2hhcmFjdGVyaXplZCBieSB0aGUgdm9sdW1lCisgICAgICAgIC8vIGluZGV4IChmcm9tIDAgdG8gMTAwKSBhdCB3aGljaCB0aGV5IGFwcGx5LCBhbmQgdGhlIGF0dGVudWF0aW9uIGluIGRCIGF0IHRoYXQgaW5kZXguCisgICAgICAgIC8vIHdlIHVzZSAxMDAgc3RlcHMgdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzIHdoZW4gY29tcHV0aW5nIHRoZSB2b2x1bWUgaW4gdm9sSW5kZXhUb0FtcGwoKQorCisgICAgICAgIGVudW0geyBWT0xNSU4gPSAwLCBWT0xLTkVFMSA9IDEsIFZPTEtORUUyID0gMiwgVk9MTUFYID0gMywgVk9MQ05UID0gNH07CisKKyAgICAgICAgY2xhc3MgVm9sdW1lQ3VydmVQb2ludAorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGludCBtSW5kZXg7CisgICAgICAgICAgICBmbG9hdCBtREJBdHRlbnVhdGlvbjsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBkZXZpY2UgY2F0ZWdvcmllcyB1c2VkIGZvciB2b2x1bWUgY3VydmUgbWFuYWdlbWVudC4KKyAgICAgICAgZW51bSBkZXZpY2VfY2F0ZWdvcnkgeworICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX0hFQURTRVQsCisgICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKKyAgICAgICAgICAgIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRSwKKyAgICAgICAgICAgIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEsCisgICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfQ05UCisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgSHdNb2R1bGU7CisKKyAgICAgICAgY2xhc3MgQXVkaW9HYWluOiBwdWJsaWMgUmVmQmFzZQorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvR2FpbihpbnQgaW5kZXgsIGJvb2wgdXNlSW5DaGFubmVsTWFzayk7CisgICAgICAgICAgICB2aXJ0dWFsIH5BdWRpb0dhaW4oKSB7fQorCisgICAgICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworCisgICAgICAgICAgICB2b2lkIGdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOworICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOworICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbUluZGV4OworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2dhaW4gbUdhaW47CisgICAgICAgICAgICBib29sICAgICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzazsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBBdWRpb1BvcnQ6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBdWRpb1BvcnQoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7CisgICAgICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvcnQoKSB7fQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworCisgICAgICAgICAgICB2b2lkIGltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+IHBvcnQpOworICAgICAgICAgICAgdm9pZCBjbGVhckNhcGFiaWxpdGllcygpOworCisgICAgICAgICAgICB2b2lkIGxvYWRTYW1wbGluZ1JhdGVzKGNoYXIgKm5hbWUpOworICAgICAgICAgICAgdm9pZCBsb2FkRm9ybWF0cyhjaGFyICpuYW1lKTsKKyAgICAgICAgICAgIHZvaWQgbG9hZE91dENoYW5uZWxzKGNoYXIgKm5hbWUpOworICAgICAgICAgICAgdm9pZCBsb2FkSW5DaGFubmVscyhjaGFyICpuYW1lKTsKKworICAgICAgICAgICAgYXVkaW9fZ2Fpbl9tb2RlX3QgbG9hZEdhaW5Nb2RlKGNoYXIgKm5hbWUpOworICAgICAgICAgICAgdm9pZCBsb2FkR2Fpbihjbm9kZSAqcm9vdCwgaW50IGluZGV4KTsKKyAgICAgICAgICAgIHZvaWQgbG9hZEdhaW5zKGNub2RlICpyb290KTsKKworICAgICAgICAgICAgLy8gc2VhcmNoZXMgZm9yIGFuIGV4YWN0IG1hdGNoCisgICAgICAgICAgICBzdGF0dXNfdCBjaGVja0V4YWN0U2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgY29uc3Q7CisgICAgICAgICAgICAvLyBzZWFyY2hlcyBmb3IgYSBjb21wYXRpYmxlIG1hdGNoLCBhbmQgcmV0dXJucyB0aGUgYmVzdCBtYXRjaCB2aWEgdXBkYXRlZFNhbXBsaW5nUmF0ZQorICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUpIGNvbnN0OworICAgICAgICAgICAgLy8gc2VhcmNoZXMgZm9yIGFuIGV4YWN0IG1hdGNoCisgICAgICAgICAgICBzdGF0dXNfdCBjaGVja0V4YWN0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0OworICAgICAgICAgICAgLy8gc2VhcmNoZXMgZm9yIGEgY29tcGF0aWJsZSBtYXRjaCwgY3VycmVudGx5IGltcGxlbWVudGVkIGZvciBpbnB1dCBjaGFubmVsIG1hc2tzIG9ubHkKKyAgICAgICAgICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdDsKKyAgICAgICAgICAgIHN0YXR1c190IGNoZWNrRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgICAgICAgICBzdGF0dXNfdCBjaGVja0dhaW4oY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpnYWluQ29uZmlnLCBpbnQgaW5kZXgpIGNvbnN0OworCisgICAgICAgICAgICB1aW50MzJfdCBwaWNrU2FtcGxpbmdSYXRlKCkgY29uc3Q7CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBwaWNrQ2hhbm5lbE1hc2soKSBjb25zdDsKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHBpY2tGb3JtYXQoKSBjb25zdDsKKworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHNQY21Gb3JtYXRDb21wYXJlVGFibGVbXTsKKyAgICAgICAgICAgIHN0YXRpYyBpbnQgY29tcGFyZUZvcm1hdHMoYXVkaW9fZm9ybWF0X3QgZm9ybWF0MSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0Mik7CisKKyAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OworCisgICAgICAgICAgICBTdHJpbmc4ICAgICAgICAgICBtTmFtZTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IG1UeXBlOworICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3QgbVJvbGU7CisgICAgICAgICAgICBib29sICAgICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzazsKKyAgICAgICAgICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbVNhbXBsaW5nUmF0ZXMsIG1DaGFubmVsTWFza3Mgb3IgbUZvcm1hdHMKKyAgICAgICAgICAgIC8vIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAgICAgLy8gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgICAgICAgICAgVmVjdG9yIDx1aW50MzJfdD4gbVNhbXBsaW5nUmF0ZXM7IC8vIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcworICAgICAgICAgICAgVmVjdG9yIDxhdWRpb19jaGFubmVsX21hc2tfdD4gbUNoYW5uZWxNYXNrczsgLy8gc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MKKyAgICAgICAgICAgIFZlY3RvciA8YXVkaW9fZm9ybWF0X3Q+IG1Gb3JtYXRzOyAvLyBzdXBwb3J0ZWQgYXVkaW8gZm9ybWF0cworICAgICAgICAgICAgVmVjdG9yIDwgc3A8QXVkaW9HYWluPiA+IG1HYWluczsgLy8gZ2FpbiBjb250cm9sbGVycworICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1Nb2R1bGU7ICAgICAgICAgICAgICAgICAvLyBhdWRpbyBIVyBtb2R1bGUgZXhwb3NpbmcgdGhpcyBJL08gc3RyZWFtCisgICAgICAgICAgICB1aW50MzJfdCBtRmxhZ3M7IC8vIGF0dHJpYnV0ZSBmbGFncyAoZS5nIHByaW1hcnkgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0IG91dHB1dC4uLikuCisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgQXVkaW9Qb3J0Q29uZmlnOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9Qb3J0Q29uZmlnKCk7CisgICAgICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvcnRDb25maWcoKSB7fQorCisgICAgICAgICAgICBzdGF0dXNfdCBhcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnID0gTlVMTCk7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3QgPSAwOworICAgICAgICAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIHVpbnQzMl90IG1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OworICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnIG1HYWluOworICAgICAgICB9OworCisKKyAgICAgICAgY2xhc3MgQXVkaW9QYXRjaDogcHVibGljIFJlZkJhc2UKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwgdWlkX3QgdWlkKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlKGhhbmRsZSksIG1QYXRjaCgqcGF0Y2gpLCBtVWlkKHVpZCksIG1BZlBhdGNoSGFuZGxlKDApIHt9CisKKyAgICAgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaDsKKyAgICAgICAgICAgIHVpZF90IG1VaWQ7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtQWZQYXRjaEhhbmRsZTsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBEZXZpY2VEZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0LCBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgRGV2aWNlRGVzY3JpcHRvcihjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19kZXZpY2VzX3QgdHlwZSk7CisKKyAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSB7fQorCisgICAgICAgICAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0OworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OworICAgICAgICAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIChBdWRpb1BvcnQqKSB0aGlzOyB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisKKyAgICAgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZVR5cGU7CisgICAgICAgICAgICBTdHJpbmc4IG1BZGRyZXNzOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQ7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgRGV2aWNlVmVjdG9yIDogcHVibGljIFNvcnRlZFZlY3Rvcjwgc3A8RGV2aWNlRGVzY3JpcHRvcj4gPgorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIERldmljZVZlY3RvcigpIDogU29ydGVkVmVjdG9yKCksIG1EZXZpY2VUeXBlcyhBVURJT19ERVZJQ0VfTk9ORSkge30KKworICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGFkZChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSk7CisgICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgcmVtb3ZlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKTsKKyAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbmRleE9mKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdDsKKworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGVzKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVzOyB9CisKKyAgICAgICAgICAgIHZvaWQgbG9hZERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZXMpOworICAgICAgICAgICAgdm9pZCBsb2FkRGV2aWNlc0Zyb21OYW1lKGNoYXIgKm5hbWUsIGNvbnN0IERldmljZVZlY3RvciYgZGVjbGFyZWREZXZpY2VzKTsKKworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpIGNvbnN0OworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZXMpIGNvbnN0OworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRnJvbU5hbWUoY29uc3QgU3RyaW5nOCYgbmFtZSkgY29uc3Q7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICBjb25zdDsKKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgdm9pZCByZWZyZXNoVHlwZXMoKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlVHlwZXM7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gdGhlIElPUHJvZmlsZSBjbGFzcyBkZXNjcmliZXMgdGhlIGNhcGFiaWxpdGllcyBvZiBhbiBvdXRwdXQgb3IgaW5wdXQgc3RyZWFtLgorICAgICAgICAvLyBJdCBpcyBjdXJyZW50bHkgYXNzdW1lZCB0aGF0IGFsbCBjb21iaW5hdGlvbiBvZiBsaXN0ZWQgcGFyYW1ldGVycyBhcmUgc3VwcG9ydGVkLgorICAgICAgICAvLyBJdCBpcyB1c2VkIGJ5IHRoZSBwb2xpY3kgbWFuYWdlciB0byBkZXRlcm1pbmUgaWYgYW4gb3V0cHV0IG9yIGlucHV0IGlzIHN1aXRhYmxlIGZvcgorICAgICAgICAvLyBhIGdpdmVuIHVzZSBjYXNlLCAgb3Blbi9jbG9zZSBpdCBhY2NvcmRpbmdseSBhbmQgY29ubmVjdC9kaXNjb25uZWN0IGF1ZGlvIHRyYWNrcworICAgICAgICAvLyB0by9mcm9tIGl0LgorICAgICAgICBjbGFzcyBJT1Byb2ZpbGUgOiBwdWJsaWMgQXVkaW9Qb3J0CisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgSU9Qcm9maWxlKGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKTsKKyAgICAgICAgICAgIHZpcnR1YWwgfklPUHJvZmlsZSgpOworCisgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBib3RoIG91dHB1dCBhbmQgaW5wdXQuCisgICAgICAgICAgICAvLyBJZiBwYXJhbWV0ZXIgdXBkYXRlZFNhbXBsaW5nUmF0ZSBpcyBub24tTlVMTCwgaXQgaXMgYXNzaWduZWQgdGhlIGFjdHVhbCBzYW1wbGUgcmF0ZS4KKyAgICAgICAgICAgIC8vIEZvciBpbnB1dCwgZmxhZ3MgaXMgaW50ZXJwcmV0ZWQgYXMgYXVkaW9faW5wdXRfZmxhZ3NfdC4KKyAgICAgICAgICAgIC8vIFRPRE86IG1lcmdlIGF1ZGlvX291dHB1dF9mbGFnc190IGFuZCBhdWRpb19pbnB1dF9mbGFnc190LgorICAgICAgICAgICAgYm9vbCBpc0NvbXBhdGlibGVQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykgY29uc3Q7CisKKyAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQpOworICAgICAgICAgICAgdm9pZCBsb2coKTsKKworICAgICAgICAgICAgRGV2aWNlVmVjdG9yICBtU3VwcG9ydGVkRGV2aWNlczsgLy8gc3VwcG9ydGVkIGRldmljZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChkZXZpY2VzIHRoaXMgb3V0cHV0IGNhbiBiZSByb3V0ZWQgdG8pCisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgSHdNb2R1bGUgOiBwdWJsaWMgUmVmQmFzZQorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH5Id01vZHVsZSgpOworCisgICAgICAgICAgICBzdGF0dXNfdCBsb2FkT3V0cHV0KGNub2RlICpyb290KTsKKyAgICAgICAgICAgIHN0YXR1c190IGxvYWRJbnB1dChjbm9kZSAqcm9vdCk7CisgICAgICAgICAgICBzdGF0dXNfdCBsb2FkRGV2aWNlKGNub2RlICpyb290KTsKKworICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCk7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0ICAgICAgICBtTmFtZTsgLy8gYmFzZSBuYW1lIG9mIHRoZSBhdWRpbyBIVyBtb2R1bGUgKHByaW1hcnksIGEyZHAgLi4uKQorICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgIG1IYWxWZXJzaW9uOyAvLyBhdWRpbyBIQUwgQVBJIHZlcnNpb24KKyAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCAgICBtSGFuZGxlOworICAgICAgICAgICAgVmVjdG9yIDwgc3A8SU9Qcm9maWxlPiA+IG1PdXRwdXRQcm9maWxlczsgLy8gb3V0cHV0IHByb2ZpbGVzIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUKKyAgICAgICAgICAgIFZlY3RvciA8IHNwPElPUHJvZmlsZT4gPiBtSW5wdXRQcm9maWxlczsgIC8vIGlucHV0IHByb2ZpbGVzIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUKKyAgICAgICAgICAgIERldmljZVZlY3RvciAgICAgICAgICAgICBtRGVjbGFyZWREZXZpY2VzOyAvLyBkZXZpY2VzIGRlY2xhcmVkIGluIGF1ZGlvX3BvbGljeS5jb25mCisKKyAgICAgICAgfTsKKworICAgICAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZQorICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUgZm9yIG1lZGlhIHN0cmF0ZWd5CisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igbm9uLW1lZGlhIGF1ZGlvIG9uIGV4dCBtZWRpYSBvdXRwdXRzIChIRE1JLCBMaW5lLCBldGMpCisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgLy8gdm9sdW1lIGN1cnZlIGZvciBtZWRpYSBzdHJhdGVneSBvbiBzcGVha2VycworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICAvLyB2b2x1bWUgY3VydmUgZm9yIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBvbiBzcGVha2VycworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlcyBwZXIgc3RyZWFtIGFuZCBkZXZpY2UgY2F0ZWdvcnkuIFNlZSBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCkKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKKworICAgICAgICAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBvdXRwdXRzLiBVc2VkIHRvIG1haW50YWluIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBlYWNoIG9wZW5lZCBhdWRpbyBvdXRwdXQKKyAgICAgICAgLy8gYW5kIGtlZXAgdHJhY2sgb2YgdGhlIHVzYWdlIG9mIHRoaXMgb3V0cHV0IGJ5IGVhY2ggYXVkaW8gc3RyZWFtIHR5cGUuCisgICAgICAgIGNsYXNzIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZworICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOworCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKCkgY29uc3Q7CisgICAgICAgICAgICB2b2lkIGNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgZGVsdGEpOworCisgICAgICAgICAgICBib29sIGlzRHVwbGljYXRlZCgpIGNvbnN0IHsgcmV0dXJuIChtT3V0cHV0MSAhPSBOVUxMICYmIG1PdXRwdXQyICE9IE5VTEwpOyB9CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgc3VwcG9ydGVkRGV2aWNlcygpOworICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSgpOworICAgICAgICAgICAgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIGJvb2wgaXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7CisgICAgICAgICAgICBib29sIGlzU3RyYXRlZ3lBY3RpdmUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKKworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OworICAgICAgICAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIG1Qcm9maWxlOyB9CisgICAgICAgICAgICB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQ7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSW9IYW5kbGU7ICAgICAgICAgICAgICAvLyBvdXRwdXQgaGFuZGxlCisgICAgICAgICAgICB1aW50MzJfdCBtTGF0ZW5jeTsgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOyAgIC8vCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZTsgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBvdXRwdXQgaXMgcm91dGVkIHRvCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICB1aW50MzJfdCBtUmVmQ291bnRbQVVESU9fU1RSRUFNX0NOVF07IC8vIG51bWJlciBvZiBzdHJlYW1zIG9mIGVhY2ggdHlwZSB1c2luZyB0aGlzIG91dHB1dAorICAgICAgICAgICAgbnNlY3NfdCBtU3RvcFRpbWVbQVVESU9fU1RSRUFNX0NOVF07CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQxOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogZmlyc3Qgb3V0cHV0CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQyOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogc2Vjb25kIG91dHB1dAorICAgICAgICAgICAgZmxvYXQgbUN1clZvbHVtZVtBVURJT19TVFJFQU1fQ05UXTsgICAvLyBjdXJyZW50IHN0cmVhbSB2b2x1bWUKKyAgICAgICAgICAgIGludCBtTXV0ZUNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAgICAgLy8gbXV0ZSByZXF1ZXN0IGNvdW50ZXIKKyAgICAgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQorICAgICAgICAgICAgYm9vbCBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW05VTV9TVFJBVEVHSUVTXTsgLy8gc3RyYXRlZ2llcyBtdXRlZCBiZWNhdXNlIG9mIGluY29tcGF0aWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIHNlbGVjdGlvbi4gU2VlIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKQorICAgICAgICAgICAgdWludDMyX3QgbURpcmVjdE9wZW5Db3VudDsgLy8gbnVtYmVyIG9mIGNsaWVudHMgdXNpbmcgdGhpcyBvdXRwdXQgKGRpcmVjdCBvdXRwdXRzIG9ubHkpCisgICAgICAgIH07CisKKyAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgYXVkaW8gaW5wdXRzLiBVc2VkIHRvIG1haW50YWluIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBlYWNoIG9wZW5lZCBhdWRpbyBpbnB1dAorICAgICAgICAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBpbnB1dC4KKyAgICAgICAgY2xhc3MgQXVkaW9JbnB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBdWRpb0lucHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOworCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICAgICAgICBtSWQ7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICAgICAgICBtSW9IYW5kbGU7ICAgICAgIC8vIGlucHV0IGhhbmRsZQorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgbURldmljZTsgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0bworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgbVBhdGNoSGFuZGxlOworICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgbVJlZkNvdW50OyAgICAgICAvLyBudW1iZXIgb2YgQXVkaW9SZWNvcmQgY2xpZW50cyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlucHV0CisgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBtT3BlblJlZkNvdW50OworICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgICAgICAgICAgICAgICAgbUlucHV0U291cmNlOyAgICAvLyBpbnB1dCBzb3VyY2Ugc2VsZWN0ZWQgYnkgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8obWVkaWFyZWNvcmRlci5oKQorICAgICAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiAgICAgICAgICAgbVByb2ZpbGU7ICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KKyAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19zZXNzaW9uX3Q+IG1TZXNzaW9uczsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbnMgYXR0YWNoZWQgdG8gdGhpcyBpbnB1dAorICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzU291bmRUcmlnZ2VyOyAvLyB1c2VkIGJ5IGEgc291bmR0cmlnZ2VyIGNhcHR1cmUKKworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OworICAgICAgICAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIG1Qcm9maWxlOyB9CisgICAgICAgICAgICB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBzdHJlYW0gZGVzY3JpcHRvciB1c2VkIGZvciB2b2x1bWUgY29udHJvbAorICAgICAgICBjbGFzcyBTdHJlYW1EZXNjcmlwdG9yCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgU3RyZWFtRGVzY3JpcHRvcigpOworCisgICAgICAgICAgICBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgICAgICAgICB2b2lkIGR1bXAoaW50IGZkKTsKKworICAgICAgICAgICAgaW50IG1JbmRleE1pbjsgICAgICAvLyBtaW4gdm9sdW1lIGluZGV4CisgICAgICAgICAgICBpbnQgbUluZGV4TWF4OyAgICAgIC8vIG1heCB2b2x1bWUgaW5kZXgKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPGF1ZGlvX2RldmljZXNfdCwgaW50PiBtSW5kZXhDdXI7ICAgLy8gY3VycmVudCB2b2x1bWUgaW5kZXggcGVyIGRldmljZQorICAgICAgICAgICAgYm9vbCBtQ2FuQmVNdXRlZDsgICAvLyB0cnVlIGlzIHRoZSBzdHJlYW0gY2FuIGJlIG11dGVkCisKKyAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBzdHJlYW0gZGVzY3JpcHRvciB1c2VkIGZvciB2b2x1bWUgY29udHJvbAorICAgICAgICBjbGFzcyBFZmZlY3REZXNjcmlwdG9yIDogcHVibGljIFJlZkJhc2UKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisKKyAgICAgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgICAgICAgICAgaW50IG1JbzsgICAgICAgICAgICAgICAgLy8gaW8gdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bworICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBtU3RyYXRlZ3k7IC8vIHJvdXRpbmcgc3RyYXRlZ3kgdGhlIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvCisgICAgICAgICAgICBpbnQgbVNlc3Npb247ICAgICAgICAgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiB0aGUgZWZmZWN0IGlzIG9uCisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IG1EZXNjOyAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKKyAgICAgICAgICAgIGJvb2wgbUVuYWJsZWQ7ICAgICAgICAgICAgICAvLyBlbmFibGVkIHN0YXRlOiBDUFUgbG9hZCBiZWluZyB1c2VkIG9yIG5vdAorICAgICAgICB9OworCisgICAgICAgIHZvaWQgYWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKTsKKyAgICAgICAgdm9pZCBhZGRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyk7CisKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKKyAgICAgICAgc3RhdGljIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3koYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworCisgICAgICAgIC8vIHJldHVybiBhcHByb3ByaWF0ZSBkZXZpY2UgZm9yIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmF0ZWd5IGFjY29yZGluZyB0byBjdXJyZW50CisgICAgICAgIC8vIHBob25lIHN0YXRlLCBjb25uZWN0ZWQgZGV2aWNlcy4uLgorICAgICAgICAvLyBpZiBmcm9tQ2FjaGUgaXMgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIG1EZXZpY2VGb3JTdHJhdGVneVtdLAorICAgICAgICAvLyBvdGhlcndpc2UgaXQgaXMgZGV0ZXJtaW5lIGJ5IGN1cnJlbnQgc3RhdGUKKyAgICAgICAgLy8gKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwgYTJkcCBvdXRwdXQuLi4pCisgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRvOgorICAgICAgICAvLyAgMSBzcGVlZCB1cCBwcm9jZXNzIHdoZW4gdGhlIHN0YXRlIGlzIHN0YWJsZSAod2hlbiBzdGFydGluZyBvciBzdG9wcGluZyBhbiBvdXRwdXQpCisgICAgICAgIC8vICAyIGFjY2VzcyB0byBlaXRoZXIgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gdHJ1ZSkgb3IKKyAgICAgICAgLy8gImZ1dHVyZSIgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IGZhbHNlKSB3aGVuIGNhbGxlZCBmcm9tIGEgY29udGV4dAorICAgICAgICAvLyAgd2hlcmUgY29uZGl0aW9ucyBhcmUgY2hhbmdpbmcgKHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpLCBzZXRQaG9uZVN0YXRlKCkuLi4pIEFORAorICAgICAgICAvLyAgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkgaXMgY2FsbGVkLgorICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSk7CisKKyAgICAgICAgLy8gY2hhbmdlIHRoZSByb3V0ZSBvZiB0aGUgc3BlY2lmaWVkIG91dHB1dC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdlIGhhdmUgc2xlcHQgdG8KKyAgICAgICAgLy8gYWxsb3cgbmV3IHJvdXRpbmcgdG8gdGFrZSBlZmZlY3QgaW4gY2VydGFpbiBjYXNlcy4KKyAgICAgICAgdWludDMyX3Qgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MgPSBOVUxMKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzZXRPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOworICAgICAgICBzdGF0dXNfdCBzZXRJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzZXRJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMKTsKKworICAgICAgICAvLyBzZWxlY3QgaW5wdXQgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gcmVxdWVzdGVkIGF1ZGlvIHNvdXJjZQorICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSk7CisKKyAgICAgICAgLy8gcmV0dXJuIGlvIGhhbmRsZSBvZiBhY3RpdmUgaW5wdXQgb3IgMCBpZiBubyBpbnB1dCBpcyBhY3RpdmUKKyAgICAgICAgLy8gICAgT25seSBjb25zaWRlcnMgaW5wdXRzIGZyb20gcGh5c2ljYWwgZGV2aWNlcyAoZS5nLiBtYWluIG1pYywgaGVhZHNldCBtaWMpIHdoZW4KKyAgICAgICAgLy8gICAgaWdub3JlVmlydHVhbElucHV0cyBpcyB0cnVlLgorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRBY3RpdmVJbnB1dChib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMgPSB0cnVlKTsKKworICAgICAgICB1aW50MzJfdCBhY3RpdmVJbnB1dHNDb3VudCgpIGNvbnN0OworCisgICAgICAgIC8vIGluaXRpYWxpemUgdm9sdW1lIGN1cnZlcyBmb3IgZWFjaCBzdHJhdGVneSBhbmQgZGV2aWNlIGNhdGVnb3J5CisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpOworCisgICAgICAgIC8vIGNvbXB1dGUgdGhlIGFjdHVhbCB2b2x1bWUgZm9yIGEgZ2l2ZW4gc3RyZWFtIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGVkIGluZGV4IGFuZCBhIHBhcnRpY3VsYXIKKyAgICAgICAgLy8gZGV2aWNlCisgICAgICAgIHZpcnR1YWwgZmxvYXQgY29tcHV0ZVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgcGVybWl0dGVkLCBjb21wdXRlIGFuZCBzZW5kIG5ldyB2b2x1bWUgdG8gYXVkaW8gaGFyZHdhcmUKKyAgICAgICAgc3RhdHVzX3QgY2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgZGVsYXlNcyA9IDAsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CisKKyAgICAgICAgLy8gYXBwbHkgYWxsIHN0cmVhbSB2b2x1bWVzIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IGFuZCBkZXZpY2UKKyAgICAgICAgdm9pZCBhcHBseVN0cmVhbVZvbHVtZXMoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgZGVsYXlNcyA9IDAsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CisKKyAgICAgICAgLy8gTXV0ZSBvciB1bm11dGUgYWxsIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmF0ZWd5IG9uIHRoZSBzcGVjaWZpZWQgb3V0cHV0CisgICAgICAgIHZvaWQgc2V0U3RyYXRlZ3lNdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkwKTsKKworICAgICAgICAvLyBNdXRlIG9yIHVubXV0ZSB0aGUgc3RyZWFtIG9uIHRoZSBzcGVjaWZpZWQgb3V0cHV0CisgICAgICAgIHZvaWQgc2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkwKTsKKworICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlcyBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHdoaWxlIGluIGNhbGw6IG11dGUgc3RyZWFtcyBvciByZXBsYWNlIGJ5CisgICAgICAgIC8vIGEgc3BlY2lhbCB0b25lIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgY29tbXVuaWNhdGlvbgorICAgICAgICB2b2lkIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSk7CisKKyAgICAgICAgLy8gdHJ1ZSBpZiBkZXZpY2UgaXMgaW4gYSB0ZWxlcGhvbnkgb3IgVm9JUCBjYWxsCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0luQ2FsbCgpOworCisgICAgICAgIC8vIHRydWUgaWYgZ2l2ZW4gc3RhdGUgcmVwcmVzZW50cyBhIGRldmljZSBpbiBhIHRlbGVwaG9ueSBvciBWb0lQIGNhbGwKKyAgICAgICAgdmlydHVhbCBib29sIGlzU3RhdGVJbkNhbGwoaW50IHN0YXRlKTsKKworICAgICAgICAvLyB3aGVuIGEgZGV2aWNlIGlzIGNvbm5lY3RlZCwgY2hlY2tzIGlmIGFuIG9wZW4gb3V0cHV0IGNhbiBiZSByb3V0ZWQKKyAgICAgICAgLy8gdG8gdGhpcyBkZXZpY2UuIElmIG5vbmUgaXMgb3BlbiwgdHJpZXMgdG8gb3BlbiBvbmUgb2YgdGhlIGF2YWlsYWJsZSBvdXRwdXRzLgorICAgICAgICAvLyBSZXR1cm5zIGFuIG91dHB1dCBzdWl0YWJsZSB0byB0aGlzIGRldmljZSBvciAwLgorICAgICAgICAvLyB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgY2hlY2tzIGlmIGFuIG91dHB1dCBpcyBub3QgdXNlZCBhbnkgbW9yZSBhbmQKKyAgICAgICAgLy8gcmV0dXJucyBpdHMgaGFuZGxlIGlmIGFueS4KKyAgICAgICAgLy8gdHJhbnNmZXJzIHRoZSBhdWRpbyB0cmFja3MgYW5kIGVmZmVjdHMgZnJvbSBvbmUgb3V0cHV0IHRocmVhZCB0byBhbm90aGVyIGFjY29yZGluZ2x5LgorICAgICAgICBzdGF0dXNfdCBjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpOworCisgICAgICAgIHN0YXR1c190IGNoZWNrSW5wdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpOworCisgICAgICAgIC8vIGNsb3NlIGFuIG91dHB1dCBhbmQgaXRzIGNvbXBhbmlvbiBkdXBsaWNhdGluZyBvdXRwdXQuCisgICAgICAgIHZvaWQgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKworICAgICAgICAvLyBjbG9zZSBhbiBpbnB1dC4KKyAgICAgICAgdm9pZCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKworICAgICAgICAvLyBjaGVja3MgYW5kIGlmIG5lY2Vzc2FyeSBjaGFuZ2VzIG91dHB1dHMgdXNlZCBmb3IgYWxsIHN0cmF0ZWdpZXMuCisgICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRwdXQgY2hvaWNlIGZvciBhIGdpdmVuIHN0cmF0ZWd5CisgICAgICAgIC8vIGNoYW5nZXM6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KKyAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKKyAgICAgICAgdm9pZCBjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpOworCisgICAgICAgIC8vIFNhbWUgYXMgY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIGJ1dCBmb3IgYSBhbGwgc3RyYXRlZ2llcyBpbiBvcmRlciBvZiBwcmlvcml0eQorICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworCisgICAgICAgIC8vIG1hbmFnZXMgQTJEUCBvdXRwdXQgc3VzcGVuZC9yZXN0b3JlIGFjY29yZGluZyB0byBwaG9uZSBzdGF0ZSBhbmQgQlQgU0NPIHVzYWdlCisgICAgICAgIHZvaWQgY2hlY2tBMmRwU3VzcGVuZCgpOworCisgICAgICAgIC8vIHJldHVybnMgdGhlIEEyRFAgb3V0cHV0IGhhbmRsZSBpZiBpdCBpcyBvcGVuIG9yIDAgb3RoZXJ3aXNlCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldEEyZHBPdXRwdXQoKTsKKworICAgICAgICAvLyBzZWxlY3RzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGRldmljZSBvbiBvdXRwdXQgZm9yIGN1cnJlbnQgc3RhdGUKKyAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgZm9yIGEgZ2l2ZW4gb3V0cHV0IGlzCisgICAgICAgIC8vIGNoYW5nZWQ6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UsIG91dHB1dCBzdGFydCwgb3V0cHV0IHN0b3AuLgorICAgICAgICAvLyBzZWUgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBmb3IgdGhlIHVzZSBvZiBmcm9tQ2FjaGUgcGFyYW1ldGVyCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXROZXdPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBib29sIGZyb21DYWNoZSk7CisKKyAgICAgICAgLy8gdXBkYXRlcyBjYWNoZSBvZiBkZXZpY2UgdXNlZCBieSBhbGwgc3RyYXRlZ2llcyAobURldmljZUZvclN0cmF0ZWd5W10pCisgICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBkZXZpY2UgY2hvaWNlIGZvciBhIGdpdmVuIHN0cmF0ZWd5IGlzCisgICAgICAgIC8vIGNoYW5nZWQ6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KKyAgICAgICAgLy8gY2FjaGVkIHZhbHVlcyBhcmUgdXNlZCBieSBnZXREZXZpY2VGb3JTdHJhdGVneSgpIGlmIHBhcmFtZXRlciBmcm9tQ2FjaGUgaXMgdHJ1ZS4KKyAgICAgICAgIC8vIE11c3QgYmUgY2FsbGVkIGFmdGVyIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCisgICAgICAgIHZvaWQgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKworICAgICAgICAvLyBzZWxlY3RzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGRldmljZSBvbiBpbnB1dCBmb3IgY3VycmVudCBzdGF0ZQorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TmV3SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOworCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0TWF4RWZmZWN0c0NwdUxvYWQoKTsKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRNYXhFZmZlY3RzTWVtb3J5KCk7CisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7CisgICAgICAgIGludCB0ZXN0T3V0cHV0SW5kZXgoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKyAgICAgICAgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiYgZWZmZWN0RGVzYywgYm9vbCBlbmFibGVkKTsKKworICAgICAgICAvLyByZXR1cm5zIHRoZSBjYXRlZ29yeSB0aGUgZGV2aWNlIGJlbG9uZ3MgdG8gd2l0aCByZWdhcmQgdG8gdm9sdW1lIGN1cnZlIG1hbmFnZW1lbnQKKyAgICAgICAgc3RhdGljIGRldmljZV9jYXRlZ29yeSBnZXREZXZpY2VDYXRlZ29yeShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgICAgICAvLyBleHRyYWN0IG9uZSBkZXZpY2UgcmVsZXZhbnQgZm9yIHZvbHVtZSBjb250cm9sIGZyb20gbXVsdGlwbGUgZGV2aWNlIHNlbGVjdGlvbgorICAgICAgICBzdGF0aWMgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGdldE91dHB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+IG9wZW5PdXRwdXRzKTsKKyAgICAgICAgYm9vbCB2ZWN0b3JzRXF1YWwoU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czIpOworCisgICAgICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgorICAgICAgICAvLyBpZiBtdXRpbmcsIHdhaXQgZm9yIHRoZSBhdWRpbyBpbiBwY20gYnVmZmVyIHRvIGJlIGRyYWluZWQgYmVmb3JlIHByb2NlZWRpbmcKKyAgICAgICAgLy8gaWYgdW5tdXRpbmcsIHVubXV0ZSBvbmx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdhaXRlZAorICAgICAgICB1aW50MzJfdCAgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKKworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXQoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKyAgICAgICAgLy8gc2FtcGxpbmdSYXRlIHBhcmFtZXRlciBpcyBhbiBpbi9vdXQgYW5kIHNvIG1heSBiZSBtb2RpZmllZAorICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyhjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzKTsKKworICAgICAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCk7CisKKyAgICAgICAgc3RhdHVzX3QgYWRkQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoKTsKKyAgICAgICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CisgICAgICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7CisgICAgICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7CisKKyAgICAgICAgdm9pZCB1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIGludCBkZWxheU1zID0gMCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzaW5nIChhdWRpb19wb2xpY3kuY29uZikKKyAgICAgICAgLy8KKyAgICAgICAgc3RhdGljIHVpbnQzMl90IHN0cmluZ1RvRW51bShjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmVudW1Ub1N0cmluZyhjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKTsKKyAgICAgICAgc3RhdGljIGJvb2wgc3RyaW5nVG9Cb29sKGNvbnN0IGNoYXIgKnZhbHVlKTsKKyAgICAgICAgc3RhdGljIHVpbnQzMl90IHBhcnNlT3V0cHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpOworICAgICAgICBzdGF0aWMgdWludDMyX3QgcGFyc2VJbnB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKTsKKyAgICAgICAgc3RhdGljIGF1ZGlvX2RldmljZXNfdCBwYXJzZURldmljZU5hbWVzKGNoYXIgKm5hbWUpOworICAgICAgICB2b2lkIGxvYWRId01vZHVsZShjbm9kZSAqcm9vdCk7CisgICAgICAgIHZvaWQgbG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCk7CisgICAgICAgIHZvaWQgbG9hZEdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOworICAgICAgICBzdGF0dXNfdCBsb2FkQXVkaW9Qb2xpY3lDb25maWcoY29uc3QgY2hhciAqcGF0aCk7CisgICAgICAgIHZvaWQgZGVmYXVsdEF1ZGlvUG9saWN5Q29uZmlnKHZvaWQpOworCisKKyAgICAgICAgdWlkX3QgbVVpZENhY2hlZDsKKyAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1wQ2xpZW50SW50ZXJmYWNlOyAgLy8gYXVkaW8gcG9saWN5IGNsaWVudCBpbnRlcmZhY2UKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbVByaW1hcnlPdXRwdXQ7ICAgICAgICAgICAgICAvLyBwcmltYXJ5IG91dHB1dCBoYW5kbGUKKyAgICAgICAgLy8gbGlzdCBvZiBkZXNjcmlwdG9ycyBmb3Igb3V0cHV0cyBjdXJyZW50bHkgb3BlbmVkCisgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+IG1PdXRwdXRzOworICAgICAgICAvLyBjb3B5IG9mIG1PdXRwdXRzIGJlZm9yZSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBvcGVucyBuZXcgb3V0cHV0cworICAgICAgICAvLyByZXNldCB0byBtT3V0cHV0cyB3aGVuIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkgaXMgY2FsbGVkLgorICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPiBtUHJldmlvdXNPdXRwdXRzOworICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IG1JbnB1dHM7ICAgICAvLyBsaXN0IG9mIGlucHV0IGRlc2NyaXB0b3JzCisgICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZU91dHB1dERldmljZXM7IC8vIGFsbCBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMKKyAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzOyAgLy8gYWxsIGF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzCisgICAgICAgIGludCBtUGhvbmVTdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBwaG9uZSBzdGF0ZQorICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF07ICAgLy8gY3VycmVudCBmb3JjZWQgdXNlIGNvbmZpZ3VyYXRpb24KKworICAgICAgICBTdHJlYW1EZXNjcmlwdG9yIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9DTlRdOyAgICAgICAgICAgLy8gc3RyZWFtIGRlc2NyaXB0b3JzIGZvciB2b2x1bWUgY29udHJvbAorICAgICAgICBib29sICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbWl0IHJpbmd0b25lIHZvbHVtZSB0byBtdXNpYyB2b2x1bWUgaWYgaGVhZHNldCBjb25uZWN0ZWQKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VGb3JTdHJhdGVneVtOVU1fU1RSQVRFR0lFU107CisgICAgICAgIGZsb2F0ICAgbUxhc3RWb2ljZVZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCB2b2ljZSB2b2x1bWUgdmFsdWUgc2VudCB0byBhdWRpbyBIQUwKKworICAgICAgICAvLyBNYXhpbXVtIENQVSBsb2FkIGFsbG9jYXRlZCB0byBhdWRpbyBlZmZlY3RzIGluIDAuMSBNSVBTIChBUk12NVRFLCAwIFdTIG1lbW9yeSkgdW5pdHMKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9FRkZFQ1RTX0NQVV9MT0FEID0gMTAwMDsKKyAgICAgICAgLy8gTWF4aW11bSBtZW1vcnkgYWxsb2NhdGVkIHRvIGF1ZGlvIGVmZmVjdHMgaW4gS0IKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9FRkZFQ1RTX01FTU9SWSA9IDUxMjsKKyAgICAgICAgdWludDMyX3QgbVRvdGFsRWZmZWN0c0NwdUxvYWQ7IC8vIGN1cnJlbnQgQ1BVIGxvYWQgdXNlZCBieSBlZmZlY3RzCisgICAgICAgIHVpbnQzMl90IG1Ub3RhbEVmZmVjdHNNZW1vcnk7ICAvLyBjdXJyZW50IG1lbW9yeSB1c2VkIGJ5IGVmZmVjdHMKKyAgICAgICAgS2V5ZWRWZWN0b3I8aW50LCBzcDxFZmZlY3REZXNjcmlwdG9yPiA+IG1FZmZlY3RzOyAgLy8gbGlzdCBvZiByZWdpc3RlcmVkIGF1ZGlvIGVmZmVjdHMKKyAgICAgICAgYm9vbCAgICBtQTJkcFN1c3BlbmRlZDsgIC8vIHRydWUgaWYgQTJEUCBvdXRwdXQgaXMgc3VzcGVuZGVkCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1EZWZhdWx0T3V0cHV0RGV2aWNlOyAvLyBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgYXQgYm9vdCB0aW1lCisgICAgICAgIGJvb2wgbVNwZWFrZXJEcmNFbmFibGVkOy8vIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlIERFVklDRV9DQVRFR09SWV9TUEVBS0VSIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYm9vc3Qgc29mdCBzb3VuZHMsIHVzZWQgdG8gYWRqdXN0IHZvbHVtZSBjdXJ2ZXMgYWNjb3JkaW5nbHkKKworICAgICAgICBWZWN0b3IgPCBzcDxId01vZHVsZT4gPiBtSHdNb2R1bGVzOworICAgICAgICB2b2xhdGlsZSBpbnQzMl90IG1OZXh0VW5pcXVlSWQ7CisgICAgICAgIHZvbGF0aWxlIGludDMyX3QgbUF1ZGlvUG9ydEdlbmVyYXRpb247CisKKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBzcDxBdWRpb1BhdGNoPiA+IG1BdWRpb1BhdGNoZXM7CisKKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdCwgYXVkaW9faW9faGFuZGxlX3Q+IG1Tb3VuZFRyaWdnZXJTZXNzaW9uczsKKworICAgICAgICBzcDxBdWRpb1BhdGNoPiBtQ2FsbFR4UGF0Y2g7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsUnhQYXRjaDsKKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgICAgIE11dGV4ICAgbUxvY2s7CisgICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKKworICAgICAgICBpbnQgICAgICAgICAgICAgbUN1ck91dHB1dDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQ7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1UZXN0T3V0cHV0c1tOVU1fVEVTVF9PVVRQVVRTXTsKKyAgICAgICAgaW50ICAgICAgICAgICAgIG1UZXN0SW5wdXQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdERldmljZTsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlOworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RGb3JtYXQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdENoYW5uZWxzOworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RMYXRlbmN5TXM7CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCitwcml2YXRlOgorICAgICAgICBzdGF0aWMgZmxvYXQgdm9sSW5kZXhUb0FtcGwoYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgU3RyZWFtRGVzY3JpcHRvciYgc3RyZWFtRGVzYywKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKTsKKyAgICAgICAgLy8gdXBkYXRlcyBkZXZpY2UgY2FjaGluZyBhbmQgb3V0cHV0IGZvciBzdHJlYW1zIHRoYXQgY2FuIGluZmx1ZW5jZSB0aGUKKyAgICAgICAgLy8gICAgcm91dGluZyBvZiBub3RpZmljYXRpb25zCisgICAgICAgIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgICAgIHN0YXRpYyBib29sIGlzVmlydHVhbElucHV0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgICAgICBzdGF0aWMgYm9vbCBkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgICAgICAvLyBmaW5kIHRoZSBvdXRwdXRzIG9uIGEgZ2l2ZW4gb3V0cHV0IGRlc2NyaXB0b3IgdGhhdCBoYXZlIHRoZSBnaXZlbiBhZGRyZXNzLgorICAgICAgICAvLyB0byBiZSBjYWxsZWQgb24gYW4gQXVkaW9PdXRwdXREZXNjcmlwdG9yIHdob3NlIHN1cHBvcnRlZCBkZXZpY2VzIChhcyBkZWZpbmVkCisgICAgICAgIC8vICAgaW4gbVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzKSBtYXRjaGVzIHRoZSBkZXZpY2Ugd2hvc2UgYWRkcmVzcyBpcyB0byBiZSBtYXRjaGVkLgorICAgICAgICAvLyBzZWUgZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhhdWRpb19kZXZpY2VzX3QpIGZvciB3aGV0aGVyIHRoZSBkZXZpY2UgdHlwZSBpcyBvbmUKKyAgICAgICAgLy8gICB3aGVyZSBhZGRyZXNzZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvbmUgY29ubmVjdGVkIGRldmljZSBhbmQgYW5vdGhlci4KKyAgICAgICAgdm9pZCBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyAvKmluKi8sCisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzIC8qaW4qLywKKyAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzIC8qb3V0Ki8pOworICAgICAgICB1aW50MzJfdCBuZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgdWludDMyX3QgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgdWludDMyX3QgY3VyQXVkaW9Qb3J0R2VuZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb1BvcnRHZW5lcmF0aW9uOyB9CisgICAgICAgIC8vIGludGVybmFsIG1ldGhvZCB0byByZXR1cm4gdGhlIG91dHB1dCBoYW5kbGUgZm9yIHRoZSBnaXZlbiBkZXZpY2UgYW5kIGZvcm1hdAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JEZXZpY2UoCisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CisgICAgICAgIC8vIGludGVybmFsIGZ1bmN0aW9uIHRvIGRlcml2ZSBhIHN0cmVhbSB0eXBlIHZhbHVlIGZyb20gYXVkaW8gYXR0cmlidXRlcworICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpOworfTsKKworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDA2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsMTA1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lTZXJ2aWNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI3VuZGVmIF9fU1RSSUNUX0FOU0lfXworI2RlZmluZSBfX1NURElOVF9MSU1JVFMKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisjaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L3Bvd2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGNoYXIga0RlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb1BvbGljeVNlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CitzdGF0aWMgY29uc3QgY2hhciBrQ21kRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvUG9saWN5U2VydmljZSBjb21tYW5kIHRocmVhZCBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKKworc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7CitzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKKworc3RhdGljIGNvbnN0IG5zZWNzX3Qga0F1ZGlvQ29tbWFuZFRpbWVvdXROcyA9IHNlY29uZHMoMyk7IC8vIDMgc2Vjb25kcworCituYW1lc3BhY2UgeworICAgIGV4dGVybiBzdHJ1Y3QgYXVkaW9fcG9saWN5X3NlcnZpY2Vfb3BzIGFwc19vcHM7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0F1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lTZXJ2aWNlKCkKKyAgICA6IEJuQXVkaW9Qb2xpY3lTZXJ2aWNlKCksIG1wQXVkaW9Qb2xpY3lEZXYoTlVMTCksIG1wQXVkaW9Qb2xpY3koTlVMTCksCisgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyKE5VTEwpLCBtQXVkaW9Qb2xpY3lDbGllbnQoTlVMTCksIG1QaG9uZVN0YXRlKEFVRElPX01PREVfSU5WQUxJRCkKK3sKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uRmlyc3RSZWYoKQoreworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QgKm1vZHVsZTsKKyAgICBpbnQgZm9yY2VkX3ZhbDsKKyAgICBpbnQgcmM7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAgICAgLy8gc3RhcnQgdG9uZSBwbGF5YmFjayB0aHJlYWQKKyAgICAgICAgbVRvbmVQbGF5YmFja1RocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtVG9uZSIpLCB0aGlzKTsKKyAgICAgICAgLy8gc3RhcnQgYXVkaW8gY29tbWFuZHMgdGhyZWFkCisgICAgICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbUF1ZGlvIiksIHRoaXMpOworICAgICAgICAvLyBzdGFydCBvdXRwdXQgYWN0aXZpdHkgY29tbWFuZCB0aHJlYWQKKyAgICAgICAgbU91dHB1dENvbW1hbmRUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbU91dHB1dCIpLCB0aGlzKTsKKworI2lmZGVmIFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZCisgICAgICAgIEFMT0dJKCJBdWRpb1BvbGljeVNlcnZpY2UgQ1NUT1IgaW4gbGVnYWN5IG1vZGUiKTsKKworICAgICAgICAvKiBpbnN0YW50aWF0ZSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgKi8KKyAgICAgICAgcmMgPSBod19nZXRfbW9kdWxlKEFVRElPX1BPTElDWV9IQVJEV0FSRV9NT0RVTEVfSUQsICZtb2R1bGUpOworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByYyA9IGF1ZGlvX3BvbGljeV9kZXZfb3Blbihtb2R1bGUsICZtcEF1ZGlvUG9saWN5RGV2KTsKKyAgICAgICAgQUxPR0VfSUYocmMsICJjb3VsZG4ndCBvcGVuIGF1ZGlvIHBvbGljeSBkZXZpY2UgKCVzKSIsIHN0cmVycm9yKC1yYykpOworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gbXBBdWRpb1BvbGljeURldi0+Y3JlYXRlX2F1ZGlvX3BvbGljeShtcEF1ZGlvUG9saWN5RGV2LCAmYXBzX29wcywgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtcEF1ZGlvUG9saWN5KTsKKyAgICAgICAgQUxPR0VfSUYocmMsICJjb3VsZG4ndCBjcmVhdGUgYXVkaW8gcG9saWN5ICglcykiLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICByYyA9IG1wQXVkaW9Qb2xpY3ktPmluaXRfY2hlY2sobXBBdWRpb1BvbGljeSk7CisgICAgICAgIEFMT0dFX0lGKHJjLCAiY291bGRuJ3QgaW5pdF9jaGVjayB0aGUgYXVkaW8gcG9saWN5ICglcykiLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQUxPR0koIkxvYWRlZCBhdWRpbyBwb2xpY3kgZnJvbSAlcyAoJXMpIiwgbW9kdWxlLT5uYW1lLCBtb2R1bGUtPmlkKTsKKyNlbHNlCisgICAgICAgIEFMT0dJKCJBdWRpb1BvbGljeVNlcnZpY2UgQ1NUT1IgaW4gbmV3IG1vZGUiKTsKKworICAgICAgICBtQXVkaW9Qb2xpY3lDbGllbnQgPSBuZXcgQXVkaW9Qb2xpY3lDbGllbnQodGhpcyk7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXIgPSBjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIobUF1ZGlvUG9saWN5Q2xpZW50KTsKKyNlbmRpZgorICAgIH0KKyAgICAvLyBsb2FkIGF1ZGlvIHByb2Nlc3NpbmcgbW9kdWxlcworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHMgPSBuZXcgQXVkaW9Qb2xpY3lFZmZlY3RzKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtQXVkaW9Qb2xpY3lFZmZlY3RzID0gYXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KK30KKworQXVkaW9Qb2xpY3lTZXJ2aWNlOjp+QXVkaW9Qb2xpY3lTZXJ2aWNlKCkKK3sKKyAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5leGl0KCk7CisgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZXhpdCgpOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5leGl0KCk7CisKKyNpZmRlZiBVU0VfTEVHQUNZX0FVRElPX1BPTElDWQorICAgIGlmIChtcEF1ZGlvUG9saWN5ICE9IE5VTEwgJiYgbXBBdWRpb1BvbGljeURldiAhPSBOVUxMKSB7CisgICAgICAgIG1wQXVkaW9Qb2xpY3lEZXYtPmRlc3Ryb3lfYXVkaW9fcG9saWN5KG1wQXVkaW9Qb2xpY3lEZXYsIG1wQXVkaW9Qb2xpY3kpOworICAgIH0KKyAgICBpZiAobXBBdWRpb1BvbGljeURldiAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfY2xvc2UobXBBdWRpb1BvbGljeURldik7CisgICAgfQorI2Vsc2UKKyAgICBkZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VyKG1BdWRpb1BvbGljeU1hbmFnZXIpOworICAgIGRlbGV0ZSBtQXVkaW9Qb2xpY3lDbGllbnQ7CisjZW5kaWYKKworICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmNsZWFyKCk7CisgICAgbUF1ZGlvUG9saWN5RWZmZWN0cy5jbGVhcigpOworfQorCisvLyBBIG5vdGlmaWNhdGlvbiBjbGllbnQgaXMgYWx3YXlzIHJlZ2lzdGVyZWQgYnkgQXVkaW9TeXN0ZW0gd2hlbiB0aGUgY2xpZW50IHByb2Nlc3MKKy8vIGNvbm5lY3RzIHRvIEF1ZGlvUG9saWN5U2VydmljZS4KK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KQoreworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh1aWQpIDwgMCkgeworICAgICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IG5vdGlmaWNhdGlvbkNsaWVudCA9IG5ldyBOb3RpZmljYXRpb25DbGllbnQodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudCgpIGNsaWVudCAlcCwgdWlkICVkIiwgY2xpZW50LmdldCgpLCB1aWQpOworCisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmFkZCh1aWQsIG5vdGlmaWNhdGlvbkNsaWVudCk7CisKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gY2xpZW50LT5hc0JpbmRlcigpOworICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG5vdGlmaWNhdGlvbkNsaWVudCk7CisgICAgfQorfQorCisvLyByZW1vdmVOb3RpZmljYXRpb25DbGllbnQoKSBpcyBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHVpZCk7CisKKyNpZm5kZWYgVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKKyAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmNsZWFyQXVkaW9QYXRjaGVzKHVpZCk7CisgICAgICAgIH0KKyNlbmRpZgorfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25BdWRpb1BvcnRMaXN0VXBkYXRlKCkKK3sKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+dXBkYXRlQXVkaW9Qb3J0TGlzdENvbW1hbmQoKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25BdWRpb1BvcnRMaXN0VXBkYXRlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpCit7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnVwZGF0ZUF1ZGlvUGF0Y2hMaXN0Q29tbWFuZCgpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNsaWVudENyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICByZXR1cm4gbUF1ZGlvQ29tbWFuZFRocmVhZC0+Y3JlYXRlQXVkaW9QYXRjaENvbW1hbmQocGF0Y2gsIGhhbmRsZSwgZGVsYXlNcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Y2xpZW50UmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHJldHVybiBtQXVkaW9Db21tYW5kVGhyZWFkLT5yZWxlYXNlQXVkaW9QYXRjaENvbW1hbmQoaGFuZGxlLCBkZWxheU1zKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Y2xpZW50U2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIG1BdWRpb0NvbW1hbmRUaHJlYWQtPnNldEF1ZGlvUG9ydENvbmZpZ0NvbW1hbmQoY29uZmlnLCBkZWxheU1zKTsKK30KKworQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Ok5vdGlmaWNhdGlvbkNsaWVudChjb25zdCBzcDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCisgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbVVpZCh1aWQpLCBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KGNsaWVudCkKK3sKK30KKworQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6On5Ob3RpZmljYXRpb25DbGllbnQoKQoreworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCit7CisgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBrZWVwKHRoaXMpOworICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSAhPSAwKSB7CisgICAgICAgIHNlcnZpY2UtPnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChtVWlkKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgeworICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDApIHsKKyAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgeworICAgIEFMT0dXKCJiaW5kZXJEaWVkKCkgJXAsIGNhbGxpbmcgcGlkICVkIiwgd2hvLnVuc2FmZV9nZXQoKSwKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7Cit9CisKK3N0YXRpYyBib29sIHRyeUxvY2soTXV0ZXgmIG11dGV4KQoreworICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKKyAgICAgICAgaWYgKG11dGV4LnRyeUxvY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcFVzKTsKKyAgICB9CisgICAgcmV0dXJuIGxvY2tlZDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkdW1wSW50ZXJuYWxzKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworI2lmZGVmIFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUG9saWN5TWFuYWdlciBJbnRlcmZhY2U6ICVwXG4iLCBtcEF1ZGlvUG9saWN5KTsKKyNlbHNlCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Qb2xpY3lNYW5hZ2VyOiAlcFxuIiwgbUF1ZGlvUG9saWN5TWFuYWdlcik7CisjZW5kaWYKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ29tbWFuZCBUaHJlYWQ6ICVwXG4iLCBtQXVkaW9Db21tYW5kVGhyZWFkLmdldCgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiVG9uZXMgVGhyZWFkOiAlcFxuIiwgbVRvbmVQbGF5YmFja1RocmVhZC5nZXQoKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQoreworICAgIGlmICghZHVtcEFsbG93ZWQoKSkgeworICAgICAgICBkdW1wUGVybWlzc2lvbkRlbmlhbChmZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKCFsb2NrZWQpIHsKKyAgICAgICAgICAgIFN0cmluZzggcmVzdWx0KGtEZWFkbG9ja2VkU3RyaW5nKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICB9CisKKyAgICAgICAgZHVtcEludGVybmFscyhmZCk7CisgICAgICAgIGlmIChtQXVkaW9Db21tYW5kVGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmR1bXAoZmQpOworICAgICAgICB9CisgICAgICAgIGlmIChtVG9uZVBsYXliYWNrVGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmR1bXAoZmQpOworICAgICAgICB9CisKKyNpZmRlZiBVU0VfTEVHQUNZX0FVRElPX1BPTElDWQorICAgICAgICBpZiAobXBBdWRpb1BvbGljeSkgeworICAgICAgICAgICAgbXBBdWRpb1BvbGljeS0+ZHVtcChtcEF1ZGlvUG9saWN5LCBmZCk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5kdW1wKGZkKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkdW1wUGVybWlzc2lvbkRlbmlhbChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUGVybWlzc2lvbiBEZW5pYWw6ICIKKyAgICAgICAgICAgICJjYW4ndCBkdW1wIEF1ZGlvUG9saWN5U2VydmljZSBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAorICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uVHJhbnNhY3QoCisgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgcmV0dXJuIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Cit9CisKKworLy8gLS0tLS0tLS0tLS0gIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KKworQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OkF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UpCisgICAgOiBUaHJlYWQoZmFsc2UpLCBtTmFtZShuYW1lKSwgbVNlcnZpY2Uoc2VydmljZSkKK3sKKyAgICBtcFRvbmVHZW5lcmF0b3IgPSBOVUxMOworfQorCisKK0F1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp+QXVkaW9Db21tYW5kVGhyZWFkKCkKK3sKKyAgICBpZiAoIW1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgeworICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7CisgICAgfQorICAgIG1BdWRpb0NvbW1hbmRzLmNsZWFyKCk7CisgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6b25GaXJzdFJlZigpCit7CisgICAgcnVuKG1OYW1lLnN0cmluZygpLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgbnNlY3NfdCB3YWl0VGltZSA9IElOVDY0X01BWDsKKworICAgIG1Mb2NrLmxvY2soKTsKKyAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCisgICAgeworICAgICAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHN2YzsKKyAgICAgICAgd2hpbGUgKCFtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkgJiYgIWV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIG5zZWNzX3QgY3VyVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgIC8vIGNvbW1hbmRzIGFyZSBzb3J0ZWQgYnkgaW5jcmVhc2luZyB0aW1lIHN0YW1wOiBleGVjdXRlIHRoZW0gZnJvbSBpbmRleCAwIGFuZCB1cAorICAgICAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzWzBdLT5tVGltZSA8PSBjdXJUaW1lKSB7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbUF1ZGlvQ29tbWFuZHNbMF07CisgICAgICAgICAgICAgICAgbUF1ZGlvQ29tbWFuZHMucmVtb3ZlQXQoMCk7CisgICAgICAgICAgICAgICAgbUxhc3RDb21tYW5kID0gY29tbWFuZDsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZC0+bUNvbW1hbmQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVJUX1RPTkU6IHsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIFRvbmVEYXRhICpkYXRhID0gKFRvbmVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdGFydCB0b25lICVkIG9uIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVR5cGUsIGRhdGEtPm1TdHJlYW0pOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOworICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3IgPSBuZXcgVG9uZUdlbmVyYXRvcihkYXRhLT5tU3RyZWFtLCAxLjApOworICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3ItPnN0YXJ0VG9uZShkYXRhLT5tVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9UT05FOiB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIHRvbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1wVG9uZUdlbmVyYXRvciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3ItPnN0b3BUb25lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFVF9WT0xVTUU6IHsKKyAgICAgICAgICAgICAgICAgICAgVm9sdW1lRGF0YSAqZGF0YSA9IChWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9sdW1lIHN0cmVhbSAlZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSAlZiwgb3V0cHV0ICVkIiwgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVZvbHVtZSwgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1Wb2x1bWUoZGF0YS0+bVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKKyAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEgPSAoUGFyYW1ldGVyc0RhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCBwYXJhbWV0ZXJzIHN0cmluZyAlcywgaW8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoZGF0YS0+bUlPLCBkYXRhLT5tS2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFVF9WT0lDRV9WT0xVTUU6IHsKKyAgICAgICAgICAgICAgICAgICAgVm9pY2VWb2x1bWVEYXRhICpkYXRhID0gKFZvaWNlVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvaWNlIHZvbHVtZSB2b2x1bWUgJWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Wb2x1bWUpOworICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFZvaWNlVm9sdW1lKGRhdGEtPm1Wb2x1bWUpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVE9QX09VVFBVVDogeworICAgICAgICAgICAgICAgICAgICBTdG9wT3V0cHV0RGF0YSAqZGF0YSA9IChTdG9wT3V0cHV0RGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1N0b3BPdXRwdXQoZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9PVVRQVVQ6IHsKKyAgICAgICAgICAgICAgICAgICAgUmVsZWFzZU91dHB1dERhdGEgKmRhdGEgPSAoUmVsZWFzZU91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJlbGVhc2Ugb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9SZWxlYXNlT3V0cHV0KGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1JFQVRFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICAgICAgICAgIENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICpkYXRhID0gKENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBjcmVhdGUgYXVkaW8gcGF0Y2giKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+Y3JlYXRlQXVkaW9QYXRjaCgmZGF0YS0+bVBhdGNoLCAmZGF0YS0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fUEFUQ0g6IHsKKyAgICAgICAgICAgICAgICAgICAgUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhICpkYXRhID0gKFJlbGVhc2VBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgcmVsZWFzZSBhdWRpbyBwYXRjaCIpOworICAgICAgICAgICAgICAgICAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5yZWxlYXNlQXVkaW9QYXRjaChkYXRhLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX0FVRElPUE9SVF9MSVNUOiB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHVwZGF0ZSBhdWRpbyBwb3J0IGxpc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX0FVRElPUEFUQ0hfTElTVDogeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyB1cGRhdGUgYXVkaW8gcGF0Y2ggbGlzdCIpOworICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VUX0FVRElPUE9SVF9DT05GSUc6IHsKKyAgICAgICAgICAgICAgICAgICAgU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSAqZGF0YSA9IChTZXRBdWRpb1BvcnRDb25maWdEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgcG9ydCBjb25maWciKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZkYXRhLT5tQ29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSB1bmtub3duIGNvbW1hbmQgJWQiLCBjb21tYW5kLT5tQ29tbWFuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGNvbW1hbmQtPm1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2FpdFRpbWUgPSBJTlQ2NF9NQVg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdhaXRUaW1lID0gbUF1ZGlvQ29tbWFuZHNbMF0tPm1UaW1lIC0gY3VyVGltZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyByZWxlYXNlIG1Mb2NrIGJlZm9yZSByZWxlYXNpbmcgc3Ryb25nIHJlZmVyZW5jZSBvbiB0aGUgc2VydmljZSBhcworICAgICAgICAvLyBBdWRpb1BvbGljeVNlcnZpY2UgZGVzdHJ1Y3RvciBjYWxscyBBdWRpb0NvbW1hbmRUaHJlYWQ6OmV4aXQoKSB3aGljaCBhY3F1aXJlcyBtTG9jay4KKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIHN2Yy5jbGVhcigpOworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIGlmICghZXhpdFBlbmRpbmcoKSAmJiBtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIHJlbGVhc2UgZGVsYXllZCBjb21tYW5kcyB3YWtlIGxvY2sKKyAgICAgICAgICAgIHJlbGVhc2Vfd2FrZV9sb2NrKG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBnb2luZyB0byBzbGVlcCIpOworICAgICAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCB3YWl0VGltZSk7CisgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgd2FraW5nIHVwIik7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gcmVsZWFzZSBkZWxheWVkIGNvbW1hbmRzIHdha2UgbG9jayBiZWZvcmUgcXVpdHRpbmcKKyAgICBpZiAoIW1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgeworICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7CisgICAgfQorICAgIG1Mb2NrLnVubG9jaygpOworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Db21tYW5kVGhyZWFkICVwIER1bXBcbiIsIHRoaXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtTG9jayk7CisgICAgaWYgKCFsb2NrZWQpIHsKKyAgICAgICAgU3RyaW5nOCByZXN1bHQyKGtDbWREZWFkbG9ja2VkU3RyaW5nKTsKKyAgICAgICAgd3JpdGUoZmQsIHJlc3VsdDIuc3RyaW5nKCksIHJlc3VsdDIuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIENvbW1hbmRzOlxuIik7CisgICAgcmVzdWx0ID0gU3RyaW5nOChidWZmZXIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgIENvbW1hbmQgVGltZSAgICAgICAgV2FpdCBwUGFyYW1cbiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUF1ZGlvQ29tbWFuZHNbaV0tPmR1bXAoYnVmZmVyLCBTSVpFKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCIgIExhc3QgQ29tbWFuZFxuIik7CisgICAgaWYgKG1MYXN0Q29tbWFuZCAhPSAwKSB7CisgICAgICAgIG1MYXN0Q29tbWFuZC0+ZHVtcChidWZmZXIsIFNJWkUpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICBub25lXG4iKTsKKyAgICB9CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIGlmIChsb2NrZWQpIG1Mb2NrLnVubG9jaygpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0eXBlLAorICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVEFSVF9UT05FOworICAgIHNwPFRvbmVEYXRhPiBkYXRhID0gbmV3IFRvbmVEYXRhKCk7CisgICAgZGF0YS0+bVR5cGUgPSB0eXBlOworICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RhcnQgdHlwZSAlZCwgc3RyZWFtICVkIiwgdHlwZSwgc3RyZWFtKTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcFRvbmVDb21tYW5kKCkKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX1RPTkU7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB0b25lIHN0b3AiKTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnZvbHVtZUNvbW1hbmQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTRVRfVk9MVU1FOworICAgIHNwPFZvbHVtZURhdGE+IGRhdGEgPSBuZXcgVm9sdW1lRGF0YSgpOworICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07CisgICAgZGF0YS0+bVZvbHVtZSA9IHZvbHVtZTsKKyAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IHRydWU7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgdm9sdW1lIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgc3RyZWFtLCB2b2x1bWUsIG91dHB1dCk7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRlbGF5TXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cGFyYW1ldGVyc0NvbW1hbmQoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTRVRfUEFSQU1FVEVSUzsKKyAgICBzcDxQYXJhbWV0ZXJzRGF0YT4gZGF0YSA9IG5ldyBQYXJhbWV0ZXJzRGF0YSgpOworICAgIGRhdGEtPm1JTyA9IGlvSGFuZGxlOworICAgIGRhdGEtPm1LZXlWYWx1ZVBhaXJzID0gU3RyaW5nOChrZXlWYWx1ZVBhaXJzKTsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gdHJ1ZTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHNldCBwYXJhbWV0ZXIgc3RyaW5nICVzLCBpbyAlZCAsZGVsYXkgJWQiLAorICAgICAgICAgICAga2V5VmFsdWVQYWlycywgaW9IYW5kbGUsIGRlbGF5TXMpOworICAgIHJldHVybiBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnZvaWNlVm9sdW1lQ29tbWFuZChmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNFVF9WT0lDRV9WT0xVTUU7CisgICAgc3A8Vm9pY2VWb2x1bWVEYXRhPiBkYXRhID0gbmV3IFZvaWNlVm9sdW1lRGF0YSgpOworICAgIGRhdGEtPm1Wb2x1bWUgPSB2b2x1bWU7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IHRydWU7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsIHZvbHVtZSk7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRlbGF5TXMpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUT1BfT1VUUFVUOworICAgIHNwPFN0b3BPdXRwdXREYXRhPiBkYXRhID0gbmV3IFN0b3BPdXRwdXREYXRhKCk7CisgICAgZGF0YS0+bUlPID0gb3V0cHV0OworICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07CisgICAgZGF0YS0+bVNlc3Npb24gPSBzZXNzaW9uOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzdG9wIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUxFQVNFX09VVFBVVDsKKyAgICBzcDxSZWxlYXNlT3V0cHV0RGF0YT4gZGF0YSA9IG5ldyBSZWxlYXNlT3V0cHV0RGF0YSgpOworICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6Y3JlYXRlQXVkaW9QYXRjaENvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gQ1JFQVRFX0FVRElPX1BBVENIOworICAgIENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICpkYXRhID0gbmV3IENyZWF0ZUF1ZGlvUGF0Y2hEYXRhKCk7CisgICAgZGF0YS0+bVBhdGNoID0gKnBhdGNoOworICAgIGRhdGEtPm1IYW5kbGUgPSAqaGFuZGxlOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgY3JlYXRlIHBhdGNoIGRlbGF5ICVkIiwgZGVsYXlNcyk7CisgICAgc3RhdHVzID0gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAqaGFuZGxlID0gZGF0YS0+bUhhbmRsZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlbGVhc2VBdWRpb1BhdGNoQ29tbWFuZChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVMRUFTRV9BVURJT19QQVRDSDsKKyAgICBSZWxlYXNlQXVkaW9QYXRjaERhdGEgKmRhdGEgPSBuZXcgUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhKCk7CisgICAgZGF0YS0+bUhhbmRsZSA9IGhhbmRsZTsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gdHJ1ZTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHJlbGVhc2UgcGF0Y2ggZGVsYXkgJWQiLCBkZWxheU1zKTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnVwZGF0ZUF1ZGlvUG9ydExpc3RDb21tYW5kKCkKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBVUERBVEVfQVVESU9QT1JUX0xJU1Q7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB1cGRhdGUgYXVkaW8gcG9ydCBsaXN0Iik7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnVwZGF0ZUF1ZGlvUGF0Y2hMaXN0Q29tbWFuZCgpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBVUERBVEVfQVVESU9QQVRDSF9MSVNUOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdXBkYXRlIGF1ZGlvIHBhdGNoIGxpc3QiKTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnNldEF1ZGlvUG9ydENvbmZpZ0NvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLCBpbnQgZGVsYXlNcykKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTRVRfQVVESU9QT1JUX0NPTkZJRzsKKyAgICBTZXRBdWRpb1BvcnRDb25maWdEYXRhICpkYXRhID0gbmV3IFNldEF1ZGlvUG9ydENvbmZpZ0RhdGEoKTsKKyAgICBkYXRhLT5tQ29uZmlnID0gKmNvbmZpZzsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gdHJ1ZTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHNldCBwb3J0IGNvbmZpZyBkZWxheSAlZCIsIGRlbGF5TXMpOworICAgIHJldHVybiBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnNlbmRDb21tYW5kKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zKQoreworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKGNvbW1hbmQsIGRlbGF5TXMpOworICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGNvbW1hbmQtPm1Mb2NrKTsKKyAgICB3aGlsZSAoY29tbWFuZC0+bVdhaXRTdGF0dXMpIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lT3V0TnMgPSBrQXVkaW9Db21tYW5kVGltZW91dE5zICsgbWlsbGlzZWNvbmRzKGRlbGF5TXMpOworICAgICAgICBpZiAoY29tbWFuZC0+bUNvbmQud2FpdFJlbGF0aXZlKGNvbW1hbmQtPm1Mb2NrLCB0aW1lT3V0TnMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gVElNRURfT1VUOworICAgICAgICAgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY29tbWFuZC0+bVN0YXR1czsKK30KKworLy8gaW5zZXJ0Q29tbWFuZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjppbnNlcnRDb21tYW5kX2woc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMpCit7CisgICAgc3NpemVfdCBpOyAgLy8gbm90IHNpemVfdCBiZWNhdXNlIGkgd2lsbCBjb3VudCBkb3duIHRvIC0xCisgICAgVmVjdG9yIDwgc3A8QXVkaW9Db21tYW5kPiA+IHJlbW92ZWRDb21tYW5kczsKKyAgICBjb21tYW5kLT5tVGltZSA9IHN5c3RlbVRpbWUoKSArIG1pbGxpc2Vjb25kcyhkZWxheU1zKTsKKworICAgIC8vIGFjcXVpcmUgd2FrZSBsb2NrIHRvIG1ha2Ugc3VyZSBkZWxheWVkIGNvbW1hbmRzIGFyZSBwcm9jZXNzZWQKKyAgICBpZiAobUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7CisgICAgICAgIGFjcXVpcmVfd2FrZV9sb2NrKFBBUlRJQUxfV0FLRV9MT0NLLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gY2hlY2sgc2FtZSBwZW5kaW5nIGNvbW1hbmRzIHdpdGggbGF0ZXIgdGltZSBzdGFtcHMgYW5kIGVsaW1pbmF0ZSB0aGVtCisgICAgZm9yIChpID0gbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZDIgPSBtQXVkaW9Db21tYW5kc1tpXTsKKyAgICAgICAgLy8gY29tbWFuZHMgYXJlIHNvcnRlZCBieSBpbmNyZWFzaW5nIHRpbWUgc3RhbXA6IG5vIG5lZWQgdG8gc2NhbiB0aGUgcmVzdCBvZiBtQXVkaW9Db21tYW5kcworICAgICAgICBpZiAoY29tbWFuZDItPm1UaW1lIDw9IGNvbW1hbmQtPm1UaW1lKSBicmVhazsKKworICAgICAgICAvLyBjcmVhdGUgYXVkaW8gcGF0Y2ggb3IgcmVsZWFzZSBhdWRpbyBwYXRjaCBjb21tYW5kcyBhcmUgZXF1aXZhbGVudAorICAgICAgICAvLyB3aXRoIHJlZ2FyZCB0byBmaWx0ZXJpbmcKKyAgICAgICAgaWYgKChjb21tYW5kLT5tQ29tbWFuZCA9PSBDUkVBVEVfQVVESU9fUEFUQ0gpIHx8CisgICAgICAgICAgICAgICAgKGNvbW1hbmQtPm1Db21tYW5kID09IFJFTEVBU0VfQVVESU9fUEFUQ0gpKSB7CisgICAgICAgICAgICBpZiAoKGNvbW1hbmQyLT5tQ29tbWFuZCAhPSBDUkVBVEVfQVVESU9fUEFUQ0gpICYmCisgICAgICAgICAgICAgICAgICAgIChjb21tYW5kMi0+bUNvbW1hbmQgIT0gUkVMRUFTRV9BVURJT19QQVRDSCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kMi0+bUNvbW1hbmQgIT0gY29tbWFuZC0+bUNvbW1hbmQpIGNvbnRpbnVlOworCisgICAgICAgIHN3aXRjaCAoY29tbWFuZC0+bUNvbW1hbmQpIHsKKyAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogeworICAgICAgICAgICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEgPSAoUGFyYW1ldGVyc0RhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YTIgPSAoUGFyYW1ldGVyc0RhdGEgKiljb21tYW5kMi0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgaWYgKGRhdGEtPm1JTyAhPSBkYXRhMi0+bUlPKSBicmVhazsKKyAgICAgICAgICAgIEFMT0dWKCJDb21wYXJpbmcgcGFyYW1ldGVyIGNvbW1hbmQgJXMgdG8gbmV3IGNvbW1hbmQgJXMiLAorICAgICAgICAgICAgICAgICAgICBkYXRhMi0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoZGF0YS0+bUtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0yID0gQXVkaW9QYXJhbWV0ZXIoZGF0YTItPm1LZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGFyYW0uc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IGtleTsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlOworICAgICAgICAgICAgICAgIHBhcmFtLmdldEF0KGosIGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcGFyYW0yLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgga2V5MjsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZTI7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtMi5nZXRBdChrLCBrZXkyLCB2YWx1ZTIpOworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5MiA9PSBrZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMi5yZW1vdmUoa2V5Mik7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiRmlsdGVyaW5nIG91dCBwYXJhbWV0ZXIgJXMiLCBrZXkyLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgYWxsIGtleXMgaGF2ZSBiZWVuIGZpbHRlcmVkIG91dCwgcmVtb3ZlIHRoZSBjb21tYW5kLgorICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCB1cGRhdGUgdGhlIGtleSB2YWx1ZSBwYWlycworICAgICAgICAgICAgaWYgKHBhcmFtMi5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJlbW92ZWRDb21tYW5kcy5hZGQoY29tbWFuZDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkYXRhMi0+bUtleVZhbHVlUGFpcnMgPSBwYXJhbTIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbW1hbmQtPm1UaW1lID0gY29tbWFuZDItPm1UaW1lOworICAgICAgICAgICAgLy8gZm9yY2UgZGVsYXlNcyB0byBub24gMCBzbyB0aGF0IGNvZGUgYmVsb3cgZG9lcyBub3QgcmVxdWVzdCB0byB3YWl0IGZvcgorICAgICAgICAgICAgLy8gY29tbWFuZCBzdGF0dXMgYXMgdGhlIGNvbW1hbmQgaXMgbm93IGRlbGF5ZWQKKyAgICAgICAgICAgIGRlbGF5TXMgPSAxOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgU0VUX1ZPTFVNRTogeworICAgICAgICAgICAgVm9sdW1lRGF0YSAqZGF0YSA9IChWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgVm9sdW1lRGF0YSAqZGF0YTIgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICBpZiAoZGF0YS0+bUlPICE9IGRhdGEyLT5tSU8pIGJyZWFrOworICAgICAgICAgICAgaWYgKGRhdGEtPm1TdHJlYW0gIT0gZGF0YTItPm1TdHJlYW0pIGJyZWFrOworICAgICAgICAgICAgQUxPR1YoIkZpbHRlcmluZyBvdXQgdm9sdW1lIGNvbW1hbmQgb24gb3V0cHV0ICVkIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8sIGRhdGEtPm1TdHJlYW0pOworICAgICAgICAgICAgcmVtb3ZlZENvbW1hbmRzLmFkZChjb21tYW5kMik7CisgICAgICAgICAgICBjb21tYW5kLT5tVGltZSA9IGNvbW1hbmQyLT5tVGltZTsKKyAgICAgICAgICAgIC8vIGZvcmNlIGRlbGF5TXMgdG8gbm9uIDAgc28gdGhhdCBjb2RlIGJlbG93IGRvZXMgbm90IHJlcXVlc3QgdG8gd2FpdCBmb3IKKyAgICAgICAgICAgIC8vIGNvbW1hbmQgc3RhdHVzIGFzIHRoZSBjb21tYW5kIGlzIG5vdyBkZWxheWVkCisgICAgICAgICAgICBkZWxheU1zID0gMTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDoKKyAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7CisgICAgICAgICAgICBpZiAoY29tbWFuZC0+bUNvbW1hbmQgPT0gQ1JFQVRFX0FVRElPX1BBVENIKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlID0gKChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKSktPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgcGF0Y2ggPSAoKENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpKS0+bVBhdGNoOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYW5kbGUgPSAoKFJlbGVhc2VBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKSktPm1IYW5kbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUyOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoMjsKKyAgICAgICAgICAgIGlmIChjb21tYW5kMi0+bUNvbW1hbmQgPT0gQ1JFQVRFX0FVRElPX1BBVENIKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlMiA9ICgoQ3JlYXRlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kMi0+bVBhcmFtLmdldCgpKS0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBwYXRjaDIgPSAoKENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZDItPm1QYXJhbS5nZXQoKSktPm1QYXRjaDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFuZGxlMiA9ICgoUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZDItPm1QYXJhbS5nZXQoKSktPm1IYW5kbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFuZGxlICE9IGhhbmRsZTIpIGJyZWFrOworICAgICAgICAgICAgLyogRmlsdGVyIENSRUFURV9BVURJT19QQVRDSCBjb21tYW5kcyBvbmx5IHdoZW4gdGhleSBhcmUgaXNzdWVkIGZvcgorICAgICAgICAgICAgICAgc2FtZSBvdXRwdXQuICovCisgICAgICAgICAgICBpZiggKGNvbW1hbmQtPm1Db21tYW5kID09IENSRUFURV9BVURJT19QQVRDSCkgJiYKKyAgICAgICAgICAgICAgICAoY29tbWFuZDItPm1Db21tYW5kID09IENSRUFURV9BVURJT19QQVRDSCkgKSB7CisgICAgICAgICAgICAgICAgYm9vbCBpc091dHB1dERpZmYgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gubnVtX3NvdXJjZXMgPT0gcGF0Y2gyLm51bV9zb3VyY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgY291bnQgPSAwOyBjb3VudCA8IHBhdGNoLm51bV9zb3VyY2VzOyBjb3VudCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2guc291cmNlc1tjb3VudF0uaWQgIT0gcGF0Y2gyLnNvdXJjZXNbY291bnRdLmlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPdXRwdXREaWZmID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNPdXRwdXREaWZmKQorICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiRmlsdGVyaW5nIG91dCAlcyBhdWRpbyBwYXRjaCBjb21tYW5kIGZvciBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgKGNvbW1hbmQtPm1Db21tYW5kID09IENSRUFURV9BVURJT19QQVRDSCkgPyAiY3JlYXRlIiA6ICJyZWxlYXNlIiwgaGFuZGxlKTsKKyAgICAgICAgICAgIHJlbW92ZWRDb21tYW5kcy5hZGQoY29tbWFuZDIpOworICAgICAgICAgICAgY29tbWFuZC0+bVRpbWUgPSBjb21tYW5kMi0+bVRpbWU7CisgICAgICAgICAgICAvLyBmb3JjZSBkZWxheU1zIHRvIG5vbiAwIHNvIHRoYXQgY29kZSBiZWxvdyBkb2VzIG5vdCByZXF1ZXN0IHRvIHdhaXQgZm9yCisgICAgICAgICAgICAvLyBjb21tYW5kIHN0YXR1cyBhcyB0aGUgY29tbWFuZCBpcyBub3cgZGVsYXllZAorICAgICAgICAgICAgZGVsYXlNcyA9IDE7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVEFSVF9UT05FOgorICAgICAgICBjYXNlIFNUT1BfVE9ORToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcmVtb3ZlIGZpbHRlcmVkIGNvbW1hbmRzCisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZW1vdmVkQ29tbWFuZHMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgLy8gcmVtb3ZlZCBjb21tYW5kcyBhbHdheXMgaGF2ZSB0aW1lIHN0YW1wcyBncmVhdGVyIHRoYW4gY3VycmVudCBjb21tYW5kCisgICAgICAgIGZvciAoc2l6ZV90IGsgPSBpICsgMTsgayA8IG1BdWRpb0NvbW1hbmRzLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZHNba10uZ2V0KCkgPT0gcmVtb3ZlZENvbW1hbmRzW2pdLmdldCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInN1cHByZXNzaW5nIGNvbW1hbmQ6ICVkIiwgbUF1ZGlvQ29tbWFuZHNba10tPm1Db21tYW5kKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9Db21tYW5kcy5yZW1vdmVBdChrKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZW1vdmVkQ29tbWFuZHMuY2xlYXIoKTsKKworICAgIC8vIERpc2FibGUgd2FpdCBmb3Igc3RhdHVzIGlmIGRlbGF5IGlzIG5vdCAwCisgICAgaWYgKGRlbGF5TXMgIT0gMCkgeworICAgICAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IGZhbHNlOworICAgIH0KKworICAgIC8vIGluc2VydCBjb21tYW5kIGF0IHRoZSByaWdodCBwbGFjZSBhY2NvcmRpbmcgdG8gaXRzIHRpbWUgc3RhbXAKKyAgICBBTE9HVigiaW5zZXJ0aW5nIGNvbW1hbmQ6ICVkIGF0IGluZGV4ICV6ZCwgbnVtIGNvbW1hbmRzICV6dSIsCisgICAgICAgICAgICBjb21tYW5kLT5tQ29tbWFuZCwgaSsxLCBtQXVkaW9Db21tYW5kcy5zaXplKCkpOworICAgIG1BdWRpb0NvbW1hbmRzLmluc2VydEF0KGNvbW1hbmQsIGkgKyAxKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6ZXhpdCgpCit7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZDo6ZXhpdCIpOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICAgICAgcmVxdWVzdEV4aXQoKTsKKyAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CisgICAgfQorICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpBdWRpb0NvbW1hbmQ6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAlMDJkICAgICAgJTA2ZC4lMDNkICAlMDF1ICAgICVwXG4iLAorICAgICAgICAgICAgbUNvbW1hbmQsCisgICAgICAgICAgICAoaW50KW5zMnMobVRpbWUpLAorICAgICAgICAgICAgKGludCluczJtcyhtVGltZSklMTAwMCwKKyAgICAgICAgICAgIG1XYWl0U3RhdHVzLAorICAgICAgICAgICAgbVBhcmFtLmdldCgpKTsKK30KKworLyoqKioqKiogaGVscGVycyBmb3IgdGhlIHNlcnZpY2Vfb3BzIGNhbGxiYWNrcyBkZWZpbmVkIGJlbG93ICoqKioqKioqKi8KK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPnBhcmFtZXRlcnNDb21tYW5kKGlvSGFuZGxlLCBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOworfQorCitpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICByZXR1cm4gKGludCltQXVkaW9Db21tYW5kVGhyZWFkLT52b2x1bWVDb21tYW5kKHN0cmVhbSwgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBkZWxheU1zKTsKK30KKworaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBpZiAodG9uZSAhPSBBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTikgeworICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHRvbmUgcmVxdWVzdGVkICglZCkiLCB0b25lKTsKKyAgICB9CisgICAgaWYgKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgeworICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHN0cmVhbSAoJWQpIHJlcXVlc3RlZCBmb3IgdG9uZSAlZCIsIHN0cmVhbSwKKyAgICAgICAgICAgIHRvbmUpOworICAgIH0KKyAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OlRPTkVfU1VQX0NBTExfV0FJVElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcFRvbmUoKQoreworICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0b3BUb25lQ29tbWFuZCgpOworICAgIHJldHVybiAwOworfQorCitpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zKQoreworICAgIHJldHVybiAoaW50KW1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvaWNlVm9sdW1lQ29tbWFuZCh2b2x1bWUsIGRlbGF5TXMpOworfQorCitleHRlcm4gIkMiIHsKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBhcHNfbG9hZF9od19tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5fb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKworYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5fb3V0cHV0X29uX21vZHVsZSh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5fZHVwX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Mik7CitpbnQgYXBzX2Nsb3NlX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworaW50IGFwc19zdXNwZW5kX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworaW50IGFwc19yZXN0b3JlX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5faW5wdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5fYWNvdXN0aWNzX3QgYWNvdXN0aWNzIF9fdW51c2VkKTsKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2lucHV0X29uX21vZHVsZSh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2spOworaW50IGFwc19jbG9zZV9pbnB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CitpbnQgYXBzX2ludmFsaWRhdGVfc3RyZWFtKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKK2ludCBhcHNfbW92ZV9lZmZlY3RzKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3Rfb3V0cHV0KTsKK2NoYXIgKiBhcHNfZ2V0X3BhcmFtZXRlcnModm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleXMpOwordm9pZCBhcHNfc2V0X3BhcmFtZXRlcnModm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprdl9wYWlycywgaW50IGRlbGF5X21zKTsKK2ludCBhcHNfc2V0X3N0cmVhbV92b2x1bWUodm9pZCAqc2VydmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5X21zKTsKK2ludCBhcHNfc3RhcnRfdG9uZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CitpbnQgYXBzX3N0b3BfdG9uZSh2b2lkICpzZXJ2aWNlKTsKK2ludCBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcyk7Cit9OworCituYW1lc3BhY2UgeworICAgIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgYXBzX29wcyA9IHsKKyAgICAgICAgLm9wZW5fb3V0cHV0ICAgICAgICAgICA9IGFwc19vcGVuX291dHB1dCwKKyAgICAgICAgLm9wZW5fZHVwbGljYXRlX291dHB1dCA9IGFwc19vcGVuX2R1cF9vdXRwdXQsCisgICAgICAgIC5jbG9zZV9vdXRwdXQgICAgICAgICAgPSBhcHNfY2xvc2Vfb3V0cHV0LAorICAgICAgICAuc3VzcGVuZF9vdXRwdXQgICAgICAgID0gYXBzX3N1c3BlbmRfb3V0cHV0LAorICAgICAgICAucmVzdG9yZV9vdXRwdXQgICAgICAgID0gYXBzX3Jlc3RvcmVfb3V0cHV0LAorICAgICAgICAub3Blbl9pbnB1dCAgICAgICAgICAgID0gYXBzX29wZW5faW5wdXQsCisgICAgICAgIC5jbG9zZV9pbnB1dCAgICAgICAgICAgPSBhcHNfY2xvc2VfaW5wdXQsCisgICAgICAgIC5zZXRfc3RyZWFtX3ZvbHVtZSAgICAgPSBhcHNfc2V0X3N0cmVhbV92b2x1bWUsCisgICAgICAgIC5pbnZhbGlkYXRlX3N0cmVhbSAgICAgPSBhcHNfaW52YWxpZGF0ZV9zdHJlYW0sCisgICAgICAgIC5zZXRfcGFyYW1ldGVycyAgICAgICAgPSBhcHNfc2V0X3BhcmFtZXRlcnMsCisgICAgICAgIC5nZXRfcGFyYW1ldGVycyAgICAgICAgPSBhcHNfZ2V0X3BhcmFtZXRlcnMsCisgICAgICAgIC5zdGFydF90b25lICAgICAgICAgICAgPSBhcHNfc3RhcnRfdG9uZSwKKyAgICAgICAgLnN0b3BfdG9uZSAgICAgICAgICAgICA9IGFwc19zdG9wX3RvbmUsCisgICAgICAgIC5zZXRfdm9pY2Vfdm9sdW1lICAgICAgPSBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSwKKyAgICAgICAgLm1vdmVfZWZmZWN0cyAgICAgICAgICA9IGFwc19tb3ZlX2VmZmVjdHMsCisgICAgICAgIC5sb2FkX2h3X21vZHVsZSAgICAgICAgPSBhcHNfbG9hZF9od19tb2R1bGUsCisgICAgICAgIC5vcGVuX291dHB1dF9vbl9tb2R1bGUgPSBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlLAorICAgICAgICAub3Blbl9pbnB1dF9vbl9tb2R1bGUgID0gYXBzX29wZW5faW5wdXRfb25fbW9kdWxlLAorICAgIH07Cit9OyAvLyBuYW1lc3BhY2UgPHVubmFtZWQ+CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNjhhYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMCwwICsxLDUwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT1BPTElDWVNFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX0FVRElPUE9MSUNZU0VSVklDRV9ICisKKyNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL1RvbmVHZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9BdWRpb1BvbGljeUludGVyZmFjZS5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5RWZmZWN0cy5oIgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlci5oIgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2UgOgorICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPEF1ZGlvUG9saWN5U2VydmljZT4sCisgICAgcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlLAorICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAoreworICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPEF1ZGlvUG9saWN5U2VydmljZT47CisKK3B1YmxpYzoKKyAgICAvLyBmb3IgQmluZGVyU2VydmljZQorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRTZXJ2aWNlTmFtZSgpIEFORFJPSURfQVBJIHsgcmV0dXJuICJtZWRpYS5hdWRpb19wb2xpY3kiOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworICAgIC8vCisgICAgLy8gQm5BdWRpb1BvbGljeVNlcnZpY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykKKyAgICAvLworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOworICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOworICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpOworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCk7CisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworCisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpOworICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisKKyAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CisKKyAgICAvLyBSZWZCYXNlCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOworCisgICAgLy8KKyAgICAvLyBIZWxwZXJzIGZvciB0aGUgc3RydWN0IGF1ZGlvX3BvbGljeV9zZXJ2aWNlX29wcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGZvciBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdAorICAgIC8vIGFyZSBpbXBsZW1lbnRlZCBieSB0aGUgcG9saWN5IHNlcnZpY2UuCisgICAgLy8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7CisgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAmY29uZmlnKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworCisgICAgdmlydHVhbCBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpOworCisgICAgICAgICAgICBzdGF0dXNfdCBkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgICAgICAgICB2b2lkIGRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworCisgICAgICAgICAgICBzdGF0dXNfdCBjbGllbnRDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKyAgICAgICAgICAgIHN0YXR1c190IGNsaWVudFJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xpZW50U2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworCisgICAgICAgICAgICB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQpOworICAgICAgICAgICAgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIHZvaWQgZG9PbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgdm9pZCBkb09uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKworcHJpdmF0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZSgpIEFORFJPSURfQVBJOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvUG9saWN5U2VydmljZSgpOworCisgICAgICAgICAgICBzdGF0dXNfdCBkdW1wSW50ZXJuYWxzKGludCBmZCk7CisKKyAgICAvLyBUaHJlYWQgdXNlZCBmb3IgdG9uZSBwbGF5YmFjayBhbmQgdG8gc2VuZCBhdWRpbyBjb25maWcgY29tbWFuZHMgdG8gYXVkaW8gZmxpbmdlcgorICAgIC8vIEZvciB0b25lIHBsYXliYWNrLCB1c2luZyBhIHNlcGFyYXRlIHRocmVhZCBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgZGVhZGxvY2sgd2l0aCBtTG9jayBiZWNhdXNlCisgICAgLy8gc3RhcnRUb25lKCkgYW5kIHN0b3BUb25lKCkgYXJlIG5vcm1hbGx5IGNhbGxlZCB3aXRoIG1Mb2NrIGxvY2tlZCBhbmQgcmVxdWVzdGluZyBhIHRvbmUgc3RhcnQKKyAgICAvLyBvciBzdG9wIHdpbGwgY2F1c2UgY2FsbHMgdG8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGFuZCBhbiBhdHRlbXB0IHRvIGxvY2sgbUxvY2suCisgICAgLy8gRm9yIGF1ZGlvIGNvbmZpZyBjb21tYW5kcywgaXQgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgYXVkaW8gZmxpbmdlciByZXF1aXJlcyB0aGF0IHRoZSBjYWxsaW5nCisgICAgLy8gcHJvY2VzcyAodXNlcikgaGFzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IGF1ZGlvIHNldHRpbmdzLgorICAgIGNsYXNzIEF1ZGlvQ29tbWFuZFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmQ7CisgICAgcHVibGljOgorCisgICAgICAgIC8vIGNvbW1hbmRzIGZvciB0b25lIEF1ZGlvQ29tbWFuZAorICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIFNUQVJUX1RPTkUsCisgICAgICAgICAgICBTVE9QX1RPTkUsCisgICAgICAgICAgICBTRVRfVk9MVU1FLAorICAgICAgICAgICAgU0VUX1BBUkFNRVRFUlMsCisgICAgICAgICAgICBTRVRfVk9JQ0VfVk9MVU1FLAorICAgICAgICAgICAgU1RPUF9PVVRQVVQsCisgICAgICAgICAgICBSRUxFQVNFX09VVFBVVCwKKyAgICAgICAgICAgIENSRUFURV9BVURJT19QQVRDSCwKKyAgICAgICAgICAgIFJFTEVBU0VfQVVESU9fUEFUQ0gsCisgICAgICAgICAgICBVUERBVEVfQVVESU9QT1JUX0xJU1QsCisgICAgICAgICAgICBVUERBVEVfQVVESU9QQVRDSF9MSVNULAorICAgICAgICAgICAgU0VUX0FVRElPUE9SVF9DT05GSUcsCisgICAgICAgIH07CisKKyAgICAgICAgQXVkaW9Db21tYW5kVGhyZWFkIChTdHJpbmc4IG5hbWUsIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UpOworICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BdWRpb0NvbW1hbmRUaHJlYWQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisKKyAgICAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCisgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKKyAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOworCisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BUb25lQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgcGFyYW1ldGVyc0NvbW1hbmQoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zID0gMCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvaWNlVm9sdW1lQ29tbWFuZChmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbW1hbmQoc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hDb21tYW5kKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hDb21tYW5kKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlQXVkaW9Qb3J0TGlzdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlQXVkaW9QYXRjaExpc3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldEF1ZGlvUG9ydENvbmZpZ0NvbW1hbmQoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBpbnNlcnRDb21tYW5kX2woQXVkaW9Db21tYW5kICpjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kRGF0YTsKKworICAgICAgICAvLyBkZXNjcmlwdG9yIGZvciByZXF1ZXN0ZWQgdG9uZSBwbGF5YmFjayBldmVudAorICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmQ6IHB1YmxpYyBSZWZCYXNlIHsKKworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBdWRpb0NvbW1hbmQoKQorICAgICAgICAgICAgOiBtQ29tbWFuZCgtMSksIG1TdGF0dXMoTk9fRVJST1IpLCBtV2FpdFN0YXR1cyhmYWxzZSkge30KKworICAgICAgICAgICAgdm9pZCBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisgICAgICAgICAgICBpbnQgbUNvbW1hbmQ7ICAgLy8gU1RBUlRfVE9ORSwgU1RPUF9UT05FIC4uLgorICAgICAgICAgICAgbnNlY3NfdCBtVGltZTsgIC8vIHRpbWUgc3RhbXAKKyAgICAgICAgICAgIE11dGV4IG1Mb2NrOyAgICAvLyBtdXRleCBhc3NvY2lhdGVkIHRvIG1Db25kCisgICAgICAgICAgICBDb25kaXRpb24gbUNvbmQ7IC8vIGNvbmRpdGlvbiBmb3Igc3RhdHVzIHJldHVybgorICAgICAgICAgICAgc3RhdHVzX3QgbVN0YXR1czsgLy8gY29tbWFuZCBzdGF0dXMKKyAgICAgICAgICAgIGJvb2wgbVdhaXRTdGF0dXM7IC8vIHRydWUgaWYgY2FsbGVyIGlzIHdhaXRpbmcgZm9yIHN0YXR1cworICAgICAgICAgICAgc3A8QXVkaW9Db21tYW5kRGF0YT4gbVBhcmFtOyAgICAgLy8gY29tbWFuZCBzcGVjaWZpYyBwYXJhbWV0ZXIgZGF0YQorICAgICAgICB9OworCisgICAgICAgIGNsYXNzIEF1ZGlvQ29tbWFuZERhdGE6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgdmlydHVhbCB+QXVkaW9Db21tYW5kRGF0YSgpIHt9CisgICAgICAgIHByb3RlY3RlZDoKKyAgICAgICAgICAgIEF1ZGlvQ29tbWFuZERhdGEoKSB7fQorICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFRvbmVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgbVR5cGU7IC8vIHRvbmUgdHlwZSAoU1RBUlRfVE9ORSBvbmx5KQorICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOyAgICAvLyBzdHJlYW0gdHlwZSAoU1RBUlRfVE9ORSBvbmx5KQorICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFZvbHVtZURhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKKyAgICAgICAgICAgIGZsb2F0IG1Wb2x1bWU7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgUGFyYW1ldGVyc0RhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKKyAgICAgICAgICAgIFN0cmluZzggbUtleVZhbHVlUGFpcnM7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgVm9pY2VWb2x1bWVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBmbG9hdCBtVm9sdW1lOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFN0b3BPdXRwdXREYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CisgICAgICAgICAgICBpbnQgbVNlc3Npb247CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgUmVsZWFzZU91dHB1dERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBDcmVhdGVBdWRpb1BhdGNoRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaDsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFNldEF1ZGlvUG9ydENvbmZpZ0RhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBtQ29uZmlnOworICAgICAgICB9OworCisgICAgICAgIE11dGV4ICAgbUxvY2s7CisgICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKKyAgICAgICAgVmVjdG9yIDwgc3A8QXVkaW9Db21tYW5kPiA+IG1BdWRpb0NvbW1hbmRzOyAvLyBsaXN0IG9mIHBlbmRpbmcgY29tbWFuZHMKKyAgICAgICAgVG9uZUdlbmVyYXRvciAqbXBUb25lR2VuZXJhdG9yOyAgICAgLy8gdGhlIHRvbmUgZ2VuZXJhdG9yCisgICAgICAgIHNwPEF1ZGlvQ29tbWFuZD4gbUxhc3RDb21tYW5kOyAgICAgIC8vIGxhc3QgcHJvY2Vzc2VkIGNvbW1hbmQgKHVzZWQgYnkgZHVtcCkKKyAgICAgICAgU3RyaW5nOCBtTmFtZTsgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyaW5nIHVzZWQgYnkgd2FrZSBsb2NrIGZvIGRlbGF5ZWQgY29tbWFuZHMKKyAgICAgICAgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBtU2VydmljZTsKKyAgICB9OworCisgICAgY2xhc3MgQXVkaW9Qb2xpY3lDbGllbnQgOiBwdWJsaWMgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UKKyAgICB7CisgICAgIHB1YmxpYzoKKyAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnQoQXVkaW9Qb2xpY3lTZXJ2aWNlICpzZXJ2aWNlKSA6IG1BdWRpb1BvbGljeVNlcnZpY2Uoc2VydmljZSkge30KKyAgICAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lDbGllbnQoKSB7fQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEF1ZGlvIEhXIG1vZHVsZSBmdW5jdGlvbnMKKyAgICAgICAgLy8KKworICAgICAgICAvLyBsb2FkcyBhIEhXIG1vZHVsZS4KKyAgICAgICAgdmlydHVhbCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEF1ZGlvIG91dHB1dCBDb250cm9sIGZ1bmN0aW9ucworICAgICAgICAvLworCisgICAgICAgIC8vIG9wZW5zIGFuIGF1ZGlvIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycy4gVGhlIHBhcmFtZXRlciB2YWx1ZXMgY2FuIGluZGljYXRlIHRvIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMKKyAgICAgICAgLy8gaW4gY2FzZSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgaGFzIG5vIHNwZWNpZmljIHJlcXVpcmVtZW50cyBmb3IgdGhlIG91dHB1dCBiZWluZyBvcGVuZWQuCisgICAgICAgIC8vIFdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHJlZmxlY3QgdGhlIGFjdHVhbCB2YWx1ZXMgdXNlZCBieSB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4KKyAgICAgICAgLy8gVGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGNhbiBjaGVjayBpZiB0aGUgcHJvcG9zZWQgcGFyYW1ldGVycyBhcmUgc3VpdGFibGUgb3Igbm90IGFuZCBhY3QgYWNjb3JkaW5nbHkuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgLy8gY3JlYXRlcyBhIHNwZWNpYWwgb3V0cHV0IHRoYXQgaXMgZHVwbGljYXRlZCB0byB0aGUgdHdvIG91dHB1dHMgcGFzc2VkIGFzIGFyZ3VtZW50cy4gVGhlIGR1cGxpY2F0aW9uIGlzIHBlcmZvcm1lZCBieQorICAgICAgICAvLyBhIHNwZWNpYWwgbWl4ZXIgdGhyZWFkIGluIHRoZSBBdWRpb0ZsaW5nZXIuCisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKTsKKyAgICAgICAgLy8gY2xvc2VzIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyAgICAgICAgLy8gc3VzcGVuZHMgdGhlIG91dHB1dC4gV2hlbiBhbiBvdXRwdXQgaXMgc3VzcGVuZGVkLCB0aGUgY29ycmVzcG9uZGluZyBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtIGlzIHBsYWNlZCBpbgorICAgICAgICAvLyBzdGFuZGJ5IGFuZCB0aGUgQXVkaW9UcmFja3MgYXR0YWNoZWQgdG8gdGhlIG1peGVyIHRocmVhZCBhcmUgc3RpbGwgcHJvY2Vzc2VkIGJ1dCB0aGUgb3V0cHV0IG1peCBpcyBkaXNjYXJkZWQuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgICAgICAvLyByZXN0b3JlcyBhIHN1c3BlbmRlZCBvdXRwdXQuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEF1ZGlvIGlucHV0IENvbnRyb2wgZnVuY3Rpb25zCisgICAgICAgIC8vCisKKyAgICAgICAgLy8gb3BlbnMgYW4gYXVkaW8gaW5wdXQKKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgIC8vIGNsb3NlcyBhbiBhdWRpbyBpbnB1dAorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOworICAgICAgICAvLworICAgICAgICAvLyBtaXNjIGNvbnRyb2wgZnVuY3Rpb25zCisgICAgICAgIC8vCisKKyAgICAgICAgLy8gc2V0IGEgc3RyZWFtIHZvbHVtZSBmb3IgYSBwYXJ0aWN1bGFyIG91dHB1dC4gRm9yIHRoZSBzYW1lIHVzZXIgc2V0dGluZywgYSBnaXZlbiBzdHJlYW0gdHlwZSBjYW4gaGF2ZSBkaWZmZXJlbnQgdm9sdW1lcworICAgICAgICAvLyBmb3IgZWFjaCBvdXRwdXQgKGRlc3RpbmF0aW9uIGRldmljZSkgaXQgaXMgYXR0YWNoZWQgdG8uCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKTsKKworICAgICAgICAvLyBpbnZhbGlkYXRlIGEgc3RyZWFtIHR5cGUsIGNhdXNpbmcgYSByZXJvdXRlIHRvIGFuIHVuc3BlY2lmaWVkIG5ldyBvdXRwdXQKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKworICAgICAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byBzZW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRvIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZS4KKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zID0gMCk7CisgICAgICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHJlY2VpdmUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgorICAgICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cyk7CisKKyAgICAgICAgLy8gcmVxdWVzdCB0aGUgcGxheWJhY2sgb2YgYSB0b25lIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtOiB1c2VkIGZvciBpbnN0YW5jZSB0byByZXBsYWNlIG5vdGlmaWNhdGlvbiBzb3VuZHMgd2hlbiBwbGF5aW5nCisgICAgICAgIC8vIG92ZXIgYSB0ZWxlcGhvbnkgZGV2aWNlIGR1cmluZyBhIHBob25lIGNhbGwuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCk7CisKKyAgICAgICAgLy8gc2V0IGRvd24gbGluayBhdWRpbyB2b2x1bWUuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOworCisgICAgICAgIC8vIG1vdmUgZWZmZWN0IHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbW92ZUVmZmVjdHMoaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KTsKKworICAgICAgICAvKiBDcmVhdGUgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworCisgICAgICAgIC8qIFJlbGVhc2UgYSBwYXRjaCAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisKKyAgICAgICAgLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywgaW50IGRlbGF5TXMpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKworICAgICAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoKTsKKworICAgICBwcml2YXRlOgorICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2UgKm1BdWRpb1BvbGljeVNlcnZpY2U7CisgICAgfTsKKworICAgIC8vIC0tLSBOb3RpZmljYXRpb24gQ2xpZW50IC0tLQorICAgIGNsYXNzIE5vdGlmaWNhdGlvbkNsaWVudCA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CisgICAgcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNsaWVudChjb25zdCBzcDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CisgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfk5vdGlmaWNhdGlvbkNsaWVudCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworCisgICAgICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKKyAgICAgICAgICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQoY29uc3QgTm90aWZpY2F0aW9uQ2xpZW50Jik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50JiBvcGVyYXRvciA9IChjb25zdCBOb3RpZmljYXRpb25DbGllbnQmKTsKKworICAgICAgICBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+ICAgICAgICBtU2VydmljZTsKKyAgICAgICAgY29uc3QgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKKyAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDsKKyAgICB9OworCisgICAgLy8gSW50ZXJuYWwgZHVtcCB1dGlsaXRpZXMuCisgICAgc3RhdHVzX3QgZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkKTsKKworCisgICAgbXV0YWJsZSBNdXRleCBtTG9jazsgICAgLy8gcHJldmVudHMgY29uY3VycmVudCBhY2Nlc3MgdG8gQXVkaW9Qb2xpY3kgbWFuYWdlciBmdW5jdGlvbnMgY2hhbmdpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2UgY29ubmVjdGlvbiBzdGF0ZSAgb3Igcm91dGluZworICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbUF1ZGlvQ29tbWFuZFRocmVhZDsgICAgIC8vIGF1ZGlvIGNvbW1hbmRzIHRocmVhZAorICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbVRvbmVQbGF5YmFja1RocmVhZDsgICAgIC8vIHRvbmUgcGxheWJhY2sgdGhyZWFkCisgICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtT3V0cHV0Q29tbWFuZFRocmVhZDsgICAgLy8gcHJvY2VzcyBzdG9wIGFuZCByZWxlYXNlIG91dHB1dAorICAgIHN0cnVjdCBhdWRpb19wb2xpY3lfZGV2aWNlICptcEF1ZGlvUG9saWN5RGV2OworICAgIHN0cnVjdCBhdWRpb19wb2xpY3kgKm1wQXVkaW9Qb2xpY3k7CisgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgKm1BdWRpb1BvbGljeU1hbmFnZXI7CisgICAgQXVkaW9Qb2xpY3lDbGllbnQgKm1BdWRpb1BvbGljeUNsaWVudDsKKworICAgIERlZmF1bHRLZXllZFZlY3RvcjwgdWlkX3QsIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gPiAgICBtTm90aWZpY2F0aW9uQ2xpZW50czsKKworICAgIC8vIE1hbmFnZSBhbGwgZWZmZWN0cyBjb25maWd1cmVkIGluIGF1ZGlvX2VmZmVjdHMuY29uZgorICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBhdWRpb19tb2RlX3QgbVBob25lU3RhdGU7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9BVURJT1BPTElDWVNFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvYXVkaW9fcG9saWN5LmNvbmYgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3kuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjgzZmVmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvYXVkaW9fcG9saWN5LmNvbmYKQEAgLTAsMCArMSwxNDUgQEAKKyMKKyMgVGVtcGxhdGUgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQorIworCisjIEdsb2JhbCBjb25maWd1cmF0aW9uIHNlY3Rpb246CisjIC0gYmVmb3JlIGF1ZGlvIEhBTCB2ZXJzaW9uIDMuMDoKKyMgICBsaXN0cyBpbnB1dCBhbmQgb3V0cHV0IGRldmljZXMgYWx3YXlzIHByZXNlbnQgb24gdGhlIGRldmljZQorIyAgIGFzIHdlbGwgYXMgdGhlIG91dHB1dCBkZXZpY2Ugc2VsZWN0ZWQgYnkgZGVmYXVsdC4KKyMgICBEZXZpY2VzIGFyZSBkZXNpZ25hdGVkIGJ5IGEgc3RyaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGVudW0gaW4gYXVkaW8uaAorIworIyAgZ2xvYmFsX2NvbmZpZ3VyYXRpb24geworIyAgICBhdHRhY2hlZF9vdXRwdXRfZGV2aWNlcyBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIKKyMgICAgZGVmYXVsdF9vdXRwdXRfZGV2aWNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorIyAgICBhdHRhY2hlZF9pbnB1dF9kZXZpY2VzIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQ3xBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWAorIyAgfQorIworIyAtIGFmdGVyIGFuZCBpbmNsdWRpbmcgYXVkaW8gSEFMIDMuMCB0aGUgZ2xvYmFsX2NvbmZpZ3VyYXRpb24gc2VjdGlvbiBpcyBpbmNsdWRlZCBpbiBlYWNoCisjICAgaGFyZHdhcmUgbW9kdWxlIHNlY3Rpb24uCisjICAgaXQgYWxzbyBpbmNsdWRlcyB0aGUgYXVkaW8gSEFMIHZlcnNpb24gb2YgdGhpcyBodyBtb2R1bGU6CisjICBnbG9iYWxfY29uZmlndXJhdGlvbiB7CisjICAgIC4uLgorIyAgICAgYXVkaW9faGFsX3ZlcnNpb24gPG1ham9yLm1pbm9yPiAgIyBhdWRpbyBIQUwgdmVyc2lvbiBpbiBlLmcuIDMuMAorIyAgfQorIyAgIG90aGVyIGF0dHJpYnV0ZXMgKGF0dGFjaGVkIGRldmljZXMsIGRlZmF1bHQgZGV2aWNlKSBoYXZlIHRvIGJlIGluY2x1ZGVkIGluIHRoZQorIyAgIGdsb2JhbF9jb25maWd1cmF0aW9uIHNlY3Rpb24gb2YgZWFjaCBoYXJkd2FyZSBtb2R1bGUKKworCisjIGF1ZGlvIGhhcmR3YXJlIG1vZHVsZSBzZWN0aW9uOiBjb250YWlucyBkZXNjcmlwdG9ycyBmb3IgYWxsIGF1ZGlvIGh3IG1vZHVsZXMgcHJlc2VudCBvbiB0aGUKKyMgZGV2aWNlLiBFYWNoIGh3IG1vZHVsZSBub2RlIGlzIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGh3IG1vZHVsZSBsaWJyYXJ5IGJhc2UgbmFtZS4KKyMgRm9yIGluc3RhbmNlLCAicHJpbWFyeSIgY29ycmVzcG9uZHMgdG8gYXVkaW8ucHJpbWFyeS48ZGV2aWNlPi5zby4KKyMgVGhlICJwcmltYXJ5IiBtb2R1bGUgaXMgbWFuZGF0b3J5IGFuZCBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lIG91dHB1dCB3aXRoCisjIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkgZmxhZy4KKyMgRWFjaCBtb2R1bGUgZGVzY3JpcHRvciBjb250YWlucyBvbmUgb3IgbW9yZSBvdXRwdXQgcHJvZmlsZSBkZXNjcmlwdG9ycyBhbmQgemVybyBvciBtb3JlCisjIGlucHV0IHByb2ZpbGUgZGVzY3JpcHRvcnMuIEVhY2ggcHJvZmlsZSBsaXN0cyBhbGwgdGhlIHBhcmFtZXRlcnMgc3VwcG9ydGVkIGJ5IGEgZ2l2ZW4gb3V0cHV0CisjIG9yIGlucHV0IHN0cmVhbSBjYXRlZ29yeS4KKyMgVGhlICJjaGFubmVsX21hc2tzIiwgImZvcm1hdHMiLCAiZGV2aWNlcyIgYW5kICJmbGFncyIgYXJlIHNwZWNpZmllZCB1c2luZyBzdHJpbmdzIGNvcnJlc3BvbmRpbmcKKyMgdG8gZW51bXMgaW4gYXVkaW8uaCBhbmQgYXVkaW9fcG9saWN5LmguIFRoZXkgYXJlIGNvbmNhdGVuYXRlZCBieSB1c2Ugb2YgInwiIHdpdGhvdXQgc3BhY2Ugb3IgIlxuIi4KKyMKKyMgRm9yIGF1ZGlvIEhBTCB2ZXJzaW9uIHBvc3RlcmlvciB0byAzLjAgdGhlIGZvbGxvd2luZyBzZWN0aW9ucyBvciBzdWIgc2VjdGlvbnMgY2FuIGJlIHByZXNlbnQgaW4KKyMgYSBodyBtb2R1bGUgc2VjdGlvbjoKKyMgLSBBICJnbG9iYWxfY29uZmlndXJhdGlvbiIgc2VjdGlvbjogc2VlIGFib3ZlCisjIC0gT3B0aW9uYWxseSBhICJkZXZpY2VzIiBzZWN0aW9uOgorIyAgIFRoaXMgc2VjdGlvbiBjb250YWlucyBkZXNjcmlwdG9ycyBmb3IgYXVkaW8gZGV2aWNlcyB3aXRoIGF0dHJpYnV0ZXMgbGlrZSBhbiBhZGRyZXNzIG9yIGEKKyMgICBnYWluIGNvbnRyb2xsZXIuIFRoZSBzeW50YXggZm9yIHRoZSBkZXZpY2VzIHNlY3Rpb24gYW5kIGRldmljZSBkZXNjcmlwdG9yIGlzIGFzIGZvbGxvd3M6CisjICAgIGRldmljZXMgeworIyAgICAgIDxkZXZpY2UgbmFtZT4geyAgICAgICAgICAgICAgIyA8ZGV2aWNlIG5hbWU+OiBhbnkgc3RyaW5nIHdpdGhvdXQgc3BhY2UKKyMgICAgICAgIHR5cGUgPGRldmljZSB0eXBlPiAgICAgICAgICMgPGRldmljZSB0eXBlPiBlLmcuIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorIyAgICAgICAgYWRkcmVzcyA8YWRkcmVzcz4gICAgICAgICAgIyBvcHRpb25hbDogZGV2aWNlIGFkZHJlc3MsIGNoYXIgc3RyaW5nIGxlc3MgdGhhbiA2NCBpbiBsZW5ndGgKKyMgICAgICB9CisjICAgIH0KKyMgLSBvbmUgb3IgbW9yZSAiZ2FpbnMiIHNlY3Rpb25zIGNhbiBiZSBwcmVzZW50IGluIGEgZGV2aWNlIGRlc2NyaXB0b3Igc2VjdGlvbi4KKyMgICBJZiBwcmVzZW50LCB0aGV5IGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgZ2FpbiBjb250cm9sbGVycyBhdHRhY2hlZCB0byB0aGlzIGlucHV0IG9yCisjICAgb3V0cHV0IGRldmljZS4gZS5nLiA6CisjICAgPGRldmljZSBuYW1lPiB7ICAgICAgICAgICAgICAgICAgIyA8ZGV2aWNlIG5hbWU+OiBhbnkgc3RyaW5nIHdpdGhvdXQgc3BhY2UKKyMgICAgIHR5cGUgPGRldmljZSB0eXBlPiAgICAgICAgICAgICAjIDxkZXZpY2UgdHlwZT4gZS5nLiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIKKyMgICAgIGFkZHJlc3MgPGFkZHJlc3M+ICAgICAgICAgICAgICAjIG9wdGlvbmFsOiBkZXZpY2UgYWRkcmVzcywgY2hhciBzdHJpbmcgbGVzcyB0aGFuIDY0IGluIGxlbmd0aAorIyAgICAgZ2FpbnMgeworIyAgICAgICA8Z2FpbiBuYW1lPiB7CisjICAgICAgICAgbW9kZSA8Z2FpbiBtb2RlcyBzdXBwb3J0ZWQ+ICAgICAgICAgICAgICAjIGUuZy4gQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTCisjICAgICAgICAgY2hhbm5lbF9tYXNrIDxjb250cm9sbGVkIGNoYW5uZWxzPiAgICAgICAjIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUworIyAgICAgICAgIG1pbl92YWx1ZV9tQiA8bWluIHZhbHVlIGluIG1pbGxpYmVsPgorIyAgICAgICAgIG1heF92YWx1ZV9tQiA8bWF4IHZhbHVlIGluIG1pbGxpYmVsPgorIyAgICAgICAgIGRlZmF1bHRfdmFsdWVfbUIgPGRlZmF1bHQgdmFsdWUgaW4gbWlsbGliZWw+CisjICAgICAgICAgc3RlcF92YWx1ZV9tQiA8c3RlcCB2YWx1ZSBpbiBtaWxsaWJlbD4KKyMgICAgICAgICBtaW5fcmFtcF9tcyA8bWluIGR1cmF0aW9uIGluIG1zPiAgICAgICAgICMgbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAKKyMgICAgICAgICBtYXhfcmFtcF9tcyA8bWF4IGR1cmF0aW9uIG1zPiAgICAgICAgICAgICMgbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAKKyMgICAgICAgfQorIyAgICAgfQorIyAgIH0KKyMgLSB3aGVuIGEgZGV2aWNlIGRlc2NyaXB0b3IgaXMgcHJlc2VudCwgb3V0cHV0IGFuZCBpbnB1dCBwcm9maWxlcyBjYW4gcmVmZXIgdG8gdGhpcyBkZXZpY2UgYnkKKyMgaXRzIG5hbWUgaW4gdGhlaXIgImRldmljZXMiIHNlY3Rpb24gaW5zdGVhZCBvZiBzcGVjaWZ5aW5nIGEgZGV2aWNlIHR5cGUuIGUuZy4gOgorIyAgIG91dHB1dHMgeworIyAgICAgcHJpbWFyeSB7CisjICAgICAgIHNhbXBsaW5nX3JhdGVzIDQ0MTAwCisjICAgICAgIGNoYW5uZWxfbWFza3MgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCisjICAgICAgIGZvcm1hdHMgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyMgICAgICAgZGV2aWNlcyA8ZGV2aWNlIG5hbWU+CisjICAgICAgIGZsYWdzIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkKKyMgICAgIH0KKyMgICB9CisjIHNhbXBsZSBhdWRpb19wb2xpY3kuY29uZiBmaWxlIGJlbG93CisKK2F1ZGlvX2h3X21vZHVsZXMgeworICBwcmltYXJ5IHsKKyAgICBnbG9iYWxfY29uZmlndXJhdGlvbiB7CisgICAgICBhdHRhY2hlZF9vdXRwdXRfZGV2aWNlcyBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIKKyAgICAgIGRlZmF1bHRfb3V0cHV0X2RldmljZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIKKyAgICAgIGF0dGFjaGVkX2lucHV0X2RldmljZXMgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDCisgICAgICBhdWRpb19oYWxfdmVyc2lvbiAzLjAKKyAgICB9CisgICAgZGV2aWNlcyB7CisgICAgICBzcGVha2VyIHsKKyAgICAgICAgdHlwZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIKKyAgICAgICAgZ2FpbnMgeworICAgICAgICAgIGdhaW5fMSB7CisgICAgICAgICAgICBtb2RlIEFVRElPX0dBSU5fTU9ERV9KT0lOVAorICAgICAgICAgICAgbWluX3ZhbHVlX21CIC04NDAwCisgICAgICAgICAgICBtYXhfdmFsdWVfbUIgNDAwMAorICAgICAgICAgICAgZGVmYXVsdF92YWx1ZV9tQiAwCisgICAgICAgICAgICBzdGVwX3ZhbHVlX21CIDEwMAorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBvdXRwdXRzIHsKKyAgICAgIHByaW1hcnkgeworICAgICAgICBzYW1wbGluZ19yYXRlcyA0ODAwMAorICAgICAgICBjaGFubmVsX21hc2tzIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTworICAgICAgICBmb3JtYXRzIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgIGRldmljZXMgc3BlYWtlcgorICAgICAgICBmbGFncyBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZCisgICAgICB9CisgICAgfQorICAgIGlucHV0cyB7CisgICAgICBwcmltYXJ5IHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZXMgODAwMHwxNjAwMAorICAgICAgICBjaGFubmVsX21hc2tzIEFVRElPX0NIQU5ORUxfSU5fTU9OTworICAgICAgICBmb3JtYXRzIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgIGRldmljZXMgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDCisgICAgICB9CisgICAgfQorICB9CisgIHJfc3VibWl4IHsKKyAgICBnbG9iYWxfY29uZmlndXJhdGlvbiB7CisgICAgICBhdHRhY2hlZF9pbnB1dF9kZXZpY2VzIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYCisgICAgICBhdWRpb19oYWxfdmVyc2lvbiAyLjAKKyAgICB9CisgICAgb3V0cHV0cyB7CisgICAgICBzdWJtaXggeworICAgICAgICBzYW1wbGluZ19yYXRlcyA0ODAwMAorICAgICAgICBjaGFubmVsX21hc2tzIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTworICAgICAgICBmb3JtYXRzIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgIGRldmljZXMgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisgICAgICB9CisgICAgfQorICAgIGlucHV0cyB7CisgICAgICBzdWJtaXggeworICAgICAgICBzYW1wbGluZ19yYXRlcyA0ODAwMAorICAgICAgICBjaGFubmVsX21hc2tzIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPCisgICAgICAgIGZvcm1hdHMgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAgICAgZGV2aWNlcyBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWAorICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvYXVkaW9fcG9saWN5X2NvbmYuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeV9jb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzNWE2NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeV9jb25mLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1BPTElDWV9DT05GX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19QT0xJQ1lfQ09ORl9ICisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBEZWZpbml0aW9ucyBmb3IgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSAoYXVkaW9fcG9saWN5LmNvbmYpCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01BWF9MRU4gMzIKKworI2RlZmluZSBBVURJT19QT0xJQ1lfQ09ORklHX0ZJTEUgIi9zeXN0ZW0vZXRjL2F1ZGlvX3BvbGljeS5jb25mIgorI2RlZmluZSBBVURJT19QT0xJQ1lfVkVORE9SX0NPTkZJR19GSUxFICIvdmVuZG9yL2V0Yy9hdWRpb19wb2xpY3kuY29uZiIKKworLy8gZ2xvYmFsIGNvbmZpZ3VyYXRpb24KKyNkZWZpbmUgR0xPQkFMX0NPTkZJR19UQUcgImdsb2JhbF9jb25maWd1cmF0aW9uIgorCisjZGVmaW5lIEFUVEFDSEVEX09VVFBVVF9ERVZJQ0VTX1RBRyAiYXR0YWNoZWRfb3V0cHV0X2RldmljZXMiCisjZGVmaW5lIERFRkFVTFRfT1VUUFVUX0RFVklDRV9UQUcgImRlZmF1bHRfb3V0cHV0X2RldmljZSIKKyNkZWZpbmUgQVRUQUNIRURfSU5QVVRfREVWSUNFU19UQUcgImF0dGFjaGVkX2lucHV0X2RldmljZXMiCisjZGVmaW5lIFNQRUFLRVJfRFJDX0VOQUJMRURfVEFHICJzcGVha2VyX2RyY19lbmFibGVkIgorI2RlZmluZSBBVURJT19IQUxfVkVSU0lPTl9UQUcgImF1ZGlvX2hhbF92ZXJzaW9uIgorCisvLyBodyBtb2R1bGVzIGRlc2NyaXB0aW9ucworI2RlZmluZSBBVURJT19IV19NT0RVTEVfVEFHICJhdWRpb19od19tb2R1bGVzIgorCisjZGVmaW5lIE9VVFBVVFNfVEFHICJvdXRwdXRzIgorI2RlZmluZSBJTlBVVFNfVEFHICJpbnB1dHMiCisKKyNkZWZpbmUgU0FNUExJTkdfUkFURVNfVEFHICJzYW1wbGluZ19yYXRlcyIKKyNkZWZpbmUgRk9STUFUU19UQUcgImZvcm1hdHMiCisjZGVmaW5lIENIQU5ORUxTX1RBRyAiY2hhbm5lbF9tYXNrcyIKKyNkZWZpbmUgREVWSUNFU19UQUcgImRldmljZXMiCisjZGVmaW5lIEZMQUdTX1RBRyAiZmxhZ3MiCisKKyNkZWZpbmUgRFlOQU1JQ19WQUxVRV9UQUcgImR5bmFtaWMiIC8vIHNwZWNpYWwgdmFsdWUgZm9yICJjaGFubmVsX21hc2tzIiwgInNhbXBsaW5nX3JhdGVzIiBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJmb3JtYXRzIiBpbiBvdXRwdXRzIGRlc2NyaXB0b3JzIGluZGljYXRpbmcgdGhhdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBzaG91bGQgYmUgcXVlcmllZCBhZnRlciBvcGVuaW5nIHRoZSBvdXRwdXQuCisKKyNkZWZpbmUgREVWSUNFU19UQUcgImRldmljZXMiCisjZGVmaW5lIERFVklDRV9UWVBFICJ0eXBlIgorI2RlZmluZSBERVZJQ0VfQUREUkVTUyAiYWRkcmVzcyIKKworI2RlZmluZSBNSVhFUlNfVEFHICJtaXhlcnMiCisjZGVmaW5lIE1JWEVSX1RZUEUgInR5cGUiCisjZGVmaW5lIE1JWEVSX1RZUEVfTVVYICJtdXgiCisjZGVmaW5lIE1JWEVSX1RZUEVfTUlYICJtaXgiCisKKyNkZWZpbmUgR0FJTlNfVEFHICJnYWlucyIKKyNkZWZpbmUgR0FJTl9NT0RFICJtb2RlIgorI2RlZmluZSBHQUlOX0NIQU5ORUxTICJjaGFubmVsX21hc2siCisjZGVmaW5lIEdBSU5fTUlOX1ZBTFVFICJtaW5fdmFsdWVfbUIiCisjZGVmaW5lIEdBSU5fTUFYX1ZBTFVFICJtYXhfdmFsdWVfbUIiCisjZGVmaW5lIEdBSU5fREVGQVVMVF9WQUxVRSAiZGVmYXVsdF92YWx1ZV9tQiIKKyNkZWZpbmUgR0FJTl9TVEVQX1ZBTFVFICJzdGVwX3ZhbHVlX21CIgorI2RlZmluZSBHQUlOX01JTl9SQU1QX01TICJtaW5fcmFtcF9tcyIKKyNkZWZpbmUgR0FJTl9NQVhfUkFNUF9NUyAibWF4X3JhbXBfbXMiCisKKworCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fUE9MSUNZX0NPTkZfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggNTFiYTY5OC4uZTE4NGQ5NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCkBAIC0xLDMgKzEsMTcgQEAKKyMgQ29weXJpZ2h0IDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKwogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKICMKQEAgLTIwLDYgKzM0LDcgQEAKICAgICBhcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAgXAogICAgIGFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAgXAogICAgIGFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwIFwKKyAgICBhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmNwcCBcCiAgICAgYXBpMS9jbGllbnQyL0J1cnN0Q2FwdHVyZS5jcHAgXAogICAgIGFwaTEvY2xpZW50Mi9KcGVnQ29tcHJlc3Nvci5jcHAgXAogICAgIGFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCBcCkBAIC0zMyw2ICs0OCw3IEBACiAgICAgZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIFwKICAgICBkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIFwKICAgICBkZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uY3BwIFwKKyAgICBkZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAgXAogICAgIGRldmljZTMvU3RhdHVzVHJhY2tlci5jcHAgXAogICAgIGd1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwIFwKICAgICB1dGlscy9DYW1lcmFUcmFjZXMuY3BwIFwKQEAgLTUzLDYgKzY5LDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKKyAgICBzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCiAgICAgZXh0ZXJuYWwvanBlZwogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYURldmljZUZhY3RvcnkuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRGV2aWNlRmFjdG9yeS5jcHAKaW5kZXggN2ZkZjMwNC4uYmZlZjUwZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRGV2aWNlRmFjdG9yeS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRGV2aWNlRmFjdG9yeS5jcHAKQEAgLTQ2LDYgKzQ2LDggQEAKICAgICAgICAgICAgIGRldmljZSA9IG5ldyBDYW1lcmEyRGV2aWNlKGNhbWVyYUlkKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgICAgZGV2aWNlID0gbmV3IENhbWVyYTNEZXZpY2UoY2FtZXJhSWQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IDA2YzE2MjYuLmZkNWE0MjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC0xLDI0ICsxLDI0IEBACiAvKgotKioKLSoqIENvcHlyaWdodCAoQykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiAKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU2VydmljZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCkBAIC0zMiwxMCArMzIsMTUgQEAKICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX21ldGFkYXRhLmg+CisjaW5jbHVkZSA8c3lzdGVtL2NhbWVyYS5oPgogCiAjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgogI2luY2x1ZGUgImFwaTEvQ2FtZXJhQ2xpZW50LmgiCkBAIC0xMzAsNiArMTM1LDEyIEBACiAgICAgICAgICAgICBtTW9kdWxlLT5zZXRfY2FsbGJhY2tzKHRoaXMpOwogICAgICAgICB9CiAKKyAgICAgICAgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisKKyAgICAgICAgaWYgKG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPj0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzIpIHsKKyAgICAgICAgICAgIHNldFVwVmVuZG9yVGFncygpOworICAgICAgICB9CisKICAgICAgICAgQ2FtZXJhRGV2aWNlRmFjdG9yeTo6cmVnaXN0ZXJTZXJ2aWNlKHRoaXMpOwogICAgIH0KIH0KQEAgLTE0MSw2ICsxNTIsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CiAgICAgZ0NhbWVyYVNlcnZpY2UgPSBOVUxMOwogfQogCkBAIC0xNjgsNiArMTgwLDkgQEAKICAgICAgICAgewogICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVNlcnZpY2VMb2NrKTsKIAorICAgICAgICAgICAvKiBSZW1vdmUgY2FjaGVkIHBhcmFtZXRlcnMgZnJvbSBzaGltIGNhY2hlICovCisgICAgICAgICAgIG1TaGltUGFyYW1zLnJlbW92ZUl0ZW0oY2FtZXJhSWQpOworCiAgICAgICAgICAgIC8qIEZpbmQgYWxsIGNsaWVudHMgdGhhdCB3ZSBuZWVkIHRvIGRpc2Nvbm5lY3QgKi8KICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudCA9IG1DbGllbnRbY2FtZXJhSWRdLnByb21vdGUoKTsKICAgICAgICAgICAgaWYgKGNsaWVudC5nZXQoKSAhPSBOVUxMKSB7CkBAIC0xOTYsNyArMjExLDcgQEAKICAgICAgICAgICAgICAqLwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoIiVzOiBBZnRlciB1bnBsdWcsIGRpc2Nvbm5lY3RlZCAlZCBjbGllbnRzIiwKKyAgICAgICAgQUxPR1YoIiVzOiBBZnRlciB1bnBsdWcsIGRpc2Nvbm5lY3RlZCAlenUgY2xpZW50cyIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2xpZW50c1RvRGlzY29ubmVjdC5zaXplKCkpOwogICAgIH0KIApAQCAtMjIwLDEyICsyMzUsOTkgQEAKICAgICB9CiAKICAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mbzsKLSAgICBzdGF0dXNfdCByYyA9IG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pOworICAgIHN0YXR1c190IHJjID0gZmlsdGVyR2V0SW5mb0Vycm9yQ29kZSgKKyAgICAgICAgbU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYUlkLCAmaW5mbykpOwogICAgIGNhbWVyYUluZm8tPmZhY2luZyA9IGluZm8uZmFjaW5nOwogICAgIGNhbWVyYUluZm8tPm9yaWVudGF0aW9uID0gaW5mby5vcmllbnRhdGlvbjsKICAgICByZXR1cm4gcmM7CiB9CiAKKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2VuZXJhdGVTaGltTWV0YWRhdGEoaW50IGNhbWVyYUlkLCAvKm91dCovQ2FtZXJhTWV0YWRhdGEqIGNhbWVyYUluZm8pIHsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBzdHJ1Y3QgQ2FtZXJhSW5mbyBpbmZvOworICAgIGlmICgocmV0ID0gZ2V0Q2FtZXJhSW5mbyhjYW1lcmFJZCwgJmluZm8pKSAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIENhbWVyYU1ldGFkYXRhIHNoaW1JbmZvOworICAgIGludDMyX3Qgb3JpZW50YXRpb24gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihpbmZvLm9yaWVudGF0aW9uKTsKKyAgICBpZiAoKHJldCA9IHNoaW1JbmZvLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9PUklFTlRBVElPTiwgJm9yaWVudGF0aW9uLCAxKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICB1aW50OF90IGZhY2luZyA9IChpbmZvLmZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0ZST05UKSA/CisgICAgICAgICAgICBBTkRST0lEX0xFTlNfRkFDSU5HX0ZST05UIDogQU5EUk9JRF9MRU5TX0ZBQ0lOR19CQUNLOworICAgIGlmICgocmV0ID0gc2hpbUluZm8udXBkYXRlKEFORFJPSURfTEVOU19GQUNJTkcsICZmYWNpbmcsIDEpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIENhbWVyYVBhcmFtZXRlcnMgc2hpbVBhcmFtczsKKyAgICBpZiAoKHJldCA9IGdldExlZ2FjeVBhcmFtZXRlcnNMYXp5KGNhbWVyYUlkLCAvKm91dCovJnNoaW1QYXJhbXMpKSAhPSBPSykgeworICAgICAgICAvLyBFcnJvciBsb2dnZWQgYnkgY2FsbGVlCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgVmVjdG9yPFNpemU+IHNpemVzOworICAgIFZlY3RvcjxTaXplPiBqcGVnU2l6ZXM7CisgICAgVmVjdG9yPGludDMyX3Q+IGZvcm1hdHM7CisgICAgY29uc3QgY2hhciogc3VwcG9ydGVkUHJldmlld0Zvcm1hdHM7CisgICAgeworICAgICAgICBzaGltUGFyYW1zLmdldFN1cHBvcnRlZFByZXZpZXdTaXplcygvKm91dCovc2l6ZXMpOworICAgICAgICBzaGltUGFyYW1zLmdldFN1cHBvcnRlZFByZXZpZXdGb3JtYXRzKC8qb3V0Ki9mb3JtYXRzKTsKKyAgICAgICAgc2hpbVBhcmFtcy5nZXRTdXBwb3J0ZWRQaWN0dXJlU2l6ZXMoLypvdXQqL2pwZWdTaXplcyk7CisgICAgfQorCisgICAgLy8gQWx3YXlzIGluY2x1ZGUgSU1QTEVNRU5UQVRJT05fREVGSU5FRAorICAgIGZvcm1hdHMuYWRkKEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7CisKKyAgICBjb25zdCBzaXplX3QgSU5UU19QRVJfQ09ORklHID0gNDsKKworICAgIC8vIEJ1aWxkIGF2YWlsYWJsZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgbWV0YWRhdGEKKyAgICBzaXplX3Qgc3RyZWFtQ29uZmlnU2l6ZSA9IChzaXplcy5zaXplKCkgKiBmb3JtYXRzLnNpemUoKSArIGpwZWdTaXplcy5zaXplKCkpICogSU5UU19QRVJfQ09ORklHOworCisgICAgVmVjdG9yPGludDMyX3Q+IHN0cmVhbUNvbmZpZ3M7CisgICAgc3RyZWFtQ29uZmlncy5zZXRDYXBhY2l0eShzdHJlYW1Db25maWdTaXplKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7ICsraSkgeworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVzLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICBzdHJlYW1Db25maWdzLmFkZChmb3JtYXRzW2ldKTsKKyAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3MuYWRkKHNpemVzW2pdLndpZHRoKTsKKyAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3MuYWRkKHNpemVzW2pdLmhlaWdodCk7CisgICAgICAgICAgICBzdHJlYW1Db25maWdzLmFkZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGpwZWdTaXplcy5zaXplKCk7ICsraSkgeworICAgICAgICBzdHJlYW1Db25maWdzLmFkZChIQUxfUElYRUxfRk9STUFUX0JMT0IpOworICAgICAgICBzdHJlYW1Db25maWdzLmFkZChqcGVnU2l6ZXNbaV0ud2lkdGgpOworICAgICAgICBzdHJlYW1Db25maWdzLmFkZChqcGVnU2l6ZXNbaV0uaGVpZ2h0KTsKKyAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpOworICAgIH0KKworICAgIGlmICgocmV0ID0gc2hpbUluZm8udXBkYXRlKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMsCisgICAgICAgICAgICBzdHJlYW1Db25maWdzLmFycmF5KCksIHN0cmVhbUNvbmZpZ1NpemUpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGludDY0X3QgZmFrZU1pbkZyYW1lc1swXTsKKyAgICAvLyBUT0RPOiBGaXhtZSwgZG9uJ3QgZmFrZSBtaW4gZnJhbWUgZHVyYXRpb25zLgorICAgIGlmICgocmV0ID0gc2hpbUluZm8udXBkYXRlKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TLAorICAgICAgICAgICAgZmFrZU1pbkZyYW1lcywgMCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaW50NjRfdCBmYWtlU3RhbGxzWzBdOworICAgIC8vIFRPRE86IEZpeG1lLCBkb24ndCBmYWtlIHN0YWxsIGR1cmF0aW9ucy4KKyAgICBpZiAoKHJldCA9IHNoaW1JbmZvLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TLAorICAgICAgICAgICAgZmFrZVN0YWxscywgMCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgKmNhbWVyYUluZm8gPSBzaGltSW5mbzsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhpbnQgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2FtZXJhSW5mbykgewogICAgIGlmICghY2FtZXJhSW5mbykgewpAQCAtMjM4LDM3ICszNDAsNTEgQEAKICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICAgfQogCi0gICAgaWYgKG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPCBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMCkgewotICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBjaGVjayBvbmNlIEhBTDEgc2hpbSBpcyBpbiBwbGFjZS4KLSAgICAgICAgQUxPR0UoIiVzOiBPbmx5IEhBTCBtb2R1bGUgdmVyc2lvbiBWMiBvciBoaWdoZXIgc3VwcG9ydHMgc3RhdGljIG1ldGFkYXRhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KICAgICBpZiAoY2FtZXJhSWQgPCAwIHx8IGNhbWVyYUlkID49IG1OdW1iZXJPZkNhbWVyYXMpIHsKICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBpZDogJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBpbnQgZmFjaW5nOwotICAgIGlmIChnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKSA9PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCkgewotICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBjaGVjayBvbmNlIEhBTDEgc2hpbSBpcyBpbiBwbGFjZS4KLSAgICAgICAgQUxPR0UoIiVzOiBIQUwxIGRvZXNuJ3Qgc3VwcG9ydCBzdGF0aWMgbWV0YWRhdGEgeWV0IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgaWYgKG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPCBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMCB8fAorICAgICAgICAgICAgZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZykgPD0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzEgKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBvbGQgSEFMczoKKyAgICAgICAgICogLSBDb252ZXJ0IENhbWVyYUluZm8gaW50byBzdGF0aWMgQ2FtZXJhTWV0YWRhdGEgcHJvcGVydGllcy4KKyAgICAgICAgICogLSBSZXRyaWV2ZSBjYWNoZWQgQ2FtZXJhUGFyYW1ldGVycyBmb3IgdGhpcyBjYW1lcmEuICBJZiBub25lIGV4aXN0LAorICAgICAgICAgKiAgIGF0dGVtcHQgdG8gb3BlbiBDYW1lcmFDbGllbnQgYW5kIHJldHJpZXZlIHRoZSBDYW1lcmFQYXJhbWV0ZXJzLgorICAgICAgICAgKiAtIENvbnZlcnQgY2FjaGVkIENhbWVyYVBhcmFtZXRlcnMgaW50byBzdGF0aWMgQ2FtZXJhTWV0YWRhdGEKKyAgICAgICAgICogICBwcm9wZXJ0aWVzLgorICAgICAgICAgKi8KKyAgICAgICAgQUxPR0koIiVzOiBTd2l0Y2hpbmcgdG8gSEFMMSBzaGltIGltcGxlbWVudGF0aW9uLi4uIiwgX19GVU5DVElPTl9fKTsKIAotICAgIGlmIChnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKSA8PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMSkgewotICAgICAgICAvLyBEaXNhYmxlIEhBTDIueCBzdXBwb3J0IGZvciBjYW1lcmEyIEFQSSBmb3Igbm93LgotICAgICAgICBBTE9HVygiJXM6IEhBTDIueCBkb2Vzbid0IHN1cHBvcnQgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGZvciBub3ciLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBnZW5lcmF0ZVNoaW1NZXRhZGF0YShjYW1lcmFJZCwgY2FtZXJhSW5mbykpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAKLSAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mbzsKLSAgICBzdGF0dXNfdCByZXQgPSBtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKTsKLSAgICAqY2FtZXJhSW5mbyA9IGluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5vcm1hbCBIQUwgMi4xKyBjb2RlcGF0aC4KKyAgICAgICAgICovCisgICAgICAgIHN0cnVjdCBjYW1lcmFfaW5mbyBpbmZvOworICAgICAgICByZXQgPSBmaWx0ZXJHZXRJbmZvRXJyb3JDb2RlKG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pKTsKKyAgICAgICAgKmNhbWVyYUluZm8gPSBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOworICAgIH0KIAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmdldENhbWVyYVZlbmRvclRhZ0Rlc2NyaXB0b3IoLypvdXQqL3NwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjKSB7CisgICAgaWYgKCFtTW9kdWxlKSB7CisgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIGhhcmR3YXJlIG1vZHVsZSBkb2Vzbid0IGV4aXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgZGVzYyA9IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIGludCBDYW1lcmFTZXJ2aWNlOjpnZXREZXZpY2VWZXJzaW9uKGludCBjYW1lcmFJZCwgaW50KiBmYWNpbmcpIHsKICAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mbzsKICAgICBpZiAobU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYUlkLCAmaW5mbykgIT0gT0spIHsKQEAgLTI4OSwyMSArNDA1LDE2MiBAQAogICAgIHJldHVybiBkZXZpY2VWZXJzaW9uOwogfQogCi1ib29sIENhbWVyYVNlcnZpY2U6OmlzVmFsaWRDYW1lcmFJZChpbnQgY2FtZXJhSWQpIHsKLSAgICBpbnQgZmFjaW5nOwotICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZyk7CitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJPcGVuRXJyb3JDb2RlKHN0YXR1c190IGVycikgeworICAgIHN3aXRjaChlcnIpIHsKKyAgICAgICAgY2FzZSBOT19FUlJPUjoKKyAgICAgICAgY2FzZSAtRUJVU1k6CisgICAgICAgIGNhc2UgLUVJTlZBTDoKKyAgICAgICAgY2FzZSAtRVVTRVJTOgorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gLUVOT0RFVjsKK30KIAotICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7Ci0gICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgotICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKLSAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzE6Ci0gICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGRlZmF1bHQ6CitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJHZXRJbmZvRXJyb3JDb2RlKHN0YXR1c190IGVycikgeworICAgIHN3aXRjaChlcnIpIHsKKyAgICAgICAgY2FzZSBOT19FUlJPUjoKKyAgICAgICAgY2FzZSAtRUlOVkFMOgorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gLUVOT0RFVjsKK30KKworYm9vbCBDYW1lcmFTZXJ2aWNlOjpzZXRVcFZlbmRvclRhZ3MoKSB7CisgICAgdmVuZG9yX3RhZ19vcHNfdCB2T3BzID0gdmVuZG9yX3RhZ19vcHNfdCgpOworCisgICAgLy8gQ2hlY2sgaWYgdmVuZG9yIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIGltcGxlbWVudGVkCisgICAgaWYgKG1Nb2R1bGUtPmdldF92ZW5kb3JfdGFnX29wcyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dJKCIlczogTm8gdmVuZG9yIHRhZ3MgZGVmaW5lZCBmb3IgdGhpcyBkZXZpY2UuIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICBBVFJBQ0VfQkVHSU4oImNhbWVyYTMtPmdldF9tZXRhZGF0YV92ZW5kb3JfdGFnX29wcyIpOworICAgIG1Nb2R1bGUtPmdldF92ZW5kb3JfdGFnX29wcygmdk9wcyk7CisgICAgQVRSQUNFX0VORCgpOworCisgICAgLy8gRW5zdXJlIGFsbCB2ZW5kb3Igb3BlcmF0aW9ucyBhcmUgcHJlc2VudAorICAgIGlmICh2T3BzLmdldF90YWdfY291bnQgPT0gTlVMTCB8fCB2T3BzLmdldF9hbGxfdGFncyA9PSBOVUxMIHx8CisgICAgICAgICAgICB2T3BzLmdldF9zZWN0aW9uX25hbWUgPT0gTlVMTCB8fCB2T3BzLmdldF90YWdfbmFtZSA9PSBOVUxMIHx8CisgICAgICAgICAgICB2T3BzLmdldF90YWdfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBvcGVyYXRpb25zIG5vdCBmdWxseSBkZWZpbmVkLiBJZ25vcmluZyBkZWZpbml0aW9ucy4iCisgICAgICAgICAgICAgICAsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGFsbCB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIGludG8gYSBkZXNjcmlwdG9yCisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYzsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKChyZXMgPSBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcygmdk9wcywgLypvdXQqL2Rlc2MpKQorICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgZ2VuZXJhdGUgZGVzY3JpcHRvciBmcm9tIHZlbmRvciB0YWcgb3BlcmF0aW9ucywiCisgICAgICAgICAgICAgICJyZWNlaXZlZCBlcnJvciAlcyAoJWQpLiBDYW1lcmEgY2xpZW50cyB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSIKKyAgICAgICAgICAgICAgInZlbmRvciB0YWdzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihyZXMpLCByZXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBnbG9iYWwgZGVzY3JpcHRvciB0byB1c2Ugd2l0aCBjYW1lcmEgbWV0YWRhdGEKKyAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpzZXRBc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoZGVzYyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmluaXRpYWxpemVTaGltTWV0YWRhdGEoaW50IGNhbWVyYUlkKSB7CisgICAgaW50IHBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgdWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgIHN0YXR1c190IHJldCA9IHZhbGlkYXRlQ29ubmVjdChjYW1lcmFJZCwgdWlkKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGJvb2wgbmVlZHNOZXdDbGllbnQgPSBmYWxzZTsKKyAgICBzcDxDbGllbnQ+IGNsaWVudDsKKworICAgIFN0cmluZzE2IGludGVybmFsUGFja2FnZU5hbWUoIm1lZGlhIik7CisgICAgeyAgIC8vIFNjb3BlIGZvciBzZXJ2aWNlIGxvY2sKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgaWYgKG1DbGllbnRbY2FtZXJhSWRdICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNsaWVudCA9IHN0YXRpY19jYXN0PENsaWVudCo+KG1DbGllbnRbY2FtZXJhSWRdLnByb21vdGUoKS5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaWVudCA9PSBOVUxMKSB7CisgICAgICAgICAgICBuZWVkc05ld0NsaWVudCA9IHRydWU7CisgICAgICAgICAgICByZXQgPSBjb25uZWN0SGVscGVyTG9ja2VkKC8qb3V0Ki9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY2FtZXJhQ2xpZW50Ki9OVUxMLCAvLyBFbXB0eSBiaW5kZXIgY2FsbGJhY2tzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCk7CisKKyAgICAgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBFcnJvciBhbHJlYWR5IGxvZ2dlZCBieSBjYWxsZWUKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsaWVudCA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBjb25uZWN0IHRvIGNsaWVudCBjYW1lcmEgZGV2aWNlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nOCByYXdQYXJhbXMgPSBjbGllbnQtPmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMocmF3UGFyYW1zKTsKKyAgICAgICAgbVNoaW1QYXJhbXMuYWRkKGNhbWVyYUlkLCBwYXJhbXMpOworICAgIH0KKworICAgIC8vIENsb3NlIGNsaWVudCBpZiBvbmUgd2FzIG9wZW5lZCBzb2xlbHkgZm9yIHRoaXMgY2FsbAorICAgIGlmIChuZWVkc05ld0NsaWVudCkgeworICAgICAgICBjbGllbnQtPmRpc2Nvbm5lY3QoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRMZWdhY3lQYXJhbWV0ZXJzTGF6eShpbnQgY2FtZXJhSWQsCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyogcGFyYW1ldGVycykgeworCisgICAgQUxPR1YoIiVzOiBmb3IgY2FtZXJhSWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisKKyAgICBzdGF0dXNfdCByZXQgPSAwOworCisgICAgaWYgKHBhcmFtZXRlcnMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmFtZXRlcnMgbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3NpemVfdCBpbmRleCA9IC0xOworICAgIHsgICAvLyBTY29wZSBmb3Igc2VydmljZSBsb2NrCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIGluZGV4ID0gbVNoaW1QYXJhbXMuaW5kZXhPZktleShjYW1lcmFJZCk7CisgICAgICAgIC8vIFJlbGVhc2Ugc2VydmljZSBsb2NrIHNvIGluaXRpYWxpemVTaGltTWV0YWRhdGEgY2FuIGJlIGNhbGxlZCBjb3JyZWN0bHkuCisKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICpwYXJhbWV0ZXJzID0gbVNoaW1QYXJhbXNbaW5kZXhdOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgcmV0ID0gaW5pdGlhbGl6ZVNoaW1NZXRhZGF0YShjYW1lcmFJZCk7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAvLyBFcnJvciBhbHJlYWR5IGxvZ2dlZCBieSBjYWxsZWUKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICB7ICAgLy8gU2NvcGUgZm9yIHNlcnZpY2UgbG9jaworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgICAgIGluZGV4ID0gbVNoaW1QYXJhbXMuaW5kZXhPZktleShjYW1lcmFJZCk7CisKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiaW5kZXggc2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZCIpOworCisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IG1TaGltUGFyYW1zW2luZGV4XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6dmFsaWRhdGVDb25uZWN0KGludCBjYW1lcmFJZCwKQEAgLTQwMiw2ICs2NTksNzcgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y29ubmVjdEhlbHBlckxvY2tlZCgKKyAgICAgICAgLypvdXQqLworICAgICAgICBzcDxDbGllbnQ+JiBjbGllbnQsCisgICAgICAgIC8qaW4qLworICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAorICAgICAgICBpbnQgY2FtZXJhSWQsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgaW50IGNsaWVudFVpZCwKKyAgICAgICAgaW50IGNhbGxpbmdQaWQsCisgICAgICAgIGludCBoYWxWZXJzaW9uLAorICAgICAgICBib29sIGxlZ2FjeU1vZGUpIHsKKworICAgIGludCBmYWNpbmcgPSAtMTsKKyAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOworCisgICAgaWYgKGhhbFZlcnNpb24gPCAwIHx8IGhhbFZlcnNpb24gPT0gZGV2aWNlVmVyc2lvbikgeworICAgICAgICAvLyBEZWZhdWx0IHBhdGg6IEhBTCB2ZXJzaW9uIGlzIHVuc3BlY2lmaWVkIGJ5IGNhbGxlciwgY3JlYXRlIENhbWVyYUNsaWVudAorICAgICAgICAvLyBiYXNlZCBvbiBkZXZpY2UgdmVyc2lvbiByZXBvcnRlZCBieSB0aGUgSEFMLgorICAgICAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgeworICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6CisgICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksIGxlZ2FjeU1vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgorICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIGlkICVkIiwgY2FtZXJhSWQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVua25vd24gY2FtZXJhIGRldmljZSBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEEgcGFydGljdWxhciBIQUwgdmVyc2lvbiBpcyByZXF1ZXN0ZWQgYnkgY2FsbGVyLiBDcmVhdGUgQ2FtZXJhQ2xpZW50CisgICAgICAgIC8vIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgSEFMIHZlcnNpb24uCisgICAgICAgIGlmIChkZXZpY2VWZXJzaW9uID4gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzAgJiYKKyAgICAgICAgICAgIGhhbFZlcnNpb24gPT0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApIHsKKyAgICAgICAgICAgIC8vIE9ubHkgc3VwcG9ydCBoaWdoZXIgSEFMIHZlcnNpb24gZGV2aWNlIG9wZW5lZCBhcyBIQUwxLjAgZGV2aWNlLgorICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudCh0aGlzLCBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE90aGVyIGNvbWJpbmF0aW9ucyAoZS5nLiBIQUwzLnggb3BlbiBhcyBIQUwyLngpIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4KKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNhbWVyYSBIQUwgdmVyc2lvbiAleDogSEFMICV4IGRldmljZSBjYW4gb25seSBiZSIKKyAgICAgICAgICAgICAgICAgICAgIiBvcGVuZWQgYXMgSEFMICV4IGRldmljZSIsIGhhbFZlcnNpb24sIGRldmljZVZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RGaW5pc2hVbnNhZmUoY2xpZW50LCBjbGllbnQtPmdldFJlbW90ZSgpKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIC8vIHRoaXMgaXMgcHJvYmFibHkgbm90IHJlY292ZXJhYmxlLi4gbWF5YmUgdGhlIGNsaWVudCBjYW4gdHJ5IGFnYWluCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgbUNsaWVudFtjYW1lcmFJZF0gPSBjbGllbnQ7CisgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChpZCAlZCwgdGhpcyBwaWQgaXMgJWQpIiwgY2FtZXJhSWQsCisgICAgICAgICBnZXRwaWQoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmNvbm5lY3QoCiAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgIGludCBjYW1lcmFJZCwKQEAgLTQzNSw1MCArNzYzLDgxIEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgZmFjaW5nID0gLTE7Ci0gICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZyk7Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG90aGVyIG5vbi1leGNsdXNpdmUgdXNlcnMgb2YgdGhlIGNhbWVyYSwKLSAgICAgICAgLy8gIHRoaXMgd2lsbCB0ZWFyIHRoZW0gZG93biBiZWZvcmUgd2UgY2FuIHJldXNlIHRoZSBjYW1lcmEKLSAgICAgICAgaWYgKGlzVmFsaWRDYW1lcmFJZChjYW1lcmFJZCkpIHsKLSAgICAgICAgICAgIC8vIHRyYW5zaXRpb24gZnJvbSBQUkVTRU5UIC0+IE5PVF9BVkFJTEFCTEUKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6Ci0gICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6Ci0gICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FtZXJhMkNsaWVudCh0aGlzLCBjYW1lcmFDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2VWZXJzaW9uKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgaWQgJWQiLCBjYW1lcmFJZCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdEZpbmlzaFVuc2FmZShjbGllbnQsIGNsaWVudC0+Z2V0UmVtb3RlKCkpOworICAgICAgICBzdGF0dXMgPSBjb25uZWN0SGVscGVyTG9ja2VkKC8qb3V0Ki9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgLy8gdGhpcyBpcyBwcm9iYWJseSBub3QgcmVjb3ZlcmFibGUuLiBtYXliZSB0aGUgY2xpZW50IGNhbiB0cnkgYWdhaW4KLSAgICAgICAgICAgIC8vIE9LOiB3ZSBjYW4gb25seSBnZXQgaGVyZSBpZiB3ZSB3ZXJlIG9yaWdpbmFsbHkgaW4gUFJFU0VOVCBzdGF0ZQotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5ULCBjYW1lcmFJZCk7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAKLSAgICAgICAgbUNsaWVudFtjYW1lcmFJZF0gPSBjbGllbnQ7Ci0gICAgICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoaWQgJWQsIHRoaXMgcGlkIGlzICVkKSIsIGNhbWVyYUlkLAotICAgICAgICAgICAgIGdldHBpZCgpKTsKKyAgICB9CisgICAgLy8gaW1wb3J0YW50OiByZWxlYXNlIHRoZSBtdXRleCBoZXJlIHNvIHRoZSBjbGllbnQgY2FuIGNhbGwgYmFjaworICAgIC8vICAgIGludG8gdGhlIHNlcnZpY2UgZnJvbSBpdHMgZGVzdHJ1Y3RvciAoY2FuIGJlIGF0IHRoZSBlbmQgb2YgdGhlIGNhbGwpCisKKyAgICBkZXZpY2UgPSBjbGllbnQ7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0TGVnYWN5KAorICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAorICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgIGludCBjbGllbnRVaWQsCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgc3A8SUNhbWVyYT4mIGRldmljZSkgeworCisgICAgaWYgKGhhbFZlcnNpb24gIT0gQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCAmJgorICAgICAgICAgICAgbU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA8IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8zKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIEVpdGhlciB0aGUgSEFMIHZlcnNpb24gaXMgdW5zcGVjaWZpZWQgaW4gd2hpY2ggY2FzZSB0aGlzIGp1c3QgY3JlYXRlcworICAgICAgICAgKiBhIGNhbWVyYSBjbGllbnQgc2VsZWN0ZWQgYnkgdGhlIGxhdGVzdCBkZXZpY2UgdmVyc2lvbiwgb3IKKyAgICAgICAgICogaXQncyBhIHBhcnRpY3VsYXIgdmVyc2lvbiBpbiB3aGljaCBjYXNlIHRoZSBIQUwgbXVzdCBzdXBwb3J0ZWQKKyAgICAgICAgICogdGhlIG9wZW5fbGVnYWN5IGNhbGwKKyAgICAgICAgICovCisgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIEhBTCBtb2R1bGUgdmVyc2lvbiAleCBkb2Vzbid0IHN1cHBvcnQgY29ubmVjdGluZyB0byBsZWdhY3kgSEFMIGRldmljZXMhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgU3RyaW5nOCBjbGllbnROYW1lOChjbGllbnRQYWNrYWdlTmFtZSk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisKKyAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IGxlZ2FjeSBFIChwaWQgJWQgXCIlc1wiLCBpZCAlZCkiLCBjYWxsaW5nUGlkLAorICAgICAgICAgICAgY2xpZW50TmFtZTguc3RyaW5nKCksIGNhbWVyYUlkKTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IHZhbGlkYXRlQ29ubmVjdChjYW1lcmFJZCwgLyppbm91dCovY2xpZW50VWlkKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3A8Q2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50VG1wOworICAgICAgICBpZiAoIWNhbkNvbm5lY3RVbnNhZmUoY2FtZXJhSWQsIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhQ2xpZW50LT5hc0JpbmRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL2NsaWVudFRtcCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgIH0gZWxzZSBpZiAoY2xpZW50LmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRldmljZSA9IHN0YXRpY19jYXN0PENsaWVudCo+KGNsaWVudFRtcC5nZXQoKSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBjb25uZWN0SGVscGVyTG9ja2VkKC8qb3V0Ki9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsZWdhY3lNb2RlKi90cnVlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCiAgICAgfQogICAgIC8vIGltcG9ydGFudDogcmVsZWFzZSB0aGUgbXV0ZXggaGVyZSBzbyB0aGUgY2xpZW50IGNhbiBjYWxsIGJhY2sKICAgICAvLyAgICBpbnRvIHRoZSBzZXJ2aWNlIGZyb20gaXRzIGRlc3RydWN0b3IgKGNhbiBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjYWxsKQpAQCAtNDkzLDggKzg1Miw5IEBACiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLQotICAgIHJlbW90ZUNhbGxiYWNrLT5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBpZiAocmVtb3RlQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICByZW1vdGVDYWxsYmFjay0+bGlua1RvRGVhdGgodGhpcyk7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNTA3LDYgKzg2NywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJUHJvQ2FtZXJhVXNlcj4mIGRldmljZSkKIHsKKyAgICBpZiAoY2FtZXJhQ2IgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbGxiYWNrIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIFN0cmluZzggY2xpZW50TmFtZTgoY2xpZW50UGFja2FnZU5hbWUpOwogICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwogCkBAIC01NDEsNiArOTA2LDggQEAKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzE6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CiAgICAgICAgICAgICBjbGllbnQgPSBuZXcgUHJvQ2FtZXJhMkNsaWVudCh0aGlzLCBjYW1lcmFDYiwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCkpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC02MDMsMTQgKzk3MCw2IEBACiAgICAgICAgIGludCBmYWNpbmcgPSAtMTsKICAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKTsKIAotICAgICAgICAvLyBJZiB0aGVyZSBhcmUgb3RoZXIgbm9uLWV4Y2x1c2l2ZSB1c2VycyBvZiB0aGUgY2FtZXJhLAotICAgICAgICAvLyAgdGhpcyB3aWxsIHRlYXIgdGhlbSBkb3duIGJlZm9yZSB3ZSBjYW4gcmV1c2UgdGhlIGNhbWVyYQotICAgICAgICBpZiAoaXNWYWxpZENhbWVyYUlkKGNhbWVyYUlkKSkgewotICAgICAgICAgICAgLy8gdHJhbnNpdGlvbiBmcm9tIFBSRVNFTlQgLT4gTk9UX0FWQUlMQUJMRQotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkKTsKLSAgICAgICAgfQotCiAgICAgICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgdXNpbmcgb2xkIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwpAQCAtNjE5LDYgKzk3OCw4IEBACiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYURldmljZUNsaWVudCh0aGlzLCBjYW1lcmFDYiwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCkpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC02MzMsOCArOTk0LDYgQEAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdEZpbmlzaFVuc2FmZShjbGllbnQsIGNsaWVudC0+Z2V0UmVtb3RlKCkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CiAgICAgICAgICAgICAvLyB0aGlzIGlzIHByb2JhYmx5IG5vdCByZWNvdmVyYWJsZS4uIG1heWJlIHRoZSBjbGllbnQgY2FuIHRyeSBhZ2FpbgotICAgICAgICAgICAgLy8gT0s6IHdlIGNhbiBvbmx5IGdldCBoZXJlIGlmIHdlIHdlcmUgb3JpZ2luYWxseSBpbiBQUkVTRU5UIHN0YXRlCi0gICAgICAgICAgICB1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQsIGNhbWVyYUlkKTsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KIApAQCAtNzA5LDYgKzEwNjgsNzggQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRMZWdhY3lQYXJhbWV0ZXJzKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgU3RyaW5nMTYqIHBhcmFtZXRlcnMpIHsKKyAgICBBTE9HVigiJXM6IGZvciBjYW1lcmEgSUQgPSAlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOworCisgICAgaWYgKHBhcmFtZXRlcnMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmFtZXRlcnMgbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gMDsKKworICAgIENhbWVyYVBhcmFtZXRlcnMgc2hpbVBhcmFtczsKKyAgICBpZiAoKHJldCA9IGdldExlZ2FjeVBhcmFtZXRlcnNMYXp5KGNhbWVyYUlkLCAvKm91dCovJnNoaW1QYXJhbXMpKSAhPSBPSykgeworICAgICAgICAvLyBFcnJvciBsb2dnZWQgYnkgY2FsbGVyCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgU3RyaW5nOCBzaGltUGFyYW1zU3RyaW5nOCA9IHNoaW1QYXJhbXMuZmxhdHRlbigpOworICAgIFN0cmluZzE2IHNoaW1QYXJhbXNTdHJpbmcxNiA9IFN0cmluZzE2KHNoaW1QYXJhbXNTdHJpbmc4KTsKKworICAgICpwYXJhbWV0ZXJzID0gc2hpbVBhcmFtc1N0cmluZzE2OworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpzdXBwb3J0c0NhbWVyYUFwaShpbnQgY2FtZXJhSWQsIGludCBhcGlWZXJzaW9uKSB7CisgICAgQUxPR1YoIiVzOiBmb3IgY2FtZXJhIElEID0gJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKworICAgIHN3aXRjaCAoYXBpVmVyc2lvbikgeworICAgICAgICBjYXNlIEFQSV9WRVJTSU9OXzE6CisgICAgICAgIGNhc2UgQVBJX1ZFUlNJT05fMjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBCYWQgQVBJIHZlcnNpb24gJWQiLCBfX0ZVTkNUSU9OX18sIGFwaVZlcnNpb24pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbnQgZmFjaW5nID0gLTE7CisgICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKTsKKworICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7CisgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgorICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKKyAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzE6CisgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgaWYgKGFwaVZlcnNpb24gPT0gQVBJX1ZFUlNJT05fMikgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJWQgdXNlcyBIQUwgcHJpb3IgdG8gSEFMMy4yLCBkb2Vzbid0IHN1cHBvcnQgYXBpMiB3aXRob3V0IHNoaW0iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICAgICAgfSBlbHNlIHsgLy8gaWYgKGFwaVZlcnNpb24gPT0gQVBJX1ZFUlNJT05fMSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJWQgdXNlcyBvbGRlciBIQUwgYmVmb3JlIDMuMiwgYnV0IGFwaTEgaXMgYWx3YXlzIHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgorICAgICAgICBBTE9HVigiJXM6IENhbWVyYSBpZCAlZCB1c2VzIEhBTDMuMiBvciBuZXdlciwgc3VwcG9ydHMgYXBpMS9hcGkyIGRpcmVjdGx5IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgICAgY2FzZSAtMToKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBpZCAlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIGNhbWVyYSBkZXZpY2UgSEFMIHZlcnNpb246ICVkIiwgX19GVU5DVElPTl9fLCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpyZW1vdmVDbGllbnRCeVJlbW90ZShjb25zdCB3cDxJQmluZGVyPiYgcmVtb3RlQmluZGVyKSB7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6cmVtb3ZlQ2xpZW50QnlSZW1vdGUgRSAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwpAQCAtNzIzLDkgKzExNTQsMTMgQEAKICAgICBpZiAoY2xpZW50ICE9IDApIHsKICAgICAgICAgLy8gRm91bmQgb3VyIGNhbWVyYSwgY2xlYXIgYW5kIGxlYXZlLgogICAgICAgICBMT0cxKCJyZW1vdmVDbGllbnQ6IGNsZWFyIGNhbWVyYSAlZCIsIG91dEluZGV4KTsKLSAgICAgICAgbUNsaWVudFtvdXRJbmRleF0uY2xlYXIoKTsKIAotICAgICAgICBjbGllbnQtPmdldFJlbW90ZSgpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICBzcDxJQmluZGVyPiByZW1vdGUgPSBjbGllbnQtPmdldFJlbW90ZSgpOworICAgICAgICBpZiAocmVtb3RlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJlbW90ZS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIG1DbGllbnRbb3V0SW5kZXhdLmNsZWFyKCk7CiAgICAgfSBlbHNlIHsKIAogICAgICAgICBzcDxQcm9DbGllbnQ+IGNsaWVudFBybyA9IGZpbmRQcm9DbGllbnRVbnNhZmUocmVtb3RlQmluZGVyKTsKQEAgLTgzNSw2ICsxMjcwLDcgQEAKICAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1Q6CiAgICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX1BSTzoKICAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1RfREVWSUNFOgorICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVF9MRUdBQ1k6CiAgICAgICAgICAgICBjb25zdCBpbnQgcGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICAgICAgY29uc3QgaW50IHNlbGZfcGlkID0gZ2V0cGlkKCk7CiAgICAgICAgICAgICBpZiAocGlkICE9IHNlbGZfcGlkKSB7CkBAIC04NzcsNyArMTMxMyw3IEBACiAKIE1lZGlhUGxheWVyKiBDYW1lcmFTZXJ2aWNlOjpuZXdNZWRpYVBsYXllcihjb25zdCBjaGFyICpmaWxlKSB7CiAgICAgTWVkaWFQbGF5ZXIqIG1wID0gbmV3IE1lZGlhUGxheWVyKCk7Ci0gICAgaWYgKG1wLT5zZXREYXRhU291cmNlKGZpbGUsIE5VTEwpID09IE5PX0VSUk9SKSB7CisgICAgaWYgKG1wLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIGZpbGUsIE5VTEwpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIG1wLT5zZXRBdWRpb1N0cmVhbVR5cGUoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpOwogICAgICAgICBtcC0+cHJlcGFyZSgpOwogICAgIH0gZWxzZSB7CkBAIC05ODEsMTMgKzE0MTcsMTUgQEAKIHZvaWQgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmRpc2Nvbm5lY3QoKSB7CiAgICAgQUxPR1YoIkJhc2ljQ2xpZW50OjpkaXNjb25uZWN0Iik7CiAgICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUNsaWVudEJ5UmVtb3RlKG1SZW1vdGVCaW5kZXIpOworCisgICAgZmluaXNoQ2FtZXJhT3BzKCk7CiAgICAgLy8gY2xpZW50IHNob3VsZG4ndCBiZSBhYmxlIHRvIGNhbGwgaW50byB1cyBhbnltb3JlCiAgICAgbUNsaWVudFBpZCA9IDA7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpzdGFydENhbWVyYU9wcygpIHsKICAgICBpbnQzMl90IHJlczsKLQorICAgIC8vIE5vdGlmeSBhcHAgb3BzIHRoYXQgdGhlIGNhbWVyYSBpcyBub3QgYXZhaWxhYmxlCiAgICAgbU9wc0NhbGxiYWNrID0gbmV3IE9wc0NhbGxiYWNrKHRoaXMpOwogCiAgICAgewpAQCAtMTAwNSwxNiArMTQ0MywzOSBAQAogICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KKwogICAgIG1PcHNBY3RpdmUgPSB0cnVlOworCisgICAgLy8gVHJhbnNpdGlvbiBkZXZpY2UgYXZhaWxhYmlsaXR5IGxpc3RlbmVycyBmcm9tIFBSRVNFTlQgLT4gTk9UX0FWQUlMQUJMRQorICAgIG1DYW1lcmFTZXJ2aWNlLT51cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEUsCisgICAgICAgICAgICBtQ2FtZXJhSWQpOworCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6ZmluaXNoQ2FtZXJhT3BzKCkgeworICAgIC8vIENoZWNrIGlmIHN0YXJ0Q2FtZXJhT3BzIHN1Y2NlZWRlZCwgYW5kIGlmIHNvLCBmaW5pc2ggdGhlIGNhbWVyYSBvcAogICAgIGlmIChtT3BzQWN0aXZlKSB7CisgICAgICAgIC8vIE5vdGlmeSBhcHAgb3BzIHRoYXQgdGhlIGNhbWVyYSBpcyBhdmFpbGFibGUgYWdhaW4KICAgICAgICAgbUFwcE9wc01hbmFnZXIuZmluaXNoT3AoQXBwT3BzTWFuYWdlcjo6T1BfQ0FNRVJBLCBtQ2xpZW50VWlkLAogICAgICAgICAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSk7CiAgICAgICAgIG1PcHNBY3RpdmUgPSBmYWxzZTsKKworICAgICAgICAvLyBOb3RpZnkgZGV2aWNlIGF2YWlsYWJpbGl0eSBsaXN0ZW5lcnMgdGhhdCB0aGlzIGNhbWVyYSBpcyBhdmFpbGFibGUKKyAgICAgICAgLy8gYWdhaW4KKworICAgICAgICBTdGF0dXNWZWN0b3IgcmVqZWN0U291cmNlU3RhdGVzOworICAgICAgICByZWplY3RTb3VyY2VTdGF0ZXMucHVzaF9iYWNrKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVCk7CisgICAgICAgIHJlamVjdFNvdXJjZVN0YXRlcy5wdXNoX2JhY2soSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX0VOVU1FUkFUSU5HKTsKKworICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIFBSRVNFTlQgaWYgdGhlIGNhbWVyYSBpcyBub3QgaW4gZWl0aGVyIG9mIGFib3ZlIDIKKyAgICAgICAgLy8gc3RhdGVzCisgICAgICAgIG1DYW1lcmFTZXJ2aWNlLT51cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkLAorICAgICAgICAgICAgICAgICZyZWplY3RTb3VyY2VTdGF0ZXMpOworCiAgICAgfQorICAgIC8vIEFsd2F5cyBzdG9wIHdhdGNoaW5nLCBldmVuIGlmIG5vIGNhbWVyYSBvcCBpcyBhY3RpdmUKICAgICBtQXBwT3BzTWFuYWdlci5zdG9wV2F0Y2hpbmdNb2RlKG1PcHNDYWxsYmFjayk7CiAgICAgbU9wc0NhbGxiYWNrLmNsZWFyKCk7CiAKQEAgLTEwNDUsNyArMTUwNiw4IEBACiAgICAgICAgIC8vIFJlc2V0IHRoZSBjbGllbnQgUElEIHRvIGFsbG93IHNlcnZlci1pbml0aWF0ZWQgZGlzY29ubmVjdCwKICAgICAgICAgLy8gYW5kIHRvIHByZXZlbnQgZnVydGhlciBjYWxscyBieSBjbGllbnQuCiAgICAgICAgIG1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgIG5vdGlmeUVycm9yKCk7CisgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOyAvLyBhIGR1bW15IHJlc3VsdCAoaW52YWxpZCkKKyAgICAgICAgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1NFUlZJQ0UsIHJlc3VsdEV4dHJhcyk7CiAgICAgICAgIGRpc2Nvbm5lY3QoKTsKICAgICB9CiB9CkBAIC0xMDUzLDEzICsxNTE1LDEzIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIE11dGV4KiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmdldENsaWVudExvY2tGcm9tQ29va2llKHZvaWQqIHVzZXIpIHsKLSAgICByZXR1cm4gZ0NhbWVyYVNlcnZpY2UtPmdldENsaWVudExvY2tCeUlkKChpbnQpIHVzZXIpOworICAgIHJldHVybiBnQ2FtZXJhU2VydmljZS0+Z2V0Q2xpZW50TG9ja0J5SWQoKGludCkoaW50cHRyX3QpIHVzZXIpOwogfQogCiAvLyBQcm92aWRlIGNsaWVudCBwb2ludGVyIGZvciBjYWxsYmFja3MuIENsaWVudCBsb2NrIHJldHVybmVkIGZyb20gZ2V0Q2xpZW50TG9ja0Zyb21Db29raWUgc2hvdWxkCiAvLyBiZSBhY3F1aXJlZCBmb3IgdGhpcyB0byBiZSBzYWZlCiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQqIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Z2V0Q2xpZW50RnJvbUNvb2tpZSh2b2lkKiB1c2VyKSB7Ci0gICAgQmFzaWNDbGllbnQgKmJhc2ljQ2xpZW50ID0gZ0NhbWVyYVNlcnZpY2UtPmdldENsaWVudEJ5SWRVbnNhZmUoKGludCkgdXNlcik7CisgICAgQmFzaWNDbGllbnQgKmJhc2ljQ2xpZW50ID0gZ0NhbWVyYVNlcnZpY2UtPmdldENsaWVudEJ5SWRVbnNhZmUoKGludCkoaW50cHRyX3QpIHVzZXIpOwogICAgIC8vIE9LOiBvbmx5IENhbWVyYUNsaWVudCBjYWxscyB0aGlzLCBhbmQgdGhleSBhbHJlYWR5IGNhc3QgYW55d2F5LgogICAgIENsaWVudCogY2xpZW50ID0gc3RhdGljX2Nhc3Q8Q2xpZW50Kj4oYmFzaWNDbGllbnQpOwogCkBAIC0xMDc0LDcgKzE1MzYsOCBAQAogICAgIHJldHVybiBjbGllbnQ7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpub3RpZnlFcnJvcigpIHsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKICAgICBtUmVtb3RlQ2FsbGJhY2stPm5vdGlmeUNhbGxiYWNrKENBTUVSQV9NU0dfRVJST1IsIENBTUVSQV9FUlJPUl9SRUxFQVNFRCwgMCk7CiB9CiAKQEAgLTEwODMsMTUgKzE1NDYsNiBAQAogICAgIEFMT0dWKCJDbGllbnQ6OmRpc2Nvbm5lY3QiKTsKICAgICBCYXNpY0NsaWVudDo6ZGlzY29ubmVjdCgpOwogICAgIG1DYW1lcmFTZXJ2aWNlLT5zZXRDYW1lcmFGcmVlKG1DYW1lcmFJZCk7Ci0KLSAgICBTdGF0dXNWZWN0b3IgcmVqZWN0U291cmNlU3RhdGVzOwotICAgIHJlamVjdFNvdXJjZVN0YXRlcy5wdXNoX2JhY2soSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5UKTsKLSAgICByZWplY3RTb3VyY2VTdGF0ZXMucHVzaF9iYWNrKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19FTlVNRVJBVElORyk7Ci0KLSAgICAvLyBUcmFuc2l0aW9uIHRvIFBSRVNFTlQgaWYgdGhlIGNhbWVyYSBpcyBub3QgaW4gZWl0aGVyIG9mIGFib3ZlIDIgc3RhdGVzCi0gICAgbUNhbWVyYVNlcnZpY2UtPnVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWplY3RTb3VyY2VTdGF0ZXMpOwogfQogCiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6Ok9wc0NhbGxiYWNrOjpPcHNDYWxsYmFjayh3cDxCYXNpY0NsaWVudD4gY2xpZW50KToKQEAgLTExMjgsNyArMTU4Miw4IEBACiBDYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ6On5Qcm9DbGllbnQoKSB7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6UHJvQ2xpZW50Ojpub3RpZnlFcnJvcigpIHsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6UHJvQ2xpZW50Ojpub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKICAgICBtUmVtb3RlQ2FsbGJhY2stPm5vdGlmeUNhbGxiYWNrKENBTUVSQV9NU0dfRVJST1IsIENBTUVSQV9FUlJPUl9SRUxFQVNFRCwgMCk7CiB9CiAKQEAgLTExNzAsNiArMTYyNSw3IEBACiAgICAgICAgIGlmICghbU1vZHVsZSkgewogICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCJObyBjYW1lcmEgbW9kdWxlIGF2YWlsYWJsZSFcbiIpOwogICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBpZiAobG9ja2VkKSBtU2VydmljZUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTE4Miw3ICsxNjM4LDIwIEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYSBtb2R1bGUgYXV0aG9yOiAlc1xuIiwKICAgICAgICAgICAgICAgICBtTW9kdWxlLT5jb21tb24uYXV0aG9yKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiTnVtYmVyIG9mIGNhbWVyYSBkZXZpY2VzOiAlZFxuXG4iLCBtTnVtYmVyT2ZDYW1lcmFzKTsKKworICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0R2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgICAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJWZW5kb3IgdGFncyBsZWZ0IHVuaW1wbGVtZW50ZWQuXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlZlbmRvciB0YWcgZGVmaW5pdGlvbnM6XG4iKTsKKyAgICAgICAgfQorCiAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgICAgIGlmIChkZXNjICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlc2MtPmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8yLCAvKmluZGVudGF0aW9uKi80KTsKKyAgICAgICAgfQorCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mQ2FtZXJhczsgaSsrKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlZCBzdGF0aWMgaW5mb3JtYXRpb246XG4iLCBpKTsKICAgICAgICAgICAgIGNhbWVyYV9pbmZvIGluZm87CkBAIC0xMjA3LDcgKzE2NzYsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIERldmljZSBzdGF0aWMgbWV0YWRhdGE6XG4iKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGR1bXBfaW5kZW50ZWRfY2FtZXJhX21ldGFkYXRhKGluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIDIsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLCAvKnZlcmJvc2l0eSovMiwgLyppbmRlbnRhdGlvbiovNCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IGFkNmE1ODIuLmE3MzI4Y2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTEsMjQgKzEsMjQgQEAKIC8qCi0qKgotKiogQ29weXJpZ2h0IChDKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLworICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVNFUlZJQ0VfSAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVNFUlZJQ0VfSAogCiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lBcHBPcHNDYWxsYmFjay5oPgpAQCAtMzEsNiArMzEsOSBAQAogI2luY2x1ZGUgPGNhbWVyYS9JUHJvQ2FtZXJhQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgogCkBAIC03MywxMiArNzYsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGludCBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2FtZXJhSW5mbyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDYW1lcmFWZW5kb3JUYWdEZXNjcmlwdG9yKC8qb3V0Ki8gc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2MpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPElDYW1lcmE+JiBkZXZpY2UpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0TGVnYWN5KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxJQ2FtZXJhPiYgZGV2aWNlKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdFBybyhjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgY2FtZXJhQ2IsCiAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKICAgICAgICAgICAgIC8qb3V0Ki8KQEAgLTk2LDYgKzEwNSwxNSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVtb3ZlTGlzdGVuZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRMZWdhY3lQYXJhbWV0ZXJzKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgU3RyaW5nMTYqIHBhcmFtZXRlcnMpOworCisgICAgLy8gT0sgPSBzdXBwb3J0cyBhcGkgb2YgdGhhdCB2ZXJzaW9uLCAtRU9QTk9UU1VQUCA9IGRvZXMgbm90IHN1cHBvcnQKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN1cHBvcnRzQ2FtZXJhQXBpKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbik7CisKICAgICAvLyBFeHRyYSBwZXJtaXNzaW9ucyBjaGVja3MKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CkBAIC0xMjAsNiArMTM4LDEwIEBACiAgICAgLy8gQ2FtZXJhRGV2aWNlRmFjdG9yeSBmdW5jdGlvbmFsaXR5CiAgICAgaW50ICAgICAgICAgICAgICAgICBnZXREZXZpY2VWZXJzaW9uKGludCBjYW1lcmFJZCwgaW50KiBmYWNpbmcgPSBOVUxMKTsKIAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFNoYXJlZCB1dGlsaXRpZXMKKyAgICBzdGF0aWMgc3RhdHVzX3QgICAgIGZpbHRlck9wZW5FcnJvckNvZGUoc3RhdHVzX3QgZXJyKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgICAgIGZpbHRlckdldEluZm9FcnJvckNvZGUoc3RhdHVzX3QgZXJyKTsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIENhbWVyYUNsaWVudCBmdW5jdGlvbmFsaXR5CkBAIC0xMzEsMjAgKzE1MywxOSBAQAogCiAgICAgY2xhc3MgQmFzaWNDbGllbnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgPSAwOwotCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBkaXNjb25uZWN0KCkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBkaXNjb25uZWN0KCk7CiAKICAgICAgICAgLy8gYmVjYXVzZSB3ZSBjYW4ndCB2aXJ0dWFsbHkgaW5oZXJpdCBJSW50ZXJmYWNlLCB3aGljaCBicmVha3MKICAgICAgICAgLy8gdmlydHVhbCBpbmhlcml0YW5jZQogICAgICAgICB2aXJ0dWFsIHNwPElCaW5kZXI+IGFzQmluZGVyV3JhcHBlcigpID0gMDsKIAogICAgICAgICAvLyBSZXR1cm4gdGhlIHJlbW90ZSBjYWxsYmFjayBiaW5kZXIgb2JqZWN0IChlLmcuIElQcm9DYW1lcmFDYWxsYmFja3MpCi0gICAgICAgIHNwPElCaW5kZXI+ICAgICBnZXRSZW1vdGUoKSB7CisgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgZ2V0UmVtb3RlKCkgewogICAgICAgICAgICAgcmV0dXJuIG1SZW1vdGVCaW5kZXI7CiAgICAgICAgIH0KIAotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgPSAwOwogCiAgICAgcHJvdGVjdGVkOgogICAgICAgICBCYXNpY0NsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKQEAgLTE4MSw3ICsyMDIsOSBAQAogICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaENhbWVyYU9wcygpOwogCiAgICAgICAgIC8vIE5vdGlmeSBjbGllbnQgYWJvdXQgYSBmYXRhbCBlcnJvcgotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSA9IDA7CiAgICAgcHJpdmF0ZToKICAgICAgICAgQXBwT3BzTWFuYWdlciAgICAgICAgICAgICAgICAgICBtQXBwT3BzTWFuYWdlcjsKIApAQCAtMjU4LDcgKzI4MSw4IEBACiAgICAgICAgIC8vIGNvbnZlcnQgY2xpZW50IGZyb20gY29va2llLiBDbGllbnQgbG9jayBzaG91bGQgYmUgYWNxdWlyZWQgYmVmb3JlIGdldHRpbmcgQ2xpZW50LgogICAgICAgICBzdGF0aWMgQ2xpZW50KiAgICAgICBnZXRDbGllbnRGcm9tQ29va2llKHZvaWQqIHVzZXIpOwogCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgIG5vdGlmeUVycm9yKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CiAKICAgICAgICAgLy8gSW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKIApAQCAtMzA2LDcgKzMzMCw4IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBvbkV4Y2x1c2l2ZUxvY2tTdG9sZW4oKSA9IDA7CiAKICAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlFcnJvcigpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CiAKICAgICAgICAgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4gbVJlbW90ZUNhbGxiYWNrOwogICAgIH07IC8vIGNsYXNzIFByb0NsaWVudApAQCAtMzg3LDYgKzQxMiw1NyBAQAogICAgIC8vIEhlbHBlcnMKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgaXNWYWxpZENhbWVyYUlkKGludCBjYW1lcmFJZCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgIHNldFVwVmVuZG9yVGFncygpOworCisgICAgLyoqCisgICAgICogQSBtYXBwaW5nIG9mIGNhbWVyYSBpZHMgdG8gQ2FtZXJhUGFyYW1ldGVycyByZXR1cm5lZCBieSB0aGF0IGNhbWVyYSBkZXZpY2UuCisgICAgICoKKyAgICAgKiBUaGlzIGNhY2hlIGlzIHVzZWQgdG8gZ2VuZXJhdGUgQ2FtZXJhQ2hhcmFjdGVyaXN0aWMgbWV0YWRhdGEgd2hlbiB1c2luZworICAgICAqIHRoZSBIQUwxIHNoaW0uCisgICAgICovCisgICAgS2V5ZWRWZWN0b3I8aW50LCBDYW1lcmFQYXJhbWV0ZXJzPiAgICBtU2hpbVBhcmFtczsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYW5kIGNhY2hlIHRoZSBtZXRhZGF0YSB1c2VkIGJ5IHRoZSBIQUwxIHNoaW0gZm9yIGEgZ2l2ZW4gY2FtZXJhSWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgICAgIGluaXRpYWxpemVTaGltTWV0YWRhdGEoaW50IGNhbWVyYUlkKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2FjaGVkIENhbWVyYVBhcmFtZXRlcnMgZm9yIHRoZSBjYW1lcmEuIElmIHRoZXkgaGF2ZW4ndCBiZWVuCisgICAgICogY2FjaGVkIHlldCwgdGhlbiBpbml0aWFsaXplIHRoZW0gZm9yIHRoZSBmaXJzdCB0aW1lLgorICAgICAqCisgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICAgICBnZXRMZWdhY3lQYXJhbWV0ZXJzTGF6eShpbnQgY2FtZXJhSWQsIC8qb3V0Ki9DYW1lcmFQYXJhbWV0ZXJzKiBwYXJhbWV0ZXJzKTsKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIHRoZSBDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgbWV0YWRhdGEgcmVxdWlyZWQgYnkgdGhlIENhbWVyYTIgQVBJCisgICAgICogZnJvbSB0aGUgYXZhaWxhYmxlIEhBTDEgQ2FtZXJhUGFyYW1ldGVycyBhbmQgQ2FtZXJhSW5mby4KKyAgICAgKgorICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgICAgZ2VuZXJhdGVTaGltTWV0YWRhdGEoaW50IGNhbWVyYUlkLCAvKm91dCovQ2FtZXJhTWV0YWRhdGEqIGNhbWVyYUluZm8pOworCisgICAgLyoqCisgICAgICogQ29ubmVjdCBhIG5ldyBjYW1lcmEgY2xpZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoaWxlIGhvbGRpbmcgdGhlCisgICAgICogbXV0ZXggZm9yIG1TZXJ2aWNlTG9jay4KKyAgICAgKgorICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgICAgY29ubmVjdEhlbHBlckxvY2tlZCgKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPENsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgIC8qaW4qLworICAgICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGludCBjbGllbnRVaWQsCisgICAgICAgICAgICBpbnQgY2FsbGluZ1BpZCwKKyAgICAgICAgICAgIGludCBoYWxWZXJzaW9uID0gQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSA9IGZhbHNlKTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCmluZGV4IGIwOTM5NDYuLmYzYTg4YTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKQEAgLTUzLDE2ICs1NCwxNyBAQAogICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbik6CisgICAgICAgIGJvb2wgbGVnYWN5TW9kZSk6CiAgICAgICAgIENhbWVyYTJDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAotICAgICAgICBtUGFyYW1ldGVycyhjYW1lcmFJZCwgY2FtZXJhRmFjaW5nKSwKLSAgICAgICAgbURldmljZVZlcnNpb24oZGV2aWNlVmVyc2lvbikKKyAgICAgICAgbVBhcmFtZXRlcnMoY2FtZXJhSWQsIGNhbWVyYUZhY2luZykKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICBsLm1QYXJhbWV0ZXJzLnN0YXRlID0gUGFyYW1ldGVyczo6RElTQ09OTkVDVEVEOworCisgICAgbUxlZ2FjeU1vZGUgPSBsZWdhY3lNb2RlOwogfQogCiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojppbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKQpAQCAtNzksNyArODEsNyBAQAogICAgIHsKICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKIAotICAgICAgICByZXMgPSBsLm1QYXJhbWV0ZXJzLmluaXRpYWxpemUoJihtRGV2aWNlLT5pbmZvKCkpKTsKKyAgICAgICAgcmVzID0gbC5tUGFyYW1ldGVycy5pbml0aWFsaXplKCYobURldmljZS0+aW5mbygpKSwgbURldmljZVZlcnNpb24pOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogdW5hYmxlIHRvIGJ1aWxkIGRlZmF1bHRzOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTE3LDcgKzExOSw5IEBACiAgICAgICAgICAgICBtWnNsUHJvY2Vzc29yVGhyZWFkID0genNsUHJvYzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6eworICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOiB7CiAgICAgICAgICAgICBzcDxac2xQcm9jZXNzb3IzPiB6c2xQcm9jID0KICAgICAgICAgICAgICAgICAgICAgbmV3IFpzbFByb2Nlc3NvcjModGhpcywgbUNhcHR1cmVTZXF1ZW5jZXIpOwogICAgICAgICAgICAgbVpzbFByb2Nlc3NvciA9IHpzbFByb2M7CkBAIC0xOTMsNyArMTk3LDcgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgIEdQUyBsYXQgeCBsb25nIHggYWx0OiAlZiB4ICVmIHggJWZcbiIsCiAgICAgICAgICAgICAgICAgcC5ncHNDb29yZGluYXRlc1swXSwgcC5ncHNDb29yZGluYXRlc1sxXSwKICAgICAgICAgICAgICAgICBwLmdwc0Nvb3JkaW5hdGVzWzJdKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgIEdQUyB0aW1lc3RhbXA6ICVsbGRcbiIsCisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICBHUFMgdGltZXN0YW1wOiAlIiBQUklkNjQgIlxuIiwKICAgICAgICAgICAgICAgICBwLmdwc1RpbWVzdGFtcCk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICBHUFMgcHJvY2Vzc2luZyBtZXRob2Q6ICVzXG4iLAogICAgICAgICAgICAgICAgIHAuZ3BzUHJvY2Vzc2luZ01ldGhvZC5zdHJpbmcoKSk7CkBAIC0yMzcsNyArMjQxLDcgQEAKIAogICAgIHJlc3VsdC5hcHBlbmQoIiAgICBTY2VuZSBtb2RlOiAiKTsKICAgICBzd2l0Y2ggKHAuc2NlbmVNb2RlKSB7Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ6CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJBVVRPXG4iKTsgYnJlYWs7CiAgICAgICAgIENBU0VfQVBQRU5EX0VOVU0oQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfQUNUSU9OKQogICAgICAgICBDQVNFX0FQUEVORF9FTlVNKEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1BPUlRSQUlUKQpAQCAtNDE1LDEyICs0MTksMjAgQEAKIAogICAgIEFMT0dWKCJDYW1lcmEgJWQ6IFdhaXRpbmcgZm9yIHRocmVhZHMiLCBtQ2FtZXJhSWQpOwogCi0gICAgbVN0cmVhbWluZ1Byb2Nlc3Nvci0+am9pbigpOwotICAgIG1GcmFtZVByb2Nlc3Nvci0+am9pbigpOwotICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5qb2luKCk7Ci0gICAgbUpwZWdQcm9jZXNzb3ItPmpvaW4oKTsKLSAgICBtWnNsUHJvY2Vzc29yVGhyZWFkLT5qb2luKCk7Ci0gICAgbUNhbGxiYWNrUHJvY2Vzc29yLT5qb2luKCk7CisgICAgeworICAgICAgICAvLyBEb24ndCB3YWl0IHdpdGggbG9jayBoZWxkLCBpbiBjYXNlIHRoZSBvdGhlciB0aHJlYWRzIG5lZWQgdG8KKyAgICAgICAgLy8gY29tcGxldGUgY2FsbGJhY2tzIHRoYXQgcmUtZW50ZXIgQ2FtZXJhMkNsaWVudAorICAgICAgICBtQmluZGVyU2VyaWFsaXphdGlvbkxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgbVN0cmVhbWluZ1Byb2Nlc3Nvci0+am9pbigpOworICAgICAgICBtRnJhbWVQcm9jZXNzb3ItPmpvaW4oKTsKKyAgICAgICAgbUNhcHR1cmVTZXF1ZW5jZXItPmpvaW4oKTsKKyAgICAgICAgbUpwZWdQcm9jZXNzb3ItPmpvaW4oKTsKKyAgICAgICAgbVpzbFByb2Nlc3NvclRocmVhZC0+am9pbigpOworICAgICAgICBtQ2FsbGJhY2tQcm9jZXNzb3ItPmpvaW4oKTsKKworICAgICAgICBtQmluZGVyU2VyaWFsaXphdGlvbkxvY2subG9jaygpOworICAgIH0KIAogICAgIEFMT0dWKCJDYW1lcmEgJWQ6IERlbGV0aW5nIHN0cmVhbXMiLCBtQ2FtZXJhSWQpOwogCkBAIC00MzAsNiArNDQyLDkgQEAKICAgICBtQ2FsbGJhY2tQcm9jZXNzb3ItPmRlbGV0ZVN0cmVhbSgpOwogICAgIG1ac2xQcm9jZXNzb3ItPmRlbGV0ZVN0cmVhbSgpOwogCisgICAgLy8gUmVtb3ZlIGFsbCBaU0wgc3RyZWFtIHN0YXRlIGJlZm9yZSBkaXNjb25uZWN0OyBuZWVkZWQgdG8gd29yayBhcm91bmQgYi8xNTQwODEyOC4KKyAgICBtWnNsUHJvY2Vzc29yLT5kaXNjb25uZWN0KCk7CisKICAgICBBTE9HVigiQ2FtZXJhICVkOiBEaXNjb25uZWN0aW5nIGRldmljZSIsIG1DYW1lcmFJZCk7CiAKICAgICBtRGV2aWNlLT5kaXNjb25uZWN0KCk7CkBAIC03NTIsNiArNzY3LDcgQEAKICAgICAvLyBldmVyIHRha2UgYSBwaWN0dXJlLgogICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgY29tcHJvbWlzZSwgdGhvdWdoIHRoaXMgbGlrZWx5IHdvdWxkIGludm9sdmUgSEFMCiAgICAgLy8gY2hhbmdlcy4KKyAgICBpbnQgbGFzdEpwZWdTdHJlYW1JZCA9IG1KcGVnUHJvY2Vzc29yLT5nZXRTdHJlYW1JZCgpOwogICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbShtSnBlZ1Byb2Nlc3NvciwgcGFyYW1zKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBwcmUtY29uZmlndXJlIHN0aWxsIGltYWdlICIKQEAgLTc1OSw2ICs3NzUsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CisgICAgYm9vbCBqcGVnU3RyZWFtQ2hhbmdlZCA9IG1KcGVnUHJvY2Vzc29yLT5nZXRTdHJlYW1JZCgpICE9IGxhc3RKcGVnU3RyZWFtSWQ7CiAKICAgICBWZWN0b3I8aW50MzJfdD4gb3V0cHV0U3RyZWFtczsKICAgICBib29sIGNhbGxiYWNrc0VuYWJsZWQgPSAocGFyYW1zLnByZXZpZXdDYWxsYmFja0ZsYWdzICYKQEAgLTgwNywxNCArODI0LDI0IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChwYXJhbXMuenNsTW9kZSAmJiAhcGFyYW1zLnJlY29yZGluZ0hpbnQpIHsKKworICAgIGlmIChwYXJhbXMuenNsTW9kZSAmJiAhcGFyYW1zLnJlY29yZGluZ0hpbnQgJiYKKyAgICAgICAgICAgIGdldFJlY29yZGluZ1N0cmVhbUlkKCkgPT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbShtWnNsUHJvY2Vzc29yLCBwYXJhbXMpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIHVwZGF0ZSBaU0wgc3RyZWFtOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQorCisgICAgICAgIGlmIChqcGVnU3RyZWFtQ2hhbmdlZCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENsZWFyIFpTTCBidWZmZXIgcXVldWUgd2hlbiBKcGVnIHNpemUgaXMgY2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIG1ac2xQcm9jZXNzb3ItPmNsZWFyWnNsUXVldWUoKTsKKyAgICAgICAgfQogICAgICAgICBvdXRwdXRTdHJlYW1zLnB1c2goZ2V0WnNsU3RyZWFtSWQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVpzbFByb2Nlc3Nvci0+ZGVsZXRlU3RyZWFtKCk7CiAgICAgfQogCiAgICAgb3V0cHV0U3RyZWFtcy5wdXNoKGdldFByZXZpZXdTdHJlYW1JZCgpKTsKQEAgLTg5NSw2ICs5MjIsMjAgQEAKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogV2FpdGluZyB0byBzdG9wIHN0cmVhbWluZyBmYWlsZWQ6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ2xlYW4gdXAgcmVjb3JkaW5nIHN0cmVhbQorICAgICAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+ZGVsZXRlUmVjb3JkaW5nU3RyZWFtKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBkZWxldGUgcmVjb3JkaW5nIHN0cmVhbSBiZWZvcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0b3AgcHJldmlldzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgcmVjb3ZlciB0aGUgb3ZlcnJpZGUgYWZ0ZXIgcmVjb3JkaW5nIHN0b3BwZWQsIGJ1dAorICAgICAgICAgICAgICAgIC8vIHJpZ2h0IG5vdyByZWNvcmRpbmcgc3RyZWFtIHdpbGwgbGl2ZSB1bnRpbCBoZXJlLCBzbyB3ZSBhcmUgZm9yY2VkIHRvCisgICAgICAgICAgICAgICAgLy8gcmVjb3ZlciBoZXJlLiBUT0RPOiBmaW5kIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhhdCAoYi8xNzQ5NTE2NSkKKyAgICAgICAgICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOworICAgICAgICAgICAgICAgIGwubVBhcmFtZXRlcnMucmVjb3Zlck92ZXJyaWRkZW5KcGVnU2l6ZSgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbm8gYnJlYWsKICAgICAgICAgY2FzZSBQYXJhbWV0ZXJzOjpXQUlUSU5HX0ZPUl9QUkVWSUVXX1dJTkRPVzogewogICAgICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKQEAgLTk2Miw2ICsxMDAzLDEwIEBACiAgICAgICAgIGNhc2UgUGFyYW1ldGVyczo6U1RPUFBFRDoKICAgICAgICAgICAgIHJlcyA9IHN0YXJ0UHJldmlld0wocGFyYW1zLCBmYWxzZSk7CiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGZpcnN0IHByZXZpZXcgcmVxdWVzdCBpcyBzdWJtaXR0ZWQgdG8gdGhlIEhBTCBkZXZpY2UgdG8gYXZvaWQKKyAgICAgICAgICAgIC8vIHR3byBjb25zZWN1dGl2ZSBzZXQgb2YgY29uZmlndXJlX3N0cmVhbXMgYmVpbmcgY2FsbGVkIGludG8gdGhlIEhBTC4KKyAgICAgICAgICAgIC8vIFRPRE86IFJlZmFjdG9yIHRoaXMgdG8gYXZvaWQgaW5pdGlhbCBwcmV2aWV3IGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICBzeW5jV2l0aERldmljZSgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUGFyYW1ldGVyczo6UFJFVklFVzoKICAgICAgICAgICAgIC8vIFJlYWR5IHRvIGdvCkBAIC0xMDE1LDE4ICsxMDYwLDk1IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQorCisgICAgLy8gT24gY3VycmVudCBIQUxzLCBjbGVhbiB1cCBaU0wgYmVmb3JlIHRyYW5zaXRpb25pbmcgaW50byByZWNvcmRpbmcKKyAgICBpZiAobURldmljZVZlcnNpb24gIT0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzApIHsKKyAgICAgICAgaWYgKG1ac2xQcm9jZXNzb3ItPmdldFN0cmVhbUlkKCkgIT0gTk9fU1RSRUFNKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQ2xlYXJpbmcgb3V0IHpzbCBzdHJlYW0gYmVmb3JlICIKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0aW5nIHJlY29yZGluZyBzdHJlYW0iLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT5zdG9wU3RyZWFtKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHN0b3Agc3RyZWFtaW5nIHRvIGRlbGV0ZSBjYWxsYmFjayBzdHJlYW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBtRGV2aWNlLT53YWl0VW50aWxEcmFpbmVkKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFdhaXRpbmcgdG8gc3RvcCBzdHJlYW1pbmcgZmFpbGVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IG1ac2xQcm9jZXNzb3ItPmNsZWFyWnNsUXVldWUoKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY2xlYXIgenNsIHF1ZXVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gbVpzbFByb2Nlc3Nvci0+ZGVsZXRlU3RyZWFtKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBkZWxldGUgenNsIHN0cmVhbSBiZWZvcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInJlY29yZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIERpc2FibGUgY2FsbGJhY2tzIGlmIHRoZXkncmUgZW5hYmxlZDsgY2FuJ3QgcmVjb3JkIGFuZCB1c2UgY2FsbGJhY2tzLAogICAgIC8vIGFuZCB3ZSBjYW4ndCBmYWlsIHJlY29yZCBzdGFydCB3aXRob3V0IHN0YWdlZnJpZ2h0IGFzc2VydGluZy4KICAgICBwYXJhbXMucHJldmlld0NhbGxiYWNrRmxhZ3MgPSAwOwogCi0gICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtPAotICAgICAgICAgICAgU3RyZWFtaW5nUHJvY2Vzc29yLAotICAgICAgICAgICAgJlN0cmVhbWluZ1Byb2Nlc3Nvcjo6dXBkYXRlUmVjb3JkaW5nU3RyZWFtPihtU3RyZWFtaW5nUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byB1cGRhdGUgcmVjb3JkaW5nIHN0cmVhbTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICByZXR1cm4gcmVzOworICAgIGlmIChtRGV2aWNlVmVyc2lvbiAhPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMCkgeworICAgICAgICAvLyBGb3IgbmV3ZXIgZGV2aWNlcywgbWF5IG5lZWQgdG8gcmVjb25maWd1cmUgdmlkZW8gc25hcHNob3QgSlBFRyBzaXplcworICAgICAgICAvLyBkdXJpbmcgcmVjb3JkaW5nIHN0YXJ0dXAsIHNvIG5lZWQgYSBtb3JlIGNvbXBsZXggc2VxdWVuY2UgaGVyZSB0bworICAgICAgICAvLyBlbnN1cmUgYW4gZWFybHkgc3RyZWFtIHJlY29uZmlndXJhdGlvbiBkb2Vzbid0IGhhcHBlbgorICAgICAgICBib29sIHJlY29yZGluZ1N0cmVhbU5lZWRzVXBkYXRlOworICAgICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT5yZWNvcmRpbmdTdHJlYW1OZWVkc1VwZGF0ZShwYXJhbXMsICZyZWNvcmRpbmdTdHJlYW1OZWVkc1VwZGF0ZSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBxdWVyeSByZWNvcmRpbmcgc3RyZWFtIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWNvcmRpbmdTdHJlYW1OZWVkc1VwZGF0ZSkgeworICAgICAgICAgICAgLy8gTmVlZCB0byBzdG9wIHN0cmVhbSBoZXJlIHNvIHVwZGF0ZVByb2Nlc3NvclN0cmVhbSB3b24ndCB0cmlnZ2VyIGNvbmZpZ3VyZVN0cmVhbQorICAgICAgICAgICAgLy8gUmlnaHQgbm93IGNhbWVyYSBkZXZpY2UgY2Fubm90IGhhbmRsZSBjb25maWd1cmVTdHJlYW0gZmFpbHVyZSBncmFjZWZ1bGx5CisgICAgICAgICAgICAvLyB3aGVuIGRldmljZSBpcyBzdHJlYW1pbmcKKyAgICAgICAgICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPnN0b3BTdHJlYW0oKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3Qgc3RvcCBzdHJlYW1pbmcgdG8gdXBkYXRlIHJlY29yZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBtRGV2aWNlLT53YWl0VW50aWxEcmFpbmVkKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFdhaXRpbmcgdG8gc3RvcCBzdHJlYW1pbmcgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbTwKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtaW5nUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAmU3RyZWFtaW5nUHJvY2Vzc29yOjp1cGRhdGVSZWNvcmRpbmdTdHJlYW0+KAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbWluZ1Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byB1cGRhdGUgcmVjb3JkaW5nIHN0cmVhbTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBNYWludGFpbiBjYWxsIHNlcXVlbmNpbmcgZm9yIEhBTHYyIGRldmljZXMuCisgICAgICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbTwKKyAgICAgICAgICAgICAgICBTdHJlYW1pbmdQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgJlN0cmVhbWluZ1Byb2Nlc3Nvcjo6dXBkYXRlUmVjb3JkaW5nU3RyZWFtPihtU3RyZWFtaW5nUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIHVwZGF0ZSByZWNvcmRpbmcgc3RyZWFtOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQogICAgIH0KIAogICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1zOwpAQCAtMTAzNSw2ICsxMTU3LDE2IEBACiAKICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT5zdGFydFN0cmVhbShTdHJlYW1pbmdQcm9jZXNzb3I6OlJFQ09SRCwKICAgICAgICAgICAgIG91dHB1dFN0cmVhbXMpOworCisgICAgLy8gc3RhcnRTdHJlYW0gbWlnaHQgdHJpZ2dlciBhIGNvbmZpZ3VyZVN0cmVhbSBjYWxsIGFuZCBkZXZpY2UgbWlnaHQgZmFpbAorICAgIC8vIGNvbmZpZ3VyZVN0cmVhbSBkdWUgdG8ganBlZyBzaXplID4gdmlkZW8gc2l6ZS4gVHJ5IGFnYWluIHdpdGgganBlZyBzaXplIG92ZXJyaWRkZW4KKyAgICAvLyB0byB2aWRlbyBzaXplLgorICAgIGlmIChyZXMgPT0gQkFEX1ZBTFVFKSB7CisgICAgICAgIG92ZXJyaWRlVmlkZW9TbmFwc2hvdFNpemUocGFyYW1zKTsKKyAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+c3RhcnRTdHJlYW0oU3RyZWFtaW5nUHJvY2Vzc29yOjpSRUNPUkQsCisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtcyk7CisgICAgfQorCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIHN0YXJ0IHJlY29yZGluZyBzdHJlYW06ICVzICglZCkiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTExMTksNiArMTI1MSw4IEBACiAgICAgewogICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogICAgICAgICBpZiAobC5tUGFyYW1ldGVycy5zdGF0ZSA8IFBhcmFtZXRlcnM6OlBSRVZJRVcpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYWxsIGF1dG9Gb2N1cyB3aGVuIHByZXZpZXcgaXMgaW5hY3RpdmUgKHN0YXRlID0gJWQpLiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBsLm1QYXJhbWV0ZXJzLnN0YXRlKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCkBAIC0xMTYxLDcgKzEyOTUsNyBAQAogICAgICAgICAgKiBIYW5kbGUgcXVpcmsgbW9kZSBmb3IgQUYgaW4gc2NlbmUgbW9kZXMKICAgICAgICAgICovCiAgICAgICAgIGlmIChsLm1QYXJhbWV0ZXJzLnF1aXJrcy50cmlnZ2VyQWZXaXRoQXV0byAmJgotICAgICAgICAgICAgICAgIGwubVBhcmFtZXRlcnMuc2NlbmVNb2RlICE9IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEICYmCisgICAgICAgICAgICAgICAgbC5tUGFyYW1ldGVycy5zY2VuZU1vZGUgIT0gQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQgJiYKICAgICAgICAgICAgICAgICBsLm1QYXJhbWV0ZXJzLmZvY3VzTW9kZSAhPSBQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0FVVE8gJiYKICAgICAgICAgICAgICAgICAhbC5tUGFyYW1ldGVycy5mb2N1c2luZ0FyZWFzWzBdLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgQUxPR1YoIiVzOiBRdWlyazogU3dpdGNoaW5nIGZyb20gZm9jdXNNb2RlICVkIHRvIEFVVE8iLApAQCAtMTIxOCw2ICsxMzUyLDkgQEAKIAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CisgICAgICAgIGlmIChsLm1QYXJhbWV0ZXJzLnpzbE1vZGUpIHsKKyAgICAgICAgICAgIG1ac2xQcm9jZXNzb3ItPmNsZWFyWnNsUXVldWUoKTsKKyAgICAgICAgfQogICAgIH0KICAgICBzeW5jV2l0aERldmljZSgpOwogCkBAIC0xMjY1LDEzICsxNDAyLDI4IEBACiAKICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN0YXJ0aW5nIHBpY3R1cmUgY2FwdHVyZSIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKIAorICAgICAgICBpbnQgbGFzdEpwZWdTdHJlYW1JZCA9IG1KcGVnUHJvY2Vzc29yLT5nZXRTdHJlYW1JZCgpOwogICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIGwubVBhcmFtZXRlcnMpOworICAgICAgICAvLyBJZiB2aWRlbyBzbmFwc2hvdCBmYWlsIHRvIGNvbmZpZ3VyZVN0cmVhbSwgdHJ5IG92ZXJyaWRlIHZpZGVvIHNuYXBzaG90IHNpemUgdG8KKyAgICAgICAgLy8gdmlkZW8gc2l6ZQorICAgICAgICBpZiAocmVzID09IEJBRF9WQUxVRSAmJiBsLm1QYXJhbWV0ZXJzLnN0YXRlID09IFBhcmFtZXRlcnM6OlZJREVPX1NOQVBTSE9UKSB7CisgICAgICAgICAgICBvdmVycmlkZVZpZGVvU25hcHNob3RTaXplKGwubVBhcmFtZXRlcnMpOworICAgICAgICAgICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1KcGVnUHJvY2Vzc29yLCBsLm1QYXJhbWV0ZXJzKTsKKyAgICAgICAgfQogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3Qgc2V0IHVwIHN0aWxsIGltYWdlIHN0cmVhbTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICAgICAgdGFrZVBpY3R1cmVDb3VudGVyID0gKytsLm1QYXJhbWV0ZXJzLnRha2VQaWN0dXJlQ291bnRlcjsKKworICAgICAgICAvLyBDbGVhciBaU0wgYnVmZmVyIHF1ZXVlIHdoZW4gSnBlZyBzaXplIGlzIGNoYW5nZWQuCisgICAgICAgIGJvb2wganBlZ1N0cmVhbUNoYW5nZWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKSAhPSBsYXN0SnBlZ1N0cmVhbUlkOworICAgICAgICBpZiAobC5tUGFyYW1ldGVycy56c2xNb2RlICYmIGpwZWdTdHJlYW1DaGFuZ2VkKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQ2xlYXIgWlNMIGJ1ZmZlciBxdWV1ZSB3aGVuIEpwZWcgc2l6ZSBpcyBjaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgbVpzbFByb2Nlc3Nvci0+Y2xlYXJac2xRdWV1ZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQVRSQUNFX0FTWU5DX0JFR0lOKGtUYWtlcGljdHVyZUxhYmVsLCB0YWtlUGljdHVyZUNvdW50ZXIpOwpAQCAtMTI5Nyw4ICsxNDQ5LDE0IEBACiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogCisgICAgUGFyYW1ldGVyczo6Zm9jdXNNb2RlX3QgZm9jdXNNb2RlQmVmb3JlID0gbC5tUGFyYW1ldGVycy5mb2N1c01vZGU7CiAgICAgcmVzID0gbC5tUGFyYW1ldGVycy5zZXQocGFyYW1zKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIFBhcmFtZXRlcnM6OmZvY3VzTW9kZV90IGZvY3VzTW9kZUFmdGVyID0gbC5tUGFyYW1ldGVycy5mb2N1c01vZGU7CisKKyAgICBpZiAobC5tUGFyYW1ldGVycy56c2xNb2RlICYmIGZvY3VzTW9kZUFmdGVyICE9IGZvY3VzTW9kZUJlZm9yZSkgeworICAgICAgICBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CisgICAgfQogCiAgICAgcmVzID0gdXBkYXRlUmVxdWVzdHMobC5tUGFyYW1ldGVycyk7CiAKQEAgLTEzMDksNyArMTQ2Nyw4IEBACiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7Ci0gICAgaWYgKCBjaGVja1BpZChfX0ZVTkNUSU9OX18pICE9IE9LKSByZXR1cm4gU3RyaW5nOCgpOworICAgIC8vIFRoZSBjYW1lcmEgc2VydmljZSBjYW4gdW5jb25kaXRpb25hbGx5IGdldCB0aGUgcGFyYW1ldGVycyBhdCBhbGwgdGltZXMKKyAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgIT0gT0spIHJldHVybiBTdHJpbmc4KCk7CiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpSZWFkTG9jayBsKG1QYXJhbWV0ZXJzKTsKIApAQCAtMTM4OSw2ICsxNTQ4LDEzIEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKKyAgICAvLyB0aGUgY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGUgY2FuIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBzaHV0dGVyIHNvdW5kCisgICAgaWYgKG1MZWdhY3lNb2RlKSB7CisgICAgICAgIEFMT0dWKCIlczogRGlzYWJsZSBzaHV0dGVyIHNvdW5kIGluIGxlZ2FjeSBtb2RlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgbC5tUGFyYW1ldGVycy5wbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKICAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBtYXkgbm90IGJlIGFsbG93ZWQuIEluIHRoYXQgY2FzZSBvbmx5CiAgICAgLy8gYWxsb3cgdGhlIG1lZGlhc2VydmVyIHByb2Nlc3MgdG8gZGlzYWJsZSB0aGUgc291bmQuCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwpAQCAtMTY1NCw4ICsxODIwLDggQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6cmVnaXN0ZXJGcmFtZUxpc3RlbmVyKGludDMyX3QgbWluSWQsIGludDMyX3QgbWF4SWQsCi0gICAgICAgIHdwPGNhbWVyYTI6OkZyYW1lUHJvY2Vzc29yOjpGaWx0ZXJlZExpc3RlbmVyPiBsaXN0ZW5lcikgewotICAgIHJldHVybiBtRnJhbWVQcm9jZXNzb3ItPnJlZ2lzdGVyTGlzdGVuZXIobWluSWQsIG1heElkLCBsaXN0ZW5lcik7CisgICAgICAgIHdwPGNhbWVyYTI6OkZyYW1lUHJvY2Vzc29yOjpGaWx0ZXJlZExpc3RlbmVyPiBsaXN0ZW5lciwgYm9vbCBzZW5kUGFydGlhbHMpIHsKKyAgICByZXR1cm4gbUZyYW1lUHJvY2Vzc29yLT5yZWdpc3Rlckxpc3RlbmVyKG1pbklkLCBtYXhJZCwgbGlzdGVuZXIsIHNlbmRQYXJ0aWFscyk7CiB9CiAKIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OnJlbW92ZUZyYW1lTGlzdGVuZXIoaW50MzJfdCBtaW5JZCwgaW50MzJfdCBtYXhJZCwKQEAgLTE4MjQsNiArMTk5MCwxOCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYTJDbGllbnQ6Om92ZXJyaWRlVmlkZW9TbmFwc2hvdFNpemUoUGFyYW1ldGVycyAmcGFyYW1zKSB7CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IGNvbmZpZ3VyZSBzdGlsbCBzaXplIHRvIHZpZGVvIHNpemUgYmVmb3JlIHJlY29yZGluZyIKKyAgICAgICAgICAgICwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgIHBhcmFtcy5vdmVycmlkZUpwZWdTaXplQnlWaWRlb1NpemUoKTsKKyAgICBzdGF0dXNfdCByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIHBhcmFtcyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3Qgb3ZlcnJpZGUgdmlkZW8gc25hcHNob3Qgc2l6ZSB0byB2aWRlbyBzaXplOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKIGNvbnN0IGNoYXIqIENhbWVyYTJDbGllbnQ6OmtBdXRvZm9jdXNMYWJlbCA9ICJhdXRvZm9jdXMiOwogY29uc3QgY2hhciogQ2FtZXJhMkNsaWVudDo6a1Rha2VwaWN0dXJlTGFiZWwgPSAidGFrZV9waWN0dXJlIjsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAppbmRleCBmZTBiZjc0Li5kNjhiYjI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaApAQCAtOTAsNyArOTAsNyBAQAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgaW50IGRldmljZVZlcnNpb24pOworICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTJDbGllbnQoKTsKIApAQCAtMTE4LDcgKzExOCw4IEBACiAgICAgaW50IGdldFpzbFN0cmVhbUlkKCkgY29uc3Q7CiAKICAgICBzdGF0dXNfdCByZWdpc3RlckZyYW1lTGlzdGVuZXIoaW50MzJfdCBtaW5JZCwgaW50MzJfdCBtYXhJZCwKLSAgICAgICAgICAgIHdwPGNhbWVyYTI6OkZyYW1lUHJvY2Vzc29yOjpGaWx0ZXJlZExpc3RlbmVyPiBsaXN0ZW5lcik7CisgICAgICAgICAgICB3cDxjYW1lcmEyOjpGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIsCisgICAgICAgICAgICBib29sIHNlbmRQYXJ0aWFscyA9IHRydWUpOwogICAgIHN0YXR1c190IHJlbW92ZUZyYW1lTGlzdGVuZXIoaW50MzJfdCBtaW5JZCwgaW50MzJfdCBtYXhJZCwKICAgICAgICAgICAgIHdwPGNhbWVyYTI6OkZyYW1lUHJvY2Vzc29yOjpGaWx0ZXJlZExpc3RlbmVyPiBsaXN0ZW5lcik7CiAKQEAgLTE3MCw3ICsxNzEsNiBAQAogCiAgICAgdm9pZCAgICAgc2V0UHJldmlld0NhbGxiYWNrRmxhZ0woUGFyYW1ldGVycyAmcGFyYW1zLCBpbnQgZmxhZyk7CiAgICAgc3RhdHVzX3QgdXBkYXRlUmVxdWVzdHMoUGFyYW1ldGVycyAmcGFyYW1zKTsKLSAgICBpbnQgbURldmljZVZlcnNpb247CiAKICAgICAvLyBVc2VkIHdpdGggc3RyZWFtIElEcwogICAgIHN0YXRpYyBjb25zdCBpbnQgTk9fU1RSRUFNID0gLTE7CkBAIC0yMDQsOSArMjA0LDEzIEBACiAgICAgYm9vbCBtQWZJbk1vdGlvbjsKIAogICAgIC8qKiBVdGlsaXR5IG1lbWJlcnMgKi8KKyAgICBib29sIG1MZWdhY3lNb2RlOwogCiAgICAgLy8gV2FpdCB1bnRpbCB0aGUgY2FtZXJhIGRldmljZSBoYXMgcmVjZWl2ZWQgdGhlIGxhdGVzdCBjb250cm9sIHNldHRpbmdzCiAgICAgc3RhdHVzX3Qgc3luY1dpdGhEZXZpY2UoKTsKKworICAgIC8vIFZpZGVvIHNuYXBzaG90IGpwZWcgc2l6ZSBvdmVycmlkaW5nIGhlbHBlciBmdW5jdGlvbgorICAgIHN0YXR1c190IG92ZXJyaWRlVmlkZW9TbmFwc2hvdFNpemUoUGFyYW1ldGVycyAmcGFyYW1zKTsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKaW5kZXggYmQ2ODA1ZC4uMWE0ZDlhNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcApAQCAtMzgsNyArMzgsNyBAQAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgaW50IGNsaWVudFVpZCwKLSAgICAgICAgaW50IHNlcnZpY2VQaWQpOgorICAgICAgICBpbnQgc2VydmljZVBpZCwgYm9vbCBsZWdhY3lNb2RlKToKICAgICAgICAgQ2xpZW50KGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpCiB7CkBAIC01NCw2ICs1NCw3IEBACiAgICAgLy8gQ2FsbGJhY2sgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAogICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKICAgICBtT3JpZW50YXRpb24gPSBnZXRPcmllbnRhdGlvbigwLCBtQ2FtZXJhRmFjaW5nID09IENBTUVSQV9GQUNJTkdfRlJPTlQpOworICAgIG1MZWdhY3lNb2RlID0gbGVnYWN5TW9kZTsKICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IHRydWU7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgWCAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiB9CkBAIC03OSwxMyArODAsMTMgQEAKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IHVuYWJsZSB0byBpbml0aWFsaXplIGRldmljZTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICBtSGFyZHdhcmUuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCiAgICAgbUhhcmR3YXJlLT5zZXRDYWxsYmFja3Mobm90aWZ5Q2FsbGJhY2ssCiAgICAgICAgICAgICBkYXRhQ2FsbGJhY2ssCiAgICAgICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAsCi0gICAgICAgICAgICAodm9pZCAqKW1DYW1lcmFJZCk7CisgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbUNhbWVyYUlkKTsKIAogICAgIC8vIEVuYWJsZSB6b29tLCBlcnJvciwgZm9jdXMsIGFuZCBtZXRhZGF0YSBtZXNzYWdlcyBieSBkZWZhdWx0CiAgICAgZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX0VSUk9SIHwgQ0FNRVJBX01TR19aT09NIHwgQ0FNRVJBX01TR19GT0NVUyB8CkBAIC0xMjEsNiArMTIyLDE2IEBACiAgICAgICAgICAgICBtQ2xpZW50UGlkKTsKICAgICBsZW4gPSAobGVuID4gU0laRSAtIDEpID8gU0laRSAtIDEgOiBsZW47CiAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgbGVuKTsKKworICAgIGxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkxhdGVzdCBzZXQgcGFyYW1ldGVyczpcbiIpOworICAgIGxlbiA9IChsZW4gPiBTSVpFIC0gMSkgPyBTSVpFIC0gMSA6IGxlbjsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBsZW4pOworCisgICAgbUxhdGVzdFNldFBhcmFtZXRlcnMuZHVtcChmZCwgYXJncyk7CisKKyAgICBjb25zdCBjaGFyICplbmRkdW1wID0gIlxuXG4iOworICAgIHdyaXRlKGZkLCBlbmRkdW1wLCBzdHJsZW4oZW5kZHVtcCkpOworCiAgICAgcmV0dXJuIG1IYXJkd2FyZS0+ZHVtcChmZCwgYXJncyk7CiB9CiAKQEAgLTU0OSw2ICs1NjAsNyBAQAogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwogCisgICAgbUxhdGVzdFNldFBhcmFtZXRlcnMgPSBDYW1lcmFQYXJhbWV0ZXJzKHBhcmFtcyk7CiAgICAgQ2FtZXJhUGFyYW1ldGVycyBwKHBhcmFtcyk7CiAgICAgcmV0dXJuIG1IYXJkd2FyZS0+c2V0UGFyYW1ldGVycyhwKTsKIH0KQEAgLTU1Niw3ICs1NjgsOCBAQAogLy8gZ2V0IHByZXZpZXcvY2FwdHVyZSBwYXJhbWV0ZXJzIC0ga2V5L3ZhbHVlIHBhaXJzCiBTdHJpbmc4IENhbWVyYUNsaWVudDo6Z2V0UGFyYW1ldGVycygpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIFN0cmluZzgoKTsKKyAgICAvLyBUaGUgY2FtZXJhIHNlcnZpY2UgY2FuIHVuY29uZGl0aW9uYWxseSBnZXQgdGhlIHBhcmFtZXRlcnMgYXQgYWxsIHRpbWVzCisgICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBTdHJpbmc4KCk7CiAKICAgICBTdHJpbmc4IHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKS5mbGF0dGVuKCkpOwogICAgIExPRzEoImdldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIGdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKQEAgLTU3NSw2ICs1ODgsMTMgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIC8vIHRoZSBjYW1lcmEyIGFwaSBsZWdhY3kgbW9kZSBjYW4gdW5jb25kaXRpb25hbGx5IGRpc2FibGUgdGhlIHNodXR0ZXIgc291bmQKKyAgICBpZiAobUxlZ2FjeU1vZGUpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBEaXNhYmxlIHNodXR0ZXIgc291bmQgaW4gbGVnYWN5IG1vZGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgbWF5IG5vdCBiZSBhbGxvd2VkLiBJbiB0aGF0IGNhc2Ugb25seQogICAgIC8vIGFsbG93IHRoZSBtZWRpYXNlcnZlciBwcm9jZXNzIHRvIGRpc2FibGUgdGhlIHNvdW5kLgogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKQEAgLTkyOSw3ICs5NDksMjAgQEAKICAgICB9CiAgICAgcHJldmlld0J1ZmZlciA9IG1QcmV2aWV3QnVmZmVyOwogCi0gICAgbWVtY3B5KHByZXZpZXdCdWZmZXItPmJhc2UoKSwgKHVpbnQ4X3QgKiloZWFwLT5iYXNlKCkgKyBvZmZzZXQsIHNpemUpOworICAgIHZvaWQqIHByZXZpZXdCdWZmZXJCYXNlID0gcHJldmlld0J1ZmZlci0+YmFzZSgpOworICAgIHZvaWQqIGhlYXBCYXNlID0gaGVhcC0+YmFzZSgpOworCisgICAgaWYgKGhlYXBCYXNlID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbW1hcCBoZWFwIGZvciBwcmV2aWV3IGZyYW1lLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChwcmV2aWV3QnVmZmVyQmFzZSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIG1tYXAgcHJldmlldyBidWZmZXIgZm9yIHByZXZpZXcgZnJhbWUuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtZW1jcHkocHJldmlld0J1ZmZlckJhc2UsICh1aW50OF90ICopIGhlYXBCYXNlICsgb2Zmc2V0LCBzaXplKTsKIAogICAgIHNwPE1lbW9yeUJhc2U+IGZyYW1lID0gbmV3IE1lbW9yeUJhc2UocHJldmlld0J1ZmZlciwgMCwgc2l6ZSk7CiAgICAgaWYgKGZyYW1lID09IDApIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCmluZGV4IDRiODk1NjQuLjYzYTlkMGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaApAQCAtNjQsNyArNjQsOCBAQAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOworICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQsCisgICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUgPSBmYWxzZSk7CiAgICAgfkNhbWVyYUNsaWVudCgpOwogCiAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSk7CkBAIC0xMjksNiArMTMwLDcgQEAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWVudGF0aW9uOyAgICAgLy8gQ3VycmVudCBkaXNwbGF5IG9yaWVudGF0aW9uCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheVNodXR0ZXJTb3VuZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MZWdhY3lNb2RlOyAvLyBjYW1lcmEyIGFwaSBsZWdhY3kgbW9kZT8KIAogICAgIC8vIEVuc3VyZXMgYXRvbWljaXR5IGFtb25nIHRoZSBwdWJsaWMgbWV0aG9kcwogICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CkBAIC0xNDAsNiArMTQyLDkgQEAKICAgICAvLyBvZiB0aGUgb3JpZ2luYWwgb25lKSwgd2UgYWxsb2NhdGUgbVByZXZpZXdCdWZmZXIgYW5kIHJldXNlIGl0IGlmIHBvc3NpYmxlLgogICAgIHNwPE1lbW9yeUhlYXBCYXNlPiAgICAgICAgICAgICAgbVByZXZpZXdCdWZmZXI7CiAKKyAgICAvLyBEZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKyAgICBDYW1lcmFQYXJhbWV0ZXJzICAgICAgICAgICAgICAgIG1MYXRlc3RTZXRQYXJhbWV0ZXJzOworCiAgICAgLy8gV2UgbmVlZCB0byBhdm9pZCB0aGUgZGVhZGxvY2sgd2hlbiB0aGUgaW5jb21pbmcgY29tbWFuZCB0aHJlYWQgYW5kCiAgICAgLy8gdGhlIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlIGNhbGxiYWNrIHRocmVhZCBib3RoIHdhbnQgdG8gZ3JhYiBtTG9jay4KICAgICAvLyBBbiBleHRyYSBmbGFnIGlzIHVzZWQgdG8gdGVsbCB0aGUgY2FsbGJhY2sgdGhyZWFkIHRoYXQgaXQgc2hvdWxkIHN0b3AKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCmluZGV4IGQyYWM3OWMuLmJmMzMxOGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcApAQCAtMTEwLDExICsxMTAsMTMgQEAKICAgICBpZiAoIW1DYWxsYmFja1RvQXBwICYmIG1DYWxsYmFja0NvbnN1bWVyID09IDApIHsKICAgICAgICAgLy8gQ3JlYXRlIENQVSBidWZmZXIgcXVldWUgZW5kcG9pbnQsIHNpbmNlIGFwcCBoYXNuJ3QgZ2l2ZW4gdXMgb25lCiAgICAgICAgIC8vIE1ha2UgaXQgYXN5bmMgdG8gYXZvaWQgZGlzY29ubmVjdCBkZWFkbG9ja3MKLSAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgIG1DYWxsYmFja0NvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGJxLCBrQ2FsbGJhY2tIZWFwQ291bnQpOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgIG1DYWxsYmFja0NvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCBrQ2FsbGJhY2tIZWFwQ291bnQpOwogICAgICAgICBtQ2FsbGJhY2tDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgbUNhbGxiYWNrQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMkNsaWVudDo6Q2FsbGJhY2tDb25zdW1lciIpKTsKLSAgICAgICAgbUNhbGxiYWNrV2luZG93ID0gbmV3IFN1cmZhY2UoYnEpOworICAgICAgICBtQ2FsbGJhY2tXaW5kb3cgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgfQogCiAgICAgaWYgKG1DYWxsYmFja1N0cmVhbUlkICE9IE5PX1NUUkVBTSkgewpAQCAtMTUzLDcgKzE1NSw3IEBACiAgICAgICAgICAgICAgICAgY2FsbGJhY2tGb3JtYXQsIHBhcmFtcy5wcmV2aWV3Rm9ybWF0KTsKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obUNhbGxiYWNrV2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0LAotICAgICAgICAgICAgICAgIGNhbGxiYWNrRm9ybWF0LCAwLCAmbUNhbGxiYWNrU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrRm9ybWF0LCAmbUNhbGxiYWNrU3RyZWFtSWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0gZm9yIGNhbGxiYWNrczogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCmluZGV4IDhhNGNlNGUuLjk4NDlmNGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKQEAgLTE4LDYgKzE4LDggQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC0xMDQsMTMgKzEwNiwxMiBAQAogICAgIH0KIH0KIAotdm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUpIHsKLSAgICBBTE9HVigiJXM6IExpc3RlbmVyIGZvdW5kIG5ldyBmcmFtZSIsIF9fRlVOQ1RJT05fXyk7Cit2b2lkIENhcHR1cmVTZXF1ZW5jZXI6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiBOZXcgcmVzdWx0IGF2YWlsYWJsZS4iLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKLSAgICBtTmV3RnJhbWVJZCA9IHJlcXVlc3RJZDsKLSAgICBtTmV3RnJhbWUgPSBmcmFtZTsKKyAgICBtTmV3RnJhbWVJZCA9IHJlc3VsdC5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBtTmV3RnJhbWUgPSByZXN1bHQubU1ldGFkYXRhOwogICAgIGlmICghbU5ld0ZyYW1lUmVjZWl2ZWQpIHsKICAgICAgICAgbU5ld0ZyYW1lUmVjZWl2ZWQgPSB0cnVlOwogICAgICAgICBtTmV3RnJhbWVTaWduYWwuc2lnbmFsKCk7CkBAIC0zNDksOCArMzUwLDEwIEBACiAgICAgICAgIHJldHVybiBET05FOwogICAgIH0KIAorICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZ2V0IHBhcnRpYWwgcmVzdWx0cyBmb3IgWlNMIGNhcHR1cmUuCiAgICAgY2xpZW50LT5yZWdpc3RlckZyYW1lTGlzdGVuZXIobUNhcHR1cmVJZCwgbUNhcHR1cmVJZCArIDEsCi0gICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAvKnNlbmRQYXJ0aWFscyovZmFsc2UpOwogCiAgICAgLy8gVE9ETzogQWN0dWFsbHkgc2VsZWN0IHRoZSByaWdodCB0aGluZyBoZXJlLgogICAgIHJlcyA9IHByb2Nlc3Nvci0+cHVzaFRvUmVwcm9jZXNzKG1DYXB0dXJlSWQpOwpAQCAtMzkyLDggKzM5NSwxNCBAQAogCiAgICAgYm9vbCBpc0FlQ29udmVyZ2VkID0gZmFsc2U7CiAgICAgLy8gR2V0IHRoZSBvbkZyYW1lQXZhaWxhYmxlIGNhbGxiYWNrIHdoZW4gdGhlIHJlcXVlc3RJRCA9PSBtQ2FwdHVyZUlkCisgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBnZXQgcGFydGlhbCByZXN1bHRzIGZvciBub3JtYWwgY2FwdHVyZSwgYXMgd2UgbmVlZAorICAgIC8vIEdldCBBTkRST0lEX1NFTlNPUl9USU1FU1RBTVAgZnJvbSB0aGUgY2FwdHVyZSByZXN1bHQsIGJ1dCBwYXJ0aWFsCisgICAgLy8gcmVzdWx0IGRvZXNuJ3QgaGF2ZSB0byBoYXZlIHRoaXMgbWV0YWRhdGEgYXZhaWxhYmxlLgorICAgIC8vIFRPRE86IFVwZGF0ZSB0byB1c2UgdGhlIEhBTHYzIHNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciByZW1vdmUgdGhlCisgICAgLy8gbmVlZCBmb3IgdGhpcyBsaXN0ZW5lciBhbmQgbWFrZSBpdCBmYXN0ZXIuIHNlZSBidWcgMTI1MzA2MjguCiAgICAgY2xpZW50LT5yZWdpc3RlckZyYW1lTGlzdGVuZXIobUNhcHR1cmVJZCwgbUNhcHR1cmVJZCArIDEsCi0gICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAvKnNlbmRQYXJ0aWFscyovZmFsc2UpOwogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CkBAIC00MzYsMTEgKzQ0NSwxOCBAQAogICAgIGlmIChtTmV3QUVTdGF0ZSkgewogICAgICAgICBpZiAoIW1BZUluUHJlY2FwdHVyZSkgewogICAgICAgICAgICAgLy8gV2FpdGluZyB0byBzZWUgUFJFQ0FQVFVSRSBzdGF0ZQotICAgICAgICAgICAgaWYgKG1BRVRyaWdnZXJJZCA9PSBtVHJpZ2dlcklkICYmCi0gICAgICAgICAgICAgICAgICAgIG1BRVN0YXRlID09IEFORFJPSURfQ09OVFJPTF9BRV9TVEFURV9QUkVDQVBUVVJFKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBHb3QgcHJlY2FwdHVyZSBzdGFydCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgbUFlSW5QcmVjYXB0dXJlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtVGltZW91dENvdW50ID0ga01heFRpbWVvdXRzRm9yUHJlY2FwdHVyZUVuZDsKKyAgICAgICAgICAgIGlmIChtQUVUcmlnZ2VySWQgPT0gbVRyaWdnZXJJZCkgeworICAgICAgICAgICAgICAgIGlmIChtQUVTdGF0ZSA9PSBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEVfUFJFQ0FQVFVSRSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IEdvdCBwcmVjYXB0dXJlIHN0YXJ0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgbUFlSW5QcmVjYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVvdXRDb3VudCA9IGtNYXhUaW1lb3V0c0ZvclByZWNhcHR1cmVFbmQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQUVTdGF0ZSA9PSBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEVfQ09OVkVSR0VEIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtQUVTdGF0ZSA9PSBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEVfRkxBU0hfUkVRVUlSRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXQgaXMgbGVnYWwgdG8gdHJhbnNpdCB0byBDT05WRVJHRUQgb3IgRkxBU0hfUkVRVUlSRUQKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgYSB0cmlnZ2VyLgorICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IEFFIGlzIGFscmVhZHkgaW4gZ29vZCBzdGF0ZSwgc3RhcnQgY2FwdHVyZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFOREFSRF9DQVBUVVJFOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFdhaXRpbmcgdG8gc2VlIFBSRUNBUFRVUkUgc3RhdGUgZW5kCkBAIC01ODMsMTIgKzU5OSwxNSBAQAogICAgICAgICBlbnRyeSA9IG1OZXdGcmFtZS5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CiAgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiTm8gdGltZXN0YW1wIGZpZWxkIGluIGNhcHR1cmUgZnJhbWUhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVudHJ5LmRhdGEuaTY0WzBdICE9IG1DYXB0dXJlVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICBBTE9HVygiTWlzbWF0Y2hlZCBjYXB0dXJlIHRpbWVzdGFtcHM6IE1ldGFkYXRhIGZyYW1lICVsbGQsIgotICAgICAgICAgICAgICAgICAgICAiIGNhcHR1cmVkIGJ1ZmZlciAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pNjRbMF0sCi0gICAgICAgICAgICAgICAgICAgIG1DYXB0dXJlVGltZXN0YW1wKTsKKyAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgICAgICBpZiAoZW50cnkuZGF0YS5pNjRbMF0gIT0gbUNhcHR1cmVUaW1lc3RhbXApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiTWlzbWF0Y2hlZCBjYXB0dXJlIHRpbWVzdGFtcHM6IE1ldGFkYXRhIGZyYW1lICUiIFBSSWQ2NCAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgY2FwdHVyZWQgYnVmZmVyICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTY0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhcHR1cmVUaW1lc3RhbXApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIlRpbWVzdGFtcCBtZXRhZGF0YSBpcyBtYWxmb3JtZWQhIik7CiAgICAgICAgIH0KICAgICAgICAgY2xpZW50LT5yZW1vdmVGcmFtZUxpc3RlbmVyKG1DYXB0dXJlSWQsIG1DYXB0dXJlSWQgKyAxLCB0aGlzKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKaW5kZXggOWZiNGVlNy4uZDQyYWIxMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KICNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogI2luY2x1ZGUgIlBhcmFtZXRlcnMuaCIKICNpbmNsdWRlICJGcmFtZVByb2Nlc3Nvci5oIgogCkBAIC02MSw4ICs2Miw4IEBACiAgICAgLy8gTm90aWZpY2F0aW9ucyBhYm91dCBBRSBzdGF0ZSBjaGFuZ2VzCiAgICAgdm9pZCBub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CiAKLSAgICAvLyBOb3RpZmljYXRpb25zIGZyb20gdGhlIGZyYW1lIHByb2Nlc3NvcgotICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLCBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUpOworICAgIC8vIE5vdGlmaWNhdGlvbiBmcm9tIHRoZSBmcmFtZSBwcm9jZXNzb3IKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KTsKIAogICAgIC8vIE5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgSlBFRyBwcm9jZXNzb3IKICAgICB2b2lkIG9uQ2FwdHVyZUF2YWlsYWJsZShuc2Vjc190IHRpbWVzdGFtcCwgc3A8TWVtb3J5QmFzZT4gY2FwdHVyZUJ1ZmZlcik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcAppbmRleCAxOWFjYWU0Li4zMTJhNzhjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKQEAgLTQwLDcgKzQwLDEyIEBACiAKICAgICB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChjbGllbnQtPmdldFBhcmFtZXRlcnMoKSk7Ci0gICAgICAgIG1Vc2VQYXJ0aWFsUXVpcmsgPSBsLm1QYXJhbWV0ZXJzLnF1aXJrcy5wYXJ0aWFsUmVzdWx0czsKKworICAgICAgICBpZiAoY2xpZW50LT5nZXRDYW1lcmFEZXZpY2VWZXJzaW9uKCkgPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0ID0gKG1OdW1QYXJ0aWFsUmVzdWx0cyA+IDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQgPSBsLm1QYXJhbWV0ZXJzLnF1aXJrcy5wYXJ0aWFsUmVzdWx0czsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIEluaXRpYWxpemUgc3RhcnRpbmcgM0Egc3RhdGUKICAgICAgICAgbTNhU3RhdGUuYWZUcmlnZ2VySWQgPSBsLm1QYXJhbWV0ZXJzLmFmVHJpZ2dlckNvdW50ZXI7CkBAIC01NSw3ICs2MCw3IEBACiBGcmFtZVByb2Nlc3Nvcjo6fkZyYW1lUHJvY2Vzc29yKCkgewogfQogCi1ib29sIEZyYW1lUHJvY2Vzc29yOjpwcm9jZXNzU2luZ2xlRnJhbWUoQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAorYm9vbCBGcmFtZVByb2Nlc3Nvcjo6cHJvY2Vzc1NpbmdsZUZyYW1lKENhcHR1cmVSZXN1bHQgJmZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpIHsKIAogICAgIHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCA9IG1DbGllbnQucHJvbW90ZSgpOwpAQCAtNjMsMTcgKzY4LDIxIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBib29sIHBhcnRpYWxSZXN1bHQgPSBmYWxzZTsKLSAgICBpZiAobVVzZVBhcnRpYWxRdWlyaykgewotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKLSAgICAgICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUKTsKLSAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCAmJgotICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEudThbMF0gPT0gQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFRfUEFSVElBTCkgewotICAgICAgICAgICAgcGFydGlhbFJlc3VsdCA9IHRydWU7CisgICAgYm9vbCBpc1BhcnRpYWxSZXN1bHQgPSBmYWxzZTsKKyAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgaWYgKGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlVmVyc2lvbigpID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgICAgICBpc1BhcnRpYWxSZXN1bHQgPSBmcmFtZS5tUmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA8IG1OdW1QYXJ0aWFsUmVzdWx0czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5OworICAgICAgICAgICAgZW50cnkgPSBmcmFtZS5tTWV0YWRhdGEuZmluZChBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCk7CisgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwICYmCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEudThbMF0gPT0gQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFRfUEFSVElBTCkgeworICAgICAgICAgICAgICAgIGlzUGFydGlhbFJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIXBhcnRpYWxSZXN1bHQgJiYgcHJvY2Vzc0ZhY2VEZXRlY3QoZnJhbWUsIGNsaWVudCkgIT0gT0spIHsKKyAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCAmJiBwcm9jZXNzRmFjZURldGVjdChmcmFtZS5tTWV0YWRhdGEsIGNsaWVudCkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMTY4LDcgKzE3Nyw3IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZmFjZVNjb3Jlc1tpXSA+IDEwMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCIlczogRmFjZSBpbmRleCAlZCB3aXRoIG91dCBvZiByYW5nZSBzY29yZSAlZCIsCisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBGYWNlIGluZGV4ICV6dSB3aXRoIG91dCBvZiByYW5nZSBzY29yZSAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGksIGZhY2VTY29yZXNbaV0pOwogICAgICAgICAgICAgfQogCkBAIC0yMTIsMTQgKzIyMSwxNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgRnJhbWVQcm9jZXNzb3I6OnByb2Nlc3MzYVN0YXRlKGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSwKK3N0YXR1c190IEZyYW1lUHJvY2Vzc29yOjpwcm9jZXNzM2FTdGF0ZShjb25zdCBDYXB0dXJlUmVzdWx0ICZmcmFtZSwKICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4gJmNsaWVudCkgewogCiAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEgPSBmcmFtZS5tTWV0YWRhdGE7CiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnk7CiAgICAgaW50IGNhbWVyYUlkID0gY2xpZW50LT5nZXRDYW1lcmFJZCgpOwogCi0gICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCk7CisgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCk7CiAgICAgaW50MzJfdCBmcmFtZU51bWJlciA9IGVudHJ5LmRhdGEuaTMyWzBdOwogCiAgICAgLy8gRG9uJ3Qgc2VuZCAzQSBub3RpZmljYXRpb25zIGZvciB0aGUgc2FtZSBmcmFtZSBudW1iZXIgdHdpY2UKQEAgLTIzOCwyNiArMjQ4LDMxIEBACiAKICAgICAvLyBUT0RPOiBBbHNvIHVzZSBBRSBtb2RlLCBBRSB0cmlnZ2VyIElECiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8dWludDhfdD4oZnJhbWUsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAorICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCiAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZk1vZGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8dWludDhfdD4oZnJhbWUsIEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSwKKyAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSwKICAgICAgICAgICAgICZuZXczYVN0YXRlLmF3Yk1vZGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8dWludDhfdD4oZnJhbWUsIEFORFJPSURfQ09OVFJPTF9BRV9TVEFURSwKKyAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRV9TVEFURSwKICAgICAgICAgICAgICZuZXczYVN0YXRlLmFlU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8dWludDhfdD4oZnJhbWUsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKKyAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKICAgICAgICAgICAgICZuZXczYVN0YXRlLmFmU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8dWludDhfdD4oZnJhbWUsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCisgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX1NUQVRFLAogICAgICAgICAgICAgJm5ldzNhU3RhdGUuYXdiU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8aW50MzJfdD4oZnJhbWUsIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAotICAgICAgICAgICAgJm5ldzNhU3RhdGUuYWZUcmlnZ2VySWQsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CisgICAgaWYgKGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlVmVyc2lvbigpID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIG5ldzNhU3RhdGUuYWZUcmlnZ2VySWQgPSBmcmFtZS5tUmVzdWx0RXh0cmFzLmFmVHJpZ2dlcklkOworICAgICAgICBuZXczYVN0YXRlLmFlVHJpZ2dlcklkID0gZnJhbWUubVJlc3VsdEV4dHJhcy5wcmVjYXB0dXJlVHJpZ2dlcklkOworICAgIH0gZWxzZSB7CisgICAgICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDxpbnQzMl90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQsCisgICAgICAgICAgICAgICAgICZuZXczYVN0YXRlLmFmVHJpZ2dlcklkLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PGludDMyX3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKLSAgICAgICAgICAgICZuZXczYVN0YXRlLmFlVHJpZ2dlcklkLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOworICAgICAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8aW50MzJfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lELAorICAgICAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZVRyaWdnZXJJZCwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKKyAgICB9CiAKICAgICBpZiAoIWdvdEFsbFN0YXRlcykgcmV0dXJuIEJBRF9WQUxVRTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaAppbmRleCA4NTZhZDMyLi42OGNmNTViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaApAQCAtNTEsMTQgKzUxLDE0IEBACiAKICAgICB2b2lkIHByb2Nlc3NOZXdGcmFtZXMoY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4gJmNsaWVudCk7CiAKLSAgICB2aXJ0dWFsIGJvb2wgcHJvY2Vzc1NpbmdsZUZyYW1lKENhbWVyYU1ldGFkYXRhICZmcmFtZSwKKyAgICB2aXJ0dWFsIGJvb2wgcHJvY2Vzc1NpbmdsZUZyYW1lKENhcHR1cmVSZXN1bHQgJmZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSk7CiAKICAgICBzdGF0dXNfdCBwcm9jZXNzRmFjZURldGVjdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCiAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiAmY2xpZW50KTsKIAogICAgIC8vIFNlbmQgM0Egc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgdG8gY2xpZW50IGJhc2VkIG9uIGZyYW1lIG1ldGFkYXRhCi0gICAgc3RhdHVzX3QgcHJvY2VzczNhU3RhdGUoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAorICAgIHN0YXR1c190IHByb2Nlc3MzYVN0YXRlKGNvbnN0IENhcHR1cmVSZXN1bHQgJmZyYW1lLAogICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4gJmNsaWVudCk7CiAKICAgICAvLyBIZWxwZXIgZm9yIHByb2Nlc3MzYVN0YXRlCkBAIC05MSw4ICs5MSw4IEBACiAgICAgICAgIH0KICAgICB9IG0zYVN0YXRlOwogCi0gICAgLy8gV2hldGhlciB0aGUgcGFydGlhbCByZXN1bHQgcXVpcmsgaXMgZW5hYmxlZCBmb3IgdGhpcyBkZXZpY2UKLSAgICBib29sIG1Vc2VQYXJ0aWFsUXVpcms7CisgICAgLy8gV2hldGhlciB0aGUgcGFydGlhbCByZXN1bHQgaXMgZW5hYmxlZCBmb3IgdGhpcyBkZXZpY2UKKyAgICBib29sIG1Vc2VQYXJ0aWFsUmVzdWx0OwogCiAgICAgLy8gVHJhY2sgbW9zdCByZWNlbnQgZnJhbWUgbnVtYmVyIGZvciB3aGljaCAzQSBub3RpZmljYXRpb25zIHdlcmUgc2VudCBmb3IuCiAgICAgLy8gVXNlZCB0byBmaWx0ZXIgYWdhaW5zdCBzZW5kaW5nIDNBIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBzYW1lIGZyYW1lCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdDb21wcmVzc29yLmNwcAppbmRleCAyZjBjNjdkLi45ZWNhYjcxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnQ29tcHJlc3Nvci5jcHAKQEAgLTE5Nyw3ICsxOTcsNyBAQAogdm9pZCBKcGVnQ29tcHJlc3Nvcjo6anBlZ0luaXREZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbykgewogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgSnBlZ0Rlc3RpbmF0aW9uICpkZXN0PSBzdGF0aWNfY2FzdDxKcGVnRGVzdGluYXRpb24qPihjaW5mby0+ZGVzdCk7Ci0gICAgQUxPR1YoIiVzOiBTZXR0aW5nIGRlc3RpbmF0aW9uIHRvICVwLCBzaXplICVkIiwKKyAgICBBTE9HVigiJXM6IFNldHRpbmcgZGVzdGluYXRpb24gdG8gJXAsIHNpemUgJXp1IiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGVzdC0+cGFyZW50LT5tSnBlZ0J1ZmZlci0+ZGF0YSwga01heEpwZWdTaXplKTsKICAgICBkZXN0LT5uZXh0X291dHB1dF9ieXRlID0gKEpPQ1RFVCopKGRlc3QtPnBhcmVudC0+bUpwZWdCdWZmZXItPmRhdGEpOwogICAgIGRlc3QtPmZyZWVfaW5fYnVmZmVyID0ga01heEpwZWdTaXplOwpAQCAtMjEzLDcgKzIxMyw3IEBACiB2b2lkIEpwZWdDb21wcmVzc29yOjpqcGVnVGVybURlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CiAgICAgKHZvaWQpIGNpbmZvOyAvLyBUT0RPOiBjbGVhbiB1cAogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgQUxPR1YoIiVzOiBEb25lIHdyaXRpbmcgSlBFRyBkYXRhLiAlZCBieXRlcyBsZWZ0IGluIGJ1ZmZlciIsCisgICAgQUxPR1YoIiVzOiBEb25lIHdyaXRpbmcgSlBFRyBkYXRhLiAlenUgYnl0ZXMgbGVmdCBpbiBidWZmZXIiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKaW5kZXggZWM4MTQ1Ni4uYjQzMzc4MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcApAQCAtNzMsMzAgKzczLDQzIEBACiAgICAgfQogCiAgICAgLy8gRmluZCBvdXQgYnVmZmVyIHNpemUgZm9yIEpQRUcKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBtYXhKcGVnU2l6ZSA9Ci0gICAgICAgICAgICBwYXJhbXMuc3RhdGljSW5mbyhBTkRST0lEX0pQRUdfTUFYX1NJWkUpOwotICAgIGlmIChtYXhKcGVnU2l6ZS5jb3VudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIEFORFJPSURfSlBFR19NQVhfU0laRSEiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICBzc2l6ZV90IG1heEpwZWdTaXplID0gZGV2aWNlLT5nZXRKcGVnQnVmZmVyU2l6ZShwYXJhbXMucGljdHVyZVdpZHRoLCBwYXJhbXMucGljdHVyZUhlaWdodCk7CisgICAgaWYgKG1heEpwZWdTaXplIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEpwZWcgYnVmZmVyIHNpemUgKCV6dSkgaXMgaW52YWxpZCAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtYXhKcGVnU2l6ZSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKICAgICBpZiAobUNhcHR1cmVDb25zdW1lciA9PSAwKSB7CiAgICAgICAgIC8vIENyZWF0ZSBDUFUgYnVmZmVyIHF1ZXVlIGVuZHBvaW50Ci0gICAgICAgIHNwPEJ1ZmZlclF1ZXVlPiBicSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgICAgICBtQ2FwdHVyZUNvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGJxLCAxKTsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgICAgICBtQ2FwdHVyZUNvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCAxKTsKICAgICAgICAgbUNhcHR1cmVDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgbUNhcHR1cmVDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEyQ2xpZW50OjpDYXB0dXJlQ29uc3VtZXIiKSk7Ci0gICAgICAgIG1DYXB0dXJlV2luZG93ID0gbmV3IFN1cmZhY2UoYnEpOworICAgICAgICBtQ2FwdHVyZVdpbmRvdyA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKKyAgICB9CisKKyAgICAvLyBTaW5jZSBhc2htZW0gaGVhcHMgYXJlIHJvdW5kZWQgdXAgdG8gcGFnZSBzaXplLCBkb24ndCByZWFsbG9jYXRlIGlmCisgICAgLy8gdGhlIGNhcHR1cmUgaGVhcCBpc24ndCBleGFjdGx5IHRoZSBzYW1lIHNpemUgYXMgdGhlIHJlcXVpcmVkIEpQRUcgYnVmZmVyCisgICAgY29uc3Qgc2l6ZV90IEhFQVBfU0xBQ0tfRkFDVE9SID0gMjsKKyAgICBpZiAobUNhcHR1cmVIZWFwID09IDAgfHwKKyAgICAgICAgICAgIChtQ2FwdHVyZUhlYXAtPmdldFNpemUoKSA8IHN0YXRpY19jYXN0PHNpemVfdD4obWF4SnBlZ1NpemUpKSB8fAorICAgICAgICAgICAgKG1DYXB0dXJlSGVhcC0+Z2V0U2l6ZSgpID4KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihtYXhKcGVnU2l6ZSkgKiBIRUFQX1NMQUNLX0ZBQ1RPUikgKSB7CiAgICAgICAgIC8vIENyZWF0ZSBtZW1vcnkgZm9yIEFQSSBjb25zdW1wdGlvbgotICAgICAgICBtQ2FwdHVyZUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2UobWF4SnBlZ1NpemUuZGF0YS5pMzJbMF0sIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhMkNsaWVudDo6Q2FwdHVyZUhlYXAiKTsKKyAgICAgICAgbUNhcHR1cmVIZWFwLmNsZWFyKCk7CisgICAgICAgIG1DYXB0dXJlSGVhcCA9CisgICAgICAgICAgICAgICAgbmV3IE1lbW9yeUhlYXBCYXNlKG1heEpwZWdTaXplLCAwLCAiQ2FtZXJhMkNsaWVudDo6Q2FwdHVyZUhlYXAiKTsKICAgICAgICAgaWYgKG1DYXB0dXJlSGVhcC0+Z2V0U2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBjYXB0dXJlIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQogICAgIH0KKyAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogSlBFRyBjYXB0dXJlIGhlYXAgbm93ICVkIGJ5dGVzOyByZXF1ZXN0ZWQgJWQgYnl0ZXMiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1DYXB0dXJlSGVhcC0+Z2V0U2l6ZSgpLCBtYXhKcGVnU2l6ZSk7CiAKICAgICBpZiAobUNhcHR1cmVTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKICAgICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHBhcmFtZXRlcnMgaGF2ZSB0byBjaGFuZ2UKQEAgLTEzMiw4ICsxNDUsNyBAQAogICAgICAgICAvLyBDcmVhdGUgc3RyZWFtIGZvciBIQUwgcHJvZHVjdGlvbgogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQ2FwdHVyZVdpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMucGljdHVyZVdpZHRoLCBwYXJhbXMucGljdHVyZUhlaWdodCwKLSAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IsIG1heEpwZWdTaXplLmRhdGEuaTMyWzBdLAotICAgICAgICAgICAgICAgICZtQ2FwdHVyZVN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IsICZtQ2FwdHVyZVN0cmVhbUlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNyZWF0ZSBvdXRwdXQgc3RyZWFtIGZvciBjYXB0dXJlOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC0yNDEsNyArMjUzLDcgQEAKICAgICAgICAgc2l6ZV90IGhlYXBTaXplID0gbUNhcHR1cmVIZWFwLT5nZXRTaXplKCk7CiAgICAgICAgIGlmIChqcGVnU2l6ZSA+IGhlYXBTaXplKSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IEpQRUcgaW1hZ2UgaXMgbGFyZ2VyIHRoYW4gZXhwZWN0ZWQsIHRydW5jYXRpbmcgIgotICAgICAgICAgICAgICAgICAgICAiKGdvdCAlZCwgZXhwZWN0ZWQgYXQgbW9zdCAlZCBieXRlcykiLAorICAgICAgICAgICAgICAgICAgICAiKGdvdCAlenUsIGV4cGVjdGVkIGF0IG1vc3QgJXp1IGJ5dGVzKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywganBlZ1NpemUsIGhlYXBTaXplKTsKICAgICAgICAgICAgIGpwZWdTaXplID0gaGVhcFNpemU7CiAgICAgICAgIH0KQEAgLTMzNSwxMyArMzQ3LDEzIEBACiAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gc2l6ZSAtIE1BUktFUl9MRU5HVEg7CiAgICAgICAgICAgICB1aW50OF90ICplbmQgPSBqcGVnQnVmZmVyICsgb2Zmc2V0OwogICAgICAgICAgICAgaWYgKGNoZWNrSnBlZ1N0YXJ0KGpwZWdCdWZmZXIpICYmIGNoZWNrSnBlZ0VuZChlbmQpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkZvdW5kIEpQRUcgdHJhbnNwb3J0IGhlYWRlciwgaW1nIHNpemUgJWQiLCBzaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiRm91bmQgSlBFRyB0cmFuc3BvcnQgaGVhZGVyLCBpbWcgc2l6ZSAlenUiLCBzaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIkZvdW5kIEpQRUcgdHJhbnNwb3J0IGhlYWRlciB3aXRoIGJhZCBJbWFnZSBTdGFydC9FbmQiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJGb3VuZCBKUEVHIHRyYW5zcG9ydCBoZWFkZXIgd2l0aCBiYWQgc2l6ZSAlZCIsIHNpemUpOworICAgICAgICAgICAgQUxPR1coIkZvdW5kIEpQRUcgdHJhbnNwb3J0IGhlYWRlciB3aXRoIGJhZCBzaXplICV6dSIsIHNpemUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNTcsMTUgKzM2OSwxNSBAQAogICAgICAgICBzZWdtZW50X3QgKnNlZ21lbnQgPSAoc2VnbWVudF90KikoanBlZ0J1ZmZlciArIHNpemUpOwogICAgICAgICB1aW50OF90IHR5cGUgPSBjaGVja0pwZWdNYXJrZXIoc2VnbWVudC0+bWFya2VyKTsKICAgICAgICAgaWYgKHR5cGUgPT0gMCkgeyAvLyBpbnZhbGlkIG1hcmtlciwgbm8gbW9yZSBzZWdtZW50cywgYmVnaW4gSlBFRyBkYXRhCi0gICAgICAgICAgICBBTE9HVigiSlBFRyBzdHJlYW0gZm91bmQgYmVnaW5uaW5nIGF0IG9mZnNldCAlZCIsIHNpemUpOworICAgICAgICAgICAgQUxPR1YoIkpQRUcgc3RyZWFtIGZvdW5kIGJlZ2lubmluZyBhdCBvZmZzZXQgJXp1Iiwgc2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAodHlwZSA9PSBFT0kgfHwgc2l6ZSA+IG1heFNpemUgLSBzaXplb2Yoc2VnbWVudF90KSkgewotICAgICAgICAgICAgQUxPR0UoIkdvdCBwcmVtYXR1cmUgRW5kIGJlZm9yZSBKUEVHIGRhdGEsIG9mZnNldCAlZCIsIHNpemUpOworICAgICAgICAgICAgQUxPR0UoIkdvdCBwcmVtYXR1cmUgRW5kIGJlZm9yZSBKUEVHIGRhdGEsIG9mZnNldCAlenUiLCBzaXplKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIHNpemVfdCBsZW5ndGggPSBudG9ocyhzZWdtZW50LT5sZW5ndGgpOwotICAgICAgICBBTE9HVigiSkZJRiBTZWdtZW50LCB0eXBlICV4IGxlbmd0aCAleCIsIHR5cGUsIGxlbmd0aCk7CisgICAgICAgIEFMT0dWKCJKRklGIFNlZ21lbnQsIHR5cGUgJXggbGVuZ3RoICV6eCIsIHR5cGUsIGxlbmd0aCk7CiAgICAgICAgIHNpemUgKz0gbGVuZ3RoICsgTUFSS0VSX0xFTkdUSDsKICAgICB9CiAKQEAgLTM4NSwxMCArMzk3LDEwIEBACiAgICAgfQogCiAgICAgaWYgKHNpemUgPiBtYXhTaXplKSB7Ci0gICAgICAgIEFMT0dXKCJKUEVHIHNpemUgJWQgdG9vIGxhcmdlLCByZWR1Y2luZyB0byBtYXhTaXplICVkIiwgc2l6ZSwgbWF4U2l6ZSk7CisgICAgICAgIEFMT0dXKCJKUEVHIHNpemUgJXp1IHRvbyBsYXJnZSwgcmVkdWNpbmcgdG8gbWF4U2l6ZSAlenUiLCBzaXplLCBtYXhTaXplKTsKICAgICAgICAgc2l6ZSA9IG1heFNpemU7CiAgICAgfQotICAgIEFMT0dWKCJGaW5hbCBKUEVHIHNpemUgJWQiLCBzaXplKTsKKyAgICBBTE9HVigiRmluYWwgSlBFRyBzaXplICV6dSIsIHNpemUpOwogICAgIHJldHVybiBzaXplOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKaW5kZXggNjFlMzU4OC4uN2I5MGQyOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcApAQCAtMjksNiArMjksOSBAQAogCiAjaW5jbHVkZSAiUGFyYW1ldGVycy5oIgogI2luY2x1ZGUgInN5c3RlbS9jYW1lcmEuaCIKKyNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmFfY29tbW9uLmgiCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFQcm9maWxlcy5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNhbWVyYTIgewpAQCAtNDMsNyArNDYsNyBAQAogUGFyYW1ldGVyczo6flBhcmFtZXRlcnMoKSB7CiB9CiAKLXN0YXR1c190IFBhcmFtZXRlcnM6OmluaXRpYWxpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEgKmluZm8pIHsKK3N0YXR1c190IFBhcmFtZXRlcnM6OmluaXRpYWxpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEgKmluZm8sIGludCBkZXZpY2VWZXJzaW9uKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgaWYgKGluZm8tPmVudHJ5Q291bnQoKSA9PSAwKSB7CkBAIC01MSw2ICs1NCw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIFBhcmFtZXRlcnM6OmluZm8gPSBpbmZvOworICAgIG1EZXZpY2VWZXJzaW9uID0gZGV2aWNlVmVyc2lvbjsKIAogICAgIHJlcyA9IGJ1aWxkRmFzdEluZm8oKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwpAQCAtNTksMTIgKzYzLDQyIEBACiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIGNvbnN0IFNpemUgTUFYX1BSRVZJRVdfU0laRSA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OwotICAgIHJlcyA9IGdldEZpbHRlcmVkUHJldmlld1NpemVzKE1BWF9QUkVWSUVXX1NJWkUsICZhdmFpbGFibGVQcmV2aWV3U2l6ZXMpOworICAgIC8vIFRyZWF0IHRoZSBILjI2NCBtYXggc2l6ZSBhcyB0aGUgbWF4IHN1cHBvcnRlZCB2aWRlbyBzaXplLgorICAgIE1lZGlhUHJvZmlsZXMgKnZpZGVvRW5jb2RlclByb2ZpbGVzID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpbnQzMl90IG1heFZpZGVvV2lkdGggPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuYy52aWQud2lkdGgubWF4IiwgVklERU9fRU5DT0RFUl9IMjY0KTsKKyAgICBpbnQzMl90IG1heFZpZGVvSGVpZ2h0ID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLmhlaWdodC5tYXgiLCBWSURFT19FTkNPREVSX0gyNjQpOworICAgIGNvbnN0IFNpemUgTUFYX1ZJREVPX1NJWkUgPSB7bWF4VmlkZW9XaWR0aCwgbWF4VmlkZW9IZWlnaHR9OworCisgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhNQVhfUFJFVklFV19TSVpFLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKKyAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoTUFYX1ZJREVPX1NJWkUsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCi0gICAgLy8gVE9ETzogUGljayBtb3JlIGludGVsbGlnZW50bHkKLSAgICBwcmV2aWV3V2lkdGggPSBhdmFpbGFibGVQcmV2aWV3U2l6ZXNbMF0ud2lkdGg7Ci0gICAgcHJldmlld0hlaWdodCA9IGF2YWlsYWJsZVByZXZpZXdTaXplc1swXS5oZWlnaHQ7CisgICAgLy8gU2VsZWN0IGluaXRpYWwgcHJldmlldyBhbmQgdmlkZW8gc2l6ZSB0aGF0J3MgdW5kZXIgdGhlIGluaXRpYWwgYm91bmQgYW5kCisgICAgLy8gb24gdGhlIGxpc3Qgb2YgYm90aCBwcmV2aWV3IGFuZCByZWNvcmRpbmcgc2l6ZXMKKyAgICBwcmV2aWV3V2lkdGggPSAwOworICAgIHByZXZpZXdIZWlnaHQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGF2YWlsYWJsZVByZXZpZXdTaXplcy5zaXplKCk7IGkrKykgeworICAgICAgICBpbnQgbmV3V2lkdGggPSBhdmFpbGFibGVQcmV2aWV3U2l6ZXNbaV0ud2lkdGg7CisgICAgICAgIGludCBuZXdIZWlnaHQgPSBhdmFpbGFibGVQcmV2aWV3U2l6ZXNbaV0uaGVpZ2h0OworICAgICAgICBpZiAobmV3V2lkdGggPj0gcHJldmlld1dpZHRoICYmIG5ld0hlaWdodCA+PSBwcmV2aWV3SGVpZ2h0ICYmCisgICAgICAgICAgICAgICAgbmV3V2lkdGggPD0gTUFYX0lOSVRJQUxfUFJFVklFV19XSURUSCAmJgorICAgICAgICAgICAgICAgIG5ld0hlaWdodCA8PSBNQVhfSU5JVElBTF9QUkVWSUVXX0hFSUdIVCkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBhdmFpbGFibGVWaWRlb1NpemVzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVZpZGVvU2l6ZXNbal0ud2lkdGggPT0gbmV3V2lkdGggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVZpZGVvU2l6ZXNbal0uaGVpZ2h0ID09IG5ld0hlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBwcmV2aWV3V2lkdGggPSBuZXdXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgcHJldmlld0hlaWdodCA9IG5ld0hlaWdodDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHByZXZpZXdXaWR0aCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gaW5pdGlhbCBwcmV2aWV3IHNpemUgY2FuIGJlIGZvdW5kISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIHZpZGVvV2lkdGggPSBwcmV2aWV3V2lkdGg7CiAgICAgdmlkZW9IZWlnaHQgPSBwcmV2aWV3SGVpZ2h0OwogCkBAIC04NCw4ICsxMTgsMTcgQEAKICAgICAgICAgQUxPR1YoIlN1cHBvcnRlZCBwcmV2aWV3IHNpemVzIGFyZTogJXMiLCBzdXBwb3J0ZWRQcmV2aWV3U2l6ZXMuc3RyaW5nKCkpOwogICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfUFJFVklFV19TSVpFUywKICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQcmV2aWV3U2l6ZXMpOworCisgICAgICAgIFN0cmluZzggc3VwcG9ydGVkVmlkZW9TaXplczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVWaWRlb1NpemVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSAhPSAwKSBzdXBwb3J0ZWRWaWRlb1NpemVzICs9ICIsIjsKKyAgICAgICAgICAgIHN1cHBvcnRlZFZpZGVvU2l6ZXMgKz0gU3RyaW5nODo6Zm9ybWF0KCIlZHglZCIsCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVZpZGVvU2l6ZXNbaV0ud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVZpZGVvU2l6ZXNbaV0uaGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiU3VwcG9ydGVkIHZpZGVvIHNpemVzIGFyZTogJXMiLCBzdXBwb3J0ZWRWaWRlb1NpemVzLnN0cmluZygpKTsKICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1ZJREVPX1NJWkVTLAotICAgICAgICAgICAgICAgIHN1cHBvcnRlZFByZXZpZXdTaXplcyk7CisgICAgICAgICAgICAgICAgc3VwcG9ydGVkVmlkZW9TaXplcyk7CiAgICAgfQogCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRnBzUmFuZ2VzID0KQEAgLTk5LDE2ICsxNDIsMTQgQEAKICAgICBwcmV2aWV3VHJhbnNmb3JtID0gZGVnVG9UcmFuc2Zvcm0oMCwKICAgICAgICAgICAgIGNhbWVyYUZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0ZST05UKTsKIAotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUZvcm1hdHMgPQotICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTKTsKLQogICAgIHsKICAgICAgICAgU3RyaW5nOCBzdXBwb3J0ZWRQcmV2aWV3Rm9ybWF0czsKKyAgICAgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IG91dHB1dEZvcm1hdHMgPSBnZXRBdmFpbGFibGVPdXRwdXRGb3JtYXRzKCk7CiAgICAgICAgIGJvb2wgYWRkQ29tbWEgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlRm9ybWF0cy5jb3VudDsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IG91dHB1dEZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGlmIChhZGRDb21tYSkgc3VwcG9ydGVkUHJldmlld0Zvcm1hdHMgKz0gIiwiOwogICAgICAgICAgICAgYWRkQ29tbWEgPSB0cnVlOwotICAgICAgICAgICAgc3dpdGNoIChhdmFpbGFibGVGb3JtYXRzLmRhdGEuaTMyW2ldKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG91dHB1dEZvcm1hdHNbaV0pIHsKICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfU1A6CiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkUHJldmlld0Zvcm1hdHMgKz0KICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMlNQOwpAQCAtMTUwLDcgKzE5MSw3IEBACiAKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IFVua25vd24gcHJldmlldyBmb3JtYXQ6ICV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsIGF2YWlsYWJsZUZvcm1hdHMuZGF0YS5pMzJbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwgb3V0cHV0Rm9ybWF0c1tpXSk7CiAgICAgICAgICAgICAgICAgYWRkQ29tbWEgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTIyMiwyNCArMjYzLDI2IEBACiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkUHJldmlld0ZyYW1lUmF0ZXMpOwogICAgIH0KIAotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUpwZWdTaXplcyA9Ci0gICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0pQRUdfU0laRVMsIDIpOwotICAgIGlmICghYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50KSByZXR1cm4gTk9fSU5JVDsKKyAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlSnBlZ1NpemVzID0gZ2V0QXZhaWxhYmxlSnBlZ1NpemVzKCk7CisgICAgaWYgKCFhdmFpbGFibGVKcGVnU2l6ZXMuc2l6ZSgpKSByZXR1cm4gTk9fSU5JVDsKIAogICAgIC8vIFRPRE86IFBpY2sgbWF4aW11bQotICAgIHBpY3R1cmVXaWR0aCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMlswXTsKLSAgICBwaWN0dXJlSGVpZ2h0ID0gYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyWzFdOworICAgIHBpY3R1cmVXaWR0aCA9IGF2YWlsYWJsZUpwZWdTaXplc1swXS53aWR0aDsKKyAgICBwaWN0dXJlSGVpZ2h0ID0gYXZhaWxhYmxlSnBlZ1NpemVzWzBdLmhlaWdodDsKKyAgICBwaWN0dXJlV2lkdGhMYXN0U2V0ID0gcGljdHVyZVdpZHRoOworICAgIHBpY3R1cmVIZWlnaHRMYXN0U2V0ID0gcGljdHVyZUhlaWdodDsKKyAgICBwaWN0dXJlU2l6ZU92ZXJyaWRlbiA9IGZhbHNlOwogCiAgICAgcGFyYW1zLnNldFBpY3R1cmVTaXplKHBpY3R1cmVXaWR0aCwKICAgICAgICAgICAgIHBpY3R1cmVIZWlnaHQpOwogCiAgICAgewogICAgICAgICBTdHJpbmc4IHN1cHBvcnRlZFBpY3R1cmVTaXplczsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50OyBpICs9IDIpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlSnBlZ1NpemVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoaSAhPSAwKSBzdXBwb3J0ZWRQaWN0dXJlU2l6ZXMgKz0gIiwiOwogICAgICAgICAgICAgc3VwcG9ydGVkUGljdHVyZVNpemVzICs9IFN0cmluZzg6OmZvcm1hdCgiJWR4JWQiLAotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaV0sCi0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpKzFdKTsKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSnBlZ1NpemVzW2ldLndpZHRoLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVKcGVnU2l6ZXNbaV0uaGVpZ2h0KTsKICAgICAgICAgfQogICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfUElDVFVSRV9TSVpFUywKICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQaWN0dXJlU2l6ZXMpOwpAQCAtNDcwLDcgKzUxMyw3IEBACiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkQW50aWJhbmRpbmcpOwogICAgIH0KIAotICAgIHNjZW5lTW9kZSA9IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOworICAgIHNjZW5lTW9kZSA9IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEOwogICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NDRU5FX01PREUsCiAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpTQ0VORV9NT0RFX0FVVE8pOwogCkBAIC00ODYsNyArNTI5LDcgQEAKICAgICAgICAgICAgIGlmIChhZGRDb21tYSkgc3VwcG9ydGVkU2NlbmVNb2RlcyArPSAiLCI7CiAgICAgICAgICAgICBhZGRDb21tYSA9IHRydWU7CiAgICAgICAgICAgICBzd2l0Y2ggKGF2YWlsYWJsZVNjZW5lTW9kZXMuZGF0YS51OFtpXSkgewotICAgICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQ6CisgICAgICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRDoKICAgICAgICAgICAgICAgICAgICAgbm9TY2VuZU1vZGVzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9GQUNFX1BSSU9SSVRZOgpAQCAtNTc5LDggKzYyMiw4IEBACiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlQWVNb2RlcyA9CiAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX0FFX0FWQUlMQUJMRV9NT0RFUywgMCwgMCwgZmFsc2UpOwogCisgICAgZmxhc2hNb2RlID0gUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkY7CiAgICAgaWYgKGlzRmxhc2hBdmFpbGFibGUpIHsKLSAgICAgICAgZmxhc2hNb2RlID0gUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkY7CiAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZMQVNIX01PREUsCiAgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkYpOwogCkBAIC02MDAsMTEgKzY0MywxMCBAQAogICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfRkxBU0hfTU9ERVMsCiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkRmxhc2hNb2Rlcyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZmxhc2hNb2RlID0gUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkY7Ci0gICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZMQVNIX01PREUsCi0gICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkYpOwotICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfRkxBU0hfTU9ERVMsCi0gICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkYpOworICAgICAgICAvLyBObyBmbGFzaCBtZWFucyBudWxsIGZsYXNoIG1vZGUgYW5kIHN1cHBvcnRlZCBmbGFzaCBtb2RlcyBrZXlzLCBzbworICAgICAgICAvLyByZW1vdmUgdGhlbSBqdXN0IHRvIGJlIHNhZmUKKyAgICAgICAgcGFyYW1zLnJlbW92ZShDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRkxBU0hfTU9ERSk7CisgICAgICAgIHBhcmFtcy5yZW1vdmUoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9GTEFTSF9NT0RFUyk7CiAgICAgfQogCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgbWluRm9jdXNEaXN0YW5jZSA9CkBAIC02MjQsOCArNjY2LDE3IEBACiAgICAgICAgIGZvY3VzTW9kZSA9IFBhcmFtZXRlcnM6OkZPQ1VTX01PREVfQVVUTzsKICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRk9DVVNfTU9ERSwKICAgICAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0FVVE8pOwotICAgICAgICBTdHJpbmc4IHN1cHBvcnRlZEZvY3VzTW9kZXMoQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9JTkZJTklUWSk7Ci0gICAgICAgIGJvb2wgYWRkQ29tbWEgPSB0cnVlOworICAgICAgICBTdHJpbmc4IHN1cHBvcnRlZEZvY3VzTW9kZXM7CisgICAgICAgIGJvb2wgYWRkQ29tbWEgPSBmYWxzZTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZm9jdXNEaXN0YW5jZUNhbGlicmF0aW9uID0KKyAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9MRU5TX0lORk9fRk9DVVNfRElTVEFOQ0VfQ0FMSUJSQVRJT04sIDAsIDAsIGZhbHNlKTsKKworICAgICAgICBpZiAoZm9jdXNEaXN0YW5jZUNhbGlicmF0aW9uLmNvdW50ICYmCisgICAgICAgICAgICAgICAgZm9jdXNEaXN0YW5jZUNhbGlicmF0aW9uLmRhdGEudThbMF0gIT0KKyAgICAgICAgICAgICAgICBBTkRST0lEX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTl9VTkNBTElCUkFURUQpIHsKKyAgICAgICAgICAgIHN1cHBvcnRlZEZvY3VzTW9kZXMgKz0gQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9JTkZJTklUWTsKKyAgICAgICAgICAgIGFkZENvbW1hID0gdHJ1ZTsKKyAgICAgICAgfQogCiAgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUFmTW9kZXMuY291bnQ7IGkrKykgewogICAgICAgICAgICAgaWYgKGFkZENvbW1hKSBzdXBwb3J0ZWRGb2N1c01vZGVzICs9ICIsIjsKQEAgLTY2OCwxMyArNzE5LDEzIEBACiAgICAgZm9jdXNTdGF0ZSA9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9JTkFDVElWRTsKICAgICBzaGFkb3dGb2N1c01vZGUgPSBGT0NVU19NT0RFX0lOVkFMSUQ7CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBtYXgzYVJlZ2lvbnMgPQotICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywgMSwgMSk7Ci0gICAgaWYgKCFtYXgzYVJlZ2lvbnMuY291bnQpIHJldHVybiBOT19JTklUOworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IG1heDNhUmVnaW9ucyA9IHN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLAorICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTik7CisgICAgaWYgKG1heDNhUmVnaW9ucy5jb3VudCAhPSBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKSByZXR1cm4gTk9fSU5JVDsKIAogICAgIGludDMyX3QgbWF4TnVtRm9jdXNBcmVhcyA9IDA7CiAgICAgaWYgKGZvY3VzTW9kZSAhPSBQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0ZJWEVEKSB7Ci0gICAgICAgIG1heE51bUZvY3VzQXJlYXMgPSBtYXgzYVJlZ2lvbnMuZGF0YS5pMzJbMF07CisgICAgICAgIG1heE51bUZvY3VzQXJlYXMgPSBtYXgzYVJlZ2lvbnMuZGF0YS5pMzJbUGFyYW1ldGVyczo6UkVHSU9OX0FGXTsKICAgICB9CiAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUFYX05VTV9GT0NVU19BUkVBUywgbWF4TnVtRm9jdXNBcmVhcyk7CiAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRk9DVVNfQVJFQVMsCkBAIC03MzQsNyArNzg1LDcgQEAKIAogICAgIG1ldGVyaW5nQXJlYXMuYWRkKFBhcmFtZXRlcnM6OkFyZWEoMCwgMCwgMCwgMCwgMCkpOwogICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01BWF9OVU1fTUVURVJJTkdfQVJFQVMsCi0gICAgICAgICAgICBtYXgzYVJlZ2lvbnMuZGF0YS5pMzJbMF0pOworICAgICAgICAgICAgbWF4M2FSZWdpb25zLmRhdGEuaTMyW1BhcmFtZXRlcnM6OlJFR0lPTl9BRV0pOwogICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01FVEVSSU5HX0FSRUFTLAogICAgICAgICAgICAgIigwLDAsMCwwLDApIik7CiAKQEAgLTkzMSwxMyArOTgyLDE5IEBACiAgICAgYm9vbCBmaXhlZExlbnMgPSBtaW5Gb2N1c0Rpc3RhbmNlLmNvdW50ID09IDAgfHwKICAgICAgICAgbWluRm9jdXNEaXN0YW5jZS5kYXRhLmZbMF0gPT0gMDsKIAorICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbiA9CisgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgYm9vbCBjYW5Gb2N1c0luZmluaXR5ID0gKGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbi5jb3VudCAmJgorICAgICAgICAgICAgZm9jdXNEaXN0YW5jZUNhbGlicmF0aW9uLmRhdGEudThbMF0gIT0KKyAgICAgICAgICAgIEFORFJPSURfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OX1VOQ0FMSUJSQVRFRCk7CisKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb2NhbExlbmd0aHMgPQogICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfTEVOU19JTkZPX0FWQUlMQUJMRV9GT0NBTF9MRU5HVEhTKTsKICAgICBpZiAoIWF2YWlsYWJsZUZvY2FsTGVuZ3Rocy5jb3VudCkgcmV0dXJuIE5PX0lOSVQ7CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb3JtYXRzID0KLSAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUyk7Ci0gICAgaWYgKCFhdmFpbGFibGVGb3JtYXRzLmNvdW50KSByZXR1cm4gTk9fSU5JVDsKKyAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gYXZhaWxhYmxlRm9ybWF0cyA9IGdldEF2YWlsYWJsZU91dHB1dEZvcm1hdHMoKTsKKyAgICBpZiAoIWF2YWlsYWJsZUZvcm1hdHMuc2l6ZSgpKSByZXR1cm4gTk9fSU5JVDsKIAogCiAgICAgaWYgKHNjZW5lTW9kZU92ZXJyaWRlcy5jb3VudCA+IDApIHsKQEAgLTk0OCw3ICsxMDA1LDcgQEAKICAgICAgICAgaWYgKHNjZW5lTW9kZU92ZXJyaWRlcy5jb3VudCAhPQogICAgICAgICAgICAgICAgIGF2YWlsYWJsZVNjZW5lTW9kZXMuY291bnQgKiBrTW9kZXNQZXJTY2VuZU1vZGUpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBTY2VuZSBtb2RlIG92ZXJyaWRlIGxpc3QgaXMgYW4gIgotICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBzaXplOiAlZCAoZXhwZWN0ZWQgJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBzaXplOiAlenUgKGV4cGVjdGVkICV6dSkiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBzY2VuZU1vZGVPdmVycmlkZXMuY291bnQsCiAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVNjZW5lTW9kZXMuY291bnQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC05ODIsNiArMTAzOSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBzY2VuZU1vZGVPdmVycmlkZXMuZGF0YS51OFtpICoga01vZGVzUGVyU2NlbmVNb2RlICsgMl07CiAgICAgICAgICAgICBzd2l0Y2goYWZNb2RlKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9PRkY6CisgICAgICAgICAgICAgICAgICAgIGlmICghZml4ZWRMZW5zICYmICFjYW5Gb2N1c0luZmluaXR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogU2NlbmUgbW9kZSBvdmVycmlkZSBsaXN0cyBhc2tzIGZvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmaXhlZCBmb2N1cyBvbiBhIGRldmljZSB3aXRoIGZvY3VzZXIgYnV0IG5vdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjYWxpYnJhdGVkIGZvciBpbmZpbml0eSBmb2N1cyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbW9kZXMuZm9jdXNNb2RlID0gZml4ZWRMZW5zID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT0NVU19NT0RFX0ZJWEVEIDogRk9DVVNfTU9ERV9JTkZJTklUWTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDIxLDggKzEwODUsOCBAQAogCiAgICAgLy8gQ2hlY2sgaWYgdGhlIEhBTCBzdXBwb3J0cyBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgKICAgICBmYXN0SW5mby51c2VGbGV4aWJsZVl1diA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlRm9ybWF0cy5jb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChhdmFpbGFibGVGb3JtYXRzLmRhdGEuaTMyW2ldID09IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlRm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoYXZhaWxhYmxlRm9ybWF0c1tpXSA9PSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgpIHsKICAgICAgICAgICAgIGZhc3RJbmZvLnVzZUZsZXhpYmxlWXV2ID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMDc4LDcgKzExNDIsNyBAQAogICAgICAgICBjb25zdCBjaGFyKiB0YWdOYW1lID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV90YWdfbmFtZSh0YWcpOwogICAgICAgICBpZiAodGFnTmFtZSA9PSBOVUxMKSB0YWdOYW1lID0gIjx1bmtub3duPiI7CiAgICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgc3RhdGljIG1ldGFkYXRhIGVudHJ5ICclcy4lcycgKCV4KToiCi0gICAgICAgICAgICAgICAgIkV4cGVjdGVkIGJldHdlZW4gJWQgYW5kICVkIHZhbHVlcywgYnV0IGdvdCAlZCB2YWx1ZXMiLAorICAgICAgICAgICAgICAgICJFeHBlY3RlZCBiZXR3ZWVuICV6dSBhbmQgJXp1IHZhbHVlcywgYnV0IGdvdCAlenUgdmFsdWVzIiwKICAgICAgICAgICAgICAgICB0YWdTZWN0aW9uLCB0YWdOYW1lLCB0YWcsIG1pbkNvdW50LCBtYXhDb3VudCwgZW50cnkuY291bnQpOwogICAgIH0KIApAQCAtMTIyNSw4ICsxMjg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgImlzIGFjdGl2ZSEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb3JtYXRzID0KLSAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMpOworICAgICAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gYXZhaWxhYmxlRm9ybWF0cyA9IGdldEF2YWlsYWJsZU91dHB1dEZvcm1hdHMoKTsKICAgICAgICAgLy8gSWYgdXNpbmcgZmxleGlibGUgWVVWLCBhbHdheXMgc3VwcG9ydCBOVjIxL1lWMTIuIE90aGVyd2lzZSwgY2hlY2sKICAgICAgICAgLy8gSEFMJ3MgbGlzdC4KICAgICAgICAgaWYgKCEgKGZhc3RJbmZvLnVzZUZsZXhpYmxlWXV2ICYmCkBAIC0xMjM1LDExICsxMjk4LDEwIEBACiAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5wcmV2aWV3Rm9ybWF0ID09CiAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIpICkgKSB7CiAgICAgICAgICAgICAvLyBOb3QgdXNpbmcgZmxleGlibGUgWVVWIGZvcm1hdCwgc28gY2hlY2sgZXhwbGljaXRseQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVGb3JtYXRzLmRhdGEuaTMyW2ldID09Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucHJldmlld0Zvcm1hdCkgYnJlYWs7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlRm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVGb3JtYXRzW2ldID09IHZhbGlkYXRlZFBhcmFtcy5wcmV2aWV3Rm9ybWF0KSBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpID09IGF2YWlsYWJsZUZvcm1hdHMuY291bnQpIHsKKyAgICAgICAgICAgIGlmIChpID09IGF2YWlsYWJsZUZvcm1hdHMuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0ZWQgcHJldmlldyBmb3JtYXQgJXMgKDB4JXgpIGlzIG5vdCBzdXBwb3J0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBuZXdQYXJhbXMuZ2V0UHJldmlld0Zvcm1hdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnByZXZpZXdGb3JtYXQpOwpAQCAtMTM1NSwxNyArMTQxNywxNiBAQAogICAgIC8vIFBJQ1RVUkVfU0laRQogICAgIG5ld1BhcmFtcy5nZXRQaWN0dXJlU2l6ZSgmdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVXaWR0aCwKICAgICAgICAgICAgICZ2YWxpZGF0ZWRQYXJhbXMucGljdHVyZUhlaWdodCk7Ci0gICAgaWYgKHZhbGlkYXRlZFBhcmFtcy5waWN0dXJlV2lkdGggPT0gcGljdHVyZVdpZHRoIHx8Ci0gICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucGljdHVyZUhlaWdodCA9PSBwaWN0dXJlSGVpZ2h0KSB7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVBpY3R1cmVTaXplcyA9Ci0gICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9KUEVHX1NJWkVTKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2YWlsYWJsZVBpY3R1cmVTaXplcy5jb3VudDsgaSs9MikgewotICAgICAgICAgICAgaWYgKChhdmFpbGFibGVQaWN0dXJlU2l6ZXMuZGF0YS5pMzJbaV0gPT0KKyAgICBpZiAodmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVXaWR0aCAhPSBwaWN0dXJlV2lkdGggfHwKKyAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5waWN0dXJlSGVpZ2h0ICE9IHBpY3R1cmVIZWlnaHQpIHsKKyAgICAgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZVBpY3R1cmVTaXplcyA9IGdldEF2YWlsYWJsZUpwZWdTaXplcygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlUGljdHVyZVNpemVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKGF2YWlsYWJsZVBpY3R1cmVTaXplc1tpXS53aWR0aCA9PQogICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucGljdHVyZVdpZHRoKSAmJgotICAgICAgICAgICAgICAgIChhdmFpbGFibGVQaWN0dXJlU2l6ZXMuZGF0YS5pMzJbaSsxXSA9PQorICAgICAgICAgICAgICAgIChhdmFpbGFibGVQaWN0dXJlU2l6ZXNbaV0uaGVpZ2h0ID09CiAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5waWN0dXJlSGVpZ2h0KSkgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGkgPT0gYXZhaWxhYmxlUGljdHVyZVNpemVzLmNvdW50KSB7CisgICAgICAgIGlmIChpID09IGF2YWlsYWJsZVBpY3R1cmVTaXplcy5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogUmVxdWVzdGVkIHBpY3R1cmUgc2l6ZSAlZCB4ICVkIGlzIG5vdCBzdXBwb3J0ZWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZhbGlkYXRlZFBhcmFtcy5waWN0dXJlV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5waWN0dXJlSGVpZ2h0KTsKQEAgLTE1MjIsNyArMTU4Myw3IEBACiAgICAgICAgIG5ld1BhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NDRU5FX01PREUpICk7CiAgICAgaWYgKHZhbGlkYXRlZFBhcmFtcy5zY2VuZU1vZGUgIT0gc2NlbmVNb2RlICYmCiAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMuc2NlbmVNb2RlICE9Ci0gICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRCkgeworICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQpIHsKICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlU2NlbmVNb2RlcyA9CiAgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9BVkFJTEFCTEVfU0NFTkVfTU9ERVMpOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlU2NlbmVNb2Rlcy5jb3VudDsgaSsrKSB7CkBAIC0xNTM3LDcgKzE1OTgsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGJvb2wgc2NlbmVNb2RlU2V0ID0KLSAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5zY2VuZU1vZGUgIT0gQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMuc2NlbmVNb2RlICE9IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEOwogCiAgICAgLy8gRkxBU0hfTU9ERQogICAgIGlmIChzY2VuZU1vZGVTZXQpIHsKQEAgLTE1NTUsNyArMTYxNiw5IEBACiAgICAgaWYgKHZhbGlkYXRlZFBhcmFtcy5mbGFzaE1vZGUgIT0gZmxhc2hNb2RlKSB7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGZsYXNoQXZhaWxhYmxlID0KICAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRSwgMSwgMSk7Ci0gICAgICAgIGlmICghZmxhc2hBdmFpbGFibGUuZGF0YS51OFswXSAmJgorICAgICAgICBib29sIGlzRmxhc2hBdmFpbGFibGUgPQorICAgICAgICAgICAgICAgIGZsYXNoQXZhaWxhYmxlLmRhdGEudThbMF0gPT0gQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRV9UUlVFOworICAgICAgICBpZiAoIWlzRmxhc2hBdmFpbGFibGUgJiYKICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMuZmxhc2hNb2RlICE9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RlZCBmbGFzaCBtb2RlIFwiJXNcIiBpcyBub3Qgc3VwcG9ydGVkOiAiCiAgICAgICAgICAgICAgICAgICAgICJObyBmbGFzaCBvbiBkZXZpY2UiLCBfX0ZVTkNUSU9OX18sCkBAIC0xNTgwLDkgKzE2NDMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRkxBU0hfTU9ERSkpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICAvLyBVcGRhdGUgaW4gY2FzZSBvZiBvdmVycmlkZQotICAgICAgICBuZXdQYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAotICAgICAgICAgICAgICAgIGZsYXNoTW9kZUVudW1Ub1N0cmluZyh2YWxpZGF0ZWRQYXJhbXMuZmxhc2hNb2RlKSk7CisgICAgICAgIC8vIFVwZGF0ZSBpbiBjYXNlIG9mIG92ZXJyaWRlLCBidXQgb25seSBpZiBmbGFzaCBpcyBzdXBwb3J0ZWQKKyAgICAgICAgaWYgKGlzRmxhc2hBdmFpbGFibGUpIHsKKyAgICAgICAgICAgIG5ld1BhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZMQVNIX01PREUsCisgICAgICAgICAgICAgICAgICAgIGZsYXNoTW9kZUVudW1Ub1N0cmluZyh2YWxpZGF0ZWRQYXJhbXMuZmxhc2hNb2RlKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBXSElURV9CQUxBTkNFCkBAIC0xNjY3LDEwICsxNzMyLDExIEBACiAgICAgLy8gRk9DVVNfQVJFQVMKICAgICByZXMgPSBwYXJzZUFyZWFzKG5ld1BhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX0FSRUFTKSwKICAgICAgICAgICAgICZ2YWxpZGF0ZWRQYXJhbXMuZm9jdXNpbmdBcmVhcyk7Ci0gICAgc2l6ZV90IG1heDNhUmVnaW9ucyA9Ci0gICAgICAgIChzaXplX3Qpc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsIDEsIDEpLmRhdGEuaTMyWzBdOworICAgIHNpemVfdCBtYXhBZlJlZ2lvbnMgPSAoc2l6ZV90KXN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLAorICAgICAgICAgICAgICBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OLCBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKS4KKyAgICAgICAgICAgICAgZGF0YS5pMzJbUGFyYW1ldGVyczo6UkVHSU9OX0FGXTsKICAgICBpZiAocmVzID09IE9LKSByZXMgPSB2YWxpZGF0ZUFyZWFzKHZhbGlkYXRlZFBhcmFtcy5mb2N1c2luZ0FyZWFzLAotICAgICAgICAgICAgbWF4M2FSZWdpb25zLCBBUkVBX0tJTkRfRk9DVVMpOworICAgICAgICAgICAgbWF4QWZSZWdpb25zLCBBUkVBX0tJTkRfRk9DVVMpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0ZWQgZm9jdXMgYXJlYXMgYXJlIG1hbGZvcm1lZDogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRk9DVVNfQVJFQVMpKTsKQEAgLTE3MDAsMTAgKzE3NjYsMTMgQEAKICAgICAgICAgbmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfQVVUT19XSElURUJBTEFOQ0VfTE9DSykpOwogCiAgICAgLy8gTUVURVJJTkdfQVJFQVMKKyAgICBzaXplX3QgbWF4QWVSZWdpb25zID0gKHNpemVfdClzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKKyAgICAgICAgICAgIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04sIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pLgorICAgICAgICAgICAgZGF0YS5pMzJbUGFyYW1ldGVyczo6UkVHSU9OX0FFXTsKICAgICByZXMgPSBwYXJzZUFyZWFzKG5ld1BhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01FVEVSSU5HX0FSRUFTKSwKICAgICAgICAgICAgICZ2YWxpZGF0ZWRQYXJhbXMubWV0ZXJpbmdBcmVhcyk7CiAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICByZXMgPSB2YWxpZGF0ZUFyZWFzKHZhbGlkYXRlZFBhcmFtcy5tZXRlcmluZ0FyZWFzLCBtYXgzYVJlZ2lvbnMsCisgICAgICAgIHJlcyA9IHZhbGlkYXRlQXJlYXModmFsaWRhdGVkUGFyYW1zLm1ldGVyaW5nQXJlYXMsIG1heEFlUmVnaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkVBX0tJTkRfTUVURVJJTkcpOwogICAgIH0KICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0xNzI4LDIxICsxNzk3LDI2IEBACiAgICAgaWYgKHZhbGlkYXRlZFBhcmFtcy52aWRlb1dpZHRoICE9IHZpZGVvV2lkdGggfHwKICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy52aWRlb0hlaWdodCAhPSB2aWRlb0hlaWdodCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gUkVDT1JEKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFZpZGVvIHNpemUgY2Fubm90IGJlIHVwZGF0ZWQgd2hlbiByZWNvcmRpbmcgaXMgYWN0aXZlISIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVQcmV2aWV3U2l6ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlUHJldmlld1NpemVzW2ldLndpZHRoID09Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy52aWRlb1dpZHRoKSAmJgotICAgICAgICAgICAgICAgIChhdmFpbGFibGVQcmV2aWV3U2l6ZXNbaV0uaGVpZ2h0ID09Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy52aWRlb0hlaWdodCkpIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpID09IGF2YWlsYWJsZVByZXZpZXdTaXplcy5zaXplKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogUmVxdWVzdGVkIHZpZGVvIHNpemUgJWQgeCAlZCBpcyBub3Qgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB2YWxpZGF0ZWRQYXJhbXMudmlkZW9XaWR0aCwKKyAgICAgICAgICAgIEFMT0dXKCIlczogVmlkZW8gc2l6ZSBjYW5ub3QgYmUgdXBkYXRlZCAoZnJvbSAlZCB4ICVkIHRvICVkIHggJWQpIgorICAgICAgICAgICAgICAgICAgICAiIHdoZW4gcmVjb3JkaW5nIGlzIGFjdGl2ZSEgSWdub3JlIHRoZSBzaXplIHVwZGF0ZSEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCB2YWxpZGF0ZWRQYXJhbXMudmlkZW9XaWR0aCwKICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7CisgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9IZWlnaHQgPSB2aWRlb0hlaWdodDsKKyAgICAgICAgICAgIG5ld1BhcmFtcy5zZXRWaWRlb1NpemUodmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2YWlsYWJsZVZpZGVvU2l6ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKGF2YWlsYWJsZVZpZGVvU2l6ZXNbaV0ud2lkdGggPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy52aWRlb1dpZHRoKSAmJgorICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlVmlkZW9TaXplc1tpXS5oZWlnaHQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy52aWRlb0hlaWdodCkpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gYXZhaWxhYmxlVmlkZW9TaXplcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RlZCB2aWRlbyBzaXplICVkIHggJWQgaXMgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZhbGlkYXRlZFBhcmFtcy52aWRlb1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xNzY0LDYgKzE4MzgsNyBAQAogICAgIC8qKiBVcGRhdGUgaW50ZXJuYWwgcGFyYW1ldGVycyAqLwogCiAgICAgKnRoaXMgPSB2YWxpZGF0ZWRQYXJhbXM7CisgICAgdXBkYXRlT3ZlcnJpZGRlbkpwZWdTaXplKCk7CiAKICAgICAvKiogVXBkYXRlIGV4dGVybmFsIHBhcmFtZXRlcnMgY2FsY3VsYXRlZCBmcm9tIHRoZSBpbnRlcm5hbCBvbmVzICovCiAKQEAgLTE4MjYsNiArMTkwMSw5IEBACiAKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBpbnRlbnQgPQogICAgICAgICAgICAgcmVxdWVzdC0+ZmluZChBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQpOworCisgICAgaWYgKGludGVudC5jb3VudCA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOworCiAgICAgaWYgKGludGVudC5kYXRhLnU4WzBdID09IEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9TVElMTF9DQVBUVVJFKSB7CiAgICAgICAgIHJlcyA9IHJlcXVlc3QtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfVEFSR0VUX0ZQU19SQU5HRSwKICAgICAgICAgICAgICAgICBmYXN0SW5mby5iZXN0U3RpbGxDYXB0dXJlRnBzUmFuZ2UsIDIpOwpAQCAtMTg1Miw3ICsxOTMwLDcgQEAKICAgICAvLyAoZmFjZSBkZXRlY3Rpb24gc3RhdGlzdGljcyBhbmQgZmFjZSBwcmlvcml0eSBzY2VuZSBtb2RlKS4gTWFwIGZyb20gb3RoZXIKICAgICAvLyB0byB0aGUgb3RoZXIuCiAgICAgYm9vbCBzY2VuZU1vZGVBY3RpdmUgPQotICAgICAgICAgICAgc2NlbmVNb2RlICE9ICh1aW50OF90KUFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgc2NlbmVNb2RlICE9ICh1aW50OF90KUFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEOwogICAgIHVpbnQ4X3QgcmVxQ29udHJvbE1vZGUgPSBBTkRST0lEX0NPTlRST0xfTU9ERV9BVVRPOwogICAgIGlmIChlbmFibGVGYWNlRGV0ZWN0IHx8IHNjZW5lTW9kZUFjdGl2ZSkgewogICAgICAgICByZXFDb250cm9sTW9kZSA9IEFORFJPSURfQ09OVFJPTF9NT0RFX1VTRV9TQ0VORV9NT0RFOwpAQCAtMTg2NCw3ICsxOTQyLDcgQEAKICAgICB1aW50OF90IHJlcVNjZW5lTW9kZSA9CiAgICAgICAgICAgICBzY2VuZU1vZGVBY3RpdmUgPyBzY2VuZU1vZGUgOgogICAgICAgICAgICAgZW5hYmxlRmFjZURldGVjdCA/ICh1aW50OF90KUFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0ZBQ0VfUFJJT1JJVFkgOgotICAgICAgICAgICAgKHVpbnQ4X3QpQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAodWludDhfdClBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRDsKICAgICByZXMgPSByZXF1ZXN0LT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREUsCiAgICAgICAgICAgICAmcmVxU2NlbmVNb2RlLCAxKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwpAQCAtMTk4NSw2ICsyMDYzLDIzIEBACiAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzLCByZXFNZXRlcmluZ0FyZWFzU2l6ZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAorICAgIC8vIFNldCBhd2IgcmVnaW9ucyB0byBiZSB0aGUgc2FtZSBhcyB0aGUgbWV0ZXJpbmcgcmVnaW9ucyBpZiBhbGxvd2VkCisgICAgc2l6ZV90IG1heEF3YlJlZ2lvbnMgPSAoc2l6ZV90KXN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLAorICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTikuCisgICAgICAgICAgICBkYXRhLmkzMltQYXJhbWV0ZXJzOjpSRUdJT05fQVdCXTsKKyAgICBpZiAobWF4QXdiUmVnaW9ucyA+IDApIHsKKyAgICAgICAgaWYgKG1heEF3YlJlZ2lvbnMgPj0gbWV0ZXJpbmdBcmVhcy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcXVlc3QtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQVdCX1JFR0lPTlMsCisgICAgICAgICAgICAgICAgICAgIHJlcU1ldGVyaW5nQXJlYXMsIHJlcU1ldGVyaW5nQXJlYXNTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgYXdiIHJlZ2lvbnMgYXJlIHplcm9lZCBpZiB0aGUgcmVnaW9uIGNvdW50IGlzIHRvbyBoaWdoLgorICAgICAgICAgICAgaW50MzJfdCB6ZXJvZWRBd2JBcmVhc1s1XSA9IHswLCAwLCAwLCAwLCAwfTsKKyAgICAgICAgICAgIHJlcyA9IHJlcXVlc3QtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQVdCX1JFR0lPTlMsCisgICAgICAgICAgICAgICAgICAgIHplcm9lZEF3YkFyZWFzLCBzaXplb2YoemVyb2VkQXdiQXJlYXMpL3NpemVvZihpbnQzMl90KSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICBkZWxldGVbXSByZXFNZXRlcmluZ0FyZWFzOwogCiAgICAgLyogZG9uJ3QgaW5jbHVkZSBqcGVnIHRodW1ibmFpbCBzaXplIC0gaXQncyB2YWxpZCBmb3IKQEAgLTIwNjEsNiArMjE1Niw1MiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgUGFyYW1ldGVyczo6b3ZlcnJpZGVKcGVnU2l6ZUJ5VmlkZW9TaXplKCkgeworICAgIGlmIChwaWN0dXJlU2l6ZU92ZXJyaWRlbikgeworICAgICAgICBBTE9HVigiUGljdHVyZSBzaXplIGhhcyBiZWVuIG92ZXJyaWRkZW4uIFNraXAgb3ZlcnJpZGluZyIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgcGljdHVyZVNpemVPdmVycmlkZW4gPSB0cnVlOworICAgIHBpY3R1cmVXaWR0aExhc3RTZXQgPSBwaWN0dXJlV2lkdGg7CisgICAgcGljdHVyZUhlaWdodExhc3RTZXQgPSBwaWN0dXJlSGVpZ2h0OworICAgIHBpY3R1cmVXaWR0aCA9IHZpZGVvV2lkdGg7CisgICAgcGljdHVyZUhlaWdodCA9IHZpZGVvSGVpZ2h0OworICAgIC8vIFRoaXMgY2hhbmdlIG9mIHBpY3R1cmUgc2l6ZSBpcyBpbnZpc2libGUgdG8gYXBwIGxheWVyLgorICAgIC8vIERvIG5vdCB1cGRhdGUgYXBwIHZpc2libGUgcGFyYW1zCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBQYXJhbWV0ZXJzOjp1cGRhdGVPdmVycmlkZGVuSnBlZ1NpemUoKSB7CisgICAgaWYgKCFwaWN0dXJlU2l6ZU92ZXJyaWRlbikgeworICAgICAgICBBTE9HVigiUGljdHVyZSBzaXplIGhhcyBub3QgYmVlbiBvdmVycmlkZGVuLiBTa2lwIGNoZWNraW5nIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBwaWN0dXJlV2lkdGhMYXN0U2V0ID0gcGljdHVyZVdpZHRoOworICAgIHBpY3R1cmVIZWlnaHRMYXN0U2V0ID0gcGljdHVyZUhlaWdodDsKKworICAgIGlmIChwaWN0dXJlV2lkdGggPD0gdmlkZW9XaWR0aCAmJiBwaWN0dXJlSGVpZ2h0IDw9IHZpZGVvSGVpZ2h0KSB7CisgICAgICAgIC8vIFBpY3R1cmUgc2l6ZSBpcyBub3cgc21hbGxlciB0aGFuIHZpZGVvIHNpemUuIE5vIG5lZWQgdG8gb3ZlcnJpZGUgYW55bW9yZQorICAgICAgICByZXR1cm4gcmVjb3Zlck92ZXJyaWRkZW5KcGVnU2l6ZSgpOworICAgIH0KKworICAgIHBpY3R1cmVXaWR0aCA9IHZpZGVvV2lkdGg7CisgICAgcGljdHVyZUhlaWdodCA9IHZpZGVvSGVpZ2h0OworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBQYXJhbWV0ZXJzOjpyZWNvdmVyT3ZlcnJpZGRlbkpwZWdTaXplKCkgeworICAgIGlmICghcGljdHVyZVNpemVPdmVycmlkZW4pIHsKKyAgICAgICAgQUxPR1YoIlBpY3R1cmUgc2l6ZSBoYXMgbm90IGJlZW4gb3ZlcnJpZGRlbi4gU2tpcCByZWNvdmVyaW5nIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcGljdHVyZVNpemVPdmVycmlkZW4gPSBmYWxzZTsKKyAgICBwaWN0dXJlV2lkdGggPSBwaWN0dXJlV2lkdGhMYXN0U2V0OworICAgIHBpY3R1cmVIZWlnaHQgPSBwaWN0dXJlSGVpZ2h0TGFzdFNldDsKKyAgICByZXR1cm4gT0s7Cit9CiAKIGNvbnN0IGNoYXIqIFBhcmFtZXRlcnM6OmdldFN0YXRlTmFtZShTdGF0ZSBzdGF0ZSkgewogI2RlZmluZSBDQVNFX0VOVU1fVE9fQ0hBUih4KSBjYXNlIHg6IHJldHVybigjeCk7IGJyZWFrOwpAQCAtMjA4MCwyNCArMjIyMSw3IEBACiB9CiAKIGludCBQYXJhbWV0ZXJzOjpmb3JtYXRTdHJpbmdUb0VudW0oY29uc3QgY2hhciAqZm9ybWF0KSB7Ci0gICAgcmV0dXJuCi0gICAgICAgICFmb3JtYXQgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgOgotICAgICAgICAhc3RyY21wKGZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMlNQKSA/Ci0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9TUCA6IC8vIE5WMTYKLSAgICAgICAgIXN0cmNtcChmb3JtYXQsIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjBTUCkgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgOiAvLyBOVjIxCi0gICAgICAgICFzdHJjbXAoZm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIySSkgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfSSA6ICAvLyBZVVkyCi0gICAgICAgICFzdHJjbXAoZm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIwUCkgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyIDogICAgICAgICAvLyBZVjEyCi0gICAgICAgICFzdHJjbXAoZm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfUkdCNTY1KSA/Ci0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUgOiAgICAgIC8vIFJHQjU2NQotICAgICAgICAhc3RyY21wKGZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1JHQkE4ODg4KSA/Ci0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCA6ICAgIC8vIFJHQjg4ODgKLSAgICAgICAgIXN0cmNtcChmb3JtYXQsIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9CQVlFUl9SR0dCKSA/Ci0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JBV19TRU5TT1IgOiAgIC8vIFJhdyBzZW5zb3IgZGF0YQotICAgICAgICAtMTsKKyAgICByZXR1cm4gQ2FtZXJhUGFyYW1ldGVyczo6cHJldmlld0Zvcm1hdFRvRW51bShmb3JtYXQpOwogfQogCiBjb25zdCBjaGFyKiBQYXJhbWV0ZXJzOjpmb3JtYXRFbnVtVG9TdHJpbmcoaW50IGZvcm1hdCkgewpAQCAtMjIyNSw5ICsyMzQ5LDkgQEAKIGludCBQYXJhbWV0ZXJzOjpzY2VuZU1vZGVTdHJpbmdUb0VudW0oY29uc3QgY2hhciAqc2NlbmVNb2RlKSB7CiAgICAgcmV0dXJuCiAgICAgICAgICFzY2VuZU1vZGUgPwotICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQgOgorICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQgOgogICAgICAgICAhc3RyY21wKHNjZW5lTW9kZSwgQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9BVVRPKSA/Ci0gICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRCA6CisgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRCA6CiAgICAgICAgICFzdHJjbXAoc2NlbmVNb2RlLCBDYW1lcmFQYXJhbWV0ZXJzOjpTQ0VORV9NT0RFX0FDVElPTikgPwogICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfQUNUSU9OIDoKICAgICAgICAgIXN0cmNtcChzY2VuZU1vZGUsIENhbWVyYVBhcmFtZXRlcnM6OlNDRU5FX01PREVfUE9SVFJBSVQpID8KQEAgLTIyNjUsNyArMjM4OSw3IEBACiAgICAgICAgIGNvbnN0IGNoYXIgKmZsYXNoTW9kZSkgewogICAgIHJldHVybgogICAgICAgICAhZmxhc2hNb2RlID8KLSAgICAgICAgICAgIFBhcmFtZXRlcnM6OkZMQVNIX01PREVfSU5WQUxJRCA6CisgICAgICAgICAgICBQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRiA6CiAgICAgICAgICFzdHJjbXAoZmxhc2hNb2RlLCBDYW1lcmFQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRikgPwogICAgICAgICAgICAgUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkYgOgogICAgICAgICAhc3RyY21wKGZsYXNoTW9kZSwgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9BVVRPKSA/CkBAIC0yNDA2LDcgKzI1MzAsNyBAQAogICAgIH0KIAogICAgIGlmIChhcmVhcy5zaXplKCkgPiBtYXhSZWdpb25zKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVG9vIG1hbnkgYXJlYXMgcmVxdWVzdGVkOiAlZCIsCisgICAgICAgIEFMT0dFKCIlczogVG9vIG1hbnkgYXJlYXMgcmVxdWVzdGVkOiAlenUiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYXJlYXMuc2l6ZSgpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC0yNTY2LDcgKzI2OTAsNyBAQAogICAgIHJldHVybiBjcm9wWVRvQXJyYXkobm9ybWFsaXplZFlUb0Nyb3AoeSkpOwogfQogCi1zdGF0dXNfdCBQYXJhbWV0ZXJzOjpnZXRGaWx0ZXJlZFByZXZpZXdTaXplcyhTaXplIGxpbWl0LCBWZWN0b3I8U2l6ZT4gKnNpemVzKSB7CitzdGF0dXNfdCBQYXJhbWV0ZXJzOjpnZXRGaWx0ZXJlZFNpemVzKFNpemUgbGltaXQsIFZlY3RvcjxTaXplPiAqc2l6ZXMpIHsKICAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RhdGljIG1ldGFkYXRhIGlzIG5vdCBpbml0aWFsaXplZCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMjU3NSwyMiArMjY5OSwzNyBAQAogICAgICAgICBBTE9HRSgiJXM6IElucHV0IHNpemUgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIHNpemVzLT5jbGVhcigpOwogCi0gICAgY29uc3Qgc2l6ZV90IFNJWkVfQ09VTlQgPSBzaXplb2YoU2l6ZSkgLyBzaXplb2YoaW50KTsKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVQcm9jZXNzZWRTaXplcyA9Ci0gICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1BST0NFU1NFRF9TSVpFUywgU0laRV9DT1VOVCk7Ci0gICAgaWYgKGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmNvdW50IDwgU0laRV9DT1VOVCkgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIFNpemUgcHJldmlld1NpemU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5jb3VudDsgaSArPSBTSVpFX0NPVU5UKSB7Ci0gICAgICAgIHByZXZpZXdTaXplLndpZHRoID0gYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuZGF0YS5pMzJbaV07Ci0gICAgICAgIHByZXZpZXdTaXplLmhlaWdodCA9IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2krMV07Ci0gICAgICAgICAgICAvLyBOZWVkIHNraXAgdGhlIHByZXZpZXcgc2l6ZXMgdGhhdCBhcmUgdG9vIGxhcmdlLgotICAgICAgICAgICAgaWYgKHByZXZpZXdTaXplLndpZHRoIDw9IGxpbWl0LndpZHRoICYmCi0gICAgICAgICAgICAgICAgICAgIHByZXZpZXdTaXplLmhlaWdodCA8PSBsaW1pdC5oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBzaXplcy0+cHVzaChwcmV2aWV3U2l6ZSk7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBzY3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmVhbUNvbmZpZ3VyYXRpb24gJnNjID0gc2NzW2ldOworICAgICAgICAgICAgaWYgKHNjLmlzSW5wdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgJiYKKyAgICAgICAgICAgICAgICAgICAgc2MuZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgorICAgICAgICAgICAgICAgICAgICBzYy53aWR0aCA8PSBsaW1pdC53aWR0aCAmJiBzYy5oZWlnaHQgPD0gbGltaXQuaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgU2l6ZSBzeiA9IHtzYy53aWR0aCwgc2MuaGVpZ2h0fTsKKyAgICAgICAgICAgICAgICBzaXplcy0+cHVzaChzeik7CiAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBzaXplX3QgU0laRV9DT1VOVCA9IHNpemVvZihTaXplKSAvIHNpemVvZihpbnQpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVQcm9jZXNzZWRTaXplcyA9CisgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9QUk9DRVNTRURfU0laRVMsIFNJWkVfQ09VTlQpOworICAgICAgICBpZiAoYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQgPCBTSVpFX0NPVU5UKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgICAgIFNpemUgZmlsdGVyZWRTaXplOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmNvdW50OyBpICs9IFNJWkVfQ09VTlQpIHsKKyAgICAgICAgICAgIGZpbHRlcmVkU2l6ZS53aWR0aCA9IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2ldOworICAgICAgICAgICAgZmlsdGVyZWRTaXplLmhlaWdodCA9IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2krMV07CisgICAgICAgICAgICAgICAgLy8gTmVlZCBza2lwIHRoZSBwcmV2aWV3IHNpemVzIHRoYXQgYXJlIHRvbyBsYXJnZS4KKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRTaXplLndpZHRoIDw9IGxpbWl0LndpZHRoICYmCisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFNpemUuaGVpZ2h0IDw9IGxpbWl0LmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBzaXplcy0+cHVzaChmaWx0ZXJlZFNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KKwogICAgIGlmIChzaXplcy0+aXNFbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCJnZW5lcmF0ZWQgcHJldmlldyBzaXplIGxpc3QgaXMgZW1wdHkhISIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjYyNCw2ICsyNzYzLDc4IEBACiAgICAgcmV0dXJuIG1heFNpemU7CiB9CiAKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTdHJlYW1Db25maWd1cmF0aW9uPiBQYXJhbWV0ZXJzOjpnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpIHsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDQ7CisgICAgY29uc3QgaW50IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMDsKKyAgICBjb25zdCBpbnQgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDE7CisgICAgY29uc3QgaW50IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMjsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0lTX0lOUFVUX09GRlNFVCA9IDM7CisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjczsKKyAgICBpZiAobURldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBBTE9HRSgiU3RyZWFtQ29uZmlndXJhdGlvbiBpcyBvbmx5IHZhbGlkIGFmdGVyIGRldmljZSBIQUwgMy4yISIpOworICAgICAgICByZXR1cm4gc2NzOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MgPQorICAgICAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgIGludDMyX3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaXNJbnB1dCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9JU19JTlBVVF9PRkZTRVRdOworICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uIHNjID0ge2Zvcm1hdCwgd2lkdGgsIGhlaWdodCwgaXNJbnB1dH07CisgICAgICAgIHNjcy5hZGQoc2MpOworICAgIH0KKyAgICByZXR1cm4gc2NzOworfQorCitTb3J0ZWRWZWN0b3I8aW50MzJfdD4gUGFyYW1ldGVyczo6Z2V0QXZhaWxhYmxlT3V0cHV0Rm9ybWF0cygpIHsKKyAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gb3V0cHV0Rm9ybWF0czsgLy8gTm9uLWR1cGxpY2F0ZWQgb3V0cHV0IGZvcm1hdHMKKyAgICBpZiAobURldmljZVZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjcyA9IGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IHNjcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgU3RyZWFtQ29uZmlndXJhdGlvbiAmc2MgPSBzY3NbaV07CisgICAgICAgICAgICBpZiAoc2MuaXNJbnB1dCA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCkgeworICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdHMuYWRkKHNjLmZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb3JtYXRzID0gc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuY291bnQ7IGkrKykgeworICAgICAgICAgICAgb3V0cHV0Rm9ybWF0cy5hZGQoYXZhaWxhYmxlRm9ybWF0cy5kYXRhLmkzMltpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dHB1dEZvcm1hdHM7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKSB7CisgICAgVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IGpwZWdTaXplczsKKyAgICBpZiAobURldmljZVZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjcyA9IGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IHNjcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgU3RyZWFtQ29uZmlndXJhdGlvbiAmc2MgPSBzY3NbaV07CisgICAgICAgICAgICBpZiAoc2MuaXNJbnB1dCA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCAmJgorICAgICAgICAgICAgICAgICAgICBzYy5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICAgICAgU2l6ZSBzeiA9IHtzYy53aWR0aCwgc2MuaGVpZ2h0fTsKKyAgICAgICAgICAgICAgICBqcGVnU2l6ZXMuYWRkKHN6KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCBKUEVHX1NJWkVfRU5UUllfQ09VTlQgPSAyOworICAgICAgICBjb25zdCBpbnQgV0lEVEhfT0ZGU0VUID0gMDsKKyAgICAgICAgY29uc3QgaW50IEhFSUdIVF9PRkZTRVQgPSAxOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVKcGVnU2l6ZXMgPQorICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSlBFR19TSVpFUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudDsgaSs9IEpQRUdfU0laRV9FTlRSWV9DT1VOVCkgeworICAgICAgICAgICAgaW50IHdpZHRoID0gYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2kgKyBXSURUSF9PRkZTRVRdOworICAgICAgICAgICAgaW50IGhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpICsgSEVJR0hUX09GRlNFVF07CisgICAgICAgICAgICBTaXplIHN6ID0ge3dpZHRoLCBoZWlnaHR9OworICAgICAgICAgICAganBlZ1NpemVzLmFkZChzeik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGpwZWdTaXplczsKK30KKwogUGFyYW1ldGVyczo6Q3JvcFJlZ2lvbiBQYXJhbWV0ZXJzOjpjYWxjdWxhdGVDcm9wUmVnaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6OkNyb3BSZWdpb246Ok91dHB1dHMgb3V0cHV0cykgY29uc3QgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAppbmRleCBkYTA3Y2NmLi44MTVjYzU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKQEAgLTUyLDYgKzUyLDkgQEAKICAgICBpbnQgcHJldmlld1RyYW5zZm9ybTsgLy8gc2V0IGJ5IENBTUVSQV9DTURfU0VUX0RJU1BMQVlfT1JJRU5UQVRJT04KIAogICAgIGludCBwaWN0dXJlV2lkdGgsIHBpY3R1cmVIZWlnaHQ7CisgICAgLy8gU3RvcmUgdGhlIHBpY3R1cmUgc2l6ZSBiZWZvcmUgdGhleSBhcmUgb3ZlcnJpZGVuIGJ5IHZpZGVvIHNuYXBzaG90CisgICAgaW50IHBpY3R1cmVXaWR0aExhc3RTZXQsIHBpY3R1cmVIZWlnaHRMYXN0U2V0OworICAgIGJvb2wgcGljdHVyZVNpemVPdmVycmlkZW47CiAKICAgICBpbnQzMl90IGpwZWdUaHVtYlNpemVbMl07CiAgICAgdWludDhfdCBqcGVnUXVhbGl0eSwganBlZ1RodW1iUXVhbGl0eTsKQEAgLTExNCw2ICsxMTcsMTQgQEAKICAgICBib29sIGF1dG9FeHBvc3VyZUxvY2s7CiAgICAgYm9vbCBhdXRvV2hpdGVCYWxhbmNlTG9jazsKIAorICAgIC8vIDNBIHJlZ2lvbiB0eXBlcywgZm9yIHVzZSB3aXRoIEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUworICAgIGVudW0gcmVnaW9uX3QgeworICAgICAgICBSRUdJT05fQUUgPSAwLAorICAgICAgICBSRUdJT05fQVdCLAorICAgICAgICBSRUdJT05fQUYsCisgICAgICAgIE5VTV9SRUdJT04gLy8gTnVtYmVyIG9mIHJlZ2lvbiB0eXBlcworICAgIH0gcmVnaW9uOworCiAgICAgVmVjdG9yPEFyZWE+IG1ldGVyaW5nQXJlYXM7CiAKICAgICBpbnQgem9vbTsKQEAgLTE2OCw4ICsxNzksMTMgQEAKICAgICAvLyBOdW1iZXIgb2Ygem9vbSBzdGVwcyB0byBzaW11bGF0ZQogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTlVNX1pPT01fU1RFUFMgPSAxMDA7CiAgICAgLy8gTWF4IHByZXZpZXcgc2l6ZSBhbGxvd2VkCisgICAgLy8gVGhpcyBpcyBzZXQgdG8gYSAxOjEgdmFsdWUgdG8gYWxsb3cgZm9yIGFueSBhc3BlY3QgcmF0aW8gdGhhdCBoYXMKKyAgICAvLyBhIG1heCBsb25nIHNpZGUgb2YgMTkyMCBwaXhlbHMKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE1BWF9QUkVWSUVXX1dJRFRIID0gMTkyMDsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE1BWF9QUkVWSUVXX0hFSUdIVCA9IDEwODA7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBNQVhfUFJFVklFV19IRUlHSFQgPSAxOTIwOworICAgIC8vIEluaXRpYWwgbWF4IHByZXZpZXcvcmVjb3JkaW5nIHNpemUgYm91bmQKKyAgICBzdGF0aWMgY29uc3QgaW50IE1BWF9JTklUSUFMX1BSRVZJRVdfV0lEVEggPSAxOTIwOworICAgIHN0YXRpYyBjb25zdCBpbnQgTUFYX0lOSVRJQUxfUFJFVklFV19IRUlHSFQgPSAxMDgwOwogICAgIC8vIEFzcGVjdCByYXRpbyB0b2xlcmFuY2UKICAgICBzdGF0aWMgY29uc3QgZmxvYXQgQVNQRUNUX1JBVElPX1RPTEVSQU5DRSA9IDAuMDAxOwogCkBAIC0yMTksNyArMjM1LDcgQEAKICAgICB+UGFyYW1ldGVycygpOwogCiAgICAgLy8gU2V0cyB1cCBkZWZhdWx0IHBhcmFtZXRlcnMKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICppbmZvKTsKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICppbmZvLCBpbnQgZGV2aWNlVmVyc2lvbik7CiAKICAgICAvLyBCdWlsZCBmYXN0LWFjY2VzcyBkZXZpY2Ugc3RhdGljIGluZm8gZnJvbSBzdGF0aWMgaW5mbwogICAgIHN0YXR1c190IGJ1aWxkRmFzdEluZm8oKTsKQEAgLTI0NSw2ICsyNjEsMTIgQEAKICAgICAvLyBBZGQvdXBkYXRlIEpQRUcgZW50cmllcyBpbiBtZXRhZGF0YQogICAgIHN0YXR1c190IHVwZGF0ZVJlcXVlc3RKcGVnKENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KSBjb25zdDsKIAorICAgIC8qIEhlbHBlciBmdW5jdGlvbnMgdG8gb3ZlcnJpZGUganBlZyBzaXplIGZvciB2aWRlbyBzbmFwc2hvdCAqLworICAgIC8vIE92ZXJyaWRlIGpwZWcgc2l6ZSBieSB2aWRlbyBzaXplLiBDYWxsZWQgZHVyaW5nIHN0YXJ0UmVjb3JkaW5nLgorICAgIHN0YXR1c190IG92ZXJyaWRlSnBlZ1NpemVCeVZpZGVvU2l6ZSgpOworICAgIC8vIFJlY292ZXIgb3ZlcnJpZGRlbiBqcGVnIHNpemUuICBDYWxsZWQgZHVyaW5nIHN0b3BSZWNvcmRpbmcuCisgICAgc3RhdHVzX3QgcmVjb3Zlck92ZXJyaWRkZW5KcGVnU2l6ZSgpOworCiAgICAgLy8gQ2FsY3VsYXRlIHRoZSBjcm9wIHJlZ2lvbiByZWN0YW5nbGUgYmFzZWQgb24gY3VycmVudCBzdHJlYW0gc2l6ZXMKICAgICBzdHJ1Y3QgQ3JvcFJlZ2lvbiB7CiAgICAgICAgIGZsb2F0IGxlZnQ7CkBAIC0zMzQsMTAgKzM1NiwzNSBAQAogICAgIGludCBub3JtYWxpemVkWVRvQ3JvcChpbnQgeSkgY29uc3Q7CiAKICAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlUHJldmlld1NpemVzOworICAgIFZlY3RvcjxTaXplPiBhdmFpbGFibGVWaWRlb1NpemVzOwogICAgIC8vIEdldCBzaXplIGxpc3QgKHRoYXQgYXJlIG5vIGxhcmdlciB0aGFuIGxpbWl0KSBmcm9tIHN0YXRpYyBtZXRhZGF0YS4KLSAgICBzdGF0dXNfdCBnZXRGaWx0ZXJlZFByZXZpZXdTaXplcyhTaXplIGxpbWl0LCBWZWN0b3I8U2l6ZT4gKnNpemVzKTsKKyAgICBzdGF0dXNfdCBnZXRGaWx0ZXJlZFNpemVzKFNpemUgbGltaXQsIFZlY3RvcjxTaXplPiAqc2l6ZXMpOwogICAgIC8vIEdldCBtYXggc2l6ZSAoZnJvbSB0aGUgc2l6ZSBhcnJheSkgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBhc3BlY3QgcmF0aW8uCiAgICAgU2l6ZSBnZXRNYXhTaXplRm9yUmF0aW8oZmxvYXQgcmF0aW8sIGNvbnN0IGludDMyX3QqIHNpemVBcnJheSwgc2l6ZV90IGNvdW50KTsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbiBmb3Igb3ZlcnJpZGluZyBqcGVnIHNpemUgZm9yIHZpZGVvIHNuYXBzaG90CisgICAgLy8gQ2hlY2sgaWYgb3ZlcnJpZGRlbiBqcGVnIHNpemUgbmVlZHMgdG8gYmUgdXBkYXRlZCBhZnRlciBQYXJhbWV0ZXJzOjpzZXQuCisgICAgLy8gVGhlIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGFpbG9yZWQgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIFBhcmFtZXRlcnM6OnNldC4KKyAgICAvLyBEbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24gZm9yIG90aGVyIHB1cnBvc2UuCisgICAgc3RhdHVzX3QgdXBkYXRlT3ZlcnJpZGRlbkpwZWdTaXplKCk7CisKKyAgICBzdHJ1Y3QgU3RyZWFtQ29uZmlndXJhdGlvbiB7CisgICAgICAgIGludDMyX3QgZm9ybWF0OworICAgICAgICBpbnQzMl90IHdpZHRoOworICAgICAgICBpbnQzMl90IGhlaWdodDsKKyAgICAgICAgaW50MzJfdCBpc0lucHV0OworICAgIH07CisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGV4dHJhY3QgYXZhaWxhYmxlIHN0cmVhbSBjb25maWd1cmF0aW9uCisgICAgLy8gT25seSB2YWxpZCBzaW5jZSBkZXZpY2UgSEFMIHZlcnNpb24gMy4yCisgICAgLy8gcmV0dXJucyBhbiBlbXB0eSBWZWN0b3IgaWYgZGV2aWNlIEhBTCB2ZXJzaW9uIGRvZXMgc3VwcG9ydCBpdAorICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOworCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBub24tZHVwbGljYXRlZCBhdmFpbGFibGUgb3V0cHV0IGZvcm1hdHMKKyAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gZ2V0QXZhaWxhYmxlT3V0cHV0Rm9ybWF0cygpOworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgYXZhaWxhYmxlIG91dHB1dCBqcGVnIHNpemVzCisgICAgVmVjdG9yPFNpemU+IGdldEF2YWlsYWJsZUpwZWdTaXplcygpOworCisgICAgaW50IG1EZXZpY2VWZXJzaW9uOwogfTsKIAogLy8gVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIFBhcmFtZXRlcnMgY2xhc3Mgc28gdGhhdCBpdCBjYW4gb25seSBiZSBhY2Nlc3NlZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAppbmRleCA2MDc2ZGFlLi45ZTdmZmY4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcApAQCAtODksOCArODksMjYgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBtKG1NdXRleCk7CiAgICAgaWYgKG1QcmV2aWV3UmVxdWVzdC5lbnRyeUNvdW50KCkgPT0gMCkgewotICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfUFJFVklFVywKLSAgICAgICAgICAgICAgICAmbVByZXZpZXdSZXF1ZXN0KTsKKyAgICAgICAgc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50ID0gbUNsaWVudC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChjbGllbnQgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENsaWVudCBkb2VzIG5vdCBleGlzdCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVzZSBDQU1FUkEzX1RFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUcgZm9yIFpTTCBzdHJlYW1pbmcgY2FzZS4KKyAgICAgICAgaWYgKGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlVmVyc2lvbigpID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgICAgICBpZiAocGFyYW1zLnpzbE1vZGUgJiYgIXBhcmFtcy5yZWNvcmRpbmdIaW50KSB7CisgICAgICAgICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkEzX1RFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAmbVByZXZpZXdSZXF1ZXN0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkEzX1RFTVBMQVRFX1BSRVZJRVcsCisgICAgICAgICAgICAgICAgICAgICAgICAmbVByZXZpZXdSZXF1ZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBMl9URU1QTEFURV9QUkVWSUVXLAorICAgICAgICAgICAgICAgICAgICAmbVByZXZpZXdSZXF1ZXN0KTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gY3JlYXRlIGRlZmF1bHQgcHJldmlldyByZXF1ZXN0OiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTYzLDggKzE4MSw3IEBACiAgICAgaWYgKG1QcmV2aWV3U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1QcmV2aWV3V2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0LAotICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsIDAsCi0gICAgICAgICAgICAgICAgJm1QcmV2aWV3U3RyZWFtSWQpOworICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsICZtUHJldmlld1N0cmVhbUlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBjcmVhdGUgcHJldmlldyBzdHJlYW06ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0yMjUsMTQgKzI0MiwxNCBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBzdXBwb3J0IHRoaXMgbWFueSBidWZmZXIgc2xvdHMKICAgICBpZiAoY291bnQgPiBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUykgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVG9vIG1hbnkgcmVjb3JkaW5nIGJ1ZmZlcnMgcmVxdWVzdGVkOiAlZCwgbWF4ICVkIiwKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFRvbyBtYW55IHJlY29yZGluZyBidWZmZXJzIHJlcXVlc3RlZDogJXp1LCBtYXggJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBjb3VudCwgQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFMpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBtKG1NdXRleCk7CiAKLSAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogTmV3IHJlY29yZGluZyBidWZmZXIgY291bnQgZnJvbSBlbmNvZGVyOiAlZCIsCisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IE5ldyByZWNvcmRpbmcgYnVmZmVyIGNvdW50IGZyb20gZW5jb2RlcjogJXp1IiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBjb3VudCk7CiAKICAgICAvLyBOZWVkIHRvIHJlLXNpemUgY29uc3VtZXIgYW5kIGhlYXAKQEAgLTMwMSw2ICszMTgsNDQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0cmVhbWluZ1Byb2Nlc3Nvcjo6cmVjb3JkaW5nU3RyZWFtTmVlZHNVcGRhdGUoCisgICAgICAgIGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcywgYm9vbCAqbmVlZHNVcGRhdGUpIHsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBpZiAobmVlZHNVcGRhdGUgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogaW52YWxpZCBhcmd1bWVudCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChtUmVjb3JkaW5nU3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CisgICAgICAgICpuZWVkc1VwZGF0ZSA9IHRydWU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2aWNlID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IERldmljZSBkb2VzIG5vdCBleGlzdCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKKyAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obVJlY29yZGluZ1N0cmVhbUlkLAorICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDApOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIHJlY29yZGluZyBvdXRwdXQgc3RyZWFtIGluZm86ICIKKyAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmIChtUmVjb3JkaW5nQ29uc3VtZXIgPT0gMCB8fCBjdXJyZW50V2lkdGggIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb1dpZHRoIHx8CisgICAgICAgICAgICBjdXJyZW50SGVpZ2h0ICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9IZWlnaHQpIHsKKyAgICAgICAgKm5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICB9CisgICAgKm5lZWRzVXBkYXRlID0gZmFsc2U7CisgICAgcmV0dXJuIHJlczsKK30KKwogc3RhdHVzX3QgU3RyZWFtaW5nUHJvY2Vzc29yOjp1cGRhdGVSZWNvcmRpbmdTdHJlYW0oY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CkBAIC0zMTQsMTggKzM2OSwyMCBAQAogCiAgICAgYm9vbCBuZXdDb25zdW1lciA9IGZhbHNlOwogICAgIGlmIChtUmVjb3JkaW5nQ29uc3VtZXIgPT0gMCkgewotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQ3JlYXRpbmcgcmVjb3JkaW5nIGNvbnN1bWVyIHdpdGggJWQgKyAxICIKKyAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENyZWF0aW5nIHJlY29yZGluZyBjb25zdW1lciB3aXRoICV6dSArIDEgIgogICAgICAgICAgICAgICAgICJjb25zdW1lci1zaWRlIGJ1ZmZlcnMiLCBfX0ZVTkNUSU9OX18sIG1JZCwgbVJlY29yZGluZ0hlYXBDb3VudCk7CiAgICAgICAgIC8vIENyZWF0ZSBDUFUgYnVmZmVyIHF1ZXVlIGVuZHBvaW50LiBXZSBuZWVkIG9uZSBtb3JlIGJ1ZmZlciBoZXJlIHNvIHRoYXQgd2UgY2FuCiAgICAgICAgIC8vIGFsd2F5cyBhY3F1aXJlIGFuZCBmcmVlIGEgYnVmZmVyIHdoZW4gdGhlIGhlYXAgaXMgZnVsbDsgb3RoZXJ3aXNlIHRoZSBjb25zdW1lcgogICAgICAgICAvLyB3aWxsIGhhdmUgYnVmZmVycyBpbiBmbGlnaHQgd2UnbGwgbmV2ZXIgY2xlYXIgb3V0LgotICAgICAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICAgICAgbVJlY29yZGluZ0NvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihicSwKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGNvbnN1bWVyLAogICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKICAgICAgICAgICAgICAgICBtUmVjb3JkaW5nSGVhcENvdW50ICsgMSk7CiAgICAgICAgIG1SZWNvcmRpbmdDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgbVJlY29yZGluZ0NvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTItUmVjb3JkaW5nQ29uc3VtZXIiKSk7Ci0gICAgICAgIG1SZWNvcmRpbmdXaW5kb3cgPSBuZXcgU3VyZmFjZShicSk7CisgICAgICAgIG1SZWNvcmRpbmdXaW5kb3cgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgICAgIG5ld0NvbnN1bWVyID0gdHJ1ZTsKICAgICAgICAgLy8gQWxsb2NhdGUgbWVtb3J5IGxhdGVyLCBzaW5jZSB3ZSBkb24ndCBrbm93IGJ1ZmZlciBzaXplIHVudGlsIHJlY2VpcHQKICAgICB9CkBAIC0zNjUsNyArNDIyLDcgQEAKICAgICAgICAgbVJlY29yZGluZ0ZyYW1lQ291bnQgPSAwOwogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtUmVjb3JkaW5nV2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy52aWRlb1dpZHRoLCBwYXJhbXMudmlkZW9IZWlnaHQsCi0gICAgICAgICAgICAgICAgQ0FNRVJBMl9IQUxfUElYRUxfRk9STUFUX09QQVFVRSwgMCwgJm1SZWNvcmRpbmdTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgQ0FNRVJBMl9IQUxfUElYRUxfRk9STUFUX09QQVFVRSwgJm1SZWNvcmRpbmdTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgcmVjb3JkaW5nOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC00MjgsMTQgKzQ4NSwxNyBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIG0obU11dGV4KTsKIAotICAgIC8vIElmIGEgcmVjb3JkaW5nIHN0cmVhbSBpcyBiZWluZyBzdGFydGVkIHVwLCBmcmVlIHVwIGFueQotICAgIC8vIG91dHN0YW5kaW5nIGJ1ZmZlcnMgbGVmdCBmcm9tIHRoZSBwcmV2aW91cyByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICAvLyBUaGVyZSBzaG91bGQgbmV2ZXIgYmUgYW55LCBzbyBpZiB0aGVyZSBhcmUsIHdhcm4gYWJvdXQgaXQuCi0gICAgaWYgKGlzU3RyZWFtQWN0aXZlKG91dHB1dFN0cmVhbXMsIG1SZWNvcmRpbmdTdHJlYW1JZCkpIHsKKyAgICAvLyBJZiBhIHJlY29yZGluZyBzdHJlYW0gaXMgYmVpbmcgc3RhcnRlZCB1cCBhbmQgbm8gcmVjb3JkaW5nCisgICAgLy8gc3RyZWFtIGlzIGFjdGl2ZSB5ZXQsIGZyZWUgdXAgYW55IG91dHN0YW5kaW5nIGJ1ZmZlcnMgbGVmdAorICAgIC8vIGZyb20gdGhlIHByZXZpb3VzIHJlY29yZGluZyBzZXNzaW9uLiBUaGVyZSBzaG91bGQgbmV2ZXIgYmUKKyAgICAvLyBhbnksIHNvIGlmIHRoZXJlIGFyZSwgd2FybiBhYm91dCBpdC4KKyAgICBib29sIGlzUmVjb3JkaW5nU3RyZWFtSWRsZSA9ICFpc1N0cmVhbUFjdGl2ZShtQWN0aXZlU3RyZWFtSWRzLCBtUmVjb3JkaW5nU3RyZWFtSWQpOworICAgIGJvb2wgc3RhcnRSZWNvcmRpbmdTdHJlYW0gPSBpc1N0cmVhbUFjdGl2ZShvdXRwdXRTdHJlYW1zLCBtUmVjb3JkaW5nU3RyZWFtSWQpOworICAgIGlmIChzdGFydFJlY29yZGluZ1N0cmVhbSAmJiBpc1JlY29yZGluZ1N0cmVhbUlkbGUpIHsKICAgICAgICAgcmVsZWFzZUFsbFJlY29yZGluZ0ZyYW1lc0xvY2tlZCgpOwogICAgIH0KIAotICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiAlcyBzdGFydGVkLCByZWNvcmRpbmcgaGVhcCBoYXMgJWQgZnJlZSBvZiAlZCIsCisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6ICVzIHN0YXJ0ZWQsIHJlY29yZGluZyBoZWFwIGhhcyAlenUgZnJlZSBvZiAlenUiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsICh0eXBlID09IFBSRVZJRVcpID8gInByZXZpZXciIDogInJlY29yZGluZyIsCiAgICAgICAgICAgICBtUmVjb3JkaW5nSGVhcEZyZWUsIG1SZWNvcmRpbmdIZWFwQ291bnQpOwogCkBAIC02NTgsOCArNzE4LDggQEAKIAogICAgICAgICBpZiAobVJlY29yZGluZ0hlYXAgPT0gMCkgewogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGJ1ZmZlclNpemUgPSA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCk7Ci0gICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQ3JlYXRpbmcgcmVjb3JkaW5nIGhlYXAgd2l0aCAlZCBidWZmZXJzIG9mICIKLSAgICAgICAgICAgICAgICAgICAgInNpemUgJWQgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIG1JZCwKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDcmVhdGluZyByZWNvcmRpbmcgaGVhcCB3aXRoICV6dSBidWZmZXJzIG9mICIKKyAgICAgICAgICAgICAgICAgICAgInNpemUgJXp1IGJ5dGVzIiwgX19GVU5DVElPTl9fLCBtSWQsCiAgICAgICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwQ291bnQsIGJ1ZmZlclNpemUpOwogCiAgICAgICAgICAgICBtUmVjb3JkaW5nSGVhcCA9IG5ldyBDYW1lcmEySGVhcChidWZmZXJTaXplLCBtUmVjb3JkaW5nSGVhcENvdW50LApAQCAtODE5LDEwICs4NzksMTAgQEAKICAgICB9CiAKICAgICBpZiAocmVsZWFzZWRDb3VudCA+IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IEZvcmNlLWZyZWVkICVkIG91dHN0YW5kaW5nIGJ1ZmZlcnMgIgorICAgICAgICBBTE9HVygiJXM6IENhbWVyYSAlZDogRm9yY2UtZnJlZWQgJXp1IG91dHN0YW5kaW5nIGJ1ZmZlcnMgIgogICAgICAgICAgICAgICAgICJmcm9tIHByZXZpb3VzIHJlY29yZGluZyBzZXNzaW9uIiwgX19GVU5DVElPTl9fLCBtSWQsIHJlbGVhc2VkQ291bnQpOwogICAgICAgICBBTE9HRV9JRihyZWxlYXNlZENvdW50ICE9IG1SZWNvcmRpbmdIZWFwQ291bnQgLSBtUmVjb3JkaW5nSGVhcEZyZWUsCi0gICAgICAgICAgICAiJXM6IENhbWVyYSAlZDogRm9yY2UtZnJlZWQgJWQgYnVmZmVycywgYnV0IGV4cGVjdGVkICVkIiwKKyAgICAgICAgICAgICIlczogQ2FtZXJhICVkOiBGb3JjZS1mcmVlZCAlenUgYnVmZmVycywgYnV0IGV4cGVjdGVkICV6dSIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgcmVsZWFzZWRDb3VudCwgbVJlY29yZGluZ0hlYXBDb3VudCAtIG1SZWNvcmRpbmdIZWFwRnJlZSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmgKaW5kZXggODMzYmI4Zi4uODQ2NmFmNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuaApAQCAtNTQsNiArNTQsOSBAQAogCiAgICAgc3RhdHVzX3Qgc2V0UmVjb3JkaW5nQnVmZmVyQ291bnQoc2l6ZV90IGNvdW50KTsKICAgICBzdGF0dXNfdCB1cGRhdGVSZWNvcmRpbmdSZXF1ZXN0KGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcyk7CisgICAgLy8gSWYgbmVlZHNVcGRhdGUgaXMgc2V0IHRvIHRydWUsIGEgdXBkYXRlUmVjb3JkaW5nU3RyZWFtIGNhbGwgd2l0aCBwYXJhbXMgd2lsbCByZWNyZWF0ZQorICAgIC8vIHJlY29yZGluZyBzdHJlYW0KKyAgICBzdGF0dXNfdCByZWNvcmRpbmdTdHJlYW1OZWVkc1VwZGF0ZShjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMsIGJvb2wgKm5lZWRzVXBkYXRlKTsKICAgICBzdGF0dXNfdCB1cGRhdGVSZWNvcmRpbmdTdHJlYW0oY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKTsKICAgICBzdGF0dXNfdCBkZWxldGVSZWNvcmRpbmdTdHJlYW0oKTsKICAgICBpbnQgZ2V0UmVjb3JkaW5nU3RyZWFtSWQoKSBjb25zdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKaW5kZXggNDIwN2JhOS4uOGY3ODEwMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKQEAgLTI1LDYgKzI1LDggQEAKICNkZWZpbmUgQUxPR1ZWKC4uLikgKCh2b2lkKTApCiAjZW5kaWYKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CkBAIC00Niw2ICs0OCw3IEBACiAgICAgICAgIG1EZXZpY2UoY2xpZW50LT5nZXRDYW1lcmFEZXZpY2UoKSksCiAgICAgICAgIG1TZXF1ZW5jZXIoc2VxdWVuY2VyKSwKICAgICAgICAgbUlkKGNsaWVudC0+Z2V0Q2FtZXJhSWQoKSksCisgICAgICAgIG1EZWxldGVkKGZhbHNlKSwKICAgICAgICAgbVpzbEJ1ZmZlckF2YWlsYWJsZShmYWxzZSksCiAgICAgICAgIG1ac2xTdHJlYW1JZChOT19TVFJFQU0pLAogICAgICAgICBtWnNsUmVwcm9jZXNzU3RyZWFtSWQoTk9fU1RSRUFNKSwKQEAgLTYwLDcgKzYzLDcgQEAKIAogWnNsUHJvY2Vzc29yOjp+WnNsUHJvY2Vzc29yKCkgewogICAgIEFMT0dWKCIlczogRXhpdCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgZGVsZXRlU3RyZWFtKCk7CisgICAgZGlzY29ubmVjdCgpOwogfQogCiB2b2lkIFpzbFByb2Nlc3Nvcjo6b25GcmFtZUF2YWlsYWJsZSgpIHsKQEAgLTcxLDE4ICs3NCwxOSBAQAogICAgIH0KIH0KIAotdm9pZCBac2xQcm9jZXNzb3I6Om9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCAvKnJlcXVlc3RJZCovLAotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUpIHsKK3ZvaWQgWnNsUHJvY2Vzc29yOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczoiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKLSAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKKyAgICBlbnRyeSA9IHJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOwogICAgIG5zZWNzX3QgdGltZXN0YW1wID0gZW50cnkuZGF0YS5pNjRbMF07CiAgICAgKHZvaWQpdGltZXN0YW1wOwotICAgIEFMT0dWVigiR290IHByZXZpZXcgZnJhbWUgZm9yIHRpbWVzdGFtcCAlbGxkIiwgdGltZXN0YW1wKTsKKyAgICBBTE9HVlYoIkdvdCBwcmV2aWV3IGZyYW1lIGZvciB0aW1lc3RhbXAgJSIgUFJJZDY0LCB0aW1lc3RhbXApOwogCiAgICAgaWYgKG1TdGF0ZSAhPSBSVU5OSU5HKSByZXR1cm47CiAKLSAgICBtRnJhbWVMaXN0LmVkaXRJdGVtQXQobUZyYW1lTGlzdEhlYWQpID0gZnJhbWU7CisgICAgbUZyYW1lTGlzdC5lZGl0SXRlbUF0KG1GcmFtZUxpc3RIZWFkKSA9IHJlc3VsdC5tTWV0YWRhdGE7CiAgICAgbUZyYW1lTGlzdEhlYWQgPSAobUZyYW1lTGlzdEhlYWQgKyAxKSAlIGtGcmFtZUxpc3REZXB0aDsKIAogICAgIGZpbmRNYXRjaGVzTG9ja2VkKCk7CkBAIC0xMjgsMTMgKzEzMiwxNSBAQAogCiAgICAgaWYgKG1ac2xDb25zdW1lciA9PSAwKSB7CiAgICAgICAgIC8vIENyZWF0ZSBDUFUgYnVmZmVyIHF1ZXVlIGVuZHBvaW50Ci0gICAgICAgIHNwPEJ1ZmZlclF1ZXVlPiBicSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgICAgICBtWnNsQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGJxLAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgIG1ac2xDb25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoY29uc3VtZXIsCiAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wsCiAgICAgICAgICAgICBrWnNsQnVmZmVyRGVwdGgpOwogICAgICAgICBtWnNsQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1ac2xDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEyQ2xpZW50Ojpac2xDb25zdW1lciIpKTsKLSAgICAgICAgbVpzbFdpbmRvdyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICAgICAgbVpzbFdpbmRvdyA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKICAgICB9CiAKICAgICBpZiAobVpzbFN0cmVhbUlkICE9IE5PX1NUUkVBTSkgewpAQCAtMTcwLDYgKzE3Niw4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBtRGVsZXRlZCA9IGZhbHNlOworCiAgICAgaWYgKG1ac2xTdHJlYW1JZCA9PSBOT19TVFJFQU0pIHsKICAgICAgICAgLy8gQ3JlYXRlIHN0cmVhbSBmb3IgSEFMIHByb2R1Y3Rpb24KICAgICAgICAgLy8gVE9ETzogU29ydCBvdXQgYmV0dGVyIHdheSB0byBzZWxlY3QgcmVzb2x1dGlvbiBmb3IgWlNMCkBAIC0xNzgsOCArMTg2LDcgQEAKICAgICAgICAgICAgICAgICAoaW50KUhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obVpzbFdpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMuZmFzdEluZm8uYXJyYXlXaWR0aCwgcGFyYW1zLmZhc3RJbmZvLmFycmF5SGVpZ2h0LAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIDAsCi0gICAgICAgICAgICAgICAgJm1ac2xTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgJm1ac2xTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgWlNMOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC0xOTcsMTMgKzIwNCwyMiBAQAogICAgIH0KICAgICBjbGllbnQtPnJlZ2lzdGVyRnJhbWVMaXN0ZW5lcihDYW1lcmEyQ2xpZW50OjprUHJldmlld1JlcXVlc3RJZFN0YXJ0LAogICAgICAgICAgICAgQ2FtZXJhMkNsaWVudDo6a1ByZXZpZXdSZXF1ZXN0SWRFbmQsCi0gICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAvKnNlbmRQYXJ0aWFscyovZmFsc2UpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBac2xQcm9jZXNzb3I6OmRlbGV0ZVN0cmVhbSgpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKKyAgICAvLyBXQVIoYi8xNTQwODEyOCk6IGRvIG5vdCBkZWxldGUgc3RyZWFtIHVubGVzcyBjbGllbnQgaXMgYmVpbmcgZGlzY29ubmVjdGVkLgorICAgIG1EZWxldGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFpzbFByb2Nlc3Nvcjo6ZGlzY29ubmVjdCgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKQEAgLTQ2MSw3ICs0NzcsNyBAQAogCiAgICAgbVpzbFF1ZXVlSGVhZCA9IChtWnNsUXVldWVIZWFkICsgMSkgJSBrWnNsQnVmZmVyRGVwdGg7CiAKLSAgICBBTE9HVlYoIiAgQWNxdWlyZWQgYnVmZmVyLCB0aW1lc3RhbXAgJWxsZCIsIHF1ZXVlSGVhZC5idWZmZXIubVRpbWVzdGFtcCk7CisgICAgQUxPR1ZWKCIgIEFjcXVpcmVkIGJ1ZmZlciwgdGltZXN0YW1wICUiIFBSSWQ2NCwgcXVldWVIZWFkLmJ1ZmZlci5tVGltZXN0YW1wKTsKIAogICAgIGZpbmRNYXRjaGVzTG9ja2VkKCk7CiAKQEAgLTQ4MCw3ICs0OTYsNyBAQAogICAgICAgICAgICAgICAgIGVudHJ5ID0gcXVldWVFbnRyeS5mcmFtZS5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CiAgICAgICAgICAgICAgICAgZnJhbWVUaW1lc3RhbXAgPSBlbnRyeS5kYXRhLmk2NFswXTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWVigiICAgJWQ6IGI6ICVsbGRcdGY6ICVsbGQiLCBpLAorICAgICAgICAgICAgQUxPR1ZWKCIgICAlZDogYjogJSIgUFJJZDY0ICJcdGY6ICUiIFBSSWQ2NCwgaSwKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyVGltZXN0YW1wLCBmcmFtZVRpbWVzdGFtcCApOwogICAgICAgICB9CiAgICAgICAgIGlmIChxdWV1ZUVudHJ5LmZyYW1lLmlzRW1wdHkoKSAmJiBidWZmZXJUaW1lc3RhbXAgIT0gMCkgewpAQCAtNDk4LDEzICs1MTQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBuc2Vjc190IGZyYW1lVGltZXN0YW1wID0gZW50cnkuZGF0YS5pNjRbMF07CiAgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJUaW1lc3RhbXAgPT0gZnJhbWVUaW1lc3RhbXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWVigiJXM6IEZvdW5kIG1hdGNoICVsbGQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIiVzOiBGb3VuZCBtYXRjaCAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVUaW1lc3RhbXApOwogICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWx0YSA9IGFicyhidWZmZXJUaW1lc3RhbXAgLSBmcmFtZVRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGRlbHRhIDwgMTAwMDAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWVigiJXM6IEZvdW5kIGNsb3NlIG1hdGNoICVsbGQgKGRlbHRhICVsbGQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIiVzOiBGb3VuZCBjbG9zZSBtYXRjaCAlIiBQUklkNjQgIiAoZGVsdGEgJSIgUFJJZDY0ICIpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVyVGltZXN0YW1wLCBkZWx0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTQwLDcgKzU1Niw3IEBACiAgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSBmcmFtZUFlU3RhdGUgPSBlbnRyeS5kYXRhLnU4WzBdOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZzggcmVzdWx0ID0KLSAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiAgICVkOiBiOiAlbGxkXHRmOiAlbGxkLCBBRSBzdGF0ZTogJWQiLCBpLAorICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiICAgJXp1OiBiOiAlIiBQUklkNjQgIlx0ZjogJSIgUFJJZDY0ICIsIEFFIHN0YXRlOiAlZCIsIGksCiAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJUaW1lc3RhbXAsIGZyYW1lVGltZXN0YW1wLCBmcmFtZUFlU3RhdGUpOwogICAgICAgICBBTE9HVigiJXMiLCByZXN1bHQuc3RyaW5nKCkpOwogICAgICAgICBpZiAoZmQgIT0gLTEpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaAppbmRleCA2ZDNjYjg1Li5iNjUzM2NmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CiAjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW1Db25zdW1lci5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CiAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3JJbnRlcmZhY2UuaCIKQEAgLTU0LDcgKzU1LDcgQEAKICAgICAvLyBGcm9tIG1ac2xDb25zdW1lcgogICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKCk7CiAgICAgLy8gRnJvbSBGcmFtZVByb2Nlc3NvcgotICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLCBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUpOworICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpOwogCiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoYnVmZmVyX2hhbmRsZV90ICpoYW5kbGUpOwogCkBAIC02Niw2ICs2Nyw3IEBACiAKICAgICBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKTsKICAgICBzdGF0dXNfdCBkZWxldGVTdHJlYW0oKTsKKyAgICBzdGF0dXNfdCBkaXNjb25uZWN0KCk7CiAgICAgaW50IGdldFN0cmVhbUlkKCkgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBwdXNoVG9SZXByb2Nlc3MoaW50MzJfdCByZXF1ZXN0SWQpOwpAQCAtODUsNiArODcsOCBAQAogICAgIHdwPENhcHR1cmVTZXF1ZW5jZXI+IG1TZXF1ZW5jZXI7CiAgICAgaW50IG1JZDsKIAorICAgIGJvb2wgbURlbGV0ZWQ7CisKICAgICBtdXRhYmxlIE11dGV4IG1JbnB1dE11dGV4OwogICAgIGJvb2wgbVpzbEJ1ZmZlckF2YWlsYWJsZTsKICAgICBDb25kaXRpb24gbVpzbEJ1ZmZlckF2YWlsYWJsZVNpZ25hbDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmNwcAppbmRleCA3NzZlYmUyLi5mMTEwYjY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwCkBAIC0yNSw2ICsyNSw4IEBACiAjZGVmaW5lIEFMT0dWViguLi4pICgodm9pZCkwKQogI2VuZGlmCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgpAQCAtNDIsNiArNDQsNyBAQAogICAgIHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCwKICAgICB3cDxDYXB0dXJlU2VxdWVuY2VyPiBzZXF1ZW5jZXIpOgogICAgICAgICBUaHJlYWQoZmFsc2UpLAorICAgICAgICBtTGF0ZXN0Q2xlYXJlZEJ1ZmZlclRpbWVzdGFtcCgwKSwKICAgICAgICAgbVN0YXRlKFJVTk5JTkcpLAogICAgICAgICBtQ2xpZW50KGNsaWVudCksCiAgICAgICAgIG1TZXF1ZW5jZXIoc2VxdWVuY2VyKSwKQEAgLTQ5LDkgKzUyLDQyIEBACiAgICAgICAgIG1ac2xTdHJlYW1JZChOT19TVFJFQU0pLAogICAgICAgICBtRnJhbWVMaXN0SGVhZCgwKSwKICAgICAgICAgbVpzbFF1ZXVlSGVhZCgwKSwKLSAgICAgICAgbVpzbFF1ZXVlVGFpbCgwKSB7Ci0gICAgbVpzbFF1ZXVlLmluc2VydEF0KDAsIGtac2xCdWZmZXJEZXB0aCk7Ci0gICAgbUZyYW1lTGlzdC5pbnNlcnRBdCgwLCBrRnJhbWVMaXN0RGVwdGgpOworICAgICAgICBtWnNsUXVldWVUYWlsKDApLAorICAgICAgICBtSGFzRm9jdXNlcihmYWxzZSkgeworICAgIC8vIEluaXRpYWxpemUgYnVmZmVyIHF1ZXVlIGFuZCBmcmFtZSBsaXN0IGJhc2VkIG9uIHBpcGVsaW5lIG1heCBkZXB0aC4KKyAgICBzaXplX3QgcGlwZWxpbmVNYXhEZXB0aCA9IGtEZWZhdWx0TWF4UGlwZWxpbmVEZXB0aDsKKyAgICBpZiAoY2xpZW50ICE9IDApIHsKKyAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gZGV2aWNlID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhM0RldmljZSo+KGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlKCkuZ2V0KCkpOworICAgICAgICBpZiAoZGV2aWNlICE9IDApIHsKKyAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0KKyAgICAgICAgICAgICAgICBkZXZpY2UtPmluZm8oKS5maW5kKEFORFJPSURfUkVRVUVTVF9QSVBFTElORV9NQVhfREVQVEgpOworICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICBwaXBlbGluZU1heERlcHRoID0gZW50cnkuZGF0YS51OFswXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gZmluZCB0aGUgYW5kcm9pZC5yZXF1ZXN0LnBpcGVsaW5lTWF4RGVwdGgsIgorICAgICAgICAgICAgICAgICAgICAgICAgIiB1c2UgZGVmYXVsdCBwaXBlbGluZSBtYXggZGVwdGggJXp1IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRNYXhQaXBlbGluZURlcHRoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW50cnkgPSBkZXZpY2UtPmluZm8oKS5maW5kKEFORFJPSURfTEVOU19JTkZPX01JTklNVU1fRk9DVVNfRElTVEFOQ0UpOworICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCAmJiBlbnRyeS5kYXRhLmZbMF0gIT0gMC4pIHsKKyAgICAgICAgICAgICAgICBtSGFzRm9jdXNlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiJXM6IEluaXRpYWxpemUgYnVmZmVyIHF1ZXVlIGFuZCBmcmFtZSBsaXN0IGRlcHRoIGJhc2VkIG9uIG1heCBwaXBlbGluZSBkZXB0aCAoJWQpIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBpcGVsaW5lTWF4RGVwdGgpOworICAgIC8vIE5lZWQgdG8ga2VlcCBidWZmZXIgcXVldWUgbG9uZ2VyIHRoYW4gbWV0YWRhdGEgcXVldWUgYmVjYXVzZSBzb21ldGltZXMgYnVmZmVyIGFycml2ZXMKKyAgICAvLyBlYXJsaWVyIHRoYW4gbWV0YWRhdGEgd2hpY2ggY2F1c2VzIHRoZSBidWZmZXIgY29ycmVzcG9uZGluZyB0byBvbGRlc3QgbWV0YWRhdGEgYmVpbmcKKyAgICAvLyByZW1vdmVkLgorICAgIG1GcmFtZUxpc3REZXB0aCA9IHBpcGVsaW5lTWF4RGVwdGg7CisgICAgbUJ1ZmZlclF1ZXVlRGVwdGggPSBtRnJhbWVMaXN0RGVwdGggKyAxOworCisKKyAgICBtWnNsUXVldWUuaW5zZXJ0QXQoMCwgbUJ1ZmZlclF1ZXVlRGVwdGgpOworICAgIG1GcmFtZUxpc3QuaW5zZXJ0QXQoMCwgbUZyYW1lTGlzdERlcHRoKTsKICAgICBzcDxDYXB0dXJlU2VxdWVuY2VyPiBjYXB0dXJlU2VxdWVuY2VyID0gbVNlcXVlbmNlci5wcm9tb3RlKCk7CiAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZXIgIT0gMCkgY2FwdHVyZVNlcXVlbmNlci0+c2V0WnNsUHJvY2Vzc29yKHRoaXMpOwogfQpAQCAtNjEsMTkgKzk3LDM0IEBACiAgICAgZGVsZXRlU3RyZWFtKCk7CiB9CiAKLXZvaWQgWnNsUHJvY2Vzc29yMzo6b25GcmFtZUF2YWlsYWJsZShpbnQzMl90IC8qcmVxdWVzdElkKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKSB7Cit2b2lkIFpzbFByb2Nlc3NvcjM6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwotICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOworICAgIGVudHJ5ID0gcmVzdWx0Lm1NZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CiAgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBlbnRyeS5kYXRhLmk2NFswXTsKLSAgICAodm9pZCl0aW1lc3RhbXA7Ci0gICAgQUxPR1ZWKCJHb3QgcHJldmlldyBtZXRhZGF0YSBmb3IgdGltZXN0YW1wICVsbGQiLCB0aW1lc3RhbXApOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbWV0YWRhdGEgZG9lc24ndCBoYXZlIHRpbWVzdGFtcCwgc2tpcCB0aGlzIHJlc3VsdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlbnRyeSA9IHJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQpOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbWV0YWRhdGEgZG9lc24ndCBoYXZlIGZyYW1lIG51bWJlciwgc2tpcCB0aGlzIHJlc3VsdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MzJfdCBmcmFtZU51bWJlciA9IGVudHJ5LmRhdGEuaTMyWzBdOworCisgICAgQUxPR1ZWKCJHb3QgcHJldmlldyBtZXRhZGF0YSBmb3IgZnJhbWUgJWQgd2l0aCB0aW1lc3RhbXAgJSIgUFJJZDY0LCBmcmFtZU51bWJlciwgdGltZXN0YW1wKTsKIAogICAgIGlmIChtU3RhdGUgIT0gUlVOTklORykgcmV0dXJuOwogCi0gICAgbUZyYW1lTGlzdC5lZGl0SXRlbUF0KG1GcmFtZUxpc3RIZWFkKSA9IGZyYW1lOwotICAgIG1GcmFtZUxpc3RIZWFkID0gKG1GcmFtZUxpc3RIZWFkICsgMSkgJSBrRnJhbWVMaXN0RGVwdGg7CisgICAgLy8gQ29ycmVzcG9uZGluZyBidWZmZXIgaGFzIGJlZW4gY2xlYXJlZC4gTm8gbmVlZCB0byBwdXNoIGludG8gbUZyYW1lTGlzdAorICAgIGlmICh0aW1lc3RhbXAgPD0gbUxhdGVzdENsZWFyZWRCdWZmZXJUaW1lc3RhbXApIHJldHVybjsKKworICAgIG1GcmFtZUxpc3QuZWRpdEl0ZW1BdChtRnJhbWVMaXN0SGVhZCkgPSByZXN1bHQubU1ldGFkYXRhOworICAgIG1GcmFtZUxpc3RIZWFkID0gKG1GcmFtZUxpc3RIZWFkICsgMSkgJSBtRnJhbWVMaXN0RGVwdGg7CiB9CiAKIHN0YXR1c190IFpzbFByb2Nlc3NvcjM6OnVwZGF0ZVN0cmVhbShjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpIHsKQEAgLTEzMyw3ICsxODQsNyBAQAogICAgICAgICAvLyBOb3RlIHRoYXQgZm9ybWF0IHNwZWNpZmllZCBpbnRlcm5hbGx5IGluIENhbWVyYTNac2xTdHJlYW0KICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVac2xTdHJlYW0oCiAgICAgICAgICAgICAgICAgcGFyYW1zLmZhc3RJbmZvLmFycmF5V2lkdGgsIHBhcmFtcy5mYXN0SW5mby5hcnJheUhlaWdodCwKLSAgICAgICAgICAgICAgICBrWnNsQnVmZmVyRGVwdGgsCisgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlRGVwdGgsCiAgICAgICAgICAgICAgICAgJm1ac2xTdHJlYW1JZCwKICAgICAgICAgICAgICAgICAmbVpzbFN0cmVhbSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTE0MiwxMCArMTkzLDE1IEBACiAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQorCisgICAgICAgIC8vIE9ubHkgYWRkIHRoZSBjYW1lcmEzIGJ1ZmZlciBsaXN0ZW5lciB3aGVuIHRoZSBzdHJlYW0gaXMgY3JlYXRlZC4KKyAgICAgICAgbVpzbFN0cmVhbS0+YWRkQnVmZmVyTGlzdGVuZXIodGhpcyk7CiAgICAgfQorCiAgICAgY2xpZW50LT5yZWdpc3RlckZyYW1lTGlzdGVuZXIoQ2FtZXJhMkNsaWVudDo6a1ByZXZpZXdSZXF1ZXN0SWRTdGFydCwKICAgICAgICAgICAgIENhbWVyYTJDbGllbnQ6OmtQcmV2aWV3UmVxdWVzdElkRW5kLAotICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL2ZhbHNlKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTE4OCw2ICsyNDQsNDYgQEAKICAgICByZXR1cm4gbVpzbFN0cmVhbUlkOwogfQogCitzdGF0dXNfdCBac2xQcm9jZXNzb3IzOjp1cGRhdGVSZXF1ZXN0V2l0aERlZmF1bHRTdGlsbFJlcXVlc3QoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpIGNvbnN0IHsKKyAgICBzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQgPSBtQ2xpZW50LnByb21vdGUoKTsKKyAgICBpZiAoY2xpZW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENsaWVudCBkb2VzIG5vdCBleGlzdCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzcDxDYW1lcmEzRGV2aWNlPiBkZXZpY2UgPQorICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmEzRGV2aWNlKj4oY2xpZW50LT5nZXRDYW1lcmFEZXZpY2UoKS5nZXQoKSk7CisgICAgaWYgKGRldmljZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBEZXZpY2UgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBDYW1lcmFNZXRhZGF0YSBzdGlsbFRlbXBsYXRlOworICAgIGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBM19URU1QTEFURV9TVElMTF9DQVBUVVJFLCAmc3RpbGxUZW1wbGF0ZSk7CisKKyAgICAvLyBGaW5kIHNvbWUgb2YgdGhlIHBvc3QtcHJvY2Vzc2luZyB0YWdzLCBhbmQgYXNzaWduIHRoZSB2YWx1ZSBmcm9tIHRlbXBsYXRlIHRvIHRoZSByZXF1ZXN0LgorICAgIC8vIE9ubHkgY2hlY2sgdGhlIGFiZXJyYXRpb24gbW9kZSBhbmQgbm9pc2UgcmVkdWN0aW9uIG1vZGUgZm9yIG5vdywgYXMgdGhleSBhcmUgdmVyeSBpbXBvcnRhbnQKKyAgICAvLyBmb3IgaW1hZ2UgcXVhbGl0eS4KKyAgICB1aW50MzJfdCBwb3N0UHJvY2Vzc2luZ1RhZ3NbXSA9IHsKKyAgICAgICAgICAgIEFORFJPSURfTk9JU0VfUkVEVUNUSU9OX01PREUsCisgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFLAorICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX01PREUsCisgICAgICAgICAgICBBTkRST0lEX1RPTkVNQVBfTU9ERSwKKyAgICAgICAgICAgIEFORFJPSURfU0hBRElOR19NT0RFLAorICAgICAgICAgICAgQU5EUk9JRF9IT1RfUElYRUxfTU9ERSwKKyAgICAgICAgICAgIEFORFJPSURfRURHRV9NT0RFCisgICAgfTsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHBvc3RQcm9jZXNzaW5nVGFncykgLyBzaXplb2YodWludDMyX3QpOyBpKyspIHsKKyAgICAgICAgZW50cnkgPSBzdGlsbFRlbXBsYXRlLmZpbmQocG9zdFByb2Nlc3NpbmdUYWdzW2ldKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgcmVxdWVzdC51cGRhdGUocG9zdFByb2Nlc3NpbmdUYWdzW2ldLCBlbnRyeS5kYXRhLnU4LCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgWnNsUHJvY2Vzc29yMzo6cHVzaFRvUmVwcm9jZXNzKGludDMyX3QgcmVxdWVzdElkKSB7CiAgICAgQUxPR1YoIiVzOiBTZW5kIGluIHJlcHJvY2VzcyByZXF1ZXN0IHdpdGggaWQgJWQiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXF1ZXN0SWQpOwpAQCAtMjQ3LDE4ICszNDMsNDUgQEAKICAgICAgICAgdWludDhfdCByZXF1ZXN0VHlwZSA9IEFORFJPSURfUkVRVUVTVF9UWVBFX1JFUFJPQ0VTUzsKICAgICAgICAgcmVzID0gcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX1RZUEUsCiAgICAgICAgICAgICAgICAgJnJlcXVlc3RUeXBlLCAxKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gdXBkYXRlIHJlcXVlc3QgdHlwZSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKICAgICAgICAgaW50MzJfdCBpbnB1dFN0cmVhbXNbMV0gPQogICAgICAgICAgICAgICAgIHsgbVpzbFN0cmVhbUlkIH07Ci0gICAgICAgIGlmIChyZXMgPT0gT0spIHJlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JTlBVVF9TVFJFQU1TLAorICAgICAgICByZXMgPSByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSU5QVVRfU1RSRUFNUywKICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbXMsIDEpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byB1cGRhdGUgcmVxdWVzdCBpbnB1dCBzdHJlYW1zIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90IGNhcHR1cmVJbnRlbnQgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9TVElMTF9DQVBUVVJFKTsKKyAgICAgICAgcmVzID0gcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5ULAorICAgICAgICAgICAgICAgICZjYXB0dXJlSW50ZW50LCAxKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSyApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHVwZGF0ZSByZXF1ZXN0IGNhcHR1cmUgaW50ZW50IiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKwogICAgICAgICAvLyBUT0RPOiBTaG91bGRuJ3Qgd2UgYWxzbyB1cGRhdGUgdGhlIGxhdGVzdCBwcmV2aWV3IGZyYW1lPwogICAgICAgICBpbnQzMl90IG91dHB1dFN0cmVhbXNbMV0gPQogICAgICAgICAgICAgICAgIHsgY2xpZW50LT5nZXRDYXB0dXJlU3RyZWFtSWQoKSB9OwotICAgICAgICBpZiAocmVzID09IE9LKSByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsCisgICAgICAgIHJlcyA9IHJlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywKICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW1zLCAxKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gdXBkYXRlIHJlcXVlc3Qgb3V0cHV0IHN0cmVhbXMiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCiAgICAgICAgIHJlcyA9IHJlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwKICAgICAgICAgICAgICAgICAmcmVxdWVzdElkLCAxKTsKLQogICAgICAgICBpZiAocmVzICE9IE9LICkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gdXBkYXRlIGZyYW1lIHRvIGEgcmVwcm9jZXNzIHJlcXVlc3QiLAogICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKQEAgLTI4Niw2ICs0MDksMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIC8vIFVwZGF0ZSBwb3N0LXByb2Nlc3Npbmcgc2V0dGluZ3MKKyAgICAgICAgcmVzID0gdXBkYXRlUmVxdWVzdFdpdGhEZWZhdWx0U3RpbGxSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IFVuYWJsZSB0byB1cGRhdGUgcG9zdC1wcm9jZXNzaW5nIHRhZ3MsIHRoZSByZXByb2Nlc3NlZCBpbWFnZSBxdWFsaXR5ICIKKyAgICAgICAgICAgICAgICAgICAgIm1heSBiZSBjb21wcm9taXNlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKwogICAgICAgICBtTGF0ZXN0Q2FwdHVyZWRSZXF1ZXN0ID0gcmVxdWVzdDsKICAgICAgICAgcmVzID0gY2xpZW50LT5nZXRDYW1lcmFEZXZpY2UoKS0+Y2FwdHVyZShyZXF1ZXN0KTsKICAgICAgICAgaWYgKHJlcyAhPSBPSyApIHsKQEAgLTMxMCwxMSArNDQwLDE5IEBACiAKIHN0YXR1c190IFpzbFByb2Nlc3NvcjM6OmNsZWFyWnNsUXVldWVMb2NrZWQoKSB7CiAgICAgaWYgKG1ac2xTdHJlYW0gIT0gMCkgewotICAgICAgICByZXR1cm4gbVpzbFN0cmVhbS0+Y2xlYXJJbnB1dFJpbmdCdWZmZXIoKTsKKyAgICAgICAgLy8gY2xlYXIgcmVzdWx0IG1ldGFkYXRhIGxpc3QgZmlyc3QuCisgICAgICAgIGNsZWFyWnNsUmVzdWx0UXVldWVMb2NrZWQoKTsKKyAgICAgICAgcmV0dXJuIG1ac2xTdHJlYW0tPmNsZWFySW5wdXRSaW5nQnVmZmVyKCZtTGF0ZXN0Q2xlYXJlZEJ1ZmZlclRpbWVzdGFtcCk7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBac2xQcm9jZXNzb3IzOjpjbGVhclpzbFJlc3VsdFF1ZXVlTG9ja2VkKCkgeworICAgIG1GcmFtZUxpc3QuY2xlYXIoKTsKKyAgICBtRnJhbWVMaXN0SGVhZCA9IDA7CisgICAgbUZyYW1lTGlzdC5pbnNlcnRBdCgwLCBtRnJhbWVMaXN0RGVwdGgpOworfQorCiB2b2lkIFpzbFByb2Nlc3NvcjM6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKmFyZ3MqLykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKICAgICBpZiAoIW1MYXRlc3RDYXB0dXJlZFJlcXVlc3QuaXNFbXB0eSgpKSB7CkBAIC0zNTUsNyArNDkzLDcgQEAKICAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIGZyYW1lQWVTdGF0ZSA9IGVudHJ5LmRhdGEudThbMF07CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nOCByZXN1bHQgPQotICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiICAgJWQ6IGI6ICVsbGRcdGY6ICVsbGQsIEFFIHN0YXRlOiAlZCIsIGksCisgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIgICAlenU6IGI6ICUiIFBSSWQ2NCAiXHRmOiAlIiBQUklkNjQgIiwgQUUgc3RhdGU6ICVkIiwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclRpbWVzdGFtcCwgZnJhbWVUaW1lc3RhbXAsIGZyYW1lQWVTdGF0ZSk7CiAgICAgICAgIEFMT0dWKCIlcyIsIHJlc3VsdC5zdHJpbmcoKSk7CiAgICAgICAgIGlmIChmZCAhPSAtMSkgewpAQCAtMzY2LDYgKzUwNCwyMyBAQAogICAgIH0KIH0KIAorYm9vbCBac2xQcm9jZXNzb3IzOjppc0ZpeGVkRm9jdXNNb2RlKHVpbnQ4X3QgYWZNb2RlKSBjb25zdCB7CisgICAgc3dpdGNoIChhZk1vZGUpIHsKKyAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9BVVRPOgorICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX0NPTlRJTlVPVVNfVklERU86CisgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX01PREVfQ09OVElOVU9VU19QSUNUVVJFOgorICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX01BQ1JPOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX01PREVfT0ZGOgorICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX0VET0Y6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogdW5rbm93biBmb2N1cyBtb2RlICVkIiwgX19GVU5DVElPTl9fLCBhZk1vZGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwogbnNlY3NfdCBac2xQcm9jZXNzb3IzOjpnZXRDYW5kaWRhdGVUaW1lc3RhbXBMb2NrZWQoc2l6ZV90KiBtZXRhZGF0YUlkeCkgY29uc3QgewogICAgIC8qKgogICAgICAqIEZpbmQgdGhlIHNtYWxsZXN0IHRpbWVzdGFtcCB3ZSBrbm93IGFib3V0IHNvIGZhcgpAQCAtNDExLDExICs1NjYsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfQ09OVFJPTF9BRl9NT0RFKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IFpTTCBxdWV1ZSBmcmFtZSBoYXMgbm8gQUYgbW9kZSBmaWVsZCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1aW50OF90IGFmTW9kZSA9IGVudHJ5LmRhdGEudThbMF07CisgICAgICAgICAgICAgICAgaWYgKGFmTW9kZSA9PSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9PRkYpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBhbGwgdGhlIFpTTCBidWZmZXIgZm9yIG1hbnVhbCBBRiBtb2RlLCBhcyB3ZSBkb24ndCByZWFsbHkKKyAgICAgICAgICAgICAgICAgICAgLy8ga25vdyB0aGUgYWYgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENoZWNrIEFGIHN0YXRlIGlmIGRldmljZSBoYXMgZm9jdXNlciBhbmQgZm9jdXMgbW9kZSBpc24ndCBmaXhlZAorICAgICAgICAgICAgICAgIGlmIChtSGFzRm9jdXNlciAmJiAhaXNGaXhlZEZvY3VzTW9kZShhZk1vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY2FuZGlkYXRlIGZyYW1lIGhhcyBnb29kIGZvY3VzLgorICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogWlNMIHF1ZXVlIGZyYW1lIGhhcyBubyBBRiBzdGF0ZSBmaWVsZCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhZlN0YXRlID0gZW50cnkuZGF0YS51OFswXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFmU3RhdGUgIT0gQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFX1BBU1NJVkVfRk9DVVNFRCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmU3RhdGUgIT0gQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFX0ZPQ1VTRURfTE9DS0VEICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZTdGF0ZSAhPSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfTk9UX0ZPQ1VTRURfTE9DS0VEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IFpTTCBxdWV1ZSBmcmFtZSBBRiBzdGF0ZSBpcyAlZCBpcyBub3QgZ29vZCBmb3IgY2FwdHVyZSwgc2tpcCBpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWZTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIG1pblRpbWVzdGFtcCA9IGZyYW1lVGltZXN0YW1wOwogICAgICAgICAgICAgICAgIGlkeCA9IGo7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWVigiJXM6IFNhdyB0aW1lc3RhbXAgJWxsZCIsIF9fRlVOQ1RJT05fXywgZnJhbWVUaW1lc3RhbXApOworICAgICAgICAgICAgQUxPR1ZWKCIlczogU2F3IHRpbWVzdGFtcCAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywgZnJhbWVUaW1lc3RhbXApOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MzUsNyArNjIyLDcgQEAKICAgICAgICAgQUxPR1coIiVzOiBaU0wgcXVldWUgaGFzIG5vIG1ldGFkYXRhIGZyYW1lcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgfQogCi0gICAgQUxPR1YoIiVzOiBDYW5kaWRhdGUgdGltZXN0YW1wICVsbGQgKGlkeCAlZCksIGVtcHR5IGZyYW1lczogJWQiLAorICAgIEFMT0dWKCIlczogQ2FuZGlkYXRlIHRpbWVzdGFtcCAlIiBQUklkNjQgIiAoaWR4ICV6dSksIGVtcHR5IGZyYW1lczogJXp1IiwKICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1pblRpbWVzdGFtcCwgaWR4LCBlbXB0eUNvdW50KTsKIAogICAgIGlmIChtZXRhZGF0YUlkeCkgewpAQCAtNDUxLDEzICs2MzgsMTUgQEAKIH0KIAogdm9pZCBac2xQcm9jZXNzb3IzOjpvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CiAKICAgICAvLyBpZ25vcmUgb3V0cHV0IGJ1ZmZlcnMKICAgICBpZiAoYnVmZmVySW5mby5tT3V0cHV0KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICAvLyBMb2NrIG11dGV4IG9ubHkgb25jZSB3ZSBrbm93IHRoaXMgaXMgYW4gaW5wdXQgYnVmZmVyIHJldHVybmVkIHRvIGF2b2lkCisgICAgLy8gcG90ZW50aWFsIGRlYWRsb2NrCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwogICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IHRoZSBidWZmZXIgaXMgaW4gb3VyIHF1ZXVlIGJ5IGxvb2tpbmcgYXQgdGltZXN0YW1wCiAgICAgLy8gdGhlb3JldGljYWxseSB1bm5lY2Vzc2FyeSB1bmxlc3Mgd2UgY2hhbmdlIHRoZSBmb2xsb3dpbmcgYXNzdW1wdGlvbnM6CiAgICAgLy8gLS0gb25seSAxIGJ1ZmZlciByZXByb2Nlc3NlZCBhdCBhIHRpbWUgKHdoaWNoIGlzIHRoZSBjYXNlIG5vdykKQEAgLTQ2OCwxMSArNjU3LDE3IEBACiAgICAgLy8gV2UgbmVlZCB0byBndWFyYW50ZWUgdGhhdCBpZiB3ZSBkbyB0d28gYmFjay10by1iYWNrIGNhcHR1cmVzLAogICAgIC8vIHRoZSBzZWNvbmQgd29uJ3QgdXNlIGEgYnVmZmVyIHRoYXQncyBvbGRlci90aGUgc2FtZSBhcyB0aGUgZmlyc3QsIHdoaWNoCiAgICAgLy8gaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZSBpZiB3ZSBkb24ndCBjbGVhciBvdXQgdGhlIHF1ZXVlIGFuZCB0aGUKLSAgICAvLyBzZWxlY3Rpb24gY3JpdGVyaWEgaXMgc29tZXRoaW5nIGxpa2UgJ25ld2VzdCcuIENsZWFyaW5nIG91dCB0aGUgcXVldWUKLSAgICAvLyBvbiBhIGNvbXBsZXRlZCBjYXB0dXJlIGVuc3VyZXMgd2UnbGwgb25seSB1c2UgbmV3IGRhdGEuCisgICAgLy8gc2VsZWN0aW9uIGNyaXRlcmlhIGlzIHNvbWV0aGluZyBsaWtlICduZXdlc3QnLiBDbGVhcmluZyBvdXQgdGhlIHJlc3VsdAorICAgIC8vIG1ldGFkYXRhIHF1ZXVlIG9uIGEgY29tcGxldGVkIGNhcHR1cmUgZW5zdXJlcyB3ZSdsbCBvbmx5IHVzZSBuZXcgdGltZXN0YW1wLgorICAgIC8vIENhbGxpbmcgY2xlYXJac2xRdWV1ZUxvY2tlZCBpcyBhIGd1YXJhbnRlZWQgZGVhZGxvY2sgYmVjYXVzZSB0aGlzIGNhbGxiYWNrCisgICAgLy8gaG9sZHMgdGhlIENhbWVyYTNTdHJlYW0gaW50ZXJuYWwgbG9jayAobUxvY2spLCBhbmQgY2xlYXJac2xRdWV1ZUxvY2tlZCByZXF1aXJlcworICAgIC8vIHRvIGhvbGQgdGhlIHNhbWUgbG9jay4KKyAgICAvLyBUT0RPOiBuZWVkIGZpZ3VyZSBvdXQgYSB3YXkgdG8gY2xlYXIgdGhlIFpzbCBidWZmZXIgcXVldWUgcHJvcGVybHkuIFJpZ2h0IG5vdworICAgIC8vIGl0IGlzIHNhZmUgbm90IHRvIGRvIHNvLCBhcyBiYWNrIHRvIGJhY2sgWlNMIGNhcHR1cmUgcmVxdWlyZXMgc3RvcCBhbmQgc3RhcnQKKyAgICAvLyBwcmV2aWV3LCB3aGljaCB3aWxsIGZsdXNoIFpTTCBxdWV1ZSBhdXRvbWF0aWNhbGx5LgogICAgIEFMT0dWKCIlczogTWVtb3J5IG9wdGltaXphdGlvbiwgY2xlYXJpbmcgWlNMIHF1ZXVlIiwKICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgIGNsZWFyWnNsUXVldWVMb2NrZWQoKTsKKyAgICBjbGVhclpzbFJlc3VsdFF1ZXVlTG9ja2VkKCk7CiAKICAgICAvLyBSZXF1aXJlZCBzbyB3ZSBhY2NlcHQgbW9yZSBaU0wgcmVxdWVzdHMKICAgICBtU3RhdGUgPSBSVU5OSU5HOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmgKaW5kZXggZDJmODMyMi4uZmM5ZjcwYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5oCkBAIC01MCw4ICs1MCw4IEBACiAgICAgWnNsUHJvY2Vzc29yMyhzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQsIHdwPENhcHR1cmVTZXF1ZW5jZXI+IHNlcXVlbmNlcik7CiAgICAgflpzbFByb2Nlc3NvcjMoKTsKIAotICAgIC8vIEZyb20gRnJhbWVQcm9jZXNzb3IKLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKTsKKyAgICAvLyBGcm9tIEZyYW1lUHJvY2Vzc29yOjpGaWx0ZXJlZExpc3RlbmVyCisgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCk7CiAKICAgICAvKioKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODIsNiArODIsNyBAQAogCiAgIHByaXZhdGU6CiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXREdXJhdGlvbiA9IDEwMDAwMDAwOyAvLyAxMCBtcworICAgIG5zZWNzX3QgbUxhdGVzdENsZWFyZWRCdWZmZXJUaW1lc3RhbXA7CiAKICAgICBlbnVtIHsKICAgICAgICAgUlVOTklORywKQEAgLTEwNyw4ICsxMDgsOSBAQAogICAgICAgICBDYW1lcmFNZXRhZGF0YSBmcmFtZTsKICAgICB9OwogCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrWnNsQnVmZmVyRGVwdGggPSA0OwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lTGlzdERlcHRoID0ga1pzbEJ1ZmZlckRlcHRoICogMjsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRGVmYXVsdE1heFBpcGVsaW5lRGVwdGggPSA0OworICAgIHNpemVfdCBtQnVmZmVyUXVldWVEZXB0aDsKKyAgICBzaXplX3QgbUZyYW1lTGlzdERlcHRoOwogICAgIFZlY3RvcjxDYW1lcmFNZXRhZGF0YT4gbUZyYW1lTGlzdDsKICAgICBzaXplX3QgbUZyYW1lTGlzdEhlYWQ7CiAKQEAgLTEyMCwxMyArMTIyLDIyIEBACiAKICAgICBDYW1lcmFNZXRhZGF0YSBtTGF0ZXN0Q2FwdHVyZWRSZXF1ZXN0OwogCisgICAgYm9vbCBtSGFzRm9jdXNlcjsKKwogICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CiAKICAgICBzdGF0dXNfdCBjbGVhclpzbFF1ZXVlTG9ja2VkKCk7CiAKKyAgICB2b2lkIGNsZWFyWnNsUmVzdWx0UXVldWVMb2NrZWQoKTsKKwogICAgIHZvaWQgZHVtcFpzbFF1ZXVlKGludCBpZCkgY29uc3Q7CiAKICAgICBuc2Vjc190IGdldENhbmRpZGF0ZVRpbWVzdGFtcExvY2tlZChzaXplX3QqIG1ldGFkYXRhSWR4KSBjb25zdDsKKworICAgIGJvb2wgaXNGaXhlZEZvY3VzTW9kZSh1aW50OF90IGFmTW9kZSkgY29uc3Q7CisKKyAgICAvLyBVcGRhdGUgdGhlIHBvc3QtcHJvY2Vzc2luZyBtZXRhZGF0YSB3aXRoIHRoZSBkZWZhdWx0IHN0aWxsIGNhcHR1cmUgcmVxdWVzdCB0ZW1wbGF0ZQorICAgIHN0YXR1c190IHVwZGF0ZVJlcXVlc3RXaXRoRGVmYXVsdFN0aWxsUmVxdWVzdChDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgY29uc3Q7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3JJbnRlcmZhY2UuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApjb3B5IHRvIHNlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3JJbnRlcmZhY2UuY3BwCmluZGV4IDEzY2FjNmQuLjllZmVhYmEKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3JJbnRlcmZhY2UuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKKyNpbmNsdWRlICJac2xQcm9jZXNzb3JJbnRlcmZhY2UuaCIKIAotLyogLS0tLS0gTWFpbiBmZWF0dXJlcyAtLS0tLSAqLwotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgiIC8qIFRyYW5zY29kZXIgKi8KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEyIHsKIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworc3RhdHVzX3QgWnNsUHJvY2Vzc29ySW50ZXJmYWNlOjpkaXNjb25uZWN0KCkgeworICAgIHJldHVybiBPSzsKK30KIAotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSCAqLworfTsgLy9uYW1lc3BhY2UgY2FtZXJhMgorfTsgLy9uYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmgKaW5kZXggMTgzYzBjMi4uOWUyNjZlNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3JJbnRlcmZhY2UuaApAQCAtMTksNiArMTksOCBAQAogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBjYW1lcmEyIHsKQEAgLTM3LDYgKzM5LDkgQEAKICAgICAvLyBEZWxldGUgdGhlIHVuZGVybHlpbmcgQ2FtZXJhRGV2aWNlIHN0cmVhbXMKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVN0cmVhbSgpID0gMDsKIAorICAgIC8vIENsZWFyIGFueSBhZGRpdGlvbmFsIHN0YXRlIG5lY2Vzc2FyeSBiZWZvcmUgdGhlIENhbWVyYURldmljZSBpcyBkaXNjb25uZWN0ZWQKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3QoKTsKKwogICAgIC8qKgogICAgICAqIFN1Ym1pdHMgYSBaU0wgY2FwdHVyZSByZXF1ZXN0IChpZCA9IHJlcXVlc3RJZCkKICAgICAgKgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCmluZGV4IDFjZGY4ZGMuLmUzMzAxYWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKQEAgLTE2LDEzICsxNiwxNCBAQAogCiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYURldmljZUNsaWVudCIKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQotLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0Lmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CiAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgogI2luY2x1ZGUgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCkBAIC04Miw3ICs4Myw3IEBACiAgICAgbUZyYW1lUHJvY2Vzc29yLT5yZWdpc3Rlckxpc3RlbmVyKEZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NSU5fSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NQVhfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGlzdGVuZXIqL3RoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcXVpcmtTZW5kUGFydGlhbHMqL3RydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnNlbmRQYXJ0aWFscyovdHJ1ZSk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC05MSw3OSArOTIsMTAxIEBACiB9CiAKIHN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6c3VibWl0UmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiByZXF1ZXN0TGlzdDsKKyAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2socmVxdWVzdCk7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBzdHJlYW1pbmcsIGxhc3RGcmFtZU51bWJlcik7Cit9CisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6c3VibWl0UmVxdWVzdExpc3QoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiByZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcsIGludDY0X3QqIGxhc3RGcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBBTE9HVigiJXMtc3RhcnQgb2YgZnVuY3Rpb24uIFJlcXVlc3QgbGlzdCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgcmVxdWVzdHMuc2l6ZSgpKTsKIAogICAgIHN0YXR1c190IHJlczsKLQogICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKIAogICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwogCi0gICAgaWYgKHJlcXVlc3QgPT0gMCkgeworICAgIGlmIChyZXF1ZXN0cy5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBTZW50IG51bGwgcmVxdWVzdC4gUmVqZWN0aW5nIHJlcXVlc3QuIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKHJlcXVlc3QtPm1NZXRhZGF0YSk7CisgICAgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gbWV0YWRhdGFSZXF1ZXN0TGlzdDsKKyAgICBpbnQzMl90IHJlcXVlc3RJZCA9IG1SZXF1ZXN0SWRDb3VudGVyOworICAgIHVpbnQzMl90IGxvb3BDb3VudGVyID0gMDsKIAotICAgIGlmIChtZXRhZGF0YS5pc0VtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFNlbnQgZW1wdHkgbWV0YWRhdGEgcGFja2V0LiBSZWplY3RpbmcgcmVxdWVzdC4iLAotICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAocmVxdWVzdC0+bVN1cmZhY2VMaXN0LnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBSZXF1ZXN0cyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN1cmZhY2UgdGFyZ2V0LiAiCi0gICAgICAgICAgICAgICJSZWplY3RpbmcgcmVxdWVzdC4iLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKCFlbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKG1ldGFkYXRhKSkgewotICAgICAgICAvLyBDYWxsZWUgbG9ncwotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgaW4gdGhlIG91dHB1dCBzdHJlYW0gSURzIHdoaWNoIHdlIGNhbGN1bGF0ZSBmcm9tCi0gICAgICogdGhlIGNhcHR1cmUgcmVxdWVzdCdzIGxpc3Qgb2Ygc3VyZmFjZSB0YXJnZXRzCi0gICAgICovCi0gICAgVmVjdG9yPGludDMyX3Q+IG91dHB1dFN0cmVhbUlkczsKLSAgICBvdXRwdXRTdHJlYW1JZHMuc2V0Q2FwYWNpdHkocmVxdWVzdC0+bVN1cmZhY2VMaXN0LnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0LT5tU3VyZmFjZUxpc3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IHJlcXVlc3QtPm1TdXJmYWNlTGlzdFtpXTsKLQotICAgICAgICBpZiAoc3VyZmFjZSA9PSAwKSBjb250aW51ZTsKLQotICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnYnAgPSBzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7Ci0gICAgICAgIGludCBpZHggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoZ2JwLT5hc0JpbmRlcigpKTsKLQotICAgICAgICAvLyBUcnlpbmcgdG8gc3VibWl0IHJlcXVlc3Qgd2l0aCBzdXJmYWNlIHRoYXQgd2Fzbid0IGNyZWF0ZWQKLSAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFRyaWVkIHRvIHN1Ym1pdCBhIHJlcXVlc3Qgd2l0aCBhIHN1cmZhY2UgdGhhdCIKLSAgICAgICAgICAgICAgICAgICIgd2UgaGF2ZSBub3QgY2FsbGVkIGNyZWF0ZVN0cmVhbSBvbiIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgZm9yIChMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+OjppdGVyYXRvciBpdCA9IHJlcXVlc3RzLmJlZ2luKCk7IGl0ICE9IHJlcXVlc3RzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gKml0OworICAgICAgICBpZiAocmVxdWVzdCA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogU2VudCBudWxsIHJlcXVlc3QuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBzdHJlYW1JZCA9IG1TdHJlYW1NYXAudmFsdWVBdChpZHgpOwotICAgICAgICBvdXRwdXRTdHJlYW1JZHMucHVzaF9iYWNrKHN0cmVhbUlkKTsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFwcGVuZGluZyBvdXRwdXQgc3RyZWFtICVkIHRvIHJlcXVlc3QiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZWFtSWQpOworICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YShyZXF1ZXN0LT5tTWV0YWRhdGEpOworICAgICAgICBpZiAobWV0YWRhdGEuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogU2VudCBlbXB0eSBtZXRhZGF0YSBwYWNrZXQuIFJlamVjdGluZyByZXF1ZXN0LiIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LT5tU3VyZmFjZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogUmVxdWVzdHMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzdXJmYWNlIHRhcmdldC4gIgorICAgICAgICAgICAgICAgICAgIlJlamVjdGluZyByZXF1ZXN0LiIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMobWV0YWRhdGEpKSB7CisgICAgICAgICAgICAvLyBDYWxsZWUgbG9ncworICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIGluIHRoZSBvdXRwdXQgc3RyZWFtIElEcyB3aGljaCB3ZSBjYWxjdWxhdGUgZnJvbQorICAgICAgICAgKiB0aGUgY2FwdHVyZSByZXF1ZXN0J3MgbGlzdCBvZiBzdXJmYWNlIHRhcmdldHMKKyAgICAgICAgICovCisgICAgICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7CisgICAgICAgIG91dHB1dFN0cmVhbUlkcy5zZXRDYXBhY2l0eShyZXF1ZXN0LT5tU3VyZmFjZUxpc3Quc2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0LT5tU3VyZmFjZUxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSByZXF1ZXN0LT5tU3VyZmFjZUxpc3RbaV07CisgICAgICAgICAgICBpZiAoc3VyZmFjZSA9PSAwKSBjb250aW51ZTsKKworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwID0gc3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgICAgICAgICAgaW50IGlkeCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShnYnAtPmFzQmluZGVyKCkpOworCisgICAgICAgICAgICAvLyBUcnlpbmcgdG8gc3VibWl0IHJlcXVlc3Qgd2l0aCBzdXJmYWNlIHRoYXQgd2Fzbid0IGNyZWF0ZWQKKyAgICAgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVHJpZWQgdG8gc3VibWl0IGEgcmVxdWVzdCB3aXRoIGEgc3VyZmFjZSB0aGF0IgorICAgICAgICAgICAgICAgICAgICAgICIgd2UgaGF2ZSBub3QgY2FsbGVkIGNyZWF0ZVN0cmVhbSBvbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IG1TdHJlYW1NYXAudmFsdWVBdChpZHgpOworICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnB1c2hfYmFjayhzdHJlYW1JZCk7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQXBwZW5kaW5nIG91dHB1dCBzdHJlYW0gJWQgdG8gcmVxdWVzdCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZWFtSWQpOworICAgICAgICB9CisKKyAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywgJm91dHB1dFN0cmVhbUlkc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbUlkcy5zaXplKCkpOworCisgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsICZyZXF1ZXN0SWQsIC8qc2l6ZSovMSk7CisgICAgICAgIGxvb3BDb3VudGVyKys7IC8vIGxvb3BDb3VudGVyIHN0YXJ0cyBmcm9tIDEKKyAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENyZWF0aW5nIHJlcXVlc3Qgd2l0aCBJRCAlZCAoJWQgb2YgJXp1KSIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCByZXF1ZXN0SWQsIGxvb3BDb3VudGVyLCByZXF1ZXN0cy5zaXplKCkpOworCisgICAgICAgIG1ldGFkYXRhUmVxdWVzdExpc3QucHVzaF9iYWNrKG1ldGFkYXRhKTsKICAgICB9Ci0KLSAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TLCAmb3V0cHV0U3RyZWFtSWRzWzBdLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW1JZHMuc2l6ZSgpKTsKLQotICAgIGludDMyX3QgcmVxdWVzdElkID0gbVJlcXVlc3RJZENvdW50ZXIrKzsKLSAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lELCAmcmVxdWVzdElkLCAvKnNpemUqLzEpOwotICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdWJtaXR0aW5nIHJlcXVlc3Qgd2l0aCBJRCAlZCIsCi0gICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHJlcXVlc3RJZCk7CisgICAgbVJlcXVlc3RJZENvdW50ZXIrKzsKIAogICAgIGlmIChzdHJlYW1pbmcpIHsKLSAgICAgICAgcmVzID0gbURldmljZS0+c2V0U3RyZWFtaW5nUmVxdWVzdChtZXRhZGF0YSk7CisgICAgICAgIHJlcyA9IG1EZXZpY2UtPnNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KG1ldGFkYXRhUmVxdWVzdExpc3QsIGxhc3RGcmFtZU51bWJlcik7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiAgR290IGVycm9yICVkIGFmdGVyIHRyeWluZyB0byBzZXQgc3RyZWFtaW5nICIKICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0IiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHJlcyk7CkBAIC0xNzEsMTEgKzE5NCwxMiBAQAogICAgICAgICAgICAgbVN0cmVhbWluZ1JlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0SWQpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gbURldmljZS0+Y2FwdHVyZShtZXRhZGF0YSk7CisgICAgICAgIHJlcyA9IG1EZXZpY2UtPmNhcHR1cmVMaXN0KG1ldGFkYXRhUmVxdWVzdExpc3QsIGxhc3RGcmFtZU51bWJlcik7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBHb3QgZXJyb3IgJWQgYWZ0ZXIgdHJ5aW5nIHRvIHNldCBjYXB0dXJlIiwKLSAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCByZXMpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCByZXMpOwogICAgICAgICB9CisgICAgICAgIEFMT0dWKCIlczogcmVxdWVzdElkID0gJWQgIiwgX19GVU5DVElPTl9fLCByZXF1ZXN0SWQpOwogICAgIH0KIAogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBFbmQgb2YgZnVuY3Rpb24iLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CkBAIC0xODYsNyArMjEwLDcgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCkgeworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQsIGludDY0X3QqIGxhc3RGcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzLCByZXF1ZXN0SWQgPSAlZCIsIF9fRlVOQ1RJT05fXywgcmVxdWVzdElkKTsKIApAQCAtMjEyLDcgKzIzNiw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgcmVzID0gbURldmljZS0+Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCk7CisgICAgcmVzID0gbURldmljZS0+Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KGxhc3RGcmFtZU51bWJlcik7CiAKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdWNjZXNzZnVsbHkgY2xlYXJlZCBzdHJlYW1pbmcgcmVxdWVzdCIsCkBAIC0yMjMsNiArMjQ3LDI2IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpiZWdpbkNvbmZpZ3VyZSgpIHsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcy4KKyAgICBBTE9HRSgiJXM6IE5vdCBpbXBsZW1lbnRlZCB5ZXQuIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZW5kQ29uZmlndXJlKCkgeworICAgIEFMT0dWKCIlczogZW5kaW5nIGNvbmZpZ3VyZSAoJXp1IHN0cmVhbXMpIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVN0cmVhbU1hcC5zaXplKCkpOworCisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKKworICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKKworICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOworCisgICAgcmV0dXJuIG1EZXZpY2UtPmNvbmZpZ3VyZVN0cmVhbXMoKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXMgKHN0cmVhbUlkID0gMHgleCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKQEAgLTI1OSw4ICszMDMsNiBAQAogICAgIH0gZWxzZSBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIG1TdHJlYW1NYXAucmVtb3ZlSXRlbXNBdChpbmRleCk7CiAKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN1Y2Nlc3NmdWxseSBkZWxldGVkIHN0cmVhbSBJRCAoJWQpIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzOwpAQCAtMjc3LDYgKzMxOSwxMCBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogCisgICAgaWYgKGJ1ZmZlclByb2R1Y2VyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBidWZmZXJQcm9kdWNlciBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAgICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7CiAKICAgICAvLyBEb24ndCBjcmVhdGUgbXVsdGlwbGUgc3RyZWFtcyBmb3IgdGhlIHNhbWUgdGFyZ2V0IHN1cmZhY2UKQEAgLTI4NCw3ICszMzAsNyBAQAogICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KGJ1ZmZlclByb2R1Y2VyLT5hc0JpbmRlcigpKTsKICAgICAgICAgaWYgKGluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IENhbWVyYSAlZDogQnVmZmVyIHByb2R1Y2VyIGFscmVhZHkgaGFzIGEgc3RyZWFtIGZvciBpdCAiCi0gICAgICAgICAgICAgICAgICAiKElEICVkKSIsCisgICAgICAgICAgICAgICAgICAiKElEICV6ZCkiLAogICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGluZGV4KTsKICAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKICAgICAgICAgfQpAQCAtMzQ2LDIzICszOTIsNyBAQAogICAgIC8vIGFmdGVyIGVhY2ggY2FsbCwgYnV0IG9ubHkgb25jZSB3ZSBhcmUgZG9uZSB3aXRoIGFsbC4KIAogICAgIGludCBzdHJlYW1JZCA9IC0xOwotICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7Ci0gICAgICAgIC8vIEpQRUcgYnVmZmVycyBuZWVkIHRvIGJlIHNpemVkIGZvciBtYXhpbXVtIHBvc3NpYmxlIGNvbXByZXNzZWQgc2l6ZQotICAgICAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOwotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0pQRUdfTUFYX1NJWkUpOwotICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgbWF4aW11bSBKUEVHIHNpemUgaW4gIgotICAgICAgICAgICAgICAgICAgICAic3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IG1heEpwZWdTaXplID0gZW50cnkuZGF0YS5pMzJbMF07Ci0gICAgICAgIHJlcyA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShhbncsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgbWF4SnBlZ1NpemUsCi0gICAgICAgICAgICAgICAgJnN0cmVhbUlkKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBBbGwgb3RoZXIgc3RyZWFtcyBhcmUgYSBrbm93biBzaXplCi0gICAgICAgIHJlcyA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShhbncsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgLypzaXplKi8wLAotICAgICAgICAgICAgICAgICZzdHJlYW1JZCk7Ci0gICAgfQorICAgIHJlcyA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShhbncsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgJnN0cmVhbUlkKTsKIAogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgbVN0cmVhbU1hcC5hZGQoYnVmZmVyUHJvZHVjZXItPmFzQmluZGVyKCksIHN0cmVhbUlkKTsKQEAgLTQ2NSw3ICs0OTUsNyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Zmx1c2goKSB7CitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmZsdXNoKGludDY0X3QqIGxhc3RGcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKIApAQCAtNDc2LDMwICs1MDYsNDMgQEAKIAogICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwogCi0gICAgcmV0dXJuIG1EZXZpY2UtPmZsdXNoKCk7CisgICAgbVN0cmVhbWluZ1JlcXVlc3RMaXN0LmNsZWFyKCk7CisgICAgcmV0dXJuIG1EZXZpY2UtPmZsdXNoKGxhc3RGcmFtZU51bWJlcik7CiB9CiAKIHN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDYW1lcmFEZXZpY2VDbGllbnRbJWRdICglcCkgUElEOiAlZCwgZHVtcDpcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2FtZXJhRGV2aWNlQ2xpZW50WyVkXSAoJXApIGR1bXA6XG4iLAogICAgICAgICAgICAgbUNhbWVyYUlkLAotICAgICAgICAgICAgZ2V0UmVtb3RlQ2FsbGJhY2soKS0+YXNCaW5kZXIoKS5nZXQoKSwKLSAgICAgICAgICAgIG1DbGllbnRQaWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAgU3RhdGU6ICIpOworICAgICAgICAgICAgZ2V0UmVtb3RlQ2FsbGJhY2soKS0+YXNCaW5kZXIoKS5nZXQoKSk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBDdXJyZW50IGNsaWVudDogJXMgKFBJRCAlZCwgVUlEICV1KVxuIiwKKyAgICAgICAgICAgIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwKKyAgICAgICAgICAgIG1DbGllbnRQaWQsIG1DbGllbnRVaWQpOwogCisgICAgcmVzdWx0LmFwcGVuZCgiICBTdGF0ZTpcbiIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICBSZXF1ZXN0IElEIGNvdW50ZXI6ICVkXG4iLCBtUmVxdWVzdElkQ291bnRlcik7CisgICAgaWYgKCFtU3RyZWFtTWFwLmlzRW1wdHkoKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgQ3VycmVudCBzdHJlYW0gSURzOlxuIik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0cmVhbU1hcC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgU3RyZWFtICVkXG4iLCBtU3RyZWFtTWFwLnZhbHVlQXQoaSkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgIE5vIHN0cmVhbXMgY29uZmlndXJlZC5cbiIpOworICAgIH0KKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAvLyBUT0RPOiBwcmludCBkeW5hbWljL3JlcXVlc3Qgc2VjdGlvbiBmcm9tIG1vc3QgcmVjZW50IHJlcXVlc3RzCiAgICAgbUZyYW1lUHJvY2Vzc29yLT5kdW1wKGZkLCBhcmdzKTsKIAogICAgIHJldHVybiBkdW1wRGV2aWNlKGZkLCBhcmdzKTsKIH0KIAotCi12b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5RXJyb3IoKSB7Cit2b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKICAgICAvLyBUaHJlYWQgc2FmZS4gRG9uJ3QgYm90aGVyIGxvY2tpbmcuCiAgICAgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrcz4gcmVtb3RlQ2IgPSBnZXRSZW1vdGVDYWxsYmFjaygpOwogCiAgICAgaWYgKHJlbW90ZUNiICE9IDApIHsKLSAgICAgICAgcmVtb3RlQ2ItPm9uRGV2aWNlRXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgIHJlbW90ZUNiLT5vbkRldmljZUVycm9yKGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzKTsKICAgICB9CiB9CiAKQEAgLTUxMiwxMiArNTU1LDEyIEBACiAgICAgfQogfQogCi12b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5U2h1dHRlcihpbnQgcmVxdWVzdElkLAordm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgewogICAgIC8vIFRocmVhZCBzYWZlLiBEb24ndCBib3RoZXIgbG9ja2luZy4KICAgICBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IGdldFJlbW90ZUNhbGxiYWNrKCk7CiAgICAgaWYgKHJlbW90ZUNiICE9IDApIHsKLSAgICAgICAgcmVtb3RlQ2ItPm9uQ2FwdHVyZVN0YXJ0ZWQocmVxdWVzdElkLCB0aW1lc3RhbXApOworICAgICAgICByZW1vdGVDYi0+b25DYXB0dXJlU3RhcnRlZChyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CiAgICAgfQogfQogCkBAIC01NTIsMTYgKzU5NSwxNCBAQAogfQogCiAvKiogRGV2aWNlLXJlbGF0ZWQgbWV0aG9kcyAqLwotdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBmcmFtZSkgewordm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKIAogICAgIC8vIFRocmVhZC1zYWZlLiBObyBsb2NrIG5lY2Vzc2FyeS4KICAgICBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IG1SZW1vdGVDYWxsYmFjazsKICAgICBpZiAocmVtb3RlQ2IgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigiJXM6IGZyYW1lID0gJXAgIiwgX19GVU5DVElPTl9fLCAmZnJhbWUpOwotICAgICAgICByZW1vdGVDYi0+b25SZXN1bHRSZWNlaXZlZChyZXF1ZXN0SWQsIGZyYW1lKTsKKyAgICAgICAgcmVtb3RlQ2ItPm9uUmVzdWx0UmVjZWl2ZWQocmVzdWx0Lm1NZXRhZGF0YSwgcmVzdWx0Lm1SZXN1bHRFeHRyYXMpOwogICAgIH0KIH0KIApAQCAtNjIwLDYxICs2NjEsOCBAQAogc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpnZXRSb3RhdGlvblRyYW5zZm9ybUxvY2tlZChpbnQzMl90KiB0cmFuc2Zvcm0pIHsKICAgICBBTE9HVigiJXM6IGJlZ2luIiwgX19GVU5DVElPTl9fKTsKIAotICAgIGlmICh0cmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiJXM6IG51bGwgdHJhbnNmb3JtIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAqdHJhbnNmb3JtID0gMDsKLQogICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOwotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfU0VOU09SX09SSUVOVEFUSU9OKTsKLSAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbiBpbiAiCi0gICAgICAgICAgICAgICAgInN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBpbnQzMl90JiBmbGFncyA9ICp0cmFuc2Zvcm07Ci0KLSAgICBpbnQgb3JpZW50YXRpb24gPSBlbnRyeS5kYXRhLmkzMlswXTsKLSAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIGZsYWdzID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfOTA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxODA6Ci0gICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8xODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNzA6Ci0gICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8yNzA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBIQUwgYW5kcm9pZC5zZW5zb3Iub3JpZW50YXRpb24gdmFsdWU6ICVkIiwKLSAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb3JpZW50YXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWFnaWMgZmxhZyBtYWtlcyBzdXJmYWNlZmxpbmdlciB1bi1yb3RhdGUgdGhlIGJ1ZmZlcnMKLSAgICAgKiB0byBjb3VudGVyIHRoZSBleHRyYSBnbG9iYWwgZGV2aWNlIFVJIHJvdGF0aW9uIHdoZW5ldmVyIHRoZSB1c2VyCi0gICAgICogcGh5c2ljYWxseSByb3RhdGVzIHRoZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBCeSBkb2luZyB0aGlzLCB0aGUgY2FtZXJhIGJ1ZmZlciBhbHdheXMgZW5kcyB1cCBhbGlnbmVkCi0gICAgICogd2l0aCB0aGUgcGh5c2ljYWwgY2FtZXJhIGZvciBhICJzZWUgdGhyb3VnaCIgZWZmZWN0LgotICAgICAqCi0gICAgICogSW4gZXNzZW5jZSwgdGhlIGJ1ZmZlciBvbmx5IGdldHMgcm90YXRlZCBkdXJpbmcgcHJldmlldyB1c2UtY2FzZXMuCi0gICAgICogVGhlIHVzZXIgaXMgc3RpbGwgcmVzcG9uc2libGUgdG8gcmUtY3JlYXRlIHN0cmVhbXMgb2YgdGhlIHByb3BlcgotICAgICAqIGFzcGVjdCByYXRpbywgb3IgdGhlIHByZXZpZXcgd2lsbCBlbmQgdXAgbG9va2luZyBub24tdW5pZm9ybWx5Ci0gICAgICogc3RyZXRjaGVkLgotICAgICAqLwotICAgIGZsYWdzIHw9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0lOVkVSU0VfRElTUExBWTsKLQotICAgIEFMT0dWKCIlczogZmluYWwgdHJhbnNmb3JtID0gMHgleCIsIF9fRlVOQ1RJT05fXywgZmxhZ3MpOwotCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBDYW1lcmFVdGlsczo6Z2V0Um90YXRpb25UcmFuc2Zvcm0oc3RhdGljSW5mbywgdHJhbnNmb3JtKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKaW5kZXggYjljMTZhYS4uOTk4MWRmZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCkBAIC02Myw5ICs2MywyMiBAQAogICAgICAqLwogCiAgICAgLy8gTm90ZSB0aGF0IHRoZSBjYWxsZWUgZ2V0cyBhIGNvcHkgb2YgdGhlIG1ldGFkYXRhLgotICAgIHZpcnR1YWwgaW50ICAgICAgICAgICBzdWJtaXRSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgIHN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgLy8gTGlzdCBvZiByZXF1ZXN0cyBhcmUgY29waWVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgIHN1Ym1pdFJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGJlZ2luQ29uZmlndXJlKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuZENvbmZpZ3VyZSgpOwogCiAgICAgLy8gUmV0dXJucyAtRUJVU1kgaWYgZGV2aWNlIGlzIG5vdCBpZGxlCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpOwpAQCAtODksNyArMTAyLDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgd2FpdFVudGlsSWRsZSgpOwogCiAgICAgLy8gRmx1c2ggYWxsIGFjdGl2ZSBhbmQgcGVuZGluZyByZXF1ZXN0cyBhcyBmYXN0IGFzIHBvc3NpYmxlCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGZsdXNoKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGZsdXNoKC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAKICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCkBAIC0xMTQsMTYgKzEyOCwxNiBAQAogICAgICAqLwogCiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUlkbGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoKTsKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U2h1dHRlcihpbnQgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBuc2Vjc190IHRpbWVzdGFtcCk7CiAKICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBpbmRlcGVuZGVudCBjb21wb25lbnRzIG9mIENhbWVyYURldmljZUNsaWVudC4KICAgICAgKi8KIHByb3RlY3RlZDoKICAgICAvKiogRmlsdGVyZWRMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKi8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgZnJhbWUpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0JiByZXN1bHQpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBkZXRhY2hEZXZpY2UoKTsKIAogICAgIC8vIENhbGN1bGF0ZSB0aGUgQU5hdGl2ZVdpbmRvdyB0cmFuc2Zvcm0gZnJvbSBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggMWE3YTdhNy4uMmVhNDYwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwCkBAIC0yODAsNyArMjgwLDcgQEAKICAgICAgICAgd2luZG93ID0gbmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIpOwogICAgIH0KIAotICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVTdHJlYW0od2luZG93LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIC8qc2l6ZSovMSwKKyAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlU3RyZWFtKHdpbmRvdywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQpOwogfQogCkBAIC0zMzYsMTEgKzMzNiwxMSBAQAogICAgICAgICAgICAgbUNhbWVyYUlkLAogICAgICAgICAgICAgZ2V0UmVtb3RlQ2FsbGJhY2soKS0+YXNCaW5kZXIoKS5nZXQoKSwKICAgICAgICAgICAgIG1DbGllbnRQaWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAgU3RhdGU6ICIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgU3RhdGU6XG4iKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIAogICAgIC8vIFRPRE86IHByaW50IGR5bmFtaWMvcmVxdWVzdCBzZWN0aW9uIGZyb20gbW9zdCByZWNlbnQgcmVxdWVzdHMKICAgICBtRnJhbWVQcm9jZXNzb3ItPmR1bXAoZmQsIGFyZ3MpOwotCiAgICAgcmV0dXJuIGR1bXBEZXZpY2UoZmQsIGFyZ3MpOwogfQogCkBAIC0zNzMsOSArMzczLDcgQEAKICAgICBDYW1lcmEyQ2xpZW50QmFzZTo6ZGV0YWNoRGV2aWNlKCk7CiB9CiAKLS8qKiBEZXZpY2UtcmVsYXRlZCBtZXRob2RzICovCi12b2lkIFByb0NhbWVyYTJDbGllbnQ6Om9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGZyYW1lKSB7Cit2b2lkIFByb0NhbWVyYTJDbGllbnQ6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKIApAQCAtMzgzLDEzICszODEsMTIgQEAKICAgICBTaGFyZWRDYW1lcmFDYWxsYmFja3M6OkxvY2sgbChtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKTsKIAogICAgIGlmIChtUmVtb3RlQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICBDYW1lcmFNZXRhZGF0YSB0bXAoZnJhbWUpOworICAgICAgICBDYW1lcmFNZXRhZGF0YSB0bXAocmVzdWx0Lm1NZXRhZGF0YSk7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBtZXRhID0gdG1wLnJlbGVhc2UoKTsKICAgICAgICAgQUxPR1YoIiVzOiBtZXRhID0gJXAgIiwgX19GVU5DVElPTl9fLCBtZXRhKTsKLSAgICAgICAgbVJlbW90ZUNhbGxiYWNrLT5vblJlc3VsdFJlY2VpdmVkKHJlcXVlc3RJZCwgbWV0YSk7CisgICAgICAgIG1SZW1vdGVDYWxsYmFjay0+b25SZXN1bHRSZWNlaXZlZChyZXN1bHQubVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIG1ldGEpOwogICAgICAgICB0bXAuYWNxdWlyZShtZXRhKTsKICAgICB9Ci0KIH0KIAogYm9vbCBQcm9DYW1lcmEyQ2xpZW50OjplbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaAppbmRleCA4YTBmNTQ3Li45ZDgzMTIyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgImNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaCIKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCIKICNpbmNsdWRlICJkZXZpY2UyL0NhbWVyYTJEZXZpY2UuaCIKKyNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTk3LDggKzk4LDggQEAKIAogcHJvdGVjdGVkOgogICAgIC8qKiBGaWx0ZXJlZExpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqLwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBmcmFtZSk7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCk7CisKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgZGV0YWNoRGV2aWNlKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAppbmRleCAyZDEyNTNmLi5kNmRiMTUxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKQEAgLTE4LDYgKzE4LDggQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKQEAgLTUyLDEwICs1NCwxMyBAQAogICAgICAgICBpbnQgc2VydmljZVBpZCk6CiAgICAgICAgIFRDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIHJlbW90ZUNhbGxiYWNrLCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCi0gICAgICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MocmVtb3RlQ2FsbGJhY2spCisgICAgICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MocmVtb3RlQ2FsbGJhY2spLAorICAgICAgICBtRGV2aWNlVmVyc2lvbihjYW1lcmFTZXJ2aWNlLT5nZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkKSkKIHsKLSAgICBBTE9HSSgiQ2FtZXJhICVkOiBPcGVuZWQiLCBjYW1lcmFJZCk7CisgICAgQUxPR0koIkNhbWVyYSAlZDogT3BlbmVkLiBDbGllbnQ6ICVzIChQSUQgJWQsIFVJRCAlZCkiLCBjYW1lcmFJZCwKKyAgICAgICAgICAgIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLCBjbGllbnRQaWQsIGNsaWVudFVpZCk7CiAKKyAgICBtSW5pdGlhbENsaWVudFBpZCA9IGNsaWVudFBpZDsKICAgICBtRGV2aWNlID0gQ2FtZXJhRGV2aWNlRmFjdG9yeTo6Y3JlYXRlRGV2aWNlKGNhbWVyYUlkKTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UgPT0gMCwgIkRldmljZSBzaG91bGQgbmV2ZXIgYmUgTlVMTCBoZXJlLiIpOwogfQpAQCAtMTA5LDExICsxMTQsMTIgQEAKIAogICAgIFRDbGllbnRCYXNlOjptRGVzdHJ1Y3Rpb25TdGFydGVkID0gdHJ1ZTsKIAotICAgIFRDbGllbnRCYXNlOjpmaW5pc2hDYW1lcmFPcHMoKTsKLQogICAgIGRpc2Nvbm5lY3QoKTsKIAotICAgIEFMT0dJKCJDbG9zZWQgQ2FtZXJhICVkIiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZCk7CisgICAgQUxPR0koIkNsb3NlZCBDYW1lcmEgJWQuIENsaWVudCB3YXM6ICVzIChQSUQgJWQsIFVJRCAldSkiLAorICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFJZCwKKyAgICAgICAgICAgIFN0cmluZzgoVENsaWVudEJhc2U6Om1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksCisgICAgICAgICAgICBtSW5pdGlhbENsaWVudFBpZCwgVENsaWVudEJhc2U6Om1DbGllbnRVaWQpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CkBAIC0yMTksMTAgKzIyNSwxMSBAQAogLyoqIERldmljZS1yZWxhdGVkIG1ldGhvZHMgKi8KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgotdm9pZCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIGludCBhcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmcyKSB7Ci0gICAgQUxPR0UoIkVycm9yIGNvbmRpdGlvbiAlZCByZXBvcnRlZCBieSBIQUwsIGFyZ3VtZW50cyAlZCwgJWQiLCBlcnJvckNvZGUsCi0gICAgICAgICAgYXJnMSwgYXJnMik7Cit2b2lkIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5RXJyb3IoCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIEFMT0dFKCJFcnJvciBjb25kaXRpb24gJWQgcmVwb3J0ZWQgYnkgSEFMLCByZXF1ZXN0SWQgJSIgUFJJZDMyLCBlcnJvckNvZGUsCisgICAgICAgICAgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KQEAgLTIzMSwxMyArMjM4LDEzIEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KLXZvaWQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlTaHV0dGVyKGludCByZXF1ZXN0SWQsCit2b2lkIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgewotICAgICh2b2lkKXJlcXVlc3RJZDsKKyAgICAodm9pZClyZXN1bHRFeHRyYXM7CiAgICAgKHZvaWQpdGltZXN0YW1wOwogCi0gICAgQUxPR1YoIiVzOiBTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVxdWVzdCBpZCAlZCBhdCB0aW1lICVsbGQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXF1ZXN0SWQsIHRpbWVzdGFtcCk7CisgICAgQUxPR1YoIiVzOiBTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVxdWVzdCBpZCAlIiBQUklkMzIgIiBhdCB0aW1lICUiIFBSSWQ2NCwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgdGltZXN0YW1wKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpAQCAtMjc3LDYgKzI4NCwxMSBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CitpbnQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpnZXRDYW1lcmFEZXZpY2VWZXJzaW9uKCkgY29uc3QgeworICAgIHJldHVybiBtRGV2aWNlVmVyc2lvbjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgogY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6Z2V0Q2FtZXJhRGV2aWNlKCkgewogICAgIHJldHVybiBtRGV2aWNlOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCA2MWU0NGYwLi5kMTk4ZTRlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTJDTElFTlRfQkFTRV9ICiAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjEsOSArNjIsMTEgQEAKICAgICAgKiBDYW1lcmFEZXZpY2VCYXNlOjpOb3RpZmljYXRpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgogICAgICAqLwogCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIGludCBhcmcxLCBpbnQgYXJnMik7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUlkbGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5U2h1dHRlcihpbnQgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5QXV0b0ZvY3VzKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUF1dG9XaGl0ZWJhbGFuY2UodWludDhfdCBuZXdTdGF0ZSwKQEAgLTczLDYgKzc2LDcgQEAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhSWQoKSBjb25zdDsKICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhRGV2aWNlKCk7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIGdldENhbWVyYURldmljZVZlcnNpb24oKSBjb25zdDsKICAgICBjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhU2VydmljZSgpOwogCkBAIC0xMDMsNiArMTA3LDkgQEAKIAogcHJvdGVjdGVkOgogCisgICAgLy8gVGhlIFBJRCBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IgY2FsbAorICAgIHBpZF90IG1Jbml0aWFsQ2xpZW50UGlkOworCiAgICAgdmlydHVhbCBzcDxJQmluZGVyPiBhc0JpbmRlcldyYXBwZXIoKSB7CiAgICAgICAgIHJldHVybiBJSW50ZXJmYWNlOjphc0JpbmRlcigpOwogICAgIH0KQEAgLTExOSw2ICsxMjYsNyBAQAogCiAgICAgLyoqIENhbWVyYURldmljZUJhc2UgaW5zdGFuY2Ugd3JhcHBpbmcgSEFMMisgZW50cnkgKi8KIAorICAgIGNvbnN0IGludCBtRGV2aWNlVmVyc2lvbjsKICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiAgbURldmljZTsKIAogICAgIC8qKiBVdGlsaXR5IG1lbWJlcnMgKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCmluZGV4IGU4MGFiZjEuLmQyNmUyMGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaApAQCAtMjIsOSArMjIsMTMgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmEyLmgiCisjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhMy5oIgogI2luY2x1ZGUgImNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDQsNyArNDgsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdCgpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBUaGUgZGV2aWNlJ3Mgc3RhdGljIGNoYXJhY3RlcmlzdGljcyBtZXRhZGF0YSBidWZmZXIKQEAgLTU0LDE5ICs1OCwzNyBAQAogICAgIC8qKgogICAgICAqIFN1Ym1pdCByZXF1ZXN0IGZvciBjYXB0dXJlLiBUaGUgQ2FtZXJhRGV2aWNlIHRha2VzIG93bmVyc2hpcCBvZiB0aGUKICAgICAgKiBwYXNzZWQtaW4gYnVmZmVyLgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGV4cGVjdGVkIGZyYW1lIG51bWJlciBvZiB0aGlzIHJlcXVlc3QuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdWJtaXQgYSBsaXN0IG9mIHJlcXVlc3RzLgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGV4cGVjdGVkIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBsaXN0IG9mIHJlcXVlc3RzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogU3VibWl0IHJlcXVlc3QgZm9yIHN0cmVhbWluZy4gVGhlIENhbWVyYURldmljZSBtYWtlcyBhIGNvcHkgb2YgdGhlCiAgICAgICogcGFzc2VkLWluIGJ1ZmZlciBhbmQgdGhlIGNhbGxlciByZXRhaW5zIG93bmVyc2hpcC4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgc3RyZWFtaW5nIHJlcXVlc3QuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdWJtaXQgYSBsaXN0IG9mIHJlcXVlc3RzIGZvciBzdHJlYW1pbmcuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHN0cmVhbWluZyByZXF1ZXN0LgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogQ2xlYXIgdGhlIHN0cmVhbWluZyByZXF1ZXN0IHNsb3QuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHN0cmVhbWluZyByZXF1ZXN0LgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJTdHJlYW1pbmdSZXF1ZXN0KGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIAogICAgIC8qKgogICAgICAqIFdhaXQgdW50aWwgYSByZXF1ZXN0IHdpdGggdGhlIGdpdmVuIElEIGhhcyBiZWVuIGRlcXVldWVkIGJ5IHRoZQpAQCAtODcsOCArMTA5LDcgQEAKICAgICAgKiBvdGhlciBmb3JtYXRzLCB0aGUgc2l6ZSBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgaW50ICppZCkgPSAwOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIGlucHV0IHJlcHJvY2VzcyBzdHJlYW0gdGhhdCB1c2VzIGJ1ZmZlcnMgZnJvbSBhbiBleGlzdGluZwpAQCAtMTIwLDYgKzE0MSwxOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlUmVwcm9jZXNzU3RyZWFtKGludCBpZCkgPSAwOwogCiAgICAgLyoqCisgICAgICogVGFrZSB0aGUgY3VycmVudGx5LWRlZmluZWQgc2V0IG9mIHN0cmVhbXMgYW5kIGNvbmZpZ3VyZSB0aGUgSEFMIHRvIHVzZQorICAgICAqIHRoZW0uIFRoaXMgaXMgYSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIChtYXkgYmUgc2V2ZXJhbCBodW5kZXJlZCBtcykuCisgICAgICoKKyAgICAgKiBUaGUgZGV2aWNlIG11c3QgYmUgaWRsZSAoc2VlIHdhaXRVbnRpbERyYWluZWQpIGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSBvbiBlcnJvcjoKKyAgICAgKiAtIEJBRF9WQUxVRSBpZiB0aGUgc2V0IG9mIHN0cmVhbXMgd2FzIGludmFsaWQgKGUuZy4gZm10cyBvciBzaXplcykKKyAgICAgKiAtIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBkZXZpY2Ugd2FzIGluIHRoZSB3cm9uZyBzdGF0ZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcygpID0gMDsKKworICAgIC8qKgogICAgICAqIENyZWF0ZSBhIG1ldGFkYXRhIGJ1ZmZlciB3aXRoIGZpZWxkcyB0aGF0IHRoZSBIQUwgZGV2aWNlIGJlbGlldmVzIGFyZQogICAgICAqIGJlc3QgZm9yIHRoZSBnaXZlbiB1c2UgY2FzZQogICAgICAqLwpAQCAtMTM0LDYgKzE2NywxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdFVudGlsRHJhaW5lZCgpID0gMDsKIAogICAgIC8qKgorICAgICAqIEdldCBKcGVnIGJ1ZmZlciBzaXplIGZvciBhIGdpdmVuIGpwZWcgcmVzb2x1dGlvbi4KKyAgICAgKiBOZWdhdGl2ZSB2YWx1ZXMgYXJlIGVycm9yIGNvZGVzLgorICAgICAqLworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCA9IDA7CisKKyAgICAvKioKICAgICAgKiBBYnN0cmFjdCBjbGFzcyBmb3IgSEFMIG5vdGlmaWNhdGlvbiBsaXN0ZW5lcnMKICAgICAgKi8KICAgICBjbGFzcyBOb3RpZmljYXRpb25MaXN0ZW5lciB7CkBAIC0xNDIsMTEgKzE4MSwxMiBAQAogICAgICAgICAvLyBBUEkxIGFuZCBBUEkyLgogCiAgICAgICAgIC8vIFJlcXVpcmVkIGZvciBBUEkgMSBhbmQgMgotICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoaW50IGVycm9yQ29kZSwgaW50IGFyZzEsIGludCBhcmcyKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzKSA9IDA7CiAKICAgICAgICAgLy8gUmVxdWlyZWQgb25seSBmb3IgQVBJMgogICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZSgpID0gMDsKLSAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoaW50IHJlcXVlc3RJZCwKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSA9IDA7CiAKICAgICAgICAgLy8gUmVxdWlyZWQgb25seSBmb3IgQVBJMQpAQCAtMTc5LDExICsyMTksMTIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRGb3JOZXh0RnJhbWUobnNlY3NfdCB0aW1lb3V0KSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBHZXQgbmV4dCBtZXRhZGF0YSBmcmFtZSBmcm9tIHRoZSBmcmFtZSBxdWV1ZS4gUmV0dXJucyBOVUxMIGlmIHRoZSBxdWV1ZQotICAgICAqIGlzIGVtcHR5OyBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBtZXRhZGF0YSBidWZmZXIuCi0gICAgICogTWF5IGJlIGNhbGxlZCBjb25jdXJyZW50bHkgdG8gbW9zdCBtZXRob2RzLCBleGNlcHQgZm9yIHdhaXRGb3JOZXh0RnJhbWUKKyAgICAgKiBHZXQgbmV4dCBjYXB0dXJlIHJlc3VsdCBmcmFtZSBmcm9tIHRoZSByZXN1bHQgcXVldWUuIFJldHVybnMgTk9UX0VOT1VHSF9EQVRBCisgICAgICogaWYgdGhlIHF1ZXVlIGlzIGVtcHR5OyBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBtZXRhZGF0YSBidWZmZXIgaW5zaWRlCisgICAgICogdGhlIGNhcHR1cmUgcmVzdWx0IG9iamVjdCdzIG1ldGFkYXRhIGZpZWxkLgorICAgICAqIE1heSBiZSBjYWxsZWQgY29uY3VycmVudGx5IHRvIG1vc3QgbWV0aG9kcywgZXhjZXB0IGZvciB3YWl0Rm9yTmV4dEZyYW1lLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEZyYW1lKENhbWVyYU1ldGFkYXRhICpmcmFtZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFJlc3VsdChDYXB0dXJlUmVzdWx0ICpmcmFtZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogVHJpZ2dlciBhdXRvLWZvY3VzLiBUaGUgbGF0ZXN0IElEIHVzZWQgaW4gYSB0cmlnZ2VyIGF1dG9mb2N1cyBvciBjYW5jZWwKQEAgLTIyNCw5ICsyNjUsMTQgQEAKICAgICAvKioKICAgICAgKiBGbHVzaCBhbGwgcGVuZGluZyBhbmQgaW4tZmxpZ2h0IHJlcXVlc3RzLiBCbG9ja3MgdW50aWwgZmx1c2ggaXMKICAgICAgKiBjb21wbGV0ZS4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgc3RyZWFtaW5nIHJlcXVlc3QuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgSEFMIGRldmljZSB2ZXJzaW9uLgorICAgICAqLworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlVmVyc2lvbigpID0gMDsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCmluZGV4IGYyMDY0ZmIuLjI5ZWI3OGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCkBAIC0yOSw3ICsyOSwxNyBAQAogCiBGcmFtZVByb2Nlc3NvckJhc2U6OkZyYW1lUHJvY2Vzc29yQmFzZSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UpIDoKICAgICBUaHJlYWQoLypjYW5DYWxsSmF2YSovZmFsc2UpLAotICAgIG1EZXZpY2UoZGV2aWNlKSB7CisgICAgbURldmljZShkZXZpY2UpLAorICAgIG1OdW1QYXJ0aWFsUmVzdWx0cygxKSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gY2FtZXJhRGV2aWNlID0gZGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoY2FtZXJhRGV2aWNlICE9IDAgJiYKKyAgICAgICAgICAgIGNhbWVyYURldmljZS0+Z2V0RGV2aWNlVmVyc2lvbigpID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBjYW1lcmFEZXZpY2UtPmluZm8oKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX1BBUlRJQUxfUkVTVUxUX0NPVU5UKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIH0KKyAgICB9CiB9CiAKIEZyYW1lUHJvY2Vzc29yQmFzZTo6fkZyYW1lUHJvY2Vzc29yQmFzZSgpIHsKQEAgLTM3LDExICs0NywyMyBAQAogfQogCiBzdGF0dXNfdCBGcmFtZVByb2Nlc3NvckJhc2U6OnJlZ2lzdGVyTGlzdGVuZXIoaW50MzJfdCBtaW5JZCwKLSAgICAgICAgaW50MzJfdCBtYXhJZCwgd3A8RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIsIGJvb2wgcXVpcmtTZW5kUGFydGlhbHMpIHsKKyAgICAgICAgaW50MzJfdCBtYXhJZCwgd3A8RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIsIGJvb2wgc2VuZFBhcnRpYWxzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOworICAgIExpc3Q8UmFuZ2VMaXN0ZW5lcj46Oml0ZXJhdG9yIGl0ZW0gPSBtUmFuZ2VMaXN0ZW5lcnMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXRlbSAhPSBtUmFuZ2VMaXN0ZW5lcnMuZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0ZW0tPm1pbklkID09IG1pbklkICYmCisgICAgICAgICAgICAgICAgaXRlbS0+bWF4SWQgPT0gbWF4SWQgJiYKKyAgICAgICAgICAgICAgICBpdGVtLT5saXN0ZW5lciA9PSBsaXN0ZW5lcikgeworICAgICAgICAgICAgLy8gYWxyZWFkeSByZWdpc3RlcmVkLCBqdXN0IHJldHVybgorICAgICAgICAgICAgQUxPR1YoIiVzOiBBdHRlbXB0IHRvIHJlZ2lzdGVyIHRoZSBzYW1lIGNsaWVudCB0d2ljZSwgaWdub3JpbmciLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIGl0ZW0rKzsKKyAgICB9CiAgICAgQUxPR1YoIiVzOiBSZWdpc3RlcmluZyBsaXN0ZW5lciBmb3IgZnJhbWUgaWQgcmFuZ2UgJWQgLSAlZCIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1pbklkLCBtYXhJZCk7Ci0gICAgUmFuZ2VMaXN0ZW5lciByTGlzdGVuZXIgPSB7IG1pbklkLCBtYXhJZCwgbGlzdGVuZXIsIHF1aXJrU2VuZFBhcnRpYWxzIH07CisgICAgUmFuZ2VMaXN0ZW5lciByTGlzdGVuZXIgPSB7IG1pbklkLCBtYXhJZCwgbGlzdGVuZXIsIHNlbmRQYXJ0aWFscyB9OwogICAgIG1SYW5nZUxpc3RlbmVycy5wdXNoX2JhY2sockxpc3RlbmVyKTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC05OSwxNSArMTIxLDE3IEBACiB2b2lkIEZyYW1lUHJvY2Vzc29yQmFzZTo6cHJvY2Vzc05ld0ZyYW1lcyhjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQ2FtZXJhTWV0YWRhdGEgZnJhbWU7CisgICAgQ2FwdHVyZVJlc3VsdCByZXN1bHQ7CiAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogUHJvY2VzcyBuZXcgZnJhbWVzIiwgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCkpOwogCi0gICAgd2hpbGUgKCAocmVzID0gZGV2aWNlLT5nZXROZXh0RnJhbWUoJmZyYW1lKSkgPT0gT0spIHsKKyAgICB3aGlsZSAoIChyZXMgPSBkZXZpY2UtPmdldE5leHRSZXN1bHQoJnJlc3VsdCkpID09IE9LKSB7CiAKKyAgICAgICAgLy8gVE9ETzogaW5zdGVhZCBvZiBnZXR0aW5nIGZyYW1lIG51bWJlciBmcm9tIG1ldGFkYXRhLCB3ZSBzaG91bGQgcmVhZAorICAgICAgICAvLyB0aGlzIGZyb20gcmVzdWx0Lm1SZXN1bHRFeHRyYXMgd2hlbiBDYW1lcmFEZXZpY2VCYXNlIGludGVyZmFjZSBpcyBmaXhlZC4KICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7CiAKLSAgICAgICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCk7CisgICAgICAgIGVudHJ5ID0gcmVzdWx0Lm1NZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCk7CiAgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcmVhZGluZyBmcmFtZSBudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSk7CkBAIC0xMTUsMTMgKzEzOSwxMyBAQAogICAgICAgICB9CiAgICAgICAgIEFUUkFDRV9JTlQoImNhbTJfZnJhbWUiLCBlbnRyeS5kYXRhLmkzMlswXSk7CiAKLSAgICAgICAgaWYgKCFwcm9jZXNzU2luZ2xlRnJhbWUoZnJhbWUsIGRldmljZSkpIHsKKyAgICAgICAgaWYgKCFwcm9jZXNzU2luZ2xlRnJhbWUocmVzdWx0LCBkZXZpY2UpKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghZnJhbWUuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICghcmVzdWx0Lm1NZXRhZGF0YS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGFzdEZyYW1lTXV0ZXgpOwotICAgICAgICAgICAgbUxhc3RGcmFtZS5hY3F1aXJlKGZyYW1lKTsKKyAgICAgICAgICAgIG1MYXN0RnJhbWUuYWNxdWlyZShyZXN1bHQubU1ldGFkYXRhKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAocmVzICE9IE5PVF9FTk9VR0hfREFUQSkgewpAQCAtMTMzLDMyICsxNTcsNDAgQEAKICAgICByZXR1cm47CiB9CiAKLWJvb2wgRnJhbWVQcm9jZXNzb3JCYXNlOjpwcm9jZXNzU2luZ2xlRnJhbWUoQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpIHsKK2Jvb2wgRnJhbWVQcm9jZXNzb3JCYXNlOjpwcm9jZXNzU2luZ2xlRnJhbWUoQ2FwdHVyZVJlc3VsdCAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKSB7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFByb2Nlc3Mgc2luZ2xlIGZyYW1lIChpcyBlbXB0eT8gJWQpIiwKLSAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSwgZnJhbWUuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4gcHJvY2Vzc0xpc3RlbmVycyhmcmFtZSwgZGV2aWNlKSA9PSBPSzsKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSwgcmVzdWx0Lm1NZXRhZGF0YS5pc0VtcHR5KCkpOworICAgIHJldHVybiBwcm9jZXNzTGlzdGVuZXJzKHJlc3VsdCwgZGV2aWNlKSA9PSBPSzsKIH0KIAotc3RhdHVzX3QgRnJhbWVQcm9jZXNzb3JCYXNlOjpwcm9jZXNzTGlzdGVuZXJzKGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSwKK3N0YXR1c190IEZyYW1lUHJvY2Vzc29yQmFzZTo6cHJvY2Vzc0xpc3RlbmVycyhjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQsCiAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnk7CiAKLSAgICAvLyBRdWlya3M6IERvbid0IGRlbGl2ZXIgcGFydGlhbCByZXN1bHRzIHRvIGxpc3RlbmVycyB0aGF0IGRvbid0IHdhbnQgdGhlbQotICAgIGJvb2wgcXVpcmtJc1BhcnRpYWwgPSBmYWxzZTsKLSAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOwotICAgIGlmIChlbnRyeS5jb3VudCAhPSAwICYmCi0gICAgICAgICAgICBlbnRyeS5kYXRhLnU4WzBdID09IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUwpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IE5vdCBmb3J3YXJkaW5nIHBhcnRpYWwgcmVzdWx0IHRvIGxpc3RlbmVycyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCkpOwotICAgICAgICBxdWlya0lzUGFydGlhbCA9IHRydWU7CisgICAgLy8gQ2hlY2sgaWYgdGhpcyByZXN1bHQgaXMgcGFydGlhbC4KKyAgICBib29sIGlzUGFydGlhbFJlc3VsdCA9IGZhbHNlOworICAgIGlmIChkZXZpY2UtPmdldERldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBpc1BhcnRpYWxSZXN1bHQgPSByZXN1bHQubVJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPCBtTnVtUGFydGlhbFJlc3VsdHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW50cnkgPSByZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOworICAgICAgICBpZiAoZW50cnkuY291bnQgIT0gMCAmJgorICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEudThbMF0gPT0gQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFRfUEFSVElBTCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFRoaXMgaXMgYSBwYXJ0aWFsIHJlc3VsdCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgICAgIGlzUGFydGlhbFJlc3VsdCA9IHRydWU7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0lEKTsKKyAgICAvLyBUT0RPOiBpbnN0ZWFkIG9mIGdldHRpbmcgcmVxdWVzdElEIGZyb20gQ2FtZXJhTWV0YWRhdGEsIHdlIHNob3VsZCBnZXQgaXQKKyAgICAvLyBmcm9tIENhcHR1cmVSZXN1bHRFeHRyYXMuIFRoaXMgd2lsbCByZXF1aXJlIGNoYW5naW5nIENhbWVyYTJEZXZpY2UuCisgICAgLy8gQ3VycmVudGx5IENhbWVyYTJEZXZpY2UgdXNlcyBNZXRhZGF0YVF1ZXVlIHRvIHN0b3JlIHJlc3VsdHMsIHdoaWNoIGRvZXMgbm90CisgICAgLy8gaW5jbHVkZSBDYXB0dXJlUmVzdWx0RXh0cmFzLgorICAgIGVudHJ5ID0gcmVzdWx0Lm1NZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9JRCk7CiAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHJlYWRpbmcgZnJhbWUgaWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHJlYWRpbmcgZnJhbWUgaWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGludDMyX3QgcmVxdWVzdElkID0gZW50cnkuZGF0YS5pMzJbMF07CkBAIC0xNjgsMTAgKzIwMCwxMCBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CiAKICAgICAgICAgTGlzdDxSYW5nZUxpc3RlbmVyPjo6aXRlcmF0b3IgaXRlbSA9IG1SYW5nZUxpc3RlbmVycy5iZWdpbigpOworICAgICAgICAvLyBEb24ndCBkZWxpdmVyIHBhcnRpYWwgcmVzdWx0cyB0byBsaXN0ZW5lcnMgdGhhdCBkb24ndCB3YW50IHRoZW0KICAgICAgICAgd2hpbGUgKGl0ZW0gIT0gbVJhbmdlTGlzdGVuZXJzLmVuZCgpKSB7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdElkID49IGl0ZW0tPm1pbklkICYmCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCA8IGl0ZW0tPm1heElkICYmCi0gICAgICAgICAgICAgICAgICAgICghcXVpcmtJc1BhcnRpYWwgfHwgaXRlbS0+cXVpcmtTZW5kUGFydGlhbHMpICkgeworICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCA+PSBpdGVtLT5taW5JZCAmJiByZXF1ZXN0SWQgPCBpdGVtLT5tYXhJZCAmJgorICAgICAgICAgICAgICAgICAgICAoIWlzUGFydGlhbFJlc3VsdCB8fCBpdGVtLT5zZW5kUGFydGlhbHMpKSB7CiAgICAgICAgICAgICAgICAgc3A8RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBpdGVtLT5saXN0ZW5lci5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IG1SYW5nZUxpc3RlbmVycy5lcmFzZShpdGVtKTsKQEAgLTE4MywxMCArMjE1LDEyIEBACiAgICAgICAgICAgICBpdGVtKys7CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR1YoIkdvdCAlZCByYW5nZSBsaXN0ZW5lcnMgb3V0IG9mICVkIiwgbGlzdGVuZXJzLnNpemUoKSwgbVJhbmdlTGlzdGVuZXJzLnNpemUoKSk7CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEdvdCAlenUgcmFuZ2UgbGlzdGVuZXJzIG91dCBvZiAlenUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgZGV2aWNlLT5nZXRJZCgpLCBsaXN0ZW5lcnMuc2l6ZSgpLCBtUmFuZ2VMaXN0ZW5lcnMuc2l6ZSgpKTsKKwogICAgIExpc3Q8c3A8RmlsdGVyZWRMaXN0ZW5lcj4gPjo6aXRlcmF0b3IgaXRlbSA9IGxpc3RlbmVycy5iZWdpbigpOwogICAgIGZvciAoOyBpdGVtICE9IGxpc3RlbmVycy5lbmQoKTsgaXRlbSsrKSB7Ci0gICAgICAgICgqaXRlbSktPm9uRnJhbWVBdmFpbGFibGUocmVxdWVzdElkLCBmcmFtZSk7CisgICAgICAgICgqaXRlbSktPm9uUmVzdWx0QXZhaWxhYmxlKHJlc3VsdCk7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaAppbmRleCA4OWI2MDhhLi5hNjE4ZDg0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zOSwxNiArNDAsMTYgQEAKICAgICB2aXJ0dWFsIH5GcmFtZVByb2Nlc3NvckJhc2UoKTsKIAogICAgIHN0cnVjdCBGaWx0ZXJlZExpc3RlbmVyOiB2aXJ0dWFsIHB1YmxpYyBSZWZCYXNlIHsKLSAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KSA9IDA7CiAgICAgfTsKIAogICAgIC8vIFJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yIGEgcmFuZ2Ugb2YgSURzIFttaW5JZCwgbWF4SWQpLiBNdWx0aXBsZSBsaXN0ZW5lcnMKLSAgICAvLyBjYW4gYmUgbGlzdGVuaW5nIHRvIHRoZSBzYW1lIHJhbmdlLgotICAgIC8vIFFVSVJLOiBzZW5kUGFydGlhbHMgY29udHJvbHMgd2hldGhlciBwYXJ0aWFsIHJlc3VsdHMgd2lsbCBiZSBzZW50LgorICAgIC8vIGNhbiBiZSBsaXN0ZW5pbmcgdG8gdGhlIHNhbWUgcmFuZ2UuIFJlZ2lzdGVyaW5nIHRoZSBzYW1lIGxpc3RlbmVyIHdpdGgKKyAgICAvLyB0aGUgc2FtZSByYW5nZSBvZiBJRHMgaGFzIG5vIGVmZmVjdC4KKyAgICAvLyBzZW5kUGFydGlhbHMgY29udHJvbHMgd2hldGhlciBwYXJ0aWFsIHJlc3VsdHMgd2lsbCBiZSBzZW50LgogICAgIHN0YXR1c190IHJlZ2lzdGVyTGlzdGVuZXIoaW50MzJfdCBtaW5JZCwgaW50MzJfdCBtYXhJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwPEZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBxdWlya1NlbmRQYXJ0aWFscyA9IHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZW5kUGFydGlhbHMgPSB0cnVlKTsKICAgICBzdGF0dXNfdCByZW1vdmVMaXN0ZW5lcihpbnQzMl90IG1pbklkLCBpbnQzMl90IG1heElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwPEZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyKTsKIApAQCAtNjYsMTYgKzY3LDE5IEBACiAgICAgICAgIGludDMyX3QgbWluSWQ7CiAgICAgICAgIGludDMyX3QgbWF4SWQ7CiAgICAgICAgIHdwPEZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyOwotICAgICAgICBib29sIHF1aXJrU2VuZFBhcnRpYWxzOworICAgICAgICBib29sIHNlbmRQYXJ0aWFsczsKICAgICB9OwogICAgIExpc3Q8UmFuZ2VMaXN0ZW5lcj4gbVJhbmdlTGlzdGVuZXJzOwogCisgICAgLy8gTnVtYmVyIG9mIHBhcnRpYWwgcmVzdWx0IHRoZSBIQUwgd2lsbCBwb3RlbnRpYWxseSBzZW5kLgorICAgIGludDMyX3QgbU51bVBhcnRpYWxSZXN1bHRzOworCiAgICAgdm9pZCBwcm9jZXNzTmV3RnJhbWVzKGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpOwogCi0gICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCisgICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYXB0dXJlUmVzdWx0ICZyZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKTsKIAotICAgIHN0YXR1c190IHByb2Nlc3NMaXN0ZW5lcnMoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAorICAgIHN0YXR1c190IHByb2Nlc3NMaXN0ZW5lcnMoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSk7CiAKICAgICBDYW1lcmFNZXRhZGF0YSBtTGFzdEZyYW1lOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCmluZGV4IDg3YjI4MDcuLjYzODY4MzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKQEAgLTkyLDggKzkyLDIyIEBACiAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShod19tb2R1bGVfdCAqbW9kdWxlKQogICAgIHsKICAgICAgICAgQUxPR0koIk9wZW5pbmcgY2FtZXJhICVzIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICBpbnQgcmMgPSBtb2R1bGUtPm1ldGhvZHMtPm9wZW4obW9kdWxlLCBtTmFtZS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChod19kZXZpY2VfdCAqKikmbURldmljZSk7CisgICAgICAgIGNhbWVyYV9tb2R1bGVfdCAqY2FtZXJhTW9kdWxlID0gcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbW9kdWxlX3QgKj4obW9kdWxlKTsKKyAgICAgICAgY2FtZXJhX2luZm8gaW5mbzsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gY2FtZXJhTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oYXRvaShtTmFtZS5zdHJpbmcoKSksICZpbmZvKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKworICAgICAgICBpbnQgcmMgPSBPSzsKKyAgICAgICAgaWYgKG1vZHVsZS0+bW9kdWxlX2FwaV92ZXJzaW9uID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8zICYmCisgICAgICAgICAgICBpbmZvLmRldmljZV92ZXJzaW9uID4gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApIHsKKyAgICAgICAgICAgIC8vIE9wZW4gaGlnaGVyIHZlcnNpb24gY2FtZXJhIGRldmljZSBhcyBIQUwxLjAgZGV2aWNlLgorICAgICAgICAgICAgcmMgPSBjYW1lcmFNb2R1bGUtPm9wZW5fbGVnYWN5KG1vZHVsZSwgbU5hbWUuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHdfZGV2aWNlX3QgKiopJm1EZXZpY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmMgPSBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJPcGVuRXJyb3JDb2RlKG1vZHVsZS0+bWV0aG9kcy0+b3BlbigKKyAgICAgICAgICAgICAgICBtb2R1bGUsIG1OYW1lLnN0cmluZygpLCAoaHdfZGV2aWNlX3QgKiopJm1EZXZpY2UpKTsKKyAgICAgICAgfQogICAgICAgICBpZiAocmMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3Qgb3BlbiBjYW1lcmEgJXM6ICVkIiwgbU5hbWUuc3RyaW5nKCksIHJjKTsKICAgICAgICAgICAgIHJldHVybiByYzsKQEAgLTYxMSw5ICs2MjUsMTQgQEAKICAgICBzdGF0aWMgaW50IF9fc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQpCiAgICAgeworICAgICAgICBpbnQgcmM7CiAgICAgICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7Ci0gICAgICAgIHJldHVybiBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisKKyAgICAgICAgcmMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMoYSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmICghcmMpIHsKKyAgICAgICAgICAgIHJjID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQoYSwgZm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmM7CiAgICAgfQogCiAgICAgc3RhdGljIGludCBfX3NldF9jcm9wKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKncsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcAppbmRleCAyYmMxYThhLi44Y2FhZGQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5jcHAKQEAgLTI1LDEwICsyNSwxMiBAQAogI2RlZmluZSBBTE9HVlYoLi4uKSAoKHZvaWQpMCkKICNlbmRpZgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgIkNhbWVyYTJEZXZpY2UuaCIKKyNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjYsOCArNjgsOCBAQAogCiAgICAgY2FtZXJhMl9kZXZpY2VfdCAqZGV2aWNlOwogCi0gICAgcmVzID0gbW9kdWxlLT5jb21tb24ubWV0aG9kcy0+b3BlbigmbW9kdWxlLT5jb21tb24sIG5hbWUsCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PGh3X2RldmljZV90Kio+KCZkZXZpY2UpKTsKKyAgICByZXMgPSBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJPcGVuRXJyb3JDb2RlKG1vZHVsZS0+Y29tbW9uLm1ldGhvZHMtPm9wZW4oCisgICAgICAgICZtb2R1bGUtPmNvbW1vbiwgbmFtZSwgcmVpbnRlcnByZXRfY2FzdDxod19kZXZpY2VfdCoqPigmZGV2aWNlKSkpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBvcGVuIGNhbWVyYSAlZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKQEAgLTExMSwyMCArMTEzLDYgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICByZXMgPSBkZXZpY2UtPm9wcy0+Z2V0X21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzKGRldmljZSwgJm1WZW5kb3JUYWdPcHMpOwotICAgIGlmIChyZXMgIT0gT0sgKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gcmV0cmlldmUgdGFnIG9wcyBmcm9tIGRldmljZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICBkZXZpY2UtPmNvbW1vbi5jbG9zZSgmZGV2aWNlLT5jb21tb24pOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgICByZXMgPSBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzKG1WZW5kb3JUYWdPcHMpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBzZXQgdGFnIG9wczogJXMgKCVkKSIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIGRldmljZS0+Y29tbW9uLmNsb3NlKCZkZXZpY2UtPmNvbW1vbik7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQogICAgIHJlcyA9IGRldmljZS0+b3BzLT5zZXRfbm90aWZ5X2NhbGxiYWNrKGRldmljZSwgbm90aWZpY2F0aW9uQ2FsbGJhY2ssCiAgICAgICAgICAgICBOVUxMKTsKICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0xMzYsNiArMTI0LDcgQEAKIAogICAgIG1EZXZpY2VJbmZvID0gaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKICAgICBtSGFsMkRldmljZSA9IGRldmljZTsKKyAgICBtRGV2aWNlVmVyc2lvbiA9IGRldmljZS0+Y29tbW9uLnZlcnNpb247CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0yMTIsNyArMjAxLDcgQEAKICAgICByZXR1cm4gbURldmljZUluZm87CiB9CiAKLXN0YXR1c190IENhbWVyYTJEZXZpY2U6OmNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpIHsKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OmNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTIyMCwxNSArMjA5LDI5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRSgiJXM6IENhbWVyYTJEZXZpY2UgYnVyc3QgY2FwdHVyZSBub3QgaW1wbGVtZW50ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBDYW1lcmFNZXRhZGF0YSBzdHJlYW1SZXF1ZXN0KHJlcXVlc3QpOwogICAgIHJldHVybiBtUmVxdWVzdFF1ZXVlLnNldFN0cmVhbVNsb3Qoc3RyZWFtUmVxdWVzdC5yZWxlYXNlKCkpOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjbGVhclN0cmVhbWluZ1JlcXVlc3QoKSB7CitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRSgiJXMsIENhbWVyYTJEZXZpY2Ugc3RyZWFtaW5nIGJ1cnN0IG5vdCBpbXBsZW1lbnRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgcmV0dXJuIG1SZXF1ZXN0UXVldWUuc2V0U3RyZWFtU2xvdChOVUxMKTsKIH0KQEAgLTIzOSwxMyArMjQyLDE2IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTJEZXZpY2U6OmNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgc2l6ZV90IHNpemUsIGludCAqaWQpIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAKICAgICBzcDxTdHJlYW1BZGFwdGVyPiBzdHJlYW0gPSBuZXcgU3RyZWFtQWRhcHRlcihtSGFsMkRldmljZSk7Ci0KKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgc2l6ZSA9IGdldEpwZWdCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOworICAgIH0KICAgICByZXMgPSBzdHJlYW0tPmNvbm5lY3RUb0RldmljZShjb25zdW1lciwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBzaXplKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gY3JlYXRlIHN0cmVhbSAoJWQgeCAlZCwgZm9ybWF0ICV4KToiCkBAIC0yNjAsNiArMjY2LDE3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzc2l6ZV90IENhbWVyYTJEZXZpY2U6OmdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICAvLyBBbHdheXMgZ2l2ZSB0aGUgbWF4IGpwZWcgYnVmZmVyIHNpemUgcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsIGpwZWcgcmVzb2x1dGlvbi4KKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkganBlZ0J1Zk1heFNpemUgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfSlBFR19NQVhfU0laRSk7CisgICAgaWYgKGpwZWdCdWZNYXhTaXplLmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgbWF4aW11bSBKUEVHIHNpemUgaW4gc3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4ganBlZ0J1Zk1heFNpemUuZGF0YS5pMzJbMF07Cit9CisKIHN0YXR1c190IENhbWVyYTJEZXZpY2U6OmNyZWF0ZVJlcHJvY2Vzc1N0cmVhbUZyb21TdHJlYW0oaW50IG91dHB1dElkLCBpbnQgKmlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CkBAIC0zOTgsNiArNDE1LDE5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKKworICAgIC8qKgorICAgICAqIEhBTDIgZGV2aWNlcyBkbyBub3QgbmVlZCB0byBjb25maWd1cmUgc3RyZWFtczsKKyAgICAgKiBzdHJlYW1zIGFyZSBjcmVhdGVkIG9uIHRoZSBmbHkuCisgICAgICovCisgICAgQUxPR1coIiVzOiBOby1vcCBmb3IgSEFMMiBkZXZpY2VzIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybiBPSzsKK30KKwogCiBzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpIHsKQEAgLTQ2MSw3ICs0OTEsMTMgQEAKICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewogICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKSB7CiAgICAgICAgICAgICBjYXNlIENBTUVSQTJfTVNHX0VSUk9SOgotICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcihleHQxLCBleHQyLCBleHQzKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkLiBleHQyIGFuZCBleHQzIG5lZWQgdG8gYmUgY29uc2lkZXJlZC4KKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAoKGV4dDEgPT0gQ0FNRVJBMl9NU0dfRVJST1JfREVWSUNFKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGV4dDEgPT0gQ0FNRVJBMl9NU0dfRVJST1JfSEFSRFdBUkUpKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0UgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfU0VSVklDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIENBTUVSQTJfTVNHX1NIVVRURVI6IHsKICAgICAgICAgICAgICAgICAvLyBUT0RPOiBPbmx5IG5lZWRlZCBmb3IgY2FtZXJhMiBBUEksIHdoaWNoIGlzIHVuc3VwcG9ydGVkCkBAIC00OTAsMTYgKzUyNiwyMiBAQAogICAgIHJldHVybiBtRnJhbWVRdWV1ZS53YWl0Rm9yQnVmZmVyKHRpbWVvdXQpOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpnZXROZXh0RnJhbWUoQ2FtZXJhTWV0YWRhdGEgKmZyYW1lKSB7CitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpnZXROZXh0UmVzdWx0KENhcHR1cmVSZXN1bHQgKnJlc3VsdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiBnZXQgQ2FwdHVyZVJlc3VsdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogcmVzdWx0IHBvaW50ZXIgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIHN0YXR1c190IHJlczsKICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3RnJhbWU7CiAgICAgcmVzID0gbUZyYW1lUXVldWUuZGVxdWV1ZSgmcmF3RnJhbWUpOwotICAgIGlmIChyYXdGcmFtZSAgPT0gTlVMTCkgeworICAgIGlmIChyYXdGcmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiAgICAgfSBlbHNlIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgZnJhbWUtPmFjcXVpcmUocmF3RnJhbWUpOworICAgICAgICByZXN1bHQtPm1NZXRhZGF0YS5hY3F1aXJlKHJhd0ZyYW1lKTsKICAgICB9CisKICAgICByZXR1cm4gcmVzOwogfQogCkBAIC01NjksMTMgKzYxMSwxOCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYTJEZXZpY2U6OmZsdXNoKCkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Zmx1c2goaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBtUmVxdWVzdFF1ZXVlLmNsZWFyKCk7CiAgICAgcmV0dXJuIHdhaXRVbnRpbERyYWluZWQoKTsKIH0KIAordWludDMyX3QgQ2FtZXJhMkRldmljZTo6Z2V0RGV2aWNlVmVyc2lvbigpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHJldHVybiBtRGV2aWNlVmVyc2lvbjsKK30KKwogLyoqCiAgKiBDYW1lcmEyRGV2aWNlOjpNZXRhZGF0YVF1ZXVlCiAgKi8KQEAgLTgyMiw3ICs4NjksNyBAQAogICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgICBTdHJlYW0gc2xvdDogRW1wdHlcbiIpOwogICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgICBTdHJlYW0gc2xvdDogJWQgZW50cmllc1xuIiwKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgU3RyZWFtIHNsb3Q6ICV6dSBlbnRyaWVzXG4iLAogICAgICAgICAgICAgICAgIG1TdHJlYW1TbG90LnNpemUoKSk7CiAgICAgICAgIGludCBpID0gMDsKICAgICAgICAgZm9yIChMaXN0PGNhbWVyYV9tZXRhZGF0YV90Kj46Oml0ZXJhdG9yIHIgPSBtU3RyZWFtU2xvdC5iZWdpbigpOwpAQCAtODM3LDcgKzg4NCw3IEBACiAgICAgICAgIHJlc3VsdCA9ICIgICAgICBNYWluIHF1ZXVlIGlzIGVtcHR5XG4iOwogICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIiAgICAgIE1haW4gcXVldWUgaGFzICVkIGVudHJpZXM6XG4iLAorICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIiAgICAgIE1haW4gcXVldWUgaGFzICV6dSBlbnRyaWVzOlxuIiwKICAgICAgICAgICAgICAgICBtRW50cmllcy5zaXplKCkpOwogICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgIGZvciAoTGlzdDxjYW1lcmFfbWV0YWRhdGFfdCo+OjppdGVyYXRvciByID0gbUVudHJpZXMuYmVnaW4oKTsKQEAgLTEwMDAsNyArMTA0Nyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgQUxPR1YoIiVzOiBOZXcgc3RyZWFtIHBhcmFtZXRlcnMgJWQgeCAlZCwgZm9ybWF0IDB4JXgsIHNpemUgJWQiLAorICAgIEFMT0dWKCIlczogTmV3IHN0cmVhbSBwYXJhbWV0ZXJzICVkIHggJWQsIGZvcm1hdCAweCV4LCBzaXplICV6dSIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgc2l6ZSk7CiAKICAgICBtQ29uc3VtZXJJbnRlcmZhY2UgPSBjb25zdW1lcjsKQEAgLTEwNjgsMjUgKzExMTUsMzMgQEAKICAgICB9CiAKICAgICBpZiAobUZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKLSAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgbVNpemUsIDEsIG1Gb3JtYXQpOworICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAorICAgICAgICAgICAgICAgIG1TaXplLCAxKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIGNvbXByZXNzZWQgc3RyZWFtIGJ1ZmZlciBnZW9tZXRyeSIKLSAgICAgICAgICAgICAgICAgICAgIiAlZCB4ICVkLCBzaXplICVkIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIGNvbXByZXNzZWQgc3RyZWFtIGJ1ZmZlciBkaW1lbnNpb25zIgorICAgICAgICAgICAgICAgICAgICAiICVkIHggJWQsIHNpemUgJXp1IGZvciBzdHJlYW0gJWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1XaWR0aCwgbUhlaWdodCwgbVNpemUsIG1JZCk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LCBtRm9ybWF0KTsKKyAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwKKyAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBnZW9tZXRyeSIKLSAgICAgICAgICAgICAgICAgICAgIiAlZCB4ICVkLCBmb3JtYXQgMHgleCBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIG1JZCk7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBkaW1lbnNpb25zIgorICAgICAgICAgICAgICAgICAgICAiICVkIHggJWQgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVdpZHRoLCBtSGVpZ2h0LCBtSWQpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KIAorICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwgbUZvcm1hdCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBmb3JtYXQiCisgICAgICAgICAgICAgICAgIiAlI3ggZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRm9ybWF0LCBtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIGludCBtYXhDb25zdW1lckJ1ZmZlcnM7CiAgICAgcmVzID0gbUNvbnN1bWVySW50ZXJmYWNlLT5xdWVyeShtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCiAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsICZtYXhDb25zdW1lckJ1ZmZlcnMpOwpAQCAtMTIxNCwxMSArMTI2OSwxMSBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgU3RyaW5nOCByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIiAgICAgIFN0cmVhbSAlZDogJWQgeCAlZCwgZm9ybWF0IDB4JXhcbiIsCiAgICAgICAgICAgICBtSWQsIG1XaWR0aCwgbUhlaWdodCwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgICBzaXplICVkLCB1c2FnZSAweCV4LCByZXF1ZXN0ZWQgZm9ybWF0IDB4JXhcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgICBzaXplICV6dSwgdXNhZ2UgMHgleCwgcmVxdWVzdGVkIGZvcm1hdCAweCV4XG4iLAogICAgICAgICAgICAgbVNpemUsIG1Vc2FnZSwgbUZvcm1hdFJlcXVlc3RlZCk7CiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgICB0b3RhbCBidWZmZXJzOiAlZCwgZGVxdWV1ZWQgYnVmZmVyczogJWRcbiIsCiAgICAgICAgICAgICBtVG90YWxCdWZmZXJzLCBtQWN0aXZlQnVmZmVycyk7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgICBmcmFtZSBjb3VudDogJWQsIGxhc3QgdGltZXN0YW1wICVsbGRcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgICBmcmFtZSBjb3VudDogJWQsIGxhc3QgdGltZXN0YW1wICUiIFBSSWQ2NCAiXG4iLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1MYXN0VGltZXN0YW1wKTsKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5oCmluZGV4IDFmNTNjNTYuLjJhM2YxZDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5oCkBAIC00NywzOCArNDcsNDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3QoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICB2aXJ0dWFsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNhcHR1cmVMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRVbnRpbFJlcXVlc3RSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lb3V0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgaW50ICppZCk7CisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgKmlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVJlcHJvY2Vzc1N0cmVhbUZyb21TdHJlYW0oaW50IG91dHB1dElkLCBpbnQgKmlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbUluZm8oaW50IGlkLAogICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVRyYW5zZm9ybShpbnQgaWQsIGludCB0cmFuc2Zvcm0pOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKGludCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVSZXByb2Nlc3NTdHJlYW0oaW50IGlkKTsKKyAgICAvLyBOby1vcCBvbiBIQUwyIGRldmljZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLCBDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0VW50aWxEcmFpbmVkKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXROb3RpZnlDYWxsYmFjayhOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOwogICAgIHZpcnR1YWwgYm9vbCAgICAgd2lsbE5vdGlmeTNBKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0Rm9yTmV4dEZyYW1lKG5zZWNzX3QgdGltZW91dCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0RnJhbWUoQ2FtZXJhTWV0YWRhdGEgKmZyYW1lKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRSZXN1bHQoQ2FwdHVyZVJlc3VsdCAqZnJhbWUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdHJpZ2dlckF1dG9mb2N1cyh1aW50MzJfdCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB0cmlnZ2VyQ2FuY2VsQXV0b2ZvY3VzKHVpbnQzMl90IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHRyaWdnZXJQcmVjYXB0dXJlTWV0ZXJpbmcodWludDMyX3QgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHVzaFJlcHJvY2Vzc0J1ZmZlcihpbnQgcmVwcm9jZXNzU3RyZWFtSWQsCiAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgd3A8QnVmZmVyUmVsZWFzZWRMaXN0ZW5lcj4gbGlzdGVuZXIpOwogICAgIC8vIEZsdXNoIGltcGxlbWVudGVkIGFzIGp1c3QgYSB3YWl0Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCB1aW50MzJfdCBnZXREZXZpY2VWZXJzaW9uKCk7CisgICAgdmlydHVhbCBzc2l6ZV90IGdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0OworCiAgIHByaXZhdGU6CiAgICAgY29uc3QgaW50IG1JZDsKICAgICBjYW1lcmEyX2RldmljZV90ICptSGFsMkRldmljZTsKIAogICAgIENhbWVyYU1ldGFkYXRhIG1EZXZpY2VJbmZvOwotICAgIHZlbmRvcl90YWdfcXVlcnlfb3BzX3QgKm1WZW5kb3JUYWdPcHM7CisKKyAgICB1aW50MzJfdCBtRGV2aWNlVmVyc2lvbjsKIAogICAgIC8qKgogICAgICAqIFF1ZXVlIGNsYXNzIGZvciBib3RoIHNlbmRpbmcgcmVxdWVzdHMgdG8gYSBjYW1lcmEyIGRldmljZSwgYW5kIGZvcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKaW5kZXggM2RiYzFiMC4uNmE3ZjllNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCkBAIC0zNyw2ICszNyw4IEBACiAgICAgIiVzOiAiIGZtdCwgX19GVU5DVElPTl9fLCAgICAgICAgICAgICAgICAgICAgXAogICAgICMjX19WQV9BUkdTX18pCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KQEAgLTQ2LDYgKzQ4LDggQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgiCisjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKIApAQCAtNTUsNyArNTksOCBAQAogICAgICAgICBtSWQoaWQpLAogICAgICAgICBtSGFsM0RldmljZShOVUxMKSwKICAgICAgICAgbVN0YXR1cyhTVEFUVVNfVU5JTklUSUFMSVpFRCksCi0gICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0UXVpcmsoZmFsc2UpLAorICAgICAgICBtVXNlUGFydGlhbFJlc3VsdChmYWxzZSksCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cygxKSwKICAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlcigwKSwKICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIoMCksCiAgICAgICAgIG1MaXN0ZW5lcihOVUxMKQpAQCAtMTAwLDggKzEwNSwxMSBAQAogCiAgICAgY2FtZXJhM19kZXZpY2VfdCAqZGV2aWNlOwogCi0gICAgcmVzID0gbW9kdWxlLT5jb21tb24ubWV0aG9kcy0+b3BlbigmbW9kdWxlLT5jb21tb24sIGRldmljZU5hbWUuc3RyaW5nKCksCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PGh3X2RldmljZV90Kio+KCZkZXZpY2UpKTsKKyAgICBBVFJBQ0VfQkVHSU4oImNhbWVyYTMtPm9wZW4iKTsKKyAgICByZXMgPSBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJPcGVuRXJyb3JDb2RlKG1vZHVsZS0+Y29tbW9uLm1ldGhvZHMtPm9wZW4oCisgICAgICAgICZtb2R1bGUtPmNvbW1vbiwgZGV2aWNlTmFtZS5zdHJpbmcoKSwKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxod19kZXZpY2VfdCoqPigmZGV2aWNlKSkpOworICAgIEFUUkFDRV9FTkQoKTsKIAogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3Qgb3BlbiBjYW1lcmE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTEwOSwxMCArMTE3LDkgQEAKICAgICB9CiAKICAgICAvKiogQ3Jvc3MtY2hlY2sgZGV2aWNlIHZlcnNpb24gKi8KLQotICAgIGlmIChkZXZpY2UtPmNvbW1vbi52ZXJzaW9uICE9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgaWYgKGRldmljZS0+Y29tbW9uLnZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewogICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCBvcGVuIGNhbWVyYTogIgotICAgICAgICAgICAgICAgICJDYW1lcmEgZGV2aWNlIGlzIG5vdCB2ZXJzaW9uICV4LCByZXBvcnRzICV4IGluc3RlYWQiLAorICAgICAgICAgICAgICAgICJDYW1lcmEgZGV2aWNlIHNob3VsZCBiZSBhdCBsZWFzdCAleCwgcmVwb3J0cyAleCBpbnN0ZWFkIiwKICAgICAgICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCwKICAgICAgICAgICAgICAgICBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uKTsKICAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UoJmRldmljZS0+Y29tbW9uKTsKQEAgLTEyMCwxMyArMTI3LDE0IEBACiAgICAgfQogCiAgICAgY2FtZXJhX2luZm8gaW5mbzsKLSAgICByZXMgPSBtb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhtSWQsICZpbmZvKTsKKyAgICByZXMgPSBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJHZXRJbmZvRXJyb3JDb2RlKG1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKAorICAgICAgICBtSWQsICZpbmZvKSk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIGlmIChpbmZvLmRldmljZV92ZXJzaW9uICE9IGRldmljZS0+Y29tbW9uLnZlcnNpb24pIHsKICAgICAgICAgU0VUX0VSUl9MKCJIQUwgcmVwb3J0aW5nIG1pc21hdGNoZWQgY2FtZXJhX2luZm8gdmVyc2lvbiAoJXgpIgogICAgICAgICAgICAgICAgICIgYW5kIGRldmljZSB2ZXJzaW9uICgleCkuIiwKLSAgICAgICAgICAgICAgICBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uLCBpbmZvLmRldmljZV92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBpbmZvLmRldmljZV92ZXJzaW9uLCBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uKTsKICAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UoJmRldmljZS0+Y29tbW9uKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC0xNDQsMjQgKzE1Miw2IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLyoqIEdldCB2ZW5kb3IgbWV0YWRhdGEgdGFncyAqLwotCi0gICAgbVZlbmRvclRhZ09wcy5nZXRfY2FtZXJhX3ZlbmRvcl9zZWN0aW9uX25hbWUgPSBOVUxMOwotCi0gICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5nZXRfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMiKTsKLSAgICBkZXZpY2UtPm9wcy0+Z2V0X21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzKGRldmljZSwgJm1WZW5kb3JUYWdPcHMpOwotICAgIEFUUkFDRV9FTkQoKTsKLQotICAgIGlmIChtVmVuZG9yVGFnT3BzLmdldF9jYW1lcmFfdmVuZG9yX3NlY3Rpb25fbmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJlcyA9IHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMoJm1WZW5kb3JUYWdPcHMpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBzZXQgdGFnIG9wczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UoJmRldmljZS0+Y29tbW9uKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKiogU3RhcnQgdXAgc3RhdHVzIHRyYWNrZXIgdGhyZWFkICovCiAgICAgbVN0YXR1c1RyYWNrZXIgPSBuZXcgU3RhdHVzVHJhY2tlcih0aGlzKTsKICAgICByZXMgPSBtU3RhdHVzVHJhY2tlci0+cnVuKFN0cmluZzg6OmZvcm1hdCgiQzNEZXYtJWQtU3RhdHVzIiwgbUlkKS5zdHJpbmcoKSk7CkBAIC0xODcsMjAgKzE3NywyOSBAQAogCiAgICAgLyoqIEV2ZXJ5dGhpbmcgaXMgZ29vZCB0byBnbyAqLwogCisgICAgbURldmljZVZlcnNpb24gPSBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uOwogICAgIG1EZXZpY2VJbmZvID0gaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKICAgICBtSGFsM0RldmljZSA9IGRldmljZTsKICAgICBtU3RhdHVzID0gU1RBVFVTX1VOQ09ORklHVVJFRDsKICAgICBtTmV4dFN0cmVhbUlkID0gMDsKKyAgICBtRHVtbXlTdHJlYW1JZCA9IE5PX1NUUkVBTTsKICAgICBtTmVlZENvbmZpZyA9IHRydWU7CiAgICAgbVBhdXNlU3RhdGVOb3RpZnkgPSBmYWxzZTsKIAotICAgIC8qKiBDaGVjayBmb3IgcXVpcmtzICovCi0KICAgICAvLyBXaWxsIHRoZSBIQUwgYmUgc2VuZGluZyBpbiBlYXJseSBwYXJ0aWFsIHJlc3VsdCBtZXRhZGF0YT8KLSAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgcGFydGlhbFJlc3VsdHNRdWlyayA9Ci0gICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfUVVJUktTX1VTRV9QQVJUSUFMX1JFU1VMVCk7Ci0gICAgaWYgKHBhcnRpYWxSZXN1bHRzUXVpcmsuY291bnQgPiAwICYmIHBhcnRpYWxSZXN1bHRzUXVpcmsuZGF0YS51OFswXSA9PSAxKSB7Ci0gICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0UXVpcmsgPSB0cnVlOworICAgIGlmIChtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgcGFydGlhbFJlc3VsdHNDb3VudCA9CisgICAgICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1JFUVVFU1RfUEFSVElBTF9SRVNVTFRfQ09VTlQpOworICAgICAgICBpZiAocGFydGlhbFJlc3VsdHNDb3VudC5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cyA9IHBhcnRpYWxSZXN1bHRzQ291bnQuZGF0YS5pMzJbMF07CisgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdCA9IChtTnVtUGFydGlhbFJlc3VsdHMgPiAxKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBwYXJ0aWFsUmVzdWx0c1F1aXJrID0KKyAgICAgICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfUVVJUktTX1VTRV9QQVJUSUFMX1JFU1VMVCk7CisgICAgICAgIGlmIChwYXJ0aWFsUmVzdWx0c1F1aXJrLmNvdW50ID4gMCAmJiBwYXJ0aWFsUmVzdWx0c1F1aXJrLmRhdGEudThbMF0gPT0gMSkgeworICAgICAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQgPSB0cnVlOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtMjY5LDcgKzI2OCw5IEBACiAgICAgICAgIG1TdGF0dXNUcmFja2VyLmNsZWFyKCk7CiAKICAgICAgICAgaWYgKG1IYWwzRGV2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEFUUkFDRV9CRUdJTigiY2FtZXJhMy0+Y2xvc2UiKTsKICAgICAgICAgICAgIG1IYWwzRGV2aWNlLT5jb21tb24uY2xvc2UoJm1IYWwzRGV2aWNlLT5jb21tb24pOworICAgICAgICAgICAgQVRSQUNFX0VORCgpOwogICAgICAgICAgICAgbUhhbDNEZXZpY2UgPSBOVUxMOwogICAgICAgICB9CiAKQEAgLTI5Niw2ICsyOTcsODUgQEAKICAgICByZXR1cm4gZ290TG9jazsKIH0KIAorQ2FtZXJhM0RldmljZTo6U2l6ZSBDYW1lcmEzRGV2aWNlOjpnZXRNYXhKcGVnUmVzb2x1dGlvbigpIGNvbnN0IHsKKyAgICBpbnQzMl90IG1heEpwZWdXaWR0aCA9IDAsIG1heEpwZWdIZWlnaHQgPSAwOworICAgIGlmIChtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBjb25zdCBpbnQgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDQ7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDA7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMTsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMjsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9JU19JTlBVVF9PRkZTRVQgPSAzOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1Db25maWdzID0KKyAgICAgICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgICAgICBpZiAoYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudCA9PSAwIHx8CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudCAlIFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFNpemUoMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXQgbWF4IGpwZWcgc2l6ZSAoYXJlYS13aXNlKS4KKyAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCB3aWR0aCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IGlzSW5wdXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGlmIChpc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUCisgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IgJiYKKyAgICAgICAgICAgICAgICAgICAgKHdpZHRoICogaGVpZ2h0ID4gbWF4SnBlZ1dpZHRoICogbWF4SnBlZ0hlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBtYXhKcGVnV2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBtYXhKcGVnSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGF2YWlsYWJsZUpwZWdTaXplcyA9CisgICAgICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSlBFR19TSVpFUyk7CisgICAgICAgIGlmIChhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQgPT0gMCB8fCBhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQgJSAyICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBTaXplKDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IG1heCBqcGVnIHNpemUgKGFyZWEtd2lzZSkuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50OyBpICs9IDIpIHsKKyAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2ldICogYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2kgKyAxXSkKKyAgICAgICAgICAgICAgICAgICAgPiAobWF4SnBlZ1dpZHRoICogbWF4SnBlZ0hlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBtYXhKcGVnV2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaV07CisgICAgICAgICAgICAgICAgbWF4SnBlZ0hlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpICsgMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFNpemUobWF4SnBlZ1dpZHRoLCBtYXhKcGVnSGVpZ2h0KTsKK30KKworc3NpemVfdCBDYW1lcmEzRGV2aWNlOjpnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCB7CisgICAgLy8gR2V0IG1heCBqcGVnIHNpemUgKGFyZWEtd2lzZSkuCisgICAgU2l6ZSBtYXhKcGVnUmVzb2x1dGlvbiA9IGdldE1heEpwZWdSZXNvbHV0aW9uKCk7CisgICAgaWYgKG1heEpwZWdSZXNvbHV0aW9uLndpZHRoID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgZmluZCB2YWxpZCBhdmFpbGFibGUganBlZyBzaXplcyBpbiBzdGF0aWMgbWV0YWRhdGEhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gR2V0IG1heCBqcGVnIGJ1ZmZlciBzaXplCisgICAgc3NpemVfdCBtYXhKcGVnQnVmZmVyU2l6ZSA9IDA7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGpwZWdCdWZNYXhTaXplID0gbURldmljZUluZm8uZmluZChBTkRST0lEX0pQRUdfTUFYX1NJWkUpOworICAgIGlmIChqcGVnQnVmTWF4U2l6ZS5jb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIG1heGltdW0gSlBFRyBzaXplIGluIHN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1heEpwZWdCdWZmZXJTaXplID0ganBlZ0J1Zk1heFNpemUuZGF0YS5pMzJbMF07CisKKyAgICAvLyBDYWxjdWxhdGUgZmluYWwganBlZyBidWZmZXIgc2l6ZSBmb3IgdGhlIGdpdmVuIHJlc29sdXRpb24uCisgICAgZmxvYXQgc2NhbGVGYWN0b3IgPSAoKGZsb2F0KSAod2lkdGggKiBoZWlnaHQpKSAvCisgICAgICAgICAgICAobWF4SnBlZ1Jlc29sdXRpb24ud2lkdGggKiBtYXhKcGVnUmVzb2x1dGlvbi5oZWlnaHQpOworICAgIHNzaXplX3QganBlZ0J1ZmZlclNpemUgPSBzY2FsZUZhY3RvciAqIG1heEpwZWdCdWZmZXJTaXplOworICAgIC8vIEJvdW5kIHRoZSBidWZmZXIgc2l6ZSB0byBbTUlOX0pQRUdfQlVGRkVSX1NJWkUsIG1heEpwZWdCdWZmZXJTaXplXS4KKyAgICBpZiAoanBlZ0J1ZmZlclNpemUgPiBtYXhKcGVnQnVmZmVyU2l6ZSkgeworICAgICAgICBqcGVnQnVmZmVyU2l6ZSA9IG1heEpwZWdCdWZmZXJTaXplOworICAgIH0gZWxzZSBpZiAoanBlZ0J1ZmZlclNpemUgPCBrTWluSnBlZ0J1ZmZlclNpemUpIHsKKyAgICAgICAganBlZ0J1ZmZlclNpemUgPSBrTWluSnBlZ0J1ZmZlclNpemU7CisgICAgfQorCisgICAgcmV0dXJuIGpwZWdCdWZmZXJTaXplOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgKHZvaWQpYXJnczsKQEAgLTM0NSw3ICs0MjUsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUluRmxpZ2h0TWFwLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgciA9IG1JbkZsaWdodE1hcC52YWx1ZUF0KGkpOwotICAgICAgICAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBGcmFtZSAlZCB8ICBUaW1lc3RhbXA6ICVsbGQsIG1ldGFkYXRhIgorICAgICAgICAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBGcmFtZSAlZCB8ICBUaW1lc3RhbXA6ICUiIFBSSWQ2NCAiLCBtZXRhZGF0YSIKICAgICAgICAgICAgICAgICAgICAgIiBhcnJpdmVkOiAlcywgYnVmZmVycyBsZWZ0OiAlZFxuIiwgbUluRmxpZ2h0TWFwLmtleUF0KGkpLAogICAgICAgICAgICAgICAgICAgICByLmNhcHR1cmVUaW1lc3RhbXAsIHIuaGF2ZVJlc3VsdE1ldGFkYXRhID8gInRydWUiIDogImZhbHNlIiwKICAgICAgICAgICAgICAgICAgICAgci5udW1CdWZmZXJzTGVmdCk7CkBAIC0zODQsMTQgKzQ2NCw3IEBACiAgICAgcmV0dXJuIG1EZXZpY2VJbmZvOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0KLSAgICAvLyBUT0RPOiB0YWtlIG93bmVyc2hpcCBvZiB0aGUgcmVxdWVzdAotCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjaGVja1N0YXR1c09rVG9DYXB0dXJlTG9ja2VkKCkgewogICAgIHN3aXRjaCAobVN0YXR1cykgewogICAgICAgICBjYXNlIFNUQVRVU19FUlJPUjoKICAgICAgICAgICAgIENMT0dFKCJEZXZpY2UgaGFzIGVuY291bnRlcmVkIGEgc2VyaW91cyBlcnJvciIpOwpAQCAtNDAwLDcgKzQ3Myw2IEBACiAgICAgICAgICAgICBDTE9HRSgiRGV2aWNlIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICBjYXNlIFNUQVRVU19VTkNPTkZJR1VSRUQ6Ci0gICAgICAgICAgICAvLyBNYXkgYmUgbGF6aWx5IGNvbmZpZ3VyaW5nIHN0cmVhbXMsIHdpbGwgY2hlY2sgZHVyaW5nIHNldHVwCiAgICAgICAgIGNhc2UgU1RBVFVTX0NPTkZJR1VSRUQ6CiAgICAgICAgIGNhc2UgU1RBVFVTX0FDVElWRToKICAgICAgICAgICAgIC8vIE9LCkBAIC00MDksNzEgKzQ4MSwxMTkgQEAKICAgICAgICAgICAgIFNFVF9FUlJfTCgiVW5leHBlY3RlZCBzdGF0dXM6ICVkIiwgbVN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQorICAgIHJldHVybiBPSzsKK30KIAotICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBuZXdSZXF1ZXN0ID0gc2V0VXBSZXF1ZXN0TG9ja2VkKHJlcXVlc3QpOwotICAgIGlmIChuZXdSZXF1ZXN0ID09IE5VTEwpIHsKLSAgICAgICAgQ0xPR0UoIkNhbid0IGNyZWF0ZSBjYXB0dXJlIHJlcXVlc3QiKTsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNvbnZlcnRNZXRhZGF0YUxpc3RUb1JlcXVlc3RMaXN0TG9ja2VkKAorICAgICAgICBjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmbWV0YWRhdGFMaXN0LCBSZXF1ZXN0TGlzdCAqcmVxdWVzdExpc3QpIHsKKyAgICBpZiAocmVxdWVzdExpc3QgPT0gTlVMTCkgeworICAgICAgICBDTE9HRSgicmVxdWVzdExpc3QgY2Fubm90IGJlIE5VTEwuIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnF1ZXVlUmVxdWVzdChuZXdSZXF1ZXN0KTsKLSAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygvKmFjdGl2ZSovIHRydWUsIGtBY3RpdmVUaW1lb3V0KTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCB0cmFuc2l0aW9uIHRvIGFjdGl2ZSBpbiAlZiBzZWNvbmRzISIsCi0gICAgICAgICAgICAgICAgICAgIGtBY3RpdmVUaW1lb3V0LzFlOSk7CisgICAgaW50MzJfdCBidXJzdElkID0gMDsKKyAgICBmb3IgKExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1ldGFkYXRhTGlzdC5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gbWV0YWRhdGFMaXN0LmVuZCgpOyArK2l0KSB7CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBuZXdSZXF1ZXN0ID0gc2V0VXBSZXF1ZXN0TG9ja2VkKCppdCk7CisgICAgICAgIGlmIChuZXdSZXF1ZXN0ID09IDApIHsKKyAgICAgICAgICAgIENMT0dFKCJDYW4ndCBjcmVhdGUgY2FwdHVyZSByZXF1ZXN0Iik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJDYW1lcmEgJWQ6IENhcHR1cmUgcmVxdWVzdCBlbnF1ZXVlZCIsIG1JZCk7CisKKyAgICAgICAgLy8gU2V0dXAgYnVyc3QgSWQgYW5kIHJlcXVlc3QgSWQKKyAgICAgICAgbmV3UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5idXJzdElkID0gYnVyc3RJZCsrOworICAgICAgICBpZiAoaXQtPmV4aXN0cyhBTkRST0lEX1JFUVVFU1RfSUQpKSB7CisgICAgICAgICAgICBpZiAoaXQtPmZpbmQoQU5EUk9JRF9SRVFVRVNUX0lEKS5jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ0xPR0UoIlJlcXVlc3RJRCBlbnRyeSBleGlzdHM7IGJ1dCBtdXN0IG5vdCBiZSBlbXB0eSBpbiBtZXRhZGF0YSIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCA9IGl0LT5maW5kKEFORFJPSURfUkVRVUVTVF9JRCkuZGF0YS5pMzJbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDTE9HRSgiUmVxdWVzdElEIGRvZXMgbm90IGV4aXN0IGluIG1ldGFkYXRhIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgcmVxdWVzdExpc3QtPnB1c2hfYmFjayhuZXdSZXF1ZXN0KTsKKworICAgICAgICBBTE9HVigiJXM6IHJlcXVlc3RJZCA9ICUiIFBSSWQzMiwgX19GVU5DVElPTl9fLCBuZXdSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCk7CiAgICAgfQotICAgIHJldHVybiByZXM7CisgICAgcmV0dXJuIE9LOwogfQogCi0KLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIHN0YXR1c190IHJlczsKKworICAgIExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+IHJlcXVlc3RzOworICAgIHJlcXVlc3RzLnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICByZXR1cm4gY2FwdHVyZUxpc3QocmVxdWVzdHMsIC8qbGFzdEZyYW1lTnVtYmVyKi9OVUxMKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c3VibWl0UmVxdWVzdHNIZWxwZXIoCisgICAgICAgIGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywgYm9vbCByZXBlYXRpbmcsCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHN3aXRjaCAobVN0YXR1cykgewotICAgICAgICBjYXNlIFNUQVRVU19FUlJPUjoKLSAgICAgICAgICAgIENMT0dFKCJEZXZpY2UgaGFzIGVuY291bnRlcmVkIGEgc2VyaW91cyBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBjYXNlIFNUQVRVU19VTklOSVRJQUxJWkVEOgotICAgICAgICAgICAgQ0xPR0UoIkRldmljZSBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgY2FzZSBTVEFUVVNfVU5DT05GSUdVUkVEOgotICAgICAgICAgICAgLy8gTWF5IGJlIGxhemlseSBjb25maWd1cmluZyBzdHJlYW1zLCB3aWxsIGNoZWNrIGR1cmluZyBzZXR1cAotICAgICAgICBjYXNlIFNUQVRVU19DT05GSUdVUkVEOgotICAgICAgICBjYXNlIFNUQVRVU19BQ1RJVkU6Ci0gICAgICAgICAgICAvLyBPSwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBTRVRfRVJSX0woIlVuZXhwZWN0ZWQgc3RhdHVzOiAlZCIsIG1TdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IGNoZWNrU3RhdHVzT2tUb0NhcHR1cmVMb2NrZWQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIC8vIGVycm9yIGxvZ2dlZCBieSBwcmV2aW91cyBjYWxsCisgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IG5ld1JlcGVhdGluZ1JlcXVlc3QgPSBzZXRVcFJlcXVlc3RMb2NrZWQocmVxdWVzdCk7Ci0gICAgaWYgKG5ld1JlcGVhdGluZ1JlcXVlc3QgPT0gTlVMTCkgewotICAgICAgICBDTE9HRSgiQ2FuJ3QgY3JlYXRlIHJlcGVhdGluZyByZXF1ZXN0Iik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgUmVxdWVzdExpc3QgcmVxdWVzdExpc3Q7CisKKyAgICByZXMgPSBjb252ZXJ0TWV0YWRhdGFMaXN0VG9SZXF1ZXN0TGlzdExvY2tlZChyZXF1ZXN0cywgLypvdXQqLyZyZXF1ZXN0TGlzdCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAvLyBlcnJvciBsb2dnZWQgYnkgcHJldmlvdXMgY2FsbAorICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIFJlcXVlc3RMaXN0IG5ld1JlcGVhdGluZ1JlcXVlc3RzOwotICAgIG5ld1JlcGVhdGluZ1JlcXVlc3RzLnB1c2hfYmFjayhuZXdSZXBlYXRpbmdSZXF1ZXN0KTsKKyAgICBpZiAocmVwZWF0aW5nKSB7CisgICAgICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5zZXRSZXBlYXRpbmdSZXF1ZXN0cyhyZXF1ZXN0TGlzdCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+cXVldWVSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CiAKLSAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+c2V0UmVwZWF0aW5nUmVxdWVzdHMobmV3UmVwZWF0aW5nUmVxdWVzdHMpOwogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgd2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrKC8qYWN0aXZlKi8gdHJ1ZSwga0FjdGl2ZVRpbWVvdXQpOworICAgICAgICB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soLyphY3RpdmUqL3RydWUsIGtBY3RpdmVUaW1lb3V0KTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCB0cmFuc2l0aW9uIHRvIGFjdGl2ZSBpbiAlZiBzZWNvbmRzISIsCiAgICAgICAgICAgICAgICAgICAgIGtBY3RpdmVUaW1lb3V0LzFlOSk7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIkNhbWVyYSAlZDogUmVwZWF0aW5nIHJlcXVlc3Qgc2V0IiwgbUlkKTsKKyAgICAgICAgQUxPR1YoIkNhbWVyYSAlZDogQ2FwdHVyZSByZXF1ZXN0ICUiIFBSSWQzMiAiIGVucXVldWVkIiwgbUlkLAorICAgICAgICAgICAgICAoKihyZXF1ZXN0TGlzdC5iZWdpbigpKSktPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBDTE9HRSgiQ2Fubm90IHF1ZXVlIHJlcXVlc3QuIEltcG9zc2libGUuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorCiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0c0hlbHBlcihyZXF1ZXN0cywgLypyZXBlYXRpbmcqL2ZhbHNlLCBsYXN0RnJhbWVOdW1iZXIpOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+IHJlcXVlc3RzOworICAgIHJlcXVlc3RzLnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICByZXR1cm4gc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QocmVxdWVzdHMsIC8qbGFzdEZyYW1lTnVtYmVyKi9OVUxMKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0c0hlbHBlcihyZXF1ZXN0cywgLypyZXBlYXRpbmcqL3RydWUsIGxhc3RGcmFtZU51bWJlcik7Cit9CiAKIHNwPENhbWVyYTNEZXZpY2U6OkNhcHR1cmVSZXF1ZXN0PiBDYW1lcmEzRGV2aWNlOjpzZXRVcFJlcXVlc3RMb2NrZWQoCiAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSB7CkBAIC00ODEsMTAgKzYwMSwxOCBAQAogCiAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX1VOQ09ORklHVVJFRCB8fCBtTmVlZENvbmZpZykgewogICAgICAgICByZXMgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKCk7CisgICAgICAgIC8vIFN0cmVhbSBjb25maWd1cmF0aW9uIGZhaWxlZCBkdWUgdG8gdW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbi4KKyAgICAgICAgLy8gRGV2aWNlIGJhY2sgdG8gdW5jb25maWd1cmVkIHN0YXRlLiBDbGllbnQgbWlnaHQgdHJ5IG90aGVyIGNvbmZpZ3VyYWl0b25zCisgICAgICAgIGlmIChyZXMgPT0gQkFEX1ZBTFVFICYmIG1TdGF0dXMgPT0gU1RBVFVTX1VOQ09ORklHVVJFRCkgeworICAgICAgICAgICAgQ0xPR0UoIk5vIHN0cmVhbXMgY29uZmlndXJlZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLy8gU3RyZWFtIGNvbmZpZ3VyYXRpb24gZmFpbGVkIGZvciBvdGhlciByZWFzb24uIEZhdGFsLgogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBTRVRfRVJSX0woIkNhbid0IHNldCB1cCBzdHJlYW1zOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQorICAgICAgICAvLyBTdHJlYW0gY29uZmlndXJhdGlvbiBzdWNjZXNzZnVsbHkgY29uZmlndXJlIHRvIGVtcHR5IHN0cmVhbSBjb25maWd1cmF0aW9uLgogICAgICAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfVU5DT05GSUdVUkVEKSB7CiAgICAgICAgICAgICBDTE9HRSgiTm8gc3RyZWFtcyBjb25maWd1cmVkIik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQ5NSw3ICs2MjMsNyBAQAogICAgIHJldHVybiBuZXdSZXF1ZXN0OwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjbGVhclN0cmVhbWluZ1JlcXVlc3QoKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTUxNyw3ICs2NDUsOCBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBBTE9HVigiQ2FtZXJhICVkOiBDbGVhcmluZyByZXBlYXRpbmcgcmVxdWVzdCIsIG1JZCk7Ci0gICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5jbGVhclJlcGVhdGluZ1JlcXVlc3RzKCk7CisKKyAgICByZXR1cm4gbVJlcXVlc3RUaHJlYWQtPmNsZWFyUmVwZWF0aW5nUmVxdWVzdHMobGFzdEZyYW1lTnVtYmVyKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6d2FpdFVudGlsUmVxdWVzdFJlY2VpdmVkKGludDMyX3QgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVvdXQpIHsKQEAgLTY1Miw2ICs3ODEsOCBAQAogICAgIH0KICAgICBtSW5wdXRTdHJlYW0gPSBuZXdTdHJlYW07CiAKKyAgICBtTmVlZENvbmZpZyA9IHRydWU7CisKICAgICAqaWQgPSBtTmV4dFN0cmVhbUlkKys7CiAgICAgKnpzbFN0cmVhbSA9IG5ld1N0cmVhbTsKIApAQCAtNjcyLDEyICs4MDMsMTIgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlU3RyZWFtKHNwPEFOYXRpdmVXaW5kb3c+IGNvbnN1bWVyLAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBzaXplX3Qgc2l6ZSwgaW50ICppZCkgeworICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgKmlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLSAgICBBTE9HVigiQ2FtZXJhICVkOiBDcmVhdGluZyBuZXcgc3RyZWFtICVkOiAlZCB4ICVkLCBmb3JtYXQgJWQsIHNpemUgJWQiLAotICAgICAgICAgICAgbUlkLCBtTmV4dFN0cmVhbUlkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHNpemUpOworICAgIEFMT0dWKCJDYW1lcmEgJWQ6IENyZWF0aW5nIG5ldyBzdHJlYW0gJWQ6ICVkIHggJWQsIGZvcm1hdCAlZCIsCisgICAgICAgICAgICBtSWQsIG1OZXh0U3RyZWFtSWQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CiAKICAgICBzdGF0dXNfdCByZXM7CiAgICAgYm9vbCB3YXNBY3RpdmUgPSBmYWxzZTsKQEAgLTcxMCw4ICs4NDEsMTQgQEAKIAogICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW0+IG5ld1N0cmVhbTsKICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICBzc2l6ZV90IGpwZWdCdWZmZXJTaXplID0gZ2V0SnBlZ0J1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChqcGVnQnVmZmVyU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQganBlZyBidWZmZXIgc2l6ZSAlemQiLCBqcGVnQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXIsCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc2l6ZSwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBqcGVnQnVmZmVyU2l6ZSwgZm9ybWF0KTsKICAgICB9IGVsc2UgewogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lciwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOwpAQCAtODM2LDE2ICs5NzMsMjAgQEAKICAgICB9CiAKICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBkZWxldGVkU3RyZWFtOworICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShpZCk7CiAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBOVUxMICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgewogICAgICAgICBkZWxldGVkU3RyZWFtID0gbUlucHV0U3RyZWFtOwogICAgICAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKICAgICB9IGVsc2UgewotICAgICAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOwotICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBpZCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpZHgpOworICAgIH0KKworICAgIC8vIERlbGV0ZSBvdXRwdXQgc3RyZWFtIG9yIHRoZSBvdXRwdXQgcGFydCBvZiBhIGJpLWRpcmVjdGlvbmFsIHN0cmVhbS4KKyAgICBpZiAob3V0cHV0U3RyZWFtSWR4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwogICAgICAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmVJdGVtKGlkKTsKICAgICB9CiAKQEAgLTg2OSw2ICsxMDEwLDE1IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgcmV0dXJuIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoKTsKK30KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KSB7CkBAIC04OTQsNiArMTA0NCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIGlmICghbVJlcXVlc3RUZW1wbGF0ZUNhY2hlW3RlbXBsYXRlSWRdLmlzRW1wdHkoKSkgeworICAgICAgICAqcmVxdWVzdCA9IG1SZXF1ZXN0VGVtcGxhdGVDYWNoZVt0ZW1wbGF0ZUlkXTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdSZXF1ZXN0OwogICAgIEFUUkFDRV9CRUdJTigiY2FtZXJhMy0+Y29uc3RydWN0X2RlZmF1bHRfcmVxdWVzdF9zZXR0aW5ncyIpOwogICAgIHJhd1JlcXVlc3QgPSBtSGFsM0RldmljZS0+b3BzLT5jb25zdHJ1Y3RfZGVmYXVsdF9yZXF1ZXN0X3NldHRpbmdzKApAQCAtOTA1LDYgKzEwNjAsNyBAQAogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQogICAgICpyZXF1ZXN0ID0gcmF3UmVxdWVzdDsKKyAgICBtUmVxdWVzdFRlbXBsYXRlQ2FjaGVbdGVtcGxhdGVJZF0gPSByYXdSZXF1ZXN0OwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtOTE0LDYgKzEwNzAsMTAgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAorICAgIHJldHVybiB3YWl0VW50aWxEcmFpbmVkTG9ja2VkKCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OndhaXRVbnRpbERyYWluZWRMb2NrZWQoKSB7CiAgICAgc3dpdGNoIChtU3RhdHVzKSB7CiAgICAgICAgIGNhc2UgU1RBVFVTX1VOSU5JVElBTElaRUQ6CiAgICAgICAgIGNhc2UgU1RBVFVTX1VOQ09ORklHVVJFRDoKQEAgLTkzMiw2ICsxMDkyLDEwIEBACiAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogV2FpdGluZyB1bnRpbCBpZGxlIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgIHN0YXR1c190IHJlcyA9IHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygvKmFjdGl2ZSovIGZhbHNlLCBrU2h1dGRvd25UaW1lb3V0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlJfTCgiRXJyb3Igd2FpdGluZyBmb3IgSEFMIHRvIGRyYWluOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksCisgICAgICAgICAgICAgICAgcmVzKTsKKyAgICB9CiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtMTAwMSw2ICsxMTY1LDcgQEAKICAgICAgICAgQUxPR1coIiVzOiBSZXBsYWNpbmcgb2xkIGNhbGxiYWNrIGxpc3RlbmVyIiwgX19GVU5DVElPTl9fKTsKICAgICB9CiAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgbVJlcXVlc3RUaHJlYWQtPnNldE5vdGlmeUNhbGxiYWNrKGxpc3RlbmVyKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTEwMTgsNyArMTE4Myw3IEBACiAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IE5vIGZyYW1lIGluICVsbGQgbnM6ICVzICglZCkiLAorICAgICAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IE5vIGZyYW1lIGluICUiIFBSSWQ2NCAiIG5zOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHRpbWVvdXQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQpAQCAtMTAyNiw3ICsxMTkxLDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmdldE5leHRGcmFtZShDYW1lcmFNZXRhZGF0YSAqZnJhbWUpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmdldE5leHRSZXN1bHQoQ2FwdHVyZVJlc3VsdCAqZnJhbWUpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKIApAQCAtMTAzNCw4ICsxMTk5LDE0IEBACiAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiAgICAgfQogCi0gICAgQ2FtZXJhTWV0YWRhdGEgJnJlc3VsdCA9ICoobVJlc3VsdFF1ZXVlLmJlZ2luKCkpOwotICAgIGZyYW1lLT5hY3F1aXJlKHJlc3VsdCk7CisgICAgaWYgKGZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBhcmd1bWVudCBjYW5ub3QgYmUgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0ID0gKihtUmVzdWx0UXVldWUuYmVnaW4oKSk7CisgICAgZnJhbWUtPm1SZXN1bHRFeHRyYXMgPSByZXN1bHQubVJlc3VsdEV4dHJhczsKKyAgICBmcmFtZS0+bU1ldGFkYXRhLmFjcXVpcmUocmVzdWx0Lm1NZXRhZGF0YSk7CiAgICAgbVJlc3VsdFF1ZXVlLmVyYXNlKG1SZXN1bHRRdWV1ZS5iZWdpbigpKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTEwNTUsNyArMTIyNiw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaWQpCi0gICAgICAgIH0sCisgICAgICAgIH0KICAgICB9OwogCiAgICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5xdWV1ZVRyaWdnZXIodHJpZ2dlciwKQEAgLTEwNzYsNyArMTI0Nyw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaWQpCi0gICAgICAgIH0sCisgICAgICAgIH0KICAgICB9OwogCiAgICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5xdWV1ZVRyaWdnZXIodHJpZ2dlciwKQEAgLTEwOTcsNyArMTI2OCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lELAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaWQpCi0gICAgICAgIH0sCisgICAgICAgIH0KICAgICB9OwogCiAgICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5xdWV1ZVRyaWdnZXIodHJpZ2dlciwKQEAgLTExMTMsMTQgKzEyODQsMzcgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmZsdXNoKCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Zmx1c2goaW50NjRfdCAqZnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBGbHVzaGluZyBhbGwgcmVxdWVzdHMiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBtUmVxdWVzdFRocmVhZC0+Y2xlYXIoKTsKLSAgICByZXR1cm4gbUhhbDNEZXZpY2UtPm9wcy0+Zmx1c2gobUhhbDNEZXZpY2UpOworICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyKiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIG1SZXF1ZXN0VGhyZWFkLT5jbGVhcihsaXN0ZW5lciwgLypvdXQqL2ZyYW1lTnVtYmVyKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKG1IYWwzRGV2aWNlLT5jb21tb24udmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMSkgeworICAgICAgICByZXMgPSBtSGFsM0RldmljZS0+b3BzLT5mbHVzaChtSGFsM0RldmljZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICByZXMgPSB3YWl0VW50aWxEcmFpbmVkTG9ja2VkKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwordWludDMyX3QgQ2FtZXJhM0RldmljZTo6Z2V0RGV2aWNlVmVyc2lvbigpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisgICAgcmV0dXJuIG1EZXZpY2VWZXJzaW9uOwogfQogCiAvKioKQEAgLTEyNDQsNiArMTQzOCwxNSBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgLy8gV29ya2Fyb3VuZCBmb3IgZGV2aWNlIEhBTHYzLjIgb3Igb2xkZXIgc3BlYyBidWcgLSB6ZXJvIHN0cmVhbXMgcmVxdWlyZXMKKyAgICAvLyBhZGRpbmcgYSBkdW1teSBzdHJlYW0gaW5zdGVhZC4KKyAgICAvLyBUT0RPOiBCdWc6IDE3MzIxNDA0IGZvciBmaXhpbmcgdGhlIEhBTCBzcGVjIGFuZCByZW1vdmluZyB0aGlzIHdvcmthcm91bmQuCisgICAgaWYgKG1PdXRwdXRTdHJlYW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgIGFkZER1bW15U3RyZWFtTG9ja2VkKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJ5UmVtb3ZlRHVtbXlTdHJlYW1Mb2NrZWQoKTsKKyAgICB9CisKICAgICAvLyBTdGFydCBjb25maWd1cmluZyB0aGUgc3RyZWFtcwogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdGFydGluZyBzdHJlYW0gY29uZmlndXJhdGlvbiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKIApAQCAtMTI5MSw3ICsxNDk0LDQyIEBACiAgICAgcmVzID0gbUhhbDNEZXZpY2UtPm9wcy0+Y29uZmlndXJlX3N0cmVhbXMobUhhbDNEZXZpY2UsICZjb25maWcpOwogICAgIEFUUkFDRV9FTkQoKTsKIAotICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICBpZiAocmVzID09IEJBRF9WQUxVRSkgeworICAgICAgICAvLyBIQUwgcmVqZWN0ZWQgdGhpcyBzZXQgb2Ygc3RyZWFtcyBhcyB1bnN1cHBvcnRlZCwgY2xlYW4gdXAgY29uZmlnCisgICAgICAgIC8vIGF0dGVtcHQgYW5kIHJldHVybiB0byB1bmNvbmZpZ3VyZWQgc3RhdGUKKyAgICAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBOVUxMICYmIG1JbnB1dFN0cmVhbS0+aXNDb25maWd1cmluZygpKSB7CisgICAgICAgICAgICByZXMgPSBtSW5wdXRTdHJlYW0tPmNhbmNlbENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkNhbid0IGNhbmNlbCBjb25maWd1cmluZyBpbnB1dCBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0U3RyZWFtLT5nZXRJZCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0NvbmZpZ3VyaW5nKCkpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmNhbmNlbENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBjYW5jZWwgY29uZmlndXJpbmcgb3V0cHV0IHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0tPmdldElkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiBzdGF0ZSB0byB0aGF0IGF0IHN0YXJ0IG9mIGNhbGwsIHNvIHRoYXQgZnV0dXJlIGNvbmZpZ3VyZXMKKyAgICAgICAgLy8gcHJvcGVybHkgY2xlYW4gdGhpbmdzIHVwCisgICAgICAgIG1TdGF0dXMgPSBTVEFUVVNfVU5DT05GSUdVUkVEOworICAgICAgICBtTmVlZENvbmZpZyA9IHRydWU7CisKKyAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN0cmVhbSBjb25maWd1cmF0aW9uIGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAvLyBTb21lIG90aGVyIGtpbmQgb2YgZXJyb3IgZnJvbSBjb25maWd1cmVfc3RyZWFtcyAtIHRoaXMgaXMgbm90CisgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIFNFVF9FUlJfTCgiVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW1zIHdpdGggSEFMOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTEzMzEsNyArMTU2OSw3IEBACiAKICAgICBtTmVlZENvbmZpZyA9IGZhbHNlOwogCi0gICAgaWYgKGNvbmZpZy5udW1fc3RyZWFtcyA+IDApIHsKKyAgICBpZiAobUR1bW15U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIG1TdGF0dXMgPSBTVEFUVVNfQ09ORklHVVJFRDsKICAgICB9IGVsc2UgewogICAgICAgICBtU3RhdHVzID0gU1RBVFVTX1VOQ09ORklHVVJFRDsKQEAgLTEzMzksOSArMTU3Nyw3NSBAQAogCiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN0cmVhbSBjb25maWd1cmF0aW9uIGNvbXBsZXRlIiwgX19GVU5DVElPTl9fLCBtSWQpOwogCisgICAgLy8gdGVhciBkb3duIHRoZSBkZWxldGVkIHN0cmVhbXMgYWZ0ZXIgY29uZmlndXJlIHN0cmVhbXMuCisgICAgbURlbGV0ZWRTdHJlYW1zLmNsZWFyKCk7CisKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmFkZER1bW15U3RyZWFtTG9ja2VkKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgaWYgKG1EdW1teVN0cmVhbUlkICE9IE5PX1NUUkVBTSkgeworICAgICAgICAvLyBTaG91bGQgbmV2ZXIgYmUgYWRkaW5nIGEgc2Vjb25kIGR1bW15IHN0cmVhbSB3aGVuIG9uZSBpcyBhbHJlYWR5CisgICAgICAgIC8vIGFjdGl2ZQorICAgICAgICBTRVRfRVJSX0woIiVzOiBDYW1lcmEgJWQ6IEEgZHVtbXkgc3RyZWFtIGFscmVhZHkgZXhpc3RzISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFkZGluZyBhIGR1bW15IHN0cmVhbSIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IGR1bW15U3RyZWFtID0KKyAgICAgICAgICAgIG5ldyBDYW1lcmEzRHVtbXlTdHJlYW0obU5leHRTdHJlYW1JZCk7CisKKyAgICByZXMgPSBtT3V0cHV0U3RyZWFtcy5hZGQobU5leHRTdHJlYW1JZCwgZHVtbXlTdHJlYW0pOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIFNFVF9FUlJfTCgiQ2FuJ3QgYWRkIGR1bW15IHN0cmVhbSB0byBzZXQ6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtRHVtbXlTdHJlYW1JZCA9IG1OZXh0U3RyZWFtSWQ7CisgICAgbU5leHRTdHJlYW1JZCsrOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjp0cnlSZW1vdmVEdW1teVN0cmVhbUxvY2tlZCgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHN0YXR1c190IHJlczsKKworICAgIGlmIChtRHVtbXlTdHJlYW1JZCA9PSBOT19TVFJFQU0pIHJldHVybiBPSzsKKyAgICBpZiAobU91dHB1dFN0cmVhbXMuc2l6ZSgpID09IDEpIHJldHVybiBPSzsKKworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBSZW1vdmluZyB0aGUgZHVtbXkgc3RyZWFtIiwgX19GVU5DVElPTl9fLCBtSWQpOworCisgICAgLy8gT2ssIGhhdmUgYSBkdW1teSBzdHJlYW0gYW5kIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIG90aGVyIG91dHB1dCBzdHJlYW0sCisgICAgLy8gc28gcmVtb3ZlIHRoZSBkdW1teQorCisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbTsKKyAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkobUR1bW15U3RyZWFtSWQpOworICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgU0VUX0VSUl9MKCJEdW1teSBzdHJlYW0gJWQgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IiwgbUR1bW15U3RyZWFtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7CisgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlSXRlbXNBdChvdXRwdXRTdHJlYW1JZHgpOworCisgICAgLy8gRnJlZSB1cCB0aGUgc3RyZWFtIGVuZHBvaW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgc29tZSBvdGhlciBzdHJlYW0KKyAgICByZXMgPSBkZWxldGVkU3RyZWFtLT5kaXNjb25uZWN0KCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSX0woIkNhbid0IGRpc2Nvbm5lY3QgZGVsZXRlZCBkdW1teSBzdHJlYW0gJWQiLCBtRHVtbXlTdHJlYW1JZCk7CisgICAgICAgIC8vIGZhbGwgdGhyb3VnaCBzaW5jZSB3ZSB3YW50IHRvIHN0aWxsIGxpc3QgdGhlIHN0cmVhbSBhcyBkZWxldGVkLgorICAgIH0KKyAgICBtRGVsZXRlZFN0cmVhbXMuYWRkKGRlbGV0ZWRTdHJlYW0pOworICAgIG1EdW1teVN0cmVhbUlkID0gTk9fU1RSRUFNOworCisgICAgcmV0dXJuIHJlczsKK30KKwogdm9pZCBDYW1lcmEzRGV2aWNlOjpzZXRFcnJvclN0YXRlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHZhX2xpc3QgYXJnczsKQEAgLTEzNzQsNDAgKzE2NzgsNDUgQEAKICAgICAvLyBCdXQgb25seSBkbyBlcnJvciBzdGF0ZSB0cmFuc2l0aW9uIHN0ZXBzIGZvciB0aGUgZmlyc3QgZXJyb3IKICAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IgfHwgbVN0YXR1cyA9PSBTVEFUVVNfVU5JTklUSUFMSVpFRCkgcmV0dXJuOwogCi0gICAgLy8gU2F2ZSBzdGFjayB0cmFjZS4gVmlldyBieSBkdW1waW5nIGl0IGxhdGVyLgotICAgIENhbWVyYVRyYWNlczo6c2F2ZVRyYWNlKCk7Ci0gICAgLy8gVE9ETzogY29uc2lkZXIgYWRkaW5nIGVycm9yQ2F1c2UgYW5kIGNsaWVudCBwaWQvcHJvY25hbWUKLQogICAgIG1FcnJvckNhdXNlID0gZXJyb3JDYXVzZTsKIAogICAgIG1SZXF1ZXN0VGhyZWFkLT5zZXRQYXVzZWQodHJ1ZSk7CiAgICAgbVN0YXR1cyA9IFNUQVRVU19FUlJPUjsKKworICAgIC8vIE5vdGlmeSB1cHN0cmVhbSBhYm91dCBhIGRldmljZSBlcnJvcgorICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBtTGlzdGVuZXItPm5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0UsCisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcygpKTsKKyAgICB9CisKKyAgICAvLyBTYXZlIHN0YWNrIHRyYWNlLiBWaWV3IGJ5IGR1bXBpbmcgaXQgbGF0ZXIuCisgICAgQ2FtZXJhVHJhY2VzOjpzYXZlVHJhY2UoKTsKKyAgICAvLyBUT0RPOiBjb25zaWRlciBhZGRpbmcgZXJyb3JDYXVzZSBhbmQgY2xpZW50IHBpZC9wcm9jbmFtZQogfQogCiAvKioKICAqIEluLWZsaWdodCByZXF1ZXN0IG1hbmFnZW1lbnQKICAqLwogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpyZWdpc3RlckluRmxpZ2h0KGludDMyX3QgZnJhbWVOdW1iZXIsCi0gICAgICAgIGludDMyX3QgcmVxdWVzdElkLCBpbnQzMl90IG51bUJ1ZmZlcnMpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOwogCiAgICAgc3NpemVfdCByZXM7Ci0gICAgcmVzID0gbUluRmxpZ2h0TWFwLmFkZChmcmFtZU51bWJlciwgSW5GbGlnaHRSZXF1ZXN0KHJlcXVlc3RJZCwgbnVtQnVmZmVycykpOworICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChudW1CdWZmZXJzLCByZXN1bHRFeHRyYXMsIGhhc0lucHV0KSk7CiAgICAgaWYgKHJlcyA8IDApIHJldHVybiByZXM7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIC8qKgotICogUVVJUksocGFydGlhbCByZXN1bHRzKQogICogQ2hlY2sgaWYgYWxsIDNBIGZpZWxkcyBhcmUgcmVhZHksIGFuZCBzZW5kIG9mZiBhIHBhcnRpYWwgM0Etb25seSByZXN1bHQKICAqIHRvIHRoZSBvdXRwdXQgZnJhbWUgcXVldWUKICAqLwotYm9vbCBDYW1lcmEzRGV2aWNlOjpwcm9jZXNzUGFydGlhbDNBUXVpcmsoCi0gICAgICAgIGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgcGFydGlhbCkgeworYm9vbCBDYW1lcmEzRGV2aWNlOjpwcm9jZXNzUGFydGlhbDNBUmVzdWx0KAorICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHBhcnRpYWwsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgewogCiAgICAgLy8gQ2hlY2sgaWYgYWxsIDNBIHN0YXRlcyBhcmUgcHJlc2VudAogICAgIC8vIFRoZSBmdWxsIGxpc3Qgb2YgZmllbGRzIGlzCkBAIC0xNDI3LDggKzE3MzYsNiBAQAogICAgIHVpbnQ4X3QgYWVTdGF0ZTsKICAgICB1aW50OF90IGFmU3RhdGU7CiAgICAgdWludDhfdCBhd2JTdGF0ZTsKLSAgICBpbnQzMl90IGFmVHJpZ2dlcklkOwotICAgIGludDMyX3QgYWVUcmlnZ2VySWQ7CiAKICAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M0FSZXN1bHQocGFydGlhbCwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCiAgICAgICAgICZhZk1vZGUsIGZyYW1lTnVtYmVyKTsKQEAgLTE0NDUsODggKzE3NTIsOTIgQEAKICAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M0FSZXN1bHQocGFydGlhbCwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKICAgICAgICAgJmF3YlN0YXRlLCBmcmFtZU51bWJlcik7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M0FSZXN1bHQocGFydGlhbCwgQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQsCi0gICAgICAgICZhZlRyaWdnZXJJZCwgZnJhbWVOdW1iZXIpOwotCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNBUmVzdWx0KHBhcnRpYWwsIEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lELAotICAgICAgICAmYWVUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKTsKLQogICAgIGlmICghZ290QWxsU3RhdGVzKSByZXR1cm4gZmFsc2U7CiAKICAgICBBTE9HVlYoIiVzOiBDYW1lcmEgJWQ6IEZyYW1lICVkLCBSZXF1ZXN0IElEICVkOiBBRiBtb2RlICVkLCBBV0IgbW9kZSAlZCwgIgogICAgICAgICAiQUYgc3RhdGUgJWQsIEFFIHN0YXRlICVkLCBBV0Igc3RhdGUgJWQsICIKICAgICAgICAgIkFGIHRyaWdnZXIgJWQsIEFFIHByZWNhcHR1cmUgdHJpZ2dlciAlZCIsCi0gICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBmcmFtZU51bWJlciwgcmVxdWVzdElkLAorICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgZnJhbWVOdW1iZXIsIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsCiAgICAgICAgIGFmTW9kZSwgYXdiTW9kZSwKICAgICAgICAgYWZTdGF0ZSwgYWVTdGF0ZSwgYXdiU3RhdGUsCi0gICAgICAgIGFmVHJpZ2dlcklkLCBhZVRyaWdnZXJJZCk7CisgICAgICAgIHJlc3VsdEV4dHJhcy5hZlRyaWdnZXJJZCwgcmVzdWx0RXh0cmFzLnByZWNhcHR1cmVUcmlnZ2VySWQpOwogCiAgICAgLy8gR290IGFsbCBzdGF0ZXMsIHNvIGNvbnN0cnVjdCBhIG1pbmltYWwgcmVzdWx0IHRvIHNlbmQKICAgICAvLyBJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgZmllbGRzLCB0aGlzIG1lYW5zIGFkZGluZyBpbgogICAgIC8vICAgYW5kcm9pZC5yZXF1ZXN0LmZyYW1lQ291bnQKICAgICAvLyAgIGFuZHJvaWQucmVxdWVzdC5yZXF1ZXN0SWQKLSAgICAvLyAgIGFuZHJvaWQucXVpcmtzLnBhcnRpYWxSZXN1bHQKKyAgICAvLyAgIGFuZHJvaWQucXVpcmtzLnBhcnRpYWxSZXN1bHQgKGZvciBIQUwgdmVyc2lvbiBiZWxvdyBIQUwzLjIpCiAKICAgICBjb25zdCBzaXplX3Qga01pbmltYWwzQVJlc3VsdEVudHJpZXMgPSAxMDsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKIAotICAgIENhbWVyYU1ldGFkYXRhJiBtaW4zQVJlc3VsdCA9Ci0gICAgICAgICAgICAqbVJlc3VsdFF1ZXVlLmluc2VydCgKLSAgICAgICAgICAgICAgICBtUmVzdWx0UXVldWUuZW5kKCksCi0gICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEoa01pbmltYWwzQVJlc3VsdEVudHJpZXMsIC8qZGF0YUNhcGFjaXR5Ki8gMCkpOworICAgIENhcHR1cmVSZXN1bHQgY2FwdHVyZVJlc3VsdDsKKyAgICBjYXB0dXJlUmVzdWx0Lm1SZXN1bHRFeHRyYXMgPSByZXN1bHRFeHRyYXM7CisgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEgPSBDYW1lcmFNZXRhZGF0YShrTWluaW1hbDNBUmVzdWx0RW50cmllcywgLypkYXRhQ2FwYWNpdHkqLyAwKTsKKyAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyB0byBzcDxDYXB0dXJlUmVzdWx0Pi4gVGhpcyB3aWxsIG5lZWQgb3RoZXIgY2hhbmdlcywgaW5jbHVkaW5nLAorICAgIC8vIGJ1dCBub3QgbGltaXRlZCB0byBDYW1lcmFEZXZpY2VCYXNlOjpnZXROZXh0UmVzdWx0CisgICAgQ2FwdHVyZVJlc3VsdCYgbWluM0FSZXN1bHQgPQorICAgICAgICAgICAgKm1SZXN1bHRRdWV1ZS5pbnNlcnQobVJlc3VsdFF1ZXVlLmVuZCgpLCBjYXB0dXJlUmVzdWx0KTsKIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCwKLSAgICAgICAgICAgICZmcmFtZU51bWJlciwgZnJhbWVOdW1iZXIpKSB7CisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCwKKyAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgaXMgcHJvYmxlbWF0aWMgY2FzdGluZy4gTmVlZCB0byBmaXggQ2FtZXJhTWV0YWRhdGEuCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDMyX3QqPigmZnJhbWVOdW1iZXIpLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfUkVRVUVTVF9JRCwKKyAgICBpbnQzMl90IHJlcXVlc3RJZCA9IHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfUkVRVUVTVF9JRCwKICAgICAgICAgICAgICZyZXF1ZXN0SWQsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGFydGlhbFJlc3VsdCA9IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUw7Ci0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQsCi0gICAgICAgICAgICAmcGFydGlhbFJlc3VsdCwgZnJhbWVOdW1iZXIpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAobURldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBwYXJ0aWFsUmVzdWx0ID0gQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFRfUEFSVElBTDsKKyAgICAgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxULAorICAgICAgICAgICAgICAgICZwYXJ0aWFsUmVzdWx0LCBmcmFtZU51bWJlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAorICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKICAgICAgICAgICAgICZhZk1vZGUsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAorICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCiAgICAgICAgICAgICAmYXdiTW9kZSwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRV9TVEFURSwKICAgICAgICAgICAgICZhZVN0YXRlLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFLAogICAgICAgICAgICAgJmFmU3RhdGUsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKICAgICAgICAgICAgICZhd2JTdGF0ZSwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKLSAgICAgICAgICAgICZhZlRyaWdnZXJJZCwgZnJhbWVOdW1iZXIpKSB7CisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAorICAgICAgICAgICAgJnJlc3VsdEV4dHJhcy5hZlRyaWdnZXJJZCwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKLSAgICAgICAgICAgICZhZVRyaWdnZXJJZCwgZnJhbWVOdW1iZXIpKSB7CisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lELAorICAgICAgICAgICAgJnJlc3VsdEV4dHJhcy5wcmVjYXB0dXJlVHJpZ2dlcklkLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIC8vIFdlIG9ubHkgc2VuZCB0aGUgYWdncmVnYXRlZCBwYXJ0aWFsIHdoZW4gYWxsIDNBIHJlbGF0ZWQgbWV0YWRhdGEgYXJlIGF2YWlsYWJsZQorICAgIC8vIEZvciBib3RoIEFQSTEgYW5kIEFQSTIuCisgICAgLy8gVE9ETzogd2UgcHJvYmFibHkgc2hvdWxkIHBhc3MgdGhyb3VnaCBhbGwgcGFydGlhbHMgdG8gQVBJMiB1bmNvbmRpdGlvbmFsbHkuCiAgICAgbVJlc3VsdFNpZ25hbC5zaWduYWwoKTsKIAogICAgIHJldHVybiB0cnVlOwpAQCAtMTUzNCw3ICsxODQ1LDcgQEAKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIGJvb2wgQ2FtZXJhM0RldmljZTo6Z2V0M0FSZXN1bHQoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdCwgaW50MzJfdCB0YWcsCi0gICAgICAgIFQqIHZhbHVlLCBpbnQzMl90IGZyYW1lTnVtYmVyKSB7CisgICAgICAgIFQqIHZhbHVlLCB1aW50MzJfdCBmcmFtZU51bWJlcikgewogICAgICh2b2lkKSBmcmFtZU51bWJlcjsKIAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwpAQCAtMTU1OSw3ICsxODcwLDcgQEAKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIGJvb2wgQ2FtZXJhM0RldmljZTo6aW5zZXJ0M0FSZXN1bHQoQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdCwgaW50MzJfdCB0YWcsCi0gICAgICAgIGNvbnN0IFQqIHZhbHVlLCBpbnQzMl90IGZyYW1lTnVtYmVyKSB7CisgICAgICAgIGNvbnN0IFQqIHZhbHVlLCB1aW50MzJfdCBmcmFtZU51bWJlcikgewogICAgIGlmIChyZXN1bHQudXBkYXRlKHRhZywgdmFsdWUsIDEpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIG1SZXN1bHRRdWV1ZS5lcmFzZSgtLW1SZXN1bHRRdWV1ZS5lbmQoKSwgbVJlc3VsdFF1ZXVlLmVuZCgpKTsKICAgICAgICAgU0VUX0VSUigiRnJhbWUgJWQ6IEZhaWxlZCB0byBzZXQgJXMgaW4gcGFydGlhbCBtZXRhZGF0YSIsCkBAIC0xNTc5LDE4ICsxODkwLDM0IEBACiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIgPSByZXN1bHQtPmZyYW1lX251bWJlcjsKLSAgICBpZiAocmVzdWx0LT5yZXN1bHQgPT0gTlVMTCAmJiByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycyA9PSAwKSB7CisgICAgaWYgKHJlc3VsdC0+cmVzdWx0ID09IE5VTEwgJiYgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMgPT0gMCAmJgorICAgICAgICAgICAgcmVzdWx0LT5pbnB1dF9idWZmZXIgPT0gTlVMTCkgewogICAgICAgICBTRVRfRVJSKCJObyByZXN1bHQgZGF0YSBwcm92aWRlZCBieSBIQUwgZm9yIGZyYW1lICVkIiwKICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgYm9vbCBwYXJ0aWFsUmVzdWx0UXVpcmsgPSBmYWxzZTsKLSAgICBDYW1lcmFNZXRhZGF0YSBjb2xsZWN0ZWRRdWlya1Jlc3VsdDsKIAotICAgIC8vIEdldCBjYXB0dXJlIHRpbWVzdGFtcCBmcm9tIGxpc3Qgb2YgaW4tZmxpZ2h0IHJlcXVlc3RzLCB3aGVyZSBpdCB3YXMgYWRkZWQKLSAgICAvLyBieSB0aGUgc2h1dHRlciBub3RpZmljYXRpb24gZm9yIHRoaXMgZnJhbWUuIFRoZW4gdXBkYXRlIHRoZSBpbi1mbGlnaHQKLSAgICAvLyBzdGF0dXMgYW5kIHJlbW92ZSB0aGUgaW4tZmxpZ2h0IGVudHJ5IGlmIGFsbCByZXN1bHQgZGF0YSBoYXMgYmVlbgotICAgIC8vIHJlY2VpdmVkLgorICAgIC8vIEZvciBIQUwzLjIgb3IgYWJvdmUsIElmIEhBTCBkb2Vzbid0IHN1cHBvcnQgcGFydGlhbCwgaXQgbXVzdCBhbHdheXMgc2V0CisgICAgLy8gcGFydGlhbF9yZXN1bHQgdG8gMSB3aGVuIG1ldGFkYXRhIGlzIGluY2x1ZGVkIGluIHRoaXMgcmVzdWx0LgorICAgIGlmICghbVVzZVBhcnRpYWxSZXN1bHQgJiYKKyAgICAgICAgICAgIG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yICYmCisgICAgICAgICAgICByZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmCisgICAgICAgICAgICByZXN1bHQtPnBhcnRpYWxfcmVzdWx0ICE9IDEpIHsKKyAgICAgICAgU0VUX0VSUigiUmVzdWx0IGlzIG1hbGZvcm1lZCBmb3IgZnJhbWUgJWQ6IHBhcnRpYWxfcmVzdWx0ICV1IG11c3QgYmUgMSIKKyAgICAgICAgICAgICAgICAiIGlmIHBhcnRpYWwgcmVzdWx0IGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCByZXN1bHQtPnBhcnRpYWxfcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgaXNQYXJ0aWFsUmVzdWx0ID0gZmFsc2U7CisgICAgQ2FtZXJhTWV0YWRhdGEgY29sbGVjdGVkUGFydGlhbFJlc3VsdDsKKyAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKKyAgICBib29sIGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0ID0gZmFsc2U7CisKKyAgICAvLyBHZXQgY2FwdHVyZSB0aW1lc3RhbXAgYW5kIHJlc3VsdEV4dHJhcyBmcm9tIGxpc3Qgb2YgaW4tZmxpZ2h0IHJlcXVlc3RzLAorICAgIC8vIHdoZXJlIGl0IHdhcyBhZGRlZCBieSB0aGUgc2h1dHRlciBub3RpZmljYXRpb24gZm9yIHRoaXMgZnJhbWUuCisgICAgLy8gVGhlbiB1cGRhdGUgdGhlIGluLWZsaWdodCBzdGF0dXMgYW5kIHJlbW92ZSB0aGUgaW4tZmxpZ2h0IGVudHJ5IGlmCisgICAgLy8gYWxsIHJlc3VsdCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLgogICAgIG5zZWNzX3QgdGltZXN0YW1wID0gMDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOwpAQCAtMTYwMSw3MSArMTkyOCwxMDggQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnJlcXVlc3QgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKKyAgICAgICAgQUxPR1ZWKCIlczogZ290IEluRmxpZ2h0UmVxdWVzdCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKKyAgICAgICAgICAgICAgICAiLCBidXJzdElkID0gJSIgUFJJZDMyLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVxdWVzdC5yZXN1bHRFeHRyYXMucmVxdWVzdElkLCByZXF1ZXN0LnJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3VsdEV4dHJhcy5idXJzdElkKTsKKyAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSB0aGUgcGFydGlhbCBjb3VudCB0byB0aGUgbGF0ZXN0IG9uZS4gV2hlbiBmcmFtZXdvcmsgYWdncmVnYXRlcyBhZGphY2VudAorICAgICAgICAvLyBwYXJ0aWFsIHJlc3VsdHMgaW50byBvbmUsIHRoZSBsYXRlc3QgcGFydGlhbCBjb3VudCB3aWxsIGJlIHVzZWQuCisgICAgICAgIHJlcXVlc3QucmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA9IHJlc3VsdC0+cGFydGlhbF9yZXN1bHQ7CiAKICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyByZXN1bHQgY2FycmllcyBvbmx5IHBhcnRpYWwgbWV0YWRhdGEKLSAgICAgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0UXVpcmsgJiYgcmVzdWx0LT5yZXN1bHQgIT0gTlVMTCkgewotICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgcGFydGlhbFJlc3VsdEVudHJ5OwotICAgICAgICAgICAgcmVzID0gZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkocmVzdWx0LT5yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgIEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxULCAmcGFydGlhbFJlc3VsdEVudHJ5KTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gTkFNRV9OT1RfRk9VTkQgJiYKLSAgICAgICAgICAgICAgICAgICAgcGFydGlhbFJlc3VsdEVudHJ5LmNvdW50ID4gMCAmJgotICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsUmVzdWx0RW50cnkuZGF0YS51OFswXSA9PQotICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVF9QQVJUSUFMKSB7Ci0gICAgICAgICAgICAgICAgLy8gQSBwYXJ0aWFsIHJlc3VsdC4gRmxhZyB0aGlzIGFzIHN1Y2gsIGFuZCBjb2xsZWN0IHRoaXMKLSAgICAgICAgICAgICAgICAvLyBzZXQgb2YgbWV0YWRhdGEgaW50byB0aGUgaW4tZmxpZ2h0IGVudHJ5LgotICAgICAgICAgICAgICAgIHBhcnRpYWxSZXN1bHRRdWlyayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0UXVpcmsuY29sbGVjdGVkUmVzdWx0LmFwcGVuZCgKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5yZXN1bHQpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmNvbGxlY3RlZFJlc3VsdC5lcmFzZSgKLSAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOworICAgICAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHQgJiYgcmVzdWx0LT5yZXN1bHQgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC0+cGFydGlhbF9yZXN1bHQgPiBtTnVtUGFydGlhbFJlc3VsdHMgfHwgcmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiUmVzdWx0IGlzIG1hbGZvcm1lZCBmb3IgZnJhbWUgJWQ6IHBhcnRpYWxfcmVzdWx0ICV1IG11c3QgYmUgIGluIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGhlIHJhbmdlIG9mIFsxLCAlZF0gd2hlbiBtZXRhZGF0YSBpcyBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgcmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCwgbU51bVBhcnRpYWxSZXN1bHRzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpc1BhcnRpYWxSZXN1bHQgPSAocmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCA8IG1OdW1QYXJ0aWFsUmVzdWx0cyk7CisgICAgICAgICAgICAgICAgaWYgKGlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0LmFwcGVuZChyZXN1bHQtPnJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBwYXJ0aWFsUmVzdWx0RW50cnk7CisgICAgICAgICAgICAgICAgcmVzID0gZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkocmVzdWx0LT5yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCwgJnBhcnRpYWxSZXN1bHRFbnRyeSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBOQU1FX05PVF9GT1VORCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbFJlc3VsdEVudHJ5LmNvdW50ID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbFJlc3VsdEVudHJ5LmRhdGEudThbMF0gPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQSBwYXJ0aWFsIHJlc3VsdC4gRmxhZyB0aGlzIGFzIHN1Y2gsIGFuZCBjb2xsZWN0IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9mIG1ldGFkYXRhIGludG8gdGhlIGluLWZsaWdodCBlbnRyeS4KKyAgICAgICAgICAgICAgICAgICAgaXNQYXJ0aWFsUmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmNvbGxlY3RlZFJlc3VsdC5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQtPnJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdC5jb2xsZWN0ZWRSZXN1bHQuZXJhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNQYXJ0aWFsUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgLy8gRmlyZSBvZmYgYSAzQS1vbmx5IHJlc3VsdCBpZiBwb3NzaWJsZQotICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdC5wYXJ0aWFsUmVzdWx0UXVpcmsuaGF2ZVNlbnQzQSkgewotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHRRdWlyay5oYXZlU2VudDNBID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUGFydGlhbDNBUXVpcmsoZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmNvbGxlY3RlZFJlc3VsdCk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LnBhcnRpYWxSZXN1bHQuaGF2ZVNlbnQzQSkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHQuaGF2ZVNlbnQzQSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BhcnRpYWwzQVJlc3VsdChmcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdC5jb2xsZWN0ZWRSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3VsdEV4dHJhcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdGltZXN0YW1wID0gcmVxdWVzdC5jYXB0dXJlVGltZXN0YW1wOworICAgICAgICByZXN1bHRFeHRyYXMgPSByZXF1ZXN0LnJlc3VsdEV4dHJhczsKKyAgICAgICAgaGFzSW5wdXRCdWZmZXJJblJlcXVlc3QgPSByZXF1ZXN0Lmhhc0lucHV0QnVmZmVyOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBPbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGhhcHBlbiBiZWZvcmUgaXQncyBsZWdhbCB0byBjYWxsIHByb2Nlc3NfY2FwdHVyZV9yZXN1bHQsCiAgICAgICAgICAqIHVubGVzcyBwYXJ0aWFsIG1ldGFkYXRhIGlzIGJlaW5nIHByb3ZpZGVkOgogICAgICAgICAgKiAtIENBTUVSQTNfTVNHX1NIVVRURVIgKGV4cGVjdGVkIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uKQogICAgICAgICAgKiAtIENBTUVSQTNfTVNHX0VSUk9SIChleHBlY3RlZCBkdXJpbmcgZmx1c2gpCiAgICAgICAgICAqLwotICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0U3RhdHVzID09IE9LICYmIHRpbWVzdGFtcCA9PSAwICYmICFwYXJ0aWFsUmVzdWx0UXVpcmspIHsKKyAgICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdFN0YXR1cyA9PSBPSyAmJiB0aW1lc3RhbXAgPT0gMCAmJiAhaXNQYXJ0aWFsUmVzdWx0KSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJDYWxsZWQgYmVmb3JlIHNodXR0ZXIgbm90aWZ5IGZvciBmcmFtZSAlZCIsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIC8vIERpZCB3ZSBnZXQgdGhlIChmaW5hbCkgcmVzdWx0IG1ldGFkYXRhIGZvciB0aGlzIGNhcHR1cmU/Ci0gICAgICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFwYXJ0aWFsUmVzdWx0UXVpcmspIHsKKyAgICAgICAgaWYgKHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwgJiYgIWlzUGFydGlhbFJlc3VsdCkgewogICAgICAgICAgICAgaWYgKHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhKSB7CiAgICAgICAgICAgICAgICAgU0VUX0VSUigiQ2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGggbWV0YWRhdGEgZm9yIGZyYW1lICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHRRdWlyayAmJgotICAgICAgICAgICAgICAgICAgICAhcmVxdWVzdC5wYXJ0aWFsUmVzdWx0UXVpcmsuY29sbGVjdGVkUmVzdWx0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGNvbGxlY3RlZFF1aXJrUmVzdWx0LmFjcXVpcmUoCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmNvbGxlY3RlZFJlc3VsdCk7CisgICAgICAgICAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHQgJiYKKyAgICAgICAgICAgICAgICAgICAgIXJlcXVlc3QucGFydGlhbFJlc3VsdC5jb2xsZWN0ZWRSZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgY29sbGVjdGVkUGFydGlhbFJlc3VsdC5hY3F1aXJlKAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIHJlcXVlc3QubnVtQnVmZmVyc0xlZnQgLT0gcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnM7Ci0KKyAgICAgICAgdWludDMyX3QgbnVtQnVmZmVyc1JldHVybmVkID0gcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnM7CisgICAgICAgIGlmIChyZXN1bHQtPmlucHV0X2J1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoaGFzSW5wdXRCdWZmZXJJblJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICBudW1CdWZmZXJzUmV0dXJuZWQgKz0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBJbnB1dCBidWZmZXIgc2hvdWxkIGJlIE5VTEwgaWYgdGhlcmUgaXMgbm8gaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ1ZmZlciBzZW50IGluIHRoZSByZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5udW1CdWZmZXJzTGVmdCAtPSBudW1CdWZmZXJzUmV0dXJuZWQ7CiAgICAgICAgIGlmIChyZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0IDwgMCkgewogICAgICAgICAgICAgU0VUX0VSUigiVG9vIG1hbnkgYnVmZmVycyByZXR1cm5lZCBmb3IgZnJhbWUgJWQiLAogICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICAvLyBDaGVjayBpZiBldmVyeXRoaW5nIGhhcyBhcnJpdmVkIGZvciB0aGlzIHJlc3VsdCAoYnVmZmVycyBhbmQgbWV0YWRhdGEpCi0gICAgICAgIGlmIChyZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSAmJiByZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0ID09IDApIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgZXZlcnl0aGluZyBoYXMgYXJyaXZlZCBmb3IgdGhpcyByZXN1bHQgKGJ1ZmZlcnMgYW5kIG1ldGFkYXRhKSwgcmVtb3ZlIGl0IGZyb20KKyAgICAgICAgLy8gSW5GbGlnaHRNYXAgaWYgYm90aCBhcnJpdmVkIG9yIEhBTCByZXBvcnRzIGVycm9yIGZvciB0aGlzIHJlcXVlc3QgKGkuZS4gZHVyaW5nIGZsdXNoKS4KKyAgICAgICAgaWYgKChyZXF1ZXN0LnJlcXVlc3RTdGF0dXMgIT0gT0spIHx8CisgICAgICAgICAgICAgICAgKHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhICYmIHJlcXVlc3QubnVtQnVmZmVyc0xlZnQgPT0gMCkpIHsKICAgICAgICAgICAgIEFUUkFDRV9BU1lOQ19FTkQoImZyYW1lIGNhcHR1cmUiLCBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICBtSW5GbGlnaHRNYXAucmVtb3ZlSXRlbXNBdChpZHgsIDEpOwogICAgICAgICB9CkBAIC0xNjczLDMxICsyMDM3LDMzIEBACiAgICAgICAgIC8vIFNhbml0eSBjaGVjayAtIGlmIHdlIGhhdmUgdG9vIG1hbnkgaW4tZmxpZ2h0IGZyYW1lcywgc29tZXRoaW5nIGhhcwogICAgICAgICAvLyBsaWtlbHkgZ29uZSB3cm9uZwogICAgICAgICBpZiAobUluRmxpZ2h0TWFwLnNpemUoKSA+IGtJbkZsaWdodFdhcm5MaW1pdCkgewotICAgICAgICAgICAgQ0xPR0UoIkluLWZsaWdodCBsaXN0IHRvbyBsYXJnZTogJWQiLCBtSW5GbGlnaHRNYXAuc2l6ZSgpKTsKKyAgICAgICAgICAgIENMT0dFKCJJbi1mbGlnaHQgbGlzdCB0b28gbGFyZ2U6ICV6dSIsIG1JbkZsaWdodE1hcC5zaXplKCkpOwogICAgICAgICB9CiAKICAgICB9CiAKICAgICAvLyBQcm9jZXNzIHRoZSByZXN1bHQgbWV0YWRhdGEsIGlmIHByb3ZpZGVkCiAgICAgYm9vbCBnb3RSZXN1bHQgPSBmYWxzZTsKLSAgICBpZiAocmVzdWx0LT5yZXN1bHQgIT0gTlVMTCAmJiAhcGFydGlhbFJlc3VsdFF1aXJrKSB7CisgICAgaWYgKHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwgJiYgIWlzUGFydGlhbFJlc3VsdCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CiAKICAgICAgICAgZ290UmVzdWx0ID0gdHJ1ZTsKIAotICAgICAgICBpZiAoZnJhbWVOdW1iZXIgIT0gbU5leHRSZXN1bHRGcmFtZU51bWJlcikgeworICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIHRyYWNrIGVycm9ycyBmb3IgdGlnaHRlciBib3VuZHMgb24gZXhwZWN0ZWQgZnJhbWUgbnVtYmVyCisgICAgICAgIGlmIChmcmFtZU51bWJlciA8IG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpIHsKICAgICAgICAgICAgIFNFVF9FUlIoIk91dC1vZi1vcmRlciBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBzdWJtaXR0ZWQhICIKICAgICAgICAgICAgICAgICAgICAgIihnb3QgZnJhbWUgbnVtYmVyICVkLCBleHBlY3RpbmcgJWQpIiwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIrKzsKKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyICsgMTsKIAotICAgICAgICBDYW1lcmFNZXRhZGF0YSBjYXB0dXJlUmVzdWx0OwotICAgICAgICBjYXB0dXJlUmVzdWx0ID0gcmVzdWx0LT5yZXN1bHQ7CisgICAgICAgIENhcHR1cmVSZXN1bHQgY2FwdHVyZVJlc3VsdDsKKyAgICAgICAgY2FwdHVyZVJlc3VsdC5tUmVzdWx0RXh0cmFzID0gcmVzdWx0RXh0cmFzOworICAgICAgICBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogCi0gICAgICAgIGlmIChjYXB0dXJlUmVzdWx0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCopJmZyYW1lTnVtYmVyLCAxKSAhPSBPSykgeworICAgICAgICBpZiAoY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCwKKyAgICAgICAgICAgICAgICAoaW50MzJfdCopJmZyYW1lTnVtYmVyLCAxKSAhPSBPSykgewogICAgICAgICAgICAgU0VUX0VSUigiRmFpbGVkIHRvIHNldCBmcmFtZSMgaW4gbWV0YWRhdGEgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIGdvdFJlc3VsdCA9IGZhbHNlOwpAQCAtMTcwNywzMiArMjA3MywzNiBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gQXBwZW5kIGFueSBwcmV2aW91cyBwYXJ0aWFscyB0byBmb3JtIGEgY29tcGxldGUgcmVzdWx0Ci0gICAgICAgIGlmIChtVXNlUGFydGlhbFJlc3VsdFF1aXJrICYmICFjb2xsZWN0ZWRRdWlya1Jlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQuYXBwZW5kKGNvbGxlY3RlZFF1aXJrUmVzdWx0KTsKKyAgICAgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0ICYmICFjb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEuYXBwZW5kKGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQpOwogICAgICAgICB9CiAKLSAgICAgICAgY2FwdHVyZVJlc3VsdC5zb3J0KCk7CisgICAgICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLnNvcnQoKTsKIAogICAgICAgICAvLyBDaGVjayB0aGF0IHRoZXJlJ3MgYSB0aW1lc3RhbXAgaW4gdGhlIHJlc3VsdCBtZXRhZGF0YQogCiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBlbnRyeSA9Ci0gICAgICAgICAgICAgICAgY2FwdHVyZVJlc3VsdC5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOwogICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgewogICAgICAgICAgICAgU0VUX0VSUigiTm8gdGltZXN0YW1wIHByb3ZpZGVkIGJ5IEhBTCBmb3IgZnJhbWUgJWQhIiwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgZ290UmVzdWx0ID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wICE9IGVudHJ5LmRhdGEuaTY0WzBdKSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJUaW1lc3RhbXAgbWlzbWF0Y2ggYmV0d2VlbiBzaHV0dGVyIG5vdGlmeSBhbmQgcmVzdWx0IgotICAgICAgICAgICAgICAgICAgICAiIG1ldGFkYXRhIGZvciBmcmFtZSAlZCAoJWxsZCB2cyAlbGxkIHJlc3BlY3RpdmVseSkiLAorICAgICAgICAgICAgICAgICAgICAiIG1ldGFkYXRhIGZvciBmcmFtZSAlZCAoJSIgUFJJZDY0ICIgdnMgJSIgUFJJZDY0ICIgcmVzcGVjdGl2ZWx5KSIsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIGVudHJ5LmRhdGEuaTY0WzBdKTsKICAgICAgICAgICAgIGdvdFJlc3VsdCA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGdvdFJlc3VsdCkgewogICAgICAgICAgICAgLy8gVmFsaWQgcmVzdWx0LCBpbnNlcnQgaW50byBxdWV1ZQotICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIHF1ZXVlZFJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgKm1SZXN1bHRRdWV1ZS5pbnNlcnQobVJlc3VsdFF1ZXVlLmVuZCgpLCBDYW1lcmFNZXRhZGF0YSgpKTsKLSAgICAgICAgICAgIHF1ZXVlZFJlc3VsdC5zd2FwKGNhcHR1cmVSZXN1bHQpOworICAgICAgICAgICAgTGlzdDxDYXB0dXJlUmVzdWx0Pjo6aXRlcmF0b3IgcXVldWVkUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgbVJlc3VsdFF1ZXVlLmluc2VydChtUmVzdWx0UXVldWUuZW5kKCksIENhcHR1cmVSZXN1bHQoY2FwdHVyZVJlc3VsdCkpOworICAgICAgICAgICAgQUxPR1ZWKCIlczogcmVzdWx0IHJlcXVlc3RJZCA9ICUiIFBSSWQzMiAiLCBmcmFtZU51bWJlciA9ICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICBxdWV1ZWRSZXN1bHQtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkLAorICAgICAgICAgICAgICAgICAgIHF1ZXVlZFJlc3VsdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICBxdWV1ZWRSZXN1bHQtPm1SZXN1bHRFeHRyYXMuYnVyc3RJZCk7CiAgICAgICAgIH0KICAgICB9IC8vIHNjb3BlIGZvciBtT3V0cHV0TG9jawogCkBAIC0xNzQ1LDExICsyMTE1LDMwIEBACiAgICAgICAgIC8vIE5vdGU6IHN0cmVhbSBtYXkgYmUgZGVhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludCwgaWYgdGhpcyBidWZmZXIgd2FzIHRoZQogICAgICAgICAvLyBsYXN0IHJlZmVyZW5jZSB0byBpdC4KICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkNhbid0IHJldHVybiBidWZmZXIgJWQgZm9yIGZyYW1lICVkIHRvIGl0cyBzdHJlYW06ICIKKyAgICAgICAgICAgIEFMT0dFKCJDYW4ndCByZXR1cm4gYnVmZmVyICV6dSBmb3IgZnJhbWUgJWQgdG8gaXRzIHN0cmVhbTogIgogICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBpLCBmcmFtZU51bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAocmVzdWx0LT5pbnB1dF9idWZmZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAoaGFzSW5wdXRCdWZmZXJJblJlcXVlc3QpIHsKKyAgICAgICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9CisgICAgICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbTo6Y2FzdChyZXN1bHQtPmlucHV0X2J1ZmZlci0+c3RyZWFtKTsKKyAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuSW5wdXRCdWZmZXIoKihyZXN1bHQtPmlucHV0X2J1ZmZlcikpOworICAgICAgICAgICAgLy8gTm90ZTogc3RyZWFtIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LCBpZiB0aGlzIGJ1ZmZlciB3YXMgdGhlCisgICAgICAgICAgICAvLyBsYXN0IHJlZmVyZW5jZSB0byBpdC4KKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RUaHJlYWQ6IENhbid0IHJldHVybiBpbnB1dCBidWZmZXIgZm9yIGZyYW1lICVkIHRvIgorICAgICAgICAgICAgICAgICAgICAgICIgIGl0cyBzdHJlYW06JXMgKCVkKSIsICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBJbnB1dCBidWZmZXIgc2hvdWxkIGJlIE5VTEwgaWYgdGhlcmUgaXMgbm8gaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICIgYnVmZmVyIHNlbnQgaW4gdGhlIHJlcXVlc3QsIHNraXBwaW5nIGlucHV0IGJ1ZmZlciByZXR1cm4uIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIEZpbmFsbHksIHNpZ25hbCBhbnkgd2FpdGVycyBmb3IgbmV3IGZyYW1lcwogCiAgICAgaWYgKGdvdFJlc3VsdCkgewpAQCAtMTc1OCw4ICsyMTQ3LDYgQEAKIAogfQogCi0KLQogdm9pZCBDYW1lcmEzRGV2aWNlOjpub3RpZnkoY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnICptc2cpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcjsKQEAgLTE3NzUsNzIgKzIxNjIsMTEgQEAKIAogICAgIHN3aXRjaCAobXNnLT50eXBlKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBM19NU0dfRVJST1I6IHsKLSAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IDA7Ci0gICAgICAgICAgICBpZiAobXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbSAqc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYTNTdHJlYW06OmNhc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSWQgPSBzdHJlYW0tPmdldElkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiQ2FtZXJhICVkOiAlczogSEFMIGVycm9yLCBmcmFtZSAlZCwgc3RyZWFtICVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1JZCwgX19GVU5DVElPTl9fLCBtc2ctPm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgbXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUpOwotCi0gICAgICAgICAgICAvLyBTZXQgcmVxdWVzdCBlcnJvciBzdGF0dXMgZm9yIHRoZSByZXF1ZXN0IGluIHRoZSBpbi1mbGlnaHQgdHJhY2tpbmcKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1JbkZsaWdodE1hcC5pbmRleE9mS2V5KG1zZy0+bWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIpOwotICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KS5yZXF1ZXN0U3RhdHVzID0gbXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcihtc2ctPm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+bWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIHN0cmVhbUlkKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUVycm9yKG1zZy0+bWVzc2FnZS5lcnJvciwgbGlzdGVuZXIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBDQU1FUkEzX01TR19TSFVUVEVSOiB7Ci0gICAgICAgICAgICBzc2l6ZV90IGlkeDsKLSAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyID0gbXNnLT5tZXNzYWdlLnNodXR0ZXIuZnJhbWVfbnVtYmVyOwotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBtc2ctPm1lc3NhZ2Uuc2h1dHRlci50aW1lc3RhbXA7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgb3JkZXJpbmcgb2Ygc2h1dHRlciBub3RpZmljYXRpb25zCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOwotICAgICAgICAgICAgICAgIGlmIChmcmFtZU51bWJlciAhPSBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcikgewotICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJTaHV0dGVyIG5vdGlmaWNhdGlvbiBvdXQtb2Ytb3JkZXIuIEV4cGVjdGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90aWZpY2F0aW9uIGZvciBmcmFtZSAlZCwgZ290IGZyYW1lICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwgZnJhbWVOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50MzJfdCByZXF1ZXN0SWQgPSAtMTsKLQotICAgICAgICAgICAgLy8gU2V0IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3QgaW4gdGhlIGluLWZsaWdodCB0cmFja2luZwotICAgICAgICAgICAgLy8gYW5kIGdldCB0aGUgcmVxdWVzdCBJRCB0byBzZW5kIHVwc3RyZWFtCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7Ci0gICAgICAgICAgICAgICAgaWR4ID0gbUluRmxpZ2h0TWFwLmluZGV4T2ZLZXkoZnJhbWVOdW1iZXIpOwotICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnIgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKLSAgICAgICAgICAgICAgICAgICAgci5jYXB0dXJlVGltZXN0YW1wID0gdGltZXN0YW1wOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQgPSByLnJlcXVlc3RJZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaWR4IDwgMCkgewotICAgICAgICAgICAgICAgIFNFVF9FUlIoIlNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciBub24tZXhpc3RlbnQgZnJhbWUgbnVtYmVyICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWVigiQ2FtZXJhICVkOiAlczogU2h1dHRlciBmaXJlZCBmb3IgZnJhbWUgJWQgKGlkICVkKSBhdCAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgbUlkLCBfX0ZVTkNUSU9OX18sIGZyYW1lTnVtYmVyLCByZXF1ZXN0SWQsIHRpbWVzdGFtcCk7Ci0gICAgICAgICAgICAvLyBDYWxsIGxpc3RlbmVyLCBpZiBhbnkKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeVNodXR0ZXIocmVxdWVzdElkLCB0aW1lc3RhbXApOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5U2h1dHRlcihtc2ctPm1lc3NhZ2Uuc2h1dHRlciwgbGlzdGVuZXIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKQEAgLTE4NDksNiArMjE3NSwxMjEgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6bm90aWZ5RXJyb3IoY29uc3QgY2FtZXJhM19lcnJvcl9tc2dfdCAmbXNnLAorICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpIHsKKworICAgIC8vIE1hcCBjYW1lcmEgSEFMIGVycm9yIGNvZGVzIHRvIElDYW1lcmFEZXZpY2VDYWxsYmFjayBlcnJvciBjb2RlcworICAgIC8vIEluZGV4IGludG8gdGhpcyB3aXRoIHRoZSBIQUwgZXJyb3IgY29kZQorICAgIHN0YXRpYyBjb25zdCBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUKKyAgICAgICAgICAgIGhhbEVycm9yTWFwW0NBTUVSQTNfTVNHX05VTV9FUlJPUlNdID0geworICAgICAgICAvLyAwID0gVW51c2VkIGVycm9yIGNvZGUKKyAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0lOVkFMSURfRVJST1IsCisgICAgICAgIC8vIDEgPSBDQU1FUkEzX01TR19FUlJPUl9ERVZJQ0UKKyAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RFVklDRSwKKyAgICAgICAgLy8gMiA9IENBTUVSQTNfTVNHX0VSUk9SX1JFUVVFU1QKKyAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCisgICAgICAgIC8vIDMgPSBDQU1FUkEzX01TR19FUlJPUl9SRVNVTFQKKyAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVCwKKyAgICAgICAgLy8gNCA9IENBTUVSQTNfTVNHX0VSUk9SX0JVRkZFUgorICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSCisgICAgfTsKKworICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUgPQorICAgICAgICAgICAgKChtc2cuZXJyb3JfY29kZSA+PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAobXNnLmVycm9yX2NvZGUgPCBDQU1FUkEzX01TR19OVU1fRVJST1JTKSkgPworICAgICAgICAgICAgaGFsRXJyb3JNYXBbbXNnLmVycm9yX2NvZGVdIDoKKyAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SOworCisgICAgaW50IHN0cmVhbUlkID0gMDsKKyAgICBpZiAobXNnLmVycm9yX3N0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9CisgICAgICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbTo6Y2FzdChtc2cuZXJyb3Jfc3RyZWFtKTsKKyAgICAgICAgc3RyZWFtSWQgPSBzdHJlYW0tPmdldElkKCk7CisgICAgfQorICAgIEFMT0dWKCJDYW1lcmEgJWQ6ICVzOiBIQUwgZXJyb3IsIGZyYW1lICVkLCBzdHJlYW0gJWQ6ICVkIiwKKyAgICAgICAgICAgIG1JZCwgX19GVU5DVElPTl9fLCBtc2cuZnJhbWVfbnVtYmVyLAorICAgICAgICAgICAgc3RyZWFtSWQsIG1zZy5lcnJvcl9jb2RlKTsKKworICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOworICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RFVklDRToKKyAgICAgICAgICAgIC8vIFNFVF9FUlIgY2FsbHMgbm90aWZ5RXJyb3IKKyAgICAgICAgICAgIFNFVF9FUlIoIkNhbWVyYSBIQUwgcmVwb3J0ZWQgc2VyaW91cyBkZXZpY2UgZXJyb3IiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUOgorICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQ6CisgICAgICAgIGNhc2UgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1JbkZsaWdodE1hcC5pbmRleE9mS2V5KG1zZy5mcmFtZV9udW1iZXIpOworICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnIgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgci5yZXF1ZXN0U3RhdHVzID0gbXNnLmVycm9yX2NvZGU7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyA9IHIucmVzdWx0RXh0cmFzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciA9IG1zZy5mcmFtZV9udW1iZXI7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgJWQ6ICVzOiBjYW5ub3QgZmluZCBpbi1mbGlnaHQgcmVxdWVzdCBvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lICUiIFBSSWQ2NCAiIGVycm9yIiwgbUlkLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgJWQ6ICVzOiBubyBsaXN0ZW5lciBhdmFpbGFibGUiLCBtSWQsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFNFVF9FUlIgY2FsbHMgbm90aWZ5RXJyb3IKKyAgICAgICAgICAgIFNFVF9FUlIoIlVua25vd24gZXJyb3IgbWVzc2FnZSBmcm9tIEhBTDogJWQiLCBtc2cuZXJyb3JfY29kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6bm90aWZ5U2h1dHRlcihjb25zdCBjYW1lcmEzX3NodXR0ZXJfbXNnX3QgJm1zZywKKyAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKSB7CisgICAgc3NpemVfdCBpZHg7CisgICAgLy8gVmVyaWZ5IG9yZGVyaW5nIG9mIHNodXR0ZXIgbm90aWZpY2F0aW9ucworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOworICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIHRyYWNrIGVycm9ycyBmb3IgdGlnaHRlciBib3VuZHMgb24gZXhwZWN0ZWQgZnJhbWUgbnVtYmVyLgorICAgICAgICBpZiAobXNnLmZyYW1lX251bWJlciA8IG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICBTRVRfRVJSKCJTaHV0dGVyIG5vdGlmaWNhdGlvbiBvdXQtb2Ytb3JkZXIuIEV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICAgICAgIm5vdGlmaWNhdGlvbiBmb3IgZnJhbWUgJWQsIGdvdCBmcmFtZSAlZCIsCisgICAgICAgICAgICAgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLCBtc2cuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciA9IG1zZy5mcmFtZV9udW1iZXIgKyAxOworICAgIH0KKworICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOworCisgICAgLy8gU2V0IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3QgaW4gdGhlIGluLWZsaWdodCB0cmFja2luZworICAgIC8vIGFuZCBnZXQgdGhlIHJlcXVlc3QgSUQgdG8gc2VuZCB1cHN0cmVhbQorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7CisgICAgICAgIGlkeCA9IG1JbkZsaWdodE1hcC5pbmRleE9mS2V5KG1zZy5mcmFtZV9udW1iZXIpOworICAgICAgICBpZiAoaWR4ID49IDApIHsKKyAgICAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCAmciA9IG1JbkZsaWdodE1hcC5lZGl0VmFsdWVBdChpZHgpOworICAgICAgICAgICAgci5jYXB0dXJlVGltZXN0YW1wID0gbXNnLnRpbWVzdGFtcDsKKyAgICAgICAgICAgIHJlc3VsdEV4dHJhcyA9IHIucmVzdWx0RXh0cmFzOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIFNFVF9FUlIoIlNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciBub24tZXhpc3RlbnQgZnJhbWUgbnVtYmVyICVkIiwKKyAgICAgICAgICAgICAgICBtc2cuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVlYoIkNhbWVyYSAlZDogJXM6IFNodXR0ZXIgZmlyZWQgZm9yIGZyYW1lICVkIChpZCAlZCkgYXQgJSIgUFJJZDY0LAorICAgICAgICAgICAgbUlkLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBtc2cuZnJhbWVfbnVtYmVyLCByZXN1bHRFeHRyYXMucmVxdWVzdElkLCBtc2cudGltZXN0YW1wKTsKKyAgICAvLyBDYWxsIGxpc3RlbmVyLCBpZiBhbnkKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBsaXN0ZW5lci0+bm90aWZ5U2h1dHRlcihyZXN1bHRFeHRyYXMsIG1zZy50aW1lc3RhbXApOworICAgIH0KK30KKworCiBDYW1lcmFNZXRhZGF0YSBDYW1lcmEzRGV2aWNlOjpnZXRMYXRlc3RSZXF1ZXN0TG9ja2VkKCkgewogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTE4NjEsNiArMjMwMiw3IEBACiAgICAgcmV0dXJuIHJldFZhbDsKIH0KIAorCiAvKioKICAqIFJlcXVlc3RUaHJlYWQgaW5uZXIgY2xhc3MgbWV0aG9kcwogICovCkBAIC0xODc3LDE5ICsyMzE5LDQwIEBACiAgICAgICAgIG1Eb1BhdXNlKGZhbHNlKSwKICAgICAgICAgbVBhdXNlZCh0cnVlKSwKICAgICAgICAgbUZyYW1lTnVtYmVyKDApLAotICAgICAgICBtTGF0ZXN0UmVxdWVzdElkKE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIG1MYXRlc3RSZXF1ZXN0SWQoTkFNRV9OT1RfRk9VTkQpLAorICAgICAgICBtQ3VycmVudEFmVHJpZ2dlcklkKDApLAorICAgICAgICBtQ3VycmVudFByZUNhcHR1cmVUcmlnZ2VySWQoMCksCisgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIoTk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVMpIHsKICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZXROb3RpZnlDYWxsYmFjaygKKyAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKKyAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKK30KKwogdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjb25maWd1cmF0aW9uQ29tcGxldGUoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKICAgICBtUmVjb25maWd1cmVkID0gdHJ1ZTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6cXVldWVSZXF1ZXN0KAotICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnF1ZXVlUmVxdWVzdExpc3QoCisgICAgICAgIExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gJnJlcXVlc3RzLAorICAgICAgICAvKm91dCovCisgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7Ci0gICAgbVJlcXVlc3RRdWV1ZS5wdXNoX2JhY2socmVxdWVzdCk7CisgICAgZm9yIChMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+OjppdGVyYXRvciBpdCA9IHJlcXVlc3RzLmJlZ2luKCk7IGl0ICE9IHJlcXVlc3RzLmVuZCgpOworICAgICAgICAgICAgKytpdCkgeworICAgICAgICBtUmVxdWVzdFF1ZXVlLnB1c2hfYmFjaygqaXQpOworICAgIH0KKworICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAqbGFzdEZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyICsgbVJlcXVlc3RRdWV1ZS5zaXplKCkgLSAxOworICAgICAgICBBTE9HVigiJXM6IHJlcXVlc3RJZCAlZCwgbUZyYW1lTnVtYmVyICUiIFBSSWQzMiAiLCBsYXN0RnJhbWVOdW1iZXIgJSIgUFJJZDY0ICIuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAoKihyZXF1ZXN0cy5iZWdpbigpKSktPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkLCBtRnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICpsYXN0RnJhbWVOdW1iZXIpOworICAgIH0KIAogICAgIHVucGF1c2VGb3JOZXdSZXF1ZXN0cygpOwogCkBAIC0xOTUzLDI4ICsyNDE2LDcyIEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNldFJlcGVhdGluZ1JlcXVlc3RzKAotICAgICAgICBjb25zdCBSZXF1ZXN0TGlzdCAmcmVxdWVzdHMpIHsKKyAgICAgICAgY29uc3QgUmVxdWVzdExpc3QgJnJlcXVlc3RzLAorICAgICAgICAvKm91dCovCisgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICpsYXN0RnJhbWVOdW1iZXIgPSBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyOworICAgIH0KICAgICBtUmVwZWF0aW5nUmVxdWVzdHMuY2xlYXIoKTsKICAgICBtUmVwZWF0aW5nUmVxdWVzdHMuaW5zZXJ0KG1SZXBlYXRpbmdSZXF1ZXN0cy5iZWdpbigpLAogICAgICAgICAgICAgcmVxdWVzdHMuYmVnaW4oKSwgcmVxdWVzdHMuZW5kKCkpOwogCiAgICAgdW5wYXVzZUZvck5ld1JlcXVlc3RzKCk7CiAKKyAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyID0gTk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVM7CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhclJlcGVhdGluZ1JlcXVlc3RzKCkgeworYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjppc1JlcGVhdGluZ1JlcXVlc3RMb2NrZWQoY29uc3Qgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RJbikgeworICAgIGlmIChtUmVwZWF0aW5nUmVxdWVzdHMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludDMyX3QgcmVxdWVzdElkID0gcmVxdWVzdEluLT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBjb25zdCBSZXF1ZXN0TGlzdCAmcmVwZWF0UmVxdWVzdHMgPSBtUmVwZWF0aW5nUmVxdWVzdHM7CisgICAgLy8gQWxsIHJlcGVhdGluZyByZXF1ZXN0cyBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIHNhbWUgaWQgc28gb25seSBjaGVjayBmaXJzdCBxdWVzdAorICAgIGNvbnN0IHNwPENhcHR1cmVSZXF1ZXN0PiBmaXJzdFJlcXVlc3QgPSAqcmVwZWF0UmVxdWVzdHMuYmVnaW4oKTsKKyAgICByZXR1cm4gKGZpcnN0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQgPT0gcmVxdWVzdElkKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXJSZXBlYXRpbmdSZXF1ZXN0cygvKm91dCovaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKICAgICBtUmVwZWF0aW5nUmVxdWVzdHMuY2xlYXIoKTsKKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CisgICAgfQorICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUzsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFyKCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXIoCisgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lciwKKyAgICAgICAgLypvdXQqL2ludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgQUxPR1YoIlJlcXVlc3RUaHJlYWQ6OiVzOiIsIF9fRlVOQ1RJT05fXyk7CisKICAgICBtUmVwZWF0aW5nUmVxdWVzdHMuY2xlYXIoKTsKKworICAgIC8vIFNlbmQgZXJyb3JzIGZvciBhbGwgcmVxdWVzdHMgcGVuZGluZyBpbiB0aGUgcmVxdWVzdCBxdWV1ZSwgaW5jbHVkaW5nCisgICAgLy8gcGVuZGluZyByZXBlYXRpbmcgcmVxdWVzdHMKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBmb3IgKFJlcXVlc3RMaXN0OjppdGVyYXRvciBpdCA9IG1SZXF1ZXN0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgaXQgIT0gbVJlcXVlc3RRdWV1ZS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgLy8gU2V0IHRoZSBmcmFtZSBudW1iZXIgdGhpcyByZXF1ZXN0IHdvdWxkIGhhdmUgaGFkLCBpZiBpdAorICAgICAgICAgICAgLy8gaGFkIGJlZW4gc3VibWl0dGVkOyB0aGlzIGZyYW1lIG51bWJlciB3aWxsIG5vdCBiZSByZXVzZWQuCisgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdElkIGFuZCBidXJzdElkIGZpZWxkcyB3ZXJlIHNldCB3aGVuIHRoZSByZXF1ZXN0IHdhcworICAgICAgICAgICAgLy8gc3VibWl0dGVkIG9yaWdpbmFsbHkgKGluIGNvbnZlcnRNZXRhZGF0YUxpc3RUb1JlcXVlc3RMaXN0TG9ja2VkKQorICAgICAgICAgICAgKCppdCktPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIgPSBtRnJhbWVOdW1iZXIrKzsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgICAgKCppdCktPm1SZXN1bHRFeHRyYXMpOworICAgICAgICB9CisgICAgfQogICAgIG1SZXF1ZXN0UXVldWUuY2xlYXIoKTsKICAgICBtVHJpZ2dlck1hcC5jbGVhcigpOworICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAqbGFzdEZyYW1lTnVtYmVyID0gbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcjsKKyAgICB9CisgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlciA9IE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjAyNiw2ICsyNTMzLDcgQEAKIAogICAgIC8vIENyZWF0ZSByZXF1ZXN0IHRvIEhBTAogICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgcmVxdWVzdCA9IGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QoKTsKKyAgICByZXF1ZXN0LmZyYW1lX251bWJlciA9IG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOwogICAgIFZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4gb3V0cHV0QnVmZmVyczsKIAogICAgIC8vIEdldCB0aGUgcmVxdWVzdCBJRCwgaWYgYW55CkBAIC0yMDQ2LDcgKzI1NTQsNyBAQAogICAgIGlmIChyZXMgPCAwKSB7CiAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byBpbnNlcnQgdHJpZ2dlcnMgIgogICAgICAgICAgICAgICAgICIoY2FwdHVyZSByZXF1ZXN0ICVkLCBIQUwgZGV2aWNlOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAobUZyYW1lTnVtYmVyKzEpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIGNsZWFuVXBGYWlsZWRSZXF1ZXN0KHJlcXVlc3QsIG5leHRSZXF1ZXN0LCBvdXRwdXRCdWZmZXJzKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTIwNjQsNyArMjU3Miw3IEBACiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byBpbnNlcnQgZHVtbXkgdHJpZ2dlciBJRHMgIgogICAgICAgICAgICAgICAgICAgICAiKGNhcHR1cmUgcmVxdWVzdCAlZCwgSEFMIGRldmljZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIChtRnJhbWVOdW1iZXIrMSksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTIwODgsNyArMjU5Niw3IEBACiAgICAgICAgICAgICBpZiAoZS5jb3VudCA+IDApIHsKICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFJlcXVlc3QgKGZyYW1lIG51bSAlZCkgaGFkIEFGIHRyaWdnZXIgMHgleCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZU51bWJlcisxLAorICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZnJhbWVfbnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgIGUuZGF0YS51OFswXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIwOTksNiArMjYwNyw3IEBACiAgICAgfQogCiAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgaW5wdXRCdWZmZXI7CisgICAgdWludDMyX3QgdG90YWxOdW1CdWZmZXJzID0gMDsKIAogICAgIC8vIEZpbGwgaW4gYnVmZmVycwogCkBAIC0yMTA2LDExICsyNjE1LDIxIEBACiAgICAgICAgIHJlcXVlc3QuaW5wdXRfYnVmZmVyID0gJmlucHV0QnVmZmVyOwogICAgICAgICByZXMgPSBuZXh0UmVxdWVzdC0+bUlucHV0U3RyZWFtLT5nZXRJbnB1dEJ1ZmZlcigmaW5wdXRCdWZmZXIpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAvLyBDYW4ndCBnZXQgaW5wdXQgYnVmZmVyIGZyb20gZ3JhbGxvYyBxdWV1ZSAtIHRoaXMgY291bGQgYmUgZHVlIHRvCisgICAgICAgICAgICAvLyBkaXNjb25uZWN0ZWQgcXVldWUgb3Igb3RoZXIgcHJvZHVjZXIgbWlzYmVoYXZpb3IsIHNvIG5vdCBhIGZhdGFsCisgICAgICAgICAgICAvLyBlcnJvcgogICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3RUaHJlYWQ6IENhbid0IGdldCBpbnB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgogICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtTGlzdGVuZXItPm5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICB0b3RhbE51bUJ1ZmZlcnMgKz0gMTsKICAgICB9IGVsc2UgewogICAgICAgICByZXF1ZXN0LmlucHV0X2J1ZmZlciA9IE5VTEw7CiAgICAgfQpAQCAtMjEyMiwyNiArMjY0MSw0MSBAQAogICAgICAgICByZXMgPSBuZXh0UmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChpKS0+CiAgICAgICAgICAgICAgICAgZ2V0QnVmZmVyKCZvdXRwdXRCdWZmZXJzLmVkaXRJdGVtQXQoaSkpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAvLyBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmcm9tIGdyYWxsb2MgcXVldWUgLSB0aGlzIGNvdWxkIGJlIGR1ZSB0bworICAgICAgICAgICAgLy8gYWJhbmRvbmVkIHF1ZXVlIG9yIG90aGVyIGNvbnN1bWVyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAorICAgICAgICAgICAgLy8gZXJyb3IKICAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0VGhyZWFkOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciwgc2tpcHBpbmcgcmVxdWVzdDoiCiAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKKyAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1MaXN0ZW5lci0+bm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNsZWFuVXBGYWlsZWRSZXF1ZXN0KHJlcXVlc3QsIG5leHRSZXF1ZXN0LCBvdXRwdXRCdWZmZXJzKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJlcXVlc3QubnVtX291dHB1dF9idWZmZXJzKys7CiAgICAgfQotCi0gICAgcmVxdWVzdC5mcmFtZV9udW1iZXIgPSBtRnJhbWVOdW1iZXIrKzsKKyAgICB0b3RhbE51bUJ1ZmZlcnMgKz0gcmVxdWVzdC5udW1fb3V0cHV0X2J1ZmZlcnM7CiAKICAgICAvLyBMb2cgcmVxdWVzdCBpbiB0aGUgaW4tZmxpZ2h0IHF1ZXVlCiAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CiAgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7CisgICAgICAgIC8vIFNob3VsZCBub3QgaGFwcGVuLCBhbmQgbm93aGVyZSB0byBzZW5kIGVycm9ycyB0bywgc28ganVzdCBsb2cgaXQKICAgICAgICAgQ0xPR0UoIlJlcXVlc3RUaHJlYWQ6IFBhcmVudCBpcyBnb25lIik7CiAgICAgICAgIGNsZWFuVXBGYWlsZWRSZXF1ZXN0KHJlcXVlc3QsIG5leHRSZXF1ZXN0LCBvdXRwdXRCdWZmZXJzKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHJlcyA9IHBhcmVudC0+cmVnaXN0ZXJJbkZsaWdodChyZXF1ZXN0LmZyYW1lX251bWJlciwgcmVxdWVzdElkLAotICAgICAgICAgICAgcmVxdWVzdC5udW1fb3V0cHV0X2J1ZmZlcnMpOworICAgIHJlcyA9IHBhcmVudC0+cmVnaXN0ZXJJbkZsaWdodChyZXF1ZXN0LmZyYW1lX251bWJlciwKKyAgICAgICAgICAgIHRvdGFsTnVtQnVmZmVycywgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAvKmhhc0lucHV0Ki9yZXF1ZXN0LmlucHV0X2J1ZmZlciAhPSBOVUxMKTsKKyAgICBBTE9HVlYoIiVzOiByZWdpc3RlcmVkIGluIGZsaWdodCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKKyAgICAgICAgICAgIiwgYnVyc3RJZCA9ICUiIFBSSWQzMiAiLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuYnVyc3RJZCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gcmVnaXN0ZXIgbmV3IGluLWZsaWdodCByZXF1ZXN0OiIKICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTIxNjQsNiArMjY5OCw5IEBACiAgICAgQVRSQUNFX0VORCgpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAvLyBTaG91bGQgb25seSBnZXQgYSBmYWlsdXJlIGhlcmUgZm9yIG1hbGZvcm1lZCByZXF1ZXN0cyBvciBkZXZpY2UtbGV2ZWwKKyAgICAgICAgLy8gZXJyb3JzLCBzbyBjb25zaWRlciBhbGwgZXJyb3JzIGZhdGFsLiAgQmFkIG1ldGFkYXRhIGZhaWx1cmVzIHNob3VsZAorICAgICAgICAvLyBjb21lIHRocm91Z2ggbm90aWZ5LgogICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gc3VibWl0IGNhcHR1cmUgcmVxdWVzdCAlZCB0byBIQUwiCiAgICAgICAgICAgICAgICAgIiBkZXZpY2U6ICVzICglZCkiLCByZXF1ZXN0LmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIGNsZWFuVXBGYWlsZWRSZXF1ZXN0KHJlcXVlc3QsIG5leHRSZXF1ZXN0LCBvdXRwdXRCdWZmZXJzKTsKQEAgLTIxOTIsMjEgKzI3MjksNiBAQAogICAgIH0KICAgICBtUHJldlRyaWdnZXJzID0gdHJpZ2dlckNvdW50OwogCi0gICAgLy8gUmV0dXJuIGlucHV0IGJ1ZmZlciBiYWNrIHRvIGZyYW1ld29yawotICAgIGlmIChyZXF1ZXN0LmlucHV0X2J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9Ci0gICAgICAgICAgICBDYW1lcmEzU3RyZWFtOjpjYXN0KHJlcXVlc3QuaW5wdXRfYnVmZmVyLT5zdHJlYW0pOwotICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybklucHV0QnVmZmVyKCoocmVxdWVzdC5pbnB1dF9idWZmZXIpKTsKLSAgICAgICAgLy8gTm90ZTogc3RyZWFtIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LCBpZiB0aGlzIGJ1ZmZlciB3YXMgdGhlCi0gICAgICAgIC8vIGxhc3QgcmVmZXJlbmNlIHRvIGl0LgotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RUaHJlYWQ6IENhbid0IHJldHVybiBpbnB1dCBidWZmZXIgZm9yIGZyYW1lICVkIHRvIgotICAgICAgICAgICAgICAgICAgICAiICBpdHMgc3RyZWFtOiVzICglZCkiLCAgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBSZXBvcnQgZXJyb3IgdXBzdHJlYW0KLSAgICAgICAgfQotICAgIH0KLQogICAgIHJldHVybiB0cnVlOwogfQogCkBAIC0yMjE4LDYgKzI3NDAsNyBAQAogICAgIHJldHVybiBtTGF0ZXN0UmVxdWVzdDsKIH0KIAorCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFuVXBGYWlsZWRSZXF1ZXN0KAogICAgICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICZyZXF1ZXN0LAogICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gJm5leHRSZXF1ZXN0LApAQCAtMjI1OSw2ICsyNzgyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgKytmaXJzdFJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzLmVuZCgpKTsKICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gd2FpdCBhbnkgbG9uZ2VyCisKKyAgICAgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBtRnJhbWVOdW1iZXIgKyByZXF1ZXN0cy5zaXplKCkgLSAxOworCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yMzEwLDYgKzI4MzYsMTEgQEAKICAgICAgICAgbVJlY29uZmlndXJlZCA9IGZhbHNlOwogICAgIH0KIAorICAgIGlmIChuZXh0UmVxdWVzdCAhPSBOVUxMKSB7CisgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyKys7CisgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmFmVHJpZ2dlcklkID0gbUN1cnJlbnRBZlRyaWdnZXJJZDsKKyAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZCA9IG1DdXJyZW50UHJlQ2FwdHVyZVRyaWdnZXJJZDsKKyAgICB9CiAgICAgcmV0dXJuIG5leHRSZXF1ZXN0OwogfQogCkBAIC0yMzcyLDEzICsyOTAzLDM0IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRyaWdnZXJNdXRleCk7CiAKKyAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50ID09IE5VTEwpIHsKKyAgICAgICAgQ0xPR0UoIlJlcXVlc3RUaHJlYWQ6IFBhcmVudCBpcyBnb25lIik7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKICAgICBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEgPSByZXF1ZXN0LT5tU2V0dGluZ3M7CiAgICAgc2l6ZV90IGNvdW50ID0gbVRyaWdnZXJNYXAuc2l6ZSgpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgIFJlcXVlc3RUcmlnZ2VyIHRyaWdnZXIgPSBtVHJpZ2dlck1hcC52YWx1ZUF0KGkpOwotCiAgICAgICAgIHVpbnQzMl90IHRhZyA9IHRyaWdnZXIubWV0YWRhdGFUYWc7CisKKyAgICAgICAgaWYgKHRhZyA9PSBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCB8fCB0YWcgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfSUQpIHsKKyAgICAgICAgICAgIGJvb2wgaXNBZVRyaWdnZXIgPSAodHJpZ2dlci5tZXRhZGF0YVRhZyA9PSBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCk7CisgICAgICAgICAgICB1aW50MzJfdCB0cmlnZ2VySWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odHJpZ2dlci5lbnRyeVZhbHVlKTsKKyAgICAgICAgICAgIGlmIChpc0FlVHJpZ2dlcikgeworICAgICAgICAgICAgICAgIHJlcXVlc3QtPm1SZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZCA9IHRyaWdnZXJJZDsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFByZUNhcHR1cmVUcmlnZ2VySWQgPSB0cmlnZ2VySWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQgPSB0cmlnZ2VySWQ7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZCA9IHRyaWdnZXJJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJlbnQtPm1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIFRyaWdnZXIgSUQgdGFnIGlzIGRlcHJlY2F0ZWQgc2luY2UgZGV2aWNlIEhBTCAzLjIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBlbnRyeSA9IG1ldGFkYXRhLmZpbmQodGFnKTsKIAogICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCmluZGV4IDQ2OGY2NDEuLmVjNmJiYTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKICNpbmNsdWRlICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuaCIKQEAgLTU0LDcgKzU2LDcgQEAKIH0KIAogLyoqCi0gKiBDYW1lcmFEZXZpY2UgZm9yIEhBTCBkZXZpY2VzIHdpdGggdmVyc2lvbiBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMAorICogQ2FtZXJhRGV2aWNlIGZvciBIQUwgZGV2aWNlcyB3aXRoIHZlcnNpb24gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzAgb3IgaGlnaGVyLgogICovCiBjbGFzcyBDYW1lcmEzRGV2aWNlIDoKICAgICAgICAgICAgIHB1YmxpYyBDYW1lcmFEZXZpY2VCYXNlLApAQCAtNzgsOSArODAsMTQgQEAKIAogICAgIC8vIENhcHR1cmUgYW5kIHNldFN0cmVhbWluZ1JlcXVlc3Qgd2lsbCBjb25maWd1cmUgc3RyZWFtcyBpZiBjdXJyZW50bHkgaW4KICAgICAvLyBpZGxlIHN0YXRlCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNhcHR1cmVMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdFVudGlsUmVxdWVzdFJlY2VpdmVkKGludDMyX3QgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVvdXQpOwogCkBAIC04OCw4ICs5NSw3IEBACiAgICAgLy8gSWYgYWRkaW5nIHN0cmVhbXMgd2hpbGUgYWN0aXZlbHkgY2FwdHVyaW5nLCB3aWxsIHBhdXNlIGRldmljZSBiZWZvcmUgYWRkaW5nCiAgICAgLy8gc3RyZWFtLCByZWNvbmZpZ3VyaW5nIGRldmljZSwgYW5kIHVucGF1c2luZy4KICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgaW50ICppZCk7CisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgKmlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUlucHV0U3RyZWFtKAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGludCAqaWQpOwpAQCAtMTA4LDYgKzExNCw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVTdHJlYW0oaW50IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVJlcHJvY2Vzc1N0cmVhbShpbnQgaWQpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLCBDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCk7CiAKICAgICAvLyBUcmFuc2l0aW9ucyB0byB0aGUgaWRsZSBzdGF0ZSBvbiBzdWNjZXNzCkBAIC0xMTYsNyArMTI0LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE5vdGlmeUNhbGxiYWNrKE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcik7CiAgICAgdmlydHVhbCBib29sICAgICB3aWxsTm90aWZ5M0EoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRGb3JOZXh0RnJhbWUobnNlY3NfdCB0aW1lb3V0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRGcmFtZShDYW1lcmFNZXRhZGF0YSAqZnJhbWUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFJlc3VsdChDYXB0dXJlUmVzdWx0ICpmcmFtZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHRyaWdnZXJBdXRvZm9jdXModWludDMyX3QgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdHJpZ2dlckNhbmNlbEF1dG9mb2N1cyh1aW50MzJfdCBpZCk7CkBAIC0xMjUsNyArMTMzLDExIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBwdXNoUmVwcm9jZXNzQnVmZmVyKGludCByZXByb2Nlc3NTdHJlYW1JZCwKICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLCB3cDxCdWZmZXJSZWxlYXNlZExpc3RlbmVyPiBsaXN0ZW5lcik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlVmVyc2lvbigpOworCisgICAgdmlydHVhbCBzc2l6ZV90IGdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0OwogCiAgICAgLy8gTWV0aG9kcyBjYWxsZWQgYnkgc3ViY2xhc3NlcwogICAgIHZvaWQgICAgICAgICAgICAgbm90aWZ5U3RhdHVzKGJvb2wgaWRsZSk7IC8vIHVwZGF0ZXMgZnJvbSBTdGF0dXNUcmFja2VyCkBAIC0xMzcsNiArMTQ5LDEwIEBACiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga1NodXRkb3duVGltZW91dCAgID0gNTAwMDAwMDAwMDsgLy8gNSBzZWMKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrQWN0aXZlVGltZW91dCAgICAgPSA1MDAwMDAwMDA7ICAvLyA1MDAgbXMKICAgICBzdHJ1Y3QgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0VHJpZ2dlcjsKKyAgICAvLyBtaW5pbWFsIGpwZWcgYnVmZmVyIHNpemU6IDI1NktCICsgYmxvYiBoZWFkZXIKKyAgICBzdGF0aWMgY29uc3Qgc3NpemVfdCAgICAgICBrTWluSnBlZ0J1ZmZlclNpemUgPSAyNTYgKiAxMDI0ICsgc2l6ZW9mKGNhbWVyYTNfanBlZ19ibG9iKTsKKyAgICAvLyBDb25zdGFudCB0byB1c2UgZm9yIHN0cmVhbSBJRCB3aGVuIG9uZSBkb2Vzbid0IGV4aXN0CisgICAgc3RhdGljIGNvbnN0IGludCAgICAgICAgICAgTk9fU1RSRUFNID0gLTE7CiAKICAgICAvLyBBIGxvY2sgdG8gZW5mb3JjZSBzZXJpYWxpemF0aW9uIG9uIHRoZSBpbnB1dC9jb25maWd1cmUgc2lkZQogICAgIC8vIG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgpAQCAtMTU3LDcgKzE3MywxMCBAQAogICAgIGNhbWVyYTNfZGV2aWNlX3QgICAgICAgICAgKm1IYWwzRGV2aWNlOwogCiAgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgICAgbURldmljZUluZm87Ci0gICAgdmVuZG9yX3RhZ19xdWVyeV9vcHNfdCAgICAgbVZlbmRvclRhZ09wczsKKworICAgIENhbWVyYU1ldGFkYXRhICAgICAgICAgICAgIG1SZXF1ZXN0VGVtcGxhdGVDYWNoZVtDQU1FUkEzX1RFTVBMQVRFX0NPVU5UXTsKKworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1EZXZpY2VWZXJzaW9uOwogCiAgICAgZW51bSBTdGF0dXMgewogICAgICAgICBTVEFUVVNfRVJST1IsCkBAIC0xODEsNiArMjAwLDggQEAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFN0cmVhbUlkOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1OZWVkQ29uZmlnOwogCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbUR1bW15U3RyZWFtSWQ7CisKICAgICAvLyBXaGV0aGVyIHRvIHNlbmQgc3RhdGUgdXBkYXRlcyB1cHN0cmVhbQogICAgIC8vIFBhdXNlIHdoZW4gZG9pbmcgdHJhbnNwYXJlbnQgcmVjb25maWd1cmF0aW9uCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbVBhdXNlU3RhdGVOb3RpZnk7CkBAIC0xODgsOCArMjA5LDExIEBACiAgICAgLy8gTmVlZCB0byBob2xkIG9uIHRvIHN0cmVhbSByZWZlcmVuY2VzIHVudGlsIGNvbmZpZ3VyZSBjb21wbGV0ZXMuCiAgICAgVmVjdG9yPHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1JbnRlcmZhY2U+ID4gbURlbGV0ZWRTdHJlYW1zOwogCi0gICAgLy8gV2hldGhlciBxdWlyayBBTkRST0lEX1FVSVJLU19VU0VfUEFSVElBTF9SRVNVTFQgaXMgZW5hYmxlZAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0UXVpcms7CisgICAgLy8gV2hldGhlciB0aGUgSEFMIHdpbGwgc2VuZCBwYXJ0aWFsIHJlc3VsdAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0OworCisgICAgLy8gTnVtYmVyIG9mIHBhcnRpYWwgcmVzdWx0cyB0aGF0IHdpbGwgYmUgZGVsaXZlcmVkIGJ5IHRoZSBIQUwuCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzOwogCiAgICAgLyoqKiogRW5kIHNjb3BlIGZvciBtTG9jayAqKioqLwogCkBAIC0xOTksOSArMjIzLDIwIEBACiAgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW0+ICAgICAgICAgIG1JbnB1dFN0cmVhbTsKICAgICAgICAgVmVjdG9yPHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+ID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbXM7CisgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgICAgICAgICAgICAgICAgIG1SZXN1bHRFeHRyYXM7CiAgICAgfTsKICAgICB0eXBlZGVmIExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gUmVxdWVzdExpc3Q7CiAKKyAgICBzdGF0dXNfdCBjaGVja1N0YXR1c09rVG9DYXB0dXJlTG9ja2VkKCk7CisKKyAgICBzdGF0dXNfdCBjb252ZXJ0TWV0YWRhdGFMaXN0VG9SZXF1ZXN0TGlzdExvY2tlZCgKKyAgICAgICAgICAgIGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZtZXRhZGF0YUxpc3QsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBSZXF1ZXN0TGlzdCAqcmVxdWVzdExpc3QpOworCisgICAgc3RhdHVzX3Qgc3VibWl0UmVxdWVzdHNIZWxwZXIoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLCBib29sIHJlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgbGFzdCByZXF1ZXN0IHN1Ym1pdHRlZCB0byB0aGUgaGFsIGJ5IHRoZSByZXF1ZXN0IHRocmVhZC4KICAgICAgKgpAQCAtMjM3LDYgKzI3MiwxMyBAQAogICAgIHN0YXR1c190IHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jayhib29sIGFjdGl2ZSwgbnNlY3NfdCB0aW1lb3V0KTsKIAogICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHdhaXRVbnRpbERyYWluZWQuIE9uIHN1Y2Nlc3MsIHdpbGwgdHJhbnNpdGlvbiB0byBJRExFIHN0YXRlLgorICAgICAqCisgICAgICogTmVlZCB0byBiZSBjYWxsZWQgd2l0aCBtTG9jayBhbmQgbUludGVyZmFjZUxvY2sgaGVsZC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCB3YWl0VW50aWxEcmFpbmVkTG9ja2VkKCk7CisKKyAgICAvKioKICAgICAgKiBEbyBjb21tb24gd29yayBmb3Igc2V0dGluZyB1cCBhIHN0cmVhbWluZyBvciBzaW5nbGUgY2FwdHVyZSByZXF1ZXN0LgogICAgICAqIE9uIHN1Y2Nlc3MsIHdpbGwgdHJhbnNpdGlvbiB0byBBQ1RJVkUgaWYgaW4gSURMRS4KICAgICAgKi8KQEAgLTI1NSw2ICsyOTcsMTcgQEAKICAgICBzdGF0dXNfdCAgICAgICAgICAgY29uZmlndXJlU3RyZWFtc0xvY2tlZCgpOwogCiAgICAgLyoqCisgICAgICogQWRkIGEgZHVtbXkgc3RyZWFtIHRvIHRoZSBjdXJyZW50IHN0cmVhbSBzZXQgYXMgYSB3b3JrYXJvdW5kIGZvcgorICAgICAqIG5vdCBhbGxvd2luZyAwIHN0cmVhbXMgaW4gdGhlIGNhbWVyYSBIQUwgc3BlYy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgICAgYWRkRHVtbXlTdHJlYW1Mb2NrZWQoKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGR1bW15IHN0cmVhbSBpZiB0aGUgY3VycmVudCBjb25maWcgaW5jbHVkZXMgcmVhbCBzdHJlYW1zLgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgICB0cnlSZW1vdmVEdW1teVN0cmVhbUxvY2tlZCgpOworCisgICAgLyoqCiAgICAgICogU2V0IGRldmljZSBpbnRvIGFuIGVycm9yIHN0YXRlIGR1ZSB0byBzb21lIGZhdGFsIGZhaWx1cmUsIGFuZCBzZXQgYW4KICAgICAgKiBlcnJvciBtZXNzYWdlIHRvIGluZGljYXRlIHdoeS4gT25seSB0aGUgZmlyc3QgY2FsbCdzIG1lc3NhZ2Ugd2lsbCBiZQogICAgICAqIHVzZWQuIFRoZSBtZXNzYWdlIGlzIGFsc28gc2VudCB0byB0aGUgbG9nLgpAQCAtMjcwLDYgKzMyMywxOCBAQAogICAgICAqLwogICAgIGJvb2wgICAgICAgICAgICAgICB0cnlMb2NrU3BpblJpZ2h0Um91bmQoTXV0ZXgmIGxvY2spOwogCisgICAgc3RydWN0IFNpemUgeworICAgICAgICBpbnQgd2lkdGg7CisgICAgICAgIGludCBoZWlnaHQ7CisgICAgICAgIFNpemUoaW50IHcsIGludCBoKSA6IHdpZHRoKHcpLCBoZWlnaHQoaCl7fQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBsYXJnZXN0IEpwZWcgcmVzb2x1dGlvbiAoaW4gYXJlYSkKKyAgICAgKiBSZXR1cm4gU2l6ZSgwLCAwKSBpZiBzdGF0aWMgbWV0YXRkYXRhIGlzIGludmFsaWQKKyAgICAgKi8KKyAgICBTaXplIGdldE1heEpwZWdSZXNvbHV0aW9uKCkgY29uc3Q7CisKICAgICBzdHJ1Y3QgUmVxdWVzdFRyaWdnZXIgewogICAgICAgICAvLyBNZXRhZGF0YSB0YWcgbnVtYmVyLCBlLmcuIGFuZHJvaWQuY29udHJvbC5hZVByZWNhcHR1cmVUcmlnZ2VyCiAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhVGFnOwpAQCAtMjk4LDYgKzM2Myw4IEBACiAgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKICAgICAgICAgICAgICAgICBjYW1lcmEzX2RldmljZV90ICpoYWwzRGV2aWNlKTsKIAorICAgICAgICB2b2lkICAgICBzZXROb3RpZnlDYWxsYmFjayhOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBDYWxsIGFmdGVyIHN0cmVhbSAocmUpLWNvbmZpZ3VyYXRpb24gaXMgY29tcGxldGVkLgogICAgICAgICAgKi8KQEAgLTMwOCwxNSArMzc1LDIyIEBACiAgICAgICAgICAqIG9uIGVpdGhlci4gVXNlIHdhaXRVbnRpbFBhdXNlZCB0byB3YWl0IHVudGlsIHJlcXVlc3QgcXVldWUKICAgICAgICAgICogaGFzIGVtcHRpZWQgb3V0LgogICAgICAgICAgKi8KLSAgICAgICAgc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdHMoY29uc3QgUmVxdWVzdExpc3QmIHJlcXVlc3RzKTsKLSAgICAgICAgc3RhdHVzX3QgY2xlYXJSZXBlYXRpbmdSZXF1ZXN0cygpOworICAgICAgICBzdGF0dXNfdCBzZXRSZXBlYXRpbmdSZXF1ZXN0cyhjb25zdCBSZXF1ZXN0TGlzdCYgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IGNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCi0gICAgICAgIHN0YXR1c190IHF1ZXVlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCk7CisgICAgICAgIHN0YXR1c190IHF1ZXVlUmVxdWVzdExpc3QoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBSZW1vdmUgYWxsIHF1ZXVlZCBhbmQgcmVwZWF0aW5nIHJlcXVlc3RzLCBhbmQgcGVuZGluZyB0cmlnZ2VycwogICAgICAgICAgKi8KLSAgICAgICAgc3RhdHVzX3QgY2xlYXIoKTsKKyAgICAgICAgc3RhdHVzX3QgY2xlYXIoTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBRdWV1ZSBhIHRyaWdnZXIgdG8gYmUgZGlzcGF0Y2hlZCB3aXRoIHRoZSBuZXh0IG91dGdvaW5nCkBAIC0zOTEsMTAgKzQ2NSwxNSBAQAogICAgICAgICAvLyBSZWxheSBlcnJvciB0byBwYXJlbnQgZGV2aWNlIG9iamVjdCBzZXRFcnJvclN0YXRlCiAgICAgICAgIHZvaWQgICAgICAgICAgICAgICBzZXRFcnJvclN0YXRlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAorICAgICAgICAvLyBJZiB0aGUgaW5wdXQgcmVxdWVzdCBpcyBpbiBtUmVwZWF0aW5nUmVxdWVzdHMuIE11c3QgYmUgY2FsbGVkIHdpdGggbVJlcXVlc3RMb2NrIGhvbGQKKyAgICAgICAgYm9vbCBpc1JlcGVhdGluZ1JlcXVlc3RMb2NrZWQoY29uc3Qgc3A8Q2FwdHVyZVJlcXVlc3Q+KTsKKwogICAgICAgICB3cDxDYW1lcmEzRGV2aWNlPiAgbVBhcmVudDsKICAgICAgICAgd3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gIG1TdGF0dXNUcmFja2VyOwogICAgICAgICBjYW1lcmEzX2RldmljZV90ICAqbUhhbDNEZXZpY2U7CiAKKyAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKm1MaXN0ZW5lcjsKKwogICAgICAgICBjb25zdCBpbnQgICAgICAgICAgbUlkOyAgICAgICAvLyBUaGUgY2FtZXJhIElECiAgICAgICAgIGludCAgICAgICAgICAgICAgICBtU3RhdHVzSWQ7IC8vIFRoZSBSZXF1ZXN0VGhyZWFkJ3MgY29tcG9uZW50IElEIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0dXMgdHJhY2tpbmcKQEAgLTQyOSw2ICs1MDgsMTAgQEAKICAgICAgICAgVHJpZ2dlck1hcCAgICAgICAgIG1UcmlnZ2VyTWFwOwogICAgICAgICBUcmlnZ2VyTWFwICAgICAgICAgbVRyaWdnZXJSZW1vdmVkTWFwOwogICAgICAgICBUcmlnZ2VyTWFwICAgICAgICAgbVRyaWdnZXJSZXBsYWNlZE1hcDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgIG1DdXJyZW50QWZUcmlnZ2VySWQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBtQ3VycmVudFByZUNhcHR1cmVUcmlnZ2VySWQ7CisKKyAgICAgICAgaW50NjRfdCAgICAgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CiAgICAgfTsKICAgICBzcDxSZXF1ZXN0VGhyZWFkPiBtUmVxdWVzdFRocmVhZDsKIApAQCAtNDM3LDcxICs1MjAsOTAgQEAKICAgICAgKi8KIAogICAgIHN0cnVjdCBJbkZsaWdodFJlcXVlc3QgewotICAgICAgICAvLyBhbmRyb2lkLnJlcXVlc3QuaWQgZm9yIHRoZSByZXF1ZXN0Ci0gICAgICAgIGludCAgICAgcmVxdWVzdElkOwogICAgICAgICAvLyBTZXQgYnkgbm90aWZ5KCkgU0hVVFRFUiBjYWxsLgogICAgICAgICBuc2Vjc190IGNhcHR1cmVUaW1lc3RhbXA7CiAgICAgICAgIGludCAgICAgcmVxdWVzdFN0YXR1czsKICAgICAgICAgLy8gU2V0IGJ5IHByb2Nlc3NfY2FwdHVyZV9yZXN1bHQgY2FsbCB3aXRoIHZhbGlkIG1ldGFkYXRhCiAgICAgICAgIGJvb2wgICAgaGF2ZVJlc3VsdE1ldGFkYXRhOwogICAgICAgICAvLyBEZWNyZW1lbnRlZCBieSBjYWxscyB0byBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0IHdpdGggdmFsaWQgb3V0cHV0Ci0gICAgICAgIC8vIGJ1ZmZlcnMKKyAgICAgICAgLy8gYW5kIGlucHV0IGJ1ZmZlcnMKICAgICAgICAgaW50ICAgICBudW1CdWZmZXJzTGVmdDsKKyAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7CisgICAgICAgIC8vIElmIHRoaXMgcmVxdWVzdCBoYXMgYW55IGlucHV0IGJ1ZmZlcgorICAgICAgICBib29sIGhhc0lucHV0QnVmZmVyOwogCi0gICAgICAgIC8vIEZpZWxkcyB1c2VkIGJ5IHRoZSBwYXJ0aWFsIHJlc3VsdCBxdWlyayBvbmx5Ci0gICAgICAgIHN0cnVjdCBQYXJ0aWFsUmVzdWx0UXVpcmtJbkZsaWdodCB7CisgICAgICAgIC8vIEZpZWxkcyB1c2VkIGJ5IHRoZSBwYXJ0aWFsIHJlc3VsdCBvbmx5CisgICAgICAgIHN0cnVjdCBQYXJ0aWFsUmVzdWx0SW5GbGlnaHQgewogICAgICAgICAgICAgLy8gU2V0IGJ5IHByb2Nlc3NfY2FwdHVyZV9yZXN1bHQgb25jZSAzQSBoYXMgYmVlbiBzZW50IHRvIGNsaWVudHMKICAgICAgICAgICAgIGJvb2wgICAgaGF2ZVNlbnQzQTsKICAgICAgICAgICAgIC8vIFJlc3VsdCBtZXRhZGF0YSBjb2xsZWN0ZWQgc28gZmFyLCB3aGVuIHBhcnRpYWwgcmVzdWx0cyBhcmUgaW4gdXNlCiAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBjb2xsZWN0ZWRSZXN1bHQ7CiAKLSAgICAgICAgICAgIFBhcnRpYWxSZXN1bHRRdWlya0luRmxpZ2h0KCk6CisgICAgICAgICAgICBQYXJ0aWFsUmVzdWx0SW5GbGlnaHQoKToKICAgICAgICAgICAgICAgICAgICAgaGF2ZVNlbnQzQShmYWxzZSkgewogICAgICAgICAgICAgfQotICAgICAgICB9IHBhcnRpYWxSZXN1bHRRdWlyazsKKyAgICAgICAgfSBwYXJ0aWFsUmVzdWx0OwogCiAgICAgICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGJ5IEtleWVkVmVjdG9yCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCgpIDoKLSAgICAgICAgICAgICAgICByZXF1ZXN0SWQoMCksCiAgICAgICAgICAgICAgICAgY2FwdHVyZVRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKICAgICAgICAgICAgICAgICBoYXZlUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAotICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KDApIHsKKyAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdCgwKSwKKyAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSl7CiAgICAgICAgIH0KIAotICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IGlkLCBpbnQgbnVtQnVmZmVycykgOgotICAgICAgICAgICAgICAgIHJlcXVlc3RJZChpZCksCisgICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycykgOgogICAgICAgICAgICAgICAgIGNhcHR1cmVUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCiAgICAgICAgICAgICAgICAgaGF2ZVJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdChudW1CdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQobnVtQnVmZmVycyksCisgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoZmFsc2UpewogICAgICAgICB9Ci0gICAgfTsKKworICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzKSA6CisgICAgICAgICAgICAgICAgY2FwdHVyZVRpbWVzdGFtcCgwKSwKKyAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKKyAgICAgICAgICAgICAgICBoYXZlUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAorICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KG51bUJ1ZmZlcnMpLAorICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyhleHRyYXMpLAorICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKXsKKyAgICAgICAgfQorCisgICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMsIGJvb2wgaGFzSW5wdXQpIDoKKyAgICAgICAgICAgICAgICBjYXB0dXJlVGltZXN0YW1wKDApLAorICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLAorICAgICAgICAgICAgICAgIGhhdmVSZXN1bHRNZXRhZGF0YShmYWxzZSksCisgICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQobnVtQnVmZmVycyksCisgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzKGV4dHJhcyksCisgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoaGFzSW5wdXQpeworICAgICAgICB9Cit9OwogICAgIC8vIE1hcCBmcm9tIGZyYW1lIG51bWJlciB0byB0aGUgaW4tZmxpZ2h0IHJlcXVlc3Qgc3RhdGUKICAgICB0eXBlZGVmIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJbkZsaWdodFJlcXVlc3Q+IEluRmxpZ2h0TWFwOwogCiAgICAgTXV0ZXggICAgICAgICAgICAgICAgICBtSW5GbGlnaHRMb2NrOyAvLyBQcm90ZWN0cyBtSW5GbGlnaHRNYXAKICAgICBJbkZsaWdodE1hcCAgICAgICAgICAgIG1JbkZsaWdodE1hcDsKIAotICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQoaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMpOworICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0KTsKIAogICAgIC8qKgotICAgICAqIEZvciB0aGUgcGFydGlhbCByZXN1bHQgcXVpcmssIGNoZWNrIGlmIGFsbCAzQSBzdGF0ZSBmaWVsZHMgYXJlIGF2YWlsYWJsZQorICAgICAqIEZvciB0aGUgcGFydGlhbCByZXN1bHQsIGNoZWNrIGlmIGFsbCAzQSBzdGF0ZSBmaWVsZHMgYXJlIGF2YWlsYWJsZQogICAgICAqIGFuZCBpZiBzbywgcXVldWUgdXAgM0Etb25seSByZXN1bHQgdG8gdGhlIGNsaWVudC4gUmV0dXJucyB0cnVlIGlmIDNBCiAgICAgICogaXMgc2VudC4KICAgICAgKi8KLSAgICBib29sIHByb2Nlc3NQYXJ0aWFsM0FRdWlyayhpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBwYXJ0aWFsKTsKKyAgICBib29sIHByb2Nlc3NQYXJ0aWFsM0FSZXN1bHQodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgcGFydGlhbCwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKIAogICAgIC8vIEhlbHBlcnMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgM0EgbWV0YWRhdGEgaW50byB0by9mcm9tIHBhcnRpYWwgcmVzdWx0cwogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICAgYm9vbCBnZXQzQVJlc3VsdChjb25zdCBDYW1lcmFNZXRhZGF0YSYgcmVzdWx0LCBpbnQzMl90IHRhZywKLSAgICAgICAgICAgIFQqIHZhbHVlLCBpbnQzMl90IGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIFQqIHZhbHVlLCB1aW50MzJfdCBmcmFtZU51bWJlcik7CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgIGJvb2wgaW5zZXJ0M0FSZXN1bHQoQ2FtZXJhTWV0YWRhdGEgJnJlc3VsdCwgaW50MzJfdCB0YWcsIGNvbnN0IFQqIHZhbHVlLAotICAgICAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlcik7CiAgICAgLyoqCiAgICAgICogVHJhY2tpbmcgZm9yIGlkbGUgZGV0ZWN0aW9uCiAgICAgICovCkBAIC01MTgsNyArNjIwLDcgQEAKIAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlcjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyOwotICAgIExpc3Q8Q2FtZXJhTWV0YWRhdGE+ICAgbVJlc3VsdFF1ZXVlOworICAgIExpc3Q8Q2FwdHVyZVJlc3VsdD4gICBtUmVzdWx0UXVldWU7CiAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICBtUmVzdWx0U2lnbmFsOwogICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICAqbUxpc3RlbmVyOwogCkBAIC01MzEsNiArNjMzLDEyIEBACiAKICAgICB2b2lkIG5vdGlmeShjb25zdCBjYW1lcmEzX25vdGlmeV9tc2cgKm1zZyk7CiAKKyAgICAvLyBTcGVjaWZpYyBub3RpZnkgaGFuZGxlcnMKKyAgICB2b2lkIG5vdGlmeUVycm9yKGNvbnN0IGNhbWVyYTNfZXJyb3JfbXNnX3QgJm1zZywKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcik7CisgICAgdm9pZCBub3RpZnlTaHV0dGVyKGNvbnN0IGNhbWVyYTNfc2h1dHRlcl9tc2dfdCAmbXNnLAorICAgICAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKTsKKwogICAgIC8qKgogICAgICAqIFN0YXRpYyBjYWxsYmFjayBmb3J3YXJkaW5nIG1ldGhvZHMgZnJvbSBIQUwgdG8gaW5zdGFuY2UKICAgICAgKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjU2YjA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtRHVtbXlTdHJlYW0iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSAiQ2FtZXJhM0R1bW15U3RyZWFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGNhbWVyYTMgeworCitDYW1lcmEzRHVtbXlTdHJlYW06OkNhbWVyYTNEdW1teVN0cmVhbShpbnQgaWQpIDoKKyAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCBEVU1NWV9XSURUSCwgRFVNTVlfSEVJR0hULAorICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgRFVNTVlfRk9STUFUKSB7CisKK30KKworQ2FtZXJhM0R1bW15U3RyZWFtOjp+Q2FtZXJhM0R1bW15U3RyZWFtKCkgeworCit9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6Z2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRHVtbXkgc3RyZWFtIGNhbm5vdCBwcm9kdWNlIGJ1ZmZlcnMhIiwgbUlkKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKAorICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEdW1teSBzdHJlYW0gY2Fubm90IHJldHVybiBidWZmZXJzISIsIG1JZCk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IER1bW15IHN0cmVhbSBjYW5ub3QgcmV0dXJuIGJ1ZmZlcnMhIiwgbUlkKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3ZvaWQgQ2FtZXJhM0R1bW15U3RyZWFtOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgeworICAgICh2b2lkKSBhcmdzOworICAgIFN0cmluZzggbGluZXM7CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgU3RyZWFtWyVkXTogRHVtbXlcbiIsIG1JZCk7CisgICAgd3JpdGUoZmQsIGxpbmVzLnN0cmluZygpLCBsaW5lcy5zaXplKCkpOworCisgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6ZHVtcChmZCwgYXJncyk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6c2V0VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIC8vIERvIG5vdGhpbmcKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6Y29uZmlndXJlUXVldWVMb2NrZWQoKSB7CisgICAgLy8gRG8gbm90aGluZworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpkaXNjb25uZWN0TG9ja2VkKCkgeworICAgIG1TdGF0ZSA9IChtU3RhdGUgPT0gU1RBVEVfSU5fUkVDT05GSUcpID8gU1RBVEVfSU5fQ09ORklHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTVEFURV9DT05TVFJVQ1RFRDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIHsKKyAgICAqdXNhZ2UgPSBEVU1NWV9VU0FHRTsKKyAgICByZXR1cm4gT0s7Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTQyNjIzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19EVU1NWV9TVFJFQU1fSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19EVU1NWV9TVFJFQU1fSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisKKyNpbmNsdWRlICJDYW1lcmEzU3RyZWFtLmgiCisjaW5jbHVkZSAiQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIgorI2luY2x1ZGUgIkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCisvKioKKyAqIEEgZHVtbXkgb3V0cHV0IHN0cmVhbSBjbGFzcywgdG8gYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIHdoZW4gbm8gdmFsaWQKKyAqIHN0cmVhbXMgYXJlIGNvbmZpZ3VyZWQgYnkgdGhlIGNsaWVudC4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgY2FtZXJhIEhBTCB2My4yIG9yIG9sZGVyIGRpc2FsbG93IGNvbmZpZ3VyaW5nCisgKiAwIG91dHB1dCBzdHJlYW1zLCB3aGlsZSB0aGUgcHVibGljIGNhbWVyYTIgQVBJIGFsbG93cyBmb3IgaXQuCisgKi8KK2NsYXNzIENhbWVyYTNEdW1teVN0cmVhbSA6CisgICAgICAgIHB1YmxpYyBDYW1lcmEzSU9TdHJlYW1CYXNlLAorICAgICAgICBwdWJsaWMgQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZSB7CisKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIFNldCB1cCBhIGR1bW15IHN0cmVhbTsgZG9lc24ndCBhY3R1YWxseSBjb25uZWN0IHRvIGFueXRoaW5nLCBhbmQgdXNlcworICAgICAqIGEgZGVmYXVsdCBkdW1teSBmb3JtYXQgYW5kIHNpemUuCisgICAgICovCisgICAgQ2FtZXJhM0R1bW15U3RyZWFtKGludCBpZCk7CisKKyAgICB2aXJ0dWFsIH5DYW1lcmEzRHVtbXlTdHJlYW0oKTsKKworICAgIC8qKgorICAgICAqIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCisgICAgICovCisKKyAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKKworICAgIHN0YXR1c190ICAgICAgICAgc2V0VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0pOworCisgIHByb3RlY3RlZDoKKworICAgIC8qKgorICAgICAqIE5vdGUgdGhhdCB3ZSByZWxlYXNlIHRoZSBsb2NrIGJyaWVmbHkgaW4gdGhpcyBmdW5jdGlvbgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAorICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdExvY2tlZCgpOworCisgIHByaXZhdGU6CisKKyAgICAvLyBEZWZhdWx0IGR1bW15IHBhcmFtZXRlcnM7IDMyMHgyNDAgaXMgYSByZXF1aXJlZCBzaXplIGZvciBhbGwgZGV2aWNlcywKKyAgICAvLyBvdGhlcndpc2UgYWN0IGxpa2UgYSBTdXJmYWNlVmlldyB3b3VsZC4KKyAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX1dJRFRIID0gMzIwOworICAgIHN0YXRpYyBjb25zdCBpbnQgRFVNTVlfSEVJR0hUID0gMjQwOworICAgIHN0YXRpYyBjb25zdCBpbnQgRFVNTVlfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBEVU1NWV9VU0FHRSA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVI7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBDYW1lcmEzU3RyZWFtIGludGVyZmFjZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAorICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSk7CisKK307IC8vIGNsYXNzIENhbWVyYTNEdW1teVN0cmVhbQorCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAppbmRleCBkYTUxMjI4Li5jYzY2NDU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKQEAgLTE4LDggKzE4LDcgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0vLyBUaGlzIGlzIG5lZWRlZCBmb3Igc3RkaW50LmggdG8gZGVmaW5lIElOVDY0X01BWCBpbiBDKysKLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgpAQCAtMzUsNyArMzQsOCBAQAogICAgICAgICBDYW1lcmEzU3RyZWFtKGlkLCB0eXBlLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIG1heFNpemUsIGZvcm1hdCksCiAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50KDApLAotICAgICAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudCgwKSwKKyAgICAgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50KDApLAorICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50KDApLAogICAgICAgICBtRnJhbWVDb3VudCgwKSwKICAgICAgICAgbUxhc3RUaW1lc3RhbXAoMCkgewogCkBAIC01NCwxMCArNTQsMTAgQEAKIAogYm9vbCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpoYXNPdXRzdGFuZGluZ0J1ZmZlcnNMb2NrZWQoKSBjb25zdCB7CiAgICAgbnNlY3NfdCBzaWduYWxUaW1lID0gbUNvbWJpbmVkRmVuY2UtPmdldFNpZ25hbFRpbWUoKTsKLSAgICBBTE9HVigiJXM6IFN0cmVhbSAlZDogSGFzICVkIG91dHN0YW5kaW5nIGJ1ZmZlcnMsIgotICAgICAgICAgICAgIiBidWZmZXIgc2lnbmFsIHRpbWUgaXMgJWxsZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbURlcXVldWVkQnVmZmVyQ291bnQsIHNpZ25hbFRpbWUpOwotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA+IDAgfHwgc2lnbmFsVGltZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICBBTE9HVigiJXM6IFN0cmVhbSAlZDogSGFzICV6dSBvdXRzdGFuZGluZyBidWZmZXJzLCIKKyAgICAgICAgICAgICIgYnVmZmVyIHNpZ25hbCB0aW1lIGlzICUiIFBSSWQ2NCwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQsIHNpZ25hbFRpbWUpOworICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPiAwIHx8IHNpZ25hbFRpbWUgPT0gSU5UNjRfTUFYKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC03MCwxMyArNzAsMTMgQEAKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIERpbXM6ICVkIHggJWQsIGZvcm1hdCAweCV4XG4iLAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OndpZHRoLCBjYW1lcmEzX3N0cmVhbTo6aGVpZ2h0LAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OmZvcm1hdCk7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBNYXggc2l6ZTogJWRcbiIsIG1NYXhTaXplKTsKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIE1heCBzaXplOiAlenVcbiIsIG1NYXhTaXplKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFVzYWdlOiAlZCwgbWF4IEhBTCBidWZmZXJzOiAlZFxuIiwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSwgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKLSAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIEZyYW1lcyBwcm9kdWNlZDogJWQsIGxhc3QgdGltZXN0YW1wOiAlbGxkIG5zXG4iLAorICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWVzIHByb2R1Y2VkOiAlZCwgbGFzdCB0aW1lc3RhbXA6ICUiIFBSSWQ2NCAiIG5zXG4iLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1MYXN0VGltZXN0YW1wKTsKLSAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFRvdGFsIGJ1ZmZlcnM6ICVkLCBjdXJyZW50bHkgZGVxdWV1ZWQ6ICVkXG4iLAotICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQsIG1EZXF1ZXVlZEJ1ZmZlckNvdW50KTsKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFRvdGFsIGJ1ZmZlcnM6ICV6dSwgY3VycmVudGx5IGRlcXVldWVkOiAlenVcbiIsCisgICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudCwgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50KTsKICAgICB3cml0ZShmZCwgbGluZXMuc3RyaW5nKCksIGxpbmVzLnNpemUoKSk7CiB9CiAKQEAgLTEwNSw2ICsxMDUsMTQgQEAKICAgICByZXR1cm4gbVRvdGFsQnVmZmVyQ291bnQ7CiB9CiAKK3NpemVfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSB7CisgICAgcmV0dXJuIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQ7Cit9CisKK3NpemVfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpIHsKKyAgICByZXR1cm4gKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCAtIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQpOworfQorCiBzdGF0dXNfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpkaXNjb25uZWN0TG9ja2VkKCkgewogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfSU5fUkVDT05GSUc6CkBAIC0xMTgsOSArMTI2LDkgQEAKICAgICAgICAgICAgIHJldHVybiAtRU5PVENPTk47CiAgICAgfQogCi0gICAgaWYgKG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID4gMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbid0IGRpc2Nvbm5lY3Qgd2l0aCAlZCBidWZmZXJzIHN0aWxsIGRlcXVldWVkISIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGVxdWV1ZWRCdWZmZXJDb3VudCk7CisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA+IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBkaXNjb25uZWN0IHdpdGggJXp1IGJ1ZmZlcnMgc3RpbGwgZGVxdWV1ZWQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTEzMSw3ICsxMzksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3F1aXJlRmVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbGVhc2VGZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvdXRwdXQpIHsKICAgICAvKioKICAgICAgKiBOb3RlIHRoYXQgYWxsIGZlbmNlcyBhcmUgbm93IG93bmVkIGJ5IEhBTC4KICAgICAgKi8KQEAgLTE0NSwxNCArMTU0LDI1IEBACiAgICAgYnVmZmVyLnN0YXR1cyA9IHN0YXR1czsKIAogICAgIC8vIEluZm9ybSB0cmFja2VyIGFib3V0IGJlY29taW5nIGJ1c3kKLSAgICBpZiAobURlcXVldWVkQnVmZmVyQ291bnQgPT0gMCAmJiBtU3RhdGUgIT0gU1RBVEVfSU5fQ09ORklHICYmCisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSAwICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYKICAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFURV9JTl9SRUNPTkZJRykgeworICAgICAgICAvKioKKyAgICAgICAgICogQXZvaWQgYSBzcHVyaW91cyBJRExFLT5BQ1RJVkUtPklETEUgdHJhbnNpdGlvbiB3aGVuIHVzaW5nIGJ1ZmZlcnMKKyAgICAgICAgICogYmVmb3JlL2FmdGVyIHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIGR1cmluZyBpbml0aWFsIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogb3IgcmUtY29uZmlndXJhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVE9ETzogSU5fQ09ORklHIGFuZCBJTl9SRUNPTkZJRyBjaGVja3Mgb25seSBtYWtlIHNlbnNlIGZvciA8SEFMMy4yCisgICAgICAgICAqLwogICAgICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CiAgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKG1TdGF0dXNJZCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbURlcXVldWVkQnVmZmVyQ291bnQrKzsKKyAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQrKzsKKworICAgIGlmIChvdXRwdXQpIHsKKyAgICAgICAgbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudCsrOworICAgIH0KIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0QnVmZmVyUHJlY29uZGl0aW9uQ2hlY2tMb2NrZWQoKSBjb25zdCB7CkBAIC0xNjQsMTUgKzE4NCw2IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICAvLyBPbmx5IGxpbWl0IGRlcXVldWUgYW1vdW50IHdoZW4gZnVsbHkgY29uZmlndXJlZAotICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCAmJgotICAgICAgICAgICAgbURlcXVldWVkQnVmZmVyQ291bnQgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKSB7Ci0gICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBBbHJlYWR5IGRlcXVldWVkIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyIKLSAgICAgICAgICAgICAgICAiIGJ1ZmZlcnMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLAotICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE4NCw3ICsxOTUsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA9PSAwKSB7CisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBObyBidWZmZXJzIG91dHN0YW5kaW5nIHRvIHJldHVybiIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBtSWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yMjIsOSArMjMzLDIwIEBACiAgICAgICAgIG1Db21iaW5lZEZlbmNlID0gRmVuY2U6Om1lcmdlKG1OYW1lLCBtQ29tYmluZWRGZW5jZSwgcmVsZWFzZUZlbmNlKTsKICAgICB9CiAKLSAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudC0tOwotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA9PSAwICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYKKyAgICBpZiAob3V0cHV0KSB7CisgICAgICAgIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQtLTsKKyAgICB9CisKKyAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQtLTsKKyAgICBpZiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID09IDAgJiYgbVN0YXRlICE9IFNUQVRFX0lOX0NPTkZJRyAmJgogICAgICAgICAgICAgbVN0YXRlICE9IFNUQVRFX0lOX1JFQ09ORklHKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBdm9pZCBhIHNwdXJpb3VzIElETEUtPkFDVElWRS0+SURMRSB0cmFuc2l0aW9uIHdoZW4gdXNpbmcgYnVmZmVycworICAgICAgICAgKiBiZWZvcmUvYWZ0ZXIgcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgZHVyaW5nIGluaXRpYWwgY29uZmlndXJhdGlvbgorICAgICAgICAgKiBvciByZS1jb25maWd1cmF0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBUT0RPOiBJTl9DT05GSUcgYW5kIElOX1JFQ09ORklHIGNoZWNrcyBvbmx5IG1ha2Ugc2Vuc2UgZm9yIDxIQUwzLjIKKyAgICAgICAgICovCiAgICAgICAgIEFMT0dWKCIlczogU3RyZWFtICVkOiBBbGwgYnVmZmVycyByZXR1cm5lZDsgbm93IGlkbGUiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgbUlkKTsKICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKaW5kZXggZmNiOWQwNC4uYTM1YzI5MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKQEAgLTQ4LDcgKzQ4LDEwIEBACiAgIHByb3RlY3RlZDoKICAgICBzaXplX3QgICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudDsKICAgICAvLyBzdW0gb2YgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3F1aXJlZCBieSBIQUwKLSAgICBzaXplX3QgICAgICAgICAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudDsKKyAgICBzaXplX3QgICAgICAgICAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQ7CisgICAgLy8gbnVtYmVyIG9mIG91dHB1dCBidWZmZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3F1aXJlZCBieSBIQUwuIFRoaXMgd2lsbCBiZQorICAgIC8vIFJlZHVuZGFudCB3aGVuIGNhbWVyYTMgc3RyZWFtcyBhcmUgbm8gbG9uZ2VyIGJpZGlyZWN0aW9uYWwgc3RyZWFtcy4KKyAgICBzaXplX3QgICAgICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50OwogICAgIENvbmRpdGlvbiAgICAgICAgIG1CdWZmZXJSZXR1cm5lZFNpZ25hbDsKICAgICB1aW50MzJfdCAgICAgICAgICBtRnJhbWVDb3VudDsKICAgICAvLyBMYXN0IHJlY2VpdmVkIG91dHB1dCBidWZmZXIncyB0aW1lc3RhbXAKQEAgLTc2LDYgKzc5LDEwIEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEJ1ZmZlckNvdW50TG9ja2VkKCk7CiAKKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpOworCisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgPSAwOwogCiAgICAgc3RhdHVzX3QgZ2V0QnVmZmVyUHJlY29uZGl0aW9uQ2hlY2tMb2NrZWQoKSBjb25zdDsKQEAgLTkyLDcgKzk5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3F1aXJlX2ZlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVsZWFzZV9mZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG91dHB1dCk7CiAKIH07IC8vIGNsYXNzIENhbWVyYTNJT1N0cmVhbUJhc2UKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IDVhYTlhM2UuLjMxOWJlMWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgKiBpbiB3aGljaCBjYXNlIHdlIHJlYXNzaWduIGl0IHRvIGFjcXVpcmVfZmVuY2UKICAgICAgKi8KICAgICBoYW5kb3V0QnVmZmVyTG9ja2VkKCpidWZmZXIsICYoYW5iLT5oYW5kbGUpLCAvKmFjcXVpcmVGZW5jZSovZmVuY2VGZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LLCAvKm91dHB1dCovZmFsc2UpOwogICAgIG1CdWZmZXJzSW5GbGlnaHQucHVzaF9iYWNrKGJ1ZmZlckl0ZW0pOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTk5LDE0ICsxOTksMzYgQEAKICAgICBhc3NlcnQobU1heFNpemUgPT0gMCk7CiAgICAgYXNzZXJ0KGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKTsKIAotICAgIG1Ub3RhbEJ1ZmZlckNvdW50ID0gQnVmZmVyUXVldWU6Ok1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgKwotICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzOwotICAgIG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPSAwOwogICAgIG1GcmFtZUNvdW50ID0gMDsKIAogICAgIGlmIChtQ29uc3VtZXIuZ2V0KCkgPT0gMCkgewotICAgICAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICAgICAgbUNvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihicSwgY2FtZXJhM19zdHJlYW06OnVzYWdlLAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisKKyAgICAgICAgaW50IG1pblVuZGVxdWV1ZWRCdWZmZXJzID0gMDsKKyAgICAgICAgcmVzID0gcHJvZHVjZXItPnF1ZXJ5KE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSyB8fCBtaW5VbmRlcXVldWVkQnVmZmVycyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDb3VsZCBub3QgcXVlcnkgbWluIHVuZGVxdWV1ZWQgYnVmZmVycyAoZXJyb3IgJWQsIGJ1ZkNvdW50ICVkKSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgcmVzLCBtaW5VbmRlcXVldWVkQnVmZmVycyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBtaW5CdWZzID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtaW5VbmRlcXVldWVkQnVmZmVycyk7CisgICAgICAgIC8qCisgICAgICAgICAqIFdlIHByb21pc2UgbmV2ZXIgdG8gJ2FjcXVpcmUnIG1vcmUgdGhhbiBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMKKyAgICAgICAgICogYXQgYW55IG9uZSB0aW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBCb29zdCB0aGUgbnVtYmVyIHVwIHRvIG1lZXQgdGhlIG1pbmltdW0gcmVxdWlyZWQgYnVmZmVyIGNvdW50LgorICAgICAgICAgKgorICAgICAgICAgKiAoTm90ZSB0aGF0IHRoaXMgc2V0cyBjb25zdW1lci1zaWRlIGJ1ZmZlciBjb3VudCBvbmx5LAorICAgICAgICAgKiBhbmQgbm90IHRoZSBzdW0gb2YgcHJvZHVjZXIrY29uc3VtZXIgc2lkZSBhcyBpbiBvdGhlciBjYW1lcmEgc3RyZWFtcykuCisgICAgICAgICAqLworICAgICAgICBtVG90YWxCdWZmZXJDb3VudCA9IGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyA+IG1pbkJ1ZnMgPworICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzIDogbWluQnVmczsKKyAgICAgICAgLy8gVE9ETzogc29tZWhvdyBzZXQgdGhlIHRvdGFsIGJ1ZmZlciBjb3VudCB3aGVuIHByb2R1Y2VyIGNvbm5lY3RzPworCisgICAgICAgIG1Db25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoY29uc3VtZXIsIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudCk7CiAgICAgICAgIG1Db25zdW1lci0+c2V0TmFtZShTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYTMtSW5wdXRTdHJlYW0tJWQiLCBtSWQpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAppbmRleCA2ODFkNjg0Li5hZTQ5NDY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKQEAgLTQ0LDYgKzQ0LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0OwogCisgICAgLy8gVE9ETzogZXhwb3NlIGFuIGludGVyZmFjZSB0byBnZXQgdGhlIElHcmFwaGljQnVmZmVyUHJvZHVjZXIKKwogICBwcml2YXRlOgogCiAgICAgdHlwZWRlZiBCdWZmZXJJdGVtQ29uc3VtZXI6OkJ1ZmZlckl0ZW0gQnVmZmVySXRlbTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDY4Mjc1NWQuLjc3YWQ1MDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcApAQCAtMzcsNyArMzcsOCBAQAogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBmb3JtYXQpLAogICAgICAgICBtQ29uc3VtZXIoY29uc3VtZXIpLAotICAgICAgICBtVHJhbnNmb3JtKDApIHsKKyAgICAgICAgbVRyYW5zZm9ybSgwKSwKKyAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIodHJ1ZSkgewogCiAgICAgaWYgKG1Db25zdW1lciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ29uc3VtZXIgaXMgTlVMTCEiLCBfX0ZVTkNUSU9OX18pOwpAQCAtNTEsNyArNTIsOCBAQAogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsIG1heFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KSwKICAgICAgICAgbUNvbnN1bWVyKGNvbnN1bWVyKSwKLSAgICAgICAgbVRyYW5zZm9ybSgwKSB7CisgICAgICAgIG1UcmFuc2Zvcm0oMCksCisgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyKHRydWUpIHsKIAogICAgIGlmIChmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CiAgICAgICAgIEFMT0dFKCIlczogQmFkIGZvcm1hdCBmb3Igc2l6ZS1vbmx5IHN0cmVhbTogJWQiLCBfX0ZVTkNUSU9OX18sCkBAIC0xMTksNyArMTIxLDcgQEAKICAgICAgKiBpbiB3aGljaCBjYXNlIHdlIHJlYXNzaWduIGl0IHRvIGFjcXVpcmVfZmVuY2UKICAgICAgKi8KICAgICBoYW5kb3V0QnVmZmVyTG9ja2VkKCpidWZmZXIsICYoYW5iLT5oYW5kbGUpLCAvKmFjcXVpcmVGZW5jZSovZmVuY2VGZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LLCAvKm91dHB1dCovdHJ1ZSk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0yMDIsNiArMjA0LDE1IEBACiAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgeworICAgICAgICBpZiAobVRyYWNlRmlyc3RCdWZmZXIgJiYgKHN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX09VVFBVVCkpIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIHRyYWNlTG9nWzQ4XTsKKyAgICAgICAgICAgICAgICBzbnByaW50Zih0cmFjZUxvZywgc2l6ZW9mKHRyYWNlTG9nKSwgIlN0cmVhbSAlZDogZmlyc3QgZnVsbCBidWZmZXJcbiIsIG1JZCk7CisgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUodHJhY2VMb2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIgPSBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJlcyA9IGN1cnJlbnRDb25zdW1lci0+cXVldWVCdWZmZXIoY3VycmVudENvbnN1bWVyLmdldCgpLAogICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZihidWZmZXIuYnVmZmVyLCBBTmF0aXZlV2luZG93QnVmZmVyLCBoYW5kbGUpLAogICAgICAgICAgICAgICAgIGFud1JlbGVhc2VGZW5jZSk7CkBAIC0yNTcsNiArMjY4LDcgQEAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCkgewogICAgIHN0YXR1c190IHJlczsKIAorICAgIG1UcmFjZUZpcnN0QnVmZmVyID0gdHJ1ZTsKICAgICBpZiAoKHJlcyA9IENhbWVyYTNJT1N0cmVhbUJhc2U6OmNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtMjg5LDIwICszMDEsMjUgQEAKIAogICAgIGlmIChtTWF4U2l6ZSA9PSAwKSB7CiAgICAgICAgIC8vIEZvciBidWZmZXJzIG9mIGtub3duIHNpemUKLSAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQ29uc3VtZXIuZ2V0KCksCi0gICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OndpZHRoLCBjYW1lcmEzX3N0cmVhbTo6aGVpZ2h0LAotICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQpOworICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMobUNvbnN1bWVyLmdldCgpLAorICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwgY2FtZXJhM19zdHJlYW06OmhlaWdodCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRm9yIGJ1ZmZlcnMgd2l0aCBib3VuZGVkIHNpemUKLSAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQ29uc3VtZXIuZ2V0KCksCi0gICAgICAgICAgICAgICAgbU1heFNpemUsIDEsCi0gICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OmZvcm1hdCk7CisgICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhtQ29uc3VtZXIuZ2V0KCksCisgICAgICAgICAgICAgICAgbU1heFNpemUsIDEpOwogICAgIH0KICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGdlb21ldHJ5IgotICAgICAgICAgICAgICAgICIgJWQgeCAlZCwgZm9ybWF0ICV4IGZvciBzdHJlYW0gJWQiLAorICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBkaW1lbnNpb25zIgorICAgICAgICAgICAgICAgICIgJWQgeCAlZCAobWF4U2l6ZSAlenUpIGZvciBzdHJlYW0gJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06OndpZHRoLCBjYW1lcmEzX3N0cmVhbTo6aGVpZ2h0LAotICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQsIG1JZCk7CisgICAgICAgICAgICAgICAgbU1heFNpemUsIG1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KG1Db25zdW1lci5nZXQoKSwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZm9ybWF0ICUjeCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQsIG1JZCk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCkBAIC0zMjQsNyArMzQxLDcgQEAKICAgICB9CiAKICAgICBtVG90YWxCdWZmZXJDb3VudCA9IG1heENvbnN1bWVyQnVmZmVycyArIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVyczsKLSAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudCA9IDA7CisgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID0gMDsKICAgICBtRnJhbWVDb3VudCA9IDA7CiAgICAgbUxhc3RUaW1lc3RhbXAgPSAwOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCmluZGV4IDZjYmI5ZjQuLmJlMjc4YzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCkBAIC03NiwxMiArNzYsMTYgQEAKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdExvY2tlZCgpOworCiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbUNvbnN1bWVyOwogICBwcml2YXRlOgogICAgIGludCAgICAgICAgICAgICAgIG1UcmFuc2Zvcm07CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICBzZXRUcmFuc2Zvcm1Mb2NrZWQoaW50IHRyYW5zZm9ybSk7CiAKKyAgICBib29sIG1UcmFjZUZpcnN0QnVmZmVyOworCiAgICAgLyoqCiAgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKICAgICAgKi8KQEAgLTkxLDcgKzk1LDYgQEAKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAppbmRleCA2ZDJjZjk0Li4zYzBlOTA4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuaCIKIAorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogbmFtZXNwYWNlIGNhbWVyYTMgewpAQCAtMTM3LDYgKzEzOSw3IEBACiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9DT05TVFJVQ1RFRCkgewogICAgICAgICBtU3RhdGUgPSBTVEFURV9JTl9DT05GSUc7CiAgICAgfSBlbHNlIHsgLy8gbVN0YXRlID09IFNUQVRFX0NPTkZJR1VSRUQKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU3RhdGUgIT0gU1RBVEVfQ09ORklHVVJFRCwgIkludmFsaWQgc3RhdGU6IDB4JXgiLCBtU3RhdGUpOwogICAgICAgICBtU3RhdGUgPSBTVEFURV9JTl9SRUNPTkZJRzsKICAgICB9CiAKQEAgLTIwNiwxMSArMjA5LDYxIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6Y2FuY2VsQ29uZmlndXJhdGlvbigpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX0VSUk9SOgorICAgICAgICAgICAgQUxPR0UoIiVzOiBJbiBlcnJvciBzdGF0ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGNhc2UgU1RBVEVfSU5fQ09ORklHOgorICAgICAgICBjYXNlIFNUQVRFX0lOX1JFQ09ORklHOgorICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX0NPTlNUUlVDVEVEOgorICAgICAgICBjYXNlIFNUQVRFX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBjYW5jZWwgY29uZmlndXJhdGlvbiB0aGF0IGhhc24ndCBiZWVuIHN0YXJ0ZWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIHN0YXRlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UgPSBvbGRVc2FnZTsKKyAgICBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPSBvbGRNYXhCdWZmZXJzOworCisgICAgbVN0YXRlID0gKG1TdGF0ZSA9PSBTVEFURV9JTl9SRUNPTkZJRykgPyBTVEFURV9DT05GSUdVUkVEIDogU1RBVEVfQ09OU1RSVUNURUQ7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRCdWZmZXIoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIHN0YXR1c190IHJlcyA9IGdldEJ1ZmZlckxvY2tlZChidWZmZXIpOworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBjb25maWd1cmVkIGFscmVhZHkuCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVEKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBnZXQgYnVmZmVycyBpZiBzdHJlYW0gaXMgbm90IGluIENPTkZJR1VSRUQgc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gV2FpdCBmb3IgbmV3IGJ1ZmZlciByZXR1cm5lZCBiYWNrIGlmIHdlIGFyZSBydW5uaW5nIGludG8gdGhlIGxpbWl0LgorICAgIGlmIChnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9PSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBBbHJlYWR5IGRlcXVldWVkIG1heCBvdXRwdXQgYnVmZmVycyAoJWQpLCB3YWl0IGZvciBuZXh0IHJldHVybmVkIG9uZS4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKKyAgICAgICAgcmVzID0gbU91dHB1dEJ1ZmZlclJldHVybmVkU2lnbmFsLndhaXRSZWxhdGl2ZShtTG9jaywga1dhaXRGb3JCdWZmZXJEdXJhdGlvbik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB3YWl0IGZvciBvdXRwdXQgYnVmZmVyIHJldHVybiB0aW1lZCBvdXQgYWZ0ZXIgJWxsZG1zIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAga1dhaXRGb3JCdWZmZXJEdXJhdGlvbiAvIDEwMDAwMDBMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gZ2V0QnVmZmVyTG9ja2VkKGJ1ZmZlcik7CiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKCpidWZmZXIsIC8qYWNxdWlyZWQqL3RydWUsIC8qb3V0cHV0Ki90cnVlKTsKICAgICB9CkBAIC0yMjMsOSArMjc2LDE4IEBACiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKKyAgICAvKioKKyAgICAgKiBUT0RPOiBDaGVjayB0aGF0IHRoZSBzdGF0ZSBpcyB2YWxpZCBmaXJzdC4KKyAgICAgKgorICAgICAqIDxIQUwzLjIgSU5fQ09ORklHIGFuZCBJTl9SRUNPTkZJRyBpbiBhZGRpdGlvbiB0byBDT05GSUdVUkVELgorICAgICAqID49IEhBTDMuMiBDT05GSUdVUkVEIG9ubHkKKyAgICAgKgorICAgICAqIERvIHRoaXMgZm9yIGdldEJ1ZmZlciBhcyB3ZWxsLgorICAgICAqLwogICAgIHN0YXR1c190IHJlcyA9IHJldHVybkJ1ZmZlckxvY2tlZChidWZmZXIsIHRpbWVzdGFtcCk7CiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGJ1ZmZlciwgLyphY3F1aXJlZCovZmFsc2UsIC8qb3V0cHV0Ki90cnVlKTsKKyAgICAgICAgbU91dHB1dEJ1ZmZlclJldHVybmVkU2lnbmFsLnNpZ25hbCgpOwogICAgIH0KIAogICAgIHJldHVybiByZXM7CkBAIC0yMzQsOCArMjk2LDMwIEBACiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRJbnB1dEJ1ZmZlcihjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgc3RhdHVzX3QgcmVzID0gZ2V0SW5wdXRCdWZmZXJMb2NrZWQoYnVmZmVyKTsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgY29uZmlndXJlZCBhbHJlYWR5LgorICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgZ2V0IGlucHV0IGJ1ZmZlcnMgaWYgc3RyZWFtIGlzIG5vdCBpbiBDT05GSUdVUkVEIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIFdhaXQgZm9yIG5ldyBidWZmZXIgcmV0dXJuZWQgYmFjayBpZiB3ZSBhcmUgcnVubmluZyBpbnRvIHRoZSBsaW1pdC4KKyAgICBpZiAoZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9PSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBBbHJlYWR5IGRlcXVldWVkIG1heCBpbnB1dCBidWZmZXJzICglZCksIHdhaXQgZm9yIG5leHQgcmV0dXJuZWQgb25lLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOworICAgICAgICByZXMgPSBtSW5wdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC53YWl0UmVsYXRpdmUobUxvY2ssIGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogd2FpdCBmb3IgaW5wdXQgYnVmZmVyIHJldHVybiB0aW1lZCBvdXQgYWZ0ZXIgJWxsZG1zIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAga1dhaXRGb3JCdWZmZXJEdXJhdGlvbiAvIDEwMDAwMDBMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gZ2V0SW5wdXRCdWZmZXJMb2NrZWQoYnVmZmVyKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoKmJ1ZmZlciwgLyphY3F1aXJlZCovdHJ1ZSwgLypvdXRwdXQqL2ZhbHNlKTsKICAgICB9CkBAIC0yNTAsNiArMzM0LDcgQEAKICAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5JbnB1dEJ1ZmZlckxvY2tlZChidWZmZXIpOwogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChidWZmZXIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovZmFsc2UpOworICAgICAgICBtSW5wdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC5zaWduYWwoKTsKICAgICB9CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTMxNCwxMiArMzk5LDM1IEBACiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnJlZ2lzdGVyQnVmZmVyc0xvY2tlZChjYW1lcmEzX2RldmljZSAqaGFsM0RldmljZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICAvKioKKyAgICAgKiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgKgorICAgICAqIGNhbWVyYTNfZGV2aWNlX3QtPm9wcy0+cmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMoKSBpcyBub3QgY2FsbGVkIGFuZCBtdXN0CisgICAgICogYmUgTlVMTC4KKyAgICAgKi8KKyAgICBpZiAoaGFsM0RldmljZS0+Y29tbW9uLnZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgQUxPR1YoIiVzOiByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyB1bnVzZWQgYXMgb2YgSEFMMy4yIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICBpZiAoaGFsM0RldmljZS0+b3BzLT5yZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyAhPSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIGlzIGRlcHJlY2F0ZWQgaW4gSEFMMy4yOyAiCisgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHNldCB0byBOVUxMIGluIGNhbWVyYTNfZGV2aWNlOjpvcHMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIiVzOiBTa2lwcGluZyBOVUxMIGNoZWNrIGZvciBkZXByZWNhdGVkIHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiJXM6IHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIHVzaW5nIGRlcHJlY2F0ZWQgY29kZSBwYXRoIiwgX19GVU5DVElPTl9fKTsKKyAgICB9CisKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBzaXplX3QgYnVmZmVyQ291bnQgPSBnZXRCdWZmZXJDb3VudExvY2tlZCgpOwogCiAgICAgVmVjdG9yPGJ1ZmZlcl9oYW5kbGVfdCo+IGJ1ZmZlcnM7Ci0gICAgYnVmZmVycy5pbnNlcnRBdChOVUxMLCAwLCBidWZmZXJDb3VudCk7CisgICAgYnVmZmVycy5pbnNlcnRBdCgvKnByb3RvdHlwZV9pdGVtKi9OVUxMLCAvKmluZGV4Ki8wLCBidWZmZXJDb3VudCk7CiAKICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfc2V0IGJ1ZmZlclNldCA9IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl9zZXQoKTsKICAgICBidWZmZXJTZXQuc3RyZWFtID0gdGhpczsKQEAgLTMyNyw3ICs0MzUsNyBAQAogICAgIGJ1ZmZlclNldC5idWZmZXJzID0gYnVmZmVycy5lZGl0QXJyYXkoKTsKIAogICAgIFZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4gc3RyZWFtQnVmZmVyczsKLSAgICBzdHJlYW1CdWZmZXJzLmluc2VydEF0KGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KCksIDAsIGJ1ZmZlckNvdW50KTsKKyAgICBzdHJlYW1CdWZmZXJzLmluc2VydEF0KGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KCksIC8qaW5kZXgqLzAsIGJ1ZmZlckNvdW50KTsKIAogICAgIC8vIFJlZ2lzdGVyIGFsbCBidWZmZXJzIHdpdGggdGhlIEhBTC4gVGhpcyBtZWFucyBnZXR0aW5nIGFsbCB0aGUgYnVmZmVycwogICAgIC8vIGZyb20gdGhlIHN0cmVhbSwgcHJvdmlkaW5nIHRoZW0gdG8gdGhlIEhBTCB3aXRoIHRoZQpAQCAtMzUzLDcgKzQ2MSw3IEBACiAgICAgfQogICAgIGlmIChidWZmZXJJZHggPT0gYnVmZmVyQ291bnQpIHsKICAgICAgICAgLy8gR290IGFsbCBidWZmZXJzLCByZWdpc3RlciB3aXRoIEhBTAotICAgICAgICBBTE9HVigiJXM6IFJlZ2lzdGVyaW5nICVkIGJ1ZmZlcnMgd2l0aCBjYW1lcmEgSEFMIiwKKyAgICAgICAgQUxPR1YoIiVzOiBSZWdpc3RlcmluZyAlenUgYnVmZmVycyB3aXRoIGNhbWVyYSBIQUwiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVyQ291bnQpOwogICAgICAgICBBVFJBQ0VfQkVHSU4oImNhbWVyYTMtPnJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIik7CiAgICAgICAgIHJlcyA9IGhhbDNEZXZpY2UtPm9wcy0+cmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMoaGFsM0RldmljZSwKQEAgLTM5NCw2ICs1MDIsMTggQEAKIHZvaWQgQ2FtZXJhM1N0cmVhbTo6YWRkQnVmZmVyTGlzdGVuZXIoCiAgICAgICAgIHdwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gbGlzdGVuZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBMaXN0PHdwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gPjo6aXRlcmF0b3IgaXQsIGVuZDsKKyAgICBmb3IgKGl0ID0gbUJ1ZmZlckxpc3RlbmVyTGlzdC5iZWdpbigpLCBlbmQgPSBtQnVmZmVyTGlzdGVuZXJMaXN0LmVuZCgpOworICAgICAgICAgaXQgIT0gZW5kOworICAgICAgICAgKSB7CisgICAgICAgIGlmICgqaXQgPT0gbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJ5IHRvIGFkZCB0aGUgc2FtZSBsaXN0ZW5lciB0d2ljZSwgaWdub3JpbmcuLi4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGl0Kys7CisgICAgfQorCiAgICAgbUJ1ZmZlckxpc3RlbmVyTGlzdC5wdXNoX2JhY2sobGlzdGVuZXIpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCmluZGV4IDZlZWI3MjEuLmQwZTEzMzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCkBAIC04Miw2ICs4MiwyMyBAQAogICogICAgU1RBVEVfQ09ORklHVVJFRCAgICAgPT4gU1RBVEVfQ09OU1RSVUNURUQ6CiAgKiAgICAgICAgV2hlbiBkaXNjb25uZWN0KCkgaXMgY2FsbGVkIGFmdGVyIG1ha2luZyBzdXJlIHN0cmVhbSBpcyBpZGxlIHdpdGgKICAqICAgICAgICB3YWl0VW50aWxJZGxlKCkuCisgKgorICogU3RhdHVzIFRyYWNraW5nOgorICogICAgRWFjaCBzdHJlYW0gaXMgdHJhY2tlZCBieSBTdGF0dXNUcmFja2VyIGFzIGEgc2VwYXJhdGUgY29tcG9uZW50LAorICogICAgZGVwZW5kaW5nIG9uIHRoZSBoYW5kZWQgb3V0IGJ1ZmZlciBjb3VudC4gVGhlIHN0YXRlIG11c3QgYmUgU1RBVEVfQ09ORklHVVJFRAorICogICAgaW4gb3JkZXIgZm9yIHRoZSBjb21wb25lbnQgdG8gYmUgbWFya2VkLgorICoKKyAqICAgIEl0J3MgbWFya2VkIGluIG9uZSBvZiB0d28gd2F5czoKKyAqCisgKiAgICAtIEFDVElWRTogT25lIG9yIG1vcmUgYnVmZmVycyBoYXZlIGJlZW4gaGFuZGVkIG91dCAod2l0aCAjZ2V0QnVmZmVyKS4KKyAqICAgIC0gSURMRTogQWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIHJldHVybmVkICh3aXRoICNyZXR1cm5CdWZmZXIpLCBhbmQgdGhlaXIKKyAqICAgICAgICAgIHJlc3BlY3RpdmUgcmVsZWFzZV9mZW5jZShzKSBoYXZlIGJlZW4gc2lnbmFsZWQuCisgKgorICogICAgQSB0eXBpY2FsIHVzZSBjYXNlIGlzIG91dHB1dCBzdHJlYW1zLiBXaGVuIHRoZSBIQUwgaGFzIGFueSBidWZmZXJzCisgKiAgICBkZXF1ZXVlZCwgdGhlIHN0cmVhbSBpcyBtYXJrZWQgQUNUSVZFLiBXaGVuIHRoZSBIQUwgcmV0dXJucyBhbGwgYnVmZmVycworICogICAgKGUuZy4gaWYgbm8gY2FwdHVyZSByZXF1ZXN0cyBhcmUgYWN0aXZlKSwgdGhlIHN0cmVhbSBpcyBtYXJrZWQgSURMRS4KKyAqICAgIEluIHRoaXMgdXNlIGNhc2UsIHRoZSBhcHAgY29uc3VtZXIgZG9lcyBub3QgYWZmZWN0IHRoZSBjb21wb25lbnQgc3RhdHVzLgorICoKICAqLwogY2xhc3MgQ2FtZXJhM1N0cmVhbSA6CiAgICAgICAgIHByb3RlY3RlZCBjYW1lcmEzX3N0cmVhbSwKQEAgLTE0Miw2ICsxNTksMTMgQEAKICAgICBzdGF0dXNfdCAgICAgICAgIGZpbmlzaENvbmZpZ3VyYXRpb24oY2FtZXJhM19kZXZpY2UgKmhhbDNEZXZpY2UpOwogCiAgICAgLyoqCisgICAgICogQ2FuY2VscyB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gVGhpcyByZXR1cm5zIHRoZSBzdHJlYW0gdG8gdGhlCisgICAgICogaW5pdGlhbCBzdGF0ZSwgYWxsb3dpbmcgaXQgdG8gYmUgY29uZmlndXJlZCBhZ2FpbiBsYXRlci4KKyAgICAgKiBUaGlzIGlzIGRvbmUgaWYgdGhlIEhBTCByZWplY3RzIHRoZSBwcm9wb3NlZCBjb21iaW5lZCBzdHJlYW0gY29uZmlndXJhdGlvbgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgY2FuY2VsQ29uZmlndXJhdGlvbigpOworCisgICAgLyoqCiAgICAgICogRmlsbCBpbiB0aGUgY2FtZXJhM19zdHJlYW1fYnVmZmVyIHdpdGggdGhlIG5leHQgdmFsaWQgYnVmZmVyIGZvciB0aGlzCiAgICAgICogc3RyZWFtLCB0byBoYW5kIG92ZXIgdG8gdGhlIEhBTC4KICAgICAgKgpAQCAtMjA5LDggKzIzMywxNyBAQAogICAgICAqLwogICAgIHZpcnR1YWwgdm9pZCAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0ID0gMDsKIAorICAgIC8qKgorICAgICAqIEFkZCBhIGNhbWVyYTMgYnVmZmVyIGxpc3RlbmVyLiBBZGRpbmcgdGhlIHNhbWUgbGlzdGVuZXIgdHdpY2UgaGFzCisgICAgICogbm8gZWZmZWN0LgorICAgICAqLwogICAgIHZvaWQgICAgICAgICAgICAgYWRkQnVmZmVyTGlzdGVuZXIoCiAgICAgICAgICAgICB3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+IGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGNhbWVyYTMgYnVmZmVyIGxpc3RlbmVyLiBSZW1vdmluZyB0aGUgc2FtZSBsaXN0ZW5lciB0d2ljZQorICAgICAqIG9yIHRoZSBsaXN0ZW5lciB0aGF0IHdhcyBuZXZlciBhZGRlZCBoYXMgbm8gZWZmZWN0LgorICAgICAqLwogICAgIHZvaWQgICAgICAgICAgICAgcmVtb3ZlQnVmZmVyTGlzdGVuZXIoCiAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+JiBsaXN0ZW5lcik7CiAKQEAgLTI2Miw2ICsyOTUsMTIgQEAKICAgICAvLyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBxdWV1ZQogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CiAKKyAgICAvLyBHZXQgaGFuZG91dCBvdXRwdXQgYnVmZmVyIGNvdW50LgorICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOworCisgICAgLy8gR2V0IGhhbmRvdXQgaW5wdXQgYnVmZmVyIGNvdW50LgorICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CisKICAgICAvLyBHZXQgdGhlIHVzYWdlIGZsYWdzIGZvciB0aGUgb3RoZXIgZW5kcG9pbnQsIG9yIHJldHVybgogICAgIC8vIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZXkgY2Fubm90IGJlIG9idGFpbmVkLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpID0gMDsKQEAgLTI3NCw2ICszMTMsOSBAQAogICBwcml2YXRlOgogICAgIHVpbnQzMl90IG9sZFVzYWdlOwogICAgIHVpbnQzMl90IG9sZE1heEJ1ZmZlcnM7CisgICAgQ29uZGl0aW9uIG1PdXRwdXRCdWZmZXJSZXR1cm5lZFNpZ25hbDsKKyAgICBDb25kaXRpb24gbUlucHV0QnVmZmVyUmV0dXJuZWRTaWduYWw7CisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXRGb3JCdWZmZXJEdXJhdGlvbiA9IDMwMDAwMDAwMDBMTDsgLy8gMzAwMCBtcwogCiAgICAgLy8gR2V0cyBhbGwgYnVmZmVycyBmcm9tIGVuZHBvaW50IGFuZCByZWdpc3RlcnMgdGhlbSB3aXRoIHRoZSBIQUwuCiAgICAgc3RhdHVzX3QgcmVnaXN0ZXJCdWZmZXJzTG9ja2VkKGNhbWVyYTNfZGV2aWNlICpoYWwzRGV2aWNlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggYzkzYWUxNS4uZGE5ODljZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKQEAgLTgyLDYgKzgyLDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5pc2hDb25maWd1cmF0aW9uKGNhbWVyYTNfZGV2aWNlICpoYWwzRGV2aWNlKSA9IDA7CiAKICAgICAvKioKKyAgICAgKiBDYW5jZWxzIHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiBwcm9jZXNzLiBUaGlzIHJldHVybnMgdGhlIHN0cmVhbSB0byB0aGUKKyAgICAgKiBpbml0aWFsIHN0YXRlLCBhbGxvd2luZyBpdCB0byBiZSBjb25maWd1cmVkIGFnYWluIGxhdGVyLgorICAgICAqIFRoaXMgaXMgZG9uZSBpZiB0aGUgSEFMIHJlamVjdHMgdGhlIHByb3Bvc2VkIGNvbWJpbmVkIHN0cmVhbSBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjYW5jZWxDb25maWd1cmF0aW9uKCkgPSAwOworCisgICAgLyoqCiAgICAgICogRmlsbCBpbiB0aGUgY2FtZXJhM19zdHJlYW1fYnVmZmVyIHdpdGggdGhlIG5leHQgdmFsaWQgYnVmZmVyIGZvciB0aGlzCiAgICAgICogc3RyZWFtLCB0byBoYW5kIG92ZXIgdG8gdGhlIEhBTC4KICAgICAgKgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAKaW5kZXggMDRmNWRjNS4uODEzMzBlYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uY3BwCkBAIC0xOCw2ICsxOCw4IEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgIkNhbWVyYTNac2xTdHJlYW0uaCIKQEAgLTEwOSwxNSArMTExLDE3IEBACiB9IC8vIG5hbWVzcGFjZSBhbm9ueW1vdXMKIAogQ2FtZXJhM1pzbFN0cmVhbTo6Q2FtZXJhM1pzbFN0cmVhbShpbnQgaWQsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgIGludCBkZXB0aCkgOgorICAgICAgICBpbnQgYnVmZmVyQ291bnQpIDoKICAgICAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpZCwgQ0FNRVJBM19TVFJFQU1fQklESVJFQ1RJT05BTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCksCi0gICAgICAgIG1EZXB0aChkZXB0aCkgeworICAgICAgICBtRGVwdGgoYnVmZmVyQ291bnQpIHsKIAotICAgIHNwPEJ1ZmZlclF1ZXVlPiBicSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgIG1Qcm9kdWNlciA9IG5ldyBSaW5nQnVmZmVyQ29uc3VtZXIoYnEsIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTCwgZGVwdGgpOwotICAgIG1Db25zdW1lciA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgIG1Qcm9kdWNlciA9IG5ldyBSaW5nQnVmZmVyQ29uc3VtZXIoY29uc3VtZXIsIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTCwgYnVmZmVyQ291bnQpOworICAgIG1Db25zdW1lciA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKIH0KIAogQ2FtZXJhM1pzbFN0cmVhbTo6fkNhbWVyYTNac2xTdHJlYW0oKSB7CkBAIC0xNzIsNyArMTc2LDcgQEAKICAgICAgKiBpbiB3aGljaCBjYXNlIHdlIHJlYXNzaWduIGl0IHRvIGFjcXVpcmVfZmVuY2UKICAgICAgKi8KICAgICBoYW5kb3V0QnVmZmVyTG9ja2VkKCpidWZmZXIsICYoYW5iLT5oYW5kbGUpLCAvKmFjcXVpcmVGZW5jZSovZmVuY2VGZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgLypyZWxlYXNlRmVuY2UqLy0xLCBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0ssIC8qb3V0cHV0Ki9mYWxzZSk7CiAKICAgICBtQnVmZmVyc0luRmxpZ2h0LnB1c2hfYmFjayhidWZmZXJJdGVtKTsKIApAQCAtMjcxLDcgKzI3NSw3IEBACiAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6ZHVtcChmZCwgYXJncyk7CiAKICAgICBsaW5lcyA9IFN0cmluZzgoKTsKLSAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIElucHV0IGJ1ZmZlcnMgcGVuZGluZzogJWQsIGluIGZsaWdodCAlZFxuIiwKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIElucHV0IGJ1ZmZlcnMgcGVuZGluZzogJXp1LCBpbiBmbGlnaHQgJXp1XG4iLAogICAgICAgICAgICAgbUlucHV0QnVmZmVyUXVldWUuc2l6ZSgpLCBtQnVmZmVyc0luRmxpZ2h0LnNpemUoKSk7CiAgICAgd3JpdGUoZmQsIGxpbmVzLnN0cmluZygpLCBsaW5lcy5zaXplKCkpOwogfQpAQCAtMjk2LDggKzMwMCw5IEBACiAgICAgbnNlY3NfdCBhY3R1YWwgPSBwaW5uZWRCdWZmZXItPmdldEJ1ZmZlckl0ZW0oKS5tVGltZXN0YW1wOwogCiAgICAgaWYgKGFjdHVhbCAhPSB0aW1lc3RhbXApIHsKKyAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBwcm9ibGVtYXRpYywgd2UnbGwgZW5kIHVwIHdpdGggdXNpbmcgd3JvbmcgcmVzdWx0IGZvciB0aGlzIHBpbm5lZCBidWZmZXIuCiAgICAgICAgIEFMT0dXKCIlczogWlNMIGJ1ZmZlciBjYW5kaWRhdGUgc2VhcmNoIGRpZG4ndCBmaW5kIGFuIGV4YWN0IG1hdGNoIC0tIgotICAgICAgICAgICAgICAiIHJlcXVlc3RlZCB0aW1lc3RhbXAgPSAlbGxkLCBhY3R1YWwgdGltZXN0YW1wID0gJWxsZCIsCisgICAgICAgICAgICAgICIgcmVxdWVzdGVkIHRpbWVzdGFtcCA9ICUiIFBSSWQ2NCAiLCBhY3R1YWwgdGltZXN0YW1wID0gJSIgUFJJZDY0LAogICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRpbWVzdGFtcCwgYWN0dWFsKTsKICAgICB9CiAKQEAgLTMxMCwxNCArMzE1LDI4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzWnNsU3RyZWFtOjpjbGVhcklucHV0UmluZ0J1ZmZlcigpIHsKK3N0YXR1c190IENhbWVyYTNac2xTdHJlYW06OmNsZWFySW5wdXRSaW5nQnVmZmVyKG5zZWNzX3QqIGxhdGVzdFRpbWVzdGFtcCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAorICAgIHJldHVybiBjbGVhcklucHV0UmluZ0J1ZmZlckxvY2tlZChsYXRlc3RUaW1lc3RhbXApOworfQorCitzdGF0dXNfdCBDYW1lcmEzWnNsU3RyZWFtOjpjbGVhcklucHV0UmluZ0J1ZmZlckxvY2tlZChuc2Vjc190KiBsYXRlc3RUaW1lc3RhbXApIHsKKworICAgIGlmIChsYXRlc3RUaW1lc3RhbXApIHsKKyAgICAgICAgKmxhdGVzdFRpbWVzdGFtcCA9IG1Qcm9kdWNlci0+Z2V0TGF0ZXN0VGltZXN0YW1wKCk7CisgICAgfQogICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLmNsZWFyKCk7CiAKICAgICByZXR1cm4gbVByb2R1Y2VyLT5jbGVhcigpOwogfQogCitzdGF0dXNfdCBDYW1lcmEzWnNsU3RyZWFtOjpkaXNjb25uZWN0TG9ja2VkKCkgeworICAgIGNsZWFySW5wdXRSaW5nQnVmZmVyTG9ja2VkKE5VTEwpOworCisgICAgcmV0dXJuIENhbWVyYTNPdXRwdXRTdHJlYW06OmRpc2Nvbm5lY3RMb2NrZWQoKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1pzbFN0cmVhbTo6c2V0VHJhbnNmb3JtKGludCAvKnRyYW5zZm9ybSovKSB7CiAgICAgQUxPR1YoIiVzOiBOb3QgaW1wbGVtZW50ZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmgKaW5kZXggYzdmNDQ5MC4uNTMyM2E0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmgKQEAgLTM3LDEwICszNywxMCBAQAogICAgICAgICBwdWJsaWMgQ2FtZXJhM091dHB1dFN0cmVhbSB7CiAgIHB1YmxpYzoKICAgICAvKioKLSAgICAgKiBTZXQgdXAgYSBaU0wgc3RyZWFtIG9mIGEgZ2l2ZW4gcmVzb2x1dGlvbi4gRGVwdGggaXMgdGhlIG51bWJlciBvZiBidWZmZXJzCisgICAgICogU2V0IHVwIGEgWlNMIHN0cmVhbSBvZiBhIGdpdmVuIHJlc29sdXRpb24uIGJ1ZmZlckNvdW50IGlzIHRoZSBudW1iZXIgb2YgYnVmZmVycwogICAgICAqIGNhY2hlZCB3aXRoaW4gdGhlIHN0cmVhbSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZm9yIGlucHV0LgogICAgICAqLwotICAgIENhbWVyYTNac2xTdHJlYW0oaW50IGlkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZGVwdGgpOworICAgIENhbWVyYTNac2xTdHJlYW0oaW50IGlkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgYnVmZmVyQ291bnQpOwogICAgIH5DYW1lcmEzWnNsU3RyZWFtKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKQEAgLTU5LDggKzU5LDEwIEBACiAKICAgICAvKioKICAgICAgKiBDbGVhcnMgdGhlIGJ1ZmZlcnMgdGhhdCBjYW4gYmUgdXNlZCBieSBlbnF1ZXVlSW5wdXRCdWZmZXJCeVRpbWVzdGFtcAorICAgICAqIGxhdGVzdFRpbWVzdGFtcCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBsYXJnZXN0IHRpbWVzdGFtcCBvZiBidWZmZXJzCisgICAgICogYmVpbmcgY2xlYXJlZCwgMCBpZiB0aGVyZSBpcyBubyBidWZmZXIgYmVpbmcgY2xlYXIuCiAgICAgICovCi0gICAgc3RhdHVzX3QgY2xlYXJJbnB1dFJpbmdCdWZmZXIoKTsKKyAgICBzdGF0dXNfdCBjbGVhcklucHV0UmluZ0J1ZmZlcihuc2Vjc190KiBsYXRlc3RUaW1lc3RhbXApOwogCiAgIHByb3RlY3RlZDoKIApAQCAtOTYsNiArOTgsMTIgQEAKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOworCisgICAgLy8gRGlzY29ubmV0IHRoZSBDYW1lcmEzWnNsU3RyZWFtIHNwZWNpZmljIGJ1ZmZlclF1ZXVlcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKKworICAgIHN0YXR1c190IGNsZWFySW5wdXRSaW5nQnVmZmVyTG9ja2VkKG5zZWNzX3QqIGxhdGVzdFRpbWVzdGFtcCk7CisKIH07IC8vIGNsYXNzIENhbWVyYTNac2xTdHJlYW0KIAogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvU3RhdHVzVHJhY2tlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwCmluZGV4IGFiNTQxOWYuLjcyM2I1YzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvU3RhdHVzVHJhY2tlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcApAQCAtMTgsOSArMTgsNiBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLS8vIFRoaXMgaXMgbmVlZGVkIGZvciBzdGRpbnQuaCB0byBkZWZpbmUgSU5UNjRfTUFYIGluIEMrKwotI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCi0KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CkBAIC01Miw3ICs0OSw3IEBACiAgICAgICAgIEFMT0dWKCIlczogQWRkaW5nIG5ldyBjb21wb25lbnQgJWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKIAogICAgICAgICBlcnIgPSBtU3RhdGVzLmFkZChpZCwgSURMRSk7Ci0gICAgICAgIEFMT0dFX0lGKGVyciA8IDAsICIlczogQ2FuJ3QgYWRkIG5ldyBjb21wb25lbnQgJWQ6ICVzICglZCkiLAorICAgICAgICBBTE9HRV9JRihlcnIgPCAwLCAiJXM6IENhbid0IGFkZCBuZXcgY29tcG9uZW50ICVkOiAlcyAoJXpkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZCwgc3RyZXJyb3IoLWVyciksIGVycik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwCmluZGV4IDlhNmRjMjguLmY4NTYyZWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwCkBAIC0xNyw2ICsxNyw5IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlJpbmdCdWZmZXJDb25zdW1lciIKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmg+CkBAIC0zOCw3ICs0MSw4IEBACiAgICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsCiAgICAgICAgIGludCBidWZmZXJDb3VudCkgOgogICAgIENvbnN1bWVyQmFzZShjb25zdW1lciksCi0gICAgbUJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KQorICAgIG1CdWZmZXJDb3VudChidWZmZXJDb3VudCksCisgICAgbUxhdGVzdFRpbWVzdGFtcCgwKQogewogICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoY29uc3VtZXJVc2FnZSk7CiAgICAgbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKQEAgLTE0OSw2ICsxNTMsMTQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK25zZWNzX3QgUmluZ0J1ZmZlckNvbnN1bWVyOjpnZXRMYXRlc3RUaW1lc3RhbXAoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CisgICAgaWYgKG1CdWZmZXJJdGVtTGlzdC5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1MYXRlc3RUaW1lc3RhbXA7Cit9CisKIHZvaWQgUmluZ0J1ZmZlckNvbnN1bWVyOjpwaW5CdWZmZXJMb2NrZWQoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgewogICAgIExpc3Q8UmluZ0J1ZmZlckl0ZW0+OjppdGVyYXRvciBpdCwgZW5kOwogCkBAIC0xNjQsMTAgKzE3NiwxMCBAQAogICAgIH0KIAogICAgIGlmIChpdCA9PSBlbmQpIHsKLSAgICAgICAgQklfTE9HRSgiRmFpbGVkIHRvIHBpbiBidWZmZXIgKHRpbWVzdGFtcCAlbGxkLCBmcmFtZW51bWJlciAlbGxkKSIsCisgICAgICAgIEJJX0xPR0UoIkZhaWxlZCB0byBwaW4gYnVmZmVyICh0aW1lc3RhbXAgJSIgUFJJZDY0ICIsIGZyYW1lbnVtYmVyICUiIFBSSXU2NCAiKSIsCiAgICAgICAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcCwgaXRlbS5tRnJhbWVOdW1iZXIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEJJX0xPR1YoIlBpbm5lZCBidWZmZXIgKGZyYW1lICVsbGQsIHRpbWVzdGFtcCAlbGxkKSIsCisgICAgICAgIEJJX0xPR1YoIlBpbm5lZCBidWZmZXIgKGZyYW1lICUiIFBSSXU2NCAiLCB0aW1lc3RhbXAgJSIgUFJJZDY0ICIpIiwKICAgICAgICAgICAgICAgICBpdGVtLm1GcmFtZU51bWJlciwgaXRlbS5tVGltZXN0YW1wKTsKICAgICB9CiB9CkBAIC0yMjIsMTIgKzIzNCwxMiBAQAogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIEJJX0xPR0UoIkZhaWxlZCB0byBhZGQgcmVsZWFzZSBmZW5jZSB0byBidWZmZXIgIgotICAgICAgICAgICAgICAgICAgICAiKHRpbWVzdGFtcCAlbGxkLCBmcmFtZW51bWJlciAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgIih0aW1lc3RhbXAgJSIgUFJJZDY0ICIsIGZyYW1lbnVtYmVyICUiIFBSSXU2NCwKICAgICAgICAgICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wLCBpdGVtLm1GcmFtZU51bWJlcik7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgQklfTE9HVigiQXR0ZW1wdGluZyB0byByZWxlYXNlIGJ1ZmZlciB0aW1lc3RhbXAgJWxsZCwgZnJhbWUgJWxsZCIsCisgICAgICAgIEJJX0xPR1YoIkF0dGVtcHRpbmcgdG8gcmVsZWFzZSBidWZmZXIgdGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZSAlIiBQUkl1NjQsCiAgICAgICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wLCBpdGVtLm1GcmFtZU51bWJlcik7CiAKICAgICAgICAgLy8gaXRlbS5tR3JhcGhpY0J1ZmZlciB3YXMgcG9wdWxhdGVkIHdpdGggdGhlIHByb3BlciBncmFwaGljLWJ1ZmZlcgpAQCAtMjQxLDcgKzI1Myw3IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgQklfTE9HVigiQnVmZmVyIHRpbWVzdGFtcCAlbGxkLCBmcmFtZSAlbGxkIGV2aWN0ZWQiLAorICAgICAgICBCSV9MT0dWKCJCdWZmZXIgdGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZSAlIiBQUkl1NjQgIiBldmljdGVkIiwKICAgICAgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAsIGl0ZW0ubUZyYW1lTnVtYmVyKTsKIAogICAgICAgICBzaXplX3QgY3VycmVudFNpemUgPSBtQnVmZmVySXRlbUxpc3Quc2l6ZSgpOwpAQCAtMjk0LDExICszMDYsMTggQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIEJJX0xPR1YoIk5ldyBidWZmZXIgYWNxdWlyZWQgKHRpbWVzdGFtcCAlbGxkKSwgIgotICAgICAgICAgICAgICAgICJidWZmZXIgaXRlbXMgJXUgb3V0IG9mICVkIiwKKyAgICAgICAgQklfTE9HVigiTmV3IGJ1ZmZlciBhY3F1aXJlZCAodGltZXN0YW1wICUiIFBSSWQ2NCAiKSwgIgorICAgICAgICAgICAgICAgICJidWZmZXIgaXRlbXMgJXp1IG91dCBvZiAlZCIsCiAgICAgICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wLAogICAgICAgICAgICAgICAgIG1CdWZmZXJJdGVtTGlzdC5zaXplKCksIG1CdWZmZXJDb3VudCk7CiAKKyAgICAgICAgaWYgKGl0ZW0ubVRpbWVzdGFtcCA8IG1MYXRlc3RUaW1lc3RhbXApIHsKKyAgICAgICAgICAgIEJJX0xPR0UoIlRpbWVzdGFtcCAgZGVjcmVhc2VzIGZyb20gJSIgUFJJZDY0ICIgdG8gJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICBtTGF0ZXN0VGltZXN0YW1wLCBpdGVtLm1UaW1lc3RhbXApOworICAgICAgICB9CisKKyAgICAgICAgbUxhdGVzdFRpbWVzdGFtcCA9IGl0ZW0ubVRpbWVzdGFtcDsKKwogICAgICAgICBpdGVtLm1HcmFwaGljQnVmZmVyID0gbVNsb3RzW2l0ZW0ubUJ1Zl0ubUdyYXBoaWNCdWZmZXI7CiAgICAgfSAvLyBlbmQgb2YgbU11dGV4IGxvY2sKIApAQCAtMzIxLDcgKzM0MCw3IEBACiAKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICBCSV9MT0dFKCJGYWlsZWQgdG8gYWRkIHJlbGVhc2UgZmVuY2UgdG8gYnVmZmVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICIodGltZXN0YW1wICVsbGQsIGZyYW1lbnVtYmVyICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIih0aW1lc3RhbXAgJSIgUFJJZDY0ICIsIGZyYW1lbnVtYmVyICUiIFBSSXU2NCwKICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcCwgaXRlbS5tRnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTMzMywxMCArMzUyLDEwIEBACiAKICAgICBpZiAoaXQgPT0gZW5kKSB7CiAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gSWYgaXQgaGFwcGVucywgd2UgaGF2ZSBhIGJ1Zy4KLSAgICAgICAgQklfTE9HRSgiRmFpbGVkIHRvIHVucGluIGJ1ZmZlciAodGltZXN0YW1wICVsbGQsIGZyYW1lbnVtYmVyICVsbGQpIiwKKyAgICAgICAgQklfTE9HRSgiRmFpbGVkIHRvIHVucGluIGJ1ZmZlciAodGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZW51bWJlciAlIiBQUkl1NjQgIikiLAogICAgICAgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAsIGl0ZW0ubUZyYW1lTnVtYmVyKTsKICAgICB9IGVsc2UgewotICAgICAgICBCSV9MT0dWKCJVbnBpbm5lZCBidWZmZXIgKHRpbWVzdGFtcCAlbGxkLCBmcmFtZW51bWJlciAlbGxkKSIsCisgICAgICAgIEJJX0xPR1YoIlVucGlubmVkIGJ1ZmZlciAodGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZW51bWJlciAlIiBQUkl1NjQgIikiLAogICAgICAgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAsIGl0ZW0ubUZyYW1lTnVtYmVyKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmgKaW5kZXggYjRhZDgyNC4uZGE5N2ExMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuaApAQCAtNjQsNyArNjQsNyBAQAogICAgIC8vIGJ1ZmZlckNvdW50IHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG1hbnkgYnVmZmVycyBjYW4gYmUgcGlubmVkIGZvciB1c2VyCiAgICAgLy8gYWNjZXNzIGF0IHRoZSBzYW1lIHRpbWUuCiAgICAgUmluZ0J1ZmZlckNvbnN1bWVyKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+JiBjb25zdW1lciwgdWludDMyX3QgY29uc3VtZXJVc2FnZSwKLSAgICAgICAgICAgIGludCBidWZmZXJDb3VudCA9IEJ1ZmZlclF1ZXVlOjpNSU5fVU5ERVFVRVVFRF9CVUZGRVJTKTsKKyAgICAgICAgICAgIGludCBidWZmZXJDb3VudCk7CiAKICAgICB2aXJ0dWFsIH5SaW5nQnVmZmVyQ29uc3VtZXIoKTsKIApAQCAtMTU5LDYgKzE1OSw5IEBACiAgICAgLy8gUmVsZWFzZSBhbGwgdGhlIG5vbi1waW5uZWQgYnVmZmVycyBpbiB0aGUgcmluZyBidWZmZXIKICAgICBzdGF0dXNfdCBjbGVhcigpOwogCisgICAgLy8gUmV0dXJuIDAgaWYgUmluZ0J1ZmZlciBpcyBlbXB0eSwgb3RoZXJ3aXNlIHJldHVybiB0aW1lc3RhbXAgb2YgbGF0ZXN0IGJ1ZmZlci4KKyAgICBuc2Vjc190IGdldExhdGVzdFRpbWVzdGFtcCgpOworCiAgIHByaXZhdGU6CiAKICAgICAvLyBPdmVycmlkZSBDb25zdW1lckJhc2U6Om9uRnJhbWVBdmFpbGFibGUKQEAgLTE4MCw2ICsxODMsOSBAQAogICAgIC8vIExpc3Qgb2YgYWNxdWlyZWQgYnVmZmVycyBpbiBvdXIgcmluZyBidWZmZXIKICAgICBMaXN0PFJpbmdCdWZmZXJJdGVtPiAgICAgICBtQnVmZmVySXRlbUxpc3Q7CiAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAgbUJ1ZmZlckNvdW50OworCisgICAgLy8gVGltZXN0YW1wIG9mIGxhdGVzdCBidWZmZXIKKyAgICBuc2Vjc190IG1MYXRlc3RUaW1lc3RhbXA7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcAppbmRleCAzNDZlMTVmLi4zNzRkYzVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRyYWNlcy5jcHAKQEAgLTc0LDEwICs3NCwxMCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGZkcHJpbnRmKGZkLCAiQ2FtZXJhIHRyYWNlcyAoJXp1KTpcbiIsIHBjc0xpc3Quc2l6ZSgpKTsKKyAgICBkcHJpbnRmKGZkLCAiQ2FtZXJhIHRyYWNlcyAoJXp1KTpcbiIsIHBjc0xpc3Quc2l6ZSgpKTsKIAogICAgIGlmIChwY3NMaXN0LmVtcHR5KCkpIHsKLSAgICAgICAgZmRwcmludGYoZmQsICIgIE5vIGNhbWVyYSB0cmFjZXMgY29sbGVjdGVkLlxuIik7CisgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGNhbWVyYSB0cmFjZXMgY29sbGVjdGVkLlxuIik7CiAgICAgfQogCiAgICAgLy8gUHJpbnQgbmV3ZXN0IGl0ZW1zIGZpcnN0CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5tawppbmRleCAwODAwNmM4Li45NWYyZmVmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQubWsKQEAgLTgsNCArOCw2IEBACiAKIExPQ0FMX01PRFVMRTo9IGxpYm1lZGlhbG9nc2VydmljZQogCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCmluZGV4IDY4M2ZkZjMuLjQxZGFiMWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcApAQCAtNTQsMTMgKzU0LDEzIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNZWRpYUxvZ1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQorc3RhdHVzX3QgTWVkaWFMb2dTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICAvLyBGSVhNRSBtZXJnZSB3aXRoIHNpbWlsYXIgYnV0IG5vdCBpZGVudGljYWwgY29kZSBhdCBzZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7CiAgICAgaWYgKCEoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpID09IEFJRF9NRURJQSB8fAogICAgICAgICAgICAgUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKSkpIHsKLSAgICAgICAgZmRwcmludGYoZmQsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBtZWRpYS5sb2cgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKKyAgICAgICAgZHByaW50ZihmZCwgIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIG1lZGlhLmxvZyBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAogICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC03NCw3ICs3NCw3IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1lZFJlYWRlcnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3QgTmFtZWRSZWFkZXImIG5hbWVkUmVhZGVyID0gbmFtZWRSZWFkZXJzW2ldOwogICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgZmRwcmludGYoZmQsICJcbiVzOlxuIiwgbmFtZWRSZWFkZXIubmFtZSgpKTsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiVzOlxuIiwgbmFtZWRSZWFkZXIubmFtZSgpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dJKCIlczoiLCBuYW1lZFJlYWRlci5uYW1lKCkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MmFlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ1IEBACisjIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworCitpZmVxICgkKFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFKSwgMSkKKyAgICBMT0NBTF9DRkxBR1MgKz0gLURTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRQorZW5kaWYKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCisgICAgU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gXAorICAgIGxpYnVpIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJiaW5kZXIgXAorICAgIGxpYmN1dGlscyBcCisgICAgbGliaGFyZHdhcmUgXAorICAgIGxpYnNvdW5kdHJpZ2dlciBcCisgICAgbGlibWVkaWEKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGlic2VydmljZXV0aWxpdHkKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIKKworTE9DQUxfTU9EVUxFOj0gbGlic291bmR0cmlnZ2Vyc2VydmljZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YWFlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDgyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU291bmRUcmlnZ2VySHdTZXJ2aWNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgorI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9zb3VuZF90cmlnZ2VyLmg+CisjaW5jbHVkZSA8U2VydmljZVV0aWxpdGllcy5oPgorI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRQorI2RlZmluZSBIV19NT0RVTEVfUFJFRklYICJzdHViIgorI2Vsc2UKKyNkZWZpbmUgSFdfTU9EVUxFX1BSRUZJWCAicHJpbWFyeSIKKyNlbmRpZgorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6OlNvdW5kVHJpZ2dlckh3U2VydmljZSgpCisgICAgOiBCblNvdW5kVHJpZ2dlckh3U2VydmljZSgpLAorICAgICAgbU5leHRVbmlxdWVJZCgxKSwKKyAgICAgIG1NZW1vcnlEZWFsZXIobmV3IE1lbW9yeURlYWxlcigxMDI0ICogMTAyNCwgIlNvdW5kVHJpZ2dlckh3U2VydmljZSIpKSwKKyAgICAgIG1DYXB0dXJlU3RhdGUoZmFsc2UpCit7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpvbkZpcnN0UmVmKCkKK3sKKyAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOworICAgIGludCByYzsKKyAgICBzb3VuZF90cmlnZ2VyX2h3X2RldmljZSAqZGV2OworCisgICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCBIV19NT0RVTEVfUFJFRklYLCAmbW9kKTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICBBTE9HRSgiY291bGRuJ3QgbG9hZCBzb3VuZCB0cmlnZ2VyIG1vZHVsZSAlcy4lcyAoJXMpIiwKKyAgICAgICAgICAgICAgU09VTkRfVFJJR0dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsICJwcmltYXJ5Iiwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmMgPSBzb3VuZF90cmlnZ2VyX2h3X2RldmljZV9vcGVuKG1vZCwgJmRldik7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW4gc291bmQgdHJpZ2dlciBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsCisgICAgICAgICAgICAgIFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCAicHJpbWFyeSIsIHN0cmVycm9yKC1yYykpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChkZXYtPmNvbW1vbi52ZXJzaW9uICE9IFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OX0NVUlJFTlQpIHsKKyAgICAgICAgQUxPR0UoIndyb25nIHNvdW5kIHRyaWdnZXIgaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIGRldi0+Y29tbW9uLnZlcnNpb24pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciBkZXNjcmlwdG9yOworICAgIHJjID0gZGV2LT5nZXRfcHJvcGVydGllcyhkZXYsICZkZXNjcmlwdG9yLnByb3BlcnRpZXMpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgcmVhZCBpbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGVzY3JpcHRvci5oYW5kbGUgPQorICAgICAgICAgICAgKHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90KWFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCk7CisgICAgQUxPR0koImxvYWRlZCBkZWZhdWx0IG1vZHVsZSAlcywgaGFuZGxlICVkIiwgZGVzY3JpcHRvci5wcm9wZXJ0aWVzLmRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuaGFuZGxlKTsKKworICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudDsKKyAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG5ldyBNb2R1bGUodGhpcywgZGV2LCBkZXNjcmlwdG9yLCBjbGllbnQpOworICAgIG1Nb2R1bGVzLmFkZChkZXNjcmlwdG9yLmhhbmRsZSwgbW9kdWxlKTsKKyAgICBtQ2FsbGJhY2tUaHJlYWQgPSBuZXcgQ2FsbGJhY2tUaHJlYWQodGhpcyk7Cit9CisKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6flNvdW5kVHJpZ2dlckh3U2VydmljZSgpCit7CisgICAgaWYgKG1DYWxsYmFja1RocmVhZCAhPSAwKSB7CisgICAgICAgIG1DYWxsYmFja1RocmVhZC0+ZXhpdCgpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlX2Nsb3NlKG1Nb2R1bGVzLnZhbHVlQXQoaSktPmh3RGV2aWNlKCkpOworICAgIH0KK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCit7CisgICAgQUxPR1YoImxpc3RNb2R1bGVzIik7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICBpZiAobnVtTW9kdWxlcyA9PSBOVUxMIHx8ICgqbnVtTW9kdWxlcyAhPSAwICYmIG1vZHVsZXMgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc2l6ZV90IG1heE1vZHVsZXMgPSAqbnVtTW9kdWxlczsKKyAgICAqbnVtTW9kdWxlcyA9IG1Nb2R1bGVzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKSAmJiBpIDwgbWF4TW9kdWxlczsgaSsrKSB7CisgICAgICAgIG1vZHVsZXNbaV0gPSBtTW9kdWxlcy52YWx1ZUF0KGkpLT5kZXNjcmlwdG9yKCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjphdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+JiBtb2R1bGVJbnRlcmZhY2UpCit7CisgICAgQUxPR1YoImF0dGFjaCBtb2R1bGUgJWQiLCBoYW5kbGUpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgbW9kdWxlSW50ZXJmYWNlLmNsZWFyKCk7CisgICAgaWYgKGNsaWVudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNzaXplX3QgaW5kZXggPSBtTW9kdWxlcy5pbmRleE9mS2V5KGhhbmRsZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGVzLnZhbHVlQXQoaW5kZXgpOworCisgICAgbW9kdWxlLT5zZXRDbGllbnQoY2xpZW50KTsKKyAgICBjbGllbnQtPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1vZHVsZSk7CisgICAgbW9kdWxlSW50ZXJmYWNlID0gbW9kdWxlOworCisgICAgbW9kdWxlLT5zZXRDYXB0dXJlU3RhdGVfbChtQ2FwdHVyZVN0YXRlKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZXRDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpCit7CisgICAgQUxPR1YoInNldENhcHR1cmVTdGF0ZSAlZCIsIGFjdGl2ZSk7CisgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICBtQ2FwdHVyZVN0YXRlID0gYWN0aXZlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU1vZHVsZXMudmFsdWVBdChpKS0+c2V0Q2FwdHVyZVN0YXRlX2woYWN0aXZlKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpkZXRhY2hNb2R1bGUoc3A8TW9kdWxlPiBtb2R1bGUpCit7CisgICAgQUxPR1YoImRldGFjaE1vZHVsZSIpOworICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgbW9kdWxlLT5jbGVhckNsaWVudCgpOworfQorCisKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOworc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcCA9IDYwMDAwOworCitzdGF0aWMgYm9vbCB0cnlMb2NrKE11dGV4JiBtdXRleCkKK3sKKyAgICBib29sIGxvY2tlZCA9IGZhbHNlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7CisgICAgICAgIGlmIChtdXRleC50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXApOworICAgIH0KKyAgICByZXR1cm4gbG9ja2VkOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIFNvdW5kVHJpZ2dlckh3U2VydmljZSIpOworICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBTb3VuZFRyaWdnZXJId1NlcnZpY2UgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAorICAgICAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiU291bmRUcmlnZ2VySHdTZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvY2tlZCkgbVNlcnZpY2VMb2NrLnVubG9jaygpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7CisgICAgcmV0dXJuIEJuU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Cit9CisKKworLy8gc3RhdGljCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cmVjb2duaXRpb25DYWxsYmFjayhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpCit7CisgICAgTW9kdWxlICptb2R1bGUgPSAoTW9kdWxlICopY29va2llOworICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZSA9IG1vZHVsZS0+c2VydmljZSgpLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZXJ2aWNlLT5zZW5kUmVjb2duaXRpb25FdmVudChldmVudCwgbW9kdWxlKTsKK30KKworc3A8SU1lbW9yeT4gU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpwcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCkKK3sKKyAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKKworICAgIC8vc2FuaXRpemUgZXZlbnQKKyAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7CisgICAgY2FzZSBTT1VORF9NT0RFTF9UWVBFX0tFWVBIUkFTRToKKyAgICAgICAgQUxPR1dfSUYoZXZlbnQtPmRhdGFfc2l6ZSAhPSAwICYmIGV2ZW50LT5kYXRhX29mZnNldCAhPQorICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgInByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woKTogaW52YWxpZCBkYXRhIG9mZnNldCAldSBmb3Iga2V5cGhyYXNlIGV2ZW50IHR5cGUiLAorICAgICAgICAgICAgICAgICAgICBldmVudC0+ZGF0YV9vZmZzZXQpOworICAgICAgICBldmVudC0+ZGF0YV9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTT1VORF9NT0RFTF9UWVBFX1VOS05PV046CisgICAgICAgIEFMT0dXX0lGKGV2ZW50LT5kYXRhX3NpemUgIT0gMCAmJiBldmVudC0+ZGF0YV9vZmZzZXQgIT0KKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgInByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woKTogaW52YWxpZCBkYXRhIG9mZnNldCAldSBmb3IgdW5rbm93biBldmVudCB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0KTsKKyAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworICAgIH0KKworICAgIHNpemVfdCBzaXplID0gZXZlbnQtPmRhdGFfb2Zmc2V0ICsgZXZlbnQtPmRhdGFfc2l6ZTsKKyAgICBldmVudE1lbW9yeSA9IG1NZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUpOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBldmVudE1lbW9yeS5jbGVhcigpOworICAgICAgICByZXR1cm4gZXZlbnRNZW1vcnk7CisgICAgfQorICAgIG1lbWNweShldmVudE1lbW9yeS0+cG9pbnRlcigpLCBldmVudCwgc2l6ZSk7CisKKyAgICByZXR1cm4gZXZlbnRNZW1vcnk7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kUmVjb2duaXRpb25FdmVudChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICptb2R1bGUpCisgeworICAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woZXZlbnQpOworICAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgeworICAgICAgICAgcmV0dXJuOworICAgICB9CisgICAgIHNwPE1vZHVsZT4gc3Ryb25nTW9kdWxlOworICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICBpZiAobU1vZHVsZXMudmFsdWVBdChpKS5nZXQoKSA9PSBtb2R1bGUpIHsKKyAgICAgICAgICAgICBzdHJvbmdNb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICB9CisgICAgIGlmIChzdHJvbmdNb2R1bGUgPT0gMCkgeworICAgICAgICAgcmV0dXJuOworICAgICB9CisKKyAgICAgc2VuZENhbGxiYWNrRXZlbnRfbChuZXcgQ2FsbGJhY2tFdmVudChDYWxsYmFja0V2ZW50OjpUWVBFX1JFQ09HTklUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE1lbW9yeSwgc3Ryb25nTW9kdWxlKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnNvdW5kTW9kZWxDYWxsYmFjayhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSkKK3sKKyAgICBNb2R1bGUgKm1vZHVsZSA9IChNb2R1bGUgKiljb29raWU7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiBzZXJ2aWNlID0gbW9kdWxlLT5zZXJ2aWNlKCkucHJvbW90ZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNlcnZpY2UtPnNlbmRTb3VuZE1vZGVsRXZlbnQoZXZlbnQsIG1vZHVsZSk7Cit9CisKK3NwPElNZW1vcnk+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cHJlcGFyZVNvdW5kTW9kZWxFdmVudF9sKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCkKK3sKKyAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKKworICAgIHNpemVfdCBzaXplID0gZXZlbnQtPmRhdGFfb2Zmc2V0ICsgZXZlbnQtPmRhdGFfc2l6ZTsKKyAgICBldmVudE1lbW9yeSA9IG1NZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUpOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBldmVudE1lbW9yeS5jbGVhcigpOworICAgICAgICByZXR1cm4gZXZlbnRNZW1vcnk7CisgICAgfQorICAgIG1lbWNweShldmVudE1lbW9yeS0+cG9pbnRlcigpLCBldmVudCwgc2l6ZSk7CisKKyAgICByZXR1cm4gZXZlbnRNZW1vcnk7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kU291bmRNb2RlbEV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqbW9kdWxlKQoreworICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBwcmVwYXJlU291bmRNb2RlbEV2ZW50X2woZXZlbnQpOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8TW9kdWxlPiBzdHJvbmdNb2R1bGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU1vZHVsZXMudmFsdWVBdChpKS5nZXQoKSA9PSBtb2R1bGUpIHsKKyAgICAgICAgICAgIHN0cm9uZ01vZHVsZSA9IG1Nb2R1bGVzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3Ryb25nTW9kdWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZW5kQ2FsbGJhY2tFdmVudF9sKG5ldyBDYWxsYmFja0V2ZW50KENhbGxiYWNrRXZlbnQ6OlRZUEVfU09VTkRNT0RFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE1lbW9yeSwgc3Ryb25nTW9kdWxlKSk7Cit9CisKKworc3A8SU1lbW9yeT4gU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpwcmVwYXJlU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSkKK3sKKyAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKKworICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90KTsKKyAgICBldmVudE1lbW9yeSA9IG1NZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUpOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBldmVudE1lbW9yeS5jbGVhcigpOworICAgICAgICByZXR1cm4gZXZlbnRNZW1vcnk7CisgICAgfQorICAgICooKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKSkgPSBzdGF0ZTsKKyAgICByZXR1cm4gZXZlbnRNZW1vcnk7Cit9CisKKy8vIGNhbGwgd2l0aCBtU2VydmljZUxvY2sgaGVsZAordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnNlbmRTZXJ2aWNlU3RhdGVFdmVudF9sKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgKm1vZHVsZSkKK3sKKyAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHByZXBhcmVTZXJ2aWNlU3RhdGVFdmVudF9sKHN0YXRlKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPE1vZHVsZT4gc3Ryb25nTW9kdWxlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Nb2R1bGVzLnZhbHVlQXQoaSkuZ2V0KCkgPT0gbW9kdWxlKSB7CisgICAgICAgICAgICBzdHJvbmdNb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0cm9uZ01vZHVsZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2VuZENhbGxiYWNrRXZlbnRfbChuZXcgQ2FsbGJhY2tFdmVudChDYWxsYmFja0V2ZW50OjpUWVBFX1NFUlZJQ0VfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRNZW1vcnksIHN0cm9uZ01vZHVsZSkpOworfQorCisvLyBjYWxsIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kQ2FsbGJhY2tFdmVudF9sKGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCkKK3sKKyAgICBtQ2FsbGJhY2tUaHJlYWQtPnNlbmRDYWxsYmFja0V2ZW50KGV2ZW50KTsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Om9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpCit7CisgICAgQUxPR1YoIm9uQ2FsbGJhY2tFdmVudCIpOworICAgIHNwPE1vZHVsZT4gbW9kdWxlOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgbW9kdWxlID0gZXZlbnQtPm1Nb2R1bGUucHJvbW90ZSgpOworICAgICAgICBpZiAobW9kdWxlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtb2R1bGUtPm9uQ2FsbGJhY2tFdmVudChldmVudCk7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgICAgICAvLyBjbGVhciBub3cgdG8gZXhlY3V0ZSB3aXRoIG1TZXJ2aWNlTG9jayBsb2NrZWQKKyAgICAgICAgZXZlbnQtPm1NZW1vcnkuY2xlYXIoKTsKKyAgICB9Cit9CisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIlNvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tUaHJlYWQiCisKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OkNhbGxiYWNrVGhyZWFkKGNvbnN0IHdwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4mIHNlcnZpY2UpCisgICAgOiBtU2VydmljZShzZXJ2aWNlKQoreworfQorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjp+Q2FsbGJhY2tUaHJlYWQoKQoreworICAgIHdoaWxlICghbUV2ZW50UXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIG1FdmVudFF1ZXVlWzBdLT5tTWVtb3J5LmNsZWFyKCk7CisgICAgICAgIG1FdmVudFF1ZXVlLnJlbW92ZUF0KDApOworICAgIH0KK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpvbkZpcnN0UmVmKCkKK3sKKyAgICBydW4oInNvdW5kVHJpZ2dlciBjYmsiLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7Cit9CisKK2Jvb2wgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKSB7CisgICAgICAgIHNwPENhbGxiYWNrRXZlbnQ+IGV2ZW50OworICAgICAgICBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICAgICAgICAgIHdoaWxlIChtRXZlbnRRdWV1ZS5pc0VtcHR5KCkgJiYgIWV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ2FsbGJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKSBzbGVlcCIpOworICAgICAgICAgICAgICAgIG1DYWxsYmFja0NvbmQud2FpdChtQ2FsbGJhY2tMb2NrKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ2FsbGJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKSB3YWtlIHVwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXZlbnQgPSBtRXZlbnRRdWV1ZVswXTsKKyAgICAgICAgICAgIG1FdmVudFF1ZXVlLnJlbW92ZUF0KDApOworICAgICAgICAgICAgc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VydmljZSAhPSAwKSB7CisgICAgICAgICAgICBzZXJ2aWNlLT5vbkNhbGxiYWNrRXZlbnQoZXZlbnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpleGl0KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBtQ2FsbGJhY2tDb25kLmJyb2FkY2FzdCgpOworfQorCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OnNlbmRDYWxsYmFja0V2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja0V2ZW50PiYgZXZlbnQpCit7CisgICAgQXV0b011dGV4IGxvY2sobUNhbGxiYWNrTG9jayk7CisgICAgbUV2ZW50UXVldWUuYWRkKGV2ZW50KTsKKyAgICBtQ2FsbGJhY2tDb25kLnNpZ25hbCgpOworfQorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrRXZlbnQ6OkNhbGxiYWNrRXZlbnQoZXZlbnRfdHlwZSB0eXBlLCBzcDxJTWVtb3J5PiBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3A8TW9kdWxlPiBtb2R1bGUpCisgICAgOiBtVHlwZSh0eXBlKSwgbU1lbW9yeShtZW1vcnkpLCBtTW9kdWxlKG1vZHVsZSkKK3sKK30KKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja0V2ZW50Ojp+Q2FsbGJhY2tFdmVudCgpCit7Cit9CisKKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGUiCisKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpNb2R1bGUoY29uc3Qgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiYgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfdHJpZ2dlcl9od19kZXZpY2UqIGh3RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQpCisgOiBtU2VydmljZShzZXJ2aWNlKSwgbUh3RGV2aWNlKGh3RGV2aWNlKSwgbURlc2NyaXB0b3IoZGVzY3JpcHRvciksCisgICBtQ2xpZW50KGNsaWVudCksIG1TZXJ2aWNlU3RhdGUoU09VTkRfVFJJR0dFUl9TVEFURV9OT19JTklUKQoreworfQorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6fk1vZHVsZSgpIHsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6ZGV0YWNoKCkgeworICAgIEFMT0dWKCJkZXRhY2goKSIpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kZWxzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxNb2RlbD4gbW9kZWwgPSBtTW9kZWxzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBBTE9HVigiZGV0YWNoKCkgdW5sb2FkaW5nIG1vZGVsICVkIiwgbW9kZWwtPm1IYW5kbGUpOworICAgICAgICAgICAgaWYgKG1vZGVsLT5tU3RhdGUgPT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICAgICAgICAgIG1Id0RldmljZS0+c3RvcF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIG1vZGVsLT5tSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Id0RldmljZS0+dW5sb2FkX3NvdW5kX21vZGVsKG1Id0RldmljZSwgbW9kZWwtPm1IYW5kbGUpOworICAgICAgICB9CisgICAgICAgIG1Nb2RlbHMuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKG1DbGllbnQgIT0gMCkgeworICAgICAgICBtQ2xpZW50LT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgIH0KKyAgICBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgaWYgKHNlcnZpY2UgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNlcnZpY2UtPmRldGFjaE1vZHVsZSh0aGlzKTsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmxvYWRTb3VuZE1vZGVsKGNvbnN0IHNwPElNZW1vcnk+JiBtb2RlbE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBBTE9HVigibG9hZFNvdW5kTW9kZWwoKSBoYW5kbGUiKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBpZiAobW9kZWxNZW1vcnkgPT0gMCB8fCBtb2RlbE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImxvYWRTb3VuZE1vZGVsKCkgbW9kZWxNZW1vcnkgaXMgMCBvciBoYXMgTlVMTCBwb2ludGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kX21vZGVsID0KKyAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqKW1vZGVsTWVtb3J5LT5wb2ludGVyKCk7CisKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUh3RGV2aWNlLT5sb2FkX3NvdW5kX21vZGVsKG1Id0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c291bmRNb2RlbENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGU7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKKworICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbigmc2Vzc2lvbiwgJmlvSGFuZGxlLCAmZGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3A8TW9kZWw+IG1vZGVsID0gbmV3IE1vZGVsKCpoYW5kbGUsIHNlc3Npb24sIGlvSGFuZGxlLCBkZXZpY2UsIHNvdW5kX21vZGVsLT50eXBlKTsKKyAgICBtTW9kZWxzLnJlcGxhY2VWYWx1ZUZvcigqaGFuZGxlLCBtb2RlbCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6dW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgQUxPR1YoInVubG9hZFNvdW5kTW9kZWwoKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU1vZGVscy5pbmRleE9mS2V5KGhhbmRsZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxNb2RlbD4gbW9kZWwgPSBtTW9kZWxzLnZhbHVlQXQoaW5kZXgpOworICAgIG1Nb2RlbHMucmVtb3ZlSXRlbShoYW5kbGUpOworICAgIGlmIChtb2RlbC0+bVN0YXRlID09IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgbUh3RGV2aWNlLT5zdG9wX3JlY29nbml0aW9uKG1Id0RldmljZSwgbW9kZWwtPm1IYW5kbGUpOworICAgIH0KKyAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24obW9kZWwtPm1DYXB0dXJlU2Vzc2lvbik7CisgICAgcmV0dXJuIG1Id0RldmljZS0+dW5sb2FkX3NvdW5kX21vZGVsKG1Id0RldmljZSwgaGFuZGxlKTsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OnN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpCit7CisgICAgQUxPR1YoInN0YXJ0UmVjb2duaXRpb24oKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIGlmIChkYXRhTWVtb3J5ICE9IDAgJiYgZGF0YU1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInN0YXJ0UmVjb2duaXRpb24oKSBkYXRhTWVtb3J5IGlzIG5vbi0wIGJ1dCBoYXMgTlVMTCBwb2ludGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIH0KKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaWYgKG1TZXJ2aWNlU3RhdGUgPT0gU09VTkRfVFJJR0dFUl9TVEFURV9ESVNBQkxFRCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHNwPE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKGhhbmRsZSk7CisgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKChkYXRhTWVtb3J5ID09IDApIHx8CisgICAgICAgICAgICAoZGF0YU1lbW9yeS0+c2l6ZSgpIDwgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZykpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1vZGVsLT5tU3RhdGUgPT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcgPQorICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqKWRhdGFNZW1vcnktPnBvaW50ZXIoKTsKKworICAgIC8vVE9ETzogZ2V0IGNhcHR1cmUgaGFuZGxlIGFuZCBkZXZpY2UgZnJvbSBhdWRpbyBwb2xpY3kgc2VydmljZQorICAgIGNvbmZpZy0+Y2FwdHVyZV9oYW5kbGUgPSBtb2RlbC0+bUNhcHR1cmVJT0hhbmRsZTsKKyAgICBjb25maWctPmNhcHR1cmVfZGV2aWNlID0gbW9kZWwtPm1DYXB0dXJlRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1Id0RldmljZS0+c3RhcnRfcmVjb2duaXRpb24obUh3RGV2aWNlLCBoYW5kbGUsIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnJlY29nbml0aW9uQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1vZGVsLT5tU3RhdGUgPSBNb2RlbDo6U1RBVEVfQUNUSVZFOworICAgICAgICBtb2RlbC0+bUNvbmZpZyA9ICpjb25maWc7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OnN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgQUxPR1YoInN0b3BSZWNvZ25pdGlvbigpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHNwPE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKGhhbmRsZSk7CisgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobW9kZWwtPm1TdGF0ZSAhPSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgbUh3RGV2aWNlLT5zdG9wX3JlY29nbml0aW9uKG1Id0RldmljZSwgaGFuZGxlKTsKKyAgICBtb2RlbC0+bVN0YXRlID0gTW9kZWw6OlNUQVRFX0lETEU7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6Om9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpCit7CisgICAgQUxPR1YoIm9uQ2FsbGJhY2tFdmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKKworICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gZXZlbnQtPm1NZW1vcnk7CisKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobUNsaWVudCA9PSAwKSB7CisgICAgICAgIEFMT0dJKCIlcyBtQ2xpZW50ID09IDAiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGV2ZW50LT5tVHlwZSkgeworICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9SRUNPR05JVElPTjogeworICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqcmVjb2duaXRpb25FdmVudCA9CisgICAgICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKTsKKyAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50OworICAgICAgICB7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgICAgICBzcDxNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChyZWNvZ25pdGlvbkV2ZW50LT5tb2RlbCk7CisgICAgICAgICAgICBpZiAobW9kZWwgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBtb2RlbCA9PSAwIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtb2RlbC0+bVN0YXRlICE9IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigib25DYWxsYmFja0V2ZW50IG1vZGVsLT5tU3RhdGUgJWQgIT0gTW9kZWw6OlNUQVRFX0FDVElWRSIsIG1vZGVsLT5tU3RhdGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVjb2duaXRpb25FdmVudC0+Y2FwdHVyZV9zZXNzaW9uID0gbW9kZWwtPm1DYXB0dXJlU2Vzc2lvbjsKKyAgICAgICAgICAgIG1vZGVsLT5tU3RhdGUgPSBNb2RlbDo6U1RBVEVfSURMRTsKKyAgICAgICAgICAgIGNsaWVudCA9IG1DbGllbnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaWVudCAhPSAwKSB7CisgICAgICAgICAgICBjbGllbnQtPm9uUmVjb2duaXRpb25FdmVudChldmVudE1lbW9yeSk7CisgICAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9TT1VORE1PREVMOiB7CisgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpzb3VuZG1vZGVsRXZlbnQgPQorICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7CisgICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudDsKKyAgICAgICAgeworICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICAgICAgc3A8TW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwoc291bmRtb2RlbEV2ZW50LT5tb2RlbCk7CisgICAgICAgICAgICBpZiAobW9kZWwgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBtb2RlbCA9PSAwIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsaWVudCA9IG1DbGllbnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaWVudCAhPSAwKSB7CisgICAgICAgICAgICBjbGllbnQtPm9uU291bmRNb2RlbEV2ZW50KGV2ZW50TWVtb3J5KTsKKyAgICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBDYWxsYmFja0V2ZW50OjpUWVBFX1NFUlZJQ0VfU1RBVEU6IHsKKyAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50OworICAgICAgICB7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgICAgICBjbGllbnQgPSBtQ2xpZW50OworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnQgIT0gMCkgeworICAgICAgICAgICAgY2xpZW50LT5vblNlcnZpY2VTdGF0ZUNoYW5nZShldmVudE1lbW9yeSk7CisgICAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIm9uQ2FsbGJhY2tFdmVudCB1bmtub3duIGV2ZW50IHR5cGUgJWQiLCBldmVudC0+bVR5cGUpOworICAgIH0KK30KKworc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2RlbD4gU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmdldE1vZGVsKAorICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgc3A8TW9kZWw+IG1vZGVsOworICAgIHNzaXplX3QgaW5kZXggPSBtTW9kZWxzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBtb2RlbCA9IG1Nb2RlbHMudmFsdWVBdChpbmRleCk7CisgICAgfQorICAgIHJldHVybiBtb2RlbDsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6YmluZGVyRGllZCgKKyAgICBjb25zdCB3cDxJQmluZGVyPiAmd2hvIF9fdW51c2VkKSB7CisgICAgQUxPR1coImNsaWVudCBiaW5kZXIgZGllZCBmb3IgbW9kdWxlICVkIiwgbURlc2NyaXB0b3IuaGFuZGxlKTsKKyAgICBkZXRhY2goKTsKK30KKworLy8gQ2FsbGVkIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OnNldENhcHR1cmVTdGF0ZV9sKGJvb2wgYWN0aXZlKQoreworICAgIEFMT0dWKCJNb2R1bGU6OnNldENhcHR1cmVTdGF0ZV9sICVkIiwgYWN0aXZlKTsKKyAgICBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2U7CisgICAgc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGU7CisKKyAgICBWZWN0b3I8IHNwPElNZW1vcnk+ID4gZXZlbnRzOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICBzdGF0ZSA9IChhY3RpdmUgJiYgIW1EZXNjcmlwdG9yLnByb3BlcnRpZXMuY29uY3VycmVudF9jYXB0dXJlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09VTkRfVFJJR0dFUl9TVEFURV9ESVNBQkxFRCA6IFNPVU5EX1RSSUdHRVJfU1RBVEVfRU5BQkxFRDsKKworICAgICAgICBpZiAoc3RhdGUgPT0gbVNlcnZpY2VTdGF0ZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbVNlcnZpY2VTdGF0ZSA9IHN0YXRlOworCisgICAgICAgIHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0ZSA9PSBTT1VORF9UUklHR0VSX1NUQVRFX0VOQUJMRUQpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZGVscy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8TW9kZWw+IG1vZGVsID0gbU1vZGVscy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG1vZGVsLT5tU3RhdGUgPT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICAgICAgICAgIG1Id0RldmljZS0+c3RvcF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIG1vZGVsLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAvLyBrZWVwIG1vZGVsIGluIEFDVElWRSBzdGF0ZSBzbyB0aGF0IGV2ZW50IGlzIHByb2Nlc3NlZCBieSBvbkNhbGxiYWNrRXZlbnQoKQorICAgICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCBwaHJhc2VFdmVudDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGVsLT5tVHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTU9ERUxfVFlQRV9LRVlQSFJBU0U6CisgICAgICAgICAgICAgICAgICAgIHBocmFzZUV2ZW50Lm51bV9waHJhc2VzID0gbW9kZWwtPm1Db25maWcubnVtX3BocmFzZXM7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGhyYXNlRXZlbnQubnVtX3BocmFzZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGhyYXNlRXZlbnQucGhyYXNlX2V4dHJhc1tpXSA9IG1vZGVsLT5tQ29uZmlnLnBocmFzZXNbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NT0RFTF9UWVBFX1VOS05PV046CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBocmFzZUV2ZW50LmNvbW1vbi5zdGF0dXMgPSBSRUNPR05JVElPTl9TVEFUVVNfQUJPUlQ7CisgICAgICAgICAgICAgICAgcGhyYXNlRXZlbnQuY29tbW9uLnR5cGUgPSBtb2RlbC0+bVR5cGU7CisgICAgICAgICAgICAgICAgcGhyYXNlRXZlbnQuY29tbW9uLm1vZGVsID0gbW9kZWwtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgcGhyYXNlRXZlbnQuY29tbW9uLmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBzZXJ2aWNlLT5wcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKCZwaHJhc2VFdmVudC5jb21tb24pOworICAgICAgICAgICAgICAgIGlmIChldmVudE1lbW9yeSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hZGQoZXZlbnRNZW1vcnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXZlbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNlcnZpY2UtPnNlbmRDYWxsYmFja0V2ZW50X2wobmV3IENhbGxiYWNrRXZlbnQoQ2FsbGJhY2tFdmVudDo6VFlQRV9SRUNPR05JVElPTiwgZXZlbnRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKSk7CisgICAgfQorCitleGl0OgorICAgIHNlcnZpY2UtPnNlbmRTZXJ2aWNlU3RhdGVFdmVudF9sKHN0YXRlLCB0aGlzKTsKK30KKworCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZGVsOjpNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsX3R5cGVfdCB0eXBlKSA6CisgICAgbUhhbmRsZShoYW5kbGUpLCBtU3RhdGUoU1RBVEVfSURMRSksIG1DYXB0dXJlU2Vzc2lvbihzZXNzaW9uKSwKKyAgICBtQ2FwdHVyZUlPSGFuZGxlKGlvSGFuZGxlKSwgbUNhcHR1cmVEZXZpY2UoZGV2aWNlKSwgbVR5cGUodHlwZSkKK3sKKworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6ZHVtcChpbnQgZmQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNWRhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9TRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSEFMX1NFUlZJQ0VfSAorCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisvLyNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JQXBwT3BzQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL3NvdW5kX3RyaWdnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZW1vcnlIZWFwQmFzZTsKKworY2xhc3MgU291bmRUcmlnZ2VySHdTZXJ2aWNlIDoKKyAgICBwdWJsaWMgQmluZGVyU2VydmljZTxTb3VuZFRyaWdnZXJId1NlcnZpY2U+LAorICAgIHB1YmxpYyBCblNvdW5kVHJpZ2dlckh3U2VydmljZQoreworICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPFNvdW5kVHJpZ2dlckh3U2VydmljZT47CitwdWJsaWM6CisgICAgY2xhc3MgTW9kdWxlOworCisgICAgc3RhdGljIGNoYXIgY29uc3QqIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLnNvdW5kX3RyaWdnZXJfaHciOyB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZSgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgflNvdW5kVHJpZ2dlckh3U2VydmljZSgpOworCisgICAgLy8gSVNvdW5kVHJpZ2dlckh3U2VydmljZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCisgICAgY2xhc3MgTW9kZWwgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgIHB1YmxpYzoKKworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIFNUQVRFX0lETEUsCisgICAgICAgICAgICBTVEFURV9BQ1RJVkUKKyAgICAgICAgfTsKKworICAgICAgICBNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbF90eXBlX3QgdHlwZSk7CisgICAgICAgIH5Nb2RlbCgpIHt9CisKKyAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgICAgbUhhbmRsZTsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVN0YXRlOworICAgICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtQ2FwdHVyZVNlc3Npb247CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1DYXB0dXJlSU9IYW5kbGU7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1DYXB0dXJlRGV2aWNlOworICAgICAgICBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsX3R5cGVfdCBtVHlwZTsKKyAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnIG1Db25maWc7CisgICAgfTsKKworICAgIGNsYXNzIENhbGxiYWNrRXZlbnQgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIGVudW0geworICAgICAgICAgICAgVFlQRV9SRUNPR05JVElPTiwKKyAgICAgICAgICAgIFRZUEVfU09VTkRNT0RFTCwKKyAgICAgICAgICAgIFRZUEVfU0VSVklDRV9TVEFURSwKKyAgICAgICAgfSBldmVudF90eXBlOworICAgICAgICBDYWxsYmFja0V2ZW50KGV2ZW50X3R5cGUgdHlwZSwgc3A8SU1lbW9yeT4gbWVtb3J5LCB3cDxNb2R1bGU+IG1vZHVsZSk7CisKKyAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+Q2FsbGJhY2tFdmVudCgpOworCisgICAgICAgIGV2ZW50X3R5cGUgbVR5cGU7CisgICAgICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisgICAgICAgIHdwPE1vZHVsZT4gbU1vZHVsZTsKKyAgICB9OworCisgICAgY2xhc3MgTW9kdWxlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSwKKyAgICAgICAgICAgICAgICAgICBwdWJsaWMgQm5Tb3VuZFRyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50ICAgICB7CisgICAgcHVibGljOgorCisgICAgICAgTW9kdWxlKGNvbnN0IHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4mIHNlcnZpY2UsCisgICAgICAgICAgICAgIHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlKiBod0RldmljZSwKKyAgICAgICAgICAgICAgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50KTsKKworICAgICAgIHZpcnR1YWwgfk1vZHVsZSgpOworCisgICAgICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkU291bmRNb2RlbChjb25zdCBzcDxJTWVtb3J5PiYgbW9kZWxNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOworICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworCisgICAgICAgc291bmRfdHJpZ2dlcl9od19kZXZpY2UgKmh3RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlOyB9CisgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZGVzY3JpcHRvcigpIHsgcmV0dXJuIG1EZXNjcmlwdG9yOyB9CisgICAgICAgdm9pZCBzZXRDbGllbnQoc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50KSB7IG1DbGllbnQgPSBjbGllbnQ7IH0KKyAgICAgICB2b2lkIGNsZWFyQ2xpZW50KCkgeyBtQ2xpZW50LmNsZWFyKCk7IH0KKyAgICAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQoKSBjb25zdCB7IHJldHVybiBtQ2xpZW50OyB9CisgICAgICAgd3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiBzZXJ2aWNlKCkgY29uc3QgeyByZXR1cm4gbVNlcnZpY2U7IH0KKworICAgICAgIHZvaWQgb25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCk7CisKKyAgICAgICBzcDxNb2RlbD4gZ2V0TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgICAgIHZvaWQgc2V0Q2FwdHVyZVN0YXRlX2woYm9vbCBhY3RpdmUpOworCisgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOworICAgICAgICB3cDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+ICAgICAgICAgICAgICBtU2VydmljZTsKKyAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlKiAgICAgICAgbUh3RGV2aWNlOworICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciBtRGVzY3JpcHRvcjsKKyAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gICAgICAgICAgICAgICAgbUNsaWVudDsKKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBzb3VuZF9tb2RlbF9oYW5kbGVfdCwgc3A8TW9kZWw+ID4gICAgIG1Nb2RlbHM7CisgICAgICAgIHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90ICAgICAgICAgIG1TZXJ2aWNlU3RhdGU7CisgICAgfTsgLy8gY2xhc3MgTW9kdWxlCisKKyAgICBjbGFzcyBDYWxsYmFja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIHB1YmxpYzoKKworICAgICAgICBDYWxsYmFja1RocmVhZChjb25zdCB3cDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+JiBzZXJ2aWNlKTsKKworICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5DYWxsYmFja1RocmVhZCgpOworCisgICAgICAgIC8vIFRocmVhZCB2aXJ0dWFscworICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKKworICAgICAgICAvLyBSZWZCYXNlCisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOworCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRDYWxsYmFja0V2ZW50KGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICB3cDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+ICAgbVNlcnZpY2U7CisgICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb25kOworICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrTG9jazsKKyAgICAgICAgVmVjdG9yPCBzcDxDYWxsYmFja0V2ZW50PiA+IG1FdmVudFF1ZXVlOworICAgIH07CisKKyAgICAgICAgICAgdm9pZCBkZXRhY2hNb2R1bGUoc3A8TW9kdWxlPiBtb2R1bGUpOworCisgICAgc3RhdGljIHZvaWQgcmVjb2duaXRpb25DYWxsYmFjayhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQsIHZvaWQgKmNvb2tpZSk7CisgICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50KTsKKyAgICAgICAgICAgdm9pZCBzZW5kUmVjb2duaXRpb25FdmVudChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQsIE1vZHVsZSAqbW9kdWxlKTsKKworICAgIHN0YXRpYyB2b2lkIHNvdW5kTW9kZWxDYWxsYmFjayhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqZXZlbnQsIHZvaWQgKmNvb2tpZSk7CisgICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVTb3VuZE1vZGVsRXZlbnRfbChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqZXZlbnQpOworICAgICAgICAgICB2b2lkIHNlbmRTb3VuZE1vZGVsRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50LCBNb2R1bGUgKm1vZHVsZSk7CisKKyAgICAgICAgICAgc3A8SU1lbW9yeT4gcHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50X2woc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUpOworICAgICAgICAgICB2b2lkIHNlbmRTZXJ2aWNlU3RhdGVFdmVudF9sKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlLCBNb2R1bGUgKm1vZHVsZSk7CisKKyAgICAgICAgICAgdm9pZCBzZW5kQ2FsbGJhY2tFdmVudF9sKGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCk7CisgICAgICAgICAgIHZvaWQgb25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCk7CisKK3ByaXZhdGU6CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOworCisgICAgTXV0ZXggICAgICAgICAgICAgICBtU2VydmljZUxvY2s7CisgICAgdm9sYXRpbGUgaW50MzJfdCAgICBtTmV4dFVuaXF1ZUlkOworICAgIERlZmF1bHRLZXllZFZlY3Rvcjwgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QsIHNwPE1vZHVsZT4gPiAgICAgbU1vZHVsZXM7CisgICAgc3A8Q2FsbGJhY2tUaHJlYWQ+ICBtQ2FsbGJhY2tUaHJlYWQ7CisgICAgc3A8TWVtb3J5RGVhbGVyPiAgICBtTWVtb3J5RGVhbGVyOworICAgIGJvb2wgICAgICAgICAgICAgICAgbUNhcHR1cmVTdGF0ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rIGIvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxYzRjMgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzggQEAKKyMgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJU291bmRUcmlnZ2VyLmNwcCBcCisJSVNvdW5kVHJpZ2dlci5jcHAgXAorCUlTb3VuZFRyaWdnZXJDbGllbnQuY3BwIFwKKwlJU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorCWxpYnV0aWxzIFwKKwlsaWJsb2cgXAorCWxpYmJpbmRlciBcCisJbGliaGFyZHdhcmUKKworI0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorCXN5c3RlbS9tZWRpYS9jYW1lcmEvaW5jbHVkZSBcCisJc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUKKworTE9DQUxfTU9EVUxFOj0gbGlic291bmR0cmlnZ2VyCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjI4MGQxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCkBAIC0wLDAgKzEsMTc3IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIklTb3VuZFRyaWdnZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIERFVEFDSCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgTE9BRF9TT1VORF9NT0RFTCwKKyAgICBVTkxPQURfU09VTkRfTU9ERUwsCisgICAgU1RBUlRfUkVDT0dOSVRJT04sCisgICAgU1RPUF9SRUNPR05JVElPTiwKK307CisKK2NsYXNzIEJwU291bmRUcmlnZ2VyOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlcj4KK3sKK3B1YmxpYzoKKyAgICBCcFNvdW5kVHJpZ2dlcihjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VyPihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGRldGFjaCgpCisgICAgeworICAgICAgICBBTE9HVigiZGV0YWNoIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChERVRBQ0gsIGRhdGEsICZyZXBseSk7CisgICAgfQorCisgICAgc3RhdHVzX3QgbG9hZFNvdW5kTW9kZWwoY29uc3Qgc3A8SU1lbW9yeT4mICBtb2RlbE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpCisgICAgeworICAgICAgICBpZiAobW9kZWxNZW1vcnkgPT0gMCB8fCBoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKG1vZGVsTWVtb3J5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExPQURfU09VTkRfTU9ERUwsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXBseS5yZWFkKGhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChVTkxPQURfU09VTkRfTU9ERUwsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgaWYgKGRhdGFNZW1vcnkgPT0gMCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRhdGFNZW1vcnktPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihkYXRhTWVtb3J5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX1JFQ09HTklUSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9SRUNPR05JVElPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoU291bmRUcmlnZ2VyLCAiYW5kcm9pZC5oYXJkd2FyZS5JU291bmRUcmlnZ2VyIik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQm5Tb3VuZFRyaWdnZXI6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2goY29kZSkgeworICAgICAgICBjYXNlIERFVEFDSDogeworICAgICAgICAgICAgQUxPR1YoIkRFVEFDSCIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGRldGFjaCgpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIExPQURfU09VTkRfTU9ERUw6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBtb2RlbE1lbW9yeSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KAorICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxvYWRTb3VuZE1vZGVsKG1vZGVsTWVtb3J5LCAmaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgVU5MT0FEX1NPVU5EX01PREVMOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdW5sb2FkU291bmRNb2RlbChoYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNUQVJUX1JFQ09HTklUSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICAgICAgc3A8SU1lbW9yeT4gZGF0YU1lbW9yeTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICBkYXRhTWVtb3J5ID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRSZWNvZ25pdGlvbihoYW5kbGUsIGRhdGFNZW1vcnkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNUT1BfUkVDT0dOSVRJT046IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wUmVjb2duaXRpb24oaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5jcHAgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiNDQyOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmNwcApAQCAtMCwwICsxLDExMCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIE9OX1JFQ09HTklUSU9OX0VWRU5UID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBPTl9TT1VORE1PREVMX0VWRU5ULAorICAgIE9OX1NFUlZJQ0VfU1RBVEVfQ0hBTkdFCit9OworCitjbGFzcyBCcFNvdW5kVHJpZ2dlckNsaWVudDogcHVibGljIEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXJDbGllbnQ+Cit7CisKK3B1YmxpYzoKKyAgICBCcFNvdW5kVHJpZ2dlckNsaWVudChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VyQ2xpZW50PihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoZXZlbnRNZW1vcnktPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT05fUkVDT0dOSVRJT05fRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Tb3VuZE1vZGVsRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihldmVudE1lbW9yeS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPTl9TT1VORE1PREVMX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VTdGF0ZUNoYW5nZShjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGV2ZW50TWVtb3J5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9OX1NFUlZJQ0VfU1RBVEVfQ0hBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlckNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5JU291bmRUcmlnZ2VyQ2xpZW50Iik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQm5Tb3VuZFRyaWdnZXJDbGllbnQ6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2goY29kZSkgeworICAgICAgICBjYXNlIE9OX1JFQ09HTklUSU9OX0VWRU5UOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlckNsaWVudCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PigKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBvblJlY29nbml0aW9uRXZlbnQoZXZlbnRNZW1vcnkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIE9OX1NPVU5ETU9ERUxfRVZFTlQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KAorICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIG9uU291bmRNb2RlbEV2ZW50KGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBPTl9TRVJWSUNFX1NUQVRFX0NIQU5HRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oCisgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgb25TZXJ2aWNlU3RhdGVDaGFuZ2UoZXZlbnRNZW1vcnkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTcyOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC0wLDAgKzEsMTcwIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIkJwU291bmRUcmlnZ2VySHdTZXJ2aWNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBMSVNUX01PRFVMRVMgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIEFUVEFDSCwKKyAgICBTRVRfQ0FQVFVSRV9TVEFURSwKK307CisKK2NsYXNzIEJwU291bmRUcmlnZ2VySHdTZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4KK3sKK3B1YmxpYzoKKyAgICBCcFNvdW5kVHJpZ2dlckh3U2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCisgICAgeworICAgICAgICBpZiAobnVtTW9kdWxlcyA9PSBOVUxMIHx8ICgqbnVtTW9kdWxlcyAhPSAwICYmIG1vZHVsZXMgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckh3U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgdW5zaWduZWQgaW50IG51bU1vZHVsZXNSZXEgPSAobW9kdWxlcyA9PSBOVUxMKSA/IDAgOiAqbnVtTW9kdWxlczsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKG51bU1vZHVsZXNSZXEpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9NT0RVTEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICAqbnVtTW9kdWxlcyA9ICh1bnNpZ25lZCBpbnQpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImxpc3RNb2R1bGVzKCkgc3RhdHVzICVkIGdvdCAqbnVtTW9kdWxlcyAlZCIsIHN0YXR1cywgKm51bU1vZHVsZXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+ICpudW1Nb2R1bGVzKSB7CisgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9ICpudW1Nb2R1bGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChtb2R1bGVzLCBudW1Nb2R1bGVzUmVxICogc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckh3U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2Yoc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQVRUQUNILCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgIG1vZHVsZSA9IGludGVyZmFjZV9jYXN0PElTb3VuZFRyaWdnZXI+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihhY3RpdmUpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0NBUFRVUkVfU1RBVEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoU291bmRUcmlnZ2VySHdTZXJ2aWNlLCAiYW5kcm9pZC5oYXJkd2FyZS5JU291bmRUcmlnZ2VySHdTZXJ2aWNlIik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQm5Tb3VuZFRyaWdnZXJId1NlcnZpY2U6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2goY29kZSkgeworICAgICAgICBjYXNlIExJU1RfTU9EVUxFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJId1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzID0gbnVtTW9kdWxlc1JlcTsKKyAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzID0KKyAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICopY2FsbG9jKG51bU1vZHVsZXNSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RNb2R1bGVzKG1vZHVsZXMsICZudW1Nb2R1bGVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihudW1Nb2R1bGVzKTsKKyAgICAgICAgICAgIEFMT0dWKCJMSVNUX01PRFVMRVMgc3RhdHVzICVkIGdvdCBudW1Nb2R1bGVzICVkIiwgc3RhdHVzLCBudW1Nb2R1bGVzKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gbnVtTW9kdWxlcykgeworICAgICAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxID0gbnVtTW9kdWxlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKG1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgKiBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUobW9kdWxlcyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEFUVEFDSDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJId1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2Yoc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElTb3VuZFRyaWdnZXJDbGllbnQ+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+IG1vZHVsZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dGFjaChoYW5kbGUsIGNsaWVudCwgbW9kdWxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAobW9kdWxlICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIobW9kdWxlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBTRVRfQ0FQVFVSRV9TVEFURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJId1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldENhcHR1cmVTdGF0ZSgoYm9vbClkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcCBiL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMTVjMzAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcApAQCAtMCwwICsxLDI4OCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgKEMpIDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiU291bmRUcmlnZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorCisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJDYWxsYmFjay5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisgICAgc3A8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4gZ1NvdW5kVHJpZ2dlckh3U2VydmljZTsKKyAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICBrU291bmRUcmlnZ2VySHdTZXJ2aWNlUG9sbERlbGF5ID0gNTAwMDAwOyAvLyAwLjVzCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAga1NvdW5kVHJpZ2dlckh3U2VydmljZU5hbWUgICAgICA9ICJtZWRpYS5zb3VuZF90cmlnZ2VyX2h3IjsKKyAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICBnTG9jazsKKworICAgIGNsYXNzIERlYXRoTm90aWZpZXIgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBEZWF0aE5vdGlmaWVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgeworICAgICAgICAgICAgQUxPR1YoImJpbmRlckRpZWQiKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgICAgICAgICBnU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNsZWFyKCk7CisgICAgICAgICAgICBBTE9HVygiU291bmQgdHJpZ2dlciBzZXJ2aWNlIGRpZWQhIik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3A8RGVhdGhOb3RpZmllcj4gICAgICAgICBnRGVhdGhOb3RpZmllcjsKK307IC8vIG5hbWVzcGFjZSBhbm9ueW1vdXMKKworY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4mIFNvdW5kVHJpZ2dlcjo6Z2V0U291bmRUcmlnZ2VySHdTZXJ2aWNlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgIGlmIChnU291bmRUcmlnZ2VySHdTZXJ2aWNlLmdldCgpID09IDApIHsKKyAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXI7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KGtTb3VuZFRyaWdnZXJId1NlcnZpY2VOYW1lKSk7CisgICAgICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dXKCJTb3VuZFRyaWdnZXJId1NlcnZpY2Ugbm90IHB1Ymxpc2hlZCwgd2FpdGluZy4uLiIpOworICAgICAgICAgICAgdXNsZWVwKGtTb3VuZFRyaWdnZXJId1NlcnZpY2VQb2xsRGVsYXkpOworICAgICAgICB9IHdoaWxlKHRydWUpOworICAgICAgICBpZiAoZ0RlYXRoTm90aWZpZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgZ0RlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcigpOworICAgICAgICB9CisgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgoZ0RlYXRoTm90aWZpZXIpOworICAgICAgICBnU291bmRUcmlnZ2VySHdTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4oYmluZGVyKTsKKyAgICB9CisgICAgQUxPR0VfSUYoZ1NvdW5kVHJpZ2dlckh3U2VydmljZSA9PSAwLCAibm8gU291bmRUcmlnZ2VySHdTZXJ2aWNlIT8iKTsKKyAgICByZXR1cm4gZ1NvdW5kVHJpZ2dlckh3U2VydmljZTsKK30KKworLy8gU3RhdGljIG1ldGhvZHMKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6bGlzdE1vZHVsZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKK3sKKyAgICBBTE9HVigibGlzdE1vZHVsZXMoKSIpOworICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+JiBzZXJ2aWNlID0gZ2V0U291bmRUcmlnZ2VySHdTZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHNlcnZpY2UtPmxpc3RNb2R1bGVzKG1vZHVsZXMsIG51bU1vZHVsZXMpOworfQorCitzcDxTb3VuZFRyaWdnZXI+IFNvdW5kVHJpZ2dlcjo6YXR0YWNoKGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291bmRUcmlnZ2VyQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBBTE9HVigiYXR0YWNoKCkiKTsKKyAgICBzcDxTb3VuZFRyaWdnZXI+IHNvdW5kVHJpZ2dlcjsKKyAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPiYgc2VydmljZSA9IGdldFNvdW5kVHJpZ2dlckh3U2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIHNvdW5kVHJpZ2dlcjsKKyAgICB9CisgICAgc291bmRUcmlnZ2VyID0gbmV3IFNvdW5kVHJpZ2dlcihtb2R1bGUsIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXJ2aWNlLT5hdHRhY2gobW9kdWxlLCBzb3VuZFRyaWdnZXIsIHNvdW5kVHJpZ2dlci0+bUlTb3VuZFRyaWdnZXIpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBzb3VuZFRyaWdnZXItPm1JU291bmRUcmlnZ2VyICE9IDApIHsKKyAgICAgICAgc291bmRUcmlnZ2VyLT5tSVNvdW5kVHJpZ2dlci0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgoc291bmRUcmlnZ2VyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiRXJyb3IgJWQgY29ubmVjdGluZyB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UiLCBzdGF0dXMpOworICAgICAgICBzb3VuZFRyaWdnZXIuY2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHNvdW5kVHJpZ2dlcjsKK30KKworCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSkKK3sKKyAgICBBTE9HVigic2V0Q2FwdHVyZVN0YXRlKCVkKSIsIGFjdGl2ZSk7CisgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4mIHNlcnZpY2UgPSBnZXRTb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gc2VydmljZS0+c2V0Q2FwdHVyZVN0YXRlKGFjdGl2ZSk7Cit9CisKKy8vIFNvdW5kVHJpZ2dlcgorU291bmRUcmlnZ2VyOjpTb3VuZFRyaWdnZXIoc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291bmRUcmlnZ2VyQ2FsbGJhY2s+JiBjYWxsYmFjaykKKyAgICA6IG1Nb2R1bGUobW9kdWxlKSwgbUNhbGxiYWNrKGNhbGxiYWNrKQoreworfQorCitTb3VuZFRyaWdnZXI6On5Tb3VuZFRyaWdnZXIoKQoreworICAgIGlmIChtSVNvdW5kVHJpZ2dlciAhPSAwKSB7CisgICAgICAgIG1JU291bmRUcmlnZ2VyLT5kZXRhY2goKTsKKyAgICB9Cit9CisKKwordm9pZCBTb3VuZFRyaWdnZXI6OmRldGFjaCgpIHsKKyAgICBBTE9HVigiZGV0YWNoKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIGlmIChtSVNvdW5kVHJpZ2dlciAhPSAwKSB7CisgICAgICAgIG1JU291bmRUcmlnZ2VyLT5kZXRhY2goKTsKKyAgICAgICAgbUlTb3VuZFRyaWdnZXItPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIG1JU291bmRUcmlnZ2VyID0gMDsKKyAgICB9Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6bG9hZFNvdW5kTW9kZWwoY29uc3Qgc3A8SU1lbW9yeT4mIG1vZGVsTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1JU291bmRUcmlnZ2VyLT5sb2FkU291bmRNb2RlbChtb2RlbE1lbW9yeSwgaGFuZGxlKTsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjp1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVNvdW5kVHJpZ2dlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlTb3VuZFRyaWdnZXItPnVubG9hZFNvdW5kTW9kZWwoaGFuZGxlKTsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVNvdW5kVHJpZ2dlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlTb3VuZFRyaWdnZXItPnN0YXJ0UmVjb2duaXRpb24oaGFuZGxlLCBkYXRhTWVtb3J5KTsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+c3RvcFJlY29nbml0aW9uKGhhbmRsZSk7Cit9CisKKy8vIEJwU291bmRUcmlnZ2VyQ2xpZW50Cit2b2lkIFNvdW5kVHJpZ2dlcjo6b25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25SZWNvZ25pdGlvbkV2ZW50KAorICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCkpOworICAgIH0KK30KKwordm9pZCBTb3VuZFRyaWdnZXI6Om9uU291bmRNb2RlbEV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25Tb3VuZE1vZGVsRXZlbnQoCisgICAgICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKSk7CisgICAgfQorfQorCit2b2lkIFNvdW5kVHJpZ2dlcjo6b25TZXJ2aWNlU3RhdGVDaGFuZ2UoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vblNlcnZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgICAgICAgICAqKChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCkpKTsKKyAgICB9Cit9CisKKy8vSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKK3ZvaWQgU291bmRUcmlnZ2VyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEFMT0dXKCJTb3VuZFRyaWdnZXIgc2VydmVyIGJpbmRlciBEaWVkICIpOworICAgIG1JU291bmRUcmlnZ2VyID0gMDsKKyAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vblNlcnZpY2VEaWVkKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OnN0cmluZ1RvR3VpZChjb25zdCBjaGFyICpzdHIsIHNvdW5kX3RyaWdnZXJfdXVpZF90ICpndWlkKQoreworICAgIGlmIChzdHIgPT0gTlVMTCB8fCBndWlkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbnQgdG1wWzEwXTsKKworICAgIGlmIChzc2NhbmYoc3RyLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgdG1wLCB0bXArMSwgdG1wKzIsIHRtcCszLCB0bXArNCwgdG1wKzUsIHRtcCs2LCB0bXArNywgdG1wKzgsIHRtcCs5KSA8IDEwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGd1aWQtPnRpbWVMb3cgPSAodWludDMyX3QpdG1wWzBdOworICAgIGd1aWQtPnRpbWVNaWQgPSAodWludDE2X3QpdG1wWzFdOworICAgIGd1aWQtPnRpbWVIaUFuZFZlcnNpb24gPSAodWludDE2X3QpdG1wWzJdOworICAgIGd1aWQtPmNsb2NrU2VxID0gKHVpbnQxNl90KXRtcFszXTsKKyAgICBndWlkLT5ub2RlWzBdID0gKHVpbnQ4X3QpdG1wWzRdOworICAgIGd1aWQtPm5vZGVbMV0gPSAodWludDhfdCl0bXBbNV07CisgICAgZ3VpZC0+bm9kZVsyXSA9ICh1aW50OF90KXRtcFs2XTsKKyAgICBndWlkLT5ub2RlWzNdID0gKHVpbnQ4X3QpdG1wWzddOworICAgIGd1aWQtPm5vZGVbNF0gPSAodWludDhfdCl0bXBbOF07CisgICAgZ3VpZC0+bm9kZVs1XSA9ICh1aW50OF90KXRtcFs5XTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpndWlkVG9TdHJpbmcoY29uc3Qgc291bmRfdHJpZ2dlcl91dWlkX3QgKmd1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbikKK3sKKyAgICBpZiAoZ3VpZCA9PSBOVUxMIHx8IHN0ciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc25wcmludGYoc3RyLCBtYXhMZW4sICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICBndWlkLT50aW1lTG93LAorICAgICAgICAgICAgZ3VpZC0+dGltZU1pZCwKKyAgICAgICAgICAgIGd1aWQtPnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICBndWlkLT5jbG9ja1NlcSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbMF0sCisgICAgICAgICAgICBndWlkLT5ub2RlWzFdLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVsyXSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbM10sCisgICAgICAgICAgICBndWlkLT5ub2RlWzRdLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVs1XSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90b29scy9yZXNhbXBsZXJfdG9vbHMvZmlyLmNwcCBiL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9maXIuY3BwCmluZGV4IGNjM2Q1MDkuLjYyZWRkY2EgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9maXIuY3BwCisrKyBiL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9maXIuY3BwCkBAIC0yMCwxNSArMjAsMjUgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotc3RhdGljIGRvdWJsZSBzaW5jKGRvdWJsZSB4KSB7CitzdGF0aWMgaW5saW5lIGRvdWJsZSBzaW5jKGRvdWJsZSB4KSB7CiAgICAgaWYgKGZhYnMoeCkgPT0gMC4wZikgcmV0dXJuIDEuMGY7CiAgICAgcmV0dXJuIHNpbih4KSAvIHg7CiB9CiAKLXN0YXRpYyBkb3VibGUgc3FyKGRvdWJsZSB4KSB7CitzdGF0aWMgaW5saW5lIGRvdWJsZSBzcXIoZG91YmxlIHgpIHsKICAgICByZXR1cm4geCp4OwogfQogCitzdGF0aWMgaW5saW5lIGludDY0X3QgdG9pbnQoZG91YmxlIHgsIGludDY0X3QgbWF4dmFsKSB7CisgICAgaW50NjRfdCB2OworCisgICAgdiA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGZsb29yKHggKiBtYXh2YWwgKyAwLjUpKTsKKyAgICBpZiAodiA+PSBtYXh2YWwpIHsKKyAgICAgICAgcmV0dXJuIG1heHZhbCAtIDE7IC8vIGVycm9yIQorICAgIH0KKyAgICByZXR1cm4gdjsKK30KKwogc3RhdGljIGRvdWJsZSBJMChkb3VibGUgeCkgewogICAgIC8vIGZyb20gdGhlIE51bWVyaWNhbCBSZWNpcGVzIGluIEMgcC4gMjM3CiAgICAgZG91YmxlIGF4LGFucyx5OwpAQCAtNTQsMTEgKzY0LDEyIEBACiAgICAgcmV0dXJuIEkwKGJldGEgKiBzcXJ0KDEuMCAtIHNxcigoMi4wKmspL04gLSAxLjApKSkgLyBJMChiZXRhKTsKIH0KIAotCiBzdGF0aWMgdm9pZCB1c2FnZShjaGFyKiBuYW1lKSB7CiAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAidXNhZ2U6ICVzIFstaF0gWy1kXSBbLXMgc2FtcGxlX3JhdGVdIFstYyBjdXQtb2ZmX2ZyZXF1ZW5jeV0gWy1uIGhhbGZfemVyb19jcm9zc2luZ3NdIFstZiB7ZmxvYXR8Zml4ZWR9XSBbLWIgYmV0YV0gWy12IGRCRlNdIFstbCBsZXJwXVxuIgotICAgICAgICAgICAgIiAgICAgICAlcyBbLWhdIFstZF0gWy1zIHNhbXBsZV9yYXRlXSBbLWMgY3V0LW9mZl9mcmVxdWVuY3ldIFstbiBoYWxmX3plcm9fY3Jvc3NpbmdzXSBbLWYge2Zsb2F0fGZpeGVkfV0gWy1iIGJldGFdIFstdiBkQkZTXSAtcCBNL05cbiIKKyAgICAgICAgICAgICJ1c2FnZTogJXMgWy1oXSBbLWRdIFstcyBzYW1wbGVfcmF0ZV0gWy1jIGN1dC1vZmZfZnJlcXVlbmN5XSBbLW4gaGFsZl96ZXJvX2Nyb3NzaW5nc10iCisgICAgICAgICAgICAiIFstZiB7ZmxvYXR8Zml4ZWR8Zml4ZWQxNn1dIFstYiBiZXRhXSBbLXYgZEJGU10gWy1sIGxlcnBdXG4iCisgICAgICAgICAgICAiICAgICAgICVzIFstaF0gWy1kXSBbLXMgc2FtcGxlX3JhdGVdIFstYyBjdXQtb2ZmX2ZyZXF1ZW5jeV0gWy1uIGhhbGZfemVyb19jcm9zc2luZ3NdIgorICAgICAgICAgICAgIiBbLWYge2Zsb2F0fGZpeGVkfGZpeGVkMTZ9XSBbLWIgYmV0YV0gWy12IGRCRlNdIC1wIE0vTlxuIgogICAgICAgICAgICAgIiAgICAtaCAgICB0aGlzIGhlbHAgbWVzc2FnZVxuIgogICAgICAgICAgICAgIiAgICAtZCAgICBkZWJ1ZywgcHJpbnQgY29tbWEtc2VwYXJhdGVkIGNvZWZmaWNpZW50IHRhYmxlXG4iCiAgICAgICAgICAgICAiICAgIC1wICAgIGdlbmVyYXRlIHBvbHktcGhhc2UgZmlsdGVyIGNvZWZmaWNpZW50cywgd2l0aCBzYW1wbGUgaW5jcmVtZW50IE0vTlxuIgpAQCAtNjYsNiArNzcsNyBAQAogICAgICAgICAgICAgIiAgICAtYyAgICBjdXQtb2ZmIGZyZXF1ZW5jeSAoMjA0NzgpXG4iCiAgICAgICAgICAgICAiICAgIC1uICAgIG51bWJlciBvZiB6ZXJvLWNyb3NzaW5ncyBvbiBvbmUgc2lkZSAoOClcbiIKICAgICAgICAgICAgICIgICAgLWwgICAgbnVtYmVyIG9mIGxlcnBpbmcgYml0cyAoNClcbiIKKyAgICAgICAgICAgICIgICAgLW0gICAgbnVtYmVyIG9mIHBvbHlwaGFzZXMgKHJlbGF0ZWQgdG8gLWwsIGRlZmF1bHQgMTYpXG4iCiAgICAgICAgICAgICAiICAgIC1mICAgIG91dHB1dCBmb3JtYXQsIGNhbiBiZSBmaXhlZC1wb2ludCBvciBmbG9hdGluZy1wb2ludCAoZml4ZWQpXG4iCiAgICAgICAgICAgICAiICAgIC1iICAgIGthaXNlciB3aW5kb3cgcGFyYW1ldGVyIGJldGEgKDcuODY1IFstODBkQl0pXG4iCiAgICAgICAgICAgICAiICAgIC12ICAgIGF0dGVudWF0aW9uIGluIGRCRlMgKDApXG4iLApAQCAtNzcsOCArODksNyBAQAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQogewogICAgIC8vIG5jIGlzIHRoZSBudW1iZXIgb2YgYml0cyB0byBzdG9yZSB0aGUgY29lZmZpY2llbnRzCi0gICAgY29uc3QgaW50IG5jID0gMzI7Ci0KKyAgICBpbnQgbmMgPSAzMjsKICAgICBib29sIHBvbHlwaGFzZSA9IGZhbHNlOwogICAgIHVuc2lnbmVkIGludCBwb2x5TSA9IDE2MDsKICAgICB1bnNpZ25lZCBpbnQgcG9seU4gPSAxNDc7CkBAIC04OCw3ICs5OSw2IEBACiAgICAgZG91YmxlIGF0dGVuID0gMTsKICAgICBpbnQgZm9ybWF0ID0gMDsKIAotCiAgICAgLy8gaW4gb3JkZXIgdG8ga2VlcCB0aGUgZXJyb3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZWFyCiAgICAgLy8gaW50ZXJwb2xhdGlvbiBvZiB0aGUgY29lZmZpY2llbnRzIGJlbG93IHRoZSBxdWFudGl6YXRpb24gZXJyb3IKICAgICAvLyB3ZSBtdXN0IHNhdGlzZnk6CkBAIC0xMDQsNyArMTE0LDYgQEAKICAgICAvLyBTbWl0aCwgSi5PLiBEaWdpdGFsIEF1ZGlvIFJlc2FtcGxpbmcgSG9tZSBQYWdlCiAgICAgLy8gaHR0cHM6Ly9jY3JtYS5zdGFuZm9yZC5lZHUvfmpvcy9yZXNhbXBsZS8sIDIwMTEtMDMtMjkKICAgICAvLwotICAgIGludCBueiA9IDQ7CiAKICAgICAvLyAgICAgICAgIHwgMC4xMTAyKihBIC0gOC43KSAgICAgICAgICAgICAgICAgICAgICAgICBBID4gNTAKICAgICAvLyAgYmV0YSA9IHwgMC41ODQyKihBIC0gMjEpXjAuNCArIDAuMDc4ODYqKEEgLSAyMSkgICAyMSA8PSBBIDw9IDUwCkBAIC0xMjMsMzMgKzEzMiwzMyBAQAogICAgIC8vICAgMTAwIGRCICAgMTAuMDU2CiAgICAgZG91YmxlIGJldGEgPSA3Ljg2NTsKIAotCiAgICAgLy8gMipuemMgPSAoQSAtIDgpIC8gKDIuMjg1ICogZHcpCiAgICAgLy8gICAgICB3aXRoIGR3IHRoZSB0cmFuc2l0aW9uIHdpZHRoID0gMipwaSpkRi9GcwogICAgIC8vCiAgICAgaW50IG56YyA9IDg7CiAKLSAgICAvLwotICAgIC8vIEV4YW1wbGU6Ci0gICAgLy8gNDQuMSBLSHogdG8gNDggS0h6IHJlc2FtcGxpbmcKLSAgICAvLyAxMDAgZEIgcmVqZWN0aW9uIGFib3ZlIDI4IEtIegotICAgIC8vICAgKHRoZSBzcGVjdHJ1bSB3aWxsIGZvbGQgYXJvdW5kIDI0IEtIeiBhbmQgd2Ugd2FudCAxMDAgZEIgcmVqZWN0aW9uCi0gICAgLy8gICAgYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBmb2xkaW5nIHJlYWNoZXMgMjAgS0h6KQotICAgIC8vICAuLi5fX198X19fX18KLSAgICAvLyAgICAgICAgfCAgICAgXHwKLSAgICAvLyAgICAgICAgfCBfX19fL3xcX19fXwotICAgIC8vICAgICAgICB8L2FsaWFzfCAgICAgXAotICAgIC8vICAtLS0tLS0vLS0tLS0tKy0tLS0tLVwtLS0tLS0tLS0+IEtIegotICAgIC8vICAgICAgIDIwICAgICAyNCAgICAgMjgKKyAgICAvKgorICAgICAqIEV4YW1wbGU6CisgICAgICogNDQuMSBLSHogdG8gNDggS0h6IHJlc2FtcGxpbmcKKyAgICAgKiAxMDAgZEIgcmVqZWN0aW9uIGFib3ZlIDI4IEtIegorICAgICAqICAgKHRoZSBzcGVjdHJ1bSB3aWxsIGZvbGQgYXJvdW5kIDI0IEtIeiBhbmQgd2Ugd2FudCAxMDAgZEIgcmVqZWN0aW9uCisgICAgICogICAgYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBmb2xkaW5nIHJlYWNoZXMgMjAgS0h6KQorICAgICAqICAuLi5fX198X19fX18KKyAgICAgKiAgICAgICAgfCAgICAgXHwKKyAgICAgKiAgICAgICAgfCBfX19fL3xcX19fXworICAgICAqICAgICAgICB8L2FsaWFzfCAgICAgXAorICAgICAqICAtLS0tLS0vLS0tLS0tKy0tLS0tLVwtLS0tLS0tLS0+IEtIegorICAgICAqICAgICAgIDIwICAgICAyNCAgICAgMjgKKyAgICAgKgorICAgICAqIFRyYW5zaXRpb24gYmFuZCA4IEtIeiwgb3IgZHcgPSAxLjA0NzIKKyAgICAgKgorICAgICAqIGJldGEgPSAxMC4wNTYKKyAgICAgKiBuemMgID0gMjAKKyAgICAgKi8KIAotICAgIC8vIFRyYW5zaXRpb24gYmFuZCA4IEtIeiwgb3IgZHcgPSAxLjA0NzIKLSAgICAvLwotICAgIC8vIGJldGEgPSAxMC4wNTYKLSAgICAvLyBuemMgID0gMjAKLSAgICAvLwotCisgICAgaW50IE0gPSAxIDw8IDQ7IC8vIG51bWJlciBvZiBwaGFzZXMgZm9yIGludGVycG9sYXRpb24KICAgICBpbnQgY2g7Ci0gICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiOmhkczpjOm46ZjpsOmI6cDp2OiIpKSAhPSAtMSkgeworICAgIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgIjpoZHM6YzpuOmY6bDptOmI6cDp2Ono6IikpICE9IC0xKSB7CiAgICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgIGRlYnVnID0gdHJ1ZTsKQEAgLTE2OSwxMyArMTc4LDI2IEBACiAgICAgICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgICAgICBuemMgPSBhdG9pKG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgICBNID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnbCc6Ci0gICAgICAgICAgICAgICAgbnogPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgTSA9IDEgPDwgYXRvaShvcHRhcmcpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnZic6Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAob3B0YXJnLCJmaXhlZCIpKSBmb3JtYXQgPSAwOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCJmbG9hdCIpKSBmb3JtYXQgPSAxOwotICAgICAgICAgICAgICAgIGVsc2UgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAob3B0YXJnLCAiZml4ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgImZpeGVkMTYiKSkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAwOworICAgICAgICAgICAgICAgICAgICBuYyA9IDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgImZsb2F0IikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICAgICAgIGJldGEgPSBhdG9mKG9wdGFyZyk7CkBAIC0xOTMsMTEgKzIxNSwxNCBAQAogICAgIC8vIGN1dCBvZmYgZnJlcXVlbmN5IHJhdGlvIEZjL0ZzCiAgICAgZG91YmxlIEZjciA9IEZjIC8gRnM7CiAKLQogICAgIC8vIHRvdGFsIG51bWJlciBvZiBjb2VmZmljaWVudHMgKG9uZSBzaWRlKQotICAgIGNvbnN0IGludCBNID0gKDEgPDwgbnopOworCiAgICAgY29uc3QgaW50IE4gPSBNICogbnpjOwogCisgICAgLy8gbGVycCAod2hpY2ggaXMgbW9zdCB1c2VmdWwgaWYgTSBpcyBhIHBvd2VyIG9mIDIpCisKKyAgICBpbnQgbnogPSAwOyAvLyByZWNhbGN1bGF0ZSBueiBhcyB0aGUgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IE0KKyAgICBmb3IgKGludCBpID0gTS0xIDsgaTsgaT4+PTEsIG56KyspOwogICAgIC8vIGdlbmVyYXRlIHRoZSByaWdodCBoYWxmIG9mIHRoZSBmaWx0ZXIKICAgICBpZiAoIWRlYnVnKSB7CiAgICAgICAgIHByaW50ZigiLy8gY21kLWxpbmU6ICIpOwpAQCAtMjA3LDcgKzIzMiw3IEBACiAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICAgaWYgKCFwb2x5cGhhc2UpIHsKICAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfU0laRSAgICAgICAgICAgPSAlZDtcbiIsIE4pOwotICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9MRVJQX0lOVF9CSVRTICA9ICVkO1xuIiwgbnopOworICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9JTlRfUEhBU0VTICAgICA9ICVkO1xuIiwgTSk7CiAgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX05VTV9DT0VGICAgICAgID0gJWQ7XG4iLCBuemMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9TSVpFICAgICAgICAgICA9ICVkO1xuIiwgMipuemMqcG9seU4pOwpAQCAtMjI0LDcgKzI0OSw3IEBACiAgICAgICAgIGZvciAoaW50IGk9MCA7IGk8PU0gOyBpKyspIHsgLy8gYW4gZXh0cmEgc2V0IG9mIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCiAgICAgICAgICAgICBmb3IgKGludCBqPTAgOyBqPG56YyA7IGorKykgewogICAgICAgICAgICAgICAgIGludCBpeCA9IGoqTSArIGk7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHggPSAoMi4wICogTV9QSSAqIGl4ICogRmNyKSAvICgxIDw8IG56KTsKKyAgICAgICAgICAgICAgICBkb3VibGUgeCA9ICgyLjAgKiBNX1BJICogaXggKiBGY3IpIC8gTTsKICAgICAgICAgICAgICAgICBkb3VibGUgeSA9IGthaXNlcihpeCtOLCAyKk4sIGJldGEpICogc2luYyh4KSAqIDIuMCAqIEZjcjsKICAgICAgICAgICAgICAgICB5ICo9IGF0dGVuOwogCkBAIC0yMzIsMTggKzI1NywyMCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgICAiKTsKICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICBpZiAoIWZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHlpID0gZmxvb3IoeSAqICgoMVVMTDw8KG5jLTEpKSkgKyAwLjUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoeWkgPj0gKDFMTDw8KG5jLTEpKSkgeWkgPSAoMUxMPDwobmMtMSkpLTE7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDh4LCAiLCBpbnQzMl90KHlpKSk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgeWkgPSB0b2ludCh5LCAxVUxMPDwobmMtMSkpOworICAgICAgICAgICAgICAgICAgICBpZiAobmMgPiAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgsICIsIGludDMyX3QoeWkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDR4LCAiLCBpbnQzMl90KHlpKSYweGZmZmYpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLjlnJXMgIiwgeSwgZGVidWcgPyAiLCIgOiAiZiwiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBqPTAgOyBqPHBvbHlOIDsgaisrKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGo9MCA7IGo8cG9seU4gOyBqKyspIHsKICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcGhhc2UKICAgICAgICAgICAgIGRvdWJsZSBwID0gKChwb2x5TSpqKSAlIHBvbHlOKSAvIGRvdWJsZShwb2x5Tik7CiAgICAgICAgICAgICBpZiAoIWRlYnVnKSBwcmludGYoIlxuICAgICIpOwpAQCAtMjU0LDkgKzI4MSwxMiBAQAogICAgICAgICAgICAgICAgIGRvdWJsZSB5ID0ga2Fpc2VyKGkrTiwgMipOLCBiZXRhKSAqIHNpbmMoeCkgKiAyLjAgKiBGY3I7OwogICAgICAgICAgICAgICAgIHkgKj0gYXR0ZW47CiAgICAgICAgICAgICAgICAgaWYgKCFmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB5aSA9IGZsb29yKHkgKiAoKDFVTEw8PChuYy0xKSkpICsgMC41KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHlpID49ICgxTEw8PChuYy0xKSkpIHlpID0gKDFMTDw8KG5jLTEpKS0xOwotICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA4eCIsIGludDMyX3QoeWkpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB5aSA9IHRvaW50KHksIDFVTEw8PChuYy0xKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYyA+IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA4eCwgIiwgaW50MzJfdCh5aSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwNHgsICIsIGludDMyX3QoeWkpJjB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUuOWclcyIsIHksIGRlYnVnID8gIiIgOiAiZiIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI3Nyw1ICszMDcsMyBAQAogfQogCiAvLyBodHRwOi8vd3d3LmNzZWUudW1iYy5lZHUvaGVscC9zb3VuZC9BRnNwLVYyUjEvaHRtbC9hdWRpby9SZXNhbXBBdWRpby5odG1sCi0KLQo=